circfirm 4.0.1__tar.gz → 5.0.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 (123) hide show
  1. circfirm-5.0.0/.github/dependabot.yml +11 -0
  2. {circfirm-4.0.1 → circfirm-5.0.0}/.github/workflows/codeql.yml +3 -4
  3. {circfirm-4.0.1 → circfirm-5.0.0}/.github/workflows/publish.yml +4 -4
  4. {circfirm-4.0.1 → circfirm-5.0.0}/.github/workflows/push.yml +10 -12
  5. {circfirm-4.0.1 → circfirm-5.0.0}/.gitignore +0 -1
  6. {circfirm-4.0.1 → circfirm-5.0.0}/.pre-commit-config.yaml +4 -5
  7. {circfirm-4.0.1 → circfirm-5.0.0}/.readthedocs.yaml +0 -1
  8. {circfirm-4.0.1 → circfirm-5.0.0}/Makefile +0 -1
  9. {circfirm-4.0.1 → circfirm-5.0.0}/PKG-INFO +18 -18
  10. circfirm-5.0.0/VERSION +1 -0
  11. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/__init__.py +0 -1
  12. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/backend/__init__.py +0 -1
  13. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/backend/cache.py +1 -3
  14. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/backend/device.py +3 -5
  15. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/backend/github.py +0 -1
  16. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/backend/s3.py +2 -4
  17. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/cli/__init__.py +8 -9
  18. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/cli/about.py +0 -1
  19. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/cli/cache.py +4 -6
  20. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/cli/config.py +0 -1
  21. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/cli/current.py +0 -1
  22. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/cli/detect.py +0 -2
  23. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/cli/install.py +1 -4
  24. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/cli/query.py +1 -2
  25. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/cli/update.py +1 -4
  26. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/startup.py +0 -1
  27. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm.egg-info/PKG-INFO +18 -18
  28. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm.egg-info/SOURCES.txt +3 -2
  29. circfirm-5.0.0/circfirm.egg-info/requires.txt +17 -0
  30. {circfirm-4.0.1 → circfirm-5.0.0}/docs/conf.py +0 -3
  31. {circfirm-4.0.1 → circfirm-5.0.0}/examples/bash/update_many.sh +0 -1
  32. {circfirm-4.0.1 → circfirm-5.0.0}/examples/bash/weekly_cache.sh +0 -1
  33. {circfirm-4.0.1 → circfirm-5.0.0}/examples/powershell/update_many.ps1 +0 -1
  34. {circfirm-4.0.1 → circfirm-5.0.0}/examples/powershell/weekly_cache.ps1 +0 -1
  35. {circfirm-4.0.1 → circfirm-5.0.0}/pyproject.toml +26 -9
  36. {circfirm-4.0.1 → circfirm-5.0.0}/scripts/rmdir.py +0 -1
  37. {circfirm-4.0.1 → circfirm-5.0.0}/tests/backend/test_backend.py +0 -1
  38. {circfirm-4.0.1 → circfirm-5.0.0}/tests/backend/test_backend_cache.py +0 -1
  39. {circfirm-4.0.1 → circfirm-5.0.0}/tests/backend/test_backend_device.py +0 -1
  40. {circfirm-4.0.1 → circfirm-5.0.0}/tests/backend/test_backend_github.py +0 -1
  41. {circfirm-4.0.1 → circfirm-5.0.0}/tests/backend/test_backend_s3.py +0 -1
  42. {circfirm-4.0.1 → circfirm-5.0.0}/tests/cli/test_cli_about.py +0 -1
  43. {circfirm-4.0.1 → circfirm-5.0.0}/tests/cli/test_cli_cache.py +0 -1
  44. {circfirm-4.0.1 → circfirm-5.0.0}/tests/cli/test_cli_config.py +0 -1
  45. {circfirm-4.0.1 → circfirm-5.0.0}/tests/cli/test_cli_current.py +0 -1
  46. {circfirm-4.0.1 → circfirm-5.0.0}/tests/cli/test_cli_detect.py +0 -4
  47. {circfirm-4.0.1 → circfirm-5.0.0}/tests/cli/test_cli_install.py +0 -1
  48. {circfirm-4.0.1 → circfirm-5.0.0}/tests/cli/test_cli_query.py +0 -2
  49. {circfirm-4.0.1 → circfirm-5.0.0}/tests/cli/test_cli_update.py +0 -1
  50. {circfirm-4.0.1 → circfirm-5.0.0}/tests/conftest.py +2 -3
  51. {circfirm-4.0.1 → circfirm-5.0.0}/tests/helpers.py +0 -1
  52. {circfirm-4.0.1 → circfirm-5.0.0}/tests/test_startup.py +0 -1
  53. circfirm-5.0.0/uv.lock +1126 -0
  54. circfirm-5.0.0/uv.lock.license +2 -0
  55. circfirm-4.0.1/VERSION +0 -1
  56. circfirm-4.0.1/circfirm.egg-info/requires.txt +0 -17
  57. circfirm-4.0.1/requirements-dev.txt +0 -11
  58. circfirm-4.0.1/requirements.txt +0 -12
  59. {circfirm-4.0.1 → circfirm-5.0.0}/.reuse/dep5 +0 -0
  60. {circfirm-4.0.1 → circfirm-5.0.0}/LICENSE +0 -0
  61. {circfirm-4.0.1 → circfirm-5.0.0}/LICENSES/MIT.txt +0 -0
  62. {circfirm-4.0.1 → circfirm-5.0.0}/LICENSES/Unlicense.txt +0 -0
  63. {circfirm-4.0.1 → circfirm-5.0.0}/NOTICE +0 -0
  64. {circfirm-4.0.1 → circfirm-5.0.0}/NOTICE.license +0 -0
  65. {circfirm-4.0.1 → circfirm-5.0.0}/README.rst +0 -0
  66. {circfirm-4.0.1 → circfirm-5.0.0}/VERSION.license +0 -0
  67. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/py.typed +0 -0
  68. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/templates/settings.yaml +0 -0
  69. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm/templates/settings.yaml.license +0 -0
  70. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm.egg-info/dependency_links.txt +0 -0
  71. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm.egg-info/entry_points.txt +0 -0
  72. {circfirm-4.0.1 → circfirm-5.0.0}/circfirm.egg-info/top_level.txt +0 -0
  73. {circfirm-4.0.1 → circfirm-5.0.0}/docs/commands/cache.rst +0 -0
  74. {circfirm-4.0.1 → circfirm-5.0.0}/docs/commands/config.rst +0 -0
  75. {circfirm-4.0.1 → circfirm-5.0.0}/docs/commands/current.rst +0 -0
  76. {circfirm-4.0.1 → circfirm-5.0.0}/docs/commands/detect.rst +0 -0
  77. {circfirm-4.0.1 → circfirm-5.0.0}/docs/commands/install.rst +0 -0
  78. {circfirm-4.0.1 → circfirm-5.0.0}/docs/commands/query.rst +0 -0
  79. {circfirm-4.0.1 → circfirm-5.0.0}/docs/commands/update.rst +0 -0
  80. {circfirm-4.0.1 → circfirm-5.0.0}/docs/examples/update_many.rst +0 -0
  81. {circfirm-4.0.1 → circfirm-5.0.0}/docs/examples/weekly_cache.rst +0 -0
  82. {circfirm-4.0.1 → circfirm-5.0.0}/docs/index.rst +0 -0
  83. {circfirm-4.0.1 → circfirm-5.0.0}/docs/index.rst.license +0 -0
  84. {circfirm-4.0.1 → circfirm-5.0.0}/docs/infrastructure/ci.rst +0 -0
  85. {circfirm-4.0.1 → circfirm-5.0.0}/docs/infrastructure/codecheck.rst +0 -0
  86. {circfirm-4.0.1 → circfirm-5.0.0}/docs/infrastructure/docs.rst +0 -0
  87. {circfirm-4.0.1 → circfirm-5.0.0}/docs/infrastructure/license.rst +0 -0
  88. {circfirm-4.0.1 → circfirm-5.0.0}/docs/infrastructure/notice.rst +0 -0
  89. {circfirm-4.0.1 → circfirm-5.0.0}/docs/infrastructure/tests.rst +0 -0
  90. {circfirm-4.0.1 → circfirm-5.0.0}/setup.cfg +0 -0
  91. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/boot_out.txt +0 -0
  92. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/feather_m0_express/adafruit-circuitpython-feather_m0_express-en_US-7.0.0.uf2 +0 -0
  93. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/feather_m0_express/adafruit-circuitpython-feather_m0_express-en_US-7.1.0.uf2 +0 -0
  94. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/feather_m0_express/adafruit-circuitpython-feather_m0_express-en_US-7.2.0.uf2 +0 -0
  95. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/feather_m0_express/adafruit-circuitpython-feather_m0_express-fr-7.0.0.uf2 +0 -0
  96. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/feather_m0_express/adafruit-circuitpython-feather_m0_express-fr-7.1.0.uf2 +0 -0
  97. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/feather_m0_express/adafruit-circuitpython-feather_m0_express-fr-7.2.0.uf2 +0 -0
  98. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/feather_m0_express/adafruit-circuitpython-feather_m0_express-zh_Latn_pinyin-7.0.0.uf2 +0 -0
  99. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/feather_m0_express/adafruit-circuitpython-feather_m0_express-zh_Latn_pinyin-7.1.0.uf2 +0 -0
  100. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/feather_m0_express/adafruit-circuitpython-feather_m0_express-zh_Latn_pinyin-7.2.0.uf2 +0 -0
  101. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/feather_m4_express/adafruit-circuitpython-feather_m4_express-en_US-7.0.0.uf2 +0 -0
  102. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/feather_m4_express/adafruit-circuitpython-feather_m4_express-en_US-7.1.0.uf2 +0 -0
  103. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/feather_m4_express/adafruit-circuitpython-feather_m4_express-en_US-7.2.0.uf2 +0 -0
  104. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/feather_m4_express/adafruit-circuitpython-feather_m4_express-fr-7.0.0.uf2 +0 -0
  105. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/feather_m4_express/adafruit-circuitpython-feather_m4_express-fr-7.1.0.uf2 +0 -0
  106. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/feather_m4_express/adafruit-circuitpython-feather_m4_express-fr-7.2.0.uf2 +0 -0
  107. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/feather_m4_express/adafruit-circuitpython-feather_m4_express-zh_Latn_pinyin-7.0.0.uf2 +0 -0
  108. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/feather_m4_express/adafruit-circuitpython-feather_m4_express-zh_Latn_pinyin-7.1.0.uf2 +0 -0
  109. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/feather_m4_express/adafruit-circuitpython-feather_m4_express-zh_Latn_pinyin-7.2.0.uf2 +0 -0
  110. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/pygamer/adafruit-circuitpython-pygamer-en_US-7.0.0.uf2 +0 -0
  111. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/pygamer/adafruit-circuitpython-pygamer-en_US-7.1.0.uf2 +0 -0
  112. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/pygamer/adafruit-circuitpython-pygamer-en_US-7.2.0.uf2 +0 -0
  113. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/pygamer/adafruit-circuitpython-pygamer-fr-7.0.0.uf2 +0 -0
  114. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/pygamer/adafruit-circuitpython-pygamer-fr-7.1.0.uf2 +0 -0
  115. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/pygamer/adafruit-circuitpython-pygamer-fr-7.2.0.uf2 +0 -0
  116. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/pygamer/adafruit-circuitpython-pygamer-zh_Latn_pinyin-7.0.0.uf2 +0 -0
  117. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/pygamer/adafruit-circuitpython-pygamer-zh_Latn_pinyin-7.1.0.uf2 +0 -0
  118. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/firmwares/pygamer/adafruit-circuitpython-pygamer-zh_Latn_pinyin-7.2.0.uf2 +0 -0
  119. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/info_uf2.txt +0 -0
  120. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/responses/full_list.txt +0 -0
  121. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/responses/full_list.txt.license +0 -0
  122. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/responses/specific_board.txt +0 -0
  123. {circfirm-4.0.1 → circfirm-5.0.0}/tests/assets/responses/specific_board.txt.license +0 -0
