puppet 4.0.0 → 4.5.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.
- data/COMMITTERS.md +2 -2
- data/CONTRIBUTING.md +10 -10
- data/Gemfile +6 -8
- data/LICENSE +3 -3
- data/README.md +14 -10
- data/Rakefile +20 -0
- data/conf/auth.conf +2 -2
- data/conf/puppet.conf +1 -1
- data/ext/README.environment +1 -1
- data/ext/build_defaults.yaml +9 -36
- data/ext/debian/README.source +1 -1
- data/ext/debian/control +1 -1
- data/ext/debian/copyright +4 -4
- data/ext/debian/puppet.default +0 -5
- data/ext/debian/puppet.init +1 -16
- data/ext/debian/puppet.logrotate +14 -5
- 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/osx/puppet.plist +30 -0
- data/ext/project_data.yaml +11 -1
- data/ext/puppet-test +3 -3
- data/ext/rack/example-passenger-vhost.conf +1 -1
- data/ext/redhat/client.init +67 -17
- data/ext/redhat/client.sysconfig +1 -10
- data/ext/redhat/logrotate +15 -3
- data/ext/redhat/puppet.spec.erb +6 -11
- data/ext/redhat/server.init +1 -1
- data/ext/regexp_nodes/regexp_nodes.rb +1 -1
- data/ext/solaris/pkginfo +1 -1
- data/ext/solaris/smf/puppet +44 -0
- data/ext/solaris/smf/puppet.xml +44 -0
- data/ext/suse/client.init +30 -33
- data/ext/suse/puppet.spec +2 -2
- data/ext/suse/server.init +2 -2
- data/ext/systemd/puppet.service +3 -1
- 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 +51 -59
- data/lib/hiera/puppet_function.rb +18 -7
- data/lib/hiera/scope.rb +1 -1
- data/lib/hiera_puppet.rb +6 -14
- data/lib/puppet/agent/locker.rb +11 -2
- data/lib/puppet/agent.rb +9 -24
- data/lib/puppet/application/agent.rb +39 -19
- data/lib/puppet/application/apply.rb +68 -15
- data/lib/puppet/application/ca.rb +1 -0
- data/lib/puppet/application/cert.rb +17 -1
- data/lib/puppet/application/device.rb +9 -4
- data/lib/puppet/application/filebucket.rb +79 -5
- data/lib/puppet/application/inspect.rb +2 -2
- data/lib/puppet/application/lookup.rb +342 -0
- data/lib/puppet/application/master.rb +22 -7
- data/lib/puppet/application/resource.rb +1 -5
- data/lib/puppet/configurer/plugin_handler.rb +6 -2
- data/lib/puppet/configurer.rb +116 -31
- data/lib/puppet/context/trusted_information.rb +21 -1
- data/lib/puppet/context.rb +16 -1
- data/lib/puppet/daemon.rb +17 -13
- data/lib/puppet/data_binding.rb +4 -2
- data/lib/puppet/data_providers/data_adapter.rb +7 -68
- data/lib/puppet/data_providers/data_function_support.rb +5 -26
- data/lib/puppet/data_providers/function_env_data_provider.rb +0 -10
- data/lib/puppet/data_providers/function_module_data_provider.rb +0 -22
- data/lib/puppet/data_providers/hiera_config.rb +129 -0
- data/lib/puppet/data_providers/hiera_env_data_provider.rb +18 -0
- data/lib/puppet/data_providers/hiera_interpolate.rb +19 -0
- data/lib/puppet/data_providers/hiera_module_data_provider.rb +23 -0
- data/lib/puppet/data_providers/hiera_support.rb +37 -0
- data/lib/puppet/data_providers/json_data_provider_factory.rb +24 -0
- data/lib/puppet/data_providers/lookup_adapter.rb +247 -0
- data/lib/puppet/data_providers/yaml_data_provider_factory.rb +26 -0
- data/lib/puppet/data_providers.rb +12 -13
- data/lib/puppet/defaults.rb +202 -47
- data/lib/puppet/environments.rb +98 -8
- data/lib/puppet/error.rb +31 -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/changes.rb +2 -1
- data/lib/puppet/face/module/install.rb +6 -6
- data/lib/puppet/face/parser.rb +12 -9
- data/lib/puppet/face/plugin.rb +7 -14
- data/lib/puppet/face/status.rb +2 -1
- data/lib/puppet/feature/cfacter.rb +1 -0
- data/lib/puppet/feature/cfpropertylist.rb +3 -0
- data/lib/puppet/feature/telnet.rb +9 -0
- data/lib/puppet/file_bucket/dipper.rb +58 -2
- data/lib/puppet/file_serving/http_metadata.rb +46 -0
- data/lib/puppet/file_serving/metadata.rb +30 -9
- data/lib/puppet/file_serving/terminus_helper.rb +7 -8
- data/lib/puppet/file_serving/terminus_selector.rb +2 -0
- data/lib/puppet/file_system/file_impl.rb +6 -2
- data/lib/puppet/file_system/memory_impl.rb +5 -1
- data/lib/puppet/file_system/uniquefile.rb +3 -3
- data/lib/puppet/file_system/windows.rb +12 -16
- data/lib/puppet/file_system.rb +15 -2
- data/lib/puppet/forge/repository.rb +1 -32
- data/lib/puppet/forge.rb +1 -1
- data/lib/puppet/functions/assert_type.rb +57 -21
- data/lib/puppet/functions/defined.rb +161 -0
- data/lib/puppet/functions/dig.rb +39 -0
- data/lib/puppet/functions/each.rb +89 -39
- data/lib/puppet/functions/epp.rb +29 -37
- data/lib/puppet/functions/filter.rb +64 -38
- data/lib/puppet/functions/hiera.rb +76 -3
- data/lib/puppet/functions/hiera_array.rb +65 -3
- data/lib/puppet/functions/hiera_hash.rb +74 -2
- data/lib/puppet/functions/hiera_include.rb +77 -4
- data/lib/puppet/functions/inline_epp.rb +44 -71
- data/lib/puppet/functions/lest.rb +53 -0
- data/lib/puppet/functions/lookup.rb +172 -184
- data/lib/puppet/functions/map.rb +60 -33
- data/lib/puppet/functions/match.rb +30 -12
- data/lib/puppet/functions/new.rb +502 -0
- data/lib/puppet/functions/reduce.rb +99 -70
- data/lib/puppet/functions/regsubst.rb +12 -11
- 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 +3 -3
- data/lib/puppet/functions/step.rb +88 -0
- data/lib/puppet/functions/then.rb +74 -0
- data/lib/puppet/functions/type.rb +70 -0
- data/lib/puppet/functions/versioncmp.rb +36 -0
- data/lib/puppet/functions/with.rb +15 -7
- data/lib/puppet/functions.rb +149 -13
- data/lib/puppet/graph/rb_tree_map.rb +1 -1
- data/lib/puppet/indirector/catalog/compiler.rb +196 -9
- data/lib/puppet/indirector/catalog/static_compiler.rb +46 -30
- data/lib/puppet/indirector/data_binding/none.rb +4 -1
- data/lib/puppet/indirector/facts/facter.rb +8 -0
- data/lib/puppet/indirector/file_bucket_file/file.rb +58 -1
- 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 +7 -1
- data/lib/puppet/indirector/indirection.rb +12 -3
- data/lib/puppet/indirector/json.rb +3 -3
- data/lib/puppet/indirector/msgpack.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/request.rb +7 -8
- data/lib/puppet/indirector/resource_type/parser.rb +10 -3
- data/lib/puppet/indirector/rest.rb +7 -2
- data/lib/puppet/indirector/terminus.rb +4 -4
- data/lib/puppet/info_service/class_information_service.rb +112 -0
- data/lib/puppet/info_service.rb +7 -0
- data/lib/puppet/loaders.rb +4 -0
- data/lib/puppet/metatype/manager.rb +19 -2
- data/lib/puppet/module.rb +26 -17
- data/lib/puppet/module_tool/applications/application.rb +1 -1
- data/lib/puppet/module_tool/applications/builder.rb +2 -2
- data/lib/puppet/module_tool/applications/unpacker.rb +1 -1
- data/lib/puppet/module_tool/metadata.rb +32 -9
- data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +14 -3
- data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +42 -38
- data/lib/puppet/module_tool/skeleton/templates/generator/Rakefile +19 -4
- data/lib/puppet/module_tool/skeleton/templates/generator/{tests → examples}/init.pp.erb +2 -2
- data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +25 -18
- data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -2
- data/lib/puppet/module_tool/tar/mini.rb +3 -3
- data/lib/puppet/network/auth_config_parser.rb +1 -1
- data/lib/puppet/network/authconfig.rb +21 -1
- data/lib/puppet/network/authorization.rb +8 -1
- data/lib/puppet/network/http/api/indirected_routes.rb +0 -2
- data/lib/puppet/network/http/api/master/v3/environment.rb +63 -0
- data/lib/puppet/network/http/api/master/v3.rb +7 -1
- data/lib/puppet/network/http/factory.rb +8 -4
- data/lib/puppet/network/http/pool.rb +9 -0
- data/lib/puppet/network/http/rack/rest.rb +10 -1
- data/lib/puppet/node/environment.rb +35 -11
- data/lib/puppet/node.rb +39 -8
- data/lib/puppet/parser/ast/pops_bridge.rb +85 -24
- data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
- data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +60 -0
- data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
- data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
- data/lib/puppet/parser/compiler.rb +305 -15
- data/lib/puppet/parser/e4_parser_adapter.rb +13 -12
- data/lib/puppet/parser/environment_compiler.rb +164 -0
- data/lib/puppet/parser/functions/assert_type.rb +46 -16
- data/lib/puppet/parser/functions/defined.rb +105 -44
- data/lib/puppet/parser/functions/each.rb +85 -27
- data/lib/puppet/parser/functions/epp.rb +29 -37
- data/lib/puppet/parser/functions/file.rb +3 -1
- data/lib/puppet/parser/functions/filter.rb +59 -23
- data/lib/puppet/parser/functions/fqdn_rand.rb +3 -3
- data/lib/puppet/parser/functions/hiera.rb +83 -27
- data/lib/puppet/parser/functions/hiera_array.rb +71 -28
- data/lib/puppet/parser/functions/hiera_hash.rb +81 -30
- data/lib/puppet/parser/functions/hiera_include.rb +81 -40
- data/lib/puppet/parser/functions/inline_epp.rb +35 -60
- data/lib/puppet/parser/functions/inline_template.rb +2 -2
- data/lib/puppet/parser/functions/lookup.rb +125 -149
- data/lib/puppet/parser/functions/map.rb +55 -20
- data/lib/puppet/parser/functions/match.rb +28 -12
- data/lib/puppet/parser/functions/reduce.rb +97 -60
- 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/with.rb +16 -8
- data/lib/puppet/parser/functions.rb +28 -16
- data/lib/puppet/parser/resource.rb +119 -26
- data/lib/puppet/parser/scope.rb +233 -24
- data/lib/puppet/parser/templatewrapper.rb +2 -1
- data/lib/puppet/parser.rb +3 -0
- data/lib/puppet/plugins/configuration.rb +3 -2
- data/lib/puppet/plugins/data_providers/data_provider.rb +336 -0
- data/lib/puppet/plugins/data_providers/registry.rb +84 -0
- data/lib/puppet/plugins/data_providers.rb +12 -60
- data/lib/puppet/pops/adaptable.rb +4 -1
- data/lib/puppet/pops/adapters.rb +96 -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_label_provider.rb +3 -1
- data/lib/puppet/pops/binder/bindings_loader.rb +6 -2
- data/lib/puppet/pops/binder/bindings_model.rb +49 -47
- data/lib/puppet/pops/binder/bindings_model_meta.rb +2 -2
- data/lib/puppet/pops/binder/config/binder_config.rb +1 -1
- data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
- data/lib/puppet/pops/binder/injector.rb +55 -50
- data/lib/puppet/pops/binder/key_factory.rb +10 -12
- data/lib/puppet/pops/binder/producers.rb +67 -62
- data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +68 -9
- data/lib/puppet/pops/evaluator/access_operator.rb +189 -138
- data/lib/puppet/pops/evaluator/closure.rb +151 -104
- data/lib/puppet/pops/evaluator/collector_transformer.rb +35 -25
- data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
- data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +4 -0
- data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +4 -1
- data/lib/puppet/pops/evaluator/compare_operator.rb +87 -10
- data/lib/puppet/pops/evaluator/epp_evaluator.rb +16 -10
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +204 -111
- data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
- data/lib/puppet/pops/evaluator/literal_evaluator.rb +88 -0
- data/lib/puppet/pops/evaluator/relationship_operator.rb +19 -11
- data/lib/puppet/pops/evaluator/runtime3_converter.rb +19 -2
- data/lib/puppet/pops/evaluator/runtime3_support.rb +95 -44
- data/lib/puppet/pops/functions/dispatch.rb +6 -1
- data/lib/puppet/pops/functions/dispatcher.rb +10 -4
- data/lib/puppet/pops/functions/function.rb +6 -2
- data/lib/puppet/pops/issue_reporter.rb +48 -20
- data/lib/puppet/pops/issues.rb +194 -17
- data/lib/puppet/pops/label_provider.rb +1 -1
- data/lib/puppet/pops/loader/base_loader.rb +48 -7
- data/lib/puppet/pops/loader/dependency_loader.rb +27 -2
- data/lib/puppet/pops/loader/loader.rb +23 -0
- data/lib/puppet/pops/loader/loader_paths.rb +82 -6
- data/lib/puppet/pops/loader/module_loaders.rb +36 -21
- data/lib/puppet/pops/loader/predefined_loader.rb +29 -0
- data/lib/puppet/pops/loader/puppet_function_instantiator.rb +83 -0
- data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
- data/lib/puppet/pops/loader/runtime3_type_loader.rb +57 -0
- data/lib/puppet/pops/loader/static_loader.rb +92 -5
- data/lib/puppet/pops/loader/type_definition_instantiator.rb +77 -0
- data/lib/puppet/pops/loaders.rb +133 -19
- data/lib/puppet/pops/lookup/explainer.rb +509 -0
- data/lib/puppet/pops/lookup/interpolation.rb +115 -0
- data/lib/puppet/pops/lookup/invocation.rb +119 -0
- data/lib/puppet/pops/lookup/sub_lookup.rb +86 -0
- data/lib/puppet/pops/lookup.rb +35 -52
- data/lib/puppet/pops/merge_strategy.rb +85 -30
- data/lib/puppet/pops/migration/migration_checker.rb +54 -0
- data/lib/puppet/pops/model/ast_transformer.rb +8 -1
- data/lib/puppet/pops/model/factory.rb +242 -158
- data/lib/puppet/pops/model/model.rb +25 -8
- data/lib/puppet/pops/model/model_label_provider.rb +25 -6
- data/lib/puppet/pops/model/model_meta.rb +48 -3
- data/lib/puppet/pops/model/model_tree_dumper.rb +30 -0
- data/lib/puppet/pops/parser/code_merger.rb +13 -1
- data/lib/puppet/pops/parser/egrammar.ra +133 -30
- data/lib/puppet/pops/parser/eparser.rb +1738 -1254
- data/lib/puppet/pops/parser/epp_support.rb +27 -12
- data/lib/puppet/pops/parser/evaluating_parser.rb +27 -13
- data/lib/puppet/pops/parser/heredoc_support.rb +19 -14
- data/lib/puppet/pops/parser/interpolation_support.rb +7 -1
- data/lib/puppet/pops/parser/lexer2.rb +452 -379
- data/lib/puppet/pops/parser/lexer_support.rb +132 -25
- data/lib/puppet/pops/parser/locator.rb +30 -5
- data/lib/puppet/pops/parser/parser_support.rb +49 -37
- data/lib/puppet/pops/parser/slurp_support.rb +32 -8
- data/lib/puppet/pops/patterns.rb +3 -0
- data/lib/puppet/pops/pcore.rb +30 -0
- data/lib/puppet/pops/types/class_loader.rb +25 -23
- data/lib/puppet/pops/types/enumeration.rb +9 -27
- data/lib/puppet/pops/types/implementation_registry.rb +146 -0
- data/lib/puppet/pops/types/iterable.rb +308 -0
- data/lib/puppet/pops/types/p_object_type.rb +846 -0
- data/lib/puppet/pops/types/p_runtime_type.rb +102 -0
- data/lib/puppet/pops/types/p_sem_ver_range_type.rb +164 -0
- data/lib/puppet/pops/types/p_sem_ver_type.rb +113 -0
- data/lib/puppet/pops/types/puppet_object.rb +21 -0
- data/lib/puppet/pops/types/recursion_guard.rb +92 -0
- data/lib/puppet/pops/types/ruby_generator.rb +258 -0
- data/lib/puppet/pops/types/string_converter.rb +922 -0
- data/lib/puppet/pops/types/type_acceptor.rb +25 -0
- data/lib/puppet/pops/types/type_asserter.rb +21 -19
- data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
- data/lib/puppet/pops/types/type_calculator.rb +213 -1184
- data/lib/puppet/pops/types/type_conversion_error.rb +15 -0
- data/lib/puppet/pops/types/type_factory.rb +216 -157
- data/lib/puppet/pops/types/type_formatter.rb +569 -0
- data/lib/puppet/pops/types/type_mismatch_describer.rb +1001 -0
- data/lib/puppet/pops/types/type_parser.rb +332 -279
- data/lib/puppet/pops/types/types.rb +2770 -288
- data/lib/puppet/pops/utils.rb +11 -10
- data/lib/puppet/pops/validation/checker4_0.rb +266 -72
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +12 -5
- data/lib/puppet/pops/validation.rb +43 -13
- data/lib/puppet/pops/visitor.rb +3 -1
- data/lib/puppet/pops.rb +29 -24
- data/lib/puppet/property/ensure.rb +1 -1
- data/lib/puppet/property.rb +1 -1
- data/lib/puppet/provider/aixobject.rb +1 -1
- data/lib/puppet/provider/augeas/augeas.rb +57 -2
- data/lib/puppet/provider/cron/crontab.rb +1 -1
- data/lib/puppet/provider/exec/windows.rb +1 -1
- data/lib/puppet/provider/exec.rb +6 -1
- data/lib/puppet/provider/group/directoryservice.rb +10 -0
- data/lib/puppet/provider/group/pw.rb +1 -0
- data/lib/puppet/provider/group/windows_adsi.rb +19 -6
- data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
- data/lib/puppet/provider/mount/parsed.rb +159 -2
- data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
- data/lib/puppet/provider/package/appdmg.rb +3 -2
- data/lib/puppet/provider/package/apt.rb +1 -1
- data/lib/puppet/provider/package/dnf.rb +41 -0
- data/lib/puppet/provider/package/gem.rb +23 -2
- data/lib/puppet/provider/package/nim.rb +1 -1
- data/lib/puppet/provider/package/openbsd.rb +7 -7
- data/lib/puppet/provider/package/pacman.rb +9 -8
- data/lib/puppet/provider/package/pip.rb +80 -20
- data/lib/puppet/provider/package/pip3.rb +20 -0
- data/lib/puppet/provider/package/pkg.rb +1 -1
- data/lib/puppet/provider/package/pkgdmg.rb +7 -4
- data/lib/puppet/provider/package/pkgin.rb +3 -3
- data/lib/puppet/provider/package/pkgng.rb +143 -0
- data/lib/puppet/provider/package/portage.rb +1 -1
- data/lib/puppet/provider/package/ports.rb +0 -3
- data/lib/puppet/provider/package/puppet_gem.rb +0 -0
- data/lib/puppet/provider/package/rpm.rb +120 -14
- data/lib/puppet/provider/package/windows/exe_package.rb +10 -9
- data/lib/puppet/provider/package/windows/msi_package.rb +4 -4
- data/lib/puppet/provider/package/windows/package.rb +9 -1
- data/lib/puppet/provider/package/windows.rb +1 -1
- data/lib/puppet/provider/package/yum.rb +31 -80
- data/lib/puppet/provider/package/zypper.rb +69 -15
- data/lib/puppet/provider/package.rb +6 -2
- data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +32 -7
- data/lib/puppet/provider/service/base.rb +3 -2
- data/lib/puppet/provider/service/bsd.rb +8 -8
- data/lib/puppet/provider/service/daemontools.rb +3 -3
- data/lib/puppet/provider/service/debian.rb +12 -3
- data/lib/puppet/provider/service/freebsd.rb +1 -1
- data/lib/puppet/provider/service/init.rb +22 -0
- data/lib/puppet/provider/service/launchd.rb +41 -18
- data/lib/puppet/provider/service/rcng.rb +51 -0
- data/lib/puppet/provider/service/redhat.rb +2 -1
- data/lib/puppet/provider/service/runit.rb +3 -3
- data/lib/puppet/provider/service/smf.rb +48 -4
- data/lib/puppet/provider/service/src.rb +27 -0
- data/lib/puppet/provider/service/systemd.rb +104 -22
- data/lib/puppet/provider/service/upstart.rb +1 -1
- data/lib/puppet/provider/sshkey/parsed.rb +20 -10
- data/lib/puppet/provider/user/aix.rb +1 -1
- data/lib/puppet/provider/user/directoryservice.rb +33 -58
- data/lib/puppet/provider/user/openbsd.rb +1 -0
- data/lib/puppet/provider/user/pw.rb +1 -0
- data/lib/puppet/provider/user/user_role_add.rb +3 -1
- data/lib/puppet/provider/user/windows_adsi.rb +45 -2
- data/lib/puppet/provider/yumrepo/inifile.rb +6 -3
- data/lib/puppet/provider/zfs/zfs.rb +1 -1
- data/lib/puppet/provider/zone/solaris.rb +2 -2
- data/lib/puppet/provider/zpool/zpool.rb +1 -1
- data/lib/puppet/provider.rb +5 -0
- data/lib/puppet/reference/configuration.rb +11 -5
- data/lib/puppet/reference/indirection.rb +1 -1
- data/lib/puppet/reference/providers.rb +2 -3
- data/lib/puppet/reference/report.rb +9 -12
- data/lib/puppet/reports.rb +5 -1
- data/lib/puppet/resource/capability_finder.rb +102 -0
- data/lib/puppet/resource/catalog.rb +133 -36
- data/lib/puppet/resource/status.rb +19 -3
- data/lib/puppet/resource/type.rb +236 -49
- data/lib/puppet/resource/type_collection.rb +83 -10
- data/lib/puppet/resource.rb +116 -119
- data/lib/puppet/settings/base_setting.rb +9 -3
- data/lib/puppet/settings/config_file.rb +1 -1
- data/lib/puppet/settings/environment_conf.rb +13 -5
- data/lib/puppet/settings/file_setting.rb +10 -9
- data/lib/puppet/settings/symbolic_enum_setting.rb +17 -0
- data/lib/puppet/settings.rb +68 -20
- data/lib/puppet/ssl/certificate_authority/interface.rb +2 -2
- 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/oids.rb +33 -3
- data/lib/puppet/ssl/validator/default_validator.rb +1 -1
- data/lib/puppet/test/test_helper.rb +16 -5
- data/lib/puppet/transaction/additional_resource_generator.rb +89 -8
- data/lib/puppet/transaction/report.rb +31 -1
- data/lib/puppet/transaction/resource_harness.rb +0 -20
- data/lib/puppet/transaction.rb +46 -36
- data/lib/puppet/type/augeas.rb +10 -1
- data/lib/puppet/type/cron.rb +12 -12
- data/lib/puppet/type/exec.rb +27 -18
- data/lib/puppet/type/file/checksum_value.rb +53 -0
- data/lib/puppet/type/file/content.rb +32 -117
- data/lib/puppet/type/file/data_sync.rb +84 -0
- data/lib/puppet/type/file/ensure.rb +22 -19
- data/lib/puppet/type/file/selcontext.rb +1 -1
- data/lib/puppet/type/file/source.rb +121 -34
- data/lib/puppet/type/file/target.rb +2 -2
- data/lib/puppet/type/file.rb +107 -44
- data/lib/puppet/type/filebucket.rb +1 -1
- data/lib/puppet/type/group.rb +15 -3
- data/lib/puppet/type/interface.rb +8 -3
- data/lib/puppet/type/macauthorization.rb +1 -1
- data/lib/puppet/type/mount.rb +29 -2
- data/lib/puppet/type/package.rb +31 -11
- data/lib/puppet/type/schedule.rb +5 -5
- data/lib/puppet/type/scheduled_task.rb +13 -0
- data/lib/puppet/type/service.rb +24 -0
- data/lib/puppet/type/sshkey.rb +5 -3
- data/lib/puppet/type/stage.rb +1 -1
- data/lib/puppet/type/tidy.rb +6 -4
- data/lib/puppet/type/user.rb +55 -19
- data/lib/puppet/type/yumrepo.rb +25 -5
- data/lib/puppet/type/zone.rb +5 -5
- data/lib/puppet/type.rb +95 -18
- data/lib/puppet/util/autoload.rb +16 -11
- data/lib/puppet/util/checksums.rb +74 -31
- data/lib/puppet/util/command_line.rb +4 -0
- data/lib/puppet/util/execution.rb +21 -5
- data/lib/puppet/util/feature.rb +1 -1
- data/lib/puppet/util/http_proxy.rb +132 -0
- data/lib/puppet/util/log/destinations.rb +23 -2
- data/lib/puppet/util/log.rb +53 -9
- data/lib/puppet/util/logging.rb +80 -2
- data/lib/puppet/util/monkey_patches.rb +20 -7
- data/lib/puppet/util/multi_match.rb +51 -0
- data/lib/puppet/util/network_device/cisco/device.rb +24 -6
- data/lib/puppet/util/network_device/cisco/interface.rb +21 -9
- 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 +3 -16
- data/lib/puppet/util/skip_tags.rb +9 -0
- data/lib/puppet/util/splayer.rb +18 -0
- data/lib/puppet/util/tagging.rb +7 -1
- 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 +186 -74
- 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 +48 -18
- 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 +37 -36
- 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 +16 -16
- data/lib/puppet/util/windows/user.rb +10 -10
- data/lib/puppet/util/windows.rb +5 -0
- data/lib/puppet/util.rb +123 -23
- 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 +30 -1
- data/lib/semver.rb +17 -1
- data/man/man5/puppet.conf.5 +60 -18
- data/man/man8/extlookup2hiera.8 +2 -2
- data/man/man8/puppet-agent.8 +6 -3
- data/man/man8/puppet-apply.8 +6 -3
- data/man/man8/puppet-ca.8 +3 -3
- data/man/man8/puppet-catalog.8 +3 -3
- data/man/man8/puppet-cert.8 +3 -3
- data/man/man8/puppet-certificate.8 +3 -3
- data/man/man8/puppet-certificate_request.8 +3 -3
- data/man/man8/puppet-certificate_revocation_list.8 +3 -3
- data/man/man8/puppet-config.8 +4 -4
- data/man/man8/puppet-describe.8 +2 -2
- data/man/man8/puppet-device.8 +7 -4
- data/man/man8/puppet-doc.8 +2 -2
- data/man/man8/puppet-epp.8 +3 -3
- data/man/man8/puppet-facts.8 +3 -3
- data/man/man8/puppet-file.8 +3 -3
- data/man/man8/puppet-filebucket.8 +3 -3
- data/man/man8/puppet-help.8 +3 -3
- data/man/man8/puppet-inspect.8 +3 -3
- data/man/man8/puppet-key.8 +3 -3
- data/man/man8/puppet-man.8 +3 -3
- data/man/man8/puppet-master.8 +6 -3
- data/man/man8/puppet-module.8 +10 -10
- data/man/man8/puppet-node.8 +3 -3
- data/man/man8/puppet-parser.8 +3 -3
- data/man/man8/puppet-plugin.8 +3 -3
- data/man/man8/puppet-report.8 +3 -3
- data/man/man8/puppet-resource.8 +3 -3
- data/man/man8/puppet-resource_type.8 +3 -3
- data/man/man8/puppet-status.8 +4 -4
- data/man/man8/puppet.8 +2 -2
- data/spec/fixtures/module.tar.gz +0 -0
- data/spec/fixtures/unit/application/environments/production/data/common.yaml +20 -0
- data/spec/fixtures/unit/application/environments/production/environment.conf +1 -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_bad_syntax_json/data/bad.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/third_utf8.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/utf8.yaml +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +22 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +46 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -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/environment.conf +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +1 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +18 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/metadata.json +9 -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/data_providers/environments/production/lib/puppet/functions/environment/data.rb +3 -1
- data/spec/fixtures/unit/data_providers/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +2 -1
- data/spec/fixtures/unit/data_providers/environments/production/modules/abc/manifests/init.pp +2 -1
- data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/functions/data.pp +6 -0
- data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/lib/puppet/bindings/xyz/default.rb +9 -0
- data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/manifests/init.pp +9 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +1 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_module_data.rb +1 -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_key_json/data/empty_key.json +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_json/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/data/empty_key.yaml +1 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/hiera.yaml +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/manifests/init.pp +2 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_key_yaml/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +2 -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 +4 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/hiera.yaml +8 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/manifests/init.pp +3 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/metadata.json +9 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +10 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +23 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/manifests/init.pp +3 -0
- data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/metadata.json +9 -0
- data/spec/fixtures/unit/module/trailing-comma.json +1 -1
- data/spec/fixtures/unit/parser/lexer/subclass_name_duplication.pp +0 -0
- 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/lib/puppet/type/usee_type.rb +5 -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 +87 -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/pops/loaders/loaders/mix_4x_and_3x_functions/user/functions/puppetcalled.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/functions/puppetcaller.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/functions/puppetcaller4.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/lib/puppet/functions/user/callingpuppet.rb +5 -0
- data/spec/fixtures/unit/pops/loaders/loaders/module_no_lib/modules/modulea/functions/hello.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/module_no_lib/modules/modulea/manifests/init.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/module_no_lib/modules/modulea/metadata.json +10 -0
- data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/functions/hello.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/functions/subspace/hello.pp +3 -0
- data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/metadata.json +1 -10
- data/spec/fixtures/unit/pops/parser/lexer/subclass_name_duplication.pp +0 -0
- data/spec/fixtures/unit/provider/mount/parsed/aix.filesystems +93 -85
- data/spec/fixtures/unit/provider/mount/parsed/aix.mount +11 -7
- data/spec/fixtures/unit/provider/package/pkgng/pkg.info +8 -0
- data/spec/fixtures/unit/provider/package/pkgng/pkg.query +1 -0
- data/spec/fixtures/unit/provider/package/pkgng/pkg.query_absent +1 -0
- data/spec/fixtures/unit/provider/package/pkgng/pkg.version +3 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-obsoletes.txt +195 -0
- data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
- data/spec/fixtures/unit/provider/package/zypper/zypper-list-updates-empty.out +3 -0
- data/spec/fixtures/unit/provider/service/smf/svcs.out +4 -3
- data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
- data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -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/agent/logging_spec.rb +0 -0
- data/spec/integration/application/apply_spec.rb +121 -30
- data/spec/integration/application/doc_spec.rb +0 -0
- data/spec/integration/configurer_spec.rb +0 -0
- data/spec/integration/data_binding_spec.rb +195 -0
- data/spec/integration/defaults_spec.rb +14 -2
- data/spec/integration/faces/ca_spec.rb +0 -0
- data/spec/integration/faces/documentation_spec.rb +0 -0
- data/spec/integration/faces/plugin_spec.rb +0 -4
- data/spec/integration/file_bucket/file_spec.rb +2 -2
- data/spec/integration/file_serving/fileset_spec.rb +0 -0
- data/spec/integration/file_serving/terminus_helper_spec.rb +0 -0
- data/spec/integration/file_system/uniquefile_spec.rb +29 -0
- data/spec/integration/indirector/catalog/compiler_spec.rb +0 -0
- data/spec/integration/indirector/direct_file_server_spec.rb +0 -0
- data/spec/integration/indirector/facts/facter_spec.rb +97 -0
- data/spec/integration/indirector/file_content/file_server_spec.rb +0 -0
- data/spec/integration/indirector/file_metadata/file_server_spec.rb +0 -0
- data/spec/integration/indirector/node/ldap_spec.rb +0 -0
- data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
- data/spec/integration/network/formats_spec.rb +0 -0
- data/spec/integration/node/environment_spec.rb +13 -0
- data/spec/integration/node/facts_spec.rb +0 -0
- data/spec/integration/node_spec.rb +0 -0
- data/spec/integration/parser/catalog_spec.rb +14 -2
- data/spec/integration/parser/collection_spec.rb +8 -0
- data/spec/integration/parser/compiler_spec.rb +949 -2
- data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
- data/spec/integration/parser/functions/require_spec.rb +0 -0
- data/spec/integration/parser/parameter_defaults_spec.rb +354 -0
- data/spec/integration/parser/resource_expressions_spec.rb +8 -5
- data/spec/integration/parser/scope_spec.rb +46 -7
- data/spec/integration/parser/undef_param_spec.rb +9 -1
- data/spec/integration/provider/mailalias/aliases_spec.rb +0 -0
- data/spec/integration/provider/mount_spec.rb +23 -36
- data/spec/integration/provider/service/init_spec.rb +0 -0
- data/spec/integration/provider/ssh_authorized_key_spec.rb +0 -0
- data/spec/integration/provider/yumrepo_spec.rb +1 -1
- data/spec/integration/reference/providers_spec.rb +0 -0
- data/spec/integration/reports_spec.rb +0 -0
- data/spec/integration/resource/catalog_spec.rb +1 -1
- data/spec/integration/resource/type_collection_spec.rb +8 -0
- data/spec/integration/ssl/certificate_authority_spec.rb +0 -1
- data/spec/integration/ssl/certificate_request_spec.rb +0 -1
- data/spec/integration/ssl/certificate_revocation_list_spec.rb +0 -1
- data/spec/integration/ssl/host_spec.rb +0 -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 +52 -2
- data/spec/integration/type/exec_spec.rb +0 -0
- data/spec/integration/type/file_spec.rb +548 -45
- data/spec/integration/type/package_spec.rb +72 -1
- data/spec/integration/type/tidy_spec.rb +21 -9
- data/spec/integration/type_spec.rb +0 -0
- data/spec/integration/util/autoload_spec.rb +0 -0
- data/spec/integration/util/execution_spec.rb +22 -0
- data/spec/integration/util/rdoc/parser_spec.rb +1 -1
- data/spec/integration/util/settings_spec.rb +26 -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 +40 -13
- data/spec/integration/util/windows/user_spec.rb +1 -1
- data/spec/integration/util_spec.rb +49 -27
- data/spec/lib/matchers/include_in_order.rb +2 -3
- data/spec/lib/matchers/resource.rb +22 -1
- data/spec/lib/puppet/face/1.0.0/huzzah.rb +0 -0
- data/spec/lib/puppet/face/basetest.rb +0 -0
- data/spec/lib/puppet/face/huzzah.rb +0 -0
- data/spec/lib/puppet_spec/compiler.rb +27 -3
- data/spec/lib/puppet_spec/files.rb +16 -2
- data/spec/lib/puppet_spec/fixtures.rb +0 -0
- data/spec/lib/puppet_spec/matchers.rb +6 -4
- data/spec/lib/puppet_spec/pops.rb +13 -0
- data/spec/lib/puppet_spec/verbose.rb +0 -0
- data/spec/shared_behaviours/all_parsedfile_providers.rb +0 -0
- data/spec/shared_behaviours/file_server_terminus.rb +0 -0
- data/spec/shared_behaviours/file_serving.rb +0 -0
- data/spec/shared_behaviours/iterative_functions.rb +9 -9
- data/spec/shared_behaviours/memory_terminus.rb +0 -0
- data/spec/shared_behaviours/path_parameters.rb +0 -0
- data/spec/shared_behaviours/things_that_declare_options.rb +0 -0
- data/spec/shared_contexts/types_setup.rb +100 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/unit/agent/locker_spec.rb +4 -4
- data/spec/unit/agent_spec.rb +1 -46
- data/spec/unit/application/agent_spec.rb +15 -0
- data/spec/unit/application/apply_spec.rb +31 -1
- data/spec/unit/application/cert_spec.rb +0 -0
- data/spec/unit/application/certificate_spec.rb +0 -0
- data/spec/unit/application/config_spec.rb +0 -0
- data/spec/unit/application/describe_spec.rb +0 -0
- data/spec/unit/application/device_spec.rb +0 -0
- data/spec/unit/application/doc_spec.rb +0 -0
- data/spec/unit/application/face_base_spec.rb +0 -0
- data/spec/unit/application/facts_spec.rb +0 -0
- data/spec/unit/application/filebucket_spec.rb +88 -2
- data/spec/unit/application/indirection_base_spec.rb +0 -0
- data/spec/unit/application/inspect_spec.rb +19 -8
- data/spec/unit/application/lookup_spec.rb +387 -0
- data/spec/unit/application/master_spec.rb +33 -7
- data/spec/unit/application/resource_spec.rb +0 -0
- data/spec/unit/application_spec.rb +3 -3
- data/spec/unit/appmgmt_spec.rb +666 -0
- data/spec/unit/capability_spec.rb +394 -0
- data/spec/unit/configurer/downloader_factory_spec.rb +0 -0
- data/spec/unit/configurer/downloader_spec.rb +5 -5
- data/spec/unit/configurer/fact_handler_spec.rb +0 -0
- data/spec/unit/configurer/plugin_handler_spec.rb +42 -13
- data/spec/unit/configurer_spec.rb +282 -39
- data/spec/unit/confine/exists_spec.rb +0 -0
- data/spec/unit/confine/false_spec.rb +0 -0
- data/spec/unit/confine/feature_spec.rb +0 -0
- data/spec/unit/confine/true_spec.rb +0 -0
- data/spec/unit/confine/variable_spec.rb +0 -0
- data/spec/unit/confine_collection_spec.rb +0 -0
- data/spec/unit/confine_spec.rb +0 -0
- data/spec/unit/confiner_spec.rb +0 -0
- data/spec/unit/context/trusted_information_spec.rb +24 -1
- data/spec/unit/daemon_spec.rb +18 -8
- data/spec/unit/data_providers/function_data_provider_spec.rb +28 -1
- data/spec/unit/data_providers/hiera_data_provider_spec.rb +378 -0
- data/spec/unit/defaults_spec.rb +33 -0
- data/spec/unit/environments_spec.rb +26 -4
- data/spec/unit/external/pson_spec.rb +0 -0
- data/spec/unit/face/catalog_spec.rb +0 -0
- data/spec/unit/face/certificate_spec.rb +0 -0
- data/spec/unit/face/config_spec.rb +0 -0
- data/spec/unit/face/epp_face_spec.rb +2 -2
- data/spec/unit/face/facts_spec.rb +0 -0
- data/spec/unit/face/file_spec.rb +0 -0
- data/spec/unit/face/help_spec.rb +0 -0
- data/spec/unit/face/node_spec.rb +1 -1
- data/spec/unit/face/parser_spec.rb +43 -2
- data/spec/unit/face/plugin_spec.rb +33 -4
- data/spec/unit/face_spec.rb +0 -0
- data/spec/unit/file_bucket/dipper_spec.rb +210 -1
- data/spec/unit/file_bucket/file_spec.rb +0 -0
- data/spec/unit/file_serving/base_spec.rb +0 -0
- data/spec/unit/file_serving/configuration/parser_spec.rb +25 -30
- data/spec/unit/file_serving/configuration_spec.rb +1 -1
- data/spec/unit/file_serving/content_spec.rb +0 -0
- data/spec/unit/file_serving/fileset_spec.rb +0 -0
- data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
- data/spec/unit/file_serving/metadata_spec.rb +51 -1
- data/spec/unit/file_serving/mount/file_spec.rb +0 -0
- data/spec/unit/file_serving/mount/modules_spec.rb +0 -0
- data/spec/unit/file_serving/mount/pluginfacts_spec.rb +0 -0
- data/spec/unit/file_serving/mount/plugins_spec.rb +0 -0
- data/spec/unit/file_serving/mount_spec.rb +0 -0
- data/spec/unit/file_serving/terminus_helper_spec.rb +2 -3
- data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
- data/spec/unit/file_system/uniquefile_spec.rb +20 -0
- data/spec/unit/file_system_spec.rb +145 -0
- data/spec/unit/functions/assert_type_spec.rb +48 -8
- data/spec/unit/functions/defined_spec.rb +289 -0
- data/spec/unit/functions/dig_spec.rb +58 -0
- data/spec/unit/functions/epp_spec.rb +17 -9
- data/spec/unit/functions/filter_spec.rb +18 -0
- data/spec/unit/functions/hiera_spec.rb +10 -8
- data/spec/unit/functions/inline_epp_spec.rb +4 -4
- data/spec/unit/functions/lest_spec.rb +34 -0
- data/spec/unit/functions/lookup_spec.rb +391 -22
- data/spec/unit/functions/new_spec.rb +543 -0
- data/spec/unit/functions/regsubst_spec.rb +29 -8
- data/spec/unit/functions/reverse_each_spec.rb +108 -0
- data/spec/unit/functions/scanf_spec.rb +1 -1
- data/spec/unit/functions/split_spec.rb +10 -2
- data/spec/unit/functions/step_spec.rb +113 -0
- data/spec/unit/functions/then_spec.rb +40 -0
- data/spec/unit/functions/type_spec.rb +35 -0
- data/spec/unit/functions/versioncmp_spec.rb +36 -0
- data/spec/unit/functions4_spec.rb +275 -70
- data/spec/unit/graph/relationship_graph_spec.rb +0 -0
- data/spec/unit/graph/sequential_prioritizer_spec.rb +1 -1
- data/spec/unit/graph/simple_graph_spec.rb +0 -0
- data/spec/unit/hiera/scope_spec.rb +5 -2
- data/spec/unit/hiera_puppet_spec.rb +49 -8
- data/spec/unit/indirector/catalog/compiler_spec.rb +752 -8
- data/spec/unit/indirector/catalog/json_spec.rb +0 -0
- data/spec/unit/indirector/catalog/msgpack_spec.rb +0 -0
- data/spec/unit/indirector/catalog/rest_spec.rb +0 -0
- data/spec/unit/indirector/catalog/static_compiler_spec.rb +38 -20
- data/spec/unit/indirector/catalog/store_configs_spec.rb +0 -0
- data/spec/unit/indirector/catalog/yaml_spec.rb +0 -0
- data/spec/unit/indirector/certificate/ca_spec.rb +0 -0
- data/spec/unit/indirector/certificate/disabled_ca_spec.rb +0 -0
- data/spec/unit/indirector/certificate/file_spec.rb +0 -0
- data/spec/unit/indirector/certificate/rest_spec.rb +0 -0
- data/spec/unit/indirector/certificate_request/ca_spec.rb +0 -0
- data/spec/unit/indirector/certificate_request/disabled_ca_spec.rb +0 -0
- data/spec/unit/indirector/certificate_request/file_spec.rb +0 -0
- data/spec/unit/indirector/certificate_request/rest_spec.rb +0 -0
- data/spec/unit/indirector/certificate_revocation_list/ca_spec.rb +0 -0
- data/spec/unit/indirector/certificate_revocation_list/disabled_ca_spec.rb +0 -0
- data/spec/unit/indirector/certificate_revocation_list/file_spec.rb +0 -0
- data/spec/unit/indirector/certificate_revocation_list/rest_spec.rb +0 -0
- data/spec/unit/indirector/certificate_status/file_spec.rb +0 -0
- data/spec/unit/indirector/certificate_status/rest_spec.rb +0 -0
- data/spec/unit/indirector/code_spec.rb +0 -0
- data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
- data/spec/unit/indirector/direct_file_server_spec.rb +0 -0
- data/spec/unit/indirector/envelope_spec.rb +0 -0
- data/spec/unit/indirector/exec_spec.rb +0 -0
- data/spec/unit/indirector/face_spec.rb +0 -0
- data/spec/unit/indirector/facts/facter_spec.rb +8 -0
- data/spec/unit/indirector/facts/network_device_spec.rb +0 -0
- data/spec/unit/indirector/facts/store_configs_spec.rb +0 -0
- data/spec/unit/indirector/facts/yaml_spec.rb +0 -0
- data/spec/unit/indirector/file_bucket_file/file_spec.rb +53 -2
- data/spec/unit/indirector/file_bucket_file/rest_spec.rb +0 -0
- data/spec/unit/indirector/file_content/file_server_spec.rb +0 -0
- data/spec/unit/indirector/file_content/file_spec.rb +0 -0
- data/spec/unit/indirector/file_content/rest_spec.rb +0 -0
- data/spec/unit/indirector/file_metadata/file_server_spec.rb +0 -0
- data/spec/unit/indirector/file_metadata/file_spec.rb +0 -0
- data/spec/unit/indirector/file_metadata/rest_spec.rb +0 -0
- data/spec/unit/indirector/file_server_spec.rb +0 -0
- data/spec/unit/indirector/indirection_spec.rb +13 -2
- data/spec/unit/indirector/json_spec.rb +1 -1
- data/spec/unit/indirector/key/ca_spec.rb +0 -0
- data/spec/unit/indirector/key/disabled_ca_spec.rb +0 -0
- data/spec/unit/indirector/key/file_spec.rb +0 -0
- data/spec/unit/indirector/ldap_spec.rb +0 -0
- data/spec/unit/indirector/memory_spec.rb +0 -0
- data/spec/unit/indirector/msgpack_spec.rb +11 -1
- data/spec/unit/indirector/node/exec_spec.rb +0 -0
- data/spec/unit/indirector/node/ldap_spec.rb +0 -0
- data/spec/unit/indirector/node/memory_spec.rb +0 -0
- data/spec/unit/indirector/node/msgpack_spec.rb +0 -0
- data/spec/unit/indirector/node/plain_spec.rb +0 -0
- data/spec/unit/indirector/node/rest_spec.rb +0 -0
- data/spec/unit/indirector/node/store_configs_spec.rb +0 -0
- data/spec/unit/indirector/node/yaml_spec.rb +0 -0
- data/spec/unit/indirector/plain_spec.rb +0 -0
- data/spec/unit/indirector/report/msgpack_spec.rb +0 -0
- data/spec/unit/indirector/report/processor_spec.rb +0 -0
- data/spec/unit/indirector/report/rest_spec.rb +0 -0
- data/spec/unit/indirector/report/yaml_spec.rb +0 -0
- data/spec/unit/indirector/request_spec.rb +8 -8
- data/spec/unit/indirector/resource/ral_spec.rb +0 -0
- data/spec/unit/indirector/resource/store_configs_spec.rb +0 -0
- data/spec/unit/indirector/resource_type/parser_spec.rb +5 -0
- data/spec/unit/indirector/resource_type/rest_spec.rb +0 -0
- data/spec/unit/indirector/rest_spec.rb +12 -0
- data/spec/unit/indirector/ssl_file_spec.rb +1 -1
- data/spec/unit/indirector/status/rest_spec.rb +0 -0
- data/spec/unit/indirector/store_configs_spec.rb +0 -0
- data/spec/unit/indirector/terminus_spec.rb +0 -0
- data/spec/unit/indirector/yaml_spec.rb +1 -1
- data/spec/unit/indirector_spec.rb +0 -0
- data/spec/unit/info_service_spec.rb +298 -0
- data/spec/unit/interface/action_builder_spec.rb +0 -0
- data/spec/unit/interface/action_manager_spec.rb +0 -0
- data/spec/unit/interface/action_spec.rb +0 -0
- data/spec/unit/interface/documentation_spec.rb +0 -0
- data/spec/unit/interface/face_collection_spec.rb +0 -0
- data/spec/unit/interface/option_builder_spec.rb +0 -0
- data/spec/unit/interface/option_spec.rb +0 -0
- data/spec/unit/interface_spec.rb +0 -0
- data/spec/unit/man_spec.rb +0 -0
- data/spec/unit/module_spec.rb +42 -27
- data/spec/unit/module_tool/application_spec.rb +1 -1
- data/spec/unit/module_tool/applications/builder_spec.rb +28 -8
- data/spec/unit/module_tool/metadata_spec.rb +31 -2
- data/spec/unit/module_tool_spec.rb +0 -0
- data/spec/unit/network/auth_config_parser_spec.rb +16 -0
- data/spec/unit/network/authconfig_spec.rb +62 -32
- data/spec/unit/network/authorization_spec.rb +30 -2
- data/spec/unit/network/authstore_spec.rb +2 -2
- data/spec/unit/network/format_handler_spec.rb +0 -0
- data/spec/unit/network/format_spec.rb +0 -0
- data/spec/unit/network/formats_spec.rb +0 -0
- data/spec/unit/network/http/api/indirected_routes_spec.rb +21 -13
- data/spec/unit/network/http/api/master/v3/environment_spec.rb +60 -0
- data/spec/unit/network/http/api/master/v3_spec.rb +0 -0
- data/spec/unit/network/http/compression_spec.rb +1 -1
- data/spec/unit/network/http/connection_spec.rb +15 -19
- data/spec/unit/network/http/factory_spec.rb +14 -0
- data/spec/unit/network/http/handler_spec.rb +0 -5
- data/spec/unit/network/http/nocache_pool_spec.rb +0 -0
- data/spec/unit/network/http/pool_spec.rb +30 -0
- data/spec/unit/network/http/rack/rest_spec.rb +7 -0
- data/spec/unit/network/http/rack_spec.rb +0 -0
- data/spec/unit/network/http/session_spec.rb +0 -0
- data/spec/unit/network/http/site_spec.rb +0 -0
- data/spec/unit/network/http/webrick/rest_spec.rb +0 -0
- data/spec/unit/network/http/webrick_spec.rb +0 -0
- data/spec/unit/network/http_pool_spec.rb +0 -0
- data/spec/unit/network/http_spec.rb +0 -0
- data/spec/unit/network/resolver_spec.rb +0 -0
- data/spec/unit/network/rights_spec.rb +3 -3
- data/spec/unit/network/server_spec.rb +0 -0
- data/spec/unit/node/environment_spec.rb +10 -0
- data/spec/unit/node/facts_spec.rb +0 -0
- data/spec/unit/node_spec.rb +41 -0
- data/spec/unit/other/selinux_spec.rb +0 -0
- data/spec/unit/parameter/path_spec.rb +0 -0
- data/spec/unit/parameter/value_collection_spec.rb +0 -0
- data/spec/unit/parameter/value_spec.rb +0 -0
- data/spec/unit/parameter_spec.rb +0 -0
- data/spec/unit/parser/ast/leaf_spec.rb +1 -1
- data/spec/unit/parser/compiler_spec.rb +103 -2
- data/spec/unit/parser/files_spec.rb +0 -0
- data/spec/unit/parser/functions/create_resources_spec.rb +2 -2
- data/spec/unit/parser/functions/defined_spec.rb +0 -0
- data/spec/unit/parser/functions/digest_spec.rb +0 -0
- data/spec/unit/parser/functions/fail_spec.rb +0 -0
- data/spec/unit/parser/functions/file_spec.rb +7 -1
- data/spec/unit/parser/functions/fqdn_rand_spec.rb +6 -2
- data/spec/unit/parser/functions/generate_spec.rb +3 -12
- data/spec/unit/parser/functions/hiera_spec.rb +0 -0
- data/spec/unit/parser/functions/include_spec.rb +0 -0
- data/spec/unit/parser/functions/inline_template_spec.rb +0 -0
- data/spec/unit/parser/functions/realize_spec.rb +0 -0
- data/spec/unit/parser/functions/regsubst_spec.rb +0 -0
- data/spec/unit/parser/functions/require_spec.rb +0 -0
- data/spec/unit/parser/functions/scanf_spec.rb +0 -0
- data/spec/unit/parser/functions/shared.rb +1 -1
- data/spec/unit/parser/functions/shellquote_spec.rb +0 -0
- data/spec/unit/parser/functions/split_spec.rb +0 -0
- data/spec/unit/parser/functions/sprintf_spec.rb +0 -0
- data/spec/unit/parser/functions/tag_spec.rb +0 -0
- data/spec/unit/parser/functions/template_spec.rb +1 -1
- data/spec/unit/parser/functions/versioncmp_spec.rb +0 -0
- data/spec/unit/parser/functions_spec.rb +0 -0
- data/spec/unit/parser/relationship_spec.rb +0 -0
- data/spec/unit/parser/resource/param_spec.rb +0 -0
- data/spec/unit/parser/resource_spec.rb +10 -21
- data/spec/unit/parser/scope_spec.rb +84 -13
- data/spec/unit/parser/templatewrapper_spec.rb +1 -1
- data/spec/unit/parser/type_loader_spec.rb +0 -0
- data/spec/unit/pops/binder/config/binder_config_spec.rb +1 -1
- data/spec/unit/pops/binder/injector_spec.rb +3 -3
- data/spec/unit/pops/evaluator/access_ops_spec.rb +52 -17
- data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -2
- data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +125 -36
- 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/literal_evaluator_spec.rb +43 -0
- data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +25 -0
- data/spec/unit/pops/evaluator/variables_spec.rb +2 -2
- data/spec/unit/pops/issues_spec.rb +16 -16
- data/spec/unit/pops/label_provider_spec.rb +5 -1
- data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
- data/spec/unit/pops/loaders/loaders_spec.rb +230 -47
- data/spec/unit/pops/loaders/static_loader_spec.rb +92 -1
- data/spec/unit/pops/lookup/interpolation_spec.rb +313 -0
- data/spec/unit/pops/migration_spec.rb +53 -0
- data/spec/unit/pops/parser/lexer2_spec.rb +326 -6
- data/spec/unit/pops/parser/parse_application_spec.rb +35 -0
- data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +23 -0
- data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
- data/spec/unit/pops/parser/parse_capabilities_spec.rb +40 -0
- data/spec/unit/pops/parser/parse_heredoc_spec.rb +26 -0
- data/spec/unit/pops/parser/parse_site_spec.rb +47 -0
- data/spec/unit/pops/parser/parser_rspec_helper.rb +6 -0
- data/spec/unit/pops/parser/parser_spec.rb +28 -0
- data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
- data/spec/unit/pops/types/enumeration_spec.rb +13 -12
- data/spec/unit/pops/types/iterable_spec.rb +262 -0
- data/spec/unit/pops/types/p_object_type_spec.rb +1060 -0
- data/spec/unit/pops/types/p_sem_ver_type_spec.rb +285 -0
- data/spec/unit/pops/types/recursion_guard_spec.rb +93 -0
- data/spec/unit/pops/types/ruby_generator_spec.rb +261 -0
- data/spec/unit/pops/types/string_converter_spec.rb +904 -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 +960 -849
- data/spec/unit/pops/types/type_factory_spec.rb +132 -91
- data/spec/unit/pops/types/type_formatter_spec.rb +352 -0
- data/spec/unit/pops/types/type_mismatch_describer_spec.rb +177 -0
- data/spec/unit/pops/types/type_parser_spec.rb +119 -32
- data/spec/unit/pops/types/types_spec.rb +561 -0
- data/spec/unit/pops/validation_spec.rb +66 -0
- data/spec/unit/pops/validator/validator_spec.rb +303 -17
- data/spec/unit/property/ensure_spec.rb +0 -0
- data/spec/unit/property/keyvalue_spec.rb +0 -0
- data/spec/unit/property/list_spec.rb +0 -0
- data/spec/unit/property/ordered_list_spec.rb +0 -0
- data/spec/unit/property_spec.rb +1 -1
- data/spec/unit/provider/augeas/augeas_spec.rb +59 -0
- data/spec/unit/provider/cisco_spec.rb +0 -0
- data/spec/unit/provider/command_spec.rb +0 -0
- data/spec/unit/provider/cron/crontab_spec.rb +0 -0
- data/spec/unit/provider/cron/parsed_spec.rb +1 -0
- data/spec/unit/provider/exec/posix_spec.rb +0 -0
- data/spec/unit/provider/exec/shell_spec.rb +0 -0
- data/spec/unit/provider/exec/windows_spec.rb +0 -0
- data/spec/unit/provider/exec_spec.rb +0 -0
- data/spec/unit/provider/file/posix_spec.rb +0 -0
- data/spec/unit/provider/file/windows_spec.rb +0 -0
- data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
- data/spec/unit/provider/group/groupadd_spec.rb +0 -0
- data/spec/unit/provider/group/ldap_spec.rb +0 -0
- data/spec/unit/provider/group/pw_spec.rb +0 -0
- data/spec/unit/provider/group/windows_adsi_spec.rb +73 -17
- data/spec/unit/provider/host/parsed_spec.rb +0 -0
- data/spec/unit/provider/interface/cisco_spec.rb +0 -0
- data/spec/unit/provider/ldap_spec.rb +0 -0
- data/spec/unit/provider/macauthorization_spec.rb +5 -2
- data/spec/unit/provider/mcx/mcxcontent_spec.rb +0 -0
- data/spec/unit/provider/mount/parsed_spec.rb +31 -5
- data/spec/unit/provider/mount_spec.rb +0 -0
- data/spec/unit/provider/naginator_spec.rb +0 -0
- data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
- data/spec/unit/provider/nameservice_spec.rb +0 -0
- data/spec/unit/provider/network_device_spec.rb +0 -0
- data/spec/unit/provider/package/aix_spec.rb +0 -0
- data/spec/unit/provider/package/appdmg_spec.rb +3 -3
- data/spec/unit/provider/package/apt_spec.rb +5 -0
- data/spec/unit/provider/package/aptitude_spec.rb +0 -0
- data/spec/unit/provider/package/aptrpm_spec.rb +2 -2
- data/spec/unit/provider/package/base_spec.rb +18 -0
- data/spec/unit/provider/package/dnf_spec.rb +108 -0
- data/spec/unit/provider/package/dpkg_spec.rb +0 -0
- data/spec/unit/provider/package/freebsd_spec.rb +0 -0
- data/spec/unit/provider/package/gem_spec.rb +77 -0
- data/spec/unit/provider/package/hpux_spec.rb +0 -0
- data/spec/unit/provider/package/macports_spec.rb +0 -0
- data/spec/unit/provider/package/nim_spec.rb +6 -6
- data/spec/unit/provider/package/openbsd_spec.rb +0 -0
- data/spec/unit/provider/package/opkg_spec.rb +0 -0
- data/spec/unit/provider/package/pacman_spec.rb +55 -0
- data/spec/unit/provider/package/pip3_spec.rb +22 -0
- data/spec/unit/provider/package/pip_spec.rb +159 -46
- data/spec/unit/provider/package/pkg_spec.rb +0 -0
- data/spec/unit/provider/package/pkgdmg_spec.rb +35 -8
- data/spec/unit/provider/package/pkgin_spec.rb +23 -13
- data/spec/unit/provider/package/pkgng_spec.rb +174 -0
- data/spec/unit/provider/package/pkgutil_spec.rb +0 -0
- data/spec/unit/provider/package/puppet_gem_spec.rb +0 -0
- data/spec/unit/provider/package/rpm_spec.rb +160 -3
- data/spec/unit/provider/package/sun_spec.rb +0 -0
- data/spec/unit/provider/package/windows/exe_package_spec.rb +0 -1
- data/spec/unit/provider/package/windows/msi_package_spec.rb +0 -1
- data/spec/unit/provider/package/windows/package_spec.rb +41 -0
- data/spec/unit/provider/package/windows_spec.rb +0 -0
- data/spec/unit/provider/package/yum_spec.rb +81 -147
- data/spec/unit/provider/package/zypper_spec.rb +64 -19
- data/spec/unit/provider/parsedfile_spec.rb +0 -0
- data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +322 -70
- data/spec/unit/provider/selboolean_spec.rb +0 -0
- data/spec/unit/provider/selmodule_spec.rb +0 -0
- data/spec/unit/provider/service/base_spec.rb +38 -27
- data/spec/unit/provider/service/bsd_spec.rb +130 -0
- data/spec/unit/provider/service/daemontools_spec.rb +0 -0
- data/spec/unit/provider/service/debian_spec.rb +29 -0
- data/spec/unit/provider/service/freebsd_spec.rb +17 -0
- data/spec/unit/provider/service/gentoo_spec.rb +2 -0
- data/spec/unit/provider/service/init_spec.rb +35 -1
- data/spec/unit/provider/service/launchd_spec.rb +89 -21
- data/spec/unit/provider/service/openbsd_spec.rb +1 -0
- data/spec/unit/provider/service/openrc_spec.rb +1 -0
- data/spec/unit/provider/service/openwrt_spec.rb +0 -0
- data/spec/unit/provider/service/rcng_spec.rb +41 -0
- data/spec/unit/provider/service/redhat_spec.rb +9 -1
- data/spec/unit/provider/service/runit_spec.rb +0 -0
- data/spec/unit/provider/service/smf_spec.rb +43 -6
- data/spec/unit/provider/service/src_spec.rb +20 -4
- data/spec/unit/provider/service/systemd_spec.rb +169 -37
- data/spec/unit/provider/service/upstart_spec.rb +58 -0
- data/spec/unit/provider/service/windows_spec.rb +0 -0
- data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +1 -1
- data/spec/unit/provider/sshkey/parsed_spec.rb +42 -18
- data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
- data/spec/unit/provider/user/hpux_spec.rb +0 -0
- data/spec/unit/provider/user/ldap_spec.rb +0 -0
- data/spec/unit/provider/user/openbsd_spec.rb +0 -0
- data/spec/unit/provider/user/pw_spec.rb +0 -0
- data/spec/unit/provider/user/user_role_add_spec.rb +0 -0
- data/spec/unit/provider/user/useradd_spec.rb +0 -0
- data/spec/unit/provider/user/windows_adsi_spec.rb +137 -7
- data/spec/unit/provider/vlan/cisco_spec.rb +0 -0
- data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
- data/spec/unit/provider/zfs/zfs_spec.rb +0 -0
- data/spec/unit/provider/zone/solaris_spec.rb +64 -12
- data/spec/unit/provider/zpool/zpool_spec.rb +0 -0
- data/spec/unit/provider_spec.rb +0 -0
- data/spec/unit/puppet_spec.rb +1 -1
- data/spec/unit/relationship_spec.rb +0 -0
- data/spec/unit/reports/http_spec.rb +0 -0
- data/spec/unit/reports/store_spec.rb +0 -0
- data/spec/unit/reports_spec.rb +10 -0
- data/spec/unit/resource/capability_finder_spec.rb +77 -0
- data/spec/unit/resource/catalog_spec.rb +95 -8
- data/spec/unit/resource/status_spec.rb +0 -0
- data/spec/unit/resource/type_collection_helper_spec.rb +0 -0
- data/spec/unit/resource/type_collection_spec.rb +23 -2
- data/spec/unit/resource/type_spec.rb +150 -8
- data/spec/unit/resource_spec.rb +115 -48
- data/spec/unit/settings/directory_setting_spec.rb +0 -0
- data/spec/unit/settings/duration_setting_spec.rb +0 -0
- data/spec/unit/settings/environment_conf_spec.rb +18 -1
- data/spec/unit/settings/file_setting_spec.rb +37 -0
- data/spec/unit/settings/path_setting_spec.rb +0 -0
- data/spec/unit/settings/priority_setting_spec.rb +0 -0
- data/spec/unit/settings_spec.rb +103 -3
- data/spec/unit/ssl/base_spec.rb +0 -0
- data/spec/unit/ssl/certificate_authority/interface_spec.rb +4 -3
- data/spec/unit/ssl/certificate_authority_spec.rb +5 -3
- data/spec/unit/ssl/certificate_factory_spec.rb +0 -0
- data/spec/unit/ssl/certificate_request_spec.rb +0 -0
- data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
- data/spec/unit/ssl/certificate_spec.rb +0 -0
- data/spec/unit/ssl/configuration_spec.rb +0 -0
- data/spec/unit/ssl/host_spec.rb +2 -2
- data/spec/unit/ssl/inventory_spec.rb +0 -0
- data/spec/unit/ssl/key_spec.rb +0 -0
- data/spec/unit/ssl/oids_spec.rb +8 -0
- data/spec/unit/status_spec.rb +0 -0
- data/spec/unit/transaction/additional_resource_generator_spec.rb +120 -32
- data/spec/unit/transaction/event_manager_spec.rb +0 -0
- data/spec/unit/transaction/event_spec.rb +0 -0
- data/spec/unit/transaction/report_spec.rb +51 -1
- data/spec/unit/transaction/resource_harness_spec.rb +0 -47
- data/spec/unit/transaction_spec.rb +12 -0
- data/spec/unit/type/augeas_spec.rb +0 -0
- data/spec/unit/type/component_spec.rb +0 -0
- data/spec/unit/type/computer_spec.rb +0 -0
- data/spec/unit/type/cron_spec.rb +0 -0
- data/spec/unit/type/exec_spec.rb +16 -8
- 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/ctime_spec.rb +0 -0
- data/spec/unit/type/file/ensure_spec.rb +0 -0
- data/spec/unit/type/file/group_spec.rb +0 -0
- data/spec/unit/type/file/mode_spec.rb +0 -0
- data/spec/unit/type/file/mtime_spec.rb +0 -0
- data/spec/unit/type/file/owner_spec.rb +0 -0
- data/spec/unit/type/file/selinux_spec.rb +0 -0
- data/spec/unit/type/file/source_spec.rb +211 -119
- data/spec/unit/type/file/type_spec.rb +0 -0
- data/spec/unit/type/file_spec.rb +133 -34
- data/spec/unit/type/filebucket_spec.rb +0 -0
- data/spec/unit/type/group_spec.rb +0 -0
- data/spec/unit/type/host_spec.rb +4 -4
- data/spec/unit/type/interface_spec.rb +32 -0
- data/spec/unit/type/k5login_spec.rb +0 -0
- data/spec/unit/type/macauthorization_spec.rb +4 -1
- data/spec/unit/type/mailalias_spec.rb +0 -0
- data/spec/unit/type/maillist_spec.rb +0 -0
- data/spec/unit/type/mcx_spec.rb +0 -0
- data/spec/unit/type/mount_spec.rb +59 -10
- data/spec/unit/type/nagios_spec.rb +0 -0
- data/spec/unit/type/noop_metaparam_spec.rb +0 -0
- data/spec/unit/type/package/package_settings_spec.rb +0 -0
- data/spec/unit/type/package_spec.rb +1 -0
- data/spec/unit/type/resources_spec.rb +0 -0
- data/spec/unit/type/schedule_spec.rb +0 -0
- data/spec/unit/type/selboolean_spec.rb +0 -0
- data/spec/unit/type/selmodule_spec.rb +0 -0
- data/spec/unit/type/service_spec.rb +21 -0
- data/spec/unit/type/ssh_authorized_key_spec.rb +0 -0
- data/spec/unit/type/sshkey_spec.rb +0 -0
- data/spec/unit/type/stage_spec.rb +0 -0
- data/spec/unit/type/tidy_spec.rb +4 -4
- data/spec/unit/type/user_spec.rb +14 -7
- data/spec/unit/type/vlan_spec.rb +1 -1
- data/spec/unit/type/whit_spec.rb +0 -0
- data/spec/unit/type/yumrepo_spec.rb +2 -2
- data/spec/unit/type/zfs_spec.rb +0 -0
- data/spec/unit/type/zone_spec.rb +0 -0
- data/spec/unit/type/zpool_spec.rb +0 -0
- data/spec/unit/type_spec.rb +15 -1
- data/spec/unit/util/autoload_spec.rb +0 -0
- data/spec/unit/util/backups_spec.rb +0 -0
- data/spec/unit/util/checksums_spec.rb +0 -0
- data/spec/unit/util/colors_spec.rb +0 -0
- data/spec/unit/util/command_line_spec.rb +0 -0
- data/spec/unit/util/constant_inflector_spec.rb +0 -0
- data/spec/unit/util/diff_spec.rb +0 -0
- data/spec/unit/util/errors_spec.rb +0 -0
- data/spec/unit/util/execution_spec.rb +0 -0
- data/spec/unit/util/execution_stub_spec.rb +0 -0
- data/spec/unit/util/feature_spec.rb +1 -1
- data/spec/unit/util/filetype_spec.rb +1 -1
- data/spec/unit/util/http_proxy_spec.rb +87 -0
- data/spec/unit/util/ldap/connection_spec.rb +0 -0
- data/spec/unit/util/ldap/generator_spec.rb +1 -1
- data/spec/unit/util/ldap/manager_spec.rb +0 -0
- data/spec/unit/util/log/destinations_spec.rb +0 -2
- data/spec/unit/util/log_spec.rb +125 -1
- data/spec/unit/util/logging_spec.rb +69 -0
- data/spec/unit/util/metric_spec.rb +0 -0
- data/spec/unit/util/monkey_patches_spec.rb +79 -3
- data/spec/unit/util/multi_match_spec.rb +39 -0
- data/spec/unit/util/nagios_maker_spec.rb +0 -0
- data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
- data/spec/unit/util/network_device/cisco/facts_spec.rb +0 -0
- data/spec/unit/util/network_device/cisco/interface_spec.rb +0 -0
- data/spec/unit/util/network_device/config_spec.rb +0 -0
- data/spec/unit/util/network_device/ipcalc_spec.rb +0 -0
- data/spec/unit/util/network_device/transport/base_spec.rb +0 -0
- data/spec/unit/util/network_device/transport/ssh_spec.rb +1 -1
- data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
- data/spec/unit/util/network_device_spec.rb +1 -1
- data/spec/unit/util/package_spec.rb +0 -0
- data/spec/unit/util/plist_spec.rb +110 -0
- data/spec/unit/util/posix_spec.rb +0 -0
- data/spec/unit/util/rdoc_spec.rb +0 -0
- data/spec/unit/util/resource_template_spec.rb +2 -2
- data/spec/unit/util/retry_action_spec.rb +0 -0
- data/spec/unit/util/run_mode_spec.rb +27 -3
- data/spec/unit/util/selinux_spec.rb +0 -0
- data/spec/unit/util/splayer_spec.rb +45 -0
- data/spec/unit/util/storage_spec.rb +5 -1
- data/spec/unit/util/suidmanager_spec.rb +0 -0
- data/spec/unit/util/symbolic_file_mode_spec.rb +0 -0
- data/spec/unit/util/tagging_spec.rb +0 -0
- data/spec/unit/util/user_attr_spec.rb +0 -0
- data/spec/unit/util/warnings_spec.rb +0 -0
- data/spec/unit/util/windows/adsi_spec.rb +175 -60
- data/spec/unit/util/windows/api_types_spec.rb +42 -0
- data/spec/unit/util/windows/file_spec.rb +34 -0
- data/spec/unit/util/windows/root_certs_spec.rb +0 -0
- data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
- data/spec/unit/util/windows/sid_spec.rb +48 -21
- data/spec/unit/util_spec.rb +144 -15
- data/spec/watchr.rb +0 -0
- data/tasks/cfpropertylist.rake +15 -0
- metadata +3427 -2981
- checksums.yaml +0 -7
- data/ext/puppet-nm-dispatcher +0 -13
- data/ext/systemd/puppetmaster.service +0 -11
- data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
- data/lib/puppet/pops/types/types_meta.rb +0 -223
- 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/integration/data_binding.rb +0 -104
- data/spec/integration/provider/package_spec.rb +0 -33
- /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
|
@@ -1,367 +1,345 @@
|
|
|
1
1
|
require 'spec_helper'
|
|
2
2
|
require 'puppet/pops'
|
|
3
3
|
|
|
4
|
+
module Puppet::Pops
|
|
5
|
+
module Types
|
|
4
6
|
describe 'The type calculator' do
|
|
5
|
-
let(:calculator) {
|
|
7
|
+
let(:calculator) { TypeCalculator.new }
|
|
6
8
|
|
|
7
9
|
def range_t(from, to)
|
|
8
|
-
|
|
9
|
-
t.from = from
|
|
10
|
-
t.to = to
|
|
11
|
-
t
|
|
12
|
-
end
|
|
13
|
-
def constrained_t(t, from, to)
|
|
14
|
-
Puppet::Pops::Types::TypeFactory.constrain_size(t, from, to)
|
|
10
|
+
PIntegerType.new(from, to)
|
|
15
11
|
end
|
|
16
12
|
|
|
17
13
|
def pattern_t(*patterns)
|
|
18
|
-
|
|
14
|
+
TypeFactory.pattern(*patterns)
|
|
19
15
|
end
|
|
20
16
|
|
|
21
17
|
def regexp_t(pattern)
|
|
22
|
-
|
|
18
|
+
TypeFactory.regexp(pattern)
|
|
23
19
|
end
|
|
24
20
|
|
|
25
21
|
def string_t(*strings)
|
|
26
|
-
|
|
22
|
+
TypeFactory.string(nil, *strings)
|
|
27
23
|
end
|
|
28
24
|
|
|
29
|
-
def
|
|
30
|
-
|
|
31
|
-
end
|
|
32
|
-
def all_callables_t(*params)
|
|
33
|
-
Puppet::Pops::Types::TypeFactory.all_callables()
|
|
25
|
+
def constrained_string_t(size_type, *strings)
|
|
26
|
+
TypeFactory.string(size_type, *strings)
|
|
34
27
|
end
|
|
35
28
|
|
|
36
|
-
def
|
|
37
|
-
|
|
29
|
+
def callable_t(*params)
|
|
30
|
+
TypeFactory.callable(*params)
|
|
38
31
|
end
|
|
39
32
|
|
|
40
|
-
def
|
|
41
|
-
|
|
33
|
+
def all_callables_t
|
|
34
|
+
TypeFactory.all_callables
|
|
42
35
|
end
|
|
43
36
|
|
|
44
37
|
def enum_t(*strings)
|
|
45
|
-
|
|
38
|
+
TypeFactory.enum(*strings)
|
|
46
39
|
end
|
|
47
40
|
|
|
48
41
|
def variant_t(*types)
|
|
49
|
-
|
|
42
|
+
TypeFactory.variant(*types)
|
|
50
43
|
end
|
|
51
44
|
|
|
52
|
-
def
|
|
53
|
-
|
|
45
|
+
def type_alias_t(name, type_string)
|
|
46
|
+
type_expr = Parser::EvaluatingParser.new.parse_string(type_string).current
|
|
47
|
+
TypeFactory.type_alias(name, type_expr)
|
|
54
48
|
end
|
|
55
49
|
|
|
56
|
-
def
|
|
57
|
-
|
|
50
|
+
def type_reference_t(type_string)
|
|
51
|
+
TypeFactory.type_reference(type_string)
|
|
58
52
|
end
|
|
59
53
|
|
|
60
|
-
def
|
|
61
|
-
|
|
54
|
+
def integer_t
|
|
55
|
+
TypeFactory.integer
|
|
62
56
|
end
|
|
63
57
|
|
|
64
|
-
def
|
|
65
|
-
|
|
58
|
+
def array_t(t, s = nil)
|
|
59
|
+
TypeFactory.array_of(t, s)
|
|
66
60
|
end
|
|
67
61
|
|
|
68
|
-
def
|
|
69
|
-
|
|
62
|
+
def empty_array_t
|
|
63
|
+
empty_array = array_t(unit_t, range_t(0,0))
|
|
70
64
|
end
|
|
71
65
|
|
|
72
|
-
def
|
|
73
|
-
|
|
66
|
+
def hash_t(k,v,s = nil)
|
|
67
|
+
TypeFactory.hash_of(v, k, s)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def data_t
|
|
71
|
+
TypeFactory.data
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def factory
|
|
75
|
+
TypeFactory
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def collection_t(size_type = nil)
|
|
79
|
+
TypeFactory.collection(size_type)
|
|
74
80
|
end
|
|
75
81
|
|
|
76
82
|
def tuple_t(*types)
|
|
77
|
-
|
|
83
|
+
TypeFactory.tuple(types)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def constrained_tuple_t(size_type, *types)
|
|
87
|
+
TypeFactory.tuple(types, size_type)
|
|
78
88
|
end
|
|
79
89
|
|
|
80
90
|
def struct_t(type_hash)
|
|
81
|
-
|
|
91
|
+
TypeFactory.struct(type_hash)
|
|
82
92
|
end
|
|
83
93
|
|
|
84
94
|
def object_t
|
|
85
|
-
|
|
95
|
+
TypeFactory.any
|
|
86
96
|
end
|
|
87
97
|
|
|
88
98
|
def optional_t(t)
|
|
89
|
-
|
|
99
|
+
TypeFactory.optional(t)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def type_t(t)
|
|
103
|
+
TypeFactory.type_type(t)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def not_undef_t(t = nil)
|
|
107
|
+
TypeFactory.not_undef(t)
|
|
90
108
|
end
|
|
91
109
|
|
|
92
110
|
def undef_t
|
|
93
|
-
|
|
111
|
+
TypeFactory.undef
|
|
94
112
|
end
|
|
95
113
|
|
|
96
114
|
def unit_t
|
|
97
115
|
# Cannot be created via factory, the type is private to the type system
|
|
98
|
-
|
|
116
|
+
PUnitType::DEFAULT
|
|
99
117
|
end
|
|
100
118
|
|
|
101
119
|
def types
|
|
102
|
-
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
shared_context "types_setup" do
|
|
106
|
-
|
|
107
|
-
# Do not include the special type Unit in this list
|
|
108
|
-
def all_types
|
|
109
|
-
[ Puppet::Pops::Types::PAnyType,
|
|
110
|
-
Puppet::Pops::Types::PUndefType,
|
|
111
|
-
Puppet::Pops::Types::PDataType,
|
|
112
|
-
Puppet::Pops::Types::PScalarType,
|
|
113
|
-
Puppet::Pops::Types::PStringType,
|
|
114
|
-
Puppet::Pops::Types::PNumericType,
|
|
115
|
-
Puppet::Pops::Types::PIntegerType,
|
|
116
|
-
Puppet::Pops::Types::PFloatType,
|
|
117
|
-
Puppet::Pops::Types::PRegexpType,
|
|
118
|
-
Puppet::Pops::Types::PBooleanType,
|
|
119
|
-
Puppet::Pops::Types::PCollectionType,
|
|
120
|
-
Puppet::Pops::Types::PArrayType,
|
|
121
|
-
Puppet::Pops::Types::PHashType,
|
|
122
|
-
Puppet::Pops::Types::PRuntimeType,
|
|
123
|
-
Puppet::Pops::Types::PHostClassType,
|
|
124
|
-
Puppet::Pops::Types::PResourceType,
|
|
125
|
-
Puppet::Pops::Types::PPatternType,
|
|
126
|
-
Puppet::Pops::Types::PEnumType,
|
|
127
|
-
Puppet::Pops::Types::PVariantType,
|
|
128
|
-
Puppet::Pops::Types::PStructType,
|
|
129
|
-
Puppet::Pops::Types::PTupleType,
|
|
130
|
-
Puppet::Pops::Types::PCallableType,
|
|
131
|
-
Puppet::Pops::Types::PType,
|
|
132
|
-
Puppet::Pops::Types::POptionalType,
|
|
133
|
-
Puppet::Pops::Types::PDefaultType,
|
|
134
|
-
]
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
def scalar_types
|
|
138
|
-
# PVariantType is also scalar, if its types are all Scalar
|
|
139
|
-
[
|
|
140
|
-
Puppet::Pops::Types::PScalarType,
|
|
141
|
-
Puppet::Pops::Types::PStringType,
|
|
142
|
-
Puppet::Pops::Types::PNumericType,
|
|
143
|
-
Puppet::Pops::Types::PIntegerType,
|
|
144
|
-
Puppet::Pops::Types::PFloatType,
|
|
145
|
-
Puppet::Pops::Types::PRegexpType,
|
|
146
|
-
Puppet::Pops::Types::PBooleanType,
|
|
147
|
-
Puppet::Pops::Types::PPatternType,
|
|
148
|
-
Puppet::Pops::Types::PEnumType,
|
|
149
|
-
]
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
def numeric_types
|
|
153
|
-
# PVariantType is also numeric, if its types are all numeric
|
|
154
|
-
[
|
|
155
|
-
Puppet::Pops::Types::PNumericType,
|
|
156
|
-
Puppet::Pops::Types::PIntegerType,
|
|
157
|
-
Puppet::Pops::Types::PFloatType,
|
|
158
|
-
]
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
def string_types
|
|
162
|
-
# PVariantType is also string type, if its types are all compatible
|
|
163
|
-
[
|
|
164
|
-
Puppet::Pops::Types::PStringType,
|
|
165
|
-
Puppet::Pops::Types::PPatternType,
|
|
166
|
-
Puppet::Pops::Types::PEnumType,
|
|
167
|
-
]
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
def collection_types
|
|
171
|
-
# PVariantType is also string type, if its types are all compatible
|
|
172
|
-
[
|
|
173
|
-
Puppet::Pops::Types::PCollectionType,
|
|
174
|
-
Puppet::Pops::Types::PHashType,
|
|
175
|
-
Puppet::Pops::Types::PArrayType,
|
|
176
|
-
Puppet::Pops::Types::PStructType,
|
|
177
|
-
Puppet::Pops::Types::PTupleType,
|
|
178
|
-
]
|
|
179
|
-
end
|
|
180
|
-
|
|
181
|
-
def data_compatible_types
|
|
182
|
-
result = scalar_types
|
|
183
|
-
result << Puppet::Pops::Types::PDataType
|
|
184
|
-
result << array_t(types::PDataType.new)
|
|
185
|
-
result << types::TypeFactory.hash_of_data
|
|
186
|
-
result << Puppet::Pops::Types::PUndefType
|
|
187
|
-
tmp = tuple_t(types::PDataType.new)
|
|
188
|
-
result << (tmp)
|
|
189
|
-
tmp.size_type = range_t(0, nil)
|
|
190
|
-
result
|
|
191
|
-
end
|
|
192
|
-
|
|
193
|
-
def type_from_class(c)
|
|
194
|
-
c.is_a?(Class) ? c.new : c
|
|
195
|
-
end
|
|
120
|
+
Types
|
|
196
121
|
end
|
|
197
122
|
|
|
198
123
|
context 'when inferring ruby' do
|
|
199
124
|
|
|
200
125
|
it 'fixnum translates to PIntegerType' do
|
|
201
|
-
expect(calculator.infer(1).class).to eq(
|
|
126
|
+
expect(calculator.infer(1).class).to eq(PIntegerType)
|
|
202
127
|
end
|
|
203
128
|
|
|
204
129
|
it 'large fixnum (or bignum depending on architecture) translates to PIntegerType' do
|
|
205
|
-
expect(calculator.infer(2**33).class).to eq(
|
|
130
|
+
expect(calculator.infer(2**33).class).to eq(PIntegerType)
|
|
206
131
|
end
|
|
207
132
|
|
|
208
133
|
it 'float translates to PFloatType' do
|
|
209
|
-
expect(calculator.infer(1.3).class).to eq(
|
|
134
|
+
expect(calculator.infer(1.3).class).to eq(PFloatType)
|
|
210
135
|
end
|
|
211
136
|
|
|
212
137
|
it 'string translates to PStringType' do
|
|
213
|
-
expect(calculator.infer('foo').class).to eq(
|
|
138
|
+
expect(calculator.infer('foo').class).to eq(PStringType)
|
|
214
139
|
end
|
|
215
140
|
|
|
216
141
|
it 'inferred string type knows the string value' do
|
|
217
142
|
t = calculator.infer('foo')
|
|
218
|
-
expect(t.class).to eq(
|
|
143
|
+
expect(t.class).to eq(PStringType)
|
|
219
144
|
expect(t.values).to eq(['foo'])
|
|
220
145
|
end
|
|
221
146
|
|
|
222
147
|
it 'boolean true translates to PBooleanType' do
|
|
223
|
-
expect(calculator.infer(true).class).to eq(
|
|
148
|
+
expect(calculator.infer(true).class).to eq(PBooleanType)
|
|
224
149
|
end
|
|
225
150
|
|
|
226
151
|
it 'boolean false translates to PBooleanType' do
|
|
227
|
-
expect(calculator.infer(false).class).to eq(
|
|
152
|
+
expect(calculator.infer(false).class).to eq(PBooleanType)
|
|
228
153
|
end
|
|
229
154
|
|
|
230
155
|
it 'regexp translates to PRegexpType' do
|
|
231
|
-
expect(calculator.infer(/^a regular expression$/).class).to eq(
|
|
156
|
+
expect(calculator.infer(/^a regular expression$/).class).to eq(PRegexpType)
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
it 'iterable translates to PIteratorType' do
|
|
160
|
+
expect(calculator.infer(Iterable.on(1))).to be_a(PIteratorType)
|
|
232
161
|
end
|
|
233
162
|
|
|
234
163
|
it 'nil translates to PUndefType' do
|
|
235
|
-
expect(calculator.infer(nil).class).to eq(
|
|
164
|
+
expect(calculator.infer(nil).class).to eq(PUndefType)
|
|
236
165
|
end
|
|
237
166
|
|
|
238
|
-
it ':undef translates to
|
|
239
|
-
expect(calculator.infer(:undef).class).to eq(
|
|
167
|
+
it ':undef translates to PUndefType' do
|
|
168
|
+
expect(calculator.infer(:undef).class).to eq(PUndefType)
|
|
240
169
|
end
|
|
241
170
|
|
|
242
171
|
it 'an instance of class Foo translates to PRuntimeType[ruby, Foo]' do
|
|
243
|
-
|
|
172
|
+
::Foo = Class.new
|
|
173
|
+
begin
|
|
174
|
+
t = calculator.infer(::Foo.new)
|
|
175
|
+
expect(t.class).to eq(PRuntimeType)
|
|
176
|
+
expect(t.runtime).to eq(:ruby)
|
|
177
|
+
expect(t.runtime_type_name).to eq('Foo')
|
|
178
|
+
ensure
|
|
179
|
+
Object.send(:remove_const, :Foo)
|
|
244
180
|
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
it 'Class Foo translates to PType[PRuntimeType[ruby, Foo]]' do
|
|
184
|
+
::Foo = Class.new
|
|
185
|
+
begin
|
|
186
|
+
t = calculator.infer(::Foo)
|
|
187
|
+
expect(t.class).to eq(PType)
|
|
188
|
+
tt = t.type
|
|
189
|
+
expect(tt.class).to eq(PRuntimeType)
|
|
190
|
+
expect(tt.runtime).to eq(:ruby)
|
|
191
|
+
expect(tt.runtime_type_name).to eq('Foo')
|
|
192
|
+
ensure
|
|
193
|
+
Object.send(:remove_const, :Foo)
|
|
194
|
+
end
|
|
195
|
+
end
|
|
245
196
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
197
|
+
it 'Module FooModule translates to PType[PRuntimeType[ruby, FooModule]]' do
|
|
198
|
+
::FooModule = Module.new
|
|
199
|
+
begin
|
|
200
|
+
t = calculator.infer(::FooModule)
|
|
201
|
+
expect(t.class).to eq(PType)
|
|
202
|
+
tt = t.type
|
|
203
|
+
expect(tt.class).to eq(PRuntimeType)
|
|
204
|
+
expect(tt.runtime).to eq(:ruby)
|
|
205
|
+
expect(tt.runtime_type_name).to eq('FooModule')
|
|
206
|
+
ensure
|
|
207
|
+
Object.send(:remove_const, :FooModule)
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
context 'version' do
|
|
212
|
+
it 'translates to PVersionType' do
|
|
213
|
+
expect(calculator.infer(Semantic::Version.new(1,0,0)).class).to eq(PSemVerType)
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
it 'range translates to PVersionRangeType' do
|
|
217
|
+
expect(calculator.infer(Semantic::VersionRange.parse('1.x')).class).to eq(PSemVerRangeType)
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
it 'translates to a limited PVersionType by infer_set' do
|
|
221
|
+
v = Semantic::Version.new(1,0,0)
|
|
222
|
+
t = calculator.infer_set(v)
|
|
223
|
+
expect(t.class).to eq(PSemVerType)
|
|
224
|
+
expect(t.ranges.size).to eq(1)
|
|
225
|
+
expect(t.ranges[0].min).to eq(v)
|
|
226
|
+
expect(t.ranges[0].max).to eq(v)
|
|
227
|
+
end
|
|
250
228
|
end
|
|
251
229
|
|
|
252
230
|
context 'array' do
|
|
253
231
|
it 'translates to PArrayType' do
|
|
254
|
-
expect(calculator.infer([1,2]).class).to eq(
|
|
232
|
+
expect(calculator.infer([1,2]).class).to eq(PArrayType)
|
|
255
233
|
end
|
|
256
234
|
|
|
257
235
|
it 'with fixnum values translates to PArrayType[PIntegerType]' do
|
|
258
|
-
expect(calculator.infer([1,2]).element_type.class).to eq(
|
|
236
|
+
expect(calculator.infer([1,2]).element_type.class).to eq(PIntegerType)
|
|
259
237
|
end
|
|
260
238
|
|
|
261
239
|
it 'with 32 and 64 bit integer values translates to PArrayType[PIntegerType]' do
|
|
262
|
-
expect(calculator.infer([1,2**33]).element_type.class).to eq(
|
|
240
|
+
expect(calculator.infer([1,2**33]).element_type.class).to eq(PIntegerType)
|
|
263
241
|
end
|
|
264
242
|
|
|
265
243
|
it 'Range of integer values are computed' do
|
|
266
244
|
t = calculator.infer([-3,0,42]).element_type
|
|
267
|
-
expect(t.class).to eq(
|
|
245
|
+
expect(t.class).to eq(PIntegerType)
|
|
268
246
|
expect(t.from).to eq(-3)
|
|
269
247
|
expect(t.to).to eq(42)
|
|
270
248
|
end
|
|
271
249
|
|
|
272
|
-
it
|
|
250
|
+
it 'Compound string values are computed' do
|
|
273
251
|
t = calculator.infer(['a','b', 'c']).element_type
|
|
274
|
-
expect(t.class).to eq(
|
|
252
|
+
expect(t.class).to eq(PStringType)
|
|
275
253
|
expect(t.values).to eq(['a', 'b', 'c'])
|
|
276
254
|
end
|
|
277
255
|
|
|
278
256
|
it 'with fixnum and float values translates to PArrayType[PNumericType]' do
|
|
279
|
-
expect(calculator.infer([1,2.0]).element_type.class).to eq(
|
|
257
|
+
expect(calculator.infer([1,2.0]).element_type.class).to eq(PNumericType)
|
|
280
258
|
end
|
|
281
259
|
|
|
282
260
|
it 'with fixnum and string values translates to PArrayType[PScalarType]' do
|
|
283
|
-
expect(calculator.infer([1,'two']).element_type.class).to eq(
|
|
261
|
+
expect(calculator.infer([1,'two']).element_type.class).to eq(PScalarType)
|
|
284
262
|
end
|
|
285
263
|
|
|
286
264
|
it 'with float and string values translates to PArrayType[PScalarType]' do
|
|
287
|
-
expect(calculator.infer([1.0,'two']).element_type.class).to eq(
|
|
265
|
+
expect(calculator.infer([1.0,'two']).element_type.class).to eq(PScalarType)
|
|
288
266
|
end
|
|
289
267
|
|
|
290
268
|
it 'with fixnum, float, and string values translates to PArrayType[PScalarType]' do
|
|
291
|
-
expect(calculator.infer([1, 2.0,'two']).element_type.class).to eq(
|
|
269
|
+
expect(calculator.infer([1, 2.0,'two']).element_type.class).to eq(PScalarType)
|
|
292
270
|
end
|
|
293
271
|
|
|
294
272
|
it 'with fixnum and regexp values translates to PArrayType[PScalarType]' do
|
|
295
|
-
expect(calculator.infer([1, /two/]).element_type.class).to eq(
|
|
273
|
+
expect(calculator.infer([1, /two/]).element_type.class).to eq(PScalarType)
|
|
296
274
|
end
|
|
297
275
|
|
|
298
276
|
it 'with string and regexp values translates to PArrayType[PScalarType]' do
|
|
299
|
-
expect(calculator.infer(['one', /two/]).element_type.class).to eq(
|
|
277
|
+
expect(calculator.infer(['one', /two/]).element_type.class).to eq(PScalarType)
|
|
300
278
|
end
|
|
301
279
|
|
|
302
280
|
it 'with string and symbol values translates to PArrayType[PAnyType]' do
|
|
303
|
-
expect(calculator.infer(['one', :two]).element_type.class).to eq(
|
|
281
|
+
expect(calculator.infer(['one', :two]).element_type.class).to eq(PAnyType)
|
|
304
282
|
end
|
|
305
283
|
|
|
306
284
|
it 'with fixnum and nil values translates to PArrayType[PIntegerType]' do
|
|
307
|
-
expect(calculator.infer([1, nil]).element_type.class).to eq(
|
|
285
|
+
expect(calculator.infer([1, nil]).element_type.class).to eq(PIntegerType)
|
|
308
286
|
end
|
|
309
287
|
|
|
310
288
|
it 'with arrays of string values translates to PArrayType[PArrayType[PStringType]]' do
|
|
311
289
|
et = calculator.infer([['first' 'array'], ['second','array']])
|
|
312
|
-
expect(et.class).to eq(
|
|
290
|
+
expect(et.class).to eq(PArrayType)
|
|
313
291
|
et = et.element_type
|
|
314
|
-
expect(et.class).to eq(
|
|
292
|
+
expect(et.class).to eq(PArrayType)
|
|
315
293
|
et = et.element_type
|
|
316
|
-
expect(et.class).to eq(
|
|
294
|
+
expect(et.class).to eq(PStringType)
|
|
317
295
|
end
|
|
318
296
|
|
|
319
297
|
it 'with array of string values and array of fixnums translates to PArrayType[PArrayType[PScalarType]]' do
|
|
320
298
|
et = calculator.infer([['first' 'array'], [1,2]])
|
|
321
|
-
expect(et.class).to eq(
|
|
299
|
+
expect(et.class).to eq(PArrayType)
|
|
322
300
|
et = et.element_type
|
|
323
|
-
expect(et.class).to eq(
|
|
301
|
+
expect(et.class).to eq(PArrayType)
|
|
324
302
|
et = et.element_type
|
|
325
|
-
expect(et.class).to eq(
|
|
303
|
+
expect(et.class).to eq(PScalarType)
|
|
326
304
|
end
|
|
327
305
|
|
|
328
306
|
it 'with hashes of string values translates to PArrayType[PHashType[PStringType]]' do
|
|
329
307
|
et = calculator.infer([{:first => 'first', :second => 'second' }, {:first => 'first', :second => 'second' }])
|
|
330
|
-
expect(et.class).to eq(
|
|
308
|
+
expect(et.class).to eq(PArrayType)
|
|
331
309
|
et = et.element_type
|
|
332
|
-
expect(et.class).to eq(
|
|
310
|
+
expect(et.class).to eq(PHashType)
|
|
333
311
|
et = et.element_type
|
|
334
|
-
expect(et.class).to eq(
|
|
312
|
+
expect(et.class).to eq(PStringType)
|
|
335
313
|
end
|
|
336
314
|
|
|
337
315
|
it 'with hash of string values and hash of fixnums translates to PArrayType[PHashType[PScalarType]]' do
|
|
338
316
|
et = calculator.infer([{:first => 'first', :second => 'second' }, {:first => 1, :second => 2 }])
|
|
339
|
-
expect(et.class).to eq(
|
|
317
|
+
expect(et.class).to eq(PArrayType)
|
|
340
318
|
et = et.element_type
|
|
341
|
-
expect(et.class).to eq(
|
|
319
|
+
expect(et.class).to eq(PHashType)
|
|
342
320
|
et = et.element_type
|
|
343
|
-
expect(et.class).to eq(
|
|
321
|
+
expect(et.class).to eq(PScalarType)
|
|
344
322
|
end
|
|
345
323
|
end
|
|
346
324
|
|
|
347
325
|
context 'hash' do
|
|
348
326
|
it 'translates to PHashType' do
|
|
349
|
-
expect(calculator.infer({:first => 1, :second => 2}).class).to eq(
|
|
327
|
+
expect(calculator.infer({:first => 1, :second => 2}).class).to eq(PHashType)
|
|
350
328
|
end
|
|
351
329
|
|
|
352
330
|
it 'with symbolic keys translates to PHashType[PRuntimeType[ruby, Symbol], value]' do
|
|
353
331
|
k = calculator.infer({:first => 1, :second => 2}).key_type
|
|
354
|
-
expect(k.class).to eq(
|
|
332
|
+
expect(k.class).to eq(PRuntimeType)
|
|
355
333
|
expect(k.runtime).to eq(:ruby)
|
|
356
334
|
expect(k.runtime_type_name).to eq('Symbol')
|
|
357
335
|
end
|
|
358
336
|
|
|
359
337
|
it 'with string keys translates to PHashType[PStringType, value]' do
|
|
360
|
-
expect(calculator.infer({'first' => 1, 'second' => 2}).key_type.class).to eq(
|
|
338
|
+
expect(calculator.infer({'first' => 1, 'second' => 2}).key_type.class).to eq(PStringType)
|
|
361
339
|
end
|
|
362
340
|
|
|
363
341
|
it 'with fixnum values translates to PHashType[key, PIntegerType]' do
|
|
364
|
-
expect(calculator.infer({:first => 1, :second => 2}).element_type.class).to eq(
|
|
342
|
+
expect(calculator.infer({:first => 1, :second => 2}).element_type.class).to eq(PIntegerType)
|
|
365
343
|
end
|
|
366
344
|
|
|
367
345
|
it 'when empty infers a type that answers true to is_the_empty_hash?' do
|
|
@@ -374,110 +352,132 @@ describe 'The type calculator' do
|
|
|
374
352
|
end
|
|
375
353
|
|
|
376
354
|
it 'when empty is not assignable to a PHashType with from size > 0' do
|
|
377
|
-
expect(calculator.assignable?(
|
|
355
|
+
expect(calculator.assignable?(hash_t(string_t,string_t,range_t(1, 1)), calculator.infer({}))).to eq(false)
|
|
378
356
|
end
|
|
379
357
|
|
|
380
358
|
context 'using infer_set' do
|
|
381
359
|
it "with 'first' and 'second' keys translates to PStructType[{first=>value,second=>value}]" do
|
|
382
360
|
t = calculator.infer_set({'first' => 1, 'second' => 2})
|
|
383
|
-
expect(t.class).to eq(
|
|
361
|
+
expect(t.class).to eq(PStructType)
|
|
384
362
|
expect(t.elements.size).to eq(2)
|
|
385
363
|
expect(t.elements.map { |e| e.name }.sort).to eq(['first', 'second'])
|
|
386
364
|
end
|
|
387
365
|
|
|
388
366
|
it 'with string keys and string and array values translates to PStructType[{key1=>PStringType,key2=>PTupleType}]' do
|
|
389
367
|
t = calculator.infer_set({ 'mode' => 'read', 'path' => ['foo', 'fee' ] })
|
|
390
|
-
expect(t.class).to eq(
|
|
368
|
+
expect(t.class).to eq(PStructType)
|
|
391
369
|
expect(t.elements.size).to eq(2)
|
|
392
|
-
els = t.elements.map { |e| e.
|
|
393
|
-
expect(els[0].class).to eq(
|
|
394
|
-
expect(els[1].class).to eq(
|
|
370
|
+
els = t.elements.map { |e| e.value_type }.sort {|a,b| a.to_s <=> b.to_s }
|
|
371
|
+
expect(els[0].class).to eq(PStringType)
|
|
372
|
+
expect(els[1].class).to eq(PTupleType)
|
|
395
373
|
end
|
|
396
374
|
|
|
397
375
|
it 'with mixed string and non-string keys translates to PHashType' do
|
|
398
376
|
t = calculator.infer_set({ 1 => 'first', 'second' => 'second' })
|
|
399
|
-
expect(t.class).to eq(
|
|
377
|
+
expect(t.class).to eq(PHashType)
|
|
400
378
|
end
|
|
401
379
|
|
|
402
380
|
it 'with empty string keys translates to PHashType' do
|
|
403
381
|
t = calculator.infer_set({ '' => 'first', 'second' => 'second' })
|
|
404
|
-
expect(t.class).to eq(
|
|
382
|
+
expect(t.class).to eq(PHashType)
|
|
405
383
|
end
|
|
406
384
|
end
|
|
407
385
|
end
|
|
408
386
|
end
|
|
409
387
|
|
|
410
388
|
context 'patterns' do
|
|
411
|
-
it
|
|
389
|
+
it 'constructs a PPatternType' do
|
|
412
390
|
t = pattern_t('a(b)c')
|
|
413
|
-
expect(t.class).to eq(
|
|
391
|
+
expect(t.class).to eq(PPatternType)
|
|
414
392
|
expect(t.patterns.size).to eq(1)
|
|
415
|
-
expect(t.patterns[0].class).to eq(
|
|
393
|
+
expect(t.patterns[0].class).to eq(PRegexpType)
|
|
416
394
|
expect(t.patterns[0].pattern).to eq('a(b)c')
|
|
417
395
|
expect(t.patterns[0].regexp.match('abc')[1]).to eq('b')
|
|
418
396
|
end
|
|
419
397
|
|
|
420
|
-
it
|
|
398
|
+
it 'constructs a PStringType with multiple strings' do
|
|
421
399
|
t = string_t('a', 'b', 'c', 'abc')
|
|
422
|
-
expect(t.values).to eq(['a', 'b', 'c', 'abc'])
|
|
400
|
+
expect(t.values).to eq(['a', 'b', 'c', 'abc'].sort)
|
|
423
401
|
end
|
|
424
402
|
end
|
|
425
403
|
|
|
426
404
|
# Deal with cases not covered by computing common type
|
|
427
405
|
context 'when computing common type' do
|
|
428
406
|
it 'computes given resource type commonality' do
|
|
429
|
-
r1 =
|
|
430
|
-
|
|
431
|
-
r2
|
|
432
|
-
r2.type_name = 'File'
|
|
433
|
-
expect(calculator.string(calculator.common_type(r1, r2))).to eq("File")
|
|
407
|
+
r1 = PResourceType.new('File', nil)
|
|
408
|
+
r2 = PResourceType.new('File', nil)
|
|
409
|
+
expect(calculator.common_type(r1, r2).to_s).to eq('File')
|
|
434
410
|
|
|
435
|
-
r2 = Puppet::Pops::Types::PResourceType.new()
|
|
436
|
-
r2.type_name = 'File'
|
|
437
|
-
r2.title = '/tmp/foo'
|
|
438
|
-
expect(calculator.string(calculator.common_type(r1, r2))).to eq("File")
|
|
439
411
|
|
|
440
|
-
|
|
441
|
-
r1.
|
|
442
|
-
r1.title = '/tmp/foo'
|
|
443
|
-
expect(calculator.string(calculator.common_type(r1, r2))).to eq("File['/tmp/foo']")
|
|
412
|
+
r2 = PResourceType.new('File', '/tmp/foo')
|
|
413
|
+
expect(calculator.common_type(r1, r2).to_s).to eq('File')
|
|
444
414
|
|
|
445
|
-
r1 =
|
|
446
|
-
r1.
|
|
447
|
-
r1.title = '/tmp/bar'
|
|
448
|
-
expect(calculator.string(calculator.common_type(r1, r2))).to eq("File")
|
|
415
|
+
r1 = PResourceType.new('File', '/tmp/foo')
|
|
416
|
+
expect(calculator.common_type(r1, r2).to_s).to eq("File['/tmp/foo']")
|
|
449
417
|
|
|
450
|
-
|
|
451
|
-
r2.
|
|
452
|
-
|
|
453
|
-
|
|
418
|
+
r1 = PResourceType.new('File', '/tmp/bar')
|
|
419
|
+
expect(calculator.common_type(r1, r2).to_s).to eq('File')
|
|
420
|
+
|
|
421
|
+
r2 = PResourceType.new('Package', 'apache')
|
|
422
|
+
expect(calculator.common_type(r1, r2).to_s).to eq('Resource')
|
|
454
423
|
end
|
|
455
424
|
|
|
456
425
|
it 'computes given hostclass type commonality' do
|
|
457
|
-
r1 =
|
|
458
|
-
|
|
459
|
-
r2
|
|
460
|
-
r2.class_name = 'foo'
|
|
461
|
-
expect(calculator.string(calculator.common_type(r1, r2))).to eq("Class[foo]")
|
|
426
|
+
r1 = PHostClassType.new('foo')
|
|
427
|
+
r2 = PHostClassType.new('foo')
|
|
428
|
+
expect(calculator.common_type(r1, r2).to_s).to eq('Class[foo]')
|
|
462
429
|
|
|
463
|
-
r2 =
|
|
464
|
-
r2.
|
|
465
|
-
expect(calculator.string(calculator.common_type(r1, r2))).to eq("Class")
|
|
430
|
+
r2 = PHostClassType.new('bar')
|
|
431
|
+
expect(calculator.common_type(r1, r2).to_s).to eq('Class')
|
|
466
432
|
|
|
467
|
-
r2 =
|
|
468
|
-
expect(calculator.
|
|
433
|
+
r2 = PHostClassType.new(nil)
|
|
434
|
+
expect(calculator.common_type(r1, r2).to_s).to eq('Class')
|
|
469
435
|
|
|
470
|
-
r1 =
|
|
471
|
-
expect(calculator.
|
|
436
|
+
r1 = PHostClassType.new(nil)
|
|
437
|
+
expect(calculator.common_type(r1, r2).to_s).to eq('Class')
|
|
438
|
+
end
|
|
439
|
+
|
|
440
|
+
context 'of strings' do
|
|
441
|
+
it 'computes commonality' do
|
|
442
|
+
t1 = string_t('abc')
|
|
443
|
+
t2 = string_t('xyz')
|
|
444
|
+
common_t = calculator.common_type(t1,t2)
|
|
445
|
+
expect(common_t.class).to eq(PStringType)
|
|
446
|
+
expect(common_t.values).to eq(['abc', 'xyz'])
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
it 'computes common size_type' do
|
|
450
|
+
t1 = constrained_string_t(range_t(3,6))
|
|
451
|
+
t2 = constrained_string_t(range_t(2,4))
|
|
452
|
+
common_t = calculator.common_type(t1,t2)
|
|
453
|
+
expect(common_t.class).to eq(PStringType)
|
|
454
|
+
expect(common_t.size_type).to eq(range_t(2,6))
|
|
455
|
+
end
|
|
456
|
+
|
|
457
|
+
it 'computes common size_type to be undef when one of the types has no size_type' do
|
|
458
|
+
t1 = string_t
|
|
459
|
+
t2 = constrained_string_t(range_t(2,4))
|
|
460
|
+
common_t = calculator.common_type(t1,t2)
|
|
461
|
+
expect(common_t.class).to eq(PStringType)
|
|
462
|
+
expect(common_t.size_type).to be_nil
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
it 'computes values to be empty if the one has empty values' do
|
|
466
|
+
t1 = constrained_string_t(range_t(3,6), 'apa')
|
|
467
|
+
t2 = constrained_string_t(range_t(2,4))
|
|
468
|
+
common_t = calculator.common_type(t1,t2)
|
|
469
|
+
expect(common_t.class).to eq(PStringType)
|
|
470
|
+
expect(common_t.values).to be_empty
|
|
471
|
+
end
|
|
472
472
|
end
|
|
473
473
|
|
|
474
474
|
it 'computes pattern commonality' do
|
|
475
475
|
t1 = pattern_t('abc')
|
|
476
476
|
t2 = pattern_t('xyz')
|
|
477
477
|
common_t = calculator.common_type(t1,t2)
|
|
478
|
-
expect(common_t.class).to eq(
|
|
478
|
+
expect(common_t.class).to eq(PPatternType)
|
|
479
479
|
expect(common_t.patterns.map { |pr| pr.pattern }).to eq(['abc', 'xyz'])
|
|
480
|
-
expect(
|
|
480
|
+
expect(common_t.to_s).to eq('Pattern[/abc/, /xyz/]')
|
|
481
481
|
end
|
|
482
482
|
|
|
483
483
|
it 'computes enum commonality to value set sum' do
|
|
@@ -488,131 +488,210 @@ describe 'The type calculator' do
|
|
|
488
488
|
end
|
|
489
489
|
|
|
490
490
|
it 'computed variant commonality to type union where added types are not sub-types' do
|
|
491
|
-
a_t1 = integer_t
|
|
491
|
+
a_t1 = integer_t
|
|
492
492
|
a_t2 = enum_t('b')
|
|
493
493
|
v_a = variant_t(a_t1, a_t2)
|
|
494
|
-
b_t1 =
|
|
495
|
-
|
|
494
|
+
b_t1 = integer_t
|
|
495
|
+
b_t2 = enum_t('a')
|
|
496
|
+
v_b = variant_t(b_t1, b_t2)
|
|
496
497
|
common_t = calculator.common_type(v_a, v_b)
|
|
497
|
-
expect(common_t.class).to eq(
|
|
498
|
-
expect(Set.new(common_t.types)).to eq(Set.new([a_t1, a_t2, b_t1]))
|
|
498
|
+
expect(common_t.class).to eq(PVariantType)
|
|
499
|
+
expect(Set.new(common_t.types)).to eq(Set.new([a_t1, a_t2, b_t1, b_t2]))
|
|
499
500
|
end
|
|
500
501
|
|
|
501
502
|
it 'computed variant commonality to type union where added types are sub-types' do
|
|
502
|
-
a_t1 = integer_t
|
|
503
|
-
a_t2 = string_t
|
|
503
|
+
a_t1 = integer_t
|
|
504
|
+
a_t2 = string_t
|
|
504
505
|
v_a = variant_t(a_t1, a_t2)
|
|
505
|
-
b_t1 =
|
|
506
|
-
|
|
506
|
+
b_t1 = integer_t
|
|
507
|
+
b_t2 = enum_t('a')
|
|
508
|
+
v_b = variant_t(b_t1, b_t2)
|
|
507
509
|
common_t = calculator.common_type(v_a, v_b)
|
|
508
|
-
expect(common_t.class).to eq(
|
|
510
|
+
expect(common_t.class).to eq(PVariantType)
|
|
509
511
|
expect(Set.new(common_t.types)).to eq(Set.new([a_t1, a_t2]))
|
|
510
512
|
end
|
|
511
513
|
|
|
512
|
-
context
|
|
514
|
+
context 'of callables' do
|
|
513
515
|
it 'incompatible instances => generic callable' do
|
|
514
516
|
t1 = callable_t(String)
|
|
515
517
|
t2 = callable_t(Integer)
|
|
516
518
|
common_t = calculator.common_type(t1, t2)
|
|
517
|
-
expect(common_t.class).to be(
|
|
519
|
+
expect(common_t.class).to be(PCallableType)
|
|
518
520
|
expect(common_t.param_types).to be_nil
|
|
519
521
|
expect(common_t.block_type).to be_nil
|
|
520
522
|
end
|
|
521
523
|
|
|
522
524
|
it 'compatible instances => the most specific' do
|
|
523
525
|
t1 = callable_t(String)
|
|
524
|
-
scalar_t =
|
|
526
|
+
scalar_t = PScalarType.new
|
|
525
527
|
t2 = callable_t(scalar_t)
|
|
526
528
|
common_t = calculator.common_type(t1, t2)
|
|
527
|
-
expect(common_t.class).to be(
|
|
528
|
-
expect(common_t.param_types.class).to be(
|
|
529
|
+
expect(common_t.class).to be(PCallableType)
|
|
530
|
+
expect(common_t.param_types.class).to be(PTupleType)
|
|
529
531
|
expect(common_t.param_types.types).to eql([string_t])
|
|
530
532
|
expect(common_t.block_type).to be_nil
|
|
531
533
|
end
|
|
532
534
|
|
|
533
535
|
it 'block_type is included in the check (incompatible block)' do
|
|
534
|
-
|
|
535
|
-
|
|
536
|
+
b1 = callable_t(String)
|
|
537
|
+
b2 = callable_t(Integer)
|
|
538
|
+
t1 = callable_t(String, b1)
|
|
539
|
+
t2 = callable_t(String, b2)
|
|
536
540
|
common_t = calculator.common_type(t1, t2)
|
|
537
|
-
expect(common_t.class).to be(
|
|
541
|
+
expect(common_t.class).to be(PCallableType)
|
|
538
542
|
expect(common_t.param_types).to be_nil
|
|
539
543
|
expect(common_t.block_type).to be_nil
|
|
540
544
|
end
|
|
541
545
|
|
|
542
546
|
it 'block_type is included in the check (compatible block)' do
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
547
|
+
b1 = callable_t(String)
|
|
548
|
+
t1 = callable_t(String, b1)
|
|
549
|
+
scalar_t = PScalarType::DEFAULT
|
|
550
|
+
b2 = callable_t(scalar_t)
|
|
551
|
+
t2 = callable_t(String, b2)
|
|
546
552
|
common_t = calculator.common_type(t1, t2)
|
|
547
|
-
expect(common_t.param_types.class).to be(
|
|
553
|
+
expect(common_t.param_types.class).to be(PTupleType)
|
|
548
554
|
expect(common_t.block_type).to eql(callable_t(scalar_t))
|
|
549
555
|
end
|
|
550
556
|
end
|
|
551
557
|
end
|
|
552
558
|
|
|
553
559
|
context 'computes assignability' do
|
|
554
|
-
include_context
|
|
560
|
+
include_context 'types_setup'
|
|
561
|
+
|
|
562
|
+
it 'such that all types are assignable to themselves' do
|
|
563
|
+
all_types.each do |tc|
|
|
564
|
+
t = tc::DEFAULT
|
|
565
|
+
expect(t).to be_assignable_to(t)
|
|
566
|
+
end
|
|
567
|
+
end
|
|
555
568
|
|
|
556
569
|
context 'for Unit, such that' do
|
|
557
570
|
it 'all types are assignable to Unit' do
|
|
558
|
-
t =
|
|
559
|
-
all_types.each { |t2| expect(t2
|
|
571
|
+
t = PUnitType::DEFAULT
|
|
572
|
+
all_types.each { |t2| expect(t2::DEFAULT).to be_assignable_to(t) }
|
|
560
573
|
end
|
|
561
574
|
|
|
562
575
|
it 'Unit is assignable to all other types' do
|
|
563
|
-
t =
|
|
564
|
-
all_types.each { |t2| expect(t).to be_assignable_to(t2
|
|
576
|
+
t = PUnitType::DEFAULT
|
|
577
|
+
all_types.each { |t2| expect(t).to be_assignable_to(t2::DEFAULT) }
|
|
565
578
|
end
|
|
566
579
|
|
|
567
580
|
it 'Unit is assignable to Unit' do
|
|
568
|
-
t =
|
|
569
|
-
t2 =
|
|
581
|
+
t = PUnitType::DEFAULT
|
|
582
|
+
t2 = PUnitType::DEFAULT
|
|
570
583
|
expect(t).to be_assignable_to(t2)
|
|
571
584
|
end
|
|
572
585
|
end
|
|
573
586
|
|
|
574
|
-
context
|
|
587
|
+
context 'for Any, such that' do
|
|
575
588
|
it 'all types are assignable to Any' do
|
|
576
|
-
t =
|
|
577
|
-
all_types.each { |t2| expect(t2
|
|
589
|
+
t = PAnyType::DEFAULT
|
|
590
|
+
all_types.each { |t2| expect(t2::DEFAULT).to be_assignable_to(t) }
|
|
591
|
+
end
|
|
592
|
+
|
|
593
|
+
it 'Any is not assignable to anything but Any and Optional (implied Optional[Any])' do
|
|
594
|
+
tested_types = all_types() - [PAnyType, POptionalType]
|
|
595
|
+
t = PAnyType::DEFAULT
|
|
596
|
+
tested_types.each { |t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
|
597
|
+
end
|
|
598
|
+
end
|
|
599
|
+
|
|
600
|
+
context "for NotUndef, such that" do
|
|
601
|
+
it 'all types except types assignable from Undef are assignable to NotUndef' do
|
|
602
|
+
t = not_undef_t
|
|
603
|
+
tc = TypeCalculator.singleton
|
|
604
|
+
undef_t = PUndefType::DEFAULT
|
|
605
|
+
all_types.each do |c|
|
|
606
|
+
t2 = c::DEFAULT
|
|
607
|
+
if tc.assignable?(t2, undef_t)
|
|
608
|
+
expect(t2).not_to be_assignable_to(t)
|
|
609
|
+
else
|
|
610
|
+
expect(t2).to be_assignable_to(t)
|
|
611
|
+
end
|
|
612
|
+
end
|
|
613
|
+
end
|
|
614
|
+
|
|
615
|
+
it 'type NotUndef[T] is assignable from T unless T is assignable from Undef ' do
|
|
616
|
+
tc = TypeCalculator.singleton
|
|
617
|
+
undef_t = PUndefType::DEFAULT
|
|
618
|
+
all_types().select do |c|
|
|
619
|
+
t2 = c::DEFAULT
|
|
620
|
+
not_undef_t = not_undef_t(t2)
|
|
621
|
+
if tc.assignable?(t2, undef_t)
|
|
622
|
+
expect(t2).not_to be_assignable_to(not_undef_t)
|
|
623
|
+
else
|
|
624
|
+
expect(t2).to be_assignable_to(not_undef_t)
|
|
625
|
+
end
|
|
626
|
+
end
|
|
627
|
+
end
|
|
628
|
+
|
|
629
|
+
it 'type T is assignable from NotUndef[T] unless T is assignable from Undef' do
|
|
630
|
+
tc = TypeCalculator.singleton
|
|
631
|
+
undef_t = PUndefType::DEFAULT
|
|
632
|
+
all_types().select do |c|
|
|
633
|
+
t2 = c::DEFAULT
|
|
634
|
+
not_undef_t = not_undef_t(t2)
|
|
635
|
+
unless tc.assignable?(t2, undef_t)
|
|
636
|
+
expect(not_undef_t).to be_assignable_to(t2)
|
|
637
|
+
end
|
|
638
|
+
end
|
|
639
|
+
end
|
|
640
|
+
end
|
|
641
|
+
|
|
642
|
+
context "for TypeReference, such that" do
|
|
643
|
+
it 'no other type is assignable' do
|
|
644
|
+
t = PTypeReferenceType::DEFAULT
|
|
645
|
+
all_instances = (all_types - [
|
|
646
|
+
PTypeReferenceType, # Avoid comparison with t
|
|
647
|
+
PVariantType, # DEFAULT contains no variants, so assignability is never tested and always true
|
|
648
|
+
PTypeAliasType # DEFAULT resolves to PTypeReferenceType::DEFAULT, i.e. t
|
|
649
|
+
]).map {|c| c::DEFAULT }
|
|
650
|
+
|
|
651
|
+
# Add a non-empty variant
|
|
652
|
+
all_instances << variant_t(PAnyType::DEFAULT, PUnitType::DEFAULT)
|
|
653
|
+
# Add a type alias that doesn't resolve to 't'
|
|
654
|
+
all_instances << type_alias_t('MyInt', 'Integer').resolve(TypeParser.new, nil)
|
|
655
|
+
|
|
656
|
+
all_instances.each { |i| expect(i).not_to be_assignable_to(t) }
|
|
578
657
|
end
|
|
579
658
|
|
|
580
|
-
it '
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
659
|
+
it 'a TypeReference to the exact same type is assignable' do
|
|
660
|
+
expect(type_reference_t('Integer[0,10]')).to be_assignable_to(type_reference_t('Integer[0,10]'))
|
|
661
|
+
end
|
|
662
|
+
|
|
663
|
+
it 'a TypeReference to the different type is not assignable' do
|
|
664
|
+
expect(type_reference_t('String')).not_to be_assignable_to(type_reference_t('Integer'))
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
it 'a TypeReference to the different type is not assignable even if the referenced type is' do
|
|
668
|
+
expect(type_reference_t('Integer[1,2]')).not_to be_assignable_to(type_reference_t('Integer[0,3]'))
|
|
584
669
|
end
|
|
585
670
|
end
|
|
586
671
|
|
|
587
|
-
context
|
|
672
|
+
context 'for Data, such that' do
|
|
588
673
|
it 'all scalars + array and hash are assignable to Data' do
|
|
589
|
-
t =
|
|
674
|
+
t = PDataType::DEFAULT
|
|
590
675
|
data_compatible_types.each { |t2|
|
|
591
676
|
expect(type_from_class(t2)).to be_assignable_to(t)
|
|
592
677
|
}
|
|
593
678
|
end
|
|
594
679
|
|
|
595
|
-
it 'a
|
|
596
|
-
t =
|
|
597
|
-
data_compatible_types.each { |t2| expect(
|
|
680
|
+
it 'a scalar, hash, or array is assignable to Data' do
|
|
681
|
+
t = PDataType::DEFAULT
|
|
682
|
+
data_compatible_types.each { |t2| expect(type_from_class(t2)).to be_assignable_to(t) }
|
|
598
683
|
end
|
|
599
684
|
|
|
600
685
|
it 'Data is not assignable to any of its subtypes' do
|
|
601
|
-
t =
|
|
602
|
-
types_to_test = data_compatible_types- [
|
|
686
|
+
t = PDataType::DEFAULT
|
|
687
|
+
types_to_test = data_compatible_types- [PDataType]
|
|
603
688
|
types_to_test.each {|t2| expect(t).not_to be_assignable_to(type_from_class(t2)) }
|
|
604
689
|
end
|
|
605
690
|
|
|
606
|
-
it 'Data is not assignable to a Variant of Data subtype' do
|
|
607
|
-
t = Puppet::Pops::Types::PDataType.new()
|
|
608
|
-
types_to_test = data_compatible_types- [Puppet::Pops::Types::PDataType]
|
|
609
|
-
types_to_test.each { |t2| expect(t).not_to be_assignable_to(variant_t(type_from_class(t2))) }
|
|
610
|
-
end
|
|
611
|
-
|
|
612
691
|
it 'Data is not assignable to any disjunct type' do
|
|
613
|
-
tested_types = all_types - [
|
|
614
|
-
t =
|
|
615
|
-
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2
|
|
692
|
+
tested_types = all_types - [PAnyType, POptionalType, PDataType] - scalar_types
|
|
693
|
+
t = PDataType::DEFAULT
|
|
694
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
|
616
695
|
end
|
|
617
696
|
end
|
|
618
697
|
|
|
@@ -634,102 +713,120 @@ describe 'The type calculator' do
|
|
|
634
713
|
end
|
|
635
714
|
end
|
|
636
715
|
|
|
637
|
-
context
|
|
638
|
-
it
|
|
639
|
-
t =
|
|
640
|
-
scalar_types.each {|t2| expect(t2
|
|
716
|
+
context 'for Scalar, such that' do
|
|
717
|
+
it 'all scalars are assignable to Scalar' do
|
|
718
|
+
t = PScalarType::DEFAULT
|
|
719
|
+
scalar_types.each {|t2| expect(t2::DEFAULT).to be_assignable_to(t) }
|
|
641
720
|
end
|
|
642
721
|
|
|
643
722
|
it 'Scalar is not assignable to any of its subtypes' do
|
|
644
|
-
t =
|
|
645
|
-
types_to_test = scalar_types - [
|
|
646
|
-
types_to_test.each {|t2| expect(t).not_to be_assignable_to(t2
|
|
723
|
+
t = PScalarType::DEFAULT
|
|
724
|
+
types_to_test = scalar_types - [PScalarType]
|
|
725
|
+
types_to_test.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
|
647
726
|
end
|
|
648
727
|
|
|
649
728
|
it 'Scalar is not assignable to any disjunct type' do
|
|
650
|
-
tested_types = all_types - [
|
|
651
|
-
t =
|
|
652
|
-
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2
|
|
729
|
+
tested_types = all_types - [PAnyType, POptionalType, PNotUndefType, PDataType] - scalar_types
|
|
730
|
+
t = PScalarType::DEFAULT
|
|
731
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
|
653
732
|
end
|
|
654
733
|
end
|
|
655
734
|
|
|
656
|
-
context
|
|
657
|
-
it
|
|
658
|
-
t =
|
|
659
|
-
numeric_types.each {|t2| expect(t2
|
|
735
|
+
context 'for Numeric, such that' do
|
|
736
|
+
it 'all numerics are assignable to Numeric' do
|
|
737
|
+
t = PNumericType::DEFAULT
|
|
738
|
+
numeric_types.each {|t2| expect(t2::DEFAULT).to be_assignable_to(t) }
|
|
660
739
|
end
|
|
661
740
|
|
|
662
741
|
it 'Numeric is not assignable to any of its subtypes' do
|
|
663
|
-
t =
|
|
664
|
-
types_to_test = numeric_types - [
|
|
665
|
-
types_to_test.each {|t2| expect(t).not_to be_assignable_to(t2
|
|
742
|
+
t = PNumericType::DEFAULT
|
|
743
|
+
types_to_test = numeric_types - [PNumericType]
|
|
744
|
+
types_to_test.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
|
666
745
|
end
|
|
667
746
|
|
|
668
747
|
it 'Numeric is not assignable to any disjunct type' do
|
|
669
748
|
tested_types = all_types - [
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
749
|
+
PAnyType,
|
|
750
|
+
POptionalType,
|
|
751
|
+
PNotUndefType,
|
|
752
|
+
PDataType,
|
|
753
|
+
PScalarType,
|
|
673
754
|
] - numeric_types
|
|
674
|
-
t =
|
|
675
|
-
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2
|
|
755
|
+
t = PNumericType::DEFAULT
|
|
756
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
|
676
757
|
end
|
|
677
758
|
end
|
|
678
759
|
|
|
679
|
-
context
|
|
680
|
-
it
|
|
681
|
-
t =
|
|
682
|
-
collection_types.each {|t2| expect(t2
|
|
760
|
+
context 'for Collection, such that' do
|
|
761
|
+
it 'all collections are assignable to Collection' do
|
|
762
|
+
t = PCollectionType::DEFAULT
|
|
763
|
+
collection_types.each {|t2| expect(t2::DEFAULT).to be_assignable_to(t) }
|
|
683
764
|
end
|
|
684
765
|
|
|
685
766
|
it 'Collection is not assignable to any of its subtypes' do
|
|
686
|
-
t =
|
|
687
|
-
types_to_test = collection_types - [
|
|
688
|
-
types_to_test.each {|t2| expect(t).not_to be_assignable_to(t2
|
|
767
|
+
t = PCollectionType::DEFAULT
|
|
768
|
+
types_to_test = collection_types - [PCollectionType]
|
|
769
|
+
types_to_test.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
|
689
770
|
end
|
|
690
771
|
|
|
691
772
|
it 'Collection is not assignable to any disjunct type' do
|
|
692
|
-
tested_types = all_types - [
|
|
693
|
-
|
|
694
|
-
|
|
773
|
+
tested_types = all_types - [
|
|
774
|
+
PAnyType,
|
|
775
|
+
POptionalType,
|
|
776
|
+
PNotUndefType,
|
|
777
|
+
PIterableType] - collection_types
|
|
778
|
+
t = PCollectionType::DEFAULT
|
|
779
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
|
695
780
|
end
|
|
696
781
|
end
|
|
697
782
|
|
|
698
|
-
context
|
|
699
|
-
it
|
|
700
|
-
t =
|
|
783
|
+
context 'for Array, such that' do
|
|
784
|
+
it 'Array is not assignable to non Array based Collection type' do
|
|
785
|
+
t = PArrayType::DEFAULT
|
|
701
786
|
tested_types = collection_types - [
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
787
|
+
PCollectionType,
|
|
788
|
+
PNotUndefType,
|
|
789
|
+
PArrayType,
|
|
790
|
+
PTupleType]
|
|
791
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
|
706
792
|
end
|
|
707
793
|
|
|
708
794
|
it 'Array is not assignable to any disjunct type' do
|
|
709
795
|
tested_types = all_types - [
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
796
|
+
PAnyType,
|
|
797
|
+
POptionalType,
|
|
798
|
+
PNotUndefType,
|
|
799
|
+
PIterableType,
|
|
800
|
+
PDataType] - collection_types
|
|
801
|
+
t = PArrayType::DEFAULT
|
|
802
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
|
803
|
+
end
|
|
804
|
+
|
|
805
|
+
it 'Empty Array is assignable to an array that accepts 0 entries' do
|
|
806
|
+
expect(empty_array_t).to be_assignable_to(array_t(string_t))
|
|
807
|
+
expect(empty_array_t).to be_assignable_to(array_t(integer_t))
|
|
714
808
|
end
|
|
715
809
|
end
|
|
716
810
|
|
|
717
|
-
context
|
|
718
|
-
it
|
|
719
|
-
t =
|
|
811
|
+
context 'for Hash, such that' do
|
|
812
|
+
it 'Hash is not assignable to any other Collection type' do
|
|
813
|
+
t = PHashType::DEFAULT
|
|
720
814
|
tested_types = collection_types - [
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2
|
|
815
|
+
PCollectionType,
|
|
816
|
+
PStructType,
|
|
817
|
+
PHashType]
|
|
818
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
|
725
819
|
end
|
|
726
820
|
|
|
727
821
|
it 'Hash is not assignable to any disjunct type' do
|
|
728
822
|
tested_types = all_types - [
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
823
|
+
PAnyType,
|
|
824
|
+
POptionalType,
|
|
825
|
+
PNotUndefType,
|
|
826
|
+
PIterableType,
|
|
827
|
+
PDataType] - collection_types
|
|
828
|
+
t = PHashType::DEFAULT
|
|
829
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
|
733
830
|
end
|
|
734
831
|
|
|
735
832
|
it 'Struct is assignable to Hash with Pattern that matches all keys' do
|
|
@@ -749,68 +846,131 @@ describe 'The type calculator' do
|
|
|
749
846
|
end
|
|
750
847
|
end
|
|
751
848
|
|
|
752
|
-
context
|
|
753
|
-
it
|
|
754
|
-
t =
|
|
849
|
+
context 'for Tuple, such that' do
|
|
850
|
+
it 'Tuple is not assignable to any other non Array based Collection type' do
|
|
851
|
+
t = PTupleType::DEFAULT
|
|
755
852
|
tested_types = collection_types - [
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2
|
|
853
|
+
PCollectionType,
|
|
854
|
+
PTupleType,
|
|
855
|
+
PArrayType]
|
|
856
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
|
857
|
+
end
|
|
858
|
+
|
|
859
|
+
it 'A tuple with parameters is assignable to the default Tuple' do
|
|
860
|
+
t = Puppet::Pops::Types::PTupleType::DEFAULT
|
|
861
|
+
t2 = Puppet::Pops::Types::PTupleType.new([Puppet::Pops::Types::PStringType::DEFAULT])
|
|
862
|
+
expect(t2).to be_assignable_to(t)
|
|
760
863
|
end
|
|
761
864
|
|
|
762
865
|
it 'Tuple is not assignable to any disjunct type' do
|
|
763
866
|
tested_types = all_types - [
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
867
|
+
PAnyType,
|
|
868
|
+
POptionalType,
|
|
869
|
+
PNotUndefType,
|
|
870
|
+
PIterableType,
|
|
871
|
+
PDataType] - collection_types
|
|
872
|
+
t = PTupleType::DEFAULT
|
|
873
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
|
768
874
|
end
|
|
769
875
|
end
|
|
770
876
|
|
|
771
|
-
context
|
|
772
|
-
it
|
|
773
|
-
t =
|
|
877
|
+
context 'for Struct, such that' do
|
|
878
|
+
it 'Struct is not assignable to any other non Hashed based Collection type' do
|
|
879
|
+
t = PStructType::DEFAULT
|
|
774
880
|
tested_types = collection_types - [
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2
|
|
881
|
+
PCollectionType,
|
|
882
|
+
PStructType,
|
|
883
|
+
PHashType]
|
|
884
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
|
779
885
|
end
|
|
780
886
|
|
|
781
887
|
it 'Struct is not assignable to any disjunct type' do
|
|
782
888
|
tested_types = all_types - [
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
889
|
+
PAnyType,
|
|
890
|
+
POptionalType,
|
|
891
|
+
PNotUndefType,
|
|
892
|
+
PIterableType,
|
|
893
|
+
PDataType] - collection_types
|
|
894
|
+
t = PStructType::DEFAULT
|
|
895
|
+
tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
|
|
896
|
+
end
|
|
897
|
+
|
|
898
|
+
it 'Default key optionality is controlled by value assignability to undef' do
|
|
899
|
+
t1 = struct_t({'member' => string_t})
|
|
900
|
+
expect(t1.elements[0].key_type).to eq(string_t('member'))
|
|
901
|
+
t1 = struct_t({'member' => object_t})
|
|
902
|
+
expect(t1.elements[0].key_type).to eq(optional_t(string_t('member')))
|
|
903
|
+
end
|
|
904
|
+
|
|
905
|
+
it "NotUndef['key'] becomes String['key'] (since its implied that String is required)" do
|
|
906
|
+
t1 = struct_t({not_undef_t('member') => string_t})
|
|
907
|
+
expect(t1.elements[0].key_type).to eq(string_t('member'))
|
|
908
|
+
end
|
|
909
|
+
|
|
910
|
+
it "Optional['key'] becomes Optional[String['key']]" do
|
|
911
|
+
t1 = struct_t({optional_t('member') => string_t})
|
|
912
|
+
expect(t1.elements[0].key_type).to eq(optional_t(string_t('member')))
|
|
913
|
+
end
|
|
914
|
+
|
|
915
|
+
it 'Optional members are not required' do
|
|
916
|
+
t1 = struct_t({optional_t('optional_member') => string_t, not_undef_t('other_member') => string_t})
|
|
917
|
+
t2 = struct_t({not_undef_t('other_member') => string_t})
|
|
918
|
+
expect(t2).to be_assignable_to(t1)
|
|
919
|
+
end
|
|
920
|
+
|
|
921
|
+
it 'Required members not optional even when value is' do
|
|
922
|
+
t1 = struct_t({not_undef_t('required_member') => object_t, not_undef_t('other_member') => string_t})
|
|
923
|
+
t2 = struct_t({not_undef_t('other_member') => string_t})
|
|
924
|
+
expect(t2).not_to be_assignable_to(t1)
|
|
925
|
+
end
|
|
926
|
+
|
|
927
|
+
it 'A hash of string is not assignable to struct with integer value' do
|
|
928
|
+
t1 = struct_t({'foo' => integer_t, 'bar' => string_t})
|
|
929
|
+
t2 = hash_t(string_t, string_t, range_t(2, 2))
|
|
930
|
+
expect(t1.assignable?(t2)).to eql(false)
|
|
931
|
+
end
|
|
932
|
+
|
|
933
|
+
it 'A hash of with integer key is not assignable to struct with string key' do
|
|
934
|
+
t1 = struct_t({'foo' => string_t, 'bar' => string_t})
|
|
935
|
+
t2 = hash_t(integer_t, string_t, range_t(2, 2))
|
|
936
|
+
expect(t1.assignable?(t2)).to eql(false)
|
|
787
937
|
end
|
|
788
938
|
end
|
|
789
939
|
|
|
790
|
-
context
|
|
791
|
-
it
|
|
792
|
-
t =
|
|
940
|
+
context 'for Callable, such that' do
|
|
941
|
+
it 'Callable is not assignable to any disjunct type' do
|
|
942
|
+
t = PCallableType::DEFAULT
|
|
793
943
|
tested_types = all_types - [
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
944
|
+
PCallableType,
|
|
945
|
+
PAnyType,
|
|
946
|
+
POptionalType,
|
|
947
|
+
PNotUndefType]
|
|
948
|
+
tested_types.each {|t2| expect(t).to_not be_assignable_to(t2::DEFAULT) }
|
|
949
|
+
end
|
|
950
|
+
|
|
951
|
+
it 'a callable with parameter is assignable to the default callable' do
|
|
952
|
+
expect(callable_t(string_t)).to be_assignable_to(Puppet::Pops::Types::PCallableType::DEFAULT)
|
|
953
|
+
end
|
|
954
|
+
|
|
955
|
+
it 'the default callable is not assignable to a callable with parameter' do
|
|
956
|
+
expect(Puppet::Pops::Types::PCallableType::DEFAULT).not_to be_assignable_to(callable_t(string_t))
|
|
797
957
|
end
|
|
798
958
|
end
|
|
799
959
|
|
|
800
960
|
it 'should recognize mapped ruby types' do
|
|
801
|
-
{ Integer =>
|
|
802
|
-
Fixnum =>
|
|
803
|
-
Bignum =>
|
|
804
|
-
Float =>
|
|
805
|
-
Numeric =>
|
|
806
|
-
NilClass =>
|
|
807
|
-
TrueClass =>
|
|
808
|
-
FalseClass =>
|
|
809
|
-
String =>
|
|
810
|
-
Regexp =>
|
|
811
|
-
Regexp =>
|
|
812
|
-
Array =>
|
|
813
|
-
Hash =>
|
|
961
|
+
{ Integer => PIntegerType::DEFAULT,
|
|
962
|
+
Fixnum => PIntegerType::DEFAULT,
|
|
963
|
+
Bignum => PIntegerType::DEFAULT,
|
|
964
|
+
Float => PFloatType::DEFAULT,
|
|
965
|
+
Numeric => PNumericType::DEFAULT,
|
|
966
|
+
NilClass => PUndefType::DEFAULT,
|
|
967
|
+
TrueClass => PBooleanType::DEFAULT,
|
|
968
|
+
FalseClass => PBooleanType::DEFAULT,
|
|
969
|
+
String => PStringType::DEFAULT,
|
|
970
|
+
Regexp => PRegexpType::DEFAULT,
|
|
971
|
+
Regexp => PRegexpType::DEFAULT,
|
|
972
|
+
Array => TypeFactory.array_of_data,
|
|
973
|
+
Hash => TypeFactory.hash_of_data
|
|
814
974
|
}.each do |ruby_type, puppet_type |
|
|
815
975
|
expect(ruby_type).to be_assignable_to(puppet_type)
|
|
816
976
|
end
|
|
@@ -821,35 +981,18 @@ describe 'The type calculator' do
|
|
|
821
981
|
expect(calculator.assignable?(range_t(2,5), range_t(2,5))).to eq(true)
|
|
822
982
|
end
|
|
823
983
|
|
|
824
|
-
it 'should accept an equal reverse range' do
|
|
825
|
-
expect(calculator.assignable?(range_t(2,5), range_t(5,2))).to eq(true)
|
|
826
|
-
end
|
|
827
|
-
|
|
828
984
|
it 'should accept a narrower range' do
|
|
829
985
|
expect(calculator.assignable?(range_t(2,10), range_t(3,5))).to eq(true)
|
|
830
986
|
end
|
|
831
987
|
|
|
832
|
-
it 'should accept a narrower reverse range' do
|
|
833
|
-
expect(calculator.assignable?(range_t(2,10), range_t(5,3))).to eq(true)
|
|
834
|
-
end
|
|
835
|
-
|
|
836
988
|
it 'should reject a wider range' do
|
|
837
989
|
expect(calculator.assignable?(range_t(3,5), range_t(2,10))).to eq(false)
|
|
838
990
|
end
|
|
839
991
|
|
|
840
|
-
it 'should reject a wider reverse range' do
|
|
841
|
-
expect(calculator.assignable?(range_t(3,5), range_t(10,2))).to eq(false)
|
|
842
|
-
end
|
|
843
|
-
|
|
844
992
|
it 'should reject a partially overlapping range' do
|
|
845
993
|
expect(calculator.assignable?(range_t(3,5), range_t(2,4))).to eq(false)
|
|
846
994
|
expect(calculator.assignable?(range_t(3,5), range_t(4,6))).to eq(false)
|
|
847
995
|
end
|
|
848
|
-
|
|
849
|
-
it 'should reject a partially overlapping reverse range' do
|
|
850
|
-
expect(calculator.assignable?(range_t(3,5), range_t(4,2))).to eq(false)
|
|
851
|
-
expect(calculator.assignable?(range_t(3,5), range_t(6,4))).to eq(false)
|
|
852
|
-
end
|
|
853
996
|
end
|
|
854
997
|
|
|
855
998
|
context 'when dealing with patterns' do
|
|
@@ -913,18 +1056,18 @@ describe 'The type calculator' do
|
|
|
913
1056
|
end
|
|
914
1057
|
|
|
915
1058
|
it 'pattern representing all patterns should accept any pattern' do
|
|
916
|
-
expect(calculator.assignable?(pattern_t
|
|
917
|
-
expect(calculator.assignable?(pattern_t
|
|
1059
|
+
expect(calculator.assignable?(pattern_t, pattern_t('a'))).to eq(true)
|
|
1060
|
+
expect(calculator.assignable?(pattern_t, pattern_t)).to eq(true)
|
|
918
1061
|
end
|
|
919
1062
|
|
|
920
1063
|
it 'pattern representing all patterns should accept any enum' do
|
|
921
|
-
expect(calculator.assignable?(pattern_t
|
|
922
|
-
expect(calculator.assignable?(pattern_t
|
|
1064
|
+
expect(calculator.assignable?(pattern_t, enum_t('a'))).to eq(true)
|
|
1065
|
+
expect(calculator.assignable?(pattern_t, enum_t)).to eq(true)
|
|
923
1066
|
end
|
|
924
1067
|
|
|
925
1068
|
it 'pattern representing all patterns should accept any string' do
|
|
926
|
-
expect(calculator.assignable?(pattern_t
|
|
927
|
-
expect(calculator.assignable?(pattern_t
|
|
1069
|
+
expect(calculator.assignable?(pattern_t, string_t('a'))).to eq(true)
|
|
1070
|
+
expect(calculator.assignable?(pattern_t, string_t)).to eq(true)
|
|
928
1071
|
end
|
|
929
1072
|
|
|
930
1073
|
end
|
|
@@ -943,8 +1086,8 @@ describe 'The type calculator' do
|
|
|
943
1086
|
end
|
|
944
1087
|
|
|
945
1088
|
it 'non parameterized enum accepts any other enum but not the reverse' do
|
|
946
|
-
expect(calculator.assignable?(enum_t
|
|
947
|
-
expect(calculator.assignable?(enum_t('a'), enum_t
|
|
1089
|
+
expect(calculator.assignable?(enum_t, enum_t('a'))).to eq(true)
|
|
1090
|
+
expect(calculator.assignable?(enum_t('a'), enum_t)).to eq(false)
|
|
948
1091
|
end
|
|
949
1092
|
|
|
950
1093
|
it 'enum should accept a variant where all variants are acceptable' do
|
|
@@ -955,54 +1098,53 @@ describe 'The type calculator' do
|
|
|
955
1098
|
|
|
956
1099
|
context 'when dealing with string and enum combinations' do
|
|
957
1100
|
it 'should accept assigning any enum to unrestricted string' do
|
|
958
|
-
expect(calculator.assignable?(string_t
|
|
959
|
-
expect(calculator.assignable?(string_t
|
|
1101
|
+
expect(calculator.assignable?(string_t, enum_t('blue'))).to eq(true)
|
|
1102
|
+
expect(calculator.assignable?(string_t, enum_t('blue', 'red'))).to eq(true)
|
|
960
1103
|
end
|
|
961
1104
|
|
|
962
1105
|
it 'should not accept assigning longer enum value to size restricted string' do
|
|
963
|
-
expect(calculator.assignable?(
|
|
1106
|
+
expect(calculator.assignable?(constrained_string_t(range_t(2,2)), enum_t('a','blue'))).to eq(false)
|
|
964
1107
|
end
|
|
965
1108
|
|
|
966
1109
|
it 'should accept assigning any string to empty enum' do
|
|
967
|
-
expect(calculator.assignable?(enum_t
|
|
1110
|
+
expect(calculator.assignable?(enum_t, string_t)).to eq(true)
|
|
968
1111
|
end
|
|
969
1112
|
|
|
970
1113
|
it 'should accept assigning empty enum to any string' do
|
|
971
|
-
expect(calculator.assignable?(string_t
|
|
1114
|
+
expect(calculator.assignable?(string_t, enum_t)).to eq(true)
|
|
972
1115
|
end
|
|
973
1116
|
|
|
974
1117
|
it 'should not accept assigning empty enum to size constrained string' do
|
|
975
|
-
expect(calculator.assignable?(
|
|
1118
|
+
expect(calculator.assignable?(constrained_string_t(range_t(2,2)), enum_t)).to eq(false)
|
|
976
1119
|
end
|
|
977
1120
|
end
|
|
978
1121
|
|
|
979
1122
|
context 'when dealing with string/pattern/enum combinations' do
|
|
980
1123
|
it 'any string is equal to any enum is equal to any pattern' do
|
|
981
|
-
expect(calculator.assignable?(string_t
|
|
982
|
-
expect(calculator.assignable?(string_t
|
|
983
|
-
expect(calculator.assignable?(enum_t
|
|
984
|
-
expect(calculator.assignable?(enum_t
|
|
985
|
-
expect(calculator.assignable?(pattern_t
|
|
986
|
-
expect(calculator.assignable?(pattern_t
|
|
1124
|
+
expect(calculator.assignable?(string_t, enum_t)).to eq(true)
|
|
1125
|
+
expect(calculator.assignable?(string_t, pattern_t)).to eq(true)
|
|
1126
|
+
expect(calculator.assignable?(enum_t, string_t)).to eq(true)
|
|
1127
|
+
expect(calculator.assignable?(enum_t, pattern_t)).to eq(true)
|
|
1128
|
+
expect(calculator.assignable?(pattern_t, string_t)).to eq(true)
|
|
1129
|
+
expect(calculator.assignable?(pattern_t, enum_t)).to eq(true)
|
|
987
1130
|
end
|
|
988
1131
|
end
|
|
989
1132
|
|
|
990
1133
|
context 'when dealing with tuples' do
|
|
991
1134
|
it 'matches empty tuples' do
|
|
992
|
-
tuple1 = tuple_t
|
|
993
|
-
tuple2 = tuple_t
|
|
1135
|
+
tuple1 = tuple_t
|
|
1136
|
+
tuple2 = tuple_t
|
|
994
1137
|
|
|
995
1138
|
expect(calculator.assignable?(tuple1, tuple2)).to eq(true)
|
|
996
1139
|
expect(calculator.assignable?(tuple2, tuple1)).to eq(true)
|
|
997
1140
|
end
|
|
998
1141
|
|
|
999
1142
|
it 'accepts an empty tuple as assignable to a tuple with a min size of 0' do
|
|
1000
|
-
tuple1 =
|
|
1001
|
-
factory.constrain_size(tuple1, 0, :default)
|
|
1143
|
+
tuple1 = constrained_tuple_t(range_t(0, :default))
|
|
1002
1144
|
tuple2 = tuple_t()
|
|
1003
1145
|
|
|
1004
1146
|
expect(calculator.assignable?(tuple1, tuple2)).to eq(true)
|
|
1005
|
-
expect(calculator.assignable?(tuple2, tuple1)).to eq(
|
|
1147
|
+
expect(calculator.assignable?(tuple2, tuple1)).to eq(true)
|
|
1006
1148
|
end
|
|
1007
1149
|
|
|
1008
1150
|
it 'should accept matching tuples' do
|
|
@@ -1020,62 +1162,51 @@ describe 'The type calculator' do
|
|
|
1020
1162
|
end
|
|
1021
1163
|
|
|
1022
1164
|
it 'should accept ranged tuples' do
|
|
1023
|
-
tuple1 =
|
|
1024
|
-
factory.constrain_size(tuple1, 5, 5)
|
|
1165
|
+
tuple1 = constrained_tuple_t(range_t(5,5), 1)
|
|
1025
1166
|
tuple2 = tuple_t(Integer,Integer, Integer, Integer, Integer)
|
|
1026
1167
|
expect(calculator.assignable?(tuple1, tuple2)).to eq(true)
|
|
1027
1168
|
expect(calculator.assignable?(tuple2, tuple1)).to eq(true)
|
|
1028
1169
|
end
|
|
1029
1170
|
|
|
1030
1171
|
it 'should reject ranged tuples when ranges does not match' do
|
|
1031
|
-
tuple1 =
|
|
1032
|
-
factory.constrain_size(tuple1, 4, 5)
|
|
1172
|
+
tuple1 = constrained_tuple_t(range_t(4, 5), 1)
|
|
1033
1173
|
tuple2 = tuple_t(Integer,Integer, Integer, Integer, Integer)
|
|
1034
1174
|
expect(calculator.assignable?(tuple1, tuple2)).to eq(true)
|
|
1035
1175
|
expect(calculator.assignable?(tuple2, tuple1)).to eq(false)
|
|
1036
1176
|
end
|
|
1037
1177
|
|
|
1038
1178
|
it 'should reject ranged tuples when ranges does not match (using infinite upper bound)' do
|
|
1039
|
-
tuple1 =
|
|
1040
|
-
factory.constrain_size(tuple1, 4, :default)
|
|
1179
|
+
tuple1 = constrained_tuple_t(range_t(4, :default), 1)
|
|
1041
1180
|
tuple2 = tuple_t(Integer,Integer, Integer, Integer, Integer)
|
|
1042
1181
|
expect(calculator.assignable?(tuple1, tuple2)).to eq(true)
|
|
1043
1182
|
expect(calculator.assignable?(tuple2, tuple1)).to eq(false)
|
|
1044
1183
|
end
|
|
1045
1184
|
|
|
1046
1185
|
it 'should accept matching tuples with optional entries by repeating last' do
|
|
1047
|
-
tuple1 =
|
|
1048
|
-
|
|
1049
|
-
tuple2 = tuple_t(Numeric,Numeric)
|
|
1050
|
-
factory.constrain_size(tuple2, 0, :default)
|
|
1186
|
+
tuple1 = constrained_tuple_t(range_t(0, :default), 1,2)
|
|
1187
|
+
tuple2 = constrained_tuple_t(range_t(0, :default), Numeric,Numeric)
|
|
1051
1188
|
expect(calculator.assignable?(tuple1, tuple2)).to eq(false)
|
|
1052
1189
|
expect(calculator.assignable?(tuple2, tuple1)).to eq(true)
|
|
1053
1190
|
end
|
|
1054
1191
|
|
|
1055
1192
|
it 'should accept matching tuples with optional entries' do
|
|
1056
|
-
tuple1 =
|
|
1057
|
-
|
|
1058
|
-
array2 = factory.constrain_size(array_t(Integer),2,2)
|
|
1193
|
+
tuple1 = constrained_tuple_t(range_t(1, 3), Integer, Integer, String)
|
|
1194
|
+
array2 = array_t(Integer, range_t(2,2))
|
|
1059
1195
|
expect(calculator.assignable?(tuple1, array2)).to eq(true)
|
|
1060
|
-
|
|
1196
|
+
tuple1 = constrained_tuple_t(range_t(3, 3), tuple1.types)
|
|
1061
1197
|
expect(calculator.assignable?(tuple1, array2)).to eq(false)
|
|
1062
1198
|
end
|
|
1063
1199
|
|
|
1064
1200
|
it 'should accept matching array' do
|
|
1065
1201
|
tuple1 = tuple_t(1,2)
|
|
1066
|
-
array = array_t(Integer)
|
|
1067
|
-
factory.constrain_size(array, 2, 2)
|
|
1202
|
+
array = array_t(Integer, range_t(2, 2))
|
|
1068
1203
|
expect(calculator.assignable?(tuple1, array)).to eq(true)
|
|
1069
1204
|
expect(calculator.assignable?(array, tuple1)).to eq(true)
|
|
1070
1205
|
end
|
|
1071
1206
|
|
|
1072
1207
|
it 'should accept empty array when tuple allows min of 0' do
|
|
1073
|
-
tuple1 =
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
array = array_t(Integer)
|
|
1077
|
-
factory.constrain_size(array, 0, 0)
|
|
1078
|
-
|
|
1208
|
+
tuple1 = constrained_tuple_t(range_t(0, 1), Integer)
|
|
1209
|
+
array = array_t(unit_t, range_t(0, 0))
|
|
1079
1210
|
expect(calculator.assignable?(tuple1, array)).to eq(true)
|
|
1080
1211
|
expect(calculator.assignable?(array, tuple1)).to eq(false)
|
|
1081
1212
|
end
|
|
@@ -1122,18 +1253,15 @@ describe 'The type calculator' do
|
|
|
1122
1253
|
|
|
1123
1254
|
it 'should accept matching hash' do
|
|
1124
1255
|
struct1 = struct_t({'a'=>Integer, 'b'=>Integer})
|
|
1125
|
-
non_empty_string =
|
|
1126
|
-
|
|
1127
|
-
hsh = hash_t(non_empty_string, Integer)
|
|
1128
|
-
factory.constrain_size(hsh, 2, 2)
|
|
1256
|
+
non_empty_string = constrained_string_t(range_t(1, nil))
|
|
1257
|
+
hsh = hash_t(non_empty_string, Integer, range_t(2,2))
|
|
1129
1258
|
expect(calculator.assignable?(struct1, hsh)).to eq(true)
|
|
1130
1259
|
expect(calculator.assignable?(hsh, struct1)).to eq(true)
|
|
1131
1260
|
end
|
|
1132
1261
|
|
|
1133
|
-
it 'should accept empty hash with key_type
|
|
1262
|
+
it 'should accept empty hash with key_type unit' do
|
|
1134
1263
|
struct1 = struct_t({'a'=>optional_t(Integer)})
|
|
1135
|
-
hsh = hash_t(
|
|
1136
|
-
factory.constrain_size(hsh, 0, 0)
|
|
1264
|
+
hsh = hash_t(unit_t, unit_t, range_t(0, 0))
|
|
1137
1265
|
expect(calculator.assignable?(struct1, hsh)).to eq(true)
|
|
1138
1266
|
end
|
|
1139
1267
|
end
|
|
@@ -1158,107 +1286,232 @@ describe 'The type calculator' do
|
|
|
1158
1286
|
expect(calculator.assignable?(Bar, fooType)).to eq(false)
|
|
1159
1287
|
end
|
|
1160
1288
|
|
|
1161
|
-
it
|
|
1162
|
-
hc1 =
|
|
1163
|
-
hc2 =
|
|
1289
|
+
it 'should allow host class with same name' do
|
|
1290
|
+
hc1 = TypeFactory.host_class('the_name')
|
|
1291
|
+
hc2 = TypeFactory.host_class('the_name')
|
|
1164
1292
|
expect(calculator.assignable?(hc1, hc2)).to eq(true)
|
|
1165
1293
|
end
|
|
1166
1294
|
|
|
1167
|
-
it
|
|
1168
|
-
hc1 =
|
|
1169
|
-
hc2 =
|
|
1295
|
+
it 'should allow host class with name assigned to hostclass without name' do
|
|
1296
|
+
hc1 = TypeFactory.host_class
|
|
1297
|
+
hc2 = TypeFactory.host_class('the_name')
|
|
1170
1298
|
expect(calculator.assignable?(hc1, hc2)).to eq(true)
|
|
1171
1299
|
end
|
|
1172
1300
|
|
|
1173
|
-
it
|
|
1174
|
-
hc1 =
|
|
1175
|
-
hc2 =
|
|
1301
|
+
it 'should reject host classes with different names' do
|
|
1302
|
+
hc1 = TypeFactory.host_class('the_name')
|
|
1303
|
+
hc2 = TypeFactory.host_class('another_name')
|
|
1176
1304
|
expect(calculator.assignable?(hc1, hc2)).to eq(false)
|
|
1177
1305
|
end
|
|
1178
1306
|
|
|
1179
|
-
it
|
|
1180
|
-
hc1 =
|
|
1181
|
-
hc2 =
|
|
1307
|
+
it 'should reject host classes without name assigned to host class with name' do
|
|
1308
|
+
hc1 = TypeFactory.host_class('the_name')
|
|
1309
|
+
hc2 = TypeFactory.host_class
|
|
1182
1310
|
expect(calculator.assignable?(hc1, hc2)).to eq(false)
|
|
1183
1311
|
end
|
|
1184
1312
|
|
|
1185
|
-
it
|
|
1186
|
-
r1 =
|
|
1187
|
-
r2 =
|
|
1313
|
+
it 'should allow resource with same type_name and title' do
|
|
1314
|
+
r1 = TypeFactory.resource('file', 'foo')
|
|
1315
|
+
r2 = TypeFactory.resource('file', 'foo')
|
|
1188
1316
|
expect(calculator.assignable?(r1, r2)).to eq(true)
|
|
1189
1317
|
end
|
|
1190
1318
|
|
|
1191
|
-
it
|
|
1192
|
-
r1 =
|
|
1193
|
-
r2 =
|
|
1319
|
+
it 'should allow more specific resource assignment' do
|
|
1320
|
+
r1 = TypeFactory.resource
|
|
1321
|
+
r2 = TypeFactory.resource('file')
|
|
1194
1322
|
expect(calculator.assignable?(r1, r2)).to eq(true)
|
|
1195
|
-
r2 =
|
|
1323
|
+
r2 = TypeFactory.resource('file', '/tmp/foo')
|
|
1196
1324
|
expect(calculator.assignable?(r1, r2)).to eq(true)
|
|
1197
|
-
r1 =
|
|
1325
|
+
r1 = TypeFactory.resource('file')
|
|
1198
1326
|
expect(calculator.assignable?(r1, r2)).to eq(true)
|
|
1199
1327
|
end
|
|
1200
1328
|
|
|
1201
|
-
it
|
|
1202
|
-
r1 =
|
|
1203
|
-
r2 =
|
|
1329
|
+
it 'should reject less specific resource assignment' do
|
|
1330
|
+
r1 = TypeFactory.resource('file', '/tmp/foo')
|
|
1331
|
+
r2 = TypeFactory.resource('file')
|
|
1204
1332
|
expect(calculator.assignable?(r1, r2)).to eq(false)
|
|
1205
|
-
r2 =
|
|
1333
|
+
r2 = TypeFactory.resource
|
|
1206
1334
|
expect(calculator.assignable?(r1, r2)).to eq(false)
|
|
1207
1335
|
end
|
|
1208
1336
|
|
|
1337
|
+
context 'for TypeAlias, such that' do
|
|
1338
|
+
let!(:parser) { TypeParser.new }
|
|
1339
|
+
|
|
1340
|
+
it 'it is assignable to the type that it is an alias for' do
|
|
1341
|
+
t = type_alias_t('Alias', 'Integer').resolve(parser, nil)
|
|
1342
|
+
expect(calculator.assignable?(integer_t, t)).to be_truthy
|
|
1343
|
+
end
|
|
1344
|
+
|
|
1345
|
+
it 'the type that it is an alias for is assignable to it' do
|
|
1346
|
+
t = type_alias_t('Alias', 'Integer').resolve(parser, nil)
|
|
1347
|
+
expect(calculator.assignable?(t, integer_t)).to be_truthy
|
|
1348
|
+
end
|
|
1349
|
+
|
|
1350
|
+
it 'a recursive alias can be assignable from a conformant type with any depth' do
|
|
1351
|
+
scope = Object.new
|
|
1352
|
+
|
|
1353
|
+
t = type_alias_t('Tree', 'Hash[String,Variant[String,Tree]]')
|
|
1354
|
+
loader = Object.new
|
|
1355
|
+
loader.expects(:load).with(:type, 'tree').returns t
|
|
1356
|
+
|
|
1357
|
+
Adapters::LoaderAdapter.expects(:loader_for_model_object).with(instance_of(Model::QualifiedReference), scope).at_most_once.returns loader
|
|
1358
|
+
|
|
1359
|
+
t.resolve(parser, scope)
|
|
1360
|
+
expect(calculator.assignable?(t, parser.parse('Hash[String,Variant[String,Hash[String,Variant[String,String]]]]'))).to be_truthy
|
|
1361
|
+
end
|
|
1362
|
+
|
|
1363
|
+
|
|
1364
|
+
it 'similar recursive aliases are assignable' do
|
|
1365
|
+
scope = Object.new
|
|
1366
|
+
|
|
1367
|
+
t1 = type_alias_t('Tree1', 'Hash[String,Variant[String,Tree1]]')
|
|
1368
|
+
t2 = type_alias_t('Tree2', 'Hash[String,Variant[String,Tree2]]')
|
|
1369
|
+
loader = Object.new
|
|
1370
|
+
loader.expects(:load).with(:type, 'tree1').returns t1
|
|
1371
|
+
loader.expects(:load).with(:type, 'tree2').returns t2
|
|
1372
|
+
|
|
1373
|
+
Adapters::LoaderAdapter.expects(:loader_for_model_object).with(instance_of(Model::QualifiedReference), scope).at_least_once.returns loader
|
|
1374
|
+
|
|
1375
|
+
t1.resolve(parser, scope)
|
|
1376
|
+
t2.resolve(parser, scope)
|
|
1377
|
+
expect(calculator.assignable?(t1, t2)).to be_truthy
|
|
1378
|
+
end
|
|
1379
|
+
|
|
1380
|
+
it 'crossing recursive aliases are assignable' do
|
|
1381
|
+
scope = Object.new
|
|
1382
|
+
|
|
1383
|
+
t1 = type_alias_t('Tree1', 'Hash[String,Variant[String,Tree2]]')
|
|
1384
|
+
t2 = type_alias_t('Tree2', 'Hash[String,Variant[String,Tree1]]')
|
|
1385
|
+
loader = Object.new
|
|
1386
|
+
loader.expects(:load).with(:type, 'tree1').returns t1
|
|
1387
|
+
loader.expects(:load).with(:type, 'tree2').returns t2
|
|
1388
|
+
loader.expects(:is_a?).with(Loader::Loader).returns true
|
|
1389
|
+
|
|
1390
|
+
Adapters::LoaderAdapter.expects(:loader_for_model_object).with(instance_of(Model::QualifiedReference), scope).at_least_once.returns loader
|
|
1391
|
+
|
|
1392
|
+
t1.resolve(parser, scope)
|
|
1393
|
+
t2.resolve(parser, scope)
|
|
1394
|
+
expect(calculator.assignable?(t1, t2)).to be_truthy
|
|
1395
|
+
end
|
|
1396
|
+
|
|
1397
|
+
it 'Type[T] is assignable to Type[AT] when AT is an alias for T' do
|
|
1398
|
+
scope = Object.new
|
|
1399
|
+
|
|
1400
|
+
ta = type_alias_t('PositiveInteger', 'Integer[0,default]')
|
|
1401
|
+
loader = Object.new
|
|
1402
|
+
loader.expects(:load).with(:type, 'positiveinteger').returns ta
|
|
1403
|
+
Adapters::LoaderAdapter.expects(:loader_for_model_object)
|
|
1404
|
+
.with(instance_of(Model::QualifiedReference), scope).returns loader
|
|
1405
|
+
|
|
1406
|
+
t1 = type_t(range_t(0, :default))
|
|
1407
|
+
t2 = parser.parse('Type[PositiveInteger]', scope)
|
|
1408
|
+
expect(calculator.assignable?(t2, t1)).to be_truthy
|
|
1409
|
+
end
|
|
1410
|
+
|
|
1411
|
+
it 'Type[T] is assignable to AT when AT is an alias for Type[T]' do
|
|
1412
|
+
scope = Object.new
|
|
1413
|
+
|
|
1414
|
+
ta = type_alias_t('PositiveIntegerType', 'Type[Integer[0,default]]')
|
|
1415
|
+
loader = Object.new
|
|
1416
|
+
loader.expects(:load).with(:type, 'positiveintegertype').returns ta
|
|
1417
|
+
Adapters::LoaderAdapter.expects(:loader_for_model_object)
|
|
1418
|
+
.with(instance_of(Model::QualifiedReference), scope).returns loader
|
|
1419
|
+
|
|
1420
|
+
t1 = type_t(range_t(0, :default))
|
|
1421
|
+
t2 = parser.parse('PositiveIntegerType', scope)
|
|
1422
|
+
expect(calculator.assignable?(t2, t1)).to be_truthy
|
|
1423
|
+
end
|
|
1424
|
+
|
|
1425
|
+
it 'Type[Type[T]] is assignable to Type[Type[AT]] when AT is an alias for T' do
|
|
1426
|
+
scope = Object.new
|
|
1427
|
+
|
|
1428
|
+
ta = type_alias_t('PositiveInteger', 'Integer[0,default]')
|
|
1429
|
+
loader = Object.new
|
|
1430
|
+
loader.expects(:load).with(:type, 'positiveinteger').returns ta
|
|
1431
|
+
Adapters::LoaderAdapter.expects(:loader_for_model_object)
|
|
1432
|
+
.with(instance_of(Model::QualifiedReference), scope).returns loader
|
|
1433
|
+
|
|
1434
|
+
t1 = type_t(type_t(range_t(0, :default)))
|
|
1435
|
+
t2 = parser.parse('Type[Type[PositiveInteger]]', scope)
|
|
1436
|
+
expect(calculator.assignable?(t2, t1)).to be_truthy
|
|
1437
|
+
end
|
|
1438
|
+
|
|
1439
|
+
it 'Type[Type[T]] is assignable to Type[AT] when AT is an alias for Type[T]' do
|
|
1440
|
+
scope = Object.new
|
|
1441
|
+
|
|
1442
|
+
ta = type_alias_t('PositiveIntegerType', 'Type[Integer[0,default]]')
|
|
1443
|
+
loader = Object.new
|
|
1444
|
+
loader.expects(:load).with(:type, 'positiveintegertype').returns ta
|
|
1445
|
+
Adapters::LoaderAdapter.expects(:loader_for_model_object)
|
|
1446
|
+
.with(instance_of(Model::QualifiedReference), scope).returns loader
|
|
1447
|
+
|
|
1448
|
+
t1 = type_t(type_t(range_t(0, :default)))
|
|
1449
|
+
t2 = parser.parse('Type[PositiveIntegerType]', scope)
|
|
1450
|
+
expect(calculator.assignable?(t2, t1)).to be_truthy
|
|
1451
|
+
end
|
|
1452
|
+
end
|
|
1209
1453
|
end
|
|
1210
1454
|
|
|
1211
1455
|
context 'when testing if x is instance of type t' do
|
|
1212
|
-
include_context
|
|
1456
|
+
include_context 'types_setup'
|
|
1213
1457
|
|
|
1214
1458
|
it 'should consider undef to be instance of Any, NilType, and optional' do
|
|
1215
|
-
expect(calculator.instance?(
|
|
1216
|
-
expect(calculator.instance?(
|
|
1217
|
-
expect(calculator.instance?(
|
|
1459
|
+
expect(calculator.instance?(PUndefType::DEFAULT, nil)).to eq(true)
|
|
1460
|
+
expect(calculator.instance?(PAnyType::DEFAULT, nil)).to eq(true)
|
|
1461
|
+
expect(calculator.instance?(POptionalType::DEFAULT, nil)).to eq(true)
|
|
1218
1462
|
end
|
|
1219
1463
|
|
|
1220
1464
|
it 'all types should be (ruby) instance of PAnyType' do
|
|
1221
1465
|
all_types.each do |t|
|
|
1222
|
-
expect(t.
|
|
1466
|
+
expect(t::DEFAULT.is_a?(PAnyType)).to eq(true)
|
|
1223
1467
|
end
|
|
1224
1468
|
end
|
|
1225
1469
|
|
|
1226
|
-
it "should
|
|
1227
|
-
expect(calculator.
|
|
1470
|
+
it "should infer :undef to be Undef" do
|
|
1471
|
+
expect(calculator.infer(:undef)).to be_assignable_to(undef_t)
|
|
1472
|
+
end
|
|
1473
|
+
|
|
1474
|
+
it "should not consider :default to be instance of Runtime['ruby', 'Symbol]" do
|
|
1475
|
+
expect(calculator.instance?(PRuntimeType.new(:ruby, 'Symbol'), :default)).to eq(false)
|
|
1476
|
+
end
|
|
1477
|
+
|
|
1478
|
+
it "should not consider :undef to be instance of Runtime['ruby', 'Symbol]" do
|
|
1479
|
+
expect(calculator.instance?(PRuntimeType.new(:ruby, 'Symbol'), :undef)).to eq(false)
|
|
1228
1480
|
end
|
|
1229
1481
|
|
|
1230
|
-
it
|
|
1231
|
-
expect(calculator.instance?(
|
|
1482
|
+
it 'should consider :undef to be instance of an Optional type' do
|
|
1483
|
+
expect(calculator.instance?(POptionalType::DEFAULT, :undef)).to eq(true)
|
|
1232
1484
|
end
|
|
1233
1485
|
|
|
1234
|
-
it 'should not consider undef to be an instance of any other type than Any,
|
|
1486
|
+
it 'should not consider undef to be an instance of any other type than Any, UndefType and Data' do
|
|
1235
1487
|
types_to_test = all_types - [
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1488
|
+
PAnyType,
|
|
1489
|
+
PUndefType,
|
|
1490
|
+
PDataType,
|
|
1491
|
+
POptionalType,
|
|
1240
1492
|
]
|
|
1241
1493
|
|
|
1242
|
-
types_to_test.each {|t| expect(calculator.instance?(t
|
|
1243
|
-
types_to_test.each {|t| expect(calculator.instance?(t
|
|
1494
|
+
types_to_test.each {|t| expect(calculator.instance?(t::DEFAULT, nil)).to eq(false) }
|
|
1495
|
+
types_to_test.each {|t| expect(calculator.instance?(t::DEFAULT, :undef)).to eq(false) }
|
|
1244
1496
|
end
|
|
1245
1497
|
|
|
1246
1498
|
it 'should consider default to be instance of Default and Any' do
|
|
1247
|
-
expect(calculator.instance?(
|
|
1248
|
-
expect(calculator.instance?(
|
|
1499
|
+
expect(calculator.instance?(PDefaultType::DEFAULT, :default)).to eq(true)
|
|
1500
|
+
expect(calculator.instance?(PAnyType::DEFAULT, :default)).to eq(true)
|
|
1249
1501
|
end
|
|
1250
1502
|
|
|
1251
|
-
it 'should not consider "default" to be an instance of anything but Default, and Any' do
|
|
1503
|
+
it 'should not consider "default" to be an instance of anything but Default, NotUndef, and Any' do
|
|
1252
1504
|
types_to_test = all_types - [
|
|
1253
|
-
|
|
1254
|
-
|
|
1505
|
+
PAnyType,
|
|
1506
|
+
PNotUndefType,
|
|
1507
|
+
PDefaultType,
|
|
1255
1508
|
]
|
|
1256
1509
|
|
|
1257
|
-
types_to_test.each {|t| expect(calculator.instance?(t
|
|
1510
|
+
types_to_test.each {|t| expect(calculator.instance?(t::DEFAULT, :default)).to eq(false) }
|
|
1258
1511
|
end
|
|
1259
1512
|
|
|
1260
1513
|
it 'should consider fixnum instanceof PIntegerType' do
|
|
1261
|
-
expect(calculator.instance?(
|
|
1514
|
+
expect(calculator.instance?(PIntegerType::DEFAULT, 1)).to eq(true)
|
|
1262
1515
|
end
|
|
1263
1516
|
|
|
1264
1517
|
it 'should consider fixnum instanceof Fixnum' do
|
|
@@ -1274,15 +1527,22 @@ describe 'The type calculator' do
|
|
|
1274
1527
|
end
|
|
1275
1528
|
|
|
1276
1529
|
it 'should consider string in length range' do
|
|
1277
|
-
range =
|
|
1530
|
+
range = constrained_string_t(range_t(1,3))
|
|
1278
1531
|
expect(calculator.instance?(range, 'a')).to eq(true)
|
|
1279
1532
|
expect(calculator.instance?(range, 'abc')).to eq(true)
|
|
1280
1533
|
expect(calculator.instance?(range, '')).to eq(false)
|
|
1281
1534
|
expect(calculator.instance?(range, 'abcd')).to eq(false)
|
|
1282
1535
|
end
|
|
1283
1536
|
|
|
1537
|
+
it 'should consider string values' do
|
|
1538
|
+
string = string_t('a', 'b')
|
|
1539
|
+
expect(calculator.instance?(string, 'a')).to eq(true)
|
|
1540
|
+
expect(calculator.instance?(string, 'b')).to eq(true)
|
|
1541
|
+
expect(calculator.instance?(string, 'c')).to eq(false)
|
|
1542
|
+
end
|
|
1543
|
+
|
|
1284
1544
|
it 'should consider array in length range' do
|
|
1285
|
-
range =
|
|
1545
|
+
range = array_t(integer_t, range_t(1,3))
|
|
1286
1546
|
expect(calculator.instance?(range, [1])).to eq(true)
|
|
1287
1547
|
expect(calculator.instance?(range, [1,2,3])).to eq(true)
|
|
1288
1548
|
expect(calculator.instance?(range, [])).to eq(false)
|
|
@@ -1290,7 +1550,7 @@ describe 'The type calculator' do
|
|
|
1290
1550
|
end
|
|
1291
1551
|
|
|
1292
1552
|
it 'should consider hash in length range' do
|
|
1293
|
-
range =
|
|
1553
|
+
range = hash_t(integer_t, integer_t, range_t(1,2))
|
|
1294
1554
|
expect(calculator.instance?(range, {1=>1})).to eq(true)
|
|
1295
1555
|
expect(calculator.instance?(range, {1=>1, 2=>2})).to eq(true)
|
|
1296
1556
|
expect(calculator.instance?(range, {})).to eq(false)
|
|
@@ -1298,7 +1558,7 @@ describe 'The type calculator' do
|
|
|
1298
1558
|
end
|
|
1299
1559
|
|
|
1300
1560
|
it 'should consider collection in length range for array ' do
|
|
1301
|
-
range =
|
|
1561
|
+
range = collection_t(range_t(1,3))
|
|
1302
1562
|
expect(calculator.instance?(range, [1])).to eq(true)
|
|
1303
1563
|
expect(calculator.instance?(range, [1,2,3])).to eq(true)
|
|
1304
1564
|
expect(calculator.instance?(range, [])).to eq(false)
|
|
@@ -1306,7 +1566,7 @@ describe 'The type calculator' do
|
|
|
1306
1566
|
end
|
|
1307
1567
|
|
|
1308
1568
|
it 'should consider collection in length range for hash' do
|
|
1309
|
-
range =
|
|
1569
|
+
range = collection_t(range_t(1,2))
|
|
1310
1570
|
expect(calculator.instance?(range, {1=>1})).to eq(true)
|
|
1311
1571
|
expect(calculator.instance?(range, {1=>1, 2=>2})).to eq(true)
|
|
1312
1572
|
expect(calculator.instance?(range, {})).to eq(false)
|
|
@@ -1380,6 +1640,26 @@ describe 'The type calculator' do
|
|
|
1380
1640
|
struct = struct_t({'a'=>Integer, 'b'=>String, 'c'=>optional_t(Float)})
|
|
1381
1641
|
expect(calculator.instance?(struct, {'a'=>1, 'b'=>'a', 'c'=>'x'})).to eq(false)
|
|
1382
1642
|
end
|
|
1643
|
+
|
|
1644
|
+
it 'should consider nil to be a valid element value' do
|
|
1645
|
+
struct = struct_t({not_undef_t('a') => object_t, 'b'=>String})
|
|
1646
|
+
expect(calculator.instance?(struct, {'a'=>nil , 'b'=>'a'})).to eq(true)
|
|
1647
|
+
end
|
|
1648
|
+
|
|
1649
|
+
it 'should consider nil to be a valid element value but subject to value type' do
|
|
1650
|
+
struct = struct_t({not_undef_t('a') => String, 'b'=>String})
|
|
1651
|
+
expect(calculator.instance?(struct, {'a'=>nil , 'b'=>'a'})).to eq(false)
|
|
1652
|
+
end
|
|
1653
|
+
|
|
1654
|
+
it 'should consider nil to be a valid element value but subject to value type even when key is optional' do
|
|
1655
|
+
struct = struct_t({optional_t('a') => String, 'b'=>String})
|
|
1656
|
+
expect(calculator.instance?(struct, {'a'=>nil , 'b'=>'a'})).to eq(false)
|
|
1657
|
+
end
|
|
1658
|
+
|
|
1659
|
+
it 'should consider a hash where optional key is missing as assignable even if value of optional key is required' do
|
|
1660
|
+
struct = struct_t({optional_t('a') => String, 'b'=>String})
|
|
1661
|
+
expect(calculator.instance?(struct, {'b'=>'a'})).to eq(true)
|
|
1662
|
+
end
|
|
1383
1663
|
end
|
|
1384
1664
|
|
|
1385
1665
|
context 'and t is Data' do
|
|
@@ -1417,13 +1697,13 @@ describe 'The type calculator' do
|
|
|
1417
1697
|
end
|
|
1418
1698
|
end
|
|
1419
1699
|
|
|
1420
|
-
context
|
|
1700
|
+
context 'and t is something Callable' do
|
|
1421
1701
|
|
|
1422
1702
|
it 'a Closure should be considered a Callable' do
|
|
1423
|
-
factory =
|
|
1703
|
+
factory = Model::Factory
|
|
1424
1704
|
params = [factory.PARAM('a')]
|
|
1425
1705
|
the_block = factory.LAMBDA(params,factory.literal(42))
|
|
1426
|
-
the_closure =
|
|
1706
|
+
the_closure = Evaluator::Closure.new(:fake_evaluator, the_block, :fake_scope)
|
|
1427
1707
|
expect(calculator.instance?(all_callables_t, the_closure)).to be_truthy
|
|
1428
1708
|
expect(calculator.instance?(callable_t(object_t), the_closure)).to be_truthy
|
|
1429
1709
|
expect(calculator.instance?(callable_t(object_t, object_t), the_closure)).to be_falsey
|
|
@@ -1446,456 +1726,287 @@ describe 'The type calculator' do
|
|
|
1446
1726
|
expect(calculator.instance?(callable_t(String), f)).to be_truthy
|
|
1447
1727
|
end
|
|
1448
1728
|
end
|
|
1729
|
+
|
|
1730
|
+
context 'and t is a TypeAlias' do
|
|
1731
|
+
let!(:parser) { TypeParser.new }
|
|
1732
|
+
|
|
1733
|
+
it 'should consider x an instance of the aliased simple type' do
|
|
1734
|
+
t = type_alias_t('Alias', 'Integer').resolve(parser, nil)
|
|
1735
|
+
expect(calculator.instance?(t, 15)).to be_truthy
|
|
1736
|
+
end
|
|
1737
|
+
|
|
1738
|
+
it 'should consider x an instance of the aliased parameterized type' do
|
|
1739
|
+
t = type_alias_t('Alias', 'Integer[0,20]').resolve(parser, nil)
|
|
1740
|
+
expect(calculator.instance?(t, 15)).to be_truthy
|
|
1741
|
+
end
|
|
1742
|
+
|
|
1743
|
+
it 'should consider x an instance of the aliased type that uses self recursion' do
|
|
1744
|
+
scope = Object.new
|
|
1745
|
+
|
|
1746
|
+
t = type_alias_t('Tree', 'Hash[String,Variant[String,Tree]]')
|
|
1747
|
+
loader = Object.new
|
|
1748
|
+
loader.expects(:load).with(:type, 'tree').returns t
|
|
1749
|
+
|
|
1750
|
+
Adapters::LoaderAdapter.expects(:loader_for_model_object).with(instance_of(Model::QualifiedReference), scope).at_most_once.returns loader
|
|
1751
|
+
|
|
1752
|
+
t.resolve(parser, scope)
|
|
1753
|
+
expect(calculator.instance?(t, {'a'=>{'aa'=>{'aaa'=>'aaaa'}}, 'b'=>'bb'})).to be_truthy
|
|
1754
|
+
end
|
|
1755
|
+
|
|
1756
|
+
it 'should consider x an instance of the aliased type that uses contains an alias that causes self recursion' do
|
|
1757
|
+
scope = Object.new
|
|
1758
|
+
|
|
1759
|
+
t1 = type_alias_t('Tree', 'Hash[String,Variant[String,OtherTree]]')
|
|
1760
|
+
t2 = type_alias_t('OtherTree', 'Hash[String,Tree]')
|
|
1761
|
+
loader = Object.new
|
|
1762
|
+
loader.expects(:load).with(:type, 'tree').returns t1
|
|
1763
|
+
loader.expects(:load).with(:type, 'othertree').returns t2
|
|
1764
|
+
loader.expects(:is_a?).with(Loader::Loader).returns true
|
|
1765
|
+
|
|
1766
|
+
Adapters::LoaderAdapter.expects(:loader_for_model_object).with(instance_of(Model::QualifiedReference), scope).at_least_once.returns loader
|
|
1767
|
+
|
|
1768
|
+
t1.resolve(parser, scope)
|
|
1769
|
+
expect(calculator.instance?(t1, {'a'=>{'aa'=>{'aaa'=>'aaaa'}}, 'b'=>'bb'})).to be_truthy
|
|
1770
|
+
end
|
|
1771
|
+
end
|
|
1449
1772
|
end
|
|
1450
1773
|
|
|
1451
1774
|
context 'when converting a ruby class' do
|
|
1452
1775
|
it 'should yield \'PIntegerType\' for Integer, Fixnum, and Bignum' do
|
|
1453
1776
|
[Integer,Fixnum,Bignum].each do |c|
|
|
1454
|
-
expect(calculator.type(c).class).to eq(
|
|
1777
|
+
expect(calculator.type(c).class).to eq(PIntegerType)
|
|
1455
1778
|
end
|
|
1456
1779
|
end
|
|
1457
1780
|
|
|
1458
1781
|
it 'should yield \'PFloatType\' for Float' do
|
|
1459
|
-
expect(calculator.type(Float).class).to eq(
|
|
1782
|
+
expect(calculator.type(Float).class).to eq(PFloatType)
|
|
1460
1783
|
end
|
|
1461
1784
|
|
|
1462
1785
|
it 'should yield \'PBooleanType\' for FalseClass and TrueClass' do
|
|
1463
1786
|
[FalseClass,TrueClass].each do |c|
|
|
1464
|
-
expect(calculator.type(c).class).to eq(
|
|
1787
|
+
expect(calculator.type(c).class).to eq(PBooleanType)
|
|
1465
1788
|
end
|
|
1466
1789
|
end
|
|
1467
1790
|
|
|
1468
1791
|
it 'should yield \'PUndefType\' for NilClass' do
|
|
1469
|
-
expect(calculator.type(NilClass).class).to eq(
|
|
1792
|
+
expect(calculator.type(NilClass).class).to eq(PUndefType)
|
|
1470
1793
|
end
|
|
1471
1794
|
|
|
1472
1795
|
it 'should yield \'PStringType\' for String' do
|
|
1473
|
-
expect(calculator.type(String).class).to eq(
|
|
1796
|
+
expect(calculator.type(String).class).to eq(PStringType)
|
|
1474
1797
|
end
|
|
1475
1798
|
|
|
1476
1799
|
it 'should yield \'PRegexpType\' for Regexp' do
|
|
1477
|
-
expect(calculator.type(Regexp).class).to eq(
|
|
1800
|
+
expect(calculator.type(Regexp).class).to eq(PRegexpType)
|
|
1478
1801
|
end
|
|
1479
1802
|
|
|
1480
1803
|
it 'should yield \'PArrayType[PDataType]\' for Array' do
|
|
1481
1804
|
t = calculator.type(Array)
|
|
1482
|
-
expect(t.class).to eq(
|
|
1483
|
-
expect(t.element_type.class).to eq(
|
|
1805
|
+
expect(t.class).to eq(PArrayType)
|
|
1806
|
+
expect(t.element_type.class).to eq(PDataType)
|
|
1484
1807
|
end
|
|
1485
1808
|
|
|
1486
1809
|
it 'should yield \'PHashType[PScalarType,PDataType]\' for Hash' do
|
|
1487
1810
|
t = calculator.type(Hash)
|
|
1488
|
-
expect(t.class).to eq(
|
|
1489
|
-
expect(t.key_type.class).to eq(
|
|
1490
|
-
expect(t.element_type.class).to eq(
|
|
1491
|
-
end
|
|
1492
|
-
end
|
|
1493
|
-
|
|
1494
|
-
context 'when representing the type as string' do
|
|
1495
|
-
it 'should yield \'Type\' for PType' do
|
|
1496
|
-
expect(calculator.string(Puppet::Pops::Types::PType.new())).to eq('Type')
|
|
1497
|
-
end
|
|
1498
|
-
|
|
1499
|
-
it 'should yield \'Object\' for PAnyType' do
|
|
1500
|
-
expect(calculator.string(Puppet::Pops::Types::PAnyType.new())).to eq('Any')
|
|
1501
|
-
end
|
|
1502
|
-
|
|
1503
|
-
it 'should yield \'Scalar\' for PScalarType' do
|
|
1504
|
-
expect(calculator.string(Puppet::Pops::Types::PScalarType.new())).to eq('Scalar')
|
|
1505
|
-
end
|
|
1506
|
-
|
|
1507
|
-
it 'should yield \'Boolean\' for PBooleanType' do
|
|
1508
|
-
expect(calculator.string(Puppet::Pops::Types::PBooleanType.new())).to eq('Boolean')
|
|
1509
|
-
end
|
|
1510
|
-
|
|
1511
|
-
it 'should yield \'Data\' for PDataType' do
|
|
1512
|
-
expect(calculator.string(Puppet::Pops::Types::PDataType.new())).to eq('Data')
|
|
1513
|
-
end
|
|
1514
|
-
|
|
1515
|
-
it 'should yield \'Numeric\' for PNumericType' do
|
|
1516
|
-
expect(calculator.string(Puppet::Pops::Types::PNumericType.new())).to eq('Numeric')
|
|
1517
|
-
end
|
|
1518
|
-
|
|
1519
|
-
it 'should yield \'Integer\' and from/to for PIntegerType' do
|
|
1520
|
-
int_T = Puppet::Pops::Types::PIntegerType
|
|
1521
|
-
expect(calculator.string(int_T.new())).to eq('Integer')
|
|
1522
|
-
int = int_T.new()
|
|
1523
|
-
int.from = 1
|
|
1524
|
-
int.to = 1
|
|
1525
|
-
expect(calculator.string(int)).to eq('Integer[1, 1]')
|
|
1526
|
-
int = int_T.new()
|
|
1527
|
-
int.from = 1
|
|
1528
|
-
int.to = 2
|
|
1529
|
-
expect(calculator.string(int)).to eq('Integer[1, 2]')
|
|
1530
|
-
int = int_T.new()
|
|
1531
|
-
int.from = nil
|
|
1532
|
-
int.to = 2
|
|
1533
|
-
expect(calculator.string(int)).to eq('Integer[default, 2]')
|
|
1534
|
-
int = int_T.new()
|
|
1535
|
-
int.from = 2
|
|
1536
|
-
int.to = nil
|
|
1537
|
-
expect(calculator.string(int)).to eq('Integer[2, default]')
|
|
1538
|
-
end
|
|
1539
|
-
|
|
1540
|
-
it 'should yield \'Float\' for PFloatType' do
|
|
1541
|
-
expect(calculator.string(Puppet::Pops::Types::PFloatType.new())).to eq('Float')
|
|
1542
|
-
end
|
|
1543
|
-
|
|
1544
|
-
it 'should yield \'Regexp\' for PRegexpType' do
|
|
1545
|
-
expect(calculator.string(Puppet::Pops::Types::PRegexpType.new())).to eq('Regexp')
|
|
1546
|
-
end
|
|
1547
|
-
|
|
1548
|
-
it 'should yield \'Regexp[/pat/]\' for parameterized PRegexpType' do
|
|
1549
|
-
t = Puppet::Pops::Types::PRegexpType.new()
|
|
1550
|
-
t.pattern = ('a/b')
|
|
1551
|
-
expect(calculator.string(Puppet::Pops::Types::PRegexpType.new())).to eq('Regexp')
|
|
1552
|
-
end
|
|
1553
|
-
|
|
1554
|
-
it 'should yield \'String\' for PStringType' do
|
|
1555
|
-
expect(calculator.string(Puppet::Pops::Types::PStringType.new())).to eq('String')
|
|
1556
|
-
end
|
|
1557
|
-
|
|
1558
|
-
it 'should yield \'String\' for PStringType with multiple values' do
|
|
1559
|
-
expect(calculator.string(string_t('a', 'b', 'c'))).to eq('String')
|
|
1560
|
-
end
|
|
1561
|
-
|
|
1562
|
-
it 'should yield \'String\' and from/to for PStringType' do
|
|
1563
|
-
string_T = Puppet::Pops::Types::PStringType
|
|
1564
|
-
expect(calculator.string(factory.constrain_size(string_T.new(), 1,1))).to eq('String[1, 1]')
|
|
1565
|
-
expect(calculator.string(factory.constrain_size(string_T.new(), 1,2))).to eq('String[1, 2]')
|
|
1566
|
-
expect(calculator.string(factory.constrain_size(string_T.new(), :default, 2))).to eq('String[default, 2]')
|
|
1567
|
-
expect(calculator.string(factory.constrain_size(string_T.new(), 2, :default))).to eq('String[2, default]')
|
|
1568
|
-
end
|
|
1569
|
-
|
|
1570
|
-
it 'should yield \'Array[Integer]\' for PArrayType[PIntegerType]' do
|
|
1571
|
-
t = Puppet::Pops::Types::PArrayType.new()
|
|
1572
|
-
t.element_type = Puppet::Pops::Types::PIntegerType.new()
|
|
1573
|
-
expect(calculator.string(t)).to eq('Array[Integer]')
|
|
1574
|
-
end
|
|
1575
|
-
|
|
1576
|
-
it 'should yield \'Collection\' and from/to for PCollectionType' do
|
|
1577
|
-
col = collection_t()
|
|
1578
|
-
expect(calculator.string(factory.constrain_size(col.copy, 1,1))).to eq('Collection[1, 1]')
|
|
1579
|
-
expect(calculator.string(factory.constrain_size(col.copy, 1,2))).to eq('Collection[1, 2]')
|
|
1580
|
-
expect(calculator.string(factory.constrain_size(col.copy, :default, 2))).to eq('Collection[default, 2]')
|
|
1581
|
-
expect(calculator.string(factory.constrain_size(col.copy, 2, :default))).to eq('Collection[2, default]')
|
|
1582
|
-
end
|
|
1583
|
-
|
|
1584
|
-
it 'should yield \'Array\' and from/to for PArrayType' do
|
|
1585
|
-
arr = array_t(string_t)
|
|
1586
|
-
expect(calculator.string(factory.constrain_size(arr.copy, 1,1))).to eq('Array[String, 1, 1]')
|
|
1587
|
-
expect(calculator.string(factory.constrain_size(arr.copy, 1,2))).to eq('Array[String, 1, 2]')
|
|
1588
|
-
expect(calculator.string(factory.constrain_size(arr.copy, :default, 2))).to eq('Array[String, default, 2]')
|
|
1589
|
-
expect(calculator.string(factory.constrain_size(arr.copy, 2, :default))).to eq('Array[String, 2, default]')
|
|
1590
|
-
end
|
|
1591
|
-
|
|
1592
|
-
it 'should yield \'Tuple[Integer]\' for PTupleType[PIntegerType]' do
|
|
1593
|
-
t = Puppet::Pops::Types::PTupleType.new()
|
|
1594
|
-
t.addTypes(Puppet::Pops::Types::PIntegerType.new())
|
|
1595
|
-
expect(calculator.string(t)).to eq('Tuple[Integer]')
|
|
1596
|
-
end
|
|
1597
|
-
|
|
1598
|
-
it 'should yield \'Tuple[T, T,..]\' for PTupleType[T, T, ...]' do
|
|
1599
|
-
t = Puppet::Pops::Types::PTupleType.new()
|
|
1600
|
-
t.addTypes(Puppet::Pops::Types::PIntegerType.new())
|
|
1601
|
-
t.addTypes(Puppet::Pops::Types::PIntegerType.new())
|
|
1602
|
-
t.addTypes(Puppet::Pops::Types::PStringType.new())
|
|
1603
|
-
expect(calculator.string(t)).to eq('Tuple[Integer, Integer, String]')
|
|
1604
|
-
end
|
|
1605
|
-
|
|
1606
|
-
it 'should yield \'Tuple\' and from/to for PTupleType' do
|
|
1607
|
-
tuple_t = tuple_t(string_t)
|
|
1608
|
-
expect(calculator.string(factory.constrain_size(tuple_t.copy, 1,1))).to eq('Tuple[String, 1, 1]')
|
|
1609
|
-
expect(calculator.string(factory.constrain_size(tuple_t.copy, 1,2))).to eq('Tuple[String, 1, 2]')
|
|
1610
|
-
expect(calculator.string(factory.constrain_size(tuple_t.copy, :default, 2))).to eq('Tuple[String, default, 2]')
|
|
1611
|
-
expect(calculator.string(factory.constrain_size(tuple_t.copy, 2, :default))).to eq('Tuple[String, 2, default]')
|
|
1612
|
-
end
|
|
1613
|
-
|
|
1614
|
-
it 'should yield \'Struct\' and details for PStructType' do
|
|
1615
|
-
struct_t = struct_t({'a'=>Integer, 'b'=>String})
|
|
1616
|
-
expect(calculator.string(struct_t)).to eq("Struct[{'a'=>Integer, 'b'=>String}]")
|
|
1617
|
-
struct_t = struct_t({})
|
|
1618
|
-
expect(calculator.string(struct_t)).to eq("Struct")
|
|
1619
|
-
end
|
|
1620
|
-
|
|
1621
|
-
it 'should yield \'Hash[String, Integer]\' for PHashType[PStringType, PIntegerType]' do
|
|
1622
|
-
t = Puppet::Pops::Types::PHashType.new()
|
|
1623
|
-
t.key_type = Puppet::Pops::Types::PStringType.new()
|
|
1624
|
-
t.element_type = Puppet::Pops::Types::PIntegerType.new()
|
|
1625
|
-
expect(calculator.string(t)).to eq('Hash[String, Integer]')
|
|
1626
|
-
end
|
|
1627
|
-
|
|
1628
|
-
it 'should yield \'Hash\' and from/to for PHashType' do
|
|
1629
|
-
hsh = hash_t(string_t, string_t)
|
|
1630
|
-
expect(calculator.string(factory.constrain_size(hsh.copy, 1,1))).to eq('Hash[String, String, 1, 1]')
|
|
1631
|
-
expect(calculator.string(factory.constrain_size(hsh.copy, 1,2))).to eq('Hash[String, String, 1, 2]')
|
|
1632
|
-
expect(calculator.string(factory.constrain_size(hsh.copy, :default, 2))).to eq('Hash[String, String, default, 2]')
|
|
1633
|
-
expect(calculator.string(factory.constrain_size(hsh.copy, 2, :default))).to eq('Hash[String, String, 2, default]')
|
|
1634
|
-
end
|
|
1635
|
-
|
|
1636
|
-
it "should yield 'Class' for a PHostClassType" do
|
|
1637
|
-
t = Puppet::Pops::Types::PHostClassType.new()
|
|
1638
|
-
expect(calculator.string(t)).to eq('Class')
|
|
1639
|
-
end
|
|
1640
|
-
|
|
1641
|
-
it "should yield 'Class[x]' for a PHostClassType[x]" do
|
|
1642
|
-
t = Puppet::Pops::Types::PHostClassType.new()
|
|
1643
|
-
t.class_name = 'x'
|
|
1644
|
-
expect(calculator.string(t)).to eq('Class[x]')
|
|
1645
|
-
end
|
|
1646
|
-
|
|
1647
|
-
it "should yield 'Resource' for a PResourceType" do
|
|
1648
|
-
t = Puppet::Pops::Types::PResourceType.new()
|
|
1649
|
-
expect(calculator.string(t)).to eq('Resource')
|
|
1650
|
-
end
|
|
1651
|
-
|
|
1652
|
-
it 'should yield \'File\' for a PResourceType[\'File\']' do
|
|
1653
|
-
t = Puppet::Pops::Types::PResourceType.new()
|
|
1654
|
-
t.type_name = 'File'
|
|
1655
|
-
expect(calculator.string(t)).to eq('File')
|
|
1656
|
-
end
|
|
1657
|
-
|
|
1658
|
-
it "should yield 'File['/tmp/foo']' for a PResourceType['File', '/tmp/foo']" do
|
|
1659
|
-
t = Puppet::Pops::Types::PResourceType.new()
|
|
1660
|
-
t.type_name = 'File'
|
|
1661
|
-
t.title = '/tmp/foo'
|
|
1662
|
-
expect(calculator.string(t)).to eq("File['/tmp/foo']")
|
|
1663
|
-
end
|
|
1664
|
-
|
|
1665
|
-
it "should yield 'Enum[s,...]' for a PEnumType[s,...]" do
|
|
1666
|
-
t = enum_t('a', 'b', 'c')
|
|
1667
|
-
expect(calculator.string(t)).to eq("Enum['a', 'b', 'c']")
|
|
1668
|
-
end
|
|
1669
|
-
|
|
1670
|
-
it "should yield 'Pattern[/pat/,...]' for a PPatternType['pat',...]" do
|
|
1671
|
-
t = pattern_t('a')
|
|
1672
|
-
t2 = pattern_t('a', 'b', 'c')
|
|
1673
|
-
expect(calculator.string(t)).to eq("Pattern[/a/]")
|
|
1674
|
-
expect(calculator.string(t2)).to eq("Pattern[/a/, /b/, /c/]")
|
|
1675
|
-
end
|
|
1676
|
-
|
|
1677
|
-
it "should escape special characters in the string for a PPatternType['pat',...]" do
|
|
1678
|
-
t = pattern_t('a/b')
|
|
1679
|
-
expect(calculator.string(t)).to eq("Pattern[/a\\/b/]")
|
|
1680
|
-
end
|
|
1681
|
-
|
|
1682
|
-
it "should yield 'Variant[t1,t2,...]' for a PVariantType[t1, t2,...]" do
|
|
1683
|
-
t1 = string_t()
|
|
1684
|
-
t2 = integer_t()
|
|
1685
|
-
t3 = pattern_t('a')
|
|
1686
|
-
t = variant_t(t1, t2, t3)
|
|
1687
|
-
expect(calculator.string(t)).to eq("Variant[String, Integer, Pattern[/a/]]")
|
|
1688
|
-
end
|
|
1689
|
-
|
|
1690
|
-
it "should yield 'Callable' for generic callable" do
|
|
1691
|
-
expect(calculator.string(all_callables_t)).to eql("Callable")
|
|
1692
|
-
end
|
|
1693
|
-
|
|
1694
|
-
it "should yield 'Callable[0,0]' for callable without params" do
|
|
1695
|
-
expect(calculator.string(callable_t)).to eql("Callable[0, 0]")
|
|
1696
|
-
end
|
|
1697
|
-
|
|
1698
|
-
it "should yield 'Callable[t,t]' for callable with typed parameters" do
|
|
1699
|
-
expect(calculator.string(callable_t(String, Integer))).to eql("Callable[String, Integer]")
|
|
1700
|
-
end
|
|
1701
|
-
|
|
1702
|
-
it "should yield 'Callable[t,min,max]' for callable with size constraint (infinite max)" do
|
|
1703
|
-
expect(calculator.string(callable_t(String, 0))).to eql("Callable[String, 0, default]")
|
|
1704
|
-
end
|
|
1705
|
-
|
|
1706
|
-
it "should yield 'Callable[t,min,max]' for callable with size constraint (capped max)" do
|
|
1707
|
-
expect(calculator.string(callable_t(String, 0, 3))).to eql("Callable[String, 0, 3]")
|
|
1708
|
-
end
|
|
1709
|
-
|
|
1710
|
-
it "should yield 'Callable[min,max]' callable with size > 0" do
|
|
1711
|
-
expect(calculator.string(callable_t(0, 0))).to eql("Callable[0, 0]")
|
|
1712
|
-
expect(calculator.string(callable_t(0, 1))).to eql("Callable[0, 1]")
|
|
1713
|
-
expect(calculator.string(callable_t(0, :default))).to eql("Callable[0, default]")
|
|
1714
|
-
end
|
|
1715
|
-
|
|
1716
|
-
it "should yield 'Callable[Callable]' for callable with block" do
|
|
1717
|
-
expect(calculator.string(callable_t(all_callables_t))).to eql("Callable[0, 0, Callable]")
|
|
1718
|
-
expect(calculator.string(callable_t(string_t, all_callables_t))).to eql("Callable[String, Callable]")
|
|
1719
|
-
expect(calculator.string(callable_t(string_t, 1,1, all_callables_t))).to eql("Callable[String, 1, 1, Callable]")
|
|
1720
|
-
end
|
|
1721
|
-
|
|
1722
|
-
it "should yield Unit for a Unit type" do
|
|
1723
|
-
expect(calculator.string(unit_t)).to eql('Unit')
|
|
1811
|
+
expect(t.class).to eq(PHashType)
|
|
1812
|
+
expect(t.key_type.class).to eq(PScalarType)
|
|
1813
|
+
expect(t.element_type.class).to eq(PDataType)
|
|
1724
1814
|
end
|
|
1725
1815
|
end
|
|
1726
1816
|
|
|
1727
1817
|
context 'when processing meta type' do
|
|
1728
1818
|
it 'should infer PType as the type of all other types' do
|
|
1729
|
-
ptype =
|
|
1730
|
-
expect(calculator.infer(
|
|
1731
|
-
expect(calculator.infer(
|
|
1732
|
-
expect(calculator.infer(
|
|
1733
|
-
expect(calculator.infer(
|
|
1734
|
-
expect(calculator.infer(
|
|
1735
|
-
expect(calculator.infer(
|
|
1736
|
-
expect(calculator.infer(
|
|
1737
|
-
expect(calculator.infer(
|
|
1738
|
-
expect(calculator.infer(
|
|
1739
|
-
expect(calculator.infer(
|
|
1740
|
-
expect(calculator.infer(
|
|
1741
|
-
expect(calculator.infer(
|
|
1742
|
-
expect(calculator.infer(
|
|
1743
|
-
expect(calculator.infer(
|
|
1744
|
-
expect(calculator.infer(
|
|
1745
|
-
expect(calculator.infer(
|
|
1746
|
-
expect(calculator.infer(
|
|
1747
|
-
expect(calculator.infer(
|
|
1748
|
-
expect(calculator.infer(
|
|
1749
|
-
expect(calculator.infer(
|
|
1750
|
-
expect(calculator.infer(
|
|
1819
|
+
ptype = PType
|
|
1820
|
+
expect(calculator.infer(PUndefType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1821
|
+
expect(calculator.infer(PDataType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1822
|
+
expect(calculator.infer(PScalarType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1823
|
+
expect(calculator.infer(PStringType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1824
|
+
expect(calculator.infer(PNumericType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1825
|
+
expect(calculator.infer(PIntegerType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1826
|
+
expect(calculator.infer(PFloatType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1827
|
+
expect(calculator.infer(PRegexpType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1828
|
+
expect(calculator.infer(PBooleanType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1829
|
+
expect(calculator.infer(PCollectionType::DEFAULT).is_a?(ptype)).to eq(true)
|
|
1830
|
+
expect(calculator.infer(PArrayType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1831
|
+
expect(calculator.infer(PHashType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1832
|
+
expect(calculator.infer(PIterableType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1833
|
+
expect(calculator.infer(PRuntimeType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1834
|
+
expect(calculator.infer(PHostClassType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1835
|
+
expect(calculator.infer(PResourceType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1836
|
+
expect(calculator.infer(PEnumType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1837
|
+
expect(calculator.infer(PPatternType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1838
|
+
expect(calculator.infer(PVariantType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1839
|
+
expect(calculator.infer(PTupleType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1840
|
+
expect(calculator.infer(POptionalType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1841
|
+
expect(calculator.infer(PCallableType::DEFAULT ).is_a?(ptype)).to eq(true)
|
|
1751
1842
|
end
|
|
1752
1843
|
|
|
1753
1844
|
it 'should infer PType as the type of all other types' do
|
|
1754
|
-
|
|
1755
|
-
expect(calculator.
|
|
1756
|
-
expect(calculator.
|
|
1757
|
-
expect(calculator.
|
|
1758
|
-
expect(calculator.
|
|
1759
|
-
expect(calculator.
|
|
1760
|
-
expect(calculator.
|
|
1761
|
-
expect(calculator.
|
|
1762
|
-
expect(calculator.
|
|
1763
|
-
expect(calculator.
|
|
1764
|
-
expect(calculator.
|
|
1765
|
-
expect(calculator.
|
|
1766
|
-
expect(calculator.
|
|
1767
|
-
expect(calculator.
|
|
1768
|
-
expect(calculator.
|
|
1769
|
-
expect(calculator.
|
|
1770
|
-
expect(calculator.
|
|
1771
|
-
expect(calculator.
|
|
1772
|
-
expect(calculator.
|
|
1773
|
-
expect(calculator.
|
|
1774
|
-
expect(calculator.
|
|
1775
|
-
expect(calculator.
|
|
1776
|
-
|
|
1777
|
-
expect(calculator.infer(
|
|
1778
|
-
expect(calculator.
|
|
1779
|
-
expect(calculator.infer(
|
|
1845
|
+
expect(calculator.infer(PUndefType::DEFAULT ).to_s).to eq('Type[Undef]')
|
|
1846
|
+
expect(calculator.infer(PDataType::DEFAULT ).to_s).to eq('Type[Data]')
|
|
1847
|
+
expect(calculator.infer(PScalarType::DEFAULT ).to_s).to eq('Type[Scalar]')
|
|
1848
|
+
expect(calculator.infer(PStringType::DEFAULT ).to_s).to eq('Type[String]')
|
|
1849
|
+
expect(calculator.infer(PNumericType::DEFAULT ).to_s).to eq('Type[Numeric]')
|
|
1850
|
+
expect(calculator.infer(PIntegerType::DEFAULT ).to_s).to eq('Type[Integer]')
|
|
1851
|
+
expect(calculator.infer(PFloatType::DEFAULT ).to_s).to eq('Type[Float]')
|
|
1852
|
+
expect(calculator.infer(PRegexpType::DEFAULT ).to_s).to eq('Type[Regexp]')
|
|
1853
|
+
expect(calculator.infer(PBooleanType::DEFAULT ).to_s).to eq('Type[Boolean]')
|
|
1854
|
+
expect(calculator.infer(PCollectionType::DEFAULT).to_s).to eq('Type[Collection]')
|
|
1855
|
+
expect(calculator.infer(PArrayType::DEFAULT ).to_s).to eq('Type[Array[?]]')
|
|
1856
|
+
expect(calculator.infer(PHashType::DEFAULT ).to_s).to eq('Type[Hash[?, ?]]')
|
|
1857
|
+
expect(calculator.infer(PIterableType::DEFAULT ).to_s).to eq('Type[Iterable]')
|
|
1858
|
+
expect(calculator.infer(PRuntimeType::DEFAULT ).to_s).to eq('Type[Runtime[?, ?]]')
|
|
1859
|
+
expect(calculator.infer(PHostClassType::DEFAULT ).to_s).to eq('Type[Class]')
|
|
1860
|
+
expect(calculator.infer(PResourceType::DEFAULT ).to_s).to eq('Type[Resource]')
|
|
1861
|
+
expect(calculator.infer(PEnumType::DEFAULT ).to_s).to eq('Type[Enum]')
|
|
1862
|
+
expect(calculator.infer(PVariantType::DEFAULT ).to_s).to eq('Type[Variant]')
|
|
1863
|
+
expect(calculator.infer(PPatternType::DEFAULT ).to_s).to eq('Type[Pattern]')
|
|
1864
|
+
expect(calculator.infer(PTupleType::DEFAULT ).to_s).to eq('Type[Tuple]')
|
|
1865
|
+
expect(calculator.infer(POptionalType::DEFAULT ).to_s).to eq('Type[Optional]')
|
|
1866
|
+
expect(calculator.infer(PCallableType::DEFAULT ).to_s).to eq('Type[Callable]')
|
|
1867
|
+
|
|
1868
|
+
expect(calculator.infer(PResourceType.new('foo::fee::fum')).to_s).to eq('Type[Foo::Fee::Fum]')
|
|
1869
|
+
expect(calculator.infer(PResourceType.new('foo::fee::fum')).to_s).to eq('Type[Foo::Fee::Fum]')
|
|
1870
|
+
expect(calculator.infer(PResourceType.new('Foo::Fee::Fum')).to_s).to eq('Type[Foo::Fee::Fum]')
|
|
1780
1871
|
end
|
|
1781
1872
|
|
|
1782
1873
|
it "computes the common type of PType's type parameter" do
|
|
1783
|
-
int_t =
|
|
1784
|
-
string_t =
|
|
1785
|
-
expect(calculator.
|
|
1786
|
-
expect(calculator.
|
|
1874
|
+
int_t = PIntegerType::DEFAULT
|
|
1875
|
+
string_t = PStringType::DEFAULT
|
|
1876
|
+
expect(calculator.infer([int_t]).to_s).to eq('Array[Type[Integer], 1, 1]')
|
|
1877
|
+
expect(calculator.infer([int_t, string_t]).to_s).to eq('Array[Type[Scalar], 2, 2]')
|
|
1787
1878
|
end
|
|
1788
1879
|
|
|
1789
1880
|
it 'should infer PType as the type of ruby classes' do
|
|
1790
1881
|
class Foo
|
|
1791
1882
|
end
|
|
1792
1883
|
[Object, Numeric, Integer, Fixnum, Bignum, Float, String, Regexp, Array, Hash, Foo].each do |c|
|
|
1793
|
-
expect(calculator.infer(c).is_a?(
|
|
1884
|
+
expect(calculator.infer(c).is_a?(PType)).to eq(true)
|
|
1794
1885
|
end
|
|
1795
1886
|
end
|
|
1796
1887
|
|
|
1797
1888
|
it 'should infer PType as the type of PType (meta regression short-circuit)' do
|
|
1798
|
-
expect(calculator.infer(
|
|
1889
|
+
expect(calculator.infer(PType::DEFAULT).is_a?(PType)).to eq(true)
|
|
1799
1890
|
end
|
|
1800
1891
|
|
|
1801
1892
|
it 'computes instance? to be true if parameterized and type match' do
|
|
1802
|
-
int_t =
|
|
1803
|
-
type_t =
|
|
1804
|
-
type_type_t =
|
|
1893
|
+
int_t = PIntegerType::DEFAULT
|
|
1894
|
+
type_t = TypeFactory.type_type(int_t)
|
|
1895
|
+
type_type_t = TypeFactory.type_type(type_t)
|
|
1805
1896
|
expect(calculator.instance?(type_type_t, type_t)).to eq(true)
|
|
1806
1897
|
end
|
|
1807
1898
|
|
|
1808
1899
|
it 'computes instance? to be false if parameterized and type do not match' do
|
|
1809
|
-
int_t =
|
|
1810
|
-
string_t =
|
|
1811
|
-
type_t =
|
|
1812
|
-
type_t2 =
|
|
1813
|
-
type_type_t =
|
|
1900
|
+
int_t = PIntegerType::DEFAULT
|
|
1901
|
+
string_t = PStringType::DEFAULT
|
|
1902
|
+
type_t = TypeFactory.type_type(int_t)
|
|
1903
|
+
type_t2 = TypeFactory.type_type(string_t)
|
|
1904
|
+
type_type_t = TypeFactory.type_type(type_t)
|
|
1814
1905
|
# i.e. Type[Integer] =~ Type[Type[Integer]] # false
|
|
1815
1906
|
expect(calculator.instance?(type_type_t, type_t2)).to eq(false)
|
|
1816
1907
|
end
|
|
1817
1908
|
|
|
1818
1909
|
it 'computes instance? to be true if unparameterized and matched against a type[?]' do
|
|
1819
|
-
int_t =
|
|
1820
|
-
type_t =
|
|
1821
|
-
expect(calculator.instance?(
|
|
1910
|
+
int_t = PIntegerType::DEFAULT
|
|
1911
|
+
type_t = TypeFactory.type_type(int_t)
|
|
1912
|
+
expect(calculator.instance?(PType::DEFAULT, type_t)).to eq(true)
|
|
1822
1913
|
end
|
|
1823
1914
|
end
|
|
1824
1915
|
|
|
1825
|
-
context
|
|
1826
|
-
it
|
|
1827
|
-
t =
|
|
1828
|
-
t.
|
|
1829
|
-
t.to = 10
|
|
1830
|
-
expect(calculator.enumerable(t).respond_to?(:each)).to eq(true)
|
|
1916
|
+
context 'when asking for an iterable ' do
|
|
1917
|
+
it 'should produce an iterable for an Integer range that is finite' do
|
|
1918
|
+
t = PIntegerType.new(1, 10)
|
|
1919
|
+
expect(calculator.iterable(t).respond_to?(:each)).to eq(true)
|
|
1831
1920
|
end
|
|
1832
1921
|
|
|
1833
|
-
it
|
|
1834
|
-
t =
|
|
1835
|
-
t.
|
|
1836
|
-
t.to = 10
|
|
1837
|
-
expect(calculator.enumerable(t)).to eq(nil)
|
|
1922
|
+
it 'should not produce an iterable for an Integer range that has an infinite side' do
|
|
1923
|
+
t = PIntegerType.new(nil, 10)
|
|
1924
|
+
expect(calculator.iterable(t)).to eq(nil)
|
|
1838
1925
|
|
|
1839
|
-
t =
|
|
1840
|
-
t.
|
|
1841
|
-
t.to = nil
|
|
1842
|
-
expect(calculator.enumerable(t)).to eq(nil)
|
|
1926
|
+
t = PIntegerType.new(1, nil)
|
|
1927
|
+
expect(calculator.iterable(t)).to eq(nil)
|
|
1843
1928
|
end
|
|
1844
1929
|
|
|
1845
|
-
it
|
|
1930
|
+
it 'all but Integer range are not iterable' do
|
|
1846
1931
|
[Object, Numeric, Float, String, Regexp, Array, Hash].each do |t|
|
|
1847
|
-
expect(calculator.
|
|
1932
|
+
expect(calculator.iterable(calculator.type(t))).to eq(nil)
|
|
1848
1933
|
end
|
|
1849
1934
|
end
|
|
1850
1935
|
end
|
|
1851
1936
|
|
|
1852
|
-
context
|
|
1853
|
-
it
|
|
1937
|
+
context 'when dealing with different types of inference' do
|
|
1938
|
+
it 'an instance specific inference is produced by infer' do
|
|
1854
1939
|
expect(calculator.infer(['a','b']).element_type.values).to eq(['a', 'b'])
|
|
1855
1940
|
end
|
|
1856
1941
|
|
|
1857
|
-
it
|
|
1942
|
+
it 'a generic inference is produced using infer_generic' do
|
|
1858
1943
|
expect(calculator.infer_generic(['a','b']).element_type.values).to eq([])
|
|
1859
1944
|
end
|
|
1860
1945
|
|
|
1861
|
-
it
|
|
1946
|
+
it 'a generic result is created by generalize given an instance specific result for an Array' do
|
|
1862
1947
|
generic = calculator.infer(['a','b'])
|
|
1863
1948
|
expect(generic.element_type.values).to eq(['a', 'b'])
|
|
1864
|
-
|
|
1949
|
+
generic = generic.generalize
|
|
1865
1950
|
expect(generic.element_type.values).to eq([])
|
|
1866
1951
|
end
|
|
1867
1952
|
|
|
1868
|
-
it
|
|
1953
|
+
it 'a generic result is created by generalize given an instance specific result for a Hash' do
|
|
1869
1954
|
generic = calculator.infer({'a' =>1,'b' => 2})
|
|
1870
1955
|
expect(generic.key_type.values.sort).to eq(['a', 'b'])
|
|
1871
1956
|
expect(generic.element_type.from).to eq(1)
|
|
1872
1957
|
expect(generic.element_type.to).to eq(2)
|
|
1873
|
-
|
|
1958
|
+
generic = generic.generalize
|
|
1874
1959
|
expect(generic.key_type.values).to eq([])
|
|
1875
1960
|
expect(generic.element_type.from).to eq(nil)
|
|
1876
1961
|
expect(generic.element_type.to).to eq(nil)
|
|
1877
1962
|
end
|
|
1878
1963
|
|
|
1964
|
+
it 'ensures that Struct key types are not generalized' do
|
|
1965
|
+
generic = struct_t({'a' => object_t}).generalize
|
|
1966
|
+
expect(generic.to_s).to eq("Struct[{'a' => Any}]")
|
|
1967
|
+
generic = struct_t({not_undef_t('a') => object_t}).generalize
|
|
1968
|
+
expect(generic.to_s).to eq("Struct[{NotUndef['a'] => Any}]")
|
|
1969
|
+
generic = struct_t({optional_t('a') => string_t}).generalize
|
|
1970
|
+
expect(generic.to_s).to eq("Struct[{Optional['a'] => String}]")
|
|
1971
|
+
end
|
|
1972
|
+
|
|
1973
|
+
it 'ensures that Struct value types are generalized' do
|
|
1974
|
+
generic = struct_t({'a' => range_t(1, 3)}).generalize
|
|
1975
|
+
expect(generic.to_s).to eq("Struct[{'a' => Integer}]")
|
|
1976
|
+
end
|
|
1977
|
+
|
|
1879
1978
|
it "does not reduce by combining types when using infer_set" do
|
|
1880
1979
|
element_type = calculator.infer(['a','b',1,2]).element_type
|
|
1881
|
-
expect(element_type.class).to eq(
|
|
1980
|
+
expect(element_type.class).to eq(PScalarType)
|
|
1882
1981
|
inferred_type = calculator.infer_set(['a','b',1,2])
|
|
1883
|
-
expect(inferred_type.class).to eq(
|
|
1982
|
+
expect(inferred_type.class).to eq(PTupleType)
|
|
1884
1983
|
element_types = inferred_type.types
|
|
1885
|
-
expect(element_types[0].class).to eq(
|
|
1886
|
-
expect(element_types[1].class).to eq(
|
|
1887
|
-
expect(element_types[2].class).to eq(
|
|
1888
|
-
expect(element_types[3].class).to eq(
|
|
1984
|
+
expect(element_types[0].class).to eq(PStringType)
|
|
1985
|
+
expect(element_types[1].class).to eq(PStringType)
|
|
1986
|
+
expect(element_types[2].class).to eq(PIntegerType)
|
|
1987
|
+
expect(element_types[3].class).to eq(PIntegerType)
|
|
1889
1988
|
end
|
|
1890
1989
|
|
|
1891
|
-
it
|
|
1990
|
+
it 'does not reduce by combining types when using infer_set and values are undef' do
|
|
1892
1991
|
element_type = calculator.infer(['a',nil]).element_type
|
|
1893
|
-
expect(element_type.class).to eq(
|
|
1992
|
+
expect(element_type.class).to eq(PStringType)
|
|
1894
1993
|
inferred_type = calculator.infer_set(['a',nil])
|
|
1895
|
-
expect(inferred_type.class).to eq(
|
|
1994
|
+
expect(inferred_type.class).to eq(PTupleType)
|
|
1896
1995
|
element_types = inferred_type.types
|
|
1897
|
-
expect(element_types[0].class).to eq(
|
|
1898
|
-
expect(element_types[1].class).to eq(
|
|
1996
|
+
expect(element_types[0].class).to eq(PStringType)
|
|
1997
|
+
expect(element_types[1].class).to eq(PUndefType)
|
|
1998
|
+
end
|
|
1999
|
+
|
|
2000
|
+
it 'infers on an empty Array produces Array[Unit,0,0]' do
|
|
2001
|
+
inferred_type = calculator.infer([])
|
|
2002
|
+
expect(inferred_type.element_type.class).to eq(PUnitType)
|
|
2003
|
+
expect(inferred_type.size_range).to eq([0, 0])
|
|
2004
|
+
end
|
|
2005
|
+
|
|
2006
|
+
it 'infer_set on an empty Array produces Array[Unit,0,0]' do
|
|
2007
|
+
inferred_type = calculator.infer_set([])
|
|
2008
|
+
expect(inferred_type.element_type.class).to eq(PUnitType)
|
|
2009
|
+
expect(inferred_type.size_range).to eq([0, 0])
|
|
1899
2010
|
end
|
|
1900
2011
|
end
|
|
1901
2012
|
|
|
@@ -1921,8 +2032,7 @@ describe 'The type calculator' do
|
|
|
1921
2032
|
|
|
1922
2033
|
it 'with args array' do
|
|
1923
2034
|
required = callable_t(string_t)
|
|
1924
|
-
given = array_t(string_t)
|
|
1925
|
-
factory.constrain_size(given, 1, 1)
|
|
2035
|
+
given = array_t(string_t, range_t(1, 1))
|
|
1926
2036
|
expect(calculator.callable?(required, given)).to eq(true)
|
|
1927
2037
|
end
|
|
1928
2038
|
end
|
|
@@ -1981,7 +2091,7 @@ describe 'The type calculator' do
|
|
|
1981
2091
|
end
|
|
1982
2092
|
|
|
1983
2093
|
matcher :be_assignable_to do |type|
|
|
1984
|
-
calc =
|
|
2094
|
+
calc = TypeCalculator.singleton
|
|
1985
2095
|
|
|
1986
2096
|
match do |actual|
|
|
1987
2097
|
calc.assignable?(type, actual)
|
|
@@ -1995,5 +2105,6 @@ describe 'The type calculator' do
|
|
|
1995
2105
|
"#{calc.string(actual)} is assignable to #{calc.string(type)} when it should not"
|
|
1996
2106
|
end
|
|
1997
2107
|
end
|
|
1998
|
-
|
|
2108
|
+
end
|
|
2109
|
+
end
|
|
1999
2110
|
end
|