Skip to content

Commit de6cb65

Browse files
committed
backend/sdoc: allow spaces, colons, underscores, dashes in the UID and MultipleChoice fields
Related to #2197
1 parent 86e78e8 commit de6cb65

File tree

6 files changed

+39
-31
lines changed

6 files changed

+39
-31
lines changed

strictdoc/backend/sdoc/grammar/grammar.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
REGEX_UID = r"([\w]+[\w()\-\/. ]*)"
1+
REGEX_UID = r"([\w]+[\w()\-\/.: ]*)"
22

33
NEGATIVE_MULTILINE_STRING_START = "(?!>>>\n)"
44
NEGATIVE_MULTILINE_STRING_END = "(?!^<<<)"

strictdoc/backend/sdoc/validations/sdoc_validator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
RequirementFieldName,
2020
)
2121

22-
MULTIPLE_CHOICE_FIELD_KW = r"[a-zA-Z0-9\/_]+"
22+
MULTIPLE_CHOICE_FIELD_KW = r"[a-zA-Z0-9\/\-_ ]+"
2323
MULTIPLE_CHOICE_FIELD_REGEX = re.compile(
2424
rf"^{MULTIPLE_CHOICE_FIELD_KW}(, {MULTIPLE_CHOICE_FIELD_KW})*$"
2525
)

tests/integration/features/document_grammar/type_system/tag/validation/01_invalid_value/input.sdoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,4 @@ ELEMENTS:
1313
REQUIRED: False
1414

1515
[REQUIREMENT]
16-
TAG_FIELD: A B C
16+
TAG_FIELD: A#B#C
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
RUN: %expect_exit 1 %strictdoc export %S --output-dir Output/ | filecheck %s --dump-input=fail
22

33
CHECK: error: could not parse file: {{.*}}input.sdoc.
4-
CHECK: Semantic error: Requirement field of type Tag is invalid: A B C.
4+
CHECK: Semantic error: Requirement field of type Tag is invalid: A#B#C.
55
CHECK: Location: {{.*}}input.sdoc:15:1
66
CHECK: Hint: Tag field requires ', '-separated values.

tests/unit/strictdoc/backend/sdoc/test_dsl_passthrough.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,18 @@ def test_005_requirement_UID_supports_special_characters(
7878
[REQUIREMENT]
7979
UID: FOO/1
8080
TITLE: Hello
81+
82+
[REQUIREMENT]
83+
UID: FOO_1
84+
TITLE: Hello
85+
86+
[REQUIREMENT]
87+
UID: FOO 1
88+
TITLE: Hello
89+
90+
[REQUIREMENT]
91+
UID: FOO::1
92+
TITLE: Hello
8193
""".lstrip()
8294

8395
reader = SDReader()
@@ -1011,7 +1023,7 @@ def test_edge_case_03_uid_present_but_empty_with_space_character():
10111023
_ = reader.read(input_sdoc)
10121024

10131025
assert exc_info.type is TextXSyntaxError
1014-
assert "Expected '([\\w]+[\\w()\\-\\/. ]*)'" in exc_info.value.args[
1026+
assert "Expected '([\\w]+[\\w()\\-\\/.: ]*)'" in exc_info.value.args[
10151027
0
10161028
].decode("utf-8")
10171029

@@ -1032,7 +1044,7 @@ def test_edge_case_04_uid_present_but_empty_with_two_space_characters():
10321044
_ = reader.read(input_sdoc)
10331045

10341046
assert exc_info.type is TextXSyntaxError
1035-
assert "Expected '([\\w]+[\\w()\\-\\/. ]*)'" in exc_info.value.args[
1047+
assert "Expected '([\\w]+[\\w()\\-\\/.: ]*)'" in exc_info.value.args[
10361048
0
10371049
].decode("utf-8")
10381050

@@ -1056,8 +1068,8 @@ def test_edge_case_10_empty_multiline_field():
10561068
assert (
10571069
"Expected '^\\[ANCHOR: ' or '[LINK: ' or "
10581070
"'(?ms)(?!^<<<)(?!\\[LINK: "
1059-
"([\\w]+[\\w()\\-\\/. ]*))(?!^\\[ANCHOR: "
1060-
"([\\w]+[\\w()\\-\\/. ]*)).'" in exc_info.value.args[0].decode("utf-8")
1071+
"([\\w]+[\\w()\\-\\/.: ]*))(?!^\\[ANCHOR: "
1072+
"([\\w]+[\\w()\\-\\/.: ]*)).'" in exc_info.value.args[0].decode("utf-8")
10611073
)
10621074

10631075

tests/unit/strictdoc/backend/sdoc/test_dsl_passthrough_grammar.py

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -71,36 +71,20 @@ def test_151_grammar_single_choice(default_project_config):
7171
- TITLE: SINGLE_CHOICE_FIELD
7272
TYPE: SingleChoice(A, B, C)
7373
REQUIRED: True
74-
- TITLE: STATEMENT
75-
TYPE: String
76-
REQUIRED: False
77-
78-
[LOW_LEVEL_REQUIREMENT]
79-
SINGLE_CHOICE_FIELD: A
80-
""".lstrip()
81-
82-
expected_sdoc = """
83-
[DOCUMENT]
84-
TITLE: Test Doc
85-
86-
[GRAMMAR]
87-
ELEMENTS:
88-
- TAG: TEXT
89-
FIELDS:
90-
- TITLE: STATEMENT
91-
TYPE: String
74+
- TITLE: SINGLE_CHOICE_FIELD_2
75+
TYPE: SingleChoice(Test/Hardware, Test/Software)
9276
REQUIRED: True
93-
- TAG: LOW_LEVEL_REQUIREMENT
94-
FIELDS:
95-
- TITLE: SINGLE_CHOICE_FIELD
96-
TYPE: SingleChoice(A, B, C)
77+
- TITLE: SINGLE_CHOICE_FIELD_3
78+
TYPE: SingleChoice(Hardware test, Software test)
9779
REQUIRED: True
9880
- TITLE: STATEMENT
9981
TYPE: String
10082
REQUIRED: False
10183
10284
[LOW_LEVEL_REQUIREMENT]
10385
SINGLE_CHOICE_FIELD: A
86+
SINGLE_CHOICE_FIELD: Test/Hardware
87+
SINGLE_CHOICE_FIELD: Hardware test
10488
""".lstrip()
10589

10690
reader = SDReader()
@@ -111,7 +95,7 @@ def test_151_grammar_single_choice(default_project_config):
11195
writer = SDWriter(default_project_config)
11296
output = writer.write(document)
11397

114-
assert expected_sdoc == output
98+
assert input_sdoc == output
11599

116100

117101
def test_152_grammar_multiple_choice(default_project_config):
@@ -134,13 +118,25 @@ def test_152_grammar_multiple_choice(default_project_config):
134118
- TITLE: MULTIPLE_CHOICE_FIELD_2
135119
TYPE: MultipleChoice(Review, Test/Hardware)
136120
REQUIRED: True
121+
- TITLE: MULTIPLE_CHOICE_FIELD_3
122+
TYPE: MultipleChoice(Review of design, Hardware test)
123+
REQUIRED: True
124+
- TITLE: MULTIPLE_CHOICE_FIELD_4
125+
TYPE: MultipleChoice(review_of_design, hardware_test)
126+
REQUIRED: True
127+
- TITLE: MULTIPLE_CHOICE_FIELD_5
128+
TYPE: MultipleChoice(review-of-design, hardware-test)
129+
REQUIRED: True
137130
- TITLE: STATEMENT
138131
TYPE: String
139132
REQUIRED: False
140133
141134
[LOW_LEVEL_REQUIREMENT]
142135
MULTIPLE_CHOICE_FIELD: A, C
143136
MULTIPLE_CHOICE_FIELD_2: Review, Test/Hardware
137+
MULTIPLE_CHOICE_FIELD_3: Review of design, Hardware test
138+
MULTIPLE_CHOICE_FIELD_4: review_of_design, hardware_test
139+
MULTIPLE_CHOICE_FIELD_5: review-of-design, hardware-test
144140
"""
145141

146142
reader = SDReader()

0 commit comments

Comments
 (0)