@@ -0,0 +1,11 @@
1
+ # SPDX-FileCopyrightText: 2026 Alec Delaney
2
+ # SPDX-License-Identifier: MIT
3
+
4
+ version: 2
5
+ updates:
6
+ - package-ecosystem: "uv"
7
+ directory: "/"
8
+ schedule:
9
+ interval: "daily"
10
+ reviewers: ["tekktrik"]
11
+ versioning-strategy: increase-if-necessary
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  name: "CodeQL Analysis"
@@ -22,12 +21,12 @@ jobs:
22
21
  security-events: write
23
22
  steps:
24
23
  - name: Checkout repository
25
- uses: actions/checkout@v4
24
+ uses: actions/checkout@v6
26
25
  - name: Initialize CodeQL
27
- uses: github/codeql-action/init@v3
26
+ uses: github/codeql-action/init@v4
28
27
  with:
29
28
  languages: python
30
29
  - name: Perform CodeQL Analysis
31
- uses: github/codeql-action/analyze@v3
30
+ uses: github/codeql-action/analyze@v4
32
31
  with:
33
32
  category: /language:python
@@ -14,13 +14,13 @@ jobs:
14
14
  id-token: write
15
15
  steps:
16
16
  - name: Checkout the repository
17
- uses: actions/checkout@v4
17
+ uses: actions/checkout@v6
18
18
  with:
