proj-flow 0.15.3__tar.gz → 0.17.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 (147) hide show
  1. {proj_flow-0.15.3 → proj_flow-0.17.0}/CHANGELOG.rst +16 -0
  2. {proj_flow-0.15.3 → proj_flow-0.17.0}/PKG-INFO +1 -1
  3. proj_flow-0.17.0/actions/bootstrap/action.yml +51 -0
  4. proj_flow-0.17.0/actions/bootstrap/version.py +49 -0
  5. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/__init__.py +1 -1
  6. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/cplusplus/cmake/__init__.py +2 -2
  7. proj_flow-0.17.0/src/proj_flow/ext/cplusplus/cmake/presets.py +160 -0
  8. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/cplusplus/cmake/steps.py +9 -4
  9. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/minimal/ext/bug_report.py +2 -0
  10. {proj_flow-0.15.3 → proj_flow-0.17.0}/.flow/config.yaml +0 -0
  11. {proj_flow-0.15.3 → proj_flow-0.17.0}/.gitignore +0 -0
  12. {proj_flow-0.15.3 → proj_flow-0.17.0}/.readthedocs.yaml +0 -0
  13. {proj_flow-0.15.3 → proj_flow-0.17.0}/LICENSE +0 -0
  14. {proj_flow-0.15.3 → proj_flow-0.17.0}/README.md +0 -0
  15. {proj_flow-0.15.3 → proj_flow-0.17.0}/ROADMAP.md +0 -0
  16. {proj_flow-0.15.3 → proj_flow-0.17.0}/pyproject.toml +0 -0
  17. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/__main__.py +0 -0
  18. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/api/__init__.py +0 -0
  19. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/api/arg.py +0 -0
  20. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/api/completers.py +0 -0
  21. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/api/ctx.py +0 -0
  22. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/api/env.py +0 -0
  23. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/api/init.py +0 -0
  24. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/api/makefile.py +0 -0
  25. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/api/release.py +0 -0
  26. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/api/step.py +0 -0
  27. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/base/__cmake_version__.py +0 -0
  28. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/base/__init__.py +0 -0
  29. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/base/cmd.py +0 -0
  30. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/base/inspect.py +0 -0
  31. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/base/matrix.py +0 -0
  32. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/base/name_list.py +0 -0
  33. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/base/plugins.py +0 -0
  34. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/base/registry.py +0 -0
  35. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/base/uname.py +0 -0
  36. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/cli/__init__.py +0 -0
  37. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/cli/argument.py +0 -0
  38. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/cli/finder.py +0 -0
  39. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/dependency.py +0 -0
  40. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/__init__.py +0 -0
  41. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/cplusplus/__init__.py +0 -0
  42. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/cplusplus/cmake/parser.py +0 -0
  43. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/cplusplus/cmake/project.py +0 -0
  44. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/cplusplus/conan/__init__.py +0 -0
  45. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/cplusplus/conan/_conan.py +0 -0
  46. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/github/__init__.py +0 -0
  47. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/github/cli.py +0 -0
  48. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/github/hosting.py +0 -0
  49. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/github/publishing.py +0 -0
  50. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/github/switches.py +0 -0
  51. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/markdown_changelog.py +0 -0
  52. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/python/__init__.py +0 -0
  53. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/python/rtdocs.py +0 -0
  54. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/python/steps.py +0 -0
  55. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/python/version.py +0 -0
  56. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/re_structured_changelog.py +0 -0
  57. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/sign/__init__.py +0 -0
  58. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/sign/api.py +0 -0
  59. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/sign/win32.py +0 -0
  60. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/ext/store.py +0 -0
  61. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/flow/__init__.py +0 -0
  62. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/flow/configs.py +0 -0
  63. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/flow/layer.py +0 -0
  64. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/flow/steps.py +0 -0
  65. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/log/__init__.py +0 -0
  66. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/log/commit.py +0 -0
  67. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/log/error.py +0 -0
  68. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/log/fmt.py +0 -0
  69. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/log/format.py +0 -0
  70. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/log/hosting/__init__.py +0 -0
  71. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/log/hosting/github.py +0 -0
  72. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/log/msg.py +0 -0
  73. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/log/release.py +0 -0
  74. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/log/rich_text/__init__.py +0 -0
  75. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/log/rich_text/api.py +0 -0
  76. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/log/rich_text/markdown.py +0 -0
  77. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/log/rich_text/re_structured_text.py +0 -0
  78. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/minimal/__init__.py +0 -0
  79. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/minimal/base.py +0 -0
  80. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/minimal/bootstrap.py +0 -0
  81. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/minimal/init.py +0 -0
  82. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/minimal/list.py +0 -0
  83. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/minimal/run.py +0 -0
  84. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/minimal/system.py +0 -0
  85. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/project/__init__.py +0 -0
  86. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/project/api.py +0 -0
  87. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/project/cplusplus/__init__.py +0 -0
  88. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/project/cplusplus/cmake_context.py +0 -0
  89. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/project/cplusplus/conan_context.py +0 -0
  90. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/project/cplusplus/project.py +0 -0
  91. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/project/data.py +0 -0
  92. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/project/interact.py +0 -0
  93. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/base/.clang-format +0 -0
  94. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/base/.flow/config.yml +0 -0
  95. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/base/.flow/flow.py.mustache +0 -0
  96. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/base/.flow/matrix.yml +0 -0
  97. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/base/.flow/official.yml +0 -0
  98. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/base/.gitignore +0 -0
  99. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/base/README.md.mustache +0 -0
  100. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/base/flow +0 -0
  101. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/base/flow.cmd +0 -0
  102. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/base.json +0 -0
  103. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/.flow/cmake/common.cmake.mustache +0 -0
  104. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/.flow/extensions/wall/__init__.py.mustache +0 -0
  105. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/.flow/extensions/wall/icons/__init__.py.mustache +0 -0
  106. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/.flow/extensions/wall/icons/magick.py.mustache +0 -0
  107. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/.flow/packages/base.cmake.mustache +0 -0
  108. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/.flow/packages/config.cmake +0 -0
  109. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/.flow/packages/cpack.cmake +0 -0
  110. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/.flow/packages/wix/cpack.cmake.mustache +0 -0
  111. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/.flow/packages/wix/patches.in.wix +0 -0
  112. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/.flow/packages/wix.cmake.mustache +0 -0
  113. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/CMakeGraphVizOptions.cmake +0 -0
  114. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/CMakeLists.txt.mustache +0 -0
  115. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/CMakePresets.json +0 -0
  116. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/data/assets/appicon.ico +0 -0
  117. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/data/assets/appicon.png +0 -0
  118. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/data/assets/wix_banner.bmp +0 -0
  119. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/data/assets/wix_dialog.bmp +0 -0
  120. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/data/icons/.gitignore +0 -0
  121. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/data/icons/appicon-mask.svg +0 -0
  122. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/data/icons/appicon.svg +0 -0
  123. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/src/main.cc.mustache +0 -0
  124. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/src/version.hpp.in.mustache +0 -0
  125. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake/tests/test.cc.mustache +0 -0
  126. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/cmake.json +0 -0
  127. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/conan/.flow/cmake/libcxx_toolchain.cmake +0 -0
  128. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/conan/.flow/cmake/output_dirs_setup.cmake +0 -0
  129. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/conan/conanfile.txt +0 -0
  130. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/conan.json +0 -0
  131. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/github_actions/.github/linters/.isort.cfg +0 -0
  132. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/github_actions/.github/linters/.mypy.ini +0 -0
  133. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/github_actions/.github/workflows/build.yml.auto-release +0 -0
  134. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/github_actions/.github/workflows/build.yml.basic +0 -0
  135. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/github_actions/.github/workflows/linter.yml +0 -0
  136. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/github_actions/CPPLINT.cfg +0 -0
  137. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/github_actions.json +0 -0
  138. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/github_social/.github/ISSUE_TEMPLATE/bug_report.md.mustache +0 -0
  139. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/github_social/.github/ISSUE_TEMPLATE/feature_request.md.mustache +0 -0
  140. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/github_social/CODE_OF_CONDUCT.md.mustache +0 -0
  141. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/github_social/CONTRIBUTING.md +0 -0
  142. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/layers/github_social.json +0 -0
  143. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/licenses/0BSD.mustache +0 -0
  144. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/licenses/MIT.mustache +0 -0
  145. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/licenses/Unlicense.mustache +0 -0
  146. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/licenses/WTFPL.mustache +0 -0
  147. {proj_flow-0.15.3 → proj_flow-0.17.0}/src/proj_flow/template/licenses/Zlib.mustache +0 -0
@@ -4,6 +4,22 @@ Changelog
4
4
 
5
5
  All notable changes to this project will be documented in this file.
6
6
 
7
+ `0.17.0 <https://github.com/mzdun/proj-flow/compare/v0.16.0...v0.17.0>`_ (2025-08-28)
8
+ =====================================================================================
9
+
10
+ New Features
11
+ ------------
12
+
13
+ - use CMake presets to find binary directory (`2312366 <https://github.com/mzdun/proj-flow/commit/2312366ace1ba2152490c5aa710db82b982bbc02>`_)
14
+
15
+ `0.16.0 <https://github.com/mzdun/proj-flow/compare/v0.15.3...v0.16.0>`_ (2025-03-02)
16
+ =====================================================================================
17
+
18
+ New Features
19
+ ------------
20
+
21
+ - add bootstrap action (`57cf99b <https://github.com/mzdun/proj-flow/commit/57cf99bad7c34aa22d357746824647499d70eb07>`_)
22
+
7
23
  `0.15.3 <https://github.com/mzdun/proj-flow/compare/v0.15.2...v0.15.3>`_ (2025-02-24)
8
24
  =====================================================================================
9
25
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: proj-flow
3
- Version: 0.15.3
3
+ Version: 0.17.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,51 @@
1
+ name: Python + Project Flow bootstrap
2
+ description: Sets up Flow for current checkout.
3
+ author: Marcin Zdun
4
+
5
+ inputs:
6
+ python-version:
7
+ description: "Version range or exact version of Python or PyPy to use, using SemVer's version range syntax. Reads from .python-version if unset."
8
+
9
+ outputs:
10
+ version:
11
+ description: Version of the `proj-flow` this project expects
12
+ value: ${{ steps.version.outputs.version }}
13
+
14
+ is-flow-app:
15
+ description: Checks, if this project is a Flow project
16
+ value: ${{ steps.version.outputs.is-flow-app }}
17
+
18
+ runs:
19
+ using: composite
20
+ steps:
21
+ - name: python 3.10
22
+ uses: actions/setup-python@v5
23
+ with:
24
+ python-version: ${{ inputs.python-version }}
25
+
26
+ - name: check version
27
+ id: version
28
+ shell: python
29
+ run: |
30
+ import os
31
+ import sys
32
+
33
+ ACTION_PATH = os.environ['ACTION_PATH'].replace('/', os.sep)
34
+ sys.path.insert(0, ACTION_PATH)
35
+
36
+ import version
37
+ env:
38
+ ACTION_PATH: ${{ github.action_path }}
39
+ RUNNER_CONTEXT: ${{ toJson(runner) }}
40
+
41
+ - name: .flow/.venv cache
42
+ if: ${{ fromJson(steps.version.outputs.is-flow-app) }}
43
+ uses: actions/cache@v4
44
+ with:
45
+ path: .flow/.venv
46
+ key: ${{ steps.version.outputs.venv-cache-key }}
47
+
48
+ - name: bootstrap
49
+ if: ${{ fromJson(steps.version.outputs.is-flow-app) }}
50
+ run: python ./.flow/flow.py bootstrap
51
+ shell: bash
@@ -0,0 +1,49 @@
1
+ # Copyright (c) 2025 Marcin Zdun
2
+ # This code is licensed under MIT license (see LICENSE for details)
3
+
4
+ import json
5
+ import os
6
+ from platform import machine
7
+ from typing import cast
8
+
9
+ VAR_NAME = "CXX_FLOW_VERSION"
10
+ VARIABLE = ""
11
+ IS_FLOW_APP = False
12
+
13
+ RUNNER = cast(dict, json.loads(os.environ["RUNNER_CONTEXT"]))
14
+ RUNNER_OS = RUNNER.get("os", os.name)
15
+ RUNNER_ARCH = RUNNER.get("arch", machine() or "unk-arch")
16
+
17
+ try:
18
+ with open(".flow/flow.py", encoding="UTF-8") as flow_py:
19
+ for line in flow_py:
20
+ if not line.startswith(VAR_NAME):
21
+ continue
22
+
23
+ var_list = line.split("=", 1)
24
+ if len(var_list) != 2:
25
+ continue
26
+
27
+ var = var_list[0].strip()
28
+ if var != VAR_NAME:
29
+ continue
30
+
31
+ val = var_list[1].strip()
32
+ start = val[:1]
33
+ if start not in "\"'":
34
+ continue
35
+
36
+ VARIABLE = val[1:].split(start, 1)[0].strip()
37
+ break
38
+
39
+ IS_FLOW_APP = True
40
+
41
+ except FileNotFoundError:
42
+ pass
43
+
44
+ VENV_CACHE_KEY = f"venv-{RUNNER_OS}-{RUNNER_ARCH}-{VARIABLE}"
45
+
46
+ with open(os.environ["GITHUB_OUTPUT"], "a", encoding="UTF-8") as out:
47
+ print(f"version={VARIABLE}", file=out)
48
+ print(f"venv-cache-key={VENV_CACHE_KEY}", file=out)
49
+ print(f"is-flow-app={json.dumps(IS_FLOW_APP)}", file=out)
@@ -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.15.3"
9
+ __version__ = "0.17.0"
@@ -7,6 +7,6 @@ The **proj_flow.ext.cplusplus.cmake** provides ``"CMake"``, ``"Build"``,
7
7
  context.
