{"action":"created","comment":{"url":"https://api.github.com/repos/rtfd/readthedocs.org/pulls/comments/210371489","pull_request_review_id":146554344,"id":210371489,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxMDM3MTQ4OQ==","diff_hunk":"@@ -199,23 +211,582 @@ def test_conda(self, load_config):\n             }\n         })\n         config = load_yaml_config(self.version)\n-        self.assertEqual(config.use_conda, True)\n-        self.assertTrue(config.conda_file[-len(to_find):] == to_find)\n+        self.assertTrue(config.conda is not None)\n+        self.assertTrue(config.conda.environment[-len(to_find):] == to_find)\n \n         load_config.side_effect = create_load()\n         config = load_yaml_config(self.version)\n-        self.assertEqual(config.use_conda, False)\n-        self.assertEqual(config.conda_file, None)\n+        self.assertIsNone(config.conda)\n \n     def test_requirements_file(self, load_config):\n         requirements_file = '__init__.py'\n         load_config.side_effect = create_load({\n             'requirements_file': requirements_file\n         })\n         config = load_yaml_config(self.version)\n-        self.assertEqual(config.requirements_file, requirements_file)\n+        self.assertEqual(config.python.requirements, requirements_file)\n \n         # Respects the requirements file from the project settings\n         load_config.side_effect = create_load()\n         config = load_yaml_config(self.version)\n-        self.assertEqual(config.requirements_file, '__init__.py')\n+        self.assertEqual(config.python.requirements, '__init__.py')\n+\n+\n+@pytest.mark.skip\n+@pytest.mark.django_db\n+@mock.patch('readthedocs.projects.models.Project.checkout_path')\n+class TestLoadConfigV2(object):\n+\n+    @pytest.fixture(autouse=True)\n+    def create_project(self):\n+        self.project = get(\n+            Project,\n+            main_language_project=None,\n+            install_project=False,\n+            container_image=None,\n+        )\n+        self.version = get(Version, project=self.project)\n+        # TODO: Remove later\n+        get(\n+            Feature,\n+            projects=[self.project],\n+            feature_id=Feature.ALLOW_V2_CONFIG_FILE,\n+        )\n+\n+    def create_config_file(self, tmpdir, config):\n+        base_path = apply_fs(tmpdir, {\n+            'readthedocs.yml': '',\n+        })\n+        config.setdefault('version', 2)\n+        config_file = path.join(str(base_path), 'readthedocs.yml')\n+        yaml.safe_dump(config, open(config_file, 'w'))\n+        return base_path\n+\n+    def get_update_docs_task(self):\n+        build_env = LocalBuildEnvironment(\n+            self.project, self.version, record=False\n+        )\n+\n+        update_docs = tasks.UpdateDocsTaskStep(\n+            build_env=build_env,\n+            config=load_yaml_config(self.version),\n+            project=self.project,\n+            version=self.version,\n+        )\n+        return update_docs\n+\n+    def test_using_v2(self, checkout_path, tmpdir):\n+        checkout_path.return_value = str(tmpdir)\n+        self.create_config_file(tmpdir, {})\n+        update_docs = self.get_update_docs_task()\n+        assert update_docs.config.version == '2'\n+\n+    def test_report_using_invalid_version(self, checkout_path, tmpdir):\n+        checkout_path.return_value = str(tmpdir)\n+        self.create_config_file(tmpdir, {'version': 12})\n+        with pytest.raises(InvalidConfig) as exinfo:\n+            self.get_update_docs_task()\n+        assert exinfo.value.key == 'version'\n+\n+    @pytest.mark.parametrize('config', [{}, {'formats': []}])\n+    @patch('readthedocs.projects.models.Project.repo_nonblockinglock', new=MagicMock())\n+    @patch('readthedocs.doc_builder.backends.sphinx.SearchBuilder.build')\n+    @patch('readthedocs.doc_builder.backends.sphinx.HtmlBuilder.build')\n+    @patch('readthedocs.doc_builder.backends.sphinx.HtmlBuilder.append_conf')\n+    def test_build_formats_default_empty(\n+            self, append_conf, html_build, search_build,\n+            checkout_path, config, tmpdir):\n+        \"\"\"\n+        The default value for formats is [], which means no extra\n+        formats are build.\n+        \"\"\"\n+        checkout_path.return_value = str(tmpdir)\n+        self.create_config_file(tmpdir, config)\n+\n+        update_docs = self.get_update_docs_task()\n+        outcomes = update_docs.build_docs()\n+\n+        # No extra formats were triggered\n+        assert outcomes['html']\n+        assert outcomes['search']\n+        assert not outcomes['localmedia']\n+        assert not outcomes['pdf']\n+        assert not outcomes['epub']\n+\n+    @patch('readthedocs.projects.models.Project.repo_nonblockinglock', new=MagicMock())\n+    @patch('readthedocs.projects.tasks.UpdateDocsTaskStep.build_docs_class')\n+    @patch('readthedocs.doc_builder.backends.sphinx.SearchBuilder.build')\n+    @patch('readthedocs.doc_builder.backends.sphinx.HtmlBuilder.build')\n+    @patch('readthedocs.doc_builder.backends.sphinx.HtmlBuilder.append_conf')\n+    def test_build_formats_only_pdf(\n+            self, append_conf, html_build, search_build, build_docs_class,\n+            checkout_path, tmpdir):\n+        \"\"\"\n+        Only the pdf format is build.\n+        \"\"\"\n+        checkout_path.return_value = str(tmpdir)\n+        self.create_config_file(tmpdir, {'formats': ['pdf']})\n+\n+        update_docs = self.get_update_docs_task()\n+        outcomes = update_docs.build_docs()\n+\n+        # Only pdf extra format was triggered\n+        assert outcomes['html']\n+        assert outcomes['search']\n+        build_docs_class.assert_called_with('sphinx_pdf')\n+        assert outcomes['pdf']\n+        assert not outcomes['localmedia']\n+        assert not outcomes['epub']\n+\n+    @patch('readthedocs.projects.tasks.UpdateDocsTaskStep.update_documentation_type', new=MagicMock())\n+    @patch('readthedocs.projects.tasks.UpdateDocsTaskStep.setup_python_environment', new=MagicMock())\n+    @patch('readthedocs.projects.tasks.UpdateDocsTaskStep.build_docs', new=MagicMock())\n+    @patch('readthedocs.doc_builder.environments.BuildEnvironment.failed', new_callable=PropertyMock)\n+    def test_conda_environment(self, build_failed, checkout_path, tmpdir):\n+        build_failed.return_value = False\n+        checkout_path.return_value = str(tmpdir)\n+        conda_file = 'environmemt.yml'\n+        apply_fs(tmpdir, {conda_file: ''})\n+        base_path = self.create_config_file(\n+            tmpdir,\n+            {\n+                'conda': {'environment': conda_file}\n+            }\n+        )\n+\n+        update_docs = self.get_update_docs_task()\n+        update_docs.run_build(docker=False, record=False)\n+\n+        conda_file = path.join(str(base_path), conda_file)\n+        assert update_docs.config.conda.environment == conda_file\n+        assert isinstance(update_docs.python_env, Conda)\n+\n+    def test_default_build_image(self, checkout_path, tmpdir):\n+        checkout_path.return_value = str(tmpdir)\n+        build_image = 'readthedocs/build:latest'\n+        self.create_config_file(tmpdir, {})\n+        update_docs = self.get_update_docs_task()\n+        assert update_docs.config.build.image == build_image\n+\n+    def test_build_image(self, checkout_path, tmpdir):\n+        checkout_path.return_value = str(tmpdir)\n+        build_image = 'readthedocs/build:stable'\n+        self.create_config_file(\n+            tmpdir,\n+            {'build': {'image': 'stable'}},\n+        )\n+        update_docs = self.get_update_docs_task()\n+        assert update_docs.config.build.image == build_image\n+\n+    def test_custom_build_image(self, checkout_path, tmpdir):\n+        checkout_path.return_value = str(tmpdir)\n+\n+        build_image = 'readthedocs/build:3.0'\n+        self.project.container_image = build_image\n+        self.project.save()\n+\n+        self.create_config_file(tmpdir, {})\n+        update_docs = self.get_update_docs_task()\n+        assert update_docs.config.build.image == build_image\n+\n+    def test_python_version(self, checkout_path, tmpdir):\n+        checkout_path.return_value = str(tmpdir)\n+        self.create_config_file(tmpdir, {})\n+        # The default version is always 3\n+        self.project.python_interpreter = 'python2'\n+        self.project.save()\n+\n+        config = self.get_update_docs_task().config\n+        assert config.python.version == 3\n+        assert config.python_full_version == 3.6\n+\n+    @patch('readthedocs.doc_builder.environments.BuildEnvironment.run')\n+    def test_python_requirements(self, run, checkout_path, tmpdir):\n+        checkout_path.return_value = str(tmpdir)\n+        requirements_file = 'requirements.txt'\n+        apply_fs(tmpdir, {requirements_file: ''})\n+        base_path = self.create_config_file(\n+            tmpdir,\n+            {\n+                'python': {'requirements': requirements_file}\n+            }\n+        )\n+\n+        update_docs = self.get_update_docs_task()\n+        config = update_docs.config\n+\n+        python_env = Virtualenv(\n+            version=self.version,\n+            build_env=update_docs.build_env,\n+            config=config\n+        )\n+        update_docs.python_env = python_env\n+        update_docs.python_env.install_user_requirements()\n+\n+        args, kwargs = run.call_args\n+        requirements_file = path.join(str(base_path), requirements_file)\n+\n+        assert config.python.requirements == requirements_file\n+        assert requirements_file in args\n+\n+    @patch('readthedocs.doc_builder.environments.BuildEnvironment.run')\n+    def test_python_requirements_empty(self, run, checkout_path, tmpdir):\n+        checkout_path.return_value = str(tmpdir)\n+        self.create_config_file(\n+            tmpdir,\n+            {\n+                'python': {'requirements': ''}\n+            }\n+        )\n+\n+        update_docs = self.get_update_docs_task()\n+        config = update_docs.config\n+\n+        python_env = Virtualenv(\n+            version=self.version,\n+            build_env=update_docs.build_env,\n+            config=config\n+        )\n+        update_docs.python_env = python_env\n+        update_docs.python_env.install_user_requirements()\n+\n+        assert config.python.requirements == ''\n+        assert not run.called\n+\n+    @patch('readthedocs.doc_builder.environments.BuildEnvironment.run')\n+    def test_python_install_setup(self, run, checkout_path, tmpdir):\n+        checkout_path.return_value = str(tmpdir)\n+        self.create_config_file(\n+            tmpdir,\n+            {\n+                'python': {'install': 'setup.py'}\n+            }\n+        )\n+\n+        update_docs = self.get_update_docs_task()\n+        config = update_docs.config\n+\n+        python_env = Virtualenv(\n+            version=self.version,\n+            build_env=update_docs.build_env,\n+            config=config\n+        )\n+        update_docs.python_env = python_env\n+        update_docs.python_env.install_package()\n+\n+        args, kwargs = run.call_args\n+\n+        assert 'setup.py' in args\n+        assert 'install' in args\n+        assert config.python.install_with_setup\n+        assert not config.python.install_with_pip\n+\n+    @patch('readthedocs.doc_builder.environments.BuildEnvironment.run')\n+    def test_python_install_pip(self, run, checkout_path, tmpdir):\n+        checkout_path.return_value = str(tmpdir)\n+        self.create_config_file(\n+            tmpdir,\n+            {\n+                'python': {'install': 'pip'}\n+            }\n+        )\n+\n+        update_docs = self.get_update_docs_task()\n+        config = update_docs.config\n+\n+        python_env = Virtualenv(\n+            version=self.version,\n+            build_env=update_docs.build_env,\n+            config=config\n+        )\n+        update_docs.python_env = python_env\n+        update_docs.python_env.install_package()\n+\n+        args, kwargs = run.call_args\n+\n+        assert 'setup.py' not in args\n+        assert 'install' in args","path":"readthedocs/rtd_tests/tests/test_config_integration.py","position":416,"original_position":416,"commit_id":"564b9666209c52f70c7e89f2dc5bead273e201b6","original_commit_id":"564b9666209c52f70c7e89f2dc5bead273e201b6","user":{"login":"humitos","id":244656,"node_id":"MDQ6VXNlcjI0NDY1Ng==","avatar_url":"https://avatars1.githubusercontent.com/u/244656?v=4","gravatar_id":"","url":"https://api.github.com/users/humitos","html_url":"https://github.com/humitos","followers_url":"https://api.github.com/users/humitos/followers","following_url":"https://api.github.com/users/humitos/following{/other_user}","gists_url":"https://api.github.com/users/humitos/gists{/gist_id}","starred_url":"https://api.github.com/users/humitos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/humitos/subscriptions","organizations_url":"https://api.github.com/users/humitos/orgs","repos_url":"https://api.github.com/users/humitos/repos","events_url":"https://api.github.com/users/humitos/events{/privacy}","received_events_url":"https://api.github.com/users/humitos/received_events","type":"User","site_admin":false},"body":"Same","created_at":"2018-08-15T18:53:12Z","updated_at":"2018-08-15T18:56:34Z","html_url":"https://github.com/rtfd/readthedocs.org/pull/4456#discussion_r210371489","pull_request_url":"https://api.github.com/repos/rtfd/readthedocs.org/pulls/4456","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/rtfd/readthedocs.org/pulls/comments/210371489"},"html":{"href":"https://github.com/rtfd/readthedocs.org/pull/4456#discussion_r210371489"},"pull_request":{"href":"https://api.github.com/repos/rtfd/readthedocs.org/pulls/4456"}}},"pull_request":{"url":"https://api.github.com/repos/rtfd/readthedocs.org/pulls/4456","id":205275023,"node_id":"MDExOlB1bGxSZXF1ZXN0MjA1Mjc1MDIz","html_url":"https://github.com/rtfd/readthedocs.org/pull/4456","diff_url":"https://github.com/rtfd/readthedocs.org/pull/4456.diff","patch_url":"https://github.com/rtfd/readthedocs.org/pull/4456.patch","issue_url":"https://api.github.com/repos/rtfd/readthedocs.org/issues/4456","number":4456,"state":"open","locked":false,"title":"Match v1 config interface to new one","user":{"login":"stsewd","id":4975310,"node_id":"MDQ6VXNlcjQ5NzUzMTA=","avatar_url":"https://avatars2.githubusercontent.com/u/4975310?v=4","gravatar_id":"","url":"https://api.github.com/users/stsewd","html_url":"https://github.com/stsewd","followers_url":"https://api.github.com/users/stsewd/followers","following_url":"https://api.github.com/users/stsewd/following{/other_user}","gists_url":"https://api.github.com/users/stsewd/gists{/gist_id}","starred_url":"https://api.github.com/users/stsewd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stsewd/subscriptions","organizations_url":"https://api.github.com/users/stsewd/orgs","repos_url":"https://api.github.com/users/stsewd/repos","events_url":"https://api.github.com/users/stsewd/events{/privacy}","received_events_url":"https://api.github.com/users/stsewd/received_events","type":"User","site_admin":false},"body":"This PR is based on https://github.com/rtfd/readthedocs.org/pull/4355 and should be merged after that.\r\n\r\nThis will implement the actual logic of v2 and use the same nametuples for v1.\r\n\r\nNew changes are from ed1ac25a959eadb38e206e47557a1cdb8145ba1d\r\n\r\nI'm using pytest flavor for the tests.\r\n\r\nCloses #4220","created_at":"2018-08-01T00:05:07Z","updated_at":"2018-08-15T18:56:33Z","closed_at":null,"merged_at":null,"merge_commit_sha":"92b4b4d505bd04e5030325ccd03fd64efb583627","assignee":null,"assignees":[],"requested_reviewers":[{"login":"agjohnson","id":1140183,"node_id":"MDQ6VXNlcjExNDAxODM=","avatar_url":"https://avatars0.githubusercontent.com/u/1140183?v=4","gravatar_id":"","url":"https://api.github.com/users/agjohnson","html_url":"https://github.com/agjohnson","followers_url":"https://api.github.com/users/agjohnson/followers","following_url":"https://api.github.com/users/agjohnson/following{/other_user}","gists_url":"https://api.github.com/users/agjohnson/gists{/gist_id}","starred_url":"https://api.github.com/users/agjohnson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/agjohnson/subscriptions","organizations_url":"https://api.github.com/users/agjohnson/orgs","repos_url":"https://api.github.com/users/agjohnson/repos","events_url":"https://api.github.com/users/agjohnson/events{/privacy}","received_events_url":"https://api.github.com/users/agjohnson/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":{"url":"https://api.github.com/repos/rtfd/readthedocs.org/milestones/28","html_url":"https://github.com/rtfd/readthedocs.org/milestone/28","labels_url":"https://api.github.com/repos/rtfd/readthedocs.org/milestones/28/labels","id":2993389,"node_id":"MDk6TWlsZXN0b25lMjk5MzM4OQ==","number":28,"title":"YAML File Completion","description":"We should be able to express all build options in the YAML file. Once this is done, we can then deprecate the database for build settings for projects with a YAML file. Steps:\r\n\r\n* Add all build options to YAML file\r\n* Add state to Project that a YAML file is in use\r\n* Disable build options in web UI for Projects with YAML file\r\n ","creator":{"login":"ericholscher","id":25510,"node_id":"MDQ6VXNlcjI1NTEw","avatar_url":"https://avatars2.githubusercontent.com/u/25510?v=4","gravatar_id":"","url":"https://api.github.com/users/ericholscher","html_url":"https://github.com/ericholscher","followers_url":"https://api.github.com/users/ericholscher/followers","following_url":"https://api.github.com/users/ericholscher/following{/other_user}","gists_url":"https://api.github.com/users/ericholscher/gists{/gist_id}","starred_url":"https://api.github.com/users/ericholscher/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ericholscher/subscriptions","organizations_url":"https://api.github.com/users/ericholscher/orgs","repos_url":"https://api.github.com/users/ericholscher/repos","events_url":"https://api.github.com/users/ericholscher/events{/privacy}","received_events_url":"https://api.github.com/users/ericholscher/received_events","type":"User","site_admin":false},"open_issues":17,"closed_issues":10,"state":"open","created_at":"2017-12-21T16:58:00Z","updated_at":"2018-08-03T02:50:48Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/rtfd/readthedocs.org/pulls/4456/commits","review_comments_url":"https://api.github.com/repos/rtfd/readthedocs.org/pulls/4456/comments","review_comment_url":"https://api.github.com/repos/rtfd/readthedocs.org/pulls/comments{/number}","comments_url":"https://api.github.com/repos/rtfd/readthedocs.org/issues/4456/comments","statuses_url":"https://api.github.com/repos/rtfd/readthedocs.org/statuses/564b9666209c52f70c7e89f2dc5bead273e201b6","head":{"label":"stsewd:build-config-v2-implementation","ref":"build-config-v2-implementation","sha":"564b9666209c52f70c7e89f2dc5bead273e201b6","user":{"login":"stsewd","id":4975310,"node_id":"MDQ6VXNlcjQ5NzUzMTA=","avatar_url":"https://avatars2.githubusercontent.com/u/4975310?v=4","gravatar_id":"","url":"https://api.github.com/users/stsewd","html_url":"https://github.com/stsewd","followers_url":"https://api.github.com/users/stsewd/followers","following_url":"https://api.github.com/users/stsewd/following{/other_user}","gists_url":"https://api.github.com/users/stsewd/gists{/gist_id}","starred_url":"https://api.github.com/users/stsewd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stsewd/subscriptions","organizations_url":"https://api.github.com/users/stsewd/orgs","repos_url":"https://api.github.com/users/stsewd/repos","events_url":"https://api.github.com/users/stsewd/events{/privacy}","received_events_url":"https://api.github.com/users/stsewd/received_events","type":"User","site_admin":false},"repo":{"id":113132411,"node_id":"MDEwOlJlcG9zaXRvcnkxMTMxMzI0MTE=","name":"readthedocs.org","full_name":"stsewd/readthedocs.org","owner":{"login":"stsewd","id":4975310,"node_id":"MDQ6VXNlcjQ5NzUzMTA=","avatar_url":"https://avatars2.githubusercontent.com/u/4975310?v=4","gravatar_id":"","url":"https://api.github.com/users/stsewd","html_url":"https://github.com/stsewd","followers_url":"https://api.github.com/users/stsewd/followers","following_url":"https://api.github.com/users/stsewd/following{/other_user}","gists_url":"https://api.github.com/users/stsewd/gists{/gist_id}","starred_url":"https://api.github.com/users/stsewd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stsewd/subscriptions","organizations_url":"https://api.github.com/users/stsewd/orgs","repos_url":"https://api.github.com/users/stsewd/repos","events_url":"https://api.github.com/users/stsewd/events{/privacy}","received_events_url":"https://api.github.com/users/stsewd/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/stsewd/readthedocs.org","description":"The source code that powers readthedocs.org","fork":true,"url":"https://api.github.com/repos/stsewd/readthedocs.org","forks_url":"https://api.github.com/repos/stsewd/readthedocs.org/forks","keys_url":"https://api.github.com/repos/stsewd/readthedocs.org/keys{/key_id}","collaborators_url":"https://api.github.com/repos/stsewd/readthedocs.org/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/stsewd/readthedocs.org/teams","hooks_url":"https://api.github.com/repos/stsewd/readthedocs.org/hooks","issue_events_url":"https://api.github.com/repos/stsewd/readthedocs.org/issues/events{/number}","events_url":"https://api.github.com/repos/stsewd/readthedocs.org/events","assignees_url":"https://api.github.com/repos/stsewd/readthedocs.org/assignees{/user}","branches_url":"https://api.github.com/repos/stsewd/readthedocs.org/branches{/branch}","tags_url":"https://api.github.com/repos/stsewd/readthedocs.org/tags","blobs_url":"https://api.github.com/repos/stsewd/readthedocs.org/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/stsewd/readthedocs.org/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/stsewd/readthedocs.org/git/refs{/sha}","trees_url":"https://api.github.com/repos/stsewd/readthedocs.org/git/trees{/sha}","statuses_url":"https://api.github.com/repos/stsewd/readthedocs.org/statuses/{sha}","languages_url":"https://api.github.com/repos/stsewd/readthedocs.org/languages","stargazers_url":"https://api.github.com/repos/stsewd/readthedocs.org/stargazers","contributors_url":"https://api.github.com/repos/stsewd/readthedocs.org/contributors","subscribers_url":"https://api.github.com/repos/stsewd/readthedocs.org/subscribers","subscription_url":"https://api.github.com/repos/stsewd/readthedocs.org/subscription","commits_url":"https://api.github.com/repos/stsewd/readthedocs.org/commits{/sha}","git_commits_url":"https://api.github.com/repos/stsewd/readthedocs.org/git/commits{/sha}","comments_url":"https://api.github.com/repos/stsewd/readthedocs.org/comments{/number}","issue_comment_url":"https://api.github.com/repos/stsewd/readthedocs.org/issues/comments{/number}","contents_url":"https://api.github.com/repos/stsewd/readthedocs.org/contents/{+path}","compare_url":"https://api.github.com/repos/stsewd/readthedocs.org/compare/{base}...{head}","merges_url":"https://api.github.com/repos/stsewd/readthedocs.org/merges","archive_url":"https://api.github.com/repos/stsewd/readthedocs.org/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/stsewd/readthedocs.org/downloads","issues_url":"https://api.github.com/repos/stsewd/readthedocs.org/issues{/number}","pulls_url":"https://api.github.com/repos/stsewd/readthedocs.org/pulls{/number}","milestones_url":"https://api.github.com/repos/stsewd/readthedocs.org/milestones{/number}","notifications_url":"https://api.github.com/repos/stsewd/readthedocs.org/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/stsewd/readthedocs.org/labels{/name}","releases_url":"https://api.github.com/repos/stsewd/readthedocs.org/releases{/id}","deployments_url":"https://api.github.com/repos/stsewd/readthedocs.org/deployments","created_at":"2017-12-05T04:25:56Z","updated_at":"2018-06-25T15:59:11Z","pushed_at":"2018-08-15T17:09:54Z","git_url":"git://github.com/stsewd/readthedocs.org.git","ssh_url":"git@github.com:stsewd/readthedocs.org.git","clone_url":"https://github.com/stsewd/readthedocs.org.git","svn_url":"https://github.com/stsewd/readthedocs.org","homepage":"https://readthedocs.org/","size":50080,"stargazers_count":0,"watchers_count":0,"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":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"rtfd:master","ref":"master","sha":"5be4cd1a625e830700727e2e3ee5ebb3a58b6d59","user":{"login":"rtfd","id":366329,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM2NjMyOQ==","avatar_url":"https://avatars2.githubusercontent.com/u/366329?v=4","gravatar_id":"","url":"https://api.github.com/users/rtfd","html_url":"https://github.com/rtfd","followers_url":"https://api.github.com/users/rtfd/followers","following_url":"https://api.github.com/users/rtfd/following{/other_user}","gists_url":"https://api.github.com/users/rtfd/gists{/gist_id}","starred_url":"https://api.github.com/users/rtfd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rtfd/subscriptions","organizations_url":"https://api.github.com/users/rtfd/orgs","repos_url":"https://api.github.com/users/rtfd/repos","events_url":"https://api.github.com/users/rtfd/events{/privacy}","received_events_url":"https://api.github.com/users/rtfd/received_events","type":"Organization","site_admin":false},"repo":{"id":841835,"node_id":"MDEwOlJlcG9zaXRvcnk4NDE4MzU=","name":"readthedocs.org","full_name":"rtfd/readthedocs.org","owner":{"login":"rtfd","id":366329,"node_id":"MDEyOk9yZ2FuaXphdGlvbjM2NjMyOQ==","avatar_url":"https://avatars2.githubusercontent.com/u/366329?v=4","gravatar_id":"","url":"https://api.github.com/users/rtfd","html_url":"https://github.com/rtfd","followers_url":"https://api.github.com/users/rtfd/followers","following_url":"https://api.github.com/users/rtfd/following{/other_user}","gists_url":"https://api.github.com/users/rtfd/gists{/gist_id}","starred_url":"https://api.github.com/users/rtfd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rtfd/subscriptions","organizations_url":"https://api.github.com/users/rtfd/orgs","repos_url":"https://api.github.com/users/rtfd/repos","events_url":"https://api.github.com/users/rtfd/events{/privacy}","received_events_url":"https://api.github.com/users/rtfd/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rtfd/readthedocs.org","description":"The source code that powers readthedocs.org","fork":false,"url":"https://api.github.com/repos/rtfd/readthedocs.org","forks_url":"https://api.github.com/repos/rtfd/readthedocs.org/forks","keys_url":"https://api.github.com/repos/rtfd/readthedocs.org/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rtfd/readthedocs.org/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rtfd/readthedocs.org/teams","hooks_url":"https://api.github.com/repos/rtfd/readthedocs.org/hooks","issue_events_url":"https://api.github.com/repos/rtfd/readthedocs.org/issues/events{/number}","events_url":"https://api.github.com/repos/rtfd/readthedocs.org/events","assignees_url":"https://api.github.com/repos/rtfd/readthedocs.org/assignees{/user}","branches_url":"https://api.github.com/repos/rtfd/readthedocs.org/branches{/branch}","tags_url":"https://api.github.com/repos/rtfd/readthedocs.org/tags","blobs_url":"https://api.github.com/repos/rtfd/readthedocs.org/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rtfd/readthedocs.org/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rtfd/readthedocs.org/git/refs{/sha}","trees_url":"https://api.github.com/repos/rtfd/readthedocs.org/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rtfd/readthedocs.org/statuses/{sha}","languages_url":"https://api.github.com/repos/rtfd/readthedocs.org/languages","stargazers_url":"https://api.github.com/repos/rtfd/readthedocs.org/stargazers","contributors_url":"https://api.github.com/repos/rtfd/readthedocs.org/contributors","subscribers_url":"https://api.github.com/repos/rtfd/readthedocs.org/subscribers","subscription_url":"https://api.github.com/repos/rtfd/readthedocs.org/subscription","commits_url":"https://api.github.com/repos/rtfd/readthedocs.org/commits{/sha}","git_commits_url":"https://api.github.com/repos/rtfd/readthedocs.org/git/commits{/sha}","comments_url":"https://api.github.com/repos/rtfd/readthedocs.org/comments{/number}","issue_comment_url":"https://api.github.com/repos/rtfd/readthedocs.org/issues/comments{/number}","contents_url":"https://api.github.com/repos/rtfd/readthedocs.org/contents/{+path}","compare_url":"https://api.github.com/repos/rtfd/readthedocs.org/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rtfd/readthedocs.org/merges","archive_url":"https://api.github.com/repos/rtfd/readthedocs.org/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rtfd/readthedocs.org/downloads","issues_url":"https://api.github.com/repos/rtfd/readthedocs.org/issues{/number}","pulls_url":"https://api.github.com/repos/rtfd/readthedocs.org/pulls{/number}","milestones_url":"https://api.github.com/repos/rtfd/readthedocs.org/milestones{/number}","notifications_url":"https://api.github.com/repos/rtfd/readthedocs.org/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rtfd/readthedocs.org/labels{/name}","releases_url":"https://api.github.com/repos/rtfd/readthedocs.org/releases{/id}","deployments_url":"https://api.github.com/repos/rtfd/readthedocs.org/deployments","created_at":"2010-08-16T19:18:06Z","updated_at":"2018-08-15T17:22:51Z","pushed_at":"2018-08-15T18:55:07Z","git_url":"git://github.com/rtfd/readthedocs.org.git","ssh_url":"git@github.com:rtfd/readthedocs.org.git","clone_url":"https://github.com/rtfd/readthedocs.org.git","svn_url":"https://github.com/rtfd/readthedocs.org","homepage":"https://readthedocs.org/","size":51529,"stargazers_count":4558,"watchers_count":4558,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":2458,"mirror_url":null,"archived":false,"open_issues_count":514,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":2458,"open_issues":514,"watchers":4558,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rtfd/readthedocs.org/pulls/4456"},"html":{"href":"https://github.com/rtfd/readthedocs.org/pull/4456"},"issue":{"href":"https://api.github.com/repos/rtfd/readthedocs.org/issues/4456"},"comments":{"href":"https://api.github.com/repos/rtfd/readthedocs.org/issues/4456/comments"},"review_comments":{"href":"https://api.github.com/repos/rtfd/readthedocs.org/pulls/4456/comments"},"review_comment":{"href":"https://api.github.com/repos/rtfd/readthedocs.org/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/rtfd/readthedocs.org/pulls/4456/commits"},"statuses":{"href":"https://api.github.com/repos/rtfd/readthedocs.org/statuses/564b9666209c52f70c7e89f2dc5bead273e201b6"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"humitos"}}