cfengine 0.16.1__tar.gz → 0.16.2__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 (157) hide show
  1. {cfengine-0.16.1 → cfengine-0.16.2}/PKG-INFO +1 -1
  2. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine.egg-info/PKG-INFO +1 -1
  3. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/format.py +21 -8
  4. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/006_remove_empty_comments.expected.cf +21 -0
  5. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/006_remove_empty_comments.input.cf +50 -0
  6. {cfengine-0.16.1 → cfengine-0.16.2}/.github/dependabot.yml +0 -0
  7. {cfengine-0.16.1 → cfengine-0.16.2}/.github/workflows/lint-policy-in-other-repos.yml +0 -0
  8. {cfengine-0.16.1 → cfengine-0.16.2}/.github/workflows/make-check.yml +0 -0
  9. {cfengine-0.16.1 → cfengine-0.16.2}/.github/workflows/pypi-publish.yml +0 -0
  10. {cfengine-0.16.1 → cfengine-0.16.2}/.github/workflows/stale.yml +0 -0
  11. {cfengine-0.16.1 → cfengine-0.16.2}/.github/workflows/update-syntax-description.yml +0 -0
  12. {cfengine-0.16.1 → cfengine-0.16.2}/.gitignore +0 -0
  13. {cfengine-0.16.1 → cfengine-0.16.2}/.python-version +0 -0
  14. {cfengine-0.16.1 → cfengine-0.16.2}/CLAUDE.md +0 -0
  15. {cfengine-0.16.1 → cfengine-0.16.2}/HACKING.md +0 -0
  16. {cfengine-0.16.1 → cfengine-0.16.2}/LICENSE +0 -0
  17. {cfengine-0.16.1 → cfengine-0.16.2}/Makefile +0 -0
  18. {cfengine-0.16.1 → cfengine-0.16.2}/README.md +0 -0
  19. {cfengine-0.16.1 → cfengine-0.16.2}/ci/01-install.sh +0 -0
  20. {cfengine-0.16.1 → cfengine-0.16.2}/ci/02-safe-tests.sh +0 -0
  21. {cfengine-0.16.1 → cfengine-0.16.2}/ci/03-unsafe-tests.sh +0 -0
  22. {cfengine-0.16.1 → cfengine-0.16.2}/pyproject.toml +0 -0
  23. {cfengine-0.16.1 → cfengine-0.16.2}/setup.cfg +0 -0
  24. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine.egg-info/SOURCES.txt +0 -0
  25. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine.egg-info/dependency_links.txt +0 -0
  26. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine.egg-info/entry_points.txt +0 -0
  27. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine.egg-info/requires.txt +0 -0
  28. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine.egg-info/top_level.txt +0 -0
  29. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/__init__.py +0 -0
  30. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/__main__.py +0 -0
  31. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/changelog.py +0 -0
  32. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/commands.py +0 -0
  33. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/deptool-README.md +0 -0
  34. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/deptool.py +0 -0
  35. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/dev.py +0 -0
  36. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/docs.py +0 -0
  37. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/lint.py +0 -0
  38. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/lint_csv.py +0 -0
  39. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/lint_yml.py +0 -0
  40. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/main.py +0 -0
  41. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/masterfiles/__init__.py +0 -0
  42. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/masterfiles/analyze.py +0 -0
  43. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/masterfiles/check_download_matches_git.py +0 -0
  44. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/masterfiles/download.py +0 -0
  45. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/masterfiles/generate_git_tags.py +0 -0
  46. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/masterfiles/generate_release_information.py +0 -0
  47. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/masterfiles/generate_vcf_download.py +0 -0
  48. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/masterfiles/generate_vcf_git_checkout.py +0 -0
  49. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/paths.py +0 -0
  50. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/profile.py +0 -0
  51. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/shell.py +0 -0
  52. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/syntax-description.json +0 -0
  53. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/syntax_tree.py +0 -0
  54. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/up.py +0 -0
  55. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/utils.py +0 -0
  56. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/validate.py +0 -0
  57. {cfengine-0.16.1 → cfengine-0.16.2}/src/cfengine_cli/version.py +0 -0
  58. {cfengine-0.16.1 → cfengine-0.16.2}/tests/README.md +0 -0
  59. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/001_hello_world.expected.cf +0 -0
  60. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/001_hello_world.input.cf +0 -0
  61. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/002_basics.expected.cf +0 -0
  62. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/002_basics.input.cf +0 -0
  63. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/003_wrapping.expected.cf +0 -0
  64. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/003_wrapping.input.cf +0 -0
  65. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/004_comments.expected.cf +0 -0
  66. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/004_comments.input.cf +0 -0
  67. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/005_bundle_comments.expected.cf +0 -0
  68. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/005_bundle_comments.input.cf +0 -0
  69. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/007_class_guarded_empty_lines.expected.cf +0 -0
  70. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/007_class_guarded_empty_lines.input.cf +0 -0
  71. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/008_long_string.expected.cf +0 -0
  72. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/008_long_string.input.cf +0 -0
  73. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/009_single_line.expected.cf +0 -0
  74. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/009_single_line.input.cf +0 -0
  75. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/010_stakeholder.expected.cf +0 -0
  76. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/010_stakeholder.input.cf +0 -0
  77. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/011_macros.expected.cf +0 -0
  78. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/011_macros.input.cf +0 -0
  79. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/011_promises.expected.cf +0 -0
  80. {cfengine-0.16.1 → cfengine-0.16.2}/tests/format/011_promises.input.cf +0 -0
  81. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/001_hello_world.cf +0 -0
  82. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/002_deprecations.expected.txt +0 -0
  83. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/002_deprecations.x.cf +0 -0
  84. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/003_name_lowercase.cf +0 -0
  85. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/003_name_lowercase.expected.txt +0 -0
  86. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/003_name_lowercase.x.cf +0 -0
  87. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/004_block_type.cf +0 -0
  88. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/004_block_type.expected.txt +0 -0
  89. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/004_block_type.x.cf +0 -0
  90. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/005_syntax_error.cf +0 -0
  91. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/005_syntax_error.expected.txt +0 -0
  92. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/005_syntax_error.x.cf +0 -0
  93. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/006_empty_file.expected.txt +0 -0
  94. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/006_empty_file.x.cf +0 -0
  95. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/007_namespace.cf +0 -0
  96. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/007_namespace.expected.txt +0 -0
  97. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/007_namespace.x.cf +0 -0
  98. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/008_bundle_shadows_function.cf +0 -0
  99. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/008_bundle_shadows_function.expected.txt +0 -0
  100. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/008_bundle_shadows_function.x.cf +0 -0
  101. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/009_unknown_function_inside_vars.cf +0 -0
  102. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/009_unknown_function_inside_vars.expected.txt +0 -0
  103. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/009_unknown_function_inside_vars.x.cf +0 -0
  104. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/010_mutually_exclusive_types_vars.cf +0 -0
  105. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/010_mutually_exclusive_types_vars.expected.txt +0 -0
  106. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/010_mutually_exclusive_types_vars.x.cf +0 -0
  107. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/011_invalid_attributes.expected.txt +0 -0
  108. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/011_invalid_attributes.x.cf +0 -0
  109. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/012_function_call_arg_count.cf +0 -0
  110. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/012_function_call_arg_count.expected.txt +0 -0
  111. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/012_function_call_arg_count.x.cf +0 -0
  112. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/013_num_args_body.expected.txt +0 -0
  113. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/013_num_args_body.x.cf +0 -0
  114. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/013_num_args_bundle.expected.txt +0 -0
  115. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/013_num_args_bundle.x.cf +0 -0
  116. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/013_num_args_bundle_body.cf +0 -0
  117. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/014_variadic_func_arg_count.cf +0 -0
  118. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/014_variadic_func_arg_count.expected.txt +0 -0
  119. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/014_variadic_func_arg_count.x.cf +0 -0
  120. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/015_macro_multi_def_bundle.cf +0 -0
  121. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/015_macro_multi_def_bundle.expected.txt +0 -0
  122. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/015_macro_multi_def_bundle.x.cf +0 -0
  123. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/016_half_promises.cf +0 -0
  124. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/016_half_promises.expected.txt +0 -0
  125. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/016_half_promises.x.cf +0 -0
  126. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/017_implies_body.cf +0 -0
  127. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/017_implies_body.expected.txt +0 -0
  128. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/017_implies_body.x.cf +0 -0
  129. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/018_nested_calls.cf +0 -0
  130. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/018_nested_calls.expected.txt +0 -0
  131. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/018_nested_calls.x.cf +0 -0
  132. {cfengine-0.16.1 → cfengine-0.16.2}/tests/lint/019_bundle_name_expansion.cf +0 -0
  133. {cfengine-0.16.1 → cfengine-0.16.2}/tests/run-format-tests.sh +0 -0
  134. {cfengine-0.16.1 → cfengine-0.16.2}/tests/run-lint-tests.sh +0 -0
  135. {cfengine-0.16.1 → cfengine-0.16.2}/tests/run-shell-tests.sh +0 -0
  136. {cfengine-0.16.1 → cfengine-0.16.2}/tests/run-up-validate-tests.sh +0 -0
  137. {cfengine-0.16.1 → cfengine-0.16.2}/tests/shell/001-help.sh +0 -0
  138. {cfengine-0.16.1 → cfengine-0.16.2}/tests/shell/002-version.sh +0 -0
  139. {cfengine-0.16.1 → cfengine-0.16.2}/tests/shell/003-format.sh +0 -0
  140. {cfengine-0.16.1 → cfengine-0.16.2}/tests/shell/004-format-check.sh +0 -0
  141. {cfengine-0.16.1 → cfengine-0.16.2}/tests/shell/005-lint.sh +0 -0
  142. {cfengine-0.16.1 → cfengine-0.16.2}/tests/unit/__init__.py +0 -0
  143. {cfengine-0.16.1 → cfengine-0.16.2}/tests/unit/test_changelog.py +0 -0
  144. {cfengine-0.16.1 → cfengine-0.16.2}/tests/unit/test_deps.py +0 -0
  145. {cfengine-0.16.1 → cfengine-0.16.2}/tests/unit/test_format.py +0 -0
  146. {cfengine-0.16.1 → cfengine-0.16.2}/tests/unit/test_lint_csv.py +0 -0
  147. {cfengine-0.16.1 → cfengine-0.16.2}/tests/unit/test_lint_yml.py +0 -0
  148. {cfengine-0.16.1 → cfengine-0.16.2}/tests/unit/test_paths.py +0 -0
  149. {cfengine-0.16.1 → cfengine-0.16.2}/tests/unit/test_utils.py +0 -0
  150. {cfengine-0.16.1 → cfengine-0.16.2}/tests/unit/test_version.py +0 -0
  151. {cfengine-0.16.1 → cfengine-0.16.2}/tests/up-validate/001_complex_config.yaml +0 -0
  152. {cfengine-0.16.1 → cfengine-0.16.2}/tests/up-validate/002_version.x.yaml +0 -0
  153. {cfengine-0.16.1 → cfengine-0.16.2}/tests/up-validate/003_box.x.yaml +0 -0
  154. {cfengine-0.16.1 → cfengine-0.16.2}/tests/up-validate/004_count.x.yaml +0 -0
  155. {cfengine-0.16.1 → cfengine-0.16.2}/tests/up-validate/mocks/cloud_config.json +0 -0
  156. {cfengine-0.16.1 → cfengine-0.16.2}/tests/up-validate/mocks/vagrant +0 -0
  157. {cfengine-0.16.1 → cfengine-0.16.2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cfengine
3
- Version: 0.16.1
3
+ Version: 0.16.2
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.1
3
+ Version: 0.16.2
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
@@ -711,6 +711,10 @@ def _format_block_header(node: Node, fmt: Formatter) -> list[Node]:
711
711
  def _needs_blank_line_before(child: Node, indent: int, line_length: int) -> bool:
712
712
  """Check if a blank separator line should precede this child node."""
713
713
  prev = child.prev_named_sibling
714
+ # Empty comments preceding this child will be dropped — look past them
715
+ # so we evaluate against the real prior content.
716
+ while prev and prev.type == "comment" and _is_empty_comment(prev):
717
+ prev = prev.prev_named_sibling
714
718
  if not prev:
715
719
  return False
716
720
 
@@ -743,12 +747,6 @@ def _needs_blank_line_before(child: Node, indent: int, line_length: int) -> bool
743
747
  if child.type == "comment":
744
748
  if _is_empty_comment(child):
745
749
  return False
746
- # Empty comments preceding this one will be dropped — look past them
747
- # so we treat the comment as following the real prior content.
748
- while prev and prev.type == "comment" and _is_empty_comment(prev):
749
- prev = prev.prev_named_sibling
750
- if prev is None:
751
- return False
752
750
  # Top-level comment after a complete block — visually separates them
753
751
  if prev.type in BLOCK_TYPES:
754
752
  return True
@@ -783,12 +781,27 @@ def _needs_blank_line_before(child: Node, indent: int, line_length: int) -> bool
783
781
 
784
782
 
785
783
  def _is_empty_comment(node: Node) -> bool:
786
- """Check if a bare '#' comment should be dropped (not between other comments)."""
784
+ """Check if a bare '#' comment should be dropped.
785
+
786
+ A run of bare '#' between two non-empty comments collapses to a
787
+ single '#' — the first in the run is kept, the rest are dropped.
788
+ Bare '#' not flanked by real comments is always dropped."""
787
789
  if text(node).strip() != "#":
788
790
  return False
789
791
  prev = node.prev_named_sibling
792
+ # Not the first in a run of '#' — a kept '#' precedes us, drop.
793
+ if prev and prev.type == "comment" and text(prev).strip() == "#":
794
+ return True
795
+ # First in a run — kept only if a non-empty comment sits on each side
796
+ # (forward search walks past the rest of the run to find one).
797
+ if not (prev and prev.type == "comment"):
798
+ return True
790
799
  nxt = node.next_named_sibling
791
- return not (prev and prev.type == "comment" and nxt and nxt.type == "comment")
800
+ while nxt and nxt.type == "comment" and text(nxt).strip() == "#":
801
+ nxt = nxt.next_named_sibling
802
+ if not (nxt and nxt.type == "comment"):
803
+ return True
804
+ return False
792
805
 
793
806
 
794
807
  def _skip_comments(sibling: Node | None, direction: str = "next") -> Node | None:
@@ -1,3 +1,6 @@
1
+ # explanation
2
+ #
3
+ # one more line
1
4
  bundle agent main
2
5
  {
3
6
  # comment
@@ -22,3 +25,21 @@ bundle agent c
22
25
  reports:
23
26
  "hello";
24
27
  }
28
+
29
+ bundle agent d
30
+ {
31
+ reports:
32
+ "hello";
33
+
34
+ any::
35
+ "world";
36
+ }
37
+
38
+ bundle agent e
39
+ {
40
+ reports:
41
+ "hello";
42
+
43
+ any::
44
+ "world";
45
+ }
@@ -1,3 +1,18 @@
1
+ #
2
+ #
3
+ #
4
+ #
5
+ #
6
+ # explanation
7
+ #
8
+ #
9
+ #
10
+ #
11
+ # one more line
12
+ #
13
+ #
14
+ #
15
+ #
1
16
  bundle agent main
2
17
  {
3
18
  #
@@ -28,3 +43,38 @@ bundle agent c
28
43
  reports:
29
44
  "hello";
30
45
  }
46
+ #
47
+ bundle agent d
48
+ {
49
+ #
50
+ reports:
51
+ #
52
+ "hello";
53
+ #
54
+ any::
55
+ #
56
+ "world";
57
+ }
58
+
59
+ #
60
+ #
61
+ #
62
+ bundle agent e
63
+ {
64
+ #
65
+ #
66
+ #
67
+ reports:
68
+ #
69
+ #
70
+ #
71
+ "hello";
72
+ #
73
+ #
74
+ #
75
+ any::
76
+ #
77
+ #
78
+ #
79
+ "world";
80
+ }
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