{"action":"created","comment":{"url":"https://api.github.com/repos/productml/blurr/pulls/comments/185632416","pull_request_review_id":117026356,"id":185632416,"diff_hunk":"@@ -1,54 +1,111 @@\n from typing import Dict, Any\n \n import yaml\n-from pytest import fixture, mark\n+from pytest import fixture\n \n-from blurr.core.base import BaseSchema\n+from blurr.core.base import BaseSchema, BaseSchemaCollection\n+from blurr.core.errors import RequiredAttributeError, EmptyAttributeError, InvalidIdentifierError\n from blurr.core.evaluation import Expression, EvaluationContext\n from blurr.core.schema_loader import SchemaLoader\n \n-TEST_SCHEMA_SPEC = '''\n-Name: TestField\n-Type: integer\n-When: True == True\n-'''\n-\n \n @fixture\n-def test_schema_spec():\n-    return yaml.load(TEST_SCHEMA_SPEC)\n+def schema_spec():\n+    return yaml.load('''\n+        Name: TestField\n+        Type: integer\n+        When: True == True\n+        ''')\n \n \n-@mark.skip(reason='Abstract base class implementation for testing')\n-class TestSchema(BaseSchema):\n-    \"\"\"\n-    This class is to test abstract behavior, and thus, adds no functionality\n-    \"\"\"\n+@fixture\n+def invalid_schema_spec():\n+    return yaml.load('''\n+        Name: _TestField\n+        Type: integer\n+        When: ''\n+        ''')\n \n-    def load(self) -> None:\n-        pass\n \n-    def validate(self, spec: Dict[str, Any]):\n-        pass\n+class MockSchema(BaseSchema):\n+    pass\n \n \n-def get_test_schema(schema_spec: Dict[str, Any]) -> TestSchema:\n+def get_test_schema(schema_spec: Dict[str, Any]) -> MockSchema:\n     schema_loader = SchemaLoader()\n-    name = schema_loader.add_schema(schema_spec)\n-    return TestSchema(name, schema_loader)\n+    name = schema_loader.add_schema_spec(schema_spec)\n+    return MockSchema(name, schema_loader)\n \n \n-def test_base_schema_with_all_attributes(test_schema_spec: Dict[str, Any]) -> None:\n-    test_schema = get_test_schema(test_schema_spec)\n-    assert test_schema.name == test_schema_spec[BaseSchema.ATTRIBUTE_NAME]\n-    assert test_schema.type == test_schema_spec[BaseSchema.ATTRIBUTE_TYPE]\n+def test_base_schema_with_all_attributes(schema_spec: Dict[str, Any]):\n+    test_schema = get_test_schema(schema_spec)\n+    assert test_schema.name == schema_spec[BaseSchema.ATTRIBUTE_NAME]\n+    assert test_schema.type == schema_spec[BaseSchema.ATTRIBUTE_TYPE]\n     assert isinstance(test_schema.when, Expression)\n     assert test_schema.when.evaluate(EvaluationContext())\n \n \n-def test_base_schema_with_no_attribute_when(test_schema_spec: Dict[str, Any]) -> None:\n-    del test_schema_spec[BaseSchema.ATTRIBUTE_WHEN]\n-    test_schema = get_test_schema(test_schema_spec)\n-    assert test_schema.name == test_schema_spec[BaseSchema.ATTRIBUTE_NAME]\n-    assert test_schema.type == test_schema_spec[BaseSchema.ATTRIBUTE_TYPE]\n+def test_base_schema_with_no_attribute_when(schema_spec: Dict[str, Any]):\n+    del schema_spec[BaseSchema.ATTRIBUTE_WHEN]\n+    test_schema = get_test_schema(schema_spec)\n+    assert test_schema.name == schema_spec[BaseSchema.ATTRIBUTE_NAME]\n+    assert test_schema.type == schema_spec[BaseSchema.ATTRIBUTE_TYPE]\n     assert test_schema.when is None\n+\n+\n+def test_base_schema_validate_schema_spec_missing_type_and_empty_when(\n+        invalid_schema_spec: Dict[str, Any]):\n+    schema = get_test_schema(invalid_schema_spec)\n+\n+    assert len(schema.errors) == 2\n+    assert isinstance(schema.errors[0], EmptyAttributeError)\n+    assert schema.errors[0].attribute == 'When'\n+    assert isinstance(schema.errors[1], InvalidIdentifierError)\n+    assert schema.errors[1].attribute == 'Name'\n+\n+\n+@fixture\n+def schema_collection_spec():\n+    return yaml.load('''\n+        Name: TestAggregate\n+        Type: Aggregate\n+        When: True == True\n+        Fields:\n+            - Name: TestField\n+              Type: integer\n+              Value: 1\n+        ''')\n+\n+\n+class MockSchemaCollection(BaseSchemaCollection):\n+    pass\n+\n+\n+def test_schema_collection_valid(schema_collection_spec: Dict[str, Any]):\n+    schema_loader = SchemaLoader()\n+    name = schema_loader.add_schema_spec(schema_collection_spec)\n+    schema = MockSchemaCollection(name, schema_loader, 'Fields')\n+    assert not schema.errors\n+\n+\n+def test_schema_collection_missing_nested_attribute_adds_error(\n+        schema_collection_spec: Dict[str, Any]):\n+    schema_loader = SchemaLoader()\n+    name = schema_loader.add_schema_spec(schema_collection_spec)\n+    schema = MockSchemaCollection(name, schema_loader, 'MissingNested')\n+\n+    assert 1 == len(schema.errors)\n+    assert isinstance(schema.errors[0], RequiredAttributeError)\n+    assert 'MissingNested' == schema.errors[0].attribute","path":"tests/core/base_schema_test.py","position":130,"original_position":130,"commit_id":"a43de5af22f206a2d9cb565f9adb539fca051aaa","original_commit_id":"a43de5af22f206a2d9cb565f9adb539fca051aaa","user":{"login":"prashastk","id":33844340,"avatar_url":"https://avatars0.githubusercontent.com/u/33844340?v=4","gravatar_id":"","url":"https://api.github.com/users/prashastk","html_url":"https://github.com/prashastk","followers_url":"https://api.github.com/users/prashastk/followers","following_url":"https://api.github.com/users/prashastk/following{/other_user}","gists_url":"https://api.github.com/users/prashastk/gists{/gist_id}","starred_url":"https://api.github.com/users/prashastk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prashastk/subscriptions","organizations_url":"https://api.github.com/users/prashastk/orgs","repos_url":"https://api.github.com/users/prashastk/repos","events_url":"https://api.github.com/users/prashastk/events{/privacy}","received_events_url":"https://api.github.com/users/prashastk/received_events","type":"User","site_admin":false},"body":"Everywhere else we are using the pattern of `assert  schema.errors[0].attribute == 'MissingNested'`. Stick to that?","created_at":"2018-05-02T20:42:22Z","updated_at":"2018-05-02T20:46:39Z","html_url":"https://github.com/productml/blurr/pull/262#discussion_r185632416","pull_request_url":"https://api.github.com/repos/productml/blurr/pulls/262","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/productml/blurr/pulls/comments/185632416"},"html":{"href":"https://github.com/productml/blurr/pull/262#discussion_r185632416"},"pull_request":{"href":"https://api.github.com/repos/productml/blurr/pulls/262"}}},"pull_request":{"url":"https://api.github.com/repos/productml/blurr/pulls/262","id":184744644,"html_url":"https://github.com/productml/blurr/pull/262","diff_url":"https://github.com/productml/blurr/pull/262.diff","patch_url":"https://github.com/productml/blurr/pull/262.patch","issue_url":"https://api.github.com/repos/productml/blurr/issues/262","number":262,"state":"open","locked":false,"title":"Foundation for schema validation added to scheam loading, and error collection for raising them together","user":{"login":"indradeep","id":405147,"avatar_url":"https://avatars3.githubusercontent.com/u/405147?v=4","gravatar_id":"","url":"https://api.github.com/users/indradeep","html_url":"https://github.com/indradeep","followers_url":"https://api.github.com/users/indradeep/followers","following_url":"https://api.github.com/users/indradeep/following{/other_user}","gists_url":"https://api.github.com/users/indradeep/gists{/gist_id}","starred_url":"https://api.github.com/users/indradeep/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/indradeep/subscriptions","organizations_url":"https://api.github.com/users/indradeep/orgs","repos_url":"https://api.github.com/users/indradeep/repos","events_url":"https://api.github.com/users/indradeep/events{/privacy}","received_events_url":"https://api.github.com/users/indradeep/received_events","type":"User","site_admin":false},"body":"#### Pull Request Checklist:\r\n- [x] Tests for the changes have been added\r\n- [x] Docs have been added / updated\r\n\r\n### What kind of change does this PR introduce?\r\n\r\nThis PR lays the foundation for replacing the `yamale` based schema validation with validation built into the schema spec loading routine.   Schema validation occurs in two places:\r\n- `SchemaLoader`: which requires Name and Type to be present for loads to work properly.\r\n- `BaseSchema` and derived classes - where checks against specific schema elements belonging to the derivative is checked.\r\n\r\nCreated new Error types for different kind of validation failures by deriving from the old `InvalidSchemaError`.  Created an error collector to collect validation errors so that they can be raised together after all validation errors have been throw in the round.  \r\n\r\nReplaced the instances of the old `InvalidSchemaError` with GenericSchemaError.  The new `GenericSchemaError` will be systematically replaced by more specific errors in subsequent PRs.\r\n\r\nFor readability:\r\n- Renamed `SchemaLoader.add_scheam` to `SchemaLoader.add_scheam_spec`\r\n- Renamed `BaseSchema.extend_schema` to `BaseSchema.extend_schema_spec`\r\n\r\n#### Link to issue\r\nfixes #254 \r\n","created_at":"2018-04-27T22:56:33Z","updated_at":"2018-05-02T20:46:40Z","closed_at":null,"merged_at":null,"merge_commit_sha":"10e99ac319bb8596c79959e1490e152876e12b0a","assignee":{"login":"indradeep","id":405147,"avatar_url":"https://avatars3.githubusercontent.com/u/405147?v=4","gravatar_id":"","url":"https://api.github.com/users/indradeep","html_url":"https://github.com/indradeep","followers_url":"https://api.github.com/users/indradeep/followers","following_url":"https://api.github.com/users/indradeep/following{/other_user}","gists_url":"https://api.github.com/users/indradeep/gists{/gist_id}","starred_url":"https://api.github.com/users/indradeep/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/indradeep/subscriptions","organizations_url":"https://api.github.com/users/indradeep/orgs","repos_url":"https://api.github.com/users/indradeep/repos","events_url":"https://api.github.com/users/indradeep/events{/privacy}","received_events_url":"https://api.github.com/users/indradeep/received_events","type":"User","site_admin":false},"assignees":[{"login":"indradeep","id":405147,"avatar_url":"https://avatars3.githubusercontent.com/u/405147?v=4","gravatar_id":"","url":"https://api.github.com/users/indradeep","html_url":"https://github.com/indradeep","followers_url":"https://api.github.com/users/indradeep/followers","following_url":"https://api.github.com/users/indradeep/following{/other_user}","gists_url":"https://api.github.com/users/indradeep/gists{/gist_id}","starred_url":"https://api.github.com/users/indradeep/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/indradeep/subscriptions","organizations_url":"https://api.github.com/users/indradeep/orgs","repos_url":"https://api.github.com/users/indradeep/repos","events_url":"https://api.github.com/users/indradeep/events{/privacy}","received_events_url":"https://api.github.com/users/indradeep/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"vigbk","id":6189632,"avatar_url":"https://avatars1.githubusercontent.com/u/6189632?v=4","gravatar_id":"","url":"https://api.github.com/users/vigbk","html_url":"https://github.com/vigbk","followers_url":"https://api.github.com/users/vigbk/followers","following_url":"https://api.github.com/users/vigbk/following{/other_user}","gists_url":"https://api.github.com/users/vigbk/gists{/gist_id}","starred_url":"https://api.github.com/users/vigbk/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vigbk/subscriptions","organizations_url":"https://api.github.com/users/vigbk/orgs","repos_url":"https://api.github.com/users/vigbk/repos","events_url":"https://api.github.com/users/vigbk/events{/privacy}","received_events_url":"https://api.github.com/users/vigbk/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/productml/blurr/pulls/262/commits","review_comments_url":"https://api.github.com/repos/productml/blurr/pulls/262/comments","review_comment_url":"https://api.github.com/repos/productml/blurr/pulls/comments{/number}","comments_url":"https://api.github.com/repos/productml/blurr/issues/262/comments","statuses_url":"https://api.github.com/repos/productml/blurr/statuses/a43de5af22f206a2d9cb565f9adb539fca051aaa","head":{"label":"productml:validation-with-schema","ref":"validation-with-schema","sha":"a43de5af22f206a2d9cb565f9adb539fca051aaa","user":{"login":"productml","id":31578582,"avatar_url":"https://avatars2.githubusercontent.com/u/31578582?v=4","gravatar_id":"","url":"https://api.github.com/users/productml","html_url":"https://github.com/productml","followers_url":"https://api.github.com/users/productml/followers","following_url":"https://api.github.com/users/productml/following{/other_user}","gists_url":"https://api.github.com/users/productml/gists{/gist_id}","starred_url":"https://api.github.com/users/productml/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/productml/subscriptions","organizations_url":"https://api.github.com/users/productml/orgs","repos_url":"https://api.github.com/users/productml/repos","events_url":"https://api.github.com/users/productml/events{/privacy}","received_events_url":"https://api.github.com/users/productml/received_events","type":"Organization","site_admin":false},"repo":{"id":124137206,"name":"blurr","full_name":"productml/blurr","owner":{"login":"productml","id":31578582,"avatar_url":"https://avatars2.githubusercontent.com/u/31578582?v=4","gravatar_id":"","url":"https://api.github.com/users/productml","html_url":"https://github.com/productml","followers_url":"https://api.github.com/users/productml/followers","following_url":"https://api.github.com/users/productml/following{/other_user}","gists_url":"https://api.github.com/users/productml/gists{/gist_id}","starred_url":"https://api.github.com/users/productml/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/productml/subscriptions","organizations_url":"https://api.github.com/users/productml/orgs","repos_url":"https://api.github.com/users/productml/repos","events_url":"https://api.github.com/users/productml/events{/privacy}","received_events_url":"https://api.github.com/users/productml/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/productml/blurr","description":"Components for MLOps, production ML & online scoring systems","fork":false,"url":"https://api.github.com/repos/productml/blurr","forks_url":"https://api.github.com/repos/productml/blurr/forks","keys_url":"https://api.github.com/repos/productml/blurr/keys{/key_id}","collaborators_url":"https://api.github.com/repos/productml/blurr/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/productml/blurr/teams","hooks_url":"https://api.github.com/repos/productml/blurr/hooks","issue_events_url":"https://api.github.com/repos/productml/blurr/issues/events{/number}","events_url":"https://api.github.com/repos/productml/blurr/events","assignees_url":"https://api.github.com/repos/productml/blurr/assignees{/user}","branches_url":"https://api.github.com/repos/productml/blurr/branches{/branch}","tags_url":"https://api.github.com/repos/productml/blurr/tags","blobs_url":"https://api.github.com/repos/productml/blurr/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/productml/blurr/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/productml/blurr/git/refs{/sha}","trees_url":"https://api.github.com/repos/productml/blurr/git/trees{/sha}","statuses_url":"https://api.github.com/repos/productml/blurr/statuses/{sha}","languages_url":"https://api.github.com/repos/productml/blurr/languages","stargazers_url":"https://api.github.com/repos/productml/blurr/stargazers","contributors_url":"https://api.github.com/repos/productml/blurr/contributors","subscribers_url":"https://api.github.com/repos/productml/blurr/subscribers","subscription_url":"https://api.github.com/repos/productml/blurr/subscription","commits_url":"https://api.github.com/repos/productml/blurr/commits{/sha}","git_commits_url":"https://api.github.com/repos/productml/blurr/git/commits{/sha}","comments_url":"https://api.github.com/repos/productml/blurr/comments{/number}","issue_comment_url":"https://api.github.com/repos/productml/blurr/issues/comments{/number}","contents_url":"https://api.github.com/repos/productml/blurr/contents/{+path}","compare_url":"https://api.github.com/repos/productml/blurr/compare/{base}...{head}","merges_url":"https://api.github.com/repos/productml/blurr/merges","archive_url":"https://api.github.com/repos/productml/blurr/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/productml/blurr/downloads","issues_url":"https://api.github.com/repos/productml/blurr/issues{/number}","pulls_url":"https://api.github.com/repos/productml/blurr/pulls{/number}","milestones_url":"https://api.github.com/repos/productml/blurr/milestones{/number}","notifications_url":"https://api.github.com/repos/productml/blurr/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/productml/blurr/labels{/name}","releases_url":"https://api.github.com/repos/productml/blurr/releases{/id}","deployments_url":"https://api.github.com/repos/productml/blurr/deployments","created_at":"2018-03-06T20:53:57Z","updated_at":"2018-05-02T15:15:49Z","pushed_at":"2018-05-02T20:35:43Z","git_url":"git://github.com/productml/blurr.git","ssh_url":"git@github.com:productml/blurr.git","clone_url":"https://github.com/productml/blurr.git","svn_url":"https://github.com/productml/blurr","homepage":"http://blurr.ai","size":2337,"stargazers_count":66,"watchers_count":66,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":45,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":0,"open_issues":45,"watchers":66,"default_branch":"master"}},"base":{"label":"productml:master","ref":"master","sha":"d5f0718a973123907c401900987d4bc6f216cc9b","user":{"login":"productml","id":31578582,"avatar_url":"https://avatars2.githubusercontent.com/u/31578582?v=4","gravatar_id":"","url":"https://api.github.com/users/productml","html_url":"https://github.com/productml","followers_url":"https://api.github.com/users/productml/followers","following_url":"https://api.github.com/users/productml/following{/other_user}","gists_url":"https://api.github.com/users/productml/gists{/gist_id}","starred_url":"https://api.github.com/users/productml/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/productml/subscriptions","organizations_url":"https://api.github.com/users/productml/orgs","repos_url":"https://api.github.com/users/productml/repos","events_url":"https://api.github.com/users/productml/events{/privacy}","received_events_url":"https://api.github.com/users/productml/received_events","type":"Organization","site_admin":false},"repo":{"id":124137206,"name":"blurr","full_name":"productml/blurr","owner":{"login":"productml","id":31578582,"avatar_url":"https://avatars2.githubusercontent.com/u/31578582?v=4","gravatar_id":"","url":"https://api.github.com/users/productml","html_url":"https://github.com/productml","followers_url":"https://api.github.com/users/productml/followers","following_url":"https://api.github.com/users/productml/following{/other_user}","gists_url":"https://api.github.com/users/productml/gists{/gist_id}","starred_url":"https://api.github.com/users/productml/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/productml/subscriptions","organizations_url":"https://api.github.com/users/productml/orgs","repos_url":"https://api.github.com/users/productml/repos","events_url":"https://api.github.com/users/productml/events{/privacy}","received_events_url":"https://api.github.com/users/productml/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/productml/blurr","description":"Components for MLOps, production ML & online scoring systems","fork":false,"url":"https://api.github.com/repos/productml/blurr","forks_url":"https://api.github.com/repos/productml/blurr/forks","keys_url":"https://api.github.com/repos/productml/blurr/keys{/key_id}","collaborators_url":"https://api.github.com/repos/productml/blurr/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/productml/blurr/teams","hooks_url":"https://api.github.com/repos/productml/blurr/hooks","issue_events_url":"https://api.github.com/repos/productml/blurr/issues/events{/number}","events_url":"https://api.github.com/repos/productml/blurr/events","assignees_url":"https://api.github.com/repos/productml/blurr/assignees{/user}","branches_url":"https://api.github.com/repos/productml/blurr/branches{/branch}","tags_url":"https://api.github.com/repos/productml/blurr/tags","blobs_url":"https://api.github.com/repos/productml/blurr/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/productml/blurr/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/productml/blurr/git/refs{/sha}","trees_url":"https://api.github.com/repos/productml/blurr/git/trees{/sha}","statuses_url":"https://api.github.com/repos/productml/blurr/statuses/{sha}","languages_url":"https://api.github.com/repos/productml/blurr/languages","stargazers_url":"https://api.github.com/repos/productml/blurr/stargazers","contributors_url":"https://api.github.com/repos/productml/blurr/contributors","subscribers_url":"https://api.github.com/repos/productml/blurr/subscribers","subscription_url":"https://api.github.com/repos/productml/blurr/subscription","commits_url":"https://api.github.com/repos/productml/blurr/commits{/sha}","git_commits_url":"https://api.github.com/repos/productml/blurr/git/commits{/sha}","comments_url":"https://api.github.com/repos/productml/blurr/comments{/number}","issue_comment_url":"https://api.github.com/repos/productml/blurr/issues/comments{/number}","contents_url":"https://api.github.com/repos/productml/blurr/contents/{+path}","compare_url":"https://api.github.com/repos/productml/blurr/compare/{base}...{head}","merges_url":"https://api.github.com/repos/productml/blurr/merges","archive_url":"https://api.github.com/repos/productml/blurr/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/productml/blurr/downloads","issues_url":"https://api.github.com/repos/productml/blurr/issues{/number}","pulls_url":"https://api.github.com/repos/productml/blurr/pulls{/number}","milestones_url":"https://api.github.com/repos/productml/blurr/milestones{/number}","notifications_url":"https://api.github.com/repos/productml/blurr/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/productml/blurr/labels{/name}","releases_url":"https://api.github.com/repos/productml/blurr/releases{/id}","deployments_url":"https://api.github.com/repos/productml/blurr/deployments","created_at":"2018-03-06T20:53:57Z","updated_at":"2018-05-02T15:15:49Z","pushed_at":"2018-05-02T20:35:43Z","git_url":"git://github.com/productml/blurr.git","ssh_url":"git@github.com:productml/blurr.git","clone_url":"https://github.com/productml/blurr.git","svn_url":"https://github.com/productml/blurr","homepage":"http://blurr.ai","size":2337,"stargazers_count":66,"watchers_count":66,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":45,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":0,"open_issues":45,"watchers":66,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/productml/blurr/pulls/262"},"html":{"href":"https://github.com/productml/blurr/pull/262"},"issue":{"href":"https://api.github.com/repos/productml/blurr/issues/262"},"comments":{"href":"https://api.github.com/repos/productml/blurr/issues/262/comments"},"review_comments":{"href":"https://api.github.com/repos/productml/blurr/pulls/262/comments"},"review_comment":{"href":"https://api.github.com/repos/productml/blurr/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/productml/blurr/pulls/262/commits"},"statuses":{"href":"https://api.github.com/repos/productml/blurr/statuses/a43de5af22f206a2d9cb565f9adb539fca051aaa"}},"author_association":"OWNER"}}
{"actor":{"display_login":"prashastk"}}