{"id": 211860706, "node_id": "MDExOlB1bGxSZXF1ZXN0MjExODYwNzA2", "number": 363, "state": "open", "locked": 0, "title": "Search all apps during heroku publish", "user": {"value": 436032, "label": "kevboh"}, "body": "Adds the `-A` option to include apps from all organizations when searching app names for publish.", "created_at": "2018-08-29T19:25:10Z", "updated_at": "2018-08-31T14:39:45Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "b684b04c30f6b8779a3d11f7599329092fb152f3", "assignee": null, "milestone": null, "draft": 0, "head": "2dd363e01fa73b24ba72f539c0a854bc901d23a7", "base": "b7257a21bf3dfa7353980f343c83a616da44daa7", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/363", "merged_by": null, "auto_merge": null} {"id": 214653641, "node_id": "MDExOlB1bGxSZXF1ZXN0MjE0NjUzNjQx", "number": 364, "state": "open", "locked": 0, "title": "Support for other types of databases using external connectors", "user": {"value": 11912854, "label": "jsancho-gpl"}, "body": "This PR is related to #293, but now all commits have been merged.\r\n\r\nThe purpose is to support other file formats that aren't SQLite, like files with PyTables format. I've tried to accomplish that using external connectors published with entry points.\r\n\r\nThe modifications in the original datasette code are minimal and many are in a separated file.", "created_at": "2018-09-11T14:31:47Z", "updated_at": "2018-09-11T14:31:47Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "d84f3b1f585cb52b58aed0401c34214de2e8b47b", "assignee": null, "milestone": null, "draft": 0, "head": "592fd05f685859b271f0305c2fc8cdb7da58ebfb", "base": "b7257a21bf3dfa7353980f343c83a616da44daa7", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/364", "merged_by": null, "auto_merge": null} {"id": 275923066, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjc1OTIzMDY2", "number": 452, "state": "open", "locked": 0, "title": "SQL builder utility classes", "user": {"value": 45057, "label": "russss"}, "body": "This adds a straightforward set of classes to aid in the construction of\r\nSQL queries.\r\n\r\nMy plan for this was to allow plugins to manipulate the\r\nDatasette-generated SQL in a more structured way. I'm not sure that's\r\ngoing to work, but I feel like this is still a step forward - it\r\nreduces the number of intermediate variables in `TableView.data` which\r\naids readability, and also factors out a lot of the boring string\r\nconcatenation.\r\n\r\nThere are a fair number of minor structure changes in here too as I've\r\ntried to make the ordering of `TableView.data` a bit more logical. As\r\nfar as I can tell, I haven't broken anything...", "created_at": "2019-05-04T13:57:47Z", "updated_at": "2019-05-04T14:03:04Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "45e7460d78c3f87c01f2e9e142cb7f646b23b156", "assignee": null, "milestone": null, "draft": 0, "head": "c63762280d3bd66ad6ea24933dafe218861efef2", "base": "55643430f7ac8d27e99b00e7cf79db741003e811", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/452", "merged_by": null, "auto_merge": null} {"id": 295127213, "node_id": "MDExOlB1bGxSZXF1ZXN0Mjk1MTI3MjEz", "number": 546, "state": "open", "locked": 0, "title": "Facet by delimiter", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #510", "created_at": "2019-07-07T20:06:05Z", "updated_at": "2019-11-18T23:46:01Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "68a6fb1a576a747b868771d00a10753f35aaa0cf", "assignee": null, "milestone": null, "draft": 0, "head": "47ac6c6e46da16716d295d7cda8f79cd0663ca5e", "base": "a9909c29ccac771c23c2ef22b89d10697b5256b9", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/546", "merged_by": null, "auto_merge": null} {"id": 301483613, "node_id": "MDExOlB1bGxSZXF1ZXN0MzAxNDgzNjEz", "number": 564, "state": "open", "locked": 0, "title": "First proof-of-concept of Datasette Library", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #417. Run it like this:\r\n\r\n datasette -d ~/Library\r\n\r\nUses a new plugin hook - available_databases()\r\n", "created_at": "2019-07-26T10:22:26Z", "updated_at": "2023-02-07T15:14:11Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "4f425d2b39d1be10d7ef5c146480a3eb494d5086", "assignee": null, "milestone": null, "draft": 1, "head": "947645d84710677ea50762016081a9fbc6b014a8", "base": "a9453c4dda70bbf5122835e68f63db6ecbe1a6fc", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/564", "merged_by": null, "auto_merge": null} {"id": 323983732, "node_id": "MDExOlB1bGxSZXF1ZXN0MzIzOTgzNzMy", "number": 579, "state": "open", "locked": 0, "title": "New connection pooling", "user": {"value": 9599, "label": "simonw"}, "body": "See #569", "created_at": "2019-10-02T23:22:19Z", "updated_at": "2019-11-15T22:57:21Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "025b4024b1b43ea034b7fd331c30740165ff75f2", "assignee": null, "milestone": null, "draft": 0, "head": "32cbfd2acd28bcefb97c442ac8e3ee2c07401e19", "base": "a9909c29ccac771c23c2ef22b89d10697b5256b9", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/579", "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": 440735814, "node_id": "MDExOlB1bGxSZXF1ZXN0NDQwNzM1ODE0", "number": 868, "state": "open", "locked": 0, "title": "initial windows ci setup", "user": {"value": 702729, "label": "joshmgrant"}, "body": "Picking up the work done on #557 with a new PR. Seeing if I can get this working.", "created_at": "2020-06-26T18:49:13Z", "updated_at": "2021-07-10T23:41:43Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "b99adb1720a0b53ff174db54d0e4a67357b47f33", "assignee": null, "milestone": null, "draft": 0, "head": "c99cabae638958ef057438a92cb9a182ba4f8188", "base": "180c7a5328457aefdf847ada366e296fef4744f1", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/868", "merged_by": null, "auto_merge": null} {"id": 442505088, "node_id": "MDExOlB1bGxSZXF1ZXN0NDQyNTA1MDg4", "number": 883, "state": "open", "locked": 0, "title": "Skip counting hidden tables", "user": {"value": 3243482, "label": "abdusco"}, "body": "Potential fix for https://github.com/simonw/datasette/issues/859.\r\n\r\nDisabling table counts for hidden tables speeds up database page quite a bit. In my setup it reduced load time by 2/3 (~300 -> ~90ms)", "created_at": "2020-07-01T07:38:08Z", "updated_at": "2020-07-02T00:25:44Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "527624338acd38b97bb33b0a0b913d80e8345fee", "assignee": null, "milestone": null, "draft": 0, "head": "251884f58895faf8056b3dfdeae3bb92c5bc58ac", "base": "676bb64c877d73f8ff496cef4632f5a8a5a9283c", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/883", "merged_by": null, "auto_merge": null} {"id": 448355680, "node_id": "MDExOlB1bGxSZXF1ZXN0NDQ4MzU1Njgw", "number": 30, "state": "open", "locked": 0, "title": "Handle empty bucket on first upload. Allow specifying the endpoint_url for services other than S3 (like b2 and digitalocean spaces)", "user": {"value": 110038, "label": "scanner"}, "body": "Finally got around to trying dogsheep-photos but I want to use backblaze's b2 service instead of AWS S3.\r\nHad to add a way to optionally specify the endpoint_url to connect to. Then with the bucket being empty the initial key retrieval would fail. Probably a better way to see that the bucket is empty than doing a test inside the paginator loop.\r\n\r\nAlso probably a better way to specify the endpoint_url as we get and test for it twice using the same code in two different places but did not want to spend too much time worrying about it.", "created_at": "2020-07-13T16:15:26Z", "updated_at": "2020-07-13T16:15:26Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "583b26f244166aadf2dcc680e39d1ca59765da37", "assignee": null, "milestone": null, "draft": 0, "head": "647d4b42c6f4d1fba4b99f73fe163946cea6ee36", "base": "45ce3f8bfb8c70f57ca5d8d82f22368fea1eb391", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 256834907, "label": "dogsheep-photos"}, "url": "https://github.com/dogsheep/dogsheep-photos/pull/30", "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": 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": 505453900, "node_id": "MDExOlB1bGxSZXF1ZXN0NTA1NDUzOTAw", "number": 1030, "state": "open", "locked": 0, "title": "Make `package` command deal with a configuration directory argument", "user": {"value": 299380, "label": "frankier"}, "body": "Currently if we run `datasette package` on a configuration directory we'll get an exception when we try to hard link to the directory. This PR copies the tree and makes the Dockerfile run inspect on all *.db files.", "created_at": "2020-10-18T11:07:02Z", "updated_at": "2020-10-19T08:01:51Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "124142e4d2710525b09ff2bd2a7a787cbed163a4", "assignee": null, "milestone": null, "draft": 0, "head": "e0825334692967fec195e104cb6aa11095807a8e", "base": "c37a0a93ecb847e66cfe7b6f9452ba210fcae91b", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1030", "merged_by": null, "auto_merge": null} {"id": 521054612, "node_id": "MDExOlB1bGxSZXF1ZXN0NTIxMDU0NjEy", "number": 13, "state": "open", "locked": 0, "title": "SQLite does not have case sensitive columns", "user": {"value": 1689944, "label": "tomaskrehlik"}, "body": "This solves a weird issue when there is record with metadata key\r\nthat is only different in letter cases.\r\n\r\nSee the test for details.", "created_at": "2020-11-14T20:12:32Z", "updated_at": "2021-08-24T13:28:26Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "38856acbc724ffdb8beb9e9f4ef0dbfa8ff51ad1", "assignee": null, "milestone": null, "draft": 0, "head": "3e1b2945bc7c31be59e89c5fed86a5d2a59ebd5a", "base": "71e36e1cf034b96de2a8e6652265d782d3fdf63b", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 197882382, "label": "healthkit-to-sqlite"}, "url": "https://github.com/dogsheep/healthkit-to-sqlite/pull/13", "merged_by": null, "auto_merge": null} {"id": 521287994, "node_id": "MDExOlB1bGxSZXF1ZXN0NTIxMjg3OTk0", "number": 203, "state": "open", "locked": 0, "title": "changes to allow for compound foreign keys", "user": {"value": 1049910, "label": "drkane"}, "body": "Add support for compound foreign keys, as per issue #117 \r\n\r\nNot sure if this is the right approach. In particular I'm unsure about:\r\n\r\n - the new `ForeignKey` class, which replaces the namedtuple in order to ensure that `column` and `other_column` are forced into tuples. The class does the job, but doesn't feel very elegant.\r\n - I haven't rewritten `guess_foreign_table` to take account of multiple columns, so it just checks for the first column in the foreign key definition. This isn't ideal.\r\n - I haven't added any ability to the CLI to add compound foreign keys, it's only in the python API at the moment.\r\n\r\nThe PR also contains a minor related change that columns and tables are always quoted in foreign key definitions.", "created_at": "2020-11-16T00:30:10Z", "updated_at": "2023-01-25T18:47:18Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "0507a9464314f84e9e58b1931c583df51d757d7c", "assignee": null, "milestone": null, "draft": 0, "head": "5e43e31c2b9bcf6b5d1460b0f848fed019ed42a6", "base": "f1277f638f3a54a821db6e03cb980adad2f2fa35", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/203", "merged_by": null, "auto_merge": null} {"id": 532348919, "node_id": "MDExOlB1bGxSZXF1ZXN0NTMyMzQ4OTE5", "number": 1130, "state": "open", "locked": 0, "title": "Fix footer not sticking to bottom in short pages", "user": {"value": 3243482, "label": "abdusco"}, "body": "Fixes https://github.com/simonw/datasette/issues/1129", "created_at": "2020-12-04T07:29:01Z", "updated_at": "2021-06-15T13:27:48Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "af3aa34786f134af8073342a3c4bb74b968750fd", "assignee": null, "milestone": null, "draft": 0, "head": "8d4c69c6fb0ef741a19070f5172017ea3522e83c", "base": "49d8fc056844d5a537d6cfd96dab0dd5686fe718", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1130", "merged_by": null, "auto_merge": null} {"id": 543015825, "node_id": "MDExOlB1bGxSZXF1ZXN0NTQzMDE1ODI1", "number": 31, "state": "open", "locked": 0, "title": "Update for Big Sur", "user": {"value": 41546558, "label": "RhetTbull"}, "body": "Refactored out the SQL for extracting aesthetic scores to use osxphotos -- adds compatbility for Big Sur via osxphotos which has been updated for new table names in Big Sur. Have not yet refactored the SQL for extracting labels which is still compatible with Big Sur.", "created_at": "2020-12-20T04:36:45Z", "updated_at": "2023-08-08T15:52:52Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "0e571b07430024d4ce00d5e8ba28591cefd27d6f", "assignee": null, "milestone": null, "draft": 0, "head": "39c12f8cda206ad621ec9940cce538570513e764", "base": "edc80a0d361006f478f2904a90bfe6c730ed6194", "author_association": "CONTRIBUTOR", "repo": {"value": 256834907, "label": "dogsheep-photos"}, "url": "https://github.com/dogsheep/dogsheep-photos/pull/31", "merged_by": null, "auto_merge": null} {"id": 545264436, "node_id": "MDExOlB1bGxSZXF1ZXN0NTQ1MjY0NDM2", "number": 1159, "state": "open", "locked": 0, "title": "Improve the display of facets information", "user": {"value": 552629, "label": "lovasoa"}, "body": "This PR changes the display of facets to hopefully make them more readable.\r\n\r\nBefore | After\r\n---|---\r\n![image](https://user-images.githubusercontent.com/552629/103084609-b1ec2980-45df-11eb-85bc-68ab8df3e8d9.png) | ![image](https://user-images.githubusercontent.com/552629/103085220-620e6200-45e1-11eb-8189-5dd5d3e2569e.png)\r\n", "created_at": "2020-12-24T11:01:47Z", "updated_at": "2023-07-31T18:57:59Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "0276c5609da34bfb660f65212e1a367e637979d7", "assignee": null, "milestone": {"value": 3268330, "label": "Datasette 1.0"}, "draft": 0, "head": "c820abd0bcb34d1ea5a03be64a2158ae7c42920c", "base": "a882d679626438ba0d809944f06f239bcba8ee96", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1159", "merged_by": null, "auto_merge": null} {"id": 560760145, "node_id": "MDExOlB1bGxSZXF1ZXN0NTYwNzYwMTQ1", "number": 1204, "state": "open", "locked": 0, "title": "WIP: Plugin includes", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1191\r\n\r\nNext steps:\r\n\r\n- [ ] Get comfortable that this pattern is the right way to go\r\n- [ ] Implement it for all of the other pages, not just the table page\r\n- [ ] Add a new set of plugin tests that exercise ALL of these new hook locations\r\n- [ ] Document, then ship", "created_at": "2021-01-25T03:59:06Z", "updated_at": "2021-12-17T07:10:49Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "98f06a766317a40035962416cf3211d7a374866a", "assignee": null, "milestone": null, "draft": 1, "head": "05258469ae39bcaad17beb57c5b7eeab0d58a589", "base": "07e163561592c743e4117f72102fcd350a600909", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1204", "merged_by": null, "auto_merge": null} {"id": 561512503, "node_id": "MDExOlB1bGxSZXF1ZXN0NTYxNTEyNTAz", "number": 15, "state": "open", "locked": 0, "title": "added try / except to write_records ", "user": {"value": 9857779, "label": "ryancheley"}, "body": "to keep the data write from failing if it came across an error during processing. In particular when trying to convert my HealthKit zip file (and that of my wife's) it would consistently error out with the following:\r\n\r\n```\r\ndb.py 1709 insert_chunk\r\nresult = self.db.execute(query, params)\r\n\r\ndb.py 226 execute\r\nreturn self.conn.execute(sql, parameters)\r\n\r\nsqlite3.OperationalError:\r\ntoo many SQL variables\r\n\r\n---------------------------------------------------------------------------------------------------------------------------------------------------------------------\r\ndb.py 1709 insert_chunk\r\nresult = self.db.execute(query, params)\r\n\r\ndb.py 226 execute\r\nreturn self.conn.execute(sql, parameters)\r\n\r\nsqlite3.OperationalError:\r\ntoo many SQL variables\r\n\r\n---------------------------------------------------------------------------------------------------------------------------------------------------------------------\r\ndb.py 1709 insert_chunk\r\nresult = self.db.execute(query, params)\r\n\r\ndb.py 226 execute\r\nreturn self.conn.execute(sql, parameters)\r\n\r\nsqlite3.OperationalError:\r\ntable rBodyMass has no column named metadata_HKWasUserEntered\r\n\r\n---------------------------------------------------------------------------------------------------------------------------------------------------------------------\r\nhealthkit-to-sqlite 8 \r\nsys.exit(cli())\r\n\r\ncore.py 829 __call__\r\nreturn self.main(*args, **kwargs)\r\n\r\ncore.py 782 main\r\nrv = self.invoke(ctx)\r\n\r\ncore.py 1066 invoke\r\nreturn ctx.invoke(self.callback, **ctx.params)\r\n\r\ncore.py 610 invoke\r\nreturn callback(*args, **kwargs)\r\n\r\ncli.py 57 cli\r\nconvert_xml_to_sqlite(fp, db, progress_callback=bar.update, zipfile=zf)\r\n\r\nutils.py 42 convert_xml_to_sqlite\r\nwrite_records(records, db)\r\n\r\nutils.py 143 write_records\r\ndb[table].insert_all(\r\n\r\ndb.py 1899 insert_all\r\nself.insert_chunk(\r\n\r\ndb.py 1720 insert_chunk\r\nself.insert_chunk(\r\n\r\ndb.py 1720 insert_chunk\r\nself.insert_chunk(\r\n\r\ndb.py 1714 insert_chunk\r\nresult = self.db.execute(query, params)\r\n\r\ndb.py 226 execute\r\nreturn self.conn.execute(sql, parameters)\r\n\r\nsqlite3.OperationalError:\r\ntable rBodyMass has no column named metadata_HKWasUserEntered\r\n```\r\n\r\nAdding the try / except in the `write_records` seems to fix that issue. ", "created_at": "2021-01-26T03:56:21Z", "updated_at": "2021-01-26T03:56:21Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "8527278a87e448f57c7c6bd76a2d85f12d0233dd", "assignee": null, "milestone": null, "draft": 0, "head": "7f1b168c752b5af7c1f9052dfa61e26afc83d574", "base": "71e36e1cf034b96de2a8e6652265d782d3fdf63b", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 197882382, "label": "healthkit-to-sqlite"}, "url": "https://github.com/dogsheep/healthkit-to-sqlite/pull/15", "merged_by": null, "auto_merge": null} {"id": 577953727, "node_id": "MDExOlB1bGxSZXF1ZXN0NTc3OTUzNzI3", "number": 5, "state": "open", "locked": 0, "title": "WIP: Add Gmail takeout mbox import", "user": {"value": 306240, "label": "UtahDave"}, "body": "WIP\r\n\r\nThis PR adds the ability to import emails from a Gmail mbox export from Google Takeout.\r\n\r\nThis is my first PR to a datasette/dogsheep repo. I've tested this on my personal Google Takeout mbox with ~520,000 emails going back to 2004. This took around ~20 minutes to process.\r\n\r\nTo provide some feedback on the progress of the import I added the \"rich\" python module. I'm happy to remove that if adding a dependency is discouraged. However, I think it makes a nice addition to give feedback on the progress of a long import.\r\n\r\nDo we want to log emails that have errors when trying to import them?\r\n\r\nDealing with encodings with emails is a bit tricky. I'm very open to feedback on how to deal with those better. As well as any other feedback for improvements.", "created_at": "2021-02-22T21:30:40Z", "updated_at": "2021-07-28T07:18:56Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "65182811d59451299e75f09b4366bb221bc32b20", "assignee": null, "milestone": null, "draft": 0, "head": "a3de045eba0fae4b309da21aa3119102b0efc576", "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/5", "merged_by": null, "auto_merge": null} {"id": 580235427, "node_id": "MDExOlB1bGxSZXF1ZXN0NTgwMjM1NDI3", "number": 241, "state": "open", "locked": 0, "title": "Extract expand - work in progress", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #239. Still needs documentation and CLI implementation.", "created_at": "2021-02-25T16:36:38Z", "updated_at": "2021-02-25T16:36:38Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "0bb6c7a38994627a64e7b3375931528e96b8c222", "assignee": null, "milestone": null, "draft": 1, "head": "8d641ab08ac449081e96f3e25bd6c0226870948a", "base": "38e688fb8bcb58ae888b676fe3f7dd0529b4eecc", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/241", "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": 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": 598213565, "node_id": "MDExOlB1bGxSZXF1ZXN0NTk4MjEzNTY1", "number": 1271, "state": "open", "locked": 0, "title": "Use SQLite conn.interrupt() instead of sqlite_timelimit()", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1270, #1268, #1249\r\n\r\nBefore merging this I need to do some more testing (to make sure that expensive queries really are properly cancelled). I also need to delete a bunch of code relating to the old mechanism of cancelling queries.\r\n\r\n[See comment below: this doesn't actually cancel the query due to a thread-local confusion]", "created_at": "2021-03-22T17:34:20Z", "updated_at": "2021-03-22T21:49:27Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "a4fd7e5a761523881c031b4fee266a366e1c97bd", "assignee": null, "milestone": null, "draft": 1, "head": "fb2ad7ada0b86a7fe4a576fe23236757c41eb05e", "base": "c4f1ec7f33fd7d5b93f0f895dafb5351cc3bfc5b", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1271", "merged_by": null, "auto_merge": null} {"id": 613178968, "node_id": "MDExOlB1bGxSZXF1ZXN0NjEzMTc4OTY4", "number": 1296, "state": "open", "locked": 0, "title": "Dockerfile: use Ubuntu 20.10 as base", "user": {"value": 82332573, "label": "tmcl-it"}, "body": "This PR changes the main Dockerfile to use ubuntu:20.10 as base image instead of python:3.9.2-slim-buster (itself based on debian:buster-slim).\r\n\r\nThe Dockerfile is essentially the one from https://github.com/simonw/datasette/issues/1249#issuecomment-803698983 with some additional cleanups to slim it down.\r\n\r\nThis fixes a couple of issues:\r\n1. The SQLite version in Debian Buster (2.6.0) doesn't support generated columns\r\n2. Installing SpatiaLite from the Debian sid repositories has the side effect of also installing updates to libc and libstdc++ from sid.\r\n\r\nAs a bonus, the Docker image becomes smaller:\r\n\r\n\r\n```\r\n$ docker image ls\r\nREPOSITORY TAG IMAGE ID CREATED SIZE\r\ndatasette 0.56-ubuntu f7aca255140a 5 hours ago 212MB\r\ndatasetteproject/datasette 0.56 efb3b282f390 13 days ago 258MB\r\n```\r\n\r\n### Reproduction of the first issue\r\n\r\n```\r\n$ curl -O https://latest.datasette.io/fixtures.db\r\n % Total % Received % Xferd Average Speed Time Time Time Current\r\n Dload Upload Total Spent Left Speed\r\n100 260k 0 260k 0 0 489k 0 --:--:-- --:--:-- --:--:-- 489k\r\n\r\n$ docker run -v `pwd`:/mnt datasetteproject/datasette:0.56 datasette /mnt/fixtures.db\r\nTraceback (most recent call last):\r\n File \"/usr/local/bin/datasette\", line 8, in \r\n sys.exit(cli())\r\n File \"/usr/local/lib/python3.9/site-packages/click/core.py\", line 829, in __call__\r\n return self.main(*args, **kwargs)\r\n File \"/usr/local/lib/python3.9/site-packages/click/core.py\", line 782, in main\r\n rv = self.invoke(ctx)\r\n File \"/usr/local/lib/python3.9/site-packages/click/core.py\", line 1259, in invoke\r\n return _process_result(sub_ctx.command.invoke(sub_ctx))\r\n File \"/usr/local/lib/python3.9/site-packages/click/core.py\", line 1066, in invoke\r\n return ctx.invoke(self.callback, **ctx.params)\r\n File \"/usr/local/lib/python3.9/site-packages/click/core.py\", line 610, in invoke\r\n return callback(*args, **kwargs)\r\n File \"/usr/local/lib/python3.9/site-packages/datasette/cli.py\", line 544, in serve\r\n asyncio.get_event_loop().run_until_complete(check_databases(ds))\r\n File \"/usr/local/lib/python3.9/asyncio/base_events.py\", line 642, in run_until_complete\r\n return future.result()\r\n File \"/usr/local/lib/python3.9/site-packages/datasette/cli.py\", line 584, in check_databases\r\n await database.execute_fn(check_connection)\r\n File \"/usr/local/lib/python3.9/site-packages/datasette/database.py\", line 155, in execute_fn\r\n return await asyncio.get_event_loop().run_in_executor(\r\n File \"/usr/local/lib/python3.9/concurrent/futures/thread.py\", line 52, in run\r\n result = self.fn(*self.args, **self.kwargs)\r\n File \"/usr/local/lib/python3.9/site-packages/datasette/database.py\", line 153, in in_thread\r\n return fn(conn)\r\n File \"/usr/local/lib/python3.9/site-packages/datasette/utils/__init__.py\", line 892, in check_connection\r\n for r in conn.execute(\r\nsqlite3.DatabaseError: malformed database schema (generated_columns) - near \"AS\": syntax error\r\n```\r\n\r\nHere is the SQLite version:\r\n\r\n```\r\n$ docker run -v `pwd`:/mnt -it datasetteproject/datasette:0.56 /bin/bash\r\nroot@d9220d3b95dd:/# python3\r\nPython 3.9.2 (default, Mar 27 2021, 02:50:26) \r\n[GCC 8.3.0] on linux\r\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\r\n>>> import sqlite3\r\n>>> sqlite3.version\r\n'2.6.0'\r\n```\r\n\r\n### Reproduction of the second issue\r\n\r\n```\r\n$ docker build . -t datasette --build-arg VERSION=0.55\r\n[...snip...]\r\nThe following packages will be upgraded:\r\n libc-bin libc6 libstdc++6\r\n[...snip...]\r\nUnpacking libc6:amd64 (2.31-11) over (2.28-10) ...\r\n[...snip...]\r\nUnpacking libstdc++6:amd64 (10.2.1-6) over (8.3.0-6) ...\r\n[...snip...]\r\n```\r\n\r\nBoth libc and libstdc++ are backwards compatible, so the image still works, but it will result in a combination of libraries and Python versions that exists only in the Datasette image, so it's likely untested. In addition, since Debian sid is an always-changing rolling-release, the versions of libc, libstdc++, Spatialite, and their dependencies change frequently, so the library versions in the Datasette image will depend on the day when it was built.\r\n", "created_at": "2021-04-12T00:23:32Z", "updated_at": "2021-07-20T08:52:13Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "2ba522dbd7168a104a33621598c5a2460aae3e74", "assignee": null, "milestone": null, "draft": 0, "head": "8f00c312f6b8ab5cecbb8a698ab4ad659aabf4ef", "base": "c73af5dd72305f6a01ea94a2c76d52e5e26de38b", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1296", "merged_by": null, "auto_merge": null} {"id": 645100848, "node_id": "MDExOlB1bGxSZXF1ZXN0NjQ1MTAwODQ4", "number": 12, "state": "open", "locked": 0, "title": "Recovering of malformed ENEX file", "user": {"value": 8431437, "label": "engdan77"}, "body": "Hey .. Awesome work developing this project, that I found very useful to me and saved me some work.. Thanks.. :)\r\n\r\nSome background to this PR... \r\nI've been searching around for a tool allowing me to transforming my personal collection of Evernote notes to a format easier to search and potentially easier import to future services. \r\n\r\nNow I discovered problem processing my large data ~5GB using the existing source using Pythons builtin xml-parser that unfortunately was unable to succeed without exception breaking the process. \r\n\r\nMy first attempt I tried to adapt to more robust lxml package allowing huge data and with \"recover\", but even if it worked better it also failed processing the whole data. Even using the memory efficient etree.iterparse() it also unfortunately got into trouble.\r\n\r\nAnd with no luck finding any other libraries successfully parsing this enormous file I instead chose to build a \"hugexmlparser\" module that allows parsing this huge file using yield (on a byte-to-byte-level) and allows you to set a maximum size for to cater for potential malformed or undesirable large attachments to export, should succeed covering potential exceptions. Some cases found where the parses discover malformed XML within so also in those cases try to save as much as possible by escaping (to be dealt at a later stage, better than nothing), and if a missing end before new (malformed?) it would add this after encounter a new start-tag.\r\n\r\nThe code for the recovery process is a bit rough and for certain room for refactoring, but at the moment is seem to achieve what I wanted.\r\n\r\nNow with the above we pass this a minor changed version of save_note_recovery() assure the existing works.\r\nAlso adding this as a new recover-enex command to click and kept the original options. \r\nA couple of new tests was added as well to check against using this command.\r\n\r\nNow this currently works to me, but thought I might share a PR in such as you find use for this yourself or found useful to others finding this repository.\r\n\r\nAs a second step .. When the time allows it would have been nice to also be able to easily export from SQLite to formatted HTML/MD and attachments saved... but that might perhaps be better a separate project ... or if you or someone else have something that might shared to save some trouble, I would be interested ;-) ", "created_at": "2021-05-15T07:49:31Z", "updated_at": "2021-05-15T19:57:50Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "95f21ca163606db74babd036e6fa44b7d484d137", "assignee": null, "milestone": null, "draft": 0, "head": "a5839dadaa43694f208ad74a53670cebbe756956", "base": "0bc6ba503eecedb947d2624adbe1327dd849d7fe", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 303218369, "label": "evernote-to-sqlite"}, "url": "https://github.com/dogsheep/evernote-to-sqlite/pull/12", "merged_by": null, "auto_merge": null} {"id": 655741428, "node_id": "MDExOlB1bGxSZXF1ZXN0NjU1NzQxNDI4", "number": 1348, "state": "open", "locked": 0, "title": "DRAFT: add test and scan for docker images", "user": {"value": 10801138, "label": "blairdrummond"}, "body": "**NOTE: I don't think this PR is ready, since the arm/v6 and arm/v7 images are failing pytest due to missing dependencies (gcc and friends). But it's pretty close.**\r\n\r\nCloses https://github.com/simonw/datasette/issues/1344 . Using a build-matrix for the platforms and [this test](https://github.com/simonw/datasette/issues/1344#issuecomment-849820019), we test all the platforms in parallel. I also threw in container scanning.\r\n\r\n### Switch `pip install` to use either tags or commit shas\r\n\r\nNotably! This also [changes the Dockerfile](https://github.com/blairdrummond/datasette/blob/7fe5315d68e04fce64b5bebf4e2d7feec44f8546/Dockerfile#L20) so that it accepts tags or commit-shas.\r\n\r\n```\r\n# It's backwards compatible with tags, but also lets you use shas\r\nroot@712071df17af:/# pip install git+git://github.com/simonw/datasette.git@0.56 \r\nCollecting git+git://github.com/simonw/datasette.git@0.56 \r\n Cloning git://github.com/simonw/datasette.git (to revision 0.56) to /tmp/pip-req-build-u6dhm945 \r\n Running command git clone -q git://github.com/simonw/datasette.git /tmp/pip-req-build-u6dhm945 \r\n Running command git checkout -q af5a7f1c09f6a902bb2a25e8edf39c7034d2e5de \r\nCollecting Jinja2<2.12.0,>=2.10.3 \r\n Downloading Jinja2-2.11.3-py2.py3-none-any.whl (125 kB) \r\n```\r\n\r\nThis lets you build the containers in CI every push for testing, which maybe resolves [this problem](https://github.com/simonw/datasette/issues/1272#issuecomment-808648974)?\r\n\r\n# Workflow run example\r\n\r\nYou can see the results in my workflow [here](https://github.com/blairdrummond/datasette/pull/2/checks?check_run_id=2690570717). The commit history is different because I squashed this branch, also in the testing branch I had to change `github.com/simonw` to `github.com/blairdrummond` for the CI to pick up my git_sha.\r\n\r\n## Why did the builds fail?\r\n\r\n**NOTE:** The results of all the tests fail, but for different reasons! A few fail to install Rust, the amd64 passes the tests (phew!) but has critical CVEs which fail the container scan, the Arm/v6 and Arm/v7 seem to fail to install the test dependencies due to missing programs like `gcc`. (`gcc` is not sufficient though, as [this run](https://github.com/blairdrummond/datasette/pull/3/checks?check_run_id=2690672982) indicates) ", "created_at": "2021-05-28T03:02:12Z", "updated_at": "2021-05-28T03:06:16Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "eeea7cb835be0f0319cafccf50dffa6ad26826c5", "assignee": null, "milestone": null, "draft": 0, "head": "56cba8fb837cd938c2f9d7423ee43d62a81c8f7c", "base": "7b106e106000713bbee31b34d694b3dadbd4818c", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1348", "merged_by": null, "auto_merge": null} {"id": 672053811, "node_id": "MDExOlB1bGxSZXF1ZXN0NjcyMDUzODEx", "number": 65, "state": "open", "locked": 0, "title": "basic support for events", "user": {"value": 231498, "label": "khimaros"}, "body": "a quick first pass at implementing the feature requested in https://github.com/dogsheep/github-to-sqlite/issues/64\r\n\r\ntesting instructions:\r\n\r\n```\r\n$ github-to-sqlite events events.db user/khimaros\r\n```\r\n\r\nif the specified user is the authenticated user, it will also include private events.\r\n\r\ncaveat: pagination appears to be broken (i don't see `next` in the response JSON from GitHub)", "created_at": "2021-06-17T00:51:30Z", "updated_at": "2022-10-03T22:35:03Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "0a252a06a15e307c8a67b2e0aac0907e2566bf19", "assignee": null, "milestone": null, "draft": 0, "head": "82da9f91deda81d92ec64c9eda960aa64340c169", "base": "0e45b72312a0756e5a562effbba08cb8de1e480b", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 207052882, "label": "github-to-sqlite"}, "url": "https://github.com/dogsheep/github-to-sqlite/pull/65", "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": 692557381, "node_id": "MDExOlB1bGxSZXF1ZXN0NjkyNTU3Mzgx", "number": 1399, "state": "open", "locked": 0, "title": "Multiple sort", "user": {"value": 87192257, "label": "jgryko5"}, "body": "Closes #197.\r\nI have added support for sorting by multiple parameters as mentioned in the issue above, and together with that, a suggestion on how to implement such sorting in the user interface.", "created_at": "2021-07-19T12:20:14Z", "updated_at": "2021-07-19T12:20:14Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "3161cd1202824921054cf78d82c1d8c07b140451", "assignee": null, "milestone": null, "draft": 0, "head": "739697660382e4d2974619b4a5605baef87d233a", "base": "c73af5dd72305f6a01ea94a2c76d52e5e26de38b", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1399", "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": 712412883, "node_id": "MDExOlB1bGxSZXF1ZXN0NzEyNDEyODgz", "number": 1434, "state": "open", "locked": 0, "title": "Enrich arbitrary query results with foreign key links and column descriptions", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1293, follows #942.", "created_at": "2021-08-13T14:43:01Z", "updated_at": "2021-08-19T21:18:58Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "d4d4f5566b1d43075cb52ded5d19a9dcf4350761", "assignee": null, "milestone": null, "draft": 0, "head": "281c0872d5b8a462c9d7b2b2d77a924da4ed25a7", "base": "2883098770fc66e50183b2b231edbde20848d4d6", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1434", "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": 718734191, "node_id": "MDExOlB1bGxSZXF1ZXN0NzE4NzM0MTkx", "number": 22, "state": "open", "locked": 0, "title": "Make sure that case-insensitive column names are unique", "user": {"value": 32016596, "label": "FabianHertwig"}, "body": "This closes #21.\r\n\r\nWhen there are metadata entries with the same case insensitive string, then there is an error when trying to create a new column for that metadata entry in the database table, because a column with that case insensitive name already exists.\r\n\r\n```xml\r\n \r\n \r\n \r\n \r\n```\r\n\r\nThe code added in this PR checks if a key already exists in a record and if so adds a number at its end. The resulting column names look like the example below then. Interestingly, the column names viewed with Datasette are not case insensitive.\r\n\r\n```text\r\nstartDate, endDate, value, unit, sourceName, sourceVersion, creationDate, metadata_meal, metadata_Meal_2, metadata_Mahlzeit\r\n```\r\n", "created_at": "2021-08-24T13:13:38Z", "updated_at": "2021-08-24T13:26:20Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "c757d372c10284cd6fa58d144549bc89691341c3", "assignee": null, "milestone": null, "draft": 0, "head": "b16fb556f84a0eed262a518ca7ec82a467155d23", "base": "9fe3cb17e03d6c73222b63e643638cf951567c4c", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 197882382, "label": "healthkit-to-sqlite"}, "url": "https://github.com/dogsheep/healthkit-to-sqlite/pull/22", "merged_by": null, "auto_merge": null} {"id": 721686721, "node_id": "MDExOlB1bGxSZXF1ZXN0NzIxNjg2NzIx", "number": 67, "state": "open", "locked": 0, "title": "Replacing step ID key with step_id", "user": {"value": 16374374, "label": "jshcmpbll"}, "body": "Workflows that have an `id` in any step result in the following error when running `workflows`:\r\n\r\ne.g.`github-to-sqlite workflows github.db nixos/nixpkgs`\r\n\r\n```Traceback (most recent call last):\r\n File \"/usr/local/bin/github-to-sqlite\", line 8, in \r\n sys.exit(cli())\r\n File \"/usr/local/lib/python3.8/dist-packages/click/core.py\", line 1137, in __call__\r\n return self.main(*args, **kwargs)\r\n File \"/usr/local/lib/python3.8/dist-packages/click/core.py\", line 1062, in main\r\n rv = self.invoke(ctx)\r\n File \"/usr/local/lib/python3.8/dist-packages/click/core.py\", line 1668, in invoke```Traceback (most recent call last):\r\n File \"/usr/local/bin/github-to-sqlite\", line 8, in \r\n sys.exit(cli())\r\n File \"/usr/local/lib/python3.8/dist-packages/click/core.py\", line 1137, in __call__\r\n return self.main(*args, **kwargs)\r\n File \"/usr/local/lib/python3.8/dist-packages/click/core.py\", line 1062, in main\r\n rv = self.invoke(ctx)\r\n File \"/usr/local/lib/python3.8/dist-packages/click/core.py\", line 1668, in invoke\r\n return _process_result(sub_ctx.command.invoke(sub_ctx))\r\n File \"/usr/local/lib/python3.8/dist-packages/click/core.py\", line 1404, in invoke\r\n return ctx.invoke(self.callback, **ctx.params)\r\n File \"/usr/local/lib/python3.8/dist-packages/click/core.py\", line 763, in invoke\r\n return __callback(*args, **kwargs)\r\n File \"/usr/local/lib/python3.8/dist-packages/github_to_sqlite/cli.py\", line 601, in workflows\r\n utils.save_workflow(db, repo_id, filename, content)\r\n File \"/usr/local/lib/python3.8/dist-packages/github_to_sqlite/utils.py\", line 865, in save_workflow\r\n db[\"steps\"].insert_all(\r\n File \"/usr/local/lib/python3.8/dist-packages/sqlite_utils/db.py\", line 2596, in insert_all\r\n self.insert_chunk(\r\n File \"/usr/local/lib/python3.8/dist-packages/sqlite_utils/db.py\", line 2378, in insert_chunk\r\n result = self.db.execute(query, params)\r\n File \"/usr/local/lib/python3.8/dist-packages/sqlite_utils/db.py\", line 419, in execute\r\n return self.conn.execute(sql, parameters)\r\nsqlite3.IntegrityError: datatype mismatch\r\n```\r\n\r\n - [Information about the ID key in a step for GHA](https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idstepsid)\r\n - [An example workflow from a public repo](https://github.com/NixOS/nixpkgs/blob/b4cc66827745e525ce7bb54659845ac89788a597/.github/workflows/direct-push.yml#L16)\r\n\r\n# Changes\r\nI'm proposing that the key for `id` in step is replaced with `step_id` so that it no longer interferes with the table `id` for tracking the record.\r\n\r\nSpecial thanks to @sarcasticadmin @egiffen and @ruebenramirez for helping a bit on this \ud83d\ude04 ", "created_at": "2021-08-28T01:26:41Z", "updated_at": "2021-08-28T01:27:00Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "9f73c9bf29dec9a1482d9af56b9fac271869585c", "assignee": null, "milestone": null, "draft": 0, "head": "9b5acceb25cf48b00e9c6c8293358b036440deb2", "base": "ed3752022e45b890af63996efec804725e95d0d4", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 207052882, "label": "github-to-sqlite"}, "url": "https://github.com/dogsheep/github-to-sqlite/pull/67", "merged_by": null, "auto_merge": null} {"id": 726990680, "node_id": "MDExOlB1bGxSZXF1ZXN0NzI2OTkwNjgw", "number": 35, "state": "open", "locked": 0, "title": "Support for Datasette's --base-url setting", "user": {"value": 2670795, "label": "brandonrobertz"}, "body": "This makes it so you can use Dogsheep if you're using Datasette with the `--base-url /some-path/` setting.", "created_at": "2021-09-03T17:47:45Z", "updated_at": "2021-09-03T17:47:45Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "0f5931da2099303111c49ec726b78bae814f755e", "assignee": null, "milestone": null, "draft": 0, "head": "e6679d287b2e97fc94f50da64e1a7b91c1fbbf67", "base": "a895bc360f2738c7af43deda35c847f1ee5bff51", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 197431109, "label": "dogsheep-beta"}, "url": "https://github.com/dogsheep/dogsheep-beta/pull/35", "merged_by": null, "auto_merge": null} {"id": 727390835, "node_id": "MDExOlB1bGxSZXF1ZXN0NzI3MzkwODM1", "number": 36, "state": "open", "locked": 0, "title": "Correct naming of tool in readme", "user": {"value": 2129, "label": "badboy"}, "body": null, "created_at": "2021-09-05T12:05:40Z", "updated_at": "2022-01-06T16:04:46Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "358678c6b48072769f2985fe6be8fc5e54ed2e06", "assignee": null, "milestone": null, "draft": 0, "head": "bf26955c250e601a0d9e751311530940b704f81e", "base": "edc80a0d361006f478f2904a90bfe6c730ed6194", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 256834907, "label": "dogsheep-photos"}, "url": "https://github.com/dogsheep/dogsheep-photos/pull/36", "merged_by": null, "auto_merge": null} {"id": 729704537, "node_id": "MDExOlB1bGxSZXF1ZXN0NzI5NzA0NTM3", "number": 1465, "state": "open", "locked": 0, "title": "add support for -o --get /path", "user": {"value": 51016, "label": "ctb"}, "body": "Fixes https://github.com/simonw/datasette/issues/1459\r\n\r\nAdds support for `--open --get /path` to be used in combination.\r\n\r\nIf `--open` is provided alone, datasette will open a web page to a default URL.\r\nIf `--get ` is provided alone, datasette will output the result of doing a GET to that URL and then exit.\r\nIf `--open --get ` are provided together, datasette will open a web page to that URL.\r\n\r\nTODO items:\r\n- [ ] update documentation\r\n- [ ] print out error message when `--root --open --get ` is used\r\n- [ ] adjust code to require that `` start with a `/` when `-o --get ` is used\r\n- [ ] add test(s)\r\n\r\nnote, '@CTB' is used in this PR to flag code that needs revisiting.", "created_at": "2021-09-08T14:30:42Z", "updated_at": "2021-09-08T14:31:45Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "064e9511923fc4e50566bf9430b4a5b26f169357", "assignee": null, "milestone": null, "draft": 1, "head": "9b66a7d9ba55bad8a3b409ede8855f4b4fff1f88", "base": "d57ab156b35ec642549fb69d08279850065027d2", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1465", "merged_by": null, "auto_merge": null} {"id": 737690951, "node_id": "PR_kwDOBm6k_c4r-EVH", "number": 1475, "state": "open", "locked": 0, "title": "feat: allow joins using _through in both directions", "user": {"value": 5268174, "label": "bram2000"}, "body": "Currently the `_through` clause can only work if the FK relationship is defined in a specific direction. I don't think there is any reason for this limitation, as an FK allows joining in both directions.\r\n\r\nThis is an admittedly hacky change to implement bidirectional joins using `_through`. It does work for our use-case, but I don't know if there are other implications that I haven't thought of. Also if this change is desirable we probably want to make the code a little nicer.", "created_at": "2021-09-20T15:28:20Z", "updated_at": "2021-09-20T15:28:20Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "aa2f1c103730c0ede4ab67978288d91bbe1e00a6", "assignee": null, "milestone": null, "draft": 0, "head": "edf3c4c3271c8f13ab4c28ad88b817e115477e41", "base": "b28b6cd2fe97f7e193a235877abeec2c8eb0a821", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1475", "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": 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": 771790589, "node_id": "PR_kwDOEhK-wc4uAJb9", "number": 15, "state": "open", "locked": 0, "title": "include note tags in the export", "user": {"value": 436138, "label": "d-rep"}, "body": "When parsing the Evernote `` elements, the script will now also parse any nested `` elements, writing them out into a separate sqlite table.\r\n\r\nHere is an example of how to query the data after the script has run:\r\n```\r\nselect notes.*,\r\n\t(select group_concat(tag) from notes_tags where notes_tags.note_id=notes.id) as tags\r\nfrom notes;\r\n```\r\n\r\nMy .enex source file is 3+ years old so I am assuming the structure hasn't changed. Interestingly, my _notebook names_ show up in the _tags_ list where the tag name is prefixed with `notebook_`, so this could maybe help work around the first limitation mentioned in the [evernote-to-sqlite blog post](https://simonwillison.net/2020/Oct/16/building-evernote-sqlite-exporter/).\r\n", "created_at": "2021-11-02T20:04:31Z", "updated_at": "2021-11-02T20:04:31Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "ee36aba995b0a5385bdf9a451851dcfc316ff7f6", "assignee": null, "milestone": null, "draft": 0, "head": "8cc3aa49c6e61496b04015c14048c5dac58d6b42", "base": "fff89772b4404995400e33fe1d269050717ff4cf", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 303218369, "label": "evernote-to-sqlite"}, "url": "https://github.com/dogsheep/evernote-to-sqlite/pull/15", "merged_by": null, "auto_merge": null} {"id": 775078665, "node_id": "PR_kwDODFE5qs4uMsMJ", "number": 9, "state": "open", "locked": 0, "title": "Removed space from filename My Activity.json", "user": {"value": 91880982, "label": "widadmogral"}, "body": "File name from google takeout has no space. The code only runs without error if filename is \"MyActivity.json\" and not \"My Activity.json\". Is it a new change by Google?", "created_at": "2021-11-08T00:04:31Z", "updated_at": "2021-11-08T00:04:31Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "236da5c8302c09a20fcd4164c563cd9fa5c9595c", "assignee": null, "milestone": null, "draft": 0, "head": "6d111f65687e13ffd8b39aa05f1f8f4a351e7788", "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/9", "merged_by": null, "auto_merge": null} {"id": 791153878, "node_id": "PR_kwDOCGYnMM4vKAzW", "number": 347, "state": "open", "locked": 0, "title": "Test against pysqlite3 running SQLite 3.37", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #346 and #344.", "created_at": "2021-11-29T23:17:57Z", "updated_at": "2021-12-11T01:02:19Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "f70a61e58ae62e53af74ab48d742bdc335131fbd", "assignee": null, "milestone": null, "draft": 0, "head": "1a7ef2fe2064ace01d5535fb771f941296fb642a", "base": "213a0ff177f23a35f3b235386366ff132eb879f1", "author_association": "OWNER", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/347", "merged_by": null, "auto_merge": null} {"id": 838755826, "node_id": "PR_kwDOBm6k_c4x_mXy", "number": 1626, "state": "open", "locked": 0, "title": "Try test suite against macOS and Windows", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1625", "created_at": "2022-02-02T22:26:51Z", "updated_at": "2022-02-03T01:22:44Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "83958f26a8458a108acb7c3c0a1c8aacb777586a", "assignee": null, "milestone": null, "draft": 0, "head": "4b4d0e1ff9e2ee998cbd71abd5f5806f25444ed9", "base": "b5e6b1a9e1332fca3effe45d55dd06ee4249f163", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1626", "merged_by": null, "auto_merge": null} {"id": 862538586, "node_id": "PR_kwDODFdgUs4zaUta", "number": 70, "state": "open", "locked": 0, "title": "scrape-dependents: enable paging through package menu option if present", "user": {"value": 36061055, "label": "stanbiryukov"}, "body": "Some repos organize network dependents by a Package toggle. This PR adds the ability to page through those options and scrape underlying dependents.", "created_at": "2022-02-24T15:07:25Z", "updated_at": "2022-02-24T15:07:25Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "36cca3584a07d88d1e505111d1b23294d66ba73e", "assignee": null, "milestone": null, "draft": 0, "head": "cc8f276a474525e55ed0bcacb0cd8cc560f89614", "base": "751bc900366ca52e662ea383b858cbf4365093d9", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 207052882, "label": "github-to-sqlite"}, "url": "https://github.com/dogsheep/github-to-sqlite/pull/70", "merged_by": null, "auto_merge": null} {"id": 872242672, "node_id": "PR_kwDODEm0Qs4z_V3w", "number": 65, "state": "open", "locked": 0, "title": "Update Twitter dev link, clarify apps vs projects", "user": {"value": 2657547, "label": "rixx"}, "body": "Twitter pushes you heavily towards v2 projects instead of v1 apps \u2013 I know the README mentions v1 API compatibility at the top, but I still nearly got turned around here.", "created_at": "2022-03-05T11:56:08Z", "updated_at": "2022-03-05T11:56:08Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "765a450845ba26fac102d9154980cd936399546c", "assignee": null, "milestone": null, "draft": 0, "head": "b7cfe9dcb7dbccc7ba8171cfe74f19227c4351ec", "base": "f09d611782a8372cfb002792dfa727325afb4db6", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "url": "https://github.com/dogsheep/twitter-to-sqlite/pull/65", "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": 948892757, "node_id": "PR_kwDODFE5qs44jvRV", "number": 11, "state": "open", "locked": 0, "title": "Update README.md", "user": {"value": 11887, "label": "ashanan"}, "body": "Fix typo", "created_at": "2022-05-27T03:13:59Z", "updated_at": "2022-05-27T03:13:59Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "3d479a1052f2661de61b15c50b7a5b2daa20a33a", "assignee": null, "milestone": null, "draft": 0, "head": "d4af1554a9b5ddedcd0b241450f7b935f38b9bf7", "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/11", "merged_by": null, "auto_merge": null} {"id": 964640654, "node_id": "PR_kwDOBm6k_c45fz-O", "number": 1757, "state": "open", "locked": 0, "title": "feat: add a wildcard for _json columns", "user": {"value": 163156, "label": "ytjohn"}, "body": "This allows _json to accept a wildcard for when there are many JSON columns that the user wants to convert. I hope this is useful. I've tested it on our datasette and haven't ran into any issues. I imagine on a large set of results, there could be some performance issues, but it will probably be negligible for most use cases.\r\n\r\nOn a side note, I ran into an issue where I had to upgrade black on my system beyond the pinned version in setup.py. Here is the upstream issue < . I didn't include this in the PR yet since I didn't look into the issue too far, but I can if you would like.", "created_at": "2022-06-11T01:01:17Z", "updated_at": "2022-09-06T00:51:21Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "f302b919cb78f1e353fc14cb449cab4a93dcedc6", "assignee": null, "milestone": null, "draft": 0, "head": "1cdcd8894ce2bb76cf29f8ffcdadedbb6fa0dac1", "base": "2e9751672d4fe329b3c359d5b7b1992283185820", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1757", "merged_by": null, "auto_merge": null} {"id": 986925985, "node_id": "PR_kwDOD079W84600uh", "number": 37, "state": "open", "locked": 0, "title": "Fix former command name in readme", "user": {"value": 578773, "label": "DanLipsitt"}, "body": "Looks like a previous commit missed a `photo-to-sqlite`\u2192 `dogsheep-photos` replacement.", "created_at": "2022-07-05T02:09:13Z", "updated_at": "2022-07-05T02:09:13Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "1fa5a3b9ddab2a954aea21ea4292b944e826866a", "assignee": null, "milestone": null, "draft": 0, "head": "b0d256c5bc480450627d98d8c8a5e3d8c61dc2ae", "base": "325aa38cb23d0757bb1335ee2ea94a082475a66e", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 256834907, "label": "dogsheep-photos"}, "url": "https://github.com/dogsheep/dogsheep-photos/pull/37", "merged_by": null, "auto_merge": null} {"id": 998860509, "node_id": "PR_kwDOBm6k_c47iWbd", "number": 1772, "state": "open", "locked": 0, "title": "Convert to setup.cfg", "user": {"value": 89725, "label": "kfdm"}, "body": "Recent versions of setuptools can run most things from setup.cfg so one can have a simpler version that does not require executing code on install.\r\n\r\nThe bulk of the changes were automated by running https://pypi.org/project/setup-py-upgrade/ with a few minor edits for the bits that it can not auto convert (the initial `get_long_description()` and `get_version()` can not be automatically converted)", "created_at": "2022-07-18T03:39:53Z", "updated_at": "2022-07-18T03:39:53Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "3abb0780f97901ae39f8a206c7c6d376f8574ffc", "assignee": null, "milestone": null, "draft": 0, "head": "c1b2f539c8d4cabe0a48d07bd8ce3fd1439a8f08", "base": "01369176b0a8943ab45292ffc6f9c929b80a00e8", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1772", "merged_by": null, "auto_merge": null} {"id": 1038926741, "node_id": "PR_kwDODtX3eM497MOV", "number": 5, "state": "open", "locked": 0, "title": "The program fails when the user has no submissions", "user": {"value": 2467, "label": "fernand0"}, "body": "Tested with:\r\n \r\n hacker-news-to-sqlite user hacker-news.db fernand0\r\n\r\nResult:\r\n`\r\nTraceback (most recent call last):\r\n File \"/home/ftricas/.pyenv/versions/3.10.6/bin/hacker-news-to-sqlite\", line 8, in \r\n sys.exit(cli())\r\n File \"/home/ftricas/.pyenv/versions/3.10.6/lib/python3.10/site-packages/click/core.py\", line 1130, in __call__\r\n return self.main(*args, **kwargs)\r\n File \"/home/ftricas/.pyenv/versions/3.10.6/lib/python3.10/site-packages/click/core.py\", line 1055, in main\r\n rv = self.invoke(ctx)\r\n File \"/home/ftricas/.pyenv/versions/3.10.6/lib/python3.10/site-packages/click/core.py\", line 1657, in invoke\r\n return _process_result(sub_ctx.command.invoke(sub_ctx))\r\n File \"/home/ftricas/.pyenv/versions/3.10.6/lib/python3.10/site-packages/click/core.py\", line 1404, in invoke\r\n return ctx.invoke(self.callback, **ctx.params)\r\n File \"/home/ftricas/.pyenv/versions/3.10.6/lib/python3.10/site-packages/click/core.py\", line 760, in invoke\r\n return __callback(*args, **kwargs)\r\n File \"/home/ftricas/.pyenv/versions/3.10.6/lib/python3.10/site-packages/hacker_news_to_sqlite/cli.py\", line 27, in user\r\n submitted = user.pop(\"submitted\", None) or []\r\nAttributeError: 'NoneType' object has no attribute 'pop'\r\n`\r\n\r\nThere is a problem of style with the patch (but not sure what to do) because with the new inicialization ( submitted = []) the part \r\n\r\n or []\r\n\r\nis not needed. Maybe there is a more adequate way of doing this.", "created_at": "2022-08-28T17:25:45Z", "updated_at": "2022-08-28T17:25:45Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "f0d7414305fc6cba4bcb7506b76a94938ccc7886", "assignee": null, "milestone": null, "draft": 0, "head": "ea97e640ad7a24020821fde5c647240120bd7099", "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/5", "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": 1067890893, "node_id": "PR_kwDOBm6k_c4_prjN", "number": 1823, "state": "open", "locked": 0, "title": "Keyword-only arguments for a bunch of internal methods", "user": {"value": 9599, "label": "simonw"}, "body": "Refs #1822\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--1823.org.readthedocs.build/en/1823/\n\r\n", "created_at": "2022-09-27T00:44:59Z", "updated_at": "2022-10-05T04:37:54Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "28068a62ad6a8b76a1c9223c4ca78099cfd2ece5", "assignee": null, "milestone": null, "draft": 0, "head": "b545b6a04ed7b407331f991adce107691ac3ab97", "base": "5f9f567acbc58c9fcd88af440e68034510fb5d2b", "author_association": "OWNER", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1823", "merged_by": null, "auto_merge": null} {"id": 1073492809, "node_id": "PR_kwDODD6af84__DNJ", "number": 14, "state": "open", "locked": 0, "title": "Photo links", "user": {"value": 6782721, "label": "redmanmale"}, "body": "* add to `checkin_details` view new column for a calculated photo links\r\n* supported multiple links split by newline\r\n* create `events` table if there's no events in the history to avoid SQL errors\r\n\r\nFixes #9.", "created_at": "2022-10-01T09:44:15Z", "updated_at": "2022-11-18T17:10:49Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "6ca283dc30a2713bd3fda0dc35df1c7186a5996e", "assignee": null, "milestone": null, "draft": 0, "head": "5541d9496bad73c9edce98f5562a3135359d57d6", "base": "719b6e96a016d0ca8b316d3bed9c2a7a0cb499ee", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 205429375, "label": "swarm-to-sqlite"}, "url": "https://github.com/dogsheep/swarm-to-sqlite/pull/14", "merged_by": null, "auto_merge": null} {"id": 1083804914, "node_id": "PR_kwDOCGYnMM5AmYzy", "number": 499, "state": "open", "locked": 0, "title": "feat: recreate fts triggers after table transform", "user": {"value": 7908073, "label": "chapmanjacobd"}, "body": "https://github.com/simonw/sqlite-utils/pull/498\r\n\r\n\r\n----\r\n:books: Documentation preview :books:: https://sqlite-utils--499.org.readthedocs.build/en/499/\r\n\r\n\r\n\r\nalternatively, `self.disable_fts()`", "created_at": "2022-10-11T20:35:39Z", "updated_at": "2022-10-26T17:54:51Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "6c71562a7a21ab93541a14453961ce3d6abca3cc", "assignee": null, "milestone": null, "draft": 0, "head": "a25e83841f2703afb08aff4589cb559ae9060776", "base": "d792dad1cf5f16525da81b1e162fb71d469995f3", "author_association": "CONTRIBUTOR", "repo": {"value": 140912432, "label": "sqlite-utils"}, "url": "https://github.com/simonw/sqlite-utils/pull/499", "merged_by": null, "auto_merge": null} {"id": 1102353255, "node_id": "PR_kwDOBm6k_c5BtJNn", "number": 1870, "state": "open", "locked": 0, "title": "don't use immutable=1, only mode=ro", "user": {"value": 536941, "label": "fgregg"}, "body": "Opening db files in immutable mode sometimes leads to the file being mutated, which causes duplication in the docker image layers: see #1836, #1480\r\n\r\nThat this happens in \"immutable\" mode is surprising, because the sqlite docs say that setting this should open the database as read only. \r\n\r\nhttps://www.sqlite.org/c3ref/open.html\r\n\r\n> immutable: The immutable parameter is a boolean query parameter that indicates that the database file is stored on read-only media. When immutable is set, SQLite assumes that the database file cannot be changed, even by a process with higher privilege, and so the database is opened read-only and all locking and change detection is disabled. Caution: Setting the immutable property on a database file that does in fact change can result in incorrect query results and/or [SQLITE_CORRUPT](https://www.sqlite.org/rescode.html#corrupt) errors. See also: [SQLITE_IOCAP_IMMUTABLE](https://www.sqlite.org/c3ref/c_iocap_atomic.html).\r\n\r\nPerhaps this is a bug in sqlite?\r\n\r\n\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--1870.org.readthedocs.build/en/1870/\n\r\n", "created_at": "2022-10-27T23:33:04Z", "updated_at": "2023-10-03T19:12:37Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "fc2d316f9e22593d48036e9d81fe972bb5973016", "assignee": null, "milestone": null, "draft": 0, "head": "4faa4fd3b3e7f5eae758b713d0a121b960e2e261", "base": "bf00b0b59b6692bdec597ac9db4e0b497c5a47b4", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1870", "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": 1179812491, "node_id": "PR_kwDODEm0Qs5GUoKL", "number": 68, "state": "open", "locked": 0, "title": "Archive: Import mute table", "user": {"value": 26161409, "label": "sometimes-i-send-pull-requests"}, "body": null, "created_at": "2022-12-28T23:32:06Z", "updated_at": "2022-12-28T23:32:06Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "47d4d3bda6d4123f58d8dbd634f9f146d97b037e", "assignee": null, "milestone": null, "draft": 0, "head": "e1cd68ea0244c4689a3c49799c6b24371cdc4978", "base": "f09d611782a8372cfb002792dfa727325afb4db6", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "url": "https://github.com/dogsheep/twitter-to-sqlite/pull/68", "merged_by": null, "auto_merge": null} {"id": 1179812620, "node_id": "PR_kwDODEm0Qs5GUoMM", "number": 69, "state": "open", "locked": 0, "title": "Archive: Import new tweets table name", "user": {"value": 26161409, "label": "sometimes-i-send-pull-requests"}, "body": "Given the code here, it seems like in the past this file was named \"tweet.js\". In recent exports, it's named \"tweets.js\". The archive importer needs to be modified to take this into account. Existing logic is reused for importing this table. (However, the resulting table name will be different, matching the different file name -- archive_tweets, rather than archive_tweet).", "created_at": "2022-12-28T23:32:44Z", "updated_at": "2022-12-28T23:32:44Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "1a8c02a8d349c8fd4074139a6a3eed552676bdf3", "assignee": null, "milestone": null, "draft": 0, "head": "11e8fa64ca30cebde047a4268e65f376c42e2b60", "base": "f09d611782a8372cfb002792dfa727325afb4db6", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "url": "https://github.com/dogsheep/twitter-to-sqlite/pull/69", "merged_by": null, "auto_merge": null} {"id": 1179812730, "node_id": "PR_kwDODEm0Qs5GUoN6", "number": 70, "state": "open", "locked": 0, "title": "Archive: Import Twitter Circle data", "user": {"value": 26161409, "label": "sometimes-i-send-pull-requests"}, "body": null, "created_at": "2022-12-28T23:33:09Z", "updated_at": "2022-12-28T23:33:09Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "1d2683101571550adf4a3b7bdf8e9ffbd8b77b61", "assignee": null, "milestone": null, "draft": 0, "head": "cc80cb31a9afb9a50295d6202f509e5b500607a0", "base": "f09d611782a8372cfb002792dfa727325afb4db6", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 206156866, "label": "twitter-to-sqlite"}, "url": "https://github.com/dogsheep/twitter-to-sqlite/pull/70", "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} {"id": 1182000455, "node_id": "PR_kwDOC8tyDs5Gc-VH", "number": 23, "state": "open", "locked": 0, "title": "Include workout statistics", "user": {"value": 2129, "label": "badboy"}, "body": "Not sure when this changed (iOS 16 maybe?), but the `WorkoutStatistics` now has a whole bunch of information about workouts, e.g. for runs it contains the distance (as a `` element).\r\n\r\nAdding it as another column at leat allows me to pull these out (using SQLite's JSON support).\r\nI'm running with this patch on my own data now.", "created_at": "2023-01-01T17:29:56Z", "updated_at": "2023-01-01T17:29:57Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "e0ad45055f363810085119f26df87a6804451056", "assignee": null, "milestone": null, "draft": 0, "head": "d5b9e3609961515cc52bcc5ef070e3b83b473339", "base": "9fe3cb17e03d6c73222b63e643638cf951567c4c", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 197882382, "label": "healthkit-to-sqlite"}, "url": "https://github.com/dogsheep/healthkit-to-sqlite/pull/23", "merged_by": null, "auto_merge": null} {"id": 1201985064, "node_id": "PR_kwDOBm6k_c5HpNYo", "number": 1996, "state": "open", "locked": 0, "title": "Document custom json encoder", "user": {"value": 25778, "label": "eyeseast"}, "body": "Closes #1983 \r\n\r\nAll documentation here. Edits welcome.\r\n\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--1996.org.readthedocs.build/en/1996/\n\r\n", "created_at": "2023-01-18T16:54:14Z", "updated_at": "2023-01-19T12:55:57Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "b608768f75e8e15ee4618ebac8bcba2da47b2aa3", "assignee": null, "milestone": null, "draft": 0, "head": "96b8b7f1ecf3abaec5921aaedee251e36eed5339", "base": "6a352e99ab988dbf8fd22a100049caa6ad33f1ec", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/1996", "merged_by": null, "auto_merge": null} {"id": 1215742203, "node_id": "PR_kwDOBm6k_c5IdsD7", "number": 2003, "state": "open", "locked": 0, "title": "Show referring tables and rows when the referring foreign key is compound", "user": {"value": 536941, "label": "fgregg"}, "body": "sqlite foreign keys can be compound, but that is not as well supported by datasette as single column foreign keys.\r\n\r\nin particular, \r\n\r\n1. in a table view, there is not a link from the row to the referenced row if the foreign key is compound\r\n2. in a row view, there is no listing of tables and rows that refer to the focal row if those referencing foreign keys are compound.\r\n\r\nBoth of these issues are discussed in #1099. \r\n\r\nThis PR only fixes the second one, because it's not clear what the right UX is for the first issue.\r\n\r\n![Screenshot 2023-01-24 at 19-47-40 nlrb bargaining_unit](https://user-images.githubusercontent.com/536941/214454749-d53deead-4151-4329-a5d4-8a7a454de7d3.png)\r\n\r\nSome things that might not be desirable about this approach.\r\n\r\n1. it changes the external API, by changing `column` => `columns` and `other_column` => `other_columns` (see inline comment for more discussion.\r\n2. There are various places where the plural foreign keys have to be checked for length and discarded or transformed to singular. \r\n", "created_at": "2023-01-24T21:31:31Z", "updated_at": "2023-01-25T18:44:42Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "fb3abeceb2785a582d2c120c7c1bf7dc3cd1de05", "assignee": null, "milestone": null, "draft": 0, "head": "1e5b42f9d6490926300953837cbaa571ef81d772", "base": "e4ebef082de90db4e1b8527abc0d582b7ae0bc9d", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2003", "merged_by": null, "auto_merge": null} {"id": 1216059840, "node_id": "PR_kwDOBm6k_c5Ie5nA", "number": 2004, "state": "open", "locked": 0, "title": "use single quotes for string literals, fixes #2001", "user": {"value": 193185, "label": "cldellow"}, "body": "This modernizes some uses of double quotes for string literals to use only single quotes, fixes simonw/datasette#2001\r\n\r\nWhile developing it, I manually enabled the stricter mode by using the code snippet at https://gist.github.com/cldellow/85bba507c314b127f85563869cd94820\r\n\r\nI think that code snippet isn't generally safe/portable, so I haven't tried to automate it in the tests.\r\n\r\n\r\n----\r\n:books: Documentation preview :books:: https://datasette--2004.org.readthedocs.build/en/2004/\r\n\r\n", "created_at": "2023-01-25T05:08:45Z", "updated_at": "2023-02-01T06:37:18Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "f678bfc05913a4b5ecf0c4cebe9ca8329c7d4a21", "assignee": null, "milestone": null, "draft": 0, "head": "dca7634c274e71fae0d95ea4ff1dfd987b9af63c", "base": "e4ebef082de90db4e1b8527abc0d582b7ae0bc9d", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2004", "merged_by": null, "auto_merge": null} {"id": 1220379312, "node_id": "PR_kwDOBm6k_c5IvYKw", "number": 2008, "state": "open", "locked": 0, "title": "array facet: don't materialize unnecessary columns", "user": {"value": 193185, "label": "cldellow"}, "body": "The presence of `inner.*` causes SQLite to materialize a row with all the columns. Those columns will be discarded later.\r\n\r\nInstead, we can select only the column we'll use. This lets SQLite's optimizer realize that the other columns in the CTE definition aren't needed.\r\n\r\nOn a test table with 278K rows, 98K of which had an array, this speeds up the facet calculation from 4 sec to 1 sec.\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2008.org.readthedocs.build/en/2008/\n\r\n", "created_at": "2023-01-28T19:33:40Z", "updated_at": "2023-01-29T18:17:40Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "0eda5a57ead9bda8be4c9e5cd2fdb9f22e69222e", "assignee": null, "milestone": null, "draft": 0, "head": "f529a3001d35a114d2e622dcc7913c4c25a95ed8", "base": "0b4a28691468b5c758df74fa1d72a823813c96bf", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2008", "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": 1243080434, "node_id": "PR_kwDOBm6k_c5KF-by", "number": 2026, "state": "open", "locked": 0, "title": "Avoid repeating primary key columns if included in _col args", "user": {"value": 8513, "label": "runderwood"}, "body": "...while maintaining given order.\r\n\r\nFixes #1975 (if I'm understanding correctly).\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2026.org.readthedocs.build/en/2026/\n\r\n", "created_at": "2023-02-16T04:16:25Z", "updated_at": "2023-02-16T04:16:41Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "ad2bfc72186e7af2244a6f27e02754f4c2f64910", "assignee": null, "milestone": null, "draft": 0, "head": "f15adf1d6211e05250e5492826dd3f8e8e328077", "base": "0b4a28691468b5c758df74fa1d72a823813c96bf", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2026", "merged_by": null, "auto_merge": null} {"id": 1259276997, "node_id": "PR_kwDOBm6k_c5LDwrF", "number": 2031, "state": "open", "locked": 0, "title": "Expand foreign key references in row view as well", "user": {"value": 82332573, "label": "tmcl-it"}, "body": "Unlike the table view, the single row view does not resolve foreign key references into labels. This patch extracts the foreign key reference expansion code from TableView.data() into a standalone function that is then called by both TableView.data() and RowView.data().\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2031.org.readthedocs.build/en/2031/\n\r\n", "created_at": "2023-03-01T18:43:09Z", "updated_at": "2023-03-24T18:35:25Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "ee7aec6175d0934c0420002529d21a767d2a527d", "assignee": null, "milestone": null, "draft": 0, "head": "ef25867492ce6eb69492aa37fcde98936a95365c", "base": "3feed1f66e2b746f349ee56970a62246a18bb164", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2031", "merged_by": null, "auto_merge": null} {"id": 1266742462, "node_id": "PR_kwDOBm6k_c5LgPS-", "number": 2034, "state": "open", "locked": 0, "title": "remove an unused `app` var in cli.py", "user": {"value": 4370201, "label": "wenhoujx"}, "body": "this var `app` isn't actually used? unless init it does some side-effect outside of the event loop, idon't think it's necessary. \r\n\r\nFeel free to ignore this PR if the deleted line actually does something.\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2034.org.readthedocs.build/en/2034/\n\r\n", "created_at": "2023-03-07T18:19:05Z", "updated_at": "2023-03-29T20:56:20Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "9bd2128399e6dff33f97b3aa7adbd8f3a36daad7", "assignee": null, "milestone": null, "draft": 0, "head": "28239c5bed362f2b9ee9e780bf23e5f31b680b5d", "base": "1ad92a1d87d79084ebe524ed186c900ff042328c", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2034", "merged_by": null, "auto_merge": null} {"id": 1289476973, "node_id": "PR_kwDOBm6k_c5M29tt", "number": 2044, "state": "open", "locked": 0, "title": "Expand labels in row view as well (patch for 0.64.x branch)", "user": {"value": 82332573, "label": "tmcl-it"}, "body": "This is a version of #2031 for the 0.64.x branch.\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2044.org.readthedocs.build/en/2044/\n\r\n", "created_at": "2023-03-24T18:44:44Z", "updated_at": "2023-03-24T18:44:57Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "175202f5238c23fc6b76a0119d3ce9917d1570d1", "assignee": null, "milestone": null, "draft": 0, "head": "c039d23a730448a7d82f9239cfb445aa1f7a4f16", "base": "2a0a94fe972e4b1556e73026dc381d297bc906bc", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2044", "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": 1299129869, "node_id": "PR_kwDOJHON9s5NbyYN", "number": 13, "state": "open", "locked": 0, "title": "use universal command", "user": {"value": 14314871, "label": "amlestin"}, "body": null, "created_at": "2023-04-02T15:10:54Z", "updated_at": "2023-04-02T15:37:34Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "b40fdee5efac03f10257f749ee7f69e4692ad6c5", "assignee": null, "milestone": null, "draft": 0, "head": "8111718e747f59dddcb5bf7820ce922e0723c04a", "base": "e55a802d37a896475b6cf475c1ba947af63cca73", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 611552758, "label": "apple-notes-to-sqlite"}, "url": "https://github.com/dogsheep/apple-notes-to-sqlite/pull/13", "merged_by": null, "auto_merge": null} {"id": 1308472112, "node_id": "PR_kwDOBm6k_c5N_bMw", "number": 2056, "state": "open", "locked": 0, "title": "GitHub Action to lint Python code with ruff", "user": {"value": 3709715, "label": "cclauss"}, "body": "[Ruff](https://beta.ruff.rs/) supports [over 500 lint rules](https://beta.ruff.rs/docs/rules) and can be used to replace [Flake8](https://pypi.org/project/flake8/) (plus dozens of plugins), [isort](https://pypi.org/project/isort/), [pydocstyle](https://pypi.org/project/pydocstyle/), [yesqa](https://github.com/asottile/yesqa), [eradicate](https://pypi.org/project/eradicate/), [pyupgrade](https://pypi.org/project/pyupgrade/), and [autoflake](https://pypi.org/project/autoflake/), all while executing (in Rust) tens or hundreds of times faster than any individual tool.\r\n\r\nThe ruff Action uses minimal steps to run in ~5 seconds, rapidly providing intuitive GitHub Annotations to contributors.\r\n\r\n![image](https://user-images.githubusercontent.com/3709715/223758136-afc386d2-70aa-4eff-953a-2c2d82ceea23.png)\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2056.org.readthedocs.build/en/2056/\n\r\n", "created_at": "2023-04-11T06:41:27Z", "updated_at": "2023-04-15T14:24:46Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "608507fe15679221ff74d437339ee66e3d21a7ae", "assignee": null, "milestone": null, "draft": 0, "head": "f53b78029321cd9bd5661accb5bd043d62e35a85", "base": "5890a20c374fb0812d88c9b0ef26a838bfa06c76", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2056", "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": 1349830554, "node_id": "PR_kwDOBm6k_c5QdMea", "number": 2074, "state": "open", "locked": 0, "title": "sort files by mtime", "user": {"value": 3919561, "label": "abbbi"}, "body": "serving multiple database files and getting tired by the default sort, changes so the sort order puts the latest changed databases to be on top of the list so don't have to scroll down, lazy as i am ;)\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2074.org.readthedocs.build/en/2074/\n\r\n", "created_at": "2023-05-14T15:25:15Z", "updated_at": "2023-05-14T15:25:29Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "4fe4822c999a3003a9e3093814274190ea05e522", "assignee": null, "milestone": null, "draft": 0, "head": "689e3b0155612c766607feea10bc2e67e1c2a6da", "base": "49184c569cd70efbda4f3f062afef3a34401d8d5", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2074", "merged_by": null, "auto_merge": null} {"id": 1355563020, "node_id": "PR_kwDOBm6k_c5QzEAM", "number": 2076, "state": "open", "locked": 0, "title": "Datsette gpt plugin", "user": {"value": 130708713, "label": "StudioCordillera"}, "body": "\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2076.org.readthedocs.build/en/2076/\n\r\n", "created_at": "2023-05-18T11:22:30Z", "updated_at": "2023-05-18T11:22:45Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "71658bfe72b75bdceb2b29e13fd610511c8b908c", "assignee": null, "milestone": null, "draft": 0, "head": "093693edd2a177a38cbc5570aaef769e5cbffac1", "base": "49184c569cd70efbda4f3f062afef3a34401d8d5", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2076", "merged_by": null, "auto_merge": null} {"id": 1372714762, "node_id": "PR_kwDOBm6k_c5R0fcK", "number": 2082, "state": "open", "locked": 0, "title": "Catch query interrupted on facet suggest row count", "user": {"value": 10843208, "label": "redraw"}, "body": "Just like facet's `suggest()` is trapping `QueryInterrupted` for facet columns, we also need to trap `get_row_count()`, which can reach timeout if database tables are big enough. \r\n\r\nI've included `get_columns()` inside the block as that's just another query, despite it's a really cheap one and might never raise the exception.\r\n\r\n\r\n----\r\n:books: Documentation preview :books:: https://datasette--2082.org.readthedocs.build/en/2082/\r\n\r\n", "created_at": "2023-05-31T18:42:46Z", "updated_at": "2023-05-31T18:45:26Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "eadc26004d50f38f28b032056821ba319c9f2e87", "assignee": null, "milestone": null, "draft": 0, "head": "dfe99af36c11b88ffcb5ca602d72cee1b8acd8bc", "base": "dda99fc09fb0b5523948f6d481c6c051c1c7b5de", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2082", "merged_by": null, "auto_merge": null} {"id": 1425647904, "node_id": "PR_kwDOBm6k_c5U-akg", "number": 2096, "state": "open", "locked": 0, "title": "Clarify docs for descriptions in metadata", "user": {"value": 15906, "label": "garthk"}, "body": "G'day! I got confused while debugging, earlier today. That's on me, but it does strike me a little repetition in the metadata documentation might help those flicking around it rather than reading it from top to bottom. No worries if you think otherwise.\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2096.org.readthedocs.build/en/2096/\n\r\n", "created_at": "2023-07-08T01:57:58Z", "updated_at": "2023-07-08T01:58:13Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "88388864859b24707f4be9574e357910c368b0fe", "assignee": null, "milestone": null, "draft": 0, "head": "3b787aae74b683414f3546bc9979e9f2c0ae13e9", "base": "8cd60fd1d899952f1153460469b3175465f33f80", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2096", "merged_by": null, "auto_merge": null} {"id": 1432754160, "node_id": "PR_kwDOBm6k_c5VZhfw", "number": 2100, "state": "open", "locked": 0, "title": "Make primary key view accessible to render_cell hook", "user": {"value": 1563881, "label": "meowcat"}, "body": "\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2100.org.readthedocs.build/en/2100/\n\r\n", "created_at": "2023-07-13T09:30:36Z", "updated_at": "2023-08-10T13:15:41Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "37e72ded81cba41c7597a4287e73c47570dca2c7", "assignee": null, "milestone": null, "draft": 0, "head": "5639f9d943e55d6990b40db726aa59790724899a", "base": "33251d04e78d575cca62bb59069bb43a7d924746", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2100", "merged_by": null, "auto_merge": null} {"id": 1454726308, "node_id": "PR_kwDOD079W85WtVyk", "number": 39, "state": "open", "locked": 0, "title": "Missing option in datasette instructions", "user": {"value": 319473, "label": "coldclimate"}, "body": "Gotta tell it where to look", "created_at": "2023-07-29T10:34:48Z", "updated_at": "2023-07-29T10:34:48Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "bd9c51b4e3e110122f921fc6ebf10b69d7fcbb7a", "assignee": null, "milestone": null, "draft": 0, "head": "17c0ddf5113d8587247d4736e1390fe07ec33b8c", "base": "325aa38cb23d0757bb1335ee2ea94a082475a66e", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 256834907, "label": "dogsheep-photos"}, "url": "https://github.com/dogsheep/dogsheep-photos/pull/39", "merged_by": null, "auto_merge": null} {"id": 1487124196, "node_id": "PR_kwDOBm6k_c5Yo7bk", "number": 2151, "state": "open", "locked": 0, "title": "Test Datasette on multiple SQLite versions", "user": {"value": 15178711, "label": "asg017"}, "body": "still testing, hope it works!\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2151.org.readthedocs.build/en/2151/\n\r\n", "created_at": "2023-08-23T22:42:51Z", "updated_at": "2023-08-23T22:58:13Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "3d2c7cbf727c0ca31161a7acb8ea51f1ee7dcd58", "assignee": null, "milestone": null, "draft": 1, "head": "b895cd2fb308154de67972c485e54497c006f47e", "base": "bdf59eb7db42559e538a637bacfe86d39e5d17ca", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2151", "merged_by": null, "auto_merge": null} {"id": 1488414606, "node_id": "PR_kwDOBm6k_c5Yt2eO", "number": 2155, "state": "open", "locked": 0, "title": "Fix hupper.start_reloader entry point", "user": {"value": 79087, "label": "cadeef"}, "body": "Update hupper's entry point so that click commands are processed properly.\r\n\r\nFixes #2123\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2155.org.readthedocs.build/en/2155/\n\r\n", "created_at": "2023-08-24T17:14:08Z", "updated_at": "2023-09-27T18:44:02Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "8b993f48927cfb89f31251a94dc7b48b6b2d3021", "assignee": null, "milestone": null, "draft": 0, "head": "ba2c235a8ea7240549af38988b4cbff8d7ec55bd", "base": "bdf59eb7db42559e538a637bacfe86d39e5d17ca", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2155", "merged_by": null, "auto_merge": null} {"id": 1488782498, "node_id": "PR_kwDOBm6k_c5YvQSi", "number": 2158, "state": "open", "locked": 0, "title": "add brand option to metadata.json.", "user": {"value": 52261150, "label": "publicmatt"}, "body": "This adds a brand link to the top navbar if 'brand' key is populated in metadata.json. The link will be either '#' or use the contents of 'brand_url' in metadata.json for href.\r\n\r\nI was able to get this done on my own site by replacing `templates/_crumbs.html` with a custom version, but I thought it would be nice to incorporate this in the tool directly.\r\n\r\n![image](https://github.com/simonw/datasette/assets/52261150/fdfe9bb5-fee4-466c-8074-6132071d94e6)\r\n\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2158.org.readthedocs.build/en/2158/\n\r\n", "created_at": "2023-08-24T22:37:41Z", "updated_at": "2023-08-24T22:37:57Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "20fad9361ea7173a3543fa16e4b6913a3a0f4b9e", "assignee": null, "milestone": null, "draft": 0, "head": "0d89c4bd19732487232ab2637cf5e8632f48986b", "base": "527cec66b0403e689c8fb71fc8b381a1d7a46516", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2158", "merged_by": null, "auto_merge": null} {"id": 1489526658, "node_id": "PR_kwDOBm6k_c5YyF-C", "number": 2159, "state": "open", "locked": 0, "title": "Implement Dark Mode colour scheme", "user": {"value": 3315059, "label": "jamietanna"}, "body": "Closes #2095.\n\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2159.org.readthedocs.build/en/2159/\n\r\n", "created_at": "2023-08-25T10:46:23Z", "updated_at": "2023-08-25T10:46:35Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "97687cea4bd9c94ae76a780311e044b3c77ef902", "assignee": null, "milestone": null, "draft": 1, "head": "4b969945d106e48b50545fc029ec020593ee1db0", "base": "527cec66b0403e689c8fb71fc8b381a1d7a46516", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2159", "merged_by": null, "auto_merge": null} {"id": 1501923826, "node_id": "PR_kwDOJHON9s5ZhYny", "number": 14, "state": "open", "locked": 0, "title": "fix: fix the problem of Chinese character garbling", "user": {"value": 2698003, "label": "barretlee"}, "body": "1. The code uses two different ways of writing encoding formats, `mac_roman` and `macroman`. It is uncertain whether there are any typo errors.\r\n2. When there are Chinese characters in the content, exporting it results in garbled code. Changing it to `utf8` can fix the issue.", "created_at": "2023-09-04T23:48:28Z", "updated_at": "2023-09-04T23:48:28Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "66b5b73948b1bedc275432956dda43cfe151c78c", "assignee": null, "milestone": null, "draft": 0, "head": "5febe19b8922aa818e7dc265bdee30bcc5004eb4", "base": "e55a802d37a896475b6cf475c1ba947af63cca73", "author_association": "FIRST_TIME_CONTRIBUTOR", "repo": {"value": 611552758, "label": "apple-notes-to-sqlite"}, "url": "https://github.com/dogsheep/apple-notes-to-sqlite/pull/14", "merged_by": null, "auto_merge": null} {"id": 1504915653, "node_id": "PR_kwDOBm6k_c5ZszDF", "number": 2174, "state": "open", "locked": 0, "title": "Use $DATASETTE_INTERNAL in absence of --internal", "user": {"value": 15178711, "label": "asg017"}, "body": "#refs 2157, specifically [this comment](https://github.com/simonw/datasette/issues/2157#issuecomment-1700291967)\r\n\r\nPassing in `--internal my_internal.db` over and over again can get repetitive. \r\n\r\nThis PR adds a new configurable env variable `DATASETTE_INTERNAL_DB_PATH`. If it's defined, then it takes place as the path to the internal database. Users can still overwrite this behavior by passing in their own `--internal internal.db` flag.\r\n\r\nIn draft mode for now, needs tests and documentation. \r\n\r\nSide note: Maybe we can have a sections in the docs that lists all the \"configuration environment variables\" that Datasette respects? I did a quick grep and found:\r\n\r\n- `DATASETTE_LOAD_PLUGINS`\r\n- `DATASETTE_SECRETS`\r\n\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2174.org.readthedocs.build/en/2174/\n\r\n", "created_at": "2023-09-06T16:07:15Z", "updated_at": "2023-09-08T00:46:13Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "0fc2896ffc5b49adba967a3d0ab8ac9ca119ba0e", "assignee": null, "milestone": null, "draft": 0, "head": "d75b51950f6836d6e5a58accb48b1d7687dbdd1c", "base": "05707aa16b5c6c39fbe48b3176b85a8ffe493938", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2174", "merged_by": null, "auto_merge": null} {"id": 1505067804, "node_id": "PR_kwDODFE5qs5ZtYMc", "number": 13, "state": "open", "locked": 0, "title": "use poetry for packages, asdf for versioning, and gh actions for ci", "user": {"value": 150855, "label": "iloveitaly"}, "body": "- build: use poetry for package management, asdf for python version\n- build: cleanup poetry config, add keywords, ignore dist\n- ci: migrate circleci to gh actions\n- fix: dup method definition\n", "created_at": "2023-09-06T17:59:16Z", "updated_at": "2023-09-06T17:59:16Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "cd4d8c4a7ecd231f6c5a8886245271934177f104", "assignee": null, "milestone": null, "draft": 0, "head": "b5f0ebe91755c46e01dc4aefb808f0292848fbed", "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/13", "merged_by": null, "auto_merge": null} {"id": 1592615419, "node_id": "PR_kwDOBm6k_c5e7WH7", "number": 2206, "state": "open", "locked": 0, "title": "Bump the python-packages group with 1 update", "user": {"value": 49699333, "label": "dependabot[bot]"}, "body": "Bumps the python-packages group with 1 update: [black](https://github.com/psf/black).\n\n
\nRelease notes\n

Sourced from black's releases.

\n
\n

23.11.0

\n

Highlights

\n
    \n
  • Support formatting ranges of lines with the new --line-ranges command-line option\n(#4020)
  • \n
\n

Stable style

\n
    \n
  • Fix crash on formatting bytes strings that look like docstrings (#4003)
  • \n
  • Fix crash when whitespace followed a backslash before newline in a docstring (#4008)
  • \n
  • Fix standalone comments inside complex blocks crashing Black (#4016)
  • \n
  • Fix crash on formatting code like await (a ** b) (#3994)
  • \n
  • No longer treat leading f-strings as docstrings. This matches Python's behaviour and\nfixes a crash (#4019)
  • \n
\n

Preview style

\n
    \n
  • Multiline dicts and lists that are the sole argument to a function are now\nindented less (#3964)
  • \n
  • Multiline unpacked dicts and lists as the sole argument to a function are now also\nindented less (#3992)
  • \n
  • In f-string debug expressions, quote types that are visible in the final string\nare now preserved (#4005)
  • \n
  • Fix a bug where long case blocks were not split into multiple lines. Also enable\ngeneral trailing comma rules on case blocks (#4024)
  • \n
  • Keep requiring two empty lines between module-level docstring and first function or\nclass definition (#4028)
  • \n
  • Add support for single-line format skip with other comments on the same line (#3959)
  • \n
\n

Configuration

\n
    \n
  • Consistently apply force exclusion logic before resolving symlinks (#4015)
  • \n
  • Fix a bug in the matching of absolute path names in --include (#3976)
  • \n
\n

Performance

\n
    \n
  • Fix mypyc builds on arm64 on macOS (#4017)
  • \n
\n

Integrations

\n
    \n
  • Black's pre-commit integration will now run only on git hooks appropriate for a code\nformatter (#3940)
  • \n
\n

23.10.1

\n

Highlights

\n
    \n
  • Maintanence release to get a fix out for GitHub Action edge case (#3957)
  • \n
\n

Preview style

\n\n
\n

... (truncated)

\n
\n
\nChangelog\n

Sourced from black's changelog.

\n
\n

23.11.0

\n

Highlights

\n
    \n
  • Support formatting ranges of lines with the new --line-ranges command-line option\n(#4020)
  • \n
\n

Stable style

\n
    \n
  • Fix crash on formatting bytes strings that look like docstrings (#4003)
  • \n
  • Fix crash when whitespace followed a backslash before newline in a docstring (#4008)
  • \n
  • Fix standalone comments inside complex blocks crashing Black (#4016)
  • \n
  • Fix crash on formatting code like await (a ** b) (#3994)
  • \n
  • No longer treat leading f-strings as docstrings. This matches Python's behaviour and\nfixes a crash (#4019)
  • \n
\n

Preview style

\n
    \n
  • Multiline dicts and lists that are the sole argument to a function are now indented\nless (#3964)
  • \n
  • Multiline unpacked dicts and lists as the sole argument to a function are now also\nindented less (#3992)
  • \n
  • In f-string debug expressions, quote types that are visible in the final string are\nnow preserved (#4005)
  • \n
  • Fix a bug where long case blocks were not split into multiple lines. Also enable\ngeneral trailing comma rules on case blocks (#4024)
  • \n
  • Keep requiring two empty lines between module-level docstring and first function or\nclass definition (#4028)
  • \n
  • Add support for single-line format skip with other comments on the same line (#3959)
  • \n
\n

Configuration

\n
    \n
  • Consistently apply force exclusion logic before resolving symlinks (#4015)
  • \n
  • Fix a bug in the matching of absolute path names in --include (#3976)
  • \n
\n

Performance

\n
    \n
  • Fix mypyc builds on arm64 on macOS (#4017)
  • \n
\n

Integrations

\n
    \n
  • Black's pre-commit integration will now run only on git hooks appropriate for a code\nformatter (#3940)
  • \n
\n

23.10.1

\n

Highlights

\n
    \n
  • Maintenance release to get a fix out for GitHub Action edge case (#3957)
  • \n
\n\n
\n

... (truncated)

\n
\n
\nCommits\n
    \n
  • 2a1c67e Prepare release 23.11.0 (#4032)
  • \n
  • 72e7a2e Remove redundant condition from has_magic_trailing_comma (#4023)
  • \n
  • 1a7d9c2 Preserve visible quote types for f-string debug expressions (#4005)
  • \n
  • f4c7be5 docs: fix minor typo (#4030)
  • \n
  • 2e4fac9 Apply force exclude logic before symlink resolution (#4015)
  • \n
  • 66008fd [563] Fix standalone comments inside complex blocks crashing Black (#4016)
  • \n
  • 50ed622 Fix long case blocks not split into multiple lines (#4024)
  • \n
  • 46be1f8 Support formatting specified lines (#4020)
  • \n
  • ecbd9e8 Fix crash with f-string docstrings (#4019)
  • \n
  • e808e61 Preview: Keep requiring two empty lines between module-level docstring and fi...
  • \n
  • Additional commits viewable in compare view
  • \n
\n
\n
\n\n\n[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=black&package-manager=pip&previous-version=23.9.1&new-version=23.11.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)\n\nDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.\n\n[//]: # (dependabot-automerge-start)\n[//]: # (dependabot-automerge-end)\n\n---\n\n
\nDependabot commands and options\n
\n\nYou can trigger Dependabot actions by commenting on this PR:\n- `@dependabot rebase` will rebase this PR\n- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it\n- `@dependabot merge` will merge this PR after your CI passes on it\n- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it\n- `@dependabot cancel merge` will cancel a previously requested merge and block automerging\n- `@dependabot reopen` will reopen this PR if it is closed\n- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually\n- `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency\n- `@dependabot ignore major version` will close this group update PR and stop Dependabot creating any more for the specific dependency's major version (unless you unignore this specific dependency's major version or upgrade to it yourself)\n- `@dependabot ignore minor version` will close this group update PR and stop Dependabot creating any more for the specific dependency's minor version (unless you unignore this specific dependency's minor version or upgrade to it yourself)\n- `@dependabot ignore ` will close this group update PR and stop Dependabot creating any more for the specific dependency (unless you unignore this specific dependency or upgrade to it yourself)\n- `@dependabot unignore ` will remove all of the ignore conditions of the specified dependency\n- `@dependabot unignore ` will remove the ignore condition of the specified dependency and ignore conditions\n\n\n
\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2206.org.readthedocs.build/en/2206/\n\r\n", "created_at": "2023-11-08T13:18:56Z", "updated_at": "2023-12-08T13:46:24Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "57f4b139eaf0a394606b76c6281470c42c116dfa", "assignee": null, "milestone": null, "draft": 0, "head": "eec10df01afbb4489feb7c97544fa10db041e6b0", "base": "452a587e236ef642cbc6ae345b58767ea8420cb5", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2206", "merged_by": null, "auto_merge": null} {"id": 1602618258, "node_id": "PR_kwDOBm6k_c5fhgOS", "number": 2209, "state": "open", "locked": 0, "title": "Fix query for suggested facets with column named value", "user": {"value": 198537, "label": "rgieseke"}, "body": "See discussion in https://github.com/simonw/datasette/issues/2208\r\n\r\n\r\n----\n:books: Documentation preview :books:: https://datasette--2209.org.readthedocs.build/en/2209/\n\r\n", "created_at": "2023-11-15T14:13:30Z", "updated_at": "2023-11-15T15:31:12Z", "closed_at": null, "merged_at": null, "merge_commit_sha": "d628c1520160c030c26353792221925fdcd5cbe4", "assignee": null, "milestone": null, "draft": 0, "head": "c88414be391a2e64208e35d33a69a246170499a6", "base": "452a587e236ef642cbc6ae345b58767ea8420cb5", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/2209", "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": 152522762, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUyNTIyNzYy", "number": 89, "state": "closed", "locked": 0, "title": "SQL syntax highlighting with CodeMirror", "user": {"value": 15543, "label": "tomdyson"}, "body": "Addresses #13 \r\n\r\nFuture enhancements could include autocompletion of table and column names, e.g. with\r\n\r\n```javascript\r\nextraKeys: {\"Ctrl-Space\": \"autocomplete\"},\r\nhintOptions: {tables: {\r\n users: [\"name\", \"score\", \"birthDate\"],\r\n countries: [\"name\", \"population\", \"size\"]\r\n }}\r\n```\r\n\r\n(see https://codemirror.net/doc/manual.html#addon_sql-hint and source at http://codemirror.net/mode/sql/)", "created_at": "2017-11-14T14:43:33Z", "updated_at": "2017-11-15T02:03:01Z", "closed_at": "2017-11-15T02:03:01Z", "merged_at": "2017-11-15T02:03:01Z", "merge_commit_sha": "8252daa4c14d73b4b69e3f2db4576bb39d73c070", "assignee": null, "milestone": null, "draft": 0, "head": "7f6ad095e9c41bf24d73b7724d898965c419965b", "base": "075d422c0a1c70259188dfbd940538c67419694a", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/89", "merged_by": null, "auto_merge": null} {"id": 152631570, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUyNjMxNTcw", "number": 94, "state": "closed", "locked": 0, "title": "Initial add simple prod ready Dockerfile refs #57", "user": {"value": 247192, "label": "macropin"}, "body": "Multi-stage build based off official python:3.6-slim\r\n\r\nExample usage:\r\n```\r\ndocker run --rm -t -i -p 9000:8001 -v $(pwd)/db:/db datasette datasette serve /db/chinook.db\r\n```", "created_at": "2017-11-14T22:09:09Z", "updated_at": "2017-11-15T03:08:04Z", "closed_at": "2017-11-15T03:08:04Z", "merged_at": "2017-11-15T03:08:04Z", "merge_commit_sha": "86755503d26b4a83c2ec59f08ec1b8de791fd954", "assignee": null, "milestone": null, "draft": 0, "head": "147195c2fdfa2b984d8f9fc1c6cab6634970a056", "base": "075d422c0a1c70259188dfbd940538c67419694a", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/94", "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": 152914480, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUyOTE0NDgw", "number": 107, "state": "closed", "locked": 0, "title": "add support for ?field__isnull=1", "user": {"value": 3433657, "label": "raynae"}, "body": "Is this what you had in mind for [this issue](https://github.com/simonw/datasette/issues/64)?", "created_at": "2017-11-15T23:36:36Z", "updated_at": "2017-11-17T15:12:29Z", "closed_at": "2017-11-17T13:29:22Z", "merged_at": "2017-11-17T13:29:22Z", "merge_commit_sha": "ed2b3f25beac720f14869350baacc5f62b065194", "assignee": null, "milestone": null, "draft": 0, "head": "14d5bb572fadbd45973580bd9ad2a16c2bf12909", "base": "b7c4165346ee8b6a6fbd72d6ba2275a24a8a8ae3", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/107", "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": 153324301, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUzMzI0MzAx", "number": 117, "state": "closed", "locked": 0, "title": "Don't prevent tabbing to `Run SQL` button", "user": {"value": 198537, "label": "rgieseke"}, "body": "Mentioned in #115 \r\n\r\nHere you go!", "created_at": "2017-11-17T15:27:50Z", "updated_at": "2017-11-19T20:30:24Z", "closed_at": "2017-11-18T00:53:43Z", "merged_at": "2017-11-18T00:53:43Z", "merge_commit_sha": "6d39429daa4655e3cf7a6a7671493292a20a30a1", "assignee": null, "milestone": null, "draft": 0, "head": "7b4d00e87ed8ac931e6f5458599aece1a95d4e82", "base": "eda848b37f8452dba7913583ef101f39d9b130ba", "author_association": "CONTRIBUTOR", "repo": {"value": 107914493, "label": "datasette"}, "url": "https://github.com/simonw/datasette/pull/117", "merged_by": null, "auto_merge": null}