puppet 4.3.2 → 4.4.0
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.
- checksums.yaml +4 -4
- 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/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/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 +4 -4
- 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/yaml_data_provider_factory.rb +2 -2
- data/lib/puppet/defaults.rb +65 -19
- 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.rb +2 -2
- 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/forge.rb +1 -1
- data/lib/puppet/forge/repository.rb +1 -31
- data/lib/puppet/functions.rb +45 -6
- 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/map.rb +6 -14
- 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/graph/rb_tree_map.rb +1 -1
- data/lib/puppet/indirector/catalog/compiler.rb +188 -5
- 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/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 +3 -0
- 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.rb +1 -1
- data/lib/puppet/node/environment.rb +11 -2
- data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
- data/lib/puppet/parser/compiler.rb +3 -3
- data/lib/puppet/parser/environment_compiler.rb +0 -1
- data/lib/puppet/parser/functions.rb +28 -16
- 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/map.rb +1 -1
- 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/resource.rb +19 -17
- data/lib/puppet/parser/scope.rb +176 -5
- data/lib/puppet/plugins/data_providers/data_provider.rb +54 -13
- data/lib/puppet/pops.rb +0 -8
- data/lib/puppet/pops/adaptable.rb +4 -1
- data/lib/puppet/pops/adapters.rb +38 -13
- 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 +95 -93
- data/lib/puppet/pops/evaluator/closure.rb +84 -68
- data/lib/puppet/pops/evaluator/collector_transformer.rb +18 -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 +41 -45
- data/lib/puppet/pops/issue_reporter.rb +6 -4
- data/lib/puppet/pops/issues.rb +34 -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 +16 -12
- 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.rb +14 -12
- data/lib/puppet/pops/merge_strategy.rb +16 -19
- data/lib/puppet/pops/model/factory.rb +26 -2
- data/lib/puppet/pops/model/model.rb +8 -8
- data/lib/puppet/pops/model/model_label_provider.rb +13 -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 +14 -10
- data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
- data/lib/puppet/pops/parser/lexer2.rb +26 -19
- 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 +11 -7
- 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 +138 -381
- 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 -1247
- data/lib/puppet/pops/utils.rb +11 -10
- data/lib/puppet/pops/validation.rb +11 -9
- data/lib/puppet/pops/validation/checker4_0.rb +83 -55
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
- 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/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 +5 -8
- 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/windows.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +1 -1
- data/lib/puppet/provider/package/zypper.rb +19 -0
- data/lib/puppet/provider/service/debian.rb +2 -2
- data/lib/puppet/provider/service/launchd.rb +6 -18
- 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/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.rb +15 -12
- 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 +28 -38
- data/lib/puppet/settings.rb +1 -1
- data/lib/puppet/settings/config_file.rb +1 -1
- data/lib/puppet/settings/environment_conf.rb +13 -5
- 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.rb +15 -2
- data/lib/puppet/transaction/additional_resource_generator.rb +6 -2
- data/lib/puppet/transaction/report.rb +31 -1
- data/lib/puppet/transaction/resource_harness.rb +0 -25
- data/lib/puppet/type.rb +11 -11
- data/lib/puppet/type/augeas.rb +1 -1
- data/lib/puppet/type/cron.rb +12 -12
- data/lib/puppet/type/file.rb +91 -39
- 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/filebucket.rb +1 -1
- 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/util.rb +109 -22
- 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 +4 -4
- 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 +23 -14
- data/lib/puppet/util/windows/process.rb +78 -11
- data/lib/puppet/util/windows/registry.rb +1 -1
- 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 +42 -4
- data/lib/puppet/util/windows/taskscheduler.rb +15 -15
- data/lib/puppet/util/windows/user.rb +10 -10
- 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/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/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/manifests/init.pp +3 -1
- 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/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/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 +90 -4
- data/spec/integration/util/windows/process_spec.rb +31 -0
- data/spec/integration/util/windows/security_spec.rb +6 -6
- 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/configurer/downloader_spec.rb +5 -5
- data/spec/unit/configurer_spec.rb +271 -39
- 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/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 +11 -3
- data/spec/unit/functions/lookup_spec.rb +58 -13
- 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 +61 -5
- 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/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 +1 -1
- data/spec/unit/parser/compiler_spec.rb +16 -0
- data/spec/unit/parser/scope_spec.rb +28 -11
- data/spec/unit/pops/evaluator/access_ops_spec.rb +3 -3
- data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +7 -1
- 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 +44 -1
- data/spec/unit/pops/parser/lexer2_spec.rb +112 -3
- data/spec/unit/pops/parser/parse_calls_spec.rb +8 -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 -373
- 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 +100 -43
- data/spec/unit/provider/cron/parsed_spec.rb +1 -0
- 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 +47 -34
- 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/yum_spec.rb +11 -0
- data/spec/unit/provider/package/zypper_spec.rb +14 -0
- data/spec/unit/provider/service/launchd_spec.rb +17 -35
- data/spec/unit/provider/service/systemd_spec.rb +7 -0
- data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
- data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
- 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 +96 -57
- 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 +4 -4
- 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 +1 -1
- data/spec/unit/util_spec.rb +123 -13
- data/tasks/cfpropertylist.rake +15 -0
- metadata +114 -26
- 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.rb +0 -22
- 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/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
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'puppet/pops'
|
3
|
+
|
4
|
+
module Puppet::Pops::Types
|
5
|
+
describe 'the type asserter' do
|
6
|
+
let!(:asserter) { TypeAsserter }
|
7
|
+
|
8
|
+
context 'when deferring formatting of subject'
|
9
|
+
it 'can use an array' do
|
10
|
+
expect{ asserter.assert_instance_of(['The %s in the %s', 'gizmo', 'gadget'], PIntegerType::DEFAULT, 'lens') }.to(
|
11
|
+
raise_error(TypeAssertionError, 'The gizmo in the gadget has wrong type, expected an Integer value, got String'))
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'can use an array obtained from block' do
|
15
|
+
expect do
|
16
|
+
asserter.assert_instance_of('gizmo', PIntegerType::DEFAULT, 'lens') { |s| ['The %s in the %s', s, 'gadget'] }
|
17
|
+
end.to(raise_error(TypeAssertionError, 'The gizmo in the gadget has wrong type, expected an Integer value, got String'))
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'can use an subject obtained from zero argument block' do
|
21
|
+
expect do
|
22
|
+
asserter.assert_instance_of(nil, PIntegerType::DEFAULT, 'lens') { 'The gizmo in the gadget' }
|
23
|
+
end.to(raise_error(TypeAssertionError, 'The gizmo in the gadget has wrong type, expected an Integer value, got String'))
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'does not produce a string unless the assertion fails' do
|
27
|
+
TypeAsserter.expects(:report_type_mismatch).never
|
28
|
+
asserter.assert_instance_of(nil, PIntegerType::DEFAULT, 1)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'does not format string unless the assertion fails' do
|
32
|
+
fmt_string = 'The %s in the %s'
|
33
|
+
fmt_string.expects(:'%').never
|
34
|
+
asserter.assert_instance_of([fmt_string, 'gizmo', 'gadget'], PIntegerType::DEFAULT, 1)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'does not call block unless the assertion fails' do
|
38
|
+
expect do
|
39
|
+
asserter.assert_instance_of(nil, PIntegerType::DEFAULT, 1) { |s| raise Error }
|
40
|
+
end.not_to raise_error
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -40,6 +40,15 @@ describe 'The type calculator' do
|
|
40
40
|
Puppet::Pops::Types::TypeFactory.variant(*types)
|
41
41
|
end
|
42
42
|
|
43
|
+
def type_alias_t(name, type_string)
|
44
|
+
type_expr = Puppet::Pops::Parser::EvaluatingParser.new.parse_string(type_string).current
|
45
|
+
Puppet::Pops::Types::TypeFactory.type_alias(name, type_expr)
|
46
|
+
end
|
47
|
+
|
48
|
+
def type_reference_t(name, *args)
|
49
|
+
Puppet::Pops::Types::TypeFactory.type_reference(name, args)
|
50
|
+
end
|
51
|
+
|
43
52
|
def integer_t
|
44
53
|
Puppet::Pops::Types::TypeFactory.integer
|
45
54
|
end
|
@@ -88,6 +97,10 @@ describe 'The type calculator' do
|
|
88
97
|
Puppet::Pops::Types::TypeFactory.optional(t)
|
89
98
|
end
|
90
99
|
|
100
|
+
def type_t(t)
|
101
|
+
Puppet::Pops::Types::TypeFactory.type_type(t)
|
102
|
+
end
|
103
|
+
|
91
104
|
def not_undef_t(t = nil)
|
92
105
|
Puppet::Pops::Types::TypeFactory.not_undef(t)
|
93
106
|
end
|
@@ -105,99 +118,6 @@ describe 'The type calculator' do
|
|
105
118
|
Puppet::Pops::Types
|
106
119
|
end
|
107
120
|
|
108
|
-
shared_context 'types_setup' do
|
109
|
-
|
110
|
-
# Do not include the special type Unit in this list
|
111
|
-
def all_types
|
112
|
-
[ Puppet::Pops::Types::PAnyType,
|
113
|
-
Puppet::Pops::Types::PUndefType,
|
114
|
-
Puppet::Pops::Types::PNotUndefType,
|
115
|
-
Puppet::Pops::Types::PDataType,
|
116
|
-
Puppet::Pops::Types::PScalarType,
|
117
|
-
Puppet::Pops::Types::PStringType,
|
118
|
-
Puppet::Pops::Types::PNumericType,
|
119
|
-
Puppet::Pops::Types::PIntegerType,
|
120
|
-
Puppet::Pops::Types::PFloatType,
|
121
|
-
Puppet::Pops::Types::PRegexpType,
|
122
|
-
Puppet::Pops::Types::PBooleanType,
|
123
|
-
Puppet::Pops::Types::PCollectionType,
|
124
|
-
Puppet::Pops::Types::PArrayType,
|
125
|
-
Puppet::Pops::Types::PHashType,
|
126
|
-
Puppet::Pops::Types::PRuntimeType,
|
127
|
-
Puppet::Pops::Types::PHostClassType,
|
128
|
-
Puppet::Pops::Types::PResourceType,
|
129
|
-
Puppet::Pops::Types::PPatternType,
|
130
|
-
Puppet::Pops::Types::PEnumType,
|
131
|
-
Puppet::Pops::Types::PVariantType,
|
132
|
-
Puppet::Pops::Types::PStructType,
|
133
|
-
Puppet::Pops::Types::PTupleType,
|
134
|
-
Puppet::Pops::Types::PCallableType,
|
135
|
-
Puppet::Pops::Types::PType,
|
136
|
-
Puppet::Pops::Types::POptionalType,
|
137
|
-
Puppet::Pops::Types::PDefaultType,
|
138
|
-
]
|
139
|
-
end
|
140
|
-
|
141
|
-
def scalar_types
|
142
|
-
# PVariantType is also scalar, if its types are all Scalar
|
143
|
-
[
|
144
|
-
Puppet::Pops::Types::PScalarType,
|
145
|
-
Puppet::Pops::Types::PStringType,
|
146
|
-
Puppet::Pops::Types::PNumericType,
|
147
|
-
Puppet::Pops::Types::PIntegerType,
|
148
|
-
Puppet::Pops::Types::PFloatType,
|
149
|
-
Puppet::Pops::Types::PRegexpType,
|
150
|
-
Puppet::Pops::Types::PBooleanType,
|
151
|
-
Puppet::Pops::Types::PPatternType,
|
152
|
-
Puppet::Pops::Types::PEnumType,
|
153
|
-
]
|
154
|
-
end
|
155
|
-
|
156
|
-
def numeric_types
|
157
|
-
# PVariantType is also numeric, if its types are all numeric
|
158
|
-
[
|
159
|
-
Puppet::Pops::Types::PNumericType,
|
160
|
-
Puppet::Pops::Types::PIntegerType,
|
161
|
-
Puppet::Pops::Types::PFloatType,
|
162
|
-
]
|
163
|
-
end
|
164
|
-
|
165
|
-
def string_types
|
166
|
-
# PVariantType is also string type, if its types are all compatible
|
167
|
-
[
|
168
|
-
Puppet::Pops::Types::PStringType,
|
169
|
-
Puppet::Pops::Types::PPatternType,
|
170
|
-
Puppet::Pops::Types::PEnumType,
|
171
|
-
]
|
172
|
-
end
|
173
|
-
|
174
|
-
def collection_types
|
175
|
-
# PVariantType is also string type, if its types are all compatible
|
176
|
-
[
|
177
|
-
Puppet::Pops::Types::PCollectionType,
|
178
|
-
Puppet::Pops::Types::PHashType,
|
179
|
-
Puppet::Pops::Types::PArrayType,
|
180
|
-
Puppet::Pops::Types::PStructType,
|
181
|
-
Puppet::Pops::Types::PTupleType,
|
182
|
-
]
|
183
|
-
end
|
184
|
-
|
185
|
-
def data_compatible_types
|
186
|
-
result = scalar_types
|
187
|
-
result << Puppet::Pops::Types::PDataType
|
188
|
-
result << array_t(types::PDataType::DEFAULT)
|
189
|
-
result << types::TypeFactory.hash_of_data
|
190
|
-
result << Puppet::Pops::Types::PUndefType
|
191
|
-
result << not_undef_t(types::PDataType.new)
|
192
|
-
result << constrained_tuple_t(range_t(0, nil), types::PDataType::DEFAULT)
|
193
|
-
result
|
194
|
-
end
|
195
|
-
|
196
|
-
def type_from_class(c)
|
197
|
-
c.is_a?(Class) ? c::DEFAULT : c
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
201
121
|
context 'when inferring ruby' do
|
202
122
|
|
203
123
|
it 'fixnum translates to PIntegerType' do
|
@@ -234,12 +154,16 @@ describe 'The type calculator' do
|
|
234
154
|
expect(calculator.infer(/^a regular expression$/).class).to eq(Puppet::Pops::Types::PRegexpType)
|
235
155
|
end
|
236
156
|
|
157
|
+
it 'iterable translates to PIteratorType' do
|
158
|
+
expect(calculator.infer(Puppet::Pops::Types::Iterable.on(1))).to be_a(Puppet::Pops::Types::PIteratorType)
|
159
|
+
end
|
160
|
+
|
237
161
|
it 'nil translates to PUndefType' do
|
238
162
|
expect(calculator.infer(nil).class).to eq(Puppet::Pops::Types::PUndefType)
|
239
163
|
end
|
240
164
|
|
241
|
-
it ':undef translates to
|
242
|
-
expect(calculator.infer(:undef).class).to eq(Puppet::Pops::Types::
|
165
|
+
it ':undef translates to PUndefType' do
|
166
|
+
expect(calculator.infer(:undef).class).to eq(Puppet::Pops::Types::PUndefType)
|
243
167
|
end
|
244
168
|
|
245
169
|
it 'an instance of class Foo translates to PRuntimeType[ruby, Foo]' do
|
@@ -455,35 +379,35 @@ describe 'The type calculator' do
|
|
455
379
|
it 'computes given resource type commonality' do
|
456
380
|
r1 = Puppet::Pops::Types::PResourceType.new('File', nil)
|
457
381
|
r2 = Puppet::Pops::Types::PResourceType.new('File', nil)
|
458
|
-
expect(calculator.
|
382
|
+
expect(calculator.common_type(r1, r2).to_s).to eq('File')
|
459
383
|
|
460
384
|
|
461
385
|
r2 = Puppet::Pops::Types::PResourceType.new('File', '/tmp/foo')
|
462
|
-
expect(calculator.
|
386
|
+
expect(calculator.common_type(r1, r2).to_s).to eq('File')
|
463
387
|
|
464
388
|
r1 = Puppet::Pops::Types::PResourceType.new('File', '/tmp/foo')
|
465
|
-
expect(calculator.
|
389
|
+
expect(calculator.common_type(r1, r2).to_s).to eq("File['/tmp/foo']")
|
466
390
|
|
467
391
|
r1 = Puppet::Pops::Types::PResourceType.new('File', '/tmp/bar')
|
468
|
-
expect(calculator.
|
392
|
+
expect(calculator.common_type(r1, r2).to_s).to eq('File')
|
469
393
|
|
470
394
|
r2 = Puppet::Pops::Types::PResourceType.new('Package', 'apache')
|
471
|
-
expect(calculator.
|
395
|
+
expect(calculator.common_type(r1, r2).to_s).to eq('Resource')
|
472
396
|
end
|
473
397
|
|
474
398
|
it 'computes given hostclass type commonality' do
|
475
399
|
r1 = Puppet::Pops::Types::PHostClassType.new('foo')
|
476
400
|
r2 = Puppet::Pops::Types::PHostClassType.new('foo')
|
477
|
-
expect(calculator.
|
401
|
+
expect(calculator.common_type(r1, r2).to_s).to eq('Class[foo]')
|
478
402
|
|
479
403
|
r2 = Puppet::Pops::Types::PHostClassType.new('bar')
|
480
|
-
expect(calculator.
|
404
|
+
expect(calculator.common_type(r1, r2).to_s).to eq('Class')
|
481
405
|
|
482
406
|
r2 = Puppet::Pops::Types::PHostClassType.new(nil)
|
483
|
-
expect(calculator.
|
407
|
+
expect(calculator.common_type(r1, r2).to_s).to eq('Class')
|
484
408
|
|
485
409
|
r1 = Puppet::Pops::Types::PHostClassType.new(nil)
|
486
|
-
expect(calculator.
|
410
|
+
expect(calculator.common_type(r1, r2).to_s).to eq('Class')
|
487
411
|
end
|
488
412
|
|
489
413
|
context 'of strings' do
|
@@ -526,7 +450,7 @@ describe 'The type calculator' do
|
|
526
450
|
common_t = calculator.common_type(t1,t2)
|
527
451
|
expect(common_t.class).to eq(Puppet::Pops::Types::PPatternType)
|
528
452
|
expect(common_t.patterns.map { |pr| pr.pattern }).to eq(['abc', 'xyz'])
|
529
|
-
expect(
|
453
|
+
expect(common_t.to_s).to eq('Pattern[/abc/, /xyz/]')
|
530
454
|
end
|
531
455
|
|
532
456
|
it 'computes enum commonality to value set sum' do
|
@@ -686,6 +610,36 @@ describe 'The type calculator' do
|
|
686
610
|
end
|
687
611
|
end
|
688
612
|
|
613
|
+
context "for TypeReference, such that" do
|
614
|
+
it 'no other type is assignable' do
|
615
|
+
t = Puppet::Pops::Types::PTypeReferenceType::DEFAULT
|
616
|
+
all_instances = (all_types - [
|
617
|
+
Puppet::Pops::Types::PTypeReferenceType, # Avoid comparison with t
|
618
|
+
Puppet::Pops::Types::PVariantType, # DEFAULT contains no variants, so assignability is never tested and always true
|
619
|
+
Puppet::Pops::Types::PTypeAliasType # DEFAULT resolves to PTypeReferenceType::DEFAULT, i.e. t
|
620
|
+
]).map {|c| c::DEFAULT }
|
621
|
+
|
622
|
+
# Add a non-empty variant
|
623
|
+
all_instances << variant_t(Puppet::Pops::Types::PAnyType::DEFAULT)
|
624
|
+
# Add a type alias that doesn't resolve to 't'
|
625
|
+
all_instances << type_alias_t('MyInt', 'Integer').resolve(Puppet::Pops::Types::TypeParser.new, nil)
|
626
|
+
|
627
|
+
all_instances.each { |i| expect(i).not_to be_assignable_to(t) }
|
628
|
+
end
|
629
|
+
|
630
|
+
it 'a TypeReference to the exact same type is assignable' do
|
631
|
+
expect(type_reference_t('Integer[0,10]')).to be_assignable_to(type_reference_t('Integer[0,10]'))
|
632
|
+
end
|
633
|
+
|
634
|
+
it 'a TypeReference to the different type is not assignable' do
|
635
|
+
expect(type_reference_t('String')).not_to be_assignable_to(type_reference_t('Integer'))
|
636
|
+
end
|
637
|
+
|
638
|
+
it 'a TypeReference to the different type is not assignable even if the referenced type is' do
|
639
|
+
expect(type_reference_t('Integer[1,2]')).not_to be_assignable_to(type_reference_t('Integer[0,3]'))
|
640
|
+
end
|
641
|
+
end
|
642
|
+
|
689
643
|
context 'for Data, such that' do
|
690
644
|
it 'all scalars + array and hash are assignable to Data' do
|
691
645
|
t = Puppet::Pops::Types::PDataType::DEFAULT
|
@@ -793,7 +747,11 @@ describe 'The type calculator' do
|
|
793
747
|
end
|
794
748
|
|
795
749
|
it 'Collection is not assignable to any disjunct type' do
|
796
|
-
tested_types = all_types - [
|
750
|
+
tested_types = all_types - [
|
751
|
+
Puppet::Pops::Types::PAnyType,
|
752
|
+
Puppet::Pops::Types::POptionalType,
|
753
|
+
Puppet::Pops::Types::PNotUndefType,
|
754
|
+
Puppet::Pops::Types::PIterableType] - collection_types
|
797
755
|
t = Puppet::Pops::Types::PCollectionType::DEFAULT
|
798
756
|
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
799
757
|
end
|
@@ -815,6 +773,7 @@ describe 'The type calculator' do
|
|
815
773
|
Puppet::Pops::Types::PAnyType,
|
816
774
|
Puppet::Pops::Types::POptionalType,
|
817
775
|
Puppet::Pops::Types::PNotUndefType,
|
776
|
+
Puppet::Pops::Types::PIterableType,
|
818
777
|
Puppet::Pops::Types::PDataType] - collection_types
|
819
778
|
t = Puppet::Pops::Types::PArrayType::DEFAULT
|
820
779
|
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
@@ -841,6 +800,7 @@ describe 'The type calculator' do
|
|
841
800
|
Puppet::Pops::Types::PAnyType,
|
842
801
|
Puppet::Pops::Types::POptionalType,
|
843
802
|
Puppet::Pops::Types::PNotUndefType,
|
803
|
+
Puppet::Pops::Types::PIterableType,
|
844
804
|
Puppet::Pops::Types::PDataType] - collection_types
|
845
805
|
t = Puppet::Pops::Types::PHashType::DEFAULT
|
846
806
|
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
@@ -878,6 +838,7 @@ describe 'The type calculator' do
|
|
878
838
|
Puppet::Pops::Types::PAnyType,
|
879
839
|
Puppet::Pops::Types::POptionalType,
|
880
840
|
Puppet::Pops::Types::PNotUndefType,
|
841
|
+
Puppet::Pops::Types::PIterableType,
|
881
842
|
Puppet::Pops::Types::PDataType] - collection_types
|
882
843
|
t = Puppet::Pops::Types::PTupleType::DEFAULT
|
883
844
|
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
@@ -899,6 +860,7 @@ describe 'The type calculator' do
|
|
899
860
|
Puppet::Pops::Types::PAnyType,
|
900
861
|
Puppet::Pops::Types::POptionalType,
|
901
862
|
Puppet::Pops::Types::PNotUndefType,
|
863
|
+
Puppet::Pops::Types::PIterableType,
|
902
864
|
Puppet::Pops::Types::PDataType] - collection_types
|
903
865
|
t = Puppet::Pops::Types::PStructType::DEFAULT
|
904
866
|
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
@@ -1323,6 +1285,122 @@ describe 'The type calculator' do
|
|
1323
1285
|
expect(calculator.assignable?(r1, r2)).to eq(false)
|
1324
1286
|
end
|
1325
1287
|
|
1288
|
+
context 'for TypeAlias, such that' do
|
1289
|
+
let!(:parser) { Puppet::Pops::Types::TypeParser.new }
|
1290
|
+
|
1291
|
+
it 'it is assignable to the type that it is an alias for' do
|
1292
|
+
t = type_alias_t('Alias', 'Integer').resolve(parser, nil)
|
1293
|
+
expect(calculator.assignable?(integer_t, t)).to be_truthy
|
1294
|
+
end
|
1295
|
+
|
1296
|
+
it 'the type that it is an alias for is assignable to it' do
|
1297
|
+
t = type_alias_t('Alias', 'Integer').resolve(parser, nil)
|
1298
|
+
expect(calculator.assignable?(t, integer_t)).to be_truthy
|
1299
|
+
end
|
1300
|
+
|
1301
|
+
it 'a recursive alias can be assignable from a conformant type with any depth' do
|
1302
|
+
scope = mock
|
1303
|
+
|
1304
|
+
t = type_alias_t('Tree', 'Hash[String,Variant[String,Tree]]')
|
1305
|
+
loader = mock
|
1306
|
+
loader.expects(:load).with(:type, 'tree').returns t
|
1307
|
+
|
1308
|
+
Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object).with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).at_most_once.returns loader
|
1309
|
+
|
1310
|
+
t.resolve(parser, scope)
|
1311
|
+
expect(calculator.assignable?(t, parser.parse('Hash[String,Variant[String,Hash[String,Variant[String,String]]]]'))).to be_truthy
|
1312
|
+
end
|
1313
|
+
|
1314
|
+
|
1315
|
+
it 'similar recursive aliases are assignable' do
|
1316
|
+
scope = mock
|
1317
|
+
|
1318
|
+
t1 = type_alias_t('Tree1', 'Hash[String,Variant[String,Tree1]]')
|
1319
|
+
t2 = type_alias_t('Tree2', 'Hash[String,Variant[String,Tree2]]')
|
1320
|
+
loader = mock
|
1321
|
+
loader.expects(:load).with(:type, 'tree1').returns t1
|
1322
|
+
loader.expects(:load).with(:type, 'tree2').returns t2
|
1323
|
+
|
1324
|
+
Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object).with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).at_least_once.returns loader
|
1325
|
+
|
1326
|
+
t1.resolve(parser, scope)
|
1327
|
+
t2.resolve(parser, scope)
|
1328
|
+
expect(calculator.assignable?(t1, t2)).to be_truthy
|
1329
|
+
end
|
1330
|
+
|
1331
|
+
it 'crossing recursive aliases are assignable' do
|
1332
|
+
scope = mock
|
1333
|
+
|
1334
|
+
t1 = type_alias_t('Tree1', 'Hash[String,Variant[String,Tree2]]')
|
1335
|
+
t2 = type_alias_t('Tree2', 'Hash[String,Variant[String,Tree1]]')
|
1336
|
+
loader = mock
|
1337
|
+
loader.expects(:load).with(:type, 'tree1').returns t1
|
1338
|
+
loader.expects(:load).with(:type, 'tree2').returns t2
|
1339
|
+
loader.expects(:is_a?).with(Puppet::Pops::Loader::Loader).returns true
|
1340
|
+
|
1341
|
+
Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object).with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).at_least_once.returns loader
|
1342
|
+
|
1343
|
+
t1.resolve(parser, scope)
|
1344
|
+
t2.resolve(parser, scope)
|
1345
|
+
expect(calculator.assignable?(t1, t2)).to be_truthy
|
1346
|
+
end
|
1347
|
+
|
1348
|
+
it 'Type[T] is assignable to Type[AT] when AT is an alias for T' do
|
1349
|
+
scope = mock
|
1350
|
+
|
1351
|
+
ta = type_alias_t('PositiveInteger', 'Integer[0,default]')
|
1352
|
+
loader = mock
|
1353
|
+
loader.expects(:load).with(:type, 'positiveinteger').returns ta
|
1354
|
+
Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object)
|
1355
|
+
.with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).returns loader
|
1356
|
+
|
1357
|
+
t1 = type_t(range_t(0, :default))
|
1358
|
+
t2 = parser.parse('Type[PositiveInteger]', scope)
|
1359
|
+
expect(calculator.assignable?(t2, t1)).to be_truthy
|
1360
|
+
end
|
1361
|
+
|
1362
|
+
it 'Type[T] is assignable to AT when AT is an alias for Type[T]' do
|
1363
|
+
scope = mock
|
1364
|
+
|
1365
|
+
ta = type_alias_t('PositiveIntegerType', 'Type[Integer[0,default]]')
|
1366
|
+
loader = mock
|
1367
|
+
loader.expects(:load).with(:type, 'positiveintegertype').returns ta
|
1368
|
+
Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object)
|
1369
|
+
.with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).returns loader
|
1370
|
+
|
1371
|
+
t1 = type_t(range_t(0, :default))
|
1372
|
+
t2 = parser.parse('PositiveIntegerType', scope)
|
1373
|
+
expect(calculator.assignable?(t2, t1)).to be_truthy
|
1374
|
+
end
|
1375
|
+
|
1376
|
+
it 'Type[Type[T]] is assignable to Type[Type[AT]] when AT is an alias for T' do
|
1377
|
+
scope = mock
|
1378
|
+
|
1379
|
+
ta = type_alias_t('PositiveInteger', 'Integer[0,default]')
|
1380
|
+
loader = mock
|
1381
|
+
loader.expects(:load).with(:type, 'positiveinteger').returns ta
|
1382
|
+
Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object)
|
1383
|
+
.with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).returns loader
|
1384
|
+
|
1385
|
+
t1 = type_t(type_t(range_t(0, :default)))
|
1386
|
+
t2 = parser.parse('Type[Type[PositiveInteger]]', scope)
|
1387
|
+
expect(calculator.assignable?(t2, t1)).to be_truthy
|
1388
|
+
end
|
1389
|
+
|
1390
|
+
it 'Type[Type[T]] is assignable to Type[AT] when AT is an alias for Type[T]' do
|
1391
|
+
scope = mock
|
1392
|
+
|
1393
|
+
ta = type_alias_t('PositiveIntegerType', 'Type[Integer[0,default]]')
|
1394
|
+
loader = mock
|
1395
|
+
loader.expects(:load).with(:type, 'positiveintegertype').returns ta
|
1396
|
+
Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object)
|
1397
|
+
.with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).returns loader
|
1398
|
+
|
1399
|
+
t1 = type_t(type_t(range_t(0, :default)))
|
1400
|
+
t2 = parser.parse('Type[PositiveIntegerType]', scope)
|
1401
|
+
expect(calculator.assignable?(t2, t1)).to be_truthy
|
1402
|
+
end
|
1403
|
+
end
|
1326
1404
|
end
|
1327
1405
|
|
1328
1406
|
context 'when testing if x is instance of type t' do
|
@@ -1340,8 +1418,16 @@ describe 'The type calculator' do
|
|
1340
1418
|
end
|
1341
1419
|
end
|
1342
1420
|
|
1343
|
-
it "should
|
1344
|
-
expect(calculator.
|
1421
|
+
it "should infer :undef to be Undef" do
|
1422
|
+
expect(calculator.infer(:undef)).to be_assignable_to(undef_t)
|
1423
|
+
end
|
1424
|
+
|
1425
|
+
it "should not consider :default to be instance of Runtime['ruby', 'Symbol]" do
|
1426
|
+
expect(calculator.instance?(Puppet::Pops::Types::PRuntimeType.new(:ruby, 'Symbol'), :default)).to eq(false)
|
1427
|
+
end
|
1428
|
+
|
1429
|
+
it "should not consider :undef to be instance of Runtime['ruby', 'Symbol]" do
|
1430
|
+
expect(calculator.instance?(Puppet::Pops::Types::PRuntimeType.new(:ruby, 'Symbol'), :undef)).to eq(false)
|
1345
1431
|
end
|
1346
1432
|
|
1347
1433
|
it 'should consider :undef to be instance of an Optional type' do
|
@@ -1591,6 +1677,49 @@ describe 'The type calculator' do
|
|
1591
1677
|
expect(calculator.instance?(callable_t(String), f)).to be_truthy
|
1592
1678
|
end
|
1593
1679
|
end
|
1680
|
+
|
1681
|
+
context 'and t is a TypeAlias' do
|
1682
|
+
let!(:parser) { Puppet::Pops::Types::TypeParser.new }
|
1683
|
+
|
1684
|
+
it 'should consider x an instance of the aliased simple type' do
|
1685
|
+
t = type_alias_t('Alias', 'Integer').resolve(parser, nil)
|
1686
|
+
expect(calculator.instance?(t, 15)).to be_truthy
|
1687
|
+
end
|
1688
|
+
|
1689
|
+
it 'should consider x an instance of the aliased parameterized type' do
|
1690
|
+
t = type_alias_t('Alias', 'Integer[0,20]').resolve(parser, nil)
|
1691
|
+
expect(calculator.instance?(t, 15)).to be_truthy
|
1692
|
+
end
|
1693
|
+
|
1694
|
+
it 'should consider x an instance of the aliased type that uses self recursion' do
|
1695
|
+
scope = mock
|
1696
|
+
|
1697
|
+
t = type_alias_t('Tree', 'Hash[String,Variant[String,Tree]]')
|
1698
|
+
loader = mock
|
1699
|
+
loader.expects(:load).with(:type, 'tree').returns t
|
1700
|
+
|
1701
|
+
Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object).with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).at_most_once.returns loader
|
1702
|
+
|
1703
|
+
t.resolve(parser, scope)
|
1704
|
+
expect(calculator.instance?(t, {'a'=>{'aa'=>{'aaa'=>'aaaa'}}, 'b'=>'bb'})).to be_truthy
|
1705
|
+
end
|
1706
|
+
|
1707
|
+
it 'should consider x an instance of the aliased type that uses contains an alias that causes self recursion' do
|
1708
|
+
scope = mock
|
1709
|
+
|
1710
|
+
t1 = type_alias_t('Tree', 'Hash[String,Variant[String,OtherTree]]')
|
1711
|
+
t2 = type_alias_t('OtherTree', 'Hash[String,Tree]')
|
1712
|
+
loader = mock
|
1713
|
+
loader.expects(:load).with(:type, 'tree').returns t1
|
1714
|
+
loader.expects(:load).with(:type, 'othertree').returns t2
|
1715
|
+
loader.expects(:is_a?).with(Puppet::Pops::Loader::Loader).returns true
|
1716
|
+
|
1717
|
+
Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object).with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).at_least_once.returns loader
|
1718
|
+
|
1719
|
+
t1.resolve(parser, scope)
|
1720
|
+
expect(calculator.instance?(t1, {'a'=>{'aa'=>{'aaa'=>'aaaa'}}, 'b'=>'bb'})).to be_truthy
|
1721
|
+
end
|
1722
|
+
end
|
1594
1723
|
end
|
1595
1724
|
|
1596
1725
|
context 'when converting a ruby class' do
|
@@ -1636,235 +1765,6 @@ describe 'The type calculator' do
|
|
1636
1765
|
end
|
1637
1766
|
end
|
1638
1767
|
|
1639
|
-
context 'when representing the type as string' do
|
1640
|
-
it 'should yield \'Type\' for PType' do
|
1641
|
-
expect(calculator.string(Puppet::Pops::Types::PType::DEFAULT)).to eq('Type')
|
1642
|
-
end
|
1643
|
-
|
1644
|
-
it 'should yield \'Object\' for PAnyType' do
|
1645
|
-
expect(calculator.string(Puppet::Pops::Types::PAnyType::DEFAULT)).to eq('Any')
|
1646
|
-
end
|
1647
|
-
|
1648
|
-
it 'should yield \'Scalar\' for PScalarType' do
|
1649
|
-
expect(calculator.string(Puppet::Pops::Types::PScalarType::DEFAULT)).to eq('Scalar')
|
1650
|
-
end
|
1651
|
-
|
1652
|
-
it 'should yield \'Boolean\' for PBooleanType' do
|
1653
|
-
expect(calculator.string(Puppet::Pops::Types::PBooleanType::DEFAULT)).to eq('Boolean')
|
1654
|
-
end
|
1655
|
-
|
1656
|
-
it 'should yield \'Data\' for PDataType' do
|
1657
|
-
expect(calculator.string(Puppet::Pops::Types::PDataType::DEFAULT)).to eq('Data')
|
1658
|
-
end
|
1659
|
-
|
1660
|
-
it 'should yield \'Numeric\' for PNumericType' do
|
1661
|
-
expect(calculator.string(Puppet::Pops::Types::PNumericType::DEFAULT)).to eq('Numeric')
|
1662
|
-
end
|
1663
|
-
|
1664
|
-
it 'should yield \'Integer\' and from/to for PIntegerType' do
|
1665
|
-
int_T = Puppet::Pops::Types::PIntegerType
|
1666
|
-
expect(calculator.string(int_T::DEFAULT)).to eq('Integer')
|
1667
|
-
int = int_T.new(1, 1)
|
1668
|
-
expect(calculator.string(int)).to eq('Integer[1, 1]')
|
1669
|
-
int = int_T.new(1, 2)
|
1670
|
-
expect(calculator.string(int)).to eq('Integer[1, 2]')
|
1671
|
-
int = int_T.new(nil, 2)
|
1672
|
-
expect(calculator.string(int)).to eq('Integer[default, 2]')
|
1673
|
-
int = int_T.new(2, nil)
|
1674
|
-
expect(calculator.string(int)).to eq('Integer[2, default]')
|
1675
|
-
end
|
1676
|
-
|
1677
|
-
it 'should yield \'Float\' for PFloatType' do
|
1678
|
-
expect(calculator.string(Puppet::Pops::Types::PFloatType::DEFAULT)).to eq('Float')
|
1679
|
-
end
|
1680
|
-
|
1681
|
-
it 'should yield \'Regexp\' for PRegexpType' do
|
1682
|
-
expect(calculator.string(Puppet::Pops::Types::PRegexpType::DEFAULT)).to eq('Regexp')
|
1683
|
-
end
|
1684
|
-
|
1685
|
-
it 'should yield \'Regexp[/pat/]\' for parameterized PRegexpType' do
|
1686
|
-
t = Puppet::Pops::Types::PRegexpType.new('a/b')
|
1687
|
-
expect(calculator.string(t)).to eq('Regexp[/a\/b/]')
|
1688
|
-
end
|
1689
|
-
|
1690
|
-
it 'should yield \'String\' for PStringType' do
|
1691
|
-
expect(calculator.string(Puppet::Pops::Types::PStringType::DEFAULT)).to eq('String')
|
1692
|
-
end
|
1693
|
-
|
1694
|
-
it 'should yield \'String\' for PStringType with multiple values' do
|
1695
|
-
expect(calculator.string(string_t('a', 'b', 'c'))).to eq('String')
|
1696
|
-
end
|
1697
|
-
|
1698
|
-
it 'should yield \'String\' and from/to for PStringType' do
|
1699
|
-
string_T = Puppet::Pops::Types::PStringType
|
1700
|
-
expect(calculator.string(string_T.new(range_t(1,1)))).to eq('String[1, 1]')
|
1701
|
-
expect(calculator.string(string_T.new(range_t(1,2)))).to eq('String[1, 2]')
|
1702
|
-
expect(calculator.string(string_T.new(range_t(:default, 2)))).to eq('String[default, 2]')
|
1703
|
-
expect(calculator.string(string_T.new(range_t(2, :default)))).to eq('String[2, default]')
|
1704
|
-
end
|
1705
|
-
|
1706
|
-
it 'should yield \'Array[Integer]\' for PArrayType[PIntegerType]' do
|
1707
|
-
t = Puppet::Pops::Types::PArrayType.new(Puppet::Pops::Types::PIntegerType::DEFAULT)
|
1708
|
-
expect(calculator.string(t)).to eq('Array[Integer]')
|
1709
|
-
end
|
1710
|
-
|
1711
|
-
it 'should yield \'Array[Unit, 0, 0]\' for an empty array' do
|
1712
|
-
t = empty_array_t
|
1713
|
-
expect(calculator.string(t)).to eq('Array[Unit, 0, 0]')
|
1714
|
-
end
|
1715
|
-
|
1716
|
-
it 'should yield \'Collection\' and from/to for PCollectionType' do
|
1717
|
-
expect(calculator.string(collection_t(range_t(1,1)))).to eq('Collection[1, 1]')
|
1718
|
-
expect(calculator.string(collection_t(range_t(1,2)))).to eq('Collection[1, 2]')
|
1719
|
-
expect(calculator.string(collection_t(range_t(:default, 2)))).to eq('Collection[default, 2]')
|
1720
|
-
expect(calculator.string(collection_t(range_t(2, :default)))).to eq('Collection[2, default]')
|
1721
|
-
end
|
1722
|
-
|
1723
|
-
it 'should yield \'Array\' and from/to for PArrayType' do
|
1724
|
-
expect(calculator.string(array_t(string_t, range_t(1,1)))).to eq('Array[String, 1, 1]')
|
1725
|
-
expect(calculator.string(array_t(string_t, range_t(1,2)))).to eq('Array[String, 1, 2]')
|
1726
|
-
expect(calculator.string(array_t(string_t, range_t(:default, 2)))).to eq('Array[String, default, 2]')
|
1727
|
-
expect(calculator.string(array_t(string_t, range_t(2, :default)))).to eq('Array[String, 2, default]')
|
1728
|
-
end
|
1729
|
-
|
1730
|
-
it 'should yield \'Tuple[Integer]\' for PTupleType[PIntegerType]' do
|
1731
|
-
t = Puppet::Pops::Types::PTupleType.new([Puppet::Pops::Types::PIntegerType::DEFAULT])
|
1732
|
-
expect(calculator.string(t)).to eq('Tuple[Integer]')
|
1733
|
-
end
|
1734
|
-
|
1735
|
-
it 'should yield \'Tuple[T, T,..]\' for PTupleType[T, T, ...]' do
|
1736
|
-
t = Puppet::Pops::Types::PTupleType.new([Puppet::Pops::Types::PIntegerType::DEFAULT, Puppet::Pops::Types::PIntegerType::DEFAULT, Puppet::Pops::Types::PStringType::DEFAULT])
|
1737
|
-
expect(calculator.string(t)).to eq('Tuple[Integer, Integer, String]')
|
1738
|
-
end
|
1739
|
-
|
1740
|
-
it 'should yield \'Tuple\' and from/to for PTupleType' do
|
1741
|
-
expect(calculator.string(constrained_tuple_t(range_t(1,1), string_t))).to eq('Tuple[String, 1, 1]')
|
1742
|
-
expect(calculator.string(constrained_tuple_t(range_t(1,2), string_t))).to eq('Tuple[String, 1, 2]')
|
1743
|
-
expect(calculator.string(constrained_tuple_t(range_t(:default, 2), string_t))).to eq('Tuple[String, 0, 2]')
|
1744
|
-
expect(calculator.string(constrained_tuple_t(range_t(2, :default), string_t))).to eq('Tuple[String, 2, default]')
|
1745
|
-
end
|
1746
|
-
|
1747
|
-
it 'should yield \'Struct\' and details for PStructType' do
|
1748
|
-
struct_t = struct_t({'a'=>Integer, 'b'=>String})
|
1749
|
-
expect(calculator.string(struct_t)).to eq("Struct[{'a'=>Integer, 'b'=>String}]")
|
1750
|
-
struct_t = struct_t({})
|
1751
|
-
expect(calculator.string(struct_t)).to eq('Struct')
|
1752
|
-
end
|
1753
|
-
|
1754
|
-
it 'should yield \'Hash[String, Integer]\' for PHashType[PStringType, PIntegerType]' do
|
1755
|
-
t = Puppet::Pops::Types::PHashType.new(Puppet::Pops::Types::PStringType::DEFAULT, Puppet::Pops::Types::PIntegerType::DEFAULT)
|
1756
|
-
expect(calculator.string(t)).to eq('Hash[String, Integer]')
|
1757
|
-
end
|
1758
|
-
|
1759
|
-
it 'should yield \'Hash\' and from/to for PHashType' do
|
1760
|
-
expect(calculator.string(hash_t(string_t, string_t, range_t(1,1)))).to eq('Hash[String, String, 1, 1]')
|
1761
|
-
expect(calculator.string(hash_t(string_t, string_t, range_t(1,2)))).to eq('Hash[String, String, 1, 2]')
|
1762
|
-
expect(calculator.string(hash_t(string_t, string_t, range_t(:default, 2)))).to eq('Hash[String, String, default, 2]')
|
1763
|
-
expect(calculator.string(hash_t(string_t, string_t, range_t(2, :default)))).to eq('Hash[String, String, 2, default]')
|
1764
|
-
end
|
1765
|
-
|
1766
|
-
it "should yield 'Class' for a PHostClassType" do
|
1767
|
-
t = Puppet::Pops::Types::PHostClassType::DEFAULT
|
1768
|
-
expect(calculator.string(t)).to eq('Class')
|
1769
|
-
end
|
1770
|
-
|
1771
|
-
it "should yield 'Class[x]' for a PHostClassType[x]" do
|
1772
|
-
t = Puppet::Pops::Types::PHostClassType.new('x')
|
1773
|
-
expect(calculator.string(t)).to eq('Class[x]')
|
1774
|
-
end
|
1775
|
-
|
1776
|
-
it "should yield 'Resource' for a PResourceType" do
|
1777
|
-
t = Puppet::Pops::Types::PResourceType::DEFAULT
|
1778
|
-
expect(calculator.string(t)).to eq('Resource')
|
1779
|
-
end
|
1780
|
-
|
1781
|
-
it 'should yield \'File\' for a PResourceType[\'File\']' do
|
1782
|
-
t = Puppet::Pops::Types::PResourceType.new('File')
|
1783
|
-
expect(calculator.string(t)).to eq('File')
|
1784
|
-
end
|
1785
|
-
|
1786
|
-
it "should yield 'File['/tmp/foo']' for a PResourceType['File', '/tmp/foo']" do
|
1787
|
-
t = Puppet::Pops::Types::PResourceType.new('File', '/tmp/foo')
|
1788
|
-
expect(calculator.string(t)).to eq("File['/tmp/foo']")
|
1789
|
-
end
|
1790
|
-
|
1791
|
-
it "should yield 'Enum[s,...]' for a PEnumType[s,...]" do
|
1792
|
-
t = enum_t('a', 'b', 'c')
|
1793
|
-
expect(calculator.string(t)).to eq("Enum['a', 'b', 'c']")
|
1794
|
-
end
|
1795
|
-
|
1796
|
-
it "should yield 'Pattern[/pat/,...]' for a PPatternType['pat',...]" do
|
1797
|
-
t = pattern_t('a')
|
1798
|
-
t2 = pattern_t('a', 'b', 'c')
|
1799
|
-
expect(calculator.string(t)).to eq('Pattern[/a/]')
|
1800
|
-
expect(calculator.string(t2)).to eq('Pattern[/a/, /b/, /c/]')
|
1801
|
-
end
|
1802
|
-
|
1803
|
-
it "should escape special characters in the string for a PPatternType['pat',...]" do
|
1804
|
-
t = pattern_t('a/b')
|
1805
|
-
expect(calculator.string(t)).to eq("Pattern[/a\\/b/]")
|
1806
|
-
end
|
1807
|
-
|
1808
|
-
it "should yield 'Variant[t1,t2,...]' for a PVariantType[t1, t2,...]" do
|
1809
|
-
t1 = string_t
|
1810
|
-
t2 = integer_t
|
1811
|
-
t3 = pattern_t('a')
|
1812
|
-
t = variant_t(t1, t2, t3)
|
1813
|
-
expect(calculator.string(t)).to eq('Variant[String, Integer, Pattern[/a/]]')
|
1814
|
-
end
|
1815
|
-
|
1816
|
-
it "should yield 'Callable' for generic callable" do
|
1817
|
-
expect(calculator.string(all_callables_t)).to eql('Callable')
|
1818
|
-
end
|
1819
|
-
|
1820
|
-
it "should yield 'Callable[0,0]' for callable without params" do
|
1821
|
-
expect(calculator.string(callable_t)).to eql('Callable[0, 0]')
|
1822
|
-
end
|
1823
|
-
|
1824
|
-
it "should yield 'Callable[t,t]' for callable with typed parameters" do
|
1825
|
-
expect(calculator.string(callable_t(String, Integer))).to eql('Callable[String, Integer]')
|
1826
|
-
end
|
1827
|
-
|
1828
|
-
it "should yield 'Callable[t,min,max]' for callable with size constraint (infinite max)" do
|
1829
|
-
expect(calculator.string(callable_t(String, 0))).to eql('Callable[String, 0, default]')
|
1830
|
-
end
|
1831
|
-
|
1832
|
-
it "should yield 'Callable[t,min,max]' for callable with size constraint (capped max)" do
|
1833
|
-
expect(calculator.string(callable_t(String, 0, 3))).to eql('Callable[String, 0, 3]')
|
1834
|
-
end
|
1835
|
-
|
1836
|
-
it "should yield 'Callable[min,max]' callable with size > 0" do
|
1837
|
-
expect(calculator.string(callable_t(0, 0))).to eql('Callable[0, 0]')
|
1838
|
-
expect(calculator.string(callable_t(0, 1))).to eql('Callable[0, 1]')
|
1839
|
-
expect(calculator.string(callable_t(0, :default))).to eql('Callable[0, default]')
|
1840
|
-
end
|
1841
|
-
|
1842
|
-
it "should yield 'Callable[Callable]' for callable with block" do
|
1843
|
-
expect(calculator.string(callable_t(all_callables_t))).to eql('Callable[0, 0, Callable]')
|
1844
|
-
expect(calculator.string(callable_t(string_t, all_callables_t))).to eql('Callable[String, Callable]')
|
1845
|
-
expect(calculator.string(callable_t(string_t, 1,1, all_callables_t))).to eql('Callable[String, 1, 1, Callable]')
|
1846
|
-
end
|
1847
|
-
|
1848
|
-
it 'should yield Unit for a Unit type' do
|
1849
|
-
expect(calculator.string(unit_t)).to eql('Unit')
|
1850
|
-
end
|
1851
|
-
|
1852
|
-
it "should yield 'NotUndef' for a PNotUndefType" do
|
1853
|
-
t = not_undef_t
|
1854
|
-
expect(calculator.string(t)).to eq('NotUndef')
|
1855
|
-
end
|
1856
|
-
|
1857
|
-
it "should yield 'NotUndef[T]' for a PNotUndefType[T]" do
|
1858
|
-
t = not_undef_t(data_t)
|
1859
|
-
expect(calculator.string(t)).to eq('NotUndef[Data]')
|
1860
|
-
end
|
1861
|
-
|
1862
|
-
it "should yield 'NotUndef['string']' for a PNotUndefType['string']" do
|
1863
|
-
t = not_undef_t('hey')
|
1864
|
-
expect(calculator.string(t)).to eq("NotUndef['hey']")
|
1865
|
-
end
|
1866
|
-
end
|
1867
|
-
|
1868
1768
|
context 'when processing meta type' do
|
1869
1769
|
it 'should infer PType as the type of all other types' do
|
1870
1770
|
ptype = Puppet::Pops::Types::PType
|
@@ -1880,6 +1780,7 @@ describe 'The type calculator' do
|
|
1880
1780
|
expect(calculator.infer(Puppet::Pops::Types::PCollectionType::DEFAULT).is_a?(ptype)).to eq(true)
|
1881
1781
|
expect(calculator.infer(Puppet::Pops::Types::PArrayType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1882
1782
|
expect(calculator.infer(Puppet::Pops::Types::PHashType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1783
|
+
expect(calculator.infer(Puppet::Pops::Types::PIterableType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1883
1784
|
expect(calculator.infer(Puppet::Pops::Types::PRuntimeType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1884
1785
|
expect(calculator.infer(Puppet::Pops::Types::PHostClassType::DEFAULT ).is_a?(ptype)).to eq(true)
|
1885
1786
|
expect(calculator.infer(Puppet::Pops::Types::PResourceType::DEFAULT ).is_a?(ptype)).to eq(true)
|
@@ -1892,38 +1793,39 @@ describe 'The type calculator' do
|
|
1892
1793
|
end
|
1893
1794
|
|
1894
1795
|
it 'should infer PType as the type of all other types' do
|
1895
|
-
expect(calculator.
|
1896
|
-
expect(calculator.
|
1897
|
-
expect(calculator.
|
1898
|
-
expect(calculator.
|
1899
|
-
expect(calculator.
|
1900
|
-
expect(calculator.
|
1901
|
-
expect(calculator.
|
1902
|
-
expect(calculator.
|
1903
|
-
expect(calculator.
|
1904
|
-
expect(calculator.
|
1905
|
-
expect(calculator.
|
1906
|
-
expect(calculator.
|
1907
|
-
expect(calculator.
|
1908
|
-
expect(calculator.
|
1909
|
-
expect(calculator.
|
1910
|
-
expect(calculator.
|
1911
|
-
expect(calculator.
|
1912
|
-
expect(calculator.
|
1913
|
-
expect(calculator.
|
1914
|
-
expect(calculator.
|
1915
|
-
expect(calculator.
|
1796
|
+
expect(calculator.infer(Puppet::Pops::Types::PUndefType::DEFAULT ).to_s).to eq('Type[Undef]')
|
1797
|
+
expect(calculator.infer(Puppet::Pops::Types::PDataType::DEFAULT ).to_s).to eq('Type[Data]')
|
1798
|
+
expect(calculator.infer(Puppet::Pops::Types::PScalarType::DEFAULT ).to_s).to eq('Type[Scalar]')
|
1799
|
+
expect(calculator.infer(Puppet::Pops::Types::PStringType::DEFAULT ).to_s).to eq('Type[String]')
|
1800
|
+
expect(calculator.infer(Puppet::Pops::Types::PNumericType::DEFAULT ).to_s).to eq('Type[Numeric]')
|
1801
|
+
expect(calculator.infer(Puppet::Pops::Types::PIntegerType::DEFAULT ).to_s).to eq('Type[Integer]')
|
1802
|
+
expect(calculator.infer(Puppet::Pops::Types::PFloatType::DEFAULT ).to_s).to eq('Type[Float]')
|
1803
|
+
expect(calculator.infer(Puppet::Pops::Types::PRegexpType::DEFAULT ).to_s).to eq('Type[Regexp]')
|
1804
|
+
expect(calculator.infer(Puppet::Pops::Types::PBooleanType::DEFAULT ).to_s).to eq('Type[Boolean]')
|
1805
|
+
expect(calculator.infer(Puppet::Pops::Types::PCollectionType::DEFAULT).to_s).to eq('Type[Collection]')
|
1806
|
+
expect(calculator.infer(Puppet::Pops::Types::PArrayType::DEFAULT ).to_s).to eq('Type[Array[?]]')
|
1807
|
+
expect(calculator.infer(Puppet::Pops::Types::PHashType::DEFAULT ).to_s).to eq('Type[Hash[?, ?]]')
|
1808
|
+
expect(calculator.infer(Puppet::Pops::Types::PIterableType::DEFAULT ).to_s).to eq('Type[Iterable]')
|
1809
|
+
expect(calculator.infer(Puppet::Pops::Types::PRuntimeType::DEFAULT ).to_s).to eq('Type[Runtime[?, ?]]')
|
1810
|
+
expect(calculator.infer(Puppet::Pops::Types::PHostClassType::DEFAULT ).to_s).to eq('Type[Class]')
|
1811
|
+
expect(calculator.infer(Puppet::Pops::Types::PResourceType::DEFAULT ).to_s).to eq('Type[Resource]')
|
1812
|
+
expect(calculator.infer(Puppet::Pops::Types::PEnumType::DEFAULT ).to_s).to eq('Type[Enum]')
|
1813
|
+
expect(calculator.infer(Puppet::Pops::Types::PVariantType::DEFAULT ).to_s).to eq('Type[Variant]')
|
1814
|
+
expect(calculator.infer(Puppet::Pops::Types::PPatternType::DEFAULT ).to_s).to eq('Type[Pattern]')
|
1815
|
+
expect(calculator.infer(Puppet::Pops::Types::PTupleType::DEFAULT ).to_s).to eq('Type[Tuple]')
|
1816
|
+
expect(calculator.infer(Puppet::Pops::Types::POptionalType::DEFAULT ).to_s).to eq('Type[Optional]')
|
1817
|
+
expect(calculator.infer(Puppet::Pops::Types::PCallableType::DEFAULT ).to_s).to eq('Type[Callable]')
|
1916
1818
|
|
1917
1819
|
expect(calculator.infer(Puppet::Pops::Types::PResourceType.new('foo::fee::fum')).to_s).to eq('Type[Foo::Fee::Fum]')
|
1918
|
-
expect(calculator.
|
1820
|
+
expect(calculator.infer(Puppet::Pops::Types::PResourceType.new('foo::fee::fum')).to_s).to eq('Type[Foo::Fee::Fum]')
|
1919
1821
|
expect(calculator.infer(Puppet::Pops::Types::PResourceType.new('Foo::Fee::Fum')).to_s).to eq('Type[Foo::Fee::Fum]')
|
1920
1822
|
end
|
1921
1823
|
|
1922
1824
|
it "computes the common type of PType's type parameter" do
|
1923
1825
|
int_t = Puppet::Pops::Types::PIntegerType::DEFAULT
|
1924
1826
|
string_t = Puppet::Pops::Types::PStringType::DEFAULT
|
1925
|
-
expect(calculator.
|
1926
|
-
expect(calculator.
|
1827
|
+
expect(calculator.infer([int_t]).to_s).to eq('Array[Type[Integer], 1, 1]')
|
1828
|
+
expect(calculator.infer([int_t, string_t]).to_s).to eq('Array[Type[Scalar], 2, 2]')
|
1927
1829
|
end
|
1928
1830
|
|
1929
1831
|
it 'should infer PType as the type of ruby classes' do
|
@@ -1962,23 +1864,23 @@ describe 'The type calculator' do
|
|
1962
1864
|
end
|
1963
1865
|
end
|
1964
1866
|
|
1965
|
-
context 'when asking for an
|
1966
|
-
it 'should produce an
|
1867
|
+
context 'when asking for an iterable ' do
|
1868
|
+
it 'should produce an iterable for an Integer range that is finite' do
|
1967
1869
|
t = Puppet::Pops::Types::PIntegerType.new(1, 10)
|
1968
|
-
expect(calculator.
|
1870
|
+
expect(calculator.iterable(t).respond_to?(:each)).to eq(true)
|
1969
1871
|
end
|
1970
1872
|
|
1971
|
-
it 'should not produce an
|
1873
|
+
it 'should not produce an iterable for an Integer range that has an infinite side' do
|
1972
1874
|
t = Puppet::Pops::Types::PIntegerType.new(nil, 10)
|
1973
|
-
expect(calculator.
|
1875
|
+
expect(calculator.iterable(t)).to eq(nil)
|
1974
1876
|
|
1975
1877
|
t = Puppet::Pops::Types::PIntegerType.new(1, nil)
|
1976
|
-
expect(calculator.
|
1878
|
+
expect(calculator.iterable(t)).to eq(nil)
|
1977
1879
|
end
|
1978
1880
|
|
1979
|
-
it 'all but Integer range are not
|
1881
|
+
it 'all but Integer range are not iterable' do
|
1980
1882
|
[Object, Numeric, Float, String, Regexp, Array, Hash].each do |t|
|
1981
|
-
expect(calculator.
|
1883
|
+
expect(calculator.iterable(calculator.type(t))).to eq(nil)
|
1982
1884
|
end
|
1983
1885
|
end
|
1984
1886
|
end
|
@@ -2012,16 +1914,16 @@ describe 'The type calculator' do
|
|
2012
1914
|
|
2013
1915
|
it 'ensures that Struct key types are not generalized' do
|
2014
1916
|
generic = struct_t({'a' => object_t}).generalize
|
2015
|
-
expect(
|
1917
|
+
expect(generic.to_s).to eq("Struct[{'a' => Any}]")
|
2016
1918
|
generic = struct_t({not_undef_t('a') => object_t}).generalize
|
2017
|
-
expect(
|
1919
|
+
expect(generic.to_s).to eq("Struct[{NotUndef['a'] => Any}]")
|
2018
1920
|
generic = struct_t({optional_t('a') => string_t}).generalize
|
2019
|
-
expect(
|
1921
|
+
expect(generic.to_s).to eq("Struct[{Optional['a'] => String}]")
|
2020
1922
|
end
|
2021
1923
|
|
2022
1924
|
it 'ensures that Struct value types are generalized' do
|
2023
1925
|
generic = struct_t({'a' => range_t(1, 3)}).generalize
|
2024
|
-
expect(
|
1926
|
+
expect(generic.to_s).to eq("Struct[{'a' => Integer}]")
|
2025
1927
|
end
|
2026
1928
|
|
2027
1929
|
it "does not reduce by combining types when using infer_set" do
|