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
@@ -10,17 +10,36 @@ require 'ceedling/constants'
10
10
  require 'ceedling/file_path_utils'
11
11
  require 'ceedling/exceptions'
12
12
  require 'ceedling/rake_app/rakefile_component_resolver'
13
- require 'ceedling/config/config_matchinator'
14
13
  require 'ceedling/tool_executor'
15
14
  require 'deep_merge'
16
15
 
17
16
  class Configurator
18
17
 
19
18
  attr_reader :project_config_hash, :programmatic_plugins, :rake_plugins
20
- attr_accessor :project_logging, :sanity_checks, :include_test_case, :exclude_test_case
19
+ attr_accessor :project_logging, :sanity_checks, :include_test_case, :exclude_test_case, :force_test_rerun,
20
+ :test_build_tasks, :release_build_tasks
21
21
 
22
22
  constructor :configurator_setup, :configurator_builder, :configurator_plugins, :config_walkinator, :yaml_wrapper, :system_wrapper, :loginator, :reportinator, :ruby_expandinator
23
23
 
24
+ # Validations of the sections everything else depends on. Configuration can reference
25
+ # environment variables that are evaluated early, so :environment is among them.
26
+ ESSENTIAL_VALIDATIONS = [:validate_required_sections, :validate_required_section_values, :validate_environment_vars].freeze
27
+
28
+ # Validations of the completed configuration
29
+ FINAL_VALIDATIONS = [
30
+ :validate_paths, :validate_tools, :validate_defines, :validate_flags, :validate_line_markers,
31
+ :validate_test_preprocessor, :validate_backtrace, :validate_threads, :validate_partials, :validate_plugins
32
+ ].freeze
33
+
34
+ # CMock and Unity options that test runner generation also reads
35
+ RUNNER_CMOCK_OPTIONS = [:mock_prefix, :mock_suffix, :mock_name_include_folder, :enforce_strict_ordering].freeze
36
+ RUNNER_UNITY_OPTIONS = [:use_param_tests, :shuffle_tests].freeze
37
+
38
+ # A minimal subset of the directives-only preprocessor tool: no defines, no include paths,
39
+ # and output to stdout, so no platform-specific null device. It is enough to detect
40
+ # -fdirectives-only support by a warning or exit code.
41
+ DIRECTIVES_ONLY_PROBE_ARGUMENTS = ['-E', '-fdirectives-only', '-x c', "\"${1}\""].freeze
42
+
24
43
  def setup()
25
44
  # Cmock config reference to provide to CMock for mock generation
26
45
  @cmock_config = {} # Default empty hash, replaced by reference below
@@ -28,8 +47,13 @@ class Configurator
28
47
  # Runner config reference to provide to runner generation
29
48
  @runner_config = {} # Default empty hash, replaced by reference below
30
49
 
31
- # Note: project_config_hash is an instance variable so constants and accessors created
32
- # in eval() statements in build() have something of proper scope and persistence to reference
50
+ # Unity config reference. The flattened project_config_hash holds no :unity section to read back.
51
+ @unity_config = {} # Default empty hash, replaced by reference below
52
+
53
+ # Partials config reference, for the same reason. Dependency-tracker meta hashes it whole.
54
+ @partials_config = {} # Default empty hash, replaced by reference below
55
+
56
+ # Accessors built from configuration read this
33
57
  @project_config_hash = {}
34
58
 
35
59
  @programmatic_plugins = []
@@ -39,34 +63,35 @@ class Configurator
39
63
  @sanity_checks = TestResultsSanityChecks::NORMAL
40
64
  end
41
65
 
66
+ # What startup learned of gdb backtraces (see ConfiguratorSetup#gdb_backtrace_state)
67
+ def gdb_backtrace_state
68
+ return @configurator_setup.gdb_backtrace_state
69
+ end
70
+
42
71
  # Override to prevent exception handling from walking & stringifying the object variables.
43
72
  # Object variables are gigantic and produce a flood of output.
44
73
  def inspect
45
- # TODO: When identifying information is added to constructor, insert it into `inspect()` string
46
- return this.class.name
74
+ return self.class.name
47
75
  end
48
76
 
49
77
  def replace_flattened_config(config)
50
78
  @project_config_hash.merge!(config)
51
- @configurator_setup.build_constants_and_accessors(@project_config_hash, binding())
79
+ @configurator_setup.build_constants_and_accessors(@project_config_hash, self)
52
80
  end
53
81
 
54
82
 
55
83
  # Set up essential flattened config related to verbosity.
56
84
  # We do this because early config validation failures may need access to verbosity,
57
85
  # but the accessors won't be available until after configuration is validated.
58
- def set_verbosity(config)
59
- # PROJECT_VERBOSITY and PROJECT_DEBUG set at command line processing before Ceedling is loaded
86
+ # PROJECT_VERBOSITY and PROJECT_DEBUG are set by command line processing.
87
+ def set_verbosity()
88
+ debug = !!defined?(PROJECT_DEBUG) && PROJECT_DEBUG
89
+ define_singleton_method( :project_debug ) { debug }
60
90
 
61
- if (!!defined?(PROJECT_DEBUG) and PROJECT_DEBUG)
62
- eval("def project_debug() return true end", binding())
63
- else
64
- eval("def project_debug() return false end", binding())
65
- end
91
+ return if !defined?(PROJECT_VERBOSITY)
66
92
 
67
- if !!defined?(PROJECT_VERBOSITY)
68
- eval("def project_verbosity() return #{PROJECT_VERBOSITY} end", binding())
69
- end
93
+ verbosity = PROJECT_VERBOSITY
94
+ define_singleton_method( :project_verbosity ) { verbosity }
70
95
  end
71
96
 
72
97
 
@@ -80,125 +105,33 @@ class Configurator
80
105
  # If partials enabled, enable full test preprocessing
81
106
  config[:project][:use_test_preprocessor] = :all
82
107
  @loginator.log( " > Enabled preprocessing." )
83
-
84
- # If partials enabled and CMock's `:treat_inlines` is enabled, quietly disable.
85
- # Enabling Partials and this feature causes extra processing for Ceedling and CMock that is never used.
86
- if config[:cmock][:treat_inlines] == :include
87
- config[:cmock][:treat_inlines] = :exclude
88
- @loginator.log( "Reverted :cmock ↳ :treat_inlines to :exclude because this CMock feature is superseded by Partials.", Verbosity::COMPLAIN, LogLabels::NOTICE )
89
- end
90
-
91
- # If partials enabled, inject partials name prefix symbol to all test compilation
92
- # and, if a project defines its own preprocess-scoped defines matcher, to
93
- # preprocessing as well -- `:preprocess:` defines are looked up independently
94
- # of `:test:` defines and only fall back to the latter when `:preprocess:`
95
- # is absent entirely, so a project-defined `:preprocess:` matcher needs this
96
- # symbol appended directly or Partials' own macro-based #includes break.
97
- # Handle both the simple list and matcher hash config formats.
98
- _partials_prefix_symbol = "CEEDLING_PARTIALS_PREFIX=#{PARTIAL_FILENAME_PREFIX}"
99
- ConfigMatchinator.append_matcher_entries( config[:defines][:test], _partials_prefix_symbol )
100
- ConfigMatchinator.append_matcher_entries( config[:defines][:preprocess], _partials_prefix_symbol )
101
108
  end
