{"action":"created","comment":{"url":"https://api.github.com/repos/zikula/core/pulls/comments/41133282","id":41133282,"diff_hunk":"@@ -0,0 +1,283 @@\n+<?php\n+/**\n+ * Copyright 2015 Zikula Foundation\n+ *\n+ * This work is contributed to the Zikula Foundation under one or more\n+ * Contributor Agreements and licensed to You under the following license:\n+ *\n+ * @license GNU/LGPLv3 (or at your option, any later version).\n+ * @package Zikula\n+ *\n+ * Please see the NOTICE file distributed with this source code for further\n+ * information regarding copyright and licensing.\n+ */\n+\n+namespace Zikula\\Core\\Helper;\n+\n+use Doctrine\\ORM\\EntityManagerInterface;\n+use Symfony\\Component\\HttpKernel\\KernelInterface;\n+use Zikula\\Core\\Doctrine\\Entity\\ExtensionVarEntity;\n+\n+/**\n+ * Class ExtensionVar\n+ * @package Zikula\\Core\\Helper\n+ *\n+ * This class manages the storage and retrieval of extension variables and is the intended replacement\n+ * for ModUtil::* methods (getVar, setVar, etc) as well as similar functionality in System:: and ThemeUtil::\n+ */\n+class ExtensionVar\n+{\n+    const CONFIG_MODULE = 'ZConfig';\n+\n+    /**\n+     * @var EntityManagerInterface\n+     */\n+    private $entityManager;\n+    /**\n+     * @var KernelInterface\n+     */\n+    private $kernel;\n+\n+    /**\n+     * @var \\ArrayObject\n+     * @todo consider \\Symfony\\Component\\DependencyInjection\\ParameterBag\\ParameterBag\n+     * @todo consider \\Symfony\\Component\\HttpFoundation\\ParameterBag\n+     */\n+    private $variables;\n+\n+    /**\n+     * ExtensionVar constructor.\n+     * @param EntityManagerInterface $entityManager\n+     * @param KernelInterface $kernel\n+     */\n+    public function __construct(EntityManagerInterface $entityManager, KernelInterface $kernel)\n+    {\n+        $this->entityManager = $entityManager;\n+        $this->kernel = $kernel;\n+        $this->initExtensionVars();\n+    }\n+\n+    /**\n+     * Preloads extension vars for a number of key modules to reduce sql statements.\n+     *\n+     * @param boolean $force\n+     *\n+     * @return void\n+     */\n+    public function initExtensionVars($force = false)\n+    {\n+        // The empty arrays for handlers and settings are required to prevent messages with E_ALL error reporting\n+        $this->variables = new \\ArrayObject(array(\n+            \\EventUtil::HANDLERS => array(),\n+            \\ServiceUtil::HANDLERS => array(),\n+            'ZikulaSettingsModule' => array(),\n+        ));\n+\n+        // don't init vars during the installer or upgrader\n+        if (!$force && \\System::isInstalling()) {\n+            return;\n+        }\n+\n+        // Load all variables into the variables property.\n+        /** @var ExtensionVarEntity[] $vars */\n+        $vars = $this->entityManager->getRepository('Zikula\\Core\\Doctrine\\Entity\\ExtensionVarEntity')->findAll();\n+        foreach ($vars as $var) {\n+            if (!array_key_exists($var->getModname(), $this->variables)) {\n+                $this->variables[$var->getModname()] = array();\n+            }\n+            if (array_key_exists($var->getName(), $GLOBALS['ZConfig']['System'])) {\n+                $this->variables[$var->getModname()][$var->getName()] = $GLOBALS['ZConfig']['System'][$var->getName()];\n+            } else {\n+                $this->variables[$var->getModname()][$var->getName()] = $var->getValue();\n+            }\n+        }\n+\n+        // Pre-load the variables array with empty arrays for known extensions that do not define any variables to\n+        // prevent unnecessary queries to the database.\n+        foreach ($this->kernel->getBundles() as $bundle) {\n+            if (!array_key_exists($bundle->getName(), $this->variables)) {\n+                $this->variables[$bundle->getName()] = array();\n+            }\n+        }\n+    }\n+\n+    /**\n+     * Checks to see if an extension variable is set.\n+     *\n+     * @param string $extensionName The name of the extension.\n+     * @param string $variableName The name of the variable.\n+     *\n+     * @return boolean True if the variable exists in the database, false if not.\n+     */\n+    public function has($extensionName, $variableName)\n+    {\n+        // define input, all numbers and booleans to strings\n+        $extensionName = isset($extensionName) ? ((string) $extensionName) : '';\n+        $variableName = isset($variableName) ? ((string) $variableName) : '';\n+\n+        // The cast to (array) is for the odd instance where $this->variables[$extensionName] is set to null--not sure if this is really needed.\n+        $varExists = isset($this->variables[$extensionName]) && array_key_exists($variableName, (array)$this->variables[$extensionName]);\n+\n+        if (!$varExists && \\System::isUpgrading()) {\n+            // Handle upgrade edge case: a call to get() ensures vars for the extension are loaded if newly available.\n+            $vars = $this->get($extensionName);\n+            $varExists = array_key_exists($variableName, (array)$vars);\n+        }\n+\n+        return $varExists;\n+    }\n+\n+    /**\n+     * Get an extension variable.\n+     *\n+     * If the variableName parameter is omitted the method returns a multi-dimensional array of the keys and values\n+     * for all the extension vars.\n+     *\n+     * @param string $extensionName The name of the extension or pseudo-extension (e.g., 'ZikulaUsersModule', 'ZConfig', '/EventHandlers').\n+     * @param string $variableName The name of the variable.\n+     * @param mixed $default The value to return if the requested var is not set.\n+     *\n+     * @return string|array If the name parameter is included then method returns\n+     *          string - extension variable value\n+     *          if the name parameter is ommitted then method returns\n+     *          array - multi-dimensional array of the keys and values for the extension vars.\n+     */\n+    public function get($extensionName, $variableName = '', $default = false)\n+    {\n+        if (empty($extensionName)) {\n+            throw new \\InvalidArgumentException();\n+        }\n+\n+        // if vars for this extension not available then get them\n+        if (!array_key_exists($extensionName, $this->variables)) {\n+            // A query out to the database should only be needed if the system is upgrading. Use the installing flag to determine this.\n+            if (\\System::isUpgrading()) {\n+                $this->initExtensionVars(true);\n+            } else {\n+                // Prevent a re-query for the same extension in the future, where the extension does not define any extension variables.\n+                $this->variables[$extensionName] = array();\n+            }\n+        }\n+\n+        // if variable name not passed, then return every variable for the specified extension as an associative array.\n+        if (empty($variableName) && array_key_exists($extensionName, $this->variables)) {\n+            return $this->variables[$extensionName];\n+        }\n+\n+        if (isset($this->variables[$extensionName]) && array_key_exists($variableName, $this->variables[$extensionName])) {\n+            return $this->variables[$extensionName][$variableName];\n+        }\n+\n+        return $default;\n+    }\n+\n+    /**\n+     * Set an extension variable.\n+     *\n+     * @param string $extensionName The name of the extension.\n+     * @param string $variableName The name of the variable.\n+     * @param string $value The value of the variable.\n+     *\n+     * @return boolean True if successful, false otherwise.\n+     */\n+    public function set($extensionName, $variableName, $value = '')\n+    {\n+        if (empty($extensionName) || empty($variableName)) {\n+            throw new \\InvalidArgumentException();\n+        }\n+\n+        $extensionName = (string) $extensionName;\n+        $variableName = (string) $variableName;\n+\n+        $entities = $this->entityManager->getRepository('Zikula\\Core\\Doctrine\\Entity\\ExtensionVarEntity')\n+            ->findBy(array('modname' => $extensionName, 'name' => $variableName));\n+        if (count($entities) > 0) {\n+            foreach ($entities as $entity) {\n+                // possible duplicates exist. update all (refs #2385)\n+                $entity->setValue($value);","path":"src/lib/Zikula/Core/Helper/ExtensionVar.php","position":197,"original_position":197,"commit_id":"c6456add74596fd64d2c82800d869510f25b1349","original_commit_id":"c6456add74596fd64d2c82800d869510f25b1349","user":{"login":"cmfcmf","id":2145092,"avatar_url":"https://avatars.githubusercontent.com/u/2145092?v=3","gravatar_id":"","url":"https://api.github.com/users/cmfcmf","html_url":"https://github.com/cmfcmf","followers_url":"https://api.github.com/users/cmfcmf/followers","following_url":"https://api.github.com/users/cmfcmf/following{/other_user}","gists_url":"https://api.github.com/users/cmfcmf/gists{/gist_id}","starred_url":"https://api.github.com/users/cmfcmf/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cmfcmf/subscriptions","organizations_url":"https://api.github.com/users/cmfcmf/orgs","repos_url":"https://api.github.com/users/cmfcmf/repos","events_url":"https://api.github.com/users/cmfcmf/events{/privacy}","received_events_url":"https://api.github.com/users/cmfcmf/received_events","type":"User","site_admin":false},"body":"Logging some sort of warning here seems appropriate, if count($entities) > 1","created_at":"2015-10-05T11:24:45Z","updated_at":"2015-10-05T11:24:45Z","html_url":"https://github.com/zikula/core/pull/2624#discussion_r41133282","pull_request_url":"https://api.github.com/repos/zikula/core/pulls/2624","_links":{"self":{"href":"https://api.github.com/repos/zikula/core/pulls/comments/41133282"},"html":{"href":"https://github.com/zikula/core/pull/2624#discussion_r41133282"},"pull_request":{"href":"https://api.github.com/repos/zikula/core/pulls/2624"}}},"pull_request":{"url":"https://api.github.com/repos/zikula/core/pulls/2624","id":46731757,"html_url":"https://github.com/zikula/core/pull/2624","diff_url":"https://github.com/zikula/core/pull/2624.diff","patch_url":"https://github.com/zikula/core/pull/2624.patch","issue_url":"https://api.github.com/repos/zikula/core/issues/2624","number":2624,"state":"open","locked":false,"title":"add ExtensionVar helper","user":{"login":"craigh","id":350048,"avatar_url":"https://avatars.githubusercontent.com/u/350048?v=3","gravatar_id":"","url":"https://api.github.com/users/craigh","html_url":"https://github.com/craigh","followers_url":"https://api.github.com/users/craigh/followers","following_url":"https://api.github.com/users/craigh/following{/other_user}","gists_url":"https://api.github.com/users/craigh/gists{/gist_id}","starred_url":"https://api.github.com/users/craigh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/craigh/subscriptions","organizations_url":"https://api.github.com/users/craigh/orgs","repos_url":"https://api.github.com/users/craigh/repos","events_url":"https://api.github.com/users/craigh/events{/privacy}","received_events_url":"https://api.github.com/users/craigh/received_events","type":"User","site_admin":false},"body":"Initially, this PR is to discuss implementation of classes like this `ExtensionVar` helper. This is the first 'replacement' of the legacy Util type classes and so, before work is continued on that effort, we should agree on a few details.\r\n\r\nThis class is intended to replace `ModUtil::*Var` functions as well as similar functions in `System` and `ThemeUtil`.\r\n\r\nquestions:\r\n 1) class location?\r\n 2) naming of class and service?\r\n\r\nnotes:\r\n - yes it works.\r\n - changed 'Mod' to 'Extension' to make application more general. (table not renamed... yet)\r\n - renamed (shortened) method names\r\n - please compare to `ModUtil` similar functionality. much is just a copy/paste.\r\n - removed calls to `System::varValidate()`\r\n - removed calls to `static::convertModuleName()`\r\n\r\ncurrent usage (from a Controller):\r\n```php\r\n$this->container->get('zikula_core.common.helpers.extension_var')->set($this->name, 'test', 17);\r\n$testGet = $this->container->get('zikula_core.common.helpers.extension_var')->get($this->name, 'test');\r\necho $testGet; // 17\r\n```\r\n\r\n - We would likely add some shortcut methods to AbstractController and a Twig Extension to make this easier.\r\n - I considered moving this to the ExtensionsModule. I also think the Entity definition should be in the ExtensionsModule.\r\n\r\nplease discuss.\r\n@Guite @cmfcmf @Kaik @phaidon @shefik @nmpetkov @espaan","created_at":"2015-10-04T19:54:52Z","updated_at":"2015-10-05T11:24:45Z","closed_at":null,"merged_at":null,"merge_commit_sha":"40d07e7ff654c5e7d01866173f33548ecf2b33e6","assignee":null,"milestone":{"url":"https://api.github.com/repos/zikula/core/milestones/16","html_url":"https://github.com/zikula/core/milestones/1.4.1","labels_url":"https://api.github.com/repos/zikula/core/milestones/16/labels","id":959389,"number":16,"title":"1.4.1","description":"First service release for the 1.4.x series.","creator":{"login":"Guite","id":277531,"avatar_url":"https://avatars.githubusercontent.com/u/277531?v=3","gravatar_id":"","url":"https://api.github.com/users/Guite","html_url":"https://github.com/Guite","followers_url":"https://api.github.com/users/Guite/followers","following_url":"https://api.github.com/users/Guite/following{/other_user}","gists_url":"https://api.github.com/users/Guite/gists{/gist_id}","starred_url":"https://api.github.com/users/Guite/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Guite/subscriptions","organizations_url":"https://api.github.com/users/Guite/orgs","repos_url":"https://api.github.com/users/Guite/repos","events_url":"https://api.github.com/users/Guite/events{/privacy}","received_events_url":"https://api.github.com/users/Guite/received_events","type":"User","site_admin":false},"open_issues":55,"closed_issues":53,"state":"open","created_at":"2015-01-31T11:18:03Z","updated_at":"2015-10-04T19:54:52Z","due_on":"2015-11-20T05:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/zikula/core/pulls/2624/commits","review_comments_url":"https://api.github.com/repos/zikula/core/pulls/2624/comments","review_comment_url":"https://api.github.com/repos/zikula/core/pulls/comments{/number}","comments_url":"https://api.github.com/repos/zikula/core/issues/2624/comments","statuses_url":"https://api.github.com/repos/zikula/core/statuses/c6456add74596fd64d2c82800d869510f25b1349","head":{"label":"zikula:helpers","ref":"helpers","sha":"c6456add74596fd64d2c82800d869510f25b1349","user":{"login":"zikula","id":251211,"avatar_url":"https://avatars.githubusercontent.com/u/251211?v=3","gravatar_id":"","url":"https://api.github.com/users/zikula","html_url":"https://github.com/zikula","followers_url":"https://api.github.com/users/zikula/followers","following_url":"https://api.github.com/users/zikula/following{/other_user}","gists_url":"https://api.github.com/users/zikula/gists{/gist_id}","starred_url":"https://api.github.com/users/zikula/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zikula/subscriptions","organizations_url":"https://api.github.com/users/zikula/orgs","repos_url":"https://api.github.com/users/zikula/repos","events_url":"https://api.github.com/users/zikula/events{/privacy}","received_events_url":"https://api.github.com/users/zikula/received_events","type":"Organization","site_admin":false},"repo":{"id":781544,"name":"core","full_name":"zikula/core","owner":{"login":"zikula","id":251211,"avatar_url":"https://avatars.githubusercontent.com/u/251211?v=3","gravatar_id":"","url":"https://api.github.com/users/zikula","html_url":"https://github.com/zikula","followers_url":"https://api.github.com/users/zikula/followers","following_url":"https://api.github.com/users/zikula/following{/other_user}","gists_url":"https://api.github.com/users/zikula/gists{/gist_id}","starred_url":"https://api.github.com/users/zikula/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zikula/subscriptions","organizations_url":"https://api.github.com/users/zikula/orgs","repos_url":"https://api.github.com/users/zikula/repos","events_url":"https://api.github.com/users/zikula/events{/privacy}","received_events_url":"https://api.github.com/users/zikula/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/zikula/core","description":"Zikula Core Framework","fork":false,"url":"https://api.github.com/repos/zikula/core","forks_url":"https://api.github.com/repos/zikula/core/forks","keys_url":"https://api.github.com/repos/zikula/core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/zikula/core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/zikula/core/teams","hooks_url":"https://api.github.com/repos/zikula/core/hooks","issue_events_url":"https://api.github.com/repos/zikula/core/issues/events{/number}","events_url":"https://api.github.com/repos/zikula/core/events","assignees_url":"https://api.github.com/repos/zikula/core/assignees{/user}","branches_url":"https://api.github.com/repos/zikula/core/branches{/branch}","tags_url":"https://api.github.com/repos/zikula/core/tags","blobs_url":"https://api.github.com/repos/zikula/core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/zikula/core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/zikula/core/git/refs{/sha}","trees_url":"https://api.github.com/repos/zikula/core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/zikula/core/statuses/{sha}","languages_url":"https://api.github.com/repos/zikula/core/languages","stargazers_url":"https://api.github.com/repos/zikula/core/stargazers","contributors_url":"https://api.github.com/repos/zikula/core/contributors","subscribers_url":"https://api.github.com/repos/zikula/core/subscribers","subscription_url":"https://api.github.com/repos/zikula/core/subscription","commits_url":"https://api.github.com/repos/zikula/core/commits{/sha}","git_commits_url":"https://api.github.com/repos/zikula/core/git/commits{/sha}","comments_url":"https://api.github.com/repos/zikula/core/comments{/number}","issue_comment_url":"https://api.github.com/repos/zikula/core/issues/comments{/number}","contents_url":"https://api.github.com/repos/zikula/core/contents/{+path}","compare_url":"https://api.github.com/repos/zikula/core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/zikula/core/merges","archive_url":"https://api.github.com/repos/zikula/core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/zikula/core/downloads","issues_url":"https://api.github.com/repos/zikula/core/issues{/number}","pulls_url":"https://api.github.com/repos/zikula/core/pulls{/number}","milestones_url":"https://api.github.com/repos/zikula/core/milestones{/number}","notifications_url":"https://api.github.com/repos/zikula/core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/zikula/core/labels{/name}","releases_url":"https://api.github.com/repos/zikula/core/releases{/id}","created_at":"2010-07-18T10:35:53Z","updated_at":"2015-08-23T03:41:15Z","pushed_at":"2015-10-04T20:04:53Z","git_url":"git://github.com/zikula/core.git","ssh_url":"git@github.com:zikula/core.git","clone_url":"https://github.com/zikula/core.git","svn_url":"https://github.com/zikula/core","homepage":"http://zikula.org/","size":67493,"stargazers_count":164,"watchers_count":164,"language":"PHP","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":76,"mirror_url":null,"open_issues_count":158,"forks":76,"open_issues":158,"watchers":164,"default_branch":"1.4"}},"base":{"label":"zikula:1.4","ref":"1.4","sha":"00b21b0c459ba540965d933cb85bf1c8b6a4955f","user":{"login":"zikula","id":251211,"avatar_url":"https://avatars.githubusercontent.com/u/251211?v=3","gravatar_id":"","url":"https://api.github.com/users/zikula","html_url":"https://github.com/zikula","followers_url":"https://api.github.com/users/zikula/followers","following_url":"https://api.github.com/users/zikula/following{/other_user}","gists_url":"https://api.github.com/users/zikula/gists{/gist_id}","starred_url":"https://api.github.com/users/zikula/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zikula/subscriptions","organizations_url":"https://api.github.com/users/zikula/orgs","repos_url":"https://api.github.com/users/zikula/repos","events_url":"https://api.github.com/users/zikula/events{/privacy}","received_events_url":"https://api.github.com/users/zikula/received_events","type":"Organization","site_admin":false},"repo":{"id":781544,"name":"core","full_name":"zikula/core","owner":{"login":"zikula","id":251211,"avatar_url":"https://avatars.githubusercontent.com/u/251211?v=3","gravatar_id":"","url":"https://api.github.com/users/zikula","html_url":"https://github.com/zikula","followers_url":"https://api.github.com/users/zikula/followers","following_url":"https://api.github.com/users/zikula/following{/other_user}","gists_url":"https://api.github.com/users/zikula/gists{/gist_id}","starred_url":"https://api.github.com/users/zikula/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zikula/subscriptions","organizations_url":"https://api.github.com/users/zikula/orgs","repos_url":"https://api.github.com/users/zikula/repos","events_url":"https://api.github.com/users/zikula/events{/privacy}","received_events_url":"https://api.github.com/users/zikula/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/zikula/core","description":"Zikula Core Framework","fork":false,"url":"https://api.github.com/repos/zikula/core","forks_url":"https://api.github.com/repos/zikula/core/forks","keys_url":"https://api.github.com/repos/zikula/core/keys{/key_id}","collaborators_url":"https://api.github.com/repos/zikula/core/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/zikula/core/teams","hooks_url":"https://api.github.com/repos/zikula/core/hooks","issue_events_url":"https://api.github.com/repos/zikula/core/issues/events{/number}","events_url":"https://api.github.com/repos/zikula/core/events","assignees_url":"https://api.github.com/repos/zikula/core/assignees{/user}","branches_url":"https://api.github.com/repos/zikula/core/branches{/branch}","tags_url":"https://api.github.com/repos/zikula/core/tags","blobs_url":"https://api.github.com/repos/zikula/core/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/zikula/core/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/zikula/core/git/refs{/sha}","trees_url":"https://api.github.com/repos/zikula/core/git/trees{/sha}","statuses_url":"https://api.github.com/repos/zikula/core/statuses/{sha}","languages_url":"https://api.github.com/repos/zikula/core/languages","stargazers_url":"https://api.github.com/repos/zikula/core/stargazers","contributors_url":"https://api.github.com/repos/zikula/core/contributors","subscribers_url":"https://api.github.com/repos/zikula/core/subscribers","subscription_url":"https://api.github.com/repos/zikula/core/subscription","commits_url":"https://api.github.com/repos/zikula/core/commits{/sha}","git_commits_url":"https://api.github.com/repos/zikula/core/git/commits{/sha}","comments_url":"https://api.github.com/repos/zikula/core/comments{/number}","issue_comment_url":"https://api.github.com/repos/zikula/core/issues/comments{/number}","contents_url":"https://api.github.com/repos/zikula/core/contents/{+path}","compare_url":"https://api.github.com/repos/zikula/core/compare/{base}...{head}","merges_url":"https://api.github.com/repos/zikula/core/merges","archive_url":"https://api.github.com/repos/zikula/core/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/zikula/core/downloads","issues_url":"https://api.github.com/repos/zikula/core/issues{/number}","pulls_url":"https://api.github.com/repos/zikula/core/pulls{/number}","milestones_url":"https://api.github.com/repos/zikula/core/milestones{/number}","notifications_url":"https://api.github.com/repos/zikula/core/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/zikula/core/labels{/name}","releases_url":"https://api.github.com/repos/zikula/core/releases{/id}","created_at":"2010-07-18T10:35:53Z","updated_at":"2015-08-23T03:41:15Z","pushed_at":"2015-10-04T20:04:53Z","git_url":"git://github.com/zikula/core.git","ssh_url":"git@github.com:zikula/core.git","clone_url":"https://github.com/zikula/core.git","svn_url":"https://github.com/zikula/core","homepage":"http://zikula.org/","size":67493,"stargazers_count":164,"watchers_count":164,"language":"PHP","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":76,"mirror_url":null,"open_issues_count":158,"forks":76,"open_issues":158,"watchers":164,"default_branch":"1.4"}},"_links":{"self":{"href":"https://api.github.com/repos/zikula/core/pulls/2624"},"html":{"href":"https://github.com/zikula/core/pull/2624"},"issue":{"href":"https://api.github.com/repos/zikula/core/issues/2624"},"comments":{"href":"https://api.github.com/repos/zikula/core/issues/2624/comments"},"review_comments":{"href":"https://api.github.com/repos/zikula/core/pulls/2624/comments"},"review_comment":{"href":"https://api.github.com/repos/zikula/core/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/zikula/core/pulls/2624/commits"},"statuses":{"href":"https://api.github.com/repos/zikula/core/statuses/c6456add74596fd64d2c82800d869510f25b1349"}}}}