{"action":"created","comment":{"url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/comments/23197651","id":23197651,"diff_hunk":"@@ -0,0 +1,213 @@\n+# TuxedoJS In a Nutshell\n+>`TuxedoJS` is a client-side CommonJS based web development framework built on Facebook's awesome `React` view-layer and `Flux` Architecture. It provides a semantic interface for working with `Flux` and augmented `React` components for managing different aspects of the view logic. `Tux` also provides some powerful prebuilt animation components that make animating transitions in `React`  a synch. Lastly, `TuxedoJS` leverages CommonJS modules to provide a completely modular framework which means, unlike other popular frameworks, you only load the pieces of `Tux` you actually intend to use.\n+\n+## The React View Layer\n+`TuxedoJS` leverages `React` for its views. `React` is Facebook's new high performance view library that provides really clean and semantic language for defining how your views should be rendered and when/how they should update. You can read more about `React` [here](http://facebook.github.io/react/). `React` is a purely JavaScript based view layer. It uses a virtual DOM to compare the current DOM state to the new DOM state when updating so that it can submit only the minimal changes required to update the DOM. Changing the virtual DOM is very fast compared to updating the actual DOM thus this extra step amounts to a huge performance gain for `React`. Lastly, `React` is often written using [JSX](http://facebook.github.io/react/docs/displaying-data.html) syntax, which allows you to write pseudo-html in JavaScript.\n+\n+```javascript\n+    var AwesomeView = React.createClass({\n+      render: function () {\n+        return (\n+          <h1>Hello World!</h1>\n+        );\n+      }\n+    });\n+```\n+\n+## The Flux Architecture\n+`TuxedoJS` is built on Facebook's [Flux](https://facebook.github.io/flux/) architecture. The two key concepts of `Flux` are one-way data flow and the `Dispatcher`. With one way data flow, views and `stores` (in `Flux` models/collections are replaced with stores) do not communicate back and forth as in standard MVC applications. Instead, views communicate with stores through a Dispatcher. This Dispatcher can be thought of as a Controller in normal MVC applications. However, unlike in standard MVC architectures, there is only one Dispatcher.\n+\n+The Dispatcher manages all the view and server events (in `Flux` these are called `actions`) and then dispatches those actions. Every store in a `Flux` application registers itself with the Dispatcher in order to listen to its dispatched actions and simply decides for itself which actions are relevant to it. Then, the stores that have updated emit update events to inform their views that they need to come and get the new data. This design dramatically simplifies data flow in an app and allows stores to fully encapsulate their data with as little coupling as possible. Normally, in a `Flux` application the Views will respond to user interaction by triggering `Action Helpers`, which usually will make Ajax requests or some other kind of asynchronous request and then dispatch the corresponding `Action` when the request completes.\n+\n+![Flux Architecture Diagram](http://facebook.github.io/flux/img/flux-simple-f8-diagram-with-client-action-1300w.png \"Flux Architecture Diagram\")\n+\n+## Where Tux Fits In\n+`React` and `Flux` are both very powerful. They are even more powerful when used together since the two pieces fit together perfectly to provide all the functionality needed for an app. However, currently there is substantial glue code associated with getting `React` and `Flux` up and running and communicating with each other. More importantly, the standard `Flux` implementation relies on string comparisons and switch statements both of which are extremely fragile and can introduce difficult to track down bugs in a codebase. Lastly, although `Flux` decouples stores as much as possible, sometimes stores will still dependent on each other and managing those dependencies in `Flux` can be an absolute nightmare.\n+\n+`TuxedoJS` solves these problems by wrapping `React` and `Flux` together into a single framework that abstracts away all of the boilerplate and complexity associated with getting a `Flux` application up and running and communicating with React. Additionally, `Tux` Provides powerful augmented `React` Classes that are designed to handle different aspects of the app frontend such as managing state and listening to events from stores. The `TuxedoJS` app architecture looks like the following:\n+\n+NEED IMAGE\n+\n+Let's dive in to what these different pieces actually represent.\n+\n+### The Modular Framework Structure\n+In the below examples we are using the `require` syntax associated with `CommonJS` modules. Of note is the fact that we are never writing the line `require('tux');`. That's because there is no global object to require for TuxedoJS. Instead, `Tux` is broken up into individual modules that handle a particular aspect of your application. What's the advantage of this?\n+\n+Firstly, it allows you to write semantic require statements that make it extremely clear what `Tux` modules you need for your individual app components.\n+\n+Secondly, it means that, unlike with other popular frameworks, `Tux` never adds any more weight to your app than what you need for your purposes. For example, `TuxedoJS` comes prepackaged with beautiful animations. If you don't want to use them however, they never get loaded and thus never add any bytes to your JavaScript files. Even better, if you want to use just one or some `TuxedoJS` prebuilt animations, simply require those animations and use them, no other animations will get bundled. If you don't need `Tux` Architecture for an app, simply don't require it and it will never get loaded.\n+\n+```javascript\n+    var Actions = require('tux/Actions');\n+    var Stores = require('tux/Stores');\n+    var React = require('tux/React');\n+    var Architecture = require('tux/Architecture');\n+    var Fly = require('tux/Animations/Fly');\n+    var FadeDownBig = require('tux/Animations/Fade/DownBig');\n+```\n+\n+### TuxedoJS allows you to write out all of your inter-store relationships in one file using a simple and declarative syntax.\n+This turns the process of managing store relationships from frustrating and difficult to easy and self-documenting, allowing you and future engineers using your codebase to easily reason about your application architecture. `TuxedoJS` is the first framework we know of that allows you to write out your model dependencies in such a clean and simple syntax and we are extremely excited to use this syntax in building complex web apps.\n+\n+```javascript\n+    //in our main.js or similar file\n+\n+    var roomStore = require('./stores/roomStore');\n+    var userStore = require('./stores/userStore');\n+    var messageStore = require('./stores/messageStore');\n+\n+    var architect = require('tux/Architecture').architect;\n+\n+    architect(userStore).itOutputs('usernames');\n+    architect(roomStore).itNeeds('usernames').itOutputs('message rooms');\n+    architect(messageStore).itNeeds('message rooms');\n+```\n+\n+### TuxedoJS abstracts away the Dispatcher and provides a vastly improved syntax for dispatching and listening to actions\n+This allows you to dispatch and listen for actions in a declarative, simple, and safe fashion. Additionally, unlike in `Flux` where it is necessary to use Action Helpers to manage async requests with actions, `TuxedoJS` provides a powerful and semantic `before` method syntax, allowing an action to decide for itself what callbacks need to be invoked before it can dispatch its action.\n+\n+```javascript\n+    var Actions = require('tux/Actions');\n+\n+    var roomActions = Actions.createActionCategory({\n+      category: 'rooms',\n+      source: 'room views',\n+      actions: ['get', 'add', 'remove']\n+    });\n+\n+    //the dispatchGet input is the method that will actually dispatch our rooms/get action. Thus, here we are submitting an Ajax request and then dispatching the results of that request for our rooms/get action whenever roomActions.get method is invoked\n+    roomActions.before('get', function (dispatchGet) {\n+      ajaxRequest('/rooms', 'GET').then(function (results) {\n+        dispatchGet(results);\n+      });\n+    });\n+\n+    module.exports = roomActions;\n+```\n+\n+### TuxedoJS makes it easy to create stores and hook them up with your actions\n+`TuxedoJS` abstracts away all of the boilerplate associated with creating stores and makes it easy to connect stores with actions and views.\n+\n+```javascript\n+    var Stores = require('tux/Stores');\n+    var roomActions = require('../actions/roomActions');\n+\n+    var roomStore = Stores.createStore({\n+      _rooms = [],\n+\n+      getAll: function () {\n+        return this._rooms;\n+      },\n+\n+      onGetDispatch: function (roomsData) {\n+        this._rooms = roomsData;\n+        this.emitChange();\n+      }\n+    });\n+\n+    roomActions.register(roomStore, {\n+      //registered callbacks are invoked with the context of the passed in store by default so we don't need to do any binding here\n+      get: roomStore.onGetDispatch\n+    });\n+\n+    module.exports = roomStore;\n+```\n+\n+### TuxedoJS provides powerful augmented `React` syntax which makes it extremely easy to connect your state managing views with your stores\n+`TuxedoJS` provides opinionated `React` classes with built in convenience methods for performing distinct operations in your app. The augmented class in the example below possesses tools for easily and semantically connecting with `Tux` Stores.\n+\n+**NOTE** here that we are storing the result of `require('tux/React')` in a variable called `React` here. This is to take advantage of React's beautiful JSX syntax, which automatically converts JSX to `React.METHOD NAME`.\n+\n+```javascript\n+    var React = require('tux/React');\n+    var roomStore = require('../stores/roomStore');\n+    var roomActions = require('../actions/roomActions');\n+\n+     //for this example let's imagine we have created a Rooms and RoomCreateForm TuxReact class","path":"docs/Overview.md","position":126,"original_position":126,"commit_id":"0fe69d91d3b552197fb18a8a3b5d6c50cd5f3d22","original_commit_id":"0fe69d91d3b552197fb18a8a3b5d6c50cd5f3d22","user":{"login":"Cheerazar","id":5581107,"avatar_url":"https://avatars.githubusercontent.com/u/5581107?v=3","gravatar_id":"","url":"https://api.github.com/users/Cheerazar","html_url":"https://github.com/Cheerazar","followers_url":"https://api.github.com/users/Cheerazar/followers","following_url":"https://api.github.com/users/Cheerazar/following{/other_user}","gists_url":"https://api.github.com/users/Cheerazar/gists{/gist_id}","starred_url":"https://api.github.com/users/Cheerazar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Cheerazar/subscriptions","organizations_url":"https://api.github.com/users/Cheerazar/orgs","repos_url":"https://api.github.com/users/Cheerazar/repos","events_url":"https://api.github.com/users/Cheerazar/events{/privacy}","received_events_url":"https://api.github.com/users/Cheerazar/received_events","type":"User","site_admin":false},"body":"Out dent one space.","created_at":"2015-01-20T01:11:35Z","updated_at":"2015-01-20T01:11:35Z","html_url":"https://github.com/TuxedoJS/TuxedoJS/pull/120#discussion_r23197651","pull_request_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/120","_links":{"self":{"href":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/comments/23197651"},"html":{"href":"https://github.com/TuxedoJS/TuxedoJS/pull/120#discussion_r23197651"},"pull_request":{"href":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/120"}}},"pull_request":{"url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/120","id":27560692,"html_url":"https://github.com/TuxedoJS/TuxedoJS/pull/120","diff_url":"https://github.com/TuxedoJS/TuxedoJS/pull/120.diff","patch_url":"https://github.com/TuxedoJS/TuxedoJS/pull/120.patch","issue_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/issues/120","number":120,"state":"open","locked":false,"title":"Add TuxedoJS Overview doc.","user":{"login":"drabinowitz","id":7275304,"avatar_url":"https://avatars.githubusercontent.com/u/7275304?v=3","gravatar_id":"","url":"https://api.github.com/users/drabinowitz","html_url":"https://github.com/drabinowitz","followers_url":"https://api.github.com/users/drabinowitz/followers","following_url":"https://api.github.com/users/drabinowitz/following{/other_user}","gists_url":"https://api.github.com/users/drabinowitz/gists{/gist_id}","starred_url":"https://api.github.com/users/drabinowitz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/drabinowitz/subscriptions","organizations_url":"https://api.github.com/users/drabinowitz/orgs","repos_url":"https://api.github.com/users/drabinowitz/repos","events_url":"https://api.github.com/users/drabinowitz/events{/privacy}","received_events_url":"https://api.github.com/users/drabinowitz/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-01-17T19:08:15Z","updated_at":"2015-01-20T01:11:35Z","closed_at":null,"merged_at":null,"merge_commit_sha":"fcb91d511131b0d7bddfe1565b928c92752735e9","assignee":{"login":"drabinowitz","id":7275304,"avatar_url":"https://avatars.githubusercontent.com/u/7275304?v=3","gravatar_id":"","url":"https://api.github.com/users/drabinowitz","html_url":"https://github.com/drabinowitz","followers_url":"https://api.github.com/users/drabinowitz/followers","following_url":"https://api.github.com/users/drabinowitz/following{/other_user}","gists_url":"https://api.github.com/users/drabinowitz/gists{/gist_id}","starred_url":"https://api.github.com/users/drabinowitz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/drabinowitz/subscriptions","organizations_url":"https://api.github.com/users/drabinowitz/orgs","repos_url":"https://api.github.com/users/drabinowitz/repos","events_url":"https://api.github.com/users/drabinowitz/events{/privacy}","received_events_url":"https://api.github.com/users/drabinowitz/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/120/commits","review_comments_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/120/comments","review_comment_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/comments/{number}","comments_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/issues/120/comments","statuses_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/statuses/0fe69d91d3b552197fb18a8a3b5d6c50cd5f3d22","head":{"label":"drabinowitz:TuxOverviewDoc","ref":"TuxOverviewDoc","sha":"0fe69d91d3b552197fb18a8a3b5d6c50cd5f3d22","user":{"login":"drabinowitz","id":7275304,"avatar_url":"https://avatars.githubusercontent.com/u/7275304?v=3","gravatar_id":"","url":"https://api.github.com/users/drabinowitz","html_url":"https://github.com/drabinowitz","followers_url":"https://api.github.com/users/drabinowitz/followers","following_url":"https://api.github.com/users/drabinowitz/following{/other_user}","gists_url":"https://api.github.com/users/drabinowitz/gists{/gist_id}","starred_url":"https://api.github.com/users/drabinowitz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/drabinowitz/subscriptions","organizations_url":"https://api.github.com/users/drabinowitz/orgs","repos_url":"https://api.github.com/users/drabinowitz/repos","events_url":"https://api.github.com/users/drabinowitz/events{/privacy}","received_events_url":"https://api.github.com/users/drabinowitz/received_events","type":"User","site_admin":false},"repo":{"id":28929710,"name":"TuxedoJS","full_name":"drabinowitz/TuxedoJS","owner":{"login":"drabinowitz","id":7275304,"avatar_url":"https://avatars.githubusercontent.com/u/7275304?v=3","gravatar_id":"","url":"https://api.github.com/users/drabinowitz","html_url":"https://github.com/drabinowitz","followers_url":"https://api.github.com/users/drabinowitz/followers","following_url":"https://api.github.com/users/drabinowitz/following{/other_user}","gists_url":"https://api.github.com/users/drabinowitz/gists{/gist_id}","starred_url":"https://api.github.com/users/drabinowitz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/drabinowitz/subscriptions","organizations_url":"https://api.github.com/users/drabinowitz/orgs","repos_url":"https://api.github.com/users/drabinowitz/repos","events_url":"https://api.github.com/users/drabinowitz/events{/privacy}","received_events_url":"https://api.github.com/users/drabinowitz/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/drabinowitz/TuxedoJS","description":"","fork":true,"url":"https://api.github.com/repos/drabinowitz/TuxedoJS","forks_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/forks","keys_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/keys{/key_id}","collaborators_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/teams","hooks_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/hooks","issue_events_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/issues/events{/number}","events_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/events","assignees_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/assignees{/user}","branches_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/branches{/branch}","tags_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/tags","blobs_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/git/refs{/sha}","trees_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/git/trees{/sha}","statuses_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/statuses/{sha}","languages_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/languages","stargazers_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/stargazers","contributors_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/contributors","subscribers_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/subscribers","subscription_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/subscription","commits_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/commits{/sha}","git_commits_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/git/commits{/sha}","comments_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/comments{/number}","issue_comment_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/issues/comments/{number}","contents_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/contents/{+path}","compare_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/compare/{base}...{head}","merges_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/merges","archive_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/downloads","issues_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/issues{/number}","pulls_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/pulls{/number}","milestones_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/milestones{/number}","notifications_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/labels{/name}","releases_url":"https://api.github.com/repos/drabinowitz/TuxedoJS/releases{/id}","created_at":"2015-01-07T19:19:51Z","updated_at":"2015-01-07T19:19:51Z","pushed_at":"2015-01-20T00:59:17Z","git_url":"git://github.com/drabinowitz/TuxedoJS.git","ssh_url":"git@github.com:drabinowitz/TuxedoJS.git","clone_url":"https://github.com/drabinowitz/TuxedoJS.git","svn_url":"https://github.com/drabinowitz/TuxedoJS","homepage":null,"size":578,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":true,"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":"TuxedoJS:master","ref":"master","sha":"80eb3f0ffd86e9d0ac0bc263d8fc861a3ef742b4","user":{"login":"TuxedoJS","id":10237217,"avatar_url":"https://avatars.githubusercontent.com/u/10237217?v=3","gravatar_id":"","url":"https://api.github.com/users/TuxedoJS","html_url":"https://github.com/TuxedoJS","followers_url":"https://api.github.com/users/TuxedoJS/followers","following_url":"https://api.github.com/users/TuxedoJS/following{/other_user}","gists_url":"https://api.github.com/users/TuxedoJS/gists{/gist_id}","starred_url":"https://api.github.com/users/TuxedoJS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TuxedoJS/subscriptions","organizations_url":"https://api.github.com/users/TuxedoJS/orgs","repos_url":"https://api.github.com/users/TuxedoJS/repos","events_url":"https://api.github.com/users/TuxedoJS/events{/privacy}","received_events_url":"https://api.github.com/users/TuxedoJS/received_events","type":"Organization","site_admin":false},"repo":{"id":28203450,"name":"TuxedoJS","full_name":"TuxedoJS/TuxedoJS","owner":{"login":"TuxedoJS","id":10237217,"avatar_url":"https://avatars.githubusercontent.com/u/10237217?v=3","gravatar_id":"","url":"https://api.github.com/users/TuxedoJS","html_url":"https://github.com/TuxedoJS","followers_url":"https://api.github.com/users/TuxedoJS/followers","following_url":"https://api.github.com/users/TuxedoJS/following{/other_user}","gists_url":"https://api.github.com/users/TuxedoJS/gists{/gist_id}","starred_url":"https://api.github.com/users/TuxedoJS/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/TuxedoJS/subscriptions","organizations_url":"https://api.github.com/users/TuxedoJS/orgs","repos_url":"https://api.github.com/users/TuxedoJS/repos","events_url":"https://api.github.com/users/TuxedoJS/events{/privacy}","received_events_url":"https://api.github.com/users/TuxedoJS/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/TuxedoJS/TuxedoJS","description":"","fork":false,"url":"https://api.github.com/repos/TuxedoJS/TuxedoJS","forks_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/forks","keys_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/keys{/key_id}","collaborators_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/teams","hooks_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/hooks","issue_events_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/issues/events{/number}","events_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/events","assignees_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/assignees{/user}","branches_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/branches{/branch}","tags_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/tags","blobs_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/git/refs{/sha}","trees_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/git/trees{/sha}","statuses_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/statuses/{sha}","languages_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/languages","stargazers_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/stargazers","contributors_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/contributors","subscribers_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/subscribers","subscription_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/subscription","commits_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/commits{/sha}","git_commits_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/git/commits{/sha}","comments_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/comments{/number}","issue_comment_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/issues/comments/{number}","contents_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/contents/{+path}","compare_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/compare/{base}...{head}","merges_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/merges","archive_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/downloads","issues_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/issues{/number}","pulls_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls{/number}","milestones_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/milestones{/number}","notifications_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/labels{/name}","releases_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/releases{/id}","created_at":"2014-12-18T21:58:57Z","updated_at":"2015-01-19T21:59:32Z","pushed_at":"2015-01-19T21:59:32Z","git_url":"git://github.com/TuxedoJS/TuxedoJS.git","ssh_url":"git@github.com:TuxedoJS/TuxedoJS.git","clone_url":"https://github.com/TuxedoJS/TuxedoJS.git","svn_url":"https://github.com/TuxedoJS/TuxedoJS","homepage":null,"size":1189,"stargazers_count":8,"watchers_count":8,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":4,"mirror_url":null,"open_issues_count":38,"forks":4,"open_issues":38,"watchers":8,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/120"},"html":{"href":"https://github.com/TuxedoJS/TuxedoJS/pull/120"},"issue":{"href":"https://api.github.com/repos/TuxedoJS/TuxedoJS/issues/120"},"comments":{"href":"https://api.github.com/repos/TuxedoJS/TuxedoJS/issues/120/comments"},"review_comments":{"href":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/120/comments"},"review_comment":{"href":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/120/commits"},"statuses":{"href":"https://api.github.com/repos/TuxedoJS/TuxedoJS/statuses/0fe69d91d3b552197fb18a8a3b5d6c50cd5f3d22"}}}}