Refactor NumberRange
This commit is contained in:
@@ -39,33 +39,44 @@ class NumberRange(object):
|
|||||||
'NumberRange takes at most two arguments'
|
'NumberRange takes at most two arguments'
|
||||||
)
|
)
|
||||||
elif len(args) == 2:
|
elif len(args) == 2:
|
||||||
lower, upper = args
|
self.parse_sequence(args)
|
||||||
if lower > upper:
|
|
||||||
raise RangeBoundsException(lower, upper)
|
|
||||||
self.lower = parse_number(lower)
|
|
||||||
self.upper = parse_number(upper)
|
|
||||||
self.lower_inc = self.upper_inc = True
|
|
||||||
else:
|
else:
|
||||||
arg, = args
|
arg, = args
|
||||||
if isinstance(arg, six.integer_types):
|
if isinstance(arg, six.integer_types):
|
||||||
self.lower = self.upper = arg
|
self.parse_integer(arg)
|
||||||
self.lower_inc = self.upper_inc = True
|
|
||||||
elif isinstance(arg, six.string_types):
|
elif isinstance(arg, six.string_types):
|
||||||
if ',' not in arg:
|
self.parse_string(arg)
|
||||||
self.lower, self.upper = self.parse_range(arg)
|
|
||||||
self.lower_inc = self.upper_inc = True
|
|
||||||
else:
|
|
||||||
self.from_range_with_bounds(arg)
|
|
||||||
elif hasattr(arg, 'lower') and hasattr(arg, 'upper'):
|
elif hasattr(arg, 'lower') and hasattr(arg, 'upper'):
|
||||||
self.lower = arg.lower
|
self.parse_object(arg)
|
||||||
self.upper = arg.upper
|
|
||||||
if not arg.lower_inc:
|
|
||||||
self.lower += 1
|
|
||||||
|
|
||||||
if not arg.upper_inc:
|
def parse_object(self, obj):
|
||||||
self.upper -= 1
|
self.lower = obj.lower
|
||||||
|
self.upper = obj.upper
|
||||||
|
if not obj.lower_inc:
|
||||||
|
self.lower += 1
|
||||||
|
|
||||||
def from_range_with_bounds(self, value):
|
if not obj.upper_inc:
|
||||||
|
self.upper -= 1
|
||||||
|
|
||||||
|
def parse_string(self, value):
|
||||||
|
if ',' not in value:
|
||||||
|
self.parse_hyphen_range(value)
|
||||||
|
else:
|
||||||
|
self.parse_bounded_range(value)
|
||||||
|
|
||||||
|
def parse_sequence(self, seq):
|
||||||
|
lower, upper = seq
|
||||||
|
if lower > upper:
|
||||||
|
raise RangeBoundsException(lower, upper)
|
||||||
|
self.lower = parse_number(lower)
|
||||||
|
self.upper = parse_number(upper)
|
||||||
|
self.lower_inc = self.upper_inc = True
|
||||||
|
|
||||||
|
def parse_integer(self, value):
|
||||||
|
self.lower = self.upper = value
|
||||||
|
self.lower_inc = self.upper_inc = True
|
||||||
|
|
||||||
|
def parse_bounded_range(self, value):
|
||||||
"""
|
"""
|
||||||
Returns new NumberRange object from normalized number range format.
|
Returns new NumberRange object from normalized number range format.
|
||||||
|
|
||||||
@@ -102,19 +113,18 @@ class NumberRange(object):
|
|||||||
self.lower = lower
|
self.lower = lower
|
||||||
self.upper = upper
|
self.upper = upper
|
||||||
|
|
||||||
def parse_range(self, value):
|
def parse_hyphen_range(self, value):
|
||||||
if value is not None:
|
values = value.split('-')
|
||||||
values = value.split('-')
|
if len(values) == 1:
|
||||||
if len(values) == 1:
|
self.lower = self.upper = parse_number(value.strip())
|
||||||
lower = upper = parse_number(value.strip())
|
else:
|
||||||
else:
|
try:
|
||||||
try:
|
self.lower, self.upper = map(
|
||||||
lower, upper = map(
|
lambda a: parse_number(a.strip()), values
|
||||||
lambda a: parse_number(a.strip()), values
|
)
|
||||||
)
|
except ValueError as e:
|
||||||
except ValueError as e:
|
raise NumberRangeException(str(e))
|
||||||
raise NumberRangeException(str(e))
|
self.lower_inc = self.upper_inc = True
|
||||||
return lower, upper
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def normalized(self):
|
def normalized(self):
|
||||||
|
Reference in New Issue
Block a user