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.
Files changed (285) hide show
  1. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/PKG-INFO +1 -1
  2. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/__init__.py +2 -2
  3. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/api.py +3 -2
  4. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/__init__.py +2 -2
  5. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/backend.py +2 -2
  6. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/builder.py +2 -2
  7. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/__init__.py +2 -2
  8. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/client.py +3 -2
  9. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/__init__.py +2 -2
  10. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/action_builder.py +4 -2
  11. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/discovery.py +2 -2
  12. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/execution.py +46 -28
  13. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/inspection.py +3 -2
  14. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/phase.py +2 -2
  15. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/presence.py +2 -2
  16. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/core/resolution.py +14 -8
  17. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/manifest.py +2 -2
  18. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/package.py +2 -2
  19. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/plugin.py +33 -9
  20. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/profile.py +16 -6
  21. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/project.py +4 -3
  22. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/self.py +3 -2
  23. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/sync.py +2 -2
  24. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/command/tool.py +3 -2
  25. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/resolver.py +3 -2
  26. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/schema.py +3 -2
  27. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/__init__.py +2 -2
  28. porringer-0.2.1.dev92/porringer/console/command/__init__.py +4 -0
  29. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/cache.py +3 -2
  30. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/check.py +3 -2
  31. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/download.py +3 -2
  32. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/env.py +3 -2
  33. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/install.py +3 -2
  34. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/open.py +3 -2
  35. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/package.py +4 -3
  36. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/plugin.py +4 -3
  37. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/preview.py +4 -9
  38. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/schema.py +2 -2
  39. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/self.py +3 -2
  40. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/command/sync.py +2 -2
  41. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/common.py +3 -2
  42. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/entry.py +3 -2
  43. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/output.py +9 -11
  44. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/__init__.py +2 -2
  45. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/plugin_schema/__init__.py +2 -2
  46. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/plugin_schema/environment.py +12 -12
  47. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/plugin_schema/manifest.py +2 -2
  48. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/plugin_schema/plugin_manager.py +2 -2
  49. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/plugin_schema/project_environment.py +2 -2
  50. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/plugin_schema/python_environment.py +2 -2
  51. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/plugin_schema/scm.py +2 -2
  52. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/plugin_schema/tool_based.py +8 -8
  53. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/schema.py +4 -3
  54. porringer-0.2.1.dev92/porringer/plugin/__init__.py +6 -0
  55. porringer-0.2.1.dev92/porringer/plugin/apt/__init__.py +4 -0
  56. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/apt/plugin.py +3 -2
  57. porringer-0.2.1.dev92/porringer/plugin/brew/__init__.py +4 -0
  58. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/brew/plugin.py +3 -2
  59. porringer-0.2.1.dev92/porringer/plugin/git/__init__.py +4 -0
  60. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/git/plugin.py +3 -2
  61. porringer-0.2.1.dev92/porringer/plugin/npm/__init__.py +4 -0
  62. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/npm/plugin.py +3 -2
  63. porringer-0.2.1.dev92/porringer/plugin/npm_project/__init__.py +4 -0
  64. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/npm_project/plugin.py +3 -2
  65. porringer-0.2.1.dev92/porringer/plugin/pdm/__init__.py +4 -0
  66. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pdm/plugin.py +3 -2
  67. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pim/__init__.py +2 -2
  68. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pim/plugin.py +11 -10
  69. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pip/__init__.py +2 -2
  70. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pip/plugin.py +3 -2
  71. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pipx/__init__.py +2 -2
  72. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pipx/plugin.py +3 -2
  73. porringer-0.2.1.dev92/porringer/plugin/pnpm/__init__.py +4 -0
  74. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pnpm/plugin.py +3 -2
  75. porringer-0.2.1.dev92/porringer/plugin/pnpm_project/__init__.py +4 -0
  76. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pnpm_project/plugin.py +3 -2
  77. porringer-0.2.1.dev92/porringer/plugin/poetry/__init__.py +4 -0
  78. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/poetry/plugin.py +3 -2
  79. porringer-0.2.1.dev92/porringer/plugin/pyenv/__init__.py +4 -0
  80. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/pyenv/plugin.py +3 -2
  81. porringer-0.2.1.dev92/porringer/plugin/uv/__init__.py +4 -0
  82. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/uv/plugin.py +3 -2
  83. porringer-0.2.1.dev92/porringer/plugin/uv_project/__init__.py +4 -0
  84. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/uv_project/plugin.py +3 -2
  85. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/winget/__init__.py +2 -2
  86. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/winget/plugin.py +3 -2
  87. porringer-0.2.1.dev92/porringer/plugin/yarn_project/__init__.py +4 -0
  88. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/plugin/yarn_project/plugin.py +3 -2
  89. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/__init__.py +2 -2
  90. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/cache.py +3 -2
  91. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/check.py +5 -4
  92. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/download.py +3 -2
  93. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/execution.py +4 -3
  94. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/inspection.py +3 -2
  95. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/manifest.py +3 -2
  96. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/plugin.py +3 -2
  97. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/profile.py +4 -3
  98. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/project.py +3 -2
  99. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/snapshot.py +3 -2
  100. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/tool.py +3 -2
  101. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/mock/__init__.py +2 -2
  102. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/mock/environment.py +3 -2
  103. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/mock/plugin_manager.py +2 -2
  104. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/mock/project_environment.py +3 -2
  105. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/mock/scm.py +3 -2
  106. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/mock/subprocess.py +2 -2
  107. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/pytest/__init__.py +2 -2
  108. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/pytest/plugin.py +3 -2
  109. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/pytest/shared.py +3 -2
  110. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/pytest/tests.py +3 -2
  111. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/test/pytest/variants.py +3 -2
  112. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/utility/__init__.py +2 -2
  113. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/utility/download.py +7 -3
  114. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/utility/exception.py +7 -6
  115. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/utility/trace.py +4 -3
  116. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/utility/utility.py +21 -11
  117. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/pyproject.toml +1 -10
  118. porringer-0.2.1.dev92/tests/__init__.py +4 -0
  119. porringer-0.2.1.dev92/tests/fixtures/__init__.py +4 -0
  120. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/api.py +2 -2
  121. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/command_process.py +3 -3
  122. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/disposable_environment.py +3 -3
  123. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/factories.py +2 -2
  124. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/http.py +2 -2
  125. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/mock_plugins.py +2 -2
  126. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/packages.py +2 -2
  127. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/smoke_packages.py +1 -1
  128. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/strategies.py +2 -2
  129. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/fixtures/tool_smoke.py +3 -3
  130. porringer-0.2.1.dev92/tests/integration/__init__.py +4 -0
  131. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/integration/plugins/__init__.py +2 -2
  132. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/integration/plugins/winget/__init__.py +2 -2
  133. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/integration/plugins/winget/test_environment.py +3 -2
  134. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/integration/test_bootstrap_presence.py +2 -2
  135. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/integration/test_dry_run_acceptance.py +2 -2
  136. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/integration/test_example_bootstrap.py +2 -2
  137. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/integration/test_example_presence.py +2 -2
  138. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/integration/test_frozen_app_presence.py +2 -2
  139. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/integration/test_minimal_path.py +2 -2
  140. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/__init__.py +2 -2
  141. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/__init__.py +2 -2
  142. porringer-0.2.1.dev92/tests/unit/plugins/apt/__init__.py +4 -0
  143. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/apt/test_environment.py +3 -2
  144. porringer-0.2.1.dev92/tests/unit/plugins/brew/__init__.py +4 -0
  145. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/brew/test_environment.py +3 -2
  146. porringer-0.2.1.dev92/tests/unit/plugins/git/__init__.py +4 -0
  147. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/git/test_clone_detection.py +3 -2
  148. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/git/test_scm.py +3 -2
  149. porringer-0.2.1.dev92/tests/unit/plugins/npm/__init__.py +4 -0
  150. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/npm/test_environment.py +3 -2
  151. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/npm_project/__init__.py +3 -2
  152. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/npm_project/test_environment.py +3 -2
  153. porringer-0.2.1.dev92/tests/unit/plugins/pdm/__init__.py +4 -0
  154. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pdm/test_environment.py +3 -2
  155. porringer-0.2.1.dev92/tests/unit/plugins/pim/__init__.py +4 -0
  156. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pim/test_environment.py +3 -2
  157. porringer-0.2.1.dev92/tests/unit/plugins/pip/__init__.py +7 -0
  158. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pip/conftest.py +3 -2
  159. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pip/test_auxiliary_tools.py +3 -2
  160. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pip/test_environment.py +3 -2
  161. porringer-0.2.1.dev92/tests/unit/plugins/pipx/__init__.py +4 -0
  162. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pipx/test_environment.py +3 -2
  163. porringer-0.2.1.dev92/tests/unit/plugins/pnpm/__init__.py +4 -0
  164. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pnpm/test_environment.py +3 -2
  165. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pnpm_project/__init__.py +3 -2
  166. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pnpm_project/test_environment.py +3 -2
  167. porringer-0.2.1.dev92/tests/unit/plugins/poetry/__init__.py +4 -0
  168. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/poetry/test_environment.py +3 -2
  169. porringer-0.2.1.dev92/tests/unit/plugins/pyenv/__init__.py +4 -0
  170. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/pyenv/test_environment.py +3 -2
  171. porringer-0.2.1.dev92/tests/unit/plugins/uv/__init__.py +4 -0
  172. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/uv/test_environment.py +3 -2
  173. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/uv_project/__init__.py +3 -2
  174. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/uv_project/test_environment.py +3 -2
  175. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/yarn_project/__init__.py +3 -2
  176. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/plugins/yarn_project/test_environment.py +3 -2
  177. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_action_filtering.py +2 -2
  178. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_action_progress.py +4 -3
  179. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_backend_resolver.py +2 -2
  180. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_bootstrap_cross_platform.py +2 -2
  181. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_cache.py +3 -2
  182. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_check.py +3 -2
  183. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_check_updates.py +2 -2
  184. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_cli.py +3 -2
  185. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_command_plugin.py +3 -2
  186. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_command_self.py +3 -2
  187. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_concurrency_and_client.py +2 -2
  188. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_console_output.py +3 -2
  189. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_deferred_resolution.py +2 -2
  190. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_disposable_environment.py +3 -2
  191. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_downstream_api.py +3 -2
  192. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_event_loop_safety.py +2 -2
  193. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_extension_list.py +3 -2
  194. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_extras_introspection.py +2 -2
  195. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_frozen_app_detection.py +2 -2
  196. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_frozen_presence_resolution.py +2 -2
  197. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_hermeticity.py +2 -2
  198. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_install_cli.py +3 -2
  199. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_manifest_discovery.py +3 -2
  200. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_manifest_inspect.py +3 -2
  201. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_manifest_loading.py +11 -6
  202. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_manifest_schema.py +16 -21
  203. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_manifest_validation.py +3 -2
  204. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_output_schema_roundtrip.py +5 -3
  205. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_package_ref.py +3 -2
  206. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_package_ref_invariants.py +2 -2
  207. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_package_relation.py +3 -2
  208. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_path_sync.py +3 -2
  209. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_aux_and_errors.py +7 -6
  210. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_lifecycle.py +4 -4
  211. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_manager.py +3 -2
  212. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_manager_presence.py +3 -2
  213. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_manager_upgrade.py +6 -5
  214. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_runtime.py +3 -2
  215. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_tags.py +3 -2
  216. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_presence_detection.py +2 -2
  217. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_project_directory.py +5 -4
  218. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_project_root.py +2 -2
  219. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_run_command_progress.py +3 -2
  220. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_runtime_context_seeding.py +2 -2
  221. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_runtime_propagation.py +3 -2
  222. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_runtime_updates.py +3 -2
  223. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_smoke_packages.py +3 -2
  224. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_sub_action_progress.py +3 -2
  225. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_sync_inspection.py +3 -2
  226. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_target_resolution.py +3 -2
  227. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_trace.py +3 -2
  228. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_uninstall.py +2 -2
  229. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_update_detection.py +2 -2
  230. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_update_detection_resolution.py +2 -2
  231. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_update_detection_spec.py +3 -2
  232. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_upgrade.py +2 -2
  233. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/update_detection_helpers.py +3 -2
  234. porringer-0.2.1.dev91/porringer/console/command/__init__.py +0 -3
  235. porringer-0.2.1.dev91/porringer/plugin/__init__.py +0 -6
  236. porringer-0.2.1.dev91/porringer/plugin/apt/__init__.py +0 -3
  237. porringer-0.2.1.dev91/porringer/plugin/brew/__init__.py +0 -3
  238. porringer-0.2.1.dev91/porringer/plugin/git/__init__.py +0 -3
  239. porringer-0.2.1.dev91/porringer/plugin/npm/__init__.py +0 -3
  240. porringer-0.2.1.dev91/porringer/plugin/npm_project/__init__.py +0 -3
  241. porringer-0.2.1.dev91/porringer/plugin/pdm/__init__.py +0 -3
  242. porringer-0.2.1.dev91/porringer/plugin/pnpm/__init__.py +0 -3
  243. porringer-0.2.1.dev91/porringer/plugin/pnpm_project/__init__.py +0 -3
  244. porringer-0.2.1.dev91/porringer/plugin/poetry/__init__.py +0 -3
  245. porringer-0.2.1.dev91/porringer/plugin/pyenv/__init__.py +0 -3
  246. porringer-0.2.1.dev91/porringer/plugin/uv/__init__.py +0 -3
  247. porringer-0.2.1.dev91/porringer/plugin/uv_project/__init__.py +0 -3
  248. porringer-0.2.1.dev91/porringer/plugin/yarn_project/__init__.py +0 -3
  249. porringer-0.2.1.dev91/tests/__init__.py +0 -3
  250. porringer-0.2.1.dev91/tests/fixtures/__init__.py +0 -3
  251. porringer-0.2.1.dev91/tests/integration/__init__.py +0 -3
  252. porringer-0.2.1.dev91/tests/unit/plugins/apt/__init__.py +0 -3
  253. porringer-0.2.1.dev91/tests/unit/plugins/brew/__init__.py +0 -3
  254. porringer-0.2.1.dev91/tests/unit/plugins/git/__init__.py +0 -3
  255. porringer-0.2.1.dev91/tests/unit/plugins/npm/__init__.py +0 -3
  256. porringer-0.2.1.dev91/tests/unit/plugins/pdm/__init__.py +0 -3
  257. porringer-0.2.1.dev91/tests/unit/plugins/pim/__init__.py +0 -3
  258. porringer-0.2.1.dev91/tests/unit/plugins/pip/__init__.py +0 -7
  259. porringer-0.2.1.dev91/tests/unit/plugins/pipx/__init__.py +0 -3
  260. porringer-0.2.1.dev91/tests/unit/plugins/pnpm/__init__.py +0 -3
  261. porringer-0.2.1.dev91/tests/unit/plugins/poetry/__init__.py +0 -3
  262. porringer-0.2.1.dev91/tests/unit/plugins/pyenv/__init__.py +0 -3
  263. porringer-0.2.1.dev91/tests/unit/plugins/uv/__init__.py +0 -3
  264. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/LICENSE.md +0 -0
  265. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/README.md +0 -0
  266. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/backend/cache.py +0 -0
  267. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/console/schema.py +0 -0
  268. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/path.py +0 -0
  269. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/plugin_schema/runtime.py +0 -0
  270. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/core/target.py +0 -0
  271. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/py.typed +0 -0
  272. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/observability.py +0 -0
  273. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/schema/progress.py +0 -0
  274. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/utility/concurrency.py +0 -0
  275. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/utility/observability.py +0 -0
  276. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/utility/py.typed +0 -0
  277. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/porringer/utility/tool_environment.py +0 -0
  278. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/conftest.py +0 -0
  279. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_command_process.py +0 -0
  280. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_docs_contract.py +0 -0
  281. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_example_manifests.py +0 -0
  282. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_pipx_bootstrap_contract.py +0 -0
  283. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_commands.py +0 -0
  284. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_dry_run_no_subprocess.py +0 -0
  285. {porringer-0.2.1.dev91 → porringer-0.2.1.dev92}/tests/unit/test_plugin_protocol.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: porringer
