proj-flow 0.18.0__tar.gz → 0.20.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.
- {proj_flow-0.18.0 → proj_flow-0.20.0}/CHANGELOG.rst +16 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/PKG-INFO +2 -1
- {proj_flow-0.18.0 → proj_flow-0.20.0}/pyproject.toml +1 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/__init__.py +1 -1
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/api/makefile.py +1 -1
- proj_flow-0.20.0/src/proj_flow/ext/tools/__init__.py +13 -0
- proj_flow-0.20.0/src/proj_flow/ext/tools/pragma_once.py +40 -0
- proj_flow-0.20.0/src/proj_flow/ext/tools/run_linter.py +228 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/__init__.py +12 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/base/__init__.py +2 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/base/config.py +425 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/cli/__init__.py +10 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/cli/cmake.py +82 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/cli/depfile.py +83 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/cli/gen.py +157 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/cli/init.py +26 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/cli/root.py +12 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/cli/updater.py +20 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/data/init/flow_webidl.cmake +26 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/data/templates/cmake.mustache +45 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/data/templates/depfile.mustache +6 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/data/templates/partials/cxx/attribute-decl.mustache +1 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/data/templates/partials/cxx/in-out.mustache +2 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/data/templates/partials/cxx/includes.mustache +6 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/data/templates/partials/cxx/operation-decl.mustache +12 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/data/templates/partials/cxx/type.mustache +6 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/data/types/cxx.json +47 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/model/__init__.py +2 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/model/ast.py +586 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/model/builders.py +230 -0
- proj_flow-0.20.0/src/proj_flow/ext/webidl/registry.py +23 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/.flow/config.yaml +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/.gitignore +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/.readthedocs.yaml +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/LICENSE +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/README.md +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/ROADMAP.md +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/actions/bootstrap/action.yml +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/actions/bootstrap/version.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/__main__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/api/__init__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/api/arg.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/api/completers.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/api/ctx.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/api/env.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/api/init.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/api/release.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/api/step.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/base/__cmake_version__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/base/__init__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/base/cmd.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/base/inspect.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/base/matrix.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/base/name_list.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/base/plugins.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/base/registry.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/base/uname.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/cli/__init__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/cli/argument.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/cli/finder.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/dependency.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/__init__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/cplusplus/__init__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/cplusplus/cmake/__init__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/cplusplus/cmake/parser.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/cplusplus/cmake/presets.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/cplusplus/cmake/project.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/cplusplus/cmake/steps.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/cplusplus/conan/__init__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/cplusplus/conan/_conan.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/github/__init__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/github/cli.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/github/hosting.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/github/publishing.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/github/switches.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/markdown_changelog.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/python/__init__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/python/rtdocs.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/python/steps.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/python/version.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/re_structured_changelog.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/sign/__init__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/sign/api.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/sign/win32.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/ext/store.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/flow/__init__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/flow/configs.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/flow/layer.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/flow/steps.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/log/__init__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/log/commit.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/log/error.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/log/fmt.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/log/format.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/log/hosting/__init__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/log/hosting/github.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/log/msg.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/log/release.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/log/rich_text/__init__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/log/rich_text/api.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/log/rich_text/markdown.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/log/rich_text/re_structured_text.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/minimal/__init__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/minimal/base.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/minimal/bootstrap.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/minimal/ext/bug_report.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/minimal/init.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/minimal/list.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/minimal/run.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/minimal/system.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/project/__init__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/project/api.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/project/cplusplus/__init__.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/project/cplusplus/cmake_context.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/project/cplusplus/conan_context.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/project/cplusplus/project.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/project/data.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/project/interact.py +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/base/.clang-format +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/base/.flow/config.yml +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/base/.flow/flow.py.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/base/.flow/matrix.yml +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/base/.flow/official.yml +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/base/.gitignore +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/base/README.md.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/base/flow +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/base/flow.cmd +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/base.json +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/.flow/cmake/common.cmake.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/.flow/extensions/wall/__init__.py.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/.flow/extensions/wall/icons/__init__.py.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/.flow/extensions/wall/icons/magick.py.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/.flow/packages/base.cmake.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/.flow/packages/config.cmake +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/.flow/packages/cpack.cmake +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/.flow/packages/wix/cpack.cmake.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/.flow/packages/wix/patches.in.wix +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/.flow/packages/wix.cmake.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/CMakeGraphVizOptions.cmake +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/CMakeLists.txt.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/CMakePresets.json +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/data/assets/appicon.ico +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/data/assets/appicon.png +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/data/assets/wix_banner.bmp +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/data/assets/wix_dialog.bmp +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/data/icons/.gitignore +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/data/icons/appicon-mask.svg +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/data/icons/appicon.svg +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/src/main.cc.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/src/version.hpp.in.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake/tests/test.cc.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/cmake.json +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/conan/.flow/cmake/libcxx_toolchain.cmake +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/conan/.flow/cmake/output_dirs_setup.cmake +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/conan/conanfile.txt +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/conan.json +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/github_actions/.github/linters/.isort.cfg +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/github_actions/.github/linters/.mypy.ini +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/github_actions/.github/workflows/build.yml.auto-release +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/github_actions/.github/workflows/build.yml.basic +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/github_actions/.github/workflows/linter.yml +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/github_actions/CPPLINT.cfg +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/github_actions.json +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/github_social/.github/ISSUE_TEMPLATE/bug_report.md.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/github_social/.github/ISSUE_TEMPLATE/feature_request.md.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/github_social/CODE_OF_CONDUCT.md.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/github_social/CONTRIBUTING.md +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/layers/github_social.json +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/licenses/0BSD.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/licenses/MIT.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/licenses/Unlicense.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.0}/src/proj_flow/template/licenses/WTFPL.mustache +0 -0
- {proj_flow-0.18.0 → proj_flow-0.20.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.20.0 <https://github.com/mzdun/proj-flow/compare/v0.19.0...v0.20.0>`_ (2026-01-19)
|
|
8
|
+
=====================================================================================
|
|
9
|
+
|
|
10
|
+
New Features
|
|
11
|
+
------------
|
|
12
|
+
|
|
13
|
+
- add tools from templates to extension (`b6de775 <https://github.com/mzdun/proj-flow/commit/b6de775b6b3190ef1935dd8d2e99dc7e05ff4634>`_)
|
|
14
|
+
|
|
15
|
+
`0.19.0 <https://github.com/mzdun/proj-flow/compare/v0.18.0...v0.19.0>`_ (2026-01-18)
|
|
16
|
+
=====================================================================================
|
|
17
|
+
|
|
18
|
+
New Features
|
|
19
|
+
------------
|
|
20
|
+
|
|
21
|
+
- add codegen through WebIDL and {{mustache}} (`9cb7d52 <https://github.com/mzdun/proj-flow/commit/9cb7d527bb9529af6334514155f5b2aa2ce6f48d>`_)
|
|
22
|
+
|
|
7
23
|
`0.18.0 <https://github.com/mzdun/proj-flow/compare/v0.17.2...v0.18.0>`_ (2026-01-11)
|
|
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.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/
|
|
@@ -20,6 +20,7 @@ Requires-Python: >=3.10
|
|
|
20
20
|
Requires-Dist: argcomplete
|
|
21
21
|
Requires-Dist: chevron2021
|
|
22
22
|
Requires-Dist: prompt-toolkit
|
|
23
|
+
Requires-Dist: pywebidl2
|
|
23
24
|
Requires-Dist: pyyaml
|
|
24
25
|
Requires-Dist: toml
|
|
25
26
|
Description-Content-Type: text/markdown
|
|
@@ -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
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Copyright (c) 2026 Marcin Zdun
|
|
2
|
+
# This code is licensed under MIT license (see LICENSE for details)
|
|
3
|
+
|
|
4
|
+
"""
|
|
5
|
+
The **proj_flow.ext.webidl** provides ``webidl init``, ``webidl cmake``,
|
|
6
|
+
``webidl depfile``and ``webidl gen`` commands, allowing for simple
|
|
7
|
+
WebIDL/mustache generation.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from . import cli
|
|
11
|
+
|
|
12
|
+
__all__ = ["cli"]
|