puppet 4.5.3-x64-mingw32 → 4.6.1-x64-mingw32
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of puppet might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/Gemfile +10 -1
- data/ext/debian/control +2 -4
- data/ext/project_data.yaml +4 -4
- data/install.rb +6 -2
- data/lib/puppet.rb +3 -1
- data/lib/puppet/agent/locker.rb +1 -1
- data/lib/puppet/application.rb +6 -4
- data/lib/puppet/application/agent.rb +2 -1
- data/lib/puppet/application/cert.rb +35 -2
- data/lib/puppet/application/device.rb +1 -1
- data/lib/puppet/application/generate.rb +5 -0
- data/lib/puppet/application/lookup.rb +3 -3
- data/lib/puppet/application_support.rb +1 -1
- data/lib/puppet/compilable_resource_type.rb +15 -0
- data/lib/puppet/configurer.rb +67 -10
- data/lib/puppet/configurer/plugin_handler.rb +2 -4
- data/lib/puppet/data_providers/hiera_config.rb +1 -1
- data/lib/puppet/defaults.rb +34 -7
- data/lib/puppet/environments.rb +4 -2
- data/lib/puppet/error.rb +1 -1
- data/lib/puppet/external/dot.rb +1 -1
- data/lib/puppet/face/ca.rb +4 -1
- data/lib/puppet/face/certificate.rb +7 -1
- data/lib/puppet/face/epp.rb +5 -5
- data/lib/puppet/face/generate.rb +64 -0
- data/lib/puppet/face/help.rb +19 -13
- data/lib/puppet/face/man.rb +1 -1
- data/lib/puppet/feature/external_facts.rb +1 -1
- data/lib/puppet/file_system.rb +16 -0
- data/lib/puppet/file_system/file_impl.rb +5 -0
- data/lib/puppet/file_system/memory_impl.rb +4 -0
- data/lib/puppet/file_system/path_pattern.rb +1 -0
- data/lib/puppet/file_system/windows.rb +19 -0
- data/lib/puppet/functions.rb +3 -5
- data/lib/puppet/functions/assert_type.rb +1 -1
- data/lib/puppet/functions/defined.rb +7 -5
- data/lib/puppet/functions/dig.rb +2 -18
- data/lib/puppet/functions/hiera.rb +1 -1
- data/lib/puppet/functions/lest.rb +1 -37
- data/lib/puppet/functions/new.rb +2 -473
- data/lib/puppet/functions/reverse_each.rb +2 -59
- data/lib/puppet/functions/scanf.rb +4 -4
- data/lib/puppet/functions/step.rb +1 -63
- data/lib/puppet/functions/then.rb +1 -61
- data/lib/puppet/functions/type.rb +1 -40
- data/lib/puppet/functions/unwrap.rb +40 -0
- data/lib/puppet/generate/models/type/property.rb +70 -0
- data/lib/puppet/generate/models/type/type.rb +57 -0
- data/lib/puppet/generate/templates/type/pcore.erb +41 -0
- data/lib/puppet/generate/type.rb +239 -0
- data/lib/puppet/graph/simple_graph.rb +2 -6
- data/lib/puppet/indirector/catalog/static_compiler.rb +5 -2
- data/lib/puppet/indirector/facts/facter.rb +1 -1
- data/lib/puppet/indirector/key/ca.rb +2 -2
- data/lib/puppet/indirector/request.rb +25 -4
- data/lib/puppet/indirector/rest.rb +73 -3
- data/lib/puppet/info_service/class_information_service.rb +1 -2
- data/lib/puppet/interface/documentation.rb +1 -1
- data/lib/puppet/loaders.rb +2 -0
- data/lib/puppet/metatype/manager.rb +6 -6
- data/lib/puppet/module.rb +8 -1
- data/lib/puppet/module_tool.rb +2 -2
- data/lib/puppet/module_tool/checksums.rb +1 -1
- data/lib/puppet/module_tool/errors/installer.rb +2 -2
- data/lib/puppet/module_tool/metadata.rb +1 -1
- data/lib/puppet/network/http/api/indirected_routes.rb +23 -32
- data/lib/puppet/network/http/rack/rest.rb +15 -1
- data/lib/puppet/network/rights.rb +1 -11
- data/lib/puppet/node/environment.rb +7 -3
- data/lib/puppet/node/facts.rb +1 -1
- data/lib/puppet/parameter.rb +23 -3
- data/lib/puppet/parameter/boolean.rb +1 -1
- data/lib/puppet/parameter/value.rb +1 -1
- data/lib/puppet/parser.rb +0 -1
- data/lib/puppet/parser/ast/pops_bridge.rb +1 -1
- data/lib/puppet/parser/ast/resource.rb +5 -0
- data/lib/puppet/parser/ast/resource_instance.rb +5 -1
- data/lib/puppet/parser/ast/resourceparam.rb +5 -0
- data/lib/puppet/parser/compiler.rb +14 -17
- data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +1 -1
- data/lib/puppet/parser/environment_compiler.rb +10 -0
- data/lib/puppet/parser/functions/create_resources.rb +39 -24
- data/lib/puppet/parser/functions/defined.rb +2 -26
- data/lib/puppet/parser/functions/dig.rb +29 -0
- data/lib/puppet/parser/functions/lest.rb +49 -0
- data/lib/puppet/parser/functions/new.rb +530 -0
- data/lib/puppet/parser/functions/require.rb +1 -1
- data/lib/puppet/parser/functions/reverse_each.rb +83 -0
- data/lib/puppet/parser/functions/scanf.rb +4 -4
- data/lib/puppet/parser/functions/step.rb +84 -0
- data/lib/puppet/parser/functions/then.rb +73 -0
- data/lib/puppet/parser/functions/type.rb +53 -0
- data/lib/puppet/parser/resource.rb +16 -7
- data/lib/puppet/parser/scope.rb +36 -28
- data/lib/puppet/parser/type_loader.rb +1 -1
- data/lib/puppet/plugins/data_providers/data_provider.rb +1 -1
- data/lib/puppet/pops.rb +13 -0
- data/lib/puppet/pops/adapters.rb +49 -49
- data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +1 -1
- data/lib/puppet/pops/evaluator/access_operator.rb +39 -2
- data/lib/puppet/pops/evaluator/closure.rb +39 -13
- data/lib/puppet/pops/evaluator/collector_transformer.rb +10 -1
- data/lib/puppet/pops/evaluator/evaluator_impl.rb +16 -11
- data/lib/puppet/pops/evaluator/external_syntax_support.rb +1 -1
- data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +0 -1
- data/lib/puppet/pops/evaluator/literal_evaluator.rb +0 -1
- data/lib/puppet/pops/evaluator/relationship_operator.rb +1 -2
- data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +119 -0
- data/lib/puppet/pops/evaluator/runtime3_support.rb +19 -45
- data/lib/puppet/pops/functions/function.rb +5 -0
- data/lib/puppet/pops/issues.rb +1 -1
- data/lib/puppet/pops/label_provider.rb +2 -2
- data/lib/puppet/pops/loader/base_loader.rb +12 -15
- data/lib/puppet/pops/loader/loader.rb +15 -50
- data/lib/puppet/pops/loader/loader_paths.rb +28 -2
- data/lib/puppet/pops/loader/module_loaders.rb +16 -1
- data/lib/puppet/pops/loader/null_loader.rb +17 -1
- data/lib/puppet/pops/loader/puppet_function_instantiator.rb +12 -11
- data/lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb +80 -0
- data/lib/puppet/pops/loader/ruby_function_instantiator.rb +2 -3
- data/lib/puppet/pops/loader/runtime3_type_loader.rb +52 -13
- data/lib/puppet/pops/loader/static_loader.rb +55 -0
- data/lib/puppet/pops/loader/type_definition_instantiator.rb +30 -14
- data/lib/puppet/pops/loader/typed_name.rb +50 -0
- data/lib/puppet/pops/loaders.rb +64 -19
- data/lib/puppet/pops/merge_strategy.rb +7 -7
- data/lib/puppet/pops/migration/migration_checker.rb +4 -0
- data/lib/puppet/pops/model/model_label_provider.rb +2 -0
- data/lib/puppet/pops/parser/egrammar.ra +8 -5
- data/lib/puppet/pops/parser/eparser.rb +1550 -1498
- data/lib/puppet/pops/parser/evaluating_parser.rb +1 -1
- data/lib/puppet/pops/parser/interpolation_support.rb +7 -0
- data/lib/puppet/pops/parser/lexer2.rb +14 -1
- data/lib/puppet/pops/parser/locator.rb +30 -1
- data/lib/puppet/pops/parser/parser_support.rb +0 -3
- data/lib/puppet/pops/parser/slurp_support.rb +3 -3
- data/lib/puppet/pops/patterns.rb +9 -1
- data/lib/puppet/pops/pcore.rb +67 -11
- data/lib/puppet/pops/puppet_stack.rb +43 -0
- data/lib/puppet/pops/resource/param.rb +51 -0
- data/lib/puppet/pops/resource/resource_type_impl.rb +301 -0
- data/lib/puppet/pops/resource/resource_type_set.pcore +21 -0
- data/lib/puppet/pops/serialization.rb +17 -0
- data/lib/puppet/pops/serialization/abstract_reader.rb +149 -0
- data/lib/puppet/pops/serialization/abstract_writer.rb +179 -0
- data/lib/puppet/pops/serialization/deserializer.rb +60 -0
- data/lib/puppet/pops/serialization/extension.rb +126 -0
- data/lib/puppet/pops/serialization/instance_reader.rb +19 -0
- data/lib/puppet/pops/serialization/instance_writer.rb +14 -0
- data/lib/puppet/pops/serialization/json.rb +247 -0
- data/lib/puppet/pops/serialization/object.rb +63 -0
- data/lib/puppet/pops/serialization/rgen.rb +151 -0
- data/lib/puppet/pops/serialization/serializer.rb +91 -0
- data/lib/puppet/pops/serialization/time_factory.rb +66 -0
- data/lib/puppet/pops/types/annotatable.rb +36 -0
- data/lib/puppet/pops/types/implementation_registry.rb +3 -8
- data/lib/puppet/pops/types/p_meta_type.rb +83 -0
- data/lib/puppet/pops/types/p_object_type.rb +110 -117
- data/lib/puppet/pops/types/p_runtime_type.rb +13 -0
- data/lib/puppet/pops/types/p_sem_ver_range_type.rb +23 -0
- data/lib/puppet/pops/types/p_sem_ver_type.rb +30 -2
- data/lib/puppet/pops/types/p_sensitive_type.rb +69 -0
- data/lib/puppet/pops/types/p_type_set_type.rb +361 -0
- data/lib/puppet/pops/types/puppet_object.rb +0 -5
- data/lib/puppet/pops/types/ruby_generator.rb +9 -2
- data/lib/puppet/pops/types/type_calculator.rb +6 -1
- data/lib/puppet/pops/types/type_factory.rb +14 -12
- data/lib/puppet/pops/types/type_formatter.rb +78 -33
- data/lib/puppet/pops/types/type_mismatch_describer.rb +0 -2
- data/lib/puppet/pops/types/type_parser.rb +27 -2
- data/lib/puppet/pops/types/type_set_reference.rb +59 -0
- data/lib/puppet/pops/types/types.rb +366 -13
- data/lib/puppet/pops/validation.rb +4 -4
- data/lib/puppet/pops/validation/checker4_0.rb +5 -2
- data/lib/puppet/pops/visitor.rb +2 -2
- data/lib/puppet/property.rb +64 -5
- data/lib/puppet/provider.rb +1 -1
- data/lib/puppet/provider/aixobject.rb +3 -3
- data/lib/puppet/provider/group/aix.rb +4 -4
- data/lib/puppet/provider/macauthorization/macauthorization.rb +1 -1
- data/lib/puppet/provider/mailalias/aliases.rb +1 -1
- data/lib/puppet/provider/mcx/mcxcontent.rb +2 -2
- data/lib/puppet/provider/mount/parsed.rb +1 -1
- data/lib/puppet/provider/nameservice/directoryservice.rb +5 -5
- data/lib/puppet/provider/package/appdmg.rb +3 -3
- data/lib/puppet/provider/package/apple.rb +1 -1
- data/lib/puppet/provider/package/dnf.rb +5 -0
- data/lib/puppet/provider/package/nim.rb +1 -1
- data/lib/puppet/provider/package/pacman.rb +2 -2
- data/lib/puppet/provider/package/pip.rb +5 -3
- data/lib/puppet/provider/package/pip3.rb +1 -1
- data/lib/puppet/provider/package/pkg.rb +5 -5
- data/lib/puppet/provider/package/pkgdmg.rb +4 -4
- data/lib/puppet/provider/package/pkgin.rb +1 -1
- data/lib/puppet/provider/package/pkgutil.rb +1 -1
- data/lib/puppet/provider/package/portage.rb +48 -8
- data/lib/puppet/provider/package/sun.rb +1 -1
- data/lib/puppet/provider/package/tdnf.rb +28 -0
- data/lib/puppet/provider/package/yum.rb +22 -4
- data/lib/puppet/provider/parsedfile.rb +2 -2
- data/lib/puppet/provider/service/base.rb +1 -1
- data/lib/puppet/provider/service/bsd.rb +1 -1
- data/lib/puppet/provider/service/daemontools.rb +2 -2
- data/lib/puppet/provider/service/debian.rb +3 -3
- data/lib/puppet/provider/service/init.rb +5 -3
- data/lib/puppet/provider/service/launchd.rb +16 -2
- data/lib/puppet/provider/service/runit.rb +1 -1
- data/lib/puppet/provider/service/smf.rb +8 -1
- data/lib/puppet/provider/service/systemd.rb +39 -6
- data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
- data/lib/puppet/provider/user/aix.rb +3 -2
- data/lib/puppet/provider/user/directoryservice.rb +4 -3
- data/lib/puppet/provider/user/hpux.rb +1 -1
- data/lib/puppet/provider/user/user_role_add.rb +1 -1
- data/lib/puppet/provider/user/windows_adsi.rb +3 -0
- data/lib/puppet/provider/zfs/zfs.rb +1 -1
- data/lib/puppet/reference/type.rb +1 -1
- data/lib/puppet/resource.rb +33 -7
- data/lib/puppet/resource/capability_finder.rb +74 -54
- data/lib/puppet/resource/status.rb +11 -2
- data/lib/puppet/settings.rb +17 -6
- data/lib/puppet/settings/environment_conf.rb +1 -1
- data/lib/puppet/settings/server_list_setting.rb +20 -0
- data/lib/puppet/ssl/certificate_authority.rb +32 -9
- data/lib/puppet/ssl/certificate_authority/interface.rb +164 -24
- data/lib/puppet/ssl/host.rb +3 -3
- data/lib/puppet/ssl/oids.rb +10 -0
- data/lib/puppet/ssl/validator/default_validator.rb +2 -2
- data/lib/puppet/test/test_helper.rb +2 -2
- data/lib/puppet/transaction.rb +12 -0
- data/lib/puppet/transaction/additional_resource_generator.rb +1 -1
- data/lib/puppet/transaction/event.rb +29 -2
- data/lib/puppet/transaction/event_manager.rb +1 -1
- data/lib/puppet/transaction/persistence.rb +84 -0
- data/lib/puppet/transaction/report.rb +49 -2
- data/lib/puppet/transaction/resource_harness.rb +98 -18
- data/lib/puppet/type.rb +63 -21
- data/lib/puppet/type/augeas.rb +3 -3
- data/lib/puppet/type/cron.rb +1 -1
- data/lib/puppet/type/file.rb +39 -2
- data/lib/puppet/type/file/data_sync.rb +13 -5
- data/lib/puppet/type/host.rb +1 -1
- data/lib/puppet/type/mount.rb +2 -6
- data/lib/puppet/type/notify.rb +1 -1
- data/lib/puppet/type/package.rb +1 -1
- data/lib/puppet/type/resources.rb +1 -1
- data/lib/puppet/type/scheduled_task.rb +1 -1
- data/lib/puppet/type/ssh_authorized_key.rb +2 -2
- data/lib/puppet/type/tidy.rb +1 -1
- data/lib/puppet/type/yumrepo.rb +3 -3
- data/lib/puppet/type/zone.rb +1 -1
- data/lib/puppet/util.rb +2 -2
- data/lib/puppet/util/classgen.rb +1 -1
- data/lib/puppet/util/command_line.rb +6 -2
- data/lib/puppet/util/command_line/trollop.rb +1 -1
- data/lib/puppet/util/execution.rb +2 -2
- data/lib/puppet/util/http_proxy.rb +1 -1
- data/lib/puppet/util/inifile.rb +1 -1
- data/lib/puppet/util/instance_loader.rb +1 -1
- data/lib/puppet/util/logging.rb +1 -1
- data/lib/puppet/util/multi_match.rb +1 -1
- data/lib/puppet/util/plist.rb +15 -5
- data/lib/puppet/util/profiler.rb +1 -1
- data/lib/puppet/util/profiler/around_profiler.rb +1 -1
- data/lib/puppet/util/psych_support.rb +1 -1
- data/lib/puppet/util/rdoc.rb +2 -2
- data/lib/puppet/util/rubygems.rb +1 -1
- data/lib/puppet/util/watcher/periodic_watcher.rb +2 -2
- data/lib/puppet/util/windows/access_control_entry.rb +1 -1
- data/lib/puppet/util/windows/adsi.rb +30 -8
- data/lib/puppet/util/windows/api_types.rb +1 -1
- data/lib/puppet/util/windows/file.rb +59 -0
- data/lib/puppet/util/windows/process.rb +10 -0
- data/lib/puppet/util/windows/security.rb +1 -1
- data/lib/puppet/util/windows/user.rb +22 -4
- data/lib/puppet/util/yaml.rb +15 -3
- data/lib/puppet/vendor/deep_merge/test/test_deep_merge.rb +1 -1
- data/lib/puppet/vendor/rgen_patch.rb +1 -1
- data/lib/puppet/version.rb +2 -2
- data/spec/fixtures/unit/pops/loaders/loaders/no_modules/manifests/site.pp +10 -0
- data/spec/integration/agent/logging_spec.rb +15 -14
- data/spec/integration/application/apply_spec.rb +1 -0
- data/spec/integration/directory_environments_spec.rb +16 -0
- data/spec/integration/environments/settings_spec.rb +32 -4
- data/spec/integration/faces/documentation_spec.rb +1 -1
- data/spec/integration/network/http/api/indirected_routes_spec.rb +33 -0
- data/spec/integration/node/environment_spec.rb +21 -0
- data/spec/integration/parser/collection_spec.rb +10 -0
- data/spec/integration/parser/compiler_spec.rb +76 -840
- data/spec/integration/parser/functions/require_spec.rb +3 -3
- data/spec/integration/parser/parameter_defaults_spec.rb +6 -2
- data/spec/integration/parser/pcore_resource_spec.rb +208 -0
- data/spec/integration/parser/resource_expressions_spec.rb +4 -2
- data/spec/integration/provider/yumrepo_spec.rb +4 -1
- data/spec/integration/transaction/report_spec.rb +666 -0
- data/spec/integration/type/file_spec.rb +11 -12
- data/spec/integration/util/windows/adsi_spec.rb +99 -0
- data/spec/integration/util/windows/principal_spec.rb +109 -60
- data/spec/integration/util/windows/process_spec.rb +4 -2
- data/spec/integration/util/windows/security_spec.rb +34 -8
- data/spec/integration/util/windows/user_spec.rb +26 -4
- data/spec/lib/puppet_spec/files.rb +2 -2
- data/spec/lib/puppet_spec/network.rb +12 -8
- data/spec/shared_examples/rhel_package_provider.rb +341 -0
- data/spec/spec_helper.rb +8 -2
- data/spec/unit/application/cert_spec.rb +20 -0
- data/spec/unit/configurer/plugin_handler_spec.rb +0 -26
- data/spec/unit/configurer_spec.rb +46 -0
- data/spec/unit/defaults_spec.rb +14 -0
- data/spec/unit/face/generate_spec.rb +230 -0
- data/spec/unit/face/help_spec.rb +53 -0
- data/spec/unit/face/parser_spec.rb +6 -0
- data/spec/unit/face/plugin_spec.rb +0 -4
- data/spec/unit/file_system_spec.rb +85 -0
- data/spec/unit/functions/lookup_spec.rb +4 -4
- data/spec/unit/functions/match_spec.rb +2 -2
- data/spec/unit/functions/regsubst_spec.rb +1 -1
- data/spec/unit/functions/split_spec.rb +1 -1
- data/spec/unit/functions/unwrap_spec.rb +29 -0
- data/spec/unit/functions/versioncmp_spec.rb +1 -1
- data/spec/unit/functions4_spec.rb +8 -8
- data/spec/unit/indirector/facts/facter_spec.rb +1 -9
- data/spec/unit/indirector/rest_spec.rb +95 -9
- data/spec/unit/module_spec.rb +43 -7
- data/spec/unit/module_tool/applications/installer_spec.rb +10 -1
- data/spec/unit/module_tool/applications/unpacker_spec.rb +2 -1
- data/spec/unit/module_tool/applications/upgrader_spec.rb +8 -0
- data/spec/unit/module_tool/tar/mini_spec.rb +3 -3
- data/spec/unit/network/http/api/indirected_routes_spec.rb +49 -58
- data/spec/unit/network/http/api/master/v3_spec.rb +7 -4
- data/spec/unit/network/rights_spec.rb +1 -1
- data/spec/unit/parameter_spec.rb +11 -0
- data/spec/unit/parser/compiler_spec.rb +19 -33
- data/spec/unit/{appmgmt_spec.rb → parser/environment_compiler_spec.rb} +12 -1
- data/spec/unit/parser/functions/create_resources_spec.rb +76 -4
- data/spec/unit/parser/functions/require_spec.rb +2 -2
- data/spec/unit/parser/resource_spec.rb +21 -11
- data/spec/unit/parser/scope_spec.rb +1 -5
- data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +1 -1
- data/spec/unit/pops/loaders/dependency_loader_spec.rb +1 -1
- data/spec/unit/pops/loaders/loader_paths_spec.rb +1 -1
- data/spec/unit/pops/loaders/loaders_spec.rb +63 -5
- data/spec/unit/pops/loaders/module_loaders_spec.rb +2 -2
- data/spec/unit/pops/loaders/static_loader_spec.rb +1 -1
- data/spec/unit/pops/parser/lexer2_spec.rb +27 -3
- data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +8 -0
- data/spec/unit/pops/parser/parse_calls_spec.rb +9 -0
- data/spec/unit/pops/puppet_stack_spec.rb +79 -0
- data/spec/unit/pops/resource/resource_type_impl_spec.rb +37 -0
- data/spec/unit/pops/serialization/packer_spec.rb +153 -0
- data/spec/unit/pops/serialization/rgen_spec.rb +88 -0
- data/spec/unit/pops/serialization/serialization_spec.rb +228 -0
- data/spec/unit/pops/types/p_object_type_spec.rb +44 -2
- data/spec/unit/pops/types/p_sem_ver_type_spec.rb +42 -0
- data/spec/unit/pops/types/p_sensitive_type_spec.rb +139 -0
- data/spec/unit/pops/types/p_type_set_type_spec.rb +424 -0
- data/spec/unit/pops/types/ruby_generator_spec.rb +497 -181
- data/spec/unit/pops/types/type_calculator_spec.rb +10 -4
- data/spec/unit/pops/types/type_formatter_spec.rb +1 -1
- data/spec/unit/pops/types/type_mismatch_describer_spec.rb +2 -2
- data/spec/unit/pops/types/type_parser_spec.rb +1 -1
- data/spec/unit/pops/types/types_spec.rb +1 -1
- data/spec/unit/pops/validator/validator_spec.rb +18 -1
- data/spec/unit/property_spec.rb +48 -11
- data/spec/unit/provider/group/windows_adsi_spec.rb +11 -1
- data/spec/unit/provider/package/dnf_spec.rb +1 -99
- data/spec/unit/provider/package/pacman_spec.rb +4 -4
- data/spec/unit/provider/package/pip_spec.rb +14 -0
- data/spec/unit/provider/package/pkg_spec.rb +6 -0
- data/spec/unit/provider/package/pkgdmg_spec.rb +0 -3
- data/spec/unit/provider/package/portage_spec.rb +64 -8
- data/spec/unit/provider/package/tdnf_spec.rb +18 -0
- data/spec/unit/provider/package/windows/package_spec.rb +4 -1
- data/spec/unit/provider/package/windows_spec.rb +8 -2
- data/spec/unit/provider/package/yum_spec.rb +6 -377
- data/spec/unit/provider/service/base_spec.rb +6 -0
- data/spec/unit/provider/service/debian_spec.rb +16 -7
- data/spec/unit/provider/service/gentoo_spec.rb +6 -0
- data/spec/unit/provider/service/init_spec.rb +7 -0
- data/spec/unit/provider/service/launchd_spec.rb +35 -4
- data/spec/unit/provider/service/openrc_spec.rb +6 -0
- data/spec/unit/provider/service/smf_spec.rb +31 -6
- data/spec/unit/provider/service/src_spec.rb +6 -0
- data/spec/unit/provider/service/systemd_spec.rb +70 -20
- data/spec/unit/provider/service/upstart_spec.rb +6 -0
- data/spec/unit/provider/user/aix_spec.rb +7 -0
- data/spec/unit/provider/user/directoryservice_spec.rb +30 -1
- data/spec/unit/provider/user/windows_adsi_spec.rb +19 -0
- data/spec/unit/resource/capability_finder_spec.rb +51 -3
- data/spec/unit/resource/catalog_spec.rb +5 -0
- data/spec/unit/resource/type_spec.rb +2 -2
- data/spec/unit/resource_spec.rb +19 -0
- data/spec/unit/settings_spec.rb +13 -0
- data/spec/unit/ssl/certificate_authority/interface_spec.rb +176 -10
- data/spec/unit/ssl/certificate_authority_spec.rb +63 -22
- data/spec/unit/ssl/host_spec.rb +1 -1
- data/spec/unit/ssl/oids_spec.rb +24 -21
- data/spec/unit/transaction/event_spec.rb +3 -1
- data/spec/unit/transaction/persistence_spec.rb +173 -0
- data/spec/unit/transaction/report_spec.rb +64 -1
- data/spec/unit/transaction/resource_harness_spec.rb +91 -0
- data/spec/unit/type/file/content_spec.rb +47 -15
- data/spec/unit/type/file_spec.rb +28 -0
- data/spec/unit/type/mount_spec.rb +5 -12
- data/spec/unit/type/yumrepo_spec.rb +1 -5
- data/spec/unit/type_spec.rb +32 -0
- data/spec/unit/util/command_line_spec.rb +11 -0
- data/spec/unit/util/execution_spec.rb +1 -1
- data/spec/unit/util/plist_spec.rb +16 -3
- data/spec/unit/util/storage_spec.rb +4 -1
- data/spec/unit/util/windows/adsi_spec.rb +23 -2
- data/spec/unit/util/windows/file_spec.rb +56 -1
- data/spec/unit/util/windows/sid_spec.rb +31 -7
- data/spec/unit/util/yaml_spec.rb +12 -0
- data/spec/unit/util_spec.rb +87 -20
- metadata +91 -48
- data/ext/puppetlisten/puppetlisten.rb +0 -77
- data/ext/puppetlisten/puppetrun.rb +0 -38
- data/lib/puppet/resource/type_collection_helper.rb +0 -7
- data/spec/unit/parser/functions/defined_spec.rb +0 -120
- data/spec/unit/resource/type_collection_helper_spec.rb +0 -24
@@ -5,6 +5,19 @@ module Types
|
|
5
5
|
class PRuntimeType < PAnyType
|
6
6
|
TYPE_NAME_OR_PATTERN = PVariantType.new([PStringType::NON_EMPTY, PTupleType.new([PRegexpType::DEFAULT, PStringType::NON_EMPTY])])
|
7
7
|
|
8
|
+
def self.register_ptype(loader, ir)
|
9
|
+
create_ptype(loader, ir, 'AnyType',
|
10
|
+
'runtime' => {
|
11
|
+
KEY_TYPE => POptionalType.new(PStringType::NON_EMPTY),
|
12
|
+
KEY_VALUE => nil
|
13
|
+
},
|
14
|
+
'name_or_pattern' => {
|
15
|
+
KEY_TYPE => POptionalType.new(TYPE_NAME_OR_PATTERN),
|
16
|
+
KEY_VALUE => nil
|
17
|
+
}
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
8
21
|
attr_reader :runtime, :name_or_pattern
|
9
22
|
|
10
23
|
# Creates a new instance of a Runtime type
|
@@ -5,6 +5,10 @@ module Types
|
|
5
5
|
#
|
6
6
|
# @api public
|
7
7
|
class PSemVerRangeType < PScalarType
|
8
|
+
def self.register_ptype(loader, ir)
|
9
|
+
create_ptype(loader, ir, 'ScalarType')
|
10
|
+
end
|
11
|
+
|
8
12
|
# Check if a version is included in a version range. The version can be a string or
|
9
13
|
# a `Semantic::SemVer`
|
10
14
|
#
|
@@ -28,6 +32,25 @@ class PSemVerRangeType < PScalarType
|
|
28
32
|
end
|
29
33
|
end
|
30
34
|
|
35
|
+
# Creates a {Semantic::VersionRange} from the given _version_range_ argument. If the argument is `nil` or
|
36
|
+
# a {Semantic::VersionRange}, it is returned. If it is a {String}, it will be parsed into a
|
37
|
+
# {Semantic::VersionRange}. Any other class will raise an {ArgumentError}.
|
38
|
+
#
|
39
|
+
# @param version_range [Semantic::VersionRange,String,nil] the version range to convert
|
40
|
+
# @return [Semantic::VersionRange] the converted version range
|
41
|
+
# @raise [ArgumentError] when the argument cannot be converted into a version range
|
42
|
+
#
|
43
|
+
def self.convert(version_range)
|
44
|
+
case version_range
|
45
|
+
when nil, Semantic::VersionRange
|
46
|
+
version_range
|
47
|
+
when String
|
48
|
+
Semantic::VersionRange.parse(version_range)
|
49
|
+
else
|
50
|
+
raise ArgumentError, "Unable to convert a #{version_range.class.name} to a SemVerRange"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
31
54
|
# Checks if range _a_ is a sub-range of (i.e. completely covered by) range _b_
|
32
55
|
# @param a [Semantic::VersionRange] the first range
|
33
56
|
# @param b [Semantic::VersionRange] the second range
|
@@ -6,9 +6,18 @@ module Types
|
|
6
6
|
#
|
7
7
|
# @api public
|
8
8
|
class PSemVerType < PScalarType
|
9
|
+
def self.register_ptype(loader, ir)
|
10
|
+
create_ptype(loader, ir, 'ScalarType',
|
11
|
+
'ranges' => {
|
12
|
+
KEY_TYPE => PArrayType.new(PVariantType.new([PSemVerRangeType::DEFAULT,PStringType::NON_EMPTY])),
|
13
|
+
KEY_VALUE => []
|
14
|
+
}
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
9
18
|
attr_reader :ranges
|
10
19
|
|
11
|
-
def initialize(
|
20
|
+
def initialize(ranges)
|
12
21
|
ranges = ranges.map { |range| range.is_a?(Semantic::VersionRange) ? range : Semantic::VersionRange.parse(range) }
|
13
22
|
ranges = merge_ranges(ranges) if ranges.size > 1
|
14
23
|
@ranges = ranges
|
@@ -26,6 +35,25 @@ class PSemVerType < PScalarType
|
|
26
35
|
super ^ @ranges.hash
|
27
36
|
end
|
28
37
|
|
38
|
+
# Creates a SemVer version from the given _version_ argument. If the argument is `nil` or
|
39
|
+
# a {Semantic::Version}, it is returned. If it is a {String}, it will be parsed into a
|
40
|
+
# {Semantic::Version}. Any other class will raise an {ArgumentError}.
|
41
|
+
#
|
42
|
+
# @param version [Semantic::Version,String,nil] the version to convert
|
43
|
+
# @return [Semantic::Version] the converted version
|
44
|
+
# @raise [ArgumentError] when the argument cannot be converted into a version
|
45
|
+
#
|
46
|
+
def self.convert(version)
|
47
|
+
case version
|
48
|
+
when nil, Semantic::Version
|
49
|
+
version
|
50
|
+
when String
|
51
|
+
Semantic::Version.parse(version)
|
52
|
+
else
|
53
|
+
raise ArgumentError, "Unable to convert a #{version.class.name} to a SemVer"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
29
57
|
# @api private
|
30
58
|
def self.new_function(_, loader)
|
31
59
|
@@new_function ||= Puppet::Functions.create_loaded_function(:new_Version, loader) do
|
@@ -72,7 +100,7 @@ class PSemVerType < PScalarType
|
|
72
100
|
end
|
73
101
|
end
|
74
102
|
|
75
|
-
DEFAULT = PSemVerType.new
|
103
|
+
DEFAULT = PSemVerType.new(EMPTY_ARRAY)
|
76
104
|
|
77
105
|
protected
|
78
106
|
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Puppet::Pops
|
2
|
+
module Types
|
3
|
+
|
4
|
+
# A Puppet Language type that wraps sensitive information. The sensitive type is parameterized by
|
5
|
+
# the wrapped value type.
|
6
|
+
#
|
7
|
+
#
|
8
|
+
# @api public
|
9
|
+
class PSensitiveType < Puppet::Pops::Types::PTypeWithContainedType
|
10
|
+
|
11
|
+
class Sensitive
|
12
|
+
def initialize(value)
|
13
|
+
@value = value
|
14
|
+
end
|
15
|
+
|
16
|
+
def unwrap
|
17
|
+
@value
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_s
|
21
|
+
"Sensitive [value redacted]"
|
22
|
+
end
|
23
|
+
|
24
|
+
def inspect
|
25
|
+
"#<#{to_s}>"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def initialize(type = nil)
|
30
|
+
@type = type.nil? ? PAnyType.new : type.generalize
|
31
|
+
end
|
32
|
+
|
33
|
+
def instance?(o, guard = nil)
|
34
|
+
o.is_a?(Sensitive) && @type.instance?(o.unwrap, guard)
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.new_function(_, loader)
|
38
|
+
@new_function ||= Puppet::Functions.create_loaded_function(:new_Sensitive, loader) do
|
39
|
+
|
40
|
+
dispatch :from_sensitive do
|
41
|
+
param 'Sensitive', :value
|
42
|
+
end
|
43
|
+
|
44
|
+
dispatch :from_any do
|
45
|
+
param 'Any', :value
|
46
|
+
end
|
47
|
+
|
48
|
+
def from_any(value)
|
49
|
+
Sensitive.new(value)
|
50
|
+
end
|
51
|
+
|
52
|
+
# Since the Sensitive value is immutable we can reuse the existing instance instead of making a copy.
|
53
|
+
def from_sensitive(value)
|
54
|
+
value
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
def _assignable?(o, guard)
|
62
|
+
self.class == o.class && @type.assignable?(o.type, guard)
|
63
|
+
end
|
64
|
+
|
65
|
+
DEFAULT = PSensitiveType.new
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,361 @@
|
|
1
|
+
module Puppet::Pops
|
2
|
+
module Types
|
3
|
+
|
4
|
+
KEY_NAME_AUTHORITY = 'name_authority'.freeze
|
5
|
+
KEY_TYPES = 'types'.freeze
|
6
|
+
KEY_ALIAS = 'alias'.freeze
|
7
|
+
KEY_VERSION = 'version'.freeze
|
8
|
+
KEY_VERSION_RANGE = 'version_range'.freeze
|
9
|
+
KEY_REFERENCES = 'references'.freeze
|
10
|
+
|
11
|
+
class PTypeSetType < PMetaType
|
12
|
+
|
13
|
+
# A Loader that makes the types known to the TypeSet visible
|
14
|
+
#
|
15
|
+
# @api private
|
16
|
+
class TypeSetLoader < Loader::BaseLoader
|
17
|
+
def initialize(type_set, parent)
|
18
|
+
super(parent, "(TypeSetFirstLoader '#{type_set.name}')")
|
19
|
+
@type_set = type_set
|
20
|
+
end
|
21
|
+
|
22
|
+
def name_authority
|
23
|
+
@type_set.name_authority
|
24
|
+
end
|
25
|
+
|
26
|
+
def find(typed_name)
|
27
|
+
if typed_name.type == :type && typed_name.name_authority == @type_set.name_authority
|
28
|
+
type = @type_set[typed_name.name]
|
29
|
+
return set_entry(typed_name, type) unless type.nil?
|
30
|
+
end
|
31
|
+
nil
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
TYPE_STRING_OR_VERSION = TypeFactory.variant(PStringType::NON_EMPTY, TypeFactory.sem_ver)
|
36
|
+
TYPE_STRING_OR_RANGE = TypeFactory.variant(PStringType::NON_EMPTY, TypeFactory.sem_ver_range)
|
37
|
+
|
38
|
+
TYPE_TYPE_REFERENCE_I12N = TypeFactory.struct({
|
39
|
+
KEY_NAME => Pcore::TYPE_QUALIFIED_REFERENCE,
|
40
|
+
KEY_VERSION_RANGE => TYPE_STRING_OR_RANGE,
|
41
|
+
TypeFactory.optional(KEY_NAME_AUTHORITY) => Pcore::TYPE_URI,
|
42
|
+
TypeFactory.optional(KEY_ANNOTATIONS) => TYPE_ANNOTATIONS
|
43
|
+
})
|
44
|
+
|
45
|
+
TYPE_TYPESET_I12N = TypeFactory.struct({
|
46
|
+
TypeFactory.optional(Pcore::KEY_PCORE_URI) => Pcore::TYPE_URI,
|
47
|
+
Pcore::KEY_PCORE_VERSION => TYPE_STRING_OR_VERSION,
|
48
|
+
TypeFactory.optional(KEY_NAME_AUTHORITY) => Pcore::TYPE_URI,
|
49
|
+
TypeFactory.optional(KEY_NAME) => Pcore::TYPE_QUALIFIED_REFERENCE,
|
50
|
+
KEY_VERSION => TYPE_STRING_OR_VERSION,
|
51
|
+
TypeFactory.optional(KEY_TYPES) => TypeFactory.hash_kv(Pcore::TYPE_SIMPLE_TYPE_NAME, PType::DEFAULT, PCollectionType::NOT_EMPTY_SIZE),
|
52
|
+
TypeFactory.optional(KEY_REFERENCES) => TypeFactory.hash_kv(Pcore::TYPE_SIMPLE_TYPE_NAME, TYPE_TYPE_REFERENCE_I12N, PCollectionType::NOT_EMPTY_SIZE),
|
53
|
+
TypeFactory.optional(KEY_ANNOTATIONS) => TYPE_ANNOTATIONS,
|
54
|
+
})
|
55
|
+
|
56
|
+
|
57
|
+
attr_reader :pcore_uri
|
58
|
+
attr_reader :pcore_version
|
59
|
+
attr_reader :name_authority
|
60
|
+
attr_reader :name
|
61
|
+
attr_reader :version
|
62
|
+
attr_reader :types
|
63
|
+
attr_reader :references
|
64
|
+
attr_reader :annotations
|
65
|
+
|
66
|
+
# Initialize a TypeSet Type instance. The initialization will use either a name and an initialization
|
67
|
+
# hash expression, or a fully resolved initialization hash.
|
68
|
+
#
|
69
|
+
# @overload initialize(name, i12n_hash_expression)
|
70
|
+
# Used when the TypeSet type is loaded using a type alias expression. When that happens, it is important that
|
71
|
+
# the actual resolution of the expression is deferred until all definitions have been made known to the current
|
72
|
+
# loader. The package will then be resolved when it is loaded by the {TypeParser}. "resolved" here, means that
|
73
|
+
# the hash expression is fully resolved, and then passed to the {#initialize_from_hash} method.
|
74
|
+
# @param name [String] The name of the type set
|
75
|
+
# @param i12n_hash_expression [Model::LiteralHash] The hash describing the TypeSet features
|
76
|
+
# @param name_authority [String] The default name authority for the type set
|
77
|
+
#
|
78
|
+
# @overload initialize(i12n_hash)
|
79
|
+
# Used when the package is created by the {TypeFactory}. The i12n_hash must be fully resolved.
|
80
|
+
# @param i12n_hash [Hash{String=>Object}] The hash describing the TypeSet features
|
81
|
+
#
|
82
|
+
# @api private
|
83
|
+
def initialize(name_or_i12n_hash, i12n_hash_expression = nil, name_authority = nil)
|
84
|
+
@types = EMPTY_HASH
|
85
|
+
@references = EMPTY_HASH
|
86
|
+
|
87
|
+
if name_or_i12n_hash.is_a?(Hash)
|
88
|
+
initialize_from_hash(name_or_i12n_hash)
|
89
|
+
else
|
90
|
+
# Creation using "type XXX = TypeSet[{}]". This means that the name is given
|
91
|
+
@name = TypeAsserter.assert_instance_of('TypeSet name', Pcore::TYPE_QUALIFIED_REFERENCE, name_or_i12n_hash)
|
92
|
+
@name_authority = TypeAsserter.assert_instance_of('TypeSet name_authority', Pcore::TYPE_URI, name_authority, true)
|
93
|
+
@i12n_hash_expression = i12n_hash_expression
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# @api private
|
98
|
+
def initialize_from_hash(i12n_hash)
|
99
|
+
TypeAsserter.assert_instance_of('TypeSet initializer', TYPE_TYPESET_I12N, i12n_hash)
|
100
|
+
|
101
|
+
# Name given to the loader have higher precedence than a name declared in the type
|
102
|
+
@name ||= i12n_hash[KEY_NAME].freeze
|
103
|
+
@name_authority ||= i12n_hash[KEY_NAME_AUTHORITY].freeze
|
104
|
+
|
105
|
+
@pcore_version = PSemVerType.convert(i12n_hash[Pcore::KEY_PCORE_VERSION]).freeze
|
106
|
+
unless Pcore::PARSABLE_PCORE_VERSIONS.include?(@pcore_version)
|
107
|
+
raise ArgumentError,
|
108
|
+
"The pcore version for TypeSet '#{@name}' is not understood by this runtime. Expected range #{Pcore::PARSABLE_PCORE_VERSIONS}, got #{@pcore_version}"
|
109
|
+
end
|
110
|
+
|
111
|
+
@pcore_uri = i12n_hash[Pcore::KEY_PCORE_URI].freeze
|
112
|
+
@version = PSemVerType.convert(i12n_hash[KEY_VERSION])
|
113
|
+
@types = i12n_hash[KEY_TYPES] || EMPTY_HASH
|
114
|
+
@types.freeze
|
115
|
+
|
116
|
+
# Map downcase names to their camel-cased equivalent
|
117
|
+
@dc_to_cc_map = {}
|
118
|
+
@types.keys.each { |key| @dc_to_cc_map[key.downcase] = key }
|
119
|
+
|
120
|
+
refs = i12n_hash[KEY_REFERENCES]
|
121
|
+
if refs.nil?
|
122
|
+
@references = EMPTY_HASH
|
123
|
+
else
|
124
|
+
ref_map = {}
|
125
|
+
root_map = Hash.new { |h, k| h[k] = {} }
|
126
|
+
refs.each do |ref_alias, ref|
|
127
|
+
ref = TypeSetReference.new(self, ref)
|
128
|
+
|
129
|
+
# Protect against importing the exact same name_authority/name combination twice if the version ranges intersect
|
130
|
+
ref_name = ref.name
|
131
|
+
ref_na = ref.name_authority || @name_authority
|
132
|
+
na_roots = root_map[ref_na]
|
133
|
+
|
134
|
+
ranges = na_roots[ref_name]
|
135
|
+
if ranges.nil?
|
136
|
+
na_roots[ref_name] = [ref.version_range]
|
137
|
+
else
|
138
|
+
unless ranges.all? { |range| (range & ref.version_range).nil? }
|
139
|
+
raise ArgumentError, "TypeSet '#{@name}' references TypeSet '#{ref_na}/#{ref_name}' more than once using overlapping version ranges"
|
140
|
+
end
|
141
|
+
ranges << ref.version_range
|
142
|
+
end
|
143
|
+
|
144
|
+
if ref_map.has_key?(ref_alias)
|
145
|
+
raise ArgumentError, "TypeSet '#{@name}' references a TypeSet using alias '#{ref_alias}' more than once"
|
146
|
+
end
|
147
|
+
if @types.has_key?(ref_alias)
|
148
|
+
raise ArgumentError, "TypeSet '#{@name}' references a TypeSet using alias '#{ref_alias}'. The alias collides with the name of a declared type"
|
149
|
+
end
|
150
|
+
ref_map[ref_alias] = ref
|
151
|
+
|
152
|
+
@dc_to_cc_map[ref_alias.downcase] = ref_alias
|
153
|
+
ref_map[ref_alias] = ref
|
154
|
+
end
|
155
|
+
@references = ref_map.freeze
|
156
|
+
end
|
157
|
+
@dc_to_cc_map.freeze
|
158
|
+
init_annotatable(i12n_hash)
|
159
|
+
end
|
160
|
+
|
161
|
+
# Produce a hash suitable for the initializer
|
162
|
+
# @return [Hash{String => Object}] the initialization hash
|
163
|
+
#
|
164
|
+
# @api private
|
165
|
+
def i12n_hash
|
166
|
+
result = super()
|
167
|
+
result[Pcore::KEY_PCORE_URI] = @pcore_uri unless @pcore_uri.nil?
|
168
|
+
result[Pcore::KEY_PCORE_VERSION] = @pcore_version.to_s
|
169
|
+
result[KEY_NAME_AUTHORITY] = @name_authority unless @name_authority.nil?
|
170
|
+
result[KEY_NAME] = @name
|
171
|
+
result[KEY_VERSION] = @version.to_s
|
172
|
+
result[KEY_TYPES] = @types unless @types.empty?
|
173
|
+
result[KEY_REFERENCES] = Hash[@references.map { |ref_alias, ref| [ref_alias, ref.i12n_hash] }] unless @references.empty?
|
174
|
+
result
|
175
|
+
end
|
176
|
+
|
177
|
+
# Resolve a type in this type set using a qualified name. The resolved type may either be a type defined in this type set
|
178
|
+
# or a type defined in a type set that is referenced by this type set (nesting may occur to any level).
|
179
|
+
# The name resolution is case insensitive.
|
180
|
+
#
|
181
|
+
# @param qname [String] the qualified name of the type to resolve
|
182
|
+
# @return [PAnyType,nil] the resolved type, or `nil` in case no type could be found
|
183
|
+
#
|
184
|
+
# @api public
|
185
|
+
def [](qname)
|
186
|
+
type = @types[qname] || @types[@dc_to_cc_map[qname.downcase]]
|
187
|
+
if type.nil? && !@references.empty?
|
188
|
+
segments = qname.split(TypeFormatter::NAME_SEGMENT_SEPARATOR)
|
189
|
+
first = segments[0]
|
190
|
+
type_set_ref = @references[first] || @references[@dc_to_cc_map[first.downcase]]
|
191
|
+
if type_set_ref.nil?
|
192
|
+
nil
|
193
|
+
else
|
194
|
+
type_set = type_set_ref.type_set
|
195
|
+
case segments.size
|
196
|
+
when 1
|
197
|
+
type_set
|
198
|
+
when 2
|
199
|
+
type_set[segments[1]]
|
200
|
+
else
|
201
|
+
segments.shift
|
202
|
+
type_set[segments.join(TypeFormatter::NAME_SEGMENT_SEPARATOR)]
|
203
|
+
end
|
204
|
+
end
|
205
|
+
else
|
206
|
+
type
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
def defines_type?(t)
|
211
|
+
!@types.key(t).nil?
|
212
|
+
end
|
213
|
+
|
214
|
+
# Returns the name by which the given type is referenced from within this type set
|
215
|
+
# @param t [PAnyType]
|
216
|
+
# @return [String] the name by which the type is referenced within this type set
|
217
|
+
#
|
218
|
+
# @api private
|
219
|
+
def name_for(t)
|
220
|
+
key = @types.key(t)
|
221
|
+
if key.nil?
|
222
|
+
qname = t.name
|
223
|
+
if @references.empty?
|
224
|
+
qname
|
225
|
+
else
|
226
|
+
segments = qname.split(TypeFormatter::NAME_SEGMENT_SEPARATOR)
|
227
|
+
first = segments[0]
|
228
|
+
type_set = @references[first]
|
229
|
+
if type_set.nil?
|
230
|
+
qname
|
231
|
+
else
|
232
|
+
if segments.size == 1
|
233
|
+
qname
|
234
|
+
else
|
235
|
+
sub_name = type_set.name_for(t)
|
236
|
+
sub_name = "#{first}::#{sub_name}" unless sub_name == qname
|
237
|
+
sub_name
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
else
|
242
|
+
key
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
def accept(visitor, guard)
|
247
|
+
super
|
248
|
+
@types.each_value { |type| type.accept(visitor, guard) }
|
249
|
+
@references.each_value { |ref| ref.accept(visitor, guard) }
|
250
|
+
end
|
251
|
+
|
252
|
+
# @api private
|
253
|
+
def label
|
254
|
+
"TypeSet '#{@name}'"
|
255
|
+
end
|
256
|
+
|
257
|
+
# @api private
|
258
|
+
def resolve(type_parser, loader)
|
259
|
+
super
|
260
|
+
@references.each_value { |ref| ref.resolve(type_parser, loader) }
|
261
|
+
tsa_loader = TypeSetLoader.new(self, loader)
|
262
|
+
@types.values.each { |type| type.resolve(type_parser, tsa_loader) }
|
263
|
+
self
|
264
|
+
end
|
265
|
+
|
266
|
+
# @api private
|
267
|
+
def resolve_literal_hash(type_parser, loader, i12n_hash_expression)
|
268
|
+
result = {}
|
269
|
+
i12n_hash_expression.entries.each do |entry|
|
270
|
+
key = type_parser.interpret_any(entry.key, loader)
|
271
|
+
if (key == KEY_TYPES || key == KEY_REFERENCES) && entry.value.is_a?(Model::LiteralHash)
|
272
|
+
# Skip type parser interpretation and convert qualified references directly to String keys.
|
273
|
+
hash = {}
|
274
|
+
entry.value.entries.each do |he|
|
275
|
+
kex = he.key
|
276
|
+
name = kex.is_a?(Model::QualifiedReference) ? kex.cased_value : type_parser.interpret_any(kex, loader)
|
277
|
+
hash[name] = key == KEY_TYPES ? he.value : type_parser.interpret_any(he.value, loader)
|
278
|
+
end
|
279
|
+
result[key] = hash
|
280
|
+
else
|
281
|
+
result[key] = type_parser.interpret_any(entry.value, loader)
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
name_auth = resolve_name_authority(result, loader)
|
286
|
+
|
287
|
+
types = result[KEY_TYPES]
|
288
|
+
if types.is_a?(Hash)
|
289
|
+
types.each do |type_name, value|
|
290
|
+
full_name = "#{@name}::#{type_name}".freeze
|
291
|
+
typed_name = Loader::TypedName.new(:type, full_name.downcase, name_auth)
|
292
|
+
type = Loader::TypeDefinitionInstantiator.create_type(full_name, value, name_auth)
|
293
|
+
loader.set_entry(typed_name, type, Adapters::SourcePosAdapter.adapt(value).to_uri)
|
294
|
+
types[type_name] = type
|
295
|
+
end
|
296
|
+
end
|
297
|
+
result
|
298
|
+
end
|
299
|
+
|
300
|
+
# @api private
|
301
|
+
def resolve_hash(type_parser, loader, i12n_hash)
|
302
|
+
result = Hash[i12n_hash.map do |key, value|
|
303
|
+
key = resolve_type_refs(type_parser, loader, key)
|
304
|
+
value = resolve_type_refs(type_parser, loader, value) unless key == KEY_TYPES && value.is_a?(Hash)
|
305
|
+
[key, value]
|
306
|
+
end]
|
307
|
+
name_auth = resolve_name_authority(result, loader)
|
308
|
+
types = result[KEY_TYPES]
|
309
|
+
if types.is_a?(Hash)
|
310
|
+
types.each do |type_name, value|
|
311
|
+
full_name = "#{@name}::#{type_name}".freeze
|
312
|
+
typed_name = Loader::TypedName.new(:type, full_name.downcase, name_auth)
|
313
|
+
meta_name = value.is_a?(Hash) ? 'Object' : 'TypeAlias'
|
314
|
+
type = Loader::TypeDefinitionInstantiator.create_named_type(full_name, meta_name, value, name_auth)
|
315
|
+
loader.set_entry(typed_name, type)
|
316
|
+
types[type_name] = type
|
317
|
+
end
|
318
|
+
end
|
319
|
+
result
|
320
|
+
end
|
321
|
+
|
322
|
+
def hash
|
323
|
+
@name_authority.hash ^ @name.hash ^ @version.hash
|
324
|
+
end
|
325
|
+
|
326
|
+
def eql?(o)
|
327
|
+
self.class == o.class && @name_authority == o.name_authority && @name == o.name && @version == o.version
|
328
|
+
end
|
329
|
+
|
330
|
+
DEFAULT = self.new({
|
331
|
+
KEY_NAME => 'DefaultTypeSet',
|
332
|
+
KEY_NAME_AUTHORITY => Pcore::RUNTIME_NAME_AUTHORITY,
|
333
|
+
Pcore::KEY_PCORE_URI => Pcore::PCORE_URI,
|
334
|
+
Pcore::KEY_PCORE_VERSION => Pcore::PCORE_VERSION,
|
335
|
+
KEY_VERSION => Semantic::Version.new(0,0,0)
|
336
|
+
})
|
337
|
+
|
338
|
+
protected
|
339
|
+
|
340
|
+
# @api_private
|
341
|
+
def _assignable?(o, guard)
|
342
|
+
self.class == o.class && (self == DEFAULT || eql?(o))
|
343
|
+
end
|
344
|
+
|
345
|
+
private
|
346
|
+
|
347
|
+
def resolve_name_authority(i12n_hash, loader)
|
348
|
+
name_auth = @name_authority
|
349
|
+
if name_auth.nil?
|
350
|
+
name_auth = i12n_hash[KEY_NAME_AUTHORITY]
|
351
|
+
name_auth = loader.name_authority if name_auth.nil? && loader.is_a?(TypeSetLoader)
|
352
|
+
if name_auth.nil?
|
353
|
+
name = @name || i12n_hash[KEY_NAME]
|
354
|
+
raise ArgumentError, "No 'name_authority' is declared in TypeSet '#{name}' and it cannot be inferred"
|
355
|
+
end
|
356
|
+
end
|
357
|
+
name_auth
|
358
|
+
end
|
359
|
+
end
|
360
|
+
end
|
361
|
+
end
|