Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Checks for multiline values in metadata.txt #507

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions qgis-app/plugins/tests/test_validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,10 @@ def setUp(self):
)
web_not_exist_plugins = os.path.join(TESTFILE_DIR, "web_not_exist.zip")
valid_plugins = os.path.join(TESTFILE_DIR, "valid_metadata_link.zip")
invalid_metadata_multiline = os.path.join(TESTFILE_DIR, "invalid_metadata_multiline.zip_")
self.valid_metadata_link = open(valid_plugins, "rb")
self.invalid_metadata_link = open(invalid_plugins, "rb")
self.invalid_metadata_multiline = open(invalid_metadata_multiline, "rb")
self.web_not_exist = open(web_not_exist_plugins, "rb")
self.invalid_url_scheme = open(invalid_url_scheme_plugins, "rb")

Expand Down Expand Up @@ -66,6 +68,27 @@ def test_invalid_metadata_link_tracker_repo_homepage(self):
),
)

def test_invalid_metadata_multiline_attribute(self):
"""
The invalid_metadata_multiline.zip contains metadata file with
a multiline attribute that is commented but still has value.
The parser will append the value of the attribute to the previous
one and make it invalid.
"""

self.assertRaises(
ValidationError,
validator,
InMemoryUploadedFile(
self.invalid_metadata_multiline,
field_name="tempfile",
name="testfile.zip",
content_type="application/zip",
size=39889,
charset="utf8",
),
)

def test_invalid_metadata_url_scheme(self):
"""
The invalid_url_scheme.zip contains metadata file with
Expand Down
Binary file not shown.
24 changes: 23 additions & 1 deletion qgis-app/plugins/validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,28 @@ def _check_required_metadata(metadata):
)
)

def _check_multiline_metadata(metadata):
"""
Only the fields 'description', 'about' and 'changelog' can be multiline
If other fields are multiline, raise ValidationError
"""
allowed_multiline_fields = ['description', 'about', 'changelog']
multiline_fields = [
field for field in [item[0] for item in metadata]
if field not in ['description', 'about', 'changelog'] and '\n' in dict(metadata).get(field, '')
]
if len(multiline_fields) > 0:
multiline_fields_str = ', '.join(multiline_fields)
allowed_multiline_fields_str = ', '.join(allowed_multiline_fields)
raise ValidationError(
_(
f'The following metadata fields must be single-line: <code>{multiline_fields_str}</code>. '
'Please ensure these fields contain single-line values only. Note that multiline values can also occur if an allowed '
f'multiline field (<code>{allowed_multiline_fields_str}</code>) is commented out but still contains a multiline value.'
)
)


def _check_url_link(urls):
"""
Checks if all the url link is valid.
Expand Down Expand Up @@ -293,6 +315,7 @@ def validator(package, is_new: bool = False):
metadata.append(("metadata_source", "__init__.py"))

_check_required_metadata(metadata)
_check_multiline_metadata(metadata)

# Process Icon
try:
Expand Down Expand Up @@ -375,7 +398,6 @@ def validator(package, is_new: bool = False):
if "author" in dict(metadata):
if not re.match(r"^[^/]+$", dict(metadata)["author"]):
raise ValidationError(_("Author name cannot contain slashes."))

# strip and check
checked_metadata = []
for k, v in metadata:
Expand Down
Loading