puppet 4.8.2-x64-mingw32 → 4.9.0-x64-mingw32
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.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +15 -0
- data/CONTRIBUTING.md +25 -1
- data/Gemfile +6 -0
- data/Rakefile +1 -0
- data/ext/project_data.yaml +5 -1
- data/ext/windows/service/daemon.rb +2 -1
- data/install.rb +43 -6
- data/lib/hiera/puppet_function.rb +15 -17
- data/lib/hiera/scope.rb +12 -14
- data/lib/puppet.rb +52 -0
- data/lib/puppet/application/face_base.rb +4 -0
- data/lib/puppet/application/lookup.rb +4 -2
- data/lib/puppet/application/resource.rb +1 -1
- data/lib/puppet/data_providers.rb +6 -3
- data/lib/puppet/data_providers/data_adapter.rb +6 -0
- data/lib/puppet/data_providers/data_function_support.rb +7 -0
- data/lib/puppet/data_providers/function_env_data_provider.rb +7 -0
- data/lib/puppet/data_providers/function_module_data_provider.rb +6 -0
- data/lib/puppet/data_providers/hiera_config.rb +31 -10
- data/lib/puppet/data_providers/hiera_env_data_provider.rb +6 -0
- data/lib/puppet/data_providers/hiera_interpolate.rb +2 -1
- data/lib/puppet/data_providers/hiera_module_data_provider.rb +6 -0
- data/lib/puppet/data_providers/hiera_support.rb +6 -0
- data/lib/puppet/data_providers/json_data_provider_factory.rb +12 -0
- data/lib/puppet/data_providers/yaml_data_provider_factory.rb +12 -0
- data/lib/puppet/defaults.rb +25 -4
- data/lib/puppet/face/ca.rb +2 -0
- data/lib/puppet/face/certificate_request.rb +2 -0
- data/lib/puppet/face/certificate_revocation_list.rb +2 -0
- data/lib/puppet/face/file.rb +3 -0
- data/lib/puppet/face/help.rb +19 -17
- data/lib/puppet/face/help/face.erb +3 -0
- data/lib/puppet/face/key.rb +1 -0
- data/lib/puppet/face/man.rb +4 -2
- data/lib/puppet/face/module/generate.rb +1 -1
- data/lib/puppet/face/status.rb +2 -0
- data/lib/puppet/feature/base.rb +9 -2
- data/lib/puppet/feature/hocon.rb +3 -0
- data/lib/puppet/file_system.rb +15 -3
- data/lib/puppet/file_system/windows.rb +8 -0
- data/lib/puppet/forge.rb +6 -6
- data/lib/puppet/forge/repository.rb +1 -2
- data/lib/puppet/functions/binary_file.rb +4 -10
- data/lib/puppet/functions/hiera_array.rb +1 -1
- data/lib/puppet/functions/hiera_include.rb +1 -1
- data/lib/puppet/functions/hocon_data.rb +24 -0
- data/lib/puppet/functions/json_data.rb +18 -0
- data/lib/puppet/functions/yaml_data.rb +21 -0
- data/lib/puppet/generate/type.rb +1 -1
- data/lib/puppet/graph/simple_graph.rb +4 -2
- data/lib/puppet/indirector/file_bucket_file/file.rb +10 -2
- data/lib/puppet/indirector/request.rb +5 -1
- data/lib/puppet/interface.rb +14 -2
- data/lib/puppet/interface/face_collection.rb +1 -1
- data/lib/puppet/module.rb +14 -2
- data/lib/puppet/module_tool.rb +4 -4
- data/lib/puppet/module_tool/applications/builder.rb +3 -2
- data/lib/puppet/module_tool/applications/installer.rb +14 -14
- data/lib/puppet/module_tool/applications/upgrader.rb +13 -13
- data/lib/puppet/module_tool/installed_modules.rb +7 -7
- data/lib/puppet/module_tool/local_tarball.rb +3 -3
- data/lib/puppet/module_tool/metadata.rb +1 -1
- data/lib/puppet/network/http/connection.rb +2 -0
- data/lib/puppet/network/http/webrick.rb +2 -1
- data/lib/puppet/parser/functions/hiera.rb +14 -0
- data/lib/puppet/parser/functions/hiera_array.rb +14 -0
- data/lib/puppet/parser/functions/hiera_hash.rb +14 -0
- data/lib/puppet/parser/functions/hiera_include.rb +14 -0
- data/lib/puppet/parser/scope.rb +14 -20
- data/lib/puppet/plugins/data_providers.rb +2 -0
- data/lib/puppet/plugins/data_providers/data_provider.rb +108 -17
- data/lib/puppet/plugins/data_providers/registry.rb +2 -36
- data/lib/puppet/pops.rb +6 -9
- data/lib/puppet/pops/adaptable.rb +0 -3
- data/lib/puppet/pops/binder/producers.rb +3 -3
- data/lib/puppet/pops/evaluator/access_operator.rb +4 -4
- data/lib/puppet/pops/evaluator/closure.rb +1 -1
- data/lib/puppet/pops/evaluator/compare_operator.rb +4 -4
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
- data/lib/puppet/pops/issues.rb +4 -0
- data/lib/puppet/pops/label_provider.rb +14 -0
- data/lib/puppet/pops/loader/loader_paths.rb +3 -1
- data/lib/puppet/pops/loader/module_loaders.rb +21 -7
- data/lib/puppet/pops/loader/typed_name.rb +0 -2
- data/lib/puppet/pops/loaders.rb +31 -12
- data/lib/puppet/pops/lookup.rb +4 -3
- data/lib/puppet/pops/lookup/configured_data_provider.rb +87 -0
- data/lib/puppet/pops/lookup/context.rb +121 -71
- data/lib/puppet/pops/lookup/data_adapter.rb +27 -0
- data/lib/puppet/pops/lookup/data_dig_function_provider.rb +55 -0
- data/lib/puppet/pops/lookup/data_hash_function_provider.rb +111 -0
- data/lib/puppet/pops/lookup/data_provider.rb +102 -0
- data/lib/puppet/pops/lookup/environment_data_provider.rb +27 -0
- data/lib/puppet/pops/lookup/explainer.rb +122 -82
- data/lib/puppet/pops/lookup/function_provider.rb +82 -0
- data/lib/puppet/pops/lookup/global_data_provider.rb +49 -0
- data/lib/puppet/pops/lookup/hiera_config.rb +601 -0
- data/lib/puppet/pops/lookup/interpolation.rb +56 -35
- data/lib/puppet/pops/lookup/invocation.rb +179 -101
- data/lib/puppet/pops/lookup/location_resolver.rb +72 -0
- data/lib/puppet/pops/lookup/lookup_adapter.rb +451 -0
- data/lib/puppet/pops/lookup/lookup_key.rb +99 -0
- data/lib/puppet/pops/lookup/lookup_key_function_provider.rb +119 -0
- data/lib/puppet/pops/lookup/module_data_provider.rb +58 -0
- data/lib/puppet/pops/lookup/sub_lookup.rb +8 -4
- data/lib/puppet/pops/merge_strategy.rb +120 -39
- data/lib/puppet/pops/parser/egrammar.ra +2 -0
- data/lib/puppet/pops/parser/eparser.rb +816 -808
- data/lib/puppet/pops/parser/locator.rb +3 -3
- data/lib/puppet/pops/parser/slurp_support.rb +4 -3
- data/lib/puppet/pops/pcore.rb +21 -12
- data/lib/puppet/pops/serialization/abstract_reader.rb +17 -7
- data/lib/puppet/pops/serialization/abstract_writer.rb +27 -12
- data/lib/puppet/pops/serialization/deserializer.rb +17 -4
- data/lib/puppet/pops/serialization/extension.rb +37 -8
- data/lib/puppet/pops/serialization/object.rb +14 -6
- data/lib/puppet/pops/serialization/rgen.rb +2 -1
- data/lib/puppet/pops/serialization/serializer.rb +30 -7
- data/lib/puppet/pops/types/implementation_registry.rb +1 -1
- data/lib/puppet/pops/types/p_object_type.rb +55 -12
- data/lib/puppet/pops/types/p_sem_ver_range_type.rb +27 -27
- data/lib/puppet/pops/types/p_sem_ver_type.rb +12 -12
- data/lib/puppet/pops/types/p_timespan_type.rb +6 -6
- data/lib/puppet/pops/types/p_timestamp_type.rb +2 -2
- data/lib/puppet/pops/types/p_type_set_type.rb +7 -16
- data/lib/puppet/pops/types/recursion_guard.rb +64 -20
- data/lib/puppet/pops/types/ruby_generator.rb +10 -0
- data/lib/puppet/pops/types/type_calculator.rb +23 -13
- data/lib/puppet/pops/types/type_factory.rb +20 -9
- data/lib/puppet/pops/types/type_formatter.rb +37 -17
- data/lib/puppet/pops/types/type_mismatch_describer.rb +7 -6
- data/lib/puppet/pops/types/type_parser.rb +6 -0
- data/lib/puppet/pops/types/types.rb +225 -132
- data/lib/puppet/pops/validation.rb +1 -1
- data/lib/puppet/pops/validation/checker4_0.rb +12 -2
- data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
- data/lib/puppet/pops/visitor.rb +4 -3
- data/lib/puppet/provider/mcx/mcxcontent.rb +2 -1
- data/lib/puppet/provider/nameservice.rb +15 -0
- data/lib/puppet/provider/package/appdmg.rb +1 -1
- data/lib/puppet/provider/package/dnf.rb +1 -1
- data/lib/puppet/provider/package/pkg.rb +1 -1
- data/lib/puppet/provider/package/pkgdmg.rb +1 -1
- data/lib/puppet/provider/package/pkgng.rb +1 -1
- data/lib/puppet/provider/package/rpm.rb +2 -2
- data/lib/puppet/provider/service/smf.rb +3 -3
- data/lib/puppet/provider/service/systemd.rb +5 -1
- data/lib/puppet/provider/user/directoryservice.rb +1 -0
- data/lib/puppet/provider/user/user_role_add.rb +15 -0
- data/lib/puppet/provider/yumrepo/inifile.rb +2 -2
- data/lib/puppet/provider/zone/solaris.rb +4 -1
- data/lib/puppet/reference/indirection.rb +1 -1
- data/lib/puppet/resource.rb +2 -3
- data/lib/puppet/resource/catalog.rb +12 -4
- data/lib/puppet/resource/type.rb +3 -3
- data/lib/puppet/settings.rb +1 -1
- data/lib/puppet/settings/config_file.rb +2 -1
- data/lib/puppet/settings/directory_setting.rb +6 -0
- data/lib/puppet/settings/environment_conf.rb +6 -2
- data/lib/puppet/settings/file_or_directory_setting.rb +6 -0
- data/lib/puppet/settings/file_setting.rb +10 -0
- data/lib/puppet/ssl/certificate_authority.rb +13 -2
- data/lib/puppet/ssl/host.rb +23 -1
- data/lib/puppet/transaction/additional_resource_generator.rb +7 -0
- data/lib/puppet/type/user.rb +16 -3
- data/lib/puppet/util.rb +1 -0
- data/lib/puppet/util/execution.rb +3 -3
- data/lib/puppet/util/filetype.rb +11 -5
- data/lib/puppet/util/logging.rb +2 -1
- data/lib/puppet/util/network_device/config.rb +1 -1
- data/lib/puppet/util/plist.rb +6 -0
- data/lib/puppet/util/profiler/aggregate.rb +1 -1
- data/lib/puppet/util/rdoc/generators/puppet_generator.rb +2 -2
- data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +2 -1
- data/lib/puppet/util/windows/adsi.rb +15 -12
- data/lib/puppet/vendor/load_semantic_puppet.rb +1 -0
- data/lib/puppet/vendor/pathspec/lib/pathspec.rb +2 -1
- data/lib/puppet/vendor/require_vendored.rb +0 -1
- data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +17 -0
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency.rb +7 -7
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph.rb +2 -2
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph_node.rb +2 -2
- data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/module_release.rb +58 -0
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/source.rb +2 -2
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/unsatisfiable_graph.rb +2 -2
- data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/gem_version.rb +3 -0
- data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/locales/config.yaml +21 -0
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version.rb +48 -21
- data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version_range.rb +15 -17
- data/lib/puppet/version.rb +1 -1
- data/lib/semver.rb +19 -12
- data/locales/config.yaml +29 -0
- data/locales/puppet.pot +79 -0
- data/man/man5/puppet.conf.5 +1 -1
- data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/{data.pp → environment/data.pp} +0 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +2 -0
- data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +1 -1
- data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/hiera.yaml +5 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet/bindings/backend/default.rb +9 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet_x/backend/special_data_provider_factory.rb +23 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/manifests/init.pp +5 -0
- data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/metadata.json +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/manifests/init.pp +1 -1
- data/spec/fixtures/unit/functions/lookup/data/common.yaml +19 -0
- data/spec/fixtures/unit/functions/lookup_fixture/data/common.yaml +19 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/environment.conf +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/lib/puppet/functions/environment/data.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/bindings/abc/default.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/bindings/bad_data/default.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/bindings/bca/default.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/functions/bca/data.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/data/empty.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/hiera.yaml +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/metadata.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/data/empty_key.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/hiera.yaml +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/metadata.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/data/empty_key.yaml +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/hiera.yaml +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/metadata.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/data/empty.yaml +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/hiera.yaml +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/metadata.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/data/first.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/hiera.yaml +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/metadata.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/metadata.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/manifests/init.pp +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/metadata.json +0 -0
- data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/no_provider/manifests/init.pp +0 -0
- data/spec/integration/application/apply_spec.rb +88 -2
- data/spec/integration/application/lookup_spec.rb +155 -0
- data/spec/integration/data_binding_spec.rb +5 -5
- data/spec/integration/defaults_spec.rb +13 -0
- data/spec/integration/environments/default_manifest_spec.rb +16 -16
- data/spec/integration/environments/setting_hooks_spec.rb +1 -1
- data/spec/integration/test/test_helper_spec.rb +6 -2
- data/spec/integration/transaction_spec.rb +74 -0
- data/spec/integration/util/execution_spec.rb +8 -0
- data/spec/lib/puppet_spec/module_tool/shared_functions.rb +2 -2
- data/spec/lib/puppet_spec/module_tool/stub_source.rb +1 -1
- data/spec/lib/puppet_spec/unindent.rb +2 -2
- data/spec/unit/application/face_base_spec.rb +16 -0
- data/spec/unit/application/lookup_spec.rb +262 -227
- data/spec/unit/data_providers/{sample_data_provider_spec.rb → custom_data_provider_spec.rb} +14 -16
- data/spec/unit/data_providers/function_data_provider_spec.rb +2 -2
- data/spec/unit/data_providers/hiera_data_provider_spec.rb +60 -97
- data/spec/unit/defaults_spec.rb +1 -1
- data/spec/unit/face/ca_spec.rb +10 -0
- data/spec/unit/face/certificate_request_spec.rb +10 -0
- data/spec/unit/face/certificate_revocation_list_spec.rb +10 -0
- data/spec/unit/face/file_spec.rb +4 -0
- data/spec/unit/face/help_spec.rb +17 -0
- data/spec/unit/face/key_spec.rb +10 -0
- data/spec/unit/face/status_spec.rb +10 -0
- data/spec/unit/file_system_spec.rb +143 -6
- data/spec/unit/functions/binary_file_spec.rb +1 -1
- data/spec/unit/functions/hiera_spec.rb +257 -47
- data/spec/unit/functions/lookup_fixture_spec.rb +693 -0
- data/spec/unit/functions/lookup_spec.rb +1319 -608
- data/spec/unit/functions/new_spec.rb +3 -3
- data/spec/unit/graph/rb_tree_map_spec.rb +1 -1
- data/spec/unit/graph/simple_graph_spec.rb +1 -1
- data/spec/unit/hiera/scope_spec.rb +4 -4
- data/spec/unit/indirector/request_spec.rb +9 -0
- data/spec/unit/interface_spec.rb +27 -0
- data/spec/unit/man_spec.rb +1 -1
- data/spec/unit/module_spec.rb +1 -1
- data/spec/unit/module_tool/applications/builder_spec.rb +16 -1
- data/spec/unit/module_tool/applications/installer_spec.rb +1 -1
- data/spec/unit/module_tool/applications/upgrader_spec.rb +1 -1
- data/spec/unit/module_tool/installed_modules_spec.rb +6 -6
- data/spec/unit/module_tool_spec.rb +3 -3
- data/spec/unit/network/http/connection_spec.rb +10 -0
- data/spec/unit/network/http/webrick_spec.rb +1 -1
- data/spec/unit/pops/evaluator/access_ops_spec.rb +2 -2
- data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +9 -9
- data/spec/unit/pops/loaders/environment_loader_spec.rb +172 -0
- data/spec/unit/pops/lookup/context_spec.rb +45 -16
- data/spec/unit/pops/lookup/interpolation_spec.rb +28 -20
- data/spec/unit/pops/lookup/lookup_spec.rb +197 -0
- data/spec/unit/pops/merge_strategy_spec.rb +18 -0
- data/spec/unit/pops/parser/lexer2_spec.rb +16 -1
- data/spec/unit/pops/parser/parse_site_spec.rb +4 -0
- data/spec/unit/pops/serialization/packer_spec.rb +4 -23
- data/spec/unit/pops/serialization/serialization_spec.rb +32 -8
- data/spec/unit/pops/types/p_object_type_spec.rb +68 -3
- data/spec/unit/pops/types/p_sem_ver_type_spec.rb +4 -4
- data/spec/unit/pops/types/p_type_set_type_spec.rb +31 -2
- data/spec/unit/pops/types/type_acceptor_spec.rb +18 -17
- data/spec/unit/pops/types/type_calculator_spec.rb +39 -40
- data/spec/unit/pops/types/type_factory_spec.rb +3 -3
- data/spec/unit/pops/types/type_formatter_spec.rb +7 -3
- data/spec/unit/pops/types/type_mismatch_describer_spec.rb +13 -2
- data/spec/unit/pops/types/types_spec.rb +25 -2
- data/spec/unit/pops/validator/validator_spec.rb +60 -4
- data/spec/unit/provider/nameservice_spec.rb +42 -0
- data/spec/unit/provider/package/aptrpm_spec.rb +1 -1
- data/spec/unit/provider/package/pkg_spec.rb +22 -0
- data/spec/unit/provider/package/pkgng_spec.rb +12 -0
- data/spec/unit/provider/package/rpm_spec.rb +8 -8
- data/spec/unit/provider/service/smf_spec.rb +13 -11
- data/spec/unit/provider/service/systemd_spec.rb +8 -1
- data/spec/unit/provider/user/useradd_spec.rb +1 -0
- data/spec/unit/puppet_spec.rb +14 -0
- data/spec/unit/resource/catalog_spec.rb +15 -9
- data/spec/unit/resource_spec.rb +20 -17
- data/spec/unit/semver_spec.rb +14 -0
- data/spec/unit/ssl/certificate_authority_spec.rb +12 -1
- data/spec/unit/transaction/additional_resource_generator_spec.rb +11 -0
- data/spec/unit/type/user_spec.rb +32 -6
- data/spec/unit/util/filetype_spec.rb +3 -3
- data/spec/unit/util/yaml_spec.rb +1 -1
- data/spec/unit/util_spec.rb +10 -2
- data/tasks/i18n.rake +20 -0
- metadata +2661 -2607
- data/lib/puppet/data_providers/lookup_adapter.rb +0 -254
- data/lib/puppet/vendor/load_semantic.rb +0 -1
- data/lib/puppet/vendor/semantic/Gemfile +0 -20
- data/lib/puppet/vendor/semantic/PUPPET_README.md +0 -6
- data/lib/puppet/vendor/semantic/Rakefile +0 -69
- data/lib/puppet/vendor/semantic/lib/semantic.rb +0 -7
- data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +0 -60
- data/lib/puppet/vendor/semantic/spec/spec_helper.rb +0 -24
- data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_node_spec.rb +0 -141
- data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_spec.rb +0 -162
- data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/module_release_spec.rb +0 -143
- data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/source_spec.rb +0 -5
- data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/unsatisfiable_graph_spec.rb +0 -44
- data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency_spec.rb +0 -383
- data/lib/puppet/vendor/semantic/spec/unit/semantic/version_range_spec.rb +0 -307
- data/lib/puppet/vendor/semantic/spec/unit/semantic/version_spec.rb +0 -608
- data/spec/fixtures/unit/data_providers/environments/sample/manifests/site.pp +0 -6
| @@ -513,7 +513,15 @@ describe 'Lexer2' do | |
| 513 513 | 
             
                  "x\\u2713y"
         | 
