circfirm 5.0.0__tar.gz → 5.1.1__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 (121) hide show
  1. {circfirm-5.0.0 → circfirm-5.1.1}/.readthedocs.yaml +6 -3
  2. {circfirm-5.0.0 → circfirm-5.1.1}/PKG-INFO +5 -5
  3. circfirm-5.1.1/VERSION +1 -0
  4. {circfirm-5.0.0 → circfirm-5.1.1}/VERSION.license +0 -1
  5. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/cli/__init__.py +4 -2
  6. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/py.typed +0 -1
  7. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/templates/settings.yaml.license +0 -1
  8. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm.egg-info/PKG-INFO +5 -5
  9. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm.egg-info/SOURCES.txt +1 -0
  10. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm.egg-info/requires.txt +4 -4
  11. {circfirm-5.0.0 → circfirm-5.1.1}/docs/index.rst.license +0 -1
  12. {circfirm-5.0.0 → circfirm-5.1.1}/pyproject.toml +4 -4
  13. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/responses/full_list.txt.license +0 -1
  14. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/responses/specific_board.txt.license +0 -1
  15. circfirm-5.1.1/tests/cli/test_cli.py +72 -0
  16. {circfirm-5.0.0 → circfirm-5.1.1}/tests/cli/test_cli_cache.py +1 -1
  17. {circfirm-5.0.0 → circfirm-5.1.1}/tests/cli/test_cli_query.py +3 -5
  18. {circfirm-5.0.0 → circfirm-5.1.1}/tests/cli/test_cli_update.py +1 -3
  19. {circfirm-5.0.0 → circfirm-5.1.1}/tests/conftest.py +5 -11
  20. {circfirm-5.0.0 → circfirm-5.1.1}/tests/helpers.py +3 -3
  21. {circfirm-5.0.0 → circfirm-5.1.1}/uv.lock +40 -27
  22. circfirm-5.0.0/VERSION +0 -1
  23. {circfirm-5.0.0 → circfirm-5.1.1}/.github/dependabot.yml +0 -0
  24. {circfirm-5.0.0 → circfirm-5.1.1}/.github/workflows/codeql.yml +0 -0
  25. {circfirm-5.0.0 → circfirm-5.1.1}/.github/workflows/publish.yml +0 -0
  26. {circfirm-5.0.0 → circfirm-5.1.1}/.github/workflows/push.yml +0 -0
  27. {circfirm-5.0.0 → circfirm-5.1.1}/.gitignore +0 -0
  28. {circfirm-5.0.0 → circfirm-5.1.1}/.pre-commit-config.yaml +0 -0
  29. {circfirm-5.0.0 → circfirm-5.1.1}/.reuse/dep5 +0 -0
  30. {circfirm-5.0.0 → circfirm-5.1.1}/LICENSE +0 -0
  31. {circfirm-5.0.0 → circfirm-5.1.1}/LICENSES/MIT.txt +0 -0
  32. {circfirm-5.0.0 → circfirm-5.1.1}/LICENSES/Unlicense.txt +0 -0
  33. {circfirm-5.0.0 → circfirm-5.1.1}/Makefile +0 -0
  34. {circfirm-5.0.0 → circfirm-5.1.1}/NOTICE +0 -0
  35. {circfirm-5.0.0 → circfirm-5.1.1}/NOTICE.license +0 -0
  36. {circfirm-5.0.0 → circfirm-5.1.1}/README.rst +0 -0
  37. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/__init__.py +0 -0
  38. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/backend/__init__.py +0 -0
  39. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/backend/cache.py +0 -0
  40. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/backend/device.py +0 -0
  41. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/backend/github.py +0 -0
  42. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/backend/s3.py +0 -0
  43. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/cli/about.py +0 -0
  44. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/cli/cache.py +0 -0
  45. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/cli/config.py +0 -0
  46. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/cli/current.py +0 -0
  47. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/cli/detect.py +0 -0
  48. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/cli/install.py +0 -0
  49. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/cli/query.py +0 -0
  50. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/cli/update.py +0 -0
  51. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/startup.py +0 -0
  52. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm/templates/settings.yaml +0 -0
  53. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm.egg-info/dependency_links.txt +0 -0
  54. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm.egg-info/entry_points.txt +0 -0
  55. {circfirm-5.0.0 → circfirm-5.1.1}/circfirm.egg-info/top_level.txt +0 -0
  56. {circfirm-5.0.0 → circfirm-5.1.1}/docs/commands/cache.rst +0 -0
  57. {circfirm-5.0.0 → circfirm-5.1.1}/docs/commands/config.rst +0 -0
  58. {circfirm-5.0.0 → circfirm-5.1.1}/docs/commands/current.rst +0 -0
  59. {circfirm-5.0.0 → circfirm-5.1.1}/docs/commands/detect.rst +0 -0
  60. {circfirm-5.0.0 → circfirm-5.1.1}/docs/commands/install.rst +0 -0
  61. {circfirm-5.0.0 → circfirm-5.1.1}/docs/commands/query.rst +0 -0
  62. {circfirm-5.0.0 → circfirm-5.1.1}/docs/commands/update.rst +0 -0
  63. {circfirm-5.0.0 → circfirm-5.1.1}/docs/conf.py +0 -0
  64. {circfirm-5.0.0 → circfirm-5.1.1}/docs/examples/update_many.rst +0 -0
  65. {circfirm-5.0.0 → circfirm-5.1.1}/docs/examples/weekly_cache.rst +0 -0
  66. {circfirm-5.0.0 → circfirm-5.1.1}/docs/index.rst +0 -0
  67. {circfirm-5.0.0 → circfirm-5.1.1}/docs/infrastructure/ci.rst +0 -0
  68. {circfirm-5.0.0 → circfirm-5.1.1}/docs/infrastructure/codecheck.rst +0 -0
  69. {circfirm-5.0.0 → circfirm-5.1.1}/docs/infrastructure/docs.rst +0 -0
  70. {circfirm-5.0.0 → circfirm-5.1.1}/docs/infrastructure/license.rst +0 -0
  71. {circfirm-5.0.0 → circfirm-5.1.1}/docs/infrastructure/notice.rst +0 -0
  72. {circfirm-5.0.0 → circfirm-5.1.1}/docs/infrastructure/tests.rst +0 -0
  73. {circfirm-5.0.0 → circfirm-5.1.1}/examples/bash/update_many.sh +0 -0
  74. {circfirm-5.0.0 → circfirm-5.1.1}/examples/bash/weekly_cache.sh +0 -0
  75. {circfirm-5.0.0 → circfirm-5.1.1}/examples/powershell/update_many.ps1 +0 -0
  76. {circfirm-5.0.0 → circfirm-5.1.1}/examples/powershell/weekly_cache.ps1 +0 -0
  77. {circfirm-5.0.0 → circfirm-5.1.1}/scripts/rmdir.py +0 -0
  78. {circfirm-5.0.0 → circfirm-5.1.1}/setup.cfg +0 -0
  79. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/boot_out.txt +0 -0
  80. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/feather_m0_express/adafruit-circuitpython-feather_m0_express-en_US-7.0.0.uf2 +0 -0
  81. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/feather_m0_express/adafruit-circuitpython-feather_m0_express-en_US-7.1.0.uf2 +0 -0
  82. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/feather_m0_express/adafruit-circuitpython-feather_m0_express-en_US-7.2.0.uf2 +0 -0
  83. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/feather_m0_express/adafruit-circuitpython-feather_m0_express-fr-7.0.0.uf2 +0 -0
  84. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/feather_m0_express/adafruit-circuitpython-feather_m0_express-fr-7.1.0.uf2 +0 -0
  85. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/feather_m0_express/adafruit-circuitpython-feather_m0_express-fr-7.2.0.uf2 +0 -0
  86. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/feather_m0_express/adafruit-circuitpython-feather_m0_express-zh_Latn_pinyin-7.0.0.uf2 +0 -0
  87. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/feather_m0_express/adafruit-circuitpython-feather_m0_express-zh_Latn_pinyin-7.1.0.uf2 +0 -0
  88. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/feather_m0_express/adafruit-circuitpython-feather_m0_express-zh_Latn_pinyin-7.2.0.uf2 +0 -0
  89. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/feather_m4_express/adafruit-circuitpython-feather_m4_express-en_US-7.0.0.uf2 +0 -0
  90. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/feather_m4_express/adafruit-circuitpython-feather_m4_express-en_US-7.1.0.uf2 +0 -0
  91. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/feather_m4_express/adafruit-circuitpython-feather_m4_express-en_US-7.2.0.uf2 +0 -0
  92. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/feather_m4_express/adafruit-circuitpython-feather_m4_express-fr-7.0.0.uf2 +0 -0
  93. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/feather_m4_express/adafruit-circuitpython-feather_m4_express-fr-7.1.0.uf2 +0 -0
  94. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/feather_m4_express/adafruit-circuitpython-feather_m4_express-fr-7.2.0.uf2 +0 -0
  95. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/feather_m4_express/adafruit-circuitpython-feather_m4_express-zh_Latn_pinyin-7.0.0.uf2 +0 -0
  96. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/feather_m4_express/adafruit-circuitpython-feather_m4_express-zh_Latn_pinyin-7.1.0.uf2 +0 -0
  97. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/feather_m4_express/adafruit-circuitpython-feather_m4_express-zh_Latn_pinyin-7.2.0.uf2 +0 -0
  98. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/pygamer/adafruit-circuitpython-pygamer-en_US-7.0.0.uf2 +0 -0
  99. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/pygamer/adafruit-circuitpython-pygamer-en_US-7.1.0.uf2 +0 -0
  100. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/pygamer/adafruit-circuitpython-pygamer-en_US-7.2.0.uf2 +0 -0
  101. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/pygamer/adafruit-circuitpython-pygamer-fr-7.0.0.uf2 +0 -0
  102. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/pygamer/adafruit-circuitpython-pygamer-fr-7.1.0.uf2 +0 -0
  103. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/pygamer/adafruit-circuitpython-pygamer-fr-7.2.0.uf2 +0 -0
  104. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/pygamer/adafruit-circuitpython-pygamer-zh_Latn_pinyin-7.0.0.uf2 +0 -0
  105. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/pygamer/adafruit-circuitpython-pygamer-zh_Latn_pinyin-7.1.0.uf2 +0 -0
  106. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/firmwares/pygamer/adafruit-circuitpython-pygamer-zh_Latn_pinyin-7.2.0.uf2 +0 -0
  107. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/info_uf2.txt +0 -0
  108. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/responses/full_list.txt +0 -0
  109. {circfirm-5.0.0 → circfirm-5.1.1}/tests/assets/responses/specific_board.txt +0 -0
  110. {circfirm-5.0.0 → circfirm-5.1.1}/tests/backend/test_backend.py +0 -0
  111. {circfirm-5.0.0 → circfirm-5.1.1}/tests/backend/test_backend_cache.py +0 -0
  112. {circfirm-5.0.0 → circfirm-5.1.1}/tests/backend/test_backend_device.py +0 -0
  113. {circfirm-5.0.0 → circfirm-5.1.1}/tests/backend/test_backend_github.py +0 -0
  114. {circfirm-5.0.0 → circfirm-5.1.1}/tests/backend/test_backend_s3.py +0 -0
  115. {circfirm-5.0.0 → circfirm-5.1.1}/tests/cli/test_cli_about.py +0 -0
  116. {circfirm-5.0.0 → circfirm-5.1.1}/tests/cli/test_cli_config.py +0 -0
  117. {circfirm-5.0.0 → circfirm-5.1.1}/tests/cli/test_cli_current.py +0 -0
  118. {circfirm-5.0.0 → circfirm-5.1.1}/tests/cli/test_cli_detect.py +0 -0
  119. {circfirm-5.0.0 → circfirm-5.1.1}/tests/cli/test_cli_install.py +0 -0
  120. {circfirm-5.0.0 → circfirm-5.1.1}/tests/test_startup.py +0 -0
  121. {circfirm-5.0.0 → circfirm-5.1.1}/uv.lock.license +0 -0
