html_url,issue_url,id,node_id,user,user_label,created_at,updated_at,author_association,body,reactions,issue,issue_label,performed_via_github_app https://github.com/simonw/datasette/issues/59#issuecomment-344081876,https://api.github.com/repos/simonw/datasette/issues/59,344081876,MDEyOklzc3VlQ29tbWVudDM0NDA4MTg3Ng==,9599,simonw,2017-11-13T22:33:43Z,2017-11-13T22:33:43Z,OWNER,The `datasette package` command introduced in 4143e3b45c16cbae5e3e3419ef479a71810e7df3 is relevant here.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273157085,datasette publish hyper, https://github.com/simonw/datasette/pull/81#issuecomment-344076554,https://api.github.com/repos/simonw/datasette/issues/81,344076554,MDEyOklzc3VlQ29tbWVudDM0NDA3NjU1NA==,9599,simonw,2017-11-13T22:12:57Z,2017-11-13T22:12:57Z,OWNER,"Hah, I haven't even announced this yet :) Travis is upset because I'm using SQL in the tests which isn't compatible with their version of Python 3.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273595473,:fire: Removes DS_Store, https://github.com/simonw/datasette/issues/80#issuecomment-344075696,https://api.github.com/repos/simonw/datasette/issues/80,344075696,MDEyOklzc3VlQ29tbWVudDM0NDA3NTY5Ng==,9599,simonw,2017-11-13T22:09:46Z,2017-11-13T22:09:46Z,OWNER,"Parlgov was throwing errors on one of the views, which takes longer than 1000ms to execute - so I added the ability to customize the time limit in https://github.com/simonw/datasette/commit/1e698787a4dd6df0432021a6814c446c8b69bba2 datasette publish now parlgov.db --metadata parlgov.json --name parlgov --extra-options=""--sql_time_limit_ms=3500"" now alias https://parlgov-nvkcowlixq.now.sh parlgov.datasettes.com https://parlgov.datasettes.com/parlgov-25f9855/view_cabinet now returns in just over 2.5s ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273569477,Deploy final versions of fivethirtyeight and parlgov datasets (with view pagination), https://github.com/simonw/datasette/issues/80#issuecomment-344074443,https://api.github.com/repos/simonw/datasette/issues/80,344074443,MDEyOklzc3VlQ29tbWVudDM0NDA3NDQ0Mw==,9599,simonw,2017-11-13T22:04:54Z,2017-11-13T22:05:02Z,OWNER,"The fivethirtyeight dataset: datasette publish now --name fivethirtyeight --metadata metadata.json fivethirtyeight.db now alias https://fivethirtyeight-jyqfudvjli.now.sh fivethirtyeight.datasettes.com And parlgov: datasette publish now parlgov.db --name=parlgov --metadata=parlgov.json now alias https://parlgov-hqvxuhmbyh.now.sh parlgov.datasettes.com ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273569477,Deploy final versions of fivethirtyeight and parlgov datasets (with view pagination), https://github.com/simonw/datasette/issues/55#issuecomment-344061762,https://api.github.com/repos/simonw/datasette/issues/55,344061762,MDEyOklzc3VlQ29tbWVudDM0NDA2MTc2Mg==,9599,simonw,2017-11-13T21:19:43Z,2017-11-13T21:19:43Z,OWNER,And we're live! https://pypi.python.org/pypi/datasette,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273127117,Ship first version to PyPI, https://github.com/simonw/datasette/issues/55#issuecomment-344060070,https://api.github.com/repos/simonw/datasette/issues/55,344060070,MDEyOklzc3VlQ29tbWVudDM0NDA2MDA3MA==,9599,simonw,2017-11-13T21:14:13Z,2017-11-13T21:14:13Z,OWNER,"I'm going to add some extra metadata to setup.py and then tag this as version 0.8: git tag 0.8 git push --tags Then to ship to PyPI: python setup.py bdist_wheel twine register dist/datasette-0.8-py3-none-any.whl twine upload dist/datasette-0.8-py3-none-any.whl ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273127117,Ship first version to PyPI, https://github.com/simonw/datasette/issues/69#issuecomment-344048656,https://api.github.com/repos/simonw/datasette/issues/69,344048656,MDEyOklzc3VlQ29tbWVudDM0NDA0ODY1Ng==,9599,simonw,2017-11-13T20:32:47Z,2017-11-13T20:32:47Z,OWNER," ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273248366,Enforce pagination (or at least limits) for arbitrary custom SQL, https://github.com/simonw/datasette/issues/69#issuecomment-344019631,https://api.github.com/repos/simonw/datasette/issues/69,344019631,MDEyOklzc3VlQ29tbWVudDM0NDAxOTYzMQ==,9599,simonw,2017-11-13T18:53:13Z,2017-11-13T18:53:13Z,OWNER,I'm going with a page size of 100 and a max limit of 1000,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273248366,Enforce pagination (or at least limits) for arbitrary custom SQL, https://github.com/simonw/datasette/issues/74#issuecomment-344018680,https://api.github.com/repos/simonw/datasette/issues/74,344018680,MDEyOklzc3VlQ29tbWVudDM0NDAxODY4MA==,9599,simonw,2017-11-13T18:49:58Z,2017-11-13T18:49:58Z,OWNER,Turns out it does this already: https://github.com/simonw/datasette/blob/6b3b05b6db0d2a7b7cec8b8dbb4ddc5e12a376b2/datasette/app.py#L96-L107,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273296684,Send a 302 redirect to the new hash for hits to old hashes, https://github.com/simonw/datasette/issues/51#issuecomment-344017088,https://api.github.com/repos/simonw/datasette/issues/51,344017088,MDEyOklzc3VlQ29tbWVudDM0NDAxNzA4OA==,9599,simonw,2017-11-13T18:44:23Z,2017-11-13T18:44:23Z,OWNER,Implemented in https://github.com/simonw/datasette/commit/e838bd743d31358b362875854a0ac5e78047727f,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",272735257,Make a proper README, https://github.com/simonw/datasette/issues/75#issuecomment-344000982,https://api.github.com/repos/simonw/datasette/issues/75,344000982,MDEyOklzc3VlQ29tbWVudDM0NDAwMDk4Mg==,9599,simonw,2017-11-13T17:50:27Z,2017-11-13T17:50:27Z,OWNER,"This is necessary because one of the fun things to do with this tool is run it locally, e.g.: datasette ~/Library/Application\ Support/Google/Chrome/Default/History -p 8003 BUT... if we enable CORS by default, an evil site could try sniffing for localhost:8003 and attempt to steal data. So we'll enable the CORS headers only if `--cors` is provided to the command, and then use that command in the default Dockerfile.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273509159,Add --cors argument to serve, https://github.com/simonw/datasette/issues/67#issuecomment-343967020,https://api.github.com/repos/simonw/datasette/issues/67,343967020,MDEyOklzc3VlQ29tbWVudDM0Mzk2NzAyMA==,9599,simonw,2017-11-13T16:06:10Z,2017-11-13T16:06:10Z,OWNER,http://odewahn.github.io/docker-jumpstart/example.html is helpful,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273192789,Command that builds a local docker container, https://github.com/simonw/datasette/issues/67#issuecomment-343961784,https://api.github.com/repos/simonw/datasette/issues/67,343961784,MDEyOklzc3VlQ29tbWVudDM0Mzk2MTc4NA==,9599,simonw,2017-11-13T15:50:50Z,2017-11-13T15:50:50Z,OWNER,"`datasette package ...` - same arguments as `datasette publish`. Creates Docker container in your local repo, optionally tagged with `--tag`","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273192789,Command that builds a local docker container, https://github.com/simonw/datasette/issues/68#issuecomment-343951751,https://api.github.com/repos/simonw/datasette/issues/68,343951751,MDEyOklzc3VlQ29tbWVudDM0Mzk1MTc1MQ==,9599,simonw,2017-11-13T15:21:04Z,2017-11-13T15:21:04Z,OWNER,"For first version, I'm just supporting title, source and license information at the database level.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273247186,Support for title/source/license metadata, https://github.com/simonw/datasette/issues/73#issuecomment-343801392,https://api.github.com/repos/simonw/datasette/issues/73,343801392,MDEyOklzc3VlQ29tbWVudDM0MzgwMTM5Mg==,9599,simonw,2017-11-13T03:36:47Z,2017-11-13T03:36:47Z,OWNER,"While I’m at it, let’s allow people to opt out of HTTP/2 push with a ?_nopush=1 argument too - in case they decide they don’t want to receive large 302 responses.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273296178,_nocache=1 query string option for use with sort-by-random, https://github.com/simonw/datasette/issues/68#issuecomment-343791348,https://api.github.com/repos/simonw/datasette/issues/68,343791348,MDEyOklzc3VlQ29tbWVudDM0Mzc5MTM0OA==,9599,simonw,2017-11-13T02:12:58Z,2017-11-13T02:12:58Z,OWNER,I should use this on https://fivethirtyeight.datasettes.com/,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273247186,Support for title/source/license metadata, https://github.com/simonw/datasette/issues/71#issuecomment-343790984,https://api.github.com/repos/simonw/datasette/issues/71,343790984,MDEyOklzc3VlQ29tbWVudDM0Mzc5MDk4NA==,9599,simonw,2017-11-13T02:09:34Z,2017-11-13T02:09:34Z,OWNER,"HTTP/2 push totally worked on the redirect! fetch('https://fivethirtyeight.datasettes.com/fivethirtyeight/riddler-pick-lowest%2Flow_numbers.csv.jsono').then(r => r.json()).then(console.log) Meanwhile, in the network pane... ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273278840,Set up some example datasets on a Cloudflare-backed domain, https://github.com/simonw/datasette/issues/71#issuecomment-343781030,https://api.github.com/repos/simonw/datasette/issues/71,343781030,MDEyOklzc3VlQ29tbWVudDM0Mzc4MTAzMA==,9599,simonw,2017-11-13T00:21:05Z,2017-11-13T02:09:32Z,OWNER,"- [x] Have `now domain add -e datasettes.com` run without errors (hopefully just a matter of waiting for the DNS to update) - [x] Alias an example dataset hosted on Now on a datasettes.com subdomain - [x] Confirm that HTTP caching and HTTP/2 redirect pushing works as expected - this may require another page rule","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273278840,Set up some example datasets on a Cloudflare-backed domain, https://github.com/simonw/datasette/issues/71#issuecomment-343789162,https://api.github.com/repos/simonw/datasette/issues/71,343789162,MDEyOklzc3VlQ29tbWVudDM0Mzc4OTE2Mg==,9599,simonw,2017-11-13T01:53:29Z,2017-11-13T01:53:29Z,OWNER,"``` $ curl -i 'https://fivethirtyeight.datasettes.com/fivethirtyeight-75d605c/obama-commutations%2Fobama_commutations.csv.jsono' HTTP/1.1 200 OK Date: Mon, 13 Nov 2017 01:50:57 GMT Content-Type: application/json Transfer-Encoding: chunked Connection: keep-alive Set-Cookie: __cfduid=de836090f3e12a60579cc7a1696cf0d9e1510537857; expires=Tue, 13-Nov-18 01:50:57 GMT; path=/; domain=.datasettes.com; HttpOnly; Secure Access-Control-Allow-Origin: * Cache-Control: public, max-age=31536000 X-Now-Region: now-sfo CF-Cache-Status: HIT Expires: Tue, 13 Nov 2018 01:50:57 GMT Server: cloudflare-nginx CF-RAY: 3bce154a6d9293b4-SJC {""database"": ""fivethirtyeight"", ""table"": ""obama-commutations/obama_commutations.csv""...```","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273278840,Set up some example datasets on a Cloudflare-backed domain, https://github.com/simonw/datasette/issues/71#issuecomment-343788817,https://api.github.com/repos/simonw/datasette/issues/71,343788817,MDEyOklzc3VlQ29tbWVudDM0Mzc4ODgxNw==,9599,simonw,2017-11-13T01:50:27Z,2017-11-13T01:50:27Z,OWNER,https://fivethirtyeight.datasettes.com/ is now up and running.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273278840,Set up some example datasets on a Cloudflare-backed domain, https://github.com/simonw/datasette/issues/71#issuecomment-343788780,https://api.github.com/repos/simonw/datasette/issues/71,343788780,MDEyOklzc3VlQ29tbWVudDM0Mzc4ODc4MA==,9599,simonw,2017-11-13T01:50:01Z,2017-11-13T01:50:01Z,OWNER,"Added another page rule in order to get Cloudflare to always obey cache headers sent by the server: ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273278840,Set up some example datasets on a Cloudflare-backed domain, https://github.com/simonw/datasette/issues/71#issuecomment-343788581,https://api.github.com/repos/simonw/datasette/issues/71,343788581,MDEyOklzc3VlQ29tbWVudDM0Mzc4ODU4MQ==,9599,simonw,2017-11-13T01:48:17Z,2017-11-13T01:48:17Z,OWNER,"I had to add a rule like this to get letsencrypt certificates on now.sh working: https://github.com/zeit/now-cli/issues/188#issuecomment-270105052 I also have to flip this switch off every time I want to add a new alias: ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273278840,Set up some example datasets on a Cloudflare-backed domain, https://github.com/simonw/datasette/issues/71#issuecomment-343780539,https://api.github.com/repos/simonw/datasette/issues/71,343780539,MDEyOklzc3VlQ29tbWVudDM0Mzc4MDUzOQ==,9599,simonw,2017-11-13T00:13:29Z,2017-11-13T00:19:46Z,OWNER,"https://zeit.co/docs/features/dns is docs now domain add -e datasettes.com I had to set up a custom TXT record on `_now.datasettes.com` to get this to work.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273278840,Set up some example datasets on a Cloudflare-backed domain, https://github.com/simonw/datasette/issues/71#issuecomment-343780814,https://api.github.com/repos/simonw/datasette/issues/71,343780814,MDEyOklzc3VlQ29tbWVudDM0Mzc4MDgxNA==,9599,simonw,2017-11-13T00:17:50Z,2017-11-13T00:18:19Z,OWNER,"Achieved those redirects using Cloudflare ""page rules"": https://www.cloudflare.com/a/page-rules/datasettes.com","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273278840,Set up some example datasets on a Cloudflare-backed domain, https://github.com/simonw/datasette/issues/71#issuecomment-343780671,https://api.github.com/repos/simonw/datasette/issues/71,343780671,MDEyOklzc3VlQ29tbWVudDM0Mzc4MDY3MQ==,9599,simonw,2017-11-13T00:15:21Z,2017-11-13T00:17:37Z,OWNER,- [x] Redirect https://datasettes.com/ and https://www.datasettes.com/ to https://github.com/simonw/datasette,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273278840,Set up some example datasets on a Cloudflare-backed domain, https://github.com/simonw/datasette/issues/71#issuecomment-343780141,https://api.github.com/repos/simonw/datasette/issues/71,343780141,MDEyOklzc3VlQ29tbWVudDM0Mzc4MDE0MQ==,9599,simonw,2017-11-13T00:06:52Z,2017-11-13T00:06:52Z,OWNER,I've registered datasettes.com as a domain name for doing this. Now setting it up so Cloudflare and Now can serve content from it.,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273278840,Set up some example datasets on a Cloudflare-backed domain, https://github.com/simonw/datasette/issues/69#issuecomment-343780039,https://api.github.com/repos/simonw/datasette/issues/69,343780039,MDEyOklzc3VlQ29tbWVudDM0Mzc4MDAzOQ==,9599,simonw,2017-11-13T00:05:27Z,2017-11-13T00:05:27Z,OWNER,"I think the only safe way to do this is using SQLite `.fetchmany(1000)` - I can't guarantee that the user has not entered SQL that will outfox a limit in some way. So instead of attempting to edit their SQL, I'll always return 1001 records and let them know if they went over 1000 or not.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",273248366,Enforce pagination (or at least limits) for arbitrary custom SQL,