{"action":"created","comment":{"url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/pulls/comments/172698967","pull_request_review_id":101760146,"id":172698967,"diff_hunk":"@@ -0,0 +1,281 @@\n+# Copyright 2018 Google LLC\n+#\n+# Licensed under the Apache License, Version 2.0 (the \"License\");\n+# you may not use this file except in compliance with the License.\n+# You may obtain a copy of the License at\n+#\n+#     http://www.apache.org/licenses/LICENSE-2.0\n+#\n+# Unless required by applicable law or agreed to in writing, software\n+# distributed under the License is distributed on an \"AS IS\" BASIS,\n+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+# See the License for the specific language governing permissions and\n+# limitations under the License.\n+\n+\"\"\"Define IPython Magics\n+\n+.. function:: %%bigquery\n+\n+    IPython cell magic to run a query and display the result as a DataFrame\n+\n+    .. code-block:: python\n+\n+        %%bigquery [<destination_var>] [--project <project>] [--use_legacy_sql]\n+                   [--verbose]\n+        <query>\n+\n+    Parameters:\n+\n+    * ``<destination_var>`` (optional, line argument):\n+        variable to store the query results.\n+    * ``--project <project>`` (optional, line argument):\n+        Project to use for running the query. Defaults to the context\n+        :attr:`~google.cloud.bigquery.magics.Context.project`.\n+    * ``--use_legacy_sql`` (optional, line argument):\n+        Runs the query using Legacy SQL syntax. Defaults to Standard SQL if\n+        this argument not used.\n+    * ``--verbose`` (optional, line argument):\n+        If this flag is used, information including the query job ID and the\n+        amount of time for the query to complete will not be cleared after the\n+        query is finished. By default, this information will be displayed but\n+        will be cleared after the query is finished.\n+    * ``<query>`` (required, cell argument):\n+        SQL query to run.\n+\n+    Returns:\n+        A :class:`pandas.DataFrame` with the query results.\n+\n+    .. note::\n+        All queries run using this magic will run using the context\n+        :attr:`~google.cloud.bigquery.magics.Context.credentials`.\n+\n+    Examples:\n+        The following examples can be run in an IPython notebook after loading\n+        the bigquery IPython extension (see ``In[1]``) and setting up\n+        Application Default Credentials.\n+\n+    .. code-block:: python\n+\n+        In [1]: %load_ext google.cloud.bigquery\n+\n+        In [2]: %%bigquery\n+           ...: SELECT name, SUM(number) as count\n+           ...: FROM `bigquery-public-data.usa_names.usa_1910_current`\n+           ...: GROUP BY name\n+           ...: ORDER BY count DESC\n+           ...: LIMIT 3\n+\n+        Out[2]:       name    count\n+           ...: -------------------\n+           ...: 0    James  4987296\n+           ...: 1     John  4866302\n+           ...: 2   Robert  4738204\n+\n+        In [3]: %%bigquery df --project my-alternate-project --verbose\n+           ...: SELECT name, SUM(number) as count\n+           ...: FROM `bigquery-public-data.usa_names.usa_1910_current`\n+           ...: WHERE gender = 'F'\n+           ...: GROUP BY name\n+           ...: ORDER BY count DESC\n+           ...: LIMIT 3\n+        Executing query with job ID: bf633912-af2c-4780-b568-5d868058632b\n+        Query executing: 2.61s\n+        Query complete after 2.92s\n+\n+        Out[3]:          name    count\n+           ...: ----------------------\n+           ...: 0        Mary  3736239\n+           ...: 1    Patricia  1568495\n+           ...: 2   Elizabeth  1519946\n+\n+        In [4]: df\n+\n+        Out[4]:          name    count\n+           ...: ----------------------\n+           ...: 0        Mary  3736239\n+           ...: 1    Patricia  1568495\n+           ...: 2   Elizabeth  1519946\n+\n+\"\"\"\n+\n+from __future__ import print_function\n+\n+import time\n+from concurrent import futures\n+\n+try:\n+    import IPython\n+    from IPython import display\n+    from IPython.core import magic_arguments\n+except ImportError:  # pragma: NO COVER\n+    raise ImportError('This module can only be loaded in IPython.')\n+\n+import google.auth\n+from google.cloud.bigquery.client import Client\n+from google.cloud.bigquery.job import QueryJobConfig\n+\n+\n+class Context(object):\n+    \"\"\"Storage for objects to be used throughout an IPython notebook session.\n+\n+    A Context object is initialized when the ``magics`` module is imported,\n+    and can be found at ``google.cloud.bigquery.magics.context``.\n+    \"\"\"\n+    def __init__(self):\n+        self._credentials = None\n+        self._project = None\n+\n+    @property\n+    def credentials(self):\n+        \"\"\"google.auth.credentials.Credentials: Credentials to use for queries\n+        performed through IPython magics\n+\n+        Note:\n+            These credentials do not need to be explicitly defined if you are\n+            using Application Default Credentials. If you are not using\n+            Application Default Credentials, manually construct a\n+            :class:`google.auth.credentials.Credentials` object and set it as\n+            the context credentials as demonstrated in the example below. See\n+            `auth docs`_ for more information on obtaining credentials.\n+\n+        Example:\n+            Manually setting the context credentials:\n+\n+            >>> from google.cloud.bigquery import magics\n+            >>> from google.oauth2 import service_account\n+            >>> credentials = (service_account\n+            ...     .Credentials.from_service_account_file(\n+            ...         '/path/to/key.json'))\n+            >>> magics.context.credentials = credentials\n+\n+\n+        .. _auth docs: http://google-auth.readthedocs.io\n+            /en/latest/user-guide.html#obtaining-credentials\n+        \"\"\"\n+        if self._credentials is None:\n+            self._credentials, _ = google.auth.default()\n+        return self._credentials\n+\n+    @credentials.setter\n+    def credentials(self, value):\n+        self._credentials = value\n+\n+    @property\n+    def project(self):\n+        \"\"\"str: Default project to use for queries performed through IPython\n+        magics\n+\n+        Note:\n+            The project does not need to be explicitly defined if you have an\n+            environment default project set. If you do not have a default\n+            project set in your environment, manually assign the project as\n+            demonstrated in the example below.\n+\n+        Example:\n+            Manually setting the context project:\n+\n+            >>> from google.cloud.bigquery import magics\n+            >>> magics.context.project = 'my-project'\n+        \"\"\"\n+        if self._project is None:\n+            _, self._project = google.auth.default()\n+        return self._project\n+\n+    @project.setter\n+    def project(self, value):\n+        self._project = value\n+\n+\n+context = Context()\n+\n+\n+def _run_query(client, query, job_config=None):\n+    \"\"\"Runs a query while printing status updates\n+\n+    Args:\n+        client (google.cloud.bigquery.client.Client):\n+            Client to bundle configuration needed for API requests.\n+        query (str):\n+            SQL query to be executed. Defaults to the standard SQL dialect.\n+            Use the ``job_config`` parameter to change dialects.\n+        job_config (google.cloud.bigquery.job.QueryJobConfig, optional):\n+            Extra configuration options for the job.\n+\n+    Returns:\n+        google.cloud.bigquery.job.QueryJob: the query job created\n+\n+    Example:\n+        >>> client = bigquery.Client()\n+        >>> _run_query(client, \"SELECT 17\")\n+        Executing query with job ID: bf633912-af2c-4780-b568-5d868058632b\n+        Query executing: 1.66s\n+        Query complete after 2.07s\n+        'bf633912-af2c-4780-b568-5d868058632b'\n+    \"\"\"\n+    start_time = time.time()\n+    query_job = client.query(query, job_config=job_config)\n+    print('Executing query with job ID: {}'.format(query_job.job_id))\n+\n+    while True:\n+        print('\\rQuery executing: {:0.2f}s'.format(\n+            time.time() - start_time), end='')\n+        try:\n+            query_job.result(timeout=0.5)\n+        except futures.TimeoutError:\n+            continue\n+        break","path":"bigquery/google/cloud/bigquery/magics.py","position":226,"original_position":226,"commit_id":"e57786425ffdc5a11416df626b87ab6338e1fb32","original_commit_id":"e57786425ffdc5a11416df626b87ab6338e1fb32","user":{"login":"jonparrott","id":250995,"avatar_url":"https://avatars2.githubusercontent.com/u/250995?v=4","gravatar_id":"","url":"https://api.github.com/users/jonparrott","html_url":"https://github.com/jonparrott","followers_url":"https://api.github.com/users/jonparrott/followers","following_url":"https://api.github.com/users/jonparrott/following{/other_user}","gists_url":"https://api.github.com/users/jonparrott/gists{/gist_id}","starred_url":"https://api.github.com/users/jonparrott/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jonparrott/subscriptions","organizations_url":"https://api.github.com/users/jonparrott/orgs","repos_url":"https://api.github.com/users/jonparrott/repos","events_url":"https://api.github.com/users/jonparrott/events{/privacy}","received_events_url":"https://api.github.com/users/jonparrott/received_events","type":"User","site_admin":false},"body":"this break is in a surprising spot. Would it make more sense to put it as the last statement in the `try`?","created_at":"2018-03-06T23:45:09Z","updated_at":"2018-03-06T23:50:51Z","html_url":"https://github.com/GoogleCloudPlatform/google-cloud-python/pull/4983#discussion_r172698967","pull_request_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/pulls/4983","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/pulls/comments/172698967"},"html":{"href":"https://github.com/GoogleCloudPlatform/google-cloud-python/pull/4983#discussion_r172698967"},"pull_request":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/pulls/4983"}}},"pull_request":{"url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/pulls/4983","id":172322860,"html_url":"https://github.com/GoogleCloudPlatform/google-cloud-python/pull/4983","diff_url":"https://github.com/GoogleCloudPlatform/google-cloud-python/pull/4983.diff","patch_url":"https://github.com/GoogleCloudPlatform/google-cloud-python/pull/4983.patch","issue_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/issues/4983","number":4983,"state":"open","locked":false,"title":"BigQuery: Integration with IPython including cell magic for running queries","user":{"login":"alixhami","id":19769177,"avatar_url":"https://avatars2.githubusercontent.com/u/19769177?v=4","gravatar_id":"","url":"https://api.github.com/users/alixhami","html_url":"https://github.com/alixhami","followers_url":"https://api.github.com/users/alixhami/followers","following_url":"https://api.github.com/users/alixhami/following{/other_user}","gists_url":"https://api.github.com/users/alixhami/gists{/gist_id}","starred_url":"https://api.github.com/users/alixhami/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alixhami/subscriptions","organizations_url":"https://api.github.com/users/alixhami/orgs","repos_url":"https://api.github.com/users/alixhami/repos","events_url":"https://api.github.com/users/alixhami/events{/privacy}","received_events_url":"https://api.github.com/users/alixhami/received_events","type":"User","site_admin":false},"body":"The intent of this PR is to create an IPython magic that can be used in any IPython notebook (whether hosted or local), and open the potential for future magics and integrations with notebooks.","created_at":"2018-03-01T18:55:39Z","updated_at":"2018-03-06T23:50:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"5631cd8dde88f9fd226b7c6b283d745c5715c6b3","assignee":null,"assignees":[],"requested_reviewers":[{"login":"lukesneeringer","id":4346,"avatar_url":"https://avatars0.githubusercontent.com/u/4346?v=4","gravatar_id":"","url":"https://api.github.com/users/lukesneeringer","html_url":"https://github.com/lukesneeringer","followers_url":"https://api.github.com/users/lukesneeringer/followers","following_url":"https://api.github.com/users/lukesneeringer/following{/other_user}","gists_url":"https://api.github.com/users/lukesneeringer/gists{/gist_id}","starred_url":"https://api.github.com/users/lukesneeringer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lukesneeringer/subscriptions","organizations_url":"https://api.github.com/users/lukesneeringer/orgs","repos_url":"https://api.github.com/users/lukesneeringer/repos","events_url":"https://api.github.com/users/lukesneeringer/events{/privacy}","received_events_url":"https://api.github.com/users/lukesneeringer/received_events","type":"User","site_admin":false},{"login":"tseaver","id":242750,"avatar_url":"https://avatars2.githubusercontent.com/u/242750?v=4","gravatar_id":"","url":"https://api.github.com/users/tseaver","html_url":"https://github.com/tseaver","followers_url":"https://api.github.com/users/tseaver/followers","following_url":"https://api.github.com/users/tseaver/following{/other_user}","gists_url":"https://api.github.com/users/tseaver/gists{/gist_id}","starred_url":"https://api.github.com/users/tseaver/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tseaver/subscriptions","organizations_url":"https://api.github.com/users/tseaver/orgs","repos_url":"https://api.github.com/users/tseaver/repos","events_url":"https://api.github.com/users/tseaver/events{/privacy}","received_events_url":"https://api.github.com/users/tseaver/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":82126549,"url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/labels/api:%20bigquery","name":"api: bigquery","color":"f8f8f8","default":false},{"id":131682747,"url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/labels/cla:%20yes","name":"cla: yes","color":"c2e0c6","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/pulls/4983/commits","review_comments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/pulls/4983/comments","review_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/pulls/comments{/number}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/issues/4983/comments","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/statuses/e57786425ffdc5a11416df626b87ab6338e1fb32","head":{"label":"alixhami:bigquery-magics","ref":"bigquery-magics","sha":"e57786425ffdc5a11416df626b87ab6338e1fb32","user":{"login":"alixhami","id":19769177,"avatar_url":"https://avatars2.githubusercontent.com/u/19769177?v=4","gravatar_id":"","url":"https://api.github.com/users/alixhami","html_url":"https://github.com/alixhami","followers_url":"https://api.github.com/users/alixhami/followers","following_url":"https://api.github.com/users/alixhami/following{/other_user}","gists_url":"https://api.github.com/users/alixhami/gists{/gist_id}","starred_url":"https://api.github.com/users/alixhami/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alixhami/subscriptions","organizations_url":"https://api.github.com/users/alixhami/orgs","repos_url":"https://api.github.com/users/alixhami/repos","events_url":"https://api.github.com/users/alixhami/events{/privacy}","received_events_url":"https://api.github.com/users/alixhami/received_events","type":"User","site_admin":false},"repo":{"id":102901215,"name":"google-cloud-python","full_name":"alixhami/google-cloud-python","owner":{"login":"alixhami","id":19769177,"avatar_url":"https://avatars2.githubusercontent.com/u/19769177?v=4","gravatar_id":"","url":"https://api.github.com/users/alixhami","html_url":"https://github.com/alixhami","followers_url":"https://api.github.com/users/alixhami/followers","following_url":"https://api.github.com/users/alixhami/following{/other_user}","gists_url":"https://api.github.com/users/alixhami/gists{/gist_id}","starred_url":"https://api.github.com/users/alixhami/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alixhami/subscriptions","organizations_url":"https://api.github.com/users/alixhami/orgs","repos_url":"https://api.github.com/users/alixhami/repos","events_url":"https://api.github.com/users/alixhami/events{/privacy}","received_events_url":"https://api.github.com/users/alixhami/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/alixhami/google-cloud-python","description":"Google Cloud Client Library for Python","fork":true,"url":"https://api.github.com/repos/alixhami/google-cloud-python","forks_url":"https://api.github.com/repos/alixhami/google-cloud-python/forks","keys_url":"https://api.github.com/repos/alixhami/google-cloud-python/keys{/key_id}","collaborators_url":"https://api.github.com/repos/alixhami/google-cloud-python/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/alixhami/google-cloud-python/teams","hooks_url":"https://api.github.com/repos/alixhami/google-cloud-python/hooks","issue_events_url":"https://api.github.com/repos/alixhami/google-cloud-python/issues/events{/number}","events_url":"https://api.github.com/repos/alixhami/google-cloud-python/events","assignees_url":"https://api.github.com/repos/alixhami/google-cloud-python/assignees{/user}","branches_url":"https://api.github.com/repos/alixhami/google-cloud-python/branches{/branch}","tags_url":"https://api.github.com/repos/alixhami/google-cloud-python/tags","blobs_url":"https://api.github.com/repos/alixhami/google-cloud-python/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/alixhami/google-cloud-python/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/alixhami/google-cloud-python/git/refs{/sha}","trees_url":"https://api.github.com/repos/alixhami/google-cloud-python/git/trees{/sha}","statuses_url":"https://api.github.com/repos/alixhami/google-cloud-python/statuses/{sha}","languages_url":"https://api.github.com/repos/alixhami/google-cloud-python/languages","stargazers_url":"https://api.github.com/repos/alixhami/google-cloud-python/stargazers","contributors_url":"https://api.github.com/repos/alixhami/google-cloud-python/contributors","subscribers_url":"https://api.github.com/repos/alixhami/google-cloud-python/subscribers","subscription_url":"https://api.github.com/repos/alixhami/google-cloud-python/subscription","commits_url":"https://api.github.com/repos/alixhami/google-cloud-python/commits{/sha}","git_commits_url":"https://api.github.com/repos/alixhami/google-cloud-python/git/commits{/sha}","comments_url":"https://api.github.com/repos/alixhami/google-cloud-python/comments{/number}","issue_comment_url":"https://api.github.com/repos/alixhami/google-cloud-python/issues/comments{/number}","contents_url":"https://api.github.com/repos/alixhami/google-cloud-python/contents/{+path}","compare_url":"https://api.github.com/repos/alixhami/google-cloud-python/compare/{base}...{head}","merges_url":"https://api.github.com/repos/alixhami/google-cloud-python/merges","archive_url":"https://api.github.com/repos/alixhami/google-cloud-python/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/alixhami/google-cloud-python/downloads","issues_url":"https://api.github.com/repos/alixhami/google-cloud-python/issues{/number}","pulls_url":"https://api.github.com/repos/alixhami/google-cloud-python/pulls{/number}","milestones_url":"https://api.github.com/repos/alixhami/google-cloud-python/milestones{/number}","notifications_url":"https://api.github.com/repos/alixhami/google-cloud-python/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/alixhami/google-cloud-python/labels{/name}","releases_url":"https://api.github.com/repos/alixhami/google-cloud-python/releases{/id}","deployments_url":"https://api.github.com/repos/alixhami/google-cloud-python/deployments","created_at":"2017-09-08T20:19:45Z","updated_at":"2017-09-08T20:19:49Z","pushed_at":"2018-03-06T21:50:48Z","git_url":"git://github.com/alixhami/google-cloud-python.git","ssh_url":"git@github.com:alixhami/google-cloud-python.git","clone_url":"https://github.com/alixhami/google-cloud-python.git","svn_url":"https://github.com/alixhami/google-cloud-python","homepage":"https://googlecloudplatform.github.io/google-cloud-python/","size":129238,"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":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"GoogleCloudPlatform:master","ref":"master","sha":"71d4adbf394611ffe754dd24e3f205953dcd1f91","user":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars0.githubusercontent.com/u/2810941?v=4","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"repo":{"id":16316451,"name":"google-cloud-python","full_name":"GoogleCloudPlatform/google-cloud-python","owner":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars0.githubusercontent.com/u/2810941?v=4","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/GoogleCloudPlatform/google-cloud-python","description":"Google Cloud Client Library for Python","fork":false,"url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python","forks_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/forks","keys_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/teams","hooks_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/hooks","issue_events_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/issues/events{/number}","events_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/events","assignees_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/assignees{/user}","branches_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/branches{/branch}","tags_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/tags","blobs_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/git/refs{/sha}","trees_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/statuses/{sha}","languages_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/languages","stargazers_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/stargazers","contributors_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/contributors","subscribers_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/subscribers","subscription_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/subscription","commits_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/commits{/sha}","git_commits_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/git/commits{/sha}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/comments{/number}","issue_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/issues/comments{/number}","contents_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/contents/{+path}","compare_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/merges","archive_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/downloads","issues_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/issues{/number}","pulls_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/pulls{/number}","milestones_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/milestones{/number}","notifications_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/labels{/name}","releases_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/releases{/id}","deployments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/deployments","created_at":"2014-01-28T15:51:47Z","updated_at":"2018-03-06T19:27:36Z","pushed_at":"2018-03-06T23:23:18Z","git_url":"git://github.com/GoogleCloudPlatform/google-cloud-python.git","ssh_url":"git@github.com:GoogleCloudPlatform/google-cloud-python.git","clone_url":"https://github.com/GoogleCloudPlatform/google-cloud-python.git","svn_url":"https://github.com/GoogleCloudPlatform/google-cloud-python","homepage":"https://googlecloudplatform.github.io/google-cloud-python/","size":171062,"stargazers_count":1286,"watchers_count":1286,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":582,"mirror_url":null,"archived":false,"open_issues_count":94,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":582,"open_issues":94,"watchers":1286,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/pulls/4983"},"html":{"href":"https://github.com/GoogleCloudPlatform/google-cloud-python/pull/4983"},"issue":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/issues/4983"},"comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/issues/4983/comments"},"review_comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/pulls/4983/comments"},"review_comment":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/pulls/4983/commits"},"statuses":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-python/statuses/e57786425ffdc5a11416df626b87ab6338e1fb32"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"jonparrott"}}