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
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'find'
|
2
2
|
require 'forwardable'
|
3
3
|
require 'puppet/node/environment'
|
4
|
+
require 'puppet/parser/parser_factory'
|
4
5
|
|
5
6
|
class Puppet::Parser::TypeLoader
|
6
7
|
extend Forwardable
|
@@ -137,7 +138,8 @@ class Puppet::Parser::TypeLoader
|
|
137
138
|
|
138
139
|
def parse_file(file)
|
139
140
|
Puppet.debug("importing '#{file}' in environment #{environment}")
|
140
|
-
parser = Puppet::Parser::Parser.new(environment)
|
141
|
+
# parser = Puppet::Parser::Parser.new(environment)
|
142
|
+
parser = Puppet::Parser::ParserFactory.parser(environment)
|
141
143
|
parser.file = file
|
142
144
|
return parser.parse
|
143
145
|
end
|
data/lib/puppet/pops.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
module Puppet
|
2
|
+
module Pops
|
3
|
+
require 'puppet/pops/patterns'
|
4
|
+
require 'puppet/pops/utils'
|
5
|
+
|
6
|
+
require 'puppet/pops/adaptable'
|
7
|
+
require 'puppet/pops/adapters'
|
8
|
+
|
9
|
+
require 'puppet/pops/visitable'
|
10
|
+
require 'puppet/pops/visitor'
|
11
|
+
|
12
|
+
require 'puppet/pops/containment'
|
13
|
+
|
14
|
+
require 'puppet/pops/issues'
|
15
|
+
require 'puppet/pops/label_provider'
|
16
|
+
require 'puppet/pops/validation'
|
17
|
+
|
18
|
+
require 'puppet/pops/model/model'
|
19
|
+
|
20
|
+
module Model
|
21
|
+
require 'puppet/pops/model/tree_dumper'
|
22
|
+
require 'puppet/pops/model/ast_transformer'
|
23
|
+
require 'puppet/pops/model/ast_tree_dumper'
|
24
|
+
require 'puppet/pops/model/factory'
|
25
|
+
require 'puppet/pops/model/model_tree_dumper'
|
26
|
+
require 'puppet/pops/model/model_label_provider'
|
27
|
+
end
|
28
|
+
|
29
|
+
module Parser
|
30
|
+
require 'puppet/pops/parser/eparser'
|
31
|
+
require 'puppet/pops/parser/parser_support'
|
32
|
+
require 'puppet/pops/parser/lexer'
|
33
|
+
end
|
34
|
+
|
35
|
+
module Validation
|
36
|
+
require 'puppet/pops/validation/checker3_1'
|
37
|
+
require 'puppet/pops/validation/validator_factory_3_1'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,190 @@
|
|
1
|
+
# Adaptable is a mix-in module that adds adaptability to a class.
|
2
|
+
# This means that an adapter can
|
3
|
+
# associate itself with an instance of the class and store additional data/have behavior.
|
4
|
+
#
|
5
|
+
# This mechanism should be used when there is a desire to keep implementation concerns separate.
|
6
|
+
# In Ruby it is always possible to open and modify a class or instance to teach it new tricks, but it
|
7
|
+
# is however not possible to do this for two different versions of some service at the same time.
|
8
|
+
# The Adaptable pattern is also good when only a few of the objects of some class needs to have extra
|
9
|
+
# information (again possible in Ruby by adding instance variables dynamically). In fact, the implementation
|
10
|
+
# of Adaptable does just that; it adds an instance variable named after the adapter class and keeps an
|
11
|
+
# instance of this class in this slot.
|
12
|
+
#
|
13
|
+
# @note the implementation details; the fact that an instance variable is used to keep the adapter
|
14
|
+
# instance data should not
|
15
|
+
# be exploited as the implementation of _being adaptable_ may change in the future.
|
16
|
+
# @api private
|
17
|
+
#
|
18
|
+
module Puppet::Pops::Adaptable
|
19
|
+
# Base class for an Adapter.
|
20
|
+
#
|
21
|
+
# A typical adapter just defines some accessors.
|
22
|
+
#
|
23
|
+
# A more advanced adapter may need to setup the adapter based on the object it is adapting.
|
24
|
+
# @example Making Duck adaptable
|
25
|
+
# class Duck
|
26
|
+
# include Puppet::Pops::Adaptable
|
27
|
+
# end
|
28
|
+
# @example Giving a Duck a nick name
|
29
|
+
# class NickNameAdapter < Puppet::Pops::Adaptable::Adapter
|
30
|
+
# attr_accessor :nick_name
|
31
|
+
# end
|
32
|
+
# d = Duck.new
|
33
|
+
# NickNameAdapter.adapt(d).nick_name = "Daffy"
|
34
|
+
# NickNameAdapter.get(d).nick_name # => "Daffy"
|
35
|
+
#
|
36
|
+
# @example Giving a Duck a more elaborate nick name
|
37
|
+
# class NickNameAdapter < Puppet::Pops::Adaptable::Adapter
|
38
|
+
# attr_accessor :nick_name, :object
|
39
|
+
# def initialize o
|
40
|
+
# @object = o
|
41
|
+
# @nick_name = "Yo"
|
42
|
+
# end
|
43
|
+
# def nick_name
|
44
|
+
# "#{@nick_name}, the #{o.class.name}"
|
45
|
+
# end
|
46
|
+
# def NickNameAdapter.create_adapter(o)
|
47
|
+
# x = new o
|
48
|
+
# x
|
49
|
+
# end
|
50
|
+
# end
|
51
|
+
# d = Duck.new
|
52
|
+
# n = NickNameAdapter.adapt(d)
|
53
|
+
# n.nick_name # => "Yo, the Duck"
|
54
|
+
# n.nick_name = "Daffy"
|
55
|
+
# n.nick_name # => "Daffy, the Duck"
|
56
|
+
# @example Using a block to set values
|
57
|
+
# NickNameAdapter.adapt(o) { |a| a.nick_name = "Buddy!" }
|
58
|
+
# NickNameAdapter.adapt(o) { |a, o| a.nick_name = "You're the best #{o.class.name} I met."}
|
59
|
+
#
|
60
|
+
class Adapter
|
61
|
+
# Returns an existing adapter for the given object, or nil, if the object is not
|
62
|
+
# adapted.
|
63
|
+
#
|
64
|
+
# @param o [Adaptable] object to get adapter from
|
65
|
+
# @return [Adapter<self>] an adapter of the same class as the receiver of #get
|
66
|
+
# @return [nil] if the given object o has not been adapted by the receiving adapter
|
67
|
+
# @raise [ArgumentError] if the object is not adaptable
|
68
|
+
#
|
69
|
+
def self.get(o)
|
70
|
+
attr_name = :"@#{instance_var_name(self.name)}"
|
71
|
+
if existing = o.instance_variable_defined?(attr_name)
|
72
|
+
o.instance_variable_get(attr_name)
|
73
|
+
else
|
74
|
+
nil
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Returns an existing adapter for the given object, or creates a new adapter if the
|
79
|
+
# object has not been adapted, or the adapter has been cleared.
|
80
|
+
#
|
81
|
+
# @example Using a block to set values
|
82
|
+
# NickNameAdapter.adapt(o) { |a| a.nick_name = "Buddy!" }
|
83
|
+
# NickNameAdapter.adapt(o) { |a, o| a.nick_name = "Your the best #{o.class.name} I met."}
|
84
|
+
# @overload adapt(o)
|
85
|
+
# @overload adapt(o, {|adapter| block})
|
86
|
+
# @overload adapt(o, {|adapter, o| block})
|
87
|
+
# @param o [Adaptable] object to add adapter to
|
88
|
+
# @yieldparam adapter [Adapter<self>] the created adapter
|
89
|
+
# @yieldparam o [Adaptable] optional, the given adaptable
|
90
|
+
# @param block [Proc] optional, evaluated in the context of the adapter (existing or new)
|
91
|
+
# @return [Adapter<self>] an adapter of the same class as the receiver of the call
|
92
|
+
# @raise [ArgumentError] if the given object o is not adaptable
|
93
|
+
#
|
94
|
+
def self.adapt(o, &block)
|
95
|
+
attr_name = :"@#{instance_var_name(self.name)}"
|
96
|
+
adapter = if existing = o.instance_variable_defined?(attr_name) && value = o.instance_variable_get(attr_name)
|
97
|
+
value
|
98
|
+
else
|
99
|
+
associate_adapter(create_adapter(o), o)
|
100
|
+
end
|
101
|
+
if block_given?
|
102
|
+
case block.arity
|
103
|
+
when 1
|
104
|
+
block.call(adapter)
|
105
|
+
else
|
106
|
+
block.call(adapter, o)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
adapter
|
110
|
+
end
|
111
|
+
|
112
|
+
# Creates a new adapter, associates it with the given object and returns the adapter.
|
113
|
+
#
|
114
|
+
# @example Using a block to set values
|
115
|
+
# NickNameAdapter.adapt_new(o) { |a| a.nick_name = "Buddy!" }
|
116
|
+
# NickNameAdapter.adapt_new(o) { |a, o| a.nick_name = "Your the best #{o.class.name} I met."}
|
117
|
+
# This is used when a fresh adapter is wanted instead of possible returning an
|
118
|
+
# existing adapter as in the case of {Adapter.adapt}.
|
119
|
+
# @overload adapt_new(o)
|
120
|
+
# @overload adapt_new(o, {|adapter| block})
|
121
|
+
# @overload adapt_new(o, {|adapter, o| block})
|
122
|
+
# @yieldparam adapter [Adapter<self>] the created adapter
|
123
|
+
# @yieldparam o [Adaptable] optional, the given adaptable
|
124
|
+
# @param o [Adaptable] object to add adapter to
|
125
|
+
# @param block [Proc] optional, evaluated in the context of the new adapter
|
126
|
+
# @return [Adapter<self>] an adapter of the same class as the receiver of the call
|
127
|
+
# @raise [ArgumentError] if the given object o is not adaptable
|
128
|
+
#
|
129
|
+
def self.adapt_new(o, &block)
|
130
|
+
adapter = associate_adapter(create_adapter(o), o)
|
131
|
+
if block_given?
|
132
|
+
case block.arity
|
133
|
+
when 1
|
134
|
+
block.call(adapter)
|
135
|
+
else
|
136
|
+
block.call(adapter, o)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
adapter
|
140
|
+
end
|
141
|
+
|
142
|
+
# Clears the adapter set in the given object o. Returns any set adapter or nil.
|
143
|
+
# @param o [Adaptable] the object where the adapter should be cleared
|
144
|
+
# @return [Adapter] if an adapter was set
|
145
|
+
# @return [nil] if the adapter has not been set
|
146
|
+
#
|
147
|
+
def self.clear(o)
|
148
|
+
attr_name = :"@#{instance_var_name(self.name)}"
|
149
|
+
if o.instance_variable_defined?(attr_name)
|
150
|
+
o.send(:remove_instance_variable, attr_name)
|
151
|
+
else
|
152
|
+
nil
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
# This base version creates an instance of the class (i.e. an instance of the concrete subclass
|
157
|
+
# of Adapter). A Specialization may want to create an adapter instance specialized for the given target
|
158
|
+
# object.
|
159
|
+
# @param o [Adaptable] The object to adapt. This implementation ignores this variable, but a
|
160
|
+
# specialization may want to initialize itself differently depending on the object it is adapting.
|
161
|
+
# @return [Adapter<self>] instance of the subclass of Adapter receiving the call
|
162
|
+
#
|
163
|
+
def self.create_adapter(o)
|
164
|
+
new
|
165
|
+
end
|
166
|
+
|
167
|
+
# Associates the given adapter with the given target object
|
168
|
+
# @param adapter [Adapter] the adapter to associate with the given object _o_
|
169
|
+
# @param o [Adaptable] the object to adapt
|
170
|
+
# @return [adapter] the given adapter
|
171
|
+
#
|
172
|
+
def self.associate_adapter(adapter, o)
|
173
|
+
attr_name = :"@#{instance_var_name(adapter.class.name)}"
|
174
|
+
o.instance_variable_set(attr_name, adapter)
|
175
|
+
adapter
|
176
|
+
end
|
177
|
+
|
178
|
+
# Returns a suitable instance variable name given a class name.
|
179
|
+
# The returned string is the fully qualified name of a class with '::' replaced by '_' since
|
180
|
+
# '::' is not allowed in an instance variable name.
|
181
|
+
# @param name [String] the fully qualified name of a class
|
182
|
+
# @return [String] the name with all '::' replaced by '_'
|
183
|
+
# @api private
|
184
|
+
# @private
|
185
|
+
#
|
186
|
+
def self.instance_var_name(name)
|
187
|
+
name.split("::").join('_')
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# The Adapters module contains adapters for Documentation, Origin, SourcePosition, and Loader.
|
2
|
+
#
|
3
|
+
module Puppet::Pops::Adapters
|
4
|
+
# A documentation adapter adapts an object with a documentation string.
|
5
|
+
# (The intended use is for a source text parser to extract documentation and store this
|
6
|
+
# in DocumentationAdapter instances).
|
7
|
+
#
|
8
|
+
class DocumentationAdapter < Puppet::Pops::Adaptable::Adapter
|
9
|
+
# @return [String] The documentation associated with an object
|
10
|
+
attr_accessor :documentation
|
11
|
+
end
|
12
|
+
|
13
|
+
# An origin adapter adapts an object with where it came from. This origin
|
14
|
+
# describes the resource (a file, etc.) where source text originates.
|
15
|
+
# Instances of SourcePosAdapter is then used on other objects in a model to
|
16
|
+
# describe their relative position versus the origin.
|
17
|
+
#
|
18
|
+
# @see Puppet::Pops::Utils#find_adapter
|
19
|
+
#
|
20
|
+
class OriginAdapter < Puppet::Pops::Adaptable::Adapter
|
21
|
+
# @return [String] the origin of the adapted (usually a filename)
|
22
|
+
attr_accessor :origin
|
23
|
+
end
|
24
|
+
|
25
|
+
# A SourcePosAdapter describes a position relative to an origin. (Typically an {OriginAdapter} is
|
26
|
+
# associated with the root of a model. This origin has a URI to the resource, and a line number.
|
27
|
+
# The offset in the SourcePosAdapter is then relative to this origin.
|
28
|
+
# (This somewhat complex structure makes it possible to correctly refer to a source position
|
29
|
+
# in source that is embedded in some resource; a parser only sees the embedded snippet of source text
|
30
|
+
# and does not know where it was embedded).
|
31
|
+
#
|
32
|
+
# @see Puppet::Pops::Utils#find_adapter
|
33
|
+
#
|
34
|
+
class SourcePosAdapter < Puppet::Pops::Adaptable::Adapter
|
35
|
+
# @return [Fixnum] The start line in source starting from 1
|
36
|
+
attr_accessor :line
|
37
|
+
|
38
|
+
# @return [Fixnum] The position on the start_line (in characters) starting from 0
|
39
|
+
attr_accessor :pos
|
40
|
+
|
41
|
+
# @return [Fixnum] The (start) offset of source text characters
|
42
|
+
# (starting from 0) representing the adapted object.
|
43
|
+
# Value may be nil
|
44
|
+
attr_accessor :offset
|
45
|
+
|
46
|
+
# @return [Fixnum] The length (count) of characters of source text
|
47
|
+
# representing the adapted object from the origin. Not including any
|
48
|
+
# trailing whitespace.
|
49
|
+
attr_accessor :length
|
50
|
+
end
|
51
|
+
|
52
|
+
# A LoaderAdapter adapts an object with a {Puppet::Pops::Loader}. This is used to make further loading from the
|
53
|
+
# perspective of the adapted object take place in the perspective of this Loader.
|
54
|
+
#
|
55
|
+
# It is typically enough to adapt the root of a model as a search is made towards the root of the model
|
56
|
+
# until a loader is found, but there is no harm in duplicating this information provided a contained
|
57
|
+
# object is adapted with the correct loader.
|
58
|
+
#
|
59
|
+
# @see Puppet::Pops::Utils#find_adapter
|
60
|
+
#
|
61
|
+
class LoaderAdapter < Puppet::Pops::Adaptable::Adapter
|
62
|
+
# @return [Puppet::Pops::Loader] the loader
|
63
|
+
attr_accessor :loader
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# FIXME: This module should be updated when a newer version of RGen (>0.6.2) adds required meta model "e-method" supports.
|
2
|
+
#
|
3
|
+
module Puppet::Pops::Containment
|
4
|
+
# Returns Enumerable, thus allowing
|
5
|
+
# some_element.eAllContents each {|contained| }
|
6
|
+
# This is a depth first enumeration where parent appears before children.
|
7
|
+
# @note the top-most object itself is not included in the enumeration, only what it contains.
|
8
|
+
def eAllContents
|
9
|
+
EAllContentsEnumerator.new(self)
|
10
|
+
end
|
11
|
+
|
12
|
+
class EAllContentsEnumerator
|
13
|
+
include Enumerable
|
14
|
+
def initialize o
|
15
|
+
@element = o
|
16
|
+
end
|
17
|
+
|
18
|
+
def each &block
|
19
|
+
if block_given?
|
20
|
+
eAllContents(@element, &block)
|
21
|
+
@element
|
22
|
+
else
|
23
|
+
self
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def eAllContents(element, &block)
|
28
|
+
element.class.ecore.eAllReferences.select{|r| r.containment}.each do |r|
|
29
|
+
children = element.getGenericAsArray(r.name)
|
30
|
+
children.each do |c|
|
31
|
+
block.call(c)
|
32
|
+
eAllContents(c, &block)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,258 @@
|
|
1
|
+
# Defines classes to deal with issues, and message formatting and defines constants with Issues.
|
2
|
+
# @api public
|
3
|
+
#
|
4
|
+
module Puppet::Pops::Issues
|
5
|
+
# Describes an issue, and can produce a message for an occurrence of the issue.
|
6
|
+
#
|
7
|
+
class Issue
|
8
|
+
# The issue code
|
9
|
+
# @return [Symbol]
|
10
|
+
attr_reader :issue_code
|
11
|
+
|
12
|
+
# A block producing the message
|
13
|
+
# @return [Proc]
|
14
|
+
attr_reader :message_block
|
15
|
+
|
16
|
+
# Names that must be bound in an occurrence of the issue to be able to produce a message.
|
17
|
+
# These are the names in addition to requirements stipulated by the Issue formatter contract; i.e. :label`,
|
18
|
+
# and `:semantic`.
|
19
|
+
#
|
20
|
+
attr_reader :arg_names
|
21
|
+
|
22
|
+
# If this issue can have its severity lowered to :warning, :deprecation, or :ignored
|
23
|
+
attr_writer :demotable
|
24
|
+
# Configures the Issue with required arguments (bound by occurrence), and a block producing a message.
|
25
|
+
def initialize issue_code, *args, &block
|
26
|
+
@issue_code = issue_code
|
27
|
+
@message_block = block
|
28
|
+
@arg_names = args
|
29
|
+
@demotable = true
|
30
|
+
end
|
31
|
+
|
32
|
+
# Returns true if it is allowed to demote this issue
|
33
|
+
def demotable?
|
34
|
+
@demotable
|
35
|
+
end
|
36
|
+
|
37
|
+
# Formats a message for an occurrence of the issue with argument bindings passed in a hash.
|
38
|
+
# The hash must contain a LabelProvider bound to the key `label` and the semantic model element
|
39
|
+
# bound to the key `semantic`. All required arguments as specified by `arg_names` must be bound
|
40
|
+
# in the given `hash`.
|
41
|
+
# @api public
|
42
|
+
#
|
43
|
+
def format(hash ={})
|
44
|
+
# Create a Message Data where all hash keys become methods for convenient interpolation
|
45
|
+
# in issue text.
|
46
|
+
msgdata = MessageData.new(*arg_names)
|
47
|
+
# Evaluate the message block in the msg data's binding
|
48
|
+
msgdata.format(hash, &message_block)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Provides a binding of arguments passed to Issue.format to method names available
|
53
|
+
# in the issue's message producing block.
|
54
|
+
# @api private
|
55
|
+
#
|
56
|
+
class MessageData
|
57
|
+
def initialize *argnames
|
58
|
+
singleton = class << self; self end
|
59
|
+
argnames.each do |name|
|
60
|
+
singleton.send(:define_method, name) do
|
61
|
+
@data[name]
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def format(hash, &block)
|
67
|
+
@data = hash
|
68
|
+
instance_eval &block
|
69
|
+
end
|
70
|
+
|
71
|
+
# Returns the label provider given as a key in the hash passed to #format.
|
72
|
+
#
|
73
|
+
def label
|
74
|
+
raise "Label provider key :label must be set to produce the text of the message!" unless @data[:label]
|
75
|
+
@data[:label]
|
76
|
+
end
|
77
|
+
|
78
|
+
# Returns the label provider given as a key in the hash passed to #format.
|
79
|
+
#
|
80
|
+
def semantic
|
81
|
+
raise "Label provider key :semantic must be set to produce the text of the message!" unless @data[:semantic]
|
82
|
+
@data[:semantic]
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# Defines an issue with the given `issue_code`, additional required parameters, and a block producing a message.
|
87
|
+
# The block is evaluated in the context of a MessageData which provides convenient access to all required arguments
|
88
|
+
# via accessor methods. In addition to accessors for specified arguments, these are also available:
|
89
|
+
# * `label` - a `LabelProvider` that provides human understandable names for model elements and production of article (a/an/the).
|
90
|
+
# * `semantic` - the model element for which the issue is reported
|
91
|
+
#
|
92
|
+
# @param issue_code [Symbol] the issue code for the issue used as an identifier, should be the same as the constant
|
93
|
+
# the issue is bound to.
|
94
|
+
# @param *args [Symbol] required arguments that must be passed when formatting the message, may be empty
|
95
|
+
# @param &block [Proc] a block producing the message string, evaluated in a MessageData scope. The produced string
|
96
|
+
# should not end with a period as additional information may be appended.
|
97
|
+
#
|
98
|
+
# @see MessageData
|
99
|
+
# @api public
|
100
|
+
#
|
101
|
+
def self.issue (issue_code, *args, &block)
|
102
|
+
Issue.new(issue_code, *args, &block)
|
103
|
+
end
|
104
|
+
|
105
|
+
# Creates a non demotable issue.
|
106
|
+
# @see Issue.issue
|
107
|
+
#
|
108
|
+
def self.hard_issue(issue_code, *args, &block)
|
109
|
+
result = Issue.new(issue_code, *args, &block)
|
110
|
+
result.demotable = false
|
111
|
+
result
|
112
|
+
end
|
113
|
+
|
114
|
+
# @comment Here follows definitions of issues. The intent is to provide a list from which yardoc can be generated
|
115
|
+
# containing more detailed information / explanation of the issue.
|
116
|
+
# These issues are set as constants, but it is unfortunately not possible for the created object to easily know which
|
117
|
+
# name it is bound to. Instead the constant has to be repeated. (Alternatively, it could be done by instead calling
|
118
|
+
# #const_set on the module, but the extra work required to get yardoc output vs. the extra effort to repeat the name
|
119
|
+
# twice makes it not worth it (if doable at all, since there is no tag to artificially construct a constant, and
|
120
|
+
# the parse tag does not produce any result for a constant assignment).
|
121
|
+
|
122
|
+
# This is allowed (3.1) and has not yet been deprecated.
|
123
|
+
# @todo configuration
|
124
|
+
#
|
125
|
+
NAME_WITH_HYPHEN = issue :NAME_WITH_HYPHEN, :name do
|
126
|
+
"#{label.a_an_uc(semantic)} may not have a name contain a hyphen. The name '#{name}' is not legal"
|
127
|
+
end
|
128
|
+
|
129
|
+
# When a variable name contains a hyphen and these are illegal.
|
130
|
+
# It is possible to control if a hyphen is legal in a name or not using the setting TODO
|
131
|
+
# @todo describe the setting
|
132
|
+
# @api public
|
133
|
+
# @todo configuration if this is error or warning
|
134
|
+
#
|
135
|
+
VAR_WITH_HYPHEN = issue :VAR_WITH_HYPHEN, :name do
|
136
|
+
"A variable name may not contain a hyphen. The name '#{name}' is not legal"
|
137
|
+
end
|
138
|
+
|
139
|
+
# A class, definition, or node may only appear at top level or inside other classes
|
140
|
+
# @todo Is this really true for nodes? Can they be inside classes? Isn't that too late?
|
141
|
+
# @api public
|
142
|
+
#
|
143
|
+
NOT_TOP_LEVEL = hard_issue :NOT_TOP_LEVEL do
|
144
|
+
"Classes, definitions, and nodes may only appear at toplevel or inside other classes"
|
145
|
+
end
|
146
|
+
|
147
|
+
CROSS_SCOPE_ASSIGNMENT = hard_issue :CROSS_SCOPE_ASSIGNMENT, :name do
|
148
|
+
"Illegal attempt to assign to '#{name}'. Cannot assign to variables in other namespaces"
|
149
|
+
end
|
150
|
+
|
151
|
+
# Assignment can only be made to certain types of left hand expressions such as variables.
|
152
|
+
ILLEGAL_ASSIGNMENT = hard_issue :ILLEGAL_ASSIGNMENT do
|
153
|
+
"Illegal attempt to assign to '#{label.a_an(semantic)}'. Not an assignable reference"
|
154
|
+
end
|
155
|
+
|
156
|
+
# Assignment cannot be made to numeric match result variables
|
157
|
+
ILLEGAL_NUMERIC_ASSIGNMENT = issue :ILLEGAL_NUMERIC_ASSIGNMENT, :varname do
|
158
|
+
"Illegal attempt to assign to the numeric match result variable '$#{varname}'. Numeric variables are not assignable"
|
159
|
+
end
|
160
|
+
|
161
|
+
# parameters cannot have numeric names, clashes with match result variables
|
162
|
+
ILLEGAL_NUMERIC_PARAMETER = issue :ILLEGAL_NUMERIC_PARAMETER, :name do
|
163
|
+
"The numeric parameter name '$#{varname}' cannot be used (clashes with numeric match result variables)"
|
164
|
+
end
|
165
|
+
|
166
|
+
# In certain versions of Puppet it may be allowed to assign to a not already assigned key
|
167
|
+
# in an array or a hash. This is an optional validation that may be turned on to prevent accidental
|
168
|
+
# mutation.
|
169
|
+
#
|
170
|
+
ILLEGAL_INDEXED_ASSIGNMENT = issue :ILLEGAL_INDEXED_ASSIGNMENT do
|
171
|
+
"Illegal attempt to assign via [index/key]. Not an assignable reference"
|
172
|
+
end
|
173
|
+
|
174
|
+
# When indexed assignment ($x[]=) is allowed, the leftmost expression must be
|
175
|
+
# a variable expression.
|
176
|
+
#
|
177
|
+
ILLEGAL_ASSIGNMENT_VIA_INDEX = hard_issue :ILLEGAL_ASSIGNMENT_VIA_INDEX do
|
178
|
+
"Illegal attempt to assign to #{label.a_an(semantic)} via [index/key]. Not an assignable reference"
|
179
|
+
end
|
180
|
+
|
181
|
+
# Some expressions/statements may not produce a value (known as right-value, or rvalue).
|
182
|
+
# This may vary between puppet versions.
|
183
|
+
#
|
184
|
+
NOT_RVALUE = issue :NOT_RVALUE do
|
185
|
+
"Invalid use of expression. #{label.a_an_uc(semantic)} does not produce a value"
|
186
|
+
end
|
187
|
+
|
188
|
+
# Appending to attributes is only allowed in certain types of resource expressions.
|
189
|
+
#
|
190
|
+
ILLEGAL_ATTRIBUTE_APPEND = hard_issue :ILLEGAL_ATTRIBUTE_APPEND, :name, :parent do
|
191
|
+
"Illegal +> operation on attribute #{name}. This operator can not be used in #{label.a_an(parent)}"
|
192
|
+
end
|
193
|
+
|
194
|
+
# In case a model is constructed programmatically, it must create valid type references.
|
195
|
+
#
|
196
|
+
ILLEGAL_CLASSREF = hard_issue :ILLEGAL_CLASSREF, :name do
|
197
|
+
"Illegal type reference. The given name '#{name}' does not conform to the naming rule"
|
198
|
+
end
|
199
|
+
|
200
|
+
# This is a runtime issue - storeconfigs must be on in order to collect exported. This issue should be
|
201
|
+
# set to :ignore when just checking syntax.
|
202
|
+
# @todo should be a :warning by default
|
203
|
+
#
|
204
|
+
RT_NO_STORECONFIGS = issue :RT_NO_STORECONFIGS do
|
205
|
+
"You cannot collect exported resources without storeconfigs being set; the collection will be ignored"
|
206
|
+
end
|
207
|
+
|
208
|
+
# This is a runtime issue - storeconfigs must be on in order to export a resource. This issue should be
|
209
|
+
# set to :ignore when just checking syntax.
|
210
|
+
# @todo should be a :warning by default
|
211
|
+
#
|
212
|
+
RT_NO_STORECONFIGS_EXPORT = issue :RT_NO_STORECONFIGS_EXPORT do
|
213
|
+
"You cannot collect exported resources without storeconfigs being set; the export is ignored"
|
214
|
+
end
|
215
|
+
|
216
|
+
# A hostname may only contain letters, digits, '_', '-', and '.'.
|
217
|
+
#
|
218
|
+
ILLEGAL_HOSTNAME_CHARS = hard_issue :ILLEGAL_HOSTNAME_CHARS, :hostname do
|
219
|
+
"The hostname '#{hostname}' contains illegal characters (only letters, digits, '_', '-', and '.' are allowed)"
|
220
|
+
end
|
221
|
+
|
222
|
+
# A hostname may only contain letters, digits, '_', '-', and '.'.
|
223
|
+
#
|
224
|
+
ILLEGAL_HOSTNAME_INTERPOLATION = hard_issue :ILLEGAL_HOSTNAME_INTERPOLATION do
|
225
|
+
"An interpolated expression is not allowed in a hostname of a node"
|
226
|
+
end
|
227
|
+
|
228
|
+
# Issues when an expression is used where it is not legal.
|
229
|
+
# E.g. an arithmetic expression where a hostname is expected.
|
230
|
+
#
|
231
|
+
ILLEGAL_EXPRESSION = hard_issue :ILLEGAL_EXPRESSION, :feature, :container do
|
232
|
+
"Illegal expression. #{label.a_an_uc(semantic)} is unacceptable as #{feature} in #{label.a_an(container)}"
|
233
|
+
end
|
234
|
+
|
235
|
+
# Issues when an expression is used illegaly in a query.
|
236
|
+
# query only supports == and !=, and not <, > etc.
|
237
|
+
#
|
238
|
+
ILLEGAL_QUERY_EXPRESSION = hard_issue :ILLEGAL_QUERY_EXPRESSION do
|
239
|
+
"Illegal query expression. #{label.a_an_uc(semantic)} cannot be used in a query"
|
240
|
+
end
|
241
|
+
|
242
|
+
# If an attempt is made to make a resource default virtual or exported.
|
243
|
+
#
|
244
|
+
NOT_VIRTUALIZEABLE = hard_issue :NOT_VIRTUALIZEABLE do
|
245
|
+
"Resource Defaults are not virtualizable"
|
246
|
+
end
|
247
|
+
|
248
|
+
# When an attempt is made to use multiple keys (to produce a range in Ruby - e.g. $arr[2,-1]).
|
249
|
+
# This is currently not supported, but may be in future versions
|
250
|
+
#
|
251
|
+
UNSUPPORTED_RANGE = issue :UNSUPPORTED_RANGE, :count do
|
252
|
+
"Attempt to use unsupported range in #{label.a_an(semantic)}, #{count} values given for max 1"
|
253
|
+
end
|
254
|
+
|
255
|
+
DEPRECATED_NAME_AS_TYPE = issue :DEPRECATED_NAME_AS_TYPE, :name do
|
256
|
+
"Resource references should now be capitalized. The given '#{name}' does not have the correct form"
|
257
|
+
end
|
258
|
+
end
|