Rename hyphen_range to dotdot_range a..b so we can have negatives.
Hyphen range doesn't allow negative numbers. The dot-dot syntax is used by git, ruby, and others so I think it's a good pick.
This commit is contained in:
parent
6dd4cfe59b
commit
f8b1cd9178
4 changed files with 40 additions and 39 deletions
|
@ -7,6 +7,7 @@ import datetime
|
|||
import hashlib
|
||||
import mimetypes
|
||||
import os
|
||||
import re
|
||||
import PIL.Image
|
||||
import typing
|
||||
import zipstream
|
||||
|
@ -181,6 +182,37 @@ def decollide_names(things, namer):
|
|||
def dict_to_tuple(d) -> tuple:
|
||||
return tuple(sorted(d.items()))
|
||||
|
||||
def dotdot_range(s) -> tuple:
|
||||
'''
|
||||
Given a string like '1..3', return numbers (1, 3) representing lower
|
||||
and upper bounds.
|
||||
|
||||
Supports bytestring.parsebytes and hh:mm:ss format, for example
|
||||
'1k..2k', '10:00..20:00', '4gib..'
|
||||
'''
|
||||
s = s.strip()
|
||||
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, high) = (parts[0], None)
|
||||
elif len(parts) == 2:
|
||||
(low, high) = parts
|
||||
else:
|
||||
raise ValueError('Too many dots.')
|
||||
|
||||
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.MinMaxOutOfOrder(range=s, min=low, max=high)
|
||||
|
||||
return (low, high)
|
||||
|
||||
def generate_image_thumbnail(filepath, width, height) -> PIL.Image:
|
||||
if not os.path.isfile(filepath):
|
||||
raise FileNotFoundError(filepath)
|
||||
|
@ -268,37 +300,6 @@ def hash_photoset(photos) -> str:
|
|||
|
||||
return hasher.hexdigest()
|
||||
|
||||
def hyphen_range(s) -> tuple:
|
||||
'''
|
||||
Given a string like '1-3', return numbers (1, 3) representing lower
|
||||
and upper bounds.
|
||||
|
||||
Supports bytestring.parsebytes and hh:mm:ss format, for example
|
||||
'1k-2k', '10:00-20:00', '4gib-'
|
||||
'''
|
||||
s = s.strip()
|
||||
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, high) = (parts[0], None)
|
||||
elif len(parts) == 2:
|
||||
(low, high) = parts
|
||||
else:
|
||||
raise ValueError('Too many hyphens.')
|
||||
|
||||
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.MinMaxOutOfOrder(range=s, min=low, max=high)
|
||||
|
||||
return (low, high)
|
||||
|
||||
def is_xor(*args) -> bool:
|
||||
'''
|
||||
Return True if and only if one arg is truthy.
|
||||
|
|
|
@ -451,7 +451,7 @@ class PDBPhotoMixin:
|
|||
'''
|
||||
PHOTO PROPERTIES
|
||||
area, width, height, ratio, bytes, duration:
|
||||
A hyphen_range string representing min and max. Or just a number
|
||||
A dotdot_range string representing min and max. Or just a number
|
||||
for lower bound.
|
||||
|
||||
TAGS AND FILTERS
|
||||
|
@ -460,7 +460,7 @@ class PDBPhotoMixin:
|
|||
usernames.
|
||||
|
||||
created:
|
||||
A hyphen_range string respresenting min and max. Or just a number
|
||||
A dotdot_range string respresenting min and max. Or just a number
|
||||
for lower bound.
|
||||
|
||||
extension:
|
||||
|
|
|
@ -76,9 +76,9 @@ def expand_mmf(tag_musts, tag_mays, tag_forbids):
|
|||
|
||||
def minmax(key, value, minimums, maximums, warning_bag=None):
|
||||
'''
|
||||
Dissects a hyphenated range string and inserts the correct k:v pair into
|
||||
Dissects a dotdot_range string and inserts the correct k:v pair into
|
||||
both minimums and maximums.
|
||||
('area', '100-200', {}, {})
|
||||
('area', '100..200', {}, {})
|
||||
-->
|
||||
{'area': 100}, {'area': 200} (MODIFIED IN PLACE)
|
||||
'''
|
||||
|
@ -96,7 +96,7 @@ def minmax(key, value, minimums, maximums, warning_bag=None):
|
|||
return
|
||||
|
||||
try:
|
||||
(low, high) = helpers.hyphen_range(value)
|
||||
(low, high) = helpers.dotdot_range(value)
|
||||
|
||||
except ValueError as exc:
|
||||
if warning_bag:
|
||||
|
@ -106,7 +106,7 @@ def minmax(key, value, minimums, maximums, warning_bag=None):
|
|||
else:
|
||||
raise
|
||||
|
||||
except exceptions.OutOfOrder as exc:
|
||||
except exceptions.MinMaxOutOfOrder as exc:
|
||||
if warning_bag:
|
||||
warning_bag.add(exc)
|
||||
return
|
||||
|
|
|
@ -224,9 +224,9 @@
|
|||
|
||||
<!-- BEFORE & AFTER SEARCH LINKS -->
|
||||
<div id="before_after_links">
|
||||
<a href="/search?created=-{{photo.created_unix}}">←Before</a>
|
||||
<a href="/search?created=..{{photo.created_unix}}">←Before</a>
|
||||
<span> | </span>
|
||||
<a href="/search?created={{photo.created_unix}}-&orderby=created-asc">After→</a>
|
||||
<a href="/search?created={{photo.created_unix}}..&orderby=created-asc">After→</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
|
Loading…
Reference in a new issue