python-bsblan 4.2.0__tar.gz → 4.2.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 (101) hide show
  1. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/workflows/codeql.yaml +2 -2
  2. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/workflows/stale.yaml +1 -1
  3. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/PKG-INFO +1 -1
  4. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/pyproject.toml +4 -3
  5. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/src/bsblan/__init__.py +2 -0
  6. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/src/bsblan/bsblan.py +4 -4
  7. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/src/bsblan/models.py +35 -16
  8. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_entity_info.py +16 -3
  9. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_state.py +1 -1
  10. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/uv.lock +87 -78
  11. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.editorconfig +0 -0
  12. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.gitattributes +0 -0
  13. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/CODE_OF_CONDUCT.md +0 -0
  14. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/CONTRIBUTING.md +0 -0
  15. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/ISSUE_TEMPLATE/PULL_REQUEST_TEMPLATE.md +0 -0
  16. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  17. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  18. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/copilot-instructions.md +0 -0
  19. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/labels.yml +0 -0
  20. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/prompts/add-parameter.prompt.md +0 -0
  21. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/prompts/code-review.prompt.md +0 -0
  22. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/release-drafter.yml +0 -0
  23. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/renovate.json +0 -0
  24. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/skills/bsblan-parameters/SKILL.md +0 -0
  25. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/skills/bsblan-testing/SKILL.md +0 -0
  26. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/workflows/auto-approve-renovate.yml +0 -0
  27. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/workflows/labels.yaml +0 -0
  28. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/workflows/linting.yaml +0 -0
  29. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/workflows/lock.yaml +0 -0
  30. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/workflows/pr-labels.yaml +0 -0
  31. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/workflows/release-drafter.yaml +0 -0
  32. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/workflows/release.yaml +0 -0
  33. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/workflows/tests.yaml +0 -0
  34. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.github/workflows/typing.yaml +0 -0
  35. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.gitignore +0 -0
  36. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.nvmrc +0 -0
  37. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.pre-commit-config.yaml +0 -0
  38. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.prettierignore +0 -0
  39. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/.yamllint +0 -0
  40. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/AGENTS.md +0 -0
  41. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/CLAUDE.md +0 -0
  42. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/LICENSE.md +0 -0
  43. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/README.md +0 -0
  44. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/examples/control.py +0 -0
  45. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/examples/discovery.py +0 -0
  46. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/examples/profile_init.py +0 -0
  47. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/examples/ruff.toml +0 -0
  48. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/examples/speed_test.py +0 -0
  49. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/package-lock.json +0 -0
  50. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/package.json +0 -0
  51. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/sonar-project.properties +0 -0
  52. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/src/bsblan/constants.py +0 -0
  53. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/src/bsblan/exceptions.py +0 -0
  54. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/src/bsblan/py.typed +0 -0
  55. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/src/bsblan/utility.py +0 -0
  56. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/__init__.py +0 -0
  57. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/conftest.py +0 -0
  58. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/fixtures/device.json +0 -0
  59. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/fixtures/dict_version.json +0 -0
  60. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/fixtures/hot_water_state.json +0 -0
  61. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/fixtures/info.json +0 -0
  62. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/fixtures/password.txt +0 -0
  63. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/fixtures/sensor.json +0 -0
  64. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/fixtures/state.json +0 -0
  65. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/fixtures/static_state.json +0 -0
  66. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/fixtures/thermostat_hvac.json +0 -0
  67. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/fixtures/thermostat_temp.json +0 -0
  68. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/fixtures/time.json +0 -0
  69. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/ruff.toml +0 -0
  70. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_api_initialization.py +0 -0
  71. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_api_validation.py +0 -0
  72. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_auth.py +0 -0
  73. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_backoff_retry.py +0 -0
  74. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_bsblan.py +0 -0
  75. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_bsblan_edge_cases.py +0 -0
  76. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_configuration.py +0 -0
  77. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_constants.py +0 -0
  78. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_context_manager.py +0 -0
  79. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_device.py +0 -0
  80. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_dhw_time_switch.py +0 -0
  81. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_entity_info_ha.py +0 -0
  82. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_hot_water_additional.py +0 -0
  83. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_hotwater_state.py +0 -0
  84. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_include_parameter.py +0 -0
  85. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_info.py +0 -0
  86. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_initialization.py +0 -0
  87. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_read_parameters.py +0 -0
  88. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_reset_validation.py +0 -0
  89. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_schedule_models.py +0 -0
  90. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_sensor.py +0 -0
  91. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_set_hot_water_schedule.py +0 -0
  92. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_set_hotwater.py +0 -0
  93. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_static_state.py +0 -0
  94. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_temperature_unit.py +0 -0
  95. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_temperature_validation.py +0 -0
  96. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_thermostat.py +0 -0
  97. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_time.py +0 -0
  98. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_utility.py +0 -0
  99. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_utility_additional.py +0 -0
  100. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_utility_edge_cases.py +0 -0
  101. {python_bsblan-4.2.0 → python_bsblan-4.2.1}/tests/test_version_errors.py +0 -0
@@ -24,6 +24,6 @@ jobs:
24
24
  - name: ⤵️ Check out code from GitHub
25
25
  uses: actions/checkout@v6.0.2
26
26
  - name: 🏗 Initialize CodeQL
27
- uses: github/codeql-action/init@v4.32.2
27
+ uses: github/codeql-action/init@v4.32.3
28
28
  - name: 🚀 Perform CodeQL Analysis
29
- uses: github/codeql-action/analyze@v4.32.2
29
+ uses: github/codeql-action/analyze@v4.32.3
@@ -17,7 +17,7 @@ jobs:
17
17
  runs-on: ubuntu-latest
18
18
  steps:
19
19
  - name: 🚀 Run stale
20
- uses: actions/stale@v10.1.1
20
+ uses: actions/stale@v10.2.0
21
21
  with:
22
22
  repo-token: ${{ secrets.GITHUB_TOKEN }}
23
23
  days-before-stale: 30
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: python-bsblan
3
- Version: 4.2.0
3
+ Version: 4.2.1
4
4
  Summary: Asynchronous Python client for BSBLAN API
5
5
  Project-URL: Homepage, https://github.com/liudger/python-bsblan
6
6
  Project-URL: Repository, https://github.com/liudger/python-bsblan
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "python-bsblan"
3
- version = "4.2.0"
3
+ version = "4.2.1"
4
4
  description = "Asynchronous Python client for BSBLAN API"
5
5
  authors = [
6
6
  {name = "Willem-Jan van Rootselaar", email = "liudgervr@gmail.com"}
@@ -148,6 +148,7 @@ ignore = [
148
148
  "D213", # Conflicts with other rules
149
149
  "D417", # False positives in some occasions
150
150
  "PLR2004", # Just annoying, not really useful
151
+ "UP046", # Generic subclass style kept for mashumaro compatibility
151
152
 
152
153
  # Conflicts with the Ruff formatter
153
154
  "COM812",
@@ -189,7 +190,7 @@ dev = [
189
190
  # hatch is required to support type hinting and proper packaging of the py.typed file.
190
191
  "hatch>=1.14.1",
191
192
  "isort==7.0.0",
192
- "ty==0.0.16",
193
+ "ty==0.0.17",
193
194
  "pre-commit==4.5.1",
194
195
  "pre-commit-hooks==6.0.0",
195
196
  "pylint==4.0.4",
@@ -198,7 +199,7 @@ dev = [
198
199
  "pytest-cov==7.0.0",
199
200
  "pytest-xdist>=3.8.0",
200
201
  "pyupgrade==3.21.2",
201
- "ruff==0.15.0",
202
+ "ruff==0.15.1",
202
203
  "safety==3.7.0",
203
204
  "vulture==2.14",
204
205
  "yamllint==1.38.0",
@@ -16,6 +16,7 @@ from .models import (
16
16
  DHWSchedule,
17
17
  DHWTimeSwitchPrograms,
18
18
  EntityInfo,
19
+ EntityValue,
19
20
  HotWaterConfig,
20
21
  HotWaterSchedule,
21
22
  HotWaterState,
@@ -41,6 +42,7 @@ __all__ = [
41
42
  "Device",
42
43
  "DeviceTime",
43
44
  "EntityInfo",
45
+ "EntityValue",
44
46
  "HVACActionCategory",
45
47
  "HeatingCircuitStatus",
46
48
  "HotWaterConfig",
@@ -524,8 +524,8 @@ class BSBLAN:
524
524
  try:
525
525
  static_values = await self.static_values()
526
526
  if static_values.min_temp is not None:
527
- self._min_temp = float(static_values.min_temp.value)
528
- logger.debug("Min temperature initialized: %f", self._min_temp)
527
+ self._min_temp = static_values.min_temp.value # type: ignore[assignment]
528
+ logger.debug("Min temperature initialized: %s", self._min_temp)
529
529
  else:
530
530
  logger.warning(
531
531
  "min_temp not available from device, "
@@ -533,8 +533,8 @@ class BSBLAN:
533
533
  )
534
534
 
535
535
  if static_values.max_temp is not None:
536
- self._max_temp = float(static_values.max_temp.value)
537
- logger.debug("Max temperature initialized: %f", self._max_temp)
536
+ self._max_temp = static_values.max_temp.value # type: ignore[assignment]
537
+ logger.debug("Max temperature initialized: %s", self._max_temp)
538
538
  else:
539
539
  logger.warning(
540
540
  "max_temp not available from device, "
@@ -7,7 +7,7 @@ from contextlib import suppress
7
7
  from dataclasses import dataclass, field
8
8
  from datetime import time
9
9
  from enum import IntEnum
10
- from typing import Any, Final
10
+ from typing import Final, Generic, TypeVar, cast
11
11
 
12
12
  from mashumaro.mixins.json import DataClassJSONMixin
13
13
 
@@ -20,6 +20,12 @@ from bsblan.constants import (
20
20
  # Maximum number of time slots per day supported by BSB-LAN
21
21
  MAX_TIME_SLOTS_PER_DAY: Final[int] = 3
22
22
 
23
+ # All possible EntityInfo value types after conversion
24
+ EntityValue = float | int | str | time
25
+
26
+ # TypeVar for EntityInfo generic
27
+ T = TypeVar("T", bound=EntityValue)
28
+
23
29
 
24
30
  @dataclass
25
31
  class TimeSlot:
@@ -213,15 +219,25 @@ class DataType(IntEnum):
213
219
 
214
220
 
215
221
  @dataclass
216
- class EntityInfo(DataClassJSONMixin):
222
+ class EntityInfo(DataClassJSONMixin, Generic[T]):
217
223
  """Convert Data to valid keys and convert to object attributes.
218
224
 
219
225
  This object holds info about specific objects and handles automatic type conversion
220
226
  based on data_type and unit.
221
227
 
228
+ The generic parameter ``T`` indicates the expected value type after conversion:
229
+
230
+ - ``EntityInfo[float]`` for temperature / numeric sensor values
231
+ - ``EntityInfo[int]`` for enums, weekdays and plain integers
232
+ - ``EntityInfo[time]`` for HH:MM time values
233
+ - ``EntityInfo[str]`` for string / datetime values
234
+
235
+ When the device returns ``"---"`` (sensor not in use), ``value`` is set to
236
+ ``None``.
237
+
222
238
  Attributes:
223
239
  name: Name attribute.
224
- value: Value of attribute (type depends on data_type).
240
+ value: Converted value, or None when sensor/parameter is inactive.
225
241
  unit: Unit of measurement.
226
242
  desc: Description of the entity.
227
243
  data_type: Type of data (see DataType enum).
@@ -237,7 +253,7 @@ class EntityInfo(DataClassJSONMixin):
237
253
  name: str = field(metadata={"alias": "name"})
238
254
  unit: str = field(metadata={"alias": "unit"})
239
255
  desc: str = field(metadata={"alias": "desc"})
240
- value: Any = field(metadata={"alias": "value"})
256
+ value: T | None = field(metadata={"alias": "value"})
241
257
  data_type: int = field(metadata={"alias": "dataType"})
242
258
  error: int = field(default=0)
243
259
  readonly: int = field(default=0)
@@ -248,7 +264,8 @@ class EntityInfo(DataClassJSONMixin):
248
264
 
249
265
  def __post_init__(self) -> None:
250
266
  """Convert values based on data_type after initialization."""
251
- if self.value == "---": # Special case for undefined values
267
+ if self.value == "---": # Sensor/parameter not in use
268
+ self.value = None
252
269
  return
253
270
 
254
271
  try:
@@ -261,35 +278,37 @@ class EntityInfo(DataClassJSONMixin):
261
278
  str(e),
262
279
  )
263
280
 
264
- def convert_value(self) -> Any:
281
+ def convert_value(self) -> T | None:
265
282
  """Convert the value based on its data type.
266
283
 
267
284
  Returns:
268
- Any: The converted value.
285
+ T | None: The converted value.
269
286
 
270
287
  """
271
- result = self.value
288
+ # Raw values from BSB-LAN JSON are always strings at this point.
289
+ # We explicitly convert to str so the type checker knows None is excluded
290
+ # (__post_init__ guards against None before calling this method).
291
+ raw = str(self.value)
292
+ result: EntityValue = raw
272
293
 
273
294
  if self.data_type == DataType.PLAIN_NUMBER:
274
295
  # Handle temperature values
275
296
  if self._is_temperature():
276
- result = float(self.value)
297
+ result = float(raw)
277
298
  else:
278
299
  # Handle other numeric values
279
300
  with suppress(ValueError):
280
- result = (
281
- float(self.value) if "." in str(self.value) else int(self.value)
282
- )
301
+ result = float(raw) if "." in raw else int(raw)
283
302
 
284
303
  elif self.data_type == DataType.ENUM:
285
304
  # For ENUMs, we keep the value as int but provide access to description
286
305
  with suppress(ValueError):
287
- result = int(self.value)
306
+ result = int(raw)
288
307
 
289
308
  elif self.data_type == DataType.TIME:
290
309
  # Convert HH:MM to time object
291
310
  try:
292
- hour, minute = map(int, str(self.value).split(":"))
311
+ hour, minute = map(int, raw.split(":"))
293
312
  result = time(hour=hour, minute=minute)
294
313
  except ValueError:
295
314
  pass
@@ -297,9 +316,9 @@ class EntityInfo(DataClassJSONMixin):
297
316
  elif self.data_type == DataType.WEEKDAY:
298
317
  # Convert numeric weekday to int
299
318
  with suppress(ValueError):
300
- result = int(self.value)
319
+ result = int(raw)
301
320
 
302
- return result
321
+ return cast("T", result)
303
322
 
304
323
  def _is_temperature(self) -> bool:
305
324
  """Check if the value represents a temperature.
@@ -23,6 +23,18 @@ def test_entity_info_invalid_time_conversion() -> None:
23
23
  assert entity.value == "24:61"
24
24
 
25
25
 
26
+ def test_entity_info_undefined_value_becomes_none() -> None:
27
+ """Test that '---' (sensor/parameter not in use) is converted to None."""
28
+ entity = EntityInfo(
29
+ name="Inactive Sensor",
30
+ value="---",
31
+ unit="°C",
32
+ desc="",
33
+ data_type=DataType.PLAIN_NUMBER,
34
+ )
35
+ assert entity.value is None
36
+
37
+
26
38
  def test_entity_info_invalid_weekday_conversion() -> None:
27
39
  """Test EntityInfo with invalid weekday format."""
28
40
  # Create EntityInfo with invalid weekday format
@@ -42,16 +54,17 @@ def test_entity_info_general_conversion_error(caplog: pytest.LogCaptureFixture)
42
54
  """Test EntityInfo with general conversion error."""
43
55
  with caplog.at_level(logging.WARNING):
44
56
  # Create EntityInfo that will cause a conversion error
57
+ # Using a non-numeric string with temperature unit triggers float() ValueError
45
58
  entity = EntityInfo(
46
59
  name="Error Test",
47
- value=object(), # Object that can't be converted
48
- unit="",
60
+ value="not-convertible",
61
+ unit="°C",
49
62
  desc="",
50
63
  data_type=DataType.PLAIN_NUMBER,
51
64
  )
52
65
 
53
66
  # The original value should be preserved
54
- assert isinstance(entity.value, object)
67
+ assert entity.value == "not-convertible"
55
68
  assert "Failed to convert value" in caplog.text
56
69
 
57
70
 
@@ -81,7 +81,7 @@ async def test_state(monkeypatch: Any) -> None:
81
81
 
82
82
  # Room temperature setpoint boost assertions
83
83
  assert state.room1_temp_setpoint_boost is not None
84
- assert state.room1_temp_setpoint_boost.value == "---"
84
+ assert state.room1_temp_setpoint_boost.value is None
85
85
  assert state.room1_temp_setpoint_boost.unit == "°C"
86
86
 
87
87
  # Verify API call
@@ -109,6 +109,15 @@ wheels = [
109
109
  { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" },
110
110
  ]
111
111
 
112
+ [[package]]
113
+ name = "annotated-doc"
114
+ version = "0.0.4"
115
+ source = { registry = "https://pypi.org/simple" }
116
+ sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" }
117
+ wheels = [
118
+ { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" },
119
+ ]
120
+
112
121
  [[package]]
113
122
  name = "annotated-types"
114
123
  version = "0.7.0"
@@ -164,14 +173,14 @@ wheels = [
164
173
 
165
174
  [[package]]
166
175
  name = "authlib"
167
- version = "1.6.7"
176
+ version = "1.6.8"
168
177
  source = { registry = "https://pypi.org/simple" }
169
178
  dependencies = [
170
179
  { name = "cryptography" },
171
180
  ]
172
- sdist = { url = "https://files.pythonhosted.org/packages/49/dc/ed1681bf1339dd6ea1ce56136bad4baabc6f7ad466e375810702b0237047/authlib-1.6.7.tar.gz", hash = "sha256:dbf10100011d1e1b34048c9d120e83f13b35d69a826ae762b93d2fb5aafc337b", size = 164950, upload-time = "2026-02-06T14:04:14.171Z" }
181
+ sdist = { url = "https://files.pythonhosted.org/packages/6b/6c/c88eac87468c607f88bc24df1f3b31445ee6fc9ba123b09e666adf687cd9/authlib-1.6.8.tar.gz", hash = "sha256:41ae180a17cf672bc784e4a518e5c82687f1fe1e98b0cafaeda80c8e4ab2d1cb", size = 165074, upload-time = "2026-02-14T04:02:17.941Z" }
173
182
  wheels = [
174
- { url = "https://files.pythonhosted.org/packages/f8/00/3ed12264094ec91f534fae429945efbaa9f8c666f3aa7061cc3b2a26a0cd/authlib-1.6.7-py2.py3-none-any.whl", hash = "sha256:c637340d9a02789d2efa1d003a7437d10d3e565237bcb5fcbc6c134c7b95bab0", size = 244115, upload-time = "2026-02-06T14:04:12.141Z" },
183
+ { url = "https://files.pythonhosted.org/packages/9b/73/f7084bf12755113cd535ae586782ff3a6e710bfbe6a0d13d1c2f81ffbbfa/authlib-1.6.8-py2.py3-none-any.whl", hash = "sha256:97286fd7a15e6cfefc32771c8ef9c54f0ed58028f1322de6a2a7c969c3817888", size = 244116, upload-time = "2026-02-14T04:02:15.579Z" },
175
184
  ]
176
185
 
177
186
  [[package]]
@@ -662,11 +671,11 @@ wheels = [
662
671
 
663
672
  [[package]]
664
673
  name = "filelock"
665
- version = "3.20.3"
674
+ version = "3.24.1"
666
675
  source = { registry = "https://pypi.org/simple" }
667
- sdist = { url = "https://files.pythonhosted.org/packages/1d/65/ce7f1b70157833bf3cb851b556a37d4547ceafc158aa9b34b36782f23696/filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1", size = 19485, upload-time = "2026-01-09T17:55:05.421Z" }
676
+ sdist = { url = "https://files.pythonhosted.org/packages/4f/8a/b24ff2c2d7f20ce930b5efe91e7260247d185d8939707721168ad204e465/filelock-3.24.1.tar.gz", hash = "sha256:3440181dd03f8904c108c8e9f5b11d1663e9fc960f1c837586a11f1c5c041e54", size = 37452, upload-time = "2026-02-15T22:03:16.564Z" }
668
677
  wheels = [
669
- { url = "https://files.pythonhosted.org/packages/b5/36/7fb70f04bf00bc646cd5bb45aa9eddb15e19437a28b8fb2b4a5249fac770/filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1", size = 16701, upload-time = "2026-01-09T17:55:04.334Z" },
678
+ { url = "https://files.pythonhosted.org/packages/97/64/3613e89811e79aca8d0d4f2c984fc66336bc9d83529c1cbe02f5df010d0a/filelock-3.24.1-py3-none-any.whl", hash = "sha256:7c59f595e3cf4887dc95b403a896849da49ed183d7c9d7ee855646ca99f10698", size = 24153, upload-time = "2026-02-15T22:03:15.262Z" },
670
679
  ]
671
680
 
672
681
  [[package]]
@@ -1087,14 +1096,14 @@ wheels = [
1087
1096
 
1088
1097
  [[package]]
1089
1098
  name = "mashumaro"
1090
- version = "3.19"
1099
+ version = "3.20"
1091
1100
  source = { registry = "https://pypi.org/simple" }
1092
1101
  dependencies = [
1093
1102
  { name = "typing-extensions" },
1094
1103
  ]
1095
- sdist = { url = "https://files.pythonhosted.org/packages/52/7e/654ae97e00c450a5482eee88a47ad7c4a3749a231accb60d6c6756847251/mashumaro-3.19.tar.gz", hash = "sha256:3ef88c23d7a4477092184dace6309da212f115eba9029c89fb93b80ae424692f", size = 191291, upload-time = "2026-02-03T19:17:48.029Z" }
1104
+ sdist = { url = "https://files.pythonhosted.org/packages/64/3d/0f1bf475109a816c2a31a8b424750911343f0bce304827a5255df167547e/mashumaro-3.20.tar.gz", hash = "sha256:af4573f14ae61be3fbc3a473158ddfc1420f345410385809fd782e0d79e9215c", size = 191643, upload-time = "2026-02-09T21:53:55.24Z" }
1096
1105
  wheels = [
1097
- { url = "https://files.pythonhosted.org/packages/a4/a5/1a7a8e7b5e7f12e44d9ca8873a7d510541e9b97d0966a51455ab5dfe6fb4/mashumaro-3.19-py3-none-any.whl", hash = "sha256:14e5fea73ee92479c2fddf634eadd6502a8bd7afe57b7912fa11b5fb51e554c7", size = 94766, upload-time = "2026-02-03T19:17:46.228Z" },
1106
+ { url = "https://files.pythonhosted.org/packages/96/5a/4fed77781061647d3be98e2f235ef1869289dd839ca0451a8d50a30fcd5c/mashumaro-3.20-py3-none-any.whl", hash = "sha256:648bc326f64c55447988eab67d6bfe3b7958c0961c83590709b1f950f88f4a3c", size = 94942, upload-time = "2026-02-09T21:53:53.343Z" },
1098
1107
  ]
1099
1108
 
1100
1109
  [[package]]
@@ -1341,11 +1350,11 @@ wheels = [
1341
1350
 
1342
1351
  [[package]]
1343
1352
  name = "platformdirs"
1344
- version = "4.5.1"
1353
+ version = "4.9.1"
1345
1354
  source = { registry = "https://pypi.org/simple" }
1346
- sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" }
1355
+ sdist = { url = "https://files.pythonhosted.org/packages/6c/d5/763666321efaded11112de8b7a7f2273dd8d1e205168e73c334e54b0ab9a/platformdirs-4.9.1.tar.gz", hash = "sha256:f310f16e89c4e29117805d8328f7c10876eeff36c94eac879532812110f7d39f", size = 28392, upload-time = "2026-02-14T21:02:44.973Z" }
1347
1356
  wheels = [
1348
- { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" },
1357
+ { url = "https://files.pythonhosted.org/packages/70/77/e8c95e95f1d4cdd88c90a96e31980df7e709e51059fac150046ad67fac63/platformdirs-4.9.1-py3-none-any.whl", hash = "sha256:61d8b967d34791c162d30d60737369cbbd77debad5b981c4bfda1842e71e0d66", size = 21307, upload-time = "2026-02-14T21:02:43.492Z" },
1349
1358
  ]
1350
1359
 
1351
1360
  [[package]]
@@ -1758,9 +1767,9 @@ dev = [
1758
1767
  { name = "pytest-cov", specifier = "==7.0.0" },
1759
1768
  { name = "pytest-xdist", specifier = ">=3.8.0" },
1760
1769
  { name = "pyupgrade", specifier = "==3.21.2" },
1761
- { name = "ruff", specifier = "==0.15.0" },
1770
+ { name = "ruff", specifier = "==0.15.1" },
1762
1771
  { name = "safety", specifier = "==3.7.0" },
1763
- { name = "ty", specifier = "==0.0.16" },
1772
+ { name = "ty", specifier = "==0.0.17" },
1764
1773
  { name = "vulture", specifier = "==2.14" },
1765
1774
  { name = "yamllint", specifier = "==1.38.0" },
1766
1775
  { name = "zeroconf", specifier = ">=0.148.0" },
@@ -1989,27 +1998,27 @@ wheels = [
1989
1998
 
1990
1999
  [[package]]
1991
2000
  name = "ruff"
1992
- version = "0.15.0"
1993
- source = { registry = "https://pypi.org/simple" }
1994
- sdist = { url = "https://files.pythonhosted.org/packages/c8/39/5cee96809fbca590abea6b46c6d1c586b49663d1d2830a751cc8fc42c666/ruff-0.15.0.tar.gz", hash = "sha256:6bdea47cdbea30d40f8f8d7d69c0854ba7c15420ec75a26f463290949d7f7e9a", size = 4524893, upload-time = "2026-02-03T17:53:35.357Z" }
1995
- wheels = [
1996
- { url = "https://files.pythonhosted.org/packages/bc/88/3fd1b0aa4b6330d6aaa63a285bc96c9f71970351579152d231ed90914586/ruff-0.15.0-py3-none-linux_armv6l.whl", hash = "sha256:aac4ebaa612a82b23d45964586f24ae9bc23ca101919f5590bdb368d74ad5455", size = 10354332, upload-time = "2026-02-03T17:52:54.892Z" },
1997
- { url = "https://files.pythonhosted.org/packages/72/f6/62e173fbb7eb75cc29fe2576a1e20f0a46f671a2587b5f604bfb0eaf5f6f/ruff-0.15.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:dcd4be7cc75cfbbca24a98d04d0b9b36a270d0833241f776b788d59f4142b14d", size = 10767189, upload-time = "2026-02-03T17:53:19.778Z" },
1998
- { url = "https://files.pythonhosted.org/packages/99/e4/968ae17b676d1d2ff101d56dc69cf333e3a4c985e1ec23803df84fc7bf9e/ruff-0.15.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:d747e3319b2bce179c7c1eaad3d884dc0a199b5f4d5187620530adf9105268ce", size = 10075384, upload-time = "2026-02-03T17:53:29.241Z" },
1999
- { url = "https://files.pythonhosted.org/packages/a2/bf/9843c6044ab9e20af879c751487e61333ca79a2c8c3058b15722386b8cae/ruff-0.15.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:650bd9c56ae03102c51a5e4b554d74d825ff3abe4db22b90fd32d816c2e90621", size = 10481363, upload-time = "2026-02-03T17:52:43.332Z" },
2000
- { url = "https://files.pythonhosted.org/packages/55/d9/4ada5ccf4cd1f532db1c8d44b6f664f2208d3d93acbeec18f82315e15193/ruff-0.15.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6664b7eac559e3048223a2da77769c2f92b43a6dfd4720cef42654299a599c9", size = 10187736, upload-time = "2026-02-03T17:53:00.522Z" },
2001
- { url = "https://files.pythonhosted.org/packages/86/e2/f25eaecd446af7bb132af0a1d5b135a62971a41f5366ff41d06d25e77a91/ruff-0.15.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f811f97b0f092b35320d1556f3353bf238763420ade5d9e62ebd2b73f2ff179", size = 10968415, upload-time = "2026-02-03T17:53:15.705Z" },
2002
- { url = "https://files.pythonhosted.org/packages/e7/dc/f06a8558d06333bf79b497d29a50c3a673d9251214e0d7ec78f90b30aa79/ruff-0.15.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:761ec0a66680fab6454236635a39abaf14198818c8cdf691e036f4bc0f406b2d", size = 11809643, upload-time = "2026-02-03T17:53:23.031Z" },
2003
- { url = "https://files.pythonhosted.org/packages/dd/45/0ece8db2c474ad7df13af3a6d50f76e22a09d078af63078f005057ca59eb/ruff-0.15.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:940f11c2604d317e797b289f4f9f3fa5555ffe4fb574b55ed006c3d9b6f0eb78", size = 11234787, upload-time = "2026-02-03T17:52:46.432Z" },
2004
- { url = "https://files.pythonhosted.org/packages/8a/d9/0e3a81467a120fd265658d127db648e4d3acfe3e4f6f5d4ea79fac47e587/ruff-0.15.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcbca3d40558789126da91d7ef9a7c87772ee107033db7191edefa34e2c7f1b4", size = 11112797, upload-time = "2026-02-03T17:52:49.274Z" },
2005
- { url = "https://files.pythonhosted.org/packages/b2/cb/8c0b3b0c692683f8ff31351dfb6241047fa873a4481a76df4335a8bff716/ruff-0.15.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9a121a96db1d75fa3eb39c4539e607f628920dd72ff1f7c5ee4f1b768ac62d6e", size = 11033133, upload-time = "2026-02-03T17:53:33.105Z" },
2006
- { url = "https://files.pythonhosted.org/packages/f8/5e/23b87370cf0f9081a8c89a753e69a4e8778805b8802ccfe175cc410e50b9/ruff-0.15.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:5298d518e493061f2eabd4abd067c7e4fb89e2f63291c94332e35631c07c3662", size = 10442646, upload-time = "2026-02-03T17:53:06.278Z" },
2007
- { url = "https://files.pythonhosted.org/packages/e1/9a/3c94de5ce642830167e6d00b5c75aacd73e6347b4c7fc6828699b150a5ee/ruff-0.15.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:afb6e603d6375ff0d6b0cee563fa21ab570fd15e65c852cb24922cef25050cf1", size = 10195750, upload-time = "2026-02-03T17:53:26.084Z" },
2008
- { url = "https://files.pythonhosted.org/packages/30/15/e396325080d600b436acc970848d69df9c13977942fb62bb8722d729bee8/ruff-0.15.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:77e515f6b15f828b94dc17d2b4ace334c9ddb7d9468c54b2f9ed2b9c1593ef16", size = 10676120, upload-time = "2026-02-03T17:53:09.363Z" },
2009
- { url = "https://files.pythonhosted.org/packages/8d/c9/229a23d52a2983de1ad0fb0ee37d36e0257e6f28bfd6b498ee2c76361874/ruff-0.15.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:6f6e80850a01eb13b3e42ee0ebdf6e4497151b48c35051aab51c101266d187a3", size = 11201636, upload-time = "2026-02-03T17:52:57.281Z" },
2010
- { url = "https://files.pythonhosted.org/packages/6f/b0/69adf22f4e24f3677208adb715c578266842e6e6a3cc77483f48dd999ede/ruff-0.15.0-py3-none-win32.whl", hash = "sha256:238a717ef803e501b6d51e0bdd0d2c6e8513fe9eec14002445134d3907cd46c3", size = 10465945, upload-time = "2026-02-03T17:53:12.591Z" },
2011
- { url = "https://files.pythonhosted.org/packages/51/ad/f813b6e2c97e9b4598be25e94a9147b9af7e60523b0cb5d94d307c15229d/ruff-0.15.0-py3-none-win_amd64.whl", hash = "sha256:dd5e4d3301dc01de614da3cdffc33d4b1b96fb89e45721f1598e5532ccf78b18", size = 11564657, upload-time = "2026-02-03T17:52:51.893Z" },
2012
- { url = "https://files.pythonhosted.org/packages/f6/b0/2d823f6e77ebe560f4e397d078487e8d52c1516b331e3521bc75db4272ca/ruff-0.15.0-py3-none-win_arm64.whl", hash = "sha256:c480d632cc0ca3f0727acac8b7d053542d9e114a462a145d0b00e7cd658c515a", size = 10865753, upload-time = "2026-02-03T17:53:03.014Z" },
2001
+ version = "0.15.1"
2002
+ source = { registry = "https://pypi.org/simple" }
2003
+ sdist = { url = "https://files.pythonhosted.org/packages/04/dc/4e6ac71b511b141cf626357a3946679abeba4cf67bc7cc5a17920f31e10d/ruff-0.15.1.tar.gz", hash = "sha256:c590fe13fb57c97141ae975c03a1aedb3d3156030cabd740d6ff0b0d601e203f", size = 4540855, upload-time = "2026-02-12T23:09:09.998Z" }
2004
+ wheels = [
2005
+ { url = "https://files.pythonhosted.org/packages/23/bf/e6e4324238c17f9d9120a9d60aa99a7daaa21204c07fcd84e2ef03bb5fd1/ruff-0.15.1-py3-none-linux_armv6l.whl", hash = "sha256:b101ed7cf4615bda6ffe65bdb59f964e9f4a0d3f85cbf0e54f0ab76d7b90228a", size = 10367819, upload-time = "2026-02-12T23:09:03.598Z" },
2006
+ { url = "https://files.pythonhosted.org/packages/b3/ea/c8f89d32e7912269d38c58f3649e453ac32c528f93bb7f4219258be2e7ed/ruff-0.15.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:939c995e9277e63ea632cc8d3fae17aa758526f49a9a850d2e7e758bfef46602", size = 10798618, upload-time = "2026-02-12T23:09:22.928Z" },
2007
+ { url = "https://files.pythonhosted.org/packages/5e/0f/1d0d88bc862624247d82c20c10d4c0f6bb2f346559d8af281674cf327f15/ruff-0.15.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1d83466455fdefe60b8d9c8df81d3c1bbb2115cede53549d3b522ce2bc703899", size = 10148518, upload-time = "2026-02-12T23:08:58.339Z" },
2008
+ { url = "https://files.pythonhosted.org/packages/f5/c8/291c49cefaa4a9248e986256df2ade7add79388fe179e0691be06fae6f37/ruff-0.15.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9457e3c3291024866222b96108ab2d8265b477e5b1534c7ddb1810904858d16", size = 10518811, upload-time = "2026-02-12T23:09:31.865Z" },
2009
+ { url = "https://files.pythonhosted.org/packages/c3/1a/f5707440e5ae43ffa5365cac8bbb91e9665f4a883f560893829cf16a606b/ruff-0.15.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92c92b003e9d4f7fbd33b1867bb15a1b785b1735069108dfc23821ba045b29bc", size = 10196169, upload-time = "2026-02-12T23:09:17.306Z" },
2010
+ { url = "https://files.pythonhosted.org/packages/2a/ff/26ddc8c4da04c8fd3ee65a89c9fb99eaa5c30394269d424461467be2271f/ruff-0.15.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fe5c41ab43e3a06778844c586251eb5a510f67125427625f9eb2b9526535779", size = 10990491, upload-time = "2026-02-12T23:09:25.503Z" },
2011
+ { url = "https://files.pythonhosted.org/packages/fc/00/50920cb385b89413f7cdb4bb9bc8fc59c1b0f30028d8bccc294189a54955/ruff-0.15.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66a6dd6df4d80dc382c6484f8ce1bcceb55c32e9f27a8b94c32f6c7331bf14fb", size = 11843280, upload-time = "2026-02-12T23:09:19.88Z" },
2012
+ { url = "https://files.pythonhosted.org/packages/5d/6d/2f5cad8380caf5632a15460c323ae326f1e1a2b5b90a6ee7519017a017ca/ruff-0.15.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a4a42cbb8af0bda9bcd7606b064d7c0bc311a88d141d02f78920be6acb5aa83", size = 11274336, upload-time = "2026-02-12T23:09:14.907Z" },
2013
+ { url = "https://files.pythonhosted.org/packages/a3/1d/5f56cae1d6c40b8a318513599b35ea4b075d7dc1cd1d04449578c29d1d75/ruff-0.15.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab064052c31dddada35079901592dfba2e05f5b1e43af3954aafcbc1096a5b2", size = 11137288, upload-time = "2026-02-12T23:09:07.475Z" },
2014
+ { url = "https://files.pythonhosted.org/packages/cd/20/6f8d7d8f768c93b0382b33b9306b3b999918816da46537d5a61635514635/ruff-0.15.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:5631c940fe9fe91f817a4c2ea4e81f47bee3ca4aa646134a24374f3c19ad9454", size = 11070681, upload-time = "2026-02-12T23:08:55.43Z" },
2015
+ { url = "https://files.pythonhosted.org/packages/9a/67/d640ac76069f64cdea59dba02af2e00b1fa30e2103c7f8d049c0cff4cafd/ruff-0.15.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:68138a4ba184b4691ccdc39f7795c66b3c68160c586519e7e8444cf5a53e1b4c", size = 10486401, upload-time = "2026-02-12T23:09:27.927Z" },
2016
+ { url = "https://files.pythonhosted.org/packages/65/3d/e1429f64a3ff89297497916b88c32a5cc88eeca7e9c787072d0e7f1d3e1e/ruff-0.15.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:518f9af03bfc33c03bdb4cb63fabc935341bb7f54af500f92ac309ecfbba6330", size = 10197452, upload-time = "2026-02-12T23:09:12.147Z" },
2017
+ { url = "https://files.pythonhosted.org/packages/78/83/e2c3bade17dad63bf1e1c2ffaf11490603b760be149e1419b07049b36ef2/ruff-0.15.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:da79f4d6a826caaea95de0237a67e33b81e6ec2e25fc7e1993a4015dffca7c61", size = 10693900, upload-time = "2026-02-12T23:09:34.418Z" },
2018
+ { url = "https://files.pythonhosted.org/packages/a1/27/fdc0e11a813e6338e0706e8b39bb7a1d61ea5b36873b351acee7e524a72a/ruff-0.15.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3dd86dccb83cd7d4dcfac303ffc277e6048600dfc22e38158afa208e8bf94a1f", size = 11227302, upload-time = "2026-02-12T23:09:36.536Z" },
2019
+ { url = "https://files.pythonhosted.org/packages/f6/58/ac864a75067dcbd3b95be5ab4eb2b601d7fbc3d3d736a27e391a4f92a5c1/ruff-0.15.1-py3-none-win32.whl", hash = "sha256:660975d9cb49b5d5278b12b03bb9951d554543a90b74ed5d366b20e2c57c2098", size = 10462555, upload-time = "2026-02-12T23:09:29.899Z" },
2020
+ { url = "https://files.pythonhosted.org/packages/e0/5e/d4ccc8a27ecdb78116feac4935dfc39d1304536f4296168f91ed3ec00cd2/ruff-0.15.1-py3-none-win_amd64.whl", hash = "sha256:c820fef9dd5d4172a6570e5721704a96c6679b80cf7be41659ed439653f62336", size = 11599956, upload-time = "2026-02-12T23:09:01.157Z" },
2021
+ { url = "https://files.pythonhosted.org/packages/2a/07/5bda6a85b220c64c65686bc85bd0bbb23b29c62b3a9f9433fa55f17cda93/ruff-0.15.1-py3-none-win_arm64.whl", hash = "sha256:5ff7d5f0f88567850f45081fac8f4ec212be8d0b963e385c3f7d0d2eb4899416", size = 10874604, upload-time = "2026-02-12T23:09:05.515Z" },
2013
2022
  ]
2014
2023
 
2015
2024
  [[package]]
@@ -2146,41 +2155,41 @@ wheels = [
2146
2155
 
2147
2156
  [[package]]
2148
2157
  name = "ty"
2149
- version = "0.0.16"
2158
+ version = "0.0.17"
2150
2159
  source = { registry = "https://pypi.org/simple" }
2151
- sdist = { url = "https://files.pythonhosted.org/packages/ee/18/77f84d89db54ea0d1d1b09fa2f630ac4c240c8e270761cb908c06b6e735c/ty-0.0.16.tar.gz", hash = "sha256:a999b0db6aed7d6294d036ebe43301105681e0c821a19989be7c145805d7351c", size = 5129637, upload-time = "2026-02-10T20:24:16.48Z" }
2160
+ sdist = { url = "https://files.pythonhosted.org/packages/66/c3/41ae6346443eedb65b96761abfab890a48ce2aa5a8a27af69c5c5d99064d/ty-0.0.17.tar.gz", hash = "sha256:847ed6c120913e280bf9b54d8eaa7a1049708acb8824ad234e71498e8ad09f97", size = 5167209, upload-time = "2026-02-13T13:26:36.835Z" }
2152
2161
  wheels = [
2153
- { url = "https://files.pythonhosted.org/packages/67/b9/909ebcc7f59eaf8a2c18fb54bfcf1c106f99afb3e5460058d4b46dec7b20/ty-0.0.16-py3-none-linux_armv6l.whl", hash = "sha256:6d8833b86396ed742f2b34028f51c0e98dbf010b13ae4b79d1126749dc9dab15", size = 10113870, upload-time = "2026-02-10T20:24:11.864Z" },
2154
- { url = "https://files.pythonhosted.org/packages/c3/2c/b963204f3df2fdbf46a4a1ea4a060af9bb676e065d59c70ad0f5ae0dbae8/ty-0.0.16-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:934c0055d3b7f1cf3c8eab78c6c127ef7f347ff00443cef69614bda6f1502377", size = 9936286, upload-time = "2026-02-10T20:24:08.695Z" },
2155
- { url = "https://files.pythonhosted.org/packages/ef/4d/3d78294f2ddfdded231e94453dea0e0adef212b2bd6536296039164c2a3e/ty-0.0.16-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b55e8e8733b416d914003cd22e831e139f034681b05afed7e951cc1a5ea1b8d4", size = 9442660, upload-time = "2026-02-10T20:24:02.704Z" },
2156
- { url = "https://files.pythonhosted.org/packages/15/40/ce48c0541e3b5749b0890725870769904e6b043e077d4710e5325d5cf807/ty-0.0.16-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feccae8f4abd6657de111353bd604f36e164844466346eb81ffee2c2b06ea0f0", size = 9934506, upload-time = "2026-02-10T20:24:35.818Z" },
2157
- { url = "https://files.pythonhosted.org/packages/84/16/3b29de57e1ec6e56f50a4bb625ee0923edb058c5f53e29014873573a00cd/ty-0.0.16-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1cad5e29d8765b92db5fa284940ac57149561f3f89470b363b9aab8a6ce553b0", size = 9933099, upload-time = "2026-02-10T20:24:43.003Z" },
2158
- { url = "https://files.pythonhosted.org/packages/f7/a1/e546995c25563d318c502b2f42af0fdbed91e1fc343708241e2076373644/ty-0.0.16-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:86f28797c7dc06f081238270b533bf4fc8e93852f34df49fb660e0b58a5cda9a", size = 10438370, upload-time = "2026-02-10T20:24:33.44Z" },
2159
- { url = "https://files.pythonhosted.org/packages/11/c1/22d301a4b2cce0f75ae84d07a495f87da193bcb68e096d43695a815c4708/ty-0.0.16-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be971a3b42bcae44d0e5787f88156ed2102ad07558c05a5ae4bfd32a99118e66", size = 10992160, upload-time = "2026-02-10T20:24:25.574Z" },
2160
- { url = "https://files.pythonhosted.org/packages/6f/40/f1892b8c890db3f39a1bab8ec459b572de2df49e76d3cad2a9a239adcde9/ty-0.0.16-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3c9f982b7c4250eb91af66933f436b3a2363c24b6353e94992eab6551166c8b7", size = 10717892, upload-time = "2026-02-10T20:24:05.914Z" },
2161
- { url = "https://files.pythonhosted.org/packages/2f/1b/caf9be8d0c738983845f503f2e92ea64b8d5fae1dd5ca98c3fca4aa7dadc/ty-0.0.16-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d122edf85ce7bdf6f85d19158c991d858fc835677bd31ca46319c4913043dc84", size = 10510916, upload-time = "2026-02-10T20:24:00.252Z" },
2162
- { url = "https://files.pythonhosted.org/packages/60/ea/28980f5c7e1f4c9c44995811ea6a36f2fcb205232a6ae0f5b60b11504621/ty-0.0.16-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:497ebdddbb0e35c7758ded5aa4c6245e8696a69d531d5c9b0c1a28a075374241", size = 9908506, upload-time = "2026-02-10T20:24:28.133Z" },
2163
- { url = "https://files.pythonhosted.org/packages/f7/80/8672306596349463c21644554f935ff8720679a14fd658fef658f66da944/ty-0.0.16-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e1e0ac0837bde634b030243aeba8499383c0487e08f22e80f5abdacb5b0bd8ce", size = 9949486, upload-time = "2026-02-10T20:24:18.62Z" },
2164
- { url = "https://files.pythonhosted.org/packages/8b/8a/d8747d36f30bd82ea157835f5b70d084c9bb5d52dd9491dba8a149792d6a/ty-0.0.16-py3-none-musllinux_1_2_i686.whl", hash = "sha256:1216c9bcca551d9f89f47a817ebc80e88ac37683d71504e5509a6445f24fd024", size = 10145269, upload-time = "2026-02-10T20:24:38.249Z" },
2165
- { url = "https://files.pythonhosted.org/packages/6f/4c/753535acc7243570c259158b7df67e9c9dd7dab9a21ee110baa4cdcec45d/ty-0.0.16-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:221bbdd2c6ee558452c96916ab67fcc465b86967cf0482e19571d18f9c831828", size = 10608644, upload-time = "2026-02-10T20:24:40.565Z" },
2166
- { url = "https://files.pythonhosted.org/packages/3e/05/8e8db64cf45a8b16757e907f7a3bfde8d6203e4769b11b64e28d5bdcd79a/ty-0.0.16-py3-none-win32.whl", hash = "sha256:d52c4eb786be878e7514cab637200af607216fcc5539a06d26573ea496b26512", size = 9582579, upload-time = "2026-02-10T20:24:30.406Z" },
2167
- { url = "https://files.pythonhosted.org/packages/25/bc/45759faea132cd1b2a9ff8374e42ba03d39d076594fbb94f3e0e2c226c62/ty-0.0.16-py3-none-win_amd64.whl", hash = "sha256:f572c216aa8ecf79e86589c6e6d4bebc01f1f3cb3be765c0febd942013e1e73a", size = 10436043, upload-time = "2026-02-10T20:23:57.51Z" },
2168
- { url = "https://files.pythonhosted.org/packages/7f/02/70a491802e7593e444137ed4e41a04c34d186eb2856f452dd76b60f2e325/ty-0.0.16-py3-none-win_arm64.whl", hash = "sha256:430eadeb1c0de0c31ef7bef9d002bdbb5f25a31e3aad546f1714d76cd8da0a87", size = 9915122, upload-time = "2026-02-10T20:24:14.285Z" },
2162
+ { url = "https://files.pythonhosted.org/packages/c0/01/0ef15c22a1c54b0f728ceff3f62d478dbf8b0dcf8ff7b80b954f79584f3e/ty-0.0.17-py3-none-linux_armv6l.whl", hash = "sha256:64a9a16555cc8867d35c2647c2f1afbd3cae55f68fd95283a574d1bb04fe93e0", size = 10192793, upload-time = "2026-02-13T13:27:13.943Z" },
2163
+ { url = "https://files.pythonhosted.org/packages/0f/2c/f4c322d9cded56edc016b1092c14b95cf58c8a33b4787316ea752bb9418e/ty-0.0.17-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:eb2dbd8acd5c5a55f4af0d479523e7c7265a88542efe73ed3d696eb1ba7b6454", size = 10051977, upload-time = "2026-02-13T13:26:57.741Z" },
2164
+ { url = "https://files.pythonhosted.org/packages/4c/a5/43746c1ff81e784f5fc303afc61fe5bcd85d0fcf3ef65cb2cef78c7486c7/ty-0.0.17-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f18f5fd927bc628deb9ea2df40f06b5f79c5ccf355db732025a3e8e7152801f6", size = 9564639, upload-time = "2026-02-13T13:26:42.781Z" },
2165
+ { url = "https://files.pythonhosted.org/packages/d6/b8/280b04e14a9c0474af574f929fba2398b5e1c123c1e7735893b4cd73d13c/ty-0.0.17-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5383814d1d7a5cc53b3b07661856bab04bb2aac7a677c8d33c55169acdaa83df", size = 10061204, upload-time = "2026-02-13T13:27:00.152Z" },
2166
+ { url = "https://files.pythonhosted.org/packages/2a/d7/493e1607d8dfe48288d8a768a2adc38ee27ef50e57f0af41ff273987cda0/ty-0.0.17-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9c20423b8744b484f93e7bf2ef8a9724bca2657873593f9f41d08bd9f83444c9", size = 10013116, upload-time = "2026-02-13T13:26:34.543Z" },
2167
+ { url = "https://files.pythonhosted.org/packages/80/ef/22f3ed401520afac90dbdf1f9b8b7755d85b0d5c35c1cb35cf5bd11b59c2/ty-0.0.17-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6f5b1aba97db9af86517b911674b02f5bc310750485dc47603a105bd0e83ddd", size = 10533623, upload-time = "2026-02-13T13:26:31.449Z" },
2168
+ { url = "https://files.pythonhosted.org/packages/75/ce/744b15279a11ac7138832e3a55595706b4a8a209c9f878e3ab8e571d9032/ty-0.0.17-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:488bce1a9bea80b851a97cd34c4d2ffcd69593d6c3f54a72ae02e5c6e47f3d0c", size = 11069750, upload-time = "2026-02-13T13:26:48.638Z" },
2169
+ { url = "https://files.pythonhosted.org/packages/f2/be/1133c91f15a0e00d466c24f80df486d630d95d1b2af63296941f7473812f/ty-0.0.17-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8df66b91ec84239420985ec215e7f7549bfda2ac036a3b3c065f119d1c06825a", size = 10870862, upload-time = "2026-02-13T13:26:54.715Z" },
2170
+ { url = "https://files.pythonhosted.org/packages/3e/4a/a2ed209ef215b62b2d3246e07e833081e07d913adf7e0448fc204be443d6/ty-0.0.17-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:002139e807c53002790dfefe6e2f45ab0e04012e76db3d7c8286f96ec121af8f", size = 10628118, upload-time = "2026-02-13T13:26:45.439Z" },
2171
+ { url = "https://files.pythonhosted.org/packages/b3/0c/87476004cb5228e9719b98afffad82c3ef1f84334bde8527bcacba7b18cb/ty-0.0.17-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6c4e01f05ce82e5d489ab3900ca0899a56c4ccb52659453780c83e5b19e2b64c", size = 10038185, upload-time = "2026-02-13T13:27:02.693Z" },
2172
+ { url = "https://files.pythonhosted.org/packages/46/4b/98f0b3ba9aef53c1f0305519536967a4aa793a69ed72677b0a625c5313ac/ty-0.0.17-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2b226dd1e99c0d2152d218c7e440150d1a47ce3c431871f0efa073bbf899e881", size = 10047644, upload-time = "2026-02-13T13:27:05.474Z" },
2173
+ { url = "https://files.pythonhosted.org/packages/93/e0/06737bb80aa1a9103b8651d2eb691a7e53f1ed54111152be25f4a02745db/ty-0.0.17-py3-none-musllinux_1_2_i686.whl", hash = "sha256:8b11f1da7859e0ad69e84b3c5ef9a7b055ceed376a432fad44231bdfc48061c2", size = 10231140, upload-time = "2026-02-13T13:27:10.844Z" },
2174
+ { url = "https://files.pythonhosted.org/packages/7c/79/e2a606bd8852383ba9abfdd578f4a227bd18504145381a10a5f886b4e751/ty-0.0.17-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:c04e196809ff570559054d3e011425fd7c04161529eb551b3625654e5f2434cb", size = 10718344, upload-time = "2026-02-13T13:26:51.66Z" },
2175
+ { url = "https://files.pythonhosted.org/packages/c5/2d/2663984ac11de6d78f74432b8b14ba64d170b45194312852b7543cf7fd56/ty-0.0.17-py3-none-win32.whl", hash = "sha256:305b6ed150b2740d00a817b193373d21f0767e10f94ac47abfc3b2e5a5aec809", size = 9672932, upload-time = "2026-02-13T13:27:08.522Z" },
2176
+ { url = "https://files.pythonhosted.org/packages/de/b5/39be78f30b31ee9f5a585969930c7248354db90494ff5e3d0756560fb731/ty-0.0.17-py3-none-win_amd64.whl", hash = "sha256:531828267527aee7a63e972f54e5eee21d9281b72baf18e5c2850c6b862add83", size = 10542138, upload-time = "2026-02-13T13:27:17.084Z" },
2177
+ { url = "https://files.pythonhosted.org/packages/40/b7/f875c729c5d0079640c75bad2c7e5d43edc90f16ba242f28a11966df8f65/ty-0.0.17-py3-none-win_arm64.whl", hash = "sha256:de9810234c0c8d75073457e10a84825b9cd72e6629826b7f01c7a0b266ae25b1", size = 10023068, upload-time = "2026-02-13T13:26:39.637Z" },
2169
2178
  ]
2170
2179
 
2171
2180
  [[package]]
2172
2181
  name = "typer"
2173
- version = "0.21.1"
2182
+ version = "0.23.1"
2174
2183
  source = { registry = "https://pypi.org/simple" }
2175
2184
  dependencies = [
2185
+ { name = "annotated-doc" },
2176
2186
  { name = "click" },
2177
2187
  { name = "rich" },
2178
2188
  { name = "shellingham" },
2179
- { name = "typing-extensions" },
2180
2189
  ]
2181
- sdist = { url = "https://files.pythonhosted.org/packages/36/bf/8825b5929afd84d0dabd606c67cd57b8388cb3ec385f7ef19c5cc2202069/typer-0.21.1.tar.gz", hash = "sha256:ea835607cd752343b6b2b7ce676893e5a0324082268b48f27aa058bdb7d2145d", size = 110371, upload-time = "2026-01-06T11:21:10.989Z" }
2190
+ sdist = { url = "https://files.pythonhosted.org/packages/fd/07/b822e1b307d40e263e8253d2384cf98c51aa2368cc7ba9a07e523a1d964b/typer-0.23.1.tar.gz", hash = "sha256:2070374e4d31c83e7b61362fd859aa683576432fd5b026b060ad6b4cd3b86134", size = 120047, upload-time = "2026-02-13T10:04:30.984Z" }
2182
2191
  wheels = [
2183
- { url = "https://files.pythonhosted.org/packages/a0/1d/d9257dd49ff2ca23ea5f132edf1281a0c4f9de8a762b9ae399b670a59235/typer-0.21.1-py3-none-any.whl", hash = "sha256:7985e89081c636b88d172c2ee0cfe33c253160994d47bdfdc302defd7d1f1d01", size = 47381, upload-time = "2026-01-06T11:21:09.824Z" },
2192
+ { url = "https://files.pythonhosted.org/packages/d5/91/9b286ab899c008c2cb05e8be99814807e7fbbd33f0c0c960470826e5ac82/typer-0.23.1-py3-none-any.whl", hash = "sha256:3291ad0d3c701cbf522012faccfbb29352ff16ad262db2139e6b01f15781f14e", size = 56813, upload-time = "2026-02-13T10:04:32.008Z" },
2184
2193
  ]
2185
2194
 
2186
2195
  [[package]]
@@ -2227,27 +2236,27 @@ wheels = [
2227
2236
 
2228
2237
  [[package]]
2229
2238
  name = "uv"
2230
- version = "0.10.0"
2231
- source = { registry = "https://pypi.org/simple" }
2232
- sdist = { url = "https://files.pythonhosted.org/packages/09/36/f7fe4de0ad81234ac43938fe39c6ba84595c6b3a1868d786a4d7ad19e670/uv-0.10.0.tar.gz", hash = "sha256:ad01dd614a4bb8eb732da31ade41447026427397c5ad171cc98bd59579ef57ea", size = 3854103, upload-time = "2026-02-05T20:57:55.248Z" }
2233
- wheels = [
2234
- { url = "https://files.pythonhosted.org/packages/f4/69/33fb64aee6ba138b1aaf957e20778e94a8c23732e41cdf68e6176aa2cf4e/uv-0.10.0-py3-none-linux_armv6l.whl", hash = "sha256:38dc0ccbda6377eb94095688c38e5001b8b40dfce14b9654949c1f0b6aa889df", size = 21984662, upload-time = "2026-02-05T20:57:19.076Z" },
2235
- { url = "https://files.pythonhosted.org/packages/1a/5a/e3ff8a98cfbabc5c2d09bf304d2d9d2d7b2e7d60744241ac5ed762015e5c/uv-0.10.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a165582c1447691109d49d09dccb065d2a23852ff42bf77824ff169909aa85da", size = 21057249, upload-time = "2026-02-05T20:56:48.921Z" },
2236
- { url = "https://files.pythonhosted.org/packages/ee/77/ec8f24f8d0f19c4fda0718d917bb78b9e6f02a4e1963b401f1c4f4614a54/uv-0.10.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:aefea608971f4f23ac3dac2006afb8eb2b2c1a2514f5fee1fac18e6c45fd70c4", size = 19827174, upload-time = "2026-02-05T20:57:10.581Z" },
2237
- { url = "https://files.pythonhosted.org/packages/c6/7e/09b38b93208906728f591f66185a425be3acdb97c448460137d0e6ecb30a/uv-0.10.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:d4b621bcc5d0139502789dc299bae8bf55356d07b95cb4e57e50e2afcc5f43e1", size = 21629522, upload-time = "2026-02-05T20:57:29.959Z" },
2238
- { url = "https://files.pythonhosted.org/packages/89/f3/48d92c90e869331306979efaa29a44c3e7e8376ae343edc729df0d534dfb/uv-0.10.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:b4bea728a6b64826d0091f95f28de06dd2dc786384b3d336a90297f123b4da0e", size = 21614812, upload-time = "2026-02-05T20:56:58.103Z" },
2239
- { url = "https://files.pythonhosted.org/packages/ff/43/d0dedfcd4fe6e36cabdbeeb43425cd788604db9d48425e7b659d0f7ba112/uv-0.10.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc0cc2a4bcf9efbff9a57e2aed21c2d4b5a7ec2cc0096e0c33d7b53da17f6a3b", size = 21577072, upload-time = "2026-02-05T20:57:45.455Z" },
2240
- { url = "https://files.pythonhosted.org/packages/c5/90/b8c9320fd8d86f356e37505a02aa2978ed28f9c63b59f15933e98bce97e5/uv-0.10.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:070ca2f0e8c67ca9a8f70ce403c956b7ed9d51e0c2e9dbbcc4efa5e0a2483f79", size = 22829664, upload-time = "2026-02-05T20:57:22.689Z" },
2241
- { url = "https://files.pythonhosted.org/packages/56/9c/2c36b30b05c74b2af0e663e0e68f1d10b91a02a145e19b6774c121120c0b/uv-0.10.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8070c66149c06f9b39092a06f593a2241345ea2b1d42badc6f884c2cc089a1b1", size = 23705815, upload-time = "2026-02-05T20:57:37.604Z" },
2242
- { url = "https://files.pythonhosted.org/packages/6c/a1/8c7fdb14ab72e26ca872e07306e496a6b8cf42353f9bf6251b015be7f535/uv-0.10.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3db1d5390b3a624de672d7b0f9c9d8197693f3b2d3d9c4d9e34686dcbc34197a", size = 22890313, upload-time = "2026-02-05T20:57:26.35Z" },
2243
- { url = "https://files.pythonhosted.org/packages/f3/f8/5c152350b1a6d0af019801f91a1bdeac854c33deb36275f6c934f0113cb5/uv-0.10.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b46db718763bf742e986ebbc7a30ca33648957a0dcad34382970b992f5e900", size = 22769440, upload-time = "2026-02-05T20:56:53.859Z" },
2244
- { url = "https://files.pythonhosted.org/packages/87/44/980e5399c6f4943b81754be9b7deb87bd56430e035c507984e17267d6a97/uv-0.10.0-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:eb95d28590edd73b8fdd80c27d699c45c52f8305170c6a90b830caf7f36670a4", size = 21695296, upload-time = "2026-02-05T20:57:06.732Z" },
2245
- { url = "https://files.pythonhosted.org/packages/ae/e7/f44ad40275be2087b3910df4678ed62cf0c82eeb3375c4a35037a79747db/uv-0.10.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:5871eef5046a81df3f1636a3d2b4ccac749c23c7f4d3a4bae5496cb2876a1814", size = 22424291, upload-time = "2026-02-05T20:57:49.067Z" },
2246
- { url = "https://files.pythonhosted.org/packages/c2/81/31c0c0a8673140756e71a1112bf8f0fcbb48a4cf4587a7937f5bd55256b6/uv-0.10.0-py3-none-musllinux_1_1_i686.whl", hash = "sha256:1af0ec125a07edb434dfaa98969f6184c1313dbec2860c3c5ce2d533b257132a", size = 22109479, upload-time = "2026-02-05T20:57:02.258Z" },
2247
- { url = "https://files.pythonhosted.org/packages/d7/d1/2eb51bc233bad3d13ad64a0c280fd4d1ebebf5c2939b3900a46670fa2b91/uv-0.10.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:45909b9a734250da05b10101e0a067e01ffa2d94bbb07de4b501e3cee4ae0ff3", size = 22972087, upload-time = "2026-02-05T20:57:52.847Z" },
2248
- { url = "https://files.pythonhosted.org/packages/d2/f7/49987207b87b5c21e1f0e81c52892813e8cdf7e318b6373d6585773ebcdd/uv-0.10.0-py3-none-win32.whl", hash = "sha256:d5498851b1f07aa9c9af75578b2029a11743cb933d741f84dcbb43109a968c29", size = 20896746, upload-time = "2026-02-05T20:57:33.426Z" },
2249
- { url = "https://files.pythonhosted.org/packages/80/b2/1370049596c6ff7fa1fe22fccf86a093982eac81017b8c8aff541d7263b2/uv-0.10.0-py3-none-win_amd64.whl", hash = "sha256:edd469425cd62bcd8c8cc0226c5f9043a94e37ed869da8268c80fdbfd3e5015e", size = 23433041, upload-time = "2026-02-05T20:57:41.41Z" },
2250
- { url = "https://files.pythonhosted.org/packages/e3/76/1034c46244feafec2c274ac52b094f35d47c94cdb11461c24cf4be8a0c0c/uv-0.10.0-py3-none-win_arm64.whl", hash = "sha256:e90c509749b3422eebb54057434b7119892330d133b9690a88f8a6b0f3116be3", size = 21880261, upload-time = "2026-02-05T20:57:14.724Z" },
2239
+ version = "0.10.2"
2240
+ source = { registry = "https://pypi.org/simple" }
2241
+ sdist = { url = "https://files.pythonhosted.org/packages/0d/9a/fe74aa0127cdc26141364e07abf25e5d69b4bf9788758fad9cfecca637aa/uv-0.10.2.tar.gz", hash = "sha256:b5016f038e191cc9ef00e17be802f44363d1b1cc3ef3454d1d76839a4246c10a", size = 3858864, upload-time = "2026-02-10T19:17:51.609Z" }
2242
+ wheels = [
2243
+ { url = "https://files.pythonhosted.org/packages/ec/b5/aea88f66284d220be56ef748ed5e1bd11d819be14656a38631f4b55bfd48/uv-0.10.2-py3-none-linux_armv6l.whl", hash = "sha256:69e35aa3e91a245b015365e5e6ca383ecf72a07280c6d00c17c9173f2d3b68ab", size = 22215714, upload-time = "2026-02-10T19:17:34.281Z" },
2244
+ { url = "https://files.pythonhosted.org/packages/7f/72/947ba7737ae6cd50de61d268781b9e7717caa3b07e18238ffd547f9fc728/uv-0.10.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0b7eef95c36fe92e7aac399c0dce555474432cbfeaaa23975ed83a63923f78fd", size = 21276485, upload-time = "2026-02-10T19:18:15.415Z" },
2245
+ { url = "https://files.pythonhosted.org/packages/d3/38/5c3462b927a93be4ccaaa25138926a5fb6c9e1b72884efd7af77e451d82e/uv-0.10.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:acc08e420abab21de987151059991e3f04bc7f4044d94ca58b5dd547995b4843", size = 20048620, upload-time = "2026-02-10T19:17:26.481Z" },
2246
+ { url = "https://files.pythonhosted.org/packages/03/51/d4509b0f5b7740c1af82202e9c69b700d5848b8bd0faa25229e8edd2c19c/uv-0.10.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.musllinux_1_1_aarch64.whl", hash = "sha256:aefbcd749ab2ad48bb533ec028607607f7b03be11c83ea152dbb847226cd6285", size = 21870454, upload-time = "2026-02-10T19:17:21.838Z" },
2247
+ { url = "https://files.pythonhosted.org/packages/cd/7e/2bcbafcb424bb885817a7e58e6eec9314c190c55935daaafab1858bb82cd/uv-0.10.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.musllinux_1_1_armv7l.whl", hash = "sha256:fad554c38d9988409ceddfac69a465e6e5f925a8b689e7606a395c20bb4d1d78", size = 21839508, upload-time = "2026-02-10T19:17:59.211Z" },
2248
+ { url = "https://files.pythonhosted.org/packages/60/08/16df2c1f8ad121a595316b82f6e381447e8974265b2239c9135eb874f33b/uv-0.10.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6dd2dc41043e92b3316d7124a7bf48c2affe7117c93079419146f083df71933c", size = 21841283, upload-time = "2026-02-10T19:17:41.419Z" },
2249
+ { url = "https://files.pythonhosted.org/packages/76/27/a869fec4c03af5e43db700fabe208d8ee8dbd56e0ff568ba792788d505cd/uv-0.10.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111c05182c5630ac523764e0ec2e58d7b54eb149dbe517b578993a13c2f71aff", size = 23111967, upload-time = "2026-02-10T19:18:11.764Z" },
2250
+ { url = "https://files.pythonhosted.org/packages/2a/4a/fb38515d966acfbd80179e626985aab627898ffd02c70205850d6eb44df1/uv-0.10.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45c3deaba0343fd27ab5385d6b7cde0765df1a15389ee7978b14a51c32895662", size = 23911019, upload-time = "2026-02-10T19:18:26.947Z" },
2251
+ { url = "https://files.pythonhosted.org/packages/dd/5f/51bcbb490ddb1dcb06d767f0bde649ad2826686b9e30efa57f8ab2750a1d/uv-0.10.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bb2cac4f3be60b64a23d9f035019c30a004d378b563c94f60525c9591665a56b", size = 23030217, upload-time = "2026-02-10T19:17:37.789Z" },
2252
+ { url = "https://files.pythonhosted.org/packages/46/69/144f6db851d49aa6f25b040dc5c8c684b8f92df9e8d452c7abc619c6ec23/uv-0.10.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937687df0380d636ceafcb728cf6357f0432588e721892128985417b283c3b54", size = 23036452, upload-time = "2026-02-10T19:18:18.97Z" },
2253
+ { url = "https://files.pythonhosted.org/packages/66/29/3c7c4559c9310ed478e3d6c585ee0aad2852dc4d5fb14f4d92a2a12d1728/uv-0.10.2-py3-none-manylinux_2_28_aarch64.whl", hash = "sha256:f90bca8703ae66bccfcfb7313b4b697a496c4d3df662f4a1a2696a6320c47598", size = 21941903, upload-time = "2026-02-10T19:17:30.575Z" },
2254
+ { url = "https://files.pythonhosted.org/packages/9a/5a/42883b5ef2ef0b1bc5b70a1da12a6854a929ff824aa8eb1a5571fb27a39b/uv-0.10.2-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:cca026c2e584788e1264879a123bf499dd8f169b9cafac4a2065a416e09d3823", size = 22651571, upload-time = "2026-02-10T19:18:22.74Z" },
2255
+ { url = "https://files.pythonhosted.org/packages/e8/b8/e4f1dda1b3b0cc6c8ac06952bfe7bc28893ff016fb87651c8fafc6dfca96/uv-0.10.2-py3-none-musllinux_1_1_i686.whl", hash = "sha256:9f878837938103ee1307ed3ed5d9228118e3932816ab0deb451e7e16dc8ce82a", size = 22321279, upload-time = "2026-02-10T19:17:49.402Z" },
2256
+ { url = "https://files.pythonhosted.org/packages/2c/4b/baa16d46469e024846fc1a8aa0cfa63f1f89ad0fd3eaa985359a168c3fb0/uv-0.10.2-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:6ec75cfe638b316b329474aa798c3988e5946ead4d9e977fe4dc6fc2ea3e0b8b", size = 23252208, upload-time = "2026-02-10T19:17:54.46Z" },
2257
+ { url = "https://files.pythonhosted.org/packages/d6/84/6a74e5ec2ee90e4314905e6d1d1708d473e06405e492ec38868b42645388/uv-0.10.2-py3-none-win32.whl", hash = "sha256:f7f3c7e09bf53b81f55730a67dd86299158f470dffb2bd279b6432feb198d231", size = 21118543, upload-time = "2026-02-10T19:18:07.296Z" },
2258
+ { url = "https://files.pythonhosted.org/packages/dd/f9/e5cc6cf3a578b87004e857274df97d3cdecd8e19e965869b9b67c094c20c/uv-0.10.2-py3-none-win_amd64.whl", hash = "sha256:7b3685aa1da15acbe080b4cba8684afbb6baf11c9b04d4d4b347cc18b7b9cfa0", size = 23620790, upload-time = "2026-02-10T19:17:45.204Z" },
2259
+ { url = "https://files.pythonhosted.org/packages/df/7a/99979dc08ae6a65f4f7a44c5066699016c6eecdc4e695b7512c2efb53378/uv-0.10.2-py3-none-win_arm64.whl", hash = "sha256:abdd5b3c6b871b17bf852a90346eb7af881345706554fd082346b000a9393afd", size = 22035199, upload-time = "2026-02-10T19:18:03.679Z" },
2251
2260
  ]
2252
2261
 
2253
2262
  [[package]]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes