circfirm 3.1.0__py3-none-any.whl → 4.0.0__py3-none-any.whl

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.
@@ -9,7 +9,6 @@ Author(s): Alec Delaney
9
9
 
10
10
  import enum
11
11
  import re
12
- from typing import Tuple
13
12
 
14
13
 
15
14
  class Language(enum.Enum):
@@ -60,7 +59,7 @@ def get_uf2_filename(board_id: str, version: str, language: str = "en_US") -> st
60
59
  return f"adafruit-circuitpython-{board_id}-{language}-{version}.uf2"
61
60
 
62
61
 
63
- def parse_firmware_info(uf2_filename: str) -> Tuple[str, str]:
62
+ def parse_firmware_info(uf2_filename: str) -> tuple[str, str]:
64
63
  """Get firmware info."""
65
64
  regex_match = re.match(FIRMWARE_REGEX, uf2_filename)
66
65
  if regex_match is None:
circfirm/backend/cache.py CHANGED
@@ -9,8 +9,7 @@ Author(s): Alec Delaney
9
9
 
10
10
  import os
11
11
  import pathlib
12
- import re
13
- from typing import Dict, List, Optional, Set, Tuple
12
+ from typing import Optional
14
13
 
15
14
  import packaging.version
16
15
  import requests
@@ -48,19 +47,21 @@ def download_uf2(board_id: str, version: str, language: str = "en_US") -> None:
48
47
 
49
48
  SUCCESS = 200
50
49
  if response.status_code != SUCCESS:
51
- raise ConnectionError(f"Could not download the specified UF2 file:\n{url}")
50
+ raise ConnectionError(
51
+ f"Could not download the specified UF2 file:\n{url}\nAre the board ID, version, and language correct?"
52
+ )
52
53
 
53
54
  uf2_file.parent.mkdir(parents=True, exist_ok=True)
54
55
  with open(uf2_file, mode="wb") as uf2file:
55
56
  uf2file.write(response.content)
56
57
 
57
58
 
58
- def get_sorted_boards(board_id: Optional[str]) -> Dict[str, Dict[str, Set[str]]]:
59
+ def get_sorted_boards(board_id: Optional[str]) -> dict[str, dict[str, set[str]]]:
59
60
  """Get a sorted collection of boards, versions, and languages."""
60
- boards: Dict[str, Dict[str, Set[str]]] = {}
61
+ boards: dict[str, dict[str, set[str]]] = {}
61
62
  for board_folder in sorted(os.listdir(circfirm.UF2_ARCHIVE)):
62
- versions: Dict[str, List[str]] = {}
63
- sorted_versions: Dict[str, Set[str]] = {}
63
+ versions: dict[str, list[str]] = {}
64
+ sorted_versions: dict[str, set[str]] = {}
64
65
  if board_id is not None and board_id != board_folder:
65
66
  continue
66
67
  board_folder_full = get_board_folder(board_folder)
@@ -9,7 +9,7 @@ Author(s): Alec Delaney
9
9
 
10
10
  import pathlib
11
11
  import re
12
- from typing import Optional, Tuple
12
+ from typing import Optional
13
13
 
14
14
  import psutil
15
15
 
@@ -21,7 +21,7 @@ BOARD_VER_REGEX = (
21
21
  )
22
22
 
23
23
 
24
- def get_board_info(device_path: str) -> Tuple[str, str]:
24
+ def get_board_info(device_path: str) -> tuple[str, str]:
25
25
  """Get the attached CircuitPytho board's name and version."""
26
26
  bootout_file = pathlib.Path(device_path) / circfirm.BOOTOUT_FILE
27
27
  with open(bootout_file, encoding="utf-8") as infofile:
@@ -9,7 +9,7 @@ Author(s): Alec Delaney
9
9
 
10
10
  import datetime
11
11
  import re
12
- from typing import List, Tuple, TypedDict
12
+ from typing import TypedDict
13
13
 
