puppet 4.3.0 → 4.4.0
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/COMMITTERS.md +2 -2
- data/CONTRIBUTING.md +6 -6
- data/LICENSE +1 -1
- data/README.md +8 -9
- data/conf/auth.conf +2 -2
- data/ext/README.environment +1 -1
- data/ext/build_defaults.yaml +1 -1
- data/ext/debian/README.source +1 -1
- data/ext/debian/control +1 -1
- data/ext/debian/copyright +4 -4
- data/ext/debian/puppetmaster.README.debian +11 -9
- data/ext/emacs/puppet-mode.el +1 -1
- data/ext/envpuppet +2 -2
- data/ext/ips/puppetagent.xml +1 -1
- data/ext/ips/puppetmaster.xml +1 -1
- data/ext/project_data.yaml +8 -0
- data/ext/puppet-test +3 -3
- data/ext/rack/example-passenger-vhost.conf +1 -1
- data/ext/redhat/puppet.spec.erb +2 -2
- data/ext/regexp_nodes/regexp_nodes.rb +1 -1
- data/ext/solaris/pkginfo +1 -1
- data/ext/solaris/smf/puppet.xml +1 -1
- data/ext/suse/puppet.spec +2 -2
- data/ext/upload_facts.rb +1 -1
- data/ext/windows/puppet_interactive.bat +6 -0
- data/ext/windows/puppet_shell.bat +9 -0
- data/ext/windows/run_puppet_interactive.bat +9 -0
- data/ext/yaml_nodes.rb +1 -1
- data/install.rb +30 -20
- data/lib/hiera/scope.rb +1 -1
- data/lib/puppet/agent.rb +1 -1
- data/lib/puppet/application/agent.rb +4 -2
- data/lib/puppet/application/apply.rb +7 -4
- data/lib/puppet/application/cert.rb +1 -1
- data/lib/puppet/application/device.rb +1 -1
- data/lib/puppet/application/filebucket.rb +1 -1
- data/lib/puppet/application/inspect.rb +1 -1
- data/lib/puppet/application/lookup.rb +45 -47
- data/lib/puppet/application/master.rb +2 -2
- data/lib/puppet/application/resource.rb +1 -1
- data/lib/puppet/configurer.rb +100 -22
- data/lib/puppet/data_providers/hiera_config.rb +28 -3
- data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
- data/lib/puppet/data_providers/hiera_support.rb +1 -1
- data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
- data/lib/puppet/data_providers/lookup_adapter.rb +73 -26
- data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
- data/lib/puppet/defaults.rb +69 -22
- data/lib/puppet/environments.rb +3 -1
- data/lib/puppet/face/config.rb +1 -1
- data/lib/puppet/face/epp.rb +1 -1
- data/lib/puppet/face/help/man.erb +1 -1
- data/lib/puppet/face/module/install.rb +6 -6
- data/lib/puppet/face/parser.rb +12 -9
- data/lib/puppet/face/status.rb +2 -1
- data/lib/puppet/feature/cfpropertylist.rb +3 -0
- data/lib/puppet/feature/telnet.rb +9 -0
- data/lib/puppet/file_serving/http_metadata.rb +46 -0
- data/lib/puppet/file_serving/metadata.rb +18 -2
- data/lib/puppet/file_serving/terminus_selector.rb +2 -0
- data/lib/puppet/file_system/file_impl.rb +2 -2
- data/lib/puppet/file_system/memory_impl.rb +1 -1
- data/lib/puppet/file_system/uniquefile.rb +1 -1
- data/lib/puppet/file_system.rb +2 -2
- data/lib/puppet/forge/repository.rb +1 -31
- data/lib/puppet/forge.rb +1 -1
- data/lib/puppet/functions/assert_type.rb +9 -9
- data/lib/puppet/functions/each.rb +5 -13
- data/lib/puppet/functions/filter.rb +5 -14
- data/lib/puppet/functions/lookup.rb +126 -150
- data/lib/puppet/functions/map.rb +6 -14
- data/lib/puppet/functions/match.rb +1 -0
- data/lib/puppet/functions/reduce.rb +5 -13
- data/lib/puppet/functions/reverse_each.rb +82 -0
- data/lib/puppet/functions/scanf.rb +15 -18
- data/lib/puppet/functions/slice.rb +22 -36
- data/lib/puppet/functions/split.rb +2 -2
- data/lib/puppet/functions/step.rb +88 -0
- data/lib/puppet/functions/type.rb +70 -0
- data/lib/puppet/functions.rb +45 -6
- data/lib/puppet/graph/rb_tree_map.rb +1 -1
- data/lib/puppet/indirector/catalog/compiler.rb +188 -5
- data/lib/puppet/indirector/facts/facter.rb +2 -13
- data/lib/puppet/indirector/file_content/http.rb +15 -0
- data/lib/puppet/indirector/file_metadata/http.rb +27 -0
- data/lib/puppet/indirector/generic_http.rb +16 -0
- data/lib/puppet/indirector/hiera.rb +3 -1
- data/lib/puppet/indirector/indirection.rb +6 -2
- data/lib/puppet/indirector/json.rb +2 -2
- data/lib/puppet/indirector/node/exec.rb +1 -1
- data/lib/puppet/indirector/node/ldap.rb +1 -1
- data/lib/puppet/indirector/rest.rb +2 -1
- data/lib/puppet/info_service/class_information_service.rb +13 -12
- data/lib/puppet/loaders.rb +1 -0
- data/lib/puppet/module.rb +6 -2
- data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
- data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
- data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
- data/lib/puppet/module_tool/tar/mini.rb +3 -3
- data/lib/puppet/network/http/pool.rb +9 -0
- data/lib/puppet/node/environment.rb +11 -2
- data/lib/puppet/node.rb +11 -2
- data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
- data/lib/puppet/parser/compiler.rb +4 -11
- data/lib/puppet/parser/environment_compiler.rb +0 -1
- data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
- data/lib/puppet/parser/functions/inline_template.rb +1 -1
- data/lib/puppet/parser/functions/lookup.rb +128 -149
- data/lib/puppet/parser/functions/map.rb +1 -1
- data/lib/puppet/parser/functions/match.rb +1 -0
- data/lib/puppet/parser/functions/scanf.rb +15 -26
- data/lib/puppet/parser/functions/slice.rb +17 -24
- data/lib/puppet/parser/functions/split.rb +1 -1
- data/lib/puppet/parser/functions.rb +28 -16
- data/lib/puppet/parser/resource.rb +19 -17
- data/lib/puppet/parser/scope.rb +176 -5
- data/lib/puppet/plugins/data_providers/data_provider.rb +56 -14
- data/lib/puppet/pops/adaptable.rb +4 -1
- data/lib/puppet/pops/adapters.rb +80 -12
- data/lib/puppet/pops/binder/binder.rb +21 -17
- data/lib/puppet/pops/binder/binder_issues.rb +8 -6
- data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
- data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
- data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
- data/lib/puppet/pops/binder/bindings_model.rb +49 -47
- data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
- data/lib/puppet/pops/binder/injector.rb +53 -48
- data/lib/puppet/pops/binder/key_factory.rb +10 -6
- data/lib/puppet/pops/binder/producers.rb +67 -62
- data/lib/puppet/pops/evaluator/access_operator.rb +98 -96
- data/lib/puppet/pops/evaluator/closure.rb +122 -106
- data/lib/puppet/pops/evaluator/collector_transformer.rb +34 -14
- data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
- data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
- data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
- data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
- data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
- data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
- data/lib/puppet/pops/evaluator/runtime3_support.rb +47 -42
- data/lib/puppet/pops/functions/function.rb +6 -2
- data/lib/puppet/pops/issue_reporter.rb +6 -4
- data/lib/puppet/pops/issues.rb +50 -11
- data/lib/puppet/pops/loader/base_loader.rb +1 -1
- data/lib/puppet/pops/loader/loader.rb +1 -1
- data/lib/puppet/pops/loader/loader_paths.rb +15 -0
- data/lib/puppet/pops/loader/module_loaders.rb +17 -13
- data/lib/puppet/pops/loader/puppet_function_instantiator.rb +18 -13
- data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
- data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
- data/lib/puppet/pops/loaders.rb +51 -9
- data/lib/puppet/pops/lookup/explainer.rb +73 -3
- data/lib/puppet/pops/lookup/invocation.rb +21 -19
- data/lib/puppet/pops/lookup.rb +17 -12
- data/lib/puppet/pops/merge_strategy.rb +16 -19
- data/lib/puppet/pops/model/factory.rb +179 -157
- data/lib/puppet/pops/model/model.rb +17 -8
- data/lib/puppet/pops/model/model_label_provider.rb +14 -7
- data/lib/puppet/pops/model/model_meta.rb +17 -0
- data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
- data/lib/puppet/pops/parser/egrammar.ra +38 -14
- data/lib/puppet/pops/parser/eparser.rb +1353 -1276
- data/lib/puppet/pops/parser/epp_support.rb +11 -7
- data/lib/puppet/pops/parser/evaluating_parser.rb +17 -13
- data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
- data/lib/puppet/pops/parser/lexer2.rb +428 -403
- data/lib/puppet/pops/parser/lexer_support.rb +85 -7
- data/lib/puppet/pops/parser/locator.rb +21 -0
- data/lib/puppet/pops/parser/parser_support.rb +19 -16
- data/lib/puppet/pops/parser/slurp_support.rb +16 -8
- data/lib/puppet/pops/types/class_loader.rb +23 -19
- data/lib/puppet/pops/types/enumeration.rb +9 -26
- data/lib/puppet/pops/types/iterable.rb +308 -0
- data/lib/puppet/pops/types/recursion_guard.rb +82 -0
- data/lib/puppet/pops/types/type_acceptor.rb +25 -0
- data/lib/puppet/pops/types/type_asserter.rb +10 -9
- data/lib/puppet/pops/types/type_calculator.rb +140 -387
- data/lib/puppet/pops/types/type_factory.rb +91 -57
- data/lib/puppet/pops/types/type_formatter.rb +334 -0
- data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
- data/lib/puppet/pops/types/type_parser.rb +159 -112
- data/lib/puppet/pops/types/types.rb +2057 -1253
- data/lib/puppet/pops/utils.rb +11 -10
- data/lib/puppet/pops/validation/checker4_0.rb +115 -63
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
- data/lib/puppet/pops/validation.rb +11 -9
- data/lib/puppet/pops.rb +0 -8
- data/lib/puppet/provider/aixobject.rb +1 -1
- data/lib/puppet/provider/augeas/augeas.rb +1 -1
- data/lib/puppet/provider/cron/crontab.rb +1 -1
- data/lib/puppet/provider/exec/windows.rb +1 -1
- data/lib/puppet/provider/group/windows_adsi.rb +2 -2
- data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
- data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
- data/lib/puppet/provider/package/appdmg.rb +3 -2
- data/lib/puppet/provider/package/dnf.rb +1 -1
- data/lib/puppet/provider/package/pip.rb +16 -9
- data/lib/puppet/provider/package/pip3.rb +1 -1
- data/lib/puppet/provider/package/pkg.rb +1 -1
- data/lib/puppet/provider/package/pkgdmg.rb +3 -2
- data/lib/puppet/provider/package/pkgng.rb +13 -4
- data/lib/puppet/provider/package/rpm.rb +0 -1
- data/lib/puppet/provider/package/windows.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +2 -2
- data/lib/puppet/provider/package/zypper.rb +19 -0
- data/lib/puppet/provider/service/debian.rb +7 -20
- data/lib/puppet/provider/service/init.rb +7 -0
- data/lib/puppet/provider/service/launchd.rb +6 -12
- data/lib/puppet/provider/service/systemd.rb +9 -2
- data/lib/puppet/provider/sshkey/parsed.rb +1 -1
- data/lib/puppet/provider/user/aix.rb +1 -1
- data/lib/puppet/provider/user/directoryservice.rb +33 -58
- data/lib/puppet/provider/user/windows_adsi.rb +2 -2
- data/lib/puppet/provider/yumrepo/inifile.rb +6 -3
- data/lib/puppet/provider/zfs/zfs.rb +1 -1
- data/lib/puppet/provider/zpool/zpool.rb +1 -1
- data/lib/puppet/reference/configuration.rb +1 -1
- data/lib/puppet/reference/providers.rb +1 -1
- data/lib/puppet/resource/capability_finder.rb +20 -13
- data/lib/puppet/resource/catalog.rb +60 -3
- data/lib/puppet/resource/status.rb +11 -2
- data/lib/puppet/resource/type.rb +33 -42
- data/lib/puppet/resource.rb +15 -12
- data/lib/puppet/settings/config_file.rb +1 -1
- data/lib/puppet/settings/environment_conf.rb +13 -5
- data/lib/puppet/settings.rb +1 -1
- data/lib/puppet/ssl/certificate_factory.rb +3 -3
- data/lib/puppet/ssl/certificate_request.rb +4 -4
- data/lib/puppet/ssl/certificate_signer.rb +1 -1
- data/lib/puppet/ssl/validator/default_validator.rb +1 -1
- data/lib/puppet/test/test_helper.rb +16 -4
- data/lib/puppet/transaction/additional_resource_generator.rb +23 -5
- data/lib/puppet/transaction/report.rb +31 -1
- data/lib/puppet/transaction/resource_harness.rb +0 -25
- data/lib/puppet/transaction.rb +15 -2
- data/lib/puppet/type/augeas.rb +1 -1
- data/lib/puppet/type/cron.rb +12 -12
- data/lib/puppet/type/file/checksum_value.rb +53 -0
- data/lib/puppet/type/file/content.rb +26 -111
- data/lib/puppet/type/file/data_sync.rb +84 -0
- data/lib/puppet/type/file/ensure.rb +17 -14
- data/lib/puppet/type/file/selcontext.rb +1 -1
- data/lib/puppet/type/file/source.rb +103 -18
- data/lib/puppet/type/file.rb +91 -39
- data/lib/puppet/type/filebucket.rb +1 -1
- data/lib/puppet/type/group.rb +6 -2
- data/lib/puppet/type/interface.rb +8 -3
- data/lib/puppet/type/macauthorization.rb +1 -1
- data/lib/puppet/type/package.rb +6 -0
- data/lib/puppet/type/schedule.rb +1 -1
- data/lib/puppet/type/stage.rb +1 -1
- data/lib/puppet/type/user.rb +19 -17
- data/lib/puppet/type/yumrepo.rb +20 -0
- data/lib/puppet/type.rb +11 -11
- data/lib/puppet/util/autoload.rb +16 -11
- data/lib/puppet/util/checksums.rb +74 -31
- data/lib/puppet/util/execution.rb +1 -1
- data/lib/puppet/util/http_proxy.rb +72 -0
- data/lib/puppet/util/log.rb +2 -0
- data/lib/puppet/util/logging.rb +43 -1
- data/lib/puppet/util/monkey_patches.rb +2 -2
- data/lib/puppet/util/multi_match.rb +51 -0
- data/lib/puppet/util/network_device/cisco/device.rb +10 -2
- data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
- data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
- data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
- data/lib/puppet/util/plist.rb +130 -0
- data/lib/puppet/util/resource_template.rb +1 -1
- data/lib/puppet/util/run_mode.rb +2 -2
- data/lib/puppet/util/skip_tags.rb +9 -0
- data/lib/puppet/util/windows/access_control_entry.rb +1 -1
- data/lib/puppet/util/windows/access_control_list.rb +3 -3
- data/lib/puppet/util/windows/adsi.rb +65 -28
- data/lib/puppet/util/windows/api_types.rb +24 -18
- data/lib/puppet/util/windows/com.rb +3 -3
- data/lib/puppet/util/windows/error.rb +1 -1
- data/lib/puppet/util/windows/file.rb +8 -8
- data/lib/puppet/util/windows/principal.rb +190 -0
- data/lib/puppet/util/windows/process.rb +78 -11
- data/lib/puppet/util/windows/registry.rb +22 -16
- data/lib/puppet/util/windows/root_certs.rb +5 -5
- data/lib/puppet/util/windows/security.rb +33 -35
- data/lib/puppet/util/windows/security_descriptor.rb +1 -1
- data/lib/puppet/util/windows/sid.rb +84 -15
- data/lib/puppet/util/windows/taskscheduler.rb +15 -15
- data/lib/puppet/util/windows/user.rb +10 -10
- data/lib/puppet/util/windows.rb +4 -0
- data/lib/puppet/util.rb +109 -22
- data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
- data/lib/puppet/vendor/pathspec/LICENSE +2 -2
- data/lib/puppet/vendor/pathspec/README.md +1 -1
- data/lib/puppet/vendor/rgen/README.rdoc +1 -1
- data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet.rb +17 -0
- data/lib/semver.rb +17 -1
- data/man/man5/puppet.conf.5 +12 -12
- data/man/man8/extlookup2hiera.8 +1 -1
- data/man/man8/puppet-agent.8 +2 -2
- data/man/man8/puppet-apply.8 +2 -2
- data/man/man8/puppet-ca.8 +2 -2
- data/man/man8/puppet-catalog.8 +2 -2
- data/man/man8/puppet-cert.8 +2 -2
- data/man/man8/puppet-certificate.8 +2 -2
- data/man/man8/puppet-certificate_request.8 +2 -2
- data/man/man8/puppet-certificate_revocation_list.8 +2 -2
- data/man/man8/puppet-config.8 +3 -3
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +1 -1
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +2 -2
- data/man/man8/puppet-facts.8 +2 -2
- data/man/man8/puppet-file.8 +2 -2
- data/man/man8/puppet-filebucket.8 +2 -2
- data/man/man8/puppet-help.8 +2 -2
- data/man/man8/puppet-inspect.8 +2 -2
- data/man/man8/puppet-key.8 +2 -2
- data/man/man8/puppet-man.8 +2 -2
- data/man/man8/puppet-master.8 +2 -2
- data/man/man8/puppet-module.8 +9 -9
- data/man/man8/puppet-node.8 +2 -2
- data/man/man8/puppet-parser.8 +2 -2
- data/man/man8/puppet-plugin.8 +2 -2
- data/man/man8/puppet-report.8 +2 -2
- data/man/man8/puppet-resource.8 +2 -2
- data/man/man8/puppet-resource_type.8 +2 -2
- data/man/man8/puppet-status.8 +3 -3
- data/man/man8/puppet.8 +1 -1
- data/spec/fixtures/module.tar.gz +0 -0
- data/spec/fixtures/unit/application/environments/production/data/common.yaml +4 -0
- data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
- data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
- data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/data.pp +10 -0
- data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
- data/spec/fixtures/unit/module/trailing-comma.json +1 -1
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +81 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
- data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
- data/spec/integration/defaults_spec.rb +14 -2
- data/spec/integration/file_system/uniquefile_spec.rb +29 -0
- data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
- data/spec/integration/node/environment_spec.rb +13 -0
- data/spec/integration/parser/collection_spec.rb +8 -0
- data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
- data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
- data/spec/integration/parser/undef_param_spec.rb +8 -0
- data/spec/integration/provider/yumrepo_spec.rb +1 -1
- data/spec/integration/test/test_helper_spec.rb +28 -0
- data/spec/integration/transaction/report_spec.rb +16 -0
- data/spec/integration/transaction_spec.rb +11 -0
- data/spec/integration/type/file_spec.rb +194 -4
- data/spec/integration/type/package_spec.rb +5 -1
- data/spec/integration/type/tidy_spec.rb +21 -9
- data/spec/integration/util/execution_spec.rb +22 -0
- data/spec/integration/util/windows/principal_spec.rb +201 -0
- data/spec/integration/util/windows/process_spec.rb +31 -0
- data/spec/{unit → integration}/util/windows/registry_spec.rb +91 -1
- data/spec/integration/util/windows/security_spec.rb +8 -8
- data/spec/integration/util/windows/user_spec.rb +1 -1
- data/spec/integration/util_spec.rb +49 -27
- data/spec/lib/puppet_spec/compiler.rb +17 -0
- data/spec/lib/puppet_spec/files.rb +2 -2
- data/spec/lib/puppet_spec/pops.rb +13 -0
- data/spec/shared_behaviours/iterative_functions.rb +1 -1
- data/spec/shared_contexts/types_setup.rb +96 -0
- data/spec/unit/agent_spec.rb +1 -0
- data/spec/unit/application/agent_spec.rb +10 -0
- data/spec/unit/application/apply_spec.rb +9 -0
- data/spec/unit/application/lookup_spec.rb +138 -28
- data/spec/unit/configurer/downloader_spec.rb +5 -5
- data/spec/unit/configurer_spec.rb +271 -39
- data/spec/unit/data_providers/hiera_data_provider_spec.rb +182 -5
- data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
- data/spec/unit/defaults_spec.rb +15 -0
- data/spec/unit/environments_spec.rb +24 -4
- data/spec/unit/face/epp_face_spec.rb +2 -2
- data/spec/unit/face/parser_spec.rb +43 -2
- data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
- data/spec/unit/file_serving/metadata_spec.rb +50 -0
- data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
- data/spec/unit/file_system_spec.rb +26 -0
- data/spec/unit/functions/assert_type_spec.rb +36 -2
- data/spec/unit/functions/defined_spec.rb +2 -2
- data/spec/unit/functions/epp_spec.rb +17 -9
- data/spec/unit/functions/inline_epp_spec.rb +4 -4
- data/spec/unit/functions/lookup_spec.rb +88 -16
- data/spec/unit/functions/regsubst_spec.rb +1 -1
- data/spec/unit/functions/reverse_each_spec.rb +108 -0
- data/spec/unit/functions/step_spec.rb +113 -0
- data/spec/unit/functions/type_spec.rb +35 -0
- data/spec/unit/functions4_spec.rb +62 -6
- data/spec/unit/hiera/scope_spec.rb +5 -2
- data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
- data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
- data/spec/unit/indirector/indirection_spec.rb +1 -1
- data/spec/unit/indirector/json_spec.rb +1 -1
- data/spec/unit/info_service_spec.rb +94 -32
- data/spec/unit/module_spec.rb +14 -0
- data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
- data/spec/unit/network/authstore_spec.rb +1 -1
- data/spec/unit/network/http/connection_spec.rb +1 -0
- data/spec/unit/network/http/pool_spec.rb +30 -0
- data/spec/unit/node_spec.rb +8 -0
- data/spec/unit/parser/compiler_spec.rb +16 -18
- data/spec/unit/parser/scope_spec.rb +28 -11
- data/spec/unit/pops/evaluator/access_ops_spec.rb +7 -7
- data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -2
- data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
- data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
- data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
- data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
- data/spec/unit/pops/loaders/loaders_spec.rb +127 -2
- data/spec/unit/pops/parser/lexer2_spec.rb +118 -3
- data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
- data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
- data/spec/unit/pops/parser/parser_spec.rb +10 -0
- data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
- data/spec/unit/pops/types/iterable_spec.rb +262 -0
- data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
- data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
- data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +275 -390
- data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
- data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
- data/spec/unit/pops/types/type_parser_spec.rb +58 -13
- data/spec/unit/pops/types/types_spec.rb +241 -0
- data/spec/unit/pops/validator/validator_spec.rb +159 -15
- data/spec/unit/provider/cron/parsed_spec.rb +1 -0
- data/spec/unit/provider/group/windows_adsi_spec.rb +8 -8
- data/spec/unit/provider/macauthorization_spec.rb +5 -2
- data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
- data/spec/unit/provider/package/appdmg_spec.rb +3 -3
- data/spec/unit/provider/package/dnf_spec.rb +16 -0
- data/spec/unit/provider/package/pip3_spec.rb +60 -42
- data/spec/unit/provider/package/pip_spec.rb +88 -47
- data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
- data/spec/unit/provider/package/pkgng_spec.rb +4 -2
- data/spec/unit/provider/package/rpm_spec.rb +2 -25
- data/spec/unit/provider/package/yum_spec.rb +12 -1
- data/spec/unit/provider/package/zypper_spec.rb +14 -0
- data/spec/unit/provider/service/debian_spec.rb +6 -24
- data/spec/unit/provider/service/init_spec.rb +11 -1
- data/spec/unit/provider/service/launchd_spec.rb +18 -25
- data/spec/unit/provider/service/systemd_spec.rb +25 -12
- data/spec/unit/provider/service/upstart_spec.rb +57 -0
- data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
- data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
- data/spec/unit/provider/user/windows_adsi_spec.rb +5 -5
- data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
- data/spec/unit/resource/capability_finder_spec.rb +28 -15
- data/spec/unit/resource/catalog_spec.rb +33 -1
- data/spec/unit/resource/type_spec.rb +149 -7
- data/spec/unit/resource_spec.rb +99 -50
- data/spec/unit/settings/environment_conf_spec.rb +18 -1
- data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
- data/spec/unit/transaction/report_spec.rb +27 -0
- data/spec/unit/transaction/resource_harness_spec.rb +0 -47
- data/spec/unit/transaction_spec.rb +5 -0
- data/spec/unit/type/file/checksum_spec.rb +6 -0
- data/spec/unit/type/file/checksum_value_spec.rb +286 -0
- data/spec/unit/type/file/content_spec.rb +12 -193
- data/spec/unit/type/file/source_spec.rb +211 -119
- data/spec/unit/type/file_spec.rb +133 -34
- data/spec/unit/type/interface_spec.rb +32 -0
- data/spec/unit/type/macauthorization_spec.rb +4 -1
- data/spec/unit/type/yumrepo_spec.rb +2 -2
- data/spec/unit/util/filetype_spec.rb +1 -1
- data/spec/unit/util/http_proxy_spec.rb +2 -2
- data/spec/unit/util/log/destinations_spec.rb +0 -2
- data/spec/unit/util/logging_spec.rb +69 -0
- data/spec/unit/util/multi_match_spec.rb +39 -0
- data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
- data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
- data/spec/unit/util/plist_spec.rb +110 -0
- data/spec/unit/util/resource_template_spec.rb +2 -2
- data/spec/unit/util/run_mode_spec.rb +27 -3
- data/spec/unit/util/windows/adsi_spec.rb +46 -38
- data/spec/unit/util/windows/api_types_spec.rb +42 -0
- data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
- data/spec/unit/util/windows/sid_spec.rb +48 -11
- data/spec/unit/util_spec.rb +123 -13
- data/tasks/cfpropertylist.rake +15 -0
- metadata +3342 -3195
- data/lib/puppet/vendor/load_plist.rb +0 -1
- data/lib/puppet/vendor/plist/CHANGELOG +0 -82
- data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
- data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
- data/lib/puppet/vendor/plist/README +0 -36
- data/lib/puppet/vendor/plist/Rakefile +0 -144
- data/lib/puppet/vendor/plist/docs/USAGE +0 -104
- data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
- data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
- data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
- data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
- data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
- data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
- data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
- data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
- data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
- data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
- data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
- data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
- data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
- data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
- data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
- data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
- data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
- /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
- /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
require 'puppet/util/autoload'
|
|
2
2
|
require 'puppet/parser/scope'
|
|
3
|
+
require 'puppet/pops/adaptable'
|
|
3
4
|
|
|
4
5
|
# A module for managing parser functions. Each specified function
|
|
5
6
|
# is added to a central module that then gets included into the Scope
|
|
@@ -17,12 +18,12 @@ module Puppet::Parser::Functions
|
|
|
17
18
|
#
|
|
18
19
|
# @api private
|
|
19
20
|
def self.reset
|
|
20
|
-
@modules = {}
|
|
21
|
-
|
|
22
21
|
# Runs a newfunction to create a function for each of the log levels
|
|
22
|
+
root_env = Puppet.lookup(:root_environment)
|
|
23
|
+
AnonymousModuleAdapter.clear(root_env)
|
|
23
24
|
Puppet::Util::Log.levels.each do |level|
|
|
24
25
|
newfunction(level,
|
|
25
|
-
:environment =>
|
|
26
|
+
:environment => root_env,
|
|
26
27
|
:doc => "Log a message on the server at level #{level.to_s}.") do |vals|
|
|
27
28
|
send(level, vals.join(" "))
|
|
28
29
|
end
|
|
@@ -36,26 +37,37 @@ module Puppet::Parser::Functions
|
|
|
36
37
|
@autoloader ||= Puppet::Util::Autoload.new(self, "puppet/parser/functions")
|
|
37
38
|
end
|
|
38
39
|
|
|
40
|
+
# An adapter that ties the anonymous module that acts as the container for all 3x functions to the environment
|
|
41
|
+
# where the functions are created. This adapter ensures that the life-cycle of those functions doesn't exceed
|
|
42
|
+
# the life-cycle of the environment.
|
|
43
|
+
#
|
|
44
|
+
# @api private
|
|
45
|
+
class AnonymousModuleAdapter < Puppet::Pops::Adaptable::Adapter
|
|
46
|
+
attr_accessor :module
|
|
47
|
+
end
|
|
48
|
+
|
|
39
49
|
# Get the module that functions are mixed into corresponding to an
|
|
40
50
|
# environment
|
|
41
51
|
#
|
|
42
52
|
# @api private
|
|
43
53
|
def self.environment_module(env)
|
|
44
|
-
|
|
45
|
-
|
|
54
|
+
AnonymousModuleAdapter.adapt(env) do |a|
|
|
55
|
+
a.module ||= Module.new do
|
|
56
|
+
@metadata = {}
|
|
46
57
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
58
|
+
def self.all_function_info
|
|
59
|
+
@metadata
|
|
60
|
+
end
|
|
50
61
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
62
|
+
def self.get_function_info(name)
|
|
63
|
+
@metadata[name]
|
|
64
|
+
end
|
|
54
65
|
|
|
55
|
-
|
|
56
|
-
|
|
66
|
+
def self.add_function_info(name, info)
|
|
67
|
+
@metadata[name] = info
|
|
68
|
+
end
|
|
57
69
|
end
|
|
58
|
-
end
|
|
70
|
+
end.module
|
|
59
71
|
end
|
|
60
72
|
|
|
61
73
|
# Create a new Puppet DSL function.
|
|
@@ -70,7 +82,7 @@ module Puppet::Parser::Functions
|
|
|
70
82
|
# extend the behavior and functionality of Puppet.
|
|
71
83
|
#
|
|
72
84
|
# See also [Docs: Custom
|
|
73
|
-
# Functions](
|
|
85
|
+
# Functions](https://docs.puppetlabs.com/guides/custom_functions.html)
|
|
74
86
|
#
|
|
75
87
|
# @example Define a new Puppet DSL Function
|
|
76
88
|
# >> Puppet::Parser::Functions.newfunction(:double, :arity => 1,
|
|
@@ -113,7 +125,7 @@ module Puppet::Parser::Functions
|
|
|
113
125
|
# This string will be extracted by documentation generation tools.
|
|
114
126
|
#
|
|
115
127
|
# @option options [Integer] :arity (-1) the
|
|
116
|
-
# [arity](
|
|
128
|
+
# [arity](https://en.wikipedia.org/wiki/Arity) of the function. When
|
|
117
129
|
# specified as a positive integer the function is expected to receive
|
|
118
130
|
# _exactly_ the specified number of arguments. When specified as a
|
|
119
131
|
# negative number, the function is expected to receive _at least_ the
|
|
@@ -244,23 +244,25 @@ class Puppet::Parser::Resource < Puppet::Resource
|
|
|
244
244
|
raise "Resource #{self} tries to consume #{cns} but no 'consumes' mapping exists for #{self.resource_type} and #{cns.type}" unless blueprint
|
|
245
245
|
|
|
246
246
|
# setup scope that has, for each attr of cns, a binding to cns[attr]
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
247
|
+
scope.with_global_scope do |global_scope|
|
|
248
|
+
cns_scope = global_scope.newscope(:source => self, :resource => self)
|
|
249
|
+
cns.to_hash.each { |name, value| cns_scope[name.to_s] = value }
|
|
250
|
+
|
|
251
|
+
# evaluate mappings in that scope
|
|
252
|
+
resource_type.arguments.keys.each do |name|
|
|
253
|
+
if expr = blueprint[:mappings][name]
|
|
254
|
+
# Explicit mapping
|
|
255
|
+
value = expr.safeevaluate(cns_scope)
|
|
256
|
+
else
|
|
257
|
+
value = cns[name]
|
|
258
|
+
end
|
|
259
|
+
unless value.nil?
|
|
260
|
+
# @todo lutter 2015-07-01: this should be caught by the checker
|
|
261
|
+
# much earlier. We consume several capres, at least two of which
|
|
262
|
+
# want to map to the same parameter (PUP-5080)
|
|
263
|
+
raise "Attempt to reassign attribute '#{name}' in '#{self}' caused by multiple consumed mappings to the same attribute" if map[name]
|
|
264
|
+
map[name] = value
|
|
265
|
+
end
|
|
264
266
|
end
|
|
265
267
|
end
|
|
266
268
|
end
|
data/lib/puppet/parser/scope.rb
CHANGED
|
@@ -174,13 +174,104 @@ class Puppet::Parser::Scope
|
|
|
174
174
|
|
|
175
175
|
end
|
|
176
176
|
|
|
177
|
+
# @api private
|
|
178
|
+
class ParameterScope < Ephemeral
|
|
179
|
+
class Access
|
|
180
|
+
attr_accessor :value
|
|
181
|
+
|
|
182
|
+
def assigned?
|
|
183
|
+
instance_variable_defined?(:@value)
|
|
184
|
+
end
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# A parameter default must be evaluated using a special scope. The scope that is given to this method must
|
|
188
|
+
# have a `ParameterScope` as its last ephemeral scope. This method will then push a `MatchScope` while the
|
|
189
|
+
# given `expression` is evaluated. The method will catch any throw of `:unevaluated_parameter` and produce
|
|
190
|
+
# an error saying that the evaluated parameter X tries to access the unevaluated parameter Y.
|
|
191
|
+
#
|
|
192
|
+
# @param name [String] the name of the currently evaluated parameter
|
|
193
|
+
# @param expression [Puppet::Parser::AST] the expression to evaluate
|
|
194
|
+
# @param scope [Puppet::Parser::Scope] a scope where a `ParameterScope` has been pushed
|
|
195
|
+
# @return [Object] the result of the evaluation
|
|
196
|
+
#
|
|
197
|
+
# @api private
|
|
198
|
+
def evaluate3x(name, expression, scope)
|
|
199
|
+
scope.with_guarded_scope do
|
|
200
|
+
bad = catch(:unevaluated_parameter) do
|
|
201
|
+
scope.new_match_scope(nil)
|
|
202
|
+
return as_read_only { expression.safeevaluate(scope) }
|
|
203
|
+
end
|
|
204
|
+
raise Puppet::Error, "default expression for $#{name} tries to illegally access not yet evaluated $#{bad}"
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def evaluate(name, expression, scope, evaluator)
|
|
209
|
+
scope.with_guarded_scope do
|
|
210
|
+
bad = catch(:unevaluated_parameter) do
|
|
211
|
+
scope.new_match_scope(nil)
|
|
212
|
+
return as_read_only { evaluator.evaluate(expression, scope) }
|
|
213
|
+
end
|
|
214
|
+
raise Puppet::Error, "default expression for $#{name} tries to illegally access not yet evaluated $#{bad}"
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def initialize(parent, param_names)
|
|
219
|
+
super(parent)
|
|
220
|
+
@params = {}
|
|
221
|
+
param_names.each { |name| @params[name] = Access.new }
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def [](name)
|
|
225
|
+
access = @params[name]
|
|
226
|
+
return super if access.nil?
|
|
227
|
+
throw(:unevaluated_parameter, name) unless access.assigned?
|
|
228
|
+
access.value
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def []=(name, value)
|
|
232
|
+
raise Puppet::Error, "Attempt to assign variable #{name} when evaluating parameters" if @read_only
|
|
233
|
+
@params[name] ||= Access.new
|
|
234
|
+
@params[name].value = value
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
def bound?(name)
|
|
238
|
+
@params.include?(name)
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
def include?(name)
|
|
242
|
+
@params.include?(name) || super
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
def is_local_scope?
|
|
246
|
+
true
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def as_read_only
|
|
250
|
+
read_only = @read_only
|
|
251
|
+
@read_only = true
|
|
252
|
+
begin
|
|
253
|
+
yield
|
|
254
|
+
ensure
|
|
255
|
+
@read_only = read_only
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def to_hash
|
|
260
|
+
Hash[@params.select {|_, access| access.assigned? }.map { |name, access| [name, access.value] }]
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
|
|
177
265
|
# Returns true if the variable of the given name has a non nil value.
|
|
178
266
|
# TODO: This has vague semantics - does the variable exist or not?
|
|
179
267
|
# use ['name'] to get nil or value, and if nil check with exist?('name')
|
|
180
268
|
# this include? is only useful because of checking against the boolean value false.
|
|
181
269
|
#
|
|
182
270
|
def include?(name)
|
|
183
|
-
|
|
271
|
+
catch(:undefined_variable) {
|
|
272
|
+
return ! self[name].nil?
|
|
273
|
+
}
|
|
274
|
+
false
|
|
184
275
|
end
|
|
185
276
|
|
|
186
277
|
# Returns true if the variable of the given name is set to any value (including nil)
|
|
@@ -412,14 +503,28 @@ class Puppet::Parser::Scope
|
|
|
412
503
|
end
|
|
413
504
|
end
|
|
414
505
|
|
|
506
|
+
UNDEFINED_VARIABLES_KIND = 'undefined_variables'.freeze
|
|
507
|
+
|
|
415
508
|
def variable_not_found(name, reason=nil)
|
|
416
509
|
# Built in variables always exist
|
|
417
510
|
if BUILT_IN_VARS.include?(name)
|
|
418
511
|
return nil
|
|
419
512
|
end
|
|
420
513
|
if Puppet[:strict_variables]
|
|
421
|
-
throw
|
|
514
|
+
throw(:undefined_variable, reason)
|
|
422
515
|
else
|
|
516
|
+
# Always warn, unfortunately without location (unless given in "reason") since
|
|
517
|
+
# a location is in most cases not given to scope (operator [], and lookupvar), and
|
|
518
|
+
# would be too expensive to always give.
|
|
519
|
+
# The ideal solution would be to always throw :undefined_variable, but that has to
|
|
520
|
+
# wait until a major release. It would then force all callers of scope to deal with
|
|
521
|
+
# the case of :undefined_variable. (Should check with include? first or catch the throw).
|
|
522
|
+
# Use deprecation warning to enable turning off these warnings, and to ensure each variable
|
|
523
|
+
# is only logged once.
|
|
524
|
+
unless name =~ Puppet::Pops::Patterns::NUMERIC_VAR_NAME
|
|
525
|
+
Puppet.warn_once(UNDEFINED_VARIABLES_KIND, "Variable: #{name}",
|
|
526
|
+
"Undefined variable '#{name}'; #{reason}" )
|
|
527
|
+
end
|
|
423
528
|
nil
|
|
424
529
|
end
|
|
425
530
|
end
|
|
@@ -511,7 +616,8 @@ class Puppet::Parser::Scope
|
|
|
511
616
|
else
|
|
512
617
|
""
|
|
513
618
|
end
|
|
514
|
-
|
|
619
|
+
variable_not_found("#{class_name}::#{variable_name}", "#{reason}#{location}")
|
|
620
|
+
return nil
|
|
515
621
|
end
|
|
516
622
|
variable_not_found("#{class_name}::#{variable_name}", reason)
|
|
517
623
|
end
|
|
@@ -738,10 +844,12 @@ class Puppet::Parser::Scope
|
|
|
738
844
|
|
|
739
845
|
alias_method :inspect, :to_s
|
|
740
846
|
|
|
741
|
-
#
|
|
742
|
-
# TODO: Who uses :all ? Remove ??
|
|
847
|
+
# Pop ephemeral scopes up to level and return them
|
|
743
848
|
#
|
|
849
|
+
# @deprecated use #pop_epehemeral
|
|
850
|
+
# @api private
|
|
744
851
|
def unset_ephemeral_var(level=:all)
|
|
852
|
+
Puppet.deprecation_warning('Method Parser::Scope#unset_ephemeral_var() is deprecated')
|
|
745
853
|
if level == :all
|
|
746
854
|
@ephemeral = [ MatchScope.new(@symtable, nil)]
|
|
747
855
|
else
|
|
@@ -749,6 +857,22 @@ class Puppet::Parser::Scope
|
|
|
749
857
|
end
|
|
750
858
|
end
|
|
751
859
|
|
|
860
|
+
# Pop ephemeral scopes up to level and return them
|
|
861
|
+
#
|
|
862
|
+
# @param level [Fixnum] a positive integer
|
|
863
|
+
# @return [Array] the removed ephemeral scopes
|
|
864
|
+
# @api private
|
|
865
|
+
def pop_ephemerals(level)
|
|
866
|
+
@ephemeral.pop(@ephemeral.size - level)
|
|
867
|
+
end
|
|
868
|
+
|
|
869
|
+
# Push ephemeral scopes onto the ephemeral scope stack
|
|
870
|
+
# @param ephemeral_scopes [Array]
|
|
871
|
+
# @api private
|
|
872
|
+
def push_ephemerals(ephemeral_scopes)
|
|
873
|
+
ephemeral_scopes.each { |ephemeral_scope| @ephemeral.push(ephemeral_scope) } unless ephemeral_scopes.nil?
|
|
874
|
+
end
|
|
875
|
+
|
|
752
876
|
def ephemeral_level
|
|
753
877
|
@ephemeral.size
|
|
754
878
|
end
|
|
@@ -762,6 +886,53 @@ class Puppet::Parser::Scope
|
|
|
762
886
|
end
|
|
763
887
|
end
|
|
764
888
|
|
|
889
|
+
# Execute given block in global scope with no ephemerals present
|
|
890
|
+
#
|
|
891
|
+
# @yieldparam [Scope] global_scope the global and ephemeral less scope
|
|
892
|
+
# @return [Object] the return of the block
|
|
893
|
+
#
|
|
894
|
+
# @api private
|
|
895
|
+
def with_global_scope(&block)
|
|
896
|
+
find_global_scope.without_ephemeral_scopes(&block)
|
|
897
|
+
end
|
|
898
|
+
|
|
899
|
+
# Execute given block with all ephemeral popped from the ephemeral stack
|
|
900
|
+
#
|
|
901
|
+
# @api private
|
|
902
|
+
def without_ephemeral_scopes
|
|
903
|
+
save_ephemeral = @ephemeral
|
|
904
|
+
begin
|
|
905
|
+
@ephemeral = [ @symtable ]
|
|
906
|
+
yield(self)
|
|
907
|
+
ensure
|
|
908
|
+
@ephemeral = save_ephemeral
|
|
909
|
+
end
|
|
910
|
+
end
|
|
911
|
+
|
|
912
|
+
# Nests a parameter scope
|
|
913
|
+
# @api private
|
|
914
|
+
def with_parameter_scope(param_names)
|
|
915
|
+
param_scope = ParameterScope.new(@ephemeral.last, param_names)
|
|
916
|
+
with_guarded_scope do
|
|
917
|
+
@ephemeral.push(param_scope)
|
|
918
|
+
yield(param_scope)
|
|
919
|
+
end
|
|
920
|
+
end
|
|
921
|
+
|
|
922
|
+
# Execute given block and ensure that ephemeral level is restored
|
|
923
|
+
#
|
|
924
|
+
# @return [Object] the return of the block
|
|
925
|
+
#
|
|
926
|
+
# @api private
|
|
927
|
+
def with_guarded_scope
|
|
928
|
+
elevel = ephemeral_level
|
|
929
|
+
begin
|
|
930
|
+
yield
|
|
931
|
+
ensure
|
|
932
|
+
pop_ephemerals(elevel)
|
|
933
|
+
end
|
|
934
|
+
end
|
|
935
|
+
|
|
765
936
|
# Sets match data in the most nested scope (which always is a MatchScope), it clobbers match data already set there
|
|
766
937
|
#
|
|
767
938
|
def set_match_data(match_data)
|
|
@@ -72,7 +72,6 @@ module Puppet::Plugins::DataProviders
|
|
|
72
72
|
def data_key(key, lookup_invocation)
|
|
73
73
|
nil
|
|
74
74
|
end
|
|
75
|
-
protected :data_key
|
|
76
75
|
|
|
77
76
|
# Should be reimplemented by subclass to provide the hash that corresponds to the given name.
|
|
78
77
|
#
|
|
@@ -94,10 +93,10 @@ module Puppet::Plugins::DataProviders
|
|
|
94
93
|
def validate_data(data, data_key)
|
|
95
94
|
data
|
|
96
95
|
end
|
|
97
|
-
protected :validate_data
|
|
98
96
|
end
|
|
99
97
|
|
|
100
98
|
class ModuleDataProvider
|
|
99
|
+
LOOKUP_OPTIONS = Puppet::Pops::Lookup::LOOKUP_OPTIONS
|
|
101
100
|
include DataProvider
|
|
102
101
|
|
|
103
102
|
# Retrieve the first segment of the qualified name _key_. This method will throw
|
|
@@ -106,27 +105,34 @@ module Puppet::Plugins::DataProviders
|
|
|
106
105
|
# @param key [String] The key
|
|
107
106
|
# @return [String] The first segment of the given key
|
|
108
107
|
def data_key(key, lookup_invocation)
|
|
109
|
-
return lookup_invocation.module_name if key ==
|
|
108
|
+
return lookup_invocation.module_name if key == LOOKUP_OPTIONS
|
|
110
109
|
qual_index = key.index('::')
|
|
111
110
|
throw :no_such_key if qual_index.nil?
|
|
112
111
|
key[0..qual_index-1]
|
|
113
112
|
end
|
|
114
|
-
protected :data_key
|
|
115
113
|
|
|
116
|
-
#
|
|
114
|
+
# Asserts that all keys in the given _data_ are prefixed with the given _module_name_. Remove entries
|
|
115
|
+
# that does not follow the convention and log a warning.
|
|
117
116
|
#
|
|
118
117
|
# @param data [Hash] The data hash
|
|
119
118
|
# @param module_name [String] The name of the module where the data was found
|
|
120
|
-
# @return [Hash] The
|
|
119
|
+
# @return [Hash] The possibly pruned hash
|
|
120
|
+
# @api public
|
|
121
121
|
def validate_data(data, module_name)
|
|
122
122
|
module_prefix = "#{module_name}::"
|
|
123
|
-
data.each_key do |k|
|
|
124
|
-
|
|
125
|
-
|
|
123
|
+
data.each_key.reduce(data) do |memo, k|
|
|
124
|
+
if k.is_a?(String)
|
|
125
|
+
next memo if k == LOOKUP_OPTIONS || k.start_with?(module_prefix)
|
|
126
|
+
msg = 'must use keys qualified with the name of the module'
|
|
127
|
+
else
|
|
128
|
+
msg = "must use keys of type String, got #{k.class.name}"
|
|
126
129
|
end
|
|
130
|
+
memo = memo.clone if memo.equal?(data)
|
|
131
|
+
memo.delete(k)
|
|
132
|
+
Puppet.warning("Module data for module '#{module_name}' #{msg}")
|
|
133
|
+
memo
|
|
127
134
|
end
|
|
128
135
|
end
|
|
129
|
-
protected :validate_data
|
|
130
136
|
end
|
|
131
137
|
|
|
132
138
|
class EnvironmentDataProvider
|
|
@@ -135,7 +141,6 @@ module Puppet::Plugins::DataProviders
|
|
|
135
141
|
def data_key(key, lookup_invocation)
|
|
136
142
|
'environment'
|
|
137
143
|
end
|
|
138
|
-
protected :data_key
|
|
139
144
|
end
|
|
140
145
|
|
|
141
146
|
# Class that keeps track of the original path (as it appears in the declaration, before interpolation),
|
|
@@ -175,11 +180,38 @@ module Puppet::Plugins::DataProviders
|
|
|
175
180
|
|
|
176
181
|
# @param name [String] The name of the data provider
|
|
177
182
|
# @param paths [Array<ResolvedPath>] Paths used by this provider
|
|
183
|
+
# @param parent_data_provider [DataProvider] The data provider that is the container of this data provider
|
|
178
184
|
#
|
|
179
185
|
# @api public
|
|
180
|
-
def initialize(name, paths)
|
|
186
|
+
def initialize(name, paths, parent_data_provider = nil)
|
|
181
187
|
@name = name
|
|
182
188
|
@paths = paths
|
|
189
|
+
@parent_data_provider = parent_data_provider
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
# Gets the data from the compiler, or initializes it by calling #initialize_data if not present in the compiler.
|
|
193
|
+
# This means, that data is initialized once per compilation, and the data is cached for as long as the compiler
|
|
194
|
+
# lives (which is for one catalog production). This makes it possible to return data that is tailored for the
|
|
195
|
+
# request.
|
|
196
|
+
#
|
|
197
|
+
# If data is obtained using the #initialize_data method it will be sent to the #validate_data for validation
|
|
198
|
+
#
|
|
199
|
+
# @param path [String] The path to the data to be loaded (passed to #initialize_data)
|
|
200
|
+
# @param data_key [String] The data key such as the name of a module or the constant 'environment'
|
|
201
|
+
# @param lookup_invocation [Puppet::Pops::Lookup::Invocation] The current lookup invocation
|
|
202
|
+
# @param merge [String|Hash<String,Object>|nil] Merge strategy or hash with strategy and options
|
|
203
|
+
# @return [Hash] The data hash for the given _key_
|
|
204
|
+
#
|
|
205
|
+
# @api public
|
|
206
|
+
def load_data(path, data_key, lookup_invocation)
|
|
207
|
+
compiler = lookup_invocation.scope.compiler
|
|
208
|
+
adapter = Puppet::DataProviders::DataAdapter.get(compiler) || Puppet::DataProviders::DataAdapter.adapt(compiler)
|
|
209
|
+
adapter.data[path] ||= validate_data(initialize_data(path, lookup_invocation), data_key)
|
|
210
|
+
end
|
|
211
|
+
protected :data
|
|
212
|
+
|
|
213
|
+
def validate_data(data, module_name)
|
|
214
|
+
@parent_data_provider.nil? ? data : @parent_data_provider.validate_data(data, module_name)
|
|
183
215
|
end
|
|
184
216
|
|
|
185
217
|
# Performs a lookup by searching all given paths for the given _key_. A merge will be performed if
|
|
@@ -191,13 +223,14 @@ module Puppet::Plugins::DataProviders
|
|
|
191
223
|
#
|
|
192
224
|
# @api public
|
|
193
225
|
def unchecked_lookup(key, lookup_invocation, merge)
|
|
226
|
+
module_name = @parent_data_provider.nil? ? nil : @parent_data_provider.data_key(key, lookup_invocation)
|
|
194
227
|
lookup_invocation.with(:data_provider, self) do
|
|
195
228
|
merge_strategy = Puppet::Pops::MergeStrategy.strategy(merge)
|
|
196
229
|
lookup_invocation.with(:merge, merge_strategy) do
|
|
197
230
|
merged_result = merge_strategy.merge_lookup(@paths) do |path|
|
|
198
231
|
lookup_invocation.with(:path, path) do
|
|
199
232
|
if path.exists?
|
|
200
|
-
hash =
|
|
233
|
+
hash = load_data(path.path, module_name, lookup_invocation)
|
|
201
234
|
value = hash[key]
|
|
202
235
|
if value || hash.include?(key)
|
|
203
236
|
lookup_invocation.report_found(key, post_process(value, lookup_invocation))
|
|
@@ -226,10 +259,11 @@ module Puppet::Plugins::DataProviders
|
|
|
226
259
|
#
|
|
227
260
|
# @param name [String] the name of the created provider (for logging and debugging)
|
|
228
261
|
# @param paths [Array<String>] array of resolved paths
|
|
262
|
+
# @param parent_data_provider [DataProvider] The data provider that is the container of this data provider
|
|
229
263
|
# @return [DataProvider] The created data provider
|
|
230
264
|
#
|
|
231
265
|
# @api public
|
|
232
|
-
def create(name, paths)
|
|
266
|
+
def create(name, paths, parent_data_provider)
|
|
233
267
|
raise NotImplementedError, "Subclass of PathBasedDataProviderFactory must implement 'create' method"
|
|
234
268
|
end
|
|
235
269
|
|
|
@@ -249,6 +283,14 @@ module Puppet::Plugins::DataProviders
|
|
|
249
283
|
def resolve_paths(datadir, declared_paths, paths, lookup_invocation)
|
|
250
284
|
[]
|
|
251
285
|
end
|
|
286
|
+
|
|
287
|
+
# Returns the data provider factory version.
|
|
288
|
+
#
|
|
289
|
+
# return [Integer] the version of this data provider factory
|
|
290
|
+
# @api public
|
|
291
|
+
def version
|
|
292
|
+
2
|
|
293
|
+
end
|
|
252
294
|
end
|
|
253
295
|
|
|
254
296
|
# Factory for creating file based data providers. This is an extension of the path based
|
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
# be exploited as the implementation of _being adaptable_ may change in the future.
|
|
16
16
|
# @api private
|
|
17
17
|
#
|
|
18
|
-
module Puppet::Pops
|
|
18
|
+
module Puppet::Pops
|
|
19
|
+
module Adaptable
|
|
19
20
|
# Base class for an Adapter.
|
|
20
21
|
#
|
|
21
22
|
# A typical adapter just defines some accessors.
|
|
@@ -199,3 +200,5 @@ module Puppet::Pops::Adaptable
|
|
|
199
200
|
end
|
|
200
201
|
end
|
|
201
202
|
end
|
|
203
|
+
end
|
|
204
|
+
|
data/lib/puppet/pops/adapters.rb
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
# The Adapters module contains adapters for Documentation, Origin, SourcePosition, and Loader.
|
|
2
2
|
#
|
|
3
|
-
module Puppet::Pops
|
|
3
|
+
module Puppet::Pops
|
|
4
|
+
module Adapters
|
|
4
5
|
# A documentation adapter adapts an object with a documentation string.
|
|
5
6
|
# (The intended use is for a source text parser to extract documentation and store this
|
|
6
7
|
# in DocumentationAdapter instances).
|
|
7
8
|
#
|
|
8
|
-
class DocumentationAdapter <
|
|
9
|
+
class DocumentationAdapter < Adaptable::Adapter
|
|
9
10
|
# @return [String] The documentation associated with an object
|
|
10
11
|
attr_accessor :documentation
|
|
11
12
|
end
|
|
@@ -19,10 +20,11 @@ module Puppet::Pops::Adapters
|
|
|
19
20
|
# @note It is relatively expensive to compute line and position on line - it is not something that
|
|
20
21
|
# should be done for every token or model object.
|
|
21
22
|
#
|
|
22
|
-
# @see
|
|
23
|
+
# @see Utils#find_adapter, Utils#find_closest_positioned
|
|
23
24
|
#
|
|
24
|
-
class SourcePosAdapter <
|
|
25
|
+
class SourcePosAdapter < Adaptable::Adapter
|
|
25
26
|
attr_accessor :locator
|
|
27
|
+
attr_reader :adapted
|
|
26
28
|
|
|
27
29
|
def self.create_adapter(o)
|
|
28
30
|
new(o)
|
|
@@ -44,10 +46,10 @@ module Puppet::Pops::Adapters
|
|
|
44
46
|
raise ArgumentError, "InternalError: SourcePosAdapter for something that has no locator among parents"
|
|
45
47
|
end
|
|
46
48
|
case
|
|
47
|
-
when o.is_a?(
|
|
49
|
+
when o.is_a?(Model::Program)
|
|
48
50
|
return o.locator
|
|
49
51
|
# TODO_HEREDOC use case of SubLocator instead
|
|
50
|
-
when o.is_a?(
|
|
52
|
+
when o.is_a?(Model::SubLocatedExpression) && !(found_locator = o.locator).nil?
|
|
51
53
|
return found_locator
|
|
52
54
|
when adapter = self.class.get(o)
|
|
53
55
|
return adapter.locator
|
|
@@ -82,7 +84,7 @@ module Puppet::Pops::Adapters
|
|
|
82
84
|
|
|
83
85
|
# Extracts the text represented by this source position (the string is obtained from the locator)
|
|
84
86
|
def extract_text
|
|
85
|
-
locator.
|
|
87
|
+
locator.extract_text(offset, length)
|
|
86
88
|
end
|
|
87
89
|
|
|
88
90
|
def extract_tree_text
|
|
@@ -90,11 +92,12 @@ module Puppet::Pops::Adapters
|
|
|
90
92
|
last = first + @adapted.length
|
|
91
93
|
@adapted.eAllContents.each do |m|
|
|
92
94
|
m_offset = m.offset
|
|
95
|
+
next if m_offset.nil?
|
|
93
96
|
first = m_offset if m_offset < first
|
|
94
97
|
m_last = m_offset + m.length
|
|
95
98
|
last = m_last if m_last > last
|
|
96
99
|
end
|
|
97
|
-
locator.
|
|
100
|
+
locator.extract_text(first, last-first)
|
|
98
101
|
end
|
|
99
102
|
|
|
100
103
|
# Produces an URI with path?line=n&pos=n. If origin is unknown the URI is string:?line=n&pos=n
|
|
@@ -105,17 +108,82 @@ module Puppet::Pops::Adapters
|
|
|
105
108
|
end
|
|
106
109
|
end
|
|
107
110
|
|
|
108
|
-
# A LoaderAdapter adapts an object with a {
|
|
111
|
+
# A LoaderAdapter adapts an object with a {Loader}. This is used to make further loading from the
|
|
109
112
|
# perspective of the adapted object take place in the perspective of this Loader.
|
|
110
113
|
#
|
|
111
114
|
# It is typically enough to adapt the root of a model as a search is made towards the root of the model
|
|
112
115
|
# until a loader is found, but there is no harm in duplicating this information provided a contained
|
|
113
116
|
# object is adapted with the correct loader.
|
|
114
117
|
#
|
|
115
|
-
# @see
|
|
118
|
+
# @see Utils#find_adapter
|
|
116
119
|
#
|
|
117
|
-
class LoaderAdapter <
|
|
118
|
-
# @return [
|
|
120
|
+
class LoaderAdapter < Adaptable::Adapter
|
|
121
|
+
# @return [Loader::Loader] the loader
|
|
119
122
|
attr_accessor :loader
|
|
123
|
+
|
|
124
|
+
# Finds the loader to use when loading originates from the source position of the given argument.
|
|
125
|
+
#
|
|
126
|
+
# @param instance [Model::PopsObject] The model object
|
|
127
|
+
# @param scope [Puppet::Parser::Scope] The scope to use
|
|
128
|
+
# @return [Loader,nil] the found loader or `nil` if it could not be found
|
|
129
|
+
#
|
|
130
|
+
def self.loader_for_model_object(model, scope)
|
|
131
|
+
# find the loader that loaded the code, or use the private_environment_loader (sees env + all modules)
|
|
132
|
+
adapter = Utils.find_adapter(model, self)
|
|
133
|
+
return adapter.loader unless adapter.nil?
|
|
134
|
+
|
|
135
|
+
if scope.nil?
|
|
136
|
+
loaders = Puppet.lookup(:loaders) { nil }
|
|
137
|
+
loaders.nil? ? nil : loaders.private_environment_loader
|
|
138
|
+
else
|
|
139
|
+
# Use source location to determine calling module, or use the private_environment_loader (sees env + all modules)
|
|
140
|
+
# This is necessary since not all .pp files are loaded by a Loader (see PUP-1833)
|
|
141
|
+
adapter = adapt_by_source(scope, model)
|
|
142
|
+
adapter.nil? ? scope.compiler.loaders.private_environment_loader : adapter.loader
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# Attempts to find the module that `instance` originates from by looking at it's {SourcePosAdapter} and
|
|
147
|
+
# compare the `locator.file` found there with the module paths given in the environment found in the
|
|
148
|
+
# given `scope`. If the file is found to be relative to a path, then the first segment of the relative
|
|
149
|
+
# path is interpreted as the name of a module. The object that the {SourcePosAdapter} is adapted to
|
|
150
|
+
# will then be adapted to the private loader for that module and that adapter is returned.
|
|
151
|
+
#
|
|
152
|
+
# The method returns `nil` when no module could be found.
|
|
153
|
+
#
|
|
154
|
+
# @param scope
|
|
155
|
+
# @param instance
|
|
156
|
+
def self.adapt_by_source(scope, instance)
|
|
157
|
+
source_pos = Utils.find_adapter(instance, SourcePosAdapter)
|
|
158
|
+
unless source_pos.nil?
|
|
159
|
+
mod = find_module_for_file(scope.environment, source_pos.locator.file)
|
|
160
|
+
unless mod.nil?
|
|
161
|
+
adapter = LoaderAdapter.adapt(source_pos.adapted)
|
|
162
|
+
adapter.loader = scope.compiler.loaders.private_loader_for_module(mod.name)
|
|
163
|
+
return adapter
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
nil
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def self.find_module_for_file(environment, file)
|
|
170
|
+
return nil if file.nil?
|
|
171
|
+
file_path = Pathname.new(file)
|
|
172
|
+
environment.modulepath.each do |path|
|
|
173
|
+
begin
|
|
174
|
+
relative_path = file_path.relative_path_from(Pathname.new(path)).to_s.split(File::SEPARATOR)
|
|
175
|
+
rescue ArgumentError
|
|
176
|
+
# file_path was not relative to the module_path. That's OK.
|
|
177
|
+
next
|
|
178
|
+
end
|
|
179
|
+
if relative_path.length > 1
|
|
180
|
+
mod = environment.module(relative_path[0])
|
|
181
|
+
return mod unless mod.nil?
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
nil
|
|
185
|
+
end
|
|
186
|
+
private_class_method :find_module_for_file
|
|
120
187
|
end
|
|
121
188
|
end
|
|
189
|
+
end
|