{"action":"created","comment":{"url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/pulls/comments/45371534","id":45371534,"diff_hunk":"@@ -44,40 +62,82 @@ sub run {\n \t}\n \n \tmy $lc_name     = $self->app->camel_to_underscore($name);\n-\tmy $filepath    = ($path eq \"\") ? $name : \"$path/$name\";\n+\tmy $filepath    = ($package_name =~ s!::!/!gr);\n \tmy $lc_filepath = ($lc_path eq \"\") ? $lc_name : \"$lc_path/$lc_name\";\n+\n \tif (scalar $lc_path) {\n \t\t$lc_path =~ s/\\//_/g;    #safe to modify, we already used this in $lc_filepath\n \t\t$lc_name = $lc_path . \"_\" . $lc_name;\n \t}\n \n-\t$self->app->emit_and_exit(-1, \"No templates exist for this IA Type: \" . $type->{name}) if (!defined $type->{templates});\n-\n-\tmy %template_info = %{$type->{templates}};\n-\tmy $tx            = Text::Xslate->new();\n-\tmy %files         = (\n-\t\ttest       => [\"$filepath.t\"],\n-\t\tcode       => [\"$filepath.pm\"],\n-\t\thandlebars => [$lc_filepath, \"$lc_name.handlebars\"],\n-\t\tjs         => [$lc_filepath, \"$lc_name.js\"]);\n \tmy %vars = (\n \t\tia_name           => $name,\n \t\tia_package_name   => $package_name,\n \t\tia_name_separated => $separated_name,\n \t\tlia_name          => $lc_name,\n-\t\tia_path           => $filepath\n+\t\tia_path           => $filepath,\n+\t\t# TODO Remove this before merging to master\n+\t\tlia_id            => $lc_name,\n \t);\n-\tforeach my $template_type (sort keys %template_info) {\n-\t\tmy ($source, $dest) = ($template_info{$template_type}{in}, $template_info{$template_type}{out});\n-\t\t$self->app->emit_and_exit(-1, 'Template does not exist: ' . $source) unless ($source->exists);\n-\t\t# Update dest based on type:\n-\t\t$dest = $dest->child(@{$files{$template_type}});\n-\t\t$self->app->emit_and_exit(-1, 'File already exists: \"' . $dest->basename . '\" in ' . $dest->parent) if ($dest->exists);\n-\t\tmy $content = $tx->render(\"$source\", \\%vars);\n-\t\t$dest->touchpath->append_utf8($content);    #create file path and append to file\n-\t\t$self->app->emit_info(\"Created file: $dest\");\n+\n+\t# Ask which optional groups to create\n+\tmy @optionals;\n+\n+\tfor my $optional (@{$template->optional_groups}) {\n+\t\tmy $reply = $self->app->get_reply('Do you want to create files for \"' . $optional . '\" [y/n]? ');\n+\n+\t\tpush @optionals, $optional if $reply =~ /^y/i;\n \t}\n+\n+\t# Create the files\n+\tmy @created_files;\n+\n+\ttry {\n+\t\t@created_files = $template->generate(\\%vars, \\@optionals);\n+\t} catch {\n+\t\t$self->app->emit_and_exit(-1,\n+\t\t\t\"Error processing template '\" . $template->name . \"' $_\");\n+\t};\n+\n+\t$self->app->emit_info(\"Created file: $_\") for sort @created_files;\n \t$self->app->emit_info(\"Successfully created \" . $type->{name} . \": $package_name\");\n }\n \n+# Process the template related arguments and return the chosen template\n+sub _process_template_args {\n+\tmy $self = shift;\n+\tmy $type = $self->app->get_ia_type();\n+\tmy $template_defs;\n+\n+\t# read the templates.yml file\n+\ttry {\n+\t\t$template_defs = App::DuckPAN::TemplateDefinitions->new;\n+\t} catch {\n+\t\tif (/no such file/i) {\n+\t\t\t$self->app->emit_and_exit(-1,\n+\t\t\t\t\"No templates exist for this IA Type: \" . $type->{name} . \". \" .\n+\t\t\t\t\"Maybe you need to pull the latest version of this repository?\");\n+\t\t} else {\n+\t\t\t$self->app->emit_and_exit(-1, \"Error reading template definitions file: $_\");\n+\t\t}\n+\t};\n+\n+\tmy $available_templates = join(\", \", sort $template_defs->get_template_names());\n+\n+\t# process the --list-templates option: list the templates and exit with success\n+\t$self->app->emit_and_exit(0, \"Available templates are:\\n$available_templates\")\n+\t\tif $self->list_templates;\n+\n+\tmy $template = $template_defs->get_template($self->template);\n+\n+\t# oops, the template was not found\n+\tunless ($template) {\n+\t\t$self->app->emit_and_exit(-1,\n+\t\t\t\"Template '\" . $self->template . \"' does not exist for this IA Type: \" .\n+\t\t\t$type->{name} . \". Please use one of: \" . $available_templates);","path":"lib/App/DuckPAN/Cmd/New.pm","position":138,"original_position":138,"commit_id":"2a00139d8fccdc9de5dd9fdc88dc546722a0b8cc","original_commit_id":"2a00139d8fccdc9de5dd9fdc88dc546722a0b8cc","user":{"login":"zachthompson","id":1467466,"avatar_url":"https://avatars.githubusercontent.com/u/1467466?v=3","gravatar_id":"","url":"https://api.github.com/users/zachthompson","html_url":"https://github.com/zachthompson","followers_url":"https://api.github.com/users/zachthompson/followers","following_url":"https://api.github.com/users/zachthompson/following{/other_user}","gists_url":"https://api.github.com/users/zachthompson/gists{/gist_id}","starred_url":"https://api.github.com/users/zachthompson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zachthompson/subscriptions","organizations_url":"https://api.github.com/users/zachthompson/orgs","repos_url":"https://api.github.com/users/zachthompson/repos","events_url":"https://api.github.com/users/zachthompson/events{/privacy}","received_events_url":"https://api.github.com/users/zachthompson/received_events","type":"User","site_admin":false},"body":"Let's just say:\r\n```\r\nAvailable templates:\r\n    cheatsheet\r\n    default\r\n```\r\nWould be great if we could have a short description after each entry.  Perhaps that could be added as another key in the template group?","created_at":"2015-11-19T17:23:15Z","updated_at":"2015-11-19T17:23:15Z","html_url":"https://github.com/duckduckgo/p5-app-duckpan/pull/279#discussion_r45371534","pull_request_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/pulls/279","_links":{"self":{"href":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/pulls/comments/45371534"},"html":{"href":"https://github.com/duckduckgo/p5-app-duckpan/pull/279#discussion_r45371534"},"pull_request":{"href":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/pulls/279"}}},"pull_request":{"url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/pulls/279","id":50171800,"html_url":"https://github.com/duckduckgo/p5-app-duckpan/pull/279","diff_url":"https://github.com/duckduckgo/p5-app-duckpan/pull/279.diff","patch_url":"https://github.com/duckduckgo/p5-app-duckpan/pull/279.patch","issue_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/issues/279","number":279,"state":"open","locked":false,"title":"Support for generic templates","user":{"login":"srvsh","id":14072019,"avatar_url":"https://avatars.githubusercontent.com/u/14072019?v=3","gravatar_id":"","url":"https://api.github.com/users/srvsh","html_url":"https://github.com/srvsh","followers_url":"https://api.github.com/users/srvsh/followers","following_url":"https://api.github.com/users/srvsh/following{/other_user}","gists_url":"https://api.github.com/users/srvsh/gists{/gist_id}","starred_url":"https://api.github.com/users/srvsh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/srvsh/subscriptions","organizations_url":"https://api.github.com/users/srvsh/orgs","repos_url":"https://api.github.com/users/srvsh/repos","events_url":"https://api.github.com/users/srvsh/events{/privacy}","received_events_url":"https://api.github.com/users/srvsh/received_events","type":"User","site_admin":false},"body":"1. Moved template information out of `p5-app-duckpan` and into respective IA packages\r\n2. The templates are now defined in YAML files. See https://github.com/srvsh/zeroclickinfo-goodies/blob/3a4f248f61cdb343df37f0d84861129d91c9de7f/template/templates.yml for an example. The file also has some documentation about the structure of the YAML file.\r\n3. An instant answer can have multiple templates that can be chosen by the user during creation.\r\n4. A template has some required files and some optional files. Optional files are in groups and users must specify which of these groups of files they'd like to generate.\r\n3. `App::DuckPAN::TemplateDefinitions` is responsible for reading the YAML file and creating one `App::DuckPAN::Template` instance for each template. \r\n4. `App::DuckPAN::Template` is responsible for creating output files based on variables provided and a list of optional file groups. It also provides a list of output directories that `App::DuckPAN::Restart` watches for changes.\r\n\r\nUsage:\r\nduckpan new \"Hello World\" # creates an instant answer with the 'default' template\r\nduckpan new --template cheatsheet \"Hello World\" # creates an instant answer with the 'cheatsheet' template\r\n\r\nTODO:\r\n1. <s>Tests</s>\r\n2. <s>An option to list all available templates</s>\r\n3. <s>Prompting the user to update the instant answer repository if a `templates.yml` file is not found</s>\r\n\r\n(this is part of work related to Issue #268)","created_at":"2015-11-09T20:18:16Z","updated_at":"2015-11-19T17:23:16Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d6075c7497236ac67d5b2b3e0c7327d11b73d7f9","assignee":{"login":"zachthompson","id":1467466,"avatar_url":"https://avatars.githubusercontent.com/u/1467466?v=3","gravatar_id":"","url":"https://api.github.com/users/zachthompson","html_url":"https://github.com/zachthompson","followers_url":"https://api.github.com/users/zachthompson/followers","following_url":"https://api.github.com/users/zachthompson/following{/other_user}","gists_url":"https://api.github.com/users/zachthompson/gists{/gist_id}","starred_url":"https://api.github.com/users/zachthompson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zachthompson/subscriptions","organizations_url":"https://api.github.com/users/zachthompson/orgs","repos_url":"https://api.github.com/users/zachthompson/repos","events_url":"https://api.github.com/users/zachthompson/events{/privacy}","received_events_url":"https://api.github.com/users/zachthompson/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/pulls/279/commits","review_comments_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/pulls/279/comments","review_comment_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/pulls/comments{/number}","comments_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/issues/279/comments","statuses_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/statuses/2a00139d8fccdc9de5dd9fdc88dc546722a0b8cc","head":{"label":"srvsh:generic_templates","ref":"generic_templates","sha":"2a00139d8fccdc9de5dd9fdc88dc546722a0b8cc","user":{"login":"srvsh","id":14072019,"avatar_url":"https://avatars.githubusercontent.com/u/14072019?v=3","gravatar_id":"","url":"https://api.github.com/users/srvsh","html_url":"https://github.com/srvsh","followers_url":"https://api.github.com/users/srvsh/followers","following_url":"https://api.github.com/users/srvsh/following{/other_user}","gists_url":"https://api.github.com/users/srvsh/gists{/gist_id}","starred_url":"https://api.github.com/users/srvsh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/srvsh/subscriptions","organizations_url":"https://api.github.com/users/srvsh/orgs","repos_url":"https://api.github.com/users/srvsh/repos","events_url":"https://api.github.com/users/srvsh/events{/privacy}","received_events_url":"https://api.github.com/users/srvsh/received_events","type":"User","site_admin":false},"repo":{"id":44994707,"name":"p5-app-duckpan","full_name":"srvsh/p5-app-duckpan","owner":{"login":"srvsh","id":14072019,"avatar_url":"https://avatars.githubusercontent.com/u/14072019?v=3","gravatar_id":"","url":"https://api.github.com/users/srvsh","html_url":"https://github.com/srvsh","followers_url":"https://api.github.com/users/srvsh/followers","following_url":"https://api.github.com/users/srvsh/following{/other_user}","gists_url":"https://api.github.com/users/srvsh/gists{/gist_id}","starred_url":"https://api.github.com/users/srvsh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/srvsh/subscriptions","organizations_url":"https://api.github.com/users/srvsh/orgs","repos_url":"https://api.github.com/users/srvsh/repos","events_url":"https://api.github.com/users/srvsh/events{/privacy}","received_events_url":"https://api.github.com/users/srvsh/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/srvsh/p5-app-duckpan","description":"DuckPAN and DuckDuckGo OpenSource Development Application","fork":true,"url":"https://api.github.com/repos/srvsh/p5-app-duckpan","forks_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/forks","keys_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/keys{/key_id}","collaborators_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/teams","hooks_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/hooks","issue_events_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/issues/events{/number}","events_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/events","assignees_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/assignees{/user}","branches_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/branches{/branch}","tags_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/tags","blobs_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/git/refs{/sha}","trees_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/git/trees{/sha}","statuses_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/statuses/{sha}","languages_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/languages","stargazers_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/stargazers","contributors_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/contributors","subscribers_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/subscribers","subscription_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/subscription","commits_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/commits{/sha}","git_commits_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/git/commits{/sha}","comments_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/comments{/number}","issue_comment_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/issues/comments{/number}","contents_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/contents/{+path}","compare_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/compare/{base}...{head}","merges_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/merges","archive_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/downloads","issues_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/issues{/number}","pulls_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/pulls{/number}","milestones_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/milestones{/number}","notifications_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/labels{/name}","releases_url":"https://api.github.com/repos/srvsh/p5-app-duckpan/releases{/id}","created_at":"2015-10-26T20:18:40Z","updated_at":"2015-10-26T20:18:41Z","pushed_at":"2015-11-19T14:06:29Z","git_url":"git://github.com/srvsh/p5-app-duckpan.git","ssh_url":"git@github.com:srvsh/p5-app-duckpan.git","clone_url":"https://github.com/srvsh/p5-app-duckpan.git","svn_url":"https://github.com/srvsh/p5-app-duckpan","homepage":"http://metacpan.org/module/App::DuckPAN","size":1068,"stargazers_count":0,"watchers_count":0,"language":"Perl","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"duckduckgo:master","ref":"master","sha":"6e552506bce4c5ac3105583413d5a3c1cea814be","user":{"login":"duckduckgo","id":342708,"avatar_url":"https://avatars.githubusercontent.com/u/342708?v=3","gravatar_id":"","url":"https://api.github.com/users/duckduckgo","html_url":"https://github.com/duckduckgo","followers_url":"https://api.github.com/users/duckduckgo/followers","following_url":"https://api.github.com/users/duckduckgo/following{/other_user}","gists_url":"https://api.github.com/users/duckduckgo/gists{/gist_id}","starred_url":"https://api.github.com/users/duckduckgo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/duckduckgo/subscriptions","organizations_url":"https://api.github.com/users/duckduckgo/orgs","repos_url":"https://api.github.com/users/duckduckgo/repos","events_url":"https://api.github.com/users/duckduckgo/events{/privacy}","received_events_url":"https://api.github.com/users/duckduckgo/received_events","type":"Organization","site_admin":false},"repo":{"id":3342052,"name":"p5-app-duckpan","full_name":"duckduckgo/p5-app-duckpan","owner":{"login":"duckduckgo","id":342708,"avatar_url":"https://avatars.githubusercontent.com/u/342708?v=3","gravatar_id":"","url":"https://api.github.com/users/duckduckgo","html_url":"https://github.com/duckduckgo","followers_url":"https://api.github.com/users/duckduckgo/followers","following_url":"https://api.github.com/users/duckduckgo/following{/other_user}","gists_url":"https://api.github.com/users/duckduckgo/gists{/gist_id}","starred_url":"https://api.github.com/users/duckduckgo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/duckduckgo/subscriptions","organizations_url":"https://api.github.com/users/duckduckgo/orgs","repos_url":"https://api.github.com/users/duckduckgo/repos","events_url":"https://api.github.com/users/duckduckgo/events{/privacy}","received_events_url":"https://api.github.com/users/duckduckgo/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/duckduckgo/p5-app-duckpan","description":"DuckPAN and DuckDuckGo OpenSource Development Application","fork":false,"url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan","forks_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/forks","keys_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/keys{/key_id}","collaborators_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/teams","hooks_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/hooks","issue_events_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/issues/events{/number}","events_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/events","assignees_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/assignees{/user}","branches_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/branches{/branch}","tags_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/tags","blobs_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/git/refs{/sha}","trees_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/git/trees{/sha}","statuses_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/statuses/{sha}","languages_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/languages","stargazers_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/stargazers","contributors_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/contributors","subscribers_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/subscribers","subscription_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/subscription","commits_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/commits{/sha}","git_commits_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/git/commits{/sha}","comments_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/comments{/number}","issue_comment_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/issues/comments{/number}","contents_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/contents/{+path}","compare_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/compare/{base}...{head}","merges_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/merges","archive_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/downloads","issues_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/issues{/number}","pulls_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/pulls{/number}","milestones_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/milestones{/number}","notifications_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/labels{/name}","releases_url":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/releases{/id}","created_at":"2012-02-03T05:50:28Z","updated_at":"2015-10-03T08:11:30Z","pushed_at":"2015-11-19T14:06:29Z","git_url":"git://github.com/duckduckgo/p5-app-duckpan.git","ssh_url":"git@github.com:duckduckgo/p5-app-duckpan.git","clone_url":"https://github.com/duckduckgo/p5-app-duckpan.git","svn_url":"https://github.com/duckduckgo/p5-app-duckpan","homepage":"http://metacpan.org/module/App::DuckPAN","size":3265,"stargazers_count":32,"watchers_count":32,"language":"Perl","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":34,"mirror_url":null,"open_issues_count":29,"forks":34,"open_issues":29,"watchers":32,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/pulls/279"},"html":{"href":"https://github.com/duckduckgo/p5-app-duckpan/pull/279"},"issue":{"href":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/issues/279"},"comments":{"href":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/issues/279/comments"},"review_comments":{"href":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/pulls/279/comments"},"review_comment":{"href":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/pulls/279/commits"},"statuses":{"href":"https://api.github.com/repos/duckduckgo/p5-app-duckpan/statuses/2a00139d8fccdc9de5dd9fdc88dc546722a0b8cc"}}}}