diff options
| author | tom christie tom@tomchristie.com | 2011-01-30 11:00:20 +0000 |
|---|---|---|
| committer | tom christie tom@tomchristie.com | 2011-01-30 11:00:20 +0000 |
| commit | 250ab0f609f32cd3e004e1f2711f9c2e4fd9b57c (patch) | |
| tree | 915eeda0528dab3159958500c117e9285bc56ef3 /examples/pygments_api | |
| parent | 40f47a9fb31aebd965dce03ae57c036d5360d124 (diff) | |
| download | django-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.py | 21 | ||||
| -rw-r--r-- | examples/pygments_api/urls.py | 2 | ||||
| -rw-r--r-- | examples/pygments_api/views.py | 51 |
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) |
