ceedling 1.1.10 → 1.2.1

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 (1145) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +3 -0
  3. data/.simplecov +73 -0
  4. data/GIT_COMMIT_SHA +1 -1
  5. data/Gemfile +84 -8
  6. data/Gemfile.lock +38 -8
  7. data/README.md +64 -45
  8. data/Rakefile +769 -16
  9. data/assets/{project.yml → features/project.yml} +4 -1
  10. data/assets/fixtures/bullseye_branch_coverage/src/branchy.c +24 -0
  11. data/assets/fixtures/bullseye_branch_coverage/src/branchy.h +14 -0
  12. data/assets/fixtures/bullseye_branch_coverage/test/test_branchy.c +18 -0
  13. data/assets/fixtures/cppcheck_findings/findings.c +23 -0
  14. data/assets/fixtures/cppcheck_findings/findings.h +13 -0
  15. data/assets/fixtures/header_include_path_validation/alt_drivers/foo.h +6 -0
  16. data/assets/fixtures/header_include_path_validation/bar.h +6 -0
  17. data/assets/fixtures/header_include_path_validation/drivers/foo.h +6 -0
  18. data/assets/fixtures/header_include_path_validation/dup.h +6 -0
  19. data/assets/fixtures/header_include_path_validation/other_inc/dup.h +6 -0
  20. data/assets/fixtures/header_include_path_validation/test_ambiguous_mock.c +15 -0
  21. data/assets/fixtures/header_include_path_validation/test_bare_mock.c +11 -0
  22. data/assets/fixtures/header_include_path_validation/test_bogus_mock_path.c +11 -0
  23. data/assets/fixtures/header_include_path_validation/test_bogus_vanilla_path.c +10 -0
  24. data/assets/fixtures/header_include_path_validation/test_include_outranks_test_include_path.c +16 -0
  25. data/assets/fixtures/header_include_path_validation/test_pathed_mock.c +11 -0
  26. data/assets/fixtures/header_include_path_validation/test_pathed_mock_ambiguous.c +14 -0
  27. data/assets/fixtures/header_include_path_validation/test_test_include_path_outranks_include.c +17 -0
  28. data/assets/fixtures/implicit_source_header_correspondence/alpha/dup.c +6 -0
  29. data/assets/fixtures/implicit_source_header_correspondence/alpha/dup.h +6 -0
  30. data/assets/fixtures/implicit_source_header_correspondence/beta/dup.c +6 -0
  31. data/assets/fixtures/implicit_source_header_correspondence/beta/dup.h +6 -0
  32. data/assets/fixtures/implicit_source_header_correspondence/gamma/dup_gamma.c +6 -0
  33. data/assets/fixtures/implicit_source_header_correspondence/test_dup_alpha.c +10 -0
  34. data/assets/fixtures/implicit_source_header_correspondence/test_dup_bare.c +10 -0
  35. data/assets/fixtures/implicit_source_header_correspondence/test_dup_beta.c +10 -0
  36. data/assets/fixtures/implicit_source_header_correspondence/test_dup_override.c +19 -0
  37. data/assets/fixtures/implicit_source_header_correspondence/test_dup_subtractive.c +19 -0
  38. data/assets/fixtures/implicit_source_header_correspondence/test_dup_subtractive_noop.c +16 -0
  39. data/assets/fixtures/parent_directory_references/alpha/extra.c +4 -0
  40. data/assets/fixtures/parent_directory_references/common/helper.c +6 -0
  41. data/assets/fixtures/parent_directory_references/common/helper.h +6 -0
  42. data/assets/fixtures/parent_directory_references/unit/test_dotdot_include.c +10 -0
  43. data/assets/fixtures/parent_directory_references/unit/test_dotdot_source.c +16 -0
  44. data/assets/fixtures/plain_inline_module.h +9 -0
  45. data/assets/fixtures/same_named_modules/include/drivers/spi/config.h +6 -0
  46. data/assets/fixtures/same_named_modules/include/drivers/uart/config.h +6 -0
  47. data/assets/fixtures/same_named_modules/src/drivers/spi/config.c +8 -0
  48. data/assets/fixtures/same_named_modules/src/drivers/uart/config.c +10 -0
  49. data/assets/fixtures/same_named_modules/test/test_both_configs.c +26 -0
  50. data/assets/fixtures/same_named_modules/test/test_both_configs_mocked.c +20 -0
  51. data/assets/fixtures/same_named_modules/test/test_both_configs_mocked_traditional.c +19 -0
  52. data/assets/fixtures/same_named_modules/test/test_both_modules.c +19 -0
  53. data/assets/fixtures/same_named_modules/test/test_uart_config_bare.c +19 -0
  54. data/assets/fixtures/same_named_modules/test/test_uart_config_partial_only.c +20 -0
  55. data/assets/fixtures/sources_with_duplicate_basenames/baz/bar.c +6 -0
  56. data/assets/fixtures/sources_with_duplicate_basenames/baz/bar.h +6 -0
  57. data/assets/fixtures/sources_with_duplicate_basenames/foo/bar.c +6 -0
  58. data/assets/fixtures/sources_with_duplicate_basenames/foo/bar.h +6 -0
  59. data/assets/fixtures/sources_with_duplicate_basenames/main.c +11 -0
  60. data/assets/fixtures/sources_with_duplicate_basenames/test_baz_bar.c +10 -0
  61. data/assets/fixtures/sources_with_duplicate_basenames/test_both_bars.c +12 -0
  62. data/assets/fixtures/sources_with_duplicate_basenames/test_foo_bar.c +10 -0
  63. data/assets/{test_example_file_boom.c → fixtures/test_nosanitize_boom.c} +9 -0
  64. data/assets/{test_example_file_crash_assert.c → fixtures/test_nosanitize_crash_assert.c} +8 -0
  65. data/assets/{test_example_file_crash_sigsegv.c → fixtures/test_nosanitize_crash_sigsegv.c} +8 -0
  66. data/assets/{test_example_file_crash_sigsegv_with_param.c → fixtures/test_nosanitize_crash_sigsegv_with_param.c} +8 -0
  67. data/assets/fixtures/test_nosanitize_heap_buffer_overflow.c +31 -0
  68. data/assets/fixtures/test_nosanitize_leak.c +34 -0
  69. data/assets/fixtures/test_nosanitize_two_findings.c +36 -0
  70. data/assets/{test_example_file_ub_shift_overflow.c → fixtures/test_nosanitize_ub_shift_overflow.c} +9 -0
  71. data/assets/fixtures/test_plain_inline_module.c +15 -0
  72. data/assets/fixtures/test_source_file_duplicate_basenames/alpha/calc.c +4 -0
  73. data/assets/fixtures/test_source_file_duplicate_basenames/beta/calc.c +4 -0
  74. data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_alpha.c +15 -0
  75. data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_ambiguous.c +15 -0
  76. data/assets/fixtures/test_source_file_duplicate_basenames/test_calc_beta.c +15 -0
  77. data/assets/fixtures/tests_with_conditional_includes/src/feature_extra2.h +13 -0
  78. data/assets/fixtures/tests_with_conditional_includes/src/macro_target_extra.h +13 -0
  79. data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget.c +19 -3
  80. data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget.h +1 -0
  81. data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget_feature.c +17 -1
  82. data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/test/test_widget.c +12 -4
  83. data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/test/test_widget_feature.c +8 -5
  84. data/assets/fixtures/tests_with_conditional_mocks/src/Case_01.c +7 -0
  85. data/assets/fixtures/tests_with_conditional_mocks/src/Case_01.h +6 -0
  86. data/assets/fixtures/tests_with_conditional_mocks/src/Case_02.c +16 -0
  87. data/assets/fixtures/tests_with_conditional_mocks/src/Case_02.h +6 -0
  88. data/assets/fixtures/tests_with_conditional_mocks/src/FeatureConfig.h +6 -0
  89. data/assets/fixtures/tests_with_conditional_mocks/src/Gpt.h +6 -0
  90. data/assets/fixtures/tests_with_conditional_mocks/src/MyModuleConfig.h +17 -0
  91. data/assets/fixtures/tests_with_conditional_mocks/src/MyModulePart1.h +6 -0
  92. data/assets/fixtures/tests_with_conditional_mocks/src/MyModulePart2.h +6 -0
  93. data/assets/fixtures/tests_with_conditional_mocks/src/drivers/widget.h +6 -0
  94. data/assets/fixtures/tests_with_conditional_mocks/src/reader.c +7 -0
  95. data/assets/fixtures/tests_with_conditional_mocks/src/reader.h +6 -0
  96. data/assets/fixtures/tests_with_conditional_mocks/test/test_Case_01.c +21 -0
  97. data/assets/fixtures/tests_with_conditional_mocks/test/test_Case_01_legacy.c +16 -0
  98. data/assets/fixtures/tests_with_conditional_mocks/test/test_Case_02.c +31 -0
  99. data/assets/fixtures/tests_with_conditional_mocks/test/test_FeatureConfig.c +15 -0
  100. data/assets/fixtures/tests_with_conditional_mocks/test/test_reader.c +13 -0
  101. data/assets/fixtures/tests_with_duplicate_test_names/integration/test_foo.c +21 -0
  102. data/assets/fixtures/tests_with_duplicate_test_names/unit/test_foo.c +21 -0
  103. data/assets/fixtures/tests_with_fallback_conditionals/src/conditional_module.c +28 -0
  104. data/assets/{tests_with_fallback_conditionals → fixtures/tests_with_fallback_conditionals}/test/test_conditionals.c +8 -1
  105. data/assets/fixtures/tests_with_multiple_assembly_extensions/src/asm_helper_lower.s +2 -0
  106. data/assets/fixtures/tests_with_multiple_assembly_extensions/src/asm_helper_upper.S +13 -0
  107. data/assets/fixtures/tests_with_multiple_assembly_extensions/src/counter_module.c +13 -0
  108. data/assets/fixtures/tests_with_multiple_assembly_extensions/src/counter_module.h +13 -0
  109. data/assets/fixtures/tests_with_multiple_assembly_extensions/test/test_counter_module.c +27 -0
  110. data/assets/fixtures/tests_with_subdir_includes/src/module/app/config.h +13 -0
  111. data/assets/fixtures/tests_with_subdir_includes/src/module/drivers/config.h +13 -0
  112. data/assets/fixtures/tests_with_subdir_includes/src/module/sensor.c +30 -0
  113. data/assets/fixtures/tests_with_subdir_includes/src/module/sensor.h +13 -0
  114. data/assets/fixtures/tests_with_subdir_includes/src/shared/config.h +13 -0
  115. data/assets/fixtures/tests_with_subdir_includes/test/test_sensor.c +32 -0
  116. data/bin/actionator.rb +234 -0
  117. data/bin/app_cfg.rb +28 -0
  118. data/bin/cli.rb +78 -47
  119. data/bin/cli_handler.rb +96 -58
  120. data/bin/cli_helper.rb +95 -49
  121. data/bin/cli_options_transform.rb +22 -0
  122. data/bin/{configinator.rb → composinator.rb} +39 -32
  123. data/bin/mixin_resolvinator.rb +124 -0
  124. data/bin/mixin_standardizer.rb +31 -61
  125. data/bin/mixinator.rb +27 -29
  126. data/bin/mixins.rb +0 -5
  127. data/bin/objects.yml +20 -7
  128. data/bin/path_validator.rb +6 -5
  129. data/bin/projectinator.rb +51 -142
  130. data/bin/rake_patches.rb +36 -2
  131. data/bin/recursive_merger.rb +7 -1
  132. data/bin/versionator.rb +2 -3
  133. data/ceedling.gemspec +83 -12
  134. data/docs/BreakingChanges.md +46 -2
  135. data/docs/CONTRIBUTING.md +45 -29
  136. data/docs/CeedlingPullRequestChecklist.md +10 -9
  137. data/docs/Changelog.md +337 -37
  138. data/docs/KnownIssues.md +30 -4
  139. data/docs/ReleaseNotes.md +288 -12
  140. data/docs/SECURITY.md +46 -2
  141. data/docs/ThrowTheSwitchCodingStandard.md +21 -3
  142. data/docs/overrides/main.html +35 -0
  143. data/examples/temp_sensor/mixin/add_bullseye.yml +19 -0
  144. data/examples/wondrous_forest/README.md +3 -0
  145. data/examples/wondrous_forest/src/sensors/light/Calibration.c +21 -0
  146. data/examples/wondrous_forest/src/sensors/light/Calibration.h +14 -0
  147. data/examples/wondrous_forest/src/sensors/soil/Calibration.c +23 -0
  148. data/examples/wondrous_forest/src/sensors/soil/Calibration.h +14 -0
  149. data/examples/wondrous_forest/test/TestCalibration.c +39 -0
  150. data/lib/ceedling/batchinator.rb +81 -22
  151. data/lib/ceedling/c_extractor/README.md +61 -0
  152. data/lib/ceedling/c_extractor/c_extractor.rb +33 -2
  153. data/lib/ceedling/c_extractor/c_extractor_code_text.rb +18 -10
  154. data/lib/ceedling/c_extractor/c_extractor_constants.rb +10 -10
  155. data/lib/ceedling/c_extractor/c_extractor_declarations.rb +14 -14
  156. data/lib/ceedling/c_extractor/c_extractor_functions.rb +10 -13
  157. data/lib/ceedling/c_extractor/c_extractor_preprocessing.rb +77 -0
  158. data/lib/ceedling/c_extractor/c_extractor_types.rb +8 -5
  159. data/lib/ceedling/ceedling.h +33 -0
  160. data/lib/ceedling/config/config_matchinator.rb +36 -13
  161. data/lib/ceedling/config/configurator.rb +370 -531
  162. data/lib/ceedling/config/configurator_builder.rb +253 -365
  163. data/lib/ceedling/config/configurator_plugins.rb +68 -102
  164. data/lib/ceedling/config/configurator_setup.rb +360 -616
  165. data/lib/ceedling/config/configurator_validator.rb +114 -142
  166. data/lib/ceedling/config/line_marker_suppressors.rb +67 -0
  167. data/lib/ceedling/constants.rb +60 -6
  168. data/lib/ceedling/defaults.rb +28 -14
  169. data/lib/ceedling/defineinator.rb +9 -4
  170. data/lib/ceedling/dependencies/README.md +69 -0
  171. data/lib/ceedling/dependencies/dependency_cache_store.rb +160 -0
  172. data/lib/ceedling/dependencies/dependency_debug_tree.rb +129 -0
  173. data/lib/ceedling/dependencies/dependency_differ.rb +127 -0
  174. data/lib/ceedling/dependencies/dependency_hasher.rb +94 -0
  175. data/lib/ceedling/dependencies/dependency_path_normalizer.rb +80 -0
  176. data/lib/ceedling/dependencies/dependency_tracker.rb +405 -0
  177. data/lib/ceedling/dependencies/dependinator.rb +65 -0
  178. data/lib/ceedling/dependencies/gcc_dependency_parser.rb +86 -0
  179. data/lib/ceedling/encodinator.rb +23 -11
  180. data/lib/ceedling/file_finder.rb +373 -89
  181. data/lib/ceedling/file_finder_helper.rb +44 -33
  182. data/lib/ceedling/file_path_collection_utils.rb +17 -4
  183. data/lib/ceedling/file_path_utils.rb +310 -52
  184. data/lib/ceedling/file_wrapper.rb +275 -8
  185. data/lib/ceedling/filename_extension.rb +91 -0
  186. data/lib/ceedling/flaginator.rb +6 -2
  187. data/lib/ceedling/generators/generator.rb +192 -70
  188. data/lib/ceedling/generators/generator_helper.rb +116 -69
  189. data/lib/ceedling/generators/generator_mocks.rb +13 -8
  190. data/lib/ceedling/generators/generator_partials.rb +47 -15
  191. data/lib/ceedling/generators/generator_test_results.rb +29 -17
  192. data/lib/ceedling/generators/generator_test_results_backtrace.rb +199 -107
  193. data/lib/ceedling/generators/generator_test_results_sanity_checker.rb +1 -1
  194. data/lib/ceedling/includes/include_factory.rb +21 -6
  195. data/lib/ceedling/includes/include_pathinator.rb +40 -4
  196. data/lib/ceedling/includes/includes.rb +215 -61
  197. data/lib/ceedling/loginator.rb +13 -4
  198. data/lib/ceedling/objects.yml +216 -33
  199. data/lib/ceedling/parsing_parcels.rb +39 -13
  200. data/lib/ceedling/partials/README.md +53 -0
  201. data/lib/ceedling/partials/partializer.rb +118 -26
  202. data/lib/ceedling/partials/partializer_config.rb +141 -8
  203. data/lib/ceedling/partials/partializer_helper.rb +88 -2
  204. data/lib/ceedling/partials/partializer_utils.rb +1 -1
  205. data/lib/ceedling/partials/partials.rb +4 -4
  206. data/lib/ceedling/path_matcher.rb +163 -0
  207. data/lib/ceedling/path_mirror.rb +73 -0
  208. data/lib/ceedling/plugins/plugin.rb +1 -1
  209. data/lib/ceedling/plugins/plugin_manager.rb +31 -15
  210. data/lib/ceedling/plugins/plugin_manager_helper.rb +5 -1
  211. data/lib/ceedling/plugins/plugin_reportinator.rb +36 -7
  212. data/lib/ceedling/plugins/plugin_reportinator_helper.rb +3 -3
  213. data/lib/ceedling/plugins/report_log_writer_plugin.rb +66 -0
  214. data/lib/ceedling/plugins/report_tests_stdout_plugin.rb +18 -5
  215. data/lib/ceedling/preprocess/README.md +135 -120
  216. data/lib/ceedling/preprocess/c_comment_scanner.rb +9 -7
  217. data/lib/ceedling/preprocess/c_preprocessor_conditionals.rb +27 -10
  218. data/lib/ceedling/preprocess/preprocessinator.rb +253 -217
  219. data/lib/ceedling/preprocess/preprocessinator_bare_includes_extractor.rb +7 -10
  220. data/lib/ceedling/preprocess/preprocessinator_code_finder.rb +8 -6
  221. data/lib/ceedling/preprocess/preprocessinator_comment_stripper.rb +5 -3
  222. data/lib/ceedling/preprocess/preprocessinator_file_assembler.rb +86 -82
  223. data/lib/ceedling/preprocess/preprocessinator_includes_handler.rb +182 -163
  224. data/lib/ceedling/preprocess/preprocessinator_line_marker_includes_extractor.rb +174 -8
  225. data/lib/ceedling/preprocess/preprocessinator_reconstructor.rb +41 -20
  226. data/lib/ceedling/quote_include_isolator.rb +129 -0
  227. data/lib/ceedling/rake_app/rake_task_registry.rb +9 -9
  228. data/lib/ceedling/rake_app/rake_wrapper.rb +0 -13
  229. data/lib/ceedling/rake_app/rakefile_component_resolver.rb +24 -12
  230. data/lib/ceedling/rake_app/test_task_name.rb +29 -0
  231. data/lib/ceedling/rakefile.rb +3 -1
  232. data/lib/ceedling/{tasks_base.rake → rakefiles/base/tasks_base.rake} +1 -1
  233. data/lib/ceedling/{tasks_filesystem.rake → rakefiles/base/tasks_filesystem.rake} +3 -0
  234. data/lib/ceedling/rakefiles/release/rules_release.rake +52 -0
  235. data/lib/ceedling/{erb_wrapper.rb → rakefiles/release/tasks_release.rake} +5 -8
  236. data/lib/ceedling/{rules_tests.rake → rakefiles/tests/rules_tests.rake} +4 -18
  237. data/lib/ceedling/rakefiles/tests/rules_tests_generate.rake +54 -0
  238. data/lib/ceedling/{tasks_tests.rake → rakefiles/tests/tasks_tests.rake} +11 -20
  239. data/lib/ceedling/rakefiles/tests/tasks_tests_generate.rake +55 -0
  240. data/lib/ceedling/release_invoker/README.md +35 -0
  241. data/lib/ceedling/release_invoker/release_build_executor.rb +263 -0
  242. data/lib/ceedling/release_invoker/release_build_planner.rb +80 -0
  243. data/lib/ceedling/release_invoker/release_invoker.rb +78 -0
  244. data/lib/ceedling/release_invoker/release_invoker_types.rb +40 -0
  245. data/lib/ceedling/reportinator.rb +18 -2
  246. data/lib/ceedling/ruby_expandinator.rb +40 -1
  247. data/lib/ceedling/setupinator.rb +13 -3
  248. data/lib/ceedling/system_wrapper.rb +17 -0
  249. data/lib/ceedling/templateinator.rb +146 -0
  250. data/lib/ceedling/test_context_extractor.rb +59 -28
  251. data/lib/ceedling/test_invoker/HEADER_COLLISIONS.md +41 -0
  252. data/lib/ceedling/test_invoker/PIPELINE.md +142 -0
  253. data/lib/ceedling/test_invoker/README.md +6 -0
  254. data/lib/ceedling/test_invoker/mock_locator.rb +49 -0
  255. data/lib/ceedling/test_invoker/partials_manager.rb +426 -0
  256. data/lib/ceedling/test_invoker/standin_headerinator.rb +136 -0
  257. data/lib/ceedling/test_invoker/test_bare_includes_extractinator.rb +117 -0
  258. data/lib/ceedling/test_invoker/test_build_executor.rb +800 -429
  259. data/lib/ceedling/test_invoker/test_build_planner.rb +175 -70
  260. data/lib/ceedling/test_invoker/test_build_setup.rb +132 -241
  261. data/lib/ceedling/test_invoker/test_build_validations.rb +102 -0
  262. data/lib/ceedling/test_invoker/test_file_preprocessinator.rb +148 -0
  263. data/lib/ceedling/test_invoker/test_includes_extractinator.rb +34 -0
  264. data/lib/ceedling/test_invoker/test_includes_preprocessinator.rb +118 -0
  265. data/lib/ceedling/test_invoker/test_includes_reconcilinator.rb +149 -0
  266. data/lib/ceedling/test_invoker/test_invoker.rb +16 -183
  267. data/lib/ceedling/test_invoker/test_invoker_types.rb +85 -16
  268. data/lib/ceedling/test_invoker/test_pipeline_helpers.rb +121 -0
  269. data/lib/ceedling/test_invoker/test_pipeline_manager.rb +303 -0
  270. data/lib/ceedling/test_invoker/test_runner_generatinator.rb +105 -0
  271. data/lib/ceedling/test_invoker/test_search_paths.rb +73 -0
  272. data/lib/ceedling/test_invoker/test_source_file_directive_resolver.rb +78 -0
  273. data/lib/ceedling/tool_executor.rb +42 -13
  274. data/lib/ceedling/tool_executor_helper.rb +1 -1
  275. data/lib/ceedling/tool_validator.rb +124 -123
  276. data/lib/ceedling/yaml_wrapper.rb +5 -3
  277. data/lib/version.rb +19 -2
  278. data/mkdocs.prerelease.yml +42 -0
  279. data/mkdocs.yml +10 -2
  280. data/plugins/bullseye/bullseye.rake +71 -111
  281. data/plugins/bullseye/config/defaults.yml +12 -54
  282. data/plugins/bullseye/config/defaults_bullseye.rb +182 -0
  283. data/plugins/bullseye/lib/bullseye.rb +511 -120
  284. data/plugins/bullseye/lib/bullseye_constants.rb +100 -0
  285. data/plugins/command_hooks/lib/command_hooks.rb +117 -199
  286. data/plugins/compile_commands_json_db/lib/compile_commands_json_db.rb +72 -27
  287. data/plugins/cppcheck/config/defaults.yml +6 -1
  288. data/plugins/cppcheck/config/defaults_cppcheck.rb +5 -1
  289. data/plugins/cppcheck/cppcheck.rake +7 -1
  290. data/plugins/cppcheck/lib/cppcheck.rb +175 -26
  291. data/plugins/cppcheck/lib/cppcheck_constants.rb +12 -0
  292. data/plugins/cppcheck/lib/cppcheck_reports.rb +5 -1
  293. data/plugins/dependencies/Rakefile +14 -2
  294. data/plugins/dependencies/config/defaults.yml +9 -6
  295. data/plugins/dependencies/dependencies.rake +46 -76
  296. data/plugins/dependencies/example/boss/project.yml +1 -1
  297. data/plugins/dependencies/example/supervisor/project.yml +1 -1
  298. data/plugins/dependencies/example/version.tar.gzip +0 -0
  299. data/plugins/dependencies/lib/dependencies.rb +232 -427
  300. data/plugins/dependencies/lib/dependency_commands.rb +72 -0
  301. data/plugins/dependencies/lib/dependency_environment.rb +57 -0
  302. data/plugins/dependencies/lib/dependency_spec.rb +145 -0
  303. data/plugins/fff/.rspec +1 -0
  304. data/plugins/fff/Rakefile +14 -2
  305. data/plugins/fff/examples/fff_example/project.yml +1 -1
  306. data/plugins/fff/lib/fff.rb +30 -9
  307. data/plugins/fff/lib/fff_mock_generator.rb +142 -128
  308. data/plugins/fff/spec/fff_mock_header_generator_spec.rb +15 -0
  309. data/plugins/fff/spec/fff_mock_source_generator_spec.rb +14 -0
  310. data/plugins/fff/spec/spec_helper.rb +45 -0
  311. data/plugins/fff/src/fff_unity_helper.h +5 -0
  312. data/plugins/fff/vendor/fff/fakegen.rb +5 -4
  313. data/plugins/fff/vendor/fff/fff.h +4 -4
  314. data/plugins/gcov/config/defaults.yml +5 -0
  315. data/plugins/gcov/gcov.rake +16 -15
  316. data/plugins/gcov/lib/console_reportinator.rb +140 -20
  317. data/plugins/gcov/lib/gcov.rb +155 -60
  318. data/plugins/gcov/lib/gcov_constants.rb +4 -7
  319. data/plugins/gcov/lib/gcov_reportinator.rb +90 -0
  320. data/plugins/gcov/lib/gcov_types.rb +62 -1
  321. data/plugins/gcov/lib/gcovr_reportinator.rb +255 -213
  322. data/plugins/gcov/lib/reportgenerator_reportinator.rb +122 -44
  323. data/plugins/module_generator/Rakefile +4 -4
  324. data/plugins/module_generator/config/module_generator.yml +0 -1
  325. data/plugins/module_generator/example/project.yml +1 -1
  326. data/plugins/module_generator/lib/module_generator.rb +117 -87
  327. data/plugins/module_generator/lib/module_generator_options.rb +150 -0
  328. data/plugins/module_generator/lib/module_generator_project.rb +45 -0
  329. data/plugins/module_generator/lib/module_generator_request.rb +83 -0
  330. data/plugins/module_generator/lib/module_generator_test_file.rb +68 -0
  331. data/plugins/module_generator/lib/module_generator_unity.rb +24 -0
  332. data/plugins/module_generator/module_generator.rake +24 -46
  333. data/plugins/report_build_warnings_log/config/defaults.yml +4 -1
  334. data/plugins/report_build_warnings_log/lib/report_build_warnings_log.rb +47 -55
  335. data/plugins/report_build_warnings_log/lib/warning_collector.rb +140 -0
  336. data/plugins/report_build_warnings_log/lib/warning_reports.rb +135 -0
  337. data/plugins/report_tests_gtestlike_stdout/assets/test_results.template +3 -0
  338. data/{spec/units/configurator_builder_spec.rb → plugins/report_tests_gtestlike_stdout/config/defaults.yml} +6 -10
  339. data/plugins/report_tests_gtestlike_stdout/lib/gtestlike_report.rb +168 -0
  340. data/plugins/report_tests_gtestlike_stdout/lib/report_tests_gtestlike_stdout.rb +25 -1
  341. data/plugins/report_tests_ide_stdout/assets/test_results.template +50 -0
  342. data/plugins/report_tests_ide_stdout/config/defaults.yml +13 -0
  343. data/plugins/report_tests_ide_stdout/lib/ide_report_lines.rb +103 -0
  344. data/plugins/report_tests_ide_stdout/lib/report_tests_ide_stdout.rb +12 -4
  345. data/plugins/report_tests_log_factory/lib/cppunit_tests_reporter.rb +33 -51
  346. data/plugins/report_tests_log_factory/lib/html_tests_reporter.rb +286 -295
  347. data/plugins/report_tests_log_factory/lib/json_tests_reporter.rb +22 -35
  348. data/plugins/report_tests_log_factory/lib/junit_tests_reporter.rb +91 -133
  349. data/plugins/report_tests_log_factory/lib/report_tests_log_factory.rb +72 -86
  350. data/plugins/report_tests_log_factory/lib/tests_reporter.rb +31 -12
  351. data/plugins/report_tests_pretty_stdout/assets/{template.erb → test_results.template} +8 -8
  352. data/plugins/report_tests_raw_output_log/lib/report_tests_raw_output_log.rb +18 -48
  353. data/plugins/report_tests_teamcity_stdout/lib/report_tests_teamcity_stdout.rb +13 -2
  354. data/plugins/sanitize/config/defaults.yml +44 -0
  355. data/plugins/sanitize/config/defaults_sanitize.rb +20 -0
  356. data/plugins/sanitize/lib/sanitize.rb +174 -0
  357. data/plugins/sanitize/lib/sanitize_config.rb +110 -0
  358. data/plugins/sanitize/lib/sanitize_constants.rb +13 -0
  359. data/plugins/sanitize/lib/sanitize_findings.rb +85 -0
  360. data/plugins/sanitize/lib/sanitize_records.rb +115 -0
  361. data/plugins/sanitize/lib/sanitize_reports.rb +135 -0
  362. data/plugins/sanitize/sanitize.rake +108 -0
  363. data/plugins/valgrind/config/defaults.yml +7 -1
  364. data/plugins/valgrind/config/defaults_valgrind.rb +6 -1
  365. data/plugins/valgrind/lib/valgrind.rb +202 -39
  366. data/plugins/valgrind/lib/valgrind_constants.rb +4 -0
  367. data/plugins/valgrind/lib/valgrind_report.rb +52 -0
  368. data/plugins/valgrind/valgrind.rake +37 -15
  369. data/site-local/404.html +239 -19
  370. data/site-local/assets/javascripts/{bundle.d7400e89.min.js → bundle.c21346df.min.js} +3 -3
  371. data/site-local/assets/javascripts/{bundle.d7400e89.min.js.map → bundle.c21346df.min.js.map} +2 -2
  372. data/site-local/assets/javascripts/workers/{search.2c215733.min.js → search.a7633da7.min.js} +2 -2
  373. data/site-local/assets/javascripts/workers/{search.2c215733.min.js.map → search.a7633da7.min.js.map} +1 -1
  374. data/site-local/assets/stylesheets/main.57a0d79d.min.css +6 -0
  375. data/site-local/assets/stylesheets/main.57a0d79d.min.css.map +1 -0
  376. data/site-local/assets/stylesheets/palette.fb2fffe2.min.css +4 -0
  377. data/site-local/assets/stylesheets/palette.fb2fffe2.min.css.map +1 -0
  378. data/site-local/configuration/environment-vars.html +239 -19
  379. data/site-local/configuration/global-collections.html +239 -24
  380. data/site-local/configuration/index.html +240 -20
  381. data/site-local/configuration/loading.html +251 -27
  382. data/site-local/configuration/mixins.html +247 -26
  383. data/site-local/configuration/parallel-builds.html +239 -19
  384. data/site-local/configuration/project-file.html +268 -37
  385. data/site-local/configuration/reference/cexception.html +246 -25
  386. data/site-local/configuration/reference/cmock.html +272 -19
  387. data/site-local/configuration/reference/defines.html +263 -34
  388. data/site-local/configuration/reference/environment.html +246 -26
  389. data/site-local/configuration/reference/extension.html +352 -21
  390. data/site-local/configuration/reference/files.html +258 -24
  391. data/site-local/configuration/reference/flags.html +268 -31
  392. data/site-local/configuration/reference/index.html +239 -19
  393. data/site-local/configuration/reference/libraries.html +239 -19
  394. data/site-local/configuration/reference/mixins.html +239 -19
  395. data/site-local/configuration/reference/partials.html +240 -24
  396. data/site-local/configuration/reference/paths.html +269 -23
  397. data/site-local/configuration/reference/plugins.html +239 -19
  398. data/site-local/configuration/reference/project.html +292 -29
  399. data/site-local/configuration/reference/release-build.html +247 -19
  400. data/site-local/configuration/reference/test-build.html +281 -29
  401. data/site-local/configuration/reference/test-runner.html +279 -22
  402. data/site-local/configuration/reference/tools.html +257 -31
  403. data/site-local/configuration/reference/unity.html +271 -20
  404. data/site-local/configuration/which-ceedling.html +239 -19
  405. data/site-local/development/index.html +245 -19
  406. data/site-local/development/plugins/configuration.html +260 -22
  407. data/site-local/development/plugins/index.html +258 -20
  408. data/site-local/development/plugins/plugin-subclass.html +912 -174
  409. data/site-local/development/plugins/rake-tasks.html +269 -21
  410. data/site-local/development/releases.html +4759 -0
  411. data/site-local/development/workflow.html +1023 -58
  412. data/site-local/getting-started/builds.html +4593 -0
  413. data/site-local/getting-started/command-line.html +409 -39
  414. data/site-local/getting-started/example-projects/cipher-quest.html +239 -19
  415. data/site-local/getting-started/example-projects/index.html +240 -20
  416. data/site-local/getting-started/example-projects/temp-sensor.html +239 -19
  417. data/site-local/getting-started/example-projects/wondrous-forest.html +239 -19
  418. data/site-local/getting-started/index.html +246 -19
  419. data/site-local/getting-started/installation.html +249 -27
  420. data/site-local/getting-started/quick-start.html +242 -20
  421. data/site-local/help.html +246 -19
  422. data/site-local/index.html +284 -27
  423. data/site-local/overview/build-system.html +240 -20
  424. data/site-local/overview/index.html +239 -19
  425. data/site-local/overview/test-environments.html +248 -19
  426. data/site-local/overview/tools-and-frameworks.html +239 -19
  427. data/site-local/plugins/beep.html +242 -19
  428. data/site-local/plugins/bullseye/index.html +5068 -0
  429. data/site-local/plugins/bullseye/licensing.html +4826 -0
  430. data/site-local/plugins/command-hooks.html +258 -34
  431. data/site-local/plugins/compile-commands-json-db.html +247 -22
  432. data/site-local/plugins/cppcheck.html +1073 -268
  433. data/site-local/plugins/dependencies.html +927 -249
  434. data/site-local/plugins/fff.html +288 -21
  435. data/site-local/plugins/gcov/examples.html +243 -20
  436. data/site-local/plugins/gcov/gcovr.html +559 -71
  437. data/site-local/plugins/gcov/index.html +242 -19
  438. data/site-local/plugins/gcov/overview.html +253 -23
  439. data/site-local/plugins/gcov/reportgenerator.html +380 -46
  440. data/site-local/plugins/gcov/reporting.html +339 -105
  441. data/site-local/plugins/gcov/setup.html +244 -20
  442. data/site-local/plugins/gcov/tool-versions.html +292 -24
  443. data/site-local/plugins/gcov/troubleshooting.html +265 -42
  444. data/site-local/plugins/index.html +285 -41
  445. data/site-local/plugins/module-generator.html +770 -200
  446. data/site-local/plugins/report-build-warnings-log.html +569 -38
  447. data/site-local/plugins/report-tests-gtestlike-stdout.html +458 -89
  448. data/site-local/plugins/report-tests-ide-stdout.html +645 -56
  449. data/site-local/plugins/report-tests-log-factory.html +364 -111
  450. data/site-local/plugins/report-tests-pretty-stdout.html +243 -20
  451. data/site-local/plugins/report-tests-raw-output-log.html +242 -19
  452. data/site-local/plugins/report-tests-teamcity-stdout.html +252 -29
  453. data/site-local/plugins/sanitize.html +5322 -0
  454. data/site-local/plugins/valgrind.html +414 -34
  455. data/site-local/{plugins/bullseye.html → project/index.html} +288 -222
  456. data/site-local/project/release-history.html +242 -22
  457. data/site-local/project/sbom.html +4712 -0
  458. data/site-local/project/upgrade.html +241 -21
  459. data/site-local/reference/build-directives.html +248 -19
  460. data/site-local/reference/command-line.html +364 -21
  461. data/site-local/reference/environment-vars.html +239 -19
  462. data/site-local/reference/gcov-plugin.html +483 -23
  463. data/site-local/reference/global-collections.html +240 -20
  464. data/site-local/reference/index.html +239 -19
  465. data/site-local/reference/partials-macros.html +249 -19
  466. data/site-local/reference/project-configuration.html +239 -19
  467. data/site-local/sitemap.xml.gz +0 -0
  468. data/{docs/mkdocs/snapshot/assets → site-local/snapshot/assets/features}/project.yml +4 -1
  469. data/site-local/snapshot/examples/cipher_quest/index.html +249 -29
  470. data/site-local/snapshot/examples/temp_sensor/index.html +241 -21
  471. data/site-local/snapshot/examples/wondrous_forest/index.html +256 -30
  472. data/site-local/snapshot/plugins/bullseye/config/defaults.yml +24 -0
  473. data/site-local/snapshot/plugins/bullseye/config/defaults_bullseye.rb +182 -0
  474. data/site-local/snapshot/plugins/gcov/config/defaults.yml +5 -0
  475. data/site-local/testing-guide/build-directives.html +331 -35
  476. data/site-local/testing-guide/conventions.html +671 -160
  477. data/site-local/testing-guide/frameworks.html +244 -24
  478. data/site-local/testing-guide/index.html +239 -26
  479. data/site-local/testing-guide/partials/configuration.html +241 -21
  480. data/site-local/testing-guide/partials/conventions.html +308 -23
  481. data/site-local/testing-guide/partials/directives.html +452 -58
  482. data/site-local/testing-guide/partials/example.html +247 -27
  483. data/site-local/testing-guide/partials/index.html +246 -19
  484. data/site-local/testing-guide/partials/overview.html +239 -19
  485. data/site-local/testing-guide/partials/variables.html +244 -24
  486. data/site-local/testing-guide/test-cases.html +246 -26
  487. data/site-local/testing-guide/test-sample.html +245 -25
  488. data/site-local/testing-guide/test-suite-anatomy.html +239 -19
  489. data/spec/integration/actionator_file_operations_spec.rb +287 -0
  490. data/spec/integration/analysis_tool_output_spec.rb +204 -0
  491. data/spec/{units/c_extractor/c_extractor_integration_spec.rb → integration/c_extractor_composition_spec.rb} +196 -17
  492. data/spec/integration/command_hooks_plugin_spec.rb +152 -0
  493. data/spec/integration/compile_commands_json_db_spec.rb +76 -0
  494. data/spec/integration/configurator_pipeline_spec.rb +190 -0
  495. data/spec/integration/configurator_plugins_spec.rb +122 -0
  496. data/spec/integration/configurator_validation_spec.rb +98 -0
  497. data/spec/integration/dependencies/dependency_tracker_cache_hardening_spec.rb +396 -0
  498. data/spec/integration/dependencies/dependency_tracker_core_spec.rb +284 -0
  499. data/spec/integration/dependencies/dependency_tracker_diagnose_spec.rb +224 -0
  500. data/spec/integration/dependencies/dependency_tracker_filename_handling_spec.rb +118 -0
  501. data/spec/integration/dependencies/dependency_tracker_gcc_deps_spec.rb +199 -0
  502. data/spec/integration/dependencies/dependency_tracker_pruning_spec.rb +167 -0
  503. data/spec/integration/dependencies_plugin_spec.rb +473 -0
  504. data/spec/integration/erb_dependency_removed_spec.rb +167 -0
  505. data/spec/integration/includes_extraction_spec.rb +612 -0
  506. data/spec/integration/mixin_loading_spec.rb +414 -0
  507. data/spec/integration/module_generator_spec.rb +436 -0
  508. data/spec/integration/partials_fallback_preprocessing_spec.rb +316 -0
  509. data/spec/integration/partials_header_composition_spec.rb +889 -0
  510. data/spec/integration/partials_module_resolution_spec.rb +372 -0
  511. data/spec/integration/partials_symbol_linkage_spec.rb +371 -0
  512. data/spec/integration/preprocessing_transient_io_retry_spec.rb +135 -0
  513. data/spec/integration/quote_include_isolator_spec.rb +167 -0
  514. data/spec/integration/rake_task_registry_plugins_spec.rb +95 -0
  515. data/spec/integration/report_build_warnings_log_spec.rb +170 -0
  516. data/spec/integration/report_tests_log_factory_spec.rb +100 -0
  517. data/spec/integration/sanitizer_exclusions_spec.rb +126 -0
  518. data/spec/integration/system_harness_sanitizers_spec.rb +104 -0
  519. data/spec/integration/test_build_parallel_barrier_spec.rb +89 -0
  520. data/spec/integration/test_executable_manifest_spec.rb +118 -0
  521. data/spec/integration/test_includes_extractinator_spec.rb +293 -0
  522. data/spec/integration/tool_executor_spec.rb +224 -0
  523. data/spec/integration/tool_validator_spec.rb +133 -0
  524. data/spec/integration/vendor_copy_transient_io_retry_spec.rb +178 -0
  525. data/spec/manual/stress_test.rb +1 -1
  526. data/spec/support/config_yaml_helper.rb +17 -0
  527. data/spec/support/fixtures/sanitizer_reports/clang_asan_heap.txt +45 -0
  528. data/spec/support/fixtures/sanitizer_reports/clang_ubsan_shift.txt +5 -0
  529. data/spec/support/fixtures/sanitizer_reports/gcc_heap.txt +47 -0
  530. data/spec/support/fixtures/sanitizer_reports/gcc_leak.txt +10 -0
  531. data/spec/support/fixtures/sanitizer_reports/gcc_segv.txt +6 -0
  532. data/spec/support/fixtures/sanitizer_reports/gcc_ubsan_shift.txt +6 -0
  533. data/spec/support/fixtures/templates/bullseye__all_pass.txt +6 -0
  534. data/spec/support/fixtures/templates/bullseye__coverage_branches_only.txt +6 -0
  535. data/spec/support/fixtures/templates/bullseye__coverage_functions_only.txt +6 -0
  536. data/spec/support/fixtures/templates/bullseye__coverage_none.txt +6 -0
  537. data/spec/support/fixtures/templates/bullseye__empty.txt +6 -0
  538. data/spec/support/fixtures/templates/bullseye__gcov_context.txt +6 -0
  539. data/spec/support/fixtures/templates/bullseye__mixed_all.txt +6 -0
  540. data/spec/support/fixtures/templates/bullseye__one_failure_matching.txt +6 -0
  541. data/spec/support/fixtures/templates/bullseye__one_failure_multiline.txt +6 -0
  542. data/spec/support/fixtures/templates/bullseye__one_failure_no_message.txt +6 -0
  543. data/spec/support/fixtures/templates/bullseye__one_failure_nonmatching.txt +6 -0
  544. data/spec/support/fixtures/templates/bullseye__one_ignore_no_message.txt +6 -0
  545. data/spec/support/fixtures/templates/bullseye__one_ignore_with_message.txt +6 -0
  546. data/spec/support/fixtures/templates/bullseye__stdout_only.txt +6 -0
  547. data/spec/support/fixtures/templates/ide__all_pass.txt +10 -0
  548. data/spec/support/fixtures/templates/ide__coverage_branches_only.txt +10 -0
  549. data/spec/support/fixtures/templates/ide__coverage_functions_only.txt +10 -0
  550. data/spec/support/fixtures/templates/ide__coverage_none.txt +10 -0
  551. data/spec/support/fixtures/templates/ide__empty.txt +8 -0
  552. data/spec/support/fixtures/templates/ide__gcov_context.txt +28 -0
  553. data/spec/support/fixtures/templates/ide__mixed_all.txt +29 -0
  554. data/spec/support/fixtures/templates/ide__one_failure_matching.txt +15 -0
  555. data/spec/support/fixtures/templates/ide__one_failure_multiline.txt +17 -0
  556. data/spec/support/fixtures/templates/ide__one_failure_no_message.txt +15 -0
  557. data/spec/support/fixtures/templates/ide__one_failure_nonmatching.txt +15 -0
  558. data/spec/support/fixtures/templates/ide__one_ignore_no_message.txt +15 -0
  559. data/spec/support/fixtures/templates/ide__one_ignore_with_message.txt +15 -0
  560. data/spec/support/fixtures/templates/ide__stdout_only.txt +16 -0
  561. data/spec/support/fixtures/templates/pretty__all_pass.txt +8 -0
  562. data/spec/support/fixtures/templates/pretty__coverage_branches_only.txt +8 -0
  563. data/spec/support/fixtures/templates/pretty__coverage_functions_only.txt +8 -0
  564. data/spec/support/fixtures/templates/pretty__coverage_none.txt +8 -0
  565. data/spec/support/fixtures/templates/pretty__empty.txt +6 -0
  566. data/spec/support/fixtures/templates/pretty__gcov_context.txt +31 -0
  567. data/spec/support/fixtures/templates/pretty__mixed_all.txt +35 -0
  568. data/spec/support/fixtures/templates/pretty__one_failure_matching.txt +15 -0
  569. data/spec/support/fixtures/templates/pretty__one_failure_multiline.txt +17 -0
  570. data/spec/support/fixtures/templates/pretty__one_failure_no_message.txt +15 -0
  571. data/spec/support/fixtures/templates/pretty__one_failure_nonmatching.txt +15 -0
  572. data/spec/support/fixtures/templates/pretty__one_ignore_no_message.txt +15 -0
  573. data/spec/support/fixtures/templates/pretty__one_ignore_with_message.txt +15 -0
  574. data/spec/support/fixtures/templates/pretty__stdout_only.txt +15 -0
  575. data/spec/support/fixtures/valgrind_reports/sigsegv.log +51 -0
  576. data/spec/support/fixtures/valgrind_reports/sigsegv.xml +182 -0
  577. data/spec/support/include_guard_helper.rb +20 -0
  578. data/spec/support/integration/configurator_integration_helper.rb +162 -0
  579. data/spec/support/integration/dependency_tracker_integration_helper.rb +136 -0
  580. data/spec/support/integration/partials_generation_integration_helper.rb +726 -0
  581. data/spec/support/integration/spec_integration_helper.rb +285 -0
  582. data/spec/support/integration/test_includes_harness.rb +259 -0
  583. data/spec/support/integration/tool_executor_integration_helper.rb +55 -0
  584. data/spec/support/spec_helper.rb +41 -0
  585. data/spec/support/system/sanitizers/asan_ubsan.yml +82 -0
  586. data/spec/support/system/sanitizers/asan_ubsan_leaks.yml +57 -0
  587. data/spec/support/system/simplecov_boot.rb +66 -0
  588. data/spec/support/system/spec_system_helper.rb +376 -16
  589. data/spec/support/system/system_context.rb +181 -59
  590. data/spec/support/template_render_cases.rb +166 -0
  591. data/spec/system/bracket_path_handling_spec.rb +175 -0
  592. data/spec/system/build_output_mirroring_spec.rb +89 -0
  593. data/spec/system/build_recovery_spec.rb +382 -0
  594. data/spec/system/bullseye_deployment_spec.rb +102 -0
  595. data/spec/system/cli_surface_spec.rb +245 -0
  596. data/spec/system/command_hooks_spec.rb +117 -0
  597. data/spec/system/conditional_include_macro_visibility_spec.rb +32 -124
  598. data/spec/system/conditional_mock_includes_spec.rb +181 -0
  599. data/spec/system/cppcheck_deployment_spec.rb +26 -8
  600. data/spec/system/delta_builds_spec.rb +751 -0
  601. data/spec/system/deployment_as_gem_spec.rb +7 -0
  602. data/spec/system/deployment_as_vendor_spec.rb +29 -145
  603. data/spec/system/dumpconfig_spec.rb +137 -0
  604. data/spec/system/encoding_stress_spec.rb +7 -4
  605. data/spec/system/example_cipher_quest_spec.rb +25 -100
  606. data/spec/system/example_temp_sensor_spec.rb +30 -172
  607. data/spec/system/example_wondrous_forest_spec.rb +25 -62
  608. data/spec/system/extension_multiple_values_spec.rb +75 -0
  609. data/spec/system/files_paths_reporting_spec.rb +154 -0
  610. data/spec/system/gcov_deployment_spec.rb +72 -3
  611. data/spec/system/header_include_path_validation_spec.rb +222 -0
  612. data/spec/system/implicit_source_header_correspondence_disambiguation_spec.rb +100 -0
  613. data/spec/system/include_path_reconciliation_spec.rb +64 -0
  614. data/spec/system/mixin_ordering_spec.rb +30 -415
  615. data/spec/system/mocks_partials_configuration_validation_spec.rb +126 -0
  616. data/spec/system/parent_directory_reference_spec.rb +114 -0
  617. data/spec/system/partials_module_disambiguation_spec.rb +143 -0
  618. data/spec/system/pinned_thread_count_spec.rb +102 -0
  619. data/spec/system/plugin_delta_builds_spec.rb +179 -0
  620. data/spec/system/preprocessing_encoding_spec.rb +87 -4
  621. data/spec/system/preprocessing_fallback_conditionals_spec.rb +19 -25
  622. data/spec/system/preprocessing_parameterized_tests_spec.rb +2 -2
  623. data/spec/system/rake_release_task_path_disambiguation_spec.rb +97 -0
  624. data/spec/system/rake_test_task_path_disambiguation_spec.rb +118 -0
  625. data/spec/system/report_and_tooling_plugins_spec.rb +327 -0
  626. data/spec/system/ruby_replacement_spec.rb +1 -1
  627. data/spec/system/same_named_modules_spec.rb +115 -0
  628. data/spec/system/sanitize_deployment_spec.rb +64 -0
  629. data/spec/system/shuffle_tests_spec.rb +139 -0
  630. data/spec/system/sibling_header_collision_spec.rb +620 -0
  631. data/spec/system/subdir_include_preservation_spec.rb +63 -0
  632. data/spec/system/support/bullseye_common_test_cases.rb +369 -0
  633. data/spec/system/support/bullseye_helpers.rb +70 -0
  634. data/spec/system/support/common_test_cases.rb +167 -43
  635. data/spec/system/support/cppcheck_common_test_cases.rb +80 -0
  636. data/spec/system/support/cppcheck_helpers.rb +10 -8
  637. data/spec/system/support/gcov_common_test_cases.rb +173 -37
  638. data/spec/system/support/gcov_helpers.rb +3 -3
  639. data/spec/system/support/gcov_partials_test_cases.rb +48 -2
  640. data/spec/system/support/sanitize_common_test_cases.rb +222 -0
  641. data/spec/system/support/sanitize_helpers.rb +27 -0
  642. data/spec/system/support/valgrind_common_test_cases.rb +116 -16
  643. data/spec/system/support/valgrind_helpers.rb +3 -4
  644. data/spec/system/test_pipeline_stop_points_spec.rb +160 -0
  645. data/spec/system/test_runner_system_include_spec.rb +19 -41
  646. data/spec/system/test_source_file_directive_spec.rb +235 -0
  647. data/spec/system/upgrade_as_vendor_spec.rb +25 -46
  648. data/spec/system/valgrind_deployment_spec.rb +41 -0
  649. data/spec/units/batchinator_spec.rb +314 -0
  650. data/spec/units/bin/actionator_spec.rb +412 -0
  651. data/spec/units/bin/app_cfg_spec.rb +100 -0
  652. data/spec/units/bin/cli_handler_spec.rb +205 -0
  653. data/spec/units/bin/cli_helper_spec.rb +248 -10
  654. data/spec/units/bin/cli_options_transform_spec.rb +49 -0
  655. data/spec/units/bin/composinator_spec.rb +236 -0
  656. data/spec/units/bin/{projectinator_mixin_spec.rb → mixin_resolvinator_spec.rb} +122 -83
  657. data/spec/units/bin/mixin_standardizer_spec.rb +4 -3
  658. data/spec/units/bin/mixinator_spec.rb +58 -22
  659. data/spec/units/bin/path_validator_spec.rb +112 -0
  660. data/spec/units/bin/projectinator_spec.rb +223 -0
  661. data/spec/units/bin/rake_patches_spec.rb +52 -0
  662. data/spec/units/bin/recursive_merger_spec.rb +22 -0
  663. data/spec/units/bin/versionator_spec.rb +104 -0
  664. data/spec/units/c_extractor/c_extractor_code_text_spec.rb +4 -4
  665. data/spec/units/c_extractor/c_extractor_declarations_spec.rb +70 -0
  666. data/spec/units/c_extractor/c_extractor_functions_spec.rb +75 -1
  667. data/spec/units/c_extractor/c_extractor_preprocessing_spec.rb +158 -0
  668. data/spec/units/c_extractor/c_extractor_spec.rb +236 -6
  669. data/spec/units/ceedling/templateinator_golden_spec.rb +84 -0
  670. data/spec/units/ceedling/templateinator_spec.rb +188 -0
  671. data/spec/units/config/configurator_builder_spec.rb +444 -0
  672. data/spec/units/config/configurator_plugins_spec.rb +160 -0
  673. data/spec/units/config/configurator_setup_spec.rb +724 -6
  674. data/spec/units/config/configurator_spec.rb +961 -0
  675. data/spec/units/config/configurator_validator_spec.rb +259 -0
  676. data/spec/units/config/line_marker_suppressors_spec.rb +89 -0
  677. data/spec/units/config_matchinator_spec.rb +103 -0
  678. data/spec/units/defineinator_spec.rb +158 -0
  679. data/spec/units/dependencies/dependency_cache_store_spec.rb +364 -0
  680. data/spec/units/dependencies/dependency_debug_tree_spec.rb +189 -0
  681. data/spec/units/dependencies/dependency_differ_spec.rb +139 -0
  682. data/spec/units/dependencies/dependency_hasher_spec.rb +141 -0
  683. data/spec/units/dependencies/dependency_path_normalizer_spec.rb +111 -0
  684. data/spec/units/dependencies/dependency_tracker_spec.rb +905 -0
  685. data/spec/units/dependencies/dependinator_spec.rb +99 -0
  686. data/spec/units/dependencies/gcc_dependency_parser_spec.rb +152 -0
  687. data/spec/units/encodinator_spec.rb +92 -0
  688. data/spec/units/file_finder_helper_spec.rb +99 -15
  689. data/spec/units/file_finder_spec.rb +495 -0
  690. data/spec/units/file_path_collection_utils_spec.rb +9 -0
  691. data/spec/units/file_path_utils_spec.rb +736 -0
  692. data/spec/units/file_wrapper_spec.rb +486 -0
  693. data/spec/units/filename_extension_spec.rb +120 -0
  694. data/spec/units/flaginator_spec.rb +114 -0
  695. data/spec/units/generators/generator_helper_spec.rb +113 -0
  696. data/spec/units/generators/generator_mocks_spec.rb +131 -0
  697. data/spec/units/generators/generator_partials_spec.rb +336 -160
  698. data/spec/units/generators/generator_spec.rb +317 -0
  699. data/spec/units/generators/generator_test_results_backtrace_spec.rb +169 -9
  700. data/spec/units/generators/generator_test_results_sanity_checker_spec.rb +14 -6
  701. data/spec/units/generators/generator_test_results_spec.rb +65 -8
  702. data/spec/units/generators/generator_test_runner_spec.rb +1 -1
  703. data/spec/units/includes/include_factory_spec.rb +53 -0
  704. data/spec/units/includes/include_pathinator_spec.rb +269 -0
  705. data/spec/units/includes/include_spec.rb +8 -4
  706. data/spec/units/includes/includes_spec.rb +326 -18
  707. data/spec/units/mock_locator_spec.rb +74 -0
  708. data/spec/units/parsing_parcels_spec.rb +65 -0
  709. data/spec/units/partials/partializer_config_spec.rb +284 -18
  710. data/spec/units/partials/partializer_helper_spec.rb +122 -0
  711. data/spec/units/partials/partializer_spec.rb +346 -71
  712. data/spec/units/partials/partializer_utils_spec.rb +4 -4
  713. data/spec/units/partials_manager_spec.rb +539 -0
  714. data/spec/units/path_matcher_spec.rb +193 -0
  715. data/spec/units/path_mirror_spec.rb +103 -0
  716. data/spec/units/plugin_manager_spec.rb +77 -0
  717. data/spec/units/plugin_reportinator_spec.rb +78 -3
  718. data/spec/units/plugins/bullseye_spec.rb +1068 -0
  719. data/spec/units/plugins/command_hooks_spec.rb +157 -0
  720. data/spec/units/plugins/compile_commands_json_db_spec.rb +145 -0
  721. data/spec/units/plugins/console_reportinator_spec.rb +370 -0
  722. data/spec/units/plugins/cppcheck_spec.rb +330 -4
  723. data/spec/units/plugins/cppunit_tests_reporter_spec.rb +118 -0
  724. data/spec/units/plugins/dependencies_spec.rb +295 -0
  725. data/spec/units/plugins/dependency_commands_spec.rb +83 -0
  726. data/spec/units/plugins/dependency_environment_spec.rb +64 -0
  727. data/spec/units/plugins/dependency_spec_spec.rb +170 -0
  728. data/spec/units/plugins/gcov_reportinator_spec.rb +272 -0
  729. data/spec/units/plugins/gcov_spec.rb +521 -0
  730. data/spec/units/plugins/gcovr_reportinator_spec.rb +795 -0
  731. data/spec/units/plugins/gtestlike_report_spec.rb +363 -0
  732. data/spec/units/plugins/html_tests_reporter_spec.rb +158 -0
  733. data/spec/units/plugins/ide_report_lines_spec.rb +229 -0
  734. data/spec/units/plugins/json_tests_reporter_spec.rb +87 -0
  735. data/spec/units/plugins/junit_tests_reporter_spec.rb +237 -0
  736. data/spec/units/plugins/module_generator_options_spec.rb +185 -0
  737. data/spec/units/plugins/module_generator_project_spec.rb +55 -0
  738. data/spec/units/plugins/module_generator_request_spec.rb +107 -0
  739. data/spec/units/plugins/module_generator_spec.rb +214 -0
  740. data/spec/units/plugins/module_generator_test_file_spec.rb +102 -0
  741. data/spec/units/plugins/module_generator_unity_spec.rb +37 -0
  742. data/spec/units/plugins/report_build_warnings_log_spec.rb +199 -0
  743. data/spec/units/plugins/report_log_writer_plugin_spec.rb +94 -0
  744. data/spec/units/plugins/report_tests_gtestlike_stdout_spec.rb +274 -0
  745. data/spec/units/plugins/report_tests_ide_stdout_spec.rb +140 -0
  746. data/spec/units/plugins/report_tests_log_factory_spec.rb +210 -0
  747. data/spec/units/plugins/report_tests_pretty_stdout_spec.rb +83 -0
  748. data/spec/units/plugins/report_tests_raw_output_log_spec.rb +98 -0
  749. data/spec/units/plugins/report_tests_stdout_plugin_spec.rb +145 -0
  750. data/spec/units/plugins/report_tests_teamcity_stdout_spec.rb +121 -0
  751. data/spec/units/plugins/reportgenerator_reportinator_spec.rb +410 -0
  752. data/spec/units/plugins/sanitize_config_spec.rb +119 -0
  753. data/spec/units/plugins/sanitize_findings_spec.rb +69 -0
  754. data/spec/units/plugins/sanitize_records_spec.rb +114 -0
  755. data/spec/units/plugins/sanitize_reports_spec.rb +84 -0
  756. data/spec/units/plugins/sanitize_spec.rb +300 -0
  757. data/spec/units/plugins/tests_reporter_spec.rb +89 -0
  758. data/spec/units/plugins/valgrind_spec.rb +560 -0
  759. data/spec/units/plugins/warning_collector_spec.rb +185 -0
  760. data/spec/units/plugins/warning_reports_spec.rb +150 -0
  761. data/spec/units/preprocess/c_comment_scanner_spec.rb +17 -17
  762. data/spec/units/preprocess/c_preprocessor_conditionals_spec.rb +94 -0
  763. data/spec/units/preprocess/preprocessinator_bare_includes_extractor_spec.rb +73 -0
  764. data/spec/units/preprocess/preprocessinator_code_finder_spec.rb +35 -16
  765. data/spec/units/preprocess/preprocessinator_comment_stripper_spec.rb +129 -48
  766. data/spec/units/preprocess/preprocessinator_file_assembler_spec.rb +292 -9
  767. data/spec/units/preprocess/preprocessinator_includes_handler_spec.rb +294 -16
  768. data/spec/units/preprocess/preprocessinator_line_marker_includes_extractor_spec.rb +356 -6
  769. data/spec/units/preprocess/preprocessinator_reconstructor_spec.rb +58 -4
  770. data/spec/units/preprocess/preprocessinator_spec.rb +693 -5
  771. data/spec/units/quote_include_isolator_spec.rb +176 -0
  772. data/spec/units/rake_app/rake_invocation_tracker_spec.rb +94 -0
  773. data/spec/units/rake_app/rake_task_registry_spec.rb +263 -0
  774. data/spec/units/rake_app/rake_utils_spec.rb +54 -0
  775. data/spec/units/rake_app/rake_wrapper_spec.rb +64 -0
  776. data/spec/units/rake_app/rakefile_component_resolver_spec.rb +182 -0
  777. data/spec/units/rake_app/test_task_name_spec.rb +47 -0
  778. data/spec/units/release_build_executor_spec.rb +404 -0
  779. data/spec/units/release_build_planner_spec.rb +144 -0
  780. data/spec/units/release_invoker_spec.rb +127 -0
  781. data/spec/units/reportinator_spec.rb +35 -0
  782. data/spec/units/ruby_expandinator_spec.rb +36 -0
  783. data/spec/units/standin_headerinator_spec.rb +168 -0
  784. data/spec/units/system_wrapper_spec.rb +16 -0
  785. data/spec/units/test_build_executor_spec.rb +1693 -8
  786. data/spec/units/test_build_planner_spec.rb +878 -0
  787. data/spec/units/test_build_setup_spec.rb +583 -0
  788. data/spec/units/test_context_extractor_spec.rb +51 -3
  789. data/spec/units/test_file_preprocessinator_spec.rb +206 -0
  790. data/spec/units/test_includes_extractinator_spec.rb +764 -0
  791. data/spec/units/test_invoker/objects_wiring_spec.rb +31 -0
  792. data/spec/units/test_invoker_spec.rb +147 -0
  793. data/spec/units/test_invoker_types_spec.rb +182 -0
  794. data/spec/units/test_pipeline_helpers_spec.rb +100 -0
  795. data/spec/units/test_pipeline_manager_spec.rb +415 -0
  796. data/spec/units/test_runner_generatinator_spec.rb +215 -0
  797. data/spec/units/test_runner_manager_spec.rb +70 -0
  798. data/spec/units/test_search_paths_spec.rb +84 -0
  799. data/spec/units/test_source_file_directive_resolver_spec.rb +239 -0
  800. data/spec/units/tool_executor_helper_spec.rb +1 -1
  801. data/spec/units/tool_executor_spec.rb +571 -2
  802. data/spec/units/tool_validator_spec.rb +303 -24
  803. data/spec/units/version_spec.rb +74 -0
  804. data/spec/units/yaml_wrapper_spec.rb +4 -1
  805. data/vendor/cmock/docs/CMock_Summary.md +11 -0
  806. data/vendor/cmock/lib/cmock_config.rb +1 -0
  807. data/vendor/cmock/lib/cmock_generator.rb +5 -1
  808. data/vendor/cmock/test/unit/cmock_generator_main_test.rb +31 -0
  809. data/vendor/cmock/vendor/unity/auto/generate_module.rb +4 -4
  810. data/vendor/cmock/vendor/unity/auto/generate_test_runner.rb +8 -2
  811. data/vendor/cmock/vendor/unity/auto/unity_test_summary.rb +2 -2
  812. data/vendor/cmock/vendor/unity/docs/UnityChangeLog.md +7 -0
  813. data/vendor/cmock/vendor/unity/docs/UnityConfigurationGuide.md +4 -0
  814. data/vendor/cmock/vendor/unity/docs/UnityHelperScriptsGuide.md +9 -0
  815. data/vendor/cmock/vendor/unity/src/unity_internals.h +21 -7
  816. data/vendor/cmock/vendor/unity/test/Makefile +9 -2
  817. data/vendor/cmock/vendor/unity/test/rakefile_helper.rb +1 -0
  818. data/vendor/cmock/vendor/unity/test/spec/generate_module_naming_spec.rb +38 -0
  819. data/vendor/cmock/vendor/unity/test/testdata/spi/MockConfig.h +19 -0
  820. data/vendor/cmock/vendor/unity/test/testdata/testRunnerGeneratorWithSameNamedMocks.c +42 -0
  821. data/vendor/cmock/vendor/unity/test/testdata/uart/MockConfig.h +19 -0
  822. data/vendor/cmock/vendor/unity/test/tests/test_generate_test_runner.rb +78 -0
  823. data/vendor/cmock/vendor/unity/test/tests/test_unity_test_summary.rb +58 -0
  824. data/vendor/diy/lib/diy/factory.rb +5 -4
  825. data/vendor/diy/lib/diy.rb +5 -4
  826. data/vendor/diy/sample_code/car.rb +5 -4
  827. data/vendor/diy/sample_code/chassis.rb +5 -4
  828. data/vendor/diy/sample_code/diy_example.rb +5 -4
  829. data/vendor/diy/sample_code/engine.rb +5 -4
  830. data/vendor/diy/sample_code/objects.yml +5 -4
  831. data/vendor/diy/test/constructor.rb +5 -4
  832. data/vendor/diy/test/diy_test.rb +5 -4
  833. data/vendor/diy/test/factory_test.rb +5 -4
  834. data/vendor/diy/test/files/broken_construction.yml +5 -4
  835. data/vendor/diy/test/files/cat/cat.rb +5 -4
  836. data/vendor/diy/test/files/cat/extra_conflict.yml +5 -4
  837. data/vendor/diy/test/files/cat/heritage.rb +5 -4
  838. data/vendor/diy/test/files/cat/needs_input.yml +5 -4
  839. data/vendor/diy/test/files/cat/the_cat_lineage.rb +5 -4
  840. data/vendor/diy/test/files/dog/dog_model.rb +5 -4
  841. data/vendor/diy/test/files/dog/dog_presenter.rb +5 -4
  842. data/vendor/diy/test/files/dog/dog_view.rb +5 -4
  843. data/vendor/diy/test/files/dog/file_resolver.rb +5 -4
  844. data/vendor/diy/test/files/dog/other_thing.rb +5 -4
  845. data/vendor/diy/test/files/dog/simple.yml +5 -4
  846. data/vendor/diy/test/files/donkey/foo/bar/qux.rb +5 -4
  847. data/vendor/diy/test/files/donkey/foo.rb +5 -4
  848. data/vendor/diy/test/files/factory/beef.rb +5 -4
  849. data/vendor/diy/test/files/factory/dog.rb +5 -4
  850. data/vendor/diy/test/files/factory/factory.yml +5 -4
  851. data/vendor/diy/test/files/factory/farm/llama.rb +5 -4
  852. data/vendor/diy/test/files/factory/farm/pork.rb +5 -4
  853. data/vendor/diy/test/files/factory/kitten.rb +5 -4
  854. data/vendor/diy/test/files/fud/objects.yml +5 -4
  855. data/vendor/diy/test/files/fud/toy.rb +5 -4
  856. data/vendor/diy/test/files/functions/attached_things_builder.rb +5 -4
  857. data/vendor/diy/test/files/functions/invalid_method.yml +5 -4
  858. data/vendor/diy/test/files/functions/method_extractor.rb +5 -4
  859. data/vendor/diy/test/files/functions/nonsingleton_objects.yml +5 -4
  860. data/vendor/diy/test/files/functions/objects.yml +5 -4
  861. data/vendor/diy/test/files/functions/thing.rb +5 -4
  862. data/vendor/diy/test/files/functions/thing_builder.rb +5 -4
  863. data/vendor/diy/test/files/functions/things_builder.rb +5 -4
  864. data/vendor/diy/test/files/gnu/objects.yml +5 -4
  865. data/vendor/diy/test/files/gnu/thinger.rb +5 -4
  866. data/vendor/diy/test/files/goat/base.rb +5 -4
  867. data/vendor/diy/test/files/goat/can.rb +5 -4
  868. data/vendor/diy/test/files/goat/goat.rb +5 -4
  869. data/vendor/diy/test/files/goat/objects.yml +5 -4
  870. data/vendor/diy/test/files/goat/paper.rb +5 -4
  871. data/vendor/diy/test/files/goat/plane.rb +5 -4
  872. data/vendor/diy/test/files/goat/shirt.rb +5 -4
  873. data/vendor/diy/test/files/goat/wings.rb +5 -4
  874. data/vendor/diy/test/files/horse/holder_thing.rb +5 -4
  875. data/vendor/diy/test/files/horse/objects.yml +5 -4
  876. data/vendor/diy/test/files/namespace/animal/bird.rb +5 -4
  877. data/vendor/diy/test/files/namespace/animal/cat.rb +5 -4
  878. data/vendor/diy/test/files/namespace/animal/reptile/hardshell/turtle.rb +5 -4
  879. data/vendor/diy/test/files/namespace/animal/reptile/lizard.rb +5 -4
  880. data/vendor/diy/test/files/namespace/bad_module_specified.yml +5 -4
  881. data/vendor/diy/test/files/namespace/class_name_combine.yml +5 -4
  882. data/vendor/diy/test/files/namespace/no_module_specified.yml +5 -4
  883. data/vendor/diy/test/files/namespace/objects.yml +5 -4
  884. data/vendor/diy/test/files/namespace/road.rb +5 -4
  885. data/vendor/diy/test/files/namespace/sky.rb +5 -4
  886. data/vendor/diy/test/files/namespace/subcontext.yml +5 -4
  887. data/vendor/diy/test/files/non_singleton/air.rb +5 -4
  888. data/vendor/diy/test/files/non_singleton/fat_cat.rb +5 -4
  889. data/vendor/diy/test/files/non_singleton/objects.yml +5 -4
  890. data/vendor/diy/test/files/non_singleton/pig.rb +5 -4
  891. data/vendor/diy/test/files/non_singleton/thread_spinner.rb +5 -4
  892. data/vendor/diy/test/files/non_singleton/tick.rb +5 -4
  893. data/vendor/diy/test/files/non_singleton/yard.rb +5 -4
  894. data/vendor/diy/test/files/yak/core_model.rb +5 -4
  895. data/vendor/diy/test/files/yak/core_presenter.rb +5 -4
  896. data/vendor/diy/test/files/yak/core_view.rb +5 -4
  897. data/vendor/diy/test/files/yak/data_source.rb +5 -4
  898. data/vendor/diy/test/files/yak/fringe_model.rb +5 -4
  899. data/vendor/diy/test/files/yak/fringe_presenter.rb +5 -4
  900. data/vendor/diy/test/files/yak/fringe_view.rb +5 -4
  901. data/vendor/diy/test/files/yak/giant_squid.rb +5 -4
  902. data/vendor/diy/test/files/yak/krill.rb +5 -4
  903. data/vendor/diy/test/files/yak/my_objects.yml +5 -4
  904. data/vendor/diy/test/files/yak/sub_sub_context_test.yml +5 -4
  905. data/vendor/diy/test/test_helper.rb +5 -4
  906. data/vendor/unity/auto/generate_module.rb +4 -4
  907. data/vendor/unity/auto/generate_test_runner.rb +5 -1
  908. data/vendor/unity/docs/UnityHelperScriptsGuide.md +9 -0
  909. data/vendor/unity/test/spec/generate_module_naming_spec.rb +38 -0
  910. data/vendor/unity/test/testdata/spi/MockConfig.h +19 -0
  911. data/vendor/unity/test/testdata/testRunnerGeneratorWithSameNamedMocks.c +42 -0
  912. data/vendor/unity/test/testdata/uart/MockConfig.h +19 -0
  913. data/vendor/unity/test/tests/test_generate_test_runner.rb +29 -0
  914. metadata +783 -295
  915. data/assets/tests_with_fallback_conditionals/src/conditional_module.c +0 -18
  916. data/bin/actions_wrapper.rb +0 -51
  917. data/docs/mkdocs/assets/images/ceedling-logo-circle.png +0 -0
  918. data/docs/mkdocs/assets/images/ceedling.svg +0 -90
  919. data/docs/mkdocs/assets/images/favicon.png +0 -0
  920. data/docs/mkdocs/assets/stylesheets/admonitions.css +0 -152
  921. data/docs/mkdocs/assets/stylesheets/fixes-local.css +0 -15
  922. data/docs/mkdocs/assets/stylesheets/styling.css +0 -102
  923. data/docs/mkdocs/configuration/environment-vars.md +0 -14
  924. data/docs/mkdocs/configuration/global-collections.md +0 -156
  925. data/docs/mkdocs/configuration/index.md +0 -75
  926. data/docs/mkdocs/configuration/loading.md +0 -89
  927. data/docs/mkdocs/configuration/mixins.md +0 -607
  928. data/docs/mkdocs/configuration/parallel-builds.md +0 -97
  929. data/docs/mkdocs/configuration/project-file.md +0 -216
  930. data/docs/mkdocs/configuration/reference/cexception.md +0 -35
  931. data/docs/mkdocs/configuration/reference/cmock.md +0 -106
  932. data/docs/mkdocs/configuration/reference/defines.md +0 -352
  933. data/docs/mkdocs/configuration/reference/environment.md +0 -55
  934. data/docs/mkdocs/configuration/reference/extension.md +0 -63
  935. data/docs/mkdocs/configuration/reference/files.md +0 -154
  936. data/docs/mkdocs/configuration/reference/flags.md +0 -296
  937. data/docs/mkdocs/configuration/reference/index.md +0 -176
  938. data/docs/mkdocs/configuration/reference/libraries.md +0 -82
  939. data/docs/mkdocs/configuration/reference/mixins.md +0 -24
  940. data/docs/mkdocs/configuration/reference/partials.md +0 -38
  941. data/docs/mkdocs/configuration/reference/paths.md +0 -276
  942. data/docs/mkdocs/configuration/reference/plugins.md +0 -60
  943. data/docs/mkdocs/configuration/reference/project.md +0 -333
  944. data/docs/mkdocs/configuration/reference/release-build.md +0 -62
  945. data/docs/mkdocs/configuration/reference/test-build.md +0 -55
  946. data/docs/mkdocs/configuration/reference/test-runner.md +0 -61
  947. data/docs/mkdocs/configuration/reference/tools.md +0 -457
  948. data/docs/mkdocs/configuration/reference/unity.md +0 -49
  949. data/docs/mkdocs/configuration/which-ceedling.md +0 -77
  950. data/docs/mkdocs/development/index.md +0 -61
  951. data/docs/mkdocs/development/plugins/configuration.md +0 -164
  952. data/docs/mkdocs/development/plugins/index.md +0 -84
  953. data/docs/mkdocs/development/plugins/plugin-subclass.md +0 -513
  954. data/docs/mkdocs/development/plugins/rake-tasks.md +0 -54
  955. data/docs/mkdocs/development/workflow.md +0 -284
  956. data/docs/mkdocs/getting-started/command-line.md +0 -477
  957. data/docs/mkdocs/getting-started/example-projects/cipher-quest.md +0 -65
  958. data/docs/mkdocs/getting-started/example-projects/index.md +0 -49
  959. data/docs/mkdocs/getting-started/example-projects/temp-sensor.md +0 -60
  960. data/docs/mkdocs/getting-started/example-projects/wondrous-forest.md +0 -45
  961. data/docs/mkdocs/getting-started/index.md +0 -41
  962. data/docs/mkdocs/getting-started/installation.md +0 -179
  963. data/docs/mkdocs/getting-started/quick-start.md +0 -86
  964. data/docs/mkdocs/help.md +0 -49
  965. data/docs/mkdocs/index.md +0 -222
  966. data/docs/mkdocs/overview/build-system.md +0 -115
  967. data/docs/mkdocs/overview/index.md +0 -29
  968. data/docs/mkdocs/overview/test-environments.md +0 -33
  969. data/docs/mkdocs/overview/tools-and-frameworks.md +0 -115
  970. data/docs/mkdocs/plugins/beep.md +0 -134
  971. data/docs/mkdocs/plugins/bullseye.md +0 -83
  972. data/docs/mkdocs/plugins/command-hooks.md +0 -268
  973. data/docs/mkdocs/plugins/compile-commands-json-db.md +0 -42
  974. data/docs/mkdocs/plugins/cppcheck.md +0 -377
  975. data/docs/mkdocs/plugins/dependencies.md +0 -310
  976. data/docs/mkdocs/plugins/fff.md +0 -247
  977. data/docs/mkdocs/plugins/gcov/examples.md +0 -92
  978. data/docs/mkdocs/plugins/gcov/gcovr.md +0 -526
  979. data/docs/mkdocs/plugins/gcov/index.md +0 -74
  980. data/docs/mkdocs/plugins/gcov/overview.md +0 -145
  981. data/docs/mkdocs/plugins/gcov/reportgenerator.md +0 -246
  982. data/docs/mkdocs/plugins/gcov/reporting.md +0 -147
  983. data/docs/mkdocs/plugins/gcov/setup.md +0 -232
  984. data/docs/mkdocs/plugins/gcov/tool-versions.md +0 -60
  985. data/docs/mkdocs/plugins/gcov/troubleshooting.md +0 -78
  986. data/docs/mkdocs/plugins/index.md +0 -261
  987. data/docs/mkdocs/plugins/module-generator.md +0 -267
  988. data/docs/mkdocs/plugins/report-build-warnings-log.md +0 -42
  989. data/docs/mkdocs/plugins/report-tests-gtestlike-stdout.md +0 -98
  990. data/docs/mkdocs/plugins/report-tests-ide-stdout.md +0 -63
  991. data/docs/mkdocs/plugins/report-tests-log-factory.md +0 -454
  992. data/docs/mkdocs/plugins/report-tests-pretty-stdout.md +0 -56
  993. data/docs/mkdocs/plugins/report-tests-raw-output-log.md +0 -52
  994. data/docs/mkdocs/plugins/report-tests-teamcity-stdout.md +0 -96
  995. data/docs/mkdocs/plugins/sample_html_report.png +0 -0
  996. data/docs/mkdocs/plugins/valgrind.md +0 -198
  997. data/docs/mkdocs/project/release-history.md +0 -61
  998. data/docs/mkdocs/project/upgrade.md +0 -85
  999. data/docs/mkdocs/reference/build-directives.md +0 -37
  1000. data/docs/mkdocs/reference/command-line.md +0 -323
  1001. data/docs/mkdocs/reference/environment-vars.md +0 -60
  1002. data/docs/mkdocs/reference/gcov-plugin.md +0 -600
  1003. data/docs/mkdocs/reference/global-collections.md +0 -160
  1004. data/docs/mkdocs/reference/index.md +0 -65
  1005. data/docs/mkdocs/reference/partials-macros.md +0 -79
  1006. data/docs/mkdocs/reference/project-configuration.md +0 -46
  1007. data/docs/mkdocs/snapshot/examples/cipher_quest/README.md +0 -210
  1008. data/docs/mkdocs/snapshot/examples/temp_sensor/README.md +0 -283
  1009. data/docs/mkdocs/snapshot/examples/wondrous_forest/README.md +0 -92
  1010. data/docs/mkdocs/snapshot/plugins/gcov/config/defaults.yml +0 -32
  1011. data/docs/mkdocs/snapshot/plugins/gcov/config/defaults_gcov.rb +0 -136
  1012. data/docs/mkdocs/snapshot.yml +0 -20
  1013. data/docs/mkdocs/testing-guide/build-directives.md +0 -153
  1014. data/docs/mkdocs/testing-guide/conventions.md +0 -616
  1015. data/docs/mkdocs/testing-guide/frameworks.md +0 -192
  1016. data/docs/mkdocs/testing-guide/index.md +0 -80
  1017. data/docs/mkdocs/testing-guide/partials/configuration.md +0 -67
  1018. data/docs/mkdocs/testing-guide/partials/conventions.md +0 -68
  1019. data/docs/mkdocs/testing-guide/partials/directives.md +0 -212
  1020. data/docs/mkdocs/testing-guide/partials/example.md +0 -149
  1021. data/docs/mkdocs/testing-guide/partials/index.md +0 -88
  1022. data/docs/mkdocs/testing-guide/partials/overview.md +0 -81
  1023. data/docs/mkdocs/testing-guide/partials/variables.md +0 -244
  1024. data/docs/mkdocs/testing-guide/test-cases.md +0 -194
  1025. data/docs/mkdocs/testing-guide/test-sample.md +0 -94
  1026. data/docs/mkdocs/testing-guide/test-suite-anatomy.md +0 -58
  1027. data/lib/ceedling/cacheinator.rb +0 -53
  1028. data/lib/ceedling/cacheinator_helper.rb +0 -60
  1029. data/lib/ceedling/dependinator.rb +0 -31
  1030. data/lib/ceedling/makefile.rb +0 -52
  1031. data/lib/ceedling/release_invoker.rb +0 -112
  1032. data/lib/ceedling/rules_release.rake +0 -109
  1033. data/lib/ceedling/tasks_release.rake +0 -36
  1034. data/plugins/fff/vendor/fff/Makefile +0 -10
  1035. data/plugins/fff/vendor/fff/buildandtest +0 -15
  1036. data/plugins/fff/vendor/fff/examples/Makefile +0 -7
  1037. data/plugins/fff/vendor/fff/examples/driver_testing/Makefile +0 -64
  1038. data/plugins/fff/vendor/fff/examples/driver_testing/driver.c +0 -32
  1039. data/plugins/fff/vendor/fff/examples/driver_testing/driver.h +0 -21
  1040. data/plugins/fff/vendor/fff/examples/driver_testing/driver.test.cpp +0 -58
  1041. data/plugins/fff/vendor/fff/examples/driver_testing/driver.test.fff.cpp +0 -70
  1042. data/plugins/fff/vendor/fff/examples/driver_testing/hardware_abstraction.h +0 -25
  1043. data/plugins/fff/vendor/fff/examples/driver_testing/registers.h +0 -23
  1044. data/plugins/fff/vendor/fff/examples/embedded_ui/DISPLAY.h +0 -27
  1045. data/plugins/fff/vendor/fff/examples/embedded_ui/Kata.txt +0 -25
  1046. data/plugins/fff/vendor/fff/examples/embedded_ui/Makefile +0 -67
  1047. data/plugins/fff/vendor/fff/examples/embedded_ui/SYSTEM.h +0 -31
  1048. data/plugins/fff/vendor/fff/examples/embedded_ui/UI.c +0 -56
  1049. data/plugins/fff/vendor/fff/examples/embedded_ui/UI.h +0 -22
  1050. data/plugins/fff/vendor/fff/examples/embedded_ui/UI_test_ansic.c +0 -191
  1051. data/plugins/fff/vendor/fff/examples/embedded_ui/UI_test_cpp.cpp +0 -144
  1052. data/plugins/fff/vendor/fff/examples/embedded_ui/test_suite_template.c +0 -42
  1053. data/plugins/fff/vendor/fff/gtest/Makefile +0 -22
  1054. data/plugins/fff/vendor/fff/gtest/gtest-all.cc +0 -9118
  1055. data/plugins/fff/vendor/fff/gtest/gtest-main.cc +0 -6
  1056. data/plugins/fff/vendor/fff/gtest/gtest.h +0 -19547
  1057. data/plugins/fff/vendor/fff/test/Makefile +0 -81
  1058. data/plugins/fff/vendor/fff/test/c_test_framework.h +0 -25
  1059. data/plugins/fff/vendor/fff/test/fff_test_c.c +0 -116
  1060. data/plugins/fff/vendor/fff/test/fff_test_cpp.cpp +0 -53
  1061. data/plugins/fff/vendor/fff/test/fff_test_global_c.c +0 -84
  1062. data/plugins/fff/vendor/fff/test/fff_test_global_cpp.cpp +0 -31
  1063. data/plugins/fff/vendor/fff/test/global_fakes.c +0 -21
  1064. data/plugins/fff/vendor/fff/test/global_fakes.h +0 -47
  1065. data/plugins/fff/vendor/fff/test/test_cases.include +0 -276
  1066. data/plugins/report_tests_gtestlike_stdout/assets/template.erb +0 -83
  1067. data/site-local/assets/stylesheets/main.ec1eaa64.min.css +0 -1
  1068. data/site-local/assets/stylesheets/main.ec1eaa64.min.css.map +0 -1
  1069. data/site-local/assets/stylesheets/palette.ab4e12ef.min.css +0 -1
  1070. data/site-local/assets/stylesheets/palette.ab4e12ef.min.css.map +0 -1
  1071. data/site-local/snapshot/assets/project.yml +0 -404
  1072. data/spec/system/partials_types_header_spec.rb +0 -166
  1073. data/spec/units/configurator_spec.rb +0 -232
  1074. /data/assets/{ceedling → features/ceedling} +0 -0
  1075. /data/assets/{ceedling.cmd → features/ceedling.cmd} +0 -0
  1076. /data/assets/{default_gitignore → features/default_gitignore} +0 -0
  1077. /data/assets/{broken_uncovered_file.c → fixtures/broken_uncovered_file.c} +0 -0
  1078. /data/assets/{example_file.c → fixtures/example_file.c} +0 -0
  1079. /data/assets/{example_file.h → fixtures/example_file.h} +0 -0
  1080. /data/assets/{example_file_call.c → fixtures/example_file_call.c} +0 -0
  1081. /data/assets/{example_file_call.h → fixtures/example_file_call.h} +0 -0
  1082. /data/assets/{example_file_with_statics.c → fixtures/example_file_with_statics.c} +0 -0
  1083. /data/assets/{example_file_with_stdio.c → fixtures/example_file_with_stdio.c} +0 -0
  1084. /data/assets/{example_file_with_stdio.h → fixtures/example_file_with_stdio.h} +0 -0
  1085. /data/assets/{fake_crash_test_fixture.rb → fixtures/fake_crash_test_fixture.rb} +0 -0
  1086. /data/assets/{partial_all_module.h → fixtures/partial_all_module.h} +0 -0
  1087. /data/assets/{run_with_ubsan.rb → fixtures/run_with_ubsan.rb} +0 -0
  1088. /data/assets/{same_dir_pairing_module.c → fixtures/same_dir_pairing_module.c} +0 -0
  1089. /data/assets/{same_dir_pairing_module.h → fixtures/same_dir_pairing_module.h} +0 -0
  1090. /data/assets/{same_dir_pairing_module_func.h → fixtures/same_dir_pairing_module_func.h} +0 -0
  1091. /data/assets/{same_dir_pairing_other.c → fixtures/same_dir_pairing_other.c} +0 -0
  1092. /data/assets/{same_dir_pairing_other.h → fixtures/same_dir_pairing_other.h} +0 -0
  1093. /data/assets/{test_example_file.c → fixtures/test_example_file.c} +0 -0
  1094. /data/assets/{test_example_file_2.c → fixtures/test_example_file_2.c} +0 -0
  1095. /data/assets/{test_example_file_source_include.c → fixtures/test_example_file_source_include.c} +0 -0
  1096. /data/assets/{test_example_file_success.c → fixtures/test_example_file_success.c} +0 -0
  1097. /data/assets/{test_example_file_unity_printf.c → fixtures/test_example_file_unity_printf.c} +0 -0
  1098. /data/assets/{test_example_file_verbose.c → fixtures/test_example_file_verbose.c} +0 -0
  1099. /data/assets/{test_example_file_with_mock.c → fixtures/test_example_file_with_mock.c} +0 -0
  1100. /data/assets/{test_example_file_with_stdio.c → fixtures/test_example_file_with_stdio.c} +0 -0
  1101. /data/assets/{test_example_with_parameterized_tests.c → fixtures/test_example_with_parameterized_tests.c} +0 -0
  1102. /data/assets/{test_partial_all_module.c → fixtures/test_partial_all_module.c} +0 -0
  1103. /data/assets/{test_same_dir_pairing.c → fixtures/test_same_dir_pairing.c} +0 -0
  1104. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/feature_config.h +0 -0
  1105. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/feature_extra.h +0 -0
  1106. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/local_flag_extra.h +0 -0
  1107. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/nested_extra.h +0 -0
  1108. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/nested_wrapper.h +0 -0
  1109. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/project_flag_extra.h +0 -0
  1110. /data/assets/{tests_with_conditional_includes → fixtures/tests_with_conditional_includes}/src/widget_feature.h +0 -0
  1111. /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware.c +0 -0
  1112. /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware.h +0 -0
  1113. /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware_configurator.c +0 -0
  1114. /data/assets/{tests_with_defines → fixtures/tests_with_defines}/src/adc_hardware_configurator.h +0 -0
  1115. /data/assets/{tests_with_defines → fixtures/tests_with_defines}/test/test_adc_hardware.c +0 -0
  1116. /data/assets/{tests_with_defines → fixtures/tests_with_defines}/test/test_adc_hardware_special.c +0 -0
  1117. /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/src/unicoder.c +0 -0
  1118. /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/src/unicoder.h +0 -0
  1119. /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/test/test_unicoder.c +0 -0
  1120. /data/assets/{tests_with_encoding → fixtures/tests_with_encoding}/test/test_unicoder_partial.c +0 -0
  1121. /data/assets/{tests_with_fallback_conditionals → fixtures/tests_with_fallback_conditionals}/src/conditional_module.h +0 -0
  1122. /data/assets/{tests_with_fallback_conditionals → fixtures/tests_with_fallback_conditionals}/src/optional_dep.h +0 -0
  1123. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/blanks.c +0 -0
  1124. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/blanks.h +0 -0
  1125. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/counter.c +0 -0
  1126. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/counter.h +0 -0
  1127. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/decorators.c +0 -0
  1128. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/src/decorators.h +0 -0
  1129. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/test/test_blanks.c +0 -0
  1130. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/test/test_counter.c +0 -0
  1131. /data/assets/{tests_with_partials_coverage → fixtures/tests_with_partials_coverage}/test/test_decorators.c +0 -0
  1132. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareA.c +0 -0
  1133. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareA.h +0 -0
  1134. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareB.c +0 -0
  1135. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareB.h +0 -0
  1136. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareC.c +0 -0
  1137. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardwareC.h +0 -0
  1138. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardware_configuratorA.h +0 -0
  1139. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardware_configuratorB.h +0 -0
  1140. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/src/adc_hardware_configuratorC.h +0 -0
  1141. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/test/test_adc_hardwareA.c +0 -0
  1142. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/test/test_adc_hardwareB.c +0 -0
  1143. /data/assets/{tests_with_preprocessing → fixtures/tests_with_preprocessing}/test/test_adc_hardwareC.c +0 -0
  1144. /data/assets/{uncovered_example_file.c → fixtures/uncovered_example_file.c} +0 -0
  1145. /data/plugins/bullseye/assets/{template.erb → coverage.template} +0 -0