3
- Version: 0.2.1.dev91
3
+ Version: 0.2.1.dev92
4
4
  Author-Email: Synodic Software <contact@synodic.software>
5
5
  License: MIT
6
6
  Project-URL: homepage, https://github.com/synodic/porringer
@@ -1,6 +1,6 @@
1
- """Public package exports."""
1
+ """Public package exports.
2
2
 
3
- """Public package entry points for Porringer.
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,7 @@
1
- """Helpers for api."""
1
+ """Helpers for api.
2
2
 
3
- """Public API surface for Porringer."""
3
+ Public API surface for Porringer.
4
+ """
4
5
 
5
6
  import asyncio
6
7
  import logging
@@ -1,6 +1,6 @@
1
- """Public package exports for the backend module."""
1
+ """Public package exports for the backend module.
2
2
 
3
- """Backend package for Porringer.
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
- """Backend resolution for mapping `(kind, ecosystem)` pairs to installer plugins.
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
- """Helpers for discovering and constructing plugins from entry points.
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
- """Command package for Porringer backend.
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,7 @@
1
- """CLI command implementation for client."""
1
+ """CLI command implementation for client.
2
2
 
3
- """Client-oriented aggregate commands."""
3
+ Client-oriented aggregate commands.
4
+ """
4
5
 
5
6
  import asyncio
6
7
 
@@ -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
- """Core backend command modules.
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
@@ -1,6 +1,6 @@
1
- """CLI command implementation for action builder."""
1
+ """CLI command implementation for action builder.
2
2
 
3
- """Action plan construction.
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
- """Plugin discovery helpers.
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
- """Phased execution engine.
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
- # Always observe output: build the CLI steps from the plugin and
1721
- # run them via run_command for line-by-line progress.
1722
- plan = type(proj_env).command_plan(effective_dir, runtime_context=runtime_context)
1723
- effective_dir = plan.directory
1724
- steps = plan.steps or ([plan.argv] if plan.argv else [])
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
- if success:
1740
- return SetupActionResult(
1741
- action=action,
1742
- success=True,
1743
- message=f'Synced project via {action.installer}',
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=False,
1748
- message=f'Project sync failed via {action.installer}',
1762
+ success=True,
1763
+ message=f'Synced project via {action.installer}',
1749
1764
  )