19
19
  submodules: true
20
- - name: Install Python 3.12
21
- uses: actions/setup-python@v5
20
+ - name: Install Python
21
+ uses: actions/setup-python@v6
22
22
  with:
23
- python-version: "3.12"
23
+ python-version: "3.X"
24
24
  - name: Install dependencies
25
25
  run: |
26
26
  python -m pip install -U pip
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  name: Build CI
@@ -16,11 +15,11 @@ jobs:
16
15
  fail-fast: false
17
16
  matrix:
18
17
  py-version: [
19
- "3.9",
20
18
  "3.10",
21
19
  "3.11",
22
20
  "3.12",
23
21
  "3.13",
22
+ "3.14",
24
23
  ]
25
24
  os: [
26
25
  "ubuntu-latest",
@@ -28,34 +27,33 @@ jobs:
28
27
  "macos-latest",
29
28
  ]
30
29
  exclude:
31
- - os: windows-latest
32
- py-version: "3.10"
33
30
  - os: windows-latest
34
31
  py-version: "3.11"
35
32
  - os: windows-latest
36
33
  py-version: "3.12"
37
34
  - os: windows-latest
38
35
  py-version: "3.13"
39
- - os: macos-latest
40
- py-version: "3.10"
36
+ - os: windows-latest
37
+ py-version: "3.14"
41
38
  - os: macos-latest