@@ -4,13 +4,16 @@
4
4
  version: 2
5
5
 
6
6
  build:
7
- os: ubuntu-22.04
7
+ os: ubuntu-24.04
8
8
  tools:
9
- python: "3.12"
9
+ python: "3.14"
10
10
 
11
11
  sphinx:
12
12
  configuration: docs/conf.py
13
13
 
14
14
  python:
15
15
  install:
16
- - requirements: requirements-dev.txt
16
+ - method: pip
17
+ path: .
18
+ extra_requirements:
19
+ - dev
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: circfirm
3
- Version: 5.0.0
3
+ Version: 5.1.1
4
4
  Summary: CLI tool for install firmware for CircuitPython boards
5
5
  Author-email: Alec Delaney <tekktrik@gmail.com>
6
6
  License: MIT
@@ -34,16 +34,16 @@ Requires-Dist: boto3==1.42.42
34
34
  Requires-Dist: boto3-stubs[essential]==1.42.42
35
35
  Requires-Dist: click==8.3.1
36
36
  Requires-Dist: click-spinner==0.1.10
37
- Requires-Dist: packaging==24.2
38
- Requires-Dist: psutil==6.1.1
37
+ Requires-Dist: packaging==26.0
38
+ Requires-Dist: psutil==7.2.2
39
39
  Requires-Dist: pyyaml==6.0.3
