hybrid_platforms_conductor 32.17.0 → 33.0.2

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 (283) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +36 -0
  3. data/README.md +6 -3
  4. data/bin/check-node +0 -1
  5. data/bin/deploy +0 -1
  6. data/bin/get_impacted_nodes +0 -1
  7. data/bin/last_deploys +12 -8
  8. data/bin/nodes_to_deploy +6 -6
  9. data/bin/setup +6 -6
  10. data/bin/topograph +1 -1
  11. data/docs/config_dsl.md +45 -1
  12. data/docs/executables.md +6 -7
  13. data/docs/executables/check-node.md +3 -3
  14. data/docs/executables/deploy.md +3 -3
  15. data/docs/executables/dump_nodes_json.md +3 -3
  16. data/docs/executables/test.md +3 -3
  17. data/docs/executables/topograph.md +3 -3
  18. data/docs/gen/mermaid/README.md-0.png +0 -0
  19. data/docs/gen/mermaid/docs/executables/check-node.md-0.png +0 -0
  20. data/docs/gen/mermaid/docs/executables/deploy.md-0.png +0 -0
  21. data/docs/gen/mermaid/docs/executables/free_ips.md-0.png +0 -0
  22. data/docs/gen/mermaid/docs/executables/get_impacted_nodes.md-0.png +0 -0
  23. data/docs/gen/mermaid/docs/executables/last_deploys.md-0.png +0 -0
  24. data/docs/gen/mermaid/docs/executables/nodes_to_deploy.md-0.png +0 -0
  25. data/docs/gen/mermaid/docs/executables/report.md-0.png +0 -0
  26. data/docs/gen/mermaid/docs/executables/run.md-0.png +0 -0
  27. data/docs/gen/mermaid/docs/executables/ssh_config.md-0.png +0 -0
  28. data/docs/gen/mermaid/docs/executables/test.md-0.png +0 -0
  29. data/docs/plugins.md +46 -0
  30. data/docs/plugins/connector/ssh.md +1 -1
  31. data/docs/plugins/log/remote_fs.md +26 -0
  32. data/docs/plugins/secrets_reader/cli.md +31 -0
  33. data/docs/plugins/secrets_reader/thycotic.md +46 -0
  34. data/docs/plugins/test/check_deploy_and_idempotence.md +1 -1
  35. data/docs/plugins/test/connection.md +1 -0
  36. data/docs/plugins/test/deploy_removes_root_access.md +1 -1
  37. data/docs/plugins/test/file_system.md +1 -0
  38. data/docs/plugins/test/hostname.md +1 -0
  39. data/docs/plugins/test/ip.md +1 -0
  40. data/docs/plugins/test/local_users.md +1 -0
  41. data/docs/plugins/test/mounts.md +1 -0
  42. data/docs/plugins/test/orphan_files.md +1 -0
  43. data/docs/plugins/test/ports.md +1 -0
  44. data/docs/plugins/test/spectre.md +1 -0
  45. data/docs/plugins/test/vulnerabilities.md +1 -0
  46. data/lib/hybrid_platforms_conductor/action.rb +4 -4
  47. data/lib/hybrid_platforms_conductor/actions_executor.rb +45 -43
  48. data/lib/hybrid_platforms_conductor/bitbucket.rb +5 -4
  49. data/lib/hybrid_platforms_conductor/cmd_runner.rb +13 -12
  50. data/lib/hybrid_platforms_conductor/cmdb.rb +2 -2
  51. data/lib/hybrid_platforms_conductor/common_config_dsl/bitbucket.rb +2 -1
  52. data/lib/hybrid_platforms_conductor/common_config_dsl/confluence.rb +2 -1
  53. data/lib/hybrid_platforms_conductor/common_config_dsl/file_system_tests.rb +5 -4
  54. data/lib/hybrid_platforms_conductor/common_config_dsl/github.rb +4 -3
  55. data/lib/hybrid_platforms_conductor/common_config_dsl/idempotence_tests.rb +2 -2
  56. data/lib/hybrid_platforms_conductor/config.rb +8 -4
  57. data/lib/hybrid_platforms_conductor/confluence.rb +1 -1
  58. data/lib/hybrid_platforms_conductor/connector.rb +5 -2
  59. data/lib/hybrid_platforms_conductor/core_extensions/cleanroom/fix_kwargs.rb +116 -0
  60. data/lib/hybrid_platforms_conductor/core_extensions/symbol/zero.rb +24 -0
  61. data/lib/hybrid_platforms_conductor/credentials.rb +39 -36
  62. data/lib/hybrid_platforms_conductor/current_dir_monitor.rb +4 -1
  63. data/lib/hybrid_platforms_conductor/deployer.rb +275 -224
  64. data/lib/hybrid_platforms_conductor/executable.rb +20 -15
  65. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/config.rb +10 -7
  66. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/host_ip.rb +1 -1
  67. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/host_keys.rb +2 -2
  68. data/lib/hybrid_platforms_conductor/hpc_plugins/cmdb/platform_handlers.rb +4 -4
  69. data/lib/hybrid_platforms_conductor/hpc_plugins/connector/local.rb +2 -0
  70. data/lib/hybrid_platforms_conductor/hpc_plugins/connector/ssh.rb +45 -49
  71. data/lib/hybrid_platforms_conductor/hpc_plugins/log/my_log_plugin.rb.sample +100 -0
  72. data/lib/hybrid_platforms_conductor/hpc_plugins/log/remote_fs.rb +180 -0
  73. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef.rb +68 -66
  74. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef/dsl_parser.rb +13 -0
  75. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/serverless_chef/recipes_tree_builder.rb +39 -38
  76. data/lib/hybrid_platforms_conductor/hpc_plugins/platform_handler/yaml_inventory.rb +5 -4
  77. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/docker.rb +43 -45
  78. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/podman.rb +18 -20
  79. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox.rb +118 -117
  80. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox/proxmox_waiter.rb +39 -43
  81. data/lib/hybrid_platforms_conductor/hpc_plugins/provisioner/proxmox/reserve_proxmox_container +9 -13
  82. data/lib/hybrid_platforms_conductor/hpc_plugins/report/confluence.rb +2 -2
  83. data/lib/hybrid_platforms_conductor/hpc_plugins/report/mediawiki.rb +28 -21
  84. data/lib/hybrid_platforms_conductor/hpc_plugins/report/stdout.rb +26 -22
  85. data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/cli.rb +77 -0
  86. data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/my_secrets_reader_plugin.rb.sample +46 -0
  87. data/lib/hybrid_platforms_conductor/hpc_plugins/secrets_reader/thycotic.rb +90 -0
  88. data/lib/hybrid_platforms_conductor/hpc_plugins/test/bitbucket_conf.rb +3 -3
  89. data/lib/hybrid_platforms_conductor/hpc_plugins/test/check_deploy_and_idempotence.rb +4 -2
  90. data/lib/hybrid_platforms_conductor/hpc_plugins/test/connection.rb +3 -1
  91. data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_freshness.rb +7 -21
  92. data/lib/hybrid_platforms_conductor/hpc_plugins/test/deploy_removes_root_access.rb +21 -19
  93. data/lib/hybrid_platforms_conductor/hpc_plugins/test/divergence.rb +2 -2
  94. data/lib/hybrid_platforms_conductor/hpc_plugins/test/executables.rb +2 -2
  95. data/lib/hybrid_platforms_conductor/hpc_plugins/test/file_system.rb +21 -22
  96. data/lib/hybrid_platforms_conductor/hpc_plugins/test/file_system_hdfs.rb +19 -21
  97. data/lib/hybrid_platforms_conductor/hpc_plugins/test/github_ci.rb +2 -3
  98. data/lib/hybrid_platforms_conductor/hpc_plugins/test/hostname.rb +3 -1
  99. data/lib/hybrid_platforms_conductor/hpc_plugins/test/idempotence.rb +2 -2
  100. data/lib/hybrid_platforms_conductor/hpc_plugins/test/ip.rb +4 -2
  101. data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_conf.rb +21 -22
  102. data/lib/hybrid_platforms_conductor/hpc_plugins/test/jenkins_ci_masters_ok.rb +10 -12
  103. data/lib/hybrid_platforms_conductor/hpc_plugins/test/linear_strategy.rb +9 -9
  104. data/lib/hybrid_platforms_conductor/hpc_plugins/test/local_users.rb +5 -3
  105. data/lib/hybrid_platforms_conductor/hpc_plugins/test/mounts.rb +5 -3
  106. data/lib/hybrid_platforms_conductor/hpc_plugins/test/orphan_files.rb +13 -10
  107. data/lib/hybrid_platforms_conductor/hpc_plugins/test/ports.rb +5 -3
  108. data/lib/hybrid_platforms_conductor/hpc_plugins/test/private_ips.rb +5 -5
  109. data/lib/hybrid_platforms_conductor/hpc_plugins/test/public_ips.rb +5 -5
  110. data/lib/hybrid_platforms_conductor/hpc_plugins/test/spectre.rb +7 -7
  111. data/lib/hybrid_platforms_conductor/hpc_plugins/test/veids.rb +3 -3
  112. data/lib/hybrid_platforms_conductor/hpc_plugins/test/vulnerabilities.rb +27 -25
  113. data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/confluence.rb +2 -2
  114. data/lib/hybrid_platforms_conductor/hpc_plugins/test_report/stdout.rb +8 -6
  115. data/lib/hybrid_platforms_conductor/io_router.rb +14 -13
  116. data/lib/hybrid_platforms_conductor/json_dumper.rb +2 -2
  117. data/lib/hybrid_platforms_conductor/log.rb +31 -0
  118. data/lib/hybrid_platforms_conductor/logger_helpers.rb +19 -16
  119. data/lib/hybrid_platforms_conductor/nodes_handler.rb +89 -71
  120. data/lib/hybrid_platforms_conductor/parallel_threads.rb +7 -11
  121. data/lib/hybrid_platforms_conductor/platform_handler.rb +7 -7
  122. data/lib/hybrid_platforms_conductor/platforms_handler.rb +5 -3
  123. data/lib/hybrid_platforms_conductor/plugin.rb +2 -2
  124. data/lib/hybrid_platforms_conductor/plugins.rb +14 -8
  125. data/lib/hybrid_platforms_conductor/provisioner.rb +4 -4
  126. data/lib/hybrid_platforms_conductor/report.rb +2 -2
  127. data/lib/hybrid_platforms_conductor/reports_handler.rb +3 -2
  128. data/lib/hybrid_platforms_conductor/secrets_reader.rb +31 -0
  129. data/lib/hybrid_platforms_conductor/services_handler.rb +32 -29
  130. data/lib/hybrid_platforms_conductor/test_only_remote_node.rb +18 -0
  131. data/lib/hybrid_platforms_conductor/test_report.rb +15 -18
  132. data/lib/hybrid_platforms_conductor/tests_runner.rb +116 -118
  133. data/lib/hybrid_platforms_conductor/thycotic.rb +28 -19
  134. data/lib/hybrid_platforms_conductor/topographer.rb +200 -190
  135. data/lib/hybrid_platforms_conductor/topographer/plugins/graphviz.rb +8 -8
  136. data/lib/hybrid_platforms_conductor/topographer/plugins/json.rb +4 -4
  137. data/lib/hybrid_platforms_conductor/version.rb +1 -1
  138. data/spec/hybrid_platforms_conductor_test.rb +33 -12
  139. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/bash_spec.rb +18 -11
  140. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/interactive_spec.rb +2 -2
  141. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/remote_bash_spec.rb +32 -21
  142. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/ruby_spec.rb +75 -49
  143. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions/scp_spec.rb +27 -15
  144. data/spec/hybrid_platforms_conductor_test/api/actions_executor/actions_spec.rb +90 -59
  145. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connection_spec.rb +46 -44
  146. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/local/connectable_nodes_spec.rb +12 -8
  147. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/local/remote_actions_spec.rb +4 -7
  148. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/cli_options_spec.rb +21 -22
  149. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/config_dsl_spec.rb +23 -24
  150. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/connectable_nodes_spec.rb +10 -6
  151. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/connections_spec.rb +106 -75
  152. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/global_helpers_spec.rb +145 -126
  153. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/node_helpers_spec.rb +3 -3
  154. data/spec/hybrid_platforms_conductor_test/api/actions_executor/connectors/ssh/remote_actions_spec.rb +29 -25
  155. data/spec/hybrid_platforms_conductor_test/api/actions_executor/logging_spec.rb +167 -142
  156. data/spec/hybrid_platforms_conductor_test/api/actions_executor/parallel_spec.rb +272 -244
  157. data/spec/hybrid_platforms_conductor_test/api/actions_executor/timeout_spec.rb +16 -16
  158. data/spec/hybrid_platforms_conductor_test/api/cmd_runner_spec.rb +36 -36
  159. data/spec/hybrid_platforms_conductor_test/api/config_spec.rb +24 -22
  160. data/spec/hybrid_platforms_conductor_test/api/deployer/check_spec.rb +4 -2
  161. data/spec/hybrid_platforms_conductor_test/api/deployer/config_dsl_spec.rb +43 -5
  162. data/spec/hybrid_platforms_conductor_test/api/deployer/deploy_spec.rb +199 -216
  163. data/spec/hybrid_platforms_conductor_test/api/deployer/log_plugins/remote_fs_spec.rb +223 -0
  164. data/spec/hybrid_platforms_conductor_test/api/deployer/parse_deploy_output_spec.rb +55 -59
  165. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioner_spec.rb +36 -62
  166. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/podman_spec.rb +17 -17
  167. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/config_dsl_spec.rb +4 -4
  168. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/create_spec.rb +44 -51
  169. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/destroy_spec.rb +3 -3
  170. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/ip_spec.rb +12 -16
  171. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/destroy_vm_spec.rb +31 -19
  172. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/expired_containers_spec.rb +324 -266
  173. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/ips_assignment_spec.rb +89 -61
  174. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/other_lxc_containers_resources_spec.rb +117 -93
  175. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/pve_node_resources_spec.rb +71 -54
  176. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/retries_spec.rb +10 -8
  177. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/reserve_proxmox_container/vm_ids_assignment_spec.rb +80 -60
  178. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/start_spec.rb +1 -1
  179. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/state_spec.rb +1 -1
  180. data/spec/hybrid_platforms_conductor_test/api/deployer/provisioners/proxmox/stop_spec.rb +1 -1
  181. data/spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/cli_spec.rb +64 -0
  182. data/spec/hybrid_platforms_conductor_test/api/deployer/secrets_reader_plugins/thycotic_spec.rb +268 -0
  183. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/config_spec.rb +8 -10
  184. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/host_ip_spec.rb +33 -24
  185. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/host_keys_spec.rb +64 -51
  186. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs/platform_handlers_spec.rb +3 -3
  187. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/cmdbs_plugins_api_spec.rb +50 -51
  188. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/common_spec.rb +91 -81
  189. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/config_dsl_spec.rb +14 -16
  190. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/git_diff_impacts_spec.rb +51 -75
  191. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/nodes_selectors_spec.rb +35 -26
  192. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/platform_handlers_plugins_api_spec.rb +24 -16
  193. data/spec/hybrid_platforms_conductor_test/api/nodes_handler/several_platforms_spec.rb +29 -19
  194. data/spec/hybrid_platforms_conductor_test/api/platform_handler_spec.rb +4 -4
  195. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/config_dsl_spec.rb +2 -2
  196. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/deploy_output_parsing_spec.rb +6 -6
  197. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/diff_impacts_spec.rb +57 -99
  198. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/inventory_spec.rb +4 -4
  199. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/packaging_spec.rb +32 -35
  200. data/spec/hybrid_platforms_conductor_test/api/platform_handlers/serverless_chef/services_deployment_spec.rb +10 -10
  201. data/spec/hybrid_platforms_conductor_test/api/platforms_handler_spec.rb +38 -27
  202. data/spec/hybrid_platforms_conductor_test/api/plugins_spec.rb +46 -52
  203. data/spec/hybrid_platforms_conductor_test/api/reports_handler_spec.rb +2 -2
  204. data/spec/hybrid_platforms_conductor_test/api/services_handler/actions_to_deploy_spec.rb +90 -58
  205. data/spec/hybrid_platforms_conductor_test/api/services_handler/deploy_allowed_spec.rb +38 -34
  206. data/spec/hybrid_platforms_conductor_test/api/services_handler/log_info_spec.rb +11 -9
  207. data/spec/hybrid_platforms_conductor_test/api/services_handler/package_spec.rb +193 -171
  208. data/spec/hybrid_platforms_conductor_test/api/services_handler/parse_deploy_output_spec.rb +66 -54
  209. data/spec/hybrid_platforms_conductor_test/api/services_handler/prepare_for_deploy_spec.rb +147 -133
  210. data/spec/hybrid_platforms_conductor_test/api/tests_runner/common_spec.rb +69 -49
  211. data/spec/hybrid_platforms_conductor_test/api/tests_runner/global_spec.rb +5 -4
  212. data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_check_spec.rb +8 -5
  213. data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_spec.rb +8 -5
  214. data/spec/hybrid_platforms_conductor_test/api/tests_runner/node_ssh_spec.rb +30 -27
  215. data/spec/hybrid_platforms_conductor_test/api/tests_runner/platform_spec.rb +12 -9
  216. data/spec/hybrid_platforms_conductor_test/api/tests_runner/reports_spec.rb +48 -47
  217. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/bitbucket_conf_spec.rb +5 -5
  218. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_plugins/github_ci_spec.rb +5 -5
  219. data/spec/hybrid_platforms_conductor_test/api/tests_runner/test_reports_plugins/confluence_spec.rb +5 -5
  220. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb.rb +9 -9
  221. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/{test_cmdb2.rb → test_cmdb_2.rb} +6 -6
  222. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/test_cmdb_others.rb +3 -3
  223. data/spec/hybrid_platforms_conductor_test/cmdb_plugins/{test_cmdb_others2.rb → test_cmdb_others_2.rb} +2 -2
  224. data/spec/hybrid_platforms_conductor_test/docs_spec.rb +1 -1
  225. data/spec/hybrid_platforms_conductor_test/executables/{check-node_spec.rb → check_node_spec.rb} +4 -6
  226. data/spec/hybrid_platforms_conductor_test/executables/deploy_spec.rb +4 -6
  227. data/spec/hybrid_platforms_conductor_test/executables/get_impacted_nodes_spec.rb +76 -77
  228. data/spec/hybrid_platforms_conductor_test/executables/last_deploys_spec.rb +159 -113
  229. data/spec/hybrid_platforms_conductor_test/executables/nodes_to_deploy_spec.rb +299 -160
  230. data/spec/hybrid_platforms_conductor_test/executables/options/actions_executor_spec.rb +4 -6
  231. data/spec/hybrid_platforms_conductor_test/executables/options/cmd_runner_spec.rb +3 -5
  232. data/spec/hybrid_platforms_conductor_test/executables/options/common_spec.rb +8 -8
  233. data/spec/hybrid_platforms_conductor_test/executables/options/deployer_spec.rb +12 -196
  234. data/spec/hybrid_platforms_conductor_test/executables/options/nodes_handler_spec.rb +9 -10
  235. data/spec/hybrid_platforms_conductor_test/executables/options/nodes_selectors_spec.rb +9 -10
  236. data/spec/hybrid_platforms_conductor_test/executables/options/reports_handler_spec.rb +1 -1
  237. data/spec/hybrid_platforms_conductor_test/executables/options/tests_runner_spec.rb +22 -22
  238. data/spec/hybrid_platforms_conductor_test/executables/report_spec.rb +22 -16
  239. data/spec/hybrid_platforms_conductor_test/executables/run_spec.rb +32 -32
  240. data/spec/hybrid_platforms_conductor_test/executables/ssh_config_spec.rb +7 -9
  241. data/spec/hybrid_platforms_conductor_test/executables/test_spec.rb +3 -5
  242. data/spec/hybrid_platforms_conductor_test/helpers/actions_executor_helpers.rb +2 -2
  243. data/spec/hybrid_platforms_conductor_test/helpers/cmd_runner_helpers.rb +4 -3
  244. data/spec/hybrid_platforms_conductor_test/helpers/cmdb_helpers.rb +2 -2
  245. data/spec/hybrid_platforms_conductor_test/helpers/config_helpers.rb +1 -1
  246. data/spec/hybrid_platforms_conductor_test/helpers/connector_ssh_helpers.rb +12 -13
  247. data/spec/hybrid_platforms_conductor_test/helpers/deployer_helpers.rb +245 -56
  248. data/spec/hybrid_platforms_conductor_test/helpers/executables_helpers.rb +11 -11
  249. data/spec/hybrid_platforms_conductor_test/helpers/nodes_handler_helpers.rb +1 -1
  250. data/spec/hybrid_platforms_conductor_test/helpers/platforms_handler_helpers.rb +39 -28
  251. data/spec/hybrid_platforms_conductor_test/helpers/plugins_helpers.rb +1 -1
  252. data/spec/hybrid_platforms_conductor_test/helpers/provisioner_proxmox_helpers.rb +86 -111
  253. data/spec/hybrid_platforms_conductor_test/helpers/reports_handler_helpers.rb +1 -1
  254. data/spec/hybrid_platforms_conductor_test/helpers/serverless_chef_helpers.rb +3 -3
  255. data/spec/hybrid_platforms_conductor_test/helpers/services_handler_helpers.rb +1 -1
  256. data/spec/hybrid_platforms_conductor_test/helpers/tests_runner_helpers.rb +1 -1
  257. data/spec/hybrid_platforms_conductor_test/mocked_lib/my_test_gem/hpc_plugins/test_plugin_type/{test_plugin_id1.rb → test_plugin_id_1.rb} +0 -0
  258. data/spec/hybrid_platforms_conductor_test/mocked_lib/my_test_gem/hpc_plugins/test_plugin_type/{test_plugin_id2.rb → test_plugin_id_2.rb} +0 -0
  259. data/spec/hybrid_platforms_conductor_test/mocked_lib/my_test_gem2/sub_dir/hpc_plugins/test_plugin_type/{test_plugin_id3.rb → test_plugin_id_3.rb} +0 -0
  260. data/spec/hybrid_platforms_conductor_test/mocked_lib/my_test_gem2/sub_dir/hpc_plugins/{test_plugin_type2/test_plugin_id4.rb → test_plugin_type_2/test_plugin_id_4.rb} +0 -0
  261. data/spec/hybrid_platforms_conductor_test/platform_handler_plugins/test.rb +1 -1
  262. data/spec/hybrid_platforms_conductor_test/platform_handler_plugins/{test2.rb → test_2.rb} +0 -0
  263. data/spec/hybrid_platforms_conductor_test/rubocop_spec.rb +31 -0
  264. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/1_node/nodes/node.json +3 -3
  265. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/data_bags/nodes/node.json +3 -3
  266. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/recipes/cookbooks/test_cookbook_2/libraries/default.rb +1 -0
  267. data/spec/hybrid_platforms_conductor_test/serverless_chef_repositories/several_cookbooks/other_cookbooks/test_cookbook_2/libraries/default.rb +1 -0
  268. data/spec/hybrid_platforms_conductor_test/shared_examples/deployer.rb +952 -0
  269. data/spec/hybrid_platforms_conductor_test/test_connector.rb +3 -3
  270. data/spec/hybrid_platforms_conductor_test/test_log_no_read_plugin.rb +84 -0
  271. data/spec/hybrid_platforms_conductor_test/test_log_plugin.rb +105 -0
  272. data/spec/hybrid_platforms_conductor_test/test_plugins/global.rb +1 -0
  273. data/spec/hybrid_platforms_conductor_test/test_plugins/node.rb +1 -0
  274. data/spec/hybrid_platforms_conductor_test/test_plugins/node_check.rb +1 -0
  275. data/spec/hybrid_platforms_conductor_test/test_plugins/platform.rb +1 -0
  276. data/spec/hybrid_platforms_conductor_test/test_plugins/several_checks.rb +2 -2
  277. data/spec/hybrid_platforms_conductor_test/test_secrets_reader_plugin.rb +45 -0
  278. data/spec/hybrid_platforms_conductor_test/tests_report_plugin.rb +5 -6
  279. data/spec/spec_helper.rb +17 -18
  280. data/tools/check_md +16 -20
  281. data/tools/generate_mermaid +1 -1
  282. metadata +195 -144
  283. data/spec/hybrid_platforms_conductor_test/helpers/deployer_test_helpers.rb +0 -916
