{"id": 181723303, "node_id": "MDExOlB1bGxSZXF1ZXN0MTgxNzIzMzAz", "number": 209, "state": "closed", "locked": 0, "title": " Don't duplicate simple primary keys in the link column", "user": {"value": 45057, "label": "russss"}, "body": "When there's a simple (single-column) primary key, it looks weird to duplicate it in the link column.\r\n\r\nThis change removes the second PK column and treats the link column as if it were the PK column from a header/sorting perspective. \r\n\r\nThis might make it a bit more difficult to tell what the link for the row is, I'm not sure yet. I feel like the alternative is to change the link column to just have the text \"view\" or something, instead of repeating the PK. (I doubt it makes much more sense with compound PKs.)\r\n\r\nBonus change in this PR: fix urlencoding of links in the displayed HTML.\r\n\r\nBefore:\r\n![image](https://user-images.githubusercontent.com/45057/38783830-e2ababb4-40ff-11e8-97fb-25e286a8c920.png)\r\n\r\nAfter:\r\n![image](https://user-images.githubusercontent.com/45057/38783835-ebf6b48e-40ff-11e8-8c47-6a864cf21ccc.png)", "created_at": "2018-04-15T21:56:15Z", "updated_at": "2018-04-18T08:40:37Z", "closed_at": "2018-04-18T01:13:04Z", "merged_at": "2018-04-18T01:13:04Z", "merge_commit_sha": "136a70d88741e2a5892c3de437064a9d14494d66", "assignee": null, "milestone": null, "draft": 0, "head": "4acde4e187795214af6fc86f46af48982ec5de46", "base": "bf5ec2d61148f9852441934dd206b3b1c07a512f", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/209", "merged_by": null, "auto_merge": null} {"id": 208719043, "node_id": "MDExOlB1bGxSZXF1ZXN0MjA4NzE5MDQz", "number": 361, "state": "closed", "locked": 0, "title": " Import pysqlite3 if available, closes #360 ", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2018-08-16T00:52:21Z", "updated_at": "2018-08-16T00:58:57Z", "closed_at": "2018-08-16T00:58:57Z", "merged_at": "2018-08-16T00:58:57Z", "merge_commit_sha": "aae49fef3b75848628d824077ec063834e3e5167", "assignee": null, "milestone": null, "draft": 0, "head": "da41daa168af8f29a1beb5278aed833cf3dc48ce", "base": "e1db8194e8c1d7f361fd0c1c3fc1b91d6aa920e5", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/361", "merged_by": null, "auto_merge": null} {"id": 271338405, "node_id": "MDExOlB1bGxSZXF1ZXN0MjcxMzM4NDA1", "number": 434, "state": "closed", "locked": 0, "title": "\"datasette publish cloudrun\" command to publish to Google Cloud Run", "user": {"value": 10352819, "label": "rprimet"}, "body": "This is a very rough draft to start a discussion on a possible datasette cloud run publish plugin (see issue #400).\r\n\r\nThe main change was to dynamically set the listening port in `make_dockerfile` to satisfy cloud run's [requirements](https://cloud.google.com/run/docs/reference/container-contract).\r\n\r\nThis was done by running `datasette` through `sh` to get environment variable substitution. Not sure if that's the right approach?\r\n", "created_at": "2019-04-17T14:41:18Z", "updated_at": "2019-05-03T21:50:44Z", "closed_at": "2019-05-03T13:59:02Z", "merged_at": "2019-05-03T13:59:02Z", "merge_commit_sha": "75a21fc2a136ccfc9da7bbf521cf288e63c9707f", "assignee": null, "milestone": null, "draft": 0, "head": "74c20d0d2eac13892ac20db0e66fcb3437544aa6", "base": "bf229c9bd88179c8ec16bd65fd4fb28ab4241c2e", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/434", "merged_by": null, "auto_merge": null} {"id": 1154884166, "node_id": "PR_kwDOBm6k_c5E1iJG", "number": 1938, "state": "closed", "locked": 0, "title": "\"permissions\" blocks in metadata.json/yaml", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1636\r\n\r\n- [x] Documentation\r\n- [ ] Implementation\r\n- [ ] Validate metadata to check there are no nonsensical permissions (like `debug-menu` set at the table level)\r\n- [ ] Tests\r\n\r\n\r\n----\r\n:books: Documentation preview :books:: https://datasette--1938.org.readthedocs.build/en/1938/\r\n\r\n", "created_at": "2022-12-08T22:07:36Z", "updated_at": "2022-12-13T05:23:19Z", "closed_at": "2022-12-13T05:23:18Z", "merged_at": null, "merge_commit_sha": "271ea3ae0c858de2d392b61a1a4a9f5837cbddf8", "assignee": null, "milestone": {"value": 8711695, "label": " Datasette 1.0a2"}, "draft": 0, "head": "6e35a6b4f7ea9ba3fb6f02f45452eeb41de69786", "base": "e539c1c024bc62d88df91d9107cbe37e7f0fe55f", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1938", "merged_by": null, "auto_merge": null} {"id": 466410755, "node_id": "MDExOlB1bGxSZXF1ZXN0NDY2NDEwNzU1", "number": 927, "state": "closed", "locked": 0, "title": "'datasette --get' option, refs #926", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #926, #898", "created_at": "2020-08-11T23:31:52Z", "updated_at": "2020-08-12T00:24:42Z", "closed_at": "2020-08-12T00:24:41Z", "merged_at": "2020-08-12T00:24:41Z", "merge_commit_sha": "e139a7619f63d45ca2ff1ee108b933e17b5675b3", "assignee": null, "milestone": null, "draft": 0, "head": "2111da01a03cfc62303b6a4b59ea9f96d22c0f78", "base": "83eda049af3f38d4289118d3576f96b2535084b1", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/927", "merged_by": null, "auto_merge": null} {"id": 575940193, "node_id": "MDExOlB1bGxSZXF1ZXN0NTc1OTQwMTkz", "number": 1232, "state": "closed", "locked": 0, "title": "--crossdb option for joining across databases", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #283. Still needs:\r\n\r\n- [x] Unit test for --crossdb queries\r\n- [x] Show warning on console if it truncates at ten databases (or on web interface)\r\n- [x] Show connected databases on the `/_memory` database page\r\n- [x] Documentation\r\n- [x] https://latest.datasette.io/ demo should demonstrate this feature", "created_at": "2021-02-18T19:48:50Z", "updated_at": "2021-02-18T22:09:13Z", "closed_at": "2021-02-18T22:09:12Z", "merged_at": "2021-02-18T22:09:12Z", "merge_commit_sha": "6f41c8a2bef309a66588b2875c3e24d26adb4850", "assignee": null, "milestone": null, "draft": 0, "head": "887649942b02d70a0fe4e205e1e5eff4e745b016", "base": "4df548e7668b5b21d64a267964951e67894f4712", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1232", "merged_by": null, "auto_merge": null} {"id": 375180832, "node_id": "MDExOlB1bGxSZXF1ZXN0Mzc1MTgwODMy", "number": 672, "state": "open", "locked": 0, "title": "--dirs option for scanning directories for SQLite databases", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #417.", "created_at": "2020-02-14T02:25:52Z", "updated_at": "2020-03-27T01:03:53Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "0e0e544f1f23451f04d7ca576ace5b18ce168e6f", "assignee": null, "milestone": null, "draft": 0, "head": "ee718b98b793df2a15b125cbf20816c9864bf7e9", "base": "6aa516d82dea9885cb4db8d56ec2ccfd4cd9b840", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/672", "merged_by": null, "auto_merge": null} {"id": 815164865, "node_id": "PR_kwDOCGYnMM4wlm3B", "number": 361, "state": "closed", "locked": 0, "title": "--lines and --text and --convert and --import", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #356\r\n\r\nStill TODO:\r\n\r\n- [x] Get `--lines` working, with tests\r\n- [x] Get `--text` working, with tests\r\n- [x] Get regular JSON import working with `--convert` with tests\r\n- [x] Get `--lines` working with `--convert` with tests\r\n- [x] Get `--text` working with `--convert` with tests\r\n- [x] Get `--csv` and `--tsv` import working with `--convert` with tests\r\n- [x] Get `--nl` working with `--convert` with tests\r\n- [x] Documentation for all of the above", "created_at": "2022-01-06T01:49:44Z", "updated_at": "2022-01-06T06:37:03Z", "closed_at": "2022-01-06T06:24:54Z", "merged_at": "2022-01-06T06:24:54Z", "merge_commit_sha": "413f8ed754e38d7b190de888c85fe8438336cb11", "assignee": null, "milestone": null, "draft": 0, "head": "b7f0b88d49032a053f0de2dbba356ee1f3b949c0", "base": "f3fd8613113d21d44238a6ec54b375f5aa72c4e0", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/361", "merged_by": null, "auto_merge": null} {"id": 397749653, "node_id": "MDExOlB1bGxSZXF1ZXN0Mzk3NzQ5NjUz", "number": 714, "state": "closed", "locked": 0, "title": "--metadata accepts YAML as well as JSON", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #713. Still needs tests and documentation.", "created_at": "2020-04-02T18:36:02Z", "updated_at": "2020-04-02T19:30:54Z", "closed_at": "2020-04-02T19:30:54Z", "merged_at": "2020-04-02T19:30:54Z", "merge_commit_sha": "6717c719dd36dc2adc0f9da38a8c8e08129e96b4", "assignee": null, "milestone": null, "draft": 0, "head": "5170c31adc44f6ef14b21782ba6f8ecb46dd9450", "base": "2aaad72789c427875426673c1a43e67c86fc970e", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/714", "merged_by": null, "auto_merge": null} {"id": 295065796, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjk1MDY1Nzk2", "number": 544, "state": "closed", "locked": 0, "title": "--plugin-secret option", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #543\r\n\r\n- [x] Zeit Now v1 support\r\n- [x] Solve escaping of ENV in Dockerfile\r\n- [x] Heroku support\r\n- [x] Unit tests\r\n- [x] Cloud Run support\r\n- [x] Documentation\r\n", "created_at": "2019-07-06T22:18:20Z", "updated_at": "2019-07-08T02:06:31Z", "closed_at": "2019-07-08T02:06:31Z", "merged_at": "2019-07-08T02:06:31Z", "merge_commit_sha": "973f8f139df6ad425354711052cfc2256de2e522", "assignee": null, "milestone": {"value": 4471010, "label": "Datasette 0.29"}, "draft": 0, "head": "ccf80604e931fba1893b5bab11de386fed82009e", "base": "fcfcae21e67cc15090942b1d2a47b5f016279337", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/544", "merged_by": null, "auto_merge": null} {"id": 572209243, "node_id": "MDExOlB1bGxSZXF1ZXN0NTcyMjA5MjQz", "number": 1222, "state": "closed", "locked": 0, "title": "--ssl-keyfile and --ssl-certfile, refs #1221", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2021-02-12T00:45:58Z", "updated_at": "2021-02-12T00:52:18Z", "closed_at": "2021-02-12T00:52:17Z", "merged_at": "2021-02-12T00:52:17Z", "merge_commit_sha": "eda652cf6ee28a0babfb30ce3834512e9e33fb8e", "assignee": null, "milestone": null, "draft": 0, "head": "8ec72ea3e3e0a9876d5e61e4a2260224f16db2e3", "base": "aa1fe0692c2abb901216738bfb35f9fcc5090e7d", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1222", "merged_by": null, "auto_merge": null} {"id": 368734500, "node_id": "MDExOlB1bGxSZXF1ZXN0MzY4NzM0NTAw", "number": 663, "state": "closed", "locked": 0, "title": "-p argument for datasette package, plus tests - refs #661", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2020-01-29T19:47:49Z", "updated_at": "2020-01-29T22:46:43Z", "closed_at": "2020-01-29T22:46:43Z", "merged_at": "2020-01-29T22:46:43Z", "merge_commit_sha": "67fc9c5720ed1fcd62b116481f70d4e80b403a22", "assignee": null, "milestone": null, "draft": 0, "head": "8adfc9db7f15e36fed677be4a9c833ff2cdec0bc", "base": "34d77d780f68b778fd9d6ebbaf69f250436f055f", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/663", "merged_by": null, "auto_merge": null} {"id": 1492599485, "node_id": "PR_kwDOBm6k_c5Y90K9", "number": 2161, "state": "closed", "locked": 0, "title": "-s/--setting x y gets merged into datasette.yml, refs #2143, #2156", "user": {"value": 9599, "label": "simonw"}, "body": "This change updates the `-s/--setting` option to `datasette serve` to allow it to be used to set arbitrarily complex nested settings in a way that is compatible with the new `-c datasette.yml` work happening in:\r\n- #2143\r\n\r\nIt will enable things like this:\r\n```\r\ndatasette data.db --setting plugins.datasette-ripgrep.path \"/home/simon/code\"\r\n```\r\nFor the moment though it just affects [settings](https://docs.datasette.io/en/1.0a4/settings.html) - so you can do this:\r\n```\r\ndatasette data.db --setting settings.sql_time_limit_ms 3500\r\n```\r\nI've also implemented a backwards compatibility mechanism, so if you use it this way (the old way):\r\n```\r\ndatasette data.db --setting sql_time_limit_ms 3500\r\n```\r\nIt will notice that the setting you passed is one of Datasette's core settings, and will treat that as if you said `settings.sql_time_limit_ms` instead.\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2161.org.readthedocs.build/en/2161/\n\r\n", "created_at": "2023-08-28T19:30:42Z", "updated_at": "2023-08-28T20:06:15Z", "closed_at": "2023-08-28T20:06:14Z", "merged_at": "2023-08-28T20:06:14Z", "merge_commit_sha": "d9aad1fd042a25d226f2ace1f7827b4602761038", "assignee": null, "milestone": null, "draft": 0, "head": "a5cbf80d795b599697b2b873566386abb0cd8b32", "base": "527cec66b0403e689c8fb71fc8b381a1d7a46516", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2161", "merged_by": null, "auto_merge": null} {"id": 512545364, "node_id": "MDExOlB1bGxSZXF1ZXN0NTEyNTQ1MzY0", "number": 1061, "state": "closed", "locked": 0, "title": ".blob output renderer", "user": {"value": 9599, "label": "simonw"}, "body": "- [x] Remove the `/-/...blob/...` route I added in #1040 in place of the new `.blob` renderer URLs\r\n- [x] Link to new `.blob` download links on the arbitrary query page (using `_blob_hash=...`) - plus tests for this\r\n\r\nCloses #1050, Closes #1051", "created_at": "2020-10-29T20:25:08Z", "updated_at": "2020-10-29T22:01:40Z", "closed_at": "2020-10-29T22:01:39Z", "merged_at": "2020-10-29T22:01:39Z", "merge_commit_sha": "78b3eeaad9189eb737014f53212082684f4bb0d4", "assignee": null, "milestone": {"value": 6026070, "label": "0.51"}, "draft": 0, "head": "1196d084de6a7a6f68c7705a6cc096bb8df132e3", "base": "d6f9ff71378c4eab34dad181c23cfc143a4aef2d", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1061", "merged_by": null, "auto_merge": null} {"id": 379192258, "node_id": "MDExOlB1bGxSZXF1ZXN0Mzc5MTkyMjU4", "number": 683, "state": "closed", "locked": 0, "title": ".execute_write() and .execute_write_fn() methods on Database", "user": {"value": 9599, "label": "simonw"}, "body": "See #682\r\n\r\n- [x] Come up with design for `.execute_write()` and `.execute_write_fn()`\r\n- [x] Build some quick demo plugins to exercise the design\r\n- [x] Write some unit tests\r\n- [x] Write the documentation", "created_at": "2020-02-24T19:51:58Z", "updated_at": "2020-05-30T18:40:20Z", "closed_at": "2020-02-25T04:45:08Z", "merged_at": "2020-02-25T04:45:08Z", "merge_commit_sha": "a093c5f79fa034a97d2ad8b606745dd3b80365af", "assignee": null, "milestone": {"value": 3268330, "label": "Datasette 1.0"}, "draft": 0, "head": "ec6e2edfe18446c9d77e3f30efbc299d27ea5c1b", "base": "411056c4c43e74f2b3d0e3bc1175e7998516b1b3", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/683", "merged_by": null, "auto_merge": null} {"id": 297459797, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjk3NDU5Nzk3", "number": 40, "state": "closed", "locked": 0, "title": ".get() method plus support for compound primary keys", "user": {"value": 9599, "label": "simonw"}, "body": "- [x] Tests for the `NotFoundError` exception\r\n- [x] Documentation for `.get()` method\r\n- [x] Support `--pk` multiple times to define CLI compound primary keys\r\n- [x] Documentation for compound primary keys", "created_at": "2019-07-15T03:43:13Z", "updated_at": "2019-07-15T04:28:57Z", "closed_at": "2019-07-15T04:28:52Z", "merged_at": "2019-07-15T04:28:52Z", "merge_commit_sha": "c65b67ca46f70e2da46a5b945f4ed358173262e9", "assignee": null, "milestone": null, "draft": 0, "head": "b5a5df6d0ed47f33f6e1b4873948ead9a7c71060", "base": "65b2156d9cc0aa6b5c3dc7a6bd600d98b281a13b", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/40", "merged_by": null, "auto_merge": null} {"id": 1479795255, "node_id": "PR_kwDOCGYnMM5YM-I3", "number": 584, "state": "closed", "locked": 0, "title": ".transform() instead of modifying sqlite_master for add_foreign_keys", "user": {"value": 9599, "label": "simonw"}, "body": "Refs:\r\n- #577\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--584.org.readthedocs.build/en/584/\n\r\n", "created_at": "2023-08-17T23:32:45Z", "updated_at": "2023-08-18T00:48:13Z", "closed_at": "2023-08-18T00:48:08Z", "merged_at": "2023-08-18T00:48:08Z", "merge_commit_sha": "509857ee8724f73760f3631b69c26f9047381187", "assignee": null, "milestone": null, "draft": 0, "head": "291505084e652972ad806383250757d41d596d38", "base": "1dc6b5aa644a92d3654f7068110ed7930989ce71", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/584", "merged_by": null, "auto_merge": null} {"id": 1507097949, "node_id": "PR_kwDOCGYnMM5Z1H1d", "number": 593, "state": "closed", "locked": 0, "title": ".transform() now preserves rowid values, refs #592", "user": {"value": 9599, "label": "simonw"}, "body": "Refs:\r\n- #592\r\n\r\n- [x] Tests against weird shaped tables\r\n\r\nI need to test that this works against:\r\n\r\n- `rowid` tables\r\n- Tables that have a column called `rowid` even though they are not rowid tables\r\n\r\n\r\n\r\n----\r\n:books: Documentation preview :books:: https://sqlite-utils--593.org.readthedocs.build/en/593/\r\n\r\n", "created_at": "2023-09-08T01:02:28Z", "updated_at": "2023-09-10T17:44:59Z", "closed_at": "2023-09-09T00:45:30Z", "merged_at": "2023-09-09T00:45:30Z", "merge_commit_sha": "1c6ea54338e24fcebcee4e2f9c170ee300a5d946", "assignee": null, "milestone": null, "draft": 0, "head": "b86374f705d1f4143a51634b30289cb48add0ea2", "base": "5d123f031fc4fadc98f508e0ef6b7b6671e86155", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/593", "merged_by": null, "auto_merge": null} {"id": 507903392, "node_id": "MDExOlB1bGxSZXF1ZXN0NTA3OTAzMzky", "number": 1040, "state": "closed", "locked": 0, "title": "/db/table/-/blob/pk/column.blob download URL", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1036. Still needs:\r\n\r\n- [x] Comprehensive tests across all of the code branches, plus permissions\r\n- [x] A bit more refactoring to share logic cleanly with `RowView`\r\n- ~~A configuration option to disable this feature (probably)~~", "created_at": "2020-10-21T22:39:15Z", "updated_at": "2020-10-24T23:09:20Z", "closed_at": "2020-10-24T23:09:19Z", "merged_at": "2020-10-24T23:09:19Z", "merge_commit_sha": "5a1519796037105bc20bcf2f91a76e022926c204", "assignee": null, "milestone": {"value": 6026070, "label": "0.51"}, "draft": 0, "head": "4f3165f25fd9241fcf1291c797f4c77766b954dc", "base": "bf82b3d6a605c9ddadd5fb739249dfe6defaf635", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1040", "merged_by": null, "auto_merge": null} {"id": 1144085408, "node_id": "PR_kwDOBm6k_c5EMVug", "number": 1931, "state": "closed", "locked": 0, "title": "/db/table/-/upsert", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1878\r\n\r\nStill todo:\r\n- [x] Support `\"return\": true` properly for upserts (with tests)\r\n- [x] Require both `insert-row` and `update-row` permissions\r\n- [x] Tests are going to need to cover both rowid-only and compound primary key tables, including all of the error states\r\n- [x] Documentation\r\n\r\n\r\n----\r\n:books: Documentation preview :books:: https://datasette--1931.org.readthedocs.build/en/1931/\r\n\r\n", "created_at": "2022-12-03T07:01:44Z", "updated_at": "2022-12-08T01:12:17Z", "closed_at": "2022-12-08T01:12:16Z", "merged_at": "2022-12-08T01:12:16Z", "merge_commit_sha": "272982e8a6f45700ff93c3917b4688a86de0e672", "assignee": null, "milestone": {"value": 8711695, "label": " Datasette 1.0a2"}, "draft": 0, "head": "7cd6fd9f76913196d4f99a194a30e406f33aa363", "base": "93ababe6f7150454d2cf278dae08569e505d2a5b", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1931", "merged_by": null, "auto_merge": null} {"id": 152360740, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUyMzYwNzQw", "number": 81, "state": "closed", "locked": 0, "title": ":fire: Removes DS_Store", "user": {"value": 50527, "label": "jefftriplett"}, "body": "", "created_at": "2017-11-13T22:07:52Z", "updated_at": "2017-11-14T02:24:54Z", "closed_at": "2017-11-13T22:16:55Z", "merged_at": "2017-11-13T22:16:55Z", "merge_commit_sha": "06a826c3188af82f27bb6b4e09cc89b782d30bd6", "assignee": null, "milestone": null, "draft": 0, "head": "c66d297eac556a7f4fd4dcdb15cfb9466fddac77", "base": "d75f423b6fcfc074b7c6f8f7679da8876f181edd", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/81", "merged_by": null, "auto_merge": null} {"id": 249680944, "node_id": "MDExOlB1bGxSZXF1ZXN0MjQ5NjgwOTQ0", "number": 9, "state": "closed", "locked": 0, "title": ":pencil: Updates my_database.py to my_database.db", "user": {"value": 50527, "label": "jefftriplett"}, "body": "I noticed that both `.py` and `.db` were used in the docs and assumed you'd prefer `.db`. ", "created_at": "2019-02-01T17:35:43Z", "updated_at": "2019-02-24T03:55:04Z", "closed_at": "2019-02-24T03:55:04Z", "merged_at": "2019-02-24T03:55:04Z", "merge_commit_sha": "c5068a0972651b3e359ebc2d6c1486b8b7d2c242", "assignee": null, "milestone": null, "draft": 0, "head": "1ad604fbbd3311f041357190796a3613c0c729d1", "base": "441c131db5cc68e197db19f0623ff8a96c90c3ff", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/9", "merged_by": null, "auto_merge": null} {"id": 651492888, "node_id": "MDExOlB1bGxSZXF1ZXN0NjUxNDkyODg4", "number": 1339, "state": "closed", "locked": 0, "title": "?_col=/?_nocol= to show/hide columns on the table page", "user": {"value": 9599, "label": "simonw"}, "body": "See #615. Still to do:\r\n\r\n- [x] Allow combination of `?_col=` and `?_nocol=` (`_nocol` wins)\r\n- [x] Deduplicate same column if passed in `?_col=` multiple times\r\n- [x] Validate that user did not try to remove a primary key\r\n- [x] Add tests\r\n- [x] Ensure this works correctly for SQL views\r\n- [x] Add documentation\r\n", "created_at": "2021-05-24T17:15:20Z", "updated_at": "2021-05-27T04:17:44Z", "closed_at": "2021-05-27T04:17:43Z", "merged_at": "2021-05-27T04:17:43Z", "merge_commit_sha": "f1c29fd6a184254aa68efadf096bcf21e848f921", "assignee": null, "milestone": null, "draft": 0, "head": "387c8379b92e559180098f73017a1bf2e6370205", "base": "2bd9d54b2762c991e11950c22c88c0336158d49b", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1339", "merged_by": null, "auto_merge": null} {"id": 1212277427, "node_id": "PR_kwDOBm6k_c5IQeKz", "number": 1999, "state": "closed", "locked": 0, "title": "?_extra= support (draft)", "user": {"value": 9599, "label": "simonw"}, "body": "Refs:\r\n- #262\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--1999.org.readthedocs.build/en/1999/\n\r\n", "created_at": "2023-01-21T04:55:18Z", "updated_at": "2023-03-22T22:49:41Z", "closed_at": "2023-03-22T22:49:40Z", "merged_at": "2023-03-22T22:49:40Z", "merge_commit_sha": "d97e82df3c8a3f2e97038d7080167be9bb74a68d", "assignee": null, "milestone": null, "draft": 0, "head": "69a31cd5b61f0b62938efdeec5972090f1a1a508", "base": "56b0758a5fbf85d01ff80a40c9b028469d7bb65f", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1999", "merged_by": null, "auto_merge": null} {"id": 195339111, "node_id": "MDExOlB1bGxSZXF1ZXN0MTk1MzM5MTEx", "number": 311, "state": "closed", "locked": 0, "title": "?_labels=1 to expand foreign keys (in csv and json), refs #233", "user": {"value": 9599, "label": "simonw"}, "body": "Output looks something like this:\r\n\r\n {\r\n \"rowid\": 233,\r\n \"TreeID\": 121240,\r\n \"qLegalStatus\": {\r\n \"value\" 2,\r\n \"label\": \"Private\"\r\n }\r\n \"qSpecies\": {\r\n \"value\": 16,\r\n \"label\": \"Sycamore\"\r\n }\r\n \"qAddress\": \"91 Commonwealth Ave\",\r\n ...\r\n }", "created_at": "2018-06-16T16:31:12Z", "updated_at": "2018-06-16T22:20:31Z", "closed_at": "2018-06-16T22:20:31Z", "merged_at": null, "merge_commit_sha": "9fe59e54ad65eb1c8239b1a78edb5219d3ab8ab0", "assignee": null, "milestone": null, "draft": 0, "head": "40287b1ba09d6e75f0db1458fe78d8c055f128af", "base": "d0a578c0fc07b9d9208cd9de981bdf7385a26c49", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/311", "merged_by": null, "auto_merge": null} {"id": 379378780, "node_id": "MDExOlB1bGxSZXF1ZXN0Mzc5Mzc4Nzgw", "number": 686, "state": "closed", "locked": 0, "title": "?_searchmode=raw option", "user": {"value": 9599, "label": "simonw"}, "body": "Closes #676", "created_at": "2020-02-25T05:45:50Z", "updated_at": "2020-02-25T05:56:09Z", "closed_at": "2020-02-25T05:56:04Z", "merged_at": "2020-02-25T05:56:04Z", "merge_commit_sha": "6cb65555f46456eb31b62e855e21b1d8c809b1a2", "assignee": null, "milestone": null, "draft": 0, "head": "abc782cb342c21b565142e44e70502e61ac6756b", "base": "a093c5f79fa034a97d2ad8b606745dd3b80365af", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/686", "merged_by": null, "auto_merge": null} {"id": 185307407, "node_id": "MDExOlB1bGxSZXF1ZXN0MTg1MzA3NDA3", "number": 246, "state": "closed", "locked": 0, "title": "?_shape=array and _timelimit=", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2018-05-02T00:18:54Z", "updated_at": "2018-05-02T00:20:41Z", "closed_at": "2018-05-02T00:20:40Z", "merged_at": "2018-05-02T00:20:40Z", "merge_commit_sha": "690736436bac599ca042d1caa465c6d66d2651f9", "assignee": null, "milestone": null, "draft": 0, "head": "3807d93b98573e142858c5871b8b4aadda71d28f", "base": "aa954382c3776d596f459897b0d984161293529d", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/246", "merged_by": null, "auto_merge": null} {"id": 270191084, "node_id": "MDExOlB1bGxSZXF1ZXN0MjcwMTkxMDg0", "number": 430, "state": "closed", "locked": 0, "title": "?_where= parameter on table views, closes #429", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-04-13T01:15:09Z", "updated_at": "2019-04-13T01:37:23Z", "closed_at": "2019-04-13T01:37:23Z", "merged_at": "2019-04-13T01:37:23Z", "merge_commit_sha": "bc6a9b45646610f362b4287bc4110440991aa4d6", "assignee": null, "milestone": null, "draft": 0, "head": "3ee087c7b60da7ec3e5d2f73611fc6ea99ff82fc", "base": "e11cb4c66442abca2a6b6159521a6cf4da8739c1", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/430", "merged_by": null, "auto_merge": null} {"id": 657373726, "node_id": "MDExOlB1bGxSZXF1ZXN0NjU3MzczNzI2", "number": 262, "state": "closed", "locked": 0, "title": "Ability to add descending order indexes", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #260", "created_at": "2021-05-29T04:51:04Z", "updated_at": "2021-05-29T05:01:42Z", "closed_at": "2021-05-29T05:01:39Z", "merged_at": "2021-05-29T05:01:39Z", "merge_commit_sha": "51d01da30d45c1fbc1e587e6046a933529cf915e", "assignee": null, "milestone": null, "draft": 0, "head": "50a4fb722d29c3e53f7b148a41aeda901d02a264", "base": "b2302875c97f723e02cc39136d0b20fd706369aa", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/262", "merged_by": null, "auto_merge": null} {"id": 716262829, "node_id": "MDExOlB1bGxSZXF1ZXN0NzE2MjYyODI5", "number": 1444, "state": "closed", "locked": 0, "title": "Ability to deploy demos of branches", "user": {"value": 9599, "label": "simonw"}, "body": "See #1442.", "created_at": "2021-08-19T21:08:04Z", "updated_at": "2021-08-19T21:09:44Z", "closed_at": "2021-08-19T21:09:39Z", "merged_at": "2021-08-19T21:09:39Z", "merge_commit_sha": "d84e574e59c51ddcd6cf60a6f9b3d45182daf824", "assignee": null, "milestone": null, "draft": 0, "head": "75f9fe6d6bc642ce5587dd74eed70064c11868be", "base": "adb5b70de5cec3c3dd37184defe606a082c232cf", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1444", "merged_by": null, "auto_merge": null} {"id": 719109709, "node_id": "MDExOlB1bGxSZXF1ZXN0NzE5MTA5NzA5", "number": 321, "state": "closed", "locked": 0, "title": "Ability to insert file contents as text, in addition to blob", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #319.", "created_at": "2021-08-24T22:37:18Z", "updated_at": "2021-08-24T23:31:17Z", "closed_at": "2021-08-24T23:31:13Z", "merged_at": "2021-08-24T23:31:13Z", "merge_commit_sha": "49a010c93d90bc68ce1c6fff7639927248912b54", "assignee": null, "milestone": null, "draft": 0, "head": "db2dd6d9f30b347f4ed22b07f59b5a615184fbfd", "base": "9258f4bd8450c951900de998a7bf81ca9b45a014", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/321", "merged_by": null, "auto_merge": null} {"id": 308292447, "node_id": "MDExOlB1bGxSZXF1ZXN0MzA4MjkyNDQ3", "number": 55, "state": "closed", "locked": 0, "title": "Ability to introspect and run queries against views", "user": {"value": 9599, "label": "simonw"}, "body": "See #54 ", "created_at": "2019-08-17T13:40:56Z", "updated_at": "2019-08-23T12:19:42Z", "closed_at": "2019-08-23T12:19:42Z", "merged_at": "2019-08-23T12:19:42Z", "merge_commit_sha": "9faa98222669723d31e918bb16a42c13c363817f", "assignee": null, "milestone": null, "draft": 0, "head": "4441d6d838fd7518ce715184361f549a04ec8b70", "base": "0e7b461eb3e925aef713206c15794ceae9259c57", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/55", "merged_by": null, "auto_merge": null} {"id": 434055752, "node_id": "MDExOlB1bGxSZXF1ZXN0NDM0MDU1NzUy", "number": 844, "state": "closed", "locked": 0, "title": "Action to run tests and upload coverage report", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #843", "created_at": "2020-06-13T20:52:47Z", "updated_at": "2020-06-13T21:36:52Z", "closed_at": "2020-06-13T21:36:50Z", "merged_at": "2020-06-13T21:36:50Z", "merge_commit_sha": "cf7a2bdb404734910ec07abc7571351a2d934828", "assignee": null, "milestone": null, "draft": 0, "head": "1210d9f41841bdca450f85a2342cdb0ff339c1b4", "base": "80c18a18fc444b89cc12b73599d56e091f3a3c87", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/844", "merged_by": null, "auto_merge": null} {"id": 1319390463, "node_id": "PR_kwDOBm6k_c5OpEz_", "number": 2061, "state": "open", "locked": 0, "title": "Add \"Packaging a plugin using Poetry\" section in docs", "user": {"value": 1238873, "label": "rclement"}, "body": "This PR adds a new section about packaging a plugin using `poetry` within the \"Writing plugins\" page of the documentation.\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2061.org.readthedocs.build/en/2061/\n\r\n", "created_at": "2023-04-19T07:23:28Z", "updated_at": "2023-04-19T07:27:18Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "e777f394dc770714055e48c952e04c1620454e3e", "assignee": null, "milestone": null, "draft": 0, "head": "2650e3ca2c5ae4f21efe216f9959be31d9e58eed", "base": "5890a20c374fb0812d88c9b0ef26a838bfa06c76", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2061", "merged_by": null, "auto_merge": null} {"id": 716357982, "node_id": "MDExOlB1bGxSZXF1ZXN0NzE2MzU3OTgy", "number": 66, "state": "open", "locked": 0, "title": "Add --merged-by flag to pull-requests sub command", "user": {"value": 30531572, "label": "sarcasticadmin"}, "body": "## Description\r\n\r\nProposing a solution to the API limitation for `merged_by` in pull_requests. Specifically the following called out in the readme:\r\n\r\n```\r\nNote that the merged_by column on the pull_requests table will only be populated for pull requests that are loaded using the --pull-request option - the GitHub API does not return this field for pull requests that are loaded in bulk.\r\n```\r\n\r\nThis approach might cause larger repos to hit rate limits called out in https://github.com/dogsheep/github-to-sqlite/issues/51 but seems to work well in the repos I tested and included below.\r\n\r\n## Old Behavior\r\n- Had to list out the pull-requests individually via multiple `--pull-request` flags\r\n\r\n## New Behavior\r\n\r\n- `--merged-by` flag for getting 'merge_by' information out of pull-requests without having to specify individual PR numbers.\r\n\r\n# Testing\r\n\r\nPicking some repo that has more than one merger (datasette only has 1 \ud83d\ude09 )\r\n\r\n```\r\n$ github-to-sqlite pull-requests ./github.db opnsense/tools --merged-by\r\n$ echo \"select id, url, merged_by from pull_requests;\" | sqlite3 ./github.db \r\n83533612|https://github.com/opnsense/tools/pull/39|1915288\r\n102632885|https://github.com/opnsense/tools/pull/43|1915288\r\n149114810|https://github.com/opnsense/tools/pull/57|1915288\r\n160394495|https://github.com/opnsense/tools/pull/64|1915288\r\n163308408|https://github.com/opnsense/tools/pull/67|1915288\r\n169723264|https://github.com/opnsense/tools/pull/69|1915288\r\n171381422|https://github.com/opnsense/tools/pull/72|1915288\r\n179938195|https://github.com/opnsense/tools/pull/77|1915288\r\n196233824|https://github.com/opnsense/tools/pull/82|1915288\r\n215289964|https://github.com/opnsense/tools/pull/93|\r\n219696100|https://github.com/opnsense/tools/pull/97|1915288\r\n223664843|https://github.com/opnsense/tools/pull/99|\r\n228446172|https://github.com/opnsense/tools/pull/103|1915288\r\n238930434|https://github.com/opnsense/tools/pull/110|1915288\r\n255507110|https://github.com/opnsense/tools/pull/119|1915288\r\n255980675|https://github.com/opnsense/tools/pull/120|1915288\r\n261906770|https://github.com/opnsense/tools/pull/125|\r\n263800503|https://github.com/opnsense/tools/pull/127|1915288\r\n264038685|https://github.com/opnsense/tools/pull/128|1915288\r\n264696704|https://github.com/opnsense/tools/pull/129|1915288\r\n266660547|https://github.com/opnsense/tools/pull/130|1915288\r\n273120409|https://github.com/opnsense/tools/pull/133|1915288\r\n274370803|https://github.com/opnsense/tools/pull/135|\r\n276600629|https://github.com/opnsense/tools/pull/139|\r\n277303655|https://github.com/opnsense/tools/pull/141|1915288\r\n293033714|https://github.com/opnsense/tools/pull/145|\r\n294827649|https://github.com/opnsense/tools/pull/146|\r\n295140008|https://github.com/opnsense/tools/pull/147|1915288\r\n305690829|https://github.com/opnsense/tools/pull/150|9783985\r\n307077931|https://github.com/opnsense/tools/pull/152|1915288\r\n321782100|https://github.com/opnsense/tools/pull/155|\r\n337265672|https://github.com/opnsense/tools/pull/160|\r\n337267484|https://github.com/opnsense/tools/pull/161|1915288\r\n368251763|https://github.com/opnsense/tools/pull/169|\r\n428262505|https://github.com/opnsense/tools/pull/181|\r\n437557011|https://github.com/opnsense/tools/pull/182|1915288\r\n447079893|https://github.com/opnsense/tools/pull/185|\r\n461822092|https://github.com/opnsense/tools/pull/191|\r\n463290142|https://github.com/opnsense/tools/pull/193|1915288\r\n470112962|https://github.com/opnsense/tools/pull/194|1915288\r\n472644649|https://github.com/opnsense/tools/pull/195|1915288\r\n488696898|https://github.com/opnsense/tools/pull/198|\r\n513289902|https://github.com/opnsense/tools/pull/201|\r\n522530265|https://github.com/opnsense/tools/pull/203|\r\n564443347|https://github.com/opnsense/tools/pull/213|\r\n597579516|https://github.com/opnsense/tools/pull/220|1915288\r\n602860357|https://github.com/opnsense/tools/pull/221|1915288\r\n608744738|https://github.com/opnsense/tools/pull/222|1915288\r\n623279673|https://github.com/opnsense/tools/pull/228|1915288\r\n664656182|https://github.com/opnsense/tools/pull/233|\r\n664781786|https://github.com/opnsense/tools/pull/234|1915288\r\n670683636|https://github.com/opnsense/tools/pull/235|1915288\r\n683150764|https://github.com/opnsense/tools/pull/237|\r\n685016233|https://github.com/opnsense/tools/pull/238|\r\n687099825|https://github.com/opnsense/tools/pull/239|1915288\r\n715705652|https://github.com/opnsense/tools/pull/244|1915288\r\n715721248|https://github.com/opnsense/tools/pull/245|1915288\r\n```\r\n`userid` are now present for those PRs that were merged.\r\n\r\nWithout the flag the `merged_by` behavior remains missing as expected when get PRs bulk:\r\n\r\n```\r\n$ github-to-sqlite pull-requests ./github.db opnsense/tools\r\n$ echo \"select id, url, merged_by from pull_requests;\" | sqlite3 ./github.db \r\n83533612|https://github.com/opnsense/tools/pull/39|\r\n102632885|https://github.com/opnsense/tools/pull/43|\r\n149114810|https://github.com/opnsense/tools/pull/57|\r\n160394495|https://github.com/opnsense/tools/pull/64|\r\n163308408|https://github.com/opnsense/tools/pull/67|\r\n169723264|https://github.com/opnsense/tools/pull/69|\r\n171381422|https://github.com/opnsense/tools/pull/72|\r\n179938195|https://github.com/opnsense/tools/pull/77|\r\n196233824|https://github.com/opnsense/tools/pull/82|\r\n215289964|https://github.com/opnsense/tools/pull/93|\r\n219696100|https://github.com/opnsense/tools/pull/97|\r\n223664843|https://github.com/opnsense/tools/pull/99|\r\n228446172|https://github.com/opnsense/tools/pull/103|\r\n238930434|https://github.com/opnsense/tools/pull/110|\r\n255507110|https://github.com/opnsense/tools/pull/119|\r\n255980675|https://github.com/opnsense/tools/pull/120|\r\n261906770|https://github.com/opnsense/tools/pull/125|\r\n263800503|https://github.com/opnsense/tools/pull/127|\r\n264038685|https://github.com/opnsense/tools/pull/128|\r\n264696704|https://github.com/opnsense/tools/pull/129|\r\n266660547|https://github.com/opnsense/tools/pull/130|\r\n273120409|https://github.com/opnsense/tools/pull/133|\r\n274370803|https://github.com/opnsense/tools/pull/135|\r\n276600629|https://github.com/opnsense/tools/pull/139|\r\n277303655|https://github.com/opnsense/tools/pull/141|\r\n293033714|https://github.com/opnsense/tools/pull/145|\r\n294827649|https://github.com/opnsense/tools/pull/146|\r\n295140008|https://github.com/opnsense/tools/pull/147|\r\n305690829|https://github.com/opnsense/tools/pull/150|\r\n307077931|https://github.com/opnsense/tools/pull/152|\r\n321782100|https://github.com/opnsense/tools/pull/155|\r\n337265672|https://github.com/opnsense/tools/pull/160|\r\n337267484|https://github.com/opnsense/tools/pull/161|\r\n368251763|https://github.com/opnsense/tools/pull/169|\r\n428262505|https://github.com/opnsense/tools/pull/181|\r\n437557011|https://github.com/opnsense/tools/pull/182|\r\n447079893|https://github.com/opnsense/tools/pull/185|\r\n461822092|https://github.com/opnsense/tools/pull/191|\r\n463290142|https://github.com/opnsense/tools/pull/193|\r\n470112962|https://github.com/opnsense/tools/pull/194|\r\n472644649|https://github.com/opnsense/tools/pull/195|\r\n488696898|https://github.com/opnsense/tools/pull/198|\r\n513289902|https://github.com/opnsense/tools/pull/201|\r\n522530265|https://github.com/opnsense/tools/pull/203|\r\n564443347|https://github.com/opnsense/tools/pull/213|\r\n597579516|https://github.com/opnsense/tools/pull/220|\r\n602860357|https://github.com/opnsense/tools/pull/221|\r\n608744738|https://github.com/opnsense/tools/pull/222|\r\n623279673|https://github.com/opnsense/tools/pull/228|\r\n664656182|https://github.com/opnsense/tools/pull/233|\r\n664781786|https://github.com/opnsense/tools/pull/234|\r\n670683636|https://github.com/opnsense/tools/pull/235|\r\n683150764|https://github.com/opnsense/tools/pull/237|\r\n685016233|https://github.com/opnsense/tools/pull/238|\r\n687099825|https://github.com/opnsense/tools/pull/239|\r\n715705652|https://github.com/opnsense/tools/pull/244|\r\n715721248|https://github.com/opnsense/tools/pull/245|\r\n```\r\n\r\nIndividual PRs passed via `--pull-request` flag behaves as expected (unchanged):\r\n\r\n```\r\n$ github-to-sqlite pull-requests ./github.db opnsense/tools --pull-request 39 --pull-request 237\r\n$ echo \"select id, url, merged_by from pull_requests;\" | sqlite3 ./github.db\r\n83533612|https://github.com/opnsense/tools/pull/39|1915288\r\n683150764|https://github.com/opnsense/tools/pull/237|\r\n```\r\n> Picking 1 PR that has a merged_by (39) and one that does not (237)", "created_at": "2021-08-20T00:57:55Z", "updated_at": "2021-09-28T21:50:31Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "6b4276d9469e4579c81588ac9e3d128026d919a0", "assignee": null, "milestone": null, "draft": 0, "head": "a92a31d5d446022baeaf7f3c9ea107094637e64d", "base": "ed3752022e45b890af63996efec804725e95d0d4", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 207052882, "label": "github-to-sqlite"}, "url": "https://github.com/dogsheep/github-to-sqlite/pull/66", "merged_by": null, "auto_merge": null} {"id": 872509423, "node_id": "PR_kwDOBm6k_c40AW_v", "number": 1649, "state": "closed", "locked": 0, "title": "Add /opt/homebrew to where spatialite extension can be found", "user": {"value": 2182, "label": "danp"}, "body": "Helps homebrew on Apple Silicon setups find spatialite without needing\r\na full path.\r\n\r\nSimilar to #1114", "created_at": "2022-03-06T18:09:35Z", "updated_at": "2022-03-06T22:46:00Z", "closed_at": "2022-03-06T19:39:15Z", "merged_at": "2022-03-06T19:39:15Z", "merge_commit_sha": "de810f49cc57a4f88e4a1553d26c579253ce4531", "assignee": null, "milestone": null, "draft": 0, "head": "59b2c16e3db10390b134673bda20045c351bdef8", "base": "0499f174c063283aa9b589d475a32077aaf7adc5", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1649", "merged_by": null, "auto_merge": null} {"id": 730020867, "node_id": "MDExOlB1bGxSZXF1ZXN0NzMwMDIwODY3", "number": 1467, "state": "closed", "locked": 0, "title": "Add Authorization header when CORS flag is set", "user": {"value": 3058200, "label": "jameslittle230"}, "body": "This PR adds the [`Access-Control-Allow-Headers`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers) flag when CORS mode is enabled.\r\n\r\nThis would fix https://github.com/simonw/datasette-auth-tokens/issues/4. When making cross-origin requests, the server must respond with all allowable HTTP headers. A Datasette instance using auth tokens must accept the `Authorization` HTTP header in order for cross-origin authenticated requests to take place.\r\n\r\nPlease let me know if there's a better way of doing this! I couldn't figure out a way to change the app's response from the plugin itself, so I'm starting here. If you'd rather this logic live in the plugin, I'd love any guidance you're able to give.", "created_at": "2021-09-08T22:14:41Z", "updated_at": "2021-10-17T02:29:07Z", "closed_at": "2021-10-14T18:54:18Z", "merged_at": null, "merge_commit_sha": "15f258735ddee555028a075c09e1e8f74069be70", "assignee": null, "milestone": null, "draft": 0, "head": "05109e8d61dedd477c4cedfb89b1da65610f70d1", "base": "d57ab156b35ec642549fb69d08279850065027d2", "author_association": "NONE", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1467", "merged_by": null, "auto_merge": null} {"id": 634821065, "node_id": "MDExOlB1bGxSZXF1ZXN0NjM0ODIxMDY1", "number": 1319, "state": "closed", "locked": 0, "title": "Add Docker multi-arch support with Buildx", "user": {"value": 10801138, "label": "blairdrummond"}, "body": "This adds Docker support to extra CPU architectures (like arm) using [Docker's Buildx action](https://github.com/marketplace/actions/docker-setup-buildx)\r\n\r\nYou can see [what that looks like on Dockerhub](https://hub.docker.com/r/blairdrummond/datasette/tags?page=1&ordering=last_updated)\r\n\r\nAnd how it lets Datasette run on a Raspberry Pi (top is my dockerhub, bottom is upstream)\r\n\r\n![Screenshot from 2021-05-08 15-32-25](https://user-images.githubusercontent.com/10801138/117551210-a17a9f80-b012-11eb-966b-10e1590dd4a9.png)\r\n\r\nThe workflow log [here](https://github.com/blairdrummond/datasette/runs/2535743398?check_suite_focus=true) (I subbed `blairdrummond` for datasetteproject in my branch) ", "created_at": "2021-05-08T19:35:03Z", "updated_at": "2021-05-27T16:49:24Z", "closed_at": "2021-05-27T16:49:24Z", "merged_at": "2021-05-27T16:49:23Z", "merge_commit_sha": "89822d10be0da446471986addea91d9766f12efb", "assignee": null, "milestone": null, "draft": 0, "head": "cfca570f9ca010ff9036c75209dc42e78bbc945f", "base": "1b697539f5b53cec3fe13c0f4ada13ba655c88c7", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1319", "merged_by": null, "auto_merge": null} {"id": 698423667, "node_id": "MDExOlB1bGxSZXF1ZXN0Njk4NDIzNjY3", "number": 8, "state": "open", "locked": 0, "title": "Add Gmail takeout mbox import (v2)", "user": {"value": 28565, "label": "maxhawkins"}, "body": "WIP\r\n\r\nThis PR builds on #5 to continue implementing gmail import support.\r\n\r\nBuilding on @UtahDave's work, these commits add a few performance and bug fixes:\r\n\r\n* Decreased memory overhead for import by manually parsing mbox headers.\r\n* Fixed error where some messages in the mbox would yield a row with NULL in all columns.\r\n\r\nI will send more commits to fix any errors I encounter as I run the importer on my personal takeout data.", "created_at": "2021-07-28T07:05:32Z", "updated_at": "2023-09-08T01:22:49Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "d2809fd3fd835358d01ad10401228a562539b29e", "assignee": null, "milestone": null, "draft": 0, "head": "8e6d487b697ce2e8ad885acf613a157bfba84c59", "base": "e54e544427f1cc3ea8189f0e95f54046301a8645", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 206649770, "label": "google-takeout-to-sqlite"}, "url": "https://github.com/dogsheep/google-takeout-to-sqlite/pull/8", "merged_by": null, "auto_merge": null} {"id": 853484980, "node_id": "PR_kwDOCGYnMM4y3yW0", "number": 407, "state": "closed", "locked": 0, "title": "Add SpatiaLite helpers to CLI", "user": {"value": 25778, "label": "eyeseast"}, "body": "Closes #398 \r\n\r\nThis adds SpatiaLite helpers to the CLI. \r\n\r\n```sh\r\n# init spatialite when creating a database\r\nsqlite-utils create database.db --enable-wal --init-spatialite\r\n\r\n# add geometry columns\r\n# needs a database, table, geometry column name, type, with optional SRID and not-null\r\n# this will throw an error if the table doesn't already exist\r\nsqlite-utils add-geometry-column database.db table-name geometry --srid 4326 --not-null\r\n\r\n# spatial index an existing table/column\r\n# this will throw an error it the table and column don't exist\r\nsqlite-utils create-spatial-index database.db table-name geometry\r\n```\r\n\r\nDocs and tests are included. ", "created_at": "2022-02-15T16:50:17Z", "updated_at": "2022-02-16T01:49:40Z", "closed_at": "2022-02-16T00:58:08Z", "merged_at": "2022-02-16T00:58:07Z", "merge_commit_sha": "a692c56659c3563b26dcdc9e3534d63ecc26e180", "assignee": null, "milestone": null, "draft": 0, "head": "a974da591915e0548182bbbf01da34ecb9e537e6", "base": "e7f040106b5f5a892ebd984f19b21c605e87c142", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/407", "merged_by": null, "auto_merge": null} {"id": 592364255, "node_id": "MDExOlB1bGxSZXF1ZXN0NTkyMzY0MjU1", "number": 16, "state": "open", "locked": 0, "title": "Add a fallback ID, print if no ID found", "user": {"value": 1234956, "label": "n8henrie"}, "body": "Fixes https://github.com/dogsheep/healthkit-to-sqlite/issues/14\n", "created_at": "2021-03-13T13:38:29Z", "updated_at": "2021-03-13T14:44:04Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "16ab307b2138891f226a66e4954c5470de753a0f", "assignee": null, "milestone": null, "draft": 0, "head": "27b3d54ccfe7d861770a9d0b173f6503580fea4a", "base": "71e36e1cf034b96de2a8e6652265d782d3fdf63b", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 197882382, "label": "healthkit-to-sqlite"}, "url": "https://github.com/dogsheep/healthkit-to-sqlite/pull/16", "merged_by": null, "auto_merge": null} {"id": 275281307, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc1MjgxMzA3", "number": 444, "state": "closed", "locked": 0, "title": "Add a max-line-length setting for flake8", "user": {"value": 45057, "label": "russss"}, "body": "This stops my automatic editor linting from flagging lines which are too\r\nlong. It's been lingering in my checkout for ages.\r\n\r\n160 is an arbitrary large number - we could alter it if we have any\r\nopinions (but I find the line length limit to be my least favourite part\r\nof PEP8).", "created_at": "2019-05-02T08:58:57Z", "updated_at": "2019-05-04T09:44:48Z", "closed_at": "2019-05-03T13:11:28Z", "merged_at": "2019-05-03T13:11:28Z", "merge_commit_sha": "470cf0b05d4fda0d2563f81c7e32af13fe346ccc", "assignee": null, "milestone": null, "draft": 0, "head": "4f0d265951d7e95920298b46eff39bb9cc783984", "base": "efc93b8ab5a21e3802f75f08d5e41409f5684b5d", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/444", "merged_by": null, "auto_merge": null} {"id": 587332473, "node_id": "MDExOlB1bGxSZXF1ZXN0NTg3MzMyNDcz", "number": 1252, "state": "closed", "locked": 0, "title": "Add back styling to lists within table cells (fixes #1141)", "user": {"value": 7476523, "label": "bobwhitelock"}, "body": "This overrides the Datasette reset - see https://github.com/simonw/datasette/blob/d0fd833b8cdd97e1b91d0f97a69b494895d82bee/datasette/static/app.css#L35-L38 - to add back the default styling of list items displayed within Datasette table cells.\r\n\r\nFollowing this change, the same content as in the original issue looks like this:\r\n\r\n![2021-03-09_02:57:32](https://user-images.githubusercontent.com/7476523/110411982-63e5ae80-8083-11eb-9b5c-e5dc825073e2.png)\r\n", "created_at": "2021-03-09T03:00:57Z", "updated_at": "2021-03-29T00:14:04Z", "closed_at": "2021-03-29T00:14:04Z", "merged_at": "2021-03-29T00:14:04Z", "merge_commit_sha": "e72397d65b06b019521b6411243687464ac8d8ca", "assignee": null, "milestone": null, "draft": 0, "head": "d22aa32cd9c0f798bcab917cc2024a371b4c0069", "base": "d0fd833b8cdd97e1b91d0f97a69b494895d82bee", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1252", "merged_by": null, "auto_merge": null} {"id": 370024697, "node_id": "MDExOlB1bGxSZXF1ZXN0MzcwMDI0Njk3", "number": 4, "state": "closed", "locked": 0, "title": "Add beeminder-to-sqlite", "user": {"value": 706257, "label": "bcongdon"}, "body": "", "created_at": "2020-02-02T15:51:36Z", "updated_at": "2020-10-12T00:36:16Z", "closed_at": "2020-10-12T00:36:16Z", "merged_at": "2020-10-12T00:36:16Z", "merge_commit_sha": "7e4c6ecdabc249c77e8049cd172b1b5af08a3371", "assignee": null, "milestone": null, "draft": 0, "head": "6713b5c50178b95a9ec50227d4ef5793e71e8b0a", "base": "2972bb001ab5f675eced62f7ba5adef2d3eba2ad", "author_association": "CONTRIBUTOR", "repo": {"value": 214746582, "label": "dogsheep.github.io"}, "url": "https://github.com/dogsheep/dogsheep.github.io/pull/4", "merged_by": null, "auto_merge": null} {"id": 572254103, "node_id": "MDExOlB1bGxSZXF1ZXN0NTcyMjU0MTAz", "number": 1223, "state": "closed", "locked": 0, "title": "Add compile option to Dockerfile to fix failing test (fixes #696)", "user": {"value": 7476523, "label": "bobwhitelock"}, "body": "This test was failing when run inside the Docker container: `test_searchable[/fixtures/searchable.json?_search=te*+AND+do*&_searchmode=raw-expected_rows3]`,\r\n\r\nwith this error:\r\n\r\n```\r\n def test_searchable(app_client, path, expected_rows):\r\n response = app_client.get(path)\r\n> assert expected_rows == response.json[\"rows\"]\r\nE AssertionError: assert [[1, 'barry c...sel', 'puma']] == []\r\nE Left contains 2 more items, first extra item: [1, 'barry cat', 'terry dog', 'panther']\r\nE Full diff:\r\nE + []\r\nE - [[1, 'barry cat', 'terry dog', 'panther'],\r\nE - [2, 'terry dog', 'sara weasel', 'puma']]\r\n```\r\n\r\nThe issue was that the version of sqlite3 built inside the Docker container was built with FTS3 and FTS4 enabled, but without the\r\n`SQLITE_ENABLE_FTS3_PARENTHESIS` compile option passed, which adds support for using `AND` and `NOT` within `match` expressions (see https://sqlite.org/fts3.html#compiling_and_enabling_fts3_and_fts4 and https://www.sqlite.org/compile.html).\r\n\r\nWithout this, the `AND` used in the search in this test was being interpreted as a literal string, and so no matches were found. Adding this compile option fixes this.\r\n\r\n---\r\n\r\nI actually ran into this issue because the same test was failing when I ran the test suite on my own machine, outside of Docker, and so I eventually tracked this down to my system sqlite3 also being compiled without this option.\r\n\r\nI wonder if this is a sign of a slightly deeper issue, that Datasette can silently behave differently based on the version and compilation of sqlite3 it is being used with. On my own system I fixed the test suite by running `pip install pysqlite3-binary`, so that this would be picked up instead of the `sqlite` package, as this seems to be compiled using this option, . Maybe using `pysqlite3-binary` could be installed/recommended by default so a more deterministic version of sqlite is used? Or there could be some feature detection done on the available sqlite version, to know what features are available and can be used/tested?", "created_at": "2021-02-12T03:38:05Z", "updated_at": "2021-03-07T12:01:12Z", "closed_at": "2021-03-07T07:41:17Z", "merged_at": "2021-03-07T07:41:17Z", "merge_commit_sha": "d0fd833b8cdd97e1b91d0f97a69b494895d82bee", "assignee": null, "milestone": null, "draft": 0, "head": "d1cd1f259c699fab3af01c4aa90035ed0242471a", "base": "9603d893b9b72653895318c9104d754229fdb146", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1223", "merged_by": null, "auto_merge": null} {"id": 1238017010, "node_id": "PR_kwDOBm6k_c5JyqPy", "number": 2025, "state": "open", "locked": 0, "title": "Add database metadata to index.html template context", "user": {"value": 9993, "label": "palewire"}, "body": "Fixes #2016 \r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2025.org.readthedocs.build/en/2025/\n\r\n", "created_at": "2023-02-12T11:16:58Z", "updated_at": "2023-02-12T11:17:14Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "a2d3bb02cf2c9b8ed7c788910fdda606108cd584", "assignee": null, "milestone": null, "draft": 0, "head": "912ed9de92d1bb9a28f50a2e08c5e7df2b827c15", "base": "0b4a28691468b5c758df74fa1d72a823813c96bf", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2025", "merged_by": null, "auto_merge": null} {"id": 596627780, "node_id": "MDExOlB1bGxSZXF1ZXN0NTk2NjI3Nzgw", "number": 18, "state": "open", "locked": 0, "title": "Add datetime parsing", "user": {"value": 1234956, "label": "n8henrie"}, "body": "Parses the datetime columns so they are subsequently properly recognized as\ndatetime.\n\nFixes https://github.com/dogsheep/healthkit-to-sqlite/issues/17\n", "created_at": "2021-03-19T14:34:22Z", "updated_at": "2021-03-19T14:34:22Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "c87f4e8aa88ec277c6b5a000670c2cb42a10c03d", "assignee": null, "milestone": null, "draft": 0, "head": "e0e7a0f99f844db33964b27c29b0b8d5f160202b", "base": "71e36e1cf034b96de2a8e6652265d782d3fdf63b", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 197882382, "label": "healthkit-to-sqlite"}, "url": "https://github.com/dogsheep/healthkit-to-sqlite/pull/18", "merged_by": null, "auto_merge": null} {"id": 165029807, "node_id": "MDExOlB1bGxSZXF1ZXN0MTY1MDI5ODA3", "number": 182, "state": "closed", "locked": 0, "title": "Add db filesize next to download link", "user": {"value": 3433657, "label": "raynae"}, "body": "Took a stab at #172, will this do the trick?", "created_at": "2018-01-25T04:58:56Z", "updated_at": "2019-03-22T13:50:57Z", "closed_at": "2019-02-06T04:59:38Z", "merged_at": null, "merge_commit_sha": "a8d9e69872dec9a551b25cd609ffdbf3896045bd", "assignee": null, "milestone": null, "draft": 0, "head": "b62835205a830472abb66c708822c2dcdf4ab027", "base": "56623e48da5412b25fb39cc26b9c743b684dd968", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/182", "merged_by": null, "auto_merge": null} {"id": 719998225, "node_id": "MDExOlB1bGxSZXF1ZXN0NzE5OTk4MjI1", "number": 322, "state": "closed", "locked": 0, "title": "Add dict type to be mapped as TEXT in sqllite", "user": {"value": 2496189, "label": "minaeid90"}, "body": "the library deal with Postgres type jsonb as dictionary, add dict type as a TEXT for mapping to sqlite\r\n\r\n", "created_at": "2021-08-25T20:54:26Z", "updated_at": "2021-11-15T00:27:40Z", "closed_at": "2021-11-15T00:27:40Z", "merged_at": "2021-11-15T00:27:40Z", "merge_commit_sha": "271b894af52eb6437ae6cd84eba9867ad8dd43f6", "assignee": null, "milestone": null, "draft": 0, "head": "69619f68c26478fdee479110e084fd22711013a3", "base": "77c240df56068341561e95e4a412cbfa24dc5bc7", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/322", "merged_by": null, "auto_merge": null} {"id": 1069033742, "node_id": "PR_kwDOBm6k_c4_uCkO", "number": 1825, "state": "closed", "locked": 0, "title": "Add documentation for serving via OpenRC", "user": {"value": 1048831, "label": "asimpson"}, "body": "I also removed a few lines which felt redundant given the following section dedicated to running behind a nginx proxy.\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--1825.org.readthedocs.build/en/1825/\n\r\n", "created_at": "2022-09-27T19:00:56Z", "updated_at": "2022-09-28T04:21:37Z", "closed_at": "2022-09-28T04:21:37Z", "merged_at": "2022-09-28T04:21:37Z", "merge_commit_sha": "984b1df12cf19a6731889fc0665bb5f622e07b7c", "assignee": null, "milestone": null, "draft": 0, "head": "e7e96dc2ef2b76338786f1b911a9753bb8bfc297", "base": "5f9f567acbc58c9fcd88af440e68034510fb5d2b", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1825", "merged_by": null, "auto_merge": null} {"id": 992299943, "node_id": "PR_kwDOCGYnMM47JUun", "number": 452, "state": "closed", "locked": 0, "title": "Add duplicate table feature", "user": {"value": 1690072, "label": "davidleejy"}, "body": "This PR addresses a feature request raised in issue #449. Specifically this PR adds a functionality that lets users duplicate a table via:\r\n\r\n```python\r\ntable_new = db[\"my_table\"].duplicate(\"new_table\")\r\n```\r\n\r\nTest added in file `tests/test_duplicate.py`.\r\n\r\nHappy to make changes to meet maintainers' feedback, if any. ", "created_at": "2022-07-09T20:24:31Z", "updated_at": "2022-07-15T21:21:37Z", "closed_at": "2022-07-15T21:21:36Z", "merged_at": "2022-07-15T21:21:36Z", "merge_commit_sha": "b366e68deb0780048a23610c279552f8529d4726", "assignee": null, "milestone": null, "draft": 0, "head": "eef350fe543c6301c61b257c5f708e0e16ed5a34", "base": "42440d6345c242ee39778045e29143fb550bd2c2", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/452", "merged_by": null, "auto_merge": null} {"id": 1170816476, "node_id": "PR_kwDOBm6k_c5FyT3c", "number": 1967, "state": "closed", "locked": 0, "title": "Add favicon to documentation", "user": {"value": 1839645, "label": "choldgraf"}, "body": "I've been browsing the datasette documentation and found it hard to quickly locate tabs with many of them open, because it does not ship a favicon. So this PR:\r\n\r\n- Grabs the favicon `.png` from datasette itself[^1]\r\n- Adds it to the `_static/` folder\r\n- Sets `html_favicon` to load it in the docs\r\n\r\n[^1]: I also learned that Chrome can fetch favicons as an internal service! See `chrome://favicon/https://datasette.io/tools/github-to-sqlite`.\r\n", "created_at": "2022-12-19T14:01:04Z", "updated_at": "2022-12-31T19:15:51Z", "closed_at": "2022-12-31T19:00:31Z", "merged_at": "2022-12-31T19:00:31Z", "merge_commit_sha": "994ce46ed4a5d680bee58242efd95181946c25e9", "assignee": null, "milestone": null, "draft": 0, "head": "ac64f6fe6aeb1941d01f862999a8b9d4e95f4991", "base": "e03aed00026cc2e59c09ca41f69a247e1a85cc89", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1967", "merged_by": null, "auto_merge": null} {"id": 505076418, "node_id": "MDExOlB1bGxSZXF1ZXN0NTA1MDc2NDE4", "number": 5, "state": "open", "locked": 0, "title": "Add fitbit-to-sqlite", "user": {"value": 4632208, "label": "mrphil007"}, "body": "", "created_at": "2020-10-16T20:04:05Z", "updated_at": "2020-10-16T20:04:05Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "9b9a677a4fcb6a31be8c406b3050cfe1c6e7e398", "assignee": null, "milestone": null, "draft": 0, "head": "db64d60ee92448b1d2a7e190d9da20eb306326b0", "base": "d0686ebed6f08e9b18b4b96c2b8170e043a69adb", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 214746582, "label": "dogsheep.github.io"}, "url": "https://github.com/dogsheep/dogsheep.github.io/pull/5", "merged_by": null, "auto_merge": null} {"id": 560204306, "node_id": "MDExOlB1bGxSZXF1ZXN0NTYwMjA0MzA2", "number": 224, "state": "closed", "locked": 0, "title": "Add fts offset docs.", "user": {"value": 37962604, "label": "polyrand"}, "body": "The limit can be passed as a string to the query builder to have an offset. I have tested it using the shorthand `limit=f\"15, 30\"`, the standard syntax should work too.", "created_at": "2021-01-22T20:50:58Z", "updated_at": "2021-02-14T19:31:06Z", "closed_at": "2021-02-14T19:31:06Z", "merged_at": null, "merge_commit_sha": "4d6ff040770119fb2c1bcbc97678d9deca752f2f", "assignee": null, "milestone": null, "draft": 0, "head": "341f50d2d95ba1d69ad64ba8c0ec0ffa9a68d063", "base": "36dc7e3909a44878681c266b90f9be76ac749f2d", "author_association": "NONE", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/224", "merged_by": null, "auto_merge": null} {"id": 768796296, "node_id": "PR_kwDOCGYnMM4t0uaI", "number": 333, "state": "closed", "locked": 0, "title": "Add functionality to read Parquet files.", "user": {"value": 2118708, "label": "Florents-Tselai"}, "body": "I needed this for a project of mine, and I thought it'd be useful to have it in sqlite-utils (It's also mentioned in #248 ).\r\nThe current implementation works (data is read & data types are inferred correctly.\r\nI've added a single straightforward test case, but @simonw please let me know if there are any non-obvious flags/combinations I should test too.", "created_at": "2021-10-28T23:43:19Z", "updated_at": "2021-11-25T19:47:35Z", "closed_at": "2021-11-25T19:47:35Z", "merged_at": null, "merge_commit_sha": "eda2b1f8d2670c6ca8512e3e7c0150866bd0bdc6", "assignee": null, "milestone": null, "draft": 0, "head": "50ec2e49dee3b09a48a7aef55eceaa3f752a52e7", "base": "fda4dad23a0494890267fbe8baf179e2b56ee914", "author_association": "NONE", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/333", "merged_by": null, "auto_merge": null} {"id": 445023326, "node_id": "MDExOlB1bGxSZXF1ZXN0NDQ1MDIzMzI2", "number": 118, "state": "closed", "locked": 0, "title": "Add insert --truncate option", "user": {"value": 79913, "label": "tsibley"}, "body": "\r\n\r\nDeletes all rows in the table (if it exists) before inserting new rows.\r\nSQLite doesn't implement a TRUNCATE TABLE statement but does optimize an\r\nunqualified DELETE FROM.\r\n\r\nThis can be handy if you want to refresh the entire contents of a table\r\nbut a) don't have a PK (so can't use --replace), b) don't want the table\r\nto disappear (even briefly) for other connections, and c) have to handle\r\nrecords that used to exist being deleted.\r\n\r\nIdeally the replacement of rows would appear instantaneous to other\r\nconnections by putting the DELETE + INSERT in a transaction, but this is\r\nvery difficult without breaking other code as the current transaction\r\nhandling is inconsistent and non-systematic. There exists the\r\npossibility for the DELETE to succeed but the INSERT to fail, leaving an\r\nempty table. This is not much worse, however, than the current\r\npossibility of one chunked INSERT succeeding and being committed while\r\nthe next chunked INSERT fails, leaving a partially complete operation.", "created_at": "2020-07-06T21:58:40Z", "updated_at": "2020-07-08T17:26:21Z", "closed_at": "2020-07-08T17:26:21Z", "merged_at": "2020-07-08T17:26:21Z", "merge_commit_sha": "ae4593316ccf5e42ad26f27033193834a7e696c8", "assignee": null, "milestone": null, "draft": 0, "head": "332f7d770b84734dbed4842ab3ed24ee5b687889", "base": "f8277d0fb9c05a88a9ff01d996e31d55f0f0a645", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/118", "merged_by": null, "auto_merge": null} {"id": 274174614, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc0MTc0NjE0", "number": 437, "state": "closed", "locked": 0, "title": "Add inspect and prepare_sanic hooks", "user": {"value": 45057, "label": "russss"}, "body": "This adds two new plugin hooks:\r\n\r\nThe `inspect` hook allows plugins to add data to the inspect dictionary.\r\n\r\nThe `prepare_sanic` hook allows plugins to hook into the web router. I've attached a warning to this hook in the docs in light of #272 but I want this hook now...\r\n\r\nOn quick inspection, I don't think it's worthwhile to try and make this hook independent of the web framework (but it looks like Starlette would make the hook implementation a bit nicer).\r\n\r\nRef #14", "created_at": "2019-04-28T11:53:34Z", "updated_at": "2019-06-24T16:38:57Z", "closed_at": "2019-06-24T16:38:56Z", "merged_at": null, "merge_commit_sha": "7aeaac7c478acf572bda61bdaa6ac3247dc15811", "assignee": null, "milestone": null, "draft": 0, "head": "f33a0a63a7442f0b665320ac3e2eb55de315f1f7", "base": "11b352b4d52fd02a422776edebb14f12e4994d3b", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/437", "merged_by": null, "auto_merge": null} {"id": 673872974, "node_id": "MDExOlB1bGxSZXF1ZXN0NjczODcyOTc0", "number": 7, "state": "open", "locked": 0, "title": "Add instagram-to-sqlite", "user": {"value": 36654812, "label": "gavindsouza"}, "body": "The tool covers only chat imports at the time of opening this PR but I'm planning to import everything else that I feel inquisitive about\r\n\r\nref: https://github.com/gavindsouza/instagram-to-sqlite", "created_at": "2021-06-19T12:26:16Z", "updated_at": "2021-07-28T07:58:59Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "66e9828db4a8ddc4049ab9932e1304288e571821", "assignee": null, "milestone": null, "draft": 0, "head": "4e4c6baf41778071a960d288b0ef02bd01cb6376", "base": "92c6bb77629feeed661c7b8d9183a11367de39e0", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 214746582, "label": "dogsheep.github.io"}, "url": "https://github.com/dogsheep/dogsheep.github.io/pull/7", "merged_by": null, "auto_merge": null} {"id": 500798091, "node_id": "MDExOlB1bGxSZXF1ZXN0NTAwNzk4MDkx", "number": 1008, "state": "open", "locked": 0, "title": "Add json_loads and json_dumps jinja2 filters", "user": {"value": 649467, "label": "mhalle"}, "body": "", "created_at": "2020-10-09T20:11:34Z", "updated_at": "2020-12-15T02:30:28Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "e33e91ca7c9b2fdeab9d8179ce0d603918b066aa", "assignee": null, "milestone": null, "draft": 0, "head": "40858989d47043743d6b1c9108528bec6a317e43", "base": "1bdbc8aa7f4fd7a768d456146e44da86cb1b36d1", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1008", "merged_by": null, "auto_merge": null} {"id": 153306882, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUzMzA2ODgy", "number": 115, "state": "closed", "locked": 0, "title": "Add keyboard shortcut to execute SQL query", "user": {"value": 198537, "label": "rgieseke"}, "body": "Very cool tool, thanks a lot!\r\n\r\nThis PR adds a `Shift-Enter` short cut to execute the SQL query. I used CodeMirrors keyboard handling.", "created_at": "2017-11-17T14:13:33Z", "updated_at": "2017-11-17T15:16:34Z", "closed_at": "2017-11-17T14:22:56Z", "merged_at": "2017-11-17T14:22:56Z", "merge_commit_sha": "eda848b37f8452dba7913583ef101f39d9b130ba", "assignee": null, "milestone": null, "draft": 0, "head": "bb514164e69400fc0be4e033c27f45f90b1ef651", "base": "ed2b3f25beac720f14869350baacc5f62b065194", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/115", "merged_by": null, "auto_merge": null} {"id": 508720660, "node_id": "MDExOlB1bGxSZXF1ZXN0NTA4NzIwNjYw", "number": 1044, "state": "closed", "locked": 0, "title": "Add minimum supported python", "user": {"value": 45380, "label": "bollwyvl"}, "body": "Thanks for `datasette`!\r\n\r\nThis PR adds `python_requires` to formally signal the [minimum supported python version](https://packaging.python.org/guides/dropping-older-python-versions/#specify-the-version-ranges-for-supported-python-distributions) (which is pointed out with classifiers, so seems pretty straightforward).", "created_at": "2020-10-23T05:08:03Z", "updated_at": "2020-10-23T20:53:08Z", "closed_at": "2020-10-23T20:53:08Z", "merged_at": "2020-10-23T20:53:08Z", "merge_commit_sha": "cab8e65261b117b493af6a0b21aa2e1ae4564419", "assignee": null, "milestone": null, "draft": 0, "head": "6453ab18e56b36bc912b6f24c4a43002c6084ade", "base": "d0cc6f4c32e1f89238ddec782086b3122f445bd4", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1044", "merged_by": null, "auto_merge": null} {"id": 1608050242, "node_id": "PR_kwDOCGYnMM5f2OZC", "number": 604, "state": "closed", "locked": 0, "title": "Add more STRICT table support", "user": {"value": 16437338, "label": "tkhattra"}, "body": "- https://github.com/simonw/sqlite-utils/issues/344#issuecomment-982014776\r\n\r\nMake `table.transform()` preserve STRICT mode.\r\n\r\n\r\n----\r\n:books: Documentation preview :books:: https://sqlite-utils--604.org.readthedocs.build/en/604/\r\n\r\n", "created_at": "2023-11-19T19:38:53Z", "updated_at": "2023-12-08T05:17:20Z", "closed_at": "2023-12-08T05:05:27Z", "merged_at": "2023-12-08T05:05:27Z", "merge_commit_sha": "1500c19bd0f31b2e7f28a5ec2d7bfa133a2e4d4c", "assignee": null, "milestone": null, "draft": 0, "head": "61c6e26cf922c70b65b161473723ff9d869a04a5", "base": "9286c1ba432e890b1bb4b2a1f847b15364c1fa18", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/604", "merged_by": null, "auto_merge": null} {"id": 1492889894, "node_id": "PR_kwDOBm6k_c5Y-7Em", "number": 2162, "state": "closed", "locked": 0, "title": "Add new `--internal internal.db` option, deprecate legacy `_internal` database", "user": {"value": 15178711, "label": "asg017"}, "body": "refs #2157 \r\n\r\nThis PR adds a new `--internal` option to datasette serve. If provided, it is the path to a persistent internal database that Datasette core and Datasette plugins can use to store data, as discussed in the proposal issue. \r\n\r\nThis PR also removes and deprecates the previous in-memory `_internal` database. Those tables now appear in the `internal` database, with `core_` prefixes (ex `tables` in `_internal` is now `core_tables` in `internal`).\r\n\r\n\r\n## A note on the new `core_` tables\r\nHowever, one important notes about those new `core_` tables: If a `--internal` DB is passed in, that means those `core_` tables will persist across multiple Datasette instances. This wasn't the case before, since `_internal` was always an in-memory database created from scratch.\r\n\r\nI tried to put those `core_` tables as `TEMP` tables - after all, there's always one 1 `internal` DB connection at a time, so I figured it would work. But, since we use the `Database()` wrapper for the internal DB, it has two separate connections: a default read-only connection and a write connection that is created when a write operation occurs. Which meant the `TEMP` tables would be created by the write connection, but not available in the read-only connection. \r\n\r\nSo I had a brillant idea: Attach an in-memory named database with `cache=shared`, and create those tables there! \r\n\r\n```sql\r\nATTACH DATABASE 'file:datasette_internal_core?mode=memory&cache=shared' AS core;\r\n```\r\n\r\nWe'd run this on both the read-only connection and the write-only connection. That way, those tables would stay in memory, they'd communicate with the `cache=shared` feature, and we'd be good to go.\r\n\r\n\r\nHowever, I couldn't find an easy way to run a `ATTACH DATABASE` command on the read-only query. \r\n\r\nUsing `Database()` as a wrapper for the internal DB is pretty limiting - it's meant for Datasette \"data\" databases, where we want multiple readers and possibly 1 write connection at a time. But the internal database doesn't really require that kind of support - I think we could get away with a single read/write connection, but it seemed like too big of a rabbithole to go through now. \r\n\r\n\r\n\r\n----\r\n:books: Documentation preview :books:: https://datasette--2162.org.readthedocs.build/en/2162/\r\n\r\n", "created_at": "2023-08-29T00:05:07Z", "updated_at": "2023-08-29T03:24:23Z", "closed_at": "2023-08-29T03:24:23Z", "merged_at": "2023-08-29T03:24:23Z", "merge_commit_sha": "92b8bf38c02465f624ce3f48dcabb0b100c4645d", "assignee": null, "milestone": null, "draft": 0, "head": "73489cac8ef8e934e601302fa6594e27b75a382d", "base": "2e2825869fc2655b5fcadc743f6f9dec7a49bc65", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2162", "merged_by": null, "auto_merge": null} {"id": 1031503844, "node_id": "PR_kwDOBm6k_c49e3_k", "number": 1789, "state": "closed", "locked": 0, "title": "Add new entrypoint option to `--load-extension`", "user": {"value": 15178711, "label": "asg017"}, "body": "Closes #1784 \r\n\r\nThe `--load-extension` flag can now accept an optional \"entrypoint\" value, to specify which entrypoint SQLite should load from the given extension. \r\n\r\n```bash\r\n# would load default entrypoint like before\r\ndatasette data.db --load-extension ext\r\n\r\n# loads the extensions with the \"sqlite3_foo_init\" entrpoint\r\ndatasette data.db --load-extension ext:sqlite3_foo_init\r\n\r\n# loads the extensions with the \"sqlite3_bar_init\" entrpoint\r\ndatasette data.db --load-extension ext:sqlite3_bar_init\r\n```\r\n\r\nFor testing, I added a small SQLite extension in C at `tests/ext.c`. If compiled, then pytest will run the unit tests in `test_load_extensions.py`to verify that Datasette loads in extensions correctly (and loads the correct entrypoints). Compiling the extension requires a C compiler, I compiled it on my Mac with:\r\n\r\n```\r\ngcc ext.c -I path/to/sqlite -fPIC -shared -o ext.dylib\r\n```\r\n\r\nWhere `path/to/sqlite` is a directory that contains the SQLite amalgamation header files.\r\n\r\nRe documentation: I added a bit to the help text for `--load-extension` (which I believe should auto-add to documentation?), and the existing extension documentation is spatialite specific. Let me know if a new extensions documentation page would be helpful!", "created_at": "2022-08-19T19:27:47Z", "updated_at": "2022-08-23T18:42:52Z", "closed_at": "2022-08-23T18:34:30Z", "merged_at": "2022-08-23T18:34:30Z", "merge_commit_sha": "1d64c9a8dac45b9a3452acf8e76dfadea2b0bc49", "assignee": null, "milestone": null, "draft": 0, "head": "5a2a05f2cea7b55b1c3bb1df043c0a454eca6563", "base": "663ac431fe7202c85967568d82b2034f92b9aa43", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1789", "merged_by": null, "auto_merge": null} {"id": 187770345, "node_id": "MDExOlB1bGxSZXF1ZXN0MTg3NzcwMzQ1", "number": 258, "state": "closed", "locked": 0, "title": "Add new metadata key persistent_urls which removes the hash from all database urls", "user": {"value": 247131, "label": "philroche"}, "body": "Add new metadata key \"persistent_urls\" which removes the hash from all database urls when set to \"true\"\r\n\r\nThis PR is just to gauge if this, or something like it, is something you would consider merging?\r\n\r\nI understand the reason why the substring of the hash is included in the url but\r\nthere are some use cases where the urls should persist across deployments. For bookmarks\r\nfor example or for scripts that use the JSON API.\r\n\r\nThis is the initial commit for this feature. Tests and documentation updates to follow.", "created_at": "2018-05-14T09:39:18Z", "updated_at": "2018-05-21T07:38:15Z", "closed_at": "2018-05-21T07:38:15Z", "merged_at": null, "merge_commit_sha": "457fcdfc82a0260db543d49006d49f8486f233b5", "assignee": null, "milestone": null, "draft": 0, "head": "0d77a896ccb16b34c86fdeef7738f2d056e27e02", "base": "2b79f2bdeb1efa86e0756e741292d625f91cb93d", "author_association": "NONE", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/258", "merged_by": null, "auto_merge": null} {"id": 821992886, "node_id": "PR_kwDOCGYnMM4w_p22", "number": 385, "state": "closed", "locked": 0, "title": "Add new spatialite helper methods", "user": {"value": 25778, "label": "eyeseast"}, "body": "Refs #79 \r\n\r\nThis PR adds three new Spatialite-related methods to Database and Table:\r\n\r\n- `Database.init_spatialite` loads the Spatialite extension and initializes it\r\n- `Table.add_geometry_column` adds a geometry column\r\n- `Table.create_spatial_index` creates a spatial index\r\n\r\nHas tests and documentation. Feedback very welcome.", "created_at": "2022-01-14T03:57:30Z", "updated_at": "2022-02-05T00:04:26Z", "closed_at": "2022-02-04T05:55:10Z", "merged_at": "2022-02-04T05:55:10Z", "merge_commit_sha": "ee11274fcb1c00f32c95f2ef2924d5349538eb4d", "assignee": null, "milestone": null, "draft": 0, "head": "af86b17acf2fa50048e38b96497636d49db89766", "base": "74586d3cb26fa3cc3412721985ecdc1864c2a31d", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/385", "merged_by": null, "auto_merge": null} {"id": 1047561919, "node_id": "PR_kwDODFdgUs4-cIa_", "number": 76, "state": "open", "locked": 0, "title": "Add organization support to repos command", "user": {"value": 2757699, "label": "OverkillGuy"}, "body": "New --organization flag to signify all given \"usernames\" are private\r\norgs. Adapts API URL to the organization path instead.\r\n\r\nNot the best implementation, but a first draft to talk around\r\n\r\nFixes #75 (badly, no tests, overly vague, untested)", "created_at": "2022-09-06T13:21:42Z", "updated_at": "2022-09-06T13:59:08Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "1514acfa87f57261547bc3d7fc4f161e34285d76", "assignee": null, "milestone": null, "draft": 0, "head": "bb959b46e8a7647755c14dee180fdd5209451954", "base": "ace13ec3d98090d99bd71871c286a4a612c96a50", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 207052882, "label": "github-to-sqlite"}, "url": "https://github.com/dogsheep/github-to-sqlite/pull/76", "merged_by": null, "auto_merge": null} {"id": 338647378, "node_id": "MDExOlB1bGxSZXF1ZXN0MzM4NjQ3Mzc4", "number": 1, "state": "closed", "locked": 0, "title": "Add parkrun-to-sqlite", "user": {"value": 1101318, "label": "mrw34"}, "body": "", "created_at": "2019-11-08T12:05:32Z", "updated_at": "2020-10-12T00:35:16Z", "closed_at": "2020-10-12T00:35:16Z", "merged_at": "2020-10-12T00:35:16Z", "merge_commit_sha": "58ca0c785fbf34250042379dd0269bf2d0c5ea7e", "assignee": null, "milestone": null, "draft": 0, "head": "ccb86548e0ae6f02a83f1feb0974476ad0f2f2d8", "base": "2972bb001ab5f675eced62f7ba5adef2d3eba2ad", "author_association": "CONTRIBUTOR", "repo": {"value": 214746582, "label": "dogsheep.github.io"}, "url": "https://github.com/dogsheep/dogsheep.github.io/pull/1", "merged_by": null, "auto_merge": null} {"id": 1272169404, "node_id": "PR_kwDOCGYnMM5L08O8", "number": 531, "state": "closed", "locked": 0, "title": "Add paths for homebrew on Apple silicon", "user": {"value": 25778, "label": "eyeseast"}, "body": "This also passes in the extension path when specified in GIS methods. Wherever we know an extension path, we use `db.init_spatialite(find_spatialite() or load_extension)`.\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--531.org.readthedocs.build/en/531/\n\r\n", "created_at": "2023-03-11T22:27:52Z", "updated_at": "2023-04-09T01:49:44Z", "closed_at": "2023-04-09T01:49:43Z", "merged_at": null, "merge_commit_sha": "24f3eb082b98b8d676bab2eab4f763cd9b50fe96", "assignee": null, "milestone": null, "draft": 0, "head": "afdf6187716b19fce8692f6887a1d45c85477fee", "base": "c0251cc9271260de73b4227859a51fab9b4cb745", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/531", "merged_by": null, "auto_merge": null} {"id": 1306498393, "node_id": "PR_kwDOCGYnMM5N35VZ", "number": 536, "state": "closed", "locked": 0, "title": "Add paths for homebrew on Apple silicon", "user": {"value": 25778, "label": "eyeseast"}, "body": "Does what it says and nothing else. This is the same set of paths as Datasette uses.\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--536.org.readthedocs.build/en/536/\n\r\n", "created_at": "2023-04-08T13:34:21Z", "updated_at": "2023-04-13T01:44:43Z", "closed_at": "2023-04-13T01:44:43Z", "merged_at": "2023-04-13T01:44:43Z", "merge_commit_sha": "8f9a729e8aff972cb18de25b40f4113e26bbc758", "assignee": null, "milestone": null, "draft": 0, "head": "cea05dc5eab8d10fbd8943e615d2ab0dceff863c", "base": "c0251cc9271260de73b4227859a51fab9b4cb745", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/536", "merged_by": null, "auto_merge": null} {"id": 1290512937, "node_id": "PR_kwDODtX3eM5M66op", "number": 6, "state": "open", "locked": 0, "title": "Add permalink virtual field to items table", "user": {"value": 1231935, "label": "xavdid"}, "body": "I added a virtual column (no storage overhead) to the output that easily links back to the source. It works nicely out of the box with datasette:\r\n\r\n![](https://cdn.zappy.app/faf43661d539ee0fee02c0421de22d65.png)\r\n\r\nI got bit a bit by https://github.com/simonw/sqlite-utils/issues/411, so I went with a manual `table_xinfo` and creating the table via execute. Happy to adjust if that issue moves, but this seems like it works.\r\n\r\nI also added my best-guess instructions for local development on this package. I'm shooting in the dark, so feel free to replace with how you work on it locally.", "created_at": "2023-03-26T22:22:38Z", "updated_at": "2023-03-29T18:38:52Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "99bda9434e0adaa8459bc0abbe6262785cd4086c", "assignee": null, "milestone": null, "draft": 0, "head": "b04d6c76c26820f2e0b04da58dd82789e83cbb42", "base": "c5585c103d124b23ba1e163f8857d4ba49fe452a", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 248903544, "label": "hacker-news-to-sqlite"}, "url": "https://github.com/dogsheep/hacker-news-to-sqlite/pull/6", "merged_by": null, "auto_merge": null} {"id": 469651732, "node_id": "MDExOlB1bGxSZXF1ZXN0NDY5NjUxNzMy", "number": 48, "state": "closed", "locked": 0, "title": "Add pull requests", "user": {"value": 755825, "label": "adamjonas"}, "body": "ref #46 \r\n\r\nIssues don't have merge information on them, which means that PRs need to be pulled separately.\r\n\r\nDid my best to mimic the API of issues.", "created_at": "2020-08-18T17:58:44Z", "updated_at": "2020-11-29T23:51:09Z", "closed_at": "2020-11-29T23:51:09Z", "merged_at": "2020-11-29T23:51:09Z", "merge_commit_sha": "b37f55549461cfe0731b57623f315860b3db49d0", "assignee": null, "milestone": null, "draft": 0, "head": "3a0d5c498f9faae4e40aab204cd01b965a4f61f3", "base": "16d271253f4ea71b261d2d228b926c7bc1a7e660", "author_association": "CONTRIBUTOR", "repo": {"value": 207052882, "label": "github-to-sqlite"}, "url": "https://github.com/dogsheep/github-to-sqlite/pull/48", "merged_by": null, "auto_merge": null} {"id": 707490789, "node_id": "MDExOlB1bGxSZXF1ZXN0NzA3NDkwNzg5", "number": 312, "state": "closed", "locked": 0, "title": "Add reference page to documentation using Sphinx autodoc", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #311.", "created_at": "2021-08-10T16:59:17Z", "updated_at": "2021-08-10T23:09:32Z", "closed_at": "2021-08-10T23:09:28Z", "merged_at": "2021-08-10T23:09:28Z", "merge_commit_sha": "6155da72c8939b5d9bdacb7853e5e8d1767ce1d5", "assignee": null, "milestone": null, "draft": 0, "head": "43bc06481783c3cfcee70c0cb541a686e8894adb", "base": "ee469e3122d6f5973ec2584c1580d930daca2e7c", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/312", "merged_by": null, "auto_merge": null} {"id": 274468836, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc0NDY4ODM2", "number": 441, "state": "closed", "locked": 0, "title": "Add register_output_renderer hook", "user": {"value": 45057, "label": "russss"}, "body": "This changeset refactors out the JSON renderer and then adds a hook and\r\ndispatcher system to allow custom output renderers to be registered.\r\n\r\nThe CSV output renderer is untouched because supporting streaming\r\nrenderers through this system would be significantly more complex, and\r\nprobably not worthwhile.\r\n\r\nWe can't simply allow hooks to be called at request time because we need\r\na list of supported file extensions when the request is being routed in\r\norder to resolve ambiguous database/table names. So, renderers need to\r\nbe registered at startup.\r\n\r\nI've tried to make this API independent of Sanic's request/response\r\nobjects so that this can remain stable during the switch to ASGI. I'm\r\nusing dictionaries to keep it simple and to make adding additional\r\noptions in the future easy.\r\n\r\nFixes #440", "created_at": "2019-04-29T18:03:21Z", "updated_at": "2019-05-01T23:01:57Z", "closed_at": "2019-05-01T23:01:57Z", "merged_at": "2019-05-01T23:01:57Z", "merge_commit_sha": "cf406c075433882b656e340870adf7757976fa4c", "assignee": null, "milestone": null, "draft": 0, "head": "c9f941f06eb0268841de49407725917c74a8a2dc", "base": "11b352b4d52fd02a422776edebb14f12e4994d3b", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/441", "merged_by": null, "auto_merge": null} {"id": 727265025, "node_id": "MDExOlB1bGxSZXF1ZXN0NzI3MjY1MDI1", "number": 1455, "state": "closed", "locked": 0, "title": "Add scientists to target groups", "user": {"value": 198537, "label": "rgieseke"}, "body": "Not sure if you want them mentioned explicitly (it's already a long list), but following up on https://twitter.com/simonw/status/1434176989565382656", "created_at": "2021-09-04T16:28:58Z", "updated_at": "2021-09-04T16:32:21Z", "closed_at": "2021-09-04T16:31:38Z", "merged_at": "2021-09-04T16:31:38Z", "merge_commit_sha": "772f9a07ce363869e0aaa7600617454dc00e6966", "assignee": null, "milestone": null, "draft": 0, "head": "afba5f9201e395bce43dcac13da4a2041872316e", "base": "67cbf0ae7243431bf13702e6e3ba466b619c4d6f", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1455", "merged_by": null, "auto_merge": null} {"id": 1586779743, "node_id": "PR_kwDOCGYnMM5elFZf", "number": 600, "state": "closed", "locked": 0, "title": "Add spatialite arm64 linux path", "user": {"value": 37802088, "label": "MikeCoats"}, "body": "According to both [Debian](https://packages.debian.org/bookworm/arm64/libsqlite3-mod-spatialite/filelist) and [Ubuntu](https://packages.ubuntu.com/mantic/arm64/libsqlite3-mod-spatialite/filelist), the correct \u201ctarget triple\u201d for arm64 is `aarch64-linux-gnu`, so we should be looking in `/usr/lib/aarch64-linux-gnu` for `mod_spatialite.so`.\r\n\r\nI can confirm that on both of my Debian arm64 SBCs, `libsqlite3-mod-spatialite` installs to that path.\r\n\r\n```\r\n$ ls -l /usr/lib/*/*spatial*\r\nlrwxrwxrwx 1 root root 23 Dec 1 2022 /usr/lib/aarch64-linux-gnu/mod_spatialite.so -> mod_spatialite.so.7.1.0\r\nlrwxrwxrwx 1 root root 23 Dec 1 2022 /usr/lib/aarch64-linux-gnu/mod_spatialite.so.7 -> mod_spatialite.so.7.1.0\r\n-rw-r--r-- 1 root root 7348584 Dec 1 2022 /usr/lib/aarch64-linux-gnu/mod_spatialite.so.7.1.0\r\n```\r\n\r\nThis is a set of before and after snippets of pytest\u2019s output for this PR.\r\n\r\n### Before\r\n\r\n```\r\n$ pytest\r\ntests/test_get.py ...... [ 73%]\r\ntests/test_gis.py ssssssssssss [ 75%]\r\ntests/test_hypothesis.py .... [ 75%]\r\n```\r\n\r\n### After\r\n\r\n```\r\n$ pytest\r\ntests/test_get.py ...... [ 73%]\r\ntests/test_gis.py ............ [ 75%]\r\ntests/test_hypothesis.py .... [ 75%]\r\n```\r\n\r\n\r\nIssue: #599\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--600.org.readthedocs.build/en/600/\n\r\n", "created_at": "2023-11-03T22:23:26Z", "updated_at": "2023-11-04T00:34:33Z", "closed_at": "2023-11-04T00:31:49Z", "merged_at": "2023-11-04T00:31:49Z", "merge_commit_sha": "b92ea4793ce4dcb73cf762aae634ab72f65ec50f", "assignee": null, "milestone": null, "draft": 0, "head": "b1a60766a4150268557c4445297087a3f076be01", "base": "622c3a5a7dd53a09c029e2af40c2643fe7579340", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/600", "merged_by": null, "auto_merge": null} {"id": 153201945, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUzMjAxOTQ1", "number": 114, "state": "closed", "locked": 0, "title": "Add spatialite, switch to debian and local build", "user": {"value": 54999, "label": "ingenieroariel"}, "body": "Improves the Dockerfile to support spatial datasets, work with the local datasette code (Friendly with git tags and Dockerhub) and moves to slim debian, a small image easy to extend via apt packages for sqlite.", "created_at": "2017-11-17T02:37:09Z", "updated_at": "2017-11-17T03:50:52Z", "closed_at": "2017-11-17T03:50:52Z", "merged_at": "2017-11-17T03:50:52Z", "merge_commit_sha": "8b4c600d98b85655b3a1454ebf64f858b5fe54c8", "assignee": null, "milestone": null, "draft": 0, "head": "6c6b63d890529eeefcefb7ab126ea3bd7b2315c1", "base": "b7c4165346ee8b6a6fbd72d6ba2275a24a8a8ae3", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/114", "merged_by": null, "auto_merge": null} {"id": 1179812287, "node_id": "PR_kwDODEm0Qs5GUoG_", "number": 67, "state": "open", "locked": 0, "title": "Add support for app-only bearer tokens", "user": {"value": 26161409, "label": "sometimes-i-send-pull-requests"}, "body": "Previously, twitter-to-sqlite only supported OAuth1 authentication, and the token must be on behalf of a user. However, Twitter also supports application-only bearer tokens, documented here:\r\nhttps://developer.twitter.com/en/docs/authentication/oauth-2-0/bearer-tokens This PR adds support to twitter-to-sqlite for using application-only bearer tokens. To use, the auth.json file just needs to contain a \"bearer_token\" key instead of \"api_key\", \"api_secret_key\", etc.", "created_at": "2022-12-28T23:31:20Z", "updated_at": "2022-12-28T23:31:20Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "7825cd68047088cbdc9666586f1af9b7e1fa88c2", "assignee": null, "milestone": null, "draft": 0, "head": "52050d06eeb85f3183b086944b7b75ae758096cd", "base": "f09d611782a8372cfb002792dfa727325afb4db6", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "url": "https://github.com/dogsheep/twitter-to-sqlite/pull/67", "merged_by": null, "auto_merge": null} {"id": 747742034, "node_id": "PR_kwDODFdgUs4skaNS", "number": 68, "state": "open", "locked": 0, "title": "Add support for retrieving teams / members", "user": {"value": 68329, "label": "philwills"}, "body": "Adds a method for retrieving all the teams within an organisation and all the members in those teams. The latter is stored as a join table `team_members` beteween `teams` and `users`.", "created_at": "2021-10-01T15:55:02Z", "updated_at": "2021-10-01T15:59:53Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "f46e276c356c893370d5893296f4b69f08baf02c", "assignee": null, "milestone": null, "draft": 0, "head": "cc838e87b1eb19b299f277a07802923104f35ce2", "base": "ed3752022e45b890af63996efec804725e95d0d4", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 207052882, "label": "github-to-sqlite"}, "url": "https://github.com/dogsheep/github-to-sqlite/pull/68", "merged_by": null, "auto_merge": null} {"id": 295748268, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjk1NzQ4MjY4", "number": 556, "state": "closed", "locked": 0, "title": "Add support for running datasette as a module", "user": {"value": 3243482, "label": "abdusco"}, "body": "This PR allows running datasette using `python -m datasette` command in addition to just running the executable.\r\n\r\nThis function is quite useful when debugging a plugin in a project because IDEs like PyCharm can easily start a debug session when datasette is run as a module in contrast to trying to attach a debugger to a running process.\r\n\r\n![image](https://user-images.githubusercontent.com/3243482/60890448-fc4ede80-a263-11e9-8b42-d2a3db8d1a59.png)\r\n", "created_at": "2019-07-09T13:13:30Z", "updated_at": "2019-07-11T16:07:45Z", "closed_at": "2019-07-11T16:07:44Z", "merged_at": "2019-07-11T16:07:44Z", "merge_commit_sha": "9ca860e54fe480d0a365c0c1d8d085926d12be1e", "assignee": null, "milestone": null, "draft": 0, "head": "056a7eac9480cb814d9c453b983e6b2b831e0ca1", "base": "81fa8b6cdc5457b42a224779e5291952314e8d20", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/556", "merged_by": null, "auto_merge": null} {"id": 509590205, "node_id": "MDExOlB1bGxSZXF1ZXN0NTA5NTkwMjA1", "number": 1049, "state": "closed", "locked": 0, "title": "Add template block prior to extra URL loaders", "user": {"value": 82988, "label": "psychemedia"}, "body": "To handle packages that require Javascript state setting prior to loading a package (eg [`thebelab`](https://thebelab.readthedocs.io/en/latest/examples/minimal_example.html), provide a template block before the URLs are loaded.", "created_at": "2020-10-25T13:08:55Z", "updated_at": "2020-10-29T09:20:52Z", "closed_at": "2020-10-29T09:20:34Z", "merged_at": null, "merge_commit_sha": "99f994b14e2dbe22fda18b67dd5c824d359443fb", "assignee": null, "milestone": null, "draft": 0, "head": "50a743ad35684f09d3c3880f6af2019e59271237", "base": "42f4851e3e7885f1092f104d6c883cea40b12f02", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1049", "merged_by": null, "auto_merge": null} {"id": 602261092, "node_id": "MDExOlB1bGxSZXF1ZXN0NjAyMjYxMDky", "number": 6, "state": "closed", "locked": 0, "title": "Add testres-db tool", "user": {"value": 1151557, "label": "ligurio"}, "body": "", "created_at": "2021-03-28T15:43:23Z", "updated_at": "2022-02-16T05:12:05Z", "closed_at": "2022-02-16T05:12:05Z", "merged_at": null, "merge_commit_sha": "eceb016506b5db29b9c21bc7fcf5e6e77259c7b4", "assignee": null, "milestone": null, "draft": 0, "head": "91cfa6f7dcab032e2d21e80657c81e69119e2018", "base": "92c6bb77629feeed661c7b8d9183a11367de39e0", "author_association": "NONE", "repo": {"value": 214746582, "label": "dogsheep.github.io"}, "url": "https://github.com/dogsheep/dogsheep.github.io/pull/6", "merged_by": null, "auto_merge": null} {"id": 917185800, "node_id": "PR_kwDOBm6k_c42qyUI", "number": 1717, "state": "closed", "locked": 0, "title": "Add timeout option to Cloudrun build", "user": {"value": 127565, "label": "wragge"}, "body": "I've found that the Cloudrun build phase often hits a timeout limit with large databases. I believe the default timeout is 10 minutes. This pull request just adds a `--timeout` option to the cloudrun `publish` command and passes the value on to the build step.", "created_at": "2022-04-23T11:51:21Z", "updated_at": "2022-04-24T14:03:08Z", "closed_at": "2022-04-24T14:03:08Z", "merged_at": "2022-04-24T14:03:08Z", "merge_commit_sha": "3001e1e394b6cb605c2cd81eed671a7da419c1b3", "assignee": null, "milestone": null, "draft": 0, "head": "9b9a314a84453cec5ad6c886351ef3df9d47a5a4", "base": "d57c347f35bcd8cff15f913da851b4b8eb030867", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1717", "merged_by": null, "auto_merge": null} {"id": 357974326, "node_id": "MDExOlB1bGxSZXF1ZXN0MzU3OTc0MzI2", "number": 3, "state": "closed", "locked": 0, "title": "Add todoist-to-sqlite", "user": {"value": 706257, "label": "bcongdon"}, "body": "Really enjoying getting into the dogsheep/datasette ecosystem. I made a downloader for Todoist, and I think/hope others might find this useful", "created_at": "2019-12-30T04:02:59Z", "updated_at": "2020-10-12T00:35:58Z", "closed_at": "2020-10-12T00:35:57Z", "merged_at": "2020-10-12T00:35:57Z", "merge_commit_sha": "85af27dbff7e08a92656639fbf0cfa15c7d30b5c", "assignee": null, "milestone": null, "draft": 0, "head": "49bc87a43555d10696044e8e40d700d93611a190", "base": "58ca0c785fbf34250042379dd0269bf2d0c5ea7e", "author_association": "CONTRIBUTOR", "repo": {"value": 214746582, "label": "dogsheep.github.io"}, "url": "https://github.com/dogsheep/dogsheep.github.io/pull/3", "merged_by": null, "auto_merge": null} {"id": 313105634, "node_id": "MDExOlB1bGxSZXF1ZXN0MzEzMTA1NjM0", "number": 57, "state": "closed", "locked": 0, "title": "Add triggers while enabling FTS", "user": {"value": 49260, "label": "amjith"}, "body": "This adds the option for a user to set up triggers in the database to keep their FTS table in sync with the parent table. \r\n\r\nRef: https://sqlite.org/fts5.html#external_content_and_contentless_tables\r\n\r\nI would prefer to make the creation of triggers the default behavior, but that will break existing usage where people have been calling `populate_fts` after inserting new rows.\r\n\r\nI am happy to make changes to the PR as you see fit. ", "created_at": "2019-09-02T04:23:40Z", "updated_at": "2019-09-03T01:03:59Z", "closed_at": "2019-09-02T23:42:29Z", "merged_at": "2019-09-02T23:42:29Z", "merge_commit_sha": "405e092d5916e70df10f82d15e9c052aa9ee8d80", "assignee": null, "milestone": null, "draft": 0, "head": "e01943271b17115fbe0e81d523126d2fb1c7c24b", "base": "cb70f7d10996b844154bf3da88779dd1f65590bc", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/57", "merged_by": null, "auto_merge": null} {"id": 395258687, "node_id": "MDExOlB1bGxSZXF1ZXN0Mzk1MjU4Njg3", "number": 96, "state": "closed", "locked": 0, "title": "Add type conversion for Panda's Timestamp", "user": {"value": 32605365, "label": "b0b5h4rp13"}, "body": "Add type conversion for Panda's Timestamp, if Panda library is present in system\r\n(thanks for this project, I was about to do the same thing from scratch)", "created_at": "2020-03-29T14:13:09Z", "updated_at": "2020-03-31T04:40:49Z", "closed_at": "2020-03-31T04:40:48Z", "merged_at": "2020-03-31T04:40:48Z", "merge_commit_sha": "8ea626e5fcdc4c9e52f615c6347e68173805f8b4", "assignee": null, "milestone": null, "draft": 0, "head": "16ebbd2d494caabd0eeb502f8a944614b464bb12", "base": "22250a9c735077d6f365b73bf824e6c67b122c83", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/96", "merged_by": null, "auto_merge": null} {"id": 189707374, "node_id": "MDExOlB1bGxSZXF1ZXN0MTg5NzA3Mzc0", "number": 279, "state": "closed", "locked": 0, "title": "Add version number support with Versioneer", "user": {"value": 198537, "label": "rgieseke"}, "body": "I think that's all for getting Versioneer support, I've been happily using it in a couple of projects ... \r\n\r\n```\r\nIn [2]: datasette.__version__\r\nOut[2]: '0.22+3.g6e12445'\r\n```\r\nRepo:\r\nhttps://github.com/warner/python-versioneer\r\n\r\nVersioneer Licence:\r\nPublic Domain (CC0-1.0)\r\n\r\nCloses #273\r\n", "created_at": "2018-05-22T15:39:45Z", "updated_at": "2018-05-22T19:35:23Z", "closed_at": "2018-05-22T19:35:22Z", "merged_at": "2018-05-22T19:35:22Z", "merge_commit_sha": "49f317752cfe89c5641165a490eef49e025752a7", "assignee": null, "milestone": null, "draft": 0, "head": "d0d19453e8623cc98a2baa2cadaaff4cd2fee973", "base": "58b5a37dbbf13868a46bcbb284509434e66eca25", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/279", "merged_by": null, "auto_merge": null} {"id": 1037685744, "node_id": "PR_kwDOBm6k_c492dPw", "number": 1793, "state": "closed", "locked": 0, "title": "Added a useful resource", "user": {"value": 111973926, "label": "MobiWancode"}, "body": "Have added a useful resource about the types of databases in SQL i.e SQLite, PostgreSQL, MySQL &, etc from the scaler topics.\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--1793.org.readthedocs.build/en/1793/\n\r\n", "created_at": "2022-08-26T08:41:26Z", "updated_at": "2022-09-06T00:41:25Z", "closed_at": "2022-09-06T00:41:24Z", "merged_at": null, "merge_commit_sha": "40c948ac58afa155bbceaff70c43e85e58434188", "assignee": null, "milestone": null, "draft": 0, "head": "32a9224b7e107016e5ba0fc90ff86cfafad93b2f", "base": "ba35105eee2d3ba620e4f230028a02b2e2571df2", "author_association": "NONE", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1793", "merged_by": null, "auto_merge": null} {"id": 293992382, "node_id": "MDExOlB1bGxSZXF1ZXN0MjkzOTkyMzgy", "number": 535, "state": "closed", "locked": 0, "title": "Added asgi_wrapper plugin hook, closes #520", "user": {"value": 9599, "label": "simonw"}, "body": "", "created_at": "2019-07-03T03:58:00Z", "updated_at": "2019-07-03T04:06:26Z", "closed_at": "2019-07-03T04:06:26Z", "merged_at": "2019-07-03T04:06:26Z", "merge_commit_sha": "4d2fdafe39159c9a8aa83f7e9bfe768bbbbb56a3", "assignee": null, "milestone": null, "draft": 0, "head": "93bfa26bfd25a3cc911d637596e364d3474325bd", "base": "b9ede4c1898616512b5d204f9c941deff473cbe4", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/535", "merged_by": null, "auto_merge": null} {"id": 755729137, "node_id": "PR_kwDOBm6k_c4tC4Lx", "number": 1487, "state": "closed", "locked": 0, "title": "Added instructions for installing plugins via pipx, #1486", "user": {"value": 41546558, "label": "RhetTbull"}, "body": "Adds missing instructions for installing plugins via pipx", "created_at": "2021-10-12T00:48:30Z", "updated_at": "2021-10-13T21:09:11Z", "closed_at": "2021-10-13T21:09:10Z", "merged_at": "2021-10-13T21:09:10Z", "merge_commit_sha": "68087440b3448633a62807c1623559619584f2ee", "assignee": null, "milestone": null, "draft": 0, "head": "4909d5814494dcae77a851905bfc392c70f60d60", "base": "0d5cc20aeffa3537cfc9296d01ec24b9c6e23dcf", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1487", "merged_by": null, "auto_merge": null} {"id": 322529381, "node_id": "MDExOlB1bGxSZXF1ZXN0MzIyNTI5Mzgx", "number": 578, "state": "closed", "locked": 0, "title": "Added support for multi arch builds", "user": {"value": 887095, "label": "heussd"}, "body": "Minor changes in Dockerfile and new Makefile to support Docker multi architecture builds. `make`will build one image per architecture and push them as one Docker manifest to Docker Hub. Feel free to change `IMAGE_NAME ` to `datasetteproject/datasette` to update your official Docker Hub image(s).", "created_at": "2019-09-29T18:43:03Z", "updated_at": "2019-11-13T19:13:15Z", "closed_at": "2019-11-13T19:13:15Z", "merged_at": null, "merge_commit_sha": "ae1aa0929b9e62a413ec9b4a40588e6aafe50573", "assignee": null, "milestone": null, "draft": 0, "head": "ce6372bc6210ae52ac1951647b8fbaee40d64fc1", "base": "0fc8afde0eb5ef677f4ac31601540d6168c8208d", "author_association": "NONE", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/578", "merged_by": null, "auto_merge": null} {"id": 943518450, "node_id": "PR_kwDODEm0Qs44PPLy", "number": 66, "state": "open", "locked": 0, "title": "Ageinfo workaround", "user": {"value": 11887, "label": "ashanan"}, "body": "I'm not sure if this is due to a new format or just because my ageinfo file is blank, but trying to import an archive would crash when it got to that file. This PR adds a guard clause in the `ageinfo` transformer and sets a default value that doesn't throw an exception. Seems likely to be the same issue mentioned by danp in https://github.com/dogsheep/twitter-to-sqlite/issues/54, my ageinfo file looks the same. Added that same ageinfo file to the test archive as well to help confirm my workaround didn't break anything.\r\n\r\nLet me know if you want any changes!", "created_at": "2022-05-21T21:08:29Z", "updated_at": "2022-05-21T21:09:16Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "c22e8eba634b70e914de9f72e452b1ebea55c6ef", "assignee": null, "milestone": null, "draft": 0, "head": "75ae7c94120d14083217bc76ebd603b396937104", "base": "f09d611782a8372cfb002792dfa727325afb4db6", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "url": "https://github.com/dogsheep/twitter-to-sqlite/pull/66", "merged_by": null, "auto_merge": null} {"id": 201451332, "node_id": "MDExOlB1bGxSZXF1ZXN0MjAxNDUxMzMy", "number": 345, "state": "closed", "locked": 0, "title": "Allow app names for `datasette publish heroku`", "user": {"value": 45057, "label": "russss"}, "body": "Lets you supply the `-n` parameter for Heroku deploys, which also lets you update existing Heroku deployments.", "created_at": "2018-07-14T13:12:34Z", "updated_at": "2018-07-14T14:09:54Z", "closed_at": "2018-07-14T14:04:44Z", "merged_at": "2018-07-14T14:04:44Z", "merge_commit_sha": "58fec99ab0a31bcf25968f2aa05d37de8139b83c", "assignee": null, "milestone": null, "draft": 0, "head": "864cf8c1b01a581d6dc9711efe7cb4f2a6ac87e8", "base": "31a5d8fa77be68d4f837f0a80a611675dce49f4b", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/345", "merged_by": null, "auto_merge": null} {"id": 496298180, "node_id": "MDExOlB1bGxSZXF1ZXN0NDk2Mjk4MTgw", "number": 986, "state": "closed", "locked": 0, "title": "Allow facet by primary keys, fixes #985", "user": {"value": 39452697, "label": "MrNaif2018"}, "body": "Hello! This PR makes it possible to facet by primary keys.\r\nDid I get it right that just removing the condition on UI side is enough? From testing it works fine with primary keys, just as with normal keys.\r\nIf so, should I also remove unused `data-is-pk`?", "created_at": "2020-10-01T14:18:55Z", "updated_at": "2020-10-01T16:51:45Z", "closed_at": "2020-10-01T16:51:45Z", "merged_at": null, "merge_commit_sha": "58906c597f1217381f5d746726bcb8bdfa8f52f8", "assignee": null, "milestone": null, "draft": 0, "head": "76f7094bd33f037a1c689a173f0dbbb988e6dcdd", "base": "141544613f9e76ddb74eee38d6f8ee1e0e70f833", "author_association": "NONE", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/986", "merged_by": null, "auto_merge": null} {"id": 510235909, "node_id": "MDExOlB1bGxSZXF1ZXN0NTEwMjM1OTA5", "number": 189, "state": "closed", "locked": 0, "title": "Allow iterables other than Lists in m2m records", "user": {"value": 35681, "label": "adamwolf"}, "body": "I was playing around with sqlite-utils, creating a Roam Research dogsheep-style importer for Datasette, and ran into a slight snag.\r\n\r\nI wanted to use a generator to add an order column in an importer. It looked something like:\r\n\r\n```\r\ndef order_generator(iterable, attr=None):\r\n if attr is None:\r\n attr = \"order\"\r\n order: int = 0\r\n\r\n for i in iterable:\r\n i[attr] = order\r\n order += 1\r\n yield i\r\n```\r\n\r\nWhen I used this with `insert_all` and other things, it worked fine--but it didn't work as the `records` argument to `m2m`. I dug into it, and sqlite-utils is explicitly checking if the records argument is a list or a tuple. I flipped the check upside down, and now it checks if the argument is a mapping. If it's a mapping, it wraps it in a list, otherwise it leaves it alone.\r\n\r\n(I get that it might not really make sense to put the order column on the second table. I changed my import schema a bit, and no longer have a real example, but maybe this change still makes sense.)\r\n\r\nThe automated tests still pass, but I did not add any new ones.\r\n\r\nLet me know what you think! I'm really loving Datasette and its ecosystem; thanks for everything!", "created_at": "2020-10-26T18:47:44Z", "updated_at": "2020-10-27T16:28:37Z", "closed_at": "2020-10-27T16:24:21Z", "merged_at": "2020-10-27T16:24:21Z", "merge_commit_sha": "f045d8559a6d2cb922a2de30fbcc896a4486b82f", "assignee": null, "milestone": null, "draft": 0, "head": "93230b2acb61635b6d5070ad9c65e7221c63b75a", "base": "e4f1c7b936981de29823730c5dbef4f4ba7a4286", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/189", "merged_by": null, "auto_merge": null} {"id": 764281468, "node_id": "PR_kwDOBm6k_c4tjgJ8", "number": 1495, "state": "open", "locked": 0, "title": "Allow routes to have extra options", "user": {"value": 536941, "label": "fgregg"}, "body": "Right now, datasette routes can only be a 2-tuple of `(regex, view_fn)`. \r\n\r\nIf it was possible for datasette to handle extra options, like [standard Django does](https://docs.djangoproject.com/en/3.2/topics/http/urls/#passing-extra-options-to-view-functions), it would add flexibility for plugin authors.\r\n\r\nFor example, if extra options were enabled, then it would be easy to make a single table the home page (#1284). This plugin would accomplish it.\r\n\r\n```python\r\nfrom datasette import hookimpl\r\nfrom datasette.views.table import TableView\r\n\r\n@hookimpl\r\ndef register_routes(datasette):\r\n return [\r\n (r\"^/$\", TableView.as_view(datasette), {'db_name': 'DB_NAME',\r\n 'table': 'TABLE_NAME'})\r\n ]\r\n```\r\n", "created_at": "2021-10-22T15:00:45Z", "updated_at": "2021-11-19T15:36:27Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "44969c5654748fb26ad05ab37245678f245f32e5", "assignee": null, "milestone": null, "draft": 0, "head": "fe7fa14b39846b919dfed44514a7d18d67e01dfd", "base": "ff9ccfb0310501a3b4b4ca24d73246a8eb3e7914", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1495", "merged_by": null, "auto_merge": null} {"id": 1105985162, "node_id": "PR_kwDOCGYnMM5B6_6K", "number": 508, "state": "closed", "locked": 0, "title": "Allow surrogates in parameters", "user": {"value": 7908073, "label": "chapmanjacobd"}, "body": "closes #507\r\n\r\nhttps://dwheeler.com/essays/fixing-unix-linux-filenames.html\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://sqlite-utils--508.org.readthedocs.build/en/508/\n\r\n", "created_at": "2022-10-31T22:11:49Z", "updated_at": "2022-11-17T15:11:16Z", "closed_at": "2022-10-31T22:55:36Z", "merged_at": null, "merge_commit_sha": "3b551597240d9a6058b1c3c720073120db213678", "assignee": null, "milestone": null, "draft": 0, "head": "43a8c4c91fc22fb6bea07846f144072b0d047f4e", "base": "529110e7d8c4a6b1bbf5fb61f2e29d72aa95a611", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/508", "merged_by": null, "auto_merge": null} {"id": 1358254580, "node_id": "PR_kwDOCGYnMM5Q9VH0", "number": 546, "state": "closed", "locked": 0, "title": "Analyze tables options: --common-limit, --no-most, --no-least", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #544\r\n\r\n- [x] Documentation for CLI options\r\n- [x] Documentation for new Python API parameters: `most_common: bool` and `least_common: bool`\r\n- [x] Tests for CLI\r\n- [x] Tests for Python API", "created_at": "2023-05-21T15:54:39Z", "updated_at": "2023-05-21T16:19:30Z", "closed_at": "2023-05-21T16:19:30Z", "merged_at": "2023-05-21T16:19:30Z", "merge_commit_sha": "d2a7b15b2b930fe384e1f1715fc4af23386f4935", "assignee": null, "milestone": null, "draft": 0, "head": "2eca17d46eca2cff52c78553085ec64d9029c969", "base": "e047cc32e9d5de7025d4d3c16554d4290f4bd3d1", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/546", "merged_by": null, "auto_merge": null} {"id": 275861559, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc1ODYxNTU5", "number": 449, "state": "closed", "locked": 0, "title": "Apply black to everything", "user": {"value": 9599, "label": "simonw"}, "body": "I've been hesitating on this for literally months, because I'm not at all excited about the giant diff that will result. But I've been using black on many of my other projects (most actively [sqlite-utils](https://github.com/simonw/sqlite-utils)) and the productivity boost is undeniable: I don't have to spend a single second thinking about code formatting any more!\r\n\r\nSo it's worth swallowing the one-off pain and moving on in a new, black-enabled world.", "created_at": "2019-05-03T21:57:26Z", "updated_at": "2019-05-04T02:17:14Z", "closed_at": "2019-05-04T02:15:15Z", "merged_at": "2019-05-04T02:15:15Z", "merge_commit_sha": "35d6ee2790e41e96f243c1ff58be0c9c0519a8ce", "assignee": null, "milestone": null, "draft": 0, "head": "9683aeb2394a4b7e44499b8a0240af3baafda832", "base": "66c87cee0c7344c7877373c60b180c766c206101", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/449", "merged_by": null, "auto_merge": null} {"id": 1179812838, "node_id": "PR_kwDODEm0Qs5GUoPm", "number": 71, "state": "open", "locked": 0, "title": "Archive: Fix \"ni devices\" typo in importer", "user": {"value": 26161409, "label": "sometimes-i-send-pull-requests"}, "body": null, "created_at": "2022-12-28T23:33:31Z", "updated_at": "2022-12-28T23:33:31Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "7905dbd6e36bcabcfd9106c70ebb36ecf9e38260", "assignee": null, "milestone": null, "draft": 0, "head": "0d3c62e8ba6e545785069cc0ffc8dc1bad03db80", "base": "f09d611782a8372cfb002792dfa727325afb4db6", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "url": "https://github.com/dogsheep/twitter-to-sqlite/pull/71", "merged_by": null, "auto_merge": null}