r10k 3.5.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 (358) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +1 -0
  3. data/.github/pull_request_template.md +1 -0
  4. data/.github/workflows/docker.yml +56 -0
  5. data/.github/workflows/release.yml +36 -0
  6. data/.gitignore +9 -0
  7. data/.travis.yml +45 -0
  8. data/CHANGELOG.mkd +1759 -0
  9. data/CODEOWNERS +2 -0
  10. data/CONTRIBUTING.mkd +105 -0
  11. data/Gemfile +15 -0
  12. data/LICENSE +14 -0
  13. data/README.mkd +118 -0
  14. data/Rakefile +3 -0
  15. data/azure-pipelines.yml +86 -0
  16. data/bin/r10k +17 -0
  17. data/doc/common-patterns.mkd +44 -0
  18. data/doc/dynamic-environments.mkd +31 -0
  19. data/doc/dynamic-environments/configuration.mkd +669 -0
  20. data/doc/dynamic-environments/git-environments.mkd +75 -0
  21. data/doc/dynamic-environments/introduction.mkd +69 -0
  22. data/doc/dynamic-environments/master-configuration.mkd +40 -0
  23. data/doc/dynamic-environments/quickstart.mkd +201 -0
  24. data/doc/dynamic-environments/svn-environments.mkd +45 -0
  25. data/doc/dynamic-environments/usage.mkd +132 -0
  26. data/doc/dynamic-environments/workflow-guide.mkd +247 -0
  27. data/doc/faq.mkd +164 -0
  28. data/doc/git/cloning-and-mirroring.mkd +60 -0
  29. data/doc/git/providers.mkd +111 -0
  30. data/doc/puppetfile.mkd +309 -0
  31. data/doc/updating-your-puppetfile.mkd +38 -0
  32. data/docker/.gitignore +1 -0
  33. data/docker/.rspec +4 -0
  34. data/docker/Gemfile +11 -0
  35. data/docker/Makefile +89 -0
  36. data/docker/README.md +28 -0
  37. data/docker/r10k/Dockerfile +67 -0
  38. data/docker/r10k/adduser.sh +13 -0
  39. data/docker/r10k/docker-entrypoint.d/10-analytics.sh +30 -0
  40. data/docker/r10k/docker-entrypoint.sh +11 -0
  41. data/docker/r10k/release.Dockerfile +54 -0
  42. data/docker/spec/dockerfile_spec.rb +43 -0
  43. data/docker/spec/fixtures/Puppetfile +2 -0
  44. data/integration/Gemfile +19 -0
  45. data/integration/README.mkd +29 -0
  46. data/integration/Rakefile +77 -0
  47. data/integration/component/pre-suite/05_install_dev_r10k.rb +12 -0
  48. data/integration/files/README.mkd +4 -0
  49. data/integration/files/hiera.yaml +8 -0
  50. data/integration/files/modules/helloworld/manifests/init.pp +3 -0
  51. data/integration/files/modules/hieratest/manifests/init.pp +3 -0
  52. data/integration/files/modules/unicode/files/pretend_unicode +1 -0
  53. data/integration/files/modules/unicode/manifests/init.pp +6 -0
  54. data/integration/files/pre-suite/git_config.pp.erb +19 -0
  55. data/integration/files/pre-suite/prod_env.config +3 -0
  56. data/integration/files/r10k_conf.yaml.erb +9 -0
  57. data/integration/lib/README.mkd +4 -0
  58. data/integration/lib/git_utils.rb +205 -0
  59. data/integration/lib/master_manipulator.rb +205 -0
  60. data/integration/lib/r10k_utils.rb +222 -0
  61. data/integration/manifests/README.mkd +4 -0
  62. data/integration/pre-suite/00_pe_install.rb +6 -0
  63. data/integration/pre-suite/10_git_config.rb +48 -0
  64. data/integration/pre-suite/20_pe_r10k.rb +55 -0
  65. data/integration/pre-suite/README.mkd +5 -0
  66. data/integration/tests/Puppetfile/HTTP_PROXY_affects_forge_source.rb +72 -0
  67. data/integration/tests/Puppetfile/HTTP_PROXY_affects_git_source.rb +70 -0
  68. data/integration/tests/README.mkd +4 -0
  69. data/integration/tests/basic_functionality/install_pe_only_module_with_puppetfile.rb +83 -0
  70. data/integration/tests/basic_functionality/negative/neg_deploy_with_invalid_r10k_yaml.rb +51 -0
  71. data/integration/tests/basic_functionality/negative/neg_deploy_with_missing_r10k_yaml.rb +28 -0
  72. data/integration/tests/basic_functionality/negative/neg_invalid_git_provider.rb +45 -0
  73. data/integration/tests/basic_functionality/negative/negative_bad_proxy.rb +34 -0
  74. data/integration/tests/basic_functionality/proxy_specified_in_configuration.rb +103 -0
  75. data/integration/tests/basic_functionality/proxy_with_pe_only_module.rb +128 -0
  76. data/integration/tests/basic_functionality/proxy_with_puppetfile.rb +61 -0
  77. data/integration/tests/basic_functionality/rugged_git_provider_with_ssh.rb +109 -0
  78. data/integration/tests/basic_functionality/rugged_git_provider_without_ssh.rb +108 -0
  79. data/integration/tests/command_line/deploy_env_without_mod_update.rb +76 -0
  80. data/integration/tests/command_line/negative/neg_deploy_env_with_module_update.rb +77 -0
  81. data/integration/tests/command_line/negative/neg_invalid_cmd_line_arg.rb +23 -0
  82. data/integration/tests/git_source/HTTP_proxy_and_git_source.rb +70 -0
  83. data/integration/tests/git_source/git_source_git.rb +128 -0
  84. data/integration/tests/git_source/git_source_ssh.rb +87 -0
  85. data/integration/tests/git_source/git_source_submodule.rb +70 -0
  86. data/integration/tests/git_source/negative/neg_git_broken_remote.rb +38 -0
  87. data/integration/tests/git_source/negative/neg_git_unauthorized_https.rb +46 -0
  88. data/integration/tests/git_source/negative/neg_git_unauthorized_ssh.rb +73 -0
  89. data/integration/tests/git_source/negative/neg_git_unicode_branch.rb +35 -0
  90. data/integration/tests/i18n/deploy_module_with_unicode_in_file_name.rb +64 -0
  91. data/integration/tests/purging/content_not_purged_at_root.rb +89 -0
  92. data/integration/tests/purging/default_purging.rb +125 -0
  93. data/integration/tests/purging/does_not_purge_files_on_white_list.rb +93 -0
  94. data/integration/tests/purging/invalid_whitelist_types.rb +63 -0
  95. data/integration/tests/user_scenario/basic_workflow/multi_env_1000_branches.rb +66 -0
  96. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module.rb +111 -0
  97. data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb +117 -0
  98. data/integration/tests/user_scenario/basic_workflow/multi_env_hiera.rb +100 -0
  99. data/integration/tests/user_scenario/basic_workflow/multi_env_multi_source.rb +133 -0
  100. data/integration/tests/user_scenario/basic_workflow/multi_source_custom_forge_git_module.rb +161 -0
  101. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_basedir.rb +46 -0
  102. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_forge_module.rb +48 -0
  103. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module.rb +45 -0
  104. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module_ref.rb +43 -0
  105. data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_remote.rb +45 -0
  106. data/integration/tests/user_scenario/basic_workflow/negative/neg_branch_name_collision.rb +64 -0
  107. data/integration/tests/user_scenario/basic_workflow/negative/neg_disk_full.rb +75 -0
  108. data/integration/tests/user_scenario/basic_workflow/negative/neg_duplicate_module_names.rb +44 -0
  109. data/integration/tests/user_scenario/basic_workflow/negative/neg_inaccessible_forge.rb +58 -0
  110. data/integration/tests/user_scenario/basic_workflow/negative/neg_invalid_env_name.rb +34 -0
  111. data/integration/tests/user_scenario/basic_workflow/negative/neg_invalid_puppet_file.rb +36 -0
  112. data/integration/tests/user_scenario/basic_workflow/negative/neg_module_specified_at_deleted_release.rb +49 -0
  113. data/integration/tests/user_scenario/basic_workflow/negative/neg_read_only.rb +58 -0
  114. data/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb +51 -0
  115. data/integration/tests/user_scenario/basic_workflow/single_env_10000_files.rb +75 -0
  116. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_git_module.rb +104 -0
  117. data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_module.rb +81 -0
  118. data/integration/tests/user_scenario/basic_workflow/single_env_custom_module.rb +49 -0
  119. data/integration/tests/user_scenario/basic_workflow/single_env_large_files.rb +75 -0
  120. data/integration/tests/user_scenario/basic_workflow/single_env_module_already_installed.rb +82 -0
  121. data/integration/tests/user_scenario/basic_workflow/single_env_module_last_release_deleted.rb +68 -0
  122. data/integration/tests/user_scenario/basic_workflow/single_env_non-existent_base_dir.rb +94 -0
  123. data/integration/tests/user_scenario/basic_workflow/single_env_purge_unmanaged_modules.rb +93 -0
  124. data/integration/tests/user_scenario/basic_workflow/single_env_switch_forge_git_module.rb +117 -0
  125. data/integration/tests/user_scenario/basic_workflow/single_env_unicode_paths.rb +60 -0
  126. data/integration/tests/user_scenario/basic_workflow/single_env_upgrade_forge_mod_revert_change.rb +166 -0
  127. data/integration/tests/user_scenario/complex_workflow/multi_env_add_change_remove.rb +163 -0
  128. data/integration/tests/user_scenario/complex_workflow/multi_env_remove_re-add.rb +111 -0
  129. data/integration/tests/user_scenario/complex_workflow/multi_env_unamanaged.rb +78 -0
  130. data/integration/tests/user_scenario/complex_workflow/single_env_git_module_update.rb +100 -0
  131. data/lib/r10k.rb +11 -0
  132. data/lib/r10k/action/base.rb +31 -0
  133. data/lib/r10k/action/cri_runner.rb +72 -0
  134. data/lib/r10k/action/deploy.rb +9 -0
  135. data/lib/r10k/action/deploy/deploy_helpers.rb +34 -0
  136. data/lib/r10k/action/deploy/display.rb +89 -0
  137. data/lib/r10k/action/deploy/environment.rb +196 -0
  138. data/lib/r10k/action/deploy/module.rb +84 -0
  139. data/lib/r10k/action/puppetfile.rb +10 -0
  140. data/lib/r10k/action/puppetfile/check.rb +31 -0
  141. data/lib/r10k/action/puppetfile/cri_runner.rb +26 -0
  142. data/lib/r10k/action/puppetfile/install.rb +45 -0
  143. data/lib/r10k/action/puppetfile/purge.rb +28 -0
  144. data/lib/r10k/action/runner.rb +96 -0
  145. data/lib/r10k/action/visitor.rb +31 -0
  146. data/lib/r10k/cli.rb +51 -0
  147. data/lib/r10k/cli/deploy.rb +114 -0
  148. data/lib/r10k/cli/ext/logging.rb +15 -0
  149. data/lib/r10k/cli/help.rb +7 -0
  150. data/lib/r10k/cli/puppetfile.rb +74 -0
  151. data/lib/r10k/cli/version.rb +31 -0
  152. data/lib/r10k/deployment.rb +132 -0
  153. data/lib/r10k/deployment/config.rb +56 -0
  154. data/lib/r10k/environment.rb +37 -0
  155. data/lib/r10k/environment/bare.rb +16 -0
  156. data/lib/r10k/environment/base.rb +150 -0
  157. data/lib/r10k/environment/git.rb +81 -0
  158. data/lib/r10k/environment/name.rb +86 -0
  159. data/lib/r10k/environment/svn.rb +91 -0
  160. data/lib/r10k/environment/with_modules.rb +139 -0
  161. data/lib/r10k/errors.rb +61 -0
  162. data/lib/r10k/errors/formatting.rb +28 -0
  163. data/lib/r10k/feature.rb +56 -0
  164. data/lib/r10k/feature/collection.rb +23 -0
  165. data/lib/r10k/features.rb +20 -0
  166. data/lib/r10k/forge/module_release.rb +228 -0
  167. data/lib/r10k/git.rb +196 -0
  168. data/lib/r10k/git/alternates.rb +63 -0
  169. data/lib/r10k/git/cache.rb +108 -0
  170. data/lib/r10k/git/errors.rb +34 -0
  171. data/lib/r10k/git/rugged.rb +17 -0
  172. data/lib/r10k/git/rugged/bare_repository.rb +85 -0
  173. data/lib/r10k/git/rugged/base_repository.rb +93 -0
  174. data/lib/r10k/git/rugged/cache.rb +11 -0
  175. data/lib/r10k/git/rugged/credentials.rb +91 -0
  176. data/lib/r10k/git/rugged/thin_repository.rb +89 -0
  177. data/lib/r10k/git/rugged/working_repository.rb +145 -0
  178. data/lib/r10k/git/shellgit.rb +9 -0
  179. data/lib/r10k/git/shellgit/bare_repository.rb +43 -0
  180. data/lib/r10k/git/shellgit/base_repository.rb +137 -0
  181. data/lib/r10k/git/shellgit/cache.rb +11 -0
  182. data/lib/r10k/git/shellgit/thin_repository.rb +69 -0
  183. data/lib/r10k/git/shellgit/working_repository.rb +111 -0
  184. data/lib/r10k/git/stateful_repository.rb +95 -0
  185. data/lib/r10k/initializers.rb +67 -0
  186. data/lib/r10k/instance_cache.rb +32 -0
  187. data/lib/r10k/keyed_factory.rb +39 -0
  188. data/lib/r10k/logging.rb +109 -0
  189. data/lib/r10k/logging/terminaloutputter.rb +36 -0
  190. data/lib/r10k/module.rb +38 -0
  191. data/lib/r10k/module/base.rb +113 -0
  192. data/lib/r10k/module/forge.rb +177 -0
  193. data/lib/r10k/module/git.rb +109 -0
  194. data/lib/r10k/module/local.rb +36 -0
  195. data/lib/r10k/module/metadata_file.rb +31 -0
  196. data/lib/r10k/module/svn.rb +112 -0
  197. data/lib/r10k/puppetfile.rb +286 -0
  198. data/lib/r10k/settings.rb +194 -0
  199. data/lib/r10k/settings/collection.rb +123 -0
  200. data/lib/r10k/settings/container.rb +97 -0
  201. data/lib/r10k/settings/definition.rb +124 -0
  202. data/lib/r10k/settings/enum_definition.rb +30 -0
  203. data/lib/r10k/settings/helpers.rb +38 -0
  204. data/lib/r10k/settings/list.rb +107 -0
  205. data/lib/r10k/settings/loader.rb +99 -0
  206. data/lib/r10k/settings/mixin.rb +54 -0
  207. data/lib/r10k/settings/uri_definition.rb +19 -0
  208. data/lib/r10k/source.rb +42 -0
  209. data/lib/r10k/source/base.rb +74 -0
  210. data/lib/r10k/source/exec.rb +51 -0
  211. data/lib/r10k/source/git.rb +142 -0
  212. data/lib/r10k/source/hash.rb +182 -0
  213. data/lib/r10k/source/svn.rb +136 -0
  214. data/lib/r10k/source/yaml.rb +20 -0
  215. data/lib/r10k/source/yamldir.rb +32 -0
  216. data/lib/r10k/svn.rb +6 -0
  217. data/lib/r10k/svn/remote.rb +68 -0
  218. data/lib/r10k/svn/working_dir.rb +125 -0
  219. data/lib/r10k/util/attempt.rb +84 -0
  220. data/lib/r10k/util/basedir.rb +65 -0
  221. data/lib/r10k/util/commands.rb +31 -0
  222. data/lib/r10k/util/exec_env.rb +36 -0
  223. data/lib/r10k/util/license.rb +24 -0
  224. data/lib/r10k/util/platform.rb +42 -0
  225. data/lib/r10k/util/purgeable.rb +88 -0
  226. data/lib/r10k/util/setopts.rb +55 -0
  227. data/lib/r10k/util/subprocess.rb +84 -0
  228. data/lib/r10k/util/subprocess/result.rb +56 -0
  229. data/lib/r10k/util/subprocess/runner.rb +26 -0
  230. data/lib/r10k/util/subprocess/runner/jruby.rb +23 -0
  231. data/lib/r10k/util/subprocess/runner/posix.rb +103 -0
  232. data/lib/r10k/util/subprocess/runner/pump.rb +59 -0
  233. data/lib/r10k/util/subprocess/runner/windows.rb +23 -0
  234. data/lib/r10k/util/subprocess/subprocess_error.rb +24 -0
  235. data/lib/r10k/util/symbolize_keys.rb +35 -0
  236. data/lib/r10k/version.rb +6 -0
  237. data/locales/config.yaml +21 -0
  238. data/locales/r10k.pot +545 -0
  239. data/r10k.gemspec +50 -0
  240. data/r10k.yaml.example +112 -0
  241. data/spec/fixtures/empty/.empty +0 -0
  242. data/spec/fixtures/integration/git/puppet-boolean-bare.tar +0 -0
  243. data/spec/fixtures/module/forge/bad_module/metadata.json +1 -0
  244. data/spec/fixtures/module/forge/eight_hundred/Modulefile +8 -0
  245. data/spec/fixtures/module/forge/eight_hundred/metadata.json +19 -0
  246. data/spec/fixtures/unit/action/r10k.yaml +5 -0
  247. data/spec/fixtures/unit/action/r10k_cachedir.yaml +2 -0
  248. data/spec/fixtures/unit/action/r10k_generate_types.yaml +3 -0
  249. data/spec/fixtures/unit/action/r10k_puppet_path.yaml +3 -0
  250. data/spec/fixtures/unit/puppetfile/argument-error/Puppetfile +1 -0
  251. data/spec/fixtures/unit/puppetfile/default-branch-override/Puppetfile +5 -0
  252. data/spec/fixtures/unit/puppetfile/duplicate-module-error/Puppetfile +10 -0
  253. data/spec/fixtures/unit/puppetfile/invalid-syntax/Puppetfile +1 -0
  254. data/spec/fixtures/unit/puppetfile/load-error/Puppetfile +1 -0
  255. data/spec/fixtures/unit/puppetfile/name-error/Puppetfile +1 -0
  256. data/spec/fixtures/unit/puppetfile/valid-forge-with-version/Puppetfile +1 -0
  257. data/spec/fixtures/unit/puppetfile/valid-forge-without-version/Puppetfile +1 -0
  258. data/spec/fixtures/unit/util/purgeable/managed_one/expected_1 +0 -0
  259. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_expected_1 +0 -0
  260. data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_unmanaged_1 +0 -0
  261. data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_1 +0 -0
  262. data/spec/fixtures/unit/util/purgeable/managed_two/expected_2 +0 -0
  263. data/spec/fixtures/unit/util/purgeable/managed_two/unmanaged_2 +0 -0
  264. data/spec/fixtures/unit/util/subprocess/runner/no-execute.sh +3 -0
  265. data/spec/integration/git/rugged/bare_repository_spec.rb +13 -0
  266. data/spec/integration/git/rugged/thin_repository_spec.rb +14 -0
  267. data/spec/integration/git/rugged/working_repository_spec.rb +48 -0
  268. data/spec/integration/git/shellgit/bare_repository_spec.rb +13 -0
  269. data/spec/integration/git/shellgit/thin_repository_spec.rb +14 -0
  270. data/spec/integration/git/shellgit/working_repository_spec.rb +13 -0
  271. data/spec/integration/git/stateful_repository_spec.rb +159 -0
  272. data/spec/matchers/exit_with.rb +28 -0
  273. data/spec/matchers/match_realpath.rb +18 -0
  274. data/spec/r10k-mocks.rb +3 -0
  275. data/spec/r10k-mocks/mock_config.rb +33 -0
  276. data/spec/r10k-mocks/mock_env.rb +15 -0
  277. data/spec/r10k-mocks/mock_source.rb +13 -0
  278. data/spec/shared-contexts/git-fixtures.rb +55 -0
  279. data/spec/shared-examples/deploy-actions.rb +69 -0
  280. data/spec/shared-examples/git-repository.rb +38 -0
  281. data/spec/shared-examples/git/bare_repository.rb +132 -0
  282. data/spec/shared-examples/git/thin_repository.rb +26 -0
  283. data/spec/shared-examples/git/working_repository.rb +207 -0
  284. data/spec/shared-examples/puppetfile-action.rb +39 -0
  285. data/spec/shared-examples/settings/ancestry.rb +44 -0
  286. data/spec/shared-examples/subprocess-runner.rb +83 -0
  287. data/spec/spec_helper.rb +40 -0
  288. data/spec/unit/action/cri_runner_spec.rb +72 -0
  289. data/spec/unit/action/deploy/deploy_helpers_spec.rb +38 -0
  290. data/spec/unit/action/deploy/display_spec.rb +31 -0
  291. data/spec/unit/action/deploy/environment_spec.rb +395 -0
  292. data/spec/unit/action/deploy/module_spec.rb +139 -0
  293. data/spec/unit/action/puppetfile/check_spec.rb +41 -0
  294. data/spec/unit/action/puppetfile/cri_runner_spec.rb +47 -0
  295. data/spec/unit/action/puppetfile/install_spec.rb +84 -0
  296. data/spec/unit/action/puppetfile/purge_spec.rb +42 -0
  297. data/spec/unit/action/runner_spec.rb +213 -0
  298. data/spec/unit/action/visitor_spec.rb +39 -0
  299. data/spec/unit/cli_spec.rb +9 -0
  300. data/spec/unit/deployment/config_spec.rb +33 -0
  301. data/spec/unit/deployment_spec.rb +162 -0
  302. data/spec/unit/environment/base_spec.rb +109 -0
  303. data/spec/unit/environment/git_spec.rb +97 -0
  304. data/spec/unit/environment/name_spec.rb +135 -0
  305. data/spec/unit/environment/svn_spec.rb +133 -0
  306. data/spec/unit/errors/formatting_spec.rb +84 -0
  307. data/spec/unit/feature_spec.rb +50 -0
  308. data/spec/unit/forge/module_release_spec.rb +213 -0
  309. data/spec/unit/git/alternates_spec.rb +116 -0
  310. data/spec/unit/git/cache_spec.rb +55 -0
  311. data/spec/unit/git/rugged/cache_spec.rb +29 -0
  312. data/spec/unit/git/rugged/credentials_spec.rb +109 -0
  313. data/spec/unit/git/shellgit/cache_spec.rb +27 -0
  314. data/spec/unit/git/stateful_repository_spec.rb +40 -0
  315. data/spec/unit/git_spec.rb +102 -0
  316. data/spec/unit/initializers_spec.rb +68 -0
  317. data/spec/unit/instance_cache_spec.rb +78 -0
  318. data/spec/unit/keyed_factory_spec.rb +51 -0
  319. data/spec/unit/logging/terminaloutputter_spec.rb +53 -0
  320. data/spec/unit/logging_spec.rb +68 -0
  321. data/spec/unit/module/base_spec.rb +72 -0
  322. data/spec/unit/module/forge_spec.rb +207 -0
  323. data/spec/unit/module/git_spec.rb +274 -0
  324. data/spec/unit/module/metadata_file_spec.rb +68 -0
  325. data/spec/unit/module/svn_spec.rb +178 -0
  326. data/spec/unit/module_spec.rb +29 -0
  327. data/spec/unit/puppetfile_spec.rb +300 -0
  328. data/spec/unit/settings/collection_spec.rb +123 -0
  329. data/spec/unit/settings/container_spec.rb +92 -0
  330. data/spec/unit/settings/definition_spec.rb +79 -0
  331. data/spec/unit/settings/enum_definition_spec.rb +20 -0
  332. data/spec/unit/settings/inheritance_spec.rb +38 -0
  333. data/spec/unit/settings/list_spec.rb +88 -0
  334. data/spec/unit/settings/loader_spec.rb +110 -0
  335. data/spec/unit/settings/uri_definition_spec.rb +23 -0
  336. data/spec/unit/settings_spec.rb +246 -0
  337. data/spec/unit/source/base_spec.rb +31 -0
  338. data/spec/unit/source/exec_spec.rb +81 -0
  339. data/spec/unit/source/git_spec.rb +185 -0
  340. data/spec/unit/source/hash_spec.rb +54 -0
  341. data/spec/unit/source/svn_spec.rb +196 -0
  342. data/spec/unit/source/yaml_spec.rb +42 -0
  343. data/spec/unit/source_spec.rb +10 -0
  344. data/spec/unit/svn/remote_spec.rb +21 -0
  345. data/spec/unit/svn/working_dir_spec.rb +56 -0
  346. data/spec/unit/util/attempt_spec.rb +82 -0
  347. data/spec/unit/util/commands_spec.rb +61 -0
  348. data/spec/unit/util/exec_env_spec.rb +56 -0
  349. data/spec/unit/util/purgeable_spec.rb +230 -0
  350. data/spec/unit/util/setopts_spec.rb +59 -0
  351. data/spec/unit/util/subprocess/result_spec.rb +36 -0
  352. data/spec/unit/util/subprocess/runner/posix_spec.rb +7 -0
  353. data/spec/unit/util/subprocess/runner/pump_spec.rb +79 -0
  354. data/spec/unit/util/subprocess/runner/windows_spec.rb +7 -0
  355. data/spec/unit/util/subprocess/subprocess_error_spec.rb +26 -0
  356. data/spec/unit/util/subprocess_spec.rb +65 -0
  357. data/spec/unit/util/symbolize_keys_spec.rb +67 -0
  358. metadata +582 -0
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+ require 'r10k/module'
3
+
4
+ describe R10K::Module do
5
+ describe 'delegating to R10K::Module::Git' do
6
+ it "accepts args {:git => 'git url}" do
7
+ obj = R10K::Module.new('foo', '/modulepath', :git => 'git url')
8
+ expect(obj).to be_a_kind_of(R10K::Module::Git)
9
+ end
10
+ end
11
+
12
+ describe 'delegating to R10K::Module::Forge' do
13
+ [
14
+ ['bar/quux', nil],
15
+ ['bar-quux', nil],
16
+ ['bar/quux', '8.0.0'],
17
+ ].each do |scenario|
18
+ it "accepts a name matching #{scenario[0]} and args #{scenario[1].inspect}" do
19
+ expect(R10K::Module.new(scenario[0], '/modulepath', scenario[1])).to be_a_kind_of(R10K::Module::Forge)
20
+ end
21
+ end
22
+ end
23
+
24
+ it "raises an error if delegation fails" do
25
+ expect {
26
+ R10K::Module.new('bar!quux', '/modulepath', ["NOPE NOPE NOPE NOPE!"])
27
+ }.to raise_error RuntimeError, /doesn't have an implementation/
28
+ end
29
+ end
@@ -0,0 +1,300 @@
1
+ require 'spec_helper'
2
+ require 'r10k/puppetfile'
3
+
4
+ describe R10K::Puppetfile do
5
+
6
+ subject do
7
+ described_class.new(
8
+ '/some/nonexistent/basedir',
9
+ nil,
10
+ nil,
11
+ 'Puppetfile.r10k'
12
+ )
13
+ end
14
+
15
+ describe "a custom puppetfile Puppetfile.r10k" do
16
+ it "is the basedir joined with '/Puppetfile.r10k' path" do
17
+ expect(subject.puppetfile_path).to eq '/some/nonexistent/basedir/Puppetfile.r10k'
18
+ end
19
+ end
20
+
21
+ end
22
+
23
+ describe R10K::Puppetfile do
24
+
25
+ subject do
26
+ described_class.new(
27
+ '/some/nonexistent/basedir'
28
+ )
29
+ end
30
+
31
+ describe "the default moduledir" do
32
+ it "is the basedir joined with '/modules' path" do
33
+ expect(subject.moduledir).to eq '/some/nonexistent/basedir/modules'
34
+ end
35
+ end
36
+
37
+ describe "the default puppetfile" do
38
+ it "is the basedir joined with '/Puppetfile' path" do
39
+ expect(subject.puppetfile_path).to eq '/some/nonexistent/basedir/Puppetfile'
40
+ end
41
+ end
42
+
43
+
44
+ describe "setting moduledir" do
45
+ it "changes to given moduledir if it is an absolute path" do
46
+ subject.set_moduledir('/absolute/path/moduledir')
47
+ expect(subject.moduledir).to eq '/absolute/path/moduledir'
48
+ end
49
+
50
+ it "joins the basedir with the given moduledir if it is a relative path" do
51
+ subject.set_moduledir('relative/moduledir')
52
+ expect(subject.moduledir).to eq '/some/nonexistent/basedir/relative/moduledir'
53
+ end
54
+ end
55
+
56
+ describe "adding modules" do
57
+ it "should accept Forge modules with a string arg" do
58
+ allow(R10K::Module).to receive(:new).with('puppet/test_module', subject.moduledir, '1.2.3', anything).and_call_original
59
+
60
+ expect { subject.add_module('puppet/test_module', '1.2.3') }.to change { subject.modules }
61
+ expect(subject.modules.collect(&:name)).to include('test_module')
62
+ end
63
+
64
+ it "should not accept Forge modules with a version comparison" do
65
+ allow(R10K::Module).to receive(:new).with('puppet/test_module', subject.moduledir, '< 1.2.0', anything).and_call_original
66
+
67
+ expect {
68
+ subject.add_module('puppet/test_module', '< 1.2.0')
69
+ }.to raise_error(RuntimeError, /module puppet\/test_module.*doesn't have an implementation/i)
70
+
71
+ expect(subject.modules.collect(&:name)).not_to include('test_module')
72
+ end
73
+
74
+ it "should accept non-Forge modules with a hash arg" do
75
+ module_opts = { git: 'git@example.com:puppet/test_module.git' }
76
+
77
+ allow(R10K::Module).to receive(:new).with('puppet/test_module', subject.moduledir, module_opts, anything).and_call_original
78
+
79
+ expect { subject.add_module('puppet/test_module', module_opts) }.to change { subject.modules }
80
+ expect(subject.modules.collect(&:name)).to include('test_module')
81
+ end
82
+
83
+ it "should accept non-Forge modules with a valid relative :install_path option" do
84
+ module_opts = {
85
+ install_path: 'vendor',
86
+ git: 'git@example.com:puppet/test_module.git',
87
+ }
88
+
89
+ allow(R10K::Module).to receive(:new).with('puppet/test_module', File.join(subject.basedir, 'vendor'), module_opts, anything).and_call_original
90
+
91
+ expect { subject.add_module('puppet/test_module', module_opts) }.to change { subject.modules }
92
+ expect(subject.modules.collect(&:name)).to include('test_module')
93
+ end
94
+
95
+ it "should accept non-Forge modules with a valid absolute :install_path option" do
96
+ install_path = File.join(subject.basedir, 'vendor')
97
+
98
+ module_opts = {
99
+ install_path: install_path,
100
+ git: 'git@example.com:puppet/test_module.git',
101
+ }
102
+
103
+ allow(R10K::Module).to receive(:new).with('puppet/test_module', install_path, module_opts, anything).and_call_original
104
+
105
+ expect { subject.add_module('puppet/test_module', module_opts) }.to change { subject.modules }
106
+ expect(subject.modules.collect(&:name)).to include('test_module')
107
+ end
108
+
109
+ it "should reject non-Forge modules with an invalid relative :install_path option" do
110
+ module_opts = {
111
+ install_path: '../../vendor',
112
+ git: 'git@example.com:puppet/test_module.git',
113
+ }
114
+
115
+ allow(R10K::Module).to receive(:new).with('puppet/test_module', File.join(subject.basedir, 'vendor'), module_opts, anything).and_call_original
116
+
117
+ expect { subject.add_module('puppet/test_module', module_opts) }.to raise_error(R10K::Error, /cannot manage content.*is not within/i).and not_change { subject.modules }
118
+ end
119
+
120
+ it "should reject non-Forge modules with an invalid absolute :install_path option" do
121
+ module_opts = {
122
+ install_path: '/tmp/mydata/vendor',
123
+ git: 'git@example.com:puppet/test_module.git',
124
+ }
125
+
126
+ allow(R10K::Module).to receive(:new).with('puppet/test_module', File.join(subject.basedir, 'vendor'), module_opts, anything).and_call_original
127
+
128
+ expect { subject.add_module('puppet/test_module', module_opts) }.to raise_error(R10K::Error, /cannot manage content.*is not within/i).and not_change { subject.modules }
129
+ end
130
+ end
131
+
132
+ describe "#purge_exclusions" do
133
+ let(:managed_dirs) { ['dir1', 'dir2'] }
134
+
135
+ before(:each) do
136
+ allow(subject).to receive(:managed_directories).and_return(managed_dirs)
137
+ end
138
+
139
+ it "includes managed_directories" do
140
+ expect(subject.purge_exclusions).to match_array(managed_dirs)
141
+ end
142
+
143
+ context "when belonging to an environment" do
144
+ let(:env_contents) { ['env1', 'env2' ] }
145
+
146
+ before(:each) do
147
+ mock_env = double(:environment, desired_contents: env_contents)
148
+ allow(subject).to receive(:environment).and_return(mock_env)
149
+ end
150
+
151
+ it "includes environment's desired_contents" do
152
+ expect(subject.purge_exclusions).to match_array(managed_dirs + env_contents)
153
+ end
154
+ end
155
+ end
156
+
157
+ describe "evaluating a Puppetfile" do
158
+ def expect_wrapped_error(orig, pf_path, wrapped_error)
159
+ expect(orig).to be_a_kind_of(R10K::Error)
160
+ expect(orig.message).to eq("Failed to evaluate #{pf_path}")
161
+ expect(orig.original).to be_a_kind_of(wrapped_error)
162
+ end
163
+
164
+ it "wraps and re-raises syntax errors" do
165
+ path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'invalid-syntax')
166
+ pf_path = File.join(path, 'Puppetfile')
167
+ subject = described_class.new(path)
168
+ expect {
169
+ subject.load!
170
+ }.to raise_error do |e|
171
+ expect_wrapped_error(e, pf_path, SyntaxError)
172
+ end
173
+ end
174
+
175
+ it "wraps and re-raises load errors" do
176
+ path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'load-error')
177
+ pf_path = File.join(path, 'Puppetfile')
178
+ subject = described_class.new(path)
179
+ expect {
180
+ subject.load!
181
+ }.to raise_error do |e|
182
+ expect_wrapped_error(e, pf_path, LoadError)
183
+ end
184
+ end
185
+
186
+ it "wraps and re-raises argument errors" do
187
+ path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'argument-error')
188
+ pf_path = File.join(path, 'Puppetfile')
189
+ subject = described_class.new(path)
190
+ expect {
191
+ subject.load!
192
+ }.to raise_error do |e|
193
+ expect_wrapped_error(e, pf_path, ArgumentError)
194
+ end
195
+ end
196
+
197
+ it "rejects Puppetfiles with duplicate module names" do
198
+ path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'duplicate-module-error')
199
+ pf_path = File.join(path, 'Puppetfile')
200
+ subject = described_class.new(path)
201
+ expect {
202
+ subject.load!
203
+ }.to raise_error(R10K::Error, /Puppetfiles cannot contain duplicate module names/i)
204
+ end
205
+
206
+ it "wraps and re-raises name errors" do
207
+ path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'name-error')
208
+ pf_path = File.join(path, 'Puppetfile')
209
+ subject = described_class.new(path)
210
+ expect {
211
+ subject.load!
212
+ }.to raise_error do |e|
213
+ expect_wrapped_error(e, pf_path, NameError)
214
+ end
215
+ end
216
+
217
+ it "accepts a forge module with a version" do
218
+ path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'valid-forge-with-version')
219
+ pf_path = File.join(path, 'Puppetfile')
220
+ subject = described_class.new(path)
221
+ expect { subject.load! }.not_to raise_error
222
+ end
223
+
224
+ it "accepts a forge module without a version" do
225
+ path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'valid-forge-without-version')
226
+ pf_path = File.join(path, 'Puppetfile')
227
+ subject = described_class.new(path)
228
+ expect { subject.load! }.not_to raise_error
229
+ end
230
+
231
+ it "creates a git module and applies the default branch sepcified in the Puppetfile" do
232
+ path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'default-branch-override')
233
+ pf_path = File.join(path, 'Puppetfile')
234
+ subject = described_class.new(path)
235
+ expect { subject.load! }.not_to raise_error
236
+ git_module = subject.modules[0]
237
+ expect(git_module.default_ref).to eq 'here_lies_the_default_branch'
238
+ end
239
+
240
+ it "creates a git module and applies the provided default_branch_override" do
241
+ path = File.join(PROJECT_ROOT, 'spec', 'fixtures', 'unit', 'puppetfile', 'default-branch-override')
242
+ pf_path = File.join(path, 'Puppetfile')
243
+ subject = described_class.new(path)
244
+ default_branch_override = 'default_branch_override_name'
245
+ expect { subject.load!(default_branch_override) }.not_to raise_error
246
+ git_module = subject.modules[0]
247
+ expect(git_module.default_ref).to eq default_branch_override
248
+ end
249
+ end
250
+
251
+ describe "accepting a visitor" do
252
+ it "passes itself to the visitor" do
253
+ visitor = spy('visitor')
254
+ expect(visitor).to receive(:visit).with(:puppetfile, subject)
255
+ subject.accept(visitor)
256
+ end
257
+
258
+ it "passes the visitor to each module if the visitor yields" do
259
+ visitor = spy('visitor')
260
+ expect(visitor).to receive(:visit) do |type, other, &block|
261
+ expect(type).to eq :puppetfile
262
+ expect(other).to eq subject
263
+ block.call
264
+ end
265
+
266
+ mod1 = spy('module')
267
+ expect(mod1).to receive(:accept).with(visitor)
268
+ mod2 = spy('module')
269
+ expect(mod2).to receive(:accept).with(visitor)
270
+
271
+ expect(subject).to receive(:modules).and_return([mod1, mod2])
272
+ subject.accept(visitor)
273
+ end
274
+
275
+ it "creates a thread pool to visit concurrently if pool_size setting is greater than one" do
276
+ pool_size = 3
277
+
278
+ subject.settings[:pool_size] = pool_size
279
+
280
+ visitor = spy('visitor')
281
+ expect(visitor).to receive(:visit) do |type, other, &block|
282
+ expect(type).to eq :puppetfile
283
+ expect(other).to eq subject
284
+ block.call
285
+ end
286
+
287
+ mod1 = spy('module')
288
+ expect(mod1).to receive(:accept).with(visitor)
289
+ mod2 = spy('module')
290
+ expect(mod2).to receive(:accept).with(visitor)
291
+
292
+ expect(subject).to receive(:modules).and_return([mod1, mod2])
293
+
294
+ expect(Thread).to receive(:new).exactly(pool_size).and_call_original
295
+ expect(Queue).to receive(:new).and_call_original
296
+
297
+ subject.accept(visitor)
298
+ end
299
+ end
300
+ end
@@ -0,0 +1,123 @@
1
+ require 'spec_helper'
2
+ require 'r10k/settings/collection'
3
+ require 'r10k/settings/definition'
4
+
5
+ describe R10K::Settings::Collection do
6
+
7
+ let(:symbol_defn) { R10K::Settings::Definition.new(:symbol_defn, :validate => lambda { |x| raise TypeError unless x.is_a?(Symbol) }) }
8
+ let(:default_defn) { R10K::Settings::Definition.new(:default_defn, :default => lambda { "Defaults are fun" }) }
9
+
10
+ subject do
11
+ described_class.new(:collection, [symbol_defn, default_defn])
12
+ end
13
+
14
+ it_behaves_like "a setting with ancestors"
15
+
16
+ describe "#evaluate" do
17
+ it "assigns values, validates them, and resolves a final value" do
18
+ expect(subject).to receive(:assign).with({:default_defn => :squid})
19
+ expect(subject).to receive(:validate)
20
+ expect(subject).to receive(:resolve)
21
+ subject.evaluate({:default_defn => :squid})
22
+ end
23
+ end
24
+
25
+ describe '#assign' do
26
+ it "assigns values to the appropriate setting" do
27
+ subject.assign({:symbol_defn => :hello})
28
+ expect(symbol_defn.value).to eq :hello
29
+ end
30
+
31
+ it "can accept invalid settings" do
32
+ subject.assign({:hardly_a_setting => "nope nope nope"})
33
+ end
34
+
35
+ it "silently ignores attempts to assign nil" do
36
+ subject.assign(nil)
37
+ end
38
+ end
39
+
40
+ describe '#validate' do
41
+ it "raises an error containing a hash of nested validation errors" do
42
+ subject.assign({:symbol_defn => "Definitely not a symbol"})
43
+ expect {
44
+ errors = subject.validate
45
+ }.to raise_error do |error|
46
+ expect(error).to be_a_kind_of(R10K::Settings::Collection::ValidationError)
47
+ errors = error.errors
48
+ expect(errors.size).to eq 1
49
+ expect(errors[:symbol_defn]).to be_a_kind_of(TypeError)
50
+ end
51
+ end
52
+
53
+ it "it does not raise an error if no errors were found" do
54
+ subject.assign({:default_defn => "yep"})
55
+ expect(subject.validate).to be_nil
56
+ end
57
+ end
58
+
59
+ describe '#resolve' do
60
+ it "returns a frozen hash of all settings" do
61
+ subject.assign({:symbol_defn => :some_value})
62
+ rv = subject.resolve
63
+ expect(rv).to be_frozen
64
+ expect(rv).to eq({:symbol_defn => :some_value, :default_defn => "Defaults are fun"})
65
+ end
66
+ end
67
+ end
68
+
69
+ describe R10K::Settings::Collection::ValidationError do
70
+
71
+
72
+ let(:flat_errors) do
73
+ described_class.new("Validation failures for some group", errors: {
74
+ some_defn: ArgumentError.new("some_defn is wrong, somehow."),
75
+ uri_setting: ArgumentError.new("uri_setting NOTAURI is not a URI.")
76
+ })
77
+ end
78
+
79
+ let(:flat_error_text) do
80
+ [
81
+ "Validation failures for some group:",
82
+ " some_defn:",
83
+ " some_defn is wrong, somehow.",
84
+ " uri_setting:",
85
+ " uri_setting NOTAURI is not a URI."]
86
+ .join("\n")
87
+ end
88
+
89
+ let(:nested_errors) do
90
+ described_class.new("Validation failures for some nesting group", errors: {
91
+ file_setting: ArgumentError.new("file_setting is a potato, not a file."),
92
+ nested: flat_errors
93
+ })
94
+ end
95
+
96
+ let(:nested_error_text) do
97
+ [
98
+ "Validation failures for some nesting group:",
99
+ " file_setting:",
100
+ " file_setting is a potato, not a file.",
101
+ " nested:",
102
+ " Validation failures for some group:",
103
+ " some_defn:",
104
+ " some_defn is wrong, somehow.",
105
+ " uri_setting:",
106
+ " uri_setting NOTAURI is not a URI."
107
+ ].join("\n")
108
+ end
109
+
110
+ describe "formatting a human readable error message" do
111
+ describe "no with no nested validation errors" do
112
+ it "generates a human readable set of validation errors." do
113
+ expect(flat_errors.format).to eq flat_error_text
114
+ end
115
+ end
116
+
117
+ describe "with nested validation errors" do
118
+ it "generates a human readable set of validation errors." do
119
+ expect(nested_errors.format).to eq nested_error_text
120
+ end
121
+ end
122
+ end
123
+ end