proj-flow 0.20.3__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.20.3 → proj_flow-0.22.0}/CHANGELOG.rst +28 -0
  2. {proj_flow-0.20.3 → proj_flow-0.22.0}/PKG-INFO +17 -7
  3. {proj_flow-0.20.3 → proj_flow-0.22.0}/pyproject.toml +25 -6
  4. proj_flow-0.22.0/schema/test-runner.yaml +44 -0
  5. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/__init__.py +1 -1
  6. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/api/arg.py +2 -0
  7. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/api/completers.py +1 -1
  8. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/api/env.py +45 -15
  9. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/api/release.py +1 -1
  10. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/api/step.py +20 -5
  11. proj_flow-0.20.3/src/proj_flow/ext/cplusplus/cmake/presets.py → proj_flow-0.22.0/src/proj_flow/base/cmake_presets.py +40 -16
  12. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/base/plugins.py +12 -7
  13. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/cli/finder.py +4 -3
  14. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/dependency.py +6 -2
  15. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/cplusplus/cmake/__init__.py +2 -2
  16. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/cplusplus/cmake/parser.py +4 -3
  17. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/cplusplus/cmake/steps.py +9 -9
  18. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/cplusplus/conan/__init__.py +8 -4
  19. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/github/cli.py +1 -3
  20. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/github/publishing.py +1 -0
  21. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/python/rtdocs.py +37 -8
  22. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/python/steps.py +5 -4
  23. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/python/version.py +12 -12
  24. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/sign/__init__.py +2 -2
  25. proj_flow-0.22.0/src/proj_flow/ext/test_runner/__init__.py +6 -0
  26. proj_flow-0.22.0/src/proj_flow/ext/test_runner/cli.py +416 -0
  27. proj_flow-0.22.0/src/proj_flow/ext/test_runner/driver/commands.py +74 -0
  28. proj_flow-0.22.0/src/proj_flow/ext/test_runner/driver/test.py +610 -0
  29. proj_flow-0.22.0/src/proj_flow/ext/test_runner/driver/testbed.py +141 -0
  30. proj_flow-0.22.0/src/proj_flow/ext/test_runner/utils/archives.py +56 -0
  31. proj_flow-0.22.0/src/proj_flow/ext/webidl/base/__init__.py +2 -0
  32. proj_flow-0.22.0/src/proj_flow/ext/webidl/model/__init__.py +2 -0
  33. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/log/rich_text/api.py +3 -4
  34. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/minimal/list.py +126 -10
  35. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/minimal/run.py +3 -2
  36. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/project/api.py +1 -0
  37. {proj_flow-0.20.3 → proj_flow-0.22.0}/.flow/config.yaml +0 -0
  38. {proj_flow-0.20.3 → proj_flow-0.22.0}/.gitignore +0 -0
  39. {proj_flow-0.20.3 → proj_flow-0.22.0}/.readthedocs.yaml +0 -0
  40. {proj_flow-0.20.3 → proj_flow-0.22.0}/LICENSE +0 -0
  41. {proj_flow-0.20.3 → proj_flow-0.22.0}/README.md +0 -0
  42. {proj_flow-0.20.3 → proj_flow-0.22.0}/ROADMAP.md +0 -0
  43. {proj_flow-0.20.3 → proj_flow-0.22.0}/actions/bootstrap/action.yml +0 -0
  44. {proj_flow-0.20.3 → proj_flow-0.22.0}/actions/bootstrap/version.py +0 -0
  45. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/__main__.py +0 -0
  46. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/api/__init__.py +0 -0
  47. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/api/ctx.py +0 -0
  48. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/api/init.py +0 -0
  49. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/api/makefile.py +0 -0
  50. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/base/__cmake_version__.py +0 -0
  51. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/base/__init__.py +0 -0
  52. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/base/cmd.py +0 -0
  53. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/base/inspect.py +0 -0
  54. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/base/matrix.py +0 -0
  55. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/base/name_list.py +0 -0
  56. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/base/registry.py +0 -0
  57. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/base/uname.py +0 -0
  58. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/cli/__init__.py +0 -0
  59. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/cli/argument.py +0 -0
  60. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/__init__.py +0 -0
  61. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/cplusplus/__init__.py +0 -0
  62. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/cplusplus/cmake/project.py +0 -0
  63. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/cplusplus/conan/_conan.py +0 -0
  64. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/github/__init__.py +0 -0
  65. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/github/hosting.py +0 -0
  66. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/github/switches.py +0 -0
  67. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/markdown_changelog.py +0 -0
  68. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/python/__init__.py +0 -0
  69. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/re_structured_changelog.py +0 -0
  70. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/sign/api.py +0 -0
  71. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/sign/win32.py +0 -0
  72. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/store.py +0 -0
  73. {proj_flow-0.20.3/src/proj_flow/ext/webidl/base → proj_flow-0.22.0/src/proj_flow/ext/test_runner/driver}/__init__.py +0 -0
  74. {proj_flow-0.20.3/src/proj_flow/ext/webidl/model → proj_flow-0.22.0/src/proj_flow/ext/test_runner/utils}/__init__.py +0 -0
  75. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/tools/__init__.py +0 -0
  76. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/tools/pragma_once.py +0 -0
  77. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/tools/run_linter.py +0 -0
  78. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/__init__.py +0 -0
  79. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/base/config.py +0 -0
  80. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/cli/__init__.py +0 -0
  81. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/cli/cmake.py +0 -0
  82. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/cli/depfile.py +0 -0
  83. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/cli/gen.py +0 -0
  84. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/cli/init.py +0 -0
  85. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/cli/root.py +0 -0
  86. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/cli/updater.py +0 -0
  87. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/data/init/flow_webidl.cmake +0 -0
  88. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/data/templates/cmake.mustache +0 -0
  89. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/data/templates/depfile.mustache +0 -0
  90. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/data/templates/partials/cxx/attribute-decl.mustache +0 -0
  91. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/data/templates/partials/cxx/in-out.mustache +0 -0
  92. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/data/templates/partials/cxx/includes.mustache +0 -0
  93. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/data/templates/partials/cxx/operation-decl.mustache +0 -0
  94. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/data/templates/partials/cxx/type.mustache +0 -0
  95. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/data/types/cxx.json +0 -0
  96. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/model/ast.py +0 -0
  97. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/model/builders.py +0 -0
  98. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/ext/webidl/registry.py +0 -0
  99. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/flow/__init__.py +0 -0
  100. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/flow/configs.py +0 -0
  101. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/flow/layer.py +0 -0
  102. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/flow/steps.py +0 -0
  103. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/log/__init__.py +0 -0
  104. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/log/commit.py +0 -0
  105. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/log/error.py +0 -0
  106. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/log/fmt.py +0 -0
  107. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/log/format.py +0 -0
  108. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/log/hosting/__init__.py +0 -0
  109. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/log/hosting/github.py +0 -0
  110. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/log/msg.py +0 -0
  111. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/log/release.py +0 -0
  112. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/log/rich_text/__init__.py +0 -0
  113. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/log/rich_text/markdown.py +0 -0
  114. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/log/rich_text/re_structured_text.py +0 -0
  115. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/minimal/__init__.py +0 -0
  116. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/minimal/base.py +0 -0
  117. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/minimal/bootstrap.py +0 -0
  118. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/minimal/ext/bug_report.py +0 -0
  119. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/minimal/init.py +0 -0
  120. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/minimal/system.py +0 -0
  121. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/project/__init__.py +0 -0
  122. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/project/cplusplus/__init__.py +0 -0
  123. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/project/cplusplus/cmake_context.py +0 -0
  124. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/project/cplusplus/conan_context.py +0 -0
  125. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/project/cplusplus/project.py +0 -0
  126. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/project/data.py +0 -0
  127. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/project/interact.py +0 -0
  128. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/base/.clang-format +0 -0
  129. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/base/.flow/config.yml +0 -0
  130. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/base/.flow/flow.py.mustache +0 -0
  131. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/base/.flow/matrix.yml +0 -0
  132. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/base/.flow/official.yml +0 -0
  133. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/base/.gitignore +0 -0
  134. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/base/README.md.mustache +0 -0
  135. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/base/flow +0 -0
  136. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/base/flow.cmd +0 -0
  137. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/base.json +0 -0
  138. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/cmake/common.cmake.mustache +0 -0
  139. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/extensions/wall/__init__.py.mustache +0 -0
  140. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/extensions/wall/icons/__init__.py.mustache +0 -0
  141. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/extensions/wall/icons/magick.py.mustache +0 -0
  142. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/packages/base.cmake.mustache +0 -0
  143. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/packages/config.cmake +0 -0
  144. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/packages/cpack.cmake +0 -0
  145. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/packages/wix/cpack.cmake.mustache +0 -0
  146. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/packages/wix/patches.in.wix +0 -0
  147. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/.flow/packages/wix.cmake.mustache +0 -0
  148. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/CMakeGraphVizOptions.cmake +0 -0
  149. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/CMakeLists.txt.mustache +0 -0
  150. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/CMakePresets.json +0 -0
  151. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/data/assets/appicon.ico +0 -0
  152. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/data/assets/appicon.png +0 -0
  153. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/data/assets/wix_banner.bmp +0 -0
  154. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/data/assets/wix_dialog.bmp +0 -0
  155. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/data/icons/.gitignore +0 -0
  156. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/data/icons/appicon-mask.svg +0 -0
  157. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/data/icons/appicon.svg +0 -0
  158. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/src/main.cc.mustache +0 -0
  159. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/src/version.hpp.in.mustache +0 -0
  160. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake/tests/test.cc.mustache +0 -0
  161. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/cmake.json +0 -0
  162. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/conan/.flow/cmake/libcxx_toolchain.cmake +0 -0
  163. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/conan/.flow/cmake/output_dirs_setup.cmake +0 -0
  164. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/conan/conanfile.txt +0 -0
  165. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/conan.json +0 -0
  166. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_actions/.github/linters/.isort.cfg +0 -0
  167. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_actions/.github/linters/.mypy.ini +0 -0
  168. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_actions/.github/workflows/build.yml.auto-release +0 -0
  169. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_actions/.github/workflows/build.yml.basic +0 -0
  170. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_actions/.github/workflows/linter.yml +0 -0
  171. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_actions/CPPLINT.cfg +0 -0
  172. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_actions.json +0 -0
  173. {proj_flow-0.20.3 → 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.20.3 → 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.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_social/CODE_OF_CONDUCT.md.mustache +0 -0
  176. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_social/CONTRIBUTING.md +0 -0
  177. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/layers/github_social.json +0 -0
  178. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/licenses/0BSD.mustache +0 -0
  179. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/licenses/MIT.mustache +0 -0
  180. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/licenses/Unlicense.mustache +0 -0
  181. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/licenses/WTFPL.mustache +0 -0
  182. {proj_flow-0.20.3 → proj_flow-0.22.0}/src/proj_flow/template/licenses/Zlib.mustache +0 -0
@@ -4,6 +4,34 @@ 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
+
21
+ `0.21.0 <https://github.com/mzdun/proj-flow/compare/v0.20.3...v0.21.0>`_ (2026-02-03)
22
+ =====================================================================================
23
+
24
+ New Features
25
+ ------------
26
+
27
+ - recursively list known commands (`991b120 <https://github.com/mzdun/proj-flow/commit/991b120df9da90fee9047d440c2d0cc133ce740c>`_)
28
+ - **list**: wrap cmd help around terminal width (`64bd30c <https://github.com/mzdun/proj-flow/commit/64bd30cfd3c05da92be705a436f5d9cfcad14630>`_)
29
+
30
+ Bug Fixes
31
+ ---------
32
+
33
+ - **docs**: touchup on documentation (`4c374be <https://github.com/mzdun/proj-flow/commit/4c374be954f8af5597ba6a25f13cd332bf7bcc5e>`_)
34
+
7
35
  `0.20.3 <https://github.com/mzdun/proj-flow/compare/v0.20.2...v0.20.3>`_ (2026-01-30)
8
36
  =====================================================================================
9
37
 
@@ -1,12 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: proj-flow
3
- Version: 0.20.3
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/
7
7
  Project-URL: Homepage, https://pypi.org/project/proj-flow/
8
8
  Project-URL: Source Code, https://github.com/mzdun/proj-flow
9
9
  Author-email: Marcin Zdun <marcin.zdun@gmail.com>
10
+ License-Expression: MIT
10
11
  License-File: LICENSE
11
12
  Keywords: C/C++,build-tool,c++,ci-cd,continuous-integration,cpp,dependencies,dependency-manager,developer,developer-tools,development,meta-build-tool,pipeline,tools-and-automation
12
13
  Classifier: Development Status :: 4 - Beta
@@ -17,13 +18,22 @@ Classifier: Programming Language :: Python :: 3
17
18
  Classifier: Programming Language :: Python :: 3.10
18
19
  Classifier: Topic :: Software Development :: Build Tools
19
20
  Requires-Python: >=3.10
20
- Requires-Dist: argcomplete
21
+ Requires-Dist: argcomplete~=3.5
21
22
  Requires-Dist: chevron2021
22
- Requires-Dist: prompt-toolkit
23
- Requires-Dist: pywebidl2
24
- Requires-Dist: pyyaml
25
- Requires-Dist: requests-cache
26
- Requires-Dist: toml
23
+ Requires-Dist: prompt-toolkit~=3.0
24
+ Requires-Dist: pywebidl2~=0.1
25
+ Requires-Dist: pyyaml~=6.0
26
+ Requires-Dist: requests-cache~=1.3
27
+ Requires-Dist: toml~=0.10
28
+ Provides-Extra: dev
29
+ Requires-Dist: black~=25.0; extra == 'dev'
30
+ Requires-Dist: build~=1.4; extra == 'dev'
31
+ Requires-Dist: isort~=6.0; extra == 'dev'
32
+ Requires-Dist: sphinx~=9.1; extra == 'dev'
33
+ Requires-Dist: twine<=6.0.1; extra == 'dev'
34
+ Requires-Dist: types-chevron~=0.14; extra == 'dev'
35
+ Requires-Dist: types-pyyaml~=6.0; extra == 'dev'
36
+ Requires-Dist: types-toml~=0.10; extra == 'dev'
27
37
  Description-Content-Type: text/markdown
28
38
 
29
39
  # Project Flow
@@ -23,13 +23,13 @@ classifiers = [
23
23
  "Programming Language :: Python :: 3.10",
24
24
  ]
25
25
  dependencies = [
26
- "argcomplete",
26
+ "argcomplete~=3.5",
27
27
  "chevron2021",
28
- "prompt_toolkit",
29
- "PyYAML",
30
- "toml",
31
- "pywebidl2",
32
- "requests_cache",
28
+ "prompt_toolkit~=3.0",
29
+ "PyYAML~=6.0",
30
+ "toml~=0.10",
31
+ "pywebidl2~=0.1",
32
+ "requests-cache~=1.3",
33
33
  ]
34
34
  description = "C++ project maintenance, automated"
35
35
  dynamic = ["version"]
@@ -49,6 +49,7 @@ keywords = [
49
49
  'pipeline',
50
50
  'tools-and-automation',
51
51
  ]
52
+ license = "MIT"
52
53
  name = "proj-flow"
53
54
  readme = "README.md"
54
55
  requires-python = ">=3.10"
@@ -61,3 +62,21 @@ Homepage = "https://pypi.org/project/proj-flow/"
61
62
 
62
63
  [project.scripts]
63
64
  proj-flow = "proj_flow.cli:main"
65
+
66
+ [project.optional-dependencies]
67
+ dev = [
68
+ "build~=1.4",
69
+ "twine<=6.0.1",
70
+ "sphinx~=9.1",
71
+ "black~=25.0",
72
+ "isort~=6.0",
73
+ "types-PyYAML~=6.0",
74
+ "types-chevron~=0.14",
75
+ "types-toml~=0.10",
76
+ ]
77
+
78
+ [tool.black]
79
+ target-version = ["py310", "py311", "py312", "py313"]
80
+
81
+ [tool.isort]
82
+ profile = "black"
@@ -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.20.3"
9
+ __version__ = "0.22.0"
@@ -159,6 +159,8 @@ def command(*name: str):
159
159
  doc = orig_doc or ""
160
160
  if doc:
161
161
  doc += "\n\n"
162
+ doc += f":call: ``proj-flow {' '.join(name)}``\n\n"
163
+ doc += f":call: ``./flow {' '.join(name)}``\n\n"
162
164
 
163
165
  for arg in _inspect.signature(entry):
164
166
  help = ""
@@ -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
@@ -173,35 +194,41 @@ def load_extensions(extensions: List[str]):
173
194
  for extension in extensions:
174
195
  try:
175
196
  importlib.import_module(extension)
176
- except ModuleNotFoundError:
197
+ except ImportError as ex:
198
+ print(
199
+ f"-- error: loading module `{extension}` resulted in import error: {ex}",
200
+ file=sys.stderr,
201
+ )
202
+ except BaseException as ex:
177
203
  print(
178
- f"-- error: module `{extension}` was no found, ignoring",
204
+ f"-- error: there was an error while loading module `{extension}`: {ex}",
179
205
  file=sys.stderr,
180
206
  )
181
207
 
208
+
182
209
  class FlowConfig:
183
210
  _cfg: dict
184
211
  steps: list = []
185
212
  aliases: List[RunAlias] = []
186
- root: str
213
+ root: Path
187
214
 
188
- def __init__(self, cfg: Optional["FlowConfig"] = None, root: str = "."):
215
+ def __init__(self, cfg: Optional["FlowConfig"] = None, root: Path = Path()):
189
216
  if cfg is not None:
190
217
  self._cfg = cfg._cfg
191
218
  self.steps = cfg.steps
192
219
  self.aliases = cfg.aliases
193
220
  self.root = cfg.root
194
221
  else:
195
- self.root = os.path.abspath(root)
222
+ self.root = root.absolute()
196
223
  defaults: ctx.SettingsType = {}
197
224
  dest: dict = {}
198
225
 
199
226
  _merge(
200
227
  dest,
201
228
  defaults,
202
- os.path.join(os.path.expanduser("~"), ".config", "proj-flow.json"),
229
+ Path("~").expanduser() / ".config" / "proj-flow.json",
203
230
  )
204
- _merge(dest, defaults, os.path.join(self.root, ".flow", "config.json"))
231
+ _merge(dest, defaults, self.root / ".flow" / "config.json")
205
232
 
206
233
  self._cfg = dest
207
234
  self._cfg["defaults"] = defaults
@@ -217,11 +244,9 @@ class FlowConfig:
217
244
  extensions = cast(List[str], self._cfg.get("extensions", []))
218
245
  extensions.insert(0, "proj_flow.minimal")
219
246
 
220
- local_extensions = os.path.abspath(
221
- os.path.join(self.root, ".flow", "extensions")
222
- )
223
- if os.path.isdir(local_extensions):
224
- 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())
225
250
 
