Minor improvements

This commit is contained in:
Ivan Kravets
2022-03-16 16:18:59 +02:00
parent 057bf89894
commit d2adca8d68
3 changed files with 140 additions and 111 deletions

View File

@ -23,7 +23,7 @@ from platformio.package.manager.platform import PlatformPackageManager
from platformio.package.manager.tool import ToolPackageManager from platformio.package.manager.tool import ToolPackageManager
from platformio.package.meta import PackageSpec from platformio.package.meta import PackageSpec
from platformio.project.config import ProjectConfig from platformio.project.config import ProjectConfig
from platformio.project.savedeps import save_project_dependencies from platformio.project.savedeps import pkg_to_save_spec, save_project_dependencies
@click.command( @click.command(
@ -99,7 +99,7 @@ def install_project_dependencies(options):
click.echo( click.echo(
"Resolving %s environment packages..." % click.style(env, fg="cyan") "Resolving %s environment packages..." % click.style(env, fg="cyan")
) )
already_up_to_date = install_project_env_dependencies(env, options) already_up_to_date = not install_project_env_dependencies(env, options)
if not options["silent"] and already_up_to_date: if not options["silent"] and already_up_to_date:
click.secho("Already up-to-date.", fg="green") click.secho("Already up-to-date.", fg="green")
@ -184,7 +184,7 @@ def _install_project_env_custom_tools(project_env, options):
skip_dependencies=options.get("skip_dependencies"), skip_dependencies=options.get("skip_dependencies"),
force=options.get("force"), force=options.get("force"),
) )
specs_to_save.append(_pkg_to_save_spec(pkg, spec)) specs_to_save.append(pkg_to_save_spec(pkg, spec))
if not options.get("no_save") and specs_to_save: if not options.get("no_save") and specs_to_save:
save_project_dependencies( save_project_dependencies(
os.getcwd(), os.getcwd(),
@ -237,7 +237,7 @@ def _install_project_env_custom_libraries(project_env, options):
skip_dependencies=options.get("skip_dependencies"), skip_dependencies=options.get("skip_dependencies"),
force=options.get("force"), force=options.get("force"),
) )
specs_to_save.append(_pkg_to_save_spec(pkg, spec)) specs_to_save.append(pkg_to_save_spec(pkg, spec))
if not options.get("no_save") and specs_to_save: if not options.get("no_save") and specs_to_save:
save_project_dependencies( save_project_dependencies(
os.getcwd(), os.getcwd(),
@ -247,19 +247,3 @@ def _install_project_env_custom_libraries(project_env, options):
environments=[project_env], environments=[project_env],
) )
return not already_up_to_date return not already_up_to_date
def _pkg_to_save_spec(pkg, user_spec):
assert isinstance(user_spec, PackageSpec)
if user_spec.external:
return user_spec
return PackageSpec(
owner=pkg.metadata.spec.owner,
name=pkg.metadata.spec.name,
requirements=user_spec.requirements
or (
("^%s" % pkg.metadata.version)
if not pkg.metadata.version.build
else pkg.metadata.version
),
)

View File

