pyobs-alpaca 2.0.0.dev6__tar.gz → 2.0.2__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 (32) hide show
  1. pyobs_alpaca-2.0.2/CHANGELOG.md +178 -0
  2. pyobs_alpaca-2.0.2/CONTRIBUTING.md +35 -0
  3. pyobs_alpaca-2.0.2/PKG-INFO +81 -0
  4. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/pyobs_alpaca/dome.py +25 -2
  5. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/pyobs_alpaca/focuser.py +7 -4
  6. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/pyproject.toml +9 -2
  7. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/uv.lock +39 -39
  8. pyobs_alpaca-2.0.0.dev6/CHANGELOG.rst +0 -2
  9. pyobs_alpaca-2.0.0.dev6/PKG-INFO +0 -10
  10. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/.flake8 +0 -0
  11. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/.github/dependabot.yml +0 -0
  12. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/.github/workflows/dependabot-automerge.yml +0 -0
  13. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/.github/workflows/pypi.yml +0 -0
  14. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/.github/workflows/pyrefly.yml +0 -0
  15. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/.github/workflows/pytest.yml +0 -0
  16. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/.github/workflows/ruff.yml +0 -0
  17. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/.pre-commit-config.yaml +0 -0
  18. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/.readthedocs.yml +0 -0
  19. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/LICENSE +0 -0
  20. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/README.md +0 -0
  21. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/docs/Makefile +0 -0
  22. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/docs/make.bat +0 -0
  23. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/docs/requirements.txt +0 -0
  24. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/docs/source/_static/pyobs.gif +0 -0
  25. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/docs/source/conf.py +0 -0
  26. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/docs/source/index.rst +0 -0
  27. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/pyobs_alpaca/__init__.py +0 -0
  28. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/pyobs_alpaca/device.py +0 -0
  29. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/pyobs_alpaca/telescope.py +0 -0
  30. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/tests/test_cooperative_init.py +0 -0
  31. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/tests/test_device.py +0 -0
  32. {pyobs_alpaca-2.0.0.dev6 → pyobs_alpaca-2.0.2}/tests/test_import.py +0 -0
