Skip to content

Commit

Permalink
Normal, Regex and Email properties
Browse files Browse the repository at this point in the history
  • Loading branch information
rafaelpivato authored and robinedwards committed Nov 27, 2016
1 parent 26e67f2 commit 099f019
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 0 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@ development.env
.idea
.python-version
.ropeproject
\#*\#
1 change: 1 addition & 0 deletions neomodel/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
CardinalityViolation, ZeroOrMore, OneOrMore, ZeroOrOne, One)
from .properties import (StringProperty, IntegerProperty, AliasProperty,
FloatProperty, BooleanProperty, DateTimeProperty, DateProperty,
NormalProperty, RegexProperty, EmailProperty,
JSONProperty, ArrayProperty)
from .exception import InflateError, DeflateError, UniqueProperty, MultipleNodesReturned
from .signals import SIGNAL_SUPPORT
Expand Down
71 changes: 71 additions & 0 deletions neomodel/properties.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from .exception import InflateError, DeflateError, RequiredProperty
from datetime import datetime, date
import os
import re
import types
import pytz
import json
Expand Down Expand Up @@ -143,6 +144,76 @@ def is_indexed(self):
return self.unique_index or self.index


class NormalProperty(Property):
"""Base class for normalized properties.
Normalized properties are those that use the same normalization
method to inflate or deflate.
"""

@validator
def inflate(self, value):
return self.normalize(value)

@validator
def deflate(self, value):
return self.normalize(value)

def default_value(self):
default = super(NormalProperty, self).default_value()
return self.normalize(default)

def normalize(self, value):
raise NotImplementedError('Specialize normalize method')


class RegexProperty(NormalProperty):
"""Validates a normal property using a regular expression."""

expression = None
"""Can be overriden in subclasses.
This helps quickly defining your own expression in case you want
to extend :py:class:`RegexProperty`.
"""

def __init__(self, expression=None, **kwargs):
"""Initializes new property with an expression.
:param str expression: regular expression validating this property
If no `expression` is given, then
:py:attr:`RegexProperty.expression` is used instead, which is
`None` by default, except if :py:class:`RegexProperty` is
extended.
"""
super(RegexProperty, self).__init__(**kwargs)
actual_re = expression or self.expression
if actual_re is None:
raise ValueError('expression is undefined')
self.expression = actual_re

def normalize(self, value):
normal = unicode(value)
if not re.match(self.expression, normal):
raise ValueError(
'{0!r} does not matches {1!r}'.format(
value,
self.expression,
)
)
return normal


class EmailProperty(RegexProperty):
"""Suitable for email addresses."""

expression = r'[^@]+@[^@]+\.[^@]+'


class StringProperty(Property):
def __init__(self, **kwargs):
super(StringProperty, self).__init__(**kwargs)
Expand Down

0 comments on commit 099f019

Please sign in to comment.