{"action":"created","comment":{"url":"https://api.github.com/repos/matplotlib/matplotlib/pulls/comments/178444736","pull_request_review_id":108505576,"id":178444736,"diff_hunk":"@@ -137,155 +140,104 @@ def boilerplate_gen():\n         'semilogx',\n         'semilogy',\n         'specgram',\n-        # 'spy',\n+        'spy',\n         'stackplot',\n         'stem',\n         'step',\n         'streamplot',\n+        'table',\n+        'text',\n+        'tick_params',\n+        'ticklabel_format',\n         'tricontour',\n         'tricontourf',\n         'tripcolor',\n         'triplot',\n         'violinplot',\n         'vlines',\n         'xcorr',\n-        'barbs',\n-    )\n-\n-    _misccommands = (\n-        'cla',\n-        'grid',\n-        'legend',\n-        'table',\n-        'text',\n-        'annotate',\n-        'ticklabel_format',\n-        'locator_params',\n-        'tick_params',\n-        'margins',\n-        'autoscale',\n     )\n \n     cmappable = {\n-        'contour': 'if %(ret)s._A is not None: sci(%(ret)s)',\n-        'contourf': 'if %(ret)s._A is not None: sci(%(ret)s)',\n-        'hexbin': 'sci(%(ret)s)',\n-        'scatter': 'sci(%(ret)s)',\n-        'pcolor': 'sci(%(ret)s)',\n-        'pcolormesh': 'sci(%(ret)s)',\n-        'hist2d': 'sci(%(ret)s[-1])',\n-        'imshow': 'sci(%(ret)s)',\n-        #'spy'    :  'sci(%(ret)s)',  ### may return image or Line2D\n-        'quiver': 'sci(%(ret)s)',\n-        'specgram': 'sci(%(ret)s[-1])',\n-        'streamplot': 'sci(%(ret)s.lines)',\n-        'tricontour': 'if %(ret)s._A is not None: sci(%(ret)s)',\n-        'tricontourf': 'if %(ret)s._A is not None: sci(%(ret)s)',\n-        'tripcolor': 'sci(%(ret)s)',\n+        'contour': 'if __ret._A is not None: sci(__ret)',\n+        'contourf': 'if __ret._A is not None: sci(__ret)',\n+        'hexbin': 'sci(__ret)',\n+        'scatter': 'sci(__ret)',\n+        'pcolor': 'sci(__ret)',\n+        'pcolormesh': 'sci(__ret)',\n+        'hist2d': 'sci(__ret[-1])',\n+        'imshow': 'sci(__ret)',\n+        'spy': 'if isinstance(ret, cm.ScalarMappable): sci(__ret)',\n+        'quiver': 'sci(__ret)',\n+        'specgram': 'sci(__ret[-1])',\n+        'streamplot': 'sci(__ret.lines)',\n+        'tricontour': 'if __ret._A is not None: sci(__ret)',\n+        'tricontourf': 'if __ret._A is not None: sci(__ret)',\n+        'tripcolor': 'sci(__ret)',\n     }\n \n-    def format_value(value):\n+    class value_formatter:\n         \"\"\"\n         Format function default values as needed for inspect.formatargspec.\n         The interesting part is a hard-coded list of functions used\n         as defaults in pyplot methods.\n         \"\"\"\n-        if isinstance(value, types.FunctionType):\n-            if value.__name__ in ('detrend_none', 'window_hanning'):\n-                return '=mlab.' + value.__name__\n-            if value.__name__ == 'mean':\n-                return '=np.' + value.__name__\n-            raise ValueError(('default value %s unknown to boilerplate.' +\n-                             'formatvalue') % value)\n-        return '=' + repr(value)\n-\n-    text_wrapper = textwrap.TextWrapper(break_long_words=False)\n-\n-    for fmt, cmdlist in [(PLOT_TEMPLATE, _plotcommands),\n-                         (MISC_FN_TEMPLATE, _misccommands)]:\n-        for func in cmdlist:\n-            # For some commands, an additional line is needed to set the\n-            # color map\n-            if func in cmappable:\n-                mappable = '    ' + cmappable[func] % locals()\n+\n+        def __init__(self, value):\n+            if value is mlab.detrend_none:\n+                self._repr = \"mlab.detrend_none\"\n+            elif value is mlab.window_hanning:\n+                self._repr = \"mlab.window_hanning\"\n+            elif value is np.mean:\n+                self._repr = \"np.mean\"\n             else:\n-                mappable = ''\n-\n-            # Get argspec of wrapped function\n-            base_func = getattr(Axes, func)\n-            has_data = 'data' in inspect.signature(base_func).parameters\n-            work_func = inspect.unwrap(base_func)\n-\n-            (args, varargs, varkw, defaults, kwonlyargs, kwonlydefs,\n-                annotations) = inspect.getfullargspec(work_func)\n-            args.pop(0)  # remove 'self' argument\n-            defaults = tuple(defaults or ())\n-\n-            # Add a data keyword argument if needed (fmt is PLOT_TEMPLATE) and\n-            # possible (if *args is used, we can't just add a data\n-            # argument in front of it since it would gobble one of the\n-            # arguments the user means to pass via *args)\n-            # This needs to be done here so that it goes into call\n-            if not varargs and fmt is PLOT_TEMPLATE and has_data:\n-                args.append('data')\n-                defaults = defaults + (None,)\n-\n-            # How to call the wrapped function\n-            call = []\n-            for i, arg in enumerate(args):\n-                if len(defaults) < len(args) - i:\n-                    call.append('%s' % arg)\n-                else:\n-                    call.append('%s=%s' % (arg, arg))\n-\n-            # remove the data keyword as it was needed above to go into the\n-            # call but should go after `hold` in the signature.\n-            # This is janky as all get out, but hopefully boilerplate will\n-            # be retired soon.\n-            if not varargs and fmt is PLOT_TEMPLATE and has_data:\n-                args.pop()\n-                defaults = defaults[:-1]\n-\n-            if varargs is not None:\n-                call.append('*' + varargs)\n-            if varkw is not None:\n-                call.append('**' + varkw)\n-            call = ', '.join(call)\n-\n-            text_wrapper.width = 80 - 19 - len(func)\n-            join_with = '\\n' + ' ' * (18 + len(func))\n-            call = join_with.join(text_wrapper.wrap(call))\n-\n-            if not varargs and fmt is PLOT_TEMPLATE and has_data:\n-                args.append('data')\n-                defaults = defaults + (None,)\n-\n-            # Now we can build the argspec for defining the wrapper\n-            argspec = inspect.formatargspec(args, varargs, varkw, defaults,\n-                                            formatvalue=format_value)\n-            argspec = argspec[1:-1]  # remove parens\n-\n-            text_wrapper.width = 80 - 5 - len(func)\n-            join_with = '\\n' + ' ' * (5 + len(func))\n-            argspec = join_with.join(text_wrapper.wrap(argspec))\n-\n-            # A gensym-like facility in case some function takes an\n-            # argument named washold, ax, or ret\n-            washold, ret, ax = 'washold', 'ret', 'ax'\n-            bad = {*args, varargs, varkw}\n-            while washold in bad or ret in bad or ax in bad:\n-                washold = 'washold' + str(random.randrange(10 ** 12))\n-                ret = 'ret' + str(random.randrange(10 ** 12))\n-                ax = 'ax' + str(random.randrange(10 ** 12))\n-\n-            # Since we can't avoid using some function names,\n-            # bail out if they are used as argument names\n-            for reserved in ('gca', 'gci'):\n-                if reserved in bad:\n-                    msg = 'Axes method %s has kwarg named %s' % (func, reserved)\n-                    raise ValueError(msg)\n-\n-            yield fmt % locals()\n+                self._repr = repr(value)\n+\n+        def __repr__(self):\n+            return self._repr\n+\n+    text_wrapper = textwrap.TextWrapper(\n+        break_long_words=False, width=70,\n+        initial_indent=' ' * 8, subsequent_indent=' ' * 8)\n+\n+    for func in _commands:\n+        # For some commands, an additional line is needed to set the color map.\n+        if func in cmappable:\n+            fmt = CMAPPABLE_TEMPLATE\n+            mappable = '    ' + cmappable[func]\n+        else:\n+            fmt = NON_CMAPPABLE_TEMPLATE\n+\n+        # Get signature of wrapped function.\n+        sig = inspect.signature(getattr(Axes, func))\n+\n+        # Replace self argument.\n+        params = list(sig.parameters.values())[1:]\n+\n+        sig = str(sig.replace(parameters=[\n+            param.replace(default=value_formatter(param.default))\n+            if param.default is not param.empty else param\n+            for param in params]))\n+        # Move opening parenthesis before newline.","path":"tools/boilerplate.py","position":316,"original_position":316,"commit_id":"86fe16bfe7ed27985457637356f42b0ff98bdaca","original_commit_id":"86fe16bfe7ed27985457637356f42b0ff98bdaca","user":{"login":"anntzer","id":1322974,"avatar_url":"https://avatars0.githubusercontent.com/u/1322974?v=4","gravatar_id":"","url":"https://api.github.com/users/anntzer","html_url":"https://github.com/anntzer","followers_url":"https://api.github.com/users/anntzer/followers","following_url":"https://api.github.com/users/anntzer/following{/other_user}","gists_url":"https://api.github.com/users/anntzer/gists{/gist_id}","starred_url":"https://api.github.com/users/anntzer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anntzer/subscriptions","organizations_url":"https://api.github.com/users/anntzer/orgs","repos_url":"https://api.github.com/users/anntzer/repos","events_url":"https://api.github.com/users/anntzer/events{/privacy}","received_events_url":"https://api.github.com/users/anntzer/received_events","type":"User","site_admin":false},"body":"Honestly I think that when the source looks like\r\n```\r\nIn [1]: plt.errorbar??\r\nSignature: plt.errorbar(x, y, yerr=None, xerr=None, fmt='', ecolor=None, elinewidth=None, capsize=None, barsabove=False, lolims=False, uplims=False, xlolims=False, xuplims=False, errorevery=1, capthick=None, *, data=None, **kwargs)\r\nSource:   \r\n@docstring.copy_dedent(Axes.errorbar)\r\ndef errorbar(\r\n        x, y, yerr=None, xerr=None, fmt='', ecolor=None,\r\n        elinewidth=None, capsize=None, barsabove=False, lolims=False,\r\n        uplims=False, xlolims=False, xuplims=False, errorevery=1,\r\n        capthick=None, *, data=None, **kwargs):\r\n    return gca().errorbar(\r\n        x=x, y=y, yerr=yerr, xerr=xerr, fmt=fmt, ecolor=ecolor,\r\n        elinewidth=elinewidth, capsize=capsize, barsabove=barsabove,\r\n        lolims=lolims, uplims=uplims, xlolims=xlolims,\r\n        xuplims=xuplims, errorevery=errorevery, capthick=capthick,\r\n        data=data, **kwargs)\r\nFile:      ~/src/extern/matplotlib/lib/matplotlib/pyplot.py\r\nType:      function\r\n```\r\nthe biggest issue is not with an extra newline, but that that's a useless source...\r\n\r\nWe could set `__wrapper__` to the inner function so that getsource points to `Axes.errorbar`, but that may be confusing for functions that do call sci() with the return value...","created_at":"2018-03-31T23:54:36Z","updated_at":"2018-03-31T23:54:36Z","html_url":"https://github.com/matplotlib/matplotlib/pull/10918#discussion_r178444736","pull_request_url":"https://api.github.com/repos/matplotlib/matplotlib/pulls/10918","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/matplotlib/matplotlib/pulls/comments/178444736"},"html":{"href":"https://github.com/matplotlib/matplotlib/pull/10918#discussion_r178444736"},"pull_request":{"href":"https://api.github.com/repos/matplotlib/matplotlib/pulls/10918"}},"in_reply_to_id":178444093},"pull_request":{"url":"https://api.github.com/repos/matplotlib/matplotlib/pulls/10918","id":178472613,"html_url":"https://github.com/matplotlib/matplotlib/pull/10918","diff_url":"https://github.com/matplotlib/matplotlib/pull/10918.diff","patch_url":"https://github.com/matplotlib/matplotlib/pull/10918.patch","issue_url":"https://api.github.com/repos/matplotlib/matplotlib/issues/10918","number":10918,"state":"open","locked":false,"title":"Use function signatures in boilerplate.py.","user":{"login":"anntzer","id":1322974,"avatar_url":"https://avatars0.githubusercontent.com/u/1322974?v=4","gravatar_id":"","url":"https://api.github.com/users/anntzer","html_url":"https://github.com/anntzer","followers_url":"https://api.github.com/users/anntzer/followers","following_url":"https://api.github.com/users/anntzer/following{/other_user}","gists_url":"https://api.github.com/users/anntzer/gists{/gist_id}","starred_url":"https://api.github.com/users/anntzer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anntzer/subscriptions","organizations_url":"https://api.github.com/users/anntzer/orgs","repos_url":"https://api.github.com/users/anntzer/repos","events_url":"https://api.github.com/users/anntzer/events{/privacy}","received_events_url":"https://api.github.com/users/anntzer/received_events","type":"User","site_admin":false},"body":"## PR Summary\r\n\r\nProposed followup to #10485.  As it turns out we \"need\" to keep storing the return value of axes methods because we sometimes pass it to `sci`.\r\n\r\nAlso, using a simpler algorithm actually allows getting better signatures for a few functions (annotate and quiverkey).\r\n\r\n## PR Checklist\r\n\r\n- [ ] Has Pytest style unit tests\r\n- [ ] Code is PEP 8 compliant\r\n- [ ] New features are documented, with examples if plot related\r\n- [ ] Documentation is sphinx and numpydoc compliant\r\n- [ ] Added an entry to doc/users/next_whats_new/ if major new feature (follow instructions in README.rst there)\r\n- [ ] Documented in doc/api/api_changes.rst if API changed in a backward-incompatible way\r\n\r\n<!--\r\nThank you so much for your PR!  To help us review your contribution, please\r\nconsider the following points:\r\n\r\n- A development guide is available at https://matplotlib.org/devdocs/devel/index.html.\r\n\r\n- Help with git and github is available at\r\n  https://matplotlib.org/devel/gitwash/development_workflow.html.\r\n\r\n- Do not create the PR out of master, but out of a separate branch.\r\n\r\n- The PR title should summarize the changes, for example \"Raise ValueError on\r\n  non-numeric input to set_xlim\".  Avoid non-descriptive titles such as\r\n  \"Addresses issue #8576\".\r\n\r\n- The summary should provide at least 1-2 sentences describing the pull request\r\n  in detail (Why is this change required?  What problem does it solve?) and\r\n  link to any relevant issues.\r\n\r\n- If you are contributing fixes to docstrings, please pay attention to\r\n  http://matplotlib.org/devel/documenting_mpl.html#formatting.  In particular,\r\n  note the difference between using single backquotes, double backquotes, and\r\n  asterisks in the markup.\r\n\r\nWe understand that PRs can sometimes be overwhelming, especially as the\r\nreviews start coming in.  Please let us know if the reviews are unclear or\r\nthe recommended next step seems overly demanding, if you would like help in\r\naddressing a reviewer's comments, or if you have been waiting too long to hear\r\nback on your PR.\r\n-->\r\n","created_at":"2018-03-30T00:38:10Z","updated_at":"2018-03-31T23:54:36Z","closed_at":null,"merged_at":null,"merge_commit_sha":"20dbdf1ed0f2d6673af3e80cf0645f3e366cceff","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":{"url":"https://api.github.com/repos/matplotlib/matplotlib/milestones/23","html_url":"https://github.com/matplotlib/matplotlib/milestone/23","labels_url":"https://api.github.com/repos/matplotlib/matplotlib/milestones/23/labels","id":1542657,"number":23,"title":"v3.0","description":"Big ticket items:\r\n\r\n - drop support for python 2","creator":{"login":"tacaswell","id":199813,"avatar_url":"https://avatars3.githubusercontent.com/u/199813?v=4","gravatar_id":"","url":"https://api.github.com/users/tacaswell","html_url":"https://github.com/tacaswell","followers_url":"https://api.github.com/users/tacaswell/followers","following_url":"https://api.github.com/users/tacaswell/following{/other_user}","gists_url":"https://api.github.com/users/tacaswell/gists{/gist_id}","starred_url":"https://api.github.com/users/tacaswell/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tacaswell/subscriptions","organizations_url":"https://api.github.com/users/tacaswell/orgs","repos_url":"https://api.github.com/users/tacaswell/repos","events_url":"https://api.github.com/users/tacaswell/events{/privacy}","received_events_url":"https://api.github.com/users/tacaswell/received_events","type":"User","site_admin":false},"open_issues":208,"closed_issues":172,"state":"open","created_at":"2016-01-25T21:06:49Z","updated_at":"2018-03-31T20:04:28Z","due_on":"2018-07-01T07:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/matplotlib/matplotlib/pulls/10918/commits","review_comments_url":"https://api.github.com/repos/matplotlib/matplotlib/pulls/10918/comments","review_comment_url":"https://api.github.com/repos/matplotlib/matplotlib/pulls/comments{/number}","comments_url":"https://api.github.com/repos/matplotlib/matplotlib/issues/10918/comments","statuses_url":"https://api.github.com/repos/matplotlib/matplotlib/statuses/86fe16bfe7ed27985457637356f42b0ff98bdaca","head":{"label":"anntzer:signature-boilerplate","ref":"signature-boilerplate","sha":"86fe16bfe7ed27985457637356f42b0ff98bdaca","user":{"login":"anntzer","id":1322974,"avatar_url":"https://avatars0.githubusercontent.com/u/1322974?v=4","gravatar_id":"","url":"https://api.github.com/users/anntzer","html_url":"https://github.com/anntzer","followers_url":"https://api.github.com/users/anntzer/followers","following_url":"https://api.github.com/users/anntzer/following{/other_user}","gists_url":"https://api.github.com/users/anntzer/gists{/gist_id}","starred_url":"https://api.github.com/users/anntzer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anntzer/subscriptions","organizations_url":"https://api.github.com/users/anntzer/orgs","repos_url":"https://api.github.com/users/anntzer/repos","events_url":"https://api.github.com/users/anntzer/events{/privacy}","received_events_url":"https://api.github.com/users/anntzer/received_events","type":"User","site_admin":false},"repo":{"id":7439715,"name":"matplotlib","full_name":"anntzer/matplotlib","owner":{"login":"anntzer","id":1322974,"avatar_url":"https://avatars0.githubusercontent.com/u/1322974?v=4","gravatar_id":"","url":"https://api.github.com/users/anntzer","html_url":"https://github.com/anntzer","followers_url":"https://api.github.com/users/anntzer/followers","following_url":"https://api.github.com/users/anntzer/following{/other_user}","gists_url":"https://api.github.com/users/anntzer/gists{/gist_id}","starred_url":"https://api.github.com/users/anntzer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/anntzer/subscriptions","organizations_url":"https://api.github.com/users/anntzer/orgs","repos_url":"https://api.github.com/users/anntzer/repos","events_url":"https://api.github.com/users/anntzer/events{/privacy}","received_events_url":"https://api.github.com/users/anntzer/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/anntzer/matplotlib","description":null,"fork":true,"url":"https://api.github.com/repos/anntzer/matplotlib","forks_url":"https://api.github.com/repos/anntzer/matplotlib/forks","keys_url":"https://api.github.com/repos/anntzer/matplotlib/keys{/key_id}","collaborators_url":"https://api.github.com/repos/anntzer/matplotlib/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/anntzer/matplotlib/teams","hooks_url":"https://api.github.com/repos/anntzer/matplotlib/hooks","issue_events_url":"https://api.github.com/repos/anntzer/matplotlib/issues/events{/number}","events_url":"https://api.github.com/repos/anntzer/matplotlib/events","assignees_url":"https://api.github.com/repos/anntzer/matplotlib/assignees{/user}","branches_url":"https://api.github.com/repos/anntzer/matplotlib/branches{/branch}","tags_url":"https://api.github.com/repos/anntzer/matplotlib/tags","blobs_url":"https://api.github.com/repos/anntzer/matplotlib/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/anntzer/matplotlib/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/anntzer/matplotlib/git/refs{/sha}","trees_url":"https://api.github.com/repos/anntzer/matplotlib/git/trees{/sha}","statuses_url":"https://api.github.com/repos/anntzer/matplotlib/statuses/{sha}","languages_url":"https://api.github.com/repos/anntzer/matplotlib/languages","stargazers_url":"https://api.github.com/repos/anntzer/matplotlib/stargazers","contributors_url":"https://api.github.com/repos/anntzer/matplotlib/contributors","subscribers_url":"https://api.github.com/repos/anntzer/matplotlib/subscribers","subscription_url":"https://api.github.com/repos/anntzer/matplotlib/subscription","commits_url":"https://api.github.com/repos/anntzer/matplotlib/commits{/sha}","git_commits_url":"https://api.github.com/repos/anntzer/matplotlib/git/commits{/sha}","comments_url":"https://api.github.com/repos/anntzer/matplotlib/comments{/number}","issue_comment_url":"https://api.github.com/repos/anntzer/matplotlib/issues/comments{/number}","contents_url":"https://api.github.com/repos/anntzer/matplotlib/contents/{+path}","compare_url":"https://api.github.com/repos/anntzer/matplotlib/compare/{base}...{head}","merges_url":"https://api.github.com/repos/anntzer/matplotlib/merges","archive_url":"https://api.github.com/repos/anntzer/matplotlib/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/anntzer/matplotlib/downloads","issues_url":"https://api.github.com/repos/anntzer/matplotlib/issues{/number}","pulls_url":"https://api.github.com/repos/anntzer/matplotlib/pulls{/number}","milestones_url":"https://api.github.com/repos/anntzer/matplotlib/milestones{/number}","notifications_url":"https://api.github.com/repos/anntzer/matplotlib/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/anntzer/matplotlib/labels{/name}","releases_url":"https://api.github.com/repos/anntzer/matplotlib/releases{/id}","deployments_url":"https://api.github.com/repos/anntzer/matplotlib/deployments","created_at":"2013-01-04T12:08:11Z","updated_at":"2018-03-30T21:43:39Z","pushed_at":"2018-03-31T23:49:24Z","git_url":"git://github.com/anntzer/matplotlib.git","ssh_url":"git@github.com:anntzer/matplotlib.git","clone_url":"https://github.com/anntzer/matplotlib.git","svn_url":"https://github.com/anntzer/matplotlib","homepage":"","size":325712,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"matplotlib:master","ref":"master","sha":"a10b90c1ef346d6d77f545cea2c0a2d6a8a8ddff","user":{"login":"matplotlib","id":215947,"avatar_url":"https://avatars0.githubusercontent.com/u/215947?v=4","gravatar_id":"","url":"https://api.github.com/users/matplotlib","html_url":"https://github.com/matplotlib","followers_url":"https://api.github.com/users/matplotlib/followers","following_url":"https://api.github.com/users/matplotlib/following{/other_user}","gists_url":"https://api.github.com/users/matplotlib/gists{/gist_id}","starred_url":"https://api.github.com/users/matplotlib/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/matplotlib/subscriptions","organizations_url":"https://api.github.com/users/matplotlib/orgs","repos_url":"https://api.github.com/users/matplotlib/repos","events_url":"https://api.github.com/users/matplotlib/events{/privacy}","received_events_url":"https://api.github.com/users/matplotlib/received_events","type":"Organization","site_admin":false},"repo":{"id":1385122,"name":"matplotlib","full_name":"matplotlib/matplotlib","owner":{"login":"matplotlib","id":215947,"avatar_url":"https://avatars0.githubusercontent.com/u/215947?v=4","gravatar_id":"","url":"https://api.github.com/users/matplotlib","html_url":"https://github.com/matplotlib","followers_url":"https://api.github.com/users/matplotlib/followers","following_url":"https://api.github.com/users/matplotlib/following{/other_user}","gists_url":"https://api.github.com/users/matplotlib/gists{/gist_id}","starred_url":"https://api.github.com/users/matplotlib/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/matplotlib/subscriptions","organizations_url":"https://api.github.com/users/matplotlib/orgs","repos_url":"https://api.github.com/users/matplotlib/repos","events_url":"https://api.github.com/users/matplotlib/events{/privacy}","received_events_url":"https://api.github.com/users/matplotlib/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/matplotlib/matplotlib","description":"matplotlib: plotting with Python","fork":false,"url":"https://api.github.com/repos/matplotlib/matplotlib","forks_url":"https://api.github.com/repos/matplotlib/matplotlib/forks","keys_url":"https://api.github.com/repos/matplotlib/matplotlib/keys{/key_id}","collaborators_url":"https://api.github.com/repos/matplotlib/matplotlib/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/matplotlib/matplotlib/teams","hooks_url":"https://api.github.com/repos/matplotlib/matplotlib/hooks","issue_events_url":"https://api.github.com/repos/matplotlib/matplotlib/issues/events{/number}","events_url":"https://api.github.com/repos/matplotlib/matplotlib/events","assignees_url":"https://api.github.com/repos/matplotlib/matplotlib/assignees{/user}","branches_url":"https://api.github.com/repos/matplotlib/matplotlib/branches{/branch}","tags_url":"https://api.github.com/repos/matplotlib/matplotlib/tags","blobs_url":"https://api.github.com/repos/matplotlib/matplotlib/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/matplotlib/matplotlib/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/matplotlib/matplotlib/git/refs{/sha}","trees_url":"https://api.github.com/repos/matplotlib/matplotlib/git/trees{/sha}","statuses_url":"https://api.github.com/repos/matplotlib/matplotlib/statuses/{sha}","languages_url":"https://api.github.com/repos/matplotlib/matplotlib/languages","stargazers_url":"https://api.github.com/repos/matplotlib/matplotlib/stargazers","contributors_url":"https://api.github.com/repos/matplotlib/matplotlib/contributors","subscribers_url":"https://api.github.com/repos/matplotlib/matplotlib/subscribers","subscription_url":"https://api.github.com/repos/matplotlib/matplotlib/subscription","commits_url":"https://api.github.com/repos/matplotlib/matplotlib/commits{/sha}","git_commits_url":"https://api.github.com/repos/matplotlib/matplotlib/git/commits{/sha}","comments_url":"https://api.github.com/repos/matplotlib/matplotlib/comments{/number}","issue_comment_url":"https://api.github.com/repos/matplotlib/matplotlib/issues/comments{/number}","contents_url":"https://api.github.com/repos/matplotlib/matplotlib/contents/{+path}","compare_url":"https://api.github.com/repos/matplotlib/matplotlib/compare/{base}...{head}","merges_url":"https://api.github.com/repos/matplotlib/matplotlib/merges","archive_url":"https://api.github.com/repos/matplotlib/matplotlib/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/matplotlib/matplotlib/downloads","issues_url":"https://api.github.com/repos/matplotlib/matplotlib/issues{/number}","pulls_url":"https://api.github.com/repos/matplotlib/matplotlib/pulls{/number}","milestones_url":"https://api.github.com/repos/matplotlib/matplotlib/milestones{/number}","notifications_url":"https://api.github.com/repos/matplotlib/matplotlib/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/matplotlib/matplotlib/labels{/name}","releases_url":"https://api.github.com/repos/matplotlib/matplotlib/releases{/id}","deployments_url":"https://api.github.com/repos/matplotlib/matplotlib/deployments","created_at":"2011-02-19T03:17:12Z","updated_at":"2018-03-31T20:05:07Z","pushed_at":"2018-03-31T23:49:25Z","git_url":"git://github.com/matplotlib/matplotlib.git","ssh_url":"git@github.com:matplotlib/matplotlib.git","clone_url":"https://github.com/matplotlib/matplotlib.git","svn_url":"https://github.com/matplotlib/matplotlib","homepage":"http://matplotlib.org/","size":325402,"stargazers_count":7017,"watchers_count":7017,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3306,"mirror_url":null,"archived":false,"open_issues_count":1341,"license":null,"forks":3306,"open_issues":1341,"watchers":7017,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/matplotlib/matplotlib/pulls/10918"},"html":{"href":"https://github.com/matplotlib/matplotlib/pull/10918"},"issue":{"href":"https://api.github.com/repos/matplotlib/matplotlib/issues/10918"},"comments":{"href":"https://api.github.com/repos/matplotlib/matplotlib/issues/10918/comments"},"review_comments":{"href":"https://api.github.com/repos/matplotlib/matplotlib/pulls/10918/comments"},"review_comment":{"href":"https://api.github.com/repos/matplotlib/matplotlib/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/matplotlib/matplotlib/pulls/10918/commits"},"statuses":{"href":"https://api.github.com/repos/matplotlib/matplotlib/statuses/86fe16bfe7ed27985457637356f42b0ff98bdaca"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"anntzer"}}