@@ -0,0 +1,178 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ Entries for releases before this file existed were generated from commit subjects.
9
+
10
+ ## [2.0.1] - 2026-09-03
11
+
12
+ - Add DOMESHUT FITS header; adopt FocuserHeaderMixin for FOCOFF (#872)
13
+
14
+ ## [2.0.0] - 2026-08-26
15
+
16
+ - Require stable pyobs-core>=2.0.0
17
+ - Gate auto-merge on the PR author, not the event actor
18
+ - Enable Dependabot auto-merge for patch/minor updates
19
+ - Lock DEVICE_INIT_KWARGS/OBJECT_SHARED_KWARGS against real constructor signatures
20
+ - Convert AlpacaDome/AlpacaFocuser/AlpacaTelescope to cooperative super().__init__() chains
21
+ - Add baseline test suite and CI (pytest, pyrefly), grouped Dependabot
22
+ - Upgrade uv.lock to clear open Dependabot alerts
23
+ - Require pyobs-core>=2.0.0.dev48
24
+ - Add dependabot.yml, targeting develop for PRs
25
+ - Add TODO for register_exception rename coming in pyobs-core
26
+ - Update to pyobs-core 2.0.0.dev10, apply FitsHeaderEntry to get_fits_header_before
27
+ - Add missing docs/requirements.txt to readthedocs config
28
+ - Write proper README with install and configuration docs
29
+ - refactored Alpaca device class and modules to standardize logging, type hints, and state publishing
30
+ - added Ruff GitHub Action
31
+ - migrated to Ruff and updated `uv.lock`
32
+ - changing old-style type hints to new style
33
+ - changed underscore parameters for vfs, comm, etc
34
+ - renamed Object parameters (comm, observer, ...) to start with an underscore
35
+ - new lock file
36
+
37
+ ## [1.1.2] - 2025-07-07
38
+
39
+ - .
40
+ - readthedocs
41
+
42
+ ## [1.1.1] - 2025-07-03
43
+
44
+ - github action
45
+ - pre-commit
46
+
47
+ ## [1.1.0] - 2025-07-03
48
+
49
+ - migrated to uv
50
+
51
+ ## [1.0.3] - 2023-07-26
52
+
53
+ - updated deps
54
+
55
+ ## [1.0.2] - 2023-07-26
56
+
57
+ - up to Python 3.11
58
+
59
+ ## [1.0.1] - 2022-10-16
60
+
61
+ - resend open/close command every 10s
62
+
63
+ ## [1.0.0] - 2022-09-13
64
+
65
+ - added license
66
+
67
+ ## [0.18.0] - 2022-03-18
68
+
69
+ - changed valid states
70
+
71
+ ## [0.16.6] - 2022-03-03
72
+
73
+ - check for weather in init()
74
+
75
+ ## [0.16.5] - 2022-03-03
76
+
77
+ - pyobs version
78
+
79
+ ## [0.16.4] - 2022-03-03
80
+
81
+ - changed handling of parking and setting offsets, closes #111, closes #101
82
+ - removed requests from dependencies
83
+
84
+ ## [0.16.3] - 2022-02-12
85
+
86
+ - fixed bug
87
+ - example config
88
+ - added file
89
+
90
+ ## [0.16.2] - 2022-01-18
91
+
92
+ - fixed all dependencies
93
+
94
+ ## [0.16.1] - 2022-01-18
95
+
96
+ - fixed docstrings
97
+ - added basic docs
98
+
99
+ ## [0.16.0] - 2022-01-14
100
+
101
+ - added exception handling
102
+ - set InterruptedError instead of AbortedError
103
+ - replaced AbortedError with builtin InterruptedError
104
+ - fixed exceptions
105
+ - reacting to abort event
106
+
107
+ ## [0.15.1] - 2022-01-06
108
+
109
+ - use actual timeout
110
+ - added black and pre-commit to dev dependencies
111
+ - added .pre-commit-config.yaml
112
+ - running black
113
+ - added pyproject.toml
114
+
115
+ ## [0.15.0] - 2021-12-29
116
+
117
+ - changed used Python version to 3.9
118
+ - replaced requests with aiohttp, #66
119
+ - removed self.closing in all Modules
120
+ - fixed bug
121
+ - type -> device_type and cleanup
122
+ - added some awaits
123
+ - new alpha
124
+ - added option for get_object & co to create object from type directly
125
+ - with -> async with
126
+ - alpha1
127
+ - asyncio
128
+ - github action
129
+ - changed to Poetry
130
+ - send OffsetsEvents when moving offset
131
+ - v0.14
132
+ - renamed IFitsHeaderProvider to IFitsHeaderBefore and get_fits_headers() to get_fits_header_before()
133
+ - Added type hints
134
+ - fixed IPointingAltAz
135
+ - renamed set/get_*_offsets to set/get_offsets-*
136
+ - renamed some interfaces (IPointing* and IOffsets*)
137
+ - only move when ready
138
+ - follow on parking
139
+ - don't move if in some state
140
+ - ignore move commands in certain states
141
+ - v0.13
142
+ - do nothing in park() if already parking
143
+ - allow move always
144
+ - allow dome to follow even if closed
145
+ - documentation
146
+ - added __module__
147
+ - made add_thread_func and add_child_func public
148
+ - updated docstrings
149
+ - fixed docstrings
150
+ - moved IMotion.Status to utils.enums.MotionStatus
151
+ - removed Module import from global __init__
152
+ - fixed types to make mypy happy
153
+ - fixed type hints
154
+ - set higher timeout for Park command
155
+ - correct az by 360
156
+ - catch all exceptions on get/put
157
+ - added handling ReadTimeout exception
158
+ - errors to warnings
159
+ - error handling
160
+ - customize parameter requested for alive ping
161
+ - request Connected instead of DriverVersion in connection check
162
+ - run Object.open() in open()
163
+ - logging on (dis)connect
164
+ - changed exception handling
165
+ - removed imports
166
+ - check connected on put
167
+ - status handling
168
+ - AlpacaDevice is not parent class any more but attribute
169
+ - rotate dome to az=0 on park
170
+ - wait for shutter
171
+ - no correction for az
172
+ - some error handling
173
+ - added timeout
174
+ - correct init position
175
+ - correct az by 180
176
+ - added dome
177
+ - don't correct az by 180
178
+ - initial commit
@@ -0,0 +1,35 @@
1
+ # Contributing to pyobs-alpaca
2
+
3
+ Thanks for your interest in contributing. Bug reports, questions and pull requests are welcome.
4
+
5
+ ## Reporting issues
6
+
7
+ Please use the [issue tracker](https://github.com/pyobs/pyobs-alpaca/issues). For a bug, include what you did, what you expected, what happened instead, and the version you are running. For larger changes, open an issue first so we can agree on the approach before you spend time on code.
8
+
9
+ ## Development setup
10
+
11
+ ```bash
12
+ uv sync
13
+ ```
14
+
15
+ ## Making a change
16
+
17
+ 1. Fork the repository and create a branch from `develop`.
18
+ 2. Keep the change focused. Unrelated cleanups belong in a separate pull request.
19
+ 3. Add or update tests and documentation where it makes sense.
20
+ 4. Run the checks before you push:
21
+
22
+ - `uv run ruff check .`
23
+ - `uv run black --check .`
24
+ - `uv run pyrefly check`
25
+ - `uv run pytest`
26
+
27
+ 5. Open a pull request against `develop`, not `main`. CI runs on every pull request.
28
+
29
+ ## Releases
30
+
31
+ Releases are cut by the maintainers from `main`. Notable changes are listed in [CHANGELOG.md](CHANGELOG.md).
32
+
33
+ ## License
34
+
35
+ By contributing, you agree that your contributions are licensed under the MIT License of this project.
@@ -0,0 +1,81 @@
1
+ Metadata-Version: 2.5
2
+ Name: pyobs-alpaca
3
+ Version: 2.0.2
4
+ Summary: pyobs module for ASCOM Alpaca
5
+ Project-URL: Homepage, https://www.pyobs.org
6
+ Project-URL: Documentation, https://docs.pyobs.org
7
+ Project-URL: Repository, https://github.com/pyobs/pyobs-alpaca
8
+ Project-URL: Issues, https://github.com/pyobs/pyobs-alpaca/issues
9
+ Author-email: Tim-Oliver Husser <thusser@uni-goettingen.de>
10
+ License-Expression: MIT
11
+ License-File: LICENSE
12
+ Requires-Python: >=3.11
13
+ Requires-Dist: numpy<3,>=2.2.5
14
+ Requires-Dist: pyobs-core<3,>=2.6.1
15
+ Description-Content-Type: text/markdown
16
+
17
+ ASCOM Alpaca wrapper for *pyobs*
18
+ ================================
19
+
20
+ This is a [pyobs](https://www.pyobs.org) module for wrapping devices accessible via
21
+ [ASCOM Alpaca](https://ascom-standards.org/AlpacaDeveloper/), a HTTP proxy for ASCOM. It provides
22
+ telescope, focuser and dome implementations.
23
+
24
+
25
+ Install *pyobs-alpaca*
26
+ -----------------------
27
+ Clone the repository:
28
+
29
+ git clone https://github.com/pyobs/pyobs-alpaca.git
30
+ cd pyobs-alpaca
31
+
32
+ Install it with [uv](https://docs.astral.sh/uv/):
33
+
34
+ uv sync
35
+
36
+ Alternatively, with plain `venv`/`pip`:
37
+
38
+ python3 -m venv .venv
39
+ source .venv/bin/activate
40
+ pip install .
41
+
42
+
43
+ Configuration
44
+ -------------
45
+ This is an example configuration for a telescope:
46
+
47
+ class: pyobs_alpaca.AlpacaTelescope
48
+ name: ASCOM Telescope
49
+ server: 1.2.3.4
50
+ port: 11111
51
+ device_type: telescope
52
+ device: 0
53
+ wait_for_dome: dome
54
+ weather: weather
55
+ alive_parameter: Name
56
+
57
+ And for a focusing unit:
58
+
59
+ class: pyobs_alpaca.AlpacaFocuser
60
+ name: ASCOM Focuser
61
+ server: 1.2.3.4
62
+ port: 11111
63
+ device_type: focuser
64
+ device: 0
65
+ alive_parameter: Position
66
+
67
+ And finally, for a dome:
68
+
69
+ class: pyobs_alpaca.AlpacaDome
70
+ server: 1.2.3.4
71
+ port: 11111
72
+ device_type: dome
73
+ device: 0
74
+ follow: telescope
75
+ weather: weather
76
+
77
+
78
+ Dependencies
79
+ ------------
80
+ * [pyobs-core](https://github.com/pyobs/pyobs-core) for the core functionality.
81
+ * [NumPy](https://numpy.org/) for array handling.
@@ -4,7 +4,7 @@ import time
4
4
  from typing import Any
5
5
 
6
6
  from pyobs.events import RoofClosingEvent, RoofOpenedEvent
7
- from pyobs.interfaces import AltAzState, IPointingAltAz, IReady, ReadyState
7
+ from pyobs.interfaces import AltAzState, FitsHeaderEntry, IPointingAltAz, IReady, ReadyState
8
8
  from pyobs.mixins import FollowMixin
9
9
  from pyobs.modules import timeout
10
10
  from pyobs.modules.roof import BaseDome
@@ -17,6 +17,9 @@ from .device import DEVICE_INIT_KWARGS, OBJECT_SHARED_KWARGS, AlpacaDevice
17
17
 
18
18
  log = logging.getLogger("pyobs")
19
19
 
20
+ # ASCOM Alpaca ShutterState values (ICameraV3/IDomeV2 spec).
21
+ _SHUTTER_STATUS = {0: "OPEN", 1: "CLOSED", 2: "OPENING", 3: "CLOSING", 4: "ERROR"}
22
+
20
23
 
21
24
  class AlpacaDome(BaseDome, FollowMixin):
22
25
  __module__ = "pyobs_alpaca"
@@ -55,7 +58,7 @@ class AlpacaDome(BaseDome, FollowMixin):
55
58
  self._abort_move = asyncio.Event()
56
59
 
57
60
  # status
58
- self._shutter = None
61
+ self._shutter: int | None = None
59
62
  self._altitude = 0.0
60
63
  self._azimuth = 0.0
61
64
  self._set_az = 0.0
@@ -104,6 +107,7 @@ class AlpacaDome(BaseDome, FollowMixin):
104
107
  await event_wait(self._abort_shutter, 1)
105
108
  try:
106
109
  status = await self._device.get("ShutterStatus")
110
+ self._shutter = status
107
111
  except ConnectionError:
108
112
  await self._change_motion_status(MotionStatus.UNKNOWN)
109
113
  raise exc.InitError("Could not open dome.")
@@ -150,6 +154,7 @@ class AlpacaDome(BaseDome, FollowMixin):
150
154
  await event_wait(self._abort_shutter, 1)
151
155
  try:
152
156
  status = await self._device.get("ShutterStatus")
157
+ self._shutter = status
153
158
  except ConnectionError:
154
159
  await self._change_motion_status(MotionStatus.UNKNOWN)
155
160
  raise exc.ParkError("Could not close dome.")
@@ -249,5 +254,23 @@ class AlpacaDome(BaseDome, FollowMixin):
249
254
  az -= 360
250
255
  return az
251
256
 
257
+ async def get_fits_header_before(
258
+ self, namespaces: list[str] | None = None, **kwargs: Any
259
+ ) -> dict[str, FitsHeaderEntry]:
260
+ """Returns FITS header for the current status of this module.
261
+
262
+ Args:
263
+ namespaces: If given, only return FITS headers for the given namespaces.
264
+
265
+ Returns:
266
+ Dictionary containing FITS headers.
267
+ """
268
+
269
+ hdr = await BaseDome.get_fits_header_before(self, namespaces, **kwargs)
270
+
271
+ shutter = _SHUTTER_STATUS.get(self._shutter, "UNKNOWN") if self._shutter is not None else "UNKNOWN"
272
+ hdr["DOMESHUT"] = FitsHeaderEntry(shutter, "Dome shutter status")
273
+ return hdr
274
+
252
275
 
253
276
  __all__ = ["AlpacaDome"]
@@ -3,7 +3,7 @@ import logging
3
3
  from typing import Any
4
4
 
5
5
  from pyobs.interfaces import FitsHeaderEntry, FocuserState, IFitsHeaderBefore, IFocuser, IReady, ReadyState
6
- from pyobs.mixins import MotionStatusMixin
6
+ from pyobs.mixins import FocuserHeaderMixin, MotionStatusMixin
7
7
  from pyobs.modules import Module, timeout
8
8
  from pyobs.utils import exceptions as exc
9
9
  from pyobs.utils.enums import MotionStatus
@@ -14,7 +14,7 @@ from .device import DEVICE_INIT_KWARGS, OBJECT_SHARED_KWARGS, AlpacaDevice
14
14
  log = logging.getLogger(__name__)
15
15
 
16
16
 
17
- class AlpacaFocuser(Module, MotionStatusMixin, IFocuser, IFitsHeaderBefore):
17
+ class AlpacaFocuser(FocuserHeaderMixin, Module, MotionStatusMixin, IFocuser, IFitsHeaderBefore):
18
18
  __module__ = "pyobs_alpaca"
19
19
 
20
20
  def __init__(self, **kwargs: Any):
@@ -62,13 +62,16 @@ class AlpacaFocuser(Module, MotionStatusMixin, IFocuser, IFitsHeaderBefore):
62
62
  ) -> dict[str, FitsHeaderEntry]:
63
63
  """Returns FITS header for the current status of this module."""
64
64
 
65
+ hdr = await super().get_fits_header_before(namespaces, **kwargs)
66
+
65
67
  try:
66
68
  pos = await self._device.get("Position")
67
69
  step = await self._device.get("StepSize") * 1000.0
68
- return {"TEL-FOCU": FitsHeaderEntry(pos / step, "Focus of telescope [mm]")}
70
+ hdr["TEL-FOCU"] = FitsHeaderEntry(pos / step, "Focus of telescope [mm]")
69
71
  except ConnectionError as e:
70
72
  log.warning("Could not determine focus position: %s", e)
71
- return {}
73
+
74
+ return hdr
72
75
 
73
76
  @timeout(60000)
74
77
  async def set_focus(self, focus: float, **kwargs: Any) -> None:
@@ -1,15 +1,22 @@
1
1
  [project]
2
2
  name = "pyobs-alpaca"
3
- version = "2.0.0.dev6"
3
+ version = "2.0.2"
4
4
  description = "pyobs module for ASCOM Alpaca"
5
5
  authors = [{ name = "Tim-Oliver Husser", email = "thusser@uni-goettingen.de" }]
6
6
  requires-python = ">=3.11"
7
7
  license = "MIT"
8
+ readme = "README.md"
8
9
  dependencies = [
9
10
  "numpy>=2.2.5,<3",
10
- "pyobs-core>=2.0.0.dev82,<3",
11
+ "pyobs-core>=2.6.1,<3",
11
12
  ]
12
13
 
14
+ [project.urls]
15
+ Homepage = "https://www.pyobs.org"
16
+ Documentation = "https://docs.pyobs.org"
17
+ Repository = "https://github.com/pyobs/pyobs-alpaca"
18
+ Issues = "https://github.com/pyobs/pyobs-alpaca/issues"
19
+
13
20
  [dependency-groups]
14
21
  dev = [
15
22
  "black>=25.1.0,<27",
@@ -1902,7 +1902,7 @@ wheels = [
1902
1902
 
1903
1903
  [[package]]
1904
1904
  name = "pyobs-alpaca"
1905
- version = "2.0.0.dev6"
1905
+ version = "2.0.2"
1906
1906
  source = { editable = "." }
1907
1907
  dependencies = [
1908
1908
  { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
@@ -1923,7 +1923,7 @@ dev = [
1923
1923
  [package.metadata]
1924
1924
  requires-dist = [
1925
1925
  { name = "numpy", specifier = ">=2.2.5,<3" },
1926
- { name = "pyobs-core", specifier = ">=2.0.0.dev82,<3" },
1926
+ { name = "pyobs-core", specifier = ">=2.6.1,<3" },
1927
1927
  ]
1928
1928
 
1929
1929
  [package.metadata.requires-dev]
@@ -1938,7 +1938,7 @@ dev = [
1938
1938
 
1939
1939
  [[package]]
1940
1940
  name = "pyobs-core"
1941
- version = "2.0.0.dev91"
1941
+ version = "2.10.7"
1942
1942
  source = { registry = "https://pypi.org/simple" }
1943
1943
  dependencies = [
1944
1944
  { name = "aiohttp" },
@@ -1970,28 +1970,28 @@ dependencies = [
1970
1970
  { name = "tenacity" },
1971
1971
  { name = "typing-extensions" },
1972
1972
  ]
1973
- sdist = { url = "https://files.pythonhosted.org/packages/60/62/d1fd0cf3151bfea63d84f6b54347be5791e91b5deee519cd34e64f9f1738/pyobs_core-2.0.0.dev91.tar.gz", hash = "sha256:4fe3e77fee9ddedbeba58414bd4931afbf5172abd42a589440865ea401f1aa47", size = 367177, upload-time = "2026-08-21T07:40:29.948Z" }
1973
+ sdist = { url = "https://files.pythonhosted.org/packages/7e/db/b197375974c8436095fdfa53db228e1e8b323f12183433ee960c99e96cef/pyobs_core-2.10.7.tar.gz", hash = "sha256:2bd17b1ea609692c6f8925f2d80afc515ac2209b807205ffaa9129730321116e", size = 424175, upload-time = "2026-09-23T18:20:53.969Z" }
1974
1974
  wheels = [
1975
- { url = "https://files.pythonhosted.org/packages/48/24/e4b2e9b5550561832db50bbcb18ecaf6b18df245bce6ba9926cb9e925760/pyobs_core-2.0.0.dev91-py3-none-any.whl", hash = "sha256:bc5a08c3eca102c460938b590a3183453e101950f4ca1250e0bc974c5e6caa86", size = 590331, upload-time = "2026-08-21T07:40:28.132Z" },
1975
+ { url = "https://files.pythonhosted.org/packages/52/4e/ebdb9836eae127a70ab9fd618eb7782394158592cb35b5a97ff133cfa757/pyobs_core-2.10.7-py3-none-any.whl", hash = "sha256:14cfea0a0633ba31593323ff0bff919d9510b987369e0cc3f758a948f9dd396e", size = 656647, upload-time = "2026-09-23T18:20:52.624Z" },
1976
1976
  ]
1977
1977
 
1978
1978
  [[package]]
1979
1979
  name = "pyrefly"
1980
- version = "1.2.0"
1980
+ version = "1.3.1"
1981
1981
  source = { registry = "https://pypi.org/simple" }
1982
- sdist = { url = "https://files.pythonhosted.org/packages/89/01/a86e9f24722b095c3f88e3616132b75a21b0df53804bdc6a45314dd4d93c/pyrefly-1.2.0.tar.gz", hash = "sha256:5485f960fc2481617068c918335c39ab1507ef90b6b5bd35bf57726e60e73185", size = 6243654, upload-time = "2026-08-01T02:56:27.592Z" }
1982
+ sdist = { url = "https://files.pythonhosted.org/packages/4c/7e/082cc1b392318bacfbc087732524f3e089e9e7fe45b7645c4649b6f1f1e9/pyrefly-1.3.1.tar.gz", hash = "sha256:b774f1dfac82867fc16fe2175d80a630e2a72a6835d5b7e492568d6bfb6b05e7", size = 6679145, upload-time = "2026-09-15T05:09:34.49Z" }
1983
1983
  wheels = [
1984
- { url = "https://files.pythonhosted.org/packages/7d/9d/3c0ef1d4843987b22f996ed381ec9cf5a3b1273e29804db276252e4c95eb/pyrefly-1.2.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:7f46d983ac49ddd2b043694960a01dc6a19a5cfd8eec609d6bd9c42866f91b4e", size = 14026305, upload-time = "2026-08-01T02:56:02.611Z" },
1985
- { url = "https://files.pythonhosted.org/packages/0a/06/03bbb78fbea54cdc65b626619f3597d5611aca4fdef11e72a4e8360e7e63/pyrefly-1.2.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:756f669b5555090f5c1a4fef30db1785fabe657764f7e4e6dc88994dfb8ca82d", size = 13463880, upload-time = "2026-08-01T02:56:04.93Z" },
1986
- { url = "https://files.pythonhosted.org/packages/13/5a/7d8bc00a38e93bbc9c3e7bd14d305f7948717e667c9bcddeab9dd42fd255/pyrefly-1.2.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3465812ce5ef4781fb592edbf2724547296f0a3124be115d73c7e8b2401862d", size = 13907329, upload-time = "2026-08-01T02:56:07.104Z" },
1987
- { url = "https://files.pythonhosted.org/packages/be/94/9e08b4bf799d0b8f36b55a2783c7ba5f51730cf0632a85a67b5b5ed876cd/pyrefly-1.2.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5de7b2ad2bba5c8055181681a84b74143eac2234a48ba5d1b7ed7e7a722b02bd", size = 15039020, upload-time = "2026-08-01T02:56:09.208Z" },
1988
- { url = "https://files.pythonhosted.org/packages/5b/bd/bca5fd0c80f4daf8ee6903a29df9f3de1feb05ff0946b8f35ec8c5096b13/pyrefly-1.2.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25822ea9505f589ea8a725e4268b475132fb89e038fbf092e446510443ac142a", size = 14986199, upload-time = "2026-08-01T02:56:11.924Z" },
1989
- { url = "https://files.pythonhosted.org/packages/97/f7/f07087f3d185ad2eced0c56cef89ca5474dfb4ff25f146cd50a861c97553/pyrefly-1.2.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90efe75e17491ef5d636e10469e9278d7d0256b3b4c5e1f4750069bf3ae0f5d1", size = 14393715, upload-time = "2026-08-01T02:56:14.143Z" },
1990
- { url = "https://files.pythonhosted.org/packages/d3/70/0d142c320e284b9e3ce35e9b1e58b8ce2ee1f578f2a7234bc30e5022b94f/pyrefly-1.2.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:368aaf7eee4f511ddc0f8e564cf14e01ab2f10b0db9105c6d5b153bf498d07bf", size = 13933008, upload-time = "2026-08-01T02:56:16.525Z" },
1991
- { url = "https://files.pythonhosted.org/packages/5d/e8/e84f11b6e1f63fd453ad3654213b9a0f6f4de8cef6b58038eef2d0d5955d/pyrefly-1.2.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d52d5da7bc65fb7675fbaa80eda879d4f8787c494f04cac21603330d3abbdbbe", size = 14431827, upload-time = "2026-08-01T02:56:18.645Z" },
1992
- { url = "https://files.pythonhosted.org/packages/0f/06/810d31380f66c75e1c0779a408d3b16117b1b368b57894f6aa66bef21686/pyrefly-1.2.0-py3-none-win32.whl", hash = "sha256:8c90751de8506d938e8f802659c74cf35bd7a0036510ee6c634a38eebb280bfa", size = 13229447, upload-time = "2026-08-01T02:56:20.921Z" },
1993
- { url = "https://files.pythonhosted.org/packages/ed/98/4dafa3c7a1caed2dc8cc708dde09ba27963c7736508f55b626fff3024113/pyrefly-1.2.0-py3-none-win_amd64.whl", hash = "sha256:8a8964c224ccc4882730130955815de21ff443c1ac3f0b90685b19bf63848170", size = 14087387, upload-time = "2026-08-01T02:56:23.188Z" },
1994
- { url = "https://files.pythonhosted.org/packages/1b/1c/df3cb0a2e5591660ded7a1836cd2f29dc48c91adb1c0a3a700a96f6d09e1/pyrefly-1.2.0-py3-none-win_arm64.whl", hash = "sha256:3a90bb8df39dfbac74b1f3b2e9d7c526b8f80568884c3944d955023a73ebf61e", size = 13430873, upload-time = "2026-08-01T02:56:25.425Z" },
1984
+ { url = "https://files.pythonhosted.org/packages/6b/bc/f09b5bd7eed796349bd93627aa2c3086df7ed0a114dafc3d2b2841599ee7/pyrefly-1.3.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0a2a7dfed824fb066aa8a7c8d856c152b98e998fb84b954d5f892fb9834c0bd1", size = 15090117, upload-time = "2026-09-15T05:08:58.477Z" },
1985
+ { url = "https://files.pythonhosted.org/packages/78/24/a31e7de8e0f310c9f0753826d0df8b6a8ff86793941a6bd88ba24b735633/pyrefly-1.3.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:37a1a1fb41e7190fe3964a877875dd809d6ee2887809e2c3d6e5f25a69805bfd", size = 14430773, upload-time = "2026-09-15T05:09:01.67Z" },
1986
+ { url = "https://files.pythonhosted.org/packages/75/e1/022352beb186f36d6213a95a975c42676ee418ff5e730629378d25564c5e/pyrefly-1.3.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45b7650bc651a5a784701f2fb4f579da9a421c4d1b5fd91f9048f4529e46093c", size = 14877762, upload-time = "2026-09-15T05:09:04.767Z" },
1987
+ { url = "https://files.pythonhosted.org/packages/19/2c/d62a1b445aad1fd46375b83393b8a67da53883aeeba73d269ce71b3e8fd1/pyrefly-1.3.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad57f38bc73679c14a5f62995a2bd3bc43649b7270c858487e2eab78a6f95362", size = 16118225, upload-time = "2026-09-15T05:09:07.828Z" },
1988
+ { url = "https://files.pythonhosted.org/packages/32/67/3c3fa8a13e3ce8d8322ffb3627255a41a52261f17793e1a24e9214f10857/pyrefly-1.3.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3506b1252e9f5d755d0693c5a46d46b85579d36534f6e22a41eb8e098d0dde90", size = 16051197, upload-time = "2026-09-15T05:09:10.81Z" },
1989
+ { url = "https://files.pythonhosted.org/packages/19/d1/84f81b9e32288b5d11c75e006f67e0f6b78b85da575673bd1a21524c8172/pyrefly-1.3.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39d5a17c1ad655e5f93a6e8e0be90b8db28c6015fe07d6ed4e054891c9e14ef8", size = 15440062, upload-time = "2026-09-15T05:09:14.641Z" },
1990
+ { url = "https://files.pythonhosted.org/packages/46/3c/2aa0c5ad6a2957a728bb38cfab70d1e9cafad21b0b1c1d92df74a3cf22bd/pyrefly-1.3.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c61e9dcf888beb81ca0e0c60ea4442640fdcf2f1f65bfe3d9f5d89b85516eb03", size = 14898534, upload-time = "2026-09-15T05:09:17.823Z" },
1991
+ { url = "https://files.pythonhosted.org/packages/03/5d/2974f249fb2e285f966485719d977c5a2248cc4866403af94d935775ff15/pyrefly-1.3.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a78eed1c53f37807f0e2997be8edbe833b91eb9915f2cb553a1bdcd599e7105c", size = 15477758, upload-time = "2026-09-15T05:09:20.964Z" },
1992
+ { url = "https://files.pythonhosted.org/packages/68/79/d31f8f0abf5b0610ec24183286ee8a1ee5b76c9aaaa91091399d7e1aaf60/pyrefly-1.3.1-py3-none-win32.whl", hash = "sha256:ea0d0349f1bc80fe8e00a7b3640e40db7486398b685f87b9bd5d2207063668f0", size = 14133005, upload-time = "2026-09-15T05:09:25.03Z" },
1993
+ { url = "https://files.pythonhosted.org/packages/3f/23/1859f47f536314755d80c4ec2a76d2698435ae8b73604bcd1dfa57ecb39b/pyrefly-1.3.1-py3-none-win_amd64.whl", hash = "sha256:4c24e7d99df9237916c33be23714219a7c8eaf22bad2ac0c3e1d45adcf7df8fb", size = 15066557, upload-time = "2026-09-15T05:09:28.265Z" },
1994
+ { url = "https://files.pythonhosted.org/packages/92/2a/73e3721921c2bb2c950a9f8c362ee5e2367556b5d4416eb4f8f88503e66f/pyrefly-1.3.1-py3-none-win_arm64.whl", hash = "sha256:1ed85e2b957a78e93353125d890ce3668ce450e49b74025a15c87b6e8ec7f3d1", size = 14348209, upload-time = "2026-09-15T05:09:31.422Z" },
1995
1995
  ]
1996
1996
 
1997
1997
  [[package]]
@@ -2196,27 +2196,27 @@ wheels = [
2196
2196
 
2197
2197
  [[package]]
2198
2198
  name = "ruff"
2199
- version = "0.16.4"
2200
- source = { registry = "https://pypi.org/simple" }
2201
- sdist = { url = "https://files.pythonhosted.org/packages/00/8f/d8074b1f25e003164087a8bfe79a0f1a3945135764dbb6aaab04103dcaf9/ruff-0.16.4.tar.gz", hash = "sha256:13171aa9d9af2240ee3504e639de73122c67e74036de5ba2e1d01422cd17e3dc", size = 4899731, upload-time = "2026-08-20T17:43:59.196Z" }
2202
- wheels = [
2203
- { url = "https://files.pythonhosted.org/packages/ff/80/779895ef584e089d22f2c6df0d0e99a65ec2df0805f1fffd439415b8c1f0/ruff-0.16.4-py3-none-linux_armv6l.whl", hash = "sha256:df4075f71ddac40b9934af60c3ec8a53047dd5a5fdc43224e6e4e8e9a27cb6f7", size = 10006909, upload-time = "2026-08-20T17:43:16.888Z" },
2204
- { url = "https://files.pythonhosted.org/packages/a9/e6/f553199b5e8927a05cb5c422d921fd0656b29ab976e91c44802107c6b0da/ruff-0.16.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0c95538517af68004306b0fb3214ff2f2af67a65092aee77cd9eb86db6656604", size = 10240201, upload-time = "2026-08-20T17:43:19.337Z" },
2205
- { url = "https://files.pythonhosted.org/packages/1c/70/4a6dc4bb34da4dee35e30f09bbd1bfbdd26f33b62fb9b8df31f08a199cd2/ruff-0.16.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:963f83df8e69e575b64d67dd447ebbc917db41a14bf38d4593a4183e7aaa8255", size = 9835122, upload-time = "2026-08-20T17:43:21.708Z" },
2206
- { url = "https://files.pythonhosted.org/packages/24/12/c6e22d686372c15bcb7af99831f1a1be96df696491babf4f24e4f942c527/ruff-0.16.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32a5057c7ff3f6e6480a48fccfb3a412a690f48a3d03ac5cf08177d6c2da3ade", size = 9977162, upload-time = "2026-08-20T17:43:24.236Z" },
2207
- { url = "https://files.pythonhosted.org/packages/46/49/72b10ec912f5ab5854992eaf7aa7cd36729b6937d9dc4e0fb41b3bf428ec/ruff-0.16.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b3dce8d9b0c57c265b91885a66a567d8ea1372e8eb4e250fa8e5e3f579e99cff", size = 9829789, upload-time = "2026-08-20T17:43:26.966Z" },
2208
- { url = "https://files.pythonhosted.org/packages/fa/80/0f30e32e7f6ee26edc39075502db9d368d788a44a79b55f763eb4ab03796/ruff-0.16.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7dc651db49283c69f8e72c834eec4fe5573e4c646856aebece0ce385dceb2a80", size = 10527949, upload-time = "2026-08-20T17:43:29.384Z" },
2209
- { url = "https://files.pythonhosted.org/packages/52/3d/86e8ad3542169e56cac3859a343afdb9df2ad54d35a59ce1e67baee83421/ruff-0.16.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3817b87dbcabc92f13b05019257c5b89b5b4d51b5fb20f56fb5235ceb723cd07", size = 11333695, upload-time = "2026-08-20T17:43:31.872Z" },
2210
- { url = "https://files.pythonhosted.org/packages/d0/16/481c29b380c20a0054a8261066665e1b3488e23636c49d0a43e75975b9bb/ruff-0.16.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9fce1499134b2c8c68e5166f95705a5812062bb93aacc5f9873bb1a27084bc7", size = 10727741, upload-time = "2026-08-20T17:43:34.596Z" },
2211
- { url = "https://files.pythonhosted.org/packages/5e/b6/56bc0b8cf45b54b28b3a5e6381c8945d51b5b18adf659454c32295209a31/ruff-0.16.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2d812e482f5a7e02eee26cd73d2a37ebbdf47d795ea63ba1b89110ae93e9fb3", size = 10286522, upload-time = "2026-08-20T17:43:37.288Z" },
2212
- { url = "https://files.pythonhosted.org/packages/e8/8b/b345b4fb110f2fbe2bd31eabd271e5e8b3b7e4ee6c0e02f2dc6be78db000/ruff-0.16.4-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:6baaf984aa7976edf93d3b627fe2d1d22ee94bbca05fa6f90fc76d73924e3454", size = 10584182, upload-time = "2026-08-20T17:43:39.984Z" },
2213
- { url = "https://files.pythonhosted.org/packages/29/e5/827b34041c35f58774a9681a4213994c164fc987800f4dddabcf451da0bf/ruff-0.16.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:bdfcf0b28662eb890372d50f92c283bb94e67e7635ed93c7fd533970acff7b2b", size = 10134195, upload-time = "2026-08-20T17:43:42.351Z" },
2214
- { url = "https://files.pythonhosted.org/packages/0f/10/d0bffcdd6729b87afc82ba0ef377173356a7dc8e972f5179968cf2fdf98c/ruff-0.16.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:b66b02cb9b04f537643cadf5768e5f98dc461890d530cb67113d71c8c76e605d", size = 9825821, upload-time = "2026-08-20T17:43:44.532Z" },
2215
- { url = "https://files.pythonhosted.org/packages/f5/32/0db2a863b796ca62d83e92a07a3ccf00921b14db02059347576a2fda3d4b/ruff-0.16.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:8528bf9a4b291a60bf02ea453511e8ce6215bd2b982ee80405b66b008b6c30a0", size = 10267658, upload-time = "2026-08-20T17:43:46.989Z" },
2216
- { url = "https://files.pythonhosted.org/packages/b2/a0/fbdeb59e48c6261f523e56c8f12e9c08fbe693786595cc7e3959207a9232/ruff-0.16.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:fbd85d2875fdd67e833213a651f613bbf25303abf6aa822a5121f4531195678d", size = 10697071, upload-time = "2026-08-20T17:43:49.891Z" },
2217
- { url = "https://files.pythonhosted.org/packages/aa/28/0c6dd865859c6d17bc8ccc34cb72b0e02d6c7eb25e8a1e22b5bea681e2c0/ruff-0.16.4-py3-none-win32.whl", hash = "sha256:312769988007aaeb8e189b443ccdd03c0e6374489e053467be6d96518ebff76e", size = 10021687, upload-time = "2026-08-20T17:43:52.281Z" },
2218
- { url = "https://files.pythonhosted.org/packages/a3/03/e724450f621698117f9aa6dd241c94d0274ae96781378dc86745ae29f0e7/ruff-0.16.4-py3-none-win_amd64.whl", hash = "sha256:05d9d27a18c4bcbefada602480ec9e01e0bc949d432e0ced5df77edac195919c", size = 10567657, upload-time = "2026-08-20T17:43:54.78Z" },
2219
- { url = "https://files.pythonhosted.org/packages/0e/fe/da8b9e1347696bb22120b77280ec5ce25d500ca5cb39d5ad6e5c18de19c1/ruff-0.16.4-py3-none-win_arm64.whl", hash = "sha256:a3a61621c9b6f6a89573e938a080e648f1695baa3f58570a3a707bc51ff65a21", size = 10451579, upload-time = "2026-08-20T17:43:57.135Z" },
2199
+ version = "0.16.9"
2200
+ source = { registry = "https://pypi.org/simple" }
2201
+ sdist = { url = "https://files.pythonhosted.org/packages/96/bf/c935ca98e73fe8ce65b87ef08a280c0c1e85295d569228c15e87d8fdfaf1/ruff-0.16.9.tar.gz", hash = "sha256:12b625c6cfba78d285d9f48eda5f053374f1e53cb10ef17342a383750db99161", size = 4948764, upload-time = "2026-09-24T20:37:49.416Z" }
2202
+ wheels = [
2203
+ { url = "https://files.pythonhosted.org/packages/0d/26/df51322b52ee1ada7eff2d071ea09d11d5c2d1dcc9f02594f5785c4d1635/ruff-0.16.9-py3-none-linux_armv6l.whl", hash = "sha256:95e6f022090368ab3b824c36276839c53b2adf1a3f4c09fefc33dfc400f6da96", size = 10082922, upload-time = "2026-09-24T20:37:13.045Z" },
2204
+ { url = "https://files.pythonhosted.org/packages/a5/27/7bf51f5a7aa375e9f339280a303aab44ca75dc1525f1cdc5991761685b0f/ruff-0.16.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a5f27be168556594a86d2f415db0cf43f5291917849318f873c7e2791f7a8c67", size = 10236360, upload-time = "2026-09-24T20:37:16.049Z" },
2205
+ { url = "https://files.pythonhosted.org/packages/b6/63/09659283f92f02dff45809da194a70da2f688d87c55d8875c4fae3536072/ruff-0.16.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1632eb1d6197f33bd00b1acbc5b71009e89a8895c158e2d2b03a834fac964ab6", size = 9892940, upload-time = "2026-09-24T20:37:17.957Z" },
2206
+ { url = "https://files.pythonhosted.org/packages/24/58/98de1b72ec172f5f8f1731236fe21585b3998bf7dfe9fcc44ae9ba626012/ruff-0.16.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3f951b14d865d5952c89d40a5ca07e87abe24fa5453299878411e127748fb1c", size = 10032114, upload-time = "2026-09-24T20:37:19.942Z" },
2207
+ { url = "https://files.pythonhosted.org/packages/c8/7d/f1e17c54ab59d4bad1dce8ee3e22a7a1d0ef4745240decacdcf3832b5bb2/ruff-0.16.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:447fc07e1573afff7cb02803462b12b6c8ece7cf10e2cd78565fa6d7a1c0bf8d", size = 9910227, upload-time = "2026-09-24T20:37:21.872Z" },
2208
+ { url = "https://files.pythonhosted.org/packages/34/19/436f647a65075bbd3bab2668b3bdaa5120559b294694018cdcefabbbf30b/ruff-0.16.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a3e039a6a40ed976c491722b60e0ae4a4aa1a86057f540ee7a37a5d19ae9120", size = 10547484, upload-time = "2026-09-24T20:37:24.229Z" },
2209
+ { url = "https://files.pythonhosted.org/packages/03/59/38430a6bc2f6d8095447ac39625cf8b6e9344a47e6c26225c8ba1bff3ffb/ruff-0.16.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4684dded7db60aa57cb118fa158630f5feade4af5782903b6053484bdf9bd129", size = 11412367, upload-time = "2026-09-24T20:37:26.307Z" },
2210
+ { url = "https://files.pythonhosted.org/packages/c8/bd/bbb6d7fc7f208c8b8c50dd5dc8206e4cfdb1e7a8fb852606a3adf370c880/ruff-0.16.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d29c934357e45642fda2f34c0b1f4025b4a6c01e15e4bf0016879d60078a142c", size = 10869787, upload-time = "2026-09-24T20:37:28.35Z" },
2211
+ { url = "https://files.pythonhosted.org/packages/bc/b8/9c543074918061abbefc3bd139bee22de35abedb00dde0f2d27288838962/ruff-0.16.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a21713e629d3e5bdb2f5c2def1cc7f04f47fa8e1a7eb0571b4a28e1da64bc728", size = 10406494, upload-time = "2026-09-24T20:37:30.624Z" },
2212
+ { url = "https://files.pythonhosted.org/packages/35/7a/5a8851bd146e7ccf8fd4b003f6c75c11f8fbdb0e60673b45097986b6bf41/ruff-0.16.9-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:7baa24ef5fc8e77aa93879e1d3f43754a01ae488e869f1ae30cf431afd4d2452", size = 10590083, upload-time = "2026-09-24T20:37:32.439Z" },
2213
+ { url = "https://files.pythonhosted.org/packages/87/f0/4c3467188f23f806960b46fa76575a7cd0514c9ba90562650b71efc96980/ruff-0.16.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a41aac6230aadfaa133bdfa1614488531ffa3e0837567ae04c0da2058a9c0f9e", size = 10119151, upload-time = "2026-09-24T20:37:34.581Z" },
2214
+ { url = "https://files.pythonhosted.org/packages/15/34/5a4def5adea572ce6aea0bb64f21f928ee317b80e0db747d7979b01d7261/ruff-0.16.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:c2529fb5896d49115b0e9aa8f887490b34bbe76baf879ec2264ac59406869ce7", size = 9911544, upload-time = "2026-09-24T20:37:36.796Z" },
2215
+ { url = "https://files.pythonhosted.org/packages/62/5d/d15ebea7499eef9373318c0ee6ca127832927c6529731f6d48e18dce7ca9/ruff-0.16.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:41e3870277694177429b56406d65dfbdb2c2802c52b715edaf6a0b829c69d4ee", size = 10269884, upload-time = "2026-09-24T20:37:38.857Z" },
2216
+ { url = "https://files.pythonhosted.org/packages/d1/56/c5d3cd119ded7a3c7aba0e961b69cb3df701c91662c98ad694467d060ce1/ruff-0.16.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:8adbe4e58af167f767d7b2ba5e83c42e878350796cf78c2f5e14ab9903a92588", size = 10749366, upload-time = "2026-09-24T20:37:41.042Z" },
2217
+ { url = "https://files.pythonhosted.org/packages/ac/fe/734ec7527029ac757ecf821f143c9f3fcf69149c21f53a044a899b430f5a/ruff-0.16.9-py3-none-win32.whl", hash = "sha256:0e1dbc2073624dee6618d41d0098690a7244654af746704b64759e12b6b6b385", size = 10152355, upload-time = "2026-09-24T20:37:43.025Z" },
2218
+ { url = "https://files.pythonhosted.org/packages/14/21/26e4643629b3ebb44f0a06f9c9a53058d63d989415f63a9a3c28e2ee7f22/ruff-0.16.9-py3-none-win_amd64.whl", hash = "sha256:6bd40fec8cd4c8a3d4dd589bd8ad4e6320c13c29234159bfd959a40d529d597b", size = 10592965, upload-time = "2026-09-24T20:37:44.944Z" },
2219
+ { url = "https://files.pythonhosted.org/packages/51/60/5fb1a39dbb5ae314d5f59bc7348a63c1d5c20f3cd83914c4b5cb0be31d2d/ruff-0.16.9-py3-none-win_arm64.whl", hash = "sha256:ed1a252039200f57a59eebc063b54beabea67bfbaaca0eeaa7f54b5fbcda2284", size = 10458649, upload-time = "2026-09-24T20:37:46.882Z" },
2220
2220
  ]
2221
2221
 
2222
2222
  [[package]]
@@ -1,2 +0,0 @@
1
- v1.0.0 (2022-09-13)
2
- *******************
@@ -1,10 +0,0 @@
1
- Metadata-Version: 2.5
2
- Name: pyobs-alpaca
3
- Version: 2.0.0.dev6
4
- Summary: pyobs module for ASCOM Alpaca
5
- Author-email: Tim-Oliver Husser <thusser@uni-goettingen.de>
6
- License-Expression: MIT
7
- License-File: LICENSE
8
- Requires-Python: >=3.11
9
- Requires-Dist: numpy<3,>=2.2.5
10
- Requires-Dist: pyobs-core<3,>=2.0.0.dev82
File without changes
File without changes