| 514 514 | 
             
                  CODE
         | 
| 515 515 | 
             
                  # >= Ruby 1.9.3 reports \u
         | 
| 516 | 
            -
             | 
| 516 | 
            +
                  expect(tokens_scanned_from(code)).to match_tokens2([:STRING, "x\u2713y"])
         | 
| 517 | 
            +
                end
         | 
| 518 | 
            +
             | 
| 519 | 
            +
                it 'should support adjacent short form unicode characters' do
         | 
| 520 | 
            +
                  code = <<-CODE
         | 
| 521 | 
            +
                  "x\\u2713\\u2713y"
         | 
| 522 | 
            +
                  CODE
         | 
| 523 | 
            +
                  # >= Ruby 1.9.3 reports \u
         | 
| 524 | 
            +
                  expect(tokens_scanned_from(code)).to match_tokens2([:STRING, "x\u2713\u2713y"])
         | 
| 517 525 | 
             
                end
         | 
| 518 526 |  | 
| 519 527 | 
             
                it 'should support unicode characters in long form' do
         | 
| @@ -523,6 +531,13 @@ describe 'Lexer2' do | |
| 523 531 | 
             
                  expect(tokens_scanned_from(code)).to match_tokens2([:STRING, "x\u{1f452}y"])
         | 