42
39
  py-version: "3.11"
43
40
  - os: macos-latest
44
41
  py-version: "3.12"
45
42
  - os: macos-latest
46
43
  py-version: "3.13"
44
+ - os: macos-latest
45
+ py-version: "3.14"
47
46
 
48
47
  steps:
49
48
  - name: Setup Python 3.x
50
- uses: actions/setup-python@v5
49
+ uses: actions/setup-python@v6
51
50
  with:
52
51
  python-version: ${{ matrix.py-version }}
53
52
  - name: Checkout the repository
54
- uses: actions/checkout@v4
53
+ uses: actions/checkout@v6
55
54
  - name: Install requirements
56
55
  run: |
57
- pip install -r requirements.txt
58
- pip install -r requirements-dev.txt
56
+ pip install ".[dev]"
59
57
  - name: Run pre-commit via make
60
58
  run: |
61
59
  make check
@@ -80,9 +78,9 @@ jobs:
80
78
  run: |
81
79
  coverage xml -o coverage_${{ matrix.os }}_${{ matrix.py-version }}.xml
82
80
  - name: Upload coverage report to Codecov
83
- uses: codecov/codecov-action@v4.0.1
81
+ uses: codecov/codecov-action@v5
84
82
  with:
85
83
  token: ${{ secrets.CODECOV_TOKEN }}
