{"action":"created","comment":{"url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/pulls/comments/51357603","id":51357603,"diff_hunk":"@@ -0,0 +1,391 @@\n+/* \n+\n+I ♥ Movies Client\n+==========\n+Jeremiah Alexander\n+\n+*/\n+\n+\n+var searchContainer, heartsContainer, searchInput, searchBtn, navHearts, navFavs, errorMessage, moviesContainer, uuid, shareLink;\n+var omdbSearchUrl = \"http://www.omdbapi.com/?s=\";\n+var omdbReadUrl = \"http://www.omdbapi.com/?plot=full&i=\";\n+var includedDetails = [\"Released\", \"Genre\", \"Director\", \"Writer\", \"Actors\", \"Metascore\"];\n+\n+function setUUID(id){\n+\t\n+\tif ( !id || id === \"\" || id == uuid ) return;\n+\n+\tuuid = id;\n+\n+\t//update the browser url\n+\tvar stateObj = { uuid: uuid };\n+\thistory.pushState( stateObj, \"I ♥ Movies || User Page\", \"?uuid=\" + encodeURI(uuid) );\n+\t\n+\t//update the link to this page\n+\tshareLink.textContent = window.location;\n+\tshareLink.setAttribute(\"href\", window.location);\n+\n+\t//make hearts section visible\n+\tnavHearts.className = \"\";\n+}\n+function displayError(message){\n+\terrorMessage.innerHTML = message || \"\";\n+\tif (!message){\n+\t\terrorMessage.className = \"alert alert-danger hidden\";\n+\t} else {\n+\t\terrorMessage.className = \"alert alert-danger\";\n+\t}\n+}\n+\n+function clearMovies(){\n+\t//clear all listings - todo. could instead reuse elements rather than creating them again\n+\twhile (moviesContainer.firstChild) \n+\t{\n+    \tmoviesContainer.removeChild(moviesContainer.firstChild);\n+\t}\n+\tsearchInput.value = \"\";\n+}\n+\n+//using the actual model id we remove a faviourite from our server\n+function removeFromHearts( oid ){\n+\n+\tvar xmlhttpRequest = new XMLHttpRequest();\n+\n+\t//send post request to save new faviourite\n+\txmlhttpRequest.onreadystatechange = function(){\n+\t\tif ( xmlhttpRequest.readyState === 4 ){\n+\t\t\t//we'll ignore a success response and just out if we have an error\n+\t\t\tif (xmlhttpRequest.status !== 200){\n+\t\t\t\tdisplayError(\"Sorry but there was an error removing that heart, please reload the page and try again.\");\n+\t\t\t}\n+\t\t}\n+\t};\n+\txmlhttpRequest.open(\"DELETE\", encodeURI(\"./favorites/\" + oid), true);\n+\txmlhttpRequest.send();\n+}\n+\n+//we make an ajax request to our server to save a movie to faviourites\n+function addToHearts( id, title ){\n+\n+\tvar xmlhttpRequest = new XMLHttpRequest();\n+\n+\t//setup the data we need to send\n+\tvar params = encodeURI( \"imdbID=\" + id + \"&title=\" + title );\n+\t\n+\tif ( uuid ){\n+\t\t//if we have a uuid we add with it, else one will be created for us\n+\t\tparams += \"&uuid=\" + uuid;\n+\t}\n+\n+\t//send post request to save new faviourite\n+\txmlhttpRequest.open(\"POST\", \"./favorites\", true);\n+\txmlhttpRequest.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n+\txmlhttpRequest.onreadystatechange = function(){\n+\t\tif ( xmlhttpRequest.readyState === 4 ){\n+\t\t\tif (xmlhttpRequest.status === 200){\n+\t\t\t\t//we've added a heart, store our uuid for future retrival and addition\n+\t\t\t\tsetUUID(JSON.parse(xmlhttpRequest.responseText).uuid);\n+\t\t\t} else {\n+\t\t\t\tdisplayError(\"Sorry but there was an error adding to hearts, please reload the page and try again.\");\n+\t\t\t}\n+\t\t}\n+\t};\n+\n+\txmlhttpRequest.send(params);\n+}\n+function displayMovie( data, container, hearted ){\n+\tvar btn;\n+\n+\t//update the formatting of the panel div and add the details elements\n+\tvar panel = document.createElement(\"div\");\n+\tpanel.className = \"panel-body\";\n+\t\n+\t//if no poster is found it returns n/a so check for that\n+\tif ( data.Poster != \"N/A\" ){\n+\t\tvar image = document.createElement(\"img\");\n+\t\timage.className = \"img-rounded pull-left film-poster\";\n+\t\timage.src = encodeURI(data.Poster);\n+\t\tpanel.appendChild(image);\n+\t}\n+\n+\tvar body = document.createElement(\"div\");\n+\tbody.className = \"panel-body\";\n+\tpanel.appendChild(body);\n+\n+\tvar text = document.createElement(\"p\");\n+\ttext.textContent = data.Plot;\n+\tbody.appendChild(text);\n+\n+\tvar ul = document.createElement(\"ul\");\n+\tbody.appendChild(ul);\n+\t//display all other bits of info as a list\n+\tfor (var prop in data) {\n+        // skip if inherited \n+        if ( !data.hasOwnProperty(prop) ) continue;\n+        if ( includedDetails.indexOf(prop) === -1) continue;\n+        //if it's an extra detail we want then add it to the list\n+\t\tvar li = document.createElement(\"li\");\n+\t\tul.appendChild(li);\n+\t\tli.textContent = prop + \": \" + data[prop];\n+    }\n+\n+\tif ( hearted === true ) {\n+\t\t//change the panel colour\n+\t\tcontainer.className = \"panel panel-danger\";\n+\t\tbtn = document.createElement(\"button\");\n+\t\tbtn.className = \"btn btn-default\";\n+\t\tbtn.textContent = \"un♥ this movie\";\n+\t\tbody.appendChild(btn);\n+\n+\t\t//add an event listener for un saving this from faviourites\n+\t\tbtn.addEventListener(\"click\", function(e){ \n+\t\t\t//highlight the panel & remove the button\n+\t\t\tcontainer.className = \"panel panel-default\";\n+\t\t\t//remove the whole element\n+\t\t\tcontainer.parentElement.removeChild(container);\n+\t\t\tremoveFromHearts(container.id);\n+\t\t}, false);\n+\n+\t} else {\n+\t\tcontainer.className = \"panel panel-default\";\n+\t\t//create a button so the use can heart this\n+\t\tbtn = document.createElement(\"button\");\n+\t\tbtn.className = \"btn btn-default\";\n+\t\tbtn.textContent = \"♥ this movie\";\n+\t\tbody.appendChild(btn);\n+\n+\t\t//add an event listener for saving this to faviourites\n+\t\tbtn.addEventListener(\"click\", function(e){ \n+\t\t\t//highlight the panel & remove the button\n+\t\t\tcontainer.className = \"panel panel-danger\";\n+\t\t\t//remove the button\n+\t\t\te.target.parentNode.removeChild(e.target);\n+\t\t\taddToHearts(data.imdbID, data.Title);\n+\t\t}, false);\n+\n+\t}\n+\n+\tcontainer.appendChild(panel);\n+}\n+\n+function loadHearts(){\n+\t//we could persist the previous search results and just hide them but instead I've decided to clear them and reuse the same space\n+\tclearMovies();\n+\t//clear the error message\n+\tdisplayError();\n+\n+\t//do a request to our server to load the hearts\n+\tvar xmlhttpRequest = new XMLHttpRequest();\n+\txmlhttpRequest.onreadystatechange = function(){\n+\t\tif ( xmlhttpRequest.readyState === 4 ){\n+\t\t\tif (xmlhttpRequest.status === 200){\n+\t\t\t\t//now display our movie\n+\t\t\t\tpopulateMovies( JSON.parse( xmlhttpRequest.responseText).movies, true );\n+\t\t\t}\n+\t\t\telse {\n+\t\t\t\tdisplayError(\"Sorry but there was an error with your request, please reload the page and try again.\");\n+\t\t\t}\n+\t\t}\n+\t};\n+\txmlhttpRequest.open(\"GET\", \"./favorites/\" + uuid, true);\n+\txmlhttpRequest.send(null);\n+}\n+\n+//handle the loading of a movie\n+function loadMovie( id, container, hearted ){\n+\t//clear the error message\n+\tdisplayError();\n+\n+\t//when a movie is selected we do another request and expand the div like an accordian, we could close other divs but maybe it's nicer not too\n+\tvar xmlhttpRequest = new XMLHttpRequest();\n+\txmlhttpRequest.onreadystatechange = function(){\n+\t\tif ( xmlhttpRequest.readyState === 4 ){\n+\t\t\tvar parsed = JSON.parse(xmlhttpRequest.responseText);\n+\t\t\tif (xmlhttpRequest.status === 200 && parsed.Response !== \"False\"){\n+\t\t\t\t//now display our movie\n+\t\t\t\tdisplayMovie(parsed, container, hearted);\n+\t\t\t}\n+\t\t\telse {\n+\t\t\t\tdisplayError(\"Sorry but there was an error with your request, please reload the page and try again.\");\n+\t\t\t\t//jump the page to the top\n+\t\t\t\twindow.location.href = \"#\";\n+\t\t\t}\n+\t\t}\n+\t};\n+\txmlhttpRequest.open(\"GET\", encodeURI(omdbReadUrl + id), true);\n+\txmlhttpRequest.send(null);\n+}\n+\n+//handle movie selection\n+function onMovieSelected(e){\n+\t//stop default action i.e. navigate to #\n+\tevent.preventDefault();\n+\n+\t//the containing div for our link is two levels up\n+\tvar container = e.target.parentElement.parentElement;\n+\tvar header = e.target.parentElement;\n+\n+\t//whilst we could allow opening and closing of panels we don't, so once expanded we just replace the link with a title\n+\tvar title = document.createElement(\"h3\");\n+\ttitle.className = \"panel-title\";\n+\ttitle.textContent = e.target.textContent;\n+\theader.appendChild(title);\n+\n+\t//remove the link\n+\te.target.parentNode.removeChild(e.target);\n+\n+\tloadMovie(container.id, container, false);\n+}\n+\n+\n+//display the list of movies\n+function populateMovies( results, hearted ){\n+\n+\tclearMovies();\n+\n+\t//create a fragment to add each result to\n+\tvar fragment = document.createDocumentFragment();\n+\t//add a new one for each\n+\tfor ( var i = 0; i < results.length; ++i){\n+\t\tvar article = document.createElement(\"article\");\n+\t\tarticle.className = \"panel panel-default\";\n+\n+\t\t//create a seperate title div also\n+\t\tvar header = document.createElement(\"div\");\n+\t\theader.className = \"panel-heading\";\n+\t\tarticle.appendChild(header);\n+\n+\t\t//if we're displaying the hearts list then we display expanded else we use links\n+\t\tif ( hearted ) {\n+\n+\t\t\t//if it's a heart then we have it saved, so we store the actual model id in the article to make deletion easy\n+\t\t\tarticle.id = results[i]._id;\n+\t\t\t//add a non-link header\n+\t\t\tvar title = document.createElement(\"h3\");\n+\t\t\ttitle.className = \"panel-title\";\n+\t\t\ttitle.textContent = results[i].title;\n+\t\t\theader.appendChild(title);\n+\n+\t\t\t//call our load movie function to populate the article\n+\t\t\tloadMovie( results[i].imdbID, article, true );\n+\t\t} else {\n+\n+\t\t\t//as a convenience we set the id of the container to the id we need for search\n+\t\t\tarticle.id = results[i].imdbID;\n+\t\t\t//add a link to our header and listen for clicks\n+\t\t\tvar link = document.createElement(\"a\");\n+\t\t\tlink.setAttribute(\"href\",\"#\");\n+\t\t\tlink.textContent = results[i].Title;\n+\t  \t\tlink.addEventListener(\"click\", onMovieSelected, false);\n+\t\t\theader.appendChild(link);\t\n+\t\t}\n+\t\t\n+\t\t//save article to our fragment\n+\t\tmoviesContainer.appendChild(article);\n+\t}\n+\n+\t//append our completed fragment\n+\tmoviesContainer.appendChild(fragment);\n+}\n+\n+//handle search being clicked\n+function onSearchClick() {\n+\t\n+\t//return if we're already searching, rather than store a bool, we'll just use the disabled state of the button\n+\tif ( searchBtn.disabled ) {\n+\t\treturn;\n+\t}\n+\n+\t//clear the error message before we begin our search\n+\tdisplayError();\n+\n+\t//find what the user is search for\n+\tvar searchingFor = searchInput.value;\n+\n+\t//Disable the button and change the text so the user knows we are searching\n+\tsearchBtn.text = \"Searching...\";\n+\tsearchInput.disabled = searchBtn.disabled = true;\n+\n+\t//time to make our ajax request\n+\tvar xmlhttpRequest = new XMLHttpRequest();\n+\txmlhttpRequest.onreadystatechange = function(){\n+\t\tif ( xmlhttpRequest.readyState === 4 ){\n+\t\t\tvar parsed = JSON.parse(xmlhttpRequest.responseText);\n+\t\t\tif ( xmlhttpRequest.status === 200 && parsed.Response !== \"False\"){\n+\t\t\t\tpopulateMovies( parsed.Search, false );\n+\t\t\t}\n+\t\t\telse {\n+\t\t\t\tdisplayError(\"Sorry but there was an error with your request, please try again.\");\n+\t\t\t}\n+\t\t\t//reenable our search button\n+\t\t\tsearchBtn.text = \"Go!\";\n+\t\t\tsearchInput.disabled = searchBtn.disabled = false;\n+\t\t}\n+\t};\n+\n+\txmlhttpRequest.open(\"GET\", encodeURI(omdbSearchUrl + searchingFor), true);\n+\txmlhttpRequest.send(null);\n+}\n+//handle search tab being select\n+function onNavSearchClick() {\n+\tnavSearch.className = \"active\";\n+\tnavHearts.className = ( uuid ) ? \"\" : \"hidden\";\n+\tsearchContainer.className = \"\";\n+\theartsContainer.className = \"hidden\";\n+\n+\tclearMovies();\n+\t//stop the link being processed\n+\tevent.preventDefault();\n+}\n+//handle nav tab being select\n+function onNavHeartsClick() {\n+\tnavSearch.className = \"\";\n+\tnavHearts.className = \"active\";\n+\tsearchContainer.className = \"hidden\";\n+\theartsContainer.className = \"\";\n+\n+\tloadHearts();\n+\t//stop the link being processed\n+\tevent.preventDefault();\n+}\n+\n+//nice function found on stackoverflow for getting the url parameters - is that cheating?\n+function getParameterByName(name) {\n+    name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n+    var regex = new RegExp(\"[\\\\?&]\" + name + \"=([^&#]*)\"),\n+        results = regex.exec(location.search);\n+    return results === null ? \"\" : decodeURIComponent(results[1].replace(/\\+/g, \" \"));\n+}\n+\n+//all initialisation happens in our page load event\n+window.onload = function(){ \n+\n+\t//check if we recieved a uid for the user\n+\tsetUUID( getParameterByName(\"uuid\") );\n+\n+\t//cache our commonly referenced elements\n+\tsearchContainer = document.getElementById(\"searchContainer\");\n+\theartsContainer = document.getElementById(\"heartsContainer\");\n+\tsearchInput = document.getElementById(\"searchInput\");\n+\tsearchBtn = document.getElementById(\"searchBtn\");\n+\tnavSearch = document.getElementById(\"navSearch\");\n+\tnavHearts = document.getElementById(\"navHearts\");\n+\terrorMessage = document.getElementById(\"errorMessage\");\n+\tmoviesContainer = document.getElementById(\"movies\");\n+\tshareLink = document.getElementById(\"shareLink\");\n+\n+\t//add an event listener for tab selection and form processing\n+\tnavSearch.addEventListener(\"click\", onNavSearchClick, false);\n+\tnavHearts.addEventListener(\"click\", onNavHeartsClick, false);\n+\tsearchBtn.addEventListener(\"click\", onSearchClick, false);\n+\t//also allow an enter key press to trigger the search\n+\tsearchInput.addEventListener(\"keydown\", function(e){ ","path":"node-backend-starter-code/client.js","position":383,"original_position":383,"commit_id":"484a78b7c9de94fe118a408305346a5af434bd34","original_commit_id":"484a78b7c9de94fe118a408305346a5af434bd34","user":{"login":"cbas","id":78718,"avatar_url":"https://avatars.githubusercontent.com/u/78718?v=3","gravatar_id":"","url":"https://api.github.com/users/cbas","html_url":"https://github.com/cbas","followers_url":"https://api.github.com/users/cbas/followers","following_url":"https://api.github.com/users/cbas/following{/other_user}","gists_url":"https://api.github.com/users/cbas/gists{/gist_id}","starred_url":"https://api.github.com/users/cbas/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cbas/subscriptions","organizations_url":"https://api.github.com/users/cbas/orgs","repos_url":"https://api.github.com/users/cbas/repos","events_url":"https://api.github.com/users/cbas/events{/privacy}","received_events_url":"https://api.github.com/users/cbas/received_events","type":"User","site_admin":false},"body":"How about wrapping in a `<form>` element with a `submit` event? Any issues with search input type and/or submit button/input type?","created_at":"2016-01-31T09:22:12Z","updated_at":"2016-01-31T09:22:12Z","html_url":"https://github.com/rachlim/wdi-instructor-challenge/pull/4#discussion_r51357603","pull_request_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/pulls/4","_links":{"self":{"href":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/pulls/comments/51357603"},"html":{"href":"https://github.com/rachlim/wdi-instructor-challenge/pull/4#discussion_r51357603"},"pull_request":{"href":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/pulls/4"}}},"pull_request":{"url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/pulls/4","id":57756065,"html_url":"https://github.com/rachlim/wdi-instructor-challenge/pull/4","diff_url":"https://github.com/rachlim/wdi-instructor-challenge/pull/4.diff","patch_url":"https://github.com/rachlim/wdi-instructor-challenge/pull/4.patch","issue_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/issues/4","number":4,"state":"open","locked":false,"title":"Challenge Complete","user":{"login":"jeremiahalex","id":359576,"avatar_url":"https://avatars.githubusercontent.com/u/359576?v=3","gravatar_id":"","url":"https://api.github.com/users/jeremiahalex","html_url":"https://github.com/jeremiahalex","followers_url":"https://api.github.com/users/jeremiahalex/followers","following_url":"https://api.github.com/users/jeremiahalex/following{/other_user}","gists_url":"https://api.github.com/users/jeremiahalex/gists{/gist_id}","starred_url":"https://api.github.com/users/jeremiahalex/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jeremiahalex/subscriptions","organizations_url":"https://api.github.com/users/jeremiahalex/orgs","repos_url":"https://api.github.com/users/jeremiahalex/repos","events_url":"https://api.github.com/users/jeremiahalex/events{/privacy}","received_events_url":"https://api.github.com/users/jeremiahalex/received_events","type":"User","site_admin":false},"body":"I have implemented the core requirement. I have added a MongoDB database to store the user's faviorites. I have used a uuid to generate a unique url that a user can use as a very basic but quick authentication to retrieve their account and add new faviourites.\r\n\r\nOf the bonus taks, I have:\r\n- Added linting\r\n- Added basic unit tests and coverage metrics, although the application is not at full coverage\r\n- Setup continuous deployment through codeship\r\n\r\nSome known Limitations include:\r\n- not using pagination, so only the first page of results are returned\r\n- data is refetched and redrawn when a user switches from search to favorites or vice-versa\r\n- I used bootstap for responsiveness and basic CSS - it wasn't specified whether CSS needed to be writen from scartch\r\n- When a user adds or removes a favorite, the display is immediately refreshed rather than waiting for a success confirmation \r\n\r\n[Application is here on Heroku](http://secret-caverns-47270.herokuapp.com)\r\n\r\nFor reference, I spent 1 day working on this Application.","created_at":"2016-01-31T01:02:11Z","updated_at":"2016-01-31T09:22:12Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c86eb04795b512a629cf028a53f7acafa828552f","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/pulls/4/commits","review_comments_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/pulls/4/comments","review_comment_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/pulls/comments{/number}","comments_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/issues/4/comments","statuses_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/statuses/484a78b7c9de94fe118a408305346a5af434bd34","head":{"label":"jeremiahalex:master","ref":"master","sha":"484a78b7c9de94fe118a408305346a5af434bd34","user":{"login":"jeremiahalex","id":359576,"avatar_url":"https://avatars.githubusercontent.com/u/359576?v=3","gravatar_id":"","url":"https://api.github.com/users/jeremiahalex","html_url":"https://github.com/jeremiahalex","followers_url":"https://api.github.com/users/jeremiahalex/followers","following_url":"https://api.github.com/users/jeremiahalex/following{/other_user}","gists_url":"https://api.github.com/users/jeremiahalex/gists{/gist_id}","starred_url":"https://api.github.com/users/jeremiahalex/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jeremiahalex/subscriptions","organizations_url":"https://api.github.com/users/jeremiahalex/orgs","repos_url":"https://api.github.com/users/jeremiahalex/repos","events_url":"https://api.github.com/users/jeremiahalex/events{/privacy}","received_events_url":"https://api.github.com/users/jeremiahalex/received_events","type":"User","site_admin":false},"repo":{"id":50703903,"name":"wdi-instructor-challenge","full_name":"jeremiahalex/wdi-instructor-challenge","owner":{"login":"jeremiahalex","id":359576,"avatar_url":"https://avatars.githubusercontent.com/u/359576?v=3","gravatar_id":"","url":"https://api.github.com/users/jeremiahalex","html_url":"https://github.com/jeremiahalex","followers_url":"https://api.github.com/users/jeremiahalex/followers","following_url":"https://api.github.com/users/jeremiahalex/following{/other_user}","gists_url":"https://api.github.com/users/jeremiahalex/gists{/gist_id}","starred_url":"https://api.github.com/users/jeremiahalex/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jeremiahalex/subscriptions","organizations_url":"https://api.github.com/users/jeremiahalex/orgs","repos_url":"https://api.github.com/users/jeremiahalex/repos","events_url":"https://api.github.com/users/jeremiahalex/events{/privacy}","received_events_url":"https://api.github.com/users/jeremiahalex/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jeremiahalex/wdi-instructor-challenge","description":"Challenge for GA Web Development Immersive candidates","fork":true,"url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge","forks_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/forks","keys_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/teams","hooks_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/hooks","issue_events_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/issues/events{/number}","events_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/events","assignees_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/assignees{/user}","branches_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/branches{/branch}","tags_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/tags","blobs_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/git/refs{/sha}","trees_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/statuses/{sha}","languages_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/languages","stargazers_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/stargazers","contributors_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/contributors","subscribers_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/subscribers","subscription_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/subscription","commits_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/commits{/sha}","git_commits_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/git/commits{/sha}","comments_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/comments{/number}","issue_comment_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/issues/comments{/number}","contents_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/contents/{+path}","compare_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/merges","archive_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/downloads","issues_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/issues{/number}","pulls_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/pulls{/number}","milestones_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/milestones{/number}","notifications_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/labels{/name}","releases_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/releases{/id}","deployments_url":"https://api.github.com/repos/jeremiahalex/wdi-instructor-challenge/deployments","created_at":"2016-01-30T02:03:57Z","updated_at":"2016-01-30T19:00:39Z","pushed_at":"2016-01-30T19:43:11Z","git_url":"git://github.com/jeremiahalex/wdi-instructor-challenge.git","ssh_url":"git@github.com:jeremiahalex/wdi-instructor-challenge.git","clone_url":"https://github.com/jeremiahalex/wdi-instructor-challenge.git","svn_url":"https://github.com/jeremiahalex/wdi-instructor-challenge","homepage":null,"size":509,"stargazers_count":0,"watchers_count":0,"language":"HTML","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":"rachlim:master","ref":"master","sha":"c02218d5621d2765308e02a005cd6862b777401c","user":{"login":"rachlim","id":16111480,"avatar_url":"https://avatars.githubusercontent.com/u/16111480?v=3","gravatar_id":"","url":"https://api.github.com/users/rachlim","html_url":"https://github.com/rachlim","followers_url":"https://api.github.com/users/rachlim/followers","following_url":"https://api.github.com/users/rachlim/following{/other_user}","gists_url":"https://api.github.com/users/rachlim/gists{/gist_id}","starred_url":"https://api.github.com/users/rachlim/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rachlim/subscriptions","organizations_url":"https://api.github.com/users/rachlim/orgs","repos_url":"https://api.github.com/users/rachlim/repos","events_url":"https://api.github.com/users/rachlim/events{/privacy}","received_events_url":"https://api.github.com/users/rachlim/received_events","type":"User","site_admin":false},"repo":{"id":49465966,"name":"wdi-instructor-challenge","full_name":"rachlim/wdi-instructor-challenge","owner":{"login":"rachlim","id":16111480,"avatar_url":"https://avatars.githubusercontent.com/u/16111480?v=3","gravatar_id":"","url":"https://api.github.com/users/rachlim","html_url":"https://github.com/rachlim","followers_url":"https://api.github.com/users/rachlim/followers","following_url":"https://api.github.com/users/rachlim/following{/other_user}","gists_url":"https://api.github.com/users/rachlim/gists{/gist_id}","starred_url":"https://api.github.com/users/rachlim/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rachlim/subscriptions","organizations_url":"https://api.github.com/users/rachlim/orgs","repos_url":"https://api.github.com/users/rachlim/repos","events_url":"https://api.github.com/users/rachlim/events{/privacy}","received_events_url":"https://api.github.com/users/rachlim/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rachlim/wdi-instructor-challenge","description":"Challenge for GA Web Development Immersive candidates","fork":true,"url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge","forks_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/forks","keys_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/teams","hooks_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/hooks","issue_events_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/issues/events{/number}","events_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/events","assignees_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/assignees{/user}","branches_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/branches{/branch}","tags_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/tags","blobs_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/git/refs{/sha}","trees_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/statuses/{sha}","languages_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/languages","stargazers_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/stargazers","contributors_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/contributors","subscribers_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/subscribers","subscription_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/subscription","commits_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/commits{/sha}","git_commits_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/git/commits{/sha}","comments_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/comments{/number}","issue_comment_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/issues/comments{/number}","contents_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/contents/{+path}","compare_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/merges","archive_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/downloads","issues_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/issues{/number}","pulls_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/pulls{/number}","milestones_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/milestones{/number}","notifications_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/labels{/name}","releases_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/releases{/id}","deployments_url":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/deployments","created_at":"2016-01-12T01:23:26Z","updated_at":"2016-01-29T01:35:08Z","pushed_at":"2016-01-31T01:02:11Z","git_url":"git://github.com/rachlim/wdi-instructor-challenge.git","ssh_url":"git@github.com:rachlim/wdi-instructor-challenge.git","clone_url":"https://github.com/rachlim/wdi-instructor-challenge.git","svn_url":"https://github.com/rachlim/wdi-instructor-challenge","homepage":null,"size":475,"stargazers_count":2,"watchers_count":2,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5,"mirror_url":null,"open_issues_count":3,"forks":5,"open_issues":3,"watchers":2,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/pulls/4"},"html":{"href":"https://github.com/rachlim/wdi-instructor-challenge/pull/4"},"issue":{"href":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/issues/4"},"comments":{"href":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/issues/4/comments"},"review_comments":{"href":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/pulls/4/comments"},"review_comment":{"href":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/pulls/4/commits"},"statuses":{"href":"https://api.github.com/repos/rachlim/wdi-instructor-challenge/statuses/484a78b7c9de94fe118a408305346a5af434bd34"}}}}