A better API that supports more values.

This commit is contained in:
Martin Mahner 2013-11-24 19:18:56 +01:00
parent 82cbb9f141
commit c1c43dd51a
4 changed files with 84 additions and 12 deletions

View file

@ -5,7 +5,7 @@ from django.conf import settings
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from dpaste.models import Snippet from dpaste.models import Snippet
from dpaste.highlight import LEXER_LIST, LEXER_DEFAULT from dpaste.highlight import LEXER_LIST, LEXER_DEFAULT, LEXER_KEYS
EXPIRE_CHOICES = ( EXPIRE_CHOICES = (
(3600, _(u'In one hour')), (3600, _(u'In one hour')),
@ -56,11 +56,11 @@ class SnippetForm(forms.ModelForm):
# Set the recently used lexer if we have any # Set the recently used lexer if we have any
session_lexer = self.request.session.get('lexer') session_lexer = self.request.session.get('lexer')
if session_lexer and session_lexer in dict(LEXER_LIST).keys(): if session_lexer and session_lexer in LEXER_KEYS:
self.fields['lexer'].initial = session_lexer self.fields['lexer'].initial = session_lexer
# if the lexer is given via GET, set it # if the lexer is given via GET, set it
if 'l' in request.GET and request.GET['l'] in dict(LEXER_LIST).keys(): if 'l' in request.GET and request.GET['l'] in LEXERK_KEYS:
self.fields['lexer'].initial = request.GET['l'] self.fields['lexer'].initial = request.GET['l']

View file

@ -92,6 +92,8 @@ LEXER_LIST = getattr(settings, 'DPASTE_LEXER_LIST', (
('yaml', 'YAML'), ('yaml', 'YAML'),
)) ))
LEXER_KEYS = dict(LEXER_LIST).keys()
# The default lexer is python # The default lexer is python
LEXER_DEFAULT = getattr(settings, 'DPASTE_LEXER_DEFAULT', 'python') LEXER_DEFAULT = getattr(settings, 'DPASTE_LEXER_DEFAULT', 'python')

View file

@ -44,7 +44,7 @@ class SnippetAPITestCase(TestCase):
self.assertEqual(response.status_code, 400) self.assertEqual(response.status_code, 400)
self.assertEqual(Snippet.objects.count(), 0) self.assertEqual(Snippet.objects.count(), 0)
def test_valid(self): def test_default_response(self):
""" """
A valid snippet, contains Unicode, tabs, spaces, linebreaks etc. A valid snippet, contains Unicode, tabs, spaces, linebreaks etc.
""" """
@ -65,3 +65,40 @@ class SnippetAPITestCase(TestCase):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertContains(response, data['content']) self.assertContains(response, data['content'])
def test_new_url_format(self):
"""
The 'new' url format is just the link with a linebreak.
"""
data = {'content': u"Hello Wörld.\n\tGood Bye", 'format': 'url'}
response = self.client.post(self.api_url, data)
self.assertEqual(response.status_code, 200)
self.assertEqual(Snippet.objects.count(), 1)
# Response is just the link starting with http(s) and ends with a linebreak
self.assertTrue(response.content.startswith('http'))
self.assertTrue(response.content.endswith('\n'))
def test_json_format(self):
"""
The 'new' url format is just the link with a linebreak.
"""
data = {
'content': u"Hello Wörld.\n\tGood Bye",
'format': 'json',
'lexer': 'haskell'
}
response = self.client.post(self.api_url, data)
self.assertEqual(response.status_code, 200)
self.assertEqual(Snippet.objects.count(), 1)
from json import loads
json_data = loads(response.content)
# Response is valid json, containing, content, lexer and url
self.assertEqual(json_data['content'], data['content'])
self.assertEqual(json_data['lexer'], data['lexer'])
self.assertTrue(json_data['url'].startswith('http'))

View file

@ -2,11 +2,10 @@ import datetime
import difflib import difflib
import requests import requests
from django.shortcuts import (render_to_response, get_object_or_404, from django.shortcuts import (render_to_response, get_object_or_404)
get_list_or_404)
from django.template.context import RequestContext from django.template.context import RequestContext
from django.http import (Http404, HttpResponseRedirect, HttpResponseBadRequest, from django.http import (Http404, HttpResponseRedirect, HttpResponseBadRequest,
HttpResponse, HttpResponseForbidden) HttpResponse)
from django.conf import settings from django.conf import settings
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -19,6 +18,7 @@ from django.views.defaults import (page_not_found as django_page_not_found,
from dpaste.forms import SnippetForm from dpaste.forms import SnippetForm
from dpaste.models import Snippet from dpaste.models import Snippet
from dpaste.highlight import LEXER_WORDWRAP, LEXER_LIST from dpaste.highlight import LEXER_WORDWRAP, LEXER_LIST
from dpaste.highlight import LEXER_DEFAULT, LEXER_KEYS
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
# Snippet Handling # Snippet Handling
@ -248,21 +248,54 @@ def about(request, template_name='dpaste/about.html'):
# API Handling # API Handling
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------
def snippet_api(request, enclose_quotes=True): BASE_URL = getattr(settings, 'DPASTE_BASE_URL', 'https://dpaste.de')
def _format_default(s):
"""The default response is the snippet URL wrapped in quotes."""
return u'"%s%s"' % (BASE_URL, s.get_absolute_url())
def _format_url(s):
"""The `url` format returns the snippet URL, no quotes, but a linebreak after."""
return u'%s%s\n' % (BASE_URL, s.get_absolute_url())
def _format_json(s):
from json import dumps
"""The `json` format export."""
return dumps({
'url': u'%s%s' % (BASE_URL, s.get_absolute_url()),
'content': s.content,
'lexer': s.lexer,
})
FORMAT_MAPPING = {
'default': _format_default,
'url': _format_url,
'json': _format_json,
}
def snippet_api(request):
content = request.POST.get('content', '').strip() content = request.POST.get('content', '').strip()
lexer = request.POST.get('lexer', LEXER_DEFAULT).strip()
format = request.POST.get('format', 'default').strip()
if not content: if not content:
return HttpResponseBadRequest() return HttpResponseBadRequest('No content given')
if not lexer in LEXER_KEYS:
return HttpResponseBadRequest('Invalid lexer given. Valid lexers are: %s' %
', '.join(LEXER_KEYS))
s = Snippet.objects.create( s = Snippet.objects.create(
content=content, content=content,
lexer=lexer,
expires=datetime.datetime.now()+datetime.timedelta(seconds=60*60*24*30) expires=datetime.datetime.now()+datetime.timedelta(seconds=60*60*24*30)
) )
s.save() s.save()
response = 'http://dpaste.de%s' % s.get_absolute_url() if not format in FORMAT_MAPPING:
if enclose_quotes: response = _format_default(s)
return HttpResponse('"%s"' % response) else:
response = FORMAT_MAPPING[format](s)
return HttpResponse(response) return HttpResponse(response)