1750
- except Exception as e:
1751
- return SetupActionResult(action=action, success=False, message=str(e))
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
  # ---------------------------------------------------------------------------
@@ -1,6 +1,7 @@
1
- """CLI command implementation for inspection."""
1
+ """CLI command implementation for inspection.
2
2
 
3
- """Build structured inspection reports for manifest previews."""
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
- """Generalized phase abstraction for the execution pipeline.
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
- """Presence detection and action inspection.
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.
@@ -1,6 +1,6 @@
1
- """CLI command implementation for resolution."""
1
+ """CLI command implementation for resolution.
2
2
 
3
- """Unified operation resolution for inspection and real execution.
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], *, timeout: int) -> tuple[int | None, bytes, bytes] | None:
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=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'], timeout=5)
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(python: str, script: str, package_name: str, *, timeout: int = 10) -> bytes | None:
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], timeout=timeout)
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, timeout=15)
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
- """Manifest loading, parsing, and validation.
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
- """The package command module.
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
- """The plugin command module.
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
- timeout: int,
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
- timeout: Subprocess timeout in seconds.
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=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(name, args, verb='install', dry_run=True, timeout=120)
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(name, args, verb='install', dry_run=False, timeout=120)
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(name, args, verb='uninstall', dry_run=dry_run, timeout=60)
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(name, args, verb='upgrade', dry_run=dry_run, timeout=120)
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
- """Portable setup profile commands."""
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(url: str, *, timeout: int = 300, expected_hash: str | None = None) -> SetupProfile:
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=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(profile: SetupProfile, *, timeout: int = 300) -> tuple[Path, list[Path]]:
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=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
- """Project and cached-directory inspection commands."""
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
- """Utilities for managing and checking the Porringer installation version."""
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
- """The sync command module.
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,7 @@
1
- """CLI command implementation for tool."""
1
+ """CLI command implementation for tool.
2
2
 