86
84
  fail_ci_if_error: true
87
- file: coverage_${{ matrix.os }}_${{ matrix.py-version }}.xml
85
+ files: coverage_${{ matrix.os }}_${{ matrix.py-version }}.xml
88
86
  flags: "${{ matrix.os }}-py-${{ matrix.py-version }}"
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2022 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  # Byte-compiled / optimized / DLL files
@@ -1,20 +1,19 @@
1
1
  # SPDX-FileCopyrightText: 2022 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  repos:
6
5
  - repo: https://github.com/Yelp/detect-secrets
7
- rev: v1.4.0
6
+ rev: v1.5.0
8
7
  hooks:
9
8
  - id: detect-secrets
10
9
  name: Detect secrets
11
10
  - repo: https://github.com/fsfe/reuse-tool
12
- rev: v3.0.1
11
+ rev: v6.2.0
13
12
  hooks:
14
13
  - id: reuse
15
14
  name: Check REUSE compatibility
16
15
  - repo: https://github.com/pre-commit/pre-commit-hooks
17
- rev: v5.0.0
16
+ rev: v6.0.0
18
17
  hooks:
19
18
  - id: check-yaml
20
19
  name: Check YAML
@@ -29,7 +28,7 @@ repos:
29
28
  - id: trailing-whitespace
30
29
  name: Trim trailing whitespace
31
30
  - repo: https://github.com/astral-sh/ruff-pre-commit
32
- rev: v0.2.2
31
+ rev: v0.15.0
33
32
  hooks:
34
33
  - id: ruff-format
35
34
  name: Format via ruff
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2022 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  version: 2
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024 Alec Delaney
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  .PHONY: lint
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: circfirm
3
- Version: 4.0.1
3
+ Version: 5.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.9
19
18
  Classifier: Programming Language :: Python :: 3.10
20
19
  Classifier: Programming Language :: Python :: 3.11
21
20
  Classifier: Programming Language :: Python :: 3.12
22
21
  Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Programming Language :: Python :: 3.14
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.9.0
28
+ Requires-Python: >=3.10.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.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
33
+ Requires-Dist: boto3==1.42.42
34
+ Requires-Dist: boto3-stubs[essential]==1.42.42
35
+ Requires-Dist: click==8.3.1
36
+ Requires-Dist: click-spinner==0.1.10
37
+ Requires-Dist: packaging==24.2
38
+ Requires-Dist: psutil==6.1.1
39
+ Requires-Dist: pyyaml==6.0.3
40
+ Requires-Dist: requests==2.32.5
41
41
  Provides-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"
42
+ Requires-Dist: build==1.4.0; extra == "dev"
43
+ Requires-Dist: coverage==7.13.3; extra == "dev"
44
+ Requires-Dist: pre-commit==4.5.1; extra == "dev"
45
+ Requires-Dist: pytest==8.4.2; extra == "dev"
46
+ Requires-Dist: sphinx==7.4.7; extra == "dev"
47
+ Requires-Dist: sphinx-tabs==3.4.7; extra == "dev"
48
+ Requires-Dist: sphinx-rtd-theme==3.1.0; extra == "dev"
49
49
  Dynamic: license-file
50
50
 
51
51
  ..
circfirm-5.0.0/VERSION ADDED
@@ -0,0 +1 @@
1
+ 5.0.0
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2022 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  """Shared functionality for the tool.
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2022 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  """Shared backend functionality.
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  """Backend functionality for the working with the cache.
@@ -9,7 +8,6 @@ Author(s): Alec Delaney
9
8
 
10
9
  import os
11
10
  import pathlib
12
- from typing import Optional
13
11
 
14
12
  import packaging.version
15
13
  import requests
@@ -55,7 +53,7 @@ def download_uf2(board_id: str, version: str, language: str = "en_US") -> None:
55
53
  uf2file.write(response.content)
56
54
 
57
55
 
58
- def get_sorted_boards(board_id: Optional[str]) -> dict[str, dict[str, set[str]]]:
56
+ def get_sorted_boards(board_id: str | None) -> dict[str, dict[str, set[str]]]:
59
57
  """Get a sorted collection of boards, versions, and languages."""
60
58
  boards: dict[str, dict[str, set[str]]] = {}
61
59
  for board_folder in sorted(os.listdir(circfirm.UF2_ARCHIVE)):
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  """Backend functionality for the working with the connected devices.
@@ -9,7 +8,6 @@ Author(s): Alec Delaney
9
8
 
