{"action":"created","comment":{"url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/pulls/comments/47359857","id":47359857,"diff_hunk":"@@ -0,0 +1,293 @@\n++++\n+author = [\"Sarah Adams\"]\n+date = \"2015-12-14T22:04:31-08:00\"\n+series = [\"Advent 2015\"]\n+title = \"test2doc: Generate Your API Docs\"\n+\n++++\n+\n+API docs are important. We all know that.\n+They are also painful and tedious to maintain.\n+When your docs aren't accurate, you get more questions. And everyone \n+loses time.\n+\n+I've always thought of unit tests as a great source of documentation. \n+But the non-Go engineers consuming my API don't often agree.\n+\n+Yet most of the same information is there:\n+\n+- request format:\n+    - HTTP method\n+    - URI\n+    - query params\n+    - request headers\n+    - request body\n+- response format:\n+    - status code\n+    - response headers\n+    - response body\n+\n+<br>\n+All that's missing from this list is the \n+**high-level descriptions**, the **context**.\n+\n+Enter *Go doc*.<br>\n+We can find descriptions of an HTTP handler in its Go doc string, eg:\n+```go\n+// GetWidget retrieves a single Widget\n+func GetWidget(w http.ResponseWriter, req *http.Request) {\n+    // ...\n+}\n+```\n+<br>\n+And thus began **test2doc** - automatically generate complete API \n+documentation from your existing Go unit tests + Go doc strings.\n+\n+\n+## Example\n+\n+Given an HTTP handler func, eg.:\n+\n+```go\n+// GetWidget retrieves a single Widget\n+func GetWidget(w http.ResponseWriter, req *http.Request) {\n+    // ...\n+}\n+```\n+\n+And a test for this handler func, eg.:\n+\n+```go\n+func TestGetWidget(t *testing.T) {\n+    urlPath := fmt.Sprintf(\"/widgets/%d\", 2)\n+\n+    resp, err := http.Get(server.URL + urlPath)\n+    // assert all the things...\n+}\n+```\n+\n+Test2doc will automatically generate markdown documentation for this \n+endpoint in the [API Blueprint](https://github.com/apiaryio/api-blueprint/blob/master/API%20Blueprint%20Specification.md) \n+format as your tests run, like so:\n+\n+```\n+# Group widgets\n+\n+## /widgets/{id}\n+\n++ Parameters\n+    + id: `2` (number)\n+\n+### Get Widget [GET]\n+retrieves a single Widget\n+\n++ Response 200 \n+\n+    + Body\n+\n+            {\n+                \"Id\": 2,\n+                \"Name\": \"Pencil\",\n+                \"Role\": \"Utensil\"\n+            }        \n+```\n+\n+Which you can then parse and host w/ \n+[Apiary.io](http://docs.testingit.apiary.io/#): \n+![screenshot](/postimages/advent-2015/test2doc-widgets-api.jpg)\n+\n+Or use a custom parser and host yourself.\n+\n+## Getting started with test2doc\n+A big goal of mine as I was writing this project was to limit the \n+amount of additional code needed to get test2doc up and running.\n+\n+Requirements:\n+\n+1. You must have a `TestMain` for each of the packages you wish to \n+document.\n+2. All of the tests in your package must share a single `test.Server` \n+instance (from [test2doc/test](https://godoc.org/github.com/adams-sarah/test2doc/test) package)\n+\n+\n+### 3 Code Additions\n+\n+3 additions, and only to your testing code:\n+\n+```go\n+package widgets_test\n+\n+import (\n+\t\"testing\"\n+\n+\t\"github.com/adams-sarah/test2doc/test\"\n+)\n+\n+var server *test.Server\n+\n+func TestMain(m *testing.M) {\n+\t// 1. Tell test2doc how to get URL vars out of your HTTP requests\n+\t//\n+\t//    The 'URLVarExtractor' function must have the following signature:\n+\t//      func(req *http.Request) map[string]string\n+\t//      where the returned map is of the form map[key]value\n+\ttest.RegisterURLVarExtractor(myURLVarExtractorFn)\n+\n+\n+\t// 2. You must use test2doc/test's wrapped httptest.Server instead of\n+\t//    the raw httptest.Server, so that test2doc can listen to and\n+\t//    record requests & responses.\n+\t//\n+\t//    NewServer takes your HTTP handler as an argument\n+\tserver, err := test.NewServer(router)\n+\tif err != nil {\n+\t\tpanic(err.Error())\n+\t}\n+\n+\t// .. then run your tests as usual\n+\texitCode := m.Run()\n+\n+\n+\t// 3. Finally, you must tell the wrapped server when you are done testing\n+\t//    so that the buffer can be flushed to an API Blueprint doc file\n+\tserver.Finish()\n+\n+\t// note that os.Exit does not respect defers.\n+\tos.Exit(exitCode)\n+}\n+\n+```\n+\n+Some example `URLVarExtractor`s for different routers:\n+\n+`gorilla/mux`:\n+\n+```go\n+// NOTE: if you are using gorilla/mux, you must set the \n+// router's 'KeepContext' to true, so that url parameters \n+// can be accessed after the request has been handled.\n+router.KeepContext = true\n+    \n+// Use mux.Vars func as URLVarExtractor\n+test.RegisterURLVarExtractor(mux.Vars)\n+```\n+<br>\n+\n+`julienschmidt/httprouter`:\n+\n+```go\n+import (\n+\t\"net/http\"\n+\n+\t\"github.com/adams-sarah/test2doc/doc/parse\"\n+\t\"github.com/julienschmidt/httprouter\"\n+)\n+\n+// MakeURLVarExtractor returns a func which extracts \n+// url vars from a request for test2doc documentation generation\n+func MakeURLVarExtractor(router *httprouter.Router) parse.URLVarExtractor {\n+\treturn func(req *http.Request) map[string]string {\n+\t\t// httprouter Lookup func needs a trailing slash on path\n+\t\tpath := req.URL.Path\n+\t\tif !strings.HasSuffix(path, \"/\") {\n+\t\t\tpath += \"/\"\n+\t\t}\n+\n+\t\t_, params, ok := router.Lookup(req.Method, path)\n+\t\tif !ok {\n+\t\t\treturn nil\n+\t\t}\n+\n+\t\tparamsMap := make(map[string]string, len(params))\n+\t\tfor _, p := range params {\n+\t\t\tparamsMap[p.Key] = p.Value\n+\t\t}\n+\n+\t\treturn paramsMap\n+\t}\n+}\n+\n+// and then..\n+test.RegisterURLVarExtractor(MakeURLVarExtractor(router))\n+```\n+<br>\n+\n+## How the magic happens\n+\n+### Recording Requests and Responses:\n+Recording the requests and responses was pretty straight-forward:\n+\n+1. Write the HTTP handler's response initially to an `http.ResponseRecorder`\n+2. Add the response header/body to the documentation\n+3. Copy the response back to the original `http.ResponseWriter`\n+4. Continue executing the test\n+\n+\n+### Fetching the handler's Go doc string:\n+First, let's take a look at the `http.ResponseWriter` interface\n+from Go's `net/http` package:\n+\n+```go\n+type ResponseWriter interface {\n+        Header() Header\n+        Write([]byte) (int, error)\n+        WriteHeader(int)\n+}\n+```\n+\n+\n+test2doc has its own `ResponseWriter`, which implements\n+`http.ResponseWriter`, and looks something like this:\n+\n+```go\n+type ResponseWriter struct {\n+\tHandlerInfo HandlerInfo\n+\tURLVars     map[string]string\n+\tW           *httptest.ResponseRecorder\n+}\n+```\n+\n+Test2doc's `ResponseWriter` implements the `Header` and \n+`WriteHeader` methods by just falling back those of its ","path":"content/advent-2015/test2doc-generate-your-api-docs.md","position":251,"original_position":251,"commit_id":"c42d380e4f336c7dd422f45456c1b9383194afbe","original_commit_id":"c42d380e4f336c7dd422f45456c1b9383194afbe","user":{"login":"sbinet","id":1070920,"avatar_url":"https://avatars.githubusercontent.com/u/1070920?v=3","gravatar_id":"","url":"https://api.github.com/users/sbinet","html_url":"https://github.com/sbinet","followers_url":"https://api.github.com/users/sbinet/followers","following_url":"https://api.github.com/users/sbinet/following{/other_user}","gists_url":"https://api.github.com/users/sbinet/gists{/gist_id}","starred_url":"https://api.github.com/users/sbinet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sbinet/subscriptions","organizations_url":"https://api.github.com/users/sbinet/orgs","repos_url":"https://api.github.com/users/sbinet/repos","events_url":"https://api.github.com/users/sbinet/events{/privacy}","received_events_url":"https://api.github.com/users/sbinet/received_events","type":"User","site_admin":false},"body":"`s/back those/back to those` ?","created_at":"2015-12-11T14:30:54Z","updated_at":"2015-12-11T14:30:54Z","html_url":"https://github.com/gopheracademy/gopheracademy-web/pull/147#discussion_r47359857","pull_request_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/pulls/147","_links":{"self":{"href":"https://api.github.com/repos/gopheracademy/gopheracademy-web/pulls/comments/47359857"},"html":{"href":"https://github.com/gopheracademy/gopheracademy-web/pull/147#discussion_r47359857"},"pull_request":{"href":"https://api.github.com/repos/gopheracademy/gopheracademy-web/pulls/147"}}},"pull_request":{"url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/pulls/147","id":52933616,"html_url":"https://github.com/gopheracademy/gopheracademy-web/pull/147","diff_url":"https://github.com/gopheracademy/gopheracademy-web/pull/147.diff","patch_url":"https://github.com/gopheracademy/gopheracademy-web/pull/147.patch","issue_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/issues/147","number":147,"state":"open","locked":false,"title":"12/14 article: test2doc","user":{"login":"adams-sarah","id":2741356,"avatar_url":"https://avatars.githubusercontent.com/u/2741356?v=3","gravatar_id":"","url":"https://api.github.com/users/adams-sarah","html_url":"https://github.com/adams-sarah","followers_url":"https://api.github.com/users/adams-sarah/followers","following_url":"https://api.github.com/users/adams-sarah/following{/other_user}","gists_url":"https://api.github.com/users/adams-sarah/gists{/gist_id}","starred_url":"https://api.github.com/users/adams-sarah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adams-sarah/subscriptions","organizations_url":"https://api.github.com/users/adams-sarah/orgs","repos_url":"https://api.github.com/users/adams-sarah/repos","events_url":"https://api.github.com/users/adams-sarah/events{/privacy}","received_events_url":"https://api.github.com/users/adams-sarah/received_events","type":"User","site_admin":false},"body":"This is a little early, but here's my article on test2doc scheduled for 12/14.\r\n\r\nCheers!\r\nSarah","created_at":"2015-12-08T03:17:33Z","updated_at":"2015-12-11T14:30:54Z","closed_at":null,"merged_at":null,"merge_commit_sha":"bd944fd59f0dec17b4872d65b43175f1cdf4d075","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/pulls/147/commits","review_comments_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/pulls/147/comments","review_comment_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/pulls/comments{/number}","comments_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/issues/147/comments","statuses_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/statuses/c42d380e4f336c7dd422f45456c1b9383194afbe","head":{"label":"adams-sarah:master","ref":"master","sha":"c42d380e4f336c7dd422f45456c1b9383194afbe","user":{"login":"adams-sarah","id":2741356,"avatar_url":"https://avatars.githubusercontent.com/u/2741356?v=3","gravatar_id":"","url":"https://api.github.com/users/adams-sarah","html_url":"https://github.com/adams-sarah","followers_url":"https://api.github.com/users/adams-sarah/followers","following_url":"https://api.github.com/users/adams-sarah/following{/other_user}","gists_url":"https://api.github.com/users/adams-sarah/gists{/gist_id}","starred_url":"https://api.github.com/users/adams-sarah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adams-sarah/subscriptions","organizations_url":"https://api.github.com/users/adams-sarah/orgs","repos_url":"https://api.github.com/users/adams-sarah/repos","events_url":"https://api.github.com/users/adams-sarah/events{/privacy}","received_events_url":"https://api.github.com/users/adams-sarah/received_events","type":"User","site_admin":false},"repo":{"id":47151225,"name":"gopheracademy-web","full_name":"adams-sarah/gopheracademy-web","owner":{"login":"adams-sarah","id":2741356,"avatar_url":"https://avatars.githubusercontent.com/u/2741356?v=3","gravatar_id":"","url":"https://api.github.com/users/adams-sarah","html_url":"https://github.com/adams-sarah","followers_url":"https://api.github.com/users/adams-sarah/followers","following_url":"https://api.github.com/users/adams-sarah/following{/other_user}","gists_url":"https://api.github.com/users/adams-sarah/gists{/gist_id}","starred_url":"https://api.github.com/users/adams-sarah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adams-sarah/subscriptions","organizations_url":"https://api.github.com/users/adams-sarah/orgs","repos_url":"https://api.github.com/users/adams-sarah/repos","events_url":"https://api.github.com/users/adams-sarah/events{/privacy}","received_events_url":"https://api.github.com/users/adams-sarah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/adams-sarah/gopheracademy-web","description":"Public Website for blog.GopherAcademy.com","fork":true,"url":"https://api.github.com/repos/adams-sarah/gopheracademy-web","forks_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/forks","keys_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/keys{/key_id}","collaborators_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/teams","hooks_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/hooks","issue_events_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/issues/events{/number}","events_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/events","assignees_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/assignees{/user}","branches_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/branches{/branch}","tags_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/tags","blobs_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/git/refs{/sha}","trees_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/git/trees{/sha}","statuses_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/statuses/{sha}","languages_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/languages","stargazers_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/stargazers","contributors_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/contributors","subscribers_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/subscribers","subscription_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/subscription","commits_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/commits{/sha}","git_commits_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/git/commits{/sha}","comments_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/comments{/number}","issue_comment_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/issues/comments{/number}","contents_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/contents/{+path}","compare_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/compare/{base}...{head}","merges_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/merges","archive_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/downloads","issues_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/issues{/number}","pulls_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/pulls{/number}","milestones_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/milestones{/number}","notifications_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/labels{/name}","releases_url":"https://api.github.com/repos/adams-sarah/gopheracademy-web/releases{/id}","created_at":"2015-11-30T22:57:35Z","updated_at":"2015-11-30T22:57:37Z","pushed_at":"2015-12-10T18:25:18Z","git_url":"git://github.com/adams-sarah/gopheracademy-web.git","ssh_url":"git@github.com:adams-sarah/gopheracademy-web.git","clone_url":"https://github.com/adams-sarah/gopheracademy-web.git","svn_url":"https://github.com/adams-sarah/gopheracademy-web","homepage":"http://blog.gopheracademy.com","size":11393,"stargazers_count":0,"watchers_count":0,"language":"CSS","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":"gopheracademy:master","ref":"master","sha":"896be3d119489426a3884d39c54f8482e82d428d","user":{"login":"gopheracademy","id":7428627,"avatar_url":"https://avatars.githubusercontent.com/u/7428627?v=3","gravatar_id":"","url":"https://api.github.com/users/gopheracademy","html_url":"https://github.com/gopheracademy","followers_url":"https://api.github.com/users/gopheracademy/followers","following_url":"https://api.github.com/users/gopheracademy/following{/other_user}","gists_url":"https://api.github.com/users/gopheracademy/gists{/gist_id}","starred_url":"https://api.github.com/users/gopheracademy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gopheracademy/subscriptions","organizations_url":"https://api.github.com/users/gopheracademy/orgs","repos_url":"https://api.github.com/users/gopheracademy/repos","events_url":"https://api.github.com/users/gopheracademy/events{/privacy}","received_events_url":"https://api.github.com/users/gopheracademy/received_events","type":"Organization","site_admin":false},"repo":{"id":23665322,"name":"gopheracademy-web","full_name":"gopheracademy/gopheracademy-web","owner":{"login":"gopheracademy","id":7428627,"avatar_url":"https://avatars.githubusercontent.com/u/7428627?v=3","gravatar_id":"","url":"https://api.github.com/users/gopheracademy","html_url":"https://github.com/gopheracademy","followers_url":"https://api.github.com/users/gopheracademy/followers","following_url":"https://api.github.com/users/gopheracademy/following{/other_user}","gists_url":"https://api.github.com/users/gopheracademy/gists{/gist_id}","starred_url":"https://api.github.com/users/gopheracademy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gopheracademy/subscriptions","organizations_url":"https://api.github.com/users/gopheracademy/orgs","repos_url":"https://api.github.com/users/gopheracademy/repos","events_url":"https://api.github.com/users/gopheracademy/events{/privacy}","received_events_url":"https://api.github.com/users/gopheracademy/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/gopheracademy/gopheracademy-web","description":"Public Website for blog.GopherAcademy.com","fork":false,"url":"https://api.github.com/repos/gopheracademy/gopheracademy-web","forks_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/forks","keys_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/keys{/key_id}","collaborators_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/teams","hooks_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/hooks","issue_events_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/issues/events{/number}","events_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/events","assignees_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/assignees{/user}","branches_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/branches{/branch}","tags_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/tags","blobs_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/git/refs{/sha}","trees_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/git/trees{/sha}","statuses_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/statuses/{sha}","languages_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/languages","stargazers_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/stargazers","contributors_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/contributors","subscribers_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/subscribers","subscription_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/subscription","commits_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/commits{/sha}","git_commits_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/git/commits{/sha}","comments_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/comments{/number}","issue_comment_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/issues/comments{/number}","contents_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/contents/{+path}","compare_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/compare/{base}...{head}","merges_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/merges","archive_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/downloads","issues_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/issues{/number}","pulls_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/pulls{/number}","milestones_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/milestones{/number}","notifications_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/labels{/name}","releases_url":"https://api.github.com/repos/gopheracademy/gopheracademy-web/releases{/id}","created_at":"2014-09-04T14:18:26Z","updated_at":"2015-12-10T16:57:17Z","pushed_at":"2015-12-11T09:29:19Z","git_url":"git://github.com/gopheracademy/gopheracademy-web.git","ssh_url":"git@github.com:gopheracademy/gopheracademy-web.git","clone_url":"https://github.com/gopheracademy/gopheracademy-web.git","svn_url":"https://github.com/gopheracademy/gopheracademy-web","homepage":"http://blog.gopheracademy.com","size":11501,"stargazers_count":67,"watchers_count":67,"language":"CSS","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":69,"mirror_url":null,"open_issues_count":5,"forks":69,"open_issues":5,"watchers":67,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/gopheracademy/gopheracademy-web/pulls/147"},"html":{"href":"https://github.com/gopheracademy/gopheracademy-web/pull/147"},"issue":{"href":"https://api.github.com/repos/gopheracademy/gopheracademy-web/issues/147"},"comments":{"href":"https://api.github.com/repos/gopheracademy/gopheracademy-web/issues/147/comments"},"review_comments":{"href":"https://api.github.com/repos/gopheracademy/gopheracademy-web/pulls/147/comments"},"review_comment":{"href":"https://api.github.com/repos/gopheracademy/gopheracademy-web/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/gopheracademy/gopheracademy-web/pulls/147/commits"},"statuses":{"href":"https://api.github.com/repos/gopheracademy/gopheracademy-web/statuses/c42d380e4f336c7dd422f45456c1b9383194afbe"}}}}