{"id": 267517314, "node_id": "MDU6SXNzdWUyNjc1MTczMTQ=", "number": 8, "title": "Attempting an INSERT or UPDATE should return a sane error message", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2857392, "label": "Ship first public release"}, "comments": 1, "created_at": "2017-10-23T01:28:25Z", "updated_at": "2017-10-23T15:28:12Z", "closed_at": "2017-10-23T15:28:08Z", "author_association": "OWNER", "pull_request": null, "body": "", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/8/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 267522549, "node_id": "MDU6SXNzdWUyNjc1MjI1NDk=", "number": 11, "title": "Code that generates compile-time properties about the database ", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2857392, "label": "Ship first public release"}, "comments": 1, "created_at": "2017-10-23T02:18:24Z", "updated_at": "2017-10-23T16:04:23Z", "closed_at": "2017-10-23T16:04:23Z", "author_association": "OWNER", "pull_request": null, "body": "At a minimum this will include:\r\n\r\n* sha hash of each database file\r\n* list of tables with row counts for each database file", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/11/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 267732005, "node_id": "MDU6SXNzdWUyNjc3MzIwMDU=", "number": 17, "title": "In development mode, should still pick up new .db files", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2857392, "label": "Ship first public release"}, "comments": 1, "created_at": "2017-10-23T16:22:40Z", "updated_at": "2017-10-24T02:26:48Z", "closed_at": "2017-10-24T02:26:47Z", "author_association": "OWNER", "pull_request": null, "body": "Follow on from #11 ", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/17/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 267516650, "node_id": "MDU6SXNzdWUyNjc1MTY2NTA=", "number": 7, "title": "Framework where by every page is JSON plus a template", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2857392, "label": "Ship first public release"}, "comments": 1, "created_at": "2017-10-23T01:22:03Z", "updated_at": "2017-10-24T02:27:25Z", "closed_at": "2017-10-24T02:27:25Z", "author_association": "OWNER", "pull_request": null, "body": "Every single page of my interface should be implemented as a function that returns JSON.\r\n\r\nI can then build my jinja templates on top of the exact data that would be returned by the API version.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/7/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 268050821, "node_id": "MDU6SXNzdWUyNjgwNTA4MjE=", "number": 29, "title": "Handle bytestring records encoding to JSON", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2857392, "label": "Ship first public release"}, "comments": 1, "created_at": "2017-10-24T14:18:45Z", "updated_at": "2017-10-24T14:59:00Z", "closed_at": "2017-10-24T14:58:47Z", "author_association": "OWNER", "pull_request": null, "body": "http://localhost:8006/northwind-40d049b/Categories.json 500s right now\r\n\r\nThe string representation of one of the values looks like this:\r\n\r\n b\"\\x15\\x1c/\\x00\\x02\\x00\r\n\r\nThis is a bytestring from the database which cannot be naively converted to a unicode string.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/29/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 267741262, "node_id": "MDU6SXNzdWUyNjc3NDEyNjI=", "number": 19, "title": "Efficient url for downloading the raw database file", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2857392, "label": "Ship first public release"}, "comments": 1, "created_at": "2017-10-23T16:52:17Z", "updated_at": "2017-10-25T15:21:16Z", "closed_at": "2017-10-25T15:19:37Z", "author_association": "OWNER", "pull_request": null, "body": "Use Sanic support for steaming large files http://sanic.readthedocs.io/en/latest/sanic/response.html#file-streaming", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/19/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 268590777, "node_id": "MDU6SXNzdWUyNjg1OTA3Nzc=", "number": 41, "title": "Homepage should show summary of databases", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2857392, "label": "Ship first public release"}, "comments": 1, "created_at": "2017-10-26T00:18:11Z", "updated_at": "2017-10-27T04:05:35Z", "closed_at": "2017-10-27T04:05:35Z", "author_association": "OWNER", "pull_request": null, "body": "I sch database should have a name, optional description, download link and a summary of the tables\r\n\r\nFlights.db\r\nFlights and suchlike blah. \r\nURL? License?\r\n577373 rows across 14 tables\r\nairports, routes, airlines... \r\n\r\nTitle of the homepage is derived from the databases or can be manually overridden e. \u201cDatasets of Flights, NHS, Blah...\u201d - or if only one database just the title of that.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/41/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 267517381, "node_id": "MDU6SXNzdWUyNjc1MTczODE=", "number": 10, "title": "Set up Travis", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2859414, "label": "v1 stretch goals"}, "comments": 1, "created_at": "2017-10-23T01:29:07Z", "updated_at": "2017-11-04T23:48:57Z", "closed_at": "2017-11-04T23:48:57Z", "author_association": "OWNER", "pull_request": null, "body": "", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/10/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 268106803, "node_id": "MDU6SXNzdWUyNjgxMDY4MDM=", "number": 32, "title": "Try running SQLite queries in a separate thread", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2859414, "label": "v1 stretch goals"}, "comments": 1, "created_at": "2017-10-24T16:48:42Z", "updated_at": "2017-11-09T14:05:56Z", "closed_at": "2017-11-09T14:05:56Z", "author_association": "OWNER", "pull_request": null, "body": "https://pymotw.com/3/asyncio/executors.html\r\n\r\nWould be good to have some actual benchmarks so I can evaluate if this is worth it or not.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/32/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 267769034, "node_id": "MDU6SXNzdWUyNjc3NjkwMzQ=", "number": 21, "title": "Use Sanic configuration mechanism ", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2859414, "label": "v1 stretch goals"}, "comments": 1, "created_at": "2017-10-23T18:25:14Z", "updated_at": "2017-11-10T20:45:42Z", "closed_at": "2017-11-10T20:45:42Z", "author_association": "OWNER", "pull_request": null, "body": "http://sanic.readthedocs.io/en/latest/sanic/config.html", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/21/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 273163905, "node_id": "MDU6SXNzdWUyNzMxNjM5MDU=", "number": 60, "title": "Rethink how metadata is generated and stored", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2857392, "label": "Ship first public release"}, "comments": 1, "created_at": "2017-11-11T18:01:28Z", "updated_at": "2017-11-11T20:12:17Z", "closed_at": "2017-11-11T20:12:16Z", "author_association": "OWNER", "pull_request": null, "body": "I broke the existing mechanism in 407795b61217205625f2d4e084afbf69f1db781b In order to get unit tests for the sanic app working.\r\n\r\nI think i should ditch the build-metadata.json cache file entirely and calculate the SHA hashes on startup.\r\n\r\nNot sure what to do about the table row counts.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/60/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 273174447, "node_id": "MDU6SXNzdWUyNzMxNzQ0NDc=", "number": 63, "title": "Review design of JSON output", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2857392, "label": "Ship first public release"}, "comments": 1, "created_at": "2017-11-11T20:38:33Z", "updated_at": "2017-11-11T22:20:17Z", "closed_at": "2017-11-11T22:20:17Z", "author_association": "OWNER", "pull_request": null, "body": "", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/63/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 273191608, "node_id": "MDU6SXNzdWUyNzMxOTE2MDg=", "number": 65, "title": "Re-implement ?sql= mode", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2857392, "label": "Ship first public release"}, "comments": 1, "created_at": "2017-11-12T01:47:17Z", "updated_at": "2017-11-12T02:36:37Z", "closed_at": "2017-11-12T02:35:42Z", "author_association": "OWNER", "pull_request": null, "body": "Here's the code I removed:\r\n\r\n async def data(self, request, name, hash):\r\n sql = 'select * from sqlite_master'\r\n custom_sql = False\r\n params = {}\r\n if request.args.get('sql'):\r\n params = request.raw_args\r\n sql = params.pop('sql')\r\n validate_sql_select(sql)\r\n custom_sql = True\r\n rows = await self.execute(name, sql, params)\r\n columns = [r[0] for r in rows.description]\r\n return {\r\n 'database': name,\r\n 'rows': rows,\r\n 'columns': columns,\r\n 'query': {\r\n 'sql': sql,\r\n 'params': params,\r\n }\r\n }, {\r\n 'database_hash': hash,\r\n 'custom_sql': custom_sql,\r\n }\r\n", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/65/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 273191806, "node_id": "MDU6SXNzdWUyNzMxOTE4MDY=", "number": 66, "title": "Show table SQL on table page", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2857392, "label": "Ship first public release"}, "comments": 1, "created_at": "2017-11-12T01:51:23Z", "updated_at": "2017-11-12T21:17:29Z", "closed_at": "2017-11-12T21:17:29Z", "author_association": "OWNER", "pull_request": null, "body": "Let's do the SQL for the table you are looking at, plus SQL for any indexes that mention that table.\r\n\r\nThe page for a view should show the SQL for that view.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/66/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 273121803, "node_id": "MDU6SXNzdWUyNzMxMjE4MDM=", "number": 54, "title": "Views should not attempt to link to records / use rowids", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2857392, "label": "Ship first public release"}, "comments": 1, "created_at": "2017-11-11T05:44:54Z", "updated_at": "2017-11-12T21:29:42Z", "closed_at": "2017-11-12T21:29:33Z", "author_association": "OWNER", "pull_request": null, "body": "http://localhost:8001/parlgov-development-25f9855/view_variable\r\n\r\n\"parlgov-development__view_variable\"", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/54/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 273509159, "node_id": "MDU6SXNzdWUyNzM1MDkxNTk=", "number": 75, "title": "Add --cors argument to serve", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2857392, "label": "Ship first public release"}, "comments": 1, "created_at": "2017-11-13T17:16:19Z", "updated_at": "2017-11-13T18:17:52Z", "closed_at": "2017-11-13T18:17:52Z", "author_association": "OWNER", "pull_request": null, "body": "", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/75/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 272735257, "node_id": "MDU6SXNzdWUyNzI3MzUyNTc=", "number": 51, "title": "Make a proper README", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2857392, "label": "Ship first public release"}, "comments": 1, "created_at": "2017-11-09T21:46:07Z", "updated_at": "2017-11-13T18:44:23Z", "closed_at": "2017-11-13T18:44:23Z", "author_association": "OWNER", "pull_request": null, "body": "Include instructions on building a local Docker container - currently detailed here: https://gist.github.com/simonw/0ea5c960608c2d876e4637a5e48aa95d (those instructions don't work now that we have removed the Dockerfile in favour of a template generated by `datasette publish`)", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/51/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 273296684, "node_id": "MDU6SXNzdWUyNzMyOTY2ODQ=", "number": 74, "title": "Send a 302 redirect to the new hash for hits to old hashes", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2857392, "label": "Ship first public release"}, "comments": 1, "created_at": "2017-11-13T03:00:59Z", "updated_at": "2017-11-13T18:49:59Z", "closed_at": "2017-11-13T18:49:59Z", "author_association": "OWNER", "pull_request": null, "body": "", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/74/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 273596159, "node_id": "MDU6SXNzdWUyNzM1OTYxNTk=", "number": 82, "title": "Post a blog entry announcing it to the world", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2857392, "label": "Ship first public release"}, "comments": 1, "created_at": "2017-11-13T22:10:35Z", "updated_at": "2017-11-14T01:46:10Z", "closed_at": "2017-11-14T01:46:10Z", "author_association": "OWNER", "pull_request": null, "body": "", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/82/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 268592894, "node_id": "MDU6SXNzdWUyNjg1OTI4OTQ=", "number": 43, "title": "While running, server should spot new db files added to its directory ", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2859414, "label": "v1 stretch goals"}, "comments": 1, "created_at": "2017-10-26T00:32:37Z", "updated_at": "2017-11-14T08:25:53Z", "closed_at": "2017-11-14T08:25:37Z", "author_association": "OWNER", "pull_request": null, "body": "Maybe in each request it checks the time and if 5s has elapsed since t last scanned the directory it scans it again\r\n\r\nThis would allow people with dedicated hosting to run the app there and just upload new datasets whenever they want. It would also be very convenient for development.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/43/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 268078453, "node_id": "MDU6SXNzdWUyNjgwNzg0NTM=", "number": 30, "title": "Do something neat with foreign keys", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-10-24T15:29:29Z", "updated_at": "2017-11-14T18:29:08Z", "closed_at": "2017-11-14T18:29:01Z", "author_association": "OWNER", "pull_request": null, "body": "https://www.sqlite.org/pragma.html#pragma_foreign_key_list\r\n\r\nSQLite has robust support for introspecting foreign keys. I could use that to automatically link to the corresponding record from my tables.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/30/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 273816720, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUyNTIyNzYy", "number": 89, "title": "SQL syntax highlighting with CodeMirror", "user": {"value": 15543, "label": "tomdyson"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-11-14T14:43:33Z", "updated_at": "2017-11-15T02:03:01Z", "closed_at": "2017-11-15T02:03:01Z", "author_association": "CONTRIBUTOR", "pull_request": "simonw/datasette/pulls/89", "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/)", "repo": {"value": 107914493, "label": "datasette"}, "type": "pull", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/89/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": 0, "state_reason": null} {"id": 267542338, "node_id": "MDU6SXNzdWUyNjc1NDIzMzg=", "number": 13, "title": "Add a syntax highlighting SQL editor", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-10-23T05:03:33Z", "updated_at": "2017-11-15T02:04:51Z", "closed_at": "2017-11-15T02:04:51Z", "author_association": "OWNER", "pull_request": null, "body": "https://ace.c9.io/#nav=embedding looks like a good option", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/13/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 273998513, "node_id": "MDU6SXNzdWUyNzM5OTg1MTM=", "number": 95, "title": "Allow shorter time limits to be set using a ?_sql_time_limit_ms =20 query string limit", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-11-15T01:02:16Z", "updated_at": "2017-11-15T02:56:13Z", "closed_at": "2017-11-15T02:56:13Z", "author_association": "OWNER", "pull_request": null, "body": "This cannot be greater than the configured time limit.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/95/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 273961179, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUyNjMxNTcw", "number": 94, "title": "Initial add simple prod ready Dockerfile refs #57", "user": {"value": 247192, "label": "macropin"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-11-14T22:09:09Z", "updated_at": "2017-11-15T03:08:04Z", "closed_at": "2017-11-15T03:08:04Z", "author_association": "CONTRIBUTOR", "pull_request": "simonw/datasette/pulls/94", "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```", "repo": {"value": 107914493, "label": "datasette"}, "type": "pull", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/94/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": 0, "state_reason": null} {"id": 274161964, "node_id": "MDU6SXNzdWUyNzQxNjE5NjQ=", "number": 101, "title": "TemplateAssertionError: no filter named 'tojson'", "user": {"value": 450244, "label": "eaubin"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-11-15T13:47:32Z", "updated_at": "2017-11-15T13:48:55Z", "closed_at": "2017-11-15T13:48:55Z", "author_association": "NONE", "pull_request": null, "body": "I get an exception clicking on the table link: \r\n\r\n```\r\n2017-11-15 08:40:10 - (sanic)[ERROR]: Traceback (most recent call last):\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/sanic/app.py\", line 503, in handle_request\r\n response = await response\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/datasette/app.py\", line 155, in get\r\n return await self.view_get(request, name, hash, **kwargs)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/datasette/app.py\", line 219, in view_get\r\n **context,\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/sanic_jinja2/__init__.py\", line 84, in render\r\n return html(self.render_string(template, request, **context))\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/sanic_jinja2/__init__.py\", line 81, in render_string\r\n return self.env.get_template(template).render(**context)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/environment.py\", line 812, in get_template\r\n return self._load_template(name, self.make_globals(globals))\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/environment.py\", line 786, in _load_template\r\n template = self.loader.load(self, name, globals)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/loaders.py\", line 125, in load\r\n code = environment.compile(source, name, filename)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/environment.py\", line 565, in compile\r\n self.handle_exception(exc_info, source_hint=source_hint)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/environment.py\", line 754, in handle_exception\r\n reraise(exc_type, exc_value, tb)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/_compat.py\", line 37, in reraise\r\n raise value.with_traceback(tb)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/datasette/templates/table.html\", line 29, in template\r\n
params = {{ query.params|tojson(4) }}
\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/environment.py\", line 515, in _generate\r\n return generate(source, self, name, filename, defer_init=defer_init)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/compiler.py\", line 62, in generate\r\n generator.visit(node)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/visitor.py\", line 38, in visit\r\n return f(node, *args, **kwargs)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/compiler.py\", line 849, in visit_Template\r\n self.blockvisit(block.body, block_frame)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/compiler.py\", line 492, in blockvisit\r\n self.visit(node, frame)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/visitor.py\", line 38, in visit\r\n return f(node, *args, **kwargs)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/compiler.py\", line 1172, in visit_If\r\n self.blockvisit(node.body, if_frame)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/compiler.py\", line 492, in blockvisit\r\n self.visit(node, frame)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/visitor.py\", line 38, in visit\r\n return f(node, *args, **kwargs)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/compiler.py\", line 1353, in visit_Output\r\n self.visit(argument, frame)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/visitor.py\", line 38, in visit\r\n return f(node, *args, **kwargs)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/compiler.py\", line 1565, in visit_Filter\r\n self.fail('no filter named %r' % node.name, node.lineno)\r\n File \"/Users/e/anaconda3-4.2.0/lib/python3.5/site-packages/jinja2/compiler.py\", line 427, in fail\r\n raise TemplateAssertionError(msg, lineno, self.name, self.filename)\r\njinja2.exceptions.TemplateAssertionError: no filter named 'tojson'\r\n```", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/101/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 274378301, "node_id": "MDU6SXNzdWUyNzQzNzgzMDE=", "number": 109, "title": "Set up readthedocs", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-11-16T02:58:01Z", "updated_at": "2017-11-16T16:53:26Z", "closed_at": "2017-11-16T16:13:56Z", "author_association": "OWNER", "pull_request": null, "body": "", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/109/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 274733145, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUzMjAxOTQ1", "number": 114, "title": "Add spatialite, switch to debian and local build", "user": {"value": 54999, "label": "ingenieroariel"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-11-17T02:37:09Z", "updated_at": "2017-11-17T03:50:52Z", "closed_at": "2017-11-17T03:50:52Z", "author_association": "CONTRIBUTOR", "pull_request": "simonw/datasette/pulls/114", "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.", "repo": {"value": 107914493, "label": "datasette"}, "type": "pull", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/114/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": 0, "state_reason": null} {"id": 274617240, "node_id": "MDU6SXNzdWUyNzQ2MTcyNDA=", "number": 112, "title": "Allow --load-extension to be set via environment variables", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-11-16T18:28:31Z", "updated_at": "2017-11-17T14:19:23Z", "closed_at": "2017-11-17T14:17:27Z", "author_association": "OWNER", "pull_request": null, "body": "This will make it easier to package up datasette in a Docker container with a bunch of pre-compiled extensions without the user having to remember to include all of the options every time.\r\n\r\nClick has a mechanism for this: http://click.pocoo.org/5/options/#multiple-values-from-environment-values", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/112/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 273181020, "node_id": "MDU6SXNzdWUyNzMxODEwMjA=", "number": 64, "title": "Support for ?field__isnull=1 or similar", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-11-11T22:26:52Z", "updated_at": "2017-11-17T14:38:21Z", "closed_at": "2017-11-17T14:38:21Z", "author_association": "OWNER", "pull_request": null, "body": "", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/64/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 274877366, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUzMzA2ODgy", "number": 115, "title": "Add keyboard shortcut to execute SQL query", "user": {"value": 198537, "label": "rgieseke"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-11-17T14:13:33Z", "updated_at": "2017-11-17T15:16:34Z", "closed_at": "2017-11-17T14:22:56Z", "author_association": "CONTRIBUTOR", "pull_request": "simonw/datasette/pulls/115", "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.", "repo": {"value": 107914493, "label": "datasette"}, "type": "pull", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/115/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": 0, "state_reason": null} {"id": 275176094, "node_id": "MDU6SXNzdWUyNzUxNzYwOTQ=", "number": 134, "title": "Filtered table view should show a count", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2919870, "label": "Foreign key edition"}, "comments": 1, "created_at": "2017-11-19T17:26:53Z", "updated_at": "2017-11-19T18:10:49Z", "closed_at": "2017-11-19T18:10:49Z", "author_association": "OWNER", "pull_request": null, "body": "Let's do the thing where we attempt to show an accurate count if it can be done in less than 50ms", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/134/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 274900388, "node_id": "MDExOlB1bGxSZXF1ZXN0MTUzMzI0MzAx", "number": 117, "title": "Don't prevent tabbing to `Run SQL` button", "user": {"value": 198537, "label": "rgieseke"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-11-17T15:27:50Z", "updated_at": "2017-11-19T20:30:24Z", "closed_at": "2017-11-18T00:53:43Z", "author_association": "CONTRIBUTOR", "pull_request": "simonw/datasette/pulls/117", "body": "Mentioned in #115 \r\n\r\nHere you go!", "repo": {"value": 107914493, "label": "datasette"}, "type": "pull", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/117/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": 0, "state_reason": null} {"id": 275175929, "node_id": "MDU6SXNzdWUyNzUxNzU5Mjk=", "number": 132, "title": "Row view is not currently expanding foreign keys", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2919870, "label": "Foreign key edition"}, "comments": 1, "created_at": "2017-11-19T17:24:25Z", "updated_at": "2017-11-23T21:51:51Z", "closed_at": "2017-11-23T21:51:30Z", "author_association": "OWNER", "pull_request": null, "body": "Eg https://sf-trees.now.sh/sf-trees-ebc2ad9/Street_Tree_List/1", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/132/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 276476670, "node_id": "MDU6SXNzdWUyNzY0NzY2NzA=", "number": 147, "title": "Tidy up design of the header of the table page", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2919870, "label": "Foreign key edition"}, "comments": 1, "created_at": "2017-11-23T21:52:58Z", "updated_at": "2017-11-24T22:02:46Z", "closed_at": "2017-11-24T22:02:46Z", "author_association": "OWNER", "pull_request": null, "body": "This is a bit messy:\r\n\r\n\"fatal-police-shootings-data__fatal-police-shootings-data\"\r\n\r\nDepends on #127 ", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/147/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 276704127, "node_id": "MDU6SXNzdWUyNzY3MDQxMjc=", "number": 149, "title": "Update custom SQL results to match new table view header", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2919870, "label": "Foreign key edition"}, "comments": 1, "created_at": "2017-11-24T22:03:59Z", "updated_at": "2017-11-24T22:42:10Z", "closed_at": "2017-11-24T22:42:09Z", "author_association": "OWNER", "pull_request": null, "body": "Follow-on from #147 - the custom SQL results page should more closely match the design of the table view, which now looks like this:\r\n\r\n\"conventional_power_plants_eu__conventional_power_plants_eu__14_rows_where_company____nuon_\"\r\n", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/149/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 267523511, "node_id": "MDU6SXNzdWUyNjc1MjM1MTE=", "number": 12, "title": "Make it so you can override templates", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2949431, "label": "Custom templates edition"}, "comments": 1, "created_at": "2017-10-23T02:25:35Z", "updated_at": "2017-11-30T16:42:46Z", "closed_at": "2017-11-30T16:38:34Z", "author_association": "OWNER", "pull_request": null, "body": "The app will ship with default templates but, just like with the Django admin, you will be able to override them using either explicit configuration settings or just by dropping in templates with certain file names.\r\n\r\nTemplate inheritance should work here, both allowing you to override just the base template and allowing you to customize tiny bits of others.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/12/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 275135535, "node_id": "MDU6SXNzdWUyNzUxMzU1MzU=", "number": 126, "title": "Blog entry announcing foreign key support", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2919870, "label": "Foreign key edition"}, "comments": 1, "created_at": "2017-11-19T06:09:06Z", "updated_at": "2017-11-30T16:49:24Z", "closed_at": "2017-11-30T16:49:24Z", "author_association": "OWNER", "pull_request": null, "body": "", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/126/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 278189708, "node_id": "MDU6SXNzdWUyNzgxODk3MDg=", "number": 156, "title": "Document CSS hooks and custom templates", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2949431, "label": "Custom templates edition"}, "comments": 1, "created_at": "2017-11-30T16:43:15Z", "updated_at": "2017-11-30T17:11:34Z", "closed_at": "2017-11-30T17:10:58Z", "author_association": "OWNER", "pull_request": null, "body": "Documentation currently lives in commit messages on https://github.com/simonw/datasette/commit/8ab3a169d42d096f2c7979c6d3d7746618d30f0b and 3cd06729f457d690603b6060dc552b535517ab09", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/156/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 278190981, "node_id": "MDU6SXNzdWUyNzgxOTA5ODE=", "number": 158, "title": "Ensure default templates are designed to be extended", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2949431, "label": "Custom templates edition"}, "comments": 1, "created_at": "2017-11-30T16:46:41Z", "updated_at": "2017-12-07T05:41:09Z", "closed_at": "2017-12-07T05:41:08Z", "author_association": "OWNER", "pull_request": null, "body": "Since custom templates can do `{% extends \"default:table.html\" %}` the default templates should include sensible named `{% block %}` components designed to support common extension patterns. Since we already support `{{ super() }}` we may not have much if anything to add here.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/158/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 280023225, "node_id": "MDU6SXNzdWUyODAwMjMyMjU=", "number": 166, "title": "Documentation for metadata.json and datasette skeleton", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2949431, "label": "Custom templates edition"}, "comments": 1, "created_at": "2017-12-07T07:02:52Z", "updated_at": "2017-12-07T17:20:35Z", "closed_at": "2017-12-07T17:20:25Z", "author_association": "OWNER", "pull_request": null, "body": "", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/166/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 280662866, "node_id": "MDExOlB1bGxSZXF1ZXN0MTU3MzY1ODEx", "number": 168, "title": "Upgrade to Sanic 0.7.0", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-12-09T01:25:08Z", "updated_at": "2017-12-09T03:00:34Z", "closed_at": "2017-12-09T03:00:34Z", "author_association": "OWNER", "pull_request": "simonw/datasette/pulls/168", "body": "", "repo": {"value": 107914493, "label": "datasette"}, "type": "pull", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/168/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": 0, "state_reason": null} {"id": 280745746, "node_id": "MDU6SXNzdWUyODA3NDU3NDY=", "number": 171, "title": "HTML comments specifying custom templates for page", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2949431, "label": "Custom templates edition"}, "comments": 1, "created_at": "2017-12-09T19:11:13Z", "updated_at": "2017-12-09T21:50:50Z", "closed_at": "2017-12-09T21:48:03Z", "author_association": "OWNER", "pull_request": null, "body": " This would make the custom templating system self-documenting, and save people from having to figure out the right template names for customizing specific pages.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/171/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 280744309, "node_id": "MDU6SXNzdWUyODA3NDQzMDk=", "number": 169, "title": "Release v0.14 with templates and static files features", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2949431, "label": "Custom templates edition"}, "comments": 1, "created_at": "2017-12-09T18:52:48Z", "updated_at": "2017-12-10T02:04:56Z", "closed_at": "2017-12-10T02:04:56Z", "author_association": "OWNER", "pull_request": null, "body": "Everything in this milestone https://github.com/simonw/datasette/milestone/6 - plus various other fixes: https://github.com/simonw/datasette/compare/0.13...6bdfcf60760c27e29ff34692d06e62b36aeecc56\r\n", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/169/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 273878873, "node_id": "MDU6SXNzdWUyNzM4Nzg4NzM=", "number": 91, "title": "Option to serve databases from a different prefix, serve regular content elsewhere", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-11-14T17:32:46Z", "updated_at": "2017-12-10T03:07:58Z", "closed_at": "2017-12-10T03:07:53Z", "author_association": "OWNER", "pull_request": null, "body": "It would be useful if the databases themselves could be served from a prefix e.g.\r\n\r\n datasette serve mydb.db --path-prefix=db\r\n\r\nNow my database is at `http://localhost:8001/db/mydb-23423`\r\n\r\nThis would free up the rest of the URL namespace for other things. Maybe we could have an option to serve static content from a known folder e.g.\r\n\r\n datasette serve mydb.db --path-prefix=db --root-content=~/my-project/static\r\n\r\nNow a hit to `http://localhost:8001/news/` serves content from `~/my-project/static/news/index.html`\r\n\r\nThis would make it trivial to package up entire HTML/CSS/JS apps with one or more underlying SQLite databases. Running without `--cors` would be fine here because any JS apps would be hosted on the same origin.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/91/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 275476839, "node_id": "MDU6SXNzdWUyNzU0NzY4Mzk=", "number": 138, "title": "Per-database and per-table metadata, probably using data-package", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-11-20T19:50:10Z", "updated_at": "2017-12-10T03:08:36Z", "closed_at": "2017-12-10T03:08:26Z", "author_association": "OWNER", "pull_request": null, "body": "Ability to annotate databases and tables with extra metadata describing their purpose, providing source and licensing information and describing individual columns.\r\n\r\nhttp://frictionlessdata.io/specs/data-package/ looks like a great format for this, see #105 ", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/138/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 267515678, "node_id": "MDU6SXNzdWUyNjc1MTU2Nzg=", "number": 3, "title": "Make individual column valuables addressable, with smart content types", "user": {"value": 9599, "label": "simonw"}, "state": "open", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-10-23T01:11:32Z", "updated_at": "2017-12-10T03:11:58Z", "closed_at": null, "author_association": "OWNER", "pull_request": null, "body": "Some SQLite databases embed images in columns. It would be cool if these had URLs.\r\n\r\n /database-name-7sha256/table-name/compound-pk/column\r\n /database-name-7sha256/table-name/compound-pk/column.json\r\n /database-name-7sha256/table-name/compound-pk/column.png\r\n /database-name-7sha256/table-name/compound-pk/column.gif\r\n /database-name-7sha256/table-name/compound-pk/column.txt\r\n\r\nThe one without an explicit file extension auto-detects the correct extension.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/3/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": null} {"id": 282971961, "node_id": "MDU6SXNzdWUyODI5NzE5NjE=", "number": 175, "title": "Add project topic \"automatic-api\"", "user": {"value": 3179832, "label": "dbohdan"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-12-18T18:09:17Z", "updated_at": "2017-12-21T18:33:55Z", "closed_at": "2017-12-21T18:33:55Z", "author_association": "NONE", "pull_request": null, "body": "Hi there! Could you add the ~~tag~~ topic `automatic-api` to your repository? I am [making a list](https://github.com/dbohdan/automatic-api) of all projects that automatically expose APIs to databases. (Your Show HN made me do it. :-) I knew about PostgREST and PostGraphQL, but it took adding Datasette to sell me on the concept.) They will be easier to discover if there is a standard GitHub tag, and `automatic-api` seems as good a candidate as any. Two projects [already use it](https://github.com/topics/automatic-api).", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/175/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 287240246, "node_id": "MDExOlB1bGxSZXF1ZXN0MTYxOTgyNzEx", "number": 178, "title": "If metadata exists, add it to heroku launch command", "user": {"value": 82988, "label": "psychemedia"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-01-09T21:42:21Z", "updated_at": "2018-01-15T09:42:46Z", "closed_at": "2018-01-14T21:05:16Z", "author_association": "CONTRIBUTOR", "pull_request": "simonw/datasette/pulls/178", "body": "The heroku build does seem to make use of any provided `metadata.json` file.\r\n\r\nAdd the `--metadata` switch to the Heroku web launch command if a `metadata.json` file is available.\r\n\r\nAddresses: https://github.com/simonw/datasette/issues/177", "repo": {"value": 107914493, "label": "datasette"}, "type": "pull", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/178/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": 0, "state_reason": null} {"id": 313512748, "node_id": "MDU6SXNzdWUzMTM1MTI3NDg=", "number": 201, "title": "Support explain select / explain query plan select", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-04-11T22:41:26Z", "updated_at": "2018-04-13T21:17:14Z", "closed_at": "2018-04-12T21:32:52Z", "author_association": "OWNER", "pull_request": null, "body": "See https://www.sqlite.org/eqp.html and https://www.sqlite.org/lang_explain.html", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/201/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 314329002, "node_id": "MDExOlB1bGxSZXF1ZXN0MTgxNjQ3NzE3", "number": 207, "title": "Link foreign keys which don't have labels", "user": {"value": 45057, "label": "russss"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-04-14T13:27:14Z", "updated_at": "2018-04-14T15:00:00Z", "closed_at": "2018-04-14T15:00:00Z", "author_association": "CONTRIBUTOR", "pull_request": "simonw/datasette/pulls/207", "body": "This renders unlabeled FKs as simple links. I can't see why this would cause any major problems.\r\n\r\n![image](https://user-images.githubusercontent.com/45057/38768722-ea15a000-3fef-11e8-8664-ffd7aa4894ea.png)\r\n\r\nAlso includes bonus fixes for two minor issues:\r\n\r\n* In foreign key link hrefs the primary key was escaped using HTML escaping rather than URL escaping. This broke some non-integer PKs.\r\n* Print tracebacks to console when handling 500 errors.", "repo": {"value": 107914493, "label": "datasette"}, "type": "pull", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/207/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": 0, "state_reason": null} {"id": 315517578, "node_id": "MDU6SXNzdWUzMTU1MTc1Nzg=", "number": 224, "title": "Ability for plugins to bundle templates", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-04-18T14:57:53Z", "updated_at": "2018-04-19T05:50:36Z", "closed_at": "2018-04-19T05:50:36Z", "author_association": "OWNER", "pull_request": null, "body": "Plugins should be able to bundle templates.\r\n\r\nThe Datasette template loader should then consult those plugins first when loading a template.\r\n\r\nJinja2 has a `PackageLoader` class that can help with this: http://jinja.pocoo.org/docs/2.10/api/#jinja2.PackageLoader\r\n\r\nRefs #14", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/224/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 316365426, "node_id": "MDExOlB1bGxSZXF1ZXN0MTgzMTM1NjA0", "number": 232, "title": "Fix a typo", "user": {"value": 45281, "label": "lsb"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-04-20T18:20:04Z", "updated_at": "2018-04-21T00:19:08Z", "closed_at": "2018-04-21T00:19:08Z", "author_association": "CONTRIBUTOR", "pull_request": "simonw/datasette/pulls/232", "body": "It looks like this was the only instance of it: https://github.com/simonw/datasette/search?utf8=%E2%9C%93&q=SOLite&type=", "repo": {"value": 107914493, "label": "datasette"}, "type": "pull", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/232/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": 0, "state_reason": null} {"id": 316031566, "node_id": "MDU6SXNzdWUzMTYwMzE1NjY=", "number": 228, "title": "If spatialite detected, mark idx_XXX_Geometry tables as hidden", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-04-19T20:37:24Z", "updated_at": "2018-04-26T03:25:39Z", "closed_at": "2018-04-26T03:25:39Z", "author_association": "OWNER", "pull_request": null, "body": "https://timezones-api.now.sh/timezones-faf26d0\r\n\r\n![2018-04-19 at 1 36 pm](https://user-images.githubusercontent.com/9599/39016906-a5acbb3e-43d6-11e8-9a31-814ff1d0022e.png)\r\n\r\nNeed to update this logic:\r\n\r\nhttps://github.com/simonw/datasette/blob/e2750c7cc0585adaa8c866be611089e62961ee35/datasette/app.py#L1276-L1288", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/228/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 316128955, "node_id": "MDU6SXNzdWUzMTYxMjg5NTU=", "number": 230, "title": "Setting page size AND max returned rows to 1000 doesn't seem to work", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-04-20T05:05:11Z", "updated_at": "2018-04-26T04:04:25Z", "closed_at": "2018-04-26T04:04:25Z", "author_association": "OWNER", "pull_request": null, "body": "It appears that if the two settings are the same Datasette fails to return any results, probably because of the trick where we try to fetch 1001 rows so we know if there's a next page.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/230/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 316123256, "node_id": "MDU6SXNzdWUzMTYxMjMyNTY=", "number": 229, "title": "Table view should support ?_size=400 parameter", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-04-20T04:23:18Z", "updated_at": "2018-04-26T04:49:46Z", "closed_at": "2018-04-26T04:48:32Z", "author_association": "OWNER", "pull_request": null, "body": "Allows callers to request more rows at once. The limit will still be `max_returned_rows` (defaults to 1000).", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/229/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 318738000, "node_id": "MDU6SXNzdWUzMTg3MzgwMDA=", "number": 244, "title": "/-/versions page", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-04-29T18:22:15Z", "updated_at": "2018-05-03T14:13:49Z", "closed_at": "2018-05-03T14:09:53Z", "author_association": "OWNER", "pull_request": null, "body": "Displays the current version of:\r\n\r\n* datasette\r\n* Python\r\n* SQLite\r\n* Spatialite (if available)\r\n\r\nInstalled plugin versions should be shown on /-/plugins", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/244/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 319358200, "node_id": "MDU6SXNzdWUzMTkzNTgyMDA=", "number": 245, "title": "?_shape=array option", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-05-01T23:11:07Z", "updated_at": "2018-05-03T14:14:33Z", "closed_at": "2018-05-02T00:12:20Z", "author_association": "OWNER", "pull_request": null, "body": "Some tools (`pandas.DataFrame(...)` for example) are happiest when you give them a raw array of JSON objects.\r\n\r\n`?_shape=array` should do just that\r\n\r\nWhile I'm at it, rename the default `?_shape=lists` to instead be called `?shape=arrays`\r\n\r\nAnd validate that `_shape` is a valid option\r\n\r\nAnd have `?_shape=object` return the object at the root level rather than nested in `.rows` to better match the behavior of `?_shape=array`", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/245/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 320090329, "node_id": "MDU6SXNzdWUzMjAwOTAzMjk=", "number": 249, "title": "?_size=max argument ", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-05-03T21:42:04Z", "updated_at": "2018-05-04T18:26:30Z", "closed_at": "2018-05-04T18:05:04Z", "author_association": "OWNER", "pull_request": null, "body": "For plugins that want to load the most data allowable, having `?_size=max` would be useful.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/249/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 321631020, "node_id": "MDU6SXNzdWUzMjE2MzEwMjA=", "number": 253, "title": "Documentation explaining how to use SQLite FTS with Datasette", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-05-09T16:02:08Z", "updated_at": "2018-05-12T12:09:02Z", "closed_at": "2018-05-12T12:06:51Z", "author_association": "OWNER", "pull_request": null, "body": "In particular how to work with https://www.sqlite.org/fts3.html#_external_content_fts4_tables_ - which Datasette can automatically detect and use to add a search UI to your page.\r\n\r\nExamples of basic search setup like this:\r\n\r\n```\r\nCREATE VIRTUAL TABLE \"interests_fts\"\r\n USING FTS4 (name, content=\"interests\");\r\nINSERT INTO \"interests_fts\" (rowid, name)\r\n SELECT rowid, name FROM interests;\r\n```\r\n\r\nAnd complex join-based search setup like this:\r\n\r\n```\r\nCREATE VIRTUAL TABLE \"interests_fts\"\r\n USING FTS4 (name, category, member, content=\"interests\");\r\nINSERT INTO \"interests_fts\" (rowid, name, category, member)\r\n SELECT interests.rowid, interests.name, interest_categories.name, members.name\r\n FROM interests\r\n JOIN interest_categories ON interests.category_id = interest_categories.id\r\n JOIN members ON interests.member_id = members.id;\r\n```\r\n\r\nAlso mention how `csvs-to-sqlite` can be used to do this easily.\r\n\r\nThis will benefit from #252 ", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/253/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 322551723, "node_id": "MDU6SXNzdWUzMjI1NTE3MjM=", "number": 256, "title": "Break up app.py into separate view modules", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-05-12T23:56:33Z", "updated_at": "2018-05-14T03:05:37Z", "closed_at": "2018-05-14T03:05:37Z", "author_association": "OWNER", "pull_request": null, "body": "`views/table.py` and `views/database.py` and `views/utils.py` as a starting point.\r\n\r\nLikewise, create `tests/test_views_table.py` and `tests/test_views_database.py` - these will contain both HTML and API test for those views.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/256/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 323673899, "node_id": "MDU6SXNzdWUzMjM2NzM4OTk=", "number": 264, "title": "Make it possible to customize various facet settings", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-05-16T15:31:34Z", "updated_at": "2018-05-18T06:18:00Z", "closed_at": "2018-05-18T05:11:52Z", "author_association": "OWNER", "pull_request": null, "body": "The new Facets implementation from #255 includes several hard-coded settings which should be made configurable somehow:\r\n\r\nNumber of rows to return in a facet (maybe this should also be an option that can be set via quersytring argument, e.g. `?_facet=qSpecies:40`):\r\n\r\nhttps://github.com/simonw/datasette/blob/9959a9e4deec8e3e178f919e8b494214d5faa7fd/datasette/views/table.py#L539\r\n\r\nTime limit for executing a facet:\r\n\r\nhttps://github.com/simonw/datasette/blob/9959a9e4deec8e3e178f919e8b494214d5faa7fd/datasette/views/table.py#L559-L562\r\n\r\nMaximum unique values returned in order for a column to be suggested as a facet:\r\n\r\nhttps://github.com/simonw/datasette/blob/9959a9e4deec8e3e178f919e8b494214d5faa7fd/datasette/views/table.py#L646-L647\r\n\r\nTime limit for calculating if a column should be a suggested facet:\r\n\r\nhttps://github.com/simonw/datasette/blob/9959a9e4deec8e3e178f919e8b494214d5faa7fd/datasette/views/table.py#L664-L667\r\n", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/264/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 323830051, "node_id": "MDU6SXNzdWUzMjM4MzAwNTE=", "number": 270, "title": "--limit= CLI option for setting limits", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-05-17T00:14:24Z", "updated_at": "2018-05-18T06:19:31Z", "closed_at": "2018-05-18T06:16:39Z", "author_association": "OWNER", "pull_request": null, "body": "#264 calls for four new datasette limit options, on top of the two existing ones:\r\n\r\n* `--max_returned_rows`\r\n* `--sql_time_limit_ms`\r\n\r\nThese are already clogging up `datasette serve --help` a bit.\r\n\r\nHow about this syntax instead?\r\n\r\n datasette --limit max_returned_rows:100 \\\r\n --limit facet_timeout_ms:500 demo.db\r\n\r\nThen we can add as many new user over-rideable limits as we like without clogging up `--help` too much - though it would be good to have a way of optionally listings their documentation as well.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/270/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 319449852, "node_id": "MDU6SXNzdWUzMTk0NDk4NTI=", "number": 247, "title": "SQLite code decoupled from Datasette", "user": {"value": 11912854, "label": "jsancho-gpl"}, "state": "open", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-05-02T08:03:28Z", "updated_at": "2018-05-21T15:29:31Z", "closed_at": null, "author_association": "NONE", "pull_request": null, "body": "I'm working on the possibility of use Datasette with other file formats that aren't SQLite, like files with [PyTables](https://github.com/PyTables/PyTables) format.\r\n\r\nIn order to accomplish that, I've started [a fork for decoupling the code related with SQLite](https://github.com/jsancho-gpl/datasette/tree/feature/db-type-plugin) and putting it in an external connector to allow future connectors for a lot of file formats.\r\n\r\nIt'd be nice if you could look at it and suggest improvements for a possible PR.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/247/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": null} {"id": 325705981, "node_id": "MDU6SXNzdWUzMjU3MDU5ODE=", "number": 282, "title": "Faceting breaks pagination", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-05-23T13:29:47Z", "updated_at": "2018-05-23T13:53:39Z", "closed_at": "2018-05-23T13:42:07Z", "author_association": "OWNER", "pull_request": null, "body": "e.g. on https://fivethirtyeight.datasettes.com/fivethirtyeight-5de27e3/nba-elo%2Fnbaallelo?_facet=lg_id#facet-lg_id - click the \"next page\" link: https://fivethirtyeight.datasettes.com/fivethirtyeight-5de27e3/nba-elo%2Fnbaallelo?_facet=lg_id&_next=100\r\n\r\n Invalid SQL: near \"and\": syntax error", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/282/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 325553991, "node_id": "MDExOlB1bGxSZXF1ZXN0MTg5ODYwMDUy", "number": 281, "title": "Reduces image size using Alpine + Multistage (re: #278)", "user": {"value": 487897, "label": "iMerica"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-05-23T05:27:05Z", "updated_at": "2018-05-26T02:10:38Z", "closed_at": "2018-05-26T02:10:38Z", "author_association": "NONE", "pull_request": "simonw/datasette/pulls/281", "body": "Hey Simon! \r\n\r\nI got the image size down from 256MB to 110MB. \r\n\r\nSeems to be working okay, but you might want to test it a bit more.\r\n\r\nExample output of `docker run --rm -it datasette`\r\n```\r\nServe! files=() on port 8001\r\n[2018-05-23 05:23:08 +0000] [1] [INFO] Goin' Fast @ http://127.0.0.1:8001\r\n[2018-05-23 05:23:08 +0000] [1] [INFO] Starting worker [1]\r\n```\r\n\r\nRelated: https://github.com/simonw/datasette/issues/278\r\n", "repo": {"value": 107914493, "label": "datasette"}, "type": "pull", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/281/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": 0, "state_reason": null} {"id": 326617744, "node_id": "MDU6SXNzdWUzMjY2MTc3NDQ=", "number": 287, "title": "?_shape=arrayfirst", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-05-25T18:11:03Z", "updated_at": "2018-05-27T00:32:53Z", "closed_at": "2018-05-27T00:32:29Z", "author_association": "OWNER", "pull_request": null, "body": "Return an array of single items (the first item in each row returned from the SQL query).", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/287/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 274884209, "node_id": "MDU6SXNzdWUyNzQ4ODQyMDk=", "number": 116, "title": "Add documentation section about SQLite extensions", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-11-17T14:36:30Z", "updated_at": "2018-05-28T17:23:42Z", "closed_at": "2018-05-28T17:23:41Z", "author_association": "OWNER", "pull_request": null, "body": "", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/116/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 268087542, "node_id": "MDU6SXNzdWUyNjgwODc1NDI=", "number": 31, "title": "Idea: colour scheme based on sha256 of db", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 2859414, "label": "v1 stretch goals"}, "comments": 1, "created_at": "2017-10-24T15:52:38Z", "updated_at": "2018-05-28T18:10:45Z", "closed_at": "2017-11-09T14:14:59Z", "author_association": "OWNER", "pull_request": null, "body": "", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/31/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 273127443, "node_id": "MDU6SXNzdWUyNzMxMjc0NDM=", "number": 56, "title": "Easy way to block search engine crawling in robots.txt", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-11-11T07:46:07Z", "updated_at": "2018-05-28T20:50:25Z", "closed_at": "2018-05-28T20:50:24Z", "author_association": "OWNER", "pull_request": null, "body": "For people who don't want their datasets to be crawled by search engines.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/56/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 327420945, "node_id": "MDU6SXNzdWUzMjc0MjA5NDU=", "number": 297, "title": "datasette publish Dockerfile should use python:3.6-slim-stretch", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-05-29T17:40:08Z", "updated_at": "2018-05-31T14:44:37Z", "closed_at": "2018-05-31T14:44:37Z", "author_association": "OWNER", "pull_request": null, "body": "Right now the Dockerfile generated by `datasette package` and `datasette publish` uses this:\r\n\r\nhttps://github.com/simonw/datasette/blob/b0a95da96386ddf99816911e08df86178ffa9a89/datasette/utils.py#L269\r\n\r\nThis appears to result in a SQLite version of `3.8.7.1` - https://parlgov.datasettes.com/-/versions\r\n\r\n```\r\n \"sqlite\": {\r\n \"extensions\": {},\r\n \"fts_versions\": [\r\n \"FTS4\",\r\n \"FTS3\"\r\n ],\r\n \"version\": \"3.8.7.1\"\r\n }\r\n```\r\n\r\nMeanwhile, https://fivethirtyeight.datasettes.com/-/versions is deployed with this Dockerfile https://github.com/simonw/fivethirtyeight-datasette/blob/0849901cae06e957fe04892cd4033bdcd1fcf966/Dockerfile which uses `FROM python:3.6-slim-stretch` and results in the following version report:\r\n\r\n```\r\n \"sqlite\": {\r\n \"extensions\": {\r\n \"json1\": null\r\n },\r\n \"fts_versions\": [\r\n \"FTS5\",\r\n \"FTS4\",\r\n \"FTS3\"\r\n ],\r\n \"version\": \"3.16.2\"\r\n }\r\n```\r\n\r\nSo not only do we get a more recent SQLite (including https://www.sqlite.org/rowvalue.html added in 3.15) but we also get `FTS5` and `json1` as well.\r\n\r\nRefs #191 ", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/297/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 330323860, "node_id": "MDExOlB1bGxSZXF1ZXN0MTkzMzYxMzQx", "number": 307, "title": "Initial sketch of custom URL routing, refs #306", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-06-07T15:26:48Z", "updated_at": "2018-06-07T15:29:54Z", "closed_at": "2018-06-07T15:29:41Z", "author_association": "OWNER", "pull_request": "simonw/datasette/pulls/307", "body": "See #306 for background on this.", "repo": {"value": 107914493, "label": "datasette"}, "type": "pull", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/307/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": 0, "state_reason": null} {"id": 333096176, "node_id": "MDU6SXNzdWUzMzMwOTYxNzY=", "number": 314, "title": "HTML table does not correctly display entirely blank rows", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": {"value": 3439337, "label": "0.23.1"}, "comments": 1, "created_at": "2018-06-17T21:58:06Z", "updated_at": "2018-06-21T16:04:59Z", "closed_at": "2018-06-21T15:26:26Z", "author_association": "OWNER", "pull_request": null, "body": "https://958b75c.datasette.io/fixtures-35b6eb6/simple_view\r\n\r\n![2018-06-17 at 2 56 pm](https://user-images.githubusercontent.com/9599/41512541-b52e90be-723e-11e8-95c9-7d091738d5cc.png)\r\n\r\nhttps://958b75c.datasette.io/fixtures-35b6eb6/simple_view.json shows the underlying data:\r\n\r\n```\r\n \"rows\": [\r\n [\r\n \"hello\",\r\n \"HELLO\"\r\n ],\r\n [\r\n \"world\",\r\n \"WORLD\"\r\n ],\r\n [\r\n \"\",\r\n \"\"\r\n ]\r\n ]\r\n```", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/314/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 335064777, "node_id": "MDU6SXNzdWUzMzUwNjQ3Nzc=", "number": 325, "title": "Error on row page if table has slashes in the name and ends in .csv", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-06-23T03:43:42Z", "updated_at": "2018-07-09T17:28:27Z", "closed_at": "2018-07-08T05:21:59Z", "author_association": "OWNER", "pull_request": null, "body": "https://v0-23-1.datasette.io/fixtures-e14e080/table%252Fwith%252Fslashes.csv/3\r\n\r\n> no such table: table%252Fwith%252Fslashes.csv\r\n\r\nFrom clicking the row link on https://v0-23-1.datasette.io/fixtures-e14e080/table%2Fwith%2Fslashes.csv", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/325/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 334698969, "node_id": "MDU6SXNzdWUzMzQ2OTg5Njk=", "number": 323, "title": "Speed up Travis CI builds", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-06-21T23:55:27Z", "updated_at": "2018-07-10T15:03:37Z", "closed_at": "2018-07-10T15:03:36Z", "author_association": "OWNER", "pull_request": null, "body": "They've got a bit slow. Part of this is the Zeit Now deploy, but the build-and-test cycle is taking at least a couple of minutes.\r\n\r\n![2018-06-21 at 4 54 pm](https://user-images.githubusercontent.com/9599/41751010-e48c823e-7573-11e8-88f3-7aa8a7e53917.png)\r\n", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/323/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 275939188, "node_id": "MDU6SXNzdWUyNzU5MzkxODg=", "number": 143, "title": "Mechanism for \"suggested visualizations\"", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-11-22T04:10:25Z", "updated_at": "2018-07-10T17:48:34Z", "closed_at": "2018-07-10T17:48:34Z", "author_association": "OWNER", "pull_request": null, "body": " Each visualization should have a way of deciding if it might be appropriate for the current view of data. \r\n\r\n We can then offer a \"suggested visualizations\" prompt which shows previews.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/143/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 273709194, "node_id": "MDU6SXNzdWUyNzM3MDkxOTQ=", "number": 87, "title": "Configure Travis to release new tags to PyPI", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-11-14T08:44:08Z", "updated_at": "2018-07-10T17:49:13Z", "closed_at": "2018-07-10T17:49:12Z", "author_association": "OWNER", "pull_request": null, "body": "https://docs.travis-ci.com/user/deployment/pypi/", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/87/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 340065374, "node_id": "MDU6SXNzdWUzNDAwNjUzNzQ=", "number": 337, "title": "Documentation for datasette publish and datasette package", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-07-11T02:04:06Z", "updated_at": "2018-07-11T02:07:32Z", "closed_at": "2018-07-11T02:05:56Z", "author_association": "OWNER", "pull_request": null, "body": "", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/337/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 340282796, "node_id": "MDU6SXNzdWUzNDAyODI3OTY=", "number": 338, "title": "Only load vegaEmbed if charting tools are enabled", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-07-11T15:02:14Z", "updated_at": "2018-07-11T15:21:47Z", "closed_at": "2018-07-11T15:21:47Z", "author_association": "OWNER", "pull_request": null, "body": "vegaEmbed is a LOT of code (it bundles d3)\r\n\r\nInspired by this tweet: https://twitter.com/thelarkinn/status/1017053567641948162 - it would be great if we loaded that code on demand the first time the \"Show chart options\" button was clicked, or when the page loads with #g. options in the URL.\r\n\r\nEven better: avoid the overhead if loading React unless the chart options need to be displayed. This would be a pretty major refactoring though.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/338/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 341229113, "node_id": "MDU6SXNzdWUzNDEyMjkxMTM=", "number": 344, "title": "datasette publish heroku fails without name provided", "user": {"value": 45057, "label": "russss"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-07-14T11:15:56Z", "updated_at": "2018-07-14T13:00:48Z", "closed_at": "2018-07-14T13:00:48Z", "author_association": "CONTRIBUTOR", "pull_request": null, "body": "It fails with the following JSON traceback if the `-n` option isn't provided, despite the fact that the command line help says that's not needed for heroku publishes.\r\n\r\n
\r\n\r\n```\r\nTraceback (most recent call last):\r\n File \"/usr/local/bin/datasette\", line 11, in \r\n sys.exit(cli())\r\n File \"/usr/local/lib/python3.6/site-packages/click/core.py\", line 722, in __call__\r\n return self.main(*args, **kwargs)\r\n File \"/usr/local/lib/python3.6/site-packages/click/core.py\", line 697, in main\r\n rv = self.invoke(ctx)\r\n File \"/usr/local/lib/python3.6/site-packages/click/core.py\", line 1066, in invoke\r\n return _process_result(sub_ctx.command.invoke(sub_ctx))\r\n File \"/usr/local/lib/python3.6/site-packages/click/core.py\", line 895, in invoke\r\n return ctx.invoke(self.callback, **ctx.params)\r\n File \"/usr/local/lib/python3.6/site-packages/click/core.py\", line 535, in invoke\r\n return callback(*args, **kwargs)\r\n File \"/usr/local/lib/python3.6/site-packages/datasette/cli.py\", line 265, in publish\r\n app_name = json.loads(create_output)[\"name\"]\r\n File \"/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/__init__.py\", line 354, in loads\r\n return _default_decoder.decode(s)\r\n File \"/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/decoder.py\", line 339, in decode\r\n obj, end = self.raw_decode(s, idx=_w(s, 0).end())\r\n File \"/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json/decoder.py\", line 357, in raw_decode\r\n raise JSONDecodeError(\"Expecting value\", s, err.value) from None\r\njson.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)\r\n```\r\n\r\n
", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/344/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 341235633, "node_id": "MDExOlB1bGxSZXF1ZXN0MjAxNDUxMzMy", "number": 345, "title": "Allow app names for `datasette publish heroku`", "user": {"value": 45057, "label": "russss"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-07-14T13:12:34Z", "updated_at": "2018-07-14T14:09:54Z", "closed_at": "2018-07-14T14:04:44Z", "author_association": "CONTRIBUTOR", "pull_request": "simonw/datasette/pulls/345", "body": "Lets you supply the `-n` parameter for Heroku deploys, which also lets you update existing Heroku deployments.", "repo": {"value": 107914493, "label": "datasette"}, "type": "pull", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/345/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": 0, "state_reason": null} {"id": 341228846, "node_id": "MDU6SXNzdWUzNDEyMjg4NDY=", "number": 343, "title": "Render boolean fields better by default", "user": {"value": 45057, "label": "russss"}, "state": "open", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-07-14T11:10:29Z", "updated_at": "2018-07-14T14:17:14Z", "closed_at": null, "author_association": "CONTRIBUTOR", "pull_request": null, "body": "These show up as 0 or 1 because sqlite. I think Yes/No would be fine in most cases?", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/343/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": null} {"id": 334169932, "node_id": "MDU6SXNzdWUzMzQxNjk5MzI=", "number": 320, "title": "Need unit tests covering the different states for the advanced export box", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-06-20T17:03:40Z", "updated_at": "2018-07-24T04:53:20Z", "closed_at": "2018-07-24T03:38:40Z", "author_association": "OWNER", "pull_request": null, "body": "There are quite a few variants of this box:\r\n\r\n![2018-06-20 at 10 02 am](https://user-images.githubusercontent.com/9599/41673229-1d423adc-7471-11e8-99d4-4251f7d03aa5.png)\r\n\r\nTest coverage should exercise all of them, since the logic is a little unclear.\r\n\r\nhttps://github.com/simonw/datasette/blob/fdfbbbb9ee0d02fd4d43dfc42382252fa2287d6d/datasette/templates/table.html#L140-L159", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/320/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 344695978, "node_id": "MDExOlB1bGxSZXF1ZXN0MjA0MDI5MTQy", "number": 349, "title": "publish_subcommand hook + default plugins mechanism, used for publish heroku/now", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-07-26T05:03:22Z", "updated_at": "2018-07-26T05:28:54Z", "closed_at": "2018-07-26T05:16:00Z", "author_association": "OWNER", "pull_request": "simonw/datasette/pulls/349", "body": "This change introduces a new plugin hook, publish_subcommand, which can be\r\nused to implement new subcommands for the \"datasette publish\" command family.\r\n\r\nI've used this new hook to refactor out the \"publish now\" and \"publish heroku\"\r\nimplementations into separate modules. I've also added unit tests for these\r\ntwo publishers, mocking the subprocess.call and subprocess.check_output\r\nfunctions.\r\n\r\nAs part of this, I introduced a mechanism for loading default plugins. These\r\nare defined in the new \"default_plugins\" list inside datasette/app.py\r\n\r\nCloses #217 (Plugin support for \"datasette publish\")\r\nCloses #348 (Unit tests for \"datasette publish\")\r\nRefs #14, #59, #102, #103, #146, #236, #347", "repo": {"value": 107914493, "label": "datasette"}, "type": "pull", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/349/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": 0, "state_reason": null} {"id": 314725342, "node_id": "MDU6SXNzdWUzMTQ3MjUzNDI=", "number": 217, "title": "Plugin support for datasette publish", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-04-16T16:17:14Z", "updated_at": "2018-07-26T05:33:39Z", "closed_at": "2018-07-26T05:16:00Z", "author_association": "OWNER", "pull_request": null, "body": "It should be possible to support additional deployment options by writing a plugin (see #59).\r\n\r\nAs part of this, rewrite the Heroku and Now publishers to be implemented as plugins (they will still ship with datasette by default).\r\n\r\nMaybe `datasette package` should be changed to being part of publish instead, `datasette publish docker` perhaps? \r\n\r\nRefs #14", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/217/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 344656114, "node_id": "MDU6SXNzdWUzNDQ2NTYxMTQ=", "number": 348, "title": "Unit tests for \"datasette publish\"", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-07-26T00:52:23Z", "updated_at": "2018-07-26T05:46:10Z", "closed_at": "2018-07-26T05:46:10Z", "author_association": "OWNER", "pull_request": null, "body": "The datasette publish family of commands all work by shelling out to heroku/now/docker\r\n\r\n from subprocess import call, check_output\r\n\r\nSo in tests I should be able to mock those calls:\r\n\r\n @mock.patch('subprocess.call')\r\n", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/348/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 327461381, "node_id": "MDU6SXNzdWUzMjc0NjEzODE=", "number": 299, "title": "Documentation covering ALL datasette URLs", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-05-29T19:46:15Z", "updated_at": "2018-07-28T04:24:05Z", "closed_at": "2018-07-28T04:22:30Z", "author_association": "OWNER", "pull_request": null, "body": "Relates to #296. We need a single page of the docs listing all of the URL patterns Datasette responds to, also detailing which templates are used to render them and linking to examples of the JSON they output when called with `.json`.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/299/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 281197863, "node_id": "MDU6SXNzdWUyODExOTc4NjM=", "number": 174, "title": "License/Source in footer should inherit from top level", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-12-11T23:01:35Z", "updated_at": "2018-08-11T17:46:51Z", "closed_at": "2018-08-11T17:46:51Z", "author_association": "OWNER", "pull_request": null, "body": "The footer on https://vice-police-shootings.now.sh/vice-bc7c892/ViceNews_FullOISData does not show license and source information... but that Datasette has that information, it's just defined at the top level: https://vice-police-shootings.now.sh/\r\n\r\nThe footer for a row/table page should fall back on information for the database, and if there is none for the database it should fall back on the top-level metadata instead.", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/174/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 355299310, "node_id": "MDExOlB1bGxSZXF1ZXN0MjExODYwNzA2", "number": 363, "title": "Search all apps during heroku publish", "user": {"value": 436032, "label": "kevboh"}, "state": "open", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-08-29T19:25:10Z", "updated_at": "2018-08-31T14:39:45Z", "closed_at": null, "author_association": "FIRST_TIME_CONTRIBUTOR", "pull_request": "simonw/datasette/pulls/363", "body": "Adds the `-A` option to include apps from all organizations when searching app names for publish.", "repo": {"value": 107914493, "label": "datasette"}, "type": "pull", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/363/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": 0, "state_reason": null} {"id": 326987229, "node_id": "MDExOlB1bGxSZXF1ZXN0MTkwOTAxNDI5", "number": 293, "title": "Support for external database connectors", "user": {"value": 11912854, "label": "jsancho-gpl"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-05-28T11:02:45Z", "updated_at": "2018-09-11T14:32:45Z", "closed_at": "2018-09-11T14:32:45Z", "author_association": "FIRST_TIME_CONTRIBUTOR", "pull_request": "simonw/datasette/pulls/293", "body": "I think it would be nice that Datasette could work with 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\nThese external connectors must have a structure similar to the structure [PyTables Datasette connector](https://github.com/PyTables/datasette-pytables) has.", "repo": {"value": 107914493, "label": "datasette"}, "type": "pull", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/293/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": 0, "state_reason": null} {"id": 392610803, "node_id": "MDU6SXNzdWUzOTI2MTA4MDM=", "number": 391, "title": "Google Trends example doesn\u2019t work", "user": {"value": 229881, "label": "styfle"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-12-19T13:51:38Z", "updated_at": "2019-01-02T19:45:13Z", "closed_at": "2019-01-02T19:45:12Z", "author_association": "NONE", "pull_request": null, "body": "https://google-trends.datasettes.com/\r\n\r\nI see a cloud flare error. ", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/391/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 397098882, "node_id": "MDU6SXNzdWUzOTcwOTg4ODI=", "number": 396, "title": "Add pragma compile_options output to /-/versions", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2019-01-08T21:43:54Z", "updated_at": "2019-01-11T00:55:22Z", "closed_at": "2019-01-11T00:44:56Z", "author_association": "OWNER", "pull_request": null, "body": "```\r\nsqlite> pragma compile_options\r\n ...> ;\r\nBUG_COMPATIBLE_20160819\r\nCOMPILER=clang-9.0.0\r\nDEFAULT_CACHE_SIZE=2000\r\nDEFAULT_CKPTFULLFSYNC\r\nDEFAULT_JOURNAL_SIZE_LIMIT=32768\r\nDEFAULT_PAGE_SIZE=4096\r\nDEFAULT_SYNCHRONOUS=2\r\nDEFAULT_WAL_SYNCHRONOUS=1\r\nENABLE_API_ARMOR\r\nENABLE_COLUMN_METADATA\r\nENABLE_DBSTAT_VTAB\r\nENABLE_FTS3\r\nENABLE_FTS3_PARENTHESIS\r\nENABLE_FTS3_TOKENIZER\r\nENABLE_FTS4\r\nENABLE_FTS5\r\nENABLE_JSON1\r\nENABLE_LOCKING_STYLE=1\r\nENABLE_PREUPDATE_HOOK\r\nENABLE_RTREE\r\nENABLE_SESSION\r\nENABLE_SNAPSHOT\r\nENABLE_SQLLOG\r\nENABLE_UNKNOWN_SQL_FUNCTION\r\nENABLE_UPDATE_DELETE_LIMIT\r\nHAVE_ISNAN\r\nMAX_LENGTH=2147483645\r\nMAX_MMAP_SIZE=1073741824\r\nMAX_VARIABLE_NUMBER=500000\r\nOMIT_AUTORESET\r\nOMIT_LOAD_EXTENSION\r\nSTMTJRNL_SPILL=131072\r\nTHREADSAFE=2\r\nUSE_URI\r\nsqlite>\r\n```", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/396/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 403624090, "node_id": "MDU6SXNzdWU0MDM2MjQwOTA=", "number": 6, "title": "\"sqlite-utils insert\" should support newline-delimited JSON", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2019-01-28T02:00:02Z", "updated_at": "2019-01-28T02:17:45Z", "closed_at": "2019-01-28T02:17:45Z", "author_association": "OWNER", "pull_request": null, "body": "We can already export newline delimited JSON. We should learn to import it as well.\r\n\r\nThe neat thing about importing it is that you can import GBs of data without having to read the whole lot into memory in order to decode the wrapping JSON array.\r\n\r\nDatasette can export it now: https://github.com/simonw/datasette/issues/405\r\n\r\nDemo: https://latest.datasette.io/fixtures/facetable.json?_shape=array&_nl=on\r\n\r\nIt should be possible to do this:\r\n\r\n $ curl \"https://latest.datasette.io/fixtures/facetable.json?_shape=array&_nl=on\" \\\r\n | sqlite-utils insert data.db facetable - --nl\r\n", "repo": {"value": 140912432, "label": "sqlite-utils"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/sqlite-utils/issues/6/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 407073223, "node_id": "MDExOlB1bGxSZXF1ZXN0MjUwNjI4Mjc1", "number": 407, "title": "Heroku --include-vcs-ignore", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2019-02-06T04:06:20Z", "updated_at": "2019-02-06T04:31:30Z", "closed_at": "2019-02-06T04:15:47Z", "author_association": "OWNER", "pull_request": "simonw/datasette/pulls/407", "body": "Should mean `datasette publish heroku` can work under Travis, unlike this failure:\r\n\r\nhttps://travis-ci.org/simonw/fivethirtyeight-datasette/builds/488047550\r\n\r\n```\r\n2.25s$ datasette publish heroku fivethirtyeight.db -m metadata.json -n fivethirtyeight-datasette\r\ntar: unrecognized option '--exclude-vcs-ignores'\r\nTry 'tar --help' or 'tar --usage' for more information.\r\n \u25b8 Command failed: tar cz -C /tmp/tmpuaxm7i8f --exclude-vcs-ignores --exclude\r\n \u25b8 .git --exclude .gitmodules . >\r\n \u25b8 /tmp/f49440e0-1bf3-4d3f-9eb0-fbc2967d1fd4.tar.gz\r\n \u25b8 tar: unrecognized option '--exclude-vcs-ignores'\r\n \u25b8 Try 'tar --help' or 'tar --usage' for more information.\r\n \u25b8 \r\nThe command \"datasette publish heroku fivethirtyeight.db -m metadata.json -n fivethirtyeight-datasette\" exited with 0.\r\n```\r\n\r\nThe fix for that issue is to call the heroku command like this:\r\n\r\n heroku builds:create -a app_name --include-vcs-ignore\r\n\r\n", "repo": {"value": 107914493, "label": "datasette"}, "type": "pull", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/407/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": 0, "state_reason": null} {"id": 280896290, "node_id": "MDU6SXNzdWUyODA4OTYyOTA=", "number": 172, "title": "Show size of .db file next to download link", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2017-12-11T05:12:46Z", "updated_at": "2019-02-06T05:09:06Z", "closed_at": "2019-02-06T05:00:36Z", "author_association": "OWNER", "pull_request": null, "body": "Size in bytes should be calculated by datasette inspect.\r\n\r\nTemplate should display it in KB or MB or GB", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/172/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 413779210, "node_id": "MDU6SXNzdWU0MTM3NzkyMTA=", "number": 13, "title": "Ability to automatically create IDs from content hash of row", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2019-02-24T04:07:08Z", "updated_at": "2019-02-24T04:36:48Z", "closed_at": "2019-02-24T04:36:48Z", "author_association": "OWNER", "pull_request": null, "body": "Sometimes when you are importing data the underlying source provides records without IDs that can be uniquely identified by their contents.\r\n\r\nA utility mechanism for calculating a sha1 hash of the contents and using that as a unique ID would be useful.", "repo": {"value": 140912432, "label": "sqlite-utils"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/sqlite-utils/issues/13/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 411066700, "node_id": "MDU6SXNzdWU0MTEwNjY3MDA=", "number": 10, "title": "Error in upsert if column named 'order'", "user": {"value": 82988, "label": "psychemedia"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2019-02-16T12:05:18Z", "updated_at": "2019-02-24T16:55:38Z", "closed_at": "2019-02-24T16:55:37Z", "author_association": "NONE", "pull_request": null, "body": "The following works fine:\r\n```\r\nconnX = sqlite3.connect('DELME.db', timeout=10)\r\n\r\ndfX=pd.DataFrame({'col1':range(3),'col2':range(3)})\r\nDBX = Database(connX)\r\nDBX['test'].upsert_all(dfX.to_dict(orient='records'))\r\n```\r\n\r\nBut if a column is named `order`:\r\n```\r\nconnX = sqlite3.connect('DELME.db', timeout=10)\r\n\r\ndfX=pd.DataFrame({'order':range(3),'col2':range(3)})\r\nDBX = Database(connX)\r\nDBX['test'].upsert_all(dfX.to_dict(orient='records'))\r\n```\r\n\r\nit throws an error:\r\n\r\n```\r\n---------------------------------------------------------------------------\r\nOperationalError Traceback (most recent call last)\r\n in \r\n 3 dfX=pd.DataFrame({'order':range(3),'col2':range(3)})\r\n 4 DBX = Database(connX)\r\n----> 5 DBX['test'].upsert_all(dfX.to_dict(orient='records'))\r\n\r\n/usr/local/lib/python3.7/site-packages/sqlite_utils/db.py in upsert_all(self, records, pk, foreign_keys, column_order)\r\n 347 foreign_keys=foreign_keys,\r\n 348 upsert=True,\r\n--> 349 column_order=column_order,\r\n 350 )\r\n 351 \r\n\r\n/usr/local/lib/python3.7/site-packages/sqlite_utils/db.py in insert_all(self, records, pk, foreign_keys, upsert, batch_size, column_order)\r\n 327 jsonify_if_needed(record.get(key, None)) for key in all_columns\r\n 328 )\r\n--> 329 result = self.db.conn.execute(sql, values)\r\n 330 self.db.conn.commit()\r\n 331 self.last_id = result.lastrowid\r\n\r\nOperationalError: near \"order\": syntax error\r\n```", "repo": {"value": 140912432, "label": "sqlite-utils"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/sqlite-utils/issues/10/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 349850687, "node_id": "MDU6SXNzdWUzNDk4NTA2ODc=", "number": 2, "title": "Mechanism for adding foreign keys to an existing table", "user": {"value": 9599, "label": "simonw"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2018-08-12T22:50:56Z", "updated_at": "2019-02-24T21:34:41Z", "closed_at": "2019-02-24T21:34:41Z", "author_association": "OWNER", "pull_request": null, "body": "SQLite does not have ALTER TABLE support for adding new foreign keys... but it turns out it's possible to make these changes without having to duplicate the entire table by carefully running `UPDATE sqlite_master SET sql=... WHERE type='table' AND name='X';`\r\n\r\nHere's how Django does it: https://github.com/django/django/blob/d3449faaa915a08c275b35de01e66a7ef6bdb2dc/django/db/backends/sqlite3/schema.py#L103-L125\r\n\r\nAnd here's the official documentation about this: https://sqlite.org/lang_altertable.html#otheralter (scroll to the very bottom of the page)", "repo": {"value": 140912432, "label": "sqlite-utils"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/sqlite-utils/issues/2/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 415575624, "node_id": "MDU6SXNzdWU0MTU1NzU2MjQ=", "number": 414, "title": "datasette requires specific version of Click", "user": {"value": 82988, "label": "psychemedia"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2019-02-28T11:24:59Z", "updated_at": "2019-03-15T04:42:13Z", "closed_at": "2019-03-15T04:42:13Z", "author_association": "CONTRIBUTOR", "pull_request": null, "body": "Is `datasette` beholden to version `click==6.7`?\r\n\r\nCurrent release is at 7.0. Can the requirement be liberalised, eg to `>=6.7`?", "repo": {"value": 107914493, "label": "datasette"}, "type": "issue", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/414/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": null, "state_reason": "completed"} {"id": 413887019, "node_id": "MDExOlB1bGxSZXF1ZXN0MjU1NzI1MDU3", "number": 413, "title": "Update spatialite.rst", "user": {"value": 28597217, "label": "joelondon"}, "state": "closed", "locked": 0, "assignee": null, "milestone": null, "comments": 1, "created_at": "2019-02-25T00:08:35Z", "updated_at": "2019-03-15T05:06:45Z", "closed_at": "2019-03-15T05:06:45Z", "author_association": "CONTRIBUTOR", "pull_request": "simonw/datasette/pulls/413", "body": "a line of sql added to create the idx_ in the python recipe", "repo": {"value": 107914493, "label": "datasette"}, "type": "pull", "active_lock_reason": null, "performed_via_github_app": null, "reactions": "{\"url\": \"https://api.github.com/repos/simonw/datasette/issues/413/reactions\", \"total_count\": 0, \"+1\": 0, \"-1\": 0, \"laugh\": 0, \"hooray\": 0, \"confused\": 0, \"heart\": 0, \"rocket\": 0, \"eyes\": 0}", "draft": 0, "state_reason": null}