payload: {"action":"created","comment":{"url":"https://api.github.com/repos/apache/beam/pulls/comments/338202593","pull_request_review_id":306091399,"id":338202593,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDMzODIwMjU5Mw==","diff_hunk":"@@ -0,0 +1,279 @@\n+#\n+# Licensed to the Apache Software Foundation (ASF) under one or more\n+# contributor license agreements.  See the NOTICE file distributed with\n+# this work for additional information regarding copyright ownership.\n+# The ASF licenses this file to You under the Apache License, Version 2.0\n+# (the \"License\"); you may not use this file except in compliance with\n+# 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, 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+\n+\"\"\"Module visualizes PCollection data.\n+\n+For internal use only; no backwards-compatibility guarantees.\n+Only works with Python 3.5+.\n+\"\"\"\n+from __future__ import absolute_import\n+\n+import base64\n+import logging\n+from datetime import timedelta\n+\n+from pandas.io.json import json_normalize\n+\n+from apache_beam import pvalue\n+from apache_beam.runners.interactive import interactive_environment as ie\n+from apache_beam.runners.interactive import pipeline_instrument as instr\n+\n+# jsons doesn't support < Python 3.5. Work around with json for legacy tests.\n+# TODO(BEAM-8288): clean up once Py2 is deprecated from Beam.\n+try:\n+  import jsons\n+  _pv_jsons_load = jsons.load\n+  _pv_jsons_dump = jsons.dump\n+except ImportError:\n+  import json\n+  _pv_jsons_load = json.load","path":"sdks/python/apache_beam/runners/interactive/display/pcoll_visualization.py","position":43,"original_position":43,"commit_id":"4fda8edacab98f694589ea931630cc1c5a0d178c","original_commit_id":"4fda8edacab98f694589ea931630cc1c5a0d178c","user":{"login":"KevinGG","id":4423149,"node_id":"MDQ6VXNlcjQ0MjMxNDk=","avatar_url":"https://avatars1.githubusercontent.com/u/4423149?v=4","gravatar_id":"","url":"https://api.github.com/users/KevinGG","html_url":"https://github.com/KevinGG","followers_url":"https://api.github.com/users/KevinGG/followers","following_url":"https://api.github.com/users/KevinGG/following{/other_user}","gists_url":"https://api.github.com/users/KevinGG/gists{/gist_id}","starred_url":"https://api.github.com/users/KevinGG/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KevinGG/subscriptions","organizations_url":"https://api.github.com/users/KevinGG/orgs","repos_url":"https://api.github.com/users/KevinGG/repos","events_url":"https://api.github.com/users/KevinGG/events{/privacy}","received_events_url":"https://api.github.com/users/KevinGG/received_events","type":"User","site_admin":false},"body":"`json` wouldn't support all the data structure that might come from the user's data.\r\nBut `jsons` and `json` have similar usage and interfaces. So it's a try-best effort to serialize the user's data. We can also simply NOOP if jsons is not available.\r\nHere is the reference _Why not use the standard json library_: https://jsons.readthedocs.io/en/latest/faq.html#why-not-use-the-standard-json-library","created_at":"2019-10-23T18:13:26Z","updated_at":"2019-10-23T18:13:26Z","html_url":"https://github.com/apache/beam/pull/9741#discussion_r338202593","pull_request_url":"https://api.github.com/repos/apache/beam/pulls/9741","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/apache/beam/pulls/comments/338202593"},"html":{"href":"https://github.com/apache/beam/pull/9741#discussion_r338202593"},"pull_request":{"href":"https://api.github.com/repos/apache/beam/pulls/9741"}},"in_reply_to_id":338180259},"pull_request":{"url":"https://api.github.com/repos/apache/beam/pulls/9741","id":325474136,"node_id":"MDExOlB1bGxSZXF1ZXN0MzI1NDc0MTM2","html_url":"https://github.com/apache/beam/pull/9741","diff_url":"https://github.com/apache/beam/pull/9741.diff","patch_url":"https://github.com/apache/beam/pull/9741.patch","issue_url":"https://api.github.com/repos/apache/beam/issues/9741","number":9741,"state":"open","locked":false,"title":"[BEAM-7926] Visualize PCollection","user":{"login":"KevinGG","id":4423149,"node_id":"MDQ6VXNlcjQ0MjMxNDk=","avatar_url":"https://avatars1.githubusercontent.com/u/4423149?v=4","gravatar_id":"","url":"https://api.github.com/users/KevinGG","html_url":"https://github.com/KevinGG","followers_url":"https://api.github.com/users/KevinGG/followers","following_url":"https://api.github.com/users/KevinGG/following{/other_user}","gists_url":"https://api.github.com/users/KevinGG/gists{/gist_id}","starred_url":"https://api.github.com/users/KevinGG/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KevinGG/subscriptions","organizations_url":"https://api.github.com/users/KevinGG/orgs","repos_url":"https://api.github.com/users/KevinGG/repos","events_url":"https://api.github.com/users/KevinGG/events{/privacy}","received_events_url":"https://api.github.com/users/KevinGG/received_events","type":"User","site_admin":false},"body":"1. Added pcoll_visualization module to visualize materialized\r\nPCollection data.\r\n2. A visualization mainly consists of 3 parts: facets-dive,\r\nfacets-overview and data-table.\r\n3. The visualization is always non-blocking w/ 2 modes: one-shot and\r\ndynamic plotting.\r\n4. One-shot visualization renders the visualization as HTML statically.\r\n5. Dynamical plotting polls materialized data, initializes a\r\nvisualization and then updates the visualization continuously.\r\n6. It's the pipeline state, i.e., whether the PCollection\r\nmaterialization is being updated that decides if the visualization is\r\ndynamic plotting or one-shot. It's not the boundedness of PCollection\r\nthat decides the visualization mode. However, when engineering for\r\nInteractive Beam, it's alright to always use the dynamic plotting\r\nmode as long as the InteractiveRunner(s) manages jobs and tracks the\r\npipeline(job) results correctly. Failing to terminate a visualization\r\njob might cause resource leak.\r\n7. The materialized PCollection data goes through the following process\r\nflow: cache -> element list -> normalization -> dataframe ->\r\nHTMLs/scripts.\r\n8. A visualization is always self-contained. Meaning it controls when\r\nthe visualization starts and ends by itself. Once visualized, the\r\nvisualization is anchored within the notebook cell's output area. Code\r\nin other cells can affect the visualization in the cell but will not\r\nchange the existing visualization's position in the notebook. Multiple\r\nvisualize(pcoll) calls will render multiple independent distinct\r\nvisualization instances/jobs. Each visualization runs in its own thread\r\noutside of the notebook main thread.\r\n9. Unittest added focusing on the above visualization logic other than\r\nthe visualization UI (those should belong to Facets, pandas and jQuery,\r\nwe'll trust them work as intended). Integration tests can be added\r\nlater.\r\n10. Each visualization job regularly queries interactive environment for\r\nrunning pipeline(job) results implicitly to determine the default\r\nvisualization end condition. It's based on the limitation that within\r\ncurrent interactive environment, at a time, at most one job is in\r\nnon-terminated state for an end user defined pipeline instance (in\r\nwhatever state). The end user could also use the handle returned by\r\nvisualize() to stop() the visualization job manually.\r\n11. Added INTERACTIVE_BEAM extras_require and tests_require in setup.\r\nThey are only needed for data visualization in notebook. `jsons` is for\r\neasy serialization of any object and `timeloop` is for self-contained\r\nperiodic async tasks. They both use MIT licenses. `facets-overview` is\r\nfor overview part of facets. It uses apache 2.0 license. `ipython` is the\r\nkernel used by jupyter, included for non-jupyter environment though it\r\nalways comes with jupyter. It uses BSD license. The lower version limit\r\nset is the highest version listed by flink.\r\n------------------------\r\n\r\nThank you for your contribution! Follow this checklist to help us incorporate your contribution quickly and easily:\r\n\r\n - [x] [**Choose reviewer(s)**](https://beam.apache.org/contribute/#make-your-change) and mention them in a comment (`R: @username`).\r\n - [x] Format the pull request title like `[BEAM-XXX] Fixes bug in ApproximateQuantiles`, where you replace `BEAM-XXX` with the appropriate JIRA issue, if applicable. This will automatically link the pull request to the issue.\r\n - [x] If this contribution is large, please file an Apache [Individual Contributor License Agreement](https://www.apache.org/licenses/icla.pdf).\r\n\r\nPost-Commit Tests Status (on master branch)\r\n------------------------------------------------------------------------------------------------\r\n\r\nLang | SDK | Apex | Dataflow | Flink | Gearpump | Samza | Spark\r\n--- | --- | --- | --- | --- | --- | --- | ---\r\nGo | [![Build Status](https://builds.apache.org/job/beam_PostCommit_Go/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Go/lastCompletedBuild/) | --- | --- | [![Build Status](https://builds.apache.org/job/beam_PostCommit_Go_VR_Flink/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Go_VR_Flink/lastCompletedBuild/) | --- | --- | [![Build Status](https://builds.apache.org/job/beam_PostCommit_Go_VR_Spark/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Go_VR_Spark/lastCompletedBuild/)\r\nJava | [![Build Status](https://builds.apache.org/job/beam_PostCommit_Java/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Java/lastCompletedBuild/) | [![Build Status](https://builds.apache.org/job/beam_PostCommit_Java_ValidatesRunner_Apex/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Java_ValidatesRunner_Apex/lastCompletedBuild/) | [![Build Status](https://builds.apache.org/job/beam_PostCommit_Java_ValidatesRunner_Dataflow/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Java_ValidatesRunner_Dataflow/lastCompletedBuild/) | [![Build Status](https://builds.apache.org/job/beam_PostCommit_Java_ValidatesRunner_Flink/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Java_ValidatesRunner_Flink/lastCompletedBuild/)<br>[![Build Status](https://builds.apache.org/job/beam_PostCommit_Java_PVR_Flink_Batch/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Java_PVR_Flink_Batch/lastCompletedBuild/)<br>[![Build Status](https://builds.apache.org/job/beam_PostCommit_Java_PVR_Flink_Streaming/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Java_PVR_Flink_Streaming/lastCompletedBuild/) | [![Build Status](https://builds.apache.org/job/beam_PostCommit_Java_ValidatesRunner_Gearpump/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Java_ValidatesRunner_Gearpump/lastCompletedBuild/) | [![Build Status](https://builds.apache.org/job/beam_PostCommit_Java_ValidatesRunner_Samza/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Java_ValidatesRunner_Samza/lastCompletedBuild/) | [![Build Status](https://builds.apache.org/job/beam_PostCommit_Java_ValidatesRunner_Spark/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Java_ValidatesRunner_Spark/lastCompletedBuild/)<br>[![Build Status](https://builds.apache.org/job/beam_PostCommit_Java_PVR_Spark_Batch/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Java_PVR_Spark_Batch/lastCompletedBuild/)\r\nPython | [![Build Status](https://builds.apache.org/job/beam_PostCommit_Python2/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Python2/lastCompletedBuild/)<br>[![Build Status](https://builds.apache.org/job/beam_PostCommit_Python35/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Python35/lastCompletedBuild/)<br>[![Build Status](https://builds.apache.org/job/beam_PostCommit_Python36/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Python36/lastCompletedBuild/)<br>[![Build Status](https://builds.apache.org/job/beam_PostCommit_Python37/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Python37/lastCompletedBuild/) | --- | [![Build Status](https://builds.apache.org/job/beam_PostCommit_Py_VR_Dataflow/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Py_VR_Dataflow/lastCompletedBuild/)<br>[![Build Status](https://builds.apache.org/job/beam_PostCommit_Py_ValCont/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Py_ValCont/lastCompletedBuild/) | [![Build Status](https://builds.apache.org/job/beam_PreCommit_Python2_PVR_Flink_Cron/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PreCommit_Python2_PVR_Flink_Cron/lastCompletedBuild/)<br>[![Build Status](https://builds.apache.org/job/beam_PostCommit_Python35_VR_Flink/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Python35_VR_Flink/lastCompletedBuild/) | --- | --- | [![Build Status](https://builds.apache.org/job/beam_PostCommit_Python_VR_Spark/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_Python_VR_Spark/lastCompletedBuild/)\r\nXLang | --- | --- | --- | [![Build Status](https://builds.apache.org/job/beam_PostCommit_XVR_Flink/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PostCommit_XVR_Flink/lastCompletedBuild/) | --- | --- | ---\r\n\r\nPre-Commit Tests Status (on master branch)\r\n------------------------------------------------------------------------------------------------\r\n\r\n--- |Java | Python | Go | Website\r\n--- | --- | --- | --- | ---\r\nNon-portable | [![Build Status](https://builds.apache.org/job/beam_PreCommit_Java_Cron/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PreCommit_Java_Cron/lastCompletedBuild/) | [![Build Status](https://builds.apache.org/job/beam_PreCommit_Python_Cron/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PreCommit_Python_Cron/lastCompletedBuild/)<br>[![Build Status](https://builds.apache.org/job/beam_PreCommit_PythonLint_Cron/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PreCommit_PythonLint_Cron/lastCompletedBuild/) | [![Build Status](https://builds.apache.org/job/beam_PreCommit_Go_Cron/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PreCommit_Go_Cron/lastCompletedBuild/) | [![Build Status](https://builds.apache.org/job/beam_PreCommit_Website_Cron/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PreCommit_Website_Cron/lastCompletedBuild/) \r\nPortable | --- | [![Build Status](https://builds.apache.org/job/beam_PreCommit_Portable_Python_Cron/lastCompletedBuild/badge/icon)](https://builds.apache.org/job/beam_PreCommit_Portable_Python_Cron/lastCompletedBuild/) | --- | ---\r\n\r\nSee [.test-infra/jenkins/README](https://github.com/apache/beam/blob/master/.test-infra/jenkins/README.md) for trigger phrase, status and link of all Jenkins jobs.\r\n","created_at":"2019-10-07T20:13:23Z","updated_at":"2019-10-23T18:13:26Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4f5d0312054e78e3bb8c95f21a94070e394aa8e7","assignee":null,"assignees":[],"requested_reviewers":[{"login":"pabloem","id":1301740,"node_id":"MDQ6VXNlcjEzMDE3NDA=","avatar_url":"https://avatars2.githubusercontent.com/u/1301740?v=4","gravatar_id":"","url":"https://api.github.com/users/pabloem","html_url":"https://github.com/pabloem","followers_url":"https://api.github.com/users/pabloem/followers","following_url":"https://api.github.com/users/pabloem/following{/other_user}","gists_url":"https://api.github.com/users/pabloem/gists{/gist_id}","starred_url":"https://api.github.com/users/pabloem/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pabloem/subscriptions","organizations_url":"https://api.github.com/users/pabloem/orgs","repos_url":"https://api.github.com/users/pabloem/repos","events_url":"https://api.github.com/users/pabloem/events{/privacy}","received_events_url":"https://api.github.com/users/pabloem/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/apache/beam/pulls/9741/commits","review_comments_url":"https://api.github.com/repos/apache/beam/pulls/9741/comments","review_comment_url":"https://api.github.com/repos/apache/beam/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/beam/issues/9741/comments","statuses_url":"https://api.github.com/repos/apache/beam/statuses/4fda8edacab98f694589ea931630cc1c5a0d178c","head":{"label":"KevinGG:BEAM-7926","ref":"BEAM-7926","sha":"4fda8edacab98f694589ea931630cc1c5a0d178c","user":{"login":"KevinGG","id":4423149,"node_id":"MDQ6VXNlcjQ0MjMxNDk=","avatar_url":"https://avatars1.githubusercontent.com/u/4423149?v=4","gravatar_id":"","url":"https://api.github.com/users/KevinGG","html_url":"https://github.com/KevinGG","followers_url":"https://api.github.com/users/KevinGG/followers","following_url":"https://api.github.com/users/KevinGG/following{/other_user}","gists_url":"https://api.github.com/users/KevinGG/gists{/gist_id}","starred_url":"https://api.github.com/users/KevinGG/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KevinGG/subscriptions","organizations_url":"https://api.github.com/users/KevinGG/orgs","repos_url":"https://api.github.com/users/KevinGG/repos","events_url":"https://api.github.com/users/KevinGG/events{/privacy}","received_events_url":"https://api.github.com/users/KevinGG/received_events","type":"User","site_admin":false},"repo":{"id":196257176,"node_id":"MDEwOlJlcG9zaXRvcnkxOTYyNTcxNzY=","name":"beam","full_name":"KevinGG/beam","private":false,"owner":{"login":"KevinGG","id":4423149,"node_id":"MDQ6VXNlcjQ0MjMxNDk=","avatar_url":"https://avatars1.githubusercontent.com/u/4423149?v=4","gravatar_id":"","url":"https://api.github.com/users/KevinGG","html_url":"https://github.com/KevinGG","followers_url":"https://api.github.com/users/KevinGG/followers","following_url":"https://api.github.com/users/KevinGG/following{/other_user}","gists_url":"https://api.github.com/users/KevinGG/gists{/gist_id}","starred_url":"https://api.github.com/users/KevinGG/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KevinGG/subscriptions","organizations_url":"https://api.github.com/users/KevinGG/orgs","repos_url":"https://api.github.com/users/KevinGG/repos","events_url":"https://api.github.com/users/KevinGG/events{/privacy}","received_events_url":"https://api.github.com/users/KevinGG/received_events","type":"User","site_admin":false},"html_url":"https://github.com/KevinGG/beam","description":"Apache Beam","fork":true,"url":"https://api.github.com/repos/KevinGG/beam","forks_url":"https://api.github.com/repos/KevinGG/beam/forks","keys_url":"https://api.github.com/repos/KevinGG/beam/keys{/key_id}","collaborators_url":"https://api.github.com/repos/KevinGG/beam/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/KevinGG/beam/teams","hooks_url":"https://api.github.com/repos/KevinGG/beam/hooks","issue_events_url":"https://api.github.com/repos/KevinGG/beam/issues/events{/number}","events_url":"https://api.github.com/repos/KevinGG/beam/events","assignees_url":"https://api.github.com/repos/KevinGG/beam/assignees{/user}","branches_url":"https://api.github.com/repos/KevinGG/beam/branches{/branch}","tags_url":"https://api.github.com/repos/KevinGG/beam/tags","blobs_url":"https://api.github.com/repos/KevinGG/beam/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/KevinGG/beam/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/KevinGG/beam/git/refs{/sha}","trees_url":"https://api.github.com/repos/KevinGG/beam/git/trees{/sha}","statuses_url":"https://api.github.com/repos/KevinGG/beam/statuses/{sha}","languages_url":"https://api.github.com/repos/KevinGG/beam/languages","stargazers_url":"https://api.github.com/repos/KevinGG/beam/stargazers","contributors_url":"https://api.github.com/repos/KevinGG/beam/contributors","subscribers_url":"https://api.github.com/repos/KevinGG/beam/subscribers","subscription_url":"https://api.github.com/repos/KevinGG/beam/subscription","commits_url":"https://api.github.com/repos/KevinGG/beam/commits{/sha}","git_commits_url":"https://api.github.com/repos/KevinGG/beam/git/commits{/sha}","comments_url":"https://api.github.com/repos/KevinGG/beam/comments{/number}","issue_comment_url":"https://api.github.com/repos/KevinGG/beam/issues/comments{/number}","contents_url":"https://api.github.com/repos/KevinGG/beam/contents/{+path}","compare_url":"https://api.github.com/repos/KevinGG/beam/compare/{base}...{head}","merges_url":"https://api.github.com/repos/KevinGG/beam/merges","archive_url":"https://api.github.com/repos/KevinGG/beam/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/KevinGG/beam/downloads","issues_url":"https://api.github.com/repos/KevinGG/beam/issues{/number}","pulls_url":"https://api.github.com/repos/KevinGG/beam/pulls{/number}","milestones_url":"https://api.github.com/repos/KevinGG/beam/milestones{/number}","notifications_url":"https://api.github.com/repos/KevinGG/beam/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/KevinGG/beam/labels{/name}","releases_url":"https://api.github.com/repos/KevinGG/beam/releases{/id}","deployments_url":"https://api.github.com/repos/KevinGG/beam/deployments","created_at":"2019-07-10T18:35:51Z","updated_at":"2019-10-18T22:43:35Z","pushed_at":"2019-10-23T18:03:52Z","git_url":"git://github.com/KevinGG/beam.git","ssh_url":"git@github.com:KevinGG/beam.git","clone_url":"https://github.com/KevinGG/beam.git","svn_url":"https://github.com/KevinGG/beam","homepage":"https://beam.apache.org","size":146071,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":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","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"b3e55a3798f64d1a7c42473c9e6568b99d8e95c6","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":50904245,"node_id":"MDEwOlJlcG9zaXRvcnk1MDkwNDI0NQ==","name":"beam","full_name":"apache/beam","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/beam","description":"Apache Beam","fork":false,"url":"https://api.github.com/repos/apache/beam","forks_url":"https://api.github.com/repos/apache/beam/forks","keys_url":"https://api.github.com/repos/apache/beam/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/beam/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/beam/teams","hooks_url":"https://api.github.com/repos/apache/beam/hooks","issue_events_url":"https://api.github.com/repos/apache/beam/issues/events{/number}","events_url":"https://api.github.com/repos/apache/beam/events","assignees_url":"https://api.github.com/repos/apache/beam/assignees{/user}","branches_url":"https://api.github.com/repos/apache/beam/branches{/branch}","tags_url":"https://api.github.com/repos/apache/beam/tags","blobs_url":"https://api.github.com/repos/apache/beam/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/beam/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/beam/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/beam/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/beam/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/beam/languages","stargazers_url":"https://api.github.com/repos/apache/beam/stargazers","contributors_url":"https://api.github.com/repos/apache/beam/contributors","subscribers_url":"https://api.github.com/repos/apache/beam/subscribers","subscription_url":"https://api.github.com/repos/apache/beam/subscription","commits_url":"https://api.github.com/repos/apache/beam/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/beam/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/beam/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/beam/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/beam/contents/{+path}","compare_url":"https://api.github.com/repos/apache/beam/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/beam/merges","archive_url":"https://api.github.com/repos/apache/beam/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/beam/downloads","issues_url":"https://api.github.com/repos/apache/beam/issues{/number}","pulls_url":"https://api.github.com/repos/apache/beam/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/beam/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/beam/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/beam/labels{/name}","releases_url":"https://api.github.com/repos/apache/beam/releases{/id}","deployments_url":"https://api.github.com/repos/apache/beam/deployments","created_at":"2016-02-02T08:00:06Z","updated_at":"2019-10-23T15:46:55Z","pushed_at":"2019-10-23T18:03:56Z","git_url":"git://github.com/apache/beam.git","ssh_url":"git@github.com:apache/beam.git","clone_url":"https://github.com/apache/beam.git","svn_url":"https://github.com/apache/beam","homepage":"https://beam.apache.org","size":135997,"stargazers_count":3428,"watchers_count":3428,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":2116,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":122,"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":2116,"open_issues":122,"watchers":3428,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/beam/pulls/9741"},"html":{"href":"https://github.com/apache/beam/pull/9741"},"issue":{"href":"https://api.github.com/repos/apache/beam/issues/9741"},"comments":{"href":"https://api.github.com/repos/apache/beam/issues/9741/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/beam/pulls/9741/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/beam/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/beam/pulls/9741/commits"},"statuses":{"href":"https://api.github.com/repos/apache/beam/statuses/4fda8edacab98f694589ea931630cc1c5a0d178c"}},"author_association":"CONTRIBUTOR"}}
other: {"actor":{"display_login":"KevinGG"}}