porringer 0.2.1.dev91__tar.gz → 0.2.1.dev92__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/PKG-INFO +1 -1
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/__init__.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/api.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/__init__.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/backend.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/builder.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/__init__.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/client.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/__init__.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/action_builder.py +4 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/discovery.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/execution.py +46 -28
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/inspection.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/phase.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/presence.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/resolution.py +14 -8
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/manifest.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/package.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/plugin.py +33 -9
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/profile.py +16 -6
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/project.py +4 -3
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/self.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/sync.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/tool.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/resolver.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/schema.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/__init__.py +2 -2
- porringer-0.2.1.dev92/porringer/console/command/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/cache.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/check.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/download.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/env.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/install.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/open.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/package.py +4 -3
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/plugin.py +4 -3
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/preview.py +4 -9
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/schema.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/self.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/sync.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/common.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/entry.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/output.py +9 -11
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/__init__.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/plugin_schema/__init__.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/plugin_schema/environment.py +12 -12
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/plugin_schema/manifest.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/plugin_schema/plugin_manager.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/plugin_schema/project_environment.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/plugin_schema/python_environment.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/plugin_schema/scm.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/plugin_schema/tool_based.py +8 -8
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/schema.py +4 -3
- porringer-0.2.1.dev92/porringer/plugin/__init__.py +6 -0
- porringer-0.2.1.dev92/porringer/plugin/apt/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/apt/plugin.py +3 -2
- porringer-0.2.1.dev92/porringer/plugin/brew/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/brew/plugin.py +3 -2
- porringer-0.2.1.dev92/porringer/plugin/git/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/git/plugin.py +3 -2
- porringer-0.2.1.dev92/porringer/plugin/npm/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/npm/plugin.py +3 -2
- porringer-0.2.1.dev92/porringer/plugin/npm_project/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/npm_project/plugin.py +3 -2
- porringer-0.2.1.dev92/porringer/plugin/pdm/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pdm/plugin.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pim/__init__.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pim/plugin.py +11 -10
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pip/__init__.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pip/plugin.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pipx/__init__.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pipx/plugin.py +3 -2
- porringer-0.2.1.dev92/porringer/plugin/pnpm/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pnpm/plugin.py +3 -2
- porringer-0.2.1.dev92/porringer/plugin/pnpm_project/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pnpm_project/plugin.py +3 -2
- porringer-0.2.1.dev92/porringer/plugin/poetry/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/poetry/plugin.py +3 -2
- porringer-0.2.1.dev92/porringer/plugin/pyenv/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pyenv/plugin.py +3 -2
- porringer-0.2.1.dev92/porringer/plugin/uv/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/uv/plugin.py +3 -2
- porringer-0.2.1.dev92/porringer/plugin/uv_project/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/uv_project/plugin.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/winget/__init__.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/winget/plugin.py +3 -2
- porringer-0.2.1.dev92/porringer/plugin/yarn_project/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/yarn_project/plugin.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/__init__.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/cache.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/check.py +5 -4
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/download.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/execution.py +4 -3
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/inspection.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/manifest.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/plugin.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/profile.py +4 -3
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/project.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/snapshot.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/tool.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/mock/__init__.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/mock/environment.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/mock/plugin_manager.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/mock/project_environment.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/mock/scm.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/mock/subprocess.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/pytest/__init__.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/pytest/plugin.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/pytest/shared.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/pytest/tests.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/pytest/variants.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/utility/__init__.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/utility/download.py +7 -3
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/utility/exception.py +7 -6
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/utility/trace.py +4 -3
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/utility/utility.py +21 -11
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/pyproject.toml +1 -10
- porringer-0.2.1.dev92/tests/__init__.py +4 -0
- porringer-0.2.1.dev92/tests/fixtures/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/api.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/command_process.py +3 -3
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/disposable_environment.py +3 -3
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/factories.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/http.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/mock_plugins.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/packages.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/smoke_packages.py +1 -1
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/strategies.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/tool_smoke.py +3 -3
- porringer-0.2.1.dev92/tests/integration/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/integration/plugins/__init__.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/integration/plugins/winget/__init__.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/integration/plugins/winget/test_environment.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/integration/test_bootstrap_presence.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/integration/test_dry_run_acceptance.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/integration/test_example_bootstrap.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/integration/test_example_presence.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/integration/test_frozen_app_presence.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/integration/test_minimal_path.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/__init__.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/__init__.py +2 -2
- porringer-0.2.1.dev92/tests/unit/plugins/apt/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/apt/test_environment.py +3 -2
- porringer-0.2.1.dev92/tests/unit/plugins/brew/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/brew/test_environment.py +3 -2
- porringer-0.2.1.dev92/tests/unit/plugins/git/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/git/test_clone_detection.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/git/test_scm.py +3 -2
- porringer-0.2.1.dev92/tests/unit/plugins/npm/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/npm/test_environment.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/npm_project/__init__.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/npm_project/test_environment.py +3 -2
- porringer-0.2.1.dev92/tests/unit/plugins/pdm/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pdm/test_environment.py +3 -2
- porringer-0.2.1.dev92/tests/unit/plugins/pim/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pim/test_environment.py +3 -2
- porringer-0.2.1.dev92/tests/unit/plugins/pip/__init__.py +7 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pip/conftest.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pip/test_auxiliary_tools.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pip/test_environment.py +3 -2
- porringer-0.2.1.dev92/tests/unit/plugins/pipx/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pipx/test_environment.py +3 -2
- porringer-0.2.1.dev92/tests/unit/plugins/pnpm/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pnpm/test_environment.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pnpm_project/__init__.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pnpm_project/test_environment.py +3 -2
- porringer-0.2.1.dev92/tests/unit/plugins/poetry/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/poetry/test_environment.py +3 -2
- porringer-0.2.1.dev92/tests/unit/plugins/pyenv/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pyenv/test_environment.py +3 -2
- porringer-0.2.1.dev92/tests/unit/plugins/uv/__init__.py +4 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/uv/test_environment.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/uv_project/__init__.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/uv_project/test_environment.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/yarn_project/__init__.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/yarn_project/test_environment.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_action_filtering.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_action_progress.py +4 -3
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_backend_resolver.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_bootstrap_cross_platform.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_cache.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_check.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_check_updates.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_cli.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_command_plugin.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_command_self.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_concurrency_and_client.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_console_output.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_deferred_resolution.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_disposable_environment.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_downstream_api.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_event_loop_safety.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_extension_list.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_extras_introspection.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_frozen_app_detection.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_frozen_presence_resolution.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_hermeticity.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_install_cli.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_manifest_discovery.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_manifest_inspect.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_manifest_loading.py +11 -6
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_manifest_schema.py +16 -21
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_manifest_validation.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_output_schema_roundtrip.py +5 -3
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_package_ref.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_package_ref_invariants.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_package_relation.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_path_sync.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_aux_and_errors.py +7 -6
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_lifecycle.py +4 -4
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_manager.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_manager_presence.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_manager_upgrade.py +6 -5
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_runtime.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_tags.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_presence_detection.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_project_directory.py +5 -4
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_project_root.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_run_command_progress.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_runtime_context_seeding.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_runtime_propagation.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_runtime_updates.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_smoke_packages.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_sub_action_progress.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_sync_inspection.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_target_resolution.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_trace.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_uninstall.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_update_detection.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_update_detection_resolution.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_update_detection_spec.py +3 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_upgrade.py +2 -2
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/update_detection_helpers.py +3 -2
- porringer-0.2.1.dev91/porringer/console/command/__init__.py +0 -3
- porringer-0.2.1.dev91/porringer/plugin/__init__.py +0 -6
- porringer-0.2.1.dev91/porringer/plugin/apt/__init__.py +0 -3
- porringer-0.2.1.dev91/porringer/plugin/brew/__init__.py +0 -3
- porringer-0.2.1.dev91/porringer/plugin/git/__init__.py +0 -3
- porringer-0.2.1.dev91/porringer/plugin/npm/__init__.py +0 -3
- porringer-0.2.1.dev91/porringer/plugin/npm_project/__init__.py +0 -3
- porringer-0.2.1.dev91/porringer/plugin/pdm/__init__.py +0 -3
- porringer-0.2.1.dev91/porringer/plugin/pnpm/__init__.py +0 -3
- porringer-0.2.1.dev91/porringer/plugin/pnpm_project/__init__.py +0 -3
- porringer-0.2.1.dev91/porringer/plugin/poetry/__init__.py +0 -3
- porringer-0.2.1.dev91/porringer/plugin/pyenv/__init__.py +0 -3
- porringer-0.2.1.dev91/porringer/plugin/uv/__init__.py +0 -3
- porringer-0.2.1.dev91/porringer/plugin/uv_project/__init__.py +0 -3
- porringer-0.2.1.dev91/porringer/plugin/yarn_project/__init__.py +0 -3
- porringer-0.2.1.dev91/tests/__init__.py +0 -3
- porringer-0.2.1.dev91/tests/fixtures/__init__.py +0 -3
- porringer-0.2.1.dev91/tests/integration/__init__.py +0 -3
- porringer-0.2.1.dev91/tests/unit/plugins/apt/__init__.py +0 -3
- porringer-0.2.1.dev91/tests/unit/plugins/brew/__init__.py +0 -3
- porringer-0.2.1.dev91/tests/unit/plugins/git/__init__.py +0 -3
- porringer-0.2.1.dev91/tests/unit/plugins/npm/__init__.py +0 -3
- porringer-0.2.1.dev91/tests/unit/plugins/pdm/__init__.py +0 -3
- porringer-0.2.1.dev91/tests/unit/plugins/pim/__init__.py +0 -3
- porringer-0.2.1.dev91/tests/unit/plugins/pip/__init__.py +0 -7
- porringer-0.2.1.dev91/tests/unit/plugins/pipx/__init__.py +0 -3
- porringer-0.2.1.dev91/tests/unit/plugins/pnpm/__init__.py +0 -3
- porringer-0.2.1.dev91/tests/unit/plugins/poetry/__init__.py +0 -3
- porringer-0.2.1.dev91/tests/unit/plugins/pyenv/__init__.py +0 -3
- porringer-0.2.1.dev91/tests/unit/plugins/uv/__init__.py +0 -3
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/LICENSE.md +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/README.md +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/cache.py +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/schema.py +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/path.py +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/plugin_schema/runtime.py +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/target.py +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/py.typed +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/observability.py +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/progress.py +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/utility/concurrency.py +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/utility/observability.py +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/utility/py.typed +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/utility/tool_environment.py +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/conftest.py +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_command_process.py +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_docs_contract.py +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_example_manifests.py +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_pipx_bootstrap_contract.py +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_commands.py +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_dry_run_no_subprocess.py +0 -0
- {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_protocol.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""Public package exports.
|
|
1
|
+
"""Public package exports.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Public package entry points for Porringer.
|
|
4
4
|
|
|
5
5
|
This package exposes the public API, backend helpers, CLI commands, and
|
|
6
6
|
supporting utilities that applications use when integrating with Porringer.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""Public package exports for the backend module.
|
|
1
|
+
"""Public package exports for the backend module.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Backend package for Porringer.
|
|
4
4
|
|
|
5
5
|
This package contains modules and utilities for backend processing,
|
|
6
6
|
including configuration resolution, plugin management, and command execution.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""Backend helpers for backend.
|
|
1
|
+
"""Backend helpers for backend.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Backend resolution for mapping `(kind, ecosystem)` pairs to installer plugins.
|
|
4
4
|
|
|
5
5
|
The `BackendResolver` chooses the plugin that should handle each
|
|
6
6
|
`(PluginKind, ecosystem)` pair declared in a manifest. For example,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""Backend helpers for builder.
|
|
1
|
+
"""Backend helpers for builder.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Helpers for discovering and constructing plugins from entry points.
|
|
4
4
|
|
|
5
5
|
The builder offers reusable logic for scanning entry-point groups,
|
|
6
6
|
instantiating plugins, and resolving runtime executables without duplicating
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""Public package exports for the backend.command module.
|
|
1
|
+
"""Public package exports for the backend.command module.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Command package for Porringer backend.
|
|
4
4
|
|
|
5
5
|
This package contains command modules for backend operations,
|
|
6
6
|
including plugin management and self-update functionalities.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""Public package exports for the backend.command.core module.
|
|
1
|
+
"""Public package exports for the backend.command.core module.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Core backend command modules.
|
|
4
4
|
|
|
5
5
|
This package contains the core implementation modules for the
|
|
6
6
|
backend command system: action building, execution, plugin
|
{porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/action_builder.py
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""CLI command implementation for action builder.
|
|
1
|
+
"""CLI command implementation for action builder.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Action plan construction.
|
|
4
4
|
|
|
5
5
|
Builds the list of `SetupAction` objects from a parsed manifest and
|
|
6
6
|
resolved plugins. Also contains the preview/parse entry point that
|
|
@@ -388,6 +388,8 @@ def build_actions(
|
|
|
388
388
|
``dict[str, Environment]`` for backward compatibility
|
|
389
389
|
with existing callers / tests.
|
|
390
390
|
strategy: The sync strategy (used for description text).
|
|
391
|
+
search_from: The directory from which project-relevance discovery
|
|
392
|
+
should start.
|
|
391
393
|
|
|
392
394
|
Returns:
|
|
393
395
|
List of actions to perform.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""CLI command implementation for discovery.
|
|
1
|
+
"""CLI command implementation for discovery.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Plugin discovery helpers.
|
|
4
4
|
|
|
5
5
|
Provides `discover_plugins` which wraps entry-point discovery and
|
|
6
6
|
instantiation into a single canonical-name-keyed dict. Extracted from
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""CLI command implementation for execution.
|
|
1
|
+
"""CLI command implementation for execution.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Phased execution engine.
|
|
4
4
|
|
|
5
5
|
Orchestrates the multi-phase setup flow: runtime → packages → tools →
|
|
6
6
|
project-sync → SCM. Each phase ensures its prerequisites are met before
|
|
@@ -1717,38 +1717,56 @@ async def _execute_project_sync(
|
|
|
1717
1717
|
)
|
|
1718
1718
|
|
|
1719
1719
|
try:
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
|
|
1726
|
-
progress = CommandProgress(
|
|
1727
|
-
action=action,
|
|
1728
|
-
callback=_make_progress_callback(action, event_queue),
|
|
1729
|
-
phase='sync',
|
|
1720
|
+
return await _run_project_sync_steps(
|
|
1721
|
+
action,
|
|
1722
|
+
proj_env,
|
|
1723
|
+
effective_dir,
|
|
1724
|
+
event_queue,
|
|
1725
|
+
runtime_context=runtime_context,
|
|
1730
1726
|
)
|
|
1727
|
+
except Exception as e:
|
|
1728
|
+
return SetupActionResult(action=action, success=False, message=str(e))
|
|
1731
1729
|
|
|
1732
|
-
success = True
|
|
1733
|
-
for args in steps:
|
|
1734
|
-
cmd_result = await run_command(args, progress=progress, cwd=effective_dir, timeout=300.0)
|
|
1735
|
-
success = cmd_result.returncode == 0
|
|
1736
|
-
if not success:
|
|
1737
|
-
break
|
|
1738
1730
|
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
1731
|
+
async def _run_project_sync_steps(
|
|
1732
|
+
action: SetupAction,
|
|
1733
|
+
proj_env: ProjectEnvironment,
|
|
1734
|
+
effective_dir: Path,
|
|
1735
|
+
event_queue: asyncio.Queue[ProgressEvent | None],
|
|
1736
|
+
*,
|
|
1737
|
+
runtime_context: RuntimeContext | None = None,
|
|
1738
|
+
) -> SetupActionResult:
|
|
1739
|
+
"""Run the resolved project-sync steps and return their outcome."""
|
|
1740
|
+
# Always observe output: build the CLI steps from the plugin and
|
|
1741
|
+
# run them via run_command for line-by-line progress.
|
|
1742
|
+
plan = type(proj_env).command_plan(effective_dir, runtime_context=runtime_context)
|
|
1743
|
+
effective_dir = plan.directory
|
|
1744
|
+
steps = plan.steps or ([plan.argv] if plan.argv else [])
|
|
1745
|
+
|
|
1746
|
+
progress = CommandProgress(
|
|
1747
|
+
action=action,
|
|
1748
|
+
callback=_make_progress_callback(action, event_queue),
|
|
1749
|
+
phase='sync',
|
|
1750
|
+
)
|
|
1751
|
+
|
|
1752
|
+
success = True
|
|
1753
|
+
for args in steps:
|
|
1754
|
+
cmd_result = await run_command(args, progress=progress, cwd=effective_dir, timeout=300.0)
|
|
1755
|
+
success = cmd_result.returncode == 0
|
|
1756
|
+
if not success:
|
|
1757
|
+
break
|
|
1758
|
+
|
|
1759
|
+
if success:
|
|
1745
1760
|
return SetupActionResult(
|
|
1746
1761
|
action=action,
|
|
1747
|
-
success=
|
|
1748
|
-
message=f'
|
|
1762
|
+
success=True,
|
|
1763
|
+
message=f'Synced project via {action.installer}',
|
|
1749
1764
|
)
|
|
1750
|
-
|
|
1751
|
-
|
|
1765
|
+
return SetupActionResult(
|
|
1766
|
+
action=action,
|
|
1767
|
+
success=False,
|
|
1768
|
+
message=f'Project sync failed via {action.installer}',
|
|
1769
|
+
)
|
|
1752
1770
|
|
|
1753
1771
|
|
|
1754
1772
|
# ---------------------------------------------------------------------------
|
{porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/inspection.py
RENAMED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
"""CLI command implementation for inspection.
|
|
1
|
+
"""CLI command implementation for inspection.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Build structured inspection reports for manifest previews.
|
|
4
|
+
"""
|
|
4
5
|
|
|
5
6
|
import asyncio
|
|
6
7
|
from pathlib import Path
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""CLI command implementation for phase.
|
|
1
|
+
"""CLI command implementation for phase.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Generalized phase abstraction for the execution pipeline.
|
|
4
4
|
|
|
5
5
|
Each phase in the setup flow (runtime → packages → tools → project-sync →
|
|
6
6
|
SCM) is represented by a :class:`Phase` instance that
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""CLI command implementation for presence.
|
|
1
|
+
"""CLI command implementation for presence.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Presence detection and action inspection.
|
|
4
4
|
|
|
5
5
|
Checks whether packages are already installed so the sync engine can
|
|
6
6
|
skip redundant operations.
|
{porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/resolution.py
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""CLI command implementation for resolution.
|
|
1
|
+
"""CLI command implementation for resolution.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Unified operation resolution for inspection and real execution.
|
|
4
4
|
|
|
5
5
|
Determines the correct operation (install, upgrade, or skip) for a
|
|
6
6
|
given action based on the sync strategy and current system state.
|
|
@@ -485,7 +485,7 @@ async def _resolve_package_operation(
|
|
|
485
485
|
_VERSION_PATTERN = re.compile(r'v?(\d+\.\d+(?:\.\d+)*)')
|
|
486
486
|
|
|
487
487
|
|
|
488
|
-
async def _capture_subprocess(args: list[str], *,
|
|
488
|
+
async def _capture_subprocess(args: list[str], *, timeout_seconds: int) -> tuple[int | None, bytes, bytes] | None:
|
|
489
489
|
"""Run *args*, capturing stdout/stderr under a command trace.
|
|
490
490
|
|
|
491
491
|
Returns ``(returncode, stdout, stderr)`` on completion, or ``None``
|
|
@@ -498,7 +498,7 @@ async def _capture_subprocess(args: list[str], *, timeout: int) -> tuple[int | N
|
|
|
498
498
|
stdout=asyncio.subprocess.PIPE,
|
|
499
499
|
stderr=asyncio.subprocess.PIPE,
|
|
500
500
|
)
|
|
501
|
-
stdout_bytes, stderr_bytes = await asyncio.wait_for(proc.communicate(), timeout=
|
|
501
|
+
stdout_bytes, stderr_bytes = await asyncio.wait_for(proc.communicate(), timeout=timeout_seconds)
|
|
502
502
|
trace.finish(returncode=proc.returncode, stdout=stdout_bytes, stderr=stderr_bytes)
|
|
503
503
|
return proc.returncode, stdout_bytes or b'', stderr_bytes or b''
|
|
504
504
|
except (FileNotFoundError, OSError, TimeoutError) as exc:
|
|
@@ -516,7 +516,7 @@ async def probe_tool_version(name: str) -> str | None:
|
|
|
516
516
|
Returns the version string on success, or ``None`` when the
|
|
517
517
|
subprocess fails, times out, or the output cannot be parsed.
|
|
518
518
|
"""
|
|
519
|
-
result = await _capture_subprocess([name, '--version'],
|
|
519
|
+
result = await _capture_subprocess([name, '--version'], timeout_seconds=5)
|
|
520
520
|
if result is None:
|
|
521
521
|
return None
|
|
522
522
|
_, stdout_bytes, stderr_bytes = result
|
|
@@ -538,13 +538,19 @@ _REQUIRES_SCRIPT = (
|
|
|
538
538
|
``Requires-Dist`` entries as a JSON list of strings."""
|
|
539
539
|
|
|
540
540
|
|
|
541
|
-
async def _run_metadata_script(
|
|
541
|
+
async def _run_metadata_script(
|
|
542
|
+
python: str,
|
|
543
|
+
script: str,
|
|
544
|
+
package_name: str,
|
|
545
|
+
*,
|
|
546
|
+
timeout_seconds: int = 10,
|
|
547
|
+
) -> bytes | None:
|
|
542
548
|
"""Run a metadata-introspection one-liner in *python* and return stdout.
|
|
543
549
|
|
|
544
550
|
Returns raw stdout bytes on success, or ``None`` when the
|
|
545
551
|
subprocess fails, times out, or cannot be started.
|
|
546
552
|
"""
|
|
547
|
-
result = await _capture_subprocess([python, '-c', script, package_name],
|
|
553
|
+
result = await _capture_subprocess([python, '-c', script, package_name], timeout_seconds=timeout_seconds)
|
|
548
554
|
if result is None:
|
|
549
555
|
return None
|
|
550
556
|
returncode, stdout_bytes, _ = result
|
|
@@ -654,7 +660,7 @@ async def fetch_plugin_extras_context(
|
|
|
654
660
|
Returns ``(requires, installed_names)`` on success, or ``None``
|
|
655
661
|
when introspection fails.
|
|
656
662
|
"""
|
|
657
|
-
raw = await _run_metadata_script(python, _PLUGIN_EXTRAS_SCRIPT, package_name,
|
|
663
|
+
raw = await _run_metadata_script(python, _PLUGIN_EXTRAS_SCRIPT, package_name, timeout_seconds=15)
|
|
658
664
|
if raw is None:
|
|
659
665
|
return None
|
|
660
666
|
try:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""CLI command implementation for manifest.
|
|
1
|
+
"""CLI command implementation for manifest.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Manifest loading, parsing, and validation.
|
|
4
4
|
|
|
5
5
|
Handles finding, loading, and validating porringer manifests.
|
|
6
6
|
Supports three modes:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""CLI command implementation for package.
|
|
1
|
+
"""CLI command implementation for package.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The package command module.
|
|
4
4
|
|
|
5
5
|
Imperative package operations — listing, installing, upgrading,
|
|
6
6
|
uninstalling, and checking for updates on packages managed by
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""CLI command implementation for plugin.
|
|
1
|
+
"""CLI command implementation for plugin.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The plugin command module.
|
|
4
4
|
|
|
5
5
|
Manages *porringer extension* packages — installing, upgrading, and
|
|
6
6
|
uninstalling plugins that extend porringer's capabilities (e.g.
|
|
@@ -182,7 +182,7 @@ class PluginCommands:
|
|
|
182
182
|
*,
|
|
183
183
|
verb: str,
|
|
184
184
|
dry_run: bool,
|
|
185
|
-
|
|
185
|
+
timeout_seconds: int,
|
|
186
186
|
) -> PluginOperationResult:
|
|
187
187
|
"""Execute a plugin subprocess operation with dry-run support.
|
|
188
188
|
|
|
@@ -195,7 +195,7 @@ class PluginCommands:
|
|
|
195
195
|
args: Full command-line arguments.
|
|
196
196
|
verb: Human-readable verb (``"install"``, ``"uninstall"``, ``"upgrade"``).
|
|
197
197
|
dry_run: If ``True``, only report what would be done.
|
|
198
|
-
|
|
198
|
+
timeout_seconds: Subprocess timeout in seconds.
|
|
199
199
|
|
|
200
200
|
Returns:
|
|
201
201
|
PluginOperationResult indicating outcome.
|
|
@@ -212,7 +212,7 @@ class PluginCommands:
|
|
|
212
212
|
)
|
|
213
213
|
|
|
214
214
|
try:
|
|
215
|
-
result = await run_command(args, timeout=
|
|
215
|
+
result = await run_command(args, timeout=timeout_seconds)
|
|
216
216
|
if result.returncode != 0:
|
|
217
217
|
logger.error('%s failed for %s: %s', verb.capitalize(), name, result.stderr)
|
|
218
218
|
return PluginOperationResult(
|
|
@@ -267,9 +267,21 @@ class PluginCommands:
|
|
|
267
267
|
args = PluginCommands._build_install_args(name)
|
|
268
268
|
|
|
269
269
|
if dry_run:
|
|
270
|
-
return await PluginCommands._run_plugin_operation(
|
|
270
|
+
return await PluginCommands._run_plugin_operation(
|
|
271
|
+
name,
|
|
272
|
+
args,
|
|
273
|
+
verb='install',
|
|
274
|
+
dry_run=True,
|
|
275
|
+
timeout_seconds=120,
|
|
276
|
+
)
|
|
271
277
|
|
|
272
|
-
result = await PluginCommands._run_plugin_operation(
|
|
278
|
+
result = await PluginCommands._run_plugin_operation(
|
|
279
|
+
name,
|
|
280
|
+
args,
|
|
281
|
+
verb='install',
|
|
282
|
+
dry_run=False,
|
|
283
|
+
timeout_seconds=120,
|
|
284
|
+
)
|
|
273
285
|
if not result.success:
|
|
274
286
|
return result
|
|
275
287
|
|
|
@@ -315,7 +327,13 @@ class PluginCommands:
|
|
|
315
327
|
logger.info('Uninstalling plugin: %s', name)
|
|
316
328
|
args = PluginCommands._build_uninstall_args(name)
|
|
317
329
|
results.append(
|
|
318
|
-
await PluginCommands._run_plugin_operation(
|
|
330
|
+
await PluginCommands._run_plugin_operation(
|
|
331
|
+
name,
|
|
332
|
+
args,
|
|
333
|
+
verb='uninstall',
|
|
334
|
+
dry_run=dry_run,
|
|
335
|
+
timeout_seconds=60,
|
|
336
|
+
)
|
|
319
337
|
)
|
|
320
338
|
|
|
321
339
|
return results
|
|
@@ -337,7 +355,13 @@ class PluginCommands:
|
|
|
337
355
|
logger.info('Upgrading plugin: %s', name)
|
|
338
356
|
args = PluginCommands._build_upgrade_args(name)
|
|
339
357
|
results.append(
|
|
340
|
-
await PluginCommands._run_plugin_operation(
|
|
358
|
+
await PluginCommands._run_plugin_operation(
|
|
359
|
+
name,
|
|
360
|
+
args,
|
|
361
|
+
verb='upgrade',
|
|
362
|
+
dry_run=dry_run,
|
|
363
|
+
timeout_seconds=120,
|
|
364
|
+
)
|
|
341
365
|
)
|
|
342
366
|
|
|
343
367
|
return results
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
"""CLI command implementation for profile.
|
|
1
|
+
"""CLI command implementation for profile.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Portable setup profile commands.
|
|
4
|
+
"""
|
|
4
5
|
|
|
5
6
|
import json
|
|
6
7
|
import shutil
|
|
@@ -31,7 +32,12 @@ class ProfileCommands:
|
|
|
31
32
|
self._sync = sync_commands
|
|
32
33
|
|
|
33
34
|
@staticmethod
|
|
34
|
-
async def resolve(
|
|
35
|
+
async def resolve(
|
|
36
|
+
url: str,
|
|
37
|
+
*,
|
|
38
|
+
timeout_seconds: int = 300,
|
|
39
|
+
expected_hash: str | None = None,
|
|
40
|
+
) -> SetupProfile:
|
|
35
41
|
"""Download, parse, and validate a setup profile."""
|
|
36
42
|
validate_profile_url(url)
|
|
37
43
|
tmp_dir = Path(tempfile.mkdtemp(prefix='porringer_profile_'))
|
|
@@ -41,7 +47,7 @@ class ProfileCommands:
|
|
|
41
47
|
DownloadParameters(
|
|
42
48
|
url=url,
|
|
43
49
|
destination=destination,
|
|
44
|
-
timeout=
|
|
50
|
+
timeout=timeout_seconds,
|
|
45
51
|
expected_hash=expected_hash,
|
|
46
52
|
)
|
|
47
53
|
)
|
|
@@ -58,7 +64,11 @@ class ProfileCommands:
|
|
|
58
64
|
shutil.rmtree(tmp_dir, ignore_errors=True)
|
|
59
65
|
|
|
60
66
|
@staticmethod
|
|
61
|
-
async def _download_profile_manifests(
|
|
67
|
+
async def _download_profile_manifests(
|
|
68
|
+
profile: SetupProfile,
|
|
69
|
+
*,
|
|
70
|
+
timeout_seconds: int = 300,
|
|
71
|
+
) -> tuple[Path, list[Path]]:
|
|
62
72
|
"""Download profile manifests into a temporary directory.
|
|
63
73
|
|
|
64
74
|
Each manifest is optionally hash-verified when ``expected_hash`` is
|
|
@@ -73,7 +83,7 @@ class ProfileCommands:
|
|
|
73
83
|
DownloadParameters(
|
|
74
84
|
url=manifest.url,
|
|
75
85
|
destination=destination,
|
|
76
|
-
timeout=
|
|
86
|
+
timeout=timeout_seconds,
|
|
77
87
|
expected_hash=manifest.expected_hash,
|
|
78
88
|
)
|
|
79
89
|
)
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
"""CLI command implementation for project.
|
|
1
|
+
"""CLI command implementation for project.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Project and cached-directory inspection commands.
|
|
4
|
+
"""
|
|
4
5
|
|
|
5
6
|
import asyncio
|
|
6
7
|
from pathlib import Path
|
|
@@ -61,7 +62,7 @@ class ProjectCommands:
|
|
|
61
62
|
plugins: DiscoveredPlugins | None = None,
|
|
62
63
|
) -> ProjectInspection:
|
|
63
64
|
"""Inspect one project directory or manifest path."""
|
|
64
|
-
directory_path = Path(path).resolve
|
|
65
|
+
directory_path = await asyncio.to_thread(Path(path).resolve)
|
|
65
66
|
exists = await asyncio.to_thread(directory_path.exists)
|
|
66
67
|
has_manifest = await asyncio.to_thread(self._sync.has_manifest, directory_path) if exists else False
|
|
67
68
|
validation = DirectoryValidationResult(
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
"""CLI command implementation for self.
|
|
1
|
+
"""CLI command implementation for self.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Utilities for managing and checking the Porringer installation version.
|
|
4
|
+
"""
|
|
4
5
|
|
|
5
6
|
import contextlib
|
|
6
7
|
import importlib.metadata
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""CLI command implementation for sync.
|
|
1
|
+
"""CLI command implementation for sync.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The sync command module.
|
|
4
4
|
|
|
5
5
|
Thin facade that wires together manifest loading, action building,
|
|
6
6
|
presence detection, and phased execution. The heavy lifting lives
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"""Public package exports for the console module.
|
|
1
|
+
"""Public package exports for the console module.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Console package for Porringer.
|
|
4
4
|
|
|
5
5
|
This package contains modules and utilities for the command-line interface,
|
|
6
6
|
including command definitions and configuration management.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
"""CLI command implementation for cache.
|
|
1
|
+
"""CLI command implementation for cache.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Porringer CLI cache command module for managing manifest directories.
|
|
4
|
+
"""
|
|
4
5
|
|
|
5
6
|
import asyncio
|
|
6
7
|
from pathlib import Path
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
"""CLI command implementation for check.
|
|
1
|
+
"""CLI command implementation for check.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Porringer CLI check command module for checking package updates via plugins.
|
|
4
|
+
"""
|
|
4
5
|
|
|
5
6
|
import asyncio
|
|
6
7
|
from typing import Annotated
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
"""CLI command implementation for download.
|
|
1
|
+
"""CLI command implementation for download.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Porringer CLI download command module for downloading files.
|
|
4
|
+
"""
|
|
4
5
|
|
|
5
6
|
import asyncio
|
|
6
7
|
from pathlib import Path
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
"""CLI command implementation for open.
|
|
1
|
+
"""CLI command implementation for open.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Porringer CLI open command — the OS install-link handler entry point.
|
|
4
|
+
"""
|
|
4
5
|
|
|
5
6
|
from typing import Annotated
|
|
6
7
|
|