Giter Site home page Giter Site logo

Comments (13)

nicolaiarocci avatar nicolaiarocci commented on July 17, 2024

Design/usage example? Thanks!

from cerberus.

funkyfuture avatar funkyfuture commented on July 17, 2024
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.

nicolaiarocci avatar nicolaiarocci commented on July 17, 2024

👍

from cerberus.

nicolaiarocci avatar nicolaiarocci commented on July 17, 2024

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.

funkyfuture avatar funkyfuture commented on July 17, 2024

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.

nicolaiarocci avatar nicolaiarocci commented on July 17, 2024

Yes, I think you are right.

from cerberus.

manugarri avatar manugarri commented on July 17, 2024

👍

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.

funkyfuture avatar funkyfuture commented on July 17, 2024

i wouldn't see why a default-normalization-rule shouldn't be contributed with the vanilla Validator.

from cerberus.

manugarri avatar manugarri commented on July 17, 2024

it could, but it is more aligned with coerce in which it would silently alter the original data.

from cerberus.

funkyfuture avatar funkyfuture commented on July 17, 2024

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.

manugarri avatar manugarri commented on July 17, 2024

yeah that's what i meant. I guess both coerce and default are same level citizens.

from cerberus.

lelit avatar lelit commented on July 17, 2024

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.

funkyfuture avatar funkyfuture commented on July 17, 2024

closing this in favor of #188 where i argue that this is a 1.0-must-have.

from cerberus.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.