8
8
  """
9
9
 
10
- from . import parser, project, steps
10
+ from . import parser, presets, project, steps
11
11
 
12
- __all__ = ["parser", "project", "steps"]
12
+ __all__ = ["parser", "presets", "project", "steps"]
@@ -0,0 +1,160 @@
1
+ # Copyright (c) 2025 Marcin Zdun
2
+ # This code is licensed under MIT license (see LICENSE for details)
3
+
4
+ """
5
+ The **proj_flow.ext.cplusplus.cmake.presets** check build directories for CMake step.
6
+ """
7
+
8
+ import json
9
+ import os
10
+ import platform
11
+ from dataclasses import dataclass
12
+ from enum import Enum
13
+ from pathlib import Path
14
+ from typing import cast
15
+
16
+
17
+ class MacroType(Enum):
18
+ PRESET_NAME = 1
19
+ GENERATOR = 2
20
+ FILE_DIR = 3
21
+
22
+
23
+ CMAKE_SOURCE_DIR = Path(".").resolve()
24
+ CMAKE_HOST_SYSTEM_NAME = platform.uname().system
25
+
26
+ MACROS: dict[str, Path | str | MacroType] = {
27
+ "${sourceDir}": CMAKE_SOURCE_DIR,
28
+ "${sourceParentDir}": CMAKE_SOURCE_DIR.parent,
29
+ "${sourceDirName}": CMAKE_SOURCE_DIR.name,
30
+ "${presetName}": MacroType.PRESET_NAME,
31
+ "${generator}": MacroType.GENERATOR,
32
+ "${hostSystemName}": CMAKE_HOST_SYSTEM_NAME,
33
+ "${fileDir}": MacroType.FILE_DIR,
34
+ "${dollar}": "$",
35
+ "${pathListSep}": os.pathsep,
36
+ }
37
+
38
+
39
+ @dataclass
40
+ class Preset:
41
+ name: str
42
+ binary_dir: str | None
43
+ generator: str | None
44
+ inherits: list[str]
45
+ file_dir: Path
46
+
47
+ def expand(self):
48
+ if not self.binary_dir:
49
+ return None
50
+ chunks = self.binary_dir.split("${")
51
+ parts: list[str | Path | MacroType] = [chunks[0]]
52
+ for chunk in chunks[1:]:
53
+ var_suffix = chunk.split("}", 1)
54
+ if len(var_suffix) != 2:
55
+ return None
56
+ key = f"${{{var_suffix[0]}}}"
57
+ value = MACROS.get(key, "")
58
+ if isinstance(value, MacroType):
59
+ if value == MacroType.PRESET_NAME:
60
+ value = self.name
61
+ elif value == MacroType.GENERATOR:
62
+ value = self.generator or ""
63
+ elif value == MacroType.FILE_DIR:
64
+ value = self.file_dir
65
+ elif isinstance(value, Path):
66
+ if value.is_absolute():
67
+ parts = []
68
+ value = str(value)
69
+ parts.append(value)
70
+ parts.append(var_suffix[1])
71
+
72
+ return Path("".join(str(part) for part in parts))
73
+
74
+
75
+ class Presets:
76
+ def __init__(self):
77
+ self.seen = cast(set[Path], set())
78
+ self.result = cast(dict[str, Preset], {})
79
+
80
+ def visit_file(self, filename: Path):
81
+ dirname = self.__parent_from_file(filename)
82
+ if dirname is None:
83
+ return self.result
84
+
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)
91
+
92
+ return self.result
93
+
94
+ def __parent_from_file(self, filename: Path):
95
+ key = filename.resolve()
96
+ if key in self.seen:
97
+ return None
98
+ self.seen.add(key)
99
+ return key.parent
100
+
101
+ def __visit_includes(self, dirname: Path, includes: list[str]):
102
+ for include in includes:
103
+ self.visit_file(dirname / include)
104
+
105
+ def __visit_preset(self, dirname: Path, preset: dict):
106
+ name = cast(str | None, preset.get("name"))
107
+ if name is None:
108
+ return
109
+ binary_dir = cast(str | None, preset.get("binaryDir"))
110
+ generator = cast(str | None, preset.get("generator"))
111
+ inherits = cast(list[str], preset.get("inherits", []))
112
+ self.result[name] = Preset(
113
+ name=name,
114
+ binary_dir=binary_dir,
115
+ generator=generator,
116
+ inherits=inherits,
117
+ file_dir=dirname,
118
+ )
119
+
120
+ def __merge_preset(self, preset: Preset):
121
+ inherits: list[str] = []
122
+ inherits.extend(preset.inherits)
123
+ while inherits:
124
+ parent = inherits[0]
125
+ inherits = inherits[1:]
126
+ if parent not in self.result:
127
+ continue
128
+ parent_preset = self.result[parent]
129
+ inherits.extend(parent_preset.inherits)
130
+
131
+ if parent_preset.binary_dir and not preset.binary_dir:
132
+ preset.binary_dir = parent_preset.binary_dir
133
+ if parent_preset.generator and not preset.generator:
134
+ preset.generator = parent_preset.generator
135
+
136
+ @staticmethod
137
+ def __load_file(filename: Path):
138
+ with open(filename, encoding="UTF-8") as f:
139
+ data = json.load(f)
140
+ includes = cast(list[str], data.get("include", []))
141
+ presets = cast(list[dict], data.get("configurePresets", []))
142
+
143
+ return (includes, presets)
144
+
145
+
146
+ def get_binary_dirs():
147
+ presets = Presets().visit_file(Path("CMakePresets.json"))
148
+
149
+ cwd = str(Path.cwd().as_posix()) + "/"
150
+ result: dict[str, str] = {}
151
+ for preset in presets.values():
152
+ dirname = preset.expand()
153
+ if dirname is None:
154
+ continue
155
+ rel = str(dirname.as_posix())
156
+ if rel[: len(cwd)] == cwd:
157
+ rel = rel[len(cwd) :]
158
+ result[preset.name] = rel
159
+
160
+ return result
@@ -12,6 +12,7 @@ from typing import Dict, List, cast
12
12
  from proj_flow import api
13
13
  from proj_flow.api import env, step
14
14
  from proj_flow.base.__cmake_version__ import CMAKE_VERSION
15
+ from proj_flow.ext.cplusplus.cmake.presets import get_binary_dirs
15
16
 
16
17
 
17
18
  class CMakeBase(api.step.Step):
@@ -39,7 +40,7 @@ class CMakeBase(api.step.Step):
39
40
  self._runs_after = runs_after
40
41
  self._runs_before = runs_before
41
42
 
42
- def is_active(self, config: api.env.Config, rt: api.env.Runtime) -> int:
43
+ def is_active(self, config: api.env.Config, rt: api.env.Runtime) -> bool:
43
44
  return os.path.isfile("CMakeLists.txt") and os.path.isfile("CMakePresets.json")
44
45
 
45
46
  def platform_dependencies(self):
@@ -55,12 +56,16 @@ class CMakeConfig(CMakeBase):
55
56
 
56
57
  def __init__(self):
57
58
  super().__init__(name="CMake")
59
+ self.binary_dirs = get_binary_dirs()
58
60
 
59
- def is_active(self, config: env.Config, rt: env.Runtime) -> int:
61
+ def is_active(self, config: env.Config, rt: env.Runtime) -> bool:
60
62
  return os.path.isfile("CMakeLists.txt") and os.path.isfile("CMakePresets.json")
61
63
 
62
64
  def directories_to_remove(self, config: env.Config) -> List[str]:
63
- return [f"build/{config.build_type}"]
65
+ binary_dir = self.binary_dirs.get(f"{config.preset}-{config.build_generator}")
66
+ if not binary_dir:
67
+ return []
68
+ return [binary_dir]
64
69
 
65
70
  def run(self, config: env.Config, rt: env.Runtime) -> int:
66
71
  cmake_vars = cast(Dict[str, str], rt._cfg.get("cmake", {}).get("vars", {}))
@@ -130,7 +135,7 @@ class PackStep(CMakeBase):
130
135
  def platform_dependencies(self):
131
136
  return self.dep_with_tool("cpack")
132
137
 
133
- def is_active(self, config: env.Config, rt: env.Runtime) -> int:
138
+ def is_active(self, config: env.Config, rt: env.Runtime) -> bool:
134
139
  return (
135
140
  super().is_active(config, rt)
136
141
  and len(config.items.get("cpack_generator", [])) > 0
@@ -25,6 +25,7 @@ def _version(ver: str) -> Tuple[int, int, int, str]:
25
25
  raise SystemExit(1)
26
26
  return (int(m.group(1)), int(m.group(2)), int(m.group(3)), ver)
27
27
 
28
+
28
29
  def _prev_version(new_version: str, tags: List[str]):
29
30
  current = _version(new_version)
30
31
  versions = [_version(tag) for tag in reversed(tags)]
@@ -40,6 +41,7 @@ def _prev_version(new_version: str, tags: List[str]):
40
41
 
41
42
  return None if index > len(versions) else versions[index][-1]
42
43
 
44
+
43
45
  @release.version_updaters.add
44
46
  class VersionUpdater(release.VersionUpdater):
45
47
  def on_version_change_tags(self, new_version: str, tags: List[str]):
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes