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,194 @@
|
|
|
1
|
+
require 'etc'
|
|
2
|
+
|
|
3
|
+
module R10K
|
|
4
|
+
module Settings
|
|
5
|
+
require 'r10k/settings/container'
|
|
6
|
+
require 'r10k/settings/mixin'
|
|
7
|
+
|
|
8
|
+
require 'r10k/settings/collection'
|
|
9
|
+
require 'r10k/settings/definition'
|
|
10
|
+
require 'r10k/settings/list'
|
|
11
|
+
|
|
12
|
+
class << self
|
|
13
|
+
# Path to puppet executable
|
|
14
|
+
attr_accessor :puppet_path
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self.git_settings
|
|
18
|
+
R10K::Settings::Collection.new(:git, [
|
|
19
|
+
|
|
20
|
+
EnumDefinition.new(:provider, {
|
|
21
|
+
:desc => "The Git provider to use. Valid values: 'shellgit', 'rugged'",
|
|
22
|
+
:normalize => lambda { |input| input.to_sym },
|
|
23
|
+
:enum => [:shellgit, :rugged],
|
|
24
|
+
}),
|
|
25
|
+
|
|
26
|
+
Definition.new(:username, {
|
|
27
|
+
:desc => "The username to use for Git SSH remotes that do not specify a user.
|
|
28
|
+
Only used by the 'rugged' Git provider.
|
|
29
|
+
Default: the current user",
|
|
30
|
+
:default => lambda { Etc.getlogin },
|
|
31
|
+
}),
|
|
32
|
+
|
|
33
|
+
Definition.new(:private_key, {
|
|
34
|
+
:desc => "The path to the SSH private key for Git SSH remotes.
|
|
35
|
+
Only used by the 'rugged' Git provider.",
|
|
36
|
+
}),
|
|
37
|
+
|
|
38
|
+
URIDefinition.new(:proxy, {
|
|
39
|
+
:desc => "An optional proxy server to use when interacting with Git sources via HTTP(S).",
|
|
40
|
+
:default => :inherit,
|
|
41
|
+
}),
|
|
42
|
+
|
|
43
|
+
List.new(:repositories, lambda {
|
|
44
|
+
R10K::Settings::Collection.new(nil, [
|
|
45
|
+
Definition.new(:remote, {
|
|
46
|
+
:desc => "Remote source that repository-specific settings should apply to.",
|
|
47
|
+
}),
|
|
48
|
+
|
|
49
|
+
Definition.new(:private_key, {
|
|
50
|
+
:desc => "The path to the SSH private key for Git SSH remotes.
|
|
51
|
+
Only used by the 'rugged' Git provider.",
|
|
52
|
+
:default => :inherit,
|
|
53
|
+
}),
|
|
54
|
+
|
|
55
|
+
URIDefinition.new(:proxy, {
|
|
56
|
+
:desc => "An optional proxy server to use when interacting with Git sources via HTTP(S).",
|
|
57
|
+
:default => :inherit,
|
|
58
|
+
}),
|
|
59
|
+
|
|
60
|
+
Definition.new(:ignore_branch_prefixes, {
|
|
61
|
+
:desc => "Array of strings used to prefix branch names that will not be deployed as environments.",
|
|
62
|
+
}),
|
|
63
|
+
])
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
:desc => "Repository specific configuration.",
|
|
67
|
+
:default => [],
|
|
68
|
+
}),
|
|
69
|
+
])
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def self.forge_settings
|
|
73
|
+
R10K::Settings::Collection.new(:forge, [
|
|
74
|
+
URIDefinition.new(:proxy, {
|
|
75
|
+
:desc => "An optional proxy server to use when downloading modules from the forge.",
|
|
76
|
+
:default => :inherit,
|
|
77
|
+
}),
|
|
78
|
+
|
|
79
|
+
URIDefinition.new(:baseurl, {
|
|
80
|
+
:desc => "The URL to the Puppet Forge to use for downloading modules."
|
|
81
|
+
}),
|
|
82
|
+
])
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def self.deploy_settings
|
|
86
|
+
R10K::Settings::Collection.new(:deploy, [
|
|
87
|
+
Definition.new(:write_lock, {
|
|
88
|
+
:desc => "Whether r10k deploy actions should be locked out in case r10k is being managed
|
|
89
|
+
by another application. The value should be a string containing the reason for the write lock.",
|
|
90
|
+
:validate => lambda do |value|
|
|
91
|
+
if value && !value.is_a?(String)
|
|
92
|
+
raise ArgumentError, "The write_lock setting should be a string containing the reason for the write lock, not a #{value.class}"
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
}),
|
|
96
|
+
|
|
97
|
+
EnumDefinition.new(:purge_levels, {
|
|
98
|
+
:desc => "Controls how aggressively r10k will purge unmanaged content from the target directory. Should be a list of values indicating at what levels unmanaged content should be purged. Options are 'deployment', 'environment', and 'puppetfile'. For backwards compatibility, the default is ['deployment', 'puppetfile'].",
|
|
99
|
+
:multi => true,
|
|
100
|
+
:enum => [:deployment, :environment, :puppetfile],
|
|
101
|
+
:default => [:deployment, :puppetfile],
|
|
102
|
+
:normalize => lambda do |input|
|
|
103
|
+
if input.respond_to?(:collect)
|
|
104
|
+
input.collect { |val| val.to_sym }
|
|
105
|
+
else
|
|
106
|
+
# Convert single values to a list of one symbolized value.
|
|
107
|
+
[input.to_sym]
|
|
108
|
+
end
|
|
109
|
+
end,
|
|
110
|
+
}),
|
|
111
|
+
|
|
112
|
+
Definition.new(:purge_whitelist, {
|
|
113
|
+
:desc => "A list of filename patterns to be excluded from any purge operations. Patterns are matched relative to the root of each deployed environment, if you want a pattern to match recursively you need to use the '**' glob in your pattern. Basic shell style globs are supported.",
|
|
114
|
+
:default => [],
|
|
115
|
+
}),
|
|
116
|
+
|
|
117
|
+
Definition.new(:generate_types, {
|
|
118
|
+
:desc => "Controls whether to generate puppet types after deploying an environment. Defaults to false.",
|
|
119
|
+
:default => false,
|
|
120
|
+
:normalize => lambda do |input|
|
|
121
|
+
input.to_s == 'true'
|
|
122
|
+
end,
|
|
123
|
+
}),
|
|
124
|
+
|
|
125
|
+
Definition.new(:puppet_path, {
|
|
126
|
+
:desc => "Path to puppet executable. Defaults to /opt/puppetlabs/bin/puppet.",
|
|
127
|
+
:default => '/opt/puppetlabs/bin/puppet',
|
|
128
|
+
:validate => lambda do |value|
|
|
129
|
+
unless File.executable? value
|
|
130
|
+
raise ArgumentError, "The specified puppet executable #{value} is not executable"
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
}),
|
|
134
|
+
])
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def self.global_settings
|
|
138
|
+
R10K::Settings::Collection.new(:global, [
|
|
139
|
+
Definition.new(:sources, {
|
|
140
|
+
:desc => "Where r10k should retrieve sources when deploying environments.
|
|
141
|
+
Only used for r10k environment deployment.",
|
|
142
|
+
}),
|
|
143
|
+
|
|
144
|
+
Definition.new(:purgedirs, {
|
|
145
|
+
:desc => "The purgedirs setting was deprecated in r10k 1.0.0 and is no longer respected.",
|
|
146
|
+
}),
|
|
147
|
+
|
|
148
|
+
Definition.new(:cachedir, {
|
|
149
|
+
:desc => "Where r10k should store cached Git repositories.",
|
|
150
|
+
}),
|
|
151
|
+
|
|
152
|
+
Definition.new(:postrun, {
|
|
153
|
+
:desc => "The command r10k should run after deploying environments.",
|
|
154
|
+
:validate => lambda do |value|
|
|
155
|
+
if !value.is_a?(Array)
|
|
156
|
+
raise ArgumentError, "The postrun setting should be an array of strings, not a #{value.class}"
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
}),
|
|
160
|
+
|
|
161
|
+
Definition.new(:pool_size, {
|
|
162
|
+
:desc => "The amount of threads used to concurrently install modules. The default value is 1: install one module at a time.",
|
|
163
|
+
:default => 1,
|
|
164
|
+
:validate => lambda do |value|
|
|
165
|
+
if !value.is_a?(Integer)
|
|
166
|
+
raise ArgumentError, "The pool_size setting should be an integer, not a #{value.class}"
|
|
167
|
+
end
|
|
168
|
+
if !(value > 0)
|
|
169
|
+
raise ArgumentError, "The pool_size setting should be greater than zero."
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
}),
|
|
173
|
+
|
|
174
|
+
URIDefinition.new(:proxy, {
|
|
175
|
+
:desc => "Proxy to use for all r10k operations which occur over HTTP(S).",
|
|
176
|
+
:default => lambda {
|
|
177
|
+
[
|
|
178
|
+
ENV['HTTPS_PROXY'],
|
|
179
|
+
ENV['https_proxy'],
|
|
180
|
+
ENV['HTTP_PROXY'],
|
|
181
|
+
ENV['http_proxy']
|
|
182
|
+
].find { |value| value }
|
|
183
|
+
},
|
|
184
|
+
}),
|
|
185
|
+
|
|
186
|
+
R10K::Settings.forge_settings,
|
|
187
|
+
|
|
188
|
+
R10K::Settings.git_settings,
|
|
189
|
+
|
|
190
|
+
R10K::Settings.deploy_settings,
|
|
191
|
+
])
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
end
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
require 'r10k/settings/helpers'
|
|
2
|
+
require 'r10k/settings/definition'
|
|
3
|
+
require 'r10k/util/setopts'
|
|
4
|
+
require 'r10k/util/symbolize_keys'
|
|
5
|
+
require 'r10k/errors'
|
|
6
|
+
|
|
7
|
+
module R10K
|
|
8
|
+
module Settings
|
|
9
|
+
|
|
10
|
+
# Define a group of settings, which can be single definitions or nested
|
|
11
|
+
# collections.
|
|
12
|
+
class Collection
|
|
13
|
+
include R10K::Settings::Helpers
|
|
14
|
+
|
|
15
|
+
# @!attribute [r] name
|
|
16
|
+
# @return [String] The name of this collection
|
|
17
|
+
attr_reader :name
|
|
18
|
+
|
|
19
|
+
# @param name [Symbol] The name of the collection
|
|
20
|
+
# @param settings [Array] All settings in this collection
|
|
21
|
+
def initialize(name, settings)
|
|
22
|
+
@name = name
|
|
23
|
+
|
|
24
|
+
@settings = {}
|
|
25
|
+
|
|
26
|
+
# iterate through settings and adopt them
|
|
27
|
+
settings.each do |s|
|
|
28
|
+
s.parent = self
|
|
29
|
+
@settings[s.name] = s
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Assign new values, perform validation checks, and return the final
|
|
34
|
+
# values for this collection
|
|
35
|
+
def evaluate(newvalues)
|
|
36
|
+
assign(newvalues)
|
|
37
|
+
validate
|
|
38
|
+
resolve
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Assign a hash of values to the settings in this collection.
|
|
42
|
+
#
|
|
43
|
+
# If the passed hash contains any invalid settings values, the names
|
|
44
|
+
# of those settings are stored for use in the {#validate} method.
|
|
45
|
+
#
|
|
46
|
+
# @param newvalues [Hash]
|
|
47
|
+
# @return [void]
|
|
48
|
+
def assign(newvalues)
|
|
49
|
+
return if newvalues.nil?
|
|
50
|
+
|
|
51
|
+
R10K::Util::SymbolizeKeys.symbolize_keys!(newvalues)
|
|
52
|
+
|
|
53
|
+
@settings.each_pair do |name, setting|
|
|
54
|
+
if newvalues.key?(name)
|
|
55
|
+
setting.assign(newvalues[name])
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Validate all settings and return validation errors
|
|
61
|
+
#
|
|
62
|
+
# @return [nil, Hash] If all validation passed nil will be returned; if
|
|
63
|
+
# validation failed then a hash of those errors will be returned.
|
|
64
|
+
def validate
|
|
65
|
+
errors = {}
|
|
66
|
+
|
|
67
|
+
@settings.each_pair do |name, setting|
|
|
68
|
+
begin
|
|
69
|
+
setting.validate
|
|
70
|
+
rescue => error
|
|
71
|
+
errors[name] = error
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
if !errors.empty?
|
|
76
|
+
if @name
|
|
77
|
+
msg = _("Validation failed for '%{name}' settings group") % {name: @name}
|
|
78
|
+
else
|
|
79
|
+
msg = _("Validation failed for settings group")
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
raise ValidationError.new(msg, :errors => errors)
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Evaluate all settings and return a frozen hash of the final values.
|
|
87
|
+
# @return [Hash]
|
|
88
|
+
def resolve
|
|
89
|
+
rv = {}
|
|
90
|
+
|
|
91
|
+
@settings.each_pair do |name, setting|
|
|
92
|
+
rv[name] = setting.resolve
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
rv.freeze
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Access individual settings via a Hash-like interface.
|
|
99
|
+
def [](name)
|
|
100
|
+
@settings[name]
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
class ValidationError < R10K::Error
|
|
104
|
+
|
|
105
|
+
attr_reader :errors
|
|
106
|
+
|
|
107
|
+
def initialize(mesg, options = {})
|
|
108
|
+
super
|
|
109
|
+
@errors = options[:errors]
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def format
|
|
113
|
+
struct = []
|
|
114
|
+
struct << "#{message}:"
|
|
115
|
+
@errors.each_pair do |name, nested|
|
|
116
|
+
struct << indent(structure_exception(name, nested))
|
|
117
|
+
end
|
|
118
|
+
struct.join("\n")
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Defines a collection for application settings
|
|
2
|
+
#
|
|
3
|
+
# This implements a hierarchical interface to application settings. Containers
|
|
4
|
+
# can define an optional parent container that will be used for default options
|
|
5
|
+
# if those options aren't set on the given container.
|
|
6
|
+
class R10K::Settings::Container
|
|
7
|
+
|
|
8
|
+
# @!attribute [r] valid_keys
|
|
9
|
+
# @return [Set<Symbol>] All valid keys defined on the container or parent container.
|
|
10
|
+
attr_accessor :valid_keys
|
|
11
|
+
|
|
12
|
+
# @param parent [R10K::Settings::Container] An optional parent container
|
|
13
|
+
def initialize(parent = nil)
|
|
14
|
+
@parent = parent
|
|
15
|
+
|
|
16
|
+
@valid_keys = Set.new
|
|
17
|
+
@settings = {}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Look up a value in the container. The lookup checks the current container,
|
|
21
|
+
# and then falls back to the parent container if it's given.
|
|
22
|
+
#
|
|
23
|
+
# @param key [Symbol] The lookup key
|
|
24
|
+
#
|
|
25
|
+
# @return [Object, nil] The retrieved value if present.
|
|
26
|
+
#
|
|
27
|
+
# @raise [R10K::Settings::Container::InvalidKey] If the looked up key isn't
|
|
28
|
+
# a valid key.
|
|
29
|
+
def [](key)
|
|
30
|
+
validate_key! key
|
|
31
|
+
|
|
32
|
+
if @settings[key]
|
|
33
|
+
@settings[key]
|
|
34
|
+
elsif @parent && (pkey = @parent[key])
|
|
35
|
+
begin
|
|
36
|
+
@settings[key] = pkey.dup
|
|
37
|
+
rescue TypeError
|
|
38
|
+
@settings[key] = pkey
|
|
39
|
+
end
|
|
40
|
+
@settings[key]
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Set a value on the container
|
|
45
|
+
#
|
|
46
|
+
# @param key [Symbol] The lookup key
|
|
47
|
+
# @param value [Object] The value to store in the container
|
|
48
|
+
#
|
|
49
|
+
# @raise [R10K::Settings::Container::InvalidKey] If the looked up key isn't
|
|
50
|
+
# a valid key.
|
|
51
|
+
def []=(key, value)
|
|
52
|
+
validate_key! key
|
|
53
|
+
|
|
54
|
+
@settings[key] = value
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Define a valid container key
|
|
58
|
+
#
|
|
59
|
+
# @note This should only be used by {#R10K::Settings::ClassSettings}
|
|
60
|
+
#
|
|
61
|
+
# @param key [Symbol]
|
|
62
|
+
# @return [void]
|
|
63
|
+
def add_valid_key(key)
|
|
64
|
+
@valid_keys.add(key)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Determine if a key is a valid setting.
|
|
68
|
+
#
|
|
69
|
+
# @param key [Symbol]
|
|
70
|
+
#
|
|
71
|
+
# @return [true, false]
|
|
72
|
+
def valid_key?(key)
|
|
73
|
+
if @valid_keys.include?(key)
|
|
74
|
+
true
|
|
75
|
+
elsif @parent and @parent.valid_key?(key)
|
|
76
|
+
@valid_keys.add(key)
|
|
77
|
+
true
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Clear all existing settings in this container. Valid settings are left alone.
|
|
82
|
+
# @return [void]
|
|
83
|
+
def reset!
|
|
84
|
+
@settings = {}
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
private
|
|
88
|
+
|
|
89
|
+
def validate_key!(key)
|
|
90
|
+
unless valid_key?(key)
|
|
91
|
+
raise InvalidKey, _("Key %{key} is not a valid key") % {key: key}
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# @api private
|
|
96
|
+
class InvalidKey < StandardError; end
|
|
97
|
+
end
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
require 'r10k/settings/helpers'
|
|
2
|
+
require 'r10k/util/setopts'
|
|
3
|
+
|
|
4
|
+
module R10K
|
|
5
|
+
module Settings
|
|
6
|
+
|
|
7
|
+
# Define a single setting and additional attributes like descriptions,
|
|
8
|
+
# default values, and validation.
|
|
9
|
+
class Definition
|
|
10
|
+
require 'r10k/settings/uri_definition'
|
|
11
|
+
require 'r10k/settings/enum_definition'
|
|
12
|
+
|
|
13
|
+
include R10K::Settings::Helpers
|
|
14
|
+
include R10K::Util::Setopts
|
|
15
|
+
|
|
16
|
+
# @!attribute [r] name
|
|
17
|
+
# @return [String] The name of this setting
|
|
18
|
+
attr_reader :name
|
|
19
|
+
|
|
20
|
+
# @!attribute [r] value
|
|
21
|
+
# @return [Object] An explicitly set value. This should only be used if
|
|
22
|
+
# an optional default value should not be used; otherwise use {#resolve}.
|
|
23
|
+
attr_reader :value
|
|
24
|
+
|
|
25
|
+
# @!attribute [r] desc
|
|
26
|
+
# @return [String] An optional documentation string for this setting.
|
|
27
|
+
attr_reader :desc
|
|
28
|
+
|
|
29
|
+
# @param name [Symbol] The name of the setting for this definition.
|
|
30
|
+
# @param opts [Hash] Additional options for this definition to control
|
|
31
|
+
# validation, normalization, and the like.
|
|
32
|
+
#
|
|
33
|
+
# @option opts [Proc, Object] :default An optional proc or object for
|
|
34
|
+
# this setting. If no value has been set and the default is a Proc then
|
|
35
|
+
# it will be called and the result will be returned, otherwise if the
|
|
36
|
+
# value is not set the default value itself is returned.
|
|
37
|
+
#
|
|
38
|
+
# @options opts [Proc] :validate An optional proc that can be used to
|
|
39
|
+
# validate an assigned value. Default values are not assigned.
|
|
40
|
+
#
|
|
41
|
+
# @options opts [Proc] :normalize An optional proc that can be used to
|
|
42
|
+
# normalize an explicitly assigned value.
|
|
43
|
+
def initialize(name, opts = {})
|
|
44
|
+
@name = name
|
|
45
|
+
setopts(opts, allowed_initialize_opts)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Assign new values, perform validation checks, and return the final
|
|
49
|
+
# values for this collection
|
|
50
|
+
def evaluate(newvalue)
|
|
51
|
+
assign(newvalue)
|
|
52
|
+
validate
|
|
53
|
+
resolve
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Store an explicit value for this definition
|
|
57
|
+
#
|
|
58
|
+
# If a :normalize hook has been given then it will be called with the
|
|
59
|
+
# new value and the returned value will be stored.
|
|
60
|
+
#
|
|
61
|
+
# @param newvalue [Object] The value to store for this setting
|
|
62
|
+
# @return [void]
|
|
63
|
+
def assign(newvalue)
|
|
64
|
+
if @normalize
|
|
65
|
+
@value = @normalize.call(newvalue)
|
|
66
|
+
else
|
|
67
|
+
@value = newvalue
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Call any validation hooks for this definition.
|
|
72
|
+
#
|
|
73
|
+
# The :validate hook will be called if the hook has been set and an
|
|
74
|
+
# explicit value has been assigned to this definition. Validation
|
|
75
|
+
# failures should be indicated by the :validate hook raising an exception.
|
|
76
|
+
#
|
|
77
|
+
# @raise [Exception] An exception class indicating that validation failed.
|
|
78
|
+
# @return [nil]
|
|
79
|
+
def validate
|
|
80
|
+
if @value && @validate
|
|
81
|
+
@validate.call(@value)
|
|
82
|
+
end
|
|
83
|
+
nil
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Compute the final value of this setting. If a value has not been
|
|
87
|
+
# assigned the default value will be used.
|
|
88
|
+
#
|
|
89
|
+
# @return [Object] The final value of this definition.
|
|
90
|
+
def resolve
|
|
91
|
+
if !@value.nil?
|
|
92
|
+
@value
|
|
93
|
+
elsif @default
|
|
94
|
+
if @default == :inherit
|
|
95
|
+
# walk all the way up to root, starting with grandparent
|
|
96
|
+
ancestor = parent
|
|
97
|
+
|
|
98
|
+
while ancestor = ancestor.parent
|
|
99
|
+
return ancestor[@name].resolve if ancestor.respond_to?(:[]) && ancestor[@name]
|
|
100
|
+
end
|
|
101
|
+
elsif @default.is_a?(Proc)
|
|
102
|
+
@default.call
|
|
103
|
+
else
|
|
104
|
+
@default
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
private
|
|
110
|
+
|
|
111
|
+
# Subclasses may define additional params that are accepted at
|
|
112
|
+
# initialization; they should override this method to add any
|
|
113
|
+
# additional fields that should be respected.
|
|
114
|
+
def allowed_initialize_opts
|
|
115
|
+
{
|
|
116
|
+
:desc => true,
|
|
117
|
+
:default => true,
|
|
118
|
+
:validate => true,
|
|
119
|
+
:normalize => true,
|
|
120
|
+
}
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|