{"action":"created","comment":{"url":"https://api.github.com/repos/Recidiviz/recidiviz-data/pulls/comments/181199577","pull_request_review_id":111764874,"id":181199577,"diff_hunk":"@@ -38,39 +67,325 @@ Development\n The platform supports development of scrapers specific to a particular prison system. Currently the only scraper built\n is one for the New York Department of Corrections and Community Supervision (DOCCS) system.\n \n-Scraping is started centrally (this may change), and each scraper initialized and kicked off in sequence from the main\n-module. The main module generates scraping tasks based on a list of names, since all of these prison systems are search\n-engines for particular inmates. Our goal is to have broad enough name coverage to retrieve a representative sample of\n-inmates based on our shot-in-the-dark queries.\n+The general progression of a scraper looks like this:\n+- Scraper actions are prompted by HTTP requests to the service with specific URL paths and parameters.\n+- The common Recidiviz system handles general commands such as Start, Stop, and Resume for all regions.\n+- A cron job for a region's scraper will call the `start` command for that region at a scheduled frequency.\n+- On receiving a `start` command, the Recidiviz system generates a list of targets for the scraper - whether \n+specific names to search for new inmates with, or known inmates to check back in on. These are placed in a docket \n+for the scraper to process as part of the overall scrape job.\n+- The region-specific scraper will take an item from the queue, scrape the page for that query, then extract any \n+relevant data and store it. It will them remove the item from the docket, and process the next item.\n+- Some regions will have long-lived scrape jobs - e.g., if the inmate search system returns fuzzy matches, a background\n+scrape will continue to scrape as many inmate records are returned before progressing to the next docket item.\n+- If the scrape job takes multiple days, cron jobs will often pause it early in the day (local time, for the given\n+corrections system) and resume it later in the evening. Each individual run of the scraper (start or resume to stop) \n+is considered a 'scrape session'.\n+- When the docket is empty, the scrape job is complete.\n+\n+More details are provided below for components of this system.\n+\n+#### Regional variation\n+Every corrections system provides a different inmate search system, and so requires a custom scraper to collect and\n+consolidate its data. There is one scraper per region. *(Note: For the purpose of discussing scrapers, we use 'region'\n+and 'corrections system' interchangeably.)*\n+\n+Scrapers are expected to implement a small set of common methods to allow central management of scraping behavior, and to\n+organize relevant scraped data within a common schema shared across the system, but otherwise are self-contained and \n+focused on the scraping requirements unique to their own corrections systems (e.g., the site structure to traverse, page\n+parsing, scrape rate, etc.)\n+\n+These common methods are:\n+- **`setup(scrape_type)`** Handle any pre-scraping work (get session variables from the inmate system, clean up old \n+session information, create a new scraping session to hold scrape job state information, etc.)\n+- **`start_query(scrape_type)`** Kicks off a new scrape job. \n+- **`resume_scrape(scrape_type)`** Resumes an in-progress scrape job where it left off.\n+- **`stop_scrape()`** Stops the scraper, ending any current scraping session (but only effectively *pausing* the ","path":"scraper/README.md","position":null,"original_position":83,"commit_id":"05fad1aa8c50421baff6915b60c0895dd653cb0a","original_commit_id":"f803c6d18e7e03dff7a1021b16b862f8537ebd1c","user":{"login":"cawarren","id":59526,"avatar_url":"https://avatars2.githubusercontent.com/u/59526?v=4","gravatar_id":"","url":"https://api.github.com/users/cawarren","html_url":"https://github.com/cawarren","followers_url":"https://api.github.com/users/cawarren/followers","following_url":"https://api.github.com/users/cawarren/following{/other_user}","gists_url":"https://api.github.com/users/cawarren/gists{/gist_id}","starred_url":"https://api.github.com/users/cawarren/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cawarren/subscriptions","organizations_url":"https://api.github.com/users/cawarren/orgs","repos_url":"https://api.github.com/users/cawarren/repos","events_url":"https://api.github.com/users/cawarren/events{/privacy}","received_events_url":"https://api.github.com/users/cawarren/received_events","type":"User","site_admin":false},"body":"You're right about this. Not yet fixed, but will be tomorrow before I test and file a bunch of bugfixes.","created_at":"2018-04-12T19:42:34Z","updated_at":"2018-04-12T19:42:34Z","html_url":"https://github.com/Recidiviz/recidiviz-data/pull/46#discussion_r181199577","pull_request_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/pulls/46","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/Recidiviz/recidiviz-data/pulls/comments/181199577"},"html":{"href":"https://github.com/Recidiviz/recidiviz-data/pull/46#discussion_r181199577"},"pull_request":{"href":"https://api.github.com/repos/Recidiviz/recidiviz-data/pulls/46"}},"in_reply_to_id":167397856},"pull_request":{"url":"https://api.github.com/repos/Recidiviz/recidiviz-data/pulls/46","id":167521738,"html_url":"https://github.com/Recidiviz/recidiviz-data/pull/46","diff_url":"https://github.com/Recidiviz/recidiviz-data/pull/46.diff","patch_url":"https://github.com/Recidiviz/recidiviz-data/pull/46.patch","issue_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/issues/46","number":46,"state":"open","locked":false,"title":"Merge ny-rescrape back to Master","user":{"login":"cawarren","id":59526,"avatar_url":"https://avatars2.githubusercontent.com/u/59526?v=4","gravatar_id":"","url":"https://api.github.com/users/cawarren","html_url":"https://github.com/cawarren","followers_url":"https://api.github.com/users/cawarren/followers","following_url":"https://api.github.com/users/cawarren/following{/other_user}","gists_url":"https://api.github.com/users/cawarren/gists{/gist_id}","starred_url":"https://api.github.com/users/cawarren/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cawarren/subscriptions","organizations_url":"https://api.github.com/users/cawarren/orgs","repos_url":"https://api.github.com/users/cawarren/repos","events_url":"https://api.github.com/users/cawarren/events{/privacy}","received_events_url":"https://api.github.com/users/cawarren/received_events","type":"User","site_admin":false},"body":"This PR:\r\n- Adds a second type of scraping activity, *snapshot scraping.* Snapshot scraping targets only those records relevant to the timeframe we look at for recidivism calculations, and creates snapshots if there are any new changes to these records.\r\n- Adds all mutable `Record` and `UsNyRecord` fields to the `InmateSnapshot` and `UsNyInmateSnapshot` models for more detailed tracking of changes to inmate records\r\n- Migrates current `InmateFacilitySnapshot` entities into `UsNyInmateSnapshot` entities\r\n- Migrates the `last_release_date` and `last_release_type` fields from `UsNyRecord` to `latest_release_date` and `latest_release_type` fields in the superclass `Record`, as these are needed more generally for snapshot scrapes\r\n- Fixes issue 28\r\n\r\nChanges to this PR, prior to merge:\r\n- Remove test database request handler (provided as aid to testing changes)\r\n\r\nFollow-ups to this PR:\r\n- Remove data migration request handler and `deferred` builtin support\r\n- Remove `InmateFacilitySnapshot` model \r\n- Add snapshot scraping cron jobs at a reasonable frequency, and a time of day that won't conflict with background scraping.\r\n\r\n**Overview of changes**\r\n\r\n**Scraper control** has been consolidated into `queue_control.py`, centralizing the start/stop/resumption of scrapers. The `recidiviz.py` file that used to contain start logic for scrapers no longer exists.\r\n\r\n**Snapshot Scraping** For newly started scrapes, the `queue_control` module generates a list of targets - names for background scrapes, and inmates for the snapshot scrapes (we focus on inmates instead of records, because we want to find any new records we don't yet know about for the inmates who have records relevant to calculator). For snapshot scrapes, we also generate an 'ignore list' - a set of records that the scraper shouldn't bother scraping, because they're known and too old to be relevant to our metrics.\r\n\r\nFor either scrape type, the resulting target lists are dumped into the datastore as `DocketItem`s for that particular scrape type. The scraper logic now picks up an arbitrary `DocketItem` for its scrape_type, scrapes that item, then deletes the processed `DocketItem` and selects a new item from the docket. The scrape is complete when no `DocketItems` for the selected scrape type remain.\r\n\r\n**Migration** The `data_migration` module supports two migration types: `record` and `snapshot`. See the *This PR* section above for the specific changes each migration type makes. \r\n\r\nThe migration tool is destructive - it handles both migration and deletion of the data that's been migrated. It supports a `test_only` URL flag, which will limit the number of entities migrated to 5 and migrate non-destructively.\r\n\r\nExample queries are included in comments at the top of the `data_migration` module.\r\n\r\n**Fake data population** The `populate_test_db` module is provided for simpler population of environment variables and fake data, for testing both the data migration and the updated snapshot and background scrape behavior.\r\n\r\nExample queries for different combinations of fake data population are provided in comments at the top of the module.","created_at":"2018-02-06T20:29:47Z","updated_at":"2018-04-12T19:42:34Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4fdb872488fda5b06025c807fa4d27d455414038","assignee":{"login":"cawarren","id":59526,"avatar_url":"https://avatars2.githubusercontent.com/u/59526?v=4","gravatar_id":"","url":"https://api.github.com/users/cawarren","html_url":"https://github.com/cawarren","followers_url":"https://api.github.com/users/cawarren/followers","following_url":"https://api.github.com/users/cawarren/following{/other_user}","gists_url":"https://api.github.com/users/cawarren/gists{/gist_id}","starred_url":"https://api.github.com/users/cawarren/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cawarren/subscriptions","organizations_url":"https://api.github.com/users/cawarren/orgs","repos_url":"https://api.github.com/users/cawarren/repos","events_url":"https://api.github.com/users/cawarren/events{/privacy}","received_events_url":"https://api.github.com/users/cawarren/received_events","type":"User","site_admin":false},"assignees":[{"login":"cawarren","id":59526,"avatar_url":"https://avatars2.githubusercontent.com/u/59526?v=4","gravatar_id":"","url":"https://api.github.com/users/cawarren","html_url":"https://github.com/cawarren","followers_url":"https://api.github.com/users/cawarren/followers","following_url":"https://api.github.com/users/cawarren/following{/other_user}","gists_url":"https://api.github.com/users/cawarren/gists{/gist_id}","starred_url":"https://api.github.com/users/cawarren/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cawarren/subscriptions","organizations_url":"https://api.github.com/users/cawarren/orgs","repos_url":"https://api.github.com/users/cawarren/repos","events_url":"https://api.github.com/users/cawarren/events{/privacy}","received_events_url":"https://api.github.com/users/cawarren/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/pulls/46/commits","review_comments_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/pulls/46/comments","review_comment_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/issues/46/comments","statuses_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/statuses/05fad1aa8c50421baff6915b60c0895dd653cb0a","head":{"label":"Recidiviz:ny-rescrape","ref":"ny-rescrape","sha":"05fad1aa8c50421baff6915b60c0895dd653cb0a","user":{"login":"Recidiviz","id":35868122,"avatar_url":"https://avatars2.githubusercontent.com/u/35868122?v=4","gravatar_id":"","url":"https://api.github.com/users/Recidiviz","html_url":"https://github.com/Recidiviz","followers_url":"https://api.github.com/users/Recidiviz/followers","following_url":"https://api.github.com/users/Recidiviz/following{/other_user}","gists_url":"https://api.github.com/users/Recidiviz/gists{/gist_id}","starred_url":"https://api.github.com/users/Recidiviz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Recidiviz/subscriptions","organizations_url":"https://api.github.com/users/Recidiviz/orgs","repos_url":"https://api.github.com/users/Recidiviz/repos","events_url":"https://api.github.com/users/Recidiviz/events{/privacy}","received_events_url":"https://api.github.com/users/Recidiviz/received_events","type":"Organization","site_admin":false},"repo":{"id":108306686,"name":"recidiviz-data","full_name":"Recidiviz/recidiviz-data","owner":{"login":"Recidiviz","id":35868122,"avatar_url":"https://avatars2.githubusercontent.com/u/35868122?v=4","gravatar_id":"","url":"https://api.github.com/users/Recidiviz","html_url":"https://github.com/Recidiviz","followers_url":"https://api.github.com/users/Recidiviz/followers","following_url":"https://api.github.com/users/Recidiviz/following{/other_user}","gists_url":"https://api.github.com/users/Recidiviz/gists{/gist_id}","starred_url":"https://api.github.com/users/Recidiviz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Recidiviz/subscriptions","organizations_url":"https://api.github.com/users/Recidiviz/orgs","repos_url":"https://api.github.com/users/Recidiviz/repos","events_url":"https://api.github.com/users/Recidiviz/events{/privacy}","received_events_url":"https://api.github.com/users/Recidiviz/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Recidiviz/recidiviz-data","description":"Ingesting prison data from inmate locator systems and calculating recidivism","fork":false,"url":"https://api.github.com/repos/Recidiviz/recidiviz-data","forks_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/forks","keys_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/teams","hooks_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/hooks","issue_events_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/issues/events{/number}","events_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/events","assignees_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/assignees{/user}","branches_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/branches{/branch}","tags_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/tags","blobs_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/git/refs{/sha}","trees_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/statuses/{sha}","languages_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/languages","stargazers_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/stargazers","contributors_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/contributors","subscribers_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/subscribers","subscription_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/subscription","commits_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/commits{/sha}","git_commits_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/git/commits{/sha}","comments_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/comments{/number}","issue_comment_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/issues/comments{/number}","contents_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/contents/{+path}","compare_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/merges","archive_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/downloads","issues_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/issues{/number}","pulls_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/pulls{/number}","milestones_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/milestones{/number}","notifications_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/labels{/name}","releases_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/releases{/id}","deployments_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/deployments","created_at":"2017-10-25T18:04:59Z","updated_at":"2018-04-01T22:25:13Z","pushed_at":"2018-04-12T19:20:06Z","git_url":"git://github.com/Recidiviz/recidiviz-data.git","ssh_url":"git@github.com:Recidiviz/recidiviz-data.git","clone_url":"https://github.com/Recidiviz/recidiviz-data.git","svn_url":"https://github.com/Recidiviz/recidiviz-data","homepage":"","size":2168,"stargazers_count":2,"watchers_count":2,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":23,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0"},"forks":1,"open_issues":23,"watchers":2,"default_branch":"master"}},"base":{"label":"Recidiviz:master","ref":"master","sha":"641a9e792e69eaaf889e460892e31e2fdfcce734","user":{"login":"Recidiviz","id":35868122,"avatar_url":"https://avatars2.githubusercontent.com/u/35868122?v=4","gravatar_id":"","url":"https://api.github.com/users/Recidiviz","html_url":"https://github.com/Recidiviz","followers_url":"https://api.github.com/users/Recidiviz/followers","following_url":"https://api.github.com/users/Recidiviz/following{/other_user}","gists_url":"https://api.github.com/users/Recidiviz/gists{/gist_id}","starred_url":"https://api.github.com/users/Recidiviz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Recidiviz/subscriptions","organizations_url":"https://api.github.com/users/Recidiviz/orgs","repos_url":"https://api.github.com/users/Recidiviz/repos","events_url":"https://api.github.com/users/Recidiviz/events{/privacy}","received_events_url":"https://api.github.com/users/Recidiviz/received_events","type":"Organization","site_admin":false},"repo":{"id":108306686,"name":"recidiviz-data","full_name":"Recidiviz/recidiviz-data","owner":{"login":"Recidiviz","id":35868122,"avatar_url":"https://avatars2.githubusercontent.com/u/35868122?v=4","gravatar_id":"","url":"https://api.github.com/users/Recidiviz","html_url":"https://github.com/Recidiviz","followers_url":"https://api.github.com/users/Recidiviz/followers","following_url":"https://api.github.com/users/Recidiviz/following{/other_user}","gists_url":"https://api.github.com/users/Recidiviz/gists{/gist_id}","starred_url":"https://api.github.com/users/Recidiviz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Recidiviz/subscriptions","organizations_url":"https://api.github.com/users/Recidiviz/orgs","repos_url":"https://api.github.com/users/Recidiviz/repos","events_url":"https://api.github.com/users/Recidiviz/events{/privacy}","received_events_url":"https://api.github.com/users/Recidiviz/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Recidiviz/recidiviz-data","description":"Ingesting prison data from inmate locator systems and calculating recidivism","fork":false,"url":"https://api.github.com/repos/Recidiviz/recidiviz-data","forks_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/forks","keys_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/teams","hooks_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/hooks","issue_events_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/issues/events{/number}","events_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/events","assignees_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/assignees{/user}","branches_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/branches{/branch}","tags_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/tags","blobs_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/git/refs{/sha}","trees_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/statuses/{sha}","languages_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/languages","stargazers_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/stargazers","contributors_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/contributors","subscribers_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/subscribers","subscription_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/subscription","commits_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/commits{/sha}","git_commits_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/git/commits{/sha}","comments_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/comments{/number}","issue_comment_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/issues/comments{/number}","contents_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/contents/{+path}","compare_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/merges","archive_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/downloads","issues_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/issues{/number}","pulls_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/pulls{/number}","milestones_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/milestones{/number}","notifications_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/labels{/name}","releases_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/releases{/id}","deployments_url":"https://api.github.com/repos/Recidiviz/recidiviz-data/deployments","created_at":"2017-10-25T18:04:59Z","updated_at":"2018-04-01T22:25:13Z","pushed_at":"2018-04-12T19:20:06Z","git_url":"git://github.com/Recidiviz/recidiviz-data.git","ssh_url":"git@github.com:Recidiviz/recidiviz-data.git","clone_url":"https://github.com/Recidiviz/recidiviz-data.git","svn_url":"https://github.com/Recidiviz/recidiviz-data","homepage":"","size":2168,"stargazers_count":2,"watchers_count":2,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"archived":false,"open_issues_count":23,"license":{"key":"gpl-3.0","name":"GNU General Public License v3.0","spdx_id":"GPL-3.0","url":"https://api.github.com/licenses/gpl-3.0"},"forks":1,"open_issues":23,"watchers":2,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Recidiviz/recidiviz-data/pulls/46"},"html":{"href":"https://github.com/Recidiviz/recidiviz-data/pull/46"},"issue":{"href":"https://api.github.com/repos/Recidiviz/recidiviz-data/issues/46"},"comments":{"href":"https://api.github.com/repos/Recidiviz/recidiviz-data/issues/46/comments"},"review_comments":{"href":"https://api.github.com/repos/Recidiviz/recidiviz-data/pulls/46/comments"},"review_comment":{"href":"https://api.github.com/repos/Recidiviz/recidiviz-data/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Recidiviz/recidiviz-data/pulls/46/commits"},"statuses":{"href":"https://api.github.com/repos/Recidiviz/recidiviz-data/statuses/05fad1aa8c50421baff6915b60c0895dd653cb0a"}},"author_association":"OWNER"}}
{"actor":{"display_login":"cawarren"}}