{"html_url": "https://github.com/simonw/datasette/issues/1439#issuecomment-900709703", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1439", "id": 900709703, "node_id": "IC_kwDOBm6k_c41r71H", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T00:03:09Z", "updated_at": "2021-08-18T00:03:09Z", "author_association": "OWNER", "body": "But... what if I invent my own escaping scheme?\r\n\r\nI actually did this once before, in https://github.com/simonw/datasette/commit/9fdb47ca952b93b7b60adddb965ea6642b1ff523 - while I was working on porting Datasette to ASGI in https://github.com/simonw/datasette/issues/272#issuecomment-494192779 because ASGI didn't yet have the `raw_path` mechanism.\r\n\r\nI could bring that back - it looked like this:\r\n\r\n```\r\n \"table/and/slashes\" => \"tableU+002FandU+002Fslashes\"\r\n \"~table\" => \"U+007Etable\"\r\n \"+bobcats!\" => \"U+002Bbobcats!\"\r\n \"U+007Etable\" => \"UU+002B007Etable\"\r\n```\r\nBut I didn't particularly like it - it was quite verbose.", "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/1439#issuecomment-900711967", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1439", "id": 900711967, "node_id": "IC_kwDOBm6k_c41r8Yf", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T00:08:09Z", "updated_at": "2021-08-18T00:08:09Z", "author_association": "OWNER", "body": "Here's an alternative I just made up which I'm calling \"dot dash\" encoding:\r\n\r\n```python\r\ndef dot_dash_encode(s):\r\n return s.replace(\"-\", \"--\").replace(\".\", \"-.\")\r\n\r\ndef dot_dash_decode(s):\r\n return s.replace(\"-.\", \".\").replace(\"--\", \"-\")\r\n```\r\nAnd some examples:\r\n```python\r\nfor example in (\r\n \"hello\",\r\n \"hello.csv\",\r\n \"hello-and-so-on.csv\",\r\n \"hello-.csv\",\r\n \"hello--and--so--on-.csv\",\r\n \"hello.csv.\",\r\n \"hello.csv.-\",\r\n \"hello.csv.--\",\r\n):\r\n print(example)\r\n print(dot_dash_encode(example))\r\n print(example == dot_dash_decode(dot_dash_encode(example)))\r\n print()\r\n```\r\nOutputs:\r\n```\r\nhello\r\nhello\r\nTrue\r\n\r\nhello.csv\r\nhello-.csv\r\nTrue\r\n\r\nhello-and-so-on.csv\r\nhello--and--so--on-.csv\r\nTrue\r\n\r\nhello-.csv\r\nhello---.csv\r\nTrue\r\n\r\nhello--and--so--on-.csv\r\nhello----and----so----on---.csv\r\nTrue\r\n\r\nhello.csv.\r\nhello-.csv-.\r\nTrue\r\n\r\nhello.csv.-\r\nhello-.csv-.--\r\nTrue\r\n\r\nhello.csv.--\r\nhello-.csv-.----\r\nTrue\r\n```", "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/1439#issuecomment-900712981", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1439", "id": 900712981, "node_id": "IC_kwDOBm6k_c41r8oV", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T00:09:59Z", "updated_at": "2021-08-18T00:12:32Z", "author_association": "OWNER", "body": "So given the original examples, a table called `table.csv` would have the following URLs:\r\n\r\n- `/db/table-.csv` - the HTML version\r\n- `/db/table-.csv.csv` - the CSV version\r\n- `/db/table-.csv.json` - the JSON version\r\n\r\nAnd if for some horific reason you had a table with the name `/db/table-.csv.csv` (so `/db/` was the first part of the actual table name in SQLite) the URLs would look like this:\r\n\r\n- `/db/%2Fdb%2Ftable---.csv-.csv` - the HTML version\r\n- `/db/%2Fdb%2Ftable---.csv-.csv.csv` - the CSV version\r\n- `/db/%2Fdb%2Ftable---.csv-.csv.json` - the JSON version", "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/1439#issuecomment-900714630", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1439", "id": 900714630, "node_id": "IC_kwDOBm6k_c41r9CG", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T00:13:33Z", "updated_at": "2021-08-18T00:13:33Z", "author_association": "OWNER", "body": "The documentation should definitely cover how table names become URLs, in case any third party code needs to be able to calculate this themselves.", "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/1439#issuecomment-900715375", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1439", "id": 900715375, "node_id": "IC_kwDOBm6k_c41r9Nv", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T00:15:28Z", "updated_at": "2021-08-18T00:15:28Z", "author_association": "OWNER", "body": "Maybe I should use `-/` to encode forward slashes too, to defend against any ASGI servers that might not implement `raw_path` correctly.", "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/sqlite-utils/issues/317#issuecomment-901337305", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/317", "id": 901337305, "node_id": "IC_kwDOCGYnMM41uVDZ", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T18:30:59Z", "updated_at": "2021-08-18T18:30:59Z", "author_association": "OWNER", "body": "I'm just going to remove this - I added it when the library was mostly undocumented, but it has comprehensive documentation now.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 972827346, "label": "Link to a better example on docs index"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/296#issuecomment-901338356", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/296", "id": 901338356, "node_id": "IC_kwDOCGYnMM41uVT0", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T18:32:39Z", "updated_at": "2021-08-18T18:32:39Z", "author_association": "OWNER", "body": "This is a good call. I have a fix for this in Datasette but it's not in `sqlite-utils` yet: https://github.com/simonw/datasette/blob/adb5b70de5cec3c3dd37184defe606a082c232cf/datasette/utils/__init__.py#L824-L835", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 944326512, "label": "`table.search(..., quote=True)` parameter and `sqlite-utils search --quote` option"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/296#issuecomment-901338841", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/296", "id": 901338841, "node_id": "IC_kwDOCGYnMM41uVbZ", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T18:33:26Z", "updated_at": "2021-08-18T18:45:12Z", "author_association": "OWNER", "body": "I think I'll do this as an optional `table.search(..., escape=True)` parameter.\r\n\r\nActually I'll do `quote=True` for consistency with the new `db.quote_fts()` method.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 944326512, "label": "`table.search(..., quote=True)` parameter and `sqlite-utils search --quote` option"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/pull/247#issuecomment-901338988", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/247", "id": 901338988, "node_id": "IC_kwDOCGYnMM41uVds", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T18:33:39Z", "updated_at": "2021-08-18T18:33:39Z", "author_association": "OWNER", "body": "This was also requested in #296.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 832687563, "label": "FTS quote functionality from datasette"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/pull/247#issuecomment-901344634", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/247", "id": 901344634, "node_id": "IC_kwDOCGYnMM41uW16", "user": {"value": 22429695, "label": "codecov[bot]"}, "created_at": "2021-08-18T18:42:54Z", "updated_at": "2021-08-18T18:42:54Z", "author_association": "NONE", "body": "# [Codecov](https://codecov.io/gh/simonw/sqlite-utils/pull/247?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) Report\n> Merging [#247](https://codecov.io/gh/simonw/sqlite-utils/pull/247?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) (af989af) into [main](https://codecov.io/gh/simonw/sqlite-utils/commit/1fe73c898b44695052f1a9ca832818d50cecf662?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) (1fe73c8) will **decrease** coverage by `0.03%`.\n> The diff coverage is `85.71%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/simonw/sqlite-utils/pull/247/graphs/tree.svg?width=650&height=150&src=pr&token=O0X3703L9P&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison)](https://codecov.io/gh/simonw/sqlite-utils/pull/247?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison)\n\n```diff\n@@ Coverage Diff @@\n## main #247 +/- ##\n==========================================\n- Coverage 96.28% 96.24% -0.04% \n==========================================\n Files 5 5 \n Lines 2179 2186 +7 \n==========================================\n+ Hits 2098 2104 +6 \n- Misses 81 82 +1 \n```\n\n\n| [Impacted Files](https://codecov.io/gh/simonw/sqlite-utils/pull/247?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) | Coverage \u0394 | |\n|---|---|---|\n| [sqlite\\_utils/db.py](https://codecov.io/gh/simonw/sqlite-utils/pull/247/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison#diff-c3FsaXRlX3V0aWxzL2RiLnB5) | `97.84% <85.71%> (-0.08%)` | :arrow_down: |\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/simonw/sqlite-utils/pull/247?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison).\n> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison)\n> `\u0394 = absolute (impact)`, `\u00f8 = not affected`, `? = missing data`\n> Powered by [Codecov](https://codecov.io/gh/simonw/sqlite-utils/pull/247?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison). Last update [1fe73c8...af989af](https://codecov.io/gh/simonw/sqlite-utils/pull/247?src=pr&el=lastupdated&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison).\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 832687563, "label": "FTS quote functionality from datasette"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/246#issuecomment-901345800", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/246", "id": 901345800, "node_id": "IC_kwDOCGYnMM41uXII", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T18:44:48Z", "updated_at": "2021-08-18T18:44:48Z", "author_association": "OWNER", "body": "The `db.quote_fts(value)` method from #247 can now be used for this - documentation here: https://sqlite-utils.datasette.io/en/latest/reference.html#sqlite_utils.db.Database.quote_fts\r\n\r\nI'll be adding further improvements relating to this (a `table.search(q, quote=True)` parameter) in #296.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 831751367, "label": "Escaping FTS search strings"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/246#issuecomment-901353345", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/246", "id": 901353345, "node_id": "IC_kwDOCGYnMM41uY-B", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T18:57:13Z", "updated_at": "2021-08-18T18:57:13Z", "author_association": "OWNER", "body": "More documentation: https://sqlite-utils.datasette.io/en/latest/python-api.html#quoting-characters-for-use-in-search", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 831751367, "label": "Escaping FTS search strings"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/296#issuecomment-901379930", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/296", "id": 901379930, "node_id": "IC_kwDOCGYnMM41ufda", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T19:40:38Z", "updated_at": "2021-08-18T19:40:38Z", "author_association": "OWNER", "body": "Also add `sqlite-utils search ... --quote` option.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 944326512, "label": "`table.search(..., quote=True)` parameter and `sqlite-utils search --quote` option"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/296#issuecomment-901390635", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/296", "id": 901390635, "node_id": "IC_kwDOCGYnMM41uiEr", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T19:58:53Z", "updated_at": "2021-08-18T19:58:53Z", "author_association": "OWNER", "body": "```\r\nsqlite-utils search fixtures.db searchable 'dog\"'\r\nError: malformed MATCH expression: [dog\"]\r\n```\r\nThis error message could suggest retrying with `--quote`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 944326512, "label": "`table.search(..., quote=True)` parameter and `sqlite-utils search --quote` option"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/296#issuecomment-901398216", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/296", "id": 901398216, "node_id": "IC_kwDOCGYnMM41uj7I", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T20:11:01Z", "updated_at": "2021-08-18T20:11:01Z", "author_association": "OWNER", "body": "```\r\n% sqlite-utils search fixtures.db searchable 'dog\"'\r\nError: malformed MATCH expression: [dog\"]\r\n\r\nTry running this again with the --quote option\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 944326512, "label": "`table.search(..., quote=True)` parameter and `sqlite-utils search --quote` option"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/296#issuecomment-901399139", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/296", "id": 901399139, "node_id": "IC_kwDOCGYnMM41ukJj", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T20:12:34Z", "updated_at": "2021-08-18T20:13:12Z", "author_association": "OWNER", "body": "Documentation for `table.search(..., quote=True)`: https://sqlite-utils.datasette.io/en/latest/python-api.html#searching-with-table-search\r\n\r\nIn the API reference: https://sqlite-utils.datasette.io/en/latest/reference.html#sqlite_utils.db.Table.search\r\n\r\nAnd for the CLI `--quote` option: https://sqlite-utils.datasette.io/en/latest/cli.html#executing-searches", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 944326512, "label": "`table.search(..., quote=True)` parameter and `sqlite-utils search --quote` option"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/295#issuecomment-901403298", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/295", "id": 901403298, "node_id": "IC_kwDOCGYnMM41ulKi", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T20:19:04Z", "updated_at": "2021-08-18T20:19:04Z", "author_association": "OWNER", "body": "Thanks, this was a bug.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 934123448, "label": "Insert with --tsv and --no-headers give error about --nl arguments"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/318#issuecomment-901440207", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/318", "id": 901440207, "node_id": "IC_kwDOCGYnMM41uuLP", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T21:24:28Z", "updated_at": "2021-08-18T21:24:49Z", "author_association": "OWNER", "body": "Something like this then:\r\n\r\n sqlite-utils file.db \"select * from t\" --csv --gz > t.csv.gz\r\n\r\nMaybe add a `-o t.csv.gz` option too so you don't have to use a `>`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 974067156, "label": "Research: handle gzipped CSV directly"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/318#issuecomment-901440752", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/318", "id": 901440752, "node_id": "IC_kwDOCGYnMM41uuTw", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T21:25:30Z", "updated_at": "2021-08-18T21:25:30Z", "author_association": "OWNER", "body": "Some questions:\r\n\r\n- Should this support compression formats other than gzip?\r\n- Should `memory` learn to auto-detect gzipped data?", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 974067156, "label": "Research: handle gzipped CSV directly"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/37#issuecomment-901452199", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/37", "id": 901452199, "node_id": "IC_kwDOCGYnMM41uxGn", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T21:48:57Z", "updated_at": "2021-08-18T21:48:57Z", "author_association": "OWNER", "body": "I did a bunch of work on this in #266. The library is now pretty thoroughly typed, and I even found a couple of bugs using `mypy` along the way: #313 and #315.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 465815372, "label": "Experiment with type hints"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1293#issuecomment-901475812", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1293", "id": 901475812, "node_id": "IC_kwDOBm6k_c41u23k", "user": {"value": 9599, "label": "simonw"}, "created_at": "2021-08-18T22:41:19Z", "updated_at": "2021-08-18T22:41:19Z", "author_association": "OWNER", "body": "> Maybe I split this out into a separate Python library that gets tested against _every_ SQLite release I can possibly try it against, and then bakes out the supported release versions into the library code itself?\r\n\r\nI'm going to do this, and call the Python library `sqlite-explain`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 849978964, "label": "Show column metadata plus links for foreign keys on arbitrary query results"}, "performed_via_github_app": null}