@@ -45,7 +45,7 @@ module HybridPlatformsConductorTest
45
45
  #
46
46
  # Parameters::
47
47
  # * *options_parser* (OptionParser): The option parser to complete
48
- def options_parse(options_parser)
48
+ def options_parse(_options_parser)
49
49
  @calls << [:options_parse]
50
50
  end
51
51
 
@@ -102,7 +102,7 @@ module HybridPlatformsConductorTest
102
102
  # * *bash_cmds* (String): Bash commands to execute
103
103
  def remote_bash(bash_cmds)
104
104
  @calls << [:remote_bash, bash_cmds]
105
- @remote_bash_code.call(@stdout_io, @stderr_io, self) unless @remote_bash_code.nil?
105
+ @remote_bash_code&.call(@stdout_io, @stderr_io, self)
106
106
  end
107
107
 
108
108
  # Execute an interactive shell on the remote node
@@ -140,7 +140,7 @@ module HybridPlatformsConductorTest
140
140
  extra_opts[:owner] = owner if owner
141
141
  extra_opts[:group] = group if group
142
142
  @calls << [:remote_copy, from, to] + (extra_opts.empty? ? [] : [extra_opts])
143
- @remote_copy_code.call(@stdout_io, @stderr_io, self) unless @remote_copy_code.nil?
143
+ @remote_copy_code&.call(@stdout_io, @stderr_io, self)
144
144
  end
