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.
Files changed (45) hide show
  1. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/CHANGELOG.md +15 -0
  2. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/PKG-INFO +1 -1
  3. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/cli.py +2 -1
  4. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/pull.py +11 -1
  5. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/src/functions.py +78 -0
  6. datatrail_cli-0.10.0/dtcli/unregistered.py +61 -0
  7. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/utilities/cadcclient.py +49 -30
  8. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/poetry.lock +112 -112
  9. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/pyproject.toml +1 -1
  10. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/tests/test_cli.py +28 -16
  11. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  12. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  13. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  14. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/.github/workflows/continuous-deployment.yml +0 -0
  15. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/.github/workflows/continuous-integration.yml +0 -0
  16. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/.github/workflows/docs.yml +0 -0
  17. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/.github/workflows/stale.yml +0 -0
  18. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/.gitignore +0 -0
  19. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/.pre-commit-config.yaml +0 -0
  20. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/LICENSE +0 -0
  21. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/README.md +0 -0
  22. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/clear.md +0 -0
  23. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/cli.md +0 -0
  24. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/commands.md +0 -0
  25. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/images/Datatrail-logo.png +0 -0
  26. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/index.md +0 -0
  27. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/initialising.md +0 -0
  28. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/install.md +0 -0
  29. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/list.md +0 -0
  30. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/ps.md +0 -0
  31. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/pull.md +0 -0
  32. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/scout.md +0 -0
  33. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/docs/user_guide.md +0 -0
  34. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/__init__.py +0 -0
  35. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/clear.py +0 -0
  36. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/config.py +0 -0
  37. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/config.yaml +0 -0
  38. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/ls.py +0 -0
  39. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/ps.py +0 -0
  40. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/scout.py +0 -0
  41. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/dtcli/utilities/utilities.py +0 -0
  42. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/mkdocs.yml +0 -0
  43. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/tests/test_functions.py +0 -0
  44. {datatrail_cli-0.9.3 → datatrail_cli-0.10.0}/tests/test_utils.py +0 -0
  45. {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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datatrail-cli
3
- Version: 0.9.3
3
+ Version: 0.10.0
4
4
  Summary: CHIME/FRB Datatrail CLI
5
5
  Author: CHIME FRB Project Office
6
6
  Author-email: Tarik Zegmott <tarik.zegmott@mcgill.ca>
@@ -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="Specific files to pull",
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
- storage.cadcget(filename, destination[index]) # type: ignore
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=(sources[process], destinations[process], certfile, namespace, verbose),
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 = buffer
295
- _, _, queryClient = _connect()
296
- queryClient.query( # type: ignore
297
- query=query,
298
- output_file=None,
299
- response_format="csv",
300
- tmptable=None,
301
- lang="ADQL",
302
- timeout=timeout,
303
- data_only=True,
304
- no_column_names=True,
305
- )
306
- content = buffer.getvalue()
307
- sys.stdout = sys.__stdout__
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 = buffer
358
- _, _, queryClient = _connect()
359
- queryClient.query( # type: ignore
360
- query=query,
361
- output_file=None,
362
- response_format="csv",
363
- tmptable=None,
364
- lang="ADQL",
365
- timeout=timeout,
366
- data_only=True,
367
- no_column_names=True,
368
- )
369
- content = buffer.getvalue()
370
- sys.stdout = sys.__stdout__
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 = "python_full_version >= \"3.9.0\" and platform_python_implementation != \"PyPy\""
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 <= \"3.10\""
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.2"
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.2-py3-none-any.whl", hash = "sha256:667d7dc0b7d1e1064dd5f8f8e80bdac157a6482e8d2e02cd16fd3b6b33bd6556"},
1106
- {file = "filelock-3.24.2.tar.gz", hash = "sha256:c22803117490f156e59fafce621f0550a7a853e2bbf4f87f112b11d469b6c81b"},
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.0"
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.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db63cf3586a24241e89ca1ce0b56baaec9d371a328bd186c529b27c914c9a1ef"},
1319
- {file = "librt-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ba9d9e60651615bc614be5e21a82cdb7b1769a029369cf4b4d861e4f19686fb6"},
1320
- {file = "librt-0.8.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb4b3ad543084ed79f186741470b251b9d269cd8b03556f15a8d1a99a64b7de5"},
1321
- {file = "librt-0.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d2720335020219197380ccfa5c895f079ac364b4c429e96952cd6509934d8eb"},
1322
- {file = "librt-0.8.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9726305d3e53419d27fc8cdfcd3f9571f0ceae22fa6b5ea1b3662c2e538f833e"},
1323
- {file = "librt-0.8.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cc3d107f603b5ee7a79b6aa6f166551b99b32fb4a5303c4dfcb4222fc6a0335e"},
1324
- {file = "librt-0.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:41064a0c07b4cc7a81355ccc305cb097d6027002209ffca51306e65ee8293630"},
1325
- {file = "librt-0.8.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c6e4c10761ddbc0d67d2f6e2753daf99908db85d8b901729bf2bf5eaa60e0567"},
1326
- {file = "librt-0.8.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ba581acad5ac8f33e2ff1746e8a57e001b47c6721873121bf8bbcf7ba8bd3aa4"},
1327
- {file = "librt-0.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bdab762e2c0b48bab76f1a08acb3f4c77afd2123bedac59446aeaaeed3d086cf"},
1328
- {file = "librt-0.8.0-cp310-cp310-win32.whl", hash = "sha256:6a3146c63220d814c4a2c7d6a1eacc8d5c14aed0ff85115c1dfea868080cd18f"},
1329
- {file = "librt-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:bbebd2bba5c6ae02907df49150e55870fdd7440d727b6192c46b6f754723dde9"},
1330
- {file = "librt-0.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ce33a9778e294507f3a0e3468eccb6a698b5166df7db85661543eca1cfc5369"},
1331
- {file = "librt-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8070aa3368559de81061ef752770d03ca1f5fc9467d4d512d405bd0483bfffe6"},
1332
- {file = "librt-0.8.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:20f73d4fecba969efc15cdefd030e382502d56bb6f1fc66b580cce582836c9fa"},
1333
- {file = "librt-0.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a512c88900bdb1d448882f5623a0b1ad27ba81a9bd75dacfe17080b72272ca1f"},
1334
- {file = "librt-0.8.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:015e2dde6e096d27c10238bf9f6492ba6c65822dfb69d2bf74c41a8e88b7ddef"},
1335
- {file = "librt-0.8.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1c25a131013eadd3c600686a0c0333eb2896483cbc7f65baa6a7ee761017aef9"},
1336
- {file = "librt-0.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:21b14464bee0b604d80a638cf1ee3148d84ca4cc163dcdcecb46060c1b3605e4"},
1337
- {file = "librt-0.8.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:05a3dd3f116747f7e1a2b475ccdc6fb637fd4987126d109e03013a79d40bf9e6"},
1338
- {file = "librt-0.8.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:fa37f99bff354ff191c6bcdffbc9d7cdd4fc37faccfc9be0ef3a4fd5613977da"},
1339
- {file = "librt-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1566dbb9d1eb0987264c9b9460d212e809ba908d2f4a3999383a84d765f2f3f1"},
1340
- {file = "librt-0.8.0-cp311-cp311-win32.whl", hash = "sha256:70defb797c4d5402166787a6b3c66dfb3fa7f93d118c0509ffafa35a392f4258"},
1341
- {file = "librt-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:db953b675079884ffda33d1dca7189fb961b6d372153750beb81880384300817"},
1342
- {file = "librt-0.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:75d1a8cab20b2043f03f7aab730551e9e440adc034d776f15f6f8d582b0a5ad4"},
1343
- {file = "librt-0.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:17269dd2745dbe8e42475acb28e419ad92dfa38214224b1b01020b8cac70b645"},
1344
- {file = "librt-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f4617cef654fca552f00ce5ffdf4f4b68770f18950e4246ce94629b789b92467"},
1345
- {file = "librt-0.8.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5cb11061a736a9db45e3c1293cfcb1e3caf205912dfa085734ba750f2197ff9a"},
1346
- {file = "librt-0.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4bb00bd71b448f16749909b08a0ff16f58b079e2261c2e1000f2bbb2a4f0a45"},
1347
- {file = "librt-0.8.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95a719a049f0eefaf1952673223cf00d442952273cbd20cf2ed7ec423a0ef58d"},
1348
- {file = "librt-0.8.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bd32add59b58fba3439d48d6f36ac695830388e3da3e92e4fc26d2d02670d19c"},
1349
- {file = "librt-0.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4f764b2424cb04524ff7a486b9c391e93f93dc1bd8305b2136d25e582e99aa2f"},
1350
- {file = "librt-0.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f04ca50e847abc486fa8f4107250566441e693779a5374ba211e96e238f298b9"},
1351
- {file = "librt-0.8.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9ab3a3475a55b89b87ffd7e6665838e8458e0b596c22e0177e0f961434ec474a"},
1352
- {file = "librt-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e36a8da17134ffc29373775d88c04832f9ecfab1880470661813e6c7991ef79"},
1353
- {file = "librt-0.8.0-cp312-cp312-win32.whl", hash = "sha256:4eb5e06ebcc668677ed6389164f52f13f71737fc8be471101fa8b4ce77baeb0c"},
1354
- {file = "librt-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:0a33335eb59921e77c9acc05d0e654e4e32e45b014a4d61517897c11591094f8"},
1355
- {file = "librt-0.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:24a01c13a2a9bdad20997a4443ebe6e329df063d1978bbe2ebbf637878a46d1e"},
1356
- {file = "librt-0.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7f820210e21e3a8bf8fde2ae3c3d10106d4de9ead28cbfdf6d0f0f41f5b12fa1"},
1357
- {file = "librt-0.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4831c44b8919e75ca0dfb52052897c1ef59fdae19d3589893fbd068f1e41afbf"},
1358
- {file = "librt-0.8.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:88c6e75540f1f10f5e0fc5e87b4b6c290f0e90d1db8c6734f670840494764af8"},
1359
- {file = "librt-0.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9646178cd794704d722306c2c920c221abbf080fede3ba539d5afdec16c46dad"},
1360
- {file = "librt-0.8.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6e1af31a710e17891d9adf0dbd9a5fcd94901a3922a96499abdbf7ce658f4e01"},
1361
- {file = "librt-0.8.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:507e94f4bec00b2f590fbe55f48cd518a208e2474a3b90a60aa8f29136ddbada"},
1362
- {file = "librt-0.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f1178e0de0c271231a660fbef9be6acdfa1d596803464706862bef6644cc1cae"},
1363
- {file = "librt-0.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:71fc517efc14f75c2f74b1f0a5d5eb4a8e06aa135c34d18eaf3522f4a53cd62d"},
1364
- {file = "librt-0.8.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:0583aef7e9a720dd40f26a2ad5a1bf2ccbb90059dac2b32ac516df232c701db3"},
1365
- {file = "librt-0.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5d0f76fc73480d42285c609c0ea74d79856c160fa828ff9aceab574ea4ecfd7b"},
1366
- {file = "librt-0.8.0-cp313-cp313-win32.whl", hash = "sha256:e79dbc8f57de360f0ed987dc7de7be814b4803ef0e8fc6d3ff86e16798c99935"},
1367
- {file = "librt-0.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:25b3e667cbfc9000c4740b282df599ebd91dbdcc1aa6785050e4c1d6be5329ab"},
1368
- {file = "librt-0.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:e9a3a38eb4134ad33122a6d575e6324831f930a771d951a15ce232e0237412c2"},
1369
- {file = "librt-0.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:421765e8c6b18e64d21c8ead315708a56fc24f44075059702e421d164575fdda"},
1370
- {file = "librt-0.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:48f84830a8f8ad7918afd743fd7c4eb558728bceab7b0e38fd5a5cf78206a556"},
1371
- {file = "librt-0.8.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9f09d4884f882baa39a7e36bbf3eae124c4ca2a223efb91e567381d1c55c6b06"},
1372
- {file = "librt-0.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:693697133c3b32aa9b27f040e3691be210e9ac4d905061859a9ed519b1d5a376"},
1373
- {file = "librt-0.8.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5512aae4648152abaf4d48b59890503fcbe86e85abc12fb9b096fe948bdd816"},
1374
- {file = "librt-0.8.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:995d24caa6bbb34bcdd4a41df98ac6d1af637cfa8975cb0790e47d6623e70e3e"},
1375
- {file = "librt-0.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b9aef96d7593584e31ef6ac1eb9775355b0099fee7651fae3a15bc8657b67b52"},
1376
- {file = "librt-0.8.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:4f6e975377fbc4c9567cb33ea9ab826031b6c7ec0515bfae66a4fb110d40d6da"},
1377
- {file = "librt-0.8.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:daae5e955764be8fd70a93e9e5133c75297f8bce1e802e1d3683b98f77e1c5ab"},
1378
- {file = "librt-0.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7bd68cebf3131bb920d5984f75fe302d758db33264e44b45ad139385662d7bc3"},
1379
- {file = "librt-0.8.0-cp314-cp314-win32.whl", hash = "sha256:1e6811cac1dcb27ca4c74e0ca4a5917a8e06db0d8408d30daee3a41724bfde7a"},
1380
- {file = "librt-0.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:178707cda89d910c3b28bf5aa5f69d3d4734e0f6ae102f753ad79edef83a83c7"},
1381
- {file = "librt-0.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:3e8b77b5f54d0937b26512774916041756c9eb3e66f1031971e626eea49d0bf4"},
1382
- {file = "librt-0.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:789911e8fa40a2e82f41120c936b1965f3213c67f5a483fc5a41f5839a05dcbb"},
1383
- {file = "librt-0.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2b37437e7e4ef5e15a297b36ba9e577f73e29564131d86dd75875705e97402b5"},
1384
- {file = "librt-0.8.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:671a6152edf3b924d98a5ed5e6982ec9cb30894085482acadce0975f031d4c5c"},
1385
- {file = "librt-0.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8992ca186a1678107b0af3d0c9303d8c7305981b9914989b9788319ed4d89546"},
1386
- {file = "librt-0.8.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:001e5330093d887b8b9165823eca6c5c4db183fe4edea4fdc0680bbac5f46944"},
1387
- {file = "librt-0.8.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d920789eca7ef71df7f31fd547ec0d3002e04d77f30ba6881e08a630e7b2c30e"},
1388
- {file = "librt-0.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:82fb4602d1b3e303a58bfe6165992b5a78d823ec646445356c332cd5f5bbaa61"},
1389
- {file = "librt-0.8.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:4d3e38797eb482485b486898f89415a6ab163bc291476bd95712e42cf4383c05"},
1390
- {file = "librt-0.8.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a905091a13e0884701226860836d0386b88c72ce5c2fdfba6618e14c72be9f25"},
1391
- {file = "librt-0.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:375eda7acfce1f15f5ed56cfc960669eefa1ec8732e3e9087c3c4c3f2066759c"},
1392
- {file = "librt-0.8.0-cp314-cp314t-win32.whl", hash = "sha256:2ccdd20d9a72c562ffb73098ac411de351b53a6fbb3390903b2d33078ef90447"},
1393
- {file = "librt-0.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:25e82d920d4d62ad741592fcf8d0f3bda0e3fc388a184cb7d2f566c681c5f7b9"},
1394
- {file = "librt-0.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:92249938ab744a5890580d3cb2b22042f0dce71cdaa7c1369823df62bedf7cbc"},
1395
- {file = "librt-0.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4b705f85311ee76acec5ee70806990a51f0deb519ea0c29c1d1652d79127604d"},
1396
- {file = "librt-0.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7ce0a8cb67e702dcb06342b2aaaa3da9fb0ddc670417879adfa088b44cf7b3b6"},
1397
- {file = "librt-0.8.0-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:aaadec87f45a3612b6818d1db5fbfe93630669b7ee5d6bdb6427ae08a1aa2141"},
1398
- {file = "librt-0.8.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56901f1eec031396f230db71c59a01d450715cbbef9856bf636726994331195d"},
1399
- {file = "librt-0.8.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b055bb3abaf69abed25743d8fc1ab691e4f51a912ee0a6f9a6c84f4bbddb283d"},
1400
- {file = "librt-0.8.0-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1ef3bd856373cf8e7382402731f43bfe978a8613b4039e49e166e1e0dc590216"},
1401
- {file = "librt-0.8.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2e0ffe88ebb5962f8fb0ddcbaaff30f1ea06a79501069310e1e030eafb1ad787"},
1402
- {file = "librt-0.8.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82e61cd1c563745ad495387c3b65806bfd453badb4adbc019df3389dddee1bf6"},
1403
- {file = "librt-0.8.0-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:667e2513cf69bfd1e1ed9a00d6c736d5108714ec071192afb737987955888a25"},
1404
- {file = "librt-0.8.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b6caff69e25d80c269b1952be8493b4d94ef745f438fa619d7931066bdd26de"},
1405
- {file = "librt-0.8.0-cp39-cp39-win32.whl", hash = "sha256:02a9fe85410cc9bef045e7cb7fd26fdde6669e6d173f99df659aa7f6335961e9"},
1406
- {file = "librt-0.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:de076eaba208d16efb5962f99539867f8e2c73480988cb513fcf1b5dbb0c9dcf"},
1407
- {file = "librt-0.8.0.tar.gz", hash = "sha256:cb74cdcbc0103fc988e04e5c58b0b31e8e5dd2babb9182b6f9490488eb36324b"},
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.1"
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.1-py3-none-any.whl", hash = "sha256:3f6100937d7d731f87f1e3e3b021c97f7239666b9ba1151ab476cabb96c60d5c"},
1980
- {file = "mkdocs_material-9.7.1.tar.gz", hash = "sha256:89601b8f2c3e6c6ee0a918cc3566cb201d40bf37c3cd3c2067e26fadb8cce2b8"},
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,<3)", "mkdocs-git-revision-date-localized-plugin (>=1.2.4,<2.0)"]
1998
- imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=10.2,<12.0)"]
1999
- recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"]
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\") and python_version < \"3.10\""
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.2"
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.2-py3-none-any.whl", hash = "sha256:08e67c3e90884651da3239ea668222d19bea7b589149d8014a21c633420dbb69"},
2756
- {file = "rich-14.3.2.tar.gz", hash = "sha256:e712f11c1a562a11843306f5ed999475f09ac31ffb64281f73ab29ffdda8b3b8"},
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 (python_version >= \"3.10\" or platform_python_implementation != \"PyPy\") 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\""}
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.37.0"
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.37.0-py3-none-any.whl", hash = "sha256:5d3951c32d57232ae3569d4de4cc256c439e045135ebf43518131175d9be435d"},
3102
- {file = "virtualenv-20.37.0.tar.gz", hash = "sha256:6f7e2064ed470aa7418874e70b6369d53b66bcd9e9fd5389763e96b6c94ccb7c"},
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\""}
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "datatrail-cli"
3
- version = "0.9.3"
3
+ version = "0.10.0"
4
4
  description = "CHIME/FRB Datatrail CLI"
5
5
  authors = [
6
6
  { name = "CHIME FRB Project Office" },
@@ -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 == expected_response
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 Specific files to pull
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(runner: CliRunner, directory: Path) -> None:
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(runner: CliRunner, directory: Path) -> None:
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