cadwyn 4.4.0__tar.gz → 4.4.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cadwyn might be problematic. Click here for more details.
- {cadwyn-4.4.0 → cadwyn-4.4.1}/.github/workflows/ci.yaml +2 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/.github/workflows/daily_tests.yaml +9 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/PKG-INFO +2 -2
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/schema_generation.py +1 -1
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/structure/versions.py +2 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/pyproject.toml +2 -1
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/conftest.py +1 -1
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/test_render.py +10 -5
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/test_schema_generation/test_schema_validator.py +11 -5
- {cadwyn-4.4.0 → cadwyn-4.4.1}/uv.lock +259 -211
- {cadwyn-4.4.0 → cadwyn-4.4.1}/.github/CODE_OF_CONDUCT.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/.github/actions/setup-python-uv/action.yaml +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/.github/workflows/publish_docs.yaml +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/.github/workflows/release.yaml +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/.github/workflows/validate_links.yaml +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/.gitignore +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/.pre-commit-config.yaml +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/CHANGELOG.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/LICENSE +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/Makefile +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/README.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/__main__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/_asts.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/_importer.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/_render.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/_utils.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/applications.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/changelogs.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/exceptions.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/middleware.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/py.typed +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/route_generation.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/routing.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/static/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/static/docs.html +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/structure/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/structure/common.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/structure/data.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/structure/endpoints.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/structure/enums.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/cadwyn/structure/schemas.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/CNAME +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/concepts/api_version_header_and_context_variables.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/concepts/beware_of_data_versioning.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/concepts/changelogs.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/concepts/cli.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/concepts/endpoint_migrations.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/concepts/enum_migrations.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/concepts/index.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/concepts/main_app.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/concepts/methodology.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/concepts/schema_generation.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/concepts/schema_migrations.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/concepts/testing.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/concepts/version_changes.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/home/CONTRIBUTING.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/how_to/change_business_logic/index.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/how_to/change_endpoints/index.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/how_to/change_openapi_schemas/add_field.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/how_to/change_openapi_schemas/change_field_type.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/how_to/change_openapi_schemas/changing_constraints.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/how_to/change_openapi_schemas/remove_field.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/how_to/change_openapi_schemas/rename_a_field_in_schema.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/how_to/index.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/img/dashboard_with_one_version.png +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/img/dashboard_with_two_versions.png +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/img/get_users_endpoint_from_prior_version.png +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/img/simplified_migration_model.png +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/img/sponsor_logos/monite.png +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/img/unversioned_dashboard.png +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/index.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/plugin.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/quickstart/setup.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/quickstart/tutorial.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/theory/how_to_build_versioning_framework.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/theory/how_we_got_here.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs/theory/literature.md +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs_src/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs_src/quickstart/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs_src/quickstart/setup/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs_src/quickstart/setup/block001.sh +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs_src/quickstart/setup/block002.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs_src/quickstart/setup/tests/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs_src/quickstart/setup/tests/test_block002.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs_src/quickstart/tutorial/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs_src/quickstart/tutorial/block001.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs_src/quickstart/tutorial/block002.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs_src/quickstart/tutorial/block003.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs_src/quickstart/tutorial/tests/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs_src/quickstart/tutorial/tests/test_block001.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs_src/quickstart/tutorial/tests/test_block002.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/docs_src/quickstart/tutorial/tests/test_block003.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/mkdocs.yml +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/ruff.toml +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/scripts/fix_links.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/scripts/split_md.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/_data/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/_data/unversioned_schema_dir/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/_data/unversioned_schema_dir/unversioned_schemas.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/_data/unversioned_schemas.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/_resources/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/_resources/app_for_testing_routing.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/_resources/render/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/_resources/render/classes.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/_resources/render/complex/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/_resources/render/complex/classes.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/_resources/render/complex/versions.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/_resources/render/versions.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/_resources/utils.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/_resources/versioned_app/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/_resources/versioned_app/app.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/_resources/versioned_app/v2021_01_01.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/_resources/versioned_app/v2022_01_02.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/_resources/versioned_app/webhooks.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/test_applications.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/test_changelog.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/test_cli.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/test_data_migrations.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/test_router_generation.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/test_routing.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/test_schema_generation/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/test_schema_generation/test_enum.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/test_schema_generation/test_schema.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/test_schema_generation/test_schema_field.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/test_structure.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/tutorial/__init__.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/tutorial/main.py +0 -0
- {cadwyn-4.4.0 → cadwyn-4.4.1}/tests/tutorial/test_example.py +0 -0
|
@@ -10,12 +10,21 @@ jobs:
|
|
|
10
10
|
update-dependencies-and-test:
|
|
11
11
|
name: Update dependencies and run tests
|
|
12
12
|
runs-on: ubuntu-latest
|
|
13
|
+
strategy:
|
|
14
|
+
fail-fast: true
|
|
15
|
+
matrix:
|
|
16
|
+
python-version: ["3.10", "3.11", "3.12", "3.13"]
|
|
13
17
|
|
|
14
18
|
steps:
|
|
15
19
|
- uses: actions/checkout@v4
|
|
16
20
|
- uses: ./.github/actions/setup-python-uv
|
|
21
|
+
with:
|
|
22
|
+
python-version: ${{ matrix.python-version }}
|
|
17
23
|
- run: uv sync --refresh --all-extras --dev --upgrade
|
|
18
24
|
- run: pytest .
|
|
25
|
+
- uses: jakebailey/pyright-action@v1
|
|
26
|
+
with:
|
|
27
|
+
pylance-version: latest-release
|
|
19
28
|
|
|
20
29
|
notify-on-failure:
|
|
21
30
|
name: Notify on failure
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: cadwyn
|
|
3
|
-
Version: 4.4.
|
|
3
|
+
Version: 4.4.1
|
|
4
4
|
Summary: Production-ready community-driven modern Stripe-like API versioning in FastAPI
|
|
5
5
|
Project-URL: Source code, https://github.com/zmievsa/cadwyn
|
|
6
6
|
Project-URL: Documentation, https://docs.cadwyn.dev
|
|
7
7
|
Author-email: Stanislav Zmiev <zmievsa@gmail.com>
|
|
8
8
|
License-Expression: MIT
|
|
9
9
|
License-File: LICENSE
|
|
10
|
-
Keywords: api,api-versioning,code-generation,fastapi,hints,json-schema,pydantic,python,python310,python311,python312,stripe,versioning
|
|
10
|
+
Keywords: api,api-versioning,code-generation,fastapi,hints,json-schema,pydantic,python,python310,python311,python312,python313,stripe,versioning
|
|
11
11
|
Classifier: Development Status :: 5 - Production/Stable
|
|
12
12
|
Classifier: Environment :: Web Environment
|
|
13
13
|
Classifier: Framework :: AsyncIO
|
|
@@ -607,7 +607,7 @@ class SchemaGenerator:
|
|
|
607
607
|
|
|
608
608
|
def __getitem__(self, model: type[_T_ANY_MODEL], /) -> type[_T_ANY_MODEL]:
|
|
609
609
|
if not isinstance(model, type) or not issubclass(model, BaseModel | Enum) or model in (BaseModel, RootModel):
|
|
610
|
-
return model
|
|
610
|
+
return model
|
|
611
611
|
model = _unwrap_model(model)
|
|
612
612
|
|
|
613
613
|
if model in self.concrete_models:
|
|
@@ -156,6 +156,8 @@ class VersionChange:
|
|
|
156
156
|
"instructions_to_migrate_to_previous_version",
|
|
157
157
|
"__module__",
|
|
158
158
|
"__doc__",
|
|
159
|
+
"__firstlineno__",
|
|
160
|
+
"__static_attributes__",
|
|
159
161
|
}:
|
|
160
162
|
raise CadwynStructureError(
|
|
161
163
|
f"Found: '{attr_name}' attribute of type '{type(attr_value)}' in '{cls.__name__}'."
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "cadwyn"
|
|
3
|
-
version = "4.4.
|
|
3
|
+
version = "4.4.1"
|
|
4
4
|
description = "Production-ready community-driven modern Stripe-like API versioning in FastAPI"
|
|
5
5
|
authors = [{ name = "Stanislav Zmiev", email = "zmievsa@gmail.com" }]
|
|
6
6
|
license = "MIT"
|
|
@@ -20,6 +20,7 @@ keywords = [
|
|
|
20
20
|
"python310",
|
|
21
21
|
"python311",
|
|
22
22
|
"python312",
|
|
23
|
+
"python313",
|
|
23
24
|
]
|
|
24
25
|
classifiers = [
|
|
25
26
|
"Intended Audience :: Information Technology",
|
|
@@ -19,11 +19,16 @@ def test__render_model__with_weird_types():
|
|
|
19
19
|
)
|
|
20
20
|
# TODO: sobolevn has created a tool for doing such nocovers in a better manner.
|
|
21
21
|
# hopefully someday we will switch to it.
|
|
22
|
-
if sys.version_info >= (3, 11):
|
|
22
|
+
if sys.version_info >= (3, 11):
|
|
23
23
|
rendered_lambda = "lambda: 83"
|
|
24
|
-
else:
|
|
24
|
+
else:
|
|
25
25
|
rendered_lambda = "lambda : 83"
|
|
26
26
|
|
|
27
|
+
if sys.version_info >= (3, 13):
|
|
28
|
+
rend_ann = "typing.Annotated"
|
|
29
|
+
else:
|
|
30
|
+
rend_ann = "Annotated"
|
|
31
|
+
|
|
27
32
|
# TODO: As you see, we do not rename bases correctly in render. We gotta fix it some day...
|
|
28
33
|
assert code(result) == code(
|
|
29
34
|
f'''
|
|
@@ -32,11 +37,11 @@ class ModelWithWeirdFields(A):
|
|
|
32
37
|
foo: dict = Field(default={{'a': 'b'}})
|
|
33
38
|
bar: list[int] = Field(default_factory=my_default_factory)
|
|
34
39
|
baz: typing.Literal[MyEnum.foo] = Field()
|
|
35
|
-
saz:
|
|
36
|
-
laz:
|
|
40
|
+
saz: {rend_ann}[str, StringConstraints(to_upper=True)] = Field()
|
|
41
|
+
laz: {rend_ann}[int, None, Interval(gt=12, ge=None, lt=None, le=None), None] = Field()
|
|
37
42
|
taz: typing.Union[int, str, None] = Field(default_factory={rendered_lambda})
|
|
38
43
|
naz: list[int] = Field(default=[1, 2, 3])
|
|
39
|
-
gaz:
|
|
44
|
+
gaz: {rend_ann}[bytes, Strict(strict=True), Len(min_length=0, max_length=None)] = Field(min_length=3, title='Hewwo')
|
|
40
45
|
'''
|
|
41
46
|
)
|
|
42
47
|
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import re
|
|
2
2
|
|
|
3
3
|
import pytest
|
|
4
|
-
from pydantic import
|
|
4
|
+
from pydantic import (
|
|
5
|
+
BaseModel,
|
|
6
|
+
field_validator,
|
|
7
|
+
model_validator,
|
|
8
|
+
root_validator, # pyright: ignore[reportDeprecated]
|
|
9
|
+
validator, # pyright: ignore[reportDeprecated]
|
|
10
|
+
)
|
|
5
11
|
|
|
6
12
|
from cadwyn.exceptions import InvalidGenerationInstructionError
|
|
7
13
|
from cadwyn.structure import schema
|
|
@@ -58,12 +64,12 @@ def test__schema_validator_existed__with_deprecated_validators(
|
|
|
58
64
|
):
|
|
59
65
|
with pytest.warns(DeprecationWarning):
|
|
60
66
|
|
|
61
|
-
@root_validator(pre=True)
|
|
67
|
+
@root_validator(pre=True) # pyright: ignore[reportDeprecated]
|
|
62
68
|
def hewwo(cls, values):
|
|
63
69
|
values["foo"] += "_root"
|
|
64
70
|
return values
|
|
65
71
|
|
|
66
|
-
@validator("foo")
|
|
72
|
+
@validator("foo") # pyright: ignore[reportDeprecated]
|
|
67
73
|
def dawkness(cls, value):
|
|
68
74
|
return value + "_field"
|
|
69
75
|
|
|
@@ -178,7 +184,7 @@ def test__schema_field_didnt_exist__with_validator_that_covers_multiple_fields__
|
|
|
178
184
|
|
|
179
185
|
with pytest.warns(DeprecationWarning):
|
|
180
186
|
|
|
181
|
-
@validator("bar")
|
|
187
|
+
@validator("bar") # pyright: ignore[reportDeprecated]
|
|
182
188
|
def validate_bar(cls, value):
|
|
183
189
|
raise NotImplementedError
|
|
184
190
|
|
|
@@ -191,7 +197,7 @@ def test__schema_field_didnt_exist__with_validator_that_covers_multiple_fields__
|
|
|
191
197
|
class ExpectedSchema(BaseModel):
|
|
192
198
|
bar: str
|
|
193
199
|
|
|
194
|
-
@validator("bar")
|
|
200
|
+
@validator("bar") # pyright: ignore[reportDeprecated]
|
|
195
201
|
def validate_bar(cls, value):
|
|
196
202
|
raise NotImplementedError
|
|
197
203
|
|