{"action":"created","comment":{"url":"https://api.github.com/repos/django/deps/pulls/comments/86762292","pull_request_review_id":7401875,"id":86762292,"diff_hunk":"@@ -0,0 +1,276 @@\n+===================================\n+DEP XXXX: Simplified routing syntax\n+===================================\n+\n+:DEP: XXXX\n+:Author: Tom Christie\n+:Implementation Team: Tom Christie, Sjoerd Job Postmus\n+:Shepherd: Tim Graham\n+:Status: Draft\n+:Type: Feature\n+:Created: 2016-10-19\n+:Last-Modified: 2016-10-20\n+\n+.. contents:: Table of Contents\n+   :depth: 3\n+   :local:\n+\n+Abstract\n+========\n+\n+This DEP aims to introduce a simpler and more readable routing syntax to\n+Django. Additionally the new syntax would support type coercion of URL\n+parameters.\n+\n+We would plan for this to become the new convention by default, but would do so\n+in a backwards compatible manner, leaving the existing regex based syntax as an\n+option.\n+\n+Motivation\n+==========\n+\n+Here's a section directly taken from Django's documentation on URL\n+configuration...\n+\n+.. code-block:: python\n+\n+\turlpatterns = [     \n+\t\turl(r'^articles/2003/$', views.special_case_2003),\n+\t\turl(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),\n+\t\turl(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),\n+\t\turl(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),\n+\t]\n+\n+There are two aspects to this that we'd like to improve on:\n+\n+* The Regex based URL syntax is unneccessarily verbose and complex for the vast\n+  majority of use-cases.\n+* The existing URL resolver system does not handle typecasting, meaning that\n+  all URL parameters are treated as string literals.\n+\n+In order to do so we propose to implement a new URL routing option, based on\n+the Flask URL syntax. This is a simpler and more readable format. Unlike the\n+regex approach, this syntax also includes type information, allowing us to\n+provide for typecasting of the URL parameters that are passed to views.\n+\n+The existing syntax would remain available, and there would be no plans to\n+place it on a deprecation path. Indeed, the underlying implementation for the\n+typed URL syntax would actually be to use expand the typed URLs out into the\n+existing Regex style, although this would largely remain an implementation\n+detail, rather than an exposed bit of API.\n+\n+The end result is that we would like to be able to present the following\n+interface to our developers...\n+\n+.. code-block:: python\n+\n+\turlpatterns = [     \n+\t\tpath('articles/2003/', views.special_case_2003),\n+\t\tpath('articles/<int:year>/', views.year_archive),\n+\t\tpath('articles/<int:year>/<int:month>/', views.month_archive),\n+\t\tpath('articles/<int:year>/<int:month>/<int:day>/', views.article_detail),\n+\t]\n+\n+The ``path()`` argument would also accept arguments without a converter prefix,\n+in which case the converter would default to \"string\", accepting any text\n+except a ``'/'``.\n+\n+For example:\n+\n+.. code-block:: python\n+\n+\turlpatterns = [\n+\t\tpath('users/', views.user_list),\n+\t\tpath('users/<id>/', views.user_detail),\n+\t]\n+\n+For further background, please see the `\"Challenge teaching Django to beginners: urls.py\" <https://groups.google.com/forum/#!topic/django-developers/u6sQax3sjO4>`_ discussion group thread.\n+\n+Core vs Third-Party\n+===================\n+\n+In our consideration this feature should be included in core Django rather than\n+as a third-party app, because it adds significant value and readability.\n+\n+It is far more valuable when presented to the community as *the new standard*,\n+rather than as an alternative style that can be bolted on. If presented as a\n+third-party add-on then the expense of a codebase going against the standard\n+URL convention will likely always prevent widespread uptake.\n+\n+Specification\n+=============\n+\n+Imports\n+-------\n+\n+The naming for the import needs to be decided on. The existing URL configuration\n+uses:\n+\n+.. code-block:: python\n+\n+    from django.conf.urls import url\n+\n+The naming question would be:\n+\n+* What should the new style be called? Would we keep ``url``, or would we need\n+to introduce a different name to avoid confusion?\n+* Where should the new style be imported from?\n+\n+Our constraints here are that the existing naming makes sense, but we also need\n+to ensure that we don't break backwards compatiblility.\n+\n+Our proposal is that we should use a diffrent name and that the new style should\n+be imported as...\n+\n+.. code-block:: python\n+\n+    from django.urls import path\n+\n+A consistently named regex specific import would also be introduced...\n+\n+.. code-block:: python\n+\n+    from django.urls import path_regex\n+\n+The name ``path`` makes semantic sense here, because it actually does represent\n+a URL component, rather than a complete URL.\n+\n+The existing import of ``from django.conf.urls import url`` would become a shim\n+for the more explicit ``from django.urls import path_regex``.\n+\n+Given that it is currently used in 100% of Django projects, the smooth path for\n+users would be to not deprecate its usage immediately, but to consider placing\n+it on the deprecation path at a later date.\n+\n+Converters\n+----------\n+\n+Flask supports the `following converters <http://flask.pocoo.org/docs/0.11/quickstart/#variable-rules>`_.\n+\n+``string``\n+    Accepts any text without a slash (the default)\n+``int``\n+    Accepts integers\n+``float``\n+    Like ``int`` but for floating point values\n+``path``\n+    Like the default but also accepts slashes\n+``any``\n+    Matches one of the items provided\n+``uuid``\n+    Accepts UUID strings\n+\n+We might also consider including `a regex converter <http://stackoverflow.com/questions/5870188/does-flask-support-regular-expressions-in-its-url-routing>`_.\n+\n+Furthermore, an interface for implementating custom converters should exist. We\n+could use the same API as Flask's ``BaseConverter`` for this purpose. The\n+registration of custom converters could be handled as a Django setting,\n+``CUSTOM_URL_CONVERTERS``. The default set of converters should probably \n+*always* be included.\n+\n+Failure to perform a type conversion against a captured string should result in\n+an ``Http404`` exception being raised.\n+\n+Adding type conversion to the existing system\n+---------------------------------------------\n+\n+Adding a new URL syntax is easy enough, as they can be mapped onto the existing\n+Regex syntax. The more involved piece of work would be providing for type\n+conversion with the existing regex system. The type conversion functionality\n+would need to support both named and unnamed capture groups.\n+\n+One option could be:\n+\n+* Add a new ``converters`` argument to the ``url`` argument.\n+* The value can either be a list/tuple, in which case its elements are mapped\n+  onto the capture groups by position, or a dict, in which case its elements\n+  are mapped onto the capture groups by name. (The former case is more general\n+  as it supports using the positional style to correspond with either named or\n+  unamed groups)\n+* The items in the ``converters`` argument would each be instances of\n+  ``BaseConverter``\n+\n+(An alternate might be to add separate ``converter_args`` and\n+``converter_kwargs`` arguments.)\n+\n+We would also need to support the reverse side of type conversion. Ensure that\n+reverse can be called with typed arguments as well as string literals.\n+\n+Preventing unintended errors\n+----------------------------\n+\n+*The following behaviour is not neccessary, and we might not choose to add\n+this. However, it is worth considering a way to guard against user error...*\n+\n+Even with differently named functions there remains some potential for user\n+error. For example:\n+\n+* A developer using Django's new URL system accidentally uses\n+  ``from django.conf.urls import url``, and fails to notice the error. They are\n+  unaware that they are using regex URLs, not typed URLs, and cannot determine\n+  why the project is not working as expected.\n+* A developer who is continuing to use regex URLs incorrectly uses the\n+  ``fram django.urls import path`` and fails to notice the error. They are\n+  unaware that they are using typed URLs, not regex URLs, and cannot determine\n+  why the project is not working as expected.\n+\n+One way to guard against this would be to:\n+\n+* Enforce that new style ``path()`` arguments must not start with a leading\n+  ``'^'``.\n+* Enforce that old style ``url()`` arguments must start with a leading ``'^'``.\n+\n+This behaviour would ensure that the two different cases could not be used\n+incorrectly.\n+\n+There is a decidedly edge-case deprecation that this would introduce in that\n+existing projects that happen to *intentionally* include an unachored URL regex\n+would raise a ``ConfigurationError`` when upgraded. However this is a loud and\n+documentable error, with a simple resolution. (Change the import to\n+``from django.urls import path_regex``.)\n+\n+Internal ``RegexURLPattern`` API\n+================================\n+\n+New style URLs should make the original string available to introspection using\n+a ``.path`` attribute on the path instance.\n+\n+They should be implemented as a ``TypedURLPattern`` that subclasses\n+``RegexURLPattern``.\n+\n+These are aspects of the internal API, and would not be documented behaviour.\n+\n+Documentation\n+=============\n+\n+The new style syntax would present a cleaner interface to developers. It would\n+be beneficial for us to introduce the newer syntax as the primary style, with\n+the existing regex style as a secondary option.\n+\n+It is suggested that we should update all URL examples accross the\n+documentation to use the new style.\n+\n+Implementation tasks\n+====================\n+\n+The following independant tasks can be identified:","path":"draft/simplified-routing-syntax.rst","position":256,"original_position":256,"commit_id":"eba207d9d206553950483b2518db458429dd7bd2","original_commit_id":"eba207d9d206553950483b2518db458429dd7bd2","user":{"login":"alexwlchan","id":301220,"avatar_url":"https://avatars.githubusercontent.com/u/301220?v=3","gravatar_id":"","url":"https://api.github.com/users/alexwlchan","html_url":"https://github.com/alexwlchan","followers_url":"https://api.github.com/users/alexwlchan/followers","following_url":"https://api.github.com/users/alexwlchan/following{/other_user}","gists_url":"https://api.github.com/users/alexwlchan/gists{/gist_id}","starred_url":"https://api.github.com/users/alexwlchan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alexwlchan/subscriptions","organizations_url":"https://api.github.com/users/alexwlchan/orgs","repos_url":"https://api.github.com/users/alexwlchan/repos","events_url":"https://api.github.com/users/alexwlchan/events{/privacy}","received_events_url":"https://api.github.com/users/alexwlchan/received_events","type":"User","site_admin":false},"body":"/s/independant/independent","created_at":"2016-11-07T12:03:25Z","updated_at":"2016-11-07T12:05:34Z","html_url":"https://github.com/django/deps/pull/27#discussion_r86762292","pull_request_url":"https://api.github.com/repos/django/deps/pulls/27","_links":{"self":{"href":"https://api.github.com/repos/django/deps/pulls/comments/86762292"},"html":{"href":"https://github.com/django/deps/pull/27#discussion_r86762292"},"pull_request":{"href":"https://api.github.com/repos/django/deps/pulls/27"}}},"pull_request":{"url":"https://api.github.com/repos/django/deps/pulls/27","id":90101405,"html_url":"https://github.com/django/deps/pull/27","diff_url":"https://github.com/django/deps/pull/27.diff","patch_url":"https://github.com/django/deps/pull/27.patch","issue_url":"https://api.github.com/repos/django/deps/issues/27","number":27,"state":"open","locked":false,"title":"Simplified routing syntax","user":{"login":"sjoerdjob","id":7838469,"avatar_url":"https://avatars.githubusercontent.com/u/7838469?v=3","gravatar_id":"","url":"https://api.github.com/users/sjoerdjob","html_url":"https://github.com/sjoerdjob","followers_url":"https://api.github.com/users/sjoerdjob/followers","following_url":"https://api.github.com/users/sjoerdjob/following{/other_user}","gists_url":"https://api.github.com/users/sjoerdjob/gists{/gist_id}","starred_url":"https://api.github.com/users/sjoerdjob/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sjoerdjob/subscriptions","organizations_url":"https://api.github.com/users/sjoerdjob/orgs","repos_url":"https://api.github.com/users/sjoerdjob/repos","events_url":"https://api.github.com/users/sjoerdjob/events{/privacy}","received_events_url":"https://api.github.com/users/sjoerdjob/received_events","type":"User","site_admin":false},"body":"Mostly a rewrite of https://gist.github.com/tomchristie/cb388f0f6a0dec931c611775f32c5f98 in rST.\n","created_at":"2016-10-19T22:17:51Z","updated_at":"2016-11-07T12:05:34Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0cb0b33355da3ed04adcd765e813955b976aa866","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/django/deps/pulls/27/commits","review_comments_url":"https://api.github.com/repos/django/deps/pulls/27/comments","review_comment_url":"https://api.github.com/repos/django/deps/pulls/comments{/number}","comments_url":"https://api.github.com/repos/django/deps/issues/27/comments","statuses_url":"https://api.github.com/repos/django/deps/statuses/eba207d9d206553950483b2518db458429dd7bd2","head":{"label":"sjoerdjob:simplified-routing-syntax","ref":"simplified-routing-syntax","sha":"eba207d9d206553950483b2518db458429dd7bd2","user":{"login":"sjoerdjob","id":7838469,"avatar_url":"https://avatars.githubusercontent.com/u/7838469?v=3","gravatar_id":"","url":"https://api.github.com/users/sjoerdjob","html_url":"https://github.com/sjoerdjob","followers_url":"https://api.github.com/users/sjoerdjob/followers","following_url":"https://api.github.com/users/sjoerdjob/following{/other_user}","gists_url":"https://api.github.com/users/sjoerdjob/gists{/gist_id}","starred_url":"https://api.github.com/users/sjoerdjob/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sjoerdjob/subscriptions","organizations_url":"https://api.github.com/users/sjoerdjob/orgs","repos_url":"https://api.github.com/users/sjoerdjob/repos","events_url":"https://api.github.com/users/sjoerdjob/events{/privacy}","received_events_url":"https://api.github.com/users/sjoerdjob/received_events","type":"User","site_admin":false},"repo":{"id":71375233,"name":"deps","full_name":"sjoerdjob/deps","owner":{"login":"sjoerdjob","id":7838469,"avatar_url":"https://avatars.githubusercontent.com/u/7838469?v=3","gravatar_id":"","url":"https://api.github.com/users/sjoerdjob","html_url":"https://github.com/sjoerdjob","followers_url":"https://api.github.com/users/sjoerdjob/followers","following_url":"https://api.github.com/users/sjoerdjob/following{/other_user}","gists_url":"https://api.github.com/users/sjoerdjob/gists{/gist_id}","starred_url":"https://api.github.com/users/sjoerdjob/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sjoerdjob/subscriptions","organizations_url":"https://api.github.com/users/sjoerdjob/orgs","repos_url":"https://api.github.com/users/sjoerdjob/repos","events_url":"https://api.github.com/users/sjoerdjob/events{/privacy}","received_events_url":"https://api.github.com/users/sjoerdjob/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/sjoerdjob/deps","description":"Django Enhancement Proposals","fork":true,"url":"https://api.github.com/repos/sjoerdjob/deps","forks_url":"https://api.github.com/repos/sjoerdjob/deps/forks","keys_url":"https://api.github.com/repos/sjoerdjob/deps/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sjoerdjob/deps/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sjoerdjob/deps/teams","hooks_url":"https://api.github.com/repos/sjoerdjob/deps/hooks","issue_events_url":"https://api.github.com/repos/sjoerdjob/deps/issues/events{/number}","events_url":"https://api.github.com/repos/sjoerdjob/deps/events","assignees_url":"https://api.github.com/repos/sjoerdjob/deps/assignees{/user}","branches_url":"https://api.github.com/repos/sjoerdjob/deps/branches{/branch}","tags_url":"https://api.github.com/repos/sjoerdjob/deps/tags","blobs_url":"https://api.github.com/repos/sjoerdjob/deps/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sjoerdjob/deps/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sjoerdjob/deps/git/refs{/sha}","trees_url":"https://api.github.com/repos/sjoerdjob/deps/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sjoerdjob/deps/statuses/{sha}","languages_url":"https://api.github.com/repos/sjoerdjob/deps/languages","stargazers_url":"https://api.github.com/repos/sjoerdjob/deps/stargazers","contributors_url":"https://api.github.com/repos/sjoerdjob/deps/contributors","subscribers_url":"https://api.github.com/repos/sjoerdjob/deps/subscribers","subscription_url":"https://api.github.com/repos/sjoerdjob/deps/subscription","commits_url":"https://api.github.com/repos/sjoerdjob/deps/commits{/sha}","git_commits_url":"https://api.github.com/repos/sjoerdjob/deps/git/commits{/sha}","comments_url":"https://api.github.com/repos/sjoerdjob/deps/comments{/number}","issue_comment_url":"https://api.github.com/repos/sjoerdjob/deps/issues/comments{/number}","contents_url":"https://api.github.com/repos/sjoerdjob/deps/contents/{+path}","compare_url":"https://api.github.com/repos/sjoerdjob/deps/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sjoerdjob/deps/merges","archive_url":"https://api.github.com/repos/sjoerdjob/deps/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sjoerdjob/deps/downloads","issues_url":"https://api.github.com/repos/sjoerdjob/deps/issues{/number}","pulls_url":"https://api.github.com/repos/sjoerdjob/deps/pulls{/number}","milestones_url":"https://api.github.com/repos/sjoerdjob/deps/milestones{/number}","notifications_url":"https://api.github.com/repos/sjoerdjob/deps/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sjoerdjob/deps/labels{/name}","releases_url":"https://api.github.com/repos/sjoerdjob/deps/releases{/id}","deployments_url":"https://api.github.com/repos/sjoerdjob/deps/deployments","created_at":"2016-10-19T16:06:53Z","updated_at":"2016-10-11T11:51:20Z","pushed_at":"2016-10-20T05:09:19Z","git_url":"git://github.com/sjoerdjob/deps.git","ssh_url":"git@github.com:sjoerdjob/deps.git","clone_url":"https://github.com/sjoerdjob/deps.git","svn_url":"https://github.com/sjoerdjob/deps","homepage":null,"size":164,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"django:master","ref":"master","sha":"9599c2819971ccd2aecf915d5b4f3628625e5eaa","user":{"login":"django","id":27804,"avatar_url":"https://avatars.githubusercontent.com/u/27804?v=3","gravatar_id":"","url":"https://api.github.com/users/django","html_url":"https://github.com/django","followers_url":"https://api.github.com/users/django/followers","following_url":"https://api.github.com/users/django/following{/other_user}","gists_url":"https://api.github.com/users/django/gists{/gist_id}","starred_url":"https://api.github.com/users/django/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/django/subscriptions","organizations_url":"https://api.github.com/users/django/orgs","repos_url":"https://api.github.com/users/django/repos","events_url":"https://api.github.com/users/django/events{/privacy}","received_events_url":"https://api.github.com/users/django/received_events","type":"Organization","site_admin":false},"repo":{"id":18764735,"name":"deps","full_name":"django/deps","owner":{"login":"django","id":27804,"avatar_url":"https://avatars.githubusercontent.com/u/27804?v=3","gravatar_id":"","url":"https://api.github.com/users/django","html_url":"https://github.com/django","followers_url":"https://api.github.com/users/django/followers","following_url":"https://api.github.com/users/django/following{/other_user}","gists_url":"https://api.github.com/users/django/gists{/gist_id}","starred_url":"https://api.github.com/users/django/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/django/subscriptions","organizations_url":"https://api.github.com/users/django/orgs","repos_url":"https://api.github.com/users/django/repos","events_url":"https://api.github.com/users/django/events{/privacy}","received_events_url":"https://api.github.com/users/django/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/django/deps","description":"Django Enhancement Proposals","fork":false,"url":"https://api.github.com/repos/django/deps","forks_url":"https://api.github.com/repos/django/deps/forks","keys_url":"https://api.github.com/repos/django/deps/keys{/key_id}","collaborators_url":"https://api.github.com/repos/django/deps/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/django/deps/teams","hooks_url":"https://api.github.com/repos/django/deps/hooks","issue_events_url":"https://api.github.com/repos/django/deps/issues/events{/number}","events_url":"https://api.github.com/repos/django/deps/events","assignees_url":"https://api.github.com/repos/django/deps/assignees{/user}","branches_url":"https://api.github.com/repos/django/deps/branches{/branch}","tags_url":"https://api.github.com/repos/django/deps/tags","blobs_url":"https://api.github.com/repos/django/deps/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/django/deps/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/django/deps/git/refs{/sha}","trees_url":"https://api.github.com/repos/django/deps/git/trees{/sha}","statuses_url":"https://api.github.com/repos/django/deps/statuses/{sha}","languages_url":"https://api.github.com/repos/django/deps/languages","stargazers_url":"https://api.github.com/repos/django/deps/stargazers","contributors_url":"https://api.github.com/repos/django/deps/contributors","subscribers_url":"https://api.github.com/repos/django/deps/subscribers","subscription_url":"https://api.github.com/repos/django/deps/subscription","commits_url":"https://api.github.com/repos/django/deps/commits{/sha}","git_commits_url":"https://api.github.com/repos/django/deps/git/commits{/sha}","comments_url":"https://api.github.com/repos/django/deps/comments{/number}","issue_comment_url":"https://api.github.com/repos/django/deps/issues/comments{/number}","contents_url":"https://api.github.com/repos/django/deps/contents/{+path}","compare_url":"https://api.github.com/repos/django/deps/compare/{base}...{head}","merges_url":"https://api.github.com/repos/django/deps/merges","archive_url":"https://api.github.com/repos/django/deps/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/django/deps/downloads","issues_url":"https://api.github.com/repos/django/deps/issues{/number}","pulls_url":"https://api.github.com/repos/django/deps/pulls{/number}","milestones_url":"https://api.github.com/repos/django/deps/milestones{/number}","notifications_url":"https://api.github.com/repos/django/deps/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/django/deps/labels{/name}","releases_url":"https://api.github.com/repos/django/deps/releases{/id}","deployments_url":"https://api.github.com/repos/django/deps/deployments","created_at":"2014-04-14T14:59:32Z","updated_at":"2016-11-07T08:34:21Z","pushed_at":"2016-11-05T16:55:43Z","git_url":"git://github.com/django/deps.git","ssh_url":"git@github.com:django/deps.git","clone_url":"https://github.com/django/deps.git","svn_url":"https://github.com/django/deps","homepage":null,"size":190,"stargazers_count":203,"watchers_count":203,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":37,"mirror_url":null,"open_issues_count":3,"forks":37,"open_issues":3,"watchers":203,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/django/deps/pulls/27"},"html":{"href":"https://github.com/django/deps/pull/27"},"issue":{"href":"https://api.github.com/repos/django/deps/issues/27"},"comments":{"href":"https://api.github.com/repos/django/deps/issues/27/comments"},"review_comments":{"href":"https://api.github.com/repos/django/deps/pulls/27/comments"},"review_comment":{"href":"https://api.github.com/repos/django/deps/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/django/deps/pulls/27/commits"},"statuses":{"href":"https://api.github.com/repos/django/deps/statuses/eba207d9d206553950483b2518db458429dd7bd2"}}}}
{"actor":{"display_login":"alexwlchan"}}