apexdevkit 1.15.7__tar.gz → 1.16.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.
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/PKG-INFO +1 -1
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/fastapi/dependable.py +1 -1
- apexdevkit-1.16.2/apexdevkit/fastapi/name.py +37 -0
- apexdevkit-1.16.2/apexdevkit/fastapi/request.py +31 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/fastapi/response.py +1 -3
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/fastapi/router.py +1 -1
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/fastapi/schema.py +1 -1
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/fluent.py +4 -1
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/testing/__init__.py +1 -3
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/testing/rest.py +41 -95
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/pyproject.toml +1 -1
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/LICENSE +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/README.md +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/__init__.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/annotation/__init__.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/annotation/deprecate.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/environment.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/error.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/fastapi/__init__.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/fastapi/builder.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/fastapi/docs.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/fastapi/resource.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/fastapi/service.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/formatter.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/http/__init__.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/http/fake.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/http/fluent.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/http/httpx.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/http/json.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/http/url.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/key_fn.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/py.typed +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/repository/__init__.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/repository/base.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/repository/connector.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/repository/database.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/repository/decorator.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/repository/in_memory.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/repository/interface.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/repository/mongo.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/repository/mssql.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/repository/sqlite.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/server.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/synchronization.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/testing/database.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/testing/fake.py +0 -0
- {apexdevkit-1.15.7 → apexdevkit-1.16.2}/apexdevkit/value.py +0 -0
|
@@ -6,9 +6,9 @@ from fastapi.requests import Request
|
|
|
6
6
|
|
|
7
7
|
from apexdevkit.error import ApiError, DoesNotExistError
|
|
8
8
|
from apexdevkit.fastapi import RestfulServiceBuilder
|
|
9
|
+
from apexdevkit.fastapi.name import RestfulName
|
|
9
10
|
from apexdevkit.fastapi.response import RestfulResponse
|
|
10
11
|
from apexdevkit.fastapi.service import RestfulService
|
|
11
|
-
from apexdevkit.testing import RestfulName
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
def inject(dependency: str) -> Any: # pragma: no cover
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
|
|
5
|
+
from apexdevkit.http import HttpUrl
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass
|
|
9
|
+
class RestfulName:
|
|
10
|
+
singular: str
|
|
11
|
+
|
|
12
|
+
plural: str = ""
|
|
13
|
+
|
|
14
|
+
def __post_init__(self) -> None:
|
|
15
|
+
self.plural = self.plural or as_plural(self.singular)
|
|
16
|
+
|
|
17
|
+
def __add__(self, other: str) -> str:
|
|
18
|
+
return HttpUrl(self.plural) + other
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def as_plural(singular: str) -> str:
|
|
22
|
+
suffixes = {
|
|
23
|
+
"y": "ies",
|
|
24
|
+
"ch": "ches",
|
|
25
|
+
"sh": "shes",
|
|
26
|
+
"s": "ses",
|
|
27
|
+
"z": "zes",
|
|
28
|
+
"x": "xes",
|
|
29
|
+
"fe": "ves",
|
|
30
|
+
"f": "ves",
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
for singular_suffix, plural_suffix in suffixes.items():
|
|
34
|
+
if singular.endswith(singular_suffix):
|
|
35
|
+
return singular.removesuffix(singular_suffix) + plural_suffix
|
|
36
|
+
|
|
37
|
+
return singular + "s"
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
from apexdevkit.http import Http, HttpMethod, JsonDict
|
|
7
|
+
from apexdevkit.http.fluent import HttpResponse
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass
|
|
11
|
+
class HttpRequest:
|
|
12
|
+
method: HttpMethod
|
|
13
|
+
http: Http
|
|
14
|
+
|
|
15
|
+
def with_endpoint(self, value: Any) -> HttpRequest:
|
|
16
|
+
self.http = self.http.with_endpoint(str(value))
|
|
17
|
+
|
|
18
|
+
return self
|
|
19
|
+
|
|
20
|
+
def with_param(self, name: str, value: Any) -> HttpRequest:
|
|
21
|
+
self.http = self.http.with_param(name, value)
|
|
22
|
+
|
|
23
|
+
return self
|
|
24
|
+
|
|
25
|
+
def with_json(self, value: JsonDict) -> HttpRequest:
|
|
26
|
+
self.http = self.http.with_json(value)
|
|
27
|
+
|
|
28
|
+
return self
|
|
29
|
+
|
|
30
|
+
def __call__(self) -> HttpResponse:
|
|
31
|
+
return self.http.request(self.method)
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
1
|
from dataclasses import dataclass
|
|
4
2
|
from typing import Any, Iterable
|
|
5
3
|
|
|
6
4
|
from apexdevkit.error import DoesNotExistError, ExistsError, ForbiddenError
|
|
7
|
-
from apexdevkit.
|
|
5
|
+
from apexdevkit.fastapi.name import RestfulName
|
|
8
6
|
|
|
9
7
|
|
|
10
8
|
@dataclass(frozen=True)
|
|
@@ -6,11 +6,11 @@ from fastapi import APIRouter, Depends, Path
|
|
|
6
6
|
from fastapi.responses import JSONResponse
|
|
7
7
|
|
|
8
8
|
from apexdevkit.fastapi.builder import RestfulServiceBuilder
|
|
9
|
+
from apexdevkit.fastapi.name import RestfulName
|
|
9
10
|
from apexdevkit.fastapi.resource import RestfulResource
|
|
10
11
|
from apexdevkit.fastapi.response import RestfulResponse
|
|
11
12
|
from apexdevkit.fastapi.schema import RestfulSchema, SchemaFields
|
|
12
13
|
from apexdevkit.fastapi.service import RawCollection, RawItem, RestfulService
|
|
13
|
-
from apexdevkit.testing import RestfulName
|
|
14
14
|
|
|
15
15
|
_Response = JSONResponse | dict[str, Any]
|
|
16
16
|
|
|
@@ -5,8 +5,8 @@ from typing import Any, Callable, Iterable, List
|
|
|
5
5
|
|
|
6
6
|
from pydantic import BaseModel, create_model
|
|
7
7
|
|
|
8
|
+
from apexdevkit.fastapi.name import RestfulName
|
|
8
9
|
from apexdevkit.fluent import FluentDict
|
|
9
|
-
from apexdevkit.testing import RestfulName
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class SchemaFields(ABC):
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from dataclasses import dataclass
|
|
4
|
-
from typing import Callable, Generic, TypeVar
|
|
4
|
+
from typing import Any, Callable, Generic, TypeVar
|
|
5
5
|
|
|
6
6
|
ItemT = TypeVar("ItemT")
|
|
7
7
|
|
|
@@ -33,6 +33,9 @@ class FluentElement(Generic[ItemT]):
|
|
|
33
33
|
def to(self, a_type: Callable[[ItemT], ConvertedT]) -> ConvertedT:
|
|
34
34
|
return a_type(self.value)
|
|
35
35
|
|
|
36
|
+
def as_dict(self) -> dict[str, Any]:
|
|
37
|
+
return dict(self.value) # type: ignore
|
|
38
|
+
|
|
36
39
|
def __str__(self) -> str:
|
|
37
40
|
return str(self.value)
|
|
38
41
|
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
from apexdevkit.testing.database import FakeConnector
|
|
2
2
|
from apexdevkit.testing.fake import FakeValue
|
|
3
|
-
from apexdevkit.testing.rest import RestCollection
|
|
3
|
+
from apexdevkit.testing.rest import RestCollection
|
|
4
4
|
|
|
5
5
|
__all__ = [
|
|
6
6
|
"FakeConnector",
|
|
7
7
|
"RestCollection",
|
|
8
|
-
"RestfulName",
|
|
9
|
-
"RestResource",
|
|
10
8
|
"FakeValue",
|
|
11
9
|
]
|
|
@@ -4,17 +4,19 @@ from dataclasses import dataclass
|
|
|
4
4
|
from functools import cached_property
|
|
5
5
|
from typing import Any, Iterable, Self
|
|
6
6
|
|
|
7
|
-
from apexdevkit.
|
|
8
|
-
from apexdevkit.
|
|
7
|
+
from apexdevkit.fastapi.name import RestfulName
|
|
8
|
+
from apexdevkit.fastapi.request import HttpRequest
|
|
9
|
+
from apexdevkit.http import Http, HttpMethod, JsonDict
|
|
10
|
+
from apexdevkit.http.fluent import HttpResponse
|
|
9
11
|
|
|
10
12
|
|
|
11
13
|
@dataclass(frozen=True)
|
|
12
|
-
class
|
|
14
|
+
class _RestResource:
|
|
13
15
|
http: Http
|
|
14
16
|
name: RestfulName
|
|
15
17
|
|
|
16
|
-
def create_one(self) ->
|
|
17
|
-
return
|
|
18
|
+
def create_one(self) -> _TestRequest:
|
|
19
|
+
return _TestRequest(
|
|
18
20
|
self.name,
|
|
19
21
|
HttpRequest(
|
|
20
22
|
HttpMethod.post,
|
|
@@ -22,8 +24,8 @@ class RestResource:
|
|
|
22
24
|
),
|
|
23
25
|
)
|
|
24
26
|
|
|
25
|
-
def create_many(self) ->
|
|
26
|
-
return
|
|
27
|
+
def create_many(self) -> _TestRequest:
|
|
28
|
+
return _TestRequest(
|
|
27
29
|
self.name,
|
|
28
30
|
HttpRequest(
|
|
29
31
|
HttpMethod.post,
|
|
@@ -31,8 +33,8 @@ class RestResource:
|
|
|
31
33
|
),
|
|
32
34
|
)
|
|
33
35
|
|
|
34
|
-
def read_one(self) ->
|
|
35
|
-
return
|
|
36
|
+
def read_one(self) -> _TestRequest:
|
|
37
|
+
return _TestRequest(
|
|
36
38
|
self.name,
|
|
37
39
|
HttpRequest(
|
|
38
40
|
HttpMethod.get,
|
|
@@ -40,8 +42,8 @@ class RestResource:
|
|
|
40
42
|
),
|
|
41
43
|
)
|
|
42
44
|
|
|
43
|
-
def read_all(self) ->
|
|
44
|
-
return
|
|
45
|
+
def read_all(self) -> _TestRequest:
|
|
46
|
+
return _TestRequest(
|
|
45
47
|
self.name,
|
|
46
48
|
HttpRequest(
|
|
47
49
|
HttpMethod.get,
|
|
@@ -49,8 +51,8 @@ class RestResource:
|
|
|
49
51
|
),
|
|
50
52
|
)
|
|
51
53
|
|
|
52
|
-
def update_one(self) ->
|
|
53
|
-
return
|
|
54
|
+
def update_one(self) -> _TestRequest:
|
|
55
|
+
return _TestRequest(
|
|
54
56
|
self.name,
|
|
55
57
|
HttpRequest(
|
|
56
58
|
HttpMethod.patch,
|
|
@@ -58,8 +60,8 @@ class RestResource:
|
|
|
58
60
|
),
|
|
59
61
|
)
|
|
60
62
|
|
|
61
|
-
def update_many(self) ->
|
|
62
|
-
return
|
|
63
|
+
def update_many(self) -> _TestRequest:
|
|
64
|
+
return _TestRequest(
|
|
63
65
|
self.name,
|
|
64
66
|
HttpRequest(
|
|
65
67
|
HttpMethod.patch,
|
|
@@ -67,8 +69,8 @@ class RestResource:
|
|
|
67
69
|
),
|
|
68
70
|
)
|
|
69
71
|
|
|
70
|
-
def replace_one(self) ->
|
|
71
|
-
return
|
|
72
|
+
def replace_one(self) -> _TestRequest:
|
|
73
|
+
return _TestRequest(
|
|
72
74
|
self.name,
|
|
73
75
|
HttpRequest(
|
|
74
76
|
HttpMethod.put,
|
|
@@ -76,8 +78,8 @@ class RestResource:
|
|
|
76
78
|
),
|
|
77
79
|
)
|
|
78
80
|
|
|
79
|
-
def replace_many(self) ->
|
|
80
|
-
return
|
|
81
|
+
def replace_many(self) -> _TestRequest:
|
|
82
|
+
return _TestRequest(
|
|
81
83
|
self.name,
|
|
82
84
|
HttpRequest(
|
|
83
85
|
HttpMethod.put,
|
|
@@ -85,8 +87,8 @@ class RestResource:
|
|
|
85
87
|
),
|
|
86
88
|
)
|
|
87
89
|
|
|
88
|
-
def delete_one(self) ->
|
|
89
|
-
return
|
|
90
|
+
def delete_one(self) -> _TestRequest:
|
|
91
|
+
return _TestRequest(
|
|
90
92
|
self.name,
|
|
91
93
|
HttpRequest(
|
|
92
94
|
HttpMethod.delete,
|
|
@@ -95,76 +97,8 @@ class RestResource:
|
|
|
95
97
|
)
|
|
96
98
|
|
|
97
99
|
|
|
98
|
-
@dataclass(frozen=True)
|
|
99
|
-
class RestCollection(RestResource):
|
|
100
|
-
def sub_resource(self, name: str) -> RestItem:
|
|
101
|
-
return RestItem(self.http.with_endpoint(self.name.plural), RestfulName(name))
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
@dataclass(frozen=True)
|
|
105
|
-
class RestItem(RestResource):
|
|
106
|
-
def sub_resource(self, name: str) -> RestItem:
|
|
107
|
-
return RestItem(self.http.with_endpoint(self.name.singular), RestfulName(name))
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
@dataclass
|
|
111
|
-
class RestfulName:
|
|
112
|
-
singular: str
|
|
113
|
-
|
|
114
|
-
plural: str = ""
|
|
115
|
-
|
|
116
|
-
def __post_init__(self) -> None:
|
|
117
|
-
self.plural = self.plural or as_plural(self.singular)
|
|
118
|
-
|
|
119
|
-
def __add__(self, other: str) -> str:
|
|
120
|
-
return HttpUrl(self.plural) + other
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
def as_plural(singular: str) -> str:
|
|
124
|
-
suffixes = {
|
|
125
|
-
"y": "ies",
|
|
126
|
-
"ch": "ches",
|
|
127
|
-
"sh": "shes",
|
|
128
|
-
"s": "ses",
|
|
129
|
-
"z": "zes",
|
|
130
|
-
"x": "xes",
|
|
131
|
-
"fe": "ves",
|
|
132
|
-
"f": "ves",
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
for singular_suffix, plural_suffix in suffixes.items():
|
|
136
|
-
if singular.endswith(singular_suffix):
|
|
137
|
-
return singular.removesuffix(singular_suffix) + plural_suffix
|
|
138
|
-
|
|
139
|
-
return singular + "s"
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
@dataclass
|
|
143
|
-
class HttpRequest:
|
|
144
|
-
method: HttpMethod
|
|
145
|
-
http: Http
|
|
146
|
-
|
|
147
|
-
def with_endpoint(self, value: Any) -> HttpRequest:
|
|
148
|
-
self.http = self.http.with_endpoint(str(value))
|
|
149
|
-
|
|
150
|
-
return self
|
|
151
|
-
|
|
152
|
-
def with_param(self, name: str, value: Any) -> HttpRequest:
|
|
153
|
-
self.http = self.http.with_param(name, value)
|
|
154
|
-
|
|
155
|
-
return self
|
|
156
|
-
|
|
157
|
-
def with_json(self, value: JsonDict) -> HttpRequest:
|
|
158
|
-
self.http = self.http.with_json(value)
|
|
159
|
-
|
|
160
|
-
return self
|
|
161
|
-
|
|
162
|
-
def __call__(self) -> HttpResponse:
|
|
163
|
-
return self.http.request(self.method)
|
|
164
|
-
|
|
165
|
-
|
|
166
100
|
@dataclass
|
|
167
|
-
class
|
|
101
|
+
class _TestRequest:
|
|
168
102
|
resource: RestfulName
|
|
169
103
|
request: HttpRequest
|
|
170
104
|
|
|
@@ -209,8 +143,8 @@ class RestRequest:
|
|
|
209
143
|
|
|
210
144
|
return [JsonDict(item) for item in items]
|
|
211
145
|
|
|
212
|
-
def ensure(self) ->
|
|
213
|
-
return
|
|
146
|
+
def ensure(self) -> _Response:
|
|
147
|
+
return _Response(
|
|
214
148
|
resource=self.resource,
|
|
215
149
|
json=JsonDict(self.response.json()),
|
|
216
150
|
http_code=self.response.code(),
|
|
@@ -218,7 +152,7 @@ class RestRequest:
|
|
|
218
152
|
|
|
219
153
|
|
|
220
154
|
@dataclass
|
|
221
|
-
class
|
|
155
|
+
class _Response:
|
|
222
156
|
resource: RestfulName
|
|
223
157
|
json: JsonDict
|
|
224
158
|
http_code: int
|
|
@@ -252,7 +186,7 @@ class RestResponse:
|
|
|
252
186
|
return self.with_message(value)
|
|
253
187
|
|
|
254
188
|
def with_message(self, value: str) -> Self:
|
|
255
|
-
assert self.json.value_of("error").
|
|
189
|
+
assert self.json.value_of("error").as_dict() == {"message": value}, self.json
|
|
256
190
|
|
|
257
191
|
return self
|
|
258
192
|
|
|
@@ -275,6 +209,18 @@ class RestResponse:
|
|
|
275
209
|
return self.with_data()
|
|
276
210
|
|
|
277
211
|
def with_data(self, **kwargs: Any) -> Self:
|
|
278
|
-
assert self.json.value_of("data").
|
|
212
|
+
assert self.json.value_of("data").as_dict() == {**kwargs}, self.json
|
|
279
213
|
|
|
280
214
|
return self
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
@dataclass(frozen=True)
|
|
218
|
+
class RestCollection(_RestResource):
|
|
219
|
+
def sub_resource(self, name: str) -> RestItem:
|
|
220
|
+
return RestItem(self.http.with_endpoint(self.name.plural), RestfulName(name))
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
@dataclass(frozen=True)
|
|
224
|
+
class RestItem(_RestResource):
|
|
225
|
+
def sub_resource(self, name: str) -> RestItem:
|
|
226
|
+
return RestItem(self.http.with_endpoint(self.name.singular), RestfulName(name))
|
|
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
|