cfengine 0.22.0__tar.gz → 0.23.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 (178) hide show
  1. cfengine-0.23.0/.coveragerc +5 -0
  2. cfengine-0.23.0/.github/workflows/coverage.yml +35 -0
  3. {cfengine-0.22.0 → cfengine-0.23.0}/.github/workflows/renovate.yml +1 -1
  4. {cfengine-0.22.0 → cfengine-0.23.0}/.gitignore +3 -0
  5. {cfengine-0.22.0 → cfengine-0.23.0}/Makefile +14 -1
  6. {cfengine-0.22.0 → cfengine-0.23.0}/PKG-INFO +3 -3
  7. {cfengine-0.22.0 → cfengine-0.23.0}/pyproject.toml +3 -2
  8. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine.egg-info/PKG-INFO +3 -3
  9. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine.egg-info/SOURCES.txt +3 -0
  10. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine.egg-info/requires.txt +2 -2
  11. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine.egg-info/scm_file_list.json +3 -0
  12. cfengine-0.23.0/src/cfengine.egg-info/scm_version.json +8 -0
  13. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/syntax-description.json +141 -12
  14. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/004_block_type.expected.txt +1 -1
  15. cfengine-0.23.0/tests/lint/021_reactor_strtotime_silence.cf +13 -0
  16. {cfengine-0.22.0 → cfengine-0.23.0}/uv.lock +139 -9
  17. cfengine-0.22.0/src/cfengine.egg-info/scm_version.json +0 -8
  18. {cfengine-0.22.0 → cfengine-0.23.0}/.github/renovate-config.js +0 -0
  19. {cfengine-0.22.0 → cfengine-0.23.0}/.github/workflows/lint-policy-in-other-repos.yml +0 -0
  20. {cfengine-0.22.0 → cfengine-0.23.0}/.github/workflows/make-check.yml +0 -0
  21. {cfengine-0.22.0 → cfengine-0.23.0}/.github/workflows/pypi-publish.yml +0 -0
  22. {cfengine-0.22.0 → cfengine-0.23.0}/.github/workflows/stale.yml +0 -0
  23. {cfengine-0.22.0 → cfengine-0.23.0}/.github/workflows/update-syntax-description.yml +0 -0
  24. {cfengine-0.22.0 → cfengine-0.23.0}/.python-version +0 -0
  25. {cfengine-0.22.0 → cfengine-0.23.0}/CHEATSHEET.md +0 -0
  26. {cfengine-0.22.0 → cfengine-0.23.0}/CLAUDE.md +0 -0
  27. {cfengine-0.22.0 → cfengine-0.23.0}/HACKING.md +0 -0
  28. {cfengine-0.22.0 → cfengine-0.23.0}/LICENSE +0 -0
  29. {cfengine-0.22.0 → cfengine-0.23.0}/README.md +0 -0
  30. {cfengine-0.22.0 → cfengine-0.23.0}/ci/01-install.sh +0 -0
  31. {cfengine-0.22.0 → cfengine-0.23.0}/ci/02-safe-tests.sh +0 -0
  32. {cfengine-0.22.0 → cfengine-0.23.0}/ci/03-unsafe-tests.sh +0 -0
  33. {cfengine-0.22.0 → cfengine-0.23.0}/renovate.json +0 -0
  34. {cfengine-0.22.0 → cfengine-0.23.0}/setup.cfg +0 -0
  35. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine.egg-info/dependency_links.txt +0 -0
  36. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine.egg-info/entry_points.txt +0 -0
  37. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine.egg-info/top_level.txt +0 -0
  38. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/__init__.py +0 -0
  39. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/__main__.py +0 -0
  40. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/cfengine_wrapper/__init__.py +0 -0
  41. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/cfengine_wrapper/arg_parse.py +0 -0
  42. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/cfengine_wrapper/cfengine_commands.py +0 -0
  43. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/cfengine_wrapper/cfengine_objects.py +0 -0
  44. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/cfengine_wrapper/cfengine_utils.py +0 -0
  45. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/changelog.py +0 -0
  46. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/commands.py +0 -0
  47. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/deptool-README.md +0 -0
  48. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/deptool.py +0 -0
  49. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/dev.py +0 -0
  50. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/docs.py +0 -0
  51. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/format.py +0 -0
  52. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/initialize_project.py +0 -0
  53. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/lint.py +0 -0
  54. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/lint_csv.py +0 -0
  55. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/lint_yml.py +0 -0
  56. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/main.py +0 -0
  57. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/masterfiles/__init__.py +0 -0
  58. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/masterfiles/analyze.py +0 -0
  59. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/masterfiles/check_download_matches_git.py +0 -0
  60. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/masterfiles/download.py +0 -0
  61. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/masterfiles/generate_git_tags.py +0 -0
  62. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/masterfiles/generate_release_information.py +0 -0
  63. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/masterfiles/generate_vcf_download.py +0 -0
  64. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/masterfiles/generate_vcf_git_checkout.py +0 -0
  65. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/paths.py +0 -0
  66. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/profile.py +0 -0
  67. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/shell.py +0 -0
  68. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/syntax_tree.py +0 -0
  69. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/up.py +0 -0
  70. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/utils.py +0 -0
  71. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/validate.py +0 -0
  72. {cfengine-0.22.0 → cfengine-0.23.0}/src/cfengine_cli/version.py +0 -0
  73. {cfengine-0.22.0 → cfengine-0.23.0}/tests/README.md +0 -0
  74. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/001_hello_world.expected.cf +0 -0
  75. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/001_hello_world.input.cf +0 -0
  76. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/002_basics.expected.cf +0 -0
  77. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/002_basics.input.cf +0 -0
  78. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/003_wrapping.expected.cf +0 -0
  79. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/003_wrapping.input.cf +0 -0
  80. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/004_comments.expected.cf +0 -0
  81. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/004_comments.input.cf +0 -0
  82. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/005_bundle_comments.expected.cf +0 -0
  83. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/005_bundle_comments.input.cf +0 -0
  84. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/006_remove_empty_comments.expected.cf +0 -0
  85. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/006_remove_empty_comments.input.cf +0 -0
  86. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/007_class_guarded_empty_lines.expected.cf +0 -0
  87. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/007_class_guarded_empty_lines.input.cf +0 -0
  88. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/008_long_string.expected.cf +0 -0
  89. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/008_long_string.input.cf +0 -0
  90. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/009_single_line.expected.cf +0 -0
  91. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/009_single_line.input.cf +0 -0
  92. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/010_stakeholder.expected.cf +0 -0
  93. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/010_stakeholder.input.cf +0 -0
  94. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/011_macros.expected.cf +0 -0
  95. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/011_macros.input.cf +0 -0
  96. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/011_promises.expected.cf +0 -0
  97. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/011_promises.input.cf +0 -0
  98. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/012_sameline_comments.expected.cf +0 -0
  99. {cfengine-0.22.0 → cfengine-0.23.0}/tests/format/012_sameline_comments.input.cf +0 -0
  100. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/001_hello_world.cf +0 -0
  101. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/002_deprecations.expected.txt +0 -0
  102. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/002_deprecations.x.cf +0 -0
  103. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/003_name_lowercase.cf +0 -0
  104. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/003_name_lowercase.expected.txt +0 -0
  105. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/003_name_lowercase.x.cf +0 -0
  106. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/004_block_type.cf +0 -0
  107. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/004_block_type.x.cf +0 -0
  108. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/005_syntax_error.cf +0 -0
  109. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/005_syntax_error.expected.txt +0 -0
  110. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/005_syntax_error.x.cf +0 -0
  111. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/006_empty_file.expected.txt +0 -0
  112. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/006_empty_file.x.cf +0 -0
  113. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/007_namespace.cf +0 -0
  114. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/007_namespace.expected.txt +0 -0
  115. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/007_namespace.x.cf +0 -0
  116. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/008_bundle_shadows_function.cf +0 -0
  117. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/008_bundle_shadows_function.expected.txt +0 -0
  118. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/008_bundle_shadows_function.x.cf +0 -0
  119. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/009_unknown_function_inside_vars.cf +0 -0
  120. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/009_unknown_function_inside_vars.expected.txt +0 -0
  121. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/009_unknown_function_inside_vars.x.cf +0 -0
  122. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/010_mutually_exclusive_types_vars.cf +0 -0
  123. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/010_mutually_exclusive_types_vars.expected.txt +0 -0
  124. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/010_mutually_exclusive_types_vars.x.cf +0 -0
  125. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/011_invalid_attributes.expected.txt +0 -0
  126. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/011_invalid_attributes.x.cf +0 -0
  127. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/012_function_call_arg_count.cf +0 -0
  128. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/012_function_call_arg_count.expected.txt +0 -0
  129. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/012_function_call_arg_count.x.cf +0 -0
  130. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/013_num_args_body.expected.txt +0 -0
  131. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/013_num_args_body.x.cf +0 -0
  132. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/013_num_args_bundle.expected.txt +0 -0
  133. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/013_num_args_bundle.x.cf +0 -0
  134. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/013_num_args_bundle_body.cf +0 -0
  135. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/014_variadic_func_arg_count.cf +0 -0
  136. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/014_variadic_func_arg_count.expected.txt +0 -0
  137. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/014_variadic_func_arg_count.x.cf +0 -0
  138. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/015_macro_multi_def_bundle.cf +0 -0
  139. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/015_macro_multi_def_bundle.expected.txt +0 -0
  140. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/015_macro_multi_def_bundle.x.cf +0 -0
  141. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/016_half_promises.cf +0 -0
  142. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/016_half_promises.expected.txt +0 -0
  143. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/016_half_promises.x.cf +0 -0
  144. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/017_implies_body.cf +0 -0
  145. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/017_implies_body.expected.txt +0 -0
  146. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/017_implies_body.x.cf +0 -0
  147. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/018_nested_calls.cf +0 -0
  148. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/018_nested_calls.expected.txt +0 -0
  149. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/018_nested_calls.x.cf +0 -0
  150. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/019_bundle_name_expansion.cf +0 -0
  151. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/020_missing_braces.expected.txt +0 -0
  152. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/020_missing_braces.x.cf +0 -0
  153. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/020_missing_semicolon.expected.txt +0 -0
  154. {cfengine-0.22.0 → cfengine-0.23.0}/tests/lint/020_missing_semicolon.x.cf +0 -0
  155. {cfengine-0.22.0 → cfengine-0.23.0}/tests/run-format-tests.sh +0 -0
  156. {cfengine-0.22.0 → cfengine-0.23.0}/tests/run-lint-tests.sh +0 -0
  157. {cfengine-0.22.0 → cfengine-0.23.0}/tests/run-shell-tests.sh +0 -0
  158. {cfengine-0.22.0 → cfengine-0.23.0}/tests/run-up-validate-tests.sh +0 -0
  159. {cfengine-0.22.0 → cfengine-0.23.0}/tests/shell/001-help.sh +0 -0
  160. {cfengine-0.22.0 → cfengine-0.23.0}/tests/shell/002-version.sh +0 -0
  161. {cfengine-0.22.0 → cfengine-0.23.0}/tests/shell/003-format.sh +0 -0
  162. {cfengine-0.22.0 → cfengine-0.23.0}/tests/shell/004-format-check.sh +0 -0
  163. {cfengine-0.22.0 → cfengine-0.23.0}/tests/shell/005-lint.sh +0 -0
  164. {cfengine-0.22.0 → cfengine-0.23.0}/tests/unit/__init__.py +0 -0
  165. {cfengine-0.22.0 → cfengine-0.23.0}/tests/unit/test_changelog.py +0 -0
  166. {cfengine-0.22.0 → cfengine-0.23.0}/tests/unit/test_deps.py +0 -0
  167. {cfengine-0.22.0 → cfengine-0.23.0}/tests/unit/test_format.py +0 -0
  168. {cfengine-0.22.0 → cfengine-0.23.0}/tests/unit/test_lint_csv.py +0 -0
  169. {cfengine-0.22.0 → cfengine-0.23.0}/tests/unit/test_lint_yml.py +0 -0
  170. {cfengine-0.22.0 → cfengine-0.23.0}/tests/unit/test_paths.py +0 -0
  171. {cfengine-0.22.0 → cfengine-0.23.0}/tests/unit/test_utils.py +0 -0
  172. {cfengine-0.22.0 → cfengine-0.23.0}/tests/unit/test_version.py +0 -0
  173. {cfengine-0.22.0 → cfengine-0.23.0}/tests/up-validate/001_complex_config.yaml +0 -0
  174. {cfengine-0.22.0 → cfengine-0.23.0}/tests/up-validate/002_version.x.yaml +0 -0
  175. {cfengine-0.22.0 → cfengine-0.23.0}/tests/up-validate/003_box.x.yaml +0 -0
  176. {cfengine-0.22.0 → cfengine-0.23.0}/tests/up-validate/004_count.x.yaml +0 -0
  177. {cfengine-0.22.0 → cfengine-0.23.0}/tests/up-validate/mocks/cloud_config.json +0 -0
  178. {cfengine-0.22.0 → cfengine-0.23.0}/tests/up-validate/mocks/vagrant +0 -0
