Comments (13)
Design/usage example? Thanks!
from cerberus.
class MyValidator(Validator):
def _corce_none_to_string(self, field, value):
if value is None:
self.document[field] = "N/A"
def _coerce_expand_avatar_path(self, field, value):
self.document[field] = os.path.join(self.avatar_dir, value)
schema = {'avatar': {'coerce': 'expand_avatar_path', 'type': 'accessible_image_file'},
'phone': {'coerce': 'none_to_string'}}
from cerberus.
👍
from cerberus.
Type coercion allows this already, as you can pass any callable to the coerce
method. You can also confine coercion within a custom validator:
class MyValidator(Validator):
def __init__(self, *args, **kwargs):
super(MyValidator, self).__init__(*args, **kwargs)
self.avatar_dir = '~/avatars'
def _validate_expand_avatar(self, expand_avatar, field, value):
self.document[field] = os.path.join(self.avatar_dir, value)
s = {'a': {'type': 'string', 'expand_avatar': True}
Alternatively you could create a new avatar
type:
class MyValidator(Validator):
def __init__(self, *args, **kwargs):
super(MyValidator, self).__init__(*args, **kwargs)
self.avatar_dir = '~/avatars'
def _validate_type_avatar(self, field, value):
self.document[field] = os.path.join(self.avatar_dir, value)
s = {'a': {'type': 'avatar'}}
Do we really need to add yet another way to achieve this?
from cerberus.
imo yes, as i think that normalization and validation should be clearer segregated in the code. you're proposal is more a workaround where normalization is applied while validation, right?
from cerberus.
Yes, I think you are right.
from cerberus.
👍
One example would be for those fields in which you want a default value.
Since there is no default
keyword this could be easily implemented with coerce.
Also, i agree that makes sense the separation of validation (no data changes) versus coerce (data is modified).
from cerberus.
i wouldn't see why a default
-normalization-rule shouldn't be contributed with the vanilla Validator.
from cerberus.
it could, but it is more aligned with coerce
in which it would silently alter the original data.
from cerberus.
i don't understand. i thought you mean:
>>> schema = {'amount': {'default': 1}}
>>> document = {'amount': None}
>>> v.validated(document, schema)
{'amount': 1}
>>> document = {'model': 'The Robots'}
>>> v.normalized(document, schema)
{'model': 'The Robots', 'amount': 1}
yes, it alters values like coerce
, but in a different way.
from cerberus.
yeah that's what i meant. I guess both coerce
and default
are same level citizens.
from cerberus.
I'd take advantage of this: I'm loading the schema from an external file (actually, from a schema
in a RAML
document), and there's no easy way to express a callable (although I could use a YAML
tag like {a: !!python/name:__builtin__.int}
, that's quite ugly, difficult to understand to non-Python-introduced people who read the schema, and most Python RAML loaders use yaml.SafeLoader
so that's not a generic option even).
Ideally I'd like to have a way to inject custom coercer functions on Validator
, that _coerce_values()
could lookup by name.
from cerberus.
closing this in favor of #188 where i argue that this is a 1.0-must-have.
from cerberus.
Related Issues (20)
- Unexpected normalization behavior with anyof_schema HOT 1
- Conditional validation for empty parameter
- Dependencies not being honored? HOT 1
- anyof does not respect nullable: True HOT 2
- install_requires=["setuptools"], in setup.py is wrong HOT 4
- Bug with rules_set_registry() for rule with type dict and included schema HOT 3
- Address DeprecationWarning errors to fix installation warning HOT 1
- Importing cerberus takes too long HOT 3
- Coercing fields does not work recursively HOT 2
- pyproject.toml does not specify requires-python HOT 1
- Rename and Coerce do not work together HOT 2
- anyof does not respect required: False HOT 4
- Inside oneof_schema not work default values for nested keys
- "anyof"/"oneof" and "nullable" do not behave as expected HOT 1
- ImportError: cannot import name 'Iterable' from 'collections' HOT 1
- Python 3.12 - SyntaxWarning HOT 2
- Dynamically set value for schema based on document values [Proposed label: feature_request
- Can't use 'oneof' for a list of complex elements
- Whitebox testing an error raising custom validation rule is not supported
- Custom data type validation does not support custom error generation
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from cerberus.