{"action":"created","comment":{"url":"https://api.github.com/repos/edx/open-edx-proposals/pulls/comments/182169829","pull_request_review_id":112922729,"id":182169829,"diff_hunk":"@@ -0,0 +1,402 @@\n+======================================\n+OEP-0018: Python Dependency Management\n+======================================\n+\n++-----------------+--------------------------------------------------------+\n+| OEP             | :doc:`OEP-0018 <oep-0018-bp-python-dependencies>`      |\n++-----------------+--------------------------------------------------------+\n+| Title           | Python Dependencies Management                         |\n++-----------------+--------------------------------------------------------+\n+| Last Modified   | 2018-04-10                                             |\n++-----------------+--------------------------------------------------------+\n+| Authors         | Jeremy Bowman <jbowman@edx.org>                        |\n++-----------------+--------------------------------------------------------+\n+| Arbiter         | Calen Pennington <cale@edx.org>                        |\n++-----------------+--------------------------------------------------------+\n+| Status          | Draft                                                  |\n++-----------------+--------------------------------------------------------+\n+| Type            | Best Practice                                          |\n++-----------------+--------------------------------------------------------+\n+| Created         | 2018-03-27                                             |\n++-----------------+--------------------------------------------------------+\n+| `Review Period` | 2018-03-27 - 2018-04-27                                |\n++-----------------+--------------------------------------------------------+\n+| `Resolution`    |                                                        |\n++-----------------+--------------------------------------------------------+\n+\n+Abstract\n+========\n+\n+Proposes best practices for declaring and maintaining dependencies on other\n+Python packages in Open edX software repositories.\n+\n+Motivation\n+==========\n+\n+The Open edX project includes dozens of Python software repositories, most of\n+which depend on certain other Python packages being installed in order to\n+function correctly.  The simple methods we originally used to do this have\n+assorted drawbacks that have repeatedly caused problems over the past few\n+years: accidental upgrades to incompatible versions, strict installation\n+requirements that restrict the ability of downstream packages to manage their\n+own dependency versions, lack of clarity regarding the full set of packages\n+actually depended upon, etc.\n+\n+Outlined here is a recommended standard for declaring dependencies on other\n+Python packages which resolves most of these issues and will let us make all\n+the Open edX Python packages consistent with each other (and many other open\n+source Python projects) for ease of understanding and maintenance.\n+\n+Specification\n+=============\n+\n+The key to successful Python dependency management in Open edX repositories\n+is to break it down into five parts:\n+\n+1. Identify the different contexts in which dependencies will need to be\n+   installed.\n+2. For each of these contexts, declare the direct dependencies that will be\n+   needed.  Use the least restrictive constraints which should allow pip to\n+   install a working set of dependencies.  We generally no longer want or need\n+   to manually pin specific versions; ``pip-compile`` will do this for us.\n+3. Use ``pip-compile`` to generate from the high-level dependencies\n+   declarations a separate set of requirements files which specify the exact\n+   package versions that are known to work for a Python `virtualenv`_ created\n+   for that context.\n+4. Automate updates of the detailed requirements files for each context.\n+5. When making deliberate changes to the repository's dependencies, only make\n+   manual changes to the files given to ``pip-compile`` as input, never the\n+   ones that it generates.\n+\n+.. _virtualenv: https://virtualenv.pypa.io/\n+\n+Identify Usage Contexts\n+-----------------------\n+\n+The dependencies of Python software are typically installed or run in a\n+variety of different contexts over the course of developing and using it.\n+The set of dependencies needed to perform a task can easily vary between these\n+contexts.  The dependencies for each context will be captured in a\n+separate file in the ``requirements`` directory.  Here are some common\n+contexts and the file names often used for them:\n+\n+* Just the standard set of core dependencies for execution on a production\n+  server to perform its primary purpose (``base.in``)\n+* Additional dependencies which are only needed when optional extra features\n+  of a package are desired\n+* Assorted testing libraries to run automated test suites (``test.in``)\n+* Static code analysis tools to perform code quality checks (``quality.in``)\n+* The utilities called directly by a CI server to create and use one or more\n+  virtualenvs and report code coverage statistics to a 3rd-party service\n+  (``jenkins.in``, ``travis.in``)\n+* `Sphinx`_ and other utilities used to generate developer documentation\n+  (``doc.in``)\n+* Additional utilities needed to perform common development tasks (``dev.in``)\n+* Utilities that a particular developer likes to use with a repository, but\n+  aren't strictly needed for any of the regular contexts (``private.in``).\n+\n+.. _Sphinx: http://www.sphinx-doc.org/\n+\n+Declare Direct Dependencies\n+---------------------------\n+\n+As indicated above, some of the usage contexts have a standard filename used in\n+the ``requirements`` directory of an Open edX repository to list dependencies.\n+Others will have an appropriate filename custom to that repository's unique\n+context.  Each of these is a ``pip``-compatible `requirements file`_ listing\n+the direct dependencies needed for that context.  Beyond complying with the\n+file format, there are a few guidelines each of these files should follow:\n+\n+* The file should start with a brief comment explaining the context in which\n+  these dependencies are needed.  Examples can be found in the\n+  `cookiecutter-django-app`_ repository.\n+* Each listed dependency should have a brief end-of-line comment explaining\n+  its primary purpose(s) in this context.  These comments typically start at\n+  the 37th character, which allows enough room for most package name plus\n+  constraint specifications while keeping the comments visually aligned.\n+* Version constraints should only be used to exclude dependency versions which\n+  are known (or strongly suspected) to not work in this context.\n+* Indirect dependencies (used by dependencies but not directly by the code in\n+  the repository itself) should not be listed unless a constraint is needed to\n+  enforce a compatible version; these are automatically detected and captured\n+  elsewhere as described below.\n+* `Environment markers`_ should be used as necessary to indicate dependencies\n+  which should only be installed on specific operating systems, Python\n+  versions, etc.\n+* Avoid direct links to packages in local directories, GitHub, or other version\n+  control systems if at all possible; all dependencies should be installed\n+  from `PyPI`_.  If you think you're in one of the rare circumstances where\n+  installing a package from a URL is appropriate, see the notes below on\n+  `Installing Dependencies from URLs`_\n+* If the dependencies in one context are a superset of those in another one,\n+  do not repeat the dependencies.  Instead, explicitly include the file\n+  produced by ``pip-compile`` for the smaller set of dependencies in the\n+  requirements file for the larger set of dependencies. For example,\n+  ``test.in`` often includes a line like the following to ensure that the same\n+  versions of packages used in production for a service will also be used when\n+  testing it:\n+\n+.. code-block:: python\n+\n+  -r base.txt                         # Core dependencies of the service being tested\n+\n+If the repository contains a ``setup.py`` file defining a Python package, the\n+base dependencies also need to be specified there.  These can be derived from\n+``requirements/base.in`` with a simple Python function declared in\n+``setup.py`` itself.  An example can be found in the\n+`setup.py file for edx-completion`_.\n+\n+.. _requirements file: https://pip.readthedocs.io/en/1.1/requirements.html\n+.. _cookiecutter-django-app: https://github.com/edx/cookiecutter-django-app/tree/master/%7B%7Bcookiecutter.repo_name%7D%7D/requirements\n+.. _Environment markers: https://www.python.org/dev/peps/pep-0508/#environment-markers\n+.. _PyPI: https://pypi.org/\n+.. _setup.py file for edx-completion: https://github.com/edx/completion/blob/master/setup.py\n+\n+Generate Exact Dependency Specifications\n+----------------------------------------\n+\n+Although we want to keep our manually edited requirements files very simple,\n+we need a separate set of requirements files which list every single package\n+needed for each usage context, with exact versions of each for reproducible\n+test runs and consistent development and production environments.  We can\n+generate these automatically using `pip-tools`_, which consists of two related\n+utilities:\n+\n+* ``pip-compile`` generates a requirements file from one or more high-level\n+  input requirements files, listing exact versions of every listed and\n+  indirect dependency needed to satisfy the given constraints.\n+* ``pip-sync`` ensures that the current virtualenv contains exactly (and only)\n+  the packages listed in the given requirements files, installing, upgrading,\n+  and uninstalling packages as needed.\n+\n+Open edX packages should use an ``upgrade`` make target to use ``pip-compile``\n+to automatically update the detailed requirements files\n+(``requirements/*.txt``) to use the newest available packages which satisfy\n+the constraints in the direct dependencies files.  These generated files are\n+then used anywhere that runs a command to install dependencies: ``tox.ini``,\n+``.travis.yml``, the ``requirements`` make target (for updating a local\n+development environment), etc.\n+\n+Sometimes ``pip-compile`` will be unable to find a suitable version of a\n+dependency for the output file because there are incompatible version\n+constraints in the input files and/or the stated installation requirements\n+of the other dependencies.  In cases like this, installing and running\n+`pipdeptree`_ can help identify the conflicting constraints so at least one\n+of them can be sufficiently relaxed such that a version of the dependency\n+exists which satisfies them all.\n+\n+.. _pip-tools: https://github.com/jazzband/pip-tools\n+.. _pipdeptree: https://github.com/naiquevin/pipdeptree\n+\n+Automate Updates of Exact Dependency Specifications\n+---------------------------------------------------\n+\n+While we want all dependencies explicitly pinned in order to benefit from\n+consistent testing and development environments, it isn't acceptable to leave\n+these versions untouched for long stretches of time.  Packages we depend on\n+routinely release new versions to address security issues, fix bugs, and add\n+new features.  While we don't necessarily need to update our repositories\n+every time a new dependency version is released, we do want to keep them\n+current enough that upgrading a single package to fix a known issue doesn't\n+require suddenly adapting to a few years' worth of API changes that we didn't\n+pay attention to.\n+\n+Each Open edX repository should have the following:\n+\n+* An ``upgrade`` make target as described above, to update the pinned versions\n+  of all dependencies (and account for any new or removed indirect\n+  dependencies).\n+* An automated test suite with reasonably good code coverage, configured to\n+  be run on new GitHub pull requests.\n+* A service configured to periodically auto-generate a GitHub pull request","path":"oeps/oep-0018-bp-python-dependencies.rst","position":211,"original_position":211,"commit_id":"7bc91ce3c0c6e81c9fc2cc3b88e15de594525432","original_commit_id":"7bc91ce3c0c6e81c9fc2cc3b88e15de594525432","user":{"login":"nasthagiri","id":6772826,"avatar_url":"https://avatars1.githubusercontent.com/u/6772826?v=4","gravatar_id":"","url":"https://api.github.com/users/nasthagiri","html_url":"https://github.com/nasthagiri","followers_url":"https://api.github.com/users/nasthagiri/followers","following_url":"https://api.github.com/users/nasthagiri/following{/other_user}","gists_url":"https://api.github.com/users/nasthagiri/gists{/gist_id}","starred_url":"https://api.github.com/users/nasthagiri/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nasthagiri/subscriptions","organizations_url":"https://api.github.com/users/nasthagiri/orgs","repos_url":"https://api.github.com/users/nasthagiri/repos","events_url":"https://api.github.com/users/nasthagiri/events{/privacy}","received_events_url":"https://api.github.com/users/nasthagiri/received_events","type":"User","site_admin":false},"body":"Am I understanding this correctly: Until the next time this service runs, the automatically generated requirements `.txt` file may not match the output of the `.in` file, right?","created_at":"2018-04-17T17:48:12Z","updated_at":"2018-04-17T17:52:06Z","html_url":"https://github.com/edx/open-edx-proposals/pull/56#discussion_r182169829","pull_request_url":"https://api.github.com/repos/edx/open-edx-proposals/pulls/56","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/edx/open-edx-proposals/pulls/comments/182169829"},"html":{"href":"https://github.com/edx/open-edx-proposals/pull/56#discussion_r182169829"},"pull_request":{"href":"https://api.github.com/repos/edx/open-edx-proposals/pulls/56"}}},"pull_request":{"url":"https://api.github.com/repos/edx/open-edx-proposals/pulls/56","id":177777105,"html_url":"https://github.com/edx/open-edx-proposals/pull/56","diff_url":"https://github.com/edx/open-edx-proposals/pull/56.diff","patch_url":"https://github.com/edx/open-edx-proposals/pull/56.patch","issue_url":"https://api.github.com/repos/edx/open-edx-proposals/issues/56","number":56,"state":"open","locked":false,"title":"OEP-0018: Python Dependency Management","user":{"login":"jmbowman","id":1005375,"avatar_url":"https://avatars2.githubusercontent.com/u/1005375?v=4","gravatar_id":"","url":"https://api.github.com/users/jmbowman","html_url":"https://github.com/jmbowman","followers_url":"https://api.github.com/users/jmbowman/followers","following_url":"https://api.github.com/users/jmbowman/following{/other_user}","gists_url":"https://api.github.com/users/jmbowman/gists{/gist_id}","starred_url":"https://api.github.com/users/jmbowman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jmbowman/subscriptions","organizations_url":"https://api.github.com/users/jmbowman/orgs","repos_url":"https://api.github.com/users/jmbowman/repos","events_url":"https://api.github.com/users/jmbowman/events{/privacy}","received_events_url":"https://api.github.com/users/jmbowman/received_events","type":"User","site_admin":false},"body":"Recommendations for managing python package dependencies which should help minimize problems over time.  The key technology choice involved is `pip-tools`, which we already use in many of our repositories.  The current draft specifies that we should use a service to auto-generate PRs with requirement updates, but stops short of recommending which one to use (largely because we're still in the process of finalizing that decision, and the choice may change over time anyway).","created_at":"2018-03-27T15:23:42Z","updated_at":"2018-04-17T17:52:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c4ca1333c9ed3d01437754b3fae9a4159e1db38b","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/edx/open-edx-proposals/pulls/56/commits","review_comments_url":"https://api.github.com/repos/edx/open-edx-proposals/pulls/56/comments","review_comment_url":"https://api.github.com/repos/edx/open-edx-proposals/pulls/comments{/number}","comments_url":"https://api.github.com/repos/edx/open-edx-proposals/issues/56/comments","statuses_url":"https://api.github.com/repos/edx/open-edx-proposals/statuses/7bc91ce3c0c6e81c9fc2cc3b88e15de594525432","head":{"label":"edx:jmbowman/oep-0018","ref":"jmbowman/oep-0018","sha":"7bc91ce3c0c6e81c9fc2cc3b88e15de594525432","user":{"login":"edx","id":3179841,"avatar_url":"https://avatars3.githubusercontent.com/u/3179841?v=4","gravatar_id":"","url":"https://api.github.com/users/edx","html_url":"https://github.com/edx","followers_url":"https://api.github.com/users/edx/followers","following_url":"https://api.github.com/users/edx/following{/other_user}","gists_url":"https://api.github.com/users/edx/gists{/gist_id}","starred_url":"https://api.github.com/users/edx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/edx/subscriptions","organizations_url":"https://api.github.com/users/edx/orgs","repos_url":"https://api.github.com/users/edx/repos","events_url":"https://api.github.com/users/edx/events{/privacy}","received_events_url":"https://api.github.com/users/edx/received_events","type":"Organization","site_admin":false},"repo":{"id":55162195,"name":"open-edx-proposals","full_name":"edx/open-edx-proposals","owner":{"login":"edx","id":3179841,"avatar_url":"https://avatars3.githubusercontent.com/u/3179841?v=4","gravatar_id":"","url":"https://api.github.com/users/edx","html_url":"https://github.com/edx","followers_url":"https://api.github.com/users/edx/followers","following_url":"https://api.github.com/users/edx/following{/other_user}","gists_url":"https://api.github.com/users/edx/gists{/gist_id}","starred_url":"https://api.github.com/users/edx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/edx/subscriptions","organizations_url":"https://api.github.com/users/edx/orgs","repos_url":"https://api.github.com/users/edx/repos","events_url":"https://api.github.com/users/edx/events{/privacy}","received_events_url":"https://api.github.com/users/edx/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/edx/open-edx-proposals","description":"Proposals for Open edX architecture, best practices and processes ","fork":false,"url":"https://api.github.com/repos/edx/open-edx-proposals","forks_url":"https://api.github.com/repos/edx/open-edx-proposals/forks","keys_url":"https://api.github.com/repos/edx/open-edx-proposals/keys{/key_id}","collaborators_url":"https://api.github.com/repos/edx/open-edx-proposals/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/edx/open-edx-proposals/teams","hooks_url":"https://api.github.com/repos/edx/open-edx-proposals/hooks","issue_events_url":"https://api.github.com/repos/edx/open-edx-proposals/issues/events{/number}","events_url":"https://api.github.com/repos/edx/open-edx-proposals/events","assignees_url":"https://api.github.com/repos/edx/open-edx-proposals/assignees{/user}","branches_url":"https://api.github.com/repos/edx/open-edx-proposals/branches{/branch}","tags_url":"https://api.github.com/repos/edx/open-edx-proposals/tags","blobs_url":"https://api.github.com/repos/edx/open-edx-proposals/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/edx/open-edx-proposals/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/edx/open-edx-proposals/git/refs{/sha}","trees_url":"https://api.github.com/repos/edx/open-edx-proposals/git/trees{/sha}","statuses_url":"https://api.github.com/repos/edx/open-edx-proposals/statuses/{sha}","languages_url":"https://api.github.com/repos/edx/open-edx-proposals/languages","stargazers_url":"https://api.github.com/repos/edx/open-edx-proposals/stargazers","contributors_url":"https://api.github.com/repos/edx/open-edx-proposals/contributors","subscribers_url":"https://api.github.com/repos/edx/open-edx-proposals/subscribers","subscription_url":"https://api.github.com/repos/edx/open-edx-proposals/subscription","commits_url":"https://api.github.com/repos/edx/open-edx-proposals/commits{/sha}","git_commits_url":"https://api.github.com/repos/edx/open-edx-proposals/git/commits{/sha}","comments_url":"https://api.github.com/repos/edx/open-edx-proposals/comments{/number}","issue_comment_url":"https://api.github.com/repos/edx/open-edx-proposals/issues/comments{/number}","contents_url":"https://api.github.com/repos/edx/open-edx-proposals/contents/{+path}","compare_url":"https://api.github.com/repos/edx/open-edx-proposals/compare/{base}...{head}","merges_url":"https://api.github.com/repos/edx/open-edx-proposals/merges","archive_url":"https://api.github.com/repos/edx/open-edx-proposals/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/edx/open-edx-proposals/downloads","issues_url":"https://api.github.com/repos/edx/open-edx-proposals/issues{/number}","pulls_url":"https://api.github.com/repos/edx/open-edx-proposals/pulls{/number}","milestones_url":"https://api.github.com/repos/edx/open-edx-proposals/milestones{/number}","notifications_url":"https://api.github.com/repos/edx/open-edx-proposals/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/edx/open-edx-proposals/labels{/name}","releases_url":"https://api.github.com/repos/edx/open-edx-proposals/releases{/id}","deployments_url":"https://api.github.com/repos/edx/open-edx-proposals/deployments","created_at":"2016-03-31T15:36:33Z","updated_at":"2018-04-14T20:52:46Z","pushed_at":"2018-04-14T20:56:04Z","git_url":"git://github.com/edx/open-edx-proposals.git","ssh_url":"git@github.com:edx/open-edx-proposals.git","clone_url":"https://github.com/edx/open-edx-proposals.git","svn_url":"https://github.com/edx/open-edx-proposals","homepage":"http://open-edx-proposals.readthedocs.io/","size":1421,"stargazers_count":7,"watchers_count":7,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":6,"mirror_url":null,"archived":false,"open_issues_count":4,"license":null,"forks":6,"open_issues":4,"watchers":7,"default_branch":"master"}},"base":{"label":"edx:master","ref":"master","sha":"09994df1131360b524b8580e743510b2d3b94af4","user":{"login":"edx","id":3179841,"avatar_url":"https://avatars3.githubusercontent.com/u/3179841?v=4","gravatar_id":"","url":"https://api.github.com/users/edx","html_url":"https://github.com/edx","followers_url":"https://api.github.com/users/edx/followers","following_url":"https://api.github.com/users/edx/following{/other_user}","gists_url":"https://api.github.com/users/edx/gists{/gist_id}","starred_url":"https://api.github.com/users/edx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/edx/subscriptions","organizations_url":"https://api.github.com/users/edx/orgs","repos_url":"https://api.github.com/users/edx/repos","events_url":"https://api.github.com/users/edx/events{/privacy}","received_events_url":"https://api.github.com/users/edx/received_events","type":"Organization","site_admin":false},"repo":{"id":55162195,"name":"open-edx-proposals","full_name":"edx/open-edx-proposals","owner":{"login":"edx","id":3179841,"avatar_url":"https://avatars3.githubusercontent.com/u/3179841?v=4","gravatar_id":"","url":"https://api.github.com/users/edx","html_url":"https://github.com/edx","followers_url":"https://api.github.com/users/edx/followers","following_url":"https://api.github.com/users/edx/following{/other_user}","gists_url":"https://api.github.com/users/edx/gists{/gist_id}","starred_url":"https://api.github.com/users/edx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/edx/subscriptions","organizations_url":"https://api.github.com/users/edx/orgs","repos_url":"https://api.github.com/users/edx/repos","events_url":"https://api.github.com/users/edx/events{/privacy}","received_events_url":"https://api.github.com/users/edx/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/edx/open-edx-proposals","description":"Proposals for Open edX architecture, best practices and processes ","fork":false,"url":"https://api.github.com/repos/edx/open-edx-proposals","forks_url":"https://api.github.com/repos/edx/open-edx-proposals/forks","keys_url":"https://api.github.com/repos/edx/open-edx-proposals/keys{/key_id}","collaborators_url":"https://api.github.com/repos/edx/open-edx-proposals/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/edx/open-edx-proposals/teams","hooks_url":"https://api.github.com/repos/edx/open-edx-proposals/hooks","issue_events_url":"https://api.github.com/repos/edx/open-edx-proposals/issues/events{/number}","events_url":"https://api.github.com/repos/edx/open-edx-proposals/events","assignees_url":"https://api.github.com/repos/edx/open-edx-proposals/assignees{/user}","branches_url":"https://api.github.com/repos/edx/open-edx-proposals/branches{/branch}","tags_url":"https://api.github.com/repos/edx/open-edx-proposals/tags","blobs_url":"https://api.github.com/repos/edx/open-edx-proposals/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/edx/open-edx-proposals/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/edx/open-edx-proposals/git/refs{/sha}","trees_url":"https://api.github.com/repos/edx/open-edx-proposals/git/trees{/sha}","statuses_url":"https://api.github.com/repos/edx/open-edx-proposals/statuses/{sha}","languages_url":"https://api.github.com/repos/edx/open-edx-proposals/languages","stargazers_url":"https://api.github.com/repos/edx/open-edx-proposals/stargazers","contributors_url":"https://api.github.com/repos/edx/open-edx-proposals/contributors","subscribers_url":"https://api.github.com/repos/edx/open-edx-proposals/subscribers","subscription_url":"https://api.github.com/repos/edx/open-edx-proposals/subscription","commits_url":"https://api.github.com/repos/edx/open-edx-proposals/commits{/sha}","git_commits_url":"https://api.github.com/repos/edx/open-edx-proposals/git/commits{/sha}","comments_url":"https://api.github.com/repos/edx/open-edx-proposals/comments{/number}","issue_comment_url":"https://api.github.com/repos/edx/open-edx-proposals/issues/comments{/number}","contents_url":"https://api.github.com/repos/edx/open-edx-proposals/contents/{+path}","compare_url":"https://api.github.com/repos/edx/open-edx-proposals/compare/{base}...{head}","merges_url":"https://api.github.com/repos/edx/open-edx-proposals/merges","archive_url":"https://api.github.com/repos/edx/open-edx-proposals/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/edx/open-edx-proposals/downloads","issues_url":"https://api.github.com/repos/edx/open-edx-proposals/issues{/number}","pulls_url":"https://api.github.com/repos/edx/open-edx-proposals/pulls{/number}","milestones_url":"https://api.github.com/repos/edx/open-edx-proposals/milestones{/number}","notifications_url":"https://api.github.com/repos/edx/open-edx-proposals/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/edx/open-edx-proposals/labels{/name}","releases_url":"https://api.github.com/repos/edx/open-edx-proposals/releases{/id}","deployments_url":"https://api.github.com/repos/edx/open-edx-proposals/deployments","created_at":"2016-03-31T15:36:33Z","updated_at":"2018-04-14T20:52:46Z","pushed_at":"2018-04-14T20:56:04Z","git_url":"git://github.com/edx/open-edx-proposals.git","ssh_url":"git@github.com:edx/open-edx-proposals.git","clone_url":"https://github.com/edx/open-edx-proposals.git","svn_url":"https://github.com/edx/open-edx-proposals","homepage":"http://open-edx-proposals.readthedocs.io/","size":1421,"stargazers_count":7,"watchers_count":7,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":6,"mirror_url":null,"archived":false,"open_issues_count":4,"license":null,"forks":6,"open_issues":4,"watchers":7,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/edx/open-edx-proposals/pulls/56"},"html":{"href":"https://github.com/edx/open-edx-proposals/pull/56"},"issue":{"href":"https://api.github.com/repos/edx/open-edx-proposals/issues/56"},"comments":{"href":"https://api.github.com/repos/edx/open-edx-proposals/issues/56/comments"},"review_comments":{"href":"https://api.github.com/repos/edx/open-edx-proposals/pulls/56/comments"},"review_comment":{"href":"https://api.github.com/repos/edx/open-edx-proposals/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/edx/open-edx-proposals/pulls/56/commits"},"statuses":{"href":"https://api.github.com/repos/edx/open-edx-proposals/statuses/7bc91ce3c0c6e81c9fc2cc3b88e15de594525432"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"nasthagiri"}}