proj-flow 0.21.0__tar.gz → 0.22.0__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 (182) hide show
  1. {proj_flow-0.21.0 → proj_flow-0.22.0}/CHANGELOG.rst +14 -0
  2. {proj_flow-0.21.0 → proj_flow-0.22.0}/PKG-INFO +1 -1
  3. proj_flow-0.22.0/schema/test-runner.yaml +44 -0
  4. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/__init__.py +1 -1
  5. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/api/completers.py +1 -1
  6. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/api/env.py +37 -13
  7. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/api/release.py +1 -1
  8. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/api/step.py +7 -3
  9. proj_flow-0.21.0/src/proj_flow/ext/cplusplus/cmake/presets.py → proj_flow-0.22.0/src/proj_flow/base/cmake_presets.py +44 -24
  10. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/base/plugins.py +12 -7
  11. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/cli/finder.py +4 -3
  12. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/dependency.py +6 -2
  13. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/cplusplus/cmake/__init__.py +2 -2
  14. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/cplusplus/cmake/parser.py +4 -3
  15. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/cplusplus/cmake/steps.py +3 -9
  16. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/cplusplus/conan/__init__.py +6 -4
  17. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/github/publishing.py +1 -0
  18. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/python/rtdocs.py +2 -2
  19. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/python/steps.py +5 -4
  20. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/python/version.py +12 -12
  21. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/sign/__init__.py +2 -2
  22. proj_flow-0.22.0/src/proj_flow/ext/test_runner/__init__.py +6 -0
  23. proj_flow-0.22.0/src/proj_flow/ext/test_runner/cli.py +416 -0
  24. proj_flow-0.22.0/src/proj_flow/ext/test_runner/driver/commands.py +74 -0
  25. proj_flow-0.22.0/src/proj_flow/ext/test_runner/driver/test.py +610 -0
  26. proj_flow-0.22.0/src/proj_flow/ext/test_runner/driver/testbed.py +141 -0
  27. proj_flow-0.22.0/src/proj_flow/ext/test_runner/utils/archives.py +56 -0
  28. proj_flow-0.22.0/src/proj_flow/ext/webidl/base/__init__.py +2 -0
  29. proj_flow-0.22.0/src/proj_flow/ext/webidl/model/__init__.py +2 -0
  30. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/log/rich_text/api.py +3 -4
  31. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/minimal/run.py +3 -2
  32. {proj_flow-0.21.0 → proj_flow-0.22.0}/.flow/config.yaml +0 -0
  33. {proj_flow-0.21.0 → proj_flow-0.22.0}/.gitignore +0 -0
  34. {proj_flow-0.21.0 → proj_flow-0.22.0}/.readthedocs.yaml +0 -0
  35. {proj_flow-0.21.0 → proj_flow-0.22.0}/LICENSE +0 -0
  36. {proj_flow-0.21.0 → proj_flow-0.22.0}/README.md +0 -0
  37. {proj_flow-0.21.0 → proj_flow-0.22.0}/ROADMAP.md +0 -0
  38. {proj_flow-0.21.0 → proj_flow-0.22.0}/actions/bootstrap/action.yml +0 -0
  39. {proj_flow-0.21.0 → proj_flow-0.22.0}/actions/bootstrap/version.py +0 -0
  40. {proj_flow-0.21.0 → proj_flow-0.22.0}/pyproject.toml +0 -0
  41. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/__main__.py +0 -0
  42. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/api/__init__.py +0 -0
  43. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/api/arg.py +0 -0
  44. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/api/ctx.py +0 -0
  45. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/api/init.py +0 -0
  46. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/api/makefile.py +0 -0
  47. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/base/__cmake_version__.py +0 -0
  48. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/base/__init__.py +0 -0
  49. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/base/cmd.py +0 -0
  50. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/base/inspect.py +0 -0
  51. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/base/matrix.py +0 -0
  52. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/base/name_list.py +0 -0
  53. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/base/registry.py +0 -0
  54. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/base/uname.py +0 -0
  55. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/cli/__init__.py +0 -0
  56. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/cli/argument.py +0 -0
  57. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/__init__.py +0 -0
  58. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/cplusplus/__init__.py +0 -0
  59. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/cplusplus/cmake/project.py +0 -0
  60. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/cplusplus/conan/_conan.py +0 -0
  61. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/github/__init__.py +0 -0
  62. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/github/cli.py +0 -0
  63. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/github/hosting.py +0 -0
  64. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/github/switches.py +0 -0
  65. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/markdown_changelog.py +0 -0
  66. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/python/__init__.py +0 -0
  67. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/re_structured_changelog.py +0 -0
  68. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/sign/api.py +0 -0
  69. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/sign/win32.py +0 -0
  70. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/store.py +0 -0
  71. {proj_flow-0.21.0/src/proj_flow/ext/webidl/base → proj_flow-0.22.0/src/proj_flow/ext/test_runner/driver}/__init__.py +0 -0
  72. {proj_flow-0.21.0/src/proj_flow/ext/webidl/model → proj_flow-0.22.0/src/proj_flow/ext/test_runner/utils}/__init__.py +0 -0
  73. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/tools/__init__.py +0 -0
  74. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/tools/pragma_once.py +0 -0
  75. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/tools/run_linter.py +0 -0
  76. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/__init__.py +0 -0
  77. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/base/config.py +0 -0
  78. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/cli/__init__.py +0 -0
  79. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/cli/cmake.py +0 -0
  80. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/cli/depfile.py +0 -0
  81. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/cli/gen.py +0 -0
  82. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/cli/init.py +0 -0
  83. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/cli/root.py +0 -0
  84. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/cli/updater.py +0 -0
  85. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/data/init/flow_webidl.cmake +0 -0
  86. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/data/templates/cmake.mustache +0 -0
  87. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/data/templates/depfile.mustache +0 -0
  88. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/data/templates/partials/cxx/attribute-decl.mustache +0 -0
  89. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/data/templates/partials/cxx/in-out.mustache +0 -0
  90. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/data/templates/partials/cxx/includes.mustache +0 -0
  91. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/data/templates/partials/cxx/operation-decl.mustache +0 -0
  92. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/data/templates/partials/cxx/type.mustache +0 -0
  93. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/data/types/cxx.json +0 -0
  94. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/model/ast.py +0 -0
  95. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/model/builders.py +0 -0
  96. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/registry.py +0 -0
  97. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/flow/__init__.py +0 -0
  98. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/flow/configs.py +0 -0
  99. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/flow/layer.py +0 -0
  100. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/flow/steps.py +0 -0
  101. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/log/__init__.py +0 -0
  102. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/log/commit.py +0 -0
  103. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/log/error.py +0 -0
  104. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/log/fmt.py +0 -0
  105. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/log/format.py +0 -0
  106. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/log/hosting/__init__.py +0 -0
  107. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/log/hosting/github.py +0 -0
  108. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/log/msg.py +0 -0
  109. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/log/release.py +0 -0
  110. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/log/rich_text/__init__.py +0 -0
  111. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/log/rich_text/markdown.py +0 -0
  112. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/log/rich_text/re_structured_text.py +0 -0
  113. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/minimal/__init__.py +0 -0
  114. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/minimal/base.py +0 -0
  115. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/minimal/bootstrap.py +0 -0
  116. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/minimal/ext/bug_report.py +0 -0
  117. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/minimal/init.py +0 -0
  118. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/minimal/list.py +0 -0
  119. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/minimal/system.py +0 -0
  120. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/project/__init__.py +0 -0
  121. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/project/api.py +0 -0
  122. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/project/cplusplus/__init__.py +0 -0
  123. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/project/cplusplus/cmake_context.py +0 -0
  124. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/project/cplusplus/conan_context.py +0 -0
  125. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/project/cplusplus/project.py +0 -0
  126. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/project/data.py +0 -0
  127. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/project/interact.py +0 -0
  128. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/base/.clang-format +0 -0
  129. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/base/.flow/config.yml +0 -0
  130. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/base/.flow/flow.py.mustache +0 -0
  131. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/base/.flow/matrix.yml +0 -0
  132. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/base/.flow/official.yml +0 -0
  133. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/base/.gitignore +0 -0
  134. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/base/README.md.mustache +0 -0
  135. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/base/flow +0 -0
  136. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/base/flow.cmd +0 -0
  137. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/base.json +0 -0
  138. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/cmake/common.cmake.mustache +0 -0
  139. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/extensions/wall/__init__.py.mustache +0 -0
  140. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/extensions/wall/icons/__init__.py.mustache +0 -0
  141. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/extensions/wall/icons/magick.py.mustache +0 -0
  142. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/packages/base.cmake.mustache +0 -0
  143. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/packages/config.cmake +0 -0
  144. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/packages/cpack.cmake +0 -0
  145. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/packages/wix/cpack.cmake.mustache +0 -0
  146. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/packages/wix/patches.in.wix +0 -0
  147. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/packages/wix.cmake.mustache +0 -0
  148. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/CMakeGraphVizOptions.cmake +0 -0
  149. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/CMakeLists.txt.mustache +0 -0
  150. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/CMakePresets.json +0 -0
  151. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/data/assets/appicon.ico +0 -0
  152. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/data/assets/appicon.png +0 -0
  153. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/data/assets/wix_banner.bmp +0 -0
  154. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/data/assets/wix_dialog.bmp +0 -0
  155. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/data/icons/.gitignore +0 -0
  156. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/data/icons/appicon-mask.svg +0 -0
  157. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/data/icons/appicon.svg +0 -0
  158. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/src/main.cc.mustache +0 -0
  159. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/src/version.hpp.in.mustache +0 -0
  160. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/tests/test.cc.mustache +0 -0
  161. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake.json +0 -0
  162. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/conan/.flow/cmake/libcxx_toolchain.cmake +0 -0
  163. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/conan/.flow/cmake/output_dirs_setup.cmake +0 -0
  164. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/conan/conanfile.txt +0 -0
  165. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/conan.json +0 -0
  166. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_actions/.github/linters/.isort.cfg +0 -0
  167. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_actions/.github/linters/.mypy.ini +0 -0
  168. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_actions/.github/workflows/build.yml.auto-release +0 -0
  169. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_actions/.github/workflows/build.yml.basic +0 -0
  170. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_actions/.github/workflows/linter.yml +0 -0
  171. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_actions/CPPLINT.cfg +0 -0
  172. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_actions.json +0 -0
  173. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_social/.github/ISSUE_TEMPLATE/bug_report.md.mustache +0 -0
  174. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_social/.github/ISSUE_TEMPLATE/feature_request.md.mustache +0 -0
  175. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_social/CODE_OF_CONDUCT.md.mustache +0 -0
  176. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_social/CONTRIBUTING.md +0 -0
  177. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_social.json +0 -0
  178. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/licenses/0BSD.mustache +0 -0
  179. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/licenses/MIT.mustache +0 -0
  180. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/licenses/Unlicense.mustache +0 -0
  181. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/licenses/WTFPL.mustache +0 -0
  182. {proj_flow-0.21.0 → proj_flow-0.22.0}/src/proj_flow/template/licenses/Zlib.mustache +0 -0