@@ -0,0 +1,5 @@
1
+ [run]
2
+ parallel = True
3
+ source = src
4
+ concurrency = multiprocessing
5
+ sigterm = True
@@ -0,0 +1,35 @@
1
+ name: Fetch and upload coverage
2
+
3
+ permissions:
4
+ id-token: write
5
+ on:
6
+ push:
7
+ branches: [main]
8
+ pull_request:
9
+ branches: [main]
10
+ jobs:
11
+ coverage:
12
+ if: contains(fromJSON('["cfengine","mendersoftware","NorthernTechHQ"]'), github.repository_owner)
13
+ runs-on: ubuntu-latest
14
+ name: setup-python
15
+ env:
16
+ PYTHON_VERSION: "3.10"
17
+ steps:
18
+ - uses: actions/checkout@v7
19
+ - uses: actions/setup-python@v7
20
+ with:
21
+ python-version: ${{ env.PYTHON_VERSION }}
22
+ - name: Install requirements
23
+ run: |
24
+ python -m pip install --upgrade pip
25
+ python -m pip install uv
26
+ uv lock --check
27
+ uv sync
28
+ - name: Run tests and collect coverage
29
+ run: make coverage
30
+ - name: Upload coverage reports to Codecov with GitHub Action
31
+ uses: codecov/codecov-action@v7
32
+ with:
33
+ use_oidc: true
34
+ env:
35
+ fail_ci_if_error: true
@@ -12,7 +12,7 @@ jobs:
12
12
  - name: Checkout
13
13
  uses: actions/checkout@v7.0.1
14
14
  - name: Self-hosted Renovate
15
- uses: renovatebot/github-action@v46.2.0
15
+ uses: renovatebot/github-action@v46.2.4
16
16
  with:
17
17
  configurationFile: .github/renovate-config.js
18
18
  token: ${{ secrets.RENOVATE_TOKEN }}
@@ -15,3 +15,6 @@ __pycache__
15
15
  git_diff_exists
16
16
  commit_message.txt
17
17
  black_output.txt
18
+ .coverage.*
19
+ .coverage
20
+ coverage.xml
@@ -1,4 +1,4 @@
1
- .PHONY: default format lint install check venv
1
+ .PHONY: default format lint install check venv coverage
2
2
 
3
3
  default: check
4
4
 
@@ -22,6 +22,19 @@ lint: venv
22
22
  install:
23
23
  pipx install --force --editable .
24
24
 
25
+
26
+ export COVERAGE_PROCESS_START = $(PWD)/.coveragerc
27
+ coverage:
28
+ uv run coverage erase
29
+ uv run coverage run --parallel-mode -m pytest
30
+ uv run bash tests/run-lint-tests.sh
31
+ uv run bash tests/run-format-tests.sh
32
+ uv run bash tests/run-shell-tests.sh
33
+ uv run bash tests/run-up-validate-tests.sh
34
+ uv run coverage combine
35
+ uv run coverage report --fail-under=50
36
+ uv run coverage xml
37
+
25
38
  check: venv format lint