40
40
  Requires-Dist: requests==2.32.5
41
41
  Provides-Extra: dev
42
42
  Requires-Dist: build==1.4.0; extra == "dev"
43
43
  Requires-Dist: coverage==7.13.3; extra == "dev"
44
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"
45
+ Requires-Dist: pytest==9.0.2; extra == "dev"
46
+ Requires-Dist: sphinx==8.1.3; extra == "dev"
47
47
  Requires-Dist: sphinx-tabs==3.4.7; extra == "dev"
48
48
  Requires-Dist: sphinx-rtd-theme==3.1.0; extra == "dev"
49
49
  Dynamic: license-file
circfirm-5.1.1/VERSION ADDED
@@ -0,0 +1 @@
1
+ 5.1.1
@@ -1,3 +1,2 @@
1
1
  SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
-
3
2
  SPDX-License-Identifier: MIT
@@ -17,6 +17,7 @@ from typing import Any, TypeVar
17
17
 
18
18
  import click
19
19
  import click_spinner
20
+ import requests
20
21
  import yaml
21
22
 
22
23
  import circfirm
@@ -103,9 +104,10 @@ def download_if_needed(board: str, version: str, language: str) -> None:
103
104
  circfirm.backend.cache.download_uf2,
104
105
  args=(board, version, language),
105
106
  )
106
- except ConnectionError as err:
107
+ except (ConnectionError, requests.exceptions.ConnectionError) as err:
107
108
  click.echo(" failed") # Mark as failed
108
- click.echo(f"Error: {err.args[0]}")
109
+ if isinstance(err, ConnectionError):
110
+ click.echo(f"Error: {err.args[0]}")
109
111
  sys.exit(4)
110
112
  else:
111
113
  click.echo("Using cached firmware file")
@@ -1,3 +1,2 @@
1
1
  SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
-
3
2
  SPDX-License-Identifier: MIT
@@ -1,3 +1,2 @@
1
1
  SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
-
3
2
  SPDX-License-Identifier: MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: circfirm
3
- Version: 5.0.0
3
+ Version: 5.1.1
4
4
  Summary: CLI tool for install firmware for CircuitPython boards
5
5
  Author-email: Alec Delaney <tekktrik@gmail.com>
6
6
  License: MIT
@@ -34,16 +34,16 @@ Requires-Dist: boto3==1.42.42
34
34
  Requires-Dist: boto3-stubs[essential]==1.42.42
35
35
  Requires-Dist: click==8.3.1
36
36
  Requires-Dist: click-spinner==0.1.10
37
- Requires-Dist: packaging==24.2
38
- Requires-Dist: psutil==6.1.1
37
+ Requires-Dist: packaging==26.0
38
+ Requires-Dist: psutil==7.2.2
39
39
  Requires-Dist: pyyaml==6.0.3
40
40
  Requires-Dist: requests==2.32.5
41
41
  Provides-Extra: dev
42
42
  Requires-Dist: build==1.4.0; extra == "dev"
43
43
  Requires-Dist: coverage==7.13.3; extra == "dev"
44
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"
45
+ Requires-Dist: pytest==9.0.2; extra == "dev"
46
+ Requires-Dist: sphinx==8.1.3; extra == "dev"
47
47
  Requires-Dist: sphinx-tabs==3.4.7; extra == "dev"
48
48
  Requires-Dist: sphinx-rtd-theme==3.1.0; extra == "dev"
49
49
  Dynamic: license-file
@@ -107,6 +107,7 @@ tests/backend/test_backend_cache.py
107
107
  tests/backend/test_backend_device.py
108
108
  tests/backend/test_backend_github.py
109
109
  tests/backend/test_backend_s3.py
110
+ tests/cli/test_cli.py
110
111
  tests/cli/test_cli_about.py
111
112
  tests/cli/test_cli_cache.py
112
113
  tests/cli/test_cli_config.py
@@ -2,8 +2,8 @@ boto3==1.42.42
2
2
  boto3-stubs[essential]==1.42.42
3
3
  click==8.3.1
4
4
  click-spinner==0.1.10
5
- packaging==24.2
6
- psutil==6.1.1
5
+ packaging==26.0
6
+ psutil==7.2.2
7
7
  pyyaml==6.0.3
8
8
  requests==2.32.5
9
9
 
@@ -11,7 +11,7 @@ requests==2.32.5
11
11
  build==1.4.0
12
12
  coverage==7.13.3
13
13
  pre-commit==4.5.1
14
- pytest==8.4.2
15
- sphinx==7.4.7
14
+ pytest==9.0.2
15
+ sphinx==8.1.3
16
16
  sphinx-tabs==3.4.7
17
17
  sphinx-rtd-theme==3.1.0
@@ -1,3 +1,2 @@
1
1
  SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
-
3
2
  SPDX-License-Identifier: MIT
@@ -50,8 +50,8 @@ dependencies = [
50
50
  "boto3-stubs[essential]==1.42.42",
51
51
  "click==8.3.1",
52
52
  "click-spinner==0.1.10",
53
- "packaging==24.2",
54
- "psutil==6.1.1",
53
+ "packaging==26.0",
54
+ "psutil==7.2.2",
55
55
  "pyyaml==6.0.3",
56
56
  "requests==2.32.5",
57
57
  ]
@@ -62,8 +62,8 @@ dev = [
62
62
  "build==1.4.0",
63
63
  "coverage==7.13.3",
64
64
  "pre-commit==4.5.1",
65
- "pytest==8.4.2",
66
- "sphinx==7.4.7",
65
+ "pytest==9.0.2",
66
+ "sphinx==8.1.3",
67
67
  "sphinx-tabs==3.4.7",
68
68
  "sphinx-rtd-theme==3.1.0",
69
69
  ]
@@ -1,3 +1,2 @@
1
1
  SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
-
3
2
  SPDX-License-Identifier: MIT
@@ -1,3 +1,2 @@
1
1
  SPDX-FileCopyrightText: 2024 Alec Delaney, for Adafruit Industries
2
-
3
2
  SPDX-License-Identifier: MIT
@@ -0,0 +1,72 @@
1
+ # SPDX-FileCopyrightText: 2026 Alec Delaney
2
+ # SPDX-License-Identifier: MIT
3
+
4
+ """Tests the core CLI functionality.
5
+
6
+ Author(s): Alec Delaney
7
+ """
8
+
9
+ import shutil
10
+ from typing import NoReturn
11
+
12
+ import pytest
13
+
14
+ import circfirm.backend.cache
15
+ import circfirm.cli
16
+
17
+ BOARD = "feather_m0_express"
18
+ LANGUAGE = "cs"
19
+ VERSION = "6.1.0"
20
+
21
+
22
+ @pytest.mark.parametrize(
23
+ "cached",
24
+ (
25
+ (True,),
26
+ (False,),
27
+ ),
28
+ )
29
+ def test_download_if_needed_cached(
30
+ monkeypatch: pytest.MonkeyPatch,
31
+ cached: bool,
32
+ ) -> None:
33
+ """Tests the install command when there is a cached firmware and has internet."""
34
+ monkeypatch.setattr(
35
+ circfirm.backend.cache, "is_downloaded", lambda _x, _y, _z: cached
36
+ )
37
+ try:
38
+ circfirm.cli.download_if_needed(BOARD, VERSION, LANGUAGE)
39
+ finally:
40
+ board_folder = circfirm.backend.cache.get_board_folder(BOARD)
41
+ if board_folder.exists(): # pragma: no cover
42
+ shutil.rmtree(board_folder)
43
+
44
+
45
+ @pytest.mark.parametrize(
46
+ "cached,succeeds",
47
+ (
48
+ (True, True),
49
+ (False, False),
50
+ ),
51
+ )
52
+ def test_download_if_needed_cached_no_internet(
53
+ monkeypatch: pytest.MonkeyPatch,
54
+ mock_no_internet: NoReturn,
55
+ cached: bool,
56
+ succeeds: bool,
57
+ ) -> None:
58
+ """Tests the install command when there is a cached firmware but no internet."""
59
+ monkeypatch.setattr(
60
+ circfirm.backend.cache, "is_downloaded", lambda _x, _y, _z: cached
61
+ )
62
+
63
+ try:
64
+ if succeeds:
65
+ circfirm.cli.download_if_needed(BOARD, VERSION, LANGUAGE)
66
+ else:
67
+ with pytest.raises(SystemExit):
68
+ circfirm.cli.download_if_needed(BOARD, VERSION, LANGUAGE)
69
+ finally:
70
+ board_folder = circfirm.backend.cache.get_board_folder(BOARD)
71
+ if board_folder.exists(): # pragma: no cover
72
+ shutil.rmtree(board_folder)
@@ -273,7 +273,7 @@ def test_cache_latest() -> None:
273
273
  shutil.rmtree(board_folder)
