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
@@ -1,3 +1,5 @@
|
|
1
|
+
module Puppet::Pops
|
2
|
+
module Evaluator
|
1
3
|
# A Closure represents logic bound to a particular scope.
|
2
4
|
# As long as the runtime (basically the scope implementation) has the behavior of Puppet 3x it is not
|
3
5
|
# safe to return and later use this closure.
|
@@ -11,7 +13,7 @@
|
|
11
13
|
# Note that this class is a CallableSignature, and the methods defined there should be used
|
12
14
|
# as the API for obtaining information in a callable-implementation agnostic way.
|
13
15
|
#
|
14
|
-
class
|
16
|
+
class Closure < CallableSignature
|
15
17
|
attr_reader :evaluator
|
16
18
|
attr_reader :model
|
17
19
|
attr_reader :enclosing_scope
|
@@ -25,22 +27,7 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
|
|
25
27
|
# Evaluates a closure in its enclosing scope after having matched given arguments with parameters (from left to right)
|
26
28
|
# @api public
|
27
29
|
def call(*args)
|
28
|
-
|
29
|
-
|
30
|
-
tc = Puppet::Pops::Types::TypeCalculator.singleton
|
31
|
-
final_args = tc.infer_set(parameters.reduce([]) do |tmp_args, param|
|
32
|
-
if param.captures_rest
|
33
|
-
tmp_args.concat(variable_bindings[param.name])
|
34
|
-
else
|
35
|
-
tmp_args << variable_bindings[param.name]
|
36
|
-
end
|
37
|
-
end)
|
38
|
-
|
39
|
-
if type.callable?(final_args)
|
40
|
-
@evaluator.evaluate_block_with_bindings(@enclosing_scope, variable_bindings, @model.body)
|
41
|
-
else
|
42
|
-
raise ArgumentError, Puppet::Pops::Types::TypeMismatchDescriber.describe_signatures(closure_name, [self], final_args)
|
43
|
-
end
|
30
|
+
call_with_scope(@enclosing_scope, args)
|
44
31
|
end
|
45
32
|
|
46
33
|
# This method makes a Closure compatible with a Dispatch. This is used when the closure is wrapped in a Function
|
@@ -48,20 +35,29 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
|
|
48
35
|
# checks of the argument type/arity validity).
|
49
36
|
# @api private
|
50
37
|
def invoke(instance, calling_scope, args, &block)
|
51
|
-
|
38
|
+
@enclosing_scope.with_global_scope do |global_scope|
|
39
|
+
call_with_scope(global_scope, args, &block)
|
40
|
+
end
|
52
41
|
end
|
53
42
|
|
54
43
|
# Call closure with argument assignment by name
|
55
44
|
def call_by_name(args_hash, enforce_parameters)
|
56
45
|
if enforce_parameters
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
46
|
+
# Push a temporary parameter scope used while resolving the parameter defaults
|
47
|
+
@enclosing_scope.with_parameter_scope(parameter_names) do |param_scope|
|
48
|
+
args_hash.each { |k, v| param_scope[k] = v unless v.nil? && parameter_names.include?(k) }
|
49
|
+
parameters.each do |p|
|
50
|
+
name = p.name
|
51
|
+
# only set result of default expr if it is defined (it is otherwise not possible to differentiate
|
52
|
+
# between explicit undef and no default expression
|
53
|
+
arg = args_hash[name]
|
54
|
+
if arg.nil? && !p.value.nil?
|
55
|
+
param_scope[name] = param_scope.evaluate(name, p.value, @enclosing_scope, @evaluator)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
args_hash = param_scope.to_hash
|
63
59
|
end
|
64
|
-
|
60
|
+
Types::TypeMismatchDescriber.validate_parameters(closure_name, params_struct, args_hash)
|
65
61
|
end
|
66
62
|
|
67
63
|
@evaluator.evaluate_block_with_bindings(@enclosing_scope, args_hash, @model.body)
|
@@ -112,7 +108,7 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
|
|
112
108
|
CLOSURE_NAME
|
113
109
|
end
|
114
110
|
|
115
|
-
class Named <
|
111
|
+
class Named < Closure
|
116
112
|
def initialize(name, evaluator, model, scope)
|
117
113
|
@name = name
|
118
114
|
super(evaluator, model, scope)
|
@@ -125,52 +121,70 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
|
|
125
121
|
|
126
122
|
private
|
127
123
|
|
128
|
-
def
|
129
|
-
variable_bindings =
|
124
|
+
def call_with_scope(scope, args)
|
125
|
+
variable_bindings = combine_values_with_parameters(scope, args)
|
126
|
+
|
127
|
+
tc = Types::TypeCalculator.singleton
|
128
|
+
final_args = tc.infer_set(parameters.reduce([]) do |tmp_args, param|
|
129
|
+
if param.captures_rest
|
130
|
+
tmp_args.concat(variable_bindings[param.name])
|
131
|
+
else
|
132
|
+
tmp_args << variable_bindings[param.name]
|
133
|
+
end
|
134
|
+
end)
|
130
135
|
|
131
|
-
|
132
|
-
|
133
|
-
|
136
|
+
if type.callable?(final_args)
|
137
|
+
@evaluator.evaluate_block_with_bindings(scope, variable_bindings, @model.body)
|
138
|
+
else
|
139
|
+
raise ArgumentError, Types::TypeMismatchDescriber.describe_signatures(closure_name, [self], final_args)
|
140
|
+
end
|
141
|
+
end
|
134
142
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
143
|
+
def combine_values_with_parameters(scope, args)
|
144
|
+
scope.with_parameter_scope(parameter_names) do |param_scope|
|
145
|
+
parameters.each_with_index do |parameter, index|
|
146
|
+
param_captures = parameter.captures_rest
|
147
|
+
default_expression = parameter.value
|
148
|
+
|
149
|
+
if index >= args.size
|
150
|
+
if default_expression
|
151
|
+
# not given, has default
|
152
|
+
value = param_scope.evaluate(parameter.name, default_expression, scope, @evaluator)
|
153
|
+
|
154
|
+
if param_captures && !value.is_a?(Array)
|
155
|
+
# correct non array default value
|
156
|
+
value = [value]
|
157
|
+
end
|
158
|
+
else
|
159
|
+
# not given, does not have default
|
160
|
+
if param_captures
|
161
|
+
# default for captures rest is an empty array
|
162
|
+
value = []
|
163
|
+
else
|
164
|
+
@evaluator.fail(Issues::MISSING_REQUIRED_PARAMETER, parameter, { :param_name => parameter.name })
|
165
|
+
end
|
142
166
|
end
|
143
167
|
else
|
144
|
-
|
168
|
+
given_argument = args[index]
|
145
169
|
if param_captures
|
146
|
-
#
|
147
|
-
value = []
|
170
|
+
# get excess arguments
|
171
|
+
value = args[(parameter_count-1)..-1]
|
172
|
+
# If the input was a single nil, or undef, and there is a default, use the default
|
173
|
+
# This supports :undef in case it was used in a 3x data structure and it is passed as an arg
|
174
|
+
#
|
175
|
+
if value.size == 1 && (given_argument.nil? || given_argument == :undef) && default_expression
|
176
|
+
value = param_scope.evaluate(parameter.name, default_expression, scope, @evaluator)
|
177
|
+
# and ensure it is an array
|
178
|
+
value = [value] unless value.is_a?(Array)
|
179
|
+
end
|
148
180
|
else
|
149
|
-
|
181
|
+
value = given_argument
|
150
182
|
end
|
151
183
|
end
|
152
|
-
|
153
|
-
given_argument = args[index]
|
154
|
-
if param_captures
|
155
|
-
# get excess arguments
|
156
|
-
value = args[(parameter_count-1)..-1]
|
157
|
-
# If the input was a single nil, or undef, and there is a default, use the default
|
158
|
-
# This supports :undef in case it was used in a 3x data structure and it is passed as an arg
|
159
|
-
#
|
160
|
-
if value.size == 1 && (given_argument.nil? || given_argument == :undef) && default_expression
|
161
|
-
value = @evaluator.evaluate(default_expression, @enclosing_scope)
|
162
|
-
# and ensure it is an array
|
163
|
-
value = [value] unless value.is_a?(Array)
|
164
|
-
end
|
165
|
-
else
|
166
|
-
value = given_argument
|
167
|
-
end
|
184
|
+
param_scope[parameter.name] = value
|
168
185
|
end
|
169
|
-
|
170
|
-
variable_bindings[parameter.name] = value
|
186
|
+
param_scope.to_hash
|
171
187
|
end
|
172
|
-
|
173
|
-
variable_bindings
|
174
188
|
end
|
175
189
|
|
176
190
|
def create_callable_type()
|
@@ -185,7 +199,7 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
|
|
185
199
|
if param_range[0] == 0
|
186
200
|
in_optional_parameters = true
|
187
201
|
elsif param_range[0] != 0 && in_optional_parameters
|
188
|
-
@evaluator.fail(
|
202
|
+
@evaluator.fail(Issues::REQUIRED_PARAMETER_AFTER_OPTIONAL, param, { :param_name => param.name })
|
189
203
|
end
|
190
204
|
|
191
205
|
range[0] += param_range[0]
|
@@ -196,11 +210,11 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
|
|
196
210
|
range[1] = :default
|
197
211
|
end
|
198
212
|
|
199
|
-
|
213
|
+
Types::TypeFactory.callable(*(types + range))
|
200
214
|
end
|
201
215
|
|
202
216
|
def create_params_struct
|
203
|
-
type_factory =
|
217
|
+
type_factory = Types::TypeFactory
|
204
218
|
members = {}
|
205
219
|
|
206
220
|
parameters.each do |param|
|
@@ -216,10 +230,10 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
|
|
216
230
|
type = if param.type_expr
|
217
231
|
@evaluator.evaluate(param.type_expr, @enclosing_scope)
|
218
232
|
else
|
219
|
-
|
233
|
+
Types::PAnyType::DEFAULT
|
220
234
|
end
|
221
235
|
|
222
|
-
if param.captures_rest && type.is_a?(
|
236
|
+
if param.captures_rest && type.is_a?(Types::PArrayType)
|
223
237
|
# An array on a slurp parameter is how a size range is defined for a
|
224
238
|
# slurp (Array[Integer, 1, 3] *$param). However, the callable that is
|
225
239
|
# created can't have the array in that position or else type checking
|
@@ -228,7 +242,7 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
|
|
228
242
|
# to be unpacked.
|
229
243
|
param_range = type.size_range
|
230
244
|
type = type.element_type
|
231
|
-
elsif param.captures_rest && !type.is_a?(
|
245
|
+
elsif param.captures_rest && !type.is_a?(Types::PArrayType)
|
232
246
|
param_range = ANY_NUMBER_RANGE
|
233
247
|
elsif param.value
|
234
248
|
param_range = OPTIONAL_SINGLE_RANGE
|
@@ -247,3 +261,5 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
|
|
247
261
|
OPTIONAL_SINGLE_RANGE = [0, 1]
|
248
262
|
REQUIRED_SINGLE_RANGE = [1, 1]
|
249
263
|
end
|
264
|
+
end
|
265
|
+
end
|
@@ -1,16 +1,18 @@
|
|
1
|
-
|
1
|
+
module Puppet::Pops
|
2
|
+
module Evaluator
|
3
|
+
class CollectorTransformer
|
2
4
|
|
3
5
|
def initialize
|
4
|
-
@@query_visitor ||=
|
5
|
-
@@match_visitor ||=
|
6
|
-
@@evaluator ||=
|
7
|
-
@@compare_operator ||=
|
6
|
+
@@query_visitor ||= Visitor.new(nil, "query", 1, 1)
|
7
|
+
@@match_visitor ||= Visitor.new(nil, "match", 1, 1)
|
8
|
+
@@evaluator ||= EvaluatorImpl.new
|
9
|
+
@@compare_operator ||= CompareOperator.new()
|
8
10
|
end
|
9
11
|
|
10
12
|
def transform(o, scope)
|
11
|
-
raise ArgumentError, "Expected CollectExpression" unless o.is_a?
|
13
|
+
raise ArgumentError, "Expected CollectExpression" unless o.is_a? Model::CollectExpression
|
12
14
|
|
13
|
-
raise "LHS is not a type" unless o.type_expr.is_a?
|
15
|
+
raise "LHS is not a type" unless o.type_expr.is_a? Model::QualifiedReference
|
14
16
|
type = o.type_expr.value().downcase()
|
15
17
|
|
16
18
|
if type == 'class'
|
@@ -20,7 +22,7 @@ class Puppet::Pops::Evaluator::CollectorTransformer
|
|
20
22
|
resource_type = scope.find_resource_type(type)
|
21
23
|
fail "Resource type #{type} doesn't exist" unless resource_type
|
22
24
|
|
23
|
-
adapter =
|
25
|
+
adapter = Adapters::SourcePosAdapter.adapt(o)
|
24
26
|
line_num = adapter.line
|
25
27
|
position = adapter.pos
|
26
28
|
file_path = adapter.locator.file
|
@@ -38,11 +40,11 @@ class Puppet::Pops::Evaluator::CollectorTransformer
|
|
38
40
|
code = query_unless_nop(o.query, scope)
|
39
41
|
|
40
42
|
case o.query
|
41
|
-
when
|
42
|
-
newcoll =
|
43
|
-
when
|
43
|
+
when Model::VirtualQuery
|
44
|
+
newcoll = Collectors::CatalogCollector.new(scope, resource_type.name, code, overrides)
|
45
|
+
when Model::ExportedQuery
|
44
46
|
match = match_unless_nop(o.query, scope)
|
45
|
-
newcoll =
|
47
|
+
newcoll = Collectors::ExportedCollector.new(scope, resource_type.name, match, code, overrides)
|
46
48
|
end
|
47
49
|
|
48
50
|
scope.compiler.add_collection(newcoll)
|
@@ -61,13 +63,13 @@ protected
|
|
61
63
|
end
|
62
64
|
|
63
65
|
def query_unless_nop(query, scope)
|
64
|
-
unless query.expr.nil? || query.expr.is_a?(
|
66
|
+
unless query.expr.nil? || query.expr.is_a?(Model::Nop)
|
65
67
|
query(query.expr, scope)
|
66
68
|
end
|
67
69
|
end
|
68
70
|
|
69
71
|
def match_unless_nop(query, scope)
|
70
|
-
unless query.expr.nil? || query.expr.is_a?(
|
72
|
+
unless query.expr.nil? || query.expr.is_a?(Model::Nop)
|
71
73
|
match(query.expr, scope)
|
72
74
|
end
|
73
75
|
end
|
@@ -223,3 +225,5 @@ protected
|
|
223
225
|
raise ArgumentError, "Cannot transform object of class #{o.class}"
|
224
226
|
end
|
225
227
|
end
|
228
|
+
end
|
229
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
module Puppet::Pops
|
2
|
+
module Evaluator
|
1
3
|
# Compares the puppet DSL way
|
2
4
|
#
|
3
5
|
# ==Equality
|
@@ -6,20 +8,20 @@
|
|
6
8
|
# Hashes are equal to hashes if they have the same size and keys and values #equals.
|
7
9
|
# All other objects are equal if they are ruby #== equal
|
8
10
|
#
|
9
|
-
class
|
10
|
-
include
|
11
|
+
class CompareOperator
|
12
|
+
include Utils
|
11
13
|
|
12
14
|
# Provides access to the Puppet 3.x runtime (scope, etc.)
|
13
15
|
# This separation has been made to make it easier to later migrate the evaluator to an improved runtime.
|
14
16
|
#
|
15
|
-
include
|
17
|
+
include Runtime3Support
|
16
18
|
|
17
19
|
def initialize
|
18
|
-
@@equals_visitor ||=
|
19
|
-
@@compare_visitor ||=
|
20
|
-
@@match_visitor ||=
|
21
|
-
@@include_visitor ||=
|
22
|
-
@type_calculator =
|
20
|
+
@@equals_visitor ||= Visitor.new(self, "equals", 1, 1)
|
21
|
+
@@compare_visitor ||= Visitor.new(self, "cmp", 1, 1)
|
22
|
+
@@match_visitor ||= Visitor.new(self, "match", 2, 2)
|
23
|
+
@@include_visitor ||= Visitor.new(self, "include", 2, 2)
|
24
|
+
@type_calculator = Types::TypeCalculator.new()
|
23
25
|
end
|
24
26
|
|
25
27
|
def equals (a, b)
|
@@ -143,7 +145,7 @@ class Puppet::Pops::Evaluator::CompareOperator
|
|
143
145
|
# Always set match data, a "not found" should not keep old match data visible
|
144
146
|
set_match_data(matched, scope) # creates ephemeral
|
145
147
|
return !!matched
|
146
|
-
when
|
148
|
+
when Types::PAnyType
|
147
149
|
a.each {|element| return true if @type_calculator.instance?(b, element) }
|
148
150
|
return false
|
149
151
|
else
|
@@ -193,3 +195,5 @@ class Puppet::Pops::Evaluator::CompareOperator
|
|
193
195
|
equals(left, default, scope)
|
194
196
|
end
|
195
197
|
end
|
198
|
+
end
|
199
|
+
end
|
@@ -66,18 +66,19 @@ class Puppet::Pops::Evaluator::EppEvaluator
|
|
66
66
|
|
67
67
|
parameters_specified = body.body.parameters_specified
|
68
68
|
if parameters_specified || template_args_set
|
69
|
-
# no epp params or user provided arguments in a hash, epp() logic
|
70
|
-
# only sees global + what was given
|
71
|
-
closure_scope = scope.find_global_scope
|
72
69
|
enforce_parameters = parameters_specified
|
73
70
|
else
|
74
|
-
# no epp params and no arguments were given => inline_epp() logic
|
75
|
-
# sees all local variables, epp() all global
|
76
|
-
closure_scope = use_global_scope_only ? scope.find_global_scope : scope
|
77
71
|
enforce_parameters = true
|
78
72
|
end
|
79
|
-
|
80
|
-
|
73
|
+
|
74
|
+
# inline_epp() logic sees all local variables, epp() all global
|
75
|
+
if use_global_scope_only
|
76
|
+
scope.with_global_scope do |global_scope|
|
77
|
+
parser.closure(body, global_scope).call_by_name(template_args, enforce_parameters)
|
78
|
+
end
|
79
|
+
else
|
80
|
+
parser.closure(body, scope).call_by_name(template_args, enforce_parameters)
|
81
|
+
end
|
81
82
|
end
|
82
83
|
|
83
84
|
def self.handle_template_args(func_name, template_args)
|
@@ -1,11 +1,15 @@
|
|
1
1
|
require 'rgen/ecore/ecore'
|
2
|
+
require 'puppet/parser/scope'
|
2
3
|
require 'puppet/pops/evaluator/compare_operator'
|
3
4
|
require 'puppet/pops/evaluator/relationship_operator'
|
4
5
|
require 'puppet/pops/evaluator/access_operator'
|
5
6
|
require 'puppet/pops/evaluator/closure'
|
6
7
|
require 'puppet/pops/evaluator/external_syntax_support'
|
8
|
+
require 'puppet/pops/types/iterable'
|
7
9
|
|
8
|
-
|
10
|
+
module Puppet::Pops
|
11
|
+
module Evaluator
|
12
|
+
# This implementation of {Evaluator} performs evaluation using the puppet 3.x runtime system
|
9
13
|
# in a manner largely compatible with Puppet 3.x, but adds new features and introduces constraints.
|
10
14
|
#
|
11
15
|
# The evaluation uses _polymorphic dispatch_ which works by dispatching to the first found method named after
|
@@ -18,17 +22,17 @@ require 'puppet/pops/evaluator/external_syntax_support'
|
|
18
22
|
# either the actual class, or one of its super classes). The _scope_ parameter is always the scope in which
|
19
23
|
# the evaluation takes place. If nothing else is mentioned, the return is always the result of evaluation.
|
20
24
|
#
|
21
|
-
# See {
|
25
|
+
# See {Visitable} and {Visitor} for more information about
|
22
26
|
# polymorphic calling.
|
23
27
|
#
|
24
|
-
class
|
25
|
-
include
|
28
|
+
class EvaluatorImpl
|
29
|
+
include Utils
|
26
30
|
|
27
31
|
# Provides access to the Puppet 3.x runtime (scope, etc.)
|
28
32
|
# This separation has been made to make it easier to later migrate the evaluator to an improved runtime.
|
29
33
|
#
|
30
|
-
include
|
31
|
-
include
|
34
|
+
include Runtime3Support
|
35
|
+
include ExternalSyntaxSupport
|
32
36
|
|
33
37
|
EMPTY_STRING = ''.freeze
|
34
38
|
COMMA_SEPARATOR = ', '.freeze
|
@@ -36,22 +40,22 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
36
40
|
# Reference to Issues name space makes it easier to refer to issues
|
37
41
|
# (Issues are shared with the validator).
|
38
42
|
#
|
39
|
-
Issues =
|
43
|
+
Issues = Issues
|
40
44
|
|
41
45
|
def initialize
|
42
|
-
@@eval_visitor ||=
|
43
|
-
@@lvalue_visitor ||=
|
44
|
-
@@assign_visitor ||=
|
45
|
-
@@string_visitor ||=
|
46
|
+
@@eval_visitor ||= Visitor.new(self, "eval", 1, 1)
|
47
|
+
@@lvalue_visitor ||= Visitor.new(self, "lvalue", 1, 1)
|
48
|
+
@@assign_visitor ||= Visitor.new(self, "assign", 3, 3)
|
49
|
+
@@string_visitor ||= Visitor.new(self, "string", 1, 1)
|
46
50
|
|
47
|
-
@@type_calculator ||=
|
48
|
-
@@type_parser ||=
|
51
|
+
@@type_calculator ||= Types::TypeCalculator.new()
|
52
|
+
@@type_parser ||= Types::TypeParser.new()
|
49
53
|
|
50
|
-
@@compare_operator ||=
|
51
|
-
@@relationship_operator ||=
|
54
|
+
@@compare_operator ||= CompareOperator.new()
|
55
|
+
@@relationship_operator ||= RelationshipOperator.new()
|
52
56
|
|
53
57
|
# Use null migration checker unless given in context
|
54
|
-
@migration_checker = (Puppet.lookup(:migration_checker) {
|
58
|
+
@migration_checker = (Puppet.lookup(:migration_checker) { Migration::MigrationChecker.new() })
|
55
59
|
end
|
56
60
|
|
57
61
|
# @api private
|
@@ -72,7 +76,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
72
76
|
begin
|
73
77
|
@@eval_visitor.visit_this_1(self, target, scope)
|
74
78
|
|
75
|
-
rescue
|
79
|
+
rescue SemanticError => e
|
76
80
|
# A raised issue may not know the semantic target, use errors call stack, but fill in the
|
77
81
|
# rest from a supplied semantic object, or the target instruction if there is not semantic
|
78
82
|
# object.
|
@@ -119,7 +123,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
119
123
|
#
|
120
124
|
# @param target [Object] assignment target - see methods on the pattern assign_TYPE for actual supported types.
|
121
125
|
# @param value [Object] the value to assign to `target`
|
122
|
-
# @param o [
|
126
|
+
# @param o [Model::PopsObject] originating instruction
|
123
127
|
# @param scope [Object] the runtime specific scope where evaluation should take place
|
124
128
|
#
|
125
129
|
# @api private
|
@@ -153,12 +157,12 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
153
157
|
#
|
154
158
|
# @param scope [Puppet::Parser::Scope] the parent scope
|
155
159
|
# @param variable_bindings [Hash{String => Object}] the variable names and values to bind (names are keys, bound values are values)
|
156
|
-
# @param block [
|
160
|
+
# @param block [Model::BlockExpression] the sequence of expressions to evaluate in the new scope
|
157
161
|
#
|
158
162
|
# @api private
|
159
163
|
#
|
160
164
|
def evaluate_block_with_bindings(scope, variable_bindings, block_expr)
|
161
|
-
with_guarded_scope
|
165
|
+
scope.with_guarded_scope do
|
162
166
|
# change to create local scope_from - cannot give it file and line -
|
163
167
|
# that is the place of the call, not "here"
|
164
168
|
create_local_scope_from(variable_bindings, scope)
|
@@ -190,7 +194,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
190
194
|
# $name = value
|
191
195
|
# @param name [String] name of variable without $
|
192
196
|
# @param value [Object] value to assign to the variable
|
193
|
-
# @param o [
|
197
|
+
# @param o [Model::PopsObject] originating instruction
|
194
198
|
# @param scope [Object] the runtime specific scope where evaluation should take place
|
195
199
|
# @return [value<Object>]
|
196
200
|
#
|
@@ -257,7 +261,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
257
261
|
#
|
258
262
|
def eval_ReservedWord(o, scope)
|
259
263
|
if !o.future
|
260
|
-
fail(
|
264
|
+
fail(Issues::RESERVED_WORD, o, {:word => o.word})
|
261
265
|
else
|
262
266
|
o.word
|
263
267
|
end
|
@@ -274,7 +278,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
274
278
|
# A QualifiedReference (i.e. a capitalized qualified name such as Foo, or Foo::Bar) evaluates to a PType
|
275
279
|
#
|
276
280
|
def eval_QualifiedReference(o, scope)
|
277
|
-
@@type_parser.interpret(o)
|
281
|
+
@@type_parser.interpret(o, scope)
|
278
282
|
end
|
279
283
|
|
280
284
|
def eval_NotExpression(o, scope)
|
@@ -294,6 +298,8 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
294
298
|
candidate
|
295
299
|
when Hash
|
296
300
|
candidate.to_a
|
301
|
+
when Puppet::Pops::Types::Iterator
|
302
|
+
candidate.to_a
|
297
303
|
else
|
298
304
|
# turns anything else into an array (so result can be unfolded)
|
299
305
|
[candidate]
|
@@ -419,7 +425,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
419
425
|
def eval_AccessExpression(o, scope)
|
420
426
|
left = evaluate(o.left_expr, scope)
|
421
427
|
keys = o.keys.nil? ? [] : o.keys.collect {|key| evaluate(key, scope) }
|
422
|
-
|
428
|
+
AccessOperator.new(o).access(left, scope, *keys)
|
423
429
|
end
|
424
430
|
|
425
431
|
# Evaluates <, <=, >, >=, and ==
|
@@ -430,7 +436,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
430
436
|
|
431
437
|
begin
|
432
438
|
# Left is a type
|
433
|
-
if left.is_a?(
|
439
|
+
if left.is_a?(Types::PAnyType)
|
434
440
|
case o.operator
|
435
441
|
when :'=='
|
436
442
|
@@type_calculator.equals(left,right)
|
@@ -503,7 +509,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
503
509
|
pattern = evaluate(o.right_expr, scope)
|
504
510
|
|
505
511
|
# matches RHS types as instance of for all types except a parameterized Regexp[R]
|
506
|
-
if pattern.is_a?(
|
512
|
+
if pattern.is_a?(Types::PAnyType)
|
507
513
|
# evaluate as instance? of type check
|
508
514
|
matched = @@type_calculator.instance?(pattern, left)
|
509
515
|
# convert match result to Boolean true, or false
|
@@ -584,7 +590,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
584
590
|
# memo scope level before evaluating test - don't want a match in the case test to leak $n match vars
|
585
591
|
# to expressions after the case expression.
|
586
592
|
#
|
587
|
-
with_guarded_scope
|
593
|
+
scope.with_guarded_scope do
|
588
594
|
test = evaluate(o.test, scope)
|
589
595
|
|
590
596
|
result = nil
|
@@ -594,10 +600,10 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
594
600
|
if co.values.find do |c|
|
595
601
|
c = unwind_parentheses(c)
|
596
602
|
case c
|
597
|
-
when
|
603
|
+
when Model::LiteralDefault
|
598
604
|
the_default = co.then_expr
|
599
605
|
next false
|
600
|
-
when
|
606
|
+
when Model::UnfoldExpression
|
601
607
|
# not ideal for error reporting, since it is not known which unfolded result
|
602
608
|
# that caused an error - the entire unfold expression is blamed (i.e. the var c, passed to is_match?)
|
603
609
|
evaluate(c, scope).any? {|v| is_match?(test, v, c, co, scope) }
|
@@ -621,7 +627,10 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
621
627
|
# to the compiler to collect the resources specified by the query.
|
622
628
|
#
|
623
629
|
def eval_CollectExpression o, scope
|
624
|
-
|
630
|
+
if o.query.is_a?(Model::ExportedQuery)
|
631
|
+
optionally_fail(Issues::RT_NO_STORECONFIGS, o);
|
632
|
+
end
|
633
|
+
CollectorTransformer.new().transform(o,scope)
|
625
634
|
end
|
626
635
|
|
627
636
|
def eval_ParenthesizedExpression(o, scope)
|
@@ -652,47 +661,47 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
652
661
|
|
653
662
|
# Get the type name
|
654
663
|
type_name =
|
655
|
-
if (tmp_name = o.type_name).is_a?(
|
664
|
+
if (tmp_name = o.type_name).is_a?(Model::QualifiedName)
|
656
665
|
tmp_name.value # already validated as a name
|
657
666
|
else
|
658
667
|
type_name_acceptable =
|
659
668
|
case o.type_name
|
660
|
-
when
|
669
|
+
when Model::QualifiedReference
|
661
670
|
true
|
662
|
-
when
|
663
|
-
o.type_name.left_expr.is_a?(
|
671
|
+
when Model::AccessExpression
|
672
|
+
o.type_name.left_expr.is_a?(Model::QualifiedReference)
|
664
673
|
end
|
665
674
|
|
666
675
|
evaluated_name = evaluate(tmp_name, scope)
|
667
676
|
unless type_name_acceptable
|
668
677
|
actual = type_calculator.generalize(type_calculator.infer(evaluated_name)).to_s
|
669
|
-
fail(
|
678
|
+
fail(Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, {:actual => actual})
|
670
679
|
end
|
671
680
|
|
672
681
|
# must be a CatalogEntry subtype
|
673
682
|
case evaluated_name
|
674
|
-
when
|
683
|
+
when Types::PHostClassType
|
675
684
|
unless evaluated_name.class_name.nil?
|
676
|
-
fail(
|
685
|
+
fail(Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, {:actual=> evaluated_name.to_s})
|
677
686
|
end
|
678
687
|
'class'
|
679
688
|
|
680
|
-
when
|
689
|
+
when Types::PResourceType
|
681
690
|
unless evaluated_name.title().nil?
|
682
|
-
fail(
|
691
|
+
fail(Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, {:actual=> evaluated_name.to_s})
|
683
692
|
end
|
684
693
|
evaluated_name.type_name # assume validated
|
685
694
|
|
686
695
|
else
|
687
696
|
actual = type_calculator.generalize(type_calculator.infer(evaluated_name)).to_s
|
688
|
-
fail(
|
697
|
+
fail(Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, {:actual=>actual})
|
689
698
|
end
|
690
699
|
end
|
691
700
|
|
692
701
|
# This is a runtime check - the model is valid, but will have runtime issues when evaluated
|
693
702
|
# and storeconfigs is not set.
|
694
703
|
if(o.exported)
|
695
|
-
optionally_fail(
|
704
|
+
optionally_fail(Issues::RT_NO_STORECONFIGS_EXPORT, o);
|
696
705
|
end
|
697
706
|
|
698
707
|
titles_to_body = {}
|
@@ -710,24 +719,24 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
710
719
|
# There may be a :default entry, its entries apply with lower precedence
|
711
720
|
#
|
712
721
|
if titles.nil?
|
713
|
-
fail(
|
722
|
+
fail(Issues::MISSING_TITLE, body.title)
|
714
723
|
end
|
715
724
|
titles = [titles].flatten
|
716
725
|
|
717
726
|
# Check types of evaluated titles and duplicate entries
|
718
727
|
titles.each_with_index do |title, index|
|
719
728
|
if title.nil?
|
720
|
-
fail(
|
729
|
+
fail(Issues::MISSING_TITLE_AT, body.title, {:index => index})
|
721
730
|
|
722
731
|
elsif !title.is_a?(String) && title != :default
|
723
732
|
actual = type_calculator.generalize(type_calculator.infer(title)).to_s
|
724
|
-
fail(
|
733
|
+
fail(Issues::ILLEGAL_TITLE_TYPE_AT, body.title, {:index => index, :actual => actual})
|
725
734
|
|
726
735
|
elsif title == EMPTY_STRING
|
727
|
-
fail(
|
736
|
+
fail(Issues::EMPTY_STRING_TITLE_AT, body.title, {:index => index})
|
728
737
|
|
729
738
|
elsif titles_to_body[title]
|
730
|
-
fail(
|
739
|
+
fail(Issues::DUPLICATE_TITLE, o, {:title => title})
|
731
740
|
end
|
732
741
|
titles_to_body[title] = body
|
733
742
|
end
|
@@ -744,7 +753,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
744
753
|
params = [params] unless params.is_a?(Array)
|
745
754
|
params.each do |p|
|
746
755
|
if param_memo.include? p.name
|
747
|
-
fail(
|
756
|
+
fail(Issues::DUPLICATE_ATTRIBUTE, o, {:attribute => p.name})
|
748
757
|
end
|
749
758
|
param_memo[p.name] = p
|
750
759
|
end
|
@@ -780,7 +789,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
780
789
|
hashed_params = evaluate(o.expr, scope)
|
781
790
|
unless hashed_params.is_a?(Hash)
|
782
791
|
actual = type_calculator.generalize(type_calculator.infer(hashed_params)).to_s
|
783
|
-
fail(
|
792
|
+
fail(Issues::TYPE_MISMATCH, o.expr, {:expected => 'Hash', :actual => actual})
|
784
793
|
end
|
785
794
|
hashed_params.map { |k,v| create_resource_parameter(o, scope, k, v, :'=>') }
|
786
795
|
end
|
@@ -790,7 +799,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
790
799
|
def eval_ResourceDefaultsExpression(o, scope)
|
791
800
|
type = evaluate(o.type_ref, scope)
|
792
801
|
type_name =
|
793
|
-
if type.is_a?(
|
802
|
+
if type.is_a?(Types::PResourceType) && !type.type_name.nil? && type.title.nil?
|
794
803
|
type.type_name # assume it is a valid name
|
795
804
|
else
|
796
805
|
actual = type_calculator.generalize(type_calculator.infer(type))
|
@@ -808,9 +817,9 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
808
817
|
# The functor expression is not evaluated, it is not possible to select the function to call
|
809
818
|
# via an expression like $a()
|
810
819
|
case o.functor_expr
|
811
|
-
when
|
820
|
+
when Model::QualifiedName
|
812
821
|
# ok
|
813
|
-
when
|
822
|
+
when Model::RenderStringExpression
|
814
823
|
# helpful to point out this easy to make Epp error
|
815
824
|
fail(Issues::ILLEGAL_EPP_PARAMETERS, o)
|
816
825
|
else
|
@@ -823,12 +832,12 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
823
832
|
# Evaluation of CallMethodExpression handles a NamedAccessExpression functor (receiver.function_name)
|
824
833
|
#
|
825
834
|
def eval_CallMethodExpression(o, scope)
|
826
|
-
unless o.functor_expr.is_a?
|
835
|
+
unless o.functor_expr.is_a? Model::NamedAccessExpression
|
827
836
|
fail(Issues::ILLEGAL_EXPRESSION, o.functor_expr, {:feature=>'function accessor', :container => o})
|
828
837
|
end
|
829
838
|
receiver = unfold([], [o.functor_expr.left_expr], scope)
|
830
839
|
name = o.functor_expr.right_expr
|
831
|
-
unless name.is_a?
|
840
|
+
unless name.is_a? Model::QualifiedName
|
832
841
|
fail(Issues::ILLEGAL_EXPRESSION, o.functor_expr, {:feature=>'function name', :container => o})
|
833
842
|
end
|
834
843
|
name = name.value # the string function name
|
@@ -839,8 +848,8 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
839
848
|
if o.lambda.nil?
|
840
849
|
call_function(name, evaluated_arguments, o, scope)
|
841
850
|
else
|
842
|
-
closure =
|
843
|
-
call_function(name, evaluated_arguments, o, scope, &
|
851
|
+
closure = Closure.new(self, o.lambda, scope)
|
852
|
+
call_function(name, evaluated_arguments, o, scope, &PuppetProc.new(closure) { |*args| closure.call(*args) })
|
844
853
|
end
|
845
854
|
end
|
846
855
|
private :call_function_with_block
|
@@ -852,17 +861,17 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
852
861
|
# memo scope level before evaluating test - don't want a match in the case test to leak $n match vars
|
853
862
|
# to expressions after the selector expression.
|
854
863
|
#
|
855
|
-
with_guarded_scope
|
864
|
+
scope.with_guarded_scope do
|
856
865
|
test = evaluate(o.left_expr, scope)
|
857
866
|
|
858
867
|
the_default = nil
|
859
868
|
selected = o.selectors.find do |s|
|
860
869
|
me = unwind_parentheses(s.matching_expr)
|
861
870
|
case me
|
862
|
-
when
|
871
|
+
when Model::LiteralDefault
|
863
872
|
the_default = s.value_expr
|
864
873
|
false
|
865
|
-
when
|
874
|
+
when Model::UnfoldExpression
|
866
875
|
# not ideal for error reporting, since it is not known which unfolded result
|
867
876
|
# that caused an error - the entire unfold expression is blamed (i.e. the var c, passed to is_match?)
|
868
877
|
evaluate(me, scope).any? {|v| is_match?(test, v, me, s, scope) }
|
@@ -894,7 +903,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
894
903
|
|
895
904
|
# Evaluates Puppet DSL `if`
|
896
905
|
def eval_IfExpression o, scope
|
897
|
-
with_guarded_scope
|
906
|
+
scope.with_guarded_scope do
|
898
907
|
if is_true?(evaluate(o.test, scope), o.test)
|
899
908
|
evaluate(o.then_expr, scope)
|
900
909
|
else
|
@@ -905,7 +914,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
905
914
|
|
906
915
|
# Evaluates Puppet DSL `unless`
|
907
916
|
def eval_UnlessExpression o, scope
|
908
|
-
with_guarded_scope
|
917
|
+
scope.with_guarded_scope do
|
909
918
|
unless is_true?(evaluate(o.test, scope), o.test)
|
910
919
|
evaluate(o.then_expr, scope)
|
911
920
|
else
|
@@ -953,7 +962,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
953
962
|
# @return [String] the interpolated result
|
954
963
|
#
|
955
964
|
def eval_TextExpression o, scope
|
956
|
-
if o.expr.is_a?(
|
965
|
+
if o.expr.is_a?(Model::QualifiedName)
|
957
966
|
string(get_variable_value(o.expr.value, o, scope), scope)
|
958
967
|
else
|
959
968
|
string(evaluate(o.expr, scope), scope)
|
@@ -985,7 +994,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
985
994
|
end
|
986
995
|
|
987
996
|
def string_PAnyType(o, scope)
|
988
|
-
|
997
|
+
o.to_s
|
989
998
|
end
|
990
999
|
|
991
1000
|
# Produces concatenation / merge of x and y.
|
@@ -1057,7 +1066,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
1057
1066
|
# Use type calcultor to determine if array is Array[Array[?]], and if so use second form
|
1058
1067
|
# of call
|
1059
1068
|
t = @@type_calculator.infer(y)
|
1060
|
-
if t.element_type.is_a?
|
1069
|
+
if t.element_type.is_a? Types::PArrayType
|
1061
1070
|
Hash[y]
|
1062
1071
|
else
|
1063
1072
|
Hash[*y]
|
@@ -1113,7 +1122,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
1113
1122
|
matched = right.match(left)
|
1114
1123
|
set_match_data(matched, scope) # creates or clears ephemeral
|
1115
1124
|
!!matched # convert to boolean
|
1116
|
-
elsif right.is_a?(
|
1125
|
+
elsif right.is_a?(Types::PAnyType)
|
1117
1126
|
# right is a type and left is not - check if left is an instance of the given type
|
1118
1127
|
# (The reverse is not terribly meaningful - computing which of the case options that first produces
|
1119
1128
|
# an instance of a given type).
|
@@ -1126,26 +1135,17 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
1126
1135
|
@@compare_operator.match(left, right, scope)
|
1127
1136
|
end
|
1128
1137
|
|
1129
|
-
def with_guarded_scope(scope)
|
1130
|
-
scope_memo = get_scope_nesting_level(scope)
|
1131
|
-
begin
|
1132
|
-
yield
|
1133
|
-
ensure
|
1134
|
-
set_scope_nesting_level(scope, scope_memo)
|
1135
|
-
end
|
1136
|
-
end
|
1137
|
-
|
1138
1138
|
# Maps the expression in the given array to their product except for UnfoldExpressions which are first unfolded.
|
1139
1139
|
# The result is added to the given result Array.
|
1140
1140
|
# @param result [Array] Where to add the result (may contain information to add to)
|
1141
|
-
# @param array [Array[
|
1141
|
+
# @param array [Array[Model::Expression] the expressions to map
|
1142
1142
|
# @param scope [Puppet::Parser::Scope] the scope to evaluate in
|
1143
1143
|
# @return [Array] the given result array with content added from the operation
|
1144
1144
|
#
|
1145
1145
|
def unfold(result, array, scope)
|
1146
1146
|
array.each do |x|
|
1147
1147
|
x = unwind_parentheses(x)
|
1148
|
-
if x.is_a?(
|
1148
|
+
if x.is_a?(Model::UnfoldExpression)
|
1149
1149
|
result.concat(evaluate(x, scope))
|
1150
1150
|
else
|
1151
1151
|
result << evaluate(x, scope)
|
@@ -1156,8 +1156,10 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
1156
1156
|
private :unfold
|
1157
1157
|
|
1158
1158
|
def unwind_parentheses(o)
|
1159
|
-
return o unless o.is_a?(
|
1159
|
+
return o unless o.is_a?(Model::ParenthesizedExpression)
|
1160
1160
|
unwind_parentheses(o.expr)
|
1161
1161
|
end
|
1162
1162
|
private :unwind_parentheses
|
1163
1163
|
end
|
1164
|
+
end
|
1165
|
+
end
|