{"action":"created","comment":{"url":"https://api.github.com/repos/Automattic/wp-calypso/pulls/comments/179813443","pull_request_review_id":110131681,"id":179813443,"diff_hunk":"@@ -214,11 +203,111 @@ export function getYearlyPlanByMonthly( planSlug ) {\n  * @return {Boolean}           Whether the plan \"types\" match regardless of interval\n  */\n export function planLevelsMatch( planSlugA, planSlugB ) {\n-\treturn (\n-\t\tplanSlugA === planSlugB ||\n-\t\tgetMonthlyPlanByYearly( planSlugA ) === planSlugB ||\n-\t\tplanSlugA === getMonthlyPlanByYearly( planSlugB )\n-\t);\n+\tconst planA = getPlan( planSlugA );\n+\tconst planB = getPlan( planSlugB );\n+\treturn planA && planB && planA.type === planB.type && planA.group === planB.group;\n+}\n+\n+export function isBusinessPlan( planSlug ) {\n+\treturn getPlan( planSlug ).type === TYPE_BUSINESS;\n+}\n+\n+export function isPremiumPlan( planSlug ) {\n+\treturn getPlan( planSlug ).type === TYPE_PREMIUM;\n+}\n+\n+export function isPersonalPlan( planSlug ) {\n+\treturn getPlan( planSlug ).type === TYPE_PERSONAL;\n+}\n+\n+export function isFreePlan( planSlug ) {\n+\treturn getPlan( planSlug ).type === TYPE_FREE;\n+}\n+\n+/**\n+ * @see findSimilarPlansKeys\n+ *\n+ * @param {string|object} planKey Source plan to compare to\n+ * @param {object} diff Properties that should differ in matched plan. @see planMatches\n+ * @return {string|undefined} Matched plan\n+ */\n+export function findFirstSimilarPlanKey( planKey, diff ) {\n+\treturn findSimilarPlansKeys( planKey, diff )[ 0 ];\n+}\n+\n+/**\n+ * A similar plan is one that has the same `type`, `group`, and `term` as first\n+ * argument, except for differences specified in the second argument.\n+ *\n+ * For example:\n+ *\n+ * > findSimilarPlansKeys( TYPE_BUSINESS, { term: TERM_BIENNIALLY } );\n+ * [PLAN_BUSINESS_2_YEARS]\n+ * > findSimilarPlansKeys( TYPE_JETPACK_BUSINESS_MONTHLY, { type: TYPE_ANNUALLY } );\n+ * [TYPE_JETPACK_BUSINESS]\n+ *\n+ * @param {string|object} planKey Source plan to compare to\n+ * @param {object} diff Properties that should differ in matched plan. @see planMatches\n+ * @return {string[]} Matched plans keys\n+ */\n+export function findSimilarPlansKeys( planKey, diff = {} ) {\n+\tconst plan = getPlan( planKey );\n+\t// @TODO: make getPlan() throw an error on failure. This is going to be a larger change with a separate PR.\n+\tif ( ! plan ) {\n+\t\treturn [];\n+\t}\n+\treturn findPlansKeys( {\n+\t\t...pick( plan, 'type', 'group', 'term' ),\n+\t\t...diff,\n+\t} );\n+}\n+\n+/**\n+ * Finds all keys of plans matching a query\n+ *\n+ * For example:\n+ *\n+ * > findPlansKeys( { term: TERM_BIENNIALLY } );\n+ * [PLAN_PERSONAL_2_YEARS, PLAN_PREMIUM_2_YEARS, PLAN_BUSINESS_2_YEARS]\n+ *\n+ * @param {object} query @see planMatches\n+ * @return {string[]} Matched plans keys\n+ */\n+export function findPlansKeys( query = {} ) {\n+\tconst plans = getPlans();\n+\treturn Object.keys( plans ).filter( k => planMatches( plans[ k ], query ) );\n+}\n+\n+/**\n+ * Matches plan specified by `planKey` against `query`.\n+ * Only compares `type`, `group`, and `term` properties.\n+ *\n+ * For example:\n+ *\n+ * > planMatches( TYPE_BUSINESS, { term: TERM_ANNUALLY, group: GROUP_WPCOM, type: TYPE_BUSINESS } );\n+ * true\n+ *\n+ * > planMatches( TYPE_BUSINESS, { term: TERM_BIENNIALLY } );\n+ * false\n+ *\n+ * @param {string|object} planKey Plan to match\n+ * @param {object} query Properties that should match\n+ * @return {bool} Does `planKey` match?\n+ */\n+export function planMatches( planKey, query = {} ) {\n+\tconst acceptedKeys = [ 'type', 'group', 'term' ];\n+\tconst unknownKeys = difference( Object.keys( query ), acceptedKeys );\n+\tif ( unknownKeys.length ) {\n+\t\tthrow new Error(\n+\t\t\t`planMatches can only match against ${ acceptedKeys.join( ',' ) }, ` +\n+\t\t\t\t`but unknown keys ${ unknownKeys.join( ',' ) } were passed.`\n+\t\t);","path":"client/lib/plans/index.js","position":197,"original_position":197,"commit_id":"543020049bc103cda0e6dcc29b6d5d863011af56","original_commit_id":"543020049bc103cda0e6dcc29b6d5d863011af56","user":{"login":"gwwar","id":1270189,"avatar_url":"https://avatars3.githubusercontent.com/u/1270189?v=4","gravatar_id":"","url":"https://api.github.com/users/gwwar","html_url":"https://github.com/gwwar","followers_url":"https://api.github.com/users/gwwar/followers","following_url":"https://api.github.com/users/gwwar/following{/other_user}","gists_url":"https://api.github.com/users/gwwar/gists{/gist_id}","starred_url":"https://api.github.com/users/gwwar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gwwar/subscriptions","organizations_url":"https://api.github.com/users/gwwar/orgs","repos_url":"https://api.github.com/users/gwwar/repos","events_url":"https://api.github.com/users/gwwar/events{/privacy}","received_events_url":"https://api.github.com/users/gwwar/received_events","type":"User","site_admin":false},"body":"Be careful of throwing errors when the caller has no intention of catching them. If we'd like to make local dev easier, there are alternative methods:\r\n- Perhaps a simple debug statement\r\n- console.error in dev environments only\r\n- static analysis with a custom eslint rule, which runs in githooks before commit","created_at":"2018-04-06T16:43:09Z","updated_at":"2018-04-06T16:43:09Z","html_url":"https://github.com/Automattic/wp-calypso/pull/23314#discussion_r179813443","pull_request_url":"https://api.github.com/repos/Automattic/wp-calypso/pulls/23314","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/Automattic/wp-calypso/pulls/comments/179813443"},"html":{"href":"https://github.com/Automattic/wp-calypso/pull/23314#discussion_r179813443"},"pull_request":{"href":"https://api.github.com/repos/Automattic/wp-calypso/pulls/23314"}}},"pull_request":{"url":"https://api.github.com/repos/Automattic/wp-calypso/pulls/23314","id":175081052,"html_url":"https://github.com/Automattic/wp-calypso/pull/23314","diff_url":"https://github.com/Automattic/wp-calypso/pull/23314.diff","patch_url":"https://github.com/Automattic/wp-calypso/pull/23314.patch","issue_url":"https://api.github.com/repos/Automattic/wp-calypso/issues/23314","number":23314,"state":"closed","locked":false,"title":"Add/plans meta data","user":{"login":"adamziel","id":205419,"avatar_url":"https://avatars1.githubusercontent.com/u/205419?v=4","gravatar_id":"","url":"https://api.github.com/users/adamziel","html_url":"https://github.com/adamziel","followers_url":"https://api.github.com/users/adamziel/followers","following_url":"https://api.github.com/users/adamziel/following{/other_user}","gists_url":"https://api.github.com/users/adamziel/gists{/gist_id}","starred_url":"https://api.github.com/users/adamziel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adamziel/subscriptions","organizations_url":"https://api.github.com/users/adamziel/orgs","repos_url":"https://api.github.com/users/adamziel/repos","events_url":"https://api.github.com/users/adamziel/events{/privacy}","received_events_url":"https://api.github.com/users/adamziel/received_events","type":"User","site_admin":false},"body":"Related to 2-year plans in general (p9jf6J-eR-p2).\r\n\r\nThis is a new version of https://github.com/Automattic/wp-calypso/pull/23258 which had to be reverted. \r\n\r\nWe are adding a set of plans to make 2-year subscriptions possible. Current codebase assumes that there is just one variant of each plan type (except for jetpack annual/monthly subscriptions). I can see at least the following problems off the top of my head:\r\n\r\n1. Comparisons like `planSlug === PLAN_BUSINESS` would have to check also for `PLAN_BUSINESS_2_YEAR`\r\n2. Code fragments like `<Banner plan={PLAN_BUSINESS} />` may need to receive `PLAN_BUSINESS_2_YEAR` if user is subscribed to a 2-year plan\r\n\r\nThis PR proposes a solution to above and similar issues. I went through all places where plan constants were used directly and sketched this code and it seems to cover all use cases I saw, namely:\r\n* Get all business plans for both Jetpack and wp.com\r\n* Get all premium plans of Jetpack\r\n* Get personal plans of wp.com\r\n* Get business plan for the same site (Jetpack/wp.com) as current user but for 2-year term\r\n* Get premium plan for the same site (Jetpack/wp.com) as current user for the same term as current user\r\n* Get the same type of plan as current user have, but with a 2-year term\r\n* ...and more similar\r\n\r\nInstead of using/comparing plans constants directly, we introduce some metadata to `PLANS_LIST` and also a few helper functions to encapsulate that logic.\r\n\r\nWe can get rid of some checks like `planSlug === PLAN_BUSINESS`  in favour of checking features, like here: https://github.com/Automattic/wp-calypso/pull/23076 - however this is not possible in all (most) cases.\r\n\r\nWith this PR, you can check like \r\n```js\r\nplanMatches(planSlug,  {type: TYPE_BUSINESS}); // or shortcut: isBusinessPlan( planSlug );\r\n```\r\n\r\nIf you need to check just for jetpack or wp.com specific plans, you can do\r\n```js\r\nplanMatches(planSlug, {type: TYPE_BUSINESS, group: GROUP_WPCOM})\r\n```\r\n\r\nOr, let's say you need a business plan with the same subscription term as active user and related to the same site (jetpack/wp) as current user's plan:\r\n```js\r\nfindSimilarPlan(currentPlanSlug, {type: TYPE_BUSINESS})\r\n```\r\n\r\nNot only this would allow us to remove some boilerplate code from many components, but would also introduce a consistent way to work with plans - currently they are dealt with in a dozens of different ways.\r\n\r\nFinally, with this PR we are able to get rid of other constants such as:\r\n```js\r\nexport const JETPACK_PLANS = [\r\nexport const JETPACK_MONTHLY_PLANS = [\r\n```\r\nAnd have PLANS_LIST as a single source of truth allowing us to cross-reference anything in any way without other constants containing additional groupings.\r\n\r\n**Test plan:**\r\n\r\n1. Check if purchase/upgrade page with plans displays correct prices and looks properly.\r\n1. Check if purchase/upgrade page with plans displays correct details about current plan and upgrade options for monthly users\r\n","created_at":"2018-03-14T20:50:31Z","updated_at":"2018-04-06T16:43:09Z","closed_at":"2018-03-15T13:40:57Z","merged_at":"2018-03-15T13:40:56Z","merge_commit_sha":"8e96b365936c433e3025efabc40f166995b532f5","assignee":null,"assignees":[],"requested_reviewers":[{"login":"dzver","id":82778,"avatar_url":"https://avatars0.githubusercontent.com/u/82778?v=4","gravatar_id":"","url":"https://api.github.com/users/dzver","html_url":"https://github.com/dzver","followers_url":"https://api.github.com/users/dzver/followers","following_url":"https://api.github.com/users/dzver/following{/other_user}","gists_url":"https://api.github.com/users/dzver/gists{/gist_id}","starred_url":"https://api.github.com/users/dzver/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dzver/subscriptions","organizations_url":"https://api.github.com/users/dzver/orgs","repos_url":"https://api.github.com/users/dzver/repos","events_url":"https://api.github.com/users/dzver/events{/privacy}","received_events_url":"https://api.github.com/users/dzver/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":285009994,"url":"https://api.github.com/repos/Automattic/wp-calypso/labels/Plans","name":"Plans","color":"006b75","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/Automattic/wp-calypso/pulls/23314/commits","review_comments_url":"https://api.github.com/repos/Automattic/wp-calypso/pulls/23314/comments","review_comment_url":"https://api.github.com/repos/Automattic/wp-calypso/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Automattic/wp-calypso/issues/23314/comments","statuses_url":"https://api.github.com/repos/Automattic/wp-calypso/statuses/543020049bc103cda0e6dcc29b6d5d863011af56","head":{"label":"Automattic:add/plans-meta-data","ref":"add/plans-meta-data","sha":"543020049bc103cda0e6dcc29b6d5d863011af56","user":{"login":"Automattic","id":887802,"avatar_url":"https://avatars1.githubusercontent.com/u/887802?v=4","gravatar_id":"","url":"https://api.github.com/users/Automattic","html_url":"https://github.com/Automattic","followers_url":"https://api.github.com/users/Automattic/followers","following_url":"https://api.github.com/users/Automattic/following{/other_user}","gists_url":"https://api.github.com/users/Automattic/gists{/gist_id}","starred_url":"https://api.github.com/users/Automattic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Automattic/subscriptions","organizations_url":"https://api.github.com/users/Automattic/orgs","repos_url":"https://api.github.com/users/Automattic/repos","events_url":"https://api.github.com/users/Automattic/events{/privacy}","received_events_url":"https://api.github.com/users/Automattic/received_events","type":"Organization","site_admin":false},"repo":{"id":45936895,"name":"wp-calypso","full_name":"Automattic/wp-calypso","owner":{"login":"Automattic","id":887802,"avatar_url":"https://avatars1.githubusercontent.com/u/887802?v=4","gravatar_id":"","url":"https://api.github.com/users/Automattic","html_url":"https://github.com/Automattic","followers_url":"https://api.github.com/users/Automattic/followers","following_url":"https://api.github.com/users/Automattic/following{/other_user}","gists_url":"https://api.github.com/users/Automattic/gists{/gist_id}","starred_url":"https://api.github.com/users/Automattic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Automattic/subscriptions","organizations_url":"https://api.github.com/users/Automattic/orgs","repos_url":"https://api.github.com/users/Automattic/repos","events_url":"https://api.github.com/users/Automattic/events{/privacy}","received_events_url":"https://api.github.com/users/Automattic/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Automattic/wp-calypso","description":"The JavaScript and API powered WordPress.com","fork":false,"url":"https://api.github.com/repos/Automattic/wp-calypso","forks_url":"https://api.github.com/repos/Automattic/wp-calypso/forks","keys_url":"https://api.github.com/repos/Automattic/wp-calypso/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Automattic/wp-calypso/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Automattic/wp-calypso/teams","hooks_url":"https://api.github.com/repos/Automattic/wp-calypso/hooks","issue_events_url":"https://api.github.com/repos/Automattic/wp-calypso/issues/events{/number}","events_url":"https://api.github.com/repos/Automattic/wp-calypso/events","assignees_url":"https://api.github.com/repos/Automattic/wp-calypso/assignees{/user}","branches_url":"https://api.github.com/repos/Automattic/wp-calypso/branches{/branch}","tags_url":"https://api.github.com/repos/Automattic/wp-calypso/tags","blobs_url":"https://api.github.com/repos/Automattic/wp-calypso/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Automattic/wp-calypso/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Automattic/wp-calypso/git/refs{/sha}","trees_url":"https://api.github.com/repos/Automattic/wp-calypso/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Automattic/wp-calypso/statuses/{sha}","languages_url":"https://api.github.com/repos/Automattic/wp-calypso/languages","stargazers_url":"https://api.github.com/repos/Automattic/wp-calypso/stargazers","contributors_url":"https://api.github.com/repos/Automattic/wp-calypso/contributors","subscribers_url":"https://api.github.com/repos/Automattic/wp-calypso/subscribers","subscription_url":"https://api.github.com/repos/Automattic/wp-calypso/subscription","commits_url":"https://api.github.com/repos/Automattic/wp-calypso/commits{/sha}","git_commits_url":"https://api.github.com/repos/Automattic/wp-calypso/git/commits{/sha}","comments_url":"https://api.github.com/repos/Automattic/wp-calypso/comments{/number}","issue_comment_url":"https://api.github.com/repos/Automattic/wp-calypso/issues/comments{/number}","contents_url":"https://api.github.com/repos/Automattic/wp-calypso/contents/{+path}","compare_url":"https://api.github.com/repos/Automattic/wp-calypso/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Automattic/wp-calypso/merges","archive_url":"https://api.github.com/repos/Automattic/wp-calypso/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Automattic/wp-calypso/downloads","issues_url":"https://api.github.com/repos/Automattic/wp-calypso/issues{/number}","pulls_url":"https://api.github.com/repos/Automattic/wp-calypso/pulls{/number}","milestones_url":"https://api.github.com/repos/Automattic/wp-calypso/milestones{/number}","notifications_url":"https://api.github.com/repos/Automattic/wp-calypso/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Automattic/wp-calypso/labels{/name}","releases_url":"https://api.github.com/repos/Automattic/wp-calypso/releases{/id}","deployments_url":"https://api.github.com/repos/Automattic/wp-calypso/deployments","created_at":"2015-11-10T20:00:16Z","updated_at":"2018-04-06T12:32:03Z","pushed_at":"2018-04-06T16:43:00Z","git_url":"git://github.com/Automattic/wp-calypso.git","ssh_url":"git@github.com:Automattic/wp-calypso.git","clone_url":"https://github.com/Automattic/wp-calypso.git","svn_url":"https://github.com/Automattic/wp-calypso","homepage":"https://developer.wordpress.com/calypso/","size":85384,"stargazers_count":9859,"watchers_count":9859,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1384,"mirror_url":null,"archived":false,"open_issues_count":1509,"license":{"key":"gpl-2.0","name":"GNU General Public License v2.0","spdx_id":"GPL-2.0","url":"https://api.github.com/licenses/gpl-2.0"},"forks":1384,"open_issues":1509,"watchers":9859,"default_branch":"master"}},"base":{"label":"Automattic:master","ref":"master","sha":"2450c43a04bd1479af4b8c7e7a357c6856abf9be","user":{"login":"Automattic","id":887802,"avatar_url":"https://avatars1.githubusercontent.com/u/887802?v=4","gravatar_id":"","url":"https://api.github.com/users/Automattic","html_url":"https://github.com/Automattic","followers_url":"https://api.github.com/users/Automattic/followers","following_url":"https://api.github.com/users/Automattic/following{/other_user}","gists_url":"https://api.github.com/users/Automattic/gists{/gist_id}","starred_url":"https://api.github.com/users/Automattic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Automattic/subscriptions","organizations_url":"https://api.github.com/users/Automattic/orgs","repos_url":"https://api.github.com/users/Automattic/repos","events_url":"https://api.github.com/users/Automattic/events{/privacy}","received_events_url":"https://api.github.com/users/Automattic/received_events","type":"Organization","site_admin":false},"repo":{"id":45936895,"name":"wp-calypso","full_name":"Automattic/wp-calypso","owner":{"login":"Automattic","id":887802,"avatar_url":"https://avatars1.githubusercontent.com/u/887802?v=4","gravatar_id":"","url":"https://api.github.com/users/Automattic","html_url":"https://github.com/Automattic","followers_url":"https://api.github.com/users/Automattic/followers","following_url":"https://api.github.com/users/Automattic/following{/other_user}","gists_url":"https://api.github.com/users/Automattic/gists{/gist_id}","starred_url":"https://api.github.com/users/Automattic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Automattic/subscriptions","organizations_url":"https://api.github.com/users/Automattic/orgs","repos_url":"https://api.github.com/users/Automattic/repos","events_url":"https://api.github.com/users/Automattic/events{/privacy}","received_events_url":"https://api.github.com/users/Automattic/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Automattic/wp-calypso","description":"The JavaScript and API powered WordPress.com","fork":false,"url":"https://api.github.com/repos/Automattic/wp-calypso","forks_url":"https://api.github.com/repos/Automattic/wp-calypso/forks","keys_url":"https://api.github.com/repos/Automattic/wp-calypso/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Automattic/wp-calypso/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Automattic/wp-calypso/teams","hooks_url":"https://api.github.com/repos/Automattic/wp-calypso/hooks","issue_events_url":"https://api.github.com/repos/Automattic/wp-calypso/issues/events{/number}","events_url":"https://api.github.com/repos/Automattic/wp-calypso/events","assignees_url":"https://api.github.com/repos/Automattic/wp-calypso/assignees{/user}","branches_url":"https://api.github.com/repos/Automattic/wp-calypso/branches{/branch}","tags_url":"https://api.github.com/repos/Automattic/wp-calypso/tags","blobs_url":"https://api.github.com/repos/Automattic/wp-calypso/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Automattic/wp-calypso/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Automattic/wp-calypso/git/refs{/sha}","trees_url":"https://api.github.com/repos/Automattic/wp-calypso/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Automattic/wp-calypso/statuses/{sha}","languages_url":"https://api.github.com/repos/Automattic/wp-calypso/languages","stargazers_url":"https://api.github.com/repos/Automattic/wp-calypso/stargazers","contributors_url":"https://api.github.com/repos/Automattic/wp-calypso/contributors","subscribers_url":"https://api.github.com/repos/Automattic/wp-calypso/subscribers","subscription_url":"https://api.github.com/repos/Automattic/wp-calypso/subscription","commits_url":"https://api.github.com/repos/Automattic/wp-calypso/commits{/sha}","git_commits_url":"https://api.github.com/repos/Automattic/wp-calypso/git/commits{/sha}","comments_url":"https://api.github.com/repos/Automattic/wp-calypso/comments{/number}","issue_comment_url":"https://api.github.com/repos/Automattic/wp-calypso/issues/comments{/number}","contents_url":"https://api.github.com/repos/Automattic/wp-calypso/contents/{+path}","compare_url":"https://api.github.com/repos/Automattic/wp-calypso/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Automattic/wp-calypso/merges","archive_url":"https://api.github.com/repos/Automattic/wp-calypso/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Automattic/wp-calypso/downloads","issues_url":"https://api.github.com/repos/Automattic/wp-calypso/issues{/number}","pulls_url":"https://api.github.com/repos/Automattic/wp-calypso/pulls{/number}","milestones_url":"https://api.github.com/repos/Automattic/wp-calypso/milestones{/number}","notifications_url":"https://api.github.com/repos/Automattic/wp-calypso/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Automattic/wp-calypso/labels{/name}","releases_url":"https://api.github.com/repos/Automattic/wp-calypso/releases{/id}","deployments_url":"https://api.github.com/repos/Automattic/wp-calypso/deployments","created_at":"2015-11-10T20:00:16Z","updated_at":"2018-04-06T12:32:03Z","pushed_at":"2018-04-06T16:43:00Z","git_url":"git://github.com/Automattic/wp-calypso.git","ssh_url":"git@github.com:Automattic/wp-calypso.git","clone_url":"https://github.com/Automattic/wp-calypso.git","svn_url":"https://github.com/Automattic/wp-calypso","homepage":"https://developer.wordpress.com/calypso/","size":85384,"stargazers_count":9859,"watchers_count":9859,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1384,"mirror_url":null,"archived":false,"open_issues_count":1509,"license":{"key":"gpl-2.0","name":"GNU General Public License v2.0","spdx_id":"GPL-2.0","url":"https://api.github.com/licenses/gpl-2.0"},"forks":1384,"open_issues":1509,"watchers":9859,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Automattic/wp-calypso/pulls/23314"},"html":{"href":"https://github.com/Automattic/wp-calypso/pull/23314"},"issue":{"href":"https://api.github.com/repos/Automattic/wp-calypso/issues/23314"},"comments":{"href":"https://api.github.com/repos/Automattic/wp-calypso/issues/23314/comments"},"review_comments":{"href":"https://api.github.com/repos/Automattic/wp-calypso/pulls/23314/comments"},"review_comment":{"href":"https://api.github.com/repos/Automattic/wp-calypso/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Automattic/wp-calypso/pulls/23314/commits"},"statuses":{"href":"https://api.github.com/repos/Automattic/wp-calypso/statuses/543020049bc103cda0e6dcc29b6d5d863011af56"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"gwwar"}}