@@ -7,33 +7,48 @@
7
7
 
8
8
  require 'ceedling/constants'
9
9
  require 'ceedling/exceptions'
10
-
11
- # Add sort-ability to symbol so we can order keys array in hash for test-ability
12
- class Symbol
13
- include Comparable
14
-
15
- def <=>(other)
16
- self.to_s <=> other.to_s
17
- end
18
- end
10
+ require 'ceedling/config/line_marker_suppressors'
19
11
 
20
12
 
21
13
  class ConfiguratorSetup
22
14
 
23
- constructor :configurator_builder, :configurator_validator, :configurator_plugins, :loginator, :reportinator, :file_wrapper
24
-
15
+ constructor :configurator_builder, :configurator_validator, :loginator, :reportinator, :file_wrapper,
16
+ :system_wrapper, :tool_executor
17
+
18
+ # Path collections, in order, since each builds on those before it
19
+ PATH_COLLECTIONS = [
20
+ :expand_all_path_globs,
21
+ :collect_vendor_paths,
22
+ :collect_source_and_include_paths,
23
+ :collect_source_include_vendor_paths,
24
+ :collect_test_support_source_include_paths,
25
+ :collect_test_support_source_include_vendor_paths
26
+ ].freeze
27
+
28
+ # File collections gathered after tests, assembly, and sources
29
+ FILE_COLLECTIONS = [
30
+ :collect_headers,
31
+ :collect_release_build_input,
32
+ :collect_existing_test_build_input,
33
+ :collect_release_artifact_extra_link_objects,
34
+ :collect_test_fixture_extra_link_objects,
35
+ :collect_vendor_framework_sources
36
+ ].freeze
37
+
38
+
39
+ # What startup learned of gdb backtraces: :usable, :fell_back to :simple, or :unknown
40
+ # when :gdb was never asked for
41
+ def gdb_backtrace_state
42
+ return @gdb_backtrace_state || :unknown
43
+ end
25
44
 
