{"action":"created","comment":{"url":"https://api.github.com/repos/dragoonis/fig-standards/pulls/comments/65866526","id":65866526,"diff_hunk":"@@ -0,0 +1,319 @@\n+Common Interface for Caching libraries\n+================\n+\n+This document describes a simple yet extensible interface for a cache item and\n+a cache driver.\n+\n+The key words \"MUST\", \"MUST NOT\", \"REQUIRED\", \"SHALL\", \"SHALL NOT\", \"SHOULD\",\n+\"SHOULD NOT\", \"RECOMMENDED\", \"MAY\", and \"OPTIONAL\" in this document are to be\n+interpreted as described in [RFC 2119][].\n+\n+The final implementations MAY decorate the objects with more\n+functionality than the one proposed but they MUST implement the indicated\n+interfaces/functionality first.\n+\n+[RFC 2119]: http://tools.ietf.org/html/rfc2119\n+\n+1. Specification\n+-----------------\n+\n+## 1.1 Introduction\n+\n+Caching is a common way to improve the performance of any project, making\n+caching libraries one of the most common features of many frameworks and\n+libraries. Interoperability at this level means libraries can drop their\n+own caching implementations and easily rely on the one given to them by the\n+framework, or another dedicated cache library.\n+\n+PSR-6 solves this problem already, but in a rather formal and verbose way for\n+what the most simple use cases need. This simpler approach aims to build a\n+standardized layer of simplicity on top of the existing PSR-6 interfaces.\n+\n+\n+### 1.2 Definitions\n+\n+Definitions for Calling Library, Implementing Library, TTL, Expiration and Key\n+are copied from PSR-6 as the same assumptions are true.\n+\n+*    **Calling Library** - The library or code that actually needs the cache\n+services. This library will utilize caching services that implement this\n+standard's interfaces, but will otherwise have no knowledge of the\n+implementation of those caching services.\n+\n+*    **Implementing Library** - This library is responsible for implementing\n+this standard in order to provide caching services to any Calling Library. The\n+Implementing Library MUST provide a class implementing the Psr\\SimpleCache\\CacheInterface interface.\n+Implementing Libraries MUST support at minimum TTL functionality as described\n+below with whole-second granularity.\n+\n+*    **TTL** - The Time To Live (TTL) of an item is the amount of time between\n+when that item is stored and it is considered stale. The TTL is normally defined\n+by an integer representing time in seconds, or a DateInterval object.\n+\n+*    **Expiration** - The actual time when an item is set to go stale. This it\n+typically calculated by adding the TTL to the time when an object is stored, but\n+may also be explicitly set with DateTime object.\n+\n+    An item with a 300 second TTL stored at 1:30:00 will have an expiration of\n+    1:35:00.\n+\n+    Implementing Libraries MAY expire an item before its requested Expiration Time,\n+but MUST treat an item as expired once its Expiration Time is reached. If a calling\n+library asks for an item to be saved but does not specify an expiration time, or\n+specifies a null expiration time or TTL, an Implementing Library MAY use a configured\n+default duration. If no default duration has been set, the Implementing Library\n+MUST interpret that as a request to cache the item forever, or for as long as the\n+underlying implementation supports.\n+\n+*    **Key** - A string of at least one character that uniquely identifies a\n+cached item. Implementing libraries MUST support keys consisting of the\n+characters `A-Z`, `a-z`, `0-9`, `_`, and `.` in any order in UTF-8 encoding and a\n+length of up to 64 characters. Implementing libraries MAY support additional\n+characters and encodings or longer lengths, but must support at least that\n+minimum.  Libraries are responsible for their own escaping of key strings\n+as appropriate, but MUST be able to return the original unmodified key string.\n+The following characters are reserved for future extensions and MUST NOT be\n+supported by implementing libraries: `{}()/\\@:`\n+\n+*    **Cache** - An object that implements the `Psr\\SimpleCache\\CacheInterface` interface.\n+\n+*    **Cache Misses** - A cache miss will return null and therefore detecting\n+if one stored null is not possible. This is the main deviation from PSR-6's\n+assumptions.\n+\n+\n+### 1.3 Cache\n+\n+Implementations MAY provide a mechanism for a user to specify a default TTL\n+if one is not specified for a specific cache item.  If no user-specified default\n+is provided implementations MUST default to the maximum legal value allowed by\n+the underlying implementation.  If the underlying implementation does not\n+support TTL, the user-specified TTL MUST be silently ignored.\n+\n+\n+2. Interfaces\n+-------------\n+\n+### 2.1 CacheInterface\n+\n+The cache interface provides the most basic functionality of cache servers which\n+entails basic reading, writing and deleting of single cache items.\n+\n+In addition it has methods for dealing with multiple sets of cache entries such as writing, reading or\n+deleting multiple cache entries at a time. This is useful when you have lots of cache reads/writes\n+to perform, and lets you perform your operations in a single call to the cache server cutting down latency\n+times dramatically.\n+\n+Finally for counters it provides the ability to increment and decrement a cache key\n+atomatically.\n+\n+```php\n+<?php\n+\n+namespace Psr\\SimpleCache;\n+\n+interface CacheInterface\n+{\n+    const TTL_MINUTE = 60;\n+    const TTL_HOUR = 3600;\n+    const TTL_DAY = 86400;\n+\n+    /**\n+     * Fetched a value from the cache.\n+     *\n+     * @param string $key The unique key of this item in the cache\n+     *\n+     * @return mixed The value of the item from the cache, or null in case of cache miss\n+     */\n+    public function get($key);\n+\n+    /**\n+     * Persist data in the cache, uniquely referenced by a key with an optional expiration TTL time.\n+     *\n+     * @param string $key The key of the item to store\n+     * @param mixed $value The value of the item to store\n+     * @param null|integer|DateInterval $ttl Optional. The TTL value of this item. If no value is sent and the driver supports TTL\n+     *                                       then the library may set a default value for it or let the driver take care of that.\n+     *\n+     * @return bool True on success and false on failure\n+     */\n+    public function set($key, $value, $ttl = null);\n+\n+    /**\n+     * Delete an item from the cache by its unique key\n+     *\n+     * @param string $key The unique cache key of the item to delete\n+     *\n+     * @return bool True on success and false on failure\n+     */\n+    public function delete($key);\n+\n+    /**\n+     * Wipe clean the entire cache's keys\n+     *\n+     * @return bool True on success and false on failure\n+     */\n+    public function clear();\n+\n+    /**\n+     * Obtain multiple cache items by their unique keys\n+     *\n+     * @param array|Traversable $keys A list of keys that can obtained in a single operation.\n+     *\n+     * @return array An array of key => value pairs. Cache keys that do not exist or are stale will have a value of null.\n+     */\n+    public function getMultiple($keys);\n+\n+    /**\n+     * Persisting a set of key => value pairs in the cache, with an optional TTL.\n+     *\n+     * @param array|Traversable         $items An array of key => value pairs for a multiple-set operation.\n+     * @param null|integer|DateInterval $ttl   Optional. The amount of seconds from the current time that the item will exist in the cache for.\n+     *                                         If this is null then the cache backend will fall back to its own default behaviour.\n+     *\n+     * @return bool True on success and false on failure\n+     */\n+    public function setMultiple($items, $ttl = null);\n+\n+    /**\n+     * Delete multiple cache items in a single operation\n+     *\n+     * @param array|Traversable $keys The array of string-based keys to be deleted\n+     *\n+     * @return bool True on success and false on failure\n+     */\n+    public function deleteMultiple($keys);\n+\n+    /**\n+     * Increment a value atomically in the cache by its step value, which defaults to 1\n+     *\n+     * @param string  $key  The cache item key\n+     * @param integer $step The value to increment by, defaulting to 1\n+     *\n+     * @return int|bool The new value on success and false on failure\n+     */\n+    public function increment($key, $step = 1);","path":"proposed/simplecache.md","position":195,"original_position":195,"commit_id":"0eded993c41ca91b7c2c4900b922aa30f7856de7","original_commit_id":"bf3214a0e0d771df266f719265d413f225100910","user":{"login":"Ocramius","id":154256,"avatar_url":"https://avatars.githubusercontent.com/u/154256?v=3","gravatar_id":"","url":"https://api.github.com/users/Ocramius","html_url":"https://github.com/Ocramius","followers_url":"https://api.github.com/users/Ocramius/followers","following_url":"https://api.github.com/users/Ocramius/following{/other_user}","gists_url":"https://api.github.com/users/Ocramius/gists{/gist_id}","starred_url":"https://api.github.com/users/Ocramius/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ocramius/subscriptions","organizations_url":"https://api.github.com/users/Ocramius/orgs","repos_url":"https://api.github.com/users/Ocramius/repos","events_url":"https://api.github.com/users/Ocramius/events{/privacy}","received_events_url":"https://api.github.com/users/Ocramius/received_events","type":"User","site_admin":false},"body":" > @Ocramius yes it needs to be atomic otherwise how do you trust a rate limiter or any counter under high load?\r\n\r\nWell, I wouldn't expect you to do them in PHP for sure :-P\r\nAlso, counting 100 or 102 is not a big problem with rate limiters, unless we are in a money-sensitive context (and then you need transactions anyway).\r\n\r\n > why bother with a SQL transaction?\r\n\r\nWhen rate limiting needs to be precise, then there is usually a strong reasoning in order for it to be precise. In scenarios where consistency is critical, relying on a cache seems to be a mistake, from my PoV.\r\n\r\nWith typical SQL RDBMSs, It can be done with a single statement (`UPSERT`, usually, but of course support for it isn't widespread), with implicit transactions.\r\n\r\nAnyway, this is going to be implemented in a likely non-atomic way in most adapters, implementation being what I pasted above, unless there are other 50000 lines around it handling concurrency:\r\n\r\n```php\r\n$cache->set('counter', ((int) $cache->get('counter')) + 1)\r\n```\r\n\r\n > It's just different backends for different purposes IMO.\r\n\r\nRight, and that's also my point here: counters are not the purpose of a cache. You can use a cache for counters by accepting its big limitations, or use a specific implementation (redis, in this case), if it needs to be an atomic operation.\r\n\r\nI know that you use this stuff for packagist, but is caching a precise number really so important that you'd want an atomic implementation as part of the interface? What kind of actual damage could dogpiling and race conditions cause in this scenario? And again, assuming the atomicity requirement is dropped, then why not just make it via the one-liner I just wrote (non atomic)?","created_at":"2016-06-06T10:10:04Z","updated_at":"2016-06-06T10:10:04Z","html_url":"https://github.com/dragoonis/fig-standards/pull/1#discussion_r65866526","pull_request_url":"https://api.github.com/repos/dragoonis/fig-standards/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/dragoonis/fig-standards/pulls/comments/65866526"},"html":{"href":"https://github.com/dragoonis/fig-standards/pull/1#discussion_r65866526"},"pull_request":{"href":"https://api.github.com/repos/dragoonis/fig-standards/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/dragoonis/fig-standards/pulls/1","id":71911270,"html_url":"https://github.com/dragoonis/fig-standards/pull/1","diff_url":"https://github.com/dragoonis/fig-standards/pull/1.diff","patch_url":"https://github.com/dragoonis/fig-standards/pull/1.patch","issue_url":"https://api.github.com/repos/dragoonis/fig-standards/issues/1","number":1,"state":"open","locked":false,"title":"PSR SimpleCache","user":{"login":"dragoonis","id":146321,"avatar_url":"https://avatars.githubusercontent.com/u/146321?v=3","gravatar_id":"","url":"https://api.github.com/users/dragoonis","html_url":"https://github.com/dragoonis","followers_url":"https://api.github.com/users/dragoonis/followers","following_url":"https://api.github.com/users/dragoonis/following{/other_user}","gists_url":"https://api.github.com/users/dragoonis/gists{/gist_id}","starred_url":"https://api.github.com/users/dragoonis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dragoonis/subscriptions","organizations_url":"https://api.github.com/users/dragoonis/orgs","repos_url":"https://api.github.com/users/dragoonis/repos","events_url":"https://api.github.com/users/dragoonis/events{/privacy}","received_events_url":"https://api.github.com/users/dragoonis/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-05-30T14:49:12Z","updated_at":"2016-06-06T10:10:04Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3a1b6047915220bad98a97589a06c18cfe83c179","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dragoonis/fig-standards/pulls/1/commits","review_comments_url":"https://api.github.com/repos/dragoonis/fig-standards/pulls/1/comments","review_comment_url":"https://api.github.com/repos/dragoonis/fig-standards/pulls/comments{/number}","comments_url":"https://api.github.com/repos/dragoonis/fig-standards/issues/1/comments","statuses_url":"https://api.github.com/repos/dragoonis/fig-standards/statuses/0eded993c41ca91b7c2c4900b922aa30f7856de7","head":{"label":"dragoonis:psr-simplecache","ref":"psr-simplecache","sha":"0eded993c41ca91b7c2c4900b922aa30f7856de7","user":{"login":"dragoonis","id":146321,"avatar_url":"https://avatars.githubusercontent.com/u/146321?v=3","gravatar_id":"","url":"https://api.github.com/users/dragoonis","html_url":"https://github.com/dragoonis","followers_url":"https://api.github.com/users/dragoonis/followers","following_url":"https://api.github.com/users/dragoonis/following{/other_user}","gists_url":"https://api.github.com/users/dragoonis/gists{/gist_id}","starred_url":"https://api.github.com/users/dragoonis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dragoonis/subscriptions","organizations_url":"https://api.github.com/users/dragoonis/orgs","repos_url":"https://api.github.com/users/dragoonis/repos","events_url":"https://api.github.com/users/dragoonis/events{/privacy}","received_events_url":"https://api.github.com/users/dragoonis/received_events","type":"User","site_admin":false},"repo":{"id":22970585,"name":"fig-standards","full_name":"dragoonis/fig-standards","owner":{"login":"dragoonis","id":146321,"avatar_url":"https://avatars.githubusercontent.com/u/146321?v=3","gravatar_id":"","url":"https://api.github.com/users/dragoonis","html_url":"https://github.com/dragoonis","followers_url":"https://api.github.com/users/dragoonis/followers","following_url":"https://api.github.com/users/dragoonis/following{/other_user}","gists_url":"https://api.github.com/users/dragoonis/gists{/gist_id}","starred_url":"https://api.github.com/users/dragoonis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dragoonis/subscriptions","organizations_url":"https://api.github.com/users/dragoonis/orgs","repos_url":"https://api.github.com/users/dragoonis/repos","events_url":"https://api.github.com/users/dragoonis/events{/privacy}","received_events_url":"https://api.github.com/users/dragoonis/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/dragoonis/fig-standards","description":"Standards either proposed or approved by the Framework Interop Group","fork":true,"url":"https://api.github.com/repos/dragoonis/fig-standards","forks_url":"https://api.github.com/repos/dragoonis/fig-standards/forks","keys_url":"https://api.github.com/repos/dragoonis/fig-standards/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dragoonis/fig-standards/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dragoonis/fig-standards/teams","hooks_url":"https://api.github.com/repos/dragoonis/fig-standards/hooks","issue_events_url":"https://api.github.com/repos/dragoonis/fig-standards/issues/events{/number}","events_url":"https://api.github.com/repos/dragoonis/fig-standards/events","assignees_url":"https://api.github.com/repos/dragoonis/fig-standards/assignees{/user}","branches_url":"https://api.github.com/repos/dragoonis/fig-standards/branches{/branch}","tags_url":"https://api.github.com/repos/dragoonis/fig-standards/tags","blobs_url":"https://api.github.com/repos/dragoonis/fig-standards/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dragoonis/fig-standards/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dragoonis/fig-standards/git/refs{/sha}","trees_url":"https://api.github.com/repos/dragoonis/fig-standards/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dragoonis/fig-standards/statuses/{sha}","languages_url":"https://api.github.com/repos/dragoonis/fig-standards/languages","stargazers_url":"https://api.github.com/repos/dragoonis/fig-standards/stargazers","contributors_url":"https://api.github.com/repos/dragoonis/fig-standards/contributors","subscribers_url":"https://api.github.com/repos/dragoonis/fig-standards/subscribers","subscription_url":"https://api.github.com/repos/dragoonis/fig-standards/subscription","commits_url":"https://api.github.com/repos/dragoonis/fig-standards/commits{/sha}","git_commits_url":"https://api.github.com/repos/dragoonis/fig-standards/git/commits{/sha}","comments_url":"https://api.github.com/repos/dragoonis/fig-standards/comments{/number}","issue_comment_url":"https://api.github.com/repos/dragoonis/fig-standards/issues/comments{/number}","contents_url":"https://api.github.com/repos/dragoonis/fig-standards/contents/{+path}","compare_url":"https://api.github.com/repos/dragoonis/fig-standards/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dragoonis/fig-standards/merges","archive_url":"https://api.github.com/repos/dragoonis/fig-standards/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dragoonis/fig-standards/downloads","issues_url":"https://api.github.com/repos/dragoonis/fig-standards/issues{/number}","pulls_url":"https://api.github.com/repos/dragoonis/fig-standards/pulls{/number}","milestones_url":"https://api.github.com/repos/dragoonis/fig-standards/milestones{/number}","notifications_url":"https://api.github.com/repos/dragoonis/fig-standards/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dragoonis/fig-standards/labels{/name}","releases_url":"https://api.github.com/repos/dragoonis/fig-standards/releases{/id}","deployments_url":"https://api.github.com/repos/dragoonis/fig-standards/deployments","created_at":"2014-08-14T22:26:38Z","updated_at":"2016-06-06T06:55:18Z","pushed_at":"2016-06-06T09:15:16Z","git_url":"git://github.com/dragoonis/fig-standards.git","ssh_url":"git@github.com:dragoonis/fig-standards.git","clone_url":"https://github.com/dragoonis/fig-standards.git","svn_url":"https://github.com/dragoonis/fig-standards","homepage":"http://www.php-fig.org/","size":2014,"stargazers_count":1,"watchers_count":1,"language":null,"has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":1,"default_branch":"master"}},"base":{"label":"dragoonis:master","ref":"master","sha":"16e29db3d08bc1b6a8ba66c8112ed0d0111245ed","user":{"login":"dragoonis","id":146321,"avatar_url":"https://avatars.githubusercontent.com/u/146321?v=3","gravatar_id":"","url":"https://api.github.com/users/dragoonis","html_url":"https://github.com/dragoonis","followers_url":"https://api.github.com/users/dragoonis/followers","following_url":"https://api.github.com/users/dragoonis/following{/other_user}","gists_url":"https://api.github.com/users/dragoonis/gists{/gist_id}","starred_url":"https://api.github.com/users/dragoonis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dragoonis/subscriptions","organizations_url":"https://api.github.com/users/dragoonis/orgs","repos_url":"https://api.github.com/users/dragoonis/repos","events_url":"https://api.github.com/users/dragoonis/events{/privacy}","received_events_url":"https://api.github.com/users/dragoonis/received_events","type":"User","site_admin":false},"repo":{"id":22970585,"name":"fig-standards","full_name":"dragoonis/fig-standards","owner":{"login":"dragoonis","id":146321,"avatar_url":"https://avatars.githubusercontent.com/u/146321?v=3","gravatar_id":"","url":"https://api.github.com/users/dragoonis","html_url":"https://github.com/dragoonis","followers_url":"https://api.github.com/users/dragoonis/followers","following_url":"https://api.github.com/users/dragoonis/following{/other_user}","gists_url":"https://api.github.com/users/dragoonis/gists{/gist_id}","starred_url":"https://api.github.com/users/dragoonis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dragoonis/subscriptions","organizations_url":"https://api.github.com/users/dragoonis/orgs","repos_url":"https://api.github.com/users/dragoonis/repos","events_url":"https://api.github.com/users/dragoonis/events{/privacy}","received_events_url":"https://api.github.com/users/dragoonis/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/dragoonis/fig-standards","description":"Standards either proposed or approved by the Framework Interop Group","fork":true,"url":"https://api.github.com/repos/dragoonis/fig-standards","forks_url":"https://api.github.com/repos/dragoonis/fig-standards/forks","keys_url":"https://api.github.com/repos/dragoonis/fig-standards/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dragoonis/fig-standards/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dragoonis/fig-standards/teams","hooks_url":"https://api.github.com/repos/dragoonis/fig-standards/hooks","issue_events_url":"https://api.github.com/repos/dragoonis/fig-standards/issues/events{/number}","events_url":"https://api.github.com/repos/dragoonis/fig-standards/events","assignees_url":"https://api.github.com/repos/dragoonis/fig-standards/assignees{/user}","branches_url":"https://api.github.com/repos/dragoonis/fig-standards/branches{/branch}","tags_url":"https://api.github.com/repos/dragoonis/fig-standards/tags","blobs_url":"https://api.github.com/repos/dragoonis/fig-standards/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dragoonis/fig-standards/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dragoonis/fig-standards/git/refs{/sha}","trees_url":"https://api.github.com/repos/dragoonis/fig-standards/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dragoonis/fig-standards/statuses/{sha}","languages_url":"https://api.github.com/repos/dragoonis/fig-standards/languages","stargazers_url":"https://api.github.com/repos/dragoonis/fig-standards/stargazers","contributors_url":"https://api.github.com/repos/dragoonis/fig-standards/contributors","subscribers_url":"https://api.github.com/repos/dragoonis/fig-standards/subscribers","subscription_url":"https://api.github.com/repos/dragoonis/fig-standards/subscription","commits_url":"https://api.github.com/repos/dragoonis/fig-standards/commits{/sha}","git_commits_url":"https://api.github.com/repos/dragoonis/fig-standards/git/commits{/sha}","comments_url":"https://api.github.com/repos/dragoonis/fig-standards/comments{/number}","issue_comment_url":"https://api.github.com/repos/dragoonis/fig-standards/issues/comments{/number}","contents_url":"https://api.github.com/repos/dragoonis/fig-standards/contents/{+path}","compare_url":"https://api.github.com/repos/dragoonis/fig-standards/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dragoonis/fig-standards/merges","archive_url":"https://api.github.com/repos/dragoonis/fig-standards/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dragoonis/fig-standards/downloads","issues_url":"https://api.github.com/repos/dragoonis/fig-standards/issues{/number}","pulls_url":"https://api.github.com/repos/dragoonis/fig-standards/pulls{/number}","milestones_url":"https://api.github.com/repos/dragoonis/fig-standards/milestones{/number}","notifications_url":"https://api.github.com/repos/dragoonis/fig-standards/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dragoonis/fig-standards/labels{/name}","releases_url":"https://api.github.com/repos/dragoonis/fig-standards/releases{/id}","deployments_url":"https://api.github.com/repos/dragoonis/fig-standards/deployments","created_at":"2014-08-14T22:26:38Z","updated_at":"2016-06-06T06:55:18Z","pushed_at":"2016-06-06T09:15:16Z","git_url":"git://github.com/dragoonis/fig-standards.git","ssh_url":"git@github.com:dragoonis/fig-standards.git","clone_url":"https://github.com/dragoonis/fig-standards.git","svn_url":"https://github.com/dragoonis/fig-standards","homepage":"http://www.php-fig.org/","size":2014,"stargazers_count":1,"watchers_count":1,"language":null,"has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dragoonis/fig-standards/pulls/1"},"html":{"href":"https://github.com/dragoonis/fig-standards/pull/1"},"issue":{"href":"https://api.github.com/repos/dragoonis/fig-standards/issues/1"},"comments":{"href":"https://api.github.com/repos/dragoonis/fig-standards/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/dragoonis/fig-standards/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/dragoonis/fig-standards/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/dragoonis/fig-standards/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/dragoonis/fig-standards/statuses/0eded993c41ca91b7c2c4900b922aa30f7856de7"}}}}
{"actor":{"display_login":"Ocramius"}}