{"action":"created","comment":{"url":"https://api.github.com/repos/Courseography/courseography/pulls/comments/35599818","id":35599818,"diff_hunk":"@@ -0,0 +1,281 @@\n+module CalendarResponse where\n+\n+import Data.List (sort)\n+import Data.List.Split (splitOn)\n+import Data.Time (Day, UTCTime, addDays, formatTime, getCurrentTime)\n+import Happstack.Server (ServerPart, Response, toResponse)\n+import Control.Monad.IO.Class (liftIO)\n+import System.Locale\n+import Database.CourseQueries (returnTutorialTimes, returnLectureTimes)\n+import qualified Data.Text as T\n+import Database.Tables as Tables\n+import Config (firstMondayFall,\n+               lastWednesdayFall,\n+               firstMondayWinter,\n+               lastMondayWinter,\n+               outDay)\n+\n+-- | Returns an ICS file of events as requested by the user.\n+calendarResponse :: String -> ServerPart Response\n+calendarResponse courses =\n+    liftIO $ getCalendar courses\n+\n+-- | Gets together all the pieces of the program.\n+getCalendar :: String -> IO Response\n+getCalendar courses = do\n+    let courseInfo = getCoursesInfo courses\n+    databaseInfo <- mapM pullDatabase courseInfo\n+    currentTime <- getCurrentTime\n+    let timeSystem = getTime currentTime\n+    let events = databaseInfo >>= (getEvent timeSystem)\n+    return $ toResponse $ getICS events\n+\n+-- | Generates a properly formatted current date and time.\n+getTime :: UTCTime -> String\n+getTime currentTime = formatTime defaultTimeLocale \"%Y%m%dT%H%M%SZ\" currentTime\n+\n+-- | Generates a string representing a ICS file.\n+getICS :: [String] -> String\n+getICS events =\n+    if null events\n+    then \"\"\n+    else unlines $ header ++ events ++ bottom\n+    where\n+        header = [\"BEGIN:VCALENDAR\", \"VERSION:2.0\",\n+                  \"PRODID:-//Courseography//Calendar\",\n+                  \"CALSCALE:GREGORIAN\", \"METHOD:PUBLISH\"]\n+        bottom = [\"END:VCALENDAR\"]\n+\n+-- ** Cookie Information\n+\n+-- | Obtains a list with all the information about the courses obtained from \n+-- the cookies.\n+getCoursesInfo :: String -> [(String, String, String)]\n+getCoursesInfo courses = map courseInfo allCourses\n+    where\n+        courseInfo course = (course !! 0, course !! 1, course !! 2)\n+        allCourses = map (splitOn \"-\") byCourse\n+        byCourse = splitOn \"_\" courses\n+\n+-- ** Database Information\n+\n+-- | Pulls out the information for each course from the database.\n+pullDatabase :: (String, String, String) -> IO ([Time], String, String, String)\n+pullDatabase (code, sect, session) =\n+    if take 1 sect == \"L\"\n+    then getData $ returnLectureTimes (T.pack code)\n+                                      (T.pack sect)\n+                                      (T.pack session)\n+    else getData $ returnTutorialTimes (T.pack code)\n+                                       (T.pack sect)\n+                                       (T.pack session)\n+    where\n+        getData info = do\n+            courseInfo <- info \n+            return (courseInfo, code, session, sect)\n+\n+-- ** Event Creation\n+\n+-- | Generates an event for each course.\n+getEvent :: String -> ([Time], String, String, String) -> [String]\n+getEvent timeSystem (timeFields, code, session, sect) = \n+    concat $ eventsByCourse code session sect start end dates timeSystem\n+    where\n+        dataInOrder = orderData timeFields\n+        start = startTime dataInOrder\n+        end = endTime dataInOrder\n+        dates = getDatesByCourse session dataInOrder\n+\n+-- | Creates an event for each course depending on its session.\n+eventsByCourse :: String -- ^ Course code.\n+            -> String -- ^ Course session.\n+            -> String -- ^ Course section.\n+            -> [[String]] -- ^ Start times.\n+            -> [[String]] -- ^ End times.\n+            -> [[(String, String)]] -- ^ Start/End dates.\n+            -> String -- ^ Current time.\n+            -> [[String]]\n+eventsByCourse code session sect start end dates timeSystem =\n+    if session == \"Y\" then year else halfCourse\n+    where\n+        year = halfFall ++ halfWinter\n+        halfFall = eventsByTime code sect start end (dates !! 0) timeSystem\n+        halfWinter = eventsByTime code sect start end (dates !! 1) timeSystem\n+        halfCourse = eventsByTime code sect start end (dates !! 0) timeSystem\n+\n+-- | Creates an event for each start/end time and date.\n+eventsByTime :: String -- ^ Course code.\n+             -> String  -- ^ Course section.\n+             -> [[String]] -- ^ Start times.\n+             -> [[String]] -- ^ End times.\n+             -> [(String, String)] -- ^ Start/End dates.\n+             -> String -- ^ Current time.\n+             -> [[String]]\n+eventsByTime code sect start end dates timeSystem =\n+    map (eventsByDate code sect timeSystem) (zip' start end dates)\n+\n+-- | Join three lists together in tuples of three elements\n+zip' :: [a] -> [b] -> [c] -> [(a,b,c)]\n+zip' (x:xs) (y2:ys) (z:zs) = (x,y2,z):zip' xs ys zs\n+zip' _ _ _ = []\n+\n+-- | Creates an event for each start/end time.\n+eventsByDate :: String -- ^ Course code.\n+             -> String -- ^ Course section.\n+             -> String -- ^ Current time.\n+             -> ([String], -- ^ Start time\n+             [String], -- ^ End time\n+             (String, String)) -- ^ Start/End date.\n+             -> [String]\n+eventsByDate code sect timeSystem (start, end, dates) =\n+    (zip start end) >>= (eventsGenerator code sect timeSystem dates)\n+\n+-- | Generates the string that represents each event.\n+eventsGenerator :: String -- ^ Course code.\n+                -> String -- ^ Course section.\n+                -> String -- ^ Current time.\n+                -> (String, String) -- ^ Start/End date.\n+                -> (String, String) -- ^ Start/End time.\n+                -> [String]\n+eventsGenerator code sect timeSystem (startDate, endDate) (start, end) =\n+    if startDate == \"\" || endDate == \"\"\n+    then []\n+    else [\"BEGIN:VEVENT\", \"DTSTAMP:\" ++ timeSystem,\n+          \"DTSTART;TZID=America/Toronto:\" ++ startDate ++ start,\n+          \"DTEND;TZID=America/Toronto:\" ++ startDate ++ end,\n+          \"RRULE:FREQ=WEEKLY;UNTIL=\" ++ endDate ++ \"000000Z\",\n+          \"ORGANIZER:University of Toronto\",\n+          \"SUMMARY:\" ++ code ++ \" \" ++ sect,\n+          \"CATEGORIES:EDUCATION\", \"END:VEVENT\"]\n+\n+-- ** Ordering data\n+\n+-- | Orders the time fields for each course; which were obtained from the\n+-- database\n+orderData :: [Time] -> [[[Double]]]\n+orderData courseFields = filter notNull (assignDay $ map timeField courseFields)\n+    where\n+        notNull field = not $ null field\n+\n+-- | Organizes the data by the day of the week, assigning a position based on\n+-- the day in the time field.\n+assignDay :: [[Double]] -> [[[Double]]]\n+assignDay lst = [monday, tuesday, wednesday, thursday, friday]\n+    where\n+        monday = filter (\\ field -> field !! 0 == 0.0) lst\n+        tuesday = filter (\\ field -> field !! 0 == 1.0) lst\n+        wednesday = filter (\\field -> field !! 0 == 2.0) lst\n+        thursday = filter (\\field -> field !! 0 == 3.0) lst\n+        friday = filter (\\field -> field !! 0 == 4.0) lst\n+\n+-- ** Start time\n+\n+-- | Obtains a list of start times for each course.\n+startTime :: [[[Double]]] -> [[String]]\n+startTime dataInOrder = map checkTimeStart dataInOrder\n+    where\n+        checkTimeStart dataByDay = \n+            map getStrTime ([head (sortList dataByDay)] ++\n+                        getStartConsecutives (sortList dataByDay))\n+        sortList dataDay = sort $ map (!! 1) dataDay\n+\n+-- | Gets the start times that are not the very first start time. \n+getStartConsecutives :: [Double] -> [Double]\n+getStartConsecutives lst = \n+    filter (/= 30.0) ([if lst !! i == lst !! (i + 1) - 0.5\n+                       then 30.0\n+                       else lst !! (i + 1)| i <- [0 .. l]])\n+    where\n+        l = length lst - 2\n+\n+-- ** End time\n+\n+-- | Obtains a list of end times for each course.\n+endTime :: [[[Double]]] -> [[String]]\n+endTime dataInOrder = map checkTimeEnd dataInOrder\n+    where\n+        checkTimeEnd dataByDay =\n+            map (getStrTime . (+ 0.5))\n+                (getEndConsecutives (sortList dataByDay) ++\n+                                     [last (sortList dataByDay)])\n+        sortList dataDay = sort $ map (!! 1) dataDay\n+\n+-- | Gets the end times that are not the very first end time. \n+getEndConsecutives :: [Double] -> [Double]\n+getEndConsecutives lst =\n+    filter (/= 30.0) ([if lst !! i == lst !! (i + 1) - 0.5\n+                       then 30.0\n+                       else lst !! i| i <- [0 .. l]])\n+    where\n+        l = length lst - 2\n+\n+-- ** Function that works for both start and end times\n+\n+-- | Creates a string time in the following way HourMinutesSeccondsZ.\n+-- For instance, 133500Z corresponds to 1:35 pm.\n+getStrTime :: Double -> String\n+getStrTime fullTime = if minutes == 0\n+                  then hour ++ \"0000\"\n+                  else hour ++ ratio minutes ++ \"00\"\n+    where\n+        hours = splitOn \".\" (show fullTime)\n+        hour = hours !! 0\n+        minutes = read $ hours !! 1 :: Int\n+\n+-- | Creates a string for the minutes.","path":"hs/CalendarResponse.hs","position":225,"original_position":225,"commit_id":"8c493823da8913ddf107283892dde15c8c4e4e65","original_commit_id":"8c493823da8913ddf107283892dde15c8c4e4e65","user":{"login":"Ian-Stewart-Binks","id":6301000,"avatar_url":"https://avatars.githubusercontent.com/u/6301000?v=3","gravatar_id":"","url":"https://api.github.com/users/Ian-Stewart-Binks","html_url":"https://github.com/Ian-Stewart-Binks","followers_url":"https://api.github.com/users/Ian-Stewart-Binks/followers","following_url":"https://api.github.com/users/Ian-Stewart-Binks/following{/other_user}","gists_url":"https://api.github.com/users/Ian-Stewart-Binks/gists{/gist_id}","starred_url":"https://api.github.com/users/Ian-Stewart-Binks/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ian-Stewart-Binks/subscriptions","organizations_url":"https://api.github.com/users/Ian-Stewart-Binks/orgs","repos_url":"https://api.github.com/users/Ian-Stewart-Binks/repos","events_url":"https://api.github.com/users/Ian-Stewart-Binks/events{/privacy}","received_events_url":"https://api.github.com/users/Ian-Stewart-Binks/received_events","type":"User","site_admin":false},"body":"This function doc doesn't make much sense to me. The name can be improved too. Try to describe precisely what this function does in the name.","created_at":"2015-07-27T23:28:04Z","updated_at":"2015-07-27T23:28:04Z","html_url":"https://github.com/Courseography/courseography/pull/684#discussion_r35599818","pull_request_url":"https://api.github.com/repos/Courseography/courseography/pulls/684","_links":{"self":{"href":"https://api.github.com/repos/Courseography/courseography/pulls/comments/35599818"},"html":{"href":"https://github.com/Courseography/courseography/pull/684#discussion_r35599818"},"pull_request":{"href":"https://api.github.com/repos/Courseography/courseography/pulls/684"}}},"pull_request":{"url":"https://api.github.com/repos/Courseography/courseography/pulls/684","id":40787948,"html_url":"https://github.com/Courseography/courseography/pull/684","diff_url":"https://github.com/Courseography/courseography/pull/684.diff","patch_url":"https://github.com/Courseography/courseography/pull/684.patch","issue_url":"https://api.github.com/repos/Courseography/courseography/issues/684","number":684,"state":"open","locked":false,"title":"ICalendar Event Generator","user":{"login":"GitGeminiano","id":11246238,"avatar_url":"https://avatars.githubusercontent.com/u/11246238?v=3","gravatar_id":"","url":"https://api.github.com/users/GitGeminiano","html_url":"https://github.com/GitGeminiano","followers_url":"https://api.github.com/users/GitGeminiano/followers","following_url":"https://api.github.com/users/GitGeminiano/following{/other_user}","gists_url":"https://api.github.com/users/GitGeminiano/gists{/gist_id}","starred_url":"https://api.github.com/users/GitGeminiano/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GitGeminiano/subscriptions","organizations_url":"https://api.github.com/users/GitGeminiano/orgs","repos_url":"https://api.github.com/users/GitGeminiano/repos","events_url":"https://api.github.com/users/GitGeminiano/events{/privacy}","received_events_url":"https://api.github.com/users/GitGeminiano/received_events","type":"User","site_admin":false},"body":"Dear Courseography members,\r\n\r\nI have been working on the event generator for Google Calendar and ICalendar. This is a working version of my work. Please let me know if changes are needed.\r\n\r\nBest Regards,\r\nChristian  Garcia","created_at":"2015-07-24T15:42:45Z","updated_at":"2015-07-27T23:28:04Z","closed_at":null,"merged_at":null,"merge_commit_sha":"dae7852c9289a48374582b58a3bd1d1b5030b4bf","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/Courseography/courseography/pulls/684/commits","review_comments_url":"https://api.github.com/repos/Courseography/courseography/pulls/684/comments","review_comment_url":"https://api.github.com/repos/Courseography/courseography/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Courseography/courseography/issues/684/comments","statuses_url":"https://api.github.com/repos/Courseography/courseography/statuses/8c493823da8913ddf107283892dde15c8c4e4e65","head":{"label":"GitGeminiano:IcalRepetitivePull","ref":"IcalRepetitivePull","sha":"8c493823da8913ddf107283892dde15c8c4e4e65","user":{"login":"GitGeminiano","id":11246238,"avatar_url":"https://avatars.githubusercontent.com/u/11246238?v=3","gravatar_id":"","url":"https://api.github.com/users/GitGeminiano","html_url":"https://github.com/GitGeminiano","followers_url":"https://api.github.com/users/GitGeminiano/followers","following_url":"https://api.github.com/users/GitGeminiano/following{/other_user}","gists_url":"https://api.github.com/users/GitGeminiano/gists{/gist_id}","starred_url":"https://api.github.com/users/GitGeminiano/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GitGeminiano/subscriptions","organizations_url":"https://api.github.com/users/GitGeminiano/orgs","repos_url":"https://api.github.com/users/GitGeminiano/repos","events_url":"https://api.github.com/users/GitGeminiano/events{/privacy}","received_events_url":"https://api.github.com/users/GitGeminiano/received_events","type":"User","site_admin":false},"repo":{"id":35104832,"name":"courseography","full_name":"GitGeminiano/courseography","owner":{"login":"GitGeminiano","id":11246238,"avatar_url":"https://avatars.githubusercontent.com/u/11246238?v=3","gravatar_id":"","url":"https://api.github.com/users/GitGeminiano","html_url":"https://github.com/GitGeminiano","followers_url":"https://api.github.com/users/GitGeminiano/followers","following_url":"https://api.github.com/users/GitGeminiano/following{/other_user}","gists_url":"https://api.github.com/users/GitGeminiano/gists{/gist_id}","starred_url":"https://api.github.com/users/GitGeminiano/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GitGeminiano/subscriptions","organizations_url":"https://api.github.com/users/GitGeminiano/orgs","repos_url":"https://api.github.com/users/GitGeminiano/repos","events_url":"https://api.github.com/users/GitGeminiano/events{/privacy}","received_events_url":"https://api.github.com/users/GitGeminiano/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/GitGeminiano/courseography","description":"Courseography is a tool created by David Liu and Ian Stewart-Binks to guide students through their undergraduate careers.","fork":true,"url":"https://api.github.com/repos/GitGeminiano/courseography","forks_url":"https://api.github.com/repos/GitGeminiano/courseography/forks","keys_url":"https://api.github.com/repos/GitGeminiano/courseography/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GitGeminiano/courseography/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GitGeminiano/courseography/teams","hooks_url":"https://api.github.com/repos/GitGeminiano/courseography/hooks","issue_events_url":"https://api.github.com/repos/GitGeminiano/courseography/issues/events{/number}","events_url":"https://api.github.com/repos/GitGeminiano/courseography/events","assignees_url":"https://api.github.com/repos/GitGeminiano/courseography/assignees{/user}","branches_url":"https://api.github.com/repos/GitGeminiano/courseography/branches{/branch}","tags_url":"https://api.github.com/repos/GitGeminiano/courseography/tags","blobs_url":"https://api.github.com/repos/GitGeminiano/courseography/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GitGeminiano/courseography/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GitGeminiano/courseography/git/refs{/sha}","trees_url":"https://api.github.com/repos/GitGeminiano/courseography/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GitGeminiano/courseography/statuses/{sha}","languages_url":"https://api.github.com/repos/GitGeminiano/courseography/languages","stargazers_url":"https://api.github.com/repos/GitGeminiano/courseography/stargazers","contributors_url":"https://api.github.com/repos/GitGeminiano/courseography/contributors","subscribers_url":"https://api.github.com/repos/GitGeminiano/courseography/subscribers","subscription_url":"https://api.github.com/repos/GitGeminiano/courseography/subscription","commits_url":"https://api.github.com/repos/GitGeminiano/courseography/commits{/sha}","git_commits_url":"https://api.github.com/repos/GitGeminiano/courseography/git/commits{/sha}","comments_url":"https://api.github.com/repos/GitGeminiano/courseography/comments{/number}","issue_comment_url":"https://api.github.com/repos/GitGeminiano/courseography/issues/comments{/number}","contents_url":"https://api.github.com/repos/GitGeminiano/courseography/contents/{+path}","compare_url":"https://api.github.com/repos/GitGeminiano/courseography/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GitGeminiano/courseography/merges","archive_url":"https://api.github.com/repos/GitGeminiano/courseography/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GitGeminiano/courseography/downloads","issues_url":"https://api.github.com/repos/GitGeminiano/courseography/issues{/number}","pulls_url":"https://api.github.com/repos/GitGeminiano/courseography/pulls{/number}","milestones_url":"https://api.github.com/repos/GitGeminiano/courseography/milestones{/number}","notifications_url":"https://api.github.com/repos/GitGeminiano/courseography/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GitGeminiano/courseography/labels{/name}","releases_url":"https://api.github.com/repos/GitGeminiano/courseography/releases{/id}","created_at":"2015-05-05T14:29:25Z","updated_at":"2015-05-05T14:29:26Z","pushed_at":"2015-07-27T15:43:20Z","git_url":"git://github.com/GitGeminiano/courseography.git","ssh_url":"git@github.com:GitGeminiano/courseography.git","clone_url":"https://github.com/GitGeminiano/courseography.git","svn_url":"https://github.com/GitGeminiano/courseography","homepage":"","size":28378,"stargazers_count":0,"watchers_count":0,"language":"Haskell","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":"Courseography:master","ref":"master","sha":"3173fd35d6981b1a825dbcd208204f759fdcf616","user":{"login":"Courseography","id":9721671,"avatar_url":"https://avatars.githubusercontent.com/u/9721671?v=3","gravatar_id":"","url":"https://api.github.com/users/Courseography","html_url":"https://github.com/Courseography","followers_url":"https://api.github.com/users/Courseography/followers","following_url":"https://api.github.com/users/Courseography/following{/other_user}","gists_url":"https://api.github.com/users/Courseography/gists{/gist_id}","starred_url":"https://api.github.com/users/Courseography/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Courseography/subscriptions","organizations_url":"https://api.github.com/users/Courseography/orgs","repos_url":"https://api.github.com/users/Courseography/repos","events_url":"https://api.github.com/users/Courseography/events{/privacy}","received_events_url":"https://api.github.com/users/Courseography/received_events","type":"Organization","site_admin":false},"repo":{"id":16873349,"name":"courseography","full_name":"Courseography/courseography","owner":{"login":"Courseography","id":9721671,"avatar_url":"https://avatars.githubusercontent.com/u/9721671?v=3","gravatar_id":"","url":"https://api.github.com/users/Courseography","html_url":"https://github.com/Courseography","followers_url":"https://api.github.com/users/Courseography/followers","following_url":"https://api.github.com/users/Courseography/following{/other_user}","gists_url":"https://api.github.com/users/Courseography/gists{/gist_id}","starred_url":"https://api.github.com/users/Courseography/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Courseography/subscriptions","organizations_url":"https://api.github.com/users/Courseography/orgs","repos_url":"https://api.github.com/users/Courseography/repos","events_url":"https://api.github.com/users/Courseography/events{/privacy}","received_events_url":"https://api.github.com/users/Courseography/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Courseography/courseography","description":"Courseography is a tool created by David Liu and Ian Stewart-Binks to guide students through their undergraduate careers.","fork":false,"url":"https://api.github.com/repos/Courseography/courseography","forks_url":"https://api.github.com/repos/Courseography/courseography/forks","keys_url":"https://api.github.com/repos/Courseography/courseography/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Courseography/courseography/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Courseography/courseography/teams","hooks_url":"https://api.github.com/repos/Courseography/courseography/hooks","issue_events_url":"https://api.github.com/repos/Courseography/courseography/issues/events{/number}","events_url":"https://api.github.com/repos/Courseography/courseography/events","assignees_url":"https://api.github.com/repos/Courseography/courseography/assignees{/user}","branches_url":"https://api.github.com/repos/Courseography/courseography/branches{/branch}","tags_url":"https://api.github.com/repos/Courseography/courseography/tags","blobs_url":"https://api.github.com/repos/Courseography/courseography/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Courseography/courseography/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Courseography/courseography/git/refs{/sha}","trees_url":"https://api.github.com/repos/Courseography/courseography/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Courseography/courseography/statuses/{sha}","languages_url":"https://api.github.com/repos/Courseography/courseography/languages","stargazers_url":"https://api.github.com/repos/Courseography/courseography/stargazers","contributors_url":"https://api.github.com/repos/Courseography/courseography/contributors","subscribers_url":"https://api.github.com/repos/Courseography/courseography/subscribers","subscription_url":"https://api.github.com/repos/Courseography/courseography/subscription","commits_url":"https://api.github.com/repos/Courseography/courseography/commits{/sha}","git_commits_url":"https://api.github.com/repos/Courseography/courseography/git/commits{/sha}","comments_url":"https://api.github.com/repos/Courseography/courseography/comments{/number}","issue_comment_url":"https://api.github.com/repos/Courseography/courseography/issues/comments{/number}","contents_url":"https://api.github.com/repos/Courseography/courseography/contents/{+path}","compare_url":"https://api.github.com/repos/Courseography/courseography/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Courseography/courseography/merges","archive_url":"https://api.github.com/repos/Courseography/courseography/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Courseography/courseography/downloads","issues_url":"https://api.github.com/repos/Courseography/courseography/issues{/number}","pulls_url":"https://api.github.com/repos/Courseography/courseography/pulls{/number}","milestones_url":"https://api.github.com/repos/Courseography/courseography/milestones{/number}","notifications_url":"https://api.github.com/repos/Courseography/courseography/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Courseography/courseography/labels{/name}","releases_url":"https://api.github.com/repos/Courseography/courseography/releases{/id}","created_at":"2014-02-15T22:32:22Z","updated_at":"2015-07-18T02:09:22Z","pushed_at":"2015-07-27T15:43:20Z","git_url":"git://github.com/Courseography/courseography.git","ssh_url":"git@github.com:Courseography/courseography.git","clone_url":"https://github.com/Courseography/courseography.git","svn_url":"https://github.com/Courseography/courseography","homepage":"","size":41960,"stargazers_count":12,"watchers_count":12,"language":"Haskell","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":21,"mirror_url":null,"open_issues_count":43,"forks":21,"open_issues":43,"watchers":12,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Courseography/courseography/pulls/684"},"html":{"href":"https://github.com/Courseography/courseography/pull/684"},"issue":{"href":"https://api.github.com/repos/Courseography/courseography/issues/684"},"comments":{"href":"https://api.github.com/repos/Courseography/courseography/issues/684/comments"},"review_comments":{"href":"https://api.github.com/repos/Courseography/courseography/pulls/684/comments"},"review_comment":{"href":"https://api.github.com/repos/Courseography/courseography/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Courseography/courseography/pulls/684/commits"},"statuses":{"href":"https://api.github.com/repos/Courseography/courseography/statuses/8c493823da8913ddf107283892dde15c8c4e4e65"}}}}