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/1388#issuecomment-877721003,https://api.github.com/repos/simonw/datasette/issues/1388,877721003,MDEyOklzc3VlQ29tbWVudDg3NzcyMTAwMw==,9599,simonw,2021-07-11T00:21:19Z,2021-07-11T00:21:19Z,OWNER,Documentation: https://docs.datasette.io/en/latest/deploying.html#nginx-proxy-configuration,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",939051549,Serve using UNIX domain socket, https://github.com/simonw/datasette/issues/1388#issuecomment-877725193,https://api.github.com/repos/simonw/datasette/issues/1388,877725193,MDEyOklzc3VlQ29tbWVudDg3NzcyNTE5Mw==,9599,simonw,2021-07-11T01:18:38Z,2021-07-11T01:18:38Z,OWNER,Wrote up a TIL: https://til.simonwillison.net/nginx/proxy-domain-sockets,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",939051549,Serve using UNIX domain socket, https://github.com/simonw/datasette/issues/511#issuecomment-877725742,https://api.github.com/repos/simonw/datasette/issues/511,877725742,MDEyOklzc3VlQ29tbWVudDg3NzcyNTc0Mg==,9599,simonw,2021-07-11T01:25:01Z,2021-07-11T01:26:38Z,OWNER,"That's weird. https://github.com/simonw/datasette/runs/3037862798 finished running and came up green - but actually a TON of the tests failed on Windows. Not sure why that didn't fail the whole test suite: Also the test suite took 50 minutes on Windows! Here's a copy of the full log file for the tests on Python 3.8 on Windows: https://gist.github.com/simonw/2900ef33693c1bbda09188eb31c8212d","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",456578474,Get Datasette tests passing on Windows in GitHub Actions, https://github.com/simonw/datasette/issues/511#issuecomment-877726288,https://api.github.com/repos/simonw/datasette/issues/511,877726288,MDEyOklzc3VlQ29tbWVudDg3NzcyNjI4OA==,9599,simonw,2021-07-11T01:29:41Z,2021-07-11T01:29:41Z,OWNER,"Lots of errors that look like this: ``` 2021-07-11T00:40:32.1189321Z E NotADirectoryError: [WinError 267] The directory name is invalid: 'C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\tmpdr41pgwg\\data.db' 2021-07-11T00:40:32.1190083Z 2021-07-11T00:40:32.1191128Z c:\hostedtoolcache\windows\python\3.8.10\x64\lib\shutil.py:596: NotADirectoryError 2021-07-11T00:40:32.1191999Z ___________________ ERROR at teardown of test_insert_error ____________________ 2021-07-11T00:40:32.1192842Z [gw1] win32 -- Python 3.8.10 c:\hostedtoolcache\windows\python\3.8.10\x64\python.exe 2021-07-11T00:40:32.1193387Z 2021-07-11T00:40:32.1193930Z path = 'C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\tmpry729pq_' 2021-07-11T00:40:32.1194876Z onerror = .onerror at 0x00000291FCEA93A0> 2021-07-11T00:40:32.1195480Z 2021-07-11T00:40:32.1195927Z def _rmtree_unsafe(path, onerror): 2021-07-11T00:40:32.1196435Z try: 2021-07-11T00:40:32.1196910Z with os.scandir(path) as scandir_it: 2021-07-11T00:40:32.1197504Z entries = list(scandir_it) 2021-07-11T00:40:32.1198002Z except OSError: 2021-07-11T00:40:32.1198607Z onerror(os.scandir, path, sys.exc_info()) 2021-07-11T00:40:32.1199137Z entries = [] 2021-07-11T00:40:32.1199637Z for entry in entries: 2021-07-11T00:40:32.1200184Z fullname = entry.path 2021-07-11T00:40:32.1200692Z if _rmtree_isdir(entry): 2021-07-11T00:40:32.1201198Z try: 2021-07-11T00:40:32.1201643Z if entry.is_symlink(): 2021-07-11T00:40:32.1202280Z # This can only happen if someone replaces 2021-07-11T00:40:32.1202944Z # a directory with a symlink after the call to 2021-07-11T00:40:32.1203623Z # os.scandir or entry.is_dir above. 2021-07-11T00:40:32.1204303Z raise OSError(""Cannot call rmtree on a symbolic link"") 2021-07-11T00:40:32.1204942Z except OSError: 2021-07-11T00:40:32.1206416Z onerror(os.path.islink, fullname, sys.exc_info()) 2021-07-11T00:40:32.1207022Z continue 2021-07-11T00:40:32.1207584Z _rmtree_unsafe(fullname, onerror) 2021-07-11T00:40:32.1208074Z else: 2021-07-11T00:40:32.1208496Z try: 2021-07-11T00:40:32.1208926Z > os.unlink(fullname) 2021-07-11T00:40:32.1210053Z E PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\tmpry729pq_\\data.db' 2021-07-11T00:40:32.1210974Z 2021-07-11T00:40:32.1211638Z c:\hostedtoolcache\windows\python\3.8.10\x64\lib\shutil.py:616: PermissionError 2021-07-11T00:40:32.1212211Z 2021-07-11T00:40:32.1212846Z During handling of the above exception, another exception occurred: 2021-07-11T00:40:32.1213320Z 2021-07-11T00:40:32.1213797Z func = 2021-07-11T00:40:32.1214529Z path = 'C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\tmpry729pq_\\data.db' 2021-07-11T00:40:32.1215763Z exc_info = (, PermissionError(13, 'The process cannot access the file because it is being used by another process'), ) 2021-07-11T00:40:32.1217263Z 2021-07-11T00:40:32.1217777Z def onerror(func, path, exc_info): 2021-07-11T00:40:32.1218421Z if issubclass(exc_info[0], PermissionError): 2021-07-11T00:40:32.1219079Z def resetperms(path): 2021-07-11T00:40:32.1219518Z try: 2021-07-11T00:40:32.1219992Z _os.chflags(path, 0) 2021-07-11T00:40:32.1220535Z except AttributeError: 2021-07-11T00:40:32.1221110Z pass 2021-07-11T00:40:32.1221545Z _os.chmod(path, 0o700) 2021-07-11T00:40:32.1221984Z 2021-07-11T00:40:32.1222330Z try: 2021-07-11T00:40:32.1222768Z if path != name: 2021-07-11T00:40:32.1223332Z resetperms(_os.path.dirname(path)) 2021-07-11T00:40:32.1223963Z resetperms(path) 2021-07-11T00:40:32.1224408Z 2021-07-11T00:40:32.1224749Z try: 2021-07-11T00:40:32.1225954Z > _os.unlink(path) 2021-07-11T00:40:32.1227032Z E PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\tmpry729pq_\\data.db' 2021-07-11T00:40:32.1227927Z 2021-07-11T00:40:32.1228646Z c:\hostedtoolcache\windows\python\3.8.10\x64\lib\tempfile.py:802: PermissionError 2021-07-11T00:40:32.1229200Z 2021-07-11T00:40:32.1229842Z During handling of the above exception, another exception occurred: 2021-07-11T00:40:32.1230355Z 2021-07-11T00:40:32.1230783Z @pytest.fixture 2021-07-11T00:40:32.1231322Z def canned_write_client(): 2021-07-11T00:40:32.1231805Z with make_app_client( 2021-07-11T00:40:32.1232467Z extra_databases={""data.db"": ""create table names (name text)""}, 2021-07-11T00:40:32.1233104Z metadata={ 2021-07-11T00:40:32.1233535Z ""databases"": { 2021-07-11T00:40:32.1233989Z ""data"": { 2021-07-11T00:40:32.1234416Z ""queries"": { 2021-07-11T00:40:32.1235001Z ""canned_read"": {""sql"": ""select * from names""}, 2021-07-11T00:40:32.1235527Z ""add_name"": { 2021-07-11T00:40:32.1236117Z ""sql"": ""insert into names (name) values (:name)"", 2021-07-11T00:40:32.1236686Z ""write"": True, 2021-07-11T00:40:32.1237317Z ""on_success_redirect"": ""/data/add_name?success"", 2021-07-11T00:40:32.1237882Z }, 2021-07-11T00:40:32.1238331Z ""add_name_specify_id"": { 2021-07-11T00:40:32.1239009Z ""sql"": ""insert into names (rowid, name) values (:rowid, :name)"", 2021-07-11T00:40:32.1239610Z ""write"": True, 2021-07-11T00:40:32.1240259Z ""on_error_redirect"": ""/data/add_name_specify_id?error"", 2021-07-11T00:40:32.1240839Z }, 2021-07-11T00:40:32.1241320Z ""delete_name"": { 2021-07-11T00:40:32.1242504Z ""sql"": ""delete from names where rowid = :rowid"", 2021-07-11T00:40:32.1243127Z ""write"": True, 2021-07-11T00:40:32.1243721Z ""on_success_message"": ""Name deleted"", 2021-07-11T00:40:32.1244282Z ""allow"": {""id"": ""root""}, 2021-07-11T00:40:32.1244749Z }, 2021-07-11T00:40:32.1245959Z ""update_name"": { 2021-07-11T00:40:32.1246614Z ""sql"": ""update names set name = :name where rowid = :rowid"", 2021-07-11T00:40:32.1247267Z ""params"": [""rowid"", ""name"", ""extra""], 2021-07-11T00:40:32.1247828Z ""write"": True, 2021-07-11T00:40:32.1248247Z }, 2021-07-11T00:40:32.1248653Z } 2021-07-11T00:40:32.1249166Z } 2021-07-11T00:40:32.1249577Z } 2021-07-11T00:40:32.1249962Z }, 2021-07-11T00:40:32.1250333Z ) as client: 2021-07-11T00:40:32.1250822Z > yield client 2021-07-11T00:40:32.1251078Z 2021-07-11T00:40:32.1251678Z D:\a\datasette\datasette\tests\test_canned_queries.py:43: 2021-07-11T00:40:32.1252347Z _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 2021-07-11T00:40:32.1253040Z c:\hostedtoolcache\windows\python\3.8.10\x64\lib\contextlib.py:120: in __exit__ 2021-07-11T00:40:32.1253759Z next(self.gen) 2021-07-11T00:40:32.1254398Z D:\a\datasette\datasette\tests\fixtures.py:156: in make_app_client 2021-07-11T00:40:32.1255098Z yield TestClient(ds) 2021-07-11T00:40:32.1255796Z c:\hostedtoolcache\windows\python\3.8.10\x64\lib\tempfile.py:827: in __exit__ 2021-07-11T00:40:32.1256510Z self.cleanup() 2021-07-11T00:40:32.1257200Z c:\hostedtoolcache\windows\python\3.8.10\x64\lib\tempfile.py:831: in cleanup 2021-07-11T00:40:32.1257961Z self._rmtree(self.name) 2021-07-11T00:40:32.1258712Z c:\hostedtoolcache\windows\python\3.8.10\x64\lib\tempfile.py:813: in _rmtree 2021-07-11T00:40:32.1259487Z _shutil.rmtree(name, onerror=onerror) 2021-07-11T00:40:32.1260280Z c:\hostedtoolcache\windows\python\3.8.10\x64\lib\shutil.py:740: in rmtree 2021-07-11T00:40:32.1261039Z return _rmtree_unsafe(path, onerror) 2021-07-11T00:40:32.1261843Z c:\hostedtoolcache\windows\python\3.8.10\x64\lib\shutil.py:618: in _rmtree_unsafe 2021-07-11T00:40:32.1262633Z onerror(os.unlink, fullname, sys.exc_info()) 2021-07-11T00:40:32.1263456Z c:\hostedtoolcache\windows\python\3.8.10\x64\lib\tempfile.py:805: in onerror 2021-07-11T00:40:32.1264175Z cls._rmtree(path) 2021-07-11T00:40:32.1264848Z c:\hostedtoolcache\windows\python\3.8.10\x64\lib\tempfile.py:813: in _rmtree 2021-07-11T00:40:32.1266329Z _shutil.rmtree(name, onerror=onerror) 2021-07-11T00:40:32.1267082Z c:\hostedtoolcache\windows\python\3.8.10\x64\lib\shutil.py:740: in rmtree 2021-07-11T00:40:32.1267858Z return _rmtree_unsafe(path, onerror) 2021-07-11T00:40:32.1268615Z c:\hostedtoolcache\windows\python\3.8.10\x64\lib\shutil.py:599: in _rmtree_unsafe 2021-07-11T00:40:32.1269440Z onerror(os.scandir, path, sys.exc_info()) 2021-07-11T00:40:32.1269979Z _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 2021-07-11T00:40:32.1270287Z 2021-07-11T00:40:32.1270947Z path = 'C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\tmpry729pq_\\data.db' 2021-07-11T00:40:32.1273356Z onerror = .onerror at 0x00000291FCF40E50> 2021-07-11T00:40:32.1273999Z 2021-07-11T00:40:32.1274493Z def _rmtree_unsafe(path, onerror): 2021-07-11T00:40:32.1274953Z try: 2021-07-11T00:40:32.1275461Z > with os.scandir(path) as scandir_it: 2021-07-11T00:40:32.1276459Z E NotADirectoryError: [WinError 267] The directory name is invalid: 'C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\tmpry729pq_\\data.db' 2021-07-11T00:40:32.1277220Z ```","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",456578474,Get Datasette tests passing on Windows in GitHub Actions, https://github.com/simonw/datasette/issues/511#issuecomment-877726495,https://api.github.com/repos/simonw/datasette/issues/511,877726495,MDEyOklzc3VlQ29tbWVudDg3NzcyNjQ5NQ==,9599,simonw,2021-07-11T01:32:27Z,2021-07-11T01:32:27Z,OWNER,"I'm using `pytest-xdist` and this: pytest -n auto -m ""not serial"" I'll try not using the `-n auto` bit on Windows and see if that helps.","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",456578474,Get Datasette tests passing on Windows in GitHub Actions, https://github.com/dogsheep/healthkit-to-sqlite/issues/12#issuecomment-877805513,https://api.github.com/repos/dogsheep/healthkit-to-sqlite/issues/12,877805513,MDEyOklzc3VlQ29tbWVudDg3NzgwNTUxMw==,956433,Mjboothaus,2021-07-11T14:03:01Z,2021-07-11T14:03:01Z,NONE,"Hi Simon -- just experimenting with your excellent software! Up to this point in time I have been using the (paid) [HealthFit App](https://apps.apple.com/au/app/healthfit/id1202650514) to export my workouts from my Apple Watch, one walk at the time into either .GPX or .FIT format and then using another library to suck it into Python and eventually here to my ""Emmaus Walking"" app: https://share.streamlit.io/mjboothaus/emmaus_walking/emmaus_walking/app.py I just used `healthkit-to-sqlite` to convert my export.zip file and it all ""just worked"". I did notice the issue with various numeric fields being stored in the SQLite db as TEXT for now and just thought I'd flag it - but you're already self-reported this issue. Keep up the great work! I was curious if you have any thoughts about periodically exporting ""export.zip"" and how to just update the SQLite file instead of re-creating it each time. Hopefully Apple will give some thought to managing this data in a more sensible fashion as it grows over time. Ideally one could pull it from iCloud (where it is allegedly being backed up). ","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",727848625,"Some workout columns should be float, not text", https://github.com/simonw/datasette/issues/511#issuecomment-877835171,https://api.github.com/repos/simonw/datasette/issues/511,877835171,MDEyOklzc3VlQ29tbWVudDg3NzgzNTE3MQ==,9599,simonw,2021-07-11T17:23:05Z,2021-07-11T17:23:05Z,OWNER," == 87 failed, 819 passed, 7 skipped, 29 errors in 2584.85s (0:43:04) == https://github.com/simonw/datasette/runs/3038188870?check_suite_focus=true Full copy of log here: https://gist.github.com/simonw/4b1fdd24496b989fca56bc757be345ad","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",456578474,Get Datasette tests passing on Windows in GitHub Actions, https://github.com/dogsheep/healthkit-to-sqlite/issues/12#issuecomment-877874117,https://api.github.com/repos/dogsheep/healthkit-to-sqlite/issues/12,877874117,MDEyOklzc3VlQ29tbWVudDg3Nzg3NDExNw==,956433,Mjboothaus,2021-07-11T23:03:37Z,2021-07-11T23:03:37Z,NONE,P.s. wondering if you have explored using the spatialite functionality with the location data in workouts?,"{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",727848625,"Some workout columns should be float, not text",