{"action":"created","comment":{"url":"https://api.github.com/repos/picocms/Pico/pulls/comments/39346329","id":39346329,"diff_hunk":"@@ -0,0 +1,248 @@\n+<?php\n+\n+/**\n+ * Abstract class to extend from when implementing a Pico plugin\n+ *\n+ * @see IPicoPlugin\n+ *\n+ * @author  Daniel Rudolf\n+ * @link    http://picocms.org\n+ * @license http://opensource.org/licenses/MIT\n+ * @version 1.0\n+ */\n+abstract class AbstractPicoPlugin implements IPicoPlugin\n+{\n+    /**\n+     * Current instance of Pico\n+     *\n+     * @var Pico\n+     * @see IPicoPlugin::__construct()\n+     * @see IPicoPlugin::getPico()\n+     */\n+    private $pico;\n+\n+    /**\n+     * Boolean indicating if this plugin is enabled (true) or disabled (false)\n+     *\n+     * @var boolean\n+     * @see IPicoPlugin::isEnabled()\n+     * @see IPicoPlugin::setEnabled()\n+     */\n+    protected $enabled = true;\n+\n+    /**\n+     * Boolean indicating if this plugin was ever enabled/disabled manually\n+     *\n+     * @var boolean\n+     * @see IPicoPlugin::isStatusChanged()\n+     */\n+    protected $statusChanged = false;\n+\n+    /**\n+     * List of plugins this plugin depends on\n+     *\n+     * @var array<string>\n+     * @see IPicoPlugin::getDependencies()\n+     * @see AbstractPicoPlugin::checkDependencies()\n+     */\n+    protected $dependsOn = array();\n+\n+    /**\n+     * List of plugin which depend on this plugin\n+     *\n+     * @var array<object>\n+     * @see IPicoPlugin::getDependants()\n+     * @see AbstractPicoPlugin::checkDependants()\n+     */\n+    private $dependants;\n+\n+    /**\n+     * @see IPicoPlugin::__construct()\n+     */\n+    public function __construct(Pico $pico)\n+    {\n+        $this->pico = $pico;\n+    }\n+\n+    /**\n+     * @see IPicoPlugin::handleEvent()\n+     */\n+    public function handleEvent($eventName, array $params)\n+    {\n+        // plugins can be enabled/disabled using the config\n+        if ($eventName === 'onConfigLoaded') {\n+            $pluginEnabled = $this->getConfig(get_called_class().'.enabled');\n+            if ($pluginEnabled !== null) {\n+                $this->setEnabled($pluginEnabled);\n+            }\n+        }\n+\n+        if ($this->isEnabled() || ($eventName === 'onPluginsLoaded')) {\n+            if (method_exists($this, $eventName)) {\n+                call_user_func_array(array($this, $eventName), $params);\n+            }\n+        }\n+    }\n+\n+    /**\n+     * @see IPicoPlugin::setEnabled()\n+     */\n+    public function setEnabled($enabled, $recursive = true, $auto = false)\n+    {\n+        $this->statusChanged = (!$this->statusChanged) ? !$auto : true;\n+        $this->enabled = (bool) $enabled;\n+\n+        if ($enabled) {\n+            $this->checkDependencies($recursive);\n+        } else {\n+            $this->checkDependants($recursive);\n+        }\n+    }\n+\n+    /**\n+     * @see IPicoPlugin::isEnabled()\n+     */\n+    public function isEnabled()\n+    {\n+        return $this->enabled;\n+    }\n+\n+    /**\n+     * @see IPicoPlugin::isStatusChanged()\n+     */\n+    public function isStatusChanged()\n+    {\n+        return $this->statusChanged;\n+    }\n+\n+    /**\n+     * @see IPicoPlugin::getPico()\n+     */\n+    public function getPico()\n+    {\n+        return $this->pico;\n+    }\n+\n+    /**\n+     * Passes all not satisfiable method calls to {@link Pico}\n+     *\n+     * @param  string $methodName name of the method to call\n+     * @param  array  $params     parameters to pass\n+     * @return mixed              return value of the called method\n+     */\n+    public function __call($methodName, array $params)\n+    {\n+        if (method_exists($this->getPico(), $methodName)) {\n+            return call_user_func_array(array($this->getPico(), $methodName), $params);\n+        }\n+\n+        throw new BadMethodCallException(\n+            'Call to undefined method '.get_class($this->getPico()).'::'.$methodName.'() '\n+            . 'through '.get_called_class().'::__call()'\n+        );\n+    }\n+\n+    /**\n+     * Enables all plugins on which this plugin depends\n+     *\n+     * @param  boolean $recursive enable required plugins automatically\n+     * @return void\n+     * @throws RuntimeException   thrown when a dependency fails\n+     */\n+    protected function checkDependencies($recursive)\n+    {\n+        foreach ($this->getDependencies() as $pluginName) {\n+            try {\n+                $plugin = $this->getPlugin($pluginName);\n+            } catch (RuntimeException $e) {\n+                throw new RuntimeException(\n+                    \"Unable to enable plugin '\" . get_called_class() . \"':\"\n+                    . \"Required plugin '\" . $pluginName . \"' not found\"\n+                );\n+            }\n+\n+            // plugins which don't implement IPicoPlugin are always enabled\n+            if (is_a($plugin, 'IPicoPlugin') && !$plugin->isEnabled()) {\n+                if ($recursive) {\n+                    if (!$plugin->isStatusChanged()) {\n+                        $plugin->setEnabled(true, true, true);\n+                    } else {\n+                        throw new RuntimeException(\n+                            \"Unable to enable plugin '\" . get_called_class() . \"':\"\n+                            . \"Required plugin '\" . $pluginName . \"' was disabled manually\"\n+                        );\n+                    }\n+                } else {\n+                    throw new RuntimeException(\n+                        \"Unable to enable plugin '\" . get_called_class() . \"':\"\n+                        . \"Required plugin '\" . $pluginName . \"' is disabled\"\n+                    );\n+                }\n+            }\n+        }\n+    }\n+\n+    /**\n+     * @see IPicoPlugin::getDependencies()\n+     */\n+    public function getDependencies()\n+    {\n+        return $this->dependsOn;\n+    }\n+\n+    /**\n+     * Disables all plugins which depend on this plugin\n+     *\n+     * @param  boolean $recursive disabled dependant plugins automatically\n+     * @return void\n+     * @throws RuntimeException   thrown when a dependency fails\n+     */\n+    protected function checkDependants($recursive)\n+    {\n+        $dependants = $this->getDependants();\n+        if (!empty($dependants)) {\n+            if ($recursive) {\n+                foreach ($this->getDependants() as $pluginName => $plugin) {\n+                    if ($plugin->isEnabled()) {\n+                        if (!$plugin->isStatusChanged()) {\n+                            $plugin->setEnabled(false, true, true);\n+                        } else {\n+                            throw new RuntimeException(\n+                                \"Unable to disable plugin '\" . get_called_class() . \"': \"\n+                                + \"Required by manually enabled plugin '\" . $pluginName . \"'\"","path":"lib/AbstractPicoPlugin.php","position":212,"original_position":212,"commit_id":"a83b01ef4f3da6317ccc8df8cef4c398880a1a05","original_commit_id":"a83b01ef4f3da6317ccc8df8cef4c398880a1a05","user":{"login":"PontusHorn","id":6806243,"avatar_url":"https://avatars.githubusercontent.com/u/6806243?v=3","gravatar_id":"","url":"https://api.github.com/users/PontusHorn","html_url":"https://github.com/PontusHorn","followers_url":"https://api.github.com/users/PontusHorn/followers","following_url":"https://api.github.com/users/PontusHorn/following{/other_user}","gists_url":"https://api.github.com/users/PontusHorn/gists{/gist_id}","starred_url":"https://api.github.com/users/PontusHorn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PontusHorn/subscriptions","organizations_url":"https://api.github.com/users/PontusHorn/orgs","repos_url":"https://api.github.com/users/PontusHorn/repos","events_url":"https://api.github.com/users/PontusHorn/events{/privacy}","received_events_url":"https://api.github.com/users/PontusHorn/received_events","type":"User","site_admin":false},"body":"Wrong string concatenation operator","created_at":"2015-09-13T10:13:14Z","updated_at":"2015-09-13T10:13:14Z","html_url":"https://github.com/picocms/Pico/pull/252#discussion_r39346329","pull_request_url":"https://api.github.com/repos/picocms/Pico/pulls/252","_links":{"self":{"href":"https://api.github.com/repos/picocms/Pico/pulls/comments/39346329"},"html":{"href":"https://github.com/picocms/Pico/pull/252#discussion_r39346329"},"pull_request":{"href":"https://api.github.com/repos/picocms/Pico/pulls/252"}}},"pull_request":{"url":"https://api.github.com/repos/picocms/Pico/pulls/252","id":43648992,"html_url":"https://github.com/picocms/Pico/pull/252","diff_url":"https://github.com/picocms/Pico/pull/252.diff","patch_url":"https://github.com/picocms/Pico/pull/252.patch","issue_url":"https://api.github.com/repos/picocms/Pico/issues/252","number":252,"state":"open","locked":false,"title":"Pico 1.0","user":{"login":"PhrozenByte","id":920356,"avatar_url":"https://avatars.githubusercontent.com/u/920356?v=3","gravatar_id":"","url":"https://api.github.com/users/PhrozenByte","html_url":"https://github.com/PhrozenByte","followers_url":"https://api.github.com/users/PhrozenByte/followers","following_url":"https://api.github.com/users/PhrozenByte/following{/other_user}","gists_url":"https://api.github.com/users/PhrozenByte/gists{/gist_id}","starred_url":"https://api.github.com/users/PhrozenByte/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PhrozenByte/subscriptions","organizations_url":"https://api.github.com/users/PhrozenByte/orgs","repos_url":"https://api.github.com/users/PhrozenByte/repos","events_url":"https://api.github.com/users/PhrozenByte/events{/privacy}","received_events_url":"https://api.github.com/users/PhrozenByte/received_events","type":"User","site_admin":false},"body":"**First of all: Why?** The sourcecode of existing forks like [BaunCMS](http://bauncms.com/) and [PhilleCMS](http://philecms.com/) isn't \"stupidly simple\" anymore... You can read Picos sourcecode from top to down and even copy&paste programmers will understand what's going on. It's all about \"understanding at first glance\".\r\n\r\nMost important second: **All changes are 100% backward compatible.**\r\n\r\nI considered writing something own, but then caught up with Pico. The only thing missing was clean code - Picos concept, workflow and code really is \"stupidly simple\", but very powerful. **Actually I just did a code refactoring.** [I don't want to fork Pico](https://xkcd.com/927/) and I won't do it even if you reject my changes (obviously I'll still use it myself :smile:).\r\n\r\n**This should be v1.0 ready.** I recommend to release it as v1.0-beta, waiting some weeks to test it on a large user basis (I'll fix all appearing problems) and finally releasing it as Pico 1.0 :smile:\r\n\r\nPlease give me a hint if you'll merge this, I'll then update the homepage (`gh-pages` branch), `changelog.txt` etc. accordingly.\r\n\r\n**What did I do?**\r\n- Fixes #79, Closes #93, Fixes #99, Closes #103, Closes #116, Fixes #140, Fixes #158, Closes #171, Closes #241, Closes #244, Closes #246, Fixes #249, Fixes #253\r\n- The code is now documented, code styling follows PSR. Pico superficially grows from 400 LoC to 900 LoC, when removing all comments, Pico grows from 300 LoC to 450 LoC, mostly because of new public getter methods (= 50 LoC) and PSR code styling. As said, there are no big functional changes, it's more a code refactoring.\r\n- The new routing system now works out-of-the-box (even without rewriting) with any webserver using the QUERY_STRING routing method. Internal links now look like `?sub/page`, rewriting to basically remove the `?` is still possible and recommended. Contrary to Pico 0.9 every webserver should work just fine. Pico 0.9 required working URL rewriting, so if you want to use old plugins/themes/contents, a working rewrite setup may still be required. If you're not using the default `.htaccess`, your must update your rewrite rules to follow the new principles. Internal links in content files are declared with `%base_url%?sub/page`. Internal links in templates should be declared using the new `link` filter (e.g. `{{ \"sub/page\"|link }}`), what basically calls `Pico::getPageUrl()`. You musn't change anything if you setup rewriting (what was required in Pico 0.9...), so I assume this to be fully backward compatible :smile:\r\n- I've implemented a whole new plugin system while maintaining full backward compatibility. See the class docs of `IPicoPlugin` for details. The new event system supports plugin dependencies as well as some new events. It was necessary to reliably distinct between old and new events, so all events were renamed. The new `PicoDeprecated` plugin is crucial for backward compatibility, it's enabled on demand. Refer to its class docs for details.\r\n- The file extension of content files is now configurable\r\n- Heads up! #158 is fixed only when the `PicoParsePagesContent` plugin isn't enabled. It's disabled by default, but gets automatically enabled with `PicoDeprecated` as soon as an old plugin is loaded. This is necessary to maintain backward compatibility. You can still disable it manually by executing `$pico->getPlugin('PicoParsePagesContent')->setEnabled(false);` or adding `$config['PicoParsePagesContent.enabled'] = false;` to your `config.php`.\r\n- The meta headers are now parsed by the YAML component of the Symfony project (see #116), but still requires you to register new headers during the `onMetaHeaders` event. I'm uncertain about still requiring that. What do you think?\r\n- Meta header variables are now accessible in content files using `%meta.*%`, so you mustn't repeat yourself. You can now put an excerpt into the `description` meta variable and output the same content at the beginning of the article using `%meta.description%` (see `index.md` for a example).\r\n- I decided explicitly to NOT implement pages as objects (\"stupidly simple\", see above). Anyway, I think plugin developers shouldn't manipulate data in \"wrong\" events, this could lead us to unexpected behaviour. Sure, plugin developers still can do this, we're passing variables by reference, but it's not that obvious. I even thought about dereferencing the values after the corrosponding event was called, but that would be backward incompatible. What do you think?\r\n- How to fix the \"composer problem\" discussed in #221 and #223? There's a very simple solution: When creating a release on GitHub (after you've pushed the tag) you can upload \"binaries\". Simply execute composer locally, create a ZIP archive and upload the result as \"binary\".\r\n- I didn't care much about #110, #238, #239 and #240 because I simply don't need these features. But I think they are good ideas and the core should support this. Just my 2 cents :smile:\r\n- #201 and #231 should be closed - this can easily be achieved with plugins. In fact, there are already plugins adding support for these features...\r\n- Imo distinct documentations for users, theme designers and plugin devs is MUCH more important than unit tests... Pico is a project with just about 500 LoC (+ comments), such a manageable project doesn't necessarily require unit tests - they are nice to have, but that's it. Documentation should be the top priority!\r\n- Note: I'm no english native speaker. Maybe someone should look through my code comments :smile:","created_at":"2015-08-28T16:56:47Z","updated_at":"2015-09-13T10:13:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"dd61c43958561f8d795d83e5cd616828980a5060","assignee":null,"milestone":{"url":"https://api.github.com/repos/picocms/Pico/milestones/1","html_url":"https://github.com/picocms/Pico/milestones/Version%201.0","labels_url":"https://api.github.com/repos/picocms/Pico/milestones/1/labels","id":1140347,"number":1,"title":"Version 1.0","description":"Complete these issues before release of version 1.0 ","creator":{"login":"theshka","id":640217,"avatar_url":"https://avatars.githubusercontent.com/u/640217?v=3","gravatar_id":"","url":"https://api.github.com/users/theshka","html_url":"https://github.com/theshka","followers_url":"https://api.github.com/users/theshka/followers","following_url":"https://api.github.com/users/theshka/following{/other_user}","gists_url":"https://api.github.com/users/theshka/gists{/gist_id}","starred_url":"https://api.github.com/users/theshka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/theshka/subscriptions","organizations_url":"https://api.github.com/users/theshka/orgs","repos_url":"https://api.github.com/users/theshka/repos","events_url":"https://api.github.com/users/theshka/events{/privacy}","received_events_url":"https://api.github.com/users/theshka/received_events","type":"User","site_admin":false},"open_issues":2,"closed_issues":1,"state":"open","created_at":"2015-05-29T16:38:00Z","updated_at":"2015-08-30T17:15:26Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/picocms/Pico/pulls/252/commits","review_comments_url":"https://api.github.com/repos/picocms/Pico/pulls/252/comments","review_comment_url":"https://api.github.com/repos/picocms/Pico/pulls/comments{/number}","comments_url":"https://api.github.com/repos/picocms/Pico/issues/252/comments","statuses_url":"https://api.github.com/repos/picocms/Pico/statuses/a83b01ef4f3da6317ccc8df8cef4c398880a1a05","head":{"label":"PhrozenByte:pico1.0","ref":"pico1.0","sha":"a83b01ef4f3da6317ccc8df8cef4c398880a1a05","user":{"login":"PhrozenByte","id":920356,"avatar_url":"https://avatars.githubusercontent.com/u/920356?v=3","gravatar_id":"","url":"https://api.github.com/users/PhrozenByte","html_url":"https://github.com/PhrozenByte","followers_url":"https://api.github.com/users/PhrozenByte/followers","following_url":"https://api.github.com/users/PhrozenByte/following{/other_user}","gists_url":"https://api.github.com/users/PhrozenByte/gists{/gist_id}","starred_url":"https://api.github.com/users/PhrozenByte/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PhrozenByte/subscriptions","organizations_url":"https://api.github.com/users/PhrozenByte/orgs","repos_url":"https://api.github.com/users/PhrozenByte/repos","events_url":"https://api.github.com/users/PhrozenByte/events{/privacy}","received_events_url":"https://api.github.com/users/PhrozenByte/received_events","type":"User","site_admin":false},"repo":{"id":40058273,"name":"Pico","full_name":"PhrozenByte/Pico","owner":{"login":"PhrozenByte","id":920356,"avatar_url":"https://avatars.githubusercontent.com/u/920356?v=3","gravatar_id":"","url":"https://api.github.com/users/PhrozenByte","html_url":"https://github.com/PhrozenByte","followers_url":"https://api.github.com/users/PhrozenByte/followers","following_url":"https://api.github.com/users/PhrozenByte/following{/other_user}","gists_url":"https://api.github.com/users/PhrozenByte/gists{/gist_id}","starred_url":"https://api.github.com/users/PhrozenByte/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/PhrozenByte/subscriptions","organizations_url":"https://api.github.com/users/PhrozenByte/orgs","repos_url":"https://api.github.com/users/PhrozenByte/repos","events_url":"https://api.github.com/users/PhrozenByte/events{/privacy}","received_events_url":"https://api.github.com/users/PhrozenByte/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/PhrozenByte/Pico","description":"Pico is a stupidly simple, blazing fast, flat file CMS.","fork":true,"url":"https://api.github.com/repos/PhrozenByte/Pico","forks_url":"https://api.github.com/repos/PhrozenByte/Pico/forks","keys_url":"https://api.github.com/repos/PhrozenByte/Pico/keys{/key_id}","collaborators_url":"https://api.github.com/repos/PhrozenByte/Pico/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/PhrozenByte/Pico/teams","hooks_url":"https://api.github.com/repos/PhrozenByte/Pico/hooks","issue_events_url":"https://api.github.com/repos/PhrozenByte/Pico/issues/events{/number}","events_url":"https://api.github.com/repos/PhrozenByte/Pico/events","assignees_url":"https://api.github.com/repos/PhrozenByte/Pico/assignees{/user}","branches_url":"https://api.github.com/repos/PhrozenByte/Pico/branches{/branch}","tags_url":"https://api.github.com/repos/PhrozenByte/Pico/tags","blobs_url":"https://api.github.com/repos/PhrozenByte/Pico/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/PhrozenByte/Pico/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/PhrozenByte/Pico/git/refs{/sha}","trees_url":"https://api.github.com/repos/PhrozenByte/Pico/git/trees{/sha}","statuses_url":"https://api.github.com/repos/PhrozenByte/Pico/statuses/{sha}","languages_url":"https://api.github.com/repos/PhrozenByte/Pico/languages","stargazers_url":"https://api.github.com/repos/PhrozenByte/Pico/stargazers","contributors_url":"https://api.github.com/repos/PhrozenByte/Pico/contributors","subscribers_url":"https://api.github.com/repos/PhrozenByte/Pico/subscribers","subscription_url":"https://api.github.com/repos/PhrozenByte/Pico/subscription","commits_url":"https://api.github.com/repos/PhrozenByte/Pico/commits{/sha}","git_commits_url":"https://api.github.com/repos/PhrozenByte/Pico/git/commits{/sha}","comments_url":"https://api.github.com/repos/PhrozenByte/Pico/comments{/number}","issue_comment_url":"https://api.github.com/repos/PhrozenByte/Pico/issues/comments{/number}","contents_url":"https://api.github.com/repos/PhrozenByte/Pico/contents/{+path}","compare_url":"https://api.github.com/repos/PhrozenByte/Pico/compare/{base}...{head}","merges_url":"https://api.github.com/repos/PhrozenByte/Pico/merges","archive_url":"https://api.github.com/repos/PhrozenByte/Pico/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/PhrozenByte/Pico/downloads","issues_url":"https://api.github.com/repos/PhrozenByte/Pico/issues{/number}","pulls_url":"https://api.github.com/repos/PhrozenByte/Pico/pulls{/number}","milestones_url":"https://api.github.com/repos/PhrozenByte/Pico/milestones{/number}","notifications_url":"https://api.github.com/repos/PhrozenByte/Pico/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/PhrozenByte/Pico/labels{/name}","releases_url":"https://api.github.com/repos/PhrozenByte/Pico/releases{/id}","created_at":"2015-08-01T19:51:23Z","updated_at":"2015-08-01T19:51:25Z","pushed_at":"2015-09-06T12:35:27Z","git_url":"git://github.com/PhrozenByte/Pico.git","ssh_url":"git@github.com:PhrozenByte/Pico.git","clone_url":"https://github.com/PhrozenByte/Pico.git","svn_url":"https://github.com/PhrozenByte/Pico","homepage":"http://picocms.org/","size":1615,"stargazers_count":0,"watchers_count":0,"language":"PHP","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"picocms:master","ref":"master","sha":"2fdcacc14bb8cdfd46564c605a6e641005305a4f","user":{"login":"picocms","id":7042563,"avatar_url":"https://avatars.githubusercontent.com/u/7042563?v=3","gravatar_id":"","url":"https://api.github.com/users/picocms","html_url":"https://github.com/picocms","followers_url":"https://api.github.com/users/picocms/followers","following_url":"https://api.github.com/users/picocms/following{/other_user}","gists_url":"https://api.github.com/users/picocms/gists{/gist_id}","starred_url":"https://api.github.com/users/picocms/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/picocms/subscriptions","organizations_url":"https://api.github.com/users/picocms/orgs","repos_url":"https://api.github.com/users/picocms/repos","events_url":"https://api.github.com/users/picocms/events{/privacy}","received_events_url":"https://api.github.com/users/picocms/received_events","type":"User","site_admin":false},"repo":{"id":3929096,"name":"Pico","full_name":"picocms/Pico","owner":{"login":"picocms","id":7042563,"avatar_url":"https://avatars.githubusercontent.com/u/7042563?v=3","gravatar_id":"","url":"https://api.github.com/users/picocms","html_url":"https://github.com/picocms","followers_url":"https://api.github.com/users/picocms/followers","following_url":"https://api.github.com/users/picocms/following{/other_user}","gists_url":"https://api.github.com/users/picocms/gists{/gist_id}","starred_url":"https://api.github.com/users/picocms/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/picocms/subscriptions","organizations_url":"https://api.github.com/users/picocms/orgs","repos_url":"https://api.github.com/users/picocms/repos","events_url":"https://api.github.com/users/picocms/events{/privacy}","received_events_url":"https://api.github.com/users/picocms/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/picocms/Pico","description":"Pico is a stupidly simple, blazing fast, flat file CMS.","fork":false,"url":"https://api.github.com/repos/picocms/Pico","forks_url":"https://api.github.com/repos/picocms/Pico/forks","keys_url":"https://api.github.com/repos/picocms/Pico/keys{/key_id}","collaborators_url":"https://api.github.com/repos/picocms/Pico/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/picocms/Pico/teams","hooks_url":"https://api.github.com/repos/picocms/Pico/hooks","issue_events_url":"https://api.github.com/repos/picocms/Pico/issues/events{/number}","events_url":"https://api.github.com/repos/picocms/Pico/events","assignees_url":"https://api.github.com/repos/picocms/Pico/assignees{/user}","branches_url":"https://api.github.com/repos/picocms/Pico/branches{/branch}","tags_url":"https://api.github.com/repos/picocms/Pico/tags","blobs_url":"https://api.github.com/repos/picocms/Pico/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/picocms/Pico/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/picocms/Pico/git/refs{/sha}","trees_url":"https://api.github.com/repos/picocms/Pico/git/trees{/sha}","statuses_url":"https://api.github.com/repos/picocms/Pico/statuses/{sha}","languages_url":"https://api.github.com/repos/picocms/Pico/languages","stargazers_url":"https://api.github.com/repos/picocms/Pico/stargazers","contributors_url":"https://api.github.com/repos/picocms/Pico/contributors","subscribers_url":"https://api.github.com/repos/picocms/Pico/subscribers","subscription_url":"https://api.github.com/repos/picocms/Pico/subscription","commits_url":"https://api.github.com/repos/picocms/Pico/commits{/sha}","git_commits_url":"https://api.github.com/repos/picocms/Pico/git/commits{/sha}","comments_url":"https://api.github.com/repos/picocms/Pico/comments{/number}","issue_comment_url":"https://api.github.com/repos/picocms/Pico/issues/comments{/number}","contents_url":"https://api.github.com/repos/picocms/Pico/contents/{+path}","compare_url":"https://api.github.com/repos/picocms/Pico/compare/{base}...{head}","merges_url":"https://api.github.com/repos/picocms/Pico/merges","archive_url":"https://api.github.com/repos/picocms/Pico/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/picocms/Pico/downloads","issues_url":"https://api.github.com/repos/picocms/Pico/issues{/number}","pulls_url":"https://api.github.com/repos/picocms/Pico/pulls{/number}","milestones_url":"https://api.github.com/repos/picocms/Pico/milestones{/number}","notifications_url":"https://api.github.com/repos/picocms/Pico/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/picocms/Pico/labels{/name}","releases_url":"https://api.github.com/repos/picocms/Pico/releases{/id}","created_at":"2012-04-04T13:46:20Z","updated_at":"2015-09-12T01:27:56Z","pushed_at":"2015-09-06T12:35:30Z","git_url":"git://github.com/picocms/Pico.git","ssh_url":"git@github.com:picocms/Pico.git","clone_url":"https://github.com/picocms/Pico.git","svn_url":"https://github.com/picocms/Pico","homepage":"http://picocms.org/","size":3017,"stargazers_count":2088,"watchers_count":2088,"language":"PHP","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":412,"mirror_url":null,"open_issues_count":27,"forks":412,"open_issues":27,"watchers":2088,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/picocms/Pico/pulls/252"},"html":{"href":"https://github.com/picocms/Pico/pull/252"},"issue":{"href":"https://api.github.com/repos/picocms/Pico/issues/252"},"comments":{"href":"https://api.github.com/repos/picocms/Pico/issues/252/comments"},"review_comments":{"href":"https://api.github.com/repos/picocms/Pico/pulls/252/comments"},"review_comment":{"href":"https://api.github.com/repos/picocms/Pico/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/picocms/Pico/pulls/252/commits"},"statuses":{"href":"https://api.github.com/repos/picocms/Pico/statuses/a83b01ef4f3da6317ccc8df8cef4c398880a1a05"}}}}