{"html_url": "https://github.com/simonw/datasette/pull/2077#issuecomment-1557289070", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2077", "id": 1557289070, "node_id": "IC_kwDOBm6k_c5c0lhu", "user": {"value": 22429695, "label": "codecov[bot]"}, "created_at": "2023-05-22T14:08:33Z", "updated_at": "2023-06-29T14:40:35Z", "author_association": "NONE", "body": "## [Codecov](https://app.codecov.io/gh/simonw/datasette/pull/2077?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 [(`ede6203`)](https://app.codecov.io/gh/simonw/datasette/commit/ede62036180993dbd9d4e5d280fc21c183cda1c3?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) 92.40% compared to head [(`9785c4f`)](https://app.codecov.io/gh/simonw/datasette/pull/2077?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison) 92.40%.\n\n
Additional details and impacted files\n\n\n```diff\n@@ Coverage Diff @@\n## main #2077 +/- ##\n=======================================\n Coverage 92.40% 92.40% \n=======================================\n Files 39 39 \n Lines 5803 5803 \n=======================================\n Hits 5362 5362 \n Misses 441 441 \n```\n\n\n\n\n
\n\n[:umbrella: View full report in Codecov by Sentry](https://app.codecov.io/gh/simonw/datasette/pull/2077?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=Simon+Willison). \n:loudspeaker: Do you have feedback about the report comment? [Let us know in this issue](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": 1719759468, "label": "Bump furo from 2023.3.27 to 2023.5.20"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2089#issuecomment-1613305070", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2089", "id": 1613305070, "node_id": "IC_kwDOBm6k_c5gKRTu", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-06-29T14:40:44Z", "updated_at": "2023-06-29T14:40:44Z", "author_association": "OWNER", "body": "I'm not sure why I can't duplicate this failure in my local development environment:\r\n```\r\n% codespell docs/metadata.rst\r\n```\r\nIt finds no errors.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1780973290, "label": "codespell test failure"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2089#issuecomment-1613306787", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2089", "id": 1613306787, "node_id": "IC_kwDOBm6k_c5gKRuj", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-06-29T14:41:47Z", "updated_at": "2023-06-29T14:41:47Z", "author_association": "OWNER", "body": "Looks like in CI it's running 2.2.5:\r\n```\r\nCollecting codespell (from datasette==1.0a2)\r\n Downloading codespell-2.2.5-py3-none-any.whl (242 kB)\r\n \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 242.7/242.7 kB 31.1 MB/s eta 0:00:00\r\n```\r\nBut on my laptop it's 2.2.2:\r\n```\r\n% codespell --version\r\n2.2.2\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1780973290, "label": "codespell test failure"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2089#issuecomment-1613307716", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2089", "id": 1613307716, "node_id": "IC_kwDOBm6k_c5gKR9E", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-06-29T14:42:23Z", "updated_at": "2023-06-29T14:42:23Z", "author_association": "OWNER", "body": "Yes, upgrading locally got me the correct version and the test failure:\r\n```\r\n% pip install -U codespell\r\nRequirement already satisfied: codespell in /Users/simon/.local/share/virtualenvs/datasette-AWNrQs95/lib/python3.10/site-packages (2.2.2)\r\nCollecting codespell\r\n Downloading codespell-2.2.5-py3-none-any.whl (242 kB)\r\n \u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501 242.7/242.7 kB 4.9 MB/s eta 0:00:00\r\nInstalling collected packages: codespell\r\n Attempting uninstall: codespell\r\n Found existing installation: codespell 2.2.2\r\n Uninstalling codespell-2.2.2:\r\n Successfully uninstalled codespell-2.2.2\r\nSuccessfully installed codespell-2.2.5\r\n% codespell docs/metadata.rst\r\ndocs/metadata.rst:192: displaing ==> displaying\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1780973290, "label": "codespell test failure"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2089#issuecomment-1613315851", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2089", "id": 1613315851, "node_id": "IC_kwDOBm6k_c5gKT8L", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-06-29T14:47:38Z", "updated_at": "2023-06-29T14:47:38Z", "author_association": "OWNER", "body": "Confirmed, this was a 2.2.5 change: https://github.com/codespell-project/codespell/releases/tag/v2.2.5\r\n\r\n> - Add displaing->displaying by [@peternewman](https://github.com/peternewman) in [#2808](https://github.com/codespell-project/codespell/pull/2808)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1780973290, "label": "codespell test failure"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2089#issuecomment-1613316722", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2089", "id": 1613316722, "node_id": "IC_kwDOBm6k_c5gKUJy", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-06-29T14:48:10Z", "updated_at": "2023-06-29T14:48:10Z", "author_association": "OWNER", "body": "Spell check is passing now.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1780973290, "label": "codespell test failure"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2090#issuecomment-1613339404", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2090", "id": 1613339404, "node_id": "IC_kwDOBm6k_c5gKZsM", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-06-29T15:01:01Z", "updated_at": "2023-06-29T15:01:20Z", "author_association": "OWNER", "body": "I tried it just now and got some interesting results.\r\n\r\nI dropped in a `ruff.toml` file:\r\n```toml\r\nline-length = 160\r\n```\r\nBecause the default line length limit of 88 was causing a lot of noisy errors.\r\n\r\nThen run:\r\n\r\n```bash\r\npip install ruff\r\nruff check .\r\n```\r\nPlenty of warnings about unused imports - running `ruff check . --fix` fixed those automatically, but I think I still need to manually review them as some might be imports which are deliberate and should be in `__all__` to ensure they are visible from that module as well.\r\n\r\nSome lines in tests are longer than even 160 chars, e.g.:\r\n\r\nhttps://github.com/simonw/datasette/blob/99ba05118891db9dc30f1dca22ad6709775560de/tests/test_html.py#L673-L681\r\n\r\nThese can have ` # noqa: E501` added to the end of those lines to skip the check for them.\r\n\r\nThat got it down to:\r\n\r\n```\r\n% ruff check . \r\ndatasette/views/table.py:23:5: F811 Redefinition of unused `format_bytes` from line 19\r\nrun_tests.py:2:5: E401 Multiple imports on one line\r\ntests/test_api.py:591:40: F811 Redefinition of unused `app_client_no_files` from line 7\r\ntests/test_api.py:629:35: F811 Redefinition of unused `app_client_no_files` from line 7\r\ntests/test_api.py:635:54: F811 Redefinition of unused `app_client_with_dot` from line 8\r\ntests/test_api.py:661:25: F811 Redefinition of unused `app_client_shorter_time_limit` from line 9\r\ntests/test_api.py:759:25: F811 Redefinition of unused `app_client_two_attached_databases_one_immutable` from line 10\r\ntests/test_api.py:892:28: F811 Redefinition of unused `app_client_larger_cache_size` from line 11\r\ntests/test_api.py:928:5: F811 Redefinition of unused `app_client_with_cors` from line 12\r\ntests/test_api.py:929:5: F811 Redefinition of unused `app_client_two_attached_databases_one_immutable` from line 10\r\ntests/test_api.py:969:38: F811 Redefinition of unused `app_client_two_attached_databases` from line 13\r\ntests/test_api.py:976:39: F811 Redefinition of unused `app_client_conflicting_database_names` from line 14\r\ntests/test_api.py:987:38: F811 Redefinition of unused `app_client_immutable_and_inspect_file` from line 15\r\ntests/test_api.py:1002:24: F811 Redefinition of unused `app_client` from line 6\r\ntests/test_csv.py:67:33: F811 Redefinition of unused `app_client_with_cors` from line 6\r\ntests/test_csv.py:157:21: F811 Redefinition of unused `app_client_csv_max_mb_one` from line 5\r\ntests/test_csv.py:198:20: F811 Redefinition of unused `app_client_with_trace` from line 7\r\ntests/test_csv.py:209:53: F811 Redefinition of unused `app_client_with_trace` from line 7\r\ntests/test_csv.py:215:53: F811 Redefinition of unused `app_client_with_trace` from line 7\r\ntests/test_filters.py:102:11: F811 Redefinition of unused `test_through_filters_from_request` from line 81\r\ntests/test_html.py:19:19: F811 Redefinition of unused `app_client_two_attached_databases` from line 7\r\ntests/test_html.py:175:25: F811 Redefinition of unused `app_client_shorter_time_limit` from line 6\r\ntests/test_html.py:469:51: F811 Redefinition of unused `app_client` from line 4\r\ntests/test_html.py:797:26: F811 Redefinition of unused `app_client_base_url_prefix` from line 5\r\ntests/test_html.py:840:44: F811 Redefinition of unused `app_client_base_url_prefix` from line 5\r\ntests/test_html.py:850:51: F811 Redefinition of unused `app_client_base_url_prefix` from line 5\r\ntests/test_pagination.py:50:43: F821 Undefined name `parse_next`\r\ntests/test_pagination.py:82:7: F811 Redefinition of unused `KeysetPaginator` from line 36\r\ntests/test_plugins.py:115:15: E741 Ambiguous variable name: `l`\r\ntests/test_plugins.py:482:161: E501 Line too long (170 > 160 characters)\r\ntests/test_plugins.py:543:29: E741 Ambiguous variable name: `l`\r\ntests/test_plugins.py:563:161: E501 Line too long (170 > 160 characters)\r\ntests/test_plugins.py:940:62: E741 Ambiguous variable name: `l`\r\ntests/test_table_api.py:739:5: F811 Redefinition of unused `app_client_returned_rows_matches_page_size` from line 6\r\ntests/test_table_api.py:1066:45: F811 Redefinition of unused `app_client_with_trace` from line 5\r\ntests/test_table_html.py:484:29: E741 Ambiguous variable name: `l`\r\ntests/test_table_html.py:524:29: E741 Ambiguous variable name: `l`\r\ntests/test_table_html.py:675:161: E501 Line too long (165 > 160 characters)\r\ntests/test_table_html.py:897:161: E501 Line too long (164 > 160 characters)\r\ntests/test_table_html.py:902:161: E501 Line too long (164 > 160 characters)\r\ntests/test_utils.py:141:161: E501 Line too long (176 > 160 characters)\r\nFound 41 errors.\r\n```\r\nThose \"Redefinition of unused `app_client_two_attached_databases`\" lines are caused because of the fixtures pattern I'm using here:\r\n\r\nhttps://github.com/simonw/datasette/blob/99ba05118891db9dc30f1dca22ad6709775560de/tests/test_html.py#L3-L20\r\n\r\nI could fix that by getting rid of `fixtures.py` and moving those into `conftest.py`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1781005740, "label": "Adopt ruff for linting"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2090#issuecomment-1613346412", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2090", "id": 1613346412, "node_id": "IC_kwDOBm6k_c5gKbZs", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-06-29T15:05:04Z", "updated_at": "2023-06-29T15:05:04Z", "author_association": "OWNER", "body": "Decided to fix just those \"Ambiguous variable name\" ones:\r\n\r\n```bash\r\nruff check . | grep E741\r\n```\r\nThen iterated through and fixed them all.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1781005740, "label": "Adopt ruff for linting"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2091#issuecomment-1613360413", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2091", "id": 1613360413, "node_id": "IC_kwDOBm6k_c5gKe0d", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-06-29T15:13:04Z", "updated_at": "2023-06-29T15:13:04Z", "author_association": "OWNER", "body": "One problem: https://glitch.com/ still provides 3.7:\r\n```\r\n$ python3 --version\r\nPython 3.7.10\r\n```\r\n\"image\"\r\n", "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/issues/2091#issuecomment-1613369355", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2091", "id": 1613369355, "node_id": "IC_kwDOBm6k_c5gKhAL", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-06-29T15:18:34Z", "updated_at": "2023-06-29T15:18:34Z", "author_association": "OWNER", "body": "Posted on the Glitch feedback forum about this here: https://support.glitch.com/t/upgrade-python-version-from-3-7-which-is-now-eol-to-something-more-recent/63011", "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/issues/2092#issuecomment-1613375407", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2092", "id": 1613375407, "node_id": "IC_kwDOBm6k_c5gKiev", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-06-29T15:20:52Z", "updated_at": "2023-06-29T15:21:05Z", "author_association": "OWNER", "body": "I'm going to remove this assertion entirely. The homepage JSON needs a refactor anyway.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1781047747, "label": "test_homepage intermittent failure"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2092#issuecomment-1613381990", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2092", "id": 1613381990, "node_id": "IC_kwDOBm6k_c5gKkFm", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-06-29T15:23:04Z", "updated_at": "2023-06-29T15:26:28Z", "author_association": "OWNER", "body": "Felt lazy:\r\n```bash\r\nsymbex test_homepage -f tests/test_api.py | \\\r\n llm -m 4 --system 'Change all of the == some integer tests in this code to isinstance(thing, int) instead'\r\n```\r\nOutput:\r\n```python\r\n# File: tests/test_api.py Line: 26\r\n@pytest.mark.asyncio\r\nasync def test_homepage(ds_client):\r\n response = await ds_client.get(\"/.json\")\r\n assert response.status_code == 200\r\n assert \"application/json; charset=utf-8\" == response.headers[\"content-type\"]\r\n data = response.json()\r\n assert isinstance(data.keys(), int)\r\n d = data[\"fixtures\"]\r\n assert d[\"name\"] == \"fixtures\"\r\n assert isinstance(d[\"tables_count\"], int)\r\n assert isinstance(len(d[\"tables_and_views_truncated\"]), int)\r\n assert d[\"tables_and_views_more\"] is True\r\n # 4 hidden FTS tables + no_primary_key (hidden in metadata)\r\n assert isinstance(d[\"hidden_tables_count\"], int)\r\n # 201 in no_primary_key, plus 6 in other hidden tables:\r\n assert isinstance(d[\"hidden_table_rows_sum\"], int), data\r\n assert isinstance(d[\"views_count\"], int)\r\n```\r\nI'll use most of that and delete the obsoleted comments.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1781047747, "label": "test_homepage intermittent failure"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2093#issuecomment-1613887492", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2093", "id": 1613887492, "node_id": "IC_kwDOBm6k_c5gMfgE", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-06-29T22:40:25Z", "updated_at": "2023-06-29T22:40:25Z", "author_association": "OWNER", "body": "I'm strongly in favour of combining settings, configuration and plugin configuration.\r\n\r\nI'm not keen on mixing in metadata as well - that feels like a different concept to me, and I'm unhappy with how that's already had things like plugin settings leak into it.\r\n\r\nI'm not yet sold on TOML - I actually find it less intuitive than YAML, surprisingly. They all have their warts I guess.\r\n\r\nDatasette already has the ability to consume JSON or YAML for metadata - maybe it could grow TOML support too? That way users could have a `datasette.json` or `datasette.yaml` or `datasette.toml` file depending on their preference.\r\n\r\nIn terms of metadata: since that's means to be driven by a plugin hook anyway, maybe one of the potential sources of metadata is a `metadata` nested object in that `datasette.*` configuration file. Or you can have it in a separate `metadata.json` or bundled into the SQLite database or some other plugin-driven mechanism.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1781530343, "label": "Proposal: Combine settings, metadata, static, etc. into a single `datasette.toml` File"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2093#issuecomment-1613896210", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2093", "id": 1613896210, "node_id": "IC_kwDOBm6k_c5gMhoS", "user": {"value": 15178711, "label": "asg017"}, "created_at": "2023-06-29T22:53:33Z", "updated_at": "2023-06-29T22:53:33Z", "author_association": "CONTRIBUTOR", "body": "Maybe we can have a separate issue for revamping `metadata.json`? A `datasette_metadata` table or the `sqlite-docs` extension seem like two reasonable additions that we can work through. Storing metadata inside a SQLite database makes sense, but I don't think storing `datasette.*` style config (ex ports, settings, etc.) inside a SQLite DB makes sense, since it's very environment-dependent", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1781530343, "label": "Proposal: Combine settings, metadata, static, etc. into a single `datasette.toml` File"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/2052#issuecomment-1613778296", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2052", "id": 1613778296, "node_id": "IC_kwDOBm6k_c5gME14", "user": {"value": 15178711, "label": "asg017"}, "created_at": "2023-06-29T20:36:09Z", "updated_at": "2023-06-29T20:36:09Z", "author_association": "CONTRIBUTOR", "body": "Ok @hydrosquall a couple things before this PR should be good to go:\r\n\r\n- Can we move `datasette/static/table-example-plugins.js` into `demos/plugins/static`?\r\n- For `datasetteManager.VERSION`, can we fill that in or just comment it out for now? Not sure how difficult it'll be to inject it server-side. I imagine we could also have a small build process with esbuild/rollup that just injects a version string into `manager.js` directly, so we don't have to worry about server-rendering (but that can be a future PR)\r\n\r\nIn terms of how to integrate this into Datasette, a few options I can see working:\r\n\r\n- Push this as-is and figure it out before the next release\r\n- Hide this feature behind a settings flag (`--setting unstable-js-plugins on`) and use that setting to hide/show `` in `base.html`\r\n\r\nI'll let @simonw decide which one to work with. I kindof like the idea of having an \"unstable\" opt-in process to enable JS plugins, to give us time to try it out with a wide variety of plugins until we feel its ready.\r\n\r\nI'm also curious to see how \"plugins for a plugin' would work, like #1542. For example, if the leaflet plugin showed default markers, but also included its own hook for other plugins to add more markers/styling. I'm imagine that the individual plugin would re-create their own plugin system compared to this, since handling \"plugins of plugins\" at the top with Datasette seems really convoluted. \r\n\r\nAlso for posterity, here's a list of Simon's Datasette plugins that use \"extra_js_urls()\", which probably means they can be ported/re-written to use this new plugin system:\r\n\r\n- [`datasette-vega`](https://github.com/simonw/datasette-vega/blob/00de059ab1ef77394ba9f9547abfacf966c479c4/datasette_vega/__init__.py#L25)\r\n- [`datasette-cluster-map`](https://github.com/simonw/datasette-cluster-map/blob/795d25ad9ff6cba0307191f44fecc8f8070bef5c/datasette_cluster_map/__init__.py#L14)\r\n- [`datasette-leaflet-geojson`](https://github.com/simonw/datasette-leaflet-geojson/blob/64713aa497750400b9ac2c12e8bb6ffab8eb77f3/datasette_leaflet_geojson/__init__.py#L47)\r\n- [`datasette-pretty-traces`](https://github.com/simonw/datasette-pretty-traces/blob/5219d65eca3d7d7a73bb9d3120df42fe046a1315/datasette_pretty_traces/__init__.py#L5)\r\n- [`datasette-youtube-embed`](https://github.com/simonw/datasette-youtube-embed/blob/4b4a0d7e58ebe15f47e9baf68beb9908c1d899da/datasette_youtube_embed/__init__.py#L55)\r\n- [`datasette-leaflet-freedraw`](https://github.com/simonw/datasette-leaflet-freedraw/blob/8f28c2c2080ec9d29f18386cc6a2573a1c8fbde7/datasette_leaflet_freedraw/__init__.py#L66)\r\n- [`datasette-hovercards`](https://github.com/simonw/datasette-hovercards/blob/9439ba46b7140fb03223faff0d21aeba5615a287/datasette_hovercards/__init__.py#L5)\r\n- [`datasette-mp3-audio`](https://github.com/simonw/datasette-mp3-audio/blob/4402168792f452a46ab7b488e40ec49cd4b12185/datasette_mp3_audio/__init__.py#L6)\r\n- [`datasette-geojson-map`](https://github.com/simonw/datasette-geojson-map/blob/32af5f1fd1a07278bbf8071fbb20a61e0f613246/datasette_geojson_map/__init__.py#L30)", "reactions": "{\"total_count\": 1, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 1}", "issue": {"value": 1651082214, "label": "feat: Javascript Plugin API (Custom panels, column menu items with JS actions)"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/2077#issuecomment-1613290899", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2077", "id": 1613290899, "node_id": "IC_kwDOBm6k_c5gKN2T", "user": {"value": 9599, "label": "simonw"}, "created_at": "2023-06-29T14:32:16Z", "updated_at": "2023-06-29T14:32:16Z", "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": 1719759468, "label": "Bump furo from 2023.3.27 to 2023.5.20"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/2093#issuecomment-1613895188", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/2093", "id": 1613895188, "node_id": "IC_kwDOBm6k_c5gMhYU", "user": {"value": 15178711, "label": "asg017"}, "created_at": "2023-06-29T22:51:53Z", "updated_at": "2023-06-29T22:51:53Z", "author_association": "CONTRIBUTOR", "body": "I agree with not liking `metadata.json` stuff in a `datasette.*` config file. Editing description of a table/column in a file like `datasette.*` seems odd to me. \r\n\r\nThough since plugin configuration currently lives in `metadata.json`, I think it should be removed from there and placed in `datasette.*`, at least for top-level config like `datasette-auth-github`'s config. Keeping `metadata.json` strictly for documentation/licensing/column units makes sense to me, but anything plugin related should be in some config file, like `datasette.*`.\r\n\r\nAnd ya, supporting both `datasette.*` and CLI flags makes a lot of sense to me. Any `--setting` flag should override anything in `datasette.*` for easier debugging, with possibly a warning message so people don't get confused. Same with `--port` and a port defined in `datasette.*`", "reactions": "{\"total_count\": 1, \"+1\": 1, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1781530343, "label": "Proposal: Combine settings, metadata, static, etc. into a single `datasette.toml` File"}, "performed_via_github_app": null}