| 524 532 | 
             
                end
         | 
| 525 533 |  | 
| 534 | 
            +
                it 'can escape the unicode escape' do
         | 
| 535 | 
            +
                  code = <<-"CODE"
         | 
| 536 | 
            +
                  "x\\\\u{1f452}y"
         | 
| 537 | 
            +
                  CODE
         | 
| 538 | 
            +
                  expect(tokens_scanned_from(code)).to match_tokens2([:STRING, "x\\u{1f452}y"])
         | 
| 539 | 
            +
                end
         | 
| 540 | 
            +
             | 
| 526 541 | 
             
                it 'produces byte offsets that counts each byte in a comment' do
         | 
| 527 542 | 
             
                  code = <<-"CODE"
         | 
| 528 543 | 
             
                  # \u{0400}\na
         | 
| @@ -42,6 +42,10 @@ describe "egrammar parsing of site expression" do | |
| 42 42 | 
             
                  it "allows the keyword '#{keyword}' as a value in a hash" do
         | 
| 43 43 | 
             
                    expect(dump(parse("$a = {'x'=>#{keyword}}"))).to(eq("(= $a ({} ('x' '#{keyword}')))"))
         | 
| 44 44 | 
             
                  end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                  it "allows the keyword '#{keyword}' as an attribute name" do
         | 
| 47 | 
            +
                    expect(dump(parse("foo { 'x': #{keyword} => 'value' } "))).to eql("(resource foo\n  ('x'\n    (#{keyword} => 'value')))")
         | 
| 48 | 
            +
                  end
         | 
| 45 49 | 
             
                end
         | 
| 46 50 | 
             
              end
         | 
| 47 51 | 
             
            end
         | 
| @@ -87,15 +87,6 @@ describe "the Puppet::Pops::Serialization when using #{packer_module.name}" do | |
| 87 87 | 
             
                  expect(val2).to eql(val)
         | 
| 88 88 | 
             
                end
         | 
| 89 89 |  | 
| 90 | 
            -
                it 'Sensitive' do
         | 
| 91 | 
            -
                  sval = 'the sensitive value'
         | 
| 92 | 
            -
                  val = Types::PSensitiveType::Sensitive.new(sval)
         | 
| 93 | 
            -
                  write(val)
         | 
| 94 | 
            -
                  val2 = read
         | 
| 95 | 
            -
                  expect(val2).to be_a(Types::PSensitiveType::Sensitive)
         | 