102
109
 
103
110
 
111
+ # Directives-only preprocessing is available only when preprocessing is on, fallback
112
+ # is not forced, and the configured C preprocessor supports -fdirectives-only
104
113
  def resolve_directives_only_preprocessing(config, tool_executor)
105
- # Nothing to probe if preprocessing is disabled
106
- preprocessing = config[:project][:use_test_preprocessor]
107
114
  config[:test_build][:preprocess_directives_only_available] = false
108
- return if preprocessing == :none
109
115
 
110
- # When forced fallback is enabled, skip the probe and mark directives-only unavailable
116
+ return if config[:project][:use_test_preprocessor] == :none
117
+
111
118
  if config[:test_build][:preprocess_force_fallback]
112
- @loginator.log(
113
- "Forcing fallback text-based preprocessing in place of directives-only (:test_build ↳ :preprocess_force_fallback is enabled).",
114
- Verbosity::COMPLAIN,
115
- LogLabels::NOTICE
116
- )
117
- return
119
+ return log_notice( "Forcing best-effort fallback preprocessing in place of directives-only (:test_build ↳ :preprocess_force_fallback is enabled)." )
118
120
  end
119
121
 
120
- # Probe whether the configured C preprocessor supports -fdirectives-only.
121
- # Use the Unity header as it is always-available, self-contained, no include paths needed.
122
- # Output goes to stdout (no -o flag) to avoid platform-specific null device paths.
123
- probe_filepath = File.join( CEEDLING_VENDOR, UNITY_LIB_PATH, UNITY_H_FILE )
124
-
125
- # Minimal subset of the directives-only preprocessor tool: no defines, no include paths,
126
- # no output file. Sufficient to detect `-fdirectives-only` support via warning or exit code.
127
- probe_tool = {
128
- executable: config[:tools][:test_file_directives_only_preprocessor][:executable],
129
- name: 'directives_only_probe',
130
- arguments: [
131
- '-E',
132
- '-fdirectives-only',
133
- '-x c',
134
- "\"${1}\""
135
- ]
136
- }
137
-
138
- command = tool_executor.build_command_line( probe_tool, [], probe_filepath )
139
- # Exception if something goes wrong; we want to detect errors here
140
- command[:options][:boom] = false
141
- results = tool_executor.exec( command )
142
-
143
- # Clang and some older GCC emit a warning (not an error) when -fdirectives-only is unsupported
144
- warning_detected = results[:output].match?( /warning[^\n]+-fdirectives-only/ )
145
-
146
- if warning_detected || results[:exit_code] != 0
147
- @loginator.log(
148
- "Preprocessor lacks -fdirectives-only support ➡️ Ceedling will use text-based fallback for preprocessing.",
149
- Verbosity::COMPLAIN,
150
- LogLabels::NOTICE
151
- )
152
- # :preprocess_directives_only_available already set to false above
153
- else
154
- config[:test_build][:preprocess_directives_only_available] = true
122
+ if !directives_only_supported?( config, tool_executor )
123
+ return log_notice( "Preprocessor lacks -fdirectives-only support ➡️ Ceedling will use best-effort fallback preprocessing." )
155
124
  end
125
+
126
+ config[:test_build][:preprocess_directives_only_available] = true
156
127
  end
157
128
 
158
129
 
159
- # The default tools (eg. DEFAULT_TOOLS_TEST) are merged into default config hash
130
+ # The default tools a build needs are merged into the default config hash
160
131
  def merge_tools_defaults(config, default_config)
161
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
162
- @reportinator.generate_progress( 'Collecting default tool configurations' )
163
- end
164
-
165
- # config[:project] is guaranteed to exist / validated to exist but may not include elements referenced below
166
- # config[:test_build] and config[:release_build] are optional in a user project configuration
167
-
168
-
169
- release_build, _ = @config_walkinator.fetch_value( :project, :release_build,
170
- hash:config,
171
- default: DEFAULT_CEEDLING_PROJECT_CONFIG[:project][:release_build]
172
- )
173
-
174
- test_preprocessing, _ = @config_walkinator.fetch_value( :project, :use_test_preprocessor,
175
- hash:config,
176
- default: DEFAULT_CEEDLING_PROJECT_CONFIG[:project][:use_test_preprocessor]
177
- )
132
+ progress( 'Collecting default tool configurations' )
178
133
 
179
- backtrace, _ = @config_walkinator.fetch_value( :project, :use_backtrace,
180
- hash:config,
181
- default: DEFAULT_CEEDLING_PROJECT_CONFIG[:project][:use_backtrace]
182
- )
183
-
184
- release_assembly, _ = @config_walkinator.fetch_value( :release_build, :use_assembly,
185
- hash:config,
186
- default: DEFAULT_CEEDLING_PROJECT_CONFIG[:release_build][:use_assembly]
187
- )
188
-
189
- test_assembly, _ = @config_walkinator.fetch_value( :test_build, :use_assembly,
190
- hash:config,
191
- default: DEFAULT_CEEDLING_PROJECT_CONFIG[:test_build][:use_assembly]
192
- )
193
-
194
- default_config.deep_merge( DEFAULT_TOOLS_TEST.deep_clone() )
195
-
196
- default_config.deep_merge( DEFAULT_TOOLS_TEST_PREPROCESSORS.deep_clone() ) if (test_preprocessing != :none)
197
- default_config.deep_merge( DEFAULT_TOOLS_TEST_ASSEMBLER.deep_clone() ) if test_assembly
198
- default_config.deep_merge( DEFAULT_TOOLS_TEST_GDB_BACKTRACE.deep_clone() ) if (backtrace == :gdb)
199
-
200
- default_config.deep_merge( DEFAULT_TOOLS_RELEASE.deep_clone() ) if release_build
201
- default_config.deep_merge( DEFAULT_TOOLS_RELEASE_ASSEMBLER.deep_clone() ) if (release_build and release_assembly)
134
+ needed_tools_defaults( config ).each { |defaults| default_config.deep_merge( defaults.deep_clone() ) }
202
135
  end
203
136
 
204
137
 
@@ -206,9 +139,7 @@ class Configurator
206
139
  # Cmock has its own internal defaults handling, but we need to set these specific values
207
140
  # so they're guaranteed values and present for the Ceedling environment to access
208
141
 
209
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
210
- @reportinator.generate_progress( 'Collecting CMock defaults' )
211
- end
142
+ progress( 'Collecting CMock defaults' )
212
143
 
213
144
  # Begin populating defaults with CMock defaults as set by Ceedling
214
145
  default_cmock = default_config[:cmock]
@@ -237,52 +168,14 @@ class Configurator
237
168
  end
238
169
 
