tangle-cli 0.1.17__tar.gz → 0.1.18__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.
Files changed (103) hide show
  1. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/PKG-INFO +1 -1
  2. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/__init__.py +1 -1
  3. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/task_env.py +62 -11
  4. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/pyproject.toml +1 -1
  5. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/pyproject.toml.orig +1 -1
  6. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/README.md +0 -0
  7. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/api_cli.py +0 -0
  8. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/api_schema.py +0 -0
  9. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/api_transport.py +0 -0
  10. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/args_container.py +0 -0
  11. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/artifacts.py +0 -0
  12. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/artifacts_cli.py +0 -0
  13. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/authenticated_identity.py +0 -0
  14. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/cli.py +0 -0
  15. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/cli_helpers.py +0 -0
  16. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/cli_options.py +0 -0
  17. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/client.py +0 -0
  18. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/component_from_func.py +0 -0
  19. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/component_generator.py +0 -0
  20. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/component_inspector.py +0 -0
  21. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/component_publisher.py +0 -0
  22. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/components_cli.py +0 -0
  23. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/dynamic_discovery_client.py +0 -0
  24. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/generated_model_extensions.py +0 -0
  25. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/handler.py +0 -0
  26. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/hydration_trust.py +0 -0
  27. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/logger.py +0 -0
  28. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/models.py +0 -0
  29. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/module_bundler.py +0 -0
  30. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/openapi/__init__.py +0 -0
  31. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/openapi/codegen.py +0 -0
  32. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/openapi/parser.py +0 -0
  33. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/pipeline_compiler.py +0 -0
  34. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/pipeline_dehydrator.py +0 -0
  35. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/pipeline_hydrator.py +0 -0
  36. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/pipeline_run_annotations.py +0 -0
  37. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/pipeline_run_details.py +0 -0
  38. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/pipeline_run_manager.py +0 -0
  39. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/pipeline_run_search.py +0 -0
  40. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/pipeline_runner.py +0 -0
  41. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/pipeline_runs_cli.py +0 -0
  42. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/pipeline_spec_utils.py +0 -0
  43. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/pipeline_validation.py +0 -0
  44. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/pipelines.py +0 -0
  45. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/pipelines_cli.py +0 -0
  46. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/published_components_cli.py +0 -0
  47. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/py.typed +0 -0
  48. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/__init__.py +0 -0
  49. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/cfg.py +0 -0
  50. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/compiler_context.py +0 -0
  51. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/dynamic_data.py +0 -0
  52. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/emit.py +0 -0
  53. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/errors.py +0 -0
  54. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/graph.py +0 -0
  55. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/ids.py +0 -0
  56. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/pipeline.py +0 -0
  57. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/placeholders.py +0 -0
  58. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/publish.py +0 -0
  59. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/raw.py +0 -0
  60. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/ref.py +0 -0
  61. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/registered.py +0 -0
  62. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/subpipeline.py +0 -0
  63. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/task.py +0 -0
  64. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/trace.py +0 -0
  65. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/python_pipeline/types.py +0 -0
  66. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/quickstart.py +0 -0
  67. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/schema_validation.py +0 -0
  68. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/schemas/__init__.py +0 -0
  69. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/schemas/dehydrated_pipeline_schema.json +0 -0
  70. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/schemas/pipeline_schema.json +0 -0
  71. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/secrets.py +0 -0
  72. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/secrets_cli.py +0 -0
  73. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/utils.py +0 -0
  74. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/packages/tangle-cli/src/tangle_cli/version_manager.py +0 -0
  75. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/OSS-CONVENTIONS.md +0 -0
  76. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/PORT-README.md +0 -0
  77. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/SKILL.md +0 -0
  78. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/agents/auth-wizard.md +0 -0
  79. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/agents/builder.md +0 -0
  80. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/agents/debugger.md +0 -0
  81. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/agents/reporter.md +0 -0
  82. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/agents/researcher.md +0 -0
  83. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/agents/reviewer.md +0 -0
  84. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/agents/scenario-builder.md +0 -0
  85. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/data-sources.md +0 -0
  86. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/event-log.md +0 -0
  87. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/example-scenarios/01-mslr-ranking.md +0 -0
  88. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/example-scenarios/02-text-classification.md +0 -0
  89. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/example-scenarios/INDEX.md +0 -0
  90. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/iterating-on-runs.md +0 -0
  91. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/knowledge-corpus.md +0 -0
  92. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/secrets.md +0 -0
  93. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/setup.md +0 -0
  94. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/step-0-initialize.md +0 -0
  95. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/step-1-analyze.md +0 -0
  96. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/step-2-hypothesize.md +0 -0
  97. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/step-3-submit.md +0 -0
  98. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/step-4-monitor.md +0 -0
  99. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/step-5-evaluate.md +0 -0
  100. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/step-6-synthesize.md +0 -0
  101. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/step-7-decide.md +0 -0
  102. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/tangle-tools.md +0 -0
  103. {tangle_cli-0.1.17 → tangle_cli-0.1.18}/skills/tangent/references/uploading-artifacts.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: tangle-cli
3
- Version: 0.1.17
3
+ Version: 0.1.18
4
4
  Summary: CLI for Tangle, the open-source ML pipeline orchestration platform
5
5
  Author: Alexey Volkov, Tangle authors, Volv Grebennikov
6
6
  Author-email: Alexey Volkov <alexey.volkov@ark-kun.com>, Volv Grebennikov <volv.grebennikov@shopify.com>
@@ -14,6 +14,6 @@ from tangle_cli.dynamic_discovery_client import TangleDynamicDiscoveryClient
14
14
  try:
15
15
  __version__ = metadata_version("tangle-cli")
16
16
  except PackageNotFoundError:
17
- __version__ = "0.1.17"
17
+ __version__ = "0.1.18"
18
18
 
19
19
  __all__ = ["TangleDynamicDiscoveryClient", "__version__"]
@@ -36,10 +36,65 @@ from __future__ import annotations
36
36
  import inspect
37
37
  from dataclasses import dataclass
38
38
  from pathlib import Path
39
+ from types import FrameType
39
40
  from typing import TypeVar
40
41
 
41
42
  _TaskEnvT = TypeVar("_TaskEnvT", bound="TaskEnv")
42
43
 
44
+ #: A dataclass-generated ``__init__`` is compiled by ``exec``, so its code
45
+ #: object carries this synthetic filename instead of a real module path.
46
+ _GENERATED_CODE_FILENAME = "<string>"
47
+
48
+ #: Hard bound on the frame walk below. Construction of one object never needs
49
+ #: this many frames; the bound only keeps a pathological stack from being
50
+ #: walked to its root, degrading to the documented working-directory fallback.
51
+ _MAX_CONSTRUCTION_FRAMES = 64
52
+
53
+
54
+ def _definition_site_file(instance: object) -> str | None:
55
+ """``__file__`` of the code that constructed ``instance``, or ``None``.
56
+
57
+ The definition site is the first frame *outside* the construction of this
58
+ object: the frame after the OUTERMOST construction frame, which is
59
+ normally the dataclass-generated ``__init__``. Because the boundary is
60
+ found by identity and not by a fixed ``f_back`` count, the answer is the
61
+ author's file at any dataclass subclass depth — a subclass that overrides
62
+ ``__post_init__`` and calls ``super()`` adds a frame, and adding frames no
63
+ longer changes the result. ``None`` means the site has no ``__file__``
64
+ (``exec``'d or interactive code), which callers treat as "unknown".
65
+ """
66
+
67
+ frames: list[FrameType] = []
68
+ frame = inspect.currentframe()
69
+ try:
70
+ # Skip this helper itself, then collect the stack above it.
71
+ frame = frame.f_back if frame is not None else None
72
+ while frame is not None and len(frames) < _MAX_CONSTRUCTION_FRAMES:
73
+ frames.append(frame)
74
+ frame = frame.f_back
75
+ finally:
76
+ # Break the frame reference cycle this function would otherwise leave.
77
+ del frame
78
+
79
+ try:
80
+ outermost = -1
81
+ for index, candidate in enumerate(frames):
82
+ # A frame constructing THIS object binds it to ``self``: the base
83
+ # and every subclass ``__post_init__``, plus the generated
84
+ # ``__init__``. Nothing outside the construction can hold the
85
+ # object yet, so this is exact rather than a frame count.
86
+ code = candidate.f_code
87
+ if candidate.f_locals.get("self") is instance or (
88
+ code.co_name == "__init__"
89
+ and code.co_filename == _GENERATED_CODE_FILENAME
90
+ ):
91
+ outermost = index
92
+ site = frames[outermost + 1] if outermost + 1 < len(frames) else None
93
+ filename = site.f_globals.get("__file__") if site is not None else None
94
+ return filename if isinstance(filename, str) and filename else None
95
+ finally:
96
+ del frames
97
+
43
98
 
44
99
  @dataclass(frozen=True)
45
100
  class TaskEnv:
@@ -49,7 +104,8 @@ class TaskEnv:
49
104
  image: Container image for the component. Required.
50
105
  dependencies_from: Optional path to a ``pyproject.toml`` (or any file
51
106
  the hydrator understands) declaring pip dependencies. A relative
52
- path is resolved at the ``TaskEnv`` *definition site*, so a shared
107
+ path is resolved at the ``TaskEnv`` *definition site* — the file
108
+ that constructed this env, at any subclass depth — so a shared
53
109
  ``_envs.py`` resolves intuitively; pass an absolute ``Path`` to
54
110
  avoid that. When omitted, the hydrator's existing dependency
55
111
  discovery still applies.
@@ -66,16 +122,11 @@ class TaskEnv:
66
122
 
67
123
  p = Path(self.dependencies_from)
68
124
  if not p.is_absolute():
69
- # Frames: __post_init__ -> generated __init__ -> the definition site.
70
- frame = inspect.currentframe()
71
- caller = (
72
- frame.f_back.f_back
73
- if frame and frame.f_back and frame.f_back.f_back
74
- else None
75
- )
76
- filename = caller.f_globals.get("__file__") if caller else None
77
- caller_dir = Path(filename).resolve().parent if filename else Path.cwd()
78
- p = caller_dir / p
125
+ filename = _definition_site_file(self)
126
+ # Working directory only as a last resort: the construction site
127
+ # has no file at all (exec'd or interactive code).
128
+ anchor = Path(filename).resolve().parent if filename else Path.cwd()
129
+ p = anchor / p
79
130
  # Frozen dataclass: bypass __setattr__ to store the resolved Path.
80
131
  object.__setattr__(self, "dependencies_from", p.resolve())
81
132
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tangle-cli"
3
- version = "0.1.17"
3
+ version = "0.1.18"
4
4
  description = "CLI for Tangle, the open-source ML pipeline orchestration platform"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.10"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tangle-cli"
3
- version = "0.1.17"
3
+ version = "0.1.18"
4
4
  description = "CLI for Tangle, the open-source ML pipeline orchestration platform"
5
5
  readme = "README.md"
6
6
  authors = [
File without changes