{"action":"created","comment":{"url":"https://api.github.com/repos/Elgg/Elgg/pulls/comments/78273629","id":78273629,"diff_hunk":"@@ -0,0 +1,929 @@\n+<?php\n+\n+namespace Elgg\\Notifications;\n+\n+use Elgg\\EventsService;\n+use Elgg\\Logger;\n+use Elgg\\PluginHooksService;\n+use Elgg\\Queue\\MemoryQueue;\n+use Elgg\\TestCase;\n+use Elgg\\Values;\n+use ElggEntity;\n+use ElggObject;\n+use ElggSession;\n+use Exception;\n+\n+abstract class NotificationsServiceTestCase extends TestCase {\n+\n+\t/**\n+\t * @var PluginHooksService\n+\t */\n+\tprotected $hooks;\n+\n+\t/**\n+\t * @var EventsService\n+\t */\n+\tprotected $events;\n+\n+\t/**\n+\t * @var MemoryQueue\n+\t */\n+\tprotected $queue;\n+\n+\t/**\n+\t * @var SubscriptionsService\n+\t */\n+\tprotected $subscriptions;\n+\n+\t/**\n+\t * @var ElggSession\n+\t */\n+\tprotected $session;\n+\n+\t/**\n+\t * @var Logger\n+\t */\n+\tprotected $logger;\n+\n+\t/**\n+\t * @var NotificationsService\n+\t */\n+\tprotected $notifications;\n+\n+\t/**\n+\t * @var string\n+\t */\n+\tprotected $test_object_class;\n+\n+\t/**\n+\t * @var \\ElggUser\n+\t */\n+\tprotected $actor;\n+\n+\t/**\n+\t * @var int\n+\t */\n+\tprotected $time;\n+\n+\tpublic function setUp() {\n+\n+\t\tif (!isset($this->test_object_class)) {\n+\t\t\tthrow new Exception(get_class($this) . ' must set \\$object_test_class before calling ' . __METHOD__);\n+\t\t}\n+\n+\t\t$this->setupMockServices();\n+\n+\t\t$this->events = _elgg_services()->events;\n+\t\t$this->events->backup();\n+\n+\t\t$this->hooks = _elgg_services()->hooks;\n+\t\t$this->hooks->backup();\n+\n+\t\t$this->queue = new DatabaseQueueMock();\n+\n+\t\t$this->entities = _elgg_services()->entityTable;\n+\t\t$this->time = $this->entities->getCurrentTime()->getTimestamp();\n+\n+\t\t$this->subscriptions = new SubscriptionsService(_elgg_services()->db);\n+\n+\t\t$this->session = _elgg_services()->session;\n+\n+\t\t$this->logger = _elgg_services()->logger;\n+\t\t$this->logger->disable();\n+\n+\t\t$this->translator = _elgg_services()->translator;\n+\n+\t\t$this->setupServices();\n+\n+\t\t$this->actor = $this->mocks()->getUser();\n+\t}\n+\n+\tpublic function tearDown() {\n+\t\t$this->logger->enable();\n+\t\t$this->session->invalidate();\n+\t\t$this->events->restore();\n+\t\t$this->hooks->restore();\n+\t}\n+\n+\tpublic function setupServices() {\n+\t\t$this->notifications = new NotificationsService(\n+\t\t\t$this->subscriptions,\n+\t\t\t$this->queue,\n+\t\t\t$this->hooks,\n+\t\t\t$this->session,\n+\t\t\t$this->translator,\n+\t\t\t$this->entities,\n+\t\t\t$this->logger\n+\t\t);\n+\t\t_elgg_services()->setValue('notifications', $this->notifications);\n+\t}\n+\n+\tpublic function getTestObject() {\n+\t\t$objects = $this->prepareTestObjects();\n+\t\tforeach ($objects as $object) {\n+\t\t\tif ($object instanceof $this->test_object_class) {\n+\t\t\t\treturn $object;\n+\t\t\t}\n+\t\t}\n+\t\tthrow new Exception(\"Test object not found for $this->test_object_class class\");\n+\t}\n+\n+\tpublic function prepareTestObjects() {\n+\n+\t\t$this->setupServices();\n+\n+\t\t$object = $this->mocks()->getObject([\n+\t\t\t'owner_guid' => $this->actor->guid,\n+\t\t\t'container_guid' => $this->actor->guid,\n+\t\t\t'access_id' => ACCESS_LOGGED_IN,\n+\t\t\t'subtype' => 'test_subtype',\n+\t\t]);\n+\n+\t\t$group = $this->mocks()->getGroup([\n+\t\t\t'owner_guid' => $this->actor->guid,\n+\t\t\t'container_guid' => $this->actor->guid,\n+\t\t\t'access_id' => ACCESS_LOGGED_IN,\n+\t\t]);\n+\t\t\n+\t\t$user = $this->actor;\n+\n+\t\t$metadata_id = create_metadata($object->guid, 'test_metadata_name', 'test_metadata_value', 'text', $this->actor->guid, ACCESS_PUBLIC);\n+\t\t$metadata = elgg_get_metadata_from_id($metadata_id);\n+\n+\t\t$annotation_id = $object->annotate('test_annotation_name', 'test_annotation_value', 'text', $this->actor->guid, ACCESS_PUBLIC);\n+\t\t$annotation = elgg_get_annotation_from_id($annotation_id);\n+\n+\t\tadd_entity_relationship($object->guid, 'test_relationship', $user->guid);\n+\t\t$relationship = check_entity_relationship($object->guid, 'test_relationship', $user->guid);\n+\t\t\n+\t\treturn [\n+\t\t\t$object,\n+\t\t\t$group,\n+\t\t\t$user,\n+\t\t\t$metadata,\n+\t\t\t$annotation,\n+\t\t\t$relationship,\n+\t\t];\n+\t}\n+\n+\tpublic function testRegisterEvent() {\n+\t\t$this->setupServices();\n+\n+\t\t$object = $this->getTestObject();\n+\n+\t\t$this->notifications->registerEvent($object->getType(), $object->getSubtype());\n+\t\t$events = array(\n+\t\t\t$object->getType() => array(\n+\t\t\t\t$object->getSubtype() => array('create')\n+\t\t\t)\n+\t\t);\n+\t\t$this->assertEquals($events, $this->notifications->getEvents());\n+\n+\t\t$this->notifications->registerEvent($object->getType(), $object->getSubtype(), array('test_event'));\n+\t\t$events[$object->getType()][$object->getSubtype()] = array('create', 'test_event');\n+\t\t$this->assertEquals($events, $this->notifications->getEvents());\n+\n+\t\t$this->notifications->registerEvent($object->getType(), $object->getSubtype());\n+\t\t$this->assertEquals($events, $this->notifications->getEvents());\n+\t}\n+\n+\tpublic function testUnregisterEvent() {\n+\t\t$this->setupServices();\n+\n+\t\t$object = $this->getTestObject();\n+\n+\t\t$this->notifications->registerEvent($object->getType(), $object->getSubtype());\n+\t\t$this->assertTrue($this->notifications->unregisterEvent($object->getType(), $object->getSubtype()));\n+\n+\t\t$events = array(\n+\t\t\t$object->getType() => array()\n+\t\t);\n+\t\t$this->assertEquals($events, $this->notifications->getEvents());\n+\t\t$this->assertFalse($this->notifications->unregisterEvent($object->getType(), $object->getSubtype()));\n+\t}\n+\n+\tpublic function testRegisterMethod() {\n+\t\t$this->setupServices();\n+\n+\t\t$this->notifications->registerMethod('test_method');\n+\t\t$methods = array('test_method' => 'test_method');\n+\t\t$this->assertEquals($methods, $this->notifications->getMethods());\n+\t}\n+\n+\tpublic function testUnregisterMethod() {\n+\t\t$this->setupServices();\n+\n+\t\t$this->notifications->registerMethod('test_method');\n+\t\t$this->assertTrue($this->notifications->unregisterMethod('test_method'));\n+\t\t$this->assertEquals(array(), $this->notifications->getMethods());\n+\t\t$this->assertFalse($this->notifications->unregisterMethod('test_method'));\n+\t}\n+\n+\tpublic function testEnqueueEvent() {\n+\t\t$this->setupServices();\n+\n+\t\t$object = $this->getTestObject();\n+\n+\t\t$this->session->setLoggedInUser($this->actor);\n+\n+\t\t$this->notifications->registerEvent($object->getType(), $object->getSubtype());\n+\n+\t\t$this->notifications->enqueueEvent('create', $object->getType(), $object);\n+\n+\t\t$event = new SubscriptionNotificationEvent($object, 'create');\n+\t\t$this->assertEquals($event, $this->queue->dequeue());\n+\t\t$this->assertNull($this->queue->dequeue());\n+\n+\t\t// unregistered action type\n+\t\t$this->notifications->enqueueEvent('null', $object->getType(), $object);\n+\t\t$this->assertNull($this->queue->dequeue());\n+\n+\t\t// unregistered object type\n+\t\t$this->notifications->enqueueEvent('create', $object->getType(), new ElggObject());\n+\t\t$this->assertNull($this->queue->dequeue());\n+\n+\t\t$this->session->removeLoggedInUser();\n+\t}\n+\n+\tpublic function testStoppingEnqueueEvent() {","path":"engine/tests/phpunit/Elgg/Notifications/NotificationsServiceTestCase.php","position":248,"original_position":248,"commit_id":"cbe8f14ef26ac91db0245c0f3878507be4f49af7","original_commit_id":"cbe8f14ef26ac91db0245c0f3878507be4f49af7","user":{"login":"juho-jaakkola","id":883920,"avatar_url":"https://avatars.githubusercontent.com/u/883920?v=3","gravatar_id":"","url":"https://api.github.com/users/juho-jaakkola","html_url":"https://github.com/juho-jaakkola","followers_url":"https://api.github.com/users/juho-jaakkola/followers","following_url":"https://api.github.com/users/juho-jaakkola/following{/other_user}","gists_url":"https://api.github.com/users/juho-jaakkola/gists{/gist_id}","starred_url":"https://api.github.com/users/juho-jaakkola/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/juho-jaakkola/subscriptions","organizations_url":"https://api.github.com/users/juho-jaakkola/orgs","repos_url":"https://api.github.com/users/juho-jaakkola/repos","events_url":"https://api.github.com/users/juho-jaakkola/events{/privacy}","received_events_url":"https://api.github.com/users/juho-jaakkola/received_events","type":"User","site_admin":false},"body":"The more descriptive names, the better. This could be e.g. `testPluginHookHandlerCanStopEnqueueEvent()`.","created_at":"2016-09-10T08:15:05Z","updated_at":"2016-09-10T08:15:05Z","html_url":"https://github.com/Elgg/Elgg/pull/10139#discussion_r78273629","pull_request_url":"https://api.github.com/repos/Elgg/Elgg/pulls/10139","_links":{"self":{"href":"https://api.github.com/repos/Elgg/Elgg/pulls/comments/78273629"},"html":{"href":"https://github.com/Elgg/Elgg/pull/10139#discussion_r78273629"},"pull_request":{"href":"https://api.github.com/repos/Elgg/Elgg/pulls/10139"}}},"pull_request":{"url":"https://api.github.com/repos/Elgg/Elgg/pulls/10139","id":83009831,"html_url":"https://github.com/Elgg/Elgg/pull/10139","diff_url":"https://github.com/Elgg/Elgg/pull/10139.diff","patch_url":"https://github.com/Elgg/Elgg/pull/10139.patch","issue_url":"https://api.github.com/repos/Elgg/Elgg/issues/10139","number":10139,"state":"open","locked":false,"title":"feature(notifications): refactor notification system for improved usability","user":{"login":"hypeJunction","id":1202761,"avatar_url":"https://avatars.githubusercontent.com/u/1202761?v=3","gravatar_id":"","url":"https://api.github.com/users/hypeJunction","html_url":"https://github.com/hypeJunction","followers_url":"https://api.github.com/users/hypeJunction/followers","following_url":"https://api.github.com/users/hypeJunction/following{/other_user}","gists_url":"https://api.github.com/users/hypeJunction/gists{/gist_id}","starred_url":"https://api.github.com/users/hypeJunction/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hypeJunction/subscriptions","organizations_url":"https://api.github.com/users/hypeJunction/orgs","repos_url":"https://api.github.com/users/hypeJunction/repos","events_url":"https://api.github.com/users/hypeJunction/events{/privacy}","received_events_url":"https://api.github.com/users/hypeJunction/received_events","type":"User","site_admin":false},"body":"Replaces #9946 (github wouldn't let me reopen)\r\n\r\nImproves usability of instant and subscription notifications:\r\n\r\n- Adds \"origin\" to notification object parameters making it easier to distinguish between\r\ninstant and subscription notifications\r\n\r\n- Adds a high level \"prepare, notification\" plugin hook that can be used to filter\r\nboth subscription and instant notifications.\r\nNormalizes parameters sent to the hook for both subscription types.\r\n\r\n- Adds \"format, notification:$method\" hook, which can be used to format notification subject\r\nand/or body, to make it suitable for the delivery method. For example, plugins may strip\r\nHTML tags from notifcation body for plaintext emails, or wrap the body in an HTML template\r\nfor HTML emails.\r\n\r\n- Instant notifications are now sent by the notifications service triggering\r\na set of hooks similar to subscriptions notifications.\r\n\r\n- Help developers debug notifications by logging notifications and notification\r\nevent results","created_at":"2016-08-28T08:32:08Z","updated_at":"2016-09-10T08:15:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"30ed3ee179789e092b21dff7248def338db2a164","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/Elgg/Elgg/pulls/10139/commits","review_comments_url":"https://api.github.com/repos/Elgg/Elgg/pulls/10139/comments","review_comment_url":"https://api.github.com/repos/Elgg/Elgg/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Elgg/Elgg/issues/10139/comments","statuses_url":"https://api.github.com/repos/Elgg/Elgg/statuses/cbe8f14ef26ac91db0245c0f3878507be4f49af7","head":{"label":"hypeJunction:prepare-notification","ref":"prepare-notification","sha":"cbe8f14ef26ac91db0245c0f3878507be4f49af7","user":{"login":"hypeJunction","id":1202761,"avatar_url":"https://avatars.githubusercontent.com/u/1202761?v=3","gravatar_id":"","url":"https://api.github.com/users/hypeJunction","html_url":"https://github.com/hypeJunction","followers_url":"https://api.github.com/users/hypeJunction/followers","following_url":"https://api.github.com/users/hypeJunction/following{/other_user}","gists_url":"https://api.github.com/users/hypeJunction/gists{/gist_id}","starred_url":"https://api.github.com/users/hypeJunction/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hypeJunction/subscriptions","organizations_url":"https://api.github.com/users/hypeJunction/orgs","repos_url":"https://api.github.com/users/hypeJunction/repos","events_url":"https://api.github.com/users/hypeJunction/events{/privacy}","received_events_url":"https://api.github.com/users/hypeJunction/received_events","type":"User","site_admin":false},"repo":{"id":2797801,"name":"Elgg","full_name":"hypeJunction/Elgg","owner":{"login":"hypeJunction","id":1202761,"avatar_url":"https://avatars.githubusercontent.com/u/1202761?v=3","gravatar_id":"","url":"https://api.github.com/users/hypeJunction","html_url":"https://github.com/hypeJunction","followers_url":"https://api.github.com/users/hypeJunction/followers","following_url":"https://api.github.com/users/hypeJunction/following{/other_user}","gists_url":"https://api.github.com/users/hypeJunction/gists{/gist_id}","starred_url":"https://api.github.com/users/hypeJunction/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hypeJunction/subscriptions","organizations_url":"https://api.github.com/users/hypeJunction/orgs","repos_url":"https://api.github.com/users/hypeJunction/repos","events_url":"https://api.github.com/users/hypeJunction/events{/privacy}","received_events_url":"https://api.github.com/users/hypeJunction/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/hypeJunction/Elgg","description":"A social networking engine","fork":true,"url":"https://api.github.com/repos/hypeJunction/Elgg","forks_url":"https://api.github.com/repos/hypeJunction/Elgg/forks","keys_url":"https://api.github.com/repos/hypeJunction/Elgg/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hypeJunction/Elgg/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hypeJunction/Elgg/teams","hooks_url":"https://api.github.com/repos/hypeJunction/Elgg/hooks","issue_events_url":"https://api.github.com/repos/hypeJunction/Elgg/issues/events{/number}","events_url":"https://api.github.com/repos/hypeJunction/Elgg/events","assignees_url":"https://api.github.com/repos/hypeJunction/Elgg/assignees{/user}","branches_url":"https://api.github.com/repos/hypeJunction/Elgg/branches{/branch}","tags_url":"https://api.github.com/repos/hypeJunction/Elgg/tags","blobs_url":"https://api.github.com/repos/hypeJunction/Elgg/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hypeJunction/Elgg/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hypeJunction/Elgg/git/refs{/sha}","trees_url":"https://api.github.com/repos/hypeJunction/Elgg/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hypeJunction/Elgg/statuses/{sha}","languages_url":"https://api.github.com/repos/hypeJunction/Elgg/languages","stargazers_url":"https://api.github.com/repos/hypeJunction/Elgg/stargazers","contributors_url":"https://api.github.com/repos/hypeJunction/Elgg/contributors","subscribers_url":"https://api.github.com/repos/hypeJunction/Elgg/subscribers","subscription_url":"https://api.github.com/repos/hypeJunction/Elgg/subscription","commits_url":"https://api.github.com/repos/hypeJunction/Elgg/commits{/sha}","git_commits_url":"https://api.github.com/repos/hypeJunction/Elgg/git/commits{/sha}","comments_url":"https://api.github.com/repos/hypeJunction/Elgg/comments{/number}","issue_comment_url":"https://api.github.com/repos/hypeJunction/Elgg/issues/comments{/number}","contents_url":"https://api.github.com/repos/hypeJunction/Elgg/contents/{+path}","compare_url":"https://api.github.com/repos/hypeJunction/Elgg/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hypeJunction/Elgg/merges","archive_url":"https://api.github.com/repos/hypeJunction/Elgg/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hypeJunction/Elgg/downloads","issues_url":"https://api.github.com/repos/hypeJunction/Elgg/issues{/number}","pulls_url":"https://api.github.com/repos/hypeJunction/Elgg/pulls{/number}","milestones_url":"https://api.github.com/repos/hypeJunction/Elgg/milestones{/number}","notifications_url":"https://api.github.com/repos/hypeJunction/Elgg/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hypeJunction/Elgg/labels{/name}","releases_url":"https://api.github.com/repos/hypeJunction/Elgg/releases{/id}","deployments_url":"https://api.github.com/repos/hypeJunction/Elgg/deployments","created_at":"2011-11-17T18:59:58Z","updated_at":"2015-05-09T06:40:26Z","pushed_at":"2016-09-09T08:47:27Z","git_url":"git://github.com/hypeJunction/Elgg.git","ssh_url":"git@github.com:hypeJunction/Elgg.git","clone_url":"https://github.com/hypeJunction/Elgg.git","svn_url":"https://github.com/hypeJunction/Elgg","homepage":"http://elgg.org","size":46742,"stargazers_count":1,"watchers_count":1,"language":"PHP","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"Elgg:2.x","ref":"2.x","sha":"6b4e1717f062d33891a02137725dcae617fc777b","user":{"login":"Elgg","id":79167,"avatar_url":"https://avatars.githubusercontent.com/u/79167?v=3","gravatar_id":"","url":"https://api.github.com/users/Elgg","html_url":"https://github.com/Elgg","followers_url":"https://api.github.com/users/Elgg/followers","following_url":"https://api.github.com/users/Elgg/following{/other_user}","gists_url":"https://api.github.com/users/Elgg/gists{/gist_id}","starred_url":"https://api.github.com/users/Elgg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Elgg/subscriptions","organizations_url":"https://api.github.com/users/Elgg/orgs","repos_url":"https://api.github.com/users/Elgg/repos","events_url":"https://api.github.com/users/Elgg/events{/privacy}","received_events_url":"https://api.github.com/users/Elgg/received_events","type":"Organization","site_admin":false},"repo":{"id":299271,"name":"Elgg","full_name":"Elgg/Elgg","owner":{"login":"Elgg","id":79167,"avatar_url":"https://avatars.githubusercontent.com/u/79167?v=3","gravatar_id":"","url":"https://api.github.com/users/Elgg","html_url":"https://github.com/Elgg","followers_url":"https://api.github.com/users/Elgg/followers","following_url":"https://api.github.com/users/Elgg/following{/other_user}","gists_url":"https://api.github.com/users/Elgg/gists{/gist_id}","starred_url":"https://api.github.com/users/Elgg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Elgg/subscriptions","organizations_url":"https://api.github.com/users/Elgg/orgs","repos_url":"https://api.github.com/users/Elgg/repos","events_url":"https://api.github.com/users/Elgg/events{/privacy}","received_events_url":"https://api.github.com/users/Elgg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Elgg/Elgg","description":"A social networking engine in PHP/MySQL","fork":false,"url":"https://api.github.com/repos/Elgg/Elgg","forks_url":"https://api.github.com/repos/Elgg/Elgg/forks","keys_url":"https://api.github.com/repos/Elgg/Elgg/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Elgg/Elgg/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Elgg/Elgg/teams","hooks_url":"https://api.github.com/repos/Elgg/Elgg/hooks","issue_events_url":"https://api.github.com/repos/Elgg/Elgg/issues/events{/number}","events_url":"https://api.github.com/repos/Elgg/Elgg/events","assignees_url":"https://api.github.com/repos/Elgg/Elgg/assignees{/user}","branches_url":"https://api.github.com/repos/Elgg/Elgg/branches{/branch}","tags_url":"https://api.github.com/repos/Elgg/Elgg/tags","blobs_url":"https://api.github.com/repos/Elgg/Elgg/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Elgg/Elgg/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Elgg/Elgg/git/refs{/sha}","trees_url":"https://api.github.com/repos/Elgg/Elgg/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Elgg/Elgg/statuses/{sha}","languages_url":"https://api.github.com/repos/Elgg/Elgg/languages","stargazers_url":"https://api.github.com/repos/Elgg/Elgg/stargazers","contributors_url":"https://api.github.com/repos/Elgg/Elgg/contributors","subscribers_url":"https://api.github.com/repos/Elgg/Elgg/subscribers","subscription_url":"https://api.github.com/repos/Elgg/Elgg/subscription","commits_url":"https://api.github.com/repos/Elgg/Elgg/commits{/sha}","git_commits_url":"https://api.github.com/repos/Elgg/Elgg/git/commits{/sha}","comments_url":"https://api.github.com/repos/Elgg/Elgg/comments{/number}","issue_comment_url":"https://api.github.com/repos/Elgg/Elgg/issues/comments{/number}","contents_url":"https://api.github.com/repos/Elgg/Elgg/contents/{+path}","compare_url":"https://api.github.com/repos/Elgg/Elgg/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Elgg/Elgg/merges","archive_url":"https://api.github.com/repos/Elgg/Elgg/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Elgg/Elgg/downloads","issues_url":"https://api.github.com/repos/Elgg/Elgg/issues{/number}","pulls_url":"https://api.github.com/repos/Elgg/Elgg/pulls{/number}","milestones_url":"https://api.github.com/repos/Elgg/Elgg/milestones{/number}","notifications_url":"https://api.github.com/repos/Elgg/Elgg/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Elgg/Elgg/labels{/name}","releases_url":"https://api.github.com/repos/Elgg/Elgg/releases{/id}","deployments_url":"https://api.github.com/repos/Elgg/Elgg/deployments","created_at":"2009-09-06T17:10:11Z","updated_at":"2016-09-07T10:54:21Z","pushed_at":"2016-09-10T01:44:21Z","git_url":"git://github.com/Elgg/Elgg.git","ssh_url":"git@github.com:Elgg/Elgg.git","clone_url":"https://github.com/Elgg/Elgg.git","svn_url":"https://github.com/Elgg/Elgg","homepage":"http://elgg.org","size":87007,"stargazers_count":910,"watchers_count":910,"language":"PHP","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":529,"mirror_url":null,"open_issues_count":874,"forks":529,"open_issues":874,"watchers":910,"default_branch":"2.x"}},"_links":{"self":{"href":"https://api.github.com/repos/Elgg/Elgg/pulls/10139"},"html":{"href":"https://github.com/Elgg/Elgg/pull/10139"},"issue":{"href":"https://api.github.com/repos/Elgg/Elgg/issues/10139"},"comments":{"href":"https://api.github.com/repos/Elgg/Elgg/issues/10139/comments"},"review_comments":{"href":"https://api.github.com/repos/Elgg/Elgg/pulls/10139/comments"},"review_comment":{"href":"https://api.github.com/repos/Elgg/Elgg/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Elgg/Elgg/pulls/10139/commits"},"statuses":{"href":"https://api.github.com/repos/Elgg/Elgg/statuses/cbe8f14ef26ac91db0245c0f3878507be4f49af7"}}}}
{"actor":{"display_login":"juho-jaakkola"}}