pyobs-fli 2.0.0.dev13__tar.gz → 2.0.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 (83) hide show
  1. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/.readthedocs.yml +0 -2
  2. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/PKG-INFO +3 -3
  3. pyobs_fli-2.0.1/docs/requirements.txt +4 -0
  4. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/docs/source/conf.py +4 -0
  5. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/pyobs_fli/flicamera.py +7 -2
  6. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/pyobs_fli/flifilterwheel.py +3 -9
  7. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/pyproject.toml +3 -3
  8. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/uv.lock +27 -27
  9. pyobs_fli-2.0.0.dev13/docs/requirements.txt +0 -1
  10. pyobs_fli-2.0.0.dev13/poetry.lock +0 -2257
  11. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/.github/dependabot.yml +0 -0
  12. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/.github/workflows/dependabot-automerge.yml +0 -0
  13. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/.github/workflows/pypi.yml +0 -0
  14. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/.github/workflows/pyrefly.yml +0 -0
  15. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/.github/workflows/pytest.yml +0 -0
  16. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/.github/workflows/ruff.yml +0 -0
  17. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/.pre-commit-config.yaml +0 -0
  18. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/CHANGELOG.rst +0 -0
  19. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/CMakeLists.txt +0 -0
  20. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/LICENSE +0 -0
  21. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/README.md +0 -0
  22. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/docs/Makefile +0 -0
  23. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/docs/make.bat +0 -0
  24. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/docs/source/_static/pyobs.gif +0 -0
  25. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/docs/source/index.rst +0 -0
  26. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/Makefile +0 -0
  27. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/docxx.sty +0 -0
  28. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/libfli-camera-parport.c +0 -0
  29. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/libfli-camera-parport.h +0 -0
  30. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/libfli-camera-usb.c +0 -0
  31. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/libfli-camera-usb.h +0 -0
  32. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/libfli-camera.c +0 -0
  33. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/libfli-camera.h +0 -0
  34. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/libfli-debug.h +0 -0
  35. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/libfli-filter-focuser.c +0 -0
  36. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/libfli-filter-focuser.h +0 -0
  37. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/libfli-libfli.h +0 -0
  38. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/libfli-mem.c +0 -0
  39. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/libfli-mem.h +0 -0
  40. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/libfli-raw.c +0 -0
  41. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/libfli-raw.h +0 -0
  42. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/libfli.c +0 -0
  43. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/libfli.dxx +0 -0
  44. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/libfli.h +0 -0
  45. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/unix/bsd/libfli-usb-sys.c +0 -0
  46. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/unix/libfli-debug.c +0 -0
  47. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/unix/libfli-parport.h +0 -0
  48. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/unix/libfli-serial.c +0 -0
  49. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/unix/libfli-serial.h +0 -0
  50. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/unix/libfli-sys.c +0 -0
  51. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/unix/libfli-sys.h +0 -0
  52. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/unix/libfli-usb.c +0 -0
  53. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/unix/libfli-usb.h +0 -0
  54. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/unix/linux/fli_ioctl.h +0 -0
  55. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/unix/linux/fliusb_ioctl.h +0 -0
  56. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/unix/linux/libfli-parport.c +0 -0
  57. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/unix/linux/libfli-usb-sys.c +0 -0
  58. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/unix/osx/libfli-usb-sys.c +0 -0
  59. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/unix/osx/libfli-usb-sys.h +0 -0
  60. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/windows/libfli-debug.c +0 -0
  61. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/windows/libfli-parport.h +0 -0
  62. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/windows/libfli-serial.c +0 -0
  63. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/windows/libfli-serial.h +0 -0
  64. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/windows/libfli-sys.h +0 -0
  65. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/windows/libfli-usb.c +0 -0
  66. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/windows/libfli-usb.h +0 -0
  67. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/windows/libfli-windows-parport.c +0 -0
  68. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/windows/libfli-windows.c +0 -0
  69. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/windows/libfli.def +0 -0
  70. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/windows/libfli.rc +0 -0
  71. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/windows/libfli.sln +0 -0
  72. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/windows/libfli.vcproj +0 -0
  73. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/windows/libfli64.def +0 -0
  74. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/lib/windows/resource.h +0 -0
  75. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/pyobs_fli/__init__.py +0 -0
  76. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/pyobs_fli/flibase.py +0 -0
  77. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/pyobs_fli/flidriver.pyx +0 -0
  78. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/pyobs_fli/gui.py +0 -0
  79. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/pyobs_fli/libfli.pxd +0 -0
  80. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/specs/plans/2026-08-16-nogil-fli-driver-calls.md +0 -0
  81. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/tests/test_flicamera.py +0 -0
  82. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/tests/test_flifilterwheel.py +0 -0
  83. {pyobs_fli-2.0.0.dev13 → pyobs_fli-2.0.1}/tests/test_import.py +0 -0