274
274
 
275
275
 
276
- def test_cache_latest_no_internet(mock_s3_no_internet: NoReturn) -> None:
276
+ def test_cache_latest_no_internet(mock_no_internet: NoReturn) -> None:
277
277
  """Test the update command when in CIRCUITPY mode when there is no internet connection."""
278
278
  board = "feather_m0_express"
279
279
  language = "cs"
@@ -69,9 +69,7 @@ def test_query_board_ids_bad_token(token: None) -> None:
69
69
  assert result.exit_code != 0
70
70
 
71
71
 
72
- def test_query_board_ids_no_internet(
73
- token: None, mock_requests_no_internet: NoReturn
74
- ) -> None:
72
+ def test_query_board_ids_no_internet(token: None, mock_no_internet: NoReturn) -> None:
75
73
  """Tests failure when cannot fetch results due to no network connection."""
76
74
  result = RUNNER.invoke(cli, ["query", "board-ids"])
77
75
  assert result.exit_code != 0
@@ -124,7 +122,7 @@ def test_query_versions() -> None:
124
122
  assert result.output == "6.2.0-beta.1\n"
125
123
 
126
124
 
127
- def test_query_versions_no_internet(mock_s3_no_internet: NoReturn) -> None:
125
+ def test_query_versions_no_internet(mock_no_internet: NoReturn) -> None:
128
126
  """Tests the ability to query firmware versions using the CLI."""
129
127
  board = "adafruit_feather_rp2040"
130
128
  language = "cs"
@@ -180,7 +178,7 @@ def test_query_latest() -> None:
180
178
  assert result.output == expected_output
181
179
 
182
180
 
183
- def test_query_latest_no_internet(mock_s3_no_internet: NoReturn) -> None:
181
+ def test_query_latest_no_internet(mock_no_internet: NoReturn) -> None:
184
182
  """Tests the ability to query the latest version of the firmware using the CLI."""
185
183
  board = "adafruit_feather_rp2040"
186
184
  language = "cs"
@@ -46,9 +46,7 @@ def test_update(mock_with_circuitpy: None) -> None:
46
46
  shutil.rmtree(board_folder)
47
47
 
48
48
 
49
- def test_update_no_internet(
50
- mock_s3_no_internet: None, mock_with_circuitpy: None
51
- ) -> None:
49
+ def test_update_no_internet(mock_no_internet: None, mock_with_circuitpy: None) -> None:
52
50
  """Test the update command when in CIRCUITPY mode."""
53
51
  try:
54
52
  tests.helpers.set_firmware_version(ORIGINAL_VERSION)
@@ -120,25 +120,19 @@ def mock_with_firmwares_archived() -> Iterator[None]:
120
120
 
121
121
 
122
122
  @pytest.fixture
123
- def mock_requests_no_internet(monkeypatch: pytest.MonkeyPatch) -> NoReturn:
123
+ def mock_no_internet(monkeypatch: pytest.MonkeyPatch) -> NoReturn:
124
124
  """Simulate a network error by raising requests.ConnectionError."""
125
125
 
126
- def mock_get(*args, **kwargs) -> NoReturn:
126
+ def mock_requests_get(*args, **kwargs) -> NoReturn:
127
127
  """Mock GET function."""
128
128
  raise requests.ConnectionError
129
129
 
130
- monkeypatch.setattr(requests, "get", mock_get)
131
-
132
-
133
- @pytest.fixture
134
- def mock_s3_no_internet(monkeypatch: pytest.MonkeyPatch) -> None:
135
- """Monkeypatch for an S3 command run without an internet connection."""
136
-
137
- def mock_send(self, *args, **kwargs) -> NoReturn:
130
+ def mock_urllib3session_send(self, *args, **kwargs) -> NoReturn:
138
131
  """Mock send method."""
139
132
  raise botocore.exceptions.EndpointConnectionError(endpoint_url="test")
140
133
 
141
- monkeypatch.setattr(URLLib3Session, "send", mock_send)
134
+ monkeypatch.setattr(requests, "get", mock_requests_get)
135
+ monkeypatch.setattr(URLLib3Session, "send", mock_urllib3session_send)
142
136
 
143
137
 
144
138
  # Fixtures for working with GitHub tokens in settings file
@@ -71,9 +71,9 @@ def delete_mount_node(path: str, missing_ok: bool = False) -> None:
71
71
 
72
72
  def _copy_text_file(filename: str) -> None:
73
73
  """Copy a text file to the mounted test drive."""
74
- template_bootloader = os.path.join("tests", "assets", filename)
75
- bootloader_dest = os.path.join(get_mount(), filename)
76
- shutil.copyfile(template_bootloader, bootloader_dest)
74
+ template_file = os.path.join("tests", "assets", filename)
75
+ mount_dest = os.path.join(get_mount(), filename)
76
+ shutil.copyfile(template_file, mount_dest)
77
77
 
78
78
 
79
79
  def copy_uf2_info() -> None:
@@ -1,11 +1,11 @@
1
1
  version = 1
2
- revision = 2
2
+ revision = 3
3
3
  requires-python = ">=3.10.0"
4
4
  resolution-markers = [
5
- "python_full_version >= '3.13' and python_full_version < '4.0'",
5
+ "python_full_version >= '3.13' and python_full_version < '4'",
6
6
  "python_full_version >= '3.11' and python_full_version < '3.13'",
7
7
  "python_full_version < '3.11'",
8
- "python_full_version >= '4.0'",
8
+ "python_full_version >= '4'",
9
9
  ]
10
10
 
11
11
  [[package]]
@@ -247,13 +247,13 @@ requires-dist = [
247
247
  { name = "click", specifier = "==8.3.1" },
248
248
  { name = "click-spinner", specifier = "==0.1.10" },
249
249
  { name = "coverage", marker = "extra == 'dev'", specifier = "==7.13.3" },
250
- { name = "packaging", specifier = "==24.2" },
250
+ { name = "packaging", specifier = "==26.0" },
251
251
  { name = "pre-commit", marker = "extra == 'dev'", specifier = "==4.5.1" },
252
- { name = "psutil", specifier = "==6.1.1" },
253
- { name = "pytest", marker = "extra == 'dev'", specifier = "==8.4.2" },
252
+ { name = "psutil", specifier = "==7.2.2" },
253
+ { name = "pytest", marker = "extra == 'dev'", specifier = "==9.0.2" },
254
254
  { name = "pyyaml", specifier = "==6.0.3" },
255
255
  { name = "requests", specifier = "==2.32.5" },
256
- { name = "sphinx", marker = "extra == 'dev'", specifier = "==7.4.7" },
256
+ { name = "sphinx", marker = "extra == 'dev'", specifier = "==8.1.3" },
257
257
  { name = "sphinx-rtd-theme", marker = "extra == 'dev'", specifier = "==3.1.0" },
258
258
  { name = "sphinx-tabs", marker = "extra == 'dev'", specifier = "==3.4.7" },
259
259
  ]
