-
Notifications
You must be signed in to change notification settings - Fork 654
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Make galaxy[version-incorrect] rule opt-in (#2103)
The docstring and description attribute for the GalaxyRule class have been updated as to reflect the separation of galaxy[version-incorrect] and that the rule does more than checking of a changelog.
- Loading branch information
Showing
8 changed files
with
182 additions
and
83 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
../../src/ansiblelint/rules/galaxy_version_incorrect.md |
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,61 @@ | ||
# galaxy-version-incorrect | ||
|
||
This rule checks that the `version` key within `galaxy.yml` is greater than or | ||
equal to `1.0.0`. This is to follow semantic versioning standards that are | ||
enforced in the Ansible Automation Platform. | ||
|
||
This is an opt-in rule. You must enable it in your Ansible-lint configuration as | ||
follows: | ||
|
||
```yaml | ||
enable_list: | ||
- galaxy-version-incorrect | ||
``` | ||
## Problematic Code | ||
```yaml | ||
description: "description" | ||
namespace: "namespace_name" | ||
name: "collection_name" | ||
version: "0.0.1" # <- version key is not greater than or equal to '1.0.0'. | ||
readme: "README.md" | ||
authors: | ||
- "Author1" | ||
- "Author2 (https://author2.example.com)" | ||
- "Author3 <author3@example.com>" | ||
dependencies: | ||
"other_namespace.collection1": ">=1.0.0" | ||
"other_namespace.collection2": ">=2.0.0,<3.0.0" | ||
"anderson55.my_collection": "*" # note: "*" selects the highest version available | ||
license: | ||
- "MIT" | ||
tags: | ||
- demo | ||
- collection | ||
repository: "https://www.github.com/my_org/my_collection" | ||
``` | ||
## Correct Code | ||
```yaml | ||
description: "description" | ||
namespace: "namespace_name" | ||
name: "collection_name" | ||
version: "1.0.0" # <- version key is greater than or equal to '1.0.0'. | ||
readme: "README.md" | ||
authors: | ||
- "Author1" | ||
- "Author2 (https://author2.example.com)" | ||
- "Author3 <author3@example.com>" | ||
dependencies: | ||
"other_namespace.collection1": ">=1.0.0" | ||
"other_namespace.collection2": ">=2.0.0,<3.0.0" | ||
"anderson55.my_collection": "*" # note: "*" selects the highest version available | ||
license: | ||
- "MIT" | ||
tags: | ||
- demo | ||
- collection | ||
repository: "https://www.github.com/my_org/my_collection" | ||
``` |
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,114 @@ | ||
"""Implementation of GalaxyVersionIncorrectRule.""" | ||
|
||
from __future__ import annotations | ||
|
||
import sys | ||
from functools import total_ordering | ||
from typing import TYPE_CHECKING, Any | ||
|
||
from ansiblelint.rules import AnsibleLintRule | ||
|
||
if TYPE_CHECKING: | ||
from ansiblelint.errors import MatchError | ||
from ansiblelint.file_utils import Lintable | ||
|
||
|
||
class GalaxyVersionIncorrectRule(AnsibleLintRule): | ||
"""Rule for checking collection version is greater than 1.0.0.""" | ||
|
||
id = "galaxy-version-incorrect" | ||
description = "Confirm via galaxy.yml file if collection version is greater than or equal to 1.0.0." | ||
severity = "MEDIUM" | ||
tags = ["opt-in", "metadata"] | ||
version_added = "v24.7.0" | ||
|
||
def matchplay(self, file: Lintable, data: dict[str, Any]) -> list[MatchError]: | ||
"""Return matches found for a specific play (entry in playbook).""" | ||
if file.kind != "galaxy": # type: ignore[comparison-overlap] | ||
return [] | ||
|
||
results = [] | ||
version = data.get("version") | ||
if Version(version) < Version("1.0.0"): | ||
results.append( | ||
self.create_matcherror( | ||
message="collection version should be greater than or equal to 1.0.0", | ||
lineno=version._line_number, # noqa: SLF001 | ||
filename=file, | ||
), | ||
) | ||
|
||
return results | ||
|
||
|
||
@total_ordering | ||
class Version: | ||
"""Simple class to compare arbitrary versions.""" | ||
|
||
def __init__(self, version_string: str): | ||
"""Construct a Version object.""" | ||
self.components = version_string.split(".") | ||
|
||
def __eq__(self, other: object) -> bool: | ||
"""Implement equality comparison.""" | ||
try: | ||
other = _coerce(other) | ||
except NotImplementedError: | ||
return NotImplemented | ||
|
||
return self.components == other.components | ||
|
||
def __lt__(self, other: Version) -> bool: | ||
"""Implement lower-than operation.""" | ||
other = _coerce(other) | ||
|
||
return self.components < other.components | ||
|
||
|
||
def _coerce(other: object) -> Version: | ||
if isinstance(other, str): | ||
other = Version(other) | ||
if isinstance(other, int | float): | ||
other = Version(str(other)) | ||
if isinstance(other, Version): | ||
return other | ||
msg = f"Unable to coerce object type {type(other)} to Version" | ||
raise NotImplementedError(msg) | ||
|
||
|
||
if "pytest" in sys.modules: | ||
import pytest | ||
|
||
from ansiblelint.rules import RulesCollection # pylint: disable=ungrouped-imports | ||
from ansiblelint.runner import Runner | ||
|
||
def test_galaxy_collection_version_positive() -> None: | ||
"""Positive test for collection version in galaxy.""" | ||
collection = RulesCollection() | ||
collection.register(GalaxyVersionIncorrectRule()) | ||
success = "examples/.collection/galaxy.yml" | ||
good_runner = Runner(success, rules=collection) | ||
assert [] == good_runner.run() | ||
|
||
def test_galaxy_collection_version_negative() -> None: | ||
"""Negative test for collection version in galaxy.""" | ||
collection = RulesCollection() | ||
collection.register(GalaxyVersionIncorrectRule()) | ||
failure = "examples/meta/galaxy.yml" | ||
bad_runner = Runner(failure, rules=collection) | ||
errs = bad_runner.run() | ||
assert len(errs) == 1 | ||
|
||
def test_version_class() -> None: | ||
"""Test for version class.""" | ||
v = Version("1.0.0") | ||
assert v == Version("1.0.0") | ||
assert v != NotImplemented | ||
|
||
def test_coerce() -> None: | ||
"""Test for _coerce function.""" | ||
assert _coerce("1.0") == Version("1.0") | ||
assert _coerce(1.0) == Version("1.0") | ||
expected = "Unable to coerce object type" | ||
with pytest.raises(NotImplementedError, match=expected): | ||
_coerce(type(Version)) |
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