@@ -10,6 +10,4 @@ sphinx:
10
10
 
11
11
  python:
12
12
  install:
13
- - method: pip
14
- path: .
15
13
  - requirements: docs/requirements.txt
@@ -1,14 +1,14 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyobs-fli
3
- Version: 2.0.0.dev13
3
+ Version: 2.0.1
4
4
  Summary: pyobs module for FLI cameras
5
5
  Author-Email: Tim-Oliver Husser <thusser@uni-goettingen.de>
6
6
  License-Expression: MIT
7
7
  Requires-Python: >=3.11
8
8
  Requires-Dist: astropy<9,>=7.0.1
9
9
  Requires-Dist: numpy<3,>=2.2.5
10
- Requires-Dist: pyobs-core<3,>=2.0.0.dev82
10
+ Requires-Dist: pyobs-core<3,>=2.6.1
11
11
  Provides-Extra: gui
12
- Requires-Dist: pyobs-core[gui]<3,>=2.0.0.dev48; extra == "gui"
12
+ Requires-Dist: pyobs-core[gui]<3,>=2.6.1; extra == "gui"
13
13
  Requires-Dist: qasync>=0.27; extra == "gui"
14
14
 
@@ -0,0 +1,4 @@
1
+ sphinx-rtd-theme
2
+ astropy>=7.0.1,<9
3
+ numpy>=2.2.5,<3
4
+ pyobs-core>=2.0.0.dev82,<3
@@ -53,6 +53,10 @@ extensions = [
53
53
 
54
54
  intersphinx_mapping = {"http://docs.python.org/3": None}
55
55
 
56
+ # flidriver.pyx wraps the vendor FLI SDK as a compiled extension - not buildable on RTD,
57
+ # and not needed for the FliCamera/FliFilterWheel autoclass docs.
58
+ autodoc_mock_imports = ["pyobs_fli.flidriver"]
59
+
56
60
  # napoleon settings
57
61
  napoleon_google_docstring = True
58
62
  napoleon_numpy_docstring = False
@@ -42,6 +42,7 @@ class FliCamera(BaseCamera, FliBaseMixin, ICamera, IWindow, IBinning, ICooling,
42
42
  self._full_frame = (0, 0, 0, 0)
43
43
  self._window = (0, 0, 0, 0)
44
44
  self._binning = (1, 1)
45
+ self._serial: str | None = None
45
46
 
46
47
  self.add_background_task(self._poll_cooling)
47
48
 
@@ -62,6 +63,7 @@ class FliCamera(BaseCamera, FliBaseMixin, ICamera, IWindow, IBinning, ICooling,
62
63
  return serial, window, binning, full_frame
63
64
 
64
65
  serial, self._window, self._binning, self._full_frame = await self._run_blocking_or_raise(_get_info)
66
+ self._serial = serial
65
67
  log.info("Connected to camera with serial number: %s", serial)
66
68
 
67
69
  if self._temp_setpoint is not None:
@@ -165,22 +167,25 @@ class FliCamera(BaseCamera, FliBaseMixin, ICamera, IWindow, IBinning, ICooling,
165
167
  await self._abort_exposure()
166
168
  raise
167
169
 
168
- def _get_headers() -> tuple[float, float, tuple[int, int, int, int]]:
170
+ def _get_headers() -> tuple[float, float, float, tuple[int, int, int, int]]:
169
171
  return (
170
172
  driver.get_temp(FliTemperature.CCD),
173
+ driver.get_temp(FliTemperature.BASE),
171
174
  driver.get_cooler_power(),
172
175
  driver.get_visible_frame(),
173
176
  )
174
177
 
175
- ccd_temp, cooler_power, visible_frame = await self._run_blocking_or_raise(_get_headers)
178
+ ccd_temp, base_temp, cooler_power, visible_frame = await self._run_blocking_or_raise(_get_headers)
176
179
 
177
180
  image = Image(img) # type: ignore[arg-type]
178
181
  image.header["DATE-OBS"] = (date_obs, "Date and time of start of exposure")
179
182
  image.header["EXPTIME"] = (exposure_time, "Exposure time [s]")
180
183
  image.header["DET-TEMP"] = (ccd_temp, "CCD temperature [C]")
184
+ image.header["DET-TBAS"] = (base_temp, "Base plate temperature [C]")
181
185
  image.header["DET-COOL"] = (cooler_power, "Cooler power [percent]")
182
186
  image.header["DET-TSET"] = (self._temp_setpoint, "Cooler setpoint [C]")
183
187
  image.header["INSTRUME"] = (self._driver.name, "Name of instrument")
188
+ image.header["DET-ID"] = (self._serial, "Camera serial number")
184
189
  image.header["XBINNING"] = image.header["DET-BIN1"] = (self._binning[0], "Binning factor used on X axis")
185
190
  image.header["YBINNING"] = image.header["DET-BIN2"] = (self._binning[1], "Binning factor used on Y axis")
186
191
  image.header["XORGSUBF"] = (self._window[0], "Subframe origin on X axis")
@@ -4,10 +4,10 @@ from typing import Any
4
4
 
5
5
  import pyobs.utils.exceptions as exc
6
6
  from pyobs.events import FilterChangedEvent
7
- from pyobs.interfaces import FitsHeaderEntry, IFilters, IFitsHeaderBefore, IReady
7
+ from pyobs.interfaces import IFilters, IFitsHeaderBefore, IReady
8
8
  from pyobs.interfaces.IFilters import FiltersCapabilities, FilterState
9
9
  from pyobs.interfaces.IReady import ReadyState
10
- from pyobs.mixins import MotionStatusMixin
10
+ from pyobs.mixins import FilterHeaderMixin, MotionStatusMixin
11
11
  from pyobs.modules import Module
12
12
  from pyobs.utils.enums import MotionStatus
13
13
 
@@ -22,7 +22,7 @@ log = logging.getLogger(__name__)
22
22
  _FILTER_MOVE_TIMEOUT = 120.0
23
23
 
24
24
 
25
- class FliFilterWheel(Module, FliBaseMixin, MotionStatusMixin, IFilters, IFitsHeaderBefore):
25
+ class FliFilterWheel(FilterHeaderMixin, Module, FliBaseMixin, MotionStatusMixin, IFilters, IFitsHeaderBefore):
26
26
  """A pyobs module for FLI filter wheels."""
27
27
 
28
28
  __module__ = "pyobs_fli"
@@ -138,11 +138,5 @@ class FliFilterWheel(Module, FliBaseMixin, MotionStatusMixin, IFilters, IFitsHea
138
138
  async def stop_motion(self, device: str | None = None, **kwargs: Any) -> None:
139
139
  pass
140
140
 
141
- async def get_fits_header_before(
142
- self, namespaces: list[str] | None = None, **kwargs: Any
143
- ) -> dict[str, FitsHeaderEntry]:
144
- """Returns FITS header for the current status of this module."""
145
- return {"FILTER": FitsHeaderEntry(self._current_filter, "Current filter")}
146
-
147
141
 
148
142
  __all__ = ["FliFilterWheel"]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pyobs-fli"
3
- version = "2.0.0.dev13"
3
+ version = "2.0.1"
4
4
  description = "pyobs module for FLI cameras"
5
5
  authors = [{ name = "Tim-Oliver Husser", email = "thusser@uni-goettingen.de" }]
6
6
  requires-python = ">=3.11"
@@ -8,12 +8,12 @@ license = "MIT"
8
8
  dependencies = [
9
9
  "astropy>=7.0.1,<9",
10
10
  "numpy>=2.2.5,<3",
11
- "pyobs-core>=2.0.0.dev82,<3",
11
+ "pyobs-core>=2.6.1,<3",
12
12
  ]
13
13
 
14
14
  [project.optional-dependencies]
15
15
  gui = [
16
- "pyobs-core[gui]>=2.0.0.dev48,<3",
16
+ "pyobs-core[gui]>=2.6.1,<3",
17
17
  "qasync>=0.27",
18
18
  ]
19
19
 
@@ -2320,7 +2320,7 @@ wheels = [
2320
2320
 
2321
2321
  [[package]]
2322
2322
  name = "pyobs-core"
2323
- version = "2.0.0.dev82"
2323
+ version = "2.6.1"
2324
2324
  source = { registry = "https://pypi.org/simple" }
2325
2325
  dependencies = [
2326
2326
  { name = "aiohttp" },
@@ -2352,9 +2352,9 @@ dependencies = [
2352
2352
  { name = "tenacity" },
2353
2353
  { name = "typing-extensions" },
2354
2354
  ]
2355
- sdist = { url = "https://files.pythonhosted.org/packages/13/b8/e0d2a5fa390e15eebd01c86a75360e47e72823036b9e8793f73961c4e24a/pyobs_core-2.0.0.dev82.tar.gz", hash = "sha256:eb5e6510e0ba113700876db409cdce4b5d57e6df399421fc8cf174ec9e5076a8", size = 362959, upload-time = "2026-08-19T04:27:17.94Z" }
2355
+ sdist = { url = "https://files.pythonhosted.org/packages/af/c6/cfaf041ee13cdec9475e8081043091de72f1f9e22e2c0788c2f048f93687/pyobs_core-2.6.1.tar.gz", hash = "sha256:c0c0314088f6d87304be65f296a855b5410efbd00881b3e56cc7ad3dc0613aa4", size = 407925, upload-time = "2026-09-03T17:17:55.708Z" }
2356
2356
  wheels = [
2357
- { url = "https://files.pythonhosted.org/packages/81/17/83f22b85cfd9dea2c18396738d12fcd631232b2e8a111700133b037a7673/pyobs_core-2.0.0.dev82-py3-none-any.whl", hash = "sha256:b0cfe7d7a9dff89a8650ff4c01cdd3423f8ca9188aeef1d799d3e61085484bb2", size = 585768, upload-time = "2026-08-19T04:27:16.531Z" },
2357
+ { url = "https://files.pythonhosted.org/packages/cf/60/936d5620525ab3c0b169dfd50a61b78cad03d2e13f3bd72c96aacb29a183/pyobs_core-2.6.1-py3-none-any.whl", hash = "sha256:629ddfd6e080f7fd9b71f84286c08b0c5a66a711be23a1d8f6c31233fbfdf006", size = 637177, upload-time = "2026-09-03T17:17:54.184Z" },
2358
2358
  ]
2359
2359
 
2360
2360
  [package.optional-dependencies]
@@ -2366,7 +2366,7 @@ gui = [
2366
2366
 
2367
2367
  [[package]]
2368
2368
  name = "pyobs-fli"
2369
- version = "2.0.0.dev13"
2369
+ version = "2.0.1"
2370
2370
  source = { editable = "." }
2371
2371
  dependencies = [
2372
2372
  { name = "astropy" },
@@ -2395,8 +2395,8 @@ dev = [
2395
2395
  requires-dist = [
2396
2396
  { name = "astropy", specifier = ">=7.0.1,<9" },
2397
2397
  { name = "numpy", specifier = ">=2.2.5,<3" },
2398
- { name = "pyobs-core", specifier = ">=2.0.0.dev82,<3" },
2399
- { name = "pyobs-core", extras = ["gui"], marker = "extra == 'gui'", specifier = ">=2.0.0.dev48,<3" },
2398
+ { name = "pyobs-core", specifier = ">=2.6.1,<3" },
2399
+ { name = "pyobs-core", extras = ["gui"], marker = "extra == 'gui'", specifier = ">=2.6.1,<3" },
2400
2400
  { name = "qasync", marker = "extra == 'gui'", specifier = ">=0.27" },
2401
2401
  ]
2402
2402
  provides-extras = ["gui"]
@@ -2728,27 +2728,27 @@ wheels = [
2728
2728
 
2729
2729
  [[package]]
2730
2730
  name = "ruff"
2731
- version = "0.16.2"
2732
- source = { registry = "https://pypi.org/simple" }
2733
- sdist = { url = "https://files.pythonhosted.org/packages/73/e1/4508a569211b35599016e84ba65c1a992b7a4004b4b6c4bea02a851cba1b/ruff-0.16.2.tar.gz", hash = "sha256:c3d7828d12e8927a6fc65fe38e2c2541b9e762d360a1786d752cb1b8883b3c9c", size = 4885811, upload-time = "2026-08-07T13:31:01.432Z" }
2734
- wheels = [
2735
- { url = "https://files.pythonhosted.org/packages/14/57/db19951540f98859c956b50bdb4d31089b4d91e9f15e2968e7d5193806d5/ruff-0.16.2-py3-none-linux_armv6l.whl", hash = "sha256:3c8de4cf2181f01d57946d87d777aa52916976fc09942aed89938fab5e013318", size = 10847925, upload-time = "2026-08-07T13:30:14.468Z" },
2736
- { url = "https://files.pythonhosted.org/packages/13/5a/995fe85a8470d3e391ac0f7fa8054bb454eaf33ee138196d6172ed1079c0/ruff-0.16.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9a48cc05c6fbc811ca81b5d7ba95375affea6582d1b8024e455e41afbbf55344", size = 11072662, upload-time = "2026-08-07T13:30:18.143Z" },
2737
- { url = "https://files.pythonhosted.org/packages/32/53/370d767c61c71a971a4ace36703a7ecd8c393956349a7325d7fab2b56827/ruff-0.16.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a2c0d14fcbb26c91f0f867a6dc9bd71bbc30b1b6151829c884f23faeab2e5700", size = 10566771, upload-time = "2026-08-07T13:30:20.899Z" },
2738
- { url = "https://files.pythonhosted.org/packages/85/d6/9d96948caf5a632be62d62202d5ec914d6856f204fd79eb036e5915e79ea/ruff-0.16.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:335c621622c4650330be50842561c6586ac6971bb8ab5407fe34dcc9efb16bbe", size = 10975825, upload-time = "2026-08-07T13:30:23.517Z" },
2739
- { url = "https://files.pythonhosted.org/packages/3b/92/ea87129b3414acb0b5770563779c51804d37ac67675c7ba35447ddb14773/ruff-0.16.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20e66910f2c37cc753f9ef6580c914a621b80c4fa3549d3e3521e29d0f5bfc3f", size = 10649437, upload-time = "2026-08-07T13:30:26.097Z" },
2740
- { url = "https://files.pythonhosted.org/packages/ac/43/f8f291dcd4af5bb7872b74fdfa41a7cd7c856ca1d4069670971cf1b9f5cb/ruff-0.16.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7e36fbfba65510548156902bcf1350a979a958ce0347ce0f90d73894036b39f", size = 11446761, upload-time = "2026-08-07T13:30:28.752Z" },
2741
- { url = "https://files.pythonhosted.org/packages/71/4a/ef991fb2fcf516ab71f0808adcdd8da5e18c8cde447f4ceaf5f47a5132a5/ruff-0.16.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f0eab35f80df8f134aae5d1630e751901321d317cc8e50dc39e36fa3ed34cd12", size = 12336364, upload-time = "2026-08-07T13:30:31.468Z" },
2742
- { url = "https://files.pythonhosted.org/packages/f3/24/f615e74f307e6ca0e56a482872477b856c70d530aa356abfb6dfe5ca8a80/ruff-0.16.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40ea8c0594feb894e89c8c61ab9c103d38b0ea72dfde6c594107147ca31b1140", size = 11630720, upload-time = "2026-08-07T13:30:34.426Z" },
2743
- { url = "https://files.pythonhosted.org/packages/c5/d3/8ef50149e8412a77f7ab409efdef0e2b23803707a3863da4fc64cb23d459/ruff-0.16.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab3d62dde0b19facdd632008cc4827fc28ada7736c6bd35ab6f1050f0bfed53f", size = 11466130, upload-time = "2026-08-07T13:30:36.958Z" },
2744
- { url = "https://files.pythonhosted.org/packages/dd/a7/a19334985c4dea8c381981fa252cd854c7ee52dc4b1686dc16f4a911c702/ruff-0.16.2-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:e43e1f5b8388da9eca1b9e88328d47a5cec794633ccf6f7484ac2dd15eee92c0", size = 11523634, upload-time = "2026-08-07T13:30:39.822Z" },
2745
- { url = "https://files.pythonhosted.org/packages/6e/6c/96d192b0e742412ceda08c0a50f9669b253dde9fd6a60ea1a10c9fa79a63/ruff-0.16.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c24788a980581e1d7ea3a0cbe4344c4fbeb0a6a9b1f4713aa46bb104f8294690", size = 10949807, upload-time = "2026-08-07T13:30:42.745Z" },
2746
- { url = "https://files.pythonhosted.org/packages/fa/51/e26599ceca11e79ee255c7df515995561edf87e9ca1893284e44d98f5a86/ruff-0.16.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:81806b08329130005dd4a8a8394a0c9da8c6f4cafb16ba438d2a2ee6a18bedf1", size = 10646891, upload-time = "2026-08-07T13:30:45.522Z" },
2747
- { url = "https://files.pythonhosted.org/packages/68/01/800c4b1f97bc8d7c6029e06b1f20473a3cf1e13c4933d8f3342add83fc55/ruff-0.16.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:4ce4e02bad779bef557f541a1b31f20d6abeae1cc05ed1b1ac019d4ffd1044c8", size = 11162063, upload-time = "2026-08-07T13:30:48.131Z" },
2748
- { url = "https://files.pythonhosted.org/packages/e4/d0/1477ea50fc5a0d4b0b71d1d63d50770bdd794d90b43e37a7618e63ec9894/ruff-0.16.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e0422abdf70070255fc4073ce9dfc814cc03db577013761ddd09bc1e4a9a4fbd", size = 11556038, upload-time = "2026-08-07T13:30:50.686Z" },
2749
- { url = "https://files.pythonhosted.org/packages/b8/76/a7776f32048d991e16d4fa8ff91790b877342d3596cc3ed04acdbf1aaedc/ruff-0.16.2-py3-none-win32.whl", hash = "sha256:bf3a63d78fb39f4bf5ac8ae52051c5520505301abe19ba4e204c453b3f09bb0b", size = 10872850, upload-time = "2026-08-07T13:30:53.471Z" },
2750
- { url = "https://files.pythonhosted.org/packages/00/0d/929c800d920e61397d82a01b60bffc68da3052c17d31de59efaad2e4ed75/ruff-0.16.2-py3-none-win_amd64.whl", hash = "sha256:bcabe2f6d0fc7819f1431793005af4e4de7371927d037345bf941252b195b9fa", size = 12023338, upload-time = "2026-08-07T13:30:56.193Z" },
2751
- { url = "https://files.pythonhosted.org/packages/5b/6c/93e26c22c5f78ff87363e07da49c84955affbeb1098bd1936bf3b3f293bf/ruff-0.16.2-py3-none-win_arm64.whl", hash = "sha256:d614e95cedf38a2053fd351c55b103ba30d017d61688fdbfd40ee0412852a99f", size = 11374065, upload-time = "2026-08-07T13:30:58.775Z" },
2731
+ version = "0.16.5"
2732
+ source = { registry = "https://pypi.org/simple" }
2733
+ sdist = { url = "https://files.pythonhosted.org/packages/f3/85/c8e12473c93018f92d19dd988a294202e1c27426c47ec4de53ffb847b8d8/ruff-0.16.5.tar.gz", hash = "sha256:1b88500f9ffbcab3dedb0082c9f9492e91ec3d618aac1236a3e0189938f7040b", size = 4912003, upload-time = "2026-08-27T16:34:18.258Z" }
2734
+ wheels = [
2735
+ { url = "https://files.pythonhosted.org/packages/c6/b6/77c90a970fe2dae17a723acbd011043ea97c98d7deacccefdc4ba74ec512/ruff-0.16.5-py3-none-linux_armv6l.whl", hash = "sha256:12e5f673e774c35fbb62f288809c7653b73445f8ecec6b6063fd6ea3521aa14b", size = 10011941, upload-time = "2026-08-27T16:33:41.287Z" },
2736
+ { url = "https://files.pythonhosted.org/packages/4b/46/6cf67cf6411885a1d6f7f6d801682f155536a85176d10b605e2ceffed8bd/ruff-0.16.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:eda58a5802de40e7ed5b32b64e0b32539338cc6fcd2c78f61e3ad6a0d79f51c3", size = 10204049, upload-time = "2026-08-27T16:33:44.056Z" },
2737
+ { url = "https://files.pythonhosted.org/packages/46/fd/c8720ca7a090abf0c2fef4abe8a5ef6e5127ed15196d8886ff75a2b370e2/ruff-0.16.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c5ae9a7b9a8875131f40f8fe967cc86abf899779efd663cb7ce3d572d01da7eb", size = 9809037, upload-time = "2026-08-27T16:33:46.257Z" },
2738
+ { url = "https://files.pythonhosted.org/packages/43/45/a684caacdedaca180f52bacccc40bf0789d2c5a7c75f25324853e9eaedb5/ruff-0.16.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b719b0a1f4d59710d283ab2965f621684a108a9e41da622e3b23f0326cd0025", size = 9964129, upload-time = "2026-08-27T16:33:48.352Z" },
2739
+ { url = "https://files.pythonhosted.org/packages/9e/f2/5d2bcdaca6b5b93d1b4dfc166cd2aebf7680143a1b38a28759df13a94d31/ruff-0.16.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2298f2780ed1be0c5cb1361e32ab7b1467f3cce7dabe101d2210a314f2fe42e9", size = 9821518, upload-time = "2026-08-27T16:33:50.57Z" },
2740
+ { url = "https://files.pythonhosted.org/packages/aa/ff/011cce29accf9257d5974145b733fc653a37985ed6825413a3987cefbfe0/ruff-0.16.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:258f29035a2dd021e7861e631b227a5b3f14e50c1184c9a6a122c5f4576154d7", size = 10534835, upload-time = "2026-08-27T16:33:52.522Z" },
2741
+ { url = "https://files.pythonhosted.org/packages/d7/5a/f0cf109bada9bba0e96c90c21c9f9251803f57225c32d293327a03c710d6/ruff-0.16.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9a4f0432966834019c74d1b7e5c51224305d7713f3d7faf3e7451f1a3be3cde", size = 11252550, upload-time = "2026-08-27T16:33:54.521Z" },
2742
+ { url = "https://files.pythonhosted.org/packages/63/4d/1d481aaea2046c6a7ed7c291f9004c669cce3c087b6b376ed5b08271e3fe/ruff-0.16.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b5eb3a8c3d0ade9cea42b591fd530368e8798380e30e0a308b85a5cf718f09ea", size = 10777949, upload-time = "2026-08-27T16:33:56.88Z" },
2743
+ { url = "https://files.pythonhosted.org/packages/ee/34/ee245ca55f64443233034b3d02b03236b19242004281247c079390b7facd/ruff-0.16.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef0f69e191a13a3c9816f63163c88790cb12cd157bbbb384e9c44745702ab105", size = 10311656, upload-time = "2026-08-27T16:33:59.12Z" },
2744
+ { url = "https://files.pythonhosted.org/packages/a7/4d/c33a333e341c0a2b96c715b52d89a606f5a34cd4ac493cd9b8d0187186b8/ruff-0.16.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:0eeab41fbea2c42f98dfb9822cdccda9d24ba38d49f6dc945b5c236d48f0ef29", size = 10532125, upload-time = "2026-08-27T16:34:01.166Z" },
2745
+ { url = "https://files.pythonhosted.org/packages/30/e1/a64cef78b40192497bb98a27a8aa8f2c98ee9ee15bc97f7712d94ef32937/ruff-0.16.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:f0768e9df4300713fff30733c87575f68b6f1d8de41184e505b7fdd9c0c95eaf", size = 10097648, upload-time = "2026-08-27T16:34:03.16Z" },
2746
+ { url = "https://files.pythonhosted.org/packages/cc/4e/4cdc9ed3c3e109d2f71e62572a37457298d7bc7501ec3138babb7ed32bbd/ruff-0.16.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:95cc70cdc7aa80c338de356279d2adbeb2de0f520b9ecd8aba75b94e95e02f91", size = 9829344, upload-time = "2026-08-27T16:34:05.134Z" },
2747
+ { url = "https://files.pythonhosted.org/packages/39/4a/31ed35ce31729955fc583ee0d176d6e784c1290cb0b0a75cb2134c1ab72a/ruff-0.16.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d185c8398ded1bfd91c0c2cb258346307571eccc473a8490af8c3977399c384a", size = 10277117, upload-time = "2026-08-27T16:34:07.425Z" },
2748
+ { url = "https://files.pythonhosted.org/packages/a8/a0/60356d86687b4b666d593df213f4dc3041750d024cb7bf2cfa81cfd65c2e/ruff-0.16.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:fb8e3a3c4c6a784150a7ced53b015f4b253fc2bf97a610886419ead64b4756ef", size = 10711653, upload-time = "2026-08-27T16:34:09.712Z" },
2749
+ { url = "https://files.pythonhosted.org/packages/ed/20/656d67f5b25ca9bda4e02b1de25867b2954e1d19e03648060f167ad0f4cc/ruff-0.16.5-py3-none-win32.whl", hash = "sha256:288b0a5f080492fe5635db849f9e2e84aa3cce7b7f0e955997d416c507c76a26", size = 10034250, upload-time = "2026-08-27T16:34:11.8Z" },
2750
+ { url = "https://files.pythonhosted.org/packages/5b/42/ee8e68a207b9127fcde6c3d7e197def432f346cb1af159e1fa14ca0d1cdc/ruff-0.16.5-py3-none-win_amd64.whl", hash = "sha256:ddc6385fb2137f616357ca03d6c74f4be987f80fed4008566b754f6032b8546f", size = 10516714, upload-time = "2026-08-27T16:34:13.963Z" },
2751
+ { url = "https://files.pythonhosted.org/packages/73/e3/7df5a396e445b9ba49ce9a9437439a4d80042c61c0ade199abf8d16de1ac/ruff-0.16.5-py3-none-win_arm64.whl", hash = "sha256:a64abe90968719b851bb7cedffaa8753fbdbdadab483089682db623f3edc587e", size = 10391564, upload-time = "2026-08-27T16:34:16.064Z" },
2752
2752
  ]
2753
2753
 
2754
2754
  [[package]]
@@ -1 +0,0 @@
1
- sphinx-rtd-theme