{"action":"created","comment":{"url":"https://api.github.com/repos/open-craft/blockstore/pulls/comments/238295011","pull_request_review_id":180799132,"id":238295011,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzODI5NTAxMQ==","diff_hunk":"@@ -0,0 +1,120 @@\n+\"\"\"\n+FieldSets for search app.\n+\"\"\"\n+\n+from elasticsearch_dsl import (\n+    Keyword,\n+    InnerDoc,\n+    Integer,\n+    Text,\n+)\n+\n+from rest_framework import serializers\n+\n+from .core.fieldsets import FieldSet\n+from .core.serializers import FieldSetSerializer\n+\n+\n+class EntityFieldSet(FieldSet):\n+    \"\"\"\n+    FieldSet for core data of the entity.\n+    \"\"\"\n+\n+    name = 'entity'\n+\n+    class Document(InnerDoc):\n+\n+        type = Keyword()\n+        id = Keyword()  # Since ids of different types of entities may conflict, we do not store them in id field.","path":"blockstore/apps/search/fieldsets.py","position":28,"original_position":28,"commit_id":"8b70ed440eb0ed012c4cf0a8b1b7c3c7b82f85fb","original_commit_id":"8b70ed440eb0ed012c4cf0a8b1b7c3c7b82f85fb","user":{"login":"symbolist","id":5305552,"node_id":"MDQ6VXNlcjUzMDU1NTI=","avatar_url":"https://avatars2.githubusercontent.com/u/5305552?v=4","gravatar_id":"","url":"https://api.github.com/users/symbolist","html_url":"https://github.com/symbolist","followers_url":"https://api.github.com/users/symbolist/followers","following_url":"https://api.github.com/users/symbolist/following{/other_user}","gists_url":"https://api.github.com/users/symbolist/gists{/gist_id}","starred_url":"https://api.github.com/users/symbolist/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/symbolist/subscriptions","organizations_url":"https://api.github.com/users/symbolist/orgs","repos_url":"https://api.github.com/users/symbolist/repos","events_url":"https://api.github.com/users/symbolist/events{/privacy}","received_events_url":"https://api.github.com/users/symbolist/received_events","type":"User","site_admin":false},"body":"Sorry, I meant to say \"Since ids of different types of entities may conflict, we do not store them in the base document id field since that needs to be unique.\" \r\n","created_at":"2018-12-03T14:45:02Z","updated_at":"2018-12-03T14:45:02Z","html_url":"https://github.com/open-craft/blockstore/pull/20#discussion_r238295011","pull_request_url":"https://api.github.com/repos/open-craft/blockstore/pulls/20","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/open-craft/blockstore/pulls/comments/238295011"},"html":{"href":"https://github.com/open-craft/blockstore/pull/20#discussion_r238295011"},"pull_request":{"href":"https://api.github.com/repos/open-craft/blockstore/pulls/20"}},"in_reply_to_id":238126206},"pull_request":{"url":"https://api.github.com/repos/open-craft/blockstore/pulls/20","id":231805155,"node_id":"MDExOlB1bGxSZXF1ZXN0MjMxODA1MTU1","html_url":"https://github.com/open-craft/blockstore/pull/20","diff_url":"https://github.com/open-craft/blockstore/pull/20.diff","patch_url":"https://github.com/open-craft/blockstore/pull/20.patch","issue_url":"https://api.github.com/repos/open-craft/blockstore/issues/20","number":20,"state":"open","locked":false,"title":"Init search engine.","user":{"login":"symbolist","id":5305552,"node_id":"MDQ6VXNlcjUzMDU1NTI=","avatar_url":"https://avatars2.githubusercontent.com/u/5305552?v=4","gravatar_id":"","url":"https://api.github.com/users/symbolist","html_url":"https://github.com/symbolist","followers_url":"https://api.github.com/users/symbolist/followers","following_url":"https://api.github.com/users/symbolist/following{/other_user}","gists_url":"https://api.github.com/users/symbolist/gists{/gist_id}","starred_url":"https://api.github.com/users/symbolist/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/symbolist/subscriptions","organizations_url":"https://api.github.com/users/symbolist/orgs","repos_url":"https://api.github.com/users/symbolist/repos","events_url":"https://api.github.com/users/symbolist/events{/privacy}","received_events_url":"https://api.github.com/users/symbolist/received_events","type":"User","site_admin":false},"body":"## Description\r\n\r\nThis is the first iteration of search capabilities in Blockstore. It adds the following:\r\n\r\n- An index and document mapping which can store the data needed for first version of LX search.\r\n- A REST API which can be used to create, edit and delete ES documents in the default index and to query them.\r\n\r\n## Author Comments, Concerns, and Open Questions\r\n\r\n- This has the minimum amount of functionality needed for the first prototype of the LX search interface. A lot more will be added once we are clear what the data sources are going to be, what the shape of the ownership, authorship, and permissions data is going to be and what query patterns will need to be supported.\r\n- ES queries are described in JSON and ES [expects](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html) queries to use a GET request with a body (it does support a query parameters format but that is very limited) . I tried to get [django-elasticsearch-dsl-drf](https://django-elasticsearch-dsl-drf.readthedocs.io/en/0.16.3/filtering_usage_examples.html) integrated as well as to come up with a query parameters format for the ES Query DSL. However, the DSL is quite complex with many capabilities and at this point it is not clear what subset we would want the REST API to be restricted to. So decided to go with POST request to `/index/<index_name>/search/` which forwards the query to ES and returns the response. At the later stage once we have more clarity about the query patterns we can look into if we can achieve all those with a GET request.\r\n- Changing the mapping of a field in an index, requires creating a new index and re-indexing that data into it. Index aliases are used to make this work seamlessly. Support will need to be added for migrations. An option is to use [`django-elastic-migrations`](https://github.com/HBS-HBX/django-elastic-migrations). But in any case some changes will need to be made to the index and document classes.\r\n- ES is not supposed to be [primary storage](https://www.elastic.co/guide/en/elasticsearch/resiliency/current/index.html). We will need to figure out how to re-acquire all the data that is going to be in an index in case there is a loss.\r\n\r\n## Test Instructions\r\n\r\nTo play around with the API:\r\n\r\n- Visit http://localhost:18250/api/v1/index/blocks/ to create, view, edit and delete documents. The DRF HTML form can be used to create and edit the data in a document. For some request examples, see `/blockstore/apps/search/tests/test_views.py`.\r\n- Visit http://localhost:18250/api/v1/index/blocks/ and POST a query from the DRF \"Raw data\" form. The import query parameters are:\r\n  - https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-query.html\r\n  - https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-from-size.html\r\n  - https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-sort.html\r\n  - https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-post-filter.html\r\n\r\nExamples:\r\n\r\nThis will return documents whose `summary.title` or `summary.description` fields contain the search term sorted in descending order by the `_score` (this is a numeric value assigned to the result by ES). `from` indicates the response should contain results from the i-th result and `size` indicates the number of results to return in the request.\r\n\r\n```\r\n{\r\n  \"from\" : 0, \"size\" : 5,\r\n  \"sort\" : [\r\n    { \"_score\" : \"desc\" }\r\n  ],\r\n  \"query\": {\r\n    \"bool\": { \r\n      \"should\": [\r\n        { \"match\": { \"summary.title\":   \"<query>\" }}, \r\n        { \"match\": { \"summary.description\": \"<query>\" }}  \r\n      ]\r\n    }\r\n  }\r\n}\r\n``` \r\n\r\nTo include counts for the facets we can add aggregations.\r\n\r\n```\r\n{\r\n  \"from\" : 0, \"size\" : 5,\r\n  \"sort\" : [\r\n    { \"_score\" : \"desc\" }\r\n  ],\r\n  \"query\": {\r\n    \"bool\": { \r\n      \"should\": [\r\n        { \"match\": { \"summary.title\":   \"<query>\" }}, \r\n        { \"match\": { \"summary.description\": \"<query>\" }}  \r\n      ]\r\n    }\r\n  },\r\n \"aggs\": {\r\n    \"ownership\": {\r\n      \"terms\": { \"field\": \"ownership.org_id\" } \r\n    },\r\n    \"tags\": {\r\n      \"terms\": { \"field\": \"tags.paths\" } \r\n    }\r\n  }\r\n}\r\n```\r\n\r\nThe response will then contain an `aggregations` field with the data for the buckets:\r\n```\r\n \"aggregations\": {\r\n        \"ownership\": {\r\n            \"doc_count_error_upper_bound\": 0,\r\n            \"sum_other_doc_count\": 0,\r\n            \"buckets\": [\r\n                {\r\n                    \"key\": \"edX\",\r\n                    \"doc_count\": 3\r\n                },\r\n                {\r\n                    \"key\": \"OpenCraft\",\r\n                    \"doc_count\": 1\r\n                }\r\n            ]\r\n        },\r\n        \"tags\": {\r\n            \"doc_count_error_upper_bound\": 0,\r\n            \"sum_other_doc_count\": 0,\r\n            \"buckets\": [\r\n                {\r\n                    \"key\": \"chemistry\",\r\n                    \"doc_count\": 2\r\n                },\r\n                {\r\n                    \"key\": \"green\",\r\n                    \"doc_count\": 2\r\n                },\r\n                {\r\n                    \"key\": \"physics\",\r\n                    \"doc_count\": 2\r\n                },\r\n                {\r\n                    \"key\": \"astronomy\",\r\n                    \"doc_count\": 1\r\n                },\r\n                {\r\n                    \"key\": \"red\",\r\n                    \"doc_count\": 1\r\n                }\r\n            ]\r\n        }\r\n    },\r\n```","created_at":"2018-11-18T18:32:23Z","updated_at":"2018-12-03T14:45:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"130bb06a36a4740e54af10158426fbd768d8cc3b","assignee":null,"assignees":[],"requested_reviewers":[{"login":"ormsbee","id":41625,"node_id":"MDQ6VXNlcjQxNjI1","avatar_url":"https://avatars1.githubusercontent.com/u/41625?v=4","gravatar_id":"","url":"https://api.github.com/users/ormsbee","html_url":"https://github.com/ormsbee","followers_url":"https://api.github.com/users/ormsbee/followers","following_url":"https://api.github.com/users/ormsbee/following{/other_user}","gists_url":"https://api.github.com/users/ormsbee/gists{/gist_id}","starred_url":"https://api.github.com/users/ormsbee/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ormsbee/subscriptions","organizations_url":"https://api.github.com/users/ormsbee/orgs","repos_url":"https://api.github.com/users/ormsbee/repos","events_url":"https://api.github.com/users/ormsbee/events{/privacy}","received_events_url":"https://api.github.com/users/ormsbee/received_events","type":"User","site_admin":false},{"login":"pomegranited","id":7556571,"node_id":"MDQ6VXNlcjc1NTY1NzE=","avatar_url":"https://avatars3.githubusercontent.com/u/7556571?v=4","gravatar_id":"","url":"https://api.github.com/users/pomegranited","html_url":"https://github.com/pomegranited","followers_url":"https://api.github.com/users/pomegranited/followers","following_url":"https://api.github.com/users/pomegranited/following{/other_user}","gists_url":"https://api.github.com/users/pomegranited/gists{/gist_id}","starred_url":"https://api.github.com/users/pomegranited/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pomegranited/subscriptions","organizations_url":"https://api.github.com/users/pomegranited/orgs","repos_url":"https://api.github.com/users/pomegranited/repos","events_url":"https://api.github.com/users/pomegranited/events{/privacy}","received_events_url":"https://api.github.com/users/pomegranited/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/open-craft/blockstore/pulls/20/commits","review_comments_url":"https://api.github.com/repos/open-craft/blockstore/pulls/20/comments","review_comment_url":"https://api.github.com/repos/open-craft/blockstore/pulls/comments{/number}","comments_url":"https://api.github.com/repos/open-craft/blockstore/issues/20/comments","statuses_url":"https://api.github.com/repos/open-craft/blockstore/statuses/8b70ed440eb0ed012c4cf0a8b1b7c3c7b82f85fb","head":{"label":"open-craft:symbolist/search","ref":"symbolist/search","sha":"8b70ed440eb0ed012c4cf0a8b1b7c3c7b82f85fb","user":{"login":"open-craft","id":7414786,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc0MTQ3ODY=","avatar_url":"https://avatars0.githubusercontent.com/u/7414786?v=4","gravatar_id":"","url":"https://api.github.com/users/open-craft","html_url":"https://github.com/open-craft","followers_url":"https://api.github.com/users/open-craft/followers","following_url":"https://api.github.com/users/open-craft/following{/other_user}","gists_url":"https://api.github.com/users/open-craft/gists{/gist_id}","starred_url":"https://api.github.com/users/open-craft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/open-craft/subscriptions","organizations_url":"https://api.github.com/users/open-craft/orgs","repos_url":"https://api.github.com/users/open-craft/repos","events_url":"https://api.github.com/users/open-craft/events{/privacy}","received_events_url":"https://api.github.com/users/open-craft/received_events","type":"Organization","site_admin":false},"repo":{"id":132993293,"node_id":"MDEwOlJlcG9zaXRvcnkxMzI5OTMyOTM=","name":"blockstore","full_name":"open-craft/blockstore","private":false,"owner":{"login":"open-craft","id":7414786,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc0MTQ3ODY=","avatar_url":"https://avatars0.githubusercontent.com/u/7414786?v=4","gravatar_id":"","url":"https://api.github.com/users/open-craft","html_url":"https://github.com/open-craft","followers_url":"https://api.github.com/users/open-craft/followers","following_url":"https://api.github.com/users/open-craft/following{/other_user}","gists_url":"https://api.github.com/users/open-craft/gists{/gist_id}","starred_url":"https://api.github.com/users/open-craft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/open-craft/subscriptions","organizations_url":"https://api.github.com/users/open-craft/orgs","repos_url":"https://api.github.com/users/open-craft/repos","events_url":"https://api.github.com/users/open-craft/events{/privacy}","received_events_url":"https://api.github.com/users/open-craft/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/open-craft/blockstore","description":"Open edX Learning Object Repository","fork":false,"url":"https://api.github.com/repos/open-craft/blockstore","forks_url":"https://api.github.com/repos/open-craft/blockstore/forks","keys_url":"https://api.github.com/repos/open-craft/blockstore/keys{/key_id}","collaborators_url":"https://api.github.com/repos/open-craft/blockstore/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/open-craft/blockstore/teams","hooks_url":"https://api.github.com/repos/open-craft/blockstore/hooks","issue_events_url":"https://api.github.com/repos/open-craft/blockstore/issues/events{/number}","events_url":"https://api.github.com/repos/open-craft/blockstore/events","assignees_url":"https://api.github.com/repos/open-craft/blockstore/assignees{/user}","branches_url":"https://api.github.com/repos/open-craft/blockstore/branches{/branch}","tags_url":"https://api.github.com/repos/open-craft/blockstore/tags","blobs_url":"https://api.github.com/repos/open-craft/blockstore/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/open-craft/blockstore/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/open-craft/blockstore/git/refs{/sha}","trees_url":"https://api.github.com/repos/open-craft/blockstore/git/trees{/sha}","statuses_url":"https://api.github.com/repos/open-craft/blockstore/statuses/{sha}","languages_url":"https://api.github.com/repos/open-craft/blockstore/languages","stargazers_url":"https://api.github.com/repos/open-craft/blockstore/stargazers","contributors_url":"https://api.github.com/repos/open-craft/blockstore/contributors","subscribers_url":"https://api.github.com/repos/open-craft/blockstore/subscribers","subscription_url":"https://api.github.com/repos/open-craft/blockstore/subscription","commits_url":"https://api.github.com/repos/open-craft/blockstore/commits{/sha}","git_commits_url":"https://api.github.com/repos/open-craft/blockstore/git/commits{/sha}","comments_url":"https://api.github.com/repos/open-craft/blockstore/comments{/number}","issue_comment_url":"https://api.github.com/repos/open-craft/blockstore/issues/comments{/number}","contents_url":"https://api.github.com/repos/open-craft/blockstore/contents/{+path}","compare_url":"https://api.github.com/repos/open-craft/blockstore/compare/{base}...{head}","merges_url":"https://api.github.com/repos/open-craft/blockstore/merges","archive_url":"https://api.github.com/repos/open-craft/blockstore/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/open-craft/blockstore/downloads","issues_url":"https://api.github.com/repos/open-craft/blockstore/issues{/number}","pulls_url":"https://api.github.com/repos/open-craft/blockstore/pulls{/number}","milestones_url":"https://api.github.com/repos/open-craft/blockstore/milestones{/number}","notifications_url":"https://api.github.com/repos/open-craft/blockstore/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/open-craft/blockstore/labels{/name}","releases_url":"https://api.github.com/repos/open-craft/blockstore/releases{/id}","deployments_url":"https://api.github.com/repos/open-craft/blockstore/deployments","created_at":"2018-05-11T05:26:12Z","updated_at":"2018-11-29T16:42:09Z","pushed_at":"2018-12-02T08:02:10Z","git_url":"git://github.com/open-craft/blockstore.git","ssh_url":"git@github.com:open-craft/blockstore.git","clone_url":"https://github.com/open-craft/blockstore.git","svn_url":"https://github.com/open-craft/blockstore","homepage":null,"size":277,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":7,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0","node_id":"MDc6TGljZW5zZTE="},"forks":0,"open_issues":7,"watchers":0,"default_branch":"master"}},"base":{"label":"open-craft:master","ref":"master","sha":"81e3c9840a779fee0e426359ca7ee15b8a60ce33","user":{"login":"open-craft","id":7414786,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc0MTQ3ODY=","avatar_url":"https://avatars0.githubusercontent.com/u/7414786?v=4","gravatar_id":"","url":"https://api.github.com/users/open-craft","html_url":"https://github.com/open-craft","followers_url":"https://api.github.com/users/open-craft/followers","following_url":"https://api.github.com/users/open-craft/following{/other_user}","gists_url":"https://api.github.com/users/open-craft/gists{/gist_id}","starred_url":"https://api.github.com/users/open-craft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/open-craft/subscriptions","organizations_url":"https://api.github.com/users/open-craft/orgs","repos_url":"https://api.github.com/users/open-craft/repos","events_url":"https://api.github.com/users/open-craft/events{/privacy}","received_events_url":"https://api.github.com/users/open-craft/received_events","type":"Organization","site_admin":false},"repo":{"id":132993293,"node_id":"MDEwOlJlcG9zaXRvcnkxMzI5OTMyOTM=","name":"blockstore","full_name":"open-craft/blockstore","private":false,"owner":{"login":"open-craft","id":7414786,"node_id":"MDEyOk9yZ2FuaXphdGlvbjc0MTQ3ODY=","avatar_url":"https://avatars0.githubusercontent.com/u/7414786?v=4","gravatar_id":"","url":"https://api.github.com/users/open-craft","html_url":"https://github.com/open-craft","followers_url":"https://api.github.com/users/open-craft/followers","following_url":"https://api.github.com/users/open-craft/following{/other_user}","gists_url":"https://api.github.com/users/open-craft/gists{/gist_id}","starred_url":"https://api.github.com/users/open-craft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/open-craft/subscriptions","organizations_url":"https://api.github.com/users/open-craft/orgs","repos_url":"https://api.github.com/users/open-craft/repos","events_url":"https://api.github.com/users/open-craft/events{/privacy}","received_events_url":"https://api.github.com/users/open-craft/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/open-craft/blockstore","description":"Open edX Learning Object Repository","fork":false,"url":"https://api.github.com/repos/open-craft/blockstore","forks_url":"https://api.github.com/repos/open-craft/blockstore/forks","keys_url":"https://api.github.com/repos/open-craft/blockstore/keys{/key_id}","collaborators_url":"https://api.github.com/repos/open-craft/blockstore/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/open-craft/blockstore/teams","hooks_url":"https://api.github.com/repos/open-craft/blockstore/hooks","issue_events_url":"https://api.github.com/repos/open-craft/blockstore/issues/events{/number}","events_url":"https://api.github.com/repos/open-craft/blockstore/events","assignees_url":"https://api.github.com/repos/open-craft/blockstore/assignees{/user}","branches_url":"https://api.github.com/repos/open-craft/blockstore/branches{/branch}","tags_url":"https://api.github.com/repos/open-craft/blockstore/tags","blobs_url":"https://api.github.com/repos/open-craft/blockstore/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/open-craft/blockstore/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/open-craft/blockstore/git/refs{/sha}","trees_url":"https://api.github.com/repos/open-craft/blockstore/git/trees{/sha}","statuses_url":"https://api.github.com/repos/open-craft/blockstore/statuses/{sha}","languages_url":"https://api.github.com/repos/open-craft/blockstore/languages","stargazers_url":"https://api.github.com/repos/open-craft/blockstore/stargazers","contributors_url":"https://api.github.com/repos/open-craft/blockstore/contributors","subscribers_url":"https://api.github.com/repos/open-craft/blockstore/subscribers","subscription_url":"https://api.github.com/repos/open-craft/blockstore/subscription","commits_url":"https://api.github.com/repos/open-craft/blockstore/commits{/sha}","git_commits_url":"https://api.github.com/repos/open-craft/blockstore/git/commits{/sha}","comments_url":"https://api.github.com/repos/open-craft/blockstore/comments{/number}","issue_comment_url":"https://api.github.com/repos/open-craft/blockstore/issues/comments{/number}","contents_url":"https://api.github.com/repos/open-craft/blockstore/contents/{+path}","compare_url":"https://api.github.com/repos/open-craft/blockstore/compare/{base}...{head}","merges_url":"https://api.github.com/repos/open-craft/blockstore/merges","archive_url":"https://api.github.com/repos/open-craft/blockstore/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/open-craft/blockstore/downloads","issues_url":"https://api.github.com/repos/open-craft/blockstore/issues{/number}","pulls_url":"https://api.github.com/repos/open-craft/blockstore/pulls{/number}","milestones_url":"https://api.github.com/repos/open-craft/blockstore/milestones{/number}","notifications_url":"https://api.github.com/repos/open-craft/blockstore/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/open-craft/blockstore/labels{/name}","releases_url":"https://api.github.com/repos/open-craft/blockstore/releases{/id}","deployments_url":"https://api.github.com/repos/open-craft/blockstore/deployments","created_at":"2018-05-11T05:26:12Z","updated_at":"2018-11-29T16:42:09Z","pushed_at":"2018-12-02T08:02:10Z","git_url":"git://github.com/open-craft/blockstore.git","ssh_url":"git@github.com:open-craft/blockstore.git","clone_url":"https://github.com/open-craft/blockstore.git","svn_url":"https://github.com/open-craft/blockstore","homepage":null,"size":277,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":7,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0","node_id":"MDc6TGljZW5zZTE="},"forks":0,"open_issues":7,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/open-craft/blockstore/pulls/20"},"html":{"href":"https://github.com/open-craft/blockstore/pull/20"},"issue":{"href":"https://api.github.com/repos/open-craft/blockstore/issues/20"},"comments":{"href":"https://api.github.com/repos/open-craft/blockstore/issues/20/comments"},"review_comments":{"href":"https://api.github.com/repos/open-craft/blockstore/pulls/20/comments"},"review_comment":{"href":"https://api.github.com/repos/open-craft/blockstore/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/open-craft/blockstore/pulls/20/commits"},"statuses":{"href":"https://api.github.com/repos/open-craft/blockstore/statuses/8b70ed440eb0ed012c4cf0a8b1b7c3c7b82f85fb"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"symbolist"}}