{"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/sqlite-utils/releases/tag/2.9", "id": 26362623, "node_id": "MDc6UmVsZWFzZTI2MzYyNjIz", "tag_name": "2.9", "target_commitish": "master", "name": "2.9", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-05-11T01:54:56Z", "published_at": "2020-05-11T01:57:11Z", "body": "- New `sqlite-utils drop-table` command, see [Dropping tables](https://sqlite-utils.readthedocs.io/en/2.9/cli.html#cli-drop-table). ([#111](https://github.com/simonw/sqlite-utils/issues/111))\r\n- New `sqlite-utils drop-view` command, see [Dropping views](https://sqlite-utils.readthedocs.io/en/2.9/cli.html#cli-drop-view).\r\n- Python `decimal.Decimal` objects are now stored as `FLOAT`. ([#110](https://github.com/simonw/sqlite-utils/issues/110))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.9.1", "id": 26395903, "node_id": "MDc6UmVsZWFzZTI2Mzk1OTAz", "tag_name": "2.9.1", "target_commitish": "master", "name": "2.9.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-05-11T19:20:29Z", "published_at": "2020-05-11T19:21:24Z", "body": "* Added custom project links to the [PyPI listing](https://pypi.org/project/sqlite-utils/).\r\n", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/dogsheep/dogsheep-photos/releases/tag/0.4", "id": 26698662, "node_id": "MDc6UmVsZWFzZTI2Njk4NjYy", "tag_name": "0.4", "target_commitish": "master", "name": "0.4", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-05-20T04:22:26Z", "published_at": "2020-05-20T04:24:28Z", "body": "- Renamed this project to `dogsheep-photos`. #26\r\n- `apple-photos` command now works even if you haven't yet run `upload`. #19\r\n- `--image-url-prefix` and `--image-url-suffix` options to `apple-photos`. #24 \r\n- New `create-subset` command. #23 ", "repo": {"value": 256834907, "label": "dogsheep-photos"}, "reactions": null} {"html_url": "https://github.com/dogsheep/dogsheep-photos/releases/tag/0.4.1", "id": 26873698, "node_id": "MDc6UmVsZWFzZTI2ODczNjk4", "tag_name": "0.4.1", "target_commitish": "master", "name": "0.4.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-05-25T20:11:20Z", "published_at": "2020-05-25T20:13:23Z", "body": "- Documentation now explains how to use this with the [datasette-media](https://github.com/simonw/datasette-media), [datasette-json-html](https://github.com/simonw/datasette-json-html) and [datasette-template-sql](https://github.com/simonw/datasette-template-sql) plugins. #20", "repo": {"value": 256834907, "label": "dogsheep-photos"}, "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/sqlite-utils/releases/tag/2.10", "id": 27504516, "node_id": "MDc6UmVsZWFzZTI3NTA0NTE2", "tag_name": "2.10", "target_commitish": "master", "name": "2.10", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-06-12T17:43:45Z", "published_at": "2020-06-12T17:44:32Z", "body": "- The `sqlite-utils` command now supports UPDATE/INSERT/DELETE in addition to SELECT. #115", "repo": {"value": 140912432, "label": "sqlite-utils"}, "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.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/sqlite-utils/releases/tag/2.10.1", "id": 27847716, "node_id": "MDc6UmVsZWFzZTI3ODQ3NzE2", "tag_name": "2.10.1", "target_commitish": "master", "name": "2.10.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-06-23T21:04:07Z", "published_at": "2020-06-23T21:04:50Z", "body": "* Added documentation for the `table.pks` introspection property. #116", "repo": {"value": 140912432, "label": "sqlite-utils"}, "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} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.11", "id": 28369250, "node_id": "MDc6UmVsZWFzZTI4MzY5MjUw", "tag_name": "2.11", "target_commitish": "master", "name": "2.11", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-07-08T17:36:07Z", "published_at": "2020-07-08T17:36:45Z", "body": "- New `--truncate` option to `sqlite-utils insert`, and `truncate=True` argument to `.insert_all()`. Thanks, Thomas Sibley. ([#118](https://github.com/simonw/sqlite-utils/pull/118))\r\n- The `sqlite-utils query` command now runs updates in a transaction. Thanks, Thomas Sibley. ([#120](https://github.com/simonw/sqlite-utils/pull/120))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/dogsheep/github-to-sqlite/releases/tag/2.3", "id": 28422716, "node_id": "MDc6UmVsZWFzZTI4NDIyNzE2", "tag_name": "2.3", "target_commitish": "master", "name": "2.3", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-07-09T23:26:34Z", "published_at": "2020-07-09T23:28:07Z", "body": "- New `github-to-sqlite repos my.db -r simonw/datasette` option for importing just specific repositories. #42", "repo": {"value": 207052882, "label": "github-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/github-to-sqlite/releases/tag/2.4", "id": 28705938, "node_id": "MDc6UmVsZWFzZTI4NzA1OTM4", "tag_name": "2.4", "target_commitish": "master", "name": "2.4", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-07-18T22:34:15Z", "published_at": "2020-07-18T22:35:27Z", "body": "- New `github-to-sqlite tags github.db simonw/datasette` command for importing all tags for a repository. #43", "repo": {"value": 207052882, "label": "github-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.21.2", "id": 28705982, "node_id": "MDc6UmVsZWFzZTI4NzA1OTgy", "tag_name": "0.21.2", "target_commitish": "master", "name": "0.21.2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-07-18T22:42:54Z", "published_at": "2020-07-18T22:43:20Z", "body": "- Added changelog badge", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.21.3", "id": 28876263, "node_id": "MDc6UmVsZWFzZTI4ODc2MjYz", "tag_name": "0.21.3", "target_commitish": "master", "name": "0.21.3", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-07-23T14:56:02Z", "published_at": "2020-07-23T14:57:11Z", "body": "* Added table of contents to the documentation", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.12", "id": 28975119, "node_id": "MDc6UmVsZWFzZTI4OTc1MTE5", "tag_name": "2.12", "target_commitish": "master", "name": "2.12", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-07-27T07:21:26Z", "published_at": "2020-07-27T07:24:10Z", "body": "The theme of this release is better tools for working with binary data. The new `insert-files` command can be used to insert binary files directly into a database table, and other commands have been improved with better support for BLOB columns.\r\n\r\n- `sqlite-utils insert-files my.db gifs *.gif` can now insert the contents of files into a specified table. The columns in the table can be customized to include different pieces of metadata derived from the files. See [Inserting binary data from files](https://sqlite-utils.readthedocs.io/en/stable/cli.html#cli-insert-files). ([#122](https://github.com/simonw/sqlite-utils/issues/122))\r\n- `--raw` option to `sqlite-utils query` - for outputting just a single raw column value - see [Returning raw data from a query, such as binary content](https://sqlite-utils.readthedocs.io/en/stable/cli.html#cli-query-raw). ([#123](https://github.com/simonw/sqlite-utils/issues/123))\r\n- JSON output now encodes BLOB values as special base64 obects - see [Running queries and returning JSON](https://sqlite-utils.readthedocs.io/en/stable/cli.html#cli-query-json). ([#125](https://github.com/simonw/sqlite-utils/issues/125))\r\n- The same format of JSON base64 objects can now be used to insert binary data - see [Inserting JSON data](https://sqlite-utils.readthedocs.io/en/stable/cli.html#cli-inserting-data). ([#126](https://github.com/simonw/sqlite-utils/issues/126))\r\n- The `sqlite-utils query` command can now accept named parameters, e.g. `sqlite-utils :memory: \"select :num * :num2\" -p num 5 -p num2 6` - see [Running queries and returning JSON](https://sqlite-utils.readthedocs.io/en/stable/cli.html#cli-query-json). ([#124](https://github.com/simonw/sqlite-utils/issues/124))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.13", "id": 29096810, "node_id": "MDc6UmVsZWFzZTI5MDk2ODEw", "tag_name": "2.13", "target_commitish": "master", "name": "2.13", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-07-30T01:13:53Z", "published_at": "2020-07-30T01:15:55Z", "body": "- `memoryview` and `uuid.UUID` objects are now supported. `memoryview` objects will be stored using `BLOB` and `uuid.UUID` objects will be stored using `TEXT`. (#128)\r\n", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.14", "id": 29196241, "node_id": "MDc6UmVsZWFzZTI5MTk2MjQx", "tag_name": "2.14", "target_commitish": "master", "name": "2.14", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-01T20:58:47Z", "published_at": "2020-08-01T21:00:31Z", "body": "- The [insert-files command](https://sqlite-utils.readthedocs.io/en/stable/cli.html#cli-insert-files) can now read from standard input: `cat dog.jpg | sqlite-utils insert-files dogs.db pics - --name=dog.jpg`. ([#127](https://github.com/simonw/sqlite-utils/issues/127))\r\n- You can now specify a full-text search tokenizer using the new `tokenize=` parameter to [enable_fts()](https://sqlite-utils.readthedocs.io/en/stable/python-api.html#python-api-fts). This means you can enable Porter stemming on a table by running `db[\"articles\"].enable_fts([\"headline\", \"body\"], tokenize=\"porter\")`. ([#130](https://github.com/simonw/sqlite-utils/issues/130))\r\n- You can also set a custom tokenizer using the [sqlite-utils enable-fts](https://sqlite-utils.readthedocs.io/en/stable/cli.html#cli-fts) CLI command, via the new `--tokenize` option.", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.14.1", "id": 29394982, "node_id": "MDc6UmVsZWFzZTI5Mzk0OTgy", "tag_name": "2.14.1", "target_commitish": "master", "name": "2.14.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-06T06:31:11Z", "published_at": "2020-08-06T06:31:48Z", "body": "- Documentation improvements", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.46", "id": 29489364, "node_id": "MDc6UmVsZWFzZTI5NDg5MzY0", "tag_name": "0.46", "target_commitish": "main", "name": "0.46", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-09T16:09:07Z", "published_at": "2020-08-09T16:10:47Z", "body": "**Warning:** This release contains a security fix related to authenticated writable canned queries. If you are using this feature you should upgrade as soon as possible.\r\n\r\n- **Security fix:** CSRF tokens were incorrectly included in read-only canned query forms, which could allow them to be leaked to a sophisticated attacker. See [issue 918](https://github.com/simonw/datasette/issues/918) for details.\r\n- Datasette now supports GraphQL via the new [datasette-graphql](https://github.com/simonw/datasette-graphql) plugin - see [GraphQL in Datasette with the new datasette-graphql plugin](https://simonwillison.net/2020/Aug/7/datasette-graphql/).\r\n- Principle git branch has been renamed from `master` to `main`. ([#849](https://github.com/simonw/datasette/issues/849))\r\n- New debugging tool: `/-/allow-debug tool` ([demo here](https://latest.datasette.io/-/allow-debug)) helps test allow blocks against actors, as described in [Defining permissions with \"allow\" blocks](https://datasette.readthedocs.io/en/stable/authentication.html#authentication-permissions-allow). ([#908](https://github.com/simonw/datasette/issues/908))\r\n- New logo for the documentation, and a new project tagline: \"An open source multi-tool for exploring and publishing data\".\r\n- Whitespace in column values is now respected on display, using `white-space: pre-wrap`. ([#896](https://github.com/simonw/datasette/issues/896))\r\n- New `await request.post_body()` method for accessing the raw POST body, see [Request object](https://datasette.readthedocs.io/en/stable/internals.html#internals-request). ([#897](https://github.com/simonw/datasette/issues/897))\r\n- Database file downloads now include a `content-length` HTTP header, enabling download progress bars. ([#905](https://github.com/simonw/datasette/issues/905))\r\n- File downloads now also correctly set the suggested file name using a `content-disposition` HTTP header. ([#909](https://github.com/simonw/datasette/issues/909))\r\n- `tests` are now excluded from the Datasette package properly - thanks, abeyerpath. ([#456](https://github.com/simonw/datasette/issues/456))\r\n- The Datasette package published to PyPI now includes `sdist` as well as `bdist_wheel`.\r\n- Better titles for canned query pages. ([#887](https://github.com/simonw/datasette/issues/887))\r\n- Now only loads Python files from a directory passed using the `--plugins-dir` option - thanks, Amjith Ramanujam. ([#890](https://github.com/simonw/datasette/pull/890))\r\n- New documentation section on [Publishing to Vercel](https://datasette.readthedocs.io/en/stable/publish.html#publish-vercel).", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.15", "id": 29529316, "node_id": "MDc6UmVsZWFzZTI5NTI5MzE2", "tag_name": "2.15", "target_commitish": "master", "name": "2.15", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-10T19:06:02Z", "published_at": "2020-08-10T19:07:27Z", "body": "- New `db.enable_wal()` and `db.disable_wal()` methods for enabling and disabling [Write-Ahead Logging](https://www.sqlite.org/wal.html) for a database file - see [WAL mode](https://sqlite-utils.readthedocs.io/en/stable//python-api.html#python-api-wal) in the Python API documentation.\r\n- Also `sqlite-utils enable-wal file.db` and `sqlite-utils disable-wal file.db` commands for doing the same thing on the command-line, see [WAL mode (CLI)](https://sqlite-utils.readthedocs.io/en/stable/cli.html#cli-wal). ([#132](https://github.com/simonw/sqlite-utils/issues/132))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.47", "id": 29585154, "node_id": "MDc6UmVsZWFzZTI5NTg1MTU0", "tag_name": "0.47", "target_commitish": "main", "name": "0.47", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-12T00:42:47Z", "published_at": "2020-08-12T00:44:52Z", "body": "- Datasette now has [a GitHub discussions forum](https://github.com/simonw/datasette/discussions) for conversations about the project that go beyond just bug reports and issues.\r\n- Datasette can now be installed on macOS using Homebrew! Run `brew install simonw/datasette/datasette`. See [Using Homebrew](https://datasette.readthedocs.io/en/stable/installation.html#installation-homebrew). ([#335](https://github.com/simonw/datasette/issues/335))\r\n- Two new commands: `datasette install name-of-plugin` and `datasette uninstall name-of-plugin`. These are equivalent to `pip install` and `pip uninstall` but automatically run in the same virtual environment as Datasette, so users don't have to figure out where that virtual environment is - useful for installations created using Homebrew or `pipx`. See [Installing plugins](https://datasette.readthedocs.io/en/stable/plugins.html#plugins-installing). ([#925](https://github.com/simonw/datasette/issues/925))\r\n- A new command-line option, `datasette --get`, accepts a path to a URL within the Datasette instance. It will run that request through Datasette (without starting a web server) and print out the repsonse. See [datasette --get](https://datasette.readthedocs.io/en/stable/getting_started.html#getting-started-datasette-get) for an example. ([#926](https://github.com/simonw/datasette/issues/926))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.47.1", "id": 29587652, "node_id": "MDc6UmVsZWFzZTI5NTg3NjUy", "tag_name": "0.47.1", "target_commitish": "main", "name": "0.47.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-12T02:37:24Z", "published_at": "2020-08-12T02:38:00Z", "body": "- Fixed a bug where the `sdist` distribution of Datasette was not correctly including the template files. ([#930](https://github.com/simonw/datasette/issues/930))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.15.1", "id": 29616454, "node_id": "MDc6UmVsZWFzZTI5NjE2NDU0", "tag_name": "2.15.1", "target_commitish": "main", "name": "2.15.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-12T16:59:48Z", "published_at": "2020-08-12T17:00:27Z", "body": "- Now available as a `sdist` package on PyPI in addition to a wheel. ([#133](https://github.com/simonw/sqlite-utils/issues/133))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.47.2", "id": 29625082, "node_id": "MDc6UmVsZWFzZTI5NjI1MDgy", "tag_name": "0.47.2", "target_commitish": "main", "name": "0.47.2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-12T20:54:33Z", "published_at": "2020-08-12T20:55:28Z", "body": "- Fixed an issue with the Docker image [published to Docker Hub](https://hub.docker.com/r/datasetteproject/datasette). ([#931](https://github.com/simonw/datasette/issues/931))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.47.3", "id": 29738457, "node_id": "MDc6UmVsZWFzZTI5NzM4NDU3", "tag_name": "0.47.3", "target_commitish": "main", "name": "0.47.3", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-15T20:56:08Z", "published_at": "2020-08-15T21:03:58Z", "body": "- The `datasette --get` command-line mechanism now ensures any plugins using the `startup()` hook are correctly executed. ([#934](https://github.com/simonw/datasette/issues/934))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.48", "id": 29749566, "node_id": "MDc6UmVsZWFzZTI5NzQ5NTY2", "tag_name": "0.48", "target_commitish": "main", "name": "0.48", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-16T18:56:31Z", "published_at": "2020-08-16T18:58:34Z", "body": "- Datasette documentation now lives at [docs.datasette.io](https://docs.datasette.io/).\r\n- `db.is_mutable` property is now documented and tested, see [Database introspection](https://docs.datasette.io/en/stable/internals.html#internals-database-introspection).\r\n- The `extra_template_vars`, `extra_css_urls`, `extra_js_urls` and `extra_body_script` plugin hooks now all accept the same arguments. See [extra_template_vars(template, database, table, columns, view_name, request, datasette)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-extra-template-vars) for details. ([#939](https://github.com/simonw/datasette/issues/939))\r\n- Those hooks now accept a new `columns` argument detailing the table columns that will be rendered on that page. ([#938](https://github.com/simonw/datasette/issues/938))\r\n- Fixed bug where plugins calling `db.execute_write_fn()` could hang Datasette if the connection failed. ([#935](https://github.com/simonw/datasette/issues/935))\r\n- Fixed bug with the `?_nl=on` output option and binary data. ([#914](https://github.com/simonw/datasette/issues/914))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/dogsheep/github-to-sqlite/releases/tag/2.5", "id": 29822005, "node_id": "MDc6UmVsZWFzZTI5ODIyMDA1", "tag_name": "2.5", "target_commitish": "main", "name": "2.5", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-18T15:05:50Z", "published_at": "2020-08-18T15:08:20Z", "body": "- New `github-to-sqlite emojis` command for fetching emoji supported by GitHub. [Demo](https://github-to-sqlite.dogsheep.net/github/emojis). #47\r\n- Added table of contents to README.\r\n- Switched to GitHub Actions for CI.\r\n- Switched default branch to `main`\r\n", "repo": {"value": 207052882, "label": "github-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.16", "id": 29999731, "node_id": "MDc6UmVsZWFzZTI5OTk5NzMx", "tag_name": "2.16", "target_commitish": "main", "name": "2.16", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-08-21T21:02:29Z", "published_at": "2020-08-21T21:05:51Z", "body": "- `--load-extension` option for `sqlite-utils query` for loading SQLite extensions. ([#134](https://github.com/simonw/sqlite-utils/issues/134))\r\n- New `sqlite_utils.utils.find_spatialite()` function for finding SpatiaLite in common locations. ([#135](https://github.com/simonw/sqlite-utils/issues/135))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/dogsheep/github-to-sqlite/releases/tag/0.4", "id": 20031553, "node_id": "MDc6UmVsZWFzZTIwMDMxNTUz", "tag_name": "0.4", "target_commitish": "master", "name": "0.4", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-09-17T00:18:37Z", "published_at": "2019-09-17T00:19:42Z", "body": "* Added `github-to-sqlite repos` command, #3 ", "repo": {"value": 207052882, "label": "github-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/genome-to-sqlite/releases/tag/0.1", "id": 20114205, "node_id": "MDc6UmVsZWFzZTIwMTE0MjA1", "tag_name": "0.1", "target_commitish": "master", "name": "0.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-09-19T15:38:10Z", "published_at": "2019-09-19T15:41:17Z", "body": "First release", "repo": {"value": 209590345, "label": "genome-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.6", "id": 20497186, "node_id": "MDc6UmVsZWFzZTIwNDk3MTg2", "tag_name": "0.6", "target_commitish": "master", "name": "0.6", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-10-06T04:49:17Z", "published_at": "2019-10-06T04:52:18Z", "body": "* New experimental `track` and `follow` commands for subscribing to the Twitter real-time API #11. [Documentation](https://github.com/dogsheep/twitter-to-sqlite#capturing-tweets-in-real-time-with-track-and-follow) for track and follow.\r\n* Documentation for `--sql` and `--attach`, refs #8", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.7", "id": 20504543, "node_id": "MDc6UmVsZWFzZTIwNTA0NTQz", "tag_name": "0.7", "target_commitish": "master", "name": "0.7", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-10-07T00:32:08Z", "published_at": "2019-10-07T00:33:28Z", "body": "* New `statuses-lookup` command for bulk fetching tweets by their IDs - #13 ", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/pocket-to-sqlite/releases/tag/0.1", "id": 20506896, "node_id": "MDc6UmVsZWFzZTIwNTA2ODk2", "tag_name": "0.1", "target_commitish": "master", "name": "0.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-10-07T05:07:37Z", "published_at": "2019-10-07T05:18:20Z", "body": "Initial release", "repo": {"value": 213286752, "label": "pocket-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.8", "id": 20631452, "node_id": "MDc6UmVsZWFzZTIwNjMxNDUy", "tag_name": "0.8", "target_commitish": "master", "name": "0.8", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-10-11T06:45:21Z", "published_at": "2019-10-11T06:46:52Z", "body": "* New `twitter-to-sqlite import twitter.db archive.zip` command for importing data from a Twitter export file. #4 - [documentation here](https://github.com/dogsheep/twitter-to-sqlite/blob/master/README.md#importing-data-from-your-twitter-archive).", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.9", "id": 20646519, "node_id": "MDc6UmVsZWFzZTIwNjQ2NTE5", "tag_name": "0.9", "target_commitish": "master", "name": "0.9", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-10-11T16:55:10Z", "published_at": "2019-10-11T16:57:25Z", "body": "* New `twitter-to-sqlite home-timeline` command, for retrieving your timeline of tweets from people you follow - #18\r\n* `twitter-to-sqlite import` created tables now use the `archive_` prefix instead of `archive-`, for easier querying\r\n* Running `twitter-to-sqlite import` now deletes existing `archive_` tables and recreates them - #17", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/github-to-sqlite/releases/tag/0.5", "id": 20663605, "node_id": "MDc6UmVsZWFzZTIwNjYzNjA1", "tag_name": "0.5", "target_commitish": "master", "name": "0.5", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-10-13T05:28:24Z", "published_at": "2019-10-13T05:30:05Z", "body": "* New command: `github-to-sqlite issue-comments` for importing comments on issues - #7\r\n* `github-to-sqlite issues` now accepts optional `--issue=1` argument\r\n* Fixed bug inserting users into already-created table with wrong columns - #6", "repo": {"value": 207052882, "label": "github-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.10", "id": 20721291, "node_id": "MDc6UmVsZWFzZTIwNzIxMjkx", "tag_name": "0.10", "target_commitish": "master", "name": "0.10", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-10-15T18:53:53Z", "published_at": "2019-10-15T18:56:09Z", "body": "* favorites command now populates `favorited_by` table - #14 \r\n* favorites `--stop_after` option - #20 \r\n* Store unescaped `full_text` of Tweet - #21 ", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.11", "id": 20754277, "node_id": "MDc6UmVsZWFzZTIwNzU0Mjc3", "tag_name": "0.11", "target_commitish": "master", "name": "0.11", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-10-16T19:37:10Z", "published_at": "2019-10-16T19:38:42Z", "body": "* Added `--since_id` and `--since` to `user-timeline` command, refs #20\r\n* `--since` and `--since_id` options for `home-timeline`, closes #19 \r\n* `import` command now works on files and directories, closes #22 ", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/swarm-to-sqlite/releases/tag/0.2", "id": 20755954, "node_id": "MDc6UmVsZWFzZTIwNzU1OTU0", "tag_name": "0.2", "target_commitish": "master", "name": "0.2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-10-16T20:40:25Z", "published_at": "2019-10-16T20:40:55Z", "body": "* Added --since option, closes #3 ", "repo": {"value": 205429375, "label": "swarm-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.11.1", "id": 20758324, "node_id": "MDc6UmVsZWFzZTIwNzU4MzI0", "tag_name": "0.11.1", "target_commitish": "master", "name": "0.11.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-10-16T19:46:35Z", "published_at": "2019-10-16T22:31:51Z", "body": "* Fix bugs running `home-timeline --since` from scratch. If tables were missing, script would throw an error.", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.12", "id": 20783590, "node_id": "MDc6UmVsZWFzZTIwNzgzNTkw", "tag_name": "0.12", "target_commitish": "master", "name": "0.12", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-10-17T17:57:33Z", "published_at": "2019-10-17T18:00:28Z", "body": "* The `source` column for a tweet is now a foreign key to a new `sources` table - #12\r\n* New migrations system to upgrade existing databases to handle the new `source` column extraction - #23\r\n* Experimental implementation of new `twitter-to-sqlite search tweets.db search-term` command, which runs a search and saves the tweets from that search - #3\r\n* Fixed bug where sometimes a user record for the authenticated user was not persisted to the `users` table", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "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/dogsheep/twitter-to-sqlite/releases/tag/0.13", "id": 21073645, "node_id": "MDc6UmVsZWFzZTIxMDczNjQ1", "tag_name": "0.13", "target_commitish": "master", "name": "0.13", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-10-30T02:20:09Z", "published_at": "2019-10-30T02:22:30Z", "body": "- New `mentions-timeline` command (#26)", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "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.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.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/dogsheep/twitter-to-sqlite/releases/tag/0.14", "id": 21180989, "node_id": "MDc6UmVsZWFzZTIxMTgwOTg5", "tag_name": "0.14", "target_commitish": "master", "name": "0.14", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-11-04T05:32:37Z", "published_at": "2019-11-04T05:33:56Z", "body": "* `search` command gained `--since_id` and `--since` options, for retrieving tweets since the last time the search was run\r\n* `search` command is [now documented](https://github.com/dogsheep/twitter-to-sqlite/blob/0.14/README.md#running-searches). Closes #3.", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/1.12", "id": 21276745, "node_id": "MDc6UmVsZWFzZTIxMjc2NzQ1", "tag_name": "1.12", "target_commitish": "master", "name": "1.12", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-11-04T16:28:52Z", "published_at": "2019-11-07T05:00:24Z", "body": "https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v1-12", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/1.12.1", "id": 21276749, "node_id": "MDc6UmVsZWFzZTIxMjc2NzQ5", "tag_name": "1.12.1", "target_commitish": "master", "name": "1.12.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-11-07T04:58:47Z", "published_at": "2019-11-07T05:00:55Z", "body": "https://sqlite-utils.readthedocs.io/en/latest/changelog.html#v1-12-1", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/dogsheep/healthkit-to-sqlite/releases/tag/0.4", "id": 21306693, "node_id": "MDc6UmVsZWFzZTIxMzA2Njkz", "tag_name": "0.4", "target_commitish": "master", "name": "0.4", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-11-08T01:19:23Z", "published_at": "2019-11-08T01:19:51Z", "body": "* Fixed workout latitude/longitude points import for iOS 13 - #10", "repo": {"value": 197882382, "label": "healthkit-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.15", "id": 21342008, "node_id": "MDc6UmVsZWFzZTIxMzQyMDA4", "tag_name": "0.15", "target_commitish": "master", "name": "0.15", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-11-09T20:12:32Z", "published_at": "2019-11-09T20:13:07Z", "body": "- Import command no longer fails on empty files - #29\r\n- Fixed bug in `followers` command - #30\r\n- `following` table now has indexes - #28", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/github-to-sqlite/releases/tag/0.6", "id": 21354706, "node_id": "MDc6UmVsZWFzZTIxMzU0NzA2", "tag_name": "0.6", "target_commitish": "master", "name": "0.6", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-11-11T05:31:46Z", "published_at": "2019-11-11T05:34:06Z", "body": "- New `releases` command for fetching releases for a repo, #11\r\n- Repository topics are now fetched by the `repos` command\r\n- `github-to-sqlite repos` now accepts multiple usernames\r\n- Command now works without `--auth` file (using anonymous API calls), #9", "repo": {"value": 207052882, "label": "github-to-sqlite"}, "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/sqlite-utils/releases/tag/2.0", "id": 22509033, "node_id": "MDc6UmVsZWFzZTIyNTA5MDMz", "tag_name": "2.0", "target_commitish": "master", "name": "2.0", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2019-12-30T06:18:58Z", "published_at": "2019-12-30T06:26:09Z", "body": "This release changes the behaviour of `upsert`. It\u2019s a breaking change, hence 2.0.\r\n\r\nThe `upsert` command-line utility and the `.upsert()` and `.upsert_all()` Python API methods have had their behaviour altered. They used to completely replace the affected records: now, they update the specified values on existing records but leave other columns unaffected.\r\n\r\nSee [Upserting data using the Python API](https://sqlite-utils.readthedocs.io/en/stable/python-api.html#python-api-upsert) and [Upserting data using the CLI](https://sqlite-utils.readthedocs.io/en/stable/cli.html#upserting-data) for full details.\r\n\r\nIf you want the old behaviour - where records were completely replaced - you can use `$ sqlite-utils insert ... --replace` on the command-line and `.insert(..., replace=True)` and `.insert_all(..., replace=True)` in the Python API. See [Insert-replacing data using the Python API](https://sqlite-utils.readthedocs.io/en/stable/python-api.html#python-api-insert-replace) and [Insert-replacing data using the CLI](https://sqlite-utils.readthedocs.io/en/stable/cli.html#cli-insert-replace) for more.\r\n\r\nFor full background on this change, see issue #66.", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.0.1", "id": 22603380, "node_id": "MDc6UmVsZWFzZTIyNjAzMzgw", "tag_name": "2.0.1", "target_commitish": "master", "name": "2.0.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-01-05T17:23:02Z", "published_at": "2020-01-05T17:33:15Z", "body": "The `.upsert()` and `.upsert_all()` methods now raise a `sqlite_utils.db.PrimaryKeyRequired` exception if you call them without specifying the primary key column using `pk=` (#73).", "repo": {"value": 140912432, "label": "sqlite-utils"}, "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/sqlite-utils/releases/tag/2.1", "id": 23274412, "node_id": "MDc6UmVsZWFzZTIzMjc0NDEy", "tag_name": "2.1", "target_commitish": "master", "name": "2.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-01-31T00:25:20Z", "published_at": "2020-01-31T00:30:40Z", "body": "New feature: `conversions={...}` can be passed to the `.insert()` family of functions to specify SQL conversions that should be applied to values that are being inserted or updated. See [Converting column values using SQL functions](https://sqlite-utils.readthedocs.io/en/stable/python-api.html#python-api-conversions). (#77).", "repo": {"value": 140912432, "label": "sqlite-utils"}, "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/sqlite-utils/releases/tag/2.2", "id": 23471014, "node_id": "MDc6UmVsZWFzZTIzNDcxMDE0", "tag_name": "2.2", "target_commitish": "master", "name": "2.2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-02-01T21:59:08Z", "published_at": "2020-02-07T07:18:12Z", "body": "New feature: `sqlite_utils.suggest_column_types([records])` returns the suggested column types for a list of records. See [Suggesting column types](https://sqlite-utils.readthedocs.io/en/stable/python-api.html#python-api-suggest-column-types). (#81).\r\n\r\nThis replaces the undocumented `table.detect_column_types()` method.", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.2.1", "id": 23471112, "node_id": "MDc6UmVsZWFzZTIzNDcxMTEy", "tag_name": "2.2.1", "target_commitish": "master", "name": "2.2.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-02-07T07:20:03Z", "published_at": "2020-02-07T07:24:54Z", "body": "Fixed a bug where `.upsert(..., hash_id=\"pk\")` threw an error (#84).", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/dogsheep/twitter-to-sqlite/releases/tag/0.16", "id": 23471420, "node_id": "MDc6UmVsZWFzZTIzNDcxNDIw", "tag_name": "0.16", "target_commitish": "master", "name": "0.16", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-02-07T07:42:45Z", "published_at": "2020-02-07T07:44:53Z", "body": "New `friends` command for importing accounts that a specific user follows.", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.3", "id": 23508352, "node_id": "MDc6UmVsZWFzZTIzNTA4MzUy", "tag_name": "2.3", "target_commitish": "master", "name": "2.3", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-02-08T23:56:16Z", "published_at": "2020-02-08T23:59:20Z", "body": "`table.exists()` is now a method, not a property. This was not a documented part of the API before so I\u2019m considering this a non-breaking change. (#83)", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/2.3.1", "id": 23556494, "node_id": "MDc6UmVsZWFzZTIzNTU2NDk0", "tag_name": "2.3.1", "target_commitish": "master", "name": "2.3.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-02-11T05:52:23Z", "published_at": "2020-02-11T05:59:43Z", "body": "`table.create_index()` now works for columns that contain spaces. (#85)", "repo": {"value": 140912432, "label": "sqlite-utils"}, "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.52", "id": 34539374, "node_id": "MDc6UmVsZWFzZTM0NTM5Mzc0", "tag_name": "0.52", "target_commitish": "main", "name": "0.52", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-11-28T23:54:35Z", "published_at": "2020-11-28T23:57:12Z", "body": "This release includes a number of changes relating to an internal rebranding effort: Datasette's **configuration** mechanism (things like `datasette --config default_page_size:10`) has been renamed to **settings**.\r\n\r\n- New `--setting default_page_size 10` option as a replacement for `--config default_page_size:10` (note the lack of a colon). The `--config` option is deprecated but will continue working until Datasette 1.0. ([#992](https://github.com/simonw/datasette/issues/992))\r\n- The `/-/config` introspection page is now `/-/settings`, and the previous page redirects to the new one. ([#1103](https://github.com/simonw/datasette/issues/1103))\r\n- The `config.json` file in [Configuration directory mode](https://docs.datasette.io/en/stable/settings.html#config-dir) is now called `settings.json`. ([#1104](https://github.com/simonw/datasette/issues/1104))\r\n- The undocumented `datasette.config()` internal method has been replaced by a documented [.setting(key)](https://docs.datasette.io/en/stable/internals.html#datasette-setting) method. ([#1107](https://github.com/simonw/datasette/issues/1107))\r\n\r\nAlso in this release:\r\n\r\n- New plugin hook: [database_actions(datasette, actor, database)](https://docs.datasette.io/en/stable/plugin_hooks.html#plugin-hook-database-actions), which adds menu items to a new cog menu shown at the top of the database page. ([#1077](https://github.com/simonw/datasette/issues/1077))\r\n- `datasette publish cloudrun` has a new `--apt-get-install` option that can be used to install additional Ubuntu packages as part of the deployment. This is useful for deploying the new [datasette-ripgrep plugin](https://github.com/simonw/datasette-ripgrep). ([#1110](https://github.com/simonw/datasette/issues/1110))\r\n- Swept the documentation to remove words that minimize involved difficulty. ([#1089](https://github.com/simonw/datasette/issues/1089))\r\n\r\nAnd some bug fixes:\r\n\r\n- Foreign keys linking to rows with blank label columns now display as a hyphen, allowing those links to be clicked. ([#1086](https://github.com/simonw/datasette/issues/1086))\r\n- Fixed bug where row pages could sometimes 500 if the underlying queries exceeded a time limit. ([#1088](https://github.com/simonw/datasette/issues/1088))\r\n- Fixed a bug where the table action menu could appear partially obscured by the edge of the page. ([#1084](https://github.com/simonw/datasette/issues/1084))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/dogsheep/github-to-sqlite/releases/tag/2.8", "id": 34556308, "node_id": "MDc6UmVsZWFzZTM0NTU2MzA4", "tag_name": "2.8", "target_commitish": "main", "name": "2.8", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-11-30T01:40:37Z", "published_at": "2020-11-30T01:41:38Z", "body": "- New command: `github-to-sqlite workflows`, for fetching the YAML configuration used by [GitHub Actions](https://github.com/features/actions) workflows and using it to populate new `workflows`, `jobs` and `steps` tables. #54\r\n- New command: `github-to-sqlite pull-requests` - thanks, @adamjonas! #48\r\n- `github-to-sqlite issues --issue` option can now be used multiple times.", "repo": {"value": 207052882, "label": "github-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/github-to-sqlite/releases/tag/2.8.1", "id": 34558928, "node_id": "MDc6UmVsZWFzZTM0NTU4OTI4", "tag_name": "2.8.1", "target_commitish": "main", "name": "2.8.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-11-30T04:16:41Z", "published_at": "2020-11-30T04:18:21Z", "body": "- README now links to example database tables for each command. #56\r\n- Added documentation for `github-to-sqlite releases`.", "repo": {"value": 207052882, "label": "github-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.52.1", "id": 34551688, "node_id": "MDc6UmVsZWFzZTM0NTUxNjg4", "tag_name": "0.52.1", "target_commitish": "main", "name": "0.52.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-11-29T19:38:29Z", "published_at": "2020-11-29T19:39:52Z", "body": "- Documentation on [Testing plugins](https://docs.datasette.io/en/stable/testing_plugins.html#testing-plugins) now recommends using [datasette.client](https://docs.datasette.io/en/stable/internals.html#internals-datasette-client). ([#1102](https://github.com/simonw/datasette/issues/1102))\r\n- Fix bug where compound foreign keys produced broken links. ([#1098](https://github.com/simonw/datasette/issues/1098))\r\n- `datasette --load-module=spatialite` now also checks for `/usr/local/lib/mod_spatialite.so`. Thanks, Dan Peterson. ([#1114](https://github.com/simonw/datasette/issues/1114))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.52.2", "id": 34725716, "node_id": "MDc6UmVsZWFzZTM0NzI1NzE2", "tag_name": "0.52.2", "target_commitish": "main", "name": "0.52.2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-12-03T00:57:40Z", "published_at": "2020-12-03T00:58:43Z", "body": "- Generated columns from SQLite 3.31.0 or higher are now correctly displayed. ([#1116](https://github.com/simonw/datasette/issues/1116))\r\n- Error message if you attempt to open a SpatiaLite database now suggests using `--load-extension=spatialite` if it detects that the extension is available in a common location. ([#1115](https://github.com/simonw/datasette/issues/1115))\r\n- `OPTIONS` requests against the `/database` page no longer raise a 500 error. ([#1100](https://github.com/simonw/datasette/issues/1100))\r\n- Databases larger than 32MB that are published to Cloud Run can now be downloaded. ([#749](https://github.com/simonw/datasette/issues/749))\r\n- Fix for misaligned cog icon on table and database pages. Thanks, Abdussamet Ko\u00e7ak. ([#1121](https://github.com/simonw/datasette/issues/1121))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.52.3", "id": 34782337, "node_id": "MDc6UmVsZWFzZTM0NzgyMzM3", "tag_name": "0.52.3", "target_commitish": "main", "name": "0.52.3", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-12-03T19:07:05Z", "published_at": "2020-12-03T19:08:29Z", "body": "- Fixed bug where static assets would 404 for Datasette installed on ARM Amazon Linux. ([#1124](https://github.com/simonw/datasette/issues/1124>))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.52.4", "id": 34882011, "node_id": "MDc6UmVsZWFzZTM0ODgyMDEx", "tag_name": "0.52.4", "target_commitish": "main", "name": "0.52.4", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-12-05T19:42:42Z", "published_at": "2020-12-05T19:42:57Z", "body": "- Show [pysqlite3](https://github.com/coleifer/pysqlite3) version on `/-/versions`, if installed. ([#1125](https://github.com/simonw/datasette/issues/1125))\r\n- Errors output by Datasette (e.g. for invalid SQL queries) now go to `stderr`, not `stdout`. ([#1131](https://github.com/simonw/datasette/issues/1131))\r\n- Fix for a startup error on windows caused by unnecessary `from os import EX_CANTCREAT` - thanks, Abdussamet Ko\u00e7ak. ([#1094](https://github.com/simonw/datasette/issues/1094))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.52.5", "id": 35063580, "node_id": "MDc6UmVsZWFzZTM1MDYzNTgw", "tag_name": "0.52.5", "target_commitish": "0.52.x", "name": "0.52.5", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-12-09T20:03:44Z", "published_at": "2020-12-09T20:10:23Z", "body": "- Fix for error caused by combining the `_searchmode=raw` and `?_search_COLUMN` parameters. ([#1134](https://github.com/simonw/datasette/issues/1134))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.53", "id": 35131848, "node_id": "MDc6UmVsZWFzZTM1MTMxODQ4", "tag_name": "0.53", "target_commitish": "main", "name": "0.53", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-12-11T01:44:36Z", "published_at": "2020-12-11T01:46:44Z", "body": "Datasette has an official project website now, at . This release mainly updates the documentation to reflect the new site.\r\n\r\n- New `?column__arraynotcontains=` table filter. ([#1132](https://github.com/simonw/datasette/issues/1132))\r\n- `datasette serve` has a new `--create` option, which will create blank database files if they do not already exist rather than exiting with an error. ([#1135](https://github.com/simonw/datasette/issues/1135))\r\n- New `?_header=off` option for CSV export which omits the CSV header row, [documented here](https://docs.datasette.io/en/stable/csv_export.html#csv-export-url-parameters). ([#1133](https://github.com/simonw/datasette/issues/1133))\r\n- \"Powered by Datasette\" link in the footer now links to . ([#1138](https://github.com/simonw/datasette/issues/1138))\r\n- Project news no longer lives in the README - it can now be found at . ([#1137](https://github.com/simonw/datasette/issues/1137))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.1", "id": 35200016, "node_id": "MDc6UmVsZWFzZTM1MjAwMDE2", "tag_name": "3.1", "target_commitish": "main", "name": "3.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-12-13T07:30:59Z", "published_at": "2020-12-13T07:31:40Z", "body": "- New command: `sqlite-utils analyze-tables my.db` outputs useful information about the table columns in the database, such as the number of distinct values and how many rows are null. See [Analyzing tables](https://sqlite-utils.readthedocs.io/en/stable/cli.html#cli-analyze-tables) for documentation. ([#207](https://github.com/simonw/sqlite-utils/issues/207))\r\n- New `table.analyze_column(column)` Python method used by the `analyze-tables` command - see [Analyzing a column](https://sqlite-utils.readthedocs.io/en/stable/python-api.html#python-api-analyze-column).\r\n- The `table.update()` method now correctly handles values that should be stored as JSON. Thanks, Andreas Madsack. ([#204](https://github.com/simonw/sqlite-utils/pull/204))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/dogsheep/github-to-sqlite/releases/tag/2.8.2", "id": 35374715, "node_id": "MDc6UmVsZWFzZTM1Mzc0NzE1", "tag_name": "2.8.2", "target_commitish": "main", "name": "2.8.2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-12-16T19:20:36Z", "published_at": "2020-12-16T19:21:58Z", "body": "- `--readme` now stores `null` if the README file does not exist, rather than throwing an error. #57\r\n- README HTML is rewritten to fix broken internal links, e.g. for a table of contents. #58\r\n", "repo": {"value": 207052882, "label": "github-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/dogsheep/dogsheep-beta/releases/tag/0.10", "id": 35382391, "node_id": "MDc6UmVsZWFzZTM1MzgyMzkx", "tag_name": "0.10", "target_commitish": "main", "name": "0.10", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-12-16T21:27:04Z", "published_at": "2020-12-16T21:28:13Z", "body": "- Now depends on [sqlite-utils](https://github.com/simonw/sqlite-utils) >= 3.0. #30\r\n- The user's original search term is now passed to the `display_sql` SQL query as the `:q` parameter. #29\r\n", "repo": {"value": 197431109, "label": "dogsheep-beta"}, "reactions": null} {"html_url": "https://github.com/dogsheep/dogsheep-beta/releases/tag/0.10.1", "id": 35520026, "node_id": "MDc6UmVsZWFzZTM1NTIwMDI2", "tag_name": "0.10.1", "target_commitish": "main", "name": "0.10.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2020-12-19T06:18:01Z", "published_at": "2020-12-19T06:19:13Z", "body": "- Fix for error if search query contains hyphens such as `github-to-sqlite`. #31 ", "repo": {"value": 197431109, "label": "dogsheep-beta"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.1.1", "id": 35902315, "node_id": "MDc6UmVsZWFzZTM1OTAyMzE1", "tag_name": "3.1.1", "target_commitish": "main", "name": "3.1.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-01-01T23:56:20Z", "published_at": "2021-01-01T23:57:07Z", "body": "- Fixed failing test caused by `optimize` sometimes creating larger database files. ([#209](https://github.com/simonw/sqlite-utils/issues/209))\r\n- Documentation now lives on \r\n- README now includes `brew install sqlite-utils` installation method.", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.2", "id": 35930040, "node_id": "MDc6UmVsZWFzZTM1OTMwMDQw", "tag_name": "3.2", "target_commitish": "main", "name": "3.2", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-01-03T21:15:26Z", "published_at": "2021-01-03T21:17:37Z", "body": "This release introduces a new mechanism for speeding up `count(*)` queries using cached table counts, stored in a `_counts` table and updated by triggers. This mechanism is described in [Cached table counts using triggers](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-cached-table-counts), and can be enabled using Python API methods or the new `enable-counts` CLI command. ([#212](https://github.com/simonw/sqlite-utils/issues/212))\r\n\r\n- `table.enable_counts()` method for enabling these triggers on a specific table.\r\n- `db.enable_counts()` method for enabling triggers on every table in the database. ([#213](https://github.com/simonw/sqlite-utils/issues/213))\r\n- New `sqlite-utils enable-counts my.db` command for enabling counts on all or specific tables, see [Enabling cached counts](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-enable-counts). ([#214](https://github.com/simonw/sqlite-utils/issues/214))\r\n- New `sqlite-utils triggers` command for listing the triggers defined for a database or specific tables, see [Listing triggers](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-triggers). ([#218](https://github.com/simonw/sqlite-utils/issues/218))\r\n- New `db.use_counts_table` property which, if `True`, causes `table.count` to read from the `_counts` table. ([#215](https://github.com/simonw/sqlite-utils/issues/215))\r\n- `table.has_counts_triggers` property revealing if a table has been configured with the new `_counts` database triggers.\r\n- `db.reset_counts()` method and `sqlite-utils reset-counts` command for resetting the values in the `_counts` table. ([#219](https://github.com/simonw/sqlite-utils/issues/219))\r\n- The previously undocumented `db.escape()` method has been renamed to `db.quote()` and is now covered by the documentation: [Quoting strings for use in SQL](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-quote). ([#217](https://github.com/simonw/sqlite-utils/issues/217))\r\n- New `table.triggers_dict` and `db.triggers_dict` introspection properties. ([#211](https://github.com/simonw/sqlite-utils/issues/211), [#216](https://github.com/simonw/sqlite-utils/issues/216))\r\n- `sqlite-utils insert` now shows a more useful error message for invalid JSON. ([#206](https://github.com/simonw/sqlite-utils/issues/206))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.2.1", "id": 36307444, "node_id": "MDc6UmVsZWFzZTM2MzA3NDQ0", "tag_name": "3.2.1", "target_commitish": "main", "name": "3.2.1", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-01-12T23:22:53Z", "published_at": "2021-01-12T23:23:25Z", "body": "- Fixed a bug where `.add_missing_columns()` failed to take case insensitive column names into account. ([#221](https://github.com/simonw/sqlite-utils/issues/221))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/simonw/sqlite-utils/releases/tag/3.3", "id": 36530216, "node_id": "MDc6UmVsZWFzZTM2NTMwMjE2", "tag_name": "3.3", "target_commitish": "main", "name": "3.3", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-01-18T04:28:24Z", "published_at": "2021-01-18T04:29:48Z", "body": "- The `table.m2m()` method now accepts an optional `alter=True` argument to specify that any missing columns should be added to the referenced table. See [Working with many-to-many relationships](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-m2m). ([#222](https://github.com/simonw/sqlite-utils/issues/222))", "repo": {"value": 140912432, "label": "sqlite-utils"}, "reactions": null} {"html_url": "https://github.com/dogsheep/swarm-to-sqlite/releases/tag/0.3.3", "id": 36530359, "node_id": "MDc6UmVsZWFzZTM2NTMwMzU5", "tag_name": "0.3.3", "target_commitish": "main", "name": "0.3.3", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-01-18T04:34:56Z", "published_at": "2021-01-18T04:36:03Z", "body": "- Fixed bug where tool could crash with an error about missing columns. #11", "repo": {"value": 205429375, "label": "swarm-to-sqlite"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.54a0", "id": 36623336, "node_id": "MDc6UmVsZWFzZTM2NjIzMzM2", "tag_name": "0.54a0", "target_commitish": "main", "name": "0.54a0", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 1, "created_at": "2021-01-19T20:50:12Z", "published_at": "2021-01-19T20:51:13Z", "body": "**Alpha release**. Release notes in progress.\r\n\r\n- Improved support for named in-memory databases. ([#1151](https://github.com/simonw/datasette/issues/1151))\r\n- New `_internal` in-memory database tracking attached databases, tables and columns. ([#1150](https://github.com/simonw/datasette/issues/1150))\r\n- Support for JavaScript modules. ([#1186](https://github.com/simonw/datasette/issues/1186), [#1187](https://github.com/simonw/datasette/issues/1187))", "repo": {"value": 107914493, "label": "datasette"}, "reactions": null} {"html_url": "https://github.com/simonw/datasette/releases/tag/0.54", "id": 36871901, "node_id": "MDc6UmVsZWFzZTM2ODcxOTAx", "tag_name": "0.54", "target_commitish": "main", "name": "0.54", "draft": 0, "author": {"value": 9599, "label": "simonw"}, "prerelease": 0, "created_at": "2021-01-25T17:35:06Z", "published_at": "2021-01-25T17:36:30Z", "body": "The two big new features in this release are the `_internal` SQLite in-memory database storing details of all connected databases and tables, and support for JavaScript modules in plugins and additional scripts.\r\n\r\nFor additional commentary on this release, see [Datasette 0.54, the annotated release notes](https://simonwillison.net/2021/Jan/25/datasette/).\r\n\r\n### The _internal database\r\n\r\nAs part of ongoing work to help Datasette handle much larger numbers of connected databases and tables (see [Datasette Library](https://github.com/simonw/datasette/issues/417)) Datasette now maintains an in-memory SQLite database with details of all of the attached databases, tables, columns, indexes and foreign keys. ([#1150](https://github.com/simonw/datasette/issues/1150))\r\n\r\nThis will support future improvements such as a searchable, paginated homepage of all available tables.\r\n\r\nYou can explore an example of this database by [signing in as root](https://latest.datasette.io/login-as-root) to the `latest.datasette.io` demo instance and then navigating to [latest.datasette.io/_internal](https://latest.datasette.io/_internal).\r\n\r\nPlugins can use these tables to introspect attached data in an efficient way. Plugin authors should note that this is not yet considered a stable interface, so any plugins that use this may need to make changes prior to Datasette 1.0 if the `_internal` table schemas change.\r\n\r\n### Named in-memory database support\r\n\r\nAs part of the work building the `_internal` database, Datasette now supports named in-memory databases that can be shared across multiple connections. This allows plugins to create in-memory databases which will persist data for the lifetime of the Datasette server process. ([#1151](https://github.com/simonw/datasette/issues/1151))\r\n\r\nThe new `memory_name=` parameter to the [Database class](https://docs.datasette.io/en/stable/internals.html#internals-database) can be used to create named, shared in-memory databases.\r\n\r\n### JavaScript modules\r\n\r\n[JavaScript modules](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules) were introduced in ECMAScript 2015 and provide native browser support for the `import` and `export` keywords.\r\n\r\nTo use modules, JavaScript needs to be included in `