{"sha": "0120c24927af364304574ab1a58e417094e01c22", "message": "extra_css_urls/extra_js_urls in metadata, refs #153\n\nA mechanism in the metadata.json format for adding custom CSS and JS urls.\n\nCreate a metadata.json file that looks like this:\n\n {\n \"extra_css_urls\": [\n \"https://simonwillison.net/static/css/all.bf8cd891642c.css\"\n ],\n \"extra_js_urls\": [\n \"https://code.jquery.com/jquery-3.2.1.slim.min.js\"\n ]\n }\n\nThen start datasette like this:\n\n datasette mydb.db --metadata=metadata.json\n\nThe CSS and JavaScript files will be linked in the of every page.\n\nYou can also specify a SRI (subresource integrity hash) for these assets:\n\n {\n \"extra_css_urls\": [\n {\n \"url\": \"https://simonwillison.net/static/css/all.bf8cd891642c.css\",\n \"sri\": \"sha384-9qIZekWUyjCyDIf2YK1FRoKiPJq4PHt6tp/ulnuuyRBvazd0hG7pWbE99zvwSznI\"\n }\n ],\n \"extra_js_urls\": [\n {\n \"url\": \"https://code.jquery.com/jquery-3.2.1.slim.min.js\",\n \"sri\": \"sha256-k2WSCIexGzOj3Euiig+TlR8gA0EmPjuc79OEeY5L45g=\"\n }\n ]\n }\n\nModern browsers will only execute the stylsheet or JavaScript if the SRI hash\nmatches the content served. You can generate hashes using www.srihash.org", "author_date": "2017-11-29T02:38:15Z", "committer_date": "2017-11-29T02:38:15Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "b67890d15d164c7affb2887e5737534628dc6227", "message": "Auto-link column values that look like URLs\n\nRefs #153", "author_date": "2017-11-29T17:05:24Z", "committer_date": "2017-11-29T17:05:24Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "8ab3a169d42d096f2c7979c6d3d7746618d30f0b", "message": "CSS styling hooks as classes on the body\n\nRefs #153\n\nEvery template now gets CSS classes in the body designed to support custom\nstyling.\n\nThe index template (the top level page at /) gets this:\n\n \n\nThe database template (/dbname/) gets this:\n\n \n\nThe table template (/dbname/tablename) gets:\n\n \n\nThe row template (/dbname/tablename/rowid) gets:\n\n \n\nThe db-x and table-x classes use the database or table names themselves IF\nthey are valid CSS identifiers. If they aren't, we strip any invalid\ncharacters out and append a 6 character md5 digest of the original name, in\norder to ensure that multiple tables which resolve to the same stripped\ncharacter version still have different CSS classes.\n\nSome examples (extracted from the unit tests):\n\n \"simple\" => \"simple\"\n \"MixedCase\" => \"MixedCase\"\n \"-no-leading-hyphens\" => \"no-leading-hyphens-65bea6\"\n \"_no-leading-underscores\" => \"no-leading-underscores-b921bc\"\n \"no spaces\" => \"no-spaces-7088d7\"\n \"-\" => \"336d5e\"\n \"no $ characters\" => \"no--characters-59e024\"", "author_date": "2017-11-30T07:09:54Z", "committer_date": "2017-11-30T07:09:54Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "ffa77f62b46e1ddf2f848f5da10a1e958323a084", "message": "Removed dependency on sanic-jinja2\n\nI wasn't using any of the functionality it adds on top of raw Jinja2.\n\nRefs #12 and #153", "author_date": "2017-11-30T15:51:40Z", "committer_date": "2017-11-30T15:51:40Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "7ff51598c468deb1d2c0d4c23a808458c9b1e3a2", "message": "git commit -m \"datasette --template-dir=mytemplates/\" argument\n\nYou can now pass an additional argument specifying a directory to look for\ncustom templates in.\n\nDatasette will fall back on the default templates if a template is not\nfound in that directory.\n\nRefs #12, #153", "author_date": "2017-11-30T16:05:01Z", "committer_date": "2017-11-30T16:05:01Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "3cd06729f457d690603b6060dc552b535517ab09", "message": "Ability to over-ride templates for individual tables/databases\n\nIt is now possible to over-ride templates on a per-database / per-row or per-\ntable basis.\n\nWhen you access e.g. /mydatabase/mytable Datasette will look for the following:\n\n - table-mydatabase-mytable.html\n - table.html\n\nIf you provided a --template-dir argument to datasette serve it will look in\nthat directory first.\n\nThe lookup rules are as follows:\n\n Index page (/):\n index.html\n\n Database page (/mydatabase):\n database-mydatabase.html\n database.html\n\n Table page (/mydatabase/mytable):\n table-mydatabase-mytable.html\n table.html\n\n Row page (/mydatabase/mytable/id):\n row-mydatabase-mytable.html\n row.html\n\nIf a table name has spaces or other unexpected characters in it, the template\nfilename will follow the same rules as our custom CSS classes\nintroduced in 8ab3a169d42d096f - for example, a table called \"Food Trucks\"\nwill attempt to load the following templates:\n\n table-mydatabase-Food-Trucks-399138.html\n table.html\n\nIt is possible to extend the default templates using Jinja template\ninheritance. If you want to customize EVERY row template with some additional\ncontent you can do so by creating a row.html template like this:\n\n {% extends \"default:row.html\" %}\n\n {% block content %}\n

EXTRA HTML AT THE TOP OF THE CONTENT BLOCK

\n

This line renders the original block:

\n {{ super() }}\n {% endblock %}\n\nCloses #12, refs #153", "author_date": "2017-11-30T16:30:10Z", "committer_date": "2017-11-30T16:38:16Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "cf46b86cf736aadd5147f85bfd6ff44c29655fde", "message": "Switch to sphinx_rtd_theme", "author_date": "2017-11-30T16:56:20Z", "committer_date": "2017-11-30T16:56:20Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "601934936c9e6e0007aca13547b73c3b36343f7f", "message": "Documentation for custom CSS/JavaScript/Templates\n\nWill go live at http://datasette.readthedocs.io/en/latest/custom_templates.html\n\nCloses #156", "author_date": "2017-11-30T17:09:48Z", "committer_date": "2017-11-30T17:09:48Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "1feb5735dad538312fac8b76705c05516250967b", "message": "Moved getting started into separate docs page", "author_date": "2017-11-30T18:27:00Z", "committer_date": "2017-11-30T18:27:00Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "1ecac1a4389b85f7acfad513bf6ab20899862d0b", "message": "Fix display of select boxes in Firefox", "author_date": "2017-12-02T20:53:08Z", "committer_date": "2017-12-02T20:53:08Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "cd792325681cbad9f663f2879d8b69f1edbb678f", "label": "GitHub"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 19864447, "label": "web-flow"}} {"sha": "e981ac7d4d1e1603257369eb5edba0fc4fdf5ae9", "message": "--static option for datasette serve\n\nYou can now tell Datasette to serve static files from a specific location at a\nspecific mountpoint.\n\nFor example:\n\n\tdatasette serve mydb.db --static extra-css:/tmp/static/css\n\nNow if you visit this URL:\n\n\thttp://localhost:8001/extra-css/blah.css\n\nThe following file will be served:\n\n\t/tmp/static/css/blah.css\n\nRefs #160", "author_date": "2017-12-03T16:33:36Z", "committer_date": "2017-12-03T16:33:36Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "0cfd7ce59d9018eb07af8f9e20f7d04308c9d01d", "message": "Allow WITH query (previously we required SELECT at start)\n\nFixes #161", "author_date": "2017-12-04T04:51:31Z", "committer_date": "2017-12-04T04:51:31Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "a743cdeafca0e5d011c282a53baf753c85d01516", "message": "Canned query support + database/query template refactor\n\nNamed canned queries can now be defined in metadata.json like this:\n\n {\n \"databases\": {\n \"timezones\": {\n \"queries\": {\n \"timezone_for_point\": \"select tzid from timezones ...\"\n }\n }\n }\n }\n\nThese will be shown in a new \"Queries\" section beneath \"Views\" on the database page.\n\nAs part of this, I refactored the logic for the database index page. It used\nto combine the functionality for listing available tables and the\nfunctionality for executing custom SQL queries in a single template and view.\nI have split that template out into database.html and query.html and reworked\nthe view to more clearly separate the custom SQL executing code.\n\nRefs #20", "author_date": "2017-12-05T16:17:02Z", "committer_date": "2017-12-05T16:17:02Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "b7b590b4149563ec6572f577632d7471b84dcb94", "message": "Docs for query.html CSS/template, refs #20", "author_date": "2017-12-05T16:35:14Z", "committer_date": "2017-12-05T16:35:14Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "7a4da7e5aedff3f61648d5530c4dc34de011ea8a", "message": "Documentation for custom SQL queries\n\nhttp://datasette.readthedocs.io/en/latest/sql_queries.html\n\nCloses #20", "author_date": "2017-12-05T17:43:59Z", "committer_date": "2017-12-05T17:43:59Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "f2dece01dba6355a91214ca163561a451941499f", "message": "Documented _sql_time_limit_ms querystring argument\n\nCloses #163", "author_date": "2017-12-06T15:06:56Z", "committer_date": "2017-12-06T15:06:56Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "cd792325681cbad9f663f2879d8b69f1edbb678f", "label": "GitHub"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 19864447, "label": "web-flow"}} {"sha": "f9c32e717f67b55e5d51bb896adc2dcec4489c2d", "message": "Linked to csvs-to-sqlite", "author_date": "2017-12-06T15:09:56Z", "committer_date": "2017-12-06T15:09:56Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "cd792325681cbad9f663f2879d8b69f1edbb678f", "label": "GitHub"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 19864447, "label": "web-flow"}} {"sha": "67ad77a307c7c264c68d768fa8290997e3b75e77", "message": "Re-ordered docs index page", "author_date": "2017-12-06T18:27:50Z", "committer_date": "2017-12-06T18:27:50Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "cd792325681cbad9f663f2879d8b69f1edbb678f", "label": "GitHub"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 19864447, "label": "web-flow"}} {"sha": "709f4f2798d0490ae048094536bed7e973ea29f4", "message": "Fixed bug with detecting FTS tables\n\nCloses #135", "author_date": "2017-12-07T04:54:25Z", "committer_date": "2017-12-07T04:54:37Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "52a5e95d21c9b2b7b50f5bc423e3746ae0538734", "message": "Fixed bug with filter columns\n\nCloses #162", "author_date": "2017-12-07T05:05:53Z", "committer_date": "2017-12-07T05:05:53Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "198b8b2955b9d8a8a80ce850a92a99426c5f161f", "message": "Fixed row page for tables with a primary key\n\nCloses #152", "author_date": "2017-12-07T05:23:13Z", "committer_date": "2017-12-07T05:23:13Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "a2b954e82818d5aa4b4c313d9a687d6a7bdd04b5", "message": "Fixed #155", "author_date": "2017-12-07T05:39:47Z", "committer_date": "2017-12-07T05:39:47Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "afbda9e210b6e5eae10a537c121cbb5e92cc8502", "message": "All extra_head blocks now call super\n\nThis means you can provide a custom base.html template that populates\nextra_head and any of the default child templates will still render content\nyou included in that block.\n\nRefs #158", "author_date": "2017-12-07T05:58:42Z", "committer_date": "2017-12-07T05:58:42Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "7e1ba161ec87b02cf7665a73188258f14036f892", "message": "Ability to easily customize _rows_and_columns.html per database table\n\nAlso added documentation for this.\n\nRefs #158, Closes #159.", "author_date": "2017-12-07T06:11:22Z", "committer_date": "2017-12-07T06:11:22Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "32cf5a4a72c1c8d46dd302566fdcbf4793f2f927", "message": "New datasette skeleton command for generating metadata.json\n\nCloses #164", "author_date": "2017-12-07T06:20:37Z", "committer_date": "2017-12-07T06:20:37Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "515eaa8ccba0603de5b14679b74402f3ddf02bd7", "message": "--reload now reloads on metadata changes too", "author_date": "2017-12-07T16:42:28Z", "committer_date": "2017-12-07T16:42:28Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "80bf3afa43e3cb396c7a7c9b168eedbc6fe0fa15", "message": "metadata.json support for per-table/per-database metadata\n\nAlso added support for descriptions and HTML descriptions.\n\nHere's an example metadata.json file illustrating custom per-database and per-\ntable metadata:\n\n {\n \"title\": \"Overall datasette title\",\n \"description_html\": \"This is a description with HTML.\",\n \"databases\": {\n \"db1\": {\n \"title\": \"First database\",\n \"description\": \"This is a string description & has no HTML\",\n \"license_url\": \"http://example.com/\",\n \t\t\"license\": \"The example license\",\n \"queries\": {\n \t\"canned_query\": \"select * from table1 limit 3;\"\n },\n \"tables\": {\n \"table1\": {\n \"title\": \"Custom title for table1\",\n \"description\": \"Tables can have descriptions too\",\n \"source\": \"This has a custom source\",\n \"source_url\": \"http://example.com/\"\n }\n }\n }\n }\n }\n\nCloses #165, Refs #164", "author_date": "2017-12-07T16:42:54Z", "committer_date": "2017-12-07T16:47:07Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "05399058062ba6df467c8745b87ece5f6951b39f", "message": "Renamed \"datasette build\" command to \"datasette inspect\"\n\nCloses #130", "author_date": "2017-12-07T16:57:31Z", "committer_date": "2017-12-07T16:57:31Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "9af2964f6fd4ae876ef8ecd2c14c2ffa61542fdb", "message": "Documentation for metadata.json and \"datasette skeleton\" command\n\nhttp://datasette.readthedocs.io/en/latest/metadata.html\n\nCloses #166", "author_date": "2017-12-07T17:19:35Z", "committer_date": "2017-12-07T17:19:35Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "cbfd6b745eabf51295e5a5e0ea57a0f93d63b37d", "message": "Publish should now work if /tmp is on different device\n\nFixes #141", "author_date": "2017-12-08T16:06:24Z", "committer_date": "2017-12-08T16:06:24Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "61e3c5a1e904a6e1cbee86ba1494b5cb4b5820cf", "message": "Removed rogue print statement, refs #141", "author_date": "2017-12-08T16:08:00Z", "committer_date": "2017-12-08T16:08:00Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "446f4b832272b2286f6f65af19714eb64afb7aa6", "message": "Upgrade to Sanic 0.7.0 (#168)\n\nhttps://github.com/channelcat/sanic/releases/tag/0.7.0", "author_date": "2017-12-09T03:00:33Z", "committer_date": "2017-12-09T03:00:33Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "cd792325681cbad9f663f2879d8b69f1edbb678f", "label": "GitHub"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 19864447, "label": "web-flow"}} {"sha": "16dfccb1c569359fa2a03639ada233e7661156af", "message": "Include sha1 hash in /static/app.css URL\n\nThis means that when Datasette's CSS changes the new CSS will be loaded\neven though browsers may have cached the previous version.\n\nCloses #154", "author_date": "2017-12-09T03:10:09Z", "committer_date": "2017-12-09T03:10:09Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "2cc14a236c601ee2a6b81d8580e70989574baec9", "message": "Ditched short form options for --static and --template-dir\n\nThe -t clashes with the package --tag option", "author_date": "2017-12-09T03:47:50Z", "committer_date": "2017-12-09T03:47:50Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "cd792325681cbad9f663f2879d8b69f1edbb678f", "label": "GitHub"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 19864447, "label": "web-flow"}} {"sha": "c195ee4d46f2577b1943836a8270d84c8341d138", "message": "package and publish commands now accept --static and --template-dir\n\nExample usage:\n\n datasette package --static css:extra-css/ --static js:extra-js/ \\\n \tsf-trees.db --template-dir templates/ --tag sf-trees --branch master\n\nThis creates a local Docker image that includes copies of the templates/,\nextra-css/ and extra-js/ directories. You can then run it like this:\n\n\tdocker run -p 8001:8001 sf-trees\n\nFor publishing to Zeit now:\n\n\tdatasette publish now --static css:extra-css/ --static js:extra-js/ \\\n\t\tsf-trees.db --template-dir templates/ --name sf-trees --branch master\n\nExample: https://sf-trees-wbihszoazc.now.sh/sf-trees-02c8ef1/Street_Tree_List\n\nFor publishing to Heroku:\n\n\tdatasette publish heroku --static css:extra-css/ --static js:extra-js/ \\\n\t\tsf-trees.db --template-dir templates/ --branch master\n\nCloses #157, #160", "author_date": "2017-12-09T18:19:39Z", "committer_date": "2017-12-09T18:28:49Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "3459ab91665d956ff6a25f8e94dcb9c325dd10e5", "message": "Formatting fixes", "author_date": "2017-12-09T18:33:14Z", "committer_date": "2017-12-09T18:33:14Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "cd792325681cbad9f663f2879d8b69f1edbb678f", "label": "GitHub"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 19864447, "label": "web-flow"}} {"sha": "1c0d93c39b194103e729aed2496d2d24f5ad4850", "message": "Fix Python 3.5 test failure", "author_date": "2017-12-09T18:39:16Z", "committer_date": "2017-12-09T18:39:19Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "b01304d7070df5a02870ebd204ea093f3742029e", "message": "Updated tests I broke in c195ee4", "author_date": "2017-12-09T18:38:04Z", "committer_date": "2017-12-09T18:39:19Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "06645f2e267b16d0c193bb1d1b7ca0cb67227c43", "message": "Formatting tweak", "author_date": "2017-12-09T18:41:20Z", "committer_date": "2017-12-09T18:41:20Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "cd792325681cbad9f663f2879d8b69f1edbb678f", "label": "GitHub"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 19864447, "label": "web-flow"}} {"sha": "6bdfcf60760c27e29ff34692d06e62b36aeecc56", "message": "Added Heroku to README, updated --help output examples\n\nRefs #157", "author_date": "2017-12-09T18:50:08Z", "committer_date": "2017-12-09T18:50:08Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "cd792325681cbad9f663f2879d8b69f1edbb678f", "label": "GitHub"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 19864447, "label": "web-flow"}} {"sha": "3c9f889715249d7b0b3bc014529073066a1d478d", "message": "Custom templates for canned queries\n\nCloses #170", "author_date": "2017-12-09T21:34:46Z", "committer_date": "2017-12-09T21:34:46Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "7126d08f10d637c9f1af346324f6f7c0fece8be4", "message": "HTML comment showing which templates were considered for a page\n\nCloses #171", "author_date": "2017-12-09T21:47:32Z", "committer_date": "2017-12-09T21:47:32Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "3f2fed109395179de4145ca1a2675360f1717225", "message": "Fixed bug with HTML labels\n\nloop.counter is incorrect - loop.index outputs the correct loop value.", "author_date": "2017-12-09T21:57:36Z", "committer_date": "2017-12-09T21:57:36Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "7a7e4b2ed8c76c6d002a9d707dbc840f6a2abf7f", "message": "Started unit tests for row/table HTML pages\n\nRefs #167\n\nThanks to the new tests, spotted and fixed a bug where pages that were\nsupposed to have 100 things on them were actually displaying 101.", "author_date": "2017-12-09T23:32:54Z", "committer_date": "2017-12-09T23:32:54Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "794c3bfcfc03087bbebffb7b228e81aaa8b72183", "message": "Cleaned up row/column display logic, fixed bug\n\nCloses #167", "author_date": "2017-12-10T00:59:25Z", "committer_date": "2017-12-10T00:59:25Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "7db790fbf999d83275a5bde4563d935a58a3d787", "message": "Release notes for 0.14\n\nAlso updated \"datasette serve\" help in getting started docs.", "author_date": "2017-12-10T01:24:57Z", "committer_date": "2017-12-10T01:26:32Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "ae940068096ad9ff2f27f4e1784c87788d53eb3d", "message": "No longer include database hash in hyperlinks\n\nIt was making the unit tests unreliable. Also we do not do that for foreign key links.", "author_date": "2017-12-10T01:31:08Z", "committer_date": "2017-12-10T01:31:08Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "2edc652df6d786e4f2c3f073e3567002d248be09", "message": "Releasing v0.14", "author_date": "2017-12-10T01:33:24Z", "committer_date": "2017-12-10T01:33:24Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "68a34bc222af586c75daa5166c937f3f26cfefac", "message": "Deploy to Heroku with Python 3.6.3\n\nHeroku deploys are currently showing the following warning:\n\n The latest version of Python 3 is python-3.6.3 (you are using python-3.6.2, which is unsupported).\n We recommend upgrading by specifying the latest version (python-3.6.3).", "author_date": "2017-12-10T02:01:17Z", "committer_date": "2017-12-10T02:01:17Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "702829f808994d49f11612b35035cfa6842cd91b", "message": "Added Datasette 0.14: customization edition to news", "author_date": "2017-12-10T02:10:30Z", "committer_date": "2017-12-10T02:10:30Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "cd792325681cbad9f663f2879d8b69f1edbb678f", "label": "GitHub"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 19864447, "label": "web-flow"}} {"sha": "4f08fc092f59b434c11f77b6fb2d29b3255227e5", "message": "Updated news", "author_date": "2017-12-12T16:52:19Z", "committer_date": "2017-12-12T16:52:19Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "cd792325681cbad9f663f2879d8b69f1edbb678f", "label": "GitHub"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 19864447, "label": "web-flow"}} {"sha": "1aad396c9ef46837b224607086c09f48ac921165", "message": "Fixed bug with .json path regular expression\n\nI had a table called \"geojson\" and it caused an exception because the regex\nwas matching .json and not \\.json", "author_date": "2017-12-13T05:32:43Z", "committer_date": "2017-12-13T05:36:03Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "306e1c6ac4f00cc25d676a6ee660938f5b27427c", "message": "Broke up test_app into test_api and test_html", "author_date": "2017-12-15T12:04:17Z", "committer_date": "2017-12-15T12:08:24Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "e63f432fe521eb8e196049f86742dc9e20f4dc35", "message": "Mention Heroku in docs index page", "author_date": "2018-01-10T04:46:34Z", "committer_date": "2018-01-10T04:46:34Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "cac32b0ec4081c00bb6eb9122d61dccfae729199", "message": "Initial documentation for pagination", "author_date": "2018-01-10T04:47:03Z", "committer_date": "2018-01-10T04:47:03Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "3a56a2cd7eea5d477d5d936b01098be5cba0d98e", "message": "Add metadata, if it exists, to heroku temp dir (#178)", "author_date": "2018-01-14T21:05:16Z", "committer_date": "2018-01-14T21:05:16Z", "raw_author": {"value": "38fee63c62808d1ea42ad2bb2db074f9301d2840", "label": "Tony Hirst"}, "raw_committer": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 82988, "label": "psychemedia"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "56623e48da5412b25fb39cc26b9c743b684dd968", "message": "News: Datasette Publish", "author_date": "2018-01-17T15:50:10Z", "committer_date": "2018-01-17T15:50:10Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "cd792325681cbad9f663f2879d8b69f1edbb678f", "label": "GitHub"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 19864447, "label": "web-flow"}} {"sha": "012fc7c5cd3e9160c9a4c19cc964253e97fb054a", "message": "Fix for FTS virtual table counting error", "author_date": "2018-03-21T01:26:04Z", "committer_date": "2018-03-21T01:26:04Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "89d9fbb91bfc0dd9091b34dbf3cf540ab849cc44", "message": "Database/Table views inherit source/license/source_url/license_url metadata\n\nIf you set the source_url/license_url/source/license fields in your root\nmetadata those values will now be inherited all the way down to the database\nand table templates.\n\nThe title/description are NOT inherited.\n\nAlso added unit tests for the HTML generated by the metadata.\n\nRefs #185", "author_date": "2018-03-27T16:18:32Z", "committer_date": "2018-03-27T16:18:32Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "31f63d1672a9214962cd7335a2daeabab7c0000e", "message": "Fixed bug with keyset pagination over compound primary keys\n\nCloses #190", "author_date": "2018-03-30T05:10:09Z", "committer_date": "2018-03-30T05:11:02Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "7365c3f51cedffade3428a677e5baeab2f401138", "message": "Compound primary key _next= now plays well with extra filters\n\nCloses #190", "author_date": "2018-03-30T06:26:22Z", "committer_date": "2018-03-30T06:26:22Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "0e5f51adfeff24a120bbdf0e5ac5669b18124400", "message": "Three more news items", "author_date": "2018-03-30T07:03:45Z", "committer_date": "2018-03-30T07:03:45Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "cd792325681cbad9f663f2879d8b69f1edbb678f", "label": "GitHub"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 19864447, "label": "web-flow"}} {"sha": "8f0d44d6468a96e9b78487c36da20ddc2ae9d937", "message": "escape_sqlite_table_name => escape_sqlite, handles reserved words\n\nIt can be used for column names as well as table names.\n\nReserved word list from https://www.sqlite.org/lang_keywords.html", "author_date": "2018-04-03T13:39:50Z", "committer_date": "2018-04-03T13:40:49Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "dd0566ff8eda7fa2f0d92e51809581fae62cffed", "message": "Utility for writing test database fixtures to a .db file\n\n\tpython tests/fixtures.py /tmp/hello.db\n\nThis is useful for making a SQLite database of the test fixtures for\ninteractive exploration.", "author_date": "2018-04-03T13:46:11Z", "committer_date": "2018-04-03T13:46:11Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "0abd3abacb309a2bd5913a7a2df4e9256585b1bb", "message": "New ?_shape=objects/object/lists param for JSON API (#192)\n\nNew _shape= parameter replacing old .jsono extension\r\n\r\nNow instead of this:\r\n\r\n\t/database/table.jsono\r\n\r\nWe use the _shape parameter like this:\r\n\r\n\t/database/table.json?_shape=objects\r\n\r\nAlso introduced a new _shape called 'object' which looks like this:\r\n\r\n\t/database/table.json?_shape=object\r\n\r\nReturning an object for the rows key:\r\n\r\n\t...\r\n\t\"rows\": {\r\n\t\t\"pk1\": {\r\n\t\t\t...\r\n\t\t},\r\n\t\t\"pk2\": {\r\n\t\t\t...\r\n\t\t}\r\n\t}\r\n\r\nRefs #122", "author_date": "2018-04-03T14:52:54Z", "committer_date": "2018-04-03T14:52:54Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "cd792325681cbad9f663f2879d8b69f1edbb678f", "label": "GitHub"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 19864447, "label": "web-flow"}} {"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": "b2188f044265c95f7e54860e28107c17d2a6ed2e", "message": "Use .custom_sql() for _group_count implementation (refs #150)", "author_date": "2018-04-08T15:42:56Z", "committer_date": "2018-04-08T15:43:45Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "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": "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": "747a801b50487cd4cc20856d44252ac0a6cb346f", "message": "Column headers now link to sort/desc sort - refs #189", "author_date": "2018-04-09T02:08:28Z", "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": "9f2ec39fbc5481b0fa6585ccdd159ba9fd989bcc", "message": "Current sort order now reflected in human filter description\n\nPlus renamed human_description to human_description_en\n\nRefs #189", "author_date": "2018-04-09T01:01:23Z", "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": "a87df963a08054ad7a652f0218e70ddb7f9cc8bd", "message": "Error handling for ?_sort and ?_sort_desc\n\nVerifies that they match an existing column, and only one or the other option\nis provided - refs #189\n\nEses a new DatasetteError exception that closes #193", "author_date": "2018-04-09T04:07:31Z", "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": "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"}} {"sha": "bfb19e3a178ba9b2dab2f90f90a398b54a73d34e", "message": "Correctly escape sort-by columns in SQL (refs #189)", "author_date": "2018-04-09T02:25:14Z", "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": "c1d37fdf2be84fb07155bb1b1f61057444b03300", "message": "Fixed bug with human filter description, refs #189\n\nWe were showing this:\n\n 201 rows where sorted by sortable_with_nulls\n\nWe now show this:\n\n 201 rows sorted by sortable_with_nulls", "author_date": "2018-04-09T05:07:18Z", "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": "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": "a290f28caae61b47e76e825c06984f22fc41a694", "message": "table_rows => table_rows_count, filtered_table_rows => filtered_table_rows_count\n\nRenamed properties. Closes #194", "author_date": "2018-04-09T05:24:24Z", "committer_date": "2018-04-09T05:24:24Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "7706fe0c67aba5cfe905c7906cae9e0c43cd75b2", "message": "Releasing v0.15", "author_date": "2018-04-09T15:48:24Z", "committer_date": "2018-04-09T15:48:24Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "67982b6ecb89485ce26d684f2d038aad4d954d7c", "message": "Added Datasette 0.15 to news", "author_date": "2018-04-09T16:01:03Z", "committer_date": "2018-04-09T16:01:03Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "cd792325681cbad9f663f2879d8b69f1edbb678f", "label": "GitHub"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 19864447, "label": "web-flow"}} {"sha": "57b19f09d1ee24b7369ceca8937ce67df2ca1abc", "message": "Ability to sort using form fields (for mobile portrait mode)\n\nWe now display sort options as a select box plus a descending checkbox, which\nmeans you can apply sort orders even in portrait mode on a mobile phone where\nthe column headers are hidden.\n\nCloses #199", "author_date": "2018-04-10T00:30:44Z", "committer_date": "2018-04-10T00:34:32Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "46b237c29a195025de81dcd920c6893181229dc5", "message": "datasette inspect now finds primary_keys\n\nCloses #195", "author_date": "2018-04-10T00:54:12Z", "committer_date": "2018-04-10T00:54:12Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "bfb4e45a7bcb880758dbc18f66258de26c1d1904", "message": "Datasette Publish in readme", "author_date": "2018-04-11T14:43:28Z", "committer_date": "2018-04-11T14:43:28Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "cd792325681cbad9f663f2879d8b69f1edbb678f", "label": "GitHub"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 19864447, "label": "web-flow"}} {"sha": "cca8bf36fed9f2d0cedcfa2691a95b7965b7573c", "message": "Allow explain select / explain query plan select\n\nCloses #201", "author_date": "2018-04-11T22:39:43Z", "committer_date": "2018-04-12T21:32:47Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "d08a13314081ae2ce0313a17d3c07c1a7f2d94d5", "message": "Hide Spatialite system tables\n\nThey were getting on my nerves.", "author_date": "2018-04-11T21:20:25Z", "committer_date": "2018-04-12T21:34:47Z", "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": "ad6142b67c8f137b001770339510979c5df43d85", "message": "long_description in markdown for the new PyPI", "author_date": "2018-04-13T16:03:09Z", "committer_date": "2018-04-13T16:04:18Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "9f28bbe43dc277a3963a12aaae37b5ee3c277207", "message": "Better mechanism for handling errors; 404s for missing table/database\n\nNew error mechanism closes #193\n\n404s for missing tables/databesse closes #184\n\nMakes pull request #202 unnecessary.", "author_date": "2018-04-13T18:17:22Z", "committer_date": "2018-04-13T18:17:22Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "6e16ed2a632b488a5ca21185c0147b4bca16336b", "message": "Removed pathlib dependency (incompatible with Python 3.5)", "author_date": "2018-04-13T18:22:15Z", "committer_date": "2018-04-13T18:22:15Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "b6539ff04502536bd1fa96e3b1430bdafc456826", "message": "Releasing v0.16", "author_date": "2018-04-13T18:28:55Z", "committer_date": "2018-04-13T18:28:55Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "fb988ace7c7e2bee5ac142a0eab22431d0675a77", "message": "Release 0.17 to fix issues with PyPI\n\nSee https://twitter.com/simonw/status/984862976447414272", "author_date": "2018-04-13T19:04:33Z", "committer_date": "2018-04-13T19:04:40Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "ec6abc81e433c9bac1b9f085111785fc227e9e34", "message": "Initial units support\n\nAdd support for specifying units for a column in metadata.json and\nrendering them on display using\n[pint](https://pint.readthedocs.io/en/latest/).\n\nref #203", "author_date": "2018-04-13T21:17:59Z", "committer_date": "2018-04-14T03:32:53Z", "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": "8bfeb984788c7144088c16c5f9126ca7d6af6e93", "message": "Tidy up units support\n\n* Add units to exported JSON\n* Units key in metadata skeleton\n* Docs", "author_date": "2018-04-14T10:16:09Z", "committer_date": "2018-04-14T10:43:34Z", "raw_author": {"value": "cd9d55c7c0a7cc0ee69155676fd5e9fc6e1b884b", "label": "Russ Garrett"}, "raw_committer": {"value": "cd9d55c7c0a7cc0ee69155676fd5e9fc6e1b884b", "label": "Russ Garrett"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 45057, "label": "russss"}, "committer": {"value": 45057, "label": "russss"}} {"sha": "ab85605c6179b21bb0add59b76c1b376d9d248b2", "message": "Support units in filters", "author_date": "2018-04-14T10:41:27Z", "committer_date": "2018-04-14T10:43:35Z", "raw_author": {"value": "cd9d55c7c0a7cc0ee69155676fd5e9fc6e1b884b", "label": "Russ Garrett"}, "raw_committer": {"value": "cd9d55c7c0a7cc0ee69155676fd5e9fc6e1b884b", "label": "Russ Garrett"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 45057, "label": "russss"}, "committer": {"value": 45057, "label": "russss"}} {"sha": "3c985ec271cce46db8682c2a7466ea1c9a2ed210", "message": "Allow custom units to be registered with Pint", "author_date": "2018-04-14T11:27:06Z", "committer_date": "2018-04-14T11:27:06Z", "raw_author": {"value": "cd9d55c7c0a7cc0ee69155676fd5e9fc6e1b884b", "label": "Russ Garrett"}, "raw_committer": {"value": "cd9d55c7c0a7cc0ee69155676fd5e9fc6e1b884b", "label": "Russ Garrett"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 45057, "label": "russss"}, "committer": {"value": 45057, "label": "russss"}} {"sha": "ed974417ad54f0c0f65b2f1cf54dc12485abb570", "message": "Tests for unit filtering", "author_date": "2018-04-14T14:06:52Z", "committer_date": "2018-04-14T14:06:52Z", "raw_author": {"value": "cd9d55c7c0a7cc0ee69155676fd5e9fc6e1b884b", "label": "Russ Garrett"}, "raw_committer": {"value": "cd9d55c7c0a7cc0ee69155676fd5e9fc6e1b884b", "label": "Russ Garrett"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 45057, "label": "russss"}, "committer": {"value": 45057, "label": "russss"}} {"sha": "7d5f25dfb320af26ec4afcb1a687f7f034e1f044", "message": "Add link to pint custom units page to docs", "author_date": "2018-04-14T14:08:20Z", "committer_date": "2018-04-14T14:08:20Z", "raw_author": {"value": "cd9d55c7c0a7cc0ee69155676fd5e9fc6e1b884b", "label": "Russ Garrett"}, "raw_committer": {"value": "cd9d55c7c0a7cc0ee69155676fd5e9fc6e1b884b", "label": "Russ Garrett"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 45057, "label": "russss"}, "committer": {"value": 45057, "label": "russss"}} {"sha": "1cc5161089e559c8b16049b20f7a5b3a43290c21", "message": "Fix sqlite error when loading rows with no incoming FKs\n\nThis fixes `ERROR: conn=, sql\n= 'select ', params = {'id': '1'}` caused by an invalid query when\nloading incoming FKs.\n\nThe error was ignored due to async but it still got printed to the\nconsole.", "author_date": "2018-04-14T12:06:00Z", "committer_date": "2018-04-14T14:24:24Z", "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": "d72201e883c0612d14dfb8ffdd61aa0fe223d94a", "message": "Added unit test for foreign key links in HTML\n\nNeeded to add a further unit test for #207", "author_date": "2018-04-14T14:55:27Z", "committer_date": "2018-04-14T14:55:27Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "f2b940d6026677f6859d46a4f16fa402745d261d", "message": "Link foreign keys which don't have labels\n\nThis renders unlabeled FKs as simple links. I can't see why this would\ncause any major problems.\n\nAlso includes bonus fixes for two minor issues:\n\n* In foreign key link hrefs the primary key was escaped using HTML\n escaping rather than URL escaping. This broke some non-integer PKs.\n* Print tracebacks to console when handling 500 errors.", "author_date": "2018-04-14T13:17:20Z", "committer_date": "2018-04-14T14:59:59Z", "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": "6b15a53cd3cd40880a5e2d38827d5fac10e4bb5f", "message": "Unit test for unlabelled foreign keys from #207", "author_date": "2018-04-14T15:00:54Z", "committer_date": "2018-04-14T15:00:54Z", "raw_author": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}} {"sha": "dd4491dd8112d70d96d73f8f1d12b58cb42fe1bd", "message": "Update number of expected tables", "author_date": "2018-04-14T15:03:41Z", "committer_date": "2018-04-14T15:16:54Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "13ae486343ea6454a93114c6f558ffea2f2c6874", "label": "Simon Willison"}, "repo": {"value": 107914493, "label": "datasette"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 9599, "label": "simonw"}}