145
145
 
146
146
  # Integer: The current desired timeout
@@ -0,0 +1,84 @@
1
+ module HybridPlatformsConductorTest
2
+
3
+ # Test log without reading actions
4
+ class TestLogNoReadPlugin < HybridPlatformsConductor::Log
5
+
6
+ class << self
7
+
8
+ attr_accessor :calls
9
+
10
+ end
11
+
12
+ # Get actions to save logs
13
+ # [API] - This method is mandatory.
14
+ # [API] - The following API components are accessible:
15
+ # * *@config* (Config): Main configuration API.
16
+ # * *@nodes_handler* (NodesHandler): Nodes handler API.
17
+ # * *@actions_executor* (ActionsExecutor): Actions executor API.
18
+ #
19
+ # Parameters::
20
+ # * *node* (String): Node for which logs are being saved
21
+ # * *services* (Array<String>): The list of services that have been deployed on this node
22
+ # * *deployment_info* (Hash<Symbol,Object>): Additional information to attach to the logs
23
+ # * *exit_status* (Integer or Symbol): Exit status of the deployment
24
+ # * *stdout* (String): Deployment's stdout
25
+ # * *stderr* (String): Deployment's stderr
26
+ # Result::
27
+ # * Array< Hash<Symbol,Object> >: List of actions to be done
28
+ def actions_to_save_logs(node, services, deployment_info, exit_status, stdout, stderr)
29
+ TestLogNoReadPlugin.calls << {
30
+ method: :actions_to_save_logs,
31
+ node: node,
32
+ services: services,
33
+ # Don't store the date
34
+ deployment_info: deployment_info.reject { |k, _v| k == :date },
35
+ exit_status: exit_status,
36
+ stdout: stdout,
37
+ stderr: stderr
38
+ }
39
+ [{ bash: "echo Save test logs to #{node}" }]
40
+ end
41
+
42
+ # Get deployment logs from a node.
43
+ # This method can use the result of actions previously run to read logs, as returned by the actions_to_read_logs method.
44
+ # [API] - This method is mandatory.
45
+ # [API] - The following API components are accessible:
46
+ # * *@config* (Config): Main configuration API.
47
+ # * *@nodes_handler* (NodesHandler): Nodes handler API.
48
+ # * *@actions_executor* (ActionsExecutor): Actions executor API.
49
+ #
50
+ # Parameters::
51
+ # * *node* (String): The node we want deployment logs from
52
+ # * *exit_status* (Integer, Symbol or nil): Exit status of actions to read logs, or nil if no action was returned by actions_to_read_logs
53
+ # * *stdout* (String or nil): stdout of actions to read logs, or nil if no action was returned by actions_to_read_logs
54
+ # * *stderr* (String or nil): stderr of actions to read logs, or nil if no action was returned by actions_to_read_logs
55
+ # Result::
56
+ # * Hash<Symbol,Object>: Deployment log information:
57
+ # * *error* (String): Error string in case deployment logs could not be retrieved. If set then further properties will be ignored. [optional]
58
+ # * *services* (Array<String>): List of services deployed on the node
59
+ # * *deployment_info* (Hash<Symbol,Object>): Deployment metadata
60
+ # * *exit_status* (Integer or Symbol): Deployment exit status
61
+ # * *stdout* (String): Deployment stdout
62
+ # * *stderr* (String): Deployment stderr
63
+ def logs_for(node, exit_status, stdout, stderr)
64
+ TestLogNoReadPlugin.calls << {
65
+ method: :logs_for,
66
+ node: node,
67
+ exit_status: exit_status,
68
+ stdout: stdout,
69
+ stderr: stderr
70
+ }
71
+ {
72
+ services: %w[unknown],
73
+ deployment_info: {
74
+ user: 'test_user'
75
+ },
76
+ exit_status: 666,
77
+ stdout: 'Deployment test stdout',
78
+ stderr: 'Deployment test stderr'
79
+ }
80
+ end
81
+
82
+ end
83
+
84
+ end
@@ -0,0 +1,105 @@
1
+ module HybridPlatformsConductorTest
2
+
3
+ # Test log
4
+ class TestLogPlugin < HybridPlatformsConductor::Log
5
+
6
+ class << self
7
+
8
+ attr_accessor :calls
9
+
10
+ end
11
+
12
+ # Get actions to save logs
13
+ # [API] - This method is mandatory.
14
+ # [API] - The following API components are accessible:
15
+ # * *@config* (Config): Main configuration API.
16
+ # * *@nodes_handler* (NodesHandler): Nodes handler API.
17
+ # * *@actions_executor* (ActionsExecutor): Actions executor API.
18
+ #
19
+ # Parameters::
20
+ # * *node* (String): Node for which logs are being saved
21
+ # * *services* (Array<String>): The list of services that have been deployed on this node
22
+ # * *deployment_info* (Hash<Symbol,Object>): Additional information to attach to the logs
23
+ # * *exit_status* (Integer or Symbol): Exit status of the deployment
24
+ # * *stdout* (String): Deployment's stdout
25
+ # * *stderr* (String): Deployment's stderr
26
+ # Result::
27
+ # * Array< Hash<Symbol,Object> >: List of actions to be done
28
+ def actions_to_save_logs(node, services, deployment_info, exit_status, stdout, stderr)
29
+ TestLogPlugin.calls << {
30
+ method: :actions_to_save_logs,
31
+ node: node,
32
+ services: services,
33
+ # Don't store the date
34
+ deployment_info: deployment_info.reject { |k, _v| k == :date },
35
+ exit_status: exit_status,
36
+ stdout: stdout,
37
+ stderr: stderr
38
+ }
39
+ [{ bash: "echo Save test logs to #{node}" }]
40
+ end
41
+
42
+ # Get actions to read logs.
43
+ # If provided, this method can return some actions to be executed that will fetch logs from servers or remote nodes.
44
+ # By using this method to run actions instead of the synchronous method logs_from, such actions will be run in parallel which can greatly improve time-consuming operations when querying a lot of nodes.
45
+ # [API] - This method is optional.
46
+ # [API] - The following API components are accessible:
47
+ # * *@config* (Config): Main configuration API.
48
+ # * *@nodes_handler* (NodesHandler): Nodes handler API.
49
+ # * *@actions_executor* (ActionsExecutor): Actions executor API.
50
+ #
51
+ # Parameters::
52
+ # * *node* (String): Node for which deployment logs are being read
53
+ # Result::
54
+ # * Array< Hash<Symbol,Object> >: List of actions to be done
55
+ def actions_to_read_logs(node)
56
+ TestLogPlugin.calls << {
57
+ method: :actions_to_read_logs,
58
+ node: node
59
+ }
60
+ [{ bash: "echo Read logs for #{node}" }]
61
+ end
62
+
63
+ # Get deployment logs from a node.
64
+ # This method can use the result of actions previously run to read logs, as returned by the actions_to_read_logs method.
65
+ # [API] - This method is mandatory.
66
+ # [API] - The following API components are accessible:
67
+ # * *@config* (Config): Main configuration API.
68
+ # * *@nodes_handler* (NodesHandler): Nodes handler API.
69
+ # * *@actions_executor* (ActionsExecutor): Actions executor API.
70
+ #
71
+ # Parameters::
72
+ # * *node* (String): The node we want deployment logs from
73
+ # * *exit_status* (Integer, Symbol or nil): Exit status of actions to read logs, or nil if no action was returned by actions_to_read_logs
74
+ # * *stdout* (String or nil): stdout of actions to read logs, or nil if no action was returned by actions_to_read_logs
75
+ # * *stderr* (String or nil): stderr of actions to read logs, or nil if no action was returned by actions_to_read_logs
76
+ # Result::
77
+ # * Hash<Symbol,Object>: Deployment log information:
78
+ # * *error* (String): Error string in case deployment logs could not be retrieved. If set then further properties will be ignored. [optional]
79
+ # * *services* (Array<String>): List of services deployed on the node
80
+ # * *deployment_info* (Hash<Symbol,Object>): Deployment metadata
81
+ # * *exit_status* (Integer or Symbol): Deployment exit status
82
+ # * *stdout* (String): Deployment stdout
83
+ # * *stderr* (String): Deployment stderr
84
+ def logs_for(node, exit_status, stdout, stderr)
85
+ TestLogPlugin.calls << {
86
+ method: :logs_for,
87
+ node: node,
88
+ exit_status: exit_status,
89
+ stdout: stdout,
90
+ stderr: stderr
91
+ }
92
+ {
93
+ services: %w[unknown],
94
+ deployment_info: {
95
+ user: 'test_user'
96
+ },
97
+ exit_status: 666,
98
+ stdout: 'Deployment test stdout',
99
+ stderr: 'Deployment test stderr'
100
+ }
101
+ end
102
+
103
+ end
104
+
105
+ end
@@ -20,6 +20,7 @@ module HybridPlatformsConductorTest
20
20
  # Check my_test_plugin.rb.sample documentation for signature details.
21
21
  def test
22
22
  raise 'Failing test' if Global.fail
23
+
23
24
  Global.nbr_runs += 1
24
25
  end
25
26
 
@@ -33,6 +33,7 @@ module HybridPlatformsConductorTest
33
33
  # Check my_test_plugin.rb.sample documentation for signature details.
34
34
  def test_for_node
35
35
  raise "Failing test #{@name} for #{@node}" if Node.fail_for.key?(@name) && Node.fail_for[@name].include?(@node)
36
+
36
37
  sleep_time = Node.sleeps.dig(@name, @node)
37
38
  sleep sleep_time unless sleep_time.nil?
38
39
  Node.runs << [@name, @node]
@@ -29,6 +29,7 @@ module HybridPlatformsConductorTest
29
29
  # Check my_test_plugin.rb.sample documentation for signature details.
30
30
  def test_on_check_node(stdout, stderr, exit_status)
31
31
  raise 'Failing test' if NodeCheck.fail_for.include? @node
32
+
32
33
  NodeCheck.runs << [@name, @node, stdout, stderr, exit_status]
33
34
  end
34
35
 
@@ -30,6 +30,7 @@ module HybridPlatformsConductorTest
30
30
  def test_on_platform
31
31
  platform_name = @platform.name
32
32
  raise 'Failing test' if Platform.fail_for.include? platform_name
33
+
33
34
  sleep_time = Platform.sleeps.dig(@name, platform_name)
34
35
  sleep sleep_time unless sleep_time.nil?
35
36
  Platform.runs << [@name, platform_name]
@@ -32,14 +32,14 @@ module HybridPlatformsConductorTest
32
32
  # Check my_test_plugin.rb.sample documentation for signature details.
33
33
  def test_on_node
34
34
  {
35
- "test_#{@node}.sh" => proc do |stdout, stderr, exit_code|
35
+ "test_#{@node}.sh" => proc do |stdout, stderr|
36
36
  SeveralChecks.runs << [@name, @node, "Node SSH test: #{stdout.join("\n")} - #{stderr.join("\n")}"]
37
37
  end
38
38
  }
39
39
  end
40
40
 
41
41
  # Check my_test_plugin.rb.sample documentation for signature details.
42
- def test_on_check_node(stdout, stderr, exit_status)
42
+ def test_on_check_node(stdout, _stderr, _exit_status)
43
43
  SeveralChecks.runs << [@name, @node, "Node check-node test: #{stdout}"]
44
44
  end
45
45
 
@@ -0,0 +1,45 @@
1
+ require 'hybrid_platforms_conductor/secrets_reader'
2
+
3
+ module HybridPlatformsConductorTest
4
+
5
+ # Mock a secrets reader plugin
6
+ class TestSecretsReaderPlugin < HybridPlatformsConductor::SecretsReader
7
+
8
+ class << self
9
+
10
+ attr_accessor :calls, :deployer, :mocked_secrets
11
+
12
+ end
13
+
14
+ # Return secrets for a given service to be deployed on a node.
15
+ # [API] - This method is mandatory
16
+ # [API] - The following API components are accessible:
17
+ # * *@config* (Config): Main configuration API.
18
+ # * *@cmd_runner* (CmdRunner): Command Runner API.
19
+ # * *@nodes_handler* (NodesHandler): Nodes handler API.
20
+ #
21
+ # Parameters::
22
+ # * *node* (String): Node to be deployed
23
+ # * *service* (String): Service to be deployed
24
+ # Result::
25
+ # * Hash: The secrets
26
+ def secrets_for(node, service)
27
+ # Get the name by looking into the plugins' map
28
+ plugin_name, _plugin = TestSecretsReaderPlugin.deployer.instance_variable_get(:@secrets_readers).find { |_plugin_name, plugin| plugin == self }
29
+ TestSecretsReaderPlugin.calls << {
30
+ instance: plugin_name,
31
+ node: node,
32
+ service: service
33
+ }
34
+ TestSecretsReaderPlugin.mocked_secrets.dig(node, service, plugin_name) || {
35
+ node => {
36
+ service => {
37
+ plugin_name.to_s => 'Secret value'
38
+ }
39
+ }
40
+ }
41
+ end
42
+
43
+ end
44
+
45
+ end
@@ -4,9 +4,11 @@ module HybridPlatformsConductorTest
4
4
  class TestsReportPlugin < HybridPlatformsConductor::TestReport
5
5
 
6
6
  class << self
7
+
7
8
  # Reports (that can be compared), per report name
8
9
  # Array< Hash<Symbol, Object> >
9
10
  attr_accessor :reports
11
+
10
12
  end
11
13
 
12
14
  # Handle tests reports
@@ -15,12 +17,9 @@ module HybridPlatformsConductorTest
15
17
  global_tests: report_from(global_tests),
16
18
  platform_tests: report_from(platform_tests),
17
19
  node_tests: report_from(node_tests),
18
- errors_per_test: Hash[group_errors(node_tests, :test_name).map do |test_name, errors|
19
- [
20
- test_name,
21
- errors.map { |error| error.split("\n").first }
22
- ]
23
- end],
20
+ errors_per_test: group_errors(node_tests, :test_name).transform_values do |errors|
21
+ errors.map { |error| error.split("\n").first }
22
+ end,
24
23
  nodes_by_nodes_list: nodes_by_nodes_list
25
24
  }
26
25
  end
data/spec/spec_helper.rb CHANGED
@@ -32,7 +32,7 @@ RSpec.configure do |config|
32
32
  expectations.include_chain_clauses_in_custom_matcher_descriptions = true
33
33
 
34
34
  # Increase the diffs length being output, as some tests are dealing with a few lines of stdout
35
- expectations.max_formatted_output_length = 65536
35
+ expectations.max_formatted_output_length = 65_536
36
36
 
37
37
  end
38
38
 
@@ -55,57 +55,56 @@ RSpec.configure do |config|
55
55
  # triggering implicit auto-inclusion in groups with matching metadata.
56
56
  config.shared_context_metadata_behavior = :apply_to_host_groups
57
57
 
58
- # The settings below are suggested to provide a good initial experience
59
- # with RSpec, but feel free to customize to your heart's content.
60
- =begin
58
+ # The settings below are suggested to provide a good initial experience
59
+ # with RSpec, but feel free to customize to your heart's content.
60
+
61
61
  # This allows you to limit a spec run to individual examples or groups
62
62
  # you care about by tagging them with `:focus` metadata. When nothing
63
63
  # is tagged with `:focus`, all examples get run. RSpec also provides
64
64
  # aliases for `it`, `describe`, and `context` that include `:focus`
65
65
  # metadata: `fit`, `fdescribe` and `fcontext`, respectively.
66
- config.filter_run_when_matching :focus
66
+ # config.filter_run_when_matching :focus
67
67
 
68
68
  # Allows RSpec to persist some state between runs in order to support
69
69
  # the `--only-failures` and `--next-failure` CLI options. We recommend
