puppet 4.3.2-x64-mingw32 → 4.4.0-x64-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +4 -4
- 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/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/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 +4 -4
- 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/yaml_data_provider_factory.rb +2 -2
- data/lib/puppet/defaults.rb +65 -19
- 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.rb +2 -2
- 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/forge.rb +1 -1
- data/lib/puppet/forge/repository.rb +1 -31
- data/lib/puppet/functions.rb +45 -6
- 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/map.rb +6 -14
- 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/graph/rb_tree_map.rb +1 -1
- data/lib/puppet/indirector/catalog/compiler.rb +188 -5
- 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/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 +3 -0
- 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.rb +1 -1
- data/lib/puppet/node/environment.rb +11 -2
- data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
- data/lib/puppet/parser/compiler.rb +3 -3
- data/lib/puppet/parser/environment_compiler.rb +0 -1
- data/lib/puppet/parser/functions.rb +28 -16
- 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/map.rb +1 -1
- 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/resource.rb +19 -17
- data/lib/puppet/parser/scope.rb +176 -5
- data/lib/puppet/plugins/data_providers/data_provider.rb +54 -13
- data/lib/puppet/pops.rb +0 -8
- data/lib/puppet/pops/adaptable.rb +4 -1
- data/lib/puppet/pops/adapters.rb +38 -13
- 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 +95 -93
- data/lib/puppet/pops/evaluator/closure.rb +84 -68
- data/lib/puppet/pops/evaluator/collector_transformer.rb +18 -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 +41 -45
- data/lib/puppet/pops/issue_reporter.rb +6 -4
- data/lib/puppet/pops/issues.rb +34 -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 +16 -12
- 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.rb +14 -12
- data/lib/puppet/pops/merge_strategy.rb +16 -19
- data/lib/puppet/pops/model/factory.rb +26 -2
- data/lib/puppet/pops/model/model.rb +8 -8
- data/lib/puppet/pops/model/model_label_provider.rb +13 -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 +14 -10
- data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
- data/lib/puppet/pops/parser/lexer2.rb +26 -19
- 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 +11 -7
- 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 +138 -381
- 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 -1247
- data/lib/puppet/pops/utils.rb +11 -10
- data/lib/puppet/pops/validation.rb +11 -9
- data/lib/puppet/pops/validation/checker4_0.rb +83 -55
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
- 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/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 +5 -8
- 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/windows.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +1 -1
- data/lib/puppet/provider/package/zypper.rb +19 -0
- data/lib/puppet/provider/service/debian.rb +2 -2
- data/lib/puppet/provider/service/launchd.rb +6 -18
- 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/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.rb +15 -12
- 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 +28 -38
- data/lib/puppet/settings.rb +1 -1
- data/lib/puppet/settings/config_file.rb +1 -1
- data/lib/puppet/settings/environment_conf.rb +13 -5
- 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.rb +15 -2
- data/lib/puppet/transaction/additional_resource_generator.rb +6 -2
- data/lib/puppet/transaction/report.rb +31 -1
- data/lib/puppet/transaction/resource_harness.rb +0 -25
- data/lib/puppet/type.rb +11 -11
- data/lib/puppet/type/augeas.rb +1 -1
- data/lib/puppet/type/cron.rb +12 -12
- data/lib/puppet/type/file.rb +91 -39
- 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/filebucket.rb +1 -1
- 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/util.rb +109 -22
- 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 +4 -4
- 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 +23 -14
- data/lib/puppet/util/windows/process.rb +78 -11
- data/lib/puppet/util/windows/registry.rb +1 -1
- 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 +42 -4
- data/lib/puppet/util/windows/taskscheduler.rb +15 -15
- data/lib/puppet/util/windows/user.rb +10 -10
- 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/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/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/manifests/init.pp +3 -1
- 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/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/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 +90 -4
- data/spec/integration/util/windows/process_spec.rb +31 -0
- data/spec/integration/util/windows/security_spec.rb +6 -6
- 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/configurer/downloader_spec.rb +5 -5
- data/spec/unit/configurer_spec.rb +271 -39
- 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/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 +11 -3
- data/spec/unit/functions/lookup_spec.rb +58 -13
- 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 +61 -5
- 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/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 +1 -1
- data/spec/unit/parser/compiler_spec.rb +16 -0
- data/spec/unit/parser/scope_spec.rb +28 -11
- data/spec/unit/pops/evaluator/access_ops_spec.rb +3 -3
- data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +7 -1
- 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 +44 -1
- data/spec/unit/pops/parser/lexer2_spec.rb +112 -3
- data/spec/unit/pops/parser/parse_calls_spec.rb +8 -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 -373
- 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 +100 -43
- data/spec/unit/provider/cron/parsed_spec.rb +1 -0
- 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 +47 -34
- 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/yum_spec.rb +11 -0
- data/spec/unit/provider/package/zypper_spec.rb +14 -0
- data/spec/unit/provider/service/launchd_spec.rb +17 -35
- data/spec/unit/provider/service/systemd_spec.rb +7 -0
- data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
- data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
- 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 +96 -57
- 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 +4 -4
- 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 +1 -1
- data/spec/unit/util_spec.rb +123 -13
- data/tasks/cfpropertylist.rake +15 -0
- metadata +114 -26
- 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.rb +0 -22
- 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/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
@@ -49,7 +49,7 @@ class Puppet::Pops::Loader::BaseLoader < Puppet::Pops::Loader::Loader
|
|
49
49
|
# @api private
|
50
50
|
#
|
51
51
|
def set_entry(typed_name, value, origin = nil)
|
52
|
-
if entry = @named_values[typed_name] then
|
52
|
+
if entry = @named_values[typed_name] then fail_redefine(entry); end
|
53
53
|
@named_values[typed_name] = Puppet::Pops::Loader::Loader::NamedEntry.new(typed_name, value, origin)
|
54
54
|
end
|
55
55
|
|
@@ -22,7 +22,7 @@
|
|
22
22
|
class Puppet::Pops::Loader::Loader
|
23
23
|
|
24
24
|
# Describes the kinds of things that loaders can load
|
25
|
-
LOADABLE_KINDS = [:func_4x, :func_4xpp].freeze
|
25
|
+
LOADABLE_KINDS = [:func_4x, :func_4xpp, :type_pp].freeze
|
26
26
|
|
27
27
|
# Produces the value associated with the given name if already loaded, or available for loading
|
28
28
|
# by this loader, one of its parents, or other loaders visible to this loader.
|
@@ -23,6 +23,8 @@ module Puppet::Pops::Loader::LoaderPaths
|
|
23
23
|
result << FunctionPathPP.new(loader)
|
24
24
|
end
|
25
25
|
# When wanted also add FunctionPath3x to load 3x functions
|
26
|
+
when :type
|
27
|
+
result << TypePathPP.new(loader) if loader.loadables.include?(:type_pp)
|
26
28
|
else
|
27
29
|
# unknown types, simply produce an empty result; no paths to check, nothing to find... move along...
|
28
30
|
[]
|
@@ -147,6 +149,19 @@ module Puppet::Pops::Loader::LoaderPaths
|
|
147
149
|
end
|
148
150
|
end
|
149
151
|
|
152
|
+
class TypePathPP < PuppetSmartPath
|
153
|
+
# Navigate to directory where 'lib' is, then down again
|
154
|
+
TYPE_PATH_PP = File.join('types')
|
155
|
+
|
156
|
+
def relative_path
|
157
|
+
TYPE_PATH_PP
|
158
|
+
end
|
159
|
+
|
160
|
+
def instantiator()
|
161
|
+
Puppet::Pops::Loader::TypeDefinitionInstantiator
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
150
165
|
# SmartPaths
|
151
166
|
# ===
|
152
167
|
# Holds effective SmartPath instances per type
|
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
module Puppet::Pops
|
2
|
+
module Loader
|
2
3
|
# =ModuleLoaders
|
3
4
|
# A ModuleLoader loads items from a single module.
|
4
5
|
# The ModuleLoaders (ruby) module contains various such loaders. There is currently one concrete
|
@@ -14,12 +15,12 @@
|
|
14
15
|
# internal layout etc.)
|
15
16
|
#
|
16
17
|
# A module loader is also not aware of the mapping of name to relative paths - this is performed by the
|
17
|
-
# included module
|
18
|
+
# included module PathBasedInstantatorConfig which knows about the map from type/name to
|
18
19
|
# relative path, and the logic that can instantiate what is expected to be found in the content of that path.
|
19
20
|
#
|
20
21
|
# @api private
|
21
22
|
#
|
22
|
-
module
|
23
|
+
module ModuleLoaders
|
23
24
|
def self.system_loader_from(parent_loader, loaders)
|
24
25
|
# Puppet system may be installed in a fixed location via RPM, installed as a Gem, via source etc.
|
25
26
|
# The only way to find this across the different ways puppet can be installed is
|
@@ -27,7 +28,7 @@ module Puppet::Pops::Loader::ModuleLoaders
|
|
27
28
|
# puppet.
|
28
29
|
#
|
29
30
|
puppet_lib = File.join(File.dirname(__FILE__), '../../..')
|
30
|
-
|
31
|
+
ModuleLoaders::FileBased.new(parent_loader,
|
31
32
|
loaders,
|
32
33
|
nil,
|
33
34
|
puppet_lib, # may or may not have a 'lib' above 'puppet'
|
@@ -37,7 +38,7 @@ module Puppet::Pops::Loader::ModuleLoaders
|
|
37
38
|
end
|
38
39
|
|
39
40
|
def self.module_loader_from(parent_loader, loaders, module_name, module_path)
|
40
|
-
|
41
|
+
ModuleLoaders::FileBased.new(parent_loader,
|
41
42
|
loaders,
|
42
43
|
module_name,
|
43
44
|
File.join(module_path, 'lib'),
|
@@ -45,7 +46,7 @@ module Puppet::Pops::Loader::ModuleLoaders
|
|
45
46
|
)
|
46
47
|
end
|
47
48
|
|
48
|
-
class AbstractPathBasedModuleLoader <
|
49
|
+
class AbstractPathBasedModuleLoader < BaseLoader
|
49
50
|
|
50
51
|
# The name of the module, or nil, if this is a global "component"
|
51
52
|
attr_reader :module_name
|
@@ -64,7 +65,7 @@ module Puppet::Pops::Loader::ModuleLoaders
|
|
64
65
|
attr_accessor :private_loader
|
65
66
|
|
66
67
|
# Initialize a kind of ModuleLoader for one module
|
67
|
-
# @param parent_loader [
|
68
|
+
# @param parent_loader [Loader] loader with higher priority
|
68
69
|
# @param module_name [String] the name of the module (non qualified name), may be nil for a global "component"
|
69
70
|
# @param path [String] the path to the root of the module (semantics defined by subclass)
|
70
71
|
# @param loader_name [String] a name that is used for human identification (useful when module_name is nil)
|
@@ -74,7 +75,7 @@ module Puppet::Pops::Loader::ModuleLoaders
|
|
74
75
|
|
75
76
|
@module_name = module_name
|
76
77
|
@path = path
|
77
|
-
@smart_paths =
|
78
|
+
@smart_paths = LoaderPaths::SmartPaths.new(self)
|
78
79
|
@loaders = loaders
|
79
80
|
@loadables = loadables
|
80
81
|
unless (loadables - LOADABLE_KINDS).empty?
|
@@ -87,8 +88,8 @@ module Puppet::Pops::Loader::ModuleLoaders
|
|
87
88
|
end
|
88
89
|
|
89
90
|
# Finds typed/named entity in this module
|
90
|
-
# @param typed_name [
|
91
|
-
# @return [
|
91
|
+
# @param typed_name [TypedName] the type/name to find
|
92
|
+
# @return [Loader::NamedEntry, nil found/created entry, or nil if not found
|
92
93
|
#
|
93
94
|
def find(typed_name)
|
94
95
|
# Assume it is a global name, and that all parts of the name should be used when looking up
|
@@ -115,6 +116,7 @@ module Puppet::Pops::Loader::ModuleLoaders
|
|
115
116
|
case typed_name.type
|
116
117
|
when :function
|
117
118
|
when :resource_type
|
119
|
+
when :type
|
118
120
|
else
|
119
121
|
# anything else cannot possibly be in this module
|
120
122
|
# TODO: should not be allowed anyway... may have to revisit this decision
|
@@ -201,7 +203,7 @@ module Puppet::Pops::Loader::ModuleLoaders
|
|
201
203
|
|
202
204
|
# Create a kind of ModuleLoader for one module (Puppet Module, or module like)
|
203
205
|
#
|
204
|
-
# @param parent_loader [
|
206
|
+
# @param parent_loader [Loader] typically the loader for the environment or root
|
205
207
|
# @param module_name [String] the name of the module (non qualified name), may be nil for "modules" only containing globals
|
206
208
|
# @param path [String] the path to the root of the module (semantics defined by subclass)
|
207
209
|
# @param loader_name [String] a name that identifies the loader
|
@@ -231,7 +233,7 @@ module Puppet::Pops::Loader::ModuleLoaders
|
|
231
233
|
end
|
232
234
|
|
233
235
|
def get_contents(effective_path)
|
234
|
-
Puppet::FileSystem.read(effective_path)
|
236
|
+
Puppet::FileSystem.read(effective_path, :encoding => 'utf-8')
|
235
237
|
end
|
236
238
|
end
|
237
239
|
|
@@ -246,7 +248,7 @@ module Puppet::Pops::Loader::ModuleLoaders
|
|
246
248
|
# @api private
|
247
249
|
#
|
248
250
|
class GemBased < FileBased
|
249
|
-
include
|
251
|
+
include GemSupport
|
250
252
|
|
251
253
|
attr_reader :gem_ref
|
252
254
|
|
@@ -267,3 +269,5 @@ module Puppet::Pops::Loader::ModuleLoaders
|
|
267
269
|
end
|
268
270
|
end
|
269
271
|
end
|
272
|
+
end
|
273
|
+
end
|
@@ -1,19 +1,21 @@
|
|
1
|
+
module Puppet::Pops
|
2
|
+
module Loader
|
1
3
|
# The PuppetFunctionInstantiator instantiates a Puppet::Functions::PuppetFunction given a Puppet Programming language
|
2
4
|
# source that when called evaluates the Puppet logic it contains.
|
3
5
|
#
|
4
|
-
class
|
6
|
+
class PuppetFunctionInstantiator
|
5
7
|
# Produces an instance of the Function class with the given typed_name, or fails with an error if the
|
6
8
|
# given puppet source does not produce this instance when evaluated.
|
7
9
|
#
|
8
|
-
# @param loader [
|
9
|
-
# @param typed_name [
|
10
|
+
# @param loader [Loader] The loader the function is associated with
|
11
|
+
# @param typed_name [TypedName] the type / name of the function to load
|
10
12
|
# @param source_ref [URI, String] a reference to the source / origin of the puppet code to evaluate
|
11
13
|
# @param pp_code_string [String] puppet code in a string
|
12
14
|
#
|
13
|
-
# @return [
|
15
|
+
# @return [Functions::Function] - an instantiated function with global scope closure associated with the given loader
|
14
16
|
#
|
15
17
|
def self.create(loader, typed_name, source_ref, pp_code_string)
|
16
|
-
parser =
|
18
|
+
parser = Parser::EvaluatingParser.new()
|
17
19
|
|
18
20
|
# parse and validate
|
19
21
|
result = parser.parse_string(pp_code_string, source_ref)
|
@@ -28,7 +30,7 @@ class Puppet::Pops::Loader::PuppetFunctionInstantiator
|
|
28
30
|
end
|
29
31
|
the_function_definition = result.model.definitions[0]
|
30
32
|
|
31
|
-
unless the_function_definition.is_a?(
|
33
|
+
unless the_function_definition.is_a?(Model::FunctionDefinition)
|
32
34
|
raise ArgumentError, "The code loaded from #{source_ref} does not define the function '#{typed_name.name}' - no function found."
|
33
35
|
end
|
34
36
|
unless the_function_definition.name == typed_name.name
|
@@ -44,7 +46,7 @@ class Puppet::Pops::Loader::PuppetFunctionInstantiator
|
|
44
46
|
# loader to use when making calls to the new function API. Such logic have a hard time finding the closure (where
|
45
47
|
# the loader is known - hence this mechanism
|
46
48
|
private_loader = loader.private_loader
|
47
|
-
|
49
|
+
Adapters::LoaderAdapter.adapt(the_function_definition).loader = private_loader
|
48
50
|
|
49
51
|
# TODO: Cheating wrt. scope - assuming it is found in the context
|
50
52
|
closure_scope = Puppet.lookup(:global_scope) { {} }
|
@@ -58,22 +60,24 @@ class Puppet::Pops::Loader::PuppetFunctionInstantiator
|
|
58
60
|
end
|
59
61
|
|
60
62
|
# Creates Function class and instantiates it based on a FunctionDefinition model
|
61
|
-
# @return [Array<
|
63
|
+
# @return [Array<Loader::TypedName, Functions.Function>] - array of
|
62
64
|
# typed name, and an instantiated function with global scope closure associated with the given loader
|
63
65
|
#
|
64
66
|
def self.create_from_model(function_definition, loader)
|
65
67
|
closure_scope = Puppet.lookup(:global_scope) { {} }
|
66
68
|
created = create_function_class(function_definition, closure_scope)
|
67
|
-
typed_name =
|
69
|
+
typed_name = Loader::TypedName.new(:function, function_definition.name)
|
68
70
|
[typed_name, created.new(closure_scope, loader)]
|
69
71
|
end
|
70
72
|
|
71
73
|
def self.create_function_class(function_definition, closure_scope)
|
72
74
|
# Create a 4x function wrapper around a named closure
|
73
75
|
Puppet::Functions.create_function(function_definition.name, Puppet::Functions::PuppetFunction) do
|
74
|
-
init_dispatch(
|
76
|
+
init_dispatch(Evaluator::Closure::Named.new(
|
75
77
|
function_definition.name,
|
76
|
-
|
78
|
+
Evaluator::EvaluatorImpl.new(), function_definition, closure_scope))
|
77
79
|
end
|
78
80
|
end
|
79
|
-
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -16,7 +16,10 @@ class Puppet::Pops::Loader::RubyFunctionInstantiator
|
|
16
16
|
unless ruby_code_string.is_a?(String) && ruby_code_string =~ /Puppet\:\:Functions\.create_function/
|
17
17
|
raise ArgumentError, "The code loaded from #{source_ref} does not seem to be a Puppet 4x API function - no create_function call."
|
18
18
|
end
|
19
|
-
|
19
|
+
# make the private loader available in a binding to allow it to be passed on
|
20
|
+
loader_for_function = loader.private_loader
|
21
|
+
here = get_binding(loader_for_function)
|
22
|
+
created = eval(ruby_code_string, here, source_ref, 1)
|
20
23
|
unless created.is_a?(Class)
|
21
24
|
raise ArgumentError, "The code loaded from #{source_ref} did not produce a Function class when evaluated. Got '#{created.class}'"
|
22
25
|
end
|
@@ -27,8 +30,18 @@ class Puppet::Pops::Loader::RubyFunctionInstantiator
|
|
27
30
|
# when calling functions etc.
|
28
31
|
# It should be bound to global scope
|
29
32
|
|
30
|
-
#
|
33
|
+
# Cheating wrt. scope - assuming it is found in the context (else an empty hash is used).
|
31
34
|
closure_scope = Puppet.lookup(:global_scope) { {} }
|
32
|
-
|
35
|
+
# If function definition used the loader from the binding to create a new loader, that loader wins
|
36
|
+
created.new(closure_scope, loader_for_function)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
# Produces a binding where the given loader is bound as a local variable (loader_injected_arg). This variable can be used in loaded
|
42
|
+
# ruby code - e.g. to call Puppet::Function.create_loaded_function(:name, loader,...)
|
43
|
+
#
|
44
|
+
def self.get_binding(loader_injected_arg)
|
45
|
+
binding
|
33
46
|
end
|
34
47
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# The TypeDefinitionInstantiator instantiates a type alias or a type definition
|
2
|
+
#
|
3
|
+
module Puppet::Pops
|
4
|
+
module Loader
|
5
|
+
class TypeDefinitionInstantiator
|
6
|
+
def self.create(loader, typed_name, source_ref, pp_code_string)
|
7
|
+
# parse and validate
|
8
|
+
parser = Parser::EvaluatingParser.new()
|
9
|
+
model = parser.parse_string(pp_code_string, source_ref).model
|
10
|
+
# Only one type is allowed (and no other definitions)
|
11
|
+
|
12
|
+
name = typed_name.name
|
13
|
+
case model.definitions.size
|
14
|
+
when 0
|
15
|
+
raise ArgumentError, "The code loaded from #{source_ref} does not define the type '#{name}' - it is empty."
|
16
|
+
when 1
|
17
|
+
# ok
|
18
|
+
else
|
19
|
+
raise ArgumentError,
|
20
|
+
"The code loaded from #{source_ref} must contain only the type '#{name}' - it has additional definitions."
|
21
|
+
end
|
22
|
+
type_definition = model.definitions[0]
|
23
|
+
|
24
|
+
unless type_definition.is_a?(Model::TypeAlias) || type_definition.is_a?(Model::TypeDefinition)
|
25
|
+
raise ArgumentError,
|
26
|
+
"The code loaded from #{source_ref} does not define the type '#{name}' - no type alias or type definition found."
|
27
|
+
end
|
28
|
+
|
29
|
+
actual_name = type_definition.name
|
30
|
+
unless name == actual_name.downcase
|
31
|
+
raise ArgumentError,
|
32
|
+
"The code loaded from #{source_ref} produced type with the wrong name, expected '#{name}', actual '#{actual_name}'"
|
33
|
+
end
|
34
|
+
|
35
|
+
unless model.body == type_definition
|
36
|
+
raise ArgumentError,
|
37
|
+
"The code loaded from #{source_ref} contains additional logic - can only contain the type '#{name}'"
|
38
|
+
end
|
39
|
+
|
40
|
+
# Adapt the type definition with loader - this is used from logic contained in its body to find the
|
41
|
+
# loader to use when resolving contained aliases API. Such logic have a hard time finding the closure (where
|
42
|
+
# the loader is known - hence this mechanism
|
43
|
+
private_loader = loader.private_loader
|
44
|
+
Adapters::LoaderAdapter.adapt(type_definition).loader = private_loader
|
45
|
+
|
46
|
+
Types::PTypeAliasType.new(name, type_definition.type_expr)
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.create_from_model(type_definition, loader)
|
50
|
+
name = type_definition.name
|
51
|
+
[Loader::TypedName.new(:type, name.downcase), Types::PTypeAliasType.new(name, type_definition.type_expr)]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/puppet/pops/loaders.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
|
1
|
+
module Puppet::Pops
|
2
|
+
class Loaders
|
2
3
|
class LoaderError < Puppet::Error; end
|
3
4
|
|
4
5
|
attr_reader :static_loader
|
@@ -8,7 +9,7 @@ class Puppet::Pops::Loaders
|
|
8
9
|
|
9
10
|
def initialize(environment)
|
10
11
|
# The static loader can only be changed after a reboot
|
11
|
-
@@static_loader ||=
|
12
|
+
@@static_loader ||= Loader::StaticLoader.new()
|
12
13
|
|
13
14
|
# Create the set of loaders
|
14
15
|
# 1. Puppet, loads from the "running" puppet - i.e. bundled functions, types, extension points and extensions
|
@@ -35,6 +36,46 @@ class Puppet::Pops::Loaders
|
|
35
36
|
@puppet_system_loader = nil
|
36
37
|
end
|
37
38
|
|
39
|
+
# Finds the `Loaders` instance by looking up the :loaders in the global Puppet context and then uses it to
|
40
|
+
# find the appropriate loader for the given `module_name`, or for the environment in case `module_name`
|
41
|
+
# is `nil` or empty.
|
42
|
+
#
|
43
|
+
# @param module_name [String,nil] the name of the module
|
44
|
+
# @return [Loader::Loader] the found loader
|
45
|
+
# @raise [Puppet::ParseError] if no loader can be found
|
46
|
+
# @api private
|
47
|
+
def self.find_loader(module_name)
|
48
|
+
loaders = Puppet.lookup(:loaders) { nil }
|
49
|
+
raise Puppet::ParseError, "Internal Error: Puppet Context ':loaders' missing" if loaders.nil?
|
50
|
+
loaders.find_loader(module_name)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Finds the appropriate loader for the given `module_name`, or for the environment in case `module_name`
|
54
|
+
# is `nil` or empty.
|
55
|
+
#
|
56
|
+
# @param module_name [String,nil] the name of the module
|
57
|
+
# @return [Loader::Loader] the found loader
|
58
|
+
# @raise [Puppet::ParseError] if no loader can be found
|
59
|
+
# @api private
|
60
|
+
def find_loader(module_name)
|
61
|
+
if module_name.nil? || module_name == ''
|
62
|
+
# TODO : Later when fdefinition can be private, a decision is needed regarding what that means.
|
63
|
+
# A private environment loader could be used for logic outside of modules, then only that logic
|
64
|
+
# would see the definition.
|
65
|
+
#
|
66
|
+
# Use the private loader, this definition may see the environment's dependencies (currently, all modules)
|
67
|
+
loader = private_environment_loader()
|
68
|
+
raise Puppet::ParseError, 'Internal Error: did not find public loader' if loader.nil?
|
69
|
+
loader
|
70
|
+
else
|
71
|
+
# TODO : Later check if definition is private, and then add it to private_loader_for_module
|
72
|
+
#
|
73
|
+
loader = public_loader_for_module(module_name)
|
74
|
+
raise Puppet::ParseError, "Internal Error: did not find public loader for module: '#{module_name}'" if loader.nil?
|
75
|
+
loader
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
38
79
|
def static_loader
|
39
80
|
@@static_loader
|
40
81
|
end
|
@@ -66,7 +107,7 @@ class Puppet::Pops::Loaders
|
|
66
107
|
private
|
67
108
|
|
68
109
|
def create_puppet_system_loader()
|
69
|
-
|
110
|
+
Loader::ModuleLoaders.system_loader_from(static_loader, self)
|
70
111
|
end
|
71
112
|
|
72
113
|
def create_environment_loader(environment)
|
@@ -91,10 +132,10 @@ class Puppet::Pops::Loaders
|
|
91
132
|
env_conf = Puppet.lookup(:environments).get_conf(environment.name)
|
92
133
|
if env_conf.nil? || !env_conf.is_a?(Puppet::Settings::EnvironmentConf)
|
93
134
|
# Not a real directory environment, cannot work as a module TODO: Drop when legacy env are dropped?
|
94
|
-
loader =
|
135
|
+
loader = Loader::SimpleEnvironmentLoader.new(puppet_system_loader, loader_name)
|
95
136
|
else
|
96
137
|
# View the environment as a module to allow loading from it - this module is always called 'environment'
|
97
|
-
loader =
|
138
|
+
loader = Loader::ModuleLoaders.module_loader_from(puppet_system_loader, self, 'environment', env_conf.path_to_env)
|
98
139
|
end
|
99
140
|
|
100
141
|
# An environment has a module path even if it has a null loader
|
@@ -105,7 +146,7 @@ class Puppet::Pops::Loaders
|
|
105
146
|
# Code in the environment gets to see all modules (since there is no metadata for the environment)
|
106
147
|
# but since this is not given to the module loaders, they can not load global code (since they can not
|
107
148
|
# have prior knowledge about this
|
108
|
-
loader =
|
149
|
+
loader = Loader::DependencyLoader.new(loader, "environment", @module_resolver.all_module_loaders())
|
109
150
|
|
110
151
|
# The module loader gets the private loader via a lazy operation to look up the module's private loader.
|
111
152
|
# This does not work for an environment since it is not resolved the same way.
|
@@ -121,7 +162,7 @@ class Puppet::Pops::Loaders
|
|
121
162
|
# Create data about this module
|
122
163
|
md = LoaderModuleData.new(puppet_module)
|
123
164
|
mr[puppet_module.name] = md
|
124
|
-
md.public_loader =
|
165
|
+
md.public_loader = Loader::ModuleLoaders.module_loader_from(parent_loader, self, md.name, md.path)
|
125
166
|
end
|
126
167
|
# NOTE: Do not resolve all modules here - this is wasteful if only a subset of modules / functions are used
|
127
168
|
# The resolution is triggered by asking for a module's private loader, since this means there is interest
|
@@ -224,7 +265,7 @@ class Puppet::Pops::Loaders
|
|
224
265
|
def create_loader_with_all_modules_visible(from_module_data)
|
225
266
|
Puppet.debug{"ModuleLoader: module '#{from_module_data.name}' has unknown dependencies - it will have all other modules visible"}
|
226
267
|
|
227
|
-
|
268
|
+
Loader::DependencyLoader.new(from_module_data.public_loader, from_module_data.name, all_module_loaders())
|
228
269
|
end
|
229
270
|
|
230
271
|
def create_loader_with_only_dependencies_visible(from_module_data)
|
@@ -234,7 +275,8 @@ class Puppet::Pops::Loaders
|
|
234
275
|
" Use 'puppet module list --tree' to see information about modules")
|
235
276
|
end
|
236
277
|
dependency_loaders = from_module_data.dependency_names.collect { |name| @index[name].public_loader }
|
237
|
-
|
278
|
+
Loader::DependencyLoader.new(from_module_data.public_loader, from_module_data.name, dependency_loaders)
|
238
279
|
end
|
239
280
|
end
|
240
281
|
end
|
282
|
+
end
|
data/lib/puppet/pops/lookup.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# This class is the backing implementation of the Puppet function 'lookup'.
|
2
2
|
# See puppet/functions/lookup.rb for documentation.
|
3
3
|
#
|
4
|
-
module Puppet::Pops
|
4
|
+
module Puppet::Pops
|
5
|
+
module Lookup
|
5
6
|
LOOKUP_OPTIONS = 'lookup_options'.freeze
|
6
7
|
GLOBAL = '__global__'.freeze
|
7
8
|
|
@@ -11,25 +12,25 @@ module Puppet::Pops::Lookup
|
|
11
12
|
# See puppet/functions/lookup.rb for full documentation and all parameter combinations.
|
12
13
|
#
|
13
14
|
# @param name [String|Array<String>] The name or names to lookup
|
14
|
-
# @param type [
|
15
|
+
# @param type [Types::PAnyType|nil] The expected type of the found value
|
15
16
|
# @param default_value [Object] The value to use as default when no value is found
|
16
17
|
# @param has_default [Boolean] Set to _true_ if _default_value_ is included (_nil_ is a valid _default_value_)
|
17
|
-
# @param merge [
|
18
|
-
# @param lookup_invocation [
|
18
|
+
# @param merge [MergeStrategy,String,Hash<String,Object>,nil] Merge strategy or hash with strategy and options
|
19
|
+
# @param lookup_invocation [Invocation] Invocation data containing scope, overrides, and defaults
|
19
20
|
# @return [Object] The found value
|
20
21
|
#
|
21
22
|
def self.lookup(name, value_type, default_value, has_default, merge, lookup_invocation)
|
22
|
-
value_type =
|
23
|
+
value_type = Types::PDataType::DEFAULT if value_type.nil?
|
23
24
|
names = name.is_a?(Array) ? name : [name]
|
24
25
|
|
25
26
|
# find first name that yields a non-nil result and wrap it in a two element array
|
26
27
|
# with name and value.
|
27
|
-
not_found =
|
28
|
+
not_found = MergeStrategy::NOT_FOUND
|
28
29
|
override_values = lookup_invocation.override_values
|
29
30
|
result_with_name = names.reduce([nil, not_found]) do |memo, key|
|
30
|
-
value = override_values.include?(key) ? assert_type('override
|
31
|
+
value = override_values.include?(key) ? assert_type(["Value found for key '%s' in override hash", key], value_type, override_values[key]) : not_found
|
31
32
|
catch(:no_such_key) { value = search_and_merge(key, lookup_invocation, merge) } if value.equal?(not_found)
|
32
|
-
break [key, assert_type('
|
33
|
+
break [key, assert_type('Found value', value_type, value)] unless value.equal?(not_found)
|
33
34
|
memo
|
34
35
|
end
|
35
36
|
|
@@ -38,7 +39,7 @@ module Puppet::Pops::Lookup
|
|
38
39
|
default_values = lookup_invocation.default_values
|
39
40
|
unless default_values.empty?
|
40
41
|
result_with_name = names.reduce(result_with_name) do |memo, key|
|
41
|
-
value = default_values.include?(key) ? assert_type('
|
42
|
+
value = default_values.include?(key) ? assert_type(["Value found for key '%s' in default values hash", key], value_type, default_values[key]) : not_found
|
42
43
|
memo = [key, value]
|
43
44
|
break memo unless value.equal?(not_found)
|
44
45
|
memo
|
@@ -49,9 +50,9 @@ module Puppet::Pops::Lookup
|
|
49
50
|
answer = result_with_name[1]
|
50
51
|
if answer.equal?(not_found)
|
51
52
|
if block_given?
|
52
|
-
answer = assert_type('
|
53
|
+
answer = assert_type('Value returned from default block', value_type, yield(name))
|
53
54
|
elsif has_default
|
54
|
-
answer = assert_type('
|
55
|
+
answer = assert_type('Default value', value_type, default_value)
|
55
56
|
else
|
56
57
|
fail_lookup(names)
|
57
58
|
end
|
@@ -65,7 +66,7 @@ module Puppet::Pops::Lookup
|
|
65
66
|
end
|
66
67
|
|
67
68
|
def self.assert_type(subject, type, value)
|
68
|
-
|
69
|
+
Types::TypeAsserter.assert_instance_of(subject, type, value)
|
69
70
|
end
|
70
71
|
private_class_method :assert_type
|
71
72
|
|
@@ -75,3 +76,4 @@ module Puppet::Pops::Lookup
|
|
75
76
|
end
|
76
77
|
private_class_method :fail_lookup
|
77
78
|
end
|
79
|
+
end
|