datatrail-cli 0.9.3__tar.gz → 0.10.0__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.9.3 → datatrail_cli-0.10.0}/CHANGELOG.md +15 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/PKG-INFO +1 -1
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/cli.py +2 -1
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/pull.py +11 -1
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/src/functions.py +78 -0
- datatrail_cli-0.10.0/dtcli/unregistered.py +61 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/utilities/cadcclient.py +49 -30
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/poetry.lock +112 -112
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/pyproject.toml +1 -1
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/tests/test_cli.py +28 -16
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/.github/workflows/continuous-deployment.yml +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/.github/workflows/continuous-integration.yml +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/.github/workflows/docs.yml +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/.github/workflows/stale.yml +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/.gitignore +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/.pre-commit-config.yaml +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/LICENSE +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/README.md +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/clear.md +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/cli.md +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/commands.md +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/images/Datatrail-logo.png +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/index.md +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/initialising.md +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/install.md +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/list.md +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/ps.md +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/pull.md +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/scout.md +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/user_guide.md +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/__init__.py +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/clear.py +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/config.py +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/config.yaml +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/ls.py +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/ps.py +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/scout.py +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/utilities/utilities.py +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/mkdocs.yml +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/tests/test_functions.py +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/tests/test_utils.py +0 -0
- {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/tox.ini +0 -0
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.10.0](https://github.com/CHIMEFRB/datatrail-cli/compare/v0.9.3...v0.10.0) (2026-02-20)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* **cli:** add unregistered command ([b33a6fa](https://github.com/CHIMEFRB/datatrail-cli/commit/b33a6fae57ff2bdad6c26f0ed5402994fdef7650))
|
|
9
|
+
* **pull:** check all files were downloaded ([bb1d8b6](https://github.com/CHIMEFRB/datatrail-cli/commit/bb1d8b64378fe80a27944f8eaccf6ce674ce17d0))
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
* **cadcclient:** improve handling of stdout ([320d4df](https://github.com/CHIMEFRB/datatrail-cli/commit/320d4dfcdd194aa69f9236c84f21dbfb8690068b))
|
|
15
|
+
* **pull:** wrap download in tenacity retry ([8253157](https://github.com/CHIMEFRB/datatrail-cli/commit/8253157e78e1f0abb71fe71fb396b72d1ba51911))
|
|
16
|
+
* **unregistered:** improve pattern matching ([22ff11a](https://github.com/CHIMEFRB/datatrail-cli/commit/22ff11aa6d8aa390e465bf0ef62065f288f05bac))
|
|
17
|
+
|
|
3
18
|
## [0.9.3](https://github.com/CHIMEFRB/datatrail-cli/compare/v0.9.2...v0.9.3) (2026-02-16)
|
|
4
19
|
|
|
5
20
|
|
|
@@ -6,7 +6,7 @@ import click
|
|
|
6
6
|
from click_aliasing import ClickAliasedGroup
|
|
7
7
|
from rich import console, pretty
|
|
8
8
|
|
|
9
|
-
from dtcli import clear, config, ls, ps, pull, scout
|
|
9
|
+
from dtcli import clear, config, ls, ps, pull, scout, unregistered
|
|
10
10
|
from dtcli.utilities import utilities
|
|
11
11
|
|
|
12
12
|
pretty.install()
|
|
@@ -46,6 +46,7 @@ cli.add_command(ls.list, aliases=["ls"])
|
|
|
46
46
|
cli.add_command(ps.ps)
|
|
47
47
|
cli.add_command(pull.pull)
|
|
48
48
|
cli.add_command(scout.scout)
|
|
49
|
+
cli.add_command(unregistered.unregistered)
|
|
49
50
|
|
|
50
51
|
|
|
51
52
|
def check_version() -> None:
|
|
@@ -38,7 +38,7 @@ error_console = Console(stderr=True, style="bold red")
|
|
|
38
38
|
exists=True, file_okay=True, dir_okay=False, writable=True, resolve_path=True
|
|
39
39
|
),
|
|
40
40
|
default=None,
|
|
41
|
-
help="
|
|
41
|
+
help="Path to file of specific files to pull.",
|
|
42
42
|
)
|
|
43
43
|
@click.option(
|
|
44
44
|
"--cores",
|
|
@@ -96,6 +96,7 @@ def pull( # noqa: C901
|
|
|
96
96
|
logger.exception(
|
|
97
97
|
"Configuration Missing!! Run `datatrail config init`.",
|
|
98
98
|
)
|
|
99
|
+
ctx.exit(1)
|
|
99
100
|
raise click.Abort()
|
|
100
101
|
|
|
101
102
|
try:
|
|
@@ -193,4 +194,13 @@ Create one using 'cadc-get-cert -u <USERNAME>'.
|
|
|
193
194
|
cores=cores,
|
|
194
195
|
verbose=verbose,
|
|
195
196
|
)
|
|
197
|
+
# Check that all files have been downloaded.
|
|
198
|
+
for f in files["missing"]:
|
|
199
|
+
local_path = path.join(directory, f.replace("cadc:CHIMEFRB", ""))
|
|
200
|
+
if not path.exists(local_path):
|
|
201
|
+
error_console.print(
|
|
202
|
+
f"File not downloaded: {local_path}",
|
|
203
|
+
style="bold red",
|
|
204
|
+
)
|
|
205
|
+
ctx.exit(1)
|
|
196
206
|
return None
|
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
import os
|
|
5
|
+
import re
|
|
5
6
|
import shutil
|
|
6
7
|
import time
|
|
8
|
+
from collections import defaultdict
|
|
7
9
|
from pathlib import Path
|
|
8
10
|
from typing import Any, Dict, List, Optional, Tuple
|
|
9
11
|
|
|
@@ -481,3 +483,79 @@ def get_unregistered_dataset(dataset: str, scope: str) -> Optional[Dict[str, Any
|
|
|
481
483
|
return None
|
|
482
484
|
else:
|
|
483
485
|
return response[0]
|
|
486
|
+
|
|
487
|
+
|
|
488
|
+
def signature(msg: str) -> str:
|
|
489
|
+
"""Create a signature for a reason unregistered message.
|
|
490
|
+
|
|
491
|
+
Args:
|
|
492
|
+
msg: Reason message for unregistered dataset.
|
|
493
|
+
|
|
494
|
+
Returns:
|
|
495
|
+
str: Signature for error message.
|
|
496
|
+
"""
|
|
497
|
+
ATTACH_RE = re.compile(
|
|
498
|
+
r"Could not attach datasets: .+ ERROR: dataset (.+), (.+) not found" # noqa: E501
|
|
499
|
+
)
|
|
500
|
+
|
|
501
|
+
CREATE_RE = re.compile(
|
|
502
|
+
r"Could not create dataset: (.+), scope: (.+)\. .*UniqueViolation" # noqa: E501
|
|
503
|
+
)
|
|
504
|
+
|
|
505
|
+
POSTGRES_RE = re.compile(r".*psycopg.*")
|
|
506
|
+
|
|
507
|
+
msg = msg.strip()
|
|
508
|
+
|
|
509
|
+
# Attach-dataset errors
|
|
510
|
+
m = ATTACH_RE.search(msg)
|
|
511
|
+
if m:
|
|
512
|
+
larger_dataset, scope = m.groups()
|
|
513
|
+
return f"ATTACH_MISSING:{larger_dataset}:{scope}"
|
|
514
|
+
|
|
515
|
+
# Create-dataset unique violation
|
|
516
|
+
m = CREATE_RE.search(msg)
|
|
517
|
+
if m:
|
|
518
|
+
dataset, scope = m.groups()
|
|
519
|
+
return f"CREATE_DUPLICATE:{dataset}:{scope}"
|
|
520
|
+
|
|
521
|
+
# PostgreSQL violation
|
|
522
|
+
m = POSTGRES_RE.search(msg)
|
|
523
|
+
if m:
|
|
524
|
+
return f"POSTGRES:{msg[:120]}"
|
|
525
|
+
|
|
526
|
+
# Short status / token messages
|
|
527
|
+
if len(msg) < 80 and "\n" not in msg:
|
|
528
|
+
return f"STATUS:{msg}"
|
|
529
|
+
|
|
530
|
+
# Fallback: normalized text
|
|
531
|
+
msg = re.sub(r"\d+", "<ID>", msg)
|
|
532
|
+
msg = re.sub(r"\s+", " ", msg)
|
|
533
|
+
return f"OTHER:{msg[:120]}"
|
|
534
|
+
|
|
535
|
+
|
|
536
|
+
def get_all_unregistered_datasets() -> List[Dict[str, Any]]:
|
|
537
|
+
"""Get all unregistered datasets from Workflow Results.
|
|
538
|
+
|
|
539
|
+
Returns:
|
|
540
|
+
List[Dict[str, Any]]: List of unregistered dataset information.
|
|
541
|
+
"""
|
|
542
|
+
return view_results(
|
|
543
|
+
pipeline="datatrail-unregistered-datasets", query={}, projection={}, limit=10000
|
|
544
|
+
)
|
|
545
|
+
|
|
546
|
+
|
|
547
|
+
def summarise_unregistered_datasets() -> Dict[str, int]:
|
|
548
|
+
"""Create a summary of unregistered datasets by grouping similar error messages.
|
|
549
|
+
|
|
550
|
+
Returns:
|
|
551
|
+
Dict[str, int]: Dictionary of error message signatures and their counts.
|
|
552
|
+
"""
|
|
553
|
+
response = get_all_unregistered_datasets()
|
|
554
|
+
reason_groups: Dict[str, int] = defaultdict(int)
|
|
555
|
+
messages = [str(r["results"]["reason"]) for r in response]
|
|
556
|
+
|
|
557
|
+
for msg in messages:
|
|
558
|
+
sig = signature(msg)
|
|
559
|
+
reason_groups[sig] += 1
|
|
560
|
+
|
|
561
|
+
return reason_groups
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"""Datatrail Unregistered datasets commands."""
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
|
|
5
|
+
import click
|
|
6
|
+
from rich.console import Console
|
|
7
|
+
from rich.table import Table
|
|
8
|
+
|
|
9
|
+
from dtcli.src import functions
|
|
10
|
+
from dtcli.utilities.utilities import set_log_level
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
console = Console()
|
|
15
|
+
error_console = Console(stderr=True, style="bold red")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@click.group(help="Commands related to unregistered datasets.")
|
|
19
|
+
def unregistered():
|
|
20
|
+
"""Group of commands related to unregistered datasets."""
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@unregistered.command(help="Summarise the reasons for unregistered datasets.")
|
|
25
|
+
@click.option("-v", "--verbose", count=True, help="Verbosity: v=INFO, vv=DEBUG.")
|
|
26
|
+
@click.option("-q", "--quiet", is_flag=True, help="Only errors shown in logs.")
|
|
27
|
+
@click.pass_context
|
|
28
|
+
def summary(
|
|
29
|
+
ctx: click.Context,
|
|
30
|
+
verbose: int = 0,
|
|
31
|
+
quiet: bool = False,
|
|
32
|
+
):
|
|
33
|
+
"""Show a summary of the unregistered datasets.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
ctx (click.Context): Click context.
|
|
37
|
+
verbose (int): Verbosity: v=INFO, vv=DEBUG.
|
|
38
|
+
quiet (bool): Only errors shown in logs.
|
|
39
|
+
"""
|
|
40
|
+
# Set logging level.
|
|
41
|
+
set_log_level(logger, verbose, quiet)
|
|
42
|
+
logger.debug("`summary` called with:")
|
|
43
|
+
logger.debug(f"verbose: {verbose} [{type(verbose)}]")
|
|
44
|
+
logger.debug(f"quiet: {quiet} [{type(quiet)}]")
|
|
45
|
+
|
|
46
|
+
results = functions.summarise_unregistered_datasets()
|
|
47
|
+
|
|
48
|
+
table = Table(
|
|
49
|
+
title="Summary of reasons",
|
|
50
|
+
header_style="magenta",
|
|
51
|
+
title_style="bold magenta",
|
|
52
|
+
)
|
|
53
|
+
table.add_column("Reason")
|
|
54
|
+
table.add_column("Number of Datasets")
|
|
55
|
+
|
|
56
|
+
for key, value in sorted(results.items(), key=lambda x: x[1], reverse=True):
|
|
57
|
+
table.add_row(key, str(value))
|
|
58
|
+
|
|
59
|
+
table.row_styles = ["none", "dim"]
|
|
60
|
+
|
|
61
|
+
console.print(table)
|
|
@@ -15,6 +15,7 @@ from cadctap import CadcTapClient
|
|
|
15
15
|
from cadcutils import net
|
|
16
16
|
from requests.exceptions import HTTPError
|
|
17
17
|
from rich.traceback import install
|
|
18
|
+
from tenacity import Retrying, stop_after_attempt, wait_exponential
|
|
18
19
|
|
|
19
20
|
from dtcli.config import procure
|
|
20
21
|
from dtcli.utilities.utilities import split
|
|
@@ -111,7 +112,13 @@ def get(
|
|
|
111
112
|
for index, filename in enumerate(source):
|
|
112
113
|
try:
|
|
113
114
|
filename = namespace + "/" + filename
|
|
114
|
-
|
|
115
|
+
for attempt in Retrying(
|
|
116
|
+
stop=stop_after_attempt(3),
|
|
117
|
+
wait=wait_exponential(multiplier=1, min=4, max=10),
|
|
118
|
+
reraise=True,
|
|
119
|
+
):
|
|
120
|
+
with attempt:
|
|
121
|
+
storage.cadcget(filename, destination[index]) # type: ignore
|
|
115
122
|
logger.debug(f"{filename} ➜ {destination[index]} ✔")
|
|
116
123
|
except cadcutils.exceptions.NotFoundException as error: # type: ignore
|
|
117
124
|
logger.error(f"CADC Exception: {filename}")
|
|
@@ -161,7 +168,13 @@ def pget(
|
|
|
161
168
|
for process in range(processors):
|
|
162
169
|
mp = DillProcess(
|
|
163
170
|
target=get,
|
|
164
|
-
args=(
|
|
171
|
+
args=(
|
|
172
|
+
sources[process],
|
|
173
|
+
destinations[process],
|
|
174
|
+
certfile,
|
|
175
|
+
namespace,
|
|
176
|
+
verbose,
|
|
177
|
+
),
|
|
165
178
|
)
|
|
166
179
|
processes.append(mp)
|
|
167
180
|
for proc in processes:
|
|
@@ -291,20 +304,23 @@ def dataset_md5s(
|
|
|
291
304
|
query = query.replace("//", "/")
|
|
292
305
|
logger.info(f"Running query: {query}")
|
|
293
306
|
buffer = StringIO()
|
|
294
|
-
sys.stdout
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
307
|
+
original_stdout = sys.stdout
|
|
308
|
+
try:
|
|
309
|
+
sys.stdout = buffer
|
|
310
|
+
_, _, queryClient = _connect()
|
|
311
|
+
queryClient.query( # type: ignore
|
|
312
|
+
query=query,
|
|
313
|
+
output_file=None,
|
|
314
|
+
response_format="csv",
|
|
315
|
+
tmptable=None,
|
|
316
|
+
lang="ADQL",
|
|
317
|
+
timeout=timeout,
|
|
318
|
+
data_only=True,
|
|
319
|
+
no_column_names=True,
|
|
320
|
+
)
|
|
321
|
+
content = buffer.getvalue()
|
|
322
|
+
finally:
|
|
323
|
+
sys.stdout = original_stdout
|
|
308
324
|
paths = []
|
|
309
325
|
md5s = []
|
|
310
326
|
for line in content.split("\n"):
|
|
@@ -354,20 +370,23 @@ def query(
|
|
|
354
370
|
query = query.replace("//", "/")
|
|
355
371
|
logger.info(f"Running query: {query}")
|
|
356
372
|
buffer = StringIO()
|
|
357
|
-
sys.stdout
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
373
|
+
original_stdout = sys.stdout
|
|
374
|
+
try:
|
|
375
|
+
sys.stdout = buffer
|
|
376
|
+
_, _, queryClient = _connect()
|
|
377
|
+
queryClient.query( # type: ignore
|
|
378
|
+
query=query,
|
|
379
|
+
output_file=None,
|
|
380
|
+
response_format="csv",
|
|
381
|
+
tmptable=None,
|
|
382
|
+
lang="ADQL",
|
|
383
|
+
timeout=timeout,
|
|
384
|
+
data_only=True,
|
|
385
|
+
no_column_names=True,
|
|
386
|
+
)
|
|
387
|
+
content = buffer.getvalue()
|
|
388
|
+
finally:
|
|
389
|
+
sys.stdout = original_stdout
|
|
371
390
|
return [line.split(",") for line in content.split("\n")]
|
|
372
391
|
|
|
373
392
|
|
|
@@ -262,7 +262,7 @@ description = "Foreign Function Interface for Python calling C code."
|
|
|
262
262
|
optional = false
|
|
263
263
|
python-versions = ">=3.9"
|
|
264
264
|
groups = ["main"]
|
|
265
|
-
markers = "
|
|
265
|
+
markers = "python_version >= \"3.9\" and platform_python_implementation != \"PyPy\""
|
|
266
266
|
files = [
|
|
267
267
|
{file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"},
|
|
268
268
|
{file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"},
|
|
@@ -970,8 +970,8 @@ files = [
|
|
|
970
970
|
|
|
971
971
|
[package.dependencies]
|
|
972
972
|
cffi = [
|
|
973
|
-
{version = ">=2.0.0", markers = "python_full_version >= \"3.9.0\" and platform_python_implementation != \"PyPy\""},
|
|
974
973
|
{version = ">=1.14", markers = "python_full_version == \"3.8.*\" and platform_python_implementation != \"PyPy\""},
|
|
974
|
+
{version = ">=2.0.0", markers = "python_full_version >= \"3.9.0\" and platform_python_implementation != \"PyPy\""},
|
|
975
975
|
]
|
|
976
976
|
typing-extensions = {version = ">=4.13.2", markers = "python_full_version < \"3.11.0\""}
|
|
977
977
|
|
|
@@ -1050,7 +1050,7 @@ description = "Backport of PEP 654 (exception groups)"
|
|
|
1050
1050
|
optional = false
|
|
1051
1051
|
python-versions = ">=3.7"
|
|
1052
1052
|
groups = ["dev"]
|
|
1053
|
-
markers = "python_version
|
|
1053
|
+
markers = "python_version < \"3.11\""
|
|
1054
1054
|
files = [
|
|
1055
1055
|
{file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"},
|
|
1056
1056
|
{file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"},
|
|
@@ -1095,15 +1095,15 @@ files = [
|
|
|
1095
1095
|
|
|
1096
1096
|
[[package]]
|
|
1097
1097
|
name = "filelock"
|
|
1098
|
-
version = "3.24.
|
|
1098
|
+
version = "3.24.3"
|
|
1099
1099
|
description = "A platform independent file lock."
|
|
1100
1100
|
optional = false
|
|
1101
1101
|
python-versions = ">=3.10"
|
|
1102
1102
|
groups = ["dev"]
|
|
1103
1103
|
markers = "python_version >= \"3.10\""
|
|
1104
1104
|
files = [
|
|
1105
|
-
{file = "filelock-3.24.
|
|
1106
|
-
{file = "filelock-3.24.
|
|
1105
|
+
{file = "filelock-3.24.3-py3-none-any.whl", hash = "sha256:426e9a4660391f7f8a810d71b0555bce9008b0a1cc342ab1f6947d37639e002d"},
|
|
1106
|
+
{file = "filelock-3.24.3.tar.gz", hash = "sha256:011a5644dc937c22699943ebbfc46e969cdde3e171470a6e40b9533e5a72affa"},
|
|
1107
1107
|
]
|
|
1108
1108
|
|
|
1109
1109
|
[[package]]
|
|
@@ -1308,103 +1308,103 @@ i18n = ["Babel (>=2.7)"]
|
|
|
1308
1308
|
|
|
1309
1309
|
[[package]]
|
|
1310
1310
|
name = "librt"
|
|
1311
|
-
version = "0.8.
|
|
1311
|
+
version = "0.8.1"
|
|
1312
1312
|
description = "Mypyc runtime library"
|
|
1313
1313
|
optional = false
|
|
1314
1314
|
python-versions = ">=3.9"
|
|
1315
1315
|
groups = ["dev"]
|
|
1316
1316
|
markers = "python_version >= \"3.9\" and platform_python_implementation != \"PyPy\""
|
|
1317
1317
|
files = [
|
|
1318
|
-
{file = "librt-0.8.
|
|
1319
|
-
{file = "librt-0.8.
|
|
1320
|
-
{file = "librt-0.8.
|
|
1321
|
-
{file = "librt-0.8.
|
|
1322
|
-
{file = "librt-0.8.
|
|
1323
|
-
{file = "librt-0.8.
|
|
1324
|
-
{file = "librt-0.8.
|
|
1325
|
-
{file = "librt-0.8.
|
|
1326
|
-
{file = "librt-0.8.
|
|
1327
|
-
{file = "librt-0.8.
|
|
1328
|
-
{file = "librt-0.8.
|
|
1329
|
-
{file = "librt-0.8.
|
|
1330
|
-
{file = "librt-0.8.
|
|
1331
|
-
{file = "librt-0.8.
|
|
1332
|
-
{file = "librt-0.8.
|
|
1333
|
-
{file = "librt-0.8.
|
|
1334
|
-
{file = "librt-0.8.
|
|
1335
|
-
{file = "librt-0.8.
|
|
1336
|
-
{file = "librt-0.8.
|
|
1337
|
-
{file = "librt-0.8.
|
|
1338
|
-
{file = "librt-0.8.
|
|
1339
|
-
{file = "librt-0.8.
|
|
1340
|
-
{file = "librt-0.8.
|
|
1341
|
-
{file = "librt-0.8.
|
|
1342
|
-
{file = "librt-0.8.
|
|
1343
|
-
{file = "librt-0.8.
|
|
1344
|
-
{file = "librt-0.8.
|
|
1345
|
-
{file = "librt-0.8.
|
|
1346
|
-
{file = "librt-0.8.
|
|
1347
|
-
{file = "librt-0.8.
|
|
1348
|
-
{file = "librt-0.8.
|
|
1349
|
-
{file = "librt-0.8.
|
|
1350
|
-
{file = "librt-0.8.
|
|
1351
|
-
{file = "librt-0.8.
|
|
1352
|
-
{file = "librt-0.8.
|
|
1353
|
-
{file = "librt-0.8.
|
|
1354
|
-
{file = "librt-0.8.
|
|
1355
|
-
{file = "librt-0.8.
|
|
1356
|
-
{file = "librt-0.8.
|
|
1357
|
-
{file = "librt-0.8.
|
|
1358
|
-
{file = "librt-0.8.
|
|
1359
|
-
{file = "librt-0.8.
|
|
1360
|
-
{file = "librt-0.8.
|
|
1361
|
-
{file = "librt-0.8.
|
|
1362
|
-
{file = "librt-0.8.
|
|
1363
|
-
{file = "librt-0.8.
|
|
1364
|
-
{file = "librt-0.8.
|
|
1365
|
-
{file = "librt-0.8.
|
|
1366
|
-
{file = "librt-0.8.
|
|
1367
|
-
{file = "librt-0.8.
|
|
1368
|
-
{file = "librt-0.8.
|
|
1369
|
-
{file = "librt-0.8.
|
|
1370
|
-
{file = "librt-0.8.
|
|
1371
|
-
{file = "librt-0.8.
|
|
1372
|
-
{file = "librt-0.8.
|
|
1373
|
-
{file = "librt-0.8.
|
|
1374
|
-
{file = "librt-0.8.
|
|
1375
|
-
{file = "librt-0.8.
|
|
1376
|
-
{file = "librt-0.8.
|
|
1377
|
-
{file = "librt-0.8.
|
|
1378
|
-
{file = "librt-0.8.
|
|
1379
|
-
{file = "librt-0.8.
|
|
1380
|
-
{file = "librt-0.8.
|
|
1381
|
-
{file = "librt-0.8.
|
|
1382
|
-
{file = "librt-0.8.
|
|
1383
|
-
{file = "librt-0.8.
|
|
1384
|
-
{file = "librt-0.8.
|
|
1385
|
-
{file = "librt-0.8.
|
|
1386
|
-
{file = "librt-0.8.
|
|
1387
|
-
{file = "librt-0.8.
|
|
1388
|
-
{file = "librt-0.8.
|
|
1389
|
-
{file = "librt-0.8.
|
|
1390
|
-
{file = "librt-0.8.
|
|
1391
|
-
{file = "librt-0.8.
|
|
1392
|
-
{file = "librt-0.8.
|
|
1393
|
-
{file = "librt-0.8.
|
|
1394
|
-
{file = "librt-0.8.
|
|
1395
|
-
{file = "librt-0.8.
|
|
1396
|
-
{file = "librt-0.8.
|
|
1397
|
-
{file = "librt-0.8.
|
|
1398
|
-
{file = "librt-0.8.
|
|
1399
|
-
{file = "librt-0.8.
|
|
1400
|
-
{file = "librt-0.8.
|
|
1401
|
-
{file = "librt-0.8.
|
|
1402
|
-
{file = "librt-0.8.
|
|
1403
|
-
{file = "librt-0.8.
|
|
1404
|
-
{file = "librt-0.8.
|
|
1405
|
-
{file = "librt-0.8.
|
|
1406
|
-
{file = "librt-0.8.
|
|
1407
|
-
{file = "librt-0.8.
|
|
1318
|
+
{file = "librt-0.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:81fd938344fecb9373ba1b155968c8a329491d2ce38e7ddb76f30ffb938f12dc"},
|
|
1319
|
+
{file = "librt-0.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5db05697c82b3a2ec53f6e72b2ed373132b0c2e05135f0696784e97d7f5d48e7"},
|
|
1320
|
+
{file = "librt-0.8.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d56bc4011975f7460bea7b33e1ff425d2f1adf419935ff6707273c77f8a4ada6"},
|
|
1321
|
+
{file = "librt-0.8.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdc0f588ff4b663ea96c26d2a230c525c6fc62b28314edaaaca8ed5af931ad0"},
|
|
1322
|
+
{file = "librt-0.8.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:97c2b54ff6717a7a563b72627990bec60d8029df17df423f0ed37d56a17a176b"},
|
|
1323
|
+
{file = "librt-0.8.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8f1125e6bbf2f1657d9a2f3ccc4a2c9b0c8b176965bb565dd4d86be67eddb4b6"},
|
|
1324
|
+
{file = "librt-0.8.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8f4bb453f408137d7581be309b2fbc6868a80e7ef60c88e689078ee3a296ae71"},
|
|
1325
|
+
{file = "librt-0.8.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c336d61d2fe74a3195edc1646d53ff1cddd3a9600b09fa6ab75e5514ba4862a7"},
|
|
1326
|
+
{file = "librt-0.8.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:eb5656019db7c4deacf0c1a55a898c5bb8f989be904597fcb5232a2f4828fa05"},
|
|
1327
|
+
{file = "librt-0.8.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c25d9e338d5bed46c1632f851babf3d13c78f49a225462017cf5e11e845c5891"},
|
|
1328
|
+
{file = "librt-0.8.1-cp310-cp310-win32.whl", hash = "sha256:aaab0e307e344cb28d800957ef3ec16605146ef0e59e059a60a176d19543d1b7"},
|
|
1329
|
+
{file = "librt-0.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:56e04c14b696300d47b3bc5f1d10a00e86ae978886d0cee14e5714fafb5df5d2"},
|
|
1330
|
+
{file = "librt-0.8.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:681dc2451d6d846794a828c16c22dc452d924e9f700a485b7ecb887a30aad1fd"},
|
|
1331
|
+
{file = "librt-0.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3b4350b13cc0e6f5bec8fa7caf29a8fb8cdc051a3bae45cfbfd7ce64f009965"},
|
|
1332
|
+
{file = "librt-0.8.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ac1e7817fd0ed3d14fd7c5df91daed84c48e4c2a11ee99c0547f9f62fdae13da"},
|
|
1333
|
+
{file = "librt-0.8.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:747328be0c5b7075cde86a0e09d7a9196029800ba75a1689332348e998fb85c0"},
|
|
1334
|
+
{file = "librt-0.8.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0af2bd2bc204fa27f3d6711d0f360e6b8c684a035206257a81673ab924aa11e"},
|
|
1335
|
+
{file = "librt-0.8.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d480de377f5b687b6b1bc0c0407426da556e2a757633cc7e4d2e1a057aa688f3"},
|
|
1336
|
+
{file = "librt-0.8.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d0ee06b5b5291f609ddb37b9750985b27bc567791bc87c76a569b3feed8481ac"},
|
|
1337
|
+
{file = "librt-0.8.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:9e2c6f77b9ad48ce5603b83b7da9ee3e36b3ab425353f695cba13200c5d96596"},
|
|
1338
|
+
{file = "librt-0.8.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:439352ba9373f11cb8e1933da194dcc6206daf779ff8df0ed69c5e39113e6a99"},
|
|
1339
|
+
{file = "librt-0.8.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:82210adabbc331dbb65d7868b105185464ef13f56f7f76688565ad79f648b0fe"},
|
|
1340
|
+
{file = "librt-0.8.1-cp311-cp311-win32.whl", hash = "sha256:52c224e14614b750c0a6d97368e16804a98c684657c7518752c356834fff83bb"},
|
|
1341
|
+
{file = "librt-0.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:c00e5c884f528c9932d278d5c9cbbea38a6b81eb62c02e06ae53751a83a4d52b"},
|
|
1342
|
+
{file = "librt-0.8.1-cp311-cp311-win_arm64.whl", hash = "sha256:f7cdf7f26c2286ffb02e46d7bac56c94655540b26347673bea15fa52a6af17e9"},
|
|
1343
|
+
{file = "librt-0.8.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a28f2612ab566b17f3698b0da021ff9960610301607c9a5e8eaca62f5e1c350a"},
|
|
1344
|
+
{file = "librt-0.8.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:60a78b694c9aee2a0f1aaeaa7d101cf713e92e8423a941d2897f4fa37908dab9"},
|
|
1345
|
+
{file = "librt-0.8.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:758509ea3f1eba2a57558e7e98f4659d0ea7670bff49673b0dde18a3c7e6c0eb"},
|
|
1346
|
+
{file = "librt-0.8.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:039b9f2c506bd0ab0f8725aa5ba339c6f0cd19d3b514b50d134789809c24285d"},
|
|
1347
|
+
{file = "librt-0.8.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bb54f1205a3a6ab41a6fd71dfcdcbd278670d3a90ca502a30d9da583105b6f7"},
|
|
1348
|
+
{file = "librt-0.8.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:05bd41cdee35b0c59c259f870f6da532a2c5ca57db95b5f23689fcb5c9e42440"},
|
|
1349
|
+
{file = "librt-0.8.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adfab487facf03f0d0857b8710cf82d0704a309d8ffc33b03d9302b4c64e91a9"},
|
|
1350
|
+
{file = "librt-0.8.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:153188fe98a72f206042be10a2c6026139852805215ed9539186312d50a8e972"},
|
|
1351
|
+
{file = "librt-0.8.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:dd3c41254ee98604b08bd5b3af5bf0a89740d4ee0711de95b65166bf44091921"},
|
|
1352
|
+
{file = "librt-0.8.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e0d138c7ae532908cbb342162b2611dbd4d90c941cd25ab82084aaf71d2c0bd0"},
|
|
1353
|
+
{file = "librt-0.8.1-cp312-cp312-win32.whl", hash = "sha256:43353b943613c5d9c49a25aaffdba46f888ec354e71e3529a00cca3f04d66a7a"},
|
|
1354
|
+
{file = "librt-0.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:ff8baf1f8d3f4b6b7257fcb75a501f2a5499d0dda57645baa09d4d0d34b19444"},
|
|
1355
|
+
{file = "librt-0.8.1-cp312-cp312-win_arm64.whl", hash = "sha256:0f2ae3725904f7377e11cc37722d5d401e8b3d5851fb9273d7f4fe04f6b3d37d"},
|
|
1356
|
+
{file = "librt-0.8.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7e6bad1cd94f6764e1e21950542f818a09316645337fd5ab9a7acc45d99a8f35"},
|
|
1357
|
+
{file = "librt-0.8.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cf450f498c30af55551ba4f66b9123b7185362ec8b625a773b3d39aa1a717583"},
|
|
1358
|
+
{file = "librt-0.8.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:eca45e982fa074090057132e30585a7e8674e9e885d402eae85633e9f449ce6c"},
|
|
1359
|
+
{file = "librt-0.8.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c3811485fccfda840861905b8c70bba5ec094e02825598bb9d4ca3936857a04"},
|
|
1360
|
+
{file = "librt-0.8.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e4af413908f77294605e28cfd98063f54b2c790561383971d2f52d113d9c363"},
|
|
1361
|
+
{file = "librt-0.8.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5212a5bd7fae98dae95710032902edcd2ec4dc994e883294f75c857b83f9aba0"},
|
|
1362
|
+
{file = "librt-0.8.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e692aa2d1d604e6ca12d35e51fdc36f4cda6345e28e36374579f7ef3611b3012"},
|
|
1363
|
+
{file = "librt-0.8.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4be2a5c926b9770c9e08e717f05737a269b9d0ebc5d2f0060f0fe3fe9ce47acb"},
|
|
1364
|
+
{file = "librt-0.8.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fd1a720332ea335ceb544cf0a03f81df92abd4bb887679fd1e460976b0e6214b"},
|
|
1365
|
+
{file = "librt-0.8.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2af9e01e0ef80d95ae3c720be101227edae5f2fe7e3dc63d8857fadfc5a1d"},
|
|
1366
|
+
{file = "librt-0.8.1-cp313-cp313-win32.whl", hash = "sha256:086a32dbb71336627e78cc1d6ee305a68d038ef7d4c39aaff41ae8c9aa46e91a"},
|
|
1367
|
+
{file = "librt-0.8.1-cp313-cp313-win_amd64.whl", hash = "sha256:e11769a1dbda4da7b00a76cfffa67aa47cfa66921d2724539eee4b9ede780b79"},
|
|
1368
|
+
{file = "librt-0.8.1-cp313-cp313-win_arm64.whl", hash = "sha256:924817ab3141aca17893386ee13261f1d100d1ef410d70afe4389f2359fea4f0"},
|
|
1369
|
+
{file = "librt-0.8.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6cfa7fe54fd4d1f47130017351a959fe5804bda7a0bc7e07a2cdbc3fdd28d34f"},
|
|
1370
|
+
{file = "librt-0.8.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:228c2409c079f8c11fb2e5d7b277077f694cb93443eb760e00b3b83cb8b3176c"},
|
|
1371
|
+
{file = "librt-0.8.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7aae78ab5e3206181780e56912d1b9bb9f90a7249ce12f0e8bf531d0462dd0fc"},
|
|
1372
|
+
{file = "librt-0.8.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:172d57ec04346b047ca6af181e1ea4858086c80bdf455f61994c4aa6fc3f866c"},
|
|
1373
|
+
{file = "librt-0.8.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b1977c4ea97ce5eb7755a78fae68d87e4102e4aaf54985e8b56806849cc06a3"},
|
|
1374
|
+
{file = "librt-0.8.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:10c42e1f6fd06733ef65ae7bebce2872bcafd8d6e6b0a08fe0a05a23b044fb14"},
|
|
1375
|
+
{file = "librt-0.8.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4c8dfa264b9193c4ee19113c985c95f876fae5e51f731494fc4e0cf594990ba7"},
|
|
1376
|
+
{file = "librt-0.8.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:01170b6729a438f0dedc4a26ed342e3dc4f02d1000b4b19f980e1877f0c297e6"},
|
|
1377
|
+
{file = "librt-0.8.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:7b02679a0d783bdae30d443025b94465d8c3dc512f32f5b5031f93f57ac32071"},
|
|
1378
|
+
{file = "librt-0.8.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:190b109bb69592a3401fe1ffdea41a2e73370ace2ffdc4a0e8e2b39cdea81b78"},
|
|
1379
|
+
{file = "librt-0.8.1-cp314-cp314-win32.whl", hash = "sha256:e70a57ecf89a0f64c24e37f38d3fe217a58169d2fe6ed6d70554964042474023"},
|
|
1380
|
+
{file = "librt-0.8.1-cp314-cp314-win_amd64.whl", hash = "sha256:7e2f3edca35664499fbb36e4770650c4bd4a08abc1f4458eab9df4ec56389730"},
|
|
1381
|
+
{file = "librt-0.8.1-cp314-cp314-win_arm64.whl", hash = "sha256:0d2f82168e55ddefd27c01c654ce52379c0750ddc31ee86b4b266bcf4d65f2a3"},
|
|
1382
|
+
{file = "librt-0.8.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2c74a2da57a094bd48d03fa5d196da83d2815678385d2978657499063709abe1"},
|
|
1383
|
+
{file = "librt-0.8.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a355d99c4c0d8e5b770313b8b247411ed40949ca44e33e46a4789b9293a907ee"},
|
|
1384
|
+
{file = "librt-0.8.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:2eb345e8b33fb748227409c9f1233d4df354d6e54091f0e8fc53acdb2ffedeb7"},
|
|
1385
|
+
{file = "librt-0.8.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9be2f15e53ce4e83cc08adc29b26fb5978db62ef2a366fbdf716c8a6c8901040"},
|
|
1386
|
+
{file = "librt-0.8.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:785ae29c1f5c6e7c2cde2c7c0e148147f4503da3abc5d44d482068da5322fd9e"},
|
|
1387
|
+
{file = "librt-0.8.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1d3a7da44baf692f0c6aeb5b2a09c5e6fc7a703bca9ffa337ddd2e2da53f7732"},
|
|
1388
|
+
{file = "librt-0.8.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5fc48998000cbc39ec0d5311312dda93ecf92b39aaf184c5e817d5d440b29624"},
|
|
1389
|
+
{file = "librt-0.8.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e96baa6820280077a78244b2e06e416480ed859bbd8e5d641cf5742919d8beb4"},
|
|
1390
|
+
{file = "librt-0.8.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:31362dbfe297b23590530007062c32c6f6176f6099646bb2c95ab1b00a57c382"},
|
|
1391
|
+
{file = "librt-0.8.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cc3656283d11540ab0ea01978378e73e10002145117055e03722417aeab30994"},
|
|
1392
|
+
{file = "librt-0.8.1-cp314-cp314t-win32.whl", hash = "sha256:738f08021b3142c2918c03692608baed43bc51144c29e35807682f8070ee2a3a"},
|
|
1393
|
+
{file = "librt-0.8.1-cp314-cp314t-win_amd64.whl", hash = "sha256:89815a22daf9c51884fb5dbe4f1ef65ee6a146e0b6a8df05f753e2e4a9359bf4"},
|
|
1394
|
+
{file = "librt-0.8.1-cp314-cp314t-win_arm64.whl", hash = "sha256:bf512a71a23504ed08103a13c941f763db13fb11177beb3d9244c98c29fb4a61"},
|
|
1395
|
+
{file = "librt-0.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3dff3d3ca8db20e783b1bc7de49c0a2ab0b8387f31236d6a026597d07fcd68ac"},
|
|
1396
|
+
{file = "librt-0.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:08eec3a1fc435f0d09c87b6bf1ec798986a3544f446b864e4099633a56fcd9ed"},
|
|
1397
|
+
{file = "librt-0.8.1-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e3f0a41487fd5fad7e760b9e8a90e251e27c2816fbc2cff36a22a0e6bcbbd9dd"},
|
|
1398
|
+
{file = "librt-0.8.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bacdb58d9939d95cc557b4dbaa86527c9db2ac1ed76a18bc8d26f6dc8647d851"},
|
|
1399
|
+
{file = "librt-0.8.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6d7ab1f01aa753188605b09a51faa44a3327400b00b8cce424c71910fc0a128"},
|
|
1400
|
+
{file = "librt-0.8.1-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4998009e7cb9e896569f4be7004f09d0ed70d386fa99d42b6d363f6d200501ac"},
|
|
1401
|
+
{file = "librt-0.8.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2cc68eeeef5e906839c7bb0815748b5b0a974ec27125beefc0f942715785b551"},
|
|
1402
|
+
{file = "librt-0.8.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0bf69d79a23f4f40b8673a947a234baeeb133b5078b483b7297c5916539cf5d5"},
|
|
1403
|
+
{file = "librt-0.8.1-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:22b46eabd76c1986ee7d231b0765ad387d7673bbd996aa0d0d054b38ac65d8f6"},
|
|
1404
|
+
{file = "librt-0.8.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:237796479f4d0637d6b9cbcb926ff424a97735e68ade6facf402df4ec93375ed"},
|
|
1405
|
+
{file = "librt-0.8.1-cp39-cp39-win32.whl", hash = "sha256:4beb04b8c66c6ae62f8c1e0b2f097c1ebad9295c929a8d5286c05eae7c2fc7dc"},
|
|
1406
|
+
{file = "librt-0.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:64548cde61b692dc0dc379f4b5f59a2f582c2ebe7890d09c1ae3b9e66fa015b7"},
|
|
1407
|
+
{file = "librt-0.8.1.tar.gz", hash = "sha256:be46a14693955b3bd96014ccbdb8339ee8c9346fbe11c1b78901b55125f14c73"},
|
|
1408
1408
|
]
|
|
1409
1409
|
|
|
1410
1410
|
[[package]]
|
|
@@ -1970,14 +1970,14 @@ pyyaml = ">=5.1"
|
|
|
1970
1970
|
|
|
1971
1971
|
[[package]]
|
|
1972
1972
|
name = "mkdocs-material"
|
|
1973
|
-
version = "9.7.
|
|
1973
|
+
version = "9.7.2"
|
|
1974
1974
|
description = "Documentation that simply works"
|
|
1975
1975
|
optional = false
|
|
1976
1976
|
python-versions = ">=3.8"
|
|
1977
1977
|
groups = ["docs"]
|
|
1978
1978
|
files = [
|
|
1979
|
-
{file = "mkdocs_material-9.7.
|
|
1980
|
-
{file = "mkdocs_material-9.7.
|
|
1979
|
+
{file = "mkdocs_material-9.7.2-py3-none-any.whl", hash = "sha256:9bf6f53452d4a4d527eac3cef3f92b7b6fc4931c55d57766a7d87890d47e1b92"},
|
|
1980
|
+
{file = "mkdocs_material-9.7.2.tar.gz", hash = "sha256:6776256552290b9b7a7aa002780e25b1e04bc9c3a8516b6b153e82e16b8384bd"},
|
|
1981
1981
|
]
|
|
1982
1982
|
|
|
1983
1983
|
[package.dependencies]
|
|
@@ -1994,9 +1994,9 @@ pymdown-extensions = ">=10.2"
|
|
|
1994
1994
|
requests = ">=2.30"
|
|
1995
1995
|
|
|
1996
1996
|
[package.extras]
|
|
1997
|
-
git = ["mkdocs-git-committers-plugin-2 (>=1.1
|
|
1998
|
-
imaging = ["cairosvg (>=2.6
|
|
1999
|
-
recommended = ["mkdocs-minify-plugin (>=0.7
|
|
1997
|
+
git = ["mkdocs-git-committers-plugin-2 (>=1.1)", "mkdocs-git-revision-date-localized-plugin (>=1.2.4)"]
|
|
1998
|
+
imaging = ["cairosvg (>=2.6)", "pillow (>=10.2)"]
|
|
1999
|
+
recommended = ["mkdocs-minify-plugin (>=0.7)", "mkdocs-redirects (>=1.2)", "mkdocs-rss-plugin (>=1.6)"]
|
|
2000
2000
|
|
|
2001
2001
|
[[package]]
|
|
2002
2002
|
name = "mkdocs-material-extensions"
|
|
@@ -2392,7 +2392,7 @@ description = "C parser in Python"
|
|
|
2392
2392
|
optional = false
|
|
2393
2393
|
python-versions = ">=3.8"
|
|
2394
2394
|
groups = ["main"]
|
|
2395
|
-
markers = "platform_python_implementation != \"PyPy\" and (python_full_version == \"3.8.*\" or implementation_name != \"PyPy\")
|
|
2395
|
+
markers = "platform_python_implementation != \"PyPy\" and python_version < \"3.10\" and (python_full_version == \"3.8.*\" or implementation_name != \"PyPy\")"
|
|
2396
2396
|
files = [
|
|
2397
2397
|
{file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"},
|
|
2398
2398
|
{file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"},
|
|
@@ -2746,14 +2746,14 @@ requests = ">=2.0.1,<3.0.0"
|
|
|
2746
2746
|
|
|
2747
2747
|
[[package]]
|
|
2748
2748
|
name = "rich"
|
|
2749
|
-
version = "14.3.
|
|
2749
|
+
version = "14.3.3"
|
|
2750
2750
|
description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
|
|
2751
2751
|
optional = false
|
|
2752
2752
|
python-versions = ">=3.8.0"
|
|
2753
2753
|
groups = ["main"]
|
|
2754
2754
|
files = [
|
|
2755
|
-
{file = "rich-14.3.
|
|
2756
|
-
{file = "rich-14.3.
|
|
2755
|
+
{file = "rich-14.3.3-py3-none-any.whl", hash = "sha256:793431c1f8619afa7d3b52b2cdec859562b950ea0d4b6b505397612db8d5362d"},
|
|
2756
|
+
{file = "rich-14.3.3.tar.gz", hash = "sha256:b8daa0b9e4eef54dd8cf7c86c03713f53241884e814f4e2f5fb342fe520f639b"},
|
|
2757
2757
|
]
|
|
2758
2758
|
|
|
2759
2759
|
[package.dependencies]
|
|
@@ -3050,7 +3050,7 @@ files = [
|
|
|
3050
3050
|
{file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"},
|
|
3051
3051
|
{file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"},
|
|
3052
3052
|
]
|
|
3053
|
-
markers = {main = "python_version >= \"3.9\" and (
|
|
3053
|
+
markers = {main = "python_version >= \"3.9\" and (platform_python_implementation != \"PyPy\" or python_version >= \"3.10\") and python_version < \"3.13\"", dev = "python_version >= \"3.9\" and platform_python_implementation != \"PyPy\" or python_version >= \"3.10\"", docs = "python_full_version >= \"3.9.0\" and platform_python_implementation != \"PyPy\" and python_version < \"3.10\""}
|
|
3054
3054
|
|
|
3055
3055
|
[[package]]
|
|
3056
3056
|
name = "urllib3"
|
|
@@ -3092,21 +3092,21 @@ zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""]
|
|
|
3092
3092
|
|
|
3093
3093
|
[[package]]
|
|
3094
3094
|
name = "virtualenv"
|
|
3095
|
-
version = "20.
|
|
3095
|
+
version = "20.38.0"
|
|
3096
3096
|
description = "Virtual Python Environment builder"
|
|
3097
3097
|
optional = false
|
|
3098
3098
|
python-versions = ">=3.8"
|
|
3099
3099
|
groups = ["dev"]
|
|
3100
3100
|
files = [
|
|
3101
|
-
{file = "virtualenv-20.
|
|
3102
|
-
{file = "virtualenv-20.
|
|
3101
|
+
{file = "virtualenv-20.38.0-py3-none-any.whl", hash = "sha256:d6e78e5889de3a4742df2d3d44e779366325a90cf356f15621fddace82431794"},
|
|
3102
|
+
{file = "virtualenv-20.38.0.tar.gz", hash = "sha256:94f39b1abaea5185bf7ea5a46702b56f1d0c9aa2f41a6c2b8b0af4ddc74c10a7"},
|
|
3103
3103
|
]
|
|
3104
3104
|
|
|
3105
3105
|
[package.dependencies]
|
|
3106
3106
|
distlib = ">=0.3.7,<1"
|
|
3107
3107
|
filelock = [
|
|
3108
|
-
{version = ">=3.24.2,<4", markers = "python_version >= \"3.10\""},
|
|
3109
3108
|
{version = ">=3.16.1,<=3.19.1", markers = "python_version < \"3.10\""},
|
|
3109
|
+
{version = ">=3.24.2,<4", markers = "python_version >= \"3.10\""},
|
|
3110
3110
|
]
|
|
3111
3111
|
platformdirs = ">=3.9.1,<5"
|
|
3112
3112
|
typing-extensions = {version = ">=4.13.2", markers = "python_version < \"3.11\""}
|
|
@@ -23,6 +23,22 @@ def directory():
|
|
|
23
23
|
shutil.rmtree(directory)
|
|
24
24
|
|
|
25
25
|
|
|
26
|
+
@pytest.fixture(scope="module")
|
|
27
|
+
def list_specific_files(directory):
|
|
28
|
+
"""Create a list with list of specific file.
|
|
29
|
+
|
|
30
|
+
Yields:
|
|
31
|
+
text_file (Path): Path to text file.
|
|
32
|
+
"""
|
|
33
|
+
text_file = directory / "specific_files.txt"
|
|
34
|
+
text_file.touch(exist_ok=True)
|
|
35
|
+
text_file.write_text(
|
|
36
|
+
"astro_222266914_20220425105208347783_beam0104_00475476_01.msgpack\n"
|
|
37
|
+
)
|
|
38
|
+
yield text_file
|
|
39
|
+
text_file.unlink()
|
|
40
|
+
|
|
41
|
+
|
|
26
42
|
@pytest.fixture
|
|
27
43
|
def runner() -> CliRunner:
|
|
28
44
|
"""Click CLI runner for testing.
|
|
@@ -43,21 +59,9 @@ def test_cli_help(runner: CliRunner) -> None:
|
|
|
43
59
|
expected_response = """Usage: cli [OPTIONS] COMMAND [ARGS]...
|
|
44
60
|
|
|
45
61
|
Datatrail Command Line Interface.
|
|
46
|
-
|
|
47
|
-
Options:
|
|
48
|
-
--help Show this message and exit.
|
|
49
|
-
|
|
50
|
-
Commands:
|
|
51
|
-
clear Clear a dataset.
|
|
52
|
-
config Datatrail CLI Configuration.
|
|
53
|
-
list (ls) List scopes & datasets
|
|
54
|
-
ps Details of a dataset.
|
|
55
|
-
pull Download a dataset.
|
|
56
|
-
scout Scout a dataset.
|
|
57
|
-
version Show versions.
|
|
58
62
|
"""
|
|
59
63
|
assert result.exit_code == 0
|
|
60
|
-
assert result.output
|
|
64
|
+
assert expected_response in result.output
|
|
61
65
|
|
|
62
66
|
|
|
63
67
|
def test_cli_config_help(runner: CliRunner) -> None:
|
|
@@ -141,7 +145,7 @@ def test_cli_pull_help(runner: CliRunner) -> None:
|
|
|
141
145
|
|
|
142
146
|
Options:
|
|
143
147
|
-d, --directory DIRECTORY Directory to pull data to.
|
|
144
|
-
-s, --specific FILE
|
|
148
|
+
-s, --specific FILE Path to file of specific files to pull.
|
|
145
149
|
-c, --cores INTEGER RANGE Number of parallel fetch processes to use.
|
|
146
150
|
[1<=x<={cpu_count()}]
|
|
147
151
|
-v, --verbose Verbosity: v=INFO, vv=DEBUG.
|
|
@@ -366,7 +370,9 @@ def test_cli_pull_no(runner: CliRunner) -> None:
|
|
|
366
370
|
assert expect in result.output
|
|
367
371
|
|
|
368
372
|
|
|
369
|
-
def test_cli_pull_yes(
|
|
373
|
+
def test_cli_pull_yes(
|
|
374
|
+
runner: CliRunner, directory: Path, list_specific_files: Path
|
|
375
|
+
) -> None:
|
|
370
376
|
"""Test for CLI pull command.
|
|
371
377
|
|
|
372
378
|
Answer 'yes' to prompt for confirmation.
|
|
@@ -383,6 +389,8 @@ def test_cli_pull_yes(runner: CliRunner, directory: Path) -> None:
|
|
|
383
389
|
"222266914",
|
|
384
390
|
"-d",
|
|
385
391
|
f"{directory.as_posix()}",
|
|
392
|
+
"-s",
|
|
393
|
+
f"{list_specific_files.as_posix()}",
|
|
386
394
|
],
|
|
387
395
|
input="y\n",
|
|
388
396
|
)
|
|
@@ -444,7 +452,9 @@ def test_cli_clear_yes(runner: CliRunner, directory: Path) -> None:
|
|
|
444
452
|
).exists()
|
|
445
453
|
|
|
446
454
|
|
|
447
|
-
def test_cli_pull_force(
|
|
455
|
+
def test_cli_pull_force(
|
|
456
|
+
runner: CliRunner, directory: Path, list_specific_files: Path
|
|
457
|
+
) -> None:
|
|
448
458
|
"""Test for CLI pull command.
|
|
449
459
|
|
|
450
460
|
Use '-f' to force download.
|
|
@@ -462,6 +472,8 @@ def test_cli_pull_force(runner: CliRunner, directory: Path) -> None:
|
|
|
462
472
|
"-f",
|
|
463
473
|
"-d",
|
|
464
474
|
f"{directory.as_posix()}",
|
|
475
|
+
"-s",
|
|
476
|
+
f"{list_specific_files.as_posix()}",
|
|
465
477
|
],
|
|
466
478
|
)
|
|
467
479
|
assert result.exit_code == 0
|
|
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
|