proj-flow 0.19.0__tar.gz → 0.20.1__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.
- {proj_flow-0.19.0 → proj_flow-0.20.1}/CHANGELOG.rst +16 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/PKG-INFO +2 -1
- {proj_flow-0.19.0 → proj_flow-0.20.1}/pyproject.toml +1 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/__init__.py +1 -1
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/api/makefile.py +1 -1
- proj_flow-0.20.1/src/proj_flow/ext/tools/__init__.py +13 -0
- proj_flow-0.20.1/src/proj_flow/ext/tools/pragma_once.py +40 -0
- proj_flow-0.20.1/src/proj_flow/ext/tools/run_linter.py +228 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/.flow/config.yaml +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/.gitignore +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/.readthedocs.yaml +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/LICENSE +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/README.md +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/ROADMAP.md +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/actions/bootstrap/action.yml +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/actions/bootstrap/version.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/__main__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/api/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/api/arg.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/api/completers.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/api/ctx.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/api/env.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/api/init.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/api/release.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/api/step.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/base/__cmake_version__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/base/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/base/cmd.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/base/inspect.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/base/matrix.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/base/name_list.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/base/plugins.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/base/registry.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/base/uname.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/cli/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/cli/argument.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/cli/finder.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/dependency.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/cplusplus/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/cplusplus/cmake/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/cplusplus/cmake/parser.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/cplusplus/cmake/presets.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/cplusplus/cmake/project.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/cplusplus/cmake/steps.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/cplusplus/conan/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/cplusplus/conan/_conan.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/github/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/github/cli.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/github/hosting.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/github/publishing.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/github/switches.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/markdown_changelog.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/python/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/python/rtdocs.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/python/steps.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/python/version.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/re_structured_changelog.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/sign/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/sign/api.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/sign/win32.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/store.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/base/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/base/config.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/cli/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/cli/cmake.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/cli/depfile.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/cli/gen.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/cli/init.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/cli/root.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/cli/updater.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/data/init/flow_webidl.cmake +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/data/templates/cmake.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/data/templates/depfile.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/data/templates/partials/cxx/attribute-decl.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/data/templates/partials/cxx/in-out.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/data/templates/partials/cxx/includes.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/data/templates/partials/cxx/operation-decl.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/data/templates/partials/cxx/type.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/data/types/cxx.json +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/model/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/model/ast.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/model/builders.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/registry.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/flow/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/flow/configs.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/flow/layer.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/flow/steps.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/log/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/log/commit.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/log/error.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/log/fmt.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/log/format.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/log/hosting/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/log/hosting/github.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/log/msg.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/log/release.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/log/rich_text/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/log/rich_text/api.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/log/rich_text/markdown.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/log/rich_text/re_structured_text.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/minimal/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/minimal/base.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/minimal/bootstrap.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/minimal/ext/bug_report.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/minimal/init.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/minimal/list.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/minimal/run.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/minimal/system.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/project/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/project/api.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/project/cplusplus/__init__.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/project/cplusplus/cmake_context.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/project/cplusplus/conan_context.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/project/cplusplus/project.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/project/data.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/project/interact.py +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/base/.clang-format +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/base/.flow/config.yml +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/base/.flow/flow.py.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/base/.flow/matrix.yml +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/base/.flow/official.yml +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/base/.gitignore +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/base/README.md.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/base/flow +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/base/flow.cmd +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/base.json +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/.flow/cmake/common.cmake.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/.flow/extensions/wall/__init__.py.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/.flow/extensions/wall/icons/__init__.py.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/.flow/extensions/wall/icons/magick.py.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/.flow/packages/base.cmake.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/.flow/packages/config.cmake +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/.flow/packages/cpack.cmake +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/.flow/packages/wix/cpack.cmake.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/.flow/packages/wix/patches.in.wix +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/.flow/packages/wix.cmake.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/CMakeGraphVizOptions.cmake +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/CMakeLists.txt.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/CMakePresets.json +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/data/assets/appicon.ico +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/data/assets/appicon.png +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/data/assets/wix_banner.bmp +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/data/assets/wix_dialog.bmp +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/data/icons/.gitignore +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/data/icons/appicon-mask.svg +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/data/icons/appicon.svg +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/src/main.cc.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/src/version.hpp.in.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/tests/test.cc.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake.json +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/conan/.flow/cmake/libcxx_toolchain.cmake +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/conan/.flow/cmake/output_dirs_setup.cmake +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/conan/conanfile.txt +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/conan.json +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/github_actions/.github/linters/.isort.cfg +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/github_actions/.github/linters/.mypy.ini +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/github_actions/.github/workflows/build.yml.auto-release +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/github_actions/.github/workflows/build.yml.basic +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/github_actions/.github/workflows/linter.yml +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/github_actions/CPPLINT.cfg +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/github_actions.json +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/github_social/.github/ISSUE_TEMPLATE/bug_report.md.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/github_social/.github/ISSUE_TEMPLATE/feature_request.md.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/github_social/CODE_OF_CONDUCT.md.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/github_social/CONTRIBUTING.md +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/github_social.json +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/licenses/0BSD.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/licenses/MIT.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/licenses/Unlicense.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/licenses/WTFPL.mustache +0 -0
- {proj_flow-0.19.0 → proj_flow-0.20.1}/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.20.1 <https://github.com/mzdun/proj-flow/compare/v0.20.0...v0.20.1>`_ (2026-01-19)
|
|
8
|
+
=====================================================================================
|
|
9
|
+
|
|
10
|
+
Bug Fixes
|
|
11
|
+
---------
|
|
12
|
+
|
|
13
|
+
- add missing dependency (`55eb30d <https://github.com/mzdun/proj-flow/commit/55eb30d6aae45f7188804c63cfc866aeb4fc6936>`_)
|
|
14
|
+
|
|
15
|
+
`0.20.0 <https://github.com/mzdun/proj-flow/compare/v0.19.0...v0.20.0>`_ (2026-01-19)
|
|
16
|
+
=====================================================================================
|
|
17
|
+
|
|
18
|
+
New Features
|
|
19
|
+
------------
|
|
20
|
+
|
|
21
|
+
- add tools from templates to extension (`b6de775 <https://github.com/mzdun/proj-flow/commit/b6de775b6b3190ef1935dd8d2e99dc7e05ff4634>`_)
|
|
22
|
+
|
|
7
23
|
`0.19.0 <https://github.com/mzdun/proj-flow/compare/v0.18.0...v0.19.0>`_ (2026-01-18)
|
|
8
24
|
=====================================================================================
|
|
9
25
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: proj-flow
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.20.1
|
|
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/
|
|
@@ -22,6 +22,7 @@ Requires-Dist: chevron2021
|
|
|
22
22
|
Requires-Dist: prompt-toolkit
|
|
23
23
|
Requires-Dist: pywebidl2
|
|
24
24
|
Requires-Dist: pyyaml
|
|
25
|
+
Requires-Dist: requests-cache
|
|
25
26
|
Requires-Dist: toml
|
|
26
27
|
Description-Content-Type: text/markdown
|
|
27
28
|
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Copyright (c) 2026 Marcin Zdun
|
|
2
|
+
# This file is licensed under MIT license (see LICENSE for details)
|
|
3
|
+
|
|
4
|
+
from proj_flow.api import arg
|
|
5
|
+
from proj_flow.ext.tools.pragma_once import pragma_once
|
|
6
|
+
from proj_flow.ext.tools.run_linter import run_linter
|
|
7
|
+
|
|
8
|
+
__all__ = ["tools", "pragma_once", "run_linter"]
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@arg.command("tools")
|
|
12
|
+
def tools():
|
|
13
|
+
"""Run various C++ tools and helpers"""
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Copyright (c) 2026 Marcin Zdun
|
|
2
|
+
# This file is licensed under MIT license (see LICENSE for details)
|
|
3
|
+
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
from proj_flow.api import arg
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _pragma_present(path: Path):
|
|
10
|
+
with path.open(encoding="UTF-8") as text:
|
|
11
|
+
for line in text:
|
|
12
|
+
line = line.rstrip()
|
|
13
|
+
if line == "#pragma once":
|
|
14
|
+
return True
|
|
15
|
+
return False
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@arg.command("tools", "pragma-once")
|
|
19
|
+
def pragma_once():
|
|
20
|
+
"""Check presence and absence of ``#pragma once``, as expected"""
|
|
21
|
+
|
|
22
|
+
code_exts = [".c", ".c++", ".cc", ".cpp", ".cxx"]
|
|
23
|
+
header_exts = [".h", ".h++", ".hh", ".hpp", ".hxx"]
|
|
24
|
+
|
|
25
|
+
paths: dict[bool, list[Path]] = {True: [], False: []}
|
|
26
|
+
|
|
27
|
+
for root, dirs, files in Path(".").walk():
|
|
28
|
+
dirs[:] = [dir_name for dir_name in dirs if dir_name not in [".git", "build"]]
|
|
29
|
+
for filename in files:
|
|
30
|
+
path = root / filename
|
|
31
|
+
ext = path.suffix
|
|
32
|
+
if ext in code_exts:
|
|
33
|
+
paths[False].append(path)
|
|
34
|
+
elif ext in header_exts:
|
|
35
|
+
paths[True].append(path)
|
|
36
|
+
|
|
37
|
+
for expected in paths:
|
|
38
|
+
for path in paths[expected]:
|
|
39
|
+
if _pragma_present(path) != expected:
|
|
40
|
+
print(path.as_posix())
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# Copyright (c) 2026 Marcin Zdun
|
|
2
|
+
# This code is licensed under MIT license (see LICENSE for details)
|
|
3
|
+
|
|
4
|
+
import shlex
|
|
5
|
+
import subprocess
|
|
6
|
+
import urllib.parse
|
|
7
|
+
from dataclasses import dataclass
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Annotated, Any, cast
|
|
10
|
+
|
|
11
|
+
import requests_cache
|
|
12
|
+
from yaml import load, safe_load
|
|
13
|
+
|
|
14
|
+
from proj_flow.api.arg import Argument, command
|
|
15
|
+
from proj_flow.api.env import Runtime
|
|
16
|
+
|
|
17
|
+
try:
|
|
18
|
+
from yaml import CLoader as Loader
|
|
19
|
+
except ImportError:
|
|
20
|
+
from yaml import Loader
|
|
21
|
+
|
|
22
|
+
IMAGE = "github/super-linter"
|
|
23
|
+
PREFIX = f"{IMAGE}/"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@dataclass
|
|
27
|
+
class Image:
|
|
28
|
+
repo: str
|
|
29
|
+
name: str
|
|
30
|
+
version: str
|
|
31
|
+
|
|
32
|
+
@property
|
|
33
|
+
def full_name(self):
|
|
34
|
+
return f"{self.repo}/{self.name}"
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def label(self):
|
|
38
|
+
return f"{self.repo}/{self.name}:{self.version}"
|
|
39
|
+
|
|
40
|
+
def super_linter_args(self, env: dict[str, str], log_level: str):
|
|
41
|
+
_env = env.copy()
|
|
42
|
+
_env["RUN_LOCAL"] = "true"
|
|
43
|
+
_env["LOG_LEVEL"] = log_level
|
|
44
|
+
_env["USE_FIND_ALGORITHM"] = "true"
|
|
45
|
+
_env["VALIDATE_ALL_CODEBASE"] = "true"
|
|
46
|
+
|
|
47
|
+
args = [
|
|
48
|
+
arg
|
|
49
|
+
for pair in (["-e", f"{key}={_env[key]}"] for key in _env)
|
|
50
|
+
for arg in pair
|
|
51
|
+
]
|
|
52
|
+
return [
|
|
53
|
+
"docker",
|
|
54
|
+
"run",
|
|
55
|
+
"--rm",
|
|
56
|
+
*args,
|
|
57
|
+
"-v" f"{Path().absolute().as_posix()}:/tmp/lint",
|
|
58
|
+
self.label,
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@dataclass
|
|
63
|
+
class Step:
|
|
64
|
+
name: str
|
|
65
|
+
image: Image
|
|
66
|
+
env: dict[str, str]
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
@dataclass
|
|
70
|
+
class Job:
|
|
71
|
+
name: str
|
|
72
|
+
steps: list[Step]
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@command("tools", "run-linter")
|
|
76
|
+
def run_linter(
|
|
77
|
+
log_level: Annotated[
|
|
78
|
+
str,
|
|
79
|
+
Argument(
|
|
80
|
+
help="Select one of log levels (defaults to INFO)",
|
|
81
|
+
choices=["ERROR", "WARN", "NOTICE", "INFO", "DEBUG"],
|
|
82
|
+
default="INFO",
|
|
83
|
+
opt=True,
|
|
84
|
+
),
|
|
85
|
+
],
|
|
86
|
+
rt: Runtime,
|
|
87
|
+
):
|
|
88
|
+
"""Run dockerized super-linter with all the settings from local GitHub workflows"""
|
|
89
|
+
|
|
90
|
+
WORKFLOWS = Path(".github/workflows")
|
|
91
|
+
if not WORKFLOWS.is_dir():
|
|
92
|
+
if not rt.silent:
|
|
93
|
+
print("This project has no GitHub workflows")
|
|
94
|
+
return 0
|
|
95
|
+
|
|
96
|
+
db_path = Path("build")
|
|
97
|
+
db_path.mkdir(parents=True, exist_ok=True)
|
|
98
|
+
db_path = db_path / "cache_db"
|
|
99
|
+
|
|
100
|
+
session = requests_cache.CachedSession(db_path)
|
|
101
|
+
JOBS: list[Job] = []
|
|
102
|
+
for root, dirs, files in WORKFLOWS.walk():
|
|
103
|
+
for filename in files:
|
|
104
|
+
path = root / filename
|
|
105
|
+
if path.suffix not in [".yml", ".yaml"]:
|
|
106
|
+
continue
|
|
107
|
+
|
|
108
|
+
with path.open(encoding="UTF-8") as f:
|
|
109
|
+
data = load(f, Loader=Loader)
|
|
110
|
+
try:
|
|
111
|
+
yml_name = cast(str, data["name"])
|
|
112
|
+
except KeyError:
|
|
113
|
+
yml_name = path.stem
|
|
114
|
+
JOBS.extend(_get_linter_actions(data, yml_name, session, rt.verbose))
|
|
115
|
+
|
|
116
|
+
for job in JOBS:
|
|
117
|
+
job_name, steps = job.name, job.steps
|
|
118
|
+
print(f"job: \033[1;49;95m{job_name}\033[m")
|
|
119
|
+
for step in steps:
|
|
120
|
+
print(
|
|
121
|
+
f"step: \033[1;49;96m{step.name}\033[m \033[2;49;32m({step.image.full_name}:\033[0;49;32m{step.image.version}\033[2;49;32m)\033[m"
|
|
122
|
+
)
|
|
123
|
+
args = step.image.super_linter_args(step.env, log_level=log_level)
|
|
124
|
+
print("\033[0;49;30m{}\033[m".format(shlex.join(args)))
|
|
125
|
+
subprocess.run(args, shell=False)
|
|
126
|
+
print()
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def _download_docker_image_id(
|
|
130
|
+
action: str,
|
|
131
|
+
version: str | None,
|
|
132
|
+
session: requests_cache.CachedSession,
|
|
133
|
+
verbose: bool,
|
|
134
|
+
):
|
|
135
|
+
if action != IMAGE and not action.startswith(PREFIX):
|
|
136
|
+
return None
|
|
137
|
+
|
|
138
|
+
repo = "https://raw.githubusercontent.com/github/super-linter"
|
|
139
|
+
refs = f"refs/tags/{version}" if version else "refs/heads/main"
|
|
140
|
+
filename = "action.yml"
|
|
141
|
+
if action.startswith(PREFIX):
|
|
142
|
+
filename = f"{action[len(PREFIX):]}/{filename}"
|
|
143
|
+
|
|
144
|
+
url = f"{repo}/{refs}/{filename}"
|
|
145
|
+
if verbose:
|
|
146
|
+
print("-- run-linter: Downloading", url)
|
|
147
|
+
response = session.get(url)
|
|
148
|
+
response.raise_for_status()
|
|
149
|
+
data = cast(dict[str, dict[str, str]], safe_load(response.text))
|
|
150
|
+
runs = data.get("runs", {})
|
|
151
|
+
if runs.get("using") != "docker":
|
|
152
|
+
return None
|
|
153
|
+
|
|
154
|
+
image = runs.get("image")
|
|
155
|
+
if not image:
|
|
156
|
+
return None
|
|
157
|
+
|
|
158
|
+
url = urllib.parse.urlparse(image)
|
|
159
|
+
name, version = url.path[1:].split(":", 1)
|
|
160
|
+
return Image(url.netloc, name, version)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _get_linter_action(
|
|
164
|
+
step: dict, session: requests_cache.CachedSession, verbose: bool
|
|
165
|
+
):
|
|
166
|
+
try:
|
|
167
|
+
id_parts = cast(str, step["uses"]).split("@", 1)
|
|
168
|
+
except KeyError:
|
|
169
|
+
return
|
|
170
|
+
|
|
171
|
+
action = id_parts[0]
|
|
172
|
+
action_version = id_parts[1] if len(id_parts) > 1 else None
|
|
173
|
+
image = _download_docker_image_id(action, action_version, session, verbose)
|
|
174
|
+
if not image:
|
|
175
|
+
return
|
|
176
|
+
|
|
177
|
+
try:
|
|
178
|
+
name = cast(str, step["name"])
|
|
179
|
+
except KeyError:
|
|
180
|
+
name = cast(str, step["uses"])
|
|
181
|
+
|
|
182
|
+
if verbose:
|
|
183
|
+
print(f'-- run-linter: Found {image.label} used by "{name}"')
|
|
184
|
+
|
|
185
|
+
try:
|
|
186
|
+
env = cast(dict[str, Any], step["env"])
|
|
187
|
+
except KeyError:
|
|
188
|
+
env = {}
|
|
189
|
+
|
|
190
|
+
_env: dict[str, str] = {}
|
|
191
|
+
for key in env:
|
|
192
|
+
value = env[key]
|
|
193
|
+
if isinstance(value, bool):
|
|
194
|
+
_env[key] = "true" if value else "false"
|
|
195
|
+
continue
|
|
196
|
+
if isinstance(value, str) and "${{" in value:
|
|
197
|
+
continue
|
|
198
|
+
_env[key] = value
|
|
199
|
+
|
|
200
|
+
return Step(name=name, image=image, env=_env)
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def _get_linter_actions(
|
|
204
|
+
data: dict, yml_name: str, session: requests_cache.CachedSession, verbose: bool
|
|
205
|
+
):
|
|
206
|
+
result: list[Job] = []
|
|
207
|
+
for job_id, job in cast(dict[str, dict], data["jobs"]).items():
|
|
208
|
+
steps: list[Step] = []
|
|
209
|
+
for step_def in cast(list[dict], job["steps"]):
|
|
210
|
+
step = _get_linter_action(step_def, session, verbose)
|
|
211
|
+
if step is None:
|
|
212
|
+
continue
|
|
213
|
+
steps.append(step)
|
|
214
|
+
|
|
215
|
+
if not steps:
|
|
216
|
+
continue
|
|
217
|
+
|
|
218
|
+
try:
|
|
219
|
+
name = cast(str, job["name"])
|
|
220
|
+
except KeyError:
|
|
221
|
+
name = job_id
|
|
222
|
+
|
|
223
|
+
if name != yml_name:
|
|
224
|
+
name = f"{yml_name} » {name}"
|
|
225
|
+
|
|
226
|
+
result.append(Job(name=name, steps=steps))
|
|
227
|
+
|
|
228
|
+
return result
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/data/templates/cmake.mustache
RENAMED
|
File without changes
|
{proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/ext/webidl/data/templates/depfile.mustache
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/base/.flow/flow.py.mustache
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/.flow/packages/cpack.cmake
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/CMakeGraphVizOptions.cmake
RENAMED
|
File without changes
|
{proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/CMakeLists.txt.mustache
RENAMED
|
File without changes
|
|
File without changes
|
{proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/data/assets/appicon.ico
RENAMED
|
File without changes
|
{proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/data/assets/appicon.png
RENAMED
|
File without changes
|
{proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/data/assets/wix_banner.bmp
RENAMED
|
File without changes
|
{proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/data/assets/wix_dialog.bmp
RENAMED
|
File without changes
|
{proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/data/icons/.gitignore
RENAMED
|
File without changes
|
|
File without changes
|
{proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/data/icons/appicon.svg
RENAMED
|
File without changes
|
{proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/src/main.cc.mustache
RENAMED
|
File without changes
|
|
File without changes
|
{proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/cmake/tests/test.cc.mustache
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/github_actions/CPPLINT.cfg
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{proj_flow-0.19.0 → proj_flow-0.20.1}/src/proj_flow/template/layers/github_social/CONTRIBUTING.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|