26
45
  # Override to prevent exception handling from walking & stringifying the object variables.
27
46
  # Object variables are gigantic and produce a flood of output.
28
47
  def inspect
29
- # TODO: When identifying information is added to constructor, insert it into `inspect()` string
30
- return this.class.name
48
+ return self.class.name
31
49
  end
32
50
 
33
51
  def build_project_config(ceedling_lib_path, logging_path, flattened_config)
34
- # Housekeeping
35
- @configurator_builder.cleanup( flattened_config )
36
-
37
52
  # Add to hash values we build up from configuration & file system contents
38
53
  flattened_config.merge!( @configurator_builder.set_build_paths( flattened_config, logging_path ) )
39
54
  flattened_config.merge!( @configurator_builder.set_rakefile_components( ceedling_lib_path, flattened_config ) )
@@ -57,121 +72,70 @@ class ConfiguratorSetup
57
72
  end
58
73
  end
59
74
 
60
- def vendor_frameworks_and_support_files(ceedling_lib_path, flattened_config)
61
- # Copy Unity C files into build/vendor directory structure
62
- @file_wrapper.cp_r(
63
- # '/.' to cause cp_r to copy directory contents
64
- File.join( flattened_config[:unity_vendor_path], UNITY_LIB_PATH, '/.' ),
65
- flattened_config[:project_build_vendor_unity_path]
66
- )
67
-
68
- # Copy CMock C files into build/vendor directory structure
69
- @file_wrapper.cp_r(
70
- # '/.' to cause cp_r to copy directory contents
71
- File.join( flattened_config[:cmock_vendor_path], CMOCK_LIB_PATH, '/.' ),
72
- flattened_config[:project_build_vendor_cmock_path]
73
- ) if flattened_config[:project_use_mocks]
74
-
75
- # Copy CException C files into build/vendor directory structure
76
- @file_wrapper.cp_r(
77
- # '/.' to cause cp_r to copy directory contents
78
- File.join( flattened_config[:cexception_vendor_path], CEXCEPTION_LIB_PATH, '/.' ),
79
- flattened_config[:project_build_vendor_cexception_path]
80
- ) if flattened_config[:project_use_exceptions]
81
-
82
- # Copy backtrace debugging script into build/test directory structure.
83
- # Ensure the destination exists first — it may not on a fresh build since
84
- # Rake's :directories task runs later than this configuration-time setup.
85
- if flattened_config[:project_use_backtrace] == :gdb
86
- @file_wrapper.mkdir( flattened_config[:project_build_tests_root] )
87
- @file_wrapper.cp_r(
88
- File.join( ceedling_lib_path, BACKTRACE_GDB_SCRIPT_FILE ),
89
- flattened_config[:project_build_tests_root]
90
- )
75
+ # A vendor destination must be a directory, and the marker file inside it (unity.c,
76
+ # cmock.c, CException.c) a plain file. An interrupted run, or a second Ceedling run racing
77
+ # this one, can leave either as the wrong type, and the copy would then fail on every
78
+ # later build. The whole destination is cleared, so the copy recreates it.
79
+ def heal_vendor_path(path, marker_file)
80
+ return unless corrupted_vendor_path?( path, marker_file )
81
+
82
+ @loginator.log( "Removing corrupted vendor path (unexpected file/directory type): #{path}", Verbosity::COMPLAIN, LogLabels::NOTICE )
83
+ @file_wrapper.rm_rf( path )
84
+ end
85
+
86
+ # Brings build/vendor up to date with the frameworks and support files a build needs. Only
87
+ # a build does this, so a command that only reads the project leaves a concurrent build's
88
+ # files alone. A file that already matches its source is not written, and one that differs,
89
+ # such as an errant edit by hand, an IDE, or an automated agent, is replaced whole.
90
+ #
91
+ # A release build needs only CException, and that only when exceptions are enabled.
92
+ def vendor_frameworks_and_support_files(ceedling_lib_path, flattened_config, test_build:, release_build:)
93
+ frameworks_for_build( flattened_config, test_build: test_build, release_build: release_build ).each do |source, destination, marker_file|
94
+ heal_vendor_path( destination, marker_file )
95
+ @file_wrapper.sync_tree( source, destination )
91
96
  end