14
14
  import requests
15
15
 
@@ -42,7 +42,7 @@ class GitTreeItem(TypedDict):
42
42
  url: str
43
43
 
44
44
 
45
- def get_rate_limit() -> Tuple[int, int, datetime.datetime]:
45
+ def get_rate_limit() -> tuple[int, int, datetime.datetime]:
46
46
  """Get the rate limit for the GitHub REST endpoint."""
47
47
  response = requests.get(
48
48
  url="https://api.github.com/rate_limit",
@@ -55,7 +55,7 @@ def get_rate_limit() -> Tuple[int, int, datetime.datetime]:
55
55
  return available, total, reset_time
56
56
 
57
57
 
58
- def get_board_id_list(token: str) -> List[str]:
58
+ def get_board_id_list(token: str) -> list[str]:
59
59
  """Get a list of CircuitPython boards."""
60
60
  boards = set()
61
61
  headers = BASE_REQUESTS_HEADERS.copy()
@@ -69,7 +69,7 @@ def get_board_id_list(token: str) -> List[str]:
69
69
  headers=headers,
70
70
  )
71
71
  try:
72
- tree_items: List[GitTreeItem] = response.json()["tree"]
72
+ tree_items: list[GitTreeItem] = response.json()["tree"]
73
73
  except KeyError as err:
74
74
  raise ValueError("Could not parse JSON response, check token") from err
75
75
  for tree_item in tree_items:
circfirm/backend/s3.py CHANGED
@@ -8,7 +8,7 @@ Author(s): Alec Delaney
8
8
  """
9
9
 
10
10
  import re
11
- from typing import List, Optional
11
+ from typing import Optional
12
12
 
13
13
  import boto3
14
14
  import botocore
@@ -27,7 +27,7 @@ BUCKET = S3_RESOURCE.Bucket(BUCKET_NAME)
27
27
 
28
28
  def get_board_versions(
29
29
  board_id: str, language: str = "en_US", *, regex: Optional[str] = None
30
- ) -> List[str]:
30
+ ) -> list[str]:
31
31
  """Get a list of CircuitPython versions for a given board."""
32
32
  prefix = f"bin/{board_id}/{language}"
33
33
  firmware_regex = circfirm.backend.FIRMWARE_REGEX_PATTERN.replace(
circfirm/cli/__init__.py CHANGED
@@ -13,7 +13,8 @@ import pkgutil
13
13
  import shutil
14
14
  import sys
15
15
  import time
16
- from typing import Any, Callable, Dict, Iterable, Optional, Tuple, TypeVar
16
+ from collections.abc import Iterable
17
+ from typing import Any, Callable, Optional, TypeVar
17
18
 
18
19
  import click
19
20
  import click_spinner
@@ -43,8 +44,11 @@ def maybe_support(msg: str) -> None:
43
44
 
44
45
 
45
46
  def get_board_id(
46
- circuitpy: Optional[str], bootloader: Optional[str], board: Optional[str]
47
- ) -> Tuple[str, str]:
47
+ circuitpy: Optional[str],
48
+ bootloader: Optional[str],
49
+ board: Optional[str],
50
+ timeout: int = -1,
51
+ ) -> tuple[str, str]:
48
52
  """Get the board ID of a device via CLI."""
49
53
  if not board:
50
54
  if not circuitpy and bootloader:
@@ -56,12 +60,22 @@ def get_board_id(
56
60
  board = circfirm.backend.device.get_board_info(circuitpy)[0]
57
61
 
58
62
  click.echo("Board ID detected, please switch the device to bootloader mode.")
63
+ if timeout == -1:
64
+ skip_timeout = True
65
+ else:
66
+ skip_timeout = False
67
+ start_time = time.time()
68
+
59
69
  while not (bootloader := circfirm.backend.device.find_bootloader()):
60
- time.sleep(1)
70
+ if not skip_timeout and time.time() >= start_time + timeout:
71
+ raise OSError(
72
+ "Bootloader mode device not found within the timeout period"
73
+ )
74
+ time.sleep(0.05)
61
75
  return bootloader, board
62
76
 
63
77
 
64
- def get_connection_status() -> Tuple[Optional[str], Optional[str]]:
78
+ def get_connection_status() -> tuple[Optional[str], Optional[str]]:
65
79
  """Get the status of a connectted CircuitPython device as a CIRCUITPY and bootloader location."""
66
80
  circuitpy = circfirm.backend.device.find_circuitpy()
67
81
  bootloader = circfirm.backend.device.find_bootloader()
@@ -116,7 +130,7 @@ def announce_and_await(
116
130
  msg: str,
117
131
  func: Callable[..., _T],
118
132
  args: Iterable = (),
119
- kwargs: Optional[Dict[str, Any]] = None,
133
+ kwargs: Optional[dict[str, Any]] = None,
120
134
  *,
121
135
  use_spinner: bool = True,
122
136
  ) -> _T:
@@ -141,7 +155,7 @@ def announce_and_await(
141
155
  raise err
142
156
 
143
157
 
144
- def get_settings() -> Dict[str, Any]:
158
+ def get_settings() -> dict[str, Any]:
145
159
  """Get the contents of the settings file."""
146
160
  with open(circfirm.SETTINGS_FILE, encoding="utf-8") as yamlfile:
147
161
  return yaml.safe_load(yamlfile)
circfirm/cli/current.py CHANGED
@@ -7,15 +7,13 @@
7
7
  Author(s): Alec Delaney
8
8
  """