@@ -4,6 +4,20 @@ Changelog
4
4
 
5
5
  All notable changes to this project will be documented in this file.
6
6
 
7
+ `0.22.0 <https://github.com/mzdun/proj-flow/compare/v0.21.0...v0.22.0>`_ (2026-02-03)
8
+ =====================================================================================
9
+
10
+ New Features
11
+ ------------
12
+
13
+ - get test-runner over from cov (`4829061 <https://github.com/mzdun/proj-flow/commit/4829061c153ea66b8c323766f82147d2e71ee5b7>`_)
14
+
15
+ Bug Fixes
16
+ ---------
17
+
18
+ - make CMake presets more accessible (`d78726f <https://github.com/mzdun/proj-flow/commit/d78726fd708804a04ee3170fa5e90e27a6fa3941>`_)
19
+ - move ``rt.root`` to ``Path`` (`fe6f3e7 <https://github.com/mzdun/proj-flow/commit/fe6f3e7b6968a01f847599e06c67bfeb463d7802>`_)
20
+
7
21
  `0.21.0 <https://github.com/mzdun/proj-flow/compare/v0.20.3...v0.21.0>`_ (2026-02-03)
8
22
  =====================================================================================
9
23
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: proj-flow
3
- Version: 0.21.0
3
+ Version: 0.22.0
4
4
  Summary: C++ project maintenance, automated
5
5
  Project-URL: Changelog, https://github.com/mzdun/proj-flow/blob/main/CHANGELOG.rst
6
6
  Project-URL: Documentation, https://proj-flow.readthedocs.io/en/latest/
@@ -0,0 +1,44 @@
1
+ $schema: http://json-schema.org/draft-04/schema#
2
+ type: object
3
+ required: [args, expected]
4
+ additionalProperties: false
5
+ default: {}
6
+
7
+ properties:
8
+ $schema: {type: string}
9
+ linear: {type: boolean}
10
+ disabled: {type: [boolean, string]}
11
+ lang: {type: string}
12
+ args: {type: string}
13
+ post: {type: [string, array], items: {type: string}}
14
+ expected:
15
+ type: ["null", array]
16
+ items:
17
+ - type: integer
18
+ - $ref: "#/$defs/lines"
19
+ - $ref: "#/$defs/lines"
20
+ check:
21
+ type: object
22
+ properties:
23
+ stdout: {$ref: "#/$defs/check"}
24
+ stderr: {$ref: "#/$defs/check"}
25
+ writes: {$ref: "#/$defs/dictionary"}
26
+ patches: {$ref: "#/$defs/dictionary"}
27
+ prepare: { $ref: "#/$defs/commands" }
28
+ cleanup: { $ref: "#/$defs/commands" }
29
+
30
+ $defs:
31
+ dictionary:
32
+ type: object
33
+ properties:
34
+ ^$: {not: {}}
35
+ ^.+$: {type: string}
36
+ lines:
37
+ type: [string, array]
38
+ items: string
39
+ commands:
40
+ type: array
41
+ items: string
42
+ check:
43
+ type: enum
44
+ enum: [begin, end, all]
@@ -6,4 +6,4 @@ The **proj_flow** contains only ``__version__`` to be updated, nothing more.
6
6
  This is in an attempt to make this module easy to load initially.