239
170
 
171
+ # Plugin YAML defaults merge before plugin Ruby defaults. Neither replaces a value already present.
240
172
  def merge_plugins_defaults(paths_hash, config, default_config)
241
- # Config YAML defaults plugins
242
- plugin_yml_defaults = @configurator_plugins.find_plugin_yml_defaults( config, paths_hash )
243
-
244
- # Config Ruby-based hash defaults plugins
245
- plugin_hash_defaults = @configurator_plugins.find_plugin_hash_defaults( config, paths_hash )
246
-
247
-
248
- if !plugin_hash_defaults.empty?
249
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
250
- @reportinator.generate_progress( 'Collecting Plugin YAML defaults' )
251
- end
252
- end
253
-
254
- # Load base configuration values (defaults) from YAML
255
- plugin_yml_defaults.each do |plugin, defaults|
256
- _defaults = begin
257
- @yaml_wrapper.load( defaults )
258
- rescue YamlLoadException => e
259
- raise YamlLoadException.new(
260
- reason: e.reason, source: e.source, original_error: e.original_error,
261
- message: "Could not load default configuration for plugin '#{plugin}' ⏩️ #{e.message}"
262
- )
263
- end
264
-
265
- @loginator.lazy( Verbosity::DEBUG ) do
266
- " - #{plugin} >> " + _defaults.to_s()
267
- end
268
-
269
- default_config.deep_merge( _defaults )
173
+ yaml_defaults = @configurator_plugins.find_plugin_yml_defaults( config, paths_hash ).to_h do |plugin, path|
174
+ [plugin, load_plugin_yaml( path, "Could not load default configuration for plugin '#{plugin}'" )]
270
175
  end
271
176
 
272
- if !plugin_hash_defaults.empty?
273
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
274
- @reportinator.generate_progress( 'Collecting Plugin Ruby hash defaults' )
275
- end
276
- end
277
-
278
- # Load base configuration values (defaults) as hash from Ruby
279
- plugin_hash_defaults.each do |plugin, defaults|
280
- @loginator.lazy( Verbosity::DEBUG ) do
281
- " - #{plugin} >> " + defaults.to_s()
282
- end
283
-
284
- default_config.deep_merge( defaults )
285
- end
177
+ merge_plugin_defaults( 'YAML', yaml_defaults, default_config )
178
+ merge_plugin_defaults( 'Ruby hash', @configurator_plugins.find_plugin_hash_defaults( config, paths_hash ), default_config )
286
179
  end
287
180
 
288
181
 
@@ -291,118 +184,82 @@ class Configurator
291
184
  config.deep_merge( runtime_config )
292
185
  end
293
186
 
294
-
187
+
295
188
  def populate_with_defaults( config_hash, defaults_hash )
296
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
297
- @reportinator.generate_progress( 'Populating project configuration with collected default values' )
298
- end
189
+ progress( 'Populating project configuration with collected default values' )
299
190
 
300
191
  @configurator_builder.populate_with_defaults( config_hash, defaults_hash )
192
+
193
+ # Every :extension value is settled the moment defaults are merged in, well before
194
+ # validation or flattening ever look at it, so nothing downstream ever has to wonder
195
+ # whether a given :extension entry is a bare String or already a FilenameExtension.
196
+ @configurator_builder.normalize_filename_extensions( config_hash )
301
197
  end
302
198
 
303
199
 
200
+ # Parameterized tests need Unity's test case and variadic macro support
304
201
  def populate_unity_config(config)
305
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
306
- @reportinator.generate_progress( 'Processing Unity configuration' )
307
- end
202
+ progress( 'Processing Unity configuration' )
308
203
 
309
- if config[:unity][:use_param_tests]
310
- config[:unity][:defines] << 'UNITY_SUPPORT_TEST_CASES'
311
- config[:unity][:defines] << 'UNITY_SUPPORT_VARIADIC_MACROS'
312
- end
313
-
314
- @loginator.lazy( Verbosity::DEBUG ) do
315
- "Unity configuration >> #{config[:unity]}"
316
- end
317
- end
204
+ # Save Unity config reference
205
+ @unity_config = config[:unity]
318
206
 
207
+ config[:unity][:defines].concat( ['UNITY_SUPPORT_TEST_CASES', 'UNITY_SUPPORT_VARIADIC_MACROS'] ) if config[:unity][:use_param_tests]
319
208
 
320
- def populate_cmock_config(config)
321
- # Save CMock config reference
322
- @cmock_config = config[:cmock]
209
+ debug { "Unity configuration >> #{config[:unity]}" }
210
+ end
323
211
 
324
- cmock = config[:cmock]
325
212
 
326
- # Do no more prep if we're not using mocks
327
- if !config[:project][:use_mocks]
328
- @loginator.lazy( Verbosity::DEBUG ) do
329
- "CMock configuration >> #{cmock}"
330
- end
331
- return
332
- end
213
+ def populate_partials_config(config)
214
+ # Save Partials config reference. Unlike Unity, CMock, and the test runner, nothing
215
+ # derives values from or into this section.
216
+ @partials_config = config[:partials]
333
217
 
334
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
335
- @reportinator.generate_progress( 'Processing CMock configuration' )
336
- end
218
+ debug { "Partials configuration >> #{config[:partials]}" }
219
+ end
337
220
 
338
- # Plugins housekeeping
339
- cmock[:plugins].map! { |plugin| plugin.to_sym() }
340
- cmock[:plugins].uniq!
341
221
 
342
- # Reformulate CMock helper path value as array of one element if it's a string in config
343
- cmock[:unity_helper_path] = [cmock[:unity_helper_path]] if cmock[:unity_helper_path].is_a?( String )
222
+ # CMock needs no preparation when mocks are off
223
+ def populate_cmock_config(config)
224
+ # Save CMock config reference
225
+ @cmock_config = config[:cmock]
344
226
 
345
- # CMock Unity helper handling
346
- cmock[:unity_helper_path].each do |path|
347
- cmock[:includes] << File.basename( path )
227
+ if config[:project][:use_mocks]
228
+ progress( 'Processing CMock configuration' )
229
+ prepare_cmock_config( config[:cmock] )
348
230
  end
349
231
 
350
- cmock[:includes].uniq!
351
-
352
- # Add mocking prefix symbol for all test compilation
353
- cmock[:defines] << "CMOCK_MOCK_PREFIX=#{cmock[:mock_prefix]}"
354
-
355
- @loginator.lazy( Verbosity::DEBUG ) do
356
- "CMock configuration >> #{cmock}"
357
- end
232
+ debug { "CMock configuration >> #{config[:cmock]}" }
358
233
  end
359
234
 
360
235
 
361
236
  def populate_test_runner_generation_config(config)
362
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
363
- @reportinator.generate_progress( 'Populating test runner generation settings' )
364
- end
365
-
366
- use_backtrace = config[:project][:use_backtrace]
237
+ progress( 'Populating test runner generation settings' )
367
238
 