3
- """Managed tool/package operations over cached manifests."""
3
+ Managed tool/package operations over cached manifests.
4
+ """
4
5
 
5
6
  from collections.abc import Callable
6
7
 
@@ -1,6 +1,7 @@
1
- """Backend helpers for resolver."""
1
+ """Backend helpers for resolver.
2
2
 
3
- """Resolves."""
3
+ Resolves.
4
+ """
4
5
 
5
6
  import logging
6
7
 
@@ -1,6 +1,7 @@
1
- """Backend helpers for schema."""
1
+ """Backend helpers for schema.
2
2
 
3
- """Backend schema."""
3
+ Backend schema.
4
+ """
4
5
 
5
6
  from pathlib import Path
6
7
 
@@ -1,6 +1,6 @@
1
- """Public package exports for the console module."""
1
+ """Public package exports for the console module.
2
2
 
3
- """Console package for Porringer.
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.
@@ -0,0 +1,4 @@
1
+ """Public package exports for the console.command module.
2
+
3
+ Commands for the Porringer console application.
4
+ """
@@ -1,6 +1,7 @@
1
- """CLI command implementation for cache."""
1
+ """CLI command implementation for cache.
2
2
 
3
- """Porringer CLI cache command module for managing manifest directories."""
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
- """Porringer CLI check command module for checking package updates via plugins."""
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
- """Porringer CLI download command module for downloading files."""
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 env."""
1
+ """CLI command implementation for env.
2
2
 
3
- """Porringer CLI environment diagnostics."""
3
+ Porringer CLI environment diagnostics.
4
+ """
4
5
 
5
6
  import asyncio
6
7
  import json
@@ -1,6 +1,7 @@
1
- """CLI command implementation for install."""
1
+ """CLI command implementation for install.
2
2
 
3
- """Porringer CLI install command."""
3
+ Porringer CLI install command.
4
+ """
4
5
 
5
6
  import asyncio
6
7
  from dataclasses import dataclass
@@ -1,6 +1,7 @@
1
- """CLI command implementation for open."""
1
+ """CLI command implementation for open.
2
2
 
3
- """Porringer CLI open command — the OS install-link handler entry point."""
3
+ Porringer CLI open command — the OS install-link handler entry point.
4
+ """
4
5
 
5
6
  from typing import Annotated
6
7