7
7
  """
8
8
 
9
- __version__ = "0.21.0"
9
+ __version__ = "0.22.0"
@@ -57,7 +57,7 @@ def _str_arg(arg: Union[bool, str]):
57
57
  def matrix_completer(prefix: str, parser, **kwargs):
58
58
  flow_cfg = cast(api.env.FlowConfig, parser.flow)
59
59
 
60
- matrix_yml = os.path.join(flow_cfg.root, ".flow", "matrix.yml")
60
+ matrix_yml = flow_cfg.root / ".flow" / "matrix.yml"
61
61
  with open(matrix_yml, "r", encoding="UTF-8") as contents:
62
62
  data: Dict[str, List[Any]] = yaml.load(contents, Loader=yaml.Loader).get(
63
63
  "matrix", {}
@@ -21,10 +21,12 @@ import subprocess
21
21
  import sys
22
22
  from dataclasses import dataclass
23
23
  from enum import Enum
24
+ from pathlib import Path
24
25
  from typing import Any, Callable, Dict, List, Optional, Union, cast
25
26
 
26
27
  from proj_flow.api import ctx
27
28
  from proj_flow.base import plugins, uname
29
+ from proj_flow.base.cmake_presets import get_binary_dirs
28
30
 
29
31
  platform = uname.uname()[0]
30
32
 
@@ -32,6 +34,25 @@ platform = uname.uname()[0]
32
34
  _flow_config_default_compiler: Optional[Dict[str, str]] = None
33
35
 
34
36
 
37
+ class CMakeBinaryDirsCache:
38
+ _dirs: dict[str, Path] | None = None
39
+ _loaded: bool = False
40
+
41
+ @property
42
+ def dirs(self):
43
+ if not self._loaded:
44
+ self._loaded = True
45
+ self._dirs = get_binary_dirs()
46
+
47
+ return self._dirs
48
+
49
+ def binary_dir(self, key: str):
50
+ return (self.dirs or {}).get(key)
51
+
52
+
53
+ CMAKE_BINARY_DIRS = CMakeBinaryDirsCache()
54
+
55
+
35
56
  def default_compiler():
36
57
  try:
37
58
  return os.environ["DEV_CXX"]
@@ -152,7 +173,7 @@ def _flatten_dict(dst: ctx.SettingsType, defaults: Dict[str, Any], prefix=""):
152
173
  dst[this_key] = str(val)
153
174
 
154
175
 
155
- def _merge(cfg: dict, defaults: ctx.SettingsType, path: str):
176
+ def _merge(cfg: dict, defaults: ctx.SettingsType, path: Path):
156
177
  config = plugins.load_data(path)
157
178
  if not isinstance(config, dict):
158
179
  return
@@ -189,25 +210,25 @@ class FlowConfig:
189
210
  _cfg: dict
190
211
  steps: list = []
191
212
  aliases: List[RunAlias] = []
192
- root: str
213
+ root: Path
193
214
 
194
- def __init__(self, cfg: Optional["FlowConfig"] = None, root: str = "."):
215
+ def __init__(self, cfg: Optional["FlowConfig"] = None, root: Path = Path()):
195
216
  if cfg is not None:
196
217
  self._cfg = cfg._cfg
197
218
  self.steps = cfg.steps
198
219
  self.aliases = cfg.aliases
199
220
  self.root = cfg.root
200
221
  else:
201
- self.root = os.path.abspath(root)
222
+ self.root = root.absolute()
202
223
  defaults: ctx.SettingsType = {}
203
224
  dest: dict = {}
204
225
 
205
226
  _merge(
206
227
  dest,
207
228
  defaults,
208
- os.path.join(os.path.expanduser("~"), ".config", "proj-flow.json"),
229
+ Path("~").expanduser() / ".config" / "proj-flow.json",
209
230
  )
210
- _merge(dest, defaults, os.path.join(self.root, ".flow", "config.json"))
231
+ _merge(dest, defaults, self.root / ".flow" / "config.json")
211
232
 
212
233
  self._cfg = dest
213
234
  self._cfg["defaults"] = defaults
@@ -223,11 +244,9 @@ class FlowConfig:
223
244
  extensions = cast(List[str], self._cfg.get("extensions", []))
224
245
  extensions.insert(0, "proj_flow.minimal")
225
246
 
226
- local_extensions = os.path.abspath(
227
- os.path.join(self.root, ".flow", "extensions")
228
- )
229
- if os.path.isdir(local_extensions):
230
- sys.path.insert(0, local_extensions)
247
+ local_extensions = (self.root / ".flow" / "extensions").resolve()
248
+ if local_extensions.is_dir():
249
+ sys.path.insert(0, local_extensions.as_posix())
231
250
 
232
251
  load_extensions(extensions)
233
252
 
@@ -465,8 +484,13 @@ class Config:
465
484
  return self.items.get("build_name", "")
466
485
 
467
486
  @property
468
- def build_dir(self) -> str:
469
- return os.path.join("build", self.preset)
487
+ def build_dir(self) -> Path:
488
+ cmake_binary_dir = CMAKE_BINARY_DIRS.binary_dir(
489
+ f"{self.preset}-{self.build_generator}"
490
+ )
491
+ if cmake_binary_dir:
492
+ return cmake_binary_dir
493
+ return Path("build") / self.preset
470
494
 
471
495
  @property
472
496
  def preset(self) -> str:
@@ -113,5 +113,5 @@ def get_project(rt: env.Runtime):
113
113
 
114
114
  _, project = project_suites.find(wrap)
115
115
  if project is None:
116
- rt.fatal(f"Cannot get project information from {rt.root}")
116
+ rt.fatal(f"Cannot get project information from {rt.root.as_posix()}")
117
117
  return project
@@ -7,6 +7,7 @@ The **proj_flow.api.step** exposes APIs used by run extensions.
7
7
 
8
8
  import os
9
9
  from abc import ABC, abstractmethod
10
+ from pathlib import Path
10
11
  from typing import List, cast
11
12
 
12
13
  from proj_flow.api.env import Config, Runtime
@@ -34,7 +35,7 @@ class Step(ABC):
34
35
  def is_active(self, config: Config, rt: Runtime) -> bool:
35
36
  return True
36
37
 
37
- def directories_to_remove(self, config: Config) -> List[str]:
38
+ def directories_to_remove(self, config: Config) -> List[Path]:
38
39
  return []
39
40
 
40
41
  @abstractmethod
@@ -59,7 +60,7 @@ class SerialStep(Step):
59
60
  return False
60
61
  return True
61
62
 
62
- def directories_to_remove(self, config: Config) -> List[str]:
63
+ def directories_to_remove(self, config: Config) -> List[Path]:
63
64
  return matrix.flatten(
64
65
  [child.directories_to_remove(config) for child in self.children]
65
66
  )
@@ -162,7 +163,10 @@ def _extend_docstring(conv, step: Step):
162
163
  _name_list("Requires", step.platform_dependencies(), template="``{}``"),
163
164
  _name_list(
164
165
  "Removes",
165
- step.directories_to_remove(_dummy_config),
166
+ [
167
+ dirname.as_posix()
168
+ for dirname in step.directories_to_remove(_dummy_config)
169
+ ],
166
170
  template="``{}``",
167
171
  ),
168
172
  )
@@ -2,7 +2,7 @@
2
2
  # This code is licensed under MIT license (see LICENSE for details)
3
3
 
4
4
  """
