Ensure tool-type package is compatible with a host system

This commit is contained in:
Ivan Kravets
2020-08-13 21:46:46 +03:00
parent ecc369c2f8
commit ff8ec43a28
2 changed files with 38 additions and 20 deletions

View File

@ -202,8 +202,17 @@ class BasePackageManager( # pylint: disable=too-many-public-methods
pkg.metadata = self.build_metadata(pkg_dir, spec) pkg.metadata = self.build_metadata(pkg_dir, spec)
except MissingPackageManifestError: except MissingPackageManifestError:
pass pass
if pkg.metadata: if not pkg.metadata:
result.append(pkg) continue
if self.pkg_type == PackageType.TOOL:
try:
if not self.is_system_compatible(
self.load_manifest(pkg).get("system")
):
continue
except MissingPackageManifestError:
pass
result.append(pkg)
return result return result
def get_package(self, spec): def get_package(self, spec):
@ -212,7 +221,7 @@ class BasePackageManager( # pylint: disable=too-many-public-methods
spec = self.ensure_spec(spec) spec = self.ensure_spec(spec)
best = None best = None
for pkg in self.get_installed(): for pkg in self.get_installed():
if not self._test_pkg_with_spec(pkg, spec): if not self.test_pkg_spec(pkg, spec):
continue continue
assert isinstance(pkg.metadata.version, semantic_version.Version) assert isinstance(pkg.metadata.version, semantic_version.Version)
if spec.requirements and pkg.metadata.version not in spec.requirements: if spec.requirements and pkg.metadata.version not in spec.requirements:
@ -221,7 +230,8 @@ class BasePackageManager( # pylint: disable=too-many-public-methods
best = pkg best = pkg
return best return best
def _test_pkg_with_spec(self, pkg, spec): @staticmethod
def test_pkg_spec(pkg, spec):
# "id" mismatch # "id" mismatch
if spec.id and spec.id != pkg.metadata.spec.id: if spec.id and spec.id != pkg.metadata.spec.id:
return False return False
@ -244,8 +254,4 @@ class BasePackageManager( # pylint: disable=too-many-public-methods
elif not spec.id and not ci_strings_are_equal(spec.name, pkg.metadata.name): elif not spec.id and not ci_strings_are_equal(spec.name, pkg.metadata.name):
return False return False
if self.pkg_type == PackageType.TOOL:
# TODO: check "system" for pkg
pass
return True return True

View File

@ -239,7 +239,7 @@ def test_install_force(isolated_pio_core, tmpdir_factory):
def test_get_installed(isolated_pio_core, tmpdir_factory): def test_get_installed(isolated_pio_core, tmpdir_factory):
storage_dir = tmpdir_factory.mktemp("storage") storage_dir = tmpdir_factory.mktemp("storage")
lm = LibraryPackageManager(str(storage_dir)) pm = ToolPackageManager(str(storage_dir))
# VCS package # VCS package
( (
@ -259,7 +259,7 @@ def test_get_installed(isolated_pio_core, tmpdir_factory):
"requirements": null, "requirements": null,
"url": "git+https://github.com/username/repo.git" "url": "git+https://github.com/username/repo.git"
}, },
"type": "library", "type": "tool",
"version": "0.0.0+sha.1ea4d5e" "version": "0.0.0+sha.1ea4d5e"
} }
""" """
@ -270,13 +270,13 @@ def test_get_installed(isolated_pio_core, tmpdir_factory):
( (
storage_dir.join("foo@3.4.5") storage_dir.join("foo@3.4.5")
.mkdir() .mkdir()
.join("library.json") .join("package.json")
.write('{"name": "foo", "version": "3.4.5"}') .write('{"name": "foo", "version": "3.4.5"}')
) )
# package with metadata file # package with metadata file
foo_dir = storage_dir.join("foo").mkdir() foo_dir = storage_dir.join("foo").mkdir()
foo_dir.join("library.json").write('{"name": "foo", "version": "3.6.0"}') foo_dir.join("package.json").write('{"name": "foo", "version": "3.6.0"}')
foo_dir.join(".piopm").write( foo_dir.join(".piopm").write(
""" """
{ {
@ -286,21 +286,33 @@ def test_get_installed(isolated_pio_core, tmpdir_factory):
"owner": null, "owner": null,
"requirements": "^3" "requirements": "^3"
}, },
"type": "library", "type": "tool",
"version": "3.6.0" "version": "3.6.0"
} }
""" """
) )
# invalid package # test "system"
storage_dir.join("invalid-package").mkdir().join("package.json").write( storage_dir.join("pkg-incompatible-system").mkdir().join("package.json").write(
'{"name": "tool-scons", "version": "4.0.0"}' '{"name": "check-system", "version": "4.0.0", "system": ["unknown"]}'
)
storage_dir.join("pkg-compatible-system").mkdir().join("package.json").write(
'{"name": "check-system", "version": "3.0.0", "system": "%s"}'
% util.get_systype()
) )
installed = lm.get_installed() # invalid package
assert len(installed) == 3 storage_dir.join("invalid-package").mkdir().join("library.json").write(
assert set(["pkg-via-vcs", "foo"]) == set(p.metadata.name for p in installed) '{"name": "SomeLib", "version": "4.0.0"}'
assert str(lm.get_package("foo").metadata.version) == "3.6.0" )
installed = pm.get_installed()
assert len(installed) == 4
assert set(["pkg-via-vcs", "foo", "check-system"]) == set(
p.metadata.name for p in installed
)
assert str(pm.get_package("foo").metadata.version) == "3.6.0"
assert str(pm.get_package("check-system").metadata.version) == "3.0.0"
def test_uninstall(isolated_pio_core, tmpdir_factory): def test_uninstall(isolated_pio_core, tmpdir_factory):