diff --git a/jsonmodels/validators.py b/jsonmodels/validators.py index 77ea011..f9bdb0c 100644 --- a/jsonmodels/validators.py +++ b/jsonmodels/validators.py @@ -81,12 +81,12 @@ class Regex(object): """Validator for regular expressions.""" - FLAGS = { + ECMA_FLAGS = { 'ignorecase': re.I, 'multiline': re.M, } - def __init__(self, pattern, **flags): + def __init__(self, pattern, ecma=True, **flags): """Init. Note, that if given pattern is ECMA regex, given flags will be @@ -94,28 +94,33 @@ def __init__(self, pattern, **flags): :param string pattern: Pattern of regex. + :param boolean ecma: Whether or not use ECMA regex, default True. :param dict flags: Allowed flags can be found in attribute - `ATTRIBUTES_TO_FLAGS`. Invalid flags will be ignored. + `ECMA_FLAGS`. Invalid flags will be ignored. Will be ignored if not + ECMA regex. """ - flags = dict( - (key, value) for key, value in flags.items() - if key in self.FLAGS - ) - - if utilities.is_ecma_regex(pattern): - result = utilities.convert_ecma_regex_to_python(pattern) - self.pattern = result.regex - - for key, _ in flags.items(): - flags.update( - {key: self.FLAGS[key] in result.flags}) - else: - self.pattern = pattern + self.ecma = ecma + self.pattern = pattern + self.flags = [] + + if ecma: + flags = dict( + (key, value) for key, value in flags.items() + if key in self.ECMA_FLAGS + ) + + if utilities.is_ecma_regex(pattern): + result = utilities.convert_ecma_regex_to_python(pattern) + self.pattern = result.regex - self.flags = [ - self.FLAGS[key] for key, value - in flags.items() if value] + for key, _ in flags.items(): + flags.update( + {key: self.ECMA_FLAGS[key] in result.flags}) + + self.flags = [ + self.ECMA_FLAGS[key] for key, value + in flags.items() if value] def validate(self, value): """Validate value.""" @@ -137,8 +142,11 @@ def _calculate_flags(self): def modify_schema(self, field_schema): """Modify field schema.""" - field_schema['pattern'] = utilities.convert_python_regex_to_ecma( - self.pattern, self.flags) + if self.ecma: + field_schema['pattern'] = utilities.convert_python_regex_to_ecma( + self.pattern, self.flags) + else: + field_schema['pattern'] = self.pattern class Length(object): diff --git a/tests/test_validation.py b/tests/test_validation.py index 938422b..5f5a107 100644 --- a/tests/test_validation.py +++ b/tests/test_validation.py @@ -221,6 +221,22 @@ class Person(models.Base): person.name = 'Jimmy' +def test_regex_modify_schema(): + regex = "regex" + schema = {} + validator = validators.Regex(regex) + validator.modify_schema(schema) + assert schema["pattern"] == "/{}/".format(regex) + + +def test_regex_modify_schema_no_ecma(): + regex = "regex" + schema = {} + validator = validators.Regex(regex, ecma=False) + validator.modify_schema(schema) + assert schema["pattern"] == regex + + def test_init(): validator = validators.Length(0, 10) assert 0 == validator.minimum_value