datatrail-cli 0.10.1__tar.gz → 0.10.2__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.2}/CHANGELOG.md +7 -0
  2. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/PKG-INFO +1 -1
  3. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/dtcli/utilities/cadcclient.py +3 -0
  4. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/dtcli/utilities/utilities.py +2 -2
  5. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/pyproject.toml +1 -1
  6. datatrail_cli-0.10.2/tests/test_utils.py +27 -0
  7. datatrail_cli-0.10.1/tests/test_utils.py +0 -8
  8. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  9. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  10. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  11. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/.github/workflows/continuous-deployment.yml +0 -0
  12. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/.github/workflows/continuous-integration.yml +0 -0
  13. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/.github/workflows/docs.yml +0 -0
  14. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/.github/workflows/stale.yml +0 -0
  15. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/.gitignore +0 -0
  16. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/.pre-commit-config.yaml +0 -0
  17. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/LICENSE +0 -0
  18. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/README.md +0 -0
  19. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/docs/clear.md +0 -0
  20. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/docs/cli.md +0 -0
  21. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/docs/commands.md +0 -0
  22. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/docs/images/Datatrail-logo.png +0 -0
  23. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/docs/index.md +0 -0
  24. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/docs/initialising.md +0 -0
  25. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/docs/install.md +0 -0
  26. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/docs/list.md +0 -0
  27. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/docs/ps.md +0 -0
  28. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/docs/pull.md +0 -0
  29. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/docs/scout.md +0 -0
  30. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/docs/user_guide.md +0 -0
  31. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/dtcli/__init__.py +0 -0
  32. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/dtcli/clear.py +0 -0
  33. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/dtcli/cli.py +0 -0
  34. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/dtcli/config.py +0 -0
  35. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/dtcli/config.yaml +0 -0
  36. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/dtcli/ls.py +0 -0
  37. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/dtcli/ps.py +0 -0
  38. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/dtcli/pull.py +0 -0
  39. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/dtcli/scout.py +0 -0
  40. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/dtcli/src/functions.py +0 -0
  41. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/dtcli/unregistered.py +0 -0
  42. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/mkdocs.yml +0 -0
  43. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/poetry.lock +0 -0
  44. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/tests/test_cli.py +0 -0
  45. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/tests/test_functions.py +0 -0
  46. {datatrail_cli-0.10.1 → datatrail_cli-0.10.2}/tox.ini +0 -0
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.10.2](https://github.com/CHIMEFRB/datatrail-cli/compare/v0.10.1...v0.10.2) (2026-05-07)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **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)
9
+
3
10
  ## [0.10.1](https://github.com/CHIMEFRB/datatrail-cli/compare/v0.10.0...v0.10.1) (2026-03-02)
4
11
 
5
12
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datatrail-cli
3
- Version: 0.10.1
3
+ Version: 0.10.2
4
4
  Summary: CHIME/FRB Datatrail CLI
5
5
  Author: CHIME FRB Project Office
6
6
  Author-email: Tarik Zegmott <tarik.zegmott@mcgill.ca>
@@ -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.2"
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