9
9
 
10
- from typing import Tuple
11
-
12
10
  import click
13
11
 
14
12
  import circfirm.backend.device
15
13
  import circfirm.cli
16
14
 
17
15
 
18
- def get_board_info() -> Tuple[str, str]:
16
+ def get_board_info() -> tuple[str, str]:
19
17
  """Get board info via the CLI."""
20
18
  circuitpy, _ = circfirm.cli.get_connection_status()
21
19
  if not circuitpy:
circfirm/cli/detect.py ADDED
@@ -0,0 +1,38 @@
1
+ # SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
+ #
3
+ # SPDX-License-Identifier: MIT
4
+
5
+ """CLI functionality for the detect subcommand.
6
+
7
+ Author(s): Alec Delaney
8
+ """
9
+
10
+
11
+ import click
12
+
13
+ import circfirm.backend.device
14
+
15
+
16
+ @click.group()
17
+ def cli() -> None:
18
+ """Detect connected CircuitPython boards."""
19
+
20
+
21
+ @cli.command(name="circuitpy")
22
+ def detect_circuitpy() -> None:
23
+ """Detect a connected board in CIRCUITPY or equivalent mode."""
24
+ circuitpy = circfirm.backend.device.find_circuitpy()
25
+ if not circuitpy:
26
+ click.echo("No board connected in CIRCUITPY or equivalent mode")
27
+ return
28
+ click.echo(circuitpy)
29
+
30
+
31
+ @cli.command(name="bootloader")
32
+ def detect_bootloader() -> None:
33
+ """Detect a connected board in bootloader mode."""
34
+ bootloader = circfirm.backend.device.find_bootloader()
35
+ if not bootloader:
36
+ click.echo("No board connected in bootloader mode")
37
+ return
38
+ click.echo(bootloader)
circfirm/cli/install.py CHANGED
@@ -23,10 +23,21 @@ import circfirm.cli
23
23
  default=None,
24
24
  help="Assume the given board ID (and connect in bootloader mode)",
25
25
  )
26
- def cli(version: str, language: str, board_id: Optional[str]) -> None:
26
+ @click.option(
27
+ "-t",
28
+ "--timeout",
29
+ default=-1,
30
+ help="Set a timeout in seconds for the switch to bootloader mode",
31
+ )
32
+ def cli(version: str, language: str, board_id: Optional[str], timeout: int) -> None:
27
33
  """Install the specified version of CircuitPython."""
