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.
Files changed (46) hide show
  1. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/CHANGELOG.md +14 -0
  2. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/PKG-INFO +1 -1
  3. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/clear.py +1 -0
  4. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/ls.py +2 -0
  5. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/pull.py +2 -0
  6. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/utilities/cadcclient.py +3 -0
  7. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/utilities/utilities.py +2 -2
  8. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/pyproject.toml +1 -1
  9. datatrail_cli-0.10.3/tests/test_utils.py +27 -0
  10. datatrail_cli-0.10.1/tests/test_utils.py +0 -8
  11. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  12. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  13. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  14. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/.github/workflows/continuous-deployment.yml +0 -0
  15. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/.github/workflows/continuous-integration.yml +0 -0
  16. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/.github/workflows/docs.yml +0 -0
  17. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/.github/workflows/stale.yml +0 -0
  18. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/.gitignore +0 -0
  19. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/.pre-commit-config.yaml +0 -0
  20. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/LICENSE +0 -0
  21. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/README.md +0 -0
  22. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/clear.md +0 -0
  23. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/cli.md +0 -0
  24. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/commands.md +0 -0
  25. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/images/Datatrail-logo.png +0 -0
  26. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/index.md +0 -0
  27. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/initialising.md +0 -0
  28. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/install.md +0 -0
  29. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/list.md +0 -0
  30. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/ps.md +0 -0
  31. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/pull.md +0 -0
  32. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/scout.md +0 -0
  33. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/docs/user_guide.md +0 -0
  34. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/__init__.py +0 -0
  35. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/cli.py +0 -0
  36. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/config.py +0 -0
  37. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/config.yaml +0 -0
  38. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/ps.py +0 -0
  39. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/scout.py +0 -0
  40. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/src/functions.py +0 -0
  41. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/dtcli/unregistered.py +0 -0
  42. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/mkdocs.yml +0 -0
  43. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/poetry.lock +0 -0
  44. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/tests/test_cli.py +0 -0
  45. {datatrail_cli-0.10.1 → datatrail_cli-0.10.3}/tests/test_functions.py +0 -0
  46. {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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datatrail-cli
3
- Version: 0.10.1
3
+ Version: 0.10.3
4
4
  Summary: CHIME/FRB Datatrail CLI
5
5
  Author: CHIME FRB Project Office
6
6
  Author-email: Tarik Zegmott <tarik.zegmott@mcgill.ca>
@@ -100,6 +100,7 @@ def clear(
100
100
  return None
101
101
  except ConnectionError as error:
102
102
  error_console.print(error)
103
+ ctx.exit(1)
103
104
  return None
104
105
 
105
106
  # Find number of files in common directory and size.
@@ -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")
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "datatrail-cli"
3
- version = "0.10.1"
3
+ version = "0.10.3"
4
4
  description = "CHIME/FRB Datatrail CLI"
5
5
  authors = [
6
6
  { name = "CHIME FRB Project Office" },
@@ -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)
@@ -1,8 +0,0 @@
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"]]
File without changes
File without changes
File without changes