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.
- circfirm/backend/__init__.py +1 -2
- circfirm/backend/cache.py +8 -7
- circfirm/backend/device.py +2 -2
- circfirm/backend/github.py +4 -4
- circfirm/backend/s3.py +2 -2
- circfirm/cli/__init__.py +21 -7
- circfirm/cli/current.py +1 -3
- circfirm/cli/detect.py +38 -0
- circfirm/cli/install.py +13 -2
- circfirm/cli/update.py +14 -2
- circfirm/startup.py +3 -4
- {circfirm-3.1.0.dist-info → circfirm-4.0.0.dist-info}/METADATA +19 -19
- circfirm-4.0.0.dist-info/RECORD +27 -0
- {circfirm-3.1.0.dist-info → circfirm-4.0.0.dist-info}/WHEEL +1 -1
- circfirm-3.1.0.dist-info/RECORD +0 -26
- {circfirm-3.1.0.dist-info → circfirm-4.0.0.dist-info}/LICENSE +0 -0
- {circfirm-3.1.0.dist-info → circfirm-4.0.0.dist-info}/NOTICE +0 -0
- {circfirm-3.1.0.dist-info → circfirm-4.0.0.dist-info}/NOTICE.license +0 -0
- {circfirm-3.1.0.dist-info → circfirm-4.0.0.dist-info}/entry_points.txt +0 -0
- {circfirm-3.1.0.dist-info → circfirm-4.0.0.dist-info}/top_level.txt +0 -0
circfirm/backend/__init__.py
CHANGED
|
@@ -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) ->
|
|
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
|
|
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(
|
|
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]) ->
|
|
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:
|
|
61
|
+
boards: dict[str, dict[str, set[str]]] = {}
|
|
61
62
|
for board_folder in sorted(os.listdir(circfirm.UF2_ARCHIVE)):
|
|
62
|
-
versions:
|
|
63
|
-
sorted_versions:
|
|
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)
|
circfirm/backend/device.py
CHANGED
|
@@ -9,7 +9,7 @@ Author(s): Alec Delaney
|
|
|
9
9
|
|
|
10
10
|
import pathlib
|
|
11
11
|
import re
|
|
12
|
-
from typing import Optional
|
|
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) ->
|
|
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:
|
circfirm/backend/github.py
CHANGED
|
@@ -9,7 +9,7 @@ Author(s): Alec Delaney
|
|
|
9
9
|
|
|
10
10
|
import datetime
|
|
11
11
|
import re
|
|
12
|
-
from typing import
|
|
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() ->
|
|
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) ->
|
|
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:
|
|
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
|
|
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
|
-
) ->
|
|
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
|
|
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],
|
|
47
|
-
|
|
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.
|
|
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() ->
|
|
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[
|
|
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() ->
|
|
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() ->
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
18
|
-
FILE_LIST:
|
|
19
|
-
TEMPLATE_LIST:
|
|
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
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: circfirm
|
|
3
|
-
Version:
|
|
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.
|
|
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
|
|
34
|
-
Requires-Dist: click
|
|
35
|
-
Requires-Dist: click-spinner
|
|
36
|
-
Requires-Dist: packaging
|
|
37
|
-
Requires-Dist: psutil
|
|
38
|
-
Requires-Dist: pyyaml
|
|
39
|
-
Requires-Dist: requests
|
|
40
|
-
Requires-Dist: boto3-stubs[essential]
|
|
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
|
|
43
|
-
Requires-Dist: coverage
|
|
44
|
-
Requires-Dist: pre-commit
|
|
45
|
-
Requires-Dist: pytest
|
|
46
|
-
Requires-Dist: sphinx
|
|
47
|
-
Requires-Dist: sphinx-tabs
|
|
48
|
-
Requires-Dist: sphinx-rtd-theme
|
|
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,,
|
circfirm-3.1.0.dist-info/RECORD
DELETED
|
@@ -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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|