{"id": 335980246, "node_id": "MDExOlB1bGxSZXF1ZXN0MzM1OTgwMjQ2", "number": 8, "state": "closed", "locked": 0, "title": "stargazers command, refs #4", "user": {"value": 9599, "label": "simonw"}, "body": "Needs tests. Refs #4.", "created_at": "2019-11-03T00:37:36Z", "updated_at": "2020-05-02T20:00:27Z", "closed_at": "2020-05-02T20:00:26Z", "merged_at": null, "merge_commit_sha": "db25bdf8cee4c3e2d730cf269eb9a903b51cdb41", "assignee": null, "milestone": null, "draft": 0, "head": "ea07274667a08c67907e8bfbbccb6f0fb95ce817", "base": "ae9035f8fe5aff1c54bff4c6b4c2e808a44f0f2a", "author_association": "MEMBER", "repo": {"value": 207052882, "label": "github-to-sqlite"}, "url": "https://github.com/dogsheep/github-to-sqlite/pull/8", "merged_by": null, "auto_merge": null} {"id": 300580221, "node_id": "MDExOlB1bGxSZXF1ZXN0MzAwNTgwMjIx", "number": 8, "state": "closed", "locked": 0, "title": "Use less RAM", "user": {"value": 9599, "label": "simonw"}, "body": "Closes #7", "created_at": "2019-07-24T06:35:01Z", "updated_at": "2019-07-24T06:35:52Z", "closed_at": "2019-07-24T06:35:52Z", "merged_at": "2019-07-24T06:35:52Z", "merge_commit_sha": "c8392df78ee3e1643d18b747a4abf585d84d5d88", "assignee": null, "milestone": null, "draft": 0, "head": "6261500b01274a739176480774e82b31f2926e7f", "base": "5d7e14d40d5a4cfd133ca5faa442312f607784c5", "author_association": "MEMBER", "repo": {"value": 197882382, "label": "healthkit-to-sqlite"}, "url": "https://github.com/dogsheep/healthkit-to-sqlite/pull/8", "merged_by": null, "auto_merge": null} {"id": 327051673, "node_id": "MDExOlB1bGxSZXF1ZXN0MzI3MDUxNjcz", "number": 15, "state": "closed", "locked": 0, "title": "twitter-to-sqlite import command, refs #4", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-10-11T06:37:14Z", "updated_at": "2019-10-11T06:45:01Z", "closed_at": "2019-10-11T06:45:01Z", "merged_at": "2019-10-11T06:45:01Z", "merge_commit_sha": "2019ee908731054c6eaa3d5123dfbdf7d2d70fc4", "assignee": null, "milestone": null, "draft": 0, "head": "df1d85897118310a2d3c1b9e5aad108165302cf2", "base": "436a170d74ec70903d1b4ca430c2c6b6435cdfcc", "author_association": "MEMBER", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "url": "https://github.com/dogsheep/twitter-to-sqlite/pull/15", "merged_by": null, "auto_merge": null} {"id": 329324368, "node_id": "MDExOlB1bGxSZXF1ZXN0MzI5MzI0MzY4", "number": 24, "state": "closed", "locked": 0, "title": "Tweet source extraction and new migration system", "user": {"value": 9599, "label": "simonw"}, "body": "Closes #12 and #23", "created_at": "2019-10-17T15:24:56Z", "updated_at": "2019-10-17T15:49:29Z", "closed_at": "2019-10-17T15:49:24Z", "merged_at": "2019-10-17T15:49:24Z", "merge_commit_sha": "c9295233f219c446fa2085cace987067488a31b9", "assignee": null, "milestone": null, "draft": 0, "head": "39f822a624685e321dbca8a4318741dd1e42548b", "base": "619f724a722b3f23f4364f67d3164b93e8ba2a70", "author_association": "MEMBER", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "url": "https://github.com/dogsheep/twitter-to-sqlite/pull/24", "merged_by": null, "auto_merge": null} {"id": 372273608, "node_id": "MDExOlB1bGxSZXF1ZXN0MzcyMjczNjA4", "number": 33, "state": "closed", "locked": 0, "title": "Upgrade to sqlite-utils 2.2.1", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2020-02-07T07:32:12Z", "updated_at": "2020-03-20T19:21:42Z", "closed_at": "2020-03-20T19:21:41Z", "merged_at": null, "merge_commit_sha": "5338f6baab3ec1424431133968d8b64a656ce4c4", "assignee": null, "milestone": null, "draft": 0, "head": "08f51271d6309aad698b9e8a7587fcebbbd67781", "base": "35c18a09fa664324dcb75e5e58ccb90644456d02", "author_association": "MEMBER", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "url": "https://github.com/dogsheep/twitter-to-sqlite/pull/33", "merged_by": null, "auto_merge": null} {"id": 500256485, "node_id": "MDExOlB1bGxSZXF1ZXN0NTAwMjU2NDg1", "number": 1000, "state": "closed", "locked": 0, "title": "datasette.client internal requests mechanism", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #943", "created_at": "2020-10-08T23:58:25Z", "updated_at": "2020-10-09T16:11:26Z", "closed_at": "2020-10-09T16:11:25Z", "merged_at": "2020-10-09T16:11:25Z", "merge_commit_sha": "8f97b9b58e77f82fef1f10e9c9f6754b993544b6", "assignee": {"value": 9599, "label": "simonw"}, "milestone": {"value": 5971510, "label": "Datasette 0.50"}, "draft": 0, "head": "8a80c79deb640bc1a1864132a3564ccca59e8858", "base": "7249ac5ca04b5ddc6517750326ee7e522cc49145", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1000", "merged_by": null, "auto_merge": null} {"id": 507903392, "node_id": "MDExOlB1bGxSZXF1ZXN0NTA3OTAzMzky", "number": 1040, "state": "closed", "locked": 0, "title": "/db/table/-/blob/pk/column.blob download URL", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1036. Still needs:\r\n\r\n- [x] Comprehensive tests across all of the code branches, plus permissions\r\n- [x] A bit more refactoring to share logic cleanly with `RowView`\r\n- ~~A configuration option to disable this feature (probably)~~", "created_at": "2020-10-21T22:39:15Z", "updated_at": "2020-10-24T23:09:20Z", "closed_at": "2020-10-24T23:09:19Z", "merged_at": "2020-10-24T23:09:19Z", "merge_commit_sha": "5a1519796037105bc20bcf2f91a76e022926c204", "assignee": null, "milestone": {"value": 6026070, "label": "0.51"}, "draft": 0, "head": "4f3165f25fd9241fcf1291c797f4c77766b954dc", "base": "bf82b3d6a605c9ddadd5fb739249dfe6defaf635", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1040", "merged_by": null, "auto_merge": null} {"id": 511005542, "node_id": "MDExOlB1bGxSZXF1ZXN0NTExMDA1NTQy", "number": 1056, "state": "closed", "locked": 0, "title": "Radical new colour scheme and base styles, courtesy of @natbat", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2020-10-27T19:31:48Z", "updated_at": "2020-10-27T19:39:57Z", "closed_at": "2020-10-27T19:39:56Z", "merged_at": "2020-10-27T19:39:56Z", "merge_commit_sha": "e5f5034bcdc71e4bc62a6a155ca60eb41910c335", "assignee": null, "milestone": {"value": 6026070, "label": "0.51"}, "draft": 0, "head": "a7b2aabd5148c0ee382b583de68a4f0538f7dfb1", "base": "26bb4a268127da2c38f4241abe45444b2a6f7874", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1056", "merged_by": null, "auto_merge": null} {"id": 511868153, "node_id": "MDExOlB1bGxSZXF1ZXN0NTExODY4MTUz", "number": 1060, "state": "closed", "locked": 0, "title": "New explicit versioning mechanism", "user": {"value": 9599, "label": "simonw"}, "body": "- Remove all references to versioneer\r\n- Re-implement versioning to use a static string baked into the repo\r\n- Ensure that string is output by `datasette --version` and `/-/versions`\r\n\r\nRefs #1054", "created_at": "2020-10-28T22:14:55Z", "updated_at": "2020-10-29T03:38:17Z", "closed_at": "2020-10-29T03:38:16Z", "merged_at": "2020-10-29T03:38:16Z", "merge_commit_sha": "cefd058c1c216a184bb63c79abba66893977c18e", "assignee": null, "milestone": {"value": 6026070, "label": "0.51"}, "draft": 0, "head": "4725d46780783e9875bde5957f053ba19cf92ff0", "base": "abcf0222496d8148b2e585ffa0ff192270a04b06", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1060", "merged_by": null, "auto_merge": null} {"id": 512545364, "node_id": "MDExOlB1bGxSZXF1ZXN0NTEyNTQ1MzY0", "number": 1061, "state": "closed", "locked": 0, "title": ".blob output renderer", "user": {"value": 9599, "label": "simonw"}, "body": "- [x] Remove the `/-/...blob/...` route I added in #1040 in place of the new `.blob` renderer URLs\r\n- [x] Link to new `.blob` download links on the arbitrary query page (using `_blob_hash=...`) - plus tests for this\r\n\r\nCloses #1050, Closes #1051", "created_at": "2020-10-29T20:25:08Z", "updated_at": "2020-10-29T22:01:40Z", "closed_at": "2020-10-29T22:01:39Z", "merged_at": "2020-10-29T22:01:39Z", "merge_commit_sha": "78b3eeaad9189eb737014f53212082684f4bb0d4", "assignee": null, "milestone": {"value": 6026070, "label": "0.51"}, "draft": 0, "head": "1196d084de6a7a6f68c7705a6cc096bb8df132e3", "base": "d6f9ff71378c4eab34dad181c23cfc143a4aef2d", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1061", "merged_by": null, "auto_merge": null} {"id": 512736705, "node_id": "MDExOlB1bGxSZXF1ZXN0NTEyNzM2NzA1", "number": 1065, "state": "closed", "locked": 0, "title": "Nav menu plus menu_links() hook", "user": {"value": 9599, "label": "simonw"}, "body": "Closes #1064, refs #690.", "created_at": "2020-10-30T03:40:18Z", "updated_at": "2020-10-30T03:45:17Z", "closed_at": "2020-10-30T03:45:16Z", "merged_at": "2020-10-30T03:45:16Z", "merge_commit_sha": "18a64fbb29271ce607937110bbdb55488c43f4e0", "assignee": null, "milestone": {"value": 6026070, "label": "0.51"}, "draft": 0, "head": "5f118b56afbeff5348acd50a8b87537210e731ee", "base": "1a861be19e326e0c88230a711a1b6536366697d7", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1065", "merged_by": null, "auto_merge": null} {"id": 513106026, "node_id": "MDExOlB1bGxSZXF1ZXN0NTEzMTA2MDI2", "number": 1069, "state": "closed", "locked": 0, "title": "load_template() plugin hook", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1042", "created_at": "2020-10-30T15:59:45Z", "updated_at": "2020-10-30T17:47:20Z", "closed_at": "2020-10-30T17:47:19Z", "merged_at": "2020-10-30T17:47:19Z", "merge_commit_sha": "81dea4b07ab2b6f4eaaf248307d2b588472054a1", "assignee": null, "milestone": {"value": 6026070, "label": "0.51"}, "draft": 0, "head": "92f3840882a24da29d0d4073e5ed9d77fce438fc", "base": "fcf43589eb6a1f1d0432772a639fd35711c48e0c", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1069", "merged_by": null, "auto_merge": null} {"id": 518988879, "node_id": "MDExOlB1bGxSZXF1ZXN0NTE4OTg4ODc5", "number": 1085, "state": "closed", "locked": 0, "title": "Use FTS4 in fixtures", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1081", "created_at": "2020-11-11T06:44:30Z", "updated_at": "2020-11-12T00:02:59Z", "closed_at": "2020-11-12T00:02:58Z", "merged_at": "2020-11-12T00:02:58Z", "merge_commit_sha": "e8e0a6f284ca953b2980186c4356594c07bd1929", "assignee": null, "milestone": null, "draft": 0, "head": "51e7651c66aaf1804274ce68a6b5218bbba76338", "base": "2a981e2ac1d13125973904b777d00ea75e8df4e6", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1085", "merged_by": null, "auto_merge": null} {"id": 521276296, "node_id": "MDExOlB1bGxSZXF1ZXN0NTIxMjc2Mjk2", "number": 1097, "state": "closed", "locked": 0, "title": "Use f-strings", "user": {"value": 9599, "label": "simonw"}, "body": "Since Datasette now requires Python 3.6, how about some f-strings?\r\n\r\nI ran this in the `datasette` root checkout:\r\n```\r\npip install flynt\r\nflynt .\r\nblack .\r\n```", "created_at": "2020-11-15T23:12:36Z", "updated_at": "2020-11-15T23:24:24Z", "closed_at": "2020-11-15T23:24:23Z", "merged_at": "2020-11-15T23:24:23Z", "merge_commit_sha": "30e64c8d3b3728a86c3ca42a75322cc3feb5b0c8", "assignee": null, "milestone": null, "draft": 0, "head": "e89211d21eebb7a2e4588b06927da84416e3a555", "base": "6fd35be64de221eba4945ca24e8e1678f6142a73", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1097", "merged_by": null, "auto_merge": null} {"id": 529783275, "node_id": "MDExOlB1bGxSZXF1ZXN0NTI5NzgzMjc1", "number": 1117, "state": "closed", "locked": 0, "title": "Support for generated columns", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1116. My first attempt at this worked on my laptop but broke in CI, so I'm going to iterate on it in a pull request instead.", "created_at": "2020-11-30T20:10:46Z", "updated_at": "2020-11-30T22:23:19Z", "closed_at": "2020-11-30T21:29:58Z", "merged_at": "2020-11-30T21:29:58Z", "merge_commit_sha": "461670a0b87efa953141b449a9a261919864ceb3", "assignee": null, "milestone": null, "draft": 0, "head": "ccdf2c650278b8b9465d3a2d7c916f3bb06c4f01", "base": "dea3c508b39528e566d711c38a467b3d372d220b", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1117", "merged_by": null, "auto_merge": null} {"id": 529887861, "node_id": "MDExOlB1bGxSZXF1ZXN0NTI5ODg3ODYx", "number": 1120, "state": "closed", "locked": 0, "title": "generated_columns table in fixtures.py", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1119", "created_at": "2020-12-01T00:17:19Z", "updated_at": "2020-12-01T00:28:03Z", "closed_at": "2020-12-01T00:28:02Z", "merged_at": "2020-12-01T00:28:02Z", "merge_commit_sha": "17cbbb1f7f230b39650afac62dd16476626001b5", "assignee": null, "milestone": null, "draft": 0, "head": "ddad8db2cc952eaf4f66f42324ccece115627b02", "base": "461670a0b87efa953141b449a9a261919864ceb3", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1120", "merged_by": null, "auto_merge": null} {"id": 153432045, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUzNDMyMDQ1", "number": 118, "state": "closed", "locked": 0, "title": "Foreign key information on row and table pages", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2017-11-18T03:13:27Z", "updated_at": "2017-11-18T03:15:57Z", "closed_at": "2017-11-18T03:15:50Z", "merged_at": "2017-11-18T03:15:50Z", "merge_commit_sha": "1b04662585ea1539014bfbd616a8112b650d5699", "assignee": null, "milestone": null, "draft": 0, "head": "2fa60bc5e3c9d75c19e21a2384f52b58e1872fa8", "base": "6d39429daa4655e3cf7a6a7671493292a20a30a1", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/118", "merged_by": null, "auto_merge": null} {"id": 560725714, "node_id": "MDExOlB1bGxSZXF1ZXN0NTYwNzI1NzE0", "number": 1203, "state": "closed", "locked": 0, "title": "Easier way to run Prettier locally", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1167", "created_at": "2021-01-25T01:39:06Z", "updated_at": "2021-01-25T01:41:46Z", "closed_at": "2021-01-25T01:41:46Z", "merged_at": "2021-01-25T01:41:46Z", "merge_commit_sha": "ffff3a4c5398a9f40b61d59736f386444da19289", "assignee": null, "milestone": null, "draft": 0, "head": "98acc8865aa7826a40a7a076ab548ba8597af734", "base": "b6a7b58fa01af0cd5a5e94bd17d686d283a46819", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1203", "merged_by": null, "auto_merge": null} {"id": 560760145, "node_id": "MDExOlB1bGxSZXF1ZXN0NTYwNzYwMTQ1", "number": 1204, "state": "open", "locked": 0, "title": "WIP: Plugin includes", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1191\r\n\r\nNext steps:\r\n\r\n- [ ] Get comfortable that this pattern is the right way to go\r\n- [ ] Implement it for all of the other pages, not just the table page\r\n- [ ] Add a new set of plugin tests that exercise ALL of these new hook locations\r\n- [ ] Document, then ship", "created_at": "2021-01-25T03:59:06Z", "updated_at": "2021-12-17T07:10:49Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "98f06a766317a40035962416cf3211d7a374866a", "assignee": null, "milestone": null, "draft": 1, "head": "05258469ae39bcaad17beb57c5b7eeab0d58a589", "base": "07e163561592c743e4117f72102fcd350a600909", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1204", "merged_by": null, "auto_merge": null} {"id": 560831638, "node_id": "MDExOlB1bGxSZXF1ZXN0NTYwODMxNjM4", "number": 1206, "state": "closed", "locked": 0, "title": "Release 0.54", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1201", "created_at": "2021-01-25T06:45:47Z", "updated_at": "2021-01-25T17:33:30Z", "closed_at": "2021-01-25T17:33:29Z", "merged_at": "2021-01-25T17:33:29Z", "merge_commit_sha": "0b9ac1b2e9c855f1b823a06a898891da87c720ef", "assignee": null, "milestone": null, "draft": 0, "head": "571476d2cf8f7d7eac6098de8557264e69cac43f", "base": "a5ede3cdd455e2bb1a1fb2f4e1b5a9855caf5179", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1206", "merged_by": null, "auto_merge": null} {"id": 572209243, "node_id": "MDExOlB1bGxSZXF1ZXN0NTcyMjA5MjQz", "number": 1222, "state": "closed", "locked": 0, "title": "--ssl-keyfile and --ssl-certfile, refs #1221", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2021-02-12T00:45:58Z", "updated_at": "2021-02-12T00:52:18Z", "closed_at": "2021-02-12T00:52:17Z", "merged_at": "2021-02-12T00:52:17Z", "merge_commit_sha": "eda652cf6ee28a0babfb30ce3834512e9e33fb8e", "assignee": null, "milestone": null, "draft": 0, "head": "8ec72ea3e3e0a9876d5e61e4a2260224f16db2e3", "base": "aa1fe0692c2abb901216738bfb35f9fcc5090e7d", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1222", "merged_by": null, "auto_merge": null} {"id": 575940193, "node_id": "MDExOlB1bGxSZXF1ZXN0NTc1OTQwMTkz", "number": 1232, "state": "closed", "locked": 0, "title": "--crossdb option for joining across databases", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #283. Still needs:\r\n\r\n- [x] Unit test for --crossdb queries\r\n- [x] Show warning on console if it truncates at ten databases (or on web interface)\r\n- [x] Show connected databases on the `/_memory` database page\r\n- [x] Documentation\r\n- [x] https://latest.datasette.io/ demo should demonstrate this feature", "created_at": "2021-02-18T19:48:50Z", "updated_at": "2021-02-18T22:09:13Z", "closed_at": "2021-02-18T22:09:12Z", "merged_at": "2021-02-18T22:09:12Z", "merge_commit_sha": "6f41c8a2bef309a66588b2875c3e24d26adb4850", "assignee": null, "milestone": null, "draft": 0, "head": "887649942b02d70a0fe4e205e1e5eff4e745b016", "base": "4df548e7668b5b21d64a267964951e67894f4712", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1232", "merged_by": null, "auto_merge": null} {"id": 598213565, "node_id": "MDExOlB1bGxSZXF1ZXN0NTk4MjEzNTY1", "number": 1271, "state": "open", "locked": 0, "title": "Use SQLite conn.interrupt() instead of sqlite_timelimit()", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1270, #1268, #1249\r\n\r\nBefore merging this I need to do some more testing (to make sure that expensive queries really are properly cancelled). I also need to delete a bunch of code relating to the old mechanism of cancelling queries.\r\n\r\n[See comment below: this doesn't actually cancel the query due to a thread-local confusion]", "created_at": "2021-03-22T17:34:20Z", "updated_at": "2021-03-22T21:49:27Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "a4fd7e5a761523881c031b4fee266a366e1c97bd", "assignee": null, "milestone": null, "draft": 1, "head": "fb2ad7ada0b86a7fe4a576fe23236757c41eb05e", "base": "c4f1ec7f33fd7d5b93f0f895dafb5351cc3bfc5b", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1271", "merged_by": null, "auto_merge": null} {"id": 608323028, "node_id": "MDExOlB1bGxSZXF1ZXN0NjA4MzIzMDI4", "number": 1290, "state": "closed", "locked": 0, "title": "Use pytest-xdist to speed up tests", "user": {"value": 9599, "label": "simonw"}, "body": "Closes #1289, refs #1212.", "created_at": "2021-04-03T03:34:36Z", "updated_at": "2021-04-03T03:42:29Z", "closed_at": "2021-04-03T03:42:28Z", "merged_at": "2021-04-03T03:42:28Z", "merge_commit_sha": "0a7621f96f8ad14da17e7172e8a7bce24ef78966", "assignee": null, "milestone": null, "draft": 0, "head": "2fb1e4284f1f0f6aaba7e889a6713c0f96e802e1", "base": "59ef4a20cba1533bc347378415f4ffcd025f32c8", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1290", "merged_by": null, "auto_merge": null} {"id": 651492888, "node_id": "MDExOlB1bGxSZXF1ZXN0NjUxNDkyODg4", "number": 1339, "state": "closed", "locked": 0, "title": "?_col=/?_nocol= to show/hide columns on the table page", "user": {"value": 9599, "label": "simonw"}, "body": "See #615. Still to do:\r\n\r\n- [x] Allow combination of `?_col=` and `?_nocol=` (`_nocol` wins)\r\n- [x] Deduplicate same column if passed in `?_col=` multiple times\r\n- [x] Validate that user did not try to remove a primary key\r\n- [x] Add tests\r\n- [x] Ensure this works correctly for SQL views\r\n- [x] Add documentation\r\n", "created_at": "2021-05-24T17:15:20Z", "updated_at": "2021-05-27T04:17:44Z", "closed_at": "2021-05-27T04:17:43Z", "merged_at": "2021-05-27T04:17:43Z", "merge_commit_sha": "f1c29fd6a184254aa68efadf096bcf21e848f921", "assignee": null, "milestone": null, "draft": 0, "head": "387c8379b92e559180098f73017a1bf2e6370205", "base": "2bd9d54b2762c991e11950c22c88c0336158d49b", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1339", "merged_by": null, "auto_merge": null} {"id": 655684477, "node_id": "MDExOlB1bGxSZXF1ZXN0NjU1Njg0NDc3", "number": 1346, "state": "closed", "locked": 0, "title": "Re-display user's query with an error message if an error occurs", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #619", "created_at": "2021-05-28T02:04:20Z", "updated_at": "2021-06-02T03:46:21Z", "closed_at": "2021-06-02T03:46:21Z", "merged_at": "2021-06-02T03:46:21Z", "merge_commit_sha": "9552414e1f968c6fc704031cec349c05e6bc2371", "assignee": null, "milestone": null, "draft": 0, "head": "3bffc35ff9137a75024d2a8ef44828a50ec91071", "base": "7b106e106000713bbee31b34d694b3dadbd4818c", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1346", "merged_by": null, "auto_merge": null} {"id": 662557240, "node_id": "MDExOlB1bGxSZXF1ZXN0NjYyNTU3MjQw", "number": 1357, "state": "closed", "locked": 0, "title": "Make custom pages compatible with base_url setting", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1238.", "created_at": "2021-06-05T18:54:39Z", "updated_at": "2021-06-05T18:59:54Z", "closed_at": "2021-06-05T18:59:54Z", "merged_at": "2021-06-05T18:59:54Z", "merge_commit_sha": "a63412152518581c6a3d4e142b937e27dabdbfdb", "assignee": null, "milestone": null, "draft": 0, "head": "1b27643d7bd192e1d2cc52e36ada0021c3f76bb8", "base": "6e9b07be92905011211d8df7a872fb7c1f2737b2", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1357", "merged_by": null, "auto_merge": null} {"id": 691707409, "node_id": "MDExOlB1bGxSZXF1ZXN0NjkxNzA3NDA5", "number": 1397, "state": "closed", "locked": 0, "title": "Fix for race condition in refresh_schemas(), closes #1231", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2021-07-16T19:44:43Z", "updated_at": "2021-07-16T19:45:00Z", "closed_at": "2021-07-16T19:44:58Z", "merged_at": "2021-07-16T19:44:58Z", "merge_commit_sha": "c00f29affcafce8314366852ba1a0f5a7dd25690", "assignee": null, "milestone": null, "draft": 0, "head": "bf2453ab7cb876c91edab3df59b7f398df2f9727", "base": "dd5ee8e66882c94343cd3f71920878c6cfd0da41", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1397", "merged_by": null, "auto_merge": null} {"id": 702422263, "node_id": "MDExOlB1bGxSZXF1ZXN0NzAyNDIyMjYz", "number": 1418, "state": "closed", "locked": 0, "title": "Spelling corrections plus CI job for codespell", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1417.", "created_at": "2021-08-03T16:21:19Z", "updated_at": "2021-08-03T16:36:39Z", "closed_at": "2021-08-03T16:36:38Z", "merged_at": "2021-08-03T16:36:38Z", "merge_commit_sha": "2208c3c68e552d343e6a2872ff6e559fca9d1b38", "assignee": null, "milestone": null, "draft": 0, "head": "532170fc606df04986104aacbd67b920c5fa0af9", "base": "54b6e96ee8aa553b6671e341a1944f93f3fb89c3", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1418", "merged_by": null, "auto_merge": null} {"id": 711783616, "node_id": "MDExOlB1bGxSZXF1ZXN0NzExNzgzNjE2", "number": 1430, "state": "closed", "locked": 0, "title": "Column metadata", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #942\r\n\r\nStill needs:\r\n\r\n- [x] Tests\r\n- [x] Documentation", "created_at": "2021-08-12T23:34:39Z", "updated_at": "2021-08-12T23:53:23Z", "closed_at": "2021-08-12T23:53:23Z", "merged_at": "2021-08-12T23:53:23Z", "merge_commit_sha": "e837095ef35ae155b4c78cc9a8b7133a48c94f03", "assignee": null, "milestone": null, "draft": 0, "head": "941994725dd41deb6f839c5063cff5d15d4abb1c", "base": "b1fed48a95516ae84c0f020582303ab50ab817e2", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1430", "merged_by": null, "auto_merge": null} {"id": 712412883, "node_id": "MDExOlB1bGxSZXF1ZXN0NzEyNDEyODgz", "number": 1434, "state": "open", "locked": 0, "title": "Enrich arbitrary query results with foreign key links and column descriptions", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1293, follows #942.", "created_at": "2021-08-13T14:43:01Z", "updated_at": "2021-08-19T21:18:58Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "d4d4f5566b1d43075cb52ded5d19a9dcf4350761", "assignee": null, "milestone": null, "draft": 0, "head": "281c0872d5b8a462c9d7b2b2d77a924da4ed25a7", "base": "2883098770fc66e50183b2b231edbde20848d4d6", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1434", "merged_by": null, "auto_merge": null} {"id": 716262829, "node_id": "MDExOlB1bGxSZXF1ZXN0NzE2MjYyODI5", "number": 1444, "state": "closed", "locked": 0, "title": "Ability to deploy demos of branches", "user": {"value": 9599, "label": "simonw"}, "body": "See #1442.", "created_at": "2021-08-19T21:08:04Z", "updated_at": "2021-08-19T21:09:44Z", "closed_at": "2021-08-19T21:09:39Z", "merged_at": "2021-08-19T21:09:39Z", "merge_commit_sha": "d84e574e59c51ddcd6cf60a6f9b3d45182daf824", "assignee": null, "milestone": null, "draft": 0, "head": "75f9fe6d6bc642ce5587dd74eed70064c11868be", "base": "adb5b70de5cec3c3dd37184defe606a082c232cf", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1444", "merged_by": null, "auto_merge": null} {"id": 154246816, "node_id": "MDExOlB1bGxSZXF1ZXN0MTU0MjQ2ODE2", "number": 145, "state": "closed", "locked": 0, "title": "Fix pytest version conflict", "user": {"value": 9599, "label": "simonw"}, "body": "https://travis-ci.org/simonw/datasette/jobs/305929426\r\n\r\n pkg_resources.VersionConflict: (pytest 3.2.1 (/home/travis/virtualenv/python3.5.3/lib/python3.5/site-packages), \r\n Requirement.parse('pytest==3.2.3'))", "created_at": "2017-11-22T20:15:34Z", "updated_at": "2017-11-22T20:17:54Z", "closed_at": "2017-11-22T20:17:52Z", "merged_at": "2017-11-22T20:17:52Z", "merge_commit_sha": "f96e55bce55d26c4d5b198edc536e1b8e9bbea43", "assignee": null, "milestone": null, "draft": 0, "head": "e319478c4a34fb5afbff2b2a8c3b9ef9f859bb10", "base": "fa8eb0bf1b113ab17ede9cd107b7c3bd5cde39c3", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/145", "merged_by": null, "auto_merge": null} {"id": 753513062, "node_id": "PR_kwDOBm6k_c4s6bJm", "number": 1481, "state": "closed", "locked": 0, "title": "Fix compatibility with Python 3.10", "user": {"value": 9599, "label": "simonw"}, "body": null, "created_at": "2021-10-07T20:34:23Z", "updated_at": "2021-10-24T22:19:55Z", "closed_at": "2021-10-24T22:19:54Z", "merged_at": "2021-10-24T22:19:54Z", "merge_commit_sha": "96a823f2834a262ae97a90ebfb6847f14763c415", "assignee": null, "milestone": null, "draft": 0, "head": "50005bd2d36219c3ae8b6220d38df918459a1812", "base": "63886178a649586b403966a27a45881709d2b868", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1481", "merged_by": null, "auto_merge": null} {"id": 758569502, "node_id": "PR_kwDOBm6k_c4tNtoe", "number": 1490, "state": "closed", "locked": 0, "title": "Upgrade to httpx 0.20", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1488 ", "created_at": "2021-10-14T17:51:05Z", "updated_at": "2021-10-14T18:03:45Z", "closed_at": "2021-10-14T18:03:44Z", "merged_at": "2021-10-14T18:03:44Z", "merge_commit_sha": "b267b5775436577a91a9f9655143908aecff05da", "assignee": null, "milestone": null, "draft": 0, "head": "e0332d1f4788a561492965a09ef83fe122fd3d8c", "base": "2a8c6690399ee832ee62aafdede1794f5945d911", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1490", "merged_by": null, "auto_merge": null} {"id": 782105066, "node_id": "PR_kwDOBm6k_c4unfnq", "number": 1512, "state": "closed", "locked": 0, "title": "New pattern for async view classes", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #878 - starting out with the new `AsyncBase` class implementing a pytest-inspired `asyncio` parallel execution mechanism.", "created_at": "2021-11-16T21:55:44Z", "updated_at": "2021-11-17T01:39:54Z", "closed_at": "2021-11-17T01:39:44Z", "merged_at": null, "merge_commit_sha": "fb57d4474cb1fdaef260e244b1b6f470f1992e40", "assignee": null, "milestone": null, "draft": 1, "head": "8f757da0750fe7f27b4ed3839bc3ef3650832ad9", "base": "0156c6b5e52d541e93f0d68e9245f20ae83bc933", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1512", "merged_by": null, "auto_merge": null} {"id": 801798514, "node_id": "PR_kwDOBm6k_c4vynly", "number": 1554, "state": "closed", "locked": 0, "title": "TableView refactor", "user": {"value": 9599, "label": "simonw"}, "body": "I'm starting a PR with almost nothing in it so I can use the GitHub code commenting feature to add a bunch of comments to the code I intend to refactor.\r\n\r\nRelated issues:\r\n\r\n- #617 \r\n- #715 \r\n- #870\r\n- #1518", "created_at": "2021-12-13T23:16:04Z", "updated_at": "2021-12-20T23:52:11Z", "closed_at": "2021-12-20T23:52:04Z", "merged_at": null, "merge_commit_sha": "a68545f9a4c3b3a68259be5c03abfc9ad7710875", "assignee": null, "milestone": null, "draft": 0, "head": "1d08b46412410837f987c606b2307a121fa2641a", "base": "a6ff123de5464806441f6a6f95145c9a83b7f20b", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1554", "merged_by": null, "auto_merge": null} {"id": 804924636, "node_id": "PR_kwDOBm6k_c4v-izc", "number": 1559, "state": "closed", "locked": 0, "title": "filters_from_request plugin hook, now used in TableView", "user": {"value": 9599, "label": "simonw"}, "body": "New plugin hook, refs #473\r\n\r\nUsed it to extract the logic from TableView that handles _search and\r\n_through and _where - refs #1518", "created_at": "2021-12-16T23:59:33Z", "updated_at": "2021-12-17T23:09:41Z", "closed_at": "2021-12-17T19:02:15Z", "merged_at": "2021-12-17T19:02:15Z", "merge_commit_sha": "aa7f0037a46eb76ae6fe9bf2a1f616c58738ecdf", "assignee": null, "milestone": null, "draft": 0, "head": "71af58d9392d42f45506cbc2370c1e9994126f63", "base": "0663d5525cc41e9260ac7d1f6386d3a6eb5ad2a9", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1559", "merged_by": null, "auto_merge": null} {"id": 838724548, "node_id": "PR_kwDOBm6k_c4x_evE", "number": 1622, "state": "closed", "locked": 0, "title": "Test against Python 3.11-dev", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1621", "created_at": "2022-02-02T21:39:38Z", "updated_at": "2022-02-02T21:58:53Z", "closed_at": "2022-02-02T21:58:53Z", "merged_at": "2022-02-02T21:58:53Z", "merge_commit_sha": "a9d8824617268c4d214dd3be2174ac452044f737", "assignee": null, "milestone": null, "draft": 0, "head": "fbaf317ab723482e971688cda72ce51825bcf4d7", "base": "8d5779acf0041cfd0db7f68f468419f9008b86ec", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1622", "merged_by": null, "auto_merge": null} {"id": 838755826, "node_id": "PR_kwDOBm6k_c4x_mXy", "number": 1626, "state": "open", "locked": 0, "title": "Try test suite against macOS and Windows", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1625", "created_at": "2022-02-02T22:26:51Z", "updated_at": "2022-02-03T01:22:44Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "83958f26a8458a108acb7c3c0a1c8aacb777586a", "assignee": null, "milestone": null, "draft": 0, "head": "4b4d0e1ff9e2ee998cbd71abd5f5806f25444ed9", "base": "b5e6b1a9e1332fca3effe45d55dd06ee4249f163", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1626", "merged_by": null, "auto_merge": null} {"id": 872324754, "node_id": "PR_kwDOBm6k_c4z_p6S", "number": 1648, "state": "closed", "locked": 0, "title": "Use dash encoding for table names and row primary keys in URLs", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1439.\r\n\r\n- [x] Build `dash_encode` / `dash_decode` functions\r\n- [x] Use dash encoding for row primary keys\r\n- [x] Use dash encoding for `?_next=` pagination tokens\r\n- [x] Use dash encoding for table names in URLs\r\n- [x] Use dash encoding for database name\r\n- ~~Implement redirects from previous `%` URLs that replace those with `-`~~ - separate issue: #1650", "created_at": "2022-03-05T19:50:45Z", "updated_at": "2022-03-07T15:38:30Z", "closed_at": "2022-03-07T15:38:30Z", "merged_at": "2022-03-07T15:38:29Z", "merge_commit_sha": "1baa030eca375f839f3471237547ab403523e643", "assignee": null, "milestone": null, "draft": 0, "head": "32548b88fdb413429d960966decba8f6b3889190", "base": "5010d1359b9e9db90a5a69a3ca22d12862893e00", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1648", "merged_by": null, "auto_merge": null} {"id": 880373442, "node_id": "PR_kwDOBm6k_c40eW7C", "number": 1659, "state": "closed", "locked": 0, "title": "Tilde encoding", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1657", "created_at": "2022-03-15T16:19:07Z", "updated_at": "2022-03-15T18:01:58Z", "closed_at": "2022-03-15T18:01:57Z", "merged_at": "2022-03-15T18:01:57Z", "merge_commit_sha": "a35393b29cfb5b8abdc6a94e577af1c9a5c13652", "assignee": null, "milestone": null, "draft": 0, "head": "99b8263806e81028af169f400352c26e5473ab44", "base": "c10cd48baf106659bf3f129ad7bfb2226be73821", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1659", "merged_by": null, "auto_merge": null} {"id": 882973374, "node_id": "PR_kwDOBm6k_c40oRq-", "number": 1664, "state": "closed", "locked": 0, "title": "Remove hashed URL mode", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1661.", "created_at": "2022-03-17T23:19:10Z", "updated_at": "2022-03-19T00:12:04Z", "closed_at": "2022-03-19T00:12:04Z", "merged_at": "2022-03-19T00:12:03Z", "merge_commit_sha": "d4f60c2388c01ddce1b16f95c16d310e037c9912", "assignee": null, "milestone": null, "draft": 0, "head": "eae91fe8c2934c8674f5202b2d9f85b6f674c410", "base": "30e5f0e67c38054a8087a2a4eae3fc4d1779af90", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1664", "merged_by": null, "auto_merge": null} {"id": 157365811, "node_id": "MDExOlB1bGxSZXF1ZXN0MTU3MzY1ODEx", "number": 168, "state": "closed", "locked": 0, "title": "Upgrade to Sanic 0.7.0", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2017-12-09T01:25:08Z", "updated_at": "2017-12-09T03:00:34Z", "closed_at": "2017-12-09T03:00:34Z", "merged_at": "2017-12-09T03:00:34Z", "merge_commit_sha": "446f4b832272b2286f6f65af19714eb64afb7aa6", "assignee": null, "milestone": null, "draft": 0, "head": "d9e13a5cc2b77637a6cdd8bd21b9b8fc1350051a", "base": "61e3c5a1e904a6e1cbee86ba1494b5cb4b5820cf", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/168", "merged_by": null, "auto_merge": null} {"id": 925926708, "node_id": "PR_kwDOBm6k_c43MIU0", "number": 1736, "state": "closed", "locked": 0, "title": "Clean up compatibility with Pyodide", "user": {"value": 9599, "label": "simonw"}, "body": "Closes #1735, closes #1733", "created_at": "2022-05-02T20:14:38Z", "updated_at": "2022-05-02T20:15:28Z", "closed_at": "2022-05-02T20:15:27Z", "merged_at": "2022-05-02T20:15:27Z", "merge_commit_sha": "3f00a29141bdea5be747f6d1c93871ccdb792167", "assignee": null, "milestone": null, "draft": 0, "head": "784fe6a245a051ef6b42e153d3fae9cce7b0b148", "base": "a29c1277896b6a7905ef5441c42a37bc15f67599", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1736", "merged_by": null, "auto_merge": null} {"id": 1034576054, "node_id": "PR_kwDOBm6k_c49qmC2", "number": 1792, "state": "closed", "locked": 0, "title": "Test `--load-extension` in GitHub Actions", "user": {"value": 9599, "label": "simonw"}, "body": "Refs:\r\n- #1789\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--1792.org.readthedocs.build/en/1792/\n\r\n", "created_at": "2022-08-23T18:43:29Z", "updated_at": "2022-08-24T00:11:46Z", "closed_at": "2022-08-24T00:11:45Z", "merged_at": "2022-08-24T00:11:45Z", "merge_commit_sha": "ba35105eee2d3ba620e4f230028a02b2e2571df2", "assignee": null, "milestone": null, "draft": 0, "head": "f61cfb77056e2ee39ae827889c005b1e44c81165", "base": "456dc155d491a009942ace71a4e1827cddc6b93d", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1792", "merged_by": null, "auto_merge": null} {"id": 1046767034, "node_id": "PR_kwDOBm6k_c4-ZGW6", "number": 1801, "state": "closed", "locked": 0, "title": "Don't use upper bound dependencies, refs #1800", "user": {"value": 9599, "label": "simonw"}, "body": "See https://iscinumpy.dev/post/bound-version-constraints/\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--1801.org.readthedocs.build/en/1801/\n\r\n", "created_at": "2022-09-05T18:29:28Z", "updated_at": "2022-09-05T18:35:41Z", "closed_at": "2022-09-05T18:35:41Z", "merged_at": "2022-09-05T18:35:41Z", "merge_commit_sha": "51030df1869b3b574dd3584d1563415776b9cd4e", "assignee": null, "milestone": null, "draft": 0, "head": "3f24edd6b29e7deff37d0e45827133fc5a9e5387", "base": "ba35105eee2d3ba620e4f230028a02b2e2571df2", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1801", "merged_by": null, "auto_merge": null} {"id": 1046943107, "node_id": "PR_kwDOBm6k_c4-ZxWD", "number": 1803, "state": "closed", "locked": 0, "title": "Workaround for test failure: RuntimeError: There is no current event loop", "user": {"value": 9599, "label": "simonw"}, "body": "Closes #1802\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--1803.org.readthedocs.build/en/1803/\n\r\n", "created_at": "2022-09-06T00:31:06Z", "updated_at": "2022-09-06T00:40:19Z", "closed_at": "2022-09-06T00:40:19Z", "merged_at": "2022-09-06T00:40:19Z", "merge_commit_sha": "64288d827f7ff97f825e10f714da3f781ecf9345", "assignee": null, "milestone": null, "draft": 0, "head": "7b6a2b48408697905bd93504b7f5554f4a7627ef", "base": "1c29b925d300d1ee17047504473f2517767aa05b", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1803", "merged_by": null, "auto_merge": null} {"id": 1067890893, "node_id": "PR_kwDOBm6k_c4_prjN", "number": 1823, "state": "open", "locked": 0, "title": "Keyword-only arguments for a bunch of internal methods", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1822\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--1823.org.readthedocs.build/en/1823/\n\r\n", "created_at": "2022-09-27T00:44:59Z", "updated_at": "2022-10-05T04:37:54Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "28068a62ad6a8b76a1c9223c4ca78099cfd2ece5", "assignee": null, "milestone": null, "draft": 0, "head": "b545b6a04ed7b407331f991adce107691ac3ab97", "base": "5f9f567acbc58c9fcd88af440e68034510fb5d2b", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1823", "merged_by": null, "auto_merge": null} {"id": 1086765659, "node_id": "PR_kwDOBm6k_c5Axrpb", "number": 1842, "state": "closed", "locked": 0, "title": "check_visibility can now take multiple permissions into account", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1829\r\n\r\n- [x] Fix table page\r\n- [x] Fix database page\r\n- [x] Fix query page\r\n- [x] Fix row page\r\n- [x] Tests\r\n- [x] Updated documentation for `check_visibility` method, to cover the new `permissions=` keyword argument\r\n\r\nAlso this fix is currently only applied on the table page - needs to be applied on database, row and query pages too.\r\n\r\n\r\n----\r\n:books: Documentation preview :books:: https://datasette--1842.org.readthedocs.build/en/1842/\r\n\r\n", "created_at": "2022-10-14T00:06:04Z", "updated_at": "2022-10-24T02:11:36Z", "closed_at": "2022-10-24T02:11:36Z", "merged_at": "2022-10-24T02:11:34Z", "merge_commit_sha": "78dad236df730212aa7172f885fd8ec575f0d3ad", "assignee": null, "milestone": null, "draft": 0, "head": "362347574e3283d637243906af7d5e028e100180", "base": "79aa0de083d38a9975915d5a4cc68ca6c74fbe3d", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1842", "merged_by": null, "auto_merge": null} {"id": 1139440836, "node_id": "PR_kwDOBm6k_c5D6nzE", "number": 1912, "state": "closed", "locked": 0, "title": "Merge 1.0-dev (with initial write API) back into main", "user": {"value": 9599, "label": "simonw"}, "body": "See:\r\n- #1892\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--1912.org.readthedocs.build/en/1912/\n\r\n", "created_at": "2022-11-29T19:31:21Z", "updated_at": "2022-11-29T19:39:37Z", "closed_at": "2022-11-29T19:39:36Z", "merged_at": "2022-11-29T19:39:36Z", "merge_commit_sha": "07aad511769da9242260c850e8d975cbd8c29552", "assignee": null, "milestone": null, "draft": 0, "head": "b8fc8e2cd755b9cfc66838bdc1ca9ee87afdce8a", "base": "21f8aab53164a4f096737743d8cc624d2186327a", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1912", "merged_by": null, "auto_merge": null} {"id": 179108961, "node_id": "MDExOlB1bGxSZXF1ZXN0MTc5MTA4OTYx", "number": 192, "state": "closed", "locked": 0, "title": "New ?_shape=objects/object/lists param for JSON API", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #122", "created_at": "2018-04-03T14:02:58Z", "updated_at": "2018-04-03T14:53:00Z", "closed_at": "2018-04-03T14:52:55Z", "merged_at": "2018-04-03T14:52:55Z", "merge_commit_sha": "0abd3abacb309a2bd5913a7a2df4e9256585b1bb", "assignee": null, "milestone": null, "draft": 0, "head": "a759e09e8599e2cf54f6c5ab4d1cf8adf8608793", "base": "dd0566ff8eda7fa2f0d92e51809581fae62cffed", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/192", "merged_by": null, "auto_merge": null} {"id": 1144085408, "node_id": "PR_kwDOBm6k_c5EMVug", "number": 1931, "state": "closed", "locked": 0, "title": "/db/table/-/upsert", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1878\r\n\r\nStill todo:\r\n- [x] Support `\"return\": true` properly for upserts (with tests)\r\n- [x] Require both `insert-row` and `update-row` permissions\r\n- [x] Tests are going to need to cover both rowid-only and compound primary key tables, including all of the error states\r\n- [x] Documentation\r\n\r\n\r\n----\r\n:books: Documentation preview :books:: https://datasette--1931.org.readthedocs.build/en/1931/\r\n\r\n", "created_at": "2022-12-03T07:01:44Z", "updated_at": "2022-12-08T01:12:17Z", "closed_at": "2022-12-08T01:12:16Z", "merged_at": "2022-12-08T01:12:16Z", "merge_commit_sha": "272982e8a6f45700ff93c3917b4688a86de0e672", "assignee": null, "milestone": {"value": 8711695, "label": " Datasette 1.0a2"}, "draft": 0, "head": "7cd6fd9f76913196d4f99a194a30e406f33aa363", "base": "93ababe6f7150454d2cf278dae08569e505d2a5b", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1931", "merged_by": null, "auto_merge": null} {"id": 1154884166, "node_id": "PR_kwDOBm6k_c5E1iJG", "number": 1938, "state": "closed", "locked": 0, "title": "\"permissions\" blocks in metadata.json/yaml", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1636\r\n\r\n- [x] Documentation\r\n- [ ] Implementation\r\n- [ ] Validate metadata to check there are no nonsensical permissions (like `debug-menu` set at the table level)\r\n- [ ] Tests\r\n\r\n\r\n----\r\n:books: Documentation preview :books:: https://datasette--1938.org.readthedocs.build/en/1938/\r\n\r\n", "created_at": "2022-12-08T22:07:36Z", "updated_at": "2022-12-13T05:23:19Z", "closed_at": "2022-12-13T05:23:18Z", "merged_at": null, "merge_commit_sha": "271ea3ae0c858de2d392b61a1a4a9f5837cbddf8", "assignee": null, "milestone": {"value": 8711695, "label": " Datasette 1.0a2"}, "draft": 0, "head": "6e35a6b4f7ea9ba3fb6f02f45452eeb41de69786", "base": "e539c1c024bc62d88df91d9107cbe37e7f0fe55f", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1938", "merged_by": null, "auto_merge": null} {"id": 1155365505, "node_id": "PR_kwDOBm6k_c5E3XqB", "number": 1940, "state": "closed", "locked": 0, "title": "register_permissions() plugin hook", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1939\r\n\r\nFrom this comment: https://github.com/simonw/datasette/issues/1939#issuecomment-1343872168\r\n\r\n- [x] Unit test for the registration plugin hook itself\r\n- [x] Use them in `check_permission_actions_are_documented` test in `conftest.py`\r\n- [x] Add description field to `Permissions` (and update tests and docs)\r\n- [x] Documentation for `datasette.permissions` dictionary\r\n- [x] If no `default=` provided in call to `permission_allowed()` then use default from `datasette.permissions` list\r\n- [x] Remove `default=` from a bunch of places\r\n- [x] Throw an error if two permissions are registered with the same name or abbreviation (but other attributes differ)\r\n- [x] Update authentication and permissions documentation to explain that permissions are now registered and have a registered default\r\n\r\n\r\n----\r\n:books: Documentation preview :books:: https://datasette--1940.org.readthedocs.build/en/1940/\r\n\r\n", "created_at": "2022-12-09T05:09:28Z", "updated_at": "2022-12-13T02:05:55Z", "closed_at": "2022-12-13T02:05:54Z", "merged_at": "2022-12-13T02:05:54Z", "merge_commit_sha": "8bf06a76b51bc9ace7cf72cf0cca8f1da7704ea7", "assignee": null, "milestone": {"value": 8711695, "label": " Datasette 1.0a2"}, "draft": 0, "head": "94e5c75397a96b86a3349123808cd02cb20f7440", "base": "e539c1c024bc62d88df91d9107cbe37e7f0fe55f", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1940", "merged_by": null, "auto_merge": null} {"id": 180188397, "node_id": "MDExOlB1bGxSZXF1ZXN0MTgwMTg4Mzk3", "number": 196, "state": "closed", "locked": 0, "title": "_sort= and _sort_desc= parameters to table view", "user": {"value": 9599, "label": "simonw"}, "body": "See #189 ", "created_at": "2018-04-09T00:07:21Z", "updated_at": "2018-04-09T05:10:29Z", "closed_at": "2018-04-09T05:10:23Z", "merged_at": "2018-04-09T05:10:23Z", "merge_commit_sha": "c1d37fdf2be84fb07155bb1b1f61057444b03300", "assignee": null, "milestone": null, "draft": 0, "head": "fdd6b71e40c8aa9a93e95802a8b6291099d4db2c", "base": "b2188f044265c95f7e54860e28107c17d2a6ed2e", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/196", "merged_by": null, "auto_merge": null} {"id": 1167432070, "node_id": "PR_kwDOBm6k_c5FlZmG", "number": 1960, "state": "closed", "locked": 0, "title": "Port as many tests as possible to async def tests against ds_client", "user": {"value": 9599, "label": "simonw"}, "body": "Refs:\r\n- #1959\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--1960.org.readthedocs.build/en/1960/\n\r\n", "created_at": "2022-12-15T21:45:53Z", "updated_at": "2022-12-17T21:47:56Z", "closed_at": "2022-12-17T21:47:55Z", "merged_at": "2022-12-17T21:47:55Z", "merge_commit_sha": "89cffcf14cda830871c8ee81742eaa1e2dff017b", "assignee": null, "milestone": null, "draft": 0, "head": "f42bca8fc2657cecde05eca644c28fac7c28101f", "base": "0b68996cc511b3a801f0cd0157bd66332d75f46f", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1960", "merged_by": null, "auto_merge": null} {"id": 1167644140, "node_id": "PR_kwDOBm6k_c5FmNXs", "number": 1961, "state": "closed", "locked": 0, "title": "Use click.echo() instead of print() for --root option", "user": {"value": 9599, "label": "simonw"}, "body": "This ensures the URL is output correctly when running under Docker.\r\n\r\nCloses #1958\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--1961.org.readthedocs.build/en/1961/\n\r\n", "created_at": "2022-12-16T00:54:56Z", "updated_at": "2022-12-16T00:55:19Z", "closed_at": "2022-12-16T00:55:18Z", "merged_at": "2022-12-16T00:55:18Z", "merge_commit_sha": "013496862f4d4b441ab61255242b838b24287607", "assignee": null, "milestone": null, "draft": 0, "head": "06d20c792f8c872118edd84973308fb3e5137b5e", "base": "0b68996cc511b3a801f0cd0157bd66332d75f46f", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1961", "merged_by": null, "auto_merge": null} {"id": 1191716406, "node_id": "PR_kwDOBm6k_c5HCCY2", "number": 1984, "state": "closed", "locked": 0, "title": "Upgrade Sphinx", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1971\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--1984.org.readthedocs.build/en/1984/\n\r\n", "created_at": "2023-01-10T02:00:40Z", "updated_at": "2023-01-10T02:02:33Z", "closed_at": "2023-01-10T02:02:33Z", "merged_at": "2023-01-10T02:02:32Z", "merge_commit_sha": "8e7073404379d79a2d269167a12bbb58439edd39", "assignee": null, "milestone": null, "draft": 0, "head": "0c8b3f5ca1385c804c696f1fa61c24de29ae4755", "base": "4880638f13c3a1abc53f395cde39ac848daf416d", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1984", "merged_by": null, "auto_merge": null} {"id": 1212277427, "node_id": "PR_kwDOBm6k_c5IQeKz", "number": 1999, "state": "closed", "locked": 0, "title": "?_extra= support (draft)", "user": {"value": 9599, "label": "simonw"}, "body": "Refs:\r\n- #262\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--1999.org.readthedocs.build/en/1999/\n\r\n", "created_at": "2023-01-21T04:55:18Z", "updated_at": "2023-03-22T22:49:41Z", "closed_at": "2023-03-22T22:49:40Z", "merged_at": "2023-03-22T22:49:40Z", "merge_commit_sha": "d97e82df3c8a3f2e97038d7080167be9bb74a68d", "assignee": null, "milestone": null, "draft": 0, "head": "69a31cd5b61f0b62938efdeec5972090f1a1a508", "base": "56b0758a5fbf85d01ff80a40c9b028469d7bb65f", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1999", "merged_by": null, "auto_merge": null} {"id": 1303909190, "node_id": "PR_kwDOBm6k_c5NuBNG", "number": 2053, "state": "open", "locked": 0, "title": "WIP new JSON for queries", "user": {"value": 9599, "label": "simonw"}, "body": "Refs:\r\n- #2049\r\n\r\nTODO:\r\n\r\n- [x] Read queries JSON\r\n- [ ] Implement error display with `\"ok\": false` and an errors key\r\n- [ ] Read queries HTML\r\n- [ ] Read queries other formats (plugins)\r\n- [ ] Canned read queries (dispatched to from table)\r\n- [ ] Write queries (a canned query thing)\r\n- [ ] Implement different shapes, refactoring to share code with table\r\n- [ ] Implement a sensible subset of extras, also refactoring to share code with table\r\n- [ ] Get all tests passing\r\n\r\n\r\n----\r\n:books: Documentation preview :books:: https://datasette--2053.org.readthedocs.build/en/2053/\r\n\r\n", "created_at": "2023-04-05T23:26:15Z", "updated_at": "2023-05-26T23:13:03Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "3f9f8455e9a7c3fd65d034f5432a31a548c613a7", "assignee": null, "milestone": null, "draft": 1, "head": "007294008d925b7e5529e6d14add002b6b56ddb5", "base": "dda99fc09fb0b5523948f6d481c6c051c1c7b5de", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2053", "merged_by": null, "auto_merge": null} {"id": 1365439700, "node_id": "PR_kwDOBm6k_c5RYvTU", "number": 2080, "state": "closed", "locked": 0, "title": "New View base class", "user": {"value": 9599, "label": "simonw"}, "body": "Refs:\r\n\r\n- #2078\r\n\r\nTODO:\r\n\r\n- [x] Teach router layer how to handle this\r\n- [x] Use it for something\r\n\r\n\r\n----\r\n:books: Documentation preview :books:: https://datasette--2080.org.readthedocs.build/en/2080/\r\n\r\n", "created_at": "2023-05-25T23:22:55Z", "updated_at": "2023-05-26T00:18:45Z", "closed_at": "2023-05-26T00:18:44Z", "merged_at": "2023-05-26T00:18:44Z", "merge_commit_sha": "dda99fc09fb0b5523948f6d481c6c051c1c7b5de", "assignee": null, "milestone": null, "draft": 0, "head": "e990fbc00ef36c022986432e7706b3ad1c9c68a1", "base": "b49fa446d683ddcaf6faf2944dacc0d866bf2d70", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2080", "merged_by": null, "auto_merge": null} {"id": 181731956, "node_id": "MDExOlB1bGxSZXF1ZXN0MTgxNzMxOTU2", "number": 210, "state": "closed", "locked": 0, "title": "Start of the plugin system, based on pluggy", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #14", "created_at": "2018-04-16T00:51:30Z", "updated_at": "2018-04-16T00:56:16Z", "closed_at": "2018-04-16T00:56:16Z", "merged_at": "2018-04-16T00:56:16Z", "merge_commit_sha": "33c7c53ff87c25445c68088ede49d062d9c31fe8", "assignee": null, "milestone": null, "draft": 0, "head": "d75e57060d9ef4ef6ebab3600e542885b7467272", "base": "efbb4e83374a2c795e436c72fa79f70da72309b8", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/210", "merged_by": null, "auto_merge": null} {"id": 181755220, "node_id": "MDExOlB1bGxSZXF1ZXN0MTgxNzU1MjIw", "number": 212, "state": "closed", "locked": 0, "title": "New --plugins-dir=plugins/ option", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #211", "created_at": "2018-04-16T05:19:28Z", "updated_at": "2018-04-16T05:22:18Z", "closed_at": "2018-04-16T05:22:01Z", "merged_at": "2018-04-16T05:22:01Z", "merge_commit_sha": "b2955d9065ea019500c7d072bcd9d49d1967f051", "assignee": null, "milestone": null, "draft": 0, "head": "33c6bcadb962457be6b0c7f369826b404e2bcef5", "base": "92396ae5bacedfcb3d7c81319ccdd04483fd7fd4", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/212", "merged_by": null, "auto_merge": null} {"id": 182357613, "node_id": "MDExOlB1bGxSZXF1ZXN0MTgyMzU3NjEz", "number": 222, "state": "closed", "locked": 0, "title": "Fix for plugins in Python 3.5", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2018-04-18T03:21:01Z", "updated_at": "2018-04-18T04:26:50Z", "closed_at": "2018-04-18T03:24:21Z", "merged_at": "2018-04-18T03:24:21Z", "merge_commit_sha": "4be6deb94776744071311777f0b18efb993c0cfa", "assignee": null, "milestone": null, "draft": 0, "head": "420cdcb88ee41c15a90fce30fdec5832c03295bd", "base": "1c36d07dd432b9960f4f2d096739460b4fcf8877", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/222", "merged_by": null, "auto_merge": null} {"id": 185307407, "node_id": "MDExOlB1bGxSZXF1ZXN0MTg1MzA3NDA3", "number": 246, "state": "closed", "locked": 0, "title": "?_shape=array and _timelimit=", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2018-05-02T00:18:54Z", "updated_at": "2018-05-02T00:20:41Z", "closed_at": "2018-05-02T00:20:40Z", "merged_at": "2018-05-02T00:20:40Z", "merge_commit_sha": "690736436bac599ca042d1caa465c6d66d2651f9", "assignee": null, "milestone": null, "draft": 0, "head": "3807d93b98573e142858c5871b8b4aadda71d28f", "base": "aa954382c3776d596f459897b0d984161293529d", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/246", "merged_by": null, "auto_merge": null} {"id": 187668890, "node_id": "MDExOlB1bGxSZXF1ZXN0MTg3NjY4ODkw", "number": 257, "state": "closed", "locked": 0, "title": "Refactor views", "user": {"value": 9599, "label": "simonw"}, "body": "* Split out view classes from main `app.py`\r\n* Run [black](https://github.com/ambv/black) against resulting code to apply opinionated source code formatting\r\n* Run [isort](https://github.com/timothycrosley/isort) to re-order my imports\r\n\r\nRefs #256 ", "created_at": "2018-05-13T13:00:50Z", "updated_at": "2018-05-14T03:04:25Z", "closed_at": "2018-05-14T03:04:24Z", "merged_at": "2018-05-14T03:04:24Z", "merge_commit_sha": "2b79f2bdeb1efa86e0756e741292d625f91cb93d", "assignee": null, "milestone": null, "draft": 0, "head": "0e2b41f3fa38456af32548c536f955c48c7637e8", "base": "4301a8f3ac69f2f54916e73cc90fcf216a9a3746", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/257", "merged_by": null, "auto_merge": null} {"id": 188312411, "node_id": "MDExOlB1bGxSZXF1ZXN0MTg4MzEyNDEx", "number": 261, "state": "closed", "locked": 0, "title": "Facets improvements plus suggested facets", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #255", "created_at": "2018-05-16T03:52:39Z", "updated_at": "2018-05-16T15:27:26Z", "closed_at": "2018-05-16T15:27:25Z", "merged_at": "2018-05-16T15:27:25Z", "merge_commit_sha": "9959a9e4deec8e3e178f919e8b494214d5faa7fd", "assignee": null, "milestone": null, "draft": 0, "head": "af0e91e7769891949198fb1e1760886424f34b16", "base": "2b79f2bdeb1efa86e0756e741292d625f91cb93d", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/261", "merged_by": null, "auto_merge": null} {"id": 193361341, "node_id": "MDExOlB1bGxSZXF1ZXN0MTkzMzYxMzQx", "number": 307, "state": "closed", "locked": 0, "title": "Initial sketch of custom URL routing, refs #306", "user": {"value": 9599, "label": "simonw"}, "body": "See #306 for background on this.", "created_at": "2018-06-07T15:26:48Z", "updated_at": "2018-06-07T15:29:54Z", "closed_at": "2018-06-07T15:29:41Z", "merged_at": null, "merge_commit_sha": "8c6663d3cc8043fc6f5c796275e80b0445bdff12", "assignee": null, "milestone": null, "draft": 0, "head": "018af454f286120452e33d2568dd40908474a8a8", "base": "a246f476b4fe490f5450836b22961bc607e6b4b0", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/307", "merged_by": null, "auto_merge": null} {"id": 195339111, "node_id": "MDExOlB1bGxSZXF1ZXN0MTk1MzM5MTEx", "number": 311, "state": "closed", "locked": 0, "title": "?_labels=1 to expand foreign keys (in csv and json), refs #233", "user": {"value": 9599, "label": "simonw"}, "body": "Output looks something like this:\r\n\r\n {\r\n \"rowid\": 233,\r\n \"TreeID\": 121240,\r\n \"qLegalStatus\": {\r\n \"value\" 2,\r\n \"label\": \"Private\"\r\n }\r\n \"qSpecies\": {\r\n \"value\": 16,\r\n \"label\": \"Sycamore\"\r\n }\r\n \"qAddress\": \"91 Commonwealth Ave\",\r\n ...\r\n }", "created_at": "2018-06-16T16:31:12Z", "updated_at": "2018-06-16T22:20:31Z", "closed_at": "2018-06-16T22:20:31Z", "merged_at": null, "merge_commit_sha": "9fe59e54ad65eb1c8239b1a78edb5219d3ab8ab0", "assignee": null, "milestone": null, "draft": 0, "head": "40287b1ba09d6e75f0db1458fe78d8c055f128af", "base": "d0a578c0fc07b9d9208cd9de981bdf7385a26c49", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/311", "merged_by": null, "auto_merge": null} {"id": 195413241, "node_id": "MDExOlB1bGxSZXF1ZXN0MTk1NDEzMjQx", "number": 315, "state": "closed", "locked": 0, "title": "Streaming mode for downloading all rows as a CSV", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #266", "created_at": "2018-06-18T03:06:59Z", "updated_at": "2018-06-18T03:29:13Z", "closed_at": "2018-06-18T03:21:02Z", "merged_at": "2018-06-18T03:21:02Z", "merge_commit_sha": "fc3660cfad7668dbce6ead12766e048fc1f78b11", "assignee": null, "milestone": null, "draft": 0, "head": "b15f412e04ce9ff21983986e661fbe4396f97b43", "base": "0d7ba1ba676828dc7c8dda78ebe7921f7986fc18", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/315", "merged_by": null, "auto_merge": null} {"id": 196628304, "node_id": "MDExOlB1bGxSZXF1ZXN0MTk2NjI4MzA0", "number": 324, "state": "closed", "locked": 0, "title": "Speed up Travis by reusing pip wheel cache across builds", "user": {"value": 9599, "label": "simonw"}, "body": "From https://atchai.com/blog/faster-ci/ - refs #323 ", "created_at": "2018-06-22T03:20:08Z", "updated_at": "2018-06-24T01:03:47Z", "closed_at": "2018-06-24T01:03:47Z", "merged_at": "2018-06-24T01:03:47Z", "merge_commit_sha": "47e689a89b3f5f0969595b17d2ec59ea3caffb3b", "assignee": null, "milestone": null, "draft": 0, "head": "7d7f5f61fd6dca3385386a657a13057680d8ddd7", "base": "e7566cc59d4b02ef301054fd35fdde6c925a8e38", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/324", "merged_by": null, "auto_merge": null} {"id": 201075532, "node_id": "MDExOlB1bGxSZXF1ZXN0MjAxMDc1NTMy", "number": 341, "state": "closed", "locked": 0, "title": "Bump aiohttp to fix compatibility with Python 3.7", "user": {"value": 9599, "label": "simonw"}, "body": "Tests failed here: https://travis-ci.org/simonw/datasette/jobs/403223333", "created_at": "2018-07-12T17:41:24Z", "updated_at": "2018-07-12T18:07:38Z", "closed_at": "2018-07-12T18:07:38Z", "merged_at": "2018-07-12T18:07:38Z", "merge_commit_sha": "31a5d8fa77be68d4f837f0a80a611675dce49f4b", "assignee": null, "milestone": null, "draft": 0, "head": "8d34ed776168dcac530859c51f22e8b48829a513", "base": "130dc8823ebdcc1834fc7c4a03c996b13fc1e444", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/341", "merged_by": null, "auto_merge": null} {"id": 204029142, "node_id": "MDExOlB1bGxSZXF1ZXN0MjA0MDI5MTQy", "number": 349, "state": "closed", "locked": 0, "title": "publish_subcommand hook + default plugins mechanism, used for publish heroku/now", "user": {"value": 9599, "label": "simonw"}, "body": "This change introduces a new plugin hook, publish_subcommand, which can be\r\nused to implement new subcommands for the \"datasette publish\" command family.\r\n\r\nI've used this new hook to refactor out the \"publish now\" and \"publish heroku\"\r\nimplementations into separate modules. I've also added unit tests for these\r\ntwo publishers, mocking the subprocess.call and subprocess.check_output\r\nfunctions.\r\n\r\nAs part of this, I introduced a mechanism for loading default plugins. These\r\nare defined in the new \"default_plugins\" list inside datasette/app.py\r\n\r\nCloses #217 (Plugin support for \"datasette publish\")\r\nCloses #348 (Unit tests for \"datasette publish\")\r\nRefs #14, #59, #102, #103, #146, #236, #347", "created_at": "2018-07-26T05:03:22Z", "updated_at": "2018-07-26T05:28:54Z", "closed_at": "2018-07-26T05:16:00Z", "merged_at": "2018-07-26T05:16:00Z", "merge_commit_sha": "dbbe707841973b50a76d2703003ae2c40e7ad1fd", "assignee": null, "milestone": null, "draft": 0, "head": "7abdfd55daa9c617da02fd768b8e7476e89f0f94", "base": "3ac21c749881d0fb1c35b0f9b7a819e29f61c5c1", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/349", "merged_by": null, "auto_merge": null} {"id": 204851511, "node_id": "MDExOlB1bGxSZXF1ZXN0MjA0ODUxNTEx", "number": 353, "state": "closed", "locked": 0, "title": "render_cell(value) plugin hook", "user": {"value": 9599, "label": "simonw"}, "body": "Closes #352.", "created_at": "2018-07-30T15:57:08Z", "updated_at": "2018-08-05T00:14:57Z", "closed_at": "2018-08-05T00:14:57Z", "merged_at": "2018-08-05T00:14:57Z", "merge_commit_sha": "4ac913224061f2dc4f673efab1a5ac6bc748854f", "assignee": null, "milestone": null, "draft": 0, "head": "2e538d924f3b17f82e94e8e8b5a05abcf9e1e697", "base": "295d005ca48747faf046ed30c3c61e7563c61ed2", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/353", "merged_by": null, "auto_merge": null} {"id": 206863803, "node_id": "MDExOlB1bGxSZXF1ZXN0MjA2ODYzODAz", "number": 358, "state": "closed", "locked": 0, "title": "Bump versions of pytest, pluggy and beautifulsoup4", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2018-08-08T00:44:38Z", "updated_at": "2018-08-08T01:11:13Z", "closed_at": "2018-08-08T01:11:13Z", "merged_at": "2018-08-08T01:11:13Z", "merge_commit_sha": "e1db8194e8c1d7f361fd0c1c3fc1b91d6aa920e5", "assignee": null, "milestone": null, "draft": 0, "head": "848ed0e0420d2e8c95a96b4cf73082da4c65d8f6", "base": "fe5b6ea95a973534fe8a44907c0ea2449aae7602", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/358", "merged_by": null, "auto_merge": null} {"id": 208719043, "node_id": "MDExOlB1bGxSZXF1ZXN0MjA4NzE5MDQz", "number": 361, "state": "closed", "locked": 0, "title": " Import pysqlite3 if available, closes #360 ", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2018-08-16T00:52:21Z", "updated_at": "2018-08-16T00:58:57Z", "closed_at": "2018-08-16T00:58:57Z", "merged_at": "2018-08-16T00:58:57Z", "merge_commit_sha": "aae49fef3b75848628d824077ec063834e3e5167", "assignee": null, "milestone": null, "draft": 0, "head": "da41daa168af8f29a1beb5278aed833cf3dc48ce", "base": "e1db8194e8c1d7f361fd0c1c3fc1b91d6aa920e5", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/361", "merged_by": null, "auto_merge": null} {"id": 232172106, "node_id": "MDExOlB1bGxSZXF1ZXN0MjMyMTcyMTA2", "number": 389, "state": "closed", "locked": 0, "title": "Bump dependency versions", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2018-11-20T02:23:12Z", "updated_at": "2019-11-13T19:13:41Z", "closed_at": "2019-11-13T19:13:41Z", "merged_at": null, "merge_commit_sha": "9194c0165aef411e0784ba49939b1005306f1f38", "assignee": null, "milestone": null, "draft": 0, "head": "f8349b45916e68d2f89c57694bd0e6afaf1bd508", "base": "5e3a432a0caa23837fa58134f69e2f82e4f632a6", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/389", "merged_by": null, "auto_merge": null} {"id": 241418443, "node_id": "MDExOlB1bGxSZXF1ZXN0MjQxNDE4NDQz", "number": 392, "state": "closed", "locked": 0, "title": "Fix some regex DeprecationWarnings", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2018-12-29T02:10:28Z", "updated_at": "2018-12-29T02:22:28Z", "closed_at": "2018-12-29T02:22:28Z", "merged_at": "2018-12-29T02:22:28Z", "merge_commit_sha": "a2bfcfc1b1c60dac3526364af17c2fa2f3d41a0a", "assignee": null, "milestone": null, "draft": 0, "head": "d245982aedaf7c54bf41d60ea7f0e0cf419c2b2f", "base": "eac08f0dfc61a99e8887442fc247656d419c76f8", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/392", "merged_by": null, "auto_merge": null} {"id": 247923347, "node_id": "MDExOlB1bGxSZXF1ZXN0MjQ3OTIzMzQ3", "number": 404, "state": "closed", "locked": 0, "title": "Experiment: run Jinja in async mode", "user": {"value": 9599, "label": "simonw"}, "body": "See http://jinja.pocoo.org/docs/2.10/api/#async-support\r\n\r\nTests all pass. Have not checked performance difference yet.\r\n\r\nCreating pull request to run tests in Travis. This is not ready to merge - I'm not yet sure if this is a good idea.", "created_at": "2019-01-27T00:28:44Z", "updated_at": "2019-11-12T05:02:18Z", "closed_at": "2019-11-12T05:02:13Z", "merged_at": null, "merge_commit_sha": "773bcac907d17b16eef604ad943837da39a10090", "assignee": null, "milestone": null, "draft": 0, "head": "dd7f24a47f660e2f0fc1e97a13d28908c28dc245", "base": "909cc8fbdfc9c05e447f40e9a73489809602c3cd", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/404", "merged_by": null, "auto_merge": null} {"id": 250628275, "node_id": "MDExOlB1bGxSZXF1ZXN0MjUwNjI4Mjc1", "number": 407, "state": "closed", "locked": 0, "title": "Heroku --include-vcs-ignore", "user": {"value": 9599, "label": "simonw"}, "body": "Should mean `datasette publish heroku` can work under Travis, unlike this failure:\r\n\r\nhttps://travis-ci.org/simonw/fivethirtyeight-datasette/builds/488047550\r\n\r\n```\r\n2.25s$ datasette publish heroku fivethirtyeight.db -m metadata.json -n fivethirtyeight-datasette\r\ntar: unrecognized option '--exclude-vcs-ignores'\r\nTry 'tar --help' or 'tar --usage' for more information.\r\n \u25b8 Command failed: tar cz -C /tmp/tmpuaxm7i8f --exclude-vcs-ignores --exclude\r\n \u25b8 .git --exclude .gitmodules . >\r\n \u25b8 /tmp/f49440e0-1bf3-4d3f-9eb0-fbc2967d1fd4.tar.gz\r\n \u25b8 tar: unrecognized option '--exclude-vcs-ignores'\r\n \u25b8 Try 'tar --help' or 'tar --usage' for more information.\r\n \u25b8 \r\nThe command \"datasette publish heroku fivethirtyeight.db -m metadata.json -n fivethirtyeight-datasette\" exited with 0.\r\n```\r\n\r\nThe fix for that issue is to call the heroku command like this:\r\n\r\n heroku builds:create -a app_name --include-vcs-ignore\r\n\r\n", "created_at": "2019-02-06T04:06:20Z", "updated_at": "2019-02-06T04:31:30Z", "closed_at": "2019-02-06T04:15:47Z", "merged_at": "2019-02-06T04:15:46Z", "merge_commit_sha": "195a5b36349d0d24a6bbb758cebb719b6de303b6", "assignee": null, "milestone": null, "draft": 0, "head": "01978ddb9682c828cafddaf9ca625e08ba3ba3a4", "base": "436b8bc1d17c2ab415800ab209204f94e7f7929e", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/407", "merged_by": null, "auto_merge": null} {"id": 261418285, "node_id": "MDExOlB1bGxSZXF1ZXN0MjYxNDE4Mjg1", "number": 416, "state": "closed", "locked": 0, "title": "URL hashing now optional: turn on with --config hash_urls:1 (#418)", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-03-15T04:26:06Z", "updated_at": "2019-03-17T22:55:04Z", "closed_at": "2019-03-17T22:55:04Z", "merged_at": "2019-03-17T22:55:04Z", "merge_commit_sha": "6f6d0ff2b41f1cacaf42287b1b230b646bcba9ee", "assignee": null, "milestone": null, "draft": 0, "head": "0d02a99c9665669540aebff981246d8c743072b3", "base": "afe9aa3ae03c485c5d6652741438d09445a486c1", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/416", "merged_by": null, "auto_merge": null} {"id": 269364924, "node_id": "MDExOlB1bGxSZXF1ZXN0MjY5MzY0OTI0", "number": 426, "state": "closed", "locked": 0, "title": "Upgrade to Jinja2==2.10.1", "user": {"value": 9599, "label": "simonw"}, "body": "https://nvd.nist.gov/vuln/detail/CVE-2019-10906\r\n\r\nThis is only a security issue of concern if evaluating templates from untrusted sources, which isn't something I would ever expect a Datasette user to do.", "created_at": "2019-04-10T23:03:08Z", "updated_at": "2019-04-22T21:23:22Z", "closed_at": "2019-04-10T23:13:31Z", "merged_at": "2019-04-10T23:13:31Z", "merge_commit_sha": "9cd3b44277e6a8ea9273bf659379ff0414e0b8ae", "assignee": null, "milestone": null, "draft": 0, "head": "629453383c7f911eddfc891f22c39b7d6e9661aa", "base": "78e45ead4d771007c57b307edf8fc920101f8733", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/426", "merged_by": null, "auto_merge": null} {"id": 270191084, "node_id": "MDExOlB1bGxSZXF1ZXN0MjcwMTkxMDg0", "number": 430, "state": "closed", "locked": 0, "title": "?_where= parameter on table views, closes #429", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-04-13T01:15:09Z", "updated_at": "2019-04-13T01:37:23Z", "closed_at": "2019-04-13T01:37:23Z", "merged_at": "2019-04-13T01:37:23Z", "merge_commit_sha": "bc6a9b45646610f362b4287bc4110440991aa4d6", "assignee": null, "milestone": null, "draft": 0, "head": "3ee087c7b60da7ec3e5d2f73611fc6ea99ff82fc", "base": "e11cb4c66442abca2a6b6159521a6cf4da8739c1", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/430", "merged_by": null, "auto_merge": null} {"id": 270251021, "node_id": "MDExOlB1bGxSZXF1ZXN0MjcwMjUxMDIx", "number": 432, "state": "closed", "locked": 0, "title": "Refactor facets to a class and new plugin, refs #427", "user": {"value": 9599, "label": "simonw"}, "body": "WIP for #427", "created_at": "2019-04-13T20:04:45Z", "updated_at": "2019-05-03T00:04:24Z", "closed_at": "2019-05-03T00:04:24Z", "merged_at": null, "merge_commit_sha": "b78bc19269ed83b054a60c79c4fe08f4ca943942", "assignee": null, "milestone": null, "draft": 0, "head": "5c198f7ca5d2aff49180820271ba8d06b79aefb1", "base": "9c77e6e355ec718d76178a7607721d10a66b6aef", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/432", "merged_by": null, "auto_merge": null} {"id": 275558612, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc1NTU4NjEy", "number": 445, "state": "closed", "locked": 0, "title": "Extract facet code out into a new plugin hook, closes #427", "user": {"value": 9599, "label": "simonw"}, "body": "Datasette previously only supported one type of faceting: exact column value counting.\r\n\r\nWith this change, faceting logic is extracted out into one or more separate classes which can implement other patterns of faceting - this is discussed in #427, but potential upcoming facet types include facet-by-date, facet-by-JSON-array, facet-by-many-2-many and more.\r\n\r\nA new plugin hook, register_facet_classes, can be used by plugins to add in additional facet classes.\r\n\r\nEach class must implement two methods: suggest(), which scans columns in the table to decide if they might be worth suggesting for faceting, and facet_results(), which executes the facet operation and returns results ready to be displayed in the UI.", "created_at": "2019-05-03T00:02:41Z", "updated_at": "2019-05-03T18:17:18Z", "closed_at": "2019-05-03T00:11:27Z", "merged_at": "2019-05-03T00:11:27Z", "merge_commit_sha": "ea66c45df96479ef66a89caa71fff1a97a862646", "assignee": null, "milestone": null, "draft": 0, "head": "1b47d4d8736627c260eb4e8303e552b0e9620a01", "base": "efc93b8ab5a21e3802f75f08d5e41409f5684b5d", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/445", "merged_by": null, "auto_merge": null} {"id": 275801463, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc1ODAxNDYz", "number": 447, "state": "closed", "locked": 0, "title": "Use dist: xenial and python: 3.7 on Travis", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-05-03T18:07:07Z", "updated_at": "2019-05-03T18:17:05Z", "closed_at": "2019-05-03T18:16:53Z", "merged_at": "2019-05-03T18:16:53Z", "merge_commit_sha": "553314dcd699a84aa7cc806377150ca0d57a6024", "assignee": null, "milestone": null, "draft": 0, "head": "cd22e389d09b4fd5ed28205ba38a20faf1ed14f1", "base": "01b3de5b66742f0f661183e9e2ef66be3600e831", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/447", "merged_by": null, "auto_merge": null} {"id": 275861559, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc1ODYxNTU5", "number": 449, "state": "closed", "locked": 0, "title": "Apply black to everything", "user": {"value": 9599, "label": "simonw"}, "body": "I've been hesitating on this for literally months, because I'm not at all excited about the giant diff that will result. But I've been using black on many of my other projects (most actively [sqlite-utils](https://github.com/simonw/sqlite-utils)) and the productivity boost is undeniable: I don't have to spend a single second thinking about code formatting any more!\r\n\r\nSo it's worth swallowing the one-off pain and moving on in a new, black-enabled world.", "created_at": "2019-05-03T21:57:26Z", "updated_at": "2019-05-04T02:17:14Z", "closed_at": "2019-05-04T02:15:15Z", "merged_at": "2019-05-04T02:15:15Z", "merge_commit_sha": "35d6ee2790e41e96f243c1ff58be0c9c0519a8ce", "assignee": null, "milestone": null, "draft": 0, "head": "9683aeb2394a4b7e44499b8a0240af3baafda832", "base": "66c87cee0c7344c7877373c60b180c766c206101", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/449", "merged_by": null, "auto_merge": null} {"id": 284390197, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjg0MzkwMTk3", "number": 497, "state": "closed", "locked": 0, "title": "Upgrade pytest to 4.6.1", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-06-03T01:45:34Z", "updated_at": "2019-06-03T02:06:32Z", "closed_at": "2019-06-03T02:06:27Z", "merged_at": "2019-06-03T02:06:27Z", "merge_commit_sha": "5e8fbf7f6fbc0b63d0479da3806dd9ccd6aaa945", "assignee": null, "milestone": null, "draft": 0, "head": "bf2ab0306e6d3ce7524fecf015e2cec7ae45e994", "base": "803f750309bf0cd5b7501228c1efcf9a35686d74", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/497", "merged_by": null, "auto_merge": null} {"id": 285698310, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjg1Njk4MzEw", "number": 501, "state": "closed", "locked": 0, "title": "Test against Python 3.8-dev using Travis", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-06-06T08:37:53Z", "updated_at": "2019-11-11T03:23:29Z", "closed_at": "2019-11-11T03:23:29Z", "merged_at": null, "merge_commit_sha": "1aac0cf0ab962060dd5cff19b8b179bb7fa0f00b", "assignee": null, "milestone": null, "draft": 0, "head": "a5defb684fcc734f6325ca08beef9f49c3e7a298", "base": "5e8fbf7f6fbc0b63d0479da3806dd9ccd6aaa945", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/501", "merged_by": null, "auto_merge": null} {"id": 290897104, "node_id": "MDExOlB1bGxSZXF1ZXN0MjkwODk3MTA0", "number": 518, "state": "closed", "locked": 0, "title": "Port Datasette from Sanic to ASGI + Uvicorn", "user": {"value": 9599, "label": "simonw"}, "body": "Most of the code here was fleshed out in comments on #272 (Port Datasette to ASGI) - this pull request will track the final pieces:\r\n\r\n- [x] Update test harness to more correctly simulate the `raw_path` issue\r\n- [x] Use `raw_path` so table names containing `/` can work correctly\r\n- [x] Bug: JSON not served with correct content-type\r\n- [x] Get ?_trace=1 working again\r\n- [x] Replacement for `@app.listener(\"before_server_start\")`\r\n- [x] Bug: `/fixtures/table%2Fwith%2Fslashes.csv?_format=json` downloads as CSV\r\n- [x] Replace Sanic request and response objects with my own classes, so I can remove Sanic dependency\r\n- [x] Final code tidy-up before merging to master", "created_at": "2019-06-23T15:18:42Z", "updated_at": "2019-06-24T13:42:50Z", "closed_at": "2019-06-24T03:13:09Z", "merged_at": "2019-06-24T03:13:09Z", "merge_commit_sha": "ba8db9679f3bd2454c9e76e7e6c352126848b57a", "assignee": {"value": 9599, "label": "simonw"}, "milestone": {"value": 3268330, "label": "Datasette 1.0"}, "draft": 0, "head": "b794554a26ddc81bd772c4422d80d5ee863e92b0", "base": "35429f90894321eda7f2db31b9ea7976f31f73ac", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/518", "merged_by": null, "auto_merge": null} {"id": 290971295, "node_id": "MDExOlB1bGxSZXF1ZXN0MjkwOTcxMjk1", "number": 524, "state": "open", "locked": 0, "title": "Sort commits using isort, refs #516", "user": {"value": 9599, "label": "simonw"}, "body": "Also added a lint unit test to ensure they stay sorted. #516", "created_at": "2019-06-24T05:04:48Z", "updated_at": "2019-06-24T05:45:00Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "4e92ebe00a058e02b2d7543cff60ac2f78aa97c7", "assignee": null, "milestone": null, "draft": 0, "head": "dafae70ee7f74ce79b541a94385172be3ad0de83", "base": "cdd24f3eaa207f67d948c1876725b0f84654a623", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/524", "merged_by": null, "auto_merge": null} {"id": 293962405, "node_id": "MDExOlB1bGxSZXF1ZXN0MjkzOTYyNDA1", "number": 533, "state": "closed", "locked": 0, "title": "Support cleaner custom templates for rows and tables, closes #521", "user": {"value": 9599, "label": "simonw"}, "body": "- [x] Rename `_rows_and_columns.html` to `_table.html`\r\n- [x] Unit test\r\n- [x] Documentation", "created_at": "2019-07-03T00:40:18Z", "updated_at": "2019-07-03T03:23:06Z", "closed_at": "2019-07-03T03:23:06Z", "merged_at": "2019-07-03T03:23:06Z", "merge_commit_sha": "b9ede4c1898616512b5d204f9c941deff473cbe4", "assignee": null, "milestone": null, "draft": 0, "head": "1add905532b7bc4f681318b8f22b9b74cca2b2a0", "base": "76882830548e16905348ee75acb0044cb8e1fd20", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/533", "merged_by": null, "auto_merge": null} {"id": 293992382, "node_id": "MDExOlB1bGxSZXF1ZXN0MjkzOTkyMzgy", "number": 535, "state": "closed", "locked": 0, "title": "Added asgi_wrapper plugin hook, closes #520", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-07-03T03:58:00Z", "updated_at": "2019-07-03T04:06:26Z", "closed_at": "2019-07-03T04:06:26Z", "merged_at": "2019-07-03T04:06:26Z", "merge_commit_sha": "4d2fdafe39159c9a8aa83f7e9bfe768bbbbb56a3", "assignee": null, "milestone": null, "draft": 0, "head": "93bfa26bfd25a3cc911d637596e364d3474325bd", "base": "b9ede4c1898616512b5d204f9c941deff473cbe4", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/535", "merged_by": null, "auto_merge": null} {"id": 293994443, "node_id": "MDExOlB1bGxSZXF1ZXN0MjkzOTk0NDQz", "number": 536, "state": "closed", "locked": 0, "title": "Switch to ~= dependencies, closes #532", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-07-03T04:12:16Z", "updated_at": "2019-07-03T04:32:55Z", "closed_at": "2019-07-03T04:32:55Z", "merged_at": "2019-07-03T04:32:55Z", "merge_commit_sha": "f0d32da0a9af87bcb15e34e35424f0c0053be83a", "assignee": null, "milestone": null, "draft": 0, "head": "391d109dc3f9230dc4ee4afd20041e480e90e739", "base": "4d2fdafe39159c9a8aa83f7e9bfe768bbbbb56a3", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/536", "merged_by": null, "auto_merge": null} {"id": 294400446, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjk0NDAwNDQ2", "number": 539, "state": "closed", "locked": 0, "title": "Secret plugin configuration options", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #538 ", "created_at": "2019-07-04T03:21:20Z", "updated_at": "2019-07-04T05:36:45Z", "closed_at": "2019-07-04T05:36:45Z", "merged_at": "2019-07-04T05:36:45Z", "merge_commit_sha": "a2d45931935f6bb73605a94afedf9e78308c95d6", "assignee": null, "milestone": null, "draft": 0, "head": "fd6164b03ebe450a9a00df2e5be2dc7bbfbd9a3f", "base": "f0d32da0a9af87bcb15e34e35424f0c0053be83a", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/539", "merged_by": null, "auto_merge": null} {"id": 294992578, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjk0OTkyNTc4", "number": 542, "state": "closed", "locked": 0, "title": "extra_template_vars plugin hook", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #541", "created_at": "2019-07-05T22:19:17Z", "updated_at": "2019-07-06T00:05:57Z", "closed_at": "2019-07-06T00:05:56Z", "merged_at": "2019-07-06T00:05:56Z", "merge_commit_sha": "fcfcae21e67cc15090942b1d2a47b5f016279337", "assignee": null, "milestone": null, "draft": 0, "head": "e81c7abb40c8ecf8d9d23cbcdde045e0a3b4ab14", "base": "a18e0964ecd04593f227616538a80dee08768057", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/542", "merged_by": null, "auto_merge": null} {"id": 295065796, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjk1MDY1Nzk2", "number": 544, "state": "closed", "locked": 0, "title": "--plugin-secret option", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #543\r\n\r\n- [x] Zeit Now v1 support\r\n- [x] Solve escaping of ENV in Dockerfile\r\n- [x] Heroku support\r\n- [x] Unit tests\r\n- [x] Cloud Run support\r\n- [x] Documentation\r\n", "created_at": "2019-07-06T22:18:20Z", "updated_at": "2019-07-08T02:06:31Z", "closed_at": "2019-07-08T02:06:31Z", "merged_at": "2019-07-08T02:06:31Z", "merge_commit_sha": "973f8f139df6ad425354711052cfc2256de2e522", "assignee": null, "milestone": {"value": 4471010, "label": "Datasette 0.29"}, "draft": 0, "head": "ccf80604e931fba1893b5bab11de386fed82009e", "base": "fcfcae21e67cc15090942b1d2a47b5f016279337", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/544", "merged_by": null, "auto_merge": null} {"id": 295127213, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjk1MTI3MjEz", "number": 546, "state": "open", "locked": 0, "title": "Facet by delimiter", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #510", "created_at": "2019-07-07T20:06:05Z", "updated_at": "2019-11-18T23:46:01Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "68a6fb1a576a747b868771d00a10753f35aaa0cf", "assignee": null, "milestone": null, "draft": 0, "head": "47ac6c6e46da16716d295d7cda8f79cd0663ca5e", "base": "a9909c29ccac771c23c2ef22b89d10697b5256b9", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/546", "merged_by": null, "auto_merge": null} {"id": 296735320, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjk2NzM1MzIw", "number": 557, "state": "closed", "locked": 0, "title": "Get tests running on Windows using Travis CI", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #511", "created_at": "2019-07-11T16:36:57Z", "updated_at": "2021-07-10T23:39:48Z", "closed_at": "2021-07-10T23:39:48Z", "merged_at": null, "merge_commit_sha": "cddb9a9fecfa25147d80df05f1a6d6e1686ca30d", "assignee": null, "milestone": null, "draft": 0, "head": "47b5ab43be87217c4e40ad93b8aa2e9639fa371f", "base": "f2006cca80040871439055ae6ccbc14e589bdf4b", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/557", "merged_by": null, "auto_merge": null}