troubadix 25.3.3__tar.gz → 25.3.5__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 (221) hide show
  1. {troubadix-25.3.3 → troubadix-25.3.5}/PKG-INFO +1 -1
  2. {troubadix-25.3.3 → troubadix-25.3.5}/pyproject.toml +1 -1
  3. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/test_dependency_graph.py +36 -28
  4. {troubadix-25.3.3 → troubadix-25.3.5}/tests/test_runner.py +12 -0
  5. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/__version__.py +1 -1
  6. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/__init__.py +11 -23
  7. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/dependency_graph/checks.py +20 -23
  8. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/dependency_graph/cli.py +7 -14
  9. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/dependency_graph/dependency_graph.py +13 -37
  10. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/dependency_graph/models.py +15 -9
  11. {troubadix-25.3.3 → troubadix-25.3.5}/LICENSE +0 -0
  12. {troubadix-25.3.3 → troubadix-25.3.5}/README.md +0 -0
  13. {troubadix-25.3.3 → troubadix-25.3.5}/tests/__init__.py +0 -0
  14. {troubadix-25.3.3 → troubadix-25.3.5}/tests/helper/__init__.py +0 -0
  15. {troubadix-25.3.3 → troubadix-25.3.5}/tests/helper/test_linguistic_exception_handler.py +0 -0
  16. {troubadix-25.3.3 → troubadix-25.3.5}/tests/helper/test_patterns.py +0 -0
  17. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/__init__.py +0 -0
  18. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/fail.nasl +0 -0
  19. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/fail2.nasl +0 -0
  20. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test.nasl +0 -0
  21. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_badwords.py +0 -0
  22. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_copyright_text.py +0 -0
  23. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_copyright_year.py +0 -0
  24. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_creation_date.py +0 -0
  25. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_cve_format.py +0 -0
  26. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_cvss_format.py +0 -0
  27. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_dependencies.py +0 -0
  28. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_dependency_category_order.py +0 -0
  29. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_deprecated_dependency.py +0 -0
  30. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_deprecated_functions.py +0 -0
  31. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_double_end_points.py +0 -0
  32. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_duplicate_oid.py +0 -0
  33. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_duplicated_script_tags.py +0 -0
  34. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_encoding.py +0 -0
  35. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/fail_bad_new_line.nasl +0 -0
  36. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/fail_badwords.nasl +0 -0
  37. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/fail_name_and_copyright_newline.nasl +0 -0
  38. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/fail_name_newline.nasl +0 -0
  39. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/fail_permissions.nasl +0 -0
  40. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/fail_spelling.nasl +0 -0
  41. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/nasl/21.04/fail.nasl +0 -0
  42. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/nasl/21.04/fail_badwords.nasl +0 -0
  43. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/nasl/21.04/fail_name_and_copyright_newline.nasl +0 -0
  44. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/nasl/21.04/fail_name_newline.nasl +0 -0
  45. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/nasl/21.04/fail_solution_template.nasl +0 -0
  46. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/nasl/21.04/runner/fail.nasl +0 -0
  47. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/nasl/21.04/runner/fail2.nasl +0 -0
  48. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/nasl/21.04/runner/test.nasl +0 -0
  49. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/nasl/21.04/runner/test_valid_oid.nasl +0 -0
  50. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/nasl/21.04/test.inc +0 -0
  51. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/nasl/21.04/test.nasl +0 -0
  52. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/nasl/warning.nasl +0 -0
  53. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/ok_permissions.nasl +0 -0
  54. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_files/test_oid.nasl +0 -0
  55. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_forking_nasl_functions.py +0 -0
  56. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_get_kb_on_services.py +0 -0
  57. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_grammar.py +0 -0
  58. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_http_links_in_tags.py +0 -0
  59. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_illegal_characters.py +0 -0
  60. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_log_messages.py +0 -0
  61. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_malformed_dependencies.py +0 -0
  62. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_misplaced_compare_in_if.py +0 -0
  63. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_missing_desc_exit.py +0 -0
  64. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_missing_tag_solution.py +0 -0
  65. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_multiple_re_parameters.py +0 -0
  66. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_newlines.py +0 -0
  67. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_overlong_description_lines.py +0 -0
  68. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_overlong_script_tags.py +0 -0
  69. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_prod_svc_detect_in_vulnvt.py +0 -0
  70. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_qod.py +0 -0
  71. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_reporting_consistency.py +0 -0
  72. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_script_add_preference_type.py +0 -0
  73. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_script_calls_empty_values.py +0 -0
  74. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_script_calls_recommended.py +0 -0
  75. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_script_category.py +0 -0
  76. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_script_copyright.py +0 -0
  77. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_script_family.py +0 -0
  78. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_script_tag_form.py +0 -0
  79. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_script_tag_whitespaces.py +0 -0
  80. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_script_tags_mandatory.py +0 -0
  81. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_script_version_and_last_modification_tags.py +0 -0
  82. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_script_xref_form.py +0 -0
  83. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_script_xref_url.py +0 -0
  84. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_security_messages.py +0 -0
  85. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_set_get_kb_calls.py +0 -0
  86. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_solution_text.py +0 -0
  87. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_solution_type.py +0 -0
  88. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_spaces_before_dots.py +0 -0
  89. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_spaces_in_filename.py +0 -0
  90. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_spelling.py +0 -0
  91. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_tabs.py +0 -0
  92. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_todo_tbd.py +0 -0
  93. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_trailing_spaces_tabs.py +0 -0
  94. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_using_display.py +0 -0
  95. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_valid_oid.py +0 -0
  96. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_valid_script_tag_names.py +0 -0
  97. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_variable_redefinition_in_foreach.py +0 -0
  98. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_vt_file_permissions.py +0 -0
  99. {troubadix-25.3.3 → troubadix-25.3.5}/tests/plugins/test_vt_placement.py +0 -0
  100. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/__init__.py +0 -0
  101. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/changed_packages/__init__.py +0 -0
  102. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/changed_packages/markers/__init__.py +0 -0
  103. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/changed_packages/markers/test_added_epoch.py +0 -0
  104. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/changed_packages/markers/test_added_release.py +0 -0
  105. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/changed_packages/markers/test_added_udeb.py +0 -0
  106. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/changed_packages/markers/test_changed_update.py +0 -0
  107. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/changed_packages/markers/test_dropped_architecture.py +0 -0
  108. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/changed_packages/test_changed_packages.py +0 -0
  109. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/changed_packages/test_package.py +0 -0
  110. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/nasl/21.04/21_script.nasl +0 -0
  111. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/nasl/22.04/22_script.nasl +0 -0
  112. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/nasl/common/bar.nasl +0 -0
  113. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/nasl/common/foo.nasl +0 -0
  114. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/nasl/common/foobar.nasl +0 -0
  115. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/nasl/common/gsf/enterprise_script.nasl +0 -0
  116. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/test_changed_cves.py +0 -0
  117. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/test_changed_oid.py +0 -0
  118. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/test_deprecate_vts.py +0 -0
  119. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/test_file_extensions.py +0 -0
  120. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/test_last_modification.py +0 -0
  121. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/test_no_solution.py +0 -0
  122. {troubadix-25.3.3 → troubadix-25.3.5}/tests/standalone_plugins/test_version_updated.py +0 -0
  123. {troubadix-25.3.3 → troubadix-25.3.5}/tests/test_argparser.py +0 -0
  124. {troubadix-25.3.3 → troubadix-25.3.5}/tests/test_helper.py +0 -0
  125. {troubadix-25.3.3 → troubadix-25.3.5}/tests/test_naslinter.py +0 -0
  126. {troubadix-25.3.3 → troubadix-25.3.5}/tests/test_reporter.py +0 -0
  127. {troubadix-25.3.3 → troubadix-25.3.5}/tests/test_results.py +0 -0
  128. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/__init__.py +0 -0
  129. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/argparser.py +0 -0
  130. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/codespell/codespell.additions +0 -0
  131. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/codespell/codespell.exclude +0 -0
  132. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/codespell/codespell.ignore +0 -0
  133. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/helper/__init__.py +0 -0
  134. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/helper/helper.py +0 -0
  135. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/helper/linguistic_exception_handler.py +0 -0
  136. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/helper/patterns.py +0 -0
  137. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugin.py +0 -0
  138. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/badwords.py +0 -0
  139. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/copyright_text.py +0 -0
  140. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/copyright_year.py +0 -0
  141. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/creation_date.py +0 -0
  142. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/cve_format.py +0 -0
  143. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/cvss_format.py +0 -0
  144. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/dependencies.py +0 -0
  145. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/dependency_category_order.py +0 -0
  146. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/deprecated_dependency.py +0 -0
  147. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/deprecated_functions.py +0 -0
  148. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/double_end_points.py +0 -0
  149. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/duplicate_oid.py +0 -0
  150. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/duplicated_script_tags.py +0 -0
  151. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/encoding.py +0 -0
  152. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/forking_nasl_functions.py +0 -0
  153. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/get_kb_on_services.py +0 -0
  154. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/grammar.py +0 -0
  155. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/http_links_in_tags.py +0 -0
  156. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/illegal_characters.py +0 -0
  157. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/log_messages.py +0 -0
  158. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/malformed_dependencies.py +0 -0
  159. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/misplaced_compare_in_if.py +0 -0
  160. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/missing_desc_exit.py +0 -0
  161. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/missing_tag_solution.py +0 -0
  162. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/multiple_re_parameters.py +0 -0
  163. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/newlines.py +0 -0
  164. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/overlong_description_lines.py +0 -0
  165. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/overlong_script_tags.py +0 -0
  166. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/prod_svc_detect_in_vulnvt.py +0 -0
  167. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/qod.py +0 -0
  168. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/reporting_consistency.py +0 -0
  169. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/script_add_preference_type.py +0 -0
  170. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/script_calls_empty_values.py +0 -0
  171. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/script_calls_recommended.py +0 -0
  172. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/script_category.py +0 -0
  173. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/script_copyright.py +0 -0
  174. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/script_family.py +0 -0
  175. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/script_tag_form.py +0 -0
  176. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/script_tag_whitespaces.py +0 -0
  177. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/script_tags_mandatory.py +0 -0
  178. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/script_version_and_last_modification_tags.py +0 -0
  179. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/script_xref_form.py +0 -0
  180. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/script_xref_url.py +0 -0
  181. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/security_messages.py +0 -0
  182. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/set_get_kb_calls.py +0 -0
  183. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/solution_text.py +0 -0
  184. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/solution_type.py +0 -0
  185. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/spaces_before_dots.py +0 -0
  186. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/spaces_in_filename.py +0 -0
  187. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/spelling.py +0 -0
  188. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/tabs.py +0 -0
  189. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/todo_tbd.py +0 -0
  190. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/trailing_spaces_tabs.py +0 -0
  191. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/using_display.py +0 -0
  192. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/valid_oid.py +0 -0
  193. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/valid_script_tag_names.py +0 -0
  194. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/variable_assigned_in_if.py +0 -0
  195. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/variable_redefinition_in_foreach.py +0 -0
  196. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/vt_file_permissions.py +0 -0
  197. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/plugins/vt_placement.py +0 -0
  198. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/reporter.py +0 -0
  199. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/results.py +0 -0
  200. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/runner.py +0 -0
  201. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/__init__.py +0 -0
  202. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/allowed_rev_diff.py +0 -0
  203. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/changed_cves.py +0 -0
  204. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/changed_oid.py +0 -0
  205. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/changed_packages/changed_packages.py +0 -0
  206. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/changed_packages/marker/__init__.py +0 -0
  207. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/changed_packages/marker/added_epoch.py +0 -0
  208. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/changed_packages/marker/added_release.py +0 -0
  209. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/changed_packages/marker/added_udeb.py +0 -0
  210. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/changed_packages/marker/changed_update.py +0 -0
  211. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/changed_packages/marker/dropped_architecture.py +0 -0
  212. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/changed_packages/marker/marker.py +0 -0
  213. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/changed_packages/package.py +0 -0
  214. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/common.py +0 -0
  215. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/dependency_graph/__init__.py +0 -0
  216. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/deprecate_vts.py +0 -0
  217. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/file_extensions.py +0 -0
  218. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/last_modification.py +0 -0
  219. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/no_solution.py +0 -0
  220. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/standalone_plugins/version_updated.py +0 -0
  221. {troubadix-25.3.3 → troubadix-25.3.5}/troubadix/troubadix.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: troubadix
3
- Version: 25.3.3
3
+ Version: 25.3.5
4
4
  Summary: A linting and QA check tool for NASL files
5
5
  License: GPL-3.0-or-later
6
6
  Author: Greenbone
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "troubadix"
3
- version = "25.3.3"
3
+ version = "25.3.5"
4
4
  description = "A linting and QA check tool for NASL files"
5
5
  authors = ["Greenbone <info@greenbone.net>"]
6
6
  license = "GPL-3.0-or-later"
@@ -1,5 +1,6 @@
1
1
  # SPDX-License-Identifier: GPL-3.0-or-later
2
2
  # SPDX-FileCopyrightText: 2024 Greenbone AG
3
+ import logging
3
4
  import os
4
5
  import unittest
5
6
  from io import StringIO
@@ -30,20 +31,27 @@ class TestReporter(unittest.TestCase):
30
31
  def setUp(self):
31
32
  self.result = Result(
32
33
  name="TestScript",
34
+ infos=["cross-feed"],
33
35
  warnings=["duplicate dependencies"],
34
36
  errors=["missing dependencies"],
35
37
  )
36
38
 
37
- @patch("sys.stdout", new_callable=StringIO)
38
- def test_report_verbosity_2(self, mock_stdout):
39
- reporter = Reporter(verbosity=2)
40
- reporter.report([self.result])
39
+ def test_output_formatting(self):
40
+ stream = StringIO()
41
+
42
+ handler = logging.StreamHandler(stream)
43
+ handler.setFormatter(logging.Formatter("%(levelname)s: %(message)s"))
41
44
 
42
- output = mock_stdout.getvalue()
45
+ reporter = Reporter()
46
+ reporter.logger.handlers = [handler]
47
+ reporter.logger.setLevel(logging.INFO)
48
+
49
+ reporter.report([self.result])
43
50
 
44
- self.assertIn("TestScript - warnings: 1, errors: 1", output)
45
- self.assertIn("warning: duplicate dependencies", output)
46
- self.assertIn("error: missing dependencies", output)
51
+ output = stream.getvalue()
52
+ self.assertIn("INFO: TestScript: cross-feed", output)
53
+ self.assertIn("WARNING: TestScript: duplicate dependencies", output)
54
+ self.assertIn("ERROR: TestScript: missing dependencies", output)
47
55
 
48
56
 
49
57
  class TestCLIArgs(unittest.TestCase):
@@ -54,7 +62,7 @@ class TestCLIArgs(unittest.TestCase):
54
62
  "--root",
55
63
  "tests/standalone_plugins/nasl",
56
64
  "--feed",
57
- "feed_22_04",
65
+ "22.04",
58
66
  "--log",
59
67
  "info",
60
68
  ],
@@ -62,8 +70,8 @@ class TestCLIArgs(unittest.TestCase):
62
70
  def test_parse_args_ok(self):
63
71
  args = parse_args()
64
72
  self.assertEqual(args.root, Path("tests/standalone_plugins/nasl"))
65
- self.assertEqual(args.feed, [Feed.FEED_22_04])
66
- self.assertEqual(args.log, "info")
73
+ self.assertEqual(args.feed, Feed.FEED_22_04)
74
+ self.assertEqual(args.log, "INFO")
67
75
 
68
76
  @patch("sys.stderr", new_callable=StringIO)
69
77
  @patch("sys.argv", ["prog", "--root", "not_real_dir"])
@@ -72,7 +80,7 @@ class TestCLIArgs(unittest.TestCase):
72
80
  parse_args()
73
81
  self.assertRegex(mock_stderr.getvalue(), "invalid directory_type")
74
82
 
75
- @patch("sys.stderr", new_callable=StringIO)
83
+ # @patch("sys.stderr", new_callable=StringIO)
76
84
  @patch(
77
85
  "sys.argv",
78
86
  [
@@ -83,10 +91,9 @@ class TestCLIArgs(unittest.TestCase):
83
91
  "invalid_feed",
84
92
  ],
85
93
  )
86
- def test_parse_args_invalid_feed(self, mock_stderr):
94
+ def test_parse_args_invalid_feed(self):
87
95
  with self.assertRaises(SystemExit):
88
96
  parse_args()
89
- self.assertRegex(mock_stderr.getvalue(), "Invalid Feed value")
90
97
 
91
98
  @patch.dict(os.environ, {"VTDIR": "/mock/env/path"})
92
99
  @patch("sys.argv", ["prog"])
@@ -98,7 +105,7 @@ class TestCLIArgs(unittest.TestCase):
98
105
  def test_parse_args_defaults(self):
99
106
  args = parse_args()
100
107
  self.assertEqual(args.log, "WARNING")
101
- self.assertEqual(args.feed, [Feed.FULL])
108
+ self.assertEqual(args.feed, Feed.COMMON)
102
109
 
103
110
 
104
111
  class TestDependencyGraph(unittest.TestCase):
@@ -119,9 +126,9 @@ if(description)
119
126
  """
120
127
 
121
128
  def test_get_feed(self):
122
- feed = [Feed.FULL]
129
+ feed = Feed.FEED_22_04
123
130
  scripts = get_feed(Path(self.local_root), feed)
124
- self.assertEqual(len(scripts), 6)
131
+ self.assertEqual(len(scripts), 5)
125
132
 
126
133
  @patch("pathlib.Path.read_text")
127
134
  def test_get_scripts(self, mock_read_text):
@@ -166,35 +173,36 @@ if(description)
166
173
  @patch("sys.stdout", new_callable=StringIO) # mock_stdout (second argument)
167
174
  @patch("sys.stderr", new_callable=StringIO) # mock_stderr (first argument)
168
175
  @patch(
169
- "sys.argv", ["prog", "--root", "tests/standalone_plugins/nasl", "-v"]
176
+ "sys.argv",
177
+ ["prog", "--root", "tests/standalone_plugins/nasl", "--log", "info"],
170
178
  ) # no argument
171
179
  def test_full_run(self, mock_stderr, mock_stdout):
172
180
  return_code = main()
173
- output = mock_stdout.getvalue()
181
+ output = mock_stderr.getvalue()
174
182
 
175
- self.assertIn("error: missing dependency file: missing.nasl:", output)
183
+ self.assertIn("ERROR: missing dependency: missing.nasl:", output)
176
184
  self.assertIn(
177
- "error: cyclic dependency: ", # order is random so can't match the output
185
+ "ERROR: cyclic dependency: ", # order is random so can't match the output
178
186
  output,
179
187
  )
180
188
  self.assertIn(
181
- "error: unchecked cross-feed-dependency: foo.nasl(community feed) depends on"
182
- " gsf/enterprise_script.nasl(enterprise feed), but the"
183
- " current feed is not properly checked",
189
+ "ERROR: cross-feed dependency: incorrect feed check in foo.nasl(community feed)"
190
+ " which depends on gsf/enterprise_script.nasl(enterprise feed)",
184
191
  output,
185
192
  )
186
193
  self.assertIn(
187
- "error: bar.nasl depends on foo.nasl which has a lower category order",
194
+ "ERROR: category order: bar.nasl depends on foo.nasl which has a lower category order",
188
195
  output,
189
196
  )
190
197
  self.assertIn(
191
- "error: foo.nasl depends on deprecated script foobar.nasl", output
198
+ "ERROR: deprecated dependency: foo.nasl depends on deprecated script foobar.nasl",
199
+ output,
192
200
  )
193
201
  self.assertIn(
194
- "warning: Duplicate dependencies in bar.nasl: foo.nasl", output
202
+ "WARNING: duplicate dependency: in bar.nasl: foo.nasl", output
195
203
  )
196
204
  self.assertIn(
197
- "warning: cross-feed-dependency: bar.nasl(community feed)"
205
+ "INFO: cross-feed dependency: bar.nasl(community feed)"
198
206
  " depends on gsf/enterprise_script.nasl(enterprise feed)",
199
207
  output,
200
208
  )
@@ -351,6 +351,18 @@ class TestRunner(unittest.TestCase):
351
351
  root=self.root,
352
352
  )
353
353
 
354
+ def test_unknown_plugins_with_suggestion(self):
355
+ with self.assertRaisesRegex(
356
+ ValueError,
357
+ r"Unknown plugins: 'check_badwards' \(Did you mean 'check_badwords'\?\)",
358
+ ):
359
+ Runner(
360
+ n_jobs=1,
361
+ reporter=self._reporter,
362
+ included_plugins=["check_badwards"],
363
+ root=self.root,
364
+ )
365
+
354
366
  def test_runner_log_file(self):
355
367
  included_plugins = [
356
368
  CheckDuplicateOID.name,
@@ -2,4 +2,4 @@
2
2
 
3
3
  # THIS IS AN AUTOGENERATED FILE. DO NOT TOUCH!
4
4
 
5
- __version__ = "25.3.3"
5
+ __version__ = "25.3.5"
@@ -178,9 +178,7 @@ class StandardPlugins(Plugins):
178
178
  files_plugins = _FILES_PLUGINS
179
179
 
180
180
  if excluded_plugins:
181
- self._check_unknown_plugins(
182
- _FILE_PLUGINS + _FILES_PLUGINS, excluded_plugins
183
- )
181
+ self._check_unknown_plugins(excluded_plugins)
184
182
 
185
183
  file_plugins = self._exclude_plugins(excluded_plugins, file_plugins)
186
184
  files_plugins = self._exclude_plugins(
@@ -188,9 +186,7 @@ class StandardPlugins(Plugins):
188
186
  )
189
187
 
190
188
  if included_plugins:
191
- self._check_unknown_plugins(
192
- _FILE_PLUGINS + _FILES_PLUGINS, included_plugins
193
- )
189
+ self._check_unknown_plugins(included_plugins)
194
190
 
195
191
  file_plugins = self._include_plugins(included_plugins, file_plugins)
196
192
  files_plugins = self._include_plugins(
@@ -220,33 +216,25 @@ class StandardPlugins(Plugins):
220
216
  ]
221
217
 
222
218
  @staticmethod
223
- def _check_unknown_plugins(found_plugins, selected_plugins):
224
- if len(found_plugins) == len(selected_plugins):
225
- return
226
-
219
+ def _check_unknown_plugins(selected_plugins: list[str]):
227
220
  all_plugin_names = {
228
221
  name
229
222
  for plugin in _FILE_PLUGINS + _FILES_PLUGINS
230
223
  for name in (plugin.name, plugin.__name__)
231
224
  }
232
- found_plugin_names = {
233
- name
234
- for plugin in found_plugins
235
- for name in (plugin.name, plugin.__name__)
236
- }
237
225
 
238
- unknown_plugins = set(selected_plugins).difference(found_plugin_names)
226
+ unknown_plugins = set(selected_plugins).difference(all_plugin_names)
239
227
 
240
228
  if not unknown_plugins:
241
229
  return
242
230
 
243
- messages = []
244
- for plugin in sorted(unknown_plugins):
245
- message = f"'{plugin}'"
231
+ def build_message(plugin: str):
246
232
  match = difflib.get_close_matches(plugin, all_plugin_names, n=1)
247
- if match:
248
- message += f" (Did you mean '{match[0]}'?)"
249
-
250
- messages.append(message)
233
+ return (
234
+ f"'{plugin}' (Did you mean '{match[0]}'?)"
235
+ if match
236
+ else f"'{plugin}'"
237
+ )
251
238
 
239
+ messages = [build_message(plugin) for plugin in sorted(unknown_plugins)]
252
240
  raise ValueError(f"Unknown plugins: {', '.join(messages)}")
@@ -17,12 +17,10 @@ def check_duplicates(scripts: list[Script]) -> Result:
17
17
  for script in scripts:
18
18
  counter = Counter(dep.name for dep in script.dependencies)
19
19
  duplicates = [dep for dep, count in counter.items() if count > 1]
20
-
21
20
  if duplicates:
22
- msg = f"Duplicate dependencies in {script.name}: {', '.join(duplicates)}"
23
- warnings.append(msg)
21
+ warnings.append(f"in {script.name}: {', '.join(duplicates)}")
24
22
 
25
- return Result(name="check_duplicates", warnings=warnings)
23
+ return Result(name="duplicate dependency", warnings=warnings)
26
24
 
27
25
 
28
26
  def check_missing_dependencies(
@@ -34,20 +32,22 @@ def check_missing_dependencies(
34
32
  logs the scripts dependending on the missing script
35
33
  """
