{"action":"created","comment":{"url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/comments/23239671","id":23239671,"diff_hunk":"@@ -0,0 +1,449 @@\n+# Tux/React\n+\n+## Table of Contents\n+<ol>\n+  <li><a href=\"#Premise\">Premise</a></li>\n+  <li><a href=\"#React-Components-in-a-Nutshell\">React Components in a Nushell</a>\n+    <ol style=\"list-style-type:upper-alpha\">\n+      <li><a href=\"#Writing-React-and-tuxReact-in-JSX\">Writing React and tuxReact in JSX</a></li>\n+      <li><a href=\"#Rendering-in-React\">Rendering in React</a></li>\n+      <li><a href=\"#React-Components\">React Components</a>\n+        <ol style=\"list-style-type:upper-roman\">\n+          <li><a href=\"#React-Components-the-Render-Method\">the Render Method</a></li>\n+          <li><a href=\"#React-Components-Accessing-the-DOM-from-React\">Accessing the DOM from React</a></li>\n+          <li><a href=\"#React-Components-Props-and-State\">Props and State</a>\n+            <ol>\n+              <li><a href=\"#React-Components-props-children\">props.children</a></li>\n+              <li><a href=\"#React-Components-PropTypes\">PropTypes</a></li>\n+            </ol>\n+          </li>\n+          <li><a href=\"#React-Components-Lifecycle-Methods\">Lifecycle Methods</a></li>\n+        </ol>\n+      </li>\n+    </ol>\n+  </li>\n+  <li><a href=\"#TuxedoJS-and-React\">TuxedoJS and React</a>\n+    <ol>\n+      <li><a href=\"#TuxedoJS-OwnerClass\">TuxedoJS OwnerClass</a></li>\n+      <li><a href=\"#TuxedoJS-OwneeClass\">TuxedoJS OwneeClass</a></li>\n+      <li><a href=\"#TuxedoJS-MutableClass\">TuxedoJS MutableClass</a></li>\n+    </ol>\n+  </li>\n+</ol>\n+\n+## <a id=\"#Premise\"></a>Premise [#](#Premise)\n+>`React` is an extremely powerful and complex view library. `TuxedoJS` builds on its functionality in order to make it more semantic and easier to work with.\n+\n+***\n+\n+### <a id=\"React-Components-in-a-Nutshell\"></a>React Components in a Nutshell [#](#React-Components-in-a-Nutshell)\n+React is a view library designed for extremely high performance rendering. The core concept in `React` is the Virtual DOM. When `React` components update they create a virtual version of the new DOM. Then, `React` diffs the new virtual DOM with the old copy and submits only those changes between the two in order to update the real DOM. `React` is a complicated library and we recommend reviewing the full docs [here](http://facebook.github.io/react/). However, we figured it would be valuable tp provide a quick primer on `React` to give an introductory understanding.\n+\n+***\n+\n+#### <a id=\"Writing-React-and-tuxReact-in-JSX\"></a>1) Writing React and tux/React in JSX [#](#Writing-React-and-tuxReact-in-JSX)\n+`React` can be written beautiful [JSX](http://facebook.github.io/react/docs/displaying-data.html) which allows you to write React components as though they were HTML tags. We love JSX here at TuxedoJS and we stongly recommend using it. Our components are written using JSX but you do not need to write JSX with Tux. Our `React` examples in our docs will be written in JSX syntax.\n+\n+One exremely important note, if you want to use JSX with Tux (and you really should) you will need to call your `tux/React` variable `React`:\n+\n+```\n+    var React = require('tux/React');\n+```\n+\n+Why do we need to do this? Because JSX translates into `React.METHOD NAME` automatically, thus we need to call our variable `React` for our methods to work after compiling our JSX.\n+\n+In the following examples we will be writing in basic `React` syntax.\n+\n+***\n+\n+#### <a id=\"Rendering-in-React\"></a>2) Rendering in React [#](#Rendering-in-React)\n+The most common way to render a component in `React` is with the `React.render` method:\n+\n+```\n+    var React = require('react');\n+    var MyComponent = require('./components/MyComponent'); //Some component we want to render\n+    React.render(<MyComponent />, document.body); //Using JSX for MyComponent\n+```\n+\n+Oftentimes, if you are using the `tux/Router`, you will only need to invoke this method once to render the top level `Tux/Router/run` onto the DOM. This component will define your client-side application routes which will automatically render their child components when the corresponding route is reached:\n+\n+```\n+    var React = require('tux/React');\n+    var routes = require('./routes'); //your application routes\n+    var run = require('tux/Router/run');\n+\n+    run(routes, function (Handler) {\n+      React.render(<Handler />, document.body); //Again using JSX for Handler\n+    });\n+```\n+\n+At that point everything else will be rendered into the DOM through the `render` methods within your individual components. Let's dive into these `React` components.\n+\n+***\n+\n+#### <a id=\"React-Components\"></a>3) React Components [#](#React-Components)\n+`React` components are defined via the `React.createClass` method. Pass in an object to this method, and `React` will return a class which you can then use to render components built from that class into the DOM:\n+\n+```\n+    var React = require('react');\n+    var MyComponent = React.createClass({\n+      render: function () {\n+        return (\n+          <h1>Hello World!</h1>\n+        );\n+      }\n+    });\n+```\n+\n+***\n+\n+#### <a id=\"React-Components-the-Render-Method\"></a>3.1) the Render Method [#](#React-Components-the-Render-Method)\n+All `React` classes must have a `render` method. The `render` method must return a single `React` component (either a basic `React` html component for rendering onto the DOM (`h1`, `div`, `p`, etc) or a `React` composite class (any custom build `React` component, for example `MyComponent` defined above is a `React` composite class).\n+\n+It might seem like returning only a single `React` component is a bit limiting. However, you can pass in child components to whatever `React` component you render. Will get more into what that actually means in the next section, but in laymens terms it means you can `render` however many components you want:\n+\n+```\n+    var React = require('react');\n+    var MyComplicatedComponent = React.createClass({\n+      var someArrayOfComponents = [<ComponentA key={0} />, <ComponentB key={1} />];\n+      render: function () {\n+        return (\n+          <div>\n+            <MyComponent className='custom-class-name' />\n+            <h1>Let's render something {thisComponentIsAwesome ? 'Awesome' : 'Lame'}</h1>\n+            { someArrayOfComponents }\n+          </div>\n+        );\n+      }\n+    });\n+```\n+\n+**NOTES**\n+1. We are wrapping `someArrayOfComponents` and our ternary expression in `{}`. That's because, in order to use Javascript variables and expressions in our JSX we need to wrap them in `{}` and we need to use ternary expressions if we want to write if else statements in our JSX. You can learn more about if-else in JSX [here](http://facebook.github.io/react/tips/if-else-in-JSX.html).\n+2. We are passing in `key` properties to our components in our array. Whenever we render an array of components we need to pass in a unique key to each one, which `React` will use to determine which components in the array have been modified and which have been deleted/added when the array updates. You can't access the `key` property from within the component itself.\n+2. There are several restrictions regarding what Javascript we can write in our JSX and you can read more about that [here](http://facebook.github.io/react/docs/jsx-in-depth.html#javascript-expressions).\n+3. We are passing in a property `className`. This, is because `class` is a reserved word in Javascript. See [here](http://facebook.github.io/react/docs/jsx-in-depth.html#html-tags-vs.-react-components) for some other differences between JSX and html\n+4. See [here](http://facebook.github.io/react/docs/jsx-gotchas.html) for all other JSX gotchas.\n+\n+***\n+\n+#### <a id=\"React-Components-Accessing-the-DOM-from-React\"></a>3.2) Accessing the DOM from React [#](#React-Components-Accessing-the-DOM-from-React)\n+`React` provides the `getDOMNode` method for accessing the actual DOM node for a particular component. This can be valuable for interacting with other libraries such as `jQuery` or reading from inputs. Normally, to use `getDOMNode` you will need to pass in a `ref` property to the component. The `ref` property allows the owning component to access the component via `this.refs.REF`. **NOTE** you cannot access the `ref` property from within the ownee component itself.\n+\n+```\n+    var InputForm = React.createClass({\n+      handleSubmit: function (e) {\n+        e.preventDefault(),\n+        this.addTodo(this.refs.inputField.value);\n+      },\n+\n+      render: function () {\n+        <form onSubmit={this.handleSubmit}>\n+          <input ref='inputField' />\n+        </form>\n+      }\n+    });\n+```\n+\n+**NOTE** here that we can access the `form` `submit` event by passing in a function under the `onSubmit` property. This is how we hook into any `DOM` event: `onEventName`.\n+\n+***\n+\n+#### <a id=\"React-Components-Props-and-State\"></a>3.3) Props and State [#](#React-Components-Props-and-State)\n+In `React` components have two ways of defining changing data, `props` and `state`. `Props` are passed down from parent components and are never updated by the component itself (under almost all circumstances). `state` is managed within the component itself and used for things like getting data from models and stores or third party APIs. It is also used for [two-way data binding in form/input validation](http://facebook.github.io/react/docs/two-way-binding-helpers.html). You never modify the `state` object directly but instead use methods like `this.setState` and `this.replaceState` to update the `state` in the component.\n+\n+Other than in the case of input validation `React` follows a one-way data flow in which very few top level components have `state` and they pass down `props` based on that state to their child components. Those components pass down `props` to their children and so on and so forth. There is a great doc [here](http://facebook.github.io/react/docs/thinking-in-react.html) about how to think in `React` and this one-way flow of data. `Props` should be things like application data, but they should also be the methods to manipulate that data. For example, if you want your `Todo` components to be able to delete themselves, they should have their delete method passed in via `props`. Why is this? Because it allows your components to be as reusable as possible. Additionally, it reduces the number of components that have to know about your actions, ajax-requests, etc. Here is what this might look like in an example `state` managing top level component\n+\n+```\n+    var React = require('react');\n+    var Todos = require('./Todos'); //some list of messages component\n+    var MyTopLevelComponent = React.createClass({\n+      //whenever a component has state it needs a getInitialState method which returns the initial state object for the component\n+      getInitialState: function () {\n+        return {\n+          todos: []\n+        };\n+      },\n+\n+      addTodo: function (todo) {\n+        //we can never modify the state object so to add our new todo we setState with our current todos concatenated with our new todo\n+        this.setState({\n+          todos: this.state.todos.concat(todo)\n+        });\n+      },\n+\n+      render: function () {\n+        return (\n+          <div>\n+            //here we are using JSX syntax to pass a todos prop and addTodo prop into our Todos component\n+            <Todos todos={this.state.todos} addTodo={this.addTodo} />\n+          </div>\n+        );\n+      }\n+    });\n+```\n+\n+**NOTES**\n+1. We are setting an initial `state` as an empty array of `todos`\n+2. We are defining our method for adding `todos` on our top level component and then passing that method in as `props` to our `Todos` component\n+3. With `JSX` we can pass in props in much the same way we pass in properties to html elements\n+4. You might be thinking: 'wait but what if we need to pass addTodo down into a component that is nested many levels down from our top level component, wouldn't that be really annoying? The answer is: you are correct it is very annoying with `React`. `React` provides a `Spread` syntax to make cascading down `props` a little easier, but even still it is tough. Don't worry however, `Tux` makes this a lot easier on us.\n+\n+***\n+\n+##### <a id=\"React-Components-props-children\"></a>3.3.1) props.children [#](#React-Components-props-children)\n+When you pass in children to a `React` component you are actually just passing in `props` to the component through an altered syntax. When you pass in children to a component, that component will have access to them through the opaque data structure `this.props.children`.\n+\n+**NOTE** that this means that passing in children to a component does not mean that those children will be rendered as is. It's up to the component to decide what to do with its children. For the base `React` components children will be rendered as is however. You can read more about children and ownership in `React` [here](http://facebook.github.io/react/docs/multiple-components.html).\n+\n+The `this.props.children` data structure is opaque so you should use `React` specialized methods for accessing `children`. Those methods are described in full [here](http://facebook.github.io/react/docs/top-level-api.html#react.children)\n+\n+```\n+    var Parent = React.createClass({\n+      render: function () {\n+        <div>\n+          { this.props.children }\n+        </div>\n+      }\n+    });\n+```\n+\n+***\n+\n+##### <a id=\"React-Components-PropTypes\"></a>3.3.2) PropTypes [#](#React-Components-PropTypes)\n+Passing `props` down into components is a somewhat passive framework design. To combat this, components can define the `propTypes` they need or expect:\n+\n+```\n+   Var MyComponent = React.createClass({\n+     propTypes: {\n+       optionalObjectProp: React.PropTypes.object,\n+       requiredFunctionProp: React.PropTypes.func.isRequired\n+     }\n+   });\n+```\n+\n+There is a huge laundry list `propTypes` specifications you can provide. Review them [here](http://facebook.github.io/react/docs/reusable-components.html#prop-validation).\n+\n+***\n+\n+#### <a id=\"React-Components-Lifecycle-Methods\"></a>3.4) Lifecycle Methods [#](#React-Components-PropTypes)\n+The main way to hook into `React` components is throught lifecycle methods which are triggered at different significant events for the component. Lifecycle events are triggered in a batched depth first manner.This is easiest to show with an example:\n+\n+```\n+    var MyLifeCycleComponent = React.createClass({\n+      componentWillMount: function () {\n+        //I am called once and first, the first time the component is going to render\n+        //if setState is invoked in me then it will not trigger a rerender but the upcoming render will see the new state\n+      },\n+\n+      componentDidMount: function () {\n+        //I am called once after the initial render, you can access the DOM representation of the component for the first time with this.getDOMNode() in me\n+      },\n+\n+      componentWillReceiveProps: function (newProps) {\n+        //I am called every time the component is receiving properties after the initial render\n+        //I have access to the upcoming props through the newProps input.\n+        //if setState is invoked in me then it will not trigger a rerender but the upcoming render will see the new state\n+      },\n+\n+      shouldComponentUpdate: function (nextProps, nextState) {\n+        //I am called every time the component might update after componentWillReceiveProps\n+        //I have access to the upcoming props and state wth nextProps and nextState\n+        //if I return true the componentWillUpdate lifecycle will happen, if I return false the the rest of the rendering and lifecycle methods will be canceled\n+      },\n+\n+      componentWillUpdate: function (nextProps, nextState) {\n+        //I am called every time the component will update after shouldComponentUpdate\n+        //I have access to the upcoming props and state wtih nextProps and nextState\n+        //you cannot under any circumstances call setState or replaceState in me\n+      },\n+\n+      render: function () {\n+        //I am where the actual rendering happens\n+        return (\n+          <div />\n+        );\n+      },\n+\n+      componentDidUpdate: function () {\n+        //I am the final lifecycle method to be called after an update\n+        //I am called after the render method\n+      },\n+\n+      componentWillUnmount: function () {\n+        //I am the final lifecycle method and I am called once before the component is removed\n+      }\n+    });\n+```\n+\n+The only other thing to know about lifecycle methods is their order between components. Lifecycle methods are triggered in a depth first top-down fashion for all `pre-render/render` methods. Then, after all `render` methods have completed, all of the post `render` methods are triggered in reverse depth first top-down order where the deepest top-most component has its post `render` method triggered, then all other children of its parent component, then its parent, etc. Let's take a look at an example.\n+\n+This structure:\n+\n+```\n+    <Root>\n+      <Branch1>\n+        <Leaf1 />\n+      </Branch1>\n+      <Branch2>\n+        <Leaf2 />\n+      </Branch2>\n+    </Root>\n+```\n+\n+Would lead to the following event triggers:\n+\n+```\n+    Root WILL MOUNT\n+    Root RENDER\n+    Branch1 WILL MOUNT\n+    Branch1 RENDER\n+    Leaf1 WILL MOUNT\n+    Leaf1 RENDER\n+    Branch2 WILL MOUNT\n+    Branch2 RENDER\n+    Leaf2 WILL MOUNT\n+    Leaf2 RENDER\n+    Leaf1 DID MOUNT\n+    Branch1 DID MOUNT\n+    Leaf2 DID MOUNT\n+    Branch2 DID MOUNT\n+    Root DID MOUNT\n+```\n+\n+This same order would be applied for all update methods. The `componentWillUnmount` lifecycle will happen in the same order as `componentWillMount`.\n+\n+***\n+\n+### <a id=\"React-Conclusion\"></a>4) React Conclusion [#](#React-Conclusion)\n+Hopefully this primer has given a brief introduction to `React` and has given enough to get you excited to learn more and helped to provide a picture of some of `React's` strengths and weaknesses. There is a ton to `React` and you should investigate facebook's docs to learn more. Next, we will be jumping in to where `TuxedoJS` comes into play in this.","path":"docs/TuxReact.md","position":319,"original_position":319,"commit_id":"036e089381a0089112436ba5b3c74fe4d06904d4","original_commit_id":"036e089381a0089112436ba5b3c74fe4d06904d4","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":"Change facebook's to Facebook's.","created_at":"2015-01-20T17:42:42Z","updated_at":"2015-01-20T17:42:42Z","html_url":"https://github.com/TuxedoJS/TuxedoJS/pull/131#discussion_r23239671","pull_request_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/131","_links":{"self":{"href":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/comments/23239671"},"html":{"href":"https://github.com/TuxedoJS/TuxedoJS/pull/131#discussion_r23239671"},"pull_request":{"href":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/131"}}},"pull_request":{"url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/131","id":27660822,"html_url":"https://github.com/TuxedoJS/TuxedoJS/pull/131","diff_url":"https://github.com/TuxedoJS/TuxedoJS/pull/131.diff","patch_url":"https://github.com/TuxedoJS/TuxedoJS/pull/131.patch","issue_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/issues/131","number":131,"state":"open","locked":false,"title":"Add TuxReact 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-20T08:33:04Z","updated_at":"2015-01-20T17:42:42Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7ccc9c17fddd85baa7be32bc4c62a3eb3f6c70a3","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/131/commits","review_comments_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/131/comments","review_comment_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/comments/{number}","comments_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/issues/131/comments","statuses_url":"https://api.github.com/repos/TuxedoJS/TuxedoJS/statuses/036e089381a0089112436ba5b3c74fe4d06904d4","head":{"label":"drabinowitz:TuxReactDoc","ref":"TuxReactDoc","sha":"036e089381a0089112436ba5b3c74fe4d06904d4","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-20T08:32:48Z","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":"e4cabe747acb2d5c77ada98737ca8f8309e0f221","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-20T04:52:01Z","pushed_at":"2015-01-20T04:52:01Z","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":30,"forks":4,"open_issues":30,"watchers":8,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/131"},"html":{"href":"https://github.com/TuxedoJS/TuxedoJS/pull/131"},"issue":{"href":"https://api.github.com/repos/TuxedoJS/TuxedoJS/issues/131"},"comments":{"href":"https://api.github.com/repos/TuxedoJS/TuxedoJS/issues/131/comments"},"review_comments":{"href":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/131/comments"},"review_comment":{"href":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/TuxedoJS/TuxedoJS/pulls/131/commits"},"statuses":{"href":"https://api.github.com/repos/TuxedoJS/TuxedoJS/statuses/036e089381a0089112436ba5b3c74fe4d06904d4"}}}}