{"action":"created","comment":{"url":"https://api.github.com/repos/GetDKAN/dkan/pulls/comments/189299950","pull_request_review_id":121458408,"id":189299950,"diff_hunk":"@@ -0,0 +1,298 @@\n+<?php\n+/**\n+ * @file\n+ * Resource definition and callback for dkan_datastore endpoint (used in\n+ * Dataset REST API).\n+ */\n+\n+/**\n+ * Resource definition.\n+ */\n+function _dkan_datastore_resource_definition() {\n+  return array(\n+    'datastore' => array(\n+      'operations' => array(\n+        'retrieve' => array(\n+          'help' => 'Retrieve information about a datastore',\n+          'file' => array('type' => 'inc', 'module' => 'dkan_datastore', 'name' => 'resources/dkan_datastore_resource'),\n+          'callback' => '_dkan_datastore_resource_retrieve',\n+          'args' => array(\n+            array(\n+              'name' => 'resource_nid',\n+              'optional' => FALSE,\n+              'source' => array('path' => 0),\n+              'type' => 'int',\n+              'description' => 'The nid of the resource the datastore is connected to.',\n+            ),\n+          ),\n+          'access callback' => '_dkan_datastore_resource_access',\n+        ),\n+        'create' => array(\n+          'help' => 'Create a datastore for the given resource.',\n+          'file' => array('type' => 'inc', 'module' => 'dkan_datastore', 'name' => 'resources/dkan_datastore_resource'),\n+          'callback' => '_dkan_datastore_resource_create',\n+          'args' => array(\n+            array(\n+              'name' => 'nid',\n+              'optional' => FALSE,\n+              'source' => array('path' => 0),\n+              'type' => 'int',\n+              'description' => 'The nid of the resource to configure a datastore for.',\n+            ),\n+            array(\n+              'name' => 'data',\n+              'optional' => FALSE,\n+              'type' => 'string',\n+              'source' => 'data',\n+              'description' => 'The machine name of the datastore manager that should be used.',\n+            ),\n+          ),\n+          'access callback' => '_dkan_datastore_resource_access',\n+        ),\n+        'update' => array(\n+          'help' => 'Update/modify the datastore for a given resource.',\n+          'file' => array('type' => 'inc', 'module' => 'dkan_datastore', 'name' => 'resources/dkan_datastore_resource'),\n+          'callback' => '_dkan_datastore_resource_update',\n+          'args' => array(\n+            array(\n+              'name' => 'nid',\n+              'optional' => FALSE,\n+              'source' => array('path' => 0),\n+              'type' => 'int',\n+              'description' => 'The nid of the resource to configure a datastore for.',\n+            ),\n+            array(\n+              'name' => 'data',\n+              'optional' => FALSE,\n+              'type' => 'string',\n+              'source' => 'data',\n+              'description' => 'Configuration data for datastore.',\n+            ),\n+          ),\n+          'access callback' => '_dkan_datastore_resource_access',\n+        ),\n+      ),\n+      'delete' => array(\n+        'help' => 'Remove the datastore for a given resource.',\n+        'file' => array('type' => 'inc', 'module' => 'dkan_datastore', 'name' => 'resources/dkan_datastore_resource'),\n+        'callback' => '_dkan_datastore_resource_delete',\n+        'args' => array(\n+          array(\n+            'name' => 'nid',\n+            'optional' => FALSE,\n+            'source' => array('path' => 0),\n+            'type' => 'int',\n+            'description' => 'The nid of the resource for which to drop datastore.',\n+          ),\n+        ),\n+        'access callback' => '_dkan_datastore_resource_access',\n+      ),\n+      'targeted_actions' => array(\n+        'drop' => array(\n+          'help' => 'Drop a datastore table but keep configuration.',\n+          'file' => array('type' => 'inc', 'module' => 'dkan_datastore', 'name' => 'resources/dkan_datastore_resource'),\n+          'callback' => '_dkan_datastore_resource_drop',\n+          'access callback' => '_dkan_datastore_resource_access',\n+          'args' => array(\n+            array(\n+              'name' => 'nid',\n+              'optional' => FALSE,\n+              'source' => array('path' => 0),\n+              'type' => 'int',\n+              'description' => 'The nid of the node to attach a file to',\n+            ),\n+          ),\n+        ),\n+        'import' => array(\n+          'help' => 'Queue a datastore for import.',\n+          'file' => array('type' => 'inc', 'module' => 'dkan_datastore', 'name' => 'resources/dkan_datastore_resource'),\n+          'callback' => '_dkan_datastore_resource_import',\n+          'access callback' => '_dkan_datastore_resource_access',\n+          'args' => array(\n+            array(\n+              'name' => 'nid',\n+              'optional' => FALSE,\n+              'source' => array('path' => 0),\n+              'type' => 'int',\n+              'description' => 'The nid of the node to attach a file to',\n+            ),\n+          ),\n+        ),\n+      ),\n+    ),\n+  );\n+}\n+\n+function _dkan_datastore_resource_get_resource($resource_nid) {\n+  try {\n+    $resource = \\Dkan\\Datastore\\Resource::createFromDrupalNodeNid($resource_nid);\n+  }\n+  catch (\\Exception $e) {\n+    services_error(\"Resource {$resource_nid} does not exist | {$e->getMessage()}\");\n+    die();\n+  }\n+  return $resource;\n+}\n+\n+function _dkan_datastore_resource_get_datastore($resource_nid) {\n+  /* @var $datastore \\Dkan\\Datastore\\Manager\\ManagerInterface */\n+  $datastore = \\Dkan\\Datastore\\Manager\\Factory::create(_dkan_datastore_resource_get_resource($resource_nid));\n+\n+  return $datastore;\n+}\n+\n+function _dkan_datastore_resource_retrieve($resource_nid) {\n+  /* @var $datastore \\Dkan\\Datastore\\Manager\\ManagerInterface */\n+  $datastore = _dkan_datastore_resource_get_datastore($resource_nid);\n+\n+  if (!$datastore) {\n+    services_error(\"The datastore for Resource {$resource_nid} has not been configured.\");\n+  }\n+  return $datastore->getStatus();\n+}\n+\n+function _dkan_datastore_resource_create($resource_nid, $data) {\n+  $data = _services_arg_value($data, 'data');\n+  $manager = $data['manager'];\n+  $configuration = $data['configuration'];\n+  // return $configuration;\n+  try {\n+    if (_dkan_datastore_resource_get_datastore($resource_nid)) {\n+      services_error(\"Configuration for this resource's datastore already exists.\");\n+      die();\n+    }\n+  }\n+  catch (\\Exception $e) {\n+    return $e->getMessage();\n+  }\n+\n+  $class = _dkan_datastore_resource_get_class($manager);\n+  if (!$class) {\n+    services_error(\"The manager {$manager} does not exist or is not active.\");\n+    die();\n+  }\n+  else {\n+    $resource = \\Dkan\\Datastore\\Resource::createFromDrupalNodeNid($resource_nid);\n+\n+    /* @var $datastore \\Dkan\\Datastore\\Manager\\ManagerInterface */\n+    $datastore = \\Dkan\\Datastore\\Manager\\Factory::create($resource, $class);\n+    $properties = $datastore->getConfigurableProperties();\n+    foreach ($properties as $property_name => $default_value) {\n+      if (!isset($configuration[$property_name])) {\n+        services_error(\"The configuration property {$property_name} was not set.\");\n+      }\n+      $datastore->setConfigurableProperties($configuration);\n+    }\n+    // Now get the stored object and return\n+    unset($datastore);\n+    $datastore = _dkan_datastore_resource_get_datastore($resource_nid);\n+\n+    if (!$datastore) {\n+      services_error(\"The datastore for Resource {$resource_nid} was not properly configured.\");\n+    }\n+    return $datastore->getStatus();\n+  }\n+}\n+\n+function _dkan_datastore_resource_update($resource_nid, $data) {\n+  $data = _services_arg_value($data, 'data');\n+  $manager = $data['manager'];\n+  $configuration = $data['configuration'];\n+  // return $configuration;\n+  try {\n+    $datastore = _dkan_datastore_resource_get_datastore($resource_nid);\n+    if (empty($datastore)) {\n+      services_error(\"This resource's datastore is not configured or does not exist.\");\n+    }\n+  }\n+  catch (\\Exception $e) {\n+    return $e->getMessage();\n+  }\n+\n+  if ($manager) {\n+    $class = _dkan_datastore_resource_get_class($manager);\n+    $status = $datastore->getStatus();\n+    // If the manager class has changed, drop and create a new one.\n+    if ($status['class'] != $class) {\n+      services_error(\"You may not change the manager of an existing datastore. Drop the datastore and create a new one to use a different manager.\");\n+    }\n+  }\n+\n+  $properties = $datastore->getConfigurableProperties();\n+  foreach ($properties as $property_name => $default_value) {\n+    if (isset($configuration[$property_name])) {\n+      $datastore->setConfigurableProperties($configuration);\n+    }\n+  }\n+}\n+\n+function _dkan_datastore_resource_delete($resource_nid) {\n+  try {\n+    $datastore = _dkan_datastore_resource_get_datastore($resource_nid);\n+    if (empty($datastore)) {\n+      services_error(\"This resource's datastore is not configured or does not exist.\");\n+    }\n+  }\n+  catch (\\Exception $e) {\n+    return $e->getMessage();\n+  }\n+\n+  $datastore->drop();\n+  $datastore->dropState();\n+\n+  return TRUE;\n+}\n+\n+function _dkan_datastore_resource_import($nid) {\n+  /* @var $datastore \\Dkan\\Datastore\\Manager\\ManagerInterface */\n+  $datastore = _dkan_datastore_resource_get_datastore($nid);\n+\n+  if (!$datastore) {\n+    services_error(\"The datastore for Resource {$resource_nid} has not been configured.\");\n+  }\n+\n+  $finished = $datastore->import();\n+  if ($finished) {\n+    return TRUE;\n+  }\n+  else {\n+    return $datastore->getErrors();\n+  }\n+}\n+\n+function _dkan_datastore_resource_drop($nid) {\n+  $datastore = _dkan_datastore_resource_get_datastore($nid);\n+\n+  if (!$datastore) {\n+    services_error(\"The datastore for Resource {$resource_nid} has not been configured.\");\n+  }\n+\n+  $finished = $datastore->drop();\n+  if ($finished) {\n+    return TRUE;\n+  }\n+  else {\n+    return 'untrue';\n+    return $datastore->getErrors();\n+  }\n+}\n+\n+function _dkan_datastore_resource_get_class($manager_machine_name) {\n+  $info = dkan_datastore_managers_info();\n+  /* @var $i \\Dkan\\Datastore\\Manager\\Info */\n+  foreach ($info as $i) {\n+    if ($i->getMachineName() == $manager_machine_name) {\n+      return $i->getClass();\n+    }\n+  }\n+  return NULL;\n+}\n+\n+function _dkan_datastore_resource_info() {\n+  $info = dkan_datastore_managers_info();\n+  return $info;\n+}\n+\n+function _dkan_datastore_resource_access() {","path":"modules/dkan/dkan_datastore/resources/dkan_datastore_resource.inc","position":294,"original_position":296,"commit_id":"d03b7ce8f0a9a643d9d946102481f7c5122f6f42","original_commit_id":"3bba9e55305f43d6c882ceb0c53daa1ddd21d5d6","user":{"login":"dafeder","id":309671,"avatar_url":"https://avatars1.githubusercontent.com/u/309671?v=4","gravatar_id":"","url":"https://api.github.com/users/dafeder","html_url":"https://github.com/dafeder","followers_url":"https://api.github.com/users/dafeder/followers","following_url":"https://api.github.com/users/dafeder/following{/other_user}","gists_url":"https://api.github.com/users/dafeder/gists{/gist_id}","starred_url":"https://api.github.com/users/dafeder/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dafeder/subscriptions","organizations_url":"https://api.github.com/users/dafeder/orgs","repos_url":"https://api.github.com/users/dafeder/repos","events_url":"https://api.github.com/users/dafeder/events{/privacy}","received_events_url":"https://api.github.com/users/dafeder/received_events","type":"User","site_admin":false},"body":"Doing in separate ticket","created_at":"2018-05-18T15:07:12Z","updated_at":"2018-05-18T15:07:12Z","html_url":"https://github.com/GetDKAN/dkan/pull/2519#discussion_r189299950","pull_request_url":"https://api.github.com/repos/GetDKAN/dkan/pulls/2519","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/GetDKAN/dkan/pulls/comments/189299950"},"html":{"href":"https://github.com/GetDKAN/dkan/pull/2519#discussion_r189299950"},"pull_request":{"href":"https://api.github.com/repos/GetDKAN/dkan/pulls/2519"}},"in_reply_to_id":189115309},"pull_request":{"url":"https://api.github.com/repos/GetDKAN/dkan/pulls/2519","id":188580283,"html_url":"https://github.com/GetDKAN/dkan/pull/2519","diff_url":"https://github.com/GetDKAN/dkan/pull/2519.diff","patch_url":"https://github.com/GetDKAN/dkan/pull/2519.patch","issue_url":"https://api.github.com/repos/GetDKAN/dkan/issues/2519","number":2519,"state":"open","locked":false,"title":"Control datastore via REST API","user":{"login":"dafeder","id":309671,"avatar_url":"https://avatars1.githubusercontent.com/u/309671?v=4","gravatar_id":"","url":"https://api.github.com/users/dafeder","html_url":"https://github.com/dafeder","followers_url":"https://api.github.com/users/dafeder/followers","following_url":"https://api.github.com/users/dafeder/following{/other_user}","gists_url":"https://api.github.com/users/dafeder/gists{/gist_id}","starred_url":"https://api.github.com/users/dafeder/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dafeder/subscriptions","organizations_url":"https://api.github.com/users/dafeder/orgs","repos_url":"https://api.github.com/users/dafeder/repos","events_url":"https://api.github.com/users/dafeder/events{/privacy}","received_events_url":"https://api.github.com/users/dafeder/received_events","type":"User","site_admin":false},"body":"This adds an endpoint and resources for controling a _resource_ node's datastore via the REST API.\r\n\r\n## QA Steps\r\n\r\nUsing whatever means you prefer to test the API (I like Postman; [here is a collection that includes requests for all these QA steps](https://gist.github.com/dafeder/be673ea8e51845bf3a09645e2a718e97)), test the following actions, using the example of the \"Violent Crime Statistics By City\" resource:\r\n\r\n- [ ] Create datastore configuration: POST /api/dataset/datastore/19:\r\n\r\n```json\r\n{\r\n\t\"manager\": \"simple\",\r\n\t\"configuration\": {\r\n\t\t\"delimiter\": \",\",\r\n\t\t\"quote\": \"\\\"\",\r\n\t\t\"escape\": \"\\\\\"\r\n\t} \r\n}\r\n```\r\n\r\n- [ ] Retrieve datastore information: GET /api/dataset/datastore/19\r\n\r\n- [ ] Update datastore configuration: PUT /api/dataset/datastore/19: \r\n\r\n```json\r\n{\r\n\t\"configuration\": {\r\n\t\t\"delimiter\": \"|\",\r\n\t\t\"quote\": \"\\\"\",\r\n\t\t\"escape\": \"\\\\\"\r\n\t} \r\n}\r\n```\r\n(Also try enabling the fast import module and changing the `manager` property to `fast`; it should refuse)\r\n\r\n- [ ] Remove datastore: DELETE /api/dataset/datastore/19\r\n- [ ] Import datastore: POST /api/dataset/datastore/19/import\r\n- [ ] Drop datastore: POST /api/dataset/datastore/19/drop","created_at":"2018-05-16T22:40:39Z","updated_at":"2018-05-18T15:07:12Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b4854971837fcde7f0c83bf02130cc8f07b6a365","assignee":{"login":"dafeder","id":309671,"avatar_url":"https://avatars1.githubusercontent.com/u/309671?v=4","gravatar_id":"","url":"https://api.github.com/users/dafeder","html_url":"https://github.com/dafeder","followers_url":"https://api.github.com/users/dafeder/followers","following_url":"https://api.github.com/users/dafeder/following{/other_user}","gists_url":"https://api.github.com/users/dafeder/gists{/gist_id}","starred_url":"https://api.github.com/users/dafeder/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dafeder/subscriptions","organizations_url":"https://api.github.com/users/dafeder/orgs","repos_url":"https://api.github.com/users/dafeder/repos","events_url":"https://api.github.com/users/dafeder/events{/privacy}","received_events_url":"https://api.github.com/users/dafeder/received_events","type":"User","site_admin":false},"assignees":[{"login":"dafeder","id":309671,"avatar_url":"https://avatars1.githubusercontent.com/u/309671?v=4","gravatar_id":"","url":"https://api.github.com/users/dafeder","html_url":"https://github.com/dafeder","followers_url":"https://api.github.com/users/dafeder/followers","following_url":"https://api.github.com/users/dafeder/following{/other_user}","gists_url":"https://api.github.com/users/dafeder/gists{/gist_id}","starred_url":"https://api.github.com/users/dafeder/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dafeder/subscriptions","organizations_url":"https://api.github.com/users/dafeder/orgs","repos_url":"https://api.github.com/users/dafeder/repos","events_url":"https://api.github.com/users/dafeder/events{/privacy}","received_events_url":"https://api.github.com/users/dafeder/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":907603010,"url":"https://api.github.com/repos/GetDKAN/dkan/labels/Epic:%20Datastore%20control%20with%20API","name":"Epic: Datastore control with API","color":"9bf7e5","default":false},{"id":679223978,"url":"https://api.github.com/repos/GetDKAN/dkan/labels/in%20progress","name":"in progress","color":"ededed","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/GetDKAN/dkan/pulls/2519/commits","review_comments_url":"https://api.github.com/repos/GetDKAN/dkan/pulls/2519/comments","review_comment_url":"https://api.github.com/repos/GetDKAN/dkan/pulls/comments{/number}","comments_url":"https://api.github.com/repos/GetDKAN/dkan/issues/2519/comments","statuses_url":"https://api.github.com/repos/GetDKAN/dkan/statuses/d03b7ce8f0a9a643d9d946102481f7c5122f6f42","head":{"label":"dafeder:datastore-api-2","ref":"datastore-api-2","sha":"d03b7ce8f0a9a643d9d946102481f7c5122f6f42","user":{"login":"dafeder","id":309671,"avatar_url":"https://avatars1.githubusercontent.com/u/309671?v=4","gravatar_id":"","url":"https://api.github.com/users/dafeder","html_url":"https://github.com/dafeder","followers_url":"https://api.github.com/users/dafeder/followers","following_url":"https://api.github.com/users/dafeder/following{/other_user}","gists_url":"https://api.github.com/users/dafeder/gists{/gist_id}","starred_url":"https://api.github.com/users/dafeder/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dafeder/subscriptions","organizations_url":"https://api.github.com/users/dafeder/orgs","repos_url":"https://api.github.com/users/dafeder/repos","events_url":"https://api.github.com/users/dafeder/events{/privacy}","received_events_url":"https://api.github.com/users/dafeder/received_events","type":"User","site_admin":false},"repo":{"id":66312531,"name":"dkan","full_name":"dafeder/dkan","owner":{"login":"dafeder","id":309671,"avatar_url":"https://avatars1.githubusercontent.com/u/309671?v=4","gravatar_id":"","url":"https://api.github.com/users/dafeder","html_url":"https://github.com/dafeder","followers_url":"https://api.github.com/users/dafeder/followers","following_url":"https://api.github.com/users/dafeder/following{/other_user}","gists_url":"https://api.github.com/users/dafeder/gists{/gist_id}","starred_url":"https://api.github.com/users/dafeder/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dafeder/subscriptions","organizations_url":"https://api.github.com/users/dafeder/orgs","repos_url":"https://api.github.com/users/dafeder/repos","events_url":"https://api.github.com/users/dafeder/events{/privacy}","received_events_url":"https://api.github.com/users/dafeder/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/dafeder/dkan","description":"DKAN Open Data Portal. For a fully made version see: http://github.com/nucivic/dkan-drops-7","fork":true,"url":"https://api.github.com/repos/dafeder/dkan","forks_url":"https://api.github.com/repos/dafeder/dkan/forks","keys_url":"https://api.github.com/repos/dafeder/dkan/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dafeder/dkan/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dafeder/dkan/teams","hooks_url":"https://api.github.com/repos/dafeder/dkan/hooks","issue_events_url":"https://api.github.com/repos/dafeder/dkan/issues/events{/number}","events_url":"https://api.github.com/repos/dafeder/dkan/events","assignees_url":"https://api.github.com/repos/dafeder/dkan/assignees{/user}","branches_url":"https://api.github.com/repos/dafeder/dkan/branches{/branch}","tags_url":"https://api.github.com/repos/dafeder/dkan/tags","blobs_url":"https://api.github.com/repos/dafeder/dkan/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dafeder/dkan/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dafeder/dkan/git/refs{/sha}","trees_url":"https://api.github.com/repos/dafeder/dkan/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dafeder/dkan/statuses/{sha}","languages_url":"https://api.github.com/repos/dafeder/dkan/languages","stargazers_url":"https://api.github.com/repos/dafeder/dkan/stargazers","contributors_url":"https://api.github.com/repos/dafeder/dkan/contributors","subscribers_url":"https://api.github.com/repos/dafeder/dkan/subscribers","subscription_url":"https://api.github.com/repos/dafeder/dkan/subscription","commits_url":"https://api.github.com/repos/dafeder/dkan/commits{/sha}","git_commits_url":"https://api.github.com/repos/dafeder/dkan/git/commits{/sha}","comments_url":"https://api.github.com/repos/dafeder/dkan/comments{/number}","issue_comment_url":"https://api.github.com/repos/dafeder/dkan/issues/comments{/number}","contents_url":"https://api.github.com/repos/dafeder/dkan/contents/{+path}","compare_url":"https://api.github.com/repos/dafeder/dkan/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dafeder/dkan/merges","archive_url":"https://api.github.com/repos/dafeder/dkan/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dafeder/dkan/downloads","issues_url":"https://api.github.com/repos/dafeder/dkan/issues{/number}","pulls_url":"https://api.github.com/repos/dafeder/dkan/pulls{/number}","milestones_url":"https://api.github.com/repos/dafeder/dkan/milestones{/number}","notifications_url":"https://api.github.com/repos/dafeder/dkan/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dafeder/dkan/labels{/name}","releases_url":"https://api.github.com/repos/dafeder/dkan/releases{/id}","deployments_url":"https://api.github.com/repos/dafeder/dkan/deployments","created_at":"2016-08-22T22:23:16Z","updated_at":"2018-05-17T21:35:55Z","pushed_at":"2018-05-18T15:06:38Z","git_url":"git://github.com/dafeder/dkan.git","ssh_url":"git@github.com:dafeder/dkan.git","clone_url":"https://github.com/dafeder/dkan.git","svn_url":"https://github.com/dafeder/dkan","homepage":"","size":100110,"stargazers_count":0,"watchers_count":0,"language":"PHP","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"gpl-2.0","name":"GNU General Public License v2.0","spdx_id":"GPL-2.0","url":"https://api.github.com/licenses/gpl-2.0"},"forks":0,"open_issues":1,"watchers":0,"default_branch":"7.x-1.x"}},"base":{"label":"GetDKAN:datastore-improvements","ref":"datastore-improvements","sha":"b7c76bee7b57ee22d7e5dfe908f319118a88a234","user":{"login":"GetDKAN","id":25395768,"avatar_url":"https://avatars3.githubusercontent.com/u/25395768?v=4","gravatar_id":"","url":"https://api.github.com/users/GetDKAN","html_url":"https://github.com/GetDKAN","followers_url":"https://api.github.com/users/GetDKAN/followers","following_url":"https://api.github.com/users/GetDKAN/following{/other_user}","gists_url":"https://api.github.com/users/GetDKAN/gists{/gist_id}","starred_url":"https://api.github.com/users/GetDKAN/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GetDKAN/subscriptions","organizations_url":"https://api.github.com/users/GetDKAN/orgs","repos_url":"https://api.github.com/users/GetDKAN/repos","events_url":"https://api.github.com/users/GetDKAN/events{/privacy}","received_events_url":"https://api.github.com/users/GetDKAN/received_events","type":"Organization","site_admin":false},"repo":{"id":9308581,"name":"dkan","full_name":"GetDKAN/dkan","owner":{"login":"GetDKAN","id":25395768,"avatar_url":"https://avatars3.githubusercontent.com/u/25395768?v=4","gravatar_id":"","url":"https://api.github.com/users/GetDKAN","html_url":"https://github.com/GetDKAN","followers_url":"https://api.github.com/users/GetDKAN/followers","following_url":"https://api.github.com/users/GetDKAN/following{/other_user}","gists_url":"https://api.github.com/users/GetDKAN/gists{/gist_id}","starred_url":"https://api.github.com/users/GetDKAN/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GetDKAN/subscriptions","organizations_url":"https://api.github.com/users/GetDKAN/orgs","repos_url":"https://api.github.com/users/GetDKAN/repos","events_url":"https://api.github.com/users/GetDKAN/events{/privacy}","received_events_url":"https://api.github.com/users/GetDKAN/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/GetDKAN/dkan","description":"DKAN Open Data Portal","fork":false,"url":"https://api.github.com/repos/GetDKAN/dkan","forks_url":"https://api.github.com/repos/GetDKAN/dkan/forks","keys_url":"https://api.github.com/repos/GetDKAN/dkan/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GetDKAN/dkan/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GetDKAN/dkan/teams","hooks_url":"https://api.github.com/repos/GetDKAN/dkan/hooks","issue_events_url":"https://api.github.com/repos/GetDKAN/dkan/issues/events{/number}","events_url":"https://api.github.com/repos/GetDKAN/dkan/events","assignees_url":"https://api.github.com/repos/GetDKAN/dkan/assignees{/user}","branches_url":"https://api.github.com/repos/GetDKAN/dkan/branches{/branch}","tags_url":"https://api.github.com/repos/GetDKAN/dkan/tags","blobs_url":"https://api.github.com/repos/GetDKAN/dkan/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GetDKAN/dkan/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GetDKAN/dkan/git/refs{/sha}","trees_url":"https://api.github.com/repos/GetDKAN/dkan/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GetDKAN/dkan/statuses/{sha}","languages_url":"https://api.github.com/repos/GetDKAN/dkan/languages","stargazers_url":"https://api.github.com/repos/GetDKAN/dkan/stargazers","contributors_url":"https://api.github.com/repos/GetDKAN/dkan/contributors","subscribers_url":"https://api.github.com/repos/GetDKAN/dkan/subscribers","subscription_url":"https://api.github.com/repos/GetDKAN/dkan/subscription","commits_url":"https://api.github.com/repos/GetDKAN/dkan/commits{/sha}","git_commits_url":"https://api.github.com/repos/GetDKAN/dkan/git/commits{/sha}","comments_url":"https://api.github.com/repos/GetDKAN/dkan/comments{/number}","issue_comment_url":"https://api.github.com/repos/GetDKAN/dkan/issues/comments{/number}","contents_url":"https://api.github.com/repos/GetDKAN/dkan/contents/{+path}","compare_url":"https://api.github.com/repos/GetDKAN/dkan/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GetDKAN/dkan/merges","archive_url":"https://api.github.com/repos/GetDKAN/dkan/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GetDKAN/dkan/downloads","issues_url":"https://api.github.com/repos/GetDKAN/dkan/issues{/number}","pulls_url":"https://api.github.com/repos/GetDKAN/dkan/pulls{/number}","milestones_url":"https://api.github.com/repos/GetDKAN/dkan/milestones{/number}","notifications_url":"https://api.github.com/repos/GetDKAN/dkan/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GetDKAN/dkan/labels{/name}","releases_url":"https://api.github.com/repos/GetDKAN/dkan/releases{/id}","deployments_url":"https://api.github.com/repos/GetDKAN/dkan/deployments","created_at":"2013-04-08T22:54:12Z","updated_at":"2018-05-17T22:40:37Z","pushed_at":"2018-05-18T15:06:40Z","git_url":"git://github.com/GetDKAN/dkan.git","ssh_url":"git@github.com:GetDKAN/dkan.git","clone_url":"https://github.com/GetDKAN/dkan.git","svn_url":"https://github.com/GetDKAN/dkan","homepage":"https://getdkan.org","size":100633,"stargazers_count":205,"watchers_count":205,"language":"PHP","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":119,"mirror_url":null,"archived":false,"open_issues_count":279,"license":{"key":"gpl-2.0","name":"GNU General Public License v2.0","spdx_id":"GPL-2.0","url":"https://api.github.com/licenses/gpl-2.0"},"forks":119,"open_issues":279,"watchers":205,"default_branch":"7.x-1.x"}},"_links":{"self":{"href":"https://api.github.com/repos/GetDKAN/dkan/pulls/2519"},"html":{"href":"https://github.com/GetDKAN/dkan/pull/2519"},"issue":{"href":"https://api.github.com/repos/GetDKAN/dkan/issues/2519"},"comments":{"href":"https://api.github.com/repos/GetDKAN/dkan/issues/2519/comments"},"review_comments":{"href":"https://api.github.com/repos/GetDKAN/dkan/pulls/2519/comments"},"review_comment":{"href":"https://api.github.com/repos/GetDKAN/dkan/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/GetDKAN/dkan/pulls/2519/commits"},"statuses":{"href":"https://api.github.com/repos/GetDKAN/dkan/statuses/d03b7ce8f0a9a643d9d946102481f7c5122f6f42"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"dafeder"}}