aboutsummaryrefslogtreecommitdiffstats
path: root/examples/pygments_api
diff options
context:
space:
mode:
authortom christie tom@tomchristie.com2011-01-30 11:00:20 +0000
committertom christie tom@tomchristie.com2011-01-30 11:00:20 +0000
commit250ab0f609f32cd3e004e1f2711f9c2e4fd9b57c (patch)
tree915eeda0528dab3159958500c117e9285bc56ef3 /examples/pygments_api
parent40f47a9fb31aebd965dce03ae57c036d5360d124 (diff)
downloaddjango-rest-framework-250ab0f609f32cd3e004e1f2711f9c2e4fd9b57c.tar.bz2
Lots of docs, trying to tidy up examples...
Diffstat (limited to 'examples/pygments_api')
-rw-r--r--examples/pygments_api/forms.py21
-rw-r--r--examples/pygments_api/urls.py2
-rw-r--r--examples/pygments_api/views.py51
3 files changed, 45 insertions, 29 deletions
diff --git a/examples/pygments_api/forms.py b/examples/pygments_api/forms.py
index dc9927e2..8488db06 100644
--- a/examples/pygments_api/forms.py
+++ b/examples/pygments_api/forms.py
@@ -3,23 +3,26 @@ from django import forms
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles
-import httplib2 as httplib
-
-
LEXER_CHOICES = sorted([(item[1][0], item[0]) for item in get_all_lexers()])
STYLE_CHOICES = sorted((item, item) for item in list(get_all_styles()))
-
class PygmentsForm(forms.Form):
"""A simple form with some of the most important pygments settings.
The code to be highlighted can be specified either in a text field, or by URL.
We do some additional form validation to ensure clients see helpful error responses."""
- code = forms.CharField(widget=forms.Textarea, label='Code Text', max_length=1000000,
+ code = forms.CharField(widget=forms.Textarea,
+ label='Code Text',
+ max_length=1000000,
help_text='(Copy and paste the code text here.)')
- title = forms.CharField(required=False, help_text='(Optional)', max_length=100)
- linenos = forms.BooleanField(label='Show Line Numbers', required=False)
- lexer = forms.ChoiceField(choices=LEXER_CHOICES, initial='python')
- style = forms.ChoiceField(choices=STYLE_CHOICES, initial='friendly')
+ title = forms.CharField(required=False,
+ help_text='(Optional)',
+ max_length=100)
+ linenos = forms.BooleanField(label='Show Line Numbers',
+ required=False)
+ lexer = forms.ChoiceField(choices=LEXER_CHOICES,
+ initial='python')
+ style = forms.ChoiceField(choices=STYLE_CHOICES,
+ initial='friendly')
diff --git a/examples/pygments_api/urls.py b/examples/pygments_api/urls.py
index 39bcf668..f96f4518 100644
--- a/examples/pygments_api/urls.py
+++ b/examples/pygments_api/urls.py
@@ -2,5 +2,5 @@ from django.conf.urls.defaults import patterns
urlpatterns = patterns('pygments_api.views',
(r'^$', 'PygmentsRoot'),
- (r'^([a-zA-Z0-9]+)/$', 'PygmentsInstance'),
+ (r'^([a-zA-Z0-9-]+)/$', 'PygmentsInstance'),
)
diff --git a/examples/pygments_api/views.py b/examples/pygments_api/views.py
index 4493a822..96322115 100644
--- a/examples/pygments_api/views.py
+++ b/examples/pygments_api/views.py
@@ -11,10 +11,19 @@ from pygments import highlight
from forms import PygmentsForm
import os
-import hashlib
+import uuid
+import operator
# We need somewhere to store the code that we highlight
HIGHLIGHTED_CODE_DIR = os.path.join(settings.MEDIA_ROOT, 'pygments')
+MAX_FILES = 5
+
+def remove_oldest_files(dir, max_files):
+ """Remove the oldest files in a directory 'dir', leaving at most 'max_files' remaining"""
+ filepaths = [os.path.join(dir, file) for file in os.listdir(dir)]
+ ctime_sorted_paths = [item[0] for item in sorted([(path, os.path.getctime(path)) for path in filepaths],
+ key=operator.itemgetter(1), reverse=True)]
+ [os.remove(path) for path in ctime_sorted_paths[max_files:]]
class HTMLEmitter(BaseEmitter):
@@ -24,38 +33,42 @@ class HTMLEmitter(BaseEmitter):
class PygmentsRoot(Resource):
"""This example demonstrates a simple RESTful Web API aound the awesome pygments library.
- This top level resource is used to create highlighted code snippets."""
+ This top level resource is used to create highlighted code snippets, and to list all the existing code snippets."""
form = PygmentsForm
- allowed_methods = anon_allowed_methods = ('POST',)
+ allowed_methods = anon_allowed_methods = ('GET', 'POST',)
+
+ def get(self, request, auth):
+ """Return a list of all currently existing snippets."""
+ unique_ids = sorted(os.listdir(HIGHLIGHTED_CODE_DIR))
+ return [self.reverse(PygmentsInstance, unique_id) for unique_id in unique_ids]
def post(self, request, auth, content):
- # Generate a unique id by hashing the input
- input_str = ''.join(['%s%s' % (key, content[key]) for key in sorted(content.keys())])
- hash = hashlib.md5()
- hash.update(input_str)
- unique_id = hash.hexdigest()
+ """Create a new highlighed snippet and return it's location.
+ For the purposes of the sandbox example, also ensure we delete the oldest snippets if we have > MAX_FILES."""
+ unique_id = str(uuid.uuid1())
pathname = os.path.join(HIGHLIGHTED_CODE_DIR, unique_id)
- if not os.path.exists(pathname):
- # We only need to generate the file if it doesn't already exist.
- options = {'title': content['title']} if content['title'] else {}
- linenos = 'table' if content['linenos'] else False
- lexer = get_lexer_by_name(content['lexer'])
- formatter = HtmlFormatter(style=content['style'], linenos=linenos, full=True, **options)
-
- with open(pathname, 'w') as outfile:
- highlight(content['code'], lexer, formatter, outfile)
-
+ lexer = get_lexer_by_name(content['lexer'])
+ linenos = 'table' if content['linenos'] else False
+ options = {'title': content['title']} if content['title'] else {}
+ formatter = HtmlFormatter(style=content['style'], linenos=linenos, full=True, **options)
+
+ with open(pathname, 'w') as outfile:
+ highlight(content['code'], lexer, formatter, outfile)
+
+ remove_oldest_files(HIGHLIGHTED_CODE_DIR, MAX_FILES)
+
return Response(status.HTTP_201_CREATED, headers={'Location': self.reverse(PygmentsInstance, unique_id)})
class PygmentsInstance(Resource):
"""Simply return the stored highlighted HTML file with the correct mime type.
- This Resource only emits HTML and uses a standard HTML emitter rather than FlyWheel's DocumentingHTMLEmitter class."""
+ This Resource only emits HTML and uses a standard HTML emitter rather than the emitters.DocumentingHTMLEmitter class."""
allowed_methods = anon_allowed_methods = ('GET',)
emitters = (HTMLEmitter,)
def get(self, request, auth, unique_id):
+ """Return the highlighted snippet."""
pathname = os.path.join(HIGHLIGHTED_CODE_DIR, unique_id)
if not os.path.exists(pathname):
return Resource(status.HTTP_404_NOT_FOUND)