{"action":"created","comment":{"url":"https://api.github.com/repos/sunlightlabs/openstates/pulls/comments/25895282","id":25895282,"diff_hunk":"@@ -13,43 +13,333 @@\n class OHBillScraper(BillScraper):\n     jurisdiction = 'oh'\n \n-    def scrape(self, chamber, session):\n+    def scrape(self, session, chambers):\n         if int(session) < 128:\n             raise AssertionError(\"No data for period {}\".format(session))\n \n-        base_url = 'http://www.lsc.state.oh.us/status%s/' % session\n+        elif int(session) < 131:\n+            #they changed their data format starting in 131st and added\n+            #an undocumented API\n+            self.old_scrape(session)\n \n-        bill_types = {'lower': [('hb', 'bill'),\n-                                ('hjr', 'joint resolution'),\n-                                ('hcr', 'concurrent resolution')],\n-                      'upper': [('sb', 'bill'),\n-                                ('sjr', 'joint resolution'),\n-                                ('scr', 'concurrent resolution')]}\n \n-        for bill_prefix, bill_type in bill_types[chamber]:\n-            url = base_url + '%s.xlsx' % bill_prefix\n+            \n+        else:\n+            chamber_dict = {\"Senate\":\"upper\",\"House\":\"lower\",\"House of Representatives\":\"lower\",\"house\":\"lower\",\"senate\":\"upper\"}\n+            \n+            #so presumanbly not everything passes, but we haven't\n+            #seen anything not pass yet, so we'll need to wait\n+            #till it fails and get the right language in here\n+            vote_results = {\"approved\":True,\n+                            \"passed\":True,\n+                            \"adopted\":True,\n+                            \"true\":True,\n+                            \"false\":False,\n+                            True:True,\n+                            False:False}\n+\n+            action_dict = {\"ref_ctte_100\":\"committee:referred\",\n+                            \"intro_100\":\"bill:introduced\",\n+                            \"pass_300\":\"bill:passed\",\n+                            \"intro_110\":\"bill:reading:1\",\n+                            \"refer_210\":\"committee:referred\",\n+                            \"crpt_301\":\"other\",\n+                            \"crpt_317\": \"other\",\n+                            \"intro_102\":[\"bill:introduced\",\"bill:passed\"],\n+                            \"intro_105\":[\"bill:introduced\",\"bill:passed\"],\n+                            \"intro_ref_ctte_100\":\"committee:referred\",\n+                            \"refer_209\":\"other\",\n+                            \"intro_108\":[\"bill:introduced\",\"bill:passed\"],\n+                            \"intro_103\": [\"bill:introduced\",\"bill:passed\"],\n+                            \"msg_reso_503\": \"bill:passed\",\n+                            \"intro_107\": [\"bill:introduced\",\"bill:passed\"],\n+                            \"imm_consid_360\": \"bill:passed\"}\n+\n+            \n+\n+            base_url = \"http://search-prod.lis.state.oh.us/\"\n+            first_page = base_url + \"/solarapi/v1/general_assembly_{session}/\".format(session=session)\n+            legislators = self.get_legislator_ids(first_page)\n+            all_amendments = self.get_other_data_source(first_page,base_url,\"amendments\")\n+            all_fiscals = self.get_other_data_source(first_page,base_url,\"fiscals\")\n+            all_synopsis = self.get_other_data_source(first_page,base_url,\"synopsiss\")\n+            all_analysis = self.get_other_data_source(first_page,base_url,\"analysiss\")\n+            doc_types = [\"bills\",\"resolutions\"]\n+            for doc_type in doc_types:\n+                bill_versions = {}\n+                for doc in self.pages(base_url,first_page+doc_type):\n+                    for v in doc[\"items\"]:\n+                        #bills is actually a list of versions\n+                        #going to create a dictionary as follows:\n+                        #key=bill_id\n+                        #value = dict of all versions, where keys are versionids\n+                        #and values are the bill data from the api.\n+                        #then loop through that to avoid duplicate bills\n+\n+                        bill_id = v[\"number\"]\n+                        version_id = v[\"versionid\"]\n+                        if bill_id in bill_versions:\n+                            if version_id in bill_versions[bill_id]:\n+                                self.logger.warning(\"There are two versions of {bill_id} called the same thing. Bad news bears!\".format(bill_id=bill_id))\n+                            else:\n+                                bill_versions[bill_id][version_id] = v\n+                        else:\n+                            bill_versions[bill_id] = {}\n+                            bill_versions[bill_id][version_id] = v\n+\n+                    \n+\n+                for b in bill_versions:\n+                    bill = None\n+                    for bill_version in bill_versions[b].values():\n+                        if not bill:\n+                            bill_id = bill_version[\"number\"]\n+                            title = bill_version[\"shorttitle\"] or bill_version[\"longtitle\"]\n+\n+                            title = title.strip()\n+\n+                            chamber = chamber_dict[bill_version[\"chamber\"]]\n+\n+                            subjects = []\n+                            for subj in bill_version[\"subjectindexes\"]:\n+                                try:\n+                                    subjects.append(subj[\"primary\"])\n+                                except KeyError:\n+                                    pass\n+\n+\n+                            bill = Bill(session,chamber,bill_id,title,subjects=subjects,type=doc_type)\n+\n+                            #this stuff is the same for all versions\n+\n+                            bill.add_source(first_page+doc_type+\"/\"+bill_id)\n+\n+                            sponsors = bill_version[\"sponsors\"]\n+                            for sponsor in sponsors:\n+                                sponsor_name = self.get_sponsor_name(sponsor)\n+                                bill.add_sponsor(\"primary\",sponsor_name)\n+\n+                            cosponsors = bill_version[\"cosponsors\"]\n+                            for sponsor in cosponsors:\n+                                sponsor_name = self.get_sponsor_name(sponsor)\n+                                bill.add_sponsor(\"cosponsor\",sponsor_name)\n+\n+                            #actions\n+                            blacklist = [\"/solarapi/v1/general_assembly_131/resolutions/lr_131_0035-1/actions\"]\n+                            #the page in the blacklist just plain old failed to load\n+                            #and everything got stuck\n+                            if bill_version[\"action\"][0][\"link\"] not in blacklist:\n+                                action_doc = self.get(base_url+bill_version[\"action\"][0][\"link\"])\n+\n+                                actions = action_doc.json()\n+                                for action in actions[\"items\"]:\n+                                    actor = chamber_dict[action[\"chamber\"]]\n+                                    action_desc = action[\"description\"]\n+                                    try:\n+                                        action_type = action_dict[action[\"actioncode\"]]\n+                                    except KeyError:\n+                                        raise AssertionError(\"Unknown action {desc} with code {code}. Add it to the action_dict.\".format(desc=action_desc, code=action[\"actioncode\"]))\n+                                        \n+\n+                                    date = datetime.datetime.strptime(action[\"datetime\"],\"%Y-%m-%dT%H:%M:%S\")\n+\n+                                    committees = None\n+                                    if \"committee\" in action:\n+                                        committees = action[\"committee\"]\n+\n+                                    bill.add_action(actor,\n+                                                    action_desc,\n+                                                    date,\n+                                                    type = action_type,\n+                                                    committees = committees)\n+\n+                            self.add_document(all_amendments, bill_id,\"amendment\",bill,first_page)\n+                            self.add_document(all_fiscals,bill_id,\"fiscal\",bill,first_page)\n+                            self.add_document(all_synopsis,bill_id,\"synopsis\",bill,first_page)\n+                            self.add_document(all_analysis,bill_id,\"analysis\",bill,first_page)\n+\n+                            #todo: votes, committee votes\n+                            vote_url = base_url+bill_version[\"votes\"][0][\"link\"]\n+                            vote_doc = self.get(vote_url)\n+                            votes = vote_doc.json()\n+                            self.process_vote(votes,vote_url,bill,legislators,chamber_dict,vote_results)\n+\n+                            vote_url = base_url+bill_version[\"cmtevotes\"][0][\"link\"]\n+                            vote_doc = self.get(vote_url)\n+                            votes = vote_doc.json()\n+                            self.process_vote(votes,vote_url,bill,legislators,chamber_dict,vote_results)\n+\n+\n+                            #we have never seen a veto or a disapprove, but they seem important.\n+                            #so we'll check and throw an error if we find one\n+                            #life is fragile. so are our scrapers.\n+                            if \"veto\" in bill_version:\n+                                veto_url = base_url+bill_version[\"veto\"][0][\"link\"]\n+                                veto_json = self.get(veto_url).json()\n+                                if len(veto_json[\"items\"]) > 0:\n+                                    raise AssertionError(\"Whoa, a veto! We've never gotten one before. Go write some code to deal with it: {}\".format(veto_url))\n+\n+                            if \"disapprove\" in bill_version:\n+                                disapprove_url = base_url+bill_version[\"disapprove\"][0][\"link\"]\n+                                disapprove_json = self.get(disapprove_url).json()\n+                                if len(disapprove_json[\"items\"]) > 0:\n+                                    raise AssertionError(\"Whoa, a disapprove! We've never gotten one before. Go write some code to deal with it: {}\".format(disapprove_url))\n+\n+\n+\n+\n+                        #this stuff is version-specific\n+                        version_name = bill_version[\"version\"]\n+                        version_link = base_url+bill_version[\"pdfDownloadLink\"]\n+                        mimetype = \"application/pdf\" if version_link.endswith(\"pdf\") else None\n+                        bill.add_version(version_name,version_link,mimetype=mimetype)\n+\n+                    self.save_bill(bill)\n+\n+    def pages(self,base_url, first_page):","path":"openstates/oh/bills.py","position":197,"original_position":197,"commit_id":"5de446e32b21a9bf99fb1d4dbddf8a6e85d2f42f","original_commit_id":"5de446e32b21a9bf99fb1d4dbddf8a6e85d2f42f","user":{"login":"mileswwatkins","id":4959135,"avatar_url":"https://avatars.githubusercontent.com/u/4959135?v=3","gravatar_id":"","url":"https://api.github.com/users/mileswwatkins","html_url":"https://github.com/mileswwatkins","followers_url":"https://api.github.com/users/mileswwatkins/followers","following_url":"https://api.github.com/users/mileswwatkins/following{/other_user}","gists_url":"https://api.github.com/users/mileswwatkins/gists{/gist_id}","starred_url":"https://api.github.com/users/mileswwatkins/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mileswwatkins/subscriptions","organizations_url":"https://api.github.com/users/mileswwatkins/orgs","repos_url":"https://api.github.com/users/mileswwatkins/repos","events_url":"https://api.github.com/users/mileswwatkins/events{/privacy}","received_events_url":"https://api.github.com/users/mileswwatkins/received_events","type":"User","site_admin":false},"body":"Why not just set it to a very high value (10000?), remove the recursive pagination code, and then raise an error if `nextLink` exists? The highest pagination I saw in my scrape was ~200, so I don't think that we'd ever hit an extremely high number.","created_at":"2015-03-05T19:48:57Z","updated_at":"2015-03-05T19:48:57Z","html_url":"https://github.com/sunlightlabs/openstates/pull/602#discussion_r25895282","pull_request_url":"https://api.github.com/repos/sunlightlabs/openstates/pulls/602","_links":{"self":{"href":"https://api.github.com/repos/sunlightlabs/openstates/pulls/comments/25895282"},"html":{"href":"https://github.com/sunlightlabs/openstates/pull/602#discussion_r25895282"},"pull_request":{"href":"https://api.github.com/repos/sunlightlabs/openstates/pulls/602"}}},"pull_request":{"url":"https://api.github.com/repos/sunlightlabs/openstates/pulls/602","id":30580181,"html_url":"https://github.com/sunlightlabs/openstates/pull/602","diff_url":"https://github.com/sunlightlabs/openstates/pull/602.diff","patch_url":"https://github.com/sunlightlabs/openstates/pull/602.patch","issue_url":"https://api.github.com/repos/sunlightlabs/openstates/issues/602","number":602,"state":"open","locked":false,"title":"OH: bill scraper rewritten for 131st session","user":{"login":"rshorey","id":901091,"avatar_url":"https://avatars.githubusercontent.com/u/901091?v=3","gravatar_id":"","url":"https://api.github.com/users/rshorey","html_url":"https://github.com/rshorey","followers_url":"https://api.github.com/users/rshorey/followers","following_url":"https://api.github.com/users/rshorey/following{/other_user}","gists_url":"https://api.github.com/users/rshorey/gists{/gist_id}","starred_url":"https://api.github.com/users/rshorey/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rshorey/subscriptions","organizations_url":"https://api.github.com/users/rshorey/orgs","repos_url":"https://api.github.com/users/rshorey/repos","events_url":"https://api.github.com/users/rshorey/events{/privacy}","received_events_url":"https://api.github.com/users/rshorey/received_events","type":"User","site_admin":false},"body":"now using their undocumented api, here:\r\n\r\nhttp://search-prod.lis.state.oh.us/solarapi/v1/","created_at":"2015-03-05T18:00:42Z","updated_at":"2015-03-05T19:48:57Z","closed_at":null,"merged_at":null,"merge_commit_sha":"738b31a4d2a41f92f2cecc45652b5732ec78dbbd","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/sunlightlabs/openstates/pulls/602/commits","review_comments_url":"https://api.github.com/repos/sunlightlabs/openstates/pulls/602/comments","review_comment_url":"https://api.github.com/repos/sunlightlabs/openstates/pulls/comments{/number}","comments_url":"https://api.github.com/repos/sunlightlabs/openstates/issues/602/comments","statuses_url":"https://api.github.com/repos/sunlightlabs/openstates/statuses/5de446e32b21a9bf99fb1d4dbddf8a6e85d2f42f","head":{"label":"rshorey:ohio","ref":"ohio","sha":"5de446e32b21a9bf99fb1d4dbddf8a6e85d2f42f","user":{"login":"rshorey","id":901091,"avatar_url":"https://avatars.githubusercontent.com/u/901091?v=3","gravatar_id":"","url":"https://api.github.com/users/rshorey","html_url":"https://github.com/rshorey","followers_url":"https://api.github.com/users/rshorey/followers","following_url":"https://api.github.com/users/rshorey/following{/other_user}","gists_url":"https://api.github.com/users/rshorey/gists{/gist_id}","starred_url":"https://api.github.com/users/rshorey/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rshorey/subscriptions","organizations_url":"https://api.github.com/users/rshorey/orgs","repos_url":"https://api.github.com/users/rshorey/repos","events_url":"https://api.github.com/users/rshorey/events{/privacy}","received_events_url":"https://api.github.com/users/rshorey/received_events","type":"User","site_admin":false},"repo":{"id":28932426,"name":"openstates","full_name":"rshorey/openstates","owner":{"login":"rshorey","id":901091,"avatar_url":"https://avatars.githubusercontent.com/u/901091?v=3","gravatar_id":"","url":"https://api.github.com/users/rshorey","html_url":"https://github.com/rshorey","followers_url":"https://api.github.com/users/rshorey/followers","following_url":"https://api.github.com/users/rshorey/following{/other_user}","gists_url":"https://api.github.com/users/rshorey/gists{/gist_id}","starred_url":"https://api.github.com/users/rshorey/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rshorey/subscriptions","organizations_url":"https://api.github.com/users/rshorey/orgs","repos_url":"https://api.github.com/users/rshorey/repos","events_url":"https://api.github.com/users/rshorey/events{/privacy}","received_events_url":"https://api.github.com/users/rshorey/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/rshorey/openstates","description":"source for Open States' scrapers","fork":true,"url":"https://api.github.com/repos/rshorey/openstates","forks_url":"https://api.github.com/repos/rshorey/openstates/forks","keys_url":"https://api.github.com/repos/rshorey/openstates/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rshorey/openstates/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rshorey/openstates/teams","hooks_url":"https://api.github.com/repos/rshorey/openstates/hooks","issue_events_url":"https://api.github.com/repos/rshorey/openstates/issues/events{/number}","events_url":"https://api.github.com/repos/rshorey/openstates/events","assignees_url":"https://api.github.com/repos/rshorey/openstates/assignees{/user}","branches_url":"https://api.github.com/repos/rshorey/openstates/branches{/branch}","tags_url":"https://api.github.com/repos/rshorey/openstates/tags","blobs_url":"https://api.github.com/repos/rshorey/openstates/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rshorey/openstates/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rshorey/openstates/git/refs{/sha}","trees_url":"https://api.github.com/repos/rshorey/openstates/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rshorey/openstates/statuses/{sha}","languages_url":"https://api.github.com/repos/rshorey/openstates/languages","stargazers_url":"https://api.github.com/repos/rshorey/openstates/stargazers","contributors_url":"https://api.github.com/repos/rshorey/openstates/contributors","subscribers_url":"https://api.github.com/repos/rshorey/openstates/subscribers","subscription_url":"https://api.github.com/repos/rshorey/openstates/subscription","commits_url":"https://api.github.com/repos/rshorey/openstates/commits{/sha}","git_commits_url":"https://api.github.com/repos/rshorey/openstates/git/commits{/sha}","comments_url":"https://api.github.com/repos/rshorey/openstates/comments{/number}","issue_comment_url":"https://api.github.com/repos/rshorey/openstates/issues/comments{/number}","contents_url":"https://api.github.com/repos/rshorey/openstates/contents/{+path}","compare_url":"https://api.github.com/repos/rshorey/openstates/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rshorey/openstates/merges","archive_url":"https://api.github.com/repos/rshorey/openstates/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rshorey/openstates/downloads","issues_url":"https://api.github.com/repos/rshorey/openstates/issues{/number}","pulls_url":"https://api.github.com/repos/rshorey/openstates/pulls{/number}","milestones_url":"https://api.github.com/repos/rshorey/openstates/milestones{/number}","notifications_url":"https://api.github.com/repos/rshorey/openstates/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rshorey/openstates/labels{/name}","releases_url":"https://api.github.com/repos/rshorey/openstates/releases{/id}","created_at":"2015-01-07T20:25:30Z","updated_at":"2015-03-02T15:44:38Z","pushed_at":"2015-03-05T17:58:43Z","git_url":"git://github.com/rshorey/openstates.git","ssh_url":"git@github.com:rshorey/openstates.git","clone_url":"https://github.com/rshorey/openstates.git","svn_url":"https://github.com/rshorey/openstates","homepage":"http://openstates.org","size":20558,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":false,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"sunlightlabs:master","ref":"master","sha":"bc5433be8803927dd971ca9c24a8b67b6f259334","user":{"login":"sunlightlabs","id":40420,"avatar_url":"https://avatars.githubusercontent.com/u/40420?v=3","gravatar_id":"","url":"https://api.github.com/users/sunlightlabs","html_url":"https://github.com/sunlightlabs","followers_url":"https://api.github.com/users/sunlightlabs/followers","following_url":"https://api.github.com/users/sunlightlabs/following{/other_user}","gists_url":"https://api.github.com/users/sunlightlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/sunlightlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sunlightlabs/subscriptions","organizations_url":"https://api.github.com/users/sunlightlabs/orgs","repos_url":"https://api.github.com/users/sunlightlabs/repos","events_url":"https://api.github.com/users/sunlightlabs/events{/privacy}","received_events_url":"https://api.github.com/users/sunlightlabs/received_events","type":"Organization","site_admin":false},"repo":{"id":138635,"name":"openstates","full_name":"sunlightlabs/openstates","owner":{"login":"sunlightlabs","id":40420,"avatar_url":"https://avatars.githubusercontent.com/u/40420?v=3","gravatar_id":"","url":"https://api.github.com/users/sunlightlabs","html_url":"https://github.com/sunlightlabs","followers_url":"https://api.github.com/users/sunlightlabs/followers","following_url":"https://api.github.com/users/sunlightlabs/following{/other_user}","gists_url":"https://api.github.com/users/sunlightlabs/gists{/gist_id}","starred_url":"https://api.github.com/users/sunlightlabs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sunlightlabs/subscriptions","organizations_url":"https://api.github.com/users/sunlightlabs/orgs","repos_url":"https://api.github.com/users/sunlightlabs/repos","events_url":"https://api.github.com/users/sunlightlabs/events{/privacy}","received_events_url":"https://api.github.com/users/sunlightlabs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/sunlightlabs/openstates","description":"source for Open States' scrapers","fork":false,"url":"https://api.github.com/repos/sunlightlabs/openstates","forks_url":"https://api.github.com/repos/sunlightlabs/openstates/forks","keys_url":"https://api.github.com/repos/sunlightlabs/openstates/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sunlightlabs/openstates/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sunlightlabs/openstates/teams","hooks_url":"https://api.github.com/repos/sunlightlabs/openstates/hooks","issue_events_url":"https://api.github.com/repos/sunlightlabs/openstates/issues/events{/number}","events_url":"https://api.github.com/repos/sunlightlabs/openstates/events","assignees_url":"https://api.github.com/repos/sunlightlabs/openstates/assignees{/user}","branches_url":"https://api.github.com/repos/sunlightlabs/openstates/branches{/branch}","tags_url":"https://api.github.com/repos/sunlightlabs/openstates/tags","blobs_url":"https://api.github.com/repos/sunlightlabs/openstates/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sunlightlabs/openstates/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sunlightlabs/openstates/git/refs{/sha}","trees_url":"https://api.github.com/repos/sunlightlabs/openstates/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sunlightlabs/openstates/statuses/{sha}","languages_url":"https://api.github.com/repos/sunlightlabs/openstates/languages","stargazers_url":"https://api.github.com/repos/sunlightlabs/openstates/stargazers","contributors_url":"https://api.github.com/repos/sunlightlabs/openstates/contributors","subscribers_url":"https://api.github.com/repos/sunlightlabs/openstates/subscribers","subscription_url":"https://api.github.com/repos/sunlightlabs/openstates/subscription","commits_url":"https://api.github.com/repos/sunlightlabs/openstates/commits{/sha}","git_commits_url":"https://api.github.com/repos/sunlightlabs/openstates/git/commits{/sha}","comments_url":"https://api.github.com/repos/sunlightlabs/openstates/comments{/number}","issue_comment_url":"https://api.github.com/repos/sunlightlabs/openstates/issues/comments{/number}","contents_url":"https://api.github.com/repos/sunlightlabs/openstates/contents/{+path}","compare_url":"https://api.github.com/repos/sunlightlabs/openstates/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sunlightlabs/openstates/merges","archive_url":"https://api.github.com/repos/sunlightlabs/openstates/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sunlightlabs/openstates/downloads","issues_url":"https://api.github.com/repos/sunlightlabs/openstates/issues{/number}","pulls_url":"https://api.github.com/repos/sunlightlabs/openstates/pulls{/number}","milestones_url":"https://api.github.com/repos/sunlightlabs/openstates/milestones{/number}","notifications_url":"https://api.github.com/repos/sunlightlabs/openstates/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sunlightlabs/openstates/labels{/name}","releases_url":"https://api.github.com/repos/sunlightlabs/openstates/releases{/id}","created_at":"2009-02-26T22:49:19Z","updated_at":"2015-03-04T22:55:14Z","pushed_at":"2015-03-04T22:55:14Z","git_url":"git://github.com/sunlightlabs/openstates.git","ssh_url":"git@github.com:sunlightlabs/openstates.git","clone_url":"https://github.com/sunlightlabs/openstates.git","svn_url":"https://github.com/sunlightlabs/openstates","homepage":"http://openstates.org","size":26631,"stargazers_count":339,"watchers_count":339,"language":"Python","has_issues":false,"has_downloads":false,"has_wiki":true,"has_pages":false,"forks_count":198,"mirror_url":null,"open_issues_count":44,"forks":198,"open_issues":44,"watchers":339,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/sunlightlabs/openstates/pulls/602"},"html":{"href":"https://github.com/sunlightlabs/openstates/pull/602"},"issue":{"href":"https://api.github.com/repos/sunlightlabs/openstates/issues/602"},"comments":{"href":"https://api.github.com/repos/sunlightlabs/openstates/issues/602/comments"},"review_comments":{"href":"https://api.github.com/repos/sunlightlabs/openstates/pulls/602/comments"},"review_comment":{"href":"https://api.github.com/repos/sunlightlabs/openstates/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/sunlightlabs/openstates/pulls/602/commits"},"statuses":{"href":"https://api.github.com/repos/sunlightlabs/openstates/statuses/5de446e32b21a9bf99fb1d4dbddf8a6e85d2f42f"}}}}