{"html_url": "https://github.com/simonw/datasette/issues/1050#issuecomment-718317997", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1050", "id": 718317997, "node_id": "MDEyOklzc3VlQ29tbWVudDcxODMxNzk5Nw==", "user": {"value": 283343, "label": "thadk"}, "created_at": "2020-10-29T02:24:50Z", "updated_at": "2020-10-29T02:29:24Z", "author_association": "NONE", "body": "Unsolicited feedback for an unreleased feature of the [current](https://github.com/simonw/datasette/commit/5e0b72247ecab4ce0fcec599b77a83d73a480872) unreleased GitHub version (I casually wanted to access a blob row) \u2013 the existing #1036 route doesn't support special characters in database or table names (e.g. `@()` ). Maybe this is motivation for your new idea here.\r\n\r\nAlso I got this error/crash with my blob and wasn't able to get the file: https://gist.github.com/thadk/28ac32af0e88747ce9056c90b0b19d34", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 729057388, "label": "Switch to .blob render extension for BLOB downloads"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1060#issuecomment-718243062", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1060", "id": 718243062, "node_id": "MDEyOklzc3VlQ29tbWVudDcxODI0MzA2Mg==", "user": {"value": 22429695, "label": "codecov[bot]"}, "created_at": "2020-10-28T22:23:33Z", "updated_at": "2020-10-28T22:23:33Z", "author_association": "NONE", "body": "# [Codecov](https://codecov.io/gh/simonw/datasette/pull/1060?src=pr&el=h1) Report\n> Merging [#1060](https://codecov.io/gh/simonw/datasette/pull/1060?src=pr&el=desc) into [main](https://codecov.io/gh/simonw/datasette/commit/abcf0222496d8148b2e585ffa0ff192270a04b06?el=desc) will **increase** coverage by `6.42%`.\n> The diff coverage is `100.00%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/simonw/datasette/pull/1060/graphs/tree.svg?width=650&height=150&src=pr&token=eSahVY7kw1)](https://codecov.io/gh/simonw/datasette/pull/1060?src=pr&el=tree)\n\n```diff\n@@ Coverage Diff @@\n## main #1060 +/- ##\n==========================================\n+ Coverage 84.71% 91.13% +6.42% \n==========================================\n Files 28 27 -1 \n Lines 3957 3677 -280 \n==========================================\n- Hits 3352 3351 -1 \n+ Misses 605 326 -279 \n```\n\n\n| [Impacted Files](https://codecov.io/gh/simonw/datasette/pull/1060?src=pr&el=tree) | Coverage \u0394 | |\n|---|---|---|\n| [datasette/cli.py](https://codecov.io/gh/simonw/datasette/pull/1060/diff?src=pr&el=tree#diff-ZGF0YXNldHRlL2NsaS5weQ==) | `73.63% <100.00%> (+0.13%)` | :arrow_up: |\n| [datasette/version.py](https://codecov.io/gh/simonw/datasette/pull/1060/diff?src=pr&el=tree#diff-ZGF0YXNldHRlL3ZlcnNpb24ucHk=) | `100.00% <100.00%> (\u00f8)` | |\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/simonw/datasette/pull/1060?src=pr&el=continue).\n> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)\n> `\u0394 = absolute (impact)`, `\u00f8 = not affected`, `? = missing data`\n> Powered by [Codecov](https://codecov.io/gh/simonw/datasette/pull/1060?src=pr&el=footer). Last update [abcf022...4725d46](https://codecov.io/gh/simonw/datasette/pull/1060?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 731827081, "label": "New explicit versioning mechanism"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/191#issuecomment-718170295", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/191", "id": 718170295, "node_id": "MDEyOklzc3VlQ29tbWVudDcxODE3MDI5NQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-28T19:50:16Z", "updated_at": "2020-10-28T19:50:16Z", "author_association": "OWNER", "body": "I think I made a mistake when I designed the initial decorator. I should have had it work like this:\r\n\r\n```python\r\n@db.register_function()\r\ndef reverse_string(s):\r\n return \"\".join(reversed(list(s)))\r\n```\r\nAs this leaves open the option to add new parameters in the future.\r\n\r\nTo avoid breaking backwards compatibility I'll use the hack that detects the argument this time, but in the future I'll try to remember to always design decorators to be called like `@decorator()`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 731740458, "label": "Idea: @db.register_function(deterministic=True)"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/191#issuecomment-718168730", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/191", "id": 718168730, "node_id": "MDEyOklzc3VlQ29tbWVudDcxODE2ODczMA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-28T19:47:20Z", "updated_at": "2020-10-28T19:47:20Z", "author_association": "OWNER", "body": "https://stackoverflow.com/a/3931903 looks useful:\r\n```python\r\ndef trace(*args):\r\n def _trace(func):\r\n def wrapper(*args, **kwargs):\r\n print enter_string\r\n func(*args, **kwargs)\r\n print exit_string\r\n return wrapper\r\n if len(args) == 1 and callable(args[0]):\r\n # No arguments, this is the decorator\r\n # Set default values for the arguments\r\n enter_string = 'entering'\r\n exit_string = 'exiting'\r\n return _trace(args[0])\r\n else:\r\n # This is just returning the decorator\r\n enter_string, exit_string = args\r\n return _trace\r\n```\r\nCan improve that code with `functools.wraps`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 731740458, "label": "Idea: @db.register_function(deterministic=True)"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1059#issuecomment-718078447", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1059", "id": 718078447, "node_id": "MDEyOklzc3VlQ29tbWVudDcxODA3ODQ0Nw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-28T17:07:59Z", "updated_at": "2020-10-28T17:08:14Z", "author_association": "OWNER", "body": "> #### 0.6.0 (2020-10-27)\r\n> \r\n> - aiofiles is now tested on ppc64le.\r\n> - Added name and mode properties to async file objects. [#82](https://github.com/Tinche/aiofiles/pull/82)\r\n> - Fixed a DeprecationWarning internally. [#75](https://github.com/Tinche/aiofiles/pull/75)\r\n> - Python 3.9 support and tests.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 731445447, "label": "Update aiofiles requirement from <0.6,>=0.4 to >=0.4,<0.7"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1059#issuecomment-717938992", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1059", "id": 717938992, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNzkzODk5Mg==", "user": {"value": 22429695, "label": "codecov[bot]"}, "created_at": "2020-10-28T13:38:46Z", "updated_at": "2020-10-28T13:38:46Z", "author_association": "NONE", "body": "# [Codecov](https://codecov.io/gh/simonw/datasette/pull/1059?src=pr&el=h1) Report\n> Merging [#1059](https://codecov.io/gh/simonw/datasette/pull/1059?src=pr&el=desc) into [main](https://codecov.io/gh/simonw/datasette/commit/7d9fedc176717a7e3d22a96575ae0aada5a65440?el=desc) will **not change** coverage.\n> The diff coverage is `n/a`.\n\n[![Impacted file tree graph](https://codecov.io/gh/simonw/datasette/pull/1059/graphs/tree.svg?width=650&height=150&src=pr&token=eSahVY7kw1)](https://codecov.io/gh/simonw/datasette/pull/1059?src=pr&el=tree)\n\n```diff\n@@ Coverage Diff @@\n## main #1059 +/- ##\n=======================================\n Coverage 84.71% 84.71% \n=======================================\n Files 28 28 \n Lines 3957 3957 \n=======================================\n Hits 3352 3352 \n Misses 605 605 \n```\n\n\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/simonw/datasette/pull/1059?src=pr&el=continue).\n> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)\n> `\u0394 = absolute (impact)`, `\u00f8 = not affected`, `? = missing data`\n> Powered by [Codecov](https://codecov.io/gh/simonw/datasette/pull/1059?src=pr&el=footer). Last update [7d9fedc...e46327a](https://codecov.io/gh/simonw/datasette/pull/1059?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 731445447, "label": "Update aiofiles requirement from <0.6,>=0.4 to >=0.4,<0.7"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1057#issuecomment-717531272", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1057", "id": 717531272, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNzUzMTI3Mg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-27T20:51:09Z", "updated_at": "2020-10-27T20:51:09Z", "author_association": "OWNER", "body": "That works!\r\n\r\n\"Banners_and_Alerts_and_SQLite___Mike_Bostock___Observable\"\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 730797787, "label": "--cors should enable /fixtures.db CORS access"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1058#issuecomment-717527606", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1058", "id": 717527606, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNzUyNzYwNg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-27T20:44:06Z", "updated_at": "2020-10-27T20:44:06Z", "author_association": "OWNER", "body": "Example: https://github.com/simonw/datasette/blob/5a1519796037105bc20bcf2f91a76e022926c204/datasette/views/database.py#L26-L32", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 730802994, "label": "Database download should implement cascading permissions"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1056#issuecomment-717489501", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1056", "id": 717489501, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNzQ4OTUwMQ==", "user": {"value": 22429695, "label": "codecov[bot]"}, "created_at": "2020-10-27T19:39:41Z", "updated_at": "2020-10-27T19:39:41Z", "author_association": "NONE", "body": "# [Codecov](https://codecov.io/gh/simonw/datasette/pull/1056?src=pr&el=h1) Report\n> Merging [#1056](https://codecov.io/gh/simonw/datasette/pull/1056?src=pr&el=desc) into [main](https://codecov.io/gh/simonw/datasette/commit/26bb4a268127da2c38f4241abe45444b2a6f7874?el=desc) will **not change** coverage.\n> The diff coverage is `n/a`.\n\n[![Impacted file tree graph](https://codecov.io/gh/simonw/datasette/pull/1056/graphs/tree.svg?width=650&height=150&src=pr&token=eSahVY7kw1)](https://codecov.io/gh/simonw/datasette/pull/1056?src=pr&el=tree)\n\n```diff\n@@ Coverage Diff @@\n## main #1056 +/- ##\n=======================================\n Coverage 84.70% 84.70% \n=======================================\n Files 28 28 \n Lines 3955 3955 \n=======================================\n Hits 3350 3350 \n Misses 605 605 \n```\n\n\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/simonw/datasette/pull/1056?src=pr&el=continue).\n> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)\n> `\u0394 = absolute (impact)`, `\u00f8 = not affected`, `? = missing data`\n> Powered by [Codecov](https://codecov.io/gh/simonw/datasette/pull/1056?src=pr&el=footer). Last update [26bb4a2...a7b2aab](https://codecov.io/gh/simonw/datasette/pull/1056?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 730752399, "label": "Radical new colour scheme and base styles, courtesy of @natbat"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/pull/189#issuecomment-717361487", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/189", "id": 717361487, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNzM2MTQ4Nw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-27T16:24:04Z", "updated_at": "2020-10-27T16:24:04Z", "author_association": "OWNER", "body": "This is great, thank you very much.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 729818242, "label": "Allow iterables other than Lists in m2m records"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/pull/189#issuecomment-717359145", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/189", "id": 717359145, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNzM1OTE0NQ==", "user": {"value": 35681, "label": "adamwolf"}, "created_at": "2020-10-27T16:20:32Z", "updated_at": "2020-10-27T16:20:32Z", "author_association": "CONTRIBUTOR", "body": "No problem. I added a test. Let me know if it looks sufficient or if you want me to to tweak something!\r\n\r\nIf you don't mind, would you tag this PR as \"hacktoberfest-accepted\"? If you do mind, no problem and I'm sorry for asking :) My kiddos like the shirts.", "reactions": "{\"total_count\": 1, \"+1\": 1, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 729818242, "label": "Allow iterables other than Lists in m2m records"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1054#issuecomment-717051707", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1054", "id": 717051707, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNzA1MTcwNw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-27T07:41:21Z", "updated_at": "2020-10-27T07:41:21Z", "author_association": "OWNER", "body": "Essentially it's this problem: https://github.com/python-versioneer/python-versioneer/issues/140", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 730199464, "label": "Switch from versioneer to concrete version in setup.py"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1054#issuecomment-717050585", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1054", "id": 717050585, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNzA1MDU4NQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-27T07:38:50Z", "updated_at": "2020-10-27T07:38:50Z", "author_association": "OWNER", "body": "Maybe imitate how Django does this, e.g. https://github.com/django/django/commit/6b9b2af7352908d40ca4d31bdb1b80c013cab29a", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 730199464, "label": "Switch from versioneer to concrete version in setup.py"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/pull/189#issuecomment-716756103", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/189", "id": 716756103, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjc1NjEwMw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-26T18:56:19Z", "updated_at": "2020-10-26T18:56:19Z", "author_association": "OWNER", "body": "This is a great fix, thanks! If you add a unit test somewhere in here I'll merge the PR: https://github.com/simonw/sqlite-utils/blob/main/tests/test_m2m.py", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 729818242, "label": "Allow iterables other than Lists in m2m records"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1051#issuecomment-716681602", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1051", "id": 716681602, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjY4MTYwMg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-26T16:51:58Z", "updated_at": "2020-10-26T16:51:58Z", "author_association": "OWNER", "body": "I still need to improve the current binary display on the query page though, where it outputs a Python `b'...'` literal.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 729096595, "label": "Better display of binary data on arbitrary query results page"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1051#issuecomment-716681167", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1051", "id": 716681167, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjY4MTE2Nw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-26T16:51:15Z", "updated_at": "2020-10-26T16:51:15Z", "author_association": "OWNER", "body": "Crazy idea: generate a signed URL containing a base64 of the gzip of the binary content (to try and reduce size).\r\n\r\nNo: this will blow through URL limits in various hosting providers and possibly even browsers. It could be made to work a little bit more reliably with some extra JavaScript that turns it into a download on the browser-side, but that would be hideously complicated.\r\n\r\nAlso the signed bit doesn't prevent people from generating SQL queries that generate nasty binary blobs for download.\r\n\r\nI'm beginning to think that restricting this feature to just table view, not query view, is a better idea. Query view can still get at the binary using JSON and base64.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 729096595, "label": "Better display of binary data on arbitrary query results page"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/976#issuecomment-716305890", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/976", "id": 716305890, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjMwNTg5MA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-26T05:07:10Z", "updated_at": "2020-10-26T05:07:10Z", "author_association": "OWNER", "body": "I used the new `datasette.urls` methods to handle escaping table names.\r\n\r\nhttps://github.com/simonw/datasette/blob/f5dbe61a4568c0915ec6be820095c2960cf0857c/datasette/utils/__init__.py#L996-L1008", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 708289783, "label": "Idea: -o could open to a more convenient location"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1052#issuecomment-716265360", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1052", "id": 716265360, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjI2NTM2MA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-26T02:17:58Z", "updated_at": "2020-10-26T02:17:58Z", "author_association": "OWNER", "body": "The default z-index values for Leaflet are defined here: https://github.com/Leaflet/Leaflet/blob/b346bb8bf7bb80899baa1f4fc1536bae58e7e3e6/dist/leaflet.css#L81-L91\r\n\r\n```css\r\n.leaflet-pane { z-index: 400; }\r\n\r\n.leaflet-tile-pane { z-index: 200; }\r\n.leaflet-overlay-pane { z-index: 400; }\r\n.leaflet-shadow-pane { z-index: 500; }\r\n.leaflet-marker-pane { z-index: 600; }\r\n.leaflet-tooltip-pane { z-index: 650; }\r\n.leaflet-popup-pane { z-index: 700; }\r\n\r\n.leaflet-map-pane canvas { z-index: 100; }\r\n.leaflet-map-pane svg { z-index: 200; }\r\n```\r\nSo a `z-index` of 1000 on the menu should fix this.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 729183332, "label": "Column action menu overlapped by Leaflet maps"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1043#issuecomment-716237524", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1043", "id": 716237524, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjIzNzUyNA==", "user": {"value": 45380, "label": "bollwyvl"}, "created_at": "2020-10-26T00:14:57Z", "updated_at": "2020-10-26T00:14:57Z", "author_association": "CONTRIBUTOR", "body": "Sorry, I was out of the loop this weekend. The missing sdists were in some the `datasette-*` plugins... i'll capture my findings more concretely in one spot when i have a chance...", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727915394, "label": "Include LICENSE in sdist"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1051#issuecomment-716204271", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1051", "id": 716204271, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjIwNDI3MQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-25T20:08:04Z", "updated_at": "2020-10-25T20:08:04Z", "author_association": "OWNER", "body": "This is bad though, because if I want to provide binary data in CSV as requested in #1034 I need some way of providing that data.\r\n\r\nWhich suggests to me that the base64 option is the only one that can make sense for arbitrary SQL queries represented as CSV. Download links won't work.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 729096595, "label": "Better display of binary data on arbitrary query results page"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1051#issuecomment-716204090", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1051", "id": 716204090, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjIwNDA5MA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-25T20:06:42Z", "updated_at": "2020-10-25T20:06:42Z", "author_association": "OWNER", "body": "Providing a binary download link here is actually extremely difficult.\r\n\r\nThe problem is that the SQL query itself represents data that can change from one moment to the next. It's no good showing a \"Binary: 55 bytes\" message that links to that same SQL query but with a `.blob` extension and arguments to select the particular result, because the data may change in a way that causes that query to return a different row - at which point the download link will give you the wrong data, not the 55 bytes you asked for.\r\n\r\nSo providing a download link risks being misleading.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 729096595, "label": "Better display of binary data on arbitrary query results page"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1050#issuecomment-716174203", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1050", "id": 716174203, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjE3NDIwMw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-25T16:27:39Z", "updated_at": "2020-10-25T16:53:27Z", "author_association": "OWNER", "body": "Idea: `.blob` output rendererer, where you tell it which column you want using `?_blob_column=x`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 729057388, "label": "Switch to .blob render extension for BLOB downloads"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1050#issuecomment-716175236", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1050", "id": 716175236, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjE3NTIzNg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-25T16:35:20Z", "updated_at": "2020-10-25T16:35:20Z", "author_association": "OWNER", "body": "This is clearly a better solution than the one I implemented in #1040 - I don't have to add a new route, I don't have to implement permission checks, it reuses mechanism.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 729057388, "label": "Switch to .blob render extension for BLOB downloads"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1049#issuecomment-716146238", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1049", "id": 716146238, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjE0NjIzOA==", "user": {"value": 22429695, "label": "codecov[bot]"}, "created_at": "2020-10-25T13:13:32Z", "updated_at": "2020-10-25T13:13:32Z", "author_association": "NONE", "body": "# [Codecov](https://codecov.io/gh/simonw/datasette/pull/1049?src=pr&el=h1) Report\n> Merging [#1049](https://codecov.io/gh/simonw/datasette/pull/1049?src=pr&el=desc) into [main](https://codecov.io/gh/simonw/datasette/commit/42f4851e3e7885f1092f104d6c883cea40b12f02?el=desc) will **not change** coverage.\n> The diff coverage is `n/a`.\n\n[![Impacted file tree graph](https://codecov.io/gh/simonw/datasette/pull/1049/graphs/tree.svg?width=650&height=150&src=pr&token=eSahVY7kw1)](https://codecov.io/gh/simonw/datasette/pull/1049?src=pr&el=tree)\n\n```diff\n@@ Coverage Diff @@\n## main #1049 +/- ##\n=======================================\n Coverage 84.72% 84.72% \n=======================================\n Files 28 28 \n Lines 3942 3942 \n=======================================\n Hits 3340 3340 \n Misses 602 602 \n```\n\n\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/simonw/datasette/pull/1049?src=pr&el=continue).\n> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)\n> `\u0394 = absolute (impact)`, `\u00f8 = not affected`, `? = missing data`\n> Powered by [Codecov](https://codecov.io/gh/simonw/datasette/pull/1049?src=pr&el=footer). Last update [42f4851...50a743a](https://codecov.io/gh/simonw/datasette/pull/1049?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 729017519, "label": "Add template block prior to extra URL loaders"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/838#issuecomment-716123598", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/838", "id": 716123598, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjEyMzU5OA==", "user": {"value": 82988, "label": "psychemedia"}, "created_at": "2020-10-25T10:20:12Z", "updated_at": "2020-10-25T10:53:24Z", "author_association": "CONTRIBUTOR", "body": "I'm trying to [run something behind a MyBinder proxy](https://github.com/ouseful-testing/nbsearch), but seem to have something set up incorrectly and not sure what the fix is?\r\n\r\nI'm starting datasette with jupyter-server-proxy setup:\r\n\r\n```\r\n# __init__.py\r\ndef setup_nbsearch():\r\n\r\n return {\r\n \"command\": [\r\n \"datasette\",\r\n \"serve\",\r\n f\"{_NBSEARCH_DB_PATH}\",\r\n \"-p\",\r\n \"{port}\",\r\n \"--config\",\r\n \"base_url:{base_url}nbsearch/\"\r\n ],\r\n \"absolute_url\": True,\r\n # The following needs a the labextension installing.\r\n # eg in postBuild: jupyter labextension install jupyterlab-server-proxy\r\n \"launcher_entry\": {\r\n \"enabled\": True,\r\n \"title\": \"nbsearch\",\r\n },\r\n }\r\n```\r\n\r\nwhere the `base_url` gets automatically populated by the server-proxy. I define the loaders as:\r\n\r\n```\r\n# __init__.py\r\nfrom datasette import hookimpl\r\n\r\n@hookimpl\r\ndef extra_css_urls(database, table, columns, view_name, datasette):\r\n return [\r\n \"/-/static-plugins/nbsearch/prism.css\",\r\n \"/-/static-plugins/nbsearch/nbsearch.css\",\r\n ]\r\n```\r\nbut these seem to also need a base_url prefix set somehow?\r\n\r\nCurrently, the generated HTML loads properly but internal links are incorrect; eg they take the form `` which resolves to eg `https://notebooks.gesis.org/hub/-/static-plugins/nbsearch/prism.css` rather than required URL of form `https://notebooks.gesis.org/binder/jupyter/user/ouseful-testing-nbsearch-0fx1mx67/nbsearch/-/static-plugins/nbsearch/prism.css`.\r\n\r\nThe main css is loaded correctly: ``", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 637395097, "label": "Incorrect URLs when served behind a proxy with base_url set"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1034#issuecomment-716078777", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1034", "id": 716078777, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjA3ODc3Nw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-25T01:25:11Z", "updated_at": "2020-10-25T01:25:11Z", "author_association": "OWNER", "body": "SQLite actually has APIs that could help here: https://www.sqlite.org/c3ref/column_database_name.html - for any given SQL query they identify the origin/table/column that is the source of each resulting column.\r\n\r\nThose aren't exposed in the Python `sqlite3` module though, so using them could be extremely tricky.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725184645, "label": "Better way of representing binary data in .csv output"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1034#issuecomment-716078605", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1034", "id": 716078605, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjA3ODYwNQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-25T01:22:22Z", "updated_at": "2020-10-25T01:22:22Z", "author_association": "OWNER", "body": "For arbitrary CSV the only solution I can think of is to embed the base64 value.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725184645, "label": "Better way of representing binary data in .csv output"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1034#issuecomment-716078512", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1034", "id": 716078512, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjA3ODUxMg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-25T01:21:11Z", "updated_at": "2020-10-25T01:21:11Z", "author_association": "OWNER", "body": "What should happen for CSV export of arbitrary SQL queries, where there's no obvious BLOB to link to?", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725184645, "label": "Better way of representing binary data in .csv output"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1034#issuecomment-716078420", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1034", "id": 716078420, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjA3ODQyMA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-25T01:20:00Z", "updated_at": "2020-10-25T01:20:00Z", "author_association": "OWNER", "body": "That documentation: https://docs.datasette.io/en/latest/internals.html#absolute-url-request-path", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725184645, "label": "Better way of representing binary data in .csv output"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1034#issuecomment-716077541", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1034", "id": 716077541, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjA3NzU0MQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-25T01:09:38Z", "updated_at": "2020-10-25T01:10:04Z", "author_association": "OWNER", "body": "I should turn `datasette.absolute_url(...)` into a documented internal API on https://docs.datasette.io/en/stable/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": 725184645, "label": "Better way of representing binary data in .csv output"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1034#issuecomment-716077508", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1034", "id": 716077508, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjA3NzUwOA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-25T01:09:17Z", "updated_at": "2020-10-25T01:09:17Z", "author_association": "OWNER", "body": "Here's how those absolute `next_url` values are generated: https://github.com/simonw/datasette/blob/5db7ae3ce165ded57c7fb1cfbdb3258b1cf06c10/datasette/views/table.py#L774-L776", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725184645, "label": "Better way of representing binary data in .csv output"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1034#issuecomment-716077436", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1034", "id": 716077436, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjA3NzQzNg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-25T01:08:35Z", "updated_at": "2020-10-25T01:08:42Z", "author_association": "OWNER", "body": "This is actually a bit tricky to implement, for a few reasons:\r\n\r\n- Need to generate a full URL, including the `https://host/` bit. I've done this for `next_url` in the JSON output before, thankfully.\r\n- This only makes sense for CSV output for tables. If it's the CSV output of an arbitrary query there's no `/db/table/-/blob/pk/column.blob` page for me to link to.\r\n- Need to generate those `/.../-/blob/...` URLs for the data that is being output as CSV.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725184645, "label": "Better way of representing binary data in .csv output"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1034#issuecomment-713277810", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1034", "id": 713277810, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzI3NzgxMA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-21T03:40:50Z", "updated_at": "2020-10-25T01:01:23Z", "author_association": "OWNER", "body": "Blocked awaiting #1036 (update: now unblocked)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725184645, "label": "Better way of representing binary data in .csv output"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1046#issuecomment-716071507", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1046", "id": 716071507, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjA3MTUwNw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-25T00:06:47Z", "updated_at": "2020-10-25T00:06:47Z", "author_association": "OWNER", "body": "I used https://primer.style/octicons/download-16 instead.\r\n\r\n\"favicons__favicons__71_rows\"\r\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 728895193, "label": "Link to blob downloads in the right places"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1040#issuecomment-713920562", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1040", "id": 713920562, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzkyMDU2Mg==", "user": {"value": 22429695, "label": "codecov[bot]"}, "created_at": "2020-10-21T22:44:12Z", "updated_at": "2020-10-24T23:08:14Z", "author_association": "NONE", "body": "# [Codecov](https://codecov.io/gh/simonw/datasette/pull/1040?src=pr&el=h1) Report\n> Merging [#1040](https://codecov.io/gh/simonw/datasette/pull/1040?src=pr&el=desc) into [main](https://codecov.io/gh/simonw/datasette/commit/bf82b3d6a605c9ddadd5fb739249dfe6defaf635?el=desc) will **increase** coverage by `0.10%`.\n> The diff coverage is `100.00%`.\n\n[![Impacted file tree graph](https://codecov.io/gh/simonw/datasette/pull/1040/graphs/tree.svg?width=650&height=150&src=pr&token=eSahVY7kw1)](https://codecov.io/gh/simonw/datasette/pull/1040?src=pr&el=tree)\n\n```diff\n@@ Coverage Diff @@\n## main #1040 +/- ##\n==========================================\n+ Coverage 84.65% 84.76% +0.10% \n==========================================\n Files 28 28 \n Lines 3924 3938 +14 \n==========================================\n+ Hits 3322 3338 +16 \n+ Misses 602 600 -2 \n```\n\n\n| [Impacted Files](https://codecov.io/gh/simonw/datasette/pull/1040?src=pr&el=tree) | Coverage \u0394 | |\n|---|---|---|\n| [datasette/views/index.py](https://codecov.io/gh/simonw/datasette/pull/1040/diff?src=pr&el=tree#diff-ZGF0YXNldHRlL3ZpZXdzL2luZGV4LnB5) | `98.18% <\u00f8> (+1.69%)` | :arrow_up: |\n| [datasette/views/special.py](https://codecov.io/gh/simonw/datasette/pull/1040/diff?src=pr&el=tree#diff-ZGF0YXNldHRlL3ZpZXdzL3NwZWNpYWwucHk=) | `92.70% <\u00f8> (-0.82%)` | :arrow_down: |\n| [datasette/app.py](https://codecov.io/gh/simonw/datasette/pull/1040/diff?src=pr&el=tree#diff-ZGF0YXNldHRlL2FwcC5weQ==) | `96.37% <100.00%> (+0.17%)` | :arrow_up: |\n| [datasette/views/base.py](https://codecov.io/gh/simonw/datasette/pull/1040/diff?src=pr&el=tree#diff-ZGF0YXNldHRlL3ZpZXdzL2Jhc2UucHk=) | `93.77% <100.00%> (\u00f8)` | |\n| [datasette/views/table.py](https://codecov.io/gh/simonw/datasette/pull/1040/diff?src=pr&el=tree#diff-ZGF0YXNldHRlL3ZpZXdzL3RhYmxlLnB5) | `96.07% <100.00%> (+0.22%)` | :arrow_up: |\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/simonw/datasette/pull/1040?src=pr&el=continue).\n> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)\n> `\u0394 = absolute (impact)`, `\u00f8 = not affected`, `? = missing data`\n> Powered by [Codecov](https://codecov.io/gh/simonw/datasette/pull/1040?src=pr&el=footer). Last update [bf82b3d...4f3165f](https://codecov.io/gh/simonw/datasette/pull/1040?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 726910999, "label": "/db/table/-/blob/pk/column.blob download URL"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1046#issuecomment-716066342", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1046", "id": 716066342, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjA2NjM0Mg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-24T23:02:07Z", "updated_at": "2020-10-24T23:02:25Z", "author_association": "OWNER", "body": "A download icon would be nice for the links in the table display. I like this one https://primer.style/octicons/download-24\r\n\r\n```svg\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": 728895193, "label": "Link to blob downloads in the right places"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1033#issuecomment-716066000", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1033", "id": 716066000, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjA2NjAwMA==", "user": {"value": 82988, "label": "psychemedia"}, "created_at": "2020-10-24T22:58:33Z", "updated_at": "2020-10-24T22:58:33Z", "author_association": "CONTRIBUTOR", "body": "From [the docs](https://docs.datasette.io/en/latest/internals.html#datasette-urls), I note:\r\n\r\n```\r\ndatasette.urls.instance()\r\nReturns the URL to the Datasette instance root page. This is usually \"/\"\r\n```\r\n\r\nWhat about the proxy case? Eg if I am using jupyter-server-proxy on a MyBinder or local Jupyter notebook server site, `https://example.com:PORT/weirdpath/datasette`, what does `datasette.urls.instance()` refer to?\r\n\r\n- [ ] `https://example.com:PORT/weirdpath/datasette`\r\n- [ ] `https://example.com:PORT/weirdpath/`\r\n- [ ] `https://example.com:PORT/`\r\n- [ ] `https://example.com`\r\n- [ ] something else?", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725099777, "label": "datasette.urls.static_plugins(...) method"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1033#issuecomment-716048564", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1033", "id": 716048564, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjA0ODU2NA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-24T20:08:31Z", "updated_at": "2020-10-24T20:08:31Z", "author_association": "OWNER", "body": "Documentation here: https://docs.datasette.io/en/latest/internals.html#datasette-urls", "reactions": "{\"total_count\": 1, \"+1\": 1, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725099777, "label": "datasette.urls.static_plugins(...) method"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/575#issuecomment-716048199", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/575", "id": 716048199, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNjA0ODE5OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-24T20:05:44Z", "updated_at": "2020-10-24T20:05:44Z", "author_association": "OWNER", "body": "https://docs.datasette.io/en/latest/writing_plugins.html#static-assets", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 497162288, "label": "Plugin documentation should cover how to bundle static/templates in setup.py"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1042#issuecomment-715643763", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1042", "id": 715643763, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNTY0Mzc2Mw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-24T00:34:31Z", "updated_at": "2020-10-24T00:34:52Z", "author_association": "OWNER", "body": "I'm going to rename that to template variable from `select_templates` to `templates_considered` too.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727802081, "label": "Plugin hook for loading templates"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1042#issuecomment-715643646", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1042", "id": 715643646, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNTY0MzY0Ng==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-24T00:33:46Z", "updated_at": "2020-10-24T00:33:46Z", "author_association": "OWNER", "body": "I'd like to do this all in the `datasette.render_template()` method to ensure it's available to plugins as well, not just core code that uses the `BaseView` class.\r\n\r\nThis code is the problem:\r\nhttps://github.com/simonw/datasette/blob/d3e9b0aecb6f8e9b2befd9c654ccb7ce852db3e7/datasette/views/base.py#L114-L133\r\n\r\nI think I'll fix this by moving the `select_templates` mechanism into `datasette.render_templates()`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727802081, "label": "Plugin hook for loading templates"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1045#issuecomment-715641183", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1045", "id": 715641183, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNTY0MTE4Mw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-24T00:19:29Z", "updated_at": "2020-10-24T00:19:29Z", "author_association": "OWNER", "body": "It turns out it already does that:\r\n\r\nhttps://github.com/simonw/datasette/blob/976e5f74aae1fa0d406df6691dc8b5feeebe8788/datasette/app.py#L710-L720\r\n\r\nBut the documentation doesn't reflect that:\r\n\r\n> `template` - string\r\n> \r\n> > The template file to be rendered, e.g. `my_plugin.html`. Datasette will search for this file first in the `--template-dir=` location, if it was specified - then in the plugin's bundled templates and finally in Datasette's set of default templates.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 728600048, "label": "Document that datasette.render_template(template, ...) also accepts a list of templates"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1042#issuecomment-715618333", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1042", "id": 715618333, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNTYxODMzMw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-23T22:33:24Z", "updated_at": "2020-10-23T22:33:24Z", "author_association": "OWNER", "body": "It wouldn't be a disaster if template-loading plugins were unable to hook into the `/{slug1}/{slug2}.html` custom page mechanism, since plugins can define their own pages already using `register_routes()`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727802081, "label": "Plugin hook for loading templates"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1042#issuecomment-715618077", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1042", "id": 715618077, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNTYxODA3Nw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-23T22:32:24Z", "updated_at": "2020-10-23T22:32:24Z", "author_association": "OWNER", "body": "Another option: the first version of the plugin hook could accept only the template filename. Subsequent releases could add more arguments, since Pluggy allows new arguments to be added without breaking backwards compatibility.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727802081, "label": "Plugin hook for loading templates"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1042#issuecomment-715617830", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1042", "id": 715617830, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNTYxNzgzMA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-23T22:31:26Z", "updated_at": "2020-10-23T22:31:26Z", "author_association": "OWNER", "body": "So maybe this should be a `register_template_loader` mechanism that returns a Jinja loader after all? That would mean that only the template filename could be used as the input to the plugin, which doesn't seem as useful as emulating the `extra_template_vars()` interface.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727802081, "label": "Plugin hook for loading templates"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1042#issuecomment-715617405", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1042", "id": 715617405, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNTYxNzQwNQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-23T22:29:53Z", "updated_at": "2020-10-23T22:29:53Z", "author_association": "OWNER", "body": "Also consider that `DatasetteRouter` uses `.list_templates()` to gather together `{slug}.html` style templates for the custom page templates mechanism: https://github.com/simonw/datasette/blob/976e5f74aae1fa0d406df6691dc8b5feeebe8788/datasette/app.py#L949-L967\r\n\r\nFor that to work with the new plugin hook, custom template providing plugins will need a way to provide a list of templates that they know about.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727802081, "label": "Plugin hook for loading templates"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1042#issuecomment-715616757", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1042", "id": 715616757, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNTYxNjc1Nw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-23T22:27:28Z", "updated_at": "2020-10-23T22:27:28Z", "author_association": "OWNER", "body": "Almost all of the core template loading happens in the `BaseView.render` method: https://github.com/simonw/datasette/blob/976e5f74aae1fa0d406df6691dc8b5feeebe8788/datasette/views/base.py#L114-L133\r\n\r\nThe one exception is the 404 handling code here: https://github.com/simonw/datasette/blob/976e5f74aae1fa0d406df6691dc8b5feeebe8788/datasette/app.py#L1034-L1042", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727802081, "label": "Plugin hook for loading templates"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1042#issuecomment-715614971", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1042", "id": 715614971, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNTYxNDk3MQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-23T22:20:14Z", "updated_at": "2020-10-23T22:23:51Z", "author_association": "OWNER", "body": "Alternative plugin hook idea:\r\n```python\r\n@hookspec\r\ndef load_template(template, database, table, columns, view_name, request, datasette):\r\n \"Load the specified template, returning the template code as a string\"\r\n```\r\nImitating the existing `extra_template_vars` family of hooks: https://docs.datasette.io/en/stable/plugin_hooks.html#extra-template-vars-template-database-table-columns-view-name-request-datasette", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727802081, "label": "Plugin hook for loading templates"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1040#issuecomment-715587715", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1040", "id": 715587715, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNTU4NzcxNQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-23T21:01:07Z", "updated_at": "2020-10-23T21:03:10Z", "author_association": "OWNER", "body": "A download icon would be nice for the links in the table display.\r\n\r\nI like this one https://primer.style/octicons/download-24", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 726910999, "label": "/db/table/-/blob/pk/column.blob download URL"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1043#issuecomment-715586711", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1043", "id": 715586711, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNTU4NjcxMQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-23T20:58:26Z", "updated_at": "2020-10-23T20:58:26Z", "author_association": "OWNER", "body": "I misunderstood - `asgi-csrf` already has an sdist.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727915394, "label": "Include LICENSE in sdist"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1043#issuecomment-715585140", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1043", "id": 715585140, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNTU4NTE0MA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-23T20:54:29Z", "updated_at": "2020-10-23T20:54:29Z", "author_association": "OWNER", "body": "Thanks. I'll push a source release of `asgi-csrf`.", "reactions": "{\"total_count\": 1, \"+1\": 1, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727915394, "label": "Include LICENSE in sdist"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1044#issuecomment-715584579", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1044", "id": 715584579, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNTU4NDU3OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-23T20:53:01Z", "updated_at": "2020-10-23T20:53:01Z", "author_association": "OWNER", "body": "Thanks for this!", "reactions": "{\"total_count\": 1, \"+1\": 1, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727916744, "label": "Add minimum supported python"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/745#issuecomment-715556545", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/745", "id": 715556545, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNTU1NjU0NQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-23T19:47:10Z", "updated_at": "2020-10-23T19:47:10Z", "author_association": "OWNER", "body": "Dupe of #647 ", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 608613033, "label": "Extract the hash-URL mechanism out into a plugin"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1042#issuecomment-715497419", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1042", "id": 715497419, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNTQ5NzQxOQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-23T18:12:40Z", "updated_at": "2020-10-23T18:12:40Z", "author_association": "OWNER", "body": "Maybe the template loader can optionally return some extra context to pass to the template. That could be used to solve the templates considered comment.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727802081, "label": "Plugin hook for loading templates"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1042#issuecomment-715496859", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1042", "id": 715496859, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNTQ5Njg1OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-23T18:11:27Z", "updated_at": "2020-10-23T18:11:27Z", "author_association": "OWNER", "body": "When loading a template the filename is required, but you can optionally also send a set of extra arguments which the template loader can take into consideration.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727802081, "label": "Plugin hook for loading templates"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1042#issuecomment-715490532", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1042", "id": 715490532, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNTQ5MDUzMg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-23T17:57:34Z", "updated_at": "2020-10-23T17:57:34Z", "author_association": "OWNER", "body": "A better version of this hook would be passed the database, table and query name depending on what was being rendered.\r\n\r\nThis would require some re-thinking of how core templates are loaded, especially since I would want the templates considered comment to continue working.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727802081, "label": "Plugin hook for loading templates"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1044#issuecomment-714916127", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1044", "id": 714916127, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDkxNjEyNw==", "user": {"value": 22429695, "label": "codecov[bot]"}, "created_at": "2020-10-23T05:12:52Z", "updated_at": "2020-10-23T05:12:52Z", "author_association": "NONE", "body": "# [Codecov](https://codecov.io/gh/simonw/datasette/pull/1044?src=pr&el=h1) Report\n> Merging [#1044](https://codecov.io/gh/simonw/datasette/pull/1044?src=pr&el=desc) into [main](https://codecov.io/gh/simonw/datasette/commit/d0cc6f4c32e1f89238ddec782086b3122f445bd4?el=desc) will **not change** coverage.\n> The diff coverage is `n/a`.\n\n[![Impacted file tree graph](https://codecov.io/gh/simonw/datasette/pull/1044/graphs/tree.svg?width=650&height=150&src=pr&token=eSahVY7kw1)](https://codecov.io/gh/simonw/datasette/pull/1044?src=pr&el=tree)\n\n```diff\n@@ Coverage Diff @@\n## main #1044 +/- ##\n=======================================\n Coverage 84.65% 84.65% \n=======================================\n Files 28 28 \n Lines 3924 3924 \n=======================================\n Hits 3322 3322 \n Misses 602 602 \n```\n\n\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/simonw/datasette/pull/1044?src=pr&el=continue).\n> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)\n> `\u0394 = absolute (impact)`, `\u00f8 = not affected`, `? = missing data`\n> Powered by [Codecov](https://codecov.io/gh/simonw/datasette/pull/1044?src=pr&el=footer). Last update [d0cc6f4...6453ab1](https://codecov.io/gh/simonw/datasette/pull/1044?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727916744, "label": "Add minimum supported python"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1043#issuecomment-714915025", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1043", "id": 714915025, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDkxNTAyNQ==", "user": {"value": 22429695, "label": "codecov[bot]"}, "created_at": "2020-10-23T05:09:09Z", "updated_at": "2020-10-23T05:09:09Z", "author_association": "NONE", "body": "# [Codecov](https://codecov.io/gh/simonw/datasette/pull/1043?src=pr&el=h1) Report\n> Merging [#1043](https://codecov.io/gh/simonw/datasette/pull/1043?src=pr&el=desc) into [main](https://codecov.io/gh/simonw/datasette/commit/d0cc6f4c32e1f89238ddec782086b3122f445bd4?el=desc) will **not change** coverage.\n> The diff coverage is `n/a`.\n\n[![Impacted file tree graph](https://codecov.io/gh/simonw/datasette/pull/1043/graphs/tree.svg?width=650&height=150&src=pr&token=eSahVY7kw1)](https://codecov.io/gh/simonw/datasette/pull/1043?src=pr&el=tree)\n\n```diff\n@@ Coverage Diff @@\n## main #1043 +/- ##\n=======================================\n Coverage 84.65% 84.65% \n=======================================\n Files 28 28 \n Lines 3924 3924 \n=======================================\n Hits 3322 3322 \n Misses 602 602 \n```\n\n\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/simonw/datasette/pull/1043?src=pr&el=continue).\n> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)\n> `\u0394 = absolute (impact)`, `\u00f8 = not affected`, `? = missing data`\n> Powered by [Codecov](https://codecov.io/gh/simonw/datasette/pull/1043?src=pr&el=footer). Last update [d0cc6f4...dc4129c](https://codecov.io/gh/simonw/datasette/pull/1043?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727915394, "label": "Include LICENSE in sdist"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1012#issuecomment-714908859", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1012", "id": 714908859, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDkwODg1OQ==", "user": {"value": 45380, "label": "bollwyvl"}, "created_at": "2020-10-23T04:49:20Z", "updated_at": "2020-10-23T04:49:20Z", "author_association": "CONTRIBUTOR", "body": "Good luck on 1.0! It may also be worth lobbying for a `Framework::Datasette::1.0` classifier. This would be a nice way to allow the ecosystem to self-document a bit more [discoverably](https://pypi.org/search/?q=&o=&c=Framework+%3A%3A+Datasette%3A%3A+1.0). \r\n\r\nI was surprised to see the [PR for `Framework::Jupyter`](https://github.com/pypa/warehouse/pull/1905/files) is a... database migration! Of course, there may be more workflow to it!", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 718540751, "label": "For 1.0 update trove classifier in setup.py"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1042#issuecomment-714868867", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1042", "id": 714868867, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDg2ODg2Nw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-23T02:31:17Z", "updated_at": "2020-10-23T02:31:17Z", "author_association": "OWNER", "body": "I'll build this in conjunction with a plugin that supports editing templates stored in SQLite.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727802081, "label": "Plugin hook for loading templates"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1042#issuecomment-714868624", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1042", "id": 714868624, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDg2ODYyNA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-23T02:30:27Z", "updated_at": "2020-10-23T02:30:37Z", "author_association": "OWNER", "body": "Maybe `register_template_loader(datasette)` which returns an object which is added in at the beginning of the list passed to `ChoiceLoader` here.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727802081, "label": "Plugin hook for loading templates"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1042#issuecomment-714868207", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1042", "id": 714868207, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDg2ODIwNw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-23T02:29:12Z", "updated_at": "2020-10-23T02:29:12Z", "author_association": "OWNER", "body": "Relevant code: https://github.com/simonw/datasette/blob/d0cc6f4c32e1f89238ddec782086b3122f445bd4/datasette/app.py#L288-L311", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727802081, "label": "Plugin hook for loading templates"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/173#issuecomment-714758139", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/173", "id": 714758139, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDc1ODEzOQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-22T20:57:56Z", "updated_at": "2020-10-22T20:57:56Z", "author_association": "OWNER", "body": "I could use `ijson` to provide a progress bar for JSON arrays too. I'd prefer to keep that as an optional dependency though, since `sqlite-utils` is a library dependency for many other projects and it would be using `ijson` purely for the CLI component.\r\n\r\nHere's how to iterate through a list of objects being read from a file:\r\n\r\n```python\r\nimport json\r\nparser = ijson.items(open(\r\n \"/tmp/list.json\"\r\n), \"item\")\r\nfor object in parser:\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": 707478649, "label": "Progress bar for sqlite-utils insert"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1041#issuecomment-714683801", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1041", "id": 714683801, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDY4MzgwMQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-22T18:37:47Z", "updated_at": "2020-10-22T18:37:47Z", "author_association": "OWNER", "body": "I think I'll do this by looking for URLs that start with `/` - since it's also possible to have full `https://...` URLs in that setting.\r\n```json\r\n{\r\n \"extra_css_urls\": [\r\n \"/static/styles.css\"\r\n ],\r\n \"extra_js_urls\": [\r\n \"/static/app.js\"\r\n ]\r\n}\r\n```\r\nI need to think about the `extra_css_urls` and `extra_js_urls` plugin hooks too: https://docs.datasette.io/en/stable/plugin_hooks.html#extra-css-urls-template-database-table-columns-view-name-request-datasette", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727627923, "label": "extra_js_urls and extra_css_urls should respect base_url setting"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1041#issuecomment-714682825", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1041", "id": 714682825, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDY4MjgyNQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-22T18:36:10Z", "updated_at": "2020-10-22T18:36:10Z", "author_association": "OWNER", "body": "I'll need to update these docs once there's a solution for this in place: https://docs.datasette.io/en/latest/custom_templates.html#serving-static-files", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727627923, "label": "extra_js_urls and extra_css_urls should respect base_url setting"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1041#issuecomment-714682288", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1041", "id": 714682288, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDY4MjI4OA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-22T18:35:15Z", "updated_at": "2020-10-22T18:35:15Z", "author_association": "OWNER", "body": "@psychemedia said: https://github.com/simonw/datasette/issues/1033#issuecomment-714657366\r\n\r\n> How does `/-/static` relate to [current guidance docs around `static`](https://docs.datasette.io/en/latest/custom_templates.html?highlight=static#serving-static-files) regarding the `--static option` and metadata formulations such as `\"extra_js_urls\": [ \"/static/app.js\"]` (I've not managed to get this to work in a Jupyter server proxied set up; the [datasette / jupyter server proxy repo](https://github.com/simonw/jupyterserverproxy-datasette-demo) may provide a useful test example, eg via MyBinder, for folk to crib from?)", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 727627923, "label": "extra_js_urls and extra_css_urls should respect base_url setting"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1033#issuecomment-714681365", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1033", "id": 714681365, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDY4MTM2NQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-22T18:33:48Z", "updated_at": "2020-10-22T18:33:48Z", "author_association": "OWNER", "body": "That's a good question - I hadn't considered that. I'm going to open a new issue to have `extra_js_urls` respect the `base_url` setting, since the static files will be served from a different location.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725099777, "label": "datasette.urls.static_plugins(...) method"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1033#issuecomment-714657366", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1033", "id": 714657366, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDY1NzM2Ng==", "user": {"value": 82988, "label": "psychemedia"}, "created_at": "2020-10-22T17:51:29Z", "updated_at": "2020-10-22T17:51:29Z", "author_association": "CONTRIBUTOR", "body": "How does `/-/static` relate to [current guidance docs around `static`](https://docs.datasette.io/en/latest/custom_templates.html?highlight=static#serving-static-files) regarding the `--static option` and metadata formulations such as `\"extra_js_urls\": [ \"/static/app.js\"]` (I've not managed to get this to work in a Jupyter server proxied set up; the [datasette / jupyter server proxy repo](https://github.com/simonw/jupyterserverproxy-datasette-demo) may provide a useful test example, eg via MyBinder, for folk to crib from?) ", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725099777, "label": "datasette.urls.static_plugins(...) method"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1031#issuecomment-714289680", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1031", "id": 714289680, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDI4OTY4MA==", "user": {"value": 299380, "label": "frankier"}, "created_at": "2020-10-22T07:23:52Z", "updated_at": "2020-10-22T07:23:52Z", "author_association": "NONE", "body": "The bug is that currently when there are databases passed in, but no -i flag, e.g. in configuration directory mode, inclusion in inspect-data.json does not automatically cause databases to be considered immutable, as described in the documentation.\r\n\r\nThe reason is that the -i flag is specified multiple=True, which means when it is not passed in we will get an empty list [], rather than None. So the current code decides that no databases are immutable rather than falling back to inspect-data.json -- as is presumably intended.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 724369025, "label": "Fallback to databases in inspect-data.json when no -i options are passed"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/171#issuecomment-714219725", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/171", "id": 714219725, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDIxOTcyNQ==", "user": {"value": 649467, "label": "mhalle"}, "created_at": "2020-10-22T04:38:35Z", "updated_at": "2020-10-22T04:38:35Z", "author_association": "NONE", "body": "Thanks. As I said, I think the result (being able to query tree structures like ancestors and descendants) is more important than the implementation, and I agree that this particular sqlite extension is too obscure. Just providing an sqlite utility to build or rebuild a transitive closure table might be more generically useful. I find that hierarchical data shows up pretty frequently in some data science problems.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 707407567, "label": "Idea: transitive closure tables for tree structures"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/sqlite-utils/issues/171#issuecomment-714208848", "issue_url": "https://api.github.com/repos/simonw/sqlite-utils/issues/171", "id": 714208848, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDIwODg0OA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-22T04:07:14Z", "updated_at": "2020-10-22T04:07:14Z", "author_association": "OWNER", "body": "I made the `--load-extension` command much more widely supported in #137 - which should be useful for anyone who wants to use this extension.\r\n\r\nIt's a bit too obscure for me to want to add direct Python library support relating to that extension though.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 707407567, "label": "Idea: transitive closure tables for tree structures"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1031#issuecomment-714206875", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1031", "id": 714206875, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDIwNjg3NQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-22T04:01:19Z", "updated_at": "2020-10-22T04:01:19Z", "author_association": "OWNER", "body": "I don't fully understand the bug you're fixing here. Could you provide a bit more explanation?", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 724369025, "label": "Fallback to databases in inspect-data.json when no -i options are passed"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1040#issuecomment-714206533", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1040", "id": 714206533, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDIwNjUzMw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-22T04:00:25Z", "updated_at": "2020-10-22T04:00:25Z", "author_association": "OWNER", "body": "I've decided not to offer a configuration option to turn this off. I'll reconsider if someone asks for it.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 726910999, "label": "/db/table/-/blob/pk/column.blob download URL"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/998#issuecomment-714205783", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/998", "id": 714205783, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDIwNTc4Mw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-22T03:58:13Z", "updated_at": "2020-10-22T03:58:13Z", "author_association": "OWNER", "body": "This is now live here: https://global-power-plants.datasettes.com/global-power-plants/global-power-plants", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 717699884, "label": "Wide tables should scroll horizontally within the page"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/998#issuecomment-714117534", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/998", "id": 714117534, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDExNzUzNA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-22T01:12:06Z", "updated_at": "2020-10-22T01:12:06Z", "author_association": "OWNER", "body": "Demo:\r\n![table-scroll](https://user-images.githubusercontent.com/9599/96806421-e74e7e00-13c8-11eb-95fe-44d01e4c2eb3.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": 717699884, "label": "Wide tables should scroll horizontally within the page"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/998#issuecomment-714092002", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/998", "id": 714092002, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDA5MjAwMg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-22T00:55:10Z", "updated_at": "2020-10-22T00:55:10Z", "author_association": "OWNER", "body": "This isn't blocked on #987 - it just means that `datasette-cluster-map` will need to learn to look for `.table-wrapper` first and fall back on the table.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 717699884, "label": "Wide tables should scroll horizontally within the page"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/998#issuecomment-714090965", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/998", "id": 714090965, "node_id": "MDEyOklzc3VlQ29tbWVudDcxNDA5MDk2NQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-22T00:54:30Z", "updated_at": "2020-10-22T00:54:30Z", "author_association": "OWNER", "body": "Easiest fix for the column action menu positioning - hide them when the user scrolls the containing div:\r\n```javascript\r\ndocument.querySelector('.table-wrapper').addEventListener(\r\n 'scroll', () => document.querySelector('.dropdown-menu').style.display = 'none'\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": 717699884, "label": "Wide tables should scroll horizontally within the page"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1038#issuecomment-713920461", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1038", "id": 713920461, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzkyMDQ2MQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-21T22:43:51Z", "updated_at": "2020-10-21T22:43:51Z", "author_association": "OWNER", "body": "Thanks for spotting this!", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 726154220, "label": "DOC: Fix syntax error"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1036#issuecomment-713899530", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1036", "id": 713899530, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzg5OTUzMA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-21T21:55:00Z", "updated_at": "2020-10-21T21:55:00Z", "author_association": "OWNER", "body": "This code needs these permission checks:\r\nhttps://github.com/simonw/datasette/blob/bf82b3d6a605c9ddadd5fb739249dfe6defaf635/datasette/views/table.py#L911-L913", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725996507, "label": "Make it possible to download BLOB data from the Datasette UI"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1036#issuecomment-713821656", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1036", "id": 713821656, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzgyMTY1Ng==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-21T19:22:45Z", "updated_at": "2020-10-21T19:41:48Z", "author_association": "OWNER", "body": "So for https://latest.datasette.io/fixtures/binary_data the BLOB download URLs would be:\r\n\r\n`https://latest.datasette.io/fixtures/-/blob/binary_data/1/data.blob` - that last bit after the primary key is to indicate the `data` column\r\n\r\nWith these headers:\r\n\r\n- `Content-Disposition: attachment; filename=\"binary_data-1-data.blob\"`\r\n- `X-Content-Type-Options: nosniff`\r\n- `Content-Type: application/binary`", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725996507, "label": "Make it possible to download BLOB data from the Datasette UI"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1036#issuecomment-713830842", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1036", "id": 713830842, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzgzMDg0Mg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-21T19:41:20Z", "updated_at": "2020-10-21T19:41:20Z", "author_association": "OWNER", "body": "Another useful demo database: https://datasette-render-images-demo.datasette.io/favicons/favicons - see https://datasette-render-images-demo.datasette.io/favicons/favicons.csv", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725996507, "label": "Make it possible to download BLOB data from the Datasette UI"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1036#issuecomment-713829629", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1036", "id": 713829629, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzgyOTYyOQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-21T19:38:43Z", "updated_at": "2020-10-21T19:38:43Z", "author_association": "OWNER", "body": "Should this work just for BLOB columns, or should it work for other columns too?\r\n\r\nFor the moment I'm going to restrict it to BLOBs, since data from other columns is available through the UI whereas BLOB columns are not.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725996507, "label": "Make it possible to download BLOB data from the Datasette UI"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1036#issuecomment-713818817", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1036", "id": 713818817, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzgxODgxNw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-21T19:17:01Z", "updated_at": "2020-10-21T19:17:01Z", "author_association": "OWNER", "body": "Actually I like `.blob`", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725996507, "label": "Make it possible to download BLOB data from the Datasette UI"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1036#issuecomment-713818178", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1036", "id": 713818178, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzgxODE3OA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-21T19:15:38Z", "updated_at": "2020-10-21T19:16:34Z", "author_association": "OWNER", "body": "What should the suggested filename be?\r\n\r\nI think something that includes the table name, primary key and the name of the column would work.\r\n\r\nHow about a file extension? I guess `.binary`, then let the user rename it? Or `.raw`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725996507, "label": "Make it possible to download BLOB data from the Datasette UI"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1039#issuecomment-713754844", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1039", "id": 713754844, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzc1NDg0NA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-21T17:58:27Z", "updated_at": "2020-10-21T17:58:27Z", "author_association": "OWNER", "body": "Now live: https://latest.datasette.io/fixtures/roadside_attraction_characteristics\r\n\r\n![anim](https://user-images.githubusercontent.com/9599/96759016-55288480-138c-11eb-8ba0-d8e0f6dd8b1f.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": 726687572, "label": "Add an animation to the column actions menu"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/pull/1038#issuecomment-713320666", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1038", "id": 713320666, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzMyMDY2Ng==", "user": {"value": 22429695, "label": "codecov[bot]"}, "created_at": "2020-10-21T05:50:38Z", "updated_at": "2020-10-21T05:50:38Z", "author_association": "NONE", "body": "# [Codecov](https://codecov.io/gh/simonw/datasette/pull/1038?src=pr&el=h1) Report\n> Merging [#1038](https://codecov.io/gh/simonw/datasette/pull/1038?src=pr&el=desc) into [main](https://codecov.io/gh/simonw/datasette/commit/66120a7a1cb592e8a21164cf537f62a4d7ab1dfc?el=desc) will **not change** coverage.\n> The diff coverage is `n/a`.\n\n[![Impacted file tree graph](https://codecov.io/gh/simonw/datasette/pull/1038/graphs/tree.svg?width=650&height=150&src=pr&token=eSahVY7kw1)](https://codecov.io/gh/simonw/datasette/pull/1038?src=pr&el=tree)\n\n```diff\n@@ Coverage Diff @@\n## main #1038 +/- ##\n=======================================\n Coverage 84.65% 84.65% \n=======================================\n Files 28 28 \n Lines 3924 3924 \n=======================================\n Hits 3322 3322 \n Misses 602 602 \n```\n\n\n\n------\n\n[Continue to review full report at Codecov](https://codecov.io/gh/simonw/datasette/pull/1038?src=pr&el=continue).\n> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)\n> `\u0394 = absolute (impact)`, `\u00f8 = not affected`, `? = missing data`\n> Powered by [Codecov](https://codecov.io/gh/simonw/datasette/pull/1038?src=pr&el=footer). Last update [66120a7...7fc0cce](https://codecov.io/gh/simonw/datasette/pull/1038?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).\n", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 726154220, "label": "DOC: Fix syntax error"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1036#issuecomment-713278349", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1036", "id": 713278349, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzI3ODM0OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-21T03:42:29Z", "updated_at": "2020-10-21T03:42:29Z", "author_association": "OWNER", "body": "Possible URL for this: `/db/table/-/blob/primary-keys` - this would use the `/db/table/-/` namespace proposed in #296.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725996507, "label": "Make it possible to download BLOB data from the Datasette UI"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/998#issuecomment-713269155", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/998", "id": 713269155, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzI2OTE1NQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-21T03:17:07Z", "updated_at": "2020-10-21T03:17:07Z", "author_association": "OWNER", "body": "This may require updates to the column action menu JavaScript too, since it was not built with scrolling sideways in mind.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 717699884, "label": "Wide tables should scroll horizontally within the page"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1037#issuecomment-713268905", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1037", "id": 713268905, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzI2ODkwNQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-21T03:16:36Z", "updated_at": "2020-10-21T03:16:36Z", "author_association": "OWNER", "body": "Dupe of #998.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 726094754, "label": "Add horizontal scrollbar to tables"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1037#issuecomment-713268498", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1037", "id": 713268498, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzI2ODQ5OA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-21T03:15:44Z", "updated_at": "2020-10-21T03:15:44Z", "author_association": "OWNER", "body": "This may require updates to the column action menu JavaScript too, since it was not built with scrolling sideways in mind.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 726094754, "label": "Add horizontal scrollbar to tables"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1037#issuecomment-713267989", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1037", "id": 713267989, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzI2Nzk4OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-21T03:14:34Z", "updated_at": "2020-10-21T03:14:34Z", "author_association": "OWNER", "body": "This is particularly relevant to the `datasette-cluster-map` plugin - the map is much nicer to use if the table itself can be scrolled.\r\n\r\nThat plugin also makes this harder to build, because the plugin inserts the map as the direct predecessor of the `` element and hence breaks if you try to wrap that in a `
`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 726094754, "label": "Add horizontal scrollbar to tables"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1036#issuecomment-713226726", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1036", "id": 713226726, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzIyNjcyNg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-21T01:04:25Z", "updated_at": "2020-10-21T01:04:25Z", "author_association": "OWNER", "body": "Extra security idea: a `blob_download_host` setting which can be used to indicate a host that should be used for downloads - for example `datasettestatic.com`. If this setting is populated then binary downloads are served from paths on that host only, and no other Datasette URLs from that host will be served.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725996507, "label": "Make it possible to download BLOB data from the Datasette UI"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/262#issuecomment-713208667", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/262", "id": 713208667, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzIwODY2Nw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-21T00:03:18Z", "updated_at": "2020-10-21T00:03:18Z", "author_association": "OWNER", "body": "I think I should prioritize the facets component of this, since that could have significant performance wins while also supporting `datasette-graphql`.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 323658641, "label": "Add ?_extra= mechanism for requesting extra properties in JSON"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/262#issuecomment-713200782", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/262", "id": 713200782, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzIwMDc4Mg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-20T23:41:30Z", "updated_at": "2020-10-20T23:41:30Z", "author_association": "OWNER", "body": "This is now blocking https://github.com/simonw/datasette-graphql/issues/61 because that issue needs a way to turn off suggested facets when retrieving the results of a table query.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 323658641, "label": "Add ?_extra= mechanism for requesting extra properties in JSON"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1034#issuecomment-713191819", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1034", "id": 713191819, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzE5MTgxOQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-20T23:12:58Z", "updated_at": "2020-10-20T23:12:58Z", "author_association": "OWNER", "body": "Enzo has a great solution here: https://twitter.com/enzo_mdd/status/1318685442976436226\r\n\r\n> Or maybe an option for a url. This keeps the CSV small but allows scripts to download binary data as needed.\r\n\r\nIn #1036 I'm planning on adding a way for users to access BLOB data. I can include that URL in the CSV output.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725184645, "label": "Better way of representing binary data in .csv output"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1036#issuecomment-713186189", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1036", "id": 713186189, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzE4NjE4OQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-20T22:56:33Z", "updated_at": "2020-10-20T22:56:33Z", "author_association": "OWNER", "body": "I think this plus the binary-CSV stuff in #1034 will justify a dedicated section of the documentation to talk about how Datasette handles binary BLOB columns.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725996507, "label": "Make it possible to download BLOB data from the Datasette UI"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1036#issuecomment-713185871", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1036", "id": 713185871, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzE4NTg3MQ==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-20T22:55:36Z", "updated_at": "2020-10-20T22:55:36Z", "author_association": "OWNER", "body": "I can also use a `Content-Disposition` header to force a download. I'm reasonably confident that the combination of `Content-Disposition` and `X-Content-Type-Options: nosniff` and `application/binary` will let me allow users to download the contents of arbitrary BLOB columns without any XSS risk.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725996507, "label": "Make it possible to download BLOB data from the Datasette UI"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1036#issuecomment-713185173", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1036", "id": 713185173, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzE4NTE3Mw==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-20T22:53:41Z", "updated_at": "2020-10-20T22:53:41Z", "author_association": "OWNER", "body": "https://security.stackexchange.com/questions/12896/does-x-content-type-options-really-prevent-content-sniffing-attacks says:\r\n\r\n> In Tangled Web Michal Zalewski says:\r\n> \r\n> > Refrain from using Content-Type: application/octet-stream and use application/binary instead, especially for unknown document types. Refrain from returning Content-Type: text/plain.\r\n> > \r\n> > For example, any code-hosting platform must exercise caution when returning executables or source archives as application/octet-stream, because there is a risk they may be misinterpreted as HTML and displayed inline.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725996507, "label": "Make it possible to download BLOB data from the Datasette UI"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1036#issuecomment-713184374", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1036", "id": 713184374, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzE4NDM3NA==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-20T22:51:22Z", "updated_at": "2020-10-20T22:51:22Z", "author_association": "OWNER", "body": "From https://hackerone.com/reports/126197:\r\n\r\n> archive.uber.com mirrors pypi. When downloading `.tar.gz` files from archive.uber.com, the MIME type is `application/octet-stream`. Injecting `` into the start of the `.tar.gz` causes an XSS in Internet Explorer due to MIME sniffing.\r\n\r\nSo you do have to be careful not to open accidental XSS holes with `application/octet-stream` thanks to (presumably older) versions of IE.\r\n\r\nFrom that thread it looks like the solution is to add a `X-Content-Type-Options: nosniff` header.", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725996507, "label": "Make it possible to download BLOB data from the Datasette UI"}, "performed_via_github_app": null} {"html_url": "https://github.com/simonw/datasette/issues/1036#issuecomment-713183306", "issue_url": "https://api.github.com/repos/simonw/datasette/issues/1036", "id": 713183306, "node_id": "MDEyOklzc3VlQ29tbWVudDcxMzE4MzMwNg==", "user": {"value": 9599, "label": "simonw"}, "created_at": "2020-10-20T22:48:10Z", "updated_at": "2020-10-20T22:48:10Z", "author_association": "OWNER", "body": "Twitter thread: https://twitter.com/dancow/status/1318681053347840005", "reactions": "{\"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "issue": {"value": 725996507, "label": "Make it possible to download BLOB data from the Datasette UI"}, "performed_via_github_app": null}