| 96 | 
            -
                  expect(val2.unwrap).to eql(sval)
         | 
| 97 | 
            -
                end
         | 
| 98 | 
            -
             | 
| 99 90 | 
             
                it 'Timespan' do
         | 
| 100 91 | 
             
                  val = Time::Timespan.from_fields(false, 3, 12, 40, 31, 123)
         | 
| 101 92 | 
             
                  write(val)
         | 
| @@ -113,18 +104,18 @@ describe "the Puppet::Pops::Serialization when using #{packer_module.name}" do | |
| 113 104 | 
             
                end
         | 
| 114 105 |  | 
| 115 106 | 
             
                it 'Version' do
         | 
| 116 | 
            -
                  val =  | 
| 107 | 
            +
                  val = SemanticPuppet::Version.parse('1.2.3-alpha2')
         | 
| 117 108 | 
             
                  write(val)
         | 
| 118 109 | 
             
                  val2 = read
         | 
| 119 | 
            -
                  expect(val2).to be_a( | 
| 110 | 
            +
                  expect(val2).to be_a(SemanticPuppet::Version)
         | 
| 120 111 | 
             
                  expect(val2).to eql(val)
         | 
| 121 112 | 
             
                end
         | 
| 122 113 |  | 
| 123 114 | 
             
                it 'VersionRange' do
         | 
| 124 | 
            -
                  val =  | 
| 115 | 
            +
                  val = SemanticPuppet::VersionRange.parse('>=1.2.3-alpha2 <1.2.4')
         | 
| 125 116 | 
             
                  write(val)
         | 
| 126 117 | 
             
                  val2 = read
         | 
| 127 | 
            -
                  expect(val2).to be_a( | 
| 118 | 
            +
                  expect(val2).to be_a(SemanticPuppet::VersionRange)
         | 
| 128 119 | 
             
                  expect(val2).to eql(val)
         | 
| 129 120 | 
             
                end
         | 
| 130 121 |  | 
| @@ -135,16 +126,6 @@ describe "the Puppet::Pops::Serialization when using #{packer_module.name}" do | |
| 135 126 | 
             
                  expect(val2).to be_a(Types::PBinaryType::Binary)
         | 
| 136 127 | 
             
                  expect(val2).to eql(val)
         | 
| 137 128 | 
             
                end
         | 
| 138 | 
            -
             | 
| 139 | 
            -
                it 'Sensitive with rich data' do
         | 
| 140 | 
            -
                  sval = Time::Timestamp.now
         | 
| 141 | 
            -
                  val = Types::PSensitiveType::Sensitive.new(sval)
         | 
| 142 | 
            -
                  write(val)
         | 
| 143 | 
            -
                  val2 = read
         | 
| 144 | 
            -
                  expect(val2).to be_a(Types::PSensitiveType::Sensitive)
         | 
| 145 | 
            -
                  expect(val2.unwrap).to be_a(Time::Timestamp)
         | 
| 146 | 
            -
                  expect(val2.unwrap).to eql(sval)
         | 
| 147 | 
            -
                end
         | 
| 148 129 | 
             
              end
         | 
| 149 130 |  | 
| 150 131 | 
             
              context 'will fail on attempts to write' do
         | 
| @@ -121,19 +121,19 @@ module Serialization | |
| 121 121 |  | 
| 122 122 | 
             
                it 'Version' do
         | 
| 123 123 | 
             
                  # It does succeed on rare occasions, so we need to repeat
         | 
| 124 | 
            -
                  val =  | 
| 124 | 
            +
                  val = SemanticPuppet::Version.parse('1.2.3-alpha2')
         | 
| 125 125 | 
             
                  write(val)
         | 
| 126 126 | 
             
                  val2 = read
         | 
| 127 | 
            -
                  expect(val2).to be_a( | 
| 127 | 
            +
                  expect(val2).to be_a(SemanticPuppet::Version)
         | 
| 128 128 | 
             
                  expect(val2).to eql(val)
         | 
| 129 129 | 
             
                end
         | 
| 130 130 |  | 
| 131 131 | 
             
                it 'VersionRange' do
         | 
| 132 132 | 
             
                  # It does succeed on rare occasions, so we need to repeat
         | 
| 133 | 
            -
                  val =  | 
| 133 | 
            +
                  val = SemanticPuppet::VersionRange.parse('>=1.2.3-alpha2 <1.2.4')
         | 
| 134 134 | 
             
                  write(val)
         | 
| 135 135 | 
             
                  val2 = read
         | 
| 136 | 
            -
                  expect(val2).to be_a( | 
| 136 | 
            +
                  expect(val2).to be_a(SemanticPuppet::VersionRange)
         | 
| 137 137 | 
             
                  expect(val2).to eql(val)
         | 
| 138 138 | 
             
                end
         | 
| 139 139 |  | 
| @@ -186,6 +186,30 @@ module Serialization | |
| 186 186 | 
             
                    expect(val2).to eql(val)
         | 
| 187 187 | 
             
                  end
         | 
| 188 188 |  | 
| 189 | 
            +
                  it 'Collection' do
         | 
| 190 | 
            +
                    val = Types::TypeFactory.collection(Types::TypeFactory.range(0, 20))
         | 
| 191 | 
            +
                    write(val)
         | 
| 192 | 
            +
                    val2 = read
         | 
| 193 | 
            +
                    expect(val2).to be_a(Types::PCollectionType)
         | 
| 194 | 
            +
                    expect(val2).to eql(val)
         | 
| 195 | 
            +
                  end
         | 
| 196 | 
            +
             | 
| 197 | 
            +
                  it 'Array' do
         | 
| 198 | 
            +
                    val = Types::TypeFactory.array_of(Types::TypeFactory.integer, Types::TypeFactory.range(0, 20))
         | 
| 199 | 
            +
                    write(val)
         | 
| 200 | 
            +
                    val2 = read
         | 
| 201 | 
            +
                    expect(val2).to be_a(Types::PArrayType)
         | 
| 202 | 
            +
                    expect(val2).to eql(val)
         | 
| 203 | 
            +
                  end
         | 
| 204 | 
            +
             | 
| 205 | 
            +
                  it 'Hash' do
         | 
| 206 | 
            +
                    val = Types::TypeFactory.hash_kv(Types::TypeFactory.string, Types::TypeFactory.integer, Types::TypeFactory.range(0, 20))
         | 
| 207 | 
            +
                    write(val)
         | 
| 208 | 
            +
                    val2 = read
         | 
| 209 | 
            +
                    expect(val2).to be_a(Types::PHashType)
         | 
| 210 | 
            +
                    expect(val2).to eql(val)
         | 
| 211 | 
            +
                  end
         | 
| 212 | 
            +
             | 
| 189 213 | 
             
                  it 'Variant' do
         | 
| 190 214 | 
             
                    val = Types::TypeFactory.variant(Types::TypeFactory.string, Types::TypeFactory.range(1, :default))
         | 
| 191 215 | 
             
                    write(val)
         | 
| @@ -208,8 +232,8 @@ module Serialization | |
| 208 232 | 
             
                  val = [
         | 
| 209 233 | 
             
                    Time::Timespan.from_fields(false, 3, 12, 40, 31, 123),
         | 
| 210 234 | 
             
                    Time::Timestamp.now,
         | 
| 211 | 
            -
                     | 
| 212 | 
            -
                     | 
| 235 | 
            +
                    SemanticPuppet::Version.parse('1.2.3-alpha2'),
         | 
| 236 | 
            +
                    SemanticPuppet::VersionRange.parse('>=1.2.3-alpha2 <1.2.4'),
         | 
| 213 237 | 
             
                    Types::PBinaryType::Binary.from_base64('w5ZzdGVuIG1lZCByw7ZzdGVuCg==')
         | 
| 214 238 | 
             
                  ]
         | 
| 215 239 | 
             
                  write(val)
         | 
| @@ -222,8 +246,8 @@ module Serialization | |
| 222 246 | 
             
                  val = {
         | 
| 223 247 | 
             
                    'duration' => Time::Timespan.from_fields(false, 3, 12, 40, 31, 123),
         | 
| 224 248 | 
             
                    'time' => Time::Timestamp.now,
         | 
| 225 | 
            -
                    'version' =>  | 
| 226 | 
            -
                    'range' =>  | 
| 249 | 
            +
                    'version' => SemanticPuppet::Version.parse('1.2.3-alpha2'),
         | 
| 250 | 
            +
                    'range' => SemanticPuppet::VersionRange.parse('>=1.2.3-alpha2 <1.2.4'),
         | 
| 227 251 | 
             
                    'binary' => Types::PBinaryType::Binary.from_base64('w5ZzdGVuIG1lZCByw7ZzdGVuCg==')
         | 
| 228 252 | 
             
                  }
         | 
| 229 253 | 
             
                  write(val)
         | 
| @@ -9,9 +9,15 @@ describe 'The Object Type' do | |
| 9 9 |  | 
| 10 10 | 
             
              let(:parser) { TypeParser.singleton }
         | 
| 11 11 | 
             
              let(:pp_parser) { Parser::EvaluatingParser.new }
         | 
| 12 | 
            -
              let(:loader) {  | 
| 12 | 
            +
              let(:loader) { Loaders.find_loader(nil) }
         | 
| 13 13 | 
             
              let(:factory) { TypeFactory }
         | 
| 14 14 |  | 
| 15 | 
            +
              around(:each) do |example|
         | 
| 16 | 
            +
                Puppet.override(:loaders => Loaders.new(Puppet::Node::Environment.create(:testing, []))) do
         | 
| 17 | 
            +
                  example.run
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 15 21 | 
             
              def type_object_t(name, body_string)
         | 
| 16 22 | 
             
                object = PObjectType.new(name, pp_parser.parse_string("{#{body_string}}").current.body)
         | 
| 17 23 | 
             
                loader.set_entry(Loader::TypedName.new(:type, name.downcase), object)
         | 
| @@ -148,7 +154,7 @@ describe 'The Object Type' do | |
| 148 154 | 
             
              end
         | 
| 149 155 |  | 
| 150 156 | 
             
              context 'when dealing with functions' do
         | 
| 151 | 
            -
                it 'raises an error  | 
| 157 | 
            +
                it 'raises an error unless the function type is a Type[Callable]' do
         | 
| 152 158 | 
             
                  obj = <<-OBJECT
         | 
| 153 159 | 
             
                    functions => {
         | 
| 154 160 | 
             
                      a => String
         | 
| @@ -207,7 +213,7 @@ describe 'The Object Type' do | |
| 207 213 | 
             
                    'function MyDerivedObject[a] attempts to override attribute MyObject[a]')
         | 
| 208 214 | 
             
                end
         | 
| 209 215 |  | 
| 210 | 
            -
                it 'raises an error when the  | 
| 216 | 
            +
                it 'raises an error when the a function overrides an attribute' do
         | 
| 211 217 | 
             
                  parent = <<-OBJECT
         | 
| 212 218 | 
             
                    functions => {
         | 
| 213 219 | 
             
                      a => Callable
         | 
| @@ -699,6 +705,43 @@ describe 'The Object Type' do | |
| 699 705 | 
             
                end
         | 
| 700 706 | 
             
              end
         | 
| 701 707 |  | 
| 708 | 
            +
              context 'when stringifying created instances' do
         | 
| 709 | 
            +
                it 'outputs a Puppet constructor using the initializer hash' do
         | 
| 710 | 
            +
                  code = <<-CODE
         | 
| 711 | 
            +
                  type Spec::MyObject = Object[{attributes => { a => Integer }}]
         | 
| 712 | 
            +
                  type Spec::MySecondObject = Object[{parent => Spec::MyObject, attributes => { b => String }}]
         | 
| 713 | 
            +
                  notice(Spec::MySecondObject(42, 'Meaning of life'))
         | 
| 714 | 
            +
                  CODE
         | 
| 715 | 
            +
                  expect(eval_and_collect_notices(code)).to eql(["Spec::MySecondObject({\n  'a' => 42,\n  'b' => 'Meaning of life'\n})"])
         | 
| 716 | 
            +
                end
         | 
| 717 | 
            +
              end
         | 
| 718 | 
            +
             | 
| 719 | 
            +
              context 'when used from Ruby' do
         | 
| 720 | 
            +
                it 'can create an instance without scope using positional arguments' do
         | 
| 721 | 
            +
                  parse_object('MyObject', <<-OBJECT)
         | 
| 722 | 
            +
                    attributes => {
         | 
| 723 | 
            +
                      a => { type => Integer }
         | 
| 724 | 
            +
                    }
         | 
| 725 | 
            +
                  OBJECT
         | 
| 726 | 
            +
             | 
| 727 | 
            +
                  t = Puppet::Pops::Types::TypeParser.singleton.parse('MyObject', Puppet::Pops::Loaders.find_loader(nil))
         | 
| 728 | 
            +
                  instance = t.create(32)
         | 
| 729 | 
            +
                  expect(instance.a).to eql(32)
         | 
| 730 | 
            +
                end
         | 
| 731 | 
            +
             | 
| 732 | 
            +
                it 'can create an instance without scope using initialization hash' do
         | 
| 733 | 
            +
                  parse_object('MyObject', <<-OBJECT)
         | 
| 734 | 
            +
                    attributes => {
         | 
| 735 | 
            +
                      a => { type => Integer }
         | 
| 736 | 
            +
                    }
         | 
| 737 | 
            +
                  OBJECT
         | 
| 738 | 
            +
             | 
| 739 | 
            +
                  t = Puppet::Pops::Types::TypeParser.singleton.parse('MyObject', Puppet::Pops::Loaders.find_loader(nil))
         | 
| 740 | 
            +
                  instance = t.from_hash('a' => 32)
         | 
| 741 | 
            +
                  expect(instance.a).to eql(32)
         | 
| 742 | 
            +
                end
         | 
| 743 | 
            +
              end
         | 
| 744 | 
            +
             | 
| 702 745 | 
             
              context 'when used in Puppet expressions' do
         | 
| 703 746 | 
             
                it 'two anonymous empty objects are equal' do
         | 
| 704 747 | 
             
                  code = <<-CODE
         | 
| @@ -763,6 +806,28 @@ describe 'The Object Type' do | |
| 763 806 | 
             
                    /attribute MySecondObject\[a\] attempts to override final attribute MyObject\[a\]/)
         | 
| 764 807 | 
             
                end
         | 
| 765 808 |  | 
| 809 | 
            +
                it 'can inherit from an aliased type' do
         | 
| 810 | 
            +
                  code = <<-CODE
         | 
| 811 | 
            +
                  type MyObject = Object[{ name => 'MyFirstObject', attributes => { a => Integer }}]
         | 
| 812 | 
            +
                  type MyObjectAlias = MyObject
         | 
| 813 | 
            +
                  type MySecondObject = Object[{ parent => MyObjectAlias, attributes => { b => String }}]
         | 
| 814 | 
            +
                  notice(MySecondObject < MyObjectAlias)
         | 
| 815 | 
            +
                  notice(MySecondObject < MyObject)
         | 
| 816 | 
            +
                  CODE
         | 
| 817 | 
            +
                  expect(eval_and_collect_notices(code)).to eql(['true', 'true'])
         | 
| 818 | 
            +
                end
         | 
| 819 | 
            +
             | 
| 820 | 
            +
                it 'detects equality duplication when inherited from an aliased type' do
         | 
| 821 | 
            +
                  code = <<-CODE
         | 
| 822 | 
            +
                  type MyObject = Object[{ name => 'MyFirstObject', attributes => { a => Integer }}]
         | 
| 823 | 
            +
                  type MyObjectAlias = MyObject
         | 
| 824 | 
            +
                  type MySecondObject = Object[{ parent => MyObjectAlias, attributes => { b => String }, equality => a}]
         | 
| 825 | 
            +
                  notice(MySecondObject < MyObject)
         | 
| 826 | 
            +
                  CODE
         | 
| 827 | 
            +
                  expect { eval_and_collect_notices(code) }.to raise_error(Puppet::Error,
         | 
| 828 | 
            +
                    /MySecondObject equality is referencing attribute MyObject\[a\] which is included in equality of MyObject/)
         | 
| 829 | 
            +
                end
         | 
| 830 | 
            +
             | 
| 766 831 | 
             
                it 'raises an error when object when circular inheritance is detected' do
         | 
| 767 832 | 
             
                  code = <<-CODE
         | 
| 768 833 | 
             
                  type MyFirstObject = Object[{
         | 
| @@ -20,12 +20,12 @@ describe 'Semantic Versions' do | |
| 20 20 | 
             
                  end
         | 
| 21 21 |  | 
| 22 22 | 
             
                  it 'returns its argument when the argument is a version' do
         | 
| 23 | 
            -
                    v =  | 
| 23 | 
            +
                    v = SemanticPuppet::Version.new(1,0,0)
         | 
| 24 24 | 
             
                    expect(PSemVerType.convert(v)).to equal(v)
         | 
| 25 25 | 
             
                  end
         | 
| 26 26 |  | 
| 27 27 | 
             
                  it 'converts a valid version string argument to a version' do
         | 
| 28 | 
            -
                    v =  | 
| 28 | 
            +
                    v = SemanticPuppet::Version.new(1,0,0)
         | 
| 29 29 | 
             
                    expect(PSemVerType.convert('1.0.0')).to eq(v)
         | 
| 30 30 | 
             
                  end
         | 
| 31 31 |  | 
| @@ -42,12 +42,12 @@ describe 'Semantic Versions' do | |
| 42 42 | 
             
                  end
         | 
| 43 43 |  | 
| 44 44 | 
             
                  it 'returns its argument when the argument is a version range' do
         | 
| 45 | 
            -
                    vr =  | 
| 45 | 
            +
                    vr = SemanticPuppet::VersionRange.parse('1.x')
         | 
| 46 46 | 
             
                    expect(PSemVerRangeType.convert(vr)).to equal(vr)
         | 
| 47 47 | 
             
                  end
         | 
| 48 48 |  | 
| 49 49 | 
             
                  it 'converts a valid version string argument to a version range' do
         | 
| 50 | 
            -
                    vr =  | 
| 50 | 
            +
                    vr = SemanticPuppet::VersionRange.parse('1.x')
         | 
| 51 51 | 
             
                    expect(PSemVerRangeType.convert('1.x')).to eq(vr)
         | 
| 52 52 | 
             
                  end
         | 
| 53 53 |  | 
| @@ -123,7 +123,7 @@ module Puppet::Pops | |
| 123 123 | 
             
                        version => '1.x',
         | 
| 124 124 | 
             
                        pcore_version => '1.0.0',
         | 
| 125 125 | 
             
                        OBJECT
         | 
| 126 | 
            -
                        expect { parse_type_set('MySet', ts) }.to raise_error( | 
| 126 | 
            +
                        expect { parse_type_set('MySet', ts) }.to raise_error(SemanticPuppet::Version::ValidationFailure)
         | 
| 127 127 | 
             
                      end
         | 
| 128 128 |  | 
| 129 129 | 
             
                      it 'the pcore_version is an invalid semantic version' do
         | 
| @@ -131,7 +131,7 @@ module Puppet::Pops | |
| 131 131 | 
             
                        version => '1.0.0',
         | 
| 132 132 | 
             
                        pcore_version => '1.x',
         | 
| 133 133 | 
             
                        OBJECT
         | 
| 134 | 
            -
                        expect { parse_type_set('MySet', ts) }.to raise_error( | 
| 134 | 
            +
                        expect { parse_type_set('MySet', ts) }.to raise_error(SemanticPuppet::Version::ValidationFailure)
         | 
| 135 135 | 
             
                      end
         | 
| 136 136 |  | 
| 137 137 | 
             
                      it 'the pcore_version is outside of the range of that is parsable by this runtime' do
         | 
| @@ -419,6 +419,35 @@ module Puppet::Pops | |
| 419 419 | 
             
                      OBJECT
         | 
| 420 420 | 
             
                    end
         | 
| 421 421 | 
             
                  end
         | 
| 422 | 
            +
             | 
| 423 | 
            +
                  it '#name_for method reports the name of deeply nested type correctly' do
         | 
| 424 | 
            +
                    tv = parse_type_set('Vehicles', <<-OBJECT)
         | 
| 425 | 
            +
                        version => '1.0.0',
         | 
| 426 | 
            +
                        pcore_version => '1.0.0',
         | 
| 427 | 
            +
                        types => { Car => Object[{}] }
         | 
| 428 | 
            +
                    OBJECT
         | 
| 429 | 
            +
                    tt = parse_type_set('Transports', <<-OBJECT)
         | 
| 430 | 
            +
                        version => '1.0.0',
         | 
| 431 | 
            +
                        pcore_version => '1.0.0',
         | 
| 432 | 
            +
                        references => {
         | 
| 433 | 
            +
                          Vecs => {
         | 
| 434 | 
            +
                            name => 'Vehicles',
         | 
| 435 | 
            +
                            version_range => '1.x'
         | 
| 436 | 
            +
                          }
         | 
| 437 | 
            +
                        }
         | 
| 438 | 
            +
                    OBJECT
         | 
| 439 | 
            +
                    ts = parse_type_set('TheSet', <<-OBJECT)
         | 
| 440 | 
            +
                        version => '1.0.0',
         | 
| 441 | 
            +
                        pcore_version => '1.0.0',
         | 
| 442 | 
            +
                        references => {
         | 
| 443 | 
            +
                          T => {
         | 
| 444 | 
            +
                            name => 'Transports',
         | 
| 445 | 
            +
                            version_range => '1.x'
         | 
| 446 | 
            +
                          }
         | 
| 447 | 
            +
                        }
         | 
| 448 | 
            +
                    OBJECT
         | 
| 449 | 
            +
                    expect(ts.name_for(tv['Car'], nil)).to eql('T::Vecs::Car')
         | 
| 450 | 
            +
                  end
         | 
| 422 451 | 
             
                end
         | 
| 423 452 | 
             
              end
         | 
| 424 453 | 
             
            end
         | 
| @@ -1,24 +1,25 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 2 | 
             
            require 'puppet/pops/types/type_acceptor'
         | 
| 3 3 |  | 
| 4 | 
            +
            class PuppetSpec::TestTypeAcceptor
         | 
| 5 | 
            +
              include Puppet::Pops::Types::TypeAcceptor
         | 
| 6 | 
            +
              attr_reader :visitors, :guard
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              def initialize
         | 
| 9 | 
            +
                @visitors = []
         | 
| 10 | 
            +
                @guard = nil
         | 
| 11 | 
            +
              end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              def visit(type, guard)
         | 
| 14 | 
            +
                @visitors << type
         | 
| 15 | 
            +
                @guard = guard
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
            end
         | 
| 18 | 
            +
             | 
| 4 19 | 
             
            module Puppet::Pops::Types
         | 
| 5 20 | 
             
            describe 'the Puppet::Pops::Types::TypeAcceptor' do
         | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
                  include TypeAcceptor
         | 
| 9 | 
            -
                  attr_reader :visitors, :guard
         | 
| 10 | 
            -
             | 
| 11 | 
            -
                  def initialize
         | 
| 12 | 
            -
                    @visitors = []
         | 
| 13 | 
            -
                    @guard = nil
         | 
| 14 | 
            -
                  end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
                  def visit(type, guard)
         | 
| 17 | 
            -
                    @visitors << type
         | 
| 18 | 
            -
                    @guard = guard
         | 
| 19 | 
            -
                  end
         | 
| 20 | 
            -
                end
         | 
| 21 | 
            -
              end
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              let!(:acceptor_class) { PuppetSpec::TestTypeAcceptor }
         | 
| 22 23 |  | 
| 23 24 | 
             
              let(:acceptor) { acceptor_class.new }
         | 
| 24 25 | 
             
              let(:guard) { RecursionGuard.new }
         | 
| @@ -102,4 +103,4 @@ describe 'the Puppet::Pops::Types::TypeAcceptor' do | |
| 102 103 | 
             
                expect(acceptor.visitors).to include(t, PStringType::DEFAULT, PIntegerType::DEFAULT)
         | 
| 103 104 | 
             
              end
         | 
| 104 105 | 
             
            end
         | 
| 105 | 
            -
            end
         | 
| 106 | 
            +
            end
         | 
| @@ -18,12 +18,12 @@ describe 'The type calculator' do | |
| 18 18 | 
             
                TypeFactory.regexp(pattern)
         | 
| 19 19 | 
             
              end
         | 
| 20 20 |  | 
| 21 | 
            -
              def string_t( | 
| 22 | 
            -
                TypeFactory.string( | 
| 21 | 
            +
              def string_t(string = nil)
         | 
| 22 | 
            +
                TypeFactory.string(string)
         | 
| 23 23 | 
             
              end
         | 
| 24 24 |  | 
| 25 | 
            -
              def constrained_string_t(size_type | 
| 26 | 
            -
                TypeFactory.string(size_type | 
| 25 | 
            +
              def constrained_string_t(size_type)
         | 
| 26 | 
            +
                TypeFactory.string(size_type)
         | 
| 27 27 | 
             
              end
         | 
| 28 28 |  | 
| 29 29 | 
             
              def callable_t(*params)
         | 
| @@ -141,7 +141,7 @@ describe 'The type calculator' do | |
| 141 141 | 
             
                it 'inferred string type knows the string value' do
         | 
| 142 142 | 
             
                  t = calculator.infer('foo')
         | 
| 143 143 | 
             
                  expect(t.class).to eq(PStringType)
         | 
| 144 | 
            -
                  expect(t. | 
| 144 | 
            +
                  expect(t.value).to eq('foo')
         | 
| 145 145 | 
             
                end
         | 
| 146 146 |  | 
| 147 147 | 
             
                it 'boolean true translates to PBooleanType' do
         | 
| @@ -222,15 +222,15 @@ describe 'The type calculator' do | |
| 222 222 |  | 
| 223 223 | 
             
                context 'version' do
         | 
| 224 224 | 
             
                  it 'translates to PVersionType' do
         | 
| 225 | 
            -
                    expect(calculator.infer( | 
| 225 | 
            +
                    expect(calculator.infer(SemanticPuppet::Version.new(1,0,0)).class).to eq(PSemVerType)
         | 
| 226 226 | 
             
                  end
         | 
| 227 227 |  | 
| 228 228 | 
             
                  it 'range translates to PVersionRangeType' do
         | 
| 229 | 
            -
                    expect(calculator.infer( | 
| 229 | 
            +
                    expect(calculator.infer(SemanticPuppet::VersionRange.parse('1.x')).class).to eq(PSemVerRangeType)
         | 
| 230 230 | 
             
                  end
         | 
| 231 231 |  | 
| 232 232 | 
             
                  it 'translates to a limited PVersionType by infer_set' do
         | 
| 233 | 
            -
                    v =  | 
| 233 | 
            +
                    v = SemanticPuppet::Version.new(1,0,0)
         | 
| 234 234 | 
             
                    t = calculator.infer_set(v)
         | 
| 235 235 | 
             
                    expect(t.class).to eq(PSemVerType)
         | 
| 236 236 | 
             
                    expect(t.ranges.size).to eq(1)
         | 
| @@ -287,9 +287,9 @@ describe 'The type calculator' do | |
| 287 287 | 
             
                    expect(t.to).to eq(42)
         | 
| 288 288 | 
             
                  end
         | 
| 289 289 |  | 
| 290 | 
            -
                  it 'Compound string values are  | 
| 290 | 
            +
                  it 'Compound string values are converted to enums' do
         | 
| 291 291 | 
             
                    t = calculator.infer(['a','b', 'c']).element_type
         | 
| 292 | 
            -
                    expect(t.class).to eq( | 
| 292 | 
            +
                    expect(t.class).to eq(PEnumType)
         | 
| 293 293 | 
             
                    expect(t.values).to eq(['a', 'b', 'c'])
         | 
| 294 294 | 
             
                  end
         | 
| 295 295 |  | 
| @@ -326,16 +326,16 @@ describe 'The type calculator' do | |
| 326 326 | 
             
                  end
         | 
| 327 327 |  | 
| 328 328 | 
             
                  it 'with arrays of string values translates to PArrayType[PArrayType[PStringType]]' do
         | 
| 329 | 
            -
                    et = calculator.infer([['first' 'array'], ['second','array']])
         | 
| 329 | 
            +
                    et = calculator.infer([['first', 'array'], ['second','array']])
         | 
| 330 330 | 
             
                    expect(et.class).to eq(PArrayType)
         | 
| 331 331 | 
             
                    et = et.element_type
         | 
| 332 332 | 
             
                    expect(et.class).to eq(PArrayType)
         | 
| 333 333 | 
             
                    et = et.element_type
         | 
| 334 | 
            -
                    expect(et.class).to eq( | 
| 334 | 
            +
                    expect(et.class).to eq(PEnumType)
         | 
| 335 335 | 
             
                  end
         | 
| 336 336 |  | 
| 337 337 | 
             
                  it 'with array of string values and array of fixnums translates to PArrayType[PArrayType[PScalarType]]' do
         | 
| 338 | 
            -
                    et = calculator.infer([['first' 'array'], [1,2]])
         | 
| 338 | 
            +
                    et = calculator.infer([['first', 'array'], [1,2]])
         | 
| 339 339 | 
             
                    expect(et.class).to eq(PArrayType)
         | 
| 340 340 | 
             
                    et = et.element_type
         | 
| 341 341 | 
             
                    expect(et.class).to eq(PArrayType)
         | 
| @@ -343,13 +343,13 @@ describe 'The type calculator' do | |
| 343 343 | 
             
                    expect(et.class).to eq(PScalarType)
         | 
| 344 344 | 
             
                  end
         | 
| 345 345 |  | 
| 346 | 
            -
                  it 'with hashes of string values translates to PArrayType[PHashType[ | 
| 346 | 
            +
                  it 'with hashes of string values translates to PArrayType[PHashType[PEnumType]]' do
         | 
| 347 347 | 
             
                    et = calculator.infer([{:first => 'first', :second => 'second' }, {:first => 'first', :second => 'second' }])
         | 
| 348 348 | 
             
                    expect(et.class).to eq(PArrayType)
         | 
| 349 349 | 
             
                    et = et.element_type
         | 
| 350 350 | 
             
                    expect(et.class).to eq(PHashType)
         | 
| 351 | 
            -
                    et = et. | 
| 352 | 
            -
                    expect(et.class).to eq( | 
| 351 | 
            +
                    et = et.value_type
         | 
| 352 | 
            +
                    expect(et.class).to eq(PEnumType)
         | 
| 353 353 | 
             
                  end
         | 
| 354 354 |  | 
| 355 355 | 
             
                  it 'with hash of string values and hash of fixnums translates to PArrayType[PHashType[PScalarType]]' do
         | 
| @@ -357,7 +357,7 @@ describe 'The type calculator' do | |
| 357 357 | 
             
                    expect(et.class).to eq(PArrayType)
         | 
| 358 358 | 
             
                    et = et.element_type
         | 
| 359 359 | 
             
                    expect(et.class).to eq(PHashType)
         | 
| 360 | 
            -
                    et = et. | 
| 360 | 
            +
                    et = et.value_type
         | 
| 361 361 | 
             
                    expect(et.class).to eq(PScalarType)
         | 
| 362 362 | 
             
                  end
         | 
| 363 363 | 
             
                end
         | 
| @@ -374,12 +374,12 @@ describe 'The type calculator' do | |
| 374 374 | 
             
                    expect(k.runtime_type_name).to eq('Symbol')
         | 
| 375 375 | 
             
                  end
         | 
| 376 376 |  | 
| 377 | 
            -
                  it 'with string keys translates to PHashType[ | 
| 378 | 
            -
                    expect(calculator.infer({'first' => 1, 'second' => 2}).key_type.class).to eq( | 
| 377 | 
            +
                  it 'with string keys translates to PHashType[PEnumType, value]' do
         | 
| 378 | 
            +
                    expect(calculator.infer({'first' => 1, 'second' => 2}).key_type.class).to eq(PEnumType)
         | 
| 379 379 | 
             
                  end
         | 
| 380 380 |  | 
| 381 381 | 
             
                  it 'with fixnum values translates to PHashType[key, PIntegerType]' do
         | 
| 382 | 
            -
                    expect(calculator.infer({:first => 1, :second => 2}). | 
| 382 | 
            +
                    expect(calculator.infer({:first => 1, :second => 2}).value_type.class).to eq(PIntegerType)
         | 
| 383 383 | 
             
                  end
         | 
| 384 384 |  | 
| 385 385 | 
             
                  it 'when empty infers a type that answers true to is_the_empty_hash?' do
         | 
| @@ -435,8 +435,8 @@ describe 'The type calculator' do | |
| 435 435 | 
             
                  expect(t.patterns[0].regexp.match('abc')[1]).to eq('b')
         | 
| 436 436 | 
             
                end
         | 
| 437 437 |  | 
| 438 | 
            -
                it 'constructs a  | 
| 439 | 
            -
                  t =  | 
| 438 | 
            +
                it 'constructs a PEnumType with multiple strings' do
         | 
| 439 | 
            +
                  t = enum_t('a', 'b', 'c', 'abc')
         | 
| 440 440 | 
             
                  expect(t.values).to eq(['a', 'b', 'c', 'abc'].sort)
         | 
| 441 441 | 
             
                end
         | 
| 442 442 | 
             
              end
         | 
| @@ -482,7 +482,7 @@ describe 'The type calculator' do | |
| 482 482 | 
             
                    t1 = string_t('abc')
         | 
| 483 483 | 
             
                    t2 = string_t('xyz')
         | 
| 484 484 | 
             
                    common_t = calculator.common_type(t1,t2)
         | 
| 485 | 
            -
                    expect(common_t.class).to eq( | 
| 485 | 
            +
                    expect(common_t.class).to eq(PEnumType)
         | 
| 486 486 | 
             
                    expect(common_t.values).to eq(['abc', 'xyz'])
         | 
| 487 487 | 
             
                  end
         | 
| 488 488 |  | 
| @@ -503,11 +503,11 @@ describe 'The type calculator' do | |
| 503 503 | 
             
                  end
         | 
| 504 504 |  | 
| 505 505 | 
             
                  it 'computes values to be empty if the one has empty values' do
         | 
| 506 | 
            -
                    t1 =  | 
| 506 | 
            +
                    t1 = string_t('apa')
         | 
| 507 507 | 
             
                    t2 = constrained_string_t(range_t(2,4))
         | 
| 508 508 | 
             
                    common_t = calculator.common_type(t1,t2)
         | 
| 509 509 | 
             
                    expect(common_t.class).to eq(PStringType)
         | 
| 510 | 
            -
                    expect(common_t. | 
| 510 | 
            +
                    expect(common_t.value).to be_nil
         | 
| 511 511 | 
             
                  end
         | 
| 512 512 | 
             
                end
         | 
| 513 513 |  | 
| @@ -1154,7 +1154,7 @@ describe 'The type calculator' do | |
| 1154 1154 |  | 
| 1155 1155 | 
             
                  it 'should accept multiple strings if they all match any patterns' do
         | 
| 1156 1156 | 
             
                    p_t = pattern_t('X', 'Y', 'abc')
         | 
| 1157 | 
            -
                    p_s =  | 
| 1157 | 
            +
                    p_s = enum_t('Xa', 'aY', 'abc')
         | 
| 1158 1158 | 
             
                    expect(calculator.assignable?(p_t, p_s)).to eq(true)
         | 
| 1159 1159 | 
             
                  end
         | 
| 1160 1160 |  | 
| @@ -1166,7 +1166,7 @@ describe 'The type calculator' do | |
| 1166 1166 |  | 
| 1167 1167 | 
             
                  it 'should reject multiple strings if not all match any patterns' do
         | 
| 1168 1168 | 
             
                    p_t = pattern_t('abc', 'ab', 'c', 'q')
         | 
| 1169 | 
            -
                    p_s =  | 
| 1169 | 
            +
                    p_s = enum_t('X', 'Y', 'Z')
         | 
| 1170 1170 | 
             
                    expect(calculator.assignable?(p_t, p_s)).to eq(false)
         | 
| 1171 1171 | 
             
                  end
         | 
| 1172 1172 |  | 
| @@ -1661,9 +1661,8 @@ describe 'The type calculator' do | |
| 1661 1661 | 
             
                end
         | 
| 1662 1662 |  | 
| 1663 1663 | 
             
                it 'should consider string values' do
         | 
| 1664 | 
            -
                  string = string_t('a' | 
| 1664 | 
            +
                  string = string_t('a')
         | 
| 1665 1665 | 
             
                  expect(calculator.instance?(string, 'a')).to eq(true)
         | 
| 1666 | 
            -
                  expect(calculator.instance?(string, 'b')).to eq(true)
         | 
| 1667 1666 | 
             
                  expect(calculator.instance?(string, 'c')).to eq(false)
         | 
| 1668 1667 | 
             
                end
         | 
| 1669 1668 |  | 
| @@ -1936,7 +1935,7 @@ describe 'The type calculator' do | |
| 1936 1935 | 
             
                  t = calculator.type(Hash)
         | 
| 1937 1936 | 
             
                  expect(t.class).to eq(PHashType)
         | 
| 1938 1937 | 
             
                  expect(t.key_type.class).to eq(PScalarType)
         | 
| 1939 | 
            -
                  expect(t. | 
| 1938 | 
            +
                  expect(t.value_type.class).to eq(PDataType)
         | 
| 1940 1939 | 
             
                end
         | 
| 1941 1940 | 
             
              end
         | 
| 1942 1941 |  | 
| @@ -2066,25 +2065,25 @@ describe 'The type calculator' do | |
| 2066 2065 | 
             
                end
         | 
| 2067 2066 |  | 
| 2068 2067 | 
             
                it 'a generic inference is produced using infer_generic' do
         | 
| 2069 | 
            -
                  expect(calculator.infer_generic(['a','b']).element_type | 
| 2068 | 
            +
                  expect(calculator.infer_generic(['a','b']).element_type).to eql(string_t(range_t(1,1)))
         | 
| 2070 2069 | 
             
                end
         | 
| 2071 2070 |  | 
| 2072 2071 | 
             
                it 'a generic result is created by generalize given an instance specific result for an Array' do
         | 
| 2073 2072 | 
             
                  generic = calculator.infer(['a','b'])
         | 
| 2074 | 
            -
                  expect(generic.element_type.values).to eq(['a', | 
| 2073 | 
            +
                  expect(generic.element_type.values).to eq(['a','b'])
         | 
| 2075 2074 | 
             
                  generic = generic.generalize
         | 
| 2076 | 
            -
                  expect(generic.element_type | 
| 2075 | 
            +
                  expect(generic.element_type).to eql(string_t(range_t(1,1)))
         | 
| 2077 2076 | 
             
                end
         | 
| 2078 2077 |  | 
| 2079 2078 | 
             
                it 'a generic result is created by generalize given an instance specific result for a Hash' do
         | 
| 2080 | 
            -
                  generic = calculator.infer({'a' =>1,' | 
| 2081 | 
            -
                  expect(generic.key_type.values.sort).to eq(['a', ' | 
| 2082 | 
            -
                  expect(generic. | 
| 2083 | 
            -
                  expect(generic. | 
| 2079 | 
            +
                  generic = calculator.infer({'a' =>1,'bcd' => 2})
         | 
| 2080 | 
            +
                  expect(generic.key_type.values.sort).to eq(['a', 'bcd'])
         | 
| 2081 | 
            +
                  expect(generic.value_type.from).to eq(1)
         | 
| 2082 | 
            +
                  expect(generic.value_type.to).to eq(2)
         | 
| 2084 2083 | 
             
                  generic = generic.generalize
         | 
| 2085 | 
            -
                  expect(generic.key_type. | 
| 2086 | 
            -
                  expect(generic. | 
| 2087 | 
            -
                  expect(generic. | 
| 2084 | 
            +
                  expect(generic.key_type.size_type).to eq(range_t(1,3))
         | 
| 2085 | 
            +
                  expect(generic.value_type.from).to eq(nil)
         | 
| 2086 | 
            +
                  expect(generic.value_type.to).to eq(nil)
         | 
| 2088 2087 | 
             
                end
         | 
| 2089 2088 |  | 
| 2090 2089 | 
             
                it 'ensures that Struct key types are not generalized' do
         |