{"action":"created","comment":{"url":"https://api.github.com/repos/srusskih/SublimeJEDI/pulls/comments/194507901","pull_request_review_id":127693586,"id":194507901,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5NDUwNzkwMQ==","diff_hunk":"@@ -1,250 +1,176 @@\n # -*- coding: utf-8 -*-\n+import threading\n+import queue\n \n-import sys\n-import json\n-import logging\n+from functools import wraps\n+from collections import defaultdict\n \n-import jedi  # noqa\n+import jedi\n+from jedi.api import environment\n \n+import sublime\n \n-class JsonFormatter(logging.Formatter):\n-    def format(self, record):\n-        output = logging.Formatter.format(self, record)\n-        data = {\n-            'logging': record.levelname.lower(),\n-            'content': output\n-        }\n-        record = json.dumps(data)\n-        return record\n+from .facade import JediFacade\n+from .console_logging import getLogger\n+from .utils import get_settings\n \n+logger = getLogger(__name__)\n \n-def getLogger():\n-    \"\"\" Build file logger \"\"\"\n-    log = logging.getLogger('Sublime Jedi Daemon')\n-    log.setLevel(logging.DEBUG)\n-    formatter = JsonFormatter('%(asctime)s: %(levelname)-8s: %(message)s')\n-    hdlr = logging.StreamHandler(sys.stderr)\n-    hdlr.setFormatter(formatter)\n-    log.addHandler(hdlr)\n-    return log\n+DAEMONS = defaultdict(dict)  # per window\n \n \n-logger = getLogger()\n+def _prepare_request_data(view, location):\n+    if location is None:\n+        location = view.sel()[0].begin()\n+    current_line, current_column = view.rowcol(location)\n \n+    filename = view.file_name() or ''\n+    source = view.substr(sublime.Region(0, view.size()))\n+    return filename, source, current_line, current_column\n \n-def format_completion(complete):\n-    \"\"\" Returns a tuple of the string that would be visible in\n-    the completion dialogue and the completion word\n-\n-    :type complete: jedi.api_classes.Completion\n-    :rtype: (str, str)\n-    \"\"\"\n-    display, insert = complete.name + '\\t' + complete.type, complete.name\n-    return display, insert\n \n+def _get_daemon(view):\n+    window_id = view.window().id()\n+    if window_id not in DAEMONS:\n+        DAEMONS[window_id] = Daemon(settings=get_settings(view))\n+    return DAEMONS[window_id]\n \n-def get_function_parameters(call_signature, complete_all=True):\n-    \"\"\"  Return list function parameters, prepared for sublime completion.\n-    Tuple contains parameter name and default value\n \n-    Parameters list excludes: self, *args and **kwargs parameters\n+def ask_daemon_sync(view, ask_type, ask_kwargs, location=None):\n+    \"\"\"Jedi sync request shortcut.\n \n-    :type call_signature: jedi.api.classes.CallSignature\n-    :rtype: list of (str, str or None)\n+    :type view: sublime.View\n+    :type ask_type: str\n+    :type ask_kwargs: dict or None\n+    :type location: type of (int, int) or None\n     \"\"\"\n-    if not call_signature:\n-        return []\n-\n-    params = []\n-    for param in call_signature.params:\n-        # when you writing a callable object\n-        # jedi tring to complete incompleted object\n-        # and returns \"empty\" calldefinition\n-        # in this case we have to skip it\n-        if (not complete_all and\n-                param.name == '...' or\n-                '*' in param.description):\n-            break\n-\n-        if not param.name or param.name in ('self', '...'):\n-            continue\n-\n-        param_description = param.description.replace('param ', '')\n-        if '=' in param_description:\n-            default_value = param_description.rsplit('=', 1)[1].lstrip()\n-            params.append((param.name, default_value))\n-        else:\n-            params.append((param.name, None))\n-\n-    return params\n-\n-\n-class JediFacade:\n+    daemon = _get_daemon(view)\n+    return daemon.request(\n+        ask_type,\n+        ask_kwargs or {},\n+        *_prepare_request_data(view, location))\n+\n+\n+def ask_daemon_with_timeout(\n+        view,\n+        ask_type,\n+        ask_kwargs=None,\n+        location=None,\n+        timeout=3):\n+    \"\"\"Jedi sync request shortcut with timeout.\n+\n+    :type view: sublime.View\n+    :type ask_type: str\n+    :type ask_kwargs: dict or None\n+    :type location: type of (int, int) or None\n+    :type timeout: int\n     \"\"\"\n-    Facade to call Jedi API\n-\n-\n-     Action       | Method\n-    ===============================\n-     autocomplete | get_autocomplete\n-    -------------------------------\n-     goto         | get_goto\n-    -------------------------------\n-     usages       | get_usages\n-    -------------------------------\n-     funcargs     | get_funcargs\n-    --------------------------------\n-\n-\n-    \"\"\"\n-    def __init__(\n-            self, env, complete_funcargs, source, line, column, filename='',\n-            encoding='utf-8', sys_path=None):\n-        filename = filename or None\n-        self.script = jedi.Script(\n-            source=source,\n-            line=line,\n-            column=column,\n-            path=filename,\n-            encoding=encoding,\n-            environment=env,\n-            sys_path=sys_path,\n-        )\n-        self.auto_complete_function_params = complete_funcargs\n-        self.is_funcargs_complete_enabled = bool(complete_funcargs)\n-\n-    def get(self, _action, *args, **kwargs):\n-        \"\"\" Action dispatcher \"\"\"\n-        try:\n-            return getattr(self, 'get_' + _action)(*args, **kwargs)\n-        except:\n-            logger.exception('`JediFacade.get_{0}` failed'.format(_action))\n-\n-    def get_goto(self, follow_imports=True):\n-        \"\"\" Jedi \"Go To Definition\" \"\"\"\n-        return self._goto(follow_imports=follow_imports)\n-\n-    def get_usages(self):\n-        \"\"\" Jedi \"Find Usage\" \"\"\"\n-        return self._usages()\n-\n-    def get_funcargs(self):\n-        \"\"\" complete callable object parameters with Jedi \"\"\"\n-        return self._complete_call_assigments()\n-\n-    def get_autocomplete(self):\n-        \"\"\" Jedi \"completion\" \"\"\"\n-        data = []\n+    daemon = _get_daemon(view)\n+    request_data = _prepare_request_data(view, location)\n+    answers = queue.Queue(1)\n \n-        try:\n-            data.extend(self._parameters_for_completion())\n-        except:\n-            logger.error(\"params completion failed\")\n+    def _target():\n+        answer = daemon.request(ask_type, ask_kwargs or {}, *request_data)\n+        answers.put(answer)\n \n-        try:\n-            data.extend(self._completion() or [])\n-        except:\n-            logger.error(\"general completion failed\")\n+    threading.Thread(target=_target).start()\n+    return answers.get(timeout=timeout)\n \n-        return data\n \n-    def get_docstring(self):\n-        return self._docstring()\n+def ask_daemon(view, callback, ask_type, ask_kwargs=None, location=None):\n+    \"\"\"Jedi async request shortcut.\n \n-    def get_signature(self):\n-        return self._docstring(signature=1)\n+    :type view: sublime.View\n+    :type callback: callable\n+    :type ask_type: str\n+    :type ask_kwargs: dict or None\n+    :type location: type of (int, int) or None\n+    \"\"\"\n+    window_id = view.window().id()\n \n-    def _docstring(self, signature=0):\n-        \"\"\" Jedi show doctring or signature\n+    def _async_summon():\n+        answer = ask_daemon_sync(view, ask_type, ask_kwargs, location)\n+        run_in_active_view(window_id)(callback)(answer)\n \n-        :rtype: str\n-        \"\"\"\n-        defs = self.script.goto_definitions()\n-        assert isinstance(defs, list)\n+    if callback:\n+        sublime.set_timeout_async(_async_summon, 0)\n \n-        if len(defs) > 0:\n-            if signature:\n-                calltip_signature = defs[0].docstring().split('\\n\\n')[0]\n-                return calltip_signature.replace('\\n', ' ').replace(' = ', '=')\n-            else:\n-                return defs[0].docstring()\n \n-    def _parameters_for_completion(self):\n-        \"\"\" Get function / class' constructor parameters completions list\n+def run_in_active_view(window_id):\n+    \"\"\"Run function in active ST active view for binded window.\n \n-        :rtype: list of str\n-        \"\"\"\n-        completions = []\n-        try:\n-            in_call = self.script.call_signatures()[0]\n-        except IndexError:\n-            in_call = None\n+    sublime.View instance would be passed as first parameter to function.\n+    \"\"\"\n+    def _decorator(func):\n+        @wraps(func)\n+        def _wrapper(*args, **kwargs):\n+            for window in sublime.windows():\n+                if window.id() == window_id:\n+                    return func(window.active_view(), *args, **kwargs)\n \n-        parameters = get_function_parameters(in_call)\n+            logger.info(","path":"sublime_jedi/daemon.py","position":266,"original_position":266,"commit_id":"4e3cb0fc6462d7b468d696766c6914d41b541f44","original_commit_id":"c01a183a5b6fd0be6770ef823f671abbdcc16a74","user":{"login":"edelvalle","id":6555851,"node_id":"MDQ6VXNlcjY1NTU4NTE=","avatar_url":"https://avatars3.githubusercontent.com/u/6555851?v=4","gravatar_id":"","url":"https://api.github.com/users/edelvalle","html_url":"https://github.com/edelvalle","followers_url":"https://api.github.com/users/edelvalle/followers","following_url":"https://api.github.com/users/edelvalle/following{/other_user}","gists_url":"https://api.github.com/users/edelvalle/gists{/gist_id}","starred_url":"https://api.github.com/users/edelvalle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/edelvalle/subscriptions","organizations_url":"https://api.github.com/users/edelvalle/orgs","repos_url":"https://api.github.com/users/edelvalle/repos","events_url":"https://api.github.com/users/edelvalle/events{/privacy}","received_events_url":"https://api.github.com/users/edelvalle/received_events","type":"User","site_admin":false},"body":"well it would happen in weird occasions and does not break stuff... so a warning should do. ","created_at":"2018-06-11T18:45:43Z","updated_at":"2018-06-11T18:48:33Z","html_url":"https://github.com/srusskih/SublimeJEDI/pull/244#discussion_r194507901","pull_request_url":"https://api.github.com/repos/srusskih/SublimeJEDI/pulls/244","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/srusskih/SublimeJEDI/pulls/comments/194507901"},"html":{"href":"https://github.com/srusskih/SublimeJEDI/pull/244#discussion_r194507901"},"pull_request":{"href":"https://api.github.com/repos/srusskih/SublimeJEDI/pulls/244"}},"in_reply_to_id":194482427},"pull_request":{"url":"https://api.github.com/repos/srusskih/SublimeJEDI/pulls/244","id":187658797,"node_id":"MDExOlB1bGxSZXF1ZXN0MTg3NjU4Nzk3","html_url":"https://github.com/srusskih/SublimeJEDI/pull/244","diff_url":"https://github.com/srusskih/SublimeJEDI/pull/244.diff","patch_url":"https://github.com/srusskih/SublimeJEDI/pull/244.patch","issue_url":"https://api.github.com/repos/srusskih/SublimeJEDI/issues/244","number":244,"state":"open","locked":false,"title":"Update completion behavior","user":{"login":"srusskih","id":340727,"node_id":"MDQ6VXNlcjM0MDcyNw==","avatar_url":"https://avatars1.githubusercontent.com/u/340727?v=4","gravatar_id":"","url":"https://api.github.com/users/srusskih","html_url":"https://github.com/srusskih","followers_url":"https://api.github.com/users/srusskih/followers","following_url":"https://api.github.com/users/srusskih/following{/other_user}","gists_url":"https://api.github.com/users/srusskih/gists{/gist_id}","starred_url":"https://api.github.com/users/srusskih/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/srusskih/subscriptions","organizations_url":"https://api.github.com/users/srusskih/orgs","repos_url":"https://api.github.com/users/srusskih/repos","events_url":"https://api.github.com/users/srusskih/events{/privacy}","received_events_url":"https://api.github.com/users/srusskih/received_events","type":"User","site_admin":false},"body":"* used sync call to Jedi for completion to rid of blinking\r\n* sync call to jedi has a timeout to keep editor from restart in case completion are sloooow\r\n* replaced `sublime.EventListerner` -> `sublime.ViewEventListener`\r\n* jedi requestor (Daemon) moved from `utils.py` to `daemon.py`\r\n* jedi api interface (JediFacade) moved from `daemon.py` to `facade.py`\r\n* improved argument completion behavior","created_at":"2018-05-13T08:36:54Z","updated_at":"2018-06-11T18:48:33Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fcdfacfb6e6911f1f2dbe30611e33ee5e2e0926b","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/srusskih/SublimeJEDI/pulls/244/commits","review_comments_url":"https://api.github.com/repos/srusskih/SublimeJEDI/pulls/244/comments","review_comment_url":"https://api.github.com/repos/srusskih/SublimeJEDI/pulls/comments{/number}","comments_url":"https://api.github.com/repos/srusskih/SublimeJEDI/issues/244/comments","statuses_url":"https://api.github.com/repos/srusskih/SublimeJEDI/statuses/4e3cb0fc6462d7b468d696766c6914d41b541f44","head":{"label":"srusskih:sync_completion","ref":"sync_completion","sha":"4e3cb0fc6462d7b468d696766c6914d41b541f44","user":{"login":"srusskih","id":340727,"node_id":"MDQ6VXNlcjM0MDcyNw==","avatar_url":"https://avatars1.githubusercontent.com/u/340727?v=4","gravatar_id":"","url":"https://api.github.com/users/srusskih","html_url":"https://github.com/srusskih","followers_url":"https://api.github.com/users/srusskih/followers","following_url":"https://api.github.com/users/srusskih/following{/other_user}","gists_url":"https://api.github.com/users/srusskih/gists{/gist_id}","starred_url":"https://api.github.com/users/srusskih/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/srusskih/subscriptions","organizations_url":"https://api.github.com/users/srusskih/orgs","repos_url":"https://api.github.com/users/srusskih/repos","events_url":"https://api.github.com/users/srusskih/events{/privacy}","received_events_url":"https://api.github.com/users/srusskih/received_events","type":"User","site_admin":false},"repo":{"id":6241108,"node_id":"MDEwOlJlcG9zaXRvcnk2MjQxMTA4","name":"SublimeJEDI","full_name":"srusskih/SublimeJEDI","owner":{"login":"srusskih","id":340727,"node_id":"MDQ6VXNlcjM0MDcyNw==","avatar_url":"https://avatars1.githubusercontent.com/u/340727?v=4","gravatar_id":"","url":"https://api.github.com/users/srusskih","html_url":"https://github.com/srusskih","followers_url":"https://api.github.com/users/srusskih/followers","following_url":"https://api.github.com/users/srusskih/following{/other_user}","gists_url":"https://api.github.com/users/srusskih/gists{/gist_id}","starred_url":"https://api.github.com/users/srusskih/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/srusskih/subscriptions","organizations_url":"https://api.github.com/users/srusskih/orgs","repos_url":"https://api.github.com/users/srusskih/repos","events_url":"https://api.github.com/users/srusskih/events{/privacy}","received_events_url":"https://api.github.com/users/srusskih/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/srusskih/SublimeJEDI","description":"awesome Python autocompletion with SublimeText","fork":false,"url":"https://api.github.com/repos/srusskih/SublimeJEDI","forks_url":"https://api.github.com/repos/srusskih/SublimeJEDI/forks","keys_url":"https://api.github.com/repos/srusskih/SublimeJEDI/keys{/key_id}","collaborators_url":"https://api.github.com/repos/srusskih/SublimeJEDI/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/srusskih/SublimeJEDI/teams","hooks_url":"https://api.github.com/repos/srusskih/SublimeJEDI/hooks","issue_events_url":"https://api.github.com/repos/srusskih/SublimeJEDI/issues/events{/number}","events_url":"https://api.github.com/repos/srusskih/SublimeJEDI/events","assignees_url":"https://api.github.com/repos/srusskih/SublimeJEDI/assignees{/user}","branches_url":"https://api.github.com/repos/srusskih/SublimeJEDI/branches{/branch}","tags_url":"https://api.github.com/repos/srusskih/SublimeJEDI/tags","blobs_url":"https://api.github.com/repos/srusskih/SublimeJEDI/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/srusskih/SublimeJEDI/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/srusskih/SublimeJEDI/git/refs{/sha}","trees_url":"https://api.github.com/repos/srusskih/SublimeJEDI/git/trees{/sha}","statuses_url":"https://api.github.com/repos/srusskih/SublimeJEDI/statuses/{sha}","languages_url":"https://api.github.com/repos/srusskih/SublimeJEDI/languages","stargazers_url":"https://api.github.com/repos/srusskih/SublimeJEDI/stargazers","contributors_url":"https://api.github.com/repos/srusskih/SublimeJEDI/contributors","subscribers_url":"https://api.github.com/repos/srusskih/SublimeJEDI/subscribers","subscription_url":"https://api.github.com/repos/srusskih/SublimeJEDI/subscription","commits_url":"https://api.github.com/repos/srusskih/SublimeJEDI/commits{/sha}","git_commits_url":"https://api.github.com/repos/srusskih/SublimeJEDI/git/commits{/sha}","comments_url":"https://api.github.com/repos/srusskih/SublimeJEDI/comments{/number}","issue_comment_url":"https://api.github.com/repos/srusskih/SublimeJEDI/issues/comments{/number}","contents_url":"https://api.github.com/repos/srusskih/SublimeJEDI/contents/{+path}","compare_url":"https://api.github.com/repos/srusskih/SublimeJEDI/compare/{base}...{head}","merges_url":"https://api.github.com/repos/srusskih/SublimeJEDI/merges","archive_url":"https://api.github.com/repos/srusskih/SublimeJEDI/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/srusskih/SublimeJEDI/downloads","issues_url":"https://api.github.com/repos/srusskih/SublimeJEDI/issues{/number}","pulls_url":"https://api.github.com/repos/srusskih/SublimeJEDI/pulls{/number}","milestones_url":"https://api.github.com/repos/srusskih/SublimeJEDI/milestones{/number}","notifications_url":"https://api.github.com/repos/srusskih/SublimeJEDI/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/srusskih/SublimeJEDI/labels{/name}","releases_url":"https://api.github.com/repos/srusskih/SublimeJEDI/releases{/id}","deployments_url":"https://api.github.com/repos/srusskih/SublimeJEDI/deployments","created_at":"2012-10-16T08:23:57Z","updated_at":"2018-06-05T18:47:50Z","pushed_at":"2018-06-11T17:33:08Z","git_url":"git://github.com/srusskih/SublimeJEDI.git","ssh_url":"git@github.com:srusskih/SublimeJEDI.git","clone_url":"https://github.com/srusskih/SublimeJEDI.git","svn_url":"https://github.com/srusskih/SublimeJEDI","homepage":null,"size":1166,"stargazers_count":822,"watchers_count":822,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":91,"mirror_url":null,"archived":false,"open_issues_count":19,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":91,"open_issues":19,"watchers":822,"default_branch":"master"}},"base":{"label":"srusskih:master","ref":"master","sha":"e4dfb30d73cef723bb99b8813a6759984c819f63","user":{"login":"srusskih","id":340727,"node_id":"MDQ6VXNlcjM0MDcyNw==","avatar_url":"https://avatars1.githubusercontent.com/u/340727?v=4","gravatar_id":"","url":"https://api.github.com/users/srusskih","html_url":"https://github.com/srusskih","followers_url":"https://api.github.com/users/srusskih/followers","following_url":"https://api.github.com/users/srusskih/following{/other_user}","gists_url":"https://api.github.com/users/srusskih/gists{/gist_id}","starred_url":"https://api.github.com/users/srusskih/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/srusskih/subscriptions","organizations_url":"https://api.github.com/users/srusskih/orgs","repos_url":"https://api.github.com/users/srusskih/repos","events_url":"https://api.github.com/users/srusskih/events{/privacy}","received_events_url":"https://api.github.com/users/srusskih/received_events","type":"User","site_admin":false},"repo":{"id":6241108,"node_id":"MDEwOlJlcG9zaXRvcnk2MjQxMTA4","name":"SublimeJEDI","full_name":"srusskih/SublimeJEDI","owner":{"login":"srusskih","id":340727,"node_id":"MDQ6VXNlcjM0MDcyNw==","avatar_url":"https://avatars1.githubusercontent.com/u/340727?v=4","gravatar_id":"","url":"https://api.github.com/users/srusskih","html_url":"https://github.com/srusskih","followers_url":"https://api.github.com/users/srusskih/followers","following_url":"https://api.github.com/users/srusskih/following{/other_user}","gists_url":"https://api.github.com/users/srusskih/gists{/gist_id}","starred_url":"https://api.github.com/users/srusskih/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/srusskih/subscriptions","organizations_url":"https://api.github.com/users/srusskih/orgs","repos_url":"https://api.github.com/users/srusskih/repos","events_url":"https://api.github.com/users/srusskih/events{/privacy}","received_events_url":"https://api.github.com/users/srusskih/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/srusskih/SublimeJEDI","description":"awesome Python autocompletion with SublimeText","fork":false,"url":"https://api.github.com/repos/srusskih/SublimeJEDI","forks_url":"https://api.github.com/repos/srusskih/SublimeJEDI/forks","keys_url":"https://api.github.com/repos/srusskih/SublimeJEDI/keys{/key_id}","collaborators_url":"https://api.github.com/repos/srusskih/SublimeJEDI/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/srusskih/SublimeJEDI/teams","hooks_url":"https://api.github.com/repos/srusskih/SublimeJEDI/hooks","issue_events_url":"https://api.github.com/repos/srusskih/SublimeJEDI/issues/events{/number}","events_url":"https://api.github.com/repos/srusskih/SublimeJEDI/events","assignees_url":"https://api.github.com/repos/srusskih/SublimeJEDI/assignees{/user}","branches_url":"https://api.github.com/repos/srusskih/SublimeJEDI/branches{/branch}","tags_url":"https://api.github.com/repos/srusskih/SublimeJEDI/tags","blobs_url":"https://api.github.com/repos/srusskih/SublimeJEDI/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/srusskih/SublimeJEDI/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/srusskih/SublimeJEDI/git/refs{/sha}","trees_url":"https://api.github.com/repos/srusskih/SublimeJEDI/git/trees{/sha}","statuses_url":"https://api.github.com/repos/srusskih/SublimeJEDI/statuses/{sha}","languages_url":"https://api.github.com/repos/srusskih/SublimeJEDI/languages","stargazers_url":"https://api.github.com/repos/srusskih/SublimeJEDI/stargazers","contributors_url":"https://api.github.com/repos/srusskih/SublimeJEDI/contributors","subscribers_url":"https://api.github.com/repos/srusskih/SublimeJEDI/subscribers","subscription_url":"https://api.github.com/repos/srusskih/SublimeJEDI/subscription","commits_url":"https://api.github.com/repos/srusskih/SublimeJEDI/commits{/sha}","git_commits_url":"https://api.github.com/repos/srusskih/SublimeJEDI/git/commits{/sha}","comments_url":"https://api.github.com/repos/srusskih/SublimeJEDI/comments{/number}","issue_comment_url":"https://api.github.com/repos/srusskih/SublimeJEDI/issues/comments{/number}","contents_url":"https://api.github.com/repos/srusskih/SublimeJEDI/contents/{+path}","compare_url":"https://api.github.com/repos/srusskih/SublimeJEDI/compare/{base}...{head}","merges_url":"https://api.github.com/repos/srusskih/SublimeJEDI/merges","archive_url":"https://api.github.com/repos/srusskih/SublimeJEDI/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/srusskih/SublimeJEDI/downloads","issues_url":"https://api.github.com/repos/srusskih/SublimeJEDI/issues{/number}","pulls_url":"https://api.github.com/repos/srusskih/SublimeJEDI/pulls{/number}","milestones_url":"https://api.github.com/repos/srusskih/SublimeJEDI/milestones{/number}","notifications_url":"https://api.github.com/repos/srusskih/SublimeJEDI/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/srusskih/SublimeJEDI/labels{/name}","releases_url":"https://api.github.com/repos/srusskih/SublimeJEDI/releases{/id}","deployments_url":"https://api.github.com/repos/srusskih/SublimeJEDI/deployments","created_at":"2012-10-16T08:23:57Z","updated_at":"2018-06-05T18:47:50Z","pushed_at":"2018-06-11T17:33:08Z","git_url":"git://github.com/srusskih/SublimeJEDI.git","ssh_url":"git@github.com:srusskih/SublimeJEDI.git","clone_url":"https://github.com/srusskih/SublimeJEDI.git","svn_url":"https://github.com/srusskih/SublimeJEDI","homepage":null,"size":1166,"stargazers_count":822,"watchers_count":822,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":91,"mirror_url":null,"archived":false,"open_issues_count":19,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":91,"open_issues":19,"watchers":822,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/srusskih/SublimeJEDI/pulls/244"},"html":{"href":"https://github.com/srusskih/SublimeJEDI/pull/244"},"issue":{"href":"https://api.github.com/repos/srusskih/SublimeJEDI/issues/244"},"comments":{"href":"https://api.github.com/repos/srusskih/SublimeJEDI/issues/244/comments"},"review_comments":{"href":"https://api.github.com/repos/srusskih/SublimeJEDI/pulls/244/comments"},"review_comment":{"href":"https://api.github.com/repos/srusskih/SublimeJEDI/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/srusskih/SublimeJEDI/pulls/244/commits"},"statuses":{"href":"https://api.github.com/repos/srusskih/SublimeJEDI/statuses/4e3cb0fc6462d7b468d696766c6914d41b541f44"}},"author_association":"OWNER"}}
{"actor":{"display_login":"edelvalle"}}