{"action":"created","comment":{"url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/pulls/comments/177077773","pull_request_review_id":106887321,"id":177077773,"diff_hunk":"@@ -0,0 +1,116 @@\n+---\n+layout: post\n+title:  \"Yet Another Crossword Data Format\"\n+date:   2018-03-23 10:30:30 +0100\n+categories: Experiment\n+teaser: Experiment\n+excerpt: >\n+  Defining a new data format for simple crosswords\n+---\n+When starting our interactive crossword project (link), we looked for an existing crossword data format, but not many were documented and widely used. Not wishing to create [Yet Another Standard](https://xkcd.com/927/), we went with [https://www.xwordinfo.com/JSON/](https://www.xwordinfo.com/JSON/) but it proved too error-prone, and forced a clumsy parse/build structure on the code. After several acrimonious intra-team discussions, we looked for ‘a better way’, and a new format was born.\n+\n+```yaml\n+version: standard v1\n+name: Crossword 15800\n+author: Julius\n+editor: Colin Inman\n+copyright: 2018, Financial Times\n+publisher: Financial Times\n+pubdate: 2018/03/07\n+size: 15x15\n+across:\n+- (1,1) 1. Reviewed bistrot/cafe <i>La Maison</i>: sandwiches \"criminal\" (10)\n+- (12,1) 6. ,10. Steer clear of wildcat general strike; it's a tragedy eerst (4)\n+- (1,3) 9. New salary caps not introduced at work; it gets up my nose (5,5)\n+- (12,3) 10. See 6 across (4)\n+- (4,5) 12. Live like a king with dad in castles in far-flung places (7,5)\n+- (1,7) 15. Got up and prepared the pizza base (6,3)\n+- (11,7) 17. She's an inspiration for occasionally weird author (5)\n+- (1,9) 18. Heads of Foreign Office committee unusually struggle to concentrate . . . . (5)\n+- (7,9) 19. . . . . as multiple channels stream Tory with excellent oratory skills (9)\n+- (1,11) 20. Design squalid sites as means to raise quick cash? (6,6)\n+- (1,13) 24. ,26. Suites arranged to suit Norwegian's booking? (4)\n+- (6,13) 25. Like the tale of bird fencing Romeo's mate's stolen car? (10)\n+- (1,15) 26. See 24 across (4)\n+- (6,15) 27. Fake uni degrees heavily attacked (5,5)\n+down:\n+- (1,1) 1. ,2. Somewhat hormonal, Isabella is an enigmatic figure (4)\n+- (3,1) 2. See 1 down (4)\n+- (5,1) 3. Didn't Trump go after journalist with court case? (8,4)\n+- (7,1) 4. Old Bill gathered wood (5)\n+- (9,1) 5. Hirsute character in Oxford University called Brown (9)\n+- (13,1) 7. In European empty bar I had dinner date resembling Edna (10)\n+- (15,1) 8. Rustic logs chopped for those making camp fire? (4,6)\n+- (11,4) 11. Names US mountains as stated by Yankee (12)\n+- (1,6) 13. Let rip guff; foul smell gets up one's nose! (7-3)\n+- (3,6) 14. Piece of ebony ruler? (5,5)\n+- (7,7) 16. Not for the first time, falls over, leaving artist to support old morthern church (4,5)\n+- (9,11) 21. Composer putting note in envelope (no stamp required) (5)\n+- (13,12) 22. ,23. Book a month to take over from glum donkey (4)\n+- (15,12) 23. See 22 down (4)\n+```\n+The above example of the new crossword data format describes [Crossword No.15,800 Set by Julius on 2018/03/07](https://www.ft.com/__origami/service/image/v2/images/raw/ftcms:bdb7ea5a-1875-11e8-9e9c-25c814761640?source=crosswordsftcom),\n+\n+{% include figure-noimgservice.html src=\"https://www.ft.com/__origami/service/image/v2/images/raw/ftcms:bdb7ea5a-1875-11e8-9e9c-25c814761640?source=crosswordsftcom\" alt=\"A example of the new crossword data format\" width=\"100%\" %}\n+\n+and drives [an interactive version](https://labs.ft.com/crosswords/2018/03/07/Puzzle-15800-dynamic.html).\n+\n+# The new format\n+\n+The crossword data format is a DSL, [a Domain Specific Language](https://en.wikipedia.org/wiki/Domain-specific_language), being an concise, clear, human-readable piece of text that specifies how to construct a simple crossword.\n+\n+It is written in [YAML](https://en.wikipedia.org/wiki/YAML). Or rather, nearly YAML. The line items for each clue need to be wrapped in quotes in order to accommodate colons and speech marks in the clue. Currently our implementation fails to take this into account, parsing the text directly and not as YAML.\n+\n+Blank lines and comments (starting with #) are ignored.\n+\n+There are several mandatory fields such as ‘name’ (which should be unique across all the crosswords), ‘author’, and ‘size’.\n+\n+The clues are grouped as lists named ‘across’ and ‘down’.\n+\n+Each clue has the form: - `(COORDINATES) IDS. Clue text (ANSWER)`\n+\n+COORDINATES are (across, down), with (1,1) being the top left square.\n+\n+The IDS identify each clue, and also tie together subsequent (comma-separated) clue ids for answers which straddle multiple positions on the grid. The subsequent IDS numbers might have an associated ‘down’ or ‘across’ if needed to disambiguate when a particular clue id has both aspects.\n+\n+The ANSWER is a sequence of words or numbers separated by commas or hyphens. Very obscure crosswords might want to have full stops, colons, or semi-colons in there too, and this format could handle them.\n+\n+The Clue text can include basic html formatting such as italics. A restriction of the YAML format means that there can be no bare square brackets, speech marks, colons, etc in the clue and answer texts, but the line (after the initial hyphen) can be wrapped in quotes to overcome that.\n+\n+# Using the format\n+\n+The format is easy to read, debug, and edit manually. This is probably its main benefit when compared with the other formats out there.\n+\n+It is easy to parse and validate, at a basic level, to check that all the mandatory details and structure are present and correct.\n+\n+A little more effort (by unpacking the clues into a grid) is needed to ensure that\n+\n+* the answers fit within the stated size of the grid,\n+* the clues are numbered appropriately,\n+* and the answer letters agree at every intersection .\n+\n+We have several different incoming data formats for crosswords published by the FT, including some (undocumented) XML exported from a commercial crossword compiling tool, [CCW](https://www.crossword-compiler.com/), and a bespoke (but consistently-formatted) word doc. It has proved relatively simple to transform them into the new YAML format, and import that into our new crossword implementation.","path":"_posts/2018-03-23-crossword-data-format.md","position":92,"original_position":92,"commit_id":"ffd15b0253695e14ae4171a5bbb60a31212fc8c3","original_commit_id":"b1a62e3945f7e0de598b51024d090a15f05f77ae","user":{"login":"Lily2point0","id":3882381,"avatar_url":"https://avatars3.githubusercontent.com/u/3882381?v=4","gravatar_id":"","url":"https://api.github.com/users/Lily2point0","html_url":"https://github.com/Lily2point0","followers_url":"https://api.github.com/users/Lily2point0/followers","following_url":"https://api.github.com/users/Lily2point0/following{/other_user}","gists_url":"https://api.github.com/users/Lily2point0/gists{/gist_id}","starred_url":"https://api.github.com/users/Lily2point0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Lily2point0/subscriptions","organizations_url":"https://api.github.com/users/Lily2point0/orgs","repos_url":"https://api.github.com/users/Lily2point0/repos","events_url":"https://api.github.com/users/Lily2point0/events{/privacy}","received_events_url":"https://api.github.com/users/Lily2point0/received_events","type":"User","site_admin":false},"body":"\"word document\", or even \"Word document\"?","created_at":"2018-03-26T12:52:44Z","updated_at":"2018-03-26T12:52:44Z","html_url":"https://github.com/ftlabs/ftlabs.github.io/pull/55#discussion_r177077773","pull_request_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/pulls/55","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/ftlabs/ftlabs.github.io/pulls/comments/177077773"},"html":{"href":"https://github.com/ftlabs/ftlabs.github.io/pull/55#discussion_r177077773"},"pull_request":{"href":"https://api.github.com/repos/ftlabs/ftlabs.github.io/pulls/55"}}},"pull_request":{"url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/pulls/55","id":177093587,"html_url":"https://github.com/ftlabs/ftlabs.github.io/pull/55","diff_url":"https://github.com/ftlabs/ftlabs.github.io/pull/55.diff","patch_url":"https://github.com/ftlabs/ftlabs.github.io/pull/55.patch","issue_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/issues/55","number":55,"state":"open","locked":false,"title":"1st draft of crossword data post","user":{"login":"railsagainstignorance","id":250310,"avatar_url":"https://avatars1.githubusercontent.com/u/250310?v=4","gravatar_id":"","url":"https://api.github.com/users/railsagainstignorance","html_url":"https://github.com/railsagainstignorance","followers_url":"https://api.github.com/users/railsagainstignorance/followers","following_url":"https://api.github.com/users/railsagainstignorance/following{/other_user}","gists_url":"https://api.github.com/users/railsagainstignorance/gists{/gist_id}","starred_url":"https://api.github.com/users/railsagainstignorance/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/railsagainstignorance/subscriptions","organizations_url":"https://api.github.com/users/railsagainstignorance/orgs","repos_url":"https://api.github.com/users/railsagainstignorance/repos","events_url":"https://api.github.com/users/railsagainstignorance/events{/privacy}","received_events_url":"https://api.github.com/users/railsagainstignorance/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-03-23T14:53:36Z","updated_at":"2018-03-26T12:52:44Z","closed_at":null,"merged_at":null,"merge_commit_sha":"027bbd28a704ae2e7a799200128d381f544e5228","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/pulls/55/commits","review_comments_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/pulls/55/comments","review_comment_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/issues/55/comments","statuses_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/statuses/ffd15b0253695e14ae4171a5bbb60a31212fc8c3","head":{"label":"ftlabs:blogpost/crossworddataformat","ref":"blogpost/crossworddataformat","sha":"ffd15b0253695e14ae4171a5bbb60a31212fc8c3","user":{"login":"ftlabs","id":1432696,"avatar_url":"https://avatars3.githubusercontent.com/u/1432696?v=4","gravatar_id":"","url":"https://api.github.com/users/ftlabs","html_url":"https://github.com/ftlabs","followers_url":"https://api.github.com/users/ftlabs/followers","following_url":"https://api.github.com/users/ftlabs/following{/other_user}","gists_url":"https://api.github.com/users/ftlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/ftlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ftlabs/subscriptions","organizations_url":"https://api.github.com/users/ftlabs/orgs","repos_url":"https://api.github.com/users/ftlabs/repos","events_url":"https://api.github.com/users/ftlabs/events{/privacy}","received_events_url":"https://api.github.com/users/ftlabs/received_events","type":"Organization","site_admin":false},"repo":{"id":86708939,"name":"ftlabs.github.io","full_name":"ftlabs/ftlabs.github.io","owner":{"login":"ftlabs","id":1432696,"avatar_url":"https://avatars3.githubusercontent.com/u/1432696?v=4","gravatar_id":"","url":"https://api.github.com/users/ftlabs","html_url":"https://github.com/ftlabs","followers_url":"https://api.github.com/users/ftlabs/followers","following_url":"https://api.github.com/users/ftlabs/following{/other_user}","gists_url":"https://api.github.com/users/ftlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/ftlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ftlabs/subscriptions","organizations_url":"https://api.github.com/users/ftlabs/orgs","repos_url":"https://api.github.com/users/ftlabs/repos","events_url":"https://api.github.com/users/ftlabs/events{/privacy}","received_events_url":"https://api.github.com/users/ftlabs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ftlabs/ftlabs.github.io","description":"porting the team blog to github pages","fork":false,"url":"https://api.github.com/repos/ftlabs/ftlabs.github.io","forks_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/forks","keys_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/teams","hooks_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/hooks","issue_events_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/issues/events{/number}","events_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/events","assignees_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/assignees{/user}","branches_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/branches{/branch}","tags_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/tags","blobs_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/git/refs{/sha}","trees_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/statuses/{sha}","languages_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/languages","stargazers_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/stargazers","contributors_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/contributors","subscribers_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/subscribers","subscription_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/subscription","commits_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/commits{/sha}","git_commits_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/git/commits{/sha}","comments_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/comments{/number}","issue_comment_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/issues/comments{/number}","contents_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/contents/{+path}","compare_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/merges","archive_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/downloads","issues_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/issues{/number}","pulls_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/pulls{/number}","milestones_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/milestones{/number}","notifications_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/labels{/name}","releases_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/releases{/id}","deployments_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/deployments","created_at":"2017-03-30T13:59:58Z","updated_at":"2017-05-31T08:39:09Z","pushed_at":"2018-03-26T11:39:52Z","git_url":"git://github.com/ftlabs/ftlabs.github.io.git","ssh_url":"git@github.com:ftlabs/ftlabs.github.io.git","clone_url":"https://github.com/ftlabs/ftlabs.github.io.git","svn_url":"https://github.com/ftlabs/ftlabs.github.io","homepage":"https://ftlabs.github.io","size":92751,"stargazers_count":1,"watchers_count":1,"language":"HTML","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":3,"license":null,"forks":1,"open_issues":3,"watchers":1,"default_branch":"master"}},"base":{"label":"ftlabs:master","ref":"master","sha":"f16d0686ac863148e72b9a398ff970e3f95e948b","user":{"login":"ftlabs","id":1432696,"avatar_url":"https://avatars3.githubusercontent.com/u/1432696?v=4","gravatar_id":"","url":"https://api.github.com/users/ftlabs","html_url":"https://github.com/ftlabs","followers_url":"https://api.github.com/users/ftlabs/followers","following_url":"https://api.github.com/users/ftlabs/following{/other_user}","gists_url":"https://api.github.com/users/ftlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/ftlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ftlabs/subscriptions","organizations_url":"https://api.github.com/users/ftlabs/orgs","repos_url":"https://api.github.com/users/ftlabs/repos","events_url":"https://api.github.com/users/ftlabs/events{/privacy}","received_events_url":"https://api.github.com/users/ftlabs/received_events","type":"Organization","site_admin":false},"repo":{"id":86708939,"name":"ftlabs.github.io","full_name":"ftlabs/ftlabs.github.io","owner":{"login":"ftlabs","id":1432696,"avatar_url":"https://avatars3.githubusercontent.com/u/1432696?v=4","gravatar_id":"","url":"https://api.github.com/users/ftlabs","html_url":"https://github.com/ftlabs","followers_url":"https://api.github.com/users/ftlabs/followers","following_url":"https://api.github.com/users/ftlabs/following{/other_user}","gists_url":"https://api.github.com/users/ftlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/ftlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ftlabs/subscriptions","organizations_url":"https://api.github.com/users/ftlabs/orgs","repos_url":"https://api.github.com/users/ftlabs/repos","events_url":"https://api.github.com/users/ftlabs/events{/privacy}","received_events_url":"https://api.github.com/users/ftlabs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ftlabs/ftlabs.github.io","description":"porting the team blog to github pages","fork":false,"url":"https://api.github.com/repos/ftlabs/ftlabs.github.io","forks_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/forks","keys_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/teams","hooks_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/hooks","issue_events_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/issues/events{/number}","events_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/events","assignees_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/assignees{/user}","branches_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/branches{/branch}","tags_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/tags","blobs_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/git/refs{/sha}","trees_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/statuses/{sha}","languages_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/languages","stargazers_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/stargazers","contributors_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/contributors","subscribers_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/subscribers","subscription_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/subscription","commits_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/commits{/sha}","git_commits_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/git/commits{/sha}","comments_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/comments{/number}","issue_comment_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/issues/comments{/number}","contents_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/contents/{+path}","compare_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/merges","archive_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/downloads","issues_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/issues{/number}","pulls_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/pulls{/number}","milestones_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/milestones{/number}","notifications_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/labels{/name}","releases_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/releases{/id}","deployments_url":"https://api.github.com/repos/ftlabs/ftlabs.github.io/deployments","created_at":"2017-03-30T13:59:58Z","updated_at":"2017-05-31T08:39:09Z","pushed_at":"2018-03-26T11:39:52Z","git_url":"git://github.com/ftlabs/ftlabs.github.io.git","ssh_url":"git@github.com:ftlabs/ftlabs.github.io.git","clone_url":"https://github.com/ftlabs/ftlabs.github.io.git","svn_url":"https://github.com/ftlabs/ftlabs.github.io","homepage":"https://ftlabs.github.io","size":92751,"stargazers_count":1,"watchers_count":1,"language":"HTML","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":3,"license":null,"forks":1,"open_issues":3,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ftlabs/ftlabs.github.io/pulls/55"},"html":{"href":"https://github.com/ftlabs/ftlabs.github.io/pull/55"},"issue":{"href":"https://api.github.com/repos/ftlabs/ftlabs.github.io/issues/55"},"comments":{"href":"https://api.github.com/repos/ftlabs/ftlabs.github.io/issues/55/comments"},"review_comments":{"href":"https://api.github.com/repos/ftlabs/ftlabs.github.io/pulls/55/comments"},"review_comment":{"href":"https://api.github.com/repos/ftlabs/ftlabs.github.io/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ftlabs/ftlabs.github.io/pulls/55/commits"},"statuses":{"href":"https://api.github.com/repos/ftlabs/ftlabs.github.io/statuses/ffd15b0253695e14ae4171a5bbb60a31212fc8c3"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"Lily2point0"}}