github
id | node_id | number | title | user | state | locked | assignee | milestone | comments | created_at | updated_at | closed_at | author_association | pull_request | body | repo | type | active_lock_reason | performed_via_github_app | reactions | draft | state_reason |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
717729056 | MDU6SXNzdWU3MTc3MjkwNTY= | 999 | Datasette should default to running Uvicorn with workers=1 | 9599 | closed | 0 | 5971510 | 3 | 2020-10-08T23:07:03Z | 2020-10-08T23:55:46Z | 2020-10-08T23:21:36Z | OWNER | Uvicorn uses the `WEB_CONCURRENCY` variable, if set, to specify the number of workers to use. Datasette does not work with options for this other than 1: ``` WEB_CONCURRENCY=2 datasette . WARNING: You must pass the application as an import string to enable 'reload' or 'workers'. ``` This was the cause of the Heroku bug in #627. I fixed that issue by setting `WEB_CONCURRENCY=1` in `datasette publish heroku`, but a better fix would be to hard-code `workers=1` in Datasette itself. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/999/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
717699884 | MDU6SXNzdWU3MTc2OTk4ODQ= | 998 | Wide tables should scroll horizontally within the page | 9599 | closed | 0 | 6026070 | 8 | 2020-10-08T22:13:27Z | 2020-12-11T09:25:09Z | 2020-10-22T01:12:26Z | OWNER | Wrap the main table in `<div style="overflow-x: auto">` | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/998/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
716988478 | MDU6SXNzdWU3MTY5ODg0Nzg= | 997 | Documentation covering buildpack deployment | 9599 | closed | 0 | 5971510 | 3 | 2020-10-08T03:21:52Z | 2020-10-08T23:56:03Z | 2020-10-08T23:32:10Z | OWNER | A tidied up version of https://til.simonwillison.net/til/til/digitalocean_datasette-on-digitalocean-app-platform.md - but mention that you can deploy to Heroku using the same mechanism. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/997/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
716756082 | MDU6SXNzdWU3MTY3NTYwODI= | 996 | Better handling of multiple matching template wildcard paths | 9599 | closed | 0 | 5971510 | 3 | 2020-10-07T18:25:40Z | 2020-10-08T23:55:41Z | 2020-10-07T22:51:17Z | OWNER | I tried building this: templates/pages/{topic}.html templates/pages/{topic}/{slug}.html And it didn't work - hits to /foo/bar which should have been rendered by the `{slug}.html` template were instead rendered by the top level `{topic.html}` template. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/996/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
715146588 | MDExOlB1bGxSZXF1ZXN0NDk4MTA0ODMw | 994 | Run tests against Python 3.9 | 9599 | closed | 0 | 1 | 2020-10-05T20:40:13Z | 2020-10-09T16:22:51Z | 2020-10-09T16:22:50Z | OWNER | simonw/datasette/pulls/994 | 107914493 | pull | { "url": "https://api.github.com/repos/simonw/datasette/issues/994/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
0 | ||||||
715072935 | MDU6SXNzdWU3MTUwNzI5MzU= | 993 | Column action menu should show column type | 9599 | closed | 0 | 5971510 | 2 | 2020-10-05T18:40:49Z | 2020-10-08T23:55:19Z | 2020-10-06T00:33:15Z | OWNER | <img width="616" alt="data__rent_burden_households_and_median_gross_rent_percent__97_rows" src="https://user-images.githubusercontent.com/9599/95118702-97509580-06ff-11eb-8523-39eb1b389acd.png"> | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/993/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
714449879 | MDU6SXNzdWU3MTQ0NDk4Nzk= | 992 | Change "--config foo:bar" to "--setting foo bar" | 9599 | closed | 0 | 6055094 | 6 | 2020-10-05T01:27:45Z | 2020-11-24T20:01:54Z | 2020-11-24T20:01:54Z | OWNER | I designed the config format before I had a good feel for CLI design using Click. `--config max_page_size 2000` is better than `--config max_page_size:2000`. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/992/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
714377268 | MDU6SXNzdWU3MTQzNzcyNjg= | 991 | Redesign application homepage | 9599 | open | 0 | 7 | 2020-10-04T18:48:45Z | 2021-01-26T19:06:36Z | OWNER | Most Datasette instances only host a single database, but the current homepage design assumes that it should leave plenty of space for multiple databases: <img width="878" alt="Datasette_Fixtures__fixtures" src="https://user-images.githubusercontent.com/9599/95024344-5b51fd80-0637-11eb-8a11-40bad16f6907.png"> Reconsider this design - should the default show more information? The Covid-19 Datasette homepage looks particularly sparse I think: https://covid-19.datasettes.com/ <img width="782" alt="COVID-19_cases__using_data_from_Johns_Hopkins_CSSE__the_New_York_Times_and_the_LA_Times__covid" src="https://user-images.githubusercontent.com/9599/95024391-876d7e80-0637-11eb-8f19-ef38e4c87d2a.png"> | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/991/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
||||||||
274023625 | MDU6SXNzdWUyNzQwMjM2MjU= | 99 | Start a change log | 9599 | closed | 0 | 0 | 2017-11-15T03:33:21Z | 2017-11-16T15:12:46Z | 2017-11-16T15:12:45Z | OWNER | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/99/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||||
713304417 | MDU6SXNzdWU3MTMzMDQ0MTc= | 989 | Column action sort descending/ascending links should remove _next= pagination | 9599 | closed | 0 | 5971510 | 0 | 2020-10-02T02:33:48Z | 2020-10-08T23:55:15Z | 2020-10-04T18:05:28Z | OWNER | On page https://latest.datasette.io/fixtures/sortable?_next=15%2Cg%2Cz&_sort=sortable clicking on `sortable_with_nulls > sort_ascending` links to https://latest.datasette.io/fixtures/sortable?_next=15%2Cg%2Cz&_sort_desc=sortable_with_nulls - which doesn't make sense. Changing the sort order needs to reset to the first page. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/989/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
713209404 | MDU6SXNzdWU3MTMyMDk0MDQ= | 988 | Mechanism for plugins to construct URLs that respect base_url | 9599 | closed | 0 | 6026070 | 2 | 2020-10-01T21:54:15Z | 2020-10-23T19:44:05Z | 2020-10-15T23:01:02Z | OWNER | > Had a thought: this is likely to break in plugins too, such as `datasette-edit-schema` which constructs URLs for redirects e.g. here: https://github.com/simonw/datasette-edit-schema/blob/dbd0abee6dd3385b114cfe9671f7ead1c4855b60/datasette_edit_schema/__init__.py#L46-L48 _Originally posted by @simonw in https://github.com/simonw/datasette/issues/865#issuecomment-702418045_ | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/988/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
712984738 | MDU6SXNzdWU3MTI5ODQ3Mzg= | 987 | Documented HTML hooks for JavaScript plugin authors | 9599 | open | 0 | 7 | 2020-10-01T16:10:14Z | 2021-01-25T04:00:03Z | OWNER | In #981 I added `data-column=` attributes to the `<th>` on the table page. These should become part of Datasette's documented API so JavaScript plugin authors can use them to derive things about the tables shown on a page (`datasette-cluster-map uses them as-of https://github.com/simonw/datasette-cluster-map/issues/18). | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/987/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
||||||||
712839383 | MDU6SXNzdWU3MTI4MzkzODM= | 985 | Column actions should support facet by compound primary keys | 9599 | closed | 0 | 5971510 | 1 | 2020-10-01T13:21:57Z | 2020-10-08T23:55:11Z | 2020-10-01T16:50:41Z | OWNER | On https://latest.datasette.io/fixtures/compound_three_primary_keys the column action menu doesn't display for the pk1, pk2 and pk3 columns (because they are primary keys) even though faceting by them is actually useful. Refs #98 | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/985/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
712368432 | MDU6SXNzdWU3MTIzNjg0MzI= | 984 | Review accessibility of new column action menus | 9599 | open | 0 | 1 | 2020-09-30T23:56:44Z | 2020-10-01T00:01:36Z | OWNER | Feature added in #981 | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/984/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
||||||||
712260429 | MDU6SXNzdWU3MTIyNjA0Mjk= | 983 | JavaScript plugin hooks mechanism similar to pluggy | 9599 | open | 0 | 47 | 2020-09-30T20:32:43Z | 2021-01-25T04:43:58Z | OWNER | > It would be neat to provide a JavaScript plugin hook that plugins can use to add their own options to this menu. No idea what that would look like though. _Originally posted by @simonw in https://github.com/simonw/datasette/issues/981#issuecomment-701616922_ | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/983/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
||||||||
712202333 | MDU6SXNzdWU3MTIyMDIzMzM= | 982 | SQL editor should allow execution of write queries, if you have permission | 9599 | open | 0 | 2 | 2020-09-30T19:04:35Z | 2022-01-13T22:21:29Z | OWNER | The `datasette-write` plugin provides this at the moment https://github.com/simonw/datasette-write - but it feels like it should be a built-in capability, protected by a default permission. UI concept: if you have write permission then the existing SQL editor gets an "execute write" checkbox underneath it. JavaScript can spot if you appear to be trying to execute an UPDATE or INSERT or DELETE query and check that checkbox for you. If you link to a query page with a non-SELECT then that query will be displayed in the box ready for you to POST submit it. The page will also then get "cannot be embedded" headers to protect against clickjacking. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/982/reactions", "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
||||||||
711627628 | MDU6SXNzdWU3MTE2Mjc2Mjg= | 981 | Action menu for table columns | 9599 | closed | 0 | 5971510 | 16 | 2020-09-30T04:45:38Z | 2020-10-08T23:55:00Z | 2020-09-30T23:58:17Z | OWNER | At the very least I'd like a menu on each table column that lets me select sort-asc v.s. sort-desc without having to click twice. I'd also like to be able to indicate that a column should be used for faceting (possibly only for columns that are not floating point and do not have a unique index on them). This needs to be built with accessibility in mind - I don't want screenreaders to read out the contents of a menu as the "th" label for any given cell. Related: #690 | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/981/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
710819020 | MDU6SXNzdWU3MTA4MTkwMjA= | 980 | Another rendering glitch with column headers on mobile | 9599 | closed | 0 | 5971510 | 2 | 2020-09-29T06:53:13Z | 2020-10-08T23:54:49Z | 2020-09-29T19:21:50Z | OWNER | Similar to #978. https://latest-with-plugins.datasette.io/fixtures?sql=select%0D%0A++dateutil_rrule(%27FREQ%3DHOURLY%3BCOUNT%3D5%27)%2C%0D%0A++dateutil_rrule_date(%0D%0A++++%27FREQ%3DDAILY%3BCOUNT%3D3%27%2C%0D%0A++++%271st+jan+2020%27%0D%0A++)%3B <img width="452" alt="fixtures__select_dateutil_rrule__FREQ_HOURLY_COUNT_5____dateutil_rrule_date___FREQ_DAILY_COUNT_3____1st_jan_2020____" src="https://user-images.githubusercontent.com/9599/94523237-c0e05d00-01e5-11eb-880d-5535f43f07a5.png"> | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/980/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
274023417 | MDU6SXNzdWUyNzQwMjM0MTc= | 98 | Default to 127.0.0.1 not 0.0.0.0 | 9599 | closed | 0 | 0 | 2017-11-15T03:31:55Z | 2017-11-15T05:08:54Z | 2017-11-15T05:08:54Z | OWNER | https://twitter.com/yschimke/status/930606210855854080 | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/98/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
710650633 | MDU6SXNzdWU3MTA2NTA2MzM= | 979 | Default table view JSON should include CREATE TABLE | 9599 | closed | 0 | 3 | 2020-09-28T23:54:58Z | 2023-01-09T15:32:39Z | 2023-01-09T15:32:22Z | OWNER | https://latest.datasette.io/fixtures/facetable.json doesn't currently include the CREATE TABLE statement for the page, even though it's available on the HTML version at https://latest.datasette.io/fixtures/facetable | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/979/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
710506708 | MDU6SXNzdWU3MTA1MDY3MDg= | 978 | Rendering glitch with column headings on mobile | 9599 | closed | 0 | 5971510 | 6 | 2020-09-28T19:04:45Z | 2020-10-08T23:54:40Z | 2020-09-28T22:43:01Z | OWNER | ![6348FED5-1310-47DA-BF54-810E63C96C6F](https://user-images.githubusercontent.com/9599/94474607-bc368d00-0182-11eb-9bb1-9a0e455353f1.jpeg) https://latest-with-plugins.datasette.io/fixtures?sql=select%0D%0A++dateutil_parse%28%2210+october+2020+3pm%22%29%2C%0D%0A++dateutil_easter%28%222020%22%29%2C%0D%0A++dateutil_parse_fuzzy%28%22This+is+due+10+september%22%29%2C%0D%0A++dateutil_parse%28%221%2F2%2F2020%22%29%2C%0D%0A++dateutil_parse%28%222020-03-04%22%29%2C%0D%0A++dateutil_parse_dayfirst%28%222020-03-04%22%29%2C%0D%0A++dateutil_easter%282020%29 | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/978/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
708289783 | MDU6SXNzdWU3MDgyODk3ODM= | 976 | Idea: -o could open to a more convenient location | 9599 | closed | 0 | 2 | 2020-09-24T15:56:35Z | 2020-10-26T05:07:10Z | 2020-10-26T05:06:26Z | OWNER | > Idea: if a database only has a single table, this could open straight to `/db/table`. If it has multiple tables but a single database it could open straight to `/db`. _Originally posted by @simonw in https://github.com/simonw/datasette/issues/970#issuecomment-698434236_ | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/976/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
706486323 | MDU6SXNzdWU3MDY0ODYzMjM= | 973 | 'bool' object is not callable error | 9599 | closed | 0 | 5971510 | 2 | 2020-09-22T15:30:54Z | 2020-10-08T23:54:32Z | 2020-09-22T15:40:35Z | OWNER | I'm getting this when latest is deployed to Cloud Run: ``` Traceback (most recent call last): File "/usr/local/bin/datasette", line 8, in <module> sys.exit(cli()) File "/usr/local/lib/python3.8/site-packages/click/core.py", line 829, in __call__ return self.main(*args, **kwargs) File "/usr/local/lib/python3.8/site-packages/click/core.py", line 782, in main rv = self.invoke(ctx) File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1259, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) File "/usr/local/lib/python3.8/site-packages/click/core.py", line 1066, in invoke return ctx.invoke(self.callback, **ctx.params) File "/usr/local/lib/python3.8/site-packages/click/core.py", line 610, in invoke return callback(*args, **kwargs) File "/usr/local/lib/python3.8/site-packages/datasette/cli.py", line 406, in serve inspect_data = json.load(open(inspect_file)) TypeError: 'bool' object is not callable ``` I think I may have broken things in #970 - a980199e61fe7ccf02c2123849d86172d2ae54ff | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/973/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
705840673 | MDU6SXNzdWU3MDU4NDA2NzM= | 972 | Support faceting against arbitrary SQL queries | 9599 | open | 0 | 1 | 2020-09-21T19:00:43Z | 2021-12-15T18:02:20Z | OWNER | > ... support for running facets against arbitrary custom SQL queries is half-done in that facets now execute against wrapped subqueries as-of ea66c45df96479ef66a89caa71fff1a97a862646 > > https://github.com/simonw/datasette/blob/ea66c45df96479ef66a89caa71fff1a97a862646/datasette/facets.py#L192-L200 _Originally posted by @simonw in https://github.com/simonw/datasette/issues/971#issuecomment-696307922_ | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/972/reactions", "total_count": 3, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 3, "rocket": 0, "eyes": 0 } |
||||||||
705827457 | MDU6SXNzdWU3MDU4Mjc0NTc= | 971 | Support the dbstat table | 9599 | closed | 0 | 7 | 2020-09-21T18:38:53Z | 2020-09-21T19:00:02Z | 2020-09-21T18:59:52Z | OWNER | `dbstat` is a table that is usually available on SQLite giving statistics about the database. For example: https://fivethirtyeight.datasettes.com/fivethirtyeight?sql=SELECT+*+FROM+%22dbstat%22+WHERE+name%3D%27bachelorette%2Fbachelorette%27%3B | name | path | pageno | pagetype | ncell | payload | unused | mx_payload | pgoffset | pgsize | |---------------------------|--------|----------|------------|---------|-----------|----------|--------------|------------|----------| | bachelorette/bachelorette | / | 89 | internal | 13 | 0 | 3981 | 0 | 360448 | 4096 | | bachelorette/bachelorette | /000/ | 91 | leaf | 66 | 3792 | 32 | 74 | 368640 | 4096 | | bachelorette/bachelorette | /001/ | 92 | leaf | 67 | 3800 | 14 | 74 | 372736 | 4096 | | bachelorette/bachelorette | /002/ | 93 | leaf | 65 | 3717 | 46 | 70 | 376832 | 4096 | | bachelorette/bachelorette | /003/ | 94 | leaf | 68 | 3742 | 6 | 71 | 380928 | 4096 | | bachelorette/bachelorette | /004/ | 95 | leaf | 70 | 3696 | 42 | 66 | 385024 | 4096 | | bachelorette/bachelorette | /005/ | 96 | leaf | 69 | 3721 | 22 | 71 | 389120 | 4096 | | bachelorette/bachelorette | /006/ | 97 | leaf | 70 | 3737 | 1 | 72 | 393216 | 4096 | | bachelorette/bachelorette | /007/ | 98 | leaf | 69 | 3728 | 15 | 69 | 397312 | 4096 | | bachelorette/bachelorette | /008/ | 99 | leaf | 73 | 3715 | 8 | 64 | 401408 | 4096 | | bachelorette/bachelorette | /009/ | 100 | leaf | 73 | 3705 | 18 | 62 | 405504 | 4096 | | bachelorette/bachelorette | /… | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/971/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
274022950 | MDU6SXNzdWUyNzQwMjI5NTA= | 97 | Link to JSON for the list of tables | 9599 | closed | 0 | 3 | 2017-11-15T03:29:05Z | 2018-05-29T18:51:35Z | 2018-05-28T20:57:21Z | OWNER | https://twitter.com/yschimke/status/930606210855854080 | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/97/reactions", "total_count": 1, "+1": 1, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
702069429 | MDU6SXNzdWU3MDIwNjk0Mjk= | 967 | Writable canned queries with magic parameters fail if POST body is empty | 9599 | closed | 0 | 11 | 2020-09-15T16:14:43Z | 2020-09-15T20:13:10Z | 2020-09-15T20:13:10Z | OWNER | When I try to use the new `?_json=1` feature from #880 with magic parameters from #842 I get this error: > Incorrect number of bindings supplied. The current statement uses 1, and there are 0 supplied | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/967/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
701584448 | MDU6SXNzdWU3MDE1ODQ0NDg= | 966 | Remove _request_ip example from canned queries documentation | 9599 | closed | 0 | 0 | 2020-09-15T03:51:33Z | 2020-09-15T03:52:45Z | 2020-09-15T03:52:45Z | OWNER | `_request_ip` isn't valid, so it shouldn't be in the example: https://github.com/simonw/datasette/blob/cb515a9d75430adaf5e545a840bbc111648e8bfd/docs/sql_queries.rst#L320-L322 | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/966/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
701294727 | MDU6SXNzdWU3MDEyOTQ3Mjc= | 965 | Documentation for 404.html, 500.html templates | 9599 | closed | 0 | 5818042 | 3 | 2020-09-14T17:36:59Z | 2020-09-14T18:49:49Z | 2020-09-14T18:47:22Z | OWNER | This mechanism is not documented: https://github.com/simonw/datasette/blob/30b98e4d2955073ca2bca92ca7b3d97fcd0191bf/datasette/app.py#L1119-L1129 | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/965/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
700728217 | MDU6SXNzdWU3MDA3MjgyMTc= | 964 | raise_404 mechanism for custom templates | 9599 | closed | 0 | 5818042 | 1 | 2020-09-14T03:22:15Z | 2020-09-14T17:49:44Z | 2020-09-14T17:39:34Z | OWNER | > Having tried this out I think it does need a `raise_404()` mechanism - which needs to be smart enough to trigger the default 404 handler without accidentally going into an infinite loop. _Originally posted by @simonw in https://github.com/simonw/datasette/issues/944#issuecomment-691788478_ | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/964/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
699622046 | MDU6SXNzdWU2OTk2MjIwNDY= | 962 | datasette --pdb option for debugging errors | 9599 | closed | 0 | 5818042 | 1 | 2020-09-11T18:33:10Z | 2020-09-11T21:34:24Z | 2020-09-11T18:38:01Z | OWNER | I needed to debug an exception from deep inside a Jinja template the other day. I hacked this together and it helped. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/962/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
696908389 | MDU6SXNzdWU2OTY5MDgzODk= | 961 | Verification checks for metadata.json on startup | 9599 | open | 0 | 2 | 2020-09-09T15:21:53Z | 2020-09-09T15:24:31Z | OWNER | I lost a bunch of time yesterday trying to figure out why a Datasette instance wasn't starting up - it turned out it was because I had a `facets:` reference that mentioned a column that did not exist. Catching these on startup would be good. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/961/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
||||||||
274001453 | MDU6SXNzdWUyNzQwMDE0NTM= | 96 | UI for editing named parameters | 9599 | closed | 0 | 3 | 2017-11-15T01:19:21Z | 2017-11-16T01:45:51Z | 2017-11-16T01:33:38Z | OWNER | On any page displaying a custom query that includes named parameters, we should show HTML form fields for editing those parameters. Eg the breed parameter on https://australian-dogs.now.sh/australian-dogs-3ba9628?sql=select+name%2C+count%28*%29+as+n+from+%28%0D%0A%0D%0Aselect+upper%28%22Animal+name%22%29+as+name+from+%5BAdelaide-City-Council-dog-registrations-2013%5D+where+Breed+like+%3Abreed%0D%0A%0D%0Aunion+all%0D%0A%0D%0Aselect+upper%28Animal_Name%29+as+name+from+%5BAdelaide-City-Council-dog-registrations-2014%5D+where+Breed_Description+like+%3Abreed%0D%0A%0D%0Aunion+all+%0D%0A%0D%0Aselect+upper%28Animal_Name%29+as+name+from+%5BAdelaide-City-Council-dog-registrations-2015%5D+where+Breed_Description+like+%3Abreed%0D%0A%0D%0Aunion+all%0D%0A%0D%0Aselect+upper%28%22AnimalName%22%29+as+name+from+%5BCity-of-Port-Adelaide-Enfield-Dog_Registrations_2016%5D+where+AnimalBreed+like+%3Abreed%0D%0A%0D%0Aunion+all%0D%0A%0D%0Aselect+upper%28%22Animal+Name%22%29+as+name+from+%5BMitcham-dog-registrations-2015%5D+where+Breed+like+%3Abreed%0D%0A%0D%0Aunion+all%0D%0A%0D%0Aselect+upper%28%22DOG_NAME%22%29+as+name+from+%5Bburnside-dog-registrations-2015%5D+where+DOG_BREED+like+%3Abreed%0D%0A%0D%0Aunion+all+%0D%0A%0D%0Aselect+upper%28%22Animal_Name%22%29+as+name+from+%5Bcity-of-playford-2015-dog-registration%5D+where+Breed_Description+like+%3Abreed%0D%0A%0D%0Aunion+all%0D%0A%0D%0Aselect+upper%28%22Animal+Name%22%29+as+name+from+%5Bcity-of-prospect-dog-registration-details-2016%5D+where%22Breed+Description%22+like+%3Abreed%0D%0A%0D%0A%29+group+by+name+order+by+n+desc%3B&breed=pug | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/96/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
691537426 | MDU6SXNzdWU2OTE1Mzc0MjY= | 959 | Internals API idea: results.dicts in addition to results.rows | 9599 | open | 0 | 0 | 2020-09-03T00:50:17Z | 2020-09-03T00:50:17Z | OWNER | I just wrote this code: ```python results = await database.execute(SEARCH_SQL, {"query": query}) return [dict(r) for r in results.rows] ``` How about having `results.dicts` as a utility property that does that? | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/959/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
||||||||
691475400 | MDU6SXNzdWU2OTE0NzU0MDA= | 958 | Upgrade to latest Black (20.8b1) | 9599 | closed | 0 | 5818042 | 0 | 2020-09-02T22:24:19Z | 2020-09-11T21:34:24Z | 2020-09-02T22:25:10Z | OWNER | Black has some changes: https://black.readthedocs.io/en/stable/change_log.html#b0 - in particular: > - re-implemented support for explicit trailing commas: now it works consistently within any bracket pair, including nested structures (#1288 and duplicates) > - Black now reindents docstrings when reindenting code around it (#1053) | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/958/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
688622148 | MDU6SXNzdWU2ODg2MjIxNDg= | 957 | Simplify imports of common classes | 9599 | closed | 0 | 3268330 | 7 | 2020-08-29T23:44:04Z | 2022-02-06T06:36:41Z | 2022-02-06T06:34:37Z | OWNER | There are only a few classes that plugins need to import. It would be nice if these imports were as short and memorable as possible. For example: ```python from datasette.app import Datasette from datasette.utils.asgi import Response ``` Could both become: ```python from datasette import Datasette from datasette import Response ``` | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/957/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
688427751 | MDU6SXNzdWU2ODg0Mjc3NTE= | 956 | Push to Docker Hub failed - but it shouldn't run for alpha releases anyway | 9599 | closed | 0 | 7 | 2020-08-29T01:09:12Z | 2020-09-15T20:46:41Z | 2020-09-15T20:36:34Z | OWNER | https://github.com/simonw/datasette/runs/1043709494?check_suite_focus=true <img width="740" alt="Release_notes_for_0_49a0_·_simonw_datasette_7178126" src="https://user-images.githubusercontent.com/9599/91625110-80c55a80-e959-11ea-8fea-70508c53fcfb.png"> - [x] This step should not run if a release is an alpha or beta - [x] When it DOES run it should work - [x] See it work for both an alpha and a non-alpha release, then close this ticket | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/956/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
687711713 | MDU6SXNzdWU2ODc3MTE3MTM= | 955 | Release updated datasette-atom and datasette-ics | 9599 | closed | 0 | 5818042 | 2 | 2020-08-28T04:55:21Z | 2020-09-14T22:19:46Z | 2020-09-14T22:19:46Z | OWNER | These should release straight after Datasette 0.49 with the change from #953. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/955/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
687694947 | MDU6SXNzdWU2ODc2OTQ5NDc= | 954 | Remove old register_output_renderer dict mechanism in Datasette 1.0 | 9599 | open | 0 | 3268330 | 1 | 2020-08-28T04:04:23Z | 2020-08-28T04:56:31Z | OWNER | > Documentation says that the old dictionary mechanism will be deprecated by 1.0: > > https://github.com/simonw/datasette/blob/799ecae94824640bdff21f86997f69844048d5c3/docs/plugin_hooks.rst#L460 _Originally posted by @simonw in https://github.com/simonw/datasette/issues/953#issuecomment-682312494_ | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/954/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
|||||||
687681018 | MDU6SXNzdWU2ODc2ODEwMTg= | 953 | register_output_renderer render function should be able to return a Response | 9599 | closed | 0 | 5818042 | 1 | 2020-08-28T03:21:21Z | 2020-08-28T04:53:03Z | 2020-08-28T04:03:01Z | OWNER | That plugin hook was designed before Datasette had a documented Response class. It should optionally be allowed to return a Response in addition to the current custom dictionary. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/953/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
685806511 | MDU6SXNzdWU2ODU4MDY1MTE= | 950 | Private/secret databases: database files that are only visible to plugins | 9599 | closed | 0 | 6 | 2020-08-25T20:46:17Z | 2023-08-24T22:26:09Z | 2023-08-24T22:26:08Z | OWNER | In thinking about the best way to implement https://github.com/simonw/datasette-auth-passwords/issues/6 (SQL-backed user accounts for `datasette-auth-passwords`) I realized that there are a few different use-cases where a plugin might want to store data that isn't visible to regular Datasette users: - Storing password hashes - Storing API tokens - Storing secrets that are used for data import integrations (secrets for talking to the Twitter API for example) Idea: allow one or more private database files to be attached to Datasette, something like this: datasette github.db linkedin.db -s secrets.db -m metadata.yml The `secrets.db` file would not be visible using any of the Datasette's usual interface or API routes - but plugins would be able to run queries against it. So `datasette-auth-passwords` might then be configured like this: ```yaml plugins: datasette-auth-passwords: database: secrets sql: "select password_hash from passwords where username = :username" ``` The plugin could even refuse to operate against a database that hadn't been loaded as a secret database. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/950/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
273998513 | MDU6SXNzdWUyNzM5OTg1MTM= | 95 | Allow shorter time limits to be set using a ?_sql_time_limit_ms =20 query string limit | 9599 | closed | 0 | 1 | 2017-11-15T01:02:16Z | 2017-11-15T02:56:13Z | 2017-11-15T02:56:13Z | OWNER | This cannot be greater than the configured time limit. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/95/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
684961449 | MDU6SXNzdWU2ODQ5NjE0NDk= | 949 | Try out CodeMirror SQL hints | 9599 | closed | 0 | 5 | 2020-08-24T20:58:21Z | 2023-11-03T05:28:58Z | 2020-11-01T03:29:48Z | OWNER | > It would also be interesting to try out the SQL hint mode, which can autocomplete against tables and columns. This demo shows how to configure that: https://codemirror.net/mode/sql/ > > Some missing documentation: https://stackoverflow.com/questions/20023381/codemirror-how-add-tables-to-sql-hint _Originally posted by @simonw in https://github.com/simonw/datasette/issues/948#issuecomment-679355426_ | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/949/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
684925907 | MDU6SXNzdWU2ODQ5MjU5MDc= | 948 | Upgrade CodeMirror | 9599 | closed | 0 | 5818042 | 8 | 2020-08-24T19:55:33Z | 2020-09-30T20:36:12Z | 2020-08-30T18:03:07Z | OWNER | Datasette currently bundles 5.31.0 (from October 2017) - latest version is 5.57.0 (August 2020). https://codemirror.net/doc/releases.html | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/948/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
684111953 | MDU6SXNzdWU2ODQxMTE5NTM= | 947 | datasette --get exit code should reflect HTTP errors | 9599 | closed | 0 | 5818042 | 1 | 2020-08-23T04:17:08Z | 2020-09-11T21:33:15Z | 2020-09-11T21:33:15Z | OWNER | If you run `datasette . --get /` and the result is a 500 or 404 error (anything that's not a 200 or a 30x) the exit code from the command should not be 0. It should still output the returned content to stdout. This will help with writing soundness checks, as seen in https://til.simonwillison.net/til/til/github-actions_grep-tests.md | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/947/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
682184050 | MDU6SXNzdWU2ODIxODQwNTA= | 946 | Exception in tracing code | 9599 | closed | 0 | 1 | 2020-08-19T21:12:27Z | 2020-09-15T20:16:50Z | 2020-09-15T20:16:50Z | OWNER | When using `?_trace=1`: ``` Traceback (most recent call last): File "/Users/simon/.local/share/virtualenvs/rockybeaches-09H592sC/lib/python3.8/site-packages/uvicorn/protocols/http/httptools_impl.py", line 390, in run_asgi result = await app(self.scope, self.receive, self.send) File "/Users/simon/.local/share/virtualenvs/rockybeaches-09H592sC/lib/python3.8/site-packages/uvicorn/middleware/proxy_headers.py", line 45, in __call__ return await self.app(scope, receive, send) File "/Users/simon/.local/share/virtualenvs/rockybeaches-09H592sC/lib/python3.8/site-packages/datasette/utils/asgi.py", line 150, in __call__ await self.app(scope, receive, send) File "/Users/simon/.local/share/virtualenvs/rockybeaches-09H592sC/lib/python3.8/site-packages/datasette/tracer.py", line 137, in __call__ await self.app(scope, receive, wrapped_send) File "/usr/local/opt/python@3.8/Frameworks/Python.framework/Versions/3.8/lib/python3.8/contextlib.py", line 120, in __exit__ next(self.gen) File "/Users/simon/.local/share/virtualenvs/rockybeaches-09H592sC/lib/python3.8/site-packages/datasette/tracer.py", line 63, in capture_traces del tracers[task_id] KeyError: 4575365856 ``` | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/946/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
682005535 | MDU6SXNzdWU2ODIwMDU1MzU= | 945 | datasette install -U for upgrading packages | 9599 | closed | 0 | 5818042 | 1 | 2020-08-19T17:12:04Z | 2020-08-28T04:53:14Z | 2020-08-19T17:20:50Z | OWNER | This will also give Homebrew a way to upgrade Datasette itself without having to wait for the latest packaged version to land in Homebrew core. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/945/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
681516976 | MDU6SXNzdWU2ODE1MTY5NzY= | 944 | Path parameters for custom pages | 9599 | closed | 0 | 5818042 | 5 | 2020-08-19T03:25:17Z | 2020-09-14T03:21:45Z | 2020-09-14T02:34:58Z | OWNER | [Custom pages](https://docs.datasette.io/en/stable/custom_templates.html#custom-pages) let you e.g. create a `templates/pages/about.html` page and have it automatically served at `/about`. It would be useful if these pages could capture path patterns. I like the Python format string syntax for this (also used by Starlette): `/foo/bar/{slug}`. So... how about embedding those patterns in the filenames themselves? templates/pages/museums/{slug}.html Would capture any hits to `/museums/something` and use that page to serve them. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/944/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
681375466 | MDU6SXNzdWU2ODEzNzU0NjY= | 943 | await datasette.client.get(path) mechanism for executing internal requests | 9599 | closed | 0 | 5971510 | 33 | 2020-08-18T22:17:42Z | 2020-10-09T17:22:55Z | 2020-10-09T16:11:26Z | OWNER | `datasette-graphql` works by making internal requests to the TableView class (in order to take advantage of existing pagination logic, plus options like `?_search=` and `?_where=`) - see #915 I want to support a `mod_rewrite` style mechanism for putting nicer URLs on top of Datasette pages - I botched that together for a project here using an internal ASGI proxying trick: https://github.com/natbat/tidepools_near_me/commit/ec102c6da5a5d86f17628740d90b6365b671b5e1 If the `datasette` object provided a documented method for executing internal requests (in a way that makes sense with logging etc - i.e. doesn't get logged as a separate request) both of these use-cases would be much neater. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/943/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
681334912 | MDU6SXNzdWU2ODEzMzQ5MTI= | 942 | Support column descriptions in metadata.json | 9599 | closed | 0 | 18 | 2020-08-18T20:52:00Z | 2022-01-13T22:21:42Z | 2021-08-12T23:53:24Z | OWNER | Could look something like this: ```json { "title": "Five Thirty Eight", "license": "CC Attribution 4.0 License", "license_url": "https://creativecommons.org/licenses/by/4.0/", "source": "fivethirtyeight/data on GitHub", "source_url": "https://github.com/fivethirtyeight/data", "databases": { "fivethirtyeight": { "tables": { "mueller-polls/mueller-approval-polls": { "description_html": "<p>....</p>", "columns": { "name_of_column": "column_description goes here" } ``` | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/942/reactions", "total_count": 4, "+1": 4, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
679809281 | MDExOlB1bGxSZXF1ZXN0NDY4NDg0MDMx | 941 | Run CI on GitHub Actions, not Travis | 9599 | closed | 0 | 1 | 2020-08-16T19:13:39Z | 2020-08-18T05:09:36Z | 2020-08-18T05:09:35Z | OWNER | simonw/datasette/pulls/941 | Refs #940 | 107914493 | pull | { "url": "https://api.github.com/repos/simonw/datasette/issues/941/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
0 | |||||
679808124 | MDU6SXNzdWU2Nzk4MDgxMjQ= | 940 | Move CI to GitHub Issues | 9599 | closed | 0 | 5818042 | 20 | 2020-08-16T19:06:08Z | 2020-09-14T22:09:35Z | 2020-09-14T22:09:35Z | OWNER | It looks like the tests take 3m33s to run in GitHub Actions, but they're taking more than 8 minutes in Travis | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/940/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
679779797 | MDU6SXNzdWU2Nzk3Nzk3OTc= | 939 | extra_ plugin hooks should take the same arguments | 9599 | closed | 0 | 6 | 2020-08-16T16:04:54Z | 2020-08-16T18:25:05Z | 2020-08-16T16:50:29Z | OWNER | - [x] `extra_css_urls(template, database, table, datasette)` - [x] `extra_js_urls(template, database, table, datasette)` - [x] `extra_body_script(template, database, table, view_name, datasette)` - [x] `extra_template_vars(template, database, table, view_name, request, datasette)` _Originally posted by @simonw in https://github.com/simonw/datasette/issues/938#issuecomment-674544691_ | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/939/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
679700269 | MDU6SXNzdWU2Nzk3MDAyNjk= | 938 | Pass columns to extra CSS/JS/etc plugin hooks | 9599 | closed | 0 | 3 | 2020-08-16T06:37:47Z | 2020-09-30T20:36:12Z | 2020-08-16T18:09:59Z | OWNER | I'd like `datasette-cluster-map` to only add links to JavaScript on pages that have tables with latitude and longitude columns. Passing the names of the columns to the plugin hook can support this and will be backwards compatible thanks to pluggy. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/938/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
679660778 | MDExOlB1bGxSZXF1ZXN0NDY4Mzc3MjEy | 937 | Docs now live at docs.datasette.io | 9599 | closed | 0 | 0 | 2020-08-15T23:53:52Z | 2020-08-15T23:57:06Z | 2020-08-15T23:57:05Z | OWNER | simonw/datasette/pulls/937 | 107914493 | pull | { "url": "https://api.github.com/repos/simonw/datasette/issues/937/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
0 | ||||||
679650632 | MDExOlB1bGxSZXF1ZXN0NDY4MzcwNjU4 | 936 | Don't hang in db.execute_write_fn() if connection fails | 9599 | closed | 0 | 2 | 2020-08-15T22:20:12Z | 2020-08-15T22:35:33Z | 2020-08-15T22:35:32Z | OWNER | simonw/datasette/pulls/936 | Refs #935 | 107914493 | pull | { "url": "https://api.github.com/repos/simonw/datasette/issues/936/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
0 | |||||
679646710 | MDU6SXNzdWU2Nzk2NDY3MTA= | 935 | db.execute_write_fn(create_tables, block=True) hangs a thread if connection fails | 9599 | closed | 0 | 3 | 2020-08-15T21:49:17Z | 2020-08-15T22:35:33Z | 2020-08-15T22:35:33Z | OWNER | Discovered in https://github.com/simonw/latest-datasette-with-all-plugins/issues/3#issuecomment-674449757 | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/935/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
679637501 | MDU6SXNzdWU2Nzk2Mzc1MDE= | 934 | --get doesn't fully invoke the startup routine | 9599 | closed | 0 | 0 | 2020-08-15T20:30:25Z | 2020-08-15T20:53:49Z | 2020-08-15T20:53:49Z | OWNER | https://github.com/simonw/datasette/blob/7702ea602188899ee9b0446a874a6a9b546b564d/datasette/cli.py#L417-L433 Spotted this working on https://github.com/simonw/latest-datasette-with-all-plugins/issues/3 - I'd like to be able to use `datasette --get /` as a sanity checking test, but that doesn't work if the init hooks aren't fully executed. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/934/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
678760988 | MDU6SXNzdWU2Nzg3NjA5ODg= | 932 | End-user documentation | 9599 | open | 0 | 3268330 | 6 | 2020-08-13T22:04:39Z | 2022-03-08T15:20:48Z | OWNER | Datasette's documentation is aimed at people who install and configure it. What about end users of preconfigured and deployed Datasette instances? Something that can be linked to from the Datasette UI would be really useful. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/932/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
|||||||
677926613 | MDU6SXNzdWU2Nzc5MjY2MTM= | 931 | Docker container is no longer being pushed (it's stuck on 0.45) | 9599 | closed | 0 | 7 | 2020-08-12T19:33:03Z | 2020-08-12T21:36:20Z | 2020-08-12T21:36:20Z | OWNER | e.g. https://travis-ci.org/github/simonw/datasette/jobs/717123725 Here's how it broke: ``` --2020-08-12 03:08:17-- https://www.gaia-gis.it/gaia-sins/freexl-1.0.5.tar.gz Resolving www.gaia-gis.it (www.gaia-gis.it)... 212.83.162.51 Connecting to www.gaia-gis.it (www.gaia-gis.it)|212.83.162.51|:443... connected. HTTP request sent, awaiting response... 404 Not Found 2020-08-12 03:08:18 ERROR 404: Not Found. The command '/bin/sh -c wget "https://www.gaia-gis.it/gaia-sins/freexl-1.0.5.tar.gz" && tar zxf freexl-1.0.5.tar.gz && cd freexl-1.0.5 && ./configure && make && make install' returned a non-zero code: 8 The command "docker build -f Dockerfile -t $REPO:$TRAVIS_TAG ." exited with 8. 0.07s$ docker tag $REPO:$TRAVIS_TAG $REPO:latest Error response from daemon: No such image: [secure]/datasette:0.47.1 The command "docker tag $REPO:$TRAVIS_TAG $REPO:latest" exited with 1. 0.08s$ docker push $REPO The push refers to repository [docker.io/[secure]/datasette] An image does not exist locally with the tag: [secure]/datasette The command "docker push $REPO" exited with 1. cache.2 store build cache ``` | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/931/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
677326155 | MDU6SXNzdWU2NzczMjYxNTU= | 930 | Datasette sdist is missing templates (hence broken when installing from Homebrew) | 9599 | closed | 0 | 6 | 2020-08-12T02:20:16Z | 2020-08-12T03:30:59Z | 2020-08-12T03:30:59Z | OWNER | Pretty nasty bug this: I'm getting 500 errors for all pages that try to render a template after installing the newly released Datasette 0.47 - both from `pip install` and via Homebrew. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/930/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
677272618 | MDU6SXNzdWU2NzcyNzI2MTg= | 928 | Test failures caused by failed attempts to mock pip | 9599 | closed | 0 | 4 | 2020-08-11T23:53:18Z | 2022-02-23T16:19:47Z | 2020-08-12T00:07:49Z | OWNER | Errors like this one: https://github.com/simonw/datasette/pull/927/checks?check_run_id=973559696 ``` 2020-08-11T23:36:39.8801334Z =================================== FAILURES =================================== 2020-08-11T23:36:39.8802411Z _________________________________ test_install _________________________________ 2020-08-11T23:36:39.8803242Z 2020-08-11T23:36:39.8804935Z thing = <module 'pip._internal.cli' from '/opt/hostedtoolcache/Python/3.8.5/x64/lib/python3.8/site-packages/pip/_internal/cli/__init__.py'> 2020-08-11T23:36:39.8806663Z comp = 'main', import_path = 'pip._internal.cli.main' 2020-08-11T23:36:39.8807696Z 2020-08-11T23:36:39.8808728Z def _dot_lookup(thing, comp, import_path): 2020-08-11T23:36:39.8810573Z try: 2020-08-11T23:36:39.8812262Z > return getattr(thing, comp) 2020-08-11T23:36:39.8817136Z E AttributeError: module 'pip._internal.cli' has no attribute 'main' 2020-08-11T23:36:39.8843043Z 2020-08-11T23:36:39.8855951Z /opt/hostedtoolcache/Python/3.8.5/x64/lib/python3.8/unittest/mock.py:1215: AttributeError 2020-08-11T23:36:39.8873372Z 2020-08-11T23:36:39.8877803Z During handling of the above exception, another exception occurred: 2020-08-11T23:36:39.8906532Z 2020-08-11T23:36:39.8925767Z def get_src_prefix(): 2020-08-11T23:36:39.8928277Z # type: () -> str 2020-08-11T23:36:39.8930068Z if running_under_virtualenv(): 2020-08-11T23:36:39.8949721Z src_prefix = os.path.join(sys.prefix, 'src') 2020-08-11T23:36:39.8951813Z else: 2020-08-11T23:36:39.8969014Z # FIXME: keep src in cwd for now (it is not a temporary folder) 2020-08-11T23:36:39.9012110Z try: 2020-08-11T23:36:39.9013489Z > src_prefix = os.path.join(os.getcwd(), 'src') 2020-08-11T23:36:39.9014538Z E FileNotFoundError: [Errno 2] No such file or directory 2020-08-11T23:36:39.9016122Z 2020-08-11T23:36:39.9017617Z /opt/hostedtoolcache/Python/3.8.5/x64/lib/python3.8/site-packages/pip/_int… | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/928/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
677265716 | MDExOlB1bGxSZXF1ZXN0NDY2NDEwNzU1 | 927 | 'datasette --get' option, refs #926 | 9599 | closed | 0 | 5 | 2020-08-11T23:31:52Z | 2020-08-12T00:24:42Z | 2020-08-12T00:24:41Z | OWNER | simonw/datasette/pulls/927 | Refs #926, #898 | 107914493 | pull | { "url": "https://api.github.com/repos/simonw/datasette/issues/927/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
0 | |||||
677250834 | MDU6SXNzdWU2NzcyNTA4MzQ= | 926 | datasette fixtures.db --get "/fixtures.json" | 9599 | closed | 0 | 2 | 2020-08-11T22:55:36Z | 2020-08-12T00:26:17Z | 2020-08-12T00:24:42Z | OWNER | I can expose ALL of Datasette's functionality on the command-line (without even running a web server) by adding `--get` and `--post` options to `datasette serve`. datasette fixtures.db --get "/fixtures.json" This would instantiate the Datasette ASGI app, run a fake request for `/fixtures.json` through it, dump the results out to standard output and quit. A `--post` option could do the same for a POST request. Treating that as a stretch goal for the moment. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/926/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
677227912 | MDU6SXNzdWU2NzcyMjc5MTI= | 925 | "datasette install" and "datasette uninstall" commands | 9599 | closed | 0 | 3 | 2020-08-11T22:04:32Z | 2020-08-11T22:34:37Z | 2020-08-11T22:32:12Z | OWNER | When installing Datasette plugins it's crucial that they end up in the same virtual environment as Datasette itself. It's not necessarily obvious how to do this, especially if you install Datasette via pipx or homebrew. Solution: `datasette install datasette-vega` and `datasette uninstall datasette-vega` commands that know how to install to the correct place - a very thin wrapper around `pip install`. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/925/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
677037043 | MDU6SXNzdWU2NzcwMzcwNDM= | 923 | Add homebrew installation to documentation | 9599 | closed | 0 | 5 | 2020-08-11T16:54:31Z | 2020-08-11T22:53:07Z | 2020-08-11T22:52:46Z | OWNER | > ``` > $ brew tap simonw/datasette > $ brew install simonw/datasette/datasette > $ datasette --version > datasette, version 0.46 > ``` _Originally posted by @simonw in https://github.com/simonw/datasette/issues/335#issuecomment-672088880_ | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/923/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
273895344 | MDU6SXNzdWUyNzM4OTUzNDQ= | 92 | Add --license --license_url --source --source_url --title arguments to datasette publish | 9599 | closed | 0 | 0 | 2017-11-14T18:27:07Z | 2017-11-15T05:04:41Z | 2017-11-15T05:04:41Z | OWNER | I keep on using the `echo '{"source": "..."}' | datasette publish now --metadata=-` pattern, which suggests it makes sense for us to support these as optional arguments. https://gist.github.com/simonw/9f8bf23b37a42d7628c4dcc4bba10253 | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/92/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
675727366 | MDU6SXNzdWU2NzU3MjczNjY= | 919 | Travis should not build the master branch, only the main branch | 9599 | closed | 0 | 3 | 2020-08-09T16:18:25Z | 2020-08-09T16:26:18Z | 2020-08-09T16:19:37Z | OWNER | Caused by #849 - since we are mirroring the two branches (to ensure old links to `master` keep working) Travis is building both. The following in `.travis.yml` should fix that: ``` branches: except: - master ``` | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/919/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
675724951 | MDU6SXNzdWU2NzU3MjQ5NTE= | 918 | Security issue: read-only canned queries leak CSRF token in URL | 9599 | closed | 0 | 4 | 2020-08-09T16:03:01Z | 2020-08-09T16:56:48Z | 2020-08-09T16:11:59Z | OWNER | The HTML form for a read-only canned query includes the hidden CSRF token field added in #798 for writable canned queries (#698). This means that submitting those read-only forms exposes the CSRF token in the URL - for example on https://latest.datasette.io/fixtures/neighborhood_search submitting the form took me to: https://latest.datasette.io/fixtures/neighborhood_search?text=down&csrftoken=IlFubnoxVVpLU1NGT3NMVUoi.HbOPd2YH_epQmp8f_aAt0s-MxtU This token could potentially leak to an attacker if the resulting page has a link to an external site on it and the user clicks the link, since the token would be exposed in the referral logs. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/918/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
675594325 | MDU6SXNzdWU2NzU1OTQzMjU= | 917 | Idea: "datasette publish" option for "only if the data has changed | 9599 | open | 0 | 0 | 2020-08-08T21:58:27Z | 2020-08-08T21:58:27Z | OWNER | This is a pattern I often find myself needing. I usually implement this in GitHub Actions like this: https://github.com/simonw/covid-19-datasette/blob/efa01c39abc832b8641fc2a92840cc3acae2fb08/.github/workflows/scheduled.yml#L52-L63 ```yaml - name: Set variables to decide if we should deploy id: decide_variables run: |- echo "##[set-output name=latest;]$(datasette inspect covid.db | jq '.covid.hash' -r)" echo "##[set-output name=deployed;]$(curl -s https://covid-19.datasettes.com/-/databases.json | jq '.[0].hash' -r)" - name: Set up Cloud Run if: github.event_name == 'workflow_dispatch' || steps.decide_variables.outputs.latest != steps.decide_variables.outputs.deployed uses: GoogleCloudPlatform/github-actions/setup-gcloud@master ``` This is pretty fiddly. It might be good for `datasette publish` to grow a helper option that does effectively this - hashes the databases (and the `metadata.json`) and compares them to the deployed version. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/917/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
||||||||
672421411 | MDU6SXNzdWU2NzI0MjE0MTE= | 916 | Support reverse pagination (previous page, has-previous-items) | 9599 | open | 0 | 7 | 2020-08-04T00:32:06Z | 2021-04-03T23:43:11Z | OWNER | I need this for `datasette-graphql` for full compatibility with the way Relay likes to paginate - using cursors for paginating backwards as well as for paginating forwards. > This may be the kick I need to get Datasette pagination to work in reverse too. _Originally posted by @simonw in https://github.com/simonw/datasette-graphql/issues/2#issuecomment-668305853_ | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/916/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
||||||||
671763164 | MDU6SXNzdWU2NzE3NjMxNjQ= | 915 | Refactor TableView class so things like datasette-graphql can reuse the logic | 9599 | closed | 0 | 3 | 2020-08-03T03:13:33Z | 2020-08-18T22:28:37Z | 2020-08-18T22:28:37Z | OWNER | _Originally posted by @simonw in https://github.com/simonw/datasette-graphql/issues/2#issuecomment-667780040_ | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/915/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
671056788 | MDU6SXNzdWU2NzEwNTY3ODg= | 914 | "Object of type bytes is not JSON serializable" for _nl=on | 9599 | closed | 0 | 1 | 2020-08-01T17:43:10Z | 2020-08-16T21:10:27Z | 2020-08-16T18:26:59Z | OWNER | https://latest.datasette.io/fixtures/binary_data.json?_sort_desc=data&_shape=array returns this: ```json [ { "rowid": 1, "data": "this is binary data" } ] ``` But adding `&_nl=on` returns this: https://latest.datasette.io/fixtures/binary_data.json?_sort_desc=data&_shape=array&_nl=on ```json { "ok": false, "error": "Object of type bytes is not JSON serializable", "status": 500, "title": null } ``` I found this error by running `wget -r 127.0.0.1:8001` against my local `fixtures.db`. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/914/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
670209331 | MDU6SXNzdWU2NzAyMDkzMzE= | 913 | Mechanism for passing additional options to `datasette my.db` that affect plugins | 9599 | open | 0 | 5 | 2020-07-31T20:38:26Z | 2021-01-04T20:04:11Z | OWNER | > It's a shame there's no obvious mechanism for passing additional options to `datasette my.db` that affect how plugins work. > >The only way I can think of at the moment is via environment variables: > > DATASETTE_INSERT_UNSAFE=1 datasette my.db > >This will have to do for the moment - it's ugly enough that people will at least know they are doing something unsafe, which is the goal here. _Originally posted by @simonw in https://github.com/simonw/datasette-insert/issues/15#issuecomment-667346438_ | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/913/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
||||||||
668064778 | MDU6SXNzdWU2NjgwNjQ3Nzg= | 912 | Add "publishing to Vercel" to the publish docs | 9599 | closed | 0 | 0 | 2020-07-29T18:50:58Z | 2020-07-31T17:06:35Z | 2020-07-31T17:06:35Z | OWNER | https://datasette.readthedocs.io/en/0.45/publish.html#datasette-publish currently only lists Cloud Run, Heroku and Fly. It should list Vercel too. (I should probably rename `datasette-publish-now` to `datasette-publish-vercel`) | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/912/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
668064026 | MDU6SXNzdWU2NjgwNjQwMjY= | 911 | Rethink the --name option to "datasette publish" | 9599 | open | 0 | 3268330 | 0 | 2020-07-29T18:49:49Z | 2020-07-29T18:49:49Z | OWNER | `--name` works inconsistently across the different publish providers - on Cloud Run you should use `--service` instead for example. Need to review it across all of them and either remove it or clarify what it does. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/911/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
|||||||
273878873 | MDU6SXNzdWUyNzM4Nzg4NzM= | 91 | Option to serve databases from a different prefix, serve regular content elsewhere | 9599 | closed | 0 | 1 | 2017-11-14T17:32:46Z | 2017-12-10T03:07:58Z | 2017-12-10T03:07:53Z | OWNER | It would be useful if the databases themselves could be served from a prefix e.g. datasette serve mydb.db --path-prefix=db Now my database is at `http://localhost:8001/db/mydb-23423` This would free up the rest of the URL namespace for other things. Maybe we could have an option to serve static content from a known folder e.g. datasette serve mydb.db --path-prefix=db --root-content=~/my-project/static Now a hit to `http://localhost:8001/news/` serves content from `~/my-project/static/news/index.html` This would make it trivial to package up entire HTML/CSS/JS apps with one or more underlying SQLite databases. Running without `--cors` would be fine here because any JS apps would be hosted on the same origin. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/91/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
667467128 | MDU6SXNzdWU2Njc0NjcxMjg= | 909 | AsgiFileDownload: filename not correctly passed | 9599 | closed | 0 | 2 | 2020-07-29T00:41:43Z | 2020-07-30T00:56:17Z | 2020-07-29T21:34:48Z | OWNER | https://github.com/simonw/datasette/blob/3c33b421320c0be81a625ca7307b2e4416a9ed5b/datasette/utils/asgi.py#L396-L405 `self.filename` should be passed to `asgi_send_file()` | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/909/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
665407663 | MDU6SXNzdWU2NjU0MDc2NjM= | 908 | Interactive debugging tool for "allow" blocks | 9599 | closed | 0 | 5607421 | 3 | 2020-07-24T20:43:44Z | 2020-07-25T00:06:15Z | 2020-07-24T22:56:52Z | OWNER | > It might be good to have a little interactive tool which helps debug these things, since there are quite a few edge-cases and the damage caused if people use them incorrectly is substantial. _Originally posted by @simonw in https://github.com/simonw/datasette/issues/907#issuecomment-663726146_ | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/908/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
665403403 | MDU6SXNzdWU2NjU0MDM0MDM= | 907 | Allow documentation doesn't explain what happens with multiple allow keys | 9599 | closed | 0 | 5607421 | 2 | 2020-07-24T20:34:40Z | 2020-07-24T22:53:07Z | 2020-07-24T22:53:07Z | OWNER | Documentation here: https://datasette.readthedocs.io/en/0.45/authentication.html#defining-permissions-with-allow-blocks Doesn't explain that with the following "allow" block: ```json { "allow": { "id": "simonw", "role": "staff" } } ``` The rule will match if EITHER the id is simonw OR the role includes staff. The tests are missing this case too: https://github.com/simonw/datasette/blob/028f193dd6233fa116262ab4b07b13df7dcec9be/tests/test_utils.py#L504 Related to #906 | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/907/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
665400224 | MDU6SXNzdWU2NjU0MDAyMjQ= | 906 | "allow": true for anyone, "allow": false for nobody | 9599 | closed | 0 | 5607421 | 3 | 2020-07-24T20:28:10Z | 2020-07-25T00:07:10Z | 2020-07-25T00:05:04Z | OWNER | The "allow" syntax described at https://datasette.readthedocs.io/en/0.45/authentication.html#defining-permissions-with-allow-blocks currently says this: > An allow block can specify "no-one is allowed to do this" using an empty `{}`: > > ``` > { > "allow": {} > } > ``` `"allow": null` allows all access, though this isn't documented (it should be though). These are not very intuitive. How about also supporting `"allow": true` for "allow anyone" and `"allow": false` for "allow nobody"? | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/906/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
663317875 | MDU6SXNzdWU2NjMzMTc4NzU= | 905 | /database.db download should include content-length header | 9599 | closed | 0 | 2 | 2020-07-21T21:23:48Z | 2020-07-22T04:59:46Z | 2020-07-22T04:52:45Z | OWNER | I can do this by modifying this function: https://github.com/simonw/datasette/blob/02dc6298bdbfb1d63e0d2a39ff597b5fcc60e06b/datasette/utils/asgi.py#L248-L270 | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/905/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
663228985 | MDU6SXNzdWU2NjMyMjg5ODU= | 904 | datasette.urls.table() / .instance() / .database() methods for constructing URLs, also exposed to templates | 9599 | closed | 0 | 6026070 | 11 | 2020-07-21T18:42:52Z | 2020-10-23T19:44:05Z | 2020-10-20T00:51:51Z | OWNER | I tried using this block of template in a plugin and got an error: ```html {% block nav %} <p class="crumbs"> <a href="{{ base_url }}">home</a> / <a href="{{ database_url(database) }}">{{ database }}</a> / <a href="{{ database_url(database) }}/{{ table|quote_plus }}">{{ table }}</a> </p> {{ super() }} {% endblock %} ``` Error: `'database_url' is undefined` That's because `database_url` is only made available by the BaseView template here: https://github.com/simonw/datasette/blob/d6e03b04302a0852e7133dc030eab50177c37be7/datasette/views/base.py#L110-L125 | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/904/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
663145122 | MDU6SXNzdWU2NjMxNDUxMjI= | 903 | Add temporary plugin testing pattern to the testing docs | 9599 | closed | 0 | 1 | 2020-07-21T16:22:34Z | 2022-07-18T21:34:33Z | 2022-07-18T21:31:22Z | OWNER | https://til.simonwillison.net/pytest/registering-plugins-in-tests Would be useful to include this pattern on https://datasette.readthedocs.io/en/stable/testing_plugins.html | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/903/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
273846123 | MDU6SXNzdWUyNzM4NDYxMjM= | 90 | datasette publish heroku | 9599 | closed | 0 | 8 | 2017-11-14T16:01:39Z | 2017-12-10T03:06:34Z | 2017-12-10T03:05:48Z | OWNER | Heroku has Docker container support so this should not be too hard: https://devcenter.heroku.com/articles/container-registry-and-runtime See also #59 This should work exactly like the existing “datasette publish now....” command except it would be “datasette publish heroku...” | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/90/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
267517348 | MDU6SXNzdWUyNjc1MTczNDg= | 9 | Initial test suite | 9599 | closed | 0 | 2857392 | 2 | 2017-10-23T01:28:46Z | 2017-10-24T05:55:33Z | 2017-10-24T05:55:33Z | OWNER | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/9/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
659873662 | MDU6SXNzdWU2NTk4NzM2NjI= | 898 | datasette.utils.testing module | 9599 | open | 0 | 2 | 2020-07-18T03:53:24Z | 2020-07-18T03:57:46Z | OWNER | The unit tests for plugins could benefit from reusing code from Datasette's own testing fixtures, e.g.: > I may need to borrow this function from Datasette for the tests: > https://github.com/simonw/datasette/blob/1f6a134369e6a7efaae9db469f15b1dd2b7f3709/tests/fixtures.py#L836-L851 > > It's not importable (it lives in `fixtures.py` and not in the `datasette` package that gets packaged for PyPI) - maybe I should fix that in Datasette by adding a `from datasette.utils.testing` module. _Originally posted by @simonw in https://github.com/simonw/datasette-update-api/issues/4#issuecomment-660419182_ | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/898/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
||||||||
659580487 | MDU6SXNzdWU2NTk1ODA0ODc= | 897 | Request method for retrieving the unparsed request body | 9599 | closed | 0 | 1 | 2020-07-17T19:51:40Z | 2020-07-17T20:16:02Z | 2020-07-17T20:12:50Z | OWNER | I'm writing a plugin (https://github.com/simonw/datasette-update-api/issues/2) that implements an API for inserting JSON data. As such, I'd like to `POST` a JSON blob rather than using `key=value` form encoded data. Right now there's a `request.post_vars()` method but no `request.post_body()` one: https://github.com/simonw/datasette/blob/c5f06bc356fb5917ef7fbb6fe4693f30d711cdb3/datasette/utils/asgi.py#L93-L103 | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/897/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
658476055 | MDU6SXNzdWU2NTg0NzYwNTU= | 896 | Use white-space: pre-wrap on ALL table cell contents | 9599 | closed | 0 | 4 | 2020-07-16T19:05:21Z | 2020-07-17T01:26:08Z | 2020-07-17T01:26:08Z | OWNER | Is there any reason NOT to apply `white-space: pre-wrap` to the contents of all table cells in Datasette? The default display mechanism of HTML (stripping leading/trailing slashes and collapsing all other whitespace) doesn't really make sense for displaying the kind of data that Datasette works with. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/896/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
657747959 | MDU6SXNzdWU2NTc3NDc5NTk= | 895 | SQL query output should show numeric values in a different colour | 9599 | closed | 0 | 1 | 2020-07-16T00:28:03Z | 2020-09-15T20:40:08Z | 2020-09-15T20:40:08Z | OWNER | Compare https://latest.datasette.io/fixtures/sortable with https://latest.datasette.io/fixtures?sql=select+pk1%2C+pk2%2C+content%2C+sortable%2C+sortable_with_nulls%2C+sortable_with_nulls_2%2C+text+from+sortable+order+by+pk1%2C+pk2+limit+101 <img width="1574" alt="fixtures__select_pk1__pk2__content__sortable__sortable_with_nulls__sortable_with_nulls_2__text_from_sortable_order_by_pk1__pk2_limit_101_and_fixtures__sortable__201_rows" src="https://user-images.githubusercontent.com/9599/87612845-82e09c00-c6c0-11ea-806e-93764ca468c4.png"> | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/895/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
657572753 | MDU6SXNzdWU2NTc1NzI3NTM= | 894 | ?sort=colname~numeric to sort by by column cast to real | 9599 | open | 0 | 21 | 2020-07-15T18:47:48Z | 2021-08-20T02:07:53Z | OWNER | If a text column actually contains numbers, being able to "sort by column, treated as numeric" would be really useful. Probably depends on column actions enabled by #690 | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/894/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
||||||||
655465863 | MDU6SXNzdWU2NTU0NjU4NjM= | 892 | "latest" in new documentation navbar is invisible | 9599 | closed | 0 | 2 | 2020-07-12T19:57:21Z | 2020-07-12T20:02:35Z | 2020-07-12T20:02:17Z | OWNER | On https://datasette.readthedocs.io/en/latest/ <img width="572" alt="Datasette_—_Datasette_documentation" src="https://user-images.githubusercontent.com/9599/87255376-1b67e980-c43f-11ea-8470-781ee8842336.png"> Compare with https://datasette.readthedocs.io/en/0.45/ <img width="584" alt="Datasette_—_Datasette_documentation" src="https://user-images.githubusercontent.com/9599/87255387-2fabe680-c43f-11ea-875e-c474364691ca.png"> Some custom CSS should fix it. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/892/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
653529088 | MDU6SXNzdWU2NTM1MjkwODg= | 891 | Consider using enable_callback_tracebacks(True) | 9599 | closed | 0 | 5971510 | 5 | 2020-07-08T19:07:16Z | 2020-10-08T23:54:23Z | 2020-09-15T21:59:27Z | OWNER | From https://docs.python.org/3/library/sqlite3.html#sqlite3.enable_callback_tracebacks > `sqlite3.``enable_callback_tracebacks`(*flag*)[¶](https://docs.python.org/3/library/sqlite3.html#sqlite3.enable_callback_tracebacks "Permalink to this definition") > > By default you will not get any tracebacks in user-defined functions, aggregates, converters, authorizer callbacks etc. If you want to debug them, you can call this function with *flag* set to `True`. Afterwards, you will get tracebacks from callbacks on `sys.stderr`. Use [`False`](https://docs.python.org/3/library/constants.html#False "False") to disable the feature again. Maybe turn this on for all of Datasette? Are there any disadvantages to doing that? | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/891/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
649437530 | MDU6SXNzdWU2NDk0Mzc1MzA= | 887 | Canned query page should show the name of the canned query | 9599 | closed | 0 | 5607421 | 3 | 2020-07-02T00:10:39Z | 2020-07-02T00:31:33Z | 2020-07-02T00:23:45Z | OWNER | This page here - the URL is http://127.0.0.1:8001/data/all_tables but "all_tables" is not shown in the UI: <img width="784" alt="data__select_sqlite_master_name_as_table_name__table_info___from_sqlite_master_join_pragma_table_info_sqlite_master_name__as_table_info_order_by_sqlite_master_name__table_info_cid_and_data__insert_into_saved_queries__name__sql__author_id__v" src="https://user-images.githubusercontent.com/9599/86302528-d978b100-bbbd-11ea-9a07-7b5d7d3de321.png"> | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/887/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
649429772 | MDU6SXNzdWU2NDk0Mjk3NzI= | 886 | Reconsider how _actor_X magic parameter deals with missing values | 9599 | open | 0 | 2 | 2020-07-02T00:00:38Z | 2020-09-11T21:35:26Z | OWNER | I had to build a custom `_actorornull` prefix for [datasette-saved-queries](https://github.com/simonw/datasette-saved-queries/blob/37c00e56ac398e1f9aa342d30357de013a9b37b4/datasette_saved_queries/__init__.py): ```python def actorornull(key, request): if request.actor is None: return None return request.actor.get(key) @hookimpl def register_magic_parameters(): return [ ("actorornull", actorornull), ] ``` Maybe the `actor` magic in Datasette core should do that out of the box? https://github.com/simonw/datasette/blob/f1f581b7ffcd5d8f3ae6c1c654d813a6641410eb/datasette/default_magic_parameters.py#L14-L17 | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/886/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
||||||||
649373451 | MDU6SXNzdWU2NDkzNzM0NTE= | 885 | Blog entry about the release | 9599 | closed | 0 | 5533512 | 1 | 2020-07-01T22:44:37Z | 2020-07-01T22:44:48Z | 2020-07-01T22:44:47Z | OWNER | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/885/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | ||||||
649329013 | MDU6SXNzdWU2NDkzMjkwMTM= | 884 | Only show "log out" button if user is authenticated using a ds_actor cookie | 9599 | closed | 0 | 5533512 | 0 | 2020-07-01T21:21:28Z | 2020-07-01T21:26:07Z | 2020-07-01T21:26:06Z | OWNER | Right now the "Log out" button in the navigation will show up even if the user was authenticated by a plugin using a mechanism other than the `ds_actor` cookie. It should only show if the logged-in user has that cookie. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/884/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
648673556 | MDU6SXNzdWU2NDg2NzM1NTY= | 882 | Release notes for 0.45 | 9599 | closed | 0 | 5533512 | 2 | 2020-07-01T05:00:17Z | 2020-07-01T21:48:08Z | 2020-07-01T21:48:08Z | OWNER | These are mostly done thanks to the alphas, but I went to have more paragraphs of prose and less bullet points. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/882/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
648659536 | MDU6SXNzdWU2NDg2NTk1MzY= | 881 | Figure out why restore_working_directory is needed in some places | 9599 | open | 0 | 0 | 2020-07-01T04:19:25Z | 2020-07-01T04:19:25Z | OWNER | This is a frustrating workaround. I have a `restore_working_directory` fixture that I wrote to solve errors that look like this: ``` /Users/simon/Dropbox/Development/datasette/tests/test_publish_cloudrun.py:148: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/local/opt/python/Frameworks/Python.framework/Versions/3.7/lib/python3.7/contextlib.py:112: in __enter__ return next(self.gen) _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = <click.testing.CliRunner object at 0x1135ad110> @contextlib.contextmanager def isolated_filesystem(self): """A context manager that creates a temporary folder and changes the current working directory to it for isolated filesystem tests. """ > cwd = os.getcwd() E FileNotFoundError: [Errno 2] No such file or directory ``` Here's an example of it in use: removing the `restore_working_directory` argument from this function causes the failure. https://github.com/simonw/datasette/blob/549b1c2063db48c4622ee5c7b478a1e3cbc1ac07/tests/test_plugins.py#L689-L690 I'd like to not have to do this. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/881/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
||||||||
648637666 | MDU6SXNzdWU2NDg2Mzc2NjY= | 880 | POST to /db/canned-query that returns JSON should be supported (for API clients) | 9599 | closed | 0 | 5818042 | 11 | 2020-07-01T03:14:43Z | 2020-09-14T21:28:21Z | 2020-09-14T21:25:01Z | OWNER | Now that CSRF is solved for API requests (#835) it would be good to support API requests to the `.json` extension. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/880/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed | |||||
648569227 | MDU6SXNzdWU2NDg1NjkyMjc= | 879 | Database page documentation still talks about hashes in URLs | 9599 | closed | 0 | 5533512 | 1 | 2020-06-30T23:43:17Z | 2020-06-30T23:48:06Z | 2020-06-30T23:45:42Z | OWNER | https://datasette.readthedocs.io/en/0.44/pages.html > Note that these URLs end in a 7 character hash. This hash is derived from the contents of the database, and ensures that each URL is immutable: the data returned from a URL containing the hash will always be the same, since if the contents of the database file changes by even a single byte a new hash will be generated. This isn't accurate any more - that's not default behaviour, and it may be removed entirely in #647. | 107914493 | issue | { "url": "https://api.github.com/repos/simonw/datasette/issues/879/reactions", "total_count": 0, "+1": 0, "-1": 0, "laugh": 0, "hooray": 0, "confused": 0, "heart": 0, "rocket": 0, "eyes": 0 } |
completed |