368
- # Force command line argument option for any backtrace option
369
- if use_backtrace != :none
370
- if config[:test_runner][:cmdline_args] == false
371
- config[:test_runner][:cmdline_args] = true
372
- @loginator.log( "Enabled :test_runner ↳ :cmdline_args because :project ↳ :use_backtrace is enabled.", Verbosity::COMPLAIN, LogLabels::NOTICE )
373
- end
374
- end
239
+ runner = config[:test_runner]
375
240
 
376
- # Copy CMock options used by test runner generation
377
- config[:test_runner][:mock_prefix] = config[:cmock][:mock_prefix]
378
- config[:test_runner][:mock_suffix] = config[:cmock][:mock_suffix]
379
- config[:test_runner][:enforce_strict_ordering] = config[:cmock][:enforce_strict_ordering]
241
+ # Backtraces rerun test cases by name, and command line filters select them, both
242
+ # through runner command line arguments
243
+ force_cmdline_args( runner, ':project ↳ :use_backtrace is enabled' ) if config[:project][:use_backtrace] != :none
244
+ force_cmdline_args( runner, 'command line test case filters are in use' ) if test_case_filters?
380
245
 
381
- # Merge Unity options used by test runner generation
382
- config[:test_runner][:defines] += config[:unity][:defines]
383
- config[:test_runner][:use_param_tests] = config[:unity][:use_param_tests]
246
+ copy_runner_options( config, runner )
384
247
 
385
- @runner_config = config[:test_runner]
248
+ @runner_config = runner
386
249
 
387
- @loginator.lazy( Verbosity::DEBUG ) do
388
- "Test Runner configuration >> #{config[:test_runner]}"
389
- end
250
+ debug { "Test Runner configuration >> #{runner}" }
390
251
  end
391
252
 
392
253
 
393
254
  def populate_exceptions_config(config)
394
255
  # Automagically set exception handling if CMock is configured for it
395
256
  if config[:cmock][:plugins] && config[:cmock][:plugins].include?(:cexception)
396
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
397
- @reportinator.generate_progress( 'Enabling CException use based on CMock plugins settings' )
398
- end
257
+ progress( 'Enabling CException use based on CMock plugins settings' )
399
258
 
400
259
  config[:project][:use_exceptions] = true
401
260
  end
402
261
 
403
- @loginator.lazy( Verbosity::DEBUG ) do
404
- "CException configuration >> #{config[:cexception]}"
405
- end
262
+ debug { "CException configuration >> #{config[:cexception]}" }
406
263
  end
407
264
 
408
265
 
@@ -420,120 +277,56 @@ class Configurator
420
277
  end
421
278
 
422
279
 
423
- # Process our tools
424
- # - :tools entries
425
- # - Insert missing names for
426
- # - Handle needed defaults
427
- # - Configure test runner from backtrace configuration
428
- def populate_tools_config(config)
429
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
430
- @reportinator.generate_progress( 'Populating tool definition settings and expanding any string replacements' )
431
- end
280
+ def get_unity_config
281
+ # Clone for the same reason as get_runner_config/get_cmock_config above.
282
+ return @unity_config.clone
283
+ end
432
284
 
433
- config[:tools].each_key do |name|
434
- tool = config[:tools][name]
435
285
 
436
- if not tool.is_a?(Hash)
437
- raise CeedlingException.new( "Expected configuration for tool :#{name} is a Hash but found #{tool.class}" )
438
- end
286
+ def get_partials_config
287
+ # Clone for the same reason as get_runner_config/get_cmock_config above.
288
+ return @partials_config.clone
289
+ end
439
290
 
440
- # Populate name if not given
441
- ToolExecutor.default_name!( tool, name.to_s )
442
291
 
443
- # Populate $stderr redirect option
444
- tool[:stderr_redirect] = StdErrRedirect::NONE if (tool[:stderr_redirect].nil?)
292
+ # Fills in each tool's missing name, $stderr redirect, and optional flag
293
+ def populate_tools_config(config)
294
+ progress( 'Populating tool definition settings and expanding any string replacements' )
445
295
 
446
- # Populate optional option to control verification of executable in search paths
447
- tool[:optional] = false if (tool[:optional].nil?)
448
- end
296
+ config[:tools].each { |name, tool| populate_tool( name, tool ) }
449
297
  end
450
298
 
451
299
 
452
- # Process any tool definition shortcuts
453
- # - Append extra arguments
454
- # - Redefine executable
300
+ # A tool definition shortcut, :tools_<name>, may redefine the tool's executable and add
301
+ # arguments to it
455
302
  #
456
303
  # :tools_<name>
457
304
  # :arguments: [...]
458
305
  # :executable: '...'
459
306
  def populate_tools_shortcuts(config)
460
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
461
- @reportinator.generate_progress( 'Processing tool definition shortcuts' )
462
- end
307
+ progress( 'Processing tool definition shortcuts' )
463
308
 
464
- prefix = 'tools_'
465
309
  config[:tools].each do |name, tool|
466
- # Lookup shortcut tool definition (:tools_<name>)
467
- shortcut = (prefix + name.to_s).to_sym
468
-
469
- # Try to lookup the executable from user config
470
- executable, _ = @config_walkinator.fetch_value(shortcut, :executable,
471
- hash:config
472
- )
473
-
474
- # Try to lookup arguments from user config
475
- args_to_add, _ = @config_walkinator.fetch_value(shortcut, :arguments,
476
- hash:config,
477
- default: []
478
- )
479
-
480
- # Redefine the tool config
481
- if !executable.nil?
482
- tool[:executable] = executable
483
- end
484
-
485
- # Add to the tool config
486
- if !args_to_add.empty?
487
- tool[:arguments].concat( args_to_add )
488
- end
310
+ executable, arguments = tool_shortcut( config, name )
311
+ next if executable.nil? and arguments.empty?
489
312
 
490
- # Log
491
- if !args_to_add.empty? or !executable.nil?
492
- @loginator.lazy( Verbosity::DEBUG ) do
493
- msg = " > #{name}\n"
313
+ tool[:executable] = executable unless executable.nil?
314
+ tool[:arguments].concat( arguments )
494
315
 
495
- if !executable.nil?
496
- msg += " executable: \"#{executable}\"\n"
497
- end
498
-
499
- if !args_to_add.empty?
500
- msg += " arguments: " + args_to_add.map{|arg| "\"#{arg}\""}.join( ', ' ) + "\n"
501
- end
502
-
503
- msg
504
- end
505
- end
316
+ debug { shortcut_message( name, executable, arguments ) }
506
317
  end
507
318
  end
508
319
 
509
320
 
510
321
  def discover_plugins(paths_hash, config)
511
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
512
- @reportinator.generate_progress( 'Discovering all plugins' )
513
- end
514
-
515
- # Rake-based plugins
516
- @rake_plugins = @configurator_plugins.find_rake_plugins( config, paths_hash )
517
- if !@configurator_plugins.rake_plugins.empty?
518
- @loginator.lazy( Verbosity::DEBUG ) do
519
- " > Rake plugins: " + @configurator_plugins.rake_plugins.map{|p| p[:plugin]}.join( ', ' )
520
- end
521
- end
322
+ progress( 'Discovering all plugins' )
522
323
 