26
39
  uv run pytest
27
40
  uv run bash tests/run-lint-tests.sh
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cfengine
3
- Version: 0.22.0
3
+ Version: 0.23.0
4
4
  Summary: Human-oriented CLI for interacting with CFEngine policy language, projects, and other CFEngine tools
5
5
  License: GNU GENERAL PUBLIC LICENSE
6
6
  Version 3, 29 June 2007
@@ -694,8 +694,8 @@ Classifier: Programming Language :: Python :: 3.13
694
694
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
695
695
  Requires-Python: >=3.10
696
696
  Description-Content-Type: text/markdown
697
- Requires-Dist: cf-remote>=0.9.4
698
- Requires-Dist: cfbs>=5.5.0
697
+ Requires-Dist: cf-remote>=0.9.5
698
+ Requires-Dist: cfbs>=5.7.0
699
699
  Requires-Dist: tree-sitter-cfengine>=1.1.12
700
700
  Requires-Dist: tree-sitter>=0.25
701
701
  Requires-Dist: markdown-it-py>=3.0.0
@@ -10,8 +10,8 @@ readme = "README.md"
10
10
  license = {file = "LICENSE"}
11
11
  requires-python = ">=3.10"
12
12
  dependencies = [
13
- "cf-remote>=0.9.4",
14
- "cfbs>=5.5.0",
13
+ "cf-remote>=0.9.5",
14
+ "cfbs>=5.7.0",
15
15
  "tree-sitter-cfengine>=1.1.12",
16
16
  "tree-sitter>=0.25",
17
17
  "markdown-it-py>=3.0.0",
@@ -56,4 +56,5 @@ venv = ".venv"
56
56
  dev = [
57
57
  "flake8>=7.1.2",
58
58
  "pytest>=8.3.4",
59
+ "coverage; python_version >= '3.10'",
59
60
  ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cfengine
3
- Version: 0.22.0
3
+ Version: 0.23.0
4
4
  Summary: Human-oriented CLI for interacting with CFEngine policy language, projects, and other CFEngine tools
5
5
  License: GNU GENERAL PUBLIC LICENSE
6
6
  Version 3, 29 June 2007
@@ -694,8 +694,8 @@ Classifier: Programming Language :: Python :: 3.13
694
694
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
695
695
  Requires-Python: >=3.10
696
696
  Description-Content-Type: text/markdown
697
- Requires-Dist: cf-remote>=0.9.4
698
- Requires-Dist: cfbs>=5.5.0
697
+ Requires-Dist: cf-remote>=0.9.5
698
+ Requires-Dist: cfbs>=5.7.0
699
699
  Requires-Dist: tree-sitter-cfengine>=1.1.12
700
700
  Requires-Dist: tree-sitter>=0.25
701
701
  Requires-Dist: markdown-it-py>=3.0.0
@@ -1,3 +1,4 @@
1
+ .coveragerc
1
2
  .gitignore
2
3
  .python-version
3
4
  CHEATSHEET.md
@@ -10,6 +11,7 @@ pyproject.toml
10
11
  renovate.json
11
12
  uv.lock
12
13
  .github/renovate-config.js
14
+ .github/workflows/coverage.yml
13
15
  .github/workflows/lint-policy-in-other-repos.yml
14
16
  .github/workflows/make-check.yml
15
17
  .github/workflows/pypi-publish.yml
@@ -150,6 +152,7 @@ tests/lint/020_missing_braces.expected.txt
150
152
  tests/lint/020_missing_braces.x.cf
151
153
  tests/lint/020_missing_semicolon.expected.txt
152
154
  tests/lint/020_missing_semicolon.x.cf
155
+ tests/lint/021_reactor_strtotime_silence.cf
153
156
  tests/shell/001-help.sh
154
157
  tests/shell/002-version.sh
155
158
  tests/shell/003-format.sh
@@ -1,5 +1,5 @@
1
- cf-remote>=0.9.4
2
- cfbs>=5.5.0
1
+ cf-remote>=0.9.5
2
+ cfbs>=5.7.0
3
3
  tree-sitter-cfengine>=1.1.12
4
4
  tree-sitter>=0.25
5
5
  markdown-it-py>=3.0.0
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "files": [
3
+ ".coveragerc",
3
4
  ".github/renovate-config.js",
5
+ ".github/workflows/coverage.yml",
4
6
  ".github/workflows/lint-policy-in-other-repos.yml",
5
7
  ".github/workflows/make-check.yml",
6
8
  ".github/workflows/pypi-publish.yml",
@@ -139,6 +141,7 @@
139
141
  "tests/lint/020_missing_braces.x.cf",
140
142
  "tests/lint/020_missing_semicolon.expected.txt",
141
143
  "tests/lint/020_missing_semicolon.x.cf",
144
+ "tests/lint/021_reactor_strtotime_silence.cf",
142
145
  "tests/run-format-tests.sh",
143
146
  "tests/run-lint-tests.sh",
144
147
  "tests/run-shell-tests.sh",
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.23.0",
3
+ "distance": 0,
4
+ "node": "g84b74857fd8422df1bab53eff69c35c49d96cf92",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-08-26"
8
+ }
@@ -525,6 +525,13 @@
525
525
  "type": "option",
526
526
  "visibility": "body"
527
527
  },
528
+ "silence": {
529
+ "attribute": "silence",
530
+ "range": "content|add|remove|owner|group|perms|device|mtime|inode|stats|all",
531
+ "status": "normal",
532
+ "type": "slist",
533
+ "visibility": "body"
534
+ },
528
535
  "update_hashes": {
529
536
  "attribute": "update_hashes",
530
537
  "range": "true,false,yes,no,on,off",
@@ -3357,6 +3364,17 @@
3357
3364
  ],
3358
3365
  "status": "normal"
3359
3366
  },
