{"id": 152360740, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUyMzYwNzQw", "number": 81, "state": "closed", "locked": 0, "title": ":fire: Removes DS_Store", "user": {"value": 50527, "label": "jefftriplett"}, "body": "", "created_at": "2017-11-13T22:07:52Z", "updated_at": "2017-11-14T02:24:54Z", "closed_at": "2017-11-13T22:16:55Z", "merged_at": "2017-11-13T22:16:55Z", "merge_commit_sha": "06a826c3188af82f27bb6b4e09cc89b782d30bd6", "assignee": null, "milestone": null, "draft": 0, "head": "c66d297eac556a7f4fd4dcdb15cfb9466fddac77", "base": "d75f423b6fcfc074b7c6f8f7679da8876f181edd", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/81", "merged_by": null, "auto_merge": null} {"id": 152522762, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUyNTIyNzYy", "number": 89, "state": "closed", "locked": 0, "title": "SQL syntax highlighting with CodeMirror", "user": {"value": 15543, "label": "tomdyson"}, "body": "Addresses #13 \r\n\r\nFuture enhancements could include autocompletion of table and column names, e.g. with\r\n\r\n```javascript\r\nextraKeys: {\"Ctrl-Space\": \"autocomplete\"},\r\nhintOptions: {tables: {\r\n users: [\"name\", \"score\", \"birthDate\"],\r\n countries: [\"name\", \"population\", \"size\"]\r\n }}\r\n```\r\n\r\n(see https://codemirror.net/doc/manual.html#addon_sql-hint and source at http://codemirror.net/mode/sql/)", "created_at": "2017-11-14T14:43:33Z", "updated_at": "2017-11-15T02:03:01Z", "closed_at": "2017-11-15T02:03:01Z", "merged_at": "2017-11-15T02:03:01Z", "merge_commit_sha": "8252daa4c14d73b4b69e3f2db4576bb39d73c070", "assignee": null, "milestone": null, "draft": 0, "head": "7f6ad095e9c41bf24d73b7724d898965c419965b", "base": "075d422c0a1c70259188dfbd940538c67419694a", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/89", "merged_by": null, "auto_merge": null} {"id": 152631570, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUyNjMxNTcw", "number": 94, "state": "closed", "locked": 0, "title": "Initial add simple prod ready Dockerfile refs #57", "user": {"value": 247192, "label": "macropin"}, "body": "Multi-stage build based off official python:3.6-slim\r\n\r\nExample usage:\r\n```\r\ndocker run --rm -t -i -p 9000:8001 -v $(pwd)/db:/db datasette datasette serve /db/chinook.db\r\n```", "created_at": "2017-11-14T22:09:09Z", "updated_at": "2017-11-15T03:08:04Z", "closed_at": "2017-11-15T03:08:04Z", "merged_at": "2017-11-15T03:08:04Z", "merge_commit_sha": "86755503d26b4a83c2ec59f08ec1b8de791fd954", "assignee": null, "milestone": null, "draft": 0, "head": "147195c2fdfa2b984d8f9fc1c6cab6634970a056", "base": "075d422c0a1c70259188dfbd940538c67419694a", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/94", "merged_by": null, "auto_merge": null} {"id": 152870030, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUyODcwMDMw", "number": 104, "state": "closed", "locked": 0, "title": "[WIP] Add publish to heroku support", "user": {"value": 21148, "label": "jacobian"}, "body": "\r\n\r\nRefs #90 ", "created_at": "2017-11-15T19:56:22Z", "updated_at": "2017-11-21T20:55:05Z", "closed_at": "2017-11-21T20:55:05Z", "merged_at": "2017-11-21T20:55:05Z", "merge_commit_sha": "e47117ce1d15f11246a3120aa49de70205713d05", "assignee": null, "milestone": null, "draft": 0, "head": "de42240afd1e3829fd21cbe77a89ab0eaab20d78", "base": "0331666e346c68b86de4aa19fbb37f3a408d37ca", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/104", "merged_by": null, "auto_merge": null} {"id": 152914480, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUyOTE0NDgw", "number": 107, "state": "closed", "locked": 0, "title": "add support for ?field__isnull=1", "user": {"value": 3433657, "label": "raynae"}, "body": "Is this what you had in mind for [this issue](https://github.com/simonw/datasette/issues/64)?", "created_at": "2017-11-15T23:36:36Z", "updated_at": "2017-11-17T15:12:29Z", "closed_at": "2017-11-17T13:29:22Z", "merged_at": "2017-11-17T13:29:22Z", "merge_commit_sha": "ed2b3f25beac720f14869350baacc5f62b065194", "assignee": null, "milestone": null, "draft": 0, "head": "14d5bb572fadbd45973580bd9ad2a16c2bf12909", "base": "b7c4165346ee8b6a6fbd72d6ba2275a24a8a8ae3", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/107", "merged_by": null, "auto_merge": null} {"id": 153201945, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUzMjAxOTQ1", "number": 114, "state": "closed", "locked": 0, "title": "Add spatialite, switch to debian and local build", "user": {"value": 54999, "label": "ingenieroariel"}, "body": "Improves the Dockerfile to support spatial datasets, work with the local datasette code (Friendly with git tags and Dockerhub) and moves to slim debian, a small image easy to extend via apt packages for sqlite.", "created_at": "2017-11-17T02:37:09Z", "updated_at": "2017-11-17T03:50:52Z", "closed_at": "2017-11-17T03:50:52Z", "merged_at": "2017-11-17T03:50:52Z", "merge_commit_sha": "8b4c600d98b85655b3a1454ebf64f858b5fe54c8", "assignee": null, "milestone": null, "draft": 0, "head": "6c6b63d890529eeefcefb7ab126ea3bd7b2315c1", "base": "b7c4165346ee8b6a6fbd72d6ba2275a24a8a8ae3", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/114", "merged_by": null, "auto_merge": null} {"id": 153306882, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUzMzA2ODgy", "number": 115, "state": "closed", "locked": 0, "title": "Add keyboard shortcut to execute SQL query", "user": {"value": 198537, "label": "rgieseke"}, "body": "Very cool tool, thanks a lot!\r\n\r\nThis PR adds a `Shift-Enter` short cut to execute the SQL query. I used CodeMirrors keyboard handling.", "created_at": "2017-11-17T14:13:33Z", "updated_at": "2017-11-17T15:16:34Z", "closed_at": "2017-11-17T14:22:56Z", "merged_at": "2017-11-17T14:22:56Z", "merge_commit_sha": "eda848b37f8452dba7913583ef101f39d9b130ba", "assignee": null, "milestone": null, "draft": 0, "head": "bb514164e69400fc0be4e033c27f45f90b1ef651", "base": "ed2b3f25beac720f14869350baacc5f62b065194", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/115", "merged_by": null, "auto_merge": null} {"id": 153324301, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUzMzI0MzAx", "number": 117, "state": "closed", "locked": 0, "title": "Don't prevent tabbing to `Run SQL` button", "user": {"value": 198537, "label": "rgieseke"}, "body": "Mentioned in #115 \r\n\r\nHere you go!", "created_at": "2017-11-17T15:27:50Z", "updated_at": "2017-11-19T20:30:24Z", "closed_at": "2017-11-18T00:53:43Z", "merged_at": "2017-11-18T00:53:43Z", "merge_commit_sha": "6d39429daa4655e3cf7a6a7671493292a20a30a1", "assignee": null, "milestone": null, "draft": 0, "head": "7b4d00e87ed8ac931e6f5458599aece1a95d4e82", "base": "eda848b37f8452dba7913583ef101f39d9b130ba", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/117", "merged_by": null, "auto_merge": null} {"id": 161982711, "node_id": "MDExOlB1bGxSZXF1ZXN0MTYxOTgyNzEx", "number": 178, "state": "closed", "locked": 0, "title": "If metadata exists, add it to heroku launch command", "user": {"value": 82988, "label": "psychemedia"}, "body": "The heroku build does seem to make use of any provided `metadata.json` file.\r\n\r\nAdd the `--metadata` switch to the Heroku web launch command if a `metadata.json` file is available.\r\n\r\nAddresses: https://github.com/simonw/datasette/issues/177", "created_at": "2018-01-09T21:42:21Z", "updated_at": "2018-01-15T09:42:46Z", "closed_at": "2018-01-14T21:05:16Z", "merged_at": "2018-01-14T21:05:16Z", "merge_commit_sha": "3a56a2cd7eea5d477d5d936b01098be5cba0d98e", "assignee": null, "milestone": null, "draft": 0, "head": "1bc9ed98c4f4fd91b70560ac8f507a2fddbd8317", "base": "306e1c6ac4f00cc25d676a6ee660938f5b27427c", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/178", "merged_by": null, "auto_merge": null} {"id": 163523976, "node_id": "MDExOlB1bGxSZXF1ZXN0MTYzNTIzOTc2", "number": 180, "state": "closed", "locked": 0, "title": "make html title more readable in query template", "user": {"value": 56477, "label": "ryanpitts"}, "body": "tiny tweak to make this easier to visually parse\u2014I think it matches your style in other templates", "created_at": "2018-01-17T18:56:03Z", "updated_at": "2018-04-03T16:03:38Z", "closed_at": "2018-04-03T15:24:05Z", "merged_at": "2018-04-03T15:24:05Z", "merge_commit_sha": "446d47fdb005b3776bc06ad8d1f44b01fc2e938b", "assignee": null, "milestone": null, "draft": 0, "head": "dc900b2f587c839e97389aaca70140fb06b4d40b", "base": "56623e48da5412b25fb39cc26b9c743b684dd968", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/180", "merged_by": null, "auto_merge": null} {"id": 165029807, "node_id": "MDExOlB1bGxSZXF1ZXN0MTY1MDI5ODA3", "number": 182, "state": "closed", "locked": 0, "title": "Add db filesize next to download link", "user": {"value": 3433657, "label": "raynae"}, "body": "Took a stab at #172, will this do the trick?", "created_at": "2018-01-25T04:58:56Z", "updated_at": "2019-03-22T13:50:57Z", "closed_at": "2019-02-06T04:59:38Z", "merged_at": null, "merge_commit_sha": "a8d9e69872dec9a551b25cd609ffdbf3896045bd", "assignee": null, "milestone": null, "draft": 0, "head": "b62835205a830472abb66c708822c2dcdf4ab027", "base": "56623e48da5412b25fb39cc26b9c743b684dd968", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/182", "merged_by": null, "auto_merge": null} {"id": 181033024, "node_id": "MDExOlB1bGxSZXF1ZXN0MTgxMDMzMDI0", "number": 200, "state": "closed", "locked": 0, "title": "Hide Spatialite system tables", "user": {"value": 45057, "label": "russss"}, "body": "They were getting on my nerves.", "created_at": "2018-04-11T21:26:58Z", "updated_at": "2018-04-12T21:34:48Z", "closed_at": "2018-04-12T21:34:48Z", "merged_at": "2018-04-12T21:34:48Z", "merge_commit_sha": "d08a13314081ae2ce0313a17d3c07c1a7f2d94d5", "assignee": null, "milestone": null, "draft": 0, "head": "765b5d677154c633b91e3e826dfffc53b7c4b5d3", "base": "bfb4e45a7bcb880758dbc18f66258de26c1d1904", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/200", "merged_by": null, "auto_merge": null} {"id": 181247568, "node_id": "MDExOlB1bGxSZXF1ZXN0MTgxMjQ3NTY4", "number": 202, "state": "closed", "locked": 0, "title": "Raise 404 on nonexistent table URLs", "user": {"value": 45057, "label": "russss"}, "body": "Currently they just 500. Also cleaned the logic up a bit, I hope I didn't miss anything.\r\n\r\nThis is issue #184.", "created_at": "2018-04-12T15:47:06Z", "updated_at": "2018-04-13T19:22:56Z", "closed_at": "2018-04-13T18:19:15Z", "merged_at": null, "merge_commit_sha": "134150933ade84327cfd97a88d536f5bff37a136", "assignee": null, "milestone": null, "draft": 0, "head": "71bbf4e4be8a9ab7bcc4ddfb33760c7d902f4a34", "base": "bfb4e45a7bcb880758dbc18f66258de26c1d1904", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/202", "merged_by": null, "auto_merge": null} {"id": 181600926, "node_id": "MDExOlB1bGxSZXF1ZXN0MTgxNjAwOTI2", "number": 204, "state": "closed", "locked": 0, "title": "Initial units support", "user": {"value": 45057, "label": "russss"}, "body": "Add support for specifying units for a column in metadata.json and rendering them on display using [pint](https://pint.readthedocs.io/en/latest/).\r\n\r\nExample table metadata:\r\n```json\r\n \"license_frequency\": {\r\n \"units\": {\r\n \"frequency\": \"Hz\",\r\n \"channel_width\": \"Hz\",\r\n \"height\": \"m\",\r\n \"antenna_height\": \"m\",\r\n \"azimuth\": \"degrees\"\r\n }\r\n }\r\n```\r\n\r\n[Example result](https://wtr-api.herokuapp.com/wtr-663ea99/license_frequency/1)\r\n\r\nThis works surprisingly well! I'd like to add support for using units when querying but this is PR is pretty usable as-is.\r\n\r\n(Pint doesn't seem to support decibels though - it thinks they're decibytes - which is an annoying omission.)\r\n\r\n(ref ticket #203)", "created_at": "2018-04-13T21:32:49Z", "updated_at": "2018-04-14T09:44:33Z", "closed_at": "2018-04-14T03:32:54Z", "merged_at": "2018-04-14T03:32:54Z", "merge_commit_sha": "ec6abc81e433c9bac1b9f085111785fc227e9e34", "assignee": null, "milestone": null, "draft": 0, "head": "67c20a98a0cbb59a10247a49320c2feb7d0b1b41", "base": "fb988ace7c7e2bee5ac142a0eab22431d0675a77", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/204", "merged_by": null, "auto_merge": null} {"id": 181642114, "node_id": "MDExOlB1bGxSZXF1ZXN0MTgxNjQyMTE0", "number": 205, "state": "closed", "locked": 0, "title": "Support filtering with units and more", "user": {"value": 45057, "label": "russss"}, "body": "The first commit:\r\n* Adds units to exported JSON\r\n* Adds units key to metadata skeleton\r\n* Adds some docs for units\r\n\r\nThe second commit adds filtering by units by the first method I mentioned in #203:\r\n![image](https://user-images.githubusercontent.com/45057/38767463-7193be16-3fd9-11e8-8a5f-ac4159415c6d.png)\r\n\r\n[Try it here](https://wtr-api.herokuapp.com/wtr-663ea99/license_frequency?frequency__gt=50GHz&height__lt=50ft). I think it integrates pretty neatly.\r\n\r\nThe third commit adds support for registering custom units with Pint from metadata.json. Probably pretty niche, but I need decibels!", "created_at": "2018-04-14T10:47:51Z", "updated_at": "2018-04-14T15:24:04Z", "closed_at": "2018-04-14T15:24:04Z", "merged_at": null, "merge_commit_sha": "ed059c70e87a2930206652621e23a55167aa57c1", "assignee": null, "milestone": null, "draft": 0, "head": "eb3a37c34813ecbbfdae015305fec1f2a4ec27a5", "base": "6b15a53cd3cd40880a5e2d38827d5fac10e4bb5f", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/205", "merged_by": null, "auto_merge": null} {"id": 181644805, "node_id": "MDExOlB1bGxSZXF1ZXN0MTgxNjQ0ODA1", "number": 206, "state": "closed", "locked": 0, "title": "Fix sqlite error when loading rows with no incoming FKs", "user": {"value": 45057, "label": "russss"}, "body": "This fixes `ERROR: conn=, sql\r\n= 'select ', params = {'id': '1'}` caused by an invalid query loading incoming FKs when none exist.\r\n\r\nThe error was ignored due to async but it still got printed to the console.", "created_at": "2018-04-14T12:08:17Z", "updated_at": "2018-04-14T14:32:42Z", "closed_at": "2018-04-14T14:24:25Z", "merged_at": "2018-04-14T14:24:25Z", "merge_commit_sha": "1cc5161089e559c8b16049b20f7a5b3a43290c21", "assignee": null, "milestone": null, "draft": 0, "head": "93b038e2469bee07d36ae8a943aab8b9d8610c1d", "base": "ec6abc81e433c9bac1b9f085111785fc227e9e34", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/206", "merged_by": null, "auto_merge": null} {"id": 181647717, "node_id": "MDExOlB1bGxSZXF1ZXN0MTgxNjQ3NzE3", "number": 207, "state": "closed", "locked": 0, "title": "Link foreign keys which don't have labels", "user": {"value": 45057, "label": "russss"}, "body": "This renders unlabeled FKs as simple links. I can't see why this would cause any major problems.\r\n\r\n![image](https://user-images.githubusercontent.com/45057/38768722-ea15a000-3fef-11e8-8664-ffd7aa4894ea.png)\r\n\r\nAlso includes bonus fixes for two minor issues:\r\n\r\n* In foreign key link hrefs the primary key was escaped using HTML escaping rather than URL escaping. This broke some non-integer PKs.\r\n* Print tracebacks to console when handling 500 errors.", "created_at": "2018-04-14T13:27:14Z", "updated_at": "2018-04-14T15:00:00Z", "closed_at": "2018-04-14T15:00:00Z", "merged_at": "2018-04-14T15:00:00Z", "merge_commit_sha": "f2b940d6026677f6859d46a4f16fa402745d261d", "assignee": null, "milestone": null, "draft": 0, "head": "d9858672da8f74e5530deead140e2e633e1c2627", "base": "ec6abc81e433c9bac1b9f085111785fc227e9e34", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/207", "merged_by": null, "auto_merge": null} {"id": 181654839, "node_id": "MDExOlB1bGxSZXF1ZXN0MTgxNjU0ODM5", "number": 208, "state": "closed", "locked": 0, "title": "Return HTTP 405 on InvalidUsage rather than 500", "user": {"value": 45057, "label": "russss"}, "body": "This also stops it filling up the logs. This happens for HEAD requests at the moment - which perhaps should be handled better, but that's a different issue.", "created_at": "2018-04-14T16:12:50Z", "updated_at": "2018-04-14T18:00:39Z", "closed_at": "2018-04-14T18:00:39Z", "merged_at": "2018-04-14T18:00:39Z", "merge_commit_sha": "efbb4e83374a2c795e436c72fa79f70da72309b8", "assignee": null, "milestone": null, "draft": 0, "head": "20e5fcf827046adf76968d0e58f47e0b7d9271c3", "base": "8d394586f55bc4b8ab70476968d08fb6ec8339e5", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/208", "merged_by": null, "auto_merge": null} {"id": 181723303, "node_id": "MDExOlB1bGxSZXF1ZXN0MTgxNzIzMzAz", "number": 209, "state": "closed", "locked": 0, "title": " Don't duplicate simple primary keys in the link column", "user": {"value": 45057, "label": "russss"}, "body": "When there's a simple (single-column) primary key, it looks weird to duplicate it in the link column.\r\n\r\nThis change removes the second PK column and treats the link column as if it were the PK column from a header/sorting perspective. \r\n\r\nThis might make it a bit more difficult to tell what the link for the row is, I'm not sure yet. I feel like the alternative is to change the link column to just have the text \"view\" or something, instead of repeating the PK. (I doubt it makes much more sense with compound PKs.)\r\n\r\nBonus change in this PR: fix urlencoding of links in the displayed HTML.\r\n\r\nBefore:\r\n![image](https://user-images.githubusercontent.com/45057/38783830-e2ababb4-40ff-11e8-97fb-25e286a8c920.png)\r\n\r\nAfter:\r\n![image](https://user-images.githubusercontent.com/45057/38783835-ebf6b48e-40ff-11e8-8c47-6a864cf21ccc.png)", "created_at": "2018-04-15T21:56:15Z", "updated_at": "2018-04-18T08:40:37Z", "closed_at": "2018-04-18T01:13:04Z", "merged_at": "2018-04-18T01:13:04Z", "merge_commit_sha": "136a70d88741e2a5892c3de437064a9d14494d66", "assignee": null, "milestone": null, "draft": 0, "head": "4acde4e187795214af6fc86f46af48982ec5de46", "base": "bf5ec2d61148f9852441934dd206b3b1c07a512f", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/209", "merged_by": null, "auto_merge": null} {"id": 183135604, "node_id": "MDExOlB1bGxSZXF1ZXN0MTgzMTM1NjA0", "number": 232, "state": "closed", "locked": 0, "title": "Fix a typo", "user": {"value": 45281, "label": "lsb"}, "body": "It looks like this was the only instance of it: https://github.com/simonw/datasette/search?utf8=%E2%9C%93&q=SOLite&type=", "created_at": "2018-04-20T18:20:04Z", "updated_at": "2018-04-21T00:19:08Z", "closed_at": "2018-04-21T00:19:08Z", "merged_at": "2018-04-21T00:19:08Z", "merge_commit_sha": "a971718d2a5e1b61b5e5c27b0ef6c4ec65616e35", "assignee": null, "milestone": null, "draft": 0, "head": "b0f0f16a1c1f48aba62dfa30fa039dc6d3c07802", "base": "3a5d7951ce8f35118ffdd7f8d86e09b909e1218c", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/232", "merged_by": null, "auto_merge": null} {"id": 189318453, "node_id": "MDExOlB1bGxSZXF1ZXN0MTg5MzE4NDUz", "number": 277, "state": "closed", "locked": 0, "title": "Refactor inspect logic", "user": {"value": 45057, "label": "russss"}, "body": "This pulls the logic for inspect out into a new file which makes it a bit easier to understand.\r\n\r\nThis was going to be the first part of an implementation for #276, but it seems like that might take a while so I'm going to PR a few bits of refactoring individually.", "created_at": "2018-05-21T08:49:31Z", "updated_at": "2018-05-22T16:07:24Z", "closed_at": "2018-05-22T14:03:07Z", "merged_at": "2018-05-22T14:03:07Z", "merge_commit_sha": "58b5a37dbbf13868a46bcbb284509434e66eca25", "assignee": null, "milestone": null, "draft": 0, "head": "0b81e047ad27b67ba17e8c176e38a94cf4548115", "base": "d59366d36e95b973d674e62edff0168d5bdd90eb", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/277", "merged_by": null, "auto_merge": null} {"id": 189707374, "node_id": "MDExOlB1bGxSZXF1ZXN0MTg5NzA3Mzc0", "number": 279, "state": "closed", "locked": 0, "title": "Add version number support with Versioneer", "user": {"value": 198537, "label": "rgieseke"}, "body": "I think that's all for getting Versioneer support, I've been happily using it in a couple of projects ... \r\n\r\n```\r\nIn [2]: datasette.__version__\r\nOut[2]: '0.22+3.g6e12445'\r\n```\r\nRepo:\r\nhttps://github.com/warner/python-versioneer\r\n\r\nVersioneer Licence:\r\nPublic Domain (CC0-1.0)\r\n\r\nCloses #273\r\n", "created_at": "2018-05-22T15:39:45Z", "updated_at": "2018-05-22T19:35:23Z", "closed_at": "2018-05-22T19:35:22Z", "merged_at": "2018-05-22T19:35:22Z", "merge_commit_sha": "49f317752cfe89c5641165a490eef49e025752a7", "assignee": null, "milestone": null, "draft": 0, "head": "d0d19453e8623cc98a2baa2cadaaff4cd2fee973", "base": "58b5a37dbbf13868a46bcbb284509434e66eca25", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/279", "merged_by": null, "auto_merge": null} {"id": 189723716, "node_id": "MDExOlB1bGxSZXF1ZXN0MTg5NzIzNzE2", "number": 280, "state": "closed", "locked": 0, "title": "Build Dockerfile with recent Sqlite + Spatialite", "user": {"value": 565628, "label": "r4vi"}, "body": "This solves #278 without bloating the Dockerfile too much, the image size is now\r\n495MB (original was ~240MB) but it could be reduced significantly if we only\r\ncopied the output of the compilation of spatialite and friends to\r\n/usr/local/lib, instead of the entirety of it however that will take more time.\r\n\r\nIn the python code change references to `import sqlite3` to `import pysqlite3`\r\nand it should use the compiled version of sqlite3.23.1. You don't need to\r\ntry/except because pysqlite3 falls back to builtin sqlite3 if there is no\r\ncompiled version.\r\n\r\n```bash\r\n $ docker run --rm -it datasette spatialite\r\n SpatiaLite version ..: 4.4.0-RC0\tSupported Extensions:\r\n - 'VirtualShape'\t[direct Shapefile access]\r\n - 'VirtualDbf'\t\t[direct DBF access]\r\n - 'VirtualXL'\t\t[direct XLS access]\r\n - 'VirtualText'\t\t[direct CSV/TXT access]\r\n - 'VirtualNetwork'\t[Dijkstra shortest path]\r\n - 'RTree'\t\t[Spatial Index - R*Tree]\r\n - 'MbrCache'\t\t[Spatial Index - MBR cache]\r\n - 'VirtualSpatialIndex'\t[R*Tree metahandler]\r\n - 'VirtualElementary'\t[ElemGeoms metahandler]\r\n - 'VirtualKNN'\t[K-Nearest Neighbors metahandler]\r\n - 'VirtualXPath'\t[XML Path Language - XPath]\r\n - 'VirtualFDO'\t\t[FDO-OGR interoperability]\r\n - 'VirtualGPKG'\t[OGC GeoPackage interoperability]\r\n - 'VirtualBBox'\t\t[BoundingBox tables]\r\n - 'SpatiaLite'\t\t[Spatial SQL - OGC]\r\n PROJ.4 version ......: Rel. 4.9.3, 15 August 2016\r\n GEOS version ........: 3.5.1-CAPI-1.9.1 r4246\r\n TARGET CPU ..........: x86_64-linux-gnu\r\n the SPATIAL_REF_SYS table already contains some row(s)\r\n SQLite version ......: 3.23.1\r\n Enter \".help\" for instructions\r\n SQLite version 3.23.1 2018-04-10 17:39:29\r\n Enter \".help\" for instructions\r\n Enter SQL statements terminated with a \";\"\r\n spatialite>\r\n```\r\n\r\n```bash\r\n$ docker run --rm -it datasette python -c \"import pysqlite3; print(pysqlite3.sqlite_version)\"\r\n3.23.1\r\n```", "created_at": "2018-05-22T16:33:50Z", "updated_at": "2018-06-28T11:26:23Z", "closed_at": "2018-05-23T17:43:35Z", "merged_at": "2018-05-23T17:43:35Z", "merge_commit_sha": "bd30c696e18927207358ee9d63174a5c41c8297e", "assignee": null, "milestone": null, "draft": 0, "head": "5cf78eded61cacec435b854e18f1e94511cf2da8", "base": "58b5a37dbbf13868a46bcbb284509434e66eca25", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/280", "merged_by": null, "auto_merge": null} {"id": 201451332, "node_id": "MDExOlB1bGxSZXF1ZXN0MjAxNDUxMzMy", "number": 345, "state": "closed", "locked": 0, "title": "Allow app names for `datasette publish heroku`", "user": {"value": 45057, "label": "russss"}, "body": "Lets you supply the `-n` parameter for Heroku deploys, which also lets you update existing Heroku deployments.", "created_at": "2018-07-14T13:12:34Z", "updated_at": "2018-07-14T14:09:54Z", "closed_at": "2018-07-14T14:04:44Z", "merged_at": "2018-07-14T14:04:44Z", "merge_commit_sha": "58fec99ab0a31bcf25968f2aa05d37de8139b83c", "assignee": null, "milestone": null, "draft": 0, "head": "864cf8c1b01a581d6dc9711efe7cb4f2a6ac87e8", "base": "31a5d8fa77be68d4f837f0a80a611675dce49f4b", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/345", "merged_by": null, "auto_merge": null} {"id": 216651317, "node_id": "MDExOlB1bGxSZXF1ZXN0MjE2NjUxMzE3", "number": 365, "state": "closed", "locked": 0, "title": "fix small doc typo", "user": {"value": 418191, "label": "jaywgraves"}, "body": "", "created_at": "2018-09-19T14:02:02Z", "updated_at": "2019-12-19T02:30:33Z", "closed_at": "2018-09-19T17:15:43Z", "merged_at": "2018-09-19T17:15:43Z", "merge_commit_sha": "1bcd54a834a2f9730d21095df855f6708c85c200", "assignee": null, "milestone": null, "draft": 0, "head": "d3fb6a80c5878c73befa2a35e11a9ce28a6e1ab6", "base": "b7257a21bf3dfa7353980f343c83a616da44daa7", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/365", "merged_by": null, "auto_merge": null} {"id": 226314862, "node_id": "MDExOlB1bGxSZXF1ZXN0MjI2MzE0ODYy", "number": 367, "state": "closed", "locked": 0, "title": "Mark codemirror files as vendored", "user": {"value": 48517, "label": "jaap3"}, "body": "GitHub lists datasette as a Javascript project, primarily because of the vendored codemirror files. This is somewhat confusing when you're looking for datasette, knowing it's written in Python.\r\n\r\nLuckily it's possible exclude certain files from GitHub's code statistics: https://github.com/github/linguist#using-gitattributes", "created_at": "2018-10-27T18:41:25Z", "updated_at": "2019-05-03T21:12:09Z", "closed_at": "2019-05-03T21:11:20Z", "merged_at": "2019-05-03T21:11:20Z", "merge_commit_sha": "66c87cee0c7344c7877373c60b180c766c206101", "assignee": null, "milestone": null, "draft": 0, "head": "8e23e4548eedd58b0ff0e69c9a5010fc1a0136d5", "base": "6b398c2971801d9a20cfdb7998f59020d5534e22", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/367", "merged_by": null, "auto_merge": null} {"id": 226315513, "node_id": "MDExOlB1bGxSZXF1ZXN0MjI2MzE1NTEz", "number": 368, "state": "closed", "locked": 0, "title": "Update installation instructions", "user": {"value": 48517, "label": "jaap3"}, "body": "I was writing this as a response to your tweet, but decided I might just make it a pull request.\r\n\r\nI feel like it might be confusing to those unfamiliar with Python's `-m` flag and the built-in `venv` module to omit the space between the flag and its argument. By adding a space and prefixing the second occurrence of `venv` with a `./` it's maybe a bit clearer what the arguments are and what they do.\r\n\r\nBy also using `python3 -m pip` it becomes even clearer that `-m` is a special flag that makes the python executable do neat things.", "created_at": "2018-10-27T18:52:31Z", "updated_at": "2019-05-03T18:18:43Z", "closed_at": "2019-05-03T18:18:42Z", "merged_at": "2019-05-03T18:18:42Z", "merge_commit_sha": "f853d5592ec7f901a50381de22a26a9ab098f885", "assignee": null, "milestone": null, "draft": 0, "head": "8f8d6072820a13e2c698d9c326998b63810779c6", "base": "553314dcd699a84aa7cc806377150ca0d57a6024", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/368", "merged_by": null, "auto_merge": null} {"id": 235194286, "node_id": "MDExOlB1bGxSZXF1ZXN0MjM1MTk0Mjg2", "number": 390, "state": "closed", "locked": 0, "title": "tiny typo in customization docs", "user": {"value": 418191, "label": "jaywgraves"}, "body": "was looking to add some custom templates to my use of datasette and saw this small typo.", "created_at": "2018-12-01T13:44:42Z", "updated_at": "2019-12-19T02:30:35Z", "closed_at": "2018-12-16T21:32:56Z", "merged_at": "2018-12-16T21:32:56Z", "merge_commit_sha": "ed78922ae38b51513319b60ac39990b7c2aca810", "assignee": null, "milestone": null, "draft": 0, "head": "f8c01373dad3b8dcd10577a2e541f88ef34c77bc", "base": "3de8fac1d322cbab6c8c55899e0e8511b36337d0", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/390", "merged_by": null, "auto_merge": null} {"id": 255725057, "node_id": "MDExOlB1bGxSZXF1ZXN0MjU1NzI1MDU3", "number": 413, "state": "closed", "locked": 0, "title": "Update spatialite.rst", "user": {"value": 28597217, "label": "joelondon"}, "body": "a line of sql added to create the idx_ in the python recipe", "created_at": "2019-02-25T00:08:35Z", "updated_at": "2019-03-15T05:06:45Z", "closed_at": "2019-03-15T05:06:45Z", "merged_at": "2019-03-15T05:06:45Z", "merge_commit_sha": "9e8c36793bfbb17c2f67371cc7f9aa8b9202fdc4", "assignee": null, "milestone": null, "draft": 0, "head": "e87565604a169a34eadadfc99e96a8f503123e8c", "base": "1f91065b20cbc691f464bccfd8eef7d1ce4b14a8", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/413", "merged_by": null, "auto_merge": null} {"id": 266035382, "node_id": "MDExOlB1bGxSZXF1ZXN0MjY2MDM1Mzgy", "number": 424, "state": "closed", "locked": 0, "title": "Column types in inspected metadata", "user": {"value": 45057, "label": "russss"}, "body": "This PR does two things:\r\n\r\n* Adds the sqlite column type for each column to the inspected table info.\r\n* Stops binary columns from being rendered to HTML, unless a plugin handles it.\r\n\r\nThere's a bit more detail in the changeset descriptions.\r\n\r\nThese changes are intended as a precursor to a plugin which adds first-class support for Spatialite geographic primitives, and perhaps more useful geo-stuff.", "created_at": "2019-03-31T18:46:33Z", "updated_at": "2019-04-29T18:30:50Z", "closed_at": "2019-04-29T18:30:46Z", "merged_at": null, "merge_commit_sha": "a332d4e0b3fed7165a22880430664f1c3a00963d", "assignee": null, "milestone": null, "draft": 0, "head": "92e7b8c67fe5bcd484f19576f20c9235aca9050b", "base": "0209a0a344503157351e625f0629b686961763c9", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/424", "merged_by": null, "auto_merge": null} {"id": 271338405, "node_id": "MDExOlB1bGxSZXF1ZXN0MjcxMzM4NDA1", "number": 434, "state": "closed", "locked": 0, "title": "\"datasette publish cloudrun\" command to publish to Google Cloud Run", "user": {"value": 10352819, "label": "rprimet"}, "body": "This is a very rough draft to start a discussion on a possible datasette cloud run publish plugin (see issue #400).\r\n\r\nThe main change was to dynamically set the listening port in `make_dockerfile` to satisfy cloud run's [requirements](https://cloud.google.com/run/docs/reference/container-contract).\r\n\r\nThis was done by running `datasette` through `sh` to get environment variable substitution. Not sure if that's the right approach?\r\n", "created_at": "2019-04-17T14:41:18Z", "updated_at": "2019-05-03T21:50:44Z", "closed_at": "2019-05-03T13:59:02Z", "merged_at": "2019-05-03T13:59:02Z", "merge_commit_sha": "75a21fc2a136ccfc9da7bbf521cf288e63c9707f", "assignee": null, "milestone": null, "draft": 0, "head": "74c20d0d2eac13892ac20db0e66fcb3437544aa6", "base": "bf229c9bd88179c8ec16bd65fd4fb28ab4241c2e", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/434", "merged_by": null, "auto_merge": null} {"id": 274174614, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc0MTc0NjE0", "number": 437, "state": "closed", "locked": 0, "title": "Add inspect and prepare_sanic hooks", "user": {"value": 45057, "label": "russss"}, "body": "This adds two new plugin hooks:\r\n\r\nThe `inspect` hook allows plugins to add data to the inspect dictionary.\r\n\r\nThe `prepare_sanic` hook allows plugins to hook into the web router. I've attached a warning to this hook in the docs in light of #272 but I want this hook now...\r\n\r\nOn quick inspection, I don't think it's worthwhile to try and make this hook independent of the web framework (but it looks like Starlette would make the hook implementation a bit nicer).\r\n\r\nRef #14", "created_at": "2019-04-28T11:53:34Z", "updated_at": "2019-06-24T16:38:57Z", "closed_at": "2019-06-24T16:38:56Z", "merged_at": null, "merge_commit_sha": "7aeaac7c478acf572bda61bdaa6ac3247dc15811", "assignee": null, "milestone": null, "draft": 0, "head": "f33a0a63a7442f0b665320ac3e2eb55de315f1f7", "base": "11b352b4d52fd02a422776edebb14f12e4994d3b", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/437", "merged_by": null, "auto_merge": null} {"id": 274313625, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc0MzEzNjI1", "number": 439, "state": "closed", "locked": 0, "title": "[WIP] Add primary key to the extra_body_script hook arguments", "user": {"value": 45057, "label": "russss"}, "body": "This allows the row to be identified on row pages. The context here is that I want to access the row's data to plot it on a map.\r\n\r\nI considered passing the entire template context through to the hook function. This would expose the actual row data and potentially avoid a further fetch request in JS, but it does make the plugin API a lot more leaky. \r\n\r\n(At any rate, using the selected row data is tricky in my case because of Spatialite's infuriating custom binary representation...)", "created_at": "2019-04-29T10:08:23Z", "updated_at": "2019-05-01T09:58:32Z", "closed_at": "2019-05-01T09:58:30Z", "merged_at": null, "merge_commit_sha": "b3cbcfef4d11d2741cf00861734d726a4730afe5", "assignee": null, "milestone": null, "draft": 0, "head": "76b2c8fa406063b436155a7d8995e07b7e718c13", "base": "11b352b4d52fd02a422776edebb14f12e4994d3b", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/439", "merged_by": null, "auto_merge": null} {"id": 274468836, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc0NDY4ODM2", "number": 441, "state": "closed", "locked": 0, "title": "Add register_output_renderer hook", "user": {"value": 45057, "label": "russss"}, "body": "This changeset refactors out the JSON renderer and then adds a hook and\r\ndispatcher system to allow custom output renderers to be registered.\r\n\r\nThe CSV output renderer is untouched because supporting streaming\r\nrenderers through this system would be significantly more complex, and\r\nprobably not worthwhile.\r\n\r\nWe can't simply allow hooks to be called at request time because we need\r\na list of supported file extensions when the request is being routed in\r\norder to resolve ambiguous database/table names. So, renderers need to\r\nbe registered at startup.\r\n\r\nI've tried to make this API independent of Sanic's request/response\r\nobjects so that this can remain stable during the switch to ASGI. I'm\r\nusing dictionaries to keep it simple and to make adding additional\r\noptions in the future easy.\r\n\r\nFixes #440", "created_at": "2019-04-29T18:03:21Z", "updated_at": "2019-05-01T23:01:57Z", "closed_at": "2019-05-01T23:01:57Z", "merged_at": "2019-05-01T23:01:57Z", "merge_commit_sha": "cf406c075433882b656e340870adf7757976fa4c", "assignee": null, "milestone": null, "draft": 0, "head": "c9f941f06eb0268841de49407725917c74a8a2dc", "base": "11b352b4d52fd02a422776edebb14f12e4994d3b", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/441", "merged_by": null, "auto_merge": null} {"id": 274478761, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc0NDc4NzYx", "number": 442, "state": "closed", "locked": 0, "title": "Suppress rendering of binary data", "user": {"value": 45057, "label": "russss"}, "body": "Binary columns (including spatialite geographies) get shown as ugly\r\nbinary strings in the HTML by default. Nobody wants to see that mess.\r\n\r\nShow the size of the column in bytes instead. If you want to decode\r\nthe binary data, you can use a plugin to do it.", "created_at": "2019-04-29T18:36:41Z", "updated_at": "2019-05-03T18:26:48Z", "closed_at": "2019-05-03T16:44:49Z", "merged_at": "2019-05-03T16:44:49Z", "merge_commit_sha": "d555baf508de71a5e3dc9a9aed2c13f6f202956d", "assignee": null, "milestone": null, "draft": 0, "head": "bbbd9ea5ad774f088bd963106fa5756bfd77c799", "base": "11b352b4d52fd02a422776edebb14f12e4994d3b", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/442", "merged_by": null, "auto_merge": null} {"id": 275275610, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc1Mjc1NjEw", "number": 443, "state": "closed", "locked": 0, "title": "Pass view_name to extra_body_script hook", "user": {"value": 45057, "label": "russss"}, "body": "At the moment it's not easy to tell whether the hook is being called\r\nin (for example) the row or table view, as in both cases the\r\n`database` and `table` parameters are provided.\r\n\r\nThis passes the `view_name` added in #441 to the `extra_body_script`\r\nhook.", "created_at": "2019-05-02T08:38:36Z", "updated_at": "2019-05-03T13:12:20Z", "closed_at": "2019-05-03T13:12:20Z", "merged_at": "2019-05-03T13:12:20Z", "merge_commit_sha": "bf229c9bd88179c8ec16bd65fd4fb28ab4241c2e", "assignee": null, "milestone": null, "draft": 0, "head": "83b6b82d4787b30d34eb26c22ad1ff9c5c118134", "base": "efc93b8ab5a21e3802f75f08d5e41409f5684b5d", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/443", "merged_by": null, "auto_merge": null} {"id": 275281307, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc1MjgxMzA3", "number": 444, "state": "closed", "locked": 0, "title": "Add a max-line-length setting for flake8", "user": {"value": 45057, "label": "russss"}, "body": "This stops my automatic editor linting from flagging lines which are too\r\nlong. It's been lingering in my checkout for ages.\r\n\r\n160 is an arbitrary large number - we could alter it if we have any\r\nopinions (but I find the line length limit to be my least favourite part\r\nof PEP8).", "created_at": "2019-05-02T08:58:57Z", "updated_at": "2019-05-04T09:44:48Z", "closed_at": "2019-05-03T13:11:28Z", "merged_at": "2019-05-03T13:11:28Z", "merge_commit_sha": "470cf0b05d4fda0d2563f81c7e32af13fe346ccc", "assignee": null, "milestone": null, "draft": 0, "head": "4f0d265951d7e95920298b46eff39bb9cc783984", "base": "efc93b8ab5a21e3802f75f08d5e41409f5684b5d", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/444", "merged_by": null, "auto_merge": null} {"id": 275909197, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc1OTA5MTk3", "number": 450, "state": "closed", "locked": 0, "title": "Coalesce hidden table count to 0", "user": {"value": 45057, "label": "russss"}, "body": "For some reason I'm hitting a `None` here with a FTS table. I'm not\r\nentirely sure why but this makes the logic work the same as with\r\nnon-hidden tables.", "created_at": "2019-05-04T09:37:10Z", "updated_at": "2019-05-11T18:10:09Z", "closed_at": "2019-05-11T18:10:09Z", "merged_at": null, "merge_commit_sha": "5918489a2a2f14b58c5c71773a9d4fb6bb0e3e0a", "assignee": null, "milestone": null, "draft": 0, "head": "f81d9df985e8d054fc16ab91f72878fe71656354", "base": "55643430f7ac8d27e99b00e7cf79db741003e811", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/450", "merged_by": null, "auto_merge": null} {"id": 275923066, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc1OTIzMDY2", "number": 452, "state": "open", "locked": 0, "title": "SQL builder utility classes", "user": {"value": 45057, "label": "russss"}, "body": "This adds a straightforward set of classes to aid in the construction of\r\nSQL queries.\r\n\r\nMy plan for this was to allow plugins to manipulate the\r\nDatasette-generated SQL in a more structured way. I'm not sure that's\r\ngoing to work, but I feel like this is still a step forward - it\r\nreduces the number of intermediate variables in `TableView.data` which\r\naids readability, and also factors out a lot of the boring string\r\nconcatenation.\r\n\r\nThere are a fair number of minor structure changes in here too as I've\r\ntried to make the ordering of `TableView.data` a bit more logical. As\r\nfar as I can tell, I haven't broken anything...", "created_at": "2019-05-04T13:57:47Z", "updated_at": "2019-05-04T14:03:04Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "45e7460d78c3f87c01f2e9e142cb7f646b23b156", "assignee": null, "milestone": null, "draft": 0, "head": "c63762280d3bd66ad6ea24933dafe218861efef2", "base": "55643430f7ac8d27e99b00e7cf79db741003e811", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/452", "merged_by": null, "auto_merge": null} {"id": 277524072, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc3NTI0MDcy", "number": 458, "state": "closed", "locked": 0, "title": "setup: add tests to package exclusion", "user": {"value": 7725188, "label": "hellerve"}, "body": "This PR fixes #456 by adding `tests` to the package exclusion list.\r\n\r\nCheers", "created_at": "2019-05-09T19:47:21Z", "updated_at": "2020-07-21T01:14:42Z", "closed_at": "2019-05-10T01:54:51Z", "merged_at": "2019-05-10T01:54:51Z", "merge_commit_sha": "9f8d9fe262866ff3463f8e61214dcc6897bd5a9c", "assignee": null, "milestone": null, "draft": 0, "head": "9c65ff1ba8c855e4ade5bc7ae29a69215b3979d0", "base": "f825e2012109247fa246e2b938f8174069e574f1", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/458", "merged_by": null, "auto_merge": null} {"id": 280204276, "node_id": "MDExOlB1bGxSZXF1ZXN0MjgwMjA0Mjc2", "number": 479, "state": "closed", "locked": 0, "title": "doc typo fix", "user": {"value": 98555, "label": "IgnoredAmbience"}, "body": "Fix typo in performance doc page", "created_at": "2019-05-19T22:54:25Z", "updated_at": "2019-05-20T16:42:29Z", "closed_at": "2019-05-20T16:42:29Z", "merged_at": "2019-05-20T16:42:29Z", "merge_commit_sha": "70d2858067d3c4da0e17c1d39e03de89190e94b6", "assignee": null, "milestone": null, "draft": 0, "head": "708e13ab87f8c8620796c3e8f2b0aa1b2fc26875", "base": "e513a80afba30bca9eeebd71c5e6aa6d8a811f33", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/479", "merged_by": null, "auto_merge": null} {"id": 280205502, "node_id": "MDExOlB1bGxSZXF1ZXN0MjgwMjA1NTAy", "number": 480, "state": "closed", "locked": 0, "title": "Split pypi and docker travis tasks", "user": {"value": 813732, "label": "glasnt"}, "body": "Resolves #478 \r\n\r\nThis *should* work, but because this is a change that'll only really be testable on a) this repo, b) master branch, this might fail fast if I didn't get the configurations right. \r\n\r\n\r\nLooking at #478 it should just be as simple as splitting out the docker and pypi processes into separate jobs, but it might end up being more complicated than that, depending on what pre-processes the pypi deployment needs, and how travisci treats deployment steps without scripts in general. ", "created_at": "2019-05-19T23:14:37Z", "updated_at": "2019-07-07T20:03:20Z", "closed_at": "2019-07-07T20:03:20Z", "merged_at": "2019-07-07T20:03:20Z", "merge_commit_sha": "d95048031edb02bbc9892879507f55a4f29c5459", "assignee": null, "milestone": {"value": 4471010, "label": "Datasette 0.29"}, "draft": 0, "head": "8b667898b6c2dd57fa68310c6d3c62d77b68f321", "base": "4246e138f9512686413e97878659ef953337e57b", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/480", "merged_by": null, "auto_merge": null} {"id": 284743794, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjg0NzQzNzk0", "number": 500, "state": "closed", "locked": 0, "title": "Fix typo in install step: should be install -e", "user": {"value": 32314, "label": "tmcw"}, "body": "", "created_at": "2019-06-03T21:50:51Z", "updated_at": "2019-06-11T18:48:43Z", "closed_at": "2019-06-11T18:48:40Z", "merged_at": "2019-06-11T18:48:40Z", "merge_commit_sha": "aa911122feab13f8e65875c98edb00fd3832b7b8", "assignee": null, "milestone": null, "draft": 0, "head": "ff98f44d7f10ff65fc172df9155c77f169ab4c7f", "base": "5e8fbf7f6fbc0b63d0479da3806dd9ccd6aaa945", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/500", "merged_by": null, "auto_merge": null} {"id": 295711504, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjk1NzExNTA0", "number": 554, "state": "closed", "locked": 0, "title": "Fix static mounts using relative paths and prevent traversal exploits", "user": {"value": 3243482, "label": "abdusco"}, "body": "While debugging why my static mounts using a relative path (`--static mystatic:rel/path/to/dir`) not working, I noticed that the requests fail no matter what, returning 404 errors. \r\n\r\nThe reason is that datasette tries to prevent traversal exploits by checking if the path is relative to its registered directory. This check fails when the mount is a relative directory, because `/abs/dir/file` obviously not under `dir/file`. \r\n\r\nhttps://github.com/simonw/datasette/blob/81fa8b6cdc5457b42a224779e5291952314e8d20/datasette/utils/asgi.py#L303-L306\r\n\r\nThis also has the consequence of returning any requested file, because when `/abs/dir/../../evil.file` resolves `aiofiles` happily returns it to the client after it resolves the path itself. The solution is to make sure we're checking relativity of paths after they're fully resolved.\r\n\r\nI've implemented the mentioned changes and also updated the tests.", "created_at": "2019-07-09T11:32:02Z", "updated_at": "2019-07-11T16:29:26Z", "closed_at": "2019-07-11T16:13:19Z", "merged_at": "2019-07-11T16:13:19Z", "merge_commit_sha": "74ecf8a7cc45cabf369e510c7214f5ed85c8c6d8", "assignee": null, "milestone": null, "draft": 0, "head": "fa7ddea3ea6c9378bee7d5f5c93fe05d735a0afb", "base": "81fa8b6cdc5457b42a224779e5291952314e8d20", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/554", "merged_by": null, "auto_merge": null} {"id": 295748268, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjk1NzQ4MjY4", "number": 556, "state": "closed", "locked": 0, "title": "Add support for running datasette as a module", "user": {"value": 3243482, "label": "abdusco"}, "body": "This PR allows running datasette using `python -m datasette` command in addition to just running the executable.\r\n\r\nThis function is quite useful when debugging a plugin in a project because IDEs like PyCharm can easily start a debug session when datasette is run as a module in contrast to trying to attach a debugger to a running process.\r\n\r\n![image](https://user-images.githubusercontent.com/3243482/60890448-fc4ede80-a263-11e9-8b42-d2a3db8d1a59.png)\r\n", "created_at": "2019-07-09T13:13:30Z", "updated_at": "2019-07-11T16:07:45Z", "closed_at": "2019-07-11T16:07:44Z", "merged_at": "2019-07-11T16:07:44Z", "merge_commit_sha": "9ca860e54fe480d0a365c0c1d8d085926d12be1e", "assignee": null, "milestone": null, "draft": 0, "head": "056a7eac9480cb814d9c453b983e6b2b831e0ca1", "base": "81fa8b6cdc5457b42a224779e5291952314e8d20", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/556", "merged_by": null, "auto_merge": null} {"id": 298962551, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjk4OTYyNTUx", "number": 561, "state": "closed", "locked": 0, "title": "Fix typos", "user": {"value": 15278512, "label": "minho42"}, "body": "", "created_at": "2019-07-18T15:13:35Z", "updated_at": "2019-07-26T10:25:45Z", "closed_at": "2019-07-26T10:25:45Z", "merged_at": "2019-07-26T10:25:45Z", "merge_commit_sha": "27cb29365c9f5f6f1492968d1268497193ed75a2", "assignee": null, "milestone": null, "draft": 0, "head": "41341195075adc5093d33633d980657ecdac043c", "base": "a9453c4dda70bbf5122835e68f63db6ecbe1a6fc", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/561", "merged_by": null, "auto_merge": null} {"id": 327169748, "node_id": "MDExOlB1bGxSZXF1ZXN0MzI3MTY5NzQ4", "number": 589, "state": "closed", "locked": 0, "title": "Display metadata footer on custom SQL queries", "user": {"value": 2657547, "label": "rixx"}, "body": "Closes #408", "created_at": "2019-10-11T12:10:28Z", "updated_at": "2019-10-14T08:58:23Z", "closed_at": "2019-10-14T03:53:22Z", "merged_at": "2019-10-14T03:53:22Z", "merge_commit_sha": "12cec411cae73ba7211429da12cd32c551fe17b1", "assignee": null, "milestone": null, "draft": 0, "head": "5627fe8d58e791e004b89b5614007d5e64a5c8e2", "base": "fffd69ec031b83f46680f192ba57a27f0d1f0b8a", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/589", "merged_by": null, "auto_merge": null} {"id": 327172545, "node_id": "MDExOlB1bGxSZXF1ZXN0MzI3MTcyNTQ1", "number": 590, "state": "closed", "locked": 0, "title": "Handle spaces in DB names", "user": {"value": 2657547, "label": "rixx"}, "body": "Closes #503", "created_at": "2019-10-11T12:18:22Z", "updated_at": "2019-11-04T23:16:31Z", "closed_at": "2019-11-04T23:16:30Z", "merged_at": "2019-11-04T23:16:30Z", "merge_commit_sha": "931bfc66613aa3e22f8314df5c0d0758baf31f38", "assignee": null, "milestone": null, "draft": 0, "head": "0c306e89e4f97f64921e4f6d1fe7bab52fad6ade", "base": "52fa79c6075f0830ff635b81d957c64d877a05aa", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/590", "merged_by": null, "auto_merge": null} {"id": 327188087, "node_id": "MDExOlB1bGxSZXF1ZXN0MzI3MTg4MDg3", "number": 591, "state": "closed", "locked": 0, "title": "Sort databases on homepage by argument order", "user": {"value": 2657547, "label": "rixx"}, "body": "Closes #585", "created_at": "2019-10-11T12:57:38Z", "updated_at": "2019-10-14T08:57:50Z", "closed_at": "2019-10-14T03:52:34Z", "merged_at": "2019-10-14T03:52:34Z", "merge_commit_sha": "908fc3999e06f3ccd3bb8ad0539490bbc7809748", "assignee": null, "milestone": null, "draft": 0, "head": "5a8e52fa60f2c2c93f10b9c6c126f31b02d647b0", "base": "fffd69ec031b83f46680f192ba57a27f0d1f0b8a", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/591", "merged_by": null, "auto_merge": null} {"id": 327279818, "node_id": "MDExOlB1bGxSZXF1ZXN0MzI3Mjc5ODE4", "number": 592, "state": "closed", "locked": 0, "title": "Offer SQL formatting", "user": {"value": 2657547, "label": "rixx"}, "body": "SQL code will be formatted on page load, and can additionally be formatted by clicking the \"Format SQL\" button. Closes #136", "created_at": "2019-10-11T16:35:49Z", "updated_at": "2019-10-14T08:57:12Z", "closed_at": "2019-10-14T03:46:13Z", "merged_at": "2019-10-14T03:46:13Z", "merge_commit_sha": "af2e6a5cf186a7200d76cb67ac30fa59cc24d84e", "assignee": null, "milestone": null, "draft": 0, "head": "b46195af65846ca30c6006520cc778eeed052324", "base": "fffd69ec031b83f46680f192ba57a27f0d1f0b8a", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/592", "merged_by": null, "auto_merge": null} {"id": 330076263, "node_id": "MDExOlB1bGxSZXF1ZXN0MzMwMDc2MjYz", "number": 602, "state": "closed", "locked": 0, "title": "Offer to format readonly SQL", "user": {"value": 2657547, "label": "rixx"}, "body": "Following discussion in #601, this PR adds a \"Format SQL\" button to\r\nread-only SQL (if the SQL actually differs from the formatting result).\r\n\r\nIt also removes a console error on readonly SQL queries.", "created_at": "2019-10-20T02:29:32Z", "updated_at": "2019-11-04T07:29:33Z", "closed_at": "2019-11-04T02:39:56Z", "merged_at": "2019-11-04T02:39:56Z", "merge_commit_sha": "ee330222f4c3ee66c2fe41ebc76fed56b9cb9a00", "assignee": null, "milestone": null, "draft": 0, "head": "266c3dafb9bf3b12204b6152d7b48e94a131584a", "base": "8050f9e1ece9afd0236ad38c6458c12a4ad917e6", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/602", "merged_by": null, "auto_merge": null} {"id": 330129358, "node_id": "MDExOlB1bGxSZXF1ZXN0MzMwMTI5MzU4", "number": 603, "state": "closed", "locked": 0, "title": "always pop as_format off args dict", "user": {"value": 6025893, "label": "chris48s"}, "body": "closes #563", "created_at": "2019-10-20T15:44:22Z", "updated_at": "2019-10-30T19:12:22Z", "closed_at": "2019-10-21T02:03:09Z", "merged_at": "2019-10-21T02:03:09Z", "merge_commit_sha": "f4c0830529a9513a83437a9e1550bbe27ebc5c64", "assignee": null, "milestone": null, "draft": 0, "head": "39d044502590224e4f07c05e02fc8a4d312255c1", "base": "8050f9e1ece9afd0236ad38c6458c12a4ad917e6", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/603", "merged_by": null, "auto_merge": null} {"id": 340211149, "node_id": "MDExOlB1bGxSZXF1ZXN0MzQwMjExMTQ5", "number": 631, "state": "closed", "locked": 0, "title": "bugfix issue 572", "user": {"value": 3683993, "label": "qwo"}, "body": "closes bugfix issue #572 ", "created_at": "2019-11-13T02:46:50Z", "updated_at": "2019-11-13T04:28:43Z", "closed_at": "2019-11-13T04:28:42Z", "merged_at": "2019-11-13T04:28:42Z", "merge_commit_sha": "848dec4deb0d3c140a4e0394cac45fbb2593349b", "assignee": null, "milestone": null, "draft": 0, "head": "ca43966e5aa832a377e4db5d411b6cc8b1c5b3ac", "base": "bbd00e903cdd49067ecdbdb60a4d225833a44b05", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/631", "merged_by": null, "auto_merge": null} {"id": 347179081, "node_id": "MDExOlB1bGxSZXF1ZXN0MzQ3MTc5MDgx", "number": 644, "state": "closed", "locked": 0, "title": "Validate metadata json on startup", "user": {"value": 6025893, "label": "chris48s"}, "body": "This PR adds a sanity check which builds up a marshmallow schema on-the-fly based on the structure of the database(s) on startup and then validates the metadata json against it.\r\n\r\nIn case of invalid data, this will raise with a descriptive error e.g:\r\n\r\n```\r\nmarshmallow.exceptions.ValidationError: {'databases': {'fixtures': {'tables': {'not_a_table': ['Unknown field.']}}}}\r\n```\r\n\r\nCloses #260\r\n\r\n---\r\n\r\nThis was intended to be fairly self-contained, but then while I was working on it, I hit some problems getting the tests to pass in the context of the test suite as a whole. My tests passed in isolation, but then failed while doing a full test suite run. That's when the worms started coming out of the can :bug: After some sleuthing, it turned out this was essentially the result of several issues intersecting:\r\n\r\n* There are certain events in the application lifecycle where the metadata schema can be modified after it is loaded e.g: https://github.com/simonw/datasette/blob/a562f2965552fb2dbbbd74df245c9965ee23d886/datasette/app.py#L299-L320 This means that sometimes what goes in isn't always exactly what comes out when you call `/-/metadata`.\r\n* Because the test fixtures use session scope for performance reasons if one unit test performs an action which mutates the metadata, that can impact on other unit tests which run after it using the same fixture.\r\n* Because the `self._metadata` property was being set with a simple assignment `self._metadata = metadata`, that created an object reference to the test fixture data, so operating on `self._metadata` was actually modifying the test fixture `METADATA` meaning that depending on when it was loaded in the test suite lifecycle, `METADATA` had different content, which was somewhat unexpected.\r\n\r\nAs such, I've added some band-aids in 3552024 and 6859fd8:\r\n* Switching the metadata object to a `deepcopy` of the input prevents us directly mutating the input fixture.\r\n* I've switched some of the tests to use a fixture with function scope instead of session scope so we're working on a clean copy that hasn't been mutated by other tests where necessary but keeping session scope in most cases for performance.\r\n* I haven't really addressed the fact that sometimes the metadata object gets mutated in place, so the object that is served from `/-/metadata` isn't necessarily always exactly the same as the file you fed into it on init. I'm not sure how much of a problem that is. The way the tests were written makes me think it was unexpected, but getting into it feels like too much scope creep for this PR so its probably best addressed as another issue.", "created_at": "2019-11-30T00:32:15Z", "updated_at": "2021-07-28T17:58:45Z", "closed_at": "2021-07-28T17:58:45Z", "merged_at": null, "merge_commit_sha": "e71b642474d54f986bc8857346103d8a10d84e6d", "assignee": null, "milestone": null, "draft": 0, "head": "6859fd8c5eef26f397aa949dc4edf3747e8ab0a5", "base": "a562f2965552fb2dbbbd74df245c9965ee23d886", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/644", "merged_by": null, "auto_merge": null} {"id": 356004242, "node_id": "MDExOlB1bGxSZXF1ZXN0MzU2MDA0MjQy", "number": 653, "state": "closed", "locked": 0, "title": "allow leading comments in SQL input field", "user": {"value": 418191, "label": "jaywgraves"}, "body": "this changes the SQL validation to allow for lines that are commented out\r\n\r\nmy main use case for this is that I like to write a succession of queries when trying to solve a problem.\r\nIn most native SQL clients there is a key binding that will run just the current highlighted query or the program is smart enough to run just the query that the cursor is in if it's properly delimited with a ';'.\r\nTypically my workflow will start with a single simple query and I'll copy/paste it to a new query below when I want to make big changes while debugging. This makes it easy to go back to a working version above when the query doesn't work.\r\nSince datasette sends the whole query to the DB I have to comment out the older queries by prefixing each line with `--`. This gets caught by the validators when I use my typical strategy of copy/pasting each successive query below the last one. \r\nso this is just a simple fix to allow for a query to be sent to the DB with leading comments.\r\n", "created_at": "2019-12-21T14:19:52Z", "updated_at": "2020-02-05T02:35:41Z", "closed_at": "2020-02-05T02:13:25Z", "merged_at": "2020-02-05T02:13:25Z", "merge_commit_sha": "33a12c8ae526afb40a7819c9ca411c9d3c41219b", "assignee": null, "milestone": null, "draft": 0, "head": "3a4cb551b9a217d5798e3e9ad5d4b06234a81885", "base": "d6b6c9171f3fd945c4e5e4144923ac831c43c208", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/653", "merged_by": null, "auto_merge": null} {"id": 365218391, "node_id": "MDExOlB1bGxSZXF1ZXN0MzY1MjE4Mzkx", "number": 660, "state": "closed", "locked": 0, "title": "gcloud run is now GA, s/beta//", "user": {"value": 813732, "label": "glasnt"}, "body": "", "created_at": "2020-01-21T10:08:38Z", "updated_at": "2020-01-22T03:41:09Z", "closed_at": "2020-01-21T23:28:12Z", "merged_at": "2020-01-21T23:28:12Z", "merge_commit_sha": "34d77d780f68b778fd9d6ebbaf69f250436f055f", "assignee": null, "milestone": null, "draft": 0, "head": "894e96026b838288f926f62914123a1f86139793", "base": "3c861f363df02a59a67c59036278338e4760d2ed", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/660", "merged_by": null, "auto_merge": null} {"id": 372763906, "node_id": "MDExOlB1bGxSZXF1ZXN0MzcyNzYzOTA2", "number": 666, "state": "closed", "locked": 0, "title": "Use inspect-file, if possible, for total row count", "user": {"value": 13896256, "label": "kevindkeogh"}, "body": "For large tables, counting the number of rows in the table can take a\r\nsignficant amount of time. Instead, where an inspect-file is provided\r\nfor an immutable database, look up the row-count for a plain count(*).", "created_at": "2020-02-08T22:10:35Z", "updated_at": "2020-03-09T02:47:15Z", "closed_at": "2020-02-25T20:19:29Z", "merged_at": "2020-02-25T20:19:29Z", "merge_commit_sha": "3041c6b6412bbe317f8b9afd6529a15954f2c47e", "assignee": null, "milestone": null, "draft": 0, "head": "8947a60404b8242a03f9ebabc5f957d75f4dfe04", "base": "b031fe97636b80b05fec409ee1dffb7d044fd4e9", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/666", "merged_by": null, "auto_merge": null} {"id": 373775788, "node_id": "MDExOlB1bGxSZXF1ZXN0MzczNzc1Nzg4", "number": 669, "state": "closed", "locked": 0, "title": "fix db-to-sqlite command in ecosystem doc page", "user": {"value": 883348, "label": "adipasquale"}, "body": "the `--connection` parameter has become positional", "created_at": "2020-02-11T17:05:41Z", "updated_at": "2020-02-22T02:32:18Z", "closed_at": "2020-02-22T02:32:17Z", "merged_at": "2020-02-22T02:32:17Z", "merge_commit_sha": "be2265b0e811d0ac2875c2f748125c17b0f9289e", "assignee": null, "milestone": null, "draft": 0, "head": "6eb0e8cd90be82eff0a5152b0985c2a3cb7a44a8", "base": "30b6f71b306a43605c99bef79302ed5cb22d1924", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/669", "merged_by": null, "auto_merge": null} {"id": 399166433, "node_id": "MDExOlB1bGxSZXF1ZXN0Mzk5MTY2NDMz", "number": 719, "state": "closed", "locked": 0, "title": "asgi: check raw_path is not None", "user": {"value": 193185, "label": "cldellow"}, "body": "The ASGI spec\r\n(https://asgi.readthedocs.io/en/latest/specs/www.html#http) seems to imply that `None` is a valid value, so we need to check the value itself, not just whether the key is present.\r\n\r\nIn particular, the [mangum](https://github.com/erm/mangum) adapter passes `None` for this key's value. This change permits mangum to be used to front datasette in Amazon API Gateway + AWS Lambda deployments.", "created_at": "2020-04-05T16:53:58Z", "updated_at": "2020-05-04T17:14:26Z", "closed_at": "2020-05-04T17:14:26Z", "merged_at": "2020-05-04T17:14:26Z", "merge_commit_sha": "dbd2d70b3819a7041bb36a527033d77c85683c05", "assignee": null, "milestone": null, "draft": 0, "head": "161f61d73800a605354b4ac44a3c989e19bbc77a", "base": "e0e7a0facfc935a835cd73c720bc46661462f0b1", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/719", "merged_by": null, "auto_merge": null} {"id": 400578979, "node_id": "MDExOlB1bGxSZXF1ZXN0NDAwNTc4OTc5", "number": 720, "state": "closed", "locked": 0, "title": "Update beautifulsoup4 requirement from ~=4.8.1 to >=4.8.1,<4.10.0", "user": {"value": 27856297, "label": "dependabot-preview[bot]"}, "body": "Updates the requirements on [beautifulsoup4](http://www.crummy.com/software/BeautifulSoup/bs4/) to permit the latest version.\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n**Note:** This repo was added to Dependabot recently, so you'll receive a maximum of 5 PRs for your first few update runs. Once an update run creates fewer than 5 PRs we'll remove that limit.\n\nYou can always request more updates by clicking `Bump now` in your [Dependabot dashboard](https://app.dependabot.com).\n\n
\nDependabot commands and options\n
\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language\n- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language\n- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language\n- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language\n- `@dependabot badge me` will comment on this PR with code to add a \"Dependabot enabled\" badge to your readme\n\nAdditionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com):\n- Update frequency (including time of day and day of week)\n- Pull request limits (per update run and/or open at any time)\n- Out-of-range updates (receive only lockfile updates, if desired)\n- Security updates (receive only security updates, if desired)\n\n\n\n
", "created_at": "2020-04-08T01:24:38Z", "updated_at": "2020-05-04T17:14:51Z", "closed_at": "2020-05-04T17:14:46Z", "merged_at": "2020-05-04T17:14:46Z", "merge_commit_sha": "707fe039947b3e48f2b6dcfe8e577d76b617f2a5", "assignee": null, "milestone": null, "draft": 0, "head": "ab76bf88f597e61668dc6fc750502f8db207bd9c", "base": "d55fe8cdfc2ce7bc6960bf2507766c1fcd1d31a7", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/720", "merged_by": null, "auto_merge": null} {"id": 400579077, "node_id": "MDExOlB1bGxSZXF1ZXN0NDAwNTc5MDc3", "number": 721, "state": "closed", "locked": 0, "title": "Update pytest requirement from ~=5.2.2 to >=5.2.2,<5.5.0", "user": {"value": 27856297, "label": "dependabot-preview[bot]"}, "body": "Updates the requirements on [pytest](https://github.com/pytest-dev/pytest) to permit the latest version.\n
\nRelease notes\n

Sourced from pytest's releases.

\n
\n

5.4.1

\n

pytest 5.4.1 (2020-03-13)

\n

Bug Fixes

\n
    \n
  • \n

    #6909: Revert the change introduced by #6330, which required all arguments to @pytest.mark.parametrize to be explicitly defined in the function signature.

    \n

    The intention of the original change was to remove what was expected to be an unintended/surprising behavior, but it turns out many people relied on it, so the restriction has been reverted.

    \n
  • \n
  • \n

    #6910: Fix crash when plugins return an unknown stats while using the --reportlog option.

    \n
  • \n
\n
\n
\n
\nChangelog\n

Sourced from pytest's changelog.

\n
\n
\nCommits\n
    \n
  • 3d0f3ba Preparing release version 5.4.1
  • \n
  • b9e2cd0 Merge pull request #6914 from nicoddemus/revert-6330
  • \n
  • a84fcbf Revert "[parametrize] enforce explicit argnames declaration (#6330)"
  • \n
  • 59c1bfa Merge pull request #6913 from nicoddemus/backport-6910
  • \n
  • 3267f64 Merge pull request #6910 from nicoddemus/resultlog-logreport
  • \n
  • c9fd1bd Preparing release version 5.4.0
  • \n
  • 93aa988 Merge pull request #6901 from RonnyPfannschmidt/regendoc-fix-simple
  • \n
  • 7996724 Merge pull request #6902 from RoyalTS/filterwarnings-docfix
  • \n
  • 90ee8a7 docfix
  • \n
  • 378a75d run and fix tox -e regen to prepare 5.4
  • \n
  • Additional commits viewable in compare view
  • \n
\n
\n
\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n**Note:** This repo was added to Dependabot recently, so you'll receive a maximum of 5 PRs for your first few update runs. Once an update run creates fewer than 5 PRs we'll remove that limit.\n\nYou can always request more updates by clicking `Bump now` in your [Dependabot dashboard](https://app.dependabot.com).\n\n
\nDependabot commands and options\n
\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language\n- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language\n- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language\n- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language\n- `@dependabot badge me` will comment on this PR with code to add a \"Dependabot enabled\" badge to your readme\n\nAdditionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com):\n- Update frequency (including time of day and day of week)\n- Pull request limits (per update run and/or open at any time)\n- Out-of-range updates (receive only lockfile updates, if desired)\n- Security updates (receive only security updates, if desired)\n\n\n\n
", "created_at": "2020-04-08T01:25:04Z", "updated_at": "2020-05-04T17:13:49Z", "closed_at": "2020-05-04T17:13:41Z", "merged_at": "2020-05-04T17:13:41Z", "merge_commit_sha": "c91fb9e3d4f0632d4ef25a21165739ab88a9d491", "assignee": null, "milestone": null, "draft": 0, "head": "54ea56285f9512c991e343ffad9d848d551977de", "base": "d55fe8cdfc2ce7bc6960bf2507766c1fcd1d31a7", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/721", "merged_by": null, "auto_merge": null} {"id": 400579136, "node_id": "MDExOlB1bGxSZXF1ZXN0NDAwNTc5MTM2", "number": 722, "state": "closed", "locked": 0, "title": "Update jinja2 requirement from ~=2.10.3 to >=2.10.3,<2.12.0", "user": {"value": 27856297, "label": "dependabot-preview[bot]"}, "body": "Updates the requirements on [jinja2](https://github.com/pallets/jinja) to permit the latest version.\n
\nRelease notes\n

Sourced from jinja2's releases.

\n
\n

2.11.1

\n

This fixes an issue in async environment when indexing the result of an attribute lookup, like {{ data.items[1:] }}.

\n\n
\n
\n
\nChangelog\n

Sourced from jinja2's changelog.

\n
\n

Version 2.11.1

\n

Released 2020-01-30

\n
    \n
  • Fix a bug that prevented looking up a key after an attribute ({{ data.items[1:] }}) in an async template. 1141
  • \n
\n

Version 2.11.0

\n

Released 2020-01-27

\n
    \n
  • Drop support for Python 2.6, 3.3, and 3.4. This will be the last version to support Python 2.7 and 3.5.
  • \n
  • Added a new ChainableUndefined class to support getitem and getattr on an undefined object. 977
  • \n
  • Allow {%+ syntax (with NOP behavior) when lstrip_blocks is disabled. 748
  • \n
  • Added a default parameter for the map filter. 557
  • \n
  • Exclude environment globals from meta.find_undeclared_variables. 931
  • \n
  • Float literals can be written with scientific notation, like 2.56e-3. 912, 922
  • \n
  • Int and float literals can be written with the '_' separator for legibility, like 12_345. 923
  • \n
  • Fix a bug causing deadlocks in LRUCache.setdefault. 1000
  • \n
  • The trim filter takes an optional string of characters to trim. 828
  • \n
  • A new jinja2.ext.debug extension adds a {% debug %} tag to quickly dump the current context and available filters and tests. 174, 798, 983
  • \n
  • Lexing templates with large amounts of whitespace is much faster. 857, 858
  • \n
  • Parentheses around comparisons are preserved, so {{ 2 * (3 < 5) }} outputs "2" instead of "False". 755, 938
  • \n
  • Add new boolean, false, true, integer and float tests. 824
  • \n
  • The environment's finalize function is only applied to the output of expressions (constant or not), not static template data. 63
  • \n
  • When providing multiple paths to FileSystemLoader, a template can have the same name as a directory. 821
  • \n
  • Always return Undefined when omitting the else clause in a {{ 'foo' if bar }} expression, regardless of the environment's undefined class. Omitting the else clause is a valid shortcut and should not raise an error when using StrictUndefined. 710, 1079
  • \n
  • Fix behavior of loop control variables such as length and revindex0 when looping over a generator. 459, 751, 794, 993
  • \n
  • Async support is only loaded the first time an environment enables it, in order to avoid a slow initial import. 765
  • \n
  • In async environments, the |map filter will await the filter call if needed. 913
  • \n
  • In for loops that access loop attributes, the iterator is not advanced ahead of the current iteration unless length, revindex, nextitem, or last are accessed. This makes it less likely to break groupby results. 555, 1101
  • \n
  • In async environments, the loop attributes length and revindex work for async iterators. 1101
  • \n
  • In async environments, values from attribute/property access will be awaited if needed. 1101
  • \n
  • ~loader.PackageLoader doesn't depend on setuptools or pkg_resources. 970
  • \n
  • PackageLoader has limited support for 420 namespace packages. 1097
  • \n
  • Support os.PathLike objects in ~loader.FileSystemLoader and ~loader.ModuleLoader. 870
  • \n
  • ~nativetypes.NativeTemplate correctly handles quotes between expressions. "'{{ a }}', '{{ b }}'" renders as the tuple ('1', '2') rather than the string '1, 2'. 1020
  • \n
  • Creating a ~nativetypes.NativeTemplate directly creates a ~nativetypes.NativeEnvironment instead of a default Environment. 1091
  • \n
  • After calling LRUCache.copy(), the copy's queue methods point to the correct queue. 843
  • \n
  • Compiling templates always writes UTF-8 instead of defaulting to the system encoding. 889
  • \n
  • |wordwrap filter treats existing newlines as separate paragraphs to be wrapped individually, rather than creating short intermediate lines. 175
  • \n
  • Add break_on_hyphens parameter to |wordwrap filter. 550
  • \n
  • Cython compiled functions decorated as context functions will be passed the context. 1108
  • \n
  • When chained comparisons of constants are evaluated at compile time, the result follows Python's behavior of returning False if any comparison returns False, rather than only the last one. 1102
  • \n
  • Tracebacks for exceptions in templates show the correct line numbers and source for Python >= 3.7. 1104
  • \n
  • Tracebacks for template syntax errors in Python 3 no longer show internal compiler frames. 763
  • \n
  • Add a DerivedContextReference node that can be used by extensions to get the current context and local variables such as loop. 860
  • \n
  • Constant folding during compilation is applied to some node types that were previously overlooked. 733
  • \n
  • TemplateSyntaxError.source is not empty when raised from an included template. 457
  • \n
\n ... (truncated)\n
\n
\n
\nCommits\n
    \n
  • b85283e release version 2.11.1
  • \n
  • 3d5bfc6 Merge pull request #1143 from pallets/bugfix/attribute-access
  • \n
  • d61c1ea add changelog
  • \n
  • 15d7e61 Added regression test for slicing of attributes
  • \n
  • 05dee9b Fix attribute access in async code. Fixes #1141
  • \n
  • bbdafe3 release version 2.11.0
  • \n
  • 9ff27f6 add python 3.8 classifier, clean up changelog
  • \n
  • d312609 isolate bytecode cache tests
  • \n
  • 9849979 import Markup from markupsafe, fix flake8 import warnings
  • \n
  • c6d864c increment bytecode cache version
  • \n
  • Additional commits viewable in compare view
  • \n
\n
\n
\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n**Note:** This repo was added to Dependabot recently, so you'll receive a maximum of 5 PRs for your first few update runs. Once an update run creates fewer than 5 PRs we'll remove that limit.\n\nYou can always request more updates by clicking `Bump now` in your [Dependabot dashboard](https://app.dependabot.com).\n\n
\nDependabot commands and options\n
\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language\n- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language\n- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language\n- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language\n- `@dependabot badge me` will comment on this PR with code to add a \"Dependabot enabled\" badge to your readme\n\nAdditionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com):\n- Update frequency (including time of day and day of week)\n- Pull request limits (per update run and/or open at any time)\n- Out-of-range updates (receive only lockfile updates, if desired)\n- Security updates (receive only security updates, if desired)\n\n\n\n
", "created_at": "2020-04-08T01:25:24Z", "updated_at": "2020-05-04T17:13:26Z", "closed_at": "2020-05-04T17:13:16Z", "merged_at": "2020-05-04T17:13:16Z", "merge_commit_sha": "aa064de3f400899dbf61f2d33a035fba4017596c", "assignee": null, "milestone": null, "draft": 0, "head": "0a503b7fdb0cce1bb82e18c4552a4f92808fe41f", "base": "d55fe8cdfc2ce7bc6960bf2507766c1fcd1d31a7", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/722", "merged_by": null, "auto_merge": null} {"id": 402645984, "node_id": "MDExOlB1bGxSZXF1ZXN0NDAyNjQ1OTg0", "number": 725, "state": "closed", "locked": 0, "title": "Update aiofiles requirement from ~=0.4.0 to >=0.4,<0.6", "user": {"value": 27856297, "label": "dependabot-preview[bot]"}, "body": "Updates the requirements on [aiofiles](https://github.com/Tinche/aiofiles) to permit the latest version.\n
\nCommits\n\n
\n
\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n
\nDependabot commands and options\n
\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language\n- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language\n- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language\n- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language\n- `@dependabot badge me` will comment on this PR with code to add a \"Dependabot enabled\" badge to your readme\n\nAdditionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com):\n- Update frequency (including time of day and day of week)\n- Pull request limits (per update run and/or open at any time)\n- Out-of-range updates (receive only lockfile updates, if desired)\n- Security updates (receive only security updates, if desired)\n\n\n\n
", "created_at": "2020-04-13T13:32:47Z", "updated_at": "2020-05-04T18:16:54Z", "closed_at": "2020-05-04T16:17:49Z", "merged_at": "2020-05-04T16:17:49Z", "merge_commit_sha": "985e59493e44d6fcebf7a30f693f4edecee3e90d", "assignee": null, "milestone": null, "draft": 0, "head": "a7053e8d17559a6ebb4265c0783b84cc6aaff7e2", "base": "d349d57cdf3d577afb62bdf784af342a4d5be660", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/725", "merged_by": null, "auto_merge": null} {"id": 406067019, "node_id": "MDExOlB1bGxSZXF1ZXN0NDA2MDY3MDE5", "number": 728, "state": "closed", "locked": 0, "title": "Update mergedeep requirement from ~=1.1.1 to >=1.1.1,<1.4.0", "user": {"value": 27856297, "label": "dependabot-preview[bot]"}, "body": "Updates the requirements on [mergedeep](https://github.com/clarketm/mergedeep) to permit the latest version.\n
\nCommits\n
    \n
  • 3d6e7b4 v1.3.0 - support additive merging of Counter types
  • \n
  • 56a258a v1.2.1 - tidy docs and variable names
  • \n
  • 61ab213 v1.2.0 - support both TYPESAFE_REPLACE and TYPESAFE_ADDITIVE merge strategies...
  • \n
  • b331bb5 cleanup Makefile
  • \n
  • 6f577bf officially label support for python3.8
  • \n
  • 84faf37 use pipenv for managing dev dependencies
  • \n
  • 3a8761a Update README.md
  • \n
  • See full diff in compare view
  • \n
\n
\n
\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n
\nDependabot commands and options\n
\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language\n- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language\n- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language\n- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language\n- `@dependabot badge me` will comment on this PR with code to add a \"Dependabot enabled\" badge to your readme\n\nAdditionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com):\n- Update frequency (including time of day and day of week)\n- Pull request limits (per update run and/or open at any time)\n- Out-of-range updates (receive only lockfile updates, if desired)\n- Security updates (receive only security updates, if desired)\n\n\n\n
", "created_at": "2020-04-20T13:33:23Z", "updated_at": "2020-05-04T16:45:58Z", "closed_at": "2020-05-04T16:45:49Z", "merged_at": "2020-05-04T16:45:49Z", "merge_commit_sha": "e232f77055880b38cc0b738607cd50cde9188eaf", "assignee": null, "milestone": null, "draft": 0, "head": "b584fbc4215d92df08360937916ffe128f11f72e", "base": "985e59493e44d6fcebf7a30f693f4edecee3e90d", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/728", "merged_by": null, "auto_merge": null} {"id": 406677205, "node_id": "MDExOlB1bGxSZXF1ZXN0NDA2Njc3MjA1", "number": 730, "state": "closed", "locked": 0, "title": "Update pytest-asyncio requirement from ~=0.10.0 to >=0.10,<0.12", "user": {"value": 27856297, "label": "dependabot-preview[bot]"}, "body": "Updates the requirements on [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) to permit the latest version.\n
\nCommits\n
    \n
  • 1026c39 0.11.0
  • \n
  • ab2b140 Test on Python 3.8, drop 3.3 and 3.4
  • \n
  • 6397a22 plugin: Use pytest 5.4.0 new Function API
  • \n
  • 21a0f94 Replace yield_fixture() by fixture()
  • \n
  • 964b295 Added min hypothesis version so that bugfix for https://github.com/Hypothesis...
  • \n
  • 4a11a20 Add max supported pytest version to < 5.4.0 to prevent fails until #141 is fi...
  • \n
  • b305594 Change event_loop to module scope in hypothesis tests, fixing #145.
  • \n
  • d5a0f47 Enable test_subprocess to be run on win, by changing to ProactorEventLoop in ...
  • \n
  • d07cd2d Fix required pytest version
  • \n
  • 86cd9a6 Handle BaseExceptions from loop.run_until_complete (#126)
  • \n
  • Additional commits viewable in compare view
  • \n
\n
\n
\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n
\nDependabot commands and options\n
\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language\n- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language\n- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language\n- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language\n- `@dependabot badge me` will comment on this PR with code to add a \"Dependabot enabled\" badge to your readme\n\nAdditionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com):\n- Update frequency (including time of day and day of week)\n- Pull request limits (per update run and/or open at any time)\n- Out-of-range updates (receive only lockfile updates, if desired)\n- Security updates (receive only security updates, if desired)\n\n\n\n
", "created_at": "2020-04-21T13:32:35Z", "updated_at": "2020-05-04T13:27:24Z", "closed_at": "2020-05-04T13:27:23Z", "merged_at": null, "merge_commit_sha": "460708c7107a7cf15971a9aa1040635f6bc1be6d", "assignee": null, "milestone": null, "draft": 0, "head": "11c67f82cdccc6e34cbff717e673451ac6172ef4", "base": "15e232180427e988174fdf88440c84b91d2d98d1", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/730", "merged_by": null, "auto_merge": null} {"id": 407929128, "node_id": "MDExOlB1bGxSZXF1ZXN0NDA3OTI5MTI4", "number": 734, "state": "closed", "locked": 0, "title": "Update janus requirement from ~=0.4.0 to >=0.4,<0.6", "user": {"value": 27856297, "label": "dependabot-preview[bot]"}, "body": "Updates the requirements on [janus](https://github.com/aio-libs/janus) to permit the latest version.\n
\nChangelog\n

Sourced from janus's changelog.

\n
\n

0.5.0 (2020-04-23)

\n
    \n
  • Remove explicit loop arguments and forbid creating queues outside event loops #246
  • \n
\n

0.4.0 (2018-07-28)

\n
    \n
  • Add py.typed macro #89
  • \n
  • Drop python 3.4 support and fix minimal version python3.5.3 #88
  • \n
  • Add property with that indicates if queue is closed #86
  • \n
\n

0.3.2 (2018-07-06)

\n
    \n
  • Fixed python 3.7 support #97
  • \n
\n

0.3.1 (2018-01-30)

\n
    \n
  • Fixed bug with join() in case tasks are added by sync_q.put() #75
  • \n
\n

0.3.0 (2017-02-21)

\n
    \n
  • Expose unfinished_tasks property #34
  • \n
\n

0.2.4 (2016-12-05)

\n
    \n
  • Restore tarball deploying
  • \n
\n

0.2.3 (2016-07-12)

\n
    \n
  • Fix exception type
  • \n
\n

0.2.2 (2016-07-11)

\n
    \n
  • Update asyncio.async() to use asyncio.ensure_future() #6
  • \n
\n

0.2.1 (2016-03-24)

\n
    \n
  • Fix python setup.py test command #4
  • \n
\n

0.2.0 (2015-09-20)

\n ... (truncated)\n
\n
\n
\nCommits\n
    \n
  • 8e89b45 Bump to 0.5.0
  • \n
  • ec8592b Fix up Python 3.8 loop argument warnings (#246)
  • \n
  • 2543af6 Bump coverage from 5.0.4 to 5.1
  • \n
  • 03d1b36 Bump tox from 3.14.5 to 3.14.6
  • \n
  • 8219c38 Bump coverage from 5.0.3 to 5.0.4
  • \n
  • 85ec71d Bump pytest from 5.4.0 to 5.4.1
  • \n
  • 3b974c9 Bump pytest from 5.3.5 to 5.4.0
  • \n
  • 282dc12 Bump mypy from 0.761 to 0.770
  • \n
  • 1364fb3 Bump tox from 3.14.4 to 3.14.5
  • \n
  • dc519bb Bump tox from 3.14.3 to 3.14.4
  • \n
  • Additional commits viewable in compare view
  • \n
\n
\n
\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n
\nDependabot commands and options\n
\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language\n- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language\n- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language\n- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language\n- `@dependabot badge me` will comment on this PR with code to add a \"Dependabot enabled\" badge to your readme\n\nAdditionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com):\n- Update frequency (including time of day and day of week)\n- Pull request limits (per update run and/or open at any time)\n- Out-of-range updates (receive only lockfile updates, if desired)\n- Security updates (receive only security updates, if desired)\n\n\n\n
", "created_at": "2020-04-23T13:43:45Z", "updated_at": "2020-05-04T16:48:14Z", "closed_at": "2020-05-04T16:48:04Z", "merged_at": "2020-05-04T16:48:04Z", "merge_commit_sha": "109c5a430d53fe38b1300e0daa20f5cef047a08e", "assignee": null, "milestone": null, "draft": 0, "head": "281b2c1acf1a2ef39c784dc73f1eb184d898d369", "base": "e232f77055880b38cc0b738607cd50cde9188eaf", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/734", "merged_by": null, "auto_merge": null} {"id": 412951191, "node_id": "MDExOlB1bGxSZXF1ZXN0NDEyOTUxMTkx", "number": 753, "state": "closed", "locked": 0, "title": "Update pytest-asyncio requirement from ~=0.10.0 to >=0.10,<0.13", "user": {"value": 27856297, "label": "dependabot-preview[bot]"}, "body": "Updates the requirements on [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) to permit the latest version.\n
\nCommits\n
    \n
  • b8e2a45 0.12.0
  • \n
  • 06580c6 Update changelog
  • \n
  • b45de23 Fixed failing test case, 'test_asyncio_marker_without_loop'.
  • \n
  • 238cced Put event_loop first among the fixtures of asyncio tests, fixes #154.
  • \n
  • e5e3dc7 Added unittests for issue #154.
  • \n
  • a7e5795 0.12.0 open for business!
  • \n
  • 1026c39 0.11.0
  • \n
  • ab2b140 Test on Python 3.8, drop 3.3 and 3.4
  • \n
  • 6397a22 plugin: Use pytest 5.4.0 new Function API
  • \n
  • 21a0f94 Replace yield_fixture() by fixture()
  • \n
  • Additional commits viewable in compare view
  • \n
\n
\n
\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n
\nDependabot commands and options\n
\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language\n- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language\n- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language\n- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language\n- `@dependabot badge me` will comment on this PR with code to add a \"Dependabot enabled\" badge to your readme\n\nAdditionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com):\n- Update frequency (including time of day and day of week)\n- Pull request limits (per update run and/or open at any time)\n- Out-of-range updates (receive only lockfile updates, if desired)\n- Security updates (receive only security updates, if desired)\n\n\n\n
", "created_at": "2020-05-04T13:27:19Z", "updated_at": "2020-05-04T17:41:01Z", "closed_at": "2020-05-04T17:40:49Z", "merged_at": "2020-05-04T17:40:49Z", "merge_commit_sha": "b314e088c59425122fb2b2abde8741010d9d274a", "assignee": null, "milestone": null, "draft": 0, "head": "877fb569d2ae460ce845c7c855b02e0cdac23b68", "base": "707fe039947b3e48f2b6dcfe8e577d76b617f2a5", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/753", "merged_by": null, "auto_merge": null} {"id": 434085235, "node_id": "MDExOlB1bGxSZXF1ZXN0NDM0MDg1MjM1", "number": 848, "state": "closed", "locked": 0, "title": "Reload support for config_dir mode.", "user": {"value": 49260, "label": "amjith"}, "body": "A reference implementation for adding support to reload when datasette is in the config_dir mode. \r\n\r\nThis implementation is flawed since it is watching the entire directory and any changes to the database will reload the server and adding unrelated files to the directory will also reload the server. ", "created_at": "2020-06-14T02:34:46Z", "updated_at": "2020-07-03T02:44:54Z", "closed_at": "2020-07-03T02:44:53Z", "merged_at": null, "merge_commit_sha": "888538efdbf545c0df524ca590a17fb6c6fa2419", "assignee": null, "milestone": null, "draft": 0, "head": "0d100d15aca93fae200b3bc2e29dfd60aaa4b384", "base": "57879dc8b346a435804a9e45ffaacbf2a0228bc6", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/848", "merged_by": null, "auto_merge": null} {"id": 439203808, "node_id": "MDExOlB1bGxSZXF1ZXN0NDM5MjAzODA4", "number": 866, "state": "closed", "locked": 0, "title": "Update pytest-asyncio requirement from <0.13,>=0.10 to >=0.10,<0.15", "user": {"value": 27856297, "label": "dependabot-preview[bot]"}, "body": "Updates the requirements on [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) to permit the latest version.\n
\nCommits\n
    \n
  • 53f3da7 Prepare for release
  • \n
  • e99569d A line is added to the changelog.
  • \n
  • 4099b63 One import is not needed
  • \n
  • 68513b3 Clarify names and comments, according to yanlend comments 26 May
  • \n
  • 907e8f2 FIX new test_cases on python 3.5 & 3.6
  • \n
  • 51d986c To solve test cases that fail:
  • \n
  • f97e900 1) Test case (test_async_fixtures_with_finalizer) refactoring to pass on pyth...
  • \n
  • c1131f8 1) A new test case that fails with 0.12.0, and pass with this commit.
  • \n
  • 7a255bc 0.13.0 open for business
  • \n
  • b8e2a45 0.12.0
  • \n
  • Additional commits viewable in compare view
  • \n
\n
\n
\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n
\nDependabot commands and options\n
\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language\n- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language\n- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language\n- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language\n- `@dependabot badge me` will comment on this PR with code to add a \"Dependabot enabled\" badge to your readme\n\nAdditionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com):\n- Update frequency (including time of day and day of week)\n- Pull request limits (per update run and/or open at any time)\n- Out-of-range updates (receive only lockfile updates, if desired)\n- Security updates (receive only security updates, if desired)\n\n\n\n
", "created_at": "2020-06-24T13:21:47Z", "updated_at": "2020-06-24T18:50:57Z", "closed_at": "2020-06-24T18:50:56Z", "merged_at": "2020-06-24T18:50:56Z", "merge_commit_sha": "1bb33dab49fd25f77b9f8e7ab7ee23b3d64c123c", "assignee": null, "milestone": null, "draft": 0, "head": "fb64dda76dda7354a77cb50c5864aff67a6fef8d", "base": "1a5b7d318fa923edfcefd3df8f64dae2e9c49d3f", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/866", "merged_by": null, "auto_merge": null} {"id": 442505088, "node_id": "MDExOlB1bGxSZXF1ZXN0NDQyNTA1MDg4", "number": 883, "state": "open", "locked": 0, "title": "Skip counting hidden tables", "user": {"value": 3243482, "label": "abdusco"}, "body": "Potential fix for https://github.com/simonw/datasette/issues/859.\r\n\r\nDisabling table counts for hidden tables speeds up database page quite a bit. In my setup it reduced load time by 2/3 (~300 -> ~90ms)", "created_at": "2020-07-01T07:38:08Z", "updated_at": "2020-07-02T00:25:44Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "527624338acd38b97bb33b0a0b913d80e8345fee", "assignee": null, "milestone": null, "draft": 0, "head": "251884f58895faf8056b3dfdeae3bb92c5bc58ac", "base": "676bb64c877d73f8ff496cef4632f5a8a5a9283c", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/883", "merged_by": null, "auto_merge": null} {"id": 443823040, "node_id": "MDExOlB1bGxSZXF1ZXN0NDQzODIzMDQw", "number": 890, "state": "closed", "locked": 0, "title": "Load only python files from plugins-dir.", "user": {"value": 49260, "label": "amjith"}, "body": "The current behavior for `--plugins-dir` is to load every file in that folder as a python module. This can result in errors if there are non-python files in the plugins dir (such as .mypy_cache). \r\n\r\nThis PR restricts the module loading to only python files. ", "created_at": "2020-07-03T02:47:32Z", "updated_at": "2020-07-03T03:08:33Z", "closed_at": "2020-07-03T03:08:33Z", "merged_at": "2020-07-03T03:08:33Z", "merge_commit_sha": "ea99a4431ce5bc2d65a3496da5b38e1986550a96", "assignee": null, "milestone": null, "draft": 0, "head": "745af3b72d95d91f3ccd703f4fab819bc9f4b6a4", "base": "57879dc8b346a435804a9e45ffaacbf2a0228bc6", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/890", "merged_by": null, "auto_merge": null} {"id": 453890292, "node_id": "MDExOlB1bGxSZXF1ZXN0NDUzODkwMjky", "number": 901, "state": "closed", "locked": 0, "title": "Use None as a default arg", "user": {"value": 56323389, "label": "Alyetama"}, "body": "When passing a mutable value as a default argument in a function, the default argument is mutated anytime that value is mutated. This poses a bug risk. Instead, use None as a default and assign the mutable value inside the function.", "created_at": "2020-07-20T22:18:38Z", "updated_at": "2020-07-31T18:42:39Z", "closed_at": "2020-07-31T18:42:39Z", "merged_at": "2020-07-31T18:42:39Z", "merge_commit_sha": "2d7fa8b9058dfbf9c7c371cdeec115d32a177dc9", "assignee": null, "milestone": null, "draft": 0, "head": "1285f28d82d9ca97e7543bb87fc6ff462855debe", "base": "d9a5ef1c32a4390e398653ebfd570f8e1a03d93e", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/901", "merged_by": null, "auto_merge": null} {"id": 453995179, "node_id": "MDExOlB1bGxSZXF1ZXN0NDUzOTk1MTc5", "number": 902, "state": "closed", "locked": 0, "title": "Don't install tests package", "user": {"value": 32467826, "label": "abeyerpath"}, "body": "The `exclude` argument to `find_packages` needs an iterable of package\r\nnames.\r\n\r\nFixes: #456 ", "created_at": "2020-07-21T01:08:50Z", "updated_at": "2020-07-24T20:39:54Z", "closed_at": "2020-07-24T20:39:54Z", "merged_at": "2020-07-24T20:39:54Z", "merge_commit_sha": "6be5654ffab282e8cf39cc138ba2d4496ebc7407", "assignee": null, "milestone": null, "draft": 0, "head": "9aa139dc98bd72a29ee1c940820bc05b0e717f1d", "base": "d9a5ef1c32a4390e398653ebfd570f8e1a03d93e", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/902", "merged_by": null, "auto_merge": null} {"id": 458435592, "node_id": "MDExOlB1bGxSZXF1ZXN0NDU4NDM1NTky", "number": 910, "state": "closed", "locked": 0, "title": "Update pytest requirement from <5.5.0,>=5.2.2 to >=5.2.2,<6.1.0", "user": {"value": 27856297, "label": "dependabot-preview[bot]"}, "body": "Updates the requirements on [pytest](https://github.com/pytest-dev/pytest) to permit the latest version.\n
\nRelease notes\n

Sourced from pytest's releases.

\n
\n

6.0.0

\n

pytest 6.0.0 (2020-07-28)

\n

(Please see the full set of changes for this release also in the 6.0.0rc1 notes below)

\n

Breaking Changes

\n
    \n
  • \n

    #5584: PytestDeprecationWarning are now errors by default.

    \n

    Following our plan to remove deprecated features with as little disruption as\npossible, all warnings of type PytestDeprecationWarning now generate errors\ninstead of warning messages.

    \n

    The affected features will be effectively removed in pytest 6.1, so please consult the\nDeprecations and Removals\nsection in the docs for directions on how to update existing code.

    \n

    In the pytest 6.0.X series, it is possible to change the errors back into warnings as a\nstopgap measure by adding this to your pytest.ini file:

    \n
    [pytest]\nfilterwarnings =\n    ignore::pytest.PytestDeprecationWarning\n
    \n

    But this will stop working when pytest 6.1 is released.

    \n

    If you have concerns about the removal of a specific feature, please add a\ncomment to #5584.

    \n
  • \n
  • \n

    #7472: The exec_() and is_true() methods of _pytest._code.Frame have been removed.

    \n
  • \n
\n

Features

\n
    \n
  • #7464: Added support for NO_COLOR and FORCE_COLOR environment variables to control colored output.
  • \n
\n

Improvements

\n
    \n
  • #7467: --log-file CLI option and log_file ini marker now create subdirectories if needed.
  • \n
  • #7489: The pytest.raises function has a clearer error message when match equals the obtained string but is not a regex match. In this case it is suggested to escape the regex.
  • \n
\n

Bug Fixes

\n
    \n
  • #7392: Fix the reported location of tests skipped with @pytest.mark.skip when --runxfail is used.
  • \n
\n\n
\n
\n
\nChangelog\n

Sourced from pytest's changelog.

\n
\n
\nCommits\n
    \n
  • 41a4539 Add link to 6.0.0rc1 changelog
  • \n
  • 45ced1d Update doc/en/announce/release-6.0.0.rst
  • \n
  • 1e4b8d4 Prepare release version 6.0.0
  • \n
  • 3802982 Support generating major releases using issue comments (#7548)
  • \n
  • c2c0b7a Merge pull request #7545 from asottile/pylib_in_docs
  • \n
  • 9818899 remove usage of pylib in docs
  • \n
  • 3a060b7 Revert change to traceback repr (#7535)
  • \n
  • 7ec6401 Change pytest deprecation warnings into errors for 6.0 release (#7362)
  • \n
  • a9799f0 Merge pull request #7531 from bluetech/changelog-mypy-version
  • \n
  • 102360b Merge pull request #7519 from hroncok/pytest_warning_captured_deprecated
  • \n
  • Additional commits viewable in compare view
  • \n
\n
\n
\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n
\nDependabot commands and options\n
\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language\n- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language\n- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language\n- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language\n- `@dependabot badge me` will comment on this PR with code to add a \"Dependabot enabled\" badge to your readme\n\nAdditionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com):\n- Update frequency (including time of day and day of week)\n- Pull request limits (per update run and/or open at any time)\n- Out-of-range updates (receive only lockfile updates, if desired)\n- Security updates (receive only security updates, if desired)\n\n\n\n
", "created_at": "2020-07-29T13:21:17Z", "updated_at": "2020-07-29T21:26:05Z", "closed_at": "2020-07-29T21:26:04Z", "merged_at": "2020-07-29T21:26:04Z", "merge_commit_sha": "c5c12a797f0b81cd5862dcd50354b4b571e9bf5a", "assignee": null, "milestone": null, "draft": 0, "head": "3493915bbce6a279659df3d6b09ba0d36a8f9793", "base": "3c33b421320c0be81a625ca7307b2e4416a9ed5b", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/910", "merged_by": null, "auto_merge": null} {"id": 474703007, "node_id": "MDExOlB1bGxSZXF1ZXN0NDc0NzAzMDA3", "number": 952, "state": "closed", "locked": 0, "title": "Update black requirement from ~=19.10b0 to >=19.10,<21.0", "user": {"value": 27856297, "label": "dependabot-preview[bot]"}, "body": "Updates the requirements on [black](https://github.com/psf/black) to permit the latest version.\n
\nChangelog\n

Sourced from black's changelog.

\n
\n

20.8b1

\n

Packaging

\n
    \n
  • explicitly depend on Click 7.1.2 or newer as Black no longer works with versions\nolder than 7.0
  • \n
\n

20.8b0

\n

Black

\n
    \n
  • \n

    re-implemented support for explicit trailing commas: now it works consistently within\nany bracket pair, including nested structures (#1288 and duplicates)

    \n
  • \n
  • \n

    Black now reindents docstrings when reindenting code around it (#1053)

    \n
  • \n
  • \n

    Black now shows colored diffs (#1266)

    \n
  • \n
  • \n

    Black is now packaged using 'py3' tagged wheels (#1388)

    \n
  • \n
  • \n

    Black now supports Python 3.8 code, e.g. star expressions in return statements\n(#1121)

    \n
  • \n
  • \n

    Black no longer normalizes capital R-string prefixes as those have a\ncommunity-accepted meaning (#1244)

    \n
  • \n
  • \n

    Black now uses exit code 2 when specified configuration file doesn't exit (#1361)

    \n
  • \n
  • \n

    Black now works on AWS Lambda (#1141)

    \n
  • \n
  • \n

    added --force-exclude argument (#1032)

    \n
  • \n
  • \n

    removed deprecated --py36 option (#1236)

    \n
  • \n
  • \n

    fixed --diff output when EOF is encountered (#526)

    \n
  • \n
  • \n

    fixed # fmt: off handling around decorators (#560)

    \n
  • \n
  • \n

    fixed unstable formatting with some # type: ignore comments (#1113)

    \n
  • \n
  • \n

    fixed invalid removal on organizing brackets followed by indexing (#1575)

    \n
  • \n
  • \n

    introduced black-primer, a CI tool that allows us to run regression tests against\nexisting open source users of Black (#1402)

    \n
  • \n
  • \n

    introduced property-based fuzzing to our test suite based on Hypothesis and\nHypothersmith (#1566)

    \n
  • \n
  • \n

    implemented experimental and disabled by default long string rewrapping (#1132),\nhidden under a --experimental-string-processing flag while it's being worked on;

    \n
  • \n
\n\n
\n
\n
\nCommits\n\n
\n
\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n
\nDependabot commands and options\n
\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language\n- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language\n- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language\n- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language\n- `@dependabot badge me` will comment on this PR with code to add a \"Dependabot enabled\" badge to your readme\n\nAdditionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com):\n- Update frequency (including time of day and day of week)\n- Pull request limits (per update run and/or open at any time)\n- Out-of-range updates (receive only lockfile updates, if desired)\n- Security updates (receive only security updates, if desired)\n\n\n\n
", "created_at": "2020-08-27T13:31:36Z", "updated_at": "2020-09-02T22:26:17Z", "closed_at": "2020-09-02T22:26:16Z", "merged_at": null, "merge_commit_sha": "37f8531b321855bdbc58960281957febaa59e4b9", "assignee": null, "milestone": null, "draft": 0, "head": "7b1354706467136f5030504fe799201b13333a95", "base": "86aefc39c5aca01b00dbc57ba386a6743c21fb46", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/952", "merged_by": null, "auto_merge": null} {"id": 494146043, "node_id": "MDExOlB1bGxSZXF1ZXN0NDk0MTQ2MDQz", "number": 977, "state": "closed", "locked": 0, "title": "Update pytest requirement from <6.1.0,>=5.2.2 to >=5.2.2,<6.2.0", "user": {"value": 27856297, "label": "dependabot-preview[bot]"}, "body": "Updates the requirements on [pytest](https://github.com/pytest-dev/pytest) to permit the latest version.\n
\nRelease notes\n

Sourced from pytest's releases.

\n
\n

6.1.0

\n

pytest 6.1.0 (2020-09-26)

\n

Breaking Changes

\n
    \n
  • \n

    #5585: As per our policy, the following features which have been deprecated in the 5.X series are now\nremoved:

    \n
      \n
    • The funcargnames read-only property of FixtureRequest, Metafunc, and Function classes. Use fixturenames attribute.
    • \n
    • @pytest.fixture no longer supports positional arguments, pass all arguments by keyword instead.
    • \n
    • Direct construction of Node subclasses now raise an error, use from_parent instead.
    • \n
    • The default value for junit_family has changed to xunit2. If you require the old format, add junit_family=xunit1 to your configuration file.
    • \n
    • The TerminalReporter no longer has a writer attribute. Plugin authors may use the public functions of the TerminalReporter instead of accessing the TerminalWriter object directly.
    • \n
    • The --result-log option has been removed. Users are recommended to use the pytest-reportlog plugin instead.
    • \n
    \n

    For more information consult\nDeprecations and Removals in the docs.

    \n
  • \n
\n

Deprecations

\n
    \n
  • \n

    #6981: The pytest.collect module is deprecated: all its names can be imported from pytest directly.

    \n
  • \n
  • \n

    #7097: The pytest._fillfuncargs function is deprecated. This function was kept\nfor backward compatibility with an older plugin.

    \n

    It's functionality is not meant to be used directly, but if you must replace\nit, use function._request._fillfixtures() instead, though note this is not\na public API and may break in the future.

    \n
  • \n
  • \n

    #7210: The special -k '-expr' syntax to -k is deprecated. Use -k 'not expr'\ninstead.

    \n

    The special -k 'expr:' syntax to -k is deprecated. Please open an issue\nif you use this and want a replacement.

    \n
  • \n
  • \n

    #7255: The pytest_warning_captured <_pytest.hookspec.pytest_warning_captured> hook is deprecated in favor\nof pytest_warning_recorded <_pytest.hookspec.pytest_warning_recorded>, and will be removed in a future version.

    \n
  • \n
  • \n

    #7648: The gethookproxy() and isinitpath() methods of FSCollector and Package are deprecated;\nuse self.session.gethookproxy() and self.session.isinitpath() instead.\nThis should work on all pytest versions.

    \n
  • \n
\n

Features

\n
    \n
  • #7667: New --durations-min command-line flag controls the minimal duration for inclusion in the slowest list of tests shown by --durations. Previously this was hard-coded to 0.005s.
  • \n
\n

Improvements

\n\n
\n
\n
\nChangelog\n

Sourced from pytest's changelog.

\n
\n
\nCommits\n
    \n
  • 868bc00 Prepare release version 6.1.0
  • \n
  • 0b327cc Merge pull request #7796 from bluetech/changelog-cleanups
  • \n
  • d3c746e changelog: some consistency cleanups
  • \n
  • d3f47bf Improved 'Declaring new hooks' section in docs. (#7782)
  • \n
  • 3db2489 Merge pull request #7784 from nicoddemus/use-new-pip-solver-7783
  • \n
  • 8215625 Use new pip resolver in plugins tox env
  • \n
  • 5cfd7c0 Merge pull request #7780 from bluetech/final
  • \n
  • a99ca87 Mark some public and to-be-public classes as @final
  • \n
  • 050c2df Use multiple issue template types and mention Discussions (#7739)
  • \n
  • cdfdb3a Add docs about reusing fixtures from other projects (#7772)
  • \n
  • Additional commits viewable in compare view
  • \n
\n
\n
\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n
\nDependabot commands and options\n
\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language\n- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language\n- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language\n- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language\n- `@dependabot badge me` will comment on this PR with code to add a \"Dependabot enabled\" badge to your readme\n\nAdditionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com):\n- Update frequency (including time of day and day of week)\n- Pull request limits (per update run and/or open at any time)\n- Out-of-range updates (receive only lockfile updates, if desired)\n- Security updates (receive only security updates, if desired)\n\n\n\n
", "created_at": "2020-09-28T13:33:05Z", "updated_at": "2020-09-28T22:16:36Z", "closed_at": "2020-09-28T22:16:35Z", "merged_at": "2020-09-28T22:16:35Z", "merge_commit_sha": "1f021c37110fc9019b0ef70062c28c335e568ae2", "assignee": null, "milestone": null, "draft": 0, "head": "5c01344a0ee3e0e7ad59e1cd8b0e63c976be71ee", "base": "9a6d0dce282e7fb58c5610e24c74098c923abfdc", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/977", "merged_by": null, "auto_merge": null} {"id": 498630708, "node_id": "MDExOlB1bGxSZXF1ZXN0NDk4NjMwNzA4", "number": 995, "state": "closed", "locked": 0, "title": "Document setting Google Cloud SDK properties", "user": {"value": 110420, "label": "ghing"}, "body": "Document setting Google Cloud SDK properties to avoid having to respond to interactive prompts when running `datasette publish cloudrun`.", "created_at": "2020-10-06T15:18:01Z", "updated_at": "2020-10-08T23:55:30Z", "closed_at": "2020-10-06T16:25:38Z", "merged_at": "2020-10-06T16:25:38Z", "merge_commit_sha": "ca5ba6b77b4c973fa7ba91008a2e99debfa306b4", "assignee": null, "milestone": {"value": 5971510, "label": "Datasette 0.50"}, "draft": 0, "head": "aed2cf9f470bdc0b704ee62032fe0dcb1e557e43", "base": "5a184a5d211d3226e0417ee5cf8476cd887cd35e", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/995", "merged_by": null, "auto_merge": null} {"id": 501579088, "node_id": "MDExOlB1bGxSZXF1ZXN0NTAxNTc5MDg4", "number": 1017, "state": "closed", "locked": 0, "title": "Update janus requirement from <0.6,>=0.4 to >=0.4,<0.7", "user": {"value": 27856297, "label": "dependabot-preview[bot]"}, "body": "Updates the requirements on [janus](https://github.com/aio-libs/janus) to permit the latest version.\n
\nChangelog\n

Sourced from janus's changelog.

\n
\n

Changes

\n

0.5.0 (2020-04-23)

\n
    \n
  • Remove explicit loop arguments and forbid creating queues outside event loops #246
  • \n
\n

0.4.0 (2018-07-28)

\n
    \n
  • Add py.typed macro #89
  • \n
  • Drop python 3.4 support and fix minimal version python3.5.3 #88
  • \n
  • Add property with that indicates if queue is closed #86
  • \n
\n

0.3.2 (2018-07-06)

\n
    \n
  • Fixed python 3.7 support #97
  • \n
\n

0.3.1 (2018-01-30)

\n
    \n
  • Fixed bug with join() in case tasks are added by sync_q.put() #75
  • \n
\n

0.3.0 (2017-02-21)

\n
    \n
  • Expose unfinished_tasks property #34
  • \n
\n

0.2.4 (2016-12-05)

\n
    \n
  • Restore tarball deploying
  • \n
\n

0.2.3 (2016-07-12)

\n
    \n
  • Fix exception type
  • \n
\n

0.2.2 (2016-07-11)

\n
    \n
  • Update asyncio.async() to use asyncio.ensure_future() #6
  • \n
\n

0.2.1 (2016-03-24)

\n
    \n
  • Fix python setup.py test command #4
  • \n
\n\n
\n
\n
\nCommits\n
    \n
  • d186724 Fix yaml
  • \n
  • dbb2d7b Fix deploy script
  • \n
  • 18df625 Bump to 0.6.0
  • \n
  • a50b7ec Test on ubuntu only, the library has no platform specific dependencies
  • \n
  • b599d94 Fix workflow
  • \n
  • 9897fca Setup github workflows
  • \n
  • cde6918 Drop Python 3.5, test on Python 3.9, format with black/isort
  • \n
  • 5f04d79 Support Python 3.9 officially
  • \n
  • ac23eb7 janus: remove unused type ignores (#287)
  • \n
  • 0da8f95 Make all tests non-skipped again
  • \n
  • Additional commits viewable in compare view
  • \n
\n
\n
\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n
\nDependabot commands and options\n
\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language\n- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language\n- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language\n- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language\n- `@dependabot badge me` will comment on this PR with code to add a \"Dependabot enabled\" badge to your readme\n\nAdditionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com):\n- Update frequency (including time of day and day of week)\n- Pull request limits (per update run and/or open at any time)\n- Out-of-range updates (receive only lockfile updates, if desired)\n- Security updates (receive only security updates, if desired)\n\n\n\n
", "created_at": "2020-10-12T13:29:46Z", "updated_at": "2020-10-14T21:52:08Z", "closed_at": "2020-10-14T21:52:07Z", "merged_at": "2020-10-14T21:52:07Z", "merge_commit_sha": "7f2edb5dd2074dce0090659021991695a984844b", "assignee": null, "milestone": null, "draft": 0, "head": "f30d9da06b02a53f880b6fe7a7af9d3ff719dede", "base": "acf07a67722aa74828744726187690b59d342494", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1017", "merged_by": null, "auto_merge": null} {"id": 501579315, "node_id": "MDExOlB1bGxSZXF1ZXN0NTAxNTc5MzE1", "number": 1018, "state": "closed", "locked": 0, "title": "Update asgiref requirement from ~=3.2.10 to >=3.2.10,<3.4.0", "user": {"value": 27856297, "label": "dependabot-preview[bot]"}, "body": "Updates the requirements on [asgiref](https://github.com/django/asgiref) to permit the latest version.\n
\nChangelog\n

Sourced from asgiref's changelog.

\n
\n

3.3.0 (2020-10-09)

\n
    \n
  • sync_to_async now defaults to thread-sensitive mode being on
  • \n
  • async_to_sync now works inside of forked processes
  • \n
  • WsgiToAsgi now correctly clamps its response body when Content-Length is set
  • \n
\n

3.2.10 (2020-08-18)

\n
    \n
  • Fixed bugs due to bad WeakRef handling introduced in 3.2.8
  • \n
\n

3.2.9 (2020-06-16)

\n
    \n
  • Fixed regression with exception handling in 3.2.8 related to the contextvars fix.
  • \n
\n

3.2.8 (2020-06-15)

\n
    \n
  • Fixed small memory leak in local.Local
  • \n
  • contextvars are now persisted through AsyncToSync
  • \n
\n

3.2.7 (2020-03-24)

\n
    \n
  • Bug fixed in local.Local where deleted Locals would occasionally inherit\ntheir storage into new Locals due to memory reuse.
  • \n
\n

3.2.6 (2020-03-23)

\n
    \n
  • local.Local now works in all threading situations, no longer requires\nperiodic garbage collection, and works with libraries that monkeypatch\nthreading (like gevent)
  • \n
\n

3.2.5 (2020-03-11)

\n
    \n
  • self is now preserved on methods by async_to_sync
  • \n
\n

3.2.4 (2020-03-10)

\n\n
\n
\n
\nCommits\n
    \n
  • 7dba5ff Releasing 3.3.0
  • \n
  • e1e0dd9 Added ZeroCopy extension
  • \n
  • 3834d13 Added rpc.py to Implementations (#198)
  • \n
  • 03b0dbb Clamped WsgiToAsgi response body using Content-Length value
  • \n
  • cfd82e4 Fix linting with unused import removal
  • \n
  • cc1877e Fix import sorting in previous commit.
  • \n
  • 7becc9d Making thread_sensitive=True the default
  • \n
  • 66a6e68 Fixed #194: Made async_to_sync work inside a fork
  • \n
  • 4ab9d8e Fixed #193: Bumped docs version to 3.0
  • \n
  • 1c9d063 Clarified "Optional" meaning (#190)
  • \n
  • Additional commits viewable in compare view
  • \n
\n
\n
\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n
\nDependabot commands and options\n
\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language\n- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language\n- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language\n- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language\n- `@dependabot badge me` will comment on this PR with code to add a \"Dependabot enabled\" badge to your readme\n\nAdditionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com):\n- Update frequency (including time of day and day of week)\n- Pull request limits (per update run and/or open at any time)\n- Out-of-range updates (receive only lockfile updates, if desired)\n- Security updates (receive only security updates, if desired)\n\n\n\n
", "created_at": "2020-10-12T13:30:09Z", "updated_at": "2020-10-14T21:51:36Z", "closed_at": "2020-10-14T21:51:35Z", "merged_at": "2020-10-14T21:51:35Z", "merge_commit_sha": "b4a8e70957517ff44d6a9121422d266a3c5fd664", "assignee": null, "milestone": null, "draft": 0, "head": "4b021be087d0dba2b4ac0b872b2512f5b2203397", "base": "acf07a67722aa74828744726187690b59d342494", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1018", "merged_by": null, "auto_merge": null} {"id": 503685077, "node_id": "MDExOlB1bGxSZXF1ZXN0NTAzNjg1MDc3", "number": 1022, "state": "closed", "locked": 0, "title": "Fix table name in spatialite example command", "user": {"value": 639012, "label": "jsfenfen"}, "body": "The example query for creating a new point geometry seems to be using a table called 'museums' but at one point it instead uses 'events'. I *believe* it is intended to be museums (the example makes more sense if so). ", "created_at": "2020-10-14T22:19:34Z", "updated_at": "2020-10-14T23:46:46Z", "closed_at": "2020-10-14T23:46:46Z", "merged_at": "2020-10-14T23:46:46Z", "merge_commit_sha": "4f7c0ebd85ccd8c1853d7aa0147628f7c1b749cc", "assignee": null, "milestone": null, "draft": 0, "head": "7cef70a5528af4626302729ff0ebc88d92b5f4ca", "base": "7f2edb5dd2074dce0090659021991695a984844b", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1022", "merged_by": null, "auto_merge": null} {"id": 505339515, "node_id": "MDExOlB1bGxSZXF1ZXN0NTA1MzM5NTE1", "number": 1029, "state": "closed", "locked": 0, "title": "fix(docs): broken link", "user": {"value": 17075617, "label": "jthodge"}, "body": "This PR fixes a broken markdown link in the `Publish` docs page.", "created_at": "2020-10-17T20:03:20Z", "updated_at": "2020-10-17T20:05:04Z", "closed_at": "2020-10-17T20:05:04Z", "merged_at": "2020-10-17T20:05:04Z", "merge_commit_sha": "568bd7bbf590861687db8c318f3d8cfcd1dfb47a", "assignee": null, "milestone": null, "draft": 0, "head": "a65d30e832d7e65adc65dcce8ab006227e4dafe4", "base": "4f7c0ebd85ccd8c1853d7aa0147628f7c1b749cc", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1029", "merged_by": null, "auto_merge": null} {"id": 507267087, "node_id": "MDExOlB1bGxSZXF1ZXN0NTA3MjY3MDg3", "number": 1038, "state": "closed", "locked": 0, "title": "DOC: Fix syntax error", "user": {"value": 194147, "label": "gerrymanoim"}, "body": "If I understand https://docs.datasette.io/en/stable/plugin_hooks.html#register-routes correctly, `register_routes` should return a `List[Tuple[str, Callable]]`. I believe the current code in documentation has a syntax error (extra `)`). ", "created_at": "2020-10-21T05:45:38Z", "updated_at": "2020-10-21T22:57:21Z", "closed_at": "2020-10-21T22:44:17Z", "merged_at": "2020-10-21T22:44:17Z", "merge_commit_sha": "6e26b057996c6f3fefa8ad528e2759e53c738844", "assignee": null, "milestone": null, "draft": 0, "head": "7fc0cce6a2d13ccc82c3584996acec236ae65df6", "base": "66120a7a1cb592e8a21164cf537f62a4d7ab1dfc", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1038", "merged_by": null, "auto_merge": null} {"id": 508719567, "node_id": "MDExOlB1bGxSZXF1ZXN0NTA4NzE5NTY3", "number": 1043, "state": "closed", "locked": 0, "title": "Include LICENSE in sdist", "user": {"value": 45380, "label": "bollwyvl"}, "body": "Hi, thanks for `datasette`! \r\n\r\nThis PR adds the `LICENSE` to source distributions, which seems the norm for Apache-2.0 stuff.\r\n\r\nI noticed the [0.50.2 sdist](https://files.pythonhosted.org/packages/f2/ba/1b5f182c3f1769c0863bcaa77406bdcb81c92e31bb579959c01b1d8951c0/datasette-0.50.2.tar.gz) doesn't ship `LICENSE`, but the 0.5.2 `whl` does, so I'm assuming the intent _is_ to ship... and it's a one-liner!\r\n\r\nMotivation: \r\n\r\nIt might be a bit of a slog, but I'm looking to see about getting `datasette` (and friends!) available on conda-forge. There are a few missing upstreams (`asgi-csrf`, `python-basecov`, `mergedeep`) and some of the plugins don't even appear to _have_ tarballs (just `whl`!), but the little stuff like licenses are nice to get out handled upstream vs separately grabbing them.", "created_at": "2020-10-23T05:04:12Z", "updated_at": "2020-10-26T00:14:57Z", "closed_at": "2020-10-23T20:54:35Z", "merged_at": "2020-10-23T20:54:35Z", "merge_commit_sha": "976e5f74aae1fa0d406df6691dc8b5feeebe8788", "assignee": null, "milestone": null, "draft": 0, "head": "dc4129cb37060b52775d96e756f7cdb65ee76bc3", "base": "d0cc6f4c32e1f89238ddec782086b3122f445bd4", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1043", "merged_by": null, "auto_merge": null} {"id": 508720660, "node_id": "MDExOlB1bGxSZXF1ZXN0NTA4NzIwNjYw", "number": 1044, "state": "closed", "locked": 0, "title": "Add minimum supported python", "user": {"value": 45380, "label": "bollwyvl"}, "body": "Thanks for `datasette`!\r\n\r\nThis PR adds `python_requires` to formally signal the [minimum supported python version](https://packaging.python.org/guides/dropping-older-python-versions/#specify-the-version-ranges-for-supported-python-distributions) (which is pointed out with classifiers, so seems pretty straightforward).", "created_at": "2020-10-23T05:08:03Z", "updated_at": "2020-10-23T20:53:08Z", "closed_at": "2020-10-23T20:53:08Z", "merged_at": "2020-10-23T20:53:08Z", "merge_commit_sha": "cab8e65261b117b493af6a0b21aa2e1ae4564419", "assignee": null, "milestone": null, "draft": 0, "head": "6453ab18e56b36bc912b6f24c4a43002c6084ade", "base": "d0cc6f4c32e1f89238ddec782086b3122f445bd4", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1044", "merged_by": null, "auto_merge": null} {"id": 509590205, "node_id": "MDExOlB1bGxSZXF1ZXN0NTA5NTkwMjA1", "number": 1049, "state": "closed", "locked": 0, "title": "Add template block prior to extra URL loaders", "user": {"value": 82988, "label": "psychemedia"}, "body": "To handle packages that require Javascript state setting prior to loading a package (eg [`thebelab`](https://thebelab.readthedocs.io/en/latest/examples/minimal_example.html), provide a template block before the URLs are loaded.", "created_at": "2020-10-25T13:08:55Z", "updated_at": "2020-10-29T09:20:52Z", "closed_at": "2020-10-29T09:20:34Z", "merged_at": null, "merge_commit_sha": "99f994b14e2dbe22fda18b67dd5c824d359443fb", "assignee": null, "milestone": null, "draft": 0, "head": "50a743ad35684f09d3c3880f6af2019e59271237", "base": "42f4851e3e7885f1092f104d6c883cea40b12f02", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1049", "merged_by": null, "auto_merge": null} {"id": 511549374, "node_id": "MDExOlB1bGxSZXF1ZXN0NTExNTQ5Mzc0", "number": 1059, "state": "closed", "locked": 0, "title": "Update aiofiles requirement from <0.6,>=0.4 to >=0.4,<0.7", "user": {"value": 27856297, "label": "dependabot-preview[bot]"}, "body": "Updates the requirements on [aiofiles](https://github.com/Tinche/aiofiles) to permit the latest version.\n
\nCommits\n\n
\n
\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n
\nDependabot commands and options\n
\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language\n- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language\n- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language\n- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language\n- `@dependabot badge me` will comment on this PR with code to add a \"Dependabot enabled\" badge to your readme\n\nAdditionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com):\n- Update frequency (including time of day and day of week)\n- Pull request limits (per update run and/or open at any time)\n- Out-of-range updates (receive only lockfile updates, if desired)\n- Security updates (receive only security updates, if desired)\n\n\n\n
", "created_at": "2020-10-28T13:32:40Z", "updated_at": "2020-10-28T17:08:29Z", "closed_at": "2020-10-28T17:08:28Z", "merged_at": "2020-10-28T17:08:28Z", "merge_commit_sha": "879617265262024edd93722adcdcb6c21e57f5f7", "assignee": null, "milestone": null, "draft": 0, "head": "e46327a745c5a4130b65bf340d19dccc76441841", "base": "7d9fedc176717a7e3d22a96575ae0aada5a65440", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1059", "merged_by": null, "auto_merge": null} {"id": 528997614, "node_id": "MDExOlB1bGxSZXF1ZXN0NTI4OTk3NjE0", "number": 1112, "state": "closed", "locked": 0, "title": "Fix --metadata doc usage", "user": {"value": 50527, "label": "jefftriplett"}, "body": "I stumbled on this while trying to figure out how to configure datasette-ripgrep via https://github.com/simonw/datasette-ripgrep/issues/15\r\n\r\nYou may not want to update the changelog (those are annoying) so I added two commits in case that's easier. ", "created_at": "2020-11-28T19:19:51Z", "updated_at": "2020-11-28T23:28:21Z", "closed_at": "2020-11-28T19:53:48Z", "merged_at": "2020-11-28T19:53:48Z", "merge_commit_sha": "bbde835a1fec01458e8d00929e7bab6d6a5ba948", "assignee": null, "milestone": {"value": 6055094, "label": "Datasette 0.52"}, "draft": 0, "head": "1a30fc259205df736daf068c57a0a6ae2c21ffa9", "base": "37d18a5bce08c9ee53c080f613bae84fc2ccc853", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1112", "merged_by": null, "auto_merge": null} {"id": 530125695, "node_id": "MDExOlB1bGxSZXF1ZXN0NTMwMTI1Njk1", "number": 1122, "state": "closed", "locked": 0, "title": "Fix misaligned table actions cog", "user": {"value": 3243482, "label": "abdusco"}, "body": "Fixes https://github.com/simonw/datasette/issues/1121", "created_at": "2020-12-01T08:41:46Z", "updated_at": "2020-12-03T10:56:40Z", "closed_at": "2020-12-03T00:33:37Z", "merged_at": "2020-12-03T00:33:36Z", "merge_commit_sha": "daae35be46ec5cb8a207aa20986a4fa62e94777e", "assignee": null, "milestone": null, "draft": 0, "head": "94ea22f7b6b6c55b490c97b385f6eb6c1ea2121c", "base": "a970276b9999687b96c5e11ea1c817d814f5d267", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1122", "merged_by": null, "auto_merge": null} {"id": 532342025, "node_id": "MDExOlB1bGxSZXF1ZXN0NTMyMzQyMDI1", "number": 1128, "state": "closed", "locked": 0, "title": "Fix startup error on windows", "user": {"value": 3243482, "label": "abdusco"}, "body": "Fixes https://github.com/simonw/datasette/issues/1094\r\n\r\nThis import isn't used at all, and causes error on startup on Windows.", "created_at": "2020-12-04T07:12:26Z", "updated_at": "2020-12-06T08:41:45Z", "closed_at": "2020-12-05T19:35:04Z", "merged_at": "2020-12-05T19:35:04Z", "merge_commit_sha": "705d1a1555c4791e9be3b884285b047223ab184f", "assignee": null, "milestone": null, "draft": 0, "head": "7004c3b1462675ba3845b1efc82c816f1d2199e0", "base": "49d8fc056844d5a537d6cfd96dab0dd5686fe718", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1128", "merged_by": null, "auto_merge": null} {"id": 532348919, "node_id": "MDExOlB1bGxSZXF1ZXN0NTMyMzQ4OTE5", "number": 1130, "state": "open", "locked": 0, "title": "Fix footer not sticking to bottom in short pages", "user": {"value": 3243482, "label": "abdusco"}, "body": "Fixes https://github.com/simonw/datasette/issues/1129", "created_at": "2020-12-04T07:29:01Z", "updated_at": "2021-06-15T13:27:48Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "af3aa34786f134af8073342a3c4bb74b968750fd", "assignee": null, "milestone": null, "draft": 0, "head": "8d4c69c6fb0ef741a19070f5172017ea3522e83c", "base": "49d8fc056844d5a537d6cfd96dab0dd5686fe718", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1130", "merged_by": null, "auto_merge": null} {"id": 539489525, "node_id": "MDExOlB1bGxSZXF1ZXN0NTM5NDg5NTI1", "number": 1145, "state": "closed", "locked": 0, "title": "Update pytest requirement from <6.2.0,>=5.2.2 to >=5.2.2,<6.3.0", "user": {"value": 27856297, "label": "dependabot-preview[bot]"}, "body": "Updates the requirements on [pytest](https://github.com/pytest-dev/pytest) to permit the latest version.\n
\nRelease notes\n

Sourced from pytest's releases.

\n
\n

6.2.0

\n

pytest 6.2.0 (2020-12-12)

\n

Breaking Changes

\n
    \n
  • #7808: pytest now supports python3.6+ only.
  • \n
\n

Deprecations

\n
    \n
  • \n

    #7469: Directly constructing/calling the following classes/functions is now deprecated:

    \n
      \n
    • _pytest.cacheprovider.Cache
    • \n
    • _pytest.cacheprovider.Cache.for_config()
    • \n
    • _pytest.cacheprovider.Cache.clear_cache()
    • \n
    • _pytest.cacheprovider.Cache.cache_dir_from_config()
    • \n
    • _pytest.capture.CaptureFixture
    • \n
    • _pytest.fixtures.FixtureRequest
    • \n
    • _pytest.fixtures.SubRequest
    • \n
    • _pytest.logging.LogCaptureFixture
    • \n
    • _pytest.pytester.Pytester
    • \n
    • _pytest.pytester.Testdir
    • \n
    • _pytest.recwarn.WarningsRecorder
    • \n
    • _pytest.recwarn.WarningsChecker
    • \n
    • _pytest.tmpdir.TempPathFactory
    • \n
    • _pytest.tmpdir.TempdirFactory
    • \n
    \n

    These have always been considered private, but now issue a deprecation warning, which may become a hard error in pytest 7.0.0.

    \n
  • \n
  • \n

    #7530: The --strict command-line option has been deprecated, use --strict-markers instead.

    \n

    We have plans to maybe in the future to reintroduce --strict and make it an encompassing flag for all strictness\nrelated options (--strict-markers and --strict-config at the moment, more might be introduced in the future).

    \n
  • \n
  • \n

    #7988: The @pytest.yield_fixture decorator/function is now deprecated. Use pytest.fixture instead.

    \n

    yield_fixture has been an alias for fixture for a very long time, so can be search/replaced safely.

    \n
  • \n
\n

Features

\n
    \n
  • \n

    #5299: pytest now warns about unraisable exceptions and unhandled thread exceptions that occur in tests on Python>=3.8.\nSee unraisable for more information.

    \n
  • \n
  • \n

    #7425: New pytester fixture, which is identical to testdir but its methods return pathlib.Path when appropriate instead of py.path.local.

    \n

    This is part of the movement to use pathlib.Path objects internally, in order to remove the dependency to py in the future.

    \n

    Internally, the old Testdir <_pytest.pytester.Testdir> is now a thin wrapper around Pytester <_pytest.pytester.Pytester>, preserving the old interface.

    \n
  • \n
\n\n
\n
\n
\nChangelog\n

Sourced from pytest's changelog.

\n
\n
\nCommits\n
    \n
  • e7073af Prepare release version 6.2.0
  • \n
  • 683f29f Merge pull request #8129 from bluetech/docs-pygments-workaround
  • \n
  • 0feeddf doc: temporary workaround for pytest-pygments lexing error
  • \n
  • b478275 Merge pull request #8128 from bluetech/skip-reason-empty
  • \n
  • 3302ff9 terminal: when the skip/xfail is empty, don't show it as "()"
  • \n
  • 59bd0f6 Merge pull request #8126 from bluetech/tox-regen-pretend-scm2
  • \n
  • 6298ff1 tox: use pip legacy resolver for regen job
  • \n
  • d51ecbd Merge pull request #8125 from bluetech/tox-rm-pip-req
  • \n
  • f237b07 tox: remove requires: pip>=20.3.1
  • \n
  • 95e0e19 Merge pull request #8124 from bluetech/s0undt3ch-feature/skip-context-hook
  • \n
  • Additional commits viewable in compare view
  • \n
\n
\n
\n\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n
\nDependabot commands and options\n
\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)\n- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language\n- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language\n- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language\n- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language\n- `@dependabot badge me` will comment on this PR with code to add a \"Dependabot enabled\" badge to your readme\n\nAdditionally, you can set the following in your Dependabot [dashboard](https://app.dependabot.com):\n- Update frequency (including time of day and day of week)\n- Pull request limits (per update run and/or open at any time)\n- Out-of-range updates (receive only lockfile updates, if desired)\n- Security updates (receive only security updates, if desired)\n\n\n\n
", "created_at": "2020-12-14T14:22:16Z", "updated_at": "2021-01-24T21:20:29Z", "closed_at": "2020-12-16T21:44:39Z", "merged_at": "2020-12-16T21:44:39Z", "merge_commit_sha": "6119bd797366a899119f1bba51c1c8cba2efc8fc", "assignee": null, "milestone": {"value": 6346396, "label": "Datasette 0.54"}, "draft": 0, "head": "a8588f95568138c268e6802de0d1a4daffb7bda8", "base": "0c616f732cee79db80cad830917666f41b344262", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1145", "merged_by": null, "auto_merge": null} {"id": 544923437, "node_id": "MDExOlB1bGxSZXF1ZXN0NTQ0OTIzNDM3", "number": 1158, "state": "closed", "locked": 0, "title": "Modernize code to Python 3.6+", "user": {"value": 6774676, "label": "eumiro"}, "body": "- compact dict and set building\r\n- remove redundant parentheses\r\n- simplify chained conditions\r\n- change method name to lowercase\r\n- use triple double quotes for docstrings\r\n\r\nplease feel free to accept/reject any of these independent commits", "created_at": "2020-12-23T16:21:38Z", "updated_at": "2021-01-24T21:20:50Z", "closed_at": "2020-12-23T17:04:32Z", "merged_at": "2020-12-23T17:04:32Z", "merge_commit_sha": "a882d679626438ba0d809944f06f239bcba8ee96", "assignee": null, "milestone": {"value": 6346396, "label": "Datasette 0.54"}, "draft": 0, "head": "37ce72f086d7807a32ea9012d6e6b5d235349152", "base": "90eba4c3ca569c57e96bce314e7ac8caf67d884e", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1158", "merged_by": null, "auto_merge": null} {"id": 548271472, "node_id": "MDExOlB1bGxSZXF1ZXN0NTQ4MjcxNDcy", "number": 1170, "state": "closed", "locked": 0, "title": "Install Prettier via package.json", "user": {"value": 3637, "label": "benpickles"}, "body": "This adds a package.json with Prettier and means that developers/CI will use the same version. It also ensures that NPM packages are cached on GitHub Actions which fixes #1169.", "created_at": "2021-01-04T14:18:03Z", "updated_at": "2021-01-24T21:21:01Z", "closed_at": "2021-01-04T19:52:34Z", "merged_at": "2021-01-04T19:52:33Z", "merge_commit_sha": "3054e0f7307da4c31850b74bd73238b33d6c750a", "assignee": null, "milestone": {"value": 6346396, "label": "Datasette 0.54"}, "draft": 0, "head": "a5761ccb8676ef1b98d95d8174211c98f140e3de", "base": "1e8fa3ac7cb2d6e516c47c306c86ed2334fc3dc0", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1170", "merged_by": null, "auto_merge": null} {"id": 564608264, "node_id": "MDExOlB1bGxSZXF1ZXN0NTY0NjA4MjY0", "number": 1211, "state": "closed", "locked": 0, "title": "Use context manager instead of plain open", "user": {"value": 4488943, "label": "kbaikov"}, "body": "Context manager with open closes the files after usage. Fixes: https://github.com/simonw/datasette/issues/1208\r\n\r\nWhen the object is already a pathlib.Path i used read_text\r\nwrite_text functions\r\n\r\nIn some cases pathlib.Path.open were used in context manager,\r\nit is basically the same as builtin open.\r\n\r\nTests are passing: 850 passed, 5 xfailed, 10 xpassed", "created_at": "2021-01-31T07:58:10Z", "updated_at": "2021-03-11T16:15:50Z", "closed_at": "2021-03-11T16:15:50Z", "merged_at": "2021-03-11T16:15:49Z", "merge_commit_sha": "8e18c7943181f228ce5ebcea48deb59ce50bee1f", "assignee": null, "milestone": null, "draft": 0, "head": "e33ccaaafbe9a16b8339a3bf4c0ae7b83354570c", "base": "dde3c500c73ace33529672f7d862b76753d309cc", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1211", "merged_by": null, "auto_merge": null} {"id": 572254103, "node_id": "MDExOlB1bGxSZXF1ZXN0NTcyMjU0MTAz", "number": 1223, "state": "closed", "locked": 0, "title": "Add compile option to Dockerfile to fix failing test (fixes #696)", "user": {"value": 7476523, "label": "bobwhitelock"}, "body": "This test was failing when run inside the Docker container: `test_searchable[/fixtures/searchable.json?_search=te*+AND+do*&_searchmode=raw-expected_rows3]`,\r\n\r\nwith this error:\r\n\r\n```\r\n def test_searchable(app_client, path, expected_rows):\r\n response = app_client.get(path)\r\n> assert expected_rows == response.json[\"rows\"]\r\nE AssertionError: assert [[1, 'barry c...sel', 'puma']] == []\r\nE Left contains 2 more items, first extra item: [1, 'barry cat', 'terry dog', 'panther']\r\nE Full diff:\r\nE + []\r\nE - [[1, 'barry cat', 'terry dog', 'panther'],\r\nE - [2, 'terry dog', 'sara weasel', 'puma']]\r\n```\r\n\r\nThe issue was that the version of sqlite3 built inside the Docker container was built with FTS3 and FTS4 enabled, but without the\r\n`SQLITE_ENABLE_FTS3_PARENTHESIS` compile option passed, which adds support for using `AND` and `NOT` within `match` expressions (see https://sqlite.org/fts3.html#compiling_and_enabling_fts3_and_fts4 and https://www.sqlite.org/compile.html).\r\n\r\nWithout this, the `AND` used in the search in this test was being interpreted as a literal string, and so no matches were found. Adding this compile option fixes this.\r\n\r\n---\r\n\r\nI actually ran into this issue because the same test was failing when I ran the test suite on my own machine, outside of Docker, and so I eventually tracked this down to my system sqlite3 also being compiled without this option.\r\n\r\nI wonder if this is a sign of a slightly deeper issue, that Datasette can silently behave differently based on the version and compilation of sqlite3 it is being used with. On my own system I fixed the test suite by running `pip install pysqlite3-binary`, so that this would be picked up instead of the `sqlite` package, as this seems to be compiled using this option, . Maybe using `pysqlite3-binary` could be installed/recommended by default so a more deterministic version of sqlite is used? Or there could be some feature detection done on the available sqlite version, to know what features are available and can be used/tested?", "created_at": "2021-02-12T03:38:05Z", "updated_at": "2021-03-07T12:01:12Z", "closed_at": "2021-03-07T07:41:17Z", "merged_at": "2021-03-07T07:41:17Z", "merge_commit_sha": "d0fd833b8cdd97e1b91d0f97a69b494895d82bee", "assignee": null, "milestone": null, "draft": 0, "head": "d1cd1f259c699fab3af01c4aa90035ed0242471a", "base": "9603d893b9b72653895318c9104d754229fdb146", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1223", "merged_by": null, "auto_merge": null} {"id": 575187457, "node_id": "MDExOlB1bGxSZXF1ZXN0NTc1MTg3NDU3", "number": 1229, "state": "closed", "locked": 0, "title": "ensure immutable databses when starting in configuration directory mode with", "user": {"value": 295329, "label": "camallen"}, "body": "fixes #1224 \r\n\r\nThis PR ensures all databases found in a configuration directory that match the files in `inspect-data.json` will be set to `immutable` as outlined in https://docs.datasette.io/en/latest/settings.html#configuration-directory-mode\r\n\r\nspecifically on building the `datasette` instance it checks:\r\n- if `immutables` is an empty tuple - as passed by the cli code\r\n- if `immutables` is the default function value `None` - when it's not explicitly set\r\n\r\nAnd correctly builds the immutable database list from the `inspect-data[file]` keys.\r\n\r\nNote for this to work the `inspect-data.json` file must contain `file` paths which are relative to the configuration directory otherwise the file paths won't match and the dbs won't be set to immutable. \r\n\r\nI couldn't find an easy way to test this due to the way `make_app_client` works, happy to take directions on adding a test for this. \r\n\r\nI've updated the relevant docs as well, i.e. use the `inspect` cli cmd from the config directory path to create the relevant file\r\n```\r\ncd $config_dir\r\ndatasette inspect *.db --inspect-file=inspect-data.json\r\n```\r\nhttps://docs.datasette.io/en/latest/performance.html#using-datasette-inspect", "created_at": "2021-02-17T20:18:26Z", "updated_at": "2022-04-22T13:16:36Z", "closed_at": "2021-03-29T00:17:32Z", "merged_at": "2021-03-29T00:17:31Z", "merge_commit_sha": "f92d823766872a6fd7e76c5249a6b2de1ab0f447", "assignee": null, "milestone": null, "draft": 0, "head": "a095248ad18c9c5272dbd52f4c97ea8a36cf91f3", "base": "8e18c7943181f228ce5ebcea48deb59ce50bee1f", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1229", "merged_by": null, "auto_merge": null} {"id": 579697833, "node_id": "MDExOlB1bGxSZXF1ZXN0NTc5Njk3ODMz", "number": 1243, "state": "closed", "locked": 0, "title": "fix small typo", "user": {"value": 306240, "label": "UtahDave"}, "body": "", "created_at": "2021-02-25T00:22:34Z", "updated_at": "2021-03-04T05:46:10Z", "closed_at": "2021-03-04T05:46:10Z", "merged_at": "2021-03-04T05:46:10Z", "merge_commit_sha": "4f9a2f1f47dcf7e8561d68a8a07f5009a13cfdb3", "assignee": null, "milestone": null, "draft": 0, "head": "32652d9847f9b32c5d923823001c75d76e2791d2", "base": "726f781c50e88f557437f6490b8479c3d6fabfc2", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1243", "merged_by": null, "auto_merge": null} {"id": 587332473, "node_id": "MDExOlB1bGxSZXF1ZXN0NTg3MzMyNDcz", "number": 1252, "state": "closed", "locked": 0, "title": "Add back styling to lists within table cells (fixes #1141)", "user": {"value": 7476523, "label": "bobwhitelock"}, "body": "This overrides the Datasette reset - see https://github.com/simonw/datasette/blob/d0fd833b8cdd97e1b91d0f97a69b494895d82bee/datasette/static/app.css#L35-L38 - to add back the default styling of list items displayed within Datasette table cells.\r\n\r\nFollowing this change, the same content as in the original issue looks like this:\r\n\r\n![2021-03-09_02:57:32](https://user-images.githubusercontent.com/7476523/110411982-63e5ae80-8083-11eb-9b5c-e5dc825073e2.png)\r\n", "created_at": "2021-03-09T03:00:57Z", "updated_at": "2021-03-29T00:14:04Z", "closed_at": "2021-03-29T00:14:04Z", "merged_at": "2021-03-29T00:14:04Z", "merge_commit_sha": "e72397d65b06b019521b6411243687464ac8d8ca", "assignee": null, "milestone": null, "draft": 0, "head": "d22aa32cd9c0f798bcab917cc2024a371b4c0069", "base": "d0fd833b8cdd97e1b91d0f97a69b494895d82bee", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1252", "merged_by": null, "auto_merge": null} {"id": 589263297, "node_id": "MDExOlB1bGxSZXF1ZXN0NTg5MjYzMjk3", "number": 1256, "state": "closed", "locked": 0, "title": "Minor type in IP adress", "user": {"value": 6371750, "label": "JBPressac"}, "body": "127.0.01 replaced by 127.0.0.1", "created_at": "2021-03-10T08:28:22Z", "updated_at": "2021-03-10T18:26:46Z", "closed_at": "2021-03-10T18:26:40Z", "merged_at": "2021-03-10T18:26:39Z", "merge_commit_sha": "a1bcd2fbe5e47bb431045f65eeceb5eb3a6718d5", "assignee": null, "milestone": null, "draft": 0, "head": "4eef524e44ff79c617728aad98b14c1c1e586ce3", "base": "d0fd833b8cdd97e1b91d0f97a69b494895d82bee", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1256", "merged_by": null, "auto_merge": null} {"id": 602107935, "node_id": "MDExOlB1bGxSZXF1ZXN0NjAyMTA3OTM1", "number": 1279, "state": "closed", "locked": 0, "title": "Minor Docs Update. Added `--app` to fly install command.", "user": {"value": 1019791, "label": "koaning"}, "body": "Without this flag, there's an error locally. \r\n\r\n```\r\n> datasette publish fly bigmac.db\r\n\r\nUsage: datasette publish fly [OPTIONS] [FILES]...\r\nTry 'datasette publish fly --help' for help.\r\n\r\nError: Missing option '-a' / '--app'.\r\n```\r\n\r\nI also got an error message which later turned out to be because I hadn't added my credit card information yet to `fly`. I wasn't sure if I should add that mention to the docs here, or to submit a bug-report over at https://github.com/simonw/datasette-publish-fly. ", "created_at": "2021-03-27T16:58:08Z", "updated_at": "2021-03-29T00:11:55Z", "closed_at": "2021-03-29T00:11:55Z", "merged_at": "2021-03-29T00:11:55Z", "merge_commit_sha": "c96a3826cf50cb347f6a415b56d8105ba6d8dcb0", "assignee": null, "milestone": null, "draft": 0, "head": "14d8977e158d1d3193c6afb50aae482547ec9d8d", "base": "3fcfc8513465339ac5f055296cbb67f5262af02b", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1279", "merged_by": null, "auto_merge": null}