5
- The **proj_flow.ext.cplusplus.cmake.presets** check build directories for CMake step.
5
+ The **proj_flow.project.cplusplus.cmake_presets** check build directories for CMake step.
6
6
  """
7
7
 
8
8
  import json
@@ -11,7 +11,7 @@ import platform
11
11
  from dataclasses import dataclass
12
12
  from enum import Enum
13
13
  from pathlib import Path
14
- from typing import cast
14
+ from typing import Callable, TypeVar, cast
15
15
 
16
16
 
17
17
  class MacroType(Enum):
@@ -40,6 +40,7 @@ MACROS: dict[str, Path | str | MacroType] = {
40
40
  class Preset:
41
41
  name: str
42
42
  binary_dir: str | None
43
+ build_type: str | None
43
44
  generator: str | None
44
45
  inherits: list[str]
45
46
  file_dir: Path
@@ -82,12 +83,15 @@ class Presets:
82
83
  if dirname is None:
83
84
  return self.result
84
85
 
85
- includes, presets = Presets.__load_file(filename)
86
- self.__visit_includes(dirname, includes)
87
- for preset in presets:
88
- self.__visit_preset(dirname, preset)
89
- for preset in self.result.values():
90
- self.__merge_preset(preset)
86
+ try:
87
+ includes, presets = Presets.__load_file(filename)
88
+ self.__visit_includes(dirname, includes)
89
+ for preset in presets:
90
+ self.__visit_preset(dirname, preset)
91
+ for preset in self.result.values():
92
+ self.__merge_preset(preset)
93
+ except FileNotFoundError:
94
+ return None
91
95
 
92
96
  return self.result
93
97
 
@@ -109,9 +113,12 @@ class Presets:
109
113
  binary_dir = cast(str | None, preset.get("binaryDir"))
110
114
  generator = cast(str | None, preset.get("generator"))
111
115
  inherits = cast(list[str], preset.get("inherits", []))
116
+ cache = cast(dict, preset.get("cacheVariables", {}))
117
+ build_type = cast(str | None, cache.get("CMAKE_BUILD_TYPE"))
112
118
  self.result[name] = Preset(
113
119
  name=name,
114
120
  binary_dir=binary_dir,
121
+ build_type=build_type,
115
122
  generator=generator,
116
123
  inherits=inherits,
117
124
  file_dir=dirname,
@@ -132,33 +139,46 @@ class Presets:
132
139
  preset.binary_dir = parent_preset.binary_dir
133
140
  if parent_preset.generator and not preset.generator:
134
141
  preset.generator = parent_preset.generator
142
+ if parent_preset.build_type and not preset.build_type:
143
+ preset.build_type = parent_preset.build_type
135
144
 
136
145
  @staticmethod
137
146
  def __load_file(filename: Path):
138
- try:
139
- with open(filename, encoding="UTF-8") as f:
140
- data = json.load(f)
141
- includes = cast(list[str], data.get("include", []))
142
- presets = cast(list[dict], data.get("configurePresets", []))
143
- except FileNotFoundError:
144
- includes: list[str] = []
145
- presets: list[dict] = []
147
+ with open(filename, encoding="UTF-8") as f:
148
+ data = json.load(f)
149
+ includes = cast(list[str], data.get("include", []))
150
+ presets = cast(list[dict], data.get("configurePresets", []))
146
151
 
147
152
  return (includes, presets)
148
153
 
149
154
 
155
+ def binary_dir_from_preset(preset: Preset, cwd: Path):
156
+ path = preset.expand()
157
+ if not path:
158
+ return None
159
+ if path.is_relative_to(cwd):
160
+ path = path.relative_to(cwd)
161
+ return path
162
+
163
+
150
164
  def get_binary_dirs():
165
+ return visit_presets(binary_dir_from_preset)
166
+
167
+
168
+ T = TypeVar("T")
169
+
170
+
171
+ def visit_presets(mapper: Callable[[Preset, Path], T | None]):
151
172
  presets = Presets().visit_file(Path("CMakePresets.json"))
173
+ if presets is None:
174
+ return None
152
175
 
153
- cwd = str(Path.cwd().as_posix()) + "/"
154
- result: dict[str, str] = {}
176
+ cwd = Path.cwd()
177
+ result: dict[str, T] = {}
155
178
  for preset in presets.values():
156
- dirname = preset.expand()
157
- if dirname is None:
179
+ mapped = mapper(preset, cwd)
180
+ if mapped is None:
158
181
  continue
159
- rel = str(dirname.as_posix())
160
- if rel[: len(cwd)] == cwd:
161
- rel = rel[len(cwd) :]
162
- result[preset.name] = rel
182
+ result[preset.name] = mapped
163
183
 
164
184
  return result
@@ -6,18 +6,23 @@ The **proj_flow.base.plugins** provide the plugin enumeration helpers.
6
6
  """