523
- # Ruby `Plugin` subclass programmatic plugins
324
+ @rake_plugins = @configurator_plugins.find_rake_plugins( config, paths_hash )
524
325
  @programmatic_plugins = @configurator_plugins.find_programmatic_plugins( config, paths_hash )
525
- if !@configurator_plugins.programmatic_plugins.empty?
526
- @loginator.lazy( Verbosity::DEBUG ) do
527
- " > Programmatic plugins: " + @configurator_plugins.programmatic_plugins.map{|p| p[:plugin]}.join( ', ' )
528
- end
529
- end
530
-
531
- # Config plugins
532
- @configurator_plugins.find_config_plugins( config, paths_hash )
533
- if !@configurator_plugins.config_plugins.empty?
534
- @loginator.lazy( Verbosity::DEBUG ) do
535
- " > Config plugins: " + @configurator_plugins.config_plugins.map{|p| p[:plugin]}.join( ', ' )
536
- end
326
+ config_plugins = @configurator_plugins.find_config_plugins( config, paths_hash )
327
+
328
+ { 'Rake' => @rake_plugins, 'Programmatic' => @programmatic_plugins, 'Config' => config_plugins }.each do |kind, plugins|
329
+ debug { " > #{kind} plugins: " + plugins.map { |plugin| plugin[:plugin] }.join( ', ' ) } unless plugins.empty?
537
330
  end
538
331
  end
539
332
 
@@ -547,82 +340,27 @@ class Configurator
547
340
  end
548
341
 
549
342
 
343
+ # A plugin's configuration merges into the project's like a project file
550
344
  def merge_config_plugins(config)
551
- return if @configurator_plugins.config_plugins.empty?
552
-
553
- # Merge plugin configuration values (like Ceedling project file)
554
- @configurator_plugins.config_plugins.each do |hash|
555
- _config = begin
556
- @yaml_wrapper.load( hash[:path] )
557
- rescue YamlLoadException => e
558
- raise YamlLoadException.new(
559
- reason: e.reason, source: e.source, original_error: e.original_error,
560
- message: "Could not load configuration from plugin '#{hash[:plugin]}' ⏩️ #{e.message}"
561
- )
562
- end
345
+ @configurator_plugins.config_plugins.each do |plugin|
346
+ plugin_config = load_plugin_yaml( plugin[:path], "Could not load configuration from plugin '#{plugin[:plugin]}'" )
563
347
 
564
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
565
- @reportinator.generate_progress( "Merging configuration from plugin #{hash[:plugin]}" )
566
- end
567
- @loginator.lazy( Verbosity::DEBUG ) do
568
- _config.to_s
569
- end
570
-
571
- # Special handling for plugin paths
572
- if (_config.include?( :paths ))
573
- _config[:paths].update( _config[:paths] ) do |k,v|
574
- plugin_path = hash[:path].match( /(.*)[\/]config[\/]\w+\.yml/ )[1]
575
- v.map {|vv| File.expand_path( vv.gsub!( /\$PLUGIN_PATH/, plugin_path) ) }
576
- end
577
- end
348
+ progress( "Merging configuration from plugin #{plugin[:plugin]}" )
349
+ debug { plugin_config.to_s }
578
350
 
579
- config.deep_merge( _config )
351
+ resolve_plugin_paths( plugin_config, plugin[:path] )
352
+ config.deep_merge( plugin_config )
580
353
  end
581
354
  end
582
355
 
583
356
 
584
- # Process environment variables set in configuration file
585
- # (Each entry within the :environment array is a hash)
357
+ # Each :environment entry is a single-pair hash: a variable name and its value
586
358
  def eval_environment_variables(config)
587
359
  return if config[:environment].nil?
588
360
 
589
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
590
- @reportinator.generate_progress( 'Processing environment variables' )
591
- end
592
-
593
- config[:environment].each do |hash|
594
- key = hash.keys[0] # Get first (should be only) environment variable entry
595
- value = hash[key] # Get associated value
596
- items = []
597
-
598
- # Special case handling for :path environment variable entry
599
- # File::PATH_SEPARATOR => ':' (Unix-ish) or ';' (Windows)
600
- interstitial = ((key == :path) ? File::PATH_SEPARATOR : ' ')
601
-
602
- # Create an array container for the value of this entry
603
- # - If the value is an array, get it
604
- # - Otherwise, place value in a single item array
605
- items = ((value.class == Array) ? hash[key] : [value])
606
-
607
- # Process value array
608
- items.each do |item|
609
- # Process each item for Ruby string replacement
610
- if item.is_a? String
611
- item.replace( @ruby_expandinator.expand( item, source: ":environment ↳ #{key}" ) )
612
- end
613
- end
361
+ progress( 'Processing environment variables' )
614
362
 
615
- # Join any value items (become a flattened string)
616
- # - With path separator if the key was :path
617
- # - With space otherwise
618
- hash[key] = items.join( interstitial )
619
-
620
- # Set the environment variable for our session
621
- @system_wrapper.env_set( key.to_s.upcase, hash[key] )
622
- @loginator.lazy( Verbosity::DEBUG ) do
623
- " - #{key.to_s.upcase}: \"#{hash[key]}\""
624
- end
625
- end
363
+ config[:environment].each { |entry| eval_environment_variable( entry ) }
626
364
  end
627
365
 
628
366
 
@@ -630,24 +368,12 @@ class Configurator
630
368
  def eval_paths(config)
631
369
  # :plugins ↳ :load_paths already handled
632
370
 
633
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
634
- @reportinator.generate_progress( 'Processing path entries and expanding any string replacements' )
635
- end
371
+ progress( 'Processing path entries and expanding any string replacements' )
636
372
 
637
373
  eval_path_entries( config[:project][:build_root], source: ":project ↳ :build_root" )
638
374
  eval_path_entries( config[:release_build][:artifacts], source: ":release_build ↳ :artifacts" )
639
375
 
640
- config[:paths].each_pair do |entry, paths|
641
- # :paths sub-entries (e.g. :test) could be a single string -> make array
642
- reform_path_entries_as_lists( config[:paths], entry, paths )
643
- eval_path_entries( paths, source: ":paths ↳ #{entry}" )
644
- end
645
-
646
- config[:files].each_pair do |entry, files|
647
- # :files sub-entries (e.g. :test) could be a single string -> make array
648
- reform_path_entries_as_lists( config[:files], entry, files )
649
- eval_path_entries( files, source: ":files ↳ #{entry}" )
650
- end
376
+ [:paths, :files].each { |section| eval_path_section( config, section ) }
651
377
 
652
378
  # All other paths at secondary hash key level processed by convention (`_path`):
653
379
  # ex. :toplevel ↳ :foo_path & :toplevel ↳ :bar_paths are evaluated
@@ -657,9 +383,7 @@ class Configurator
657
383
 
658
384
  # Handle any Ruby string replacement for :flags string arrays
659
385
  def eval_flags(config)
660
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
661
- @reportinator.generate_progress( 'Expanding any string replacements in :flags entries' )
662
- end
386
+ progress( 'Expanding any string replacements in :flags entries' )
663
387
 
664
388
  # Descend down to array of command line flags strings regardless of depth in config block
665
389
  traverse_hash_eval_string_arrays( config[:flags], source: ":flags" )
@@ -668,9 +392,7 @@ class Configurator
668
392
 
669
393
  # Handle any Ruby string replacement for :defines string arrays
670
394
  def eval_defines(config)
671
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
672
- @reportinator.generate_progress( 'Expanding any string replacements in :defines entries' )
673
- end
395
+ progress( 'Expanding any string replacements in :defines entries' )
674
396
 
675
397
  # Descend down to array of #define strings regardless of depth in config block
676
398
  traverse_hash_eval_string_arrays( config[:defines], source: ":defines" )
@@ -678,93 +400,27 @@ class Configurator
678
400
 
679
401
 
680
402
  def standardize_paths(config)
681
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
682
- @reportinator.generate_progress( 'Standardizing all paths' )
683
- end
403
+ progress( 'Standardizing all paths' )
684
404
 
685
- # :project ↳ :build_root and :release_build ↳ :artifacts are individual paths
686
- # that don't follow the _path/_paths key convention — handle them explicitly.
687
- # :release_build may be absent in minimal configs; guard prevents NoMethodError.
688
- paths = [config[:project][:build_root]]
689
- if config[:release_build]
690
- paths << config[:release_build][:artifacts]
691
- else
692
- @loginator.log(
693
- ":release_build section absent from config ➡️ skipping :artifacts path standardization.",
694
- Verbosity::COMPLAIN,
695
- LogLabels::NOTICE
696
- )
697
- end
405
+ standalone_paths( config ).flatten.each { |path| FilePathUtils::standardize_in_place( path ) }
698
406
 
699
- paths.flatten.each { |path| FilePathUtils::standardize_in_place( path ) }
700
-
701
- config[:paths].each_pair do |collection, paths|
702
- # Flatten to handle single strings or nested arrays; reject nils (non-String passthrough
703
- # from standardize) and empty strings left after stripping whitespace-only entries.
704
- config[:paths][collection] = [paths].flatten
705
- .map { |path| FilePathUtils::standardize_in_place( path ) }
706
- .reject { |path| path.nil? || (path.is_a?( String ) && path.empty?) }
707
- end
708
-
709
- config[:files].each_pair do |collection, files|
710
- # Same sanitization as :paths — replace array to remove any nil or empty entries
711
- # produced by standardize on non-String or whitespace-only values.
712
- config[:files][collection] = [files].flatten
713
- .map { |path| FilePathUtils::standardize_in_place( path ) }
714
- .reject { |path| path.nil? || (path.is_a?( String ) && path.empty?) }
715
- end
407
+ [:paths, :files].each { |section| standardize_path_section( config[section] ) }
716
408
 
717
- config[:tools].each_pair { |_, config| FilePathUtils::standardize_in_place( config[:executable] ) if (config.include? :executable) }
409
+ config[:tools].each_value { |tool| FilePathUtils::standardize_in_place( tool[:executable] ) if tool.include?( :executable ) }
718
410
 
719
- # All other paths at secondary hash key level processed by convention (`_path`):
720
- # ex. :toplevel ↳ :foo_path & :toplevel ↳ :bar_paths are standardized
721
- config.each_pair do |_, child|
722
- collect_path_list( child ).each { |path| FilePathUtils::standardize_in_place( path ) }
723
- end
411
+ standardize_convention_paths( config )
724
412
  end
725
413
 
726
414
 
415
+ # Every validation runs, so every problem is reported, before configuration fails
727
416
  def validate_essential(config)
728
- # Collect all infractions, everybody on probation until final adjudication
729
- blotter = true
730
-
731
- blotter &= @configurator_setup.validate_required_sections( config )
732
- blotter &= @configurator_setup.validate_required_section_values( config )
733
-
734
- # Configuration sections can reference environment variables that are evaluated early on.
735
- # So, we validate :environment early as an essential section.
736
- blotter &= @configurator_setup.validate_environment_vars( config )
737
-
738
- if !blotter
739
- raise CeedlingException.new("Ceedling configuration failed validation")
740
- end
417
+ fail_unless_valid( ESSENTIAL_VALIDATIONS.map { |validation| @configurator_setup.public_send( validation, config ) } )
741
418
  end
742
419
 
743
420
 
744
- def validate_final(config, app_cfg)
745
- # Collect all infractions, everybody on probation until final adjudication
746
- blotter = true
747
- blotter &= @configurator_setup.validate_paths( config )
748
- blotter &= @configurator_setup.validate_tools( config )
749
- blotter &= @configurator_setup.validate_test_runner_generation(
750
- config,
751
- app_cfg[:include_test_case],
752
- app_cfg[:exclude_test_case]
753
- )
754
- blotter &= @configurator_setup.validate_defines( config )
755
- blotter &= @configurator_setup.validate_flags( config )
756
- blotter &= @configurator_setup.validate_test_preprocessor( config )
757
- blotter &= @configurator_setup.validate_backtrace( config )
758
- blotter &= @configurator_setup.validate_threads( config )
759
- blotter &= @configurator_setup.validate_partials( config )
760
- blotter &= @configurator_setup.validate_plugins( config )
761
-
762
- # Informational notices
763
- @configurator_setup.warnings_for_problematic_configs( config )
764
-
765
- if !blotter
766
- raise CeedlingException.new( "Ceedling configuration failed validation" )
767
- end
421
+ # Every validation runs, so every problem is reported, before configuration fails
422
+ def validate_final(config)
423
+ fail_unless_valid( FINAL_VALIDATIONS.map { |validation| @configurator_setup.public_send( validation, config ) } )
768
424
  end
769
425
 
770
426
 
@@ -773,29 +429,24 @@ class Configurator
773
429
  flattened_config = @configurator_builder.flattenify( config )
774
430
 
775
431
  @configurator_setup.build_project_config( ceedling_lib_path, logging_path, flattened_config )
776
-
777
432
  @configurator_setup.build_directory_structure( flattened_config )
778
433
 
779
434
  # Copy Unity, CMock, CException into vendor directory within build directory
780
- @configurator_setup.vendor_frameworks_and_support_files( ceedling_lib_path, flattened_config )
781
-
435
+ @configurator_setup.vendor_frameworks_and_support_files(
436
+ ceedling_lib_path, flattened_config, test_build: @test_build_tasks == true, release_build: @release_build_tasks == true
437
+ )
782
438
  @configurator_setup.build_project_collections( flattened_config )
783
439
 
784
440
  @project_config_hash = flattened_config.clone
785
-
786
- @configurator_setup.build_constants_and_accessors( flattened_config, binding() )
441
+ @configurator_setup.build_constants_and_accessors( flattened_config, self )
787
442
 
788
443
  # Top-level keys disappear when we flatten, so create global constants & accessors to any specified keys
789
- keys.each do |key|
790
- hash = { key => config[key] }
791
- @configurator_setup.build_constants_and_accessors( hash, binding() )
792
- end
444
+ build_section_constants( config, keys )
793
445
  end
794
446
 
795
447
 
796
448
  def redefine_element(elem, value)
797
- # Ensure elem is a symbol
798
- elem = elem.to_sym if elem.class != Symbol
449
+ elem = elem.to_sym
799
450
 
800
451
  # Ensure element already exists
801
452
  if not @project_config_hash.include?(elem)
@@ -823,21 +474,16 @@ class Configurator
823
474
  @project_config_hash.deep_merge!( config_more_flattened )
824
475
 
825
476
  # create more constants and accessors
826
- @configurator_setup.build_constants_and_accessors(config_more_flattened, binding())
477
+ @configurator_setup.build_constants_and_accessors(config_more_flattened, self)
827
478
 
828
479
  # recreate constants & update accessors with new merged, base values
829
- config_more.keys.each do |key|
830
- hash = { key => config_base[key] }
831
- @configurator_setup.build_constants_and_accessors(hash, binding())
832
- end
480
+ build_section_constants( config_base, config_more.keys )
833
481
  end
834
482
 
835
483
 
836
484
  def insert_rake_plugins(plugins)
837
485
  plugins.each do |hash|
838
- @loginator.lazy( Verbosity::OBNOXIOUS ) do
839
- @reportinator.generate_progress( "Adding plugin #{hash[:plugin]} to Rake load list" )
840
- end
486
+ progress( "Adding plugin #{hash[:plugin]} to Rake load list" )
841
487
 
842
488
  @project_config_hash[:project_rakefile_component_files] << hash[:path]
843
489
  end
@@ -847,36 +493,230 @@ class Configurator
847
493
 
848
494
  private
849
495
 
850
- def reform_path_entries_as_lists( container, entry, value )
851
- container[entry] = [value] if value.kind_of?( String )
496
+ def progress(message)
497
+ @loginator.lazy( Verbosity::OBNOXIOUS ) { @reportinator.generate_progress( message ) }
852
498
  end
853
499
 
500
+ def debug(&message)
501
+ @loginator.lazy( Verbosity::DEBUG, &message )
502
+ end
854
503
 
855
- def collect_path_list( container )
856
- paths = []
504
+ def fail_unless_valid(results)
505
+ raise CeedlingException.new( "Ceedling configuration failed validation" ) unless results.all?
506
+ end
857
507
 
858
- if (container.class == Hash)
859
- container.each_key do |key|
860
- paths << container[key] if (key.to_s =~ /_path(s)?$/)
861
- end
508
+ def log_notice(message)
509
+ @loginator.log( message, Verbosity::COMPLAIN, LogLabels::NOTICE )
510
+ end
511
+
512
+ # Probes the configured C preprocessor with the Unity header, which is always available,
513
+ # self-contained, and needs no include paths
514
+ def directives_only_supported?(config, tool_executor)
515
+ probe_tool = {
516
+ executable: config[:tools][:test_file_directives_only_preprocessor][:executable],
517
+ name: 'directives_only_probe',
518
+ arguments: DIRECTIVES_ONLY_PROBE_ARGUMENTS
519
+ }
520
+ command = tool_executor.build_command_line( probe_tool, [], File.join( CEEDLING_VENDOR, UNITY_LIB_PATH, UNITY_H_FILE ) )
521
+
522
+ # A failed probe means no support, so it must not raise
523
+ command[:options][:boom] = false
524
+ results = tool_executor.exec( command )
525
+
526
+ # Clang and some older GCC emit a warning (not an error) when -fdirectives-only is unsupported
527
+ return !(results[:output].match?( /warning[^\n]+-fdirectives-only/ ) || tool_executor.failed?( results ))
528
+ end
529
+
530
+ # config[:project] is guaranteed to exist / validated to exist but may not include the
531
+ # settings read here. config[:test_build] and config[:release_build] are optional.
532
+ def needed_tools_defaults(config)
533
+ release = setting( config, :project, :release_build )
534
+
535
+ return [
536
+ [DEFAULT_TOOLS_TEST, true],
537
+ [DEFAULT_TOOLS_TEST_PREPROCESSORS, setting( config, :project, :use_test_preprocessor ) != :none],
538
+ [DEFAULT_TOOLS_TEST_ASSEMBLER, setting( config, :test_build, :use_assembly )],
539
+ [DEFAULT_TOOLS_TEST_GDB_BACKTRACE, setting( config, :project, :use_backtrace ) == :gdb],
540
+ [DEFAULT_TOOLS_RELEASE, release],
541
+ [DEFAULT_TOOLS_RELEASE_ASSEMBLER, release && setting( config, :release_build, :use_assembly )]
542
+ ].select { |_, needed| needed }.map( &:first )
543
+ end
544
+
545
+ # A setting from the configuration, or Ceedling's default when the configuration lacks it
546
+ def setting(config, *keys)
547
+ value, _ = @config_walkinator.fetch_value( *keys, hash:config, default: DEFAULT_CEEDLING_PROJECT_CONFIG.dig( *keys ) )
548
+ return value
549
+ end
550
+
551
+ # Loads a plugin's YAML, naming the plugin in any failure
552
+ def load_plugin_yaml(path, failure)
553
+ return @yaml_wrapper.load( path )
554
+ rescue YamlLoadException => e
555
+ raise YamlLoadException.new(
556
+ reason: e.reason, source: e.source, original_error: e.original_error,
557
+ message: "#{failure} ⏩️ #{e.message}"
558
+ )
559
+ end
560
+
561
+ def merge_plugin_defaults(kind, defaults_by_plugin, default_config)
562
+ return if defaults_by_plugin.empty?
563
+
564
+ progress( "Collecting Plugin #{kind} defaults" )
565
+
566
+ defaults_by_plugin.each do |plugin, defaults|
567
+ debug { " - #{plugin} >> #{defaults}" }
568
+ default_config.deep_merge( defaults )
862
569
  end
863
-
864
- return paths.flatten()
865
570
  end
866
571
 
572
+ def prepare_cmock_config(cmock)
573
+ # Plugins housekeeping
574
+ cmock[:plugins].map! { |plugin| plugin.to_sym() }.uniq!
867
575
 
868
- def eval_path_entries( container, source: )
869
- paths = []
576
+ include_unity_helpers( cmock )
870
577
 
