From efc427dfc8144855f28a20888bbe11b83cbfa08f Mon Sep 17 00:00:00 2001 From: Matteo Nastasi Date: Mon, 2 Oct 2017 08:59:53 +0200 Subject: [PATCH 1/6] Reuse 'apply_markdown' function in 'render_markdown' templatetag func (#5469) * reused 'apply_markdown' function in 'render_markdown' templatetag function * typo fixed --- rest_framework/templatetags/rest_framework.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rest_framework/templatetags/rest_framework.py b/rest_framework/templatetags/rest_framework.py index a2ee5ccdd..264b6444c 100644 --- a/rest_framework/templatetags/rest_framework.py +++ b/rest_framework/templatetags/rest_framework.py @@ -11,7 +11,8 @@ from django.utils.html import escape, format_html, smart_urlquote from django.utils.safestring import SafeData, mark_safe from rest_framework.compat import ( - NoReverseMatch, markdown, pygments_highlight, reverse, template_render + NoReverseMatch, apply_markdown, pygments_highlight, reverse, + template_render ) from rest_framework.renderers import HTMLFormRenderer from rest_framework.utils.urls import replace_query_param @@ -68,9 +69,9 @@ def form_for_link(link): @register.simple_tag def render_markdown(markdown_text): - if not markdown: + if apply_markdown is None: return markdown_text - return mark_safe(markdown.markdown(markdown_text)) + return mark_safe(apply_markdown(markdown_text)) @register.simple_tag From e6193cfd9e6391c635368b9c71ed545c8fc024d1 Mon Sep 17 00:00:00 2001 From: Shreyans Sheth Date: Mon, 2 Oct 2017 12:34:55 +0530 Subject: [PATCH 2/6] Added Response import in Code Snippet (#5468) Added `from rest_framework.response import Response` in the viewset code snippet example --- docs/tutorial/6-viewsets-and-routers.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/tutorial/6-viewsets-and-routers.md b/docs/tutorial/6-viewsets-and-routers.md index 6189c7771..252021e39 100644 --- a/docs/tutorial/6-viewsets-and-routers.md +++ b/docs/tutorial/6-viewsets-and-routers.md @@ -26,6 +26,7 @@ Here we've used the `ReadOnlyModelViewSet` class to automatically provide the de Next we're going to replace the `SnippetList`, `SnippetDetail` and `SnippetHighlight` view classes. We can remove the three views, and again replace them with a single class. from rest_framework.decorators import detail_route + from rest_framework.response import Response class SnippetViewSet(viewsets.ModelViewSet): """ From 62ecbf2817e5dbce8bd67f4b8ba257bb4c4eec8c Mon Sep 17 00:00:00 2001 From: Lim H Date: Mon, 2 Oct 2017 10:16:33 +0100 Subject: [PATCH 3/6] Add drf-openapi (#5470) * Add DRF OpenAPI as a 3rd party tool for DRF doc * Add image * Add third party packages section to schema doc * Add DRF OpenAPI reference --- docs/api-guide/schemas.md | 11 +++++++++++ docs/img/drf-openapi.png | Bin 0 -> 75416 bytes docs/topics/documenting-your-api.md | 19 +++++++++++++++++++ 3 files changed, 30 insertions(+) create mode 100644 docs/img/drf-openapi.png diff --git a/docs/api-guide/schemas.md b/docs/api-guide/schemas.md index 2cb29d5f8..51a6c00c6 100644 --- a/docs/api-guide/schemas.md +++ b/docs/api-guide/schemas.md @@ -765,10 +765,21 @@ Valid only if a `location="body"` field is included on the `Link`. A short description of the meaning and intended usage of the input field. +--- + +# Third party packages + +## DRF OpenAPI + +[DRF OpenAPI][drf-openapi] renders the schema generated by Django Rest Framework +in [OpenAPI][open-api] format. + + [cite]: https://blog.heroku.com/archives/2014/1/8/json_schema_for_heroku_platform_api [coreapi]: http://www.coreapi.org/ [corejson]: http://www.coreapi.org/specification/encoding/#core-json-encoding [open-api]: https://openapis.org/ +[drf-openapi]: https://github.com/limdauto/drf_openapi [json-hyperschema]: http://json-schema.org/latest/json-schema-hypermedia.html [api-blueprint]: https://apiblueprint.org/ [static-files]: https://docs.djangoproject.com/en/stable/howto/static-files/ diff --git a/docs/img/drf-openapi.png b/docs/img/drf-openapi.png new file mode 100644 index 0000000000000000000000000000000000000000..7a37e19d6136301b5ff43bea160db7e32d3a9b96 GIT binary patch literal 75416 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 jem7vu7tb~Bf{=`4mg7QE_2QS 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 literal 0 HcmV?d00001 diff --git a/docs/topics/documenting-your-api.md b/docs/topics/documenting-your-api.md index da1dbe358..b68eb64ec 100644 --- a/docs/topics/documenting-your-api.md +++ b/docs/topics/documenting-your-api.md @@ -75,6 +75,23 @@ When using viewsets, you should use the relevant action names as delimiters. There are a number of mature third-party packages for providing API documentation. +#### DRF OpenAPI + +[DRF OpenAPI][drf-openapi] bridges the gap between OpenAPI specification and tool chain with the schema exposed +out-of-the-box by Django Rest Framework. Its goals are: + + * To be dropped into any existing DRF project without any code change necessary. + * Provide clear disctinction between request schema and response schema. + * Provide a versioning mechanism for each schema. Support defining schema by version range syntax, e.g. >1.0, <=2.0 + * Support multiple response codes, not just 200 + * All this information should be bound to view methods, not view classes. + +It also tries to stay current with the maturing schema generation mechanism provided by DRF. + +![Screenshot - DRF OpenAPI][image-drf-openapi] + +--- + #### DRF Docs [DRF Docs][drfdocs-repo] allows you to document Web APIs made with Django REST Framework and it is authored by Emmanouil Konstantinidis. It's made to work out of the box and its setup should not take more than a couple of minutes. Complete documentation can be found on the [website][drfdocs-website] while there is also a [demo][drfdocs-demo] available for people to see what it looks like. **Live API Endpoints** allow you to utilize the endpoints from within the documentation in a neat way. @@ -197,6 +214,8 @@ In this approach, rather than documenting the available API endpoints up front, To implement a hypermedia API you'll need to decide on an appropriate media type for the API, and implement a custom renderer and parser for that media type. The [REST, Hypermedia & HATEOAS][hypermedia-docs] section of the documentation includes pointers to background reading, as well as links to various hypermedia formats. [cite]: http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven +[drf-openapi]: https://github.com/limdauto/drf_openapi/ +[image-drf-openapi]: ../img/drf-openapi.png [drfdocs-repo]: https://github.com/ekonstantinidis/django-rest-framework-docs [drfdocs-website]: http://www.drfdocs.com/ [drfdocs-demo]: http://demo.drfdocs.com/ From 063534ae50d3d15a307205c91ed5a25974b0a1f4 Mon Sep 17 00:00:00 2001 From: Matteo Nastasi Date: Mon, 2 Oct 2017 11:44:29 +0200 Subject: [PATCH 4/6] Docstrings highlighting with pygments (#5462) * add 'docstrings-with-pygments' feature without packages checks and tests * move syntax_highlight doc filter in compatibility module and define it conditionally * typo fixed * add test for optional code highlight ('pygments' and 'markdown' packages must be installed) --- rest_framework/compat.py | 33 +++++++++++++++++++++++++ tests/test_description.py | 52 ++++++++++++++++++++++++++++++++++----- 2 files changed, 79 insertions(+), 6 deletions(-) diff --git a/rest_framework/compat.py b/rest_framework/compat.py index e0f718ced..3b341a656 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -244,6 +244,7 @@ try: md = markdown.Markdown( extensions=extensions, extension_configs=extension_configs ) + md_filter_add_syntax_highlight(md) return md.convert(text) except ImportError: apply_markdown = None @@ -273,6 +274,38 @@ except ImportError: def pygments_css(style): return None +if markdown is not None and pygments is not None: + # starting from this blogpost and modified to support current markdown extensions API + # https://zerokspot.com/weblog/2008/06/18/syntax-highlighting-in-markdown-with-pygments/ + + from markdown.preprocessors import Preprocessor + import re + + class CodeBlockPreprocessor(Preprocessor): + pattern = re.compile( + r'^\s*@@ (.+?) @@\s*(.+?)^\s*@@', re.M|re.S) + + formatter = HtmlFormatter() + + def run(self, lines): + def repl(m): + try: + lexer = get_lexer_by_name(m.group(1)) + except (ValueError, NameError): + lexer = TextLexer() + code = m.group(2).replace('\t',' ') + code = pygments.highlight(code, lexer, self.formatter) + code = code.replace('\n\n', '\n \n').replace('\n', '
').replace('\\@','@') + return '\n\n%s\n\n' % code + ret = self.pattern.sub(repl, "\n".join(lines)) + return ret.split("\n") + + def md_filter_add_syntax_highlight(md): + md.preprocessors.add('highlight', CodeBlockPreprocessor(), "_begin") + return True +else: + def md_filter_add_syntax_highlight(md): + return False try: import pytz diff --git a/tests/test_description.py b/tests/test_description.py index 4df14ac55..a97550ed8 100644 --- a/tests/test_description.py +++ b/tests/test_description.py @@ -24,11 +24,36 @@ another header indented -# hash style header #""" +# hash style header # + +@@ json @@ +[{ + "alpha": 1, + "beta: "this is a string" +}] +@@""" # If markdown is installed we also test it's working # (and that our wrapped forces '=' to h2 and '-' to h3) +MARKED_DOWN_HILITE = """ +
[{
"alpha": 1,
\ + "beta: "this\ + is a \ +string"
}]
+ +


""" + +MARKED_DOWN_NOT_HILITE = """ +

@@ json @@ +[{ + "alpha": 1, + "beta: "this is a string" +}] +@@

""" + # We support markdown < 2.1 and markdown >= 2.1 MARKED_DOWN_lt_21 = """

an example docstring

    @@ -39,7 +64,7 @@ MARKED_DOWN_lt_21 = """

    an example docstring

    code block
     

    indented

    -

    hash style header

    """ +

    hash style header

    %s""" MARKED_DOWN_gte_21 = """

    an example docstring

      @@ -50,7 +75,7 @@ MARKED_DOWN_gte_21 = """

      an example docstring

      code block
       

      indented

      -

      hash style header

      """ +

      hash style header

      %s""" class TestViewNamesAndDescriptions(TestCase): @@ -78,7 +103,14 @@ class TestViewNamesAndDescriptions(TestCase): indented - # hash style header #""" + # hash style header # + + @@ json @@ + [{ + "alpha": 1, + "beta: "this is a string" + }] + @@""" assert MockView().get_view_description() == DESCRIPTION @@ -118,8 +150,16 @@ class TestViewNamesAndDescriptions(TestCase): Ensure markdown to HTML works as expected. """ if apply_markdown: - gte_21_match = apply_markdown(DESCRIPTION) == MARKED_DOWN_gte_21 - lt_21_match = apply_markdown(DESCRIPTION) == MARKED_DOWN_lt_21 + gte_21_match = ( + apply_markdown(DESCRIPTION) == ( + MARKED_DOWN_gte_21 % MARKED_DOWN_HILITE) or + apply_markdown(DESCRIPTION) == ( + MARKED_DOWN_gte_21 % MARKED_DOWN_NOT_HILITE)) + lt_21_match = ( + apply_markdown(DESCRIPTION) == ( + MARKED_DOWN_lt_21 % MARKED_DOWN_HILITE) or + apply_markdown(DESCRIPTION) == ( + MARKED_DOWN_lt_21 % MARKED_DOWN_NOT_HILITE)) assert gte_21_match or lt_21_match From dc4a98fbe887ba71cf76fa6830ae2176012ca848 Mon Sep 17 00:00:00 2001 From: Carlton Gibson Date: Mon, 2 Oct 2017 13:26:44 +0200 Subject: [PATCH 5/6] Fix documentation `data` rendering (#5472) * Add failing test for #5395 * Add data filter for use in templates Closes #5395 * Fix isort --- .../rest_framework/docs/document.html | 4 +-- .../rest_framework/docs/sidebar.html | 4 +-- rest_framework/templatetags/rest_framework.py | 14 ++++++++ tests/conftest.py | 3 ++ tests/test_renderers.py | 32 ++++++++++++++++++- tests/urls.py | 11 +++++-- 6 files changed, 61 insertions(+), 7 deletions(-) diff --git a/rest_framework/templates/rest_framework/docs/document.html b/rest_framework/templates/rest_framework/docs/document.html index 7a438f68d..7922142f3 100644 --- a/rest_framework/templates/rest_framework/docs/document.html +++ b/rest_framework/templates/rest_framework/docs/document.html @@ -13,8 +13,8 @@ {% if 'javascript' in langs %}{% include "rest_framework/docs/langs/javascript-intro.html" %}{% endif %} -{% if document.data %} -{% for section_key, section in document.data|items %} +{% if document|data %} +{% for section_key, section in document|data|items %} {% if section_key %}

      {{ section_key }}

      diff --git a/rest_framework/templates/rest_framework/docs/sidebar.html b/rest_framework/templates/rest_framework/docs/sidebar.html index 31708e784..d23787025 100644 --- a/rest_framework/templates/rest_framework/docs/sidebar.html +++ b/rest_framework/templates/rest_framework/docs/sidebar.html @@ -5,8 +5,8 @@