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,92 @@
1
+ require 'spec_helper'
2
+
3
+ require 'r10k/settings'
4
+
5
+ describe R10K::Settings::Container do
6
+
7
+ describe 'validating keys' do
8
+ it 'can add new valid keys' do
9
+ subject.add_valid_key(:v)
10
+ subject[:v]
11
+ end
12
+
13
+ it 'can check if a key is valid' do
14
+ subject.add_valid_key(:v)
15
+ expect(subject.valid_key?(:v)).to be_truthy
16
+ end
17
+
18
+ it 'can list all valid keys' do
19
+ subject.add_valid_key(:v)
20
+ subject.add_valid_key(:w)
21
+
22
+ expect(subject.valid_keys).to include :v
23
+ expect(subject.valid_keys).to include :w
24
+ end
25
+ end
26
+
27
+ describe 'specifying settings' do
28
+ it 'fails if a setting application uses an invalid key' do
29
+ expect { subject[:invalid] = 'fail' }.to raise_error R10K::Settings::Container::InvalidKey
30
+ end
31
+
32
+ it 'can look up values that it sets' do
33
+ subject.add_valid_key :v
34
+ subject[:v] = 'set'
35
+ expect(subject[:v]).to eq 'set'
36
+ end
37
+ end
38
+
39
+ describe 'looking up settings' do
40
+ before do
41
+ subject.add_valid_key :v
42
+ end
43
+
44
+ it 'fails if a setting lookup uses an invalid key' do
45
+ expect { subject[:invalid] }.to raise_error R10K::Settings::Container::InvalidKey
46
+ end
47
+
48
+ it 'returns nil if a key is valid but no setting is present' do
49
+ expect(subject[:v]).to be_nil
50
+ end
51
+
52
+ describe 'with a parent container' do
53
+ let(:parent) { described_class.new.tap { |p| p.add_valid_key :v } }
54
+ subject { described_class.new(parent) }
55
+
56
+ it 'uses its setting over a parent value' do
57
+ subject[:v] = 'child'
58
+ parent[:v] = 'parent'
59
+ expect(subject[:v]).to eq 'child'
60
+ end
61
+
62
+ it 'duplicates and stores the parent object to avoid modifying the parent object' do
63
+ parent[:v] = {}
64
+ subject[:v][:hello] = "world"
65
+ expect(subject[:v]).to eq({hello: "world"})
66
+ expect(parent[:v]).to eq({})
67
+ end
68
+
69
+ it 'falls back to the parent value if it does not have a value' do
70
+ parent[:v] = 'parent'
71
+ expect(subject[:v]).to eq 'parent'
72
+ end
73
+ end
74
+ end
75
+
76
+ describe "resetting" do
77
+ before do
78
+ subject.add_valid_key :v
79
+ end
80
+
81
+ it "unsets all settings" do
82
+ subject[:v] = "hi"
83
+ subject.reset!
84
+ expect(subject[:v]).to be_nil
85
+ end
86
+
87
+ it "doesn't remove valid values" do
88
+ subject.reset!
89
+ expect(subject.valid_key?(:v)).to be_truthy
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,79 @@
1
+ require 'spec_helper'
2
+ require 'r10k/settings/definition'
3
+ require 'r10k/settings/collection'
4
+ require 'r10k/settings/list'
5
+
6
+ describe R10K::Settings::Definition do
7
+ subject { described_class.new(:setting) }
8
+
9
+ it_behaves_like "a setting with ancestors"
10
+
11
+ describe "#evaluate" do
12
+ it "assigns a value, validates it, and resolves a final value" do
13
+ expect(subject).to receive(:assign).with("myvalue")
14
+ expect(subject).to receive(:validate)
15
+ expect(subject).to receive(:resolve)
16
+ subject.evaluate("myvalue")
17
+ end
18
+ end
19
+
20
+ describe "#assign" do
21
+ it 'stores the provided value' do
22
+ subject.assign("I'm the value")
23
+ expect(subject.value).to eq "I'm the value"
24
+ end
25
+
26
+ it "normalizes the stored value when a normalize hook is set" do
27
+ subject = described_class.new(:setting, :normalize => lambda { |input| input.to_sym })
28
+ subject.assign("symbolizeme")
29
+ expect(subject.value).to eq :symbolizeme
30
+ end
31
+ end
32
+
33
+ describe "#validate" do
34
+ it "does nothing if a value has not been assigned" do
35
+ subject = described_class.new(:setting, :validate => lambda { |_| raise "Shouldn't be called" })
36
+ subject.validate
37
+ end
38
+
39
+ it "does nothing if a validate hook has not been assigned" do
40
+ subject.assign("I'm the value")
41
+ subject.validate
42
+ end
43
+
44
+ it "raises up errors raised from the validate hook" do
45
+ subject = described_class.new(:satellite, :validate => lambda { |input| raise ArgumentError, "Invalid value #{input}: that's no moon!" })
46
+ subject.assign("Alderaan")
47
+ expect {
48
+ subject.validate
49
+ }.to raise_error(ArgumentError, "Invalid value Alderaan: that's no moon!")
50
+ end
51
+
52
+ it "returns if the validate hook did not raise an error" do
53
+ subject = described_class.new(:setting, :validate => lambda { |_| "That's a moon" })
54
+ subject.assign("Mun")
55
+ subject.validate
56
+ end
57
+ end
58
+
59
+ describe "#resolve" do
60
+ it "returns the value when the value has been given" do
61
+ subject.assign("Mun")
62
+ expect(subject.resolve).to eq "Mun"
63
+ end
64
+
65
+ it "resolves the default when the default is a proc" do
66
+ subject = described_class.new(:setting, :default => lambda { "Minmus" })
67
+ expect(subject.resolve).to eq "Minmus"
68
+ end
69
+
70
+ it "returns the default when the default is not a proc" do
71
+ subject = described_class.new(:setting, :default => "Ike")
72
+ expect(subject.resolve).to eq "Ike"
73
+ end
74
+
75
+ it "returns nil when there is no value nor default" do
76
+ expect(subject.resolve).to be_nil
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,20 @@
1
+ require 'spec_helper'
2
+ require 'r10k/settings/enum_definition'
3
+
4
+ describe R10K::Settings::EnumDefinition do
5
+
6
+ subject { described_class.new(:enum, :enum => %w[one two three]) }
7
+
8
+ describe '#validate' do
9
+ it "doesn't raise an error when given an expected value" do
10
+ subject.assign('two')
11
+ subject.validate
12
+ end
13
+ it "raises an error when given a value outside the enum" do
14
+ subject.assign('dos')
15
+ expect {
16
+ subject.validate
17
+ }.to raise_error(ArgumentError, "Setting enum should be one of #{%w[one two three].inspect}, not 'dos'")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+ require 'r10k/settings/collection'
3
+ require 'r10k/settings/definition'
4
+
5
+ RSpec.describe 'R10K::Settings inheritance' do
6
+ subject do
7
+ R10K::Settings::Collection.new(:parent_settings, [
8
+ R10K::Settings::Definition.new(:banana, {
9
+ :default => 'cavendish',
10
+ }),
11
+
12
+ R10K::Settings::Collection.new(:child_settings, [
13
+ R10K::Settings::Definition.new(:banana, {
14
+ :default => :inherit,
15
+ }),
16
+ ]),
17
+ ])
18
+ end
19
+
20
+ describe "child settings" do
21
+ let(:setting) { subject[:child_settings][:banana] }
22
+
23
+ context "when child value is not set" do
24
+ it "should resolve to default value from parent" do
25
+ expect(setting.value).to be_nil
26
+ expect(setting.resolve).to eq 'cavendish'
27
+ end
28
+ end
29
+
30
+ context "when child value is set" do
31
+ before(:each) { setting.assign('gros michel') }
32
+
33
+ it "should resolve to child value" do
34
+ expect(setting.resolve).to eq 'gros michel'
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,88 @@
1
+ require 'spec_helper'
2
+ require 'r10k/settings/list'
3
+ require 'r10k/settings/collection'
4
+ require 'r10k/settings/definition'
5
+ require 'r10k/settings/uri_definition'
6
+
7
+ describe R10K::Settings::List do
8
+ let(:item_proc) do
9
+ lambda { R10K::Settings::URIDefinition.new(nil, { :desc => "A URI in a list" }) }
10
+ end
11
+
12
+ subject do
13
+ described_class.new(:test_list, item_proc, { :desc => "A test setting list" })
14
+ end
15
+
16
+ it_behaves_like "a setting with ancestors"
17
+
18
+ describe '#assign' do
19
+ it "calls item_proc for each item assigned" do
20
+ expect(R10K::Settings::URIDefinition).to receive(:new).and_call_original.exactly(3).times
21
+
22
+ subject.assign([ "uri_1", "uri_2", "uri_3"])
23
+ end
24
+
25
+ it "claims ownership of newly added items" do
26
+ subject.assign([ "uri_1", "uri_2", "uri_3"])
27
+
28
+ item_parents = subject.instance_variable_get(:@items).collect { |i| i.parent }
29
+ expect(item_parents).to all(eq subject)
30
+ end
31
+
32
+ it "assigns value to each item" do
33
+ new_values = [ "uri_1", "uri_2", "uri_3"]
34
+ subject.assign(new_values)
35
+
36
+ item_values = subject.instance_variable_get(:@items).collect { |i| i.value }
37
+ expect(item_values).to eq new_values
38
+ end
39
+
40
+ it "silently ignores attempts to assign nil" do
41
+ subject.assign(nil)
42
+ end
43
+ end
44
+
45
+ describe '#validate' do
46
+ it "raises an error containing a list of every item with validation errors" do
47
+ subject.assign([ "uri 1", "uri 2", "http://www.example.com"])
48
+
49
+ expect { subject.validate }.to raise_error do |error|
50
+ expect(error).to be_a_kind_of(R10K::Settings::List::ValidationError)
51
+ errors = error.errors.collect { |key, val| val }
52
+ expect(errors.size).to eq 2
53
+ expect(errors).to all(be_a_kind_of(ArgumentError))
54
+ expect(errors.collect { |e| e.message }).to all(match /requires a URL.*could not be parsed/i)
55
+ end
56
+ end
57
+
58
+ it "it does not raise an error if no errors were found" do
59
+ subject.assign([ "http://www.example.com" ])
60
+ expect(subject.validate).to be_nil
61
+ end
62
+ end
63
+
64
+ describe '#resolve' do
65
+ it "returns a frozen list of all items" do
66
+ subject.assign([ "uri_1", "uri_2" ])
67
+
68
+ rv = subject.resolve
69
+
70
+ expect(rv).to be_frozen
71
+ expect(rv).to eq([ "uri_1", "uri_2" ])
72
+ end
73
+ end
74
+ end
75
+
76
+ describe R10K::Settings::List::ValidationError do
77
+ subject do
78
+ described_class.new("Sample List Validation Errors", errors: {
79
+ 2 => ArgumentError.new("Sample List Item Error"),
80
+ })
81
+ end
82
+
83
+ it "generates a human readable error message for the invalid item" do
84
+ message = subject.format
85
+
86
+ expect(message).to match /sample list validation errors.*item 2.*sample list item error/im
87
+ end
88
+ end
@@ -0,0 +1,110 @@
1
+ require 'spec_helper'
2
+ require 'r10k/settings/loader'
3
+
4
+ describe R10K::Settings::Loader do
5
+
6
+ context 'populate_loadpath' do
7
+ it 'includes /etc/puppetlabs/r10k/r10k.yaml in the loadpath' do
8
+ expect(subject.loadpath).to include('/etc/puppetlabs/r10k/r10k.yaml')
9
+ end
10
+
11
+ it 'includes /etc/r10k.yaml in the loadpath' do
12
+ expect(subject.loadpath).to include('/etc/r10k.yaml')
13
+ end
14
+
15
+ it 'does include the current working directory in the loadpath' do
16
+ allow(Dir).to receive(:getwd).and_return '/some/random/path/westvletren'
17
+ expect(subject.loadpath).to include('/some/random/path/westvletren/r10k.yaml')
18
+ end
19
+
20
+ it 'does not include /some/random/path/atomium/r10k.yaml in the loadpath' do
21
+ expect(subject.loadpath).not_to include('/some/random/path/atomium/r10k.yaml')
22
+ end
23
+
24
+ end
25
+
26
+ context 'search' do
27
+ it 'returns the correct default location' do
28
+ allow(File).to receive(:file?).and_return false
29
+ allow(File).to receive(:file?).with('/etc/puppetlabs/r10k/r10k.yaml').and_return true
30
+ allow(File).to receive(:file?).with('/etc/r10k.yaml').and_return true
31
+ expect(subject.search).to eq '/etc/puppetlabs/r10k/r10k.yaml'
32
+ end
33
+
34
+ it 'issues a warning if both default locations are present' do
35
+ allow(File).to receive(:file?).and_return false
36
+ allow(File).to receive(:file?).with('/etc/puppetlabs/r10k/r10k.yaml').and_return true
37
+ allow(File).to receive(:file?).with('/etc/r10k.yaml').and_return true
38
+
39
+ logger_dbl = double('Logging')
40
+ allow(subject).to receive(:logger).and_return logger_dbl
41
+
42
+ expect(logger_dbl).to receive(:warn).with('Both /etc/puppetlabs/r10k/r10k.yaml and /etc/r10k.yaml configuration files exist.')
43
+ expect(logger_dbl).to receive(:warn).with('/etc/puppetlabs/r10k/r10k.yaml will be used.')
44
+
45
+ subject.search
46
+ end
47
+
48
+ it 'issues a warning if the old location is used' do
49
+ allow(File).to receive(:file?).and_return false
50
+ allow(File).to receive(:file?).with('/etc/puppetlabs/r10k/r10k.yaml').and_return false
51
+ allow(File).to receive(:file?).with('/etc/r10k.yaml').and_return true
52
+
53
+ logger_dbl = double('Logging')
54
+ allow(subject).to receive(:logger).and_return logger_dbl
55
+
56
+ expect(logger_dbl).to receive(:warn).with("The r10k configuration file at /etc/r10k.yaml is deprecated.")
57
+ expect(logger_dbl).to receive(:warn).with('Please move your r10k configuration to /etc/puppetlabs/r10k/r10k.yaml.')
58
+
59
+ subject.search
60
+ end
61
+
62
+ describe 'using an override value' do
63
+ it 'uses the override when set and ignores files in the load path' do
64
+ expect(File).to_not receive(:file?)
65
+ expect(subject.search('/some/override/r10k.yaml')).to eq '/some/override/r10k.yaml'
66
+ end
67
+
68
+ it 'ignores a nil override value' do
69
+ allow(File).to receive(:file?).and_return false
70
+ allow(File).to receive(:file?).with('/etc/puppetlabs/r10k/r10k.yaml').and_return true
71
+ allow(File).to receive(:file?).with('/etc/r10k.yaml').and_return true
72
+ expect(subject.search(nil)).to eq('/etc/puppetlabs/r10k/r10k.yaml')
73
+ end
74
+ end
75
+ end
76
+
77
+ context '#read' do
78
+ it "raises an error if no config file could be found" do
79
+ expect(subject).to receive(:search).and_return nil
80
+ expect {
81
+ subject.read
82
+ }.to raise_error(R10K::Settings::Loader::ConfigError, "No configuration file given, no config file found in current directory, and no global config present")
83
+ end
84
+
85
+ it "raises an error if the YAML file load raises an error" do
86
+ expect(subject).to receive(:search).and_return '/some/path/r10k.yaml'
87
+ expect(YAML).to receive(:load_file).and_raise(Errno::ENOENT, "/no/such/file")
88
+ expect {
89
+ subject.read
90
+ }.to raise_error(R10K::Settings::Loader::ConfigError, "Couldn't load config file: No such file or directory - /no/such/file")
91
+ end
92
+
93
+ it "recursively replaces string keys with symbol keys in the parsed structure" do
94
+ expect(subject).to receive(:search).and_return '/some/path/r10k.yaml'
95
+ expect(YAML).to receive(:load_file).and_return({
96
+ 'cachedir' => '/var/cache/r10k',
97
+ 'git' => {
98
+ 'provider' => 'rugged',
99
+ }
100
+ })
101
+
102
+ expect(subject.read).to eq({
103
+ :cachedir => '/var/cache/r10k',
104
+ :git => {
105
+ :provider => 'rugged',
106
+ }
107
+ })
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+ require 'r10k/settings/uri_definition'
3
+
4
+ describe R10K::Settings::URIDefinition do
5
+
6
+ subject { described_class.new(:uri) }
7
+
8
+ it "passes validation if a value has not been set" do
9
+ expect(subject.validate).to be_nil
10
+ end
11
+
12
+ it "passes validation when given a valid url" do
13
+ subject.assign("http://definitely.a/url")
14
+ expect(subject.validate).to be_nil
15
+ end
16
+
17
+ it "raises an error when given an invalid URL" do
18
+ subject.assign("That's no URI!")
19
+ expect {
20
+ subject.validate
21
+ }.to raise_error(ArgumentError, "Setting uri requires a URL but 'That's no URI!' could not be parsed as a URL")
22
+ end
23
+ end