{"html_url": "https://github.com/simonw/datasette/issues/2143#issuecomment-1690787394", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2143", "id": 1690787394, "node_id": "IC_kwDOBm6k_c5kx15C", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T23:52:02Z", "updated_at": "2023-08-23T23:52:02Z", "author_association": "OWNER", "body": "> This also makes it simple to separate out secrets.\r\n> \r\n> `datasette --config settings.yaml --config secrets.yaml --config db-docs.yaml --config db-fixtures.yaml`\r\n\r\nHaving multiple configs that combine in that way is a really interesting direction.\r\n\r\n> To chime in from a poweruser perspective: I'm worried that this is an overengineering trap. Yes, the current solution is somewhat messy. But there are datasette-wide settings, there are database-scope settings, there are table-scope settings etc, but then there are database-scope metadata and table-scope metadata. Trying to cleanly separate \"settings\" from \"configuration\" is, I believe, an uphill fight.\r\n\r\nI'm very keen on separating out the \"metadata\" - where metadata is the slimmest possible set of things, effectively the data license and the source and the column and table descriptions - from everything else, mainly because I want metadata to be able to travel with the data.\r\n\r\nOne idea that's been discussed before is having an optional mechanism for storing metadata in the SQLite database file itself - potentially in a `_datasette_metadata` table. That way you could distribute a DB file and anyone who opened it in Datasette would also see the correct metadata about it.\r\n\r\nThat's why I'm so keen on splitting out metadata from all of the other stuff - settings and plugin configuration and authentication rules.\r\n\r\nSo really it becomes \"true metadata\" v.s. \"all of the other junk that's accumulated in metadata and `settings.json`\".", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1855885427, "label": "De-tangling Metadata before Datasette 1.0"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/2151#issuecomment-1690746371", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2151", "id": 1690746371, "node_id": "IC_kwDOBm6k_c5kxr4D", "user": {"value": 22429695, "label": "codecov[bot]"}, "created_at": "2023-08-23T22:51:57Z", "updated_at": "2023-08-23T22:58:13Z", "author_association": "NONE", "body": "## [Codecov](https://app.codecov.io/gh/simonw/datasette/pull/2151?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) Report\nPatch and project coverage have no change.\n> Comparison is base [(`bdf59eb`)](https://app.codecov.io/gh/simonw/datasette/commit/bdf59eb7db42559e538a637bacfe86d39e5d17ca?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) 92.73% compared to head [(`b895cd2`)](https://app.codecov.io/gh/simonw/datasette/pull/2151?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) 92.73%.\n\n
Additional details and impacted files\n\n\n```diff\n@@ Coverage Diff @@\n## main #2151 +/- ##\n=======================================\n Coverage 92.73% 92.73% \n=======================================\n Files 40 40 \n Lines 5919 5919 \n=======================================\n Hits 5489 5489 \n Misses 430 430 \n```\n\n\n\n\n
\n\n[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/simonw/datasette/pull/2151?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison). \n:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?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": 1864112887, "label": "Test Datasette on multiple SQLite versions"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2102#issuecomment-1690705243", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2102", "id": 1690705243, "node_id": "IC_kwDOBm6k_c5kxh1b", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T22:03:54Z", "updated_at": "2023-08-23T22:03:54Z", "author_association": "OWNER", "body": "Idea: `datasette-permissions-debug` plugin which simply prints out a stacktrace for every permission check so you can see where in the code they are.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1805076818, "label": "API tokens with view-table but not view-database/view-instance cannot access the table"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2102#issuecomment-1690703764", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2102", "id": 1690703764, "node_id": "IC_kwDOBm6k_c5kxheU", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T22:02:14Z", "updated_at": "2023-08-23T22:02:14Z", "author_association": "OWNER", "body": "Built this new test:\r\n```python\r\n@pytest.mark.asyncio\r\nasync def test_view_table_token_can_access_table(perms_ds):\r\n actor = {\r\n \"id\": \"restricted-token\",\r\n \"token\": \"dstok\",\r\n # Restricted to just view-table on perms_ds_two/t1\r\n \"_r\": {\"r\": {\"perms_ds_two\": {\"t1\": [\"vt\"]}}},\r\n }\r\n cookies = {\"ds_actor\": perms_ds.client.actor_cookie(actor)}\r\n response = await perms_ds.client.get(\"/perms_ds_two/t1.json\", cookies=cookies)\r\n assert response.status_code == 200\r\n```\r\nThe test fails. Running it with `pytest --pdb` let me do this:\r\n```\r\n(Pdb) from pprint import pprint\r\n(Pdb) pprint(perms_ds._permission_checks)\r\ndeque([{'action': 'view-table',\r\n 'actor': {'_r': {'r': {'perms_ds_two': {'t1': ['vt']}}},\r\n 'id': 'restricted-token',\r\n 'token': 'dstok'},\r\n 'resource': ('perms_ds_two', 't1'),\r\n 'result': None,\r\n 'used_default': True,\r\n 'when': '2023-08-23T21:59:45.117155'},\r\n {'action': 'view-database',\r\n 'actor': {'_r': {'r': {'perms_ds_two': {'t1': ['vt']}}},\r\n 'id': 'restricted-token',\r\n 'token': 'dstok'},\r\n 'resource': 'perms_ds_two',\r\n 'result': False,\r\n 'used_default': False,\r\n 'when': '2023-08-23T21:59:45.117189'},\r\n {'action': 'view-instance',\r\n 'actor': {'_r': {'r': {'perms_ds_two': {'t1': ['vt']}}},\r\n 'id': 'restricted-token',\r\n 'token': 'dstok'},\r\n 'resource': None,\r\n 'result': False,\r\n 'used_default': False,\r\n 'when': '2023-08-23T21:59:45.126751'},\r\n {'action': 'debug-menu',\r\n 'actor': {'_r': {'r': {'perms_ds_two': {'t1': ['vt']}}},\r\n 'id': 'restricted-token',\r\n 'token': 'dstok'},\r\n 'resource': None,\r\n 'result': False,\r\n 'used_default': False,\r\n 'when': '2023-08-23T21:59:45.126777'}],\r\n maxlen=200)\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1805076818, "label": "API tokens with view-table but not view-database/view-instance cannot access the table"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2102#issuecomment-1690693830", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2102", "id": 1690693830, "node_id": "IC_kwDOBm6k_c5kxfDG", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T21:51:52Z", "updated_at": "2023-08-23T21:52:58Z", "author_association": "OWNER", "body": "This is the hook in question: https://github.com/simonw/datasette/blob/bdf59eb7db42559e538a637bacfe86d39e5d17ca/datasette/hookspecs.py#L108-L110\r\n\r\n- `True` means they are allowed to access it. You only need a single`True` from a plugin to allow it.\r\n- `False` means they are not, and just one `False` from a plugin will deny it (even if another one returned `True` I think)\r\n- `None` means that the plugin has no opinion on this question.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1805076818, "label": "API tokens with view-table but not view-database/view-instance cannot access the table"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/950#issuecomment-680262437", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/950", "id": 680262437, "node_id": "MDEyOklzc3VlQ29tbWVudDY4MDI2MjQzNw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-08-25T20:49:24Z", "updated_at": "2023-08-23T21:34:09Z", "author_association": "OWNER", "body": "The alternative to this would be to use regular databases and control access to them using [Authentication and permissions](https://docs.datasette.io/en/stable/authentication.html). My concern there is that it's just too easy for someone to mess up their configuration, which would be really bad. I like the idea of a much stronger defense mechanism specifically designed for secrets that should not be exposed.\r\n\r\nOutside of secrets, passwords and tokens this mechanism could also be useful for the use-case of using Datasette to power websites - as seen on https://www.niche-museums.com/ and https://www.rockybeaches.com/ - maybe those sites don't want to expose their data through their API but still want to use `datasette-template-sql` and the `graphql()` template tag in `datasette-graphql` to render data.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 685806511, "label": "Private/secret databases: database files that are only visible to plugins"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2150#issuecomment-1690438270", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2150", "id": 1690438270, "node_id": "IC_kwDOBm6k_c5kwgp-", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T18:27:47Z", "updated_at": "2023-08-23T18:27:47Z", "author_association": "OWNER", "body": "I added `outline: 3px dotted pink` to that `form label` block to help spot where else it's being used.\r\n\r\nOh interesting, looks like it's over-ridden here too:\r\n\r\n\"CleanShot\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1863810783, "label": "form label { width: 15% } is a bad default"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2150#issuecomment-1690435866", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2150", "id": 1690435866, "node_id": "IC_kwDOBm6k_c5kwgEa", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T18:25:51Z", "updated_at": "2023-08-23T18:25:51Z", "author_association": "OWNER", "body": "Looks like that affects a few forms:\r\n\r\n\"CleanShot\r\n\r\nThe search form on the table page over-rides it already:\r\n\r\n\"CleanShot\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": 1863810783, "label": "form label { width: 15% } is a bad default"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2150#issuecomment-1690432928", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2150", "id": 1690432928, "node_id": "IC_kwDOBm6k_c5kwfWg", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T18:23:26Z", "updated_at": "2023-08-23T18:23:26Z", "author_association": "OWNER", "body": "That should be scoped just to the query filters form on the table page.\r\n\r\nI'll fix it in `main` but I'm still going to ship a fix for those plugins separately so they work well before people upgrade to the next Datasette release with this change in it.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1863810783, "label": "form label { width: 15% } is a bad default"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2150#issuecomment-1690431509", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2150", "id": 1690431509, "node_id": "IC_kwDOBm6k_c5kwfAV", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T18:22:47Z", "updated_at": "2023-08-23T18:22:47Z", "author_association": "OWNER", "body": "https://github.com/simonw/datasette/blob/64fd1d788eeed2624f107ac699f2370590ae1aa3/datasette/static/app.css#L485-L489", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1863810783, "label": "form label { width: 15% } is a bad default"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2091#issuecomment-1690423878", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2091", "id": 1690423878, "node_id": "IC_kwDOBm6k_c5kwdJG", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T18:18:18Z", "updated_at": "2023-08-23T18:18:18Z", "author_association": "OWNER", "body": "Dupe of:\r\n- #2097 ", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1781022369, "label": "Drop support for Python 3.7"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/2148#issuecomment-1689133247", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2148", "id": 1689133247, "node_id": "IC_kwDOBm6k_c5kriC_", "user": {"value": 22429695, "label": "codecov[bot]"}, "created_at": "2023-08-23T01:36:42Z", "updated_at": "2023-08-23T03:09:43Z", "author_association": "NONE", "body": "## [Codecov](https://app.codecov.io/gh/simonw/datasette/pull/2148?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) Report\nPatch coverage has no change and project coverage change: **`+0.01%`** :tada:\n> Comparison is base [(`17ec309`)](https://app.codecov.io/gh/simonw/datasette/commit/17ec309e14f9c2e90035ba33f2f38ecc5afba2fa?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) 92.71% compared to head [(`a651d3c`)](https://app.codecov.io/gh/simonw/datasette/pull/2148?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) 92.73%.\n> Report is 2 commits behind head on main.\n\n
Additional details and impacted files\n\n\n```diff\n@@ Coverage Diff @@\n## main #2148 +/- ##\n==========================================\n+ Coverage 92.71% 92.73% +0.01% \n==========================================\n Files 40 40 \n Lines 5919 5919 \n==========================================\n+ Hits 5488 5489 +1 \n+ Misses 431 430 -1 \n```\n\n\n[see 1 file with indirect coverage changes](https://app.codecov.io/gh/simonw/datasette/pull/2148/indirect-changes?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison)\n\n\n
\n\n[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/simonw/datasette/pull/2148?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison). \n:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?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": 1859415334, "label": "Bump sphinx, furo, blacken-docs dependencies"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2123#issuecomment-1689207309", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2123", "id": 1689207309, "node_id": "IC_kwDOBm6k_c5kr0IN", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T03:07:27Z", "updated_at": "2023-08-23T03:07:27Z", "author_association": "OWNER", "body": "> I'm happy to debug and land a patch if it's welcome.\r\n\r\nYes please! What an odd bug.", "reactions": "{\"total_count\": 1, \"+1\": 1, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1825007061, "label": "datasette serve when invoked with --reload interprets the serve command as a file"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2147#issuecomment-1689206768", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2147", "id": 1689206768, "node_id": "IC_kwDOBm6k_c5krz_w", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T03:06:32Z", "updated_at": "2023-08-23T03:06:32Z", "author_association": "OWNER", "body": "I'm less convinced by the \"rewrite the query in some way\" optional idea. What kind of use-cases can you imagine for that?\r\n\r\nMy hunch is that it's much more likely to cause weird breakages than it is to allow for useful plugin extensions, but I'm willing to be convinced otherwise.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1858228057, "label": "Plugin hook for database queries that are run"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2147#issuecomment-1689206170", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2147", "id": 1689206170, "node_id": "IC_kwDOBm6k_c5krz2a", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T03:05:32Z", "updated_at": "2023-08-23T03:05:32Z", "author_association": "OWNER", "body": "Interestingly enough there's actually a mechanism that looks like that a bit already: https://github.com/simonw/datasette/blob/64fd1d788eeed2624f107ac699f2370590ae1aa3/datasette/views/database.py#L496-L508\r\n\r\nThat `validate_sql_select()` function is defined here: https://github.com/simonw/datasette/blob/64fd1d788eeed2624f107ac699f2370590ae1aa3/datasette/utils/__init__.py#L256-L265\r\n\r\nAgainst these constants:\r\n\r\nhttps://github.com/simonw/datasette/blob/64fd1d788eeed2624f107ac699f2370590ae1aa3/datasette/utils/__init__.py#L223-L253\r\n\r\nWhich isn't a million miles away from your suggestion to have a hook that can say if the query should be executed or not.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1858228057, "label": "Plugin hook for database queries that are run"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/2148#issuecomment-1689198413", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2148", "id": 1689198413, "node_id": "IC_kwDOBm6k_c5krx9N", "user": {"value": 49699333, "label": "dependabot[bot]"}, "created_at": "2023-08-23T02:57:55Z", "updated_at": "2023-08-23T02:57:55Z", "author_association": "CONTRIBUTOR", "body": "Looks like this PR has been edited by someone other than Dependabot. That means Dependabot can't rebase it - sorry!\n\nIf you're happy for Dependabot to recreate it from scratch, overwriting any edits, you can request `@dependabot recreate`.\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1859415334, "label": "Bump sphinx, furo, blacken-docs dependencies"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/2148#issuecomment-1689198368", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2148", "id": 1689198368, "node_id": "IC_kwDOBm6k_c5krx8g", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T02:57:53Z", "updated_at": "2023-08-23T02:57:53Z", "author_association": "OWNER", "body": "@dependabot rebase", "reactions": "{\"total_count\": 1, \"+1\": 1, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1859415334, "label": "Bump sphinx, furo, blacken-docs dependencies"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/2148#issuecomment-1689177556", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2148", "id": 1689177556, "node_id": "IC_kwDOBm6k_c5krs3U", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T02:44:29Z", "updated_at": "2023-08-23T02:44:29Z", "author_association": "OWNER", "body": "Simplest possible solution is to only run the `pip install .[docs]` bit under Python 3.9+, ditto for the docs tests. I think I'll try that.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1859415334, "label": "Bump sphinx, furo, blacken-docs dependencies"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/2148#issuecomment-1689175062", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2148", "id": 1689175062, "node_id": "IC_kwDOBm6k_c5krsQW", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T02:40:46Z", "updated_at": "2023-08-23T02:40:46Z", "author_association": "OWNER", "body": "Here's why the tests are failing:\r\n\r\nhttps://github.com/simonw/datasette/blob/2ce7872e3ba8d07248c194ef554bbdc1df510f32/.github/workflows/test.yml#L30-L46\r\n\r\nIt looks like those tests don't actually need Sphinx installed - they install `pip install -e '.[test,docs]'` to get the other docs dependencies:\r\n\r\nhttps://github.com/simonw/datasette/blob/2ce7872e3ba8d07248c194ef554bbdc1df510f32/setup.py#L70-L80", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1859415334, "label": "Bump sphinx, furo, blacken-docs dependencies"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/2148#issuecomment-1689173748", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2148", "id": 1689173748, "node_id": "IC_kwDOBm6k_c5krr70", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T02:38:31Z", "updated_at": "2023-08-23T02:38:31Z", "author_association": "OWNER", "body": "Sphinx dropped support for Python 3.8 in their version 7.2.0:\r\n\r\n- https://www.sphinx-doc.org/en/master/changes.html#release-7-2-0-released-aug-17-2023\r\n- https://www.sphinx-doc.org/en/master/internals/release-process.html#python-version-support-policy\r\n- https://github.com/sphinx-doc/sphinx/pull/11511\r\n- ", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1859415334, "label": "Bump sphinx, furo, blacken-docs dependencies"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/516#issuecomment-1689159200", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/516", "id": 1689159200, "node_id": "IC_kwDOBm6k_c5kroYg", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T02:15:36Z", "updated_at": "2023-08-23T02:15:36Z", "author_association": "OWNER", "body": "This could play havoc with unmerged PRs. I should merge any big ones (like the JavaScript plugins work) first.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 459509126, "label": "Enforce import sort order with isort"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/516#issuecomment-1689158712", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/516", "id": 1689158712, "node_id": "IC_kwDOBm6k_c5kroQ4", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T02:14:45Z", "updated_at": "2023-08-23T02:14:45Z", "author_association": "OWNER", "body": "Thinking about this again today. Posted about it on Discord: https://discord.com/channels/823971286308356157/823971286941302908/1143729300349132933\r\n\r\nI won't enforce it in a `pytest` test, I'll enforce it with a CI lint check that's also in the `Justfile` here instead:\r\n\r\nhttps://github.com/simonw/datasette/blob/17ec309e14f9c2e90035ba33f2f38ecc5afba2fa/Justfile#L19-L23", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 459509126, "label": "Enforce import sort order with isort"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/516#issuecomment-1689154837", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/516", "id": 1689154837, "node_id": "IC_kwDOBm6k_c5krnUV", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T02:08:33Z", "updated_at": "2023-08-23T02:08:50Z", "author_association": "OWNER", "body": "Browse this commit to see the result: https://github.com/simonw/datasette/tree/59a5d336bd4336bc53103922ada4bf726f4336c9", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 459509126, "label": "Enforce import sort order with isort"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/516#issuecomment-1689153446", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/516", "id": 1689153446, "node_id": "IC_kwDOBm6k_c5krm-m", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T02:06:35Z", "updated_at": "2023-08-23T02:06:35Z", "author_association": "OWNER", "body": "I just tried this again today by dropping this into `.isort.cfg`:\r\n```ini\r\n[settings]\r\nmulti_line_output=3\r\ninclude_trailing_comma=True\r\nforce_grid_wrap=0\r\nuse_parentheses=True\r\nline_length=88\r\nknown_first_party=datasette\r\n```\r\nAnd running this in the root of the project:\r\n```\r\nisort .\r\n```\r\nIt produced a huge diff, but when I ran the tests:\r\n```bash\r\npytest -n auto\r\n```\r\nThe tests all passed. I'll push a PR.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 459509126, "label": "Enforce import sort order with isort"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/524#issuecomment-1689130061", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/524", "id": 1689130061, "node_id": "IC_kwDOBm6k_c5krhRN", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T01:31:08Z", "updated_at": "2023-08-23T01:31:08Z", "author_association": "OWNER", "body": "This branch is WAY out of date.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 459689615, "label": "Sort commits using isort, refs #516"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/493#issuecomment-1689128911", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/493", "id": 1689128911, "node_id": "IC_kwDOBm6k_c5krg_P", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T01:29:20Z", "updated_at": "2023-08-23T01:29:20Z", "author_association": "OWNER", "body": "It's going to be called `datasette.json` and the concept of metadata will be split out separately. See:\r\n\r\n- #2149 ", "reactions": "{\"total_count\": 1, \"+1\": 1, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 449886319, "label": "Rename metadata.json to config.json"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/275#issuecomment-1689128553", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/275", "id": 1689128553, "node_id": "IC_kwDOBm6k_c5krg5p", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T01:28:37Z", "updated_at": "2023-08-23T01:28:37Z", "author_association": "OWNER", "body": "This is obsoleted by the work happening here:\r\n- #2093 ", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 324720095, "label": "\"config\" section in metadata.json (root, database and table level)"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/2148#issuecomment-1689127479", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2148", "id": 1689127479, "node_id": "IC_kwDOBm6k_c5krgo3", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T01:26:53Z", "updated_at": "2023-08-23T01:26:53Z", "author_association": "OWNER", "body": "@dependabot recreate", "reactions": "{\"total_count\": 1, \"+1\": 1, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1859415334, "label": "Bump sphinx, furo, blacken-docs dependencies"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/2149#issuecomment-1689125244", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2149", "id": 1689125244, "node_id": "IC_kwDOBm6k_c5krgF8", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-08-23T01:23:27Z", "updated_at": "2023-08-23T01:23:27Z", "author_association": "OWNER", "body": "This is a really great start - tests pass, implementation looks clean, the new stubbed documentation page makes sense. Let's land it in `main` and iterate on it further in future PRs.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1861812208, "label": "Start a new `datasette.yaml` configuration file, with settings support"}, "performed_via_github_app": null}