diff --git a/src/sphinx_codelinks/analyse/oneline_parser.py b/src/sphinx_codelinks/analyse/oneline_parser.py index 2e993db..3395a1e 100644 --- a/src/sphinx_codelinks/analyse/oneline_parser.py +++ b/src/sphinx_codelinks/analyse/oneline_parser.py @@ -54,7 +54,7 @@ def oneline_parser( # noqa: PLR0912, PLR0911 # handel warnings # extract the string wrapped by start and end start_idx = start_idx + len(oneline_config.start_sequence) - string = oneline[start_idx:end_idx] + string = oneline[start_idx:end_idx].strip() # numbers of needs_fields which are required cnt_required_fields = oneline_config.get_cnt_required_fields() diff --git a/tests/test_oneline_parser.py b/tests/test_oneline_parser.py index e0e55a3..ee5ae07 100644 --- a/tests/test_oneline_parser.py +++ b/tests/test_oneline_parser.py @@ -25,6 +25,54 @@ "end_column": 17, }, ), + # Test case for leading space after start sequence (bug fix) + ( + f"@ title 1, IMPL_1 {UNIX_NEWLINE}", + { + "title": "title 1", + "id": "IMPL_1", + "type": "impl", + "links": [], + "start_column": 1, + "end_column": 18, + }, + ), + # Test case for multiple leading spaces after start sequence + ( + f"@ title 1, IMPL_1 {UNIX_NEWLINE}", + { + "title": "title 1", + "id": "IMPL_1", + "type": "impl", + "links": [], + "start_column": 1, + "end_column": 20, + }, + ), + # Test case for trailing space before end sequence + ( + f"@title 1, IMPL_1 {UNIX_NEWLINE}", + { + "title": "title 1", + "id": "IMPL_1", + "type": "impl", + "links": [], + "start_column": 1, + "end_column": 18, + }, + ), + # Test case for both leading and trailing spaces + ( + f"@ title 1, IMPL_1 {UNIX_NEWLINE}", + { + "title": "title 1", + "id": "IMPL_1", + "type": "impl", + "links": [], + "start_column": 1, + "end_column": 21, + }, + ), ], ) def test_oneline_parser_default_config_positive( @@ -34,6 +82,99 @@ def test_oneline_parser_default_config_positive( assert oneline_need == result +# Test case for space as field separator (as mentioned by Kilian) +# Example: @Implementation +ONELINE_COMMENT_STYLE_SPACE_SEPARATOR = OneLineCommentStyle( + start_sequence="@", + end_sequence=UNIX_NEWLINE, + field_split_char=" ", + needs_fields=[ + {"name": "title"}, + {"name": "id"}, + {"name": "type", "default": "impl"}, + ], +) + + +@pytest.mark.parametrize( + "oneline, result", + [ + # Basic space-separated fields + ( + f"@Implementation IMPL_1{UNIX_NEWLINE}", + { + "title": "Implementation", + "id": "IMPL_1", + "type": "impl", + "start_column": 1, + "end_column": 22, + }, + ), + # Space separator with explicit type + ( + f"@MyFeature FEAT_001 feature{UNIX_NEWLINE}", + { + "title": "MyFeature", + "id": "FEAT_001", + "type": "feature", + "start_column": 1, + "end_column": 27, + }, + ), + # Leading space after @ (the bug Kilian reported) + ( + f"@ Implementation IMPL_2{UNIX_NEWLINE}", + { + "title": "Implementation", + "id": "IMPL_2", + "type": "impl", + "start_column": 1, + "end_column": 23, + }, + ), + # Trailing space before newline + ( + f"@Implementation IMPL_3 {UNIX_NEWLINE}", + { + "title": "Implementation", + "id": "IMPL_3", + "type": "impl", + "start_column": 1, + "end_column": 23, + }, + ), + # Multiple leading spaces after @ + ( + f"@ Title ID_456{UNIX_NEWLINE}", + { + "title": "Title", + "id": "ID_456", + "type": "impl", + "start_column": 1, + "end_column": 15, + }, + ), + # Title contain spaces + ( + f"@ Title\ escape\ space ID_456{UNIX_NEWLINE}", + { + "title": "Title escape space", + "id": "ID_456", + "type": "impl", + "start_column": 1, + "end_column": 30, + }, + ), + ], +) +def test_oneline_parser_space_separator( + oneline: str, result: dict[str, str | list[str]] +) -> None: + """Test oneline parser with space as field separator.""" + oneline_need = oneline_parser(oneline, ONELINE_COMMENT_STYLE_SPACE_SEPARATOR) + assert oneline_need == result + + @pytest.mark.parametrize( "oneline, result", [