226
251
  load_extensions(extensions)
227
252
 
@@ -459,8 +484,13 @@ class Config:
459
484
  return self.items.get("build_name", "")
460
485
 
461
486
  @property
462
- def build_dir(self) -> str:
463
- 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
464
494
 
465
495
  @property
466
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
  )
@@ -87,8 +88,10 @@ def _register_step(step: Step, replace: bool):
87
88
  return
88
89
 
89
90
  if "READTHEDOCS" not in os.environ:
90
- raise NameError(f"Step {name} is marked as replacing, but there is no previous step with that name")
91
-
91
+ raise NameError(
92
+ f"Step {name} is marked as replacing, but there is no previous step with that name"
93
+ )
94
+
92
95
  if name in [step.name for step in __steps]:
93
96
  if "READTHEDOCS" not in os.environ:
94
97
  raise NameError(f"Step {name} already registered")
@@ -133,6 +136,12 @@ def _make_private(f: _inspect.Function):
133
136
  f.__doc__ = ":meta private:\n"
134
137
 
135
138
 
139
+ def _make_private_property(f):
140
+ if isinstance(f, property):
141
+ _make_private(cast(_inspect.Function, f))
142
+ return
143
+
144
+
136
145
  _dummy_config = Config(
137
146
  {
138
147
  "os": "${os}",
@@ -154,7 +163,10 @@ def _extend_docstring(conv, step: Step):
154
163
  _name_list("Requires", step.platform_dependencies(), template="``{}``"),
155
164
  _name_list(
156
165
  "Removes",
157
- step.directories_to_remove(_dummy_config),
166
+ [
167
+ dirname.as_posix()
168
+ for dirname in step.directories_to_remove(_dummy_config)
169
+ ],
158
170
  template="``{}``",
159
171
  ),
160
172
  )
@@ -163,6 +175,9 @@ def _extend_docstring(conv, step: Step):
163
175
  doc = conv.__doc__ or "*Docstring is missing!*"
164
176
  conv.__doc__ = f"{doc}\n{info}"
165
177
 
178
+ _make_private_property(conv.name)
179
+ _make_private_property(conv.runs_before)
180
+ _make_private_property(conv.runs_after)
166
181
  _make_private(conv.is_active)
167
182
  _make_private(conv.run)
168
183
  _make_private(conv.platform_dependencies)
@@ -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,6 +139,8 @@ 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):
@@ -143,18 +152,33 @@ class Presets:
143
152
  return (includes, presets)
144
153
 
145
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
+
146
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]):
147
172
  presets = Presets().visit_file(Path("CMakePresets.json"))
173
+ if presets is None:
174
+ return None
148
175
 
149
- cwd = str(Path.cwd().as_posix()) + "/"
150
- result: dict[str, str] = {}
176
+ cwd = Path.cwd()
177
+ result: dict[str, T] = {}
151
178
  for preset in presets.values():
152
- dirname = preset.expand()
153
- if dirname is None:
179
+ mapped = mapper(preset, cwd)
180
+ if mapped is None:
154
181
  continue
155
- rel = str(dirname.as_posix())
156
- if rel[: len(cwd)] == cwd:
157
- rel = rel[len(cwd) :]
158
- result[preset.name] = rel
182
+ result[preset.name] = mapped
159
183
 
160
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