{"sha": "fe279ab7b4ae99dab295d5cf4d39ad06d782997e", "message": "v0.8 - added PyPI metadata, ready to ship", "author_date": "2017-11-13T21:17:34Z", "committer_date": "2017-11-13T21:17:34Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "e55bc3b2fa6e1e8be7b7c1f5b6cb3764713b6faa", "message": "th align left for all tables", "author_date": "2017-10-25T14:46:38Z", "committer_date": "2017-10-25T14:46:38Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "4427d2d96f7197e25acee85643bcf02e758b8b1e", "message": "table.create_index(columns, index_name) method", "author_date": "2018-08-01T15:20:44Z", "committer_date": "2018-08-01T15:20:44Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 140912432, "label": "sqlite-utils"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "b69f8b6c856adff577fe6a1816359bb00e82ffd1", "message": "table.count property, plus made a start on table documentation", "author_date": "2018-07-31T03:24:35Z", "committer_date": "2018-07-31T03:24:35Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 140912432, "label": "sqlite-utils"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "f571b19d8a5fd3a19fdf679421fd55a8edbf5295", "message": "sqlerrors() decorator catching and returning useful errors\n\nCloses #8", "author_date": "2017-10-23T15:28:00Z", "committer_date": "2017-10-23T15:28:00Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "3ef35ca8b4369af6a8bcdd9e5cfbb5f3a7d17cf8", "message": "serve and publish commands now take a --metadata option\n\nIf provided, the --metadata option is the path to a JSON file containing\nmetadata that should be displayed alongside the dataset.\n\n datasette /tmp/fivethirtyeight.db --metadata /tmp/metadata.json\n\nCurrently that metadata format looks like this:\n\n {\n \"title\": \"Five Thirty Eight\",\n \"license\": \"CC Attribution 4.0 License\",\n \"license_url\": \"http://creativecommons.org/licenses/by/4.0/\",\n \"source\": \"fivethirtyeight/data on GitHub\",\n \"source_url\": \"https://github.com/fivethirtyeight/data\"\n }\n\nIf provided, this will be used by the index template and to populate the\ncommon footer.\n\nThe publish command also accepts this argument, and will package any provided\nmetadata up and include it with the resulting Docker container.\n\n datasette publish --metadata /tmp/metadata.json /tmp/fivethirtyeight.db\n\nCloses #68", "author_date": "2017-11-13T15:20:02Z", "committer_date": "2017-11-13T15:20:02Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "be768f26d09fa060b1ca71785ff546dd572f3fbc", "message": "python setup.py test now runs the tests", "author_date": "2017-11-04T23:40:27Z", "committer_date": "2017-11-04T23:40:27Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "606ff9e35e007ae58a491d417f47779034bacabc", "message": "python app.py --build to generate build-metadata.json\n\nThis is now run by the Dockerfile to build this at compile time.", "author_date": "2017-10-24T05:53:13Z", "committer_date": "2017-10-24T05:53:13Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "20d41c8e8e84ab3e8bdb5cca9bd9799da09794ad", "message": "publish now takes a required publisher argument - only current option is 'now'\n\nCloses #76", "author_date": "2017-11-13T18:40:51Z", "committer_date": "2017-11-13T18:40:51Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "3863a30b5d18204b4c77518f1880a1f705e929db", "message": "publish command checks 'now' is installed\n\nCloses #58", "author_date": "2017-11-11T16:00:00Z", "committer_date": "2017-11-11T16:00:00Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "8a4ed052a5034d3f12daf5eedabb0808a0bf20fc", "message": "path_with_added_args now works with multiple existing args", "author_date": "2018-05-14T22:09:09Z", "committer_date": "2018-05-16T15:27:24Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "2b79f2bdeb1efa86e0756e741292d625f91cb93d", "message": "path_with_added_args now preserves order in Python 3.5", "author_date": "2018-05-14T03:02:07Z", "committer_date": "2018-05-14T03:04:23Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "446d47fdb005b3776bc06ad8d1f44b01fc2e938b", "message": "make html title more readable in query template (#180)\n\ntiny tweak to make this easier to visually parse\u2014I think it matches your style in other templates", "author_date": "2018-04-03T15:24:04Z", "committer_date": "2018-04-03T15:24:04Z", "raw_author": {"value": "daa0836007170071f748b575d34c4432f4f43926", "label": "Ryan Pitts"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 56477, "label": "ryanpitts"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "bc9871c93583f3cdcca191b7fa05b255be7275c8", "message": "gt/lt/gte/lte now treat numeric arguments as numeric\n\nThis now works:\n\n https://immutabase-dlmggyoepw.now.sh/northwind-40d049b/Products?UnitsInStock__gt=100\n\nPreviously the input value of 100 would be treated as a string.\n\nAlso fixed a bug where filter arguments had stopped working entirely.\n\nRefs #23", "author_date": "2017-11-09T16:09:55Z", "committer_date": "2017-11-09T16:09:55Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "6a0c5de6154893eb4269dc7b1f160726ec6395f2", "message": "ensure_build_metadata() function for metadata\n\nThis will be run at compile time - the goal is to generate a build-\nmetadata.json file with a bunch of useful facts about the databases that could\nbe expensive to generate at run-time.\n\nExample metadata:\n\n {\n \"flights\": {\n \"file\": \"flights.db\",\n \"tables\": {\n \"airlines\": 6048,\n \"airports\": 8107,\n \"routes\": 67663\n },\n \"hash\": \"07d1283e07786b1235bb7041ea445ae103d1571565580a29eab0203c555725fd\"\n }\n\nSo far we have a sha256 hash of the database file itself, plus a row count for\neach table.\n\nFixes #11", "author_date": "2017-10-23T16:02:40Z", "committer_date": "2017-10-23T16:02:40Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "f4907f6df58d822dfb67660b982a9081b39a06fb", "message": "enable_fts(), populate_fts() and search() methods", "author_date": "2018-07-31T16:19:05Z", "committer_date": "2018-07-31T16:19:20Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 140912432, "label": "sqlite-utils"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "4c66097d581c3970a23530598c4fe98b09f422ee", "message": "datasette publish now works with full paths\n\ne.g. datasette publish /tmp/blah/database.db now does the right thing", "author_date": "2017-11-12T23:16:24Z", "committer_date": "2017-11-12T23:16:24Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "ff2fb573cd8773206a6df83229620928056e2ee2", "message": "datasette publish --name=now-accepts-name\n\nFixes #72", "author_date": "2017-11-13T02:12:21Z", "committer_date": "2017-11-13T02:12:21Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "62f1d3a6cbf7fca5c0e85c13a77830755c314883", "message": "class=\"suggested-facets\"", "author_date": "2018-05-16T05:08:58Z", "committer_date": "2018-05-16T15:27:24Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "f643f7aee1b3d29df82b93a6560887a35b7a2f13", "message": "base64 encode bytestrings from DB in JSON\n\nFixes #29", "author_date": "2017-10-24T14:58:41Z", "committer_date": "2017-10-24T14:58:41Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "ed2b3f25beac720f14869350baacc5f62b065194", "message": "add support for ?field__isnull=1 (#107)\n\n* add support for ?field__isnull=1\r\n\r\n* Add unit test and conditional formatting for ?field__isnull", "author_date": "2017-11-17T13:29:22Z", "committer_date": "2017-11-17T13:29:22Z", "raw_author": {"value": "19245be93da11be3d5e72991646660a06a9d3449", "label": "Ray N"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 3433657, "label": "raynae"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "a82175276c3f5898161c7630f669d0b8990d7a16", "message": "_sort/_next links now use new path_with_replaced_args method", "author_date": "2018-05-15T09:34:45Z", "committer_date": "2018-05-16T15:27:24Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "f3a3820ff5c5ba9b4af102e65ed1f084b1fe704d", "message": "_sort and _sort_desc parameters for table views\n\nAllows for paginated sorted results based on a specified column.\n\nRefs #189", "author_date": "2018-04-09T00:06:10Z", "committer_date": "2018-04-09T05:10:22Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "f4943ca89bf400350205788f9130c135aaf7b85b", "message": "_facet selections persist through table form, refs #255", "author_date": "2018-05-15T10:28:48Z", "committer_date": "2018-05-16T15:27:24Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "ff2ab9dc7d82f70daae10f5b0cde87d74704f910", "message": "Views now show their SQL, are handled a bit better\n\nRefs #66", "author_date": "2017-11-12T20:31:46Z", "committer_date": "2017-11-12T20:32:25Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "db3fa4abfac366184e97fb313b36d3429e5b937a", "message": "Views no longer attempt to link to records\n\nCloses #54", "author_date": "2017-11-12T21:29:26Z", "committer_date": "2017-11-12T21:29:26Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "b0f3d4e375655f0764f3137dbcede324f9bbc0cb", "message": "Version 0.11", "author_date": "2017-11-14T01:48:22Z", "committer_date": "2017-11-14T01:48:22Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "5928c11ee798a232aa4096706cd47e639d1c9fc2", "message": "Version 0.10", "author_date": "2017-11-14T00:45:23Z", "committer_date": "2017-11-14T00:45:23Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "cf1fe693e5741035df65cc9d69c4af32befd021d", "message": "Used isort to re-order my imports", "author_date": "2018-05-13T12:58:28Z", "committer_date": "2018-05-14T03:04:23Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "d9fa2bf7ba2f9d3dcb2beb303f772c86344b4bcf", "message": "Use rowid if no primary key available\n\nAllows us to link to individual records even for tables that do not have a primary key.\n\nRefs #5", "author_date": "2017-11-09T14:39:50Z", "committer_date": "2017-11-09T14:39:50Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "a892f9a0bd6667c1ad4c590016d6845cd98a645a", "message": "Use escape_sqlite() more consistently", "author_date": "2018-05-15T15:00:39Z", "committer_date": "2018-05-16T15:27:24Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "d1209a2c453311432dcc41966a81a39d895e9fae", "message": "Use FTS4 when running the tests\n\nBecause the version of sqlite3 running in Travis CI does not have FTS5", "author_date": "2018-08-13T00:33:13Z", "committer_date": "2018-08-13T00:33:13Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 140912432, "label": "sqlite-utils"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "e06b0117711ca7c9d6d6865d2bff8525aa11ebf0", "message": "Updated tests\n\nRefs #23", "author_date": "2017-11-10T18:43:54Z", "committer_date": "2017-11-10T18:43:54Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "9e8c36793bfbb17c2f67371cc7f9aa8b9202fdc4", "message": "Update spatialite.rst (#413)\n\na line of sql added to create the idx_ in the python recipe", "author_date": "2019-03-15T05:06:45Z", "committer_date": "2019-03-15T05:06:45Z", "raw_author": {"value": "41e868c44ebf155cd4e69182c407f1d278d635ce", "label": "joelondon"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 28597217, "label": "joelondon"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "3c50a3600d0975b84d98c93bb2336a790afc6aca", "message": "Unit test for black-approved coding style", "author_date": "2018-07-28T14:29:20Z", "committer_date": "2018-07-28T14:29:20Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 140912432, "label": "sqlite-utils"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "8a0bd68c393423a6c3bdae27d3826e6161a101c1", "message": "Undid some slightly weird code formatting by 'black'", "author_date": "2018-05-15T13:23:20Z", "committer_date": "2018-05-16T15:27:24Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "3cce63b59851495b6d9d38936356e21ea8fbad3a", "message": "URL to allow direct database download\n\nIt's just the database URL with .db on the end, e.g. /flights.db\n\nCloses #19", "author_date": "2017-10-25T15:19:32Z", "committer_date": "2017-10-25T15:19:32Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "858d79fe938afbe04e2b249da71860e812869ec8", "message": "Typo fix", "author_date": "2018-05-16T15:15:56Z", "committer_date": "2018-05-16T15:27:24Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "70e1f831a00ec97b724187025e35338becd2309a", "message": "Typo", "author_date": "2018-08-01T01:32:03Z", "committer_date": "2018-08-01T01:32:03Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 140912432, "label": "sqlite-utils"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "82261a638bd35c9d69a9582a898cf4dab374f76c", "message": "Turn on auto-escaping in Jinja\n\nWe had XSS holes! Since we don't do cookies or authentication\nthey shouldn't cause any actual harm, but still really not good.\n\nhttps://github.com/pallets/jinja/issues/528", "author_date": "2017-11-16T01:59:42Z", "committer_date": "2017-11-16T01:59:42Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "29f9a29250169cdb564020109f76e0f4b52afa5d", "message": "Total row count now correct even if _next= applied", "author_date": "2018-04-08T23:13:52Z", "committer_date": "2018-04-09T05:10:22Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "ed78922ae38b51513319b60ac39990b7c2aca810", "message": "Tiny typo in customization docs (#390)\n\nThanks, @jaywgraves", "author_date": "2018-12-16T21:32:55Z", "committer_date": "2018-12-16T21:32:55Z", "raw_author": {"value": "6410ac01839c113476668eeff88d60a0a2c6eb7a", "label": "Jay Graves"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 418191, "label": "jaywgraves"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "8acdc2fd14c0f7251e1e3fd592c53b3152f5256c", "message": "Test for table with space in name\n\nTests code in b51836f8463ef65bc947f0a7b6e60167cb7154cf", "author_date": "2017-11-12T20:08:32Z", "committer_date": "2017-11-12T20:08:32Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "0b8c1b0a6da9cb8ac0d28cc90dd783de87554036", "message": "Test for sql_time_limit_ms + sqlite_functions mechanism\n\nAdded a unit test for the sql_time_limit_ms option.\n\nTo test this, I needed to add a custom SQLite sleep() function. I've added a\nsimple mechanism to the Datasette class for registering custom functions.\n\nI also had to modify the sqlite_timelimit() function. It makes use of a magic\nvalue, N, which is the number of SQLite virtual machine instructions that\nshould execute in between calls to my termination decision function.\n\nThe value of N was not finely grained enough for my test to work - so I've\nadded logic that says that if the time limit is less than 50ms, N is set to 1.\nThis got the tests working.\n\nRefs #95", "author_date": "2017-11-15T02:41:03Z", "committer_date": "2017-11-15T02:43:34Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "1b04662585ea1539014bfbd616a8112b650d5699", "message": "Table views now show expanded foreign key references, if possible\n\nIf a table has foreign key columns, and those foreign key tables have\nlabel_columns, the TableView will now query those other tables for the\ncorresponding values and display those values as links in the corresponding\ntable cells.\n\nlabel_columns are currently detected by the inspect() function, which looks\nfor any table that has just two columns - an ID column and one other - and\nsets the label_column to be that second non-ID column.", "author_date": "2017-11-18T03:09:32Z", "committer_date": "2017-11-18T03:15:49Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "22851ed9f0541904f5c3fca7ddbd7add10a75d39", "message": "Table page now shows CREATE TABLE at bottom\n\nCloses #66", "author_date": "2017-11-12T21:16:59Z", "committer_date": "2017-11-12T21:16:59Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "084350b0f1343d988928cae63cfedbeb6205e25e", "message": "Switched to gather_request=False for Sanic tests\n\nGets rid of those ugly _, response = lines.", "author_date": "2017-11-17T14:53:37Z", "committer_date": "2017-11-17T14:53:37Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "186c513a61a091b9f83d788e25b08f41a84ed9a3", "message": "Support parameterized SQL and block potentially harmful queries\n\nYou can now call arbitrary SQL like this:\n\n /flights?sql=select%20*%20from%20airports%20where%20country%20like%20:c&c=iceland\n\nUnescaped, those querystring params look like this:\n\n sql = select * from airports where country like :c\n c = iceland\n\nSo SQL can be constructed with named parameters embedded in it, which will\nthen be read from the querystring and correctly escaped.\n\nThis means we can aggressively filter the SQL parameter for potentially\ndangerous syntax. For the moment we enforce that it starts with a SELECT\nstatement and we ban the sequence \"pragma\" from it entirely.\n\nIf you need to use pragma in a query, you can use the new named parameter\nmechanism.\n\nFixes #39", "author_date": "2017-11-05T02:49:18Z", "committer_date": "2017-11-05T02:49:18Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "72644b6e3fc78ecf55b386854943ec3ad39f97bd", "message": "Support method chaining, added .last_id for accessing lastrowid\n\nAlso shipping as 0.5", "author_date": "2018-08-06T01:42:43Z", "committer_date": "2018-08-06T01:42:43Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 140912432, "label": "sqlite-utils"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "2bbe9ca34a701191e3bf4e97943b7503a50ab548", "message": "Support OPTIONS requests for CORS", "author_date": "2017-11-13T02:11:52Z", "committer_date": "2017-11-13T02:11:52Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "95bce37ad3447d3c265316fa029fc09b7bbdae11", "message": "Store list/dict/tuple values as JSON strings", "author_date": "2018-07-28T22:20:29Z", "committer_date": "2018-07-28T22:20:29Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 140912432, "label": "sqlite-utils"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "44a199a0625b695492b2a8605030dc61191f39cb", "message": "Stop using sqlite WITH RECURSIVE in our tests\n\nThe version of Python 3 running in Travis CI doesn't support this.", "author_date": "2017-11-13T22:15:21Z", "committer_date": "2017-11-13T22:15:21Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "1592fd0419f374de201926d3ba67fbf1522eed13", "message": "Started work on cli, which also meant adding setup.py\n\nI'm using click, and click recommends using a setup.py - so I've added one of\nthose. I also refactored code into a new datasite package. It's not quite\ndeploying to now properly at the moment though - I seem to have messed up the\npath handling a bit.\n\nAlso snuck in a new template for the \"Row\" view.\n\nRefs #40", "author_date": "2017-10-27T07:08:24Z", "committer_date": "2017-10-27T07:08:24Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "29c897bb5649c35463618a32d095f72755aae8c6", "message": "Started the docs with a meaty example", "author_date": "2018-07-28T23:52:07Z", "committer_date": "2018-07-28T23:52:07Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 140912432, "label": "sqlite-utils"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "1ae8ea0f03cfb9f25b1e25f3194c456c3649789c", "message": "Started implementing ?name__contains=X filters\n\nSo far we support __contains=, __startswith=, __endswith= and __exact=\n\nRefs #23", "author_date": "2017-10-25T00:06:23Z", "committer_date": "2017-10-25T00:06:23Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "594b25ef9f633dabdaca98b46dea9fbb82628166", "message": "Started a changelog, releasing 0.6", "author_date": "2018-08-13T00:46:22Z", "committer_date": "2018-08-13T00:46:22Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 140912432, "label": "sqlite-utils"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "3eb79e1a5fa4c164a224ae0adbe0ea16fde35758", "message": "Show total row count at top of table page", "author_date": "2017-10-25T01:31:43Z", "committer_date": "2017-10-25T01:31:43Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "eef213ab4d57622dfc60c8655c0c7a18afcc844f", "message": "Show total number of rows in table", "author_date": "2017-10-25T00:11:36Z", "committer_date": "2017-10-25T00:11:36Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "bd5f3b2ba1a627383d512d613b77d15501dfccc4", "message": "Show time taken at bottom of table page", "author_date": "2017-10-25T01:31:54Z", "committer_date": "2017-10-25T01:31:54Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "91bf5f56bb301fb564640fa6b1bb8a6e981ff721", "message": "Show enabled facets in flexbox columns, refs #255", "author_date": "2018-05-16T05:06:05Z", "committer_date": "2018-05-16T15:27:24Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "03c58fb350f6b9bb941a46907da5ac6f67bf47cf", "message": "Show databases in alphabetical order on index page", "author_date": "2017-11-10T19:04:56Z", "committer_date": "2017-11-10T19:04:56Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "d01370f1660d0b0360248105cd43060dca31f70f", "message": "Show SQL and params if table has them applied", "author_date": "2017-11-12T23:21:39Z", "committer_date": "2017-11-12T23:21:39Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "6823b094066c5cb1dcd3581da2ed877ed72298b7", "message": "Set time limit of 1000ms on SQL queries\n\nUsing the (undocumented in the Python docs) fact that if you return 1 from a\nset_progress_handler callback, SQLite will cancel the current query.\n\nCloses #35", "author_date": "2017-10-25T01:34:54Z", "committer_date": "2017-10-25T01:34:54Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "3d9baf3c2f2f745e6949973f18480092f189116c", "message": "Set theme jekyll-theme-leap-day", "author_date": "2018-05-24T16:55:19Z", "committer_date": "2018-05-24T16:55:19Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "28a52fcffb869f5e83ca2fad53738dc25eec425d", "message": "Set theme jekyll-theme-architect", "author_date": "2018-05-24T16:56:21Z", "committer_date": "2018-05-24T16:56:21Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "976263effcc2b9658006f739f7f7f02554f8d97f", "message": "Sanity check add_foreign_key() column exists, closes #29", "author_date": "2019-06-20T23:58:09Z", "committer_date": "2019-06-20T23:58:18Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 140912432, "label": "sqlite-utils"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "8252daa4c14d73b4b69e3f2db4576bb39d73c070", "message": "SQL syntax highlighting with Codemirror (#89)", "author_date": "2017-11-15T02:03:00Z", "committer_date": "2017-11-15T02:03:00Z", "raw_author": {"value": "842b8095c01bad0cc95c5ee2e93d83bf3945daa0", "label": "Tom Dyson"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 15543, "label": "tomdyson"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "6a007f632258e6cfd3c5e9e229683deb0efd87be", "message": "Row pages show incoming foreign key relationships", "author_date": "2017-11-17T18:15:44Z", "committer_date": "2017-11-18T03:15:49Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "40a563ebac72f46a1b2dc498a25520c429bca6d6", "message": "Reworked metadata building options\n\nBuilding metadata is now optional. If you want to do it, do this:\n\n datasette build *.db --metadata=metadata.json\n\nThen when you run the server you can tell it to read from metadata:\n\n datasette serve *.db --metadata=metadata.json\n\nThe Dockerfile generated by datasette publish now uses this mechanism.\n\nCloses #60", "author_date": "2017-11-11T20:10:51Z", "committer_date": "2017-11-11T20:11:51Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "e9e1def4c0cc49c96ed0b0d2bbc3ae81353ed2bb", "message": "Revised JSON design a bit\n\nCloses #63", "author_date": "2017-11-11T22:20:00Z", "committer_date": "2017-11-11T22:20:00Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "efbb4e83374a2c795e436c72fa79f70da72309b8", "message": "Return HTTP 405 on InvalidUsage rather than 500\n\nThis also stops it filling up the logs. This happens for HEAD requests\nat the moment - which perhaps should be handled better, but that's a\ndifferent issue.", "author_date": "2018-04-14T16:11:16Z", "committer_date": "2018-04-14T18:00:38Z", "raw_author": {"value": "cd9d55c7c0a7cc0ee69155676fd5e9fc6e1b884b", "label": "Russ Garrett"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 45057, "label": "russss"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "1c57bd202fb1f82e14c47dfca63454352999732c", "message": "Replaced app_factory with new Datasette class\n\nThis should make it easier to add unit tests.", "author_date": "2017-11-10T19:05:57Z", "committer_date": "2017-11-10T19:05:57Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "e7e50875d341f1d26b4dbba862f5202631f34896", "message": "Renamed to 'datasette'", "author_date": "2017-11-10T18:38:35Z", "committer_date": "2017-11-10T18:38:35Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "25c241fa5a0f8868e3c1bc5be4f5888caa47d864", "message": "Renamed project to immutabase", "author_date": "2017-11-06T02:32:13Z", "committer_date": "2017-11-06T02:32:13Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "349e262bb1c8f225cf86a5e8542253282809a0eb", "message": "Renamed ?_sql_time_limit_ms= to ?_timelimit, closes #242", "author_date": "2018-05-02T00:11:46Z", "committer_date": "2018-05-02T00:20:39Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "23e0fdb0f3196ffa4d8bc4944c8bc9cb0f89129b", "message": "Removed unnecessary enumerate template helper\n\nI made this obsolete in d1756d773685ca4f9c5b57fb40e1aa743bc95525\n\nRefs #189", "author_date": "2018-04-09T05:02:19Z", "committer_date": "2018-04-09T05:10:22Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "ba515fc56e6cf77ea299b6d534be7ccfa925a533", "message": "Removed un-used variable", "author_date": "2018-05-15T10:08:07Z", "committer_date": "2018-05-16T15:27:24Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "d76412668f8c12572eb7de57ccb72f1e50306177", "message": "Removed rogue middot", "author_date": "2017-11-13T20:34:39Z", "committer_date": "2017-11-13T20:34:39Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "364b0fb6784f72b5c4048a3d6b697fba5ec86db7", "message": "Remove .DS_Store", "author_date": "2019-06-20T23:55:39Z", "committer_date": "2019-06-20T23:56:13Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 140912432, "label": "sqlite-utils"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "b263da78e329853ceea41c4ecabe7e8bb08d20a7", "message": "Reliable sort order for facets in Python 3.5, fixing test - refs #255", "author_date": "2018-05-16T14:43:13Z", "committer_date": "2018-05-16T15:27:24Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "6b3b05b6db0d2a7b7cec8b8dbb4ddc5e12a376b2", "message": "Released 0.7", "author_date": "2017-11-13T18:42:30Z", "committer_date": "2017-11-13T18:42:30Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "46281c9db0d6eb50203880c83363a8b279db4ecd", "message": "Release 1.2.1", "author_date": "2019-06-21T00:01:21Z", "committer_date": "2019-06-21T00:01:24Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 140912432, "label": "sqlite-utils"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "d75f423b6fcfc074b7c6f8f7679da8876f181edd", "message": "Release 0.9", "author_date": "2017-11-13T22:00:39Z", "committer_date": "2017-11-13T22:00:53Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "f5418e13f2e435a42cd3611b28ec3c9ac02481da", "message": "Release 0.3.1 to publish updated README to PyPI", "author_date": "2018-07-31T15:39:43Z", "committer_date": "2018-07-31T15:39:43Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 140912432, "label": "sqlite-utils"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "1f69269fe93e4cd42e56890126cc0dbcf719c6cb", "message": "Refactored views into new views/ modules, refs #256", "author_date": "2018-05-13T12:44:22Z", "committer_date": "2018-05-14T03:04:23Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "a8a293cd71f7529aff374be5ca01f2ebd5e71ee4", "message": "Refactored util functions into new utils module", "author_date": "2017-11-10T19:25:54Z", "committer_date": "2017-11-10T19:25:54Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "9d219140694551453bfa528e0624919eb065f9d6", "message": "Refactored to use class based views\n\nCloses #22", "author_date": "2017-10-24T02:25:48Z", "committer_date": "2017-10-24T02:25:48Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "40d3b3eae68286f67e40226f18f2621b26e5e533", "message": "Refactored tests into new tests/ folder\n\nGuided by https://docs.pytest.org/en/latest/goodpractices.html", "author_date": "2017-11-10T18:48:16Z", "committer_date": "2017-11-10T18:48:16Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "e16ca1169cc49fbb5b0325564d248becad3a4b7f", "message": "Refactored table column/row display logic\n\nSimplified the template and made the way for upcoming foreign key work.\n\nRefs #85\n\nAlso fixed   bug on database page - closes #113", "author_date": "2017-11-17T15:39:36Z", "committer_date": "2017-11-17T15:39:36Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "1fc75809a6aa17860944b4cc3a4d7175cd53b1f4", "message": "Refactored everything into a factory function\n\nI now call a factory function to construct the Sanic app:\n\n app = app_factory(files)\n\nThis allows me to pass additional arguments to it, e.g. the files to serve.\n\nAlso refactored my class-based views to accept jinja as an argument, e.g:\n\n app.add_route(\n TableView.as_view(jinja),\n '//'\n )", "author_date": "2017-11-05T02:13:44Z", "committer_date": "2017-11-05T02:13:44Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "58b5a37dbbf13868a46bcbb284509434e66eca25", "message": "Refactor inspect logic", "author_date": "2018-05-21T08:02:34Z", "committer_date": "2018-05-22T14:03:06Z", "raw_author": {"value": "cd9d55c7c0a7cc0ee69155676fd5e9fc6e1b884b", "label": "Russ Garrett"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 45057, "label": "russss"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "02b1814fcfdc61b1b69b5955f2b60252ff10cde9", "message": "Redirects now preserve query string\n\nFixes #28", "author_date": "2017-10-24T23:54:26Z", "committer_date": "2017-10-24T23:54:26Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "368638555160fb9ac78f462d0f79b1394163fa30", "message": "Ran black source formatting tool against new views/ and app.py", "author_date": "2018-05-13T12:55:15Z", "committer_date": "2018-05-14T03:04:23Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "f1b0521810bbc467721e4dcc5a2ff1bf2a1ddbb8", "message": "Preserve .json through redirects", "author_date": "2017-10-25T15:01:22Z", "committer_date": "2017-10-25T15:01:22Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "0d63128c40aec15a958dddf181c13e0db1c7908b", "message": "Preparing v0.2, first release to PyPI", "author_date": "2018-07-29T00:42:41Z", "committer_date": "2018-07-29T00:42:41Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 140912432, "label": "sqlite-utils"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "9f47b6e4d80f0f393cf0167a6f48280de6847d1d", "message": "Pin to specific Jinja version\n\nCloses #100", "author_date": "2017-11-16T00:14:07Z", "committer_date": "2017-11-16T00:14:07Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "5deb65f0623bff03421f50d3c61f699b981ae18b", "message": "Now you just 'from sqlite_utils import Database'\n\nPlus fixed ad_id in the Russian ads example in the docs", "author_date": "2018-07-31T03:30:23Z", "committer_date": "2018-07-31T03:30:23Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 140912432, "label": "sqlite-utils"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "7e0cedae3d920797f6f9411aea90a2b1d86ac9c7", "message": "Now using bootstrap 4 beta\n\nRefs #16", "author_date": "2017-11-06T02:49:07Z", "committer_date": "2017-11-06T02:49:07Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "a0bb9da17fb95ac5e3bcd3c8d800d33c25a71bbc", "message": "Now requires DB files to be passed as arguments\n\nRefs #40", "author_date": "2017-11-06T02:24:43Z", "committer_date": "2017-11-06T02:24:43Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "b13f0986f26d88938519b07871c961c0b5a97802", "message": "New sortable_columns option in metadata.json to control sort options\n\nYou can now explicitly set which columns in a table can be used for sorting\nusing the _sort and _sort_desc arguments using metadata.json:\n\n {\n \"databases\": {\n \"database1\": {\n \"tables\": {\n \"example_table\": {\n \"sortable_columns\": [\n \"height\",\n \"weight\"\n ]\n }\n }\n }\n }\n }\n\nRefs #189", "author_date": "2018-04-09T04:58:25Z", "committer_date": "2018-04-09T05:10:22Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}}