{"action":"created","comment":{"url":"https://api.github.com/repos/IanWhitney/designisrefactoring/pulls/comments/58471745","id":58471745,"diff_hunk":"@@ -0,0 +1,342 @@\n+---\n+layout: post\n+title: \"Rust via its Core Values\"\n+date: 2016-04-01T11:21:05-05:00\n+author: \"Ian Whitney\"\n+---\n+\n+I have a couple of ideas about learning programming languages.\n+\n+The first is that we do it wrong. I'm sure you've experienced this. You try learning a new language and can't quite see how it all works. Why do I use this syntax here and some other syntax over here? We get frustrated by all the weird bits and go back to a language we know.\n+\n+I think we do a bad job of learning languages because of how we think about languages. Think back to the last time you discussed a new language. Someone mentioned a new language and then someone else asked about the language's speed, syntax or web framework of choice.\n+\n+This is similar to how we talk about cars. Hear about that new Ford Bratwurst? How fast is it? Can I drive it through a lake?\n+\n+When we talk about languages this way, we make them sound interchangeable. Like cars. I know how to drive a Toyota Hamhock, so I should be able to drive a Ford Bratwurst, no problem. Only the speed and the dashboard vary, right?\n+\n+But imagine what a PHP car would look like, now imagine how different the Lisp car would be. Moving from one to the other involves a lot more than learning which knob controls the heater.\n+\n+<!--break-->\n+\n+Cars are interchangeable because they all solve the same problem; and we've settled on what is the best way to solve that problem. But programming languages all solve different problems, and they each express their own philosophy about how to solve that problem.\n+\n+A language's syntax & speed are expressions of its core values. For example, Ruby famously values Developer Happiness and that value has impacted Ruby's features. Java has placed a huge value in backwards compatibility and that has impacted Java's features.\n+\n+So, my second idea about learning a programming language is this. We can learn a language better by learning it through its core values. If we can anchor our understanding in *why* a language works the way it does, it will be easier to learn the *how*\n+\n+With that, let's look at Rust's core values:\n+\n+Rust defines its three goals as\n+\n+- Speed\n+- Memory Safety\n+- Concurrency\n+\n+Let's set aside concurrency for now and focus on Rust's top two goals. Speed and Memory Safety.\n+\n+A digression. When Rust says it values \"memory safety\", it is saying that it will not crash with a segmentation fault. This will be familiar to you if you've worked with C or C++, but if (like me) you've avoided those languages then this may be a new idea. Imagine the following situations\n+\n+- You try to use the 5th element of a 2-element array\n+- You try to call a method on Nil\n+- Two functions mutate a variable at the same time, leaving it an uncertain state\n+\n+In Ruby you might get an exception, but in a language like C you'll get something worse. Maybe your program crashes. Maybe it executes some random code and your little C program opens a giant security bug that a virus exploits. Oops.\n+\n+When Rust says 'memory safety' it's saying you can't cause this type of bug.\n+\n+Ruby also protects you from segmentation fault errors. But to do so it uses a garbage collector. This is great, but it has a big impact on your program's speed.\n+\n+Ah, but Rust has a core value of speed. To enforce that core value, Rust does not have a garbage collector. Management of memory is the programmer's responsibility. Wait, what about all those terrible bugs I just mentioned?! Because Rust values Speed, it makes me manage memory. But if Rust's second Core Value is memory safety, then why would it let me manage memory?!\n+\n+There's a clear tension between these core values. With that in mind, let's learn some Rust!\n+\n+{% rp_highlight rust %}\n+fn main() {\n+  let x = 1;\n+  println!(\"{}\", x);\n+}\n+{% endrp_highlight %}\n+\n+This is about as simple a program as you can get in Rust.\n+\n+If you want to guarantee memory safety, one way of doing that is to prevent data from changing.\n+\n+Thus, everything in Rust is immutable by default.\n+\n+{% rp_highlight rust %}\n+fn main() {\n+  let x = 1;\n+  x = x + 1;\n+  println!(\"{}\", x);\n+}\n+//<anon>:3:3: 3:12 error: re-assignment of immutable variable `x` [E0384]\n+{% endrp_highlight %}\n+\n+Of course, Rust developers also wants people to write programs in Rust. So we can declare things to be mutable if we really need to.\n+\n+{% rp_highlight rust %}\n+fn main() {\n+  let mut x = 1;\n+  x = x + 1;\n+  println!(\"{}\", x);\n+}\n+//2\n+{% endrp_highlight %}\n+\n+The `mut` keyword lets us explicitly say \"this value is mutable.\" Explicitness is the fourth core value of Rust. Ironically, I don't see that \"Explicitness\" is ever explicitly stated as a goal of Rust. But, given the choice between implicitness and explicitness, Rust usually chooses explicitness.\n+\n+But if I can mutate data, doesn't that introduce problems? One of Rust's core values is memory safety. Mutation and memory safety would seem to be mutually exclusive goals.\n+\n+{% highlight rust %}\n+fn main() {\n+  let mut x = 1;\n+  //I pass x off to something that deletes the data from memory\n+  println!(\"{}\", x); //and my program blows up\n+}\n+{% endhighlight %}\n+\n+Rust adheres to its core values and introduces an idea. Ownership. In Rust, each value can only have one owner. And the bit of memory that owner is holding on to is freed after that owner goes out of scope.\n+\n+Let's see that in action:\n+\n+{% rp_highlight rust %}\n+fn main() {\n+  let original_owner = String::from(\"Hello\");\n+  let new_owner = original_owner;\n+  println!(\"{}\", original_owner);\n+}\n+//<anon>:4:18: 4:32 error: use of moved value: `original_owner` [E0382]\n+{% endrp_highlight %}\n+\n+The verbose \"String::from\" syntax gives us a string we can actually own. We then give that ownership to the new owner. And at this point original_owner now owns...nothing. Our string can only have one owner.\n+\n+Through ownership, Rust can start to uphold its value of memory safety. If a value can only have one owner, then we can't ever have a situation where two owners try to change the data simultaneously. And we can't ever try to refer to a value that some other owner destroyed.\n+\n+Earlier I said that values were destroyed when they fell out of scope. So far we've only had one scope, our main function. Most programs have more than one scope. In Rust scopes are delineated by curly braces.\n+\n+{% rp_highlight rust %}\n+fn main() {\n+  let first_scope = String::from(\"Hello\");\n+\n+  {\n+    let second_scope = String::from(\"Goodbye\");\n+  }\n+\n+  println!(\"{}\", second_scope);\n+}\n+//<anon>:8:18: 8:30 error: unresolved name `second_scope` [E0425]\n+{% endrp_highlight %}\n+\n+When our inner scope ends, second_scope is destroyed. We can no longer access it.\n+\n+This is another core part of Rust's memory safety. If we don't allow access to data that is out of scope, then we are certain that we're not going to try to refer to something that we've destroyed. The compiler won't let us.\n+\n+Thanks to memory safety, we now understand some interesting things about Rust\n+\n+- Values can only have one owner\n+- Values are destroyed when they leave scope\n+\n+Let's try to do something useful in Rust. Or as useful as can fit in this post. I want a function that tells me if two strings are the same length.\n+\n+First, functions. We declare them just like our main function:\n+\n+{% rp_highlight rust %}\n+fn same_length() {\n+}\n+\n+fn main() {\n+  same_length();\n+}\n+{% endrp_highlight %}\n+\n+Our same_length function will need to accept two parameters, a source string and a other string to compare against.\n+\n+{% rp_highlight rust %}\n+fn same_length(s1, s2) {\n+}\n+\n+fn main() {\n+  let source = String::from(\"Hello\");\n+  let other = String::from(\"Hi\");\n+\n+  println!(\"{}\", same_length(source, other));\n+}\n+//<anon>:1:18: 1:19 error: expected one of `:` or `@`, found `,`\n+{% endrp_highlight %}\n+\n+Rust loves explicitness. So we can't declare a function without stating what kind of data we're going to pass into it. Rust uses strong, static typing in its function signatures. This way the compiler can ensure we're using our functions correctly, preventing exploding programs. Explicit typing also lets us easily see what a function accepts. Our function only accepts Strings, so we declare that.\n+\n+{% rp_highlight rust %}\n+fn same_length(s1: String, s2: String) {\n+}\n+\n+fn main() {\n+  let source = String::from(\"Hello\");\n+  let other = String::from(\"Hi\");\n+\n+  println!(\"{}\", same_length(source, other));\n+}\n+//<anon>:8:18: 8:44 error: the trait `core::fmt::Display` is not implemented for the type `()` [E0277]\n+{% endrp_highlight %}\n+\n+Most of Rust's compiler messages are helpful. This one, maybe not so much. What it's telling us is that our function is returning nothing, `()` and that can't print nothing. So our function should return...something. A boolean seems appropriate. Let's just return false for now.\n+\n+{% rp_highlight rust %}\n+fn same_length(s1: String, s2: String) {\n+  false\n+}\n+\n+fn main() {\n+  let source = String::from(\"Hello\");\n+  let other = String::from(\"Hi\");\n+\n+  println!(\"{}\", same_length(source, other));\n+}\n+//<anon>:2:3: 2:8 error: mismatched types:\n+//expected `()`,\n+//found `bool`\n+{% endrp_highlight %}\n+\n+Explicitness again. Not only do functions have to declare what they accept, they have to declare the type of the object that they return. We return a `bool`\n+\n+{% rp_highlight rust %}\n+#[allow(unused_variables)]\n+fn same_length(s1: String, s2: String) -> bool {\n+  false\n+}\n+\n+fn main() {\n+  let source = String::from(\"Hello\");\n+  let other = String::from(\"Hi\");\n+\n+  println!(\"{}\", same_length(source, other));\n+}\n+//false\n+{% endrp_highlight %}\n+\n+Cool. That compiles. Let's do an actual comparison. Strings have a `len()` function that returns their length:\n+\n+{% rp_highlight rust %}\n+fn same_length(s1: String, s2: String) -> bool {\n+  s1.len() == s2.len()","path":"_posts/2016-04-01-rust-via-its-core-values.markdown","position":222,"original_position":222,"commit_id":"76c0133e91d00a52e3a4aee6d40d42eb3dea862e","original_commit_id":"76c0133e91d00a52e3a4aee6d40d42eb3dea862e","user":{"login":"respeccing","id":17984080,"avatar_url":"https://avatars.githubusercontent.com/u/17984080?v=3","gravatar_id":"","url":"https://api.github.com/users/respeccing","html_url":"https://github.com/respeccing","followers_url":"https://api.github.com/users/respeccing/followers","following_url":"https://api.github.com/users/respeccing/following{/other_user}","gists_url":"https://api.github.com/users/respeccing/gists{/gist_id}","starred_url":"https://api.github.com/users/respeccing/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/respeccing/subscriptions","organizations_url":"https://api.github.com/users/respeccing/orgs","repos_url":"https://api.github.com/users/respeccing/repos","events_url":"https://api.github.com/users/respeccing/events{/privacy}","received_events_url":"https://api.github.com/users/respeccing/received_events","type":"User","site_admin":false},"body":"I guess it does matter which unit we use: https://play.rust-lang.org/?gist=5d3174958c76718508f6ab4566084829&version=stable&backtrace=2\r\nWith `len` these are not equal, whistl with `chars().count()` they are!\r\nI stand corrected in my [assumption](https://github.com/IanWhitney/designisrefactoring/pull/19/files/76c0133e91d00a52e3a4aee6d40d42eb3dea862e#r58470086)\r\n","created_at":"2016-04-05T00:36:50Z","updated_at":"2016-04-05T00:36:50Z","html_url":"https://github.com/IanWhitney/designisrefactoring/pull/19#discussion_r58471745","pull_request_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/pulls/19","_links":{"self":{"href":"https://api.github.com/repos/IanWhitney/designisrefactoring/pulls/comments/58471745"},"html":{"href":"https://github.com/IanWhitney/designisrefactoring/pull/19#discussion_r58471745"},"pull_request":{"href":"https://api.github.com/repos/IanWhitney/designisrefactoring/pulls/19"}}},"pull_request":{"url":"https://api.github.com/repos/IanWhitney/designisrefactoring/pulls/19","id":64969604,"html_url":"https://github.com/IanWhitney/designisrefactoring/pull/19","diff_url":"https://github.com/IanWhitney/designisrefactoring/pull/19.diff","patch_url":"https://github.com/IanWhitney/designisrefactoring/pull/19.patch","issue_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/issues/19","number":19,"state":"open","locked":false,"title":"Rust via its Core Values","user":{"login":"IanWhitney","id":12144,"avatar_url":"https://avatars.githubusercontent.com/u/12144?v=3","gravatar_id":"","url":"https://api.github.com/users/IanWhitney","html_url":"https://github.com/IanWhitney","followers_url":"https://api.github.com/users/IanWhitney/followers","following_url":"https://api.github.com/users/IanWhitney/following{/other_user}","gists_url":"https://api.github.com/users/IanWhitney/gists{/gist_id}","starred_url":"https://api.github.com/users/IanWhitney/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/IanWhitney/subscriptions","organizations_url":"https://api.github.com/users/IanWhitney/orgs","repos_url":"https://api.github.com/users/IanWhitney/repos","events_url":"https://api.github.com/users/IanWhitney/events{/privacy}","received_events_url":"https://api.github.com/users/IanWhitney/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-04-01T16:21:49Z","updated_at":"2016-04-05T00:36:50Z","closed_at":null,"merged_at":null,"merge_commit_sha":"52340a571e8456c63d68087e17a226584916242c","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/pulls/19/commits","review_comments_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/pulls/19/comments","review_comment_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/pulls/comments{/number}","comments_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/issues/19/comments","statuses_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/statuses/76c0133e91d00a52e3a4aee6d40d42eb3dea862e","head":{"label":"IanWhitney:rust_via_its_core_values","ref":"rust_via_its_core_values","sha":"76c0133e91d00a52e3a4aee6d40d42eb3dea862e","user":{"login":"IanWhitney","id":12144,"avatar_url":"https://avatars.githubusercontent.com/u/12144?v=3","gravatar_id":"","url":"https://api.github.com/users/IanWhitney","html_url":"https://github.com/IanWhitney","followers_url":"https://api.github.com/users/IanWhitney/followers","following_url":"https://api.github.com/users/IanWhitney/following{/other_user}","gists_url":"https://api.github.com/users/IanWhitney/gists{/gist_id}","starred_url":"https://api.github.com/users/IanWhitney/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/IanWhitney/subscriptions","organizations_url":"https://api.github.com/users/IanWhitney/orgs","repos_url":"https://api.github.com/users/IanWhitney/repos","events_url":"https://api.github.com/users/IanWhitney/events{/privacy}","received_events_url":"https://api.github.com/users/IanWhitney/received_events","type":"User","site_admin":false},"repo":{"id":28693949,"name":"designisrefactoring","full_name":"IanWhitney/designisrefactoring","owner":{"login":"IanWhitney","id":12144,"avatar_url":"https://avatars.githubusercontent.com/u/12144?v=3","gravatar_id":"","url":"https://api.github.com/users/IanWhitney","html_url":"https://github.com/IanWhitney","followers_url":"https://api.github.com/users/IanWhitney/followers","following_url":"https://api.github.com/users/IanWhitney/following{/other_user}","gists_url":"https://api.github.com/users/IanWhitney/gists{/gist_id}","starred_url":"https://api.github.com/users/IanWhitney/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/IanWhitney/subscriptions","organizations_url":"https://api.github.com/users/IanWhitney/orgs","repos_url":"https://api.github.com/users/IanWhitney/repos","events_url":"https://api.github.com/users/IanWhitney/events{/privacy}","received_events_url":"https://api.github.com/users/IanWhitney/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/IanWhitney/designisrefactoring","description":"","fork":false,"url":"https://api.github.com/repos/IanWhitney/designisrefactoring","forks_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/forks","keys_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/keys{/key_id}","collaborators_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/teams","hooks_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/hooks","issue_events_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/issues/events{/number}","events_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/events","assignees_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/assignees{/user}","branches_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/branches{/branch}","tags_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/tags","blobs_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/git/refs{/sha}","trees_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/git/trees{/sha}","statuses_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/statuses/{sha}","languages_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/languages","stargazers_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/stargazers","contributors_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/contributors","subscribers_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/subscribers","subscription_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/subscription","commits_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/commits{/sha}","git_commits_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/git/commits{/sha}","comments_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/comments{/number}","issue_comment_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/issues/comments{/number}","contents_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/contents/{+path}","compare_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/compare/{base}...{head}","merges_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/merges","archive_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/downloads","issues_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/issues{/number}","pulls_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/pulls{/number}","milestones_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/milestones{/number}","notifications_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/labels{/name}","releases_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/releases{/id}","deployments_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/deployments","created_at":"2015-01-01T19:38:11Z","updated_at":"2016-04-04T21:57:29Z","pushed_at":"2016-04-03T01:20:50Z","git_url":"git://github.com/IanWhitney/designisrefactoring.git","ssh_url":"git@github.com:IanWhitney/designisrefactoring.git","clone_url":"https://github.com/IanWhitney/designisrefactoring.git","svn_url":"https://github.com/IanWhitney/designisrefactoring","homepage":null,"size":1832,"stargazers_count":1,"watchers_count":1,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":1,"forks":2,"open_issues":1,"watchers":1,"default_branch":"master"}},"base":{"label":"IanWhitney:master","ref":"master","sha":"234ac07e23291228eb6507c2625aa074d7ec0fd8","user":{"login":"IanWhitney","id":12144,"avatar_url":"https://avatars.githubusercontent.com/u/12144?v=3","gravatar_id":"","url":"https://api.github.com/users/IanWhitney","html_url":"https://github.com/IanWhitney","followers_url":"https://api.github.com/users/IanWhitney/followers","following_url":"https://api.github.com/users/IanWhitney/following{/other_user}","gists_url":"https://api.github.com/users/IanWhitney/gists{/gist_id}","starred_url":"https://api.github.com/users/IanWhitney/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/IanWhitney/subscriptions","organizations_url":"https://api.github.com/users/IanWhitney/orgs","repos_url":"https://api.github.com/users/IanWhitney/repos","events_url":"https://api.github.com/users/IanWhitney/events{/privacy}","received_events_url":"https://api.github.com/users/IanWhitney/received_events","type":"User","site_admin":false},"repo":{"id":28693949,"name":"designisrefactoring","full_name":"IanWhitney/designisrefactoring","owner":{"login":"IanWhitney","id":12144,"avatar_url":"https://avatars.githubusercontent.com/u/12144?v=3","gravatar_id":"","url":"https://api.github.com/users/IanWhitney","html_url":"https://github.com/IanWhitney","followers_url":"https://api.github.com/users/IanWhitney/followers","following_url":"https://api.github.com/users/IanWhitney/following{/other_user}","gists_url":"https://api.github.com/users/IanWhitney/gists{/gist_id}","starred_url":"https://api.github.com/users/IanWhitney/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/IanWhitney/subscriptions","organizations_url":"https://api.github.com/users/IanWhitney/orgs","repos_url":"https://api.github.com/users/IanWhitney/repos","events_url":"https://api.github.com/users/IanWhitney/events{/privacy}","received_events_url":"https://api.github.com/users/IanWhitney/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/IanWhitney/designisrefactoring","description":"","fork":false,"url":"https://api.github.com/repos/IanWhitney/designisrefactoring","forks_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/forks","keys_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/keys{/key_id}","collaborators_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/teams","hooks_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/hooks","issue_events_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/issues/events{/number}","events_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/events","assignees_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/assignees{/user}","branches_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/branches{/branch}","tags_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/tags","blobs_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/git/refs{/sha}","trees_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/git/trees{/sha}","statuses_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/statuses/{sha}","languages_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/languages","stargazers_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/stargazers","contributors_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/contributors","subscribers_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/subscribers","subscription_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/subscription","commits_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/commits{/sha}","git_commits_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/git/commits{/sha}","comments_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/comments{/number}","issue_comment_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/issues/comments{/number}","contents_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/contents/{+path}","compare_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/compare/{base}...{head}","merges_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/merges","archive_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/downloads","issues_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/issues{/number}","pulls_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/pulls{/number}","milestones_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/milestones{/number}","notifications_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/labels{/name}","releases_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/releases{/id}","deployments_url":"https://api.github.com/repos/IanWhitney/designisrefactoring/deployments","created_at":"2015-01-01T19:38:11Z","updated_at":"2016-04-04T21:57:29Z","pushed_at":"2016-04-03T01:20:50Z","git_url":"git://github.com/IanWhitney/designisrefactoring.git","ssh_url":"git@github.com:IanWhitney/designisrefactoring.git","clone_url":"https://github.com/IanWhitney/designisrefactoring.git","svn_url":"https://github.com/IanWhitney/designisrefactoring","homepage":null,"size":1832,"stargazers_count":1,"watchers_count":1,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":1,"forks":2,"open_issues":1,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/IanWhitney/designisrefactoring/pulls/19"},"html":{"href":"https://github.com/IanWhitney/designisrefactoring/pull/19"},"issue":{"href":"https://api.github.com/repos/IanWhitney/designisrefactoring/issues/19"},"comments":{"href":"https://api.github.com/repos/IanWhitney/designisrefactoring/issues/19/comments"},"review_comments":{"href":"https://api.github.com/repos/IanWhitney/designisrefactoring/pulls/19/comments"},"review_comment":{"href":"https://api.github.com/repos/IanWhitney/designisrefactoring/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/IanWhitney/designisrefactoring/pulls/19/commits"},"statuses":{"href":"https://api.github.com/repos/IanWhitney/designisrefactoring/statuses/76c0133e91d00a52e3a4aee6d40d42eb3dea862e"}}}}