92
97
 
93
- # Copy supporting partials code into build/vendor directory structure
94
- @file_wrapper.cp_r(
95
- File.join( ceedling_lib_path, CEEDLING_HEADER_FILEPATH ),
96
- flattened_config[:project_build_vendor_ceedling_path]
97
- ) if flattened_config[:project_use_partials]
98
+ vendor_test_support_files( ceedling_lib_path, flattened_config ) if test_build
98
99
  end
99
100
 
101
+ # Tests are collected after path collections, both to merge and to filter out of sources
100
102
  def build_project_collections(flattened_config)
101
- # Iterate through all entries in paths section and expand any & all globs to actual paths
102
- flattened_config.merge!( @configurator_builder.expand_all_path_globs( flattened_config ) )
103
+ PATH_COLLECTIONS.each { |collection| flattened_config.merge!( @configurator_builder.public_send( collection, flattened_config ) ) }
103
104
 
104
- flattened_config.merge!( @configurator_builder.collect_vendor_paths( flattened_config ) )
105
- flattened_config.merge!( @configurator_builder.collect_source_and_include_paths( flattened_config ) )
106
- flattened_config.merge!( @configurator_builder.collect_source_include_vendor_paths( flattened_config ) )
107
- flattened_config.merge!( @configurator_builder.collect_test_support_source_include_paths( flattened_config ) )
108
- flattened_config.merge!( @configurator_builder.collect_test_support_source_include_vendor_paths( flattened_config ) )
109
-
110
- # Collect tests: (1) To be merged (2) To filter out of sources (preventing accidental mixing of tests and source)
111
105
  tests_collection, tests_list = @configurator_builder.collect_tests( flattened_config )