10
9
  import pathlib
11
10
  import re
12
- from typing import Optional
13
11
 
14
12
  import psutil
15
13
 
@@ -35,7 +33,7 @@ def get_board_info(device_path: str) -> tuple[str, str]:
35
33
  return board_match[1], version_match[1]
36
34
 
37
35
 
38
- def _find_device(filename: str) -> Optional[str]:
36
+ def _find_device(filename: str) -> str | None:
39
37
  """Find a specific connected device."""
40
38
  for partition in psutil.disk_partitions():
41
39
  try:
@@ -47,11 +45,11 @@ def _find_device(filename: str) -> Optional[str]:
47
45
  return None
48
46
 
49
47
 
50
- def find_circuitpy() -> Optional[str]:
48
+ def find_circuitpy() -> str | None:
51
49
  """Find CircuitPython device in non-bootloader mode."""
52
50
  return _find_device(circfirm.BOOTOUT_FILE)
53
51
 
54
52
 
55
- def find_bootloader() -> Optional[str]:
53
+ def find_bootloader() -> str | None:
56
54
  """Find CircuitPython device in bootloader mode."""
57
55
  return _find_device(circfirm.UF2INFO_FILE)
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  """Backend functionality for the working with CircuitPython GitHub repository.
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  """Backend functionality for the working with the CircuitPython firmware S3 bucket.
@@ -8,7 +7,6 @@ Author(s): Alec Delaney
8
7
  """
9
8
 
10
9
  import re
11
- from typing import Optional
12
10
 
13
11
  import boto3
14
12
  import botocore
@@ -25,7 +23,7 @@ BUCKET = S3_RESOURCE.Bucket(BUCKET_NAME)
25
23
 
26
24
 
27
25
  def get_board_versions(
28
- board_id: str, language: str = "en_US", *, regex: Optional[str] = None
26
+ board_id: str, language: str = "en_US", *, regex: str | None = None
29
27
  ) -> list[str]:
30
28
  """Get a list of CircuitPython versions for a given board."""
31
29
  prefix = f"bin/{board_id}/{language}"
@@ -50,7 +48,7 @@ def get_board_versions(
50
48
 
51
49
  def get_latest_board_version(
52
50
  board_id: str, language: str, pre_release: bool
53
- ) -> Optional[str]:
51
+ ) -> str | None:
54
52
  """Get the latest version for a board in a given language."""
55
53
  versions = get_board_versions(board_id, language)
56
54
  if not pre_release:
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2022 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  """Main CLI functionality for the tool.
@@ -13,8 +12,8 @@ import pkgutil
13
12
  import shutil
14
13
  import sys
15
14
  import time
16
- from collections.abc import Iterable
17
- from typing import Any, Callable, Optional, TypeVar
15
+ from collections.abc import Callable, Iterable
16
+ from typing import Any, TypeVar
18
17
 
19
18
  import click
20
19
  import click_spinner
@@ -44,9 +43,9 @@ def maybe_support(msg: str) -> None:
44
43
 
45
44
 
46
45
  def get_board_id(
47
- circuitpy: Optional[str],
48
- bootloader: Optional[str],
49
- board: Optional[str],
46
+ circuitpy: str | None,
47
+ bootloader: str | None,
48
+ board: str | None,
50
49
  timeout: int = -1,
51
50
  ) -> tuple[str, str]:
52
51
  """Get the board ID of a device via CLI."""
