{"action":"created","comment":{"url":"https://api.github.com/repos/apache/incubator-airflow/pulls/comments/245052764","pull_request_review_id":189080342,"id":245052764,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI0NTA1Mjc2NA==","diff_hunk":"@@ -0,0 +1,232 @@\n+# -*- coding: utf-8 -*-\n+#\n+# Licensed to the Apache Software Foundation (ASF) under one\n+# or more contributor license agreements.  See the NOTICE file\n+# distributed with this work for additional information\n+# regarding copyright ownership.  The ASF licenses this file\n+# to you under the Apache License, Version 2.0 (the\n+# \"License\"); you may not use this file except in compliance\n+# with the License.  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,\n+# software distributed under the License is distributed on an\n+# \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n+# KIND, either express or implied.  See the License for the\n+# specific language governing permissions and limitations\n+# under the License.\n+\n+from google.cloud.bigtable import Client\n+from google.cloud.bigtable.cluster import Cluster\n+from google.cloud.bigtable.instance import Instance\n+from google.cloud.bigtable.table import Table\n+from google.cloud.bigtable_admin_v2 import enums\n+from airflow.contrib.hooks.gcp_api_base_hook import GoogleCloudBaseHook\n+\n+\n+# noinspection PyAbstractClass\n+class BigtableHook(GoogleCloudBaseHook):\n+    \"\"\"\n+    Hook for Google Cloud Bigtable APIs.\n+    \"\"\"\n+\n+    _client = None\n+\n+    def __init__(self,\n+                 gcp_conn_id='google_cloud_default',\n+                 delegate_to=None):\n+        super(BigtableHook, self).__init__(gcp_conn_id, delegate_to)\n+\n+    def get_client(self, project_id):\n+        if not self._client:\n+            self._client = Client(project=project_id, credentials=self._get_credentials(), admin=True)\n+        return self._client\n+\n+    def get_instance(self, project_id, instance_id):\n+        \"\"\"\n+        Retrieves and returns the specified Cloud Bigtable instance if it exists.\n+        Otherwise, returns None.\n+\n+        :param project_id: The ID of the GCP project.\n+        :type project_id: str\n+        :param instance_id: The ID of the Cloud Bigtable instance.\n+        :type instance_id: str\n+        \"\"\"\n+\n+        client = self.get_client(project_id)\n+\n+        instance = Instance(instance_id, client)\n+        if not instance.exists():\n+            return None\n+        return instance\n+\n+    def delete_instance(self, project_id, instance_id):\n+        \"\"\"\n+        Deletes the specified Cloud Bigtable instance.\n+        Raises google.api_core.exceptions.NotFound if the Cloud Bigtable instance does not exist.\n+\n+        :param project_id: The ID of the GCP project.\n+        :type project_id: str\n+        :param instance_id: The ID of the Cloud Bigtable instance.\n+        :type instance_id: str\n+        \"\"\"\n+        instance = Instance(instance_id, self.get_client(project_id))\n+        instance.delete()\n+\n+    def create_instance(self,\n+                        project_id,\n+                        instance_id,\n+                        main_cluster_id,\n+                        main_cluster_zone,\n+                        replica_cluster_id=None,\n+                        replica_cluster_zone=None,\n+                        instance_display_name=None,\n+                        instance_type=enums.Instance.Type.TYPE_UNSPECIFIED,\n+                        instance_labels=None,\n+                        cluster_nodes=None,\n+                        cluster_storage_type=enums.StorageType.STORAGE_TYPE_UNSPECIFIED,\n+                        timeout=None):\n+        \"\"\"\n+        Creates new instance.\n+\n+        :type project_id: str\n+        :param project_id: The ID of the GCP project.\n+        :type instance_id: str\n+        :param instance_id: The ID for the new instance.\n+        :type main_cluster_id: str\n+        :param main_cluster_id: The ID for main cluster for the new instance.\n+        :type main_cluster_zone: str\n+        :param main_cluster_zone: The zone for main cluster.\n+            See https://cloud.google.com/bigtable/docs/locations for more details.\n+        :type replica_cluster_id: str\n+        :param replica_cluster_id: (optional) The ID for replica cluster for the new instance.\n+        :type replica_cluster_zone: str\n+        :param replica_cluster_zone: (optional)  The zone for replica cluster.\n+        :type instance_type: enums.Instance.Type\n+        :param instance_type: (optional) The type of the instance.\n+        :type instance_display_name: str\n+        :param instance_display_name: (optional) Human-readable name of the instance.\n+                Defaults to ``instance_id``.\n+        :type instance_labels: dict\n+        :param instance_labels: (optional) Dictionary of labels to associate with the instance.\n+        :type cluster_nodes: int\n+        :param cluster_nodes: (optional) Number of nodes for cluster.\n+        :type cluster_storage_type: enums.StorageType\n+        :param cluster_storage_type: (optional) The type of storage.\n+        :type timeout: int\n+        :param timeout: (optional) timeout (in seconds) for instance creation.\n+                        If None is not specified, Operator will wait indefinitely.\n+        \"\"\"\n+        cluster_storage_type = enums.StorageType(cluster_storage_type)\n+        instance_type = enums.Instance.Type(instance_type)\n+\n+        instance = Instance(\n+            instance_id,\n+            self.get_client(project_id),\n+            instance_display_name,\n+            instance_type,\n+            instance_labels,\n+        )\n+\n+        clusters = [\n+            instance.cluster(\n+                main_cluster_id,\n+                main_cluster_zone,\n+                cluster_nodes,\n+                cluster_storage_type\n+            )\n+        ]\n+        if replica_cluster_id and replica_cluster_zone:\n+            clusters.append(instance.cluster(\n+                replica_cluster_id,\n+                replica_cluster_zone,\n+                cluster_nodes,\n+                cluster_storage_type\n+            ))\n+        operation = instance.create(\n+            clusters=clusters\n+        )\n+        operation.result(timeout)\n+        return instance\n+\n+    # noinspection PyMethodMayBeStatic\n+    def create_table(self, instance, table_id, initial_split_keys, column_families):\n+        \"\"\"\n+        Creates the specified Cloud Bigtable table.\n+        Raises google.api_core.exceptions.AlreadyExists if the table exists.\n+\n+        :type instance: Instance\n+        :param instance: The Cloud Bigtable instance that owns the table.\n+        :type table_id: str\n+        :param table_id: The ID of the table to create in Cloud Bigtable.\n+        :type initial_split_keys: list\n+        :param initial_split_keys: (Optional) A list of row keys in bytes to use to initially split the table.\n+        :type column_families: dict\n+        :param column_families: (Optional) A map of columns to create. The key is the column_id str, and the\n+        value is a GarbageCollectionRule.\n+        \"\"\"\n+        table = Table(table_id, instance)\n+        table.create(initial_split_keys, column_families)\n+\n+    def delete_table(self, project_id, instance_id, table_id):\n+        \"\"\"\n+        Deletes the specified table in Cloud Bigtable.\n+        Raises google.api_core.exceptions.NotFound if the table does not exist.\n+\n+        :type project_id: str\n+        :param project_id: The ID of the GCP project.\n+        :type instance_id: str\n+        :param instance_id: The ID of the Cloud Bigtable instance.\n+        :type table_id: str\n+        :param table_id: The ID of the table in Cloud Bigtable.\n+        \"\"\"\n+        instance = Instance(instance_id, self.get_client(project_id))\n+        table = Table(table_id, instance)\n+        table.delete()\n+\n+    # noinspection PyMethodMayBeStatic\n+    def update_cluster(self, instance, cluster_id, nodes):\n+        \"\"\"\n+        Updates number of nodes in the specified Cloud Bigtable cluster.\n+        Raises google.api_core.exceptions.NotFound if the cluster does not exist.\n+\n+        :type instance: Instance\n+        :param instance: The Cloud Bigtable instance that owns the cluster.\n+        :type cluster_id: str\n+        :param cluster_id: The ID of the cluster.\n+        :type nodes: int\n+        :param nodes: The desired number of nodes.\n+        \"\"\"\n+        cluster = Cluster(cluster_id, instance)\n+        cluster.serve_nodes = nodes\n+        cluster.update()\n+\n+    # noinspection PyMethodMayBeStatic","path":"airflow/contrib/hooks/gcp_bigtable_hook.py","position":205,"original_position":205,"commit_id":"8b7891c0b1f0ba0b6126a29ff69e5e40f6183f97","original_commit_id":"8b7891c0b1f0ba0b6126a29ff69e5e40f6183f97","user":{"login":"potiuk","id":595491,"node_id":"MDQ6VXNlcjU5NTQ5MQ==","avatar_url":"https://avatars3.githubusercontent.com/u/595491?v=4","gravatar_id":"","url":"https://api.github.com/users/potiuk","html_url":"https://github.com/potiuk","followers_url":"https://api.github.com/users/potiuk/followers","following_url":"https://api.github.com/users/potiuk/following{/other_user}","gists_url":"https://api.github.com/users/potiuk/gists{/gist_id}","starred_url":"https://api.github.com/users/potiuk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/potiuk/subscriptions","organizations_url":"https://api.github.com/users/potiuk/orgs","repos_url":"https://api.github.com/users/potiuk/repos","events_url":"https://api.github.com/users/potiuk/events{/privacy}","received_events_url":"https://api.github.com/users/potiuk/received_events","type":"User","site_admin":false},"body":"Done.","created_at":"2019-01-03T16:21:26Z","updated_at":"2019-01-03T16:21:26Z","html_url":"https://github.com/apache/incubator-airflow/pull/4354#discussion_r245052764","pull_request_url":"https://api.github.com/repos/apache/incubator-airflow/pulls/4354","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/apache/incubator-airflow/pulls/comments/245052764"},"html":{"href":"https://github.com/apache/incubator-airflow/pull/4354#discussion_r245052764"},"pull_request":{"href":"https://api.github.com/repos/apache/incubator-airflow/pulls/4354"}},"in_reply_to_id":244886037},"pull_request":{"url":"https://api.github.com/repos/apache/incubator-airflow/pulls/4354","id":240549410,"node_id":"MDExOlB1bGxSZXF1ZXN0MjQwNTQ5NDEw","html_url":"https://github.com/apache/incubator-airflow/pull/4354","diff_url":"https://github.com/apache/incubator-airflow/pull/4354.diff","patch_url":"https://github.com/apache/incubator-airflow/pull/4354.patch","issue_url":"https://api.github.com/repos/apache/incubator-airflow/issues/4354","number":4354,"state":"open","locked":false,"title":"[AIRFLOW-3446] Add Google Cloud BigTable operators","user":{"login":"DariuszAniszewski","id":1576384,"node_id":"MDQ6VXNlcjE1NzYzODQ=","avatar_url":"https://avatars1.githubusercontent.com/u/1576384?v=4","gravatar_id":"","url":"https://api.github.com/users/DariuszAniszewski","html_url":"https://github.com/DariuszAniszewski","followers_url":"https://api.github.com/users/DariuszAniszewski/followers","following_url":"https://api.github.com/users/DariuszAniszewski/following{/other_user}","gists_url":"https://api.github.com/users/DariuszAniszewski/gists{/gist_id}","starred_url":"https://api.github.com/users/DariuszAniszewski/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DariuszAniszewski/subscriptions","organizations_url":"https://api.github.com/users/DariuszAniszewski/orgs","repos_url":"https://api.github.com/users/DariuszAniszewski/repos","events_url":"https://api.github.com/users/DariuszAniszewski/events{/privacy}","received_events_url":"https://api.github.com/users/DariuszAniszewski/received_events","type":"User","site_admin":false},"body":"Make sure you have checked _all_ steps below.\r\n\r\n### Jira\r\n\r\n- [x] My PR addresses the following [AIRFLOW-3446](https://issues.apache.org/jira/browse/AIRFLOW-3446/) issues and references them in the PR title. \r\n\r\n### Description\r\n\r\n- [x] Here are some details about my PR, including screenshots of any UI changes:\r\n\r\nNew operators allows:\r\n* creating and deleting instance\r\n* creating and deleting table\r\n* updating cluster\r\n* waiting for table replication (sensor)\r\n\r\n\r\n### Tests\r\n\r\n- [x] My PR adds the following unit tests:\r\n* tests/contrib/operators/test_gcp_bigtable_operator.py\r\n\r\n### Commits\r\n\r\n- [x] My commits all reference Jira issues in their subject lines, and I have squashed multiple commits if they address the same issue. In addition, my commits follow the guidelines from \"[How to write a good git commit message](http://chris.beams.io/posts/git-commit/)\":\r\n  1. Subject is separated from body by a blank line\r\n  1. Subject is limited to 50 characters (not including Jira issue reference)\r\n  1. Subject does not end with a period\r\n  1. Subject uses the imperative mood (\"add\", not \"adding\")\r\n  1. Body wraps at 72 characters\r\n  1. Body explains \"what\" and \"why\", not \"how\"\r\n\r\n### Documentation\r\n\r\n- [x] In case of new functionality, my PR adds documentation that describes how to use it.\r\n  - When adding new operators/hooks/sensors, the autoclass documentation generation needs to be added.\r\n  - All the public functions and the classes in the PR contain docstrings that explain what it does\r\n\r\n### Code Quality\r\n\r\n- [x] Passes `flake8`\r\n","created_at":"2018-12-21T18:42:19Z","updated_at":"2019-01-03T16:21:26Z","closed_at":null,"merged_at":null,"merge_commit_sha":"bc68552b15e3094a6ff946661a3108be5ca7ca0c","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/apache/incubator-airflow/pulls/4354/commits","review_comments_url":"https://api.github.com/repos/apache/incubator-airflow/pulls/4354/comments","review_comment_url":"https://api.github.com/repos/apache/incubator-airflow/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/incubator-airflow/issues/4354/comments","statuses_url":"https://api.github.com/repos/apache/incubator-airflow/statuses/8b7891c0b1f0ba0b6126a29ff69e5e40f6183f97","head":{"label":"PolideaInternal:AIRFLOW-3446-google-cloud-bigtable-operators","ref":"AIRFLOW-3446-google-cloud-bigtable-operators","sha":"8b7891c0b1f0ba0b6126a29ff69e5e40f6183f97","user":{"login":"PolideaInternal","id":31278126,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxMjc4MTI2","avatar_url":"https://avatars2.githubusercontent.com/u/31278126?v=4","gravatar_id":"","url":"https://api.github.com/users/PolideaInternal","html_url":"https://github.com/PolideaInternal","followers_url":"https://api.github.com/users/PolideaInternal/followers","following_url":"https://api.github.com/users/PolideaInternal/following{/other_user}","gists_url":"https://api.github.com/users/PolideaInternal/gists{/gist_id}","starred_url":"https://api.github.com/users/PolideaInternal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PolideaInternal/subscriptions","organizations_url":"https://api.github.com/users/PolideaInternal/orgs","repos_url":"https://api.github.com/users/PolideaInternal/repos","events_url":"https://api.github.com/users/PolideaInternal/events{/privacy}","received_events_url":"https://api.github.com/users/PolideaInternal/received_events","type":"Organization","site_admin":false},"repo":{"id":147329695,"node_id":"MDEwOlJlcG9zaXRvcnkxNDczMjk2OTU=","name":"incubator-airflow","full_name":"PolideaInternal/incubator-airflow","private":false,"owner":{"login":"PolideaInternal","id":31278126,"node_id":"MDEyOk9yZ2FuaXphdGlvbjMxMjc4MTI2","avatar_url":"https://avatars2.githubusercontent.com/u/31278126?v=4","gravatar_id":"","url":"https://api.github.com/users/PolideaInternal","html_url":"https://github.com/PolideaInternal","followers_url":"https://api.github.com/users/PolideaInternal/followers","following_url":"https://api.github.com/users/PolideaInternal/following{/other_user}","gists_url":"https://api.github.com/users/PolideaInternal/gists{/gist_id}","starred_url":"https://api.github.com/users/PolideaInternal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PolideaInternal/subscriptions","organizations_url":"https://api.github.com/users/PolideaInternal/orgs","repos_url":"https://api.github.com/users/PolideaInternal/repos","events_url":"https://api.github.com/users/PolideaInternal/events{/privacy}","received_events_url":"https://api.github.com/users/PolideaInternal/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/PolideaInternal/incubator-airflow","description":"Apache Airflow (Incubating)","fork":true,"url":"https://api.github.com/repos/PolideaInternal/incubator-airflow","forks_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/forks","keys_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/keys{/key_id}","collaborators_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/teams","hooks_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/hooks","issue_events_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/issues/events{/number}","events_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/events","assignees_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/assignees{/user}","branches_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/branches{/branch}","tags_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/tags","blobs_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/git/refs{/sha}","trees_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/git/trees{/sha}","statuses_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/statuses/{sha}","languages_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/languages","stargazers_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/stargazers","contributors_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/contributors","subscribers_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/subscribers","subscription_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/subscription","commits_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/commits{/sha}","git_commits_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/git/commits{/sha}","comments_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/comments{/number}","issue_comment_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/issues/comments{/number}","contents_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/contents/{+path}","compare_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/compare/{base}...{head}","merges_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/merges","archive_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/downloads","issues_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/issues{/number}","pulls_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/pulls{/number}","milestones_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/milestones{/number}","notifications_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/labels{/name}","releases_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/releases{/id}","deployments_url":"https://api.github.com/repos/PolideaInternal/incubator-airflow/deployments","created_at":"2018-09-04T10:35:22Z","updated_at":"2018-12-28T13:59:12Z","pushed_at":"2019-01-03T13:38:28Z","git_url":"git://github.com/PolideaInternal/incubator-airflow.git","ssh_url":"git@github.com:PolideaInternal/incubator-airflow.git","clone_url":"https://github.com/PolideaInternal/incubator-airflow.git","svn_url":"https://github.com/PolideaInternal/incubator-airflow","homepage":"https://airflow.apache.org","size":28405,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":6,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":6,"watchers":1,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"fb52d7b7ca7f08ffdaaa31558eb864aed3fdc9da","user":{"login":"apache","id":47359,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQ3MzU5","avatar_url":"https://avatars0.githubusercontent.com/u/47359?v=4","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":33884891,"node_id":"MDEwOlJlcG9zaXRvcnkzMzg4NDg5MQ==","name":"incubator-airflow","full_name":"apache/incubator-airflow","private":false,"owner":{"login":"apache","id":47359,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQ3MzU5","avatar_url":"https://avatars0.githubusercontent.com/u/47359?v=4","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/apache/incubator-airflow","description":"Apache Airflow (Incubating)","fork":false,"url":"https://api.github.com/repos/apache/incubator-airflow","forks_url":"https://api.github.com/repos/apache/incubator-airflow/forks","keys_url":"https://api.github.com/repos/apache/incubator-airflow/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/incubator-airflow/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/incubator-airflow/teams","hooks_url":"https://api.github.com/repos/apache/incubator-airflow/hooks","issue_events_url":"https://api.github.com/repos/apache/incubator-airflow/issues/events{/number}","events_url":"https://api.github.com/repos/apache/incubator-airflow/events","assignees_url":"https://api.github.com/repos/apache/incubator-airflow/assignees{/user}","branches_url":"https://api.github.com/repos/apache/incubator-airflow/branches{/branch}","tags_url":"https://api.github.com/repos/apache/incubator-airflow/tags","blobs_url":"https://api.github.com/repos/apache/incubator-airflow/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/incubator-airflow/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/incubator-airflow/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/incubator-airflow/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/incubator-airflow/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/incubator-airflow/languages","stargazers_url":"https://api.github.com/repos/apache/incubator-airflow/stargazers","contributors_url":"https://api.github.com/repos/apache/incubator-airflow/contributors","subscribers_url":"https://api.github.com/repos/apache/incubator-airflow/subscribers","subscription_url":"https://api.github.com/repos/apache/incubator-airflow/subscription","commits_url":"https://api.github.com/repos/apache/incubator-airflow/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/incubator-airflow/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/incubator-airflow/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/incubator-airflow/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/incubator-airflow/contents/{+path}","compare_url":"https://api.github.com/repos/apache/incubator-airflow/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/incubator-airflow/merges","archive_url":"https://api.github.com/repos/apache/incubator-airflow/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/incubator-airflow/downloads","issues_url":"https://api.github.com/repos/apache/incubator-airflow/issues{/number}","pulls_url":"https://api.github.com/repos/apache/incubator-airflow/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/incubator-airflow/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/incubator-airflow/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/incubator-airflow/labels{/name}","releases_url":"https://api.github.com/repos/apache/incubator-airflow/releases{/id}","deployments_url":"https://api.github.com/repos/apache/incubator-airflow/deployments","created_at":"2015-04-13T18:04:58Z","updated_at":"2019-01-03T15:30:15Z","pushed_at":"2019-01-03T10:53:32Z","git_url":"git://github.com/apache/incubator-airflow.git","ssh_url":"git@github.com:apache/incubator-airflow.git","clone_url":"https://github.com/apache/incubator-airflow.git","svn_url":"https://github.com/apache/incubator-airflow","homepage":"https://airflow.apache.org","size":29236,"stargazers_count":10432,"watchers_count":10432,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":3665,"mirror_url":null,"archived":false,"open_issues_count":267,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":3665,"open_issues":267,"watchers":10432,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/incubator-airflow/pulls/4354"},"html":{"href":"https://github.com/apache/incubator-airflow/pull/4354"},"issue":{"href":"https://api.github.com/repos/apache/incubator-airflow/issues/4354"},"comments":{"href":"https://api.github.com/repos/apache/incubator-airflow/issues/4354/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/incubator-airflow/pulls/4354/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/incubator-airflow/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/incubator-airflow/pulls/4354/commits"},"statuses":{"href":"https://api.github.com/repos/apache/incubator-airflow/statuses/8b7891c0b1f0ba0b6126a29ff69e5e40f6183f97"}},"author_association":"NONE"}}
{"actor":{"display_login":"potiuk"}}