7
7
 
8
8
  import json
9
- import os
9
+ from pathlib import Path
10
10
  from typing import cast
11
11
 
12
12
  import yaml
13
13
 
14
+ try:
15
+ from yaml import CLoader as Loader
16
+ except ImportError:
17
+ from yaml import Loader
14
18
 
15
- def load_yaml(filename: str):
19
+
20
+ def load_yaml(filename: Path):
16
21
  with open(filename) as src:
17
- return cast(dict, yaml.load(src, Loader=yaml.Loader))
22
+ return cast(dict, yaml.load(src, Loader=Loader))
18
23
 
19
24
 
20
- def load_json(filename: str):
25
+ def load_json(filename: Path):
21
26
  with open(filename) as src:
22
27
  return cast(dict, json.load(src))
23
28
 
@@ -29,8 +34,8 @@ LOADERS = {
29
34
  }
30
35
 
31
36
 
32
- def load_data(filename: str):
33
- prefix, ext = os.path.splitext(filename)
37
+ def load_data(filename: Path):
38
+ ext = filename.suffix
34
39
  loader = LOADERS.get(ext.lower())
35
40
  if loader:
36
41
  try:
@@ -39,7 +44,7 @@ def load_data(filename: str):
39
44
  pass
40
45
 
41
46
  for new_ext, loader in LOADERS.items():
42
- new_filename = prefix + new_ext
47
+ new_filename = filename.with_suffix(new_ext)
43
48
  try:
44
49
  return loader(new_filename)
45
50
  except Exception:
@@ -9,6 +9,7 @@ contains ``-C`` argument.
9
9
 
10
10
  import os
11
11
  import shlex
12
+ from pathlib import Path
12
13
  from typing import List
13
14
 
14
15
  from argcomplete import finders
@@ -43,7 +44,7 @@ class CompletionFinder(finders.CompletionFinder):
43
44
 
44
45
  def find_project(self):
45
46
  if not self.active():
46
- return "."
47
+ return Path()
47
48
 