@@ -75,7 +74,7 @@ def get_board_id(
75
74
  return bootloader, board
76
75
 
77
76
 
78
- def get_connection_status() -> tuple[Optional[str], Optional[str]]:
77
+ def get_connection_status() -> tuple[str | None, str | None]:
79
78
  """Get the status of a connectted CircuitPython device as a CIRCUITPY and bootloader location."""
80
79
  circuitpy = circfirm.backend.device.find_circuitpy()
81
80
  bootloader = circfirm.backend.device.find_bootloader()
@@ -86,7 +85,7 @@ def get_connection_status() -> tuple[Optional[str], Optional[str]]:
86
85
  return circuitpy, bootloader
87
86
 
88
87
 
89
- def ensure_bootloader_mode(bootloader: Optional[str]) -> None:
88
+ def ensure_bootloader_mode(bootloader: str | None) -> None:
90
89
  """Ensure the connected device is in bootloader mode."""
91
90
  if not bootloader:
92
91
  if circfirm.backend.device.find_circuitpy():
@@ -130,7 +129,7 @@ def announce_and_await(
130
129
  msg: str,
131
130
  func: Callable[..., _T],
132
131
  args: Iterable = (),
133
- kwargs: Optional[dict[str, Any]] = None,
132
+ kwargs: dict[str, Any] | None = None,
134
133
  *,
135
134
  use_spinner: bool = True,
136
135
  ) -> _T:
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  """CLI functionality for the about subcommand.
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  """CLI functionality for the cache subcommand.
@@ -11,7 +10,6 @@ import os
11
10
  import pathlib
12
11
  import re
13
12
  import shutil
14
- from typing import Optional
15
13
 
16
14
  import botocore.exceptions
17
15
  import click
@@ -40,9 +38,9 @@ def cli():
40
38
  help="The board ID, version, and language options represent regex patterns",
41
39
  )
42
40
  def clear( # noqa: PLR0913
43
- board_id: Optional[str],
44
- version: Optional[str],
45
- language: Optional[str],
41
+ board_id: str | None,
42
+ version: str | None,
43
+ language: str | None,
46
44
  regex: bool,
47
45
  ) -> None:
48
46
  """Clear the cache, either entirely or for a specific board/version."""
@@ -91,7 +89,7 @@ def clear( # noqa: PLR0913
91
89
 
92
90
  @cli.command(name="list")
93
91
  @click.option("-b", "--board-id", default=None, help="CircuitPython board ID")
94
- def cache_list(board_id: Optional[str]) -> None:
92
+ def cache_list(board_id: str | None) -> None:
95
93
  """List all the boards/versions cached."""
96
94
  board_list = os.listdir(circfirm.UF2_ARCHIVE)
97
95
 
@@ -1,6 +1,5 @@
1
1
  # SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
2
  # Based on code from circlink (Authored by Alec Delaney, licensed under MIT license)
3
- #
4
3
  # SPDX-License-Identifier: MIT
5
4
 
6
5
  """CLI functionality for the config subcommand.
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  """CLI functionality for the current subcommand.
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  """CLI functionality for the detect subcommand.
@@ -7,7 +6,6 @@
7
6
  Author(s): Alec Delaney
8
7
  """
9
8
 
10
-
11
9
  import click
12
10
 
13
11
  import circfirm.backend.device
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  """CLI functionality for the install subcommand.
@@ -7,8 +6,6 @@
7
6
  Author(s): Alec Delaney
8
7
  """
9
8
 
10
- from typing import Optional
11
-
12
9
  import click
13
10
 
14
11
  import circfirm.cli
@@ -29,7 +26,7 @@ import circfirm.cli
29
26
  default=-1,
30
27
  help="Set a timeout in seconds for the switch to bootloader mode",
31
28
  )
32
- def cli(version: str, language: str, board_id: Optional[str], timeout: int) -> None:
29
+ def cli(version: str, language: str, board_id: str | None, timeout: int) -> None:
33
30
  """Install the specified version of CircuitPython."""
34
31
  circuitpy, bootloader = circfirm.cli.get_connection_status()
