puppet 3.1.1 → 3.2.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
@@ -21,6 +21,13 @@ class Puppet::Parser::AST
|
|
|
21
21
|
scope.setvar(name,value, :file => file, :line => line, :append => @append)
|
|
22
22
|
end
|
|
23
23
|
end
|
|
24
|
+
if @append
|
|
25
|
+
# Produce resulting value from append operation
|
|
26
|
+
scope[name]
|
|
27
|
+
else
|
|
28
|
+
# Produce assigned value
|
|
29
|
+
value
|
|
30
|
+
end
|
|
24
31
|
end
|
|
25
32
|
|
|
26
33
|
def each
|
|
@@ -90,18 +90,19 @@ class Puppet::Parser::Compiler
|
|
|
90
90
|
# This is the main entry into our catalog.
|
|
91
91
|
def compile
|
|
92
92
|
# Set the client's parameters into the top scope.
|
|
93
|
-
set_node_parameters
|
|
94
|
-
create_settings_scope
|
|
93
|
+
Puppet::Util::Profiler.profile("Compile: Set node parameters") { set_node_parameters }
|
|
95
94
|
|
|
96
|
-
|
|
95
|
+
Puppet::Util::Profiler.profile("Compile: Created settings scope") { create_settings_scope }
|
|
97
96
|
|
|
98
|
-
|
|
97
|
+
Puppet::Util::Profiler.profile("Compile: Evaluated main") { evaluate_main }
|
|
99
98
|
|
|
100
|
-
|
|
99
|
+
Puppet::Util::Profiler.profile("Compile: Evaluated AST node") { evaluate_ast_node }
|
|
101
100
|
|
|
102
|
-
|
|
101
|
+
Puppet::Util::Profiler.profile("Compile: Evaluated node classes") { evaluate_node_classes }
|
|
103
102
|
|
|
104
|
-
|
|
103
|
+
Puppet::Util::Profiler.profile("Compile: Evaluated generators") { evaluate_generators }
|
|
104
|
+
|
|
105
|
+
Puppet::Util::Profiler.profile("Compile: Finished catalog") { finish }
|
|
105
106
|
|
|
106
107
|
fail_on_unevaluated
|
|
107
108
|
|
|
@@ -226,17 +227,18 @@ class Puppet::Parser::Compiler
|
|
|
226
227
|
def evaluate_collections
|
|
227
228
|
return false if @collections.empty?
|
|
228
229
|
|
|
229
|
-
found_something = false
|
|
230
230
|
exceptwrap do
|
|
231
231
|
# We have to iterate over a dup of the array because
|
|
232
232
|
# collections can delete themselves from the list, which
|
|
233
233
|
# changes its length and causes some collections to get missed.
|
|
234
|
-
|
|
235
|
-
found_something =
|
|
234
|
+
Puppet::Util::Profiler.profile("Evaluated collections") do
|
|
235
|
+
found_something = false
|
|
236
|
+
@collections.dup.each do |collection|
|
|
237
|
+
found_something = true if collection.evaluate
|
|
238
|
+
end
|
|
239
|
+
found_something
|
|
236
240
|
end
|
|
237
241
|
end
|
|
238
|
-
|
|
239
|
-
found_something
|
|
240
242
|
end
|
|
241
243
|
|
|
242
244
|
# Make sure all of our resources have been evaluated into native resources.
|
|
@@ -244,7 +246,13 @@ class Puppet::Parser::Compiler
|
|
|
244
246
|
# evaluate_generators loop.
|
|
245
247
|
def evaluate_definitions
|
|
246
248
|
exceptwrap do
|
|
247
|
-
|
|
249
|
+
Puppet::Util::Profiler.profile("Evaluated definitions") do
|
|
250
|
+
!unevaluated_resources.each do |resource|
|
|
251
|
+
Puppet::Util::Profiler.profile("Evaluated resource #{resource}") do
|
|
252
|
+
resource.evaluate
|
|
253
|
+
end
|
|
254
|
+
end.empty?
|
|
255
|
+
end
|
|
248
256
|
end
|
|
249
257
|
end
|
|
250
258
|
|
|
@@ -257,9 +265,12 @@ class Puppet::Parser::Compiler
|
|
|
257
265
|
loop do
|
|
258
266
|
done = true
|
|
259
267
|
|
|
260
|
-
#
|
|
261
|
-
|
|
262
|
-
|
|
268
|
+
Puppet::Util::Profiler.profile("Iterated (#{count + 1}) on generators") do
|
|
269
|
+
# Call collections first, then definitions.
|
|
270
|
+
done = false if evaluate_collections
|
|
271
|
+
done = false if evaluate_definitions
|
|
272
|
+
end
|
|
273
|
+
|
|
263
274
|
break if done
|
|
264
275
|
|
|
265
276
|
count += 1
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
require 'puppet/pops'
|
|
2
|
+
|
|
3
|
+
module Puppet; module Parser; end; end;
|
|
4
|
+
# Adapts an egrammar/eparser to respond to the public API of the classic parser
|
|
5
|
+
#
|
|
6
|
+
class Puppet::Parser::EParserAdapter
|
|
7
|
+
|
|
8
|
+
def initialize(classic_parser)
|
|
9
|
+
@classic_parser = classic_parser
|
|
10
|
+
@file = ''
|
|
11
|
+
@string = ''
|
|
12
|
+
@use = :undefined
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def file=(file)
|
|
16
|
+
@classic_parser.file = file
|
|
17
|
+
@file = file
|
|
18
|
+
@use = :file
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def parse(string = nil)
|
|
22
|
+
if @file =~ /\.rb$/
|
|
23
|
+
return parse_ruby_file
|
|
24
|
+
else
|
|
25
|
+
self.string= string if string
|
|
26
|
+
parser = Puppet::Pops::Parser::Parser.new()
|
|
27
|
+
parse_result = if @use == :string
|
|
28
|
+
parser.parse_string(@string)
|
|
29
|
+
else
|
|
30
|
+
parser.parse_file(@file)
|
|
31
|
+
end
|
|
32
|
+
# Compute the source_file to set in created AST objects (it was either given, or it may be unknown
|
|
33
|
+
# if caller did not set a file and the present a string.
|
|
34
|
+
#
|
|
35
|
+
source_file = @file || "unknown-source-location"
|
|
36
|
+
|
|
37
|
+
# Validate
|
|
38
|
+
validate(parse_result)
|
|
39
|
+
|
|
40
|
+
# Transform the result, but only if not nil
|
|
41
|
+
parse_result = Puppet::Pops::Model::AstTransformer.new(source_file, @classic_parser).transform(parse_result) if parse_result
|
|
42
|
+
if parse_result && !parse_result.is_a?(Puppet::Parser::AST::BlockExpression)
|
|
43
|
+
# Need to transform again, if result is not wrapped in something iterable when handed off to
|
|
44
|
+
# a new Hostclass as its code.
|
|
45
|
+
parse_result = Puppet::Parser::AST::BlockExpression.new(:children => [parse_result]) if parse_result
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
Puppet::Parser::AST::Hostclass.new('', :code => parse_result)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def validate(parse_result)
|
|
53
|
+
# TODO: This is too many hoops to jump through... ugly API
|
|
54
|
+
# could reference a ValidatorFactory.validator_3_1(acceptor) instead.
|
|
55
|
+
# and let the factory abstract the rest.
|
|
56
|
+
#
|
|
57
|
+
return unless parse_result
|
|
58
|
+
|
|
59
|
+
acceptor = Puppet::Pops::Validation::Acceptor.new
|
|
60
|
+
validator = Puppet::Pops::Validation::ValidatorFactory_3_1.new().validator(acceptor)
|
|
61
|
+
validator.validate(parse_result)
|
|
62
|
+
|
|
63
|
+
max_errors = Puppet[:max_errors]
|
|
64
|
+
max_warnings = Puppet[:max_warnings] + 1
|
|
65
|
+
max_deprecations = Puppet[:max_deprecations] + 1
|
|
66
|
+
|
|
67
|
+
# If there are warnings output them
|
|
68
|
+
warnings = acceptor.warnings
|
|
69
|
+
if warnings.size > 0
|
|
70
|
+
formatter = Puppet::Pops::Validation::DiagnosticFormatterPuppetStyle.new
|
|
71
|
+
emitted_w = 0
|
|
72
|
+
emitted_dw = 0
|
|
73
|
+
acceptor.warnings.each {|w|
|
|
74
|
+
if w.severity == :deprecation
|
|
75
|
+
# Do *not* call Puppet.deprecation_warning it is for internal deprecation, not
|
|
76
|
+
# deprecation of constructs in manifests! (It is not designed for that purpose even if
|
|
77
|
+
# used throughout the code base).
|
|
78
|
+
#
|
|
79
|
+
Puppet.warning(formatter.format(w)) if emitted_dw < max_deprecations
|
|
80
|
+
emitted_dw += 1
|
|
81
|
+
else
|
|
82
|
+
Puppet.warning(formatter.format(w)) if emitted_w < max_warnings
|
|
83
|
+
emitted_w += 1
|
|
84
|
+
end
|
|
85
|
+
break if emitted_w > max_warnings && emitted_dw > max_deprecations # but only then
|
|
86
|
+
}
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# If there were errors, report the first found. Use a puppet style formatter.
|
|
90
|
+
errors = acceptor.errors
|
|
91
|
+
if errors.size > 0
|
|
92
|
+
formatter = Puppet::Pops::Validation::DiagnosticFormatterPuppetStyle.new
|
|
93
|
+
if errors.size == 1 || max_errors <= 1
|
|
94
|
+
# raise immediately
|
|
95
|
+
raise Puppet::ParseError.new(formatter.format(errors[0]))
|
|
96
|
+
end
|
|
97
|
+
emitted = 0
|
|
98
|
+
errors.each do |e|
|
|
99
|
+
Puppet.err(formatter.format(e))
|
|
100
|
+
emitted += 1
|
|
101
|
+
break if emitted >= max_errors
|
|
102
|
+
end
|
|
103
|
+
warnings_message = warnings.size > 0 ? ", and #{warnings.size} warnings" : ""
|
|
104
|
+
giving_up_message = "Found #{errors.size} errors#{warnings_message}. Giving up"
|
|
105
|
+
exception = Puppet::ParseError.new(giving_up_message)
|
|
106
|
+
exception.file = errors[0].file
|
|
107
|
+
raise exception
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def string=(string)
|
|
112
|
+
@classic_parser.string = string
|
|
113
|
+
@string = string
|
|
114
|
+
@use = :string
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def parse_ruby_file
|
|
118
|
+
@classic_parser.parse
|
|
119
|
+
end
|
|
120
|
+
end
|
data/lib/puppet/parser/files.rb
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
require 'puppet/module'
|
|
2
|
-
require 'puppet/parser/parser'
|
|
2
|
+
#require 'puppet/parser/parser'
|
|
3
3
|
|
|
4
4
|
# This is a silly central module for finding
|
|
5
5
|
# different kinds of files while parsing. This code
|
|
6
6
|
# doesn't really belong in the Puppet::Module class,
|
|
7
7
|
# but it doesn't really belong anywhere else, either.
|
|
8
|
-
module Puppet
|
|
8
|
+
module Puppet; module Parser; module Files
|
|
9
|
+
|
|
9
10
|
module_function
|
|
10
11
|
|
|
11
12
|
# Return a list of manifests (as absolute filenames) that match +pat+
|
|
@@ -28,9 +29,9 @@ module Puppet::Parser::Files
|
|
|
28
29
|
end
|
|
29
30
|
|
|
30
31
|
# Find the concrete file denoted by +file+. If +file+ is absolute,
|
|
31
|
-
# return it directly. Otherwise try to find
|
|
32
|
-
#
|
|
33
|
-
#
|
|
32
|
+
# return it directly. Otherwise try to find relative to the +templatedir+
|
|
33
|
+
# config param. If that fails try to find it as a template in a
|
|
34
|
+
# module.
|
|
34
35
|
# In all cases, an absolute path is returned, which does not
|
|
35
36
|
# necessarily refer to an existing file
|
|
36
37
|
def find_template(template, environment = nil)
|
|
@@ -85,4 +86,4 @@ module Puppet::Parser::Files
|
|
|
85
86
|
path.split(File::SEPARATOR, 2) unless path == "" or Puppet::Util.absolute_path?(path)
|
|
86
87
|
end
|
|
87
88
|
|
|
88
|
-
end
|
|
89
|
+
end; end; end
|
|
@@ -137,15 +137,17 @@ module Puppet::Parser::Functions
|
|
|
137
137
|
|
|
138
138
|
fname = "function_#{name}"
|
|
139
139
|
environment_module.send(:define_method, fname) do |*args|
|
|
140
|
-
|
|
141
|
-
if
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
140
|
+
Puppet::Util::Profiler.profile("Called #{name}") do
|
|
141
|
+
if args[0].is_a? Array
|
|
142
|
+
if arity >= 0 and args[0].size != arity
|
|
143
|
+
raise ArgumentError, "#{name}(): Wrong number of arguments given (#{args[0].size} for #{arity})"
|
|
144
|
+
elsif arity < 0 and args[0].size < (arity+1).abs
|
|
145
|
+
raise ArgumentError, "#{name}(): Wrong number of arguments given (#{args[0].size} for minimum #{(arity+1).abs})"
|
|
146
|
+
end
|
|
147
|
+
self.send(real_fname, args[0])
|
|
148
|
+
else
|
|
149
|
+
raise ArgumentError, "custom functions must be called with a single array that contains the arguments. For example, function_example([1]) instead of function_example(1)"
|
|
145
150
|
end
|
|
146
|
-
self.send(real_fname, args[0])
|
|
147
|
-
else
|
|
148
|
-
raise ArgumentError, "custom functions must be called with a single array that contains the arguments. For example, function_example([1]) instead of function_example(1)"
|
|
149
151
|
end
|
|
150
152
|
end
|
|
151
153
|
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require 'puppet/parser/ast/lambda'
|
|
2
|
+
|
|
3
|
+
Puppet::Parser::Functions::newfunction(
|
|
4
|
+
:collect,
|
|
5
|
+
:type => :rvalue,
|
|
6
|
+
:arity => 2,
|
|
7
|
+
:doc => <<-'ENDHEREDOC') do |args|
|
|
8
|
+
Applies a parameterized block to each element in a sequence of entries from the first
|
|
9
|
+
argument and returns an array with the result of each invocation of the parameterized block.
|
|
10
|
+
|
|
11
|
+
This function takes two mandatory arguments: the first should be an Array or a Hash, and the second
|
|
12
|
+
a parameterized block as produced by the puppet syntax:
|
|
13
|
+
|
|
14
|
+
$a.collect |$x| { ... }
|
|
15
|
+
|
|
16
|
+
When the first argument is an Array, the block is called with each entry in turn. When the first argument
|
|
17
|
+
is a hash the entry is an array with `[key, value]`.
|
|
18
|
+
|
|
19
|
+
*Examples*
|
|
20
|
+
|
|
21
|
+
# Turns hash into array of values
|
|
22
|
+
$a.collect |$x|{ $x[1] }
|
|
23
|
+
|
|
24
|
+
# Turns hash into array of keys
|
|
25
|
+
$a.collect |$x| { $x[0] }
|
|
26
|
+
|
|
27
|
+
Since 3.2
|
|
28
|
+
ENDHEREDOC
|
|
29
|
+
|
|
30
|
+
receiver = args[0]
|
|
31
|
+
pblock = args[1]
|
|
32
|
+
|
|
33
|
+
raise ArgumentError, ("collect(): wrong argument type (#{pblock.class}; must be a parameterized block.") unless pblock.is_a? Puppet::Parser::AST::Lambda
|
|
34
|
+
|
|
35
|
+
case receiver
|
|
36
|
+
when Array
|
|
37
|
+
when Hash
|
|
38
|
+
else
|
|
39
|
+
raise ArgumentError, ("collect(): wrong argument type (#{receiver.class}; must be an Array or a Hash.")
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
receiver.to_a.collect {|x| pblock.call(self, x) }
|
|
43
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
Puppet::Parser::Functions::newfunction(
|
|
2
|
+
:each,
|
|
3
|
+
:type => :rvalue,
|
|
4
|
+
:arity => 2,
|
|
5
|
+
:doc => <<-'ENDHEREDOC') do |args|
|
|
6
|
+
Applies a parameterized block to each element in a sequence of selected entries from the first
|
|
7
|
+
argument and returns the first argument.
|
|
8
|
+
|
|
9
|
+
This function takes two mandatory arguments: the first should be an Array or a Hash, and the second
|
|
10
|
+
a parameterized block as produced by the puppet syntax:
|
|
11
|
+
|
|
12
|
+
$a.each {|$x| ... }
|
|
13
|
+
|
|
14
|
+
When the first argument is an Array, the parameterized block should define one or two block parameters.
|
|
15
|
+
For each application of the block, the next element from the array is selected, and it is passed to
|
|
16
|
+
the block if the block has one parameter. If the block has two parameters, the first is the elements
|
|
17
|
+
index, and the second the value. The index starts from 0.
|
|
18
|
+
|
|
19
|
+
$a.each {|$index, $value| ... }
|
|
20
|
+
|
|
21
|
+
When the first argument is a Hash, the parameterized block should define one or two parameters.
|
|
22
|
+
When one parameter is defined, the iteration is performed with each entry as an array of `[key, value]`,
|
|
23
|
+
and when two parameters are defined the iteration is performed with key and value.
|
|
24
|
+
|
|
25
|
+
$a.each {|$entry| ..."key ${$entry[0]}, value ${$entry[1]}" }
|
|
26
|
+
$a.each {|$key, $value| ..."key ${key}, value ${value}" }
|
|
27
|
+
|
|
28
|
+
Since 3.2
|
|
29
|
+
ENDHEREDOC
|
|
30
|
+
require 'puppet/parser/ast/lambda'
|
|
31
|
+
|
|
32
|
+
def foreach_Array(o, scope, pblock)
|
|
33
|
+
return nil unless pblock
|
|
34
|
+
|
|
35
|
+
serving_size = pblock.parameter_count
|
|
36
|
+
if serving_size == 0
|
|
37
|
+
raise ArgumentError, "Block must define at least one parameter; value."
|
|
38
|
+
end
|
|
39
|
+
if serving_size > 2
|
|
40
|
+
raise ArgumentError, "Block must define at most two parameters; index, value"
|
|
41
|
+
end
|
|
42
|
+
enumerator = o.each
|
|
43
|
+
index = 0
|
|
44
|
+
result = nil
|
|
45
|
+
if serving_size == 1
|
|
46
|
+
(o.size).times do
|
|
47
|
+
pblock.call(scope, enumerator.next)
|
|
48
|
+
end
|
|
49
|
+
else
|
|
50
|
+
(o.size).times do
|
|
51
|
+
pblock.call(scope, index, enumerator.next)
|
|
52
|
+
index = index +1
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
o
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def foreach_Hash(o, scope, pblock)
|
|
59
|
+
return nil unless pblock
|
|
60
|
+
serving_size = pblock.parameter_count
|
|
61
|
+
case serving_size
|
|
62
|
+
when 0
|
|
63
|
+
raise ArgumentError, "Block must define at least one parameter (for hash entry key)."
|
|
64
|
+
when 1
|
|
65
|
+
when 2
|
|
66
|
+
else
|
|
67
|
+
raise ArgumentError, "Block must define at most two parameters (for hash entry key and value)."
|
|
68
|
+
end
|
|
69
|
+
enumerator = o.each_pair
|
|
70
|
+
result = nil
|
|
71
|
+
if serving_size == 1
|
|
72
|
+
(o.size).times do
|
|
73
|
+
pblock.call(scope, enumerator.next)
|
|
74
|
+
end
|
|
75
|
+
else
|
|
76
|
+
(o.size).times do
|
|
77
|
+
pblock.call(scope, *enumerator.next)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
o
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
raise ArgumentError, ("each(): wrong number of arguments (#{args.length}; must be 2)") if args.length != 2
|
|
84
|
+
receiver = args[0]
|
|
85
|
+
pblock = args[1]
|
|
86
|
+
raise ArgumentError, ("each(): wrong argument type (#{args[1].class}; must be a parameterized block.") unless pblock.is_a? Puppet::Parser::AST::Lambda
|
|
87
|
+
|
|
88
|
+
case receiver
|
|
89
|
+
when Array
|
|
90
|
+
foreach_Array(receiver, self, pblock)
|
|
91
|
+
when Hash
|
|
92
|
+
foreach_Hash(receiver, self, pblock)
|
|
93
|
+
else
|
|
94
|
+
raise ArgumentError, ("each(): wrong argument type (#{args[0].class}; must be an Array or a Hash.")
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
Puppet::Parser::Functions::newfunction(
|
|
2
|
+
:foreach,
|
|
3
|
+
:type => :rvalue,
|
|
4
|
+
:arity => 2,
|
|
5
|
+
:doc => <<-'ENDHEREDOC') do |args|
|
|
6
|
+
Applies a parameterized block to each element in a sequence of selected entries from the first
|
|
7
|
+
argument and returns the first argument.
|
|
8
|
+
|
|
9
|
+
This function takes two mandatory arguments: the first should be an Array or a Hash, and the second
|
|
10
|
+
a parameterized block as produced by the puppet syntax:
|
|
11
|
+
|
|
12
|
+
$a.foreach {|$x| ... }
|
|
13
|
+
|
|
14
|
+
When the first argument is an Array, the parameterized block should define one or two block parameters.
|
|
15
|
+
For each application of the block, the next element from the array is selected, and it is passed to
|
|
16
|
+
the block if the block has one parameter. If the block has two parameters, the first is the elements
|
|
17
|
+
index, and the second the value. The index starts from 0.
|
|
18
|
+
|
|
19
|
+
$a.foreach {|$index, $value| ... }
|
|
20
|
+
|
|
21
|
+
When the first argument is a Hash, the parameterized block should define one or two parameters.
|
|
22
|
+
When one parameter is defined, the iteration is performed with each entry as an array of `[key, value]`,
|
|
23
|
+
and when two parameters are defined the iteration is performed with key and value.
|
|
24
|
+
|
|
25
|
+
$a.foreach {|$entry| ..."key ${$entry[0]}, value ${$entry[1]}" }
|
|
26
|
+
$a.foreach {|$key, $value| ..."key ${key}, value ${value}" }
|
|
27
|
+
|
|
28
|
+
Since 3.2
|
|
29
|
+
ENDHEREDOC
|
|
30
|
+
require 'puppet/parser/ast/lambda'
|
|
31
|
+
|
|
32
|
+
def foreach_Array(o, scope, pblock)
|
|
33
|
+
return nil unless pblock
|
|
34
|
+
|
|
35
|
+
serving_size = pblock.parameter_count
|
|
36
|
+
if serving_size == 0
|
|
37
|
+
raise ArgumentError, "Block must define at least one parameter; value."
|
|
38
|
+
end
|
|
39
|
+
if serving_size > 2
|
|
40
|
+
raise ArgumentError, "Block must define at most two parameters; index, value"
|
|
41
|
+
end
|
|
42
|
+
enumerator = o.each
|
|
43
|
+
index = 0
|
|
44
|
+
result = nil
|
|
45
|
+
if serving_size == 1
|
|
46
|
+
(o.size).times do
|
|
47
|
+
pblock.call(scope, enumerator.next)
|
|
48
|
+
end
|
|
49
|
+
else
|
|
50
|
+
(o.size).times do
|
|
51
|
+
pblock.call(scope, index, enumerator.next)
|
|
52
|
+
index = index +1
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
o
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def foreach_Hash(o, scope, pblock)
|
|
59
|
+
return nil unless pblock
|
|
60
|
+
serving_size = pblock.parameter_count
|
|
61
|
+
case serving_size
|
|
62
|
+
when 0
|
|
63
|
+
raise ArgumentError, "Block must define at least one parameter (for hash entry key)."
|
|
64
|
+
when 1
|
|
65
|
+
when 2
|
|
66
|
+
else
|
|
67
|
+
raise ArgumentError, "Block must define at most two parameters (for hash entry key and value)."
|
|
68
|
+
end
|
|
69
|
+
enumerator = o.each_pair
|
|
70
|
+
result = nil
|
|
71
|
+
if serving_size == 1
|
|
72
|
+
(o.size).times do
|
|
73
|
+
pblock.call(scope, enumerator.next)
|
|
74
|
+
end
|
|
75
|
+
else
|
|
76
|
+
(o.size).times do
|
|
77
|
+
pblock.call(scope, *enumerator.next)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
o
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
raise ArgumentError, ("foreach(): wrong number of arguments (#{args.length}; must be 2)") if args.length != 2
|
|
84
|
+
receiver = args[0]
|
|
85
|
+
pblock = args[1]
|
|
86
|
+
raise ArgumentError, ("foreach(): wrong argument type (#{args[1].class}; must be a parameterized block.") unless pblock.is_a? Puppet::Parser::AST::Lambda
|
|
87
|
+
|
|
88
|
+
case receiver
|
|
89
|
+
when Array
|
|
90
|
+
foreach_Array(receiver, self, pblock)
|
|
91
|
+
when Hash
|
|
92
|
+
foreach_Hash(receiver, self, pblock)
|
|
93
|
+
else
|
|
94
|
+
raise ArgumentError, ("foreach(): wrong argument type (#{args[0].class}; must be an Array or a Hash.")
|
|
95
|
+
end
|
|
96
|
+
end
|