GitHub PullRequestReviewCommentEvent at 2014-11-24 16:16:32
Repository: sabre-vobject
Actor: evert
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/fruux/sabre-vobject/pulls/comments/20800184","id":20800184,"diff_hunk":"@@ -0,0 +1,225 @@\n+<?php\n+\n+namespace Sabre\\VObject\\Parser;\n+\n+use\n+    Sabre\\VObject\\Component\\VCalendar,\n+    Sabre\\VObject\\Component\\VCard,\n+    Sabre\\XML as SabreXML;\n+\n+/**\n+ * XML Parser.\n+ *\n+ * This parser parses both the xCal and xCard formats.\n+ *\n+ * @copyright Copyright (C) 2007-2014 fruux GmbH. All rights reserved.\n+ * @author Ivan Enderlin\n+ * @license http://sabre.io/license/ Modified BSD License\n+ */\n+class XML extends Parser {\n+\n+    const XCAL_NAMESPACE  = 'urn:ietf:params:xml:ns:icalendar-2.0';\n+    const XCARD_NAMESPACE = 'urn:ietf:params:xml:ns:vcard-4.0';\n+\n+    /**\n+     * The input data.\n+     *\n+     * @var array\n+     */\n+    protected $input;\n+\n+    /**\n+     * A pointer/reference to the input.\n+     *\n+     * @var array\n+     */\n+    private $pointer;\n+\n+    /**\n+     * Document, root component.\n+     *\n+     * @var Sabre\\VObject\\Document\n+     */\n+    protected $root;\n+\n+    /**\n+     * Parse xCal or xCard.\n+     *\n+     * @param resource|string $input\n+     * @param int|null $options\n+     */\n+    public function parse ( $input = null, $options = null ) {\n+\n+        if(!is_null($input))\n+            $this->setInput($input);\n+\n+        if(is_null($this->input))\n+            throw new EofException('End of input stream, or no input supplied');\n+\n+        if($this->input['name'] === '{' . self::XCAL_NAMESPACE . '}icalendar') {\n+\n+            $this->root = new VCalendar([], false);\n+            $this->pointer = &$this->input['value'][0];\n+            $this->parseVcalendarComponents($this->root, $options);\n+        }\n+        else\n+            throw new \\Exception('Arg');\n+\n+        return $this->root;\n+    }\n+\n+    /**\n+     * Parse a vCalendar.\n+     *\n+     * @param Sabre\\VObject\\Component $parentComponent\n+     * @param int|null $options\n+     */\n+    protected function parseVcalendarComponents ( $parentComponent, $options = null ) {\n+\n+        foreach($this->pointer['value'] as $children) {\n+\n+            switch(static::getTagName($children['name'])) {\n+\n+                case 'properties':\n+                    $xmlProperties = $children['value'];\n+\n+                    foreach($xmlProperties as $xmlProperty) {\n+\n+                        $propertyName       = static::getTagName($xmlProperty['name']);\n+                        $propertyValue      = [];\n+                        $propertyParameters = [];\n+                        $propertyType       = 'text';\n+\n+                        foreach($xmlProperty['value'] as $i => $xmlPropertyChild) {\n+\n+                            if('parameters' !== static::getTagName($xmlPropertyChild['name']))\n+                                continue;\n+\n+                            $xmlParameters = $xmlPropertyChild['value'];\n+\n+                            foreach($xmlParameters as $xmlParameter)\n+                                $propertyParameters[static::getTagName($xmlParameter['name'])]\n+                                    = $xmlParameter['value'][0]['value'];\n+\n+                            array_splice($xmlProperty['value'], $i, 1);\n+                        }\n+\n+                        switch($propertyName) {\n+\n+                            case 'geo':\n+                                $propertyType               = 'float';\n+                                $propertyValue['latitude']  = 0;\n+                                $propertyValue['longitude'] = 0;\n+\n+                                foreach($xmlProperty['value'] as $xmlRequestChild) {\n+\n+                                    $propertyValue[static::getTagName($xmlRequestChild['name'])]\n+                                        = $xmlRequestChild['value'];\n+                                }\n+                                break;\n+\n+                            case 'request-status':\n+                                $propertyType  = 'text';\n+\n+                                foreach($xmlProperty['value'] as $xmlRequestChild) {\n+\n+                                    $propertyValue[static::getTagName($xmlRequestChild['name'])]\n+                                        = $xmlRequestChild['value'];\n+                                }\n+                                break;\n+\n+                            case 'categories':\n+                            case 'resources':\n+                            case 'freebusy':\n+                            case 'exdate':\n+                            case 'rdate':\n+                                foreach($xmlProperty['value'] as $specialChild) {\n+\n+                                    $propertyValue[static::getTagName($specialChild['name'])]\n+                                        = $specialChild['value'];\n+                                }\n+                                break;\n+\n+                            default:\n+                                $propertyType  = static::getTagName($xmlProperty['value'][0]['name']);\n+                                $propertyValue = [$xmlProperty['value'][0]['value']];\n+                                break;\n+                        }\n+\n+                        $property = $this->root->createProperty(\n+                            $propertyName,\n+                            null,\n+                            $propertyParameters,\n+                            $propertyType\n+                        );\n+                        $parentComponent->add($property);\n+                        $property->setXmlValue($propertyValue);\n+                    }\n+                    break;\n+\n+                case 'components':\n+                    $components = $children['value'] ?: [];\n+\n+                    foreach($components as $component) {\n+\n+                        $componentName    = static::getTagName($component['name']);\n+                        $currentComponent = $this->root->createComponent(\n+                            $componentName\n+                        );\n+\n+                        $this->pointer = &$component;\n+                        $this->parseVcalendarComponents(\n+                            $currentComponent,\n+                            $options\n+                        );\n+\n+                        $parentComponent->add($currentComponent);\n+                    }\n+                    break;\n+\n+                default:\n+                    throw new \\Exception('Oops');\n+            }\n+        }\n+    }\n+\n+    /**\n+     * Sets the input data.\n+     *\n+     * @param resource|string $input\n+     * @return void\n+     */\n+    public function setInput ( $input ) {\n+\n+        if(is_resource($input))\n+            $input = stream_get_contents($input);\n+\n+        if(is_string($input)) {\n+\n+            $reader = new SabreXML\\Reader();\n+            $reader->elementMap['{' . self::XCAL_NAMESPACE . '}period']\n+                = 'Sabre\\VObject\\Parser\\XML\\Element\\KeyValue';\n+            $reader->elementMap['{' . self::XCAL_NAMESPACE . '}recur']\n+                = 'Sabre\\VObject\\Parser\\XML\\Element\\KeyValue';\n+            $reader->xml($input);\n+            $input  = $reader->parse();\n+        }\n+\n+        $this->input = $input;\n+\n+        return;\n+    }\n+\n+    /**\n+     * Get tag name from a Clark notation.\n+     *\n+     * @param string $clarkedTagName\n+     * @return string\n+     */\n+    static protected function getTagName ( $clarkedTagName ) {","path":"lib/Parser/XML.php","position":219,"original_position":219,"commit_id":"d0e4d19f63d0a8b2ce92adec5bad9cb0520312e9","original_commit_id":"d0e4d19f63d0a8b2ce92adec5bad9cb0520312e9","user":{"login":"evert","id":178960,"avatar_url":"https://avatars.githubusercontent.com/u/178960?v=3","gravatar_id":"","url":"https://api.github.com/users/evert","html_url":"https://github.com/evert","followers_url":"https://api.github.com/users/evert/followers","following_url":"https://api.github.com/users/evert/following{/other_user}","gists_url":"https://api.github.com/users/evert/gists{/gist_id}","starred_url":"https://api.github.com/users/evert/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/evert/subscriptions","organizations_url":"https://api.github.com/users/evert/orgs","repos_url":"https://api.github.com/users/evert/repos","events_url":"https://api.github.com/users/evert/events{/privacy}","received_events_url":"https://api.github.com/users/evert/received_events","type":"User","site_admin":false},"body":"Why is this static?","created_at":"2014-11-24T16:16:32Z","updated_at":"2014-11-24T16:16:32Z","html_url":"https://github.com/fruux/sabre-vobject/pull/160#discussion_r20800184","pull_request_url":"https://api.github.com/repos/fruux/sabre-vobject/pulls/160","_links":{"self":{"href":"https://api.github.com/repos/fruux/sabre-vobject/pulls/comments/20800184"},"html":{"href":"https://github.com/fruux/sabre-vobject/pull/160#discussion_r20800184"},"pull_request":{"href":"https://api.github.com/repos/fruux/sabre-vobject/pulls/160"}}},"pull_request":{"url":"https://api.github.com/repos/fruux/sabre-vobject/pulls/160","id":24356531,"html_url":"https://github.com/fruux/sabre-vobject/pull/160","diff_url":"https://github.com/fruux/sabre-vobject/pull/160.diff","patch_url":"https://github.com/fruux/sabre-vobject/pull/160.patch","issue_url":"https://api.github.com/repos/fruux/sabre-vobject/issues/160","number":160,"state":"open","locked":false,"title":"Implement xCal support","user":{"login":"Hywan","id":946104,"avatar_url":"https://avatars.githubusercontent.com/u/946104?v=3","gravatar_id":"","url":"https://api.github.com/users/Hywan","html_url":"https://github.com/Hywan","followers_url":"https://api.github.com/users/Hywan/followers","following_url":"https://api.github.com/users/Hywan/following{/other_user}","gists_url":"https://api.github.com/users/Hywan/gists{/gist_id}","starred_url":"https://api.github.com/users/Hywan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Hywan/subscriptions","organizations_url":"https://api.github.com/users/Hywan/orgs","repos_url":"https://api.github.com/users/Hywan/repos","events_url":"https://api.github.com/users/Hywan/events{/privacy}","received_events_url":"https://api.github.com/users/Hywan/received_events","type":"User","site_admin":false},"body":"Useful links:\r\n  * [RFC6321](https://tools.ietf.org/html/rfc6321), xCal: The XML Format for iCalendar.\r\n\r\nTo-do:\r\n  * [x] require sabre/xml,\r\n    * [x] update `composer.json`,\r\n    * [x] sabre/xml requires PHP5.4, hence update sabre/vobject (done by Composer?),\r\n      * [x] if requires PHP5.4, we can use the [`JsonSerializable`](http://php.net/jsonserializable) everywhere (all top-classes having a `jsonSerialize` method),\r\n      * [x] update code accordingly (e.g. short array syntax),\r\n      * [ ] update documentation accordingly,\r\n  * [x] create the helper in `Sabre\\VObject\\Reader`,\r\n  * [x] add XML serializer helpers everywhere (e.g. in children of `Sabre\\VObject\\Node`),\r\n  * [ ] timezones used by xCal and xCard are differents, must check the compatibility,\r\n  * [x] create the reader (parser):\r\n    * [x] support properties:\r\n        * [x] support all names,\r\n        * [x] support all values (types of values):\r\n          * [x] `binary`,\r\n          * [x] `boolean`,\r\n          * [x] `cal-address`,\r\n          * [x] `date`,\r\n          * [x] `date-time`,\r\n          * [x] `duration`,\r\n          * [x] `float`,\r\n          * [x] `integer`,\r\n          * [x] `period`,\r\n            * [x] `start`,\r\n            * [x] `duration`,\r\n            * [x] `end`,\r\n          * [x] `recur`,\r\n            * [x] `until`,\r\n            * [x] `count`,\r\n            * [x] `interval`,\r\n            * [x] `bysecond`,\r\n            * [x] `byminute`,\r\n            * [x] `byhour`,\r\n            * [x] `byday`,\r\n            * [x] `bymonthday`,\r\n            * [x] `byday`,\r\n            * [x] `byyearday`,\r\n            * [x] `byweekno`,\r\n            * [x] `bymonth`,\r\n            * [x] `bysetpos`,\r\n            * [x] `wkst`,\r\n            * [x] `freq`,\r\n          * [x] `text`,\r\n          * [x] `time`,\r\n          * [x] `uri`,\r\n          * [x] `utc-offset`,\r\n        * [x] support special cases:\r\n          * [x] `categories`,\r\n          * [x] `resources`,\r\n          * [x] `freebusy`,\r\n          * [x] `exdate`,\r\n          * [x] `rdate`,\r\n          * [x] `geo`,\r\n            * [x] `latitude`,\r\n            * [x] `longitude`,\r\n          * [x] `request-status`,\r\n            * [x] `code`,\r\n            * [x] `description`,\r\n        * [x] support all parameters:\r\n          * [x] support the specific `value` iCalendar parameter,\r\n    * [x] support all components:\r\n      * [x] `vevent`,\r\n      * [x] `vtodo`,\r\n      * [x] `vjournal`,\r\n      * [x] `vfreebusy`,\r\n      * [x] `vtimezone`,\r\n      * [x] `standard`,\r\n      * [x] `daylight`,\r\n      * [x] `valarm`,\r\n    * [x] support XML extensions.\r\n\r\nCode review:\r\n  * usage of iterators has been heighten (see https://github.com/fruux/sabre-vobject/pull/161),\r\n  * clean code (https://github.com/fruux/sabre-vobject/pull/162),\r\n  * better performance when possible (see https://github.com/fruux/sabre-vobject/pull/162).\r\n\r\n\r\nLeft apart for now:\r\n  * [x] [RFC6321, section 3.1. Pre-Processing](https://tools.ietf.org/html/rfc6321#section-3.1),\r\n  * [ ] `LIBXML_*` options when reading or writing.\r\n\r\nTo fix:\r\n  * [ ] `rdate`.","created_at":"2014-11-13T09:50:30Z","updated_at":"2014-11-24T16:16:32Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a643f73adf421243a9ddd0129a5328bbf6b6f181","assignee":{"login":"Hywan","id":946104,"avatar_url":"https://avatars.githubusercontent.com/u/946104?v=3","gravatar_id":"","url":"https://api.github.com/users/Hywan","html_url":"https://github.com/Hywan","followers_url":"https://api.github.com/users/Hywan/followers","following_url":"https://api.github.com/users/Hywan/following{/other_user}","gists_url":"https://api.github.com/users/Hywan/gists{/gist_id}","starred_url":"https://api.github.com/users/Hywan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Hywan/subscriptions","organizations_url":"https://api.github.com/users/Hywan/orgs","repos_url":"https://api.github.com/users/Hywan/repos","events_url":"https://api.github.com/users/Hywan/events{/privacy}","received_events_url":"https://api.github.com/users/Hywan/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/fruux/sabre-vobject/pulls/160/commits","review_comments_url":"https://api.github.com/repos/fruux/sabre-vobject/pulls/160/comments","review_comment_url":"https://api.github.com/repos/fruux/sabre-vobject/pulls/comments/{number}","comments_url":"https://api.github.com/repos/fruux/sabre-vobject/issues/160/comments","statuses_url":"https://api.github.com/repos/fruux/sabre-vobject/statuses/d0e4d19f63d0a8b2ce92adec5bad9cb0520312e9","head":{"label":"Hywan:xml","ref":"xml","sha":"d0e4d19f63d0a8b2ce92adec5bad9cb0520312e9","user":{"login":"Hywan","id":946104,"avatar_url":"https://avatars.githubusercontent.com/u/946104?v=3","gravatar_id":"","url":"https://api.github.com/users/Hywan","html_url":"https://github.com/Hywan","followers_url":"https://api.github.com/users/Hywan/followers","following_url":"https://api.github.com/users/Hywan/following{/other_user}","gists_url":"https://api.github.com/users/Hywan/gists{/gist_id}","starred_url":"https://api.github.com/users/Hywan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Hywan/subscriptions","organizations_url":"https://api.github.com/users/Hywan/orgs","repos_url":"https://api.github.com/users/Hywan/repos","events_url":"https://api.github.com/users/Hywan/events{/privacy}","received_events_url":"https://api.github.com/users/Hywan/received_events","type":"User","site_admin":false},"repo":{"id":26109482,"name":"sabre-vobject","full_name":"Hywan/sabre-vobject","owner":{"login":"Hywan","id":946104,"avatar_url":"https://avatars.githubusercontent.com/u/946104?v=3","gravatar_id":"","url":"https://api.github.com/users/Hywan","html_url":"https://github.com/Hywan","followers_url":"https://api.github.com/users/Hywan/followers","following_url":"https://api.github.com/users/Hywan/following{/other_user}","gists_url":"https://api.github.com/users/Hywan/gists{/gist_id}","starred_url":"https://api.github.com/users/Hywan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Hywan/subscriptions","organizations_url":"https://api.github.com/users/Hywan/orgs","repos_url":"https://api.github.com/users/Hywan/repos","events_url":"https://api.github.com/users/Hywan/events{/privacy}","received_events_url":"https://api.github.com/users/Hywan/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Hywan/sabre-vobject","description":"The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects","fork":true,"url":"https://api.github.com/repos/Hywan/sabre-vobject","forks_url":"https://api.github.com/repos/Hywan/sabre-vobject/forks","keys_url":"https://api.github.com/repos/Hywan/sabre-vobject/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Hywan/sabre-vobject/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Hywan/sabre-vobject/teams","hooks_url":"https://api.github.com/repos/Hywan/sabre-vobject/hooks","issue_events_url":"https://api.github.com/repos/Hywan/sabre-vobject/issues/events{/number}","events_url":"https://api.github.com/repos/Hywan/sabre-vobject/events","assignees_url":"https://api.github.com/repos/Hywan/sabre-vobject/assignees{/user}","branches_url":"https://api.github.com/repos/Hywan/sabre-vobject/branches{/branch}","tags_url":"https://api.github.com/repos/Hywan/sabre-vobject/tags","blobs_url":"https://api.github.com/repos/Hywan/sabre-vobject/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Hywan/sabre-vobject/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Hywan/sabre-vobject/git/refs{/sha}","trees_url":"https://api.github.com/repos/Hywan/sabre-vobject/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Hywan/sabre-vobject/statuses/{sha}","languages_url":"https://api.github.com/repos/Hywan/sabre-vobject/languages","stargazers_url":"https://api.github.com/repos/Hywan/sabre-vobject/stargazers","contributors_url":"https://api.github.com/repos/Hywan/sabre-vobject/contributors","subscribers_url":"https://api.github.com/repos/Hywan/sabre-vobject/subscribers","subscription_url":"https://api.github.com/repos/Hywan/sabre-vobject/subscription","commits_url":"https://api.github.com/repos/Hywan/sabre-vobject/commits{/sha}","git_commits_url":"https://api.github.com/repos/Hywan/sabre-vobject/git/commits{/sha}","comments_url":"https://api.github.com/repos/Hywan/sabre-vobject/comments{/number}","issue_comment_url":"https://api.github.com/repos/Hywan/sabre-vobject/issues/comments/{number}","contents_url":"https://api.github.com/repos/Hywan/sabre-vobject/contents/{+path}","compare_url":"https://api.github.com/repos/Hywan/sabre-vobject/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Hywan/sabre-vobject/merges","archive_url":"https://api.github.com/repos/Hywan/sabre-vobject/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Hywan/sabre-vobject/downloads","issues_url":"https://api.github.com/repos/Hywan/sabre-vobject/issues{/number}","pulls_url":"https://api.github.com/repos/Hywan/sabre-vobject/pulls{/number}","milestones_url":"https://api.github.com/repos/Hywan/sabre-vobject/milestones{/number}","notifications_url":"https://api.github.com/repos/Hywan/sabre-vobject/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Hywan/sabre-vobject/labels{/name}","releases_url":"https://api.github.com/repos/Hywan/sabre-vobject/releases{/id}","created_at":"2014-11-03T08:16:11Z","updated_at":"2014-10-23T22:28:23Z","pushed_at":"2014-11-24T14:26:21Z","git_url":"git://github.com/Hywan/sabre-vobject.git","ssh_url":"git@github.com:Hywan/sabre-vobject.git","clone_url":"https://github.com/Hywan/sabre-vobject.git","svn_url":"https://github.com/Hywan/sabre-vobject","homepage":"http://sabre.io/vobject/","size":2358,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"3.3"}},"base":{"label":"fruux:master","ref":"master","sha":"46f78ab7ac4f6f8e67599873b821e92dedabd566","user":{"login":"fruux","id":1384629,"avatar_url":"https://avatars.githubusercontent.com/u/1384629?v=3","gravatar_id":"","url":"https://api.github.com/users/fruux","html_url":"https://github.com/fruux","followers_url":"https://api.github.com/users/fruux/followers","following_url":"https://api.github.com/users/fruux/following{/other_user}","gists_url":"https://api.github.com/users/fruux/gists{/gist_id}","starred_url":"https://api.github.com/users/fruux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fruux/subscriptions","organizations_url":"https://api.github.com/users/fruux/orgs","repos_url":"https://api.github.com/users/fruux/repos","events_url":"https://api.github.com/users/fruux/events{/privacy}","received_events_url":"https://api.github.com/users/fruux/received_events","type":"Organization","site_admin":false},"repo":{"id":5299152,"name":"sabre-vobject","full_name":"fruux/sabre-vobject","owner":{"login":"fruux","id":1384629,"avatar_url":"https://avatars.githubusercontent.com/u/1384629?v=3","gravatar_id":"","url":"https://api.github.com/users/fruux","html_url":"https://github.com/fruux","followers_url":"https://api.github.com/users/fruux/followers","following_url":"https://api.github.com/users/fruux/following{/other_user}","gists_url":"https://api.github.com/users/fruux/gists{/gist_id}","starred_url":"https://api.github.com/users/fruux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fruux/subscriptions","organizations_url":"https://api.github.com/users/fruux/orgs","repos_url":"https://api.github.com/users/fruux/repos","events_url":"https://api.github.com/users/fruux/events{/privacy}","received_events_url":"https://api.github.com/users/fruux/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/fruux/sabre-vobject","description":"The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects","fork":false,"url":"https://api.github.com/repos/fruux/sabre-vobject","forks_url":"https://api.github.com/repos/fruux/sabre-vobject/forks","keys_url":"https://api.github.com/repos/fruux/sabre-vobject/keys{/key_id}","collaborators_url":"https://api.github.com/repos/fruux/sabre-vobject/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/fruux/sabre-vobject/teams","hooks_url":"https://api.github.com/repos/fruux/sabre-vobject/hooks","issue_events_url":"https://api.github.com/repos/fruux/sabre-vobject/issues/events{/number}","events_url":"https://api.github.com/repos/fruux/sabre-vobject/events","assignees_url":"https://api.github.com/repos/fruux/sabre-vobject/assignees{/user}","branches_url":"https://api.github.com/repos/fruux/sabre-vobject/branches{/branch}","tags_url":"https://api.github.com/repos/fruux/sabre-vobject/tags","blobs_url":"https://api.github.com/repos/fruux/sabre-vobject/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/fruux/sabre-vobject/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/fruux/sabre-vobject/git/refs{/sha}","trees_url":"https://api.github.com/repos/fruux/sabre-vobject/git/trees{/sha}","statuses_url":"https://api.github.com/repos/fruux/sabre-vobject/statuses/{sha}","languages_url":"https://api.github.com/repos/fruux/sabre-vobject/languages","stargazers_url":"https://api.github.com/repos/fruux/sabre-vobject/stargazers","contributors_url":"https://api.github.com/repos/fruux/sabre-vobject/contributors","subscribers_url":"https://api.github.com/repos/fruux/sabre-vobject/subscribers","subscription_url":"https://api.github.com/repos/fruux/sabre-vobject/subscription","commits_url":"https://api.github.com/repos/fruux/sabre-vobject/commits{/sha}","git_commits_url":"https://api.github.com/repos/fruux/sabre-vobject/git/commits{/sha}","comments_url":"https://api.github.com/repos/fruux/sabre-vobject/comments{/number}","issue_comment_url":"https://api.github.com/repos/fruux/sabre-vobject/issues/comments/{number}","contents_url":"https://api.github.com/repos/fruux/sabre-vobject/contents/{+path}","compare_url":"https://api.github.com/repos/fruux/sabre-vobject/compare/{base}...{head}","merges_url":"https://api.github.com/repos/fruux/sabre-vobject/merges","archive_url":"https://api.github.com/repos/fruux/sabre-vobject/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/fruux/sabre-vobject/downloads","issues_url":"https://api.github.com/repos/fruux/sabre-vobject/issues{/number}","pulls_url":"https://api.github.com/repos/fruux/sabre-vobject/pulls{/number}","milestones_url":"https://api.github.com/repos/fruux/sabre-vobject/milestones{/number}","notifications_url":"https://api.github.com/repos/fruux/sabre-vobject/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/fruux/sabre-vobject/labels{/name}","releases_url":"https://api.github.com/repos/fruux/sabre-vobject/releases{/id}","created_at":"2012-08-04T22:16:41Z","updated_at":"2014-11-19T22:15:35Z","pushed_at":"2014-11-19T22:48:43Z","git_url":"git://github.com/fruux/sabre-vobject.git","ssh_url":"git@github.com:fruux/sabre-vobject.git","clone_url":"https://github.com/fruux/sabre-vobject.git","svn_url":"https://github.com/fruux/sabre-vobject","homepage":"http://sabre.io/vobject/","size":6711,"stargazers_count":185,"watchers_count":185,"language":"PHP","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":38,"mirror_url":null,"open_issues_count":16,"forks":38,"open_issues":16,"watchers":185,"default_branch":"3.3"}},"_links":{"self":{"href":"https://api.github.com/repos/fruux/sabre-vobject/pulls/160"},"html":{"href":"https://github.com/fruux/sabre-vobject/pull/160"},"issue":{"href":"https://api.github.com/repos/fruux/sabre-vobject/issues/160"},"comments":{"href":"https://api.github.com/repos/fruux/sabre-vobject/issues/160/comments"},"review_comments":{"href":"https://api.github.com/repos/fruux/sabre-vobject/pulls/160/comments"},"review_comment":{"href":"https://api.github.com/repos/fruux/sabre-vobject/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/fruux/sabre-vobject/pulls/160/commits"},"statuses":{"href":"https://api.github.com/repos/fruux/sabre-vobject/statuses/d0e4d19f63d0a8b2ce92adec5bad9cb0520312e9"}}}}