{"action":"created","comment":{"url":"https://api.github.com/repos/tuenti/pouch/pulls/comments/166709923","pull_request_review_id":94817161,"id":166709923,"diff_hunk":"@@ -214,50 +220,59 @@ type SecretState struct {\n \t// Lease duration, in seconds, if any when the secret was read\n \tLeaseDuration int `json:\"lease_duration,omitempty\"`\n \n-\t// TTL, in seconds, if any when the secret was read\n-\tTTL int `json:\"ttl,omitempty\"`\n-\n \t// Secret will be renewed after this portion of its life has passed\n \tDurationRatio float64 `json:\"duration_ratio,omitempty\"`\n \n \t// If the secret has no expiration data, don't try to update it\n \tDisableAutoUpdate bool `json:\"disable_auto_uptdate,omitempty\"`\n \n \t// Actual secret\n-\tData map[string]interface{} `json:\"data,omitempty\"`\n+\tData SecretData `json:\"data,omitempty\"`\n \n \t// Files using this secret\n \tFilesUsing JSONSortedStringList `json:\"files_using,omitempty\"`\n }\n \n-func (s *SecretState) TimeToUpdate() time.Duration {\n+func (s *SecretState) Ratio() float64 {\n \tratio := s.DurationRatio\n \tif ratio == 0 {\n \t\tratio = DefaultSecretDurationRatio\n \t}\n+\treturn ratio\n+}\n \n-\t// Next update for the secret will be based on these rules:\n-\t// - If we have both a TTL and a lease duration, we use the minimal of them\n-\t// - If we have only a TTL or a lease duration, we take it\n-\t// - If we don't have anything, we won't try to update this secret\n-\tvar duration int\n-\tswitch {\n-\tcase s.TTL > 0 && s.LeaseDuration > 0:\n-\t\tif s.TTL < s.LeaseDuration {\n-\t\t\tduration = s.TTL\n-\t\t} else {\n-\t\t\tduration = s.LeaseDuration\n+func (s *SecretState) TTL() (int, bool) {\n+\tif s.Data == nil {\n+\t\treturn 0, false\n+\t}\n+\tswitch ttlNumber := s.Data[\"ttl\"].(type) {\n+\tcase json.Number:\n+\t\tttl, err := ttlNumber.Int64()\n+\t\tif err != nil {\n+\t\t\treturn 0, false\n \t\t}\n-\tcase s.TTL > 0:\n-\t\tduration = s.TTL\n-\tcase s.LeaseDuration > 0:\n-\t\tduration = s.LeaseDuration\n-\tdefault:\n-\t\t// Unknown TTU\n-\t\treturn 0\n+\t\treturn int(ttl), true\n+\tcase int:\n+\t\treturn ttlNumber, true\n+\tcase int64:\n+\t\treturn int(ttlNumber), true\n \t}\n+\treturn 0, false\n+}\n \n-\treturn (time.Duration(float64(duration)*ratio) * time.Second) - time.Now().Sub(s.Timestamp)\n+func (s *SecretState) TimeToUpdate() (minTTU time.Time, known bool) {\n+\tfor _, source := range secretTTUSources {\n+\t\tttu, err := source(s)\n+\t\tif err != nil {\n+\t\t\tlog.Printf(\"Error trying to obtain TTU for secret '%s': %s\", s.Name, err)\n+\t\t\tcontinue\n+\t\t}\n+\t\tif ttu != nil && (!known || ttu.Before(minTTU)) {\n+\t\t\tminTTU = *ttu\n+\t\t\tknown = true\n+\t\t}\n+\t}\n+\treturn","path":"state.go","position":221,"original_position":221,"commit_id":"66746d5e02f085bcae10cbcef4a8dc8c2a796a1e","original_commit_id":"aad54f5449db19345a072d4e6c3171fb0a501f09","user":{"login":"mrodm","id":5330827,"avatar_url":"https://avatars3.githubusercontent.com/u/5330827?v=4","gravatar_id":"","url":"https://api.github.com/users/mrodm","html_url":"https://github.com/mrodm","followers_url":"https://api.github.com/users/mrodm/followers","following_url":"https://api.github.com/users/mrodm/following{/other_user}","gists_url":"https://api.github.com/users/mrodm/gists{/gist_id}","starred_url":"https://api.github.com/users/mrodm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrodm/subscriptions","organizations_url":"https://api.github.com/users/mrodm/orgs","repos_url":"https://api.github.com/users/mrodm/repos","events_url":"https://api.github.com/users/mrodm/events{/privacy}","received_events_url":"https://api.github.com/users/mrodm/received_events","type":"User","site_admin":false},"body":"I see... I didn't know about this feature.\r\nThanks! :)","created_at":"2018-02-07T18:25:22Z","updated_at":"2018-02-07T18:25:22Z","html_url":"https://github.com/tuenti/pouch/pull/13#discussion_r166709923","pull_request_url":"https://api.github.com/repos/tuenti/pouch/pulls/13","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/tuenti/pouch/pulls/comments/166709923"},"html":{"href":"https://github.com/tuenti/pouch/pull/13#discussion_r166709923"},"pull_request":{"href":"https://api.github.com/repos/tuenti/pouch/pulls/13"}},"in_reply_to_id":166627046},"pull_request":{"url":"https://api.github.com/repos/tuenti/pouch/pulls/13","id":166480823,"html_url":"https://github.com/tuenti/pouch/pull/13","diff_url":"https://github.com/tuenti/pouch/pull/13.diff","patch_url":"https://github.com/tuenti/pouch/pull/13.patch","issue_url":"https://api.github.com/repos/tuenti/pouch/issues/13","number":13,"state":"open","locked":false,"title":"Improve consistency and testability of time to update estimation","user":{"login":"jsoriano","id":15763,"avatar_url":"https://avatars2.githubusercontent.com/u/15763?v=4","gravatar_id":"","url":"https://api.github.com/users/jsoriano","html_url":"https://github.com/jsoriano","followers_url":"https://api.github.com/users/jsoriano/followers","following_url":"https://api.github.com/users/jsoriano/following{/other_user}","gists_url":"https://api.github.com/users/jsoriano/gists{/gist_id}","starred_url":"https://api.github.com/users/jsoriano/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jsoriano/subscriptions","organizations_url":"https://api.github.com/users/jsoriano/orgs","repos_url":"https://api.github.com/users/jsoriano/repos","events_url":"https://api.github.com/users/jsoriano/events{/privacy}","received_events_url":"https://api.github.com/users/jsoriano/received_events","type":"User","site_admin":false},"body":"Some changes to do a more consistent estimation of next time to update (TTU), and specially to be able to test it. Changes are specially focused on stop relying on `time.Now()`.\r\n\r\n_TTU could be defined before these changes as the time since \"now\" to the time of renovation, what is obviously different depending on the moment of the calculation. After these changes the TTU is the specific point in time of renovation, that doesn't depend on any other thing_ \r\n\r\n- [x] Add some tests with some basic cases\r\n- [x] Operate as much as possible with the specific time instead of with the duration since it was calculated as it can be inconsistent, specially on tests\r\n- [x] Explicitely report if a TTU for a secret could be calculated instead of just returning \"0\"\r\n- [x] Base TTU of certificates also on its creation time\r\n- [x] Add some more test cases for certificates in general","created_at":"2018-02-01T09:15:43Z","updated_at":"2018-02-07T18:25:22Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6a78296f7bb7e9c5a6e763998468101e1712d8c3","assignee":{"login":"jsoriano","id":15763,"avatar_url":"https://avatars2.githubusercontent.com/u/15763?v=4","gravatar_id":"","url":"https://api.github.com/users/jsoriano","html_url":"https://github.com/jsoriano","followers_url":"https://api.github.com/users/jsoriano/followers","following_url":"https://api.github.com/users/jsoriano/following{/other_user}","gists_url":"https://api.github.com/users/jsoriano/gists{/gist_id}","starred_url":"https://api.github.com/users/jsoriano/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jsoriano/subscriptions","organizations_url":"https://api.github.com/users/jsoriano/orgs","repos_url":"https://api.github.com/users/jsoriano/repos","events_url":"https://api.github.com/users/jsoriano/events{/privacy}","received_events_url":"https://api.github.com/users/jsoriano/received_events","type":"User","site_admin":false},"assignees":[{"login":"jsoriano","id":15763,"avatar_url":"https://avatars2.githubusercontent.com/u/15763?v=4","gravatar_id":"","url":"https://api.github.com/users/jsoriano","html_url":"https://github.com/jsoriano","followers_url":"https://api.github.com/users/jsoriano/followers","following_url":"https://api.github.com/users/jsoriano/following{/other_user}","gists_url":"https://api.github.com/users/jsoriano/gists{/gist_id}","starred_url":"https://api.github.com/users/jsoriano/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jsoriano/subscriptions","organizations_url":"https://api.github.com/users/jsoriano/orgs","repos_url":"https://api.github.com/users/jsoriano/repos","events_url":"https://api.github.com/users/jsoriano/events{/privacy}","received_events_url":"https://api.github.com/users/jsoriano/received_events","type":"User","site_admin":false},{"login":"mrodm","id":5330827,"avatar_url":"https://avatars3.githubusercontent.com/u/5330827?v=4","gravatar_id":"","url":"https://api.github.com/users/mrodm","html_url":"https://github.com/mrodm","followers_url":"https://api.github.com/users/mrodm/followers","following_url":"https://api.github.com/users/mrodm/following{/other_user}","gists_url":"https://api.github.com/users/mrodm/gists{/gist_id}","starred_url":"https://api.github.com/users/mrodm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrodm/subscriptions","organizations_url":"https://api.github.com/users/mrodm/orgs","repos_url":"https://api.github.com/users/mrodm/repos","events_url":"https://api.github.com/users/mrodm/events{/privacy}","received_events_url":"https://api.github.com/users/mrodm/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"fcgravalos","id":10601562,"avatar_url":"https://avatars0.githubusercontent.com/u/10601562?v=4","gravatar_id":"","url":"https://api.github.com/users/fcgravalos","html_url":"https://github.com/fcgravalos","followers_url":"https://api.github.com/users/fcgravalos/followers","following_url":"https://api.github.com/users/fcgravalos/following{/other_user}","gists_url":"https://api.github.com/users/fcgravalos/gists{/gist_id}","starred_url":"https://api.github.com/users/fcgravalos/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fcgravalos/subscriptions","organizations_url":"https://api.github.com/users/fcgravalos/orgs","repos_url":"https://api.github.com/users/fcgravalos/repos","events_url":"https://api.github.com/users/fcgravalos/events{/privacy}","received_events_url":"https://api.github.com/users/fcgravalos/received_events","type":"User","site_admin":false}],"requested_teams":[],"milestone":{"url":"https://api.github.com/repos/tuenti/pouch/milestones/3","html_url":"https://github.com/tuenti/pouch/milestone/3","labels_url":"https://api.github.com/repos/tuenti/pouch/milestones/3/labels","id":2947976,"number":3,"title":"next","description":null,"creator":{"login":"jsoriano","id":15763,"avatar_url":"https://avatars2.githubusercontent.com/u/15763?v=4","gravatar_id":"","url":"https://api.github.com/users/jsoriano","html_url":"https://github.com/jsoriano","followers_url":"https://api.github.com/users/jsoriano/followers","following_url":"https://api.github.com/users/jsoriano/following{/other_user}","gists_url":"https://api.github.com/users/jsoriano/gists{/gist_id}","starred_url":"https://api.github.com/users/jsoriano/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jsoriano/subscriptions","organizations_url":"https://api.github.com/users/jsoriano/orgs","repos_url":"https://api.github.com/users/jsoriano/repos","events_url":"https://api.github.com/users/jsoriano/events{/privacy}","received_events_url":"https://api.github.com/users/jsoriano/received_events","type":"User","site_admin":false},"open_issues":6,"closed_issues":1,"state":"open","created_at":"2017-11-29T23:48:56Z","updated_at":"2018-02-07T17:05:09Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/tuenti/pouch/pulls/13/commits","review_comments_url":"https://api.github.com/repos/tuenti/pouch/pulls/13/comments","review_comment_url":"https://api.github.com/repos/tuenti/pouch/pulls/comments{/number}","comments_url":"https://api.github.com/repos/tuenti/pouch/issues/13/comments","statuses_url":"https://api.github.com/repos/tuenti/pouch/statuses/66746d5e02f085bcae10cbcef4a8dc8c2a796a1e","head":{"label":"jsoriano:state-testability","ref":"state-testability","sha":"66746d5e02f085bcae10cbcef4a8dc8c2a796a1e","user":{"login":"jsoriano","id":15763,"avatar_url":"https://avatars2.githubusercontent.com/u/15763?v=4","gravatar_id":"","url":"https://api.github.com/users/jsoriano","html_url":"https://github.com/jsoriano","followers_url":"https://api.github.com/users/jsoriano/followers","following_url":"https://api.github.com/users/jsoriano/following{/other_user}","gists_url":"https://api.github.com/users/jsoriano/gists{/gist_id}","starred_url":"https://api.github.com/users/jsoriano/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jsoriano/subscriptions","organizations_url":"https://api.github.com/users/jsoriano/orgs","repos_url":"https://api.github.com/users/jsoriano/repos","events_url":"https://api.github.com/users/jsoriano/events{/privacy}","received_events_url":"https://api.github.com/users/jsoriano/received_events","type":"User","site_admin":false},"repo":{"id":93882566,"name":"pouch","full_name":"jsoriano/pouch","owner":{"login":"jsoriano","id":15763,"avatar_url":"https://avatars2.githubusercontent.com/u/15763?v=4","gravatar_id":"","url":"https://api.github.com/users/jsoriano","html_url":"https://github.com/jsoriano","followers_url":"https://api.github.com/users/jsoriano/followers","following_url":"https://api.github.com/users/jsoriano/following{/other_user}","gists_url":"https://api.github.com/users/jsoriano/gists{/gist_id}","starred_url":"https://api.github.com/users/jsoriano/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jsoriano/subscriptions","organizations_url":"https://api.github.com/users/jsoriano/orgs","repos_url":"https://api.github.com/users/jsoriano/repos","events_url":"https://api.github.com/users/jsoriano/events{/privacy}","received_events_url":"https://api.github.com/users/jsoriano/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jsoriano/pouch","description":"Tools to provision secrets using Vault with AppRole authentication method","fork":true,"url":"https://api.github.com/repos/jsoriano/pouch","forks_url":"https://api.github.com/repos/jsoriano/pouch/forks","keys_url":"https://api.github.com/repos/jsoriano/pouch/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jsoriano/pouch/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jsoriano/pouch/teams","hooks_url":"https://api.github.com/repos/jsoriano/pouch/hooks","issue_events_url":"https://api.github.com/repos/jsoriano/pouch/issues/events{/number}","events_url":"https://api.github.com/repos/jsoriano/pouch/events","assignees_url":"https://api.github.com/repos/jsoriano/pouch/assignees{/user}","branches_url":"https://api.github.com/repos/jsoriano/pouch/branches{/branch}","tags_url":"https://api.github.com/repos/jsoriano/pouch/tags","blobs_url":"https://api.github.com/repos/jsoriano/pouch/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jsoriano/pouch/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jsoriano/pouch/git/refs{/sha}","trees_url":"https://api.github.com/repos/jsoriano/pouch/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jsoriano/pouch/statuses/{sha}","languages_url":"https://api.github.com/repos/jsoriano/pouch/languages","stargazers_url":"https://api.github.com/repos/jsoriano/pouch/stargazers","contributors_url":"https://api.github.com/repos/jsoriano/pouch/contributors","subscribers_url":"https://api.github.com/repos/jsoriano/pouch/subscribers","subscription_url":"https://api.github.com/repos/jsoriano/pouch/subscription","commits_url":"https://api.github.com/repos/jsoriano/pouch/commits{/sha}","git_commits_url":"https://api.github.com/repos/jsoriano/pouch/git/commits{/sha}","comments_url":"https://api.github.com/repos/jsoriano/pouch/comments{/number}","issue_comment_url":"https://api.github.com/repos/jsoriano/pouch/issues/comments{/number}","contents_url":"https://api.github.com/repos/jsoriano/pouch/contents/{+path}","compare_url":"https://api.github.com/repos/jsoriano/pouch/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jsoriano/pouch/merges","archive_url":"https://api.github.com/repos/jsoriano/pouch/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jsoriano/pouch/downloads","issues_url":"https://api.github.com/repos/jsoriano/pouch/issues{/number}","pulls_url":"https://api.github.com/repos/jsoriano/pouch/pulls{/number}","milestones_url":"https://api.github.com/repos/jsoriano/pouch/milestones{/number}","notifications_url":"https://api.github.com/repos/jsoriano/pouch/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jsoriano/pouch/labels{/name}","releases_url":"https://api.github.com/repos/jsoriano/pouch/releases{/id}","deployments_url":"https://api.github.com/repos/jsoriano/pouch/deployments","created_at":"2017-06-09T17:38:36Z","updated_at":"2017-06-09T17:38:39Z","pushed_at":"2018-02-07T17:19:43Z","git_url":"git://github.com/jsoriano/pouch.git","ssh_url":"git@github.com:jsoriano/pouch.git","clone_url":"https://github.com/jsoriano/pouch.git","svn_url":"https://github.com/jsoriano/pouch","homepage":null,"size":4483,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"tuenti:master","ref":"master","sha":"6d326310c14849c6c7f0bade5d88080351ec187d","user":{"login":"tuenti","id":623205,"avatar_url":"https://avatars0.githubusercontent.com/u/623205?v=4","gravatar_id":"","url":"https://api.github.com/users/tuenti","html_url":"https://github.com/tuenti","followers_url":"https://api.github.com/users/tuenti/followers","following_url":"https://api.github.com/users/tuenti/following{/other_user}","gists_url":"https://api.github.com/users/tuenti/gists{/gist_id}","starred_url":"https://api.github.com/users/tuenti/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tuenti/subscriptions","organizations_url":"https://api.github.com/users/tuenti/orgs","repos_url":"https://api.github.com/users/tuenti/repos","events_url":"https://api.github.com/users/tuenti/events{/privacy}","received_events_url":"https://api.github.com/users/tuenti/received_events","type":"Organization","site_admin":false},"repo":{"id":93850170,"name":"pouch","full_name":"tuenti/pouch","owner":{"login":"tuenti","id":623205,"avatar_url":"https://avatars0.githubusercontent.com/u/623205?v=4","gravatar_id":"","url":"https://api.github.com/users/tuenti","html_url":"https://github.com/tuenti","followers_url":"https://api.github.com/users/tuenti/followers","following_url":"https://api.github.com/users/tuenti/following{/other_user}","gists_url":"https://api.github.com/users/tuenti/gists{/gist_id}","starred_url":"https://api.github.com/users/tuenti/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tuenti/subscriptions","organizations_url":"https://api.github.com/users/tuenti/orgs","repos_url":"https://api.github.com/users/tuenti/repos","events_url":"https://api.github.com/users/tuenti/events{/privacy}","received_events_url":"https://api.github.com/users/tuenti/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/tuenti/pouch","description":"Tools to provision secrets using Vault with AppRole authentication method","fork":false,"url":"https://api.github.com/repos/tuenti/pouch","forks_url":"https://api.github.com/repos/tuenti/pouch/forks","keys_url":"https://api.github.com/repos/tuenti/pouch/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tuenti/pouch/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tuenti/pouch/teams","hooks_url":"https://api.github.com/repos/tuenti/pouch/hooks","issue_events_url":"https://api.github.com/repos/tuenti/pouch/issues/events{/number}","events_url":"https://api.github.com/repos/tuenti/pouch/events","assignees_url":"https://api.github.com/repos/tuenti/pouch/assignees{/user}","branches_url":"https://api.github.com/repos/tuenti/pouch/branches{/branch}","tags_url":"https://api.github.com/repos/tuenti/pouch/tags","blobs_url":"https://api.github.com/repos/tuenti/pouch/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tuenti/pouch/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tuenti/pouch/git/refs{/sha}","trees_url":"https://api.github.com/repos/tuenti/pouch/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tuenti/pouch/statuses/{sha}","languages_url":"https://api.github.com/repos/tuenti/pouch/languages","stargazers_url":"https://api.github.com/repos/tuenti/pouch/stargazers","contributors_url":"https://api.github.com/repos/tuenti/pouch/contributors","subscribers_url":"https://api.github.com/repos/tuenti/pouch/subscribers","subscription_url":"https://api.github.com/repos/tuenti/pouch/subscription","commits_url":"https://api.github.com/repos/tuenti/pouch/commits{/sha}","git_commits_url":"https://api.github.com/repos/tuenti/pouch/git/commits{/sha}","comments_url":"https://api.github.com/repos/tuenti/pouch/comments{/number}","issue_comment_url":"https://api.github.com/repos/tuenti/pouch/issues/comments{/number}","contents_url":"https://api.github.com/repos/tuenti/pouch/contents/{+path}","compare_url":"https://api.github.com/repos/tuenti/pouch/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tuenti/pouch/merges","archive_url":"https://api.github.com/repos/tuenti/pouch/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tuenti/pouch/downloads","issues_url":"https://api.github.com/repos/tuenti/pouch/issues{/number}","pulls_url":"https://api.github.com/repos/tuenti/pouch/pulls{/number}","milestones_url":"https://api.github.com/repos/tuenti/pouch/milestones{/number}","notifications_url":"https://api.github.com/repos/tuenti/pouch/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tuenti/pouch/labels{/name}","releases_url":"https://api.github.com/repos/tuenti/pouch/releases{/id}","deployments_url":"https://api.github.com/repos/tuenti/pouch/deployments","created_at":"2017-06-09T10:58:30Z","updated_at":"2018-01-19T20:29:26Z","pushed_at":"2018-02-07T18:07:21Z","git_url":"git://github.com/tuenti/pouch.git","ssh_url":"git@github.com:tuenti/pouch.git","clone_url":"https://github.com/tuenti/pouch.git","svn_url":"https://github.com/tuenti/pouch","homepage":null,"size":4477,"stargazers_count":14,"watchers_count":14,"language":"Go","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5,"mirror_url":null,"archived":false,"open_issues_count":11,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":5,"open_issues":11,"watchers":14,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/tuenti/pouch/pulls/13"},"html":{"href":"https://github.com/tuenti/pouch/pull/13"},"issue":{"href":"https://api.github.com/repos/tuenti/pouch/issues/13"},"comments":{"href":"https://api.github.com/repos/tuenti/pouch/issues/13/comments"},"review_comments":{"href":"https://api.github.com/repos/tuenti/pouch/pulls/13/comments"},"review_comment":{"href":"https://api.github.com/repos/tuenti/pouch/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/tuenti/pouch/pulls/13/commits"},"statuses":{"href":"https://api.github.com/repos/tuenti/pouch/statuses/66746d5e02f085bcae10cbcef4a8dc8c2a796a1e"}},"author_association":"OWNER"}}
{"actor":{"display_login":"mrodm"}}