implement specifying ranges in slice notation (#918, #2865)

e.g.
- '1:101'   or ':101' or ':101:'  for files 1 to 100
- '1::2'    or '::2'              for every second file
- '1:101:5' or ':101:5'           for files 1, 6, 11, ..., 91, 96

(the second argument specifies the first index NOT included)
This commit is contained in:
Mike Fährmann
2022-12-27 18:21:12 +01:00
parent 3616adfc75
commit d651d45239
4 changed files with 87 additions and 57 deletions

View File

@@ -24,19 +24,26 @@ from gallery_dl import util, text, exception # noqa E402
class TestRange(unittest.TestCase):
def test_parse_empty(self, f=util.RangePredicate._parse):
self.assertEqual(f(""), [])
self.assertEqual(f([]), [])
def test_parse_digit(self, f=util.RangePredicate._parse):
self.assertEqual(f("2"), [range(2, 3)])
self.assertEqual(
f("2, 3, 4"),
[range(2, 3),
range(3, 4),
range(4, 5)],
)
def test_parse_range(self, f=util.RangePredicate._parse):
self.assertEqual(
f(""),
[],
)
self.assertEqual(
f("1-2"),
[range(1, 3)],
)
self.assertEqual(
f("-"),
[range(1, sys.maxsize)],
)
self.assertEqual(f("1-2"), [range(1, 3)])
self.assertEqual(f("2-"), [range(2, sys.maxsize)])
self.assertEqual(f("-3"), [range(1, 4)])
self.assertEqual(f("-"), [range(1, sys.maxsize)])
self.assertEqual(
f("-2,4,6-8,10-"),
[range(1, 3),
@@ -51,6 +58,29 @@ class TestRange(unittest.TestCase):
range(2, 7)],
)
def test_parse_slice(self, f=util.RangePredicate._parse):
self.assertEqual(f("2:4") , [range(2, 4)])
self.assertEqual(f("3::") , [range(3, sys.maxsize)])
self.assertEqual(f(":4:") , [range(1, 4)])
self.assertEqual(f("::5") , [range(1, sys.maxsize, 5)])
self.assertEqual(f("::") , [range(1, sys.maxsize)])
self.assertEqual(f("2:3:4"), [range(2, 3, 4)])
self.assertEqual(
f("2:4, 4:, :4, :4:, ::4"),
[range(2, 4),
range(4, sys.maxsize),
range(1, 4),
range(1, 4),
range(1, sys.maxsize, 4)],
)
self.assertEqual(
f(" : 3 , 4: 4, 2:6"),
[range(1, 3),
range(4, 4),
range(2, 6)],
)
class TestPredicate(unittest.TestCase):