1
mirror of https://github.com/home-assistant/core synced 2024-07-12 07:21:24 +02:00

Use regex instead of partition to section package definition (#58278)

This commit is contained in:
Joakim Sørensen 2021-10-23 13:19:56 +02:00 committed by GitHub
parent e38754a836
commit 2a7192167d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 6 deletions

View File

@ -22,7 +22,9 @@ from .model import Config, Integration
IGNORE_PACKAGES = { IGNORE_PACKAGES = {
commented.lower().replace("_", "-") for commented in COMMENT_REQUIREMENTS commented.lower().replace("_", "-") for commented in COMMENT_REQUIREMENTS
} }
PACKAGE_REGEX = re.compile(r"^(?:--.+\s)?([-_\.\w\d]+).*==.+$") PACKAGE_REGEX = re.compile(
r"^(?:--.+\s)?([-_\.\w\d\[\]]+)(==|>=|<=|~=|!=|<|>|===)*(.*)$"
)
PIP_REGEX = re.compile(r"^(--.+\s)?([-_\.\w\d]+.*(?:==|>=|<=|~=|!=|<|>|===)?.*$)") PIP_REGEX = re.compile(r"^(--.+\s)?([-_\.\w\d]+.*(?:==|>=|<=|~=|!=|<|>|===)?.*$)")
SUPPORTED_PYTHON_TUPLES = [ SUPPORTED_PYTHON_TUPLES = [
REQUIRED_PYTHON_VER[:2], REQUIRED_PYTHON_VER[:2],
@ -84,16 +86,19 @@ def validate_requirements_format(integration: Integration) -> bool:
) )
continue continue
pkg, sep, version = req.partition("==") pkg, sep, version = PACKAGE_REGEX.match(req).groups()
if not sep and integration.core: if integration.core and sep != "==":
integration.add_error( integration.add_error(
"requirements", "requirements",
f'Requirement {req} need to be pinned "<pkg name>==<version>".', f'Requirement {req} need to be pinned "<pkg name>==<version>".',
) )
continue continue
if AwesomeVersion(version).strategy == AwesomeVersionStrategy.UNKNOWN: if (
version
and AwesomeVersion(version).strategy == AwesomeVersionStrategy.UNKNOWN
):
integration.add_error( integration.add_error(
"requirements", "requirements",
f"Unable to parse package version ({version}) for {pkg}.", f"Unable to parse package version ({version}) for {pkg}.",

View File

@ -45,7 +45,7 @@ def test_validate_requirements_format_wrongly_pinned(integration: Integration):
def test_validate_requirements_format_ignore_pin_for_custom(integration: Integration): def test_validate_requirements_format_ignore_pin_for_custom(integration: Integration):
"""Test requirement ignore pinning for custom.""" """Test requirement ignore pinning for custom."""
integration.manifest["requirements"] = ["test_package>=1"] integration.manifest["requirements"] = ["test_package>=1", "test_package"]
integration.path = Path("") integration.path = Path("")
assert validate_requirements_format(integration) assert validate_requirements_format(integration)
assert len(integration.errors) == 0 assert len(integration.errors) == 0
@ -63,6 +63,9 @@ def test_validate_requirements_format_invalid_version(integration: Integration):
def test_validate_requirements_format_successful(integration: Integration): def test_validate_requirements_format_successful(integration: Integration):
"""Test requirement with successful result.""" """Test requirement with successful result."""
integration.manifest["requirements"] = ["test_package==1.2.3"] integration.manifest["requirements"] = [
"test_package==1.2.3",
"test_package[async]==1.2.3",
]
assert validate_requirements_format(integration) assert validate_requirements_format(integration)
assert len(integration.errors) == 0 assert len(integration.errors) == 0