{"action":"created","comment":{"url":"https://api.github.com/repos/edx/open-edx-proposals/pulls/comments/86189299","pull_request_review_id":6859403,"id":86189299,"diff_hunk":"@@ -0,0 +1,412 @@\n+================================\n+OEP-11: Front End Best Practices\n+================================\n+\n++---------------+-------------------------------------------+\n+| OEP           | :doc:`OEP-11 </oeps/oep-0011>`            |\n++---------------+-------------------------------------------+\n+| Title         | Front End Best Practices                  |\n++---------------+-------------------------------------------+\n+| Last Modified | 2016-10-19                                |\n++---------------+-------------------------------------------+\n+| Author        | Andy Armstrong <andya@edx.org>            |\n++---------------+-------------------------------------------+\n+| Arbiter       | TBD                                       |\n++---------------+-------------------------------------------+\n+| Status        | Draft                                     |\n++---------------+-------------------------------------------+\n+| Type          | Best Practice                             |\n++---------------+-------------------------------------------+\n+| Created       | 2016-10-19                                |\n++---------------+-------------------------------------------+\n+\n+Abstract\n+========\n+\n+This document describes the best practices for developing front end applications\n+and components for Open edX. It covers the techniques and approaches that\n+are currently recommended, as well as the suggested technologies and libraries\n+that should be used.\n+\n+\n+Motivation\n+==========\n+\n+The front end landscape is large, confusing and constantly changing. A good\n+place to get an overview of the industry's current best practices is\n+`The State of JavaScript 2016 Survey`_.\n+\n+Open edX is a large platform that provides its front end functionality in\n+a variety of ways. The major applications (Studio, LMS, Insights, Otto) are\n+built as Django views that return rendered pages consisting of HTML, CSS and\n+JavaScript. In addition, components can be created with `XBlocks`_ which use\n+Python code to render themselves as HTML fragments along with their CSS and\n+JavaScript dependencies.\n+\n+Within this document, the phrase \"front end\" is used to mean any part\n+of the platform that is shown to users. This phrase is a little confusing\n+as the front end is generated by Django views which are implemented as\n+Python code running on a \"back end\" server. The true back end is the\n+APIs that the front end communicates with to access and update information\n+on behalf of the user.\n+\n+Note: this document provides many recommendations which are provided as\n+guides when developing new front ends. It is important to always use the\n+best tool for the job, so there will be situations where an alternative\n+approach or technology should be adopted.\n+\n+Specification\n+=============\n+\n+Best Practices\n+~~~~~~~~~~~~~~\n+\n+1. **Use server-side rendering whenever possible**\n+\n+   Rationale: Server-side rendering gives the content to the user\n+   immediately without requiring additional round-trips. This can make\n+   for large performance improvements on slow networks or mobile devices.\n+\n+   When a dynamic client-side experience is required, then the server-side\n+   page should include JavaScript code along with the HTML. See the\n+   technical recommendations below for more detail.\n+\n+2. **Front-ends should be self-contained**\n+\n+   Rationale: Front end applications require a variety of types of assets\n+   that need to be managed together, including code, styles, templates, and\n+   images. For Django apps and XBlocks, all of these assets should live\n+   within the app's or block's own directory rather than being located\n+   in shared locations within the consuming application. Ideally, apps or blocks\n+   should live in their own repository and should be pip installed into\n+   and should be pip installed into the main application.\n+\n+3. **Designs should be built upon patterns from the edX Pattern Library**\n+\n+   Rationale: The `edX Pattern Library`_  is a collection of web application\n+   components and visual styles that can be used to develop UIs that are\n+   consistent with the edX platform. Using the pattern library ensures that\n+   web applications follow best practices for user experience, theming,\n+   and accessibility.\n+\n+   You can learn more about building user interfaces with the pattern\n+   library in the Developer's Guide chapter `Developing User Interfaces`_.\n+\n+4. **Front-ends should consume and extract reusable UI components**\n+\n+   Rationale: when developing new applications, developers should prefer\n+   reuse of existing components over building custom front end logic.\n+   If a new component is required, it should be built as a new reusable\n+   addition to the `edX UI Toolkit`_, based upon patterns from the\n+   `edX Pattern Library`_. This ensures that future development can\n+   reuse this component, while also standardizing how it behaves\n+   for the user in terms of user interface, accessibility, theming\n+   and so on.\n+\n+6. **Front-ends should manage history consistently**\n+\n+   Rationale: it is important that rich-client applications provide a\n+   consistent history to their users. This includes both the ability to\n+   use the back button in a natural way, and to be able to use URLs to\n+   deep link to any part of the application. History should be updated\n+   for every action that feels to the user that they are on a new page.\n+\n+7. **Features should work equally well on mobile and web platforms**\n+\n+   Rationale: Open edX provides iOS and Android applications in addition\n+   to its web applications, and so new learner features need to be implemented\n+   for all three platforms. The simplest way to achieve feature parity is to\n+   provide a responsive web experience that can be used on phones and tablets\n+   as well as on desktops and laptops. The `edx Pattern Library`_ helps with\n+   this by providing a responsive grid system along with components that\n+   work equally well on mobile and web.\n+\n+8. **Designs should be fully accessible**\n+\n+   Rationale: Open edX measures and evaluates accessibility using the World\n+   Wide Web Consortium’s `Web Content Accessibility Guidelines (WCAG) 2.0`_.\n+   All features merged into edX repositories are expected to conform to\n+   Level AA of this specification and to satisfy the requirements outlined in\n+   the `edX Website Accessibility Policy`_.\n+\n+   You can learn more about developing accessible applications with\n+   the Developer's Guide chapter `edX Accessibility Guidelines`_.\n+\n+9. **Front end applications should support localization**\n+\n+   Rationale: Open edX is used by learners all over the world, and so\n+   it is critical that all new functionality support localization. This means\n+   that every string in an application should be marked for translation,\n+   and it also includes ensuring that all new user interfaces will switch to\n+   right-to-left mode when the language requires it.\n+\n+   You can learn more about localization with the Developer's Guide\n+   chapter `edX Internationalization`_.\n+\n+10. **Front end implementations should support theming**\n+\n+   Rationale: Open edX is used by organizations around the world,\n+   and each one requires that the user experience is based upon their\n+   own brand. This includes elements as simple as overriding the fonts,\n+   imagery and color schemes, to more complex customization of headers,\n+   footers and registration flows.\n+\n+   You can learn more about how Open edX supports theming with\n+   the guide `Changing Themes for an Open edX Site`_. One simple way to\n+   make your interface themeable is to use patterns from the\n+   `edX Pattern Library`_ as they already support theming.\n+\n+11. **Front end code should be safe from cross site scripting**\n+\n+   Cross Site Scripting (XSS) vulnerabilities allow user-supplied data to be\n+   incorrectly executed as code in a web browser. This can allow an attacker\n+   to inject malicious scripts, which in the worst case can cause the loss\n+   of private user data.\n+\n+   In order to keep your code safe from such attackers, you should follow the\n+   best practices laid out in the guide\n+   `Preventing Cross Site Scripting Vulnerabilities`_.\n+\n+Technology Selection\n+~~~~~~~~~~~~~~~~~~~~\n+\n+1. **Server-side content should be rendered with Django Templates**\n+\n+   Rationale: There are many template languages available for Django,\n+   but the simplest option is to use the built-in Django template engine.\n+   The Open edX codebase has a mixture of Django and Mako templates, but the\n+   former are easier to reason about because they don't support arbitrary\n+   code evaluation. See `Reasons for rejecting Mako`_ for a more detailed\n+   explanation.\n+\n+   **Exception**: Mako templates can continue to be used within edx-platform\n+   for consistency with the existing code base. This is because the base\n+   templates and theming support are all provided via Mako, so it is too\n+   much to expect a new feature to be implemented with a different framework.\n+   There is much desire to replace Mako within edx-platform so this\n+   exception may eventually be removed.\n+\n+2. **ECMAScript 2015 should be the supported version of JavaScript**\n+\n+   Rationale: ECMAScript is the standardized version of JavaScript,\n+   and modern front end libraries typically use ES2015 (aka ES6).\n+   Most browsers now provide native support for ES2015, but to support\n+   ES2016 or older browsers it is recommended to use `Babel`_ which can\n+   transpile various JavaScript dialects into ES5 (or ES2015, in the future).\n+\n+   Note: use of ES2015 features should be preferred to the use of older\n+   libraries such as CoffeeScript and Underscore which have been subsumed\n+   into the newer standard.\n+\n+3. **JavaScript libraries should be installed via npm**\n+\n+   Rationale: It is important that JavaScript libraries are kept\n+   up-to-date, and one key component is to make it as simple as possible\n+   to perform upgrades. Projects that use npm maintain all of their\n+   library requirements in a single package.json file, which can be\n+   easily changed as the versions change.\n+\n+4. **JavaScript code should follow the edX ESLint configuration**\n+\n+   Rationale: In order to standardize and enforce Open edX's JavaScript\n+   coding style across multiple codebases, edX has published an ESLint\n+   configuration that provides an enforceable specification. The\n+   `edX ESLint Config`_ is made available as an npm package that can be\n+   installed into any Open edX package.\n+\n+5. **Use React and Redux when building new client-side applications**\n+\n+   Rationale: There are a large number of JavaScript libraries for\n+   building rich client applications, but many of them are too\n+   rigid for a flexible, extensible codebase like Open edX. The\n+   edX front end working group (aka FedX) has chosen the combination\n+   of React and Redux as the optimal way to build new client-side\n+   applications. A great primer on the benefits of this approach is\n+   `A Study Plan to Cure JavaScript Fatigue`_.\n+\n+   An interesting area for future exploration is `React Native`_ which\n+   is a variant of React that can be used to render native iOS and Android\n+   applications. This could be a potential solution to build consistent\n+   experiences more efficiently across web and mobile. See `React at edX`_\n+   for more details.\n+\n+   Note: the other modern library that many organizations are using\n+   is Angular 2.  See `Reasons for rejecting Angular`_ for an exploration\n+   as to why this does not work as well as React for edX.\n+\n+   Exception: when building new applications within edx-platform, it\n+   is currently acceptable to use Backbone.  Backbone is a somewhat old\n+   technology in the JavaScript world and has seen a rapid drop off in usage\n+   within the community. The plan is to incrementally adopt React within\n+   edx-platform as it can interoperate cleanly with Backbone.\n+\n+6. **JavaScript dependencies should be managed with AMD modules**\n+\n+   Rationale: Open edX is a large, complicated code base, and it is\n+   getting more tangled over time. It is important that applications be\n+   composed as modules, and AMD is the standard module system for JavaScript.\n+   It allows code to declare the dependencies it requires, rather than forcing\n+   every page to load all possible libraries.\n+\n+   A majority of edX code uses `RequireJS`_ (and its associated libraries\n+   RequireJS Text and RequireJS Optimizer) to handle AMD modueles. In\n+   particular, RequireJS Optimizer supports intelligent bundling to package\n+   together all required libraries into a single file for faster performance.\n+   Note that other edX applications use `Webpack`_ which can also process\n+   RequireJS-style dependencies as well as the newer Common JS standard.\n+\n+7. **CSS should be generated using SASS**\n+\n+   Rationale: Sass is an extension of CSS that adds power and elegance to\n+   the basic language. It makes the maintenance of large CSS files more\n+   manageable though the ability to use variables, mixins, imports and more.\n+   In particular, it makes theming possible with the ability to override\n+   variables that define colors, fonts etc.\n+\n+   You can find out more about Sass with the official documentation here:\n+   `Sass`_.\n+\n+8. **Applications should be built for production using Webpack**\n+\n+   Rationale: Webpack is the tool of choice for code optimization and\n+   bundling, as it is widely used throughout the industry, and because\n+   it seamlessly handles modern code bases as well as all of the older\n+   technologies used by edX, such as `RequireJS`_.\n+\n+   Note: There are already a variety of technologies used within Open edX,\n+   none of which is a clear winner. RequireJS Optimizer is used for bundling,\n+   Django Pipeline is used by edx-platform, Django Compressor is used by some\n+   of the Ecommerce applications, and Webpack is prevalent in pure front-end\n+   implementations.\n+\n+\n+Open Questions\n+==============\n+\n+.. _JavaScript frameworks:\n+\n+1. **Which more modern JavaScript framework should be supported?**\n+\n+   The JavaScript space is very fast moving as can be seen in\n+   `The State of JavaScript 2016 Survey`_. There is a lot of momentum\n+   around `React`_, and it appears to have many qualities that would\n+   make it a good fit for edX. It is too early to make this call, but\n+   plans are being made to evaluate its usage. See `React at edX`_ for\n+   more details.\n+\n+2. **How should offline support be provided?**\n+\n+   For many mobile users, it would be very useful if they could continue\n+   their Open edX courses while offline. This is true both for true mobile\n+   apps as well as for responsive web applications. This is an area that\n+   has not been explored much up to now, but which will only become more\n+   important going forward. In particular, we should look at the great\n+   capabilities provided by service workers. See the article\n+   `Service Workers: An Introduction`_ for a good starting point.","path":"oeps/oep-0011.rst","position":305,"original_position":305,"commit_id":"42a2de1d3eca400357a873a1a3ece272b320f795","original_commit_id":"42a2de1d3eca400357a873a1a3ece272b320f795","user":{"login":"cahrens","id":484484,"avatar_url":"https://avatars.githubusercontent.com/u/484484?v=3","gravatar_id":"","url":"https://api.github.com/users/cahrens","html_url":"https://github.com/cahrens","followers_url":"https://api.github.com/users/cahrens/followers","following_url":"https://api.github.com/users/cahrens/following{/other_user}","gists_url":"https://api.github.com/users/cahrens/gists{/gist_id}","starred_url":"https://api.github.com/users/cahrens/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cahrens/subscriptions","organizations_url":"https://api.github.com/users/cahrens/orgs","repos_url":"https://api.github.com/users/cahrens/repos","events_url":"https://api.github.com/users/cahrens/events{/privacy}","received_events_url":"https://api.github.com/users/cahrens/received_events","type":"User","site_admin":false},"body":"Underscore issue.","created_at":"2016-11-02T16:51:58Z","updated_at":"2016-11-02T16:51:58Z","html_url":"https://github.com/edx/open-edx-proposals/pull/32#discussion_r86189299","pull_request_url":"https://api.github.com/repos/edx/open-edx-proposals/pulls/32","_links":{"self":{"href":"https://api.github.com/repos/edx/open-edx-proposals/pulls/comments/86189299"},"html":{"href":"https://github.com/edx/open-edx-proposals/pull/32#discussion_r86189299"},"pull_request":{"href":"https://api.github.com/repos/edx/open-edx-proposals/pulls/32"}}},"pull_request":{"url":"https://api.github.com/repos/edx/open-edx-proposals/pulls/32","id":89938814,"html_url":"https://github.com/edx/open-edx-proposals/pull/32","diff_url":"https://github.com/edx/open-edx-proposals/pull/32.diff","patch_url":"https://github.com/edx/open-edx-proposals/pull/32.patch","issue_url":"https://api.github.com/repos/edx/open-edx-proposals/issues/32","number":32,"state":"open","locked":false,"title":"OEP-11: front end best practices","user":{"login":"andy-armstrong","id":5985072,"avatar_url":"https://avatars.githubusercontent.com/u/5985072?v=3","gravatar_id":"","url":"https://api.github.com/users/andy-armstrong","html_url":"https://github.com/andy-armstrong","followers_url":"https://api.github.com/users/andy-armstrong/followers","following_url":"https://api.github.com/users/andy-armstrong/following{/other_user}","gists_url":"https://api.github.com/users/andy-armstrong/gists{/gist_id}","starred_url":"https://api.github.com/users/andy-armstrong/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/andy-armstrong/subscriptions","organizations_url":"https://api.github.com/users/andy-armstrong/orgs","repos_url":"https://api.github.com/users/andy-armstrong/repos","events_url":"https://api.github.com/users/andy-armstrong/events{/privacy}","received_events_url":"https://api.github.com/users/andy-armstrong/received_events","type":"User","site_admin":false},"body":"https://openedx.atlassian.net/browse/FEDX-273\r\n\r\nThis is an early draft of an OEP for front end best practices.\r\n\r\nYou can view the proposal in rendered form here:\r\n \r\nhttps://github.com/edx/open-edx-proposals/blob/42a2de1d3eca400357a873a1a3ece272b320f795/oeps/oep-0011.rst\r\n\r\nFYI @AlasdairSwan @alisan617 @bjacobel @cahrens @dsjen \r\n","created_at":"2016-10-19T04:03:24Z","updated_at":"2016-11-02T16:51:58Z","closed_at":null,"merged_at":null,"merge_commit_sha":"84a5fa3b45c3d1f411683b8b7019955c1b7432e9","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/edx/open-edx-proposals/pulls/32/commits","review_comments_url":"https://api.github.com/repos/edx/open-edx-proposals/pulls/32/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/32/comments","statuses_url":"https://api.github.com/repos/edx/open-edx-proposals/statuses/42a2de1d3eca400357a873a1a3ece272b320f795","head":{"label":"edx:andya/front-end-best-practices","ref":"andya/front-end-best-practices","sha":"42a2de1d3eca400357a873a1a3ece272b320f795","user":{"login":"edx","id":3179841,"avatar_url":"https://avatars.githubusercontent.com/u/3179841?v=3","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://avatars.githubusercontent.com/u/3179841?v=3","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":"2016-10-19T16:36:48Z","pushed_at":"2016-11-02T16:39:28Z","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":1048,"stargazers_count":3,"watchers_count":3,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5,"mirror_url":null,"open_issues_count":6,"forks":5,"open_issues":6,"watchers":3,"default_branch":"master"}},"base":{"label":"edx:master","ref":"master","sha":"cf0dae577e43f1c58717e70500a2256e675f5f57","user":{"login":"edx","id":3179841,"avatar_url":"https://avatars.githubusercontent.com/u/3179841?v=3","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://avatars.githubusercontent.com/u/3179841?v=3","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":"2016-10-19T16:36:48Z","pushed_at":"2016-11-02T16:39:28Z","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":1048,"stargazers_count":3,"watchers_count":3,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5,"mirror_url":null,"open_issues_count":6,"forks":5,"open_issues":6,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/edx/open-edx-proposals/pulls/32"},"html":{"href":"https://github.com/edx/open-edx-proposals/pull/32"},"issue":{"href":"https://api.github.com/repos/edx/open-edx-proposals/issues/32"},"comments":{"href":"https://api.github.com/repos/edx/open-edx-proposals/issues/32/comments"},"review_comments":{"href":"https://api.github.com/repos/edx/open-edx-proposals/pulls/32/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/32/commits"},"statuses":{"href":"https://api.github.com/repos/edx/open-edx-proposals/statuses/42a2de1d3eca400357a873a1a3ece272b320f795"}}}}
{"actor":{"display_login":"cahrens"}}