deriva-ml 1.14.35__tar.gz → 1.14.37__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.
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/PKG-INFO +1 -1
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/pyproject.toml +1 -0
- deriva_ml-1.14.37/src/deriva_ml/bump_version.py +142 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/execution/execution.py +9 -3
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/execution/workflow.py +3 -4
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/install_kernel.py +32 -6
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/schema/create_schema.py +1 -1
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml.egg-info/PKG-INFO +1 -1
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml.egg-info/SOURCES.txt +1 -1
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml.egg-info/entry_points.txt +1 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/conftest.py +2 -1
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/execution/test_execution.py +4 -1
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/test_utils.py +1 -1
- deriva_ml-1.14.35/release.sh +0 -37
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/.github/release-drafter.yml +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/.github/workflows/publish-docs.yml +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/.github/workflows/release.yml +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/.gitignore +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/LICENSE +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/README.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/.DS_Store +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/Notebooks/DerivaML Create Notes.ipynb +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/Notebooks/DerivaML Dataset.ipynb +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/Notebooks/DerivaML Execution.ipynb +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/Notebooks/DerivaML Features.ipynb +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/Notebooks/DerivaML Ingest.ipynb +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/Notebooks/DerivaML Vocabulary.ipynb +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/assets/ERD.png +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/assets/Launcher.png +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/assets/copy_minid.png +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/assets/deriva-logo.png +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/assets/deriva-ml.pdf +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/assets/sharing-at-home.pdf +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/code-docs/dataset.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/code-docs/dataset_aux_classes.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/code-docs/dataset_bag.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/code-docs/deriva_definitions.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/code-docs/deriva_ml_base.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/code-docs/deriva_model.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/code-docs/execution.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/code-docs/execution_configuration.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/code-docs/feature.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/code-docs/upload.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/index.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/release-notes.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/user-guide/datasets.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/user-guide/deriva_ml_structure.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/user-guide/execution-configuration.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/user-guide/file-assets.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/user-guide/identifiers.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/user-guide/install.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/user-guide/notebooks.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/docs/user-guide/overview.md +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/mkdocs.yml +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/setup.cfg +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/__init__.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/core/__init__.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/core/base.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/core/constants.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/core/definitions.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/core/enums.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/core/ermrest.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/core/exceptions.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/core/filespec.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/dataset/__init__.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/dataset/aux_classes.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/dataset/dataset.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/dataset/dataset_bag.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/dataset/history.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/dataset/upload.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/demo_catalog.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/execution/__init__.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/execution/environment.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/execution/execution_configuration.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/feature.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/model/__init__.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/model/catalog.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/model/database.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/model/sql_mapper.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/run_notebook.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/schema/__init__.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/schema/annotations.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/schema/check_schema.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/schema/deriva-ml-reference.json +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/schema/policy.json +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml/schema/table_comments_utils.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml.egg-info/dependency_links.txt +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml.egg-info/requires.txt +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/src/deriva_ml.egg-info/top_level.txt +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/__init__.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/core/__init__.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/core/test_basic_tables.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/core/test_file.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/core/test_vocabulary.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/dataset/__init__.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/dataset/demo-catalog-schema.json +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/dataset/deriva-ml-reference.json +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/dataset/eye-ai-catalog-schema.json +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/dataset/test_dataset_export.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/dataset/test_dataset_version.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/dataset/test_datasets.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/dataset/test_download.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/execution/__init__.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/execution/workflow-test.ipynb +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/execution/workflow-test.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/feature/test_features.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/model/__init__.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/model/test_database.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/model/test_models.py +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/test-files/execution-parameters.json +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/tests/test-files/notebook-parameters.json +0 -0
- {deriva_ml-1.14.35 → deriva_ml-1.14.37}/uv.lock +0 -0
|
@@ -28,6 +28,7 @@ deriva-ml-create-schema = "deriva_ml.schema_setup.create_schema:main"
|
|
|
28
28
|
deriva-ml-alter-annotation = "deriva_ml.schema_setup.alter_annotation:main"
|
|
29
29
|
deriva-ml-run-notebook = "deriva_ml.run_notebook:main"
|
|
30
30
|
deriva-ml-install-kernel = "deriva_ml.install_kernel:main"
|
|
31
|
+
bump-version = "deriva_ml.bump_version:main"
|
|
31
32
|
|
|
32
33
|
deriva-ml-check-catalog-schema = "deriva_ml.schema.check_schema:main"
|
|
33
34
|
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Release helper: seed initial semver tag if none exists, otherwise bump with bump-my-version.
|
|
4
|
+
|
|
5
|
+
Usage:
|
|
6
|
+
python release.py [patch|minor|major]
|
|
7
|
+
|
|
8
|
+
Env vars:
|
|
9
|
+
START - initial version if no tag exists (default: 0.1.0)
|
|
10
|
+
PREFIX - tag prefix (default: v)
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import argparse
|
|
16
|
+
import os
|
|
17
|
+
import shutil
|
|
18
|
+
import subprocess
|
|
19
|
+
import sys
|
|
20
|
+
from typing import Sequence
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def run(
|
|
24
|
+
cmd: Sequence[str], check: bool = True, capture: bool = False, quiet: bool = False
|
|
25
|
+
) -> subprocess.CompletedProcess:
|
|
26
|
+
if not quiet:
|
|
27
|
+
print(f"$ {' '.join(cmd)}")
|
|
28
|
+
return subprocess.run(
|
|
29
|
+
cmd,
|
|
30
|
+
check=check,
|
|
31
|
+
capture_output=capture,
|
|
32
|
+
text=True,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def in_git_repo() -> bool:
|
|
37
|
+
try:
|
|
38
|
+
run(["git", "rev-parse", "--is-inside-work-tree"], capture=True)
|
|
39
|
+
return True
|
|
40
|
+
except subprocess.CalledProcessError:
|
|
41
|
+
return False
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def has_commits() -> bool:
|
|
45
|
+
try:
|
|
46
|
+
run(["git", "log", "-1"], capture=True)
|
|
47
|
+
return True
|
|
48
|
+
except subprocess.CalledProcessError:
|
|
49
|
+
return False
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def latest_semver_tag(prefix: str) -> str | None:
|
|
53
|
+
# Use git's matcher to keep parity with Bash: prefix + x.y.z
|
|
54
|
+
pattern = f"{prefix}[0-9]*.[0-9]*.[0-9]*"
|
|
55
|
+
try:
|
|
56
|
+
cp = run(["git", "describe", "--tags", "--abbrev=0", "--match", pattern], capture=True, quiet=True)
|
|
57
|
+
tag = cp.stdout.strip()
|
|
58
|
+
return tag or None
|
|
59
|
+
except subprocess.CalledProcessError:
|
|
60
|
+
return None
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def seed_initial_tag(tag: str) -> None:
|
|
64
|
+
print(f"No existing semver tag found. Seeding initial tag: {tag}")
|
|
65
|
+
run(["git", "tag", tag, "-m", f"Initial release {tag}"])
|
|
66
|
+
# Push tags (ignore failure to keep parity with bash's simple flow)
|
|
67
|
+
run(["git", "push", "--tags"])
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def require_tool(name: str) -> None:
|
|
71
|
+
if shutil.which(name) is None:
|
|
72
|
+
print(f"Error: required tool '{name}' not found on PATH.", file=sys.stderr)
|
|
73
|
+
sys.exit(1)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def main() -> int:
|
|
77
|
+
parser = argparse.ArgumentParser(
|
|
78
|
+
description="Set a new version tag for the current repository, and push to remote."
|
|
79
|
+
)
|
|
80
|
+
parser.add_argument(
|
|
81
|
+
"bump", nargs="?", default="patch", choices=["patch", "minor", "major"], help="Which semver part to bump."
|
|
82
|
+
)
|
|
83
|
+
args = parser.parse_args()
|
|
84
|
+
|
|
85
|
+
start = os.environ.get("START", "0.1.0")
|
|
86
|
+
prefix = os.environ.get("PREFIX", "v")
|
|
87
|
+
|
|
88
|
+
# Sanity checks
|
|
89
|
+
require_tool("git")
|
|
90
|
+
require_tool("uv")
|
|
91
|
+
|
|
92
|
+
if not in_git_repo():
|
|
93
|
+
print("Not a git repo.", file=sys.stderr)
|
|
94
|
+
return 1
|
|
95
|
+
|
|
96
|
+
# Ensure tags visible in shallow clones
|
|
97
|
+
try:
|
|
98
|
+
run(["git", "fetch", "--tags", "--quiet"], check=False)
|
|
99
|
+
except Exception:
|
|
100
|
+
pass # non-fatal
|
|
101
|
+
|
|
102
|
+
if not has_commits():
|
|
103
|
+
print("No commits found. Commit something before tagging.", file=sys.stderr)
|
|
104
|
+
return 1
|
|
105
|
+
|
|
106
|
+
# Find latest semver tag with prefix
|
|
107
|
+
tag = latest_semver_tag(prefix)
|
|
108
|
+
|
|
109
|
+
if not tag:
|
|
110
|
+
seed_initial_tag(f"{prefix}{start}")
|
|
111
|
+
print(f"Seeded {prefix}{start}. Done.")
|
|
112
|
+
return 0
|
|
113
|
+
|
|
114
|
+
print(f"Bumping version: {args.bump}")
|
|
115
|
+
|
|
116
|
+
# Bump using bump-my-version via uv
|
|
117
|
+
# Mirrors: uv run bump-my-version bump $BUMP --verbose
|
|
118
|
+
try:
|
|
119
|
+
run(["uv", "run", "bump-my-version", "bump", args.bump, "--verbose"])
|
|
120
|
+
except subprocess.CalledProcessError as e:
|
|
121
|
+
print(e.stdout or "", end="")
|
|
122
|
+
print(e.stderr or "", end="", file=sys.stderr)
|
|
123
|
+
return e.returncode
|
|
124
|
+
|
|
125
|
+
# Push commits and tags
|
|
126
|
+
print("Pushing changes to remote repository...")
|
|
127
|
+
run(["git", "push", "--follow-tags"])
|
|
128
|
+
|
|
129
|
+
# Retrieve new version tag
|
|
130
|
+
try:
|
|
131
|
+
cp = run(["git", "describe", "--tags", "--abbrev=0"], capture=True)
|
|
132
|
+
new_tag = cp.stdout.strip()
|
|
133
|
+
print(f"New version tag: {new_tag}")
|
|
134
|
+
except subprocess.CalledProcessError:
|
|
135
|
+
print("Warning: unable to determine new tag via git describe.", file=sys.stderr)
|
|
136
|
+
|
|
137
|
+
print("Release process complete!")
|
|
138
|
+
return 0
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
if __name__ == "__main__":
|
|
142
|
+
sys.exit(main())
|
|
@@ -360,6 +360,14 @@ class Execution:
|
|
|
360
360
|
with Path(cfile).open("w", encoding="utf-8") as config_file:
|
|
361
361
|
json.dump(self.configuration.model_dump(), config_file)
|
|
362
362
|
|
|
363
|
+
lock_file = Path(self.configuration.workflow.git_root) / "uv.lock"
|
|
364
|
+
if lock_file.exists():
|
|
365
|
+
_ = self.asset_file_path(
|
|
366
|
+
MLAsset.execution_metadata,
|
|
367
|
+
lock_file,
|
|
368
|
+
ExecMetadataType.execution_config.value,
|
|
369
|
+
)
|
|
370
|
+
|
|
363
371
|
for parameter_file in self.configuration.parameters:
|
|
364
372
|
self.asset_file_path(
|
|
365
373
|
MLAsset.execution_asset,
|
|
@@ -896,9 +904,7 @@ class Execution:
|
|
|
896
904
|
asset_path.write_bytes(file_name.read_bytes())
|
|
897
905
|
|
|
898
906
|
# Persist the asset types into a file
|
|
899
|
-
with Path(
|
|
900
|
-
asset_type_path(self._working_dir, self.execution_rid, asset_table)
|
|
901
|
-
).open("a") as asset_type_file:
|
|
907
|
+
with Path(asset_type_path(self._working_dir, self.execution_rid, asset_table)).open("a") as asset_type_file:
|
|
902
908
|
asset_type_file.write(json.dumps({file_name.name: asset_types}) + "\n")
|
|
903
909
|
|
|
904
910
|
return AssetFilePath(
|
|
@@ -84,6 +84,7 @@ class Workflow(BaseModel):
|
|
|
84
84
|
rid: RID | None = None
|
|
85
85
|
checksum: str | None = None
|
|
86
86
|
is_notebook: bool = False
|
|
87
|
+
git_root: Path | None = None
|
|
87
88
|
|
|
88
89
|
_logger: logging.Logger = PrivateAttr(default=10)
|
|
89
90
|
|
|
@@ -125,6 +126,7 @@ class Workflow(BaseModel):
|
|
|
125
126
|
if not self.url:
|
|
126
127
|
path, self.is_notebook = Workflow._get_python_script()
|
|
127
128
|
self.url, self.checksum = Workflow.get_url_and_checksum(path)
|
|
129
|
+
self.git_root = Workflow._get_git_root(path)
|
|
128
130
|
|
|
129
131
|
self._logger = logging.getLogger("deriva_ml")
|
|
130
132
|
return self
|
|
@@ -315,12 +317,9 @@ class Workflow(BaseModel):
|
|
|
315
317
|
]
|
|
316
318
|
# Get the caller's filename, which is two up the stack from here.
|
|
317
319
|
filename = Path(stack[-1])
|
|
318
|
-
if not filename.exists() or Workflow._in_repl():
|
|
320
|
+
if not (filename.exists() or Workflow._in_repl()):
|
|
319
321
|
# Being called from the command line interpreter.
|
|
320
322
|
filename = Path.cwd() / Path("REPL")
|
|
321
|
-
# Get the caller's filename, which is two up the stack from here.
|
|
322
|
-
else:
|
|
323
|
-
raise DerivaMLException("Looking for caller failed") # Stack is too shallow
|
|
324
323
|
return filename, is_notebook
|
|
325
324
|
|
|
326
325
|
@staticmethod
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
# your_pkg/install_kernel.py
|
|
2
|
-
import sys
|
|
3
2
|
import re
|
|
3
|
+
import sys
|
|
4
|
+
from argparse import ArgumentParser
|
|
4
5
|
from importlib import metadata
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
5
8
|
from ipykernel.kernelspec import install as install_kernel
|
|
6
9
|
|
|
10
|
+
|
|
7
11
|
def _dist_name_for_this_package() -> str:
|
|
8
12
|
"""
|
|
9
13
|
Try to resolve the distribution name that provides this package.
|
|
@@ -20,6 +24,7 @@ def _dist_name_for_this_package() -> str:
|
|
|
20
24
|
dist_name = dists[0] if dists else metadata.metadata(top_pkg).get("Name", top_pkg)
|
|
21
25
|
return dist_name
|
|
22
26
|
|
|
27
|
+
|
|
23
28
|
def _normalize_kernel_name(name: str) -> str:
|
|
24
29
|
"""
|
|
25
30
|
Jupyter kernel directory names should be simple: lowercase, [-a-z0-9_].
|
|
@@ -28,19 +33,40 @@ def _normalize_kernel_name(name: str) -> str:
|
|
|
28
33
|
name = re.sub(r"[^a-z0-9._-]+", "-", name)
|
|
29
34
|
return name
|
|
30
35
|
|
|
36
|
+
|
|
37
|
+
def _name_for_this_venv() -> str:
|
|
38
|
+
config_path = Path(sys.prefix) / "pyvenv.cfg"
|
|
39
|
+
with config_path.open() as f:
|
|
40
|
+
m = re.search("prompt *= *(?P<prompt>.*)", f.read())
|
|
41
|
+
return m["prompt"] if m else ""
|
|
42
|
+
|
|
43
|
+
|
|
31
44
|
def main() -> None:
|
|
32
|
-
|
|
33
|
-
|
|
45
|
+
parser = ArgumentParser()
|
|
46
|
+
parser.add_argument(
|
|
47
|
+
"--install-local",
|
|
48
|
+
action="store_true",
|
|
49
|
+
help="Create kernal in local venv directory instead of sys.prefix.",
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
dist_name = _name_for_this_venv() # e.g., "deriva-model-template"
|
|
53
|
+
kernel_name = _normalize_kernel_name(dist_name) # e.g., "deriva-model-template"
|
|
34
54
|
display_name = f"Python ({dist_name})"
|
|
35
55
|
|
|
36
56
|
# Install into the current environment's prefix (e.g., .venv/share/jupyter/kernels/..)
|
|
57
|
+
prefix_arg = {}
|
|
58
|
+
install_local = False
|
|
59
|
+
if install_local:
|
|
60
|
+
prefix_arg = {"prefix": sys.prefix}
|
|
61
|
+
|
|
37
62
|
install_kernel(
|
|
38
|
-
user=False,
|
|
63
|
+
user=False, # write under sys.prefix (the active env)
|
|
39
64
|
kernel_name=kernel_name,
|
|
40
65
|
display_name=display_name,
|
|
41
|
-
|
|
66
|
+
**prefix_arg,
|
|
42
67
|
)
|
|
43
68
|
print(f"Installed Jupyter kernel '{kernel_name}' with display name '{display_name}' under {sys.prefix!s}")
|
|
44
69
|
|
|
70
|
+
|
|
45
71
|
if __name__ == "__main__":
|
|
46
|
-
main()
|
|
72
|
+
main()
|
|
@@ -298,7 +298,7 @@ def initialize_ml_schema(model: Model, schema_name: str = "deriva-ml"):
|
|
|
298
298
|
},
|
|
299
299
|
{
|
|
300
300
|
"Name": "Runtime_Env",
|
|
301
|
-
"Description": "Information about the
|
|
301
|
+
"Description": "Information about the runtime environment",
|
|
302
302
|
},
|
|
303
303
|
{
|
|
304
304
|
"Name": "Execution_Metadata",
|
|
@@ -3,7 +3,6 @@ LICENSE
|
|
|
3
3
|
README.md
|
|
4
4
|
mkdocs.yml
|
|
5
5
|
pyproject.toml
|
|
6
|
-
release.sh
|
|
7
6
|
uv.lock
|
|
8
7
|
.github/release-drafter.yml
|
|
9
8
|
.github/workflows/publish-docs.yml
|
|
@@ -42,6 +41,7 @@ docs/user-guide/install.md
|
|
|
42
41
|
docs/user-guide/notebooks.md
|
|
43
42
|
docs/user-guide/overview.md
|
|
44
43
|
src/deriva_ml/__init__.py
|
|
44
|
+
src/deriva_ml/bump_version.py
|
|
45
45
|
src/deriva_ml/demo_catalog.py
|
|
46
46
|
src/deriva_ml/feature.py
|
|
47
47
|
src/deriva_ml/install_kernel.py
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
[console_scripts]
|
|
2
|
+
bump-version = deriva_ml.bump_version:main
|
|
2
3
|
deriva-ml-alter-annotation = deriva_ml.schema_setup.alter_annotation:main
|
|
3
4
|
deriva-ml-check-catalog-schema = deriva_ml.schema.check_schema:main
|
|
4
5
|
deriva-ml-create-schema = deriva_ml.schema_setup.create_schema:main
|
|
@@ -5,7 +5,6 @@ Pytest configuration and shared fixtures.
|
|
|
5
5
|
import os
|
|
6
6
|
|
|
7
7
|
import pytest
|
|
8
|
-
from test_utils import MLCatalog, MLDatasetCatalog, create_jupyter_kernel, destroy_jupyter_kernel
|
|
9
8
|
|
|
10
9
|
from deriva_ml import DerivaML
|
|
11
10
|
from deriva_ml.demo_catalog import (
|
|
@@ -14,6 +13,8 @@ from deriva_ml.demo_catalog import (
|
|
|
14
13
|
populate_demo_catalog,
|
|
15
14
|
)
|
|
16
15
|
|
|
16
|
+
from .test_utils import MLCatalog, MLDatasetCatalog, create_jupyter_kernel, destroy_jupyter_kernel
|
|
17
|
+
|
|
17
18
|
|
|
18
19
|
@pytest.fixture(scope="session")
|
|
19
20
|
def catalog_host():
|
|
@@ -134,7 +134,10 @@ class TestExecution:
|
|
|
134
134
|
}
|
|
135
135
|
for a in metadata_path.entities().fetch()
|
|
136
136
|
]
|
|
137
|
-
assert
|
|
137
|
+
assert "uv.lock" in [d["Filename"] for d in execution_metadata]
|
|
138
|
+
assert "configuration.json" in [d["Filename"] for d in execution_metadata]
|
|
139
|
+
|
|
140
|
+
assert 3 == len(execution_metadata)
|
|
138
141
|
|
|
139
142
|
def test_execution_upload(self, test_ml):
|
|
140
143
|
ml_instance = test_ml
|
|
@@ -3,7 +3,6 @@ import shutil
|
|
|
3
3
|
from tempfile import TemporaryDirectory
|
|
4
4
|
from urllib.parse import quote as urlquote
|
|
5
5
|
|
|
6
|
-
from demo_catalog import create_demo_features
|
|
7
6
|
from deriva.core.datapath import DataPathException
|
|
8
7
|
from ipykernel.kernelspec import install
|
|
9
8
|
from jupyter_client.kernelspec import KernelSpecManager
|
|
@@ -13,6 +12,7 @@ from deriva_ml.demo_catalog import (
|
|
|
13
12
|
DatasetDescription,
|
|
14
13
|
create_demo_catalog,
|
|
15
14
|
create_demo_datasets,
|
|
15
|
+
create_demo_features,
|
|
16
16
|
populate_demo_catalog,
|
|
17
17
|
)
|
|
18
18
|
|
deriva_ml-1.14.35/release.sh
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
set -e # Exit immediately if any command fails
|
|
3
|
-
|
|
4
|
-
# Check for GitHub CLI (gh)
|
|
5
|
-
#if ! command -v gh &> /dev/null; then
|
|
6
|
-
# echo "Error: GitHub CLI (gh) is not installed. Please install it and log in."
|
|
7
|
-
# exit 1
|
|
8
|
-
#fi
|
|
9
|
-
|
|
10
|
-
# Default version bump is patch unless specified (patch, minor, or major)
|
|
11
|
-
VERSION_TYPE=${1:-patch}
|
|
12
|
-
|
|
13
|
-
echo "Bumping version: $VERSION_TYPE"
|
|
14
|
-
|
|
15
|
-
# Bump the version using bump-my-version.
|
|
16
|
-
# This command should update version files, commit the changes, and create a Git tag.
|
|
17
|
-
uv run bump-my-version bump "$VERSION_TYPE" --verbose
|
|
18
|
-
|
|
19
|
-
# Push commits and tags to the remote repository.
|
|
20
|
-
echo "Pushing changes to remote repository..."
|
|
21
|
-
git push --follow-tags
|
|
22
|
-
|
|
23
|
-
# Create a GitHub release with auto-generated release notes.
|
|
24
|
-
#echo "Creating GitHub release for $NEW_TAG..."
|
|
25
|
-
#gh release create "$NEW_TAG" --title "$NEW_TAG Release" --generate-notes
|
|
26
|
-
|
|
27
|
-
# Build the package.
|
|
28
|
-
# During the build, setuptools_scm will derive the version from Git tags.
|
|
29
|
-
#echo "Building the package..."
|
|
30
|
-
#uv build
|
|
31
|
-
|
|
32
|
-
# Retrieve the new version tag (latest tag)
|
|
33
|
-
NEW_TAG=$(git describe --tags --abbrev=0)
|
|
34
|
-
echo "New version tag: $NEW_TAG"
|
|
35
|
-
#uv publish dist/*${NEW_TAG/v/}*
|
|
36
|
-
|
|
37
|
-
echo "Release process complete!"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|