puppet 3.6.2 → 3.7.0
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/CONTRIBUTING.md +2 -3
- data/Gemfile +14 -10
- data/README.md +1 -1
- data/ext/build_defaults.yaml +16 -1
- data/ext/debian/control +3 -2
- data/ext/debian/puppet-common.dirs +1 -0
- data/ext/debian/puppet-common.postinst +8 -8
- data/ext/debian/puppet-common.postrm +2 -1
- data/ext/project_data.yaml +16 -12
- data/ext/rack/example-passenger-vhost.conf +2 -2
- data/ext/redhat/puppet.spec.erb +6 -3
- data/ext/windows/service/daemon.rb +47 -41
- data/install.rb +1 -1
- data/lib/puppet.rb +34 -24
- data/lib/puppet/application.rb +34 -1
- data/lib/puppet/application/agent.rb +9 -8
- data/lib/puppet/application/apply.rb +14 -5
- data/lib/puppet/application/doc.rb +4 -11
- data/lib/puppet/application/master.rb +19 -17
- data/lib/puppet/application/queue.rb +1 -1
- data/lib/puppet/application/resource.rb +0 -1
- data/lib/puppet/configurer.rb +39 -2
- data/lib/puppet/configurer/downloader.rb +5 -10
- data/lib/puppet/configurer/downloader_factory.rb +34 -0
- data/lib/puppet/configurer/plugin_handler.rb +11 -17
- data/lib/puppet/defaults.rb +244 -119
- data/lib/puppet/environments.rb +8 -0
- data/lib/puppet/external/nagios/base.rb +1 -1
- data/lib/puppet/external/pson/pure/generator.rb +1 -8
- data/lib/puppet/face/ca.rb +7 -0
- data/lib/puppet/face/file/download.rb +5 -2
- data/lib/puppet/face/file/store.rb +1 -1
- data/lib/puppet/face/instrumentation_data.rb +2 -1
- data/lib/puppet/face/instrumentation_listener.rb +2 -1
- data/lib/puppet/face/instrumentation_probe.rb +2 -1
- data/lib/puppet/face/module/build.rb +2 -2
- data/lib/puppet/face/module/generate.rb +20 -12
- data/lib/puppet/face/module/install.rb +4 -3
- data/lib/puppet/face/module/uninstall.rb +7 -0
- data/lib/puppet/face/module/upgrade.rb +11 -3
- data/lib/puppet/face/node/clean.rb +1 -1
- data/lib/puppet/face/parser.rb +99 -7
- data/lib/puppet/feature/base.rb +18 -12
- data/lib/puppet/feature/cfacter.rb +14 -0
- data/lib/puppet/feature/pe_license.rb +4 -0
- data/lib/puppet/file_bucket/dipper.rb +19 -12
- data/lib/puppet/file_bucket/file.rb +73 -10
- data/lib/puppet/file_serving/configuration/parser.rb +3 -3
- data/lib/puppet/file_system.rb +1 -1
- data/lib/puppet/file_system/file19.rb +41 -0
- data/lib/puppet/file_system/file19windows.rb +0 -1
- data/lib/puppet/file_system/uniquefile.rb +190 -0
- data/lib/puppet/forge.rb +34 -7
- data/lib/puppet/forge/errors.rb +5 -6
- data/lib/puppet/forge/repository.rb +14 -2
- data/lib/puppet/functions.rb +19 -12
- data/lib/puppet/functions/assert_type.rb +27 -10
- data/lib/puppet/functions/each.rb +111 -0
- data/lib/puppet/functions/epp.rb +54 -0
- data/lib/puppet/functions/filter.rb +113 -0
- data/lib/puppet/functions/inline_epp.rb +88 -0
- data/lib/puppet/functions/map.rb +97 -0
- data/lib/puppet/functions/match.rb +102 -0
- data/lib/puppet/functions/reduce.rb +94 -0
- data/lib/puppet/functions/slice.rb +126 -0
- data/lib/puppet/functions/with.rb +23 -0
- data/lib/puppet/indirector/catalog/compiler.rb +4 -4
- data/lib/puppet/indirector/data_binding/hiera.rb +2 -45
- data/lib/puppet/indirector/facts/couch.rb +3 -1
- data/lib/puppet/indirector/facts/facter.rb +52 -65
- data/lib/puppet/indirector/file_bucket_file/file.rb +6 -3
- data/lib/puppet/indirector/hiera.rb +48 -0
- data/lib/puppet/indirector/indirection.rb +1 -1
- data/lib/puppet/indirector/request.rb +9 -3
- data/lib/puppet/indirector/resource/ral.rb +1 -1
- data/lib/puppet/indirector/rest.rb +7 -3
- data/lib/puppet/loaders.rb +0 -1
- data/lib/puppet/module.rb +2 -1
- data/lib/puppet/module_tool.rb +2 -0
- data/lib/puppet/module_tool/applications/application.rb +4 -5
- data/lib/puppet/module_tool/applications/builder.rb +64 -5
- data/lib/puppet/module_tool/applications/uninstaller.rb +3 -2
- data/lib/puppet/module_tool/applications/unpacker.rb +14 -0
- data/lib/puppet/module_tool/applications/upgrader.rb +23 -13
- data/lib/puppet/module_tool/dependency.rb +12 -0
- data/lib/puppet/module_tool/errors/shared.rb +1 -1
- data/lib/puppet/module_tool/errors/upgrader.rb +20 -0
- data/lib/puppet/module_tool/installed_modules.rb +6 -1
- data/lib/puppet/module_tool/metadata.rb +53 -3
- data/lib/puppet/module_tool/modulefile.rb +1 -1
- data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +7 -0
- data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +1 -1
- data/lib/puppet/module_tool/skeleton/templates/generator/spec/spec_helper.rb +1 -17
- data/lib/puppet/module_tool/tar/mini.rb +20 -2
- data/lib/puppet/network/http.rb +5 -0
- data/lib/puppet/network/http/api/v1.rb +2 -2
- data/lib/puppet/network/http/api/v2/environments.rb +15 -1
- data/lib/puppet/network/http/connection.rb +54 -68
- data/lib/puppet/network/http/factory.rb +44 -0
- data/lib/puppet/network/http/handler.rb +12 -6
- data/lib/puppet/network/http/nocache_pool.rb +21 -0
- data/lib/puppet/network/http/pool.rb +120 -0
- data/lib/puppet/network/http/rack/rest.rb +3 -1
- data/lib/puppet/network/http/session.rb +17 -0
- data/lib/puppet/network/http/site.rb +39 -0
- data/lib/puppet/network/http/webrick/rest.rb +3 -1
- data/lib/puppet/network/http_pool.rb +3 -4
- data/lib/puppet/node.rb +19 -6
- data/lib/puppet/node/environment.rb +34 -8
- data/lib/puppet/parser/ast/collection.rb +4 -0
- data/lib/puppet/parser/ast/collexpr.rb +1 -1
- data/lib/puppet/parser/ast/node.rb +5 -0
- data/lib/puppet/parser/ast/pops_bridge.rb +49 -6
- data/lib/puppet/parser/compiler.rb +66 -38
- data/lib/puppet/parser/e4_parser_adapter.rb +2 -2
- data/lib/puppet/parser/files.rb +76 -33
- data/lib/puppet/parser/functions.rb +1 -7
- data/lib/puppet/parser/functions/assert_type.rb +31 -0
- data/lib/puppet/parser/functions/contain.rb +15 -5
- data/lib/puppet/parser/functions/create_resources.rb +5 -1
- data/lib/puppet/parser/functions/digest.rb +5 -0
- data/lib/puppet/parser/functions/each.rb +46 -107
- data/lib/puppet/parser/functions/epp.rb +13 -9
- data/lib/puppet/parser/functions/file.rb +20 -12
- data/lib/puppet/parser/functions/filter.rb +32 -88
- data/lib/puppet/parser/functions/include.rb +12 -24
- data/lib/puppet/parser/functions/inline_epp.rb +9 -12
- data/lib/puppet/parser/functions/lookup.rb +1 -1
- data/lib/puppet/parser/functions/map.rb +30 -83
- data/lib/puppet/parser/functions/match.rb +28 -0
- data/lib/puppet/parser/functions/reduce.rb +69 -98
- data/lib/puppet/parser/functions/require.rb +13 -5
- data/lib/puppet/parser/functions/search.rb +6 -1
- data/lib/puppet/parser/functions/slice.rb +35 -103
- data/lib/puppet/parser/functions/template.rb +12 -5
- data/lib/puppet/parser/functions/with.rb +21 -0
- data/lib/puppet/parser/lexer.rb +1 -1
- data/lib/puppet/parser/parser_factory.rb +21 -33
- data/lib/puppet/parser/resource.rb +2 -3
- data/lib/puppet/parser/scope.rb +85 -15
- data/lib/puppet/pops.rb +9 -11
- data/lib/puppet/pops/adapters.rb +2 -1
- data/lib/puppet/pops/binder/bindings_checker.rb +4 -4
- data/lib/puppet/pops/binder/bindings_factory.rb +6 -6
- data/lib/puppet/pops/binder/bindings_label_provider.rb +1 -1
- data/lib/puppet/pops/binder/bindings_loader.rb +2 -2
- data/lib/puppet/pops/binder/bindings_model.rb +58 -191
- data/lib/puppet/pops/binder/bindings_model_dumper.rb +1 -1
- data/lib/puppet/pops/binder/bindings_model_meta.rb +215 -0
- data/lib/puppet/pops/binder/injector.rb +9 -9
- data/lib/puppet/pops/binder/key_factory.rb +2 -2
- data/lib/puppet/pops/binder/lookup.rb +14 -6
- data/lib/puppet/pops/binder/producers.rb +9 -12
- data/lib/puppet/pops/evaluator/access_operator.rb +35 -29
- data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +175 -0
- data/lib/puppet/pops/evaluator/callable_signature.rb +1 -2
- data/lib/puppet/pops/evaluator/closure.rb +151 -35
- data/lib/puppet/pops/evaluator/compare_operator.rb +26 -22
- data/lib/puppet/pops/evaluator/epp_evaluator.rb +16 -15
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +277 -229
- data/lib/puppet/pops/evaluator/relationship_operator.rb +3 -2
- data/lib/puppet/pops/evaluator/runtime3_support.rb +86 -53
- data/lib/puppet/pops/functions/dispatch.rb +9 -4
- data/lib/puppet/pops/functions/dispatcher.rb +2 -169
- data/lib/puppet/pops/issue_reporter.rb +14 -6
- data/lib/puppet/pops/issues.rb +96 -21
- data/lib/puppet/pops/loader/base_loader.rb +3 -3
- data/lib/puppet/pops/loader/loader.rb +1 -1
- data/lib/puppet/pops/loader/loader_paths.rb +2 -21
- data/lib/puppet/pops/loader/ruby_function_instantiator.rb +1 -1
- data/lib/puppet/pops/loader/static_loader.rb +12 -2
- data/lib/puppet/pops/model/ast_transformer.rb +4 -24
- data/lib/puppet/pops/model/factory.rb +72 -10
- data/lib/puppet/pops/model/model.rb +82 -574
- data/lib/puppet/pops/model/model_label_provider.rb +4 -2
- data/lib/puppet/pops/model/model_meta.rb +576 -0
- data/lib/puppet/pops/model/model_tree_dumper.rb +27 -5
- data/lib/puppet/pops/parser/egrammar.ra +209 -221
- data/lib/puppet/pops/parser/eparser.rb +1459 -1431
- data/lib/puppet/pops/parser/evaluating_parser.rb +15 -75
- data/lib/puppet/pops/parser/lexer2.rb +14 -10
- data/lib/puppet/pops/parser/lexer_support.rb +6 -0
- data/lib/puppet/pops/parser/locator.rb +1 -1
- data/lib/puppet/pops/parser/parser_support.rb +31 -49
- data/lib/puppet/pops/patterns.rb +10 -10
- data/lib/puppet/pops/semantic_error.rb +1 -1
- data/lib/puppet/pops/types/class_loader.rb +24 -13
- data/lib/puppet/pops/types/type_calculator.rb +188 -87
- data/lib/puppet/pops/types/type_factory.rb +79 -53
- data/lib/puppet/pops/types/type_parser.rb +22 -16
- data/lib/puppet/pops/types/types.rb +283 -392
- data/lib/puppet/pops/types/types_meta.rb +223 -0
- data/lib/puppet/pops/utils.rb +16 -14
- data/lib/puppet/pops/validation/checker4_0.rb +264 -18
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +0 -1
- data/lib/puppet/pops/visitor.rb +0 -103
- data/lib/puppet/provider/exec.rb +10 -1
- data/lib/puppet/provider/file/windows.rb +3 -4
- data/lib/puppet/provider/group/windows_adsi.rb +10 -10
- data/lib/puppet/provider/nameservice/directoryservice.rb +3 -4
- data/lib/puppet/provider/package/apt.rb +5 -1
- data/lib/puppet/provider/package/gem.rb +7 -3
- data/lib/puppet/provider/package/openbsd.rb +84 -7
- data/lib/puppet/provider/package/pacman.rb +29 -4
- data/lib/puppet/provider/package/rpm.rb +5 -7
- data/lib/puppet/provider/package/sun.rb +5 -1
- data/lib/puppet/provider/package/windows.rb +6 -1
- data/lib/puppet/provider/package/windows/exe_package.rb +1 -1
- data/lib/puppet/provider/package/windows/msi_package.rb +1 -1
- data/lib/puppet/provider/package/windows/package.rb +13 -1
- data/lib/puppet/provider/package/yum.rb +7 -3
- data/lib/puppet/provider/package/zypper.rb +5 -1
- data/lib/puppet/provider/parsedfile.rb +17 -1
- data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +6 -12
- data/lib/puppet/provider/service/freebsd.rb +12 -12
- data/lib/puppet/provider/service/init.rb +5 -0
- data/lib/puppet/provider/service/launchd.rb +0 -3
- data/lib/puppet/provider/service/openbsd.rb +8 -7
- data/lib/puppet/provider/ssh_authorized_key/parsed.rb +2 -2
- data/lib/puppet/provider/sshkey/parsed.rb +5 -0
- data/lib/puppet/provider/user/user_role_add.rb +5 -4
- data/lib/puppet/provider/user/windows_adsi.rb +8 -8
- data/lib/puppet/provider/zone/solaris.rb +1 -1
- data/lib/puppet/reference/metaparameter.rb +8 -6
- data/lib/puppet/reports/store.rb +4 -9
- data/lib/puppet/resource.rb +75 -11
- data/lib/puppet/resource/catalog.rb +9 -7
- data/lib/puppet/resource/type.rb +27 -0
- data/lib/puppet/settings.rb +61 -41
- data/lib/puppet/settings/base_setting.rb +9 -3
- data/lib/puppet/settings/environment_conf.rb +32 -4
- data/lib/puppet/settings/file_setting.rb +9 -1
- data/lib/puppet/settings/priority_setting.rb +5 -5
- data/lib/puppet/ssl.rb +1 -0
- data/lib/puppet/ssl/certificate_authority.rb +15 -6
- data/lib/puppet/ssl/certificate_authority/autosign_command.rb +2 -1
- data/lib/puppet/ssl/host.rb +3 -2
- data/lib/puppet/ssl/inventory.rb +11 -6
- data/lib/puppet/ssl/validator/default_validator.rb +1 -0
- data/lib/puppet/ssl/validator/no_validator.rb +3 -0
- data/lib/puppet/transaction.rb +29 -0
- data/lib/puppet/transaction/resource_harness.rb +16 -3
- data/lib/puppet/type.rb +71 -49
- data/lib/puppet/type/exec.rb +36 -8
- data/lib/puppet/type/file.rb +56 -16
- data/lib/puppet/type/file/content.rb +3 -3
- data/lib/puppet/type/file/mode.rb +12 -3
- data/lib/puppet/type/file/source.rb +4 -1
- data/lib/puppet/type/group.rb +1 -1
- data/lib/puppet/type/mount.rb +1 -3
- data/lib/puppet/type/resources.rb +59 -35
- data/lib/puppet/type/ssh_authorized_key.rb +54 -16
- data/lib/puppet/type/sshkey.rb +1 -1
- data/lib/puppet/type/user.rb +17 -11
- data/lib/puppet/type/yumrepo.rb +59 -8
- data/lib/puppet/type/zone.rb +3 -6
- data/lib/puppet/util.rb +64 -55
- data/lib/puppet/util/autoload.rb +2 -2
- data/lib/puppet/util/colors.rb +61 -19
- data/lib/puppet/util/command_line.rb +21 -4
- data/lib/puppet/util/execution.rb +41 -29
- data/lib/puppet/util/feature.rb +15 -4
- data/lib/puppet/util/filetype.rb +6 -2
- data/lib/puppet/util/http_proxy.rb +29 -2
- data/lib/puppet/util/lockfile.rb +1 -1
- data/lib/puppet/util/log/destinations.rb +7 -3
- data/lib/puppet/util/logging.rb +44 -14
- data/lib/puppet/util/pidlock.rb +11 -5
- data/lib/puppet/util/posix.rb +21 -31
- data/lib/puppet/util/profiler.rb +17 -9
- data/lib/puppet/util/profiler/aggregate.rb +85 -0
- data/lib/puppet/util/profiler/around_profiler.rb +67 -0
- data/lib/puppet/util/profiler/logging.rb +12 -11
- data/lib/puppet/util/profiler/wall_clock.rb +7 -6
- data/lib/puppet/util/rdoc.rb +8 -1
- data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +1 -1
- data/lib/puppet/util/suidmanager.rb +1 -8
- data/lib/puppet/util/windows.rb +14 -3
- data/lib/puppet/util/windows/access_control_list.rb +4 -4
- data/lib/puppet/util/{adsi.rb → windows/adsi.rb} +99 -37
- data/lib/puppet/util/windows/api_types.rb +255 -0
- data/lib/puppet/util/windows/com.rb +224 -0
- data/lib/puppet/util/windows/error.rb +72 -5
- data/lib/puppet/util/windows/file.rb +254 -132
- data/lib/puppet/util/windows/process.rb +293 -177
- data/lib/puppet/util/windows/registry.rb +12 -2
- data/lib/puppet/util/windows/root_certs.rb +16 -9
- data/lib/puppet/util/windows/security.rb +501 -232
- data/lib/puppet/util/windows/sid.rb +80 -36
- data/lib/puppet/util/windows/string.rb +2 -0
- data/lib/puppet/util/windows/taskscheduler.rb +1241 -0
- data/lib/puppet/util/windows/user.rb +241 -57
- data/lib/puppet/vendor.rb +3 -1
- data/lib/puppet/vendor/load_pathspec.rb +1 -0
- data/lib/puppet/vendor/load_rgen.rb +1 -0
- data/lib/puppet/vendor/pathspec/CHANGELOG.md +2 -0
- data/lib/puppet/vendor/pathspec/LICENSE +201 -0
- data/lib/puppet/vendor/pathspec/PUPPET_README.md +6 -0
- data/lib/puppet/vendor/pathspec/README.md +53 -0
- data/lib/puppet/vendor/pathspec/lib/pathspec.rb +121 -0
- data/lib/puppet/vendor/pathspec/lib/pathspec/gitignorespec.rb +275 -0
- data/lib/puppet/vendor/pathspec/lib/pathspec/regexspec.rb +17 -0
- data/lib/puppet/vendor/pathspec/lib/pathspec/spec.rb +14 -0
- data/lib/puppet/vendor/require_vendored.rb +2 -0
- data/lib/puppet/vendor/rgen/CHANGELOG +197 -0
- data/lib/puppet/vendor/rgen/MIT-LICENSE +20 -0
- data/lib/puppet/vendor/rgen/PUPPET_README.md +6 -0
- data/lib/puppet/vendor/rgen/README.rdoc +78 -0
- data/lib/puppet/vendor/rgen/Rakefile +41 -0
- data/lib/puppet/vendor/rgen/TODO +41 -0
- data/lib/puppet/vendor/rgen/anounce.txt +61 -0
- data/lib/puppet/vendor/rgen/design_rationale.txt +71 -0
- data/lib/puppet/vendor/rgen/lib/ea_support/ea_support.rb +54 -0
- data/lib/puppet/vendor/rgen/lib/ea_support/id_store.rb +32 -0
- data/lib/puppet/vendor/rgen/lib/ea_support/uml13_ea_metamodel.rb +562 -0
- data/lib/puppet/vendor/rgen/lib/ea_support/uml13_ea_metamodel_ext.rb +45 -0
- data/lib/puppet/vendor/rgen/lib/ea_support/uml13_ea_metamodel_generator.rb +43 -0
- data/lib/puppet/vendor/rgen/lib/ea_support/uml13_ea_to_uml13.rb +103 -0
- data/lib/puppet/vendor/rgen/lib/ea_support/uml13_to_uml13_ea.rb +89 -0
- data/lib/puppet/vendor/rgen/lib/metamodels/uml13_metamodel.rb +559 -0
- data/lib/puppet/vendor/rgen/lib/metamodels/uml13_metamodel_ext.rb +26 -0
- data/lib/puppet/vendor/rgen/lib/mmgen/metamodel_generator.rb +20 -0
- data/lib/puppet/vendor/rgen/lib/mmgen/mm_ext/ecore_mmgen_ext.rb +91 -0
- data/lib/puppet/vendor/rgen/lib/mmgen/mmgen.rb +28 -0
- data/lib/puppet/vendor/rgen/lib/mmgen/templates/annotations.tpl +37 -0
- data/lib/puppet/vendor/rgen/lib/mmgen/templates/metamodel_generator.tpl +172 -0
- data/lib/puppet/vendor/rgen/lib/rgen/array_extensions.rb +45 -0
- data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore.rb +218 -0
- data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore_builder_methods.rb +81 -0
- data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore_ext.rb +69 -0
- data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore_interface.rb +47 -0
- data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore_to_ruby.rb +167 -0
- data/lib/puppet/vendor/rgen/lib/rgen/ecore/ruby_to_ecore.rb +91 -0
- data/lib/puppet/vendor/rgen/lib/rgen/environment.rb +129 -0
- data/lib/puppet/vendor/rgen/lib/rgen/fragment/dump_file_cache.rb +63 -0
- data/lib/puppet/vendor/rgen/lib/rgen/fragment/fragmented_model.rb +140 -0
- data/lib/puppet/vendor/rgen/lib/rgen/fragment/model_fragment.rb +289 -0
- data/lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_instantiator.rb +66 -0
- data/lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_xml_instantiator.rb +66 -0
- data/lib/puppet/vendor/rgen/lib/rgen/instantiator/default_xml_instantiator.rb +117 -0
- data/lib/puppet/vendor/rgen/lib/rgen/instantiator/ecore_xml_instantiator.rb +169 -0
- data/lib/puppet/vendor/rgen/lib/rgen/instantiator/json_instantiator.rb +126 -0
- data/lib/puppet/vendor/rgen/lib/rgen/instantiator/json_parser.rb +331 -0
- data/lib/puppet/vendor/rgen/lib/rgen/instantiator/json_parser.y +94 -0
- data/lib/puppet/vendor/rgen/lib/rgen/instantiator/nodebased_xml_instantiator.rb +137 -0
- data/lib/puppet/vendor/rgen/lib/rgen/instantiator/qualified_name_resolver.rb +97 -0
- data/lib/puppet/vendor/rgen/lib/rgen/instantiator/reference_resolver.rb +128 -0
- data/lib/puppet/vendor/rgen/lib/rgen/instantiator/resolution_helper.rb +47 -0
- data/lib/puppet/vendor/rgen/lib/rgen/instantiator/xmi11_instantiator.rb +168 -0
- data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder.rb +224 -0
- data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/builder_extensions.rb +556 -0
- data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/builder_runtime.rb +174 -0
- data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/constant_order_helper.rb +89 -0
- data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/data_types.rb +77 -0
- data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/intermediate/annotation.rb +30 -0
- data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/intermediate/feature.rb +168 -0
- data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/mm_multiple.rb +23 -0
- data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/module_extension.rb +42 -0
- data/lib/puppet/vendor/rgen/lib/rgen/model_builder.rb +32 -0
- data/lib/puppet/vendor/rgen/lib/rgen/model_builder/builder_context.rb +334 -0
- data/lib/puppet/vendor/rgen/lib/rgen/model_builder/model_serializer.rb +225 -0
- data/lib/puppet/vendor/rgen/lib/rgen/model_builder/reference_resolver.rb +156 -0
- data/lib/puppet/vendor/rgen/lib/rgen/serializer/json_serializer.rb +121 -0
- data/lib/puppet/vendor/rgen/lib/rgen/serializer/opposite_reference_filter.rb +18 -0
- data/lib/puppet/vendor/rgen/lib/rgen/serializer/qualified_name_provider.rb +47 -0
- data/lib/puppet/vendor/rgen/lib/rgen/serializer/xmi11_serializer.rb +116 -0
- data/lib/puppet/vendor/rgen/lib/rgen/serializer/xmi20_serializer.rb +71 -0
- data/lib/puppet/vendor/rgen/lib/rgen/serializer/xml_serializer.rb +98 -0
- data/lib/puppet/vendor/rgen/lib/rgen/template_language.rb +297 -0
- data/lib/puppet/vendor/rgen/lib/rgen/template_language/directory_template_container.rb +83 -0
- data/lib/puppet/vendor/rgen/lib/rgen/template_language/output_handler.rb +87 -0
- data/lib/puppet/vendor/rgen/lib/rgen/template_language/template_container.rb +234 -0
- data/lib/puppet/vendor/rgen/lib/rgen/template_language/template_helper.rb +26 -0
- data/lib/puppet/vendor/rgen/lib/rgen/transformer.rb +475 -0
- data/lib/puppet/vendor/rgen/lib/rgen/util/auto_class_creator.rb +61 -0
- data/lib/puppet/vendor/rgen/lib/rgen/util/cached_glob.rb +67 -0
- data/lib/puppet/vendor/rgen/lib/rgen/util/file_cache_map.rb +124 -0
- data/lib/puppet/vendor/rgen/lib/rgen/util/file_change_detector.rb +84 -0
- data/lib/puppet/vendor/rgen/lib/rgen/util/method_delegation.rb +114 -0
- data/lib/puppet/vendor/rgen/lib/rgen/util/model_comparator.rb +68 -0
- data/lib/puppet/vendor/rgen/lib/rgen/util/model_comparator_base.rb +142 -0
- data/lib/puppet/vendor/rgen/lib/rgen/util/model_dumper.rb +29 -0
- data/lib/puppet/vendor/rgen/lib/rgen/util/name_helper.rb +42 -0
- data/lib/puppet/vendor/rgen/lib/rgen/util/pattern_matcher.rb +329 -0
- data/lib/puppet/vendor/rgen/lib/transformers/ecore_to_uml13.rb +79 -0
- data/lib/puppet/vendor/rgen/lib/transformers/uml13_to_ecore.rb +127 -0
- data/lib/puppet/vendor/rgen/test/array_extensions_test.rb +64 -0
- data/lib/puppet/vendor/rgen/test/ea_instantiator_test.rb +35 -0
- data/lib/puppet/vendor/rgen/test/ea_serializer_test.rb +23 -0
- data/lib/puppet/vendor/rgen/test/ecore_self_test.rb +54 -0
- data/lib/puppet/vendor/rgen/test/environment_test.rb +90 -0
- data/lib/puppet/vendor/rgen/test/json_test.rb +171 -0
- data/lib/puppet/vendor/rgen/test/metamodel_builder_test.rb +1482 -0
- data/lib/puppet/vendor/rgen/test/metamodel_from_ecore_test.rb +57 -0
- data/lib/puppet/vendor/rgen/test/metamodel_order_test.rb +131 -0
- data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test.rb +98 -0
- data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test/TestModel.rb +70 -0
- data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test/houseMetamodel.ecore +42 -0
- data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test/houseMetamodel_from_ecore.rb +44 -0
- data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test/using_builtin_types.ecore +9 -0
- data/lib/puppet/vendor/rgen/test/method_delegation_test.rb +178 -0
- data/lib/puppet/vendor/rgen/test/model_builder/builder_context_test.rb +59 -0
- data/lib/puppet/vendor/rgen/test/model_builder/builder_test.rb +242 -0
- data/lib/puppet/vendor/rgen/test/model_builder/ecore_original.rb +163 -0
- data/lib/puppet/vendor/rgen/test/model_builder/ecore_original_regenerated.rb +163 -0
- data/lib/puppet/vendor/rgen/test/model_builder/reference_resolver_test.rb +156 -0
- data/lib/puppet/vendor/rgen/test/model_builder/serializer_test.rb +94 -0
- data/lib/puppet/vendor/rgen/test/model_builder/statemachine_metamodel.rb +42 -0
- data/lib/puppet/vendor/rgen/test/model_builder/test_model/statemachine1.rb +23 -0
- data/lib/puppet/vendor/rgen/test/model_builder_test.rb +6 -0
- data/lib/puppet/vendor/rgen/test/model_fragment_test.rb +30 -0
- data/lib/puppet/vendor/rgen/test/output_handler_test.rb +58 -0
- data/lib/puppet/vendor/rgen/test/qualified_name_provider_test.rb +48 -0
- data/lib/puppet/vendor/rgen/test/qualified_name_resolver_test.rb +102 -0
- data/lib/puppet/vendor/rgen/test/reference_resolver_test.rb +117 -0
- data/lib/puppet/vendor/rgen/test/rgen_test.rb +26 -0
- data/lib/puppet/vendor/rgen/test/template_language_test.rb +163 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/expected_result1.txt +29 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/expected_result2.txt +9 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/expected_result3.txt +4 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/indentStringTestDefaultIndent.out +1 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/indentStringTestTabIndent.out +1 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/callback_indent_test/a.tpl +12 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/callback_indent_test/b.tpl +5 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/code/array.tpl +11 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/content/author.tpl +7 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/content/chapter.tpl +5 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/define_local_test/local.tpl +8 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/define_local_test/test.tpl +8 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/evaluate_test/test.tpl +7 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/indent_string_test.tpl +12 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/index/c/cmod.tpl +1 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/index/chapter.tpl +3 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_backslash_r_test.tpl +5 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/no_indent.tpl +3 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/sub1/no_indent.tpl +3 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/test.tpl +24 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/test2.tpl +13 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/test3.tpl +10 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/null_context_test.tpl +17 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/root.tpl +31 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/template_resolution_test/sub1.tpl +9 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/template_resolution_test/sub1/sub1.tpl +3 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/templates/template_resolution_test/test.tpl +4 -0
- data/lib/puppet/vendor/rgen/test/template_language_test/testout.txt +29 -0
- data/lib/puppet/vendor/rgen/test/testmodel/class_model_checker.rb +119 -0
- data/lib/puppet/vendor/rgen/test/testmodel/ea_testmodel.eap +0 -0
- data/lib/puppet/vendor/rgen/test/testmodel/ea_testmodel.xml +1029 -0
- data/lib/puppet/vendor/rgen/test/testmodel/ea_testmodel_partial.xml +317 -0
- data/lib/puppet/vendor/rgen/test/testmodel/ecore_model_checker.rb +101 -0
- data/lib/puppet/vendor/rgen/test/testmodel/manual_testmodel.xml +22 -0
- data/lib/puppet/vendor/rgen/test/testmodel/object_model_checker.rb +67 -0
- data/lib/puppet/vendor/rgen/test/transformer_test.rb +254 -0
- data/lib/puppet/vendor/rgen/test/util/file_cache_map_test.rb +99 -0
- data/lib/puppet/vendor/rgen/test/util/pattern_matcher_test.rb +97 -0
- data/lib/puppet/vendor/rgen/test/util_test.rb +5 -0
- data/lib/puppet/vendor/rgen/test/xml_instantiator_test.rb +160 -0
- data/lib/puppet/vendor/rgen/test/xml_instantiator_test/simple_ecore_model_checker.rb +94 -0
- data/lib/puppet/vendor/rgen/test/xml_instantiator_test/simple_xmi_ecore_instantiator.rb +53 -0
- data/lib/puppet/vendor/rgen/test/xml_instantiator_test/simple_xmi_metamodel.rb +49 -0
- data/lib/puppet/vendor/rgen/test/xml_instantiator_test/simple_xmi_to_ecore.rb +75 -0
- data/lib/puppet/vendor/safe_yaml/PUPPET_README.md +6 -0
- data/lib/puppet/vendor/semantic/PUPPET_README.md +6 -0
- data/lib/puppet/version.rb +1 -1
- data/spec/fixtures/integration/node/environment/sitedir2/00_a.pp +2 -0
- data/spec/fixtures/integration/node/environment/sitedir2/02_folder/01_b.pp +6 -0
- data/spec/fixtures/integration/node/environment/sitedir2/03_c.pp +1 -0
- data/spec/fixtures/integration/node/environment/sitedir2/04_include.pp +2 -0
- data/spec/fixtures/releases/jamtur01-apache/manifests/vhost.pp +1 -1
- data/spec/fixtures/unit/indirector/hiera/global.yaml +10 -0
- data/spec/fixtures/unit/indirector/hiera/invalid.yaml +1 -0
- data/spec/fixtures/unit/parser/functions/create_resources/foo/manifests/init.pp +3 -0
- data/spec/fixtures/unit/parser/functions/create_resources/foo/manifests/wrongdefine.pp +3 -0
- data/spec/fixtures/unit/parser/lexer/argumentdefaults.pp +2 -2
- data/spec/fixtures/unit/parser/lexer/casestatement.pp +14 -14
- data/spec/fixtures/unit/parser/lexer/classheirarchy.pp +3 -3
- data/spec/fixtures/unit/parser/lexer/classincludes.pp +3 -3
- data/spec/fixtures/unit/parser/lexer/classpathtest.pp +1 -1
- data/spec/fixtures/unit/parser/lexer/collection_override.pp +1 -1
- data/spec/fixtures/unit/parser/lexer/componentrequire.pp +2 -2
- data/spec/fixtures/unit/parser/lexer/deepclassheirarchy.pp +5 -5
- data/spec/fixtures/unit/parser/lexer/defineoverrides.pp +2 -2
- data/spec/fixtures/unit/parser/lexer/filecreate.pp +2 -2
- data/spec/fixtures/unit/parser/lexer/ifexpression.pp +1 -1
- data/spec/fixtures/unit/parser/lexer/implicititeration.pp +4 -4
- data/spec/fixtures/unit/parser/lexer/multipleinstances.pp +3 -3
- data/spec/fixtures/unit/parser/lexer/multisubs.pp +2 -2
- data/spec/fixtures/unit/parser/lexer/namevartest.pp +2 -2
- data/spec/fixtures/unit/parser/lexer/simpledefaults.pp +1 -1
- data/spec/fixtures/unit/pops/parser/lexer/argumentdefaults.pp +1 -1
- data/spec/fixtures/unit/pops/parser/lexer/casestatement.pp +14 -14
- data/spec/fixtures/unit/pops/parser/lexer/classheirarchy.pp +3 -3
- data/spec/fixtures/unit/pops/parser/lexer/classincludes.pp +3 -3
- data/spec/fixtures/unit/pops/parser/lexer/classpathtest.pp +1 -1
- data/spec/fixtures/unit/pops/parser/lexer/collection_override.pp +1 -1
- data/spec/fixtures/unit/pops/parser/lexer/componentrequire.pp +2 -2
- data/spec/fixtures/unit/pops/parser/lexer/deepclassheirarchy.pp +5 -5
- data/spec/fixtures/unit/pops/parser/lexer/defineoverrides.pp +2 -2
- data/spec/fixtures/unit/pops/parser/lexer/filecreate.pp +2 -2
- data/spec/fixtures/unit/pops/parser/lexer/ifexpression.pp +1 -1
- data/spec/fixtures/unit/pops/parser/lexer/implicititeration.pp +4 -4
- data/spec/fixtures/unit/pops/parser/lexer/multipleinstances.pp +3 -3
- data/spec/fixtures/unit/pops/parser/lexer/multisubs.pp +2 -2
- data/spec/fixtures/unit/pops/parser/lexer/namevartest.pp +2 -2
- data/spec/fixtures/unit/pops/parser/lexer/simpledefaults.pp +1 -1
- data/spec/fixtures/unit/provider/package/gem/gem-list-single-package +4 -0
- data/spec/fixtures/unit/type/user/authorized_keys +1 -1
- data/spec/integration/agent/logging_spec.rb +4 -0
- data/spec/integration/application/doc_spec.rb +4 -3
- data/spec/integration/configurer_spec.rb +0 -14
- data/spec/integration/defaults_spec.rb +26 -0
- data/spec/integration/environments/default_manifest_spec.rb +274 -0
- data/spec/integration/faces/documentation_spec.rb +0 -4
- data/spec/integration/file_bucket/file_spec.rb +21 -0
- data/spec/integration/indirector/catalog/compiler_spec.rb +0 -2
- data/spec/integration/indirector/catalog/queue_spec.rb +0 -2
- data/spec/integration/indirector/facts/facter_spec.rb +1 -1
- data/spec/integration/indirector/file_content/file_server_spec.rb +2 -2
- data/spec/integration/node/environment_spec.rb +24 -8
- data/spec/integration/parser/catalog_spec.rb +10 -10
- data/spec/integration/parser/class_spec.rb +37 -0
- data/spec/integration/parser/collector_spec.rb +234 -75
- data/spec/integration/parser/compiler_spec.rb +385 -401
- data/spec/integration/parser/conditionals_spec.rb +117 -0
- data/spec/integration/parser/future_compiler_spec.rb +359 -8
- data/spec/integration/parser/node_spec.rb +185 -0
- data/spec/integration/parser/resource_expressions_spec.rb +286 -0
- data/spec/integration/parser/ruby_manifest_spec.rb +0 -4
- data/spec/integration/parser/scope_spec.rb +94 -151
- data/spec/integration/provider/cron/crontab_spec.rb +137 -148
- data/spec/integration/ssl/certificate_authority_spec.rb +26 -0
- data/spec/integration/ssl/certificate_request_spec.rb +0 -6
- data/spec/integration/ssl/certificate_revocation_list_spec.rb +0 -2
- data/spec/integration/ssl/host_spec.rb +0 -2
- data/spec/integration/transaction_spec.rb +16 -0
- data/spec/integration/type/file_spec.rb +14 -13
- data/spec/integration/type/nagios_spec.rb +6 -15
- data/spec/integration/type/sshkey_spec.rb +22 -0
- data/spec/integration/type/tidy_spec.rb +3 -0
- data/spec/integration/type/user_spec.rb +8 -3
- data/spec/integration/util/autoload_spec.rb +6 -6
- data/spec/integration/util/rdoc/parser_spec.rb +7 -0
- data/spec/integration/util/windows/process_spec.rb +12 -0
- data/spec/integration/util/windows/security_spec.rb +36 -35
- data/spec/integration/util/windows/user_spec.rb +75 -9
- data/spec/integration/util_spec.rb +2 -2
- data/spec/lib/matchers/resource.rb +1 -0
- data/spec/lib/puppet_spec/compiler.rb +15 -2
- data/spec/lib/puppet_spec/files.rb +10 -0
- data/spec/lib/puppet_spec/language.rb +74 -0
- data/spec/lib/puppet_spec/matchers.rb +59 -32
- data/spec/lib/puppet_spec/module_tool/stub_source.rb +3 -0
- data/spec/shared_behaviours/hiera_indirections.rb +99 -0
- data/spec/shared_behaviours/iterative_functions.rb +69 -0
- data/spec/unit/application/apply_spec.rb +4 -2
- data/spec/unit/application/doc_spec.rb +17 -13
- data/spec/unit/application/master_spec.rb +35 -27
- data/spec/unit/application/resource_spec.rb +0 -5
- data/spec/unit/configurer/downloader_factory_spec.rb +96 -0
- data/spec/unit/configurer/downloader_spec.rb +3 -24
- data/spec/unit/configurer/plugin_handler_spec.rb +22 -22
- data/spec/unit/configurer_spec.rb +0 -4
- data/spec/unit/defaults_spec.rb +30 -0
- data/spec/unit/face/config_spec.rb +2 -1
- data/spec/unit/face/module/build_spec.rb +2 -2
- data/spec/unit/face/module/install_spec.rb +8 -8
- data/spec/unit/face/parser_spec.rb +71 -33
- data/spec/unit/file_bucket/file_spec.rb +2 -2
- data/spec/unit/file_system/uniquefile_spec.rb +184 -0
- data/spec/unit/forge/errors_spec.rb +4 -6
- data/spec/unit/forge/module_release_spec.rb +178 -89
- data/spec/unit/forge/repository_spec.rb +110 -2
- data/spec/unit/forge_spec.rb +39 -3
- data/spec/unit/functions/assert_type_spec.rb +22 -3
- data/spec/unit/{parser/methods → functions}/each_spec.rb +21 -1
- data/spec/unit/{parser/functions → functions}/epp_spec.rb +61 -9
- data/spec/unit/{parser/methods → functions}/filter_spec.rb +34 -38
- data/spec/unit/{parser/functions → functions}/inline_epp_spec.rb +18 -3
- data/spec/unit/functions/map_spec.rb +169 -0
- data/spec/unit/functions/match_spec.rb +57 -0
- data/spec/unit/{parser/methods → functions}/reduce_spec.rb +23 -5
- data/spec/unit/{parser/methods → functions}/slice_spec.rb +34 -21
- data/spec/unit/functions/with_spec.rb +35 -0
- data/spec/unit/functions4_spec.rb +7 -8
- data/spec/unit/indirector/catalog/compiler_spec.rb +0 -2
- data/spec/unit/indirector/catalog/static_compiler_spec.rb +11 -0
- data/spec/unit/indirector/data_binding/hiera_spec.rb +1 -96
- data/spec/unit/indirector/facts/facter_spec.rb +69 -102
- data/spec/unit/indirector/hiera_spec.rb +17 -0
- data/spec/unit/indirector/request_spec.rb +2 -4
- data/spec/unit/indirector/resource/ral_spec.rb +5 -0
- data/spec/unit/indirector/resource_type/parser_spec.rb +17 -12
- data/spec/unit/indirector/rest_spec.rb +36 -6
- data/spec/unit/interface/face_collection_spec.rb +2 -2
- data/spec/unit/module_tool/applications/builder_spec.rb +364 -14
- data/spec/unit/module_tool/applications/uninstaller_spec.rb +22 -0
- data/spec/unit/module_tool/applications/unpacker_spec.rb +40 -0
- data/spec/unit/module_tool/applications/upgrader_spec.rb +22 -0
- data/spec/unit/module_tool/installed_modules_spec.rb +49 -0
- data/spec/unit/module_tool/metadata_spec.rb +72 -4
- data/spec/unit/module_tool/tar/mini_spec.rb +2 -1
- data/spec/unit/network/authentication_spec.rb +4 -0
- data/spec/unit/network/http/api/v2/environments_spec.rb +24 -3
- data/spec/unit/network/http/connection_spec.rb +127 -92
- data/spec/unit/network/http/factory_spec.rb +82 -0
- data/spec/unit/network/http/handler_spec.rb +23 -13
- data/spec/unit/network/http/nocache_pool_spec.rb +43 -0
- data/spec/unit/network/http/pool_spec.rb +269 -0
- data/spec/unit/network/http/rack/rest_spec.rb +1 -1
- data/spec/unit/network/http/session_spec.rb +43 -0
- data/spec/unit/network/http/site_spec.rb +90 -0
- data/spec/unit/network/http/webrick_spec.rb +1 -1
- data/spec/unit/network/http_pool_spec.rb +9 -6
- data/spec/unit/network/http_spec.rb +10 -0
- data/spec/unit/node/environment_spec.rb +54 -0
- data/spec/unit/node_spec.rb +3 -5
- data/spec/unit/parser/compiler_spec.rb +9 -2
- data/spec/unit/parser/files_spec.rb +19 -0
- data/spec/unit/parser/functions/contain_spec.rb +51 -0
- data/spec/unit/parser/functions/create_resources_spec.rb +8 -1
- data/spec/unit/parser/functions/digest_spec.rb +31 -0
- data/spec/unit/parser/functions/file_spec.rb +48 -5
- data/spec/unit/parser/functions/include_spec.rb +15 -1
- data/spec/unit/parser/functions/realize_spec.rb +43 -35
- data/spec/unit/parser/functions/require_spec.rb +19 -5
- data/spec/unit/parser/functions/search_spec.rb +5 -0
- data/spec/unit/parser/functions/shared.rb +82 -0
- data/spec/unit/parser/functions_spec.rb +1 -1
- data/spec/unit/parser/lexer_spec.rb +10 -1
- data/spec/unit/parser/type_loader_spec.rb +0 -1
- data/spec/unit/pops/benchmark_spec.rb +1 -1
- data/spec/unit/pops/binder/bindings_composer_spec.rb +24 -22
- data/spec/unit/pops/binder/injector_spec.rb +8 -6
- data/spec/unit/pops/evaluator/access_ops_spec.rb +3 -3
- data/spec/unit/pops/evaluator/comparison_ops_spec.rb +7 -4
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +250 -30
- data/spec/unit/pops/evaluator/logical_ops_spec.rb +2 -2
- data/spec/unit/pops/evaluator/variables_spec.rb +0 -105
- data/spec/unit/pops/issues_spec.rb +170 -0
- data/spec/unit/pops/loaders/dependency_loader_spec.rb +17 -0
- data/spec/unit/pops/loaders/loader_paths_spec.rb +4 -15
- data/spec/unit/pops/loaders/loaders_spec.rb +31 -11
- data/spec/unit/pops/loaders/module_loaders_spec.rb +0 -29
- data/spec/unit/pops/loaders/static_loader_spec.rb +6 -0
- data/spec/unit/pops/parser/epp_parser_spec.rb +38 -9
- data/spec/unit/pops/parser/evaluating_parser_spec.rb +0 -1
- data/spec/unit/pops/parser/lexer2_spec.rb +21 -4
- data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +5 -0
- data/spec/unit/pops/parser/parse_calls_spec.rb +6 -3
- data/spec/unit/pops/parser/parse_conditionals_spec.rb +12 -5
- data/spec/unit/pops/parser/parse_containers_spec.rb +62 -7
- data/spec/unit/pops/parser/parse_resource_spec.rb +155 -73
- data/spec/unit/pops/parser/parser_spec.rb +16 -0
- data/spec/unit/pops/parser/parsing_typed_parameters_spec.rb +72 -0
- data/spec/unit/pops/transformer/transform_calls_spec.rb +1 -1
- data/spec/unit/pops/types/type_calculator_spec.rb +254 -57
- data/spec/unit/pops/types/type_factory_spec.rb +8 -3
- data/spec/unit/pops/types/type_parser_spec.rb +26 -5
- data/spec/unit/pops/validator/validator_spec.rb +143 -27
- data/spec/unit/provider/exec/posix_spec.rb +22 -14
- data/spec/unit/provider/exec/shell_spec.rb +2 -2
- data/spec/unit/provider/file/windows_spec.rb +7 -7
- data/spec/unit/provider/group/windows_adsi_spec.rb +17 -17
- data/spec/unit/provider/package/gem_spec.rb +10 -0
- data/spec/unit/provider/package/openbsd_spec.rb +66 -9
- data/spec/unit/provider/package/pacman_spec.rb +90 -71
- data/spec/unit/provider/package/windows/package_spec.rb +21 -6
- data/spec/unit/provider/package/yum_spec.rb +1 -0
- data/spec/unit/provider/parsedfile_spec.rb +1 -1
- data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +9 -9
- data/spec/unit/provider/service/openbsd_spec.rb +26 -2
- data/spec/unit/provider/service/upstart_spec.rb +12 -1
- data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +6 -0
- data/spec/unit/provider/user/user_role_add_spec.rb +23 -1
- data/spec/unit/provider/user/windows_adsi_spec.rb +17 -17
- data/spec/unit/reports/store_spec.rb +0 -16
- data/spec/unit/resource/catalog_spec.rb +0 -5
- data/spec/unit/resource_spec.rb +2 -2
- data/spec/unit/settings/autosign_setting_spec.rb +2 -2
- data/spec/unit/settings/environment_conf_spec.rb +77 -10
- data/spec/unit/settings/file_setting_spec.rb +5 -4
- data/spec/unit/settings/priority_setting_spec.rb +4 -4
- data/spec/unit/settings_spec.rb +41 -3
- data/spec/unit/ssl/certificate_authority_spec.rb +25 -2
- data/spec/unit/ssl/inventory_spec.rb +13 -0
- data/spec/unit/ssl/validator_spec.rb +0 -1
- data/spec/unit/transaction/resource_harness_spec.rb +64 -0
- data/spec/unit/transaction_spec.rb +98 -47
- data/spec/unit/type/cron_spec.rb +3 -3
- data/spec/unit/type/exec_spec.rb +9 -0
- data/spec/unit/type/file/content_spec.rb +54 -71
- data/spec/unit/type/file/mode_spec.rb +26 -1
- data/spec/unit/type/file/source_spec.rb +26 -4
- data/spec/unit/type/file_spec.rb +3 -3
- data/spec/unit/type/nagios_spec.rb +12 -3
- data/spec/unit/type/resources_spec.rb +64 -30
- data/spec/unit/type/user_spec.rb +1 -1
- data/spec/unit/type/yumrepo_spec.rb +136 -0
- data/spec/unit/type/zone_spec.rb +44 -1
- data/spec/unit/type_spec.rb +20 -0
- data/spec/unit/util/colors_spec.rb +14 -8
- data/spec/unit/util/command_line_spec.rb +11 -7
- data/spec/unit/util/execution_spec.rb +35 -42
- data/spec/unit/util/feature_spec.rb +12 -0
- data/spec/unit/util/http_proxy_spec.rb +43 -1
- data/spec/unit/util/log/destinations_spec.rb +45 -1
- data/spec/unit/util/logging_spec.rb +38 -0
- data/spec/unit/util/pidlock_spec.rb +37 -1
- data/spec/unit/util/profiler/aggregate_spec.rb +59 -0
- data/spec/unit/util/profiler/around_profiler_spec.rb +61 -0
- data/spec/unit/util/profiler/logging_spec.rb +18 -29
- data/spec/unit/util/profiler/wall_clock_spec.rb +1 -1
- data/spec/unit/util/profiler_spec.rb +55 -0
- data/spec/unit/util/queue_spec.rb +0 -1
- data/spec/unit/util/rdoc/parser_spec.rb +14 -6
- data/spec/unit/util/tagging_spec.rb +1 -1
- data/spec/unit/util/windows/access_control_entry_spec.rb +1 -1
- data/spec/unit/util/{adsi_spec.rb → windows/adsi_spec.rb} +111 -108
- data/spec/unit/util/windows/api_types_spec.rb +28 -0
- data/spec/unit/util/windows/registry_spec.rb +7 -6
- data/spec/unit/util/windows/sid_spec.rb +3 -6
- data/spec/unit/util/windows/string_spec.rb +4 -0
- data/spec/unit/util/zaml_spec.rb +5 -1
- data/tasks/benchmark.rake +40 -5
- data/tasks/parser.rake +16 -2
- data/tasks/yard.rake +1 -1
- metadata +296 -68
- data/lib/puppet/file_system/tempfile.rb +0 -20
- data/lib/puppet/parser/e_parser_adapter.rb +0 -119
- data/lib/puppet/parser/functions/collect.rb +0 -15
- data/lib/puppet/parser/functions/select.rb +0 -15
- data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +0 -109
- data/lib/puppet/pops/parser/lexer.rb +0 -753
- data/lib/puppet/pops/parser/makefile +0 -6
- data/lib/puppet/pops/validation/checker3_1.rb +0 -558
- data/lib/puppet/pops/validation/validator_factory_3_1.rb +0 -31
- data/lib/puppet/util/profiler/none.rb +0 -8
- data/spec/unit/face/certificate_request_spec.rb +0 -7
- data/spec/unit/face/certificate_revocation_list_spec.rb +0 -7
- data/spec/unit/face/key_spec.rb +0 -7
- data/spec/unit/face/report_spec.rb +0 -7
- data/spec/unit/face/resource_spec.rb +0 -7
- data/spec/unit/face/resource_type_spec.rb +0 -7
- data/spec/unit/file_system/tempfile_spec.rb +0 -48
- data/spec/unit/parser/eparser_adapter_spec.rb +0 -407
- data/spec/unit/parser/methods/map_spec.rb +0 -184
- data/spec/unit/parser/methods/shared.rb +0 -45
- data/spec/unit/pops/parser/lexer_spec.rb +0 -840
- data/spec/unit/pops/transformer/transform_resource_spec.rb +0 -185
- data/spec/unit/util/profiler/none_spec.rb +0 -12
@@ -41,7 +41,7 @@ class Puppet::Pops::Evaluator::CallableSignature
|
|
41
41
|
# or Optional[Variant[Callable, ...]]. The Variant type is used when multiple signatures are acceptable.
|
42
42
|
# The Optional type is used when the block is optional.
|
43
43
|
#
|
44
|
-
# @return [Puppet::Pops::Types::
|
44
|
+
# @return [Puppet::Pops::Types::PAnyType, nil] the expected type of a block given as the last parameter in a call.
|
45
45
|
#
|
46
46
|
# @api public
|
47
47
|
#
|
@@ -97,5 +97,4 @@ class Puppet::Pops::Evaluator::CallableSignature
|
|
97
97
|
def infinity?(x)
|
98
98
|
x == Puppet::Pops::Types::INFINITY
|
99
99
|
end
|
100
|
-
|
101
100
|
end
|
@@ -30,46 +30,88 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
|
|
30
30
|
# compatible with 3x AST::Lambda
|
31
31
|
# @api public
|
32
32
|
def call(scope, *args)
|
33
|
-
|
33
|
+
variable_bindings = combine_values_with_parameters(args)
|
34
|
+
|
35
|
+
tc = Puppet::Pops::Types::TypeCalculator
|
36
|
+
final_args = tc.infer_set(parameters.inject([]) do |final_args, param|
|
37
|
+
if param.captures_rest
|
38
|
+
final_args.concat(variable_bindings[param.name])
|
39
|
+
else
|
40
|
+
final_args << variable_bindings[param.name]
|
41
|
+
end
|
42
|
+
end)
|
43
|
+
|
44
|
+
if tc.callable?(type, final_args)
|
45
|
+
@evaluator.evaluate_block_with_bindings(@enclosing_scope, variable_bindings, @model.body)
|
46
|
+
else
|
47
|
+
raise ArgumentError, "lambda called with mis-matched arguments\n#{Puppet::Pops::Evaluator::CallableMismatchDescriber.diff_string('lambda', final_args, [self])}"
|
48
|
+
end
|
34
49
|
end
|
35
50
|
|
36
51
|
# Call closure with argument assignment by name
|
37
|
-
def call_by_name(scope, args_hash,
|
38
|
-
|
52
|
+
def call_by_name(scope, args_hash, enforce_parameters)
|
53
|
+
if enforce_parameters
|
54
|
+
if args_hash.size > parameters.size
|
55
|
+
raise ArgumentError, "Too many arguments: #{args_hash.size} for #{parameters.size}"
|
56
|
+
end
|
57
|
+
|
58
|
+
# associate values with parameters
|
59
|
+
scope_hash = {}
|
60
|
+
parameters.each do |p|
|
61
|
+
name = p.name
|
62
|
+
if (arg_value = args_hash[name]).nil?
|
63
|
+
# only set result of default expr if it is defined (it is otherwise not possible to differentiate
|
64
|
+
# between explicit undef and no default expression
|
65
|
+
unless p.value.nil?
|
66
|
+
scope_hash[name] = @evaluator.evaluate(p.value, @enclosing_scope)
|
67
|
+
end
|
68
|
+
else
|
69
|
+
scope_hash[name] = arg_value
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
missing = parameters.select { |p| !scope_hash.include?(p.name) }
|
74
|
+
if missing.any?
|
75
|
+
raise ArgumentError, "Too few arguments; no value given for required parameters #{missing.collect(&:name).join(" ,")}"
|
76
|
+
end
|
77
|
+
|
78
|
+
tc = Puppet::Pops::Types::TypeCalculator
|
79
|
+
final_args = tc.infer_set(parameter_names.collect { |param| scope_hash[param] })
|
80
|
+
if !tc.callable?(type, final_args)
|
81
|
+
raise ArgumentError, "lambda called with mis-matched arguments\n#{Puppet::Pops::Evaluator::CallableMismatchDescriber.diff_string('lambda', final_args, [self])}"
|
82
|
+
end
|
83
|
+
else
|
84
|
+
scope_hash = args_hash
|
85
|
+
end
|
86
|
+
|
87
|
+
@evaluator.evaluate_block_with_bindings(@enclosing_scope, scope_hash, @model.body)
|
39
88
|
end
|
40
89
|
|
41
|
-
|
42
|
-
|
43
|
-
@model.parameters || []
|
90
|
+
def parameters
|
91
|
+
@model.parameters
|
44
92
|
end
|
45
93
|
|
46
94
|
# Returns the number of parameters (required and optional)
|
47
95
|
# @return [Integer] the total number of accepted parameters
|
48
96
|
def parameter_count
|
49
97
|
# yes, this is duplication of code, but it saves a method call
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
# Returns the number of optional parameters.
|
54
|
-
# @return [Integer] the number of optional accepted parameters
|
55
|
-
def optional_parameter_count
|
56
|
-
@model.parameters.count { |p| !p.value.nil? }
|
98
|
+
@model.parameters.size
|
57
99
|
end
|
58
100
|
|
59
101
|
# @api public
|
60
102
|
def parameter_names
|
61
|
-
@model.parameters.collect
|
103
|
+
@model.parameters.collect(&:name)
|
62
104
|
end
|
63
105
|
|
64
106
|
# @api public
|
65
107
|
def type
|
66
|
-
@callable
|
108
|
+
@callable ||= create_callable_type
|
67
109
|
end
|
68
110
|
|
69
111
|
# @api public
|
70
112
|
def last_captures_rest?
|
71
|
-
|
72
|
-
|
113
|
+
last = @model.parameters[-1]
|
114
|
+
last && last.captures_rest
|
73
115
|
end
|
74
116
|
|
75
117
|
# @api public
|
@@ -80,28 +122,99 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
|
|
80
122
|
|
81
123
|
private
|
82
124
|
|
125
|
+
def combine_values_with_parameters(args)
|
126
|
+
variable_bindings = {}
|
127
|
+
|
128
|
+
parameters.each_with_index do |parameter, index|
|
129
|
+
param_captures = parameter.captures_rest
|
130
|
+
default_expression = parameter.value
|
131
|
+
|
132
|
+
if index >= args.size
|
133
|
+
if default_expression
|
134
|
+
# not given, has default
|
135
|
+
value = @evaluator.evaluate(default_expression, @enclosing_scope)
|
136
|
+
if param_captures && !value.is_a?(Array)
|
137
|
+
# correct non array default value
|
138
|
+
value = [value]
|
139
|
+
end
|
140
|
+
else
|
141
|
+
# not given, does not have default
|
142
|
+
if param_captures
|
143
|
+
# default for captures rest is an empty array
|
144
|
+
value = []
|
145
|
+
else
|
146
|
+
@evaluator.fail(Puppet::Pops::Issues::MISSING_REQUIRED_PARAMETER, parameter, { :param_name => parameter.name })
|
147
|
+
end
|
148
|
+
end
|
149
|
+
else
|
150
|
+
given_argument = args[index]
|
151
|
+
if param_captures
|
152
|
+
# get excess arguments
|
153
|
+
value = args[(parameter_count-1)..-1]
|
154
|
+
# If the input was a single nil, or undef, and there is a default, use the default
|
155
|
+
# This supports :undef in case it was used in a 3x data structure and it is passed as an arg
|
156
|
+
#
|
157
|
+
if value.size == 1 && (given_argument.nil? || given_argument == :undef) && default_expression
|
158
|
+
value = @evaluator.evaluate(default_expression, scope)
|
159
|
+
# and ensure it is an array
|
160
|
+
value = [value] unless value.is_a?(Array)
|
161
|
+
end
|
162
|
+
else
|
163
|
+
value = given_argument
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
variable_bindings[parameter.name] = value
|
168
|
+
end
|
169
|
+
|
170
|
+
variable_bindings
|
171
|
+
end
|
172
|
+
|
83
173
|
def create_callable_type()
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
174
|
+
types = []
|
175
|
+
range = [0, 0]
|
176
|
+
in_optional_parameters = false
|
177
|
+
parameters.each do |param|
|
178
|
+
type = if param.type_expr
|
179
|
+
@evaluator.evaluate(param.type_expr, @enclosing_scope)
|
180
|
+
else
|
181
|
+
Puppet::Pops::Types::TypeFactory.any()
|
182
|
+
end
|
183
|
+
|
184
|
+
if param.captures_rest && type.is_a?(Puppet::Pops::Types::PArrayType)
|
185
|
+
# An array on a slurp parameter is how a size range is defined for a
|
186
|
+
# slurp (Array[Integer, 1, 3] *$param). However, the callable that is
|
187
|
+
# created can't have the array in that position or else type checking
|
188
|
+
# will require the parameters to be arrays, which isn't what is
|
189
|
+
# intended. The array type contains the intended information and needs
|
190
|
+
# to be unpacked.
|
191
|
+
param_range = type.size_range
|
192
|
+
type = type.element_type
|
193
|
+
elsif param.captures_rest && !type.is_a?(Puppet::Pops::Types::PArrayType)
|
194
|
+
param_range = ANY_NUMBER_RANGE
|
195
|
+
elsif param.value
|
196
|
+
param_range = OPTIONAL_SINGLE_RANGE
|
197
|
+
else
|
198
|
+
param_range = REQUIRED_SINGLE_RANGE
|
199
|
+
end
|
200
|
+
|
201
|
+
types << type
|
202
|
+
|
203
|
+
if param_range[0] == 0
|
204
|
+
in_optional_parameters = true
|
205
|
+
elsif param_range[0] != 0 && in_optional_parameters
|
206
|
+
@evaluator.fail(Puppet::Pops::Issues::REQUIRED_PARAMETER_AFTER_OPTIONAL, param, { :param_name => param.name })
|
207
|
+
end
|
208
|
+
|
209
|
+
range[0] += param_range[0]
|
210
|
+
range[1] += param_range[1]
|
90
211
|
end
|
91
212
|
|
92
|
-
|
93
|
-
|
94
|
-
from = to - optional_parameter_count
|
95
|
-
if from != to
|
96
|
-
size_t = Puppet::Pops::Types::PIntegerType.new()
|
97
|
-
size_t.from = size
|
98
|
-
size_t.to = size
|
99
|
-
tuple_t.size_type = size_t
|
213
|
+
if range[1] == Puppet::Pops::Types::INFINITY
|
214
|
+
range[1] = :default
|
100
215
|
end
|
101
|
-
|
102
|
-
|
103
|
-
# being a Callable
|
104
|
-
t
|
216
|
+
|
217
|
+
Puppet::Pops::Types::TypeFactory.callable(*(types + range))
|
105
218
|
end
|
106
219
|
|
107
220
|
# Produces information about parameters compatible with a 4x Function (which can have multiple signatures)
|
@@ -109,4 +222,7 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
|
|
109
222
|
[ self ]
|
110
223
|
end
|
111
224
|
|
225
|
+
ANY_NUMBER_RANGE = [0, Puppet::Pops::Types::INFINITY]
|
226
|
+
OPTIONAL_SINGLE_RANGE = [0, 1]
|
227
|
+
REQUIRED_SINGLE_RANGE = [1, 1]
|
112
228
|
end
|
@@ -9,10 +9,15 @@
|
|
9
9
|
class Puppet::Pops::Evaluator::CompareOperator
|
10
10
|
include Puppet::Pops::Utils
|
11
11
|
|
12
|
+
# Provides access to the Puppet 3.x runtime (scope, etc.)
|
13
|
+
# This separation has been made to make it easier to later migrate the evaluator to an improved runtime.
|
14
|
+
#
|
15
|
+
include Puppet::Pops::Evaluator::Runtime3Support
|
16
|
+
|
12
17
|
def initialize
|
13
18
|
@@equals_visitor ||= Puppet::Pops::Visitor.new(self, "equals", 1, 1)
|
14
19
|
@@compare_visitor ||= Puppet::Pops::Visitor.new(self, "cmp", 1, 1)
|
15
|
-
@@include_visitor ||= Puppet::Pops::Visitor.new(self, "include",
|
20
|
+
@@include_visitor ||= Puppet::Pops::Visitor.new(self, "include", 2, 2)
|
16
21
|
@type_calculator = Puppet::Pops::Types::TypeCalculator.new()
|
17
22
|
end
|
18
23
|
|
@@ -27,8 +32,8 @@ class Puppet::Pops::Evaluator::CompareOperator
|
|
27
32
|
end
|
28
33
|
|
29
34
|
# Answers is b included in a
|
30
|
-
def include?(a, b)
|
31
|
-
@@include_visitor.
|
35
|
+
def include?(a, b, scope)
|
36
|
+
@@include_visitor.visit_this_2(self, a, b, scope)
|
32
37
|
end
|
33
38
|
|
34
39
|
protected
|
@@ -110,50 +115,49 @@ class Puppet::Pops::Evaluator::CompareOperator
|
|
110
115
|
end
|
111
116
|
|
112
117
|
def equals_NilClass(a, b)
|
118
|
+
# :undef supported in case it is passed from a 3x data structure
|
113
119
|
b.nil? || b == :undef
|
114
120
|
end
|
115
121
|
|
116
122
|
def equals_Symbol(a, b)
|
123
|
+
# :undef supported in case it is passed from a 3x data structure
|
117
124
|
a == b || a == :undef && b.nil?
|
118
125
|
end
|
119
126
|
|
120
|
-
def include_Object(a, b)
|
127
|
+
def include_Object(a, b, scope)
|
121
128
|
false
|
122
129
|
end
|
123
130
|
|
124
|
-
def include_String(a, b)
|
131
|
+
def include_String(a, b, scope)
|
125
132
|
case b
|
126
133
|
when String
|
127
134
|
# subsstring search downcased
|
128
135
|
a.downcase.include?(b.downcase)
|
129
136
|
when Regexp
|
130
|
-
|
131
|
-
|
137
|
+
matched = a.match(b) # nil, or MatchData
|
138
|
+
set_match_data(matched, scope) # creates ephemeral
|
139
|
+
!!matched # match (convert to boolean)
|
132
140
|
when Numeric
|
133
141
|
# convert string to number, true if ==
|
134
142
|
equals(a, b)
|
135
|
-
when Puppet::Pops::Types::PStringType
|
136
|
-
# is there a string in a string? (yes, each char is a string, and an empty string contains an empty string)
|
137
|
-
true
|
138
143
|
else
|
139
|
-
|
140
|
-
# A String is Data and Object (but not of all subtypes of those types).
|
141
|
-
true
|
142
|
-
else
|
143
|
-
false
|
144
|
-
end
|
144
|
+
false
|
145
145
|
end
|
146
146
|
end
|
147
147
|
|
148
|
-
def include_Array(a, b)
|
148
|
+
def include_Array(a, b, scope)
|
149
149
|
case b
|
150
150
|
when Regexp
|
151
|
+
matched = nil
|
151
152
|
a.each do |element|
|
152
153
|
next unless element.is_a? String
|
153
|
-
|
154
|
+
matched = element.match(b) # nil, or MatchData
|
155
|
+
break if matched
|
154
156
|
end
|
155
|
-
|
156
|
-
|
157
|
+
# Always set match data, a "not found" should not keep old match data visible
|
158
|
+
set_match_data(matched, scope) # creates ephemeral
|
159
|
+
return !!matched
|
160
|
+
when Puppet::Pops::Types::PAnyType
|
157
161
|
a.each {|element| return true if @type_calculator.instance?(b, element) }
|
158
162
|
return false
|
159
163
|
else
|
@@ -162,7 +166,7 @@ class Puppet::Pops::Evaluator::CompareOperator
|
|
162
166
|
end
|
163
167
|
end
|
164
168
|
|
165
|
-
def include_Hash(a, b)
|
166
|
-
include?(a.keys, b)
|
169
|
+
def include_Hash(a, b, scope)
|
170
|
+
include?(a.keys, b, scope)
|
167
171
|
end
|
168
172
|
end
|
@@ -3,14 +3,14 @@
|
|
3
3
|
class Puppet::Pops::Evaluator::EppEvaluator
|
4
4
|
|
5
5
|
def self.inline_epp(scope, epp_source, template_args = nil)
|
6
|
-
unless epp_source.is_a?
|
6
|
+
unless epp_source.is_a?(String)
|
7
7
|
raise ArgumentError, "inline_epp(): the first argument must be a String with the epp source text, got a #{epp_source.class}"
|
8
8
|
end
|
9
9
|
|
10
10
|
# Parse and validate the source
|
11
11
|
parser = Puppet::Pops::Parser::EvaluatingParser::EvaluatingEppParser.new
|
12
12
|
begin
|
13
|
-
|
13
|
+
result = parser.parse_string(epp_source, 'inlined-epp-text')
|
14
14
|
rescue Puppet::ParseError => e
|
15
15
|
raise ArgumentError, "inline_epp(): Invalid EPP: #{e.message}"
|
16
16
|
end
|
@@ -20,7 +20,7 @@ class Puppet::Pops::Evaluator::EppEvaluator
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def self.epp(scope, file, env_name, template_args = nil)
|
23
|
-
unless file.is_a?
|
23
|
+
unless file.is_a?(String)
|
24
24
|
raise ArgumentError, "epp(): the first argument must be a String with the filename, got a #{file.class}"
|
25
25
|
end
|
26
26
|
|
@@ -34,7 +34,7 @@ class Puppet::Pops::Evaluator::EppEvaluator
|
|
34
34
|
# Parse and validate the source
|
35
35
|
parser = Puppet::Pops::Parser::EvaluatingParser::EvaluatingEppParser.new
|
36
36
|
begin
|
37
|
-
|
37
|
+
result = parser.parse_file(template_file)
|
38
38
|
rescue Puppet::ParseError => e
|
39
39
|
raise ArgumentError, "epp(): Invalid EPP: #{e.message}"
|
40
40
|
end
|
@@ -59,18 +59,19 @@ class Puppet::Pops::Evaluator::EppEvaluator
|
|
59
59
|
raise ArgumentError, "#{func_name}(): The EPP template contains illegal expressions (definitions)"
|
60
60
|
end
|
61
61
|
|
62
|
-
|
63
|
-
if
|
64
|
-
# no epp params
|
65
|
-
|
66
|
-
spill_over = false
|
67
|
-
else
|
68
|
-
# no epp params or user provided arguments in a hash, epp logic only sees global + what was given
|
62
|
+
parameters_specified = body.body.parameters_specified
|
63
|
+
if parameters_specified || template_args_set
|
64
|
+
# no epp params or user provided arguments in a hash, epp() logic
|
65
|
+
# only sees global + what was given
|
69
66
|
closure_scope = scope.find_global_scope
|
70
|
-
|
71
|
-
|
67
|
+
enforce_parameters = parameters_specified
|
68
|
+
else
|
69
|
+
# no epp params and no arguments were given => inline_epp() logic
|
70
|
+
# sees all local variables, epp() all global
|
71
|
+
closure_scope = use_global_scope_only ? scope.find_global_scope : scope
|
72
|
+
enforce_parameters = true
|
72
73
|
end
|
73
|
-
evaluated_result = parser.closure(body, closure_scope).call_by_name(scope, template_args,
|
74
|
+
evaluated_result = parser.closure(body, closure_scope).call_by_name(scope, template_args, enforce_parameters)
|
74
75
|
evaluated_result
|
75
76
|
end
|
76
77
|
|
@@ -84,4 +85,4 @@ class Puppet::Pops::Evaluator::EppEvaluator
|
|
84
85
|
[template_args, true]
|
85
86
|
end
|
86
87
|
end
|
87
|
-
end
|
88
|
+
end
|
@@ -34,6 +34,8 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
34
34
|
# Refactor when support is dropped for Ruby 1.8.7.
|
35
35
|
#
|
36
36
|
INFINITY = 1.0 / 0.0
|
37
|
+
EMPTY_STRING = ''.freeze
|
38
|
+
COMMA_SEPARATOR = ', '.freeze
|
37
39
|
|
38
40
|
# Reference to Issues name space makes it easier to refer to issues
|
39
41
|
# (Issues are shared with the validator).
|
@@ -41,7 +43,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
41
43
|
Issues = Puppet::Pops::Issues
|
42
44
|
|
43
45
|
def initialize
|
44
|
-
@@eval_visitor
|
46
|
+
@@eval_visitor ||= Puppet::Pops::Visitor.new(self, "eval", 1, 1)
|
45
47
|
@@lvalue_visitor ||= Puppet::Pops::Visitor.new(self, "lvalue", 1, 1)
|
46
48
|
@@assign_visitor ||= Puppet::Pops::Visitor.new(self, "assign", 3, 3)
|
47
49
|
@@string_visitor ||= Puppet::Pops::Visitor.new(self, "string", 1, 1)
|
@@ -61,23 +63,14 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
61
63
|
@@type_calculator
|
62
64
|
end
|
63
65
|
|
64
|
-
#
|
66
|
+
# Evaluates the given _target_ object in the given scope.
|
65
67
|
#
|
66
|
-
#
|
67
|
-
# Polymorphic evaluate calls a method on the format eval_TYPE where classname is the last
|
68
|
-
# part of the class of the given _target_. A search is performed starting with the actual class, continuing
|
69
|
-
# with each of the _target_ class's super classes until a matching method is found.
|
70
|
-
#
|
71
|
-
# # Description
|
72
|
-
# Evaluates the given _target_ object in the given scope, optionally passing a block which will be
|
73
|
-
# called with the result of the evaluation.
|
74
|
-
#
|
75
|
-
# @overload evaluate(target, scope, {|result| block})
|
68
|
+
# @overload evaluate(target, scope)
|
76
69
|
# @param target [Object] evaluation target - see methods on the pattern assign_TYPE for actual supported types.
|
77
70
|
# @param scope [Object] the runtime specific scope class where evaluation should take place
|
78
71
|
# @return [Object] the result of the evaluation
|
79
72
|
#
|
80
|
-
# @api
|
73
|
+
# @api public
|
81
74
|
#
|
82
75
|
def evaluate(target, scope)
|
83
76
|
begin
|
@@ -96,152 +89,56 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
96
89
|
end
|
97
90
|
end
|
98
91
|
|
99
|
-
# Polymorphic assign - calls assign_TYPE
|
100
|
-
#
|
101
|
-
# ## Polymorphic assign
|
102
|
-
# Polymorphic assign calls a method on the format assign_TYPE where TYPE is the last
|
103
|
-
# part of the class of the given _target_. A search is performed starting with the actual class, continuing
|
104
|
-
# with each of the _target_ class's super classes until a matching method is found.
|
105
|
-
#
|
106
|
-
# # Description
|
107
92
|
# Assigns the given _value_ to the given _target_. The additional argument _o_ is the instruction that
|
108
93
|
# produced the target/value tuple and it is used to set the origin of the result.
|
94
|
+
#
|
109
95
|
# @param target [Object] assignment target - see methods on the pattern assign_TYPE for actual supported types.
|
110
96
|
# @param value [Object] the value to assign to `target`
|
111
97
|
# @param o [Puppet::Pops::Model::PopsObject] originating instruction
|
112
98
|
# @param scope [Object] the runtime specific scope where evaluation should take place
|
113
99
|
#
|
114
|
-
# @api
|
100
|
+
# @api private
|
115
101
|
#
|
116
102
|
def assign(target, value, o, scope)
|
117
103
|
@@assign_visitor.visit_this_3(self, target, value, o, scope)
|
118
104
|
end
|
119
105
|
|
106
|
+
# Computes a value that can be used as the LHS in an assignment.
|
107
|
+
# @param o [Object] the expression to evaluate as a left (assignable) entity
|
108
|
+
# @param scope [Object] the runtime specific scope where evaluation should take place
|
109
|
+
#
|
110
|
+
# @api private
|
111
|
+
#
|
120
112
|
def lvalue(o, scope)
|
121
113
|
@@lvalue_visitor.visit_this_1(self, o, scope)
|
122
114
|
end
|
123
115
|
|
116
|
+
# Produces a String representation of the given object _o_ as used in interpolation.
|
117
|
+
# @param o [Object] the expression of which a string representation is wanted
|
118
|
+
# @param scope [Object] the runtime specific scope where evaluation should take place
|
119
|
+
#
|
120
|
+
# @api public
|
121
|
+
#
|
124
122
|
def string(o, scope)
|
125
123
|
@@string_visitor.visit_this_1(self, o, scope)
|
126
124
|
end
|
127
125
|
|
128
|
-
#
|
129
|
-
#
|
130
|
-
# could create similar objects to Closure, wait until other types of defines are instantiated - they may behave
|
131
|
-
# as special cases of calls - i.e. 'new').
|
126
|
+
# Evaluate a BlockExpression in a new scope with variables bound to the
|
127
|
+
# given values.
|
132
128
|
#
|
133
|
-
#
|
134
|
-
#
|
129
|
+
# @param scope [Puppet::Parser::Scope] the parent scope
|
130
|
+
# @param variable_bindings [Hash{String => Object}] the variable names and values to bind (names are keys, bound values are values)
|
131
|
+
# @param block [Puppet::Pops::Model::BlockExpression] the sequence of expressions to evaluate in the new scope
|
135
132
|
#
|
136
|
-
# @
|
137
|
-
# @raise ArgumentError, if given closure is not a Puppet::Pops::Evaluator::Closure
|
138
|
-
#
|
139
|
-
def call_by_name(closure, args_hash, scope, spill_over = false)
|
140
|
-
raise ArgumentError, "Can only call a Lambda" unless closure.is_a?(Puppet::Pops::Evaluator::Closure)
|
141
|
-
pblock = closure.model
|
142
|
-
parameters = pblock.parameters || []
|
143
|
-
|
144
|
-
if !spill_over && args_hash.size > parameters.size
|
145
|
-
raise ArgumentError, "Too many arguments: #{args_hash.size} for #{parameters.size}"
|
146
|
-
end
|
147
|
-
|
148
|
-
# associate values with parameters
|
149
|
-
scope_hash = {}
|
150
|
-
parameters.each do |p|
|
151
|
-
scope_hash[p.name] = args_hash[p.name] || evaluate(p.value, scope)
|
152
|
-
end
|
153
|
-
missing = scope_hash.reduce([]) {|memo, entry| memo << entry[0] if entry[1].nil?; memo }
|
154
|
-
unless missing.empty?
|
155
|
-
optional = parameters.count { |p| !p.value.nil? }
|
156
|
-
raise ArgumentError, "Too few arguments; no value given for required parameters #{missing.join(" ,")}"
|
157
|
-
end
|
158
|
-
if spill_over
|
159
|
-
# all args from given hash should be used, nil entries replaced by default values should win
|
160
|
-
scope_hash = args_hash.merge(scope_hash)
|
161
|
-
end
|
162
|
-
|
163
|
-
# Store the evaluated name => value associations in a new inner/local/ephemeral scope
|
164
|
-
# (This is made complicated due to the fact that the implementation of scope is overloaded with
|
165
|
-
# functionality and an inner ephemeral scope must be used (as opposed to just pushing a local scope
|
166
|
-
# on a scope "stack").
|
167
|
-
|
168
|
-
# Ensure variable exists with nil value if error occurs.
|
169
|
-
# Some ruby implementations does not like creating variable on return
|
170
|
-
result = nil
|
171
|
-
begin
|
172
|
-
scope_memo = get_scope_nesting_level(scope)
|
173
|
-
# change to create local scope_from - cannot give it file and line - that is the place of the call, not
|
174
|
-
# "here"
|
175
|
-
create_local_scope_from(scope_hash, scope)
|
176
|
-
result = evaluate(pblock.body, scope)
|
177
|
-
ensure
|
178
|
-
set_scope_nesting_level(scope, scope_memo)
|
179
|
-
end
|
180
|
-
result
|
181
|
-
end
|
182
|
-
|
183
|
-
# Call a closure - Can only be called with a Closure (for now), may be refactored later
|
184
|
-
# to also handle other types of calls (function calls are also handled by CallNamedFunction and CallMethod, they
|
185
|
-
# could create similar objects to Closure, wait until other types of defines are instantiated - they may behave
|
186
|
-
# as special cases of calls - i.e. 'new')
|
187
|
-
#
|
188
|
-
# @raise ArgumentError, if there are to many or too few arguments
|
189
|
-
# @raise ArgumentError, if given closure is not a Puppet::Pops::Evaluator::Closure
|
133
|
+
# @api private
|
190
134
|
#
|
191
|
-
def
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
# associate values with parameters
|
199
|
-
merged = parameters.zip(args)
|
200
|
-
# calculate missing arguments
|
201
|
-
missing = parameters.slice(args.size, parameters.size - args.size).select {|p| p.value.nil? }
|
202
|
-
unless missing.empty?
|
203
|
-
optional = parameters.count { |p| !p.value.nil? }
|
204
|
-
raise ArgumentError, "Too few arguments; #{args.size} for #{optional > 0 ? ' min ' : ''}#{parameters.size - optional}"
|
205
|
-
end
|
206
|
-
|
207
|
-
evaluated = merged.collect do |m|
|
208
|
-
# m can be one of
|
209
|
-
# m = [Parameter{name => "name", value => nil], "given"]
|
210
|
-
# | [Parameter{name => "name", value => Expression}, "given"]
|
211
|
-
#
|
212
|
-
# "given" is always an optional entry. If a parameter was provided then
|
213
|
-
# the entry will be in the array, otherwise the m array will be a
|
214
|
-
# single element.
|
215
|
-
given_argument = m[1]
|
216
|
-
argument_name = m[0].name
|
217
|
-
default_expression = m[0].value
|
218
|
-
|
219
|
-
value = if default_expression
|
220
|
-
evaluate(default_expression, scope)
|
221
|
-
else
|
222
|
-
given_argument
|
223
|
-
end
|
224
|
-
[argument_name, value]
|
225
|
-
end
|
226
|
-
|
227
|
-
# Store the evaluated name => value associations in a new inner/local/ephemeral scope
|
228
|
-
# (This is made complicated due to the fact that the implementation of scope is overloaded with
|
229
|
-
# functionality and an inner ephemeral scope must be used (as opposed to just pushing a local scope
|
230
|
-
# on a scope "stack").
|
231
|
-
|
232
|
-
# Ensure variable exists with nil value if error occurs.
|
233
|
-
# Some ruby implementations does not like creating variable on return
|
234
|
-
result = nil
|
235
|
-
begin
|
236
|
-
scope_memo = get_scope_nesting_level(scope)
|
237
|
-
# change to create local scope_from - cannot give it file and line - that is the place of the call, not
|
238
|
-
# "here"
|
239
|
-
create_local_scope_from(Hash[evaluated], scope)
|
240
|
-
result = evaluate(pblock.body, scope)
|
241
|
-
ensure
|
242
|
-
set_scope_nesting_level(scope, scope_memo)
|
135
|
+
def evaluate_block_with_bindings(scope, variable_bindings, block_expr)
|
136
|
+
with_guarded_scope(scope) do
|
137
|
+
# change to create local scope_from - cannot give it file and line -
|
138
|
+
# that is the place of the call, not "here"
|
139
|
+
create_local_scope_from(variable_bindings, scope)
|
140
|
+
evaluate(block_expr, scope)
|
243
141
|
end
|
244
|
-
result
|
245
142
|
end
|
246
143
|
|
247
144
|
protected
|
@@ -294,17 +191,12 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
294
191
|
o
|
295
192
|
end
|
296
193
|
|
297
|
-
# Allows nil to be used as a Nop
|
298
|
-
# Evaluates to nil
|
299
|
-
# TODO: What is the difference between literal undef, nil, and nop?
|
300
|
-
#
|
194
|
+
# Allows nil to be used as a Nop, Evaluates to nil
|
301
195
|
def eval_NilClass(o, scope)
|
302
196
|
nil
|
303
197
|
end
|
304
198
|
|
305
199
|
# Evaluates Nop to nil.
|
306
|
-
# TODO: or is this the same as :undef
|
307
|
-
# TODO: is this even needed as a separate instruction when there is a literal undef?
|
308
200
|
def eval_Nop(o, scope)
|
309
201
|
nil
|
310
202
|
end
|
@@ -315,12 +207,18 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
315
207
|
o.value
|
316
208
|
end
|
317
209
|
|
210
|
+
# Reserved Words fail to evaluate
|
211
|
+
#
|
212
|
+
def eval_ReservedWord(o, scope)
|
213
|
+
fail(Puppet::Pops::Issues::RESERVED_WORD, o, {:word => o.word})
|
214
|
+
end
|
215
|
+
|
318
216
|
def eval_LiteralDefault(o, scope)
|
319
217
|
:default
|
320
218
|
end
|
321
219
|
|
322
220
|
def eval_LiteralUndef(o, scope)
|
323
|
-
|
221
|
+
nil
|
324
222
|
end
|
325
223
|
|
326
224
|
# A QualifiedReference (i.e. a capitalized qualified name such as Foo, or Foo::Bar) evaluates to a PType
|
@@ -337,6 +235,19 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
337
235
|
- coerce_numeric(evaluate(o.expr, scope), o, scope)
|
338
236
|
end
|
339
237
|
|
238
|
+
def eval_UnfoldExpression(o, scope)
|
239
|
+
candidate = evaluate(o.expr, scope)
|
240
|
+
case candidate
|
241
|
+
when Array
|
242
|
+
candidate
|
243
|
+
when Hash
|
244
|
+
candidate.to_a
|
245
|
+
else
|
246
|
+
# turns anything else into an array (so result can be unfolded)
|
247
|
+
[candidate]
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
340
251
|
# Abstract evaluation, returns array [left, right] with the evaluated result of left_expr and
|
341
252
|
# right_expr
|
342
253
|
# @return <Array<Object, Object>> array with result of evaluating left and right expressions
|
@@ -356,41 +267,8 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
356
267
|
name = lvalue(o.left_expr, scope)
|
357
268
|
value = evaluate(o.right_expr, scope)
|
358
269
|
|
359
|
-
|
360
|
-
when :'=' # regular assignment
|
270
|
+
if o.operator == :'='
|
361
271
|
assign(name, value, o, scope)
|
362
|
-
|
363
|
-
when :'+='
|
364
|
-
# if value does not exist and strict is on, looking it up fails, else it is nil or :undef
|
365
|
-
existing_value = get_variable_value(name, o, scope)
|
366
|
-
begin
|
367
|
-
if existing_value.nil? || existing_value == :undef
|
368
|
-
assign(name, value, o, scope)
|
369
|
-
else
|
370
|
-
# Delegate to calculate function to deal with check of LHS, and perform ´+´ as arithmetic or concatenation the
|
371
|
-
# same way as ArithmeticExpression performs `+`.
|
372
|
-
assign(name, calculate(existing_value, value, :'+', o.left_expr, o.right_expr, scope), o, scope)
|
373
|
-
end
|
374
|
-
rescue ArgumentError => e
|
375
|
-
fail(Issues::APPEND_FAILED, o, {:message => e.message})
|
376
|
-
end
|
377
|
-
|
378
|
-
when :'-='
|
379
|
-
# If an attempt is made to delete values from something that does not exists, the value is :undef (it is guaranteed to not
|
380
|
-
# include any values the user wants deleted anyway :-)
|
381
|
-
#
|
382
|
-
# if value does not exist and strict is on, looking it up fails, else it is nil or :undef
|
383
|
-
existing_value = get_variable_value(name, o, scope)
|
384
|
-
begin
|
385
|
-
if existing_value.nil? || existing_value == :undef
|
386
|
-
assign(name, :undef, o, scope)
|
387
|
-
else
|
388
|
-
# Delegate to delete function to deal with check of LHS, and perform deletion
|
389
|
-
assign(name, delete(get_variable_value(name, o, scope), value), o, scope)
|
390
|
-
end
|
391
|
-
rescue ArgumentError => e
|
392
|
-
fail(Issues::APPEND_FAILED, o, {:message => e.message}, e)
|
393
|
-
end
|
394
272
|
else
|
395
273
|
fail(Issues::UNSUPPORTED_OPERATOR, o, {:operator => o.operator})
|
396
274
|
end
|
@@ -403,7 +281,9 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
403
281
|
# Handles binary expression where lhs and rhs are array/hash or numeric and operator is +, - , *, % / << >>
|
404
282
|
#
|
405
283
|
def eval_ArithmeticExpression(o, scope)
|
406
|
-
left
|
284
|
+
left = evaluate(o.left_expr, scope)
|
285
|
+
right = evaluate(o.right_expr, scope)
|
286
|
+
|
407
287
|
begin
|
408
288
|
result = calculate(left, right, o.operator, o.left_expr, o.right_expr, scope)
|
409
289
|
rescue ArgumentError => e
|
@@ -458,7 +338,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
458
338
|
def eval_EppExpression(o, scope)
|
459
339
|
scope["@epp"] = []
|
460
340
|
evaluate(o.body, scope)
|
461
|
-
result = scope["@epp"].join
|
341
|
+
result = scope["@epp"].join
|
462
342
|
result
|
463
343
|
end
|
464
344
|
|
@@ -493,11 +373,12 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
493
373
|
# Evaluates <, <=, >, >=, and ==
|
494
374
|
#
|
495
375
|
def eval_ComparisonExpression o, scope
|
496
|
-
left
|
376
|
+
left = evaluate(o.left_expr, scope)
|
377
|
+
right = evaluate(o.right_expr, scope)
|
497
378
|
|
498
379
|
begin
|
499
380
|
# Left is a type
|
500
|
-
if left.is_a?(Puppet::Pops::Types::
|
381
|
+
if left.is_a?(Puppet::Pops::Types::PAnyType)
|
501
382
|
case o.operator
|
502
383
|
when :'=='
|
503
384
|
@@type_calculator.equals(left,right)
|
@@ -548,7 +429,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
548
429
|
end
|
549
430
|
|
550
431
|
# Evaluates matching expressions with type, string or regexp rhs expression.
|
551
|
-
# If RHS is a type, the =~ matches compatible (
|
432
|
+
# If RHS is a type, the =~ matches compatible (instance? of) type.
|
552
433
|
#
|
553
434
|
# @example
|
554
435
|
# x =~ /abc.*/
|
@@ -559,21 +440,22 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
559
440
|
# x =~ "${y}.*"
|
560
441
|
# @example
|
561
442
|
# [1,2,3] =~ Array[Integer[1,10]]
|
443
|
+
#
|
444
|
+
# Note that a string is not instance? of Regexp, only Regular expressions are.
|
445
|
+
# The Pattern type should instead be used as it is specified as subtype of String.
|
446
|
+
#
|
562
447
|
# @return [Boolean] if a match was made or not. Also sets $0..$n to matchdata in current scope.
|
563
448
|
#
|
564
449
|
def eval_MatchExpression o, scope
|
565
|
-
left
|
450
|
+
left = evaluate(o.left_expr, scope)
|
451
|
+
pattern = evaluate(o.right_expr, scope)
|
452
|
+
|
566
453
|
# matches RHS types as instance of for all types except a parameterized Regexp[R]
|
567
|
-
if pattern.is_a?(Puppet::Pops::Types::
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
# evaluate as instance?
|
573
|
-
matched = @@type_calculator.instance?(pattern, left)
|
574
|
-
# convert match result to Boolean true, or false
|
575
|
-
return o.operator == :'=~' ? !!matched : !matched
|
576
|
-
end
|
454
|
+
if pattern.is_a?(Puppet::Pops::Types::PAnyType)
|
455
|
+
# evaluate as instance? of type check
|
456
|
+
matched = @@type_calculator.instance?(pattern, left)
|
457
|
+
# convert match result to Boolean true, or false
|
458
|
+
return o.operator == :'=~' ? !!matched : !matched
|
577
459
|
end
|
578
460
|
|
579
461
|
begin
|
@@ -586,7 +468,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
586
468
|
end
|
587
469
|
|
588
470
|
matched = pattern.match(left) # nil, or MatchData
|
589
|
-
set_match_data(matched,
|
471
|
+
set_match_data(matched,scope) # creates ephemeral
|
590
472
|
|
591
473
|
# convert match result to Boolean true, or false
|
592
474
|
o.operator == :'=~' ? !!matched : !matched
|
@@ -595,8 +477,9 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
595
477
|
# Evaluates Puppet DSL `in` expression
|
596
478
|
#
|
597
479
|
def eval_InExpression o, scope
|
598
|
-
left
|
599
|
-
|
480
|
+
left = evaluate(o.left_expr, scope)
|
481
|
+
right = evaluate(o.right_expr, scope)
|
482
|
+
@@compare_operator.include?(right, left, scope)
|
600
483
|
end
|
601
484
|
|
602
485
|
# @example
|
@@ -616,19 +499,19 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
616
499
|
end
|
617
500
|
|
618
501
|
# Evaluates each entry of the literal list and creates a new Array
|
502
|
+
# Supports unfolding of entries
|
619
503
|
# @return [Array] with the evaluated content
|
620
504
|
#
|
621
505
|
def eval_LiteralList o, scope
|
622
|
-
o.values
|
506
|
+
unfold([], o.values, scope)
|
623
507
|
end
|
624
508
|
|
625
509
|
# Evaluates each entry of the literal hash and creates a new Hash.
|
626
510
|
# @return [Hash] with the evaluated content
|
627
511
|
#
|
628
512
|
def eval_LiteralHash o, scope
|
629
|
-
|
630
|
-
o.entries.
|
631
|
-
h
|
513
|
+
# optimized
|
514
|
+
o.entries.reduce({}) {|h,entry| h[evaluate(entry.key, scope)] = evaluate(entry.value, scope); h }
|
632
515
|
end
|
633
516
|
|
634
517
|
# Evaluates all statements and produces the last evaluated value
|
@@ -656,8 +539,17 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
656
539
|
if o.options.find do |co|
|
657
540
|
# the first case option that matches
|
658
541
|
if co.values.find do |c|
|
659
|
-
|
660
|
-
|
542
|
+
case c
|
543
|
+
when Puppet::Pops::Model::LiteralDefault
|
544
|
+
the_default = co.then_expr
|
545
|
+
is_match?(test, evaluate(c, scope), c, scope)
|
546
|
+
when Puppet::Pops::Model::UnfoldExpression
|
547
|
+
# not ideal for error reporting, since it is not known which unfolded result
|
548
|
+
# that caused an error - the entire unfold expression is blamed (i.e. the var c, passed to is_match?)
|
549
|
+
evaluate(c, scope).any? {|v| is_match?(test, v, c, scope) }
|
550
|
+
else
|
551
|
+
is_match?(test, evaluate(c, scope), c, scope)
|
552
|
+
end
|
661
553
|
end
|
662
554
|
result = evaluate(co.then_expr, scope)
|
663
555
|
true # the option was picked
|
@@ -712,16 +604,123 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
712
604
|
evaluate(o.body, scope)
|
713
605
|
end
|
714
606
|
|
715
|
-
# Produces Array[
|
607
|
+
# Produces Array[PAnyType], an array of resource references
|
716
608
|
#
|
717
609
|
def eval_ResourceExpression(o, scope)
|
718
610
|
exported = o.exported
|
719
611
|
virtual = o.virtual
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
612
|
+
|
613
|
+
# Get the type name
|
614
|
+
type_name =
|
615
|
+
if (tmp_name = o.type_name).is_a?(Puppet::Pops::Model::QualifiedName)
|
616
|
+
tmp_name.value # already validated as a name
|
617
|
+
else
|
618
|
+
type_name_acceptable =
|
619
|
+
case o.type_name
|
620
|
+
when Puppet::Pops::Model::QualifiedReference
|
621
|
+
true
|
622
|
+
when Puppet::Pops::Model::AccessExpression
|
623
|
+
o.type_name.left_expr.is_a?(Puppet::Pops::Model::QualifiedReference)
|
624
|
+
end
|
625
|
+
|
626
|
+
evaluated_name = evaluate(tmp_name, scope)
|
627
|
+
unless type_name_acceptable
|
628
|
+
actual = type_calculator.generalize!(type_calculator.infer(evaluated_name)).to_s
|
629
|
+
fail(Puppet::Pops::Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, {:actual => actual})
|
630
|
+
end
|
631
|
+
|
632
|
+
# must be a CatalogEntry subtype
|
633
|
+
case evaluated_name
|
634
|
+
when Puppet::Pops::Types::PHostClassType
|
635
|
+
unless evaluated_name.class_name.nil?
|
636
|
+
fail(Puppet::Pops::Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, {:actual=> evaluated_name.to_s})
|
637
|
+
end
|
638
|
+
'class'
|
639
|
+
|
640
|
+
when Puppet::Pops::Types::PResourceType
|
641
|
+
unless evaluated_name.title().nil?
|
642
|
+
fail(Puppet::Pops::Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, {:actual=> evaluated_name.to_s})
|
643
|
+
end
|
644
|
+
evaluated_name.type_name # assume validated
|
645
|
+
|
646
|
+
else
|
647
|
+
actual = type_calculator.generalize!(type_calculator.infer(evaluated_name)).to_s
|
648
|
+
fail(Puppet::Pops::Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, {:actual=>actual})
|
649
|
+
end
|
650
|
+
end
|
651
|
+
|
652
|
+
# This is a runtime check - the model is valid, but will have runtime issues when evaluated
|
653
|
+
# and storeconfigs is not set.
|
654
|
+
if(o.exported)
|
655
|
+
optionally_fail(Puppet::Pops::Issues::RT_NO_STORECONFIGS_EXPORT, o);
|
656
|
+
end
|
657
|
+
|
658
|
+
titles_to_body = {}
|
659
|
+
body_to_titles = {}
|
660
|
+
body_to_params = {}
|
661
|
+
|
662
|
+
# titles are evaluated before attribute operations
|
663
|
+
o.bodies.map do | body |
|
664
|
+
titles = evaluate(body.title, scope)
|
665
|
+
|
666
|
+
# Title may not be nil
|
667
|
+
# Titles may be given as an array, it is ok if it is empty, but not if it contains nil entries
|
668
|
+
# Titles may not be an empty String
|
669
|
+
# Titles must be unique in the same resource expression
|
670
|
+
# There may be a :default entry, its entries apply with lower precedence
|
671
|
+
#
|
672
|
+
if titles.nil?
|
673
|
+
fail(Puppet::Pops::Issues::MISSING_TITLE, body.title)
|
674
|
+
end
|
675
|
+
titles = [titles].flatten
|
676
|
+
|
677
|
+
# Check types of evaluated titles and duplicate entries
|
678
|
+
titles.each_with_index do |title, index|
|
679
|
+
if title.nil?
|
680
|
+
fail(Puppet::Pops::Issues::MISSING_TITLE_AT, body.title, {:index => index})
|
681
|
+
|
682
|
+
elsif !title.is_a?(String) && title != :default
|
683
|
+
actual = type_calculator.generalize!(type_calculator.infer(title)).to_s
|
684
|
+
fail(Puppet::Pops::Issues::ILLEGAL_TITLE_TYPE_AT, body.title, {:index => index, :actual => actual})
|
685
|
+
|
686
|
+
elsif title == EMPTY_STRING
|
687
|
+
fail(Puppet::Pops::Issues::EMPTY_STRING_TITLE_AT, body.title, {:index => index})
|
688
|
+
|
689
|
+
elsif titles_to_body[title]
|
690
|
+
fail(Puppet::Pops::Issues::DUPLICATE_TITLE, o, {:title => title})
|
691
|
+
end
|
692
|
+
titles_to_body[title] = body
|
693
|
+
end
|
694
|
+
|
695
|
+
# Do not create a real instance from the :default case
|
696
|
+
titles.delete(:default)
|
697
|
+
|
698
|
+
body_to_titles[body] = titles
|
699
|
+
|
700
|
+
# Store evaluated parameters in a hash associated with the body, but do not yet create resource
|
701
|
+
# since the entry containing :defaults may appear later
|
702
|
+
body_to_params[body] = body.operations.reduce({}) do |param_memo, op|
|
703
|
+
params = evaluate(op, scope)
|
704
|
+
params = [params] unless params.is_a?(Array)
|
705
|
+
params.each do |p|
|
706
|
+
if param_memo.include? p.name
|
707
|
+
fail(Puppet::Pops::Issues::DUPLICATE_ATTRIBUTE, o, {:attribute => p.name})
|
708
|
+
end
|
709
|
+
param_memo[p.name] = p
|
710
|
+
end
|
711
|
+
param_memo
|
712
|
+
end
|
713
|
+
end
|
714
|
+
|
715
|
+
# Titles and Operations have now been evaluated and resources can be created
|
716
|
+
# Each production is a PResource, and an array of all is produced as the result of
|
717
|
+
# evaluating the ResourceExpression.
|
718
|
+
#
|
719
|
+
defaults_hash = body_to_params[titles_to_body[:default]] || {}
|
720
|
+
o.bodies.map do | body |
|
721
|
+
titles = body_to_titles[body]
|
722
|
+
params = defaults_hash.merge(body_to_params[body] || {})
|
723
|
+
create_resources(o, scope, virtual, exported, type_name, titles, params.values)
|
725
724
|
end.flatten.compact
|
726
725
|
end
|
727
726
|
|
@@ -732,19 +731,35 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
732
731
|
evaluated_resources
|
733
732
|
end
|
734
733
|
|
735
|
-
# Produces 3x
|
734
|
+
# Produces 3x parameter
|
736
735
|
def eval_AttributeOperation(o, scope)
|
737
736
|
create_resource_parameter(o, scope, o.attribute_name, evaluate(o.value_expr, scope), o.operator)
|
738
737
|
end
|
739
738
|
|
739
|
+
def eval_AttributesOperation(o, scope)
|
740
|
+
hashed_params = evaluate(o.expr, scope)
|
741
|
+
unless hashed_params.is_a?(Hash)
|
742
|
+
actual = type_calculator.generalize!(type_calculator.infer(hashed_params)).to_s
|
743
|
+
fail(Puppet::Pops::Issues::TYPE_MISMATCH, o.expr, {:expected => 'Hash', :actual => actual})
|
744
|
+
end
|
745
|
+
hashed_params.map { |k,v| create_resource_parameter(o, scope, k, v, :'=>') }
|
746
|
+
end
|
747
|
+
|
740
748
|
# Sets default parameter values for a type, produces the type
|
741
749
|
#
|
742
750
|
def eval_ResourceDefaultsExpression(o, scope)
|
743
|
-
|
751
|
+
type = evaluate(o.type_ref, scope)
|
752
|
+
type_name =
|
753
|
+
if type.is_a?(Puppet::Pops::Types::PResourceType) && !type.type_name.nil? && type.title.nil?
|
754
|
+
type.type_name # assume it is a valid name
|
755
|
+
else
|
756
|
+
actual = type_calculator.generalize!(type_calculator.infer(type))
|
757
|
+
fail(Issues::ILLEGAL_RESOURCE_TYPE, o.type_ref, {:actual => actual})
|
758
|
+
end
|
744
759
|
evaluated_parameters = o.operations.map {|op| evaluate(op, scope) }
|
745
760
|
create_resource_defaults(o, scope, type_name, evaluated_parameters)
|
746
761
|
# Produce the type
|
747
|
-
|
762
|
+
type
|
748
763
|
end
|
749
764
|
|
750
765
|
# Evaluates function call by name.
|
@@ -762,7 +777,9 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
762
777
|
fail(Issues::ILLEGAL_EXPRESSION, o.functor_expr, {:feature=>'function name', :container => o})
|
763
778
|
end
|
764
779
|
name = o.functor_expr.value
|
765
|
-
|
780
|
+
|
781
|
+
evaluated_arguments = unfold([], o.arguments, scope)
|
782
|
+
|
766
783
|
# wrap lambda in a callable block if it is present
|
767
784
|
evaluated_arguments << Puppet::Pops::Evaluator::Closure.new(self, o.lambda, scope) if o.lambda
|
768
785
|
call_function(name, evaluated_arguments, o, scope)
|
@@ -780,7 +797,10 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
780
797
|
fail(Issues::ILLEGAL_EXPRESSION, o.functor_expr, {:feature=>'function name', :container => o})
|
781
798
|
end
|
782
799
|
name = name.value # the string function name
|
783
|
-
|
800
|
+
|
801
|
+
evaluated_arguments = unfold([receiver], o.arguments || [], scope)
|
802
|
+
|
803
|
+
# wrap lambda in a callable block if it is present
|
784
804
|
evaluated_arguments << Puppet::Pops::Evaluator::Closure.new(self, o.lambda, scope) if o.lambda
|
785
805
|
call_function(name, evaluated_arguments, o, scope)
|
786
806
|
end
|
@@ -794,14 +814,27 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
794
814
|
#
|
795
815
|
with_guarded_scope(scope) do
|
796
816
|
test = evaluate(o.left_expr, scope)
|
817
|
+
the_default = nil
|
797
818
|
selected = o.selectors.find do |s|
|
798
|
-
|
799
|
-
|
819
|
+
me = s.matching_expr
|
820
|
+
case me
|
821
|
+
when Puppet::Pops::Model::LiteralDefault
|
822
|
+
the_default = s.value_expr
|
823
|
+
false
|
824
|
+
when Puppet::Pops::Model::UnfoldExpression
|
825
|
+
# not ideal for error reporting, since it is not known which unfolded result
|
826
|
+
# that caused an error - the entire unfold expression is blamed (i.e. the var c, passed to is_match?)
|
827
|
+
evaluate(me, scope).any? {|v| is_match?(test, v, me, scope) }
|
828
|
+
else
|
829
|
+
is_match?(test, evaluate(me, scope), me, scope)
|
830
|
+
end
|
800
831
|
end
|
801
832
|
if selected
|
802
833
|
evaluate(selected.value_expr, scope)
|
834
|
+
elsif the_default
|
835
|
+
evaluate(the_default, scope)
|
803
836
|
else
|
804
|
-
|
837
|
+
fail(Issues::UNMATCHED_SELECTOR, o.left_expr, :param_value => test)
|
805
838
|
end
|
806
839
|
end
|
807
840
|
end
|
@@ -851,15 +884,13 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
851
884
|
name = evaluate(o.expr, scope)
|
852
885
|
|
853
886
|
# Should be caught by validation, but make this explicit here as well, or mysterious evaluation issues
|
854
|
-
# may occur.
|
887
|
+
# may occur for some evaluation use cases.
|
855
888
|
case name
|
856
889
|
when String
|
857
890
|
when Numeric
|
858
891
|
else
|
859
892
|
fail(Issues::ILLEGAL_VARIABLE_EXPRESSION, o.expr)
|
860
893
|
end
|
861
|
-
# TODO: Check for valid variable name (Task for validator)
|
862
|
-
# TODO: semantics of undefined variable in scope, this just returns what scope does == value or nil
|
863
894
|
get_variable_value(name, o, scope)
|
864
895
|
end
|
865
896
|
|
@@ -882,7 +913,6 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
882
913
|
#
|
883
914
|
def eval_TextExpression o, scope
|
884
915
|
if o.expr.is_a?(Puppet::Pops::Model::QualifiedName)
|
885
|
-
# TODO: formalize, when scope returns nil, vs error
|
886
916
|
string(get_variable_value(o.expr.value, o, scope), scope)
|
887
917
|
else
|
888
918
|
string(evaluate(o.expr, scope), scope)
|
@@ -894,27 +924,26 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
894
924
|
end
|
895
925
|
|
896
926
|
def string_Symbol(o, scope)
|
897
|
-
|
898
|
-
|
899
|
-
''
|
927
|
+
if :undef == o # optimized comparison 1.44 vs 1.95
|
928
|
+
EMPTY_STRING
|
900
929
|
else
|
901
930
|
o.to_s
|
902
931
|
end
|
903
932
|
end
|
904
933
|
|
905
|
-
def string_Array(o, scope)
|
906
|
-
[
|
934
|
+
def string_Array(o, scope)
|
935
|
+
"[#{o.map {|e| string(e, scope)}.join(COMMA_SEPARATOR)}]"
|
907
936
|
end
|
908
937
|
|
909
938
|
def string_Hash(o, scope)
|
910
|
-
|
939
|
+
"{#{o.map {|k,v| "#{string(k, scope)} => #{string(v, scope)}"}.join(COMMA_SEPARATOR)}}"
|
911
940
|
end
|
912
941
|
|
913
942
|
def string_Regexp(o, scope)
|
914
|
-
|
943
|
+
"/#{o.source}/"
|
915
944
|
end
|
916
945
|
|
917
|
-
def
|
946
|
+
def string_PAnyType(o, scope)
|
918
947
|
@@type_calculator.string(o)
|
919
948
|
end
|
920
949
|
|
@@ -1041,9 +1070,9 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
1041
1070
|
if right.is_a?(Regexp)
|
1042
1071
|
return false unless left.is_a? String
|
1043
1072
|
matched = right.match(left)
|
1044
|
-
set_match_data(matched,
|
1073
|
+
set_match_data(matched, scope) # creates or clears ephemeral
|
1045
1074
|
!!matched # convert to boolean
|
1046
|
-
elsif right.is_a?(Puppet::Pops::Types::
|
1075
|
+
elsif right.is_a?(Puppet::Pops::Types::PAnyType)
|
1047
1076
|
# right is a type and left is not - check if left is an instance of the given type
|
1048
1077
|
# (The reverse is not terribly meaningful - computing which of the case options that first produces
|
1049
1078
|
# an instance of a given type).
|
@@ -1064,4 +1093,23 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
|
|
1064
1093
|
end
|
1065
1094
|
end
|
1066
1095
|
|
1096
|
+
# Maps the expression in the given array to their product except for UnfoldExpressions which are first unfolded.
|
1097
|
+
# The result is added to the given result Array.
|
1098
|
+
# @param result [Array] Where to add the result (may contain information to add to)
|
1099
|
+
# @param array [Array[Puppet::Pops::Model::Expression] the expressions to map
|
1100
|
+
# @param scope [Puppet::Parser::Scope] the scope to evaluate in
|
1101
|
+
# @return [Array] the given result array with content added from the operation
|
1102
|
+
#
|
1103
|
+
def unfold(result, array, scope)
|
1104
|
+
array.each do |x|
|
1105
|
+
if x.is_a?(Puppet::Pops::Model::UnfoldExpression)
|
1106
|
+
result.concat(evaluate(x, scope))
|
1107
|
+
else
|
1108
|
+
result << evaluate(x, scope)
|
1109
|
+
end
|
1110
|
+
end
|
1111
|
+
result
|
1112
|
+
end
|
1113
|
+
private :unfold
|
1114
|
+
|
1067
1115
|
end
|