48
49
  comp_line = os.environ["COMP_LINE"]
49
50
  comp_point = int(os.environ["COMP_POINT"])
@@ -51,9 +52,9 @@ class CompletionFinder(finders.CompletionFinder):
51
52
  pos = find_dash_see(args)
52
53
 
53
54
  if pos < 0:
54
- return "."
55
+ return Path()
55
56
 
56
- return args[pos]
57
+ return Path(args[pos])
57
58
 
58
59
 
59
60
  autocomplete = CompletionFinder()
@@ -57,14 +57,18 @@ class Dependency:
57
57
  version_expression: str
58
58
  kind: DepKind = DepKind.APP
59
59
 
60
- def __lt__(self, rhs: "Dependency"):
60
+ def __lt__(self, rhs: object):
61
+ if not isinstance(rhs, Dependency):
62
+ return False
61
63
  if self.kind != rhs.kind:
62
64
  return self.kind.value < rhs.kind.value
63
65
  if self.name != rhs.name:
64
66
  return self.name < rhs.name
65
67
  return self.version_expression < rhs.version_expression
66
68
 
67
- def __eq__(self, rhs: "Dependency"):
69
+ def __eq__(self, rhs: object):
70
+ if not isinstance(rhs, Dependency):
71
+ return False
68
72
  return (
69
73
  self.kind == rhs.kind
70
74
  and self.name == rhs.name
@@ -7,6 +7,6 @@ The **proj_flow.ext.cplusplus.cmake** provides ``"CMake"``, ``"Build"``,
7
7
  context.
8
8
  """
9
9
 
10
- from . import parser, presets, project, steps
10
+ from . import parser, project, steps
11
11
 
12
- __all__ = ["parser", "presets", "project", "steps"]
12
+ __all__ = ["parser", "project", "steps"]
@@ -7,6 +7,7 @@ The **proj_flow.ext.cplusplus.cmake.parser** contains simple CMake parser.
7
7
 
8
8
  import os
9
9
  import re
10
+ from pathlib import Path
10
11
  from typing import Iterator, List, NamedTuple, Optional
11
12
 
12
13
  from proj_flow.api.release import NO_ARG, Arg
@@ -76,7 +77,7 @@ def _command(cmd: Token, stream: Iterator[Token]):
76
77
  return result
77
78
 
78
79
 
79
- def _cmake(filename: str):
80
+ def _cmake(filename: Path):
80
81
  commands: List[Command] = []
81
82
 
82
83
  with open(filename, "r", encoding="UTF-8") as f:
@@ -102,9 +103,9 @@ def _patch(directory: str, arg: Arg, value: str):
102
103
  input.write(patched)
103
104
 
104
105
 
105
- def get_project(dirname: str) -> Optional[CMakeProject]:
106
+ def get_project(dirname: Path) -> Optional[CMakeProject]:
106
107
  try:
107
- commands = _cmake(os.path.join(dirname, "CMakeLists.txt"))
108
+ commands = _cmake(dirname / "CMakeLists.txt")
108
109
  except FileNotFoundError:
109
110
  return None
110
111
 
@@ -7,12 +7,12 @@ building and archiving.
7
7
  """
8
8
 
9
9
  import os
10
+ from pathlib import Path
10
11
  from typing import Dict, List, cast
11
12
 
12
13
  from proj_flow import api
13
14
  from proj_flow.api import env, step
14
15
  from proj_flow.base.__cmake_version__ import CMAKE_VERSION
15
- from proj_flow.ext.cplusplus.cmake.presets import get_binary_dirs
16
16
 
17
17
 
18
18
  class CMakeBase(api.step.Step):
@@ -60,18 +60,12 @@ class CMakeConfig(CMakeBase):
60
60
 
61
61
  def __init__(self):
62
62
  super().__init__(name="CMake")
63
- self.binary_dirs = get_binary_dirs()
64
63
 
65
64
  def is_active(self, config: env.Config, rt: env.Runtime) -> bool:
66
65
  return os.path.isfile("CMakeLists.txt") and os.path.isfile("CMakePresets.json")
67
66
 
68
- def directories_to_remove(self, config: env.Config) -> List[str]:
69
- binary_dir = self.binary_dirs.get(f"{config.preset}-{config.build_generator}")
70
- if not binary_dir:
71
- if "READTHEDOCS" not in os.environ:
72
- return []
73
- return [f"build/{config.preset}"]
74
- return [binary_dir]
67
+ def directories_to_remove(self, config: env.Config) -> List[Path]:
68
+ return [config.build_dir]
75
69
 
76
70
  def run(self, config: env.Config, rt: env.Runtime) -> int:
77
71
  cmake_vars = cast(Dict[str, str], rt._cfg.get("cmake", {}).get("vars", {}))
@@ -7,6 +7,7 @@ The **proj_flow.ext.cplusplus.conan** provides the ``"Conan"`` step.
7
7
 
8
8
  import os
9
9
  import textwrap
10
+ from pathlib import Path
10
11
  from typing import List
11
12
 
12
13
  from proj_flow.api import env, step
@@ -14,7 +15,7 @@ from proj_flow.project import cplusplus
14
15
 
15
16
  from ._conan import conan_api
16
17
 
17
- CONAN_DIR = "build/conan"
18
+ CONAN_DIR = Path("build/conan")
18
19
  CONAN_PROFILE = "_profile-compiler"
19
20
  CONAN_PROFILE_GEN = "_profile-build_type"
20
21
 
@@ -34,13 +35,13 @@ class ConanConfig:
34
35
  def is_active(self, config: env.Config, rt: env.Runtime) -> int:
35
36
  return os.path.isfile("conanfile.txt") or os.path.isfile("conanfile.py")
36
37
 
37
- def directories_to_remove(self, _: env.Config) -> List[str]:
38
+ def directories_to_remove(self, _: env.Config) -> List[Path]:
38
39
  return [CONAN_DIR]
39
40
 
40
41
  def run(self, config: env.Config, rt: env.Runtime) -> int:
41
42
  api = conan_api()
42
43
 
43
- profile_gen = f"{CONAN_DIR}/{CONAN_PROFILE_GEN}-{config.preset}"
44
+ profile_gen = f"{CONAN_DIR.as_posix()}/{CONAN_PROFILE_GEN}-{config.preset}"
44
45
  if not rt.dry_run:
45
46
  os.makedirs(CONAN_DIR, exist_ok=True)
46
47
  with open(profile_gen, "w", encoding="UTF-8") as profile:
@@ -60,7 +61,8 @@ class ConanConfig:
60
61
  ]:
61
62
  print(setting, file=profile)
62
63
 
63
- if api.config(rt, CONAN_DIR, f"./{CONAN_DIR}/{CONAN_PROFILE}", profile_gen):
64
+ conan_dir = CONAN_DIR.as_posix()
65
+ if api.config(rt, conan_dir, f"./{conan_dir}/{CONAN_PROFILE}", profile_gen):
64
66
  return 1
65
67
  if not rt.dry_run and os.path.exists("CMakeUserPresets.json"):
66
68
  os.remove("CMakeUserPresets.json")
@@ -31,6 +31,7 @@ def build_regex(project: release.Project):
31
31
 
32
32
 
33
33
  def gather_artifacts(directory: str, matcher: re.Pattern):
34
+ names: list[str] = []
34
35
  if os.path.isdir(directory):
35
36
  for _, dirnames, filenames in os.walk(directory):
36
37
  dirnames[:] = []
@@ -30,14 +30,14 @@ class RTDocs:
30
30
  return ["python -m PyYAML"]
31
31
 
32
32
  def is_active(self, config: env.Config, rt: env.Runtime) -> bool:
33
- return os.path.isfile(os.path.join(rt.root, ".readthedocs.yaml"))
33
+ return (rt.root / ".readthedocs.yaml").is_file()
34
34
 
35
35
  def run(self, config: env.Config, rt: env.Runtime) -> int:
36
36
  import venv
37
37
 
38
38
  import yaml
39
39
 
40
- with open(os.path.join(rt.root, ".readthedocs.yaml")) as rtd_yaml:
40
+ with open(rt.root / ".readthedocs.yaml") as rtd_yaml:
41
41
  data = yaml.load(rtd_yaml, Loader=yaml.Loader)
42
42
 
43
43
  formats = ["html"]
@@ -22,7 +22,7 @@ class Install:
22
22
  return ["python -m pip"]
23
23
 
24
24
  def run(self, config: env.Config, rt: env.Runtime) -> int:
25
- return rt.cmd("python", "-m", "pip", "install", rt.root)
25
+ return rt.cmd("python", "-m", "pip", "install", rt.root.as_posix())
26
26
 
27
27
 
28
28
  @step.register
@@ -48,8 +48,9 @@ class CheckTwine:
48
48
  return ["twine"]
49
49
 
50
50
  def run(self, config: env.Config, rt: env.Runtime) -> int:
51
- filenames = []
52
- for root, dirnames, filenames in os.walk("dist"):
51
+ filenames: list[str] = []
52
+ root = rt.root / "dist"
53
+ for root, dirnames, filenames in root.walk():
53
54
  dirnames[:] = []
54
55
 
55
56
  _, project = release.project_suites.find(lambda suite: suite.get_project(rt))
@@ -67,5 +68,5 @@ class CheckTwine:
67
68
  return 0
68
69
 
69
70
  return rt.cmd(
70
- "twine", "check", *(os.path.join(root, filename) for filename in filenames)
71
+ "twine", "check", *((root / filename).as_posix() for filename in filenames)
71
72
  )