112
106
  flattened_config.merge!( tests_collection )
113
-
114
107
  flattened_config.merge!( @configurator_builder.collect_assembly( flattened_config ) )
115
108
  flattened_config.merge!( @configurator_builder.collect_source( flattened_config, tests_list ) )
116
- flattened_config.merge!( @configurator_builder.collect_headers( flattened_config ) )
117
- flattened_config.merge!( @configurator_builder.collect_release_build_input( flattened_config ) )
118
- flattened_config.merge!( @configurator_builder.collect_existing_test_build_input( flattened_config ) )
119
- flattened_config.merge!( @configurator_builder.collect_release_artifact_extra_link_objects( flattened_config ) )
120
- flattened_config.merge!( @configurator_builder.collect_test_fixture_extra_link_objects( flattened_config ) )
121
- flattened_config.merge!( @configurator_builder.collect_vendor_framework_sources( flattened_config ) )
109
+
110
+ FILE_COLLECTIONS.each { |collection| flattened_config.merge!( @configurator_builder.public_send( collection, flattened_config ) ) }
122
111
 
123
112
  return flattened_config
124
113
  end
125
114
 
126
115
 
127
- def build_constants_and_accessors(config, context)
116
+ def build_constants_and_accessors(config, target)
128
117
  @configurator_builder.build_global_constants(config)
129
- @configurator_builder.build_accessor_methods(config, context)
118
+ @configurator_builder.build_accessor_methods(config, target)
130
119
  end
131
120
 
132
121
 
133
122
  def validate_required_sections(config)
134
- validation = []
135
- validation << @configurator_validator.exists?(config, :project)
136
- validation << @configurator_validator.exists?(config, :paths)
137
-
138
- return false if (validation.include?(false))
139
- return true
123
+ return [:project, :paths].map { |section| @configurator_validator.exists?( config, section ) }.all?
140
124
  end
141
125
 
142
126
 
143
127
  def validate_required_section_values(config)
144
- validation = []
145
- validation << @configurator_validator.exists?(config, :project, :build_root)
146
- validation << @configurator_validator.exists?(config, :paths, :test)
147
- validation << @configurator_validator.exists?(config, :paths, :source)
148
-
149
- return false if (validation.include?(false))
150
- return true
128
+ required = [ [:project, :build_root], [:paths, :test], [:paths, :source] ]
129
+ return required.map { |keys| @configurator_validator.exists?( config, *keys ) }.all?
151
130
  end
152
131
 
153
132
 
133
+ # Every check runs, so every problem is reported
154
134
  def validate_paths(config)
155
- valid = true
156
-
157
- # Ceedling ensures [:unity_helper_path] is an array
158
- config[:cmock][:unity_helper_path].each do |path|
159
- valid &= @configurator_validator.validate_filepath_simple( path, :cmock, :unity_helper_path )
160
- end
161
-
162
- config[:plugins][:load_paths].each do |path|
163
- valid &= @configurator_validator.validate_filepath_simple( path, :plugins, :load_paths )
164
- end
165
-
166
- config[:paths].keys.sort.each do |key|
167
- valid &= @configurator_validator.validate_path_list(config, :paths, key)
168
- valid &= @configurator_validator.validate_paths_entries(config, key)
169
- end
170
-
171
- config[:files].keys.sort.each do |key|
172
- valid &= @configurator_validator.validate_path_list(config, :files, key)
173
- valid &= @configurator_validator.validate_files_entries(config, key)
174
- end
135
+ valid = validate_simple_paths( config[:cmock][:unity_helper_path], :cmock, :unity_helper_path )
136
+ valid &= validate_simple_paths( config[:plugins][:load_paths], :plugins, :load_paths )
137
+ valid &= validate_path_section( config, :paths, :validate_paths_entries )
138
+ valid &= validate_path_section( config, :files, :validate_files_entries )
175
139
 
176
140
  return valid
177
141
  end
@@ -183,611 +147,391 @@ class ConfiguratorSetup
183
147
  valid &= @configurator_validator.validate_tool( config:config, key:tool )
184
148
  end
185
149
 
150
+ # A gdb that failed validation needs no probe and no fallback warning
151
+ validate_gdb_attach_capability( config ) if valid
152
+
186
153
  return valid
187
154
  end
188
155
 
189
- def validate_test_runner_generation(config, include_test_case, exclude_test_case)
190
- cmdline_args = config[:test_runner][:cmdline_args]
156
+ # A gdb that answers `--version` may still be unable to attach to a process. macOS often
157
+ # revokes a Homebrew gdb's debugger entitlement, after a Homebrew upgrade, a macOS update,
158
+ # or a Gatekeeper or taskgated cache reset. A project using `:use_backtrace: :gdb` on such
159
+ # a machine falls back to `:simple` backtraces with a warning, rather than failing validation.
160
+ #
161
+ # Validating the gdb tool already proved gdb present, so where no probe runs it is usable.
162
+ def validate_gdb_attach_capability(config)
163
+ return unless config[:project][:use_backtrace] == :gdb
164
+
165
+ @gdb_backtrace_state = :usable
166
+ return unless @system_wrapper.macos?
167
+
168
+ # The probe runs with :boom false, so its :exit_code is not the real exit code.
169
+ # Success comes from the process status.
170
+ result = probe_gdb_attach()
171
+ return if result[:status]&.success?
172
+
173
+ @gdb_backtrace_state = :fell_back
174
+ config[:project][:use_backtrace] = :simple
175
+
176
+ walk = @reportinator.generate_config_walk( [:project, :use_backtrace] )
177
+ msg = "#{walk} is ':gdb' but #{gdb_attach_failure( result )}. Falling back to ':simple' for this run."
178
+ @loginator.log( msg, Verbosity::ERRORS, LogLabels::WARNING )
179
+ end
191
180
 
192
- # Test case filters in use
193
- test_case_filters = !include_test_case.empty? || !exclude_test_case.empty?
181
+ # Launches a short-lived process, attaches gdb to it, and detaches at once. A clean
182
+ # attach proves gdb works here, which `--version` cannot. One shell command keeps the
183
+ # success path fast.
184
+ def probe_gdb_attach()
185
+ command = {
186
+ name: 'gdb_attach_probe',
187
+ line: %q{sh -c 'sleep 5 & pid=$!; gdb -q --batch --pid "$pid" --eval-command detach 2>&1; rc=$?; kill "$pid" 2>/dev/null; exit $rc'},
188
+ options: { boom: false }
189
+ }
190
+
191
+ return @tool_executor.exec( command )
192
+ end
194
193
 
195
- # Test case filters are in use but test runner command line arguments are not enabled
196
- if (test_case_filters and !cmdline_args)
197
- msg = 'Test case filters cannot be used -- enable :test_runner ↳ :cmdline_args in your project configuration'
198
- @loginator.log( msg, Verbosity::ERRORS )
199
- return false
200
- end
201
194
 
202
- return true
195
+ # Each :defines context holds a list of symbols. :test and :preprocess may instead hold a
196
+ # matcher hash of test filename matchers, each naming a list of symbols.
197
+ #
198
+ # :defines:
199
+ # :<context>:
200
+ # - FOO
201
+ # :test:
202
+ # :<matcher>:
203
+ # - FOO
204
+ def validate_defines(config)
205
+ defines = config[:defines]
206
+
207
+ return true if defines.nil?
208
+ return log_invalid( ":defines must contain key / value pairs, not #{defines.class.to_s.downcase} (see docs for examples)" ) unless defines.is_a?( Hash )
209
+
210
+ matcher_contexts = matcher_contexts( config, [:test, :preprocess] )
211
+
212
+ # :use_test_definition is a setting, not a context
213
+ return defines.reject { |context, _| context == :use_test_definition }.map do |context, entries|
214
+ validate_entries( [:defines, context], entries, matcher_contexts, 'compilation symbols' )
215
+ end.all?
203
216
  end
204
217
 
205
218
 
206
- def validate_defines(_config)
207
- defines = _config[:defines]
219
+ # Each :flags context holds operations, each a list of flags. :test operations may instead
220
+ # hold a matcher hash of test filename matchers, each naming a list of flags.
221
+ #
222
+ # :flags:
223
+ # :<context>:
224
+ # :<operation>:
225
+ # - --flag
226
+ # :test:
227
+ # :<operation>:
228
+ # :<matcher>:
229
+ # - --flag
230
+ def validate_flags(config)
231
+ flags = config[:flags]
208
232
 
209
- return true if defines.nil?
233
+ return true if flags.nil?
234
+ return log_invalid( ":flags must contain key / value pairs, not #{flags.class.to_s.downcase} (see docs for examples)" ) unless flags.is_a?( Hash )
210
235
 