@@ -676,11 +676,11 @@ wheels = [
676
676
 
677
677
  [[package]]
678
678
  name = "packaging"
679
- version = "24.2"
679
+ version = "26.0"
680
680
  source = { registry = "https://pypi.org/simple" }
681
- sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950, upload-time = "2024-11-08T09:47:47.202Z" }
681
+ sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" }
682
682
  wheels = [
683
- { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451, upload-time = "2024-11-08T09:47:44.722Z" },
683
+ { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" },
684
684
  ]
685
685
 
686
686
  [[package]]
@@ -719,17 +719,30 @@ wheels = [
719
719
 
720
720
  [[package]]
721
721
  name = "psutil"
722
- version = "6.1.1"
723
- source = { registry = "https://pypi.org/simple" }
724
- sdist = { url = "https://files.pythonhosted.org/packages/1f/5a/07871137bb752428aa4b659f910b399ba6f291156bdea939be3e96cae7cb/psutil-6.1.1.tar.gz", hash = "sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5", size = 508502, upload-time = "2024-12-19T18:21:20.568Z" }
725
- wheels = [
726
- { url = "https://files.pythonhosted.org/packages/61/99/ca79d302be46f7bdd8321089762dd4476ee725fce16fc2b2e1dbba8cac17/psutil-6.1.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8", size = 247511, upload-time = "2024-12-19T18:21:45.163Z" },
727
- { url = "https://files.pythonhosted.org/packages/0b/6b/73dbde0dd38f3782905d4587049b9be64d76671042fdcaf60e2430c6796d/psutil-6.1.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377", size = 248985, upload-time = "2024-12-19T18:21:49.254Z" },
728
- { url = "https://files.pythonhosted.org/packages/17/38/c319d31a1d3f88c5b79c68b3116c129e5133f1822157dd6da34043e32ed6/psutil-6.1.1-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003", size = 284488, upload-time = "2024-12-19T18:21:51.638Z" },
729
- { url = "https://files.pythonhosted.org/packages/9c/39/0f88a830a1c8a3aba27fededc642da37613c57cbff143412e3536f89784f/psutil-6.1.1-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160", size = 287477, upload-time = "2024-12-19T18:21:55.306Z" },
730
- { url = "https://files.pythonhosted.org/packages/47/da/99f4345d4ddf2845cb5b5bd0d93d554e84542d116934fde07a0c50bd4e9f/psutil-6.1.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3", size = 289017, upload-time = "2024-12-19T18:21:57.875Z" },
731
- { url = "https://files.pythonhosted.org/packages/38/53/bd755c2896f4461fd4f36fa6a6dcb66a88a9e4b9fd4e5b66a77cf9d4a584/psutil-6.1.1-cp37-abi3-win32.whl", hash = "sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53", size = 250602, upload-time = "2024-12-19T18:22:08.808Z" },
732
- { url = "https://files.pythonhosted.org/packages/7b/d7/7831438e6c3ebbfa6e01a927127a6cb42ad3ab844247f3c5b96bea25d73d/psutil-6.1.1-cp37-abi3-win_amd64.whl", hash = "sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649", size = 254444, upload-time = "2024-12-19T18:22:11.335Z" },
722
+ version = "7.2.2"
723
+ source = { registry = "https://pypi.org/simple" }
724
+ sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" }
725
+ wheels = [
726
+ { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" },
727
+ { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" },
728
+ { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" },
729
+ { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" },
730
+ { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" },
731
+ { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" },
732
+ { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" },
733
+ { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" },
734
+ { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" },
735
+ { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" },
736
+ { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" },
737
+ { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" },
738
+ { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" },
739
+ { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" },
740
+ { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" },
741
+ { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" },
742
+ { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" },
743
+ { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" },
744
+ { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" },
745
+ { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" },
733
746
  ]
734
747
 
735
748
  [[package]]
@@ -752,7 +765,7 @@ wheels = [
752
765
 
753
766
  [[package]]
754
767
  name = "pytest"
755
- version = "8.4.2"
768
+ version = "9.0.2"
756
769
  source = { registry = "https://pypi.org/simple" }
757
770
  dependencies = [
758
771
  { name = "colorama", marker = "sys_platform == 'win32'" },
@@ -763,9 +776,9 @@ dependencies = [
763
776
  { name = "pygments" },
764
777
  { name = "tomli", marker = "python_full_version < '3.11'" },
765
778
  ]
766
- sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" }
779
+ sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" }
767
780
  wheels = [
768
- { url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" },
781
+ { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" },
769
782
  ]
770
783
 
771
784
  [[package]]
@@ -891,7 +904,7 @@ wheels = [
891
904
 
892
905
  [[package]]
893
906
  name = "sphinx"
894
- version = "7.4.7"
907
+ version = "8.1.3"
895
908
  source = { registry = "https://pypi.org/simple" }
896
909
  dependencies = [
897
910
  { name = "alabaster" },
@@ -912,9 +925,9 @@ dependencies = [
912
925
  { name = "sphinxcontrib-serializinghtml" },
913
926
  { name = "tomli", marker = "python_full_version < '3.11'" },
914
927
  ]
915
- sdist = { url = "https://files.pythonhosted.org/packages/5b/be/50e50cb4f2eff47df05673d361095cafd95521d2a22521b920c67a372dcb/sphinx-7.4.7.tar.gz", hash = "sha256:242f92a7ea7e6c5b406fdc2615413890ba9f699114a9c09192d7dfead2ee9cfe", size = 8067911, upload-time = "2024-07-20T14:46:56.059Z" }
928
+ sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611, upload-time = "2024-10-13T20:27:13.93Z" }
916
929
  wheels = [
917
- { url = "https://files.pythonhosted.org/packages/0d/ef/153f6803c5d5f8917dbb7f7fcf6d34a871ede3296fa89c2c703f5f8a6c8e/sphinx-7.4.7-py3-none-any.whl", hash = "sha256:c2419e2135d11f1951cd994d6eb18a1835bd8fdd8429f9ca375dc1f3281bd239", size = 3401624, upload-time = "2024-07-20T14:46:52.142Z" },
930
+ { url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125, upload-time = "2024-10-13T20:27:10.448Z" },
918
931
  ]
919
932
 
920
933
  [[package]]
circfirm-5.0.0/VERSION DELETED
@@ -1 +0,0 @@
1
- 5.0.0
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes