cfengine 0.16.4__tar.gz → 0.16.6__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 (159) hide show
  1. {cfengine-0.16.4 → cfengine-0.16.6}/.github/workflows/lint-policy-in-other-repos.yml +7 -4
  2. {cfengine-0.16.4 → cfengine-0.16.6}/.github/workflows/update-syntax-description.yml +1 -1
  3. {cfengine-0.16.4 → cfengine-0.16.6}/PKG-INFO +1 -1
  4. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine.egg-info/PKG-INFO +1 -1
  5. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine.egg-info/SOURCES.txt +2 -0
  6. cfengine-0.16.6/src/cfengine.egg-info/scm_file_list.json +153 -0
  7. cfengine-0.16.6/src/cfengine.egg-info/scm_version.json +8 -0
  8. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/format.py +28 -13
  9. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/004_comments.expected.cf +7 -0
  10. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/011_macros.expected.cf +91 -0
  11. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/011_macros.input.cf +56 -0
  12. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/011_promises.expected.cf +1 -0
  13. {cfengine-0.16.4 → cfengine-0.16.6}/.github/dependabot.yml +0 -0
  14. {cfengine-0.16.4 → cfengine-0.16.6}/.github/workflows/make-check.yml +0 -0
  15. {cfengine-0.16.4 → cfengine-0.16.6}/.github/workflows/pypi-publish.yml +0 -0
  16. {cfengine-0.16.4 → cfengine-0.16.6}/.github/workflows/stale.yml +0 -0
  17. {cfengine-0.16.4 → cfengine-0.16.6}/.gitignore +0 -0
  18. {cfengine-0.16.4 → cfengine-0.16.6}/.python-version +0 -0
  19. {cfengine-0.16.4 → cfengine-0.16.6}/CLAUDE.md +0 -0
  20. {cfengine-0.16.4 → cfengine-0.16.6}/HACKING.md +0 -0
  21. {cfengine-0.16.4 → cfengine-0.16.6}/LICENSE +0 -0
  22. {cfengine-0.16.4 → cfengine-0.16.6}/Makefile +0 -0
  23. {cfengine-0.16.4 → cfengine-0.16.6}/README.md +0 -0
  24. {cfengine-0.16.4 → cfengine-0.16.6}/ci/01-install.sh +0 -0
  25. {cfengine-0.16.4 → cfengine-0.16.6}/ci/02-safe-tests.sh +0 -0
  26. {cfengine-0.16.4 → cfengine-0.16.6}/ci/03-unsafe-tests.sh +0 -0
  27. {cfengine-0.16.4 → cfengine-0.16.6}/pyproject.toml +0 -0
  28. {cfengine-0.16.4 → cfengine-0.16.6}/setup.cfg +0 -0
  29. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine.egg-info/dependency_links.txt +0 -0
  30. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine.egg-info/entry_points.txt +0 -0
  31. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine.egg-info/requires.txt +0 -0
  32. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine.egg-info/top_level.txt +0 -0
  33. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/__init__.py +0 -0
  34. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/__main__.py +0 -0
  35. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/changelog.py +0 -0
  36. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/commands.py +0 -0
  37. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/deptool-README.md +0 -0
  38. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/deptool.py +0 -0
  39. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/dev.py +0 -0
  40. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/docs.py +0 -0
  41. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/lint.py +0 -0
  42. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/lint_csv.py +0 -0
  43. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/lint_yml.py +0 -0
  44. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/main.py +0 -0
  45. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/masterfiles/__init__.py +0 -0
  46. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/masterfiles/analyze.py +0 -0
  47. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/masterfiles/check_download_matches_git.py +0 -0
  48. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/masterfiles/download.py +0 -0
  49. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/masterfiles/generate_git_tags.py +0 -0
  50. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/masterfiles/generate_release_information.py +0 -0
  51. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/masterfiles/generate_vcf_download.py +0 -0
  52. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/masterfiles/generate_vcf_git_checkout.py +0 -0
  53. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/paths.py +0 -0
  54. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/profile.py +0 -0
  55. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/shell.py +0 -0
  56. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/syntax-description.json +0 -0
  57. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/syntax_tree.py +0 -0
  58. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/up.py +0 -0
  59. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/utils.py +0 -0
  60. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/validate.py +0 -0
  61. {cfengine-0.16.4 → cfengine-0.16.6}/src/cfengine_cli/version.py +0 -0
  62. {cfengine-0.16.4 → cfengine-0.16.6}/tests/README.md +0 -0
  63. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/001_hello_world.expected.cf +0 -0
  64. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/001_hello_world.input.cf +0 -0
  65. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/002_basics.expected.cf +0 -0
  66. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/002_basics.input.cf +0 -0
  67. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/003_wrapping.expected.cf +0 -0
  68. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/003_wrapping.input.cf +0 -0
  69. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/004_comments.input.cf +0 -0
  70. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/005_bundle_comments.expected.cf +0 -0
  71. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/005_bundle_comments.input.cf +0 -0
  72. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/006_remove_empty_comments.expected.cf +0 -0
  73. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/006_remove_empty_comments.input.cf +0 -0
  74. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/007_class_guarded_empty_lines.expected.cf +0 -0
  75. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/007_class_guarded_empty_lines.input.cf +0 -0
  76. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/008_long_string.expected.cf +0 -0
  77. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/008_long_string.input.cf +0 -0
  78. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/009_single_line.expected.cf +0 -0
  79. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/009_single_line.input.cf +0 -0
  80. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/010_stakeholder.expected.cf +0 -0
  81. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/010_stakeholder.input.cf +0 -0
  82. {cfengine-0.16.4 → cfengine-0.16.6}/tests/format/011_promises.input.cf +0 -0
  83. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/001_hello_world.cf +0 -0
  84. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/002_deprecations.expected.txt +0 -0
  85. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/002_deprecations.x.cf +0 -0
  86. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/003_name_lowercase.cf +0 -0
  87. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/003_name_lowercase.expected.txt +0 -0
  88. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/003_name_lowercase.x.cf +0 -0
  89. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/004_block_type.cf +0 -0
  90. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/004_block_type.expected.txt +0 -0
  91. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/004_block_type.x.cf +0 -0
  92. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/005_syntax_error.cf +0 -0
  93. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/005_syntax_error.expected.txt +0 -0
  94. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/005_syntax_error.x.cf +0 -0
  95. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/006_empty_file.expected.txt +0 -0
  96. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/006_empty_file.x.cf +0 -0
  97. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/007_namespace.cf +0 -0
  98. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/007_namespace.expected.txt +0 -0
  99. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/007_namespace.x.cf +0 -0
  100. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/008_bundle_shadows_function.cf +0 -0
  101. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/008_bundle_shadows_function.expected.txt +0 -0
  102. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/008_bundle_shadows_function.x.cf +0 -0
  103. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/009_unknown_function_inside_vars.cf +0 -0
  104. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/009_unknown_function_inside_vars.expected.txt +0 -0
  105. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/009_unknown_function_inside_vars.x.cf +0 -0
  106. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/010_mutually_exclusive_types_vars.cf +0 -0
  107. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/010_mutually_exclusive_types_vars.expected.txt +0 -0
  108. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/010_mutually_exclusive_types_vars.x.cf +0 -0
  109. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/011_invalid_attributes.expected.txt +0 -0
  110. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/011_invalid_attributes.x.cf +0 -0
  111. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/012_function_call_arg_count.cf +0 -0
  112. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/012_function_call_arg_count.expected.txt +0 -0
  113. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/012_function_call_arg_count.x.cf +0 -0
  114. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/013_num_args_body.expected.txt +0 -0
  115. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/013_num_args_body.x.cf +0 -0
  116. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/013_num_args_bundle.expected.txt +0 -0
  117. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/013_num_args_bundle.x.cf +0 -0
  118. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/013_num_args_bundle_body.cf +0 -0
  119. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/014_variadic_func_arg_count.cf +0 -0
  120. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/014_variadic_func_arg_count.expected.txt +0 -0
  121. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/014_variadic_func_arg_count.x.cf +0 -0
  122. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/015_macro_multi_def_bundle.cf +0 -0
  123. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/015_macro_multi_def_bundle.expected.txt +0 -0
  124. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/015_macro_multi_def_bundle.x.cf +0 -0
  125. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/016_half_promises.cf +0 -0
  126. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/016_half_promises.expected.txt +0 -0
  127. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/016_half_promises.x.cf +0 -0
  128. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/017_implies_body.cf +0 -0
  129. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/017_implies_body.expected.txt +0 -0
  130. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/017_implies_body.x.cf +0 -0
  131. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/018_nested_calls.cf +0 -0
  132. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/018_nested_calls.expected.txt +0 -0
  133. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/018_nested_calls.x.cf +0 -0
  134. {cfengine-0.16.4 → cfengine-0.16.6}/tests/lint/019_bundle_name_expansion.cf +0 -0
  135. {cfengine-0.16.4 → cfengine-0.16.6}/tests/run-format-tests.sh +0 -0
  136. {cfengine-0.16.4 → cfengine-0.16.6}/tests/run-lint-tests.sh +0 -0
  137. {cfengine-0.16.4 → cfengine-0.16.6}/tests/run-shell-tests.sh +0 -0
  138. {cfengine-0.16.4 → cfengine-0.16.6}/tests/run-up-validate-tests.sh +0 -0
  139. {cfengine-0.16.4 → cfengine-0.16.6}/tests/shell/001-help.sh +0 -0
  140. {cfengine-0.16.4 → cfengine-0.16.6}/tests/shell/002-version.sh +0 -0
  141. {cfengine-0.16.4 → cfengine-0.16.6}/tests/shell/003-format.sh +0 -0
  142. {cfengine-0.16.4 → cfengine-0.16.6}/tests/shell/004-format-check.sh +0 -0
  143. {cfengine-0.16.4 → cfengine-0.16.6}/tests/shell/005-lint.sh +0 -0
  144. {cfengine-0.16.4 → cfengine-0.16.6}/tests/unit/__init__.py +0 -0
  145. {cfengine-0.16.4 → cfengine-0.16.6}/tests/unit/test_changelog.py +0 -0
  146. {cfengine-0.16.4 → cfengine-0.16.6}/tests/unit/test_deps.py +0 -0
  147. {cfengine-0.16.4 → cfengine-0.16.6}/tests/unit/test_format.py +0 -0
  148. {cfengine-0.16.4 → cfengine-0.16.6}/tests/unit/test_lint_csv.py +0 -0
  149. {cfengine-0.16.4 → cfengine-0.16.6}/tests/unit/test_lint_yml.py +0 -0
  150. {cfengine-0.16.4 → cfengine-0.16.6}/tests/unit/test_paths.py +0 -0
  151. {cfengine-0.16.4 → cfengine-0.16.6}/tests/unit/test_utils.py +0 -0
  152. {cfengine-0.16.4 → cfengine-0.16.6}/tests/unit/test_version.py +0 -0
  153. {cfengine-0.16.4 → cfengine-0.16.6}/tests/up-validate/001_complex_config.yaml +0 -0
  154. {cfengine-0.16.4 → cfengine-0.16.6}/tests/up-validate/002_version.x.yaml +0 -0
  155. {cfengine-0.16.4 → cfengine-0.16.6}/tests/up-validate/003_box.x.yaml +0 -0
  156. {cfengine-0.16.4 → cfengine-0.16.6}/tests/up-validate/004_count.x.yaml +0 -0
  157. {cfengine-0.16.4 → cfengine-0.16.6}/tests/up-validate/mocks/cloud_config.json +0 -0
  158. {cfengine-0.16.4 → cfengine-0.16.6}/tests/up-validate/mocks/vagrant +0 -0
  159. {cfengine-0.16.4 → cfengine-0.16.6}/uv.lock +0 -0
@@ -44,12 +44,15 @@ jobs:
44
44
  python -m pip install --upgrade pip
45
45
  python -m pip install uv
46
46
  make install
47
- - name: Run cfengine lint
47
+ - name: Check other repos with cfengine format and cfengine lint
48
48
  working-directory: cfengine-cli
49
49
  run: |
50
- uv run cfengine lint --strict no ../masterfiles
51
- uv run cfengine lint --strict no ../modules
52
- uv run cfengine lint --strict no ../documentation
50
+ # Linting should work with no errors on all the other repos:
51
+ uv run cfengine lint --strict no ../masterfiles ../documentation ../modules
52
+ # Formatting should work with no errors on all the other repos:
53
+ uv run cfengine format ../masterfiles ../documentation ../modules
54
+ # Linting should still work after formatting:
55
+ uv run cfengine lint --strict no ../masterfiles ../documentation ../modules
53
56
  # TODO: Add core when ready
54
57
  # TODO: Do all of them together, with strict, when ready;
55
58
  # uv run cfengine lint ../core ../masterfiles ../documentation ../modules
@@ -35,7 +35,7 @@ jobs:
35
35
  - name: Install cfengine
36
36
  run: |
37
37
  cf-remote --version master download --edition community ubuntu24 amd64 hub
38
- sudo dpkg -i ~/.cfengine/cf-remote/packages/cfengine-community*.deb
38
+ sudo dpkg -i ~/.cache/cfengine/cf-remote/packages/cfengine-community*.deb
39
39
  - name: Extract new syntax-description
40
40
  run: |
41
41
  (
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cfengine
3
- Version: 0.16.4
3
+ Version: 0.16.6
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cfengine
3
- Version: 0.16.4
3
+ Version: 0.16.6
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
@@ -21,6 +21,8 @@ src/cfengine.egg-info/SOURCES.txt
21
21
  src/cfengine.egg-info/dependency_links.txt
22
22
  src/cfengine.egg-info/entry_points.txt
23
23
  src/cfengine.egg-info/requires.txt
24
+ src/cfengine.egg-info/scm_file_list.json
25
+ src/cfengine.egg-info/scm_version.json
24
26
  src/cfengine.egg-info/top_level.txt
25
27
  src/cfengine_cli/__init__.py
26
28
  src/cfengine_cli/__main__.py
@@ -0,0 +1,153 @@
1
+ {
2
+ "files": [
3
+ "README.md",
4
+ "uv.lock",
5
+ "Makefile",
6
+ ".python-version",
7
+ "LICENSE",
8
+ "pyproject.toml",
9
+ "HACKING.md",
10
+ "CLAUDE.md",
11
+ ".gitignore",
12
+ "src/cfengine_cli/changelog.py",
13
+ "src/cfengine_cli/shell.py",
14
+ "src/cfengine_cli/__init__.py",
15
+ "src/cfengine_cli/version.py",
16
+ "src/cfengine_cli/lint_yml.py",
17
+ "src/cfengine_cli/profile.py",
18
+ "src/cfengine_cli/deptool-README.md",
19
+ "src/cfengine_cli/utils.py",
20
+ "src/cfengine_cli/format.py",
21
+ "src/cfengine_cli/syntax-description.json",
22
+ "src/cfengine_cli/docs.py",
23
+ "src/cfengine_cli/up.py",
24
+ "src/cfengine_cli/lint_csv.py",
25
+ "src/cfengine_cli/syntax_tree.py",
26
+ "src/cfengine_cli/main.py",
27
+ "src/cfengine_cli/deptool.py",
28
+ "src/cfengine_cli/lint.py",
29
+ "src/cfengine_cli/commands.py",
30
+ "src/cfengine_cli/validate.py",
31
+ "src/cfengine_cli/__main__.py",
32
+ "src/cfengine_cli/paths.py",
33
+ "src/cfengine_cli/dev.py",
34
+ "src/cfengine_cli/masterfiles/check_download_matches_git.py",
35
+ "src/cfengine_cli/masterfiles/generate_vcf_git_checkout.py",
36
+ "src/cfengine_cli/masterfiles/__init__.py",
37
+ "src/cfengine_cli/masterfiles/download.py",
38
+ "src/cfengine_cli/masterfiles/analyze.py",
39
+ "src/cfengine_cli/masterfiles/generate_release_information.py",
40
+ "src/cfengine_cli/masterfiles/generate_vcf_download.py",
41
+ "src/cfengine_cli/masterfiles/generate_git_tags.py",
42
+ "ci/01-install.sh",
43
+ "ci/02-safe-tests.sh",
44
+ "ci/03-unsafe-tests.sh",
45
+ "tests/README.md",
46
+ "tests/run-shell-tests.sh",
47
+ "tests/run-up-validate-tests.sh",
48
+ "tests/run-lint-tests.sh",
49
+ "tests/run-format-tests.sh",
50
+ "tests/lint/015_macro_multi_def_bundle.cf",
51
+ "tests/lint/010_mutually_exclusive_types_vars.cf",
52
+ "tests/lint/010_mutually_exclusive_types_vars.x.cf",
53
+ "tests/lint/013_num_args_body.expected.txt",
54
+ "tests/lint/007_namespace.x.cf",
55
+ "tests/lint/018_nested_calls.expected.txt",
56
+ "tests/lint/010_mutually_exclusive_types_vars.expected.txt",
57
+ "tests/lint/016_half_promises.expected.txt",
58
+ "tests/lint/002_deprecations.x.cf",
59
+ "tests/lint/009_unknown_function_inside_vars.cf",
60
+ "tests/lint/008_bundle_shadows_function.expected.txt",
61
+ "tests/lint/013_num_args_bundle.x.cf",
62
+ "tests/lint/017_implies_body.cf",
63
+ "tests/lint/017_implies_body.expected.txt",
64
+ "tests/lint/008_bundle_shadows_function.cf",
65
+ "tests/lint/003_name_lowercase.x.cf",
66
+ "tests/lint/009_unknown_function_inside_vars.x.cf",
67
+ "tests/lint/004_block_type.x.cf",
68
+ "tests/lint/011_invalid_attributes.expected.txt",
69
+ "tests/lint/005_syntax_error.cf",
70
+ "tests/lint/013_num_args_bundle_body.cf",
71
+ "tests/lint/003_name_lowercase.expected.txt",
72
+ "tests/lint/002_deprecations.expected.txt",
73
+ "tests/lint/013_num_args_bundle.expected.txt",
74
+ "tests/lint/012_function_call_arg_count.expected.txt",
75
+ "tests/lint/004_block_type.cf",
76
+ "tests/lint/005_syntax_error.x.cf",
77
+ "tests/lint/015_macro_multi_def_bundle.expected.txt",
78
+ "tests/lint/006_empty_file.expected.txt",
79
+ "tests/lint/014_variadic_func_arg_count.x.cf",
80
+ "tests/lint/004_block_type.expected.txt",
81
+ "tests/lint/016_half_promises.cf",
82
+ "tests/lint/018_nested_calls.x.cf",
83
+ "tests/lint/011_invalid_attributes.x.cf",
84
+ "tests/lint/018_nested_calls.cf",
85
+ "tests/lint/014_variadic_func_arg_count.cf",
86
+ "tests/lint/017_implies_body.x.cf",
87
+ "tests/lint/012_function_call_arg_count.x.cf",
88
+ "tests/lint/007_namespace.expected.txt",
89
+ "tests/lint/015_macro_multi_def_bundle.x.cf",
90
+ "tests/lint/019_bundle_name_expansion.cf",
91
+ "tests/lint/001_hello_world.cf",
92
+ "tests/lint/009_unknown_function_inside_vars.expected.txt",
93
+ "tests/lint/007_namespace.cf",
94
+ "tests/lint/014_variadic_func_arg_count.expected.txt",
95
+ "tests/lint/012_function_call_arg_count.cf",
96
+ "tests/lint/008_bundle_shadows_function.x.cf",
97
+ "tests/lint/013_num_args_body.x.cf",
98
+ "tests/lint/003_name_lowercase.cf",
99
+ "tests/lint/005_syntax_error.expected.txt",
100
+ "tests/lint/006_empty_file.x.cf",
101
+ "tests/lint/016_half_promises.x.cf",
102
+ "tests/shell/001-help.sh",
103
+ "tests/shell/002-version.sh",
104
+ "tests/shell/004-format-check.sh",
105
+ "tests/shell/005-lint.sh",
106
+ "tests/shell/003-format.sh",
107
+ "tests/up-validate/002_version.x.yaml",
108
+ "tests/up-validate/004_count.x.yaml",
109
+ "tests/up-validate/001_complex_config.yaml",
110
+ "tests/up-validate/003_box.x.yaml",
111
+ "tests/up-validate/mocks/vagrant",
112
+ "tests/up-validate/mocks/cloud_config.json",
113
+ "tests/format/003_wrapping.input.cf",
114
+ "tests/format/011_macros.expected.cf",
115
+ "tests/format/009_single_line.input.cf",
116
+ "tests/format/009_single_line.expected.cf",
117
+ "tests/format/010_stakeholder.input.cf",
118
+ "tests/format/007_class_guarded_empty_lines.expected.cf",
119
+ "tests/format/004_comments.expected.cf",
120
+ "tests/format/001_hello_world.input.cf",
121
+ "tests/format/011_promises.expected.cf",
122
+ "tests/format/006_remove_empty_comments.input.cf",
123
+ "tests/format/005_bundle_comments.expected.cf",
124
+ "tests/format/002_basics.expected.cf",
125
+ "tests/format/005_bundle_comments.input.cf",
126
+ "tests/format/006_remove_empty_comments.expected.cf",
127
+ "tests/format/007_class_guarded_empty_lines.input.cf",
128
+ "tests/format/003_wrapping.expected.cf",
129
+ "tests/format/010_stakeholder.expected.cf",
130
+ "tests/format/004_comments.input.cf",
131
+ "tests/format/001_hello_world.expected.cf",
132
+ "tests/format/011_promises.input.cf",
133
+ "tests/format/008_long_string.expected.cf",
134
+ "tests/format/008_long_string.input.cf",
135
+ "tests/format/002_basics.input.cf",
136
+ "tests/format/011_macros.input.cf",
137
+ "tests/unit/__init__.py",
138
+ "tests/unit/test_version.py",
139
+ "tests/unit/test_deps.py",
140
+ "tests/unit/test_utils.py",
141
+ "tests/unit/test_format.py",
142
+ "tests/unit/test_changelog.py",
143
+ "tests/unit/test_lint_csv.py",
144
+ "tests/unit/test_lint_yml.py",
145
+ "tests/unit/test_paths.py",
146
+ ".github/dependabot.yml",
147
+ ".github/workflows/lint-policy-in-other-repos.yml",
148
+ ".github/workflows/pypi-publish.yml",
149
+ ".github/workflows/make-check.yml",
150
+ ".github/workflows/stale.yml",
151
+ ".github/workflows/update-syntax-description.yml"
152
+ ]
153
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "tag": "0.16.6",
3
+ "distance": 0,
4
+ "node": "g3061a58921e7886d42aca895f62663654fb08a08",
5
+ "dirty": false,
6
+ "branch": "HEAD",
7
+ "node_date": "2026-06-24"
8
+ }
@@ -236,6 +236,11 @@ def split_generic_list(
236
236
  """Split list elements into one-per-line strings, each pre-indented."""
237
237
  has_macros = _contains_macro(middle)
238
238
  elements: list[str] = []
239
+ # Indices of the lines that end a top-level value element. For a nested
240
+ # element, like a function call inside an slist, this is only the final line,
241
+ # outside the function call, so we do not add trailing commas into function
242
+ # call argument lists.
243
+ value_end_indices: list[int] = []
239
244
  for element in middle:
240
245
  if elements and element.type == ",":
241
246
  elements[-1] = elements[-1] + ","
@@ -243,6 +248,9 @@ def split_generic_list(
243
248
  if element.type == "macro":
244
249
  elements.append(text(element))
245
250
  continue
251
+ if element.type == "comment":
252
+ elements.append(" " * indent + text(element))
253
+ continue
246
254
  line = " " * indent + stringify_single_line_node(element)
247
255
  # Strict < reserves 1 char for the comma appended after this check
248
256
  if len(line) < line_length:
@@ -251,14 +259,18 @@ def split_generic_list(
251
259
  lines = split_generic_value(element, indent, line_length)
252
260
  elements.append(" " * indent + lines[0])
253
261
  elements.extend(lines[1:])
262
+ value_end_indices.append(len(elements) - 1)
254
263
 
255
- # Adjust trailing commas: with macros, fix every non-macro element
256
- # (one per branch); without, fix only the last non-comment element.
264
+ # Set trailing commas
257
265
  if has_macros:
258
- for i, e in enumerate(elements):
259
- if not e.lstrip().startswith(("@", "#")):
260
- elements[i] = _set_trailing_comma(e, trailing_comma)
266
+ # With macros: Use the indices we counted earlier to ensure there
267
+ # are trailing commas at the right places (before macro, inside macro,
268
+ # after macros), but NOT inside the nested function calls which may
269
+ # be multi line
270
+ for i in value_end_indices:
271
+ elements[i] = _set_trailing_comma(elements[i], trailing_comma)
261
272
  else:
273
+ # No macros: Just ensure the last non-comment element has a trailing comma
262
274
  for i in reversed(range(len(elements))):
263
275
  if not elements[i].lstrip().startswith("#"):
264
276
  elements[i] = _set_trailing_comma(elements[i], trailing_comma)
@@ -765,14 +777,17 @@ def _needs_blank_line_before(child: Node, indent: int, line_length: int) -> bool
765
777
  return True
766
778
  if parent and parent.type in {"bundle_section", "class_guarded_promises"}:
767
779
  return prev.type in {"promise", "half_promise"} | CLASS_GUARD_TYPES
768
- if parent and parent.type in {"body_block_body", "promise_block_body"}:
769
- next_sib = _skip_comments(child.next_named_sibling, "next")
770
- if next_sib is None:
771
- return False
772
- # Leading comment for a class-guarded section preceded by
773
- # content above it.
774
- if next_sib.type in CLASS_GUARD_TYPES:
775
- return prev.type in CLASS_GUARD_TYPES | {"attribute"}
780
+ if parent and parent.type in {
781
+ "body_block_body",
782
+ "promise_block_body",
783
+ "class_guarded_body_attributes",
784
+ }:
785
+ # A comment is separated by a blank line from a preceding
786
+ # attribute or a preceding class-guarded block, so it reads as
787
+ # a leading comment for what follows (or a trailing comment for
788
+ # the block). This mirrors how a comment after a promise is
789
+ # separated in bundles.
790
+ return prev.type == "attribute" or prev.type in CLASS_GUARD_TYPES
776
791
  return False
777
792
 
778
793
  return False
@@ -83,11 +83,14 @@ body package_method apt
83
83
  package_list_command => "/usr/bin/dpkg -l";
84
84
  package_list_name_regex => "ii\s+([^\s]+).*";
85
85
  package_list_version_regex => "ii\s+[^\s]+\s+([^\s]+).*";
86
+
86
87
  # package_list_arch_regex => "none";
87
88
  package_installed_regex => ".*";
89
+
88
90
  # all reported are installed:
89
91
  # package_name_convention => "$(name)_$(version)_$(arch)";
90
92
  package_name_convention => "$(name)";
93
+
91
94
  # Use these only if not using a separate version/arch string:
92
95
  # package_version_regex => "";
93
96
  # package_name_regex => "";
@@ -95,6 +98,7 @@ body package_method apt
95
98
  package_add_command => "/usr/bin/apt-get --yes install";
96
99
  package_delete_command => "/usr/bin/apt-get --yes remove";
97
100
  package_update_command => "/usr/bin/apt-get --yes dist-upgrade";
101
+
98
102
  # package_verify_command => "/bin/rpm -V";
99
103
  }
100
104
 
@@ -107,6 +111,7 @@ body package_method ca
107
111
  body package_method ac
108
112
  {
109
113
  package_changes => "bulk";
114
+
110
115
  # bar
111
116
  }
112
117
 
@@ -114,6 +119,7 @@ body package_method cac
114
119
  {
115
120
  # foo
116
121
  package_changes => "bulk";
122
+
117
123
  # bar
118
124
  }
119
125
 
@@ -129,6 +135,7 @@ body package_method cgcac
129
135
  linux::
130
136
  # bar
131
137
  package_changes => "bulk";
138
+
132
139
  # baz
133
140
  }
134
141
 
@@ -200,3 +200,94 @@ bundle agent test(a)
200
200
  "$(a)";
201
201
  }
202
202
  @endif
203
+ bundle agent test_macro_call_param
204
+ {
205
+ classes:
206
+ "a" -> { "CFE-3927" }
207
+ and => {
208
+ # The variable must be defined
209
+ isvariable("default:def.control_agent_environment_vars"),
210
+ # The length of the variable must be greater than 0 (can't be an empty list)
211
+ isgreaterthan(length("default:def.control_agent_environment_vars"), 0),
212
+ # Each element of the list must be of the form KEY=VALUE
213
+ every(".+=.+", "default:def.control_agent_environment_vars"),
214
+ # In 3.18 and greater we can validate the type of variable in use
215
+ @if minimum_version(3.18.0)
216
+ regcmp(
217
+ "(policy slist|data array)",
218
+ type("default:def.control_agent_environment_vars", "true")
219
+ ),
220
+ @endif
221
+ };
222
+
223
+ "b" -> { "CFE-3927" }
224
+ and => {
225
+ # The variable must be defined
226
+ isvariable("default:def.control_agent_environment_vars"),
227
+ isgreaterthan(length("default:def.control_agent_environment_vars"), 0),
228
+ @if minimum_version(3.18.0)
229
+ regcmp(
230
+ "(policy slist|data array)",
231
+ type("default:def.control_agent_environment_vars", "true")
232
+ ),
233
+ @endif
234
+ every(".+=.+", "default:def.control_agent_environment_vars"),
235
+ };
236
+
237
+ "c" -> { "CFE-3927" }
238
+ and => {
239
+ # The variable must be defined
240
+ isvariable("default:def.control_agent_environment_vars"),
241
+ isgreaterthan(length("default:def.control_agent_environment_vars"), 0),
242
+ @if minimum_version(3.18.0)
243
+ regcmp(
244
+ "(policy slist|data array)",
245
+ type("default:def.control_agent_environment_vars", "true")
246
+ ),
247
+ every(".+=.+", "default:def.control_agent_environment_vars"),
248
+ @endif
249
+ };
250
+
251
+ "d" -> { "CFE-3927" }
252
+ and => {
253
+ @if minimum_version(3.18.0)
254
+ every(".+=.+", "default:def.control_agent_environment_vars"),
255
+ @endif
256
+ isvariable("default:def.control_agent_environment_vars"),
257
+ isgreaterthan(length("default:def.control_agent_environment_vars"), 0),
258
+ regcmp(
259
+ "(policy slist|data array)",
260
+ type("default:def.control_agent_environment_vars", "true")
261
+ ),
262
+ };
263
+
264
+ "e" -> { "CFE-3927" }
265
+ and => {
266
+ @if minimum_version(3.18.0)
267
+ "a",
268
+ @endif
269
+ "b",
270
+ "c",
271
+ "d",
272
+ isgreaterthan(length("default:def.control_agent_environment_vars"), 0),
273
+ regcmp(
274
+ "(policy slist|data array)",
275
+ type("default:def.control_agent_environment_vars", "true")
276
+ ),
277
+ };
278
+
279
+ "f" -> { "CFE-3927" }
280
+ and => {
281
+ isgreaterthan(length("default:def.control_agent_environment_vars"), 0),
282
+ regcmp(
283
+ "(policy slist|data array)",
284
+ type("default:def.control_agent_environment_vars", "true")
285
+ ),
286
+ "a",
287
+ "b",
288
+ "c",
289
+ @if minimum_version(3.18.0)
290
+ "d",
291
+ @endif
292
+ };
293
+ }
@@ -193,3 +193,59 @@ reports:
193
193
  "$(a)";
194
194
  }
195
195
  @endif
196
+
197
+ bundle agent test_macro_call_param
198
+ {
199
+ classes:
200
+ "a" -> { "CFE-3927" }
201
+ and => {
202
+ # The variable must be defined
203
+ isvariable("default:def.control_agent_environment_vars"),
204
+ # The length of the variable must be greater than 0 (can't be an empty list)
205
+ isgreaterthan(length("default:def.control_agent_environment_vars"), 0),
206
+ # Each element of the list must be of the form KEY=VALUE
207
+ every(".+=.+", "default:def.control_agent_environment_vars"),
208
+ # In 3.18 and greater we can validate the type of variable in use
209
+ @if minimum_version(3.18.0)
210
+ regcmp("(policy slist|data array)",type("default:def.control_agent_environment_vars", "true")),
211
+ @endif
212
+ };
213
+ "b" -> { "CFE-3927" }
214
+ and => {
215
+ # The variable must be defined
216
+ isvariable("default:def.control_agent_environment_vars"),isgreaterthan(length("default:def.control_agent_environment_vars"), 0),
217
+ @if minimum_version(3.18.0)
218
+ regcmp( "(policy slist|data array)", type("default:def.control_agent_environment_vars", "true") ),
219
+ @endif
220
+ every(".+=.+", "default:def.control_agent_environment_vars"),
221
+ };
222
+ "c" -> { "CFE-3927" }
223
+ and => {
224
+ # The variable must be defined
225
+ isvariable("default:def.control_agent_environment_vars"), isgreaterthan(length("default:def.control_agent_environment_vars"), 0),
226
+ @if minimum_version(3.18.0)
227
+ regcmp("(policy slist|data array)",type("default:def.control_agent_environment_vars", "true")),every(".+=.+", "default:def.control_agent_environment_vars"),
228
+ @endif
229
+ };
230
+ "d" -> { "CFE-3927" }
231
+ and => {
232
+ @if minimum_version(3.18.0)
233
+ every(".+=.+", "default:def.control_agent_environment_vars"),
234
+ @endif
235
+ isvariable("default:def.control_agent_environment_vars"),isgreaterthan(length("default:def.control_agent_environment_vars"), 0),regcmp("(policy slist|data array)",type("default:def.control_agent_environment_vars", "true")),
236
+ };
237
+ "e" -> { "CFE-3927" }
238
+ and => {
239
+ @if minimum_version(3.18.0)
240
+ "a",
241
+ @endif
242
+ "b","c","d",isgreaterthan(length("default:def.control_agent_environment_vars"),0),regcmp("(policy slist|data array)",type("default:def.control_agent_environment_vars", "true")),
243
+ };
244
+ "f" -> { "CFE-3927" }
245
+ and => {
246
+ isgreaterthan(length("default:def.control_agent_environment_vars"), 0),regcmp("(policy slist|data array)",type("default:def.control_agent_environment_vars", "true")),"a","b","c",
247
+ @if minimum_version(3.18.0)
248
+ "d",
249
+ @endif
250
+ };
251
+ }
@@ -120,6 +120,7 @@ body common control
120
120
  any::
121
121
  ignore_missing_bundles => "$(def.control_common_ignore_missing_bundles)";
122
122
  ignore_missing_inputs => "$(def.control_common_ignore_missing_inputs)";
123
+
123
124
  # The number of minutes after which last-seen entries are purged from cf_lastseen.lmdb
124
125
  lastseenexpireafter => "$(def.control_common_lastseenexpireafter)";
125
126
 
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