\r\n sys.exit(load_entry_point('sqlite-utils', 'console_scripts', 'sqlite-utils')())\r\n File \"/Users/simon/.local/share/virtualenvs/sqlite-utils-C4Ilevlm/lib/python3.8/site-packages/click/core.py\", line 1137, in __call__\r\n return self.main(*args, **kwargs)\r\n File \"/Users/simon/.local/share/virtualenvs/sqlite-utils-C4Ilevlm/lib/python3.8/site-packages/click/core.py\", line 1090, in main\r\n sys.exit(e.exit_code)\r\nSystemExit: 0\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": 1250495688, "label": "Misleading progress bar against utf-16-le CSV input"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/439#issuecomment-1155771462", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/439", "id": 1155771462, "node_id": "IC_kwDOCGYnMM5E46xG", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T22:28:38Z", "updated_at": "2022-06-14T22:28:38Z", "author_association": "OWNER", "body": "Maybe this isn't a CSV field value problem - I tried this patch and didn't seem to hit the new breakpoints:\r\n```diff\r\ndiff --git a/sqlite_utils/utils.py b/sqlite_utils/utils.py\r\nindex d2ccc5f..f1b823a 100644\r\n--- a/sqlite_utils/utils.py\r\n+++ b/sqlite_utils/utils.py\r\n@@ -204,13 +204,17 @@ def _extra_key_strategy(\r\n # DictReader adds a 'None' key with extra row values\r\n if None not in row:\r\n yield row\r\n- elif ignore_extras:\r\n+ continue\r\n+ else:\r\n+ breakpoint()\r\n+ if ignore_extras:\r\n # ignoring row.pop(none) because of this issue:\r\n # https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1155358637\r\n row.pop(None) # type: ignore\r\n yield row\r\n elif not extras_key:\r\n extras = row.pop(None) # type: ignore\r\n+ breakpoint()\r\n raise RowError(\r\n \"Row {} contained these extra values: {}\".format(row, extras)\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": 1250495688, "label": "Misleading progress bar against utf-16-le CSV input"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/439#issuecomment-1155769216", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/439", "id": 1155769216, "node_id": "IC_kwDOCGYnMM5E46OA", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T22:24:49Z", "updated_at": "2022-06-14T22:25:06Z", "author_association": "OWNER", "body": "I have a hunch that this crash may be caused by a CSV value which is too long, as addressed at the library level in:\r\n- #440\r\n\r\nBut not yet addressed in the CLI tool, see:\r\n\r\n- #444\r\n\r\nEither way though, I really don't like that errors like this are swallowed!", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250495688, "label": "Misleading progress bar against utf-16-le CSV input"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1155767915", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1155767915, "node_id": "IC_kwDOCGYnMM5E455r", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T22:22:27Z", "updated_at": "2022-06-14T22:22:27Z", "author_association": "OWNER", "body": "I forgot to add equivalents of `extras_key=` and `ignore_extras=` to the CLI tool - will do that in a separate issue.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/439#issuecomment-1155767202", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/439", "id": 1155767202, "node_id": "IC_kwDOCGYnMM5E45ui", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T22:21:10Z", "updated_at": "2022-06-14T22:21:10Z", "author_association": "OWNER", "body": "I can't figure out why that error is being swallowed like that. The most likely culprit was this code: \r\n\r\nhttps://github.com/simonw/sqlite-utils/blob/1b09538bc6c1fda773590f3e600993ef06591041/sqlite_utils/cli.py#L1021-L1043\r\n\r\nBut I tried changing it like this:\r\n\r\n```diff\r\ndiff --git a/sqlite_utils/cli.py b/sqlite_utils/cli.py\r\nindex 86eddfb..ed26fdd 100644\r\n--- a/sqlite_utils/cli.py\r\n+++ b/sqlite_utils/cli.py\r\n@@ -1023,6 +1023,7 @@ def insert_upsert_implementation(\r\n docs, pk=pk, batch_size=batch_size, alter=alter, **extra_kwargs\r\n )\r\n except Exception as e:\r\n+ raise\r\n if (\r\n isinstance(e, sqlite3.OperationalError)\r\n and e.args\r\n```\r\nAnd your steps to reproduce still got to 49% and then failed silently.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250495688, "label": "Misleading progress bar against utf-16-le CSV input"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/432#issuecomment-1155764428", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/432", "id": 1155764428, "node_id": "IC_kwDOCGYnMM5E45DM", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T22:16:21Z", "updated_at": "2022-06-14T22:16:21Z", "author_association": "OWNER", "body": "Initial idea of how the `.table()` method would change:\r\n```diff\r\ndiff --git a/sqlite_utils/db.py b/sqlite_utils/db.py\r\nindex 7a06304..3ecb40b 100644\r\n--- a/sqlite_utils/db.py\r\n+++ b/sqlite_utils/db.py\r\n@@ -474,11 +474,12 @@ class Database:\r\n self._tracer(sql, None)\r\n return self.conn.executescript(sql)\r\n \r\n- def table(self, table_name: str, **kwargs) -> Union[\"Table\", \"View\"]:\r\n+ def table(self, table_name: str, alias: Optional[str] = None, **kwargs) -> Union[\"Table\", \"View\"]:\r\n \"\"\"\r\n Return a table object, optionally configured with default options.\r\n \r\n :param table_name: Name of the table\r\n+ :param alias: The database alias to use, if referring to a table in another connected database\r\n \"\"\"\r\n klass = View if table_name in self.view_names() else Table\r\n return klass(self, table_name, **kwargs)\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1236693079, "label": "Support `rows_where()`, `delete_where()` etc for attached alias databases"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/432#issuecomment-1155764064", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/432", "id": 1155764064, "node_id": "IC_kwDOCGYnMM5E449g", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T22:15:44Z", "updated_at": "2022-06-14T22:15:44Z", "author_association": "OWNER", "body": "Implementing this would be a pretty big change - initial instinct is that I'd need to introduce a `self.alias` property to `Queryable` (the subclass of `Table` and `View`) and a new `self.name_with_alias` getter which returns `alias.tablename` if `alias` is set to a not-None value. Then I'd need to rewrite every piece of code like this:\r\n\r\nhttps://github.com/simonw/sqlite-utils/blob/1b09538bc6c1fda773590f3e600993ef06591041/sqlite_utils/db.py#L1161\r\n\r\nTo look like this instead:\r\n```python\r\n sql = \"select {} from [{}]\".format(select, self.name_with_alias)\r\n```\r\nBut some parts would be harder - for example:\r\n\r\nhttps://github.com/simonw/sqlite-utils/blob/1b09538bc6c1fda773590f3e600993ef06591041/sqlite_utils/db.py#L1227-L1231\r\n\r\nWould have to know to query `alias.sqlite_master` instead.\r\n\r\nThe cached table counts logic like this would need a bunch of changes too:\r\n\r\nhttps://github.com/simonw/sqlite-utils/blob/1b09538bc6c1fda773590f3e600993ef06591041/sqlite_utils/db.py#L644-L657", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1236693079, "label": "Support `rows_where()`, `delete_where()` etc for attached alias databases"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/432#issuecomment-1155759857", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/432", "id": 1155759857, "node_id": "IC_kwDOCGYnMM5E437x", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T22:09:07Z", "updated_at": "2022-06-14T22:09:07Z", "author_association": "OWNER", "body": "Third option, and I think the one I like the best:\r\n```python\r\nrows = db.table(\"tablename\", alias=\"otherdb\").rows_where(alias=\"otherdb\")\r\n```\r\nThe `db.table(tablename)` method already exists as an alternative to `db[tablename]`: https://sqlite-utils.datasette.io/en/stable/python-api.html#python-api-table-configuration\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1236693079, "label": "Support `rows_where()`, `delete_where()` etc for attached alias databases"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/432#issuecomment-1155758664", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/432", "id": 1155758664, "node_id": "IC_kwDOCGYnMM5E43pI", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T22:07:50Z", "updated_at": "2022-06-14T22:07:50Z", "author_association": "OWNER", "body": "Another potential fix: add a `alias=` parameter to `rows_where()` and other similar methods. Then you could do this:\r\n\r\n```python\r\nrows = db[\"tablename\"].rows_where(alias=\"otherdb\")\r\n```\r\nThis feels wrong to me: `db[\"tablename\"]` is the bit that is supposed to return a table object. Having part of what that table object is exist as a parameter to other methods is confusing.\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1236693079, "label": "Support `rows_where()`, `delete_where()` etc for attached alias databases"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/432#issuecomment-1155756742", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/432", "id": 1155756742, "node_id": "IC_kwDOCGYnMM5E43LG", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T22:05:38Z", "updated_at": "2022-06-14T22:05:49Z", "author_association": "OWNER", "body": "I don't like the idea of `table_names()` returning names of tables from connected databases as well, because it feels like it could lead to surprising behaviour - especially if those connected databases turn to have table names that are duplicated in the main connected database.\r\n\r\nIt would be neat if functions like `.rows_where()` worked though.\r\n\r\nOne thought would be to support something like this:\r\n```python\r\nrows = db[\"otherdb.tablename\"].rows_where()\r\n```\r\nBut... `.` is a valid character in a SQLite table name. So `\"otherdb.tablename\"` might ambiguously refer to a table called `tablename` in a connected database with the alias `otherdb`, OR a table in the current database with the name `otherdb.tablename`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1236693079, "label": "Support `rows_where()`, `delete_where()` etc for attached alias databases"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/431#issuecomment-1155753397", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/431", "id": 1155753397, "node_id": "IC_kwDOCGYnMM5E42W1", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T22:01:38Z", "updated_at": "2022-06-14T22:01:38Z", "author_association": "OWNER", "body": "Yeah, I think it would be neat if the library could support self-referential many-to-many in a nice way.\r\n\r\nI'm not sure about the `left_name/right_name` design though. Would it be possible to have this work as the user intends, by spotting that the other table name `\"people\"` matches the name of the current table?\r\n\r\n```python\r\ndb[\"people\"].insert({\"name\": \"Mary\"}, pk=\"name\").m2m(\r\n \"people\", [{\"name\": \"Michael\"}, {\"name\": \"Suzy\"}], m2m_table=\"parent_child\", pk=\"name\"\r\n)\r\n```\r\nThe created table could look like this:\r\n```sql\r\nCREATE TABLE [parent_child] (\r\n [people_id_1] TEXT REFERENCES [people]([name]),\r\n [people_id_2] TEXT REFERENCES [people]([name]),\r\n PRIMARY KEY ([people_id_1], [people_id_2])\r\n)\r\n```\r\nI've not thought very hard about this, so the design I'm proposing here might not work.\r\n\r\nAre there other reasons people might wan the `left_name=` and `right_name=` parameters? If so then I'm much happier with those.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1227571375, "label": "Allow making m2m relation of a table to itself"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/441#issuecomment-1155750270", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/441", "id": 1155750270, "node_id": "IC_kwDOCGYnMM5E41l-", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T21:57:57Z", "updated_at": "2022-06-14T21:57:57Z", "author_association": "OWNER", "body": "I added `where=` and `where_args=` parameters to that `.search()` method - updated documentation is here: https://sqlite-utils.datasette.io/en/latest/python-api.html#searching-with-table-search", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1257724585, "label": "Combining `rows_where()` and `search()` to limit which rows are searched"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/433#issuecomment-1155749696", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/433", "id": 1155749696, "node_id": "IC_kwDOCGYnMM5E41dA", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T21:57:05Z", "updated_at": "2022-06-14T21:57:05Z", "author_association": "OWNER", "body": "Marking this as help wanted because I can't figure out how to replicate it!", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1239034903, "label": "CLI eats my cursor"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/442#issuecomment-1155748444", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/442", "id": 1155748444, "node_id": "IC_kwDOCGYnMM5E41Jc", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T21:55:15Z", "updated_at": "2022-06-14T21:55:15Z", "author_association": "OWNER", "body": "Documentation: https://sqlite-utils.datasette.io/en/latest/python-api.html#setting-the-maximum-csv-field-size-limit", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1269886084, "label": "`maximize_csv_field_size_limit()` utility function"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/442#issuecomment-1155714131", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/442", "id": 1155714131, "node_id": "IC_kwDOCGYnMM5E4sxT", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T21:07:50Z", "updated_at": "2022-06-14T21:07:50Z", "author_association": "OWNER", "body": "Here's the commit where I added that originally, including a test: https://github.com/simonw/sqlite-utils/commit/1a93b72ba710ea2271eaabc204685a27d2469374", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1269886084, "label": "`maximize_csv_field_size_limit()` utility function"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1155672675", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1155672675, "node_id": "IC_kwDOCGYnMM5E4ipj", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T20:19:07Z", "updated_at": "2022-06-14T20:19:07Z", "author_association": "OWNER", "body": "Documentation: https://sqlite-utils.datasette.io/en/latest/python-api.html#reading-rows-from-a-file", "reactions": "{\"total_count\": 1, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 1, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/443#issuecomment-1155672522", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/443", "id": 1155672522, "node_id": "IC_kwDOCGYnMM5E4inK", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T20:18:58Z", "updated_at": "2022-06-14T20:18:58Z", "author_association": "OWNER", "body": "New documentation: https://sqlite-utils.datasette.io/en/latest/python-api.html#reading-rows-from-a-file", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1269998342, "label": "Make `utils.rows_from_file()` a documented API"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1155666672", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1155666672, "node_id": "IC_kwDOCGYnMM5E4hLw", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T20:11:52Z", "updated_at": "2022-06-14T20:11:52Z", "author_association": "OWNER", "body": "I'm going to rename `restkey` to `extras_key` for consistency with `ignore_extras`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/441#issuecomment-1155421299", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/441", "id": 1155421299, "node_id": "IC_kwDOCGYnMM5E3lRz", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T16:23:52Z", "updated_at": "2022-06-14T16:23:52Z", "author_association": "OWNER", "body": "Actually I have a thought for something that could help here: I could add a mechanism for inserting additional where filters and parameters into that `.search()` method.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1257724585, "label": "Combining `rows_where()` and `search()` to limit which rows are searched"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1155389614", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1155389614, "node_id": "IC_kwDOCGYnMM5E3diu", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T15:54:03Z", "updated_at": "2022-06-14T15:54:03Z", "author_association": "OWNER", "body": "Filed an issue against `python/typeshed`:\r\n\r\n- https://github.com/python/typeshed/issues/8075", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/412#issuecomment-1155364367", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/412", "id": 1155364367, "node_id": "IC_kwDOCGYnMM5E3XYP", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T15:36:28Z", "updated_at": "2022-06-14T15:36:28Z", "author_association": "OWNER", "body": "Here's as far as I got with my initial prototype, in `sqlite_utils/pandas.py`:\r\n\r\n```python\r\nfrom .db import Database as _Database, Table as _Table, View as _View\r\nimport pandas as pd\r\nfrom typing import (\r\n Iterable,\r\n Union,\r\n Optional,\r\n)\r\n\r\n\r\nclass Database(_Database):\r\n def query(\r\n self, sql: str, params: Optional[Union[Iterable, dict]] = None\r\n ) -> pd.DataFrame:\r\n return pd.DataFrame(super().query(sql, params))\r\n\r\n def table(self, table_name: str, **kwargs) -> Union[\"Table\", \"View\"]:\r\n \"Return a table object, optionally configured with default options.\"\r\n klass = View if table_name in self.view_names() else Table\r\n return klass(self, table_name, **kwargs)\r\n\r\n\r\nclass PandasQueryable:\r\n def rows_where(\r\n self,\r\n where: str = None,\r\n where_args: Optional[Union[Iterable, dict]] = None,\r\n order_by: str = None,\r\n select: str = \"*\",\r\n limit: int = None,\r\n offset: int = None,\r\n ) -> pd.DataFrame:\r\n return pd.DataFrame(\r\n super().rows_where(\r\n where,\r\n where_args,\r\n order_by=order_by,\r\n select=select,\r\n limit=limit,\r\n offset=offset,\r\n )\r\n )\r\n\r\n\r\nclass Table(PandasQueryable, _Table):\r\n pass\r\n\r\n\r\nclass View(PandasQueryable, _View):\r\n pass\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1160182768, "label": "Optional Pandas integration"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1155358637", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1155358637, "node_id": "IC_kwDOCGYnMM5E3V-t", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T15:31:34Z", "updated_at": "2022-06-14T15:31:34Z", "author_association": "OWNER", "body": "Getting this past `mypy` is really hard!\r\n\r\n```\r\n% mypy sqlite_utils\r\nsqlite_utils/utils.py:189: error: No overload variant of \"pop\" of \"MutableMapping\" matches argument type \"None\"\r\nsqlite_utils/utils.py:189: note: Possible overload variants:\r\nsqlite_utils/utils.py:189: note: def pop(self, key: str) -> str\r\nsqlite_utils/utils.py:189: note: def [_T] pop(self, key: str, default: Union[str, _T] = ...) -> Union[str, _T]\r\n```\r\nThat's because of this line:\r\n\r\n row.pop(key=None)\r\n\r\nWhich is legit here - we have a dictionary where one of the keys is `None` and we want to remove that key. But the baked in type is apparently `def pop(self, key: str) -> str`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1155350755", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1155350755, "node_id": "IC_kwDOCGYnMM5E3UDj", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T15:25:18Z", "updated_at": "2022-06-14T15:25:18Z", "author_association": "OWNER", "body": "That broke `mypy`:\r\n\r\n`sqlite_utils/utils.py:229: error: Incompatible types in assignment (expression has type \"Iterable[Dict[Any, Any]]\", variable has type \"DictReader[str]\")`", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1155317293", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1155317293, "node_id": "IC_kwDOCGYnMM5E3L4t", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T15:04:01Z", "updated_at": "2022-06-14T15:04:01Z", "author_association": "OWNER", "body": "I think that's unavoidable: it looks like `csv.Sniffer` only works if you feed it a CSV file with an equal number of values in each row, which is understandable.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1155310521", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1155310521, "node_id": "IC_kwDOCGYnMM5E3KO5", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-14T14:58:50Z", "updated_at": "2022-06-14T14:58:50Z", "author_association": "OWNER", "body": "Interesting challenge in writing tests for this: if you give `csv.Sniffer` a short example with an invalid row in it sometimes it picks the wrong delimiter!\r\n\r\n id,name\\r\\n1,Cleo,oops\r\n\r\nIt decided the delimiter there was `e`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1154475454", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1154475454, "node_id": "IC_kwDOCGYnMM5Ez-W-", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-13T21:52:03Z", "updated_at": "2022-06-13T21:52:03Z", "author_association": "OWNER", "body": "The exception will be called `RowError`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1154474482", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1154474482, "node_id": "IC_kwDOCGYnMM5Ez-Hy", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-13T21:50:59Z", "updated_at": "2022-06-13T21:51:24Z", "author_association": "OWNER", "body": "Decision: I'm going to default to raising an exception if a row has too many values in it.\r\n\r\nYou'll be able to pass `ignore_extras=True` to ignore those extra values, or pass `restkey=\"the_rest\"` to stick them in a list in the `restkey` column.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1154457893", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1154457893, "node_id": "IC_kwDOCGYnMM5Ez6El", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-13T21:29:02Z", "updated_at": "2022-06-13T21:29:02Z", "author_association": "OWNER", "body": "Here's the current function signature for `rows_from_file()`:\r\n\r\nhttps://github.com/simonw/sqlite-utils/blob/26e6d2622c57460a24ffdd0128bbaac051d51a5f/sqlite_utils/utils.py#L174-L179", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1154457028", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1154457028, "node_id": "IC_kwDOCGYnMM5Ez53E", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-13T21:28:03Z", "updated_at": "2022-06-13T21:28:03Z", "author_association": "OWNER", "body": "Whatever I decide, I can implement it in `rows_from_file()`, maybe as an optional parameter - then decide how to call it from the `sqlite-utils insert` CLI (perhaps with a new option there too).", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1154456183", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1154456183, "node_id": "IC_kwDOCGYnMM5Ez5p3", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-13T21:26:55Z", "updated_at": "2022-06-13T21:26:55Z", "author_association": "OWNER", "body": "So I need to make a design decision here: what should `sqlite-utils` do with CSV files that have rows with more values than there are headings?\r\n\r\nSome options:\r\n\r\n- Ignore those extra fields entirely - silently drop that data. I'm not keen on this.\r\n- Throw an error. The library does this already, but the error is incomprehensible - it could turn into a useful, human-readable error instead.\r\n- Put the data in a JSON list in a column with a known name (`None` is not a valid column name, so not that). This could be something like `_restkey` or `_values_with_no_heading`. This feels like a better option, but I'd need to carefully pick a name for it - and come up with an answer for the question of what to do if the CSV file being important already uses that heading name for something else.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1154454127", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1154454127, "node_id": "IC_kwDOCGYnMM5Ez5Jv", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-13T21:24:18Z", "updated_at": "2022-06-13T21:24:18Z", "author_association": "OWNER", "body": "That weird behaviour is documented here: https://docs.python.org/3/library/csv.html#csv.DictReader\r\n\r\n> If a row has more fields than fieldnames, the remaining data is put in a list and stored with the fieldname specified by *restkey* (which defaults to `None`). If a non-blank row has fewer fields than fieldnames, the missing values are filled-in with the value of *restval* (which defaults to `None`).", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1154453319", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1154453319, "node_id": "IC_kwDOCGYnMM5Ez49H", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-13T21:23:16Z", "updated_at": "2022-06-13T21:23:16Z", "author_association": "OWNER", "body": "Aha! I think I see what's happening here. Here's what `DictReader` does if one of the lines has too many items in it:\r\n\r\n```pycon\r\n>>> import csv, io\r\n>>> list(csv.DictReader(io.StringIO(\"id,name\\n1,Cleo,nohead\\n2,Barry\")))\r\n[{'id': '1', 'name': 'Cleo', None: ['nohead']}, {'id': '2', 'name': 'Barry'}]\r\n```\r\nSee how that row with too many items gets this:\r\n`[{'id': '1', 'name': 'Cleo', None: ['nohead']}`\r\n\r\nThat's a `None` for the key and (weirdly) a list containing the single item for the value!\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": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1154449442", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1154449442, "node_id": "IC_kwDOCGYnMM5Ez4Ai", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-13T21:18:26Z", "updated_at": "2022-06-13T21:20:12Z", "author_association": "OWNER", "body": "Here are full steps to replicate the bug:\r\n```python\r\nfrom urllib.request import urlopen\r\nimport sqlite_utils\r\ndb = sqlite_utils.Database(memory=True)\r\nwith urlopen(\"https://artsdatabanken.no/Fab2018/api/export/csv\") as fab:\r\n reader, other = sqlite_utils.utils.rows_from_file(fab, encoding=\"utf-16le\")\r\n db[\"fab2018\"].insert_all(reader, pk=\"Id\")\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1154396400", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1154396400, "node_id": "IC_kwDOCGYnMM5EzrDw", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-13T20:28:25Z", "updated_at": "2022-06-13T20:28:25Z", "author_association": "OWNER", "body": "Fixing that `key` thing (to ignore any key that is `None`) revealed a new bug:\r\n\r\n```\r\nFile ~/Dropbox/Development/sqlite-utils/sqlite_utils/utils.py:376, in hash_record(record, keys)\r\n 373 if keys is not None:\r\n 374 to_hash = {key: record[key] for key in keys}\r\n 375 return hashlib.sha1(\r\n--> 376 json.dumps(to_hash, separators=(\",\", \":\"), sort_keys=True, default=repr).encode(\r\n 377 \"utf8\"\r\n 378 )\r\n 379 ).hexdigest()\r\n\r\nFile ~/.pyenv/versions/3.8.2/lib/python3.8/json/__init__.py:234, in dumps(obj, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, default, sort_keys, **kw)\r\n 232 if cls is None:\r\n 233 cls = JSONEncoder\r\n--> 234 return cls(\r\n 235 skipkeys=skipkeys, ensure_ascii=ensure_ascii,\r\n 236 check_circular=check_circular, allow_nan=allow_nan, indent=indent,\r\n 237 separators=separators, default=default, sort_keys=sort_keys,\r\n 238 **kw).encode(obj)\r\n\r\nFile ~/.pyenv/versions/3.8.2/lib/python3.8/json/encoder.py:199, in JSONEncoder.encode(self, o)\r\n 195 return encode_basestring(o)\r\n 196 # This doesn't pass the iterator directly to ''.join() because the\r\n 197 # exceptions aren't as detailed. The list call should be roughly\r\n 198 # equivalent to the PySequence_Fast that ''.join() would do.\r\n--> 199 chunks = self.iterencode(o, _one_shot=True)\r\n 200 if not isinstance(chunks, (list, tuple)):\r\n 201 chunks = list(chunks)\r\n\r\nFile ~/.pyenv/versions/3.8.2/lib/python3.8/json/encoder.py:257, in JSONEncoder.iterencode(self, o, _one_shot)\r\n 252 else:\r\n 253 _iterencode = _make_iterencode(\r\n 254 markers, self.default, _encoder, self.indent, floatstr,\r\n 255 self.key_separator, self.item_separator, self.sort_keys,\r\n 256 self.skipkeys, _one_shot)\r\n--> 257 return _iterencode(o, 0)\r\n\r\nTypeError: '<' not supported between instances of 'NoneType' and 'str'\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1154387591", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1154387591, "node_id": "IC_kwDOCGYnMM5Ezo6H", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-13T20:17:51Z", "updated_at": "2022-06-13T20:17:51Z", "author_association": "OWNER", "body": "I don't understand why that works but calling `insert_all()` does not.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1154386795", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1154386795, "node_id": "IC_kwDOCGYnMM5Ezotr", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-13T20:16:53Z", "updated_at": "2022-06-13T20:16:53Z", "author_association": "OWNER", "body": "Steps to demonstrate that `sqlite-utils insert` is not affected:\r\n\r\n```bash\r\ncurl -o artsdatabanken.csv https://artsdatabanken.no/Fab2018/api/export/csv\r\nsqlite-utils insert arts.db artsdatabanken artsdatabanken.csv --sniff --csv --encoding utf-16le\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/440#issuecomment-1154385916", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/440", "id": 1154385916, "node_id": "IC_kwDOCGYnMM5Ezof8", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-13T20:15:49Z", "updated_at": "2022-06-13T20:15:49Z", "author_association": "OWNER", "body": "`rows_from_file()` isn't part of the documented API but maybe it should be!", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1250629388, "label": "CSV files with too many values in a row cause errors"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/441#issuecomment-1154373361", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/441", "id": 1154373361, "node_id": "IC_kwDOCGYnMM5Ezlbx", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-06-13T20:01:25Z", "updated_at": "2022-06-13T20:01:25Z", "author_association": "OWNER", "body": "Yeah, at the moment the best way to do this is with `search_sql()`, but you're right it really isn't very intuitive.\r\n\r\nHere's how I would do this, using a CTE trick to combine the queries:\r\n```python\r\nsearch_sql = db[\"articles\"].search_sql(columns=[\"title\", \"author\"]))\r\nsql = f\"\"\"\r\nwith search_results as ({search_sql})\r\nselect * from search_results where owner = :owner\r\n\"\"\"\r\nresults = db.query(sql, {\"query\": \"my search query\", \"owner\": \"my owner\"})\r\n```\r\nI'm not sure if `sqlite-utils` should ever evolve to provide a better way of doing this kind of thing to be honest - if it did, it would turn into more of an ORM. Something like [PeeWee](http://docs.peewee-orm.com/en/latest/) may be a better option here.", "reactions": "{\"total_count\": 1, \"+1\": 1, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1257724585, "label": "Combining `rows_where()` and `search()` to limit which rows are searched"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/pull/1740#issuecomment-1142556455", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1740", "id": 1142556455, "node_id": "IC_kwDOBm6k_c5EGgcn", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-31T19:25:49Z", "updated_at": "2022-05-31T19:25:49Z", "author_association": "OWNER", "body": "Thanks, this looks like a good idea to me.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1226106354, "label": "chore: Set permissions for GitHub actions"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/pull/437#issuecomment-1141488533", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/437", "id": 1141488533, "node_id": "IC_kwDOCGYnMM5ECbuV", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-30T21:32:36Z", "updated_at": "2022-05-30T21:32:36Z", "author_association": "OWNER", "body": "Thanks!", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1244294227, "label": "docs to dogs"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/435#issuecomment-1133417432", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/435", "id": 1133417432, "node_id": "IC_kwDOCGYnMM5DjpPY", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T21:56:10Z", "updated_at": "2022-05-20T21:56:10Z", "author_association": "OWNER", "body": "Before:\r\n\r\n![sqlite-utils-datasette-io-en-stable-reference-html](https://user-images.githubusercontent.com/9599/169617623-457b4c01-3713-4e5c-b3c3-8574a2214238.png)\r\n\r\nAfter:\r\n\r\n![sqlite-utils-datasette-io-en-latest-reference-html](https://user-images.githubusercontent.com/9599/169617666-ba388167-36b8-4a3e-be35-931ee2ab6b3b.png)\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": 1243704847, "label": "Switch to Furo documentation theme"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/sqlite-utils/issues/435#issuecomment-1133416698", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/435", "id": 1133416698, "node_id": "IC_kwDOCGYnMM5DjpD6", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T21:54:43Z", "updated_at": "2022-05-20T21:54:43Z", "author_association": "OWNER", "body": "Done: https://sqlite-utils.datasette.io/en/latest/reference.html", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1243704847, "label": "Switch to Furo documentation theme"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133396285", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133396285, "node_id": "IC_kwDOBm6k_c5DjkE9", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T21:28:29Z", "updated_at": "2022-05-20T21:28:29Z", "author_association": "OWNER", "body": "That fixed it:\r\n\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": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133348094", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133348094, "node_id": "IC_kwDOBm6k_c5DjYT-", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T20:40:09Z", "updated_at": "2022-05-20T20:40:09Z", "author_association": "OWNER", "body": "Relevant JavaScript: https://github.com/simonw/datasette/blob/1d33fd03b3c211e0f48a8f3bde83880af89e4e69/docs/_static/js/custom.js#L20-L24", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133347051", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133347051, "node_id": "IC_kwDOBm6k_c5DjYDr", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T20:39:17Z", "updated_at": "2022-05-20T20:39:17Z", "author_association": "OWNER", "body": "Now live at https://docs.datasette.io/en/latest/ - the JavaScript that adds the banner about that not being the stable version doesn't seem to work though.\r\n\r\nBefore:\r\n\r\n\r\n\r\nAfter:\r\n\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": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133335940", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133335940, "node_id": "IC_kwDOBm6k_c5DjVWE", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T20:30:29Z", "updated_at": "2022-05-20T20:30:29Z", "author_association": "OWNER", "body": "I think the trick will be to extend the `base.html` template from Furo using the same trick I used in https://til.simonwillison.net/readthedocs/custom-sphinx-templates\r\n\r\nhttps://github.com/pradyunsg/furo/blob/2022.04.07/src/furo/theme/furo/base.html - the `site_meta` block looks good.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133333144", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133333144, "node_id": "IC_kwDOBm6k_c5DjUqY", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T20:28:25Z", "updated_at": "2022-05-20T20:28:25Z", "author_association": "OWNER", "body": "One last question: how to include the Plausible analytics?\r\n\r\nFuro doesn't have any specific tools for this:\r\n\r\n- https://github.com/pradyunsg/furo/discussions/243", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133331997", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133331997, "node_id": "IC_kwDOBm6k_c5DjUYd", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T20:27:31Z", "updated_at": "2022-05-20T20:27:31Z", "author_association": "OWNER", "body": "I'm going to move my custom JavaScript from `layout.html` into `js/custom.js`, similar to how the custom CSS works.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133331564", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133331564, "node_id": "IC_kwDOBm6k_c5DjURs", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T20:27:12Z", "updated_at": "2022-05-20T20:27:12Z", "author_association": "OWNER", "body": "This seems to work for `brand.html`:\r\n\r\n```html+jinja\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": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133310253", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133310253, "node_id": "IC_kwDOBm6k_c5DjPEt", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T20:11:00Z", "updated_at": "2022-05-20T20:11:00Z", "author_association": "OWNER", "body": "Oh but `rg display_version` is a lot more interesting:\r\n```\r\nlib/python3.10/site-packages/sphinx/builders/html/__init__.py:from sphinx import __display_version__, package_dir\r\nlib/python3.10/site-packages/sphinx/builders/html/__init__.py: 'sphinx_version': __display_version__,\r\nlib/python3.10/site-packages/sphinx/application.py: logger.info(bold(__('Running Sphinx v%s') % sphinx.__display_version__))\r\nlib/python3.10/site-packages/sphinx/application.py: if self.config.needs_sphinx and self.config.needs_sphinx > sphinx.__display_version__:\r\nlib/python3.10/site-packages/sphinx/application.py: if version > sphinx.__display_version__[:3]:\r\nlib/python3.10/site-packages/sphinx/cmd/build.py:from sphinx import __display_version__, package_dir\r\nlib/python3.10/site-packages/sphinx/cmd/build.py: version='%%(prog)s %s' % __display_version__)\r\nlib/python3.10/site-packages/sphinx/cmd/make_mode.py: print(bold(\"Sphinx v%s\" % sphinx.__display_version__))\r\nlib/python3.10/site-packages/sphinx/__init__.py:__display_version__ = __version__ # used for command line version\r\nlib/python3.10/site-packages/sphinx/__init__.py: __display_version__ = __version__\r\nlib/python3.10/site-packages/sphinx/__init__.py: __display_version__ += '/' + ret.stdout.strip()\r\nlib/python3.10/site-packages/sphinx/ext/githubpages.py: return {'version': sphinx.__display_version__, 'parallel_read_safe': True}\r\nlib/python3.10/site-packages/sphinx/ext/intersphinx.py: 'version': sphinx.__display_version__,\r\nlib/python3.10/site-packages/sphinx/cmd/quickstart.py:from sphinx import __display_version__, package_dir\r\nlib/python3.10/site-packages/sphinx/cmd/quickstart.py: print(bold(__('Welcome to the Sphinx %s quickstart utility.')) % __display_version__)\r\nlib/python3.10/site-packages/sphinx/cmd/quickstart.py: version='%%(prog)s %s' % __display_version__)\r\nlib/python3.10/site-packages/sphinx/ext/viewcode.py: 'version': sphinx.__display_version__,\r\nlib/python3.10/site-packages/sphinx/util/__init__.py: (sphinx.__display_version__,\r\nlib/python3.10/site-packages/sphinx/ext/ifconfig.py: return {'version': sphinx.__display_version__, 'parallel_read_safe': True}\r\nlib/python3.10/site-packages/sphinx/ext/todo.py: 'version': sphinx.__display_version__,\r\nlib/python3.10/site-packages/sphinx/ext/doctest.py: return {'version': sphinx.__display_version__, 'parallel_read_safe': True}\r\nlib/python3.10/site-packages/sphinx/ext/autosummary/__init__.py: return {'version': sphinx.__display_version__, 'parallel_read_safe': True}\r\nlib/python3.10/site-packages/sphinx/ext/napoleon/__init__.py:from sphinx import __display_version__ as __version__\r\nlib/python3.10/site-packages/sphinx/ext/autosummary/generate.py:from sphinx import __display_version__, package_dir\r\nlib/python3.10/site-packages/sphinx/ext/autosummary/generate.py: version='%%(prog)s %s' % __display_version__)\r\nlib/python3.10/site-packages/sphinx/ext/inheritance_diagram.py: return {'version': sphinx.__display_version__, 'parallel_read_safe': True}\r\nlib/python3.10/site-packages/sphinx/ext/imgmath.py: return {'version': sphinx.__display_version__, 'parallel_read_safe': True}\r\nlib/python3.10/site-packages/sphinx/ext/linkcode.py: return {'version': sphinx.__display_version__, 'parallel_read_safe': True}\r\nlib/python3.10/site-packages/sphinx/ext/coverage.py: return {'version': sphinx.__display_version__, 'parallel_read_safe': True}\r\nlib/python3.10/site-packages/sphinx/writers/texinfo.py:from sphinx import __display_version__, addnodes\r\nlib/python3.10/site-packages/sphinx/writers/texinfo.py:@*Generated by Sphinx \"\"\" + __display_version__ + \"\"\".@*\r\nlib/python3.10/site-packages/sphinx/ext/graphviz.py: return {'version': sphinx.__display_version__, 'parallel_read_safe': True}\r\nlib/python3.10/site-packages/sphinx/ext/mathjax.py: return {'version': sphinx.__display_version__, 'parallel_read_safe': True}\r\nlib/python3.10/site-packages/sphinx/ext/extlinks.py: return {'version': sphinx.__display_version__, 'parallel_read_safe': True}\r\nlib/python3.10/site-packages/sphinx/ext/apidoc.py:from sphinx import __display_version__, package_dir\r\nlib/python3.10/site-packages/sphinx/ext/apidoc.py: version='%%(prog)s %s' % __display_version__)\r\nlib/python3.10/site-packages/sphinx/ext/autodoc/type_comment.py: return {'version': sphinx.__display_version__, 'parallel_read_safe': True}\r\nlib/python3.10/site-packages/sphinx/ext/autodoc/__init__.py: return {'version': sphinx.__display_version__, 'parallel_read_safe': True}\r\nlib/python3.10/site-packages/pip/_internal/models/target_python.py: display_version = None\r\nlib/python3.10/site-packages/pip/_internal/models/target_python.py: display_version = '.'.join(\r\nlib/python3.10/site-packages/pip/_internal/models/target_python.py: ('version_info', display_version),\r\nlib/python3.10/site-packages/sphinx_rtd_theme/theme.conf:display_version = True\r\nlib/python3.10/site-packages/sphinx_rtd_theme/layout.html: {%- if theme_display_version %}\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133309452", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133309452, "node_id": "IC_kwDOBm6k_c5DjO4M", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T20:10:36Z", "updated_at": "2022-05-20T20:10:36Z", "author_association": "OWNER", "body": "Weird, I cannot figure out this `theme_display_version` thing - I even tried this:\r\n```bash\r\ncd /tmp\r\nmkdir s\r\ncd s\r\npython3 -m venv venv\r\nsource venv/bin/activate\r\npip install sphinx_rtd_theme\r\ncd venv\r\nrg theme_display_version\r\n```\r\nAnd got just that one reference:\r\n```\r\nlib/python3.10/site-packages/sphinx_rtd_theme/layout.html\r\n154: {%- if theme_display_version %}\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": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133299417", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133299417, "node_id": "IC_kwDOBm6k_c5DjMbZ", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T20:05:34Z", "updated_at": "2022-05-20T20:05:34Z", "author_association": "OWNER", "body": "I can't get that thing that displays the version working.\r\n\r\nhttps://github.com/readthedocs/sphinx_rtd_theme/blob/9264091087620d421b0804c00937b00980ac3916/sphinx_rtd_theme/layout.html#L154 is where`sphinx_rtd_theme` implements it - `{%- if theme_display_version %}` - but I can't find where that variable is first set, from searching both that theme and Sphinx itself!", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133288501", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133288501, "node_id": "IC_kwDOBm6k_c5DjJw1", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T20:00:17Z", "updated_at": "2022-05-20T20:00:17Z", "author_association": "OWNER", "body": "Here's a TIL from when I first customized the `layout.html` template: https://til.simonwillison.net/readthedocs/custom-sphinx-templates\r\n\r\nNote that Furo doesn't use `layout.html` so I need to completely change how I did that.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1153#issuecomment-1133267290", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1153", "id": 1133267290, "node_id": "IC_kwDOBm6k_c5DjEla", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T19:44:05Z", "updated_at": "2022-05-20T19:50:58Z", "author_association": "OWNER", "body": "Undocumented Sphinx feature: you can add extra classes to a code example like this:\r\n\r\n```\r\n.. code-block:: json\r\n :class: metadata-json\r\n\r\n {\r\n \"databases\": {\r\n \"russian-ads\": {\r\n \"tables\": {\r\n \"display_ads\": {\r\n \"fts_table\": \"ads_fts\",\r\n \"fts_pk\": \"id\",\r\n \"searchmode\": \"raw\"\r\n }\r\n }\r\n }\r\n }\r\n }\r\n```\r\nhttps://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-code-block doesn't mention this.\r\n\r\nFiled an issue about the lack of documentation here:\r\n- https://github.com/sphinx-doc/sphinx/issues/10461", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 771202454, "label": "Use YAML examples in documentation by default, not JSON"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133254599", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133254599, "node_id": "IC_kwDOBm6k_c5DjBfH", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T19:33:08Z", "updated_at": "2022-05-20T19:33:08Z", "author_association": "OWNER", "body": "Actually maybe I don't? I just noticed that on other pages on https://docs.datasette.io/en/stable/installation.html the only way to get back to that useful table of context / index page at https://docs.datasette.io/en/stable/index.html is by clicking the tiny house icon. Can I do better or should I have the logo do that?", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133252598", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133252598, "node_id": "IC_kwDOBm6k_c5DjA_2", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T19:31:30Z", "updated_at": "2022-05-20T19:31:30Z", "author_association": "OWNER", "body": "I'd also like to bring back this stable / latest / version indicator:\r\n\r\n![CleanShot 2022-05-20 at 12 30 49@2x](https://user-images.githubusercontent.com/9599/169598732-e2093ec1-7eaf-40dd-acfa-1a7c31091ff1.png)\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": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133250151", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133250151, "node_id": "IC_kwDOBm6k_c5DjAZn", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T19:29:37Z", "updated_at": "2022-05-20T19:29:37Z", "author_association": "OWNER", "body": "I want the Datasette logo in the sidebar to link to https://datasette.io/\r\n\r\nLooks like I can do that by dropping in my own `sidebar/brand.html` template based on this:\r\n\r\nhttps://github.com/pradyunsg/furo/blob/0c2acbbd23f8146dd0ae50a2ba57258c1f63ea9f/src/furo/theme/furo/sidebar/brand.html", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133246791", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133246791, "node_id": "IC_kwDOBm6k_c5Di_lH", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T19:26:49Z", "updated_at": "2022-05-20T19:26:49Z", "author_association": "OWNER", "body": "Putting this in the `css/custom.css` file seems to work for fixing that logo problem:\r\n\r\n```css\r\nbody[data-theme=\"dark\"] .sidebar-logo-container {\r\n background-color: white;\r\n padding: 5px;\r\n opacity: 0.6;\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": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133242063", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133242063, "node_id": "IC_kwDOBm6k_c5Di-bP", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T19:22:49Z", "updated_at": "2022-05-20T19:22:49Z", "author_association": "OWNER", "body": "I have some custom CSS in this file:\r\n\r\nhttps://github.com/simonw/datasette/blob/1465fea4798599eccfe7e8f012bd8d9adfac3039/docs/_static/css/custom.css#L1-L7\r\n\r\nI tested and the `overflow-wrap: anywhere` is still needed for this fix:\r\n- #828\r\n\r\nThe `.wy-side-nav-search` bit is no longer needed with the new theme.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1748#issuecomment-1133232301", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1748", "id": 1133232301, "node_id": "IC_kwDOBm6k_c5Di8Ct", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T19:15:00Z", "updated_at": "2022-05-20T19:15:00Z", "author_association": "OWNER", "body": "Now live on https://docs.datasette.io/en/latest/testing_plugins.html\r\n\r\n![copy](https://user-images.githubusercontent.com/9599/169596586-396eb6c7-ef5a-405a-bb21-348499478d9b.gif)\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1243517592, "label": "Add copy buttons next to code examples in the documentation"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1747#issuecomment-1133229196", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1747", "id": 1133229196, "node_id": "IC_kwDOBm6k_c5Di7SM", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T19:12:30Z", "updated_at": "2022-05-20T19:12:30Z", "author_association": "OWNER", "body": "https://docs.datasette.io/en/latest/getting_started.html#follow-a-tutorial", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1243512344, "label": "Add tutorials to the getting started guide"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1748#issuecomment-1133225441", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1748", "id": 1133225441, "node_id": "IC_kwDOBm6k_c5Di6Xh", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T19:09:13Z", "updated_at": "2022-05-20T19:09:13Z", "author_association": "OWNER", "body": "I'm going to add this Sphinx plugin: https://github.com/executablebooks/sphinx-copybutton", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1243517592, "label": "Add copy buttons next to code examples in the documentation"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1153#issuecomment-1133222848", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1153", "id": 1133222848, "node_id": "IC_kwDOBm6k_c5Di5vA", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T19:07:10Z", "updated_at": "2022-05-20T19:07:10Z", "author_association": "OWNER", "body": "I could use https://github.com/pradyunsg/sphinx-inline-tabs for this - recommended by https://pradyunsg.me/furo/recommendations/", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 771202454, "label": "Use YAML examples in documentation by default, not JSON"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133217219", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133217219, "node_id": "IC_kwDOBm6k_c5Di4XD", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T18:58:54Z", "updated_at": "2022-05-20T18:58:54Z", "author_association": "OWNER", "body": "Need to address other customizations I've made in https://github.com/simonw/datasette/blob/0.62a0/docs/_templates/layout.html - such as Plausible analytics and some custom JavaScript.\r\n\r\nhttps://github.com/simonw/datasette/blob/943aa2e1f7341cb51e60332cde46bde650c64217/docs/_templates/layout.html#L1-L61", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133215684", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133215684, "node_id": "IC_kwDOBm6k_c5Di3_E", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T18:56:29Z", "updated_at": "2022-05-20T18:56:29Z", "author_association": "OWNER", "body": "One other problem: in dark mode the Datasette logo looks bad:\r\n\r\n\r\n\r\nThis helps a bit:\r\n\r\n```css\r\n.sidebar-logo-container {\r\n background-color: white;\r\n padding: 5px;\r\n opacity: 0.6;\r\n}\r\n```\r\n\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": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133210942", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133210942, "node_id": "IC_kwDOBm6k_c5Di20-", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T18:49:40Z", "updated_at": "2022-05-20T18:49:40Z", "author_association": "OWNER", "body": "And for those local table of contents, do this:\r\n\r\n```rst\r\n.. contents::\r\n :local:\r\n :class: this-will-duplicate-information-and-it-is-still-useful-here\r\n```", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133210651", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133210651, "node_id": "IC_kwDOBm6k_c5Di2wb", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T18:49:11Z", "updated_at": "2022-05-20T18:49:11Z", "author_association": "OWNER", "body": "I found a workaround for the no-longer-nested left hand navigation: drop this into `_templates/sidebar/navigation.html`:\r\n```html+jinja\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": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}
{"html_url": "https://github.com/simonw/datasette/issues/1746#issuecomment-1133210032", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1746", "id": 1133210032, "node_id": "IC_kwDOBm6k_c5Di2mw", "user": {"value": 9599, "label": "simonw"}, "created_at": "2022-05-20T18:48:17Z", "updated_at": "2022-05-20T18:48:17Z", "author_association": "OWNER", "body": "A couple of changes I want to make. First, I don't really like the way Furo keeps the in-page titles in a separate menu on the right rather than expanding them on the left.\r\n\r\nI like this:\r\n\r\n![CleanShot 2022-05-20 at 11 43 33@2x](https://user-images.githubusercontent.com/9599/169592611-ac0f9bd2-ff99-49b6-88d3-92dace9d85a6.png)\r\n\r\nFuro wants to do this instead:\r\n\r\n\r\n\r\nI also still want to include those inline tables of contents on the two pages that have them:\r\n\r\n- https://docs.datasette.io/en/stable/installation.html\r\n- https://docs.datasette.io/en/stable/plugin_hooks.html", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 1243498298, "label": "Switch documentation theme to Furo"}, "performed_via_github_app": null}