70
70
  # you configure your source control system to ignore this file.
71
- config.example_status_persistence_file_path = "spec/examples.txt"
71
+ # config.example_status_persistence_file_path = "spec/examples.txt"
72
72
 
73
73
  # Limits the available syntax to the non-monkey patched syntax that is
74
74
  # recommended. For more details, see:
75
75
  # - http://rspec.info/blog/2012/06/rspecs-new-expectation-syntax/
76
76
  # - http://www.teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
77
77
  # - http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/#zero-monkey-patching-mode
78
- config.disable_monkey_patching!
78
+ # config.disable_monkey_patching!
79
79
 
80
80
  # This setting enables warnings. It's recommended, but in some cases may
81
81
  # be too noisy due to issues in dependencies.
82
- config.warnings = true
82
+ # config.warnings = true
83
83
 
84
84
  # Many RSpec users commonly either run the entire suite or an individual
85
85
  # file, and it's useful to allow more verbose output when running an
86
86
  # individual spec file.
87
- if config.files_to_run.one?
88
- # Use the documentation formatter for detailed output,
89
- # unless a formatter has already been configured
90
- # (e.g. via a command-line flag).
91
- config.default_formatter = "doc"
92
- end
87
+ # if config.files_to_run.one?
88
+ # # Use the documentation formatter for detailed output,
89
+ # # unless a formatter has already been configured
90
+ # # (e.g. via a command-line flag).
91
+ # config.default_formatter = "doc"
92
+ # end
93
93
 
94
94
  # Print the 10 slowest examples and example groups at the
95
95
  # end of the spec run, to help surface which specs are running
96
96
  # particularly slow.
97
- config.profile_examples = 10
97
+ # config.profile_examples = 10
98
98
 
99
99
  # Run specs in random order to surface order dependencies. If you find an
100
100
  # order dependency and want to debug it, you can fix the order by providing
101
101
  # the seed, which is printed after each run.
102
102
  # --seed 1234
103
- config.order = :random
103
+ # config.order = :random
104
104
 
105
105
  # Seed global randomization in this process using the `--seed` CLI option.
106
106
  # Setting this allows you to use `--seed` to deterministically reproduce
107
107
  # test failures related to randomization by passing the same `--seed` value
108
108
  # as the one that triggered the failure.
109
- Kernel.srand config.seed
110
- =end
109
+ # Kernel.srand config.seed
111
110
  end
data/tools/check_md CHANGED
@@ -18,7 +18,7 @@ def link_to_file(link, file)
18
18
  if link_file == ''
19
19
  file
20
20
  elsif link_file.start_with?('/')
21
- link_file[1..-1]
21
+ link_file[1..]
22
22
  else
23
23
  File.expand_path("#{File.dirname(file)}/#{link_file}").gsub("#{Dir.pwd}/", '')
24
24
  end
@@ -29,22 +29,20 @@ end
29
29
  # Parameters::
30
30
  # * *file* (String): Markdown file to be parsed
31
31
  def parse_md(file)
32
- unless @info.key?(file)
33
- puts "Parsing #{file}..."
34
- content = File.read(file)
35
- @info[file] = {
36
- anchors: content.scan(/<a name="([^"]*)"><\/a>/).map { |(anchor)| anchor },
37
- links: content.scan(/\[[^\]]*\]\(([^\)]*)\)/).map { |(link)| link }
38
- }
39
- # Parse linked files
40
- @info[file][:links].each do |link|
41
- puts "Found #{file} => #{link}"
42
- end
43
- @info[file][:links].each do |link|
44
- unless link.start_with?('http')
45
- linked_file = link_to_file(link, file)
46
- parse_md(linked_file) if File.exist?(linked_file) && linked_file.end_with?('.md')
47
- end
32
+ return if @info.key?(file)
33
+
34
+ puts "Parsing #{file}..."
35
+ content = File.read(file)
36
+ @info[file] = {
37
+ anchors: content.scan(%r{<a name="([^"]*)"></a>}).map { |(anchor)| anchor },
38
+ links: content.scan(/\[[^\]]*\]\(([^)]*)\)/).map { |(link)| link }
39
+ }
40
+ # Parse linked files
41
+ @info[file][:links].each do |link|
42
+ puts "Found #{file} => #{link}"
43
+ unless link.start_with?('http')
44
+ linked_file = link_to_file(link, file)
45
+ parse_md(linked_file) if File.exist?(linked_file) && linked_file.end_with?('.md')
48
46
  end
49
47
  end
50
48
  end
@@ -63,9 +61,7 @@ errors = []
63
61
  anchor = link.split('#')[1]
64
62
  linked_file = link_to_file(link, file)
65
63
  if @info.key?(linked_file)
66
- if anchor.nil?
67
- '*'
68
- elsif @info[linked_file][:anchors].include?(anchor)
64
+ if anchor.nil? || @info[linked_file][:anchors].include?(anchor)
69
65
  '*'
70
66
  else
71
67
  errors << "[#{file} -> #{link}] - Destination has no anchor named #{anchor}"