mreg-api 0.8.0__tar.gz → 0.8.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 (95) hide show
  1. {mreg_api-0.8.0 → mreg_api-0.8.2}/CHANGELOG.md +11 -1
  2. {mreg_api-0.8.0 → mreg_api-0.8.2}/PKG-INFO +2 -2
  3. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/_version.py +3 -3
  4. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/client.py +10 -10
  5. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/exceptions.py +2 -2
  6. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/managers.py +1 -1
  7. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/requestlog.py +3 -3
  8. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api.egg-info/PKG-INFO +2 -2
  9. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api.egg-info/requires.txt +1 -1
  10. mreg_api-0.8.2/mreg_api.egg-info/scm_version.json +8 -0
  11. {mreg_api-0.8.0 → mreg_api-0.8.2}/pyproject.toml +1 -1
  12. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/test_client.py +2 -2
  13. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/test_exceptions.py +6 -6
  14. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/test_requestlog.py +6 -6
  15. {mreg_api-0.8.0 → mreg_api-0.8.2}/uv.lock +64 -40
  16. mreg_api-0.8.0/mreg_api.egg-info/scm_version.json +0 -8
  17. {mreg_api-0.8.0 → mreg_api-0.8.2}/.claude/CLAUDE.md +0 -0
  18. {mreg_api-0.8.0 → mreg_api-0.8.2}/.github/workflows/docs.yml +0 -0
  19. {mreg_api-0.8.0 → mreg_api-0.8.2}/.github/workflows/publish.yml +0 -0
  20. {mreg_api-0.8.0 → mreg_api-0.8.2}/.github/workflows/test.yml +0 -0
  21. {mreg_api-0.8.0 → mreg_api-0.8.2}/.gitignore +0 -0
  22. {mreg_api-0.8.0 → mreg_api-0.8.2}/.markdownlint.json +0 -0
  23. {mreg_api-0.8.0 → mreg_api-0.8.2}/.pre-commit-config.yaml +0 -0
  24. {mreg_api-0.8.0 → mreg_api-0.8.2}/LICENSE +0 -0
  25. {mreg_api-0.8.0 → mreg_api-0.8.2}/NOTES.md +0 -0
  26. {mreg_api-0.8.0 → mreg_api-0.8.2}/README.md +0 -0
  27. {mreg_api-0.8.0 → mreg_api-0.8.2}/TESTING.md +0 -0
  28. {mreg_api-0.8.0 → mreg_api-0.8.2}/ci/Dockerfile +0 -0
  29. {mreg_api-0.8.0 → mreg_api-0.8.2}/ci/docker-compose.yml +0 -0
  30. {mreg_api-0.8.0 → mreg_api-0.8.2}/ci/run_tests.sh +0 -0
  31. {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/_macros/main.py +0 -0
  32. {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/guides/authentication.md +0 -0
  33. {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/guides/caching.md +0 -0
  34. {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/guides/configuration.md +0 -0
  35. {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/guides/eventlog.md +0 -0
  36. {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/guides/exceptions.md +0 -0
  37. {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/guides/requestlog.md +0 -0
  38. {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/guides/resources.md +0 -0
  39. {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/index.md +0 -0
  40. {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/quick-start.md +0 -0
  41. {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/reference/cache.md +0 -0
  42. {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/reference/client.md +0 -0
  43. {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/reference/events.md +0 -0
  44. {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/reference/exceptions.md +0 -0
  45. {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/reference/managers.md +0 -0
  46. {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/reference/models.md +0 -0
  47. {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/reference/requestlog.md +0 -0
  48. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/__about__.py +0 -0
  49. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/__init__.py +0 -0
  50. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/cache.py +0 -0
  51. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/endpoints.py +0 -0
  52. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/events.py +0 -0
  53. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/models/__init__.py +0 -0
  54. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/models/abstracts.py +0 -0
  55. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/models/fields.py +0 -0
  56. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/models/history.py +0 -0
  57. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/models/models.py +0 -0
  58. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/py.typed +0 -0
  59. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/types.py +0 -0
  60. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/utilities/__init__.py +0 -0
  61. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/utilities/fs.py +0 -0
  62. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/utilities/shared.py +0 -0
  63. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api.egg-info/SOURCES.txt +0 -0
  64. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api.egg-info/dependency_links.txt +0 -0
  65. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api.egg-info/scm_file_list.json +0 -0
  66. {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api.egg-info/top_level.txt +0 -0
  67. {mreg_api-0.8.0 → mreg_api-0.8.2}/setup.cfg +0 -0
  68. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/__init__.py +0 -0
  69. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/conftest.py +0 -0
  70. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/__init__.py +0 -0
  71. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/conftest.py +0 -0
  72. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_atoms.py +0 -0
  73. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_cname.py +0 -0
  74. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_dhcp.py +0 -0
  75. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_host_records.py +0 -0
  76. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_hostgroups.py +0 -0
  77. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_hosts.py +0 -0
  78. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_ip.py +0 -0
  79. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_labels.py +0 -0
  80. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_meta.py +0 -0
  81. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_nameservers.py +0 -0
  82. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_network_policy.py +0 -0
  83. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_networks.py +0 -0
  84. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_permissions.py +0 -0
  85. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_roles.py +0 -0
  86. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_zones.py +0 -0
  87. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/models/__init__.py +0 -0
  88. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/models/test_fields.py +0 -0
  89. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/models/test_history.py +0 -0
  90. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/models/test_models.py +0 -0
  91. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/test_cache.py +0 -0
  92. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/test_events.py +0 -0
  93. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/test_managers.py +0 -0
  94. {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/test_types.py +0 -0
  95. {mreg_api-0.8.0 → mreg_api-0.8.2}/zensical.toml +0 -0
@@ -5,7 +5,17 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
- <!-- ## Unreleased -->
8
+ ## Unreleased
9
+
10
+ ### Changed
11
+
12
+ - **BREAKING:** Now uses httpx2 instead of httpx due to the lack of maintenance of the latter, as well as to remove the reliance on certifi as a certificate source.
13
+
14
+ ## [0.8.1](https://github.com/unioslo/mreg-api/releases/tag/0.8.1) - 2026-10-22
15
+
16
+ ### Fixed
17
+
18
+ - Dependencies affected by the eMudhra/emSign root cert vulnerabilities.
9
19
 
10
20
  ## [0.8.0](https://github.com/unioslo/mreg-api/releases/tag/0.8.0) - 2026-10-15
11
21
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mreg-api
3
- Version: 0.8.0
3
+ Version: 0.8.2
4
4
  Summary: MREG API
5
5
  Author-email: Terje Kvernes <terjekv@uio.no>
6
6
  Maintainer-email: Peder Hovdan Andresen <pederhan@uio.no>
@@ -691,12 +691,12 @@ Classifier: Programming Language :: Python :: 3.13
691
691
  Requires-Python: >=3.11
692
692
  Description-Content-Type: text/markdown
693
693
  License-File: LICENSE
694
- Requires-Dist: httpx[socks]>=0.28.1
695
694
  Requires-Dist: typing-extensions>=4.16.0
696
695
  Requires-Dist: pydantic>=2.12
697
696
  Requires-Dist: pydantic-extra-types>=2.1.0
698
697
  Requires-Dist: diskcache>=5.6.3
699
698
  Requires-Dist: pydantic-settings>=2.12.0
699
+ Requires-Dist: httpx2[socks]>=2.16.0
700
700
  Dynamic: license-file
701
701
 
702
702
  # MREG API [![Build Status](https://github.com/unioslo/mreg-api/actions/workflows/test.yml/badge.svg)](https://github.com/unioslo/mreg-api/actions/workflows/test.yml)
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.8.0'
22
- __version_tuple__ = version_tuple = (0, 8, 0)
21
+ __version__ = version = '0.8.2'
22
+ __version_tuple__ = version_tuple = (0, 8, 2)
23
23
 
24
- __commit_id__ = commit_id = 'g7da738fc6'
24
+ __commit_id__ = commit_id = 'g210614b76'
@@ -23,8 +23,8 @@ from typing import overload
23
23
  from urllib.parse import urljoin
24
24
  from uuid import uuid4
25
25
 
26
- import httpx
27
- from httpx import Response
26
+ import httpx2
27
+ from httpx2 import Response
28
28
  from pydantic import BaseModel
29
29
  from pydantic import TypeAdapter
30
30
  from pydantic import ValidationError
@@ -431,7 +431,7 @@ class MregClient:
431
431
 
432
432
  if not user_agent:
433
433
  user_agent = f"mreg-api-{__version__}"
434
- self.session: httpx.Client = httpx.Client(
434
+ self.session: httpx2.Client = httpx2.Client(
435
435
  headers={"User-Agent": user_agent},
436
436
  follow_redirects=follow_redirects,
437
437
  timeout=timeout,
@@ -669,12 +669,12 @@ class MregClient:
669
669
  logger.info("Authenticating %s @ %s", username, token_url)
670
670
 
671
671
  try:
672
- response = httpx.post(
672
+ response = httpx2.post(
673
673
  token_url,
674
674
  data={"username": username, "password": password},
675
675
  timeout=self.timeout,
676
676
  )
677
- except httpx.RequestError as e:
677
+ except httpx2.RequestError as e:
678
678
  raise ConnectionFailedError(f"Connection failed: {e}", request=e.request) from e
679
679
 
680
680
  if not response.is_success:
@@ -699,7 +699,7 @@ class MregClient:
699
699
  path = urljoin(self.url, Endpoint.TokenLogout)
700
700
  try:
701
701
  self.session.post(path, timeout=self.timeout)
702
- except httpx.RequestError as e:
702
+ except httpx2.RequestError as e:
703
703
  logger.warning("Failed to log out: %s", e)
704
704
 
705
705
  def test_auth(self) -> None:
@@ -718,7 +718,7 @@ class MregClient:
718
718
  timeout=self.timeout,
719
719
  )
720
720
  ret.raise_for_status()
721
- except httpx.HTTPStatusError as e:
721
+ except httpx2.HTTPStatusError as e:
722
722
  if e.response.status_code == 401:
723
723
  raise InvalidAuthTokenError(f"Authorization test failed: {e}", response=e.response) from e
724
724
  raise ResponseError(f"Authorization test failed: {e}", response=e.response) from e
@@ -783,7 +783,7 @@ class MregClient:
783
783
 
784
784
  try:
785
785
  result = self.session.send(request)
786
- except httpx.RequestError as e:
786
+ except httpx2.RequestError as e:
787
787
  raise ConnectionFailedError(f"Connection failed: {e}", request=e.request) from e
788
788
 
789
789
  # Log response in response log
@@ -1151,13 +1151,13 @@ class MregClient:
1151
1151
  )
1152
1152
  return len(content)
1153
1153
 
1154
- def _get_list_non_paginated(self, response: httpx.Response, path: str, limit: int | None) -> list[Json]:
1154
+ def _get_list_non_paginated(self, response: httpx2.Response, path: str, limit: int | None) -> list[Json]:
1155
1155
  """Collect results from a non-paginated endpoint (returns everything at once)."""
1156
1156
  results = validate_list_response(response)
1157
1157
  return self._truncate(results, len(results), path, limit)
1158
1158
 
1159
1159
  def _get_list_paginated(
1160
- self, response: httpx.Response, path: str, ok404: bool, limit: int | None
1160
+ self, response: httpx2.Response, path: str, ok404: bool, limit: int | None
1161
1161
  ) -> list[Json]:
1162
1162
  """Collect results from a paginated endpoint, following `next` links.
1163
1163
 
@@ -5,8 +5,8 @@ from __future__ import annotations
5
5
  import logging
6
6
  from functools import cached_property
7
7
 
8
- from httpx import Request
9
- from httpx import Response
8
+ from httpx2 import Request
9
+ from httpx2 import Response
10
10
  from pydantic import BaseModel
11
11
  from pydantic import ValidationError
12
12
  from typing_extensions import deprecated
@@ -36,7 +36,7 @@ from typing import Literal
36
36
  from typing import TypeVar
37
37
  from typing import overload
38
38
 
39
- from httpx import Response
39
+ from httpx2 import Response
40
40
  from pydantic import BaseModel
41
41
  from pydantic import ValidationError
42
42
  from typing_extensions import deprecated
@@ -7,8 +7,8 @@ from collections.abc import Callable
7
7
  from collections.abc import Iterator
8
8
  from typing import NamedTuple
9
9
 
10
- from httpx import Request
11
- from httpx import Response
10
+ from httpx2 import Request
11
+ from httpx2 import Response
12
12
 
13
13
  from mreg_api.types import Json
14
14
  from mreg_api.types import JsonMapping
@@ -31,7 +31,7 @@ class RequestRecord(NamedTuple):
31
31
  @property
32
32
  def path(self) -> str:
33
33
  """Get the request path (URL without base)."""
34
- # TODO: Make this less hacky! Can we get the path + query directly from httpx?
34
+ # TODO: Make this less hacky! Can we get the path + query directly from httpx2?
35
35
  parts = [f"{self.response.request.url.scheme}://", self.response.request.url.host]
36
36
 
37
37
  if (port_s := f":{self.response.request.url.port}") in self.url:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mreg-api
3
- Version: 0.8.0
3
+ Version: 0.8.2
4
4
  Summary: MREG API
5
5
  Author-email: Terje Kvernes <terjekv@uio.no>
6
6
  Maintainer-email: Peder Hovdan Andresen <pederhan@uio.no>
@@ -691,12 +691,12 @@ Classifier: Programming Language :: Python :: 3.13
691
691
  Requires-Python: >=3.11
692
692
  Description-Content-Type: text/markdown
693
693
  License-File: LICENSE
694
- Requires-Dist: httpx[socks]>=0.28.1
695
694
  Requires-Dist: typing-extensions>=4.16.0
696
695
  Requires-Dist: pydantic>=2.12
697
696
  Requires-Dist: pydantic-extra-types>=2.1.0
698
697
  Requires-Dist: diskcache>=5.6.3
699
698
  Requires-Dist: pydantic-settings>=2.12.0
699
+ Requires-Dist: httpx2[socks]>=2.16.0
700
700
  Dynamic: license-file
701
701
 
702
702
  # MREG API [![Build Status](https://github.com/unioslo/mreg-api/actions/workflows/test.yml/badge.svg)](https://github.com/unioslo/mreg-api/actions/workflows/test.yml)
@@ -1,6 +1,6 @@
1
- httpx[socks]>=0.28.1
2
1
  typing-extensions>=4.16.0
3
2
  pydantic>=2.12
4
3
  pydantic-extra-types>=2.1.0
5
4
  diskcache>=5.6.3
6
5
  pydantic-settings>=2.12.0
6
+ httpx2[socks]>=2.16.0
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.8.2",
3
+ "distance": 0,
4
+ "node": "g210614b76bc113795f3e1e181394eeb7ebf335b9",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-10-26"
8
+ }
@@ -22,12 +22,12 @@ classifiers = [
22
22
  "Programming Language :: Python :: 3.13",
23
23
  ]
24
24
  dependencies = [
25
- "httpx[socks]>=0.28.1",
26
25
  "typing-extensions>=4.16.0",
27
26
  "pydantic>=2.12",
28
27
  "pydantic-extra-types>=2.1.0",
29
28
  "diskcache>=5.6.3",
30
29
  "pydantic-settings>=2.12.0",
30
+ "httpx2[socks]>=2.16.0",
31
31
  ]
32
32
  dynamic = ["version"]
33
33
 
@@ -6,8 +6,8 @@ from typing import Any
6
6
  from typing import get_args
7
7
 
8
8
  import pytest
9
- from httpx import Request as HttpxRequest
10
- from httpx import Response as HttpxResponse
9
+ from httpx2 import Request as HttpxRequest
10
+ from httpx2 import Response as HttpxResponse
11
11
  from inline_snapshot import snapshot
12
12
  from pytest_httpserver import HTTPServer
13
13
  from werkzeug import Response
@@ -3,7 +3,7 @@ from __future__ import annotations
3
3
  import json
4
4
  from typing import Any
5
5
 
6
- import httpx
6
+ import httpx2
7
7
  import pytest
8
8
  from inline_snapshot import snapshot
9
9
  from pydantic import ValidationError as PydanticValidationError
@@ -35,16 +35,16 @@ def make_mock_response(
35
35
  text_body: str | None = None,
36
36
  method: str = "POST",
37
37
  url: str = "http://localhost/api/v1/hosts/",
38
- ) -> httpx.Response:
38
+ ) -> httpx2.Response:
39
39
  """Create a mock httpx Response for testing."""
40
- request = httpx.Request(method, url)
40
+ request = httpx2.Request(method, url)
41
41
  if json_body is not None:
42
42
  content = json.dumps(json_body).encode()
43
43
  headers = {"content-type": "application/json"}
44
44
  else:
45
45
  content = (text_body or "").encode()
46
46
  headers = {"content-type": "text/plain"}
47
- return httpx.Response(
47
+ return httpx2.Response(
48
48
  status_code=status_code,
49
49
  content=content,
50
50
  headers=headers,
@@ -475,8 +475,8 @@ class TestTransportErrors:
475
475
  """A raw httpx connection error on the request path becomes ConnectionFailedError."""
476
476
  client = MregClient(url=httpserver.url_for("/"), domain="example.com")
477
477
 
478
- def boom(request: httpx.Request, **kwargs: Any) -> httpx.Response:
479
- raise httpx.ConnectError("connection refused", request=request)
478
+ def boom(request: httpx2.Request, **kwargs: Any) -> httpx2.Response:
479
+ raise httpx2.ConnectError("connection refused", request=request)
480
480
 
481
481
  monkeypatch.setattr(client.session, "send", boom)
482
482
 
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- import httpx
3
+ import httpx2
4
4
  import pytest
5
5
 
6
6
  from mreg_api.requestlog import RequestLog
@@ -26,8 +26,8 @@ def test_request_log_add_default_maxsize() -> None:
26
26
  log = RequestLog()
27
27
  assert log.maxsize is None
28
28
 
29
- response1 = httpx.Response(200, request=httpx.Request("GET", "https://example.com"))
30
- response2 = httpx.Response(404, request=httpx.Request("POST", "https://example.com"))
29
+ response1 = httpx2.Response(200, request=httpx2.Request("GET", "https://example.com"))
30
+ response2 = httpx2.Response(404, request=httpx2.Request("POST", "https://example.com"))
31
31
  log.add(response1)
32
32
  log.add(response2)
33
33
  assert len(log) == 2
@@ -35,8 +35,8 @@ def test_request_log_add_default_maxsize() -> None:
35
35
 
36
36
  def test_request_log_add_overflow() -> None:
37
37
  log = RequestLog(maxsize=2)
38
- response1 = httpx.Response(200, request=httpx.Request("GET", "https://example.com"))
39
- response2 = httpx.Response(404, request=httpx.Request("POST", "https://example.com"))
38
+ response1 = httpx2.Response(200, request=httpx2.Request("GET", "https://example.com"))
39
+ response2 = httpx2.Response(404, request=httpx2.Request("POST", "https://example.com"))
40
40
  log.add(response1)
41
41
  log.add(response2)
42
42
 
@@ -45,7 +45,7 @@ def test_request_log_add_overflow() -> None:
45
45
  assert log.get()[1].status == 404
46
46
 
47
47
  # Adding a third record removes the oldest one
48
- response3 = httpx.Response(500, request=httpx.Request("PUT", "https://example.com"))
48
+ response3 = httpx2.Response(500, request=httpx2.Request("PUT", "https://example.com"))
49
49
  log.add(response3)
50
50
  assert len(log) == 2
51
51
  assert log.get()[0].status == 404
@@ -1,6 +1,10 @@
1
1
  version = 1
2
- revision = 3
2
+ revision = 5
3
3
  requires-python = ">=3.11"
4
+ resolution-markers = [
5
+ "python_full_version >= '3.12' and sys_platform == 'emscripten'",
6
+ "python_full_version < '3.12' or sys_platform != 'emscripten'",
7
+ ]
4
8
 
5
9
  [[package]]
6
10
  name = "annotated-types"
@@ -13,15 +17,15 @@ wheels = [
13
17
 
14
18
  [[package]]
15
19
  name = "anyio"
16
- version = "4.12.1"
20
+ version = "4.15.1"
17
21
  source = { registry = "https://pypi.org/simple" }
18
22
  dependencies = [
19
23
  { name = "idna" },
20
- { name = "typing-extensions", marker = "python_full_version < '3.13'" },
24
+ { name = "typing-extensions", marker = "python_full_version < '3.15'" },
21
25
  ]
22
- sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" }
26
+ sdist = { url = "https://files.pythonhosted.org/packages/a9/d2/f4d173e22df740bc37b1db102b386ba719b66e95b0f0d751f556b387e6d2/anyio-4.15.1.tar.gz", hash = "sha256:9f28306018cbd6d329e64a36d58256edff76dd996fe423bc957326e578b82a94", size = 276966, upload-time = "2026-09-05T10:42:39.44Z" }
23
27
  wheels = [
24
- { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" },
28
+ { url = "https://files.pythonhosted.org/packages/12/b8/4bd346e22b28902df4d651910f5242c28d84e4a5c2435ca5c3f797ed7e2e/anyio-4.15.1-py3-none-any.whl", hash = "sha256:6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101", size = 132079, upload-time = "2026-09-05T10:42:37.923Z" },
25
29
  ]
26
30
 
27
31
  [[package]]
@@ -61,11 +65,11 @@ wheels = [
61
65
 
62
66
  [[package]]
63
67
  name = "certifi"
64
- version = "2026.1.4"
68
+ version = "2026.10.19"
65
69
  source = { registry = "https://pypi.org/simple" }
66
- sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" }
70
+ sdist = { url = "https://files.pythonhosted.org/packages/a6/bd/1436c50cc46699de0230fbaacc1d1de7bfec413176099949e9d5112e88f2/certifi-2026.10.19.tar.gz", hash = "sha256:035c1e85572b141bf1c3a3eff0e33a8eb74917522f2559075ff8d2fea780a1ae", size = 137598, upload-time = "2026-10-20T02:24:16.604Z" }
67
71
  wheels = [
68
- { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" },
72
+ { url = "https://files.pythonhosted.org/packages/c4/51/29046e48f693c54e5b7412216d447a1d8362c9653148d98c02cdf65fa733/certifi-2026.10.19-py3-none-any.whl", hash = "sha256:42d35340cc5b9ba78e818ddbff0c5b1c2b779de448a340fd1b989f5fa8670e1b", size = 136464, upload-time = "2026-10-20T02:24:15.072Z" },
69
73
  ]
70
74
 
71
75
  [[package]]
@@ -419,31 +423,33 @@ wheels = [
419
423
  ]
420
424
 
421
425
  [[package]]
422
- name = "httpcore"
423
- version = "1.0.9"
426
+ name = "httpcore2"
427
+ version = "2.16.0"
424
428
  source = { registry = "https://pypi.org/simple" }
425
429
  dependencies = [
426
- { name = "certifi" },
427
430
  { name = "h11" },
431
+ { name = "truststore" },
428
432
  ]
429
- sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" }
433
+ sdist = { url = "https://files.pythonhosted.org/packages/c0/61/afa9d6b7452f9eca73f73d45324eb0bb52f098fd5e6049bf6b8263be9b4e/httpcore2-2.16.0.tar.gz", hash = "sha256:c72cd0413563b17e1cd8354677dff887466f8ec2551679759e93126534428643", size = 69886, upload-time = "2026-10-21T07:09:45.31Z" }
430
434
  wheels = [
431
- { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" },
435
+ { url = "https://files.pythonhosted.org/packages/af/c2/ce417c397afa5181f0e3c6ff01a4d01639414e1adef08730d97571297151/httpcore2-2.16.0-py3-none-any.whl", hash = "sha256:5c4358319f2602d984ad93182c9fee5160f22e9da7babdda870a5e7c4e2dc34f", size = 85070, upload-time = "2026-10-21T07:09:42.802Z" },
432
436
  ]
433
437
 
434
438
  [[package]]
435
- name = "httpx"
436
- version = "0.28.1"
439
+ name = "httpx2"
440
+ version = "2.16.0"
437
441
  source = { registry = "https://pypi.org/simple" }
438
442
  dependencies = [
439
- { name = "anyio" },
440
- { name = "certifi" },
441
- { name = "httpcore" },
443
+ { name = "anyio", marker = "sys_platform != 'emscripten'" },
444
+ { name = "httpcore2", marker = "sys_platform != 'emscripten'" },
445
+ { name = "httpx2-jsfetch", marker = "python_full_version >= '3.12' and sys_platform == 'emscripten'" },
442
446
  { name = "idna" },
447
+ { name = "truststore", marker = "sys_platform != 'emscripten'" },
448
+ { name = "typing-extensions", marker = "python_full_version < '3.13'" },
443
449
  ]
444
- sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" }
450
+ sdist = { url = "https://files.pythonhosted.org/packages/43/73/5ca2cedf5e4e50423d1c258877865a6b62793633b561c58499f8aeb33b7e/httpx2-2.16.0.tar.gz", hash = "sha256:0d54c98128e8f2ff7fbbde0fca8c359e5f032edeaaaac443cdb7f31f685bcd7f", size = 103116, upload-time = "2026-10-21T07:09:46.348Z" }
445
451
  wheels = [
446
- { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
452
+ { url = "https://files.pythonhosted.org/packages/7b/3d/2e4bc4fd1ef9770871669adb348d612a6e4786b303a23f9935b81c48dd60/httpx2-2.16.0-py3-none-any.whl", hash = "sha256:fd2c5d7909e8d86fe92d53020c310ca0e4e431b838c207c5754b9bbf0308d49a", size = 97880, upload-time = "2026-10-21T07:09:44.01Z" },
447
453
  ]
448
454
 
449
455
  [package.optional-dependencies]
@@ -451,13 +457,22 @@ socks = [
451
457
  { name = "socksio" },
452
458
  ]
453
459
 
460
+ [[package]]
461
+ name = "httpx2-jsfetch"
462
+ version = "1.0"
463
+ source = { registry = "https://pypi.org/simple" }
464
+ sdist = { url = "https://files.pythonhosted.org/packages/cd/c4/0e5636363151a2a1795e0a77617168b9ca438e1748ec05fc9b5687f93d64/httpx2_jsfetch-1.0.tar.gz", hash = "sha256:70a0e3eabfef7cce5ad9c629f7d01ca05e418f586646f4ddf14782e4c1454c60", size = 6872, upload-time = "2026-08-07T00:13:07.492Z" }
465
+ wheels = [
466
+ { url = "https://files.pythonhosted.org/packages/9b/43/832f631d32e4f1211caa2ba368317739fe71f0b8530e4c9d15dc454bac2a/httpx2_jsfetch-1.0-py3-none-any.whl", hash = "sha256:cb916b707601e69a07721aabc8f3f6659be3a6893bc1ff5c6f9e02241df2da32", size = 6382, upload-time = "2026-08-07T00:13:06.567Z" },
467
+ ]
468
+
454
469
  [[package]]
455
470
  name = "idna"
456
- version = "3.11"
471
+ version = "3.20"
457
472
  source = { registry = "https://pypi.org/simple" }
458
- sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" }
473
+ sdist = { url = "https://files.pythonhosted.org/packages/f5/08/8eea9d4b8302028f3abb2c0813953f7aec26d33b7a8960ed760e65ff29fa/idna-3.20.tar.gz", hash = "sha256:a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44", size = 216463, upload-time = "2026-09-17T14:11:04.752Z" }
459
474
  wheels = [
460
- { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" },
475
+ { url = "https://files.pythonhosted.org/packages/58/a2/bb081bab032533a855d44de1d56f8e8426114ff1ba5d1f07a438a0a654f8/idna-3.20-py3-none-any.whl", hash = "sha256:ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c", size = 69583, upload-time = "2026-09-17T14:11:03.168Z" },
461
476
  ]
462
477
 
463
478
  [[package]]
@@ -718,7 +733,7 @@ name = "mreg-api"
718
733
  source = { editable = "." }
719
734
  dependencies = [
720
735
  { name = "diskcache" },
721
- { name = "httpx", extra = ["socks"] },
736
+ { name = "httpx2", extra = ["socks"] },
722
737
  { name = "pydantic" },
723
738
  { name = "pydantic-extra-types" },
724
739
  { name = "pydantic-settings" },
@@ -752,7 +767,7 @@ docs = [
752
767
  [package.metadata]
753
768
  requires-dist = [
754
769
  { name = "diskcache", specifier = ">=5.6.3" },
755
- { name = "httpx", extras = ["socks"], specifier = ">=0.28.1" },
770
+ { name = "httpx2", extras = ["socks"], specifier = ">=2.16.0" },
756
771
  { name = "pydantic", specifier = ">=2.12" },
757
772
  { name = "pydantic-extra-types", specifier = ">=2.1.0" },
758
773
  { name = "pydantic-settings", specifier = ">=2.12.0" },
@@ -962,16 +977,16 @@ wheels = [
962
977
 
963
978
  [[package]]
964
979
  name = "pydantic-settings"
965
- version = "2.12.0"
980
+ version = "2.14.2"
966
981
  source = { registry = "https://pypi.org/simple" }
967
982
  dependencies = [
968
983
  { name = "pydantic" },
969
984
  { name = "python-dotenv" },
970
985
  { name = "typing-inspection" },
971
986
  ]
972
- sdist = { url = "https://files.pythonhosted.org/packages/43/4b/ac7e0aae12027748076d72a8764ff1c9d82ca75a7a52622e67ed3f765c54/pydantic_settings-2.12.0.tar.gz", hash = "sha256:005538ef951e3c2a68e1c08b292b5f2e71490def8589d4221b95dab00dafcfd0", size = 194184, upload-time = "2025-11-10T14:25:47.013Z" }
987
+ sdist = { url = "https://files.pythonhosted.org/packages/5c/b5/8f48e906c3e0205276e8bd8cb7512217a87b2685304d64be27cad5b3019f/pydantic_settings-2.14.2.tar.gz", hash = "sha256:c19dd64b19097f1de80184f0cc7b0272a13ae6e170cbf240a3e27e381ed14a5f", size = 237700, upload-time = "2026-06-19T13:44:56.324Z" }
973
988
  wheels = [
974
- { url = "https://files.pythonhosted.org/packages/c1/60/5d4751ba3f4a40a6891f24eec885f51afd78d208498268c734e256fb13c4/pydantic_settings-2.12.0-py3-none-any.whl", hash = "sha256:fddb9fd99a5b18da837b29710391e945b1e30c135477f484084ee513adb93809", size = 51880, upload-time = "2025-11-10T14:25:45.546Z" },
989
+ { url = "https://files.pythonhosted.org/packages/77/c1/6e422f34e569cf8e18df68d1939c81c099d2b61e4f7d9621c8a77560799c/pydantic_settings-2.14.2-py3-none-any.whl", hash = "sha256:a20c97b37910b6550d5ea50fbcc2d4187defe58cd57070b73863d069419c9440", size = 61715, upload-time = "2026-06-19T13:44:55.02Z" },
975
990
  ]
976
991
 
977
992
  [[package]]
@@ -1007,7 +1022,7 @@ wheels = [
1007
1022
 
1008
1023
  [[package]]
1009
1024
  name = "pytest"
1010
- version = "9.0.2"
1025
+ version = "9.0.3"
1011
1026
  source = { registry = "https://pypi.org/simple" }
1012
1027
  dependencies = [
1013
1028
  { name = "colorama", marker = "sys_platform == 'win32'" },
@@ -1016,9 +1031,9 @@ dependencies = [
1016
1031
  { name = "pluggy" },
1017
1032
  { name = "pygments" },
1018
1033
  ]
1019
- sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901, upload-time = "2025-12-06T21:30:51.014Z" }
1034
+ sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" }
1020
1035
  wheels = [
1021
- { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801, upload-time = "2025-12-06T21:30:49.154Z" },
1036
+ { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" },
1022
1037
  ]
1023
1038
 
1024
1039
  [[package]]
@@ -1073,11 +1088,11 @@ wheels = [
1073
1088
 
1074
1089
  [[package]]
1075
1090
  name = "python-dotenv"
1076
- version = "1.2.1"
1091
+ version = "1.2.2"
1077
1092
  source = { registry = "https://pypi.org/simple" }
1078
- sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" }
1093
+ sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" }
1079
1094
  wheels = [
1080
- { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" },
1095
+ { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" },
1081
1096
  ]
1082
1097
 
1083
1098
  [[package]]
@@ -1203,11 +1218,11 @@ wheels = [
1203
1218
 
1204
1219
  [[package]]
1205
1220
  name = "setuptools"
1206
- version = "80.9.0"
1221
+ version = "83.0.0"
1207
1222
  source = { registry = "https://pypi.org/simple" }
1208
- sdist = { url = "https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958, upload-time = "2025-05-27T00:56:51.443Z" }
1223
+ sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254, upload-time = "2026-07-04T15:31:22.699Z" }
1209
1224
  wheels = [
1210
- { url = "https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486, upload-time = "2025-05-27T00:56:49.664Z" },
1225
+ { url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090, upload-time = "2026-07-04T15:31:20.885Z" },
1211
1226
  ]
1212
1227
 
1213
1228
  [[package]]
@@ -1316,6 +1331,15 @@ wheels = [
1316
1331
  { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477, upload-time = "2026-01-11T11:22:37.446Z" },
1317
1332
  ]
1318
1333
 
1334
+ [[package]]
1335
+ name = "truststore"
1336
+ version = "0.10.5"
1337
+ source = { registry = "https://pypi.org/simple" }
1338
+ sdist = { url = "https://files.pythonhosted.org/packages/ee/9f/c5201d42a484c061e528825fc8e2d565f5abd50a4ced6fb7d29c4ec99b2b/truststore-0.10.5.tar.gz", hash = "sha256:30d36967ccaded5cbb38d602c433f53600036c79d502f4533a49b60a03bbefcd", size = 28091, upload-time = "2026-10-12T22:27:31.808Z" }
1339
+ wheels = [
1340
+ { url = "https://files.pythonhosted.org/packages/51/e9/3a7820be2bb0fe53b6bc9c3be26d3d1158004e4c3ab953aa6840b955b1e9/truststore-0.10.5-py3-none-any.whl", hash = "sha256:9aaaedaefaf06d8b206278cf8b5012bc897f485a874503501e12d776df78951c", size = 19017, upload-time = "2026-10-12T22:27:30.377Z" },
1341
+ ]
1342
+
1319
1343
  [[package]]
1320
1344
  name = "typing-extensions"
1321
1345
  version = "4.16.0"
@@ -1375,14 +1399,14 @@ wheels = [
1375
1399
 
1376
1400
  [[package]]
1377
1401
  name = "werkzeug"
1378
- version = "3.1.4"
1402
+ version = "3.1.9"
1379
1403
  source = { registry = "https://pypi.org/simple" }
1380
1404
  dependencies = [
1381
1405
  { name = "markupsafe" },
1382
1406
  ]
1383
- sdist = { url = "https://files.pythonhosted.org/packages/45/ea/b0f8eeb287f8df9066e56e831c7824ac6bab645dd6c7a8f4b2d767944f9b/werkzeug-3.1.4.tar.gz", hash = "sha256:cd3cd98b1b92dc3b7b3995038826c68097dcb16f9baa63abe35f20eafeb9fe5e", size = 864687, upload-time = "2025-11-29T02:15:22.841Z" }
1407
+ sdist = { url = "https://files.pythonhosted.org/packages/a4/34/4dd12fc8bb7d61c91467ec3efe415ffa7d5456f799954b40c5bbaeae470e/werkzeug-3.1.9.tar.gz", hash = "sha256:55ca7c70a75689be937aa27f8ff4b018f06ff4838fc73045560bf0f5a1291060", size = 940188, upload-time = "2026-09-27T18:33:41.637Z" }
1384
1408
  wheels = [
1385
- { url = "https://files.pythonhosted.org/packages/2f/f9/9e082990c2585c744734f85bec79b5dae5df9c974ffee58fe421652c8e91/werkzeug-3.1.4-py3-none-any.whl", hash = "sha256:2ad50fb9ed09cc3af22c54698351027ace879a0b60a3b5edf5730b2f7d876905", size = 224960, upload-time = "2025-11-29T02:15:21.13Z" },
1409
+ { url = "https://files.pythonhosted.org/packages/a1/38/df03f564f43cec2684823f3cccae1a652ee7face1cbaa76fb223096e64d7/werkzeug-3.1.9-py3-none-any.whl", hash = "sha256:6392e50c78460ba618e5b21f08a71f59c99ce99cdc6cf6e3dd7e6ccca8754fab", size = 228700, upload-time = "2026-09-27T18:33:39.685Z" },
1386
1410
  ]
1387
1411
 
1388
1412
  [[package]]
@@ -1,8 +0,0 @@
1
- {
2
- "tag": "0.8.0",
3
- "distance": 0,
4
- "node": "g7da738fc63f8fb42bd29441ea0499f967776fe25",
5
- "dirty": false,
6
- "branch": "HEAD",
7
- "node_date": "2026-10-15"
8
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes