{"action":"created","comment":{"url":"https://api.github.com/repos/prooph/event-sourcing/pulls/comments/85178951","pull_request_review_id":5905418,"id":85178951,"diff_hunk":"@@ -0,0 +1,297 @@\n+<?php\n+/**\n+ * This file is part of the prooph/event-sourcing.\n+ * (c) 2014-2016 prooph software GmbH <contact@prooph.de>\n+ * (c) 2015-2016 Sascha-Oliver Prolic <saschaprolic@googlemail.com>\n+ *\n+ * For the full copyright and license information, please view the LICENSE\n+ * file that was distributed with this source code.\n+ */\n+\n+declare(strict_types=1);\n+\n+namespace Prooph\\EventSourcing\\Aggregate;\n+\n+use Assert\\Assertion;\n+use Iterator;\n+use Prooph\\Common\\Messaging\\Message;\n+use Prooph\\EventSourcing\\Aggregate\\Exception\\AggregateTranslationFailedException;\n+use Prooph\\EventStore\\Util\\MapIterator;\n+\n+/**\n+ * Class ConfigurableAggregateTranslator\n+ *\n+ * @package Prooph\\EventSourcing\\Aggregate\n+ * @author Alexander Miertsch <contact@prooph.de>\n+ */\n+class ConfigurableAggregateTranslator implements AggregateTranslator\n+{\n+    /**\n+     * @var string\n+     */\n+    private $versionMethodName = 'getVersion';\n+\n+    /**\n+     * @var string\n+     */\n+    private $identifierMethodName = 'getId';\n+\n+    /**\n+     * @var string\n+     */\n+    private $popRecordedEventsMethodName = 'popRecordedEvents';\n+\n+    /**\n+     * @var string\n+     */\n+    private $replayEventsMethodName = 'replay';\n+\n+    /**\n+     * @var string\n+     */\n+    private $staticReconstituteFromHistoryMethodName = 'reconstituteFromHistory';\n+\n+    /**\n+     * @var null|callable\n+     */\n+    private $eventToMessageCallback = null;\n+\n+    /**\n+     * @var null|callable\n+     */\n+    private $messageToEventCallback = null;\n+\n+    public function __construct(\n+        string $identifierMethodName = null,\n+        string $versionMethodName = null,\n+        string $popRecordedEventsMethodName = null,\n+        string $replayEventsMethodsName = null,\n+        string $staticReconstituteFromHistoryMethodName = null,\n+        callable $eventToMessageCallback = null,\n+        callable $messageToEventCallback = null\n+    ) {\n+        if (null !== $identifierMethodName) {\n+            Assertion::minLength($identifierMethodName, 1, 'Identifier method name needs to be a non empty string');\n+            $this->identifierMethodName = $identifierMethodName;\n+        }\n+\n+        if (null !== $versionMethodName) {\n+            Assertion::minLength($versionMethodName, 1, 'Version method name needs to be a non empty string');\n+            $this->versionMethodName = $versionMethodName;\n+        }\n+\n+        if (null !== $popRecordedEventsMethodName) {\n+            Assertion::minLength($popRecordedEventsMethodName, 1, 'Pop recorded events method name needs to be a non empty string');\n+            $this->popRecordedEventsMethodName = $popRecordedEventsMethodName;\n+        }\n+\n+        if (null !== $replayEventsMethodsName) {\n+            Assertion::minLength($replayEventsMethodsName, 1, 'Replay events method name needs to be a non empty string');\n+            $this->replayEventsMethodName = $replayEventsMethodsName;\n+        }\n+\n+        if (null !== $staticReconstituteFromHistoryMethodName) {\n+            Assertion::minLength($staticReconstituteFromHistoryMethodName, 1, 'Method name for static method reconstitute from history needs to be non empty string');\n+            $this->staticReconstituteFromHistoryMethodName = $staticReconstituteFromHistoryMethodName;\n+        }\n+\n+        if (null !== $eventToMessageCallback) {\n+            $this->eventToMessageCallback = $eventToMessageCallback;\n+        }\n+\n+        if (null !== $messageToEventCallback) {\n+            $this->messageToEventCallback = $messageToEventCallback;\n+        }\n+    }\n+\n+    /**\n+     * @param object $eventSourcedAggregateRoot\n+     *\n+     * @return string\n+     *\n+     * @throws Exception\\AggregateTranslationFailedException\n+     */\n+    public function extractAggregateId($eventSourcedAggregateRoot): string\n+    {\n+        if (! method_exists($eventSourcedAggregateRoot, $this->identifierMethodName)) {\n+            throw new AggregateTranslationFailedException(\n+                sprintf(\n+                    'Required method %s does not exist for aggregate %s',\n+                    $this->identifierMethodName,\n+                    get_class($eventSourcedAggregateRoot)\n+                )\n+            );\n+        }\n+\n+        return (string)$eventSourcedAggregateRoot->{$this->identifierMethodName}();\n+    }\n+\n+    /**\n+     * @param object $eventSourcedAggregateRoot\n+     *\n+     * @return int\n+     */\n+    public function extractAggregateVersion($eventSourcedAggregateRoot): int\n+    {\n+        if (! method_exists($eventSourcedAggregateRoot, $this->versionMethodName)) {\n+            throw new AggregateTranslationFailedException(\n+                sprintf(\n+                    'Required method %s does not exist for aggregate %s',\n+                    $this->versionMethodName,\n+                    get_class($eventSourcedAggregateRoot)\n+                )\n+            );\n+        }\n+\n+        return (int) $eventSourcedAggregateRoot->{$this->versionMethodName}();\n+    }\n+\n+    /**\n+     * @param AggregateType $aggregateType\n+     * @param Iterator $historyEvents\n+     *\n+     * @return object reconstructed EventSourcedAggregateRoot\n+     *\n+     * @throws Exception\\AggregateTranslationFailedException\n+     */\n+    public function reconstituteAggregateFromHistory(AggregateType $aggregateType, Iterator $historyEvents)\n+    {\n+        if ($this->messageToEventCallback) {\n+            $historyEvents = new MapIterator($historyEvents, $this->messageToEventCallback);\n+        }\n+\n+        $aggregateClass = $aggregateType->toString();\n+\n+        if (! class_exists($aggregateClass)) {\n+            throw new AggregateTranslationFailedException(\n+                sprintf(\n+                    'Can not reconstitute aggregate of type %s. Class was not found',\n+                    $aggregateClass\n+                )\n+            );\n+        }\n+\n+        if (! method_exists($aggregateClass, $this->staticReconstituteFromHistoryMethodName)) {\n+            throw new AggregateTranslationFailedException(\n+                sprintf(\n+                    'Cannot reconstitute aggregate of type %s. Class is missing a static %s method!',\n+                    $aggregateClass,\n+                    $this->staticReconstituteFromHistoryMethodName\n+                )\n+            );\n+        }\n+\n+        $method = $this->staticReconstituteFromHistoryMethodName;\n+\n+        $aggregate = $aggregateClass::$method($historyEvents);\n+\n+        if (! $aggregate instanceof $aggregateClass) {\n+            throw new AggregateTranslationFailedException(\n+                sprintf(\n+                    'Failed to reconstitute aggregate of type %s. Static method %s does not return an instance of the aggregate type!',\n+                    $aggregateClass,\n+                    $this->staticReconstituteFromHistoryMethodName\n+                )\n+            );\n+        }\n+\n+        return $aggregate;\n+    }\n+\n+    /**\n+     * @param object $eventSourcedAggregateRoot\n+     *\n+     * @return Message[]\n+     *\n+     * @throws Exception\\AggregateTranslationFailedException\n+     */\n+    public function extractPendingStreamEvents($eventSourcedAggregateRoot): array\n+    {\n+        if (! is_object($eventSourcedAggregateRoot)) {\n+            throw new AggregateTranslationFailedException('Event sourced Aggregate Root needs to be an object. Got ' . gettype($eventSourcedAggregateRoot));\n+        }\n+\n+        if (! method_exists($eventSourcedAggregateRoot, $this->popRecordedEventsMethodName)) {\n+            throw new AggregateTranslationFailedException(\n+                sprintf(\n+                    'Can not pop recorded events from aggregate root %s. The AR is missing a method with name %s!',\n+                    get_class($eventSourcedAggregateRoot),\n+                    $this->popRecordedEventsMethodName\n+                )\n+            );\n+        }\n+\n+        $recordedEvents = $eventSourcedAggregateRoot->{$this->popRecordedEventsMethodName}();\n+\n+        if (! is_array($recordedEvents) && ! $recordedEvents instanceof \\Traversable) {","path":"src/Aggregate/ConfigurableAggregateTranslator.php","position":226,"original_position":226,"commit_id":"3494da71c97c35a3e3d118397988248dcd24bc86","original_commit_id":"3494da71c97c35a3e3d118397988248dcd24bc86","user":{"login":"oqq","id":7161145,"avatar_url":"https://avatars.githubusercontent.com/u/7161145?v=3","gravatar_id":"","url":"https://api.github.com/users/oqq","html_url":"https://github.com/oqq","followers_url":"https://api.github.com/users/oqq/followers","following_url":"https://api.github.com/users/oqq/following{/other_user}","gists_url":"https://api.github.com/users/oqq/gists{/gist_id}","starred_url":"https://api.github.com/users/oqq/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oqq/subscriptions","organizations_url":"https://api.github.com/users/oqq/orgs","repos_url":"https://api.github.com/users/oqq/repos","events_url":"https://api.github.com/users/oqq/events{/privacy}","received_events_url":"https://api.github.com/users/oqq/received_events","type":"User","site_admin":false},"body":"How about to use the new is_iterable function?","created_at":"2016-10-26T17:41:15Z","updated_at":"2016-10-26T17:41:15Z","html_url":"https://github.com/prooph/event-sourcing/pull/31#discussion_r85178951","pull_request_url":"https://api.github.com/repos/prooph/event-sourcing/pulls/31","_links":{"self":{"href":"https://api.github.com/repos/prooph/event-sourcing/pulls/comments/85178951"},"html":{"href":"https://github.com/prooph/event-sourcing/pull/31#discussion_r85178951"},"pull_request":{"href":"https://api.github.com/repos/prooph/event-sourcing/pulls/31"}}},"pull_request":{"url":"https://api.github.com/repos/prooph/event-sourcing/pulls/31","id":88272377,"html_url":"https://github.com/prooph/event-sourcing/pull/31","diff_url":"https://github.com/prooph/event-sourcing/pull/31.diff","patch_url":"https://github.com/prooph/event-sourcing/pull/31.patch","issue_url":"https://api.github.com/repos/prooph/event-sourcing/issues/31","number":31,"state":"open","locked":false,"title":"Support for PHP 7.1","user":{"login":"prolic","id":394428,"avatar_url":"https://avatars.githubusercontent.com/u/394428?v=3","gravatar_id":"","url":"https://api.github.com/users/prolic","html_url":"https://github.com/prolic","followers_url":"https://api.github.com/users/prolic/followers","following_url":"https://api.github.com/users/prolic/following{/other_user}","gists_url":"https://api.github.com/users/prolic/gists{/gist_id}","starred_url":"https://api.github.com/users/prolic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prolic/subscriptions","organizations_url":"https://api.github.com/users/prolic/orgs","repos_url":"https://api.github.com/users/prolic/repos","events_url":"https://api.github.com/users/prolic/events{/privacy}","received_events_url":"https://api.github.com/users/prolic/received_events","type":"User","site_admin":false},"body":"- Support for PHP 7.1\r\n- uses develop branch of prooph/common branch (\"prooph/common\" : \"dev-develop as 4.0\")\r\n- uses develop branch of prooph/event-store branch (\"prooph/event-store\" : \"dev-develop as 7.0\")\r\n- add snapshot namespace (moved from event-store)\r\n- add aggregate namespace (moved from event-store)\r\n- add docheader\r\n- update copyright","created_at":"2016-10-06T14:26:05Z","updated_at":"2016-10-26T17:50:17Z","closed_at":null,"merged_at":null,"merge_commit_sha":"31a34444ca15fc087913d027cce6bdc7c6b35e0d","assignee":{"login":"codeliner","id":5131987,"avatar_url":"https://avatars.githubusercontent.com/u/5131987?v=3","gravatar_id":"","url":"https://api.github.com/users/codeliner","html_url":"https://github.com/codeliner","followers_url":"https://api.github.com/users/codeliner/followers","following_url":"https://api.github.com/users/codeliner/following{/other_user}","gists_url":"https://api.github.com/users/codeliner/gists{/gist_id}","starred_url":"https://api.github.com/users/codeliner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/codeliner/subscriptions","organizations_url":"https://api.github.com/users/codeliner/orgs","repos_url":"https://api.github.com/users/codeliner/repos","events_url":"https://api.github.com/users/codeliner/events{/privacy}","received_events_url":"https://api.github.com/users/codeliner/received_events","type":"User","site_admin":false},"assignees":[{"login":"codeliner","id":5131987,"avatar_url":"https://avatars.githubusercontent.com/u/5131987?v=3","gravatar_id":"","url":"https://api.github.com/users/codeliner","html_url":"https://github.com/codeliner","followers_url":"https://api.github.com/users/codeliner/followers","following_url":"https://api.github.com/users/codeliner/following{/other_user}","gists_url":"https://api.github.com/users/codeliner/gists{/gist_id}","starred_url":"https://api.github.com/users/codeliner/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/codeliner/subscriptions","organizations_url":"https://api.github.com/users/codeliner/orgs","repos_url":"https://api.github.com/users/codeliner/repos","events_url":"https://api.github.com/users/codeliner/events{/privacy}","received_events_url":"https://api.github.com/users/codeliner/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/prooph/event-sourcing/milestones/2","html_url":"https://github.com/prooph/event-sourcing/milestones/5.0%20Release","labels_url":"https://api.github.com/repos/prooph/event-sourcing/milestones/2/labels","id":2052242,"number":2,"title":"5.0 Release","description":"","creator":{"login":"prolic","id":394428,"avatar_url":"https://avatars.githubusercontent.com/u/394428?v=3","gravatar_id":"","url":"https://api.github.com/users/prolic","html_url":"https://github.com/prolic","followers_url":"https://api.github.com/users/prolic/followers","following_url":"https://api.github.com/users/prolic/following{/other_user}","gists_url":"https://api.github.com/users/prolic/gists{/gist_id}","starred_url":"https://api.github.com/users/prolic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prolic/subscriptions","organizations_url":"https://api.github.com/users/prolic/orgs","repos_url":"https://api.github.com/users/prolic/repos","events_url":"https://api.github.com/users/prolic/events{/privacy}","received_events_url":"https://api.github.com/users/prolic/received_events","type":"User","site_admin":false},"open_issues":1,"closed_issues":0,"state":"open","created_at":"2016-10-06T13:25:39Z","updated_at":"2016-10-06T14:26:05Z","due_on":"2016-12-01T00:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/prooph/event-sourcing/pulls/31/commits","review_comments_url":"https://api.github.com/repos/prooph/event-sourcing/pulls/31/comments","review_comment_url":"https://api.github.com/repos/prooph/event-sourcing/pulls/comments{/number}","comments_url":"https://api.github.com/repos/prooph/event-sourcing/issues/31/comments","statuses_url":"https://api.github.com/repos/prooph/event-sourcing/statuses/3494da71c97c35a3e3d118397988248dcd24bc86","head":{"label":"prooph:php_7_1","ref":"php_7_1","sha":"3494da71c97c35a3e3d118397988248dcd24bc86","user":{"login":"prooph","id":7341005,"avatar_url":"https://avatars.githubusercontent.com/u/7341005?v=3","gravatar_id":"","url":"https://api.github.com/users/prooph","html_url":"https://github.com/prooph","followers_url":"https://api.github.com/users/prooph/followers","following_url":"https://api.github.com/users/prooph/following{/other_user}","gists_url":"https://api.github.com/users/prooph/gists{/gist_id}","starred_url":"https://api.github.com/users/prooph/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prooph/subscriptions","organizations_url":"https://api.github.com/users/prooph/orgs","repos_url":"https://api.github.com/users/prooph/repos","events_url":"https://api.github.com/users/prooph/events{/privacy}","received_events_url":"https://api.github.com/users/prooph/received_events","type":"Organization","site_admin":false},"repo":{"id":20577623,"name":"event-sourcing","full_name":"prooph/event-sourcing","owner":{"login":"prooph","id":7341005,"avatar_url":"https://avatars.githubusercontent.com/u/7341005?v=3","gravatar_id":"","url":"https://api.github.com/users/prooph","html_url":"https://github.com/prooph","followers_url":"https://api.github.com/users/prooph/followers","following_url":"https://api.github.com/users/prooph/following{/other_user}","gists_url":"https://api.github.com/users/prooph/gists{/gist_id}","starred_url":"https://api.github.com/users/prooph/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prooph/subscriptions","organizations_url":"https://api.github.com/users/prooph/orgs","repos_url":"https://api.github.com/users/prooph/repos","events_url":"https://api.github.com/users/prooph/events{/privacy}","received_events_url":"https://api.github.com/users/prooph/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/prooph/event-sourcing","description":"Provides basic functionality for event sourced aggregates.","fork":false,"url":"https://api.github.com/repos/prooph/event-sourcing","forks_url":"https://api.github.com/repos/prooph/event-sourcing/forks","keys_url":"https://api.github.com/repos/prooph/event-sourcing/keys{/key_id}","collaborators_url":"https://api.github.com/repos/prooph/event-sourcing/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/prooph/event-sourcing/teams","hooks_url":"https://api.github.com/repos/prooph/event-sourcing/hooks","issue_events_url":"https://api.github.com/repos/prooph/event-sourcing/issues/events{/number}","events_url":"https://api.github.com/repos/prooph/event-sourcing/events","assignees_url":"https://api.github.com/repos/prooph/event-sourcing/assignees{/user}","branches_url":"https://api.github.com/repos/prooph/event-sourcing/branches{/branch}","tags_url":"https://api.github.com/repos/prooph/event-sourcing/tags","blobs_url":"https://api.github.com/repos/prooph/event-sourcing/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/prooph/event-sourcing/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/prooph/event-sourcing/git/refs{/sha}","trees_url":"https://api.github.com/repos/prooph/event-sourcing/git/trees{/sha}","statuses_url":"https://api.github.com/repos/prooph/event-sourcing/statuses/{sha}","languages_url":"https://api.github.com/repos/prooph/event-sourcing/languages","stargazers_url":"https://api.github.com/repos/prooph/event-sourcing/stargazers","contributors_url":"https://api.github.com/repos/prooph/event-sourcing/contributors","subscribers_url":"https://api.github.com/repos/prooph/event-sourcing/subscribers","subscription_url":"https://api.github.com/repos/prooph/event-sourcing/subscription","commits_url":"https://api.github.com/repos/prooph/event-sourcing/commits{/sha}","git_commits_url":"https://api.github.com/repos/prooph/event-sourcing/git/commits{/sha}","comments_url":"https://api.github.com/repos/prooph/event-sourcing/comments{/number}","issue_comment_url":"https://api.github.com/repos/prooph/event-sourcing/issues/comments{/number}","contents_url":"https://api.github.com/repos/prooph/event-sourcing/contents/{+path}","compare_url":"https://api.github.com/repos/prooph/event-sourcing/compare/{base}...{head}","merges_url":"https://api.github.com/repos/prooph/event-sourcing/merges","archive_url":"https://api.github.com/repos/prooph/event-sourcing/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/prooph/event-sourcing/downloads","issues_url":"https://api.github.com/repos/prooph/event-sourcing/issues{/number}","pulls_url":"https://api.github.com/repos/prooph/event-sourcing/pulls{/number}","milestones_url":"https://api.github.com/repos/prooph/event-sourcing/milestones{/number}","notifications_url":"https://api.github.com/repos/prooph/event-sourcing/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/prooph/event-sourcing/labels{/name}","releases_url":"https://api.github.com/repos/prooph/event-sourcing/releases{/id}","deployments_url":"https://api.github.com/repos/prooph/event-sourcing/deployments","created_at":"2014-06-06T20:44:06Z","updated_at":"2016-09-09T07:19:10Z","pushed_at":"2016-10-26T12:45:03Z","git_url":"git://github.com/prooph/event-sourcing.git","ssh_url":"git@github.com:prooph/event-sourcing.git","clone_url":"https://github.com/prooph/event-sourcing.git","svn_url":"https://github.com/prooph/event-sourcing","homepage":"http://getprooph.org","size":160,"stargazers_count":45,"watchers_count":45,"language":"PHP","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8,"mirror_url":null,"open_issues_count":1,"forks":8,"open_issues":1,"watchers":45,"default_branch":"master"}},"base":{"label":"prooph:develop","ref":"develop","sha":"d7194205e2479a2d2493a9214f5b330298500812","user":{"login":"prooph","id":7341005,"avatar_url":"https://avatars.githubusercontent.com/u/7341005?v=3","gravatar_id":"","url":"https://api.github.com/users/prooph","html_url":"https://github.com/prooph","followers_url":"https://api.github.com/users/prooph/followers","following_url":"https://api.github.com/users/prooph/following{/other_user}","gists_url":"https://api.github.com/users/prooph/gists{/gist_id}","starred_url":"https://api.github.com/users/prooph/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prooph/subscriptions","organizations_url":"https://api.github.com/users/prooph/orgs","repos_url":"https://api.github.com/users/prooph/repos","events_url":"https://api.github.com/users/prooph/events{/privacy}","received_events_url":"https://api.github.com/users/prooph/received_events","type":"Organization","site_admin":false},"repo":{"id":20577623,"name":"event-sourcing","full_name":"prooph/event-sourcing","owner":{"login":"prooph","id":7341005,"avatar_url":"https://avatars.githubusercontent.com/u/7341005?v=3","gravatar_id":"","url":"https://api.github.com/users/prooph","html_url":"https://github.com/prooph","followers_url":"https://api.github.com/users/prooph/followers","following_url":"https://api.github.com/users/prooph/following{/other_user}","gists_url":"https://api.github.com/users/prooph/gists{/gist_id}","starred_url":"https://api.github.com/users/prooph/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prooph/subscriptions","organizations_url":"https://api.github.com/users/prooph/orgs","repos_url":"https://api.github.com/users/prooph/repos","events_url":"https://api.github.com/users/prooph/events{/privacy}","received_events_url":"https://api.github.com/users/prooph/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/prooph/event-sourcing","description":"Provides basic functionality for event sourced aggregates.","fork":false,"url":"https://api.github.com/repos/prooph/event-sourcing","forks_url":"https://api.github.com/repos/prooph/event-sourcing/forks","keys_url":"https://api.github.com/repos/prooph/event-sourcing/keys{/key_id}","collaborators_url":"https://api.github.com/repos/prooph/event-sourcing/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/prooph/event-sourcing/teams","hooks_url":"https://api.github.com/repos/prooph/event-sourcing/hooks","issue_events_url":"https://api.github.com/repos/prooph/event-sourcing/issues/events{/number}","events_url":"https://api.github.com/repos/prooph/event-sourcing/events","assignees_url":"https://api.github.com/repos/prooph/event-sourcing/assignees{/user}","branches_url":"https://api.github.com/repos/prooph/event-sourcing/branches{/branch}","tags_url":"https://api.github.com/repos/prooph/event-sourcing/tags","blobs_url":"https://api.github.com/repos/prooph/event-sourcing/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/prooph/event-sourcing/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/prooph/event-sourcing/git/refs{/sha}","trees_url":"https://api.github.com/repos/prooph/event-sourcing/git/trees{/sha}","statuses_url":"https://api.github.com/repos/prooph/event-sourcing/statuses/{sha}","languages_url":"https://api.github.com/repos/prooph/event-sourcing/languages","stargazers_url":"https://api.github.com/repos/prooph/event-sourcing/stargazers","contributors_url":"https://api.github.com/repos/prooph/event-sourcing/contributors","subscribers_url":"https://api.github.com/repos/prooph/event-sourcing/subscribers","subscription_url":"https://api.github.com/repos/prooph/event-sourcing/subscription","commits_url":"https://api.github.com/repos/prooph/event-sourcing/commits{/sha}","git_commits_url":"https://api.github.com/repos/prooph/event-sourcing/git/commits{/sha}","comments_url":"https://api.github.com/repos/prooph/event-sourcing/comments{/number}","issue_comment_url":"https://api.github.com/repos/prooph/event-sourcing/issues/comments{/number}","contents_url":"https://api.github.com/repos/prooph/event-sourcing/contents/{+path}","compare_url":"https://api.github.com/repos/prooph/event-sourcing/compare/{base}...{head}","merges_url":"https://api.github.com/repos/prooph/event-sourcing/merges","archive_url":"https://api.github.com/repos/prooph/event-sourcing/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/prooph/event-sourcing/downloads","issues_url":"https://api.github.com/repos/prooph/event-sourcing/issues{/number}","pulls_url":"https://api.github.com/repos/prooph/event-sourcing/pulls{/number}","milestones_url":"https://api.github.com/repos/prooph/event-sourcing/milestones{/number}","notifications_url":"https://api.github.com/repos/prooph/event-sourcing/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/prooph/event-sourcing/labels{/name}","releases_url":"https://api.github.com/repos/prooph/event-sourcing/releases{/id}","deployments_url":"https://api.github.com/repos/prooph/event-sourcing/deployments","created_at":"2014-06-06T20:44:06Z","updated_at":"2016-09-09T07:19:10Z","pushed_at":"2016-10-26T12:45:03Z","git_url":"git://github.com/prooph/event-sourcing.git","ssh_url":"git@github.com:prooph/event-sourcing.git","clone_url":"https://github.com/prooph/event-sourcing.git","svn_url":"https://github.com/prooph/event-sourcing","homepage":"http://getprooph.org","size":160,"stargazers_count":45,"watchers_count":45,"language":"PHP","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8,"mirror_url":null,"open_issues_count":1,"forks":8,"open_issues":1,"watchers":45,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/prooph/event-sourcing/pulls/31"},"html":{"href":"https://github.com/prooph/event-sourcing/pull/31"},"issue":{"href":"https://api.github.com/repos/prooph/event-sourcing/issues/31"},"comments":{"href":"https://api.github.com/repos/prooph/event-sourcing/issues/31/comments"},"review_comments":{"href":"https://api.github.com/repos/prooph/event-sourcing/pulls/31/comments"},"review_comment":{"href":"https://api.github.com/repos/prooph/event-sourcing/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/prooph/event-sourcing/pulls/31/commits"},"statuses":{"href":"https://api.github.com/repos/prooph/event-sourcing/statuses/3494da71c97c35a3e3d118397988248dcd24bc86"}}}}
{"actor":{"display_login":"oqq"}}