{"id": 250628275, "node_id": "MDExOlB1bGxSZXF1ZXN0MjUwNjI4Mjc1", "number": 407, "state": "closed", "locked": 0, "title": "Heroku --include-vcs-ignore", "user": {"value": 9599, "label": "simonw"}, "body": "Should mean `datasette publish heroku` can work under Travis, unlike this failure:\r\n\r\nhttps://travis-ci.org/simonw/fivethirtyeight-datasette/builds/488047550\r\n\r\n```\r\n2.25s$ datasette publish heroku fivethirtyeight.db -m metadata.json -n fivethirtyeight-datasette\r\ntar: unrecognized option '--exclude-vcs-ignores'\r\nTry 'tar --help' or 'tar --usage' for more information.\r\n \u25b8 Command failed: tar cz -C /tmp/tmpuaxm7i8f --exclude-vcs-ignores --exclude\r\n \u25b8 .git --exclude .gitmodules . >\r\n \u25b8 /tmp/f49440e0-1bf3-4d3f-9eb0-fbc2967d1fd4.tar.gz\r\n \u25b8 tar: unrecognized option '--exclude-vcs-ignores'\r\n \u25b8 Try 'tar --help' or 'tar --usage' for more information.\r\n \u25b8 \r\nThe command \"datasette publish heroku fivethirtyeight.db -m metadata.json -n fivethirtyeight-datasette\" exited with 0.\r\n```\r\n\r\nThe fix for that issue is to call the heroku command like this:\r\n\r\n heroku builds:create -a app_name --include-vcs-ignore\r\n\r\n", "created_at": "2019-02-06T04:06:20Z", "updated_at": "2019-02-06T04:31:30Z", "closed_at": "2019-02-06T04:15:47Z", "merged_at": "2019-02-06T04:15:46Z", "merge_commit_sha": "195a5b36349d0d24a6bbb758cebb719b6de303b6", "assignee": null, "milestone": null, "draft": 0, "head": "01978ddb9682c828cafddaf9ca625e08ba3ba3a4", "base": "436b8bc1d17c2ab415800ab209204f94e7f7929e", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/407", "merged_by": null, "auto_merge": null} {"id": 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": 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": 261418285, "node_id": "MDExOlB1bGxSZXF1ZXN0MjYxNDE4Mjg1", "number": 416, "state": "closed", "locked": 0, "title": "URL hashing now optional: turn on with --config hash_urls:1 (#418)", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-03-15T04:26:06Z", "updated_at": "2019-03-17T22:55:04Z", "closed_at": "2019-03-17T22:55:04Z", "merged_at": "2019-03-17T22:55:04Z", "merge_commit_sha": "6f6d0ff2b41f1cacaf42287b1b230b646bcba9ee", "assignee": null, "milestone": null, "draft": 0, "head": "0d02a99c9665669540aebff981246d8c743072b3", "base": "afe9aa3ae03c485c5d6652741438d09445a486c1", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/416", "merged_by": null, "auto_merge": null} {"id": 269364924, "node_id": "MDExOlB1bGxSZXF1ZXN0MjY5MzY0OTI0", "number": 426, "state": "closed", "locked": 0, "title": "Upgrade to Jinja2==2.10.1", "user": {"value": 9599, "label": "simonw"}, "body": "https://nvd.nist.gov/vuln/detail/CVE-2019-10906\r\n\r\nThis is only a security issue of concern if evaluating templates from untrusted sources, which isn't something I would ever expect a Datasette user to do.", "created_at": "2019-04-10T23:03:08Z", "updated_at": "2019-04-22T21:23:22Z", "closed_at": "2019-04-10T23:13:31Z", "merged_at": "2019-04-10T23:13:31Z", "merge_commit_sha": "9cd3b44277e6a8ea9273bf659379ff0414e0b8ae", "assignee": null, "milestone": null, "draft": 0, "head": "629453383c7f911eddfc891f22c39b7d6e9661aa", "base": "78e45ead4d771007c57b307edf8fc920101f8733", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/426", "merged_by": null, "auto_merge": null} {"id": 270191084, "node_id": "MDExOlB1bGxSZXF1ZXN0MjcwMTkxMDg0", "number": 430, "state": "closed", "locked": 0, "title": "?_where= parameter on table views, closes #429", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-04-13T01:15:09Z", "updated_at": "2019-04-13T01:37:23Z", "closed_at": "2019-04-13T01:37:23Z", "merged_at": "2019-04-13T01:37:23Z", "merge_commit_sha": "bc6a9b45646610f362b4287bc4110440991aa4d6", "assignee": null, "milestone": null, "draft": 0, "head": "3ee087c7b60da7ec3e5d2f73611fc6ea99ff82fc", "base": "e11cb4c66442abca2a6b6159521a6cf4da8739c1", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/430", "merged_by": null, "auto_merge": null} {"id": 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": 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": 270251021, "node_id": "MDExOlB1bGxSZXF1ZXN0MjcwMjUxMDIx", "number": 432, "state": "closed", "locked": 0, "title": "Refactor facets to a class and new plugin, refs #427", "user": {"value": 9599, "label": "simonw"}, "body": "WIP for #427", "created_at": "2019-04-13T20:04:45Z", "updated_at": "2019-05-03T00:04:24Z", "closed_at": "2019-05-03T00:04:24Z", "merged_at": null, "merge_commit_sha": "b78bc19269ed83b054a60c79c4fe08f4ca943942", "assignee": null, "milestone": null, "draft": 0, "head": "5c198f7ca5d2aff49180820271ba8d06b79aefb1", "base": "9c77e6e355ec718d76178a7607721d10a66b6aef", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/432", "merged_by": null, "auto_merge": null} {"id": 275558612, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc1NTU4NjEy", "number": 445, "state": "closed", "locked": 0, "title": "Extract facet code out into a new plugin hook, closes #427", "user": {"value": 9599, "label": "simonw"}, "body": "Datasette previously only supported one type of faceting: exact column value counting.\r\n\r\nWith this change, faceting logic is extracted out into one or more separate classes which can implement other patterns of faceting - this is discussed in #427, but potential upcoming facet types include facet-by-date, facet-by-JSON-array, facet-by-many-2-many and more.\r\n\r\nA new plugin hook, register_facet_classes, can be used by plugins to add in additional facet classes.\r\n\r\nEach class must implement two methods: suggest(), which scans columns in the table to decide if they might be worth suggesting for faceting, and facet_results(), which executes the facet operation and returns results ready to be displayed in the UI.", "created_at": "2019-05-03T00:02:41Z", "updated_at": "2019-05-03T18:17:18Z", "closed_at": "2019-05-03T00:11:27Z", "merged_at": "2019-05-03T00:11:27Z", "merge_commit_sha": "ea66c45df96479ef66a89caa71fff1a97a862646", "assignee": null, "milestone": null, "draft": 0, "head": "1b47d4d8736627c260eb4e8303e552b0e9620a01", "base": "efc93b8ab5a21e3802f75f08d5e41409f5684b5d", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/445", "merged_by": null, "auto_merge": null} {"id": 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": 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": 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": 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": 275801463, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc1ODAxNDYz", "number": 447, "state": "closed", "locked": 0, "title": "Use dist: xenial and python: 3.7 on Travis", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-05-03T18:07:07Z", "updated_at": "2019-05-03T18:17:05Z", "closed_at": "2019-05-03T18:16:53Z", "merged_at": "2019-05-03T18:16:53Z", "merge_commit_sha": "553314dcd699a84aa7cc806377150ca0d57a6024", "assignee": null, "milestone": null, "draft": 0, "head": "cd22e389d09b4fd5ed28205ba38a20faf1ed14f1", "base": "01b3de5b66742f0f661183e9e2ef66be3600e831", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/447", "merged_by": null, "auto_merge": null} {"id": 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": 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": 275861559, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc1ODYxNTU5", "number": 449, "state": "closed", "locked": 0, "title": "Apply black to everything", "user": {"value": 9599, "label": "simonw"}, "body": "I've been hesitating on this for literally months, because I'm not at all excited about the giant diff that will result. But I've been using black on many of my other projects (most actively [sqlite-utils](https://github.com/simonw/sqlite-utils)) and the productivity boost is undeniable: I don't have to spend a single second thinking about code formatting any more!\r\n\r\nSo it's worth swallowing the one-off pain and moving on in a new, black-enabled world.", "created_at": "2019-05-03T21:57:26Z", "updated_at": "2019-05-04T02:17:14Z", "closed_at": "2019-05-04T02:15:15Z", "merged_at": "2019-05-04T02:15:15Z", "merge_commit_sha": "35d6ee2790e41e96f243c1ff58be0c9c0519a8ce", "assignee": null, "milestone": null, "draft": 0, "head": "9683aeb2394a4b7e44499b8a0240af3baafda832", "base": "66c87cee0c7344c7877373c60b180c766c206101", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/449", "merged_by": null, "auto_merge": null} {"id": 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": 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": 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": 284390197, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjg0MzkwMTk3", "number": 497, "state": "closed", "locked": 0, "title": "Upgrade pytest to 4.6.1", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-06-03T01:45:34Z", "updated_at": "2019-06-03T02:06:32Z", "closed_at": "2019-06-03T02:06:27Z", "merged_at": "2019-06-03T02:06:27Z", "merge_commit_sha": "5e8fbf7f6fbc0b63d0479da3806dd9ccd6aaa945", "assignee": null, "milestone": null, "draft": 0, "head": "bf2ab0306e6d3ce7524fecf015e2cec7ae45e994", "base": "803f750309bf0cd5b7501228c1efcf9a35686d74", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/497", "merged_by": null, "auto_merge": null} {"id": 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": 290897104, "node_id": "MDExOlB1bGxSZXF1ZXN0MjkwODk3MTA0", "number": 518, "state": "closed", "locked": 0, "title": "Port Datasette from Sanic to ASGI + Uvicorn", "user": {"value": 9599, "label": "simonw"}, "body": "Most of the code here was fleshed out in comments on #272 (Port Datasette to ASGI) - this pull request will track the final pieces:\r\n\r\n- [x] Update test harness to more correctly simulate the `raw_path` issue\r\n- [x] Use `raw_path` so table names containing `/` can work correctly\r\n- [x] Bug: JSON not served with correct content-type\r\n- [x] Get ?_trace=1 working again\r\n- [x] Replacement for `@app.listener(\"before_server_start\")`\r\n- [x] Bug: `/fixtures/table%2Fwith%2Fslashes.csv?_format=json` downloads as CSV\r\n- [x] Replace Sanic request and response objects with my own classes, so I can remove Sanic dependency\r\n- [x] Final code tidy-up before merging to master", "created_at": "2019-06-23T15:18:42Z", "updated_at": "2019-06-24T13:42:50Z", "closed_at": "2019-06-24T03:13:09Z", "merged_at": "2019-06-24T03:13:09Z", "merge_commit_sha": "ba8db9679f3bd2454c9e76e7e6c352126848b57a", "assignee": {"value": 9599, "label": "simonw"}, "milestone": {"value": 3268330, "label": "Datasette 1.0"}, "draft": 0, "head": "b794554a26ddc81bd772c4422d80d5ee863e92b0", "base": "35429f90894321eda7f2db31b9ea7976f31f73ac", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/518", "merged_by": null, "auto_merge": null} {"id": 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": 291534596, "node_id": "MDExOlB1bGxSZXF1ZXN0MjkxNTM0NTk2", "number": 529, "state": "closed", "locked": 0, "title": "Use keyed rows - fixes #521", "user": {"value": 1383872, "label": "nathancahill"}, "body": "Supports template syntax like this:\r\n\r\n```\r\n{% for row in display_rows %}\r\n

{{ row[\"First_Name\"] }} {{ row[\"Last_Name\"] }}

\r\n ...\r\n```", "created_at": "2019-06-25T12:33:48Z", "updated_at": "2019-06-25T12:35:07Z", "closed_at": "2019-06-25T12:35:07Z", "merged_at": null, "merge_commit_sha": "3be9759418fdfe4a8ae8aec46fc2a937d45332d2", "assignee": null, "milestone": null, "draft": 0, "head": "312e3394bd9f3eaef606fbe37eb409ec7462baaf", "base": "9e97b725f11be3f4dca077fe5569078a62ec2761", "author_association": "NONE", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/529", "merged_by": null, "auto_merge": null} {"id": 293962405, "node_id": "MDExOlB1bGxSZXF1ZXN0MjkzOTYyNDA1", "number": 533, "state": "closed", "locked": 0, "title": "Support cleaner custom templates for rows and tables, closes #521", "user": {"value": 9599, "label": "simonw"}, "body": "- [x] Rename `_rows_and_columns.html` to `_table.html`\r\n- [x] Unit test\r\n- [x] Documentation", "created_at": "2019-07-03T00:40:18Z", "updated_at": "2019-07-03T03:23:06Z", "closed_at": "2019-07-03T03:23:06Z", "merged_at": "2019-07-03T03:23:06Z", "merge_commit_sha": "b9ede4c1898616512b5d204f9c941deff473cbe4", "assignee": null, "milestone": null, "draft": 0, "head": "1add905532b7bc4f681318b8f22b9b74cca2b2a0", "base": "76882830548e16905348ee75acb0044cb8e1fd20", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/533", "merged_by": null, "auto_merge": null} {"id": 293992382, "node_id": "MDExOlB1bGxSZXF1ZXN0MjkzOTkyMzgy", "number": 535, "state": "closed", "locked": 0, "title": "Added asgi_wrapper plugin hook, closes #520", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-07-03T03:58:00Z", "updated_at": "2019-07-03T04:06:26Z", "closed_at": "2019-07-03T04:06:26Z", "merged_at": "2019-07-03T04:06:26Z", "merge_commit_sha": "4d2fdafe39159c9a8aa83f7e9bfe768bbbbb56a3", "assignee": null, "milestone": null, "draft": 0, "head": "93bfa26bfd25a3cc911d637596e364d3474325bd", "base": "b9ede4c1898616512b5d204f9c941deff473cbe4", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/535", "merged_by": null, "auto_merge": null} {"id": 293994443, "node_id": "MDExOlB1bGxSZXF1ZXN0MjkzOTk0NDQz", "number": 536, "state": "closed", "locked": 0, "title": "Switch to ~= dependencies, closes #532", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-07-03T04:12:16Z", "updated_at": "2019-07-03T04:32:55Z", "closed_at": "2019-07-03T04:32:55Z", "merged_at": "2019-07-03T04:32:55Z", "merge_commit_sha": "f0d32da0a9af87bcb15e34e35424f0c0053be83a", "assignee": null, "milestone": null, "draft": 0, "head": "391d109dc3f9230dc4ee4afd20041e480e90e739", "base": "4d2fdafe39159c9a8aa83f7e9bfe768bbbbb56a3", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/536", "merged_by": null, "auto_merge": null} {"id": 294400446, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjk0NDAwNDQ2", "number": 539, "state": "closed", "locked": 0, "title": "Secret plugin configuration options", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #538 ", "created_at": "2019-07-04T03:21:20Z", "updated_at": "2019-07-04T05:36:45Z", "closed_at": "2019-07-04T05:36:45Z", "merged_at": "2019-07-04T05:36:45Z", "merge_commit_sha": "a2d45931935f6bb73605a94afedf9e78308c95d6", "assignee": null, "milestone": null, "draft": 0, "head": "fd6164b03ebe450a9a00df2e5be2dc7bbfbd9a3f", "base": "f0d32da0a9af87bcb15e34e35424f0c0053be83a", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/539", "merged_by": null, "auto_merge": null} {"id": 294992578, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjk0OTkyNTc4", "number": 542, "state": "closed", "locked": 0, "title": "extra_template_vars plugin hook", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #541", "created_at": "2019-07-05T22:19:17Z", "updated_at": "2019-07-06T00:05:57Z", "closed_at": "2019-07-06T00:05:56Z", "merged_at": "2019-07-06T00:05:56Z", "merge_commit_sha": "fcfcae21e67cc15090942b1d2a47b5f016279337", "assignee": null, "milestone": null, "draft": 0, "head": "e81c7abb40c8ecf8d9d23cbcdde045e0a3b4ab14", "base": "a18e0964ecd04593f227616538a80dee08768057", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/542", "merged_by": null, "auto_merge": null} {"id": 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": 295065796, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjk1MDY1Nzk2", "number": 544, "state": "closed", "locked": 0, "title": "--plugin-secret option", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #543\r\n\r\n- [x] Zeit Now v1 support\r\n- [x] Solve escaping of ENV in Dockerfile\r\n- [x] Heroku support\r\n- [x] Unit tests\r\n- [x] Cloud Run support\r\n- [x] Documentation\r\n", "created_at": "2019-07-06T22:18:20Z", "updated_at": "2019-07-08T02:06:31Z", "closed_at": "2019-07-08T02:06:31Z", "merged_at": "2019-07-08T02:06:31Z", "merge_commit_sha": "973f8f139df6ad425354711052cfc2256de2e522", "assignee": null, "milestone": {"value": 4471010, "label": "Datasette 0.29"}, "draft": 0, "head": "ccf80604e931fba1893b5bab11de386fed82009e", "base": "fcfcae21e67cc15090942b1d2a47b5f016279337", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/544", "merged_by": null, "auto_merge": null} {"id": 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": 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": 297243073, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjk3MjQzMDcz", "number": 559, "state": "closed", "locked": 0, "title": "Bump to uvicorn 0.8.4", "user": {"value": 9599, "label": "simonw"}, "body": "https://github.com/encode/uvicorn/commits/0.8.4\r\n\r\nQuery strings will now be included in log files: https://github.com/encode/uvicorn/pull/384", "created_at": "2019-07-12T22:30:29Z", "updated_at": "2019-07-13T22:34:58Z", "closed_at": "2019-07-13T22:34:58Z", "merged_at": "2019-07-13T22:34:58Z", "merge_commit_sha": "d224ee2c98ac39c2c6e21a0ac0c62e5c3e1ccd11", "assignee": null, "milestone": null, "draft": 0, "head": "029e3d53634cc38690d5b56427a3c87851a61b09", "base": "f2006cca80040871439055ae6ccbc14e589bdf4b", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/559", "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": 313384926, "node_id": "MDExOlB1bGxSZXF1ZXN0MzEzMzg0OTI2", "number": 571, "state": "closed", "locked": 0, "title": "detect_fts now works with alternative table escaping", "user": {"value": 9599, "label": "simonw"}, "body": "Fixes #570", "created_at": "2019-09-03T00:23:39Z", "updated_at": "2019-09-03T00:32:28Z", "closed_at": "2019-09-03T00:32:28Z", "merged_at": "2019-09-03T00:32:28Z", "merge_commit_sha": "2dc5c8dc259a0606162673d394ba8cc1c6f54428", "assignee": null, "milestone": null, "draft": 0, "head": "a85239f69261c10f1a9f90514c8b5d113cb94585", "base": "f04deebec4f3842f7bd610cd5859de529f77d50e", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/571", "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": 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": 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": 329890320, "node_id": "MDExOlB1bGxSZXF1ZXN0MzI5ODkwMzIw", "number": 599, "state": "closed", "locked": 0, "title": "Fix for /foo v.s. /foo-bar issue in #597", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #597", "created_at": "2019-10-18T19:22:55Z", "updated_at": "2019-10-18T22:51:07Z", "closed_at": "2019-10-18T22:51:07Z", "merged_at": "2019-10-18T22:51:07Z", "merge_commit_sha": "b647b5efc29300f715ba656e41b0591f342938e1", "assignee": null, "milestone": null, "draft": 0, "head": "8cc5a8dc35371f7d4353a4206b2d079f520c61cd", "base": "b6ad1fdc7068cb8248787843e7438d1f19fa2e3a", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/599", "merged_by": null, "auto_merge": null} {"id": 329947180, "node_id": "MDExOlB1bGxSZXF1ZXN0MzI5OTQ3MTgw", "number": 601, "state": "closed", "locked": 0, "title": "Don't auto-format SQL on page load", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #600", "created_at": "2019-10-18T22:37:39Z", "updated_at": "2019-10-20T02:29:49Z", "closed_at": "2019-10-18T23:56:45Z", "merged_at": "2019-10-18T23:56:45Z", "merge_commit_sha": "e877b1cb12076946fdbec7ca2fbfbfc75c1c2a28", "assignee": null, "milestone": null, "draft": 0, "head": "3a963734590caa3ad69bfe64c31690f3e4de61a4", "base": "b6ad1fdc7068cb8248787843e7438d1f19fa2e3a", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/601", "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": 334448258, "node_id": "MDExOlB1bGxSZXF1ZXN0MzM0NDQ4MjU4", "number": 609, "state": "closed", "locked": 0, "title": "Update to latest black", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-10-30T18:42:35Z", "updated_at": "2019-10-30T18:49:01Z", "closed_at": "2019-10-30T18:49:01Z", "merged_at": "2019-10-30T18:49:01Z", "merge_commit_sha": "5dd4d2b2d3abcfd507a6df47e7c2fbad3c552fd8", "assignee": null, "milestone": null, "draft": 0, "head": "6f57e5e77bac29ac88d51271fd0c785859a820ce", "base": "f4c0830529a9513a83437a9e1550bbe27ebc5c64", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/609", "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": 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": 163561830, "node_id": "MDExOlB1bGxSZXF1ZXN0MTYzNTYxODMw", "number": 181, "state": "closed", "locked": 0, "title": "add \"format sql\" button to query page, uses sql-formatter", "user": {"value": 1957344, "label": "bsmithgall"}, "body": "Cool project!\r\n\r\nThis fixes #136 using the suggested [sql formatter](https://github.com/zeroturnaround/sql-formatter) library. I included the minified version in the bundle and added the relevant scripts to the codemirror includes instead of adding new files, though I could also add new files. I wanted to keep it all together, since the result of the format needs access to the editor in order to properly update the codemirror instance.", "created_at": "2018-01-17T21:50:04Z", "updated_at": "2019-11-11T03:08:25Z", "closed_at": "2019-11-11T03:08:25Z", "merged_at": null, "merge_commit_sha": "a9ac208088e536043890e0f7ff8a182398576a51", "assignee": null, "milestone": null, "draft": 0, "head": "86ac746cfcbf2fa86863f8fab528494600eac1ae", "base": "a290f28caae61b47e76e825c06984f22fc41a694", "author_association": "NONE", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/181", "merged_by": null, "auto_merge": null} {"id": 285698310, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjg1Njk4MzEw", "number": 501, "state": "closed", "locked": 0, "title": "Test against Python 3.8-dev using Travis", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-06-06T08:37:53Z", "updated_at": "2019-11-11T03:23:29Z", "closed_at": "2019-11-11T03:23:29Z", "merged_at": null, "merge_commit_sha": "1aac0cf0ab962060dd5cff19b8b179bb7fa0f00b", "assignee": null, "milestone": null, "draft": 0, "head": "a5defb684fcc734f6325ca08beef9f49c3e7a298", "base": "5e8fbf7f6fbc0b63d0479da3806dd9ccd6aaa945", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/501", "merged_by": null, "auto_merge": null} {"id": 339236647, "node_id": "MDExOlB1bGxSZXF1ZXN0MzM5MjM2NjQ3", "number": 623, "state": "closed", "locked": 0, "title": "Test against Python 3.8 in Travis", "user": {"value": 9599, "label": "simonw"}, "body": "Needed for #622", "created_at": "2019-11-11T03:24:54Z", "updated_at": "2019-11-11T03:45:35Z", "closed_at": "2019-11-11T03:45:35Z", "merged_at": "2019-11-11T03:45:35Z", "merge_commit_sha": "1c063fae9dba70f70244db010d55a18846640f07", "assignee": null, "milestone": null, "draft": 0, "head": "877dda2d287ed3b1772f051dffd295a69c3ecd27", "base": "28c4a6db5b5e512db630d7ba6127196185de67c7", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/623", "merged_by": null, "auto_merge": null} {"id": 339244888, "node_id": "MDExOlB1bGxSZXF1ZXN0MzM5MjQ0ODg4", "number": 624, "state": "closed", "locked": 0, "title": "Bump pint to 0.9", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-11-11T04:07:07Z", "updated_at": "2019-11-11T04:19:02Z", "closed_at": "2019-11-11T04:19:02Z", "merged_at": "2019-11-11T04:19:02Z", "merge_commit_sha": "42ee3e16a9ba7cc513b8da944cc1609a5407cf42", "assignee": null, "milestone": null, "draft": 0, "head": "ed17117a2ad675cbf2430f28069bb1854846a6f0", "base": "1c063fae9dba70f70244db010d55a18846640f07", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/624", "merged_by": null, "auto_merge": null} {"id": 327541046, "node_id": "MDExOlB1bGxSZXF1ZXN0MzI3NTQxMDQ2", "number": 595, "state": "closed", "locked": 0, "title": "bump uvicorn to 0.9.0 to be Python-3.8 friendly", "user": {"value": 4312421, "label": "stonebig"}, "body": "as uvicorn-0.9 is needed to get websockets-8.0.2, which is needed to have Python-3.8 compatibility", "created_at": "2019-10-13T10:00:04Z", "updated_at": "2019-11-12T04:46:48Z", "closed_at": "2019-11-12T04:46:48Z", "merged_at": null, "merge_commit_sha": "5a7185bcd15aab28e86338b3771c25af13a94a4c", "assignee": null, "milestone": null, "draft": 0, "head": "e1d92ea94ca8f14879ef280cb7dadab7eed76e9c", "base": "fffd69ec031b83f46680f192ba57a27f0d1f0b8a", "author_association": "NONE", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/595", "merged_by": null, "auto_merge": null} {"id": 247923347, "node_id": "MDExOlB1bGxSZXF1ZXN0MjQ3OTIzMzQ3", "number": 404, "state": "closed", "locked": 0, "title": "Experiment: run Jinja in async mode", "user": {"value": 9599, "label": "simonw"}, "body": "See http://jinja.pocoo.org/docs/2.10/api/#async-support\r\n\r\nTests all pass. Have not checked performance difference yet.\r\n\r\nCreating pull request to run tests in Travis. This is not ready to merge - I'm not yet sure if this is a good idea.", "created_at": "2019-01-27T00:28:44Z", "updated_at": "2019-11-12T05:02:18Z", "closed_at": "2019-11-12T05:02:13Z", "merged_at": null, "merge_commit_sha": "773bcac907d17b16eef604ad943837da39a10090", "assignee": null, "milestone": null, "draft": 0, "head": "dd7f24a47f660e2f0fc1e97a13d28908c28dc245", "base": "909cc8fbdfc9c05e447f40e9a73489809602c3cd", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/404", "merged_by": null, "auto_merge": null} {"id": 339722790, "node_id": "MDExOlB1bGxSZXF1ZXN0MzM5NzIyNzkw", "number": 627, "state": "closed", "locked": 0, "title": "Support Python 3.8, stop supporting Python 3.5", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #622", "created_at": "2019-11-12T04:36:33Z", "updated_at": "2020-04-05T10:23:58Z", "closed_at": "2019-11-12T05:09:12Z", "merged_at": "2019-11-12T05:09:12Z", "merge_commit_sha": "cf7776d36fbacefa874cbd6e5fcdc9fff7661203", "assignee": null, "milestone": null, "draft": 0, "head": "18cc795b5c6ec9223a5cbc4f30b19710c17f7eaa", "base": "42ee3e16a9ba7cc513b8da944cc1609a5407cf42", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/627", "merged_by": null, "auto_merge": null} {"id": 339742432, "node_id": "MDExOlB1bGxSZXF1ZXN0MzM5NzQyNDMy", "number": 630, "state": "closed", "locked": 0, "title": "Use python:3.8 base Docker image", "user": {"value": 9599, "label": "simonw"}, "body": "Closes #629", "created_at": "2019-11-12T06:02:37Z", "updated_at": "2019-11-12T06:03:10Z", "closed_at": "2019-11-12T06:03:10Z", "merged_at": "2019-11-12T06:03:10Z", "merge_commit_sha": "d977fbadf70a96bf2eea1407d01f99d98e092dec", "assignee": null, "milestone": null, "draft": 0, "head": "53180ec09483bd4eef00346a39b302aeb3039e7d", "base": "f554be39fc14ddc18921ca29d3920d55aad03d46", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/630", "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": 322529381, "node_id": "MDExOlB1bGxSZXF1ZXN0MzIyNTI5Mzgx", "number": 578, "state": "closed", "locked": 0, "title": "Added support for multi arch builds", "user": {"value": 887095, "label": "heussd"}, "body": "Minor changes in Dockerfile and new Makefile to support Docker multi architecture builds. `make`will build one image per architecture and push them as one Docker manifest to Docker Hub. Feel free to change `IMAGE_NAME ` to `datasetteproject/datasette` to update your official Docker Hub image(s).", "created_at": "2019-09-29T18:43:03Z", "updated_at": "2019-11-13T19:13:15Z", "closed_at": "2019-11-13T19:13:15Z", "merged_at": null, "merge_commit_sha": "ae1aa0929b9e62a413ec9b4a40588e6aafe50573", "assignee": null, "milestone": null, "draft": 0, "head": "ce6372bc6210ae52ac1951647b8fbaee40d64fc1", "base": "0fc8afde0eb5ef677f4ac31601540d6168c8208d", "author_association": "NONE", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/578", "merged_by": null, "auto_merge": null} {"id": 232172106, "node_id": "MDExOlB1bGxSZXF1ZXN0MjMyMTcyMTA2", "number": 389, "state": "closed", "locked": 0, "title": "Bump dependency versions", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2018-11-20T02:23:12Z", "updated_at": "2019-11-13T19:13:41Z", "closed_at": "2019-11-13T19:13:41Z", "merged_at": null, "merge_commit_sha": "9194c0165aef411e0784ba49939b1005306f1f38", "assignee": null, "milestone": null, "draft": 0, "head": "f8349b45916e68d2f89c57694bd0e6afaf1bd508", "base": "5e3a432a0caa23837fa58134f69e2f82e4f632a6", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/389", "merged_by": null, "auto_merge": null} {"id": 340743220, "node_id": "MDExOlB1bGxSZXF1ZXN0MzQwNzQzMjIw", "number": 635, "state": "closed", "locked": 0, "title": "Use Jinja async mode", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #628. Still needs documentation.", "created_at": "2019-11-14T01:20:57Z", "updated_at": "2019-11-14T23:14:23Z", "closed_at": "2019-11-14T23:14:23Z", "merged_at": "2019-11-14T23:14:22Z", "merge_commit_sha": "8c642f04e0608bf537fdd1f76d64c2367fb04d57", "assignee": null, "milestone": null, "draft": 0, "head": "0e8f8be1dbf89a6f689a5eea4a0534199a0028f6", "base": "b51f258d00bb3c3b401f15d46a1fbd50394dbe1c", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/635", "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": 368734500, "node_id": "MDExOlB1bGxSZXF1ZXN0MzY4NzM0NTAw", "number": 663, "state": "closed", "locked": 0, "title": "-p argument for datasette package, plus tests - refs #661", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2020-01-29T19:47:49Z", "updated_at": "2020-01-29T22:46:43Z", "closed_at": "2020-01-29T22:46:43Z", "merged_at": "2020-01-29T22:46:43Z", "merge_commit_sha": "67fc9c5720ed1fcd62b116481f70d4e80b403a22", "assignee": null, "milestone": null, "draft": 0, "head": "8adfc9db7f15e36fed677be4a9c833ff2cdec0bc", "base": "34d77d780f68b778fd9d6ebbaf69f250436f055f", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/663", "merged_by": null, "auto_merge": null} {"id": 370675007, "node_id": "MDExOlB1bGxSZXF1ZXN0MzcwNjc1MDA3", "number": 664, "state": "closed", "locked": 0, "title": "Datasette.render_template() method", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #577", "created_at": "2020-02-04T06:53:59Z", "updated_at": "2020-02-04T20:26:18Z", "closed_at": "2020-02-04T20:26:18Z", "merged_at": "2020-02-04T20:26:18Z", "merge_commit_sha": "70b915fb4bc214f9d064179f87671f8a378aa127", "assignee": null, "milestone": null, "draft": 0, "head": "19d4406f562aca291fef04363802093672620220", "base": "286ed286b68793532c2a38436a08343b45cfbc91", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/664", "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": 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": 379192258, "node_id": "MDExOlB1bGxSZXF1ZXN0Mzc5MTkyMjU4", "number": 683, "state": "closed", "locked": 0, "title": ".execute_write() and .execute_write_fn() methods on Database", "user": {"value": 9599, "label": "simonw"}, "body": "See #682\r\n\r\n- [x] Come up with design for `.execute_write()` and `.execute_write_fn()`\r\n- [x] Build some quick demo plugins to exercise the design\r\n- [x] Write some unit tests\r\n- [x] Write the documentation", "created_at": "2020-02-24T19:51:58Z", "updated_at": "2020-05-30T18:40:20Z", "closed_at": "2020-02-25T04:45:08Z", "merged_at": "2020-02-25T04:45:08Z", "merge_commit_sha": "a093c5f79fa034a97d2ad8b606745dd3b80365af", "assignee": null, "milestone": {"value": 3268330, "label": "Datasette 1.0"}, "draft": 0, "head": "ec6e2edfe18446c9d77e3f30efbc299d27ea5c1b", "base": "411056c4c43e74f2b3d0e3bc1175e7998516b1b3", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/683", "merged_by": null, "auto_merge": null} {"id": 379378780, "node_id": "MDExOlB1bGxSZXF1ZXN0Mzc5Mzc4Nzgw", "number": 686, "state": "closed", "locked": 0, "title": "?_searchmode=raw option", "user": {"value": 9599, "label": "simonw"}, "body": "Closes #676", "created_at": "2020-02-25T05:45:50Z", "updated_at": "2020-02-25T05:56:09Z", "closed_at": "2020-02-25T05:56:04Z", "merged_at": "2020-02-25T05:56:04Z", "merge_commit_sha": "6cb65555f46456eb31b62e855e21b1d8c809b1a2", "assignee": null, "milestone": null, "draft": 0, "head": "abc782cb342c21b565142e44e70502e61ac6756b", "base": "a093c5f79fa034a97d2ad8b606745dd3b80365af", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/686", "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": 381666777, "node_id": "MDExOlB1bGxSZXF1ZXN0MzgxNjY2Nzc3", "number": 688, "state": "closed", "locked": 0, "title": "Don't count rows on homepage for DBs > 100MB", "user": {"value": 9599, "label": "simonw"}, "body": "Closes #649.", "created_at": "2020-02-29T01:01:06Z", "updated_at": "2020-02-29T01:08:30Z", "closed_at": "2020-02-29T01:08:29Z", "merged_at": "2020-02-29T01:08:29Z", "merge_commit_sha": "7f5a330377fd7db1f6d1efa5686d183bcaf89217", "assignee": null, "milestone": null, "draft": 0, "head": "025fdd46f77822c0cbeb7856611c0a65a9b83057", "base": "0f8e91c68f2d2ad48efc8324b12762bf8b58facd", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/688", "merged_by": null, "auto_merge": null} {"id": 354869391, "node_id": "MDExOlB1bGxSZXF1ZXN0MzU0ODY5Mzkx", "number": 652, "state": "closed", "locked": 0, "title": "Quick (and uninformed and perhaps misguided) attempt to add a url for hosting datasette at a particular host/URI", "user": {"value": 132978, "label": "terrycojones"}, "body": "As usual, I don't really know what I'm doing... so this is just a suggested approach. I've not written tests, I've not run the tests, I don't know if I've missed some absolute URLs that would need to have the leading slash dropped.\r\n\r\nBUT, I tested it with `--config base_url:http://127.0.0.1:8001/` on the command line and from what little I know about datasette it's at least working in some obvious cases.\r\n\r\nMy changes are based on what I saw in https://github.com/simonw/datasette/commit/8da2db4b71096b19e7a9ef1929369b8483d448bf (thanks!)\r\n\r\nI'm happy to be more thorough on this if you think it's worth pursuing.\r\n\r\nFixes #394 (he said, optimistically).", "created_at": "2019-12-18T23:37:16Z", "updated_at": "2020-03-24T22:14:50Z", "closed_at": "2020-03-24T22:14:50Z", "merged_at": null, "merge_commit_sha": "8e674de58c17c89c8a4a90bc3ec6e02151b354e5", "assignee": null, "milestone": null, "draft": 0, "head": "eaa636841e38d40360a74596ef1a0df50f6a86a5", "base": "a498d0fe6590f9bdbc4faf9e0dd5faeb3b06002c", "author_association": "NONE", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/652", "merged_by": null, "auto_merge": null} {"id": 393274433, "node_id": "MDExOlB1bGxSZXF1ZXN0MzkzMjc0NDMz", "number": 708, "state": "closed", "locked": 0, "title": "base_url configuration setting, refs #394", "user": {"value": 9599, "label": "simonw"}, "body": "Pull request implementing #394", "created_at": "2020-03-24T21:52:00Z", "updated_at": "2020-03-25T00:18:44Z", "closed_at": "2020-03-25T00:18:44Z", "merged_at": "2020-03-25T00:18:44Z", "merge_commit_sha": "7656fd64d8b6a32ebc34d89c1b8711cc5ea240f7", "assignee": null, "milestone": {"value": 5234079, "label": "Datasette 0.39"}, "draft": 0, "head": "b1f953b5de1bef239ddb1d133f9b2e19f8e3438a", "base": "a498d0fe6590f9bdbc4faf9e0dd5faeb3b06002c", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/708", "merged_by": null, "auto_merge": null} {"id": 397749653, "node_id": "MDExOlB1bGxSZXF1ZXN0Mzk3NzQ5NjUz", "number": 714, "state": "closed", "locked": 0, "title": "--metadata accepts YAML as well as JSON", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #713. Still needs tests and documentation.", "created_at": "2020-04-02T18:36:02Z", "updated_at": "2020-04-02T19:30:54Z", "closed_at": "2020-04-02T19:30:54Z", "merged_at": "2020-04-02T19:30:54Z", "merge_commit_sha": "6717c719dd36dc2adc0f9da38a8c8e08129e96b4", "assignee": null, "milestone": null, "draft": 0, "head": "5170c31adc44f6ef14b21782ba6f8ecb46dd9450", "base": "2aaad72789c427875426673c1a43e67c86fc970e", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/714", "merged_by": null, "auto_merge": null} {"id": 409123897, "node_id": "MDExOlB1bGxSZXF1ZXN0NDA5MTIzODk3", "number": 737, "state": "closed", "locked": 0, "title": "Custom pages mechanism, refs #648", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #648. TODO:\r\n- [x] Pass a `view_name` to `render_template()`\r\n- [x] Mechanism for custom status code / headers / redirect\r\n- [x] Documentation", "created_at": "2020-04-26T17:31:41Z", "updated_at": "2020-04-26T18:46:43Z", "closed_at": "2020-04-26T18:46:43Z", "merged_at": "2020-04-26T18:46:43Z", "merge_commit_sha": "304e7b1d9fd904ae1c35600bc03662eb90eeeae0", "assignee": null, "milestone": null, "draft": 0, "head": "b5bbf1bd88f67a26eb34902bc11f2da7692c7af2", "base": "227bb3e91fe34811a9374150798643a5af98ed79", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/737", "merged_by": null, "auto_merge": null} {"id": 409153870, "node_id": "MDExOlB1bGxSZXF1ZXN0NDA5MTUzODcw", "number": 739, "state": "closed", "locked": 0, "title": "Configuration directory mode", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #731\r\n\r\nTODO:\r\n\r\n- [x] Decide how to combine explicit command-line options with items detected from the directory structure\r\n- [x] Add unit tests\r\n- [x] Implement `inspect-data.json` mechanism for populating `immutables`\r\n- [x] Add documentation", "created_at": "2020-04-26T20:37:46Z", "updated_at": "2020-04-27T16:30:25Z", "closed_at": "2020-04-27T16:30:25Z", "merged_at": "2020-04-27T16:30:25Z", "merge_commit_sha": "25014ca25eb70b4c1217558ebd14db2845973bfb", "assignee": null, "milestone": null, "draft": 0, "head": "0d8fa53fab672fcf16b6a75aa55b07ccd243fb96", "base": "1b7b66c465e44025ec73421bd69752e42f108321", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/739", "merged_by": null, "auto_merge": null} {"id": 410469272, "node_id": "MDExOlB1bGxSZXF1ZXN0NDEwNDY5Mjcy", "number": 746, "state": "closed", "locked": 0, "title": "shutil.Error, not OSError", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #744", "created_at": "2020-04-29T03:30:51Z", "updated_at": "2020-04-29T07:07:24Z", "closed_at": "2020-04-29T07:07:23Z", "merged_at": null, "merge_commit_sha": "e4e8b51b50e51b2515c6d8874d16c4607f79b80a", "assignee": null, "milestone": null, "draft": 0, "head": "af3a5b91503f5d74aa111bbcd1ee531ee00f9ed7", "base": "89c4ddd4828623888e91a1d2cb396cba12d4e7b4", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/746", "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
\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": 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
\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": 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
\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": 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
\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": 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
\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": 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": 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
\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": 415286105, "node_id": "MDExOlB1bGxSZXF1ZXN0NDE1Mjg2MTA1", "number": 763, "state": "closed", "locked": 0, "title": "Documentation + improvements for db.execute() and Results class", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #685\r\n\r\nStill TODO:\r\n\r\n- [x] Implement `results.first()`\r\n- [x] Implement `results.single_value()`\r\n- [x] Unit tests for the above\r\n", "created_at": "2020-05-08T15:16:02Z", "updated_at": "2020-06-11T16:05:48Z", "closed_at": "2020-05-08T16:05:46Z", "merged_at": "2020-05-08T16:05:46Z", "merge_commit_sha": "4433306c1855ad69840cc76cbd41086137572be2", "assignee": null, "milestone": null, "draft": 0, "head": "1ea62c77221d07cd121367f1c6b620f8bde0716a", "base": "69e3a855dd7e5a77409d70b18c45ae3c1a145a75", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/763", "merged_by": null, "auto_merge": null} {"id": 421491810, "node_id": "MDExOlB1bGxSZXF1ZXN0NDIxNDkxODEw", "number": 768, "state": "closed", "locked": 0, "title": "Use dirs_exist_ok=True", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #744", "created_at": "2020-05-21T17:53:44Z", "updated_at": "2020-05-27T20:21:56Z", "closed_at": "2020-05-21T17:53:51Z", "merged_at": "2020-05-21T17:53:51Z", "merge_commit_sha": "cee671a58f417f827d1735b1abaa40716534ea67", "assignee": null, "milestone": {"value": 5471110, "label": "Datasette 0.43"}, "draft": 0, "head": "f2e0a558238a34dc482803762de2509474a178c6", "base": "faea5093b865031f650da7da6539430f732f511a", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/768", "merged_by": null, "auto_merge": null} {"id": 424032445, "node_id": "MDExOlB1bGxSZXF1ZXN0NDI0MDMyNDQ1", "number": 769, "state": "closed", "locked": 0, "title": "Backport of Python 3.8 shutil.copytree", "user": {"value": 9599, "label": "simonw"}, "body": "Closes #744", "created_at": "2020-05-27T18:17:15Z", "updated_at": "2020-05-27T20:21:56Z", "closed_at": "2020-05-27T18:17:44Z", "merged_at": "2020-05-27T18:17:44Z", "merge_commit_sha": "2d099ad9c657d2cab59de91cdb8bfed2da236ef6", "assignee": null, "milestone": {"value": 5471110, "label": "Datasette 0.43"}, "draft": 0, "head": "6f80757f27e4651e6533856ea87b676dbc0d9c37", "base": "cee671a58f417f827d1735b1abaa40716534ea67", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/769", "merged_by": null, "auto_merge": null} {"id": 424085264, "node_id": "MDExOlB1bGxSZXF1ZXN0NDI0MDg1MjY0", "number": 772, "state": "closed", "locked": 0, "title": "Test that plugin hooks are unit tested", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #771", "created_at": "2020-05-27T20:01:32Z", "updated_at": "2020-05-27T20:21:56Z", "closed_at": "2020-05-27T20:16:03Z", "merged_at": "2020-05-27T20:16:02Z", "merge_commit_sha": "da87e963bff24e47878a5bc2025c8bfc63d4bc93", "assignee": null, "milestone": {"value": 5471110, "label": "Datasette 0.43"}, "draft": 0, "head": "173b6947521f1c1b47a119f62f379bf4278c87c9", "base": "41a0cd7b6afe0397efbbf27ad822679fc574811a", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/772", "merged_by": null, "auto_merge": null} {"id": 425531205, "node_id": "MDExOlB1bGxSZXF1ZXN0NDI1NTMxMjA1", "number": 783, "state": "closed", "locked": 0, "title": "Authentication: plugin hooks plus default --root auth mechanism", "user": {"value": 9599, "label": "simonw"}, "body": "See #699", "created_at": "2020-05-30T22:25:47Z", "updated_at": "2020-06-01T01:16:44Z", "closed_at": "2020-06-01T01:16:43Z", "merged_at": "2020-06-01T01:16:43Z", "merge_commit_sha": "57cf5139c552cb7feab9947daa949ca434cc0a66", "assignee": null, "milestone": null, "draft": 0, "head": "116a26ce2d4af26c928e361e1b24dd6a6bb14eca", "base": "c4fbe50676929b512940aab90de590a78ac5d7fc", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/783", "merged_by": null, "auto_merge": null} {"id": 391924509, "node_id": "MDExOlB1bGxSZXF1ZXN0MzkxOTI0NTA5", "number": 703, "state": "closed", "locked": 0, "title": "WIP implementation of writable canned queries", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #698.", "created_at": "2020-03-21T22:23:51Z", "updated_at": "2020-06-03T00:08:14Z", "closed_at": "2020-06-02T23:57:35Z", "merged_at": null, "merge_commit_sha": "80c5a74a947e63673389604de12e80fa27305454", "assignee": null, "milestone": null, "draft": 1, "head": "61e40e917efc43a8aea5298a22badbb6eaea3fa1", "base": "89c4ddd4828623888e91a1d2cb396cba12d4e7b4", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/703", "merged_by": null, "auto_merge": null} {"id": 426891471, "node_id": "MDExOlB1bGxSZXF1ZXN0NDI2ODkxNDcx", "number": 796, "state": "closed", "locked": 0, "title": "New WIP writable canned queries", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #698. Replaces #703\r\n\r\nStill todo:\r\n\r\n- [x] Unit tests\r\n- ~~Figure out `.json` mode~~\r\n- [x] Flash message solution\r\n- ~~CSRF protection~~\r\n- [x] Better error message display on errors\r\n- [x] Documentation\r\n- ~~Maybe widgets?~~ I'll do these later", "created_at": "2020-06-03T00:08:00Z", "updated_at": "2020-06-03T15:16:52Z", "closed_at": "2020-06-03T15:16:50Z", "merged_at": "2020-06-03T15:16:50Z", "merge_commit_sha": "aa82d0370463580f2cb10d9617f1bcbe45cc994a", "assignee": null, "milestone": {"value": 3268330, "label": "Datasette 1.0"}, "draft": 0, "head": "e164939de719b5930ca4972e20490c9b2fd37f6d", "base": "9690ce606823bbfceb0c50d59e03adf7bb1a8475", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/796", "merged_by": null, "auto_merge": null} {"id": 428212421, "node_id": "MDExOlB1bGxSZXF1ZXN0NDI4MjEyNDIx", "number": 798, "state": "closed", "locked": 0, "title": "CSRF protection", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #793", "created_at": "2020-06-05T04:22:35Z", "updated_at": "2020-06-06T00:43:41Z", "closed_at": "2020-06-05T19:05:58Z", "merged_at": "2020-06-05T19:05:57Z", "merge_commit_sha": "84a9c4ff75460f91c049bd30bba3cee1fd89d9e2", "assignee": null, "milestone": {"value": 5512395, "label": "Datasette 0.44"}, "draft": 0, "head": "fe43963376b1c44ec23a213277bcb33d98e4aef9", "base": "d96ac1d52cacf34bae09705eb8f9a0e3f81c426b", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/798", "merged_by": null, "auto_merge": null} {"id": 429366641, "node_id": "MDExOlB1bGxSZXF1ZXN0NDI5MzY2NjQx", "number": 803, "state": "closed", "locked": 0, "title": "Canned query permissions", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #800. Closes #786", "created_at": "2020-06-06T18:20:00Z", "updated_at": "2020-06-06T19:40:21Z", "closed_at": "2020-06-06T19:40:20Z", "merged_at": "2020-06-06T19:40:20Z", "merge_commit_sha": "415ccd7cbdeebfb52f514a0387221023aa8b4d91", "assignee": null, "milestone": null, "draft": 0, "head": "3359d54a4eb9c9725c27a85437661b5180c4099a", "base": "9c563d6aed072f14d3d25f58e84659f9caa1a243", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/803", "merged_by": null, "auto_merge": null} {"id": 431478724, "node_id": "MDExOlB1bGxSZXF1ZXN0NDMxNDc4NzI0", "number": 819, "state": "closed", "locked": 0, "title": "register_routes() plugin hook", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #215", "created_at": "2020-06-09T01:20:44Z", "updated_at": "2020-06-09T03:12:08Z", "closed_at": "2020-06-09T03:12:07Z", "merged_at": "2020-06-09T03:12:07Z", "merge_commit_sha": "f5e79adf26d0daa3831e3fba022f1b749a9efdee", "assignee": null, "milestone": {"value": 5512395, "label": "Datasette 0.44"}, "draft": 0, "head": "18127f074efc1b0148d1098da063e51ccea7797c", "base": "647c5ff0f3e8140f40d7f41f0874ce4e1f4df65c", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/819", "merged_by": null, "auto_merge": null} {"id": 429613893, "node_id": "MDExOlB1bGxSZXF1ZXN0NDI5NjEzODkz", "number": 809, "state": "closed", "locked": 0, "title": "Publish secrets", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #787. Will need quite a bit of manual testing since this involves code which runs against Heroku and Cloud Run.", "created_at": "2020-06-07T02:00:31Z", "updated_at": "2020-06-11T16:02:13Z", "closed_at": "2020-06-11T16:02:03Z", "merged_at": "2020-06-11T16:02:03Z", "merge_commit_sha": "98632f0a874b7b9dac6abf0abb9fdb7e2839a4d3", "assignee": null, "milestone": {"value": 5512395, "label": "Datasette 0.44"}, "draft": 0, "head": "abdac31328646705a957d58429b88d185ef43ded", "base": "ce4958018ede00fbdadf0c37a99889b6901bfb9b", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/809", "merged_by": null, "auto_merge": null} {"id": 434055752, "node_id": "MDExOlB1bGxSZXF1ZXN0NDM0MDU1NzUy", "number": 844, "state": "closed", "locked": 0, "title": "Action to run tests and upload coverage report", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #843", "created_at": "2020-06-13T20:52:47Z", "updated_at": "2020-06-13T21:36:52Z", "closed_at": "2020-06-13T21:36:50Z", "merged_at": "2020-06-13T21:36:50Z", "merge_commit_sha": "cf7a2bdb404734910ec07abc7571351a2d934828", "assignee": null, "milestone": null, "draft": 0, "head": "1210d9f41841bdca450f85a2342cdb0ff339c1b4", "base": "80c18a18fc444b89cc12b73599d56e091f3a3c87", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/844", "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
\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": 440946817, "node_id": "MDExOlB1bGxSZXF1ZXN0NDQwOTQ2ODE3", "number": 869, "state": "closed", "locked": 0, "title": "Magic parameters for canned queries", "user": {"value": 9599, "label": "simonw"}, "body": "Implementation for #842\r\n\r\nTODO:\r\n\r\n- [x] Add tests for built-in magic parameters\r\n- [x] Magic parameters should not show up as blank form fields on the query page\r\n- [x] Update documentation for new `_request_X` (now called `_header_X`) implementation where X is a key from the ASGI scope\r\n- [x] Make sure these only work for canned queries, not for arbitrary SQL queries (security issue)\r\n- [x] Add test for the `register_magic_parameters` plugin hook\r\n- [x] Add documentation for the `register_magic_parameters` plugin hook\r\n", "created_at": "2020-06-27T18:37:21Z", "updated_at": "2020-06-28T02:58:18Z", "closed_at": "2020-06-28T02:58:17Z", "merged_at": "2020-06-28T02:58:17Z", "merge_commit_sha": "563f5a2d3ab30ad08daee38f5ec3ed6429ac9206", "assignee": null, "milestone": {"value": 5533512, "label": "Datasette 0.45"}, "draft": 0, "head": "9e693a7aae3b4a0882881e3a1c182e1c0c753efd", "base": "4b142862f237f95a731cb8263a293eda70d13c82", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/869", "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": 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}