{"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": "0aa28293adedc488eb9107dc52b5e9a124887fbd", "message": "Fix compatibility with SQLite prior to 3.16.0\n\npragma_index_info() and pragma_index_list() were introduced in 3.16.0 but the\nversion of SQLite running in Travis CI is earlier than that, hence the test\nfailures:\n\nhttps://travis-ci.com/simonw/sqlite-utils/jobs/137617744", "author_date": "2018-08-01T15:29:53Z", "committer_date": "2018-08-01T15:29:53Z", "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": "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": "0ac8bbce2e73c0759ec48661a7b740d2c368b2a2", "message": "Default subcommand is now serve\n\nUsing click-default-group: https://github.com/click-contrib/click-default-group\n\nAlso removed requirements.txt in favour of setup.py", "author_date": "2017-11-04T23:53:50Z", "committer_date": "2017-11-04T23:53: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": "0b702f3679a2ffd4e3efb5c34b9fe30221172ccb", "message": "Fixed weird edge-case with foreign key detection\n\nIt turns out it is possible for a SQLite table to define a foreign key\nrelationship to a table that does not actually exist\n\nWe should still be able to handle these databases.", "author_date": "2017-11-17T16:18:26Z", "committer_date": "2017-11-17T16:18: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": "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": "0d3479ba320e5a5d15f029838744c5219a9e2987", "message": "Release notes for 0.13", "author_date": "2017-11-25T03:32:24Z", "committer_date": "2017-11-25T03:32:24Z", "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": "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": "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": "0fa177269767e5e55c863382333fde627d2b7074", "message": "Allow ?sql= argument against database\n\ne.g. /database-234324?sql=select * from table limit 1", "author_date": "2017-10-24T02:48:56Z", "committer_date": "2017-10-24T02:48: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": "12f7e1dc5624d14f644abead18bd90b420b6d97e", "message": "Hashed URLs now have far-future cache expiry\n\nSince the URL now includes a hash of the database, we can return a Cache-\nControl: max-age=31536000 header for every response.\n\nThe exception is our 302 redirects. These we now serve with a Link: header\nthat tells any HTTP/2 server-push aware fronting proxies (such as Cloudfront)\nto push the target of the redirect.\n\nCloses #4", "author_date": "2017-10-24T02:36:44Z", "committer_date": "2017-10-24T02:36: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": "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": "1652a9707e325b387ab9550e78eefd48029be44f", "message": "Apache 2.0 license badge", "author_date": "2018-04-16T23:10:12Z", "committer_date": "2018-04-16T23:10:12Z", "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": "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": "195a5b36349d0d24a6bbb758cebb719b6de303b6", "message": "Heroku --include-vcs-ignore (#407)\n\nMeans `datasette publish heroku` can work under Travis, unlike this failure:\r\n\r\nhttps://travis-ci.org/simonw/fivethirtyeight-datasette/builds/488047550\r\n\r\n```\r\n2.25s$ datasette publish heroku fivethirtyeight.db -m metadata.json -n fivethirtyeight-datasette\r\ntar: unrecognized option '--exclude-vcs-ignores'\r\nTry 'tar --help' or 'tar --usage' for more information.\r\n \u25b8 Command failed: tar cz -C /tmp/tmpuaxm7i8f --exclude-vcs-ignores --exclude\r\n \u25b8 .git --exclude .gitmodules . >\r\n \u25b8 /tmp/f49440e0-1bf3-4d3f-9eb0-fbc2967d1fd4.tar.gz\r\n \u25b8 tar: unrecognized option '--exclude-vcs-ignores'\r\n \u25b8 Try 'tar --help' or 'tar --usage' for more information.\r\n \u25b8 \r\nThe command \"datasette publish heroku fivethirtyeight.db -m metadata.json -n fivethirtyeight-datasette\" exited with 0.\r\n```\r\n\r\nThe fix for that issue is to call the heroku command like this:\r\n\r\n heroku builds:create -a app_name --include-vcs-ignore", "author_date": "2019-02-06T04:15:46Z", "committer_date": "2019-02-06T04:15:46Z", "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": "19e1057ead0c4434f456bafb4812de2812d51bf5", "message": "Documentation for create_view()", "author_date": "2018-08-02T15:26:38Z", "committer_date": "2018-08-02T15:26:38Z", "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": "1a6cfcc10f9abcc743b45437996c7264cc2a57b2", "message": "Added a .dockerignore\n\nFigured this would be useful while testing out 03572ae3557", "author_date": "2017-11-17T14:18:23Z", "committer_date": "2017-11-17T14:18: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": "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": "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": "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": "1c5977961f596dae5aaa18c8b2d7a10e9f42a543", "message": "Added glob and like lookups - refs #23", "author_date": "2017-10-25T01:53:01Z", "committer_date": "2017-10-25T01:53:01Z", "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": "1e698787a4dd6df0432021a6814c446c8b69bba2", "message": "Added --sql_time_limit_ms and --extra-options\n\nThe serve command now accepts --sql_time_limit_ms for customizing the SQL time\nlimit.\n\nThe publish and package commands now accept --extra-options which can be used\nto specify additional options to be passed to the datasite serve command when\nit executes inside the rusulting Docker containers.", "author_date": "2017-11-13T21:58:34Z", "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": "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": "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": "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": "21c9c04310dffcdb8cf6fee0f74fc9e7ac1ecf19", "message": "Implemented cursor-based pagination for table view\n\nCloses #5", "author_date": "2017-11-10T20:41:14Z", "committer_date": "2017-11-10T20:41:14Z", "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": "228bce83a37b4bee633f674b802aee13fe5b2f44", "message": "Added __version__, bumped it to 0.12\n\nCloses #108", "author_date": "2017-11-16T15:20:54Z", "committer_date": "2017-11-16T15:20: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": "2366a016f252f2220eb777938a9da4b0de179063", "message": "Added links to .json and .jsono representations\n\nCloses #62", "author_date": "2017-11-11T22:40:44Z", "committer_date": "2017-11-11T22:40: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": "23a45758185c99b6c3b8cf07d687aa5281282196", "message": "Added News section to Readme", "author_date": "2017-11-25T21:40:43Z", "committer_date": "2017-11-25T21:40:43Z", "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": "255e2611e5c3cfdda76c9da7abdbe5af976044ac", "message": "CORS headers for JSON responses\n\nAccess-Control-Allow-Origin: *", "author_date": "2017-10-24T02:48:06Z", "committer_date": "2017-10-24T02:48:06Z", "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": "26370b14d862a5d2dc32b858bdf627f2a5ec3209", "message": "Handle table names with slashes in them\n\ne.g. https://datasette-wdlexdiaoz.now.sh/fivethirtyeight-75d605c/bob-ross%2Felements-by-episode.csv?CABIN=1&BUSHES=1&CLOUDS=1", "author_date": "2017-11-12T23:17:00Z", "committer_date": "2017-11-12T23:17: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": "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": "292f140a4f391f646ec0be85ec9f22dde30f9de2", "message": "Explicitly order by pk (or by rowid)\n\nRefs #5", "author_date": "2017-11-09T16:11:14Z", "committer_date": "2017-11-09T16:11:14Z", "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": "2a09d3708777116daedc548078a662086552523f", "message": "Allow views to be browsed as well as tables", "author_date": "2017-10-24T23:55:08Z", "committer_date": "2017-10-24T23:55:08Z", "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": "2a9799bae651558a23ae5074edad7cc13ff0fbdc", "message": "Implemented database summary on index page\n\nCloses #41", "author_date": "2017-10-27T04:05:13Z", "committer_date": "2017-10-27T04:05:17Z", "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": "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": "2c625e31ed018f929223918240603bf2a80e665c", "message": "Fixed bug on Row page with tables containing spaces\n\nWe were attempting to run this SQL:\n\n select * from \"Order%20Details\" where ...\n\nOn this page:\n\n http://0.0.0.0:8877/northwind-40d049b/Order%20Details/10250,41", "author_date": "2017-10-27T07:16:18Z", "committer_date": "2017-10-27T07:16: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": "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": "2f34da0ab2594d917e14fd0dd90ad07872941b8d", "message": "Initial", "author_date": "2018-07-14T03:56:21Z", "committer_date": "2018-07-14T03:56:21Z", "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": "2fe94641b0b2dc291d1fce3dad0fbf96294b3a32", "message": "Don't try to show row counts for views\n\nAlso handle tables/views with spaces in their name in the URL.", "author_date": "2017-10-25T01:33:12Z", "committer_date": "2017-10-25T01:33:12Z", "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": "31b21f5c5e15fc3acab7fabb170c1da71dc3c98c", "message": "Moved all SQLite queries to threads\n\nSQLite operations are blocking, but we're running everything in Sanic, an\nasyncio web framework, so blocking operations are bad - a long-running DB\noperation could hold up the entire server.\n\nInstead, I've moved all SQLite operations into threads. These are managed by a\nconcurrent.futures ThreadPoolExecutor. This means I can run up to X queries in\nparallel, and I can continue to queue up additional incoming HTTP traffic\nwhile the threadpool is busy.\n\nEach thread is responsible for managing its own SQLite connections - one per\ndatabase. These are cached in a threadlocal.\n\nSince we are working with immutable, read-only SQLite databases it should be\nsafe to share SQLite objects across threads. On this assumption I'm using the\ncheck_same_thread=False option. Opening a database connection looks like this:\n\n conn = sqlite3.connect(\n 'file:filename.db?immutable=1',\n uri=True,\n check_same_thread=False,\n )\n\nThe following articles were helpful in figuring this out:\n\n* https://pymotw.com/3/asyncio/executors.html\n* https://marlinux.wordpress.com/2017/05/19/python-3-6-asyncio-sqlalchemy/\n\nCloses #45. Refs #38.", "author_date": "2017-11-05T02:21:44Z", "committer_date": "2017-11-05T02:21: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": "3280972c891633c6015fa55bbfd094420b4f0233", "message": "Fixed tests I broke earlier\n\nBroke these tests in 21c9c04310dffcdb8cf6fee0f74fc9e7ac1ecf19", "author_date": "2017-11-11T16:52:17Z", "committer_date": "2017-11-11T16:52:17Z", "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": "33c7c53ff87c25445c68088ede49d062d9c31fe8", "message": "Start of the plugin system, based on pluggy (#210)\n\nUses https://pluggy.readthedocs.io/ originally created for the py.test project\r\n\r\nWe're starting with two plugin hooks:\r\n\r\nprepare_connection(conn)\r\n\r\nThis is called when a new SQLite connection is created. It can be used to register custom SQL functions.\r\n\r\nprepare_jinja2_environment(env)\r\n\r\nThis is called with the Jinja2 environment. It can be used to register custom template tags and filters.\r\n\r\nAn example plugin which uses these two hooks can be found at https://github.com/simonw/datasette-plugin-demos or installed using `pip install datasette-plugin-demos`\r\n\r\nRefs #14", "author_date": "2018-04-16T00:56:15Z", "committer_date": "2018-04-16T00:56:15Z", "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": "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": "34a5c0e1e8d1e7e685b0ba73803d153552033aac", "message": "Documented insert_all() and upsert() and upsert_all()\n\nAlso re-titled main docs page to 'Python API'", "author_date": "2018-08-13T00:17:14Z", "committer_date": "2018-08-13T00:17:14Z", "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": "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": "3a944d0c077c203277f13dd69387eb84b5c88d3e", "message": "Run Travis tests against Python 3.8-dev (#5)", "author_date": "2019-01-26T02:37:54Z", "committer_date": "2019-01-26T02:37:54Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "cd792325681cbad9f663f2879d8b69f1edbb678f", "label": "GitHub"}, "repo": {"value": 140912432, "label": "sqlite-utils"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 19864447, "label": "web-flow"}} {"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": "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": "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": "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": "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": "407795b61217205625f2d4e084afbf69f1db781b", "message": "Initial unit tests against our Sanic app\n\nRefs #50\n\nI had to disable the build metadata function to get these tests to work\nsensibly. I need to completely rethink how that mechanism works.", "author_date": "2017-11-11T17:47:59Z", "committer_date": "2017-11-11T17:47: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": "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": "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": "4143e3b45c16cbae5e3e3419ef479a71810e7df3", "message": "New command: datasette package - packages a docker container\n\nExample usage:\n\n datasette package fivethirtyeight.db \\\n --tag fivethirtyeight \\\n --metadata=538-metadata.json\n\nThis will create a temporary directory, generate a Dockerfile, copy in the\nSQLite database and metadata file, then build that as a new docker image and\ntag that in your local Docker repository as fivethirtyeight:latest.\n\nYou can then run the image like so:\n\n docker run -p 8006:8001 fivethirtyeight\n\nThis will expose port 8001 in the container (the default) as port 8006 on your\nhost.\n\nCloses #67", "author_date": "2017-11-13T16:13:38Z", "committer_date": "2017-11-13T16:17: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": "42b2b4b785e3163371e92a9cc085bc47e7c83107", "message": "Upgrade sqlite3 in Travis so we can test against FTS5\n\nUsing recipe from https://linuxhint.com/install-sqlite-ubuntu-linux-mint/", "author_date": "2019-01-25T06:54:32Z", "committer_date": "2019-01-25T06:54:32Z", "raw_author": {"value": "2946d096d0cdefdc017559e6b57e87658736e843", "label": "Simon Willison"}, "raw_committer": {"value": "cd792325681cbad9f663f2879d8b69f1edbb678f", "label": "GitHub"}, "repo": {"value": 140912432, "label": "sqlite-utils"}, "author": {"value": 9599, "label": "simonw"}, "committer": {"value": 19864447, "label": "web-flow"}} {"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": "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": "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": "452c5f047ea229dbb444e271183a55381bb4abce", "message": "Added Travis CI badge to README\n\nCloses #77", "author_date": "2017-11-13T21:24:14Z", "committer_date": "2017-11-13T21:24: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": "45e502aace6cc1198cc5f9a04d61b4a1860a012b", "message": "Added unit tests for inspect() foreign key detection\n\nUsed them to fix a bug with it.\n\nRefs #85", "author_date": "2017-11-17T16:08:11Z", "committer_date": "2017-11-17T16:08:11Z", "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": "47e689a89b3f5f0969595b17d2ec59ea3caffb3b", "message": "Speed up Travis by reusing pip wheel cache across builds (#324)\n\n* Cache pip wheels between runs in Travis, refs #323\r\n* Run pytest manually - \"python setup.py test\" appeared to still download a bunch of stuff: https://travis-ci.org/simonw/datasette/jobs/395306188\r\n\r\n* Use extras_require so pip can install test dependencies: https://github.com/pypa/pip/issues/1197#issuecomment-228939212", "author_date": "2018-06-24T01:03:46Z", "committer_date": "2018-06-24T01:03:46Z", "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": "495407acefe1e6976316aef88ae0e4c1d48ab421", "message": "Force initial .inspect() before starting server\n\nOtherwise there is a long pause on the first request made.", "author_date": "2017-11-13T18:03:52Z", "committer_date": "2017-11-13T18:03: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": "4ac913224061f2dc4f673efab1a5ac6bc748854f", "message": "render_cell(value) plugin hook, closes #352\n\nNew plugin hook for customizing the way cells values are rendered in HTML.\r\n\r\nThe first full example of this hook in use is https://github.com/simonw/datasette-json-html", "author_date": "2018-08-05T00:14:56Z", "committer_date": "2018-08-05T00:14: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": "4be6deb94776744071311777f0b18efb993c0cfa", "message": "Fix for plugins in Python 3.5 (#222)\n\nModuleNotFoundError is not a thing in Python 3.5, so catch KeyError/ImportError instead.", "author_date": "2018-04-18T03:24:20Z", "committer_date": "2018-04-18T03:24: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": "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": "4c7379a898df426af0c31159e5cb06d672189301", "message": "Don't crash on weird character encodings\n\nExpecting SQLite columns to all be valid utf8 doesn't work, because we are\ndeailing with all kinds of databases. Instead, we now use the 'replace'\nencoding mode to replace any non-UTF8 characters with a [X] character.", "author_date": "2017-10-25T00:01:34Z", "committer_date": "2017-10-25T00:01: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": "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": "4f7281af8ce421d2f8c57ba43108261ba89d2cd6", "message": "Apply a default height to CodeMirror\n\nMakes it a bit more obvious that it's an editable textarea even\nif the SQL in it is only one line long.", "author_date": "2017-11-15T02:04:04Z", "committer_date": "2017-11-15T02:04:04Z", "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": "4fec50597a8684756bc96d4a69b6fab809ec6cf6", "message": "Include license/source in JSON output if provided", "author_date": "2017-11-13T18:39:25Z", "committer_date": "2017-11-13T18:39: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": "501618d0d519f808e54210f3c54420e5559a9343", "message": "Ensure black is correctly installed for tests", "author_date": "2018-07-28T14:36:43Z", "committer_date": "2018-07-28T14:36: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": "50e817801f90d07468ea394ef562d55d8940d124", "message": "Fixed #83\n\nTurns out we had a redirect bug as well.", "author_date": "2017-11-14T00:44:08Z", "committer_date": "2017-11-14T00:44: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": "515d362ad60c3dc16272c4fdca932cf0a0e9dafa", "message": ".table_names and .tables properties plus expanded docs", "author_date": "2018-08-01T00:35:36Z", "committer_date": "2018-08-01T00:35:36Z", "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": "51bdd67691bd69082ae7690af8b905f06050ee80", "message": "Changelog for 0.12 release", "author_date": "2017-11-16T15:37:46Z", "committer_date": "2017-11-16T15:37:46Z", "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": "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": "56e29158fe5174a5b06d0a58090da7fb4624ed60", "message": "Don't run black test on Python 3.7\n\nIt breaks on that version - see https://github.com/ambv/black/issues/425\n\nBut that's OK, we only need it to run onder one version anyway.", "author_date": "2018-07-28T18:18:40Z", "committer_date": "2018-07-28T18:18:40Z", "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": "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": "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": "59580d02da80eb963d5bce897c539c6489042025", "message": "Implemented custom SQL via textarea\n\nCloses #65", "author_date": "2017-11-12T02:35:35Z", "committer_date": "2017-11-12T02:35: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": "59a616ca5c99301a254d86ab097b6ce8f7b30fb6", "message": "Move view SQL to bottom of the page\n\nNow consistent with tables", "author_date": "2017-11-12T21:25:34Z", "committer_date": "2017-11-12T21:25: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": "5bfb23b949a7f01e4dfc1d7ac698a6ec8e8c97fd", "message": "Added Read The Docs badge\n\nCloses #109", "author_date": "2017-11-16T16:13:55Z", "committer_date": "2017-11-16T16:13:55Z", "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": "5d8084a28578da2aefa79ad81df9d82e2c265666", "message": "Added a UI for editing named parameters\n\nFixes #96", "author_date": "2017-11-16T01:32:48Z", "committer_date": "2017-11-16T01:32: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": "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": "5f806880c9766daf09fc9535171637ebb8224cab", "message": "Correctly JSON serialize sqlite3.Cursor", "author_date": "2017-10-24T23:53:21Z", "committer_date": "2017-10-24T23:53: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": "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": "630b40038ef31b351abc2e39c3a0c7b3648814f8", "message": "Added support for gt, gte, lt, lte lookups\n\nRefs #23", "author_date": "2017-10-25T01:46:49Z", "committer_date": "2017-10-25T01:46: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": "65e350ca2a4845c25752a62c16ba58cfe2c14b9b", "message": "Implemented 'datasette publish one.db two.db' command\n\nCloses #26", "author_date": "2017-11-11T07:25:22Z", "committer_date": "2017-11-11T07:25: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": "666aa032530189d585dd61d0e9851e9fe63ee598", "message": "Improved error handling\n\nInvalid SQL now shows a special error.html template, and is covered by tests.", "author_date": "2017-11-12T21:16:15Z", "committer_date": "2017-11-12T21:16:15Z", "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": "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": "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": "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": "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": "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": "6a9fdcc0718aea2cbc01ae4d60b9a1fba3601a66", "message": "Added addressable page per row\n\nRefs #1 - only exists for tables with introspectable primary keys.\n\nStill need to link to this page.\n\nAlso added first unit tests - refs #9", "author_date": "2017-10-24T05:54:58Z", "committer_date": "2017-10-24T05:54:58Z", "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": "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": "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"}}