Compare commits

...

3 Commits

Author SHA1 Message Date
3f0e3db427
👷 Use own workflow for creating and publishing new releases 2023-04-26 17:04:12 +02:00
862a517018
🚨 Set explicit stacklevel when warning about schema-wide many setting depending on initialization state.
This should help users see the exact line they wrote that triggered the warning.
2023-04-21 15:52:33 +02:00
3c16b4ebd6
📌 Restrict main dependency marshmallow>=3.12.0;
pin all development dependencies to specific versions
2023-04-21 15:47:03 +02:00
5 changed files with 43 additions and 31 deletions

View File

@ -2,17 +2,15 @@ name: CI
on: on:
push: push:
branches: branches: master
- master tags: 'v*.*.*'
jobs: jobs:
test-and-check: test:
name: Tests and checks name: Test
uses: daniil-berg/reusable-workflows/.github/workflows/python-test.yaml@v0.0.1 uses: daniil-berg/reusable-workflows/.github/workflows/python-test.yaml@v0.2.1
with: with:
versions: '["3.9", "3.10", "3.11"]' versions: '["3.9", "3.10", "3.11"]'
cache: pip
cache-dependency-path: pyproject.toml
unittest-command: 'scripts/test.sh' unittest-command: 'scripts/test.sh'
coverage-command: 'scripts/cov.sh' coverage-command: 'scripts/cov.sh'
unittest-requirements: "-e '.[dev]'" unittest-requirements: "-e '.[dev]'"
@ -21,3 +19,16 @@ jobs:
typecheck-all-versions: true typecheck-all-versions: true
lint-command: 'scripts/lint.sh' lint-command: 'scripts/lint.sh'
lint-requirements: '-Ur requirements/dev.txt' lint-requirements: '-Ur requirements/dev.txt'
release:
name: Release
if: ${{ github.ref_type == 'tag' }}
needs: test
uses: daniil-berg/reusable-workflows/.github/workflows/python-release.yaml@v0.2.1
with:
git-ref: ${{ github.ref_name }}
secrets:
release-token: ${{ secrets.TOKEN_GITHUB_CREATE_RELEASE }}
publish-token: ${{ secrets.TOKEN_PYPI_PROJECT }}
permissions:
contents: write

View File

@ -37,18 +37,15 @@ dynamic = [
] ]
[project.optional-dependencies] [project.optional-dependencies]
full = [
]
dev = [ dev = [
"black", "black==23.3.0",
"build", "build==0.10.0",
"coverage[toml]", "coverage[toml]==7.2.3",
"isort", "isort==5.12.0",
"mkdocs-material", "mkdocs-material==9.1.6",
"mkdocstrings[python]", "mkdocstrings[python]==0.21.2",
"mypy", "mypy==1.2.0",
"ruff", "ruff==0.0.262",
] ]
[project.urls] [project.urls]

View File

@ -1 +1 @@
marshmallow marshmallow>=3.12.0

View File

@ -1,9 +1,9 @@
-r common.txt -r common.txt
black black==23.3.0
build build==0.10.0
coverage[toml] coverage[toml]==7.2.3
isort isort==5.12.0
mkdocs-material mkdocs-material==9.1.6
mkdocstrings[python] mkdocstrings[python]==0.21.2
mypy mypy==1.2.0
ruff ruff==0.0.262

View File

@ -16,6 +16,11 @@ from .decorators import post_load
Model = TypeVar("Model") Model = TypeVar("Model")
MANY_SCHEMA_UNSAFE = (
"Changing `many` schema-wide breaks type safety. "
"Use the the `many` parameter of specific methods (like `load`) instead."
)
class GenericSchema(GenericInsightMixin1[Model], Schema): class GenericSchema(GenericInsightMixin1[Model], Schema):
""" """
@ -100,6 +105,7 @@ class GenericSchema(GenericInsightMixin1[Model], Schema):
[`load`][marshmallow_generic.GenericSchema.load]/ [`load`][marshmallow_generic.GenericSchema.load]/
[`loads`][marshmallow_generic.GenericSchema.loads]. [`loads`][marshmallow_generic.GenericSchema.loads].
""" """
self._pre_init = True
super().__init__( super().__init__(
only=only, only=only,
exclude=exclude, exclude=exclude,
@ -110,6 +116,7 @@ class GenericSchema(GenericInsightMixin1[Model], Schema):
partial=partial, partial=partial,
unknown=unknown, unknown=unknown,
) )
self._pre_init = False
def __setattr__(self, name: str, value: Any) -> None: def __setattr__(self, name: str, value: Any) -> None:
""" """
@ -119,10 +126,7 @@ class GenericSchema(GenericInsightMixin1[Model], Schema):
[`object.__setattr__`](https://docs.python.org/3/reference/datamodel.html#object.__setattr__). [`object.__setattr__`](https://docs.python.org/3/reference/datamodel.html#object.__setattr__).
""" """
if name == "many" and value is not False: if name == "many" and value is not False:
warn( warn(MANY_SCHEMA_UNSAFE, stacklevel=4 if self._pre_init else 2)
"Changing `many` schema-wide breaks type safety. Use the the "
"`many` parameter of specific methods (like `load`) instead."
)
super().__setattr__(name, value) super().__setattr__(name, value)
@post_load @post_load