{"action":"created","comment":{"url":"https://api.github.com/repos/in-toto/in-toto/pulls/comments/103320306","pull_request_review_id":24094936,"id":103320306,"diff_hunk":"@@ -307,231 +469,280 @@ def setUp(self):\n \n \n   def test_pass_match_material(self):\n-    \"\"\"[\"MATCH\", \"MATERIAL\", \"foo\", \"FROM\", \"link-1\"],\n-    source artifact foo and target material foo hashes match, passes. \"\"\"\n+    \"\"\"[\"MATCH\", \"foo\", \"WITH\", \"MATERIALS\", \"FROM\", \"link-1\"],\n+    source artifact foo and destination material foo hashes match, passes. \"\"\"\n \n-    rule = [\"MATCH\", \"MATERIAL\", \"foo\", \"FROM\", \"link-1\"]\n+    rule = [\"MATCH\", \"foo\", \"WITH\", \"MATERIALS\", \"FROM\", \"link-1\"]\n     artifacts = {\n-      \"foo\": {\"sha256\": self.sha256_foo}\n+      \"foo\": {\"sha256\": self.sha256_foo},\n+      \"bar\": {\"sha256\": self.sha256_bar}\n     }\n     queue = artifacts.keys()\n     self.assertListEqual(\n-        verify_match_rule(rule, queue, artifacts, self.links), [])\n+        verify_match_rule(rule, queue, artifacts, self.links), [\"bar\"])\n \n \n   def test_pass_match_product(self):\n-    \"\"\"[\"MATCH\", \"PRODUCT\", \"bar\", \"FROM\", \"link-1\"],\n-    source artifact bar and target product bar hashes match, passes. \"\"\"\n+    \"\"\"[\"MATCH\", \"bar\", \"WITH\", \"PRODUCTS\", \"FROM\", \"link-1\"],\n+    source artifact bar and destination product bar hashes match, passes. \"\"\"\n \n-    rule = [\"MATCH\", \"PRODUCT\", \"bar\", \"FROM\", \"link-1\"]\n+    rule = [\"MATCH\", \"bar\", \"WITH\", \"PRODUCTS\", \"FROM\", \"link-1\"]\n     artifacts = {\n+      \"foo\": {\"sha256\": self.sha256_foo},\n       \"bar\": {\"sha256\": self.sha256_bar}\n     }\n     queue = artifacts.keys()\n     self.assertListEqual(\n-        verify_match_rule(rule, queue, artifacts, self.links), [])\n+        verify_match_rule(rule, queue, artifacts, self.links), [\"foo\"])\n \n \n-  def test_pass_match_material_as_name(self):\n-    \"\"\"[\"MATCH\", \"MATERIAL\", \"dist/foo\", \"AS\", \"foo\", \"FROM\", \"link-1\"],\n-    source artifact dist/foo and target material foo hashes match, passes. \"\"\"\n+  def test_pass_match_in_source_dir_with_materials(self):\n+    \"\"\"[\"MATCH\", \"foo\", \"IN\", \"dist\", \"WITH\", \"MATERIALS\", \"FROM\", \"link-1\"],\n+    source artifact dist/foo and destination material foo hashes match, passes. \"\"\"\n \n-    rule = [\"MATCH\", \"MATERIAL\", \"dist/foo\", \"AS\", \"foo\", \"FROM\", \"link-1\"]\n+    rule = [\"MATCH\", \"foo\", \"IN\", \"dist\", \"WITH\", \"MATERIALS\", \"FROM\", \"link-1\"]\n     artifacts = {\n-      \"dist/foo\": {\"sha256\": self.sha256_foo}\n+      \"dist/foo\": {\"sha256\": self.sha256_foo},\n+      \"dist/bar\": {\"sha256\": self.sha256_bar}\n     }\n     queue = artifacts.keys()\n     self.assertListEqual(\n-        verify_match_rule(rule, queue, artifacts, self.links), [])\n+        verify_match_rule(rule, queue, artifacts, self.links), [\"dist/bar\"])\n \n+  def test_pass_match_in_source_dir_with_products(self):\n+    \"\"\"[\"MATCH\", \"bar\", \"IN\", \"dist\", \"WITH\", \"PRODUCTS\", \"FROM\", \"link-1\"],\n+    source artifact dist/bar and destination product bar hashes match, passes. \"\"\"\n \n-  def test_pass_match_product_as_name(self):\n-    \"\"\"[\"MATCH\", \"PRODUCT\", \"dist/bar\", \"AS\", \"bar\", \"FROM\", \"link-1\"],\n-    source artifact dist/bar and target product bar hahes match, passes. \"\"\"\n+    rule = [\"MATCH\", \"bar\", \"IN\", \"dist\", \"WITH\", \"PRODUCTS\", \"FROM\", \"link-1\"]\n+    artifacts = {\n+      \"dist/bar\": {\"sha256\": self.sha256_bar},\n+      \"dist/foo\": {\"sha256\": self.sha256_foo}\n+    }\n+    queue = artifacts.keys()\n+    self.assertListEqual(\n+        verify_match_rule(rule, queue, artifacts, self.links), [\"dist/foo\"])\n+\n+  def test_pass_match_with_materials_in_destination_dir(self):\n+    \"\"\"[\"MATCH\", \"foo\", \"WITH\", \"MATERIALS\", \"IN\", \"dev\", \"FROM\", \"link-1\"],\n+    source artifact foo and destination material dev/foo hashes match, passes. \"\"\"\n \n-    rule = [\"MATCH\", \"PRODUCT\", \"dist/bar\", \"AS\", \"bar\", \"FROM\", \"link-1\"]\n+    rule = [\"MATCH\", \"foo\", \"WITH\", \"MATERIALS\", \"IN\", \"dev\", \"FROM\", \"link-1\"]\n     artifacts = {\n-      \"dist/bar\": {\"sha256\": self.sha256_bar}\n+      \"foo\": {\"sha256\": self.sha256_foo},\n+      \"bar\": {\"sha256\": self.sha256_bar}\n     }\n     queue = artifacts.keys()\n     self.assertListEqual(\n-        verify_match_rule(rule, queue, artifacts, self.links), [])\n+        verify_match_rule(rule, queue, artifacts, self.links), [\"bar\"])\n \n+  def test_pass_match_with_products_in_destination_dir(self):\n+    \"\"\"[\"MATCH\", \"bar\", \"WITH\", \"PRODUCTS\", \"IN\", \"dev\", \"FROM\", \"link-1\"],\n+    source artifact bar and destination product dev/bar hashes match, passes. \"\"\"\n+\n+    rule = [\"MATCH\", \"bar\", \"WITH\", \"PRODUCTS\", \"IN\", \"dev\", \"FROM\", \"link-1\"]\n+    artifacts = {\n+      \"bar\": {\"sha256\": self.sha256_bar},\n+      \"foo\": {\"sha256\": self.sha256_foo}\n+    }\n+    queue = artifacts.keys()\n+    self.assertListEqual(\n+        verify_match_rule(rule, queue, artifacts, self.links), [\"foo\"])\n \n   def test_pass_match_material_star(self):\n-    \"\"\"[\"MATCH\", \"MATERIAL\", \"foo*\", \"FROM\", \"link-1\"],\n-    source artifacts foo* match target materials foo* hashes, passes. \"\"\"\n+    \"\"\"[\"MATCH\", \"foo*\", \"WITH\", \"MATERIALS\", \"FROM\", \"link-1\"]],\n+    source artifacts foo* match destination materials foo* hashes, passes. \"\"\"\n \n-    rule = [\"MATCH\", \"MATERIAL\", \"foo*\", \"FROM\", \"link-1\"]\n+    rule = [\"MATCH\", \"foo*\", \"WITH\", \"MATERIALS\", \"FROM\", \"link-1\"]\n     artifacts = {\n       \"foo\": {\"sha256\": self.sha256_foo},\n-      \"foobar\": {\"sha256\": self.sha256_foobar}\n+      \"foobar\": {\"sha256\": self.sha256_foobar},\n+      \"bar\": {\"sha256\": self.sha256_bar}\n     }\n     queue = artifacts.keys()\n     self.assertListEqual(\n-        verify_match_rule(rule, queue, artifacts, self.links), [])\n-\n+        verify_match_rule(rule, queue, artifacts, self.links), [\"bar\"])\n \n   def test_pass_match_product_star(self):\n-    \"\"\"[\"MATCH\", \"PRODUCT\", \"bar*\", \"FROM\", \"link-1\"],\n-    source artifacts bar* match target products bar* hashes, passes. \"\"\"\n+    \"\"\"[\"MATCH\", \"bar*\", \"WITH\", \"PRODUCTS\", \"FROM\", \"link-1\"],\n+    source artifacts bar* match destination products bar* hashes, passes. \"\"\"\n \n-    rule = [\"MATCH\", \"PRODUCT\", \"bar*\", \"FROM\", \"link-1\"]\n+    rule = [\"MATCH\", \"bar*\", \"WITH\", \"PRODUCTS\", \"FROM\", \"link-1\"]\n     artifacts = {\n       \"bar\": {\"sha256\": self.sha256_bar},\n-      \"barfoo\": {\"sha256\": self.sha256_barfoo}\n+      \"barfoo\": {\"sha256\": self.sha256_barfoo},\n+      \"foo\": {\"sha256\": self.sha256_foo}\n     }\n     queue = artifacts.keys()\n     self.assertListEqual(\n-        verify_match_rule(rule, queue, artifacts, self.links), [])\n+        verify_match_rule(rule, queue, artifacts, self.links), [\"foo\"])\n \n+  def test_pass_match_star_in_source_dir_with_materials(self):\n+    \"\"\"[\"MATCH\", \"foo*\", \"IN\", \"dist\", \"WITH\", \"MATERIALS\", \"FROM\", \"link-1\"],\n+    source artifacts dist/* match destination materials foo* hashes, passes. \"\"\"\n \n-  def test_pass_match_material_as_star(self):\n-    \"\"\"[\"MATCH\", \"MATERIAL\", \"dist/*\", \"AS\", \"foo*\", \"FROM\", \"link-1\"],\n-    source artifacts dist/* match target materials foo* hashes, passes. \"\"\"\n-\n-    rule = [\"MATCH\", \"MATERIAL\", \"dist/*\", \"AS\", \"foo*\", \"FROM\", \"link-1\"]\n+    rule = [\"MATCH\", \"foo*\", \"IN\", \"dist\", \"WITH\", \"MATERIALS\", \"FROM\", \"link-1\"]\n     artifacts = {\n       \"dist/foo\": {\"sha256\": self.sha256_foo},\n-      \"dist/foobar\": {\"sha256\": self.sha256_foobar}\n+      \"dist/foobar\": {\"sha256\": self.sha256_foobar},\n+      \"bar\": {\"sha256\": self.sha256_bar}\n     }\n     queue = artifacts.keys()\n     self.assertListEqual(\n-        verify_match_rule(rule, queue, artifacts, self.links), [])\n+        verify_match_rule(rule, queue, artifacts, self.links), [\"bar\"])\n \n+  def test_pass_match_star_in_source_dir_with_products(self):\n+    \"\"\"[\"MATCH\", \"bar*\", \"WITH\", \"PRODUCTS\", \"IN\", \"dist\", \"FROM\", \"link-1\"],\n+    source artifacts dist/* match destination products bar* hashes, passes. \"\"\"\n \n-  def test_pass_match_product_as_star(self):\n-    \"\"\"[\"MATCH\", \"PRODUCT\", \"dist/*\", \"AS\", \"bar*\", \"FROM\", \"link-1\"],\n-    source artifacts dist/* match target products bar* hashes, passes. \"\"\"\n-\n-    rule = [\"MATCH\", \"PRODUCT\", \"dist/*\", \"AS\", \"bar*\", \"FROM\", \"link-1\"]\n+    rule = [\"MATCH\", \"bar*\", \"IN\", \"dist\", \"WITH\", \"PRODUCTS\", \"FROM\", \"link-1\"]\n     artifacts = {\n       \"dist/bar\": {\"sha256\": self.sha256_bar},\n-      \"dist/barfoo\": {\"sha256\": self.sha256_barfoo}\n+      \"dist/barfoo\": {\"sha256\": self.sha256_barfoo},\n+      \"foo\": {\"sha256\": self.sha256_foo}\n     }\n     queue = artifacts.keys()\n     self.assertListEqual(\n-        verify_match_rule(rule, queue, artifacts, self.links), [])\n+        verify_match_rule(rule, queue, artifacts, self.links), [\"foo\"])\n \n+  def test_pass_match_star_in_with_materials_in_destination_dir(self):\n+    \"\"\"[\"MATCH\", \"foo*\", \"WITH\", \"MATERIALS\", \"IN\", \"dist\", \"FROM\", \"link-1\"],\n+    source artifacts foo* match destination materials dev/foo* hashes, passes. \"\"\"\n \n-  def test_fail_pattern_matched_nothing_in_target_materials(self):\n-    \"\"\"[\"MATCH\", \"MATERIAL\", \"bar\", \"FROM\", \"link-1\"],\n-    pattern bar does not match any materials in target, fails. \"\"\"\n+    rule = [\"MATCH\", \"foo*\", \"WITH\", \"MATERIALS\", \"IN\", \"dev\", \"FROM\", \"link-1\"]\n+    artifacts = {\n+      \"foo\": {\"sha256\": self.sha256_foo},\n+      \"foobar\": {\"sha256\": self.sha256_foobar},\n+      \"bar\": {\"sha256\": self.sha256_bar}\n+    }\n+    queue = artifacts.keys()\n+    self.assertListEqual(\n+        verify_match_rule(rule, queue, artifacts, self.links), [\"bar\"])\n \n-    rule = [\"MATCH\", \"MATERIAL\", \"bar\", \"FROM\", \"link-1\"]\n-    with self.assertRaises(RuleVerficationError):\n-      verify_match_rule(rule, [], [], self.links)\n+  def test_pass_match_star_with_products_destination_dir(self):\n+    \"\"\"[\"MATCH\", \"bar*\", \"WITH\", \"PRODUCTS\", \"IN\", \"dev\", \"FROM\", \"link-1\"],\n+    source artifacts bar* match destination products dev/bar* hashes, passes. \"\"\"\n \n+    rule = [\"MATCH\", \"bar*\", \"WITH\", \"PRODUCTS\", \"IN\", \"dev\", \"FROM\", \"link-1\"]\n+    artifacts = {\n+      \"bar\": {\"sha256\": self.sha256_bar},\n+      \"barfoo\": {\"sha256\": self.sha256_barfoo},\n+      \"foo\": {\"sha256\": self.sha256_foo}\n+    }\n+    queue = artifacts.keys()\n+    self.assertListEqual(\n+        verify_match_rule(rule, queue, artifacts, self.links), [\"foo\"])\n \n-  def test_fail_pattern_matched_nothing_in_target_products(self):\n-    \"\"\"[\"MATCH\", \"PRODUCT\", \"foo\", \"FROM\", \"link-1\"],\n-    pattern foo does not match any products in target, fails. \"\"\"\n+  def test_fail_destination_link_not_found(self):\n+    \"\"\"[\"MATCH\", \"bar\", \"WITH\", \"MATERIALS\", \"FROM\", \"link-null\"],\n+    destination link \"link-null\" not found, fails. \"\"\"\n \n-    rule = [\"MATCH\", \"PRODUCT\", \"foo\", \"FROM\", \"link-1\"]\n+    rule = [\"MATCH\", \"bar\", \"WITH\", \"MATERIALS\", \"FROM\", \"link-null\"]\n+    artifacts = {}\n+    queue = artifacts.keys()\n     with self.assertRaises(RuleVerficationError):\n-      # Pass an empty artifacts queue and artifacts dictionary\n-      # to match nothing\n-      verify_match_rule(rule, [], [], self.links)\n-\n+      verify_match_rule(rule, queue, artifacts, self.links)\n \n-  def test_fail_target_hash_not_found_in_source_artifacts(self):\n-    \"\"\"[\"MATCH\", \"MATERIAL\", \"foo\", \"FROM\", \"link-1\"],\n-    no source artifact matches target material's hash, fails. \"\"\"\n+  def test_fail_path_not_in_destination_materials(self):\n+    \"\"\"[\"MATCH\", \"bar\", \"WITH\", \"MATERIALS\", \"FROM\", \"link-1\"]\n+    pattern bar does not match any materials in destination, fails. \"\"\"\n \n-    rule = [\"MATCH\", \"MATERIAL\", \"foo\", \"FROM\", \"link-1\"]\n+    rule = [\"MATCH\", \"bar\", \"WITH\", \"MATERIALS\", \"FROM\", \"link-1\"]\n     artifacts = {\n       \"bar\": {\"sha256\": self.sha256_bar},\n     }\n     queue = artifacts.keys()\n     with self.assertRaises(RuleVerficationError):\n       verify_match_rule(rule, queue, artifacts, self.links)\n \n+  def test_fail_path_not_in_destination_products(self):\n+    \"\"\"[\"MATCH\", \"foo\", \"WITH\", \"PRODUCTS\", \"FROM\", \"link-1\"],\n+    pattern foo does not match any products in destination, fails. \"\"\"\n \n-  def test_fail_hash_not_found_in_artifacts_queue(self):\n-    \"\"\"[\"MATCH\", \"MATERIAL\", \"foo\", \"FROM\", \"link-1\"],\n-    no source artifact still in queue matches target material's hash, fails. \"\"\"\n-\n-    rule = [\"MATCH\", \"MATERIAL\", \"foo\", \"FROM\", \"link-1\"]\n+    rule = [\"MATCH\", \"foo\", \"WITH\", \"PRODUCTS\", \"FROM\", \"link-1\"]\n     artifacts = {\n       \"foo\": {\"sha256\": self.sha256_foo},\n     }\n-    queue = []\n+    queue = artifacts.keys()\n     with self.assertRaises(RuleVerficationError):\n       verify_match_rule(rule, queue, artifacts, self.links)\n \n+  def test_fail_hash_not_eual(self):\n+    \"\"\"\"[\"MATCH\", \"bar\", \"WITH\", \"PRODUCTS\", \"FROM\", \"link-1\"],\n+    source and destination bar have different hashes, fails. \"\"\"\n \n-  def test_fail_hash_matched_but_wrong_name(self):\n-    \"\"\"[\"MATCH\", \"MATERIAL\", \"foo\", \"FROM\", \"link-1\"],\n-    no source artifact matches target material's hash and path pattern, fails. \"\"\"\n-\n-    rule = [\"MATCH\", \"MATERIAL\", \"dist/foo\", \"AS\", \"foo\", \"FROM\", \"link-1\"]\n+    rule = [\"MATCH\", \"bar\", \"WITH\", \"PRODUCTS\", \"FROM\", \"link-1\"]\n     artifacts = {\n-      \"foo\": {\"sha256\": self.sha256_foo},\n+      \"bar\": {\"sha256\": \"aaaaaaaaaa\"},\n     }\n     queue = artifacts.keys()\n     with self.assertRaises(RuleVerficationError):\n       verify_match_rule(rule, queue, artifacts, self.links)\n \n \n-\n-\n-\n class TestVerifyItemRules(unittest.TestCase):\n-  \"\"\"Test verifylib.verify_item_rules(item_name, rules, artifacts, links)\"\"\"\n+  \"\"\"Test verifylib.verify_item_rules(source_name, source_type, rules, links)\"\"\"\n \n   def setUp(self):\n-    self.item_name = \"test-item\"\n-    self.sha256_foo = \\\n+    self.item_name = \"item\"\n+    self.sha256_1 = \\\n         \"d65165279105ca6773180500688df4bdc69a2c7b771752f0a46ef120b7fd8ec3\"\n-    self.sha256_bar = \\\n+    self.sha256_2 = \\","path":"test/test_verifylib.py","position":693,"original_position":693,"commit_id":"81fe49cbe51f434a93216d0ee6e879eb3810da32","original_commit_id":"81fe49cbe51f434a93216d0ee6e879eb3810da32","user":{"login":"SantiagoTorres","id":3579933,"avatar_url":"https://avatars.githubusercontent.com/u/3579933?v=3","gravatar_id":"","url":"https://api.github.com/users/SantiagoTorres","html_url":"https://github.com/SantiagoTorres","followers_url":"https://api.github.com/users/SantiagoTorres/followers","following_url":"https://api.github.com/users/SantiagoTorres/following{/other_user}","gists_url":"https://api.github.com/users/SantiagoTorres/gists{/gist_id}","starred_url":"https://api.github.com/users/SantiagoTorres/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SantiagoTorres/subscriptions","organizations_url":"https://api.github.com/users/SantiagoTorres/orgs","repos_url":"https://api.github.com/users/SantiagoTorres/repos","events_url":"https://api.github.com/users/SantiagoTorres/events{/privacy}","received_events_url":"https://api.github.com/users/SantiagoTorres/received_events","type":"User","site_admin":false},"body":"Like this, I think this name is better.","created_at":"2017-02-27T21:45:55Z","updated_at":"2017-02-27T21:46:45Z","html_url":"https://github.com/in-toto/in-toto/pull/70#discussion_r103320306","pull_request_url":"https://api.github.com/repos/in-toto/in-toto/pulls/70","_links":{"self":{"href":"https://api.github.com/repos/in-toto/in-toto/pulls/comments/103320306"},"html":{"href":"https://github.com/in-toto/in-toto/pull/70#discussion_r103320306"},"pull_request":{"href":"https://api.github.com/repos/in-toto/in-toto/pulls/70"}}},"pull_request":{"url":"https://api.github.com/repos/in-toto/in-toto/pulls/70","id":105305056,"html_url":"https://github.com/in-toto/in-toto/pull/70","diff_url":"https://github.com/in-toto/in-toto/pull/70.diff","patch_url":"https://github.com/in-toto/in-toto/pull/70.patch","issue_url":"https://api.github.com/repos/in-toto/in-toto/issues/70","number":70,"state":"open","locked":false,"title":"Major artifact rule update to align with specs","user":{"login":"lukpueh","id":589324,"avatar_url":"https://avatars.githubusercontent.com/u/589324?v=3","gravatar_id":"","url":"https://api.github.com/users/lukpueh","html_url":"https://github.com/lukpueh","followers_url":"https://api.github.com/users/lukpueh/followers","following_url":"https://api.github.com/users/lukpueh/following{/other_user}","gists_url":"https://api.github.com/users/lukpueh/gists{/gist_id}","starred_url":"https://api.github.com/users/lukpueh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lukpueh/subscriptions","organizations_url":"https://api.github.com/users/lukpueh/orgs","repos_url":"https://api.github.com/users/lukpueh/repos","events_url":"https://api.github.com/users/lukpueh/events{/privacy}","received_events_url":"https://api.github.com/users/lukpueh/received_events","type":"User","site_admin":false},"body":"Aligns with latest specs and discussion in https://github.com/in-toto/in-toto/issues/43\r\n\r\n**Changes in verifylib**\r\n- Artifact rules updates\r\n   - Changes MATCH rule format and behavior \r\n   ```\r\n   MATCH <pattern> [IN <source-path-prefix>] WITH (MATERIALS|PRODUCTS) \r\n    [IN <destination-path-prefix>] FROM <step>\r\n    ```\r\n  - Changes CREATE/DELETE rule behavior\r\n  - Re-adds MODIFY rule\r\n  - Adds ALLOW/DISALLOW rules\r\n- Adds hashdict equality check function\r\n- Changes verify_item_rules arguments\r\n  Receives additional source_type argument to know if the rules were in material_matchrules or \r\n  product_matchrules of a step or inspection.\r\n  Removes artifacts arguments. Source artifacts are now taken from the passed links because they \r\n  contains all links now (steps and inspections).\r\n- Changes verify_item_rules algorithm\r\n  Does not return when artifact queue is empty. This prevents rules from passing just because they\r\n  were skipped.\r\n- Changes verify_all_item_rules arguments\r\n  Receives only one link dictionary for step links and inspection links.\r\n\r\n**Various related changes**\r\n- Replaces matchrule_validators.py with artifact_rules.py\r\n   Its function unpack_rule is now used instead of check_matchrule_syntax\r\n  to parse all rules for rule data and check syntax.\r\n - Removes flatten and invert utility function. \r\n    Matching solely by hash leads to collisions.\r\n - Updates demo to use new rules\r\n - Updates unit tests","created_at":"2017-02-08T21:07:09Z","updated_at":"2017-02-27T21:46:45Z","closed_at":null,"merged_at":null,"merge_commit_sha":"d05e258ac662cbce3c925c2be635e661db629f91","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/in-toto/in-toto/pulls/70/commits","review_comments_url":"https://api.github.com/repos/in-toto/in-toto/pulls/70/comments","review_comment_url":"https://api.github.com/repos/in-toto/in-toto/pulls/comments{/number}","comments_url":"https://api.github.com/repos/in-toto/in-toto/issues/70/comments","statuses_url":"https://api.github.com/repos/in-toto/in-toto/statuses/81fe49cbe51f434a93216d0ee6e879eb3810da32","head":{"label":"in-toto:artifact-rules","ref":"artifact-rules","sha":"81fe49cbe51f434a93216d0ee6e879eb3810da32","user":{"login":"in-toto","id":22891761,"avatar_url":"https://avatars.githubusercontent.com/u/22891761?v=3","gravatar_id":"","url":"https://api.github.com/users/in-toto","html_url":"https://github.com/in-toto","followers_url":"https://api.github.com/users/in-toto/followers","following_url":"https://api.github.com/users/in-toto/following{/other_user}","gists_url":"https://api.github.com/users/in-toto/gists{/gist_id}","starred_url":"https://api.github.com/users/in-toto/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/in-toto/subscriptions","organizations_url":"https://api.github.com/users/in-toto/orgs","repos_url":"https://api.github.com/users/in-toto/repos","events_url":"https://api.github.com/users/in-toto/events{/privacy}","received_events_url":"https://api.github.com/users/in-toto/received_events","type":"Organization","site_admin":false},"repo":{"id":59531400,"name":"in-toto","full_name":"in-toto/in-toto","owner":{"login":"in-toto","id":22891761,"avatar_url":"https://avatars.githubusercontent.com/u/22891761?v=3","gravatar_id":"","url":"https://api.github.com/users/in-toto","html_url":"https://github.com/in-toto","followers_url":"https://api.github.com/users/in-toto/followers","following_url":"https://api.github.com/users/in-toto/following{/other_user}","gists_url":"https://api.github.com/users/in-toto/gists{/gist_id}","starred_url":"https://api.github.com/users/in-toto/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/in-toto/subscriptions","organizations_url":"https://api.github.com/users/in-toto/orgs","repos_url":"https://api.github.com/users/in-toto/repos","events_url":"https://api.github.com/users/in-toto/events{/privacy}","received_events_url":"https://api.github.com/users/in-toto/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/in-toto/in-toto","description":"Toto is a framework to protect supply chain integrity.","fork":false,"url":"https://api.github.com/repos/in-toto/in-toto","forks_url":"https://api.github.com/repos/in-toto/in-toto/forks","keys_url":"https://api.github.com/repos/in-toto/in-toto/keys{/key_id}","collaborators_url":"https://api.github.com/repos/in-toto/in-toto/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/in-toto/in-toto/teams","hooks_url":"https://api.github.com/repos/in-toto/in-toto/hooks","issue_events_url":"https://api.github.com/repos/in-toto/in-toto/issues/events{/number}","events_url":"https://api.github.com/repos/in-toto/in-toto/events","assignees_url":"https://api.github.com/repos/in-toto/in-toto/assignees{/user}","branches_url":"https://api.github.com/repos/in-toto/in-toto/branches{/branch}","tags_url":"https://api.github.com/repos/in-toto/in-toto/tags","blobs_url":"https://api.github.com/repos/in-toto/in-toto/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/in-toto/in-toto/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/in-toto/in-toto/git/refs{/sha}","trees_url":"https://api.github.com/repos/in-toto/in-toto/git/trees{/sha}","statuses_url":"https://api.github.com/repos/in-toto/in-toto/statuses/{sha}","languages_url":"https://api.github.com/repos/in-toto/in-toto/languages","stargazers_url":"https://api.github.com/repos/in-toto/in-toto/stargazers","contributors_url":"https://api.github.com/repos/in-toto/in-toto/contributors","subscribers_url":"https://api.github.com/repos/in-toto/in-toto/subscribers","subscription_url":"https://api.github.com/repos/in-toto/in-toto/subscription","commits_url":"https://api.github.com/repos/in-toto/in-toto/commits{/sha}","git_commits_url":"https://api.github.com/repos/in-toto/in-toto/git/commits{/sha}","comments_url":"https://api.github.com/repos/in-toto/in-toto/comments{/number}","issue_comment_url":"https://api.github.com/repos/in-toto/in-toto/issues/comments{/number}","contents_url":"https://api.github.com/repos/in-toto/in-toto/contents/{+path}","compare_url":"https://api.github.com/repos/in-toto/in-toto/compare/{base}...{head}","merges_url":"https://api.github.com/repos/in-toto/in-toto/merges","archive_url":"https://api.github.com/repos/in-toto/in-toto/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/in-toto/in-toto/downloads","issues_url":"https://api.github.com/repos/in-toto/in-toto/issues{/number}","pulls_url":"https://api.github.com/repos/in-toto/in-toto/pulls{/number}","milestones_url":"https://api.github.com/repos/in-toto/in-toto/milestones{/number}","notifications_url":"https://api.github.com/repos/in-toto/in-toto/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/in-toto/in-toto/labels{/name}","releases_url":"https://api.github.com/repos/in-toto/in-toto/releases{/id}","deployments_url":"https://api.github.com/repos/in-toto/in-toto/deployments","created_at":"2016-05-24T01:46:38Z","updated_at":"2016-10-28T16:54:56Z","pushed_at":"2017-02-27T17:22:50Z","git_url":"git://github.com/in-toto/in-toto.git","ssh_url":"git@github.com:in-toto/in-toto.git","clone_url":"https://github.com/in-toto/in-toto.git","svn_url":"https://github.com/in-toto/in-toto","homepage":"","size":505,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8,"mirror_url":null,"open_issues_count":16,"forks":8,"open_issues":16,"watchers":1,"default_branch":"develop"}},"base":{"label":"in-toto:develop","ref":"develop","sha":"0aa3f56f9b8d19a1a3943c79019281085db83fef","user":{"login":"in-toto","id":22891761,"avatar_url":"https://avatars.githubusercontent.com/u/22891761?v=3","gravatar_id":"","url":"https://api.github.com/users/in-toto","html_url":"https://github.com/in-toto","followers_url":"https://api.github.com/users/in-toto/followers","following_url":"https://api.github.com/users/in-toto/following{/other_user}","gists_url":"https://api.github.com/users/in-toto/gists{/gist_id}","starred_url":"https://api.github.com/users/in-toto/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/in-toto/subscriptions","organizations_url":"https://api.github.com/users/in-toto/orgs","repos_url":"https://api.github.com/users/in-toto/repos","events_url":"https://api.github.com/users/in-toto/events{/privacy}","received_events_url":"https://api.github.com/users/in-toto/received_events","type":"Organization","site_admin":false},"repo":{"id":59531400,"name":"in-toto","full_name":"in-toto/in-toto","owner":{"login":"in-toto","id":22891761,"avatar_url":"https://avatars.githubusercontent.com/u/22891761?v=3","gravatar_id":"","url":"https://api.github.com/users/in-toto","html_url":"https://github.com/in-toto","followers_url":"https://api.github.com/users/in-toto/followers","following_url":"https://api.github.com/users/in-toto/following{/other_user}","gists_url":"https://api.github.com/users/in-toto/gists{/gist_id}","starred_url":"https://api.github.com/users/in-toto/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/in-toto/subscriptions","organizations_url":"https://api.github.com/users/in-toto/orgs","repos_url":"https://api.github.com/users/in-toto/repos","events_url":"https://api.github.com/users/in-toto/events{/privacy}","received_events_url":"https://api.github.com/users/in-toto/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/in-toto/in-toto","description":"Toto is a framework to protect supply chain integrity.","fork":false,"url":"https://api.github.com/repos/in-toto/in-toto","forks_url":"https://api.github.com/repos/in-toto/in-toto/forks","keys_url":"https://api.github.com/repos/in-toto/in-toto/keys{/key_id}","collaborators_url":"https://api.github.com/repos/in-toto/in-toto/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/in-toto/in-toto/teams","hooks_url":"https://api.github.com/repos/in-toto/in-toto/hooks","issue_events_url":"https://api.github.com/repos/in-toto/in-toto/issues/events{/number}","events_url":"https://api.github.com/repos/in-toto/in-toto/events","assignees_url":"https://api.github.com/repos/in-toto/in-toto/assignees{/user}","branches_url":"https://api.github.com/repos/in-toto/in-toto/branches{/branch}","tags_url":"https://api.github.com/repos/in-toto/in-toto/tags","blobs_url":"https://api.github.com/repos/in-toto/in-toto/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/in-toto/in-toto/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/in-toto/in-toto/git/refs{/sha}","trees_url":"https://api.github.com/repos/in-toto/in-toto/git/trees{/sha}","statuses_url":"https://api.github.com/repos/in-toto/in-toto/statuses/{sha}","languages_url":"https://api.github.com/repos/in-toto/in-toto/languages","stargazers_url":"https://api.github.com/repos/in-toto/in-toto/stargazers","contributors_url":"https://api.github.com/repos/in-toto/in-toto/contributors","subscribers_url":"https://api.github.com/repos/in-toto/in-toto/subscribers","subscription_url":"https://api.github.com/repos/in-toto/in-toto/subscription","commits_url":"https://api.github.com/repos/in-toto/in-toto/commits{/sha}","git_commits_url":"https://api.github.com/repos/in-toto/in-toto/git/commits{/sha}","comments_url":"https://api.github.com/repos/in-toto/in-toto/comments{/number}","issue_comment_url":"https://api.github.com/repos/in-toto/in-toto/issues/comments{/number}","contents_url":"https://api.github.com/repos/in-toto/in-toto/contents/{+path}","compare_url":"https://api.github.com/repos/in-toto/in-toto/compare/{base}...{head}","merges_url":"https://api.github.com/repos/in-toto/in-toto/merges","archive_url":"https://api.github.com/repos/in-toto/in-toto/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/in-toto/in-toto/downloads","issues_url":"https://api.github.com/repos/in-toto/in-toto/issues{/number}","pulls_url":"https://api.github.com/repos/in-toto/in-toto/pulls{/number}","milestones_url":"https://api.github.com/repos/in-toto/in-toto/milestones{/number}","notifications_url":"https://api.github.com/repos/in-toto/in-toto/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/in-toto/in-toto/labels{/name}","releases_url":"https://api.github.com/repos/in-toto/in-toto/releases{/id}","deployments_url":"https://api.github.com/repos/in-toto/in-toto/deployments","created_at":"2016-05-24T01:46:38Z","updated_at":"2016-10-28T16:54:56Z","pushed_at":"2017-02-27T17:22:50Z","git_url":"git://github.com/in-toto/in-toto.git","ssh_url":"git@github.com:in-toto/in-toto.git","clone_url":"https://github.com/in-toto/in-toto.git","svn_url":"https://github.com/in-toto/in-toto","homepage":"","size":505,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":8,"mirror_url":null,"open_issues_count":16,"forks":8,"open_issues":16,"watchers":1,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/in-toto/in-toto/pulls/70"},"html":{"href":"https://github.com/in-toto/in-toto/pull/70"},"issue":{"href":"https://api.github.com/repos/in-toto/in-toto/issues/70"},"comments":{"href":"https://api.github.com/repos/in-toto/in-toto/issues/70/comments"},"review_comments":{"href":"https://api.github.com/repos/in-toto/in-toto/pulls/70/comments"},"review_comment":{"href":"https://api.github.com/repos/in-toto/in-toto/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/in-toto/in-toto/pulls/70/commits"},"statuses":{"href":"https://api.github.com/repos/in-toto/in-toto/statuses/81fe49cbe51f434a93216d0ee6e879eb3810da32"}}}}
{"actor":{"display_login":"SantiagoTorres"}}