coiled 1.124.1.dev5__tar.gz → 1.125.1.dev2__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 (102) hide show
  1. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/PKG-INFO +1 -1
  2. coiled-1.125.1.dev2/coiled/cli/file.py +116 -0
  3. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/hello/hello.py +5 -4
  4. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/filestore.py +20 -1
  5. coiled-1.124.1.dev5/coiled/cli/file.py +0 -41
  6. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/.gitignore +0 -0
  7. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/LICENSE +0 -0
  8. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/README.md +0 -0
  9. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/__init__.py +0 -0
  10. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/__main__.py +0 -0
  11. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/analytics.py +0 -0
  12. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/auth.py +0 -0
  13. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/batch.py +0 -0
  14. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/capture_environment.py +0 -0
  15. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/__init__.py +0 -0
  16. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/batch/__init__.py +0 -0
  17. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/batch/list.py +0 -0
  18. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/batch/logs.py +0 -0
  19. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/batch/run.py +0 -0
  20. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/batch/status.py +0 -0
  21. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/batch/wait.py +0 -0
  22. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/cluster/__init__.py +0 -0
  23. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/cluster/azure_logs.py +0 -0
  24. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/cluster/better_logs.py +0 -0
  25. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/cluster/crud.py +0 -0
  26. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/cluster/get_address.py +0 -0
  27. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/cluster/list.py +0 -0
  28. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/cluster/logs.py +0 -0
  29. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/cluster/metrics.py +0 -0
  30. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/cluster/ssh.py +0 -0
  31. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/cluster/utils.py +0 -0
  32. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/config.py +0 -0
  33. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/core.py +0 -0
  34. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/curl.py +0 -0
  35. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/diagnostics.py +0 -0
  36. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/env.py +0 -0
  37. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/hello/__init__.py +0 -0
  38. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/hello/examples/__init__.py +0 -0
  39. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/hello/examples/exit.py +0 -0
  40. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/hello/examples/hello_world.py +0 -0
  41. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/hello/examples/nyc_parquet.py +0 -0
  42. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/hello/examples/pytorch.py +0 -0
  43. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/hello/examples/xarray_nwm.py +0 -0
  44. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/hello/scripts/fill_ipython.py +0 -0
  45. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/hello/scripts/nyc_parquet.py +0 -0
  46. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/hello/scripts/pytorch.py +0 -0
  47. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/hello/scripts/xarray_nwm.py +0 -0
  48. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/hello/utils.py +0 -0
  49. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/login.py +0 -0
  50. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/notebook/__init__.py +0 -0
  51. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/notebook/notebook.py +0 -0
  52. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/package_sync.py +0 -0
  53. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/prefect.py +0 -0
  54. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/prefect_serve.py +0 -0
  55. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/run.py +0 -0
  56. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/setup/__init__.py +0 -0
  57. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/setup/amp.py +0 -0
  58. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/setup/aws.py +0 -0
  59. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/setup/azure.py +0 -0
  60. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/setup/entry.py +0 -0
  61. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/setup/gcp.py +0 -0
  62. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/setup/prometheus.py +0 -0
  63. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/setup/util.py +0 -0
  64. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/sync.py +0 -0
  65. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cli/utils.py +0 -0
  66. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/cluster.py +0 -0
  67. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/coiled.yaml +0 -0
  68. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/compatibility.py +0 -0
  69. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/config.py +0 -0
  70. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/context.py +0 -0
  71. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/core.py +0 -0
  72. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/credentials/__init__.py +0 -0
  73. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/credentials/aws.py +0 -0
  74. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/credentials/google.py +0 -0
  75. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/errors.py +0 -0
  76. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/exceptions.py +0 -0
  77. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/extensions/__init__.py +0 -0
  78. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/extensions/prefect/__init__.py +0 -0
  79. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/extensions/prefect/runners.py +0 -0
  80. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/extensions/prefect/workers.py +0 -0
  81. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/function.py +0 -0
  82. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/plugins.py +0 -0
  83. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/prefect.py +0 -0
  84. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/pypi_conda_map.py +0 -0
  85. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/scan.py +0 -0
  86. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/software.py +0 -0
  87. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/software_utils.py +0 -0
  88. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/spans.py +0 -0
  89. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/spark.py +0 -0
  90. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/types.py +0 -0
  91. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/utils.py +0 -0
  92. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/v2/__init__.py +0 -0
  93. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/v2/cluster.py +0 -0
  94. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/v2/core.py +0 -0
  95. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/v2/cwi_log_link.py +0 -0
  96. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/v2/states.py +0 -0
  97. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/v2/widgets/__init__.py +0 -0
  98. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/v2/widgets/interface.py +0 -0
  99. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/v2/widgets/rich.py +0 -0
  100. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/v2/widgets/util.py +0 -0
  101. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/coiled/websockets.py +0 -0
  102. {coiled-1.124.1.dev5 → coiled-1.125.1.dev2}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: coiled
