-
-
Notifications
You must be signed in to change notification settings - Fork 367
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Some new validators #425
Some new validators #425
Conversation
@mattsb42-aws: what do you think about instead of "Deep Dictionary Validator", you change it to "Deep Mapping Validator". That would mean dropping the I think that might be more generally useful, and makes the two more consistent. |
@wsanchez That sounds reasonable. I had been thinking in terms of builtin primitives, but you make a good point about generalized "things that implement To that end, I think I'll also change the iteration logic to remove the dependency on |
Updates added to change to generalized Any thoughts on the error message handling? |
Just a bunch of docs comments (I leave code to @wsanchez – can’t promise your PR will make it into the already very overdue 18.2 – sorry in advance): Your news fragment renders really funky. I think it’s because of the indentation of the second line? Also news fragment since I’m the only one who cares about this stuff ;):
And finally: the new APIs need to be added to https:/python-attrs/attrs/blob/master/docs/api.rst – I should add this to the pull request template. |
Gah..downside of switching back and forth between Markdown and RST...I always forget that RST wants exactly two (not four) spaces indent to join a multiline list entry.
I assume that the expected filename is generally I'll fix the other issues. Related to fixing docs stuff, if there's no objection to adding it, something I've found very useful on other projects is to have a tox env for hosting the built docs (ex[1], shamelessly copied from flake8). It just makes previewing built docs much simpler: just throw up [1] https:/aws/aws-encryption-sdk-python/blob/master/tox.ini#L255-L261 |
Requested docs changes made. I also went ahead and included the The examples in the docs kind of highlight the issue I've been having coming up with a good way of formatting the error messages to identify the attribute that is failing validation. Maybe rather than passing the original attribute to the sub-validator we could pass a modified copy with a different name? ex: class _DeepIterable(object):
...
def __call__(self, inst, attr, value):
"""
We use a callable class to be able to change the ``__repr__``.
"""
if self.iterable_validator is not None:
self.iterable_validator(inst, attr, value)
member_position = 0
for member in value:
member_attr = copy(attr)
member_attr.name = "{original}[{pos}]".format(original=attr.name, pos=member_position)
self.member_validator(inst, member_attr, member)
member_position += 1 |
CI failed for what looked like a transient error in the lint checks, so I restarted that and it failed with actual errors:
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code looks good other than linter failures that need fixing.
I'd remove the tox.ini
edit unless @hynek is OK with it.
tox.ini
Outdated
changedir = docs/_build/html | ||
commands = | ||
python -m http.server {posargs} | ||
|
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
@wsanchez any thoughts on the error message contents discussed above? |
… is in fact a dictionary
…ocs" This reverts commit a2df89b.
ef9affd
to
2f39783
Compare
Linting cleanup and revert of the tox.ini change. I also rebased off the current master (no conflicts) because git was upset. |
I went ahead and just went with the the error messages as-is because I couldn't figure out a good way to duplicate an attribute with a different name. This will make debugging an error message harder than I would like, but it's a starting point. |
Agreed. This is a good start and we can fix that when we figure out a good way to do it. Thanks for the contribution! |
Yes thank you very much! Your contribution caught me in an unfortunate time, I’m glad Wilfredo saw it thru! |
1784: Scheduled weekly dependency update for week 09 r=peterbe a=pyup-bot ### Update [attrs](https://pypi.org/project/attrs) from **18.2.0** to **19.1.0**. <details> <summary>Changelog</summary> ### 19.1.0 ``` ------------------- Backward-incompatible Changes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Fixed a bug where deserialized objects with ``cache_hash=True`` could have incorrect hash code values. This change breaks classes with ``cache_hash=True`` when a custom ``__setstate__`` is present. An exception will be thrown when applying the ``attrs`` annotation to such a class. This limitation is tracked in issue `494 <https:/python-attrs/attrs/issues/494>`_. `482 <https:/python-attrs/attrs/issues/482>`_ Changes ^^^^^^^ - Add ``is_callable``, ``deep_iterable``, and ``deep_mapping`` validators. * ``is_callable``: validates that a value is callable * ``deep_iterable``: Allows recursion down into an iterable, applying another validator to every member in the iterable as well as applying an optional validator to the iterable itself. * ``deep_mapping``: Allows recursion down into the items in a mapping object, applying a key validator and a value validator to the key and value in every item. Also applies an optional validator to the mapping object itself. You can find them in the ``attr.validators`` package. `425 <https:/python-attrs/attrs/issues/425>`_ - Fixed stub files to prevent errors raised by mypy's ``disallow_any_generics = True`` option. `443 <https:/python-attrs/attrs/issues/443>`_ - Attributes with ``init=False`` now can follow after ``kw_only=True`` attributes. `450 <https:/python-attrs/attrs/issues/450>`_ - ``attrs`` now has first class support for defining exception classes. If you define a class using ``attr.s(auto_exc=True)`` and subclass an exception, the class will behave like a well-behaved exception class including an appropriate ``__str__`` method, and all attributes additionally available in an ``args`` attribute. `500 <https:/python-attrs/attrs/issues/500>`_ - Clarified documentation for hashing to warn that hashable objects should be deeply immutable (in their usage, even if this is not enforced). `503 <https:/python-attrs/attrs/issues/503>`_ ---- ``` </details> <details> <summary>Links</summary> - PyPI: https://pypi.org/project/attrs - Changelog: https://pyup.io/changelogs/attrs/ - Homepage: https://www.attrs.org/ </details> ### Update [botocore](https://pypi.org/project/botocore) from **1.12.101** to **1.12.106**. <details> <summary>Changelog</summary> ### 1.12.106 ``` ======== * api-change:``ec2``: Update ec2 client to latest version * api-change:``autoscaling-plans``: Update autoscaling-plans client to latest version ``` ### 1.12.105 ``` ======== * api-change:``ssm``: Update ssm client to latest version * api-change:``apigatewayv2``: Update apigatewayv2 client to latest version * api-change:``alexaforbusiness``: Update alexaforbusiness client to latest version * api-change:``application-autoscaling``: Update application-autoscaling client to latest version ``` ### 1.12.104 ``` ======== * api-change:``waf-regional``: Update waf-regional client to latest version * api-change:``waf``: Update waf client to latest version ``` ### 1.12.103 ``` ======== * api-change:``discovery``: Update discovery client to latest version * api-change:``organizations``: Update organizations client to latest version * api-change:``resource-groups``: Update resource-groups client to latest version * api-change:``opsworkscm``: Update opsworkscm client to latest version * api-change:``pinpoint``: Update pinpoint client to latest version * api-change:``mediaconvert``: Update mediaconvert client to latest version * api-change:``cur``: Update cur client to latest version ``` ### 1.12.102 ``` ======== * api-change:``elbv2``: Update elbv2 client to latest version * api-change:``mediastore``: Update mediastore client to latest version * api-change:``ce``: Update ce client to latest version * api-change:``autoscaling``: Update autoscaling client to latest version ``` </details> <details> <summary>Links</summary> - PyPI: https://pypi.org/project/botocore - Changelog: https://pyup.io/changelogs/botocore/ - Repo: https:/boto/botocore </details> ### Update [cffi](https://pypi.org/project/cffi) from **1.12.1** to **1.12.2**. *The bot wasn't able to find a changelog for this release. [Got an idea?](https:/pyupio/changelogs/issues/new)* <details> <summary>Links</summary> - PyPI: https://pypi.org/project/cffi - Changelog: https://pyup.io/changelogs/cffi/ - Docs: http://cffi.readthedocs.org </details> ### Update [idna](https://pypi.org/project/idna) from **2.6** to **2.8**. <details> <summary>Changelog</summary> ### 2.8 ``` ++++++++++++++++ - Update to Unicode 11.0.0. - Provide more specific exceptions for some malformed labels. ``` ### 2.7 ``` ++++++++++++++++ - Update to Unicode 10.0.0. - No longer accepts dot-prefixed domains (e.g. ".example") as valid. This is to be more conformant with the UTS 46 spec. Users should strip dot prefixes from domains before processing. ``` </details> <details> <summary>Links</summary> - PyPI: https://pypi.org/project/idna - Changelog: https://pyup.io/changelogs/idna/ - Repo: https:/kjd/idna </details> ### Update [pyflakes](https://pypi.org/project/pyflakes) from **2.1.0** to **2.1.1**. *The bot wasn't able to find a changelog for this release. [Got an idea?](https:/pyupio/changelogs/issues/new)* <details> <summary>Links</summary> - PyPI: https://pypi.org/project/pyflakes - Changelog: https://pyup.io/changelogs/pyflakes/ - Repo: https:/PyCQA/pyflakes </details> ### Update [google-api-core](https://pypi.org/project/google-api-core) from **1.7.0** to **1.8.0**. *The bot wasn't able to find a changelog for this release. [Got an idea?](https:/pyupio/changelogs/issues/new)* <details> <summary>Links</summary> - PyPI: https://pypi.org/project/google-api-core - Repo: https:/GoogleCloudPlatform/google-cloud-python </details> ### Update [google-cloud-core](https://pypi.org/project/google-cloud-core) from **0.28.1** to **0.29.1**. *The bot wasn't able to find a changelog for this release. [Got an idea?](https:/pyupio/changelogs/issues/new)* <details> <summary>Links</summary> - PyPI: https://pypi.org/project/google-cloud-core - Repo: https:/GoogleCloudPlatform/google-cloud-python </details> ### Update [protobuf](https://pypi.org/project/protobuf) from **3.6.1** to **3.7.0**. *The bot wasn't able to find a changelog for this release. [Got an idea?](https:/pyupio/changelogs/issues/new)* <details> <summary>Links</summary> - PyPI: https://pypi.org/project/protobuf - Changelog: https://pyup.io/changelogs/protobuf/ - Repo: https:/protocolbuffers/protobuf/releases - Homepage: https://developers.google.com/protocol-buffers/ </details> ### Update [boto3](https://pypi.org/project/boto3) from **1.9.101** to **1.9.106**. <details> <summary>Changelog</summary> ### 1.9.106 ``` ======= * api-change:``ec2``: [``botocore``] Update ec2 client to latest version * api-change:``autoscaling-plans``: [``botocore``] Update autoscaling-plans client to latest version ``` ### 1.9.105 ``` ======= * api-change:``ssm``: [``botocore``] Update ssm client to latest version * api-change:``apigatewayv2``: [``botocore``] Update apigatewayv2 client to latest version * api-change:``alexaforbusiness``: [``botocore``] Update alexaforbusiness client to latest version * api-change:``application-autoscaling``: [``botocore``] Update application-autoscaling client to latest version ``` ### 1.9.104 ``` ======= * api-change:``waf-regional``: [``botocore``] Update waf-regional client to latest version * api-change:``waf``: [``botocore``] Update waf client to latest version ``` ### 1.9.103 ``` ======= * api-change:``discovery``: [``botocore``] Update discovery client to latest version * api-change:``organizations``: [``botocore``] Update organizations client to latest version * api-change:``resource-groups``: [``botocore``] Update resource-groups client to latest version * api-change:``opsworkscm``: [``botocore``] Update opsworkscm client to latest version * api-change:``pinpoint``: [``botocore``] Update pinpoint client to latest version * api-change:``mediaconvert``: [``botocore``] Update mediaconvert client to latest version * api-change:``cur``: [``botocore``] Update cur client to latest version ``` ### 1.9.102 ``` ======= * api-change:``elbv2``: [``botocore``] Update elbv2 client to latest version * api-change:``mediastore``: [``botocore``] Update mediastore client to latest version * api-change:``ce``: [``botocore``] Update ce client to latest version * api-change:``autoscaling``: [``botocore``] Update autoscaling client to latest version ``` </details> <details> <summary>Links</summary> - PyPI: https://pypi.org/project/boto3 - Changelog: https://pyup.io/changelogs/boto3/ - Repo: https:/boto/boto3 </details> ### Update [django-cors-headers](https://pypi.org/project/django-cors-headers) from **2.4.0** to **2.4.1**. <details> <summary>Changelog</summary> ### 2.4.1 ``` ------------------ * Fix ``DeprecationWarning`` from importing ``collections.abc.Sequence`` on Python 3.7. ``` </details> <details> <summary>Links</summary> - PyPI: https://pypi.org/project/django-cors-headers - Changelog: https://pyup.io/changelogs/django-cors-headers/ - Repo: https:/ottoyiu/django-cors-headers </details> ### Update [django-mozilla-product-details](https://pypi.org/project/django-mozilla-product-details) from **0.13** to **0.13.1**. *The bot wasn't able to find a changelog for this release. [Got an idea?](https:/pyupio/changelogs/issues/new)* <details> <summary>Links</summary> - PyPI: https://pypi.org/project/django-mozilla-product-details - Repo: https:/mozilla/django-product-details/ </details> ### Update [djangorestframework](https://pypi.org/project/djangorestframework) from **3.9.1** to **3.9.2**. *The bot wasn't able to find a changelog for this release. [Got an idea?](https:/pyupio/changelogs/issues/new)* <details> <summary>Links</summary> - PyPI: https://pypi.org/project/djangorestframework - Changelog: https://pyup.io/changelogs/djangorestframework/ - Homepage: https://www.django-rest-framework.org/ </details> ### Update [jsonschema](https://pypi.org/project/jsonschema) from **3.0.0** to **3.0.1**. *The bot wasn't able to find a changelog for this release. [Got an idea?](https:/pyupio/changelogs/issues/new)* <details> <summary>Links</summary> - PyPI: https://pypi.org/project/jsonschema - Changelog: https://pyup.io/changelogs/jsonschema/ - Repo: https:/Julian/jsonschema </details> ### Update [pytest-django](https://pypi.org/project/pytest-django) from **3.4.7** to **3.4.8**. <details> <summary>Changelog</summary> ### 3.4.8 ``` ------------------ Bugfixes ^^^^^^^^ * Fix DB renaming fixture for Multi-DB environment with SQLite (679) ``` </details> <details> <summary>Links</summary> - PyPI: https://pypi.org/project/pytest-django - Changelog: https://pyup.io/changelogs/pytest-django/ - Docs: https://pytest-django.readthedocs.io/ </details> ### Update [google-cloud-storage](https://pypi.org/project/google-cloud-storage) from **1.13.0** to **1.14.0**. *The bot wasn't able to find a changelog for this release. [Got an idea?](https:/pyupio/changelogs/issues/new)* <details> <summary>Links</summary> - PyPI: https://pypi.org/project/google-cloud-storage - Repo: https:/GoogleCloudPlatform/google-cloud-python </details> Co-authored-by: pyup-bot <[email protected]>
Pull Request Check List
This is just a reminder about the most common mistakes. Please make sure that you tick all appropriate boxes. But please read our contribution guide at least once, it will save you unnecessary review cycles!
- [ ] New features have been added to our Hypothesis testing strategy.n/a.pyi
)..rst
files is written using semantic newlines.versionadded
,versionchanged
, ordeprecated
directives.changelog.d
.If you have any questions to any of the points above, just submit and ask! This checklist is here to help you, not to deter you from contributing!
Description
These are a few validators that I have ended up needing multiple times in my projects and I figured they would be generally useful. If you would prefer I split them up into three PRs, let me know. They're completely independent of each other.
instance_of
validator.TBD
Something I couldn't quite decide on an approach for was how to present the lower-level validator exceptions to the user.
For example, if you define the following:
How should the error message present the validation of
"foo"
in the error message?I currently just have it allowing the lower level exceptions to bubble up directly. This is the simplest approach, but as implemented it makes the connection between the attribute and the value difficult to discern. This would be especially problematic if you had a more complex definition, such as:
Thoughts?
(note: because of the above TBD, there are some hanging unused exception instance variables that the
lint
testenv will complain about for now)