Somewhat improve prettiness of hyphen range parse code.
This commit is contained in:
parent
6dcf47cab7
commit
5d7bc1ff4b
1 changed files with 23 additions and 19 deletions
|
@ -243,20 +243,23 @@ def hyphen_range(s):
|
|||
s = s.replace(' ', '')
|
||||
if not s:
|
||||
return (None, None)
|
||||
|
||||
parts = s.split('-')
|
||||
parts = [part.strip() or None for part in parts]
|
||||
|
||||
if len(parts) == 1:
|
||||
low = parts[0]
|
||||
high = None
|
||||
(low, high) = (parts[0], None)
|
||||
elif len(parts) == 2:
|
||||
(low, high) = parts
|
||||
else:
|
||||
raise ValueError('Too many hyphens')
|
||||
|
||||
low = _unitconvert(low)
|
||||
high = _unitconvert(high)
|
||||
low = parse_unit_string(low)
|
||||
high = parse_unit_string(high)
|
||||
|
||||
if low is not None and high is not None and low > high:
|
||||
raise exceptions.OutOfOrder(range=s, min=low, max=high)
|
||||
|
||||
return low, high
|
||||
|
||||
def hms_to_seconds(hms):
|
||||
|
@ -290,6 +293,22 @@ def now(timestamp=True):
|
|||
return n.timestamp()
|
||||
return n
|
||||
|
||||
def parse_unit_string(s):
|
||||
'''
|
||||
Try to parse the string as a float, or bytestring, or hms.
|
||||
'''
|
||||
if s is None:
|
||||
return None
|
||||
|
||||
if ':' in s:
|
||||
return hms_to_seconds(s)
|
||||
|
||||
elif all(c in '0123456789.' for c in s):
|
||||
return float(s)
|
||||
|
||||
else:
|
||||
return bytestring.parsebytes(s)
|
||||
|
||||
def random_hex(length=12):
|
||||
randbytes = os.urandom(math.ceil(length / 2))
|
||||
token = ''.join('{:02x}'.format(x) for x in randbytes)
|
||||
|
@ -547,18 +566,3 @@ def zip_photos(photos):
|
|||
zipfile.write(filename=photo.real_path.absolute_path, arcname=arcname)
|
||||
|
||||
return zipfile
|
||||
|
||||
_numerical_characters = set('0123456789.')
|
||||
def _unitconvert(value):
|
||||
'''
|
||||
When parsing hyphenated ranges, this function is used to convert
|
||||
strings like "1k" to 1024 and "1:00" to 60.
|
||||
'''
|
||||
if value is None:
|
||||
return None
|
||||
if ':' in value:
|
||||
return hms_to_seconds(value)
|
||||
elif all(c in _numerical_characters for c in value):
|
||||
return float(value)
|
||||
else:
|
||||
return bytestring.parsebytes(value)
|
||||
|
|
Loading…
Reference in a new issue