28
34
  circuitpy, bootloader = circfirm.cli.get_connection_status()
29
- bootloader, board_id = circfirm.cli.get_board_id(circuitpy, bootloader, board_id)
35
+ try:
36
+ bootloader, board_id = circfirm.cli.get_board_id(
37
+ circuitpy, bootloader, board_id, timeout
38
+ )
39
+ except OSError as err:
40
+ raise click.ClickException(err.args[0])
30
41
  circfirm.cli.ensure_bootloader_mode(bootloader)
31
42
  circfirm.cli.download_if_needed(board_id, version, language)
32
43
  circfirm.cli.copy_cache_firmware(board_id, version, language, bootloader)
circfirm/cli/update.py CHANGED
@@ -25,6 +25,12 @@ import circfirm.cli.install
25
25
  help="Assume the given board ID (and connect in bootloader mode)",
26
26
  )
27
27
  @click.option("-l", "--language", default="en_US", help="CircuitPython langauge/locale")
28
+ @click.option(
29
+ "-t",
30
+ "--timeout",
31
+ default=-1,
32
+ help="Set a timeout in seconds for the switch to bootloader mode",
33
+ )
28
34
  @click.option(
29
35
  "-p",
30
36
  "--pre-release",
@@ -46,9 +52,10 @@ import circfirm.cli.install
46
52
  default=False,
47
53
  help="Upgrade up to patch version updates",
48
54
  )
