{"html_url": "https://github.com/simonw/datasette/pull/2190#issuecomment-1759947021", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2190", "id": 1759947021, "node_id": "IC_kwDOBm6k_c5o5qkN", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-10-12T16:19:38Z", "updated_at": "2023-10-12T16:19:38Z", "author_association": "OWNER", "body": "\r\n\r\nThis looks good and works well. The error from this currently looks like:\r\n\r\n```\r\ndatasette -m metadata.json -p 8844\r\nTraceback (most recent call last):\r\n File \"/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/bin/datasette\", line 33, in \r\n sys.exit(load_entry_point('datasette', 'console_scripts', 'datasette')())\r\n File \"/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/click/core.py\", line 1130, in __call__\r\n return self.main(*args, **kwargs)\r\n File \"/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/click/core.py\", line 1055, in main\r\n rv = self.invoke(ctx)\r\n File \"/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/click/core.py\", line 1657, in invoke\r\n return _process_result(sub_ctx.command.invoke(sub_ctx))\r\n File \"/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/click/core.py\", line 1404, in invoke\r\n return ctx.invoke(self.callback, **ctx.params)\r\n File \"/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/click/core.py\", line 760, in invoke\r\n return __callback(*args, **kwargs)\r\n File \"/Users/simon/Dropbox/Development/datasette/datasette/cli.py\", line 98, in wrapped\r\n return fn(*args, **kwargs)\r\n File \"/Users/simon/Dropbox/Development/datasette/datasette/cli.py\", line 546, in serve\r\n metadata_data = fail_if_plugins_in_metadata(parse_metadata(metadata.read()))\r\n File \"/Users/simon/Dropbox/Development/datasette/datasette/utils/__init__.py\", line 1282, in fail_if_plugins_in_metadata\r\n raise Exception(\r\nException: Datasette no longer accepts plugin configuration in --metadata. Move your \"plugins\" configuration blocks to a separate file - we suggest calling that datasette..json - and start Datasette with datasette -c datasette..json. See https://docs.datasette.io/en/latest/configuration.html for more details.\r\n```\r\nWith wrapping:\r\n\r\n`Exception: Datasette no longer accepts plugin configuration in --metadata. Move your \"plugins\" configuration blocks to a separate file - we suggest calling that datasette..json - and start Datasette with datasette -c datasette..json. See https://docs.datasette.io/en/latest/configuration.html for more details.`\r\n\r\nI think we should link directly to documentation that tells people how to perform this upgrade.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1901483874, "label": "Raise an exception if a \"plugins\" block exists in metadata.json"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/170#issuecomment-697047591", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/170", "id": 697047591, "node_id": "MDEyOklzc3VlQ29tbWVudDY5NzA0NzU5MQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-09-23T00:14:52Z", "updated_at": "2020-09-23T00:14:52Z", "author_association": "OWNER", "body": "\r\n@simonw\r\n@db.register_function decorator, closes #162\r\n4824775\r\n@simonw\r\ntable.transform() method - closes #114\r\n987dd12\r\n@simonw\r\nKeyword only arguments for transform()\r\nf8e10df\r\n\r\nAlso renamed columns= to types=\r\n\r\nCloses #165\r\n\r\nCommits on Sep 22, 2020\r\n@simonw\r\nImplemented sqlite-utils transform command, closes #164\r\n752d261\r\n@simonw\r\nApplied Black\r\nf29f682\r\n@simonw\r\ntable.extract() method, refs #42\r\nf855379\r\n@simonw\r\nDocstring for sqlite-utils transform\r\nc755f28\r\n@simonw\r\nAdded table.extract(rename=) option, refs #42\r\nc3210f2\r\n@simonw\r\nApplied Black\r\n317071a\r\n@simonw\r\nNew .rows_where(select=) argument\r\n7178231\r\n@simonw\r\ntable.extract() now works with rowid tables, refs #42\r\n2db6c5b\r\n@simonw\r\nsqlite-utils extract, closes #42\r\n55cf928\r\n@simonw\r\nProgress bar for \"sqlite-utils extract\", closes #169\r\n5c4d58d\r\n@simonw\r\nFixed PRAGMA foreign_keys handling for .transform, closes #167 ", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 706768798, "label": "Release notes for 2.20"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2054#issuecomment-1499457291", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2054", "id": 1499457291, "node_id": "IC_kwDOBm6k_c5ZX-cL", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-04-06T18:26:45Z", "updated_at": "2023-04-06T18:26:45Z", "author_association": "OWNER", "body": "\r\nHere's `BaseView`:\r\n\r\nhttps://github.com/simonw/datasette/blob/8b9d7fdbd8de7e74414cc29e3005382669a812dc/datasette/views/base.py#L56-L145\r\n\r\nIt has methods for the `options`, `get`, `post`, `delete`, `put`, `patch` and `head` HTTP verbs, most defaulting to returinng a 405 Method not allowed message in plain text or JSON, depending on this check:\r\n\r\nhttps://github.com/simonw/datasette/blob/8b9d7fdbd8de7e74414cc29e3005382669a812dc/datasette/views/base.py#L71-L81\r\n\r\nAlso adds CORS headers to anything if CORS mode is on:\r\n\r\nhttps://github.com/simonw/datasette/blob/8b9d7fdbd8de7e74414cc29e3005382669a812dc/datasette/views/base.py#L106-L107\r\n\r\nAnd adds the `database_color` (weirdly) and the `select_templates` variables to the template context:\r\n\r\nhttps://github.com/simonw/datasette/blob/8b9d7fdbd8de7e74414cc29e3005382669a812dc/datasette/views/base.py#L112-L122\r\n\r\nAnd has special code for setting the `Link: ...; rel=\"alternate\"` HTTP header:\r\n\r\nhttps://github.com/simonw/datasette/blob/8b9d7fdbd8de7e74414cc29e3005382669a812dc/datasette/views/base.py#L124-L136", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1657861026, "label": "Make detailed notes on how table, query and row views work right now"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1205#issuecomment-769453074", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1205", "id": 769453074, "node_id": "MDEyOklzc3VlQ29tbWVudDc2OTQ1MzA3NA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-01-28T22:54:49Z", "updated_at": "2021-01-28T22:55:02Z", "author_association": "OWNER", "body": "\r\nI also checked that the following works:\r\n\r\n echo '{\"foo\": \"bar\"}' | sqlite-utils insert _memory.db demo -\r\n datasette _memory.db --memory\r\n\r\nSure enough, it results in the following Datasette homepage - thanks to #509\r\n\r\n\"Datasette___memory___memory_2\"", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 793027837, "label": "Rename /:memory: to /_memory"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/47#issuecomment-343690060", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/47", "id": 343690060, "node_id": "MDEyOklzc3VlQ29tbWVudDM0MzY5MDA2MA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2017-11-11T19:56:08Z", "updated_at": "2017-11-11T19:56:08Z", "author_association": "OWNER", "body": " \"parlgov-development.db\": {\r\n \"url\": \"http://www.parlgov.org/\"\r\n },\r\n \"nhsadmin.sqlite\": {\r\n \"url\": \"https://github.com/psychemedia/openHealthDataDoodles\"\r\n }", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 271831408, "label": "Create neat example database"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/543#issuecomment-508955449", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/543", "id": 508955449, "node_id": "MDEyOklzc3VlQ29tbWVudDUwODk1NTQ0OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2019-07-06T21:41:28Z", "updated_at": "2019-07-06T21:41:50Z", "author_association": "OWNER", "body": " $ datasette publish now fixtures.db \\\r\n --branch=master \\\r\n --alias datasette-auth-demo \\\r\n --install=datasette-auth-github \\\r\n --plugin-secret datasette-auth-github client_id 86e397f7fd7a54d26a3a \\\r\n --plugin-secret datasette-auth-github client_secret ...\r\n\r\nhttps://datasette-auth-demo.now.sh/", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 464868844, "label": "datasette publish option for setting plugin configuration secrets"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/804#issuecomment-641538799", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/804", "id": 641538799, "node_id": "MDEyOklzc3VlQ29tbWVudDY0MTUzODc5OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-09T20:01:08Z", "updated_at": "2020-06-09T20:01:08Z", "author_association": "OWNER", "body": " $ python tests/fixtures.py fixtures.db fixtures-metadata.json fixtures-plugins\r\n Test tables written to fixtures.db\r\n - metadata written to fixtures-metadata.json\r\n Wrote plugin: fixtures-plugins/register_output_renderer.py\r\n Wrote plugin: fixtures-plugins/view_name.py\r\n Wrote plugin: fixtures-plugins/my_plugin.py\r\n Wrote plugin: fixtures-plugins/messages_output_renderer.py\r\n Wrote plugin: fixtures-plugins/my_plugin_2.py", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 632673972, "label": "python tests/fixtures.py command has a bug"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/23#issuecomment-338854988", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/23", "id": 338854988, "node_id": "MDEyOklzc3VlQ29tbWVudDMzODg1NDk4OA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2017-10-24T02:40:12Z", "updated_at": "2017-10-25T00:05:46Z", "author_association": "OWNER", "body": " /database-name/table-name?name__contains=simon&sort=id+desc\r\n\r\nNote that if there's a column called \"sort\" you can still do sort__exact=blah\r\n\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 267788884, "label": "Support Django-style filters in querystring arguments"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/511#issuecomment-877835171", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/511", "id": 877835171, "node_id": "MDEyOklzc3VlQ29tbWVudDg3NzgzNTE3MQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-07-11T17:23:05Z", "updated_at": "2021-07-11T17:23:05Z", "author_association": "OWNER", "body": " == 87 failed, 819 passed, 7 skipped, 29 errors in 2584.85s (0:43:04) ==\r\n\r\nhttps://github.com/simonw/datasette/runs/3038188870?check_suite_focus=true\r\n\r\nFull copy of log here: https://gist.github.com/simonw/4b1fdd24496b989fca56bc757be345ad", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 456578474, "label": "Get Datasette tests passing on Windows in GitHub Actions"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/170#issuecomment-350507155", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/170", "id": 350507155, "node_id": "MDEyOklzc3VlQ29tbWVudDM1MDUwNzE1NQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2017-12-09T21:35:30Z", "updated_at": "2017-12-09T21:35:30Z", "author_association": "OWNER", "body": " Canned query page (/mydatabase/canned-query):\r\n query-mydatabase-canned-query.html\r\n query-mydatabase.html\r\n query.html", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 280745470, "label": "Custom template for named canned query"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/375#issuecomment-1008338186", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/375", "id": 1008338186, "node_id": "IC_kwDOCGYnMM48GgUK", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-01-09T17:13:33Z", "updated_at": "2022-01-09T17:13:54Z", "author_association": "OWNER", "body": " cat blah.csv | sqlite-utils bulk blah.db - \\\r\n \"insert into blah (:foo, :bar)\" --csv\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1097251014, "label": "`sqlite-utils bulk` command"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/25#issuecomment-343715915", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/25", "id": 343715915, "node_id": "MDEyOklzc3VlQ29tbWVudDM0MzcxNTkxNQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2017-11-12T06:08:28Z", "updated_at": "2017-11-12T06:08:28Z", "author_association": "OWNER", "body": " con = sqlite3.connect('existing_db.db')\r\n with open('dump.sql', 'w') as f:\r\n for line in con.iterdump():\r\n f.write('%s\\n' % line)\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 267857622, "label": "Endpoint that returns SQL ready to be piped into DB"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/809#issuecomment-642754589", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/809", "id": 642754589, "node_id": "MDEyOklzc3VlQ29tbWVudDY0Mjc1NDU4OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-11T15:45:25Z", "updated_at": "2020-06-11T15:45:25Z", "author_association": "OWNER", "body": " datasette publish cloudrun fixtures.db --service datasette-publish-secret --branch=master\r\n\r\nhttps://datasette-publish-secret-j7hipcg4aq-uw.a.run.app/-/messages", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 632919570, "label": "Publish secrets"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/809#issuecomment-642750790", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/809", "id": 642750790, "node_id": "MDEyOklzc3VlQ29tbWVudDY0Mjc1MDc5MA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-11T15:42:23Z", "updated_at": "2020-06-11T15:42:23Z", "author_association": "OWNER", "body": " datasette publish heroku fixtures.db -n datasette-publish-secret --branch=master\r\n\r\nhttps://datasette-publish-secret.herokuapp.com/-/messages - Heroku works.\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 632919570, "label": "Publish secrets"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1999#issuecomment-1461074526", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1999", "id": 1461074526, "node_id": "IC_kwDOBm6k_c5XFjpe", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-03-09T00:23:06Z", "updated_at": "2023-03-09T00:23:06Z", "author_association": "OWNER", "body": " pytest tests/test_table_html.py\r\n\r\nCurrently 44 failed, 24 passed in 7.53s\r\n\r\nFailures here: https://gist.github.com/simonw/df0a52cd7d820b776dc3dfc50e7cb778", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1551694938, "label": "?_extra= support (draft)"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/859#issuecomment-647890619", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/859", "id": 647890619, "node_id": "MDEyOklzc3VlQ29tbWVudDY0Nzg5MDYxOQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-23T03:48:21Z", "updated_at": "2020-06-23T03:48:21Z", "author_association": "OWNER", "body": " sqlite-generate many-cols.db --tables 2 --rows 200000 --columns 50\r\n\r\nLooks like that will take 35 minutes to run (it's not a particularly fast tool).\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 642572841, "label": "Database page loads too slowly with many large tables (due to table counts)"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1390#issuecomment-877308310", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1390", "id": 877308310, "node_id": "MDEyOklzc3VlQ29tbWVudDg3NzMwODMxMA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-07-09T16:29:48Z", "updated_at": "2021-07-09T16:29:48Z", "author_association": "OWNER", "body": " sudo systemctl restart datasette.service", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 940891698, "label": "Mention restarting systemd in documentation"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/4#issuecomment-338530480", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/4", "id": 338530480, "node_id": "MDEyOklzc3VlQ29tbWVudDMzODUzMDQ4MA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2017-10-23T02:16:33Z", "updated_at": "2017-10-23T02:16:33Z", "author_association": "OWNER", "body": " How about when the service starts up it checks for a compile.json file and, if it is missing, creates it using the same code we run at compile time normally ", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 267515836, "label": "Make URLs immutable"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1518#issuecomment-991827468", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1518", "id": 991827468, "node_id": "IC_kwDOBm6k_c47HhYM", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-12-12T03:15:00Z", "updated_at": "2021-12-12T03:15:00Z", "author_association": "OWNER", "body": " I don't think this code is necessary any more: https://github.com/simonw/datasette/blob/492f9835aa7e90540dd0c6324282b109f73df71b/datasette/views/table.py#L396-L399\r\n\r\nThat dates back from when Datasette was built on top of Sanic and Sanic didn't preserve those query parameters the way I needed it to:\r\n\r\nhttps://github.com/simonw/datasette/blob/1f69269fe93e4cd42e56890126cc0dbcf719c6cb/datasette/views/table.py#L202-L206", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1058072543, "label": "Complete refactor of TableView and table.html template"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/20#issuecomment-349027974", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/20", "id": 349027974, "node_id": "MDEyOklzc3VlQ29tbWVudDM0OTAyNzk3NA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2017-12-04T17:01:19Z", "updated_at": "2017-12-04T17:01:19Z", "author_association": "OWNER", "body": " This is also a good opportunity to re-factor out a separate query.html template - right now the database.html template is doing two jobs.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 267759136, "label": "Config file with support for defining canned queries"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/199#issuecomment-379936068", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/199", "id": 379936068, "node_id": "MDEyOklzc3VlQ29tbWVudDM3OTkzNjA2OA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2018-04-10T00:32:37Z", "updated_at": "2018-04-10T00:32:37Z", "author_association": "OWNER", "body": "![2018-04-09 at 5 32 pm](https://user-images.githubusercontent.com/9599/38529802-fd2a7e68-3c1b-11e8-974a-bf5438fec701.png)\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 312620566, "label": "Ability to apply sort on mobile in portrait mode"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/142#issuecomment-392605574", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/142", "id": 392605574, "node_id": "MDEyOklzc3VlQ29tbWVudDM5MjYwNTU3NA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2018-05-28T21:25:05Z", "updated_at": "2018-05-28T21:25:05Z", "author_association": "OWNER", "body": "![2018-05-28 at 2 24 pm](https://user-images.githubusercontent.com/9599/40629887-e991c61c-6282-11e8-9d66-6387f90e87ca.png)\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 275917760, "label": "Show extra instructions with the interrupted"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/506#issuecomment-500220646", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/506", "id": 500220646, "node_id": "MDEyOklzc3VlQ29tbWVudDUwMDIyMDY0Ng==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2019-06-09T15:22:12Z", "updated_at": "2019-06-09T15:22:12Z", "author_association": "OWNER", "body": "![3C9CCDBA-F346-47CB-BFEC-964B0426E728](https://user-images.githubusercontent.com/9599/59160835-789ca900-8a8f-11e9-9767-0f50890d17fe.jpeg)\r\n\r\nNew idea: show essentially this but differentiate the escape sequences in some way. Maybe wrap them in `` or put the non-escape sequences in bold?\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 453846217, "label": "Option to display binary data"}, "performed_via_github_app": null} {"html_url": "https://github.com/dogsheep/twitter-to-sqlite/issues/45#issuecomment-616029262", "issue_url": "https://api.github.com/repos/dogsheep/twitter-to-sqlite/issues/45", "id": 616029262, "node_id": "MDEyOklzc3VlQ29tbWVudDYxNjAyOTI2Mg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-04-19T04:39:21Z", "updated_at": "2020-04-19T04:39:21Z", "author_association": "MEMBER", "body": "![44714E00-8CC5-46CD-9E48-1F4DD148FCC8](https://user-images.githubusercontent.com/9599/79679696-09b6d300-81bd-11ea-80e4-0653d92e4f58.jpeg)\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 602619330, "label": "Use raise_for_status() everywhere"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/729#issuecomment-629050775", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/729", "id": 629050775, "node_id": "MDEyOklzc3VlQ29tbWVudDYyOTA1MDc3NQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-05-15T06:17:12Z", "updated_at": "2020-05-15T06:17:12Z", "author_association": "OWNER", "body": "![4F8D336A-ECEB-4C68-A859-C8A3DA546E9C](https://user-images.githubusercontent.com/9599/82017875-fae70300-9638-11ea-9cc2-3969299ae9a0.jpeg)\r\n\r\nI don't like how the column headers themselves are no longer black in mobile view.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 603295970, "label": "Visually distinguish integer and text columns"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1236#issuecomment-782462049", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1236", "id": 782462049, "node_id": "MDEyOklzc3VlQ29tbWVudDc4MjQ2MjA0OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-02-19T23:51:12Z", "updated_at": "2021-02-19T23:51:12Z", "author_association": "OWNER", "body": "![resize-demo](https://user-images.githubusercontent.com/9599/108573758-4914eb00-72ca-11eb-989c-e642eee68021.gif)\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 812228314, "label": "Ability to increase size of the SQL editor window"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/796#issuecomment-638188196", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/796", "id": 638188196, "node_id": "MDEyOklzc3VlQ29tbWVudDYzODE4ODE5Ng==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-03T13:13:27Z", "updated_at": "2020-06-03T14:32:27Z", "author_association": "OWNER", "body": "\"Query executed\" is the default message, but it's pretty bland:\r\n\r\n\"data__insert_into_names__name__values___name_\"\r\n\r\nHow about letting queries define custom success messages in their metadata configuration?\r\n\r\n`\"on_success_message\"` and `\"on_error_message\"`\r\n\r\nHow can the system tell if an \"update\" query was actually successful? Maybe I should expose `.rowcount` somehow, so I can report back on how many rows were updated.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 629595228, "label": "New WIP writable canned queries"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/86#issuecomment-345497534", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/86", "id": 345497534, "node_id": "MDEyOklzc3VlQ29tbWVudDM0NTQ5NzUzNA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2017-11-19T07:23:33Z", "updated_at": "2017-11-19T07:23:33Z", "author_association": "OWNER", "body": "\"Tablename: 3,567 rows where status = 3 (published) and n > 55\"", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 273703829, "label": "Filter UI on table page"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/196#issuecomment-722082874", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/196", "id": 722082874, "node_id": "MDEyOklzc3VlQ29tbWVudDcyMjA4Mjg3NA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-05T02:19:18Z", "updated_at": "2020-11-05T02:19:18Z", "author_association": "OWNER", "body": "\"any other character larger than u007f.\" Need to figure that out!", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 736520310, "label": "Introspect if table is FTS4 or FTS5"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/242#issuecomment-787175126", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/242", "id": 787175126, "node_id": "MDEyOklzc3VlQ29tbWVudDc4NzE3NTEyNg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-02-27T21:55:05Z", "updated_at": "2021-02-27T21:55:05Z", "author_association": "OWNER", "body": "\"how to use some new tools to more easily maintain a codebase that supports both async and synchronous I/O and multiple async libraries\" - yeah that's exactly what I need, thank you!", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 817989436, "label": "Async support"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1708#issuecomment-1095675839", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1708", "id": 1095675839, "node_id": "IC_kwDOBm6k_c5BTq-_", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-04-11T23:06:30Z", "updated_at": "2022-11-15T19:57:53Z", "author_association": "OWNER", "body": "# Datasette 1.0 alpha 1\r\n\r\nThis alpha release is a preview of Datasette 1.0.\r\n\r\nDatasette 1.0 marks a significant milestone in the project: it is the point from which various aspects of Datasette can be considered \"stable\", in that code developed against them should expect not to be broken by future releases in the 1.x series.\r\n\r\nThis will hold true until the next major version release, Datasette 2.0 - which we hope to hold off releasing for as long as possible.\r\n\r\nThe following Datasette components should be be considered stable after 1.0:\r\n\r\n- The plugin API. Plugins developed against 1.0 should continue to work unmodified throughout the 1.x series.\r\n- The JSON API. Code written that interacts with Datasette's default JSON web API should continue to work.\r\n- The template context. If you build custom templates against Datasette your custom pages should continue to work.\r\n\r\nNote that none of these components will cease to introduce new features. New plugin hooks, new JSON APIs and new template context variables can be introduced without breaking existing code.\r\n\r\nSince this alpha release previews features that will be frozen for 1.0, please test this thoroughly against your existing Datasette projects.\r\n\r\nYou can install the alpha using:\r\n\r\n pip install datasette==1.0a0\r\n\r\n## JSON API changes\r\n\r\nThe most significant changes introduced in this new alpha concern Datasette's JSON API.\r\n\r\nThe default JSON returned by the `/database/table.json` endpoint has changed. It now returns an object with two keys: `rows` - which contains a list of objects representing the rows in the table or query, and `more` containing a `boolean` that shows if there are more rows or if this object contains them all.\r\n\r\n```json\r\n{\r\n \"rows\": [{\r\n \"id\": 1,\r\n \"name\": \"Name 1\"\r\n }, {\r\n \"id\": 2,\r\n \"name\": \"Name 2\"\r\n }],\r\n \"more\": false\r\n}\r\n```\r\n[ Initially I thought about going with `next_url`, which would be `null` if you have reached the last page of records. Maybe that would be better? But since `next_url` cannot be provided on query pages, should this be part of the default format at all? ]\r\n\r\n## Use ?_extra= to retrieve extra fields\r\n\r\nThe default format can be expanded using one or more `?_extra=` parameters. This takes names of extra keys you would like to include. These can be comma-separated or `?_extra=` can be applied multiple times.\r\n\r\nFor example:\r\n\r\n /database/table.json?_extra=total\r\n\r\nThis adds a `\"total\": 124` field to the returned JSON.\r\n\r\n[ Question: if you do `?_facet=foo` then do you still need to do `?_extra=facets` - I think not? ]", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1200649124, "label": "Datasette 1.0 alpha upcoming release notes"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/682#issuecomment-590399600", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/682", "id": 590399600, "node_id": "MDEyOklzc3VlQ29tbWVudDU5MDM5OTYwMA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-02-24T15:56:10Z", "updated_at": "2020-02-24T15:56:23Z", "author_association": "OWNER", "body": "## Implementation plan\r\n\r\nMethod on Database class called `execute_write(sql)`\r\n\r\nWhich calls `.execute_write_fn(fn)` - so you can instead create a function that applies a whole batch of writes and pass that instead if you need to\r\n\r\nThrows an error of database isn't mutable.\r\n\r\nAdd `._writer_thread` thread property to Database - we start that thread the first time we need it. It blocks on `._writer_queue.get()`\r\n\r\nWe write to that queue with `WriteTask(fn, uuid, reply_queue)` namedtuples - then time-out block awaiting reply for 0.5s\r\n\r\nHave a `.write_status(uuid)` method that checks if `uuid` has completed\r\n\r\nThis should be enough to get it all working. MVP can skip the .5s timeout entirely\r\n\r\nBut... what about that progress bar supporting stretch goal?\r\n\r\nFor that let's have each write operation that's currently in progress have total and done integer properties. So I guess we can add those to the `WriteTask`.\r\n\r\nShould we have the ability to see what the currently executing write is? Seems useful.\r\n\r\nHopefully I can integrate https://github.com/tqdm/tqdm such that it calculates ETAs without actually trying to print to the console.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 569613563, "label": "Mechanism for writing to database via a queue"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1708#issuecomment-1095687566", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1708", "id": 1095687566, "node_id": "IC_kwDOBm6k_c5BTt2O", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-04-11T23:24:30Z", "updated_at": "2022-04-11T23:24:30Z", "author_association": "OWNER", "body": "## Redesigned template context\r\n\r\n**Warning:** if you use any custom templates with your Datasette instance they are likely to break when you upgrade to 1.0.\r\n\r\nThe template context has been redesigned to be based on the documented JSON API. This means that the template context can be considered stable going forward, so any custom templates you implement should continue to work when you upgrade Datasette in the future.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1200649124, "label": "Datasette 1.0 alpha upcoming release notes"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1160#issuecomment-752257666", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1160", "id": 752257666, "node_id": "MDEyOklzc3VlQ29tbWVudDc1MjI1NzY2Ng==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-12-29T22:09:18Z", "updated_at": "2020-12-29T22:09:18Z", "author_association": "OWNER", "body": "### Figuring out the API design\r\n\r\nI want to be able to support different formats, and be able to parse them into tables either streaming or in one go depending on if the format supports that.\r\n\r\nIdeally I want to be able to pull the first 1,024 bytes for the purpose of detecting the format, then replay those bytes again later. I'm considering this a stretch goal though.\r\n\r\nCSV is easy to parse as a stream - here\u2019s [how sqlite-utils does it](https://github.com/simonw/sqlite-utils/blob/f1277f638f3a54a821db6e03cb980adad2f2fa35/sqlite_utils/cli.py#L630):\r\n\r\n dialect = \"excel-tab\" if tsv else \"excel\"\r\n with file_progress(json_file, silent=silent) as json_file:\r\n reader = csv_std.reader(json_file, dialect=dialect)\r\n headers = next(reader)\r\n docs = (dict(zip(headers, row)) for row in reader)\r\n\r\nProblem: using `db.insert_all()` could block for a long time on a big set of rows. Probably easiest to batch the records before calling `insert_all()` and then run a batch at a time using a `db.execute_write_fn()` call.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 775666296, "label": "\"datasette insert\" command and plugin hook"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1026#issuecomment-719959754", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1026", "id": 719959754, "node_id": "MDEyOklzc3VlQ29tbWVudDcxOTk1OTc1NA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-31T16:56:35Z", "updated_at": "2020-10-31T16:56:35Z", "author_association": "OWNER", "body": "#1041 can also benefit from the string subclass that shows that `base_url` has been added.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 722738988, "label": "How should datasette.client interact with base_url"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1152#issuecomment-749750995", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1152", "id": 749750995, "node_id": "MDEyOklzc3VlQ29tbWVudDc0OTc1MDk5NQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-12-22T20:05:30Z", "updated_at": "2020-12-22T20:05:30Z", "author_association": "OWNER", "body": "#1150 is landed now, which means there's a new, hidden `_internal` SQLite in-memory database containing all of the tables and databases.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 770598024, "label": "Efficiently calculate list of databases/tables a user can view"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1269#issuecomment-804261610", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1269", "id": 804261610, "node_id": "MDEyOklzc3VlQ29tbWVudDgwNDI2MTYxMA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-03-22T17:40:41Z", "updated_at": "2021-03-22T17:40:41Z", "author_association": "OWNER", "body": "#1270 looks promising, and I don't want to leave open a security hole where someone could potentially hang Datasette with a nasty `count(*)` query.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 837348479, "label": "Don't attempt to run count(*) against virtual tables"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/520#issuecomment-504852873", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/520", "id": 504852873, "node_id": "MDEyOklzc3VlQ29tbWVudDUwNDg1Mjg3Mw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2019-06-24T04:28:22Z", "updated_at": "2019-06-24T04:28:22Z", "author_association": "OWNER", "body": "#272 is closed now! This hook is next on the priority list.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 459598080, "label": "asgi_wrapper plugin hook"}, "performed_via_github_app": null} {"html_url": "https://github.com/dogsheep/google-takeout-to-sqlite/issues/6#issuecomment-790384087", "issue_url": "https://api.github.com/repos/dogsheep/google-takeout-to-sqlite/issues/6", "id": 790384087, "node_id": "MDEyOklzc3VlQ29tbWVudDc5MDM4NDA4Nw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-03-04T07:22:51Z", "updated_at": "2021-03-04T07:22:51Z", "author_association": "MEMBER", "body": "#3 also mentions the conflicting version with other tools.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 821841046, "label": "Upgrade to latest sqlite-utils"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/830#issuecomment-720700065", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/830", "id": 720700065, "node_id": "MDEyOklzc3VlQ29tbWVudDcyMDcwMDA2NQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-02T20:15:36Z", "updated_at": "2020-11-02T20:15:36Z", "author_association": "OWNER", "body": "#427 had a bunch of ambitious plans for faceting that I haven't realized yet:\r\n\r\n> Think of all of the potential kinds of facets:\r\n> \r\n> * `?_facet_array=tags` where tags is a JSON array of values\r\n> * `_facet_date=datetimecol` - faceted by date part of a datetime\r\n> * `_facet_bins=numeric_column` - can I do some kind of fancy binning here? Might need to take an argument\r\n> * `?_facet_bins=numeric_column:5` - could be a way to take an argument. We\u2019ll ignore columns with a : in their name.\r\n> * `?_facet_json=jsoncol:jsonpath` - could use a JSON path to extract out something to facet on?\r\n> * `?_facet_percentile=numericcolumn` - could this work?\r\n> * `?_facet_function=column:sqlfunctionname` - maybe this could be interesting? Would allow for e.g. facet by soundex\r\n> * `?_facet_prefix=column:prefix` - facet by terms but only if they start with a specific prefix\r\n> * `?_facet_substring=column:3,6` - facet by a substr(column, 3, 6)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 636511683, "label": "Redesign register_facet_classes plugin hook"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/595#issuecomment-552276237", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/595", "id": 552276237, "node_id": "MDEyOklzc3VlQ29tbWVudDU1MjI3NjIzNw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2019-11-11T03:12:56Z", "updated_at": "2019-11-11T03:12:56Z", "author_association": "OWNER", "body": "#622", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 506300941, "label": "bump uvicorn to 0.9.0 to be Python-3.8 friendly"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/594#issuecomment-552276247", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/594", "id": 552276247, "node_id": "MDEyOklzc3VlQ29tbWVudDU1MjI3NjI0Nw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2019-11-11T03:13:00Z", "updated_at": "2019-11-11T03:13:00Z", "author_association": "OWNER", "body": "#622", "reactions": "{\"total_count\": 1, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 1, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 506297048, "label": "upgrade to uvicorn-0.9 to be Python-3.8 friendly"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/404#issuecomment-552276277", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/404", "id": 552276277, "node_id": "MDEyOklzc3VlQ29tbWVudDU1MjI3NjI3Nw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2019-11-11T03:13:09Z", "updated_at": "2019-11-11T03:13:09Z", "author_association": "OWNER", "body": "#622 will drop 3.5 support.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 403499298, "label": "Experiment: run Jinja in async mode"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1518#issuecomment-981172801", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1518", "id": 981172801, "node_id": "IC_kwDOBm6k_c46e4JB", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-11-28T23:23:51Z", "updated_at": "2021-11-28T23:23:51Z", "author_association": "OWNER", "body": "(I could experiment with merging the two tables by adding a temporary undocumented `?_sql=` parameter to the in-progress table view that sets an alternative query instead of `select cols from table` - added bonus, this will force me to use introspection against the returned columns rather than mixing in the known columns for the specified table)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1058072543, "label": "Complete refactor of TableView and table.html template"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1779#issuecomment-1214414320", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1779", "id": 1214414320, "node_id": "IC_kwDOBm6k_c5IYn3w", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-08-14T16:54:32Z", "updated_at": "2022-08-14T16:54:32Z", "author_association": "OWNER", "body": "(I deleted my `issue-1779` project using the UI at https://console.cloud.google.com/run?project=datasette-222320)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1334628400, "label": "google cloudrun updated their limits on maxscale based on memory and cpu count"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/349#issuecomment-987349633", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/349", "id": 987349633, "node_id": "IC_kwDOCGYnMM462cKB", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-12-06T23:19:28Z", "updated_at": "2021-12-06T23:19:28Z", "author_association": "OWNER", "body": "(I ended up not needing this here since `.lookup()` already creates a unique index on `_item_id` for you. Still could be a useful feature though.)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1071531082, "label": "A way of creating indexes on newly created tables"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1729#issuecomment-1112717745", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1729", "id": 1112717745, "node_id": "IC_kwDOBm6k_c5CUrmx", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-04-28T22:38:39Z", "updated_at": "2022-04-28T22:39:05Z", "author_association": "OWNER", "body": "(I remain keen on the idea of shipping a plugin that restores the old default API shape to people who have written pre-Datasette-1.0 code against it, but I'll tackle that much later. I really like how jQuery has a culture of doing this.)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1219385669, "label": "Implement ?_extra and new API design for TableView"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/782#issuecomment-782747164", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/782", "id": 782747164, "node_id": "MDEyOklzc3VlQ29tbWVudDc4Mjc0NzE2NA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-02-20T20:47:16Z", "updated_at": "2021-02-20T20:47:16Z", "author_association": "OWNER", "body": "(I started a thread on Twitter about this: https://twitter.com/simonw/status/1363220355318358016)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 627794879, "label": "Redesign default .json format"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/782#issuecomment-691526489", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/782", "id": 691526489, "node_id": "MDEyOklzc3VlQ29tbWVudDY5MTUyNjQ4OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-09-12T18:17:16Z", "updated_at": "2020-09-12T18:17:16Z", "author_association": "OWNER", "body": "(I think I may have been over-thinking the details of this is for a couple of years now.)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 627794879, "label": "Redesign default .json format"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/581#issuecomment-634946319", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/581", "id": 634946319, "node_id": "MDEyOklzc3VlQ29tbWVudDYzNDk0NjMxOQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-05-27T21:18:50Z", "updated_at": "2020-05-27T21:18:50Z", "author_association": "OWNER", "body": "(I used GitHub code search to find code using this plugin hook: https://github.com/search?q=register_output_renderer&type=Code )", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 502993509, "label": "Redesign register_output_renderer callback"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/581#issuecomment-634964457", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/581", "id": 634964457, "node_id": "MDEyOklzc3VlQ29tbWVudDYzNDk2NDQ1Nw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-05-27T21:57:35Z", "updated_at": "2020-05-27T21:57:35Z", "author_association": "OWNER", "body": "(I wonder if this would be enough to allow really smart plugins to implement ETag/conditional get)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 502993509, "label": "Redesign register_output_renderer callback"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1439#issuecomment-1045027067", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1439", "id": 1045027067, "node_id": "IC_kwDOBm6k_c4-Sdj7", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-02-18T19:03:26Z", "updated_at": "2022-02-18T19:03:26Z", "author_association": "OWNER", "body": "(If I make this change it may break some existing Datasette installations when they upgrade - I could try and build a plugin for them which triggers on 404s and checks to see if the old format would return a 200 response, then returns that.)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 973139047, "label": "Rethink how .ext formats (v.s. ?_format=) works before 1.0"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1384#issuecomment-869075395", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1384", "id": 869075395, "node_id": "MDEyOklzc3VlQ29tbWVudDg2OTA3NTM5NQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-06-26T23:54:21Z", "updated_at": "2021-06-26T23:59:21Z", "author_association": "OWNER", "body": "(It may well be that implementing #1168 involves a switch to async metadata)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 930807135, "label": "Plugin hook for dynamic metadata"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1513#issuecomment-970770304", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1513", "id": 970770304, "node_id": "IC_kwDOBm6k_c453MeA", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-11-16T22:55:19Z", "updated_at": "2021-11-16T22:55:19Z", "author_association": "OWNER", "body": "(One thing I really like about this pattern is that it should work exactly the same when used to facet the results of arbitrary SQL queries as it does when faceting results from the table page.)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1055469073, "label": "Research: CTEs and union all to calculate facets AND query at the same time"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1344#issuecomment-849788412", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1344", "id": 849788412, "node_id": "MDEyOklzc3VlQ29tbWVudDg0OTc4ODQxMg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-05-27T16:53:28Z", "updated_at": "2021-05-27T16:53:28Z", "author_association": "OWNER", "body": "(Should also update https://docs.datasette.io/en/stable/contributing.html#release-process with notes on how this works)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 903986178, "label": "Test Datasette Docker images built for different architectures"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/364#issuecomment-1008151884", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/364", "id": 1008151884, "node_id": "IC_kwDOCGYnMM48Fy1M", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-01-08T20:59:21Z", "updated_at": "2022-01-08T20:59:21Z", "author_association": "OWNER", "body": "(That Heroku example doesn't record the timestamp, which limits its usefulness)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1095570074, "label": "`--batch-size 1` doesn't seem to commit for every item"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/356#issuecomment-997508728", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/356", "id": 997508728, "node_id": "IC_kwDOCGYnMM47dMZ4", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-12-20T01:14:43Z", "updated_at": "2021-12-20T01:14:43Z", "author_association": "OWNER", "body": "(This makes me want `--extract` from #352 even more.)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1077431957, "label": "`sqlite-utils insert --convert` option"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/153#issuecomment-347735724", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/153", "id": 347735724, "node_id": "MDEyOklzc3VlQ29tbWVudDM0NzczNTcyNA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2017-11-29T02:47:14Z", "updated_at": "2017-11-29T02:47:14Z", "author_association": "OWNER", "body": "(This only addresses point 2 in your issue description - points 1 and point 3 are still to come)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 276842536, "label": "Ability to customize presentation of specific columns in HTML view"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1249#issuecomment-804406675", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1249", "id": 804406675, "node_id": "MDEyOklzc3VlQ29tbWVudDgwNDQwNjY3NQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-03-22T21:26:27Z", "updated_at": "2021-03-22T21:26:27Z", "author_association": "OWNER", "body": "(Without the `apt-get update ...` SpatiaLite line it's 125MB)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 824064069, "label": "Updated Dockerfile with SpatiaLite version 5.0"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/320#issuecomment-407269243", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/320", "id": 407269243, "node_id": "MDEyOklzc3VlQ29tbWVudDQwNzI2OTI0Mw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2018-07-24T03:30:32Z", "updated_at": "2018-07-24T03:30:32Z", "author_association": "OWNER", "body": "* No primary key => no \"object\" option: https://latest.datasette.io/fixtures-dcc1dbf/no_primary_key\r\n* Has a primary key => show \"object\" option: https://latest.datasette.io/fixtures-dcc1dbf/complex_foreign_keys\r\n* Has a next page => has \"stream all rows\" option: https://latest.datasette.io/fixtures-dcc1dbf/no_primary_key\r\n* Has foreign key references = show default-checked \"expand labels\" option: https://latest.datasette.io/fixtures-dcc1dbf/complex_foreign_keys\r\n* Does not have a next page => do not show \"stream all rows\" option: https://latest.datasette.io/fixtures-dcc1dbf/complex_foreign_keys\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 334169932, "label": "Need unit tests covering the different states for the advanced export box"}, "performed_via_github_app": null} {"html_url": "https://github.com/dogsheep/github-to-sqlite/issues/19#issuecomment-602782437", "issue_url": "https://api.github.com/repos/dogsheep/github-to-sqlite/issues/19", "id": 602782437, "node_id": "MDEyOklzc3VlQ29tbWVudDYwMjc4MjQzNw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-03-23T18:36:12Z", "updated_at": "2020-03-23T18:51:23Z", "author_association": "MEMBER", "body": "* `commits`: `message`\r\n* `issue_comments`: `body`\r\n* `issues`: `title`, `body`\r\n* `labels`: `name`, `description`\r\n* `licenses`: `name`\r\n* `milestones`: `title`, `description`\r\n* `releases`: `name`, `body`\r\n* `repos`: `name`, `description`\r\n* `users`: `login`, `name` (maybe `company`, `bio`)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 585850715, "label": "Enable full-text search for more stuff (like commits, issues and issue_comments)"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/518#issuecomment-504782618", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/518", "id": 504782618, "node_id": "MDEyOklzc3VlQ29tbWVudDUwNDc4MjYxOA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2019-06-23T20:05:44Z", "updated_at": "2019-06-23T20:05:59Z", "author_association": "OWNER", "body": "**Replacement for @app.listener(\"before_server_start\")** - this is what the [ASGI lifespan protocol](https://asgi.readthedocs.io/en/latest/specs/lifespan.html) is for.\r\n\r\nI know Uvicorn supports this because it keeps saying `ASGI 'lifespan' protocol appears unsupported` on the console.\r\n\r\nI think the solution here will be to introduce another ASGI wrapper class similar to `AsgiTracer`. I'll model this on the example in the ASGI lifespan spec.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 459587155, "label": "Port Datasette from Sanic to ASGI + Uvicorn"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/576#issuecomment-636332183", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/576", "id": 636332183, "node_id": "MDEyOklzc3VlQ29tbWVudDYzNjMzMjE4Mw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-05-30T13:37:51Z", "updated_at": "2020-05-30T13:38:35Z", "author_association": "OWNER", "body": "**\\_\\_init\\_\\_**(self, files, immutables=None, cache_headers=True, cors=False, inspect_data=None, metadata=None, sqlite_extensions=None, template_dir=None, plugins_dir=None, static_mounts=None, memory=False, config=None, version_note=None, config_dir=None)\r\n\r\n`Initialize self. See help(type(self)) for accurate signature.`\r\n\r\n**absolute_url**(self, request, path)\r\n\r\n**add_database**(self, name, db)\r\n\r\n**app**(self)\r\n\r\n`Returns an ASGI app function that serves the whole of [Datasette](http://localhost:8066/datasette.app.html#Datasette)`\r\n\r\n**app_css_hash**(self)\r\n\r\n**config**(self, key)\r\n\r\n**config_dict**(self)\r\n\r\n**connected_databases**(self)\r\n\r\n**execute**(self, db_name, sql, params=None, truncate=False, custom_time_limit=None, page_size=None, log_sql_errors=True)\r\n\r\n**expand_foreign_keys**(self, database, table, column, values)\r\n\r\n`Returns dict mapping (column, value) -> label`\r\n\r\n**get_canned_queries**(self, database_name)\r\n\r\n**get_canned_query**(self, database_name, query_name)\r\n\r\n**metadata**(self, key=None, database=None, table=None, fallback=True)\r\n\r\n`Looks up metadata, cascading backwards from specified level.\\\r\nReturns None if metadata value is not found.`\r\n\r\n**plugin_config**(self, plugin_name, database=None, table=None, fallback=True)\r\n\r\n`Return config for plugin, falling back from specified database/table`\r\n\r\n**plugins**(self, show_all=False)\r\n\r\n**prepare_connection**(self, conn, database)\r\n\r\n**register_custom_units**(self)\r\n\r\n`Register any custom units defined in the metadata.json with Pint`\r\n\r\n**register_renderers**(self)\r\n\r\n`Register output renderers which output data in custom formats.`\r\n\r\n**remove_database**(self, name)\r\n\r\n**render_template**(self, templates, context=None, request=None, view_name=None)\r\n\r\n**table_metadata**(self, database, table)\r\n\r\n`Fetch table-specific metadata.`\r\n\r\n**threads**(self)\r\n\r\n**update_with_inherited_metadata**(self, metadata)\r\n\r\n**versions**(self)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 497170355, "label": "Documented internals API for use in plugins"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/147#issuecomment-683528149", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/147", "id": 683528149, "node_id": "MDEyOklzc3VlQ29tbWVudDY4MzUyODE0OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-08-31T03:17:26Z", "updated_at": "2020-08-31T03:17:26Z", "author_association": "OWNER", "body": "+1 to making this something that users can customize. An optional argument to the `Database` constructor would be a neat way to do this.\r\n\r\nI think there's a terrifying way that we could find this value... we could perform a binary search for it! Open up a memory connection and try running different bulk inserts against it and catch the exceptions - then adjust and try again.\r\n\r\nMy hunch is that we could perform just 2 or 3 probes (maybe against carefully selected values) to find the highest value that works. If this process took less than a few ms to run I'd be happy to do it automatically when the class is instantiated (and let users disable that automatic proving by setting a value using the constructor argument).", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 688670158, "label": "SQLITE_MAX_VARS maybe hard-coded too low"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1711#issuecomment-1095672127", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1711", "id": 1095672127, "node_id": "IC_kwDOBm6k_c5BTqE_", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-04-11T23:00:58Z", "updated_at": "2022-04-11T23:00:58Z", "author_association": "OWNER", "body": "- #1510", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1200650491, "label": "Template context powered entirely by the JSON API format"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1709#issuecomment-1095671940", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1709", "id": 1095671940, "node_id": "IC_kwDOBm6k_c5BTqCE", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-04-11T23:00:39Z", "updated_at": "2022-04-11T23:01:41Z", "author_association": "OWNER", "body": "- #262\r\n- #782 \r\n- #1509", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1200649502, "label": "Redesigned JSON API with ?_extra= parameters"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/476#issuecomment-1229320114", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/476", "id": 1229320114, "node_id": "IC_kwDOCGYnMM5JRe-y", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-08-27T23:26:48Z", "updated_at": "2022-08-27T23:26:48Z", "author_association": "OWNER", "body": "- #458 - the `register_function(name=...)` argument\r\n- New tutorial: [Cleaning data with sqlite-utils and Datasette](https://datasette.io/tutorials/clean-data) provides a tutorial introduction (and accompanying ten minute video) about using this tool.\r\n- New Discord community, https://discord.gg/Ass7bCAMDw\r\n- #469 `sqlite-utils rows --order` option\r\n- #471 `sqlite-utils query --functions` option\r\n- #472 Improved code compilation pattern\r\n- #473 Support entrypoints for `--load-extension`\r\n- #455\r\n- #475 `table.default_values` property\r\n- #467", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1353196970, "label": "Release notes for 3.29"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2135#issuecomment-1671753753", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2135", "id": 1671753753, "node_id": "IC_kwDOBm6k_c5jpPAZ", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-09T16:26:17Z", "updated_at": "2023-08-09T16:28:19Z", "author_association": "OWNER", "body": "- Dropped support for Python 3.7\r\n- New `Justfile`\r\n- #1970\r\n- `datasette.render_template()` now accepts a `Context` subclass as an alternative to a dictionary\r\n- #2106\r\n- #2007\r\n- https://github.com/simonw/datasette/issues/2130\r\n- https://github.com/simonw/datasette/issues/2079\r\n- https://github.com/simonw/datasette/issues/1153", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1843600087, "label": "Release notes for 1.0a3"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/505#issuecomment-1291203911", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/505", "id": 1291203911, "node_id": "IC_kwDOCGYnMM5M9jVH", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-10-25T22:21:02Z", "updated_at": "2022-10-25T22:21:02Z", "author_association": "OWNER", "body": "- Now tested against Python 3.11. ([#502](https://github.com/simonw/sqlite-utils/issues/502))\r\n- New `table.search_sql(include_rank=True)` option, which adds a `rank` column to the generated SQL. Thanks, Jacob Chapman. ([#480](https://github.com/simonw/sqlite-utils/pull/480))\r\n- Progress bars now display for newline-delimited JSON files using the `--nl` option. Thanks, Mischa Untaga. ([#485](https://github.com/simonw/sqlite-utils/issues/485))\r\n- New `db.close()` method. ([#504](https://github.com/simonw/sqlite-utils/issues/504))\r\n- Conversion functions passed to [table.convert(...)](https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-convert) can now return lists or dictionaries, which will be inserted into the database as JSON strings. ([#495](https://github.com/simonw/sqlite-utils/issues/495))\r\n- `sqlite-utils install` and `sqlite-utils uninstall` commands for installing packages into the same virtual environment as `sqlite-utils`, [described here](https://sqlite-utils.datasette.io/en/stable/cli.html#cli-install). ([#483](https://github.com/simonw/sqlite-utils/issues/483))\r\n- New [sqlite_utils.utils.flatten()](https://sqlite-utils.datasette.io/en/stable/reference.html#reference-utils-flatten) utility function. ([#500](https://github.com/simonw/sqlite-utils/issues/500))\r\n- Documentation on [using Just](https://sqlite-utils.datasette.io/en/stable/contributing.html#contributing-just) to run tests, linters and build documentation.\r\n- Documentation now covers the [Release process](https://sqlite-utils.datasette.io/en/stable/contributing.html#release-process) for this package.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1423182778, "label": "Release sqlite-utils 3.30"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1595#issuecomment-1012664607", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1595", "id": 1012664607, "node_id": "IC_kwDOBm6k_c48XAkf", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-01-14T01:22:58Z", "updated_at": "2022-01-14T01:22:58Z", "author_association": "OWNER", "body": "- Upgraded Pluggy dependency to 1.0. #1575\r\n- Now using [Plausible](https://plausible.io/) analytics for the Datasette documentation.\r\n- The `db.execute_write()` internals method now defaults to blocking until the write operation has completed. Previously it defaulted to queuing the write and then continuing to run code while the write was in the queue. #1579\r\n- `explain query plan` is now allowed with varying amounts of white space in the query. #1588\r\n- New CLI reference page showing the output of `--help` for each of the `datasette` sub-commands. This lead to several small improvements to the help copy. #1594\r\n- Fixed bug where columns with a underscore prefix could result in unnecessary hidden form fields. #1527", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1102484126, "label": "Release notes for 0.60"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/71#issuecomment-343781030", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/71", "id": 343781030, "node_id": "MDEyOklzc3VlQ29tbWVudDM0Mzc4MTAzMA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2017-11-13T00:21:05Z", "updated_at": "2017-11-13T02:09:32Z", "author_association": "OWNER", "body": "- [x] Have `now domain add -e datasettes.com` run without errors (hopefully just a matter of waiting for the DNS to update)\r\n- [x] Alias an example dataset hosted on Now on a datasettes.com subdomain\r\n- [x] Confirm that HTTP caching and HTTP/2 redirect pushing works as expected - this may require another page rule", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 273278840, "label": "Set up some example datasets on a Cloudflare-backed domain"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1947#issuecomment-1347768549", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1947", "id": 1347768549, "node_id": "IC_kwDOBm6k_c5QVVDl", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-12-13T05:25:56Z", "updated_at": "2022-12-13T22:29:12Z", "author_association": "OWNER", "body": "- [x] I should add a `--database` example to that help text.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1493390939, "label": "UI to create reduced scope tokens from the `/-/create-token` page"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/71#issuecomment-343780671", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/71", "id": 343780671, "node_id": "MDEyOklzc3VlQ29tbWVudDM0Mzc4MDY3MQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2017-11-13T00:15:21Z", "updated_at": "2017-11-13T00:17:37Z", "author_association": "OWNER", "body": "- [x] Redirect https://datasettes.com/ and https://www.datasettes.com/ to https://github.com/simonw/datasette", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 273278840, "label": "Set up some example datasets on a Cloudflare-backed domain"}, "performed_via_github_app": null} {"html_url": "https://github.com/dogsheep/twitter-to-sqlite/issues/8#issuecomment-530417631", "issue_url": "https://api.github.com/repos/dogsheep/twitter-to-sqlite/issues/8", "id": 530417631, "node_id": "MDEyOklzc3VlQ29tbWVudDUzMDQxNzYzMQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2019-09-11T14:52:44Z", "updated_at": "2019-09-14T19:09:22Z", "author_association": "MEMBER", "body": "- [x] This needs documentation.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 490803176, "label": "--sql and --attach options for feeding commands from SQL queries"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1424#issuecomment-894864616", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1424", "id": 894864616, "node_id": "IC_kwDOBm6k_c41Vozo", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-08T22:26:08Z", "updated_at": "2021-08-08T22:26:08Z", "author_association": "OWNER", "body": "- `datasette.database.QueryInterrupted` for queries that were interrupted\r\n- `sqlite3.OperationalError`\r\n- `sqlite3.DatabaseError` and more", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 963527045, "label": "Document exceptions that can be raised by db.execute() and friends"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1518#issuecomment-993794247", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1518", "id": 993794247, "node_id": "IC_kwDOBm6k_c47PBjH", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-12-14T17:09:40Z", "updated_at": "2021-12-14T17:09:40Z", "author_association": "OWNER", "body": "- `table_actions` should be an extra.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1058072543, "label": "Complete refactor of TableView and table.html template"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1439#issuecomment-1045086033", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1439", "id": 1045086033, "node_id": "IC_kwDOBm6k_c4-Sr9R", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-02-18T19:47:43Z", "updated_at": "2022-02-18T19:51:11Z", "author_association": "OWNER", "body": "- https://datasette.io/-/asgi-scope/db/./db./table-..csv..csv\r\n- https://til.simonwillison.net/-/asgi-scope/db/./db./table-..csv..csv\r\n\r\nDo both of those survive the round-trip to populate `raw_path` correctly?\r\n\r\nNo! In both cases the `/./` bit goes missing.\r\n\r\nIt looks like this might even be a client issue - `curl` shows me this:\r\n\r\n```\r\n~ % curl -vv -i 'https://datasette.io/-/asgi-scope/db/./db./table-..csv..csv'\r\n* Trying 216.239.32.21:443...\r\n* Connected to datasette.io (216.239.32.21) port 443 (#0)\r\n* ALPN, offering http/1.1\r\n* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256\r\n* Server certificate: datasette.io\r\n* Server certificate: R3\r\n* Server certificate: ISRG Root X1\r\n> GET /-/asgi-scope/db/db./table-..csv..csv HTTP/1.1\r\n```\r\nSo `curl` decided to turn `/-/asgi-scope/db/./db./table` into `/-/asgi-scope/db/db./table` before even sending the request.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 973139047, "label": "Rethink how .ext formats (v.s. ?_format=) works before 1.0"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1821#issuecomment-1258692555", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1821", "id": 1258692555, "node_id": "IC_kwDOBm6k_c5LBh_L", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-09-26T22:06:39Z", "updated_at": "2022-09-26T22:06:39Z", "author_association": "OWNER", "body": "- https://github.com/simonw/datasette/actions/runs/3131344150\r\n- https://github.com/simonw/datasette/releases/tag/0.63a0\r\n- https://pypi.org/project/datasette/0.63a0/", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1386734383, "label": "Release Datasette 0.63a0"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/923#issuecomment-672287754", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/923", "id": 672287754, "node_id": "MDEyOklzc3VlQ29tbWVudDY3MjI4Nzc1NA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-08-11T21:25:33Z", "updated_at": "2020-08-11T21:25:33Z", "author_association": "OWNER", "body": ".. and confirm if `brew tap ...` is even needed if you run `brew install simonw/datasette/datasette`", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 677037043, "label": "Add homebrew installation to documentation"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/40#issuecomment-342030075", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/40", "id": 342030075, "node_id": "MDEyOklzc3VlQ29tbWVudDM0MjAzMDA3NQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2017-11-06T02:25:48Z", "updated_at": "2017-11-06T02:25:48Z", "author_association": "OWNER", "body": "... I tried that, I don't like it. I'm going to bring back \"directory serving\" by allowing you to pass a directory as an argument to `datasite` (including `datasite .`). I may even make `.` the default if you don't provide anything at all.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 268470572, "label": "Implement command-line tool interface"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1153#issuecomment-805042880", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1153", "id": 805042880, "node_id": "MDEyOklzc3VlQ29tbWVudDgwNTA0Mjg4MA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-03-23T16:24:32Z", "updated_at": "2021-03-23T16:24:32Z", "author_association": "OWNER", "body": "... actually I think I would do that conversion in Python. The client-side YAML parsers all look a little bit heavy to me in terms of additional page weight.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 771202454, "label": "Use YAML examples in documentation by default, not JSON"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/785#issuecomment-636538298", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/785", "id": 636538298, "node_id": "MDEyOklzc3VlQ29tbWVudDYzNjUzODI5OA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-05-31T22:14:43Z", "updated_at": "2020-05-31T22:15:01Z", "author_association": "OWNER", "body": "... actually no I'll do it using a CLI option that can also be in an environment variable:\r\n\r\nhttps://click.palletsprojects.com/en/7.x/options/#values-from-environment-variables\r\n\r\n```python\r\n@click.command()\r\n@click.option('--secret', envvar='DATASETTE_SECRET')\r\ndef greet(secret):\r\n ...\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 628025100, "label": "Datasette secret mechanism - initially for signed cookies"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1552#issuecomment-996077053", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1552", "id": 996077053, "node_id": "IC_kwDOBm6k_c47Xu39", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-12-16T18:36:41Z", "updated_at": "2021-12-16T18:36:41Z", "author_association": "OWNER", "body": "... actually no, I WILL document this, because not documenting this is what got us to this point in the first place!", "reactions": "{\"total_count\": 1, \"+1\": 0, \"-1\": 0, \"laugh\": 1, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1078702875, "label": "Allow to set `facets_array` in metadata (like current `facets`)"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/983#issuecomment-766536076", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/983", "id": 766536076, "node_id": "MDEyOklzc3VlQ29tbWVudDc2NjUzNjA3Ng==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-01-25T04:43:53Z", "updated_at": "2021-01-25T04:43:53Z", "author_association": "OWNER", "body": "... actually not going to include this in 0.54, I need to write a couple of plugins myself using it before I even make it available in preview.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 712260429, "label": "JavaScript plugin hooks mechanism similar to pluggy"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/674#issuecomment-586623462", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/674", "id": 586623462, "node_id": "MDEyOklzc3VlQ29tbWVudDU4NjYyMzQ2Mg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-02-15T17:36:53Z", "updated_at": "2020-03-26T17:19:23Z", "author_association": "OWNER", "body": "... actually we don't need to do that, we have a mechanism for that already:\r\n\r\nhttps://github.com/simonw/datasette/blob/f1442a8151f66ceef6517b6d3d045e2ec1d0f0ec/tests/build_small_spatialite_db.py", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 565552217, "label": "Rethink how sanity checks work"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1852#issuecomment-1289774183", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1852", "id": 1289774183, "node_id": "IC_kwDOBm6k_c5M4GRn", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-10-24T23:25:52Z", "updated_at": "2022-10-24T23:25:52Z", "author_association": "OWNER", "body": "... also, maybe there should be a UI (perhaps on that page) for resetting the Datasette secret? Useful for emergency invalidation of all tokens.\r\n\r\nNo, I'm not going to build that unless someone asks for it. Restarting the server with a fresh secret should be easy enough.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1421552095, "label": "Default API token authentication mechanism"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/514#issuecomment-504662987", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/514", "id": 504662987, "node_id": "MDEyOklzc3VlQ29tbWVudDUwNDY2Mjk4Nw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2019-06-22T12:46:39Z", "updated_at": "2019-06-22T12:46:39Z", "author_association": "OWNER", "body": "... and @russss also suggested systemd 21 seconds before I posted that!", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 459397625, "label": "Documentation with recommendations on running Datasette in production without using Docker"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/808#issuecomment-640157216", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/808", "id": 640157216, "node_id": "MDEyOklzc3VlQ29tbWVudDY0MDE1NzIxNg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-06-07T04:58:40Z", "updated_at": "2020-06-07T04:58:40Z", "author_association": "OWNER", "body": "... and I want a unit test which confirms that all permissions are documented.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 632918799, "label": "Permission check for every view in Datasette (plus docs)"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1838#issuecomment-1271803298", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1838", "id": 1271803298, "node_id": "IC_kwDOBm6k_c5Lzi2i", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-10-07T16:28:41Z", "updated_at": "2022-10-07T16:28:41Z", "author_association": "OWNER", "body": "... and here's @ocdtrekkie's plugin! https://github.com/ocdtrekkie/datasette-external-links-new-tabs", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1400494162, "label": "Open Datasette link in new tab"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1955#issuecomment-1356610089", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1955", "id": 1356610089, "node_id": "IC_kwDOBm6k_c5Q3Dop", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-12-18T01:12:39Z", "updated_at": "2022-12-18T01:12:39Z", "author_association": "OWNER", "body": "... and it turns out those tests saved me. Because I forgot to check if `datasette` would actually start a server correctly!\r\n\r\n```\r\n % datasette fixtures.db -p 8852\r\nINFO: Started server process [3538]\r\nINFO: Waiting for application startup.\r\nERROR: Exception in 'lifespan' protocol\r\nTraceback (most recent call last):\r\n File \"/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/uvicorn/lifespan/on.py\", line 86, in main\r\n await app(scope, self.receive, self.send)\r\n File \"/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/uvicorn/middleware/proxy_headers.py\", line 78, in __call__\r\n return await self.app(scope, receive, send)\r\n File \"/Users/simon/Dropbox/Development/datasette/datasette/utils/asgi.py\", line 437, in __call__\r\n return await self.asgi(scope, receive, send)\r\n File \"/Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages/asgi_csrf.py\", line 39, in app_wrapped_with_csrf\r\n await app(scope, receive, send)\r\n File \"/Users/simon/Dropbox/Development/datasette/datasette/app.py\", line 1457, in __call__\r\n path = scope[\"path\"]\r\nKeyError: 'path'\r\nERROR: Application startup failed. Exiting.\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1496652622, "label": "invoke_startup() is not run in some conditions, e.g. gunicorn/uvicorn workers, breaking lots of things"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/705#issuecomment-603600553", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/705", "id": 603600553, "node_id": "MDEyOklzc3VlQ29tbWVudDYwMzYwMDU1Mw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-03-25T02:11:56Z", "updated_at": "2020-03-25T02:12:09Z", "author_association": "OWNER", "body": "... and set up the CNAME record:\r\n\r\n $ now dns add datasette.io latest CNAME ghs.googlehosted.com.\r\n\r\nGot an error:\r\n\r\n > Error! A conflicting record exists \"rec_e4c36ae94cf0a2b7b1781329\".\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 585626199, "label": "latest.datasette.io is no longer updating"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1268#issuecomment-803774518", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1268", "id": 803774518, "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzc3NDUxOA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-03-22T05:34:57Z", "updated_at": "2021-03-22T05:34:57Z", "author_association": "OWNER", "body": "... and sure enough, adding this code fixed the problem:\r\n```diff\r\ndiff --git a/datasette/database.py b/datasette/database.py\r\nindex 3579cce..b466b12 100644\r\n--- a/datasette/database.py\r\n+++ b/datasette/database.py\r\n@@ -224,6 +226,9 @@ class Database:\r\n # Try to get counts for each table, $limit timeout for each count\r\n counts = {}\r\n for table in await self.table_names():\r\n+ if table == \"SpatialIndex\":\r\n+ counts[table] = 0\r\n+ continue\r\n try:\r\n table_count = (\r\n await self.execute(\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 837308703, "label": "Figure out why SpatiaLite 5.0 hangs the database page on Linux"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1518#issuecomment-973700549", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1518", "id": 973700549, "node_id": "IC_kwDOBm6k_c46CX3F", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-11-19T03:31:20Z", "updated_at": "2021-11-19T03:31:26Z", "author_association": "OWNER", "body": "... and while I'm doing all of this I can rewrite the templates to not use those cheating magical functions AND document the template context at the same time, refs:\r\n- #1510.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1058072543, "label": "Complete refactor of TableView and table.html template"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1955#issuecomment-1356640463", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1955", "id": 1356640463, "node_id": "IC_kwDOBm6k_c5Q3LDP", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-12-18T02:45:18Z", "updated_at": "2022-12-18T02:45:18Z", "author_association": "OWNER", "body": "... and with this change, the following now works correctly:\r\n\r\n```\r\n% datasette install datasette-gunicorn\r\n% datasette gunicorn fixtures.db -p 8855\r\n[2022-12-17 18:44:29 -0800] [7651] [INFO] Starting gunicorn 20.1.0\r\n[2022-12-17 18:44:29 -0800] [7651] [INFO] Listening at: http://127.0.0.1:8855 (7651)\r\n[2022-12-17 18:44:29 -0800] [7651] [INFO] Using worker: uvicorn.workers.UvicornWorker\r\n[2022-12-17 18:44:29 -0800] [7653] [INFO] Booting worker with pid: 7653\r\n[2022-12-17 18:44:29 -0800] [7653] [INFO] Started server process [7653]\r\n[2022-12-17 18:44:29 -0800] [7653] [INFO] Waiting for application startup.\r\n[2022-12-17 18:44:29 -0800] [7653] [INFO] Application startup complete.\r\n```\r\nSo this issue is now fixed!", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1496652622, "label": "invoke_startup() is not run in some conditions, e.g. gunicorn/uvicorn workers, breaking lots of things"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/147#issuecomment-779446652", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/147", "id": 779446652, "node_id": "MDEyOklzc3VlQ29tbWVudDc3OTQ0NjY1Mg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-02-15T21:04:19Z", "updated_at": "2021-02-15T21:04:19Z", "author_association": "OWNER", "body": "... but it looks like `batch_size` is hard-coded to 100, rather than `None` - which means it's not being calculated using that value:\r\n\r\nhttps://github.com/simonw/sqlite-utils/blob/1f49f32814a942fa076cfe5f504d1621188097ed/sqlite_utils/db.py#L704\r\n\r\nAnd\r\n\r\nhttps://github.com/simonw/sqlite-utils/blob/1f49f32814a942fa076cfe5f504d1621188097ed/sqlite_utils/db.py#L1877", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 688670158, "label": "SQLITE_MAX_VARS maybe hard-coded too low"}, "performed_via_github_app": null} {"html_url": "https://github.com/dogsheep/evernote-to-sqlite/issues/5#issuecomment-706776808", "issue_url": "https://api.github.com/repos/dogsheep/evernote-to-sqlite/issues/5", "id": 706776808, "node_id": "MDEyOklzc3VlQ29tbWVudDcwNjc3NjgwOA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-11T22:23:14Z", "updated_at": "2020-10-11T22:23:14Z", "author_association": "MEMBER", "body": "... but it's still important to be able to get to the rendered note directly from the browse notes `/evernote/notes` page. Maybe use a simple `render_cell()` hook that just knows how to generate the link to the rendered note page?", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 718938889, "label": "Figure out how to display images from tags inline in Datasette"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/467#issuecomment-1224283367", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/467", "id": 1224283367, "node_id": "IC_kwDOCGYnMM5I-RTn", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-08-23T16:05:55Z", "updated_at": "2022-08-23T16:05:55Z", "author_association": "OWNER", "body": "... but that's what the `table.transform(...)` method does already!\r\n\r\nSo maybe this is actually a `transform=True` parameter to `create()` that triggers `table.transform(...)` if necessary.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1348169997, "label": "Mechanism for ensuring a table has all the columns"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1913#issuecomment-1331204360", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1913", "id": 1331204360, "node_id": "IC_kwDOBm6k_c5PWJEI", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-11-29T19:47:40Z", "updated_at": "2022-11-29T19:47:40Z", "author_association": "OWNER", "body": "... but the last step of the deploy failed, when it was meant to push to PyPI!\r\n```\r\nUploading distributions to https://upload.pypi.org/legacy/\r\nTraceback (most recent call last):\r\n File \"/opt/hostedtoolcache/Python/3.11.0/x64/bin/twine\", line 8, in \r\n sys.exit(main())\r\n ^^^^^^\r\n File \"/opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/twine/__main__.py\", line 33, in main\r\n error = cli.dispatch(sys.argv[1:])\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/twine/cli.py\", line 123, in dispatch\r\n return main(args.args)\r\n ^^^^^^^^^^^^^^^\r\n File \"/opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/twine/commands/upload.py\", line 198, in main\r\n return upload(upload_settings, parsed_args.dists)\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/twine/commands/upload.py\", line 123, in upload\r\n packages_to_upload = [\r\n ^\r\n File \"/opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/twine/commands/upload.py\", line 124, in \r\n _make_package(filename, signatures, upload_settings) for filename in uploads\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/twine/commands/upload.py\", line 77, in _make_package\r\n package = package_file.PackageFile.from_filename(filename, upload_settings.comment)\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/twine/package.py\", line 96, in from_filename\r\n meta = DIST_TYPES[dtype](filename)\r\n ^^^^^^^^^^^^^^^^^^^^^^^^^^^\r\n File \"/opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/twine/wheel.py\", line 42, in __init__\r\n self.extractMetadata()\r\n File \"/opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/pkginfo/distribution.py\", line 121, in extractMetadata\r\n self.parse(data)\r\n File \"/opt/hostedtoolcache/Python/3.11.0/x64/lib/python3.11/site-packages/twine/wheel.py\", line 89, in parse\r\n fp = io.StringIO(distribution.must_decode(data))\r\n ^^^^^^^^^^^^^^^^^^^^^^^^\r\nAttributeError: module 'pkginfo.distribution' has no attribute 'must_decode'. Did you mean: '_must_decode'?\r\nError: Process completed with exit code 1.\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1468603401, "label": "Release Datasette 1.0a0"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/672#issuecomment-586109784", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/672", "id": 586109784, "node_id": "MDEyOklzc3VlQ29tbWVudDU4NjEwOTc4NA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-02-14T05:53:50Z", "updated_at": "2020-02-14T05:54:21Z", "author_association": "OWNER", "body": "... cheating like this seems to work:\r\n```\r\nfor name, db in list(self.ds.databases.items()):\r\n```\r\nPython built-in operations are supposedly threadsafe, so in this case I can grab a copy of the list atomically (I think) and then safely iterate over it.\r\n\r\nSeems to work in my testing. Wish I could prove it with a unit test though.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 565064079, "label": "--dirs option for scanning directories for SQLite databases"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1249#issuecomment-803748469", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1249", "id": 803748469, "node_id": "MDEyOklzc3VlQ29tbWVudDgwMzc0ODQ2OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-03-22T04:17:51Z", "updated_at": "2021-03-22T04:17:51Z", "author_association": "OWNER", "body": "... except my clever image using SpatiaLite installed for Ubuntu doesn't actually work:\r\n\r\n```\r\ndatasette % docker run -p 8001:8001 -v `pwd`:/mnt datasette-spatialite:latest datasette -p 8001 -h 0.0.0.0 /mnt/fixtures.db\r\n File \"/usr/local/lib/python3.9/sqlite3/dbapi2.py\", line 27, in \r\n from _sqlite3 import *\r\nImportError: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found (required by /usr/lib/x86_64-linux-gnu/libsqlite3.so.0)\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 824064069, "label": "Updated Dockerfile with SpatiaLite version 5.0"}, "performed_via_github_app": null}