puppet 4.3.0 → 4.4.0
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.
- checksums.yaml +7 -0
- data/COMMITTERS.md +2 -2
- data/CONTRIBUTING.md +6 -6
- data/LICENSE +1 -1
- data/README.md +8 -9
- data/conf/auth.conf +2 -2
- data/ext/README.environment +1 -1
- data/ext/build_defaults.yaml +1 -1
- data/ext/debian/README.source +1 -1
- data/ext/debian/control +1 -1
- data/ext/debian/copyright +4 -4
- data/ext/debian/puppetmaster.README.debian +11 -9
- data/ext/emacs/puppet-mode.el +1 -1
- data/ext/envpuppet +2 -2
- data/ext/ips/puppetagent.xml +1 -1
- data/ext/ips/puppetmaster.xml +1 -1
- data/ext/project_data.yaml +8 -0
- data/ext/puppet-test +3 -3
- data/ext/rack/example-passenger-vhost.conf +1 -1
- data/ext/redhat/puppet.spec.erb +2 -2
- data/ext/regexp_nodes/regexp_nodes.rb +1 -1
- data/ext/solaris/pkginfo +1 -1
- data/ext/solaris/smf/puppet.xml +1 -1
- data/ext/suse/puppet.spec +2 -2
- data/ext/upload_facts.rb +1 -1
- data/ext/windows/puppet_interactive.bat +6 -0
- data/ext/windows/puppet_shell.bat +9 -0
- data/ext/windows/run_puppet_interactive.bat +9 -0
- data/ext/yaml_nodes.rb +1 -1
- data/install.rb +30 -20
- data/lib/hiera/scope.rb +1 -1
- data/lib/puppet/agent.rb +1 -1
- data/lib/puppet/application/agent.rb +4 -2
- data/lib/puppet/application/apply.rb +7 -4
- data/lib/puppet/application/cert.rb +1 -1
- data/lib/puppet/application/device.rb +1 -1
- data/lib/puppet/application/filebucket.rb +1 -1
- data/lib/puppet/application/inspect.rb +1 -1
- data/lib/puppet/application/lookup.rb +45 -47
- data/lib/puppet/application/master.rb +2 -2
- data/lib/puppet/application/resource.rb +1 -1
- data/lib/puppet/configurer.rb +100 -22
- data/lib/puppet/data_providers/hiera_config.rb +28 -3
- data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
- data/lib/puppet/data_providers/hiera_support.rb +1 -1
- data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
- data/lib/puppet/data_providers/lookup_adapter.rb +73 -26
- data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
- data/lib/puppet/defaults.rb +69 -22
- data/lib/puppet/environments.rb +3 -1
- data/lib/puppet/face/config.rb +1 -1
- data/lib/puppet/face/epp.rb +1 -1
- data/lib/puppet/face/help/man.erb +1 -1
- data/lib/puppet/face/module/install.rb +6 -6
- data/lib/puppet/face/parser.rb +12 -9
- data/lib/puppet/face/status.rb +2 -1
- data/lib/puppet/feature/cfpropertylist.rb +3 -0
- data/lib/puppet/feature/telnet.rb +9 -0
- data/lib/puppet/file_serving/http_metadata.rb +46 -0
- data/lib/puppet/file_serving/metadata.rb +18 -2
- data/lib/puppet/file_serving/terminus_selector.rb +2 -0
- data/lib/puppet/file_system/file_impl.rb +2 -2
- data/lib/puppet/file_system/memory_impl.rb +1 -1
- data/lib/puppet/file_system/uniquefile.rb +1 -1
- data/lib/puppet/file_system.rb +2 -2
- data/lib/puppet/forge/repository.rb +1 -31
- data/lib/puppet/forge.rb +1 -1
- data/lib/puppet/functions/assert_type.rb +9 -9
- data/lib/puppet/functions/each.rb +5 -13
- data/lib/puppet/functions/filter.rb +5 -14
- data/lib/puppet/functions/lookup.rb +126 -150
- data/lib/puppet/functions/map.rb +6 -14
- data/lib/puppet/functions/match.rb +1 -0
- data/lib/puppet/functions/reduce.rb +5 -13
- data/lib/puppet/functions/reverse_each.rb +82 -0
- data/lib/puppet/functions/scanf.rb +15 -18
- data/lib/puppet/functions/slice.rb +22 -36
- data/lib/puppet/functions/split.rb +2 -2
- data/lib/puppet/functions/step.rb +88 -0
- data/lib/puppet/functions/type.rb +70 -0
- data/lib/puppet/functions.rb +45 -6
- data/lib/puppet/graph/rb_tree_map.rb +1 -1
- data/lib/puppet/indirector/catalog/compiler.rb +188 -5
- data/lib/puppet/indirector/facts/facter.rb +2 -13
- data/lib/puppet/indirector/file_content/http.rb +15 -0
- data/lib/puppet/indirector/file_metadata/http.rb +27 -0
- data/lib/puppet/indirector/generic_http.rb +16 -0
- data/lib/puppet/indirector/hiera.rb +3 -1
- data/lib/puppet/indirector/indirection.rb +6 -2
- data/lib/puppet/indirector/json.rb +2 -2
- data/lib/puppet/indirector/node/exec.rb +1 -1
- data/lib/puppet/indirector/node/ldap.rb +1 -1
- data/lib/puppet/indirector/rest.rb +2 -1
- data/lib/puppet/info_service/class_information_service.rb +13 -12
- data/lib/puppet/loaders.rb +1 -0
- data/lib/puppet/module.rb +6 -2
- data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
- data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
- data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
- data/lib/puppet/module_tool/tar/mini.rb +3 -3
- data/lib/puppet/network/http/pool.rb +9 -0
- data/lib/puppet/node/environment.rb +11 -2
- data/lib/puppet/node.rb +11 -2
- data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
- data/lib/puppet/parser/compiler.rb +4 -11
- data/lib/puppet/parser/environment_compiler.rb +0 -1
- data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
- data/lib/puppet/parser/functions/inline_template.rb +1 -1
- data/lib/puppet/parser/functions/lookup.rb +128 -149
- data/lib/puppet/parser/functions/map.rb +1 -1
- data/lib/puppet/parser/functions/match.rb +1 -0
- data/lib/puppet/parser/functions/scanf.rb +15 -26
- data/lib/puppet/parser/functions/slice.rb +17 -24
- data/lib/puppet/parser/functions/split.rb +1 -1
- data/lib/puppet/parser/functions.rb +28 -16
- data/lib/puppet/parser/resource.rb +19 -17
- data/lib/puppet/parser/scope.rb +176 -5
- data/lib/puppet/plugins/data_providers/data_provider.rb +56 -14
- data/lib/puppet/pops/adaptable.rb +4 -1
- data/lib/puppet/pops/adapters.rb +80 -12
- data/lib/puppet/pops/binder/binder.rb +21 -17
- data/lib/puppet/pops/binder/binder_issues.rb +8 -6
- data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
- data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
- data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
- data/lib/puppet/pops/binder/bindings_model.rb +49 -47
- data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
- data/lib/puppet/pops/binder/injector.rb +53 -48
- data/lib/puppet/pops/binder/key_factory.rb +10 -6
- data/lib/puppet/pops/binder/producers.rb +67 -62
- data/lib/puppet/pops/evaluator/access_operator.rb +98 -96
- data/lib/puppet/pops/evaluator/closure.rb +122 -106
- data/lib/puppet/pops/evaluator/collector_transformer.rb +34 -14
- data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
- data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
- data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
- data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
- data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
- data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
- data/lib/puppet/pops/evaluator/runtime3_support.rb +47 -42
- data/lib/puppet/pops/functions/function.rb +6 -2
- data/lib/puppet/pops/issue_reporter.rb +6 -4
- data/lib/puppet/pops/issues.rb +50 -11
- data/lib/puppet/pops/loader/base_loader.rb +1 -1
- data/lib/puppet/pops/loader/loader.rb +1 -1
- data/lib/puppet/pops/loader/loader_paths.rb +15 -0
- data/lib/puppet/pops/loader/module_loaders.rb +17 -13
- data/lib/puppet/pops/loader/puppet_function_instantiator.rb +18 -13
- data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
- data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
- data/lib/puppet/pops/loaders.rb +51 -9
- data/lib/puppet/pops/lookup/explainer.rb +73 -3
- data/lib/puppet/pops/lookup/invocation.rb +21 -19
- data/lib/puppet/pops/lookup.rb +17 -12
- data/lib/puppet/pops/merge_strategy.rb +16 -19
- data/lib/puppet/pops/model/factory.rb +179 -157
- data/lib/puppet/pops/model/model.rb +17 -8
- data/lib/puppet/pops/model/model_label_provider.rb +14 -7
- data/lib/puppet/pops/model/model_meta.rb +17 -0
- data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
- data/lib/puppet/pops/parser/egrammar.ra +38 -14
- data/lib/puppet/pops/parser/eparser.rb +1353 -1276
- data/lib/puppet/pops/parser/epp_support.rb +11 -7
- data/lib/puppet/pops/parser/evaluating_parser.rb +17 -13
- data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
- data/lib/puppet/pops/parser/lexer2.rb +428 -403
- data/lib/puppet/pops/parser/lexer_support.rb +85 -7
- data/lib/puppet/pops/parser/locator.rb +21 -0
- data/lib/puppet/pops/parser/parser_support.rb +19 -16
- data/lib/puppet/pops/parser/slurp_support.rb +16 -8
- data/lib/puppet/pops/types/class_loader.rb +23 -19
- data/lib/puppet/pops/types/enumeration.rb +9 -26
- data/lib/puppet/pops/types/iterable.rb +308 -0
- data/lib/puppet/pops/types/recursion_guard.rb +82 -0
- data/lib/puppet/pops/types/type_acceptor.rb +25 -0
- data/lib/puppet/pops/types/type_asserter.rb +10 -9
- data/lib/puppet/pops/types/type_calculator.rb +140 -387
- data/lib/puppet/pops/types/type_factory.rb +91 -57
- data/lib/puppet/pops/types/type_formatter.rb +334 -0
- data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
- data/lib/puppet/pops/types/type_parser.rb +159 -112
- data/lib/puppet/pops/types/types.rb +2057 -1253
- data/lib/puppet/pops/utils.rb +11 -10
- data/lib/puppet/pops/validation/checker4_0.rb +115 -63
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
- data/lib/puppet/pops/validation.rb +11 -9
- data/lib/puppet/pops.rb +0 -8
- data/lib/puppet/provider/aixobject.rb +1 -1
- data/lib/puppet/provider/augeas/augeas.rb +1 -1
- data/lib/puppet/provider/cron/crontab.rb +1 -1
- data/lib/puppet/provider/exec/windows.rb +1 -1
- data/lib/puppet/provider/group/windows_adsi.rb +2 -2
- data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
- data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
- data/lib/puppet/provider/package/appdmg.rb +3 -2
- data/lib/puppet/provider/package/dnf.rb +1 -1
- data/lib/puppet/provider/package/pip.rb +16 -9
- data/lib/puppet/provider/package/pip3.rb +1 -1
- data/lib/puppet/provider/package/pkg.rb +1 -1
- data/lib/puppet/provider/package/pkgdmg.rb +3 -2
- data/lib/puppet/provider/package/pkgng.rb +13 -4
- data/lib/puppet/provider/package/rpm.rb +0 -1
- data/lib/puppet/provider/package/windows.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +2 -2
- data/lib/puppet/provider/package/zypper.rb +19 -0
- data/lib/puppet/provider/service/debian.rb +7 -20
- data/lib/puppet/provider/service/init.rb +7 -0
- data/lib/puppet/provider/service/launchd.rb +6 -12
- data/lib/puppet/provider/service/systemd.rb +9 -2
- data/lib/puppet/provider/sshkey/parsed.rb +1 -1
- data/lib/puppet/provider/user/aix.rb +1 -1
- data/lib/puppet/provider/user/directoryservice.rb +33 -58
- data/lib/puppet/provider/user/windows_adsi.rb +2 -2
- data/lib/puppet/provider/yumrepo/inifile.rb +6 -3
- data/lib/puppet/provider/zfs/zfs.rb +1 -1
- data/lib/puppet/provider/zpool/zpool.rb +1 -1
- data/lib/puppet/reference/configuration.rb +1 -1
- data/lib/puppet/reference/providers.rb +1 -1
- data/lib/puppet/resource/capability_finder.rb +20 -13
- data/lib/puppet/resource/catalog.rb +60 -3
- data/lib/puppet/resource/status.rb +11 -2
- data/lib/puppet/resource/type.rb +33 -42
- data/lib/puppet/resource.rb +15 -12
- data/lib/puppet/settings/config_file.rb +1 -1
- data/lib/puppet/settings/environment_conf.rb +13 -5
- data/lib/puppet/settings.rb +1 -1
- data/lib/puppet/ssl/certificate_factory.rb +3 -3
- data/lib/puppet/ssl/certificate_request.rb +4 -4
- data/lib/puppet/ssl/certificate_signer.rb +1 -1
- data/lib/puppet/ssl/validator/default_validator.rb +1 -1
- data/lib/puppet/test/test_helper.rb +16 -4
- data/lib/puppet/transaction/additional_resource_generator.rb +23 -5
- data/lib/puppet/transaction/report.rb +31 -1
- data/lib/puppet/transaction/resource_harness.rb +0 -25
- data/lib/puppet/transaction.rb +15 -2
- data/lib/puppet/type/augeas.rb +1 -1
- data/lib/puppet/type/cron.rb +12 -12
- data/lib/puppet/type/file/checksum_value.rb +53 -0
- data/lib/puppet/type/file/content.rb +26 -111
- data/lib/puppet/type/file/data_sync.rb +84 -0
- data/lib/puppet/type/file/ensure.rb +17 -14
- data/lib/puppet/type/file/selcontext.rb +1 -1
- data/lib/puppet/type/file/source.rb +103 -18
- data/lib/puppet/type/file.rb +91 -39
- data/lib/puppet/type/filebucket.rb +1 -1
- data/lib/puppet/type/group.rb +6 -2
- data/lib/puppet/type/interface.rb +8 -3
- data/lib/puppet/type/macauthorization.rb +1 -1
- data/lib/puppet/type/package.rb +6 -0
- data/lib/puppet/type/schedule.rb +1 -1
- data/lib/puppet/type/stage.rb +1 -1
- data/lib/puppet/type/user.rb +19 -17
- data/lib/puppet/type/yumrepo.rb +20 -0
- data/lib/puppet/type.rb +11 -11
- data/lib/puppet/util/autoload.rb +16 -11
- data/lib/puppet/util/checksums.rb +74 -31
- data/lib/puppet/util/execution.rb +1 -1
- data/lib/puppet/util/http_proxy.rb +72 -0
- data/lib/puppet/util/log.rb +2 -0
- data/lib/puppet/util/logging.rb +43 -1
- data/lib/puppet/util/monkey_patches.rb +2 -2
- data/lib/puppet/util/multi_match.rb +51 -0
- data/lib/puppet/util/network_device/cisco/device.rb +10 -2
- data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
- data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
- data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
- data/lib/puppet/util/plist.rb +130 -0
- data/lib/puppet/util/resource_template.rb +1 -1
- data/lib/puppet/util/run_mode.rb +2 -2
- data/lib/puppet/util/skip_tags.rb +9 -0
- data/lib/puppet/util/windows/access_control_entry.rb +1 -1
- data/lib/puppet/util/windows/access_control_list.rb +3 -3
- data/lib/puppet/util/windows/adsi.rb +65 -28
- data/lib/puppet/util/windows/api_types.rb +24 -18
- data/lib/puppet/util/windows/com.rb +3 -3
- data/lib/puppet/util/windows/error.rb +1 -1
- data/lib/puppet/util/windows/file.rb +8 -8
- data/lib/puppet/util/windows/principal.rb +190 -0
- data/lib/puppet/util/windows/process.rb +78 -11
- data/lib/puppet/util/windows/registry.rb +22 -16
- data/lib/puppet/util/windows/root_certs.rb +5 -5
- data/lib/puppet/util/windows/security.rb +33 -35
- data/lib/puppet/util/windows/security_descriptor.rb +1 -1
- data/lib/puppet/util/windows/sid.rb +84 -15
- data/lib/puppet/util/windows/taskscheduler.rb +15 -15
- data/lib/puppet/util/windows/user.rb +10 -10
- data/lib/puppet/util/windows.rb +4 -0
- data/lib/puppet/util.rb +109 -22
- data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
- data/lib/puppet/vendor/pathspec/LICENSE +2 -2
- data/lib/puppet/vendor/pathspec/README.md +1 -1
- data/lib/puppet/vendor/rgen/README.rdoc +1 -1
- data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
- data/lib/puppet/version.rb +1 -1
- data/lib/puppet.rb +17 -0
- data/lib/semver.rb +17 -1
- data/man/man5/puppet.conf.5 +12 -12
- data/man/man8/extlookup2hiera.8 +1 -1
- data/man/man8/puppet-agent.8 +2 -2
- data/man/man8/puppet-apply.8 +2 -2
- data/man/man8/puppet-ca.8 +2 -2
- data/man/man8/puppet-catalog.8 +2 -2
- data/man/man8/puppet-cert.8 +2 -2
- data/man/man8/puppet-certificate.8 +2 -2
- data/man/man8/puppet-certificate_request.8 +2 -2
- data/man/man8/puppet-certificate_revocation_list.8 +2 -2
- data/man/man8/puppet-config.8 +3 -3
- data/man/man8/puppet-describe.8 +1 -1
- data/man/man8/puppet-device.8 +1 -1
- data/man/man8/puppet-doc.8 +1 -1
- data/man/man8/puppet-epp.8 +2 -2
- data/man/man8/puppet-facts.8 +2 -2
- data/man/man8/puppet-file.8 +2 -2
- data/man/man8/puppet-filebucket.8 +2 -2
- data/man/man8/puppet-help.8 +2 -2
- data/man/man8/puppet-inspect.8 +2 -2
- data/man/man8/puppet-key.8 +2 -2
- data/man/man8/puppet-man.8 +2 -2
- data/man/man8/puppet-master.8 +2 -2
- data/man/man8/puppet-module.8 +9 -9
- data/man/man8/puppet-node.8 +2 -2
- data/man/man8/puppet-parser.8 +2 -2
- data/man/man8/puppet-plugin.8 +2 -2
- data/man/man8/puppet-report.8 +2 -2
- data/man/man8/puppet-resource.8 +2 -2
- data/man/man8/puppet-resource_type.8 +2 -2
- data/man/man8/puppet-status.8 +3 -3
- data/man/man8/puppet.8 +1 -1
- data/spec/fixtures/module.tar.gz +0 -0
- data/spec/fixtures/unit/application/environments/production/data/common.yaml +4 -0
- data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
- data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
- data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/data.pp +10 -0
- data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
- data/spec/fixtures/unit/module/trailing-comma.json +1 -1
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +81 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
- data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
- data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
- data/spec/integration/defaults_spec.rb +14 -2
- data/spec/integration/file_system/uniquefile_spec.rb +29 -0
- data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
- data/spec/integration/node/environment_spec.rb +13 -0
- data/spec/integration/parser/collection_spec.rb +8 -0
- data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
- data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
- data/spec/integration/parser/undef_param_spec.rb +8 -0
- data/spec/integration/provider/yumrepo_spec.rb +1 -1
- data/spec/integration/test/test_helper_spec.rb +28 -0
- data/spec/integration/transaction/report_spec.rb +16 -0
- data/spec/integration/transaction_spec.rb +11 -0
- data/spec/integration/type/file_spec.rb +194 -4
- data/spec/integration/type/package_spec.rb +5 -1
- data/spec/integration/type/tidy_spec.rb +21 -9
- data/spec/integration/util/execution_spec.rb +22 -0
- data/spec/integration/util/windows/principal_spec.rb +201 -0
- data/spec/integration/util/windows/process_spec.rb +31 -0
- data/spec/{unit → integration}/util/windows/registry_spec.rb +91 -1
- data/spec/integration/util/windows/security_spec.rb +8 -8
- data/spec/integration/util/windows/user_spec.rb +1 -1
- data/spec/integration/util_spec.rb +49 -27
- data/spec/lib/puppet_spec/compiler.rb +17 -0
- data/spec/lib/puppet_spec/files.rb +2 -2
- data/spec/lib/puppet_spec/pops.rb +13 -0
- data/spec/shared_behaviours/iterative_functions.rb +1 -1
- data/spec/shared_contexts/types_setup.rb +96 -0
- data/spec/unit/agent_spec.rb +1 -0
- data/spec/unit/application/agent_spec.rb +10 -0
- data/spec/unit/application/apply_spec.rb +9 -0
- data/spec/unit/application/lookup_spec.rb +138 -28
- data/spec/unit/configurer/downloader_spec.rb +5 -5
- data/spec/unit/configurer_spec.rb +271 -39
- data/spec/unit/data_providers/hiera_data_provider_spec.rb +182 -5
- data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
- data/spec/unit/defaults_spec.rb +15 -0
- data/spec/unit/environments_spec.rb +24 -4
- data/spec/unit/face/epp_face_spec.rb +2 -2
- data/spec/unit/face/parser_spec.rb +43 -2
- data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
- data/spec/unit/file_serving/metadata_spec.rb +50 -0
- data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
- data/spec/unit/file_system_spec.rb +26 -0
- data/spec/unit/functions/assert_type_spec.rb +36 -2
- data/spec/unit/functions/defined_spec.rb +2 -2
- data/spec/unit/functions/epp_spec.rb +17 -9
- data/spec/unit/functions/inline_epp_spec.rb +4 -4
- data/spec/unit/functions/lookup_spec.rb +88 -16
- data/spec/unit/functions/regsubst_spec.rb +1 -1
- data/spec/unit/functions/reverse_each_spec.rb +108 -0
- data/spec/unit/functions/step_spec.rb +113 -0
- data/spec/unit/functions/type_spec.rb +35 -0
- data/spec/unit/functions4_spec.rb +62 -6
- data/spec/unit/hiera/scope_spec.rb +5 -2
- data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
- data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
- data/spec/unit/indirector/indirection_spec.rb +1 -1
- data/spec/unit/indirector/json_spec.rb +1 -1
- data/spec/unit/info_service_spec.rb +94 -32
- data/spec/unit/module_spec.rb +14 -0
- data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
- data/spec/unit/network/authstore_spec.rb +1 -1
- data/spec/unit/network/http/connection_spec.rb +1 -0
- data/spec/unit/network/http/pool_spec.rb +30 -0
- data/spec/unit/node_spec.rb +8 -0
- data/spec/unit/parser/compiler_spec.rb +16 -18
- data/spec/unit/parser/scope_spec.rb +28 -11
- data/spec/unit/pops/evaluator/access_ops_spec.rb +7 -7
- data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -2
- data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
- data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
- data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
- data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
- data/spec/unit/pops/loaders/loaders_spec.rb +127 -2
- data/spec/unit/pops/parser/lexer2_spec.rb +118 -3
- data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
- data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
- data/spec/unit/pops/parser/parser_spec.rb +10 -0
- data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
- data/spec/unit/pops/types/iterable_spec.rb +262 -0
- data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
- data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
- data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
- data/spec/unit/pops/types/type_calculator_spec.rb +275 -390
- data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
- data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
- data/spec/unit/pops/types/type_parser_spec.rb +58 -13
- data/spec/unit/pops/types/types_spec.rb +241 -0
- data/spec/unit/pops/validator/validator_spec.rb +159 -15
- data/spec/unit/provider/cron/parsed_spec.rb +1 -0
- data/spec/unit/provider/group/windows_adsi_spec.rb +8 -8
- data/spec/unit/provider/macauthorization_spec.rb +5 -2
- data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
- data/spec/unit/provider/package/appdmg_spec.rb +3 -3
- data/spec/unit/provider/package/dnf_spec.rb +16 -0
- data/spec/unit/provider/package/pip3_spec.rb +60 -42
- data/spec/unit/provider/package/pip_spec.rb +88 -47
- data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
- data/spec/unit/provider/package/pkgng_spec.rb +4 -2
- data/spec/unit/provider/package/rpm_spec.rb +2 -25
- data/spec/unit/provider/package/yum_spec.rb +12 -1
- data/spec/unit/provider/package/zypper_spec.rb +14 -0
- data/spec/unit/provider/service/debian_spec.rb +6 -24
- data/spec/unit/provider/service/init_spec.rb +11 -1
- data/spec/unit/provider/service/launchd_spec.rb +18 -25
- data/spec/unit/provider/service/systemd_spec.rb +25 -12
- data/spec/unit/provider/service/upstart_spec.rb +57 -0
- data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
- data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
- data/spec/unit/provider/user/windows_adsi_spec.rb +5 -5
- data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
- data/spec/unit/resource/capability_finder_spec.rb +28 -15
- data/spec/unit/resource/catalog_spec.rb +33 -1
- data/spec/unit/resource/type_spec.rb +149 -7
- data/spec/unit/resource_spec.rb +99 -50
- data/spec/unit/settings/environment_conf_spec.rb +18 -1
- data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
- data/spec/unit/transaction/report_spec.rb +27 -0
- data/spec/unit/transaction/resource_harness_spec.rb +0 -47
- data/spec/unit/transaction_spec.rb +5 -0
- data/spec/unit/type/file/checksum_spec.rb +6 -0
- data/spec/unit/type/file/checksum_value_spec.rb +286 -0
- data/spec/unit/type/file/content_spec.rb +12 -193
- data/spec/unit/type/file/source_spec.rb +211 -119
- data/spec/unit/type/file_spec.rb +133 -34
- data/spec/unit/type/interface_spec.rb +32 -0
- data/spec/unit/type/macauthorization_spec.rb +4 -1
- data/spec/unit/type/yumrepo_spec.rb +2 -2
- data/spec/unit/util/filetype_spec.rb +1 -1
- data/spec/unit/util/http_proxy_spec.rb +2 -2
- data/spec/unit/util/log/destinations_spec.rb +0 -2
- data/spec/unit/util/logging_spec.rb +69 -0
- data/spec/unit/util/multi_match_spec.rb +39 -0
- data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
- data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
- data/spec/unit/util/plist_spec.rb +110 -0
- data/spec/unit/util/resource_template_spec.rb +2 -2
- data/spec/unit/util/run_mode_spec.rb +27 -3
- data/spec/unit/util/windows/adsi_spec.rb +46 -38
- data/spec/unit/util/windows/api_types_spec.rb +42 -0
- data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
- data/spec/unit/util/windows/sid_spec.rb +48 -11
- data/spec/unit/util_spec.rb +123 -13
- data/tasks/cfpropertylist.rake +15 -0
- metadata +3342 -3195
- data/lib/puppet/vendor/load_plist.rb +0 -1
- data/lib/puppet/vendor/plist/CHANGELOG +0 -82
- data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
- data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
- data/lib/puppet/vendor/plist/README +0 -36
- data/lib/puppet/vendor/plist/Rakefile +0 -144
- data/lib/puppet/vendor/plist/docs/USAGE +0 -104
- data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
- data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
- data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
- data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
- data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
- data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
- data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
- data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
- data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
- data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
- data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
- data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
- data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
- data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
- data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
- data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
- data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
- /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
- /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
module Puppet::Pops::Types
|
|
2
|
+
# The runtime Iterable type for an Iterable
|
|
3
|
+
module Iterable
|
|
4
|
+
# Produces an `Iterable` for one of the following types with the following characterstics:
|
|
5
|
+
#
|
|
6
|
+
# `String` - yields each character in the string
|
|
7
|
+
# `Array` - yields each element in the array
|
|
8
|
+
# `Hash` - yields each key/value pair as a two element array
|
|
9
|
+
# `Integer` - when positive, yields each value from zero to the given number
|
|
10
|
+
# `PIntegerType` - yields each element from min to max (inclusive) provided min < max and neither is unbounded.
|
|
11
|
+
# `PEnumtype` - yields each possible value of the enum.
|
|
12
|
+
# `Range` - yields an iterator for all elements in the range provided that the range start and end
|
|
13
|
+
# are both integers or both strings and start is less than end using natural ordering.
|
|
14
|
+
# `Dir` - yields each name in the directory
|
|
15
|
+
#
|
|
16
|
+
# An `ArgumentError` is raised for all other objects.
|
|
17
|
+
#
|
|
18
|
+
# @param o [Object] The object to produce an `Iterable` for
|
|
19
|
+
# @return [Iterable,nil] The produced `Iterable`
|
|
20
|
+
# @raise [ArgumentError] In case an `Iterable` cannot be produced
|
|
21
|
+
# @api public
|
|
22
|
+
def self.asserted_iterable(caller, obj)
|
|
23
|
+
iter = self.on(obj)
|
|
24
|
+
raise ArgumentError, "#{caller.class}(): wrong argument type (#{obj.class}; is not Iterable." if iter.nil?
|
|
25
|
+
iter
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Produces an `Iterable` for one of the following types with the following characterstics:
|
|
29
|
+
#
|
|
30
|
+
# `String` - yields each character in the string
|
|
31
|
+
# `Array` - yields each element in the array
|
|
32
|
+
# `Hash` - yields each key/value pair as a two element array
|
|
33
|
+
# `Integer` - when positive, yields each value from zero to the given number
|
|
34
|
+
# `PIntegerType` - yields each element from min to max (inclusive) provided min < max and neither is unbounded.
|
|
35
|
+
# `PEnumtype` - yields each possible value of the enum.
|
|
36
|
+
# `Range` - yields an iterator for all elements in the range provided that the range start and end
|
|
37
|
+
# are both integers or both strings and start is less than end using natural ordering.
|
|
38
|
+
# `Dir` - yields each name in the directory
|
|
39
|
+
#
|
|
40
|
+
# The value `nil` is returned for all other objects.
|
|
41
|
+
#
|
|
42
|
+
# @param o [Object] The object to produce an `Iterable` for
|
|
43
|
+
# @return [Iterable,nil] The produced `Iterable` or `nil` if it couldn't be produced
|
|
44
|
+
#
|
|
45
|
+
# @api public
|
|
46
|
+
def self.on(o)
|
|
47
|
+
case o
|
|
48
|
+
when Iterable
|
|
49
|
+
o
|
|
50
|
+
when String
|
|
51
|
+
Iterator.new(PStringType.new(PIntegerType.new(1, 1)), o.each_char)
|
|
52
|
+
when Array
|
|
53
|
+
if o.empty?
|
|
54
|
+
Iterator.new(PUnitType::DEFAULT, o.each)
|
|
55
|
+
else
|
|
56
|
+
tc = TypeCalculator.singleton
|
|
57
|
+
Iterator.new(tc.unwrap_single_variant(PVariantType.new(o.map {|e| tc.infer_set(e) })), o.each)
|
|
58
|
+
end
|
|
59
|
+
when Hash
|
|
60
|
+
# Each element is a two element [key, value] tuple.
|
|
61
|
+
if o.empty?
|
|
62
|
+
Iterator.new(PHashType::DEFAULT_KEY_PAIR_TUPLE, o.each)
|
|
63
|
+
else
|
|
64
|
+
tc = TypeCalculator.singleton
|
|
65
|
+
Iterator.new(PTupleType.new([
|
|
66
|
+
tc.unwrap_single_variant(PVariantType.new(o.keys.map {|e| tc.infer_set(e) })),
|
|
67
|
+
tc.unwrap_single_variant(PVariantType.new(o.values.map {|e| tc.infer_set(e) }))], PHashType::KEY_PAIR_TUPLE_SIZE), o.each_pair)
|
|
68
|
+
end
|
|
69
|
+
when Integer
|
|
70
|
+
if o == 0
|
|
71
|
+
Iterator.new(PUnitType::DEFAULT, o.times)
|
|
72
|
+
elsif o > 0
|
|
73
|
+
IntegerRangeIterator.new(PIntegerType.new(0, o - 1))
|
|
74
|
+
else
|
|
75
|
+
nil
|
|
76
|
+
end
|
|
77
|
+
when PIntegerType
|
|
78
|
+
# a finite range will always produce at least one element since it's inclusive
|
|
79
|
+
o.finite_range? ? IntegerRangeIterator.new(o) : nil
|
|
80
|
+
when PEnumType
|
|
81
|
+
Iterator.new(o, o.values.each)
|
|
82
|
+
when Range
|
|
83
|
+
min = o.min
|
|
84
|
+
max = o.max
|
|
85
|
+
if min.is_a?(Integer) && max.is_a?(Integer) && max >= min
|
|
86
|
+
IntegerRangeIterator.new(PIntegerType.new(min, max))
|
|
87
|
+
elsif min.is_a?(String) && max.is_a?(String) && max >= min
|
|
88
|
+
# A generalized element type where only the size is inferred is used here since inferring the full
|
|
89
|
+
# range might waste a lot of memory.
|
|
90
|
+
if min.length < max.length
|
|
91
|
+
shortest = min
|
|
92
|
+
longest = max
|
|
93
|
+
else
|
|
94
|
+
shortest = max
|
|
95
|
+
longest = min
|
|
96
|
+
end
|
|
97
|
+
Iterator.new(PStringType.new(PIntegerType.new(shortest.length, longest.length)), o.each)
|
|
98
|
+
else
|
|
99
|
+
# Unsupported range. It's either descending or nonsensical for other reasons (float, mixed types, etc.)
|
|
100
|
+
nil
|
|
101
|
+
end
|
|
102
|
+
else
|
|
103
|
+
# Not supported. We cannot determine the element type
|
|
104
|
+
nil
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Answers the question if there is an end to the iteration. Puppet does not currently provide any unbounded
|
|
109
|
+
# iterables.
|
|
110
|
+
#
|
|
111
|
+
# @return [Boolean] `true` if the iteration is unbounded
|
|
112
|
+
def self.unbounded?(object)
|
|
113
|
+
case object
|
|
114
|
+
when Iterable
|
|
115
|
+
object.unbounded?
|
|
116
|
+
when String,Integer,Array,Hash,Enumerator,PIntegerType,PEnumType,Dir
|
|
117
|
+
false
|
|
118
|
+
else
|
|
119
|
+
TypeAsserter.assert_instance_of('', PIterableType::DEFAULT, object, false)
|
|
120
|
+
!object.respond_to?(:size)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def each(&block)
|
|
125
|
+
step(1, &block)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def element_type
|
|
129
|
+
PAnyType::DEFAULT
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def reverse_each(&block)
|
|
133
|
+
# Default implementation cannot propagate reverse_each to a new enumerator so chained
|
|
134
|
+
# calls must put reverse_each last.
|
|
135
|
+
raise ArgumentError 'Step is not implemented'
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def step(step, &block)
|
|
139
|
+
# Default implementation cannot propagate step to a new enumerator so chained
|
|
140
|
+
# calls must put stepping last.
|
|
141
|
+
raise ArgumentError 'Step is not implemented'
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def to_a
|
|
145
|
+
raise Puppet::Error, 'Attempt to create an Array from an unbounded Iterable' if unbounded?
|
|
146
|
+
super
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def unbounded?
|
|
150
|
+
true
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# @api private
|
|
155
|
+
class Iterator
|
|
156
|
+
# Note! We do not include Enumerable module here since that would make this class respond
|
|
157
|
+
# in a bad way to all enumerable methods. We want to delegate all those calls directly to
|
|
158
|
+
# the contained @enumeration
|
|
159
|
+
include Iterable
|
|
160
|
+
|
|
161
|
+
def initialize(element_type, enumeration)
|
|
162
|
+
@element_type = element_type
|
|
163
|
+
@enumeration = enumeration
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def element_type
|
|
167
|
+
@element_type
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def size
|
|
171
|
+
@enumeration.size
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def respond_to_missing?(name, include_private)
|
|
175
|
+
@enumeration.respond_to?(name, include_private)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def method_missing(name, *arguments, &block)
|
|
179
|
+
@enumeration.send(name, *arguments, &block)
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def step(step, &block)
|
|
183
|
+
raise ArgumentError if step <= 0
|
|
184
|
+
r = self
|
|
185
|
+
r = r.step_iterator(step) if step > 1
|
|
186
|
+
|
|
187
|
+
if block_given?
|
|
188
|
+
begin
|
|
189
|
+
if block.arity == 1
|
|
190
|
+
loop { yield(r.next) }
|
|
191
|
+
else
|
|
192
|
+
loop { yield(*r.next) }
|
|
193
|
+
end
|
|
194
|
+
rescue StopIteration
|
|
195
|
+
end
|
|
196
|
+
self
|
|
197
|
+
else
|
|
198
|
+
r
|
|
199
|
+
end
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def reverse_each(&block)
|
|
203
|
+
r = Iterator.new(@element_type, @enumeration.reverse_each)
|
|
204
|
+
block_given? ? r.each(&block) : r
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
def step_iterator(step)
|
|
208
|
+
StepIterator.new(@element_type, self, step)
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
def to_s
|
|
212
|
+
et = element_type
|
|
213
|
+
et.nil? ? 'Iterator value' : "Iterator[#{et.generalize}] value"
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def unbounded?
|
|
217
|
+
Iterable.unbounded?(@enumeration)
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
# @api private
|
|
222
|
+
class StepIterator < Iterator
|
|
223
|
+
include Enumerable
|
|
224
|
+
|
|
225
|
+
def initialize(element_type, enumeration, step_size)
|
|
226
|
+
super(element_type, enumeration)
|
|
227
|
+
raise ArgumentError if step_size <= 0
|
|
228
|
+
@step_size = step_size
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def next
|
|
232
|
+
result = @enumeration.next
|
|
233
|
+
skip = @step_size - 1
|
|
234
|
+
if skip > 0
|
|
235
|
+
begin
|
|
236
|
+
skip.times { @enumeration.next }
|
|
237
|
+
rescue StopIteration
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
result
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
def reverse_each(&block)
|
|
244
|
+
r = Iterator.new(@element_type, to_a.reverse_each)
|
|
245
|
+
block_given? ? r.each(&block) : r
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def size
|
|
249
|
+
super / @step_size
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
# @api private
|
|
254
|
+
class IntegerRangeIterator < Iterator
|
|
255
|
+
include Enumerable
|
|
256
|
+
|
|
257
|
+
def initialize(range, step = 1)
|
|
258
|
+
raise ArgumentError if step == 0
|
|
259
|
+
@range = range
|
|
260
|
+
@step_size = step
|
|
261
|
+
@current = (step < 0 ? range.to : range.from) - step
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
def element_type
|
|
265
|
+
@range
|
|
266
|
+
end
|
|
267
|
+
|
|
268
|
+
def next
|
|
269
|
+
value = @current + @step_size
|
|
270
|
+
if @step_size < 0
|
|
271
|
+
raise StopIteration if value < @range.from
|
|
272
|
+
else
|
|
273
|
+
raise StopIteration if value > @range.to
|
|
274
|
+
end
|
|
275
|
+
@current = value
|
|
276
|
+
end
|
|
277
|
+
|
|
278
|
+
def reverse_each(&block)
|
|
279
|
+
r = IntegerRangeIterator.new(@range, -@step_size)
|
|
280
|
+
block_given? ? r.each(&block) : r
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
def size
|
|
284
|
+
(@range.to - @range.from) / @step_size.abs
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def step_iterator(step)
|
|
288
|
+
# The step iterator must use a range that has its logical end truncated at an even step boundary. This will
|
|
289
|
+
# fulfil two objectives:
|
|
290
|
+
# 1. The element_type method should not report excessive integers as possible numbers
|
|
291
|
+
# 2. A reversed iterator must start at the correct number
|
|
292
|
+
#
|
|
293
|
+
range = @range
|
|
294
|
+
step = @step_size * step
|
|
295
|
+
mod = (range.to - range.from) % step
|
|
296
|
+
if mod < 0
|
|
297
|
+
range = PIntegerType.new(range.from - mod, range.to)
|
|
298
|
+
elsif mod > 0
|
|
299
|
+
range = PIntegerType.new(range.from, range.to - mod)
|
|
300
|
+
end
|
|
301
|
+
IntegerRangeIterator.new(range, step)
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
def unbounded?
|
|
305
|
+
false
|
|
306
|
+
end
|
|
307
|
+
end
|
|
308
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
module Puppet::Pops
|
|
2
|
+
module Types
|
|
3
|
+
# Keeps track of self recursion of conceptual 'this' and 'that' instances using two separate maps and
|
|
4
|
+
# a state. The class is used when tracking self recursion in two objects ('this' and 'that') simultaneously.
|
|
5
|
+
# A typical example of when this is needed is when testing if 'that' Puppet Type is assignable to 'this'
|
|
6
|
+
# Puppet Type since both types may contain self references.
|
|
7
|
+
#
|
|
8
|
+
# All comparisons are made using the `object_id` of the instance rather than the instance itself.
|
|
9
|
+
#
|
|
10
|
+
# @api private
|
|
11
|
+
class RecursionGuard
|
|
12
|
+
attr_reader :state
|
|
13
|
+
|
|
14
|
+
NO_SELF_RECURSION = 0
|
|
15
|
+
SELF_RECURSION_IN_THIS = 1
|
|
16
|
+
SELF_RECURSION_IN_THAT = 2
|
|
17
|
+
SELF_RECURSION_IN_BOTH = 3
|
|
18
|
+
|
|
19
|
+
def initialize
|
|
20
|
+
@state = NO_SELF_RECURSION
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Checks if recursion was detected for the given argument in the 'this' context
|
|
24
|
+
# @param instance [Object] the instance to check
|
|
25
|
+
# @return [Integer] the resulting state
|
|
26
|
+
def recursive_this?(instance)
|
|
27
|
+
this_map[instance.object_id] == true
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Checks if recursion was detected for the given argument in the 'that' context
|
|
31
|
+
# @param instance [Object] the instance to check
|
|
32
|
+
# @return [Integer] the resulting state
|
|
33
|
+
def recursive_that?(instance)
|
|
34
|
+
that_map[instance.object_id] == true
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Add the given argument as 'this' and return the resulting state
|
|
38
|
+
# @param instance [Object] the instance to add
|
|
39
|
+
# @return [Integer] the resulting state
|
|
40
|
+
def add_this(instance)
|
|
41
|
+
if (@state & SELF_RECURSION_IN_THIS) == 0
|
|
42
|
+
@state = @state | SELF_RECURSION_IN_THIS if map_put(this_map, instance)
|
|
43
|
+
end
|
|
44
|
+
@state
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Add the given argument as 'that' and return the resulting state
|
|
48
|
+
# @param instance [Object] the instance to add
|
|
49
|
+
# @return [Integer] the resulting state
|
|
50
|
+
def add_that(instance)
|
|
51
|
+
if (@state & SELF_RECURSION_IN_THAT) == 0
|
|
52
|
+
@state = @state | SELF_RECURSION_IN_THAT if map_put(that_map, instance)
|
|
53
|
+
end
|
|
54
|
+
@state
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
def map_put(map, o)
|
|
60
|
+
id = o.object_id
|
|
61
|
+
case map[id]
|
|
62
|
+
when true
|
|
63
|
+
true # Recursion already detected
|
|
64
|
+
when false
|
|
65
|
+
map[id] = true
|
|
66
|
+
true # Recursion occured. This was the second time this entry was added
|
|
67
|
+
else
|
|
68
|
+
map[id] = false
|
|
69
|
+
false # First time add. No recursion
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def this_map
|
|
74
|
+
@this_map ||= {}
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def that_map
|
|
78
|
+
@that_map ||= {}
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Puppet::Pops
|
|
2
|
+
module Types
|
|
3
|
+
# Implements a standard visitor patter for the Puppet Type system.
|
|
4
|
+
|
|
5
|
+
#
|
|
6
|
+
# An instance of this module is passed as an argument to the {PAnyType#accept}
|
|
7
|
+
# method of a Type instance. That type will then use the {TypeAcceptor#visit} callback
|
|
8
|
+
# on the acceptor and then pass the acceptor to the `accept` method of all contained
|
|
9
|
+
# type instances so that the it gets a visit from each one recursively.
|
|
10
|
+
#
|
|
11
|
+
module TypeAcceptor
|
|
12
|
+
# @param type [PAnyType] the type that we accept a visit from
|
|
13
|
+
# @param quard [RecursionGuard] the guard against self recursion
|
|
14
|
+
def visit(type, guard)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# An acceptor that does nothing
|
|
19
|
+
class NoopTypeAcceptor
|
|
20
|
+
include TypeAcceptor
|
|
21
|
+
|
|
22
|
+
INSTANCE = NoopTypeAcceptor.new
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -5,13 +5,14 @@ module TypeAsserter
|
|
|
5
5
|
# Asserts that a type_to_check is assignable to required_type and raises
|
|
6
6
|
# a {Puppet::ParseError} if that's not the case
|
|
7
7
|
#
|
|
8
|
-
# @param subject [String] String to be prepended to the exception message
|
|
8
|
+
# @param subject [String,Array] String to be prepended to the exception message or Array where the first element is
|
|
9
|
+
# a format string and the rest are arguments to that format string
|
|
9
10
|
# @param expected_type [PAnyType] Expected type
|
|
10
11
|
# @param type_to_check [PAnyType] Type to check against the required type
|
|
11
12
|
# @return The type_to_check argument
|
|
12
13
|
#
|
|
13
14
|
# @api public
|
|
14
|
-
def self.assert_assignable(subject, expected_type, type_to_check)
|
|
15
|
+
def self.assert_assignable(subject, expected_type, type_to_check, &block)
|
|
15
16
|
report_type_mismatch(subject, expected_type, type_to_check) unless expected_type.assignable?(type_to_check)
|
|
16
17
|
type_to_check
|
|
17
18
|
end
|
|
@@ -19,26 +20,26 @@ module TypeAsserter
|
|
|
19
20
|
# Asserts that a value is an instance of a given type and raises
|
|
20
21
|
# a {Puppet::ParseError} if that's not the case
|
|
21
22
|
#
|
|
22
|
-
# @param subject [String] String to be prepended to the exception message
|
|
23
|
+
# @param subject [String,Array] String to be prepended to the exception message or Array where the first element is
|
|
24
|
+
# a format string and the rest are arguments to that format string
|
|
23
25
|
# @param expected_type [PAnyType] Expected type for the value
|
|
24
26
|
# @param value [Object] Value to check
|
|
25
27
|
# @param nil_ok [Boolean] Can be true to allow nil value. Optional and defaults to false
|
|
26
28
|
# @return The value argument
|
|
27
29
|
#
|
|
28
30
|
# @api public
|
|
29
|
-
def self.assert_instance_of(subject, expected_type, value, nil_ok = false)
|
|
31
|
+
def self.assert_instance_of(subject, expected_type, value, nil_ok = false, &block)
|
|
30
32
|
unless value.nil? && nil_ok
|
|
31
|
-
report_type_mismatch(subject, expected_type, TypeCalculator.singleton.infer_set(value).generalize) unless expected_type.instance?(value)
|
|
33
|
+
report_type_mismatch(subject, expected_type, TypeCalculator.singleton.infer_set(value).generalize, &block) unless expected_type.instance?(value)
|
|
32
34
|
end
|
|
33
35
|
value
|
|
34
36
|
end
|
|
35
37
|
|
|
36
38
|
def self.report_type_mismatch(subject, expected_type, actual_type)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
#
|
|
39
|
+
subject = yield(subject) if block_given?
|
|
40
|
+
subject = subject[0] % subject[1..-1] if subject.is_a?(Array)
|
|
40
41
|
raise TypeAssertionError.new(
|
|
41
|
-
|
|
42
|
+
TypeMismatchDescriber.singleton.describe_mismatch("#{subject} has wrong type,", expected_type, actual_type), expected_type, actual_type)
|
|
42
43
|
end
|
|
43
44
|
private_class_method :report_type_mismatch
|
|
44
45
|
end
|