{"action":"created","comment":{"url":"https://api.github.com/repos/puppetlabs/pdk-planning/pulls/comments/204903535","pull_request_review_id":140070496,"id":204903535,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIwNDkwMzUzNQ==","diff_hunk":"@@ -0,0 +1,292 @@\n+# Add `pdk config` subcommand\n+\n+## Summary\n+\n+Introduce a PDK and module configuration subsystem with a new `pdk config` subcommand providing the user interface\n+to read and write configuration keys and values.\n+\n+## Background & Assumptions\n+\n+Prior to the introduction of the Puppet Development Kit, module development involved the coordination of a set of\n+distinct tools, rake tasks, etc. which each carried their own implicit and explicit mechanisms for customization and\n+configuration.\n+\n+While the PDK has made a lot of strides in providing a unified invocation interface for these tools, thus far we have\n+not addressed configuration side of the way module developers interact with these tools.\n+\n+To illustrate this, here is a survey of the current file-based configuration landscape for a single module:\n+\n+  - metadata.json\n+  - .sync.yml\n+  - .fixtures.yml\n+  - .nodeset.yml\n+  - .pdkignore\n+  - .puppet-lint.rc\n+  - .rspec\n+  - .rubocop[\\_todo].yml\n+  - .yardopts\n+  - Rakefile\n+\n+(Plus the inherent configuration and customization contained within the puppetlabs\\_spec\\_helper gem and it’s provided\n+rake tasks, some of which the PDK invokes.)\n+\n+## Motivation & Goals\n+\n+- Standardize the way existing module development workflows are configured and customized for PDK users.\n+\n+- Reduce the number of different ways that module development workflows with PDK are configured and customized.\n+\n+- Resolve some inconsistencies and design challenges presented by existing PDK features. (See template-url/template-ref\n+  design discussion and some issues we have had with invalid values cached in answers.json)\n+\n+- Improve the discoverability of module development configuration and customization. **Currently many of the avenues for\n+  configuration are based around hidden files and their significance is not obvious to someone who is new to module\n+  development.**\n+\n+## Proposed Implementation Design\n+\n+Implement a new pdk subcommand, `pdk config` which will offer the following actions:\n+\n+  - `pdk config [get] [--format=<format>]`\n+\n+    Lists the complete, currently resolved configuration, merging all available layers of config and presenting the\n+    formatted results.\n+\n+    If run from within a module, will show both user-level and module-level config.\n+\n+    If run outside of a module, will only show user-level config with an indication to the user that the command was not\n+    invoked from within a module.\n+\n+\n+  - `pdk config get <key> [--format=<format>]`\n+\n+    Retrieves a specific value from the resolved configuration.\n+\n+    If `<key>` is a leaf node of the configuration graph, this command will return the raw value:\n+\n+    ```\n+    $ pdk config get user.default_template.url\n+    https://github.com/puppetlabs/pdk-templates.git\n+    ```\n+\n+    If `<key>` is a non-leaf node of the configuration graph, this command will return a structure containing the values\n+    of all sub-keys of the given key:\n+\n+    ```\n+    $ pdk config get user.default_template\n+    url: https://github.com/puppetlabs/pdk-templates.git\n+    ref: master\n+    ```\n+\n+    You can also supply the `--format` option to control how keys and values are presented:\n+\n+    ```\n+    $ pdk config get user.default_template.url --format=json\n+    { \"url\": \"https://github.com/.../pdk-templates.git\" }\n+    ```\n+\n+    ```\n+    $ pdk config get user.default_template --format=json\n+    { \"url\": \"https://github.com/.../pdk-templates.git\", \"ref\": \"master\" }\n+    ```\n+\n+  - `pdk config set [--add] <key> <value>`\n+\n+    Sets, updates, or adds to the value(s) in the given configuration key and outputs the new value(s).\n+\n+    If `<key>` is not a leaf node, exits non-zero with an error message.\n+\n+    If `<key>` already has a value set, issues a notice before replacing existing value.\n+\n+    If `<key>` is designed to store multiple values (e.g. a list):\n+\n+      - If the current value list is empty, set the first value in the list to the provided `<value>`.\n+\n+      - If the current value list is not empty and `<value>` is not already present in the list, add `<value>` to the\n+        list.\n+\n+      - If `<value>` is already present in the value list, issues a notice that value was already on list, outputs the\n+        current values of `<key>`, and exits with a success status.\n+\n+    If `<key>` is a user-defined configuration key where we cannot infer whether or not it can have multiple values,\n+    assume it is a single-value key unless the user includes the `--add` flag. If the user includes the `--add` flag,\n+    treat it as a multi-value key as described above.\n+\n+    Basic usage examples:\n+\n+    - Known single value key, initial value:\n+\n+      ```\n+      $ pdk config set user.default_template.url \"https://github.com/scotje/pdk-templates.git\"\n+      pdk (INFO): Set initial value of user.default_template.url to \"...\"\n+      https://github.com/scotje/pdk-templates.git\n+      ```\n+\n+    - Known single value key, update value:\n+\n+      ```\n+      $ pdk config set user.default_template.url \"https://github.com/example/repo.git\"\n+      pdk (INFO): Changed existing value of user.default_template.url from \"...\" to \"...\"\n+      https://github.com/example/repo.git\n+      ```\n+\n+    - Known multi-value key, initial value:\n+\n+      ```\n+      $ pdk config set module.multi.example apple\n+      pdk (INFO): Added new value \"apple\" to module.multi.example\n+      apple\n+      ```\n+\n+    - Known multi-value key, additional value:\n+\n+      ```\n+      $ pdk config set module.multi.example banana\n+      pdk (INFO): Added new value \"banana\" to module.multi.example\n+      apple\n+      banana\n+      ```\n+\n+    - Known multi-value key, duplicate value:\n+\n+      ```\n+      $ pdk config set module.multi.example apple\n+      pdk (INFO): No changes made to module.multi.example as it already contains value \"apple\"\n+      apple\n+      banana\n+      ```\n+\n+    - User-defined key, initial value:\n+\n+      ```\n+      $ pdk config set module.x.example strawberry\n+      pdk (INFO): Set initial value of modle.x.example to \"strawberry\"\n+      strawberry\n+      ```\n+\n+    - User-defined key, append value:\n+\n+      ```\n+      $ pdk config set --add module.x.example orange\n+      pdk (INFO): Added new value \"orange\" to module.x.example\n+      strawberry\n+      orange\n+      ```\n+\n+  - `pdk config del[ete] <key> [<value>|--all]`\n+\n+    Unset one more more values from the given configuration key.\n+\n+    If `<key>` is not a leaf node, exits non-zero with an error message.\n+\n+    If `<key>` currently stores no value, issues a warning but exits with a success status.\n+\n+    If `<key>` currently stores a single value:\n+\n+      - If no `<value>` is provided, unsets existing value.\n+\n+      - If provided `<value>` matches existing value, unsets existing value.\n+\n+      - If provided `<value>` does not match existing value, exits non-zero with an error message.\n+\n+      - If passed `--all` in place of a value, unsets existing value.\n+\n+    If `<key>` currently stores multiple values:\n+\n+      - If no `<value>` is provided, exit non-zero with an error message indicating user must pass `--all` if they want\n+        to clear all values for the key.\n+\n+      - If provided `<value>` is present in the list of values for `<key>`, removes value from list.\n+\n+      - If provided `<value>` is not present in the list of values for `<key>`, issues a warning but exits with a\n+        success status.\n+\n+      - If passed `--all` in place of a value, empties the list of all existing values.\n+\n+### Proposed Configuration Keys\n+\n+#### User/Local Config\n+\n+The values for these config keys will be persisted in ~/.pdk/config. They are intended to be developer-specific settings\n+and will not apply to another developer working on the same codebase.\n+\n+| Key | Description |\n+| --- | --- |\n+| user.module\\_defaults.template.url | Default template URL to use when generating a new module. |\n+| user.module\\_defaults.template.ref | Default template ref to use when generating a new module. (E.g. branch or tag.) |\n+| user.module\\_defaults.metadata.author | Default value for the “author” key in metadata.json for a new module. Supersedes previous ~/.pdk/cache/answers.json functionality. |\n+| user.module\\_defaults.metadata.license | Default value for the “license” key in metadata.json for a new module. Supersedes previous ~/.pdk/cache/answers.json functionality. |\n+| user.forge.username | Primary Forge username of this developer. Note that this may be an organization rather than a personal username. Used as the default value in metadata.json when generating a new module. Supersedes previous ~/.pdk/cache/answers.json functionality. |\n+| [user.forge.api\\_key] | Placeholder for future Forge API interactions. |\n+| [user.forge.api\\_secret] | Placeholder for future Forge API interactions. |\n+\n+#### Module-specific Config\n+\n+The values for these config keys will be persisted in a new .pdk/config file within the module, the new file is intended\n+to be checked into VCS and shared with other developers to ensure consistent application of the relevant PDK commands.\n+\n+| Key | Description |\n+| --- | --- |\n+| module.template.url | Template URL to use for this module. |\n+| module.template.ref | Template ref to use for this module. Note that this will differ from what is currently stored in metadata.json, this value will be the “desired” reference (e.g. a branch name) but not the specific commit that the module was last updated to. |\n+| module.template.custom.[...] | Filename based keys with associated config hashes to govern how the template should be applied to this specific module. Supersedes existing .sync.yml settings. |\n+| module.test.fixtures.[...] | List of additional modules, etc. and associated config hashes needed in order to run unit tests for this module. Supersedes existing .fixtures.yml settings. |\n+| module.x.[...] | Arbitrary keys and values to be utilized by users to persist data between module developers. Can be used as a basic shared data store for custom developer Rake tasks, etc. |\n+\n+### More About `module.x`\n+\n+The `module.x` configuration key space is intended to be used by module developers and third-party tool developers to\n+persist configuration data that is relevant to all developers of a module. Ultimately we want to avoid any need for\n+users to add additional configuration files to their modules beyond what `pdk config` uses.\n+\n+We will define and document best practices around the usage of the `module.x` key space for the community, including\n+things like:\n+\n+ - Namespace your custom configuration settings under a key that matches the name of your organization or tool name,\n+   e.g. `module.x.mycompany`, `module.x.voxpupuli`, or `module.x.super_module_tool`.\n+\n+ - If your custom configuration is tool-specific, include a key and value that you can use to version your other\n+   configuration data. That way you can significantly change the configuration format for your tool in the future\n+   without breaking older versions. E.g. `module.x.super_module_tool.config_version = 1`\n+\n+ - Plus any other best practices we come up with.\n+\n+## Unresolved Questions\n+\n+- Do we need a “system”-level layer of config? (i.e. user-level config that is the default for all users of a system,","path":"RFCs/0000-add-pdk-config.md","position":256,"original_position":256,"commit_id":"e69a7aad0de1458615b7aece6fa63849be63b55f","original_commit_id":"e69a7aad0de1458615b7aece6fa63849be63b55f","user":{"login":"scotje","id":9058,"node_id":"MDQ6VXNlcjkwNTg=","avatar_url":"https://avatars0.githubusercontent.com/u/9058?v=4","gravatar_id":"","url":"https://api.github.com/users/scotje","html_url":"https://github.com/scotje","followers_url":"https://api.github.com/users/scotje/followers","following_url":"https://api.github.com/users/scotje/following{/other_user}","gists_url":"https://api.github.com/users/scotje/gists{/gist_id}","starred_url":"https://api.github.com/users/scotje/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scotje/subscriptions","organizations_url":"https://api.github.com/users/scotje/orgs","repos_url":"https://api.github.com/users/scotje/repos","events_url":"https://api.github.com/users/scotje/events{/privacy}","received_events_url":"https://api.github.com/users/scotje/received_events","type":"User","site_admin":false},"body":"@vinzent Thanks for the additional context. Would lack of the system-level config in the initial release cause you to not adopt `pdk config` right away? Trying to narrow down whether that feature is a \"must have\" or a \"nice to have\" for the first release.","created_at":"2018-07-24T20:41:05Z","updated_at":"2018-07-24T20:41:05Z","html_url":"https://github.com/puppetlabs/pdk-planning/pull/4#discussion_r204903535","pull_request_url":"https://api.github.com/repos/puppetlabs/pdk-planning/pulls/4","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/puppetlabs/pdk-planning/pulls/comments/204903535"},"html":{"href":"https://github.com/puppetlabs/pdk-planning/pull/4#discussion_r204903535"},"pull_request":{"href":"https://api.github.com/repos/puppetlabs/pdk-planning/pulls/4"}},"in_reply_to_id":201870717},"pull_request":{"url":"https://api.github.com/repos/puppetlabs/pdk-planning/pulls/4","id":200189366,"node_id":"MDExOlB1bGxSZXF1ZXN0MjAwMTg5MzY2","html_url":"https://github.com/puppetlabs/pdk-planning/pull/4","diff_url":"https://github.com/puppetlabs/pdk-planning/pull/4.diff","patch_url":"https://github.com/puppetlabs/pdk-planning/pull/4.patch","issue_url":"https://api.github.com/repos/puppetlabs/pdk-planning/issues/4","number":4,"state":"open","locked":false,"title":"RFC proposal for `pdk config` subcommand","user":{"login":"scotje","id":9058,"node_id":"MDQ6VXNlcjkwNTg=","avatar_url":"https://avatars0.githubusercontent.com/u/9058?v=4","gravatar_id":"","url":"https://api.github.com/users/scotje","html_url":"https://github.com/scotje","followers_url":"https://api.github.com/users/scotje/followers","following_url":"https://api.github.com/users/scotje/following{/other_user}","gists_url":"https://api.github.com/users/scotje/gists{/gist_id}","starred_url":"https://api.github.com/users/scotje/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scotje/subscriptions","organizations_url":"https://api.github.com/users/scotje/orgs","repos_url":"https://api.github.com/users/scotje/repos","events_url":"https://api.github.com/users/scotje/events{/privacy}","received_events_url":"https://api.github.com/users/scotje/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-07-09T18:56:31Z","updated_at":"2018-07-24T20:41:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0817747c65550d7bfa1e696e1bd3918856a43a09","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/puppetlabs/pdk-planning/pulls/4/commits","review_comments_url":"https://api.github.com/repos/puppetlabs/pdk-planning/pulls/4/comments","review_comment_url":"https://api.github.com/repos/puppetlabs/pdk-planning/pulls/comments{/number}","comments_url":"https://api.github.com/repos/puppetlabs/pdk-planning/issues/4/comments","statuses_url":"https://api.github.com/repos/puppetlabs/pdk-planning/statuses/e69a7aad0de1458615b7aece6fa63849be63b55f","head":{"label":"scotje:rfc_pdk_config","ref":"rfc_pdk_config","sha":"e69a7aad0de1458615b7aece6fa63849be63b55f","user":{"login":"scotje","id":9058,"node_id":"MDQ6VXNlcjkwNTg=","avatar_url":"https://avatars0.githubusercontent.com/u/9058?v=4","gravatar_id":"","url":"https://api.github.com/users/scotje","html_url":"https://github.com/scotje","followers_url":"https://api.github.com/users/scotje/followers","following_url":"https://api.github.com/users/scotje/following{/other_user}","gists_url":"https://api.github.com/users/scotje/gists{/gist_id}","starred_url":"https://api.github.com/users/scotje/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scotje/subscriptions","organizations_url":"https://api.github.com/users/scotje/orgs","repos_url":"https://api.github.com/users/scotje/repos","events_url":"https://api.github.com/users/scotje/events{/privacy}","received_events_url":"https://api.github.com/users/scotje/received_events","type":"User","site_admin":false},"repo":{"id":136516966,"node_id":"MDEwOlJlcG9zaXRvcnkxMzY1MTY5NjY=","name":"pdk-planning","full_name":"scotje/pdk-planning","owner":{"login":"scotje","id":9058,"node_id":"MDQ6VXNlcjkwNTg=","avatar_url":"https://avatars0.githubusercontent.com/u/9058?v=4","gravatar_id":"","url":"https://api.github.com/users/scotje","html_url":"https://github.com/scotje","followers_url":"https://api.github.com/users/scotje/followers","following_url":"https://api.github.com/users/scotje/following{/other_user}","gists_url":"https://api.github.com/users/scotje/gists{/gist_id}","starred_url":"https://api.github.com/users/scotje/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/scotje/subscriptions","organizations_url":"https://api.github.com/users/scotje/orgs","repos_url":"https://api.github.com/users/scotje/repos","events_url":"https://api.github.com/users/scotje/events{/privacy}","received_events_url":"https://api.github.com/users/scotje/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/scotje/pdk-planning","description":"A repository of roadmaps, feature proposals, and other planning resources for the Puppet Development Kit ","fork":false,"url":"https://api.github.com/repos/scotje/pdk-planning","forks_url":"https://api.github.com/repos/scotje/pdk-planning/forks","keys_url":"https://api.github.com/repos/scotje/pdk-planning/keys{/key_id}","collaborators_url":"https://api.github.com/repos/scotje/pdk-planning/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/scotje/pdk-planning/teams","hooks_url":"https://api.github.com/repos/scotje/pdk-planning/hooks","issue_events_url":"https://api.github.com/repos/scotje/pdk-planning/issues/events{/number}","events_url":"https://api.github.com/repos/scotje/pdk-planning/events","assignees_url":"https://api.github.com/repos/scotje/pdk-planning/assignees{/user}","branches_url":"https://api.github.com/repos/scotje/pdk-planning/branches{/branch}","tags_url":"https://api.github.com/repos/scotje/pdk-planning/tags","blobs_url":"https://api.github.com/repos/scotje/pdk-planning/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/scotje/pdk-planning/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/scotje/pdk-planning/git/refs{/sha}","trees_url":"https://api.github.com/repos/scotje/pdk-planning/git/trees{/sha}","statuses_url":"https://api.github.com/repos/scotje/pdk-planning/statuses/{sha}","languages_url":"https://api.github.com/repos/scotje/pdk-planning/languages","stargazers_url":"https://api.github.com/repos/scotje/pdk-planning/stargazers","contributors_url":"https://api.github.com/repos/scotje/pdk-planning/contributors","subscribers_url":"https://api.github.com/repos/scotje/pdk-planning/subscribers","subscription_url":"https://api.github.com/repos/scotje/pdk-planning/subscription","commits_url":"https://api.github.com/repos/scotje/pdk-planning/commits{/sha}","git_commits_url":"https://api.github.com/repos/scotje/pdk-planning/git/commits{/sha}","comments_url":"https://api.github.com/repos/scotje/pdk-planning/comments{/number}","issue_comment_url":"https://api.github.com/repos/scotje/pdk-planning/issues/comments{/number}","contents_url":"https://api.github.com/repos/scotje/pdk-planning/contents/{+path}","compare_url":"https://api.github.com/repos/scotje/pdk-planning/compare/{base}...{head}","merges_url":"https://api.github.com/repos/scotje/pdk-planning/merges","archive_url":"https://api.github.com/repos/scotje/pdk-planning/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/scotje/pdk-planning/downloads","issues_url":"https://api.github.com/repos/scotje/pdk-planning/issues{/number}","pulls_url":"https://api.github.com/repos/scotje/pdk-planning/pulls{/number}","milestones_url":"https://api.github.com/repos/scotje/pdk-planning/milestones{/number}","notifications_url":"https://api.github.com/repos/scotje/pdk-planning/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/scotje/pdk-planning/labels{/name}","releases_url":"https://api.github.com/repos/scotje/pdk-planning/releases{/id}","deployments_url":"https://api.github.com/repos/scotje/pdk-planning/deployments","created_at":"2018-06-07T18:35:39Z","updated_at":"2018-07-11T23:15:42Z","pushed_at":"2018-07-09T22:10:27Z","git_url":"git://github.com/scotje/pdk-planning.git","ssh_url":"git@github.com:scotje/pdk-planning.git","clone_url":"https://github.com/scotje/pdk-planning.git","svn_url":"https://github.com/scotje/pdk-planning","homepage":null,"size":16,"stargazers_count":0,"watchers_count":0,"language":null,"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":"puppetlabs:master","ref":"master","sha":"4dd17432e9a4daa4083d183e79f5e1050f19f48a","user":{"login":"puppetlabs","id":234268,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIzNDI2OA==","avatar_url":"https://avatars0.githubusercontent.com/u/234268?v=4","gravatar_id":"","url":"https://api.github.com/users/puppetlabs","html_url":"https://github.com/puppetlabs","followers_url":"https://api.github.com/users/puppetlabs/followers","following_url":"https://api.github.com/users/puppetlabs/following{/other_user}","gists_url":"https://api.github.com/users/puppetlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/puppetlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/puppetlabs/subscriptions","organizations_url":"https://api.github.com/users/puppetlabs/orgs","repos_url":"https://api.github.com/users/puppetlabs/repos","events_url":"https://api.github.com/users/puppetlabs/events{/privacy}","received_events_url":"https://api.github.com/users/puppetlabs/received_events","type":"Organization","site_admin":false},"repo":{"id":136516950,"node_id":"MDEwOlJlcG9zaXRvcnkxMzY1MTY5NTA=","name":"pdk-planning","full_name":"puppetlabs/pdk-planning","owner":{"login":"puppetlabs","id":234268,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIzNDI2OA==","avatar_url":"https://avatars0.githubusercontent.com/u/234268?v=4","gravatar_id":"","url":"https://api.github.com/users/puppetlabs","html_url":"https://github.com/puppetlabs","followers_url":"https://api.github.com/users/puppetlabs/followers","following_url":"https://api.github.com/users/puppetlabs/following{/other_user}","gists_url":"https://api.github.com/users/puppetlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/puppetlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/puppetlabs/subscriptions","organizations_url":"https://api.github.com/users/puppetlabs/orgs","repos_url":"https://api.github.com/users/puppetlabs/repos","events_url":"https://api.github.com/users/puppetlabs/events{/privacy}","received_events_url":"https://api.github.com/users/puppetlabs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/puppetlabs/pdk-planning","description":"A repository of roadmaps, feature proposals, and other planning resources for the Puppet Development Kit ","fork":false,"url":"https://api.github.com/repos/puppetlabs/pdk-planning","forks_url":"https://api.github.com/repos/puppetlabs/pdk-planning/forks","keys_url":"https://api.github.com/repos/puppetlabs/pdk-planning/keys{/key_id}","collaborators_url":"https://api.github.com/repos/puppetlabs/pdk-planning/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/puppetlabs/pdk-planning/teams","hooks_url":"https://api.github.com/repos/puppetlabs/pdk-planning/hooks","issue_events_url":"https://api.github.com/repos/puppetlabs/pdk-planning/issues/events{/number}","events_url":"https://api.github.com/repos/puppetlabs/pdk-planning/events","assignees_url":"https://api.github.com/repos/puppetlabs/pdk-planning/assignees{/user}","branches_url":"https://api.github.com/repos/puppetlabs/pdk-planning/branches{/branch}","tags_url":"https://api.github.com/repos/puppetlabs/pdk-planning/tags","blobs_url":"https://api.github.com/repos/puppetlabs/pdk-planning/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/puppetlabs/pdk-planning/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/puppetlabs/pdk-planning/git/refs{/sha}","trees_url":"https://api.github.com/repos/puppetlabs/pdk-planning/git/trees{/sha}","statuses_url":"https://api.github.com/repos/puppetlabs/pdk-planning/statuses/{sha}","languages_url":"https://api.github.com/repos/puppetlabs/pdk-planning/languages","stargazers_url":"https://api.github.com/repos/puppetlabs/pdk-planning/stargazers","contributors_url":"https://api.github.com/repos/puppetlabs/pdk-planning/contributors","subscribers_url":"https://api.github.com/repos/puppetlabs/pdk-planning/subscribers","subscription_url":"https://api.github.com/repos/puppetlabs/pdk-planning/subscription","commits_url":"https://api.github.com/repos/puppetlabs/pdk-planning/commits{/sha}","git_commits_url":"https://api.github.com/repos/puppetlabs/pdk-planning/git/commits{/sha}","comments_url":"https://api.github.com/repos/puppetlabs/pdk-planning/comments{/number}","issue_comment_url":"https://api.github.com/repos/puppetlabs/pdk-planning/issues/comments{/number}","contents_url":"https://api.github.com/repos/puppetlabs/pdk-planning/contents/{+path}","compare_url":"https://api.github.com/repos/puppetlabs/pdk-planning/compare/{base}...{head}","merges_url":"https://api.github.com/repos/puppetlabs/pdk-planning/merges","archive_url":"https://api.github.com/repos/puppetlabs/pdk-planning/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/puppetlabs/pdk-planning/downloads","issues_url":"https://api.github.com/repos/puppetlabs/pdk-planning/issues{/number}","pulls_url":"https://api.github.com/repos/puppetlabs/pdk-planning/pulls{/number}","milestones_url":"https://api.github.com/repos/puppetlabs/pdk-planning/milestones{/number}","notifications_url":"https://api.github.com/repos/puppetlabs/pdk-planning/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/puppetlabs/pdk-planning/labels{/name}","releases_url":"https://api.github.com/repos/puppetlabs/pdk-planning/releases{/id}","deployments_url":"https://api.github.com/repos/puppetlabs/pdk-planning/deployments","created_at":"2018-06-07T18:35:27Z","updated_at":"2018-07-12T07:17:00Z","pushed_at":"2018-07-09T22:11:31Z","git_url":"git://github.com/puppetlabs/pdk-planning.git","ssh_url":"git@github.com:puppetlabs/pdk-planning.git","clone_url":"https://github.com/puppetlabs/pdk-planning.git","svn_url":"https://github.com/puppetlabs/pdk-planning","homepage":null,"size":9,"stargazers_count":2,"watchers_count":2,"language":null,"has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"open_issues_count":11,"license":null,"forks":2,"open_issues":11,"watchers":2,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/puppetlabs/pdk-planning/pulls/4"},"html":{"href":"https://github.com/puppetlabs/pdk-planning/pull/4"},"issue":{"href":"https://api.github.com/repos/puppetlabs/pdk-planning/issues/4"},"comments":{"href":"https://api.github.com/repos/puppetlabs/pdk-planning/issues/4/comments"},"review_comments":{"href":"https://api.github.com/repos/puppetlabs/pdk-planning/pulls/4/comments"},"review_comment":{"href":"https://api.github.com/repos/puppetlabs/pdk-planning/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/puppetlabs/pdk-planning/pulls/4/commits"},"statuses":{"href":"https://api.github.com/repos/puppetlabs/pdk-planning/statuses/e69a7aad0de1458615b7aece6fa63849be63b55f"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"scotje"}}