36
34
  errors = []
37
- dependencies = {
35
+ dependency_names = {
38
36
  dep.name for script in scripts for dep in script.dependencies
39
37
  }
40
38
  script_names = {script.name for script in scripts}
41
- missing_dependencies = dependencies - script_names
39
+ missing_dependencies = dependency_names - script_names
42
40
 
43
41
  for missing in missing_dependencies:
44
42
  depending_scripts = graph.predecessors(missing)
45
- msg = f"missing dependency file: {missing}:"
46
- for script in depending_scripts:
47
- msg += f"\n - used by: {script}"
48
- errors.append(msg)
43
+ errors.append(
44
+ f"{missing}:"
45
+ + "".join(
46
+ f"\n - used by: {script}" for script in depending_scripts
47
+ )
48
+ )
49
49
 
50
- return Result(name="missing_dependencies", errors=errors)
50
+ return Result(name="missing dependency", errors=errors)
51
51
 
52
52
 
53
53
  def check_cycles(graph) -> Result:
@@ -59,8 +59,8 @@ def check_cycles(graph) -> Result:
59
59
 
60
60
  cycles = nx.simple_cycles(graph)
61
61
 
62
- errors = [f"cyclic dependency: {cycle}" for cycle in cycles]
63
- return Result(name="check_cycles", errors=errors)
62
+ errors = [str(cycle) for cycle in cycles]
63
+ return Result(name="cyclic dependency", errors=errors)
64
64
 
65
65
 
66
66
  def cross_feed_dependencies(
@@ -86,22 +86,19 @@ def check_cross_feed_dependencies(graph) -> Result:
86
86
  and if they are correctly contained within a is_enterprise_feed check.
87
87
  """
88
88
  gated_cfd = cross_feed_dependencies(graph, is_enterprise_checked=True)
89
- warnings = [
90
- f"cross-feed-dependency: {dependent}(community feed) "
91
- f"depends on {dependency}(enterprise feed)"
89
+ infos = [
90
+ f"{dependent}(community feed) depends on {dependency}(enterprise feed)"
92
91
  for dependent, dependency in gated_cfd
93
92
  ]
94
93
 
95
94
  ungated_cfd = cross_feed_dependencies(graph, is_enterprise_checked=False)
96
95
  errors = [
97
- f"unchecked cross-feed-dependency: {dependent}(community feed) "
98
- f"depends on {dependency}(enterprise feed), but the current feed is not properly checked"
96
+ f"incorrect feed check in {dependent}(community feed) "
97
+ f"which depends on {dependency}(enterprise feed)"
99
98
  for dependent, dependency in ungated_cfd
100
99
  ]
101
100
 
102
- return Result(
103
- name="check_cross_feed_dependencies", warnings=warnings, errors=errors
104
- )
101
+ return Result(name="cross-feed dependency", infos=infos, errors=errors)
105
102
 
106
103
 
107
104
  def check_category_order(graph) -> Result:
@@ -116,7 +113,7 @@ def check_category_order(graph) -> Result:
116
113
  f"{dependent} depends on {dependency} which has a lower category order"
117
114
  for dependent, dependency in problematic_edges
118
115
  ]
119
- return Result(name="check_category_order", errors=errors)
116
+ return Result(name="category order", errors=errors)
120
117
 
121
118
 
122
119
  def check_deprecated_dependencies(graph) -> Result:
@@ -125,4 +122,4 @@ def check_deprecated_dependencies(graph) -> Result:
125
122
  for dependent, dependency in graph.edges()
126
123
  if graph.nodes[dependency].get("deprecated", False)
127
124
  ]
128
- return Result(name="check_deprecated_dependencies", errors=errors)
125
+ return Result(name="deprecated dependency", errors=errors)
@@ -3,7 +3,7 @@
3
3
 
4
4
 
5
5
  import os
6
- from argparse import ArgumentParser, ArgumentTypeError, Namespace
6
+ from argparse import ArgumentParser, Namespace
7
7
  from pathlib import Path
8
8
 
9
9
  from troubadix.argparser import directory_type_existing
@@ -11,13 +11,6 @@ from troubadix.argparser import directory_type_existing
11
11
  from .models import Feed
12
12
 
13
13
 
14
- def feed_type(value: str) -> Feed:
15
- try:
16
- return Feed[value.upper()]
17
- except KeyError:
18
- raise ArgumentTypeError(f"Invalid Feed value: '{value}'")
19
-
20
-
21
14
  def parse_args() -> Namespace:
22
15
  parser = ArgumentParser(
23
16
  description="Tool for analysing the dependencies in the NASL repository.",
@@ -31,18 +24,18 @@ def parse_args() -> Namespace:
31
24
  parser.add_argument(
32
25
  "-f",
33
26
  "--feed",
34
- type=feed_type,
27
+ type=Feed,
35
28
  choices=Feed,
36
- nargs="+",
37
- default=[Feed.FULL],
38
- help="feed",
29
+ default=Feed.COMMON,
30
+ help="Feed selection",
39
31
  )
40
32
  parser.add_argument(
41
33
  "--log",
34
+ type=str.upper,
42
35
  default="WARNING",
43
- help="Set the logging level (INFO, WARNING, ERROR)",
36
+ choices=["INFO", "WARNING", "ERROR"],
37
+ help="Set the logging level (default: WARNING)",
44
38
  )
45
- parser.add_argument("-v", "--verbose", action="count", default=0)
46
39
 
47
40
  args = parser.parse_args()
48
41
 
@@ -5,7 +5,6 @@
5
5
  import logging
6
6
  import re
7
7
  import sys
8
- from functools import reduce
9
8
  from pathlib import Path
10
9
 
11
10
  import networkx as nx
@@ -47,46 +46,23 @@ ENTERPRISE_FEED_CHECK_PATTERN = re.compile(
47
46
 
48
47
 
49
48
  class Reporter:
50
- def __init__(self, verbosity) -> None:
51
- self.verbosity = verbosity
49
+ def __init__(self) -> None:
50
+ self.logger = logging.getLogger(__name__)
52
51
 
53
52
  def report(self, results: list[Result]):
54
53
  for result in results:
55
- if self.verbosity >= 2:
56
- self.print_statistic(result)
57
- self.print_divider()
58
- if self.verbosity >= 1:
59
- self.print_warnings(result)
60
- self.print_errors(result)
61
- if self.verbosity >= 2:
62
- self.print_divider("=")
63
-
64
- def print_divider(self, char="-", length=40):
65
- print(char * length)
66
-
67
- def print_statistic(self, result: Result):
68
- print(
69
- f"{result.name} - warnings: {len(result.warnings)}, errors: {len(result.errors)}"
70
- )
71
-
72
- def print_warnings(self, result: Result):
73
- for warning in result.warnings:
74
- print(f"warning: {warning}")
54
+ for error in result.errors:
55
+ self.logger.error(f"{result.name}: {error}")
56
+ for warning in result.warnings:
57
+ self.logger.warning(f"{result.name}: {warning}")
58
+ for info in result.infos:
59
+ self.logger.info(f"{result.name}: {info}")
75
60
 
76
- def print_errors(self, result: Result):
77
- for error in result.errors:
78
- print(f"error: {error}")
79
61
 
80
-
81
- def get_feed(root, feeds: list[Feed]) -> list[Script]:
82
- feed = reduce((lambda x, y: x | y), feeds)
83
- scripts = []
84
- if feed & Feed.COMMON:
85
- scripts.extend(get_scripts(root / "common"))
86
- if feed & Feed.FEED_21_04:
87
- scripts.extend(get_scripts(root / "21.04"))
88
- if feed & Feed.FEED_22_04:
89
- scripts.extend(get_scripts(root / "22.04"))
62
+ def get_feed(root: Path, feed: Feed) -> list[Script]:
63
+ scripts = get_scripts(root / "common") # Always include common
64
+ if feed != Feed.COMMON: # Add version-specific scripts if not just common
65
+ scripts.extend(get_scripts(root / feed.value))
90
66
 
91
67
  return scripts
92
68
 
@@ -197,7 +173,7 @@ def main():
197
173
  check_category_order(graph),
198
174
  check_deprecated_dependencies(graph),
199
175
  ]
200
- reporter = Reporter(args.verbose)
176
+ reporter = Reporter()
201
177
  reporter.report(results)
202
178
 
203
179
  if any(result.errors for result in results):
@@ -2,18 +2,19 @@
2
2
  # SPDX-FileCopyrightText: 2025 Greenbone AG
3
3
 
4
4
  from dataclasses import dataclass, field
5
- from enum import Flag, auto
5
+ from enum import Enum
6
6
 
7
7
 
8
- class Feed(Flag):
9
- COMMON = auto()
10
- FEED_21_04 = auto()
11
- FEED_22_04 = auto()
12
- FULL = COMMON | FEED_21_04 | FEED_22_04
8
+ class Feed(str, Enum):
9
+ COMMON = "common"
10
+ FEED_21_04 = "21.04"
11
+ FEED_22_04 = "22.04"
13
12
 
14
- def __str__(self):
15
- # Make enum values user-friendly for argparse help
16
- return self.name.lower()
13
+
14
+ class OutputLevel(Enum):
15
+ ERROR = 1
16
+ WARNING = 2
17
+ INFO = 3
17
18
 
18
19
 
19
20
  @dataclass
@@ -35,6 +36,11 @@ class Script:
35
36
 
36
37
  @dataclass
37
38
  class Result:
39
+ """Holds the results of a single check.
40
+ A check can report a combination of errors, warnings and infos
41
+ """
42
+
38
43
  name: str
39
44
  warnings: list[str] = field(default_factory=list)
40
45
  errors: list[str] = field(default_factory=list)
46
+ infos: list[str] = field(default_factory=list)
File without changes
File without changes
File without changes