@ -20,6 +20,22 @@ from platformio.project.config import ProjectConfig
from platformio.project.exception import InvalidProjectConfError from platformio.project.exception import InvalidProjectConfError
def pkg_to_save_spec(pkg, user_spec):
assert isinstance(user_spec, PackageSpec)
if user_spec.external:
return user_spec
return PackageSpec(
owner=pkg.metadata.spec.owner,
name=pkg.metadata.spec.name,
requirements=user_spec.requirements
or (
("^%s" % pkg.metadata.version)
if not pkg.metadata.version.build
else pkg.metadata.version
),
)
def save_project_dependencies( def save_project_dependencies(
project_dir, specs, scope, action="add", environments=None project_dir, specs, scope, action="add", environments=None
): ):
@ -31,7 +47,7 @@ def save_project_dependencies(
config.expand_interpolations = False config.expand_interpolations = False
candidates = [] candidates = []
try: try:
candidates = ignore_deps_by_specs(config.get("env:" + env, scope), specs) candidates = _ignore_deps_by_specs(config.get("env:" + env, scope), specs)
except InvalidProjectConfError: except InvalidProjectConfError:
pass pass
if action == "add": if action == "add":
@ -48,7 +64,7 @@ def save_project_dependencies(
config.save() config.save()
def ignore_deps_by_specs(deps, specs): def _ignore_deps_by_specs(deps, specs):
result = [] result = []
for dep in deps: for dep in deps:
ignore_conditions = [] ignore_conditions = []

View File

@ -23,6 +23,7 @@ from platformio.package.commands.install import package_install_cmd
from platformio.package.manager.library import LibraryPackageManager from platformio.package.manager.library import LibraryPackageManager
from platformio.package.manager.platform import PlatformPackageManager from platformio.package.manager.platform import PlatformPackageManager
from platformio.package.manager.tool import ToolPackageManager from platformio.package.manager.tool import ToolPackageManager
from platformio.package.meta import PackageSpec
from platformio.project.config import ProjectConfig from platformio.project.config import ProjectConfig
PROJECT_CONFIG_TPL = """ PROJECT_CONFIG_TPL = """
@ -39,8 +40,84 @@ board = attiny88
""" """
def pkgs_to_names(pkgs): def pkgs_to_specs(pkgs):
return [pkg.metadata.name for pkg in pkgs] return [
PackageSpec(name=pkg.metadata.name, requirements=pkg.metadata.version)
for pkg in pkgs
]
def test_global_packages(
clirunner, validate_cliresult, func_isolated_pio_core, tmp_path
):
# libraries
result = clirunner.invoke(
package_install_cmd,
[
"--global",
"-l",
"milesburton/DallasTemperature@^3.9.1",
"--skip-dependencies",
],
)
validate_cliresult(result)
assert pkgs_to_specs(LibraryPackageManager().get_installed()) == [
PackageSpec("DallasTemperature@3.9.1")
]
# with dependencies
result = clirunner.invoke(
package_install_cmd,
[
"--global",
"-l",
"milesburton/DallasTemperature@^3.9.1",
"-l",
"bblanchon/ArduinoJson@^6.19.2",
],
)
validate_cliresult(result)
assert pkgs_to_specs(LibraryPackageManager().get_installed()) == [
PackageSpec("ArduinoJson@6.19.3"),
PackageSpec("DallasTemperature@3.9.1"),
PackageSpec("OneWire@2.3.6"),
]
# custom storage
storage_dir = tmp_path / "custom_lib_storage"
storage_dir.mkdir()
result = clirunner.invoke(
package_install_cmd,
[
"--global",
"--storage-dir",
str(storage_dir),
"-l",
"bblanchon/ArduinoJson@^6.19.2",
],
)
validate_cliresult(result)
assert pkgs_to_specs(LibraryPackageManager(storage_dir).get_installed()) == [
PackageSpec("ArduinoJson@6.19.3")
]
# tools
result = clirunner.invoke(
package_install_cmd,
["--global", "-t", "platformio/framework-arduino-avr-attiny@^1.5.2"],
)
validate_cliresult(result)
assert pkgs_to_specs(ToolPackageManager().get_installed()) == [
PackageSpec("framework-arduino-avr-attiny@1.5.2")
]
# platforms
result = clirunner.invoke(
package_install_cmd,
["--global", "-p", "platformio/atmelavr@^3.4.0", "--skip-dependencies"],
)
validate_cliresult(result)
assert pkgs_to_specs(PlatformPackageManager().get_installed()) == [
PackageSpec("atmelavr@3.4.0")
]
def test_skip_dependencies(clirunner, validate_cliresult, isolated_pio_core, tmp_path): def test_skip_dependencies(clirunner, validate_cliresult, isolated_pio_core, tmp_path):
@ -56,7 +133,9 @@ def test_skip_dependencies(clirunner, validate_cliresult, isolated_pio_core, tmp
installed_lib_pkgs = LibraryPackageManager( installed_lib_pkgs = LibraryPackageManager(
os.path.join(ProjectConfig().get("platformio", "libdeps_dir"), "devkit") os.path.join(ProjectConfig().get("platformio", "libdeps_dir"), "devkit")
).get_installed() ).get_installed()
assert pkgs_to_names(installed_lib_pkgs) == ["DallasTemperature"] assert pkgs_to_specs(installed_lib_pkgs) == [
PackageSpec("DallasTemperature@3.9.1")
]
assert len(ToolPackageManager().get_installed()) == 0 assert len(ToolPackageManager().get_installed()) == 0
@ -73,9 +152,12 @@ def test_baremetal_project(clirunner, validate_cliresult, isolated_pio_core, tmp
installed_lib_pkgs = LibraryPackageManager( installed_lib_pkgs = LibraryPackageManager(
os.path.join(ProjectConfig().get("platformio", "libdeps_dir"), "baremetal") os.path.join(ProjectConfig().get("platformio", "libdeps_dir"), "baremetal")
).get_installed() ).get_installed()
assert pkgs_to_names(installed_lib_pkgs) == ["DallasTemperature", "OneWire"] assert pkgs_to_specs(installed_lib_pkgs) == [
assert pkgs_to_names(ToolPackageManager().get_installed()) == [ PackageSpec("DallasTemperature@3.9.1"),
"toolchain-atmelavr" PackageSpec("OneWire@2.3.6"),
]
assert pkgs_to_specs(ToolPackageManager().get_installed()) == [
PackageSpec("toolchain-atmelavr@1.70300.191015"),
] ]
@ -93,15 +175,26 @@ def test_project(clirunner, validate_cliresult, isolated_pio_core, tmp_path):
lm = LibraryPackageManager( lm = LibraryPackageManager(
os.path.join(config.get("platformio", "libdeps_dir"), "devkit") os.path.join(config.get("platformio", "libdeps_dir"), "devkit")
) )
assert pkgs_to_names(lm.get_installed()) == ["DallasTemperature", "OneWire"] assert pkgs_to_specs(lm.get_installed()) == [
assert pkgs_to_names(ToolPackageManager().get_installed()) == [ PackageSpec("DallasTemperature@3.9.1"),
"framework-arduino-avr-attiny", PackageSpec("OneWire@2.3.6"),
"toolchain-atmelavr", ]
assert pkgs_to_specs(ToolPackageManager().get_installed()) == [
PackageSpec("framework-arduino-avr-attiny@1.5.2"),
PackageSpec("toolchain-atmelavr@1.70300.191015"),
] ]
assert config.get("env:devkit", "lib_deps") == [ assert config.get("env:devkit", "lib_deps") == [
"milesburton/DallasTemperature@^3.9.1" "milesburton/DallasTemperature@^3.9.1"
] ]
# test "Already up-to-date"
result = clirunner.invoke(
package_install_cmd,
["-d", str(project_dir)],
)
validate_cliresult(result)
assert "Already up-to-date" in result.output
def test_unknown_project_dependencies( def test_unknown_project_dependencies(
clirunner, validate_cliresult, isolated_pio_core, tmp_path clirunner, validate_cliresult, isolated_pio_core, tmp_path
@ -175,7 +268,7 @@ def test_custom_project_libraries(
lm = LibraryPackageManager( lm = LibraryPackageManager(
os.path.join(config.get("platformio", "libdeps_dir"), "devkit") os.path.join(config.get("platformio", "libdeps_dir"), "devkit")
) )
assert pkgs_to_names(lm.get_installed()) == ["ArduinoJson"] assert pkgs_to_specs(lm.get_installed()) == [PackageSpec("ArduinoJson@6.19.3")]
# do not expect any platforms/tools # do not expect any platforms/tools
assert not os.path.exists(config.get("platformio", "platforms_dir")) assert not os.path.exists(config.get("platformio", "platforms_dir"))
assert not os.path.exists(config.get("platformio", "packages_dir")) assert not os.path.exists(config.get("platformio", "packages_dir"))
@ -195,7 +288,10 @@ def test_custom_project_libraries(
lm = LibraryPackageManager( lm = LibraryPackageManager(
os.path.join(config.get("platformio", "libdeps_dir"), "devkit") os.path.join(config.get("platformio", "libdeps_dir"), "devkit")
) )
assert pkgs_to_names(lm.get_installed()) == ["ArduinoJson", "Nanopb"] assert pkgs_to_specs(lm.get_installed()) == [
PackageSpec("ArduinoJson@6.19.3"),
PackageSpec("Nanopb@0.4.6+3"),
]
assert config.get("env:devkit", "lib_deps") == [ assert config.get("env:devkit", "lib_deps") == [
"bblanchon/ArduinoJson@^6.19.2", "bblanchon/ArduinoJson@^6.19.2",
] ]
@ -243,7 +339,9 @@ def test_custom_project_tools(
assert not result.output.strip() assert not result.output.strip()
config = ProjectConfig() config = ProjectConfig()
assert pkgs_to_names(ToolPackageManager().get_installed()) == ["tool-openocd"] assert pkgs_to_specs(ToolPackageManager().get_installed()) == [
PackageSpec("tool-openocd@2.1100.211028")
]
assert not LibraryPackageManager( assert not LibraryPackageManager(
os.path.join(config.get("platformio", "libdeps_dir"), "devkit") os.path.join(config.get("platformio", "libdeps_dir"), "devkit")
).get_installed() ).get_installed()
@ -262,9 +360,9 @@ def test_custom_project_tools(
) )
validate_cliresult(result) validate_cliresult(result)
config = ProjectConfig() config = ProjectConfig()
assert pkgs_to_names(ToolPackageManager().get_installed()) == [ assert pkgs_to_specs(ToolPackageManager().get_installed()) == [
"tool-esptoolpy", PackageSpec("tool-esptoolpy@1.20310.0"),
"tool-openocd", PackageSpec("tool-openocd@2.1100.211028"),
] ]
assert config.get("env:devkit", "platform_packages") == [ assert config.get("env:devkit", "platform_packages") == [
"platformio/tool-openocd@^2.1100.211028", "platformio/tool-openocd@^2.1100.211028",
@ -290,7 +388,7 @@ def test_custom_project_platforms(
project_dir = tmp_path / "project" project_dir = tmp_path / "project"
project_dir.mkdir() project_dir.mkdir()
(project_dir / "platformio.ini").write_text(PROJECT_CONFIG_TPL) (project_dir / "platformio.ini").write_text(PROJECT_CONFIG_TPL)
spec = "atmelavr" spec = "atmelavr@^3.4.0"
result = clirunner.invoke( result = clirunner.invoke(
package_install_cmd, package_install_cmd,
["-d", str(project_dir), "-e", "devkit", "-p", spec, "--skip-dependencies"], ["-d", str(project_dir), "-e", "devkit", "-p", spec, "--skip-dependencies"],
@ -313,7 +411,9 @@ def test_custom_project_platforms(
assert not result.output.strip() assert not result.output.strip()
config = ProjectConfig() config = ProjectConfig()
assert pkgs_to_names(PlatformPackageManager().get_installed()) == ["atmelavr"] assert pkgs_to_specs(PlatformPackageManager().get_installed()) == [
PackageSpec("atmelavr@3.4.0")
]
assert not LibraryPackageManager( assert not LibraryPackageManager(
os.path.join(config.get("platformio", "libdeps_dir"), "devkit") os.path.join(config.get("platformio", "libdeps_dir"), "devkit")
).get_installed() ).get_installed()
@ -335,74 +435,3 @@ def test_custom_project_platforms(
match="Unknown board ID", match="Unknown board ID",
): ):
validate_cliresult(result) validate_cliresult(result)
def test_global_packages(
clirunner, validate_cliresult, func_isolated_pio_core, tmp_path
):
# libraries
result = clirunner.invoke(
package_install_cmd,
[
"--global",
"-l",
"milesburton/DallasTemperature@^3.9.1",
"--skip-dependencies",
],
)
validate_cliresult(result)
assert pkgs_to_names(LibraryPackageManager().get_installed()) == [
"DallasTemperature"
]
# with dependencies
result = clirunner.invoke(
package_install_cmd,
[
"--global",
"-l",
"milesburton/DallasTemperature@^3.9.1",
"-l",
"bblanchon/ArduinoJson@^6.19.2",
],
)
validate_cliresult(result)
assert pkgs_to_names(LibraryPackageManager().get_installed()) == [
"ArduinoJson",
"DallasTemperature",
"OneWire",
]
# custom storage
storage_dir = tmp_path / "custom_lib_storage"
storage_dir.mkdir()
result = clirunner.invoke(
package_install_cmd,
[
"--global",
"--storage-dir",
str(storage_dir),
"-l",
"bblanchon/ArduinoJson@^6.19.2",
],
)
validate_cliresult(result)
assert pkgs_to_names(LibraryPackageManager(storage_dir).get_installed()) == [
"ArduinoJson"
]
# tools
result = clirunner.invoke(
package_install_cmd,
["--global", "-t", "platformio/framework-arduino-avr-attiny@^1.5.2"],
)
validate_cliresult(result)
assert pkgs_to_names(ToolPackageManager().get_installed()) == [
"framework-arduino-avr-attiny"
]
# platforms
result = clirunner.invoke(
package_install_cmd,
["--global", "-p", "platformio/atmelavr@^3.4.0", "--skip-dependencies"],
)
validate_cliresult(result)
assert pkgs_to_names(PlatformPackageManager().get_installed()) == ["atmelavr"]