871
- case(container)
872
- when Array then paths = Array.new( container ).flatten()
873
- when String then paths << container
874
- else
875
- return
578
+ # Add mocking prefix symbol for all test compilation
579
+ cmock[:defines] << "CMOCK_MOCK_PREFIX=#{cmock[:mock_prefix]}"
580
+ end
581
+
582
+ # A Unity helper path may be a single string. Each helper's header is included in every mock.
583
+ def include_unity_helpers(cmock)
584
+ cmock[:unity_helper_path] = [cmock[:unity_helper_path]] if cmock[:unity_helper_path].is_a?( String )
585
+ cmock[:includes].concat( cmock[:unity_helper_path].map { |path| File.basename( path ) } ).uniq!
586
+ end
587
+
588
+ def copy_runner_options(config, runner)
589
+ RUNNER_CMOCK_OPTIONS.each { |option| runner[option] = config[:cmock][option] }
590
+ RUNNER_UNITY_OPTIONS.each { |option| runner[option] = config[:unity][option] }
591
+ runner[:defines] += config[:unity][:defines]
592
+ end
593
+
594
+ def force_cmdline_args(runner, reason)
595
+ return unless runner[:cmdline_args] == false
596
+
597
+ runner[:cmdline_args] = true
598
+ log_notice( "Enabled :test_runner ↳ :cmdline_args because #{reason}." )
599
+ end
600
+
601
+ def test_case_filters?
602
+ return !(@include_test_case.to_s.empty? && @exclude_test_case.to_s.empty?)
603
+ end
604
+
605
+ def populate_tool(name, tool)
606
+ raise CeedlingException.new( "Expected configuration for tool :#{name} is a Hash but found #{tool.class}" ) unless tool.is_a?( Hash )
607
+
608
+ # Populate name if not given
609
+ ToolExecutor.default_name!( tool, name.to_s )
610
+
611
+ # Populate $stderr redirect option
612
+ tool[:stderr_redirect] = StdErrRedirect::NONE if (tool[:stderr_redirect].nil?)
613
+
614
+ # Populate optional option to control verification of executable in search paths
615
+ tool[:optional] = false if (tool[:optional].nil?)
616
+ end
617
+
618
+ # The executable and arguments a tool's :tools_<name> shortcut gives, if any
619
+ def tool_shortcut(config, name)
620
+ shortcut = :"tools_#{name}"
621
+
622
+ executable, _ = @config_walkinator.fetch_value( shortcut, :executable, hash:config )
623
+ arguments, _ = @config_walkinator.fetch_value( shortcut, :arguments, hash:config, default: [] )
624
+
625
+ return executable, arguments
626
+ end
627
+
628
+ def shortcut_message(name, executable, arguments)
629
+ message = " > #{name}\n"
630
+ message += " executable: \"#{executable}\"\n" unless executable.nil?
631
+ message += " arguments: " + arguments.map { |arg| "\"#{arg}\"" }.join( ', ' ) + "\n" unless arguments.empty?
632
+ return message
633
+ end
634
+
635
+ # A plugin's :paths entries are expanded. $PLUGIN_PATH in one names the plugin's own directory.
636
+ def resolve_plugin_paths(plugin_config, plugin_config_path)
637
+ return unless plugin_config.include?( :paths )
638
+
639
+ plugin_path = plugin_config_path.match( /(.*)[\/]config[\/]\w+\.yml/ )[1]
640
+ plugin_config[:paths].transform_values! do |paths|
641
+ paths.map { |path| File.expand_path( path.gsub( /\$PLUGIN_PATH/, plugin_path ) ) }
876
642
  end
643
+ end
644
+
645
+ # The value, a string or list of strings, is expanded and joined into one string. A PATH
646
+ # list, however its name is written, joins with the platform path separator, ':' or ';',
647
+ # and any other list with spaces. The variable is set in the environment by its name upcased.
648
+ def eval_environment_variable(entry)
649
+ name, value = entry.first
650
+ items = expand_environment_items( name, value.is_a?( Array ) ? value : [value] )
651
+ entry[name] = items.join( name.to_s.casecmp?( 'path' ) ? File::PATH_SEPARATOR : ' ' )
652
+
653
+ @system_wrapper.env_set( name.to_s.upcase, entry[name] )
654
+ debug { " - #{name.to_s.upcase}: \"#{entry[name]}\"" }
655
+ end
877
656
 
657
+ def expand_environment_items(name, items)
658
+ items.each { |item| item.replace( @ruby_expandinator.expand( item, source: ":environment ↳ #{name}" ) ) if item.is_a?( String ) }
659
+ end
660
+
661
+ def eval_path_section(config, section)
662
+ config[section].each_pair do |entry, paths|
663
+ # Sub-entries (e.g. :test) could be a single string -> make array
664
+ reform_path_entries_as_lists( config[section], entry, paths )
665
+ eval_path_entries( paths, source: ":#{section} ↳ #{entry}" )
666
+ end
667
+ end
668
+
669
+ # :project ↳ :build_root and :release_build ↳ :artifacts are individual paths that don't
670
+ # follow the _path/_paths key convention. :release_build may be absent in minimal configs.
671
+ def standalone_paths(config)
672
+ return [ config[:project][:build_root], config[:release_build][:artifacts] ] if config[:release_build]
673
+
674
+ log_notice( ":release_build section absent from config ➡️ skipping :artifacts path standardization." )
675
+ return [ config[:project][:build_root] ]
676
+ end
677
+
678
+ # Each entry becomes a list, without the nil or empty entries standardizing leaves of a
679
+ # non-String or whitespace-only value
680
+ def standardize_path_section(section)
681
+ section.transform_values! do |paths|
682
+ [paths].flatten
683
+ .map { |path| FilePathUtils::standardize_in_place( path ) }
684
+ .reject { |path| path.nil? || (path.is_a?( String ) && path.empty?) }
685
+ end
686
+ end
687
+
688
+ # All other paths at secondary hash key level processed by convention (`_path`):
689
+ # ex. :toplevel ↳ :foo_path & :toplevel ↳ :bar_paths are standardized
690
+ def standardize_convention_paths(config)
691
+ config.each_value { |child| collect_path_list( child ).each { |path| FilePathUtils::standardize_in_place( path ) } }
692
+ end
693
+
694
+ def build_section_constants(config, keys)
695
+ keys.each { |key| @configurator_setup.build_constants_and_accessors( { key => config[key] }, self ) }
696
+ end
697
+
698
+ def reform_path_entries_as_lists( container, entry, value )
699
+ container[entry] = [value] if value.is_a?( String )
700
+ end
701
+
702
+
703
+ def collect_path_list( container )
704
+ return [] unless container.is_a?( Hash )
705
+
706
+ return container.select { |key, _| key.to_s =~ /_path(s)?$/ }.values.flatten
707
+ end
708
+
709
+
710
+ def eval_path_entries( container, source: )
711
+ paths = case container
712
+ when Array then container.flatten
713
+ when String then [container]
714
+ else []
715
+ end
716
+
717
+ # An unset path setting has nothing to expand
878
718
  paths.each do |path|
879
- path.replace( @ruby_expandinator.expand( path, source: source ) )
719
+ path.replace( @ruby_expandinator.expand( path, source: source ) ) if path.is_a?( String )
880
720
  end
881
721
  end
882
722
 
@@ -902,4 +742,3 @@ class Configurator
902
742
  end
903
743
 
904
744
  end
905
-