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
@@ -0,0 +1,83 @@
|
|
1
|
+
# RGen Framework
|
2
|
+
# (c) Martin Thiede, 2006
|
3
|
+
|
4
|
+
require 'rgen/template_language/template_container'
|
5
|
+
require 'rgen/template_language/template_helper'
|
6
|
+
|
7
|
+
module RGen
|
8
|
+
|
9
|
+
module TemplateLanguage
|
10
|
+
|
11
|
+
class DirectoryTemplateContainer
|
12
|
+
include TemplateHelper
|
13
|
+
|
14
|
+
def initialize(metamodel=nil, output_path=nil, parent=nil)
|
15
|
+
@containers = {}
|
16
|
+
@directoryContainers = {}
|
17
|
+
@parent = parent
|
18
|
+
@metamodel = metamodel
|
19
|
+
@output_path = output_path
|
20
|
+
end
|
21
|
+
|
22
|
+
def load(dir)
|
23
|
+
Dir.foreach(dir) { |f|
|
24
|
+
qf = dir+"/"+f
|
25
|
+
if !File.directory?(qf) && f =~ /^(.*)\.tpl$/
|
26
|
+
(@containers[$1] = TemplateContainer.new(@metamodel, @output_path, self,qf)).load
|
27
|
+
elsif File.directory?(qf) && f != "." && f != ".."
|
28
|
+
(@directoryContainers[f] = DirectoryTemplateContainer.new(@metamodel, @output_path, self)).load(qf)
|
29
|
+
end
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
def expand(template, *all_args)
|
34
|
+
if template =~ /^\//
|
35
|
+
if @parent
|
36
|
+
# pass to parent
|
37
|
+
@parent.expand(template, *all_args)
|
38
|
+
else
|
39
|
+
# this is root
|
40
|
+
_expand(template, *all_args)
|
41
|
+
end
|
42
|
+
elsif template =~ /^\.\.\/(.*)/
|
43
|
+
if @parent
|
44
|
+
# pass to parent
|
45
|
+
@parent.expand($1, *all_args)
|
46
|
+
else
|
47
|
+
raise "No parent directory for root"
|
48
|
+
end
|
49
|
+
else
|
50
|
+
_expand(template, *all_args)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Set indentation string.
|
55
|
+
# Every generated line will be prependend with n times this string at an indentation level of n.
|
56
|
+
# Defaults to " " (3 spaces)
|
57
|
+
def indentString=(str)
|
58
|
+
@indentString = str
|
59
|
+
end
|
60
|
+
|
61
|
+
def indentString
|
62
|
+
@indentString || (@parent && @parent.indentString) || " "
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def _expand(template, *all_args)
|
68
|
+
if template =~ /^\/?(\w+)::(\w.*)/
|
69
|
+
raise "Template not found: #{$1}" unless @containers[$1]
|
70
|
+
@containers[$1].expand($2, *all_args)
|
71
|
+
elsif template =~ /^\/?(\w+)\/(\w.*)/
|
72
|
+
raise "Template not found: #{$1}" unless @directoryContainers[$1]
|
73
|
+
@directoryContainers[$1].expand($2, *all_args)
|
74
|
+
else
|
75
|
+
raise "Invalid template name: #{template}"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# RGen Framework
|
2
|
+
# (c) Martin Thiede, 2006
|
3
|
+
|
4
|
+
module RGen
|
5
|
+
|
6
|
+
module TemplateLanguage
|
7
|
+
|
8
|
+
class OutputHandler
|
9
|
+
attr_writer :indent
|
10
|
+
attr_accessor :noIndentNextLine
|
11
|
+
|
12
|
+
def initialize(indent=0, indentString=" ", mode=:explicit)
|
13
|
+
self.mode = mode
|
14
|
+
@indent = indent
|
15
|
+
@indentString = indentString
|
16
|
+
@state = :wait_for_nonws
|
17
|
+
@output = ""
|
18
|
+
end
|
19
|
+
|
20
|
+
# ERB will call this method for every string s which is part of the
|
21
|
+
# template file in between %> and <%. If s contains a newline, it will
|
22
|
+
# call this method for every part of s which is terminated by a \n
|
23
|
+
#
|
24
|
+
def concat(s)
|
25
|
+
return @output.concat(s) if s.is_a? OutputHandler
|
26
|
+
#puts [object_id, noIndentNextLine, @state, @output.to_s, s].inspect
|
27
|
+
s = s.to_str.gsub(/^[\t ]*\r?\n/,'') if @ignoreNextNL
|
28
|
+
s = s.to_str.gsub(/^\s+/,'') if @ignoreNextWS
|
29
|
+
@ignoreNextNL = @ignoreNextWS = false if s =~ /\S/
|
30
|
+
if @mode == :direct
|
31
|
+
@output.concat(s)
|
32
|
+
elsif @mode == :explicit
|
33
|
+
while s.size > 0
|
34
|
+
if @state == :wait_for_nl
|
35
|
+
if s =~ /\A([^\r\n]*\r?\n)(.*)/m
|
36
|
+
rest = $2
|
37
|
+
@output.concat($1.gsub(/[\t ]+(?=\r|\n)/,''))
|
38
|
+
s = rest || ""
|
39
|
+
@state = :wait_for_nonws
|
40
|
+
else
|
41
|
+
@output.concat(s)
|
42
|
+
s = ""
|
43
|
+
end
|
44
|
+
elsif @state == :wait_for_nonws
|
45
|
+
if s =~ /\A\s*(\S+.*)/m
|
46
|
+
s = $1 || ""
|
47
|
+
if !@noIndentNextLine && !(@output.to_s.size > 0 && @output.to_s[-1] != "\n"[0])
|
48
|
+
@output.concat(@indentString * @indent)
|
49
|
+
else
|
50
|
+
@noIndentNextLine = false
|
51
|
+
end
|
52
|
+
@state = :wait_for_nl
|
53
|
+
else
|
54
|
+
s = ""
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
alias << concat
|
61
|
+
|
62
|
+
def to_str
|
63
|
+
@output
|
64
|
+
end
|
65
|
+
alias to_s to_str
|
66
|
+
|
67
|
+
def direct_concat(s)
|
68
|
+
@output.concat(s)
|
69
|
+
end
|
70
|
+
|
71
|
+
def ignoreNextNL
|
72
|
+
@ignoreNextNL = true
|
73
|
+
end
|
74
|
+
|
75
|
+
def ignoreNextWS
|
76
|
+
@ignoreNextWS = true
|
77
|
+
end
|
78
|
+
|
79
|
+
def mode=(m)
|
80
|
+
raise StandardError.new("Unknown mode: #{m}") unless [:direct, :explicit].include?(m)
|
81
|
+
@mode = m
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
@@ -0,0 +1,234 @@
|
|
1
|
+
# RGen Framework
|
2
|
+
# (c) Martin Thiede, 2006
|
3
|
+
|
4
|
+
require 'erb'
|
5
|
+
require 'fileutils'
|
6
|
+
require 'rgen/template_language/output_handler'
|
7
|
+
require 'rgen/template_language/template_helper'
|
8
|
+
|
9
|
+
module RGen
|
10
|
+
|
11
|
+
module TemplateLanguage
|
12
|
+
|
13
|
+
class TemplateContainer
|
14
|
+
include TemplateHelper
|
15
|
+
|
16
|
+
def initialize(metamodels, output_path, parent, filename)
|
17
|
+
@templates = {}
|
18
|
+
@parent = parent
|
19
|
+
@filename = filename
|
20
|
+
@indent = 0
|
21
|
+
@output_path = output_path
|
22
|
+
@metamodels = metamodels
|
23
|
+
@metamodels = [ @metamodels ] unless @metamodels.is_a?(Array)
|
24
|
+
end
|
25
|
+
|
26
|
+
def load
|
27
|
+
File.open(@filename,"rb") do |f|
|
28
|
+
begin
|
29
|
+
@@metamodels = @metamodels
|
30
|
+
fileContent = f.read
|
31
|
+
_detectNewLinePattern(fileContent)
|
32
|
+
ERB.new(fileContent,nil,nil,'@output').result(binding)
|
33
|
+
rescue Exception => e
|
34
|
+
processAndRaise(e)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def expand(template, *all_args)
|
40
|
+
args, params = _splitArgsAndOptions(all_args)
|
41
|
+
if params.has_key?(:foreach)
|
42
|
+
raise StandardError.new("expand :foreach argument is not enumerable") \
|
43
|
+
unless params[:foreach].is_a?(Enumerable)
|
44
|
+
_expand_foreach(template, args, params)
|
45
|
+
else
|
46
|
+
_expand(template, args, params)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def evaluate(template, *all_args)
|
51
|
+
args, params = _splitArgsAndOptions(all_args)
|
52
|
+
raise StandardError.new(":foreach can not be used with evaluate") if params[:foreach]
|
53
|
+
_expand(template, args, params.merge({:_evalOnly => true}))
|
54
|
+
end
|
55
|
+
|
56
|
+
def this
|
57
|
+
@context
|
58
|
+
end
|
59
|
+
|
60
|
+
def method_missing(name, *args)
|
61
|
+
@context.send(name, *args)
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.const_missing(name)
|
65
|
+
super unless @@metamodels
|
66
|
+
@@metamodels.each do |mm|
|
67
|
+
return mm.const_get(name) rescue NameError
|
68
|
+
end
|
69
|
+
super
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def nonl
|
75
|
+
@output.ignoreNextNL
|
76
|
+
end
|
77
|
+
|
78
|
+
def nows
|
79
|
+
@output.ignoreNextWS
|
80
|
+
end
|
81
|
+
|
82
|
+
def nl
|
83
|
+
_direct_concat(@newLinePattern)
|
84
|
+
end
|
85
|
+
|
86
|
+
def ws
|
87
|
+
_direct_concat(" ")
|
88
|
+
end
|
89
|
+
|
90
|
+
def iinc
|
91
|
+
@indent += 1
|
92
|
+
@output.indent = @indent
|
93
|
+
end
|
94
|
+
|
95
|
+
def idec
|
96
|
+
@indent -= 1 if @indent > 0
|
97
|
+
@output.indent = @indent
|
98
|
+
end
|
99
|
+
|
100
|
+
TemplateDesc = Struct.new(:block, :local)
|
101
|
+
|
102
|
+
def define(template, params={}, &block)
|
103
|
+
_define(template, params, &block)
|
104
|
+
end
|
105
|
+
|
106
|
+
def define_local(template, params={}, &block)
|
107
|
+
_define(template, params.merge({:local => true}), &block)
|
108
|
+
end
|
109
|
+
|
110
|
+
def file(name, indentString=nil)
|
111
|
+
old_output, @output = @output, OutputHandler.new(@indent, indentString || @parent.indentString)
|
112
|
+
begin
|
113
|
+
yield
|
114
|
+
rescue Exception => e
|
115
|
+
processAndRaise(e)
|
116
|
+
end
|
117
|
+
path = ""
|
118
|
+
path += @output_path+"/" if @output_path
|
119
|
+
dirname = File.dirname(path+name)
|
120
|
+
FileUtils.makedirs(dirname) unless File.exist?(dirname)
|
121
|
+
File.open(path+name,"wb") { |f| f.write(@output) }
|
122
|
+
@output = old_output
|
123
|
+
end
|
124
|
+
|
125
|
+
# private private
|
126
|
+
|
127
|
+
def _define(template, params={}, &block)
|
128
|
+
@templates[template] ||= {}
|
129
|
+
cls = params[:for] || Object
|
130
|
+
@templates[template][cls] = TemplateDesc.new(block, params[:local])
|
131
|
+
end
|
132
|
+
|
133
|
+
def _expand_foreach(template, args, params)
|
134
|
+
sep = params[:separator]
|
135
|
+
params[:foreach].each_with_index {|e,i|
|
136
|
+
_direct_concat(sep.to_s) if sep && i > 0
|
137
|
+
output = _expand(template, args, params.merge({:for => e}))
|
138
|
+
}
|
139
|
+
end
|
140
|
+
|
141
|
+
LOCAL_TEMPLATE_REGEX = /^:*(\w+)$/
|
142
|
+
|
143
|
+
def _expand(template, args, params)
|
144
|
+
raise StandardError.new("expand :for argument evaluates to nil") if params.has_key?(:for) && params[:for].nil?
|
145
|
+
context = params[:for]
|
146
|
+
old_indent = @indent
|
147
|
+
@indent = params[:indent] || @indent
|
148
|
+
noIndentNextLine = params[:_noIndentNextLine] ||
|
149
|
+
(@output.is_a?(OutputHandler) && @output.noIndentNextLine) ||
|
150
|
+
(@output.to_s.size > 0 && @output.to_s[-1] != "\n"[0])
|
151
|
+
caller = params[:_caller] || self
|
152
|
+
old_context, @context = @context, context if context
|
153
|
+
local_output = nil
|
154
|
+
if template =~ LOCAL_TEMPLATE_REGEX
|
155
|
+
tplname = $1
|
156
|
+
raise StandardError.new("Template not found: #{$1}") unless @templates[tplname]
|
157
|
+
old_output, @output = @output, OutputHandler.new(@indent, @parent.indentString)
|
158
|
+
@output.noIndentNextLine = noIndentNextLine
|
159
|
+
_call_template(tplname, @context, args, caller == self)
|
160
|
+
old_output.noIndentNextLine = false if old_output.is_a?(OutputHandler) && !old_output.noIndentNextLine
|
161
|
+
local_output, @output = @output, old_output
|
162
|
+
else
|
163
|
+
local_output = @parent.expand(template, *(args.dup << {:for => @context, :indent => @indent, :_noIndentNextLine => noIndentNextLine, :_evalOnly => true, :_caller => caller}))
|
164
|
+
end
|
165
|
+
_direct_concat(local_output) unless params[:_evalOnly]
|
166
|
+
@context = old_context if old_context
|
167
|
+
@indent = old_indent
|
168
|
+
local_output.to_s
|
169
|
+
end
|
170
|
+
|
171
|
+
def processAndRaise(e, tpl=nil)
|
172
|
+
bt = e.backtrace.dup
|
173
|
+
e.backtrace.each_with_index do |t,i|
|
174
|
+
if t =~ /\(erb\):(\d+):/
|
175
|
+
bt[i] = "#{@filename}:#{$1}"
|
176
|
+
bt[i] += ":in '#{tpl}'" if tpl
|
177
|
+
break
|
178
|
+
end
|
179
|
+
end
|
180
|
+
raise e, e.to_s, bt
|
181
|
+
end
|
182
|
+
|
183
|
+
def _call_template(tpl, context, args, localCall)
|
184
|
+
found = false
|
185
|
+
@templates[tpl].each_pair do |key, value|
|
186
|
+
if context.is_a?(key)
|
187
|
+
templateDesc = @templates[tpl][key]
|
188
|
+
proc = templateDesc.block
|
189
|
+
arity = proc.arity
|
190
|
+
arity = 0 if arity == -1 # if no args are given
|
191
|
+
raise StandardError.new("Wrong number of arguments calling template #{tpl}: #{args.size} for #{arity} "+
|
192
|
+
"(Beware: Hashes as last arguments are taken as options and are ignored)") \
|
193
|
+
if arity != args.size
|
194
|
+
raise StandardError.new("Template can only be called locally: #{tpl}") \
|
195
|
+
if templateDesc.local && !localCall
|
196
|
+
begin
|
197
|
+
@@metamodels = @metamodels
|
198
|
+
proc.call(*args)
|
199
|
+
rescue Exception => e
|
200
|
+
processAndRaise(e, tpl)
|
201
|
+
end
|
202
|
+
found = true
|
203
|
+
end
|
204
|
+
end
|
205
|
+
raise StandardError.new("Template class not matching: #{tpl} for #{context.class.name}") unless found
|
206
|
+
end
|
207
|
+
|
208
|
+
def _direct_concat(s)
|
209
|
+
if @output.is_a? OutputHandler
|
210
|
+
@output.direct_concat(s)
|
211
|
+
else
|
212
|
+
@output << s
|
213
|
+
end
|
214
|
+
end
|
215
|
|
216
|
+
def _detectNewLinePattern(text)
|
217
|
+
tests = 0
|
218
|
+
rnOccurances = 0
|
219
|
+
text.scan(/(\r?)\n/) do |groups|
|
220
|
+
tests += 1
|
221
|
+
rnOccurances += 1 if groups[0] == "\r"
|
222
|
+
break if tests >= 10
|
223
|
+
end
|
224
|
+
if rnOccurances > (tests / 2)
|
225
|
+
@newLinePattern = "\r\n"
|
226
|
+
else
|
227
|
+
@newLinePattern = "\n"
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
end
|
232
|
+
|
233
|
+
end
|
234
|
+
|
235
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# RGen Framework
|
2
|
+
# (c) Martin Thiede, 2006
|
3
|
+
|
4
|
+
module RGen
|
5
|
+
|
6
|
+
module TemplateLanguage
|
7
|
+
|
8
|
+
module TemplateHelper
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def _splitArgsAndOptions(all)
|
13
|
+
if all[-1] and all[-1].is_a? Hash
|
14
|
+
args = all[0..-2] || []
|
15
|
+
options = all[-1]
|
16
|
+
else
|
17
|
+
args = all
|
18
|
+
options = {}
|
19
|
+
end
|
20
|
+
return args, options
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,475 @@
|
|
1
|
+
require 'rgen/ecore/ecore'
|
2
|
+
require 'rgen/ecore/ecore_ext'
|
3
|
+
|
4
|
+
module RGen
|
5
|
+
|
6
|
+
# The Transformer class can be used to specify model transformations.
|
7
|
+
#
|
8
|
+
# Model transformations take place between a <i>source model</i> (located in the <i>source
|
9
|
+
# environment</i> being an instance of the <i>source metamodel</i>) and a <i>target model</i> (located
|
10
|
+
# in the <i>target environment</i> being an instance of the <i>target metamodel</i>).
|
11
|
+
# Normally a "model" consists of several model elements associated with each other.
|
12
|
+
#
|
13
|
+
# =Transformation Rules
|
14
|
+
#
|
15
|
+
# The transformation is specified within a subclass of Transformer.
|
16
|
+
# Within the subclass, the Transformer.transform class method can be used to specify transformation
|
17
|
+
# blocks for specific metamodel classes of the source metamodel.
|
18
|
+
#
|
19
|
+
# If there is no transformation rule for the current object's class, a rule for the superclass
|
20
|
+
# is used instead. If there's no rule for the superclass, the class hierarchy is searched
|
21
|
+
# this way until Object.
|
22
|
+
#
|
23
|
+
# Here is an example:
|
24
|
+
#
|
25
|
+
# class MyTransformer < RGen::Transformer
|
26
|
+
#
|
27
|
+
# transform InputClass, :to => OutputClass do
|
28
|
+
# { :name => name, :otherClass => trans(otherClass) }
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# transform OtherInputClass, :to => OtherOutputClass do
|
32
|
+
# { :name => name }
|
33
|
+
# end
|
34
|
+
# end
|
35
|
+
#
|
36
|
+
# In this example a transformation rule is specified for model elements of class InputClass
|
37
|
+
# as well as for elements of class OtherInputClass. The former is to be transformed into
|
38
|
+
# an instance of OutputClass, the latter into an instance of OtherOutputClass.
|
39
|
+
# Note that the Ruby class objects are used to specifiy the classes.
|
40
|
+
#
|
41
|
+
# =Transforming Attributes
|
42
|
+
#
|
43
|
+
# Besides the target class of a transformation, the attributes of the result object are
|
44
|
+
# specified in the above example. This is done by providing a Ruby block with the call of
|
45
|
+
# +transform+. Within this block arbitrary Ruby code may be placed, however the block
|
46
|
+
# must return a hash. This hash object specifies the attribute assignment of the
|
47
|
+
# result object using key/value pairs: The key must be a Symbol specifying the attribute
|
48
|
+
# which is to be assigned by name, the value is the value that will be assigned.
|
49
|
+
#
|
50
|
+
# For convenience, the transformation block will be evaluated in the context of the
|
51
|
+
# source model element which is currently being converted. This way it is possible to just
|
52
|
+
# write <code>:name => name</code> in the example in order to assign the name of the source
|
53
|
+
# object to the name attribute of the target object.
|
54
|
+
#
|
55
|
+
# =Transforming References
|
56
|
+
#
|
57
|
+
# When attributes of elements are references to other elements, those referenced
|
58
|
+
# elements have to be transformed as well. As shown above, this can be done by calling
|
59
|
+
# the Transformer#trans method. This method initiates a transformation of the element
|
60
|
+
# or array of elements passed as parameter according to transformation rules specified
|
61
|
+
# using +transform+. In fact the +trans+ method is the only way to start the transformation
|
62
|
+
# at all.
|
63
|
+
#
|
64
|
+
# For convenience and performance reasons, the result of +trans+ is cached with respect
|
65
|
+
# to the parameter object. I.e. calling trans on the same source object a second time will
|
66
|
+
# return the same result object _without_ a second evaluation of the corresponding
|
67
|
+
# transformation rules.
|
68
|
+
#
|
69
|
+
# This way the +trans+ method can be used to lookup the target element for some source
|
70
|
+
# element without the need to locally store a reference to the target element. In addition
|
71
|
+
# this can be useful if it is not clear if certain element has already been transformed
|
72
|
+
# when it is required within some other transformation block. See example below.
|
73
|
+
#
|
74
|
+
# Special care has been taken to allow the transformation of elements which reference
|
75
|
+
# each other cyclically. The key issue here is that the target element of some transformation
|
76
|
+
# is created _before_ the transformation's block is evaluated, i.e before the elements
|
77
|
+
# attributes are set. Otherwise a call to +trans+ within the transformation's block
|
78
|
+
# could lead to a +trans+ of the element itself.
|
79
|
+
#
|
80
|
+
# Here is an example:
|
81
|
+
#
|
82
|
+
# transform ModelAIn, :to => ModelAOut do
|
83
|
+
# { :name => name, :modelB => trans(modelB) }
|
84
|
+
# end
|
85
|
+
#
|
86
|
+
# transform ModelBIn, :to => ModelBOut do
|
87
|
+
# { :name => name, :modelA => trans(modelA) }
|
88
|
+
# end
|
89
|
+
#
|
90
|
+
# Note that in this case it does not matter if the transformation is initiated by calling
|
91
|
+
# +trans+ with a ModelAIn element or ModelBIn element due to the caching feature described
|
92
|
+
# above.
|
93
|
+
#
|
94
|
+
# =Transformer Methods
|
95
|
+
#
|
96
|
+
# When code in transformer blocks becomes more complex it might be useful to refactor
|
97
|
+
# it into smaller methods. If regular Ruby methods within the Transformer subclass are
|
98
|
+
# used for this purpose, it is necessary to know the source element being transformed.
|
99
|
+
# This could be achieved by explicitly passing the +@current_object+ as parameter of the
|
100
|
+
# method (see Transformer#trans).
|
101
|
+
#
|
102
|
+
# A more convenient way however is to define a special kind of method using the
|
103
|
+
# Transformer.method class method. Those methods are evaluated within the context of the
|
104
|
+
# current source element being transformed just the same as transformer blocks are.
|
105
|
+
#
|
106
|
+
# Here is an example:
|
107
|
+
#
|
108
|
+
# transform ModelIn, :to => ModelOut do
|
109
|
+
# { :number => doubleNumber }
|
110
|
+
# end
|
111
|
+
#
|
112
|
+
# method :doubleNumber do
|
113
|
+
# number * 2;
|
114
|
+
# end
|
115
|
+
#
|
116
|
+
# In this example the transformation assigns the 'number' attribute of the source element
|
117
|
+
# multiplied by 2 to the target element. The multiplication is done in a dedicated method
|
118
|
+
# called 'doubleNumber'. Note that the 'number' attribute of the source element is
|
119
|
+
# accessed without an explicit reference to the source element as the method's body
|
120
|
+
# evaluates in the source element's context.
|
121
|
+
#
|
122
|
+
# =Conditional Transformations
|
123
|
+
#
|
124
|
+
# Using the transformations as described above, all elements of the same class are
|
125
|
+
# transformed the same way. Conditional transformations allow to transform elements of
|
126
|
+
# the same class into elements of different target classes as well as applying different
|
127
|
+
# transformations on the attributes.
|
128
|
+
#
|
129
|
+
# Conditional transformations are defined by specifying multiple transformer blocks for
|
130
|
+
# the same source class and providing a condition with each block. Since it is important
|
131
|
+
# to create the target object before evaluation of the transformation block (see above),
|
132
|
+
# the conditions must also be evaluated separately _before_ the transformer block.
|
133
|
+
#
|
134
|
+
# Conditions are specified using transformer methods as described above. If the return
|
135
|
+
# value is true, the corresponding block is used for transformation. If more than one
|
136
|
+
# conditions are true, only the first transformer block will be evaluated.
|
137
|
+
#
|
138
|
+
# If there is no rule with a condition evaluating to true, rules for superclasses will
|
139
|
+
# be checked as described above.
|
140
|
+
#
|
141
|
+
# Here is an example:
|
142
|
+
#
|
143
|
+
# transform ModelIn, :to => ModelOut, :if => :largeNumber do
|
144
|
+
# { :number => number * 2}
|
145
|
+
# end
|
146
|
+
#
|
147
|
+
# transform ModelIn, :to => ModelOut, :if => :smallNumber do
|
148
|
+
# { :number => number / 2 }
|
149
|
+
# end
|
150
|
+
#
|
151
|
+
# method :largeNumber do
|
152
|
+
# number > 1000
|
153
|
+
# end
|
154
|
+
#
|
155
|
+
# method :smallNumber do
|
156
|
+
# number < 500
|
157
|
+
# end
|
158
|
+
#
|
159
|
+
# In this case the transformation of an element of class ModelIn depends on the value
|
160
|
+
# of the element's 'number' attribute. If the value is greater than 1000, the first rule
|
161
|
+
# as taken and the number is doubled. If the value is smaller than 500, the second rule
|
162
|
+
# is taken and the number is divided by two.
|
163
|
+
#
|
164
|
+
# Note that it is up to the user to avoid cycles within the conditions. A cycle could
|
165
|
+
# occure if the condition are based on transformation target elements, i.e. if +trans+
|
166
|
+
# is used within the condition to lookup or transform other elements.
|
167
|
+
#
|
168
|
+
# = Copy Transformations
|
169
|
+
#
|
170
|
+
# In some cases, transformations should just copy a model, either in the same metamodel
|
171
|
+
# or in another metamodel with the same package/class structure. Sometimes, a transformation
|
172
|
+
# is not exactly a copy, but a copy with slight modifications. Also in this case most
|
173
|
+
# classes need to be copied verbatim.
|
174
|
+
#
|
175
|
+
# The class method Transformer.copy can be used to specify a copy rule for a single
|
176
|
+
# metamodel class. If no target class is specified using the :to named parameter, the
|
177
|
+
# target class will be the same as the source class (i.e. in the same metamodel).
|
178
|
+
#
|
179
|
+
# copy MM1::ClassA # copy within the same metamodel
|
180
|
+
# copy MM1::ClassA, :to => MM2::ClassA
|
181
|
+
#
|
182
|
+
# The class method Transfomer.copy_all can be used to specify copy rules for all classes
|
183
|
+
# of a particular metamodel package. Again with :to, the target metamodel package may
|
184
|
+
# be specified which must have the same package/class structure. If :to is omitted, the
|
185
|
+
# target metamodel is the same as the source metamodel. In case that for some classes
|
186
|
+
# specific transformation rules should be used instead of copy rules, exceptions may be
|
187
|
+
# specified using the :except named parameter. +copy_all+ also provides an easy way to
|
188
|
+
# copy (clone) a model within the same metamodel.
|
189
|
+
#
|
190
|
+
# copy_all MM1 # copy rules for the whole metamodel MM1,
|
191
|
+
# # used to clone models of MM1
|
192
|
+
#
|
193
|
+
# copy_all MM1, :to => MM2, :except => %w( # copy rules for all classes of MM1 to
|
194
|
+
# ClassA # equally named classes in MM2, except
|
195
|
+
# Sub1::ClassB # "ClassA" and "Sub1::ClassB"
|
196
|
+
# )
|
197
|
+
#
|
198
|
+
# If a specific class transformation is not an exact copy, the Transformer.transform method
|
199
|
+
# should be used to actually specify the transformation. If this transformation is also
|
200
|
+
# mostly a copy, the helper method Transformer#copy_features can be used to create the
|
201
|
+
# transformation Hash required by the transform method. Any changes to this hash may be done
|
202
|
+
# in a hash returned by a block given to +copy_features+. This hash will extend or overwrite
|
203
|
+
# the default copy hash. In case a particular feature should not be part of the copy hash
|
204
|
+
# (e.g. because it does not exist in the target metamodel), exceptions can be specified using
|
205
|
+
# the :except named parameter. Here is an example:
|
206
|
+
#
|
207
|
+
# transform ClassA, :to => ClassAx do
|
208
|
+
# copy_features :except => [:featA] do
|
209
|
+
# { :featB => featA }
|
210
|
+
# end
|
211
|
+
# end
|
212
|
+
#
|
213
|
+
# In this example, ClassAx is a copy of ClassA except, that feature "featA" in ClassA is renamed
|
214
|
+
# into "featB" in ClassAx. Using +copy_features+ all features are copied except "featA". Then
|
215
|
+
# "featB" of the target class is assigned the value of "featA" of the source class.
|
216
|
+
#
|
217
|
+
class Transformer
|
218
|
+
|
219
|
+
TransformationDescription = Struct.new(:block, :target) # :nodoc:
|
220
|
+
|
221
|
+
@@methods = {}
|
222
|
+
@@transformer_blocks = {}
|
223
|
+
|
224
|
+
def self._transformer_blocks # :nodoc:
|
225
|
+
@@transformer_blocks[self] ||= {}
|
226
|
+
end
|
227
|
+
|
228
|
+
def self._methods # :nodoc:
|
229
|
+
@@methods[self] ||= {}
|
230
|
+
end
|
231
|
+
|
232
|
+
# This class method is used to specify a transformation rule.
|
233
|
+
#
|
234
|
+
# The first argument specifies the class of elements for which this rule applies.
|
235
|
+
# The second argument must be a hash including the target class
|
236
|
+
# (as value of key ':to') and an optional condition (as value of key ':if').
|
237
|
+
#
|
238
|
+
# The target class is specified by passing the actual Ruby class object.
|
239
|
+
# The condition is either the name of a transformer method (see Transfomer.method) as
|
240
|
+
# a symbol or a proc object. In either case the block is evaluated at transformation
|
241
|
+
# time and its result value determines if the rule applies.
|
242
|
+
#
|
243
|
+
def self.transform(from, desc=nil, &block)
|
244
|
+
to = (desc && desc.is_a?(Hash) && desc[:to])
|
245
|
+
condition = (desc && desc.is_a?(Hash) && desc[:if])
|
246
|
+
raise StandardError.new("No transformation target specified.") unless to
|
247
|
+
block_desc = TransformationDescription.new(block, to)
|
248
|
+
if condition
|
249
|
+
_transformer_blocks[from] ||= {}
|
250
|
+
raise StandardError.new("Multiple (non-conditional) transformations for class #{from.name}.") unless _transformer_blocks[from].is_a?(Hash)
|
251
|
+
_transformer_blocks[from][condition] = block_desc
|
252
|
+
else
|
253
|
+
raise StandardError.new("Multiple (non-conditional) transformations for class #{from.name}.") unless _transformer_blocks[from].nil?
|
254
|
+
_transformer_blocks[from] = block_desc
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
# This class method specifies that all objects of class +from+ are to be copied
|
259
|
+
# into an object of class +to+. If +to+ is omitted, +from+ is used as target class.
|
260
|
+
# The target class may also be specified using the :to => <class> hash notation.
|
261
|
+
# During copy, all attributes and references of the target object
|
262
|
+
# are set to their transformed counterparts of the source object.
|
263
|
+
#
|
264
|
+
def self.copy(from, to=nil)
|
265
|
+
raise StandardError.new("Specify target class either directly as second parameter or using :to => <class>") \
|
266
|
+
unless to.nil? || to.is_a?(Class) || (to.is_a?(Hash) && to[:to].is_a?(Class))
|
267
|
+
to = to[:to] if to.is_a?(Hash)
|
268
|
+
transform(from, :to => to || from) do
|
269
|
+
copy_features
|
270
|
+
end
|
271
|
+
end
|
272
|
+
|
273
|
+
# Create copy rules for all classes of metamodel package (module) +from+ and its subpackages.
|
274
|
+
# The target classes are the classes with the same name in the metamodel package
|
275
|
+
# specified using named parameter :to. If no target metamodel is specified, source
|
276
|
+
# and target classes will be the same.
|
277
|
+
# The named parameter :except can be used to specify classes by qualified name for which
|
278
|
+
# no copy rules should be created. Qualified names are relative to the metamodel package
|
279
|
+
# specified.
|
280
|
+
#
|
281
|
+
def self.copy_all(from, hash={})
|
282
|
+
to = hash[:to] || from
|
283
|
+
except = hash[:except]
|
284
|
+
fromDepth = from.ecore.qualifiedName.split("::").size
|
285
|
+
from.ecore.eAllClasses.each do |c|
|
286
|
+
path = c.qualifiedName.split("::")[fromDepth..-1]
|
287
|
+
next if except && except.include?(path.join("::"))
|
288
|
+
copy c.instanceClass, :to => path.inject(to){|m,c| m.const_get(c)}
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
# Define a transformer method for the current transformer class.
|
293
|
+
# In contrast to regular Ruby methods, a method defined this way executes in the
|
294
|
+
# context of the object currently being transformed.
|
295
|
+
#
|
296
|
+
def self.method(name, &block)
|
297
|
+
_methods[name.to_s] = block
|
298
|
+
end
|
299
|
+
|
300
|
+
|
301
|
+
# Creates a new transformer
|
302
|
+
# Optionally an input and output Environment can be specified.
|
303
|
+
# If an elementMap is provided (normally a Hash) this map will be used to lookup
|
304
|
+
# and store transformation results. This way results can be predefined
|
305
|
+
# and it is possible to have several transformers work on the same result map.
|
306
|
+
#
|
307
|
+
def initialize(env_in=nil, env_out=nil, elementMap=nil)
|
308
|
+
@env_in = env_in
|
309
|
+
@env_out = env_out
|
310
|
+
@transformer_results = elementMap || {}
|
311
|
+
@transformer_jobs = []
|
312
|
+
end
|
313
|
+
|
314
|
+
|
315
|
+
# Transforms a given model element according to the rules specified by means of
|
316
|
+
# the Transformer.transform class method.
|
317
|
+
#
|
318
|
+
# The transformation result element is created in the output environment and returned.
|
319
|
+
# In addition, the result is cached, i.e. a second invocation with the same parameter
|
320
|
+
# object will return the same result object without any further evaluation of the
|
321
|
+
# transformation rules. Nil will be transformed into nil. Ruby "singleton" objects
|
322
|
+
# +true+, +false+, numerics and symbols will be returned without any change. Ruby strings
|
323
|
+
# will be duplicated with the result being cached.
|
324
|
+
#
|
325
|
+
# The transformation input can be given as:
|
326
|
+
# * a single object
|
327
|
+
# * an array each element of which is transformed in turn
|
328
|
+
# * a hash used as input to Environment#find with the result being transformed
|
329
|
+
#
|
330
|
+
def trans(obj)
|
331
|
+
if obj.is_a?(Hash)
|
332
|
+
raise StandardError.new("No input environment available to find model element.") unless @env_in
|
333
|
+
obj = @env_in.find(obj)
|
334
|
+
end
|
335
|
+
return nil if obj.nil?
|
336
|
+
return obj if obj.is_a?(TrueClass) or obj.is_a?(FalseClass) or obj.is_a?(Numeric) or obj.is_a?(Symbol)
|
337
|
+
return @transformer_results[obj] if @transformer_results[obj]
|
338
|
+
return @transformer_results[obj] = obj.dup if obj.is_a?(String)
|
339
|
+
return obj.collect{|o| trans(o)}.compact if obj.is_a? Array
|
340
|
+
raise StandardError.new("No transformer for class #{obj.class.name}") unless _transformerBlock(obj.class)
|
341
|
+
block_desc = _evaluateCondition(obj)
|
342
|
+
return nil unless block_desc
|
343
|
+
@transformer_results[obj] = _instantiateTargetClass(obj, block_desc.target)
|
344
|
+
# we will transform the properties later
|
345
|
+
@transformer_jobs << TransformerJob.new(self, obj, block_desc)
|
346
|
+
# if there have been jobs in the queue before, don't process them in this call
|
347
|
+
# this way calls to trans are not nested; a recursive implementation
|
348
|
+
# may cause a "Stack level too deep" exception for large models
|
349
|
+
return @transformer_results[obj] if @transformer_jobs.size > 1
|
350
|
+
# otherwise this is the first call of trans, process all jobs here
|
351
|
+
# more jobs will be added during job execution
|
352
|
+
while @transformer_jobs.size > 0
|
353
|
+
@transformer_jobs.first.execute
|
354
|
+
@transformer_jobs.shift
|
355
|
+
end
|
356
|
+
@transformer_results[obj]
|
357
|
+
end
|
358
|
+
|
359
|
+
# Create the hash required as return value of the block given to the Transformer.transform method.
|
360
|
+
# The hash will assign feature values of the source class to the features of the target class,
|
361
|
+
# assuming the features of both classes are the same. If the :except named parameter specifies
|
362
|
+
# an Array of symbols, the listed features are not copied by the hash. In order to easily manipulate
|
363
|
+
# the resulting hash, a block may be given which should also return a feature assignmet hash. This
|
364
|
+
# hash should be created manually and will extend/overwrite the automatically created hash.
|
365
|
+
#
|
366
|
+
def copy_features(options={})
|
367
|
+
hash = {}
|
368
|
+
@current_object.class.ecore.eAllStructuralFeatures.each do |f|
|
369
|
+
next if f.derived
|
370
|
+
next if options[:except] && options[:except].include?(f.name.to_sym)
|
371
|
+
hash[f.name.to_sym] = trans(@current_object.send(f.name))
|
372
|
+
end
|
373
|
+
hash.merge!(yield) if block_given?
|
374
|
+
hash
|
375
|
+
end
|
376
|
+
|
377
|
+
def _transformProperties(obj, block_desc) #:nodoc:
|
378
|
+
old_object, @current_object = @current_object, obj
|
379
|
+
block_result = instance_eval(&block_desc.block)
|
380
|
+
raise StandardError.new("Transformer must return a hash") unless block_result.is_a? Hash
|
381
|
+
@current_object = old_object
|
382
|
+
_attributesFromHash(@transformer_results[obj], block_result)
|
383
|
+
end
|
384
|
+
|
385
|
+
class TransformerJob #:nodoc:
|
386
|
+
def initialize(transformer, obj, block_desc)
|
387
|
+
@transformer, @obj, @block_desc = transformer, obj, block_desc
|
388
|
+
end
|
389
|
+
def execute
|
390
|
+
@transformer._transformProperties(@obj, @block_desc)
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
394
|
+
# Each call which is not handled by the transformer object is passed to the object
|
395
|
+
# currently being transformed.
|
396
|
+
# If that object also does not respond to the call, it is treated as a transformer
|
397
|
+
# method call (see Transformer.method).
|
398
|
+
#
|
399
|
+
def method_missing(m, *args) #:nodoc:
|
400
|
+
if @current_object.respond_to?(m)
|
401
|
+
@current_object.send(m, *args)
|
402
|
+
else
|
403
|
+
_invokeMethod(m, *args)
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
private
|
408
|
+
|
409
|
+
# returns _transformer_blocks content for clazz or one of its superclasses
|
410
|
+
def _transformerBlock(clazz) # :nodoc:
|
411
|
+
block = self.class._transformer_blocks[clazz]
|
412
|
+
block = _transformerBlock(clazz.superclass) if block.nil? && clazz != Object
|
413
|
+
block
|
414
|
+
end
|
415
|
+
|
416
|
+
# returns the first TransformationDescription for clazz or one of its superclasses
|
417
|
+
# for which condition is true
|
418
|
+
def _evaluateCondition(obj, clazz=obj.class) # :nodoc:
|
419
|
+
tb = self.class._transformer_blocks[clazz]
|
420
|
+
block_description = nil
|
421
|
+
if tb.is_a?(TransformationDescription)
|
422
|
+
# non-conditional
|
423
|
+
block_description = tb
|
424
|
+
elsif tb
|
425
|
+
old_object, @current_object = @current_object, obj
|
426
|
+
tb.each_pair {|condition, block|
|
427
|
+
if condition.is_a?(Proc)
|
428
|
+
result = instance_eval(&condition)
|
429
|
+
elsif condition.is_a?(Symbol)
|
430
|
+
result = _invokeMethod(condition)
|
431
|
+
else
|
432
|
+
result = condition
|
433
|
+
end
|
434
|
+
if result
|
435
|
+
block_description = block
|
436
|
+
break
|
437
|
+
end
|
438
|
+
}
|
439
|
+
@current_object = old_object
|
440
|
+
end
|
441
|
+
block_description = _evaluateCondition(obj, clazz.superclass) if block_description.nil? && clazz != Object
|
442
|
+
block_description
|
443
|
+
end
|
444
|
+
|
445
|
+
def _instantiateTargetClass(obj, target_desc) # :nodoc:
|
446
|
+
old_object, @current_object = @current_object, obj
|
447
|
+
if target_desc.is_a?(Proc)
|
448
|
+
target_class = instance_eval(&target_desc)
|
449
|
+
elsif target_desc.is_a?(Symbol)
|
450
|
+
target_class = _invokeMethod(target_desc)
|
451
|
+
else
|
452
|
+
target_class = target_desc
|
453
|
+
end
|
454
|
+
@current_object = old_object
|
455
|
+
result = target_class.new
|
456
|
+
@env_out << result if @env_out
|
457
|
+
result
|
458
|
+
end
|
459
|
+
|
460
|
+
def _invokeMethod(m) # :nodoc:
|
461
|
+
raise StandardError.new("Method not found: #{m}") unless self.class._methods[m.to_s]
|
462
|
+
instance_eval(&self.class._methods[m.to_s])
|
463
|
+
end
|
464
|
+
|
465
|
+
def _attributesFromHash(obj, hash) # :nodoc:
|
466
|
+
hash.delete(:class)
|
467
|
+
hash.each_pair{|k,v|
|
468
|
+
obj.send("#{k}=", v)
|
469
|
+
}
|
470
|
+
obj
|
471
|
+
end
|
472
|
+
|
473
|
+
end
|
474
|
+
|
475
|
+
end
|