35
32
  try:
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  """CLI functionality for the query subcommand.
@@ -51,7 +50,7 @@ def query_board_ids(regex: str) -> None:
51
50
  boards = circfirm.backend.github.get_board_id_list(gh_token)
52
51
  except ValueError as err:
53
52
  raise click.ClickException(err.args[0])
54
- except requests.ConnectionError as err:
53
+ except requests.ConnectionError:
55
54
  print("Triggered!")
56
55
  raise click.ClickException(
57
56
  "Issue with requesting information from git repository, check network connection"
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  """CLI functionality for the update subcommand.
@@ -7,8 +6,6 @@
7
6
  Author(s): Alec Delaney
8
7
  """
9
8
 
10
- from typing import Optional
11
-
12
9
  import botocore.exceptions
13
10
  import click
14
11
  import packaging.version
@@ -53,7 +50,7 @@ import circfirm.backend.s3
53
50
  help="Upgrade up to patch version updates",
54
51
  )
55
52
  def cli( # noqa: PLR0913
56
- board_id: Optional[str],
53
+ board_id: str | None,
57
54
  language: str,
58
55
  timeout: int,
59
56
  pre_release: bool,
@@ -1,5 +1,4 @@
1
1
  # SPDX-FileCopyrightText: 2022 Alec Delaney, for Adafruit Industries
2
- #
3
2
  # SPDX-License-Identifier: MIT
4
3
 
5
4
  """Basic startup functionality for the tools.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: circfirm
3
- Version: 4.0.1
3
+ Version: 5.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.9
19
18
  Classifier: Programming Language :: Python :: 3.10
20
19
  Classifier: Programming Language :: Python :: 3.11
21
20
  Classifier: Programming Language :: Python :: 3.12
22
21
  Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Programming Language :: Python :: 3.14
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.9.0
28
+ Requires-Python: >=3.10.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.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
33
+ Requires-Dist: boto3==1.42.42
34
+ Requires-Dist: boto3-stubs[essential]==1.42.42
35
+ Requires-Dist: click==8.3.1
36
+ Requires-Dist: click-spinner==0.1.10
37
+ Requires-Dist: packaging==24.2
38
+ Requires-Dist: psutil==6.1.1
39
+ Requires-Dist: pyyaml==6.0.3
40
+ Requires-Dist: requests==2.32.5
41
41
  Provides-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"
42
+ Requires-Dist: build==1.4.0; extra == "dev"
43
+ Requires-Dist: coverage==7.13.3; extra == "dev"
44
+ Requires-Dist: pre-commit==4.5.1; extra == "dev"
45
+ Requires-Dist: pytest==8.4.2; extra == "dev"
46
+ Requires-Dist: sphinx==7.4.7; extra == "dev"
47
+ Requires-Dist: sphinx-tabs==3.4.7; extra == "dev"
48
+ Requires-Dist: sphinx-rtd-theme==3.1.0; extra == "dev"
49
49
  Dynamic: license-file
50
50
 
51
51
  ..
@@ -9,8 +9,9 @@ README.rst
9
9
  VERSION
10
10
  VERSION.license
11
11
  pyproject.toml
12
- requirements-dev.txt
13
- requirements.txt
12
+ uv.lock
13
+ uv.lock.license
14
+ .github/dependabot.yml
14
15
  .github/workflows/codeql.yml
15
16
  .github/workflows/publish.yml
16
17
  .github/workflows/push.yml
@@ -0,0 +1,17 @@
1
+ boto3==1.42.42
2
+ boto3-stubs[essential]==1.42.42
3
+ click==8.3.1
4
+ click-spinner==0.1.10
5
+ packaging==24.2
6
+ psutil==6.1.1
7
+ pyyaml==6.0.3
8
+ requests==2.32.5
9
+
10
+ [dev]
11
+ build==1.4.0
12
+ coverage==7.13.3
13
+ pre-commit==4.5.1
14
+ pytest==8.4.2
15
+ sphinx==7.4.7
16
+ sphinx-tabs==3.4.7
17
+ sphinx-rtd-theme==3.1.0