211
- # Ensure config[:defines] is a hash
212
- if defines.class != Hash
213
- msg = ":defines must contain key / value pairs, not #{defines.class.to_s.downcase} (see docs for examples)"
214
- @loginator.log( msg, Verbosity::ERRORS )
215
- return false
216
- end
236
+ warn_of_release_preprocessing( flags )
217
237
 
218
- valid = true
238
+ matcher_contexts = matcher_contexts( config, [:test] )
219
239
 
220
- # Validate that each context contains only a list of symbols or a matcher hash for :test / :preprocess context
221
- #
222
- # :defines:
223
- # :<context>:
224
- # - FOO
225
- # - BAR
226
- #
227
- # or
228
- #
229
- # :defines:
230
- # :test:
231
- # :<matcher>:
232
- # - FOO
233
- # - BAR
234
- # :preprocess:
235
- # :<matcher>:
236
- # - FOO
237
- # - BAR
238
-
239
- # These contexts support filename matchers optionally. Others can only contain simple lists
240
- contexts_supporting_matchers = [:test, :preprocess]
241
- contexts_supporting_matchers << :gcov if (_config && _config[:plugins] && _config[:plugins][:enabled] && _config[:plugins][:enabled].include?('gcov'))
242
-
243
- defines.each_pair do |context, config|
244
- walk = @reportinator.generate_config_walk( [:defines, context] )
245
-
246
- # Special handling for configuration setting, not a hash context container
247
- next if context == :use_test_definition
248
-
249
- # Matcher contexts (only contexts that support matcher hashes)
250
- if contexts_supporting_matchers.include? context
251
- if config.class != Array and config.class != Hash
252
- msg = "#{walk} entry '#{config}' must be a list or matcher, not #{config.class.to_s.downcase} (see docs for examples)"
253
- @loginator.log( msg, Verbosity::ERRORS )
254
- valid = false
255
- end
256
-
257
- # All other (simple) contexts
258
- else
259
- # Handle the (probably) common case of trying to use matchers for any context other than :test or :preprocess
260
- if config.class == Hash
261
- msg = "#{walk} entry '#{config}' must be a list; matcher hashes are only available for :test & :preprocess contexts (see docs for details)"
262
- @loginator.log( msg, Verbosity::ERRORS )
263
- valid = false
264
- # Catchall for any oddball entries
265
- elsif config.class != Array
266
- msg = "#{walk} entry '#{config}' must be a list, not #{config.class.to_s.downcase} (see docs for examples)"
267
- @loginator.log( msg, Verbosity::ERRORS )
268
- valid = false
269
- end
270
- end
271
- end
240
+ return flags.map { |context, operations| validate_flags_context( context, operations, matcher_contexts ) }.all?
241
+ end
272
242
 
273
- # Validate simple option of lists applied across an entire context of any name
274
- # :defines:
275
- # :<context>: # :test, :release, etc.
276
- # - FOO
277
- # - BAR
278
-
279
- defines.each_pair do |context, config|
280
- # Only validate lists of compilation symbols in this block (look for matchers in next block)
281
- next if config.class != Array
282
-
283
- # Handle any YAML alias referencing causing a nested array
284
- config.flatten!()
285
-
286
- # Ensure each item in list is a string
287
- config.each do |symbol|
288
- if symbol.class != String
289
- walk = @reportinator.generate_config_walk( [:defines, context] )
290
- msg = "#{walk} list entry #{symbol} must be a string, not #{symbol.class.to_s.downcase} (see docs for examples)"
291
- @loginator.log( msg, Verbosity::ERRORS )
292
- valid = false
293
- end
294
- end
295
- end
296
243
 
297
- # Validate :test / :preprocess context matchers (hash) if they exist
298
- # :defines:
299
- # :test:
300
- # :<matcher>: # Can be wildcard, substring, or regular expression in a string or symbol
301
- # - FOO
302
- # - BAR
303
- # :preprocess:
304
- # :<matcher>: # Can be wildcard, substring, or regular expression in a string or symbol
305
- # - FOO
306
- # - BAR
307
-
308
- contexts = [:test, :preprocess]
309
-
310
- contexts.each do |context|
311
- matchers = defines[context]
312
-
313
- # Skip processing if context isn't present or is present but is not a matcher hash
314
- next if matchers.nil? or matchers.class != Hash
315
-
316
- # Inspect each test matcher
317
- matchers.each_pair do |matcher, symbols|
318
-
319
- walk = @reportinator.generate_config_walk( [:defines, context, matcher] )
320
-
321
- # Ensure container associated with matcher is a list
322
- if symbols.class != Array
323
- msg = "#{walk} entry '#{symbols}' is not a list of compilation symbols but a #{symbols.class.to_s.downcase}"
324
- @loginator.log( msg, Verbosity::ERRORS )
325
- valid = false
326
-
327
- # Skip further validation if matcher value is not a list of symbols
328
- next
329
- end
330
-
331
- # Handle any YAML alias nesting in array
332
- symbols.flatten!()
333
-
334
- # Ensure matcher itself is a Ruby symbol or string
335
- if matcher.class != Symbol and matcher.class != String
336
- msg = "#{walk} matcher is not a string or symbol"
337
- @loginator.log( msg, Verbosity::ERRORS )
338
- valid = false
339
-
340
- # Skip further validation if matcher key is not a symbol
341
- next
342
- end
343
-
344
- walk = @reportinator.generate_config_walk( [:defines, context, matcher] )
345
-
346
- # Ensure each item in compilation symbols list for matcher is a string
347
- symbols.each do |symbol|
348
- if symbol.class != String
349
- msg = "#{walk} entry '#{symbol}' is not a string"
350
- @loginator.log( msg, Verbosity::ERRORS )
351
- valid = false
352
- end
353
- end
354
-
355
- begin
356
- @configurator_validator.validate_matcher( matcher.to_s.strip() )
357
- rescue Exception => ex
358
- msg = "Matcher #{walk} contains #{ex.message}"
359
- @loginator.log( msg, Verbosity::ERRORS )
360
- valid = false
361
- end
244
+ # Test preprocessing reads the line markers -P and --no-line-commands suppress. Without
245
+ # test preprocessing nothing reads them, so the options are harmless there.
246
+ def validate_line_markers(config)
247
+ return true if config.dig( :project, :use_test_preprocessor ) == :none
362
248
 
363
- end
364
- end
249
+ found = LineMarkerSuppressors.in_flags( config[:flags], matcher_contexts( config, [:test] ) ) + LineMarkerSuppressors.in_tools( config )
250
+ found.each { |walk_keys, entry| log_error( line_markers_message( walk_keys, entry ) ) }
251
+ return found.empty?
252
+ end
365
253
 
366
- return valid
254
+ def validate_test_preprocessor(config)
255
+ return validate_option( config, :use_test_preprocessor, [:none, :all, :tests, :mocks] )
367
256
  end
368
257
 
369
258
 
370
- def validate_flags(_config)
371
- flags = _config[:flags]
259
+ # :environment is a list of single-pair hashes, each a variable name and a string or list of strings
260
+ def validate_environment_vars(config)
261
+ environment = config[:environment]
372
262
 
373
- return true if flags.nil?
263
+ return true if environment.nil?
264
+ return log_invalid( ":environment must contain a list of key / value pairs, not #{environment.class.to_s.downcase} (see docs for examples)" ) unless environment.is_a?( Array )
374
265
 
375
- # Ensure config[:flags] is a hash
376
- if flags.class != Hash
377
- msg = ":flags must contain key / value pairs, not #{flags.class.to_s.downcase} (see docs for examples)"
378
- @loginator.log( msg, Verbosity::ERRORS )
379
- # Immediately bail out
380
- return false
381
- end
266
+ # Entries are inspected further only once every one is a key / value pair
267
+ return false unless validate_environment_pairs( environment )
382
268
 
383
- valid = true
269
+ valid = environment.map { |entry| validate_environment_entry( entry ) }.all?
270
+ return valid & validate_unique_environment_names( environment )
271
+ end
384
272
 
385
- # Validate that each context has an operation hash
386
- # :flags
387
- # :<context>: # :test, :release, etc.
388
- # :<operation>: # :compile, :link, etc.
389
- # ...
390
273
 
391
- flags.each_pair do |context, operations|
392
- walk = @reportinator.generate_config_walk( [:flags, context] )
274
+ def validate_backtrace(config)
275
+ return validate_option( config, :use_backtrace, [:none, :simple, :gdb] )
276
+ end
393
277
 
394
- if operations.nil?
395
- msg = "#{walk} operations key / value pairs are missing"
396
- @loginator.log( msg, Verbosity::ERRORS )
278
+ def validate_threads(config)
279
+ return [:compile_threads, :test_threads].map { |key| validate_thread_count( config, key ) }.all?
280
+ end
397
281
 
398
- valid = false
399
- next
400
- end
282
+ # `:max_extraction_length` multiplies 1000 characters, so `5000` reads more clearly than
283
+ # `5000000`. The minimum keeps that ceiling well above any ordinary C declaration or
284
+ # signature, and catches `1000` written to mean 1000 characters.
285
+ def validate_partials(config)
286
+ max_extraction_length = config[:partials][:max_extraction_length]
287
+ walk = @reportinator.generate_config_walk( [:partials, :max_extraction_length] )
401
288
 
402
- if operations.class != Hash
403
- example = @reportinator.generate_config_walk( [:flags, context, :compile] )
404
- msg = "#{walk} context must contain :<operation> key / value pairs, not #{operations.class.to_s.downcase} '#{operations}' (ex. #{example})"
405
- @loginator.log( msg, Verbosity::ERRORS )
289
+ return log_invalid( "#{walk} is not an integer" ) unless max_extraction_length.is_a?( Integer )
290
+ return log_invalid( "#{walk} must be at least 10 (10,000 characters)" ) if max_extraction_length < 10
291
+ return true
292
+ end
406
293
 
407
- # Immediately bail out
408
- return false
409
- end
410
- end
294
+ # Discovery records a path beneath :plugins for each enabled plugin it found, whatever
295
+ # kind of plugin it is
296
+ def validate_plugins(config)
297
+ missing_plugins = config[:plugins][:enabled].reject { |plugin| config[:plugins].key?( :"#{plugin}_path" ) }
411
298
 
412
- if !!flags[:release] and !!flags[:release][:preprocess]
413
- walk = @reportinator.generate_config_walk( [:flags, :release, :preprocess] )
414
- msg = "Preprocessing configured at #{walk} is only supported in the :test context"
415
- @loginator.log( msg, Verbosity::ERRORS, LogLabels::WARNING )
299
+ missing_plugins.each do |plugin|
300
+ message = "Plugin '#{plugin}' not found in built-in or project Ruby load paths. Check load paths and plugin naming and path conventions."
301
+ @loginator.log( message, Verbosity::ERRORS )
416
302
  end
417
303
 
418
- # Validate that each <:context> ↳ <:operation> contains only a list of flags or that :test ↳ <:operation> optionally contains a matcher hash
419
- #
420
- # :flags:
421
- # :<context>: # :test or :release
422
- # :<operation>: # :compile, :link, or :assemble (plus :preprocess for :test context)
423
- # - --flag
424
- #
425
- # or
426
- #
427
- # :flags:
428
- # :test:
429
- # :<operation>:
430
- # :<matcher>:
431
- # - --flag
432
-
433
- # These contexts support filename matchers optionally. Others can only contain simple lists
434
- contexts_supporting_matchers = [:test]
435
- contexts_supporting_matchers << :gcov if (_config && _config[:plugins] && _config[:plugins][:enabled] && _config[:plugins][:enabled].include?('gcov'))
436
-
437
- flags.each_pair do |context, operations|
438
- operations.each_pair do |operation, config|
439
- walk = @reportinator.generate_config_walk( [:flags, context, operation] )
440
-
441
- if config.nil?
442
- msg = "#{walk} is missing a list or matcher hash"
443
- @loginator.log( msg, Verbosity::ERRORS )
444
-
445
- valid = false
446
- next
447
- end
448
-
449
- # :test context operations with lists or matchers (hashes)
450
- if contexts_supporting_matchers.include? context
451
- if config.class != Array and config.class != Hash
452
- msg = "#{walk} entry '#{config}' must be a list or matcher hash, not #{config.class.to_s.downcase} (see docs for examples)"
453
- @loginator.log( msg, Verbosity::ERRORS )
454
- valid = false
455
- end
456
-
457
- # Other (simple) contexts
458
- else
459
- # Handle the (probably) common case of trying to use matchers for operations in any context other than :test
460
- if config.class == Hash
461
- msg = "#{walk} entry '#{config}' must be a list; matcher hashes are only available for :test context (see docs for details)"
462
- @loginator.log( msg, Verbosity::ERRORS )
463
- valid = false
464
- # Catchall for any oddball entries
465
- elsif config.class != Array
466
- msg = "#{walk} entry '#{config}' must be a list, not #{config.class.to_s.downcase} (see docs for examples)"
467
- @loginator.log( msg, Verbosity::ERRORS )
468
- valid = false
469
- end
470
- end
471
- end
472
- end
304
+ return missing_plugins.empty?
305
+ end
473
306
 
474
- # Validate simple option of lists of flags (strings) for <:context> ↳ <:operation>
475
- # :flags
476
- # :<context>:
477
- # :<operation>:
478
- # - --flag
479
-
480
- flags.each_pair do |context, operations|
481
- operations.each_pair do |operation, flags|
482
-
483
- # Only validate lists of flags in this block (look for matchers in next block)
484
- next if flags.class != Array
485
-
486
- # Handle any YAML alias referencing causing a nested array
487
- flags.flatten!()
488
-
489
- # Ensure each item in list is a string
490
- flags.each do |flag|
491
- if flag.class != String
492
- walk = @reportinator.generate_config_walk( [:flags, context, operation] )
493
- msg = "#{walk} simple list entry '#{flag}' must be a string, not #{flag.class.to_s.downcase} (see docs for examples)"
494
- @loginator.log( msg, Verbosity::ERRORS )
495
- valid = false
496
- end
497
- end
498
- end
499
- end
307
+ ### Private ###
500
308
 
501
- # Validate :test ↳ <:operation> matchers (hash) if they exist
502
- # :flags:
503
- # :test:
504
- # :<operation>: # :preprocess, :compile, :assemble, :link
505
- # :<matcher>: # Can be wildcard, substring, or regular expression as a Ruby string or symbol
506
- # - FOO
507
- # - BAR
508
-
509
- # If there's no test context, we're done
510
- test_context = flags[:test]
511
- return valid if test_context.nil?
512
-
513
- matchers_present = false
514
- test_context.each_pair do |operation, matchers|
515
- if matchers.class == Hash
516
- matchers_present = true
517
- break
518
- end
519
- end
309
+ private
520
310
 
521
- # If there's no matchers for :test ↳ <:operation>, we're done
522
- return valid if !matchers_present
523
-
524
- # Inspect each :test ↳ <:operation> matcher
525
- test_context.each_pair do |operation, matchers|
526
- # Only validate matchers (skip simple lists of flags)
527
- next if matchers.class != Hash
528
-
529
- matchers.each_pair do |matcher, flags|
530
- # Ensure matcher itself is a Ruby symbol or string
531
- if matcher.class != Symbol and matcher.class != String
532
- walk = @reportinator.generate_config_walk( [:flags, :test, operation] )
533
- msg = "#{walk} entry '#{matcher}' is not a string or symbol"
534
- @loginator.log( msg, Verbosity::ERRORS )
535
- valid = false
536
-
537
- # Skip further validation if matcher key is not a string or symbol
538
- next
539
- end
540
-
541
- walk = @reportinator.generate_config_walk( [:flags, :test, operation, matcher] )
542
-
543
- # Ensure container associated with matcher is a list
544
- if flags.class != Array
545
- msg = "#{walk} entry '#{flags}' is not a list of command line flags but a #{flags.class.to_s.downcase}"
546
- @loginator.log( msg, Verbosity::ERRORS )
547
- valid = false
548
-
549
- # Skip further validation if matcher value is not a list of flags
550
- next
551
- end
552
-
553
- # Handle any YAML alias nesting in array
554
- flags.flatten!()
555
-
556
- # Ensure each item in flags list for matcher is a string
557
- flags.each do |flag|
558
- if flag.class != String
559
- msg = "#{walk} entry '#{flag}' is not a string"
560
- @loginator.log( msg, Verbosity::ERRORS )
561
- valid = false
562
- end
563
- end
564
-
565
- begin
566
- @configurator_validator.validate_matcher( matcher.to_s.strip() )
567
- rescue Exception => ex
568
- msg = "Matcher #{walk} contains #{ex.message}"
569
- @loginator.log( msg, Verbosity::ERRORS )
570
- valid = false
571
- end
311
+ def corrupted_vendor_path?(path, marker_file)
312
+ marker = File.join( path, marker_file )
572
313
 
573
- end
314
+ return ( @file_wrapper.exist?( path ) && !@file_wrapper.directory?( path ) ) ||
315
+ ( @file_wrapper.exist?( marker ) && @file_wrapper.directory?( marker ) )
316
+ end
317
+
318
+ # Each framework a build uses, as [vendored source, build destination, marker file]
319
+ def vendored_frameworks(config)
320
+ frameworks = [ [File.join( config[:unity_vendor_path], UNITY_LIB_PATH ), config[:project_build_vendor_unity_path], UNITY_C_FILE] ]
321
+
322
+ if config[:project_use_mocks]
323
+ frameworks << [File.join( config[:cmock_vendor_path], CMOCK_LIB_PATH ), config[:project_build_vendor_cmock_path], CMOCK_C_FILE]
574
324
  end
575
325
 
576
- return valid
326
+ if config[:project_use_exceptions]
327
+ frameworks << [File.join( config[:cexception_vendor_path], CEXCEPTION_LIB_PATH ), config[:project_build_vendor_cexception_path], CEXCEPTION_C_FILE]
328
+ end
329
+
330
+ return frameworks
577
331
  end
578
332
 
