{"html_url": "https://github.com/simonw/datasette/issues/1096#issuecomment-732542285", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1096", "id": 732542285, "node_id": "MDEyOklzc3VlQ29tbWVudDczMjU0MjI4NQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T02:16:22Z", "updated_at": "2020-11-24T02:16:22Z", "author_association": "OWNER", "body": "I'd like to implement this by first extending the `register_output_renderer()` hook to support streaming huge responses, then switching CSV to use the plugin hook in addition to TSV using it.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 743359646, "label": "TSV should be a default export option"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1101#issuecomment-732543700", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1101", "id": 732543700, "node_id": "MDEyOklzc3VlQ29tbWVudDczMjU0MzcwMA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T02:20:30Z", "updated_at": "2020-11-24T02:20:30Z", "author_association": "OWNER", "body": "Current design: https://docs.datasette.io/en/stable/plugin_hooks.html#register-output-renderer-datasette\r\n\r\n```python\r\n@hookimpl\r\ndef register_output_renderer(datasette):\r\n return {\r\n \"extension\": \"test\",\r\n \"render\": render_demo,\r\n \"can_render\": can_render_demo, # Optional\r\n }\r\n```\r\nWhere `render_demo` looks something like this:\r\n```python\r\nasync def render_demo(datasette, columns, rows):\r\n db = datasette.get_database()\r\n result = await db.execute(\"select sqlite_version()\")\r\n first_row = \" | \".join(columns)\r\n lines = [first_row]\r\n lines.append(\"=\" * len(first_row))\r\n for row in rows:\r\n lines.append(\" | \".join(row))\r\n return Response(\r\n \"\\n\".join(lines),\r\n content_type=\"text/plain; charset=utf-8\",\r\n headers={\"x-sqlite-version\": result.first()[0]}\r\n )\r\n```\r\nMeanwhile here's where the CSV streaming mode is implemented: https://github.com/simonw/datasette/blob/4bac9f18f9d04e5ed10f072502bcc508e365438e/datasette/views/base.py#L297-L380", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 749283032, "label": "register_output_renderer() should support streaming data"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1101#issuecomment-732544590", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1101", "id": 732544590, "node_id": "MDEyOklzc3VlQ29tbWVudDczMjU0NDU5MA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T02:22:55Z", "updated_at": "2020-11-24T02:22:55Z", "author_association": "OWNER", "body": "The trick I'm using here is to follow the `next_url` in order to paginate through all of the matching results. The loop calls the `data()` method multiple times, once for each page of results: https://github.com/simonw/datasette/blob/4bac9f18f9d04e5ed10f072502bcc508e365438e/datasette/views/base.py#L304-L307", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 749283032, "label": "register_output_renderer() should support streaming data"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/860#issuecomment-733175454", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/860", "id": 733175454, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzE3NTQ1NA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T19:06:07Z", "updated_at": "2020-11-24T19:06:07Z", "author_association": "OWNER", "body": "I see two ways this plugin hook could work. It could be asked about a specific instance, database or table and return the full metadata for that object. OR it could ask for a specific metadata field - e.g. `source_url` for table X, and return that.\r\n\r\nThe more finely grained one would allow plugins to implement their own cascading rules pretty easily. Is there a reason it would be better for the hook to return an entire block of JSON for a specific table or database?\r\n\r\nI also need to decide if this hook is just going to be about source/license/about displayed metadata, or if it will include the functionality that has been sneaking into `metadata.json` over time - stuff like page size, default sort order or default facets.\r\n\r\nPerhaps I should split those out into a \"configuration\" concept first, after renaming `--config` to `--setting` in #992.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 642651572, "label": "Plugin hook for instance/database/table metadata"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/992#issuecomment-733175965", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/992", "id": 733175965, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzE3NTk2NQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T19:07:13Z", "updated_at": "2020-11-24T19:07:13Z", "author_association": "OWNER", "body": "This is blocking progress on other metadata tickets like #860 because I want to split the concept of concrete metadata (source, license, etc) from configuration that currently lives in metadata (default sort order, default facets).\r\n\r\nI'm going to solve this next to unblock that stuff.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 714449879, "label": "Change \"--config foo:bar\" to \"--setting foo bar\""}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/992#issuecomment-733176252", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/992", "id": 733176252, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzE3NjI1Mg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T19:07:49Z", "updated_at": "2020-11-24T19:07:49Z", "author_association": "OWNER", "body": "I'm going to keep `--config` for the moment but show a deprecation warning that it will be gone in Datasette 1.0.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 714449879, "label": "Change \"--config foo:bar\" to \"--setting foo bar\""}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/992#issuecomment-733180289", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/992", "id": 733180289, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzE4MDI4OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T19:16:30Z", "updated_at": "2020-11-24T19:16:30Z", "author_association": "OWNER", "body": "Need to figure out the `--setting foo bar` alternative for this `--config foo:bar` logic: https://github.com/simonw/datasette/blob/4bac9f18f9d04e5ed10f072502bcc508e365438e/datasette/cli.py#L31-L63", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 714449879, "label": "Change \"--config foo:bar\" to \"--setting foo bar\""}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1103#issuecomment-733187586", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1103", "id": 733187586, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzE4NzU4Ng==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T19:31:23Z", "updated_at": "2020-11-24T19:31:23Z", "author_association": "OWNER", "body": "I'll set up a redirect from `/-/config` to `/-/settings`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 749979454, "label": "Rename /-/config to /-/settings"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1104#issuecomment-733189620", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1104", "id": 733189620, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzE4OTYyMA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T19:35:30Z", "updated_at": "2020-11-24T19:35:30Z", "author_association": "OWNER", "body": "Part of #1105", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 749981663, "label": "config.json in directory config mode should be settings.json"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/992#issuecomment-733189693", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/992", "id": 733189693, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzE4OTY5Mw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T19:35:38Z", "updated_at": "2020-11-24T19:35:38Z", "author_association": "OWNER", "body": "Part of #1105", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 714449879, "label": "Change \"--config foo:bar\" to \"--setting foo bar\""}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1103#issuecomment-733189737", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1103", "id": 733189737, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzE4OTczNw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T19:35:45Z", "updated_at": "2020-11-24T19:35:45Z", "author_association": "OWNER", "body": "Part of #1105", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 749979454, "label": "Rename /-/config to /-/settings"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1105#issuecomment-733190827", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1105", "id": 733190827, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzE5MDgyNw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T19:38:02Z", "updated_at": "2020-11-24T19:38:02Z", "author_association": "OWNER", "body": "I'd like to redirect https://docs.datasette.io/en/stable/config.html to a new https://docs.datasette.io/en/stable/settings.html page too. I can use https://docs.readthedocs.io/en/stable/user-defined-redirects.html for that.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 749982022, "label": "Rebrand config as settings"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/226#issuecomment-733198051", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/226", "id": 733198051, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzE5ODA1MQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T19:52:46Z", "updated_at": "2020-11-24T19:52:46Z", "author_association": "OWNER", "body": "This is well handled now: https://github.com/simonw/datasette/tree/0.51.1/tests/plugins", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 315738696, "label": "Unit tests for installable plugins"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1104#issuecomment-733212084", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1104", "id": 733212084, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzIxMjA4NA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T20:20:33Z", "updated_at": "2020-11-24T20:20:33Z", "author_association": "OWNER", "body": "I'll throw an error if a `config.json` file is detected.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 749981663, "label": "config.json in directory config mode should be settings.json"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1106#issuecomment-733221359", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1106", "id": 733221359, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzIyMTM1OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T20:40:21Z", "updated_at": "2020-11-24T20:40:21Z", "author_association": "OWNER", "body": "https://readthedocs.org/dashboard/datasette/redirects/", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 749983857, "label": "Rebrand and redirect config.rst as settings.rst"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1107#issuecomment-733241949", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1107", "id": 733241949, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzI0MTk0OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T21:24:26Z", "updated_at": "2020-11-24T21:24:26Z", "author_association": "OWNER", "body": "Are there any plugins that use this API even though it isn't documented?", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 750079085, "label": "Rename datasette.config() method to datasette.setting()"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1107#issuecomment-733244471", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1107", "id": 733244471, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzI0NDQ3MQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T21:29:59Z", "updated_at": "2020-11-24T21:29:59Z", "author_association": "OWNER", "body": "I ran `rg '.config\\(' datasette-*/` in my top-level directory:\r\n```\r\ndatasette-sentry/test_datasette_sentry.py: def plugin_config(self, name):\r\ndatasette-sentry/datasette_sentry.py: config = datasette.plugin_config(\"datasette-sentry\") or {}\r\ndatasette-render-markdown/datasette_render_markdown/__init__.py: datasette.plugin_config(\r\ndatasette-render-images/datasette_render_images.py: plugin_config = datasette.plugin_config(\"datasette-render-images\") or {}\r\ndatasette-render-html/datasette_render_html.py: config = datasette.plugin_config(\r\ndatasette-render-timestamps/datasette_render_timestamps/__init__.py: datasette.plugin_config(\r\ndatasette-permissions-sql/datasette_permissions_sql/__init__.py: for rule in datasette.plugin_config(\"datasette-permissions-sql\") or []:\r\ndatasette-mask-columns/datasette_mask_columns/__init__.py: datasette.plugin_config(\"datasette-mask-columns\", database=database) or {}\r\ndatasette-mask-columns/datasette_mask_columns/__init__.py: masks = datasette.plugin_config(\"datasette-mask-columns\", database=database) or {}\r\ndatasette-media/datasette_media/__init__.py: plugin_config = datasette.plugin_config(\"datasette-media\") or {}\r\ndatasette-insert/datasette_insert/__init__.py: plugin_config = datasette.plugin_config(\"datasette-insert\") or {}\r\ndatasette-indieauth/datasette_indieauth/__init__.py: plugin_config = datasette.plugin_config(\"datasette-indieauth\") or {}\r\ndatasette-graphql/datasette_graphql/__init__.py: config = datasette.plugin_config(\"datasette-graphql\") or {}\r\ndatasette-graphql/datasette_graphql/__init__.py: config = datasette.plugin_config(\"datasette-graphql\") or {}\r\ndatasette-graphql/datasette_graphql/utils.py: auto_camelcase=(datasette.plugin_config(\"datasette-graphql\") or {}).get(\r\ndatasette-graphql/datasette_graphql/utils.py: table_plugin_config = datasette.plugin_config(\r\ndatasette-graphql/datasette_graphql/utils.py: def config(self, key):\r\ndatasette-graphql/datasette_graphql/utils.py: return self.__wrapped__.config(key)\r\ndatasette-init/datasette_init/__init__.py: config = datasette.plugin_config(\"datasette-init\")\r\ndatasette-edit-templates/datasette_edit_templates/__init__.py: plugin_config = datasette.plugin_config(\"datasette-edit-templates\") or {}\r\ndatasette-cors/datasette_cors.py: config = datasette.plugin_config(\"datasette-cors\") or {}\r\ndatasette-cluster-map-old/build/lib/datasette_cluster_map/__init__.py: datasette.plugin_config(\"datasette-cluster-map\", database=database, table=table)\r\ndatasette-cluster-map/datasette_cluster_map/__init__.py: datasette.plugin_config(\"datasette-cluster-map\", database=database, table=table)\r\ndatasette-cluster-map/datasette_cluster_map/__init__.py: datasette.plugin_config(\"datasette-cluster-map\", database=database, table=table)\r\ndatasette-cluster-map/tests/test_cluster_map.py:async def test_plugin_config(db_path, config, table, expected_fragments):\r\ndatasette-configure-asgi/datasette_configure_asgi.py: configs = datasette.plugin_config(\"datasette-configure-asgi\") or []\r\ndatasette-configure-asgi/test_datasette_configure_asgi.py: def plugin_config(self, name):\r\ndatasette-cluster-map-old/datasette_cluster_map/__init__.py: datasette.plugin_config(\"datasette-cluster-map\", database=database, table=table)\r\ndatasette-auth-passwords/datasette_auth_passwords/__init__.py: config = datasette.plugin_config(\"datasette-auth-passwords\") or {}\r\ndatasette-auth-github/datasette_auth_github/views.py:def verify_config(config):\r\ndatasette-auth-github/datasette_auth_github/views.py: config = datasette.plugin_config(\"datasette-auth-github\")\r\ndatasette-auth-github/datasette_auth_github/views.py: verify_config(config)\r\ndatasette-auth-github/datasette_auth_github/views.py: config = datasette.plugin_config(\"datasette-auth-github\")\r\ndatasette-auth-github/datasette_auth_github/views.py: verify_config(config)\r\ndatasette-atom/datasette_atom/__init__.py: plugin_config = datasette.plugin_config(\"datasette-atom\")\r\ndatasette-auth-google/datasette_auth_google/__init__.py: config = datasette.plugin_config(\"datasette-auth-github\") or {}\r\ndatasette-auth-existing-cookies/test_datasette_auth_existing_cookies.py: def plugin_config(self, name):\r\ndatasette-auth-passwords/build/lib/datasette_auth_passwords/__init__.py: config = datasette.plugin_config(\"datasette-auth-passwords\") or {}\r\ndatasette-annotate/datasette_annotate/utils.py: plugin_config = datasette.plugin_config(\"datasette-annotate\") or {}\r\ndatasette-auth-existing-cookies/datasette_auth_existing_cookies/__init__.py: config = datasette.plugin_config(\"datasette-auth-existing-cookies\") or {}\r\ndatasette-auth-simple/datasette_auth_simple/__init__.py:datasette.plugin_config(\"datasette-auth-simple\")\r\ndatasette-auth-tokens/datasette_auth_tokens/__init__.py: config = datasette.plugin_config(\"datasette-auth-tokens\") or {}\r\ndatasette-block-robots/datasette_block_robots/__init__.py: config = datasette.plugin_config(\"datasette-block-robots\") or {}\r\ndatasette-block-robots/datasette_block_robots/__init__.py: config = datasette.plugin_config(\"datasette-block-robots\") or {}\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 750079085, "label": "Rename datasette.config() method to datasette.setting()"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1107#issuecomment-733245097", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1107", "id": 733245097, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzI0NTA5Nw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T21:31:10Z", "updated_at": "2020-11-24T21:31:10Z", "author_association": "OWNER", "body": "Most of these use `plugin_config` which is unaffected. It looks like the only code I need to worry about is this trick in `datasette-graphl`: https://github.com/simonw/datasette-graphql/blob/483c9a9e203bb90365def3df8b8f01dda1e75865/datasette_graphql/utils.py#L456-L460\r\n\r\n```python\r\nclass DatasetteSpecialConfig(wrapt.ObjectProxy):\r\n def config(self, key):\r\n if key == \"suggest_facets\":\r\n return False\r\n return self.__wrapped__.config(key)\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 750079085, "label": "Rename datasette.config() method to datasette.setting()"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1106#issuecomment-733245596", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1106", "id": 733245596, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzI0NTU5Ng==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T21:32:11Z", "updated_at": "2020-11-24T21:32:11Z", "author_association": "OWNER", "body": "https://docs.datasette.io/en/latest/settings.html is now live - need to redirect https://docs.datasette.io/en/latest/config.html to it using the ReadTheDocs redirects interface.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 749983857, "label": "Rebrand and redirect config.rst as settings.rst"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1106#issuecomment-733247101", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1106", "id": 733247101, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzI0NzEwMQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T21:35:29Z", "updated_at": "2020-11-24T21:36:04Z", "author_association": "OWNER", "body": "\"Edit_Redirects___Read_the_Docs\"\r\n\r\nhttps://docs.datasette.io/en/latest/config.html isn't redirecting though, even after I tried running a rebuild of the `latest` version.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 749983857, "label": "Rebrand and redirect config.rst as settings.rst"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1106#issuecomment-733248437", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1106", "id": 733248437, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzI0ODQzNw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T21:38:50Z", "updated_at": "2020-11-24T21:38:50Z", "author_association": "OWNER", "body": "I used an \"exact redirect\" instead and it worked:\r\n\r\n\"Edit_Redirects___Read_the_Docs\"\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 749983857, "label": "Rebrand and redirect config.rst as settings.rst"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1105#issuecomment-733249176", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1105", "id": 733249176, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzI0OTE3Ng==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T21:40:28Z", "updated_at": "2020-11-24T21:40:28Z", "author_association": "OWNER", "body": "This rebranding is complete - #1107 is a follow-up internal refactor.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 749982022, "label": "Rebrand config as settings"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1107#issuecomment-733257071", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1107", "id": 733257071, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzI1NzA3MQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T21:59:32Z", "updated_at": "2020-11-24T21:59:32Z", "author_association": "OWNER", "body": "I'm going to make this a documented method in https://docs.datasette.io/en/latest/internals.html#datasette-class", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 750079085, "label": "Rename datasette.config() method to datasette.setting()"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1107#issuecomment-733261501", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1107", "id": 733261501, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzI2MTUwMQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T22:09:11Z", "updated_at": "2020-11-24T22:09:11Z", "author_association": "OWNER", "body": "Documentation: https://docs.datasette.io/en/latest/internals.html#setting-key", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 750079085, "label": "Rename datasette.config() method to datasette.setting()"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/860#issuecomment-733287416", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/860", "id": 733287416, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzI4NzQxNg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T23:15:44Z", "updated_at": "2020-11-24T23:15:44Z", "author_association": "OWNER", "body": "I'm going to go with a plugin hook (and Datasette method) that returns individual values - so you ask it for e.g. the `license_url` for a specific table and it returns a string or `None`.\r\n\r\nThe default plugin hook implementation that ships with Datasette will then implement cascading lookups against `metadata.json` - but other plugins will be able to provide their own implementations, which should make it easy to build a plugin that lets you keep metadata in a database file and edit it interactively.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 642651572, "label": "Plugin hook for instance/database/table metadata"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/860#issuecomment-733287619", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/860", "id": 733287619, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzI4NzYxOQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T23:16:21Z", "updated_at": "2020-11-24T23:16:21Z", "author_association": "OWNER", "body": "I'll also allow any key to be looked up - so if users want to invent their own metadata keys other than the default `license_url` etc they can do so.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 642651572, "label": "Plugin hook for instance/database/table metadata"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/860#issuecomment-733288522", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/860", "id": 733288522, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzI4ODUyMg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T23:18:47Z", "updated_at": "2020-11-24T23:18:47Z", "author_association": "OWNER", "body": "In #942 I want to add support for per-column metadata - which means this new lookup mechanism will need to be able to answer the question \"what description is available for this column\".\r\n\r\nSo what should the `.metadata()` method look like? A couple of options:\r\n\r\n- `datasette.metadata(\"description\", table=x, database=y)` - can take optional `column=` too.\r\n- `datasette.table_metadata(\"description\", table=x, database=y)` and `datasette.database_metadata(\"description\", database=y)` and so on - multiple methods for the different types of metadata.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 642651572, "label": "Plugin hook for instance/database/table metadata"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/860#issuecomment-733288841", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/860", "id": 733288841, "node_id": "MDEyOklzc3VlQ29tbWVudDczMzI4ODg0MQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-11-24T23:19:47Z", "updated_at": "2020-11-24T23:20:24Z", "author_association": "OWNER", "body": "Here's what I have today - it's an undocumented `datasette.metadata()` method that returns a full JSON dictionary of values OR a single value if the optional `key=` argument is provided: https://github.com/simonw/datasette/blob/f2e2bfcdd9ad4891f3f66c9104c09943d943ffe4/datasette/app.py#L357-L388", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 642651572, "label": "Plugin hook for instance/database/table metadata"}, "performed_via_github_app": null}