{"action":"created","comment":{"url":"https://api.github.com/repos/pypa/interoperability-peps/pulls/comments/46001896","id":46001896,"diff_hunk":"@@ -0,0 +1,419 @@\n+:PEP: XX\n+:Title: Build system abstraction for pip/conda etc\n+:Version: $Revision$\n+:Last-Modified: $Date$\n+:Author: Robert Collins <rbtcollins@hp.com>,\n+         Nathaniel Smith <njs@pobox.com>\n+:BDFL-Delegate: Donald Stufft <donald@stufft.io>\n+:Discussions-To: distutils-sig <distutils-sig@python.org>\n+:Status: Draft\n+:Type: Standards Track\n+:Content-Type: text/x-rst\n+:Created: 26-Oct-2015\n+:Post-History: XX\n+:Requires: The new dependency-specification PEP.\n+\n+\n+Abstract\n+========\n+\n+This PEP specifies a programmatic interface for pip [#pip]_ and other\n+distribution or installation tools to use when working with Python\n+source trees (both the developer tree - e.g. the git tree - and source\n+distributions).\n+\n+The programmatic interface allows decoupling of pip from its current\n+hard dependency on setuptools [#setuptools]_ able for two\n+key reasons:\n+\n+1. It enables new build systems that may be much easier to use without\n+   requiring them to even appear to be setuptools.\n+\n+2. It facilitates setuptools itself changing its user interface without\n+   breaking pip, giving looser coupling.\n+\n+The programmatic interface also enables pip to install build time requirements\n+for packages which is an important step in getting pip to full feature parity\n+with the installation components of easy-install.\n+\n+As PEP-426 [#pep426]_ is draft, we cannot utilise the metadata format it\n+defined. However PEP-427 wheels are in wide use and fairly well specified, so\n+we have adopted the METADATA format from that for specifying distribution\n+dependencies.  However something was needed for communicating bootstrap\n+requirements and build requirements - but a thin JSON schema is sufficient.\n+\n+Motivation\n+==========\n+\n+There is significant pent-up frustration in the Python packaging ecosystem\n+around the current lock-in between build system and pip. Breaking that lock-in\n+is better for pip, for setuptools, and for other build systems like flit\n+[#flit]_.\n+\n+Specification\n+=============\n+\n+Overview\n+--------\n+\n+Build tools will be located by reading a file ``pypa.json`` from the root\n+directory of the source tree. That file describes how to get the build tool.\n+The build tool is then self-describing. This avoids having stale descriptions\n+of build tools encoded into sdists that have been uploaded to PyPI [#pypi]_.\n+\n+The interface involves executing processes rather than loading Python modules,\n+because tools like pip will often interact with many different versions of the\n+same build tool during a single invocation, and in-process APIs are much\n+harder to manage in that situation.\n+\n+Process interface\n+-----------------\n+\n+Where a process needs to be run, we need to be able to assemble the subprocess\n+call to make. For this we use a simple command string with in-Python variable\n+interpolation. Only variables defined in this PEP will be honoured: the use of\n+additional variables is an error. Additional variables can only be added with\n+a schema version increase. Basic variable expressions such as ``${PYTHON}``,\n+``${PYTHON:-python}``, ``${PYTHON:+PYTHON -m coverage}`` can be used. An\n+implementation of this is in shellvars [#shellvars]_.\n+\n+Processes will be run with the current working directory set to the root of\n+the source tree.\n+\n+Available variables\n+-------------------\n+\n+PYTHON\n+    The Python interpreter in use. This is important to enable calling things\n+    which are just Python entry points::\n+\n+        ${PYTHON} -m foo\n+\n+OUTPUT_DIR\n+    Where to create requested output. If not set, outputting to the current\n+    working directory is appropriate. This is required by ``pip`` which needs\n+    to have wheels output in a known location.\n+\n+pypa.json\n+---------\n+\n+The yaml file has the following schema. Extra keys are ignored.\n+\n+schema\n+    The version of the schema. This PEP defines version 1.\n+    Defaults to 1\n+\n+bootstrap-requires\n+    A list of dependency specifications that must be installed before\n+    running the build tool. For instance, if using flit, then the requirements\n+    might be::\n+    \n+        bootstrap-requires:\n+          - flit\n+\n+build-tool\n+    A command to run to query the build tool for its complete interface.\n+    The build tool should output on stdout a build tool description JSON\n+    document.  Stdin may not be read from, and stderr may be handled however\n+    the calling process desires.\n+\n+build tool description\n+----------------------\n+\n+The build tool description schema. Extra keys are ignored.\n+\n+schema\n+    The version of the schema. This PEP defines version 1.\n+    Defaults to 1\n+\n+build-requires\n+    Command to run to query build requirements. Build requirements are\n+    returned as a JSON document with one key ``build_requires`` consisting of\n+    a list of dependency specifications. Additional keys must be ignored.\n+\n+metadata\n+    Command to run to generate metadata for the project.  The metadata should\n+    be output on stdout, stdin may not be consumed, and stderr handling is up\n+    to the discretion of the calling process.  The build-requires for the\n+    project will be present in the Python environment when the metadata\n+    command is run.  pip would run metadata just once to determine what other\n+    packages need to be downloaded and installed.  The metadata is output as a\n+    wheel METADATA file per PEP-427 [#pep427]_.\n+\n+    Note that the metadata generated by the metadata command, and the metadata\n+    present in a generated wheel must be identical.\n+\n+wheel\n+    Command to run to build a wheel of the project. OUTPUT_DIR will be set and\n+    point to an existing directory where the wheel should be output.  Stdin\n+    may not be consumed, stdout and stderr handling is at the discretion of\n+    the calling process. The build-requires for the project will be present in\n+    the Python environment when the wheel command is run.  Only one file\n+    should be output - if more are output then pip would pick an arbitrary one\n+    to consume.\n+\n+develop\n+    Command to do an in-place 'development' installation of the project.\n+    Stdin may not be consumed, stdout and stderr handling is at the discretion\n+    of the calling process. The build-requires for the project will be\n+    present in the Python environment when the develop command is run.\n+    \n+    Not all build systems will be able to perform develop installs. If a build\n+    system cannot do develop installs, then this key can be omitted.\n+    \n+    Note that when it is omitted, commands like ``pip install -e foo``\n+    will be unable to complete.\n+\n+provided-by\n+    Optional distribution name that provides this build system.\n+    This is used to facilitate caching the build tool description. If absent\n+    then the build tool description cannot be cached, which will incure an\n+    extra subprocess per package being built (to query the build tool).\n+    Specifically, where the resolved bootstrap-requires results in the same\n+    version of the named distribution being installed, the build tool\n+    description is presumed to be identical.\n+\n+Python environments and hermetic builds\n+---------------------------------------\n+\n+This specification does not prescribe whether builds should be hermetic or not.\n+Existing build tools like setuptools will use installed versions of build time\n+requirements (e.g. setuptools_scm) and only install other versions on version\n+conflicts or missing dependencies. However its likely that better consistency\n+can be created by always isolation builds and using only the specified dependencies.\n+\n+However there are nuanced problems there - such as how can users force the\n+avoidance of a bad version of a build requirement which meets some packages\n+dependencies. Future PEPs may tackle this problem, but it is not currently in\n+scope - it does not affect the metadata required to coordinate between build\n+systems and things that need to do builds.\n+\n+Upgrades\n+--------\n+\n+Both 'pypa.json' and the build tool description are versioned to permit future\n+incompatible changes. There is a sequence dependency here.\n+\n+Upgrades to the schemas defined in this specification must proceed with the\n+consumers first. To ensure that consumers should refuse to operate when\n+'pypa.json' has a schema version that they do not recognise.\n+\n+Build tools listed in a 'pypa.json' with schema version 1 must not generate a\n+build tool description with a version other than 1 (or absent, as the default\n+is 1).\n+\n+Thus the sequence for upgrading either of schemas in a new PEP will be:\n+\n+1. Issue new PEP defining build tool description and 'pypa.json' schemas. The\n+   'pypa.yaml' schema version must change if either the 'pypa.yaml' schema has\n+   changed or the build tool description schema has changed. The build tool\n+   description schema version must change if the build tool description schema\n+   has changed.\n+2. Consumers (e.g. pip) implement support for the new schema version.\n+3. Build tool authors implement the new schemas, and publish updated reference\n+   'pypa.json' files for their users.  4. Package authors opt into the new\n+   schema when they are happy to introduce a dependency on the version of\n+   'pip' (and potentially other consumers) that introduced support for the new\n+   schema version.\n+\n+The *same* process will take place for the initial deployment of this PEP:-\n+the propogation of the capability to use this PEP without a `setuptools shim`_\n+will be largely gated by the adoption rate of the first version of pip that\n+supports it.\n+\n+Static metadata in sdists\n+-------------------------\n+\n+This PEP does not tackle the current inability to trust static metadata in\n+sdists. That is a separate problem to identifying and consuming the build\n+system that is in use in a source tree, whether it came from an sdist or not.\n+\n+Handling of compiler options\n+----------------------------\n+\n+Handling of different compiler options is out of scope for this specification.","path":"build-system-abstraction.rst","position":254,"original_position":234,"commit_id":"54cd4f0cadc561da3f530d75af3806e75dd5edba","original_commit_id":"6de544a6e6aa2d0505e2ac8eb364b8b95e27790d","user":{"login":"rbtcollins","id":499678,"avatar_url":"https://avatars.githubusercontent.com/u/499678?v=3","gravatar_id":"","url":"https://api.github.com/users/rbtcollins","html_url":"https://github.com/rbtcollins","followers_url":"https://api.github.com/users/rbtcollins/followers","following_url":"https://api.github.com/users/rbtcollins/following{/other_user}","gists_url":"https://api.github.com/users/rbtcollins/gists{/gist_id}","starred_url":"https://api.github.com/users/rbtcollins/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rbtcollins/subscriptions","organizations_url":"https://api.github.com/users/rbtcollins/orgs","repos_url":"https://api.github.com/users/rbtcollins/repos","events_url":"https://api.github.com/users/rbtcollins/events{/privacy}","received_events_url":"https://api.github.com/users/rbtcollins/received_events","type":"User","site_admin":false},"body":"Further, the whole point of them being out of scope is that we're not defining their behaviour: we're saying that tools like conda or pip that choose to invoke build systems can build their own UI and logic around this, we're merely calling out that this is likely going to happen, and that what is passed where needs to understand different build systems will have different things here.","created_at":"2015-11-26T18:43:01Z","updated_at":"2015-11-26T18:43:01Z","html_url":"https://github.com/pypa/interoperability-peps/pull/54#discussion_r46001896","pull_request_url":"https://api.github.com/repos/pypa/interoperability-peps/pulls/54","_links":{"self":{"href":"https://api.github.com/repos/pypa/interoperability-peps/pulls/comments/46001896"},"html":{"href":"https://github.com/pypa/interoperability-peps/pull/54#discussion_r46001896"},"pull_request":{"href":"https://api.github.com/repos/pypa/interoperability-peps/pulls/54"}}},"pull_request":{"url":"https://api.github.com/repos/pypa/interoperability-peps/pulls/54","id":48968802,"html_url":"https://github.com/pypa/interoperability-peps/pull/54","diff_url":"https://github.com/pypa/interoperability-peps/pull/54.diff","patch_url":"https://github.com/pypa/interoperability-peps/pull/54.patch","issue_url":"https://api.github.com/repos/pypa/interoperability-peps/issues/54","number":54,"state":"open","locked":false,"title":"build system abstraction PEP","user":{"login":"rbtcollins","id":499678,"avatar_url":"https://avatars.githubusercontent.com/u/499678?v=3","gravatar_id":"","url":"https://api.github.com/users/rbtcollins","html_url":"https://github.com/rbtcollins","followers_url":"https://api.github.com/users/rbtcollins/followers","following_url":"https://api.github.com/users/rbtcollins/following{/other_user}","gists_url":"https://api.github.com/users/rbtcollins/gists{/gist_id}","starred_url":"https://api.github.com/users/rbtcollins/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rbtcollins/subscriptions","organizations_url":"https://api.github.com/users/rbtcollins/orgs","repos_url":"https://api.github.com/users/rbtcollins/repos","events_url":"https://api.github.com/users/rbtcollins/events{/privacy}","received_events_url":"https://api.github.com/users/rbtcollins/received_events","type":"User","site_admin":false},"body":"\n\n<!-- Reviewable:start -->\n[<img src=\"https://reviewable.io/review_button.png\" height=40 alt=\"Review on Reviewable\"/>](https://reviewable.io/reviews/pypa/interoperability-peps/54)\n<!-- Reviewable:end -->\n","created_at":"2015-10-28T06:22:19Z","updated_at":"2015-11-26T18:43:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"52b2c1343a5dde996d4d60dab4cc75167d3f44da","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/pypa/interoperability-peps/pulls/54/commits","review_comments_url":"https://api.github.com/repos/pypa/interoperability-peps/pulls/54/comments","review_comment_url":"https://api.github.com/repos/pypa/interoperability-peps/pulls/comments{/number}","comments_url":"https://api.github.com/repos/pypa/interoperability-peps/issues/54/comments","statuses_url":"https://api.github.com/repos/pypa/interoperability-peps/statuses/54cd4f0cadc561da3f530d75af3806e75dd5edba","head":{"label":"rbtcollins:build-system-abstraction","ref":"build-system-abstraction","sha":"54cd4f0cadc561da3f530d75af3806e75dd5edba","user":{"login":"rbtcollins","id":499678,"avatar_url":"https://avatars.githubusercontent.com/u/499678?v=3","gravatar_id":"","url":"https://api.github.com/users/rbtcollins","html_url":"https://github.com/rbtcollins","followers_url":"https://api.github.com/users/rbtcollins/followers","following_url":"https://api.github.com/users/rbtcollins/following{/other_user}","gists_url":"https://api.github.com/users/rbtcollins/gists{/gist_id}","starred_url":"https://api.github.com/users/rbtcollins/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rbtcollins/subscriptions","organizations_url":"https://api.github.com/users/rbtcollins/orgs","repos_url":"https://api.github.com/users/rbtcollins/repos","events_url":"https://api.github.com/users/rbtcollins/events{/privacy}","received_events_url":"https://api.github.com/users/rbtcollins/received_events","type":"User","site_admin":false},"repo":{"id":40106828,"name":"interoperability-peps","full_name":"rbtcollins/interoperability-peps","owner":{"login":"rbtcollins","id":499678,"avatar_url":"https://avatars.githubusercontent.com/u/499678?v=3","gravatar_id":"","url":"https://api.github.com/users/rbtcollins","html_url":"https://github.com/rbtcollins","followers_url":"https://api.github.com/users/rbtcollins/followers","following_url":"https://api.github.com/users/rbtcollins/following{/other_user}","gists_url":"https://api.github.com/users/rbtcollins/gists{/gist_id}","starred_url":"https://api.github.com/users/rbtcollins/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rbtcollins/subscriptions","organizations_url":"https://api.github.com/users/rbtcollins/orgs","repos_url":"https://api.github.com/users/rbtcollins/repos","events_url":"https://api.github.com/users/rbtcollins/events{/privacy}","received_events_url":"https://api.github.com/users/rbtcollins/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rbtcollins/interoperability-peps","description":"Development repo for evolution of PyPA interoperability standards (released versions are published as PEPs on python.org)","fork":true,"url":"https://api.github.com/repos/rbtcollins/interoperability-peps","forks_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/forks","keys_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/teams","hooks_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/hooks","issue_events_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/issues/events{/number}","events_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/events","assignees_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/assignees{/user}","branches_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/branches{/branch}","tags_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/tags","blobs_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/git/refs{/sha}","trees_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/statuses/{sha}","languages_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/languages","stargazers_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/stargazers","contributors_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/contributors","subscribers_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/subscribers","subscription_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/subscription","commits_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/commits{/sha}","git_commits_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/git/commits{/sha}","comments_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/comments{/number}","issue_comment_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/issues/comments{/number}","contents_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/contents/{+path}","compare_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/merges","archive_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/downloads","issues_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/issues{/number}","pulls_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/pulls{/number}","milestones_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/milestones{/number}","notifications_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/labels{/name}","releases_url":"https://api.github.com/repos/rbtcollins/interoperability-peps/releases{/id}","created_at":"2015-08-03T05:36:56Z","updated_at":"2015-08-03T05:36:56Z","pushed_at":"2015-11-26T18:16:15Z","git_url":"git://github.com/rbtcollins/interoperability-peps.git","ssh_url":"git@github.com:rbtcollins/interoperability-peps.git","clone_url":"https://github.com/rbtcollins/interoperability-peps.git","svn_url":"https://github.com/rbtcollins/interoperability-peps","homepage":null,"size":24535,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"pypa:master","ref":"master","sha":"ec6fe31a952916b4a1fd65dc11d26e4c838fe3bf","user":{"login":"pypa","id":647025,"avatar_url":"https://avatars.githubusercontent.com/u/647025?v=3","gravatar_id":"","url":"https://api.github.com/users/pypa","html_url":"https://github.com/pypa","followers_url":"https://api.github.com/users/pypa/followers","following_url":"https://api.github.com/users/pypa/following{/other_user}","gists_url":"https://api.github.com/users/pypa/gists{/gist_id}","starred_url":"https://api.github.com/users/pypa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pypa/subscriptions","organizations_url":"https://api.github.com/users/pypa/orgs","repos_url":"https://api.github.com/users/pypa/repos","events_url":"https://api.github.com/users/pypa/events{/privacy}","received_events_url":"https://api.github.com/users/pypa/received_events","type":"Organization","site_admin":false},"repo":{"id":28580365,"name":"interoperability-peps","full_name":"pypa/interoperability-peps","owner":{"login":"pypa","id":647025,"avatar_url":"https://avatars.githubusercontent.com/u/647025?v=3","gravatar_id":"","url":"https://api.github.com/users/pypa","html_url":"https://github.com/pypa","followers_url":"https://api.github.com/users/pypa/followers","following_url":"https://api.github.com/users/pypa/following{/other_user}","gists_url":"https://api.github.com/users/pypa/gists{/gist_id}","starred_url":"https://api.github.com/users/pypa/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pypa/subscriptions","organizations_url":"https://api.github.com/users/pypa/orgs","repos_url":"https://api.github.com/users/pypa/repos","events_url":"https://api.github.com/users/pypa/events{/privacy}","received_events_url":"https://api.github.com/users/pypa/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/pypa/interoperability-peps","description":"Development repo for evolution of PyPA interoperability standards (released versions are published as PEPs on python.org)","fork":false,"url":"https://api.github.com/repos/pypa/interoperability-peps","forks_url":"https://api.github.com/repos/pypa/interoperability-peps/forks","keys_url":"https://api.github.com/repos/pypa/interoperability-peps/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pypa/interoperability-peps/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pypa/interoperability-peps/teams","hooks_url":"https://api.github.com/repos/pypa/interoperability-peps/hooks","issue_events_url":"https://api.github.com/repos/pypa/interoperability-peps/issues/events{/number}","events_url":"https://api.github.com/repos/pypa/interoperability-peps/events","assignees_url":"https://api.github.com/repos/pypa/interoperability-peps/assignees{/user}","branches_url":"https://api.github.com/repos/pypa/interoperability-peps/branches{/branch}","tags_url":"https://api.github.com/repos/pypa/interoperability-peps/tags","blobs_url":"https://api.github.com/repos/pypa/interoperability-peps/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pypa/interoperability-peps/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pypa/interoperability-peps/git/refs{/sha}","trees_url":"https://api.github.com/repos/pypa/interoperability-peps/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pypa/interoperability-peps/statuses/{sha}","languages_url":"https://api.github.com/repos/pypa/interoperability-peps/languages","stargazers_url":"https://api.github.com/repos/pypa/interoperability-peps/stargazers","contributors_url":"https://api.github.com/repos/pypa/interoperability-peps/contributors","subscribers_url":"https://api.github.com/repos/pypa/interoperability-peps/subscribers","subscription_url":"https://api.github.com/repos/pypa/interoperability-peps/subscription","commits_url":"https://api.github.com/repos/pypa/interoperability-peps/commits{/sha}","git_commits_url":"https://api.github.com/repos/pypa/interoperability-peps/git/commits{/sha}","comments_url":"https://api.github.com/repos/pypa/interoperability-peps/comments{/number}","issue_comment_url":"https://api.github.com/repos/pypa/interoperability-peps/issues/comments{/number}","contents_url":"https://api.github.com/repos/pypa/interoperability-peps/contents/{+path}","compare_url":"https://api.github.com/repos/pypa/interoperability-peps/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pypa/interoperability-peps/merges","archive_url":"https://api.github.com/repos/pypa/interoperability-peps/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pypa/interoperability-peps/downloads","issues_url":"https://api.github.com/repos/pypa/interoperability-peps/issues{/number}","pulls_url":"https://api.github.com/repos/pypa/interoperability-peps/pulls{/number}","milestones_url":"https://api.github.com/repos/pypa/interoperability-peps/milestones{/number}","notifications_url":"https://api.github.com/repos/pypa/interoperability-peps/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pypa/interoperability-peps/labels{/name}","releases_url":"https://api.github.com/repos/pypa/interoperability-peps/releases{/id}","created_at":"2014-12-29T04:35:09Z","updated_at":"2015-11-08T08:27:19Z","pushed_at":"2015-11-26T18:16:19Z","git_url":"git://github.com/pypa/interoperability-peps.git","ssh_url":"git@github.com:pypa/interoperability-peps.git","clone_url":"https://github.com/pypa/interoperability-peps.git","svn_url":"https://github.com/pypa/interoperability-peps","homepage":null,"size":24556,"stargazers_count":7,"watchers_count":7,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":8,"mirror_url":null,"open_issues_count":32,"forks":8,"open_issues":32,"watchers":7,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/pypa/interoperability-peps/pulls/54"},"html":{"href":"https://github.com/pypa/interoperability-peps/pull/54"},"issue":{"href":"https://api.github.com/repos/pypa/interoperability-peps/issues/54"},"comments":{"href":"https://api.github.com/repos/pypa/interoperability-peps/issues/54/comments"},"review_comments":{"href":"https://api.github.com/repos/pypa/interoperability-peps/pulls/54/comments"},"review_comment":{"href":"https://api.github.com/repos/pypa/interoperability-peps/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/pypa/interoperability-peps/pulls/54/commits"},"statuses":{"href":"https://api.github.com/repos/pypa/interoperability-peps/statuses/54cd4f0cadc561da3f530d75af3806e75dd5edba"}}}}