333
+ def frameworks_for_build(config, test_build:, release_build:)
334
+ return vendored_frameworks( config ) if test_build
335
+ return vendored_frameworks( config ).select { |_, _, marker_file| marker_file == CEXCEPTION_C_FILE } if release_build
579
336
 
580
- def validate_test_preprocessor(config)
581
- valid = true
337
+ return []
338
+ end
582
339
 
583
- options = [:none, :all, :tests, :mocks]
340
+ def vendor_test_support_files(ceedling_lib_path, config)
341
+ copy_backtrace_script( ceedling_lib_path, config ) if config[:project_use_backtrace] == :gdb
584
342
 
585
- use_test_preprocessor = config[:project][:use_test_preprocessor]
343
+ return unless config[:project_use_partials]
586
344
 
587
- if !options.include?( use_test_preprocessor )
588
- walk = @reportinator.generate_config_walk( [:project, :use_test_preprocessor] )
589
- msg = "#{walk} is ':#{use_test_preprocessor}' but must be one of {#{options.map{|o| ':' + o.to_s()}.join(', ')}}"
590
- @loginator.log( msg, Verbosity::ERRORS )
591
- valid = false
592
- end
345
+ @file_wrapper.sync_file( File.join( ceedling_lib_path, CEEDLING_HEADER_FILEPATH ), config[:project_build_vendor_ceedling_path] )
346
+ end
593
347
 
594
- return valid
348
+ # The destination may not exist yet on a fresh build, since Rake creates directories
349
+ # after configuration
350
+ def copy_backtrace_script(ceedling_lib_path, flattened_config)
351
+ @file_wrapper.mkdir( flattened_config[:project_build_tests_root] )
352
+ @file_wrapper.sync_file( File.join( ceedling_lib_path, BACKTRACE_GDB_SCRIPT_FILE ), flattened_config[:project_build_tests_root] )
595
353
  end
596
354
 
355
+ def validate_simple_paths(paths, *keys)
356
+ return paths.map { |path| @configurator_validator.validate_filepath_simple( path, *keys ) }.all?
357
+ end
597
358
 
598
- def validate_environment_vars(config)
599
- environment = config[:environment]
359
+ # Each entry of :paths or :files must exist and yield what its section expects
360
+ def validate_path_section(config, section, entries_validation)
361
+ return config[section].keys.sort.map do |key|
362
+ @configurator_validator.validate_path_list( config, section, key ) & @configurator_validator.public_send( entries_validation, config, key )
363
+ end.all?
364
+ end
600
365
 
601
- return true if environment.nil?
366
+ def gdb_attach_failure(result)
367
+ reason = "`gdb` could not attach to a probe process"
368
+ return reason + " -- this is a macOS `gdb` codesigning / trust problem" if result[:output].to_s.match?( /Unable to find Mach task port/ )
369
+ return reason
370
+ end
602
371
 
603
- # Ensure config[:environment] is an array (of simple hashes--validated below)
604
- if environment.class != Array
605
- msg = ":environment must contain a list of key / value pairs, not #{environment.class.to_s.downcase} (see docs for examples)"
606
- @loginator.log( msg, Verbosity::ERRORS )
607
- return false
608
- end
372
+ def line_markers_message(walk_keys, entry)
373
+ msg = "#{@reportinator.generate_config_walk( walk_keys )} entry '#{entry}' suppresses the preprocessor line markers " \
374
+ "test preprocessing reads to find #includes, mockable functions, and test cases. Remove it."
375
+ msg += " Test preprocessing uses :compile flags wherever no :preprocess flags apply." if walk_keys[2] == :compile
376
+ return msg
377
+ end
609
378
 
610
- valid = true
611
- keys = []
612
-
613
- # Ensure a hash for each entry
614
- environment.each do |entry|
615
- if entry.class != Hash
616
- msg = ":environment list entry #{entry} is not a key / value pair (ex. :var: value)"
617
- @loginator.log( msg, Verbosity::ERRORS )
618
- valid = false
619
- end
620
- end
379
+ # Build contexts that plugins declare peers of :test also support matchers
380
+ def matcher_contexts(config, contexts)
381
+ return contexts + Array( config.dig( :plugins, :test_build_contexts ) ).map( &:to_sym )
382
+ end
621
383
 
622
- # Only end processing if an entry wasn't a hash
623
- return valid if !valid
384
+ # A context's entries are a list of strings, or, in a context supporting matchers, a
385
+ # matcher hash. The context is the second key walked. `noun` names what the strings are.
386
+ def validate_entries(walk_keys, entries, matcher_contexts, noun)
387
+ return false unless validate_entries_form( walk_keys, entries, matcher_contexts )
388
+ return validate_string_list( walk_keys, entries ) if entries.is_a?( Array )
389
+ return validate_matchers( walk_keys, entries, noun )
390
+ end
624
391
 
625
- # Validate each hash entry
626
- environment.each do |entry|
627
- key_length = entry.keys.length()
392
+ def validate_entries_form(walk_keys, entries, matcher_contexts)
393
+ walk = @reportinator.generate_config_walk( walk_keys )
394
+ kind = entries.class.to_s.downcase
395
+ matchers = matcher_contexts.include?( walk_keys[1] )
628
396
 
629
- # Ensure entry is a hash with just a single key / value pair
630
- if key_length != 1
631
- msg = ":environment entry #{entry} does not specify exactly one key (see docs for examples)"
632
- @loginator.log( msg, Verbosity::ERRORS )
633
- valid = false
634
- end
397
+ return true if entries.is_a?( Array ) or (matchers and entries.is_a?( Hash ))
398
+ return log_invalid( "#{walk} entry '#{entries}' must be a list or matcher hash, not #{kind} (see docs for examples)" ) if matchers
399
+ return log_invalid( "#{walk} entry '#{entries}' must be a list, not #{kind} (see docs for examples)" ) unless entries.is_a?( Hash )
635
400
 
636
- key = entry.keys[0] # Get first (should be only) environment variable entry
637
- value = entry[key] # Get associated value
401
+ contexts = matcher_contexts.map { |context| ":#{context}" }.join( ' & ' )
402
+ return log_invalid( "#{walk} entry '#{entries}' must be a list; matcher hashes are only available for #{contexts} (see docs for details)" )
403
+ end
638
404
 
639
- # Remember key for later duplication check
640
- keys << key.to_s.downcase
405
+ # A YAML alias can nest a list, so the list is flattened in place first
406
+ def validate_string_list(walk_keys, list)
407
+ walk = @reportinator.generate_config_walk( walk_keys )
641
408
 
642
- # Ensure entry key is a symbol or string
643
- if key.class != Symbol and key.class != String
644
- msg = ":environment entry '#{key}' must be a symbol or string (:#{key})"
645
- @loginator.log( msg, Verbosity::ERRORS )
646
- valid = false
409
+ list.flatten!
410
+ non_strings = list.reject { |item| item.is_a?( String ) }
647
411
 
648
- # Skip validation of value if key is not a symbol or string
649
- next
650
- end
412
+ non_strings.each { |item| log_error( "#{walk} list entry '#{item}' must be a string, not #{item.class.to_s.downcase} (see docs for examples)" ) }
413
+ return non_strings.empty?
414
+ end
651
415
 
652
- # Ensure entry value is a string or list
653
- if not (value.class == String or value.class == Array)
654
- msg = ":environment entry #{key} is associated with #{value.class.to_s.downcase}, not a string or list (see docs for details)"
655
- @loginator.log( msg, Verbosity::ERRORS )
656
- valid = false
657
- end
416
+ # Each matcher must be a well-formed string or symbol naming a list of strings
417
+ def validate_matchers(walk_keys, matchers, noun)
418
+ return matchers.map { |matcher, list| validate_matcher_entry( walk_keys, matcher, list, noun ) }.all?
419
+ end
658
420
 
659
- # If path is a list, ensure it's all strings
660
- if value.class == Array
661
- value.each do |item|
662
- if item.class != String
663
- msg = ":environment entry #{key} contains a list element '#{item}' (#{item.class.to_s.downcase}) that is not a string"
664
- @loginator.log( msg, Verbosity::ERRORS )
665
- valid = false
666
- end
667
- end
668
- end
421
+ def validate_matcher_entry(walk_keys, matcher, list, noun)
422
+ unless matcher.is_a?( Symbol ) or matcher.is_a?( String )
423
+ return log_invalid( "#{@reportinator.generate_config_walk( walk_keys )} matcher '#{matcher}' is not a string or symbol" )
669
424
  end
670
425
 
671
- # Find any duplicate keys
672
- dups = keys.uniq.select { |k| keys.count( k ) > 1 }
673
-
674
- if !dups.empty?
675
- msg = "Duplicate :environment entr#{dups.length() == 1 ? 'y' : 'ies'} #{dups.map{|d| ':' + d.to_s}.join( ', ' )} found"
676
- @loginator.log( msg, Verbosity::ERRORS )
677
- valid = false
678
- end
679
-
680
- return valid
426
+ walk = @reportinator.generate_config_walk( walk_keys + [matcher] )
427
+ return log_invalid( "#{walk} entry '#{list}' is not a list of #{noun} but a #{list.class.to_s.downcase}" ) unless list.is_a?( Array )
428
+
429
+ return valid_matcher?( matcher, walk ) & validate_matcher_list( walk, list )
681
430
  end
682
431
 
432
+ # A YAML alias can nest a list, so the list is flattened in place first
433
+ def validate_matcher_list(walk, list)
434
+ list.flatten!
435
+ non_strings = list.reject { |item| item.is_a?( String ) }
436
+ non_strings.each { |item| log_error( "#{walk} entry '#{item}' is not a string" ) }
683
437
 
684
- def validate_backtrace(config)
685
- valid = true
438
+ return non_strings.empty?
439
+ end
686
440
 
687
- options = [:none, :simple, :gdb]
441
+ def valid_matcher?(matcher, walk)
442
+ @configurator_validator.validate_matcher( matcher.to_s.strip )
443
+ return true
444
+ rescue StandardError => ex
445
+ return log_invalid( "Matcher #{walk} contains #{ex.message}" )
446
+ end
688
447
 
689
- use_backtrace = config[:project][:use_backtrace]
448
+ def validate_flags_context(context, operations, matcher_contexts)
449
+ walk = @reportinator.generate_config_walk( [:flags, context] )
690
450
 
691
- if !options.include?( use_backtrace )
692
- walk = @reportinator.generate_config_walk( [:project, :use_backtrace] )
451
+ return log_invalid( "#{walk} operations key / value pairs are missing" ) if operations.nil?
693
452
 
694
- msg = "#{walk} is ':#{use_backtrace}' but must be one of {#{options.map{|o| ':' + o.to_s()}.join(', ')}}"
695
- @loginator.log( msg, Verbosity::ERRORS )
696
- valid = false
453
+ unless operations.is_a?( Hash )
454
+ example = @reportinator.generate_config_walk( [:flags, context, :compile] )
455
+ return log_invalid( "#{walk} context must contain :<operation> key / value pairs, not #{operations.class.to_s.downcase} '#{operations}' (ex. #{example})" )
697
456
  end
698
457
 
699
- return valid
458
+ return operations.map { |operation, entries| validate_flags_operation( [:flags, context, operation], entries, matcher_contexts ) }.all?
700
459
  end
701
460
 
702
- def validate_threads(config)
703
- valid = true
461
+ def validate_flags_operation(walk_keys, entries, matcher_contexts)
462
+ return log_invalid( "#{@reportinator.generate_config_walk( walk_keys )} is missing a list or matcher hash" ) if entries.nil?
463
+ return validate_entries( walk_keys, entries, matcher_contexts, 'command line flags' )
464
+ end
704
465
 
705
- compile_threads = config[:project][:compile_threads]
706
- test_threads = config[:project][:test_threads]
466
+ def warn_of_release_preprocessing(flags)
467
+ return unless flags[:release].is_a?( Hash ) and flags[:release][:preprocess]
707
468
 
708
- walk = @reportinator.generate_config_walk( [:project, :compile_threads] )
469
+ walk = @reportinator.generate_config_walk( [:flags, :release, :preprocess] )
470
+ @loginator.log( "Preprocessing configured at #{walk} is only supported in the :test context", Verbosity::ERRORS, LogLabels::WARNING )
471
+ end
709
472
 
710
- case compile_threads
711
- when Integer
712
- if compile_threads < 1
713
- @loginator.log( "#{walk} must be greater than 0", Verbosity::ERRORS )
714
- valid = false
715
- end
716
- when Symbol
717
- if compile_threads != :auto
718
- @loginator.log( "#{walk} is neither an integer nor :auto", Verbosity::ERRORS )
719
- valid = false
720
- end
721
- else
722
- @loginator.log( "#{walk} is neither an integer nor :auto", Verbosity::ERRORS )
723
- valid = false
724
- end
473
+ def validate_option(config, key, options)
474
+ value = config[:project][key]
475
+ return true if options.include?( value )
725
476
 
726
- walk = @reportinator.generate_config_walk( [:project, :test_threads] )
477
+ walk = @reportinator.generate_config_walk( [:project, key] )
478
+ return log_invalid( "#{walk} is ':#{value}' but must be one of {#{options.map { |option| ":#{option}" }.join( ', ' )}}" )
479
+ end
727
480
 
728
- case test_threads
729
- when Integer
730
- if test_threads < 1
731
- @loginator.log( "#{walk} must be greater than 0", Verbosity::ERRORS )
732
- valid = false
733
- end
734
- when Symbol
735
- if test_threads != :auto
736
- @loginator.log( "#{walk} is neither an integer nor :auto", Verbosity::ERRORS )
737
- valid = false
738
- end
739
- else
740
- @loginator.log( "#{walk} is neither an integer nor :auto", Verbosity::ERRORS )
741
- valid = false
742
- end
481
+ def validate_thread_count(config, key)
482
+ threads = config[:project][key]
483
+ walk = @reportinator.generate_config_walk( [:project, key] )
743
484
 
744
- return valid
485
+ return true if threads == :auto or (threads.is_a?( Integer ) and threads >= 1)
486
+ return log_invalid( "#{walk} must be greater than 0" ) if threads.is_a?( Integer )
487
+ return log_invalid( "#{walk} is neither an integer nor :auto" )
745
488
  end
746
489
 
747
- # `:max_extraction_length` is a multiplier of 1000 characters, not a raw character count
748
- # (project-file ergonomics -- `5000` reads more clearly than `5000000`). The minimum here
749
- # keeps that ceiling comfortably above any ordinary single C declaration or function
750
- # signature, catching a value so small it would defeat the setting's own purpose (e.g.
751
- # someone setting `1000` expecting "1000 characters" rather than "1000x characters").
752
- def validate_partials(config)
753
- valid = true
490
+ def validate_environment_pairs(environment)
491
+ non_pairs = environment.reject { |entry| entry.is_a?( Hash ) }
492
+ non_pairs.each { |entry| log_error( ":environment list entry #{entry} is not a key / value pair (ex. :var: value)" ) }
754
493
 
755
- max_extraction_length = config[:partials][:max_extraction_length]
494
+ return non_pairs.empty?
495
+ end
756
496
 
757
- walk = @reportinator.generate_config_walk( [:partials, :max_extraction_length] )
497
+ def validate_environment_entry(entry)
498
+ valid = (entry.keys.length == 1) || log_invalid( ":environment entry #{entry} does not specify exactly one key (see docs for examples)" )
758
499
 
759
- case max_extraction_length
760
- when Integer
761
- if max_extraction_length < 10
762
- @loginator.log( "#{walk} must be at least 10 (10,000 characters)", Verbosity::ERRORS )
763
- valid = false
764
- end
765
- else
766
- @loginator.log( "#{walk} is not an integer", Verbosity::ERRORS )
767
- valid = false
500
+ name, value = entry.first
501
+ return log_invalid( ":environment entry '#{name}' must be a symbol or string (:#{name})" ) unless name.is_a?( Symbol ) or name.is_a?( String )
502
+
503
+ return valid & validate_environment_value( name, value )
504
+ end
505
+
506
+ def validate_environment_value(name, value)
507
+ case value
508
+ when String then return true
509
+ when Array
510
+ non_strings = value.reject { |item| item.is_a?( String ) }
511
+ non_strings.each { |item| log_error( ":environment entry #{name} contains a list element '#{item}' (#{item.class.to_s.downcase}) that is not a string" ) }
512
+ return non_strings.empty?
768
513
  end
769
514
 
770
- return valid
515
+ return log_invalid( ":environment entry #{name} is associated with #{value.class.to_s.downcase}, not a string or list (see docs for details)" )
771
516
  end
772
517
 
773
- def validate_plugins(config)
774
- missing_plugins =
775
- Set.new( config[:plugins][:enabled] ) -
776
- Set.new( @configurator_plugins.rake_plugins ) -
777
- Set.new( @configurator_plugins.programmatic_plugins.map {|p| p[:plugin]} )
518
+ # Environment variable names are case-insensitive on some platforms
519
+ def validate_unique_environment_names(environment)
520
+ names = environment.map { |entry| entry.keys[0].to_s.downcase }
521
+ dups = names.select { |name| names.count( name ) > 1 }.uniq
522
+ return true if dups.empty?
778
523
 
779
- missing_plugins.each do |plugin|
780
- message = "Plugin '#{plugin}' not found in built-in or project Ruby load paths. Check load paths and plugin naming and path conventions."
781
- @loginator.log( message, Verbosity::ERRORS )
782
- end
524
+ return log_invalid( "Duplicate :environment entr#{dups.length == 1 ? 'y' : 'ies'} #{dups.map { |dup| ':' + dup }.join( ', ' )} found" )
525
+ end
783
526
 
784
- return ( (missing_plugins.size > 0) ? false : true )
527
+ def log_error(message)
528
+ @loginator.log( message, Verbosity::ERRORS )
785
529
  end
786
530
 
787
- # Hook for any warnings about configuration combinations that are legal but likely
788
- # unintentional or surprising.
789
- def warnings_for_problematic_configs(config)
790
- # Empty
531
+ # Logs an error and answers false, for a validation to return
532
+ def log_invalid(message)
533
+ log_error( message )
534
+ return false
791
535
  end
792
536
 
793
537
  end