{"html_url": "https://github.com/simonw/datasette/releases/tag/0.27", "id": 15389392, "node_id": "MDc6UmVsZWFzZTE1Mzg5Mzky", "tag_name": "0.27", "target_commitish": "master", "name": "Datasette 0.27", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-02-01T03:47:05Z", "published_at": "2019-02-06T05:10:20Z", "body": "https://datasette.readthedocs.io/en/stable/changelog.html#v0-27", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.28", "id": 17450414, "node_id": "MDc6UmVsZWFzZTE3NDUwNDE0", "tag_name": "0.28", "target_commitish": "master", "name": "Datasette 0.28", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-05-19T21:37:49Z", "published_at": "2019-05-19T21:42:28Z", "body": "[Datasette 0.28](https://datasette.readthedocs.io/en/stable/changelog.html#v0-28) - a salmagundi of new features!\r\n * No longer immutable! Datasette now supports [databases that change](https://datasette.readthedocs.io/en/stable/changelog.html#supporting-databases-that-change).\r\n * [Faceting improvements](https://datasette.readthedocs.io/en/stable/changelog.html#faceting-improvements-and-faceting-plugins) including facet-by-JSON-array and the ability to define custom faceting using plugins.\r\n * [datasette publish cloudrun](https://datasette.readthedocs.io/en/stable/changelog.html#datasette-publish-cloudrun) lets you publish databasese to Google's new Cloud Run hosting service.\r\n * New [register_output_renderer](https://datasette.readthedocs.io/en/stable/changelog.html#register-output-renderer-plugins) plugin hook for adding custom output extensions to Datasette in addition to the default `.json` and `.csv`.\r\n * Dozens of other smaller features and tweaks - see [the release notes](https://datasette.readthedocs.io/en/stable/changelog.html#v0-28) for full details.", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.29", "id": 18461320, "node_id": "MDc6UmVsZWFzZTE4NDYxMzIw", "tag_name": "0.29", "target_commitish": "master", "name": "Datasette 0.29", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-07-08T03:14:27Z", "published_at": "2019-07-08T03:43:13Z", "body": "ASGI, new plugin hooks, facet by date and much, much more\u2026 See [the release notes](https://datasette.readthedocs.io/en/stable/changelog.html#v0-29) for full details.", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.29.1", "id": 18598489, "node_id": "MDc6UmVsZWFzZTE4NTk4NDg5", "tag_name": "0.29.1", "target_commitish": "master", "name": "0.29.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-07-11T16:17:55Z", "published_at": "2019-07-14T01:43:44Z", "body": "- Fixed bug with static mounts using relative paths which could lead to traversal exploits (#555) - thanks Abdussamet Kocak!\r\n\r\nhttps://datasette.readthedocs.io/en/stable/changelog.html#v0-29-1", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.29.2", "id": 19704661, "node_id": "MDc6UmVsZWFzZTE5NzA0NjYx", "tag_name": "0.29.2", "target_commitish": "master", "name": "0.29.2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-07-14T03:04:05Z", "published_at": "2019-09-03T00:33:35Z", "body": "* Bumped Uvicorn to 0.8.4, fixing a bug where the querystring was not included in the server logs. (#559)\r\n* Fixed bug where the navigation breadcrumbs were not displayed correctly on the page for a custom query. (#558)\r\n* Fixed bug where custom query names containing unicode characters caused errors.\r\n\r\nhttps://datasette.readthedocs.io/en/stable/changelog.html#v0-29-2", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.29.3", "id": 20795250, "node_id": "MDc6UmVsZWFzZTIwNzk1MjUw", "tag_name": "0.29.3", "target_commitish": "master", "name": "0.29.3", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-09-03T00:40:53Z", "published_at": "2019-10-18T05:24:54Z", "body": "https://datasette.readthedocs.io/en/stable/changelog.html#v0-29-3", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.30", "id": 21098052, "node_id": "MDc6UmVsZWFzZTIxMDk4MDUy", "tag_name": "0.30", "target_commitish": "master", "name": "0.30", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-10-19T01:08:04Z", "published_at": "2019-10-30T18:51:30Z", "body": "https://datasette.readthedocs.io/en/stable/changelog.html#v0-30", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.30.1", "id": 21162064, "node_id": "MDc6UmVsZWFzZTIxMTYyMDY0", "tag_name": "0.30.1", "target_commitish": "master", "name": "0.30.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-10-30T19:00:21Z", "published_at": "2019-11-02T00:06:02Z", "body": "https://datasette.readthedocs.io/en/stable/changelog.html#v0-30-1", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.30.2", "id": 21169835, "node_id": "MDc6UmVsZWFzZTIxMTY5ODM1", "tag_name": "0.30.2", "target_commitish": "master", "name": "0.30.2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-11-02T23:12:46Z", "published_at": "2019-11-02T23:33:13Z", "body": "https://datasette.readthedocs.io/en/latest/changelog.html#v0-30-2", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.31", "id": 21426008, "node_id": "MDc6UmVsZWFzZTIxNDI2MDA4", "tag_name": "0.31", "target_commitish": "master", "name": "Datasette 0.31", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-11-12T05:33:51Z", "published_at": "2019-11-13T02:16:15Z", "body": "This version adds compatibility with Python 3.8 and breaks compatibility with Python 3.5.\r\n\r\nFull release notes: https://datasette.readthedocs.io/en/stable/changelog.html#v0-31", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.31.1", "id": 21426299, "node_id": "MDc6UmVsZWFzZTIxNDI2Mjk5", "tag_name": "0.31.1", "target_commitish": "master", "name": "0.31.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-11-13T02:18:39Z", "published_at": "2019-11-13T02:40:53Z", "body": "- Deployments created using `datasette publish` now use `python:3.8` base Docker image (#629)\r\n\r\nhttps://datasette.readthedocs.io/en/latest/changelog.html#v0-31-1", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.31.2", "id": 21449006, "node_id": "MDc6UmVsZWFzZTIxNDQ5MDA2", "tag_name": "0.31.2", "target_commitish": "master", "name": "0.31.2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-11-13T16:48:36Z", "published_at": "2019-11-13T17:38:59Z", "body": "- Fixed a bug where datasette publish heroku applications failed to start (#633)\r\n- Fix for datasette publish with just --source_url - thanks, Stanley Zheng (#572)\r\n- Deployments to Heroku now use Python 3.8.0 (#632)\r\n\r\nhttps://datasette.readthedocs.io/en/latest/changelog.html#v0-31-2", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.32", "id": 21492068, "node_id": "MDc6UmVsZWFzZTIxNDkyMDY4", "tag_name": "0.32", "target_commitish": "master", "name": "Datasette 0.32", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-11-14T23:20:21Z", "published_at": "2019-11-14T23:42:14Z", "body": "Datasette now renders templates using [Jinja async mode](https://jinja.palletsprojects.com/en/2.10.x/api/#async-support). This makes it easy for plugins to provide custom template functions that perform asynchronous actions, for example the new [datasette-template-sql](https://github.com/simonw/datasette-template-sql) plugin which allows custom templates to directly execute SQL queries and render their results. (#628)\r\n\r\nhttps://datasette.readthedocs.io/en/latest/changelog.html#v0-32", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.33", "id": 22415542, "node_id": "MDc6UmVsZWFzZTIyNDE1NTQy", "tag_name": "0.33", "target_commitish": "master", "name": "Datasette 0.33", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-12-22T16:27:04Z", "published_at": "2019-12-22T16:43:31Z", "body": "* `rowid` is now included in dropdown menus for filtering tables (#636)\r\n* Columns are now only suggested for faceting if they have at least one value with more than one record (#638)\r\n* Queries with no results now display \u201c0 results\u201d (#637)\r\n* Improved documentation for the `--static` option (#641)\r\n* asyncio task information is now included on the `/-/threads` debug page\r\n* Bumped Uvicorn dependency 0.11\r\n* You can now use `--port 0` to listen on an available port\r\n* New `template_debug` setting for debugging templates, e.g. https://latest.datasette.io/fixtures/roadside_attractions?_context=1 (#654)\r\n\r\nhttps://datasette.readthedocs.io/en/latest/changelog.html#v0-33", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.34", "id": 23239304, "node_id": "MDc6UmVsZWFzZTIzMjM5MzA0", "tag_name": "0.34", "target_commitish": "master", "name": "Datasette 0.34", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-01-30T00:09:01Z", "published_at": "2020-01-30T00:29:21Z", "body": "- `_search=` queries are now correctly escaped using a new `escape_fts()` custom SQL function. This means you can now run searches for strings like `park.` without seeing errors. (#651)\r\n- Google Cloud Run is no longer in beta, so `datasette publish cloudrun` has been updated to work even if the user has not installed the `gcloud` beta components package. Thanks, Katie McLaughlin (#660)\r\n- `datasette package` now accepts a `--port` option for specifying which port the resulting Docker container should listen on. (#661)\r\n\r\nhttps://datasette.readthedocs.io/en/stable/changelog.html#v0-34\r\n", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.35", "id": 23395622, "node_id": "MDc6UmVsZWFzZTIzMzk1NjIy", "tag_name": "0.35", "target_commitish": "master", "name": "Datasette 0.35", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-02-05T02:17:47Z", "published_at": "2020-02-05T02:32:34Z", "body": "* Added five new plugins and one new conversion tool to the [The Datasette Ecosystem](https://datasette.readthedocs.io/en/latest/ecosystem.html#ecosystem).\r\n* The `Datasette` class has a new `render_template()` method which can be used by plugins to render templates using Datasette\u2019s pre-configured [Jinja](https://jinja.palletsprojects.com/) templating library.\r\n* You can now execute SQL queries that start with a `-- comment` - thanks, Jay Graves (#653)\r\n\r\nhttps://datasette.readthedocs.io/en/latest/changelog.html#v0-35", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.36", "id": 23896184, "node_id": "MDc6UmVsZWFzZTIzODk2MTg0", "tag_name": "0.36", "target_commitish": "master", "name": "Datasette 0.36", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-02-22T03:04:46Z", "published_at": "2020-02-22T03:24:50Z", "body": "* The `datasette` object passed to plugins now has API documentation: [Datasette class](https://datasette.readthedocs.io/en/latest/datasette.html#datasette). (#576)\r\n* New methods on `datasette`: `.add_database()` and `.remove_database()` - [documentation](https://datasette.readthedocs.io/en/latest/datasette.html#datasette-add-database). (#671)\r\n* `prepare_connection()` plugin hook now takes optional `datasette` and `database` arguments - [prepare_connection(conn, database, datasette)](https://datasette.readthedocs.io/en/latest/plugins.html#plugin-hook-prepare-connection). (#678)\r\n* Added three new plugins and one new conversion tool to the [The Datasette Ecosystem](https://datasette.readthedocs.io/en/latest/ecosystem.html#ecosystem).\r\n\r\nhttps://datasette.readthedocs.io/en/latest/changelog.html#v0-36", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.37", "id": 23986460, "node_id": "MDc6UmVsZWFzZTIzOTg2NDYw", "tag_name": "0.37", "target_commitish": "master", "name": "Datasette 0.37", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-02-26T01:22:02Z", "published_at": "2020-02-26T03:44:07Z", "body": "* Plugins now have a supported mechanism for writing to a database, using the new `.execute_write()` and `.execute_write_fn()` methods. [Documentation](https://datasette.readthedocs.io/en/stable/internals.html#database-execute-write). (#682)\r\n* Immutable databases that have had their rows counted using the `inspect` command now use the calculated count more effectively - thanks, Kevin Keogh. (#666)\r\n* `--reload` no longer restarts the server if a database file is modified, unless that database was opened immutable mode with `-i`. (#494)\r\n* New `?_searchmode=raw` option turns off escaping for FTS queries in `?_search=` allowing full use of SQLite\u2019s [FTS5 query syntax](https://www.sqlite.org/fts5.html#full_text_query_syntax). (#676)\r\n", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.37.1", "id": 24154697, "node_id": "MDc6UmVsZWFzZTI0MTU0Njk3", "tag_name": "0.37.1", "target_commitish": "master", "name": "Datasette 0.37.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-03-03T03:43:08Z", "published_at": "2020-03-03T03:46:17Z", "body": "* Don\u2019t attempt to count table rows to display on the index page for databases > 100MB. (#688)\r\n* Print exceptions if they occur in the write thread rather than silently swallowing them.\r\n* Handle the possibility of `scope[\"path\"]` being a string rather than bytes\r\n* Better documentation for the [extra_template_vars(template, database, table, view_name, request, datasette)](https://datasette.readthedocs.io/en/stable/plugins.html#plugin-hook-extra-template-vars) plugin hook.\r\n", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.38", "id": 24330942, "node_id": "MDc6UmVsZWFzZTI0MzMwOTQy", "tag_name": "0.38", "target_commitish": "master", "name": "0.38", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-03-08T23:26:50Z", "published_at": "2020-03-08T23:42:36Z", "body": "* The [Docker build](https://hub.docker.com/r/datasetteproject/datasette) of Datasette now uses SQLite 3.31.1, upgraded from 3.26. (#695)\r\n* `datasette publish cloudrun` now accepts an optional `--memory=2Gi` flag for setting the Cloud Run allocated memory to a value other than the default (256Mi). (#694)\r\n* Fixed bug where templates that shipped with plugins were sometimes not being correctly loaded. (#697)\r\n", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.39", "id": 24836140, "node_id": "MDc6UmVsZWFzZTI0ODM2MTQw", "tag_name": "0.39", "target_commitish": "master", "name": "0.39", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-03-25T04:02:37Z", "published_at": "2020-03-25T04:11:35Z", "body": "* New [base_url](https://datasette.readthedocs.io/en/latest/config.html#config-base-url) configuration setting for serving up the correct links while running Datasette under a different URL prefix. (#394)\r\n* New metadata settings `\"sort\"` and `\"sort_desc\"` for setting the default sort order for a table. See [Setting a default sort order](https://datasette.readthedocs.io/en/latest/metadata.html#metadata-default-sort). (#702)\r\n* Sort direction arrow now displays by default on the primary key. This means you only have to click once (not twice) to sort in reverse order. (#677)\r\n* New `await Request(scope, receive).post_vars()` method for accessing POST form variables. (#700)\r\n* Plugin hooks documentation now links to example uses of each plugin. (#709)\r\n", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.40", "id": 25748264, "node_id": "MDc6UmVsZWFzZTI1NzQ4MjY0", "tag_name": "0.40", "target_commitish": "master", "name": "0.40", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-04-22T04:06:39Z", "published_at": "2020-04-22T04:06:51Z", "body": "* Datasette [Metadata](https://datasette.readthedocs.io/en/latest/metadata.html) can now be provided as a YAML file as an optional alternative to JSON. See [Using YAML for metadata](https://datasette.readthedocs.io/en/latest/metadata.html#metadata-yaml). (#713)\r\n* Removed support for `datasette publish now`, which used the the now-retired Zeit Now v1 hosting platform. A new plugin, [datasette-publish-now](https://github.com/simonw/datasette-publish-now), can be installed to publish data to Zeit ([now Vercel](https://vercel.com/blog/zeit-is-now-vercel)) Now v2. (#710)\r\n* Fixed a bug where the `extra_template_vars(request, view_name)` plugin hook was not receiving the correct `view_name`. (#716)\r\n* Variables added to the template context by the `extra_template_vars()` plugin hook are now shown in the `?_context=1` debugging mode (see [template_debug](https://datasette.readthedocs.io/en/latest/config.html#config-template-debug)). (#693)\r\n* Fixed a bug where the \u201ctemplates considered\u201d HTML comment was no longer being displayed. (#689)\r\n* Fixed a `datasette publish` bug where `--plugin-secret` would over-ride plugin configuration in the provided `metadata.json` file. (#724)\r\n* Added a new CSS class for customizing the canned query page. (#727)", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.41", "id": 26240662, "node_id": "MDc6UmVsZWFzZTI2MjQwNjYy", "tag_name": "0.41", "target_commitish": "master", "name": "0.41", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-05-06T18:20:58Z", "published_at": "2020-05-06T18:30:03Z", "body": "You can now create [custom pages](https://datasette.readthedocs.io/en/0.41/custom_templates.html#custom-pages) within your Datasette instance using a custom template file. For example, adding a template file called `templates/pages/about.html` will result in a new page being served at `/about` on your instance. See the [custom pages documentation](https://datasette.readthedocs.io/en/0.41/custom_templates.html#custom-pages) for full details, including how to return custom HTTP headers, redirects and status codes. (#648)\r\n\r\n[Configuration directory mode](https://datasette.readthedocs.io/en/0.41/config.html#config-dir) (#731) allows you to define a custom Datasette instance as a directory. So instead of running the following:\r\n\r\n $ datasette one.db two.db \\\r\n --metadata.json \\\r\n --template-dir=templates/ \\\r\n --plugins-dir=plugins \\\r\n --static css:css\r\n\r\nYou can instead arrange your files in a single directory called `my-project` and run this:\r\n\r\n $ datasette my-project/\r\n\r\nAlso in this release:\r\n\r\n- New `NOT LIKE` table filter: `?colname__notlike=expression`. (#750)\r\n- Datasette now has a *pattern portfolio* at `/-/patterns` - e.g. . This is a page that shows every Datasette user interface component in one place, to aid core development and people building custom CSS themes. (#151)\r\n- SQLite [PRAGMA functions](https://www.sqlite.org/pragma.html#pragfunc) such as `pragma_table_info(tablename)` are now allowed in Datasette SQL queries. (#761)\r\n- Datasette pages now consistently return a `content-type` of `text/html; charset=utf-8\"`. (#752)\r\n- Datasette now handles an ASGI `raw_path` value of `None`, which should allow compatibilty with the [Mangum](https://github.com/erm/mangum) adapter for running ASGI apps on AWS Lambda. Thanks, Colin Dellow. (#719)\r\n- Installation documentation now covers how to [Install using pipx](https://datasette.readthedocs.io/en/0.41/installation.html#installation-pipx). (#756)\r\n- Improved the documentation for [Full-text search](https://datasette.readthedocs.io/en/0.41/full_text_search.html#full-text-search).", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.42", "id": 26320774, "node_id": "MDc6UmVsZWFzZTI2MzIwNzc0", "tag_name": "0.42", "target_commitish": "master", "name": "0.42", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-05-08T17:38:27Z", "published_at": "2020-05-08T17:56:36Z", "body": "A small release which provides improved internal methods for use in plugins, along with documentation. See #685.\r\n\r\n* Added documentation for `db.execute()`, see [await db.execute(sql, ...)](https://datasette.readthedocs.io/en/stable/internals.html#database-execute).\r\n* Renamed `db.execute_against_connection_in_thread()` to `db.execute_fn()` and made it a documented method, see [await db.execute_fn(fn)](https://datasette.readthedocs.io/en/stable/internals.html#database-execute-fn).\r\n* New `results.first()` and `results.single_value()` methods, plus documentation for the `Results` class - see [Results](https://datasette.readthedocs.io/en/stable/internals.html#database-results).\r\n", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.43", "id": 26994005, "node_id": "MDc6UmVsZWFzZTI2OTk0MDA1", "tag_name": "0.43", "target_commitish": "master", "name": "0.43", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-05-28T14:11:06Z", "published_at": "2020-05-28T14:39:18Z", "body": "The main focus of this release is a major upgrade to the [register_output_renderer(datasette)](https://datasette.readthedocs.io/en/stable/plugins.html#plugin-register-output-renderer) plugin hook, which allows plugins to provide new output formats for Datasette such as [datasette-atom](https://github.com/simonw/datasette-atom) and [datasette-ics](https://github.com/simonw/datasette-ics).\r\n\r\n- Redesign of [register_output_renderer(datasette)](https://datasette.readthedocs.io/en/stable/plugins.html#plugin-register-output-renderer) to provide more context to the render callback and support an optional `\"can_render\"` callback that controls if a suggested link to the output format is provided. ([#581](https://github.com/simonw/datasette/issues/581), [#770](https://github.com/simonw/datasette/issues/770))\r\n- Visually distinguish float and integer columns - useful for figuring out why order-by-column might be returning unexpected results. ([#729](https://github.com/simonw/datasette/issues/729))\r\n- The [Request object](https://datasette.readthedocs.io/en/stable/internals.html#internals-request), which is passed to several plugin hooks, is now documented. ([#706](https://github.com/simonw/datasette/issues/706))\r\n- New `metadata.json` option for setting a custom default page size for specific tables and views, see [Setting a custom page size](https://datasette.readthedocs.io/en/stable/metadata.html#metadata-page-size). ([#751](https://github.com/simonw/datasette/issues/751))\r\n- Canned queries can now be configured with a default URL fragment hash, useful when working with plugins such as [datasette-vega](https://github.com/simonw/datasette-vega), see [Setting a default fragment](https://datasette.readthedocs.io/en/stable/sql_queries.html#canned-queries-default-fragment). ([#706](https://github.com/simonw/datasette/issues/706))\r\n- Fixed a bug in `datasette publish` when running on operating systems where the `/tmp` directory lives in a different volume, using a backport of the Python 3.8 `shutil.copytree()` function. ([#744](https://github.com/simonw/datasette/issues/744))\r\n- Every plugin hook is now covered by the unit tests, and a new unit test checks that each plugin hook has at least one corresponding test. ([#771](https://github.com/simonw/datasette/issues/771), [#773](https://github.com/simonw/datasette/issues/773))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.44", "id": 27483276, "node_id": "MDc6UmVsZWFzZTI3NDgzMjc2", "tag_name": "0.44", "target_commitish": "master", "name": "0.44", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-06-12T01:19:30Z", "published_at": "2020-06-12T07:10:38Z", "body": "Authentication and permissions, writable canned queries, flash messages, new plugin hooks and more. [Full release notes](https://datasette.readthedocs.io/en/stable/changelog.html#v0-44). See also [Datasette 0.44: the annotated release notes](https://simonwillison.net/2020/Jun/12/annotated-release-notes/).", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.45a0", "id": 27703093, "node_id": "MDc6UmVsZWFzZTI3NzAzMDkz", "tag_name": "0.45a0", "target_commitish": "master", "name": "0.45a0", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-06-18T20:58:09Z", "published_at": "2020-06-18T21:14:00Z", "body": "", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.45a1", "id": 27707079, "node_id": "MDc6UmVsZWFzZTI3NzA3MDc5", "tag_name": "0.45a1", "target_commitish": "master", "name": "0.45a1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-06-18T23:52:16Z", "published_at": "2020-06-19T00:02:29Z", "body": "", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.45a2", "id": 27856779, "node_id": "MDc6UmVsZWFzZTI3ODU2Nzc5", "tag_name": "0.45a2", "target_commitish": "master", "name": "0.45a2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-06-24T04:17:30Z", "published_at": "2020-06-24T04:32:12Z", "body": "", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.45a3", "id": 27994774, "node_id": "MDc6UmVsZWFzZTI3OTk0Nzc0", "tag_name": "0.45a3", "target_commitish": "master", "name": "0.45a3", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-06-28T03:22:49Z", "published_at": "2020-06-28T03:27:12Z", "body": "", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.45a4", "id": 28008549, "node_id": "MDc6UmVsZWFzZTI4MDA4NTQ5", "tag_name": "0.45a4", "target_commitish": "master", "name": "0.45a4", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-06-29T02:31:16Z", "published_at": "2020-06-29T02:33:02Z", "body": "", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.45a5", "id": 28097766, "node_id": "MDc6UmVsZWFzZTI4MDk3NzY2", "tag_name": "0.45a5", "target_commitish": "master", "name": "0.45a5", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2020-07-01T04:25:35Z", "published_at": "2020-07-01T04:27:08Z", "body": "", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.45", "id": 28134124, "node_id": "MDc6UmVsZWFzZTI4MTM0MTI0", "tag_name": "0.45", "target_commitish": "master", "name": "0.45", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-07-01T21:43:07Z", "published_at": "2020-07-01T21:46:07Z", "body": "Magic parameters for canned queries, a log out feature, improved plugin documentation and four new plugin hooks.\r\n\r\n### Magic parameters for canned queries\r\n\r\nCanned queries now support [Magic parameters](https://docs.datasette.io/en/stable/sql_queries.html#canned-queries-magic-parameters), which can be used to insert or select automatically generated values. For example:\r\n```sql\r\ninsert into logs\r\n (user_id, timestamp)\r\nvalues\r\n (:_actor_id, :_now_datetime_utc)\r\n```\r\nThis inserts the currently authenticated actor ID and the current datetime. ([#842](https://github.com/simonw/datasette/issues/842))\r\n\r\n### Log out\r\n\r\nThe [ds_actor cookie](https://docs.datasette.io/en/stable/authentication.html#authentication-ds-actor) can be used by plugins (or by Datasette's [--root mechanism](https://docs.datasette.io/en/stable/authentication.html#authentication-root)) to authenticate users. The new `/-/logout` page provides a way to clear that cookie.\r\n\r\nA \"Log out\" button now shows in the global navigation provided the user is authenticated using the `ds_actor` cookie. ([#840](https://github.com/simonw/datasette/issues/840))\r\n\r\n### Better plugin documentation\r\n\r\nThe plugin documentation has been re-arranged into four sections, including a brand new section on testing plugins. ([#687](https://github.com/simonw/datasette/issues/687))\r\n\r\n- [Plugins](https://docs.datasette.io/en/stable/plugins.html#plugins) introduces Datasette's plugin system and describes how to install and configure plugins.\r\n- [Writing plugins](https://docs.datasette.io/en/stable/writing_plugins.html#writing-plugins) describes how to author plugins, from simple one-off plugins to packaged plugins that can be published to PyPI. It also describes how to start a plugin using the new [datasette-plugin](https://github.com/simonw/datasette-plugin) cookiecutter template.\r\n- [Plugin hooks](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hooks) is a full list of detailed documentation for every Datasette plugin hook.\r\n- [Testing plugins](https://docs.datasette.io/en/stable/testing_plugins.html#testing-plugins) describes how to write tests for Datasette plugins, using [pytest](https://docs.pytest.org/) and [HTTPX](https://www.python-httpx.org/).\r\n\r\n### New plugin hooks\r\n\r\n- [register_magic_parameters(datasette)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-register-magic-parameters) can be used to define new types of magic canned query parameters.\r\n- [startup(datasette)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-startup) can run custom code when Datasette first starts up. [datasette-init](https://github.com/simonw/datasette-init) is a new plugin that uses this hook to create database tables and views on startup if they have not yet been created. ([#834](https://github.com/simonw/datasette/issues/834))\r\n- [canned_queries(datasette, database, actor)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-canned-queries) lets plugins provide additional canned queries beyond those defined in Datasette's metadata. See [datasette-saved-queries](https://github.com/simonw/datasette-saved-queries) for an example of this hook in action. ([#852](https://github.com/simonw/datasette/issues/852))\r\n- [forbidden(datasette, request, message)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-forbidden) is a hook for customizing how Datasette responds to 403 forbidden errors. ([#812](https://github.com/simonw/datasette/issues/812))\r\n\r\n### Smaller changes\r\n\r\n- Cascading view permissons - so if a user has `view-table` they can view the table page even if they do not have `view-database` or `view-instance`. ([#832](https://github.com/simonw/datasette/issues/832))\r\n- CSRF protection no longer applies to `Authentication: Bearer token` requests or requests without cookies. ([#835](https://github.com/simonw/datasette/issues/835))\r\n- `datasette.add_message()` now works inside plugins. ([#864](https://github.com/simonw/datasette/issues/864))\r\n- Workaround for \"Too many open files\" error in test runs. ([#846](https://github.com/simonw/datasette/issues/846))\r\n- Respect existing `scope[\"actor\"]` if already set by ASGI middleware. ([#854](https://github.com/simonw/datasette/issues/854))\r\n- New process for shipping [Alpha and beta releases](https://docs.datasette.io/en/stable/contributing.html#contributing-alpha-beta). ([#807](https://github.com/simonw/datasette/issues/807))\r\n- `{{ csrftoken() }}` now works when plugins render a template using `datasette.render_template(..., request=request)`. ([#863](https://github.com/simonw/datasette/issues/863))\r\n- Datasette now creates a single [Request object](https://docs.datasette.io/en/stable/internals.html#internals-request) and uses it throughout the lifetime of the current HTTP request. ([#870](https://github.com/simonw/datasette/issues/870))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null}