cadwyn 5.3.3__py3-none-any.whl → 5.4.2__py3-none-any.whl

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/__main__.py CHANGED
@@ -36,7 +36,7 @@ def version_callback(value: bool):
36
36
  def output_code(code: str, raw: bool):
37
37
  if raw:
38
38
  typer.echo(code)
39
- else:
39
+ else: # pragma: no cover
40
40
  _CONSOLE.print(Syntax(code, "python", line_numbers=True))
41
41
 
42
42
 
cadwyn/_asts.py CHANGED
@@ -22,7 +22,7 @@ NoneType = type(None)
22
22
 
23
23
 
24
24
  # A parent type of typing._GenericAlias
25
- _BaseGenericAlias = cast(type, type(List[int])).mro()[1] # noqa: UP006
25
+ _BaseGenericAlias = cast("type", type(List[int])).mro()[1] # noqa: UP006
26
26
 
27
27
  # type(list[int]) and type(List[int]) are different which is why we have to do this.
28
28
  # Please note that this problem is much wider than just lists which is why we use typing._BaseGenericAlias
cadwyn/applications.py CHANGED
@@ -400,7 +400,7 @@ class Cadwyn(FastAPI):
400
400
  init_oauth=self.swagger_ui_init_oauth,
401
401
  swagger_ui_parameters=self.swagger_ui_parameters,
402
402
  )
403
- return self._render_docs_dashboard(req, cast(str, self.docs_url))
403
+ return self._render_docs_dashboard(req, cast("str", self.docs_url))
404
404
 
405
405
  async def redoc_dashboard(self, req: Request) -> Response:
406
406
  version = req.query_params.get("version")
@@ -410,7 +410,7 @@ class Cadwyn(FastAPI):
410
410
  openapi_url = root_path + f"{self.openapi_url}?version={version}"
411
411
  return get_redoc_html(openapi_url=openapi_url, title=f"{self.title} - ReDoc")
412
412
 
413
- return self._render_docs_dashboard(req, docs_url=cast(str, self.redoc_url))
413
+ return self._render_docs_dashboard(req, docs_url=cast("str", self.redoc_url))
414
414
 
415
415
  def _extract_root_path(self, req: Request):
416
416
  return req.scope.get("root_path", "").rstrip("/")
cadwyn/changelogs.py CHANGED
@@ -93,7 +93,7 @@ def _generate_changelog(versions: VersionBundle, router: _RootCadwynAPIRouter) -
93
93
  generator_from_newer_version,
94
94
  generator_from_older_version,
95
95
  schemas_from_older_version,
96
- cast(list[APIRoute], routes_from_newer_version),
96
+ cast("list[APIRoute]", routes_from_newer_version),
97
97
  )
98
98
  if changelog_entry is not None: # pragma: no branch # This should never happen
99
99
  version_change_changelog.instructions.append(CadwynVersionChangeInstruction(changelog_entry))
