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
@@ -3,7 +3,7 @@ require 'puppet/parameter'
|
|
3
3
|
# This specialized {Puppet::Parameter} handles munging of package options.
|
4
4
|
# Package options are passed as an array of key value pairs. Special munging is
|
5
5
|
# required as the keys and values needs to be quoted in a safe way.
|
6
|
-
#
|
6
|
+
#
|
7
7
|
class Puppet::Parameter::PackageOptions < Puppet::Parameter
|
8
8
|
def unsafe_munge(values)
|
9
9
|
values = [values] unless values.is_a? Array
|
@@ -21,7 +21,7 @@ class Puppet::Parameter::Path < Puppet::Parameter
|
|
21
21
|
# @raise [Puppet::Error] if this property is configured for single paths and an array is given
|
22
22
|
# @raise [Puppet::Error] if a path is not an absolute path
|
23
23
|
# @return [Array<String>] the given paths
|
24
|
-
#
|
24
|
+
#
|
25
25
|
def validate_path(paths)
|
26
26
|
if paths.is_a?(Array) and ! self.class.arrays? then
|
27
27
|
fail "#{name} only accepts a single path, not an array of paths"
|
@@ -7,7 +7,7 @@ require 'puppet/parameter/value_collection'
|
|
7
7
|
#
|
8
8
|
class Puppet::Parameter::Value
|
9
9
|
attr_reader :name, :options, :event
|
10
|
-
attr_accessor :block, :call, :method, :required_features
|
10
|
+
attr_accessor :block, :call, :method, :required_features, :invalidate_refreshes
|
11
11
|
|
12
12
|
# Adds an alias for this value.
|
13
13
|
# Makes the given _name_ be an alias for this acceptable value.
|
@@ -2,7 +2,7 @@ require 'puppet/parameter/value'
|
|
2
2
|
|
3
3
|
# A collection of values and regular expressions, used for specifying allowed values
|
4
4
|
# in a given parameter.
|
5
|
-
# @note This class is considered part of the internal implementation of {Puppet::Parameter}, and
|
5
|
+
# @note This class is considered part of the internal implementation of {Puppet::Parameter}, and
|
6
6
|
# {Puppet::Property} and the functionality provided by this class should be used via their interfaces.
|
7
7
|
# @comment This class probably have several problems when trying to use it with a combination of
|
8
8
|
# regular expressions and aliases as it finds an acceptable value holder vi "name" which may be
|
@@ -88,7 +88,7 @@ class Puppet::Parameter::ValueCollection
|
|
88
88
|
end
|
89
89
|
|
90
90
|
# Munges the value if it is valid, else produces the same value.
|
91
|
-
# @param value [Object] the value to munge
|
91
|
+
# @param value [Object] the value to munge
|
92
92
|
# @return [Object] the munged value, or the given value
|
93
93
|
# @todo This method does not seem to do any munging. It just returns the value if it matches the
|
94
94
|
# regexp, or the (most likely Symbolic) allowed value if it matches (which is more of a replacement
|
@@ -123,6 +123,10 @@ class Puppet::Parameter::ValueCollection
|
|
123
123
|
# was possible to specify a value of `:before` or `:after` for the purpose of calling
|
124
124
|
# both the block and the provider. Use of these deprecated options will now raise an exception later
|
125
125
|
# in the process when the _is_ value is set (see Puppet::Property#set).
|
126
|
+
# @option options [Symbol] :invalidate_refreshes True if a change on this property should invalidate and
|
127
|
+
# remove any scheduled refreshes (from notify or subscribe) targeted at the same resource. For example, if
|
128
|
+
# a change in this property takes into account any changes that a scheduled refresh would have performed,
|
129
|
+
# then the scheduled refresh would be deleted.
|
126
130
|
# @option options [Object] _any_ Any other option is treated as a call to a setter having the given
|
127
131
|
# option name (e.g. `:required_features` calls `required_features=` with the option's value as an
|
128
132
|
# argument).
|
@@ -187,7 +191,7 @@ class Puppet::Parameter::ValueCollection
|
|
187
191
|
# Returns a valid value matcher (a literal or regular expression)
|
188
192
|
# @todo This looks odd, asking for an instance that matches a symbol, or a instance that has
|
189
193
|
# a regexp. What is the intention here? Marking as api private...
|
190
|
-
#
|
194
|
+
#
|
191
195
|
# @return [Puppet::Parameter::Value] a valid valud matcher
|
192
196
|
# @api private
|
193
197
|
#
|
data/lib/puppet/parser/ast.rb
CHANGED
@@ -14,7 +14,7 @@ class Puppet::Parser::AST
|
|
14
14
|
include Puppet::Util::MethodHelper
|
15
15
|
include Puppet::Util::Docs
|
16
16
|
|
17
|
-
attr_accessor :parent, :scope, :file, :line
|
17
|
+
attr_accessor :parent, :scope, :file, :line, :pos
|
18
18
|
|
19
19
|
def inspect
|
20
20
|
"( #{self.class} #{self.to_s} #{@children.inspect} )"
|
@@ -110,8 +110,10 @@ require 'puppet/parser/ast/function'
|
|
110
110
|
require 'puppet/parser/ast/hostclass'
|
111
111
|
require 'puppet/parser/ast/ifstatement'
|
112
112
|
require 'puppet/parser/ast/in_operator'
|
113
|
+
require 'puppet/parser/ast/lambda'
|
113
114
|
require 'puppet/parser/ast/leaf'
|
114
115
|
require 'puppet/parser/ast/match_operator'
|
116
|
+
require 'puppet/parser/ast/method_call'
|
115
117
|
require 'puppet/parser/ast/minus'
|
116
118
|
require 'puppet/parser/ast/node'
|
117
119
|
require 'puppet/parser/ast/nop'
|
@@ -11,29 +11,73 @@ class Puppet::Parser::AST
|
|
11
11
|
[@lval,@rval,@operator].each { |child| yield child }
|
12
12
|
end
|
13
13
|
|
14
|
-
#
|
15
|
-
#
|
14
|
+
# Produces an object which is the result of the applying the operator to the of lval and rval operands.
|
15
|
+
# * Supports +, -, *, /, %, and <<, >> on numeric strings.
|
16
|
+
# * Supports + on arrays (concatenate), and hashes (merge)
|
17
|
+
# * Supports << on arrays (append)
|
18
|
+
#
|
16
19
|
def evaluate(scope)
|
17
20
|
# evaluate the operands, should return a boolean value
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
21
|
+
left = @lval.safeevaluate(scope)
|
22
|
+
right = @rval.safeevaluate(scope)
|
23
|
+
|
24
|
+
if left.is_a?(Array) || right.is_a?(Array)
|
25
|
+
eval_array(left, right)
|
26
|
+
elsif left.is_a?(Hash) || right.is_a?(Hash)
|
27
|
+
eval_hash(left, right)
|
28
|
+
else
|
29
|
+
eval_numeric(left, right)
|
22
30
|
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
31
|
+
end
|
32
|
+
|
33
|
+
# Concatenates (+) two arrays, or appends (<<) any object to a newly created array.
|
34
|
+
#
|
35
|
+
def eval_array(left, right)
|
36
|
+
assert_concatenation_supported()
|
37
|
+
|
38
|
+
raise ArgumentError, "operator #{@operator} is not applicable when one of the operands is an Array." unless %w{+ <<}.include?(@operator)
|
39
|
+
raise ArgumentError, "left operand of #{@operator} must be an Array" unless left.is_a?(Array)
|
40
|
+
if @operator == '+'
|
41
|
+
raise ArgumentError, "right operand of #{@operator} must be an Array when left is an Array." unless right.is_a?(Array)
|
42
|
+
return left + right
|
27
43
|
end
|
44
|
+
# only append case remains, left asserted to be an array, and right may be any object
|
45
|
+
# wrapping right in an array and adding it ensures a new copy (operator << mutates).
|
46
|
+
#
|
47
|
+
left + [right]
|
48
|
+
end
|
49
|
+
|
50
|
+
# Merges two hashes.
|
51
|
+
#
|
52
|
+
def eval_hash(left, right)
|
53
|
+
assert_concatenation_supported()
|
54
|
+
|
55
|
+
raise ArgumentError, "operator #{@operator} is not applicable when one of the operands is an Hash." unless @operator == '+'
|
56
|
+
raise ArgumentError, "left operand of #{@operator} must be an Hash" unless left.is_a?(Hash)
|
57
|
+
raise ArgumentError, "right operand of #{@operator} must be an Hash" unless right.is_a?(Hash)
|
58
|
+
# merge produces a merged copy
|
59
|
+
left.merge(right)
|
60
|
+
end
|
61
|
+
|
62
|
+
def eval_numeric(left, right)
|
63
|
+
left = Puppet::Parser::Scope.number?(left)
|
64
|
+
right = Puppet::Parser::Scope.number?(right)
|
65
|
+
raise ArgumentError, "left operand of #{@operator} is not a number" unless left != nil
|
66
|
+
raise ArgumentError, "right operand of #{@operator} is not a number" unless right != nil
|
28
67
|
|
29
68
|
# compute result
|
30
|
-
|
69
|
+
left.send(@operator, right)
|
70
|
+
end
|
71
|
+
|
72
|
+
def assert_concatenation_supported
|
73
|
+
return if Puppet[:parser] == 'future'
|
74
|
+
raise ParseError.new("Unsupported Operation: Array concatenation available with '--parser future' setting only.")
|
31
75
|
end
|
32
76
|
|
33
77
|
def initialize(hash)
|
34
78
|
super
|
35
79
|
|
36
|
-
raise ArgumentError, "Invalid arithmetic operator #{@operator}" unless %w{+ - * / << >>}.include?(@operator)
|
80
|
+
raise ArgumentError, "Invalid arithmetic operator #{@operator}" unless %w{+ - * / % << >>}.include?(@operator)
|
37
81
|
end
|
38
82
|
end
|
39
83
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'puppet/parser/ast/branch'
|
2
|
+
|
3
|
+
class Puppet::Parser::AST
|
4
|
+
class BlockExpression < Branch
|
5
|
+
include Enumerable
|
6
|
+
|
7
|
+
# Evaluate contained expressions, produce result of the last
|
8
|
+
def evaluate(scope)
|
9
|
+
result = nil
|
10
|
+
@children.each do |child|
|
11
|
+
# Skip things that respond to :instantiate (classes, nodes,
|
12
|
+
# and definitions), because they have already been
|
13
|
+
# instantiated.
|
14
|
+
if !child.respond_to?(:instantiate)
|
15
|
+
result = child.safeevaluate(scope)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
result
|
19
|
+
end
|
20
|
+
|
21
|
+
# Return a child by index.
|
22
|
+
def [](index)
|
23
|
+
@children[index]
|
24
|
+
end
|
25
|
+
|
26
|
+
def push(*ary)
|
27
|
+
ary.each { |child|
|
28
|
+
#Puppet.debug "adding %s(%s) of type %s to %s" %
|
29
|
+
# [child, child.object_id, child.class.to_s.sub(/.+::/,''),
|
30
|
+
# self.object_id]
|
31
|
+
@children.push(child)
|
32
|
+
}
|
33
|
+
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_s
|
38
|
+
"[" + @children.collect { |c| c.to_s }.join(', ') + "]"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -6,7 +6,7 @@ class Puppet::Parser::AST
|
|
6
6
|
|
7
7
|
associates_doc
|
8
8
|
|
9
|
-
attr_accessor :name, :arguments
|
9
|
+
attr_accessor :name, :arguments, :pblock
|
10
10
|
|
11
11
|
def evaluate(scope)
|
12
12
|
# Make sure it's a defined function
|
@@ -16,8 +16,16 @@ class Puppet::Parser::AST
|
|
16
16
|
case @ftype
|
17
17
|
when :rvalue
|
18
18
|
raise Puppet::ParseError, "Function '#{@name}' does not return a value" unless Puppet::Parser::Functions.rvalue?(@name)
|
19
|
+
|
19
20
|
when :statement
|
20
|
-
|
21
|
+
# It is harmless to produce an ignored rvalue, the alternative is to mark functions
|
22
|
+
# as appropriate for both rvalue and statements
|
23
|
+
# Keeping the old behavior when a pblock is not present. This since it is not known
|
24
|
+
# if the lambda contains a statement or not (at least not without a costly search).
|
25
|
+
# The purpose of the check is to protect a user for producing a meaningless rvalue where the
|
26
|
+
# operation has no side effects.
|
27
|
+
#
|
28
|
+
if !pblock && Puppet::Parser::Functions.rvalue?(@name)
|
21
29
|
raise Puppet::ParseError,
|
22
30
|
"Function '#{@name}' must be the value of a statement"
|
23
31
|
end
|
@@ -28,6 +36,9 @@ class Puppet::Parser::AST
|
|
28
36
|
# We don't need to evaluate the name, because it's plaintext
|
29
37
|
args = @arguments.safeevaluate(scope).map { |x| x == :undef ? '' : x }
|
30
38
|
|
39
|
+
# append a puppet lambda (unevaluated) if it is defined
|
40
|
+
args << pblock if pblock
|
41
|
+
|
31
42
|
scope.send("function_#{@name}", args)
|
32
43
|
end
|
33
44
|
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'puppet/parser/ast/block_expression'
|
2
|
+
|
3
|
+
class Puppet::Parser::AST
|
4
|
+
# A block of statements/expressions with additional parameters
|
5
|
+
# Requires scope to contain the values for the defined parameters when evaluated
|
6
|
+
# If evaluated without a prepared scope, the lambda will behave like its super class.
|
7
|
+
#
|
8
|
+
class Lambda < AST::BlockExpression
|
9
|
+
|
10
|
+
# The lambda parameters.
|
11
|
+
# These are encoded as an array where each entry is an array of one or two object. The first
|
12
|
+
# is the parameter name, and the optional second object is the value expression (that will
|
13
|
+
# be evaluated when bound to a scope).
|
14
|
+
# The value expression is the default value for the parameter. All default values must be
|
15
|
+
# at the end of the parameter list.
|
16
|
+
#
|
17
|
+
# @return [Array<Array<String,String>>] list of parameter names with optional value expression
|
18
|
+
attr_accessor :parameters
|
19
|
+
# Evaluates each expression/statement and produce the last expression evaluation result
|
20
|
+
# @return [Object] what the last expression evaluated to
|
21
|
+
def evaluate(scope)
|
22
|
+
if @children.is_a? Puppet::Parser::AST::ASTArray
|
23
|
+
result = nil
|
24
|
+
@children.each {|expr| result = expr.evaluate(scope) }
|
25
|
+
result
|
26
|
+
else
|
27
|
+
@children.evaluate(scope)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Calls the lambda.
|
32
|
+
# Assigns argument values in a nested local scope that should be used to evaluate the lambda
|
33
|
+
# and then evaluates the lambda.
|
34
|
+
# @param scope [Puppet::Scope] the calling scope
|
35
|
+
# @return [Object] the result of evaluating the expression(s) in the lambda
|
36
|
+
#
|
37
|
+
def call(scope, *args)
|
38
|
+
raise Puppet::ParseError, "Too many arguments: #{args.size} for #{parameters.size}" unless args.size <= parameters.size
|
39
|
+
merged = parameters.zip(args)
|
40
|
+
missing = merged.select { |e| !e[1] && e[0].size == 1 }
|
41
|
+
unless missing.empty?
|
42
|
+
optional = parameters.count { |p| p.size == 2 }
|
43
|
+
raise Puppet::ParseError, "Too few arguments; #{args.size} for #{optional > 0 ? ' min ' : ''}#{parameters.size - optional}"
|
44
|
+
end
|
45
|
+
|
46
|
+
evaluated = merged.collect do |m|
|
47
|
+
# Ruby 1.8.7 zip seems to produce a different result than Ruby 1.9.3 in some situations
|
48
|
+
n = m[0].is_a?(Array) ? m[0][0] : m[0]
|
49
|
+
v = m[1] || (m[0][1]).safeevaluate(scope) # given value or default expression value
|
50
|
+
[n, v]
|
51
|
+
end
|
52
|
+
|
53
|
+
# Store the evaluated name => value associations in a new inner/local/ephemeral scope
|
54
|
+
# (This is made complicated due to the fact that the implementation of scope is overloaded with
|
55
|
+
# functionality and an inner ephemeral scope must be used (as opposed to just pushing a local scope
|
56
|
+
# on a scope "stack").
|
57
|
+
begin
|
58
|
+
elevel = scope.ephemeral_level
|
59
|
+
scope.ephemeral_from(Hash[evaluated], file, line)
|
60
|
+
result = safeevaluate(scope)
|
61
|
+
ensure
|
62
|
+
scope.unset_ephemeral_var(elevel)
|
63
|
+
result ||= nil
|
64
|
+
end
|
65
|
+
result
|
66
|
+
end
|
67
|
+
|
68
|
+
# Validates the lambda.
|
69
|
+
# Validation checks if parameters with default values are at the end of the list. (It is illegal
|
70
|
+
# to have a parameter with default value followed by one without).
|
71
|
+
#
|
72
|
+
# @raise [Puppet::ParseError] if a parameter with a default comes before a parameter without default value
|
73
|
+
#
|
74
|
+
def validate
|
75
|
+
params = parameters || []
|
76
|
+
defaults = params.drop_while {|p| p.size < 2 }
|
77
|
+
trailing = defaults.drop_while {|p| p.size == 2 }
|
78
|
+
raise Puppet::ParseError, "Lambda parameters with default values must be placed last" unless trailing.empty?
|
79
|
+
end
|
80
|
+
|
81
|
+
# Returns the number of parameters (required and optional)
|
82
|
+
# @return [Integer] the total number of accepted parameters
|
83
|
+
def parameter_count
|
84
|
+
@parameters.size
|
85
|
+
end
|
86
|
+
|
87
|
+
# Returns the number of optional parameters.
|
88
|
+
# @return [Integer] the number of optional accepted parameters
|
89
|
+
def optional_parameter_count
|
90
|
+
@parameters.count {|p| p.size == 2 }
|
91
|
+
end
|
92
|
+
|
93
|
+
def initialize(options)
|
94
|
+
super(options)
|
95
|
+
# ensure there is an empty parameters structure if not given by creator
|
96
|
+
@parameters = [] unless options[:parameters]
|
97
|
+
validate
|
98
|
+
end
|
99
|
+
|
100
|
+
def to_s
|
101
|
+
result = ["{|"]
|
102
|
+
result += @parameters.collect {|p| "#{p[0]}" + (p.size == 2 && p[1]) ? p[1].to_s() : '' }.join(', ')
|
103
|
+
result << "| ... }"
|
104
|
+
result.join('')
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -140,7 +140,7 @@ class Puppet::Parser::AST
|
|
140
140
|
|
141
141
|
def array_index_or_key(object, key)
|
142
142
|
if object.is_a?(Array)
|
143
|
-
raise Puppet::
|
143
|
+
raise Puppet::ParseError, "#{key} is not an integer, but is used as an index of an array" unless key = Puppet::Parser::Scope.number?(key)
|
144
144
|
end
|
145
145
|
key
|
146
146
|
end
|
@@ -148,7 +148,6 @@ class Puppet::Parser::AST
|
|
148
148
|
def evaluate(scope)
|
149
149
|
object = evaluate_container(scope)
|
150
150
|
accesskey = evaluate_key(scope)
|
151
|
-
|
152
151
|
raise Puppet::ParseError, "#{variable} is not an hash or array when accessing it with #{accesskey}" unless object.is_a?(Hash) or object.is_a?(Array)
|
153
152
|
|
154
153
|
object[array_index_or_key(object, accesskey)] || :undef
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'puppet/parser/ast/branch'
|
2
|
+
require 'puppet/parser/methods'
|
3
|
+
|
4
|
+
class Puppet::Parser::AST
|
5
|
+
# An AST object to call a method
|
6
|
+
class MethodCall < AST::Branch
|
7
|
+
|
8
|
+
associates_doc
|
9
|
+
|
10
|
+
# An AST that evaluates to the object the method is applied to
|
11
|
+
# @return [Puppet::Parser::AST]
|
12
|
+
attr_accessor :receiver
|
13
|
+
|
14
|
+
# The name of the method
|
15
|
+
# @return [String]
|
16
|
+
attr_accessor :name
|
17
|
+
|
18
|
+
# The arguments to evaluate as arguments to the method.
|
19
|
+
# @return [Array<Puppet::Parser::AST>]
|
20
|
+
attr_accessor :arguments
|
21
|
+
|
22
|
+
# An optional lambda/block that will be yielded to by the called method (if it supports this)
|
23
|
+
# @return [Puppet::Parser::AST::Lambda]
|
24
|
+
attr_accessor :lambda
|
25
|
+
|
26
|
+
# Evaluates the method call and returns what the called method/function returns.
|
27
|
+
# The evaluation evaluates all arguments in the calling scope and then delegates
|
28
|
+
# to a "method" instance produced by Puppet::Parser::Methods for this method call.
|
29
|
+
# @see Puppet::Parser::Methods
|
30
|
+
# @return [Object] what the called method/function returns
|
31
|
+
def evaluate(scope)
|
32
|
+
# Make sure it's a defined method for the receiver
|
33
|
+
r = @receiver.evaluate(scope)
|
34
|
+
raise Puppet::ParseError, "No object to apply method #{@name} to" unless r
|
35
|
+
m = Puppet::Parser::Methods.find_method(scope, r, @name)
|
36
|
+
raise Puppet::ParseError, "Unknown method #{@name} for #{r}" unless m
|
37
|
+
|
38
|
+
# Now check if rvalue is required (in expressions)
|
39
|
+
case @ftype
|
40
|
+
when :rvalue
|
41
|
+
raise Puppet::ParseError, "Method '#{@name}' does not return a value" unless m.is_rvalue?
|
42
|
+
when :statement
|
43
|
+
# When used as a statement, ignore if it produces a rvalue (it is simply not used)
|
44
|
+
else
|
45
|
+
raise Puppet::DevError, "Invalid method type #{@ftype.inspect}"
|
46
|
+
end
|
47
|
+
|
48
|
+
# Evaluate arguments
|
49
|
+
args = @arguments ? @arguments.safeevaluate(scope).map { |x| x == :undef ? '' : x } : []
|
50
|
+
|
51
|
+
# There is no need to evaluate the name, since it is a literal ruby string
|
52
|
+
|
53
|
+
# call the method (it is already bound to the receiver and name)
|
54
|
+
m.invoke(scope, args, @lambda)
|
55
|
+
end
|
56
|
+
|
57
|
+
def initialize(hash)
|
58
|
+
@ftype = hash[:ftype] || :rvalue
|
59
|
+
hash.delete(:ftype) if hash.include? :ftype
|
60
|
+
|
61
|
+
super(hash)
|
62
|
+
|
63
|
+
# Lastly, check the parity
|
64
|
+
end
|
65
|
+
|
66
|
+
# Sets this method call in statement mode where a produced rvalue is ignored.
|
67
|
+
# @return [void]
|
68
|
+
def ignore_rvalue
|
69
|
+
@ftype = :statement
|
70
|
+
end
|
71
|
+
|
72
|
+
def to_s
|
73
|
+
args = arguments.is_a?(ASTArray) ? arguments.to_s.gsub(/\[(.*)\]/,'\1') : arguments
|
74
|
+
"#{@receiver.to_s}.#{name} (#{args})" + (@lambda ? " #{@lambda.to_s}" : '')
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|