3
- Version: 1.124.1.dev5
3
+ Version: 1.125.1.dev2
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>
@@ -0,0 +1,116 @@
1
+ import click
2
+
3
+ import coiled
4
+ from coiled.filestore import FilestoreManager
5
+
6
+ from .cluster.utils import find_cluster
7
+ from .utils import CONTEXT_SETTINGS
8
+
9
+
10
+ @click.command(
11
+ context_settings=CONTEXT_SETTINGS,
12
+ )
13
+ @click.argument("cluster", default="", required=False)
14
+ @click.option(
15
+ "--workspace",
16
+ default=None,
17
+ help="Coiled workspace (uses default workspace if not specified).",
18
+ )
19
+ @click.option(
20
+ "--filestore",
21
+ default=None,
22
+ help="Name of filestore (optional).",
23
+ )
24
+ @click.option(
25
+ "--filter",
26
+ "name_includes",
27
+ default=None,
28
+ help="Filter on file paths and/or names to download (optional).",
29
+ )
30
+ @click.option("--into", default=".")
31
+ def download(cluster, workspace, filestore, name_includes, into):
32
+ if filestore:
33
+ filestores = FilestoreManager.get_filestore(name=filestore) or []
34
+ if not filestores:
35
+ print(f"{filestore} filestore not found")
36
+
37
+ for fs in filestores:
38
+ coiled.filestore.download_from_filestore_with_ui(
39
+ fs=fs,
40
+ into=into,
41
+ name_includes=name_includes,
42
+ )
43
+
44
+ else:
45
+ with coiled.Cloud(workspace=workspace) as cloud:
46
+ cluster_info = find_cluster(cloud, cluster)
47
+ cluster_id = cluster_info["id"]
48
+ attachments = FilestoreManager.get_cluster_attachments(cluster_id)
49
+ if not attachments:
50
+ print(f"No filestore found for {cluster_info['name']} ({cluster_info['id']})")
51
+
52
+ # TODO (possible enhancement) if there are multiple output filestores, let user pick which to download
53
+ for attachment in attachments:
54
+ if attachment["output"]:
55
+ coiled.filestore.download_from_filestore_with_ui(
56
+ fs=attachment["filestore"],
57
+ into=into,
58
+ name_includes=name_includes,
59
+ )
60
+
61
+
62
+ @click.command(
63
+ context_settings=CONTEXT_SETTINGS,
64
+ )
65
+ @click.argument("cluster", default="", required=False)
66
+ @click.option(
67
+ "--workspace",
68
+ default=None,
69
+ help="Coiled workspace (uses default workspace if not specified).",
70
+ )
71
+ @click.option(
72
+ "--filestore",
73
+ default=None,
74
+ help="Name of filestore (optional).",
75
+ )
76
+ @click.option(
77
+ "--filter",
78
+ "name_includes",
79
+ default=None,
80
+ help="Filter on file paths and/or names to download (optional).",
81
+ )
82
+ def list_files(cluster, workspace, filestore, name_includes):
83
+ if filestore:
84
+ filestores = FilestoreManager.get_filestore(name=filestore) or []
85
+ if not filestores:
86
+ print(f"{filestore} filestore not found")
87
+
88
+ for fs in filestores:
89
+ coiled.filestore.list_files_ui(
90
+ fs=fs,
91
+ name_includes=name_includes,
92
+ )
93
+
94
+ else:
95
+ with coiled.Cloud(workspace=workspace) as cloud:
96
+ cluster_info = find_cluster(cloud, cluster)
97
+ cluster_id = cluster_info["id"]
98
+ attachments = FilestoreManager.get_cluster_attachments(cluster_id)
99
+ if not attachments:
100
+ print(f"No filestore found for {cluster_info['name']} ({cluster_info['id']})")
101
+
102
+ # TODO (possible enhancement) if there are multiple output filestores, let user pick which to download
103
+ for attachment in attachments:
104
+ if attachment["output"]:
105
+ coiled.filestore.list_files_ui(
106
+ fs=attachment["filestore"],
107
+ name_includes=name_includes,
108
+ )
109
+
110
+
111
+ @click.group(name="file", context_settings=CONTEXT_SETTINGS)
112
+ def file_group(): ...
113
+
114
+
115
+ file_group.add_command(download)
116
+ file_group.add_command(list_files, "list")
@@ -1,8 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import asyncio
4
- import json
5
- import subprocess
6
4
  import sys
7
5
  import time
8
6
 
@@ -18,6 +16,7 @@ import coiled
18
16
  from coiled.scan import scan_prefix
19
17
  from coiled.utils import login_if_required
20
18
 
19
+ from ..curl import sync_request
21
20
  from .examples import examples
22
21
  from .utils import PRIMARY_COLOR, Panel, console, has_macos_system_python, log_interactions
23
22
 
@@ -41,8 +40,10 @@ def needs_login():
41
40
 
42
41
 
43
42
  def get_interactions():
44
- response = subprocess.check_output(["coiled", "curl", "/api/v2/interactions/user-interactions/hello"])
45
- return json.loads(response, strict=False)
43
+ with coiled.Cloud() as cloud:
44
+ return sync_request(
45
+ cloud, url=f"{cloud.server}/api/v2/interactions/user-interactions/hello", method="get", json_output=True
46
+ )
46
47
 
47
48
 
48
49
  def get_already_run_examples():
@@ -33,10 +33,24 @@ def wait_until_complete(cluster_id, wait_for_output=True, wait_for_input=False):
33
33
  return attachments
34
34
 
35
35
 
36
- def download_from_filestore_with_ui(fs, into="."):
36
+ def list_files_ui(fs, name_includes=None):
37
+ blobs = FilestoreManager.get_download_list_with_urls(fs["id"])
38
+
39
+ if name_includes:
40
+ blobs = [blob for blob in blobs if name_includes in blob["relative_path"]]
41
+
42
+ for blob in blobs:
43
+ print(blob["relative_path"])
44
+
45
+
46
+ def download_from_filestore_with_ui(fs, into=".", name_includes=None):
37
47
  if fs:
38
48
  # TODO (possible enhancement) if "has files" flag is set then make sure we do see files to download?
39
49
  blobs = FilestoreManager.get_download_list_with_urls(fs["id"])
50
+
51
+ if name_includes:
52
+ blobs = [blob for blob in blobs if name_includes in blob["relative_path"]]
53
+
40
54
  total_bytes = sum(blob["size"] for blob in blobs)
41
55
 
42
56
  size_label = "Bytes"
@@ -195,6 +209,11 @@ class FilestoreManagerWithoutHttp:
195
209
  def make_req(api_path, post=False, data=None):
196
210
  raise NotImplementedError()
197
211
 
212
+ @classmethod
213
+ def get_filestore(cls, name=None):
214
+ if name:
215
+ return cls.make_req(f"/api/v2/filestore/name/{name}").get("filestores")
216
+
198
217
  @classmethod
199
218
  def get_or_create_filestores(cls, names, workspace, region):
200
219
  return cls.make_req(
@@ -1,41 +0,0 @@
1
- import click
2
-
3
- import coiled
4
- from coiled.filestore import FilestoreManager
5
-
6
- from .cluster.utils import find_cluster
7
- from .utils import CONTEXT_SETTINGS
8
-
9
-
10
- @click.command(
11
- context_settings=CONTEXT_SETTINGS,
12
- )
13
- @click.argument("cluster", default="", required=False)
14
- @click.option(
15
- "--workspace",
16
- default=None,
17
- help="Coiled workspace (uses default workspace if not specified).",
18
- )
19
- @click.option("--into", default=".")
20
- def download(cluster, workspace, into):
21
- with coiled.Cloud(workspace=workspace) as cloud:
22
- cluster_info = find_cluster(cloud, cluster)
23
- cluster_id = cluster_info["id"]
24
- attachments = FilestoreManager.get_cluster_attachments(cluster_id)
25
- if not attachments:
26
- print(f"No filestore found for {cluster_info['name']} ({cluster_info['id']})")
27
-
28
- # TODO (possible enhancement) if there are multiple output filestores, let user pick which to download
29
- for attachment in attachments:
30
- if attachment["output"]:
31
- coiled.filestore.download_from_filestore_with_ui(
32
- fs=attachment["filestore"],
33
- into=download,
34
- )
35
-
36
-
37
- @click.group(name="file", context_settings=CONTEXT_SETTINGS)
38
- def file_group(): ...
39
-
40
-
41
- file_group.add_command(download)
File without changes
File without changes
File without changes