3367
+ "reactor": {
3368
+ "promiseTypes": [
3369
+ "events",
3370
+ "classes",
3371
+ "defaults",
3372
+ "meta",
3373
+ "reports",
3374
+ "vars"
3375
+ ],
3376
+ "status": "normal"
3377
+ },
3360
3378
  "server": {
3361
3379
  "promiseTypes": [
3362
3380
  "access",
@@ -3439,7 +3457,9 @@
3439
3457
  "category": "data",
3440
3458
  "collecting": false,
3441
3459
  "minArgs": 0,
3442
- "parameters": [],
3460
+ "parameters": [
3461
+ { "description": "Class expression", "range": ".*", "type": "string" }
3462
+ ],
3443
3463
  "returnType": "context",
3444
3464
  "status": "normal",
3445
3465
  "variadic": true
@@ -3653,7 +3673,18 @@
3653
3673
  "category": "utils",
3654
3674
  "collecting": false,
3655
3675
  "minArgs": 1,
3656
- "parameters": [],
3676
+ "parameters": [
3677
+ {
3678
+ "description": "Regular expression",
3679
+ "range": ".*",
3680
+ "type": "string"
3681
+ },
3682
+ {
3683
+ "description": "Tag regular expression",
3684
+ "range": ".*",
3685
+ "type": "string"
3686
+ }
3687
+ ],
3657
3688
  "returnType": "slist",
3658
3689
  "status": "normal",
3659
3690
  "variadic": true
@@ -3729,7 +3760,18 @@
3729
3760
  "category": "utils",
3730
3761
  "collecting": false,
3731
3762
  "minArgs": 1,
3732
- "parameters": [],
3763
+ "parameters": [
3764
+ {
3765
+ "description": "Regular expression",
3766
+ "range": ".*",
3767
+ "type": "string"
3768
+ },
3769
+ {
3770
+ "description": "Tag regular expression",
3771
+ "range": ".*",
3772
+ "type": "string"
3773
+ }
3774
+ ],
3733
3775
  "returnType": "context",
3734
3776
  "status": "normal",
3735
3777
  "variadic": true
@@ -3739,7 +3781,13 @@
3739
3781
  "category": "data",
3740
3782
  "collecting": false,
3741
3783
  "minArgs": 0,
3742
- "parameters": [],
3784
+ "parameters": [
3785
+ {
3786
+ "description": "String to concatenate",
3787
+ "range": ".*",
3788
+ "type": "string"
3789
+ }
3790
+ ],
3743
3791
  "returnType": "string",
3744
3792
  "status": "normal",
3745
3793
  "variadic": true
@@ -3749,7 +3797,18 @@
3749
3797
  "category": "utils",
3750
3798
  "collecting": false,
3751
3799
  "minArgs": 1,
3752
- "parameters": [],
3800
+ "parameters": [
3801
+ {
3802
+ "description": "Regular expression",
3803
+ "range": ".*",
3804
+ "type": "string"
3805
+ },
3806
+ {
3807
+ "description": "Tag regular expression",
3808
+ "range": ".*",
3809
+ "type": "string"
3810
+ }
3811
+ ],
3753
3812
  "returnType": "int",
3754
3813
  "status": "normal",
3755
3814
  "variadic": true
@@ -4192,7 +4251,13 @@
4192
4251
  "category": "files",
4193
4252
  "collecting": false,
4194
4253
  "minArgs": 1,
4195
- "parameters": [],
4254
+ "parameters": [
4255
+ {
4256
+ "description": "Glob pattern to match files",
4257
+ "range": ".*",
4258
+ "type": "string"
4259
+ }
4260
+ ],
4196
4261
  "returnType": "slist",
4197
4262
  "status": "normal",
4198
4263
  "variadic": true
@@ -4737,7 +4802,14 @@
4737
4802
  "category": "data",
4738
4803
  "collecting": false,
4739
4804
  "minArgs": 1,
4740
- "parameters": [],
4805
+ "parameters": [
4806
+ { "description": "Class expression", "range": ".*", "type": "string" },
4807
+ {
4808
+ "description": "Value if the preceding class expression is true",
4809
+ "range": ".*",
4810
+ "type": "string"
4811
+ }
4812
+ ],
4741
4813
  "returnType": "string",
4742
4814
  "status": "normal",
4743
4815
  "variadic": true
@@ -5353,7 +5425,18 @@
5353
5425
  "category": "data",
5354
5426
  "collecting": true,
5355
5427
  "minArgs": 1,
5356
- "parameters": [],
5428
+ "parameters": [
5429
+ {
5430
+ "description": "CFEngine variable identifier or inline JSON",
5431
+ "range": ".*",
5432
+ "type": "string"
5433
+ },
5434
+ {
5435
+ "description": "CFEngine variable identifier or inline JSON",
5436
+ "range": ".*",
5437
+ "type": "string"
5438
+ }
5439
+ ],
5357
5440
  "returnType": "data",
5358
5441
  "status": "normal",
5359
5442
  "variadic": true
@@ -5476,7 +5559,9 @@
5476
5559
  "category": "data",
5477
5560
  "collecting": false,
5478
5561
  "minArgs": 0,
5479
- "parameters": [],
5562
+ "parameters": [
5563
+ { "description": "Class expression", "range": ".*", "type": "string" }
5564
+ ],
5480
5565
  "returnType": "context",
5481
5566
  "status": "normal",
5482
5567
  "variadic": true
@@ -6799,7 +6884,18 @@
6799
6884
  "collecting": true,
6800
6885
  "maxArgs": 2,
6801
6886
  "minArgs": 1,
6802
- "parameters": [],
6887
+ "parameters": [
6888
+ {
6889
+ "description": "Mustache template string",
6890
+ "range": ".*",
6891
+ "type": "string"
6892
+ },
6893
+ {
6894
+ "description": "CFEngine variable identifier or inline JSON, can be blank",
6895
+ "range": ".*",
6896
+ "type": "string"
6897
+ }
6898
+ ],
6803
6899
  "returnType": "string",
6804
6900
  "status": "normal",
6805
6901
  "variadic": true
@@ -6898,6 +6994,17 @@
6898
6994
  "status": "normal",
6899
6995
  "variadic": false
6900
6996
  },
6997
+ "strtotime": {
6998
+ "cached": false,
6999
+ "category": "data",
7000
+ "collecting": false,
7001
+ "parameters": [
7002
+ { "description": "String to parse", "range": ".*", "type": "string" }
7003
+ ],
7004
+ "returnType": "int",
7005
+ "status": "normal",
7006
+ "variadic": false
7007
+ },
6901
7008
  "sublist": {
6902
7009
  "cached": false,
6903
7010
  "category": "data",
@@ -7138,7 +7245,18 @@
7138
7245
  "category": "data",
7139
7246
  "collecting": false,
7140
7247
  "minArgs": 1,
7141
- "parameters": [],
7248
+ "parameters": [
7249
+ {
7250
+ "description": "Regular expression",
7251
+ "range": ".*",
7252
+ "type": "string"
7253
+ },
7254
+ {
7255
+ "description": "Tag regular expression",
7256
+ "range": ".*",
7257
+ "type": "string"
7258
+ }
7259
+ ],
7142
7260
  "returnType": "slist",
7143
7261
  "status": "normal",
7144
7262
  "variadic": true
@@ -7148,7 +7266,18 @@
7148
7266
  "category": "data",
7149
7267
  "collecting": false,
7150
7268
  "minArgs": 1,
7151
- "parameters": [],
7269
+ "parameters": [
7270
+ {
7271
+ "description": "Regular expression",
7272
+ "range": ".*",
7273
+ "type": "string"
7274
+ },
7275
+ {
7276
+ "description": "Tag regular expression",
7277
+ "range": ".*",
7278
+ "type": "string"
7279
+ }
7280
+ ],
7152
7281
  "returnType": "data",
7153
7282
  "status": "normal",
7154
7283
  "variadic": true
@@ -1,7 +1,7 @@
1
1
 
2
2
  bundle notavalidtype my_bundle
3
3
  ^-----------^
4
- Error: Bundle type must be one of (agent, common, edit_line, edit_xml, monitor, server, watch), not 'notavalidtype' at tests/lint/004_block_type.x.cf:1:8
4
+ Error: Bundle type must be one of (agent, common, edit_line, edit_xml, monitor, reactor, server, watch), not 'notavalidtype' at tests/lint/004_block_type.x.cf:1:8
5
5
 
6
6
 
7
7
  promise server my_promise_type
@@ -0,0 +1,13 @@
1
+ body changes my_changes
2
+ {
3
+ silence => { "mtime", "content" };
4
+ }
5
+
6
+ bundle reactor my_reactor
7
+ {
8
+ vars:
9
+ "timestamp" int => strtotime("2026-08-26");
10
+
11
+ reports:
12
+ "Parsed timestamp => $(timestamp)";
13
+ }