@@ -321,18 +321,18 @@ def _convert_version_change_instruction_to_changelog_entry( # noqa: C901
321
321
  if isinstance(instruction, EndpointDidntExistInstruction):
322
322
  return CadwynEndpointWasAddedChangelogEntry(
323
323
  path=instruction.endpoint_path,
324
- methods=cast(Any, instruction.endpoint_methods),
324
+ methods=cast("Any", instruction.endpoint_methods),
325
325
  )
326
326
  elif isinstance(instruction, EndpointExistedInstruction):
327
327
  return CadwynEndpointWasRemovedChangelogEntry(
328
328
  path=instruction.endpoint_path,
329
- methods=cast(Any, instruction.endpoint_methods),
329
+ methods=cast("Any", instruction.endpoint_methods),
330
330
  )
331
331
  elif isinstance(instruction, EndpointHadInstruction):
332
332
  if instruction.attributes.include_in_schema is not Sentinel:
333
333
  return CadwynEndpointWasRemovedChangelogEntry(
334
334
  path=instruction.endpoint_path,
335
- methods=cast(Any, instruction.endpoint_methods),
335
+ methods=cast("Any", instruction.endpoint_methods),
336
336
  )
337
337
 
338
338
  renaming_map = {"operation_id": "operationId"}
@@ -379,7 +379,7 @@ def _convert_version_change_instruction_to_changelog_entry( # noqa: C901
379
379
  attribute_changes.append(CadwynEndpointAttributeChange(name="responses", new_value=changed_responses))
380
380
  return CadwynEndpointHadChangelogEntry(
381
381
  path=instruction.endpoint_path,
382
- methods=cast(Any, instruction.endpoint_methods),
382
+ methods=cast("Any", instruction.endpoint_methods),
383
383
  changes=attribute_changes,
384
384
  )
385
385
 
@@ -78,7 +78,7 @@ def generate_versioned_routers(
78
78
  webhooks: Union[_WR, None] = None,
79
79
  ) -> GeneratedRouters[_R, _WR]:
80
80
  if webhooks is None:
81
- webhooks = cast(_WR, APIRouter())
81
+ webhooks = cast("_WR", APIRouter())
82
82
  return _EndpointTransformer(router, versions, webhooks).transform()
83
83
 
84
84
 
@@ -167,7 +167,7 @@ class _EndpointTransformer(Generic[_R, _WR]):
167
167
 
168
168
  # We know they are APIRoutes because of the check at the very beginning of the top loop.
169
169
  # I.e. Because head_route is an APIRoute, both routes are APIRoutes too
170
- older_route = cast(APIRoute, older_route)
170
+ older_route = cast("APIRoute", older_route)
171
171
  # Wait.. Why do we need this code again?
172
172
  if older_route.body_field is not None and _route_has_a_simple_body_schema(older_route):
173
173
  if hasattr(older_route.body_field.type_, "__cadwyn_original_model__"):
@@ -11,14 +11,20 @@ from collections.abc import Callable, Sequence
11
11
  from datetime import date
12
12
  from enum import Enum
13
13
  from functools import cache
14
- from typing import TYPE_CHECKING, Annotated, Generic, Union, cast
14
+ from typing import (
15
+ TYPE_CHECKING,
16
+ Annotated,
17
+ Generic,
18
+ Union,
19
+ _BaseGenericAlias, # pyright: ignore[reportAttributeAccessIssue]
20
+ cast,
21
+ )
15
22
 
16
23
  import fastapi.params
17
24
  import fastapi.security.base
18
25
  import fastapi.utils
19
26
  import pydantic
20
27
  import pydantic._internal._decorators
21
- import typing_extensions
22
28
  from fastapi import Response
23
29
  from fastapi.dependencies.utils import is_async_gen_callable, is_coroutine_callable, is_gen_callable
24
30
  from fastapi.routing import APIRoute
@@ -32,12 +38,12 @@ from pydantic._internal._decorators import (
32
38
  RootValidatorDecoratorInfo,
33
39
  ValidatorDecoratorInfo,
34
40
  )
41
+ from pydantic._internal._known_annotated_metadata import collect_known_metadata
35
42
  from pydantic._internal._typing_extra import try_eval_type as pydantic_try_eval_type
36
43
  from pydantic.fields import ComputedFieldInfo, FieldInfo
37
44
  from typing_extensions import (
38
45
  Any,
39
46
  Doc,
40
- NewType,
41
47
  Self,
42
48
  TypeAlias,
43
49
  TypeAliasType,
@@ -80,11 +86,6 @@ if TYPE_CHECKING:
80
86
  from cadwyn.structure.versions import HeadVersion, Version, VersionBundle
81
87
 
82
88
 
83
- if sys.version_info >= (3, 10):
84
- from typing import _BaseGenericAlias # pyright: ignore[reportAttributeAccessIssue]
85
- else:
86
- from typing_extensions import _BaseGenericAlias # pyright: ignore[reportAttributeAccessIssue]
87
-
88
89
  _Call = TypeVar("_Call", bound=Callable[..., Any])
89
90
 
90
91
  _FieldName: TypeAlias = str
@@ -153,16 +154,12 @@ class PydanticFieldWrapper:
153
154
  )
154
155
 
155
156
 
156
- def _extract_passed_field_attributes(field_info: FieldInfo):
157
- attributes = {
158
- attr_name: field_info._attributes_set[attr_name]
159
- for attr_name in _all_field_arg_names
160
- if attr_name in field_info._attributes_set
157
+ def _extract_passed_field_attributes(field_info: FieldInfo) -> dict[str, object]:
158
+ return {
159
+ k: v
160
+ for k, v in (field_info._attributes_set | collect_known_metadata(field_info.metadata)[0]).items()
161
+ if k in _all_field_arg_names and not (k == "frozen" and v is None)
161
162
  }
162
- # PydanticV2 always adds frozen to _attributes_set but we don't want it if it wasn't explicitly set
163
- if attributes.get("frozen", ...) is None:
164
- attributes.pop("frozen")
165
- return attributes
166
163
 
167
164
 
168
165
  @dataclasses.dataclass(**DATACLASS_SLOTS)
@@ -239,6 +236,11 @@ def _wrap_validator(func: Callable, is_pydantic_v1_style_validator: Any, decorat
239
236
  func = func.__func__
240
237
  kwargs = dataclasses.asdict(decorator_info)
241
238
  decorator_fields = kwargs.pop("fields", None)
239
+
240
+ # wrapped_property is not accepted by computed_field()
241
+ if isinstance(decorator_info, ComputedFieldInfo):
242
+ kwargs.pop("wrapped_property", None)
243
+
242
244
  actual_decorator = PYDANTIC_DECORATOR_TYPE_TO_DECORATOR_MAP[type(decorator_info)]
243
245
  if is_pydantic_v1_style_validator:
244
246
  # There's an inconsistency in their interfaces so we gotta resort to this
@@ -265,7 +267,7 @@ def _wrap_pydantic_model(model: type[_T_PYDANTIC_MODEL]) -> "_PydanticModelWrapp
265
267
  # For example, when "from __future__ import annotations" is used in the file with the schema
266
268
  if model is not BaseModel:
267
269
  model.model_rebuild(raise_errors=False)
268
- model = cast(type[_T_PYDANTIC_MODEL], model)
270
+ model = cast("type[_T_PYDANTIC_MODEL]", model)
269
271
 
270
272
  decorators = _get_model_decorators(model)
271
273
  validators = {}
@@ -345,7 +347,7 @@ def _wrap_pydantic_model(model: type[_T_PYDANTIC_MODEL]) -> "_PydanticModelWrapp
345
347
  def _get_field_and_validator_names_from_model(cls: type) -> tuple[set[_FieldName], set[str]]:
346
348
  fields = cls.model_fields
347
349
  source = inspect.getsource(cls)
348
- cls_ast = cast(ast.ClassDef, ast.parse(textwrap.dedent(source)).body[0])
350
+ cls_ast = cast("ast.ClassDef", ast.parse(textwrap.dedent(source)).body[0])
349
351
  validator_names = (
350
352
  _get_validator_info_or_none(node)
351
353
  for node in cls_ast.body
@@ -468,7 +470,7 @@ class _PydanticModelWrapper(Generic[_T_PYDANTIC_MODEL]):
468
470
  fields = {name: field.generate_field_copy(generator) for name, field in self.fields.items()}
469
471
  model_copy = type(self.cls)(
470
472
  self.name,
471
- tuple(generator[cast(type[BaseModel], base)] for base in self.cls.__bases__),
473
+ tuple(generator[cast("type[BaseModel]", base)] for base in self.cls.__bases__),
472
474
  self.other_attributes
473
475
  | per_field_validators
474
476
  | root_validators
@@ -587,9 +589,11 @@ class _AnnotationTransformer:
587
589
  self._remake_endpoint_dependencies(route)
588
590
 
589
591
  def _change_version_of_a_non_container_annotation(self, annotation: Any) -> Any:
590
- if isinstance(annotation, (_BaseGenericAlias, types.GenericAlias)):
592
+ from typing_inspection.typing_objects import is_any, is_newtype, is_typealiastype
593
+
594
+ if isinstance(annotation, (types.GenericAlias, _BaseGenericAlias)):
591
595
  return get_origin(annotation)[tuple(self.change_version_of_annotation(arg) for arg in get_args(annotation))]
592
- elif isinstance(annotation, TypeAliasType):
596
+ elif is_typealiastype(annotation):
593
597
  if (
594
598
  annotation.__module__ is not None and (annotation.__module__.startswith("pydantic."))
595
599
  ) or annotation.__name__ in _PYDANTIC_ALL_EXPORTED_NAMES:
@@ -616,7 +620,7 @@ class _AnnotationTransformer:
616
620
  return getitem(
617
621
  tuple(self.change_version_of_annotation(a) for a in get_args(annotation)),
618
622
  )
619
- elif annotation is typing.Any or annotation is typing_extensions.Any or isinstance(annotation, NewType):
623
+ elif is_any(annotation) or is_newtype(annotation):
620
624
  return annotation
621
625
  elif isinstance(annotation, type):
622
626
  return self._change_version_of_type(annotation)
@@ -776,7 +780,7 @@ class SchemaGenerator:
776
780
  wrapper = self._get_wrapper_for_model(model)
777
781
  model_copy = wrapper.generate_model_copy(self)
778
782
  self.concrete_models[model] = model_copy
779
- return cast(type[_T_ANY_MODEL], model_copy)
783
+ return cast("type[_T_ANY_MODEL]", model_copy)
780
784
 
781
785
  @overload
782
786
  def _get_wrapper_for_model(self, model: type[BaseModel]) -> "_PydanticModelWrapper[BaseModel]": ...
@@ -865,7 +869,7 @@ def _apply_alter_schema_instructions(
865
869
  elif isinstance(alter_schema_instruction, ValidatorExistedInstruction):
866
870
  validator_name = get_name_of_function_wrapped_in_pydantic_validator(alter_schema_instruction.validator)
867
871
  raw_validator = cast(
868
- pydantic._internal._decorators.PydanticDescriptorProxy, alter_schema_instruction.validator
872
+ "pydantic._internal._decorators.PydanticDescriptorProxy", alter_schema_instruction.validator
869
873
  )
870
874
  schema_info.validators[validator_name] = _wrap_validator(
871
875
  raw_validator.wrapped,
@@ -1041,15 +1045,19 @@ def _delete_field_attributes(
1041
1045
  annotation: Any,
1042
1046
  ) -> None:
1043
1047
  for attr_name in alter_schema_instruction.attributes:
1048
+ deleted = False
1049
+
1044
1050
  if attr_name in field.passed_field_attributes:
1045
1051
  field.delete_attribute(name=attr_name)
1046
- elif get_origin(annotation) == Annotated and any( # pragma: no branch
1052
+ deleted = True
1053
+ if get_origin(annotation) == Annotated and any( # pragma: no branch
1047
1054
  hasattr(sub_ann, attr_name) for sub_ann in get_args(annotation)
1048
1055
  ):
1049
1056
  for sub_ann in get_args(annotation):
1050
1057
  if hasattr(sub_ann, attr_name):
1051
1058
  object.__setattr__(sub_ann, attr_name, None)
1052
- else:
1059
+ deleted = True
1060
+ if not deleted:
1053
1061
  raise InvalidGenerationInstructionError(
1054
1062
  f'You tried to delete the attribute "{attr_name}" of field "{alter_schema_instruction.name}" '
1055
1063
  f'from "{model.name}" in "{version_change_name}" '
@@ -1058,19 +1066,30 @@ def _delete_field_attributes(
1058
1066
 
1059
1067
 
1060
1068
  def _delete_field_from_model(model: _PydanticModelWrapper, field_name: str, version_change_name: str):
1061
- if field_name not in model.fields:
1069
+ if field_name in model.fields:
1070
+ model.fields.pop(field_name)
1071
+ model.annotations.pop(field_name)
1072
+ for validator_name, validator in model.validators.copy().items():
1073
+ if isinstance(validator, _PerFieldValidatorWrapper) and field_name in validator.fields:
1074
+ validator.fields.remove(field_name)
1075
+ # TODO: This behavior doesn't feel natural
1076
+ if not validator.fields:
1077
+ model.validators[validator_name].is_deleted = True
1078
+
1079
+ elif (
1080
+ field_name in model.validators
1081
+ and isinstance(model.validators[field_name], _ValidatorWrapper)
1082
+ and hasattr(model.validators[field_name], "decorator")
1083
+ and model.validators[field_name].decorator == pydantic.computed_field
1084
+ ):
1085
+ validator = model.validators[field_name]
1086
+ model.validators[field_name].is_deleted = True
1087
+ model.annotations.pop(field_name, None)
1088
+ else:
1062
1089
  raise InvalidGenerationInstructionError(
1063
1090
  f'You tried to delete a field "{field_name}" from "{model.name}" '
1064
1091
  f'in "{version_change_name}" but it doesn\'t have such a field.',
1065
1092
  )
1066
- model.fields.pop(field_name)
1067
- model.annotations.pop(field_name)
1068
- for validator_name, validator in model.validators.copy().items():
1069
- if isinstance(validator, _PerFieldValidatorWrapper) and field_name in validator.fields:
1070
- validator.fields.remove(field_name)
1071
- # TODO: This behavior doesn't feel natural
1072
- if not validator.fields:
1073
- model.validators[validator_name].is_deleted = True
1074
1093
 
1075
1094
 
1076
1095
  class _DummyEnum(Enum):
@@ -1100,7 +1119,7 @@ class _EnumWrapper(Generic[_T_ENUM]):
1100
1119
  for attr_name, attr in initialization_namespace.items():
1101
1120
  enum_dict[attr_name] = attr
1102
1121
  enum_dict["__doc__"] = self.cls.__doc__
1103
- model_copy = cast(type[_T_ENUM], type(self.name, self.cls.__bases__, enum_dict))
1122
+ model_copy = cast("type[_T_ENUM]", type(self.name, self.cls.__bases__, enum_dict))
1104
1123
  model_copy.__cadwyn_original_model__ = self.cls # pyright: ignore[reportAttributeAccessIssue]
1105
1124
  return model_copy
1106
1125
 
cadwyn/structure/data.py CHANGED
@@ -140,7 +140,7 @@ def convert_request_to_next_version_for(
140
140
  if isinstance(schema_or_path, str):
141
141
  return _AlterRequestByPathInstruction(
142
142
  path=schema_or_path,
143
- methods=set(cast(list, methods_or_second_schema)),
143
+ methods=set(cast("list", methods_or_second_schema)),
144
144
  transformer=transformer,
145
145
  )
146
146
  else:
@@ -214,7 +214,7 @@ def convert_response_to_previous_version_for(
214
214
  # The validation above checks that methods is not None
215
215
  return _AlterResponseByPathInstruction(
216
216
  path=schema_or_path,
217
- methods=set(cast(list, methods_or_second_schema)),
217
+ methods=set(cast("list", methods_or_second_schema)),
218
218
  transformer=transformer,
219
219
  migrate_http_errors=migrate_http_errors,
220
220
  )
@@ -246,7 +246,7 @@ class AlterFieldInstructionFactory:
246
246
  info: Union[FieldInfo, Any, None] = None,
247
247
  ) -> FieldExistedAsInstruction:
248
248
  if info is None:
249
- info = cast(FieldInfo, Field())
249
+ info = cast("FieldInfo", Field())
250
250
  info.annotation = type
251
251
  return FieldExistedAsInstruction(is_hidden_from_changelog=False, schema=self.schema, name=self.name, field=info)
252
252
 
@@ -317,7 +317,7 @@ class AlterSchemaInstructionFactory:
317
317
  def validator(
318
318
  self, func: "Union[Callable[..., Any], classmethod[Any, Any, Any], PydanticDescriptorProxy]", /
319
319
  ) -> AlterValidatorInstructionFactory:
320
- func = cast(Union[Callable[..., Any], PydanticDescriptorProxy], unwrap_wrapped_function(func))
320
+ func = cast("Union[Callable[..., Any], PydanticDescriptorProxy]", unwrap_wrapped_function(func))
321
321
 
322
322
  if not isinstance(func, PydanticDescriptorProxy):
323
323
  if hasattr(func, "__self__"):
@@ -620,7 +620,7 @@ class VersionBundle:
620
620
  detail = response_info.body
621
621
  if detail is None:
622
622
  detail = http.HTTPStatus(response_info.status_code).phrase
623
- raised_exception.detail = cast(str, detail)
623
+ raised_exception.detail = cast("str", detail)
624
624
  raised_exception.headers = dict(response_info.headers)
625
625
  raised_exception.status_code = response_info.status_code
626
626
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cadwyn
3
- Version: 5.3.3
3
+ Version: 5.4.2
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
@@ -37,9 +37,10 @@ Requires-Python: >=3.9
37
37
  Requires-Dist: backports-strenum<2,>=1.3.1; python_version < '3.11'
38
38
  Requires-Dist: fastapi>=0.112.4
39
39
  Requires-Dist: jinja2>=3.1.2
40
- Requires-Dist: pydantic>=2.0.0
40
+ Requires-Dist: pydantic>=2.11.0
41
41
  Requires-Dist: starlette>=0.30.0
42
42
  Requires-Dist: typing-extensions>=4.8.0
43
+ Requires-Dist: typing-inspection>=0.4.0
43
44
  Provides-Extra: standard
44
45
  Requires-Dist: fastapi[standard]>=0.112.3; extra == 'standard'
45
46
  Requires-Dist: typer>=0.7.0; extra == 'standard'
@@ -71,12 +72,12 @@ Production-ready community-driven modern [Stripe-like](https://stripe.com/blog/a
71
72
 
72
73
  ## Who is this for?
73
74
 
74
- Cadwyn allows you to maintain the implementation just for your newest API version and get all the older versions generated automatically. You keep API versioning encapsulated in small and independent "version change" modules while your business logic stays simple and knows nothing about versioning.
75
+ Cadwyn allows you to maintain the implementation just for your newest API version and get all the older versions generated automatically. You keep API backward compatibility encapsulated in small and independent "version change" modules while your business logic stays simple and knows nothing about versioning.
75
76
 
76
- Its [approach](https://docs.cadwyn.dev/theory/how_we_got_here/#ii-migration-based-response-building) will be useful if you want to:
77
+ This [approach](https://docs.cadwyn.dev/theory/how_we_got_here/#ii-migration-based-response-building) may be useful if you want to:
77
78
 
78
79
  1. Support many API versions for a long time
79
- 2. Effortlessly backport features and bugfixes to older API versions
80
+ 2. Have features and bugfixes automatically backported to older API versions
80
81
 
81
82
  Whether you are a newbie in API versioning, a pro looking for a sophisticated tool, an experimenter looking to build a similar framework, or even someone who just wants to learn about all approaches to API versioning -- Cadwyn has the functionality, theory, and documentation to cover all the mentioned use cases.
82
83
 
@@ -86,6 +87,4 @@ The [documentation](https://docs.cadwyn.dev) has everything you need to succeed.
86
87
 
87
88
  ## Sponsors
88
89
 
89
- These are our gorgeous sponsors. They are using Cadwyn and are sponsoring it through various means. Contact [me](https://github.com/zmievsa) if you would like to become one too!
90
-
91
- [![Monite](https://docs.cadwyn.dev/img/sponsor_logos/monite.png)](https://docs.monite.com/)
90
+ These are our gorgeous sponsors. They are using Cadwyn and are sponsoring it through various means. Contact [me](https://github.com/zmievsa) if you would like to become one, too!
@@ -1,31 +1,31 @@
1
1
  cadwyn/__init__.py,sha256=uXmQDTDNA5BeRlLFn0cmIo6ohXvEApg2FSl2sFb8frw,1120
2
- cadwyn/__main__.py,sha256=fGoKJPNVueqqXW4rqwmRUBBMoDGeLEyATdT-rel5Pvs,2449
3
- cadwyn/_asts.py,sha256=QvqZmDdwH8U-Ocpj9vYR6MRrIANF8ugk9oZgAo76qLs,5223
2
+ cadwyn/__main__.py,sha256=GUbywGIt3-i_6JQ_QlHXgCQxUNFSMCIOFsVxdTkgtoU,2469
3
+ cadwyn/_asts.py,sha256=Gf43snDwH3n86nohu971EGY2YpIV9NlOaB9TFuy-p1Q,5225
4
4
  cadwyn/_importer.py,sha256=QV6HqODCG9K2oL4Vc15fAqL2-plMvUWw_cgaj4Ln4C8,1075
5
5
  cadwyn/_render.py,sha256=VAY2Twd_MfKaC8_X22AMIQd72_UHy87icdAbKL8hd90,5526
6
6
  cadwyn/_utils.py,sha256=q_mTtMKTNTDzqCza67XST-jaPSfuTgnFLmOe0dlGeYY,2295
7
- cadwyn/applications.py,sha256=sHfsgjy1ofotIPyLmL4FCAXyuzpjRtYLTQPR1ds471w,21133
8
- cadwyn/changelogs.py,sha256=aBTlsZ8PQpw9t4sSyezNTYDs6CMPtzIGulgAHA1ELPs,19622
7
+ cadwyn/applications.py,sha256=oWss-Xx-QZuyyMXLv-EXUVd2S1RU4razb7GkYvURjyI,21137
8
+ cadwyn/changelogs.py,sha256=5S0yt94LAi2ani_uk-BGR_rK247IYWbZ3NvGmwnL7es,19632
9
9
  cadwyn/dependencies.py,sha256=phUJ4Fy3UTegpOfDfHMjxsvASWo-1NQgwqphNnPdoVQ,241
10
10
  cadwyn/exceptions.py,sha256=8D1G7ewLrMF5jq7leald1g0ulcH9zQl8ufEK3b7HHAE,1749
11
11
  cadwyn/middleware.py,sha256=4Ziq1ysnc8j5KmeZpsr9VJKllEFC8uYwXnG01I2FPR4,4853
12
12
  cadwyn/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
- cadwyn/route_generation.py,sha256=RTZYfml03oKaNm_-SJX8N6PnafFXdsPpN0qEapHSzTw,27181
13
+ cadwyn/route_generation.py,sha256=conoTBtsOtjyiV2NdUxwGQX-h1zLyIjDQjD5bT2YSgg,27185
14
14
  cadwyn/routing.py,sha256=Ii6Qbgm9lGks1IAk-kDuIu_dX3FXsA77KSfGOFmLbgc,7604
15
- cadwyn/schema_generation.py,sha256=Cm_cS724lsfOUog3HUnWUqggzr5V6UE5XgUvfiwJqaA,47014
15
+ cadwyn/schema_generation.py,sha256=0Z81yHYk1aqE6aGsPCkaPI9IbmiHBlwbVBrfILuUNa0,47531
16
16
  cadwyn/_internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
17
  cadwyn/_internal/context_vars.py,sha256=VcM8eAoSlvrIMFQhjZmjflV5o1yrPSEZZGkwOK4OSf4,378
18
18
  cadwyn/static/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  cadwyn/static/docs.html,sha256=WNm5ANJVy51TcIUFOaqKf1Z8eF86CC85TTHPxACtkzw,3455
20
20
  cadwyn/structure/__init__.py,sha256=Wgvjdq3vfl9Yhe-BkcFGAMi_Co11YOfTmJQqgF5Gzx4,655
21
21
  cadwyn/structure/common.py,sha256=YuyfYMxkJcj2c5SFh9teBoEC2xLO5_2QjPzYjwdZcTs,478
22
- cadwyn/structure/data.py,sha256=NWURVnP_84VI2ugp9ppo0Ofyve3pVYjymF9K82Jh-SA,7791
22
+ cadwyn/structure/data.py,sha256=eb4HlGTu3V_G5vJuQ4GLEaGd4LmPmFX3L8CXwJKzfOE,7795
23
23
  cadwyn/structure/endpoints.py,sha256=zUgzglNhBPnmWdJ03A8pFT4zPs_lj8nQ7c7Uo2d-ejU,6246
24
24
  cadwyn/structure/enums.py,sha256=4FCc9aniLE3VuWAVIacrNP_FWxTIUm9JkeeHA_zZdwQ,1254
25
- cadwyn/structure/schemas.py,sha256=O9yNw1OB0Qz-PvNB0FYlQm34gQsjyG2l9gg9x-RnJIY,10781
26
- cadwyn/structure/versions.py,sha256=yOZ-x24Rb0itcZvQBe-92x9BiCLZK4cMqo0iX0DVN2k,34708
27
- cadwyn-5.3.3.dist-info/METADATA,sha256=HPeIny9sf76BAxYuzo91Le8eQg_d6_NLXd4o45bjlVw,4535
28
- cadwyn-5.3.3.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
29
- cadwyn-5.3.3.dist-info/entry_points.txt,sha256=mGX8wl-Xfhpr5M93SUmkykaqinUaYAvW9rtDSX54gx0,47
30
- cadwyn-5.3.3.dist-info/licenses/LICENSE,sha256=KeCWewiDQYpmSnzF-p_0YpoWiyDcUPaCuG8OWQs4ig4,1072
31
- cadwyn-5.3.3.dist-info/RECORD,,
25
+ cadwyn/structure/schemas.py,sha256=kuQJg60VpWHZkSPvrbvd9pe-Zetq8as5YYrERsG3IE8,10785
26
+ cadwyn/structure/versions.py,sha256=IrtX8sGswjNc8z_6HsU9Im-U7-agZB_pFaqSHz_0SMk,34710
27
+ cadwyn-5.4.2.dist-info/METADATA,sha256=pqS5cVGiRcTECZOoae2zWcDJpyQnSi2GNJ5TbWc0CvY,4504
28
+ cadwyn-5.4.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
29
+ cadwyn-5.4.2.dist-info/entry_points.txt,sha256=mGX8wl-Xfhpr5M93SUmkykaqinUaYAvW9rtDSX54gx0,47
30
+ cadwyn-5.4.2.dist-info/licenses/LICENSE,sha256=KeCWewiDQYpmSnzF-p_0YpoWiyDcUPaCuG8OWQs4ig4,1072
31
+ cadwyn-5.4.2.dist-info/RECORD,,
File without changes