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
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'tempfile'
|
2
|
-
|
3
|
-
class Puppet::FileSystem::Tempfile
|
4
|
-
|
5
|
-
# Variation of Tempfile.open which ensures that the tempfile is closed and
|
6
|
-
# unlinked before returning
|
7
|
-
#
|
8
|
-
# @param identifier [String] additional part of generated pathname
|
9
|
-
# @yieldparam file [File] the temporary file object
|
10
|
-
# @return result of the passed block
|
11
|
-
# @api private
|
12
|
-
def self.open(identifier)
|
13
|
-
file = ::Tempfile.new(identifier)
|
14
|
-
|
15
|
-
yield file
|
16
|
-
|
17
|
-
ensure
|
18
|
-
file.close!
|
19
|
-
end
|
20
|
-
end
|
@@ -1,119 +0,0 @@
|
|
1
|
-
require 'puppet/pops'
|
2
|
-
|
3
|
-
module Puppet; module Parser; end; end;
|
4
|
-
# Adapts an egrammar/eparser to respond to the public API of the classic parser
|
5
|
-
#
|
6
|
-
class Puppet::Parser::EParserAdapter
|
7
|
-
|
8
|
-
def initialize(classic_parser)
|
9
|
-
@classic_parser = classic_parser
|
10
|
-
@file = ''
|
11
|
-
@string = ''
|
12
|
-
@use = :undefined
|
13
|
-
end
|
14
|
-
|
15
|
-
def file=(file)
|
16
|
-
@classic_parser.file = file
|
17
|
-
@file = file
|
18
|
-
@use = :file
|
19
|
-
end
|
20
|
-
|
21
|
-
def parse(string = nil)
|
22
|
-
if @file =~ /\.rb$/
|
23
|
-
return parse_ruby_file
|
24
|
-
else
|
25
|
-
self.string= string if string
|
26
|
-
parser = Puppet::Pops::Parser::Parser.new()
|
27
|
-
parse_result = if @use == :string
|
28
|
-
parser.parse_string(@string)
|
29
|
-
else
|
30
|
-
parser.parse_file(@file)
|
31
|
-
end
|
32
|
-
# Compute the source_file to set in created AST objects (it was either given, or it may be unknown
|
33
|
-
# if caller did not set a file and the present a string.
|
34
|
-
#
|
35
|
-
source_file = @file || "unknown-source-location"
|
36
|
-
|
37
|
-
# Validate
|
38
|
-
validate(parse_result)
|
39
|
-
# Transform the result, but only if not nil
|
40
|
-
parse_result = Puppet::Pops::Model::AstTransformer.new(source_file, @classic_parser).transform(parse_result) if parse_result
|
41
|
-
if parse_result && !parse_result.is_a?(Puppet::Parser::AST::BlockExpression)
|
42
|
-
# Need to transform again, if result is not wrapped in something iterable when handed off to
|
43
|
-
# a new Hostclass as its code.
|
44
|
-
parse_result = Puppet::Parser::AST::BlockExpression.new(:children => [parse_result]) if parse_result
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
Puppet::Parser::AST::Hostclass.new('', :code => parse_result)
|
49
|
-
end
|
50
|
-
|
51
|
-
def validate(parse_result)
|
52
|
-
# TODO: This is too many hoops to jump through... ugly API
|
53
|
-
# could reference a ValidatorFactory.validator_3_1(acceptor) instead.
|
54
|
-
# and let the factory abstract the rest.
|
55
|
-
#
|
56
|
-
return unless parse_result
|
57
|
-
|
58
|
-
acceptor = Puppet::Pops::Validation::Acceptor.new
|
59
|
-
validator = Puppet::Pops::Validation::ValidatorFactory_3_1.new().validator(acceptor)
|
60
|
-
validator.validate(parse_result)
|
61
|
-
|
62
|
-
max_errors = Puppet[:max_errors]
|
63
|
-
max_warnings = Puppet[:max_warnings] + 1
|
64
|
-
max_deprecations = Puppet[:max_deprecations] + 1
|
65
|
-
|
66
|
-
# If there are warnings output them
|
67
|
-
warnings = acceptor.warnings
|
68
|
-
if warnings.size > 0
|
69
|
-
formatter = Puppet::Pops::Validation::DiagnosticFormatterPuppetStyle.new
|
70
|
-
emitted_w = 0
|
71
|
-
emitted_dw = 0
|
72
|
-
acceptor.warnings.each {|w|
|
73
|
-
if w.severity == :deprecation
|
74
|
-
# Do *not* call Puppet.deprecation_warning it is for internal deprecation, not
|
75
|
-
# deprecation of constructs in manifests! (It is not designed for that purpose even if
|
76
|
-
# used throughout the code base).
|
77
|
-
#
|
78
|
-
Puppet.warning(formatter.format(w)) if emitted_dw < max_deprecations
|
79
|
-
emitted_dw += 1
|
80
|
-
else
|
81
|
-
Puppet.warning(formatter.format(w)) if emitted_w < max_warnings
|
82
|
-
emitted_w += 1
|
83
|
-
end
|
84
|
-
break if emitted_w > max_warnings && emitted_dw > max_deprecations # but only then
|
85
|
-
}
|
86
|
-
end
|
87
|
-
|
88
|
-
# If there were errors, report the first found. Use a puppet style formatter.
|
89
|
-
errors = acceptor.errors
|
90
|
-
if errors.size > 0
|
91
|
-
formatter = Puppet::Pops::Validation::DiagnosticFormatterPuppetStyle.new
|
92
|
-
if errors.size == 1 || max_errors <= 1
|
93
|
-
# raise immediately
|
94
|
-
raise Puppet::ParseError.new(formatter.format(errors[0]))
|
95
|
-
end
|
96
|
-
emitted = 0
|
97
|
-
errors.each do |e|
|
98
|
-
Puppet.err(formatter.format(e))
|
99
|
-
emitted += 1
|
100
|
-
break if emitted >= max_errors
|
101
|
-
end
|
102
|
-
warnings_message = warnings.size > 0 ? ", and #{warnings.size} warnings" : ""
|
103
|
-
giving_up_message = "Found #{errors.size} errors#{warnings_message}. Giving up"
|
104
|
-
exception = Puppet::ParseError.new(giving_up_message)
|
105
|
-
exception.file = errors[0].file
|
106
|
-
raise exception
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
def string=(string)
|
111
|
-
@classic_parser.string = string
|
112
|
-
@string = string
|
113
|
-
@use = :string
|
114
|
-
end
|
115
|
-
|
116
|
-
def parse_ruby_file
|
117
|
-
@classic_parser.parse
|
118
|
-
end
|
119
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
Puppet::Parser::Functions::newfunction(
|
2
|
-
:collect,
|
3
|
-
:type => :rvalue,
|
4
|
-
:arity => 2,
|
5
|
-
:doc => <<-'ENDHEREDOC') do |args|
|
6
|
-
The 'collect' function has been renamed to 'map'. Please update your manifests.
|
7
|
-
|
8
|
-
The collect function is reserved for future use.
|
9
|
-
- Removed as of 3.4
|
10
|
-
- requires `parser = future`.
|
11
|
-
ENDHEREDOC
|
12
|
-
|
13
|
-
raise NotImplementedError,
|
14
|
-
"The 'collect' function has been renamed to 'map'. Please update your manifests."
|
15
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
Puppet::Parser::Functions::newfunction(
|
2
|
-
:select,
|
3
|
-
:type => :rvalue,
|
4
|
-
:arity => 2,
|
5
|
-
:doc => <<-'ENDHEREDOC') do |args|
|
6
|
-
The 'select' function has been renamed to 'filter'. Please update your manifests.
|
7
|
-
|
8
|
-
The select function is reserved for future use.
|
9
|
-
- Removed as of 3.4
|
10
|
-
- requires `parser = future`.
|
11
|
-
ENDHEREDOC
|
12
|
-
|
13
|
-
raise NotImplementedError,
|
14
|
-
"The 'select' function has been renamed to 'filter'. Please update your manifests."
|
15
|
-
end
|
@@ -1,109 +0,0 @@
|
|
1
|
-
# The RubyLegacyFunctionInstantiator loads a 3x function and turns it into a 4x function
|
2
|
-
# that is called with 3x semantics (values are transformed to be 3x compliant).
|
3
|
-
#
|
4
|
-
# The code is loaded from a string obtained by reading the 3x function ruby code into a string
|
5
|
-
# and then passing it to the loaders class method `create`. When Puppet[:biff] == true, the
|
6
|
-
# 3x Puppet::Parser::Function.newfunction method relays back to this function loader's
|
7
|
-
# class method legacy_newfunction which creates a Puppet::Functions class wrapping the
|
8
|
-
# 3x function's block into a method in a function class derived from Puppet::Function.
|
9
|
-
# This class is then returned, and the Legacy loader continues the same way as it does
|
10
|
-
# for a 4x function.
|
11
|
-
#
|
12
|
-
# TODO: Wrapping of Scope
|
13
|
-
# The 3x function expects itself to be Scope. It passes itself as scope to other parts of the runtime,
|
14
|
-
# it expects to find all sorts of information in itself, get/set variables, get compiler, get environment
|
15
|
-
# etc.
|
16
|
-
# TODO: Transformation of arguments to 3x compliant objects
|
17
|
-
#
|
18
|
-
class Puppet::Pops::Loader::RubyLegacyFunctionInstantiator
|
19
|
-
|
20
|
-
# Produces an instance of the Function class with the given typed_name, or fails with an error if the
|
21
|
-
# given ruby source does not produce this instance when evaluated.
|
22
|
-
#
|
23
|
-
# @param loader [Puppet::Pops::Loader::Loader] The loader the function is associated with
|
24
|
-
# @param typed_name [Puppet::Pops::Loader::TypedName] the type / name of the function to load
|
25
|
-
# @param source_ref [URI, String] a reference to the source / origin of the ruby code to evaluate
|
26
|
-
# @param ruby_code_string [String] ruby code in a string
|
27
|
-
#
|
28
|
-
# @return [Puppet::Pops::Functions.Function] - an instantiated function with global scope closure associated with the given loader
|
29
|
-
#
|
30
|
-
def self.create(loader, typed_name, source_ref, ruby_code_string)
|
31
|
-
# Old Ruby API supports calling a method via ::
|
32
|
-
# this must also be checked as well as call with '.'
|
33
|
-
#
|
34
|
-
unless ruby_code_string.is_a?(String) && ruby_code_string =~ /Puppet\:\:Parser\:\:Functions(?:\.|\:\:)newfunction/
|
35
|
-
raise ArgumentError, "The code loaded from #{source_ref} does not seem to be a Puppet 3x API function - no newfunction call."
|
36
|
-
end
|
37
|
-
|
38
|
-
# The evaluation of the 3x function creation source should result in a call to the legacy_newfunction
|
39
|
-
#
|
40
|
-
created = eval(ruby_code_string)
|
41
|
-
unless created.is_a?(Class)
|
42
|
-
raise ArgumentError, "The code loaded from #{source_ref} did not produce a Function class when evaluated. Got '#{created.class}'"
|
43
|
-
end
|
44
|
-
unless created.name.to_s == typed_name.name()
|
45
|
-
raise ArgumentError, "The code loaded from #{source_ref} produced mis-matched name, expected '#{typed_name.name}', got #{created.name}"
|
46
|
-
end
|
47
|
-
# create the function instance - it needs closure (scope), and loader (i.e. where it should start searching for things
|
48
|
-
# when calling functions etc.
|
49
|
-
# It should be bound to global scope
|
50
|
-
|
51
|
-
# TODO: Cheating wrt. scope - assuming it is found in the context
|
52
|
-
closure_scope = Puppet.lookup(:global_scope) { {} }
|
53
|
-
created.new(closure_scope, loader)
|
54
|
-
end
|
55
|
-
|
56
|
-
# This is a new implementation of the method that is used in 3x to create a function.
|
57
|
-
# The arguments are the same as those passed to Puppet::Parser::Functions.newfunction, hence its
|
58
|
-
# deviation from regular method naming practice.
|
59
|
-
#
|
60
|
-
def self.legacy_newfunction(name, options, &block)
|
61
|
-
|
62
|
-
# 3x api allows arity to be specified, if unspecified it is 0 or more arguments
|
63
|
-
# arity >= 0, is an exact count
|
64
|
-
# airty < 0 is the number of required arguments -1 (i.e. -1 is 0 or more)
|
65
|
-
# (there is no upper cap, there is no support for optional values, or defaults)
|
66
|
-
#
|
67
|
-
arity = options[:arity] || -1
|
68
|
-
if arity >= 0
|
69
|
-
min_arg_count = arity
|
70
|
-
max_arg_count = arity
|
71
|
-
else
|
72
|
-
min_arg_count = (arity + 1).abs
|
73
|
-
# infinity
|
74
|
-
max_arg_count = :default
|
75
|
-
end
|
76
|
-
|
77
|
-
# Create a 4x function wrapper around the 3x Function
|
78
|
-
created_function_class = Puppet::Functions.create_function(name) do
|
79
|
-
# define a method on the new Function class with the same name as the function, but
|
80
|
-
# padded with __ because the function may represent a ruby method with the same name that
|
81
|
-
# expects to have inherited from Kernel, and then Object.
|
82
|
-
# (This can otherwise lead to infinite recursion, or that an ArgumentError is raised).
|
83
|
-
#
|
84
|
-
__name__ = :"__#{name}__"
|
85
|
-
define_method(__name__, &block)
|
86
|
-
|
87
|
-
# Define the method that is called from dispatch - this method just changes a call
|
88
|
-
# with multiple unknown arguments to passing all in an array (since this is expected in the 3x API).
|
89
|
-
# We want the call to be checked for type and number of arguments so cannot call the function
|
90
|
-
# defined by the block directly since it is defined to take a single argument.
|
91
|
-
#
|
92
|
-
define_method(:__relay__call__) do |*args|
|
93
|
-
# dup the args since the function may destroy them
|
94
|
-
# TODO: Should convert arguments to 3x, now :undef is send to the function
|
95
|
-
send(__name__, args.dup)
|
96
|
-
end
|
97
|
-
|
98
|
-
# Define a dispatch that performs argument type/count checking
|
99
|
-
#
|
100
|
-
dispatch :__relay__call__ do
|
101
|
-
# Use Puppet Type Object (not Optional[Object] since the 3x API passes undef as empty string).
|
102
|
-
param 'Object', 'args'
|
103
|
-
# Specify arg count (transformed from 3x function arity specification).
|
104
|
-
arg_count(min_arg_count, max_arg_count)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
created_function_class
|
108
|
-
end
|
109
|
-
end
|
@@ -1,753 +0,0 @@
|
|
1
|
-
# the scanner/lexer
|
2
|
-
|
3
|
-
require 'forwardable'
|
4
|
-
require 'strscan'
|
5
|
-
require 'puppet'
|
6
|
-
require 'puppet/util/methodhelper'
|
7
|
-
|
8
|
-
module Puppet
|
9
|
-
class LexError < RuntimeError; end
|
10
|
-
end
|
11
|
-
|
12
|
-
class Puppet::Pops::Parser::Lexer
|
13
|
-
extend Forwardable
|
14
|
-
|
15
|
-
attr_reader :file, :lexing_context, :token_queue
|
16
|
-
|
17
|
-
attr_reader :locator
|
18
|
-
|
19
|
-
attr_accessor :indefine
|
20
|
-
alias :indefine? :indefine
|
21
|
-
|
22
|
-
def lex_error msg
|
23
|
-
raise Puppet::LexError.new(msg)
|
24
|
-
end
|
25
|
-
|
26
|
-
class Token
|
27
|
-
ALWAYS_ACCEPTABLE = Proc.new { |context| true }
|
28
|
-
|
29
|
-
include Puppet::Util::MethodHelper
|
30
|
-
|
31
|
-
attr_accessor :regex, :name, :string, :skip, :skip_text
|
32
|
-
alias skip? skip
|
33
|
-
|
34
|
-
# @overload initialize(string)
|
35
|
-
# @param string [String] a literal string token matcher
|
36
|
-
# @param name [String] the token name (what it is known as in the grammar)
|
37
|
-
# @param options [Hash] see {#set_options}
|
38
|
-
# @overload initialize(regex)
|
39
|
-
# @param regex [Regexp] a regular expression token text matcher
|
40
|
-
# @param name [String] the token name (what it is known as in the grammar)
|
41
|
-
# @param options [Hash] see {#set_options}
|
42
|
-
#
|
43
|
-
def initialize(string_or_regex, name, options = {})
|
44
|
-
if string_or_regex.is_a?(String)
|
45
|
-
@name, @string = name, string_or_regex
|
46
|
-
@regex = Regexp.new(Regexp.escape(string_or_regex))
|
47
|
-
else
|
48
|
-
@name, @regex = name, string_or_regex
|
49
|
-
end
|
50
|
-
|
51
|
-
set_options(options)
|
52
|
-
@acceptable_when = ALWAYS_ACCEPTABLE
|
53
|
-
end
|
54
|
-
|
55
|
-
# @return [String] human readable token reference; the String if literal, else the token name
|
56
|
-
def to_s
|
57
|
-
string or @name.to_s
|
58
|
-
end
|
59
|
-
|
60
|
-
# @return [Boolean] if the token is acceptable in the given context or not.
|
61
|
-
# @param context [Hash] the lexing context
|
62
|
-
#
|
63
|
-
def acceptable?(context={})
|
64
|
-
@acceptable_when.call(context)
|
65
|
-
end
|
66
|
-
|
67
|
-
|
68
|
-
# Defines when the token is able to match.
|
69
|
-
# This provides context that cannot be expressed otherwise, such as feature flags.
|
70
|
-
#
|
71
|
-
# @param block [Proc] a proc that given a context returns a boolean
|
72
|
-
def acceptable_when(block)
|
73
|
-
@acceptable_when = block
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
# Maintains a list of tokens.
|
78
|
-
class TokenList
|
79
|
-
extend Forwardable
|
80
|
-
|
81
|
-
attr_reader :regex_tokens, :string_tokens
|
82
|
-
def_delegator :@tokens, :[]
|
83
|
-
# Adds a new token to the set of recognized tokens
|
84
|
-
# @param name [String] the token name
|
85
|
-
# @param regex [Regexp, String] source text token matcher, a litral string or regular expression
|
86
|
-
# @param options [Hash] see {Token::set_options}
|
87
|
-
# @param block [Proc] optional block set as the created tokens `convert` method
|
88
|
-
# @raise [ArgumentError] if the token with the given name is already defined
|
89
|
-
#
|
90
|
-
def add_token(name, regex, options = {}, &block)
|
91
|
-
raise(ArgumentError, "Token #{name} already exists") if @tokens.include?(name)
|
92
|
-
token = Token.new(regex, name, options)
|
93
|
-
@tokens[token.name] = token
|
94
|
-
if token.string
|
95
|
-
@string_tokens << token
|
96
|
-
@tokens_by_string[token.string] = token
|
97
|
-
else
|
98
|
-
@regex_tokens << token
|
99
|
-
end
|
100
|
-
|
101
|
-
token.meta_def(:convert, &block) if block_given?
|
102
|
-
|
103
|
-
token
|
104
|
-
end
|
105
|
-
|
106
|
-
# Creates an empty token list
|
107
|
-
#
|
108
|
-
def initialize
|
109
|
-
@tokens = {}
|
110
|
-
@regex_tokens = []
|
111
|
-
@string_tokens = []
|
112
|
-
@tokens_by_string = {}
|
113
|
-
end
|
114
|
-
|
115
|
-
# Look up a token by its literal (match) value, rather than name.
|
116
|
-
# @param string [String, nil] the literal match string to obtain a {Token} for, or nil if it does not exist.
|
117
|
-
def lookup(string)
|
118
|
-
@tokens_by_string[string]
|
119
|
-
end
|
120
|
-
|
121
|
-
# Adds tokens from a hash where key is a matcher (literal string or regexp) and the
|
122
|
-
# value is the token's name
|
123
|
-
# @param hash [Hash<{String => Symbol}, Hash<{Regexp => Symbol}] map token text matcher to token name
|
124
|
-
# @return [void]
|
125
|
-
#
|
126
|
-
def add_tokens(hash)
|
127
|
-
hash.each do |regex, name|
|
128
|
-
add_token(name, regex)
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
# Sort literal (string-) tokens by length, so we know once we match, we're done.
|
133
|
-
# This helps avoid the O(n^2) nature of token matching.
|
134
|
-
# The tokens are sorted in place.
|
135
|
-
# @return [void]
|
136
|
-
def sort_tokens
|
137
|
-
@string_tokens.sort! { |a, b| b.string.length <=> a.string.length }
|
138
|
-
end
|
139
|
-
|
140
|
-
# Yield each token name and value in turn.
|
141
|
-
def each
|
142
|
-
@tokens.each {|name, value| yield name, value }
|
143
|
-
end
|
144
|
-
end
|
145
|
-
|
146
|
-
TOKENS = TokenList.new
|
147
|
-
TOKENS.add_tokens(
|
148
|
-
'[' => :LBRACK,
|
149
|
-
']' => :RBRACK,
|
150
|
-
# '{' => :LBRACE, # Specialized to handle lambda and brace count
|
151
|
-
# '}' => :RBRACE, # Specialized to handle brace count
|
152
|
-
'(' => :LPAREN,
|
153
|
-
')' => :RPAREN,
|
154
|
-
'=' => :EQUALS,
|
155
|
-
'+=' => :APPENDS,
|
156
|
-
'-=' => :DELETES,
|
157
|
-
'==' => :ISEQUAL,
|
158
|
-
'>=' => :GREATEREQUAL,
|
159
|
-
'>' => :GREATERTHAN,
|
160
|
-
'<' => :LESSTHAN,
|
161
|
-
'<=' => :LESSEQUAL,
|
162
|
-
'!=' => :NOTEQUAL,
|
163
|
-
'!' => :NOT,
|
164
|
-
',' => :COMMA,
|
165
|
-
'.' => :DOT,
|
166
|
-
':' => :COLON,
|
167
|
-
'@' => :AT,
|
168
|
-
'|' => :PIPE,
|
169
|
-
'<<|' => :LLCOLLECT,
|
170
|
-
'|>>' => :RRCOLLECT,
|
171
|
-
'->' => :IN_EDGE,
|
172
|
-
'<-' => :OUT_EDGE,
|
173
|
-
'~>' => :IN_EDGE_SUB,
|
174
|
-
'<~' => :OUT_EDGE_SUB,
|
175
|
-
'<|' => :LCOLLECT,
|
176
|
-
'|>' => :RCOLLECT,
|
177
|
-
';' => :SEMIC,
|
178
|
-
'?' => :QMARK,
|
179
|
-
'\\' => :BACKSLASH,
|
180
|
-
'=>' => :FARROW,
|
181
|
-
'+>' => :PARROW,
|
182
|
-
'+' => :PLUS,
|
183
|
-
'-' => :MINUS,
|
184
|
-
'/' => :DIV,
|
185
|
-
'*' => :TIMES,
|
186
|
-
'%' => :MODULO,
|
187
|
-
'<<' => :LSHIFT,
|
188
|
-
'>>' => :RSHIFT,
|
189
|
-
'=~' => :MATCH,
|
190
|
-
'!~' => :NOMATCH,
|
191
|
-
%r{((::){0,1}[A-Z][-\w]*)+} => :CLASSREF,
|
192
|
-
"<string>" => :STRING,
|
193
|
-
"<dqstring up to first interpolation>" => :DQPRE,
|
194
|
-
"<dqstring between two interpolations>" => :DQMID,
|
195
|
-
"<dqstring after final interpolation>" => :DQPOST,
|
196
|
-
"<boolean>" => :BOOLEAN,
|
197
|
-
"<select start>" => :SELBRACE # A QMARK followed by '{'
|
198
|
-
)
|
199
|
-
|
200
|
-
module Contextual
|
201
|
-
QUOTE_TOKENS = [:DQPRE,:DQMID]
|
202
|
-
REGEX_INTRODUCING_TOKENS = [:NODE,:LBRACE, :SELBRACE, :RBRACE,:MATCH,:NOMATCH,:COMMA]
|
203
|
-
|
204
|
-
NOT_INSIDE_QUOTES = Proc.new do |context|
|
205
|
-
!QUOTE_TOKENS.include? context[:after]
|
206
|
-
end
|
207
|
-
|
208
|
-
INSIDE_QUOTES = Proc.new do |context|
|
209
|
-
QUOTE_TOKENS.include? context[:after]
|
210
|
-
end
|
211
|
-
|
212
|
-
IN_REGEX_POSITION = Proc.new do |context|
|
213
|
-
REGEX_INTRODUCING_TOKENS.include? context[:after]
|
214
|
-
end
|
215
|
-
|
216
|
-
# DASHED_VARIABLES_ALLOWED = Proc.new do |context|
|
217
|
-
# Puppet[:allow_variables_with_dashes]
|
218
|
-
# end
|
219
|
-
#
|
220
|
-
# VARIABLE_AND_DASHES_ALLOWED = Proc.new do |context|
|
221
|
-
# Contextual::DASHED_VARIABLES_ALLOWED.call(context) and TOKENS[:VARIABLE].acceptable?(context)
|
222
|
-
# end
|
223
|
-
end
|
224
|
-
|
225
|
-
# Numbers are treated separately from names, so that they may contain dots.
|
226
|
-
TOKENS.add_token :NUMBER, %r{\b(?:0[xX][0-9A-Fa-f]+|0?\d+(?:\.\d+)?(?:[eE]-?\d+)?)\b} do |lexer, value|
|
227
|
-
lexer.assert_numeric(value)
|
228
|
-
[TOKENS[:NAME], value]
|
229
|
-
end
|
230
|
-
TOKENS[:NUMBER].acceptable_when Contextual::NOT_INSIDE_QUOTES
|
231
|
-
|
232
|
-
TOKENS.add_token :NAME, %r{((::)?[a-z0-9][-\w]*)(::[a-z0-9][-\w]*)*} do |lexer, value|
|
233
|
-
# A name starting with a number must be a valid numeric string (not that
|
234
|
-
# NUMBER token captures those names that do not comply with the name rule.
|
235
|
-
if value =~ /^[0-9].*$/
|
236
|
-
lexer.assert_numeric(value)
|
237
|
-
end
|
238
|
-
|
239
|
-
string_token = self
|
240
|
-
# we're looking for keywords here
|
241
|
-
if tmp = KEYWORDS.lookup(value)
|
242
|
-
string_token = tmp
|
243
|
-
if [:TRUE, :FALSE].include?(string_token.name)
|
244
|
-
value = eval(value)
|
245
|
-
string_token = TOKENS[:BOOLEAN]
|
246
|
-
end
|
247
|
-
end
|
248
|
-
[string_token, value]
|
249
|
-
end
|
250
|
-
[:NAME, :CLASSREF].each do |name_token|
|
251
|
-
TOKENS[name_token].acceptable_when Contextual::NOT_INSIDE_QUOTES
|
252
|
-
end
|
253
|
-
|
254
|
-
TOKENS.add_token :COMMENT, %r{#.*}, :skip => true do |lexer,value|
|
255
|
-
# value.sub!(/# ?/,'')
|
256
|
-
[self, ""]
|
257
|
-
end
|
258
|
-
|
259
|
-
TOKENS.add_token :MLCOMMENT, %r{/\*(.*?)\*/}m, :skip => true do |lexer, value|
|
260
|
-
# value.sub!(/^\/\* ?/,'')
|
261
|
-
# value.sub!(/ ?\*\/$/,'')
|
262
|
-
[self, ""]
|
263
|
-
end
|
264
|
-
|
265
|
-
TOKENS.add_token :REGEX, %r{/[^/\n]*/} do |lexer, value|
|
266
|
-
# Make sure we haven't matched an escaped /
|
267
|
-
while value[-2..-2] == '\\'
|
268
|
-
other = lexer.scan_until(%r{/})
|
269
|
-
value += other
|
270
|
-
end
|
271
|
-
regex = value.sub(%r{\A/}, "").sub(%r{/\Z}, '').gsub("\\/", "/")
|
272
|
-
[self, Regexp.new(regex)]
|
273
|
-
end
|
274
|
-
TOKENS[:REGEX].acceptable_when Contextual::IN_REGEX_POSITION
|
275
|
-
|
276
|
-
TOKENS.add_token :RETURN, "\n", :skip => true, :skip_text => true
|
277
|
-
|
278
|
-
TOKENS.add_token :SQUOTE, "'" do |lexer, value|
|
279
|
-
[TOKENS[:STRING], lexer.slurpstring(value,["'"],:ignore_invalid_escapes).first ]
|
280
|
-
end
|
281
|
-
|
282
|
-
DQ_initial_token_types = {'$' => :DQPRE,'"' => :STRING}
|
283
|
-
DQ_continuation_token_types = {'$' => :DQMID,'"' => :DQPOST}
|
284
|
-
|
285
|
-
TOKENS.add_token :DQUOTE, /"/ do |lexer, value|
|
286
|
-
lexer.tokenize_interpolated_string(DQ_initial_token_types)
|
287
|
-
end
|
288
|
-
|
289
|
-
|
290
|
-
# LBRACE needs look ahead to differentiate between '{' and a '{'
|
291
|
-
# followed by a '|' (start of lambda) The racc grammar can only do one
|
292
|
-
# token lookahead.
|
293
|
-
#
|
294
|
-
TOKENS.add_token :LBRACE, "{" do |lexer, value|
|
295
|
-
lexer.lexing_context[:brace_count] += 1
|
296
|
-
if lexer.lexing_context[:after] == :QMARK
|
297
|
-
[TOKENS[:SELBRACE], value]
|
298
|
-
else
|
299
|
-
[TOKENS[:LBRACE], value]
|
300
|
-
end
|
301
|
-
end
|
302
|
-
|
303
|
-
# RBRACE needs to differentiate between a regular brace that is part of
|
304
|
-
# syntax and one that is the ending of a string interpolation.
|
305
|
-
TOKENS.add_token :RBRACE, "}" do |lexer, value|
|
306
|
-
context = lexer.lexing_context
|
307
|
-
if context[:interpolation_stack].empty? || context[:brace_count] != context[:interpolation_stack][-1]
|
308
|
-
context[:brace_count] -= 1
|
309
|
-
[TOKENS[:RBRACE], value]
|
310
|
-
else
|
311
|
-
lexer.tokenize_interpolated_string(DQ_continuation_token_types)
|
312
|
-
end
|
313
|
-
end
|
314
|
-
|
315
|
-
TOKENS.add_token :DOLLAR_VAR, %r{\$(::)?(\w+::)*\w+} do |lexer, value|
|
316
|
-
[TOKENS[:VARIABLE],value[1..-1]]
|
317
|
-
end
|
318
|
-
|
319
|
-
TOKENS.add_token :VARIABLE, %r{(::)?(\w+::)*\w+} do |lexer, value|
|
320
|
-
# If the varname (following $, or ${ is followed by (, it is a function call, and not a variable
|
321
|
-
# reference.
|
322
|
-
#
|
323
|
-
if lexer.match?(%r{[ \t\r]*\(})
|
324
|
-
# followed by ( is a function call
|
325
|
-
[TOKENS[:NAME], value]
|
326
|
-
|
327
|
-
elsif kwd_token = KEYWORDS.lookup(value)
|
328
|
-
# true, false, if, unless, case, and undef are keywords that cannot be used as variables
|
329
|
-
# but node, and several others are variables
|
330
|
-
if [ :TRUE, :FALSE ].include?(kwd_token.name)
|
331
|
-
[ TOKENS[:BOOLEAN], eval(value) ]
|
332
|
-
elsif [ :IF, :UNLESS, :CASE, :UNDEF ].include?(kwd_token.name)
|
333
|
-
[kwd_token, value]
|
334
|
-
else
|
335
|
-
[TOKENS[:VARIABLE], value]
|
336
|
-
end
|
337
|
-
else
|
338
|
-
[TOKENS[:VARIABLE], value]
|
339
|
-
end
|
340
|
-
|
341
|
-
end
|
342
|
-
TOKENS[:VARIABLE].acceptable_when Contextual::INSIDE_QUOTES
|
343
|
-
|
344
|
-
TOKENS.sort_tokens
|
345
|
-
|
346
|
-
@@pairs = {
|
347
|
-
"{" => "}",
|
348
|
-
"(" => ")",
|
349
|
-
"[" => "]",
|
350
|
-
"<|" => "|>",
|
351
|
-
"<<|" => "|>>",
|
352
|
-
"|" => "|"
|
353
|
-
}
|
354
|
-
|
355
|
-
KEYWORDS = TokenList.new
|
356
|
-
KEYWORDS.add_tokens(
|
357
|
-
"case" => :CASE,
|
358
|
-
"class" => :CLASS,
|
359
|
-
"default" => :DEFAULT,
|
360
|
-
"define" => :DEFINE,
|
361
|
-
# "import" => :IMPORT,
|
362
|
-
"if" => :IF,
|
363
|
-
"elsif" => :ELSIF,
|
364
|
-
"else" => :ELSE,
|
365
|
-
"inherits" => :INHERITS,
|
366
|
-
"node" => :NODE,
|
367
|
-
"and" => :AND,
|
368
|
-
"or" => :OR,
|
369
|
-
"undef" => :UNDEF,
|
370
|
-
"false" => :FALSE,
|
371
|
-
"true" => :TRUE,
|
372
|
-
"in" => :IN,
|
373
|
-
"unless" => :UNLESS
|
374
|
-
)
|
375
|
-
|
376
|
-
def clear
|
377
|
-
initvars
|
378
|
-
end
|
379
|
-
|
380
|
-
def expected
|
381
|
-
return nil if @expected.empty?
|
382
|
-
name = @expected[-1]
|
383
|
-
TOKENS.lookup(name) or lex_error "Internal Lexer Error: Could not find expected token #{name}"
|
384
|
-
end
|
385
|
-
|
386
|
-
# scan the whole file
|
387
|
-
# basically just used for testing
|
388
|
-
def fullscan
|
389
|
-
array = []
|
390
|
-
|
391
|
-
self.scan { |token, str|
|
392
|
-
# Ignore any definition nesting problems
|
393
|
-
@indefine = false
|
394
|
-
array.push([token,str])
|
395
|
-
}
|
396
|
-
array
|
397
|
-
end
|
398
|
-
|
399
|
-
def file=(file)
|
400
|
-
@file = file
|
401
|
-
contents = Puppet::FileSystem.exist?(file) ? Puppet::FileSystem.read(file) : ""
|
402
|
-
@scanner = StringScanner.new(contents.freeze)
|
403
|
-
@locator = Puppet::Pops::Parser::Locator.locator(contents, file)
|
404
|
-
end
|
405
|
-
|
406
|
-
def_delegator :@token_queue, :shift, :shift_token
|
407
|
-
|
408
|
-
def find_string_token
|
409
|
-
# We know our longest string token is three chars, so try each size in turn
|
410
|
-
# until we either match or run out of chars. This way our worst-case is three
|
411
|
-
# tries, where it is otherwise the number of string token we have. Also,
|
412
|
-
# the lookups are optimized hash lookups, instead of regex scans.
|
413
|
-
#
|
414
|
-
_scn = @scanner
|
415
|
-
s = _scn.peek(3)
|
416
|
-
token = TOKENS.lookup(s[0,3]) || TOKENS.lookup(s[0,2]) || TOKENS.lookup(s[0,1])
|
417
|
-
unless token
|
418
|
-
return [nil, nil]
|
419
|
-
end
|
420
|
-
[ token, _scn.scan(token.regex) ]
|
421
|
-
end
|
422
|
-
|
423
|
-
# Find the next token that matches a regex. We look for these first.
|
424
|
-
def find_regex_token
|
425
|
-
best_token = nil
|
426
|
-
best_length = 0
|
427
|
-
|
428
|
-
# I tried optimizing based on the first char, but it had
|
429
|
-
# a slightly negative affect and was a good bit more complicated.
|
430
|
-
_lxc = @lexing_context
|
431
|
-
_scn = @scanner
|
432
|
-
TOKENS.regex_tokens.each do |token|
|
433
|
-
if length = _scn.match?(token.regex) and token.acceptable?(_lxc)
|
434
|
-
# We've found a longer match
|
435
|
-
if length > best_length
|
436
|
-
best_length = length
|
437
|
-
best_token = token
|
438
|
-
end
|
439
|
-
end
|
440
|
-
end
|
441
|
-
|
442
|
-
return best_token, _scn.scan(best_token.regex) if best_token
|
443
|
-
end
|
444
|
-
|
445
|
-
# Find the next token, returning the string and the token.
|
446
|
-
def find_token
|
447
|
-
shift_token || find_regex_token || find_string_token
|
448
|
-
end
|
449
|
-
|
450
|
-
MULTIBYTE = Puppet::Pops::Parser::Locator::MULTIBYTE
|
451
|
-
SKIPPATTERN = MULTIBYTE ? %r{[[:blank:]\r]+} : %r{[ \t\r]+}
|
452
|
-
|
453
|
-
def initialize
|
454
|
-
initvars
|
455
|
-
end
|
456
|
-
|
457
|
-
def assert_numeric(value)
|
458
|
-
if value =~ /^0[xX].*$/
|
459
|
-
lex_error (positioned_message("Not a valid hex number #{value}")) unless value =~ /^0[xX][0-9A-Fa-f]+$/
|
460
|
-
elsif value =~ /^0[^.].*$/
|
461
|
-
lex_error(positioned_message("Not a valid octal number #{value}")) unless value =~ /^0[0-7]+$/
|
462
|
-
else
|
463
|
-
lex_error(positioned_message("Not a valid decimal number #{value}")) unless value =~ /0?\d+(?:\.\d+)?(?:[eE]-?\d+)?/
|
464
|
-
end
|
465
|
-
end
|
466
|
-
|
467
|
-
def initvars
|
468
|
-
@previous_token = nil
|
469
|
-
@scanner = nil
|
470
|
-
@file = nil
|
471
|
-
|
472
|
-
# AAARRGGGG! okay, regexes in ruby are bloody annoying
|
473
|
-
# no one else has "\n" =~ /\s/
|
474
|
-
|
475
|
-
@namestack = []
|
476
|
-
@token_queue = []
|
477
|
-
@indefine = false
|
478
|
-
@expected = []
|
479
|
-
@lexing_context = {
|
480
|
-
:after => nil,
|
481
|
-
:start_of_line => true,
|
482
|
-
:offset => 0, # byte offset before where token starts
|
483
|
-
:end_offset => 0, # byte offset after scanned token
|
484
|
-
:brace_count => 0, # nested depth of braces
|
485
|
-
:interpolation_stack => [] # matching interpolation brace level
|
486
|
-
}
|
487
|
-
end
|
488
|
-
|
489
|
-
# Make any necessary changes to the token and/or value.
|
490
|
-
def munge_token(token, value)
|
491
|
-
# A token may already have been munged (converted and positioned)
|
492
|
-
#
|
493
|
-
return token, value if value.is_a? Hash
|
494
|
-
|
495
|
-
@scanner.skip(SKIPPATTERN) if token.skip_text
|
496
|
-
|
497
|
-
return if token.skip
|
498
|
-
|
499
|
-
token, value = token.convert(self, value) if token.respond_to?(:convert)
|
500
|
-
|
501
|
-
return unless token
|
502
|
-
|
503
|
-
return if token.skip
|
504
|
-
|
505
|
-
# If the conversion performed the munging/positioning
|
506
|
-
return token, value if value.is_a? Hash
|
507
|
-
|
508
|
-
return token, positioned_value(value)
|
509
|
-
end
|
510
|
-
|
511
|
-
# Returns a hash with the current position in source based on the current lexing context
|
512
|
-
#
|
513
|
-
def positioned_value(value)
|
514
|
-
{
|
515
|
-
:value => value,
|
516
|
-
:locator => @locator,
|
517
|
-
:offset => @lexing_context[:offset],
|
518
|
-
:end_offset => @lexing_context[:end_offset]
|
519
|
-
}
|
520
|
-
end
|
521
|
-
|
522
|
-
def pos
|
523
|
-
@locator.pos_on_line(@lexing_context[:offset])
|
524
|
-
end
|
525
|
-
|
526
|
-
# Handling the namespace stack
|
527
|
-
def_delegator :@namestack, :pop, :namepop
|
528
|
-
|
529
|
-
# This value might have :: in it, but we don't care -- it'll be handled
|
530
|
-
# normally when joining, and when popping we want to pop this full value,
|
531
|
-
# however long the namespace is.
|
532
|
-
def_delegator :@namestack, :<<, :namestack
|
533
|
-
|
534
|
-
# Collect the current namespace.
|
535
|
-
def namespace
|
536
|
-
@namestack.join("::")
|
537
|
-
end
|
538
|
-
|
539
|
-
def_delegator :@scanner, :rest
|
540
|
-
|
541
|
-
LBRACE_CHAR = '{'
|
542
|
-
|
543
|
-
# this is the heart of the lexer
|
544
|
-
def scan
|
545
|
-
_scn = @scanner
|
546
|
-
#Puppet.debug("entering scan")
|
547
|
-
lex_error "Internal Error: No string or file given to lexer to process." unless _scn
|
548
|
-
|
549
|
-
# Skip any initial whitespace.
|
550
|
-
_scn.skip(SKIPPATTERN)
|
551
|
-
_lbrace = '{'.freeze # faster to compare against a frozen string in
|
552
|
-
|
553
|
-
until token_queue.empty? and _scn.eos? do
|
554
|
-
offset = _scn.pos
|
555
|
-
matched_token, value = find_token
|
556
|
-
end_offset = _scn.pos
|
557
|
-
|
558
|
-
# error out if we didn't match anything at all
|
559
|
-
lex_error "Could not match #{_scn.rest[/^(\S+|\s+|.*)/]}" unless matched_token
|
560
|
-
|
561
|
-
newline = matched_token.name == :RETURN
|
562
|
-
|
563
|
-
_lxc = @lexing_context
|
564
|
-
_lxc[:start_of_line] = newline
|
565
|
-
_lxc[:offset] = offset
|
566
|
-
_lxc[:end_offset] = end_offset
|
567
|
-
|
568
|
-
final_token, token_value = munge_token(matched_token, value)
|
569
|
-
# update end position since munging may have moved the end offset
|
570
|
-
_lxc[:end_offset] = _scn.pos
|
571
|
-
|
572
|
-
unless final_token
|
573
|
-
_scn.skip(SKIPPATTERN)
|
574
|
-
next
|
575
|
-
end
|
576
|
-
|
577
|
-
_lxc[:after] = final_token.name unless newline
|
578
|
-
if final_token.name == :DQPRE
|
579
|
-
_lxc[:interpolation_stack] << _lxc[:brace_count]
|
580
|
-
elsif final_token.name == :DQPOST
|
581
|
-
_lxc[:interpolation_stack].pop
|
582
|
-
end
|
583
|
-
|
584
|
-
value = token_value[:value]
|
585
|
-
|
586
|
-
_expected = @expected
|
587
|
-
if match = @@pairs[value] and final_token.name != :DQUOTE and final_token.name != :SQUOTE
|
588
|
-
_expected << match
|
589
|
-
elsif exp = _expected[-1] and exp == value and final_token.name != :DQUOTE and final_token.name != :SQUOTE
|
590
|
-
_expected.pop
|
591
|
-
end
|
592
|
-
|
593
|
-
yield [final_token.name, token_value]
|
594
|
-
|
595
|
-
_prv = @previous_token
|
596
|
-
if _prv
|
597
|
-
namestack(value) if _prv.name == :CLASS and value != LBRACE_CHAR
|
598
|
-
|
599
|
-
# TODO: Lexer has no business dealing with this - it is semantic
|
600
|
-
if _prv.name == :DEFINE
|
601
|
-
if indefine?
|
602
|
-
msg = "Cannot nest definition #{value} inside #{@indefine}"
|
603
|
-
self.indefine = false
|
604
|
-
raise Puppet::ParseError, msg
|
605
|
-
end
|
606
|
-
|
607
|
-
@indefine = value
|
608
|
-
end
|
609
|
-
end
|
610
|
-
@previous_token = final_token
|
611
|
-
_scn.skip(SKIPPATTERN)
|
612
|
-
end
|
613
|
-
# Cannot reset @scanner to nil here - it is needed to answer questions about context after
|
614
|
-
# completed parsing.
|
615
|
-
# Seems meaningless to do this. Everything will be gc anyway.
|
616
|
-
#@scanner = nil
|
617
|
-
|
618
|
-
# This indicates that we're done parsing.
|
619
|
-
yield [false,false]
|
620
|
-
end
|
621
|
-
|
622
|
-
def match? r
|
623
|
-
@scanner.match?(r)
|
624
|
-
end
|
625
|
-
|
626
|
-
# Provide some limited access to the scanner, for those
|
627
|
-
# tokens that need it.
|
628
|
-
def_delegator :@scanner, :scan_until
|
629
|
-
|
630
|
-
# we've encountered the start of a string...
|
631
|
-
# slurp in the rest of the string and return it
|
632
|
-
def slurpstring(terminators,escapes=%w{ \\ $ ' " r n t s }+["\n"],ignore_invalid_escapes=false)
|
633
|
-
# we search for the next quote that isn't preceded by a
|
634
|
-
# backslash; the caret is there to match empty strings
|
635
|
-
last = @scanner.matched
|
636
|
-
str = @scanner.scan_until(/([^\\]|^|[^\\])([\\]{2})*[#{terminators}]/) || lex_error(positioned_message("Unclosed quote after #{format_quote(last)} followed by '#{followed_by}'"))
|
637
|
-
str.gsub!(/\\(.)/m) {
|
638
|
-
ch = $1
|
639
|
-
if escapes.include? ch
|
640
|
-
case ch
|
641
|
-
when 'r'; "\r"
|
642
|
-
when 'n'; "\n"
|
643
|
-
when 't'; "\t"
|
644
|
-
when 's'; " "
|
645
|
-
when "\n"; ''
|
646
|
-
else ch
|
647
|
-
end
|
648
|
-
else
|
649
|
-
Puppet.warning(positioned_message("Unrecognized escape sequence '\\#{ch}'")) unless ignore_invalid_escapes
|
650
|
-
"\\#{ch}"
|
651
|
-
end
|
652
|
-
}
|
653
|
-
[ str[0..-2],str[-1,1] ]
|
654
|
-
end
|
655
|
-
|
656
|
-
# Formats given message by appending file, line and position if available.
|
657
|
-
def positioned_message msg
|
658
|
-
result = [msg]
|
659
|
-
result << "in file #{file}" if file
|
660
|
-
result << "at line #{line}:#{pos}" if line
|
661
|
-
result.join(" ")
|
662
|
-
end
|
663
|
-
|
664
|
-
# Returns "<eof>" if at end of input, else the following 5 characters with \n \r \t escaped
|
665
|
-
def followed_by
|
666
|
-
return "<eof>" if @scanner.eos?
|
667
|
-
result = @scanner.rest[0,5] + "..."
|
668
|
-
result.gsub!("\t", '\t')
|
669
|
-
result.gsub!("\n", '\n')
|
670
|
-
result.gsub!("\r", '\r')
|
671
|
-
result
|
672
|
-
end
|
673
|
-
|
674
|
-
def format_quote q
|
675
|
-
if q == "'"
|
676
|
-
'"\'"'
|
677
|
-
else
|
678
|
-
"'#{q}'"
|
679
|
-
end
|
680
|
-
end
|
681
|
-
|
682
|
-
def tokenize_interpolated_string(token_type,preamble='')
|
683
|
-
# Expecting a (possibly empty) stretch of text terminated by end of string ", a variable $, or expression ${
|
684
|
-
# The length of this part includes the start and terminating characters.
|
685
|
-
value,terminator = slurpstring('"$')
|
686
|
-
|
687
|
-
# Advanced after '{' if this is in expression ${} interpolation
|
688
|
-
braced = terminator == '$' && @scanner.scan(/\{/)
|
689
|
-
# make offset to end_ofset be the length of the pre expression string including its start and terminating chars
|
690
|
-
lxc = @lexing_context
|
691
|
-
lxc[:end_offset] = @scanner.pos
|
692
|
-
|
693
|
-
token_queue << [TOKENS[token_type[terminator]],positioned_value(preamble+value)]
|
694
|
-
variable_regex = if Puppet[:allow_variables_with_dashes]
|
695
|
-
TOKENS[:VARIABLE_WITH_DASH].regex
|
696
|
-
else
|
697
|
-
TOKENS[:VARIABLE].regex
|
698
|
-
end
|
699
|
-
if terminator != '$' or braced
|
700
|
-
return token_queue.shift
|
701
|
-
end
|
702
|
-
|
703
|
-
tmp_offset = @scanner.pos
|
704
|
-
if var_name = @scanner.scan(variable_regex)
|
705
|
-
lxc[:offset] = tmp_offset
|
706
|
-
lxc[:end_offset] = @scanner.pos
|
707
|
-
warn_if_variable_has_hyphen(var_name)
|
708
|
-
# If the varname after ${ is followed by (, it is a function call, and not a variable
|
709
|
-
# reference.
|
710
|
-
#
|
711
|
-
if braced && @scanner.match?(%r{[ \t\r]*\(})
|
712
|
-
token_queue << [TOKENS[:NAME], positioned_value(var_name)]
|
713
|
-
else
|
714
|
-
token_queue << [TOKENS[:VARIABLE],positioned_value(var_name)]
|
715
|
-
end
|
716
|
-
lxc[:offset] = @scanner.pos
|
717
|
-
tokenize_interpolated_string(DQ_continuation_token_types)
|
718
|
-
else
|
719
|
-
tokenize_interpolated_string(token_type, replace_false_start_with_text(terminator))
|
720
|
-
end
|
721
|
-
end
|
722
|
-
|
723
|
-
def replace_false_start_with_text(appendix)
|
724
|
-
last_token = token_queue.pop
|
725
|
-
value = last_token.last
|
726
|
-
if value.is_a? Hash
|
727
|
-
value[:value] + appendix
|
728
|
-
else
|
729
|
-
value + appendix
|
730
|
-
end
|
731
|
-
end
|
732
|
-
|
733
|
-
# just parse a string, not a whole file
|
734
|
-
def string=(string, path='')
|
735
|
-
@scanner = StringScanner.new(string.freeze)
|
736
|
-
@locator = Puppet::Pops::Parser::Locator.locator(string, path)
|
737
|
-
end
|
738
|
-
|
739
|
-
def warn_if_variable_has_hyphen(var_name)
|
740
|
-
if var_name.include?('-')
|
741
|
-
Puppet.deprecation_warning("Using `-` in variable names is deprecated at #{file || '<string>'}:#{line}. See http://links.puppetlabs.com/puppet-hyphenated-variable-deprecation")
|
742
|
-
end
|
743
|
-
end
|
744
|
-
|
745
|
-
# Returns the line number (starting from 1) for the current position
|
746
|
-
# in the scanned text (at the end of the last produced, but not necessarily
|
747
|
-
# consumed.
|
748
|
-
#
|
749
|
-
def line
|
750
|
-
return 1 unless @lexing_context && locator
|
751
|
-
locator.line_for_offset(@lexing_context[:end_offset])
|
752
|
-
end
|
753
|
-
end
|