49
- def cli(
55
+ def cli( # noqa: PLR0913
50
56
  board_id: Optional[str],
51
57
  language: str,
58
+ timeout: int,
52
59
  pre_release: bool,
53
60
  limit_to_minor: bool,
54
61
  limit_to_patch: bool,
@@ -65,7 +72,12 @@ def cli(
65
72
  "The latest version will be installed regardless of the currently installed version."
66
73
  )
67
74
  current_version = "0.0.0"
68
- bootloader, board_id = circfirm.cli.get_board_id(circuitpy, bootloader, board_id)
75
+ try:
76
+ bootloader, board_id = circfirm.cli.get_board_id(
77
+ circuitpy, bootloader, board_id, timeout
78
+ )
79
+ except OSError as err:
80
+ raise click.ClickException(err.args[0])
69
81
 
70
82
  new_versions = circfirm.backend.s3.get_board_versions(board_id, language)
71
83
 
circfirm/startup.py CHANGED
@@ -10,13 +10,12 @@ Author(s): Alec Delaney
10
10
  import os
11
11
  import pathlib
12
12
  import shutil
13
- from typing import List, Tuple
14
13
 
15
14
  import click
16
15
 
17
- FOLDER_LIST: List[str] = []
18
- FILE_LIST: List[str] = []
19
- TEMPLATE_LIST: List[Tuple[str, str]] = []
16
+ FOLDER_LIST: list[str] = []
17
+ FILE_LIST: list[str] = []
18
+ TEMPLATE_LIST: list[tuple[str, str]] = []
20
19
 
21
20
 
22
21
  def specify_app_dir(app_name: str) -> str:
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: circfirm
3
- Version: 3.1.0
3
+ Version: 4.0.0
4
4
  Summary: CLI tool for install firmware for CircuitPython boards
5
5
  Author-email: Alec Delaney <tekktrik@gmail.com>
6
6
  License: MIT
@@ -15,37 +15,37 @@ Classifier: License :: OSI Approved :: MIT License
15
15
  Classifier: Development Status :: 5 - Production/Stable
16
16
  Classifier: Environment :: Console
17
17
  Classifier: Natural Language :: English
18
- Classifier: Programming Language :: Python :: 3.8
19
18
  Classifier: Programming Language :: Python :: 3.9
20
19
  Classifier: Programming Language :: Python :: 3.10
21
20
  Classifier: Programming Language :: Python :: 3.11
22
21
  Classifier: Programming Language :: Python :: 3.12
22
+ Classifier: Programming Language :: Python :: 3.13
23
23
  Classifier: Programming Language :: Python :: Implementation :: CPython
24
24
  Classifier: Operating System :: Unix
25
25
  Classifier: Operating System :: Microsoft :: Windows
26
26
  Classifier: Operating System :: MacOS
27
27
  Classifier: Typing :: Typed
28
- Requires-Python: >=3.8.0
28
+ Requires-Python: >=3.9.0
29
29
  Description-Content-Type: text/x-rst
30
30
  License-File: LICENSE
31
31
  License-File: NOTICE
32
32
  License-File: NOTICE.license
33
- Requires-Dist: boto3 ~=1.34
34
- Requires-Dist: click ~=8.0
35
- Requires-Dist: click-spinner ~=0.1
36
- Requires-Dist: packaging ~=23.2
37
- Requires-Dist: psutil ~=5.9
38
- Requires-Dist: pyyaml ~=6.0
39
- Requires-Dist: requests ~=2.31
40
- Requires-Dist: boto3-stubs[essential] ~=1.34
33
+ Requires-Dist: boto3~=1.35
34
+ Requires-Dist: click~=8.1
35
+ Requires-Dist: click-spinner~=0.1
36
+ Requires-Dist: packaging~=24.2
37
+ Requires-Dist: psutil~=6.1
38
+ Requires-Dist: pyyaml~=6.0
39
+ Requires-Dist: requests~=2.32
40
+ Requires-Dist: boto3-stubs[essential]~=1.35
41
41
  Provides-Extra: dev
42
- Requires-Dist: build ~=1.0 ; extra == 'dev'
43
- Requires-Dist: coverage ~=7.4 ; extra == 'dev'
44
- Requires-Dist: pre-commit ~=2.20 ; extra == 'dev'
45
- Requires-Dist: pytest ~=8.0 ; extra == 'dev'
46
- Requires-Dist: sphinx ~=5.1 ; extra == 'dev'
47
- Requires-Dist: sphinx-tabs ~=3.4 ; extra == 'dev'
48
- Requires-Dist: sphinx-rtd-theme ~=1.0 ; extra == 'dev'
42
+ Requires-Dist: build~=1.2; extra == "dev"
43
+ Requires-Dist: coverage~=7.6; extra == "dev"
44
+ Requires-Dist: pre-commit~=4.0; extra == "dev"
45
+ Requires-Dist: pytest~=8.3; extra == "dev"
46
+ Requires-Dist: sphinx~=7.4; extra == "dev"
47
+ Requires-Dist: sphinx-tabs~=3.4; extra == "dev"
48
+ Requires-Dist: sphinx-rtd-theme~=3.0; extra == "dev"
49
49
 
50
50
  ..
51
51
  SPDX-FileCopyrightText: 2022 Alec Delaney, for Adafruit Industries
@@ -0,0 +1,27 @@
1
+ circfirm/__init__.py,sha256=Uk6XRo7aFQcwUOMfst4GVt8tuXbMRnDIsPRrWeBtxLQ,719
2
+ circfirm/py.typed,sha256=F2H7kdQErBIQUjr5WG2gdwj35iaUHi4Eyc2hovaLTMA,97
3
+ circfirm/startup.py,sha256=HoeMpISAJswKTFn-sHhtoCD5yISHW5z8ZPW7WgSr2xg,1946
4
+ circfirm/backend/__init__.py,sha256=fzxooHsys60iPrj6q6l-t3m2iGAC6FEIinP1UFgGHKE,1858
5
+ circfirm/backend/cache.py,sha256=cxd_Za68SotnQ4td9R3-_F20Rci5BMVO1LgD0CVpKRo,2931
6
+ circfirm/backend/device.py,sha256=t_g4iPJ4C2Qg5xKUr1AI6XPu5-ULTDZ4e3qAZVSfJs8,1776
7
+ circfirm/backend/github.py,sha256=ePHXTCxqGcJOyVsutdbsL80MaxIYBdNIV9Yzz8aG4Yg,2090
8
+ circfirm/backend/s3.py,sha256=eTwCD79E8TCia2kPcj1-p7qmIvTt2vqQC_K7mHKWeyk,2175
9
+ circfirm/cli/__init__.py,sha256=TBJxvMqzTXQNEv2jKTZHqxeTTvGoQ9sz4o4R91Qe4Kg,6454
10
+ circfirm/cli/about.py,sha256=_QNqXtbyerlxewPVieCdOvQ6BZWqdgvncBIzj39zpCU,340
11
+ circfirm/cli/cache.py,sha256=z1DtWFusGAeUnzFTl0dcxyko7eOQmJUyR1x3orfEWk8,5222
12
+ circfirm/cli/config.py,sha256=9ye3jQhgXaOMAXIlJWHp8PhBEtjUTJSL9szTXCQU2Cg,3122
13
+ circfirm/cli/current.py,sha256=3kjvAQ5oFuXxey8RtU6T5GJPnTmIy2saEpyYoqVOTU8,1034
14
+ circfirm/cli/detect.py,sha256=hXOIFjQAylx5kDT1chU2HJXqIv14scDJheO5-XUioeI,944
15
+ circfirm/cli/install.py,sha256=z0pT7J_n4A3dJn-ocZk-uYcKkOZ3iUHbId-f-k97cg0,1253
16
+ circfirm/cli/query.py,sha256=628UQhQxUMoTnKwPJhhL0ZjmKR_zNJTFgq-PzV-SPlM,2959
17
+ circfirm/cli/update.py,sha256=S25Cty4HXy71hQvAXbxP_JNN_2JgcvXxfocte0rzMWE,3433
18
+ circfirm/templates/settings.yaml,sha256=SM1zjXvZg1jikzn9TjgOufl0Pn9KBbrw8sIcJ01BRhQ,69
19
+ circfirm/templates/settings.yaml.license,sha256=F2H7kdQErBIQUjr5WG2gdwj35iaUHi4Eyc2hovaLTMA,97
20
+ circfirm-4.0.0.dist-info/LICENSE,sha256=6pPP6gJ00tqCkxg5gABHDwWUiXZ_mBzH94xxPOqwGj4,1069
21
+ circfirm-4.0.0.dist-info/METADATA,sha256=vedVLmckngt1DSxN0IUD9q5c_NujIfxih9JTUg0ktok,4678
22
+ circfirm-4.0.0.dist-info/NOTICE,sha256=-iTImDmAffekkp_kj8De0_pvckHvXAHLPAJTWOgQsiw,2956
23
+ circfirm-4.0.0.dist-info/NOTICE.license,sha256=FIvC5TnLXwPBj-dgEV4FBwAlJxzMXhgl50TXLv2d88o,96
24
+ circfirm-4.0.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
25
+ circfirm-4.0.0.dist-info/entry_points.txt,sha256=33qZTmSuXz8dgi29yjSyb8VsEA8HyhWuhn2MNcjatGQ,46
26
+ circfirm-4.0.0.dist-info/top_level.txt,sha256=qA2407wap3My6jGA5uchH2JjUM7qn73oBPwALN7GR5k,9
27
+ circfirm-4.0.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.43.0)
2
+ Generator: setuptools (75.8.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,26 +0,0 @@
1
- circfirm/__init__.py,sha256=Uk6XRo7aFQcwUOMfst4GVt8tuXbMRnDIsPRrWeBtxLQ,719
2
- circfirm/py.typed,sha256=F2H7kdQErBIQUjr5WG2gdwj35iaUHi4Eyc2hovaLTMA,97
3
- circfirm/startup.py,sha256=eorElSnwGkW7jb87t0J7y7JAtg1yyeSD2xNqDjXPI6I,1977
4
- circfirm/backend/__init__.py,sha256=H9X3u-13jHhCeDYeTTCAAEBwrlfkZzJScOgv2bY7Oto,1883
5
- circfirm/backend/cache.py,sha256=nwJPobc93jaOuEvM7srYfYbolz9fYycicUmp0iI5LUU,2893
6
- circfirm/backend/device.py,sha256=4K36uMVdH3kGnBBbZ_ApGrwB-G3CtC-aMdH_fP6k7S0,1783
7
- circfirm/backend/github.py,sha256=vyDeUS76haKMVVOewS4xq1tRHGtHb1SWXP6ippOKtZs,2103
8
- circfirm/backend/s3.py,sha256=OZ7Pewxspk_W_AjIaWVQajVPCQcOgVHy9e1ulugT8YA,2181
9
- circfirm/cli/__init__.py,sha256=sW58Qwk4H_BquDioJjTIi7PNQOznsAgOfq4hFGM8Dlg,6059
10
- circfirm/cli/about.py,sha256=_QNqXtbyerlxewPVieCdOvQ6BZWqdgvncBIzj39zpCU,340
11
- circfirm/cli/cache.py,sha256=z1DtWFusGAeUnzFTl0dcxyko7eOQmJUyR1x3orfEWk8,5222
12
- circfirm/cli/config.py,sha256=9ye3jQhgXaOMAXIlJWHp8PhBEtjUTJSL9szTXCQU2Cg,3122
13
- circfirm/cli/current.py,sha256=ZfMbBVYS5AyVdHb8s0ElvkUX5QuX6_iOrvjVfyAfNGU,1060
14
- circfirm/cli/install.py,sha256=dJQhZVpNOVcspcPMSyTtZq3BiX_RgXEm9ejaaNWcvXA,989
15
- circfirm/cli/query.py,sha256=628UQhQxUMoTnKwPJhhL0ZjmKR_zNJTFgq-PzV-SPlM,2959
16
- circfirm/cli/update.py,sha256=qZ7BEdyt4mTOjfmISRzeP3yl74yZ2-xVBTEcr9XlUlc,3148
17
- circfirm/templates/settings.yaml,sha256=SM1zjXvZg1jikzn9TjgOufl0Pn9KBbrw8sIcJ01BRhQ,69
18
- circfirm/templates/settings.yaml.license,sha256=F2H7kdQErBIQUjr5WG2gdwj35iaUHi4Eyc2hovaLTMA,97
19
- circfirm-3.1.0.dist-info/LICENSE,sha256=6pPP6gJ00tqCkxg5gABHDwWUiXZ_mBzH94xxPOqwGj4,1069
20
- circfirm-3.1.0.dist-info/METADATA,sha256=WpyUEuANc09J5kyAo3yXXG54jVGzWxVTWSEr_2khFPI,4700
21
- circfirm-3.1.0.dist-info/NOTICE,sha256=-iTImDmAffekkp_kj8De0_pvckHvXAHLPAJTWOgQsiw,2956
22
- circfirm-3.1.0.dist-info/NOTICE.license,sha256=FIvC5TnLXwPBj-dgEV4FBwAlJxzMXhgl50TXLv2d88o,96
23
- circfirm-3.1.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
24
- circfirm-3.1.0.dist-info/entry_points.txt,sha256=33qZTmSuXz8dgi29yjSyb8VsEA8HyhWuhn2MNcjatGQ,46
25
- circfirm-3.1.0.dist-info/top_level.txt,sha256=qA2407wap3My6jGA5uchH2JjUM7qn73oBPwALN7GR5k,9
26
- circfirm-3.1.0.dist-info/RECORD,,