{"html_url": "https://github.com/simonw/datasette/pull/1648#issuecomment-1060067031", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1648", "id": 1060067031, "node_id": "IC_kwDOBm6k_c4_L1bX", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-03-06T23:50:40Z", "updated_at": "2022-03-06T23:58:31Z", "author_association": "OWNER", "body": "I may have to do extra work here\r\n```python\r\n def database(self, database, format=None):\r\n db = self.ds.databases[database]\r\n if self.ds.setting(\"hash_urls\") and db.hash:\r\n path = self.path(\r\n f\"{dash_encode(database)}-{db.hash[:HASH_LENGTH]}\", format=format\r\n )\r\n else:\r\n path = self.path(dash_encode(database), format=format)\r\n return path\r\n```\r\nThe URLs that incorporate a hash have a `dbname-hash` format - will that `-` in the middle there mess up the dash decoding mechanism? I think it will.\r\n\r\nMight be able to solve that like so:\r\n\r\n```python\r\n async def resolve_db_name(self, request, db_name, **kwargs):\r\n hash = None\r\n name = None\r\n decoded_name = dash_decode(db_name)\r\n if decoded_name not in self.ds.databases and \"-\" in db_name:\r\n # No matching DB found, maybe it's a name-hash?\r\n name_bit, hash_bit = db_name.rsplit(\"-\", 1)\r\n if dash_decode(name_bit) not in self.ds.databases:\r\n raise NotFound(f\"Database not found: {name}\")\r\n else:\r\n name = dash_decode(name_bit)\r\n hash = hash_bit\r\n else:\r\n name = decoded_name\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1160432941, "label": "Use dash encoding for table names and row primary keys in URLs"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1648#issuecomment-1060065736", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1648", "id": 1060065736, "node_id": "IC_kwDOBm6k_c4_L1HI", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-03-06T23:43:00Z", "updated_at": "2022-03-06T23:43:11Z", "author_association": "OWNER", "body": "> * Maybe use dash encoding for database name too?\r\n\r\nYes, I'm going to do this. At the moment if a DB file is called `fixx%tures.db` when you run it in Datasette the path is `/fix%2525tures` - which is liable to break.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1160432941, "label": "Use dash encoding for table names and row primary keys in URLs"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1648#issuecomment-1060056510", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1648", "id": 1060056510, "node_id": "IC_kwDOBm6k_c4_Ly2-", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-03-06T23:02:05Z", "updated_at": "2022-03-06T23:04:24Z", "author_association": "OWNER", "body": "Just spotted this: https://github.com/simonw/datasette/blob/de810f49cc57a4f88e4a1553d26c579253ce4531/datasette/views/base.py#L203-L216\r\n\r\nMaybe the db name should use dash encoding too?\r\n\r\nIf so, relevant code includes this bit:\r\n\r\nhttps://github.com/simonw/datasette/blob/de810f49cc57a4f88e4a1553d26c579253ce4531/datasette/url_builder.py#L30-L38", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1160432941, "label": "Use dash encoding for table names and row primary keys in URLs"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1648#issuecomment-1060044592", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1648", "id": 1060044592, "node_id": "IC_kwDOBm6k_c4_Lv8w", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-03-06T21:42:35Z", "updated_at": "2022-03-06T21:42:35Z", "author_association": "OWNER", "body": "For consistency, I'm going to change how `?_next=` tokens work too. Right now they work like this:\r\n\r\nhttps://github.com/simonw/datasette/blob/de810f49cc57a4f88e4a1553d26c579253ce4531/datasette/views/table.py#L501-L507\r\n\r\nhttps://github.com/simonw/datasette/blob/de810f49cc57a4f88e4a1553d26c579253ce4531/datasette/utils/__init__.py#L114-L116\r\n\r\nI'm going to change those to use dash-encoding instead.\r\n\r\nI considered looking for `%` in those values and replacing that as `-` too, but since Datasette isn't 1.0 yet I'm going to risk breaking any pagination tokens that people might have saved away somewhere!", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1160432941, "label": "Use dash encoding for table names and row primary keys in URLs"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1439#issuecomment-1060044007", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1439", "id": 1060044007, "node_id": "IC_kwDOBm6k_c4_Lvzn", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-03-06T21:38:15Z", "updated_at": "2022-03-06T21:38:15Z", "author_association": "OWNER", "body": "Test: https://github.com/simonw/datasette/blob/d2e3fe3facf0ed0abf8b00cd54463af90dd6904d/tests/test_utils.py#L651-L666\r\n\r\nOne big advantage to this scheme is that redirecting old links to `%2F` pages (e.g. https://fivethirtyeight.datasettes.com/fivethirtyeight/twitter-ratio%2Fsenators) is easy - if you see a `%` in the `raw_path`, redirect to that page with the `%` replaced by `-`.", "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/pull/1648#issuecomment-1060034562", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1648", "id": 1060034562, "node_id": "IC_kwDOBm6k_c4_LtgC", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-03-06T20:36:12Z", "updated_at": "2022-03-06T20:36:12Z", "author_association": "OWNER", "body": "Updated documentation: \r\n![image](https://user-images.githubusercontent.com/9599/156941171-89778c12-41bc-4951-97f2-ecc805025a53.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": 1160432941, "label": "Use dash encoding for table names and row primary keys in URLs"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1649#issuecomment-1060021753", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1649", "id": 1060021753, "node_id": "IC_kwDOBm6k_c4_LqX5", "user": {"value": 22429695, "label": "codecov[bot]"}, "created_at": "2022-03-06T19:13:09Z", "updated_at": "2022-03-06T19:13:09Z", "author_association": "NONE", "body": "# [Codecov](https://codecov.io/gh/simonw/datasette/pull/1649?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) Report\n> Merging [#1649](https://codecov.io/gh/simonw/datasette/pull/1649?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) (59b2c16) into [main](https://codecov.io/gh/simonw/datasette/commit/0499f174c063283aa9b589d475a32077aaf7adc5?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) (0499f17) will **not change** coverage.\n> The diff coverage is `n/a`.\n\n[![Impacted file tree graph](https://codecov.io/gh/simonw/datasette/pull/1649/graphs/tree.svg?width=650&height=150&src=pr&token=eSahVY7kw1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison)](https://codecov.io/gh/simonw/datasette/pull/1649?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 #1649 +/- ##\n=======================================\n Coverage 92.03% 92.03% \n=======================================\n Files 34 34 \n Lines 4557 4557 \n=======================================\n Hits 4194 4194 \n Misses 363 363 \n```\n\n\n| [Impacted Files](https://codecov.io/gh/simonw/datasette/pull/1649?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| [datasette/utils/\\_\\_init\\_\\_.py](https://codecov.io/gh/simonw/datasette/pull/1649/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison#diff-ZGF0YXNldHRlL3V0aWxzL19faW5pdF9fLnB5) | `94.86% <\u00f8> (\u00f8)` | |\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/simonw/datasette/pull/1649?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/datasette/pull/1649?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison). Last update [0499f17...59b2c16](https://codecov.io/gh/simonw/datasette/pull/1649?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": 1160677684, "label": "Add /opt/homebrew to where spatialite extension can be found"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1648#issuecomment-1060016221", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1648", "id": 1060016221, "node_id": "IC_kwDOBm6k_c4_LpBd", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-03-06T18:37:59Z", "updated_at": "2022-03-06T18:37:59Z", "author_association": "OWNER", "body": "Change of plan: based on extensive conversations on Twitter - see https://github.com/simonw/datasette/issues/1439#issuecomment-1059851259 - I'm going to try a variant of this which is basically percent-encoding but with a hyphen instead of a percent symbol.\r\n\r\nReason being that the current scheme doesn't handle the case of `%` being part of the table name, which could cause weird breakage due to some proxies decoding percent encoding before it gets to Datasette.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1160432941, "label": "Use dash encoding for table names and row primary keys in URLs"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1439#issuecomment-1059903309", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1439", "id": 1059903309, "node_id": "IC_kwDOBm6k_c4_LNdN", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-03-06T06:17:51Z", "updated_at": "2022-03-06T06:17:51Z", "author_association": "OWNER", "body": "Suggestion from a conversation with Seth Michael Larson: it would be neat if plugins could easily integrate with whatever scheme this ends up using, maybe with the `/db/table/-/plugin-name` standardized pattern or similar.\r\n\r\nMaking it easy for plugins to do the right, consistent thing is a good idea.", "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/pull/1589#issuecomment-1059875687", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1589", "id": 1059875687, "node_id": "IC_kwDOBm6k_c4_LGtn", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-03-06T01:58:25Z", "updated_at": "2022-03-06T01:58:25Z", "author_association": "OWNER", "body": "Thanks for catching this.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1098275181, "label": "Typo in docs about default redirect status code"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1439#issuecomment-1059864154", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1439", "id": 1059864154, "node_id": "IC_kwDOBm6k_c4_LD5a", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-03-06T00:59:04Z", "updated_at": "2022-03-06T00:59:04Z", "author_association": "OWNER", "body": "Needs more testing, but this seems to work for decoding the percent-escaped-with-dashes format: `urllib.parse.unquote(s.replace('-', '%'))`", "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-1059863997", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1439", "id": 1059863997, "node_id": "IC_kwDOBm6k_c4_LD29", "user": {"value": 505230, "label": "karlcow"}, "created_at": "2022-03-06T00:57:57Z", "updated_at": "2022-03-06T00:57:57Z", "author_association": "NONE", "body": "Probably too late\u2026 but I have just seen this because \r\nhttp://simonwillison.net/2022/Mar/5/dash-encoding/#atom-everything\r\n\r\nAnd it reminded me of comma tools at W3C.\r\nhttp://www.w3.org/,tools\r\n\r\nExample, the text version of W3C homepage\r\nhttps://www.w3.org/,text\r\n\r\n\r\n> The challenge comes down to telling the difference between the following:\r\n> \r\n> * `/db/table` - an HTML table page\r\n\r\n`/db/table`\r\n\r\n> * `/db/table.csv` - the CSV version of `/db/table`\r\n\r\n`/db/table,csv`\r\n\r\n> * `/db/table.csv` - no this one is actually a database table called `table.csv`\r\n\r\n`/db/table.csv`\r\n\r\n> * `/db/table.csv.csv` - the CSV version of `/db/table.csv`\r\n\r\n`/db/table.csv,csv`\r\n\r\n> * `/db/table.csv.csv.csv` and so on...\r\n\r\n`/db/table.csv.csv,csv`\r\n\r\n\r\nI haven't checked all the cases in the thread.", "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-1059855418", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1439", "id": 1059855418, "node_id": "IC_kwDOBm6k_c4_LBw6", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-03-06T00:00:53Z", "updated_at": "2022-03-06T00:04:18Z", "author_association": "OWNER", "body": "```python\r\n_ESCAPE_SAFE = frozenset(\r\n b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\r\n b'abcdefghijklmnopqrstuvwxyz'\r\n b'0123456789_'\r\n)\r\n# I removed b'.-~')\r\n\r\nclass Quoter(dict):\r\n # Keeps a cache internally, via __missing__\r\n def __missing__(self, b):\r\n # Handle a cache miss. Store quoted string in cache and return.\r\n res = chr(b) if b in _ESCAPE_SAFE else '-{:02X}'.format(b)\r\n self[b] = res\r\n return res\r\n\r\nquoter = Quoter().__getitem__\r\n\r\n''.join([quoter(char) for char in b'foo/bar.csv'])\r\n# 'foo-2Fbar-2Ecsv'\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/pull/1602#issuecomment-1016456784", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1602", "id": 1016456784, "node_id": "IC_kwDOBm6k_c48leZQ", "user": {"value": 22429695, "label": "codecov[bot]"}, "created_at": "2022-01-19T13:17:24Z", "updated_at": "2022-03-06T01:30:46Z", "author_association": "NONE", "body": "# [Codecov](https://codecov.io/gh/simonw/datasette/pull/1602?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) Report\n> Merging [#1602](https://codecov.io/gh/simonw/datasette/pull/1602?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) (9eb0bdf) into [main](https://codecov.io/gh/simonw/datasette/commit/5010d1359b9e9db90a5a69a3ca22d12862893e00?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) (5010d13) will **increase** coverage by `0.13%`.\n> The diff coverage is `n/a`.\n\n> :exclamation: Current head 9eb0bdf differs from pull request most recent head a9c69dc. Consider uploading reports for the commit a9c69dc to get more accurate results\n\n[![Impacted file tree graph](https://codecov.io/gh/simonw/datasette/pull/1602/graphs/tree.svg?width=650&height=150&src=pr&token=eSahVY7kw1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison)](https://codecov.io/gh/simonw/datasette/pull/1602?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 #1602 +/- ##\n==========================================\n+ Coverage 92.03% 92.16% +0.13% \n==========================================\n Files 34 34 \n Lines 4557 4531 -26 \n==========================================\n- Hits 4194 4176 -18 \n+ Misses 363 355 -8 \n```\n\n\n| [Impacted Files](https://codecov.io/gh/simonw/datasette/pull/1602?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| [datasette/tracer.py](https://codecov.io/gh/simonw/datasette/pull/1602/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison#diff-ZGF0YXNldHRlL3RyYWNlci5weQ==) | `82.95% <0.00%> (-1.09%)` | :arrow_down: |\n| [datasette/cli.py](https://codecov.io/gh/simonw/datasette/pull/1602/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison#diff-ZGF0YXNldHRlL2NsaS5weQ==) | `77.85% <0.00%> (-0.09%)` | :arrow_down: |\n| [datasette/utils/\\_\\_init\\_\\_.py](https://codecov.io/gh/simonw/datasette/pull/1602/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison#diff-ZGF0YXNldHRlL3V0aWxzL19faW5pdF9fLnB5) | `94.79% <0.00%> (-0.07%)` | :arrow_down: |\n| [datasette/\\_\\_init\\_\\_.py](https://codecov.io/gh/simonw/datasette/pull/1602/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison#diff-ZGF0YXNldHRlL19faW5pdF9fLnB5) | `100.00% <0.00%> (\u00f8)` | |\n| [datasette/app.py](https://codecov.io/gh/simonw/datasette/pull/1602/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison#diff-ZGF0YXNldHRlL2FwcC5weQ==) | `95.37% <0.00%> (+1.05%)` | :arrow_up: |\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/simonw/datasette/pull/1602?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/datasette/pull/1602?src=pr&el=footer&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison). Last update [73f2d25...a9c69dc](https://codecov.io/gh/simonw/datasette/pull/1602?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": 1108084641, "label": "Update pytest-timeout requirement from <2.1,>=1.4.2 to >=1.4.2,<2.2"}, "performed_via_github_app": null}