puppet 4.5.3-universal-darwin → 4.6.1-universal-darwin

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.

Files changed (422) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +10 -1
  3. data/ext/debian/control +2 -4
  4. data/ext/project_data.yaml +4 -4
  5. data/install.rb +6 -2
  6. data/lib/puppet.rb +3 -1
  7. data/lib/puppet/agent/locker.rb +1 -1
  8. data/lib/puppet/application.rb +6 -4
  9. data/lib/puppet/application/agent.rb +2 -1
  10. data/lib/puppet/application/cert.rb +35 -2
  11. data/lib/puppet/application/device.rb +1 -1
  12. data/lib/puppet/application/generate.rb +5 -0
  13. data/lib/puppet/application/lookup.rb +3 -3
  14. data/lib/puppet/application_support.rb +1 -1
  15. data/lib/puppet/compilable_resource_type.rb +15 -0
  16. data/lib/puppet/configurer.rb +67 -10
  17. data/lib/puppet/configurer/plugin_handler.rb +2 -4
  18. data/lib/puppet/data_providers/hiera_config.rb +1 -1
  19. data/lib/puppet/defaults.rb +34 -7
  20. data/lib/puppet/environments.rb +4 -2
  21. data/lib/puppet/error.rb +1 -1
  22. data/lib/puppet/external/dot.rb +1 -1
  23. data/lib/puppet/face/ca.rb +4 -1
  24. data/lib/puppet/face/certificate.rb +7 -1
  25. data/lib/puppet/face/epp.rb +5 -5
  26. data/lib/puppet/face/generate.rb +64 -0
  27. data/lib/puppet/face/help.rb +19 -13
  28. data/lib/puppet/face/man.rb +1 -1
  29. data/lib/puppet/feature/external_facts.rb +1 -1
  30. data/lib/puppet/file_system.rb +16 -0
  31. data/lib/puppet/file_system/file_impl.rb +5 -0
  32. data/lib/puppet/file_system/memory_impl.rb +4 -0
  33. data/lib/puppet/file_system/path_pattern.rb +1 -0
  34. data/lib/puppet/file_system/windows.rb +19 -0
  35. data/lib/puppet/functions.rb +3 -5
  36. data/lib/puppet/functions/assert_type.rb +1 -1
  37. data/lib/puppet/functions/defined.rb +7 -5
  38. data/lib/puppet/functions/dig.rb +2 -18
  39. data/lib/puppet/functions/hiera.rb +1 -1
  40. data/lib/puppet/functions/lest.rb +1 -37
  41. data/lib/puppet/functions/new.rb +2 -473
  42. data/lib/puppet/functions/reverse_each.rb +2 -59
  43. data/lib/puppet/functions/scanf.rb +4 -4
  44. data/lib/puppet/functions/step.rb +1 -63
  45. data/lib/puppet/functions/then.rb +1 -61
  46. data/lib/puppet/functions/type.rb +1 -40
  47. data/lib/puppet/functions/unwrap.rb +40 -0
  48. data/lib/puppet/generate/models/type/property.rb +70 -0
  49. data/lib/puppet/generate/models/type/type.rb +57 -0
  50. data/lib/puppet/generate/templates/type/pcore.erb +41 -0
  51. data/lib/puppet/generate/type.rb +239 -0
  52. data/lib/puppet/graph/simple_graph.rb +2 -6
  53. data/lib/puppet/indirector/catalog/static_compiler.rb +5 -2
  54. data/lib/puppet/indirector/facts/facter.rb +1 -1
  55. data/lib/puppet/indirector/key/ca.rb +2 -2
  56. data/lib/puppet/indirector/request.rb +25 -4
  57. data/lib/puppet/indirector/rest.rb +73 -3
  58. data/lib/puppet/info_service/class_information_service.rb +1 -2
  59. data/lib/puppet/interface/documentation.rb +1 -1
  60. data/lib/puppet/loaders.rb +2 -0
  61. data/lib/puppet/metatype/manager.rb +6 -6
  62. data/lib/puppet/module.rb +8 -1
  63. data/lib/puppet/module_tool.rb +2 -2
  64. data/lib/puppet/module_tool/checksums.rb +1 -1
  65. data/lib/puppet/module_tool/errors/installer.rb +2 -2
  66. data/lib/puppet/module_tool/metadata.rb +1 -1
  67. data/lib/puppet/network/http/api/indirected_routes.rb +23 -32
  68. data/lib/puppet/network/http/rack/rest.rb +15 -1
  69. data/lib/puppet/network/rights.rb +1 -11
  70. data/lib/puppet/node/environment.rb +7 -3
  71. data/lib/puppet/node/facts.rb +1 -1
  72. data/lib/puppet/parameter.rb +23 -3
  73. data/lib/puppet/parameter/boolean.rb +1 -1
  74. data/lib/puppet/parameter/value.rb +1 -1
  75. data/lib/puppet/parser.rb +0 -1
  76. data/lib/puppet/parser/ast/pops_bridge.rb +1 -1
  77. data/lib/puppet/parser/ast/resource.rb +5 -0
  78. data/lib/puppet/parser/ast/resource_instance.rb +5 -1
  79. data/lib/puppet/parser/ast/resourceparam.rb +5 -0
  80. data/lib/puppet/parser/compiler.rb +14 -17
  81. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +1 -1
  82. data/lib/puppet/parser/environment_compiler.rb +10 -0
  83. data/lib/puppet/parser/functions/create_resources.rb +39 -24
  84. data/lib/puppet/parser/functions/defined.rb +2 -26
  85. data/lib/puppet/parser/functions/dig.rb +29 -0
  86. data/lib/puppet/parser/functions/lest.rb +49 -0
  87. data/lib/puppet/parser/functions/new.rb +530 -0
  88. data/lib/puppet/parser/functions/require.rb +1 -1
  89. data/lib/puppet/parser/functions/reverse_each.rb +83 -0
  90. data/lib/puppet/parser/functions/scanf.rb +4 -4
  91. data/lib/puppet/parser/functions/step.rb +84 -0
  92. data/lib/puppet/parser/functions/then.rb +73 -0
  93. data/lib/puppet/parser/functions/type.rb +53 -0
  94. data/lib/puppet/parser/resource.rb +16 -7
  95. data/lib/puppet/parser/scope.rb +36 -28
  96. data/lib/puppet/parser/type_loader.rb +1 -1
  97. data/lib/puppet/plugins/data_providers/data_provider.rb +1 -1
  98. data/lib/puppet/pops.rb +13 -0
  99. data/lib/puppet/pops/adapters.rb +49 -49
  100. data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +1 -1
  101. data/lib/puppet/pops/evaluator/access_operator.rb +39 -2
  102. data/lib/puppet/pops/evaluator/closure.rb +39 -13
  103. data/lib/puppet/pops/evaluator/collector_transformer.rb +10 -1
  104. data/lib/puppet/pops/evaluator/evaluator_impl.rb +16 -11
  105. data/lib/puppet/pops/evaluator/external_syntax_support.rb +1 -1
  106. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +0 -1
  107. data/lib/puppet/pops/evaluator/literal_evaluator.rb +0 -1
  108. data/lib/puppet/pops/evaluator/relationship_operator.rb +1 -2
  109. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +119 -0
  110. data/lib/puppet/pops/evaluator/runtime3_support.rb +19 -45
  111. data/lib/puppet/pops/functions/function.rb +5 -0
  112. data/lib/puppet/pops/issues.rb +1 -1
  113. data/lib/puppet/pops/label_provider.rb +2 -2
  114. data/lib/puppet/pops/loader/base_loader.rb +12 -15
  115. data/lib/puppet/pops/loader/loader.rb +15 -50
  116. data/lib/puppet/pops/loader/loader_paths.rb +28 -2
  117. data/lib/puppet/pops/loader/module_loaders.rb +16 -1
  118. data/lib/puppet/pops/loader/null_loader.rb +17 -1
  119. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +12 -11
  120. data/lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb +80 -0
  121. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +2 -3
  122. data/lib/puppet/pops/loader/runtime3_type_loader.rb +52 -13
  123. data/lib/puppet/pops/loader/static_loader.rb +55 -0
  124. data/lib/puppet/pops/loader/type_definition_instantiator.rb +30 -14
  125. data/lib/puppet/pops/loader/typed_name.rb +50 -0
  126. data/lib/puppet/pops/loaders.rb +64 -19
  127. data/lib/puppet/pops/merge_strategy.rb +7 -7
  128. data/lib/puppet/pops/migration/migration_checker.rb +4 -0
  129. data/lib/puppet/pops/model/model_label_provider.rb +2 -0
  130. data/lib/puppet/pops/parser/egrammar.ra +8 -5
  131. data/lib/puppet/pops/parser/eparser.rb +1550 -1498
  132. data/lib/puppet/pops/parser/evaluating_parser.rb +1 -1
  133. data/lib/puppet/pops/parser/interpolation_support.rb +7 -0
  134. data/lib/puppet/pops/parser/lexer2.rb +14 -1
  135. data/lib/puppet/pops/parser/locator.rb +30 -1
  136. data/lib/puppet/pops/parser/parser_support.rb +0 -3
  137. data/lib/puppet/pops/parser/slurp_support.rb +3 -3
  138. data/lib/puppet/pops/patterns.rb +9 -1
  139. data/lib/puppet/pops/pcore.rb +67 -11
  140. data/lib/puppet/pops/puppet_stack.rb +43 -0
  141. data/lib/puppet/pops/resource/param.rb +51 -0
  142. data/lib/puppet/pops/resource/resource_type_impl.rb +301 -0
  143. data/lib/puppet/pops/resource/resource_type_set.pcore +21 -0
  144. data/lib/puppet/pops/serialization.rb +17 -0
  145. data/lib/puppet/pops/serialization/abstract_reader.rb +149 -0
  146. data/lib/puppet/pops/serialization/abstract_writer.rb +179 -0
  147. data/lib/puppet/pops/serialization/deserializer.rb +60 -0
  148. data/lib/puppet/pops/serialization/extension.rb +126 -0
  149. data/lib/puppet/pops/serialization/instance_reader.rb +19 -0
  150. data/lib/puppet/pops/serialization/instance_writer.rb +14 -0
  151. data/lib/puppet/pops/serialization/json.rb +247 -0
  152. data/lib/puppet/pops/serialization/object.rb +63 -0
  153. data/lib/puppet/pops/serialization/rgen.rb +151 -0
  154. data/lib/puppet/pops/serialization/serializer.rb +91 -0
  155. data/lib/puppet/pops/serialization/time_factory.rb +66 -0
  156. data/lib/puppet/pops/types/annotatable.rb +36 -0
  157. data/lib/puppet/pops/types/implementation_registry.rb +3 -8
  158. data/lib/puppet/pops/types/p_meta_type.rb +83 -0
  159. data/lib/puppet/pops/types/p_object_type.rb +110 -117
  160. data/lib/puppet/pops/types/p_runtime_type.rb +13 -0
  161. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +23 -0
  162. data/lib/puppet/pops/types/p_sem_ver_type.rb +30 -2
  163. data/lib/puppet/pops/types/p_sensitive_type.rb +69 -0
  164. data/lib/puppet/pops/types/p_type_set_type.rb +361 -0
  165. data/lib/puppet/pops/types/puppet_object.rb +0 -5
  166. data/lib/puppet/pops/types/ruby_generator.rb +9 -2
  167. data/lib/puppet/pops/types/type_calculator.rb +6 -1
  168. data/lib/puppet/pops/types/type_factory.rb +14 -12
  169. data/lib/puppet/pops/types/type_formatter.rb +78 -33
  170. data/lib/puppet/pops/types/type_mismatch_describer.rb +0 -2
  171. data/lib/puppet/pops/types/type_parser.rb +27 -2
  172. data/lib/puppet/pops/types/type_set_reference.rb +59 -0
  173. data/lib/puppet/pops/types/types.rb +366 -13
  174. data/lib/puppet/pops/validation.rb +4 -4
  175. data/lib/puppet/pops/validation/checker4_0.rb +5 -2
  176. data/lib/puppet/pops/visitor.rb +2 -2
  177. data/lib/puppet/property.rb +64 -5
  178. data/lib/puppet/provider.rb +1 -1
  179. data/lib/puppet/provider/aixobject.rb +3 -3
  180. data/lib/puppet/provider/group/aix.rb +4 -4
  181. data/lib/puppet/provider/macauthorization/macauthorization.rb +1 -1
  182. data/lib/puppet/provider/mailalias/aliases.rb +1 -1
  183. data/lib/puppet/provider/mcx/mcxcontent.rb +2 -2
  184. data/lib/puppet/provider/mount/parsed.rb +1 -1
  185. data/lib/puppet/provider/nameservice/directoryservice.rb +5 -5
  186. data/lib/puppet/provider/package/appdmg.rb +3 -3
  187. data/lib/puppet/provider/package/apple.rb +1 -1
  188. data/lib/puppet/provider/package/dnf.rb +5 -0
  189. data/lib/puppet/provider/package/nim.rb +1 -1
  190. data/lib/puppet/provider/package/pacman.rb +2 -2
  191. data/lib/puppet/provider/package/pip.rb +5 -3
  192. data/lib/puppet/provider/package/pip3.rb +1 -1
  193. data/lib/puppet/provider/package/pkg.rb +5 -5
  194. data/lib/puppet/provider/package/pkgdmg.rb +4 -4
  195. data/lib/puppet/provider/package/pkgin.rb +1 -1
  196. data/lib/puppet/provider/package/pkgutil.rb +1 -1
  197. data/lib/puppet/provider/package/portage.rb +48 -8
  198. data/lib/puppet/provider/package/sun.rb +1 -1
  199. data/lib/puppet/provider/package/tdnf.rb +28 -0
  200. data/lib/puppet/provider/package/yum.rb +22 -4
  201. data/lib/puppet/provider/parsedfile.rb +2 -2
  202. data/lib/puppet/provider/service/base.rb +1 -1
  203. data/lib/puppet/provider/service/bsd.rb +1 -1
  204. data/lib/puppet/provider/service/daemontools.rb +2 -2
  205. data/lib/puppet/provider/service/debian.rb +3 -3
  206. data/lib/puppet/provider/service/init.rb +5 -3
  207. data/lib/puppet/provider/service/launchd.rb +16 -2
  208. data/lib/puppet/provider/service/runit.rb +1 -1
  209. data/lib/puppet/provider/service/smf.rb +8 -1
  210. data/lib/puppet/provider/service/systemd.rb +39 -6
  211. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +3 -2
  213. data/lib/puppet/provider/user/directoryservice.rb +4 -3
  214. data/lib/puppet/provider/user/hpux.rb +1 -1
  215. data/lib/puppet/provider/user/user_role_add.rb +1 -1
  216. data/lib/puppet/provider/user/windows_adsi.rb +3 -0
  217. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  218. data/lib/puppet/reference/type.rb +1 -1
  219. data/lib/puppet/resource.rb +33 -7
  220. data/lib/puppet/resource/capability_finder.rb +74 -54
  221. data/lib/puppet/resource/status.rb +11 -2
  222. data/lib/puppet/settings.rb +17 -6
  223. data/lib/puppet/settings/environment_conf.rb +1 -1
  224. data/lib/puppet/settings/server_list_setting.rb +20 -0
  225. data/lib/puppet/ssl/certificate_authority.rb +32 -9
  226. data/lib/puppet/ssl/certificate_authority/interface.rb +164 -24
  227. data/lib/puppet/ssl/host.rb +3 -3
  228. data/lib/puppet/ssl/oids.rb +10 -0
  229. data/lib/puppet/ssl/validator/default_validator.rb +2 -2
  230. data/lib/puppet/test/test_helper.rb +2 -2
  231. data/lib/puppet/transaction.rb +12 -0
  232. data/lib/puppet/transaction/additional_resource_generator.rb +1 -1
  233. data/lib/puppet/transaction/event.rb +29 -2
  234. data/lib/puppet/transaction/event_manager.rb +1 -1
  235. data/lib/puppet/transaction/persistence.rb +84 -0
  236. data/lib/puppet/transaction/report.rb +49 -2
  237. data/lib/puppet/transaction/resource_harness.rb +98 -18
  238. data/lib/puppet/type.rb +63 -21
  239. data/lib/puppet/type/augeas.rb +3 -3
  240. data/lib/puppet/type/cron.rb +1 -1
  241. data/lib/puppet/type/file.rb +39 -2
  242. data/lib/puppet/type/file/data_sync.rb +13 -5
  243. data/lib/puppet/type/host.rb +1 -1
  244. data/lib/puppet/type/mount.rb +2 -6
  245. data/lib/puppet/type/notify.rb +1 -1
  246. data/lib/puppet/type/package.rb +1 -1
  247. data/lib/puppet/type/resources.rb +1 -1
  248. data/lib/puppet/type/scheduled_task.rb +1 -1
  249. data/lib/puppet/type/ssh_authorized_key.rb +2 -2
  250. data/lib/puppet/type/tidy.rb +1 -1
  251. data/lib/puppet/type/yumrepo.rb +3 -3
  252. data/lib/puppet/type/zone.rb +1 -1
  253. data/lib/puppet/util.rb +2 -2
  254. data/lib/puppet/util/classgen.rb +1 -1
  255. data/lib/puppet/util/command_line.rb +6 -2
  256. data/lib/puppet/util/command_line/trollop.rb +1 -1
  257. data/lib/puppet/util/execution.rb +2 -2
  258. data/lib/puppet/util/http_proxy.rb +1 -1
  259. data/lib/puppet/util/inifile.rb +1 -1
  260. data/lib/puppet/util/instance_loader.rb +1 -1
  261. data/lib/puppet/util/logging.rb +1 -1
  262. data/lib/puppet/util/multi_match.rb +1 -1
  263. data/lib/puppet/util/plist.rb +15 -5
  264. data/lib/puppet/util/profiler.rb +1 -1
  265. data/lib/puppet/util/profiler/around_profiler.rb +1 -1
  266. data/lib/puppet/util/psych_support.rb +1 -1
  267. data/lib/puppet/util/rdoc.rb +2 -2
  268. data/lib/puppet/util/rubygems.rb +1 -1
  269. data/lib/puppet/util/watcher/periodic_watcher.rb +2 -2
  270. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  271. data/lib/puppet/util/windows/adsi.rb +30 -8
  272. data/lib/puppet/util/windows/api_types.rb +1 -1
  273. data/lib/puppet/util/windows/file.rb +59 -0
  274. data/lib/puppet/util/windows/process.rb +10 -0
  275. data/lib/puppet/util/windows/security.rb +1 -1
  276. data/lib/puppet/util/windows/user.rb +22 -4
  277. data/lib/puppet/util/yaml.rb +15 -3
  278. data/lib/puppet/vendor/deep_merge/test/test_deep_merge.rb +1 -1
  279. data/lib/puppet/vendor/rgen_patch.rb +1 -1
  280. data/lib/puppet/version.rb +2 -2
  281. data/spec/fixtures/unit/pops/loaders/loaders/no_modules/manifests/site.pp +10 -0
  282. data/spec/integration/agent/logging_spec.rb +15 -14
  283. data/spec/integration/application/apply_spec.rb +1 -0
  284. data/spec/integration/directory_environments_spec.rb +16 -0
  285. data/spec/integration/environments/settings_spec.rb +32 -4
  286. data/spec/integration/faces/documentation_spec.rb +1 -1
  287. data/spec/integration/network/http/api/indirected_routes_spec.rb +33 -0
  288. data/spec/integration/node/environment_spec.rb +21 -0
  289. data/spec/integration/parser/collection_spec.rb +10 -0
  290. data/spec/integration/parser/compiler_spec.rb +76 -840
  291. data/spec/integration/parser/functions/require_spec.rb +3 -3
  292. data/spec/integration/parser/parameter_defaults_spec.rb +6 -2
  293. data/spec/integration/parser/pcore_resource_spec.rb +208 -0
  294. data/spec/integration/parser/resource_expressions_spec.rb +4 -2
  295. data/spec/integration/provider/yumrepo_spec.rb +4 -1
  296. data/spec/integration/transaction/report_spec.rb +666 -0
  297. data/spec/integration/type/file_spec.rb +11 -12
  298. data/spec/integration/util/windows/adsi_spec.rb +99 -0
  299. data/spec/integration/util/windows/principal_spec.rb +109 -60
  300. data/spec/integration/util/windows/process_spec.rb +4 -2
  301. data/spec/integration/util/windows/security_spec.rb +34 -8
  302. data/spec/integration/util/windows/user_spec.rb +26 -4
  303. data/spec/lib/puppet_spec/files.rb +2 -2
  304. data/spec/lib/puppet_spec/network.rb +12 -8
  305. data/spec/shared_examples/rhel_package_provider.rb +341 -0
  306. data/spec/spec_helper.rb +8 -2
  307. data/spec/unit/application/cert_spec.rb +20 -0
  308. data/spec/unit/configurer/plugin_handler_spec.rb +0 -26
  309. data/spec/unit/configurer_spec.rb +46 -0
  310. data/spec/unit/defaults_spec.rb +14 -0
  311. data/spec/unit/face/generate_spec.rb +230 -0
  312. data/spec/unit/face/help_spec.rb +53 -0
  313. data/spec/unit/face/parser_spec.rb +6 -0
  314. data/spec/unit/face/plugin_spec.rb +0 -4
  315. data/spec/unit/file_system_spec.rb +85 -0
  316. data/spec/unit/functions/lookup_spec.rb +4 -4
  317. data/spec/unit/functions/match_spec.rb +2 -2
  318. data/spec/unit/functions/regsubst_spec.rb +1 -1
  319. data/spec/unit/functions/split_spec.rb +1 -1
  320. data/spec/unit/functions/unwrap_spec.rb +29 -0
  321. data/spec/unit/functions/versioncmp_spec.rb +1 -1
  322. data/spec/unit/functions4_spec.rb +8 -8
  323. data/spec/unit/indirector/facts/facter_spec.rb +1 -9
  324. data/spec/unit/indirector/rest_spec.rb +95 -9
  325. data/spec/unit/module_spec.rb +43 -7
  326. data/spec/unit/module_tool/applications/installer_spec.rb +10 -1
  327. data/spec/unit/module_tool/applications/unpacker_spec.rb +2 -1
  328. data/spec/unit/module_tool/applications/upgrader_spec.rb +8 -0
  329. data/spec/unit/module_tool/tar/mini_spec.rb +3 -3
  330. data/spec/unit/network/http/api/indirected_routes_spec.rb +49 -58
  331. data/spec/unit/network/http/api/master/v3_spec.rb +7 -4
  332. data/spec/unit/network/rights_spec.rb +1 -1
  333. data/spec/unit/parameter_spec.rb +11 -0
  334. data/spec/unit/parser/compiler_spec.rb +19 -33
  335. data/spec/unit/{appmgmt_spec.rb → parser/environment_compiler_spec.rb} +12 -1
  336. data/spec/unit/parser/functions/create_resources_spec.rb +76 -4
  337. data/spec/unit/parser/functions/require_spec.rb +2 -2
  338. data/spec/unit/parser/resource_spec.rb +21 -11
  339. data/spec/unit/parser/scope_spec.rb +1 -5
  340. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +1 -1
  341. data/spec/unit/pops/loaders/dependency_loader_spec.rb +1 -1
  342. data/spec/unit/pops/loaders/loader_paths_spec.rb +1 -1
  343. data/spec/unit/pops/loaders/loaders_spec.rb +63 -5
  344. data/spec/unit/pops/loaders/module_loaders_spec.rb +2 -2
  345. data/spec/unit/pops/loaders/static_loader_spec.rb +1 -1
  346. data/spec/unit/pops/parser/lexer2_spec.rb +27 -3
  347. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +8 -0
  348. data/spec/unit/pops/parser/parse_calls_spec.rb +9 -0
  349. data/spec/unit/pops/puppet_stack_spec.rb +79 -0
  350. data/spec/unit/pops/resource/resource_type_impl_spec.rb +37 -0
  351. data/spec/unit/pops/serialization/packer_spec.rb +153 -0
  352. data/spec/unit/pops/serialization/rgen_spec.rb +88 -0
  353. data/spec/unit/pops/serialization/serialization_spec.rb +228 -0
  354. data/spec/unit/pops/types/p_object_type_spec.rb +44 -2
  355. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +42 -0
  356. data/spec/unit/pops/types/p_sensitive_type_spec.rb +139 -0
  357. data/spec/unit/pops/types/p_type_set_type_spec.rb +424 -0
  358. data/spec/unit/pops/types/ruby_generator_spec.rb +497 -181
  359. data/spec/unit/pops/types/type_calculator_spec.rb +10 -4
  360. data/spec/unit/pops/types/type_formatter_spec.rb +1 -1
  361. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +2 -2
  362. data/spec/unit/pops/types/type_parser_spec.rb +1 -1
  363. data/spec/unit/pops/types/types_spec.rb +1 -1
  364. data/spec/unit/pops/validator/validator_spec.rb +18 -1
  365. data/spec/unit/property_spec.rb +48 -11
  366. data/spec/unit/provider/group/windows_adsi_spec.rb +11 -1
  367. data/spec/unit/provider/package/dnf_spec.rb +1 -99
  368. data/spec/unit/provider/package/pacman_spec.rb +4 -4
  369. data/spec/unit/provider/package/pip_spec.rb +14 -0
  370. data/spec/unit/provider/package/pkg_spec.rb +6 -0
  371. data/spec/unit/provider/package/pkgdmg_spec.rb +0 -3
  372. data/spec/unit/provider/package/portage_spec.rb +64 -8
  373. data/spec/unit/provider/package/tdnf_spec.rb +18 -0
  374. data/spec/unit/provider/package/windows/package_spec.rb +4 -1
  375. data/spec/unit/provider/package/windows_spec.rb +8 -2
  376. data/spec/unit/provider/package/yum_spec.rb +6 -377
  377. data/spec/unit/provider/service/base_spec.rb +6 -0
  378. data/spec/unit/provider/service/debian_spec.rb +16 -7
  379. data/spec/unit/provider/service/gentoo_spec.rb +6 -0
  380. data/spec/unit/provider/service/init_spec.rb +7 -0
  381. data/spec/unit/provider/service/launchd_spec.rb +35 -4
  382. data/spec/unit/provider/service/openrc_spec.rb +6 -0
  383. data/spec/unit/provider/service/smf_spec.rb +31 -6
  384. data/spec/unit/provider/service/src_spec.rb +6 -0
  385. data/spec/unit/provider/service/systemd_spec.rb +70 -20
  386. data/spec/unit/provider/service/upstart_spec.rb +6 -0
  387. data/spec/unit/provider/user/aix_spec.rb +7 -0
  388. data/spec/unit/provider/user/directoryservice_spec.rb +30 -1
  389. data/spec/unit/provider/user/windows_adsi_spec.rb +19 -0
  390. data/spec/unit/resource/capability_finder_spec.rb +51 -3
  391. data/spec/unit/resource/catalog_spec.rb +5 -0
  392. data/spec/unit/resource/type_spec.rb +2 -2
  393. data/spec/unit/resource_spec.rb +19 -0
  394. data/spec/unit/settings_spec.rb +13 -0
  395. data/spec/unit/ssl/certificate_authority/interface_spec.rb +176 -10
  396. data/spec/unit/ssl/certificate_authority_spec.rb +63 -22
  397. data/spec/unit/ssl/host_spec.rb +1 -1
  398. data/spec/unit/ssl/oids_spec.rb +24 -21
  399. data/spec/unit/transaction/event_spec.rb +3 -1
  400. data/spec/unit/transaction/persistence_spec.rb +173 -0
  401. data/spec/unit/transaction/report_spec.rb +64 -1
  402. data/spec/unit/transaction/resource_harness_spec.rb +91 -0
  403. data/spec/unit/type/file/content_spec.rb +47 -15
  404. data/spec/unit/type/file_spec.rb +28 -0
  405. data/spec/unit/type/mount_spec.rb +5 -12
  406. data/spec/unit/type/yumrepo_spec.rb +1 -5
  407. data/spec/unit/type_spec.rb +32 -0
  408. data/spec/unit/util/command_line_spec.rb +11 -0
  409. data/spec/unit/util/execution_spec.rb +1 -1
  410. data/spec/unit/util/plist_spec.rb +16 -3
  411. data/spec/unit/util/storage_spec.rb +4 -1
  412. data/spec/unit/util/windows/adsi_spec.rb +23 -2
  413. data/spec/unit/util/windows/file_spec.rb +56 -1
  414. data/spec/unit/util/windows/sid_spec.rb +31 -7
  415. data/spec/unit/util/yaml_spec.rb +12 -0
  416. data/spec/unit/util_spec.rb +87 -20
  417. metadata +89 -34
  418. data/ext/puppetlisten/puppetlisten.rb +0 -77
  419. data/ext/puppetlisten/puppetrun.rb +0 -38
  420. data/lib/puppet/resource/type_collection_helper.rb +0 -7
  421. data/spec/unit/parser/functions/defined_spec.rb +0 -120
  422. 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(*ranges)
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