-
Notifications
You must be signed in to change notification settings - Fork 137
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
chg: simplify validation of choices and tag names
- xls2json.py: - move choices checks to new validator module - include row reference in all errors/warnings. To have a consistent error message structure, each duplicate choice gets a copy of the message (in one error) rather than being smushed into one message. - xlsparseutils.py - replace separate regex for xml tags with expression parser and use that instead, for consistent parsing rules and to use cache - move the remaining sheet misspellings check to new validator module - expression.py - fix issue where a name containing "or" or "and" was parsed as an operator rather than a name. These tokens are only valid when surrounded by spaces so the regex is updated accordingly. - add tests for positive and negative match cases for tag names.
- Loading branch information
1 parent
b81e816
commit 4f1116e
Showing
13 changed files
with
189 additions
and
110 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
from pyxform import constants | ||
from pyxform.errors import PyXFormError | ||
|
||
INVALID_NAME = ( | ||
"[row : {row}] On the 'choices' sheet, the 'name' value is invalid. " | ||
"Choices must have a name. " | ||
"Learn more: https://xlsform.org/en/#setting-up-your-worksheets" | ||
) | ||
INVALID_LABEL = ( | ||
"[row : {row}] On the 'choices' sheet, the 'label' value is invalid. " | ||
"Choices should have a label. " | ||
"Learn more: https://xlsform.org/en/#setting-up-your-worksheets" | ||
) | ||
INVALID_HEADER = ( | ||
"[row : 1] On the 'choices' sheet, the '{column}' value is invalid. " | ||
"Column headers must not be empty and must not contain spaces. " | ||
"Learn more: https://xlsform.org/en/#setting-up-your-worksheets" | ||
) | ||
INVALID_DUPLICATE = ( | ||
"[row : {row}] On the 'choices' sheet, the 'name' value is invalid. " | ||
"Choice names must be unique for each choice list. " | ||
"If this is intentional, use the setting 'allow_choice_duplicates'. " | ||
"Learn more: https://xlsform.org/#choice-names." | ||
) | ||
|
||
|
||
def validate_headers( | ||
headers: tuple[tuple[str, ...], ...], warnings: list[str] | ||
) -> list[str]: | ||
def check(): | ||
for header in headers: | ||
header = header[0] | ||
if header != constants.LIST_NAME_S and (" " in header or header == ""): | ||
warnings.append(INVALID_HEADER.format(column=header)) | ||
yield header | ||
|
||
return list(check()) | ||
|
||
|
||
def validate_choices( | ||
options: list[dict], warnings: list[str], allow_duplicates: bool = False | ||
) -> None: | ||
seen_options = set() | ||
duplicate_errors = [] | ||
for option in options: | ||
if "name" not in option: | ||
raise PyXFormError(INVALID_NAME.format(row=option["__row"])) | ||
elif "label" not in option: | ||
warnings.append(INVALID_LABEL.format(row=option["__row"])) | ||
|
||
if not allow_duplicates: | ||
name = option["name"] | ||
if name in seen_options: | ||
duplicate_errors.append(INVALID_DUPLICATE.format(row=option["__row"])) | ||
else: | ||
seen_options.add(name) | ||
|
||
if 0 < len(duplicate_errors): | ||
raise PyXFormError("\n".join(duplicate_errors)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
Oops, something went wrong.