diff --git a/haystack/utils/misc.py b/haystack/utils/misc.py index c349ea199d8..85cf8df001a 100644 --- a/haystack/utils/misc.py +++ b/haystack/utils/misc.py @@ -61,8 +61,11 @@ def expand_page_range(page_range: list[str | int]) -> list[int]: if not parts[0].isdigit() or not parts[1].isdigit(): msg = "range must be a string in the format 'start-end'" raise ValueError(f"Invalid page range: {page} - {msg}") - start, end = parts - expanded_page_range.extend(range(int(start), int(end) + 1)) + start, end = int(parts[0]), int(parts[1]) + if start > end: + msg = "start must be less than or equal to end" + raise ValueError(f"Invalid page range: '{parts[0]}-{parts[1]}' - {msg}") + expanded_page_range.extend(range(start, end + 1)) else: msg = "range must be a string in the format 'start-end' or an integer" diff --git a/releasenotes/notes/fix-expand-page-range-reversed-range-8a3f2d1e4b9c5f7a.yaml b/releasenotes/notes/fix-expand-page-range-reversed-range-8a3f2d1e4b9c5f7a.yaml new file mode 100644 index 00000000000..82ed70b2a03 --- /dev/null +++ b/releasenotes/notes/fix-expand-page-range-reversed-range-8a3f2d1e4b9c5f7a.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + Fixed ``expand_page_range`` silently dropping pages when a reversed range (e.g. ``"7-5"``) appeared + alongside valid entries. Mixed inputs like ``["1-3", "7-5", "8"]`` previously returned ``[1, 2, 3, 8]`` + with no warning, losing pages 5-7. A reversed range now raises ``ValueError`` with a descriptive + message identifying the offending range. diff --git a/test/utils/test_misc.py b/test/utils/test_misc.py index 4e2286dea8a..716214af86a 100644 --- a/test/utils/test_misc.py +++ b/test/utils/test_misc.py @@ -198,3 +198,16 @@ def test_invalid_string_raises_value_error(self): def test_malformed_range_with_multiple_hyphens_raises_value_error(self): with pytest.raises(ValueError, match="Invalid page range"): expand_page_range(["1-3", "5-10-15"]) + + def test_reversed_range_alone_raises_value_error(self): + with pytest.raises(ValueError, match="Invalid page range.*start must be less than or equal to end"): + expand_page_range(["5-3"]) + + def test_reversed_range_mixed_raises_value_error(self): + # Previously, a reversed range mixed with valid entries silently dropped the reversed range. + # e.g. ["1-3", "7-5", "8"] would return [1, 2, 3, 8], losing pages 5-7 with no error. + with pytest.raises(ValueError, match="Invalid page range.*start must be less than or equal to end"): + expand_page_range(["1-3", "7-5", "8"]) + + def test_equal_start_end_is_valid(self): + assert expand_page_range(["3-3"]) == [3]