datatrail-cli 0.10.1__tar.gz → 0.10.3__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.
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/CHANGELOG.md +14 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/PKG-INFO +1 -1
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/clear.py +1 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/ls.py +2 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/pull.py +2 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/utilities/cadcclient.py +3 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/utilities/utilities.py +2 -2
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/pyproject.toml +1 -1
- datatrail_cli-0.10.3/tests/test_utils.py +27 -0
- datatrail_cli-0.10.1/tests/test_utils.py +0 -8
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/.github/workflows/continuous-deployment.yml +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/.github/workflows/continuous-integration.yml +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/.github/workflows/docs.yml +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/.github/workflows/stale.yml +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/.gitignore +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/.pre-commit-config.yaml +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/LICENSE +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/README.md +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/clear.md +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/cli.md +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/commands.md +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/images/Datatrail-logo.png +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/index.md +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/initialising.md +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/install.md +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/list.md +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/ps.md +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/pull.md +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/scout.md +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/user_guide.md +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/__init__.py +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/cli.py +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/config.py +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/config.yaml +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/ps.py +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/scout.py +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/src/functions.py +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/unregistered.py +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/mkdocs.yml +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/poetry.lock +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/tests/test_cli.py +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/tests/test_functions.py +0 -0
- {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/tox.ini +0 -0
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.10.3](https://github.com/CHIMEFRB/datatrail-cli/compare/v0.10.2...v0.10.3) (2026-05-19)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* connection errors raise correct status exit code ([9b4d7bc](https://github.com/CHIMEFRB/datatrail-cli/commit/9b4d7bcc74c6a7c6954d965f8ab421ea6181b016))
|
|
9
|
+
|
|
10
|
+
## [0.10.2](https://github.com/CHIMEFRB/datatrail-cli/compare/v0.10.1...v0.10.2) (2026-05-07)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Bug Fixes
|
|
14
|
+
|
|
15
|
+
* **pull:** more processors than files bug ([e44bbe1](https://github.com/CHIMEFRB/datatrail-cli/commit/e44bbe1a14900f034f998b664c1d394fcf31c7a7)), closes [#147](https://github.com/CHIMEFRB/datatrail-cli/issues/147)
|
|
16
|
+
|
|
3
17
|
## [0.10.1](https://github.com/CHIMEFRB/datatrail-cli/compare/v0.10.0...v0.10.1) (2026-03-02)
|
|
4
18
|
|
|
5
19
|
|
|
@@ -69,6 +69,7 @@ def list(
|
|
|
69
69
|
return None
|
|
70
70
|
except ConnectionError as e:
|
|
71
71
|
error_console.print(e)
|
|
72
|
+
ctx.exit(1)
|
|
72
73
|
return None
|
|
73
74
|
results = functions.list(scope, datasets, verbose, quiet)
|
|
74
75
|
|
|
@@ -131,3 +132,4 @@ def list(
|
|
|
131
132
|
# No contact with server.
|
|
132
133
|
if "error" in results.keys():
|
|
133
134
|
error_console.print(results["error"])
|
|
135
|
+
ctx.exit(1)
|
|
@@ -107,6 +107,7 @@ def pull( # noqa: C901
|
|
|
107
107
|
return None
|
|
108
108
|
except ConnectionError as e:
|
|
109
109
|
error_console.print(e)
|
|
110
|
+
ctx.exit(1)
|
|
110
111
|
return None
|
|
111
112
|
|
|
112
113
|
# Check Canfar status.
|
|
@@ -120,6 +121,7 @@ def pull( # noqa: C901
|
|
|
120
121
|
files = find_missing_dataset_files(scope, dataset, directory, verbose)
|
|
121
122
|
if files.get("error"):
|
|
122
123
|
error_console.print(files["error"])
|
|
124
|
+
ctx.exit(1)
|
|
123
125
|
return None
|
|
124
126
|
elif len(files["missing"]) == 0 and len(files["existing"]) == 0:
|
|
125
127
|
console.print("No files found at minoc.", style="bold red")
|
|
@@ -161,6 +161,9 @@ def pget(
|
|
|
161
161
|
elif verbose > 1:
|
|
162
162
|
logger.setLevel("DEBUG")
|
|
163
163
|
|
|
164
|
+
# Cap processors to the number of files so we never spawn more workers than
|
|
165
|
+
# there are files to download (avoids IndexError when -c > number of files).
|
|
166
|
+
processors = min(processors, len(source))
|
|
164
167
|
sources: List[List[Any]] = split(source, processors)
|
|
165
168
|
destinations: List[List[Any]] = split(destination, processors)
|
|
166
169
|
logger.info(f"Starting {processors} processes.")
|
|
@@ -8,8 +8,6 @@ import requests
|
|
|
8
8
|
from requests.models import Response
|
|
9
9
|
from rich.console import Console
|
|
10
10
|
|
|
11
|
-
from dtcli.utilities import cadcclient
|
|
12
|
-
|
|
13
11
|
try:
|
|
14
12
|
from packaging.version import parse
|
|
15
13
|
except ImportError:
|
|
@@ -148,6 +146,8 @@ def check_canfar_status(console: Console) -> Tuple[bool, bool]:
|
|
|
148
146
|
Tuple[bool, bool]: Status of Minoc and Luskan, respectively.
|
|
149
147
|
"""
|
|
150
148
|
# Check Canfar status.
|
|
149
|
+
from dtcli.utilities import cadcclient # local import to avoid circular dependency
|
|
150
|
+
|
|
151
151
|
minoc_up, luskan_up = cadcclient.status()
|
|
152
152
|
if not minoc_up:
|
|
153
153
|
console.print(":warning: Minoc is down!", style="bold yellow")
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
from dtcli.utilities import utilities
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def test_split():
|
|
5
|
+
test_array = ["a", "b"]
|
|
6
|
+
split_by = 2
|
|
7
|
+
result = utilities.split(test_array, split_by)
|
|
8
|
+
assert result == [["a"], ["b"]]
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def test_split_more_batches_than_items():
|
|
12
|
+
"""split() must not return more batches than there are items.
|
|
13
|
+
|
|
14
|
+
Regression guard for GitHub issue #147: when the user requests more
|
|
15
|
+
parallel workers (-c flag) than there are files to download, the
|
|
16
|
+
number of sublists returned by split() must equal len(data), not
|
|
17
|
+
the requested count. The pget() caller now caps processors to
|
|
18
|
+
min(processors, len(source)) before iterating, so this test documents
|
|
19
|
+
the invariant that split() never produces empty sublists.
|
|
20
|
+
"""
|
|
21
|
+
test_array = ["a", "b", "c", "d", "e", "f"] # 6 files
|
|
22
|
+
split_by = 8 # user requested 8 workers
|
|
23
|
+
result = utilities.split(test_array, split_by)
|
|
24
|
+
# split() drops empty batches, so we get at most len(data) sublists
|
|
25
|
+
assert len(result) <= len(test_array)
|
|
26
|
+
# every element appears exactly once
|
|
27
|
+
assert sorted(sum(result, [])) == sorted(test_array)
|
|
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
|