puppet 3.1.1 → 3.2.0.rc1
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.
- data/CONTRIBUTING.md +2 -2
- data/Gemfile +32 -19
- data/README_DEVELOPER.md +332 -14
- data/Rakefile +9 -5
- data/ext/build_defaults.yaml +2 -3
- data/ext/debian/changelog.erb +6 -0
- data/ext/debian/control +6 -6
- data/ext/envpuppet +4 -4
- data/ext/project_data.yaml +1 -0
- data/ext/puppet-nm-dispatcher +13 -0
- data/ext/redhat/puppet.spec.erb +17 -0
- data/ext/suse/client.init +1 -1
- data/ext/systemd/puppetagent.service +2 -2
- data/ext/systemd/puppetmaster.service +2 -2
- data/lib/hiera/scope.rb +29 -11
- data/lib/hiera_puppet.rb +1 -3
- data/lib/puppet/agent.rb +3 -3
- data/lib/puppet/application.rb +2 -2
- data/lib/puppet/application/agent.rb +27 -12
- data/lib/puppet/application/apply.rb +11 -1
- data/lib/puppet/application/describe.rb +1 -1
- data/lib/puppet/application/doc.rb +13 -9
- data/lib/puppet/application/filebucket.rb +0 -1
- data/lib/puppet/application/kick.rb +1 -0
- data/lib/puppet/application/master.rb +16 -8
- data/lib/puppet/daemon.rb +19 -64
- data/lib/puppet/defaults.rb +61 -5
- data/lib/puppet/error.rb +15 -4
- data/lib/puppet/external/nagios/grammar.ry +1 -1
- data/lib/puppet/external/nagios/makefile +1 -1
- data/lib/puppet/external/nagios/parser.rb +185 -618
- data/lib/puppet/external/pson/pure/parser.rb +47 -1
- data/lib/puppet/face/certificate.rb +3 -3
- data/lib/puppet/face/module.rb +1 -1
- data/lib/puppet/face/module/changes.rb +3 -1
- data/lib/puppet/face/module/uninstall.rb +1 -1
- data/lib/puppet/face/node/clean.rb +5 -5
- data/lib/puppet/feature/base.rb +3 -1
- data/lib/puppet/feature/libuser.rb +8 -0
- data/lib/puppet/file_serving/fileset.rb +9 -1
- data/lib/puppet/forge.rb +28 -5
- data/lib/puppet/forge/errors.rb +34 -0
- data/lib/puppet/forge/repository.rb +1 -1
- data/lib/puppet/indirector.rb +4 -1
- data/lib/puppet/indirector/catalog/compiler.rb +37 -30
- data/lib/puppet/indirector/facts/inventory_active_record.rb +1 -0
- data/lib/puppet/indirector/indirection.rb +28 -15
- data/lib/puppet/indirector/rest.rb +18 -10
- data/lib/puppet/interface.rb +11 -4
- data/lib/puppet/interface/action.rb +1 -3
- data/lib/puppet/interface/action_builder.rb +0 -3
- data/lib/puppet/interface/action_manager.rb +0 -3
- data/lib/puppet/interface/face_collection.rb +0 -2
- data/lib/puppet/interface/option.rb +0 -2
- data/lib/puppet/interface/option_builder.rb +0 -2
- data/lib/puppet/interface/option_manager.rb +0 -2
- data/lib/puppet/metatype/manager.rb +1 -1
- data/lib/puppet/module_tool.rb +1 -0
- data/lib/puppet/module_tool/applications/application.rb +0 -3
- data/lib/puppet/module_tool/applications/builder.rb +8 -20
- data/lib/puppet/module_tool/applications/checksummer.rb +1 -1
- data/lib/puppet/module_tool/applications/installer.rb +1 -0
- data/lib/puppet/module_tool/applications/unpacker.rb +3 -11
- data/lib/puppet/module_tool/checksums.rb +1 -1
- data/lib/puppet/module_tool/errors/installer.rb +18 -1
- data/lib/puppet/module_tool/modulefile.rb +2 -2
- data/lib/puppet/module_tool/skeleton/templates/generator/Modulefile.erb +1 -1
- data/lib/puppet/module_tool/tar.rb +17 -0
- data/lib/puppet/module_tool/tar/gnu.rb +9 -0
- data/lib/puppet/module_tool/tar/mini.rb +39 -0
- data/lib/puppet/module_tool/tar/solaris.rb +5 -0
- data/lib/puppet/network/http.rb +1 -0
- data/lib/puppet/network/http/connection.rb +9 -23
- data/lib/puppet/network/http/handler.rb +38 -7
- data/lib/puppet/network/http/rack/rest.rb +14 -3
- data/lib/puppet/network/http/webrick.rb +3 -1
- data/lib/puppet/network/http/webrick/rest.rb +11 -2
- data/lib/puppet/node/environment.rb +3 -1
- data/lib/puppet/parameter.rb +32 -29
- data/lib/puppet/parameter/package_options.rb +1 -1
- data/lib/puppet/parameter/path.rb +1 -1
- data/lib/puppet/parameter/value.rb +1 -1
- data/lib/puppet/parameter/value_collection.rb +7 -3
- data/lib/puppet/parser/ast.rb +3 -1
- data/lib/puppet/parser/ast/arithmetic_operator.rb +56 -12
- data/lib/puppet/parser/ast/astarray.rb +1 -1
- data/lib/puppet/parser/ast/block_expression.rb +41 -0
- data/lib/puppet/parser/ast/function.rb +13 -2
- data/lib/puppet/parser/ast/lambda.rb +107 -0
- data/lib/puppet/parser/ast/leaf.rb +1 -2
- data/lib/puppet/parser/ast/method_call.rb +77 -0
- data/lib/puppet/parser/ast/vardef.rb +7 -0
- data/lib/puppet/parser/compiler.rb +27 -16
- data/lib/puppet/parser/e_parser_adapter.rb +120 -0
- data/lib/puppet/parser/files.rb +7 -6
- data/lib/puppet/parser/functions.rb +10 -8
- data/lib/puppet/parser/functions/collect.rb +43 -0
- data/lib/puppet/parser/functions/each.rb +96 -0
- data/lib/puppet/parser/functions/foreach.rb +96 -0
- data/lib/puppet/parser/functions/fqdn_rand.rb +2 -2
- data/lib/puppet/parser/functions/hiera.rb +20 -2
- data/lib/puppet/parser/functions/hiera_array.rb +21 -2
- data/lib/puppet/parser/functions/hiera_hash.rb +23 -2
- data/lib/puppet/parser/functions/hiera_include.rb +33 -2
- data/lib/puppet/parser/functions/inline_template.rb +4 -4
- data/lib/puppet/parser/functions/reduce.rb +74 -0
- data/lib/puppet/parser/functions/reject.rb +46 -0
- data/lib/puppet/parser/functions/select.rb +46 -0
- data/lib/puppet/parser/functions/slice.rb +96 -0
- data/lib/puppet/parser/functions/template.rb +2 -2
- data/lib/puppet/parser/grammar.ra +7 -4
- data/lib/puppet/parser/lexer.rb +10 -0
- data/lib/puppet/parser/methods.rb +69 -0
- data/lib/puppet/parser/parser.rb +855 -808
- data/lib/puppet/parser/parser_factory.rb +62 -0
- data/lib/puppet/parser/parser_support.rb +8 -2
- data/lib/puppet/parser/scope.rb +153 -47
- data/lib/puppet/parser/templatewrapper.rb +28 -21
- data/lib/puppet/parser/type_loader.rb +3 -1
- data/lib/puppet/pops.rb +40 -0
- data/lib/puppet/pops/adaptable.rb +190 -0
- data/lib/puppet/pops/adapters.rb +65 -0
- data/lib/puppet/pops/containment.rb +37 -0
- data/lib/puppet/pops/issues.rb +258 -0
- data/lib/puppet/pops/label_provider.rb +71 -0
- data/lib/puppet/pops/model/ast_transformer.rb +636 -0
- data/lib/puppet/pops/model/ast_tree_dumper.rb +378 -0
- data/lib/puppet/pops/model/factory.rb +804 -0
- data/lib/puppet/pops/model/model.rb +567 -0
- data/lib/puppet/pops/model/model_label_provider.rb +75 -0
- data/lib/puppet/pops/model/model_tree_dumper.rb +352 -0
- data/lib/puppet/pops/model/tree_dumper.rb +59 -0
- data/lib/puppet/pops/parser/egrammar.ra +723 -0
- data/lib/puppet/pops/parser/eparser.rb +2300 -0
- data/lib/puppet/pops/parser/grammar.ra +746 -0
- data/lib/puppet/pops/parser/lexer.rb +842 -0
- data/lib/puppet/pops/parser/makefile +13 -0
- data/lib/puppet/pops/parser/parser_support.rb +203 -0
- data/lib/puppet/pops/patterns.rb +35 -0
- data/lib/puppet/pops/utils.rb +104 -0
- data/lib/puppet/pops/validation.rb +297 -0
- data/lib/puppet/pops/validation/checker3_1.rb +551 -0
- data/lib/puppet/pops/validation/validator_factory_3_1.rb +41 -0
- data/lib/puppet/pops/visitable.rb +6 -0
- data/lib/puppet/pops/visitor.rb +50 -0
- data/lib/puppet/property.rb +37 -28
- data/lib/puppet/property/ensure.rb +2 -2
- data/lib/puppet/property/ordered_list.rb +1 -1
- data/lib/puppet/provider.rb +26 -30
- data/lib/puppet/provider/aixobject.rb +45 -44
- data/lib/puppet/provider/augeas/augeas.rb +0 -1
- data/lib/puppet/provider/confiner.rb +1 -1
- data/lib/puppet/provider/cron/crontab.rb +107 -67
- data/lib/puppet/provider/group/groupadd.rb +59 -3
- data/lib/puppet/provider/interface/cisco.rb +4 -4
- data/lib/puppet/provider/mount/parsed.rb +1 -1
- data/lib/puppet/provider/nameservice.rb +22 -6
- data/lib/puppet/provider/nameservice/pw.rb +1 -1
- data/lib/puppet/provider/package/aix.rb +28 -4
- data/lib/puppet/provider/package/gem.rb +0 -2
- data/lib/puppet/provider/package/macports.rb +1 -1
- data/lib/puppet/provider/package/nim.rb +249 -4
- data/lib/puppet/provider/package/opkg.rb +77 -0
- data/lib/puppet/provider/package/pacman.rb +2 -2
- data/lib/puppet/provider/package/rpm.rb +30 -16
- data/lib/puppet/provider/package/yum.rb +3 -3
- data/lib/puppet/provider/parsedfile.rb +80 -3
- data/lib/puppet/provider/selmodule/semodule.rb +2 -2
- data/lib/puppet/provider/service/debian.rb +0 -4
- data/lib/puppet/provider/service/freebsd.rb +2 -2
- data/lib/puppet/provider/service/gentoo.rb +0 -9
- data/lib/puppet/provider/service/init.rb +27 -2
- data/lib/puppet/provider/service/launchd.rb +1 -1
- data/lib/puppet/provider/service/openwrt.rb +36 -0
- data/lib/puppet/provider/service/redhat.rb +0 -9
- data/lib/puppet/provider/service/src.rb +38 -4
- data/lib/puppet/provider/service/systemd.rb +2 -2
- data/lib/puppet/provider/service/upstart.rb +1 -8
- data/lib/puppet/provider/user/aix.rb +4 -10
- data/lib/puppet/provider/user/pw.rb +6 -10
- data/lib/puppet/provider/user/useradd.rb +129 -31
- data/lib/puppet/provider/vlan/cisco.rb +4 -4
- data/lib/puppet/reference/function.rb +2 -2
- data/lib/puppet/reference/indirection.rb +46 -5
- data/lib/puppet/reference/metaparameter.rb +2 -2
- data/lib/puppet/reports.rb +5 -5
- data/lib/puppet/reports/rrdgraph.rb +4 -4
- data/lib/puppet/reports/tagmail.rb +1 -1
- data/lib/puppet/resource.rb +1 -1
- data/lib/puppet/resource/type.rb +13 -11
- data/lib/puppet/scheduler.rb +16 -0
- data/lib/puppet/scheduler/job.rb +53 -0
- data/lib/puppet/scheduler/scheduler.rb +45 -0
- data/lib/puppet/scheduler/splay_job.rb +32 -0
- data/lib/puppet/scheduler/timer.rb +13 -0
- data/lib/puppet/settings/base_setting.rb +1 -1
- data/lib/puppet/simple_graph.rb +4 -4
- data/lib/puppet/ssl/base.rb +12 -2
- data/lib/puppet/ssl/certificate.rb +4 -1
- data/lib/puppet/ssl/certificate_request.rb +4 -1
- data/lib/puppet/ssl/certificate_revocation_list.rb +4 -1
- data/lib/puppet/ssl/configuration.rb +32 -0
- data/lib/puppet/ssl/host.rb +18 -21
- data/lib/puppet/ssl/key.rb +4 -1
- data/lib/puppet/ssl/validator.rb +116 -0
- data/lib/puppet/transaction.rb +1 -1
- data/lib/puppet/transaction/event.rb +3 -10
- data/lib/puppet/transaction/event_manager.rb +8 -1
- data/lib/puppet/transaction/report.rb +17 -16
- data/lib/puppet/type.rb +77 -69
- data/lib/puppet/type/cron.rb +20 -8
- data/lib/puppet/type/exec.rb +9 -3
- data/lib/puppet/type/file.rb +95 -21
- data/lib/puppet/type/file/content.rb +1 -1
- data/lib/puppet/type/file/mode.rb +7 -1
- data/lib/puppet/type/file/source.rb +2 -2
- data/lib/puppet/type/group.rb +11 -0
- data/lib/puppet/type/scheduled_task.rb +5 -1
- data/lib/puppet/type/service.rb +1 -1
- data/lib/puppet/type/ssh_authorized_key.rb +2 -2
- data/lib/puppet/type/user.rb +24 -6
- data/lib/puppet/util.rb +12 -2
- data/lib/puppet/util/classgen.rb +4 -4
- data/lib/puppet/util/colors.rb +55 -0
- data/lib/puppet/util/command_line/trollop.rb +4 -4
- data/lib/puppet/util/errors.rb +39 -3
- data/lib/puppet/util/fileparsing.rb +5 -0
- data/lib/puppet/util/filetype.rb +11 -9
- data/lib/puppet/util/instrumentation/instrumentable.rb +2 -2
- data/lib/puppet/util/libuser.conf +15 -0
- data/lib/puppet/util/libuser.rb +12 -0
- data/lib/puppet/util/monkey_patches.rb +48 -0
- data/lib/puppet/util/network_device.rb +1 -1
- data/lib/puppet/util/network_device/base.rb +2 -2
- data/lib/puppet/util/network_device/cisco/device.rb +29 -19
- data/lib/puppet/util/network_device/config.rb +5 -2
- data/lib/puppet/util/network_device/ipcalc.rb +1 -1
- data/lib/puppet/util/network_device/transport/ssh.rb +4 -3
- data/lib/puppet/util/network_device/transport/telnet.rb +4 -2
- data/lib/puppet/util/plugins.rb +4 -4
- data/lib/puppet/util/posix.rb +1 -1
- data/lib/puppet/util/profiler.rb +28 -0
- data/lib/puppet/util/profiler/logging.rb +47 -0
- data/lib/puppet/util/profiler/none.rb +8 -0
- data/lib/puppet/util/profiler/object_counts.rb +17 -0
- data/lib/puppet/util/profiler/wall_clock.rb +34 -0
- data/lib/puppet/util/provider_features.rb +1 -1
- data/lib/puppet/util/rdoc/parser.rb +5 -5
- data/lib/puppet/util/ssl.rb +38 -0
- data/lib/puppet/util/subclass_loader.rb +1 -5
- data/lib/puppet/util/windows.rb +1 -0
- data/lib/puppet/util/windows/process.rb +3 -0
- data/lib/puppet/util/windows/root_certs.rb +86 -0
- data/lib/puppet/util/windows/security.rb +1 -0
- data/lib/puppet/version.rb +1 -1
- data/spec/fixtures/integration/provider/cron/crontab/create_normal_entry +19 -0
- data/spec/fixtures/integration/provider/cron/crontab/create_special_entry +18 -0
- data/spec/fixtures/integration/provider/cron/crontab/crontab_user1 +15 -0
- data/spec/fixtures/integration/provider/cron/crontab/crontab_user2 +4 -0
- data/spec/fixtures/integration/provider/cron/crontab/modify_entry +13 -0
- data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input1 +15 -0
- data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input2 +6 -0
- data/spec/fixtures/integration/provider/cron/crontab/remove_named_resource +12 -0
- data/spec/fixtures/integration/provider/cron/crontab/remove_unnamed_resource +14 -0
- data/spec/fixtures/unit/pops/parser/lexer/aliastest.pp +16 -0
- data/spec/fixtures/unit/pops/parser/lexer/append.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/argumentdefaults.pp +14 -0
- data/spec/fixtures/unit/pops/parser/lexer/arithmetic_expression.pp +8 -0
- data/spec/fixtures/unit/pops/parser/lexer/arraytrailingcomma.pp +3 -0
- data/spec/fixtures/unit/pops/parser/lexer/casestatement.pp +65 -0
- data/spec/fixtures/unit/pops/parser/lexer/classheirarchy.pp +15 -0
- data/spec/fixtures/unit/pops/parser/lexer/classincludes.pp +17 -0
- data/spec/fixtures/unit/pops/parser/lexer/classpathtest.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/collection.pp +10 -0
- data/spec/fixtures/unit/pops/parser/lexer/collection_override.pp +8 -0
- data/spec/fixtures/unit/pops/parser/lexer/collection_within_virtual_definitions.pp +20 -0
- data/spec/fixtures/unit/pops/parser/lexer/componentmetaparams.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/componentrequire.pp +8 -0
- data/spec/fixtures/unit/pops/parser/lexer/deepclassheirarchy.pp +23 -0
- data/spec/fixtures/unit/pops/parser/lexer/defineoverrides.pp +17 -0
- data/spec/fixtures/unit/pops/parser/lexer/emptyclass.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/emptyexec.pp +3 -0
- data/spec/fixtures/unit/pops/parser/lexer/emptyifelse.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/falsevalues.pp +3 -0
- data/spec/fixtures/unit/pops/parser/lexer/filecreate.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/fqdefinition.pp +5 -0
- data/spec/fixtures/unit/pops/parser/lexer/fqparents.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/funccomma.pp +5 -0
- data/spec/fixtures/unit/pops/parser/lexer/hash.pp +33 -0
- data/spec/fixtures/unit/pops/parser/lexer/ifexpression.pp +12 -0
- data/spec/fixtures/unit/pops/parser/lexer/implicititeration.pp +15 -0
- data/spec/fixtures/unit/pops/parser/lexer/multilinecomments.pp +10 -0
- data/spec/fixtures/unit/pops/parser/lexer/multipleclass.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/multipleinstances.pp +7 -0
- data/spec/fixtures/unit/pops/parser/lexer/multisubs.pp +13 -0
- data/spec/fixtures/unit/pops/parser/lexer/namevartest.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/scopetest.pp +13 -0
- data/spec/fixtures/unit/pops/parser/lexer/selectorvalues.pp +49 -0
- data/spec/fixtures/unit/pops/parser/lexer/simpledefaults.pp +5 -0
- data/spec/fixtures/unit/pops/parser/lexer/simpleselector.pp +38 -0
- data/spec/fixtures/unit/pops/parser/lexer/singleary.pp +19 -0
- data/spec/fixtures/unit/pops/parser/lexer/singlequote.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/singleselector.pp +22 -0
- data/spec/fixtures/unit/pops/parser/lexer/subclass_name_duplication.pp +11 -0
- data/spec/fixtures/unit/pops/parser/lexer/tag.pp +9 -0
- data/spec/fixtures/unit/pops/parser/lexer/tagged.pp +35 -0
- data/spec/fixtures/unit/pops/parser/lexer/virtualresources.pp +14 -0
- data/spec/fixtures/unit/provider/cron/crontab/single_line.yaml +4 -4
- data/spec/fixtures/unit/provider/cron/crontab/vixie_header.txt +3 -0
- data/spec/fixtures/unit/provider/cron/parsed/managed +6 -0
- data/spec/fixtures/unit/provider/cron/parsed/simple +9 -0
- data/spec/fixtures/unit/provider/parsedfile/simple.txt +4 -0
- data/spec/fixtures/unit/provider/service/systemd/list_units +18 -0
- data/spec/integration/parser/collector_spec.rb +1 -1
- data/spec/integration/parser/compiler_spec.rb +252 -227
- data/spec/integration/parser/parser_spec.rb +171 -53
- data/spec/integration/parser/scope_spec.rb +1 -1
- data/spec/integration/provider/cron/crontab_spec.rb +187 -0
- data/spec/integration/provider/service/systemd_spec.rb +20 -0
- data/spec/integration/type/file_spec.rb +21 -21
- data/spec/integration/type/package_spec.rb +1 -1
- data/spec/lib/puppet_spec/database.rb +2 -5
- data/spec/spec_helper.rb +6 -1
- data/spec/unit/application/apply_spec.rb +16 -1
- data/spec/unit/application/describe_spec.rb +1 -1
- data/spec/unit/application/doc_spec.rb +55 -32
- data/spec/unit/application/kick_spec.rb +8 -6
- data/spec/unit/application/master_spec.rb +4 -4
- data/spec/unit/daemon_spec.rb +1 -1
- data/spec/unit/forge/errors_spec.rb +40 -0
- data/spec/unit/forge/repository_spec.rb +11 -1
- data/spec/unit/forge_spec.rb +13 -3
- data/spec/unit/hiera/backend/puppet_backend_spec.rb +1 -0
- data/spec/unit/hiera/scope_spec.rb +48 -25
- data/spec/unit/indirector/catalog/active_record_spec.rb +6 -3
- data/spec/unit/indirector/catalog/compiler_spec.rb +3 -28
- data/spec/unit/indirector/catalog/static_compiler_spec.rb +1 -1
- data/spec/unit/indirector/facts/inventory_active_record_spec.rb +154 -150
- data/spec/unit/indirector/indirection_spec.rb +5 -0
- data/spec/unit/indirector/resource/active_record_spec.rb +5 -22
- data/spec/unit/indirector_spec.rb +7 -1
- data/spec/unit/interface/action_builder_spec.rb +1 -1
- data/spec/unit/interface/action_manager_spec.rb +0 -2
- data/spec/unit/interface/action_spec.rb +1 -1
- data/spec/unit/interface/documentation_spec.rb +0 -2
- data/spec/unit/interface/face_collection_spec.rb +1 -1
- data/spec/unit/interface/option_builder_spec.rb +1 -1
- data/spec/unit/interface/option_spec.rb +0 -1
- data/spec/unit/module_spec.rb +17 -19
- data/spec/unit/module_tool/application_spec.rb +1 -3
- data/spec/unit/module_tool/applications/builder_spec.rb +38 -0
- data/spec/unit/module_tool/applications/checksummer_spec.rb +134 -0
- data/spec/unit/module_tool/applications/installer_spec.rb +71 -91
- data/spec/unit/module_tool/applications/searcher_spec.rb +1 -3
- data/spec/unit/module_tool/applications/uninstaller_spec.rb +18 -26
- data/spec/unit/module_tool/applications/unpacker_spec.rb +19 -52
- data/spec/unit/module_tool/tar/gnu_spec.rb +19 -0
- data/spec/unit/module_tool/tar/mini_spec.rb +59 -0
- data/spec/unit/module_tool/tar/solaris_spec.rb +19 -0
- data/spec/unit/network/http/connection_spec.rb +17 -2
- data/spec/unit/network/http/handler_spec.rb +195 -167
- data/spec/unit/network/http/rack/rest_spec.rb +26 -4
- data/spec/unit/network/http/webrick/rest_spec.rb +28 -1
- data/spec/unit/network/http/webrick_spec.rb +12 -3
- data/spec/unit/node/environment_spec.rb +421 -404
- data/spec/unit/parser/ast/arithmetic_operator_spec.rb +98 -2
- data/spec/unit/parser/collector_spec.rb +4 -4
- data/spec/unit/parser/compiler_spec.rb +13 -13
- data/spec/unit/parser/eparser_adapter_spec.rb +407 -0
- data/spec/unit/parser/functions/extlookup_spec.rb +20 -17
- data/spec/unit/parser/functions/fqdn_rand_spec.rb +5 -0
- data/spec/unit/parser/functions/hiera_include_spec.rb +0 -2
- data/spec/unit/parser/functions/hiera_spec.rb +0 -2
- data/spec/unit/parser/functions_spec.rb +27 -15
- data/spec/unit/parser/methods/collect_spec.rb +110 -0
- data/spec/unit/parser/methods/each_spec.rb +91 -0
- data/spec/unit/parser/methods/foreach_spec.rb +91 -0
- data/spec/unit/parser/methods/reduce_spec.rb +67 -0
- data/spec/unit/parser/methods/reject_spec.rb +73 -0
- data/spec/unit/parser/methods/select_spec.rb +79 -0
- data/spec/unit/parser/methods/shared.rb +61 -0
- data/spec/unit/parser/methods/slice_spec.rb +97 -0
- data/spec/unit/parser/parser_spec.rb +2 -2
- data/spec/unit/parser/scope_spec.rb +39 -16
- data/spec/unit/parser/templatewrapper_spec.rb +6 -5
- data/spec/unit/parser/type_loader_spec.rb +191 -165
- data/spec/unit/pops/adaptable_spec.rb +143 -0
- data/spec/unit/pops/containment_spec.rb +25 -0
- data/spec/unit/pops/factory_rspec_helper.rb +77 -0
- data/spec/unit/pops/factory_spec.rb +329 -0
- data/spec/unit/pops/issues_spec.rb +26 -0
- data/spec/unit/pops/label_provider_spec.rb +42 -0
- data/spec/unit/pops/model/ast_transformer_spec.rb +65 -0
- data/spec/unit/pops/model/model_spec.rb +37 -0
- data/spec/unit/pops/parser/lexer_spec.rb +884 -0
- data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +248 -0
- data/spec/unit/pops/parser/parse_calls_spec.rb +93 -0
- data/spec/unit/pops/parser/parse_conditionals_spec.rb +159 -0
- data/spec/unit/pops/parser/parse_containers_spec.rb +175 -0
- data/spec/unit/pops/parser/parse_resource_spec.rb +228 -0
- data/spec/unit/pops/parser/parser_rspec_helper.rb +11 -0
- data/spec/unit/pops/parser/parser_spec.rb +15 -0
- data/spec/unit/pops/parser/rgen_sanitycheck_spec.rb +16 -0
- data/spec/unit/pops/transformer/transform_basic_expressions_spec.rb +243 -0
- data/spec/unit/pops/transformer/transform_calls_spec.rb +80 -0
- data/spec/unit/pops/transformer/transform_conditionals_spec.rb +132 -0
- data/spec/unit/pops/transformer/transform_containers_spec.rb +182 -0
- data/spec/unit/pops/transformer/transform_resource_spec.rb +185 -0
- data/spec/unit/pops/transformer/transformer_rspec_helper.rb +27 -0
- data/spec/unit/pops/visitor_spec.rb +94 -0
- data/spec/unit/property_spec.rb +11 -0
- data/spec/unit/provider/augeas/augeas_spec.rb +3 -0
- data/spec/unit/provider/cron/crontab_spec.rb +97 -7
- data/spec/unit/provider/cron/parsed_spec.rb +325 -0
- data/spec/unit/provider/exec/posix_spec.rb +1 -1
- data/spec/unit/provider/group/groupadd_spec.rb +33 -3
- data/spec/unit/provider/group/pw_spec.rb +5 -5
- data/spec/unit/provider/nameservice_spec.rb +304 -0
- data/spec/unit/provider/package/aix_spec.rb +53 -11
- data/spec/unit/provider/package/aptrpm_spec.rb +6 -0
- data/spec/unit/provider/package/gem_spec.rb +6 -11
- data/spec/unit/provider/package/nim_spec.rb +216 -7
- data/spec/unit/provider/package/opkg_spec.rb +180 -0
- data/spec/unit/provider/package/rpm_spec.rb +149 -3
- data/spec/unit/provider/package/yum_spec.rb +6 -5
- data/spec/unit/provider/parsedfile_spec.rb +122 -28
- data/spec/unit/provider/service/freebsd_spec.rb +18 -0
- data/spec/unit/provider/service/init_spec.rb +108 -87
- data/spec/unit/provider/service/launchd_spec.rb +2 -2
- data/spec/unit/provider/service/openwrt_spec.rb +109 -0
- data/spec/unit/provider/service/src_spec.rb +117 -41
- data/spec/unit/provider/service/systemd_spec.rb +125 -17
- data/spec/unit/provider/service/upstart_spec.rb +1 -1
- data/spec/unit/provider/user/aix_spec.rb +42 -0
- data/spec/unit/provider/user/directoryservice_spec.rb +1 -0
- data/spec/unit/provider/user/pw_spec.rb +24 -12
- data/spec/unit/provider/user/user_role_add_spec.rb +1 -1
- data/spec/unit/provider/user/useradd_spec.rb +179 -15
- data/spec/unit/resource/type_spec.rb +3 -3
- data/spec/unit/scheduler/job_spec.rb +79 -0
- data/spec/unit/scheduler/scheduler_spec.rb +129 -0
- data/spec/unit/scheduler/splay_job_spec.rb +35 -0
- data/spec/unit/ssl/base_spec.rb +3 -9
- data/spec/unit/ssl/certificate_authority_spec.rb +1 -0
- data/spec/unit/ssl/certificate_request_spec.rb +3 -1
- data/spec/unit/ssl/certificate_spec.rb +3 -1
- data/spec/unit/ssl/configuration_spec.rb +74 -0
- data/spec/unit/ssl/host_spec.rb +28 -7
- data/spec/unit/ssl/validator_spec.rb +311 -0
- data/spec/unit/transaction/event_manager_spec.rb +49 -0
- data/spec/unit/transaction/event_spec.rb +20 -5
- data/spec/unit/transaction/report_spec.rb +8 -0
- data/spec/unit/type/cron_spec.rb +9 -0
- data/spec/unit/type/exec_spec.rb +11 -0
- data/spec/unit/type/file/content_spec.rb +20 -20
- data/spec/unit/type/file/mode_spec.rb +6 -0
- data/spec/unit/type/file/source_spec.rb +9 -7
- data/spec/unit/type/file_spec.rb +22 -3
- data/spec/unit/type/service_spec.rb +34 -21
- data/spec/unit/type_spec.rb +46 -1
- data/spec/unit/util/backups_spec.rb +2 -2
- data/spec/unit/util/execution_spec.rb +4 -1
- data/spec/unit/util/filetype_spec.rb +6 -0
- data/spec/unit/util/monkey_patches_spec.rb +18 -0
- data/spec/unit/util/network_device/cisco/device_spec.rb +37 -0
- data/spec/unit/util/network_device/config_spec.rb +14 -0
- data/spec/unit/util/network_device_spec.rb +3 -3
- data/spec/unit/util/profiler/logging_spec.rb +81 -0
- data/spec/unit/util/profiler/none_spec.rb +12 -0
- data/spec/unit/util/profiler/object_counts_spec.rb +14 -0
- data/spec/unit/util/profiler/wall_clock_spec.rb +13 -0
- data/spec/unit/util/pson_spec.rb +5 -0
- data/spec/unit/util/ssl_spec.rb +51 -0
- data/spec/unit/util/windows/root_certs_spec.rb +15 -0
- data/spec/unit/util_spec.rb +28 -0
- metadata +2593 -2307
- data/spec/unit/module_tool/applications/application_spec.rb +0 -19
@@ -0,0 +1,378 @@
|
|
1
|
+
require 'puppet/parser/ast'
|
2
|
+
|
3
|
+
# Dumps a Pops::Model in reverse polish notation; i.e. LISP style
|
4
|
+
# The intention is to use this for debugging output
|
5
|
+
# TODO: BAD NAME - A DUMP is a Ruby Serialization
|
6
|
+
#
|
7
|
+
class Puppet::Pops::Model::AstTreeDumper < Puppet::Pops::Model::TreeDumper
|
8
|
+
AST = Puppet::Parser::AST
|
9
|
+
Model = Puppet::Pops::Model
|
10
|
+
|
11
|
+
def dump_LiteralNumber o
|
12
|
+
case o.radix
|
13
|
+
when 10
|
14
|
+
o.value.to_s
|
15
|
+
when 8
|
16
|
+
"0%o" % o.value
|
17
|
+
when 16
|
18
|
+
"0x%X" % o.value
|
19
|
+
else
|
20
|
+
"bad radix:" + o.value.to_s
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def dump_Factory o
|
25
|
+
do_dump(o.current)
|
26
|
+
end
|
27
|
+
|
28
|
+
def dump_ArithmeticOperator o
|
29
|
+
[o.operator.to_s, do_dump(o.lval), do_dump(o.rval)]
|
30
|
+
end
|
31
|
+
def dump_Relationship o
|
32
|
+
[o.arrow.to_s, do_dump(o.left), do_dump(o.right)]
|
33
|
+
end
|
34
|
+
|
35
|
+
# Hostname is tricky, it is either a bare word, a string, or default, or regular expression
|
36
|
+
# Least evil, all strings except default are quoted
|
37
|
+
def dump_HostName o
|
38
|
+
result = do_dump o.value
|
39
|
+
unless o.value.is_a? AST::Regex
|
40
|
+
result = result == "default" ? ":default" : "'#{result}'"
|
41
|
+
end
|
42
|
+
result
|
43
|
+
end
|
44
|
+
|
45
|
+
# x[y] prints as (slice x y)
|
46
|
+
def dump_HashOrArrayAccess o
|
47
|
+
var = o.variable.is_a?(String) ? "$#{o.variable}" : do_dump(o.variable)
|
48
|
+
["slice", var, do_dump(o.key)]
|
49
|
+
end
|
50
|
+
|
51
|
+
# The AST Collection knows about exported or virtual query, not the query.
|
52
|
+
def dump_Collection o
|
53
|
+
result = ["collect", do_dump(o.type), :indent, :break]
|
54
|
+
if o.form == :virtual
|
55
|
+
q = ["<| |>"]
|
56
|
+
else
|
57
|
+
q = ["<<| |>>"]
|
58
|
+
end
|
59
|
+
q << do_dump(o.query) unless is_nop?(o.query)
|
60
|
+
q << :indent
|
61
|
+
result << q
|
62
|
+
o.override do |ao|
|
63
|
+
result << :break << do_dump(ao)
|
64
|
+
end
|
65
|
+
result += [:dedent, :dedent ]
|
66
|
+
result
|
67
|
+
end
|
68
|
+
|
69
|
+
def dump_CollExpr o
|
70
|
+
operator = case o.oper
|
71
|
+
when 'and'
|
72
|
+
'&&'
|
73
|
+
when 'or'
|
74
|
+
'||'
|
75
|
+
else
|
76
|
+
o.oper
|
77
|
+
end
|
78
|
+
[operator, do_dump(o.test1), do_dump(o.test2)]
|
79
|
+
end
|
80
|
+
|
81
|
+
def dump_ComparisonOperator o
|
82
|
+
[o.operator.to_s, do_dump(o.lval), do_dump(o.rval)]
|
83
|
+
end
|
84
|
+
|
85
|
+
def dump_Boolean o
|
86
|
+
o.to_s
|
87
|
+
end
|
88
|
+
|
89
|
+
def dump_BooleanOperator o
|
90
|
+
operator = o.operator == 'and' ? '&&' : '||'
|
91
|
+
[operator, do_dump(o.lval), do_dump(o.rval)]
|
92
|
+
end
|
93
|
+
|
94
|
+
def dump_InOperator o
|
95
|
+
["in", do_dump(o.lval), do_dump(o.rval)]
|
96
|
+
end
|
97
|
+
|
98
|
+
# $x = ...
|
99
|
+
# $x += ...
|
100
|
+
#
|
101
|
+
def dump_VarDef o
|
102
|
+
operator = o.append ? "+=" : "="
|
103
|
+
[operator, '$' + do_dump(o.name), do_dump(o.value)]
|
104
|
+
end
|
105
|
+
|
106
|
+
# Produces (name => expr) or (name +> expr)
|
107
|
+
def dump_ResourceParam o
|
108
|
+
operator = o.add ? "+>" : "=>"
|
109
|
+
[do_dump(o.param), operator, do_dump(o.value)]
|
110
|
+
end
|
111
|
+
|
112
|
+
def dump_Array o
|
113
|
+
o.collect {|e| do_dump(e) }
|
114
|
+
end
|
115
|
+
|
116
|
+
def dump_ASTArray o
|
117
|
+
["[]"] + o.children.collect {|x| do_dump(x)}
|
118
|
+
end
|
119
|
+
|
120
|
+
def dump_ASTHash o
|
121
|
+
["{}"] + o.value.sort_by{|k,v| k.to_s}.collect {|x| [do_dump(x[0]), do_dump(x[1])]}
|
122
|
+
# ["{}"] + o.value.collect {|x| [do_dump(x[0]), do_dump(x[1])]}
|
123
|
+
end
|
124
|
+
|
125
|
+
def dump_MatchOperator o
|
126
|
+
[o.operator.to_s, do_dump(o.lval), do_dump(o.rval)]
|
127
|
+
end
|
128
|
+
|
129
|
+
# Dump a Ruby String in single quotes unless it is a number.
|
130
|
+
def dump_String o
|
131
|
+
|
132
|
+
if o.is_a? String
|
133
|
+
o # A Ruby String, not quoted
|
134
|
+
elsif n = Puppet::Pops::Utils.to_n(o.value)
|
135
|
+
o.value # AST::String that is a number without quotes
|
136
|
+
else
|
137
|
+
"'#{o.value}'" # AST::String that is not a number
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def dump_Lambda o
|
142
|
+
result = ["lambda"]
|
143
|
+
result << ["parameters"] + o.parameters.collect {|p| _dump_ParameterArray(p) } if o.parameters.size() > 0
|
144
|
+
if o.children == []
|
145
|
+
result << [] # does not have a lambda body
|
146
|
+
else
|
147
|
+
result << do_dump(o.children)
|
148
|
+
end
|
149
|
+
result
|
150
|
+
end
|
151
|
+
|
152
|
+
def dump_Default o
|
153
|
+
":default"
|
154
|
+
end
|
155
|
+
|
156
|
+
def dump_Undef o
|
157
|
+
":undef"
|
158
|
+
end
|
159
|
+
|
160
|
+
# Note this is Regex (the AST kind), not Ruby Regexp
|
161
|
+
def dump_Regex o
|
162
|
+
"/#{o.value.source}/"
|
163
|
+
end
|
164
|
+
|
165
|
+
def dump_Nop o
|
166
|
+
":nop"
|
167
|
+
end
|
168
|
+
|
169
|
+
def dump_NilClass o
|
170
|
+
"()"
|
171
|
+
end
|
172
|
+
|
173
|
+
def dump_Not o
|
174
|
+
['!', dump(o.value)]
|
175
|
+
end
|
176
|
+
|
177
|
+
def dump_Variable o
|
178
|
+
"$#{dump(o.value)}"
|
179
|
+
end
|
180
|
+
|
181
|
+
def dump_Minus o
|
182
|
+
['-', do_dump(o.value)]
|
183
|
+
end
|
184
|
+
|
185
|
+
def dump_BlockExpression o
|
186
|
+
["block"] + o.children.collect {|x| do_dump(x) }
|
187
|
+
end
|
188
|
+
|
189
|
+
# Interpolated strings are shown as (cat seg0 seg1 ... segN)
|
190
|
+
def dump_Concat o
|
191
|
+
["cat"] + o.value.collect {|x| x.is_a?(AST::String) ? " "+do_dump(x) : ["str", do_dump(x)]}
|
192
|
+
end
|
193
|
+
|
194
|
+
def dump_Hostclass o
|
195
|
+
# ok, this is kind of crazy stuff in the AST, information in a context instead of in AST, and
|
196
|
+
# parameters are in a Ruby Array with each parameter being an Array...
|
197
|
+
#
|
198
|
+
context = o.context
|
199
|
+
args = context[:arguments]
|
200
|
+
parent = context[:parent]
|
201
|
+
result = ["class", o.name]
|
202
|
+
result << ["inherits", parent] if parent
|
203
|
+
result << ["parameters"] + args.collect {|p| _dump_ParameterArray(p) } if args && args.size() > 0
|
204
|
+
if is_nop?(o.code)
|
205
|
+
result << []
|
206
|
+
else
|
207
|
+
result << do_dump(o.code)
|
208
|
+
end
|
209
|
+
result
|
210
|
+
end
|
211
|
+
|
212
|
+
def dump_Name o
|
213
|
+
o.value
|
214
|
+
end
|
215
|
+
|
216
|
+
def dump_Node o
|
217
|
+
context = o.context
|
218
|
+
parent = context[:parent]
|
219
|
+
code = context[:code]
|
220
|
+
|
221
|
+
result = ["node"]
|
222
|
+
result << ["matches"] + o.names.collect {|m| do_dump(m) }
|
223
|
+
result << ["parent", do_dump(parent)] if !is_nop?(parent)
|
224
|
+
if is_nop?(code)
|
225
|
+
result << []
|
226
|
+
else
|
227
|
+
result << do_dump(code)
|
228
|
+
end
|
229
|
+
result
|
230
|
+
end
|
231
|
+
|
232
|
+
def dump_Definition o
|
233
|
+
# ok, this is even crazier that Hostclass. The name of the define does not have an accessor
|
234
|
+
# and some things are in the context (but not the name). Parameters are called arguments and they
|
235
|
+
# are in a Ruby Array where each parameter is an array of 1 or 2 elements.
|
236
|
+
#
|
237
|
+
context = o.context
|
238
|
+
name = o.instance_variable_get("@name")
|
239
|
+
args = context[:arguments]
|
240
|
+
code = context[:code]
|
241
|
+
result = ["define", name]
|
242
|
+
result << ["parameters"] + args.collect {|p| _dump_ParameterArray(p) } if args && args.size() > 0
|
243
|
+
if is_nop?(code)
|
244
|
+
result << []
|
245
|
+
else
|
246
|
+
result << do_dump(code)
|
247
|
+
end
|
248
|
+
result
|
249
|
+
end
|
250
|
+
|
251
|
+
def dump_ResourceReference o
|
252
|
+
result = ["slice", do_dump(o.type)]
|
253
|
+
if o.title.children.size == 1
|
254
|
+
result << do_dump(o.title[0])
|
255
|
+
else
|
256
|
+
result << do_dump(o.title.children)
|
257
|
+
end
|
258
|
+
result
|
259
|
+
end
|
260
|
+
|
261
|
+
def dump_ResourceOverride o
|
262
|
+
result = ["override", do_dump(o.object), :indent]
|
263
|
+
o.parameters.each do |p|
|
264
|
+
result << :break << do_dump(p)
|
265
|
+
end
|
266
|
+
result << :dedent
|
267
|
+
result
|
268
|
+
end
|
269
|
+
|
270
|
+
# Puppet AST encodes a parameter as a one or two slot Array.
|
271
|
+
# This is not a polymorph dump method.
|
272
|
+
#
|
273
|
+
def _dump_ParameterArray o
|
274
|
+
if o.size == 2
|
275
|
+
["=", o[0], do_dump(o[1])]
|
276
|
+
else
|
277
|
+
o[0]
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
281
|
+
def dump_IfStatement o
|
282
|
+
result = ["if", do_dump(o.test), :indent, :break,
|
283
|
+
["then", :indent, do_dump(o.statements), :dedent]]
|
284
|
+
result +=
|
285
|
+
[:break,
|
286
|
+
["else", :indent, do_dump(o.else), :dedent],
|
287
|
+
:dedent] unless is_nop? o.else
|
288
|
+
result
|
289
|
+
end
|
290
|
+
|
291
|
+
# Produces (invoke name args...) when not required to produce an rvalue, and
|
292
|
+
# (call name args ... ) otherwise.
|
293
|
+
#
|
294
|
+
def dump_Function o
|
295
|
+
# somewhat ugly as Function hides its "ftype" instance variable
|
296
|
+
result = [o.instance_variable_get("@ftype") == :rvalue ? "call" : "invoke", do_dump(o.name)]
|
297
|
+
o.arguments.collect {|a| result << do_dump(a) }
|
298
|
+
result << do_dump(o.pblock) if o.pblock
|
299
|
+
result
|
300
|
+
end
|
301
|
+
|
302
|
+
def dump_MethodCall o
|
303
|
+
# somewhat ugly as Method call (does the same as function) and hides its "ftype" instance variable
|
304
|
+
result = [o.instance_variable_get("@ftype") == :rvalue ? "call-method" : "invoke-method",
|
305
|
+
[".", do_dump(o.receiver), do_dump(o.name)]]
|
306
|
+
o.arguments.collect {|a| result << do_dump(a) }
|
307
|
+
result << do_dump(o.lambda) if o.lambda
|
308
|
+
result
|
309
|
+
end
|
310
|
+
|
311
|
+
def dump_CaseStatement o
|
312
|
+
result = ["case", do_dump(o.test), :indent]
|
313
|
+
o.options.each do |s|
|
314
|
+
result << :break << do_dump(s)
|
315
|
+
end
|
316
|
+
result << :dedent
|
317
|
+
end
|
318
|
+
|
319
|
+
def dump_CaseOpt o
|
320
|
+
result = ["when"]
|
321
|
+
result << o.value.collect {|x| do_dump(x) }
|
322
|
+
# A bit of trickery to get it into the same shape as Pops output
|
323
|
+
if is_nop?(o.statements)
|
324
|
+
result << ["then", []] # Puppet AST has a nop if there is no body
|
325
|
+
else
|
326
|
+
result << ["then", do_dump(o.statements) ]
|
327
|
+
end
|
328
|
+
result
|
329
|
+
end
|
330
|
+
|
331
|
+
def dump_ResourceInstance o
|
332
|
+
result = [do_dump(o.title), :indent]
|
333
|
+
o.parameters.each do |p|
|
334
|
+
result << :break << do_dump(p)
|
335
|
+
end
|
336
|
+
result << :dedent
|
337
|
+
result
|
338
|
+
end
|
339
|
+
|
340
|
+
def dump_ResourceDefaults o
|
341
|
+
result = ["resource-defaults", do_dump(o.type), :indent]
|
342
|
+
o.parameters.each do |p|
|
343
|
+
result << :break << do_dump(p)
|
344
|
+
end
|
345
|
+
result << :dedent
|
346
|
+
result
|
347
|
+
end
|
348
|
+
|
349
|
+
def dump_Resource o
|
350
|
+
if o.exported
|
351
|
+
form = 'exported-'
|
352
|
+
elsif o.virtual
|
353
|
+
form = 'virtual-'
|
354
|
+
else
|
355
|
+
form = ''
|
356
|
+
end
|
357
|
+
result = [form+"resource", do_dump(o.type), :indent]
|
358
|
+
o.instances.each do |b|
|
359
|
+
result << :break << do_dump(b)
|
360
|
+
end
|
361
|
+
result << :dedent
|
362
|
+
result
|
363
|
+
end
|
364
|
+
|
365
|
+
def dump_Selector o
|
366
|
+
values = o.values
|
367
|
+
values = [values] unless values.instance_of? AST::ASTArray or values.instance_of? Array
|
368
|
+
["?", do_dump(o.param)] + values.collect {|x| do_dump(x) }
|
369
|
+
end
|
370
|
+
|
371
|
+
def dump_Object o
|
372
|
+
['dev-error-no-polymorph-dump-for:', o.class.to_s, o.to_s]
|
373
|
+
end
|
374
|
+
|
375
|
+
def is_nop? o
|
376
|
+
o.nil? || o.is_a?(Model::Nop) || o.is_a?(AST::Nop)
|
377
|
+
end
|
378
|
+
end
|
@@ -0,0 +1,804 @@
|
|
1
|
+
# Factory is a helper class that makes construction of a Pops Model
|
2
|
+
# much more convenient. It can be viewed as a small internal DSL for model
|
3
|
+
# constructions.
|
4
|
+
# For usage see tests using the factory.
|
5
|
+
#
|
6
|
+
# @todo All those uppercase methods ... they look bad in one way, but stand out nicely in the grammar...
|
7
|
+
# decide if they should change into lower case names (some of the are lower case)...
|
8
|
+
#
|
9
|
+
class Puppet::Pops::Model::Factory
|
10
|
+
Model = Puppet::Pops::Model
|
11
|
+
|
12
|
+
attr_accessor :current
|
13
|
+
|
14
|
+
# Shared build_visitor, since there are many instances of Factory being used
|
15
|
+
@@build_visitor = Puppet::Pops::Visitor.new(self, "build")
|
16
|
+
# Initialize a factory with a single object, or a class with arguments applied to build of
|
17
|
+
# created instance
|
18
|
+
#
|
19
|
+
def initialize popsobj, *args
|
20
|
+
@current = to_ops(popsobj, *args)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Polymorphic build
|
24
|
+
def build(o, *args)
|
25
|
+
begin
|
26
|
+
@@build_visitor.visit_this(self, o, *args)
|
27
|
+
rescue =>e
|
28
|
+
# require 'debugger'; debugger # enable this when in trouble...
|
29
|
+
raise e
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Building of Model classes
|
34
|
+
|
35
|
+
def build_ArithmeticExpression(o, op, a, b)
|
36
|
+
o.operator = op
|
37
|
+
build_BinaryExpression(o, a, b)
|
38
|
+
end
|
39
|
+
|
40
|
+
def build_AssignmentExpression(o, op, a, b)
|
41
|
+
o.operator = op
|
42
|
+
build_BinaryExpression(o, a, b)
|
43
|
+
end
|
44
|
+
|
45
|
+
def build_AttributeOperation(o, name, op, value)
|
46
|
+
o.operator = op
|
47
|
+
o.attribute_name = name.to_s # BOOLEAN is allowed in the grammar
|
48
|
+
o.value_expr = build(value)
|
49
|
+
o
|
50
|
+
end
|
51
|
+
|
52
|
+
def build_AccessExpression(o, left, *keys)
|
53
|
+
o.left_expr = to_ops(left)
|
54
|
+
keys.each {|expr| o.addKeys(to_ops(expr)) }
|
55
|
+
o
|
56
|
+
end
|
57
|
+
|
58
|
+
def build_BinaryExpression(o, left, right)
|
59
|
+
o.left_expr = to_ops(left)
|
60
|
+
o.right_expr = to_ops(right)
|
61
|
+
o
|
62
|
+
end
|
63
|
+
|
64
|
+
def build_BlockExpression(o, *args)
|
65
|
+
args.each {|expr| o.addStatements(to_ops(expr)) }
|
66
|
+
o
|
67
|
+
end
|
68
|
+
|
69
|
+
def build_CollectExpression(o, type_expr, query_expr, attribute_operations)
|
70
|
+
o.type_expr = to_ops(type_expr)
|
71
|
+
o.query = build(query_expr)
|
72
|
+
attribute_operations.each {|op| o.addOperations(build(op)) }
|
73
|
+
o
|
74
|
+
end
|
75
|
+
|
76
|
+
def build_ComparisonExpression(o, op, a, b)
|
77
|
+
o.operator = op
|
78
|
+
build_BinaryExpression(o, a, b)
|
79
|
+
end
|
80
|
+
|
81
|
+
def build_ConcatenatedString(o, *args)
|
82
|
+
args.each {|expr| o.addSegments(build(expr)) }
|
83
|
+
o
|
84
|
+
end
|
85
|
+
|
86
|
+
def build_CreateTypeExpression(o, name, super_name = nil)
|
87
|
+
o.name = name
|
88
|
+
o.super_name = super_name
|
89
|
+
o
|
90
|
+
end
|
91
|
+
|
92
|
+
def build_CreateEnumExpression(o, *args)
|
93
|
+
o.name = args.slice(0) if args.size == 2
|
94
|
+
o.values = build(args.last)
|
95
|
+
o
|
96
|
+
end
|
97
|
+
|
98
|
+
def build_CreateAttributeExpression(o, name, datatype_expr)
|
99
|
+
o.name = name
|
100
|
+
o.type = to_ops(datatype_expr)
|
101
|
+
o
|
102
|
+
end
|
103
|
+
|
104
|
+
# @param name [String] a valid classname
|
105
|
+
# @param parameters [Array<Model::Parameter>] may be empty
|
106
|
+
# @param parent_class_name [String, nil] a valid classname referencing a parent class, optional.
|
107
|
+
# @param body [Array<Expression>, Expression, nil] expression that constitute the body
|
108
|
+
# @return [Model::HostClassDefinition] configured from the parameters
|
109
|
+
#
|
110
|
+
def build_HostClassDefinition(o, name, parameters, parent_class_name, body)
|
111
|
+
build_NamedDefinition(o, name, parameters, body)
|
112
|
+
o.parent_class = parent_class_name if parent_class_name
|
113
|
+
o
|
114
|
+
end
|
115
|
+
|
116
|
+
# # @param name [String] a valid classname
|
117
|
+
# # @param parameters [Array<Model::Parameter>] may be empty
|
118
|
+
# # @param body [Array<Expression>, Expression, nil] expression that constitute the body
|
119
|
+
# # @return [Model::HostClassDefinition] configured from the parameters
|
120
|
+
# #
|
121
|
+
# def build_ResourceTypeDefinition(o, name, parameters, body)
|
122
|
+
# build_NamedDefinition(o, name, parameters, body)
|
123
|
+
# o.name = name
|
124
|
+
# parameters.each {|p| o.addParameters(build(p)) }
|
125
|
+
# b = f_build_body(body)
|
126
|
+
# o.body = b.current if b
|
127
|
+
# o
|
128
|
+
# end
|
129
|
+
|
130
|
+
def build_ResourceOverrideExpression(o, resources, attribute_operations)
|
131
|
+
o.resources = build(resources)
|
132
|
+
attribute_operations.each {|ao| o.addOperations(build(ao)) }
|
133
|
+
o
|
134
|
+
end
|
135
|
+
|
136
|
+
def build_KeyedEntry(o, k, v)
|
137
|
+
o.key = build(k)
|
138
|
+
o.value = build(v)
|
139
|
+
o
|
140
|
+
end
|
141
|
+
|
142
|
+
def build_LiteralHash(o, *keyed_entries)
|
143
|
+
keyed_entries.each {|entry| o.addEntries build(entry) }
|
144
|
+
o
|
145
|
+
end
|
146
|
+
|
147
|
+
def build_LiteralList(o, *values)
|
148
|
+
values.each {|v| o.addValues build(v) }
|
149
|
+
o
|
150
|
+
end
|
151
|
+
|
152
|
+
def build_LiteralNumber(o, val, radix)
|
153
|
+
o.value = val
|
154
|
+
o.radix = radix
|
155
|
+
o
|
156
|
+
end
|
157
|
+
|
158
|
+
def build_InstanceReferences(o, type_name, name_expressions)
|
159
|
+
o.type_name = build(type_name)
|
160
|
+
name_expressions.each {|n| o.addNames(build(n)) }
|
161
|
+
o
|
162
|
+
end
|
163
|
+
|
164
|
+
def build_ImportExpression(o, files)
|
165
|
+
# The argument files has already been built
|
166
|
+
files.each {|f| o.addFiles(to_ops(f)) }
|
167
|
+
o
|
168
|
+
end
|
169
|
+
|
170
|
+
def build_IfExpression(o, t, ift, els)
|
171
|
+
o.test = build(t)
|
172
|
+
o.then_expr = build(ift)
|
173
|
+
o.else_expr= build(els)
|
174
|
+
o
|
175
|
+
end
|
176
|
+
|
177
|
+
def build_MatchExpression(o, op, a, b)
|
178
|
+
o.operator = op
|
179
|
+
build_BinaryExpression(o, a, b)
|
180
|
+
end
|
181
|
+
|
182
|
+
# Builds body :) from different kinds of input
|
183
|
+
# @param body [nil] unchanged, produces nil
|
184
|
+
# @param body [Array<Expression>] turns into a BlockExpression
|
185
|
+
# @param body [Expression] produces the given expression
|
186
|
+
# @param body [Object] produces the result of calling #build with body as argument
|
187
|
+
def f_build_body(body)
|
188
|
+
case body
|
189
|
+
when NilClass
|
190
|
+
nil
|
191
|
+
when Array
|
192
|
+
Puppet::Pops::Model::Factory.new(Model::BlockExpression, *body)
|
193
|
+
else
|
194
|
+
build(body)
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
def build_Definition(o, parameters, body)
|
199
|
+
parameters.each {|p| o.addParameters(build(p)) }
|
200
|
+
b = f_build_body(body)
|
201
|
+
o.body = b.current if b
|
202
|
+
o
|
203
|
+
end
|
204
|
+
|
205
|
+
def build_NamedDefinition(o, name, parameters, body)
|
206
|
+
build_Definition(o, parameters, body)
|
207
|
+
o.name = name
|
208
|
+
o
|
209
|
+
end
|
210
|
+
|
211
|
+
# @param o [Model::NodeDefinition]
|
212
|
+
# @param hosts [Array<Expression>] host matches
|
213
|
+
# @param parent [Expression] parent node matcher
|
214
|
+
# @param body [Object] see {#f_build_body}
|
215
|
+
def build_NodeDefinition(o, hosts, parent, body)
|
216
|
+
hosts.each {|h| o.addHost_matches(build(h)) }
|
217
|
+
o.parent = build(parent) if parent # no nop here
|
218
|
+
b = f_build_body(body)
|
219
|
+
o.body = b.current if b
|
220
|
+
o
|
221
|
+
end
|
222
|
+
|
223
|
+
def build_Parameter(o, name, expr)
|
224
|
+
o.name = name
|
225
|
+
o.value = build(expr) if expr # don't build a nil/nop
|
226
|
+
o
|
227
|
+
end
|
228
|
+
|
229
|
+
def build_QualifiedReference(o, name)
|
230
|
+
o.value = name.to_s.downcase
|
231
|
+
o
|
232
|
+
end
|
233
|
+
|
234
|
+
def build_RelationshipExpression(o, op, a, b)
|
235
|
+
o.operator = op
|
236
|
+
build_BinaryExpression(o, a, b)
|
237
|
+
end
|
238
|
+
|
239
|
+
def build_ResourceExpression(o, type_name, bodies)
|
240
|
+
o.type_name = build(type_name)
|
241
|
+
bodies.each {|b| o.addBodies(build(b)) }
|
242
|
+
o
|
243
|
+
end
|
244
|
+
|
245
|
+
def build_ResourceBody(o, title_expression, attribute_operations)
|
246
|
+
o.title = build(title_expression)
|
247
|
+
attribute_operations.each {|ao| o.addOperations(build(ao)) }
|
248
|
+
o
|
249
|
+
end
|
250
|
+
|
251
|
+
def build_ResourceDefaultsExpression(o, type_ref, attribute_operations)
|
252
|
+
o.type_ref = build(type_ref)
|
253
|
+
attribute_operations.each {|ao| o.addOperations(build(ao)) }
|
254
|
+
o
|
255
|
+
end
|
256
|
+
|
257
|
+
def build_SelectorExpression(o, left, *selectors)
|
258
|
+
o.left_expr = to_ops(left)
|
259
|
+
selectors.each {|s| o.addSelectors(build(s)) }
|
260
|
+
o
|
261
|
+
end
|
262
|
+
|
263
|
+
def build_SelectorEntry(o, matching, value)
|
264
|
+
o.matching_expr = build(matching)
|
265
|
+
o.value_expr = build(value)
|
266
|
+
o
|
267
|
+
end
|
268
|
+
|
269
|
+
def build_QueryExpression(o, expr)
|
270
|
+
ops = to_ops(expr)
|
271
|
+
o.expr = ops unless Puppet::Pops::Model::Factory.nop? ops
|
272
|
+
o
|
273
|
+
end
|
274
|
+
|
275
|
+
def build_UnaryExpression(o, expr)
|
276
|
+
ops = to_ops(expr)
|
277
|
+
o.expr = ops unless Puppet::Pops::Model::Factory.nop? ops
|
278
|
+
o
|
279
|
+
end
|
280
|
+
|
281
|
+
def build_QualifiedName(o, name)
|
282
|
+
o.value = name.to_s
|
283
|
+
o
|
284
|
+
end
|
285
|
+
|
286
|
+
# Puppet::Pops::Model::Factory helpers
|
287
|
+
def f_build_unary(klazz, expr)
|
288
|
+
Puppet::Pops::Model::Factory.new(build(klazz.new, expr))
|
289
|
+
end
|
290
|
+
|
291
|
+
def f_build_binary_op(klazz, op, left, right)
|
292
|
+
Puppet::Pops::Model::Factory.new(build(klazz.new, op, left, right))
|
293
|
+
end
|
294
|
+
|
295
|
+
def f_build_binary(klazz, left, right)
|
296
|
+
Puppet::Pops::Model::Factory.new(build(klazz.new, left, right))
|
297
|
+
end
|
298
|
+
|
299
|
+
def f_build_vararg(klazz, left, *arg)
|
300
|
+
Puppet::Pops::Model::Factory.new(build(klazz.new, left, *arg))
|
301
|
+
end
|
302
|
+
|
303
|
+
def f_arithmetic(op, r)
|
304
|
+
f_build_binary_op(Model::ArithmeticExpression, op, current, r)
|
305
|
+
end
|
306
|
+
|
307
|
+
def f_comparison(op, r)
|
308
|
+
f_build_binary_op(Model::ComparisonExpression, op, current, r)
|
309
|
+
end
|
310
|
+
|
311
|
+
def f_match(op, r)
|
312
|
+
f_build_binary_op(Model::MatchExpression, op, current, r)
|
313
|
+
end
|
314
|
+
|
315
|
+
# Operator helpers
|
316
|
+
def in(r) f_build_binary(Model::InExpression, current, r); end
|
317
|
+
|
318
|
+
def or(r) f_build_binary(Model::OrExpression, current, r); end
|
319
|
+
|
320
|
+
def and(r) f_build_binary(Model::AndExpression, current, r); end
|
321
|
+
|
322
|
+
def not(); f_build_unary(Model::NotExpression, self); end
|
323
|
+
|
324
|
+
def minus(); f_build_unary(Model::UnaryMinusExpression, self); end
|
325
|
+
|
326
|
+
def text(); f_build_unary(Model::TextExpression, self); end
|
327
|
+
|
328
|
+
def var(); f_build_unary(Model::VariableExpression, self); end
|
329
|
+
|
330
|
+
def [](*r); f_build_vararg(Model::AccessExpression, current, *r); end
|
331
|
+
|
332
|
+
def dot r; f_build_binary(Model::NamedAccessExpression, current, r); end
|
333
|
+
|
334
|
+
def + r; f_arithmetic(:+, r); end
|
335
|
+
|
336
|
+
def - r; f_arithmetic(:-, r); end
|
337
|
+
|
338
|
+
def / r; f_arithmetic(:/, r); end
|
339
|
+
|
340
|
+
def * r; f_arithmetic(:*, r); end
|
341
|
+
|
342
|
+
def % r; f_arithmetic(:%, r); end
|
343
|
+
|
344
|
+
def << r; f_arithmetic(:<<, r); end
|
345
|
+
|
346
|
+
def >> r; f_arithmetic(:>>, r); end
|
347
|
+
|
348
|
+
def < r; f_comparison(:<, r); end
|
349
|
+
|
350
|
+
def <= r; f_comparison(:<=, r); end
|
351
|
+
|
352
|
+
def > r; f_comparison(:>, r); end
|
353
|
+
|
354
|
+
def >= r; f_comparison(:>=, r); end
|
355
|
+
|
356
|
+
def == r; f_comparison(:==, r); end
|
357
|
+
|
358
|
+
def ne r; f_comparison(:'!=', r); end
|
359
|
+
|
360
|
+
def =~ r; f_match(:'=~', r); end
|
361
|
+
|
362
|
+
def mne r; f_match(:'!~', r); end
|
363
|
+
|
364
|
+
def paren(); f_build_unary(Model::ParenthesizedExpression, current); end
|
365
|
+
|
366
|
+
def relop op, r
|
367
|
+
f_build_binary_op(Model::RelationshipExpression, op.to_sym, current, r)
|
368
|
+
end
|
369
|
+
|
370
|
+
def select *args
|
371
|
+
Puppet::Pops::Model::Factory.new(build(Model::SelectorExpression, current, *args))
|
372
|
+
end
|
373
|
+
|
374
|
+
# For CaseExpression, setting the default for an already build CaseExpression
|
375
|
+
def default r
|
376
|
+
current.addOptions(Puppet::Pops::Model::Factory.WHEN(:default, r).current)
|
377
|
+
self
|
378
|
+
end
|
379
|
+
|
380
|
+
def lambda=(lambda)
|
381
|
+
current.lambda = lambda.current
|
382
|
+
self
|
383
|
+
end
|
384
|
+
|
385
|
+
# Assignment =
|
386
|
+
def set(r)
|
387
|
+
f_build_binary_op(Model::AssignmentExpression, :'=', current, r)
|
388
|
+
end
|
389
|
+
|
390
|
+
# Assignment +=
|
391
|
+
def plus_set(r)
|
392
|
+
f_build_binary_op(Model::AssignmentExpression, :'+=', current, r)
|
393
|
+
end
|
394
|
+
|
395
|
+
def attributes(*args)
|
396
|
+
args.each {|a| current.addAttributes(build(a)) }
|
397
|
+
self
|
398
|
+
end
|
399
|
+
|
400
|
+
# Catch all delegation to current
|
401
|
+
def method_missing(meth, *args, &block)
|
402
|
+
if current.respond_to?(meth)
|
403
|
+
current.send(meth, *args, &block)
|
404
|
+
else
|
405
|
+
super
|
406
|
+
end
|
407
|
+
end
|
408
|
+
|
409
|
+
def respond_to?(meth)
|
410
|
+
current.respond_to?(meth) || super
|
411
|
+
end
|
412
|
+
|
413
|
+
# Records the position (start -> end) and computes the resulting length.
|
414
|
+
#
|
415
|
+
def record_position(start_pos, end_pos)
|
416
|
+
Puppet::Pops::Adapters::SourcePosAdapter.adapt(current) do |a|
|
417
|
+
a.line = start_pos.line
|
418
|
+
a.offset = start_pos.offset
|
419
|
+
a.pos = start_pos.pos
|
420
|
+
a.length = start_pos.length
|
421
|
+
if(end_pos.offset && end_pos.length)
|
422
|
+
a.length = end_pos.offset + end_pos.length - start_pos.offset
|
423
|
+
end
|
424
|
+
end
|
425
|
+
self
|
426
|
+
end
|
427
|
+
|
428
|
+
# Records the origin file of an element
|
429
|
+
# Does nothing if file is nil.
|
430
|
+
#
|
431
|
+
# @param file [String,nil] the file/path to the origin, may contain URI scheme of file: or some other URI scheme
|
432
|
+
# @returns [Factory] returns self
|
433
|
+
#
|
434
|
+
def record_origin(file)
|
435
|
+
return self unless file
|
436
|
+
Puppet::Pops::Adapters::OriginAdapter.adapt(current) do |a|
|
437
|
+
a.origin = file
|
438
|
+
end
|
439
|
+
self
|
440
|
+
end
|
441
|
+
|
442
|
+
# @return [Puppet::Pops::Adapters::SourcePosAdapter] with location information
|
443
|
+
def loc()
|
444
|
+
Puppet::Pops::Adapters::SourcePosAdapter.adapt(current)
|
445
|
+
end
|
446
|
+
|
447
|
+
# Returns documentation string, or nil if not available
|
448
|
+
# @return [String, nil] associated documentation if available
|
449
|
+
def doc()
|
450
|
+
a = Puppet::Pops::Adapters::SourcePosAdapter.adapt(current)
|
451
|
+
return a.documentation if a
|
452
|
+
nil
|
453
|
+
end
|
454
|
+
|
455
|
+
def doc=(doc_string)
|
456
|
+
a = Puppet::Pops::Adapters::SourcePosAdapter.adapt(current)
|
457
|
+
a.documentation = doc_string
|
458
|
+
end
|
459
|
+
|
460
|
+
# Returns symbolic information about a expected share of a resource expression given the LHS of a resource expr.
|
461
|
+
#
|
462
|
+
# * `name { }` => `:resource`, create a resource of the given type
|
463
|
+
# * `Name { }` => ':defaults`, set defauls for the referenced type
|
464
|
+
# * `Name[] { }` => `:override`, ioverrides nstances referenced by LHS
|
465
|
+
# * _any other_ => ':error', all other are considered illegal
|
466
|
+
#
|
467
|
+
def self.resource_shape(expr)
|
468
|
+
expr = expr.current if expr.is_a?(Puppet::Pops::Model::Factory)
|
469
|
+
case expr
|
470
|
+
when Model::QualifiedName
|
471
|
+
:resource
|
472
|
+
when Model::QualifiedReference
|
473
|
+
:defaults
|
474
|
+
when Model::AccessExpression
|
475
|
+
:override
|
476
|
+
when 'class'
|
477
|
+
:class
|
478
|
+
else
|
479
|
+
:error
|
480
|
+
end
|
481
|
+
end
|
482
|
+
# Factory starting points
|
483
|
+
|
484
|
+
def self.literal(o); new(o); end
|
485
|
+
|
486
|
+
def self.minus(o); new(o).minus; end
|
487
|
+
|
488
|
+
def self.var(o); new(o).var; end
|
489
|
+
|
490
|
+
def self.block(*args); new(Model::BlockExpression, *args); end
|
491
|
+
|
492
|
+
def self.string(*args); new(Model::ConcatenatedString, *args); end
|
493
|
+
|
494
|
+
def self.text(o); new(o).text; end
|
495
|
+
|
496
|
+
def self.IF(test_e,then_e,else_e); new(Model::IfExpression, test_e, then_e, else_e); end
|
497
|
+
|
498
|
+
def self.UNLESS(test_e,then_e,else_e); new(Model::UnlessExpression, test_e, then_e, else_e); end
|
499
|
+
|
500
|
+
def self.CASE(test_e,*options); new(Model::CaseExpression, test_e, *options); end
|
501
|
+
|
502
|
+
def self.WHEN(values_list, block); new(Model::CaseOption, values_list, block); end
|
503
|
+
|
504
|
+
def self.MAP(match, value); new(Model::SelectorEntry, match, value); end
|
505
|
+
|
506
|
+
def self.TYPE(name, super_name=nil); new(Model::CreateTypeExpression, name, super_name); end
|
507
|
+
|
508
|
+
def self.ATTR(name, type_expr=nil); new(Model::CreateAttributeExpression, name, type_expr); end
|
509
|
+
|
510
|
+
def self.ENUM(*args); new(Model::CreateEnumExpression, *args); end
|
511
|
+
|
512
|
+
def self.KEY_ENTRY(key, val); new(Model::KeyedEntry, key, val); end
|
513
|
+
|
514
|
+
def self.HASH(entries); new(Model::LiteralHash, *entries); end
|
515
|
+
|
516
|
+
def self.LIST(entries); new(Model::LiteralList, *entries); end
|
517
|
+
|
518
|
+
def self.PARAM(name, expr=nil); new(Model::Parameter, name, expr); end
|
519
|
+
|
520
|
+
def self.NODE(hosts, parent, body); new(Model::NodeDefinition, hosts, parent, body); end
|
521
|
+
|
522
|
+
# Creates a QualifiedName representation of o, unless o already represents a QualifiedName in which
|
523
|
+
# case it is returned.
|
524
|
+
#
|
525
|
+
def self.fqn(o)
|
526
|
+
o = o.current if o.is_a?(Puppet::Pops::Model::Factory)
|
527
|
+
o = new(Model::QualifiedName, o) unless o.is_a? Model::QualifiedName
|
528
|
+
o
|
529
|
+
end
|
530
|
+
|
531
|
+
# Creates a QualifiedName representation of o, unless o already represents a QualifiedName in which
|
532
|
+
# case it is returned.
|
533
|
+
#
|
534
|
+
def self.fqr(o)
|
535
|
+
o = o.current if o.is_a?(Puppet::Pops::Model::Factory)
|
536
|
+
o = new(Model::QualifiedReference, o) unless o.is_a? Model::QualifiedReference
|
537
|
+
o
|
538
|
+
end
|
539
|
+
|
540
|
+
def self.TEXT(expr)
|
541
|
+
new(Model::TextExpression, expr)
|
542
|
+
end
|
543
|
+
|
544
|
+
# TODO: This is the same a fqn factory method, don't know if callers to fqn and QNAME can live with the
|
545
|
+
# same result or not yet - refactor into one method when decided.
|
546
|
+
#
|
547
|
+
def self.QNAME(name)
|
548
|
+
new(Model::QualifiedName, name)
|
549
|
+
end
|
550
|
+
|
551
|
+
# Convert input string to either a qualified name, or a LiteralNumber with radix
|
552
|
+
#
|
553
|
+
def self.QNAME_OR_NUMBER(name)
|
554
|
+
if n_radix = Puppet::Pops::Utils.to_n_with_radix(name)
|
555
|
+
new(Model::LiteralNumber, *n_radix)
|
556
|
+
else
|
557
|
+
new(Model::QualifiedName, name)
|
558
|
+
end
|
559
|
+
end
|
560
|
+
|
561
|
+
def self.QREF(name)
|
562
|
+
new(Model::QualifiedReference, name)
|
563
|
+
end
|
564
|
+
|
565
|
+
def self.VIRTUAL_QUERY(query_expr)
|
566
|
+
new(Model::VirtualQuery, query_expr)
|
567
|
+
end
|
568
|
+
|
569
|
+
def self.EXPORTED_QUERY(query_expr)
|
570
|
+
new(Model::ExportedQuery, query_expr)
|
571
|
+
end
|
572
|
+
|
573
|
+
# Used by regular grammar, egrammar creates an AccessExpression instead, and evaluation determines
|
574
|
+
# if access is to instances or something else.
|
575
|
+
#
|
576
|
+
def self.INSTANCE(type_name, name_expressions)
|
577
|
+
new(Model::InstanceReferences, type_name, name_expressions)
|
578
|
+
end
|
579
|
+
|
580
|
+
def self.ATTRIBUTE_OP(name, op, expr)
|
581
|
+
new(Model::AttributeOperation, name, op, expr)
|
582
|
+
end
|
583
|
+
|
584
|
+
def self.CALL_NAMED(name, rval_required, argument_list)
|
585
|
+
unless name.kind_of?(Model::PopsObject)
|
586
|
+
name = Puppet::Pops::Model::Factory.fqn(name) unless name.is_a?(Puppet::Pops::Model::Factory)
|
587
|
+
end
|
588
|
+
new(Model::CallNamedFunctionExpression, name, rval_required, *argument_list)
|
589
|
+
end
|
590
|
+
|
591
|
+
def self.CALL_METHOD(functor, argument_list)
|
592
|
+
new(Model::CallMethodExpression, functor, true, nil, *argument_list)
|
593
|
+
end
|
594
|
+
|
595
|
+
def self.COLLECT(type_expr, query_expr, attribute_operations)
|
596
|
+
new(Model::CollectExpression, Puppet::Pops::Model::Factory.fqr(type_expr), query_expr, attribute_operations)
|
597
|
+
end
|
598
|
+
|
599
|
+
def self.IMPORT(files)
|
600
|
+
new(Model::ImportExpression, files)
|
601
|
+
end
|
602
|
+
|
603
|
+
def self.NAMED_ACCESS(type_name, bodies)
|
604
|
+
new(Model::NamedAccessExpression, type_name, bodies)
|
605
|
+
end
|
606
|
+
|
607
|
+
def self.RESOURCE(type_name, bodies)
|
608
|
+
new(Model::ResourceExpression, type_name, bodies)
|
609
|
+
end
|
610
|
+
|
611
|
+
def self.RESOURCE_DEFAULTS(type_name, attribute_operations)
|
612
|
+
new(Model::ResourceDefaultsExpression, type_name, attribute_operations)
|
613
|
+
end
|
614
|
+
|
615
|
+
def self.RESOURCE_OVERRIDE(resource_ref, attribute_operations)
|
616
|
+
new(Model::ResourceOverrideExpression, resource_ref, attribute_operations)
|
617
|
+
end
|
618
|
+
|
619
|
+
def self.RESOURCE_BODY(resource_title, attribute_operations)
|
620
|
+
new(Model::ResourceBody, resource_title, attribute_operations)
|
621
|
+
end
|
622
|
+
|
623
|
+
# Builds a BlockExpression if args size > 1, else the single expression/value in args
|
624
|
+
def self.block_or_expression(*args)
|
625
|
+
if args.size > 1
|
626
|
+
new(Model::BlockExpression, *args)
|
627
|
+
else
|
628
|
+
new(args[0])
|
629
|
+
end
|
630
|
+
end
|
631
|
+
|
632
|
+
def self.HOSTCLASS(name, parameters, parent, body)
|
633
|
+
new(Model::HostClassDefinition, name, parameters, parent, body)
|
634
|
+
end
|
635
|
+
|
636
|
+
def self.DEFINITION(name, parameters, body)
|
637
|
+
new(Model::ResourceTypeDefinition, name, parameters, body)
|
638
|
+
end
|
639
|
+
|
640
|
+
def self.LAMBDA(parameters, body)
|
641
|
+
new(Model::LambdaExpression, parameters, body)
|
642
|
+
end
|
643
|
+
|
644
|
+
def self.nop? o
|
645
|
+
o.nil? || o.is_a?(Puppet::Pops::Model::Nop)
|
646
|
+
end
|
647
|
+
|
648
|
+
# Transforms an array of expressions containing literal name expressions to calls if followed by an
|
649
|
+
# expression, or expression list. Also transforms a "call" to `import` into an ImportExpression.
|
650
|
+
#
|
651
|
+
def self.transform_calls(expressions)
|
652
|
+
expressions.reduce([]) do |memo, expr|
|
653
|
+
expr = expr.current if expr.is_a?(Puppet::Pops::Model::Factory)
|
654
|
+
name = memo[-1]
|
655
|
+
if name.is_a? Model::QualifiedName
|
656
|
+
if name.value() == 'import'
|
657
|
+
memo[-1] = Puppet::Pops::Model::Factory.IMPORT(expr.is_a?(Array) ? expr : [expr])
|
658
|
+
else
|
659
|
+
memo[-1] = Puppet::Pops::Model::Factory.CALL_NAMED(name, false, expr.is_a?(Array) ? expr : [expr])
|
660
|
+
end
|
661
|
+
else
|
662
|
+
memo << expr
|
663
|
+
end
|
664
|
+
if expr.is_a?(Model::CallNamedFunctionExpression)
|
665
|
+
# patch expression function call to statement style
|
666
|
+
# TODO: This is kind of meaningless, but to make it compatible...
|
667
|
+
expr.rval_required = false
|
668
|
+
end
|
669
|
+
memo
|
670
|
+
end
|
671
|
+
|
672
|
+
end
|
673
|
+
|
674
|
+
# Building model equivalences of Ruby objects
|
675
|
+
# Allows passing regular ruby objects to the factory to produce instructions
|
676
|
+
# that when evaluated produce the same thing.
|
677
|
+
|
678
|
+
def build_String(o)
|
679
|
+
x = Model::LiteralString.new
|
680
|
+
x.value = o;
|
681
|
+
x
|
682
|
+
end
|
683
|
+
|
684
|
+
def build_NilClass(o)
|
685
|
+
x = Model::Nop.new
|
686
|
+
x
|
687
|
+
end
|
688
|
+
|
689
|
+
def build_TrueClass(o)
|
690
|
+
x = Model::LiteralBoolean.new
|
691
|
+
x.value = o
|
692
|
+
x
|
693
|
+
end
|
694
|
+
|
695
|
+
def build_FalseClass(o)
|
696
|
+
x = Model::LiteralBoolean.new
|
697
|
+
x.value = o
|
698
|
+
x
|
699
|
+
end
|
700
|
+
|
701
|
+
def build_Fixnum(o)
|
702
|
+
x = Model::LiteralNumber.new
|
703
|
+
x.value = o;
|
704
|
+
x
|
705
|
+
end
|
706
|
+
|
707
|
+
def build_Float(o)
|
708
|
+
x = Model::LiteralNumber.new
|
709
|
+
x.value = o;
|
710
|
+
x
|
711
|
+
end
|
712
|
+
|
713
|
+
def build_Regexp(o)
|
714
|
+
x = Model::LiteralRegularExpression.new
|
715
|
+
x.value = o;
|
716
|
+
x
|
717
|
+
end
|
718
|
+
|
719
|
+
# If building a factory, simply unwrap the model oject contained in the factory.
|
720
|
+
def build_Factory(o)
|
721
|
+
o.current
|
722
|
+
end
|
723
|
+
|
724
|
+
# Creates a String literal, unless the symbol is one of the special :undef, or :default
|
725
|
+
# which instead creates a LiterlUndef, or a LiteralDefault.
|
726
|
+
def build_Symbol(o)
|
727
|
+
case o
|
728
|
+
when :undef
|
729
|
+
Model::LiteralUndef.new
|
730
|
+
when :default
|
731
|
+
Model::LiteralDefault.new
|
732
|
+
else
|
733
|
+
build_String(o.to_s)
|
734
|
+
end
|
735
|
+
end
|
736
|
+
|
737
|
+
# Creates a LiteralList instruction from an Array, where the entries are built.
|
738
|
+
def build_Array(o)
|
739
|
+
x = Model::LiteralList.new
|
740
|
+
o.each { |v| x.addValues(build(v)) }
|
741
|
+
x
|
742
|
+
end
|
743
|
+
|
744
|
+
# Create a LiteralHash instruction from a hash, where keys and values are built
|
745
|
+
# The hash entries are added in sorted order based on key.to_s
|
746
|
+
#
|
747
|
+
def build_Hash(o)
|
748
|
+
x = Model::LiteralHash.new
|
749
|
+
(o.sort_by {|k,v| k.to_s}).each {|k,v| x.addEntries(build(Model::KeyedEntry.new, k, v)) }
|
750
|
+
x
|
751
|
+
end
|
752
|
+
|
753
|
+
# @param rval_required [Boolean] if the call must produce a value
|
754
|
+
def build_CallExpression(o, functor, rval_required, *args)
|
755
|
+
o.functor_expr = to_ops(functor)
|
756
|
+
o.rval_required = rval_required
|
757
|
+
args.each {|x| o.addArguments(to_ops(x)) }
|
758
|
+
o
|
759
|
+
end
|
760
|
+
|
761
|
+
# # @param rval_required [Boolean] if the call must produce a value
|
762
|
+
# def build_CallNamedFunctionExpression(o, name, rval_required, *args)
|
763
|
+
# build_CallExpression(o, name, rval_required, *args)
|
764
|
+
## o.functor_expr = build(name)
|
765
|
+
## o.rval_required = rval_required
|
766
|
+
## args.each {|x| o.addArguments(build(x)) }
|
767
|
+
# o
|
768
|
+
# end
|
769
|
+
|
770
|
+
def build_CallMethodExpression(o, functor, rval_required, lambda, *args)
|
771
|
+
build_CallExpression(o, functor, rval_required, *args)
|
772
|
+
o.lambda = lambda
|
773
|
+
o
|
774
|
+
end
|
775
|
+
|
776
|
+
def build_CaseExpression(o, test, *args)
|
777
|
+
o.test = build(test)
|
778
|
+
args.each {|opt| o.addOptions(build(opt)) }
|
779
|
+
o
|
780
|
+
end
|
781
|
+
|
782
|
+
def build_CaseOption(o, value_list, then_expr)
|
783
|
+
value_list = [value_list] unless value_list.is_a? Array
|
784
|
+
value_list.each { |v| o.addValues(build(v)) }
|
785
|
+
b = f_build_body(then_expr)
|
786
|
+
o.then_expr = to_ops(b) if b
|
787
|
+
o
|
788
|
+
end
|
789
|
+
|
790
|
+
# Build a Class by creating an instance of it, and then calling build on the created instance
|
791
|
+
# with the given arguments
|
792
|
+
def build_Class(o, *args)
|
793
|
+
build(o.new(), *args)
|
794
|
+
end
|
795
|
+
|
796
|
+
# Checks if the object is already a model object, or build it
|
797
|
+
def to_ops(o, *args)
|
798
|
+
if o.kind_of?(Model::PopsObject)
|
799
|
+
o
|
800
|
+
else
|
801
|
+
build(o, *args)
|
802
|
+
end
|
803
|
+
end
|
804
|
+
end
|