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.
- {mreg_api-0.8.0 → mreg_api-0.8.2}/CHANGELOG.md +11 -1
- {mreg_api-0.8.0 → mreg_api-0.8.2}/PKG-INFO +2 -2
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/_version.py +3 -3
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/client.py +10 -10
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/exceptions.py +2 -2
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/managers.py +1 -1
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/requestlog.py +3 -3
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api.egg-info/PKG-INFO +2 -2
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api.egg-info/requires.txt +1 -1
- mreg_api-0.8.2/mreg_api.egg-info/scm_version.json +8 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/pyproject.toml +1 -1
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/test_client.py +2 -2
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/test_exceptions.py +6 -6
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/test_requestlog.py +6 -6
- {mreg_api-0.8.0 → mreg_api-0.8.2}/uv.lock +64 -40
- mreg_api-0.8.0/mreg_api.egg-info/scm_version.json +0 -8
- {mreg_api-0.8.0 → mreg_api-0.8.2}/.claude/CLAUDE.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/.github/workflows/docs.yml +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/.github/workflows/publish.yml +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/.github/workflows/test.yml +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/.gitignore +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/.markdownlint.json +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/.pre-commit-config.yaml +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/LICENSE +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/NOTES.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/README.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/TESTING.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/ci/Dockerfile +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/ci/docker-compose.yml +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/ci/run_tests.sh +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/_macros/main.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/guides/authentication.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/guides/caching.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/guides/configuration.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/guides/eventlog.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/guides/exceptions.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/guides/requestlog.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/guides/resources.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/index.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/quick-start.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/reference/cache.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/reference/client.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/reference/events.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/reference/exceptions.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/reference/managers.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/reference/models.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/docs/reference/requestlog.md +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/__about__.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/__init__.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/cache.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/endpoints.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/events.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/models/__init__.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/models/abstracts.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/models/fields.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/models/history.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/models/models.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/py.typed +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/types.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/utilities/__init__.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/utilities/fs.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api/utilities/shared.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api.egg-info/SOURCES.txt +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api.egg-info/dependency_links.txt +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api.egg-info/scm_file_list.json +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/mreg_api.egg-info/top_level.txt +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/setup.cfg +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/__init__.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/conftest.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/__init__.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/conftest.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_atoms.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_cname.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_dhcp.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_host_records.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_hostgroups.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_hosts.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_ip.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_labels.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_meta.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_nameservers.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_network_policy.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_networks.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_permissions.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_roles.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/integration/test_zones.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/models/__init__.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/models/test_fields.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/models/test_history.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/models/test_models.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/test_cache.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/test_events.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/test_managers.py +0 -0
- {mreg_api-0.8.0 → mreg_api-0.8.2}/tests/test_types.py +0 -0
- {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
|
-
|
|
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.
|
|
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 [](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.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 8,
|
|
21
|
+
__version__ = version = '0.8.2'
|
|
22
|
+
__version_tuple__ = version_tuple = (0, 8, 2)
|
|
23
23
|
|
|
24
|
-
__commit_id__ = commit_id = '
|
|
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
|
|
27
|
-
from
|
|
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:
|
|
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 =
|
|
672
|
+
response = httpx2.post(
|
|
673
673
|
token_url,
|
|
674
674
|
data={"username": username, "password": password},
|
|
675
675
|
timeout=self.timeout,
|
|
676
676
|
)
|
|
677
|
-
except
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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:
|
|
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
|
|
9
|
-
from
|
|
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
|
|
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
|
|
11
|
-
from
|
|
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
|
|
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.
|
|
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 [](https://github.com/unioslo/mreg-api/actions/workflows/test.yml)
|
|
@@ -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
|
|
10
|
-
from
|
|
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
|
|
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
|
-
) ->
|
|
38
|
+
) -> httpx2.Response:
|
|
39
39
|
"""Create a mock httpx Response for testing."""
|
|
40
|
-
request =
|
|
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
|
|
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:
|
|
479
|
-
raise
|
|
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
|
|
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 =
|
|
30
|
-
response2 =
|
|
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 =
|
|
39
|
-
response2 =
|
|
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 =
|
|
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 =
|
|
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.
|
|
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.
|
|
24
|
+
{ name = "typing-extensions", marker = "python_full_version < '3.15'" },
|
|
21
25
|
]
|
|
22
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
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/
|
|
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.
|
|
68
|
+
version = "2026.10.19"
|
|
65
69
|
source = { registry = "https://pypi.org/simple" }
|
|
66
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
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/
|
|
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 = "
|
|
423
|
-
version = "
|
|
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/
|
|
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/
|
|
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 = "
|
|
436
|
-
version = "
|
|
439
|
+
name = "httpx2"
|
|
440
|
+
version = "2.16.0"
|
|
437
441
|
source = { registry = "https://pypi.org/simple" }
|
|
438
442
|
dependencies = [
|
|
439
|
-
{ name = "anyio" },
|
|
440
|
-
{ name = "
|
|
441
|
-
{ name = "
|
|
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/
|
|
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/
|
|
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.
|
|
471
|
+
version = "3.20"
|
|
457
472
|
source = { registry = "https://pypi.org/simple" }
|
|
458
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
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/
|
|
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 = "
|
|
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 = "
|
|
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.
|
|
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/
|
|
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/
|
|
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.
|
|
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/
|
|
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/
|
|
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.
|
|
1091
|
+
version = "1.2.2"
|
|
1077
1092
|
source = { registry = "https://pypi.org/simple" }
|
|
1078
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
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/
|
|
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 = "
|
|
1221
|
+
version = "83.0.0"
|
|
1207
1222
|
source = { registry = "https://pypi.org/simple" }
|
|
1208
|
-
sdist = { url = "https://files.pythonhosted.org/packages/
|
|
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/
|
|
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.
|
|
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/
|
|
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/
|
|
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]]
|
|
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
|
|
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
|
|
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
|