flyte 0.0.1b3__py3-none-any.whl → 0.2.0b0__py3-none-any.whl

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 flyte might be problematic. Click here for more details.

Files changed (209) hide show
  1. flyte/_cli/_common.py +12 -0
  2. {union → flyte}/_cli/_params.py +106 -147
  3. flyte/_cli/_run.py +24 -2
  4. flyte/_cli/main.py +28 -2
  5. flyte/_image.py +1 -2
  6. flyte/_initialize.py +24 -15
  7. flyte/_internal/runtime/convert.py +6 -0
  8. flyte/_run.py +0 -1
  9. flyte/_version.py +2 -2
  10. flyte/config/__init__.py +168 -0
  11. flyte/config/_config.py +196 -0
  12. flyte/config/_internal.py +64 -0
  13. flyte/remote/_console.py +1 -1
  14. flyte/types/_type_engine.py +4 -3
  15. {flyte-0.0.1b3.dist-info → flyte-0.2.0b0.dist-info}/METADATA +1 -1
  16. flyte-0.2.0b0.dist-info/RECORD +204 -0
  17. flyte-0.0.1b3.dist-info/RECORD +0 -390
  18. union/__init__.py +0 -54
  19. union/_api_commons.py +0 -3
  20. union/_bin/__init__.py +0 -0
  21. union/_bin/runtime.py +0 -113
  22. union/_build.py +0 -25
  23. union/_cache/__init__.py +0 -12
  24. union/_cache/cache.py +0 -141
  25. union/_cache/defaults.py +0 -9
  26. union/_cache/policy_function_body.py +0 -42
  27. union/_cli/__init__.py +0 -0
  28. union/_cli/_common.py +0 -263
  29. union/_cli/_create.py +0 -40
  30. union/_cli/_delete.py +0 -23
  31. union/_cli/_deploy.py +0 -120
  32. union/_cli/_get.py +0 -162
  33. union/_cli/_run.py +0 -150
  34. union/_cli/main.py +0 -72
  35. union/_code_bundle/__init__.py +0 -8
  36. union/_code_bundle/_ignore.py +0 -113
  37. union/_code_bundle/_packaging.py +0 -187
  38. union/_code_bundle/_utils.py +0 -342
  39. union/_code_bundle/bundle.py +0 -176
  40. union/_context.py +0 -146
  41. union/_datastructures.py +0 -295
  42. union/_deploy.py +0 -185
  43. union/_doc.py +0 -29
  44. union/_docstring.py +0 -26
  45. union/_environment.py +0 -43
  46. union/_group.py +0 -31
  47. union/_hash.py +0 -23
  48. union/_image.py +0 -760
  49. union/_initialize.py +0 -585
  50. union/_interface.py +0 -84
  51. union/_internal/__init__.py +0 -3
  52. union/_internal/controllers/__init__.py +0 -77
  53. union/_internal/controllers/_local_controller.py +0 -77
  54. union/_internal/controllers/pbhash.py +0 -39
  55. union/_internal/controllers/remote/__init__.py +0 -40
  56. union/_internal/controllers/remote/_action.py +0 -131
  57. union/_internal/controllers/remote/_client.py +0 -43
  58. union/_internal/controllers/remote/_controller.py +0 -169
  59. union/_internal/controllers/remote/_core.py +0 -341
  60. union/_internal/controllers/remote/_informer.py +0 -260
  61. union/_internal/controllers/remote/_service_protocol.py +0 -44
  62. union/_internal/imagebuild/__init__.py +0 -11
  63. union/_internal/imagebuild/docker_builder.py +0 -416
  64. union/_internal/imagebuild/image_builder.py +0 -243
  65. union/_internal/imagebuild/remote_builder.py +0 -0
  66. union/_internal/resolvers/__init__.py +0 -0
  67. union/_internal/resolvers/_task_module.py +0 -31
  68. union/_internal/resolvers/common.py +0 -24
  69. union/_internal/resolvers/default.py +0 -27
  70. union/_internal/runtime/__init__.py +0 -0
  71. union/_internal/runtime/convert.py +0 -163
  72. union/_internal/runtime/entrypoints.py +0 -121
  73. union/_internal/runtime/io.py +0 -136
  74. union/_internal/runtime/resources_serde.py +0 -134
  75. union/_internal/runtime/task_serde.py +0 -202
  76. union/_internal/runtime/taskrunner.py +0 -179
  77. union/_internal/runtime/types_serde.py +0 -53
  78. union/_logging.py +0 -124
  79. union/_protos/__init__.py +0 -0
  80. union/_protos/common/authorization_pb2.py +0 -66
  81. union/_protos/common/authorization_pb2.pyi +0 -106
  82. union/_protos/common/authorization_pb2_grpc.py +0 -4
  83. union/_protos/common/identifier_pb2.py +0 -71
  84. union/_protos/common/identifier_pb2.pyi +0 -82
  85. union/_protos/common/identifier_pb2_grpc.py +0 -4
  86. union/_protos/common/identity_pb2.py +0 -48
  87. union/_protos/common/identity_pb2.pyi +0 -72
  88. union/_protos/common/identity_pb2_grpc.py +0 -4
  89. union/_protos/common/list_pb2.py +0 -36
  90. union/_protos/common/list_pb2.pyi +0 -69
  91. union/_protos/common/list_pb2_grpc.py +0 -4
  92. union/_protos/common/policy_pb2.py +0 -37
  93. union/_protos/common/policy_pb2.pyi +0 -27
  94. union/_protos/common/policy_pb2_grpc.py +0 -4
  95. union/_protos/common/role_pb2.py +0 -37
  96. union/_protos/common/role_pb2.pyi +0 -51
  97. union/_protos/common/role_pb2_grpc.py +0 -4
  98. union/_protos/common/runtime_version_pb2.py +0 -28
  99. union/_protos/common/runtime_version_pb2.pyi +0 -24
  100. union/_protos/common/runtime_version_pb2_grpc.py +0 -4
  101. union/_protos/logs/dataplane/payload_pb2.py +0 -96
  102. union/_protos/logs/dataplane/payload_pb2.pyi +0 -168
  103. union/_protos/logs/dataplane/payload_pb2_grpc.py +0 -4
  104. union/_protos/secret/definition_pb2.py +0 -49
  105. union/_protos/secret/definition_pb2.pyi +0 -93
  106. union/_protos/secret/definition_pb2_grpc.py +0 -4
  107. union/_protos/secret/payload_pb2.py +0 -62
  108. union/_protos/secret/payload_pb2.pyi +0 -94
  109. union/_protos/secret/payload_pb2_grpc.py +0 -4
  110. union/_protos/secret/secret_pb2.py +0 -38
  111. union/_protos/secret/secret_pb2.pyi +0 -6
  112. union/_protos/secret/secret_pb2_grpc.py +0 -198
  113. union/_protos/validate/validate/validate_pb2.py +0 -76
  114. union/_protos/workflow/node_execution_service_pb2.py +0 -26
  115. union/_protos/workflow/node_execution_service_pb2.pyi +0 -4
  116. union/_protos/workflow/node_execution_service_pb2_grpc.py +0 -32
  117. union/_protos/workflow/queue_service_pb2.py +0 -75
  118. union/_protos/workflow/queue_service_pb2.pyi +0 -103
  119. union/_protos/workflow/queue_service_pb2_grpc.py +0 -172
  120. union/_protos/workflow/run_definition_pb2.py +0 -100
  121. union/_protos/workflow/run_definition_pb2.pyi +0 -256
  122. union/_protos/workflow/run_definition_pb2_grpc.py +0 -4
  123. union/_protos/workflow/run_logs_service_pb2.py +0 -41
  124. union/_protos/workflow/run_logs_service_pb2.pyi +0 -28
  125. union/_protos/workflow/run_logs_service_pb2_grpc.py +0 -69
  126. union/_protos/workflow/run_service_pb2.py +0 -133
  127. union/_protos/workflow/run_service_pb2.pyi +0 -173
  128. union/_protos/workflow/run_service_pb2_grpc.py +0 -412
  129. union/_protos/workflow/state_service_pb2.py +0 -58
  130. union/_protos/workflow/state_service_pb2.pyi +0 -69
  131. union/_protos/workflow/state_service_pb2_grpc.py +0 -138
  132. union/_protos/workflow/task_definition_pb2.py +0 -72
  133. union/_protos/workflow/task_definition_pb2.pyi +0 -65
  134. union/_protos/workflow/task_definition_pb2_grpc.py +0 -4
  135. union/_protos/workflow/task_service_pb2.py +0 -44
  136. union/_protos/workflow/task_service_pb2.pyi +0 -31
  137. union/_protos/workflow/task_service_pb2_grpc.py +0 -104
  138. union/_resources.py +0 -226
  139. union/_retry.py +0 -32
  140. union/_reusable_environment.py +0 -25
  141. union/_run.py +0 -374
  142. union/_secret.py +0 -61
  143. union/_task.py +0 -354
  144. union/_task_environment.py +0 -186
  145. union/_timeout.py +0 -47
  146. union/_tools.py +0 -27
  147. union/_utils/__init__.py +0 -11
  148. union/_utils/asyn.py +0 -119
  149. union/_utils/file_handling.py +0 -71
  150. union/_utils/helpers.py +0 -46
  151. union/_utils/lazy_module.py +0 -54
  152. union/_utils/uv_script_parser.py +0 -49
  153. union/_version.py +0 -21
  154. union/connectors/__init__.py +0 -0
  155. union/errors.py +0 -128
  156. union/extras/__init__.py +0 -5
  157. union/extras/_container.py +0 -263
  158. union/io/__init__.py +0 -11
  159. union/io/_dataframe.py +0 -0
  160. union/io/_dir.py +0 -425
  161. union/io/_file.py +0 -418
  162. union/io/pickle/__init__.py +0 -0
  163. union/io/pickle/transformer.py +0 -117
  164. union/io/structured_dataset/__init__.py +0 -122
  165. union/io/structured_dataset/basic_dfs.py +0 -219
  166. union/io/structured_dataset/structured_dataset.py +0 -1057
  167. union/py.typed +0 -0
  168. union/remote/__init__.py +0 -23
  169. union/remote/_client/__init__.py +0 -0
  170. union/remote/_client/_protocols.py +0 -129
  171. union/remote/_client/auth/__init__.py +0 -12
  172. union/remote/_client/auth/_authenticators/__init__.py +0 -0
  173. union/remote/_client/auth/_authenticators/base.py +0 -391
  174. union/remote/_client/auth/_authenticators/client_credentials.py +0 -73
  175. union/remote/_client/auth/_authenticators/device_code.py +0 -120
  176. union/remote/_client/auth/_authenticators/external_command.py +0 -77
  177. union/remote/_client/auth/_authenticators/factory.py +0 -200
  178. union/remote/_client/auth/_authenticators/pkce.py +0 -515
  179. union/remote/_client/auth/_channel.py +0 -184
  180. union/remote/_client/auth/_client_config.py +0 -83
  181. union/remote/_client/auth/_default_html.py +0 -32
  182. union/remote/_client/auth/_grpc_utils/__init__.py +0 -0
  183. union/remote/_client/auth/_grpc_utils/auth_interceptor.py +0 -204
  184. union/remote/_client/auth/_grpc_utils/default_metadata_interceptor.py +0 -144
  185. union/remote/_client/auth/_keyring.py +0 -154
  186. union/remote/_client/auth/_token_client.py +0 -258
  187. union/remote/_client/auth/errors.py +0 -16
  188. union/remote/_client/controlplane.py +0 -86
  189. union/remote/_data.py +0 -149
  190. union/remote/_logs.py +0 -74
  191. union/remote/_project.py +0 -86
  192. union/remote/_run.py +0 -820
  193. union/remote/_secret.py +0 -132
  194. union/remote/_task.py +0 -193
  195. union/report/__init__.py +0 -3
  196. union/report/_report.py +0 -178
  197. union/report/_template.html +0 -124
  198. union/storage/__init__.py +0 -24
  199. union/storage/_remote_fs.py +0 -34
  200. union/storage/_storage.py +0 -247
  201. union/storage/_utils.py +0 -5
  202. union/types/__init__.py +0 -11
  203. union/types/_renderer.py +0 -162
  204. union/types/_string_literals.py +0 -120
  205. union/types/_type_engine.py +0 -2131
  206. union/types/_utils.py +0 -80
  207. {flyte-0.0.1b3.dist-info → flyte-0.2.0b0.dist-info}/WHEEL +0 -0
  208. {flyte-0.0.1b3.dist-info → flyte-0.2.0b0.dist-info}/entry_points.txt +0 -0
  209. {flyte-0.0.1b3.dist-info → flyte-0.2.0b0.dist-info}/top_level.txt +0 -0
union/_cli/_create.py DELETED
@@ -1,40 +0,0 @@
1
- from typing import get_args
2
-
3
- import rich_click as click
4
-
5
- import union._cli._common as common
6
- from union.remote._secret import SecretTypes
7
-
8
-
9
- @click.group(name="create")
10
- def create():
11
- """
12
- Create a new task or environment.
13
- """
14
-
15
-
16
- @create.command(cls=common.CommandBase)
17
- @click.argument("name", type=str, required=True)
18
- @click.argument("value", type=str, required=False)
19
- @click.option("--from-file", type=click.Path(exists=True), help="Path to the file with the binary secret.")
20
- @click.option("--type", type=click.Choice(get_args(SecretTypes)), default="regular", help="Type of the secret.")
21
- @click.pass_obj
22
- def secret(
23
- cfg: common.CLIConfig,
24
- name: str,
25
- value: str | None = None,
26
- from_file: str | None = None,
27
- type: SecretTypes = "regular",
28
- project: str | None = None,
29
- domain: str | None = None,
30
- ):
31
- """
32
- Create a new secret.
33
- """
34
- from union.remote import Secret
35
-
36
- cfg.init(project, domain)
37
- if from_file:
38
- with open(from_file, "rb") as f:
39
- value = f.read()
40
- Secret.create(name=name, value=value, type=type)
union/_cli/_delete.py DELETED
@@ -1,23 +0,0 @@
1
- import rich_click as click
2
-
3
- import union._cli._common as common
4
-
5
-
6
- @click.group(name="delete")
7
- def delete():
8
- """
9
- Delete a task or environment.
10
- """
11
-
12
-
13
- @click.command(cls=common.CommandBase)
14
- @click.argument("name", type=str, required=True)
15
- @click.pass_obj
16
- def secret(cfg: common.CLIConfig, name: str, project: str | None = None, domain: str | None = None):
17
- """
18
- Delete a secret.
19
- """
20
- from union.remote import Secret
21
-
22
- cfg.init(project, domain)
23
- Secret.delete(name=name)
union/_cli/_deploy.py DELETED
@@ -1,120 +0,0 @@
1
- from dataclasses import dataclass, fields
2
- from pathlib import Path
3
- from types import ModuleType
4
- from typing import Any, Dict, List, cast
5
-
6
- import click
7
-
8
- import union
9
-
10
- from .._code_bundle._utils import CopyFiles
11
- from . import _common as common
12
- from ._common import CLIConfig
13
-
14
-
15
- @dataclass
16
- class DeployArguments:
17
- project: str = common.make_click_option_field(common.PROJECT_OPTION)
18
- domain: str = common.make_click_option_field(common.DOMAIN_OPTION)
19
- dry_run: bool = common.make_click_option_field(common.DRY_RUN_OPTION)
20
- copy_style: CopyFiles = common.make_click_option_field(
21
- click.Option(
22
- ["--copy-style"],
23
- type=click.Choice(["loaded_modules", "all_files", "none"]),
24
- default="loaded_modules",
25
- help="Copy style to use when running the task",
26
- )
27
- )
28
- version: CopyFiles = common.make_click_option_field(
29
- click.Option(
30
- ["--version"],
31
- type=str,
32
- required=False,
33
- help="If no files are copied, user must specify a version to register tasks with",
34
- )
35
- )
36
-
37
- @classmethod
38
- def from_dict(cls, d: Dict[str, Any]) -> "DeployArguments":
39
- return cls(**d)
40
-
41
- @classmethod
42
- def options(cls) -> List[click.Option]:
43
- """
44
- Return the set of base parameters added to every pyflyte run workflow subcommand.
45
- """
46
- return [common.get_option_from_metadata(f.metadata) for f in fields(cls) if f.metadata]
47
-
48
-
49
- class DeployEnvCommand(click.Command):
50
- def __init__(self, obj_name: str, obj: Any, deploy_args: DeployArguments, *args, **kwargs):
51
- self.obj_name = obj_name
52
- self.obj = obj
53
- self.deploy_args = deploy_args
54
- super().__init__(name=obj_name, *args, **kwargs)
55
-
56
- def invoke(self, ctx):
57
- print(f"Deploying environment: {self.obj_name}")
58
- obj: CLIConfig = ctx.obj
59
- obj.remote_init(self.deploy_args.project, self.deploy_args.domain)
60
- return union.deploy(
61
- self.obj,
62
- dryrun=self.deploy_args.dry_run,
63
- copy_style=self.deploy_args.copy_style,
64
- version=self.deploy_args.version,
65
- )
66
-
67
-
68
- class EnvPerFileGroup(common.ObjectsPerFileGroup):
69
- """
70
- Group that creates a command for each task in the current directory that is not __init__.py.
71
- """
72
-
73
- def __init__(self, filename: Path, deploy_args: DeployArguments, *args, **kwargs):
74
- super().__init__(*args, filename=filename, **kwargs)
75
- self.deploy_args = deploy_args
76
-
77
- def _filter_objects(self, module: ModuleType) -> Dict[str, Any]:
78
- return {k: v for k, v in module.__dict__.items() if isinstance(v, union.TaskEnvironment)}
79
-
80
- def _get_command_for_obj(self, ctx: click.Context, obj_name: str, obj: Any) -> click.Command:
81
- obj = cast(union.TaskEnvironment, obj)
82
- return DeployEnvCommand(
83
- obj_name=obj_name,
84
- obj=obj,
85
- help=obj.description,
86
- deploy_args=self.deploy_args,
87
- )
88
-
89
-
90
- class EnvFiles(common.FileGroup):
91
- """
92
- Group that creates a command for each file in the current directory that is not __init__.py.
93
- """
94
-
95
- common_options_enabled = False
96
-
97
- def __init__(
98
- self,
99
- *args,
100
- **kwargs,
101
- ):
102
- if "params" not in kwargs:
103
- kwargs["params"] = []
104
- kwargs["params"].extend(DeployArguments.options())
105
- super().__init__(*args, **kwargs)
106
-
107
- def get_command(self, ctx, filename):
108
- deploy_args = DeployArguments.from_dict(ctx.params)
109
- return EnvPerFileGroup(
110
- filename=Path(filename),
111
- deploy_args=deploy_args,
112
- name=filename,
113
- help=f"Run, functions decorated `env.task` or instances of Tasks in {filename}",
114
- )
115
-
116
-
117
- deploy = EnvFiles(
118
- name="deploy",
119
- help="deploy one or more environments from a python file.",
120
- )
union/_cli/_get.py DELETED
@@ -1,162 +0,0 @@
1
- import asyncio
2
-
3
- import rich_click as click
4
- from rich.console import Console
5
-
6
- from . import _common as common
7
-
8
-
9
- @click.group(name="get")
10
- def get():
11
- """
12
- Get the value of a task or environment.
13
- """
14
-
15
-
16
- @get.command()
17
- @click.argument("name", type=str, required=False)
18
- @click.pass_obj
19
- def project(cfg: common.CLIConfig, name: str | None = None):
20
- """
21
- Get the current project.
22
- """
23
- from union.remote import Project
24
-
25
- print(cfg)
26
- cfg.init()
27
-
28
- console = Console()
29
- if name:
30
- console.print(Project.get(name))
31
- else:
32
- console.print(common.get_table("Projects", Project.listall()))
33
-
34
-
35
- @get.command(cls=common.CommandBase)
36
- @click.argument("name", type=str, required=False)
37
- @click.pass_obj
38
- def run(cfg: common.CLIConfig, name: str | None = None, project: str | None = None, domain: str | None = None):
39
- """
40
- Get the current run.
41
- """
42
- from union.remote import Run, RunDetails
43
-
44
- cfg.init(project=project, domain=domain)
45
-
46
- console = Console()
47
- if name:
48
- details = RunDetails.get(name=name)
49
- console.print(details)
50
- else:
51
- console.print(common.get_table("Runs", Run.listall()))
52
-
53
-
54
- @get.command(cls=common.CommandBase)
55
- @click.argument("name", type=str, required=False)
56
- @click.argument("version", type=str, required=False)
57
- @click.pass_obj
58
- def task(
59
- cfg: common.CLIConfig,
60
- name: str | None = None,
61
- version: str | None = None,
62
- project: str | None = None,
63
- domain: str | None = None,
64
- ):
65
- """
66
- Get the current task.
67
- """
68
- from union.remote import Task
69
-
70
- cfg.init(project=project, domain=domain)
71
-
72
- console = Console()
73
- if name:
74
- v = Task.get(name=name, version=version)
75
- if v is None:
76
- raise click.BadParameter(f"Task {name} not found.")
77
- t = v.fetch()
78
- console.print(t)
79
- else:
80
- raise click.BadParameter("Task listing is not supported yet, please provide a name.")
81
- # console.print(common.get_table("Tasks", Task.listall()))
82
-
83
-
84
- @get.command(cls=common.CommandBase)
85
- @click.argument("run_name", type=str, required=True)
86
- @click.argument("action_name", type=str, required=False)
87
- @click.pass_obj
88
- def action(
89
- cfg: common.CLIConfig,
90
- run_name: str,
91
- action_name: str | None = None,
92
- project: str | None = None,
93
- domain: str | None = None,
94
- ):
95
- """
96
- Get all actions for a run or details for a specific action.
97
- """
98
- import union.remote as remote
99
-
100
- cfg.init(project=project, domain=domain)
101
-
102
- console = Console()
103
- if action_name:
104
- console.print(remote.Action.get(run_name=run_name, name=action_name))
105
- else:
106
- # List all actions for the run
107
- console.print(common.get_table(f"Actions for {run_name}", remote.Action.listall(for_run_name=run_name)))
108
-
109
-
110
- @get.command(cls=common.CommandBase)
111
- @click.argument("run_name", type=str, required=False)
112
- @click.argument("action_name", type=str, required=False)
113
- @click.pass_obj
114
- def logs(
115
- cfg: common.CLIConfig,
116
- run_name: str,
117
- action_name: str | None = None,
118
- project: str | None = None,
119
- domain: str | None = None,
120
- ):
121
- """
122
- Get the current run.
123
- """
124
- import union.remote as remote
125
-
126
- cfg.init(project=project, domain=domain)
127
-
128
- async def _run_log_view(_obj):
129
- task = asyncio.create_task(_obj.show_logs())
130
- try:
131
- await task
132
- except KeyboardInterrupt:
133
- task.cancel()
134
-
135
- if action_name:
136
- obj = remote.Action.get(run_name=run_name, name=action_name)
137
- else:
138
- obj = remote.Run.get(run_name)
139
- asyncio.run(_run_log_view(obj))
140
-
141
-
142
- @get.command(cls=common.CommandBase)
143
- @click.argument("name", type=str, required=False)
144
- @click.pass_obj
145
- def secret(
146
- cfg: common.CLIConfig,
147
- name: str | None = None,
148
- project: str | None = None,
149
- domain: str | None = None,
150
- ):
151
- """
152
- Get the current secret.
153
- """
154
- import union.remote as remote
155
-
156
- cfg.init(project=project, domain=domain)
157
-
158
- console = Console()
159
- if name:
160
- console.print(remote.Secret.get(name))
161
- else:
162
- console.print(common.get_table("Secrets", remote.Secret.listall()))
union/_cli/_run.py DELETED
@@ -1,150 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from union._logging import logger
4
- from dataclasses import dataclass, fields
5
- from pathlib import Path
6
- from types import ModuleType
7
- from typing import Any, Dict, List, cast
8
-
9
- import click
10
-
11
- import union
12
-
13
- from .._code_bundle._utils import CopyFiles
14
- from .._initialize import initialize_in_cluster, S3
15
- from .._task import TaskTemplate
16
- from . import _common as common
17
- from ._common import CLIConfig
18
-
19
-
20
- @dataclass
21
- class RunArguments:
22
- project: str = common.make_click_option_field(common.PROJECT_OPTION)
23
- domain: str = common.make_click_option_field(common.DOMAIN_OPTION)
24
- local: bool = common.make_click_option_field(
25
- click.Option(
26
- ["--local"],
27
- is_flag=True,
28
- help="Run the task locally",
29
- )
30
- )
31
- hybrid: bool = common.make_click_option_field(
32
- click.Option(
33
- ["--hybrid"],
34
- is_flag=True,
35
- help="hybrid mode",
36
- )
37
- )
38
- copy_style: CopyFiles = common.make_click_option_field(
39
- click.Option(
40
- ["--copy-style"],
41
- type=click.Choice(["loaded_modules", "all_files", "none"]),
42
- default="loaded_modules",
43
- help="Copy style to use when running the task",
44
- )
45
- )
46
-
47
- @classmethod
48
- def from_dict(cls, d: Dict[str, Any]) -> RunArguments:
49
- return cls(**d)
50
-
51
- @classmethod
52
- def options(cls) -> List[click.Option]:
53
- """
54
- Return the set of base parameters added to run subcommand.
55
- """
56
- return [common.get_option_from_metadata(f.metadata) for f in fields(cls) if f.metadata]
57
-
58
-
59
- class RunTaskCommand(click.Command):
60
- def __init__(self, obj_name: str, obj: Any, run_args: RunArguments, *args, **kwargs):
61
- self.obj_name = obj_name
62
- self.obj = cast(TaskTemplate, obj)
63
- self.run_args = run_args
64
- super().__init__(name=obj_name, *args, **kwargs)
65
-
66
- def invoke(self, ctx):
67
- obj: CLIConfig = ctx.obj
68
- obj.init(self.run_args.project, self.run_args.domain)
69
-
70
- # todo: remove this when backend supports
71
- from union.storage import get_random_local_path
72
-
73
- run_name = "random-run-" + str(get_random_local_path())[-8:]
74
- if self.run_args.local:
75
- mode = "local"
76
- elif self.run_args.hybrid:
77
- mode = "hybrid"
78
- # TODO configure storage correctly for cluster
79
- initialize_in_cluster(storage=S3.auto())
80
- else:
81
- mode = "remote"
82
- logger.debug(f"Running {self.obj_name} in {mode} mode")
83
- r = union.with_runcontext(
84
- name=run_name,
85
- copy_style=self.run_args.copy_style,
86
- version=self.run_args.copy_style,
87
- mode=mode,
88
- ).run(self.obj)
89
- # click.secho(f"Created Run: {r.action.id}", fg="green")
90
-
91
-
92
- class TaskPerFileGroup(common.ObjectsPerFileGroup):
93
- """
94
- Group that creates a command for each task in the current directory that is not __init__.py.
95
- """
96
-
97
- def __init__(self, filename: Path, run_args: RunArguments, *args, **kwargs):
98
- super().__init__(*args, filename=filename, **kwargs)
99
- self.run_args = run_args
100
-
101
- def _filter_objects(self, module: ModuleType) -> Dict[str, Any]:
102
- return {k: v for k, v in module.__dict__.items() if isinstance(v, TaskTemplate)}
103
-
104
- def _get_command_for_obj(self, ctx: click.Context, obj_name: str, obj: Any) -> click.Command:
105
- obj = cast(TaskTemplate, obj)
106
- return RunTaskCommand(
107
- obj_name=obj_name,
108
- obj=obj,
109
- help=obj.docs.__help__str__() if obj.docs else None,
110
- run_args=self.run_args,
111
- )
112
-
113
-
114
- class TaskFiles(common.FileGroup):
115
- """
116
- Group that creates a command for each file in the current directory that is not __init__.py.
117
- """
118
-
119
- common_options_enabled = False
120
-
121
- def __init__(
122
- self,
123
- *args,
124
- directory: Path | None = None,
125
- **kwargs,
126
- ):
127
- if "params" not in kwargs:
128
- kwargs["params"] = []
129
- kwargs["params"].extend(RunArguments.options())
130
- super().__init__(*args, directory=directory, **kwargs)
131
-
132
- def get_command(self, ctx, filename):
133
- run_args = RunArguments.from_dict(ctx.params)
134
- fp = Path(filename)
135
- if not fp.exists():
136
- raise click.BadParameter(f"File {filename} does not exist")
137
- if fp.is_dir():
138
- return TaskFiles(directory=fp)
139
- return TaskPerFileGroup(
140
- filename=Path(filename),
141
- run_args=run_args,
142
- name=filename,
143
- help=f"Run, functions decorated `env.task` or instances of Tasks in {filename}",
144
- )
145
-
146
-
147
- run = TaskFiles(
148
- name="run",
149
- help="Run a task from a python file",
150
- )
union/_cli/main.py DELETED
@@ -1,72 +0,0 @@
1
- import rich_click as click
2
-
3
- from ._common import CLIConfig
4
- from ._create import create
5
- from ._deploy import deploy
6
- from ._get import get
7
- from ._run import run
8
-
9
-
10
- def _verbosity_to_loglevel(verbosity: int) -> int | None:
11
- """
12
- Converts a verbosity level from the CLI to a logging level.
13
-
14
- :param verbosity: verbosity level from the CLI
15
- :return: logging level
16
- """
17
- import logging
18
-
19
- match verbosity:
20
- case 0:
21
- return None
22
- case 1:
23
- return logging.WARNING
24
- case 2:
25
- return logging.INFO
26
- case _:
27
- return logging.DEBUG
28
-
29
-
30
- @click.group(cls=click.RichGroup)
31
- @click.option(
32
- "--endpoint",
33
- type=str,
34
- required=False,
35
- help="The endpoint to connect to, this will override any config and simply used pkce to connect.",
36
- )
37
- @click.option(
38
- "--insecure",
39
- is_flag=True,
40
- required=False,
41
- help="insecure",
42
- type=bool,
43
- default=False,
44
- )
45
- @click.option(
46
- "-v",
47
- "--verbose",
48
- required=False,
49
- help="Show verbose messages and exception traces",
50
- count=True,
51
- default=0,
52
- type=int,
53
- )
54
- @click.option(
55
- "--org-override",
56
- type=str,
57
- required=False,
58
- help="Override for org",
59
- )
60
- @click.pass_context
61
- def main(ctx: click.Context, endpoint: str | None, insecure: bool, verbose: int, org_override: str | None):
62
- """
63
- v2 cli. Root command, please use one of the subcommands.
64
- """
65
- log_level = _verbosity_to_loglevel(verbose)
66
- ctx.obj = CLIConfig(log_level=log_level, endpoint=endpoint, insecure=insecure, org_override=org_override)
67
-
68
-
69
- main.add_command(run)
70
- main.add_command(deploy)
71
- main.add_command(get) # type: ignore
72
- main.add_command(create) # type: ignore
@@ -1,8 +0,0 @@
1
- from ._ignore import GitIgnore, IgnoreGroup, StandardIgnore
2
- from ._utils import CopyFiles
3
- from .bundle import build_code_bundle, build_pkl_bundle, download_bundle
4
-
5
- __all__ = ["CopyFiles", "build_code_bundle", "build_pkl_bundle", "default_ignores", "download_bundle"]
6
-
7
-
8
- default_ignores = [GitIgnore, StandardIgnore, IgnoreGroup]
@@ -1,113 +0,0 @@
1
- import os
2
- import pathlib
3
- import subprocess
4
- import tarfile as _tarfile
5
- from abc import ABC, abstractmethod
6
- from fnmatch import fnmatch
7
- from pathlib import Path
8
- from shutil import which
9
- from typing import List, Optional, Type
10
-
11
- from union._logging import logger
12
-
13
-
14
- class Ignore(ABC):
15
- """Base for Ignores, implements core logic. Children have to implement _is_ignored"""
16
-
17
- def __init__(self, root: Path):
18
- self.root = root
19
-
20
- def is_ignored(self, path: pathlib.Path) -> bool:
21
- return self._is_ignored(path)
22
-
23
- def tar_filter(self, tarinfo: _tarfile.TarInfo) -> Optional[_tarfile.TarInfo]:
24
- if self.is_ignored(pathlib.Path(tarinfo.name)):
25
- return None
26
- return tarinfo
27
-
28
- @abstractmethod
29
- def _is_ignored(self, path: pathlib.Path) -> bool:
30
- pass
31
-
32
-
33
- class GitIgnore(Ignore):
34
- """Uses git cli (if available) to list all ignored files and compare with those."""
35
-
36
- def __init__(self, root: Path):
37
- super().__init__(root)
38
- self.has_git = which("git") is not None
39
- self.ignored_files = self._list_ignored_files()
40
- self.ignored_dirs = self._list_ignored_dirs()
41
-
42
- def _git_wrapper(self, extra_args: List[str]) -> set[str]:
43
- if self.has_git:
44
- out = subprocess.run(
45
- ["git", "ls-files", "-io", "--exclude-standard", *extra_args],
46
- cwd=self.root,
47
- capture_output=True,
48
- check=False,
49
- )
50
- if out.returncode == 0:
51
- return set(out.stdout.decode("utf-8").split("\n")[:-1])
52
- logger.info(f"Could not determine ignored paths due to:\n{out.stderr}\nNot applying any filters")
53
- return set()
54
- logger.info("No git executable found, not applying any filters")
55
- return set()
56
-
57
- def _list_ignored_files(self) -> set[str]:
58
- return self._git_wrapper([])
59
-
60
- def _list_ignored_dirs(self) -> set[str]:
61
- return self._git_wrapper(["--directory"])
62
-
63
- def _is_ignored(self, path: str) -> bool:
64
- if self.ignored_files:
65
- # git-ls-files uses POSIX paths
66
- if Path(path).as_posix() in self.ignored_files:
67
- return True
68
- # Ignore empty directories
69
- if os.path.isdir(os.path.join(self.root, path)) and self.ignored_dirs:
70
- return Path(path).as_posix() + "/" in self.ignored_dirs
71
- return False
72
-
73
-
74
- STANDARD_IGNORE_PATTERNS = ["*.pyc", ".cache", ".cache/*", "__pycache__", "**/__pycache__"]
75
-
76
-
77
- class StandardIgnore(Ignore):
78
- """Retains the standard ignore functionality that previously existed. Could in theory
79
- by fed with custom ignore patterns from cli."""
80
-
81
- def __init__(self, root: Path, patterns: Optional[List[str]] = None):
82
- super().__init__(root)
83
- self.patterns = patterns if patterns else STANDARD_IGNORE_PATTERNS
84
-
85
- def _is_ignored(self, path: pathlib.Path) -> bool:
86
- for pattern in self.patterns:
87
- if fnmatch(str(path), pattern):
88
- return True
89
- return False
90
-
91
-
92
- class IgnoreGroup(Ignore):
93
- """Groups multiple Ignores and checks a path against them. A file is ignored if any
94
- Ignore considers it ignored."""
95
-
96
- def __init__(self, root: Path, *ignores: Type[Ignore]):
97
- super().__init__(root)
98
- self.ignores = [ignore(root) for ignore in ignores]
99
-
100
- def _is_ignored(self, path: pathlib.Path) -> bool:
101
- for ignore in self.ignores:
102
- if ignore.is_ignored(path):
103
- return True
104
- return False
105
-
106
- def list_ignored(self) -> List[str]:
107
- ignored = []
108
- for dir, _, files in self.root.walk():
109
- for file in files:
110
- abs_path = dir / file
111
- if self.is_ignored(abs_path):
112
- ignored.append(str(abs_path.relative_to(self.root)))
113
- return ignored