keleshev / schema

Schema validation just got Pythonic
MIT License
2.86k stars 214 forks source link

Change schema for one key based on value of another key #321

Open DaveKLloyd opened 1 month ago

DaveKLloyd commented 1 month ago

I would like to make some keys Optional based on the value of another key. For example:

some_things:
      access: true
      option1: "option"
      option2: "other option"

If access = true option1 and option2 need to be there, if access is false those keys are optional. Actually they are useless, so not necessary. I guess it doesn't have to be optional perhaps I could use ignore_extra_keys if access is false.

Can this be done. I have tried a bunch of things and no luck yet.

mutricyl commented 1 month ago

Would the following fit your needs ?

from schema import Schema, Or

schema = Schema({'some_things': Or({'access': True,
                                    'option1': str,
                                    'option2': str,
                                    },
                                   {'access': False})})

schema.validate({'some_things': {'access': False}}) # OK
schema.validate({'some_things': {'access': True,
                                 'option1': 'foo',
                                 'option2': 'bar'}}) # OK

schema.validate({'some_things': {'access': False,
                                 'option1': 'foo',
                                 'option2': 'bar'}}) # SchemaError
DaveKLloyd commented 1 month ago

Awesome thanks, this works great.