coiled 1.126.1.dev17__tar.gz → 1.126.1.dev19__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of coiled might be problematic. Click here for more details.

Files changed (101) hide show
  1. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/PKG-INFO +1 -1
  2. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/filestore.py +26 -6
  3. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/.gitignore +0 -0
  4. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/LICENSE +0 -0
  5. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/README.md +0 -0
  6. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/__init__.py +0 -0
  7. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/__main__.py +0 -0
  8. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/analytics.py +0 -0
  9. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/auth.py +0 -0
  10. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/batch.py +0 -0
  11. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/capture_environment.py +0 -0
  12. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/__init__.py +0 -0
  13. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/batch/__init__.py +0 -0
  14. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/batch/list.py +0 -0
  15. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/batch/logs.py +0 -0
  16. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/batch/run.py +0 -0
  17. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/batch/status.py +0 -0
  18. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/batch/wait.py +0 -0
  19. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/cluster/__init__.py +0 -0
  20. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/cluster/azure_logs.py +0 -0
  21. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/cluster/better_logs.py +0 -0
  22. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/cluster/crud.py +0 -0
  23. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/cluster/get_address.py +0 -0
  24. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/cluster/list.py +0 -0
  25. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/cluster/logs.py +0 -0
  26. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/cluster/metrics.py +0 -0
  27. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/cluster/ssh.py +0 -0
  28. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/cluster/utils.py +0 -0
  29. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/config.py +0 -0
  30. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/core.py +0 -0
  31. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/curl.py +0 -0
  32. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/diagnostics.py +0 -0
  33. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/env.py +0 -0
  34. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/file.py +0 -0
  35. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/hello/__init__.py +0 -0
  36. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/hello/examples/__init__.py +0 -0
  37. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/hello/examples/exit.py +0 -0
  38. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/hello/examples/hello_world.py +0 -0
  39. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/hello/examples/nyc_parquet.py +0 -0
  40. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/hello/examples/pytorch.py +0 -0
  41. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/hello/examples/xarray_nwm.py +0 -0
  42. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/hello/hello.py +0 -0
  43. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/hello/scripts/fill_ipython.py +0 -0
  44. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/hello/scripts/nyc_parquet.py +0 -0
  45. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/hello/scripts/pytorch.py +0 -0
  46. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/hello/scripts/xarray_nwm.py +0 -0
  47. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/hello/utils.py +0 -0
  48. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/login.py +0 -0
  49. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/notebook/__init__.py +0 -0
  50. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/notebook/notebook.py +0 -0
  51. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/package_sync.py +0 -0
  52. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/prefect.py +0 -0
  53. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/prefect_serve.py +0 -0
  54. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/run.py +0 -0
  55. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/setup/__init__.py +0 -0
  56. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/setup/amp.py +0 -0
  57. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/setup/aws.py +0 -0
  58. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/setup/azure.py +0 -0
  59. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/setup/entry.py +0 -0
  60. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/setup/gcp.py +0 -0
  61. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/setup/prometheus.py +0 -0
  62. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/setup/util.py +0 -0
  63. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/sync.py +0 -0
  64. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cli/utils.py +0 -0
  65. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/cluster.py +0 -0
  66. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/coiled.yaml +0 -0
  67. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/compatibility.py +0 -0
  68. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/config.py +0 -0
  69. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/context.py +0 -0
  70. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/core.py +0 -0
  71. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/credentials/__init__.py +0 -0
  72. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/credentials/aws.py +0 -0
  73. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/credentials/google.py +0 -0
  74. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/errors.py +0 -0
  75. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/exceptions.py +0 -0
  76. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/extensions/__init__.py +0 -0
  77. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/extensions/prefect/__init__.py +0 -0
  78. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/extensions/prefect/runners.py +0 -0
  79. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/extensions/prefect/workers.py +0 -0
  80. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/function.py +0 -0
  81. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/plugins.py +0 -0
  82. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/prefect.py +0 -0
  83. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/pypi_conda_map.py +0 -0
  84. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/scan.py +0 -0
  85. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/software.py +0 -0
  86. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/software_utils.py +0 -0
  87. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/spans.py +0 -0
  88. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/spark.py +0 -0
  89. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/types.py +0 -0
  90. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/utils.py +0 -0
  91. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/v2/__init__.py +0 -0
  92. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/v2/cluster.py +0 -0
  93. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/v2/core.py +0 -0
  94. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/v2/cwi_log_link.py +0 -0
  95. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/v2/states.py +0 -0
  96. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/v2/widgets/__init__.py +0 -0
  97. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/v2/widgets/interface.py +0 -0
  98. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/v2/widgets/rich.py +0 -0
  99. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/v2/widgets/util.py +0 -0
  100. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/coiled/websockets.py +0 -0
  101. {coiled-1.126.1.dev17 → coiled-1.126.1.dev19}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coiled
3
- Version: 1.126.1.dev17
3
+ Version: 1.126.1.dev19
4
4
  Summary: Python client for coiled.io dask clusters
5
5
  Project-URL: Homepage, https://coiled.io
6
6
  Maintainer-email: Coiled <info@coiled.io>
@@ -317,15 +317,35 @@ class FilestoreManagerWithoutHttp:
317
317
  )
318
318
 
319
319
  @classmethod
320
- def download_from_signed_url(cls, local_path, url):
320
+ def download_from_signed_url(cls, local_path, url, max_retries=3, verbose=False):
321
321
  # TODO (performance enhancement) check if file already exists, skip if match, warn if not
322
322
  os.makedirs(os.path.dirname(local_path), exist_ok=True)
323
- # TODO (performance enhancement) stream
323
+
324
+ if verbose:
325
+ print(f"Downloading file from signed URL: {url} to {local_path}")
326
+
324
327
  with httpx.Client(http2=cls.http2) as client:
325
- with open(local_path, "wb") as f:
326
- headers = {"Content-Type": "binary/octet-stream"}
327
- response = client.get(url, timeout=60, headers=headers)
328
- f.write(io.BytesIO(response.content).getbuffer())
328
+ for attempt in range(max_retries):
329
+ try:
330
+ with client.stream("GET", url, timeout=60) as response:
331
+ response.raise_for_status()
332
+ with open(local_path, "wb") as f:
333
+ for chunk in response.iter_bytes(chunk_size=8192):
334
+ f.write(chunk)
335
+ return # Success, exit function
336
+ except (httpx.RemoteProtocolError, httpx.ReadTimeout, httpx.ConnectError) as e:
337
+ if attempt < max_retries - 1:
338
+ wait_time = 2**attempt # Exponential backoff: 1s, 2s, 4s
339
+ if verbose:
340
+ print(
341
+ f"Download failed (attempt {attempt + 1}/{max_retries}): {e}. "
342
+ f"Retrying in {wait_time}s..."
343
+ )
344
+ time.sleep(wait_time)
345
+ else:
346
+ if verbose:
347
+ print(f"Download failed after {max_retries} attempts: {e}")
348
+ raise
329
349
 
330
350
 
331
351
  class FilestoreManager(FilestoreManagerWithoutHttp):
File without changes
File without changes