{"action":"created","comment":{"url":"https://api.github.com/repos/python/mypy/pulls/comments/190434422","pull_request_review_id":122805983,"id":190434422,"diff_hunk":"@@ -0,0 +1,279 @@\n+from collections import OrderedDict\n+from typing import Dict, List, Optional, Set, Tuple, cast\n+\n+from mypy.nodes import (\n+    ARG_OPT, ARG_POS, MDEF, Argument, AssignmentStmt, Block, CallExpr, Context,\n+    Decorator, Expression, JsonDict, NameExpr, SymbolTableNode, TempNode,\n+    TypeInfo, Var\n+)\n+from mypy.plugin import ClassDefContext\n+from mypy.plugins.common import _add_method, _get_decorator_bool_argument\n+from mypy.types import CallableType, NoneTyp, Type, TypeVarDef, TypeVarType\n+from mypy.typevars import fill_typevars\n+\n+#: The set of decorators that generate dataclasses.\n+dataclass_makers = {\n+    'dataclass',\n+    'dataclasses.dataclass',\n+}\n+\n+\n+class DataclassAttribute:\n+    def __init__(\n+            self,\n+            name: str,\n+            is_in_init: bool,\n+            has_default: bool,\n+            line: int, column: int,\n+    ) -> None:\n+        self.name = name\n+        self.is_in_init = is_in_init\n+        self.has_default = has_default\n+        self.line = line\n+        self.column = column\n+\n+    def to_argument(self, info: TypeInfo) -> Argument:\n+        return Argument(\n+            variable=self.to_var(info),\n+            type_annotation=info[self.name].type,\n+            initializer=None,\n+            kind=ARG_OPT if self.has_default else ARG_POS,\n+        )\n+\n+    def to_var(self, info: TypeInfo) -> Var:\n+        return Var(self.name, info[self.name].type)\n+\n+    def serialize(self) -> JsonDict:\n+        return {\n+            'name': self.name,\n+            'is_in_init': self.is_in_init,\n+            'has_default': self.has_default,\n+            'line': self.line,\n+            'column': self.column,\n+        }\n+\n+    @classmethod\n+    def deserialize(cls, data: JsonDict) -> \"DataclassAttribute\":\n+        return cls(**data)\n+\n+\n+class DataclassTransformer:\n+    def __init__(self, ctx: ClassDefContext) -> None:\n+        self._ctx = ctx\n+\n+    def transform(self) -> None:\n+        ctx = self._ctx\n+        info = self._ctx.cls.info\n+        attributes = self.collect_attributes()\n+        decorator_arguments = {\n+            'init': _get_decorator_bool_argument(self._ctx, 'init', True),\n+            'eq': _get_decorator_bool_argument(self._ctx, 'eq', True),\n+            'order': _get_decorator_bool_argument(self._ctx, 'order', False),\n+            'frozen': _get_decorator_bool_argument(self._ctx, 'frozen', False),\n+        }\n+\n+        if decorator_arguments['init']:\n+            _add_method(\n+                ctx,\n+                '__init__',\n+                args=[attr.to_argument(info) for attr in attributes if attr.is_in_init],\n+                return_type=NoneTyp(),\n+            )\n+            for stmt in self._ctx.cls.defs.body:\n+                if isinstance(stmt, Decorator) and stmt.func.is_class:\n+                    func_type = stmt.func.type\n+                    if isinstance(func_type, CallableType):\n+                        func_type.arg_types[0] = self._ctx.api.class_type(self._ctx.cls.info)\n+\n+        # Add an eq method, but only if the class doesn't already have one.\n+        if decorator_arguments['eq'] and info.get('__eq__') is None:\n+            cmp_tvar_def = TypeVarDef('T', 'T', 1, [], ctx.api.named_type('__builtins__.object'))\n+            cmp_other_type = TypeVarType(cmp_tvar_def)\n+            cmp_return_type = ctx.api.named_type('__builtins__.bool')\n+\n+            for method_name in ['__eq__', '__ne__']:\n+                _add_method(\n+                    ctx,\n+                    method_name,\n+                    args=[Argument(Var('other', cmp_other_type), cmp_other_type, None, ARG_POS)],\n+                    return_type=cmp_return_type,\n+                    self_type=cmp_other_type,\n+                    tvar_def=cmp_tvar_def,\n+                )\n+\n+        # Add <,>,<=,>=, but only if the class has an eq method.\n+        if decorator_arguments['order']:\n+            if not decorator_arguments['eq']:\n+                ctx.api.fail('eq must be True if order is True', ctx.cls)\n+\n+            order_tvar_def = TypeVarDef('T', 'T', 1, [], ctx.api.named_type('__builtins__.object'))\n+            order_other_type = TypeVarType(order_tvar_def)\n+            order_return_type = ctx.api.named_type('__builtins__.bool')\n+            order_args = [\n+                Argument(Var('other', order_other_type), order_other_type, None, ARG_POS)\n+            ]\n+\n+            for method_name in ['__lt__', '__gt__', '__le__', '__ge__']:\n+                existing_method = info.get(method_name)\n+                if existing_method is not None:\n+                    assert existing_method.node\n+                    ctx.api.fail(\n+                        'You may not have a custom %s method when order=True' % method_name,\n+                        existing_method.node,\n+                    )\n+\n+                _add_method(\n+                    ctx,\n+                    method_name,\n+                    args=order_args,\n+                    return_type=order_return_type,\n+                    self_type=order_other_type,\n+                    tvar_def=order_tvar_def,\n+                )\n+\n+        if decorator_arguments['frozen']:\n+            self._freeze(attributes)\n+\n+        info.metadata['dataclass'] = {\n+            'attributes': OrderedDict((attr.name, attr.serialize()) for attr in attributes),\n+            'frozen': decorator_arguments['frozen'],\n+        }\n+\n+    def collect_attributes(self) -> List[DataclassAttribute]:\n+        \"\"\"Collect all attributes declared in the dataclass and its parents.\n+\n+        All assignments of the form\n+\n+          a: SomeType\n+          b: SomeOtherType = ...\n+\n+        are collected.\n+        \"\"\"\n+        # First, collect attributes belonging to the current class.\n+        ctx = self._ctx\n+        cls = self._ctx.cls\n+        attrs = []  # type: List[DataclassAttribute]\n+        known_attrs = set()  # type: Set[str]\n+        for stmt in cls.defs.body:\n+            # Any assignment that doesn't use the new type declaration\n+            # syntax can be ignored out of hand.\n+            if not (isinstance(stmt, AssignmentStmt) and stmt.new_syntax):\n+                continue\n+\n+            # a: int, b: str = 1, 'foo' is not supported syntax so we\n+            # don't have to worry about it.\n+            lhs = stmt.lvalues[0]\n+            if not isinstance(lhs, NameExpr):\n+                continue\n+\n+            try:\n+                node = cls.info.names[lhs.name].node\n+                assert isinstance(node, Var)\n+\n+                # x: ClassVar[int] is ignored by dataclasses.\n+                if node.is_classvar:\n+                    continue\n+\n+                # Treat the assignment as an instance-level assignment.\n+                node.is_initialized_in_class = False\n+            except KeyError:\n+                continue\n+\n+            has_field_call, field_args = _collect_field_args(stmt.rvalue)\n+\n+            try:\n+                is_in_init = bool(ctx.api.parse_bool(field_args['init']))\n+            except KeyError:","path":"mypy/plugins/dataclasses.py","position":186,"original_position":186,"commit_id":"92b53471e5acc67fc5f45509405d9c83c96bd0a3","original_commit_id":"92b53471e5acc67fc5f45509405d9c83c96bd0a3","user":{"login":"ilevkivskyi","id":12005495,"avatar_url":"https://avatars1.githubusercontent.com/u/12005495?v=4","gravatar_id":"","url":"https://api.github.com/users/ilevkivskyi","html_url":"https://github.com/ilevkivskyi","followers_url":"https://api.github.com/users/ilevkivskyi/followers","following_url":"https://api.github.com/users/ilevkivskyi/following{/other_user}","gists_url":"https://api.github.com/users/ilevkivskyi/gists{/gist_id}","starred_url":"https://api.github.com/users/ilevkivskyi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ilevkivskyi/subscriptions","organizations_url":"https://api.github.com/users/ilevkivskyi/orgs","repos_url":"https://api.github.com/users/ilevkivskyi/repos","events_url":"https://api.github.com/users/ilevkivskyi/events{/privacy}","received_events_url":"https://api.github.com/users/ilevkivskyi/received_events","type":"User","site_admin":false},"body":"There are too many things inside this except block. Move all the unnecessary code outside. Also I would probably use `if 'init' in field_args` here.","created_at":"2018-05-24T00:07:39Z","updated_at":"2018-05-24T00:39:42Z","html_url":"https://github.com/python/mypy/pull/5010#discussion_r190434422","pull_request_url":"https://api.github.com/repos/python/mypy/pulls/5010","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/python/mypy/pulls/comments/190434422"},"html":{"href":"https://github.com/python/mypy/pull/5010#discussion_r190434422"},"pull_request":{"href":"https://api.github.com/repos/python/mypy/pulls/5010"}}},"pull_request":{"url":"https://api.github.com/repos/python/mypy/pulls/5010","id":186205463,"html_url":"https://github.com/python/mypy/pull/5010","diff_url":"https://github.com/python/mypy/pull/5010.diff","patch_url":"https://github.com/python/mypy/pull/5010.patch","issue_url":"https://api.github.com/repos/python/mypy/issues/5010","number":5010,"state":"open","locked":false,"title":"add support for dataclasses","user":{"login":"Bogdanp","id":43347,"avatar_url":"https://avatars2.githubusercontent.com/u/43347?v=4","gravatar_id":"","url":"https://api.github.com/users/Bogdanp","html_url":"https://github.com/Bogdanp","followers_url":"https://api.github.com/users/Bogdanp/followers","following_url":"https://api.github.com/users/Bogdanp/following{/other_user}","gists_url":"https://api.github.com/users/Bogdanp/gists{/gist_id}","starred_url":"https://api.github.com/users/Bogdanp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Bogdanp/subscriptions","organizations_url":"https://api.github.com/users/Bogdanp/orgs","repos_url":"https://api.github.com/users/Bogdanp/repos","events_url":"https://api.github.com/users/Bogdanp/events{/privacy}","received_events_url":"https://api.github.com/users/Bogdanp/received_events","type":"User","site_admin":false},"body":"This is a work in progress for adding support for dataclasses as a plugin (heavily inspired by and reusing some parts of the attrs plugin).  It's pretty close to complete, but I wanted to get some feedback before continuing as I'm new to the codebase.  I'll take this over the finish line next weekend if it's deemed desirable, but here are my open questions:\r\n\r\n* Is the way I'm hooking the plugin in correct? `fullname` in `get_class_decorator_hook` doesn't seem to have the value I expect (i.e. the name is qualified to the module `dataclass` is imported in, so its value is `some_package.some_module.dataclass` rather than `dataclasses.dataclass`).\r\n* Should I be attempting to re-use more code between the two plugins? I only re-used the things that seemed to be fully generic between the two.\r\n\r\nI tried it out on a real-world Python 3.6 project that makes heavy use of dataclasses and it seems to work great so far.\r\n\r\nThis would close https://github.com/python/mypy/issues/4792.","created_at":"2018-05-06T13:22:46Z","updated_at":"2018-05-24T00:39:42Z","closed_at":null,"merged_at":null,"merge_commit_sha":"82c4d2c90c6cec0805fc744f614779d76beda4a2","assignee":{"login":"ilevkivskyi","id":12005495,"avatar_url":"https://avatars1.githubusercontent.com/u/12005495?v=4","gravatar_id":"","url":"https://api.github.com/users/ilevkivskyi","html_url":"https://github.com/ilevkivskyi","followers_url":"https://api.github.com/users/ilevkivskyi/followers","following_url":"https://api.github.com/users/ilevkivskyi/following{/other_user}","gists_url":"https://api.github.com/users/ilevkivskyi/gists{/gist_id}","starred_url":"https://api.github.com/users/ilevkivskyi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ilevkivskyi/subscriptions","organizations_url":"https://api.github.com/users/ilevkivskyi/orgs","repos_url":"https://api.github.com/users/ilevkivskyi/repos","events_url":"https://api.github.com/users/ilevkivskyi/events{/privacy}","received_events_url":"https://api.github.com/users/ilevkivskyi/received_events","type":"User","site_admin":false},"assignees":[{"login":"ilevkivskyi","id":12005495,"avatar_url":"https://avatars1.githubusercontent.com/u/12005495?v=4","gravatar_id":"","url":"https://api.github.com/users/ilevkivskyi","html_url":"https://github.com/ilevkivskyi","followers_url":"https://api.github.com/users/ilevkivskyi/followers","following_url":"https://api.github.com/users/ilevkivskyi/following{/other_user}","gists_url":"https://api.github.com/users/ilevkivskyi/gists{/gist_id}","starred_url":"https://api.github.com/users/ilevkivskyi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ilevkivskyi/subscriptions","organizations_url":"https://api.github.com/users/ilevkivskyi/orgs","repos_url":"https://api.github.com/users/ilevkivskyi/repos","events_url":"https://api.github.com/users/ilevkivskyi/events{/privacy}","received_events_url":"https://api.github.com/users/ilevkivskyi/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/python/mypy/pulls/5010/commits","review_comments_url":"https://api.github.com/repos/python/mypy/pulls/5010/comments","review_comment_url":"https://api.github.com/repos/python/mypy/pulls/comments{/number}","comments_url":"https://api.github.com/repos/python/mypy/issues/5010/comments","statuses_url":"https://api.github.com/repos/python/mypy/statuses/92b53471e5acc67fc5f45509405d9c83c96bd0a3","head":{"label":"Bogdanp:dataclasses","ref":"dataclasses","sha":"92b53471e5acc67fc5f45509405d9c83c96bd0a3","user":{"login":"Bogdanp","id":43347,"avatar_url":"https://avatars2.githubusercontent.com/u/43347?v=4","gravatar_id":"","url":"https://api.github.com/users/Bogdanp","html_url":"https://github.com/Bogdanp","followers_url":"https://api.github.com/users/Bogdanp/followers","following_url":"https://api.github.com/users/Bogdanp/following{/other_user}","gists_url":"https://api.github.com/users/Bogdanp/gists{/gist_id}","starred_url":"https://api.github.com/users/Bogdanp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Bogdanp/subscriptions","organizations_url":"https://api.github.com/users/Bogdanp/orgs","repos_url":"https://api.github.com/users/Bogdanp/repos","events_url":"https://api.github.com/users/Bogdanp/events{/privacy}","received_events_url":"https://api.github.com/users/Bogdanp/received_events","type":"User","site_admin":false},"repo":{"id":132323545,"name":"mypy","full_name":"Bogdanp/mypy","owner":{"login":"Bogdanp","id":43347,"avatar_url":"https://avatars2.githubusercontent.com/u/43347?v=4","gravatar_id":"","url":"https://api.github.com/users/Bogdanp","html_url":"https://github.com/Bogdanp","followers_url":"https://api.github.com/users/Bogdanp/followers","following_url":"https://api.github.com/users/Bogdanp/following{/other_user}","gists_url":"https://api.github.com/users/Bogdanp/gists{/gist_id}","starred_url":"https://api.github.com/users/Bogdanp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Bogdanp/subscriptions","organizations_url":"https://api.github.com/users/Bogdanp/orgs","repos_url":"https://api.github.com/users/Bogdanp/repos","events_url":"https://api.github.com/users/Bogdanp/events{/privacy}","received_events_url":"https://api.github.com/users/Bogdanp/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Bogdanp/mypy","description":"Optional static typing for Python 2 and 3 (PEP484)","fork":true,"url":"https://api.github.com/repos/Bogdanp/mypy","forks_url":"https://api.github.com/repos/Bogdanp/mypy/forks","keys_url":"https://api.github.com/repos/Bogdanp/mypy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Bogdanp/mypy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Bogdanp/mypy/teams","hooks_url":"https://api.github.com/repos/Bogdanp/mypy/hooks","issue_events_url":"https://api.github.com/repos/Bogdanp/mypy/issues/events{/number}","events_url":"https://api.github.com/repos/Bogdanp/mypy/events","assignees_url":"https://api.github.com/repos/Bogdanp/mypy/assignees{/user}","branches_url":"https://api.github.com/repos/Bogdanp/mypy/branches{/branch}","tags_url":"https://api.github.com/repos/Bogdanp/mypy/tags","blobs_url":"https://api.github.com/repos/Bogdanp/mypy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Bogdanp/mypy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Bogdanp/mypy/git/refs{/sha}","trees_url":"https://api.github.com/repos/Bogdanp/mypy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Bogdanp/mypy/statuses/{sha}","languages_url":"https://api.github.com/repos/Bogdanp/mypy/languages","stargazers_url":"https://api.github.com/repos/Bogdanp/mypy/stargazers","contributors_url":"https://api.github.com/repos/Bogdanp/mypy/contributors","subscribers_url":"https://api.github.com/repos/Bogdanp/mypy/subscribers","subscription_url":"https://api.github.com/repos/Bogdanp/mypy/subscription","commits_url":"https://api.github.com/repos/Bogdanp/mypy/commits{/sha}","git_commits_url":"https://api.github.com/repos/Bogdanp/mypy/git/commits{/sha}","comments_url":"https://api.github.com/repos/Bogdanp/mypy/comments{/number}","issue_comment_url":"https://api.github.com/repos/Bogdanp/mypy/issues/comments{/number}","contents_url":"https://api.github.com/repos/Bogdanp/mypy/contents/{+path}","compare_url":"https://api.github.com/repos/Bogdanp/mypy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Bogdanp/mypy/merges","archive_url":"https://api.github.com/repos/Bogdanp/mypy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Bogdanp/mypy/downloads","issues_url":"https://api.github.com/repos/Bogdanp/mypy/issues{/number}","pulls_url":"https://api.github.com/repos/Bogdanp/mypy/pulls{/number}","milestones_url":"https://api.github.com/repos/Bogdanp/mypy/milestones{/number}","notifications_url":"https://api.github.com/repos/Bogdanp/mypy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Bogdanp/mypy/labels{/name}","releases_url":"https://api.github.com/repos/Bogdanp/mypy/releases{/id}","deployments_url":"https://api.github.com/repos/Bogdanp/mypy/deployments","created_at":"2018-05-06T09:16:41Z","updated_at":"2018-05-15T17:20:03Z","pushed_at":"2018-05-20T16:37:11Z","git_url":"git://github.com/Bogdanp/mypy.git","ssh_url":"git@github.com:Bogdanp/mypy.git","clone_url":"https://github.com/Bogdanp/mypy.git","svn_url":"https://github.com/Bogdanp/mypy","homepage":"http://www.mypy-lang.org/","size":25860,"stargazers_count":1,"watchers_count":1,"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":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"python:master","ref":"master","sha":"da519e65ad122794a1d082577c044cb31fceca55","user":{"login":"python","id":1525981,"avatar_url":"https://avatars3.githubusercontent.com/u/1525981?v=4","gravatar_id":"","url":"https://api.github.com/users/python","html_url":"https://github.com/python","followers_url":"https://api.github.com/users/python/followers","following_url":"https://api.github.com/users/python/following{/other_user}","gists_url":"https://api.github.com/users/python/gists{/gist_id}","starred_url":"https://api.github.com/users/python/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/python/subscriptions","organizations_url":"https://api.github.com/users/python/orgs","repos_url":"https://api.github.com/users/python/repos","events_url":"https://api.github.com/users/python/events{/privacy}","received_events_url":"https://api.github.com/users/python/received_events","type":"Organization","site_admin":false},"repo":{"id":7053637,"name":"mypy","full_name":"python/mypy","owner":{"login":"python","id":1525981,"avatar_url":"https://avatars3.githubusercontent.com/u/1525981?v=4","gravatar_id":"","url":"https://api.github.com/users/python","html_url":"https://github.com/python","followers_url":"https://api.github.com/users/python/followers","following_url":"https://api.github.com/users/python/following{/other_user}","gists_url":"https://api.github.com/users/python/gists{/gist_id}","starred_url":"https://api.github.com/users/python/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/python/subscriptions","organizations_url":"https://api.github.com/users/python/orgs","repos_url":"https://api.github.com/users/python/repos","events_url":"https://api.github.com/users/python/events{/privacy}","received_events_url":"https://api.github.com/users/python/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/python/mypy","description":"Optional static typing for Python 2 and 3 (PEP484)","fork":false,"url":"https://api.github.com/repos/python/mypy","forks_url":"https://api.github.com/repos/python/mypy/forks","keys_url":"https://api.github.com/repos/python/mypy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/python/mypy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/python/mypy/teams","hooks_url":"https://api.github.com/repos/python/mypy/hooks","issue_events_url":"https://api.github.com/repos/python/mypy/issues/events{/number}","events_url":"https://api.github.com/repos/python/mypy/events","assignees_url":"https://api.github.com/repos/python/mypy/assignees{/user}","branches_url":"https://api.github.com/repos/python/mypy/branches{/branch}","tags_url":"https://api.github.com/repos/python/mypy/tags","blobs_url":"https://api.github.com/repos/python/mypy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/python/mypy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/python/mypy/git/refs{/sha}","trees_url":"https://api.github.com/repos/python/mypy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/python/mypy/statuses/{sha}","languages_url":"https://api.github.com/repos/python/mypy/languages","stargazers_url":"https://api.github.com/repos/python/mypy/stargazers","contributors_url":"https://api.github.com/repos/python/mypy/contributors","subscribers_url":"https://api.github.com/repos/python/mypy/subscribers","subscription_url":"https://api.github.com/repos/python/mypy/subscription","commits_url":"https://api.github.com/repos/python/mypy/commits{/sha}","git_commits_url":"https://api.github.com/repos/python/mypy/git/commits{/sha}","comments_url":"https://api.github.com/repos/python/mypy/comments{/number}","issue_comment_url":"https://api.github.com/repos/python/mypy/issues/comments{/number}","contents_url":"https://api.github.com/repos/python/mypy/contents/{+path}","compare_url":"https://api.github.com/repos/python/mypy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/python/mypy/merges","archive_url":"https://api.github.com/repos/python/mypy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/python/mypy/downloads","issues_url":"https://api.github.com/repos/python/mypy/issues{/number}","pulls_url":"https://api.github.com/repos/python/mypy/pulls{/number}","milestones_url":"https://api.github.com/repos/python/mypy/milestones{/number}","notifications_url":"https://api.github.com/repos/python/mypy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/python/mypy/labels{/name}","releases_url":"https://api.github.com/repos/python/mypy/releases{/id}","deployments_url":"https://api.github.com/repos/python/mypy/deployments","created_at":"2012-12-07T13:30:23Z","updated_at":"2018-05-24T00:07:55Z","pushed_at":"2018-05-23T23:01:16Z","git_url":"git://github.com/python/mypy.git","ssh_url":"git@github.com:python/mypy.git","clone_url":"https://github.com/python/mypy.git","svn_url":"https://github.com/python/mypy","homepage":"http://www.mypy-lang.org/","size":25918,"stargazers_count":3952,"watchers_count":3952,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":530,"mirror_url":null,"archived":false,"open_issues_count":841,"license":{"key":"other","name":"Other","spdx_id":null,"url":null},"forks":530,"open_issues":841,"watchers":3952,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/python/mypy/pulls/5010"},"html":{"href":"https://github.com/python/mypy/pull/5010"},"issue":{"href":"https://api.github.com/repos/python/mypy/issues/5010"},"comments":{"href":"https://api.github.com/repos/python/mypy/issues/5010/comments"},"review_comments":{"href":"https://api.github.com/repos/python/mypy/pulls/5010/comments"},"review_comment":{"href":"https://api.github.com/repos/python/mypy/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/python/mypy/pulls/5010/commits"},"statuses":{"href":"https://api.github.com/repos/python/mypy/statuses/92b53471e5acc67fc5f45509405d9c83c96bd0a3"}},"author_association":"NONE"}}
{"actor":{"display_login":"ilevkivskyi"}}