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.
- checksums.yaml +7 -0
- data/.gitattributes +1 -0
- data/.github/pull_request_template.md +1 -0
- data/.github/workflows/docker.yml +56 -0
- data/.github/workflows/release.yml +36 -0
- data/.gitignore +9 -0
- data/.travis.yml +45 -0
- data/CHANGELOG.mkd +1759 -0
- data/CODEOWNERS +2 -0
- data/CONTRIBUTING.mkd +105 -0
- data/Gemfile +15 -0
- data/LICENSE +14 -0
- data/README.mkd +118 -0
- data/Rakefile +3 -0
- data/azure-pipelines.yml +86 -0
- data/bin/r10k +17 -0
- data/doc/common-patterns.mkd +44 -0
- data/doc/dynamic-environments.mkd +31 -0
- data/doc/dynamic-environments/configuration.mkd +669 -0
- data/doc/dynamic-environments/git-environments.mkd +75 -0
- data/doc/dynamic-environments/introduction.mkd +69 -0
- data/doc/dynamic-environments/master-configuration.mkd +40 -0
- data/doc/dynamic-environments/quickstart.mkd +201 -0
- data/doc/dynamic-environments/svn-environments.mkd +45 -0
- data/doc/dynamic-environments/usage.mkd +132 -0
- data/doc/dynamic-environments/workflow-guide.mkd +247 -0
- data/doc/faq.mkd +164 -0
- data/doc/git/cloning-and-mirroring.mkd +60 -0
- data/doc/git/providers.mkd +111 -0
- data/doc/puppetfile.mkd +309 -0
- data/doc/updating-your-puppetfile.mkd +38 -0
- data/docker/.gitignore +1 -0
- data/docker/.rspec +4 -0
- data/docker/Gemfile +11 -0
- data/docker/Makefile +89 -0
- data/docker/README.md +28 -0
- data/docker/r10k/Dockerfile +67 -0
- data/docker/r10k/adduser.sh +13 -0
- data/docker/r10k/docker-entrypoint.d/10-analytics.sh +30 -0
- data/docker/r10k/docker-entrypoint.sh +11 -0
- data/docker/r10k/release.Dockerfile +54 -0
- data/docker/spec/dockerfile_spec.rb +43 -0
- data/docker/spec/fixtures/Puppetfile +2 -0
- data/integration/Gemfile +19 -0
- data/integration/README.mkd +29 -0
- data/integration/Rakefile +77 -0
- data/integration/component/pre-suite/05_install_dev_r10k.rb +12 -0
- data/integration/files/README.mkd +4 -0
- data/integration/files/hiera.yaml +8 -0
- data/integration/files/modules/helloworld/manifests/init.pp +3 -0
- data/integration/files/modules/hieratest/manifests/init.pp +3 -0
- data/integration/files/modules/unicode/files/pretend_unicode +1 -0
- data/integration/files/modules/unicode/manifests/init.pp +6 -0
- data/integration/files/pre-suite/git_config.pp.erb +19 -0
- data/integration/files/pre-suite/prod_env.config +3 -0
- data/integration/files/r10k_conf.yaml.erb +9 -0
- data/integration/lib/README.mkd +4 -0
- data/integration/lib/git_utils.rb +205 -0
- data/integration/lib/master_manipulator.rb +205 -0
- data/integration/lib/r10k_utils.rb +222 -0
- data/integration/manifests/README.mkd +4 -0
- data/integration/pre-suite/00_pe_install.rb +6 -0
- data/integration/pre-suite/10_git_config.rb +48 -0
- data/integration/pre-suite/20_pe_r10k.rb +55 -0
- data/integration/pre-suite/README.mkd +5 -0
- data/integration/tests/Puppetfile/HTTP_PROXY_affects_forge_source.rb +72 -0
- data/integration/tests/Puppetfile/HTTP_PROXY_affects_git_source.rb +70 -0
- data/integration/tests/README.mkd +4 -0
- data/integration/tests/basic_functionality/install_pe_only_module_with_puppetfile.rb +83 -0
- data/integration/tests/basic_functionality/negative/neg_deploy_with_invalid_r10k_yaml.rb +51 -0
- data/integration/tests/basic_functionality/negative/neg_deploy_with_missing_r10k_yaml.rb +28 -0
- data/integration/tests/basic_functionality/negative/neg_invalid_git_provider.rb +45 -0
- data/integration/tests/basic_functionality/negative/negative_bad_proxy.rb +34 -0
- data/integration/tests/basic_functionality/proxy_specified_in_configuration.rb +103 -0
- data/integration/tests/basic_functionality/proxy_with_pe_only_module.rb +128 -0
- data/integration/tests/basic_functionality/proxy_with_puppetfile.rb +61 -0
- data/integration/tests/basic_functionality/rugged_git_provider_with_ssh.rb +109 -0
- data/integration/tests/basic_functionality/rugged_git_provider_without_ssh.rb +108 -0
- data/integration/tests/command_line/deploy_env_without_mod_update.rb +76 -0
- data/integration/tests/command_line/negative/neg_deploy_env_with_module_update.rb +77 -0
- data/integration/tests/command_line/negative/neg_invalid_cmd_line_arg.rb +23 -0
- data/integration/tests/git_source/HTTP_proxy_and_git_source.rb +70 -0
- data/integration/tests/git_source/git_source_git.rb +128 -0
- data/integration/tests/git_source/git_source_ssh.rb +87 -0
- data/integration/tests/git_source/git_source_submodule.rb +70 -0
- data/integration/tests/git_source/negative/neg_git_broken_remote.rb +38 -0
- data/integration/tests/git_source/negative/neg_git_unauthorized_https.rb +46 -0
- data/integration/tests/git_source/negative/neg_git_unauthorized_ssh.rb +73 -0
- data/integration/tests/git_source/negative/neg_git_unicode_branch.rb +35 -0
- data/integration/tests/i18n/deploy_module_with_unicode_in_file_name.rb +64 -0
- data/integration/tests/purging/content_not_purged_at_root.rb +89 -0
- data/integration/tests/purging/default_purging.rb +125 -0
- data/integration/tests/purging/does_not_purge_files_on_white_list.rb +93 -0
- data/integration/tests/purging/invalid_whitelist_types.rb +63 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_1000_branches.rb +66 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module.rb +111 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb +117 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_hiera.rb +100 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_multi_source.rb +133 -0
- data/integration/tests/user_scenario/basic_workflow/multi_source_custom_forge_git_module.rb +161 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_basedir.rb +46 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_forge_module.rb +48 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module.rb +45 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module_ref.rb +43 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_remote.rb +45 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_branch_name_collision.rb +64 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_disk_full.rb +75 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_duplicate_module_names.rb +44 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_inaccessible_forge.rb +58 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_invalid_env_name.rb +34 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_invalid_puppet_file.rb +36 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_module_specified_at_deleted_release.rb +49 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_read_only.rb +58 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb +51 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_10000_files.rb +75 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_git_module.rb +104 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_module.rb +81 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_module.rb +49 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_large_files.rb +75 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_module_already_installed.rb +82 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_module_last_release_deleted.rb +68 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_non-existent_base_dir.rb +94 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_purge_unmanaged_modules.rb +93 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_switch_forge_git_module.rb +117 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_unicode_paths.rb +60 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_upgrade_forge_mod_revert_change.rb +166 -0
- data/integration/tests/user_scenario/complex_workflow/multi_env_add_change_remove.rb +163 -0
- data/integration/tests/user_scenario/complex_workflow/multi_env_remove_re-add.rb +111 -0
- data/integration/tests/user_scenario/complex_workflow/multi_env_unamanaged.rb +78 -0
- data/integration/tests/user_scenario/complex_workflow/single_env_git_module_update.rb +100 -0
- data/lib/r10k.rb +11 -0
- data/lib/r10k/action/base.rb +31 -0
- data/lib/r10k/action/cri_runner.rb +72 -0
- data/lib/r10k/action/deploy.rb +9 -0
- data/lib/r10k/action/deploy/deploy_helpers.rb +34 -0
- data/lib/r10k/action/deploy/display.rb +89 -0
- data/lib/r10k/action/deploy/environment.rb +196 -0
- data/lib/r10k/action/deploy/module.rb +84 -0
- data/lib/r10k/action/puppetfile.rb +10 -0
- data/lib/r10k/action/puppetfile/check.rb +31 -0
- data/lib/r10k/action/puppetfile/cri_runner.rb +26 -0
- data/lib/r10k/action/puppetfile/install.rb +45 -0
- data/lib/r10k/action/puppetfile/purge.rb +28 -0
- data/lib/r10k/action/runner.rb +96 -0
- data/lib/r10k/action/visitor.rb +31 -0
- data/lib/r10k/cli.rb +51 -0
- data/lib/r10k/cli/deploy.rb +114 -0
- data/lib/r10k/cli/ext/logging.rb +15 -0
- data/lib/r10k/cli/help.rb +7 -0
- data/lib/r10k/cli/puppetfile.rb +74 -0
- data/lib/r10k/cli/version.rb +31 -0
- data/lib/r10k/deployment.rb +132 -0
- data/lib/r10k/deployment/config.rb +56 -0
- data/lib/r10k/environment.rb +37 -0
- data/lib/r10k/environment/bare.rb +16 -0
- data/lib/r10k/environment/base.rb +150 -0
- data/lib/r10k/environment/git.rb +81 -0
- data/lib/r10k/environment/name.rb +86 -0
- data/lib/r10k/environment/svn.rb +91 -0
- data/lib/r10k/environment/with_modules.rb +139 -0
- data/lib/r10k/errors.rb +61 -0
- data/lib/r10k/errors/formatting.rb +28 -0
- data/lib/r10k/feature.rb +56 -0
- data/lib/r10k/feature/collection.rb +23 -0
- data/lib/r10k/features.rb +20 -0
- data/lib/r10k/forge/module_release.rb +228 -0
- data/lib/r10k/git.rb +196 -0
- data/lib/r10k/git/alternates.rb +63 -0
- data/lib/r10k/git/cache.rb +108 -0
- data/lib/r10k/git/errors.rb +34 -0
- data/lib/r10k/git/rugged.rb +17 -0
- data/lib/r10k/git/rugged/bare_repository.rb +85 -0
- data/lib/r10k/git/rugged/base_repository.rb +93 -0
- data/lib/r10k/git/rugged/cache.rb +11 -0
- data/lib/r10k/git/rugged/credentials.rb +91 -0
- data/lib/r10k/git/rugged/thin_repository.rb +89 -0
- data/lib/r10k/git/rugged/working_repository.rb +145 -0
- data/lib/r10k/git/shellgit.rb +9 -0
- data/lib/r10k/git/shellgit/bare_repository.rb +43 -0
- data/lib/r10k/git/shellgit/base_repository.rb +137 -0
- data/lib/r10k/git/shellgit/cache.rb +11 -0
- data/lib/r10k/git/shellgit/thin_repository.rb +69 -0
- data/lib/r10k/git/shellgit/working_repository.rb +111 -0
- data/lib/r10k/git/stateful_repository.rb +95 -0
- data/lib/r10k/initializers.rb +67 -0
- data/lib/r10k/instance_cache.rb +32 -0
- data/lib/r10k/keyed_factory.rb +39 -0
- data/lib/r10k/logging.rb +109 -0
- data/lib/r10k/logging/terminaloutputter.rb +36 -0
- data/lib/r10k/module.rb +38 -0
- data/lib/r10k/module/base.rb +113 -0
- data/lib/r10k/module/forge.rb +177 -0
- data/lib/r10k/module/git.rb +109 -0
- data/lib/r10k/module/local.rb +36 -0
- data/lib/r10k/module/metadata_file.rb +31 -0
- data/lib/r10k/module/svn.rb +112 -0
- data/lib/r10k/puppetfile.rb +286 -0
- data/lib/r10k/settings.rb +194 -0
- data/lib/r10k/settings/collection.rb +123 -0
- data/lib/r10k/settings/container.rb +97 -0
- data/lib/r10k/settings/definition.rb +124 -0
- data/lib/r10k/settings/enum_definition.rb +30 -0
- data/lib/r10k/settings/helpers.rb +38 -0
- data/lib/r10k/settings/list.rb +107 -0
- data/lib/r10k/settings/loader.rb +99 -0
- data/lib/r10k/settings/mixin.rb +54 -0
- data/lib/r10k/settings/uri_definition.rb +19 -0
- data/lib/r10k/source.rb +42 -0
- data/lib/r10k/source/base.rb +74 -0
- data/lib/r10k/source/exec.rb +51 -0
- data/lib/r10k/source/git.rb +142 -0
- data/lib/r10k/source/hash.rb +182 -0
- data/lib/r10k/source/svn.rb +136 -0
- data/lib/r10k/source/yaml.rb +20 -0
- data/lib/r10k/source/yamldir.rb +32 -0
- data/lib/r10k/svn.rb +6 -0
- data/lib/r10k/svn/remote.rb +68 -0
- data/lib/r10k/svn/working_dir.rb +125 -0
- data/lib/r10k/util/attempt.rb +84 -0
- data/lib/r10k/util/basedir.rb +65 -0
- data/lib/r10k/util/commands.rb +31 -0
- data/lib/r10k/util/exec_env.rb +36 -0
- data/lib/r10k/util/license.rb +24 -0
- data/lib/r10k/util/platform.rb +42 -0
- data/lib/r10k/util/purgeable.rb +88 -0
- data/lib/r10k/util/setopts.rb +55 -0
- data/lib/r10k/util/subprocess.rb +84 -0
- data/lib/r10k/util/subprocess/result.rb +56 -0
- data/lib/r10k/util/subprocess/runner.rb +26 -0
- data/lib/r10k/util/subprocess/runner/jruby.rb +23 -0
- data/lib/r10k/util/subprocess/runner/posix.rb +103 -0
- data/lib/r10k/util/subprocess/runner/pump.rb +59 -0
- data/lib/r10k/util/subprocess/runner/windows.rb +23 -0
- data/lib/r10k/util/subprocess/subprocess_error.rb +24 -0
- data/lib/r10k/util/symbolize_keys.rb +35 -0
- data/lib/r10k/version.rb +6 -0
- data/locales/config.yaml +21 -0
- data/locales/r10k.pot +545 -0
- data/r10k.gemspec +50 -0
- data/r10k.yaml.example +112 -0
- data/spec/fixtures/empty/.empty +0 -0
- data/spec/fixtures/integration/git/puppet-boolean-bare.tar +0 -0
- data/spec/fixtures/module/forge/bad_module/metadata.json +1 -0
- data/spec/fixtures/module/forge/eight_hundred/Modulefile +8 -0
- data/spec/fixtures/module/forge/eight_hundred/metadata.json +19 -0
- data/spec/fixtures/unit/action/r10k.yaml +5 -0
- data/spec/fixtures/unit/action/r10k_cachedir.yaml +2 -0
- data/spec/fixtures/unit/action/r10k_generate_types.yaml +3 -0
- data/spec/fixtures/unit/action/r10k_puppet_path.yaml +3 -0
- data/spec/fixtures/unit/puppetfile/argument-error/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/default-branch-override/Puppetfile +5 -0
- data/spec/fixtures/unit/puppetfile/duplicate-module-error/Puppetfile +10 -0
- data/spec/fixtures/unit/puppetfile/invalid-syntax/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/load-error/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/name-error/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/valid-forge-with-version/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/valid-forge-without-version/Puppetfile +1 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/expected_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_expected_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_unmanaged_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_two/expected_2 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_two/unmanaged_2 +0 -0
- data/spec/fixtures/unit/util/subprocess/runner/no-execute.sh +3 -0
- data/spec/integration/git/rugged/bare_repository_spec.rb +13 -0
- data/spec/integration/git/rugged/thin_repository_spec.rb +14 -0
- data/spec/integration/git/rugged/working_repository_spec.rb +48 -0
- data/spec/integration/git/shellgit/bare_repository_spec.rb +13 -0
- data/spec/integration/git/shellgit/thin_repository_spec.rb +14 -0
- data/spec/integration/git/shellgit/working_repository_spec.rb +13 -0
- data/spec/integration/git/stateful_repository_spec.rb +159 -0
- data/spec/matchers/exit_with.rb +28 -0
- data/spec/matchers/match_realpath.rb +18 -0
- data/spec/r10k-mocks.rb +3 -0
- data/spec/r10k-mocks/mock_config.rb +33 -0
- data/spec/r10k-mocks/mock_env.rb +15 -0
- data/spec/r10k-mocks/mock_source.rb +13 -0
- data/spec/shared-contexts/git-fixtures.rb +55 -0
- data/spec/shared-examples/deploy-actions.rb +69 -0
- data/spec/shared-examples/git-repository.rb +38 -0
- data/spec/shared-examples/git/bare_repository.rb +132 -0
- data/spec/shared-examples/git/thin_repository.rb +26 -0
- data/spec/shared-examples/git/working_repository.rb +207 -0
- data/spec/shared-examples/puppetfile-action.rb +39 -0
- data/spec/shared-examples/settings/ancestry.rb +44 -0
- data/spec/shared-examples/subprocess-runner.rb +83 -0
- data/spec/spec_helper.rb +40 -0
- data/spec/unit/action/cri_runner_spec.rb +72 -0
- data/spec/unit/action/deploy/deploy_helpers_spec.rb +38 -0
- data/spec/unit/action/deploy/display_spec.rb +31 -0
- data/spec/unit/action/deploy/environment_spec.rb +395 -0
- data/spec/unit/action/deploy/module_spec.rb +139 -0
- data/spec/unit/action/puppetfile/check_spec.rb +41 -0
- data/spec/unit/action/puppetfile/cri_runner_spec.rb +47 -0
- data/spec/unit/action/puppetfile/install_spec.rb +84 -0
- data/spec/unit/action/puppetfile/purge_spec.rb +42 -0
- data/spec/unit/action/runner_spec.rb +213 -0
- data/spec/unit/action/visitor_spec.rb +39 -0
- data/spec/unit/cli_spec.rb +9 -0
- data/spec/unit/deployment/config_spec.rb +33 -0
- data/spec/unit/deployment_spec.rb +162 -0
- data/spec/unit/environment/base_spec.rb +109 -0
- data/spec/unit/environment/git_spec.rb +97 -0
- data/spec/unit/environment/name_spec.rb +135 -0
- data/spec/unit/environment/svn_spec.rb +133 -0
- data/spec/unit/errors/formatting_spec.rb +84 -0
- data/spec/unit/feature_spec.rb +50 -0
- data/spec/unit/forge/module_release_spec.rb +213 -0
- data/spec/unit/git/alternates_spec.rb +116 -0
- data/spec/unit/git/cache_spec.rb +55 -0
- data/spec/unit/git/rugged/cache_spec.rb +29 -0
- data/spec/unit/git/rugged/credentials_spec.rb +109 -0
- data/spec/unit/git/shellgit/cache_spec.rb +27 -0
- data/spec/unit/git/stateful_repository_spec.rb +40 -0
- data/spec/unit/git_spec.rb +102 -0
- data/spec/unit/initializers_spec.rb +68 -0
- data/spec/unit/instance_cache_spec.rb +78 -0
- data/spec/unit/keyed_factory_spec.rb +51 -0
- data/spec/unit/logging/terminaloutputter_spec.rb +53 -0
- data/spec/unit/logging_spec.rb +68 -0
- data/spec/unit/module/base_spec.rb +72 -0
- data/spec/unit/module/forge_spec.rb +207 -0
- data/spec/unit/module/git_spec.rb +274 -0
- data/spec/unit/module/metadata_file_spec.rb +68 -0
- data/spec/unit/module/svn_spec.rb +178 -0
- data/spec/unit/module_spec.rb +29 -0
- data/spec/unit/puppetfile_spec.rb +300 -0
- data/spec/unit/settings/collection_spec.rb +123 -0
- data/spec/unit/settings/container_spec.rb +92 -0
- data/spec/unit/settings/definition_spec.rb +79 -0
- data/spec/unit/settings/enum_definition_spec.rb +20 -0
- data/spec/unit/settings/inheritance_spec.rb +38 -0
- data/spec/unit/settings/list_spec.rb +88 -0
- data/spec/unit/settings/loader_spec.rb +110 -0
- data/spec/unit/settings/uri_definition_spec.rb +23 -0
- data/spec/unit/settings_spec.rb +246 -0
- data/spec/unit/source/base_spec.rb +31 -0
- data/spec/unit/source/exec_spec.rb +81 -0
- data/spec/unit/source/git_spec.rb +185 -0
- data/spec/unit/source/hash_spec.rb +54 -0
- data/spec/unit/source/svn_spec.rb +196 -0
- data/spec/unit/source/yaml_spec.rb +42 -0
- data/spec/unit/source_spec.rb +10 -0
- data/spec/unit/svn/remote_spec.rb +21 -0
- data/spec/unit/svn/working_dir_spec.rb +56 -0
- data/spec/unit/util/attempt_spec.rb +82 -0
- data/spec/unit/util/commands_spec.rb +61 -0
- data/spec/unit/util/exec_env_spec.rb +56 -0
- data/spec/unit/util/purgeable_spec.rb +230 -0
- data/spec/unit/util/setopts_spec.rb +59 -0
- data/spec/unit/util/subprocess/result_spec.rb +36 -0
- data/spec/unit/util/subprocess/runner/posix_spec.rb +7 -0
- data/spec/unit/util/subprocess/runner/pump_spec.rb +79 -0
- data/spec/unit/util/subprocess/runner/windows_spec.rb +7 -0
- data/spec/unit/util/subprocess/subprocess_error_spec.rb +26 -0
- data/spec/unit/util/subprocess_spec.rb +65 -0
- data/spec/unit/util/symbolize_keys_spec.rb +67 -0
- metadata +582 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'r10k/settings/definition'
|
|
2
|
+
|
|
3
|
+
module R10K
|
|
4
|
+
module Settings
|
|
5
|
+
class EnumDefinition < R10K::Settings::Definition
|
|
6
|
+
|
|
7
|
+
def validate
|
|
8
|
+
if @value
|
|
9
|
+
if @multi && @value.respond_to?(:select)
|
|
10
|
+
invalid = @value.select { |val| !@enum.include?(val) }
|
|
11
|
+
|
|
12
|
+
if invalid.size > 0
|
|
13
|
+
raise ArgumentError, _("Setting %{name} may only contain %{enums}; the disallowed values %{invalid} were present") % {name: @name, enums: @enum.inspect, invalid: invalid.inspect}
|
|
14
|
+
end
|
|
15
|
+
else
|
|
16
|
+
if !@enum.include?(@value)
|
|
17
|
+
raise ArgumentError, _("Setting %{name} should be one of %{enums}, not '%{value}'") % {name: @name, enums: @enum.inspect, value: @value}
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def allowed_initialize_opts
|
|
26
|
+
super.merge({:enum => true, :multi => true})
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
require 'r10k/errors'
|
|
2
|
+
require 'r10k/settings/collection'
|
|
3
|
+
|
|
4
|
+
module R10K
|
|
5
|
+
module Settings
|
|
6
|
+
module Helpers
|
|
7
|
+
def self.included(klass)
|
|
8
|
+
klass.send(:include, InstanceMethods)
|
|
9
|
+
klass.send(:extend, ClassMethods)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
module InstanceMethods
|
|
13
|
+
# Assign a parent collection to this setting. Parent may only be
|
|
14
|
+
# assigned once.
|
|
15
|
+
#
|
|
16
|
+
# @param new_parent [R10K::Settings::Collection] Parent collection
|
|
17
|
+
def parent=(new_parent)
|
|
18
|
+
unless @parent.nil?
|
|
19
|
+
raise R10K::Error.new(_("%{class} instances cannot be reassigned to a new parent.") % {class: self.class} )
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
unless new_parent.is_a?(R10K::Settings::Collection) || new_parent.is_a?(R10K::Settings::List)
|
|
23
|
+
raise R10K::Error.new(_("%{class} instances may only belong to a settings collection or list.") % {class: self.class} )
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
@parent = new_parent
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def parent
|
|
30
|
+
@parent
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
module ClassMethods
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
require 'r10k/settings/helpers'
|
|
2
|
+
require 'r10k/settings/collection'
|
|
3
|
+
require 'r10k/errors'
|
|
4
|
+
require 'r10k/util/setopts'
|
|
5
|
+
|
|
6
|
+
module R10K
|
|
7
|
+
module Settings
|
|
8
|
+
|
|
9
|
+
# A container for an arbitrarily long list of other settings.
|
|
10
|
+
class List
|
|
11
|
+
include R10K::Settings::Helpers
|
|
12
|
+
include R10K::Util::Setopts
|
|
13
|
+
|
|
14
|
+
# @!attribute [r] name
|
|
15
|
+
# @return [String] The name of this collection
|
|
16
|
+
attr_reader :name
|
|
17
|
+
|
|
18
|
+
# @param name [Symbol] The name of the setting for this definition.
|
|
19
|
+
# @param item_proc [#call] An object whose #call method will return a
|
|
20
|
+
# new instance of another R10K::Settings class to hold each item
|
|
21
|
+
# added to this list.
|
|
22
|
+
# @param opts [Hash] Additional options for this definition to control
|
|
23
|
+
# validation, normalization, and the like.
|
|
24
|
+
#
|
|
25
|
+
# @options opts [String] :desc Extended description of this setting.
|
|
26
|
+
# @options opts [Array] :default Initial/default contents of the list.
|
|
27
|
+
def initialize(name, item_proc, opts = {})
|
|
28
|
+
@name = name
|
|
29
|
+
@item_proc = item_proc
|
|
30
|
+
@items = []
|
|
31
|
+
|
|
32
|
+
setopts(opts, allowed_initialize_opts)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Takes an array of key/value pairs and assigns each into a
|
|
36
|
+
# new instance created by invoking @item_proc.
|
|
37
|
+
#
|
|
38
|
+
# @param items [Array] List of items to add to this list.
|
|
39
|
+
def assign(items)
|
|
40
|
+
return if items.nil?
|
|
41
|
+
|
|
42
|
+
items.each do |values|
|
|
43
|
+
new_item = @item_proc.call
|
|
44
|
+
new_item.parent = self
|
|
45
|
+
new_item.assign(values)
|
|
46
|
+
@items << new_item
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Validate all items in the list and return validation errors
|
|
51
|
+
#
|
|
52
|
+
# @return [nil, Hash] If all validation passed nil will be returned; if
|
|
53
|
+
# validation failed then a hash of those errors will be returned.
|
|
54
|
+
def validate
|
|
55
|
+
errors = {}
|
|
56
|
+
|
|
57
|
+
@items.each_with_index do |item, idx|
|
|
58
|
+
begin
|
|
59
|
+
item.validate
|
|
60
|
+
rescue => error
|
|
61
|
+
errors[idx+1] = error
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
if !errors.empty?
|
|
66
|
+
raise ValidationError.new(_("Validation failed for '%{name}' settings list") % {name: @name}, :errors => errors)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Evaluate all items in the list and return a frozen array of the final values.
|
|
71
|
+
# @return [Array]
|
|
72
|
+
def resolve
|
|
73
|
+
@items.collect { |item| item.resolve }.freeze
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
class ValidationError < R10K::Error
|
|
77
|
+
attr_reader :errors
|
|
78
|
+
|
|
79
|
+
def initialize(mesg, options = {})
|
|
80
|
+
super
|
|
81
|
+
@errors = options[:errors]
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def format
|
|
85
|
+
struct = []
|
|
86
|
+
struct << "#{message}:"
|
|
87
|
+
@errors.each do |item, error|
|
|
88
|
+
struct << indent(structure_exception("Item #{item}", error))
|
|
89
|
+
end
|
|
90
|
+
struct.join("\n")
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
private
|
|
95
|
+
|
|
96
|
+
# Subclasses may define additional params that are accepted at
|
|
97
|
+
# initialization; they should override this method to add any
|
|
98
|
+
# additional fields that should be respected.
|
|
99
|
+
def allowed_initialize_opts
|
|
100
|
+
{
|
|
101
|
+
:desc => true,
|
|
102
|
+
:default => true,
|
|
103
|
+
}
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
require 'r10k/logging'
|
|
2
|
+
require 'r10k/errors'
|
|
3
|
+
require 'yaml'
|
|
4
|
+
|
|
5
|
+
module R10K
|
|
6
|
+
module Settings
|
|
7
|
+
# Look for the r10k configuration file in standard locations.
|
|
8
|
+
#
|
|
9
|
+
# r10k.yaml is checked for in the following locations:
|
|
10
|
+
# - $PWD/r10k.yaml
|
|
11
|
+
# - /etc/puppetlabs/r10k/r10k.yaml
|
|
12
|
+
# - /etc/r10k.yaml
|
|
13
|
+
class Loader
|
|
14
|
+
|
|
15
|
+
def self.search(override = nil)
|
|
16
|
+
new.search(override)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
include R10K::Logging
|
|
20
|
+
|
|
21
|
+
attr_reader :loadpath
|
|
22
|
+
|
|
23
|
+
CONFIG_FILE = 'r10k.yaml'
|
|
24
|
+
DEFAULT_LOCATION = File.join('/etc/puppetlabs/r10k', CONFIG_FILE)
|
|
25
|
+
OLD_DEFAULT_LOCATION = File.join('/etc', CONFIG_FILE)
|
|
26
|
+
|
|
27
|
+
def initialize
|
|
28
|
+
@loadpath = []
|
|
29
|
+
populate_loadpath
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Find the first valid config file.
|
|
33
|
+
#
|
|
34
|
+
# @param override [String, nil] An optional path that when is truthy
|
|
35
|
+
# will be preferred over all other files, to make it easy to
|
|
36
|
+
# optionally supply an explicit configuration file that will always
|
|
37
|
+
# be used when set.
|
|
38
|
+
# @return [String, nil] The path to the first valid configfile, or nil
|
|
39
|
+
# if no file was found.
|
|
40
|
+
def search(override = nil)
|
|
41
|
+
return override if override
|
|
42
|
+
|
|
43
|
+
# If both default files are present, issue a warning.
|
|
44
|
+
if (File.file? DEFAULT_LOCATION) && (File.file? OLD_DEFAULT_LOCATION)
|
|
45
|
+
logger.warn _("Both %{default_path} and %{old_default_path} configuration files exist.") % {default_path: DEFAULT_LOCATION, old_default_path: OLD_DEFAULT_LOCATION}
|
|
46
|
+
logger.warn _("%{default_path} will be used.") % {default_path: DEFAULT_LOCATION}
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
path = @loadpath.find {|filename| File.file? filename}
|
|
50
|
+
|
|
51
|
+
if path == OLD_DEFAULT_LOCATION
|
|
52
|
+
logger.warn _("The r10k configuration file at %{old_default_path} is deprecated.") % {old_default_path: OLD_DEFAULT_LOCATION}
|
|
53
|
+
logger.warn _("Please move your r10k configuration to %{default_path}.") % {default_path: DEFAULT_LOCATION}
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
path
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def read(override = nil)
|
|
60
|
+
path = search(override)
|
|
61
|
+
|
|
62
|
+
if path.nil?
|
|
63
|
+
raise ConfigError, _("No configuration file given, no config file found in current directory, and no global config present")
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
begin
|
|
67
|
+
contents = ::YAML.load_file(path)
|
|
68
|
+
rescue => e
|
|
69
|
+
raise ConfigError, _("Couldn't load config file: %{error_msg}") % {error_msg: e.message}
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
if !contents
|
|
73
|
+
raise ConfigError, _("File exists at #{path} but doesn't contain any YAML") % {path: path}
|
|
74
|
+
end
|
|
75
|
+
R10K::Util::SymbolizeKeys.symbolize_keys!(contents, true)
|
|
76
|
+
contents
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
private
|
|
80
|
+
|
|
81
|
+
def populate_loadpath
|
|
82
|
+
|
|
83
|
+
# Add the current directory for r10k.yaml
|
|
84
|
+
@loadpath << File.join(Dir.getwd, CONFIG_FILE)
|
|
85
|
+
|
|
86
|
+
# Add the AIO location for of r10k.yaml
|
|
87
|
+
@loadpath << DEFAULT_LOCATION
|
|
88
|
+
|
|
89
|
+
# Add the old default location last.
|
|
90
|
+
@loadpath << OLD_DEFAULT_LOCATION
|
|
91
|
+
|
|
92
|
+
@loadpath
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
class ConfigError < R10K::Error
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module R10K::Settings::Mixin
|
|
2
|
+
|
|
3
|
+
def self.included(klass)
|
|
4
|
+
klass.send(:include, InstanceMethods)
|
|
5
|
+
klass.send(:extend, ClassMethods)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
module InstanceMethods
|
|
9
|
+
|
|
10
|
+
# @return [R10K::Settings::Container] A settings container for the given instance.
|
|
11
|
+
def settings
|
|
12
|
+
@settings ||= R10K::Settings::Container.new(self.class.settings)
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
module ClassMethods
|
|
17
|
+
|
|
18
|
+
# Define a setting and optional default on the extending class.
|
|
19
|
+
#
|
|
20
|
+
# @param key [Symbol]
|
|
21
|
+
# @param default [Object]
|
|
22
|
+
#
|
|
23
|
+
# @return [void]
|
|
24
|
+
def def_setting_attr(key, default = nil)
|
|
25
|
+
defaults.add_valid_key(key)
|
|
26
|
+
defaults[key] = default if default
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# A singleton settings container for storing immutable default configuration
|
|
30
|
+
# on the extending class.
|
|
31
|
+
#
|
|
32
|
+
# @return [R10K::Settings::Container]
|
|
33
|
+
def defaults
|
|
34
|
+
@defaults ||= R10K::Settings::Container.new
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# A singleton settings container for storing manual setting configurations
|
|
38
|
+
# on the extending class.
|
|
39
|
+
#
|
|
40
|
+
# @return [R10K::Settings::Container]
|
|
41
|
+
def settings
|
|
42
|
+
@settings ||= R10K::Settings::Container.new(defaults)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Allow subclasses to use the settings of the parent class as default values
|
|
46
|
+
#
|
|
47
|
+
# @return [void]
|
|
48
|
+
def inherited(subclass)
|
|
49
|
+
subclass.instance_eval do
|
|
50
|
+
@settings = R10K::Settings::Container.new(superclass.settings)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'r10k/settings/definition'
|
|
2
|
+
require 'uri'
|
|
3
|
+
|
|
4
|
+
module R10K
|
|
5
|
+
module Settings
|
|
6
|
+
class URIDefinition < R10K::Settings::Definition
|
|
7
|
+
def validate
|
|
8
|
+
if @value
|
|
9
|
+
begin
|
|
10
|
+
URI.parse(@value)
|
|
11
|
+
rescue URI::Error
|
|
12
|
+
raise ArgumentError, _("Setting %{name} requires a URL but '%{value}' could not be parsed as a URL") % {name: @name, value: @value}
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
super
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
data/lib/r10k/source.rb
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require 'r10k'
|
|
2
|
+
require 'r10k/keyed_factory'
|
|
3
|
+
require 'r10k/util/symbolize_keys'
|
|
4
|
+
|
|
5
|
+
module R10K
|
|
6
|
+
module Source
|
|
7
|
+
def self.factory
|
|
8
|
+
@factory ||= R10K::KeyedFactory.new
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.register(key, klass)
|
|
12
|
+
factory.register(key, klass)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.retrieve(key)
|
|
16
|
+
factory.retrieve(key)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.generate(type, basedir, name, options = {})
|
|
20
|
+
factory.generate(type, basedir, name, options)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.from_hash(name, hash)
|
|
24
|
+
R10K::Util::SymbolizeKeys.symbolize_keys!(hash)
|
|
25
|
+
|
|
26
|
+
basedir = hash.delete(:basedir)
|
|
27
|
+
|
|
28
|
+
type = hash.delete(:type)
|
|
29
|
+
type = type.is_a?(String) ? type.to_sym : type
|
|
30
|
+
|
|
31
|
+
generate(type, name, basedir, hash)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
require 'r10k/source/base'
|
|
35
|
+
require 'r10k/source/hash'
|
|
36
|
+
require 'r10k/source/git'
|
|
37
|
+
require 'r10k/source/svn'
|
|
38
|
+
require 'r10k/source/yaml'
|
|
39
|
+
require 'r10k/source/yamldir'
|
|
40
|
+
require 'r10k/source/exec'
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# This class defines a common interface for source implementations.
|
|
2
|
+
#
|
|
3
|
+
# @since 1.3.0
|
|
4
|
+
class R10K::Source::Base
|
|
5
|
+
|
|
6
|
+
# @!attribute [r] basedir
|
|
7
|
+
# @return [String] The path this source will place environments in
|
|
8
|
+
attr_reader :basedir
|
|
9
|
+
|
|
10
|
+
# @!attribute [r] name
|
|
11
|
+
# @return [String] The short name for this environment source
|
|
12
|
+
attr_reader :name
|
|
13
|
+
|
|
14
|
+
# @!attribute [r] prefix
|
|
15
|
+
# @return [String, nil] The prefix for the environments basedir.
|
|
16
|
+
# Defaults to nil.
|
|
17
|
+
attr_reader :prefix
|
|
18
|
+
|
|
19
|
+
# @!attribute [r] puppetfile_name
|
|
20
|
+
# @return [String, nil] The Name of the puppetfile
|
|
21
|
+
# Defaults to nil.
|
|
22
|
+
attr_reader :puppetfile_name
|
|
23
|
+
|
|
24
|
+
# Initialize the given source.
|
|
25
|
+
#
|
|
26
|
+
# @param name [String] The identifier for this source.
|
|
27
|
+
# @param basedir [String] The base directory where the generated environments will be created.
|
|
28
|
+
# @param options [Hash] An additional set of options for this source. The
|
|
29
|
+
# semantics of this hash may depend on the source implementation.
|
|
30
|
+
#
|
|
31
|
+
# @option options [Boolean, String] :prefix If a String this becomes the prefix.
|
|
32
|
+
# If true, will use the source name as the prefix. All sources should respect this option.
|
|
33
|
+
# Defaults to false for no environment prefix.
|
|
34
|
+
def initialize(name, basedir, options = {})
|
|
35
|
+
@name = name
|
|
36
|
+
@basedir = Pathname.new(basedir).cleanpath.to_s
|
|
37
|
+
@prefix = options.delete(:prefix)
|
|
38
|
+
@puppetfile_name = options.delete(:puppetfile_name)
|
|
39
|
+
@options = options
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Perform any actions needed for loading environments that may have side
|
|
43
|
+
# effects.
|
|
44
|
+
#
|
|
45
|
+
# Actions done during preloading may include things like updating caches or
|
|
46
|
+
# performing network queries. If an environment has not been preloaded but
|
|
47
|
+
# {#environments} is invoked, it should return the best known state of
|
|
48
|
+
# environments or return an empty list.
|
|
49
|
+
#
|
|
50
|
+
# @api public
|
|
51
|
+
# @abstract
|
|
52
|
+
# @return [void]
|
|
53
|
+
def preload!
|
|
54
|
+
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Enumerate the environments associated with this SVN source.
|
|
58
|
+
#
|
|
59
|
+
# @api public
|
|
60
|
+
# @abstract
|
|
61
|
+
# @return [Array<R10K::Environment::Base>] An array of environments created
|
|
62
|
+
# from this source.
|
|
63
|
+
def environments
|
|
64
|
+
raise NotImplementedError, _("%{class} has not implemented method %{method}") % {class: self.class, method: __method__}
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def accept(visitor)
|
|
68
|
+
visitor.visit(:source, self) do
|
|
69
|
+
environments.each do |env|
|
|
70
|
+
env.accept(visitor)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|