{"action":"created","comment":{"url":"https://api.github.com/repos/Yelp/paasta/pulls/comments/90485663","pull_request_review_id":11004609,"id":90485663,"diff_hunk":"@@ -635,6 +635,47 @@ def test_check_schedule_valid_complete(self):\n         assert okay is True\n         assert msg == ''\n \n+    def test_check_schedule_valid_cron(self):\n+        fake_schedule = '* * * * *'\n+        chronos_config = chronos_tools.ChronosJobConfig(\n+            service='',\n+            cluster='',\n+            instance='',\n+            config_dict={'schedule': fake_schedule},\n+            branch_dict={},\n+        )\n+        okay, msg = chronos_config.check_schedule()\n+        assert okay is True\n+        assert msg == ''\n+\n+    def test_check_schedule_invalid_cron_sixth_field(self):\n+        fake_schedule = '* * * * * *'\n+        chronos_config = chronos_tools.ChronosJobConfig(\n+            service='',\n+            cluster='',\n+            instance='',\n+            config_dict={'schedule': fake_schedule},\n+            branch_dict={},\n+        )\n+        okay, msg = chronos_config.check_schedule()\n+        assert okay is False\n+        assert msg == ('The specified schedule \"* * * * * *\" '","path":"tests/test_chronos_tools.py","position":28,"original_position":28,"commit_id":"6426edcd87f5fabf2f30a1e30dd0f7ef209179c2","original_commit_id":"6426edcd87f5fabf2f30a1e30dd0f7ef209179c2","user":{"login":"mattmb","id":2462243,"avatar_url":"https://avatars.githubusercontent.com/u/2462243?v=3","gravatar_id":"","url":"https://api.github.com/users/mattmb","html_url":"https://github.com/mattmb","followers_url":"https://api.github.com/users/mattmb/followers","following_url":"https://api.github.com/users/mattmb/following{/other_user}","gists_url":"https://api.github.com/users/mattmb/gists{/gist_id}","starred_url":"https://api.github.com/users/mattmb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mattmb/subscriptions","organizations_url":"https://api.github.com/users/mattmb/orgs","repos_url":"https://api.github.com/users/mattmb/repos","events_url":"https://api.github.com/users/mattmb/events{/privacy}","received_events_url":"https://api.github.com/users/mattmb/received_events","type":"User","site_admin":false},"body":"Not a blocker to shipping this but I hate that we assert specific error messages in our tests :-(\r\n\r\nIf you're in a generous mood, fix this up with proper Exception classes and assert that the correct exception is raised instead. The code itself could catch the exception and output the human readable message.","created_at":"2016-12-01T16:39:00Z","updated_at":"2016-12-01T16:40:37Z","html_url":"https://github.com/Yelp/paasta/pull/912#discussion_r90485663","pull_request_url":"https://api.github.com/repos/Yelp/paasta/pulls/912","_links":{"self":{"href":"https://api.github.com/repos/Yelp/paasta/pulls/comments/90485663"},"html":{"href":"https://github.com/Yelp/paasta/pull/912#discussion_r90485663"},"pull_request":{"href":"https://api.github.com/repos/Yelp/paasta/pulls/912"}}},"pull_request":{"url":"https://api.github.com/repos/Yelp/paasta/pulls/912","id":96097443,"html_url":"https://github.com/Yelp/paasta/pull/912","diff_url":"https://github.com/Yelp/paasta/pull/912.diff","patch_url":"https://github.com/Yelp/paasta/pull/912.patch","issue_url":"https://api.github.com/repos/Yelp/paasta/issues/912","number":912,"state":"open","locked":false,"title":"Add cron support","user":{"login":"Rob-Johnson","id":1389671,"avatar_url":"https://avatars.githubusercontent.com/u/1389671?v=3","gravatar_id":"","url":"https://api.github.com/users/Rob-Johnson","html_url":"https://github.com/Rob-Johnson","followers_url":"https://api.github.com/users/Rob-Johnson/followers","following_url":"https://api.github.com/users/Rob-Johnson/following{/other_user}","gists_url":"https://api.github.com/users/Rob-Johnson/gists{/gist_id}","starred_url":"https://api.github.com/users/Rob-Johnson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Rob-Johnson/subscriptions","organizations_url":"https://api.github.com/users/Rob-Johnson/orgs","repos_url":"https://api.github.com/users/Rob-Johnson/repos","events_url":"https://api.github.com/users/Rob-Johnson/events{/privacy}","received_events_url":"https://api.github.com/users/Rob-Johnson/received_events","type":"User","site_admin":false},"body":"Updates validation of the ``schedule`` field to allow cron-style schedule strings. I've verified that the library being used, ``python-crontab``, has a specification for the cron-schedule strings consistent with that which the library used in Chronos does.\r\n\r\nTaken from internal ticket PAASTA-7161:\r\n\r\n> I've kind of done an adhoc integration test to see which cron schedules Chronos will be able to parse  from the current Tronfig. I took all the current tronfig cron schedules and parsed them with the same parser Chronos uses.\r\n\r\n```\r\nscala> val lines = fromFile(\"/tmp/test-crons\").getLines\r\nlines: Iterator[String] = non-empty iterator\r\n\r\nscala> val parsed = lines.map(cron => Try(unixCronParser.parse(cron)))\r\nparsed: Iterator[scala.util.Try[com.cronutils.model.Cron]] = non-empty iterator\r\n\r\nscala> parsed.toArray.foreach(println)\r\nSuccess(com.cronutils.model.Cron@1dfcf85a)\r\nSuccess(com.cronutils.model.Cron@590dea35)\r\nSuccess(com.cronutils.model.Cron@6550ce46)\r\nSuccess(com.cronutils.model.Cron@69f69078)\r\nSuccess(com.cronutils.model.Cron@13b29b34)\r\nSuccess(com.cronutils.model.Cron@25589735)\r\nSuccess(com.cronutils.model.Cron@46994f26)\r\nSuccess(com.cronutils.model.Cron@1bb172dd)\r\nSuccess(com.cronutils.model.Cron@1cdd31a4)\r\nSuccess(com.cronutils.model.Cron@7dddfc35)\r\nSuccess(com.cronutils.model.Cron@71316cd7)\r\nSuccess(com.cronutils.model.Cron@6106dfb6)\r\nSuccess(com.cronutils.model.Cron@14239223)\r\nSuccess(com.cronutils.model.Cron@68df8c6)\r\nSuccess(com.cronutils.model.Cron@7c206b14)\r\nSuccess(com.cronutils.model.Cron@2b8cf049)\r\nSuccess(com.cronutils.model.Cron@2336cd91)\r\nSuccess(com.cronutils.model.Cron@4a944af9)\r\nSuccess(com.cronutils.model.Cron@3593e074)\r\nSuccess(com.cronutils.model.Cron@79d14037)\r\nSuccess(com.cronutils.model.Cron@6c1e40d9)\r\nSuccess(com.cronutils.model.Cron@4b50c21)\r\nSuccess(com.cronutils.model.Cron@2e0fdc83)\r\nSuccess(com.cronutils.model.Cron@5dacf18d)\r\nSuccess(com.cronutils.model.Cron@432a6a69)\r\nSuccess(com.cronutils.model.Cron@6f52a229)\r\nSuccess(com.cronutils.model.Cron@3fe98084)\r\nSuccess(com.cronutils.model.Cron@5f33e6d)\r\nSuccess(com.cronutils.model.Cron@151a6598)\r\nSuccess(com.cronutils.model.Cron@6fa3def8)\r\nSuccess(com.cronutils.model.Cron@1c3d9e28)\r\nSuccess(com.cronutils.model.Cron@a1cb94)\r\nSuccess(com.cronutils.model.Cron@46d148bd)\r\nSuccess(com.cronutils.model.Cron@37f41a81)\r\nSuccess(com.cronutils.model.Cron@47c81e89)\r\nSuccess(com.cronutils.model.Cron@49bb808f)\r\nSuccess(com.cronutils.model.Cron@563ada5)\r\nFailure(java.lang.IllegalArgumentException: Invalid chars in expression! Expression: L Invalid chars: L)\r\nSuccess(com.cronutils.model.Cron@12548f9a)\r\nSuccess(com.cronutils.model.Cron@156ff70f)\r\nSuccess(com.cronutils.model.Cron@c5a2d5)\r\nFailure(java.lang.IllegalArgumentException: Cron expression contains 6 parts but we expect one of [5])\r\nFailure(java.lang.IllegalArgumentException: Cron expression contains 6 parts but we expect one of [5])\r\nSuccess(com.cronutils.model.Cron@185339ed)\r\nSuccess(com.cronutils.model.Cron@2e4d4d22)\r\nSuccess(com.cronutils.model.Cron@4470106b)\r\nSuccess(com.cronutils.model.Cron@690ed13a)\r\nSuccess(com.cronutils.model.Cron@681311a7)\r\nSuccess(com.cronutils.model.Cron@2c7375da)\r\nSuccess(com.cronutils.model.Cron@68c4db77)\r\nSuccess(com.cronutils.model.Cron@775c4054)\r\nSuccess(com.cronutils.model.Cron@7b2e931)\r\nSuccess(com.cronutils.model.Cron@305881b8)\r\nSuccess(com.cronutils.model.Cron@7e89eba7)\r\nSuccess(com.cronutils.model.Cron@6bc25ac2)\r\nSuccess(com.cronutils.model.Cron@7b29cdea)\r\nSuccess(com.cronutils.model.Cron@f08d676)\r\nSuccess(com.cronutils.model.Cron@3eedd0e3)\r\nSuccess(com.cronutils.model.Cron@478089b6)\r\nSuccess(com.cronutils.model.Cron@72f35a31)\r\nSuccess(com.cronutils.model.Cron@3b01897f)\r\nSuccess(com.cronutils.model.Cron@6b3b2c34)\r\nSuccess(com.cronutils.model.Cron@28b5d5dc)\r\nSuccess(com.cronutils.model.Cron@407f2029)\r\nSuccess(com.cronutils.model.Cron@77020328)\r\nSuccess(com.cronutils.model.Cron@45eacb70)\r\nSuccess(com.cronutils.model.Cron@4377ed24)\r\nSuccess(com.cronutils.model.Cron@7a30e30b)\r\nSuccess(com.cronutils.model.Cron@1dcca426)\r\nSuccess(com.cronutils.model.Cron@e6e5da4)\r\nSuccess(com.cronutils.model.Cron@720c8f80)\r\nSuccess(com.cronutils.model.Cron@f591271)\r\nSuccess(com.cronutils.model.Cron@77cc6a28)\r\nSuccess(com.cronutils.model.Cron@b339a08)\r\nSuccess(com.cronutils.model.Cron@1d556461)\r\nSuccess(com.cronutils.model.Cron@5a583720)\r\nSuccess(com.cronutils.model.Cron@4ed19b69)\r\nSuccess(com.cronutils.model.Cron@59a5bb61)\r\nSuccess(com.cronutils.model.Cron@6f65aa58)\r\nSuccess(com.cronutils.model.Cron@749f61a3)\r\nSuccess(com.cronutils.model.Cron@36d7a68a)\r\nSuccess(com.cronutils.model.Cron@42dd7d82)\r\nSuccess(com.cronutils.model.Cron@2838eb)\r\nSuccess(com.cronutils.model.Cron@fb5d334)\r\nSuccess(com.cronutils.model.Cron@45dc7be)\r\n```\r\n\r\n> Those that fail have a 6th field - I think this is representing a 'year' field. Cron doesn't support this by default according to https://linux.die.net/man/5/crontab\r\n\r\n> Given that the value is ``*`` in both instances, I think we're safe.\r\n\r\n```\r\nrobj@dev4-uswest1cdevc:~/tronfig master % git grep -h \"schedule: \\\"cron\" | awk '{$1=$2=\"\"; print $0}' | awk '{$1=$1;print}'| sed 's/\".*$//' | awk 'NF == 6 { print $0 } '\r\n*/5 9-23 * * 1 *\r\n*/5 8-14 * * 2 *\r\n```\r\n\r\nThe other failure is a task using the extra \"L\" syntax representing last day of month.\r\n```\r\nrobj@dev4-uswest1cdevc:~/tronfig master % git grep -h \"schedule: \\\"cron\" | awk '{$1=$2=\"\"; print $0}' | awk '{$1=$1;print}'| sed 's/\".*$//' | grep \"L\"\r\n0 16 L * *\r\n```\r\n\r\nAnd cross validating with those that the python library considers to be acceptable schedules:\r\n\r\n```\r\n>>> from crontab import CronSlices\r\n>>> f = open('/tmp/test-crons')\r\n>>> lines = f.readlines()\r\n>>> lines = map(lambda line: line.strip(), lines)\r\n>>> filter(lambda x: not x[1], map(lambda line: (line, CronSlices.is_valid(line)), lines))\r\n[('0 16 L * *', False), ('*/5 9-23 * * 1 *', False), ('*/5 8-14 * * 2 *', False)]\r\n```\r\n\r\nThis is good: the python library rejects the same schedules as Chronos.\r\n\r\nI've ran the itests locally with the right deb installed and observed them passing.\r\n\r\nHere's the output from ``paasta status`` of a test job (note the ``schedule`` field):\r\n\r\n```\r\nroot@44a82df1df8d:/work/paasta_tools# ./paasta_serviceinit.py -s hello-world -i test_chronos status\r\ninstance: test_chronos\r\nGit sha:    9cdf957d (desired)\r\nDesired:    Scheduled\r\nJob:     hello-world test_chronos\r\n  Status:   Scheduled (idle)  Last:     OK (2016-12-01T13:05, 30 seconds ago)\r\n  Schedule: * * * * * (UTC) Epsilon: PT60S\r\n  Command:  echo \"hello world\"\r\n  Mesos:    Not running\r\n```\r\n\r\n\r\n\r\n\r\nNB: The integration tests will fail until I merge https://github.com/Yelp/chronos/pull/46 and update the integration tests to use the latest deb package.\r\n\r\n","created_at":"2016-12-01T14:22:39Z","updated_at":"2016-12-01T16:40:37Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8c5ca48d1749a7b446aae3bb9023ebdff258a824","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/Yelp/paasta/pulls/912/commits","review_comments_url":"https://api.github.com/repos/Yelp/paasta/pulls/912/comments","review_comment_url":"https://api.github.com/repos/Yelp/paasta/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Yelp/paasta/issues/912/comments","statuses_url":"https://api.github.com/repos/Yelp/paasta/statuses/6426edcd87f5fabf2f30a1e30dd0f7ef209179c2","head":{"label":"Yelp:add-cron-support","ref":"add-cron-support","sha":"6426edcd87f5fabf2f30a1e30dd0f7ef209179c2","user":{"login":"Yelp","id":49071,"avatar_url":"https://avatars.githubusercontent.com/u/49071?v=3","gravatar_id":"","url":"https://api.github.com/users/Yelp","html_url":"https://github.com/Yelp","followers_url":"https://api.github.com/users/Yelp/followers","following_url":"https://api.github.com/users/Yelp/following{/other_user}","gists_url":"https://api.github.com/users/Yelp/gists{/gist_id}","starred_url":"https://api.github.com/users/Yelp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Yelp/subscriptions","organizations_url":"https://api.github.com/users/Yelp/orgs","repos_url":"https://api.github.com/users/Yelp/repos","events_url":"https://api.github.com/users/Yelp/events{/privacy}","received_events_url":"https://api.github.com/users/Yelp/received_events","type":"Organization","site_admin":false},"repo":{"id":44998824,"name":"paasta","full_name":"Yelp/paasta","owner":{"login":"Yelp","id":49071,"avatar_url":"https://avatars.githubusercontent.com/u/49071?v=3","gravatar_id":"","url":"https://api.github.com/users/Yelp","html_url":"https://github.com/Yelp","followers_url":"https://api.github.com/users/Yelp/followers","following_url":"https://api.github.com/users/Yelp/following{/other_user}","gists_url":"https://api.github.com/users/Yelp/gists{/gist_id}","starred_url":"https://api.github.com/users/Yelp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Yelp/subscriptions","organizations_url":"https://api.github.com/users/Yelp/orgs","repos_url":"https://api.github.com/users/Yelp/repos","events_url":"https://api.github.com/users/Yelp/events{/privacy}","received_events_url":"https://api.github.com/users/Yelp/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Yelp/paasta","description":"An open, distributed platform as a service","fork":false,"url":"https://api.github.com/repos/Yelp/paasta","forks_url":"https://api.github.com/repos/Yelp/paasta/forks","keys_url":"https://api.github.com/repos/Yelp/paasta/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Yelp/paasta/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Yelp/paasta/teams","hooks_url":"https://api.github.com/repos/Yelp/paasta/hooks","issue_events_url":"https://api.github.com/repos/Yelp/paasta/issues/events{/number}","events_url":"https://api.github.com/repos/Yelp/paasta/events","assignees_url":"https://api.github.com/repos/Yelp/paasta/assignees{/user}","branches_url":"https://api.github.com/repos/Yelp/paasta/branches{/branch}","tags_url":"https://api.github.com/repos/Yelp/paasta/tags","blobs_url":"https://api.github.com/repos/Yelp/paasta/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Yelp/paasta/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Yelp/paasta/git/refs{/sha}","trees_url":"https://api.github.com/repos/Yelp/paasta/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Yelp/paasta/statuses/{sha}","languages_url":"https://api.github.com/repos/Yelp/paasta/languages","stargazers_url":"https://api.github.com/repos/Yelp/paasta/stargazers","contributors_url":"https://api.github.com/repos/Yelp/paasta/contributors","subscribers_url":"https://api.github.com/repos/Yelp/paasta/subscribers","subscription_url":"https://api.github.com/repos/Yelp/paasta/subscription","commits_url":"https://api.github.com/repos/Yelp/paasta/commits{/sha}","git_commits_url":"https://api.github.com/repos/Yelp/paasta/git/commits{/sha}","comments_url":"https://api.github.com/repos/Yelp/paasta/comments{/number}","issue_comment_url":"https://api.github.com/repos/Yelp/paasta/issues/comments{/number}","contents_url":"https://api.github.com/repos/Yelp/paasta/contents/{+path}","compare_url":"https://api.github.com/repos/Yelp/paasta/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Yelp/paasta/merges","archive_url":"https://api.github.com/repos/Yelp/paasta/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Yelp/paasta/downloads","issues_url":"https://api.github.com/repos/Yelp/paasta/issues{/number}","pulls_url":"https://api.github.com/repos/Yelp/paasta/pulls{/number}","milestones_url":"https://api.github.com/repos/Yelp/paasta/milestones{/number}","notifications_url":"https://api.github.com/repos/Yelp/paasta/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Yelp/paasta/labels{/name}","releases_url":"https://api.github.com/repos/Yelp/paasta/releases{/id}","deployments_url":"https://api.github.com/repos/Yelp/paasta/deployments","created_at":"2015-10-26T21:35:53Z","updated_at":"2016-11-29T02:23:57Z","pushed_at":"2016-12-01T16:17:16Z","git_url":"git://github.com/Yelp/paasta.git","ssh_url":"git@github.com:Yelp/paasta.git","clone_url":"https://github.com/Yelp/paasta.git","svn_url":"https://github.com/Yelp/paasta","homepage":"","size":13222,"stargazers_count":942,"watchers_count":942,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":97,"mirror_url":null,"open_issues_count":73,"forks":97,"open_issues":73,"watchers":942,"default_branch":"master"}},"base":{"label":"Yelp:master","ref":"master","sha":"69564729863851a5917bebbc9fb92b9b8a3ec2c1","user":{"login":"Yelp","id":49071,"avatar_url":"https://avatars.githubusercontent.com/u/49071?v=3","gravatar_id":"","url":"https://api.github.com/users/Yelp","html_url":"https://github.com/Yelp","followers_url":"https://api.github.com/users/Yelp/followers","following_url":"https://api.github.com/users/Yelp/following{/other_user}","gists_url":"https://api.github.com/users/Yelp/gists{/gist_id}","starred_url":"https://api.github.com/users/Yelp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Yelp/subscriptions","organizations_url":"https://api.github.com/users/Yelp/orgs","repos_url":"https://api.github.com/users/Yelp/repos","events_url":"https://api.github.com/users/Yelp/events{/privacy}","received_events_url":"https://api.github.com/users/Yelp/received_events","type":"Organization","site_admin":false},"repo":{"id":44998824,"name":"paasta","full_name":"Yelp/paasta","owner":{"login":"Yelp","id":49071,"avatar_url":"https://avatars.githubusercontent.com/u/49071?v=3","gravatar_id":"","url":"https://api.github.com/users/Yelp","html_url":"https://github.com/Yelp","followers_url":"https://api.github.com/users/Yelp/followers","following_url":"https://api.github.com/users/Yelp/following{/other_user}","gists_url":"https://api.github.com/users/Yelp/gists{/gist_id}","starred_url":"https://api.github.com/users/Yelp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Yelp/subscriptions","organizations_url":"https://api.github.com/users/Yelp/orgs","repos_url":"https://api.github.com/users/Yelp/repos","events_url":"https://api.github.com/users/Yelp/events{/privacy}","received_events_url":"https://api.github.com/users/Yelp/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Yelp/paasta","description":"An open, distributed platform as a service","fork":false,"url":"https://api.github.com/repos/Yelp/paasta","forks_url":"https://api.github.com/repos/Yelp/paasta/forks","keys_url":"https://api.github.com/repos/Yelp/paasta/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Yelp/paasta/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Yelp/paasta/teams","hooks_url":"https://api.github.com/repos/Yelp/paasta/hooks","issue_events_url":"https://api.github.com/repos/Yelp/paasta/issues/events{/number}","events_url":"https://api.github.com/repos/Yelp/paasta/events","assignees_url":"https://api.github.com/repos/Yelp/paasta/assignees{/user}","branches_url":"https://api.github.com/repos/Yelp/paasta/branches{/branch}","tags_url":"https://api.github.com/repos/Yelp/paasta/tags","blobs_url":"https://api.github.com/repos/Yelp/paasta/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Yelp/paasta/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Yelp/paasta/git/refs{/sha}","trees_url":"https://api.github.com/repos/Yelp/paasta/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Yelp/paasta/statuses/{sha}","languages_url":"https://api.github.com/repos/Yelp/paasta/languages","stargazers_url":"https://api.github.com/repos/Yelp/paasta/stargazers","contributors_url":"https://api.github.com/repos/Yelp/paasta/contributors","subscribers_url":"https://api.github.com/repos/Yelp/paasta/subscribers","subscription_url":"https://api.github.com/repos/Yelp/paasta/subscription","commits_url":"https://api.github.com/repos/Yelp/paasta/commits{/sha}","git_commits_url":"https://api.github.com/repos/Yelp/paasta/git/commits{/sha}","comments_url":"https://api.github.com/repos/Yelp/paasta/comments{/number}","issue_comment_url":"https://api.github.com/repos/Yelp/paasta/issues/comments{/number}","contents_url":"https://api.github.com/repos/Yelp/paasta/contents/{+path}","compare_url":"https://api.github.com/repos/Yelp/paasta/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Yelp/paasta/merges","archive_url":"https://api.github.com/repos/Yelp/paasta/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Yelp/paasta/downloads","issues_url":"https://api.github.com/repos/Yelp/paasta/issues{/number}","pulls_url":"https://api.github.com/repos/Yelp/paasta/pulls{/number}","milestones_url":"https://api.github.com/repos/Yelp/paasta/milestones{/number}","notifications_url":"https://api.github.com/repos/Yelp/paasta/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Yelp/paasta/labels{/name}","releases_url":"https://api.github.com/repos/Yelp/paasta/releases{/id}","deployments_url":"https://api.github.com/repos/Yelp/paasta/deployments","created_at":"2015-10-26T21:35:53Z","updated_at":"2016-11-29T02:23:57Z","pushed_at":"2016-12-01T16:17:16Z","git_url":"git://github.com/Yelp/paasta.git","ssh_url":"git@github.com:Yelp/paasta.git","clone_url":"https://github.com/Yelp/paasta.git","svn_url":"https://github.com/Yelp/paasta","homepage":"","size":13222,"stargazers_count":942,"watchers_count":942,"language":"Python","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":97,"mirror_url":null,"open_issues_count":73,"forks":97,"open_issues":73,"watchers":942,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Yelp/paasta/pulls/912"},"html":{"href":"https://github.com/Yelp/paasta/pull/912"},"issue":{"href":"https://api.github.com/repos/Yelp/paasta/issues/912"},"comments":{"href":"https://api.github.com/repos/Yelp/paasta/issues/912/comments"},"review_comments":{"href":"https://api.github.com/repos/Yelp/paasta/pulls/912/comments"},"review_comment":{"href":"https://api.github.com/repos/Yelp/paasta/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Yelp/paasta/pulls/912/commits"},"statuses":{"href":"https://api.github.com/repos/Yelp/paasta/statuses/6426edcd87f5fabf2f30a1e30dd0f7ef209179c2"}}}}
{"actor":{"display_login":"mattmb"}}