puppet 4.1.0 → 4.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1628) hide show
  1. checksums.yaml +4 -4
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +34 -10
  4. data/Gemfile +26 -9
  5. data/LICENSE +3 -3
  6. data/MAINTAINERS +71 -0
  7. data/README.md +9 -11
  8. data/Rakefile +35 -0
  9. data/conf/auth.conf +2 -2
  10. data/conf/puppet.conf +1 -1
  11. data/ext/README.environment +1 -1
  12. data/ext/build_defaults.yaml +2 -2
  13. data/ext/debian/README.source +1 -1
  14. data/ext/debian/control +3 -5
  15. data/ext/debian/copyright +4 -4
  16. data/ext/debian/puppet.init +0 -1
  17. data/ext/debian/puppet.logrotate +14 -5
  18. data/ext/debian/puppetmaster.README.debian +11 -9
  19. data/ext/emacs/puppet-mode.el +1 -1
  20. data/ext/envpuppet +2 -2
  21. data/ext/ips/puppetagent.xml +1 -1
  22. data/ext/ips/puppetmaster.xml +1 -1
  23. data/ext/osx/puppet.plist +30 -0
  24. data/ext/project_data.yaml +31 -15
  25. data/ext/puppet-test +3 -3
  26. data/ext/rack/example-passenger-vhost.conf +1 -1
  27. data/ext/redhat/client.init +67 -17
  28. data/ext/redhat/client.sysconfig +1 -10
  29. data/ext/redhat/logrotate +15 -3
  30. data/ext/redhat/puppet.spec.erb +6 -11
  31. data/ext/redhat/server.init +1 -1
  32. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  33. data/ext/solaris/pkginfo +1 -1
  34. data/ext/solaris/smf/puppet +44 -0
  35. data/ext/solaris/smf/puppet.xml +44 -0
  36. data/ext/suse/client.init +30 -33
  37. data/ext/suse/puppet.spec +2 -2
  38. data/ext/suse/server.init +2 -2
  39. data/ext/systemd/puppet.service +13 -1
  40. data/ext/upload_facts.rb +1 -1
  41. data/ext/windows/puppet_interactive.bat +6 -0
  42. data/ext/windows/puppet_shell.bat +9 -0
  43. data/ext/windows/run_puppet_interactive.bat +9 -0
  44. data/ext/windows/service/daemon.rb +2 -1
  45. data/ext/yaml_nodes.rb +1 -1
  46. data/install.rb +98 -65
  47. data/lib/hiera/puppet_function.rb +17 -18
  48. data/lib/hiera/scope.rb +12 -14
  49. data/lib/hiera_puppet.rb +6 -14
  50. data/lib/puppet/agent/locker.rb +11 -2
  51. data/lib/puppet/agent.rb +12 -27
  52. data/lib/puppet/application/agent.rb +35 -19
  53. data/lib/puppet/application/apply.rb +46 -14
  54. data/lib/puppet/application/ca.rb +1 -0
  55. data/lib/puppet/application/cert.rb +52 -3
  56. data/lib/puppet/application/device.rb +2 -2
  57. data/lib/puppet/application/face_base.rb +4 -0
  58. data/lib/puppet/application/filebucket.rb +79 -5
  59. data/lib/puppet/application/generate.rb +5 -0
  60. data/lib/puppet/application/inspect.rb +5 -2
  61. data/lib/puppet/application/lookup.rb +344 -0
  62. data/lib/puppet/application/master.rb +7 -3
  63. data/lib/puppet/application/resource.rb +2 -6
  64. data/lib/puppet/application.rb +20 -4
  65. data/lib/puppet/application_support.rb +1 -1
  66. data/lib/puppet/compilable_resource_type.rb +15 -0
  67. data/lib/puppet/configurer/plugin_handler.rb +7 -5
  68. data/lib/puppet/configurer.rb +177 -37
  69. data/lib/puppet/context/trusted_information.rb +21 -1
  70. data/lib/puppet/context.rb +16 -1
  71. data/lib/puppet/daemon.rb +17 -13
  72. data/lib/puppet/data_binding.rb +4 -2
  73. data/lib/puppet/data_providers/data_adapter.rb +14 -68
  74. data/lib/puppet/data_providers/data_function_support.rb +13 -26
  75. data/lib/puppet/data_providers/function_env_data_provider.rb +7 -9
  76. data/lib/puppet/data_providers/function_module_data_provider.rb +7 -22
  77. data/lib/puppet/data_providers/hiera_config.rb +151 -0
  78. data/lib/puppet/data_providers/hiera_env_data_provider.rb +25 -0
  79. data/lib/puppet/data_providers/hiera_interpolate.rb +21 -0
  80. data/lib/puppet/data_providers/hiera_module_data_provider.rb +30 -0
  81. data/lib/puppet/data_providers/hiera_support.rb +42 -0
  82. data/lib/puppet/data_providers/json_data_provider_factory.rb +38 -0
  83. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +40 -0
  84. data/lib/puppet/data_providers.rb +17 -14
  85. data/lib/puppet/defaults.rb +273 -59
  86. data/lib/puppet/environments.rb +104 -9
  87. data/lib/puppet/error.rb +4 -0
  88. data/lib/puppet/etc.rb +125 -0
  89. data/lib/puppet/external/dot.rb +1 -1
  90. data/lib/puppet/face/ca.rb +6 -1
  91. data/lib/puppet/face/catalog.rb +1 -1
  92. data/lib/puppet/face/certificate.rb +7 -1
  93. data/lib/puppet/face/certificate_request.rb +2 -0
  94. data/lib/puppet/face/certificate_revocation_list.rb +2 -0
  95. data/lib/puppet/face/config.rb +2 -2
  96. data/lib/puppet/face/epp.rb +63 -17
  97. data/lib/puppet/face/file.rb +3 -0
  98. data/lib/puppet/face/generate.rb +64 -0
  99. data/lib/puppet/face/help/face.erb +3 -0
  100. data/lib/puppet/face/help/man.erb +1 -1
  101. data/lib/puppet/face/help.rb +35 -27
  102. data/lib/puppet/face/key.rb +1 -0
  103. data/lib/puppet/face/man.rb +5 -3
  104. data/lib/puppet/face/module/changes.rb +2 -1
  105. data/lib/puppet/face/module/generate.rb +1 -1
  106. data/lib/puppet/face/module/install.rb +6 -6
  107. data/lib/puppet/face/parser.rb +12 -9
  108. data/lib/puppet/face/plugin.rb +7 -14
  109. data/lib/puppet/face/status.rb +4 -1
  110. data/lib/puppet/feature/base.rb +9 -2
  111. data/lib/puppet/feature/cfacter.rb +1 -0
  112. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  113. data/lib/puppet/feature/external_facts.rb +1 -1
  114. data/lib/puppet/feature/hiera_eyaml.rb +3 -0
  115. data/lib/puppet/feature/hocon.rb +3 -0
  116. data/lib/puppet/feature/telnet.rb +9 -0
  117. data/lib/puppet/file_bucket/dipper.rb +58 -2
  118. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  119. data/lib/puppet/file_serving/metadata.rb +18 -2
  120. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  121. data/lib/puppet/file_system/file_impl.rb +7 -2
  122. data/lib/puppet/file_system/memory_impl.rb +5 -1
  123. data/lib/puppet/file_system/path_pattern.rb +1 -0
  124. data/lib/puppet/file_system/uniquefile.rb +3 -3
  125. data/lib/puppet/file_system/windows.rb +28 -13
  126. data/lib/puppet/file_system.rb +33 -5
  127. data/lib/puppet/forge/repository.rb +3 -35
  128. data/lib/puppet/forge.rb +7 -7
  129. data/lib/puppet/functions/alert.rb +14 -0
  130. data/lib/puppet/functions/assert_type.rb +53 -19
  131. data/lib/puppet/functions/binary_file.rb +19 -0
  132. data/lib/puppet/functions/break.rb +22 -0
  133. data/lib/puppet/functions/contain.rb +33 -0
  134. data/lib/puppet/functions/crit.rb +14 -0
  135. data/lib/puppet/functions/debug.rb +14 -0
  136. data/lib/puppet/functions/defined.rb +88 -58
  137. data/lib/puppet/functions/dig.rb +23 -0
  138. data/lib/puppet/functions/each.rb +89 -39
  139. data/lib/puppet/functions/emerg.rb +14 -0
  140. data/lib/puppet/functions/epp.rb +29 -37
  141. data/lib/puppet/functions/err.rb +14 -0
  142. data/lib/puppet/functions/eyaml_lookup_key.rb +90 -0
  143. data/lib/puppet/functions/filter.rb +64 -38
  144. data/lib/puppet/functions/find_file.rb +31 -0
  145. data/lib/puppet/functions/hiera.rb +76 -3
  146. data/lib/puppet/functions/hiera_array.rb +66 -4
  147. data/lib/puppet/functions/hiera_hash.rb +74 -2
  148. data/lib/puppet/functions/hiera_include.rb +78 -5
  149. data/lib/puppet/functions/hocon_data.rb +35 -0
  150. data/lib/puppet/functions/include.rb +21 -0
  151. data/lib/puppet/functions/info.rb +14 -0
  152. data/lib/puppet/functions/inline_epp.rb +44 -71
  153. data/lib/puppet/functions/json_data.rb +29 -0
  154. data/lib/puppet/functions/lest.rb +17 -0
  155. data/lib/puppet/functions/lookup.rb +172 -184
  156. data/lib/puppet/functions/map.rb +60 -33
  157. data/lib/puppet/functions/match.rb +30 -12
  158. data/lib/puppet/functions/new.rb +31 -0
  159. data/lib/puppet/functions/next.rb +23 -0
  160. data/lib/puppet/functions/notice.rb +14 -0
  161. data/lib/puppet/functions/reduce.rb +99 -70
  162. data/lib/puppet/functions/regsubst.rb +22 -25
  163. data/lib/puppet/functions/require.rb +37 -0
  164. data/lib/puppet/functions/return.rb +22 -0
  165. data/lib/puppet/functions/reverse_each.rb +25 -0
  166. data/lib/puppet/functions/scanf.rb +15 -18
  167. data/lib/puppet/functions/slice.rb +22 -36
  168. data/lib/puppet/functions/split.rb +2 -2
  169. data/lib/puppet/functions/step.rb +26 -0
  170. data/lib/puppet/functions/strftime.rb +35 -0
  171. data/lib/puppet/functions/then.rb +14 -0
  172. data/lib/puppet/functions/type.rb +31 -0
  173. data/lib/puppet/functions/unwrap.rb +40 -0
  174. data/lib/puppet/functions/versioncmp.rb +36 -0
  175. data/lib/puppet/functions/warning.rb +14 -0
  176. data/lib/puppet/functions/with.rb +15 -7
  177. data/lib/puppet/functions/yaml_data.rb +38 -0
  178. data/lib/puppet/functions.rb +180 -32
  179. data/lib/puppet/generate/models/type/property.rb +70 -0
  180. data/lib/puppet/generate/models/type/type.rb +61 -0
  181. data/lib/puppet/generate/templates/type/pcore.erb +42 -0
  182. data/lib/puppet/generate/type.rb +239 -0
  183. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  184. data/lib/puppet/graph/simple_graph.rb +6 -8
  185. data/lib/puppet/indirector/catalog/compiler.rb +195 -8
  186. data/lib/puppet/indirector/catalog/static_compiler.rb +50 -31
  187. data/lib/puppet/indirector/data_binding/none.rb +4 -1
  188. data/lib/puppet/indirector/face.rb +6 -1
  189. data/lib/puppet/indirector/facts/facter.rb +3 -6
  190. data/lib/puppet/indirector/file_bucket_file/file.rb +137 -25
  191. data/lib/puppet/indirector/file_content/http.rb +15 -0
  192. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  193. data/lib/puppet/indirector/generic_http.rb +16 -0
  194. data/lib/puppet/indirector/hiera.rb +7 -1
  195. data/lib/puppet/indirector/indirection.rb +12 -3
  196. data/lib/puppet/indirector/json.rb +3 -3
  197. data/lib/puppet/indirector/key/ca.rb +2 -2
  198. data/lib/puppet/indirector/key/file.rb +2 -1
  199. data/lib/puppet/indirector/msgpack.rb +2 -2
  200. data/lib/puppet/indirector/node/exec.rb +1 -1
  201. data/lib/puppet/indirector/node/ldap.rb +1 -1
  202. data/lib/puppet/indirector/request.rb +36 -12
  203. data/lib/puppet/indirector/resource_type/parser.rb +10 -3
  204. data/lib/puppet/indirector/rest.rb +80 -5
  205. data/lib/puppet/indirector/ssl_file.rb +24 -3
  206. data/lib/puppet/indirector/terminus.rb +4 -4
  207. data/lib/puppet/info_service/class_information_service.rb +111 -0
  208. data/lib/puppet/info_service.rb +7 -0
  209. data/lib/puppet/interface/documentation.rb +1 -1
  210. data/lib/puppet/interface/face_collection.rb +1 -1
  211. data/lib/puppet/interface.rb +14 -2
  212. data/lib/puppet/loaders.rb +5 -0
  213. data/lib/puppet/metatype/manager.rb +25 -8
  214. data/lib/puppet/module.rb +65 -31
  215. data/lib/puppet/module_tool/applications/application.rb +1 -1
  216. data/lib/puppet/module_tool/applications/builder.rb +5 -4
  217. data/lib/puppet/module_tool/applications/installer.rb +14 -14
  218. data/lib/puppet/module_tool/applications/unpacker.rb +1 -1
  219. data/lib/puppet/module_tool/applications/upgrader.rb +13 -13
  220. data/lib/puppet/module_tool/checksums.rb +1 -1
  221. data/lib/puppet/module_tool/errors/installer.rb +2 -2
  222. data/lib/puppet/module_tool/installed_modules.rb +7 -7
  223. data/lib/puppet/module_tool/local_tarball.rb +3 -3
  224. data/lib/puppet/module_tool/metadata.rb +34 -11
  225. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +14 -3
  226. data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +42 -38
  227. data/lib/puppet/module_tool/skeleton/templates/generator/Rakefile +19 -4
  228. data/lib/puppet/module_tool/skeleton/templates/generator/{tests → examples}/init.pp.erb +2 -2
  229. data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +25 -18
  230. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -2
  231. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  232. data/lib/puppet/module_tool.rb +5 -5
  233. data/lib/puppet/network/auth_config_parser.rb +1 -1
  234. data/lib/puppet/network/authconfig.rb +21 -1
  235. data/lib/puppet/network/authorization.rb +8 -1
  236. data/lib/puppet/network/http/api/indirected_routes.rb +23 -34
  237. data/lib/puppet/network/http/api/master/v3/environment.rb +63 -0
  238. data/lib/puppet/network/http/api/master/v3.rb +7 -1
  239. data/lib/puppet/network/http/compression.rb +2 -1
  240. data/lib/puppet/network/http/connection.rb +2 -0
  241. data/lib/puppet/network/http/error.rb +1 -1
  242. data/lib/puppet/network/http/factory.rb +8 -4
  243. data/lib/puppet/network/http/handler.rb +3 -2
  244. data/lib/puppet/network/http/pool.rb +9 -0
  245. data/lib/puppet/network/http/rack/rest.rb +25 -2
  246. data/lib/puppet/network/http/webrick.rb +2 -1
  247. data/lib/puppet/network/rights.rb +1 -11
  248. data/lib/puppet/node/environment.rb +49 -14
  249. data/lib/puppet/node/facts.rb +1 -1
  250. data/lib/puppet/node.rb +22 -7
  251. data/lib/puppet/parameter/boolean.rb +1 -1
  252. data/lib/puppet/parameter/value.rb +1 -1
  253. data/lib/puppet/parameter.rb +23 -3
  254. data/lib/puppet/parser/ast/pops_bridge.rb +97 -27
  255. data/lib/puppet/parser/ast/resource.rb +5 -0
  256. data/lib/puppet/parser/ast/resource_instance.rb +5 -1
  257. data/lib/puppet/parser/ast/resourceparam.rb +5 -0
  258. data/lib/puppet/parser/ast.rb +5 -0
  259. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
  260. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +60 -0
  261. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
  262. data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
  263. data/lib/puppet/parser/compiler.rb +325 -42
  264. data/lib/puppet/parser/e4_parser_adapter.rb +13 -12
  265. data/lib/puppet/parser/environment_compiler.rb +201 -0
  266. data/lib/puppet/parser/functions/assert_type.rb +47 -17
  267. data/lib/puppet/parser/functions/binary_file.rb +24 -0
  268. data/lib/puppet/parser/functions/break.rb +39 -0
  269. data/lib/puppet/parser/functions/contain.rb +7 -15
  270. data/lib/puppet/parser/functions/create_resources.rb +39 -23
  271. data/lib/puppet/parser/functions/defined.rb +106 -93
  272. data/lib/puppet/parser/functions/dig.rb +29 -0
  273. data/lib/puppet/parser/functions/each.rb +86 -28
  274. data/lib/puppet/parser/functions/epp.rb +30 -38
  275. data/lib/puppet/parser/functions/filter.rb +60 -24
  276. data/lib/puppet/parser/functions/find_file.rb +28 -0
  277. data/lib/puppet/parser/functions/fqdn_rand.rb +3 -3
  278. data/lib/puppet/parser/functions/hiera.rb +98 -28
  279. data/lib/puppet/parser/functions/hiera_array.rb +86 -29
  280. data/lib/puppet/parser/functions/hiera_hash.rb +96 -31
  281. data/lib/puppet/parser/functions/hiera_include.rb +96 -41
  282. data/lib/puppet/parser/functions/include.rb +4 -8
  283. data/lib/puppet/parser/functions/inline_epp.rb +36 -61
  284. data/lib/puppet/parser/functions/inline_template.rb +2 -2
  285. data/lib/puppet/parser/functions/lest.rb +49 -0
  286. data/lib/puppet/parser/functions/lookup.rb +129 -151
  287. data/lib/puppet/parser/functions/map.rb +56 -21
  288. data/lib/puppet/parser/functions/match.rb +29 -13
  289. data/lib/puppet/parser/functions/new.rb +926 -0
  290. data/lib/puppet/parser/functions/next.rb +38 -0
  291. data/lib/puppet/parser/functions/reduce.rb +98 -61
  292. data/lib/puppet/parser/functions/regsubst.rb +4 -2
  293. data/lib/puppet/parser/functions/require.rb +4 -27
  294. data/lib/puppet/parser/functions/return.rb +71 -0
  295. data/lib/puppet/parser/functions/reverse_each.rb +83 -0
  296. data/lib/puppet/parser/functions/scanf.rb +25 -31
  297. data/lib/puppet/parser/functions/slice.rb +18 -25
  298. data/lib/puppet/parser/functions/split.rb +2 -2
  299. data/lib/puppet/parser/functions/step.rb +84 -0
  300. data/lib/puppet/parser/functions/strftime.rb +185 -0
  301. data/lib/puppet/parser/functions/then.rb +73 -0
  302. data/lib/puppet/parser/functions/type.rb +53 -0
  303. data/lib/puppet/parser/functions/with.rb +17 -9
  304. data/lib/puppet/parser/functions.rb +34 -16
  305. data/lib/puppet/parser/resource.rb +149 -35
  306. data/lib/puppet/parser/scope.rb +344 -88
  307. data/lib/puppet/parser/type_loader.rb +1 -1
  308. data/lib/puppet/parser.rb +3 -1
  309. data/lib/puppet/plugins/configuration.rb +11 -2
  310. data/lib/puppet/plugins/data_providers/data_provider.rb +406 -0
  311. data/lib/puppet/plugins/data_providers/registry.rb +51 -0
  312. data/lib/puppet/plugins/data_providers.rb +15 -60
  313. data/lib/puppet/pops/adaptable.rb +4 -4
  314. data/lib/puppet/pops/adapters.rb +114 -31
  315. data/lib/puppet/pops/binder/binder.rb +21 -17
  316. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  317. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  318. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  319. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  320. data/lib/puppet/pops/binder/bindings_label_provider.rb +3 -1
  321. data/lib/puppet/pops/binder/bindings_loader.rb +6 -2
  322. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  323. data/lib/puppet/pops/binder/bindings_model_meta.rb +2 -2
  324. data/lib/puppet/pops/binder/config/binder_config.rb +1 -1
  325. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  326. data/lib/puppet/pops/binder/injector.rb +55 -50
  327. data/lib/puppet/pops/binder/key_factory.rb +10 -12
  328. data/lib/puppet/pops/binder/producers.rb +70 -65
  329. data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +1 -1
  330. data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +68 -9
  331. data/lib/puppet/pops/evaluator/access_operator.rb +246 -147
  332. data/lib/puppet/pops/evaluator/callable_signature.rb +7 -0
  333. data/lib/puppet/pops/evaluator/closure.rb +231 -115
  334. data/lib/puppet/pops/evaluator/collector_transformer.rb +44 -15
  335. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
  336. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +1 -2
  337. data/lib/puppet/pops/evaluator/compare_operator.rb +69 -12
  338. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  339. data/lib/puppet/pops/evaluator/evaluator_impl.rb +194 -106
  340. data/lib/puppet/pops/evaluator/external_syntax_support.rb +1 -1
  341. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +84 -0
  342. data/lib/puppet/pops/evaluator/literal_evaluator.rb +87 -0
  343. data/lib/puppet/pops/evaluator/relationship_operator.rb +18 -11
  344. data/lib/puppet/pops/evaluator/runtime3_converter.rb +60 -51
  345. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +119 -0
  346. data/lib/puppet/pops/evaluator/runtime3_support.rb +111 -79
  347. data/lib/puppet/pops/functions/dispatch.rb +27 -7
  348. data/lib/puppet/pops/functions/dispatcher.rb +15 -20
  349. data/lib/puppet/pops/functions/function.rb +30 -4
  350. data/lib/puppet/pops/issue_reporter.rb +7 -5
  351. data/lib/puppet/pops/issues.rb +177 -17
  352. data/lib/puppet/pops/label_provider.rb +18 -4
  353. data/lib/puppet/pops/loader/base_loader.rb +74 -20
  354. data/lib/puppet/pops/loader/dependency_loader.rb +27 -2
  355. data/lib/puppet/pops/loader/loader.rb +43 -49
  356. data/lib/puppet/pops/loader/loader_paths.rb +48 -2
  357. data/lib/puppet/pops/loader/module_loaders.rb +53 -20
  358. data/lib/puppet/pops/loader/null_loader.rb +17 -1
  359. data/lib/puppet/pops/loader/predefined_loader.rb +29 -0
  360. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +26 -20
  361. data/lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb +80 -0
  362. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -4
  363. data/lib/puppet/pops/loader/runtime3_type_loader.rb +96 -0
  364. data/lib/puppet/pops/loader/static_loader.rb +139 -38
  365. data/lib/puppet/pops/loader/type_definition_instantiator.rb +93 -0
  366. data/lib/puppet/pops/loader/typed_name.rb +48 -0
  367. data/lib/puppet/pops/loaders.rb +204 -26
  368. data/lib/puppet/pops/lookup/configured_data_provider.rb +93 -0
  369. data/lib/puppet/pops/lookup/context.rb +200 -0
  370. data/lib/puppet/pops/lookup/data_adapter.rb +27 -0
  371. data/lib/puppet/pops/lookup/data_dig_function_provider.rb +145 -0
  372. data/lib/puppet/pops/lookup/data_hash_function_provider.rb +126 -0
  373. data/lib/puppet/pops/lookup/data_provider.rb +107 -0
  374. data/lib/puppet/pops/lookup/environment_data_provider.rb +35 -0
  375. data/lib/puppet/pops/lookup/explainer.rb +594 -0
  376. data/lib/puppet/pops/lookup/function_provider.rb +110 -0
  377. data/lib/puppet/pops/lookup/global_data_provider.rb +78 -0
  378. data/lib/puppet/pops/lookup/hiera_config.rb +782 -0
  379. data/lib/puppet/pops/lookup/interpolation.rb +153 -0
  380. data/lib/puppet/pops/lookup/invocation.rb +251 -0
  381. data/lib/puppet/pops/lookup/location_resolver.rb +99 -0
  382. data/lib/puppet/pops/lookup/lookup_adapter.rb +510 -0
  383. data/lib/puppet/pops/lookup/lookup_key.rb +99 -0
  384. data/lib/puppet/pops/lookup/lookup_key_function_provider.rb +92 -0
  385. data/lib/puppet/pops/lookup/module_data_provider.rb +81 -0
  386. data/lib/puppet/pops/lookup/sub_lookup.rb +90 -0
  387. data/lib/puppet/pops/lookup.rb +47 -49
  388. data/lib/puppet/pops/merge_strategy.rb +183 -47
  389. data/lib/puppet/pops/migration/migration_checker.rb +4 -0
  390. data/lib/puppet/pops/model/ast_transformer.rb +8 -1
  391. data/lib/puppet/pops/model/factory.rb +254 -162
  392. data/lib/puppet/pops/model/model.rb +25 -8
  393. data/lib/puppet/pops/model/model_label_provider.rb +28 -6
  394. data/lib/puppet/pops/model/model_meta.rb +45 -2
  395. data/lib/puppet/pops/model/model_tree_dumper.rb +44 -0
  396. data/lib/puppet/pops/parser/code_merger.rb +13 -1
  397. data/lib/puppet/pops/parser/egrammar.ra +150 -32
  398. data/lib/puppet/pops/parser/eparser.rb +1887 -1321
  399. data/lib/puppet/pops/parser/epp_support.rb +15 -9
  400. data/lib/puppet/pops/parser/evaluating_parser.rb +21 -13
  401. data/lib/puppet/pops/parser/heredoc_support.rb +16 -13
  402. data/lib/puppet/pops/parser/interpolation_support.rb +7 -0
  403. data/lib/puppet/pops/parser/lexer2.rb +465 -396
  404. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  405. data/lib/puppet/pops/parser/locator.rb +63 -9
  406. data/lib/puppet/pops/parser/parser_support.rb +40 -28
  407. data/lib/puppet/pops/parser/slurp_support.rb +23 -14
  408. data/lib/puppet/pops/patterns.rb +16 -1
  409. data/lib/puppet/pops/pcore.rb +96 -0
  410. data/lib/puppet/pops/puppet_stack.rb +43 -0
  411. data/lib/puppet/pops/resource/param.rb +55 -0
  412. data/lib/puppet/pops/resource/resource_type_impl.rb +314 -0
  413. data/lib/puppet/pops/resource/resource_type_set.pcore +22 -0
  414. data/lib/puppet/pops/serialization/abstract_reader.rb +176 -0
  415. data/lib/puppet/pops/serialization/abstract_writer.rb +207 -0
  416. data/lib/puppet/pops/serialization/deserializer.rb +77 -0
  417. data/lib/puppet/pops/serialization/extension.rb +157 -0
  418. data/lib/puppet/pops/serialization/instance_reader.rb +19 -0
  419. data/lib/puppet/pops/serialization/instance_writer.rb +14 -0
  420. data/lib/puppet/pops/serialization/json.rb +297 -0
  421. data/lib/puppet/pops/serialization/object.rb +71 -0
  422. data/lib/puppet/pops/serialization/rgen.rb +152 -0
  423. data/lib/puppet/pops/serialization/serializer.rb +118 -0
  424. data/lib/puppet/pops/serialization/time_factory.rb +67 -0
  425. data/lib/puppet/pops/serialization.rb +17 -0
  426. data/lib/puppet/pops/time/timespan.rb +718 -0
  427. data/lib/puppet/pops/time/timestamp.rb +148 -0
  428. data/lib/puppet/pops/types/annotatable.rb +36 -0
  429. data/lib/puppet/pops/types/class_loader.rb +25 -23
  430. data/lib/puppet/pops/types/enumeration.rb +9 -27
  431. data/lib/puppet/pops/types/implementation_registry.rb +141 -0
  432. data/lib/puppet/pops/types/iterable.rb +308 -0
  433. data/lib/puppet/pops/types/p_binary_type.rb +220 -0
  434. data/lib/puppet/pops/types/p_meta_type.rb +83 -0
  435. data/lib/puppet/pops/types/p_object_type.rb +886 -0
  436. data/lib/puppet/pops/types/p_runtime_type.rb +115 -0
  437. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +187 -0
  438. data/lib/puppet/pops/types/p_sem_ver_type.rb +141 -0
  439. data/lib/puppet/pops/types/p_sensitive_type.rb +73 -0
  440. data/lib/puppet/pops/types/p_timespan_type.rb +141 -0
  441. data/lib/puppet/pops/types/p_timestamp_type.rb +69 -0
  442. data/lib/puppet/pops/types/p_type_set_type.rb +352 -0
  443. data/lib/puppet/pops/types/puppet_object.rb +16 -0
  444. data/lib/puppet/pops/types/recursion_guard.rb +136 -0
  445. data/lib/puppet/pops/types/ruby_generator.rb +275 -0
  446. data/lib/puppet/pops/types/string_converter.rb +1033 -0
  447. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  448. data/lib/puppet/pops/types/type_asserter.rb +21 -19
  449. data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
  450. data/lib/puppet/pops/types/type_calculator.rb +244 -1287
  451. data/lib/puppet/pops/types/type_conversion_error.rb +15 -0
  452. data/lib/puppet/pops/types/type_factory.rb +222 -169
  453. data/lib/puppet/pops/types/type_formatter.rb +686 -0
  454. data/lib/puppet/pops/types/type_mismatch_describer.rb +1105 -0
  455. data/lib/puppet/pops/types/type_parser.rb +364 -281
  456. data/lib/puppet/pops/types/type_set_reference.rb +59 -0
  457. data/lib/puppet/pops/types/types.rb +3286 -307
  458. data/lib/puppet/pops/utils.rb +11 -10
  459. data/lib/puppet/pops/validation/checker4_0.rb +238 -56
  460. data/lib/puppet/pops/validation/validator_factory_4_0.rb +13 -5
  461. data/lib/puppet/pops/validation.rb +31 -16
  462. data/lib/puppet/pops/visitor.rb +9 -6
  463. data/lib/puppet/pops.rb +40 -25
  464. data/lib/puppet/property/ensure.rb +1 -1
  465. data/lib/puppet/property.rb +67 -7
  466. data/lib/puppet/provider/aixobject.rb +4 -4
  467. data/lib/puppet/provider/augeas/augeas.rb +57 -2
  468. data/lib/puppet/provider/cron/crontab.rb +1 -1
  469. data/lib/puppet/provider/exec/windows.rb +1 -1
  470. data/lib/puppet/provider/exec.rb +10 -3
  471. data/lib/puppet/provider/group/aix.rb +4 -4
  472. data/lib/puppet/provider/group/directoryservice.rb +10 -0
  473. data/lib/puppet/provider/group/pw.rb +1 -0
  474. data/lib/puppet/provider/group/windows_adsi.rb +15 -3
  475. data/lib/puppet/provider/macauthorization/macauthorization.rb +11 -10
  476. data/lib/puppet/provider/mailalias/aliases.rb +1 -1
  477. data/lib/puppet/provider/mcx/mcxcontent.rb +5 -4
  478. data/lib/puppet/provider/mount/parsed.rb +16 -2
  479. data/lib/puppet/provider/nameservice/directoryservice.rb +55 -62
  480. data/lib/puppet/provider/nameservice.rb +23 -8
  481. data/lib/puppet/provider/package/appdmg.rb +7 -6
  482. data/lib/puppet/provider/package/apple.rb +1 -1
  483. data/lib/puppet/provider/package/dnf.rb +46 -0
  484. data/lib/puppet/provider/package/gem.rb +29 -3
  485. data/lib/puppet/provider/package/nim.rb +2 -2
  486. data/lib/puppet/provider/package/openbsd.rb +7 -7
  487. data/lib/puppet/provider/package/pacman.rb +11 -10
  488. data/lib/puppet/provider/package/pip.rb +72 -20
  489. data/lib/puppet/provider/package/pip3.rb +20 -0
  490. data/lib/puppet/provider/package/pkg.rb +12 -8
  491. data/lib/puppet/provider/package/pkgdmg.rb +11 -8
  492. data/lib/puppet/provider/package/pkgin.rb +4 -4
  493. data/lib/puppet/provider/package/pkgng.rb +15 -6
  494. data/lib/puppet/provider/package/pkgutil.rb +1 -1
  495. data/lib/puppet/provider/package/portage.rb +48 -8
  496. data/lib/puppet/provider/package/puppet_gem.rb +0 -0
  497. data/lib/puppet/provider/package/rpm.rb +123 -17
  498. data/lib/puppet/provider/package/sun.rb +1 -1
  499. data/lib/puppet/provider/package/tdnf.rb +28 -0
  500. data/lib/puppet/provider/package/windows/exe_package.rb +10 -8
  501. data/lib/puppet/provider/package/windows/msi_package.rb +4 -3
  502. data/lib/puppet/provider/package/windows/package.rb +9 -1
  503. data/lib/puppet/provider/package/windows.rb +1 -1
  504. data/lib/puppet/provider/package/yum.rb +62 -83
  505. data/lib/puppet/provider/package/zypper.rb +19 -0
  506. data/lib/puppet/provider/package.rb +6 -2
  507. data/lib/puppet/provider/parsedfile.rb +2 -2
  508. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +7 -0
  509. data/lib/puppet/provider/selmodule/semodule.rb +20 -16
  510. data/lib/puppet/provider/service/base.rb +4 -3
  511. data/lib/puppet/provider/service/bsd.rb +9 -9
  512. data/lib/puppet/provider/service/daemontools.rb +5 -5
  513. data/lib/puppet/provider/service/debian.rb +14 -5
  514. data/lib/puppet/provider/service/freebsd.rb +1 -1
  515. data/lib/puppet/provider/service/init.rb +20 -3
  516. data/lib/puppet/provider/service/launchd.rb +57 -19
  517. data/lib/puppet/provider/service/rcng.rb +51 -0
  518. data/lib/puppet/provider/service/redhat.rb +2 -1
  519. data/lib/puppet/provider/service/runit.rb +4 -4
  520. data/lib/puppet/provider/service/smf.rb +59 -8
  521. data/lib/puppet/provider/service/src.rb +66 -39
  522. data/lib/puppet/provider/service/systemd.rb +141 -22
  523. data/lib/puppet/provider/service/upstart.rb +1 -1
  524. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
  525. data/lib/puppet/provider/sshkey/parsed.rb +20 -10
  526. data/lib/puppet/provider/user/aix.rb +11 -5
  527. data/lib/puppet/provider/user/directoryservice.rb +43 -66
  528. data/lib/puppet/provider/user/hpux.rb +1 -1
  529. data/lib/puppet/provider/user/pw.rb +1 -0
  530. data/lib/puppet/provider/user/user_role_add.rb +19 -2
  531. data/lib/puppet/provider/user/windows_adsi.rb +11 -5
  532. data/lib/puppet/provider/yumrepo/inifile.rb +9 -6
  533. data/lib/puppet/provider/zfs/zfs.rb +2 -2
  534. data/lib/puppet/provider/zone/solaris.rb +6 -3
  535. data/lib/puppet/provider/zpool/zpool.rb +2 -2
  536. data/lib/puppet/provider.rb +9 -7
  537. data/lib/puppet/reference/configuration.rb +13 -5
  538. data/lib/puppet/reference/indirection.rb +1 -1
  539. data/lib/puppet/reference/providers.rb +2 -3
  540. data/lib/puppet/reference/report.rb +9 -12
  541. data/lib/puppet/reference/type.rb +1 -1
  542. data/lib/puppet/reports.rb +5 -1
  543. data/lib/puppet/resource/capability_finder.rb +128 -0
  544. data/lib/puppet/resource/catalog.rb +167 -36
  545. data/lib/puppet/resource/status.rb +30 -5
  546. data/lib/puppet/resource/type.rb +247 -50
  547. data/lib/puppet/resource/type_collection.rb +83 -10
  548. data/lib/puppet/resource.rb +211 -145
  549. data/lib/puppet/settings/base_setting.rb +9 -3
  550. data/lib/puppet/settings/config_file.rb +3 -2
  551. data/lib/puppet/settings/directory_setting.rb +6 -0
  552. data/lib/puppet/settings/environment_conf.rb +26 -6
  553. data/lib/puppet/settings/file_or_directory_setting.rb +6 -0
  554. data/lib/puppet/settings/file_setting.rb +20 -9
  555. data/lib/puppet/settings/ini_file.rb +2 -2
  556. data/lib/puppet/settings/server_list_setting.rb +20 -0
  557. data/lib/puppet/settings/symbolic_enum_setting.rb +17 -0
  558. data/lib/puppet/settings.rb +98 -45
  559. data/lib/puppet/ssl/base.rb +14 -1
  560. data/lib/puppet/ssl/certificate.rb +1 -1
  561. data/lib/puppet/ssl/certificate_authority/interface.rb +166 -26
  562. data/lib/puppet/ssl/certificate_authority.rb +49 -13
  563. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  564. data/lib/puppet/ssl/certificate_request.rb +5 -5
  565. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  566. data/lib/puppet/ssl/configuration.rb +4 -1
  567. data/lib/puppet/ssl/host.rb +26 -4
  568. data/lib/puppet/ssl/inventory.rb +10 -3
  569. data/lib/puppet/ssl/key.rb +7 -3
  570. data/lib/puppet/ssl/oids.rb +43 -3
  571. data/lib/puppet/ssl/validator/default_validator.rb +3 -3
  572. data/lib/puppet/syntax_checkers/base64.rb +41 -0
  573. data/lib/puppet/syntax_checkers/json.rb +0 -2
  574. data/lib/puppet/test/test_helper.rb +21 -7
  575. data/lib/puppet/transaction/additional_resource_generator.rb +101 -8
  576. data/lib/puppet/transaction/event.rb +29 -2
  577. data/lib/puppet/transaction/event_manager.rb +1 -1
  578. data/lib/puppet/transaction/persistence.rb +84 -0
  579. data/lib/puppet/transaction/report.rb +86 -4
  580. data/lib/puppet/transaction/resource_harness.rb +95 -35
  581. data/lib/puppet/transaction.rb +64 -36
  582. data/lib/puppet/type/augeas.rb +13 -4
  583. data/lib/puppet/type/component.rb +11 -0
  584. data/lib/puppet/type/cron.rb +13 -13
  585. data/lib/puppet/type/exec.rb +43 -19
  586. data/lib/puppet/type/file/checksum.rb +1 -0
  587. data/lib/puppet/type/file/checksum_value.rb +53 -0
  588. data/lib/puppet/type/file/content.rb +36 -121
  589. data/lib/puppet/type/file/data_sync.rb +92 -0
  590. data/lib/puppet/type/file/ensure.rb +21 -18
  591. data/lib/puppet/type/file/selcontext.rb +1 -1
  592. data/lib/puppet/type/file/source.rb +121 -34
  593. data/lib/puppet/type/file/target.rb +2 -2
  594. data/lib/puppet/type/file.rb +145 -46
  595. data/lib/puppet/type/filebucket.rb +1 -1
  596. data/lib/puppet/type/group.rb +26 -8
  597. data/lib/puppet/type/host.rb +1 -1
  598. data/lib/puppet/type/interface.rb +8 -3
  599. data/lib/puppet/type/macauthorization.rb +1 -1
  600. data/lib/puppet/type/mount.rb +16 -1
  601. data/lib/puppet/type/notify.rb +1 -1
  602. data/lib/puppet/type/package.rb +32 -12
  603. data/lib/puppet/type/resources.rb +1 -1
  604. data/lib/puppet/type/schedule.rb +5 -5
  605. data/lib/puppet/type/scheduled_task.rb +1 -1
  606. data/lib/puppet/type/service.rb +24 -0
  607. data/lib/puppet/type/ssh_authorized_key.rb +17 -11
  608. data/lib/puppet/type/sshkey.rb +5 -3
  609. data/lib/puppet/type/stage.rb +1 -1
  610. data/lib/puppet/type/tidy.rb +7 -4
  611. data/lib/puppet/type/user.rb +51 -26
  612. data/lib/puppet/type/yumrepo.rb +23 -3
  613. data/lib/puppet/type/zone.rb +6 -6
  614. data/lib/puppet/type.rb +175 -41
  615. data/lib/puppet/util/autoload.rb +16 -11
  616. data/lib/puppet/util/character_encoding.rb +95 -0
  617. data/lib/puppet/util/checksums.rb +74 -31
  618. data/lib/puppet/util/classgen.rb +1 -1
  619. data/lib/puppet/util/command_line/trollop.rb +1 -1
  620. data/lib/puppet/util/command_line.rb +10 -2
  621. data/lib/puppet/util/execution.rb +35 -16
  622. data/lib/puppet/util/feature.rb +1 -1
  623. data/lib/puppet/util/filetype.rb +11 -5
  624. data/lib/puppet/util/http_proxy.rb +132 -0
  625. data/lib/puppet/util/inifile.rb +1 -1
  626. data/lib/puppet/util/instance_loader.rb +1 -1
  627. data/lib/puppet/util/log.rb +28 -1
  628. data/lib/puppet/util/logging.rb +46 -3
  629. data/lib/puppet/util/monkey_patches.rb +20 -7
  630. data/lib/puppet/util/multi_match.rb +51 -0
  631. data/lib/puppet/util/network_device/cisco/device.rb +24 -6
  632. data/lib/puppet/util/network_device/cisco/interface.rb +21 -9
  633. data/lib/puppet/util/network_device/config.rb +1 -1
  634. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  635. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  636. data/lib/puppet/util/plist.rb +151 -0
  637. data/lib/puppet/util/profiler/aggregate.rb +1 -1
  638. data/lib/puppet/util/profiler/around_profiler.rb +1 -1
  639. data/lib/puppet/util/profiler.rb +1 -1
  640. data/lib/puppet/util/psych_support.rb +1 -1
  641. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +2 -2
  642. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +2 -1
  643. data/lib/puppet/util/rdoc.rb +2 -2
  644. data/lib/puppet/util/reference.rb +4 -2
  645. data/lib/puppet/util/resource_template.rb +1 -1
  646. data/lib/puppet/util/rubygems.rb +1 -1
  647. data/lib/puppet/util/run_mode.rb +2 -2
  648. data/lib/puppet/util/skip_tags.rb +9 -0
  649. data/lib/puppet/util/splayer.rb +18 -0
  650. data/lib/puppet/util/tagging.rb +8 -2
  651. data/lib/puppet/util/watcher/periodic_watcher.rb +2 -2
  652. data/lib/puppet/util/windows/access_control_entry.rb +2 -2
  653. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  654. data/lib/puppet/util/windows/adsi.rb +97 -32
  655. data/lib/puppet/util/windows/api_types.rb +24 -18
  656. data/lib/puppet/util/windows/com.rb +3 -3
  657. data/lib/puppet/util/windows/error.rb +1 -1
  658. data/lib/puppet/util/windows/file.rb +112 -19
  659. data/lib/puppet/util/windows/principal.rb +190 -0
  660. data/lib/puppet/util/windows/process.rb +88 -11
  661. data/lib/puppet/util/windows/registry.rb +22 -16
  662. data/lib/puppet/util/windows/root_certs.rb +5 -5
  663. data/lib/puppet/util/windows/security.rb +38 -37
  664. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  665. data/lib/puppet/util/windows/sid.rb +84 -15
  666. data/lib/puppet/util/windows/taskscheduler.rb +99 -43
  667. data/lib/puppet/util/windows/user.rb +32 -14
  668. data/lib/puppet/util/windows.rb +5 -0
  669. data/lib/puppet/util/yaml.rb +15 -3
  670. data/lib/puppet/util.rb +125 -23
  671. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  672. data/lib/puppet/vendor/deep_merge/test/test_deep_merge.rb +1 -1
  673. data/lib/puppet/vendor/load_semantic_puppet.rb +1 -0
  674. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  675. data/lib/puppet/vendor/pathspec/README.md +1 -1
  676. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +2 -1
  677. data/lib/puppet/vendor/require_vendored.rb +0 -1
  678. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  679. data/lib/puppet/vendor/rgen_patch.rb +1 -1
  680. data/lib/puppet/vendor/semantic/lib/semantic.rb +4 -6
  681. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph.rb +2 -2
  682. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph_node.rb +2 -2
  683. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/module_release.rb +17 -5
  684. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/source.rb +2 -2
  685. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/unsatisfiable_graph.rb +2 -2
  686. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency.rb +7 -7
  687. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/gem_version.rb +3 -0
  688. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/locales/config.yaml +21 -0
  689. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version.rb +48 -21
  690. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version_range.rb +15 -17
  691. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +17 -0
  692. data/lib/puppet/version.rb +7 -3
  693. data/lib/puppet.rb +86 -2
  694. data/lib/puppet_x.rb +7 -1
  695. data/lib/semver.rb +36 -13
  696. data/locales/config.yaml +29 -0
  697. data/locales/puppet.pot +93 -0
  698. data/man/man5/puppet.conf.5 +13 -13
  699. data/man/man8/extlookup2hiera.8 +1 -1
  700. data/man/man8/puppet-agent.8 +2 -2
  701. data/man/man8/puppet-apply.8 +2 -2
  702. data/man/man8/puppet-ca.8 +2 -2
  703. data/man/man8/puppet-catalog.8 +2 -2
  704. data/man/man8/puppet-cert.8 +2 -2
  705. data/man/man8/puppet-certificate.8 +2 -2
  706. data/man/man8/puppet-certificate_request.8 +2 -2
  707. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  708. data/man/man8/puppet-config.8 +3 -3
  709. data/man/man8/puppet-describe.8 +1 -1
  710. data/man/man8/puppet-device.8 +1 -1
  711. data/man/man8/puppet-doc.8 +1 -1
  712. data/man/man8/puppet-epp.8 +2 -2
  713. data/man/man8/puppet-facts.8 +2 -2
  714. data/man/man8/puppet-file.8 +2 -2
  715. data/man/man8/puppet-filebucket.8 +2 -2
  716. data/man/man8/puppet-help.8 +2 -2
  717. data/man/man8/puppet-inspect.8 +2 -2
  718. data/man/man8/puppet-key.8 +2 -2
  719. data/man/man8/puppet-man.8 +2 -2
  720. data/man/man8/puppet-master.8 +2 -2
  721. data/man/man8/puppet-module.8 +9 -9
  722. data/man/man8/puppet-node.8 +2 -2
  723. data/man/man8/puppet-parser.8 +2 -2
  724. data/man/man8/puppet-plugin.8 +2 -2
  725. data/man/man8/puppet-report.8 +2 -2
  726. data/man/man8/puppet-resource.8 +2 -2
  727. data/man/man8/puppet-resource_type.8 +2 -2
  728. data/man/man8/puppet-status.8 +3 -3
  729. data/man/man8/puppet.8 +1 -1
  730. data/spec/fixtures/module.tar.gz +0 -0
  731. data/spec/fixtures/unit/application/environments/production/data/common.yaml +22 -0
  732. data/spec/fixtures/unit/application/environments/production/environment.conf +1 -0
  733. data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
  734. data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
  735. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/environment/data.pp +10 -0
  736. data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
  737. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/data/bad.json +3 -0
  738. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/environment.conf +2 -0
  739. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
  740. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
  741. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
  742. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
  743. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
  744. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
  745. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
  746. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
  747. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
  748. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
  749. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
  750. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
  751. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
  752. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
  753. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
  754. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
  755. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/third_utf8.json +3 -0
  756. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/utf8.yaml +3 -0
  757. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
  758. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
  759. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +22 -0
  760. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
  761. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +48 -0
  762. data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
  763. data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
  764. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
  765. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
  766. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -0
  767. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
  768. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
  769. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/environment.conf +2 -0
  770. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
  771. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
  772. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
  773. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +2 -0
  774. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
  775. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/server1.yaml +1 -0
  776. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/server2.yaml +1 -0
  777. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
  778. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
  779. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +20 -0
  780. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
  781. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/metadata.json +9 -0
  782. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
  783. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
  784. data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
  785. data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
  786. data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
  787. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
  788. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
  789. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
  790. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
  791. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
  792. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
  793. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
  794. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
  795. data/spec/fixtures/unit/data_providers/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +2 -1
  796. data/spec/fixtures/unit/data_providers/environments/production/modules/abc/manifests/init.pp +2 -1
  797. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/hiera.yaml +5 -0
  798. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet/bindings/backend/default.rb +9 -0
  799. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet_x/backend/special_data_provider_factory.rb +23 -0
  800. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/manifests/init.pp +5 -0
  801. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/metadata.json +9 -0
  802. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +2 -0
  803. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_module_data.rb +1 -0
  804. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/manifests/init.pp +1 -1
  805. data/spec/fixtures/unit/functions/lookup/data/common.yaml +19 -0
  806. data/spec/fixtures/unit/functions/lookup_fixture/data/common.yaml +19 -0
  807. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  808. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/bad_data/manifests/init.pp +2 -0
  809. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/data/empty.json +0 -0
  810. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/hiera.yaml +5 -0
  811. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/manifests/init.pp +2 -0
  812. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/metadata.json +9 -0
  813. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/data/empty_key.json +1 -0
  814. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/hiera.yaml +5 -0
  815. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/manifests/init.pp +2 -0
  816. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/metadata.json +9 -0
  817. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/data/empty_key.yaml +1 -0
  818. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/hiera.yaml +5 -0
  819. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/manifests/init.pp +2 -0
  820. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/metadata.json +9 -0
  821. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/data/empty.yaml +2 -0
  822. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  823. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  824. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/metadata.json +9 -0
  825. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/data/first.json +4 -0
  826. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/hiera.yaml +8 -0
  827. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
  828. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/metadata.json +9 -0
  829. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
  830. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/meta/manifests/init.pp +3 -0
  831. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/meta/metadata.json +9 -0
  832. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +10 -0
  833. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +23 -0
  834. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/manifests/init.pp +3 -0
  835. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/metadata.json +9 -0
  836. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  837. data/spec/fixtures/unit/parser/lexer/subclass_name_duplication.pp +0 -0
  838. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
  839. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
  840. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/type/usee_type.rb +5 -0
  841. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
  842. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  843. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
  844. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
  845. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
  846. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
  847. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
  848. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
  849. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
  850. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
  851. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +87 -0
  852. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
  853. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  854. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  855. data/spec/fixtures/unit/pops/loaders/loaders/no_modules/manifests/site.pp +10 -0
  856. data/spec/fixtures/unit/pops/parser/lexer/subclass_name_duplication.pp +0 -0
  857. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  858. data/spec/fixtures/unit/provider/package/yum/yum-check-update-obsoletes.txt +195 -0
  859. data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
  860. data/spec/fixtures/unit/provider/service/smf/svcs.out +4 -3
  861. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  862. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
  863. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
  864. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -0
  865. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
  866. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
  867. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  868. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
  869. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  870. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
  871. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
  872. data/spec/integration/agent/logging_spec.rb +15 -14
  873. data/spec/integration/application/apply_spec.rb +383 -29
  874. data/spec/integration/application/doc_spec.rb +0 -0
  875. data/spec/integration/application/lookup_spec.rb +155 -0
  876. data/spec/integration/configurer_spec.rb +0 -0
  877. data/spec/integration/data_binding_spec.rb +195 -0
  878. data/spec/integration/defaults_spec.rb +27 -2
  879. data/spec/integration/directory_environments_spec.rb +16 -0
  880. data/spec/integration/environments/default_manifest_spec.rb +16 -16
  881. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  882. data/spec/integration/environments/settings_spec.rb +32 -4
  883. data/spec/integration/faces/ca_spec.rb +0 -0
  884. data/spec/integration/faces/config_spec.rb +80 -0
  885. data/spec/integration/faces/documentation_spec.rb +1 -1
  886. data/spec/integration/file_bucket/file_spec.rb +2 -2
  887. data/spec/integration/file_serving/fileset_spec.rb +0 -0
  888. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -0
  889. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  890. data/spec/integration/indirector/catalog/compiler_spec.rb +0 -0
  891. data/spec/integration/indirector/direct_file_server_spec.rb +0 -0
  892. data/spec/integration/indirector/facts/facter_spec.rb +38 -0
  893. data/spec/integration/indirector/file_content/file_server_spec.rb +0 -0
  894. data/spec/integration/indirector/file_metadata/file_server_spec.rb +0 -0
  895. data/spec/integration/indirector/node/ldap_spec.rb +0 -0
  896. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  897. data/spec/integration/network/formats_spec.rb +0 -0
  898. data/spec/integration/network/http/api/indirected_routes_spec.rb +33 -0
  899. data/spec/integration/node/environment_spec.rb +34 -0
  900. data/spec/integration/node/facts_spec.rb +0 -0
  901. data/spec/integration/node_spec.rb +0 -0
  902. data/spec/integration/parser/catalog_spec.rb +14 -2
  903. data/spec/integration/parser/collection_spec.rb +18 -0
  904. data/spec/integration/parser/compiler_spec.rb +225 -864
  905. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  906. data/spec/integration/parser/parameter_defaults_spec.rb +358 -0
  907. data/spec/integration/parser/pcore_resource_spec.rb +245 -0
  908. data/spec/integration/parser/resource_expressions_spec.rb +9 -7
  909. data/spec/integration/parser/scope_spec.rb +20 -2
  910. data/spec/integration/parser/undef_param_spec.rb +9 -1
  911. data/spec/integration/provider/mailalias/aliases_spec.rb +0 -0
  912. data/spec/integration/provider/mount_spec.rb +23 -36
  913. data/spec/integration/provider/service/init_spec.rb +0 -0
  914. data/spec/integration/provider/service/windows_spec.rb +3 -2
  915. data/spec/integration/provider/ssh_authorized_key_spec.rb +0 -0
  916. data/spec/integration/provider/yumrepo_spec.rb +4 -1
  917. data/spec/integration/reference/providers_spec.rb +0 -0
  918. data/spec/integration/reports_spec.rb +0 -0
  919. data/spec/integration/resource/catalog_spec.rb +1 -1
  920. data/spec/integration/resource/type_collection_spec.rb +8 -0
  921. data/spec/integration/ssl/autosign_spec.rb +18 -3
  922. data/spec/integration/ssl/certificate_authority_spec.rb +0 -1
  923. data/spec/integration/ssl/certificate_request_spec.rb +0 -1
  924. data/spec/integration/ssl/certificate_revocation_list_spec.rb +0 -1
  925. data/spec/integration/ssl/host_spec.rb +0 -1
  926. data/spec/integration/ssl/key_spec.rb +104 -0
  927. data/spec/integration/test/test_helper_spec.rb +32 -0
  928. data/spec/integration/transaction/report_spec.rb +682 -0
  929. data/spec/integration/transaction_spec.rb +125 -1
  930. data/spec/integration/type/exec_spec.rb +0 -0
  931. data/spec/integration/type/file_spec.rb +237 -12
  932. data/spec/integration/type/package_spec.rb +72 -1
  933. data/spec/integration/type/tidy_spec.rb +21 -9
  934. data/spec/integration/type/user_spec.rb +13 -6
  935. data/spec/integration/type_spec.rb +0 -0
  936. data/spec/integration/util/autoload_spec.rb +0 -0
  937. data/spec/integration/util/execution_spec.rb +30 -0
  938. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  939. data/spec/integration/util/settings_spec.rb +26 -0
  940. data/spec/integration/util/windows/adsi_spec.rb +99 -0
  941. data/spec/integration/util/windows/principal_spec.rb +250 -0
  942. data/spec/integration/util/windows/process_spec.rb +35 -2
  943. data/spec/{unit → integration}/util/windows/registry_spec.rb +92 -2
  944. data/spec/integration/util/windows/security_spec.rb +61 -16
  945. data/spec/integration/util/windows/user_spec.rb +27 -5
  946. data/spec/integration/util_spec.rb +49 -27
  947. data/spec/lib/matchers/include_in_order.rb +2 -3
  948. data/spec/lib/puppet/face/1.0.0/huzzah.rb +0 -0
  949. data/spec/lib/puppet/face/basetest.rb +0 -0
  950. data/spec/lib/puppet/face/huzzah.rb +0 -0
  951. data/spec/lib/puppet_spec/compiler.rb +32 -3
  952. data/spec/lib/puppet_spec/files.rb +16 -2
  953. data/spec/lib/puppet_spec/fixtures.rb +0 -0
  954. data/spec/lib/puppet_spec/language.rb +3 -1
  955. data/spec/lib/puppet_spec/module_tool/shared_functions.rb +2 -2
  956. data/spec/lib/puppet_spec/module_tool/stub_source.rb +1 -1
  957. data/spec/lib/puppet_spec/network.rb +12 -8
  958. data/spec/lib/puppet_spec/pops.rb +13 -0
  959. data/spec/lib/puppet_spec/unindent.rb +5 -0
  960. data/spec/lib/puppet_spec/verbose.rb +0 -0
  961. data/spec/shared_behaviours/all_parsedfile_providers.rb +0 -0
  962. data/spec/shared_behaviours/file_server_terminus.rb +0 -0
  963. data/spec/shared_behaviours/file_serving.rb +0 -0
  964. data/spec/shared_behaviours/iterative_functions.rb +9 -9
  965. data/spec/shared_behaviours/memory_terminus.rb +0 -0
  966. data/spec/shared_behaviours/path_parameters.rb +0 -0
  967. data/spec/shared_behaviours/things_that_declare_options.rb +0 -0
  968. data/spec/shared_contexts/types_setup.rb +106 -0
  969. data/spec/shared_examples/rhel_package_provider.rb +357 -0
  970. data/spec/spec_helper.rb +23 -2
  971. data/spec/unit/agent/locker_spec.rb +4 -4
  972. data/spec/unit/agent_spec.rb +12 -46
  973. data/spec/unit/application/agent_spec.rb +15 -0
  974. data/spec/unit/application/apply_spec.rb +31 -1
  975. data/spec/unit/application/cert_spec.rb +20 -0
  976. data/spec/unit/application/certificate_spec.rb +0 -0
  977. data/spec/unit/application/config_spec.rb +0 -0
  978. data/spec/unit/application/describe_spec.rb +0 -0
  979. data/spec/unit/application/device_spec.rb +0 -0
  980. data/spec/unit/application/doc_spec.rb +0 -0
  981. data/spec/unit/application/face_base_spec.rb +16 -0
  982. data/spec/unit/application/facts_spec.rb +0 -0
  983. data/spec/unit/application/filebucket_spec.rb +88 -2
  984. data/spec/unit/application/indirection_base_spec.rb +0 -0
  985. data/spec/unit/application/inspect_spec.rb +28 -10
  986. data/spec/unit/application/lookup_spec.rb +532 -0
  987. data/spec/unit/application/master_spec.rb +2 -2
  988. data/spec/unit/application/resource_spec.rb +0 -0
  989. data/spec/unit/application_spec.rb +3 -3
  990. data/spec/unit/capability_spec.rb +416 -0
  991. data/spec/unit/configurer/downloader_factory_spec.rb +0 -0
  992. data/spec/unit/configurer/downloader_spec.rb +5 -5
  993. data/spec/unit/configurer/fact_handler_spec.rb +0 -0
  994. data/spec/unit/configurer/plugin_handler_spec.rb +18 -15
  995. data/spec/unit/configurer_spec.rb +336 -39
  996. data/spec/unit/confine/exists_spec.rb +0 -0
  997. data/spec/unit/confine/false_spec.rb +0 -0
  998. data/spec/unit/confine/feature_spec.rb +0 -0
  999. data/spec/unit/confine/true_spec.rb +0 -0
  1000. data/spec/unit/confine/variable_spec.rb +0 -0
  1001. data/spec/unit/confine_collection_spec.rb +0 -0
  1002. data/spec/unit/confine_spec.rb +0 -0
  1003. data/spec/unit/confiner_spec.rb +0 -0
  1004. data/spec/unit/context/trusted_information_spec.rb +24 -1
  1005. data/spec/unit/daemon_spec.rb +18 -8
  1006. data/spec/unit/data_providers/{sample_data_provider_spec.rb → custom_data_provider_spec.rb} +14 -16
  1007. data/spec/unit/data_providers/function_data_provider_spec.rb +21 -3
  1008. data/spec/unit/data_providers/hiera_data_provider_spec.rb +361 -0
  1009. data/spec/unit/defaults_spec.rb +47 -0
  1010. data/spec/unit/environments_spec.rb +26 -4
  1011. data/spec/unit/etc_spec.rb +234 -0
  1012. data/spec/unit/external/pson_spec.rb +0 -0
  1013. data/spec/unit/face/ca_spec.rb +10 -0
  1014. data/spec/unit/face/catalog_spec.rb +0 -0
  1015. data/spec/unit/face/certificate_request_spec.rb +10 -0
  1016. data/spec/unit/face/certificate_revocation_list_spec.rb +10 -0
  1017. data/spec/unit/face/certificate_spec.rb +10 -2
  1018. data/spec/unit/face/config_spec.rb +47 -0
  1019. data/spec/unit/face/epp_face_spec.rb +24 -5
  1020. data/spec/unit/face/facts_spec.rb +0 -0
  1021. data/spec/unit/face/file_spec.rb +4 -0
  1022. data/spec/unit/face/generate_spec.rb +230 -0
  1023. data/spec/unit/face/help_spec.rb +70 -0
  1024. data/spec/unit/face/key_spec.rb +10 -0
  1025. data/spec/unit/face/module/search_spec.rb +1 -1
  1026. data/spec/unit/face/node_spec.rb +1 -1
  1027. data/spec/unit/face/parser_spec.rb +49 -2
  1028. data/spec/unit/face/plugin_spec.rb +29 -4
  1029. data/spec/unit/face/status_spec.rb +10 -0
  1030. data/spec/unit/face_spec.rb +0 -0
  1031. data/spec/unit/file_bucket/dipper_spec.rb +210 -1
  1032. data/spec/unit/file_bucket/file_spec.rb +0 -0
  1033. data/spec/unit/file_serving/base_spec.rb +0 -0
  1034. data/spec/unit/file_serving/configuration/parser_spec.rb +25 -30
  1035. data/spec/unit/file_serving/configuration_spec.rb +1 -1
  1036. data/spec/unit/file_serving/content_spec.rb +0 -0
  1037. data/spec/unit/file_serving/fileset_spec.rb +0 -0
  1038. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  1039. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  1040. data/spec/unit/file_serving/mount/file_spec.rb +0 -0
  1041. data/spec/unit/file_serving/mount/modules_spec.rb +0 -0
  1042. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +0 -0
  1043. data/spec/unit/file_serving/mount/plugins_spec.rb +0 -0
  1044. data/spec/unit/file_serving/mount_spec.rb +0 -0
  1045. data/spec/unit/file_serving/terminus_helper_spec.rb +0 -0
  1046. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  1047. data/spec/unit/file_system/uniquefile_spec.rb +20 -0
  1048. data/spec/unit/file_system_spec.rb +335 -6
  1049. data/spec/unit/forge/repository_spec.rb +27 -0
  1050. data/spec/unit/functions/assert_type_spec.rb +48 -8
  1051. data/spec/unit/functions/binary_file_spec.rb +46 -0
  1052. data/spec/unit/functions/break_spec.rb +89 -0
  1053. data/spec/unit/{parser/functions → functions}/contain_spec.rb +68 -3
  1054. data/spec/unit/functions/defined_spec.rb +2 -2
  1055. data/spec/unit/functions/dig_spec.rb +58 -0
  1056. data/spec/unit/functions/epp_spec.rb +17 -9
  1057. data/spec/unit/functions/filter_spec.rb +18 -0
  1058. data/spec/unit/functions/find_file_spec.rb +69 -0
  1059. data/spec/unit/functions/hiera_spec.rb +447 -47
  1060. data/spec/unit/functions/include_spec.rb +175 -0
  1061. data/spec/unit/functions/inline_epp_spec.rb +4 -4
  1062. data/spec/unit/functions/lest_spec.rb +34 -0
  1063. data/spec/unit/functions/logging_spec.rb +54 -0
  1064. data/spec/unit/functions/lookup_fixture_spec.rb +693 -0
  1065. data/spec/unit/functions/lookup_spec.rb +2904 -265
  1066. data/spec/unit/functions/match_spec.rb +2 -2
  1067. data/spec/unit/functions/new_spec.rb +694 -0
  1068. data/spec/unit/functions/next_spec.rb +93 -0
  1069. data/spec/unit/functions/regsubst_spec.rb +26 -9
  1070. data/spec/unit/functions/require_spec.rb +83 -0
  1071. data/spec/unit/functions/return_spec.rb +105 -0
  1072. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  1073. data/spec/unit/functions/scanf_spec.rb +1 -1
  1074. data/spec/unit/{parser/functions → functions}/shared.rb +15 -12
  1075. data/spec/unit/functions/split_spec.rb +3 -3
  1076. data/spec/unit/functions/step_spec.rb +113 -0
  1077. data/spec/unit/functions/strftime_spec.rb +152 -0
  1078. data/spec/unit/functions/then_spec.rb +40 -0
  1079. data/spec/unit/functions/type_spec.rb +35 -0
  1080. data/spec/unit/functions/unwrap_spec.rb +29 -0
  1081. data/spec/unit/functions/versioncmp_spec.rb +36 -0
  1082. data/spec/unit/functions4_spec.rb +270 -79
  1083. data/spec/unit/graph/rb_tree_map_spec.rb +1 -1
  1084. data/spec/unit/graph/relationship_graph_spec.rb +0 -0
  1085. data/spec/unit/graph/sequential_prioritizer_spec.rb +1 -1
  1086. data/spec/unit/graph/simple_graph_spec.rb +1 -1
  1087. data/spec/unit/hiera/scope_spec.rb +6 -3
  1088. data/spec/unit/hiera_puppet_spec.rb +49 -8
  1089. data/spec/unit/indirector/catalog/compiler_spec.rb +752 -8
  1090. data/spec/unit/indirector/catalog/json_spec.rb +0 -0
  1091. data/spec/unit/indirector/catalog/msgpack_spec.rb +0 -0
  1092. data/spec/unit/indirector/catalog/rest_spec.rb +0 -0
  1093. data/spec/unit/indirector/catalog/static_compiler_spec.rb +38 -20
  1094. data/spec/unit/indirector/catalog/store_configs_spec.rb +0 -0
  1095. data/spec/unit/indirector/catalog/yaml_spec.rb +0 -0
  1096. data/spec/unit/indirector/certificate/ca_spec.rb +0 -0
  1097. data/spec/unit/indirector/certificate/disabled_ca_spec.rb +0 -0
  1098. data/spec/unit/indirector/certificate/file_spec.rb +0 -0
  1099. data/spec/unit/indirector/certificate/rest_spec.rb +0 -0
  1100. data/spec/unit/indirector/certificate_request/ca_spec.rb +0 -0
  1101. data/spec/unit/indirector/certificate_request/disabled_ca_spec.rb +0 -0
  1102. data/spec/unit/indirector/certificate_request/file_spec.rb +0 -0
  1103. data/spec/unit/indirector/certificate_request/rest_spec.rb +0 -0
  1104. data/spec/unit/indirector/certificate_revocation_list/ca_spec.rb +0 -0
  1105. data/spec/unit/indirector/certificate_revocation_list/disabled_ca_spec.rb +0 -0
  1106. data/spec/unit/indirector/certificate_revocation_list/file_spec.rb +0 -0
  1107. data/spec/unit/indirector/certificate_revocation_list/rest_spec.rb +0 -0
  1108. data/spec/unit/indirector/certificate_status/file_spec.rb +0 -0
  1109. data/spec/unit/indirector/certificate_status/rest_spec.rb +0 -0
  1110. data/spec/unit/indirector/code_spec.rb +0 -0
  1111. data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
  1112. data/spec/unit/indirector/direct_file_server_spec.rb +0 -0
  1113. data/spec/unit/indirector/envelope_spec.rb +0 -0
  1114. data/spec/unit/indirector/exec_spec.rb +0 -0
  1115. data/spec/unit/indirector/face_spec.rb +10 -2
  1116. data/spec/unit/indirector/facts/facter_spec.rb +3 -10
  1117. data/spec/unit/indirector/facts/network_device_spec.rb +0 -0
  1118. data/spec/unit/indirector/facts/store_configs_spec.rb +0 -0
  1119. data/spec/unit/indirector/facts/yaml_spec.rb +0 -0
  1120. data/spec/unit/indirector/file_bucket_file/file_spec.rb +86 -4
  1121. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +0 -0
  1122. data/spec/unit/indirector/file_content/file_server_spec.rb +0 -0
  1123. data/spec/unit/indirector/file_content/file_spec.rb +0 -0
  1124. data/spec/unit/indirector/file_content/rest_spec.rb +0 -0
  1125. data/spec/unit/indirector/file_metadata/file_server_spec.rb +0 -0
  1126. data/spec/unit/indirector/file_metadata/file_spec.rb +0 -0
  1127. data/spec/unit/indirector/file_metadata/rest_spec.rb +0 -0
  1128. data/spec/unit/indirector/file_server_spec.rb +0 -0
  1129. data/spec/unit/indirector/indirection_spec.rb +13 -2
  1130. data/spec/unit/indirector/json_spec.rb +1 -1
  1131. data/spec/unit/indirector/key/ca_spec.rb +0 -0
  1132. data/spec/unit/indirector/key/disabled_ca_spec.rb +0 -0
  1133. data/spec/unit/indirector/key/file_spec.rb +1 -1
  1134. data/spec/unit/indirector/ldap_spec.rb +0 -0
  1135. data/spec/unit/indirector/memory_spec.rb +0 -0
  1136. data/spec/unit/indirector/msgpack_spec.rb +11 -1
  1137. data/spec/unit/indirector/node/exec_spec.rb +0 -0
  1138. data/spec/unit/indirector/node/ldap_spec.rb +0 -0
  1139. data/spec/unit/indirector/node/memory_spec.rb +0 -0
  1140. data/spec/unit/indirector/node/msgpack_spec.rb +0 -0
  1141. data/spec/unit/indirector/node/plain_spec.rb +0 -0
  1142. data/spec/unit/indirector/node/rest_spec.rb +0 -0
  1143. data/spec/unit/indirector/node/store_configs_spec.rb +0 -0
  1144. data/spec/unit/indirector/node/yaml_spec.rb +0 -0
  1145. data/spec/unit/indirector/plain_spec.rb +0 -0
  1146. data/spec/unit/indirector/report/msgpack_spec.rb +0 -0
  1147. data/spec/unit/indirector/report/processor_spec.rb +0 -0
  1148. data/spec/unit/indirector/report/rest_spec.rb +0 -0
  1149. data/spec/unit/indirector/report/yaml_spec.rb +0 -0
  1150. data/spec/unit/indirector/request_spec.rb +17 -8
  1151. data/spec/unit/indirector/resource/ral_spec.rb +0 -0
  1152. data/spec/unit/indirector/resource/store_configs_spec.rb +0 -0
  1153. data/spec/unit/indirector/resource_type/parser_spec.rb +5 -0
  1154. data/spec/unit/indirector/resource_type/rest_spec.rb +0 -0
  1155. data/spec/unit/indirector/rest_spec.rb +107 -9
  1156. data/spec/unit/indirector/ssl_file_spec.rb +4 -4
  1157. data/spec/unit/indirector/status/rest_spec.rb +0 -0
  1158. data/spec/unit/indirector/store_configs_spec.rb +0 -0
  1159. data/spec/unit/indirector/terminus_spec.rb +0 -0
  1160. data/spec/unit/indirector/yaml_spec.rb +1 -1
  1161. data/spec/unit/indirector_spec.rb +0 -0
  1162. data/spec/unit/info_service_spec.rb +298 -0
  1163. data/spec/unit/interface/action_builder_spec.rb +0 -0
  1164. data/spec/unit/interface/action_manager_spec.rb +0 -0
  1165. data/spec/unit/interface/action_spec.rb +0 -0
  1166. data/spec/unit/interface/documentation_spec.rb +0 -0
  1167. data/spec/unit/interface/face_collection_spec.rb +0 -0
  1168. data/spec/unit/interface/option_builder_spec.rb +0 -0
  1169. data/spec/unit/interface/option_spec.rb +0 -0
  1170. data/spec/unit/interface_spec.rb +27 -0
  1171. data/spec/unit/man_spec.rb +1 -1
  1172. data/spec/unit/module_spec.rb +118 -74
  1173. data/spec/unit/module_tool/application_spec.rb +1 -1
  1174. data/spec/unit/module_tool/applications/builder_spec.rb +44 -9
  1175. data/spec/unit/module_tool/applications/installer_spec.rb +11 -2
  1176. data/spec/unit/module_tool/applications/unpacker_spec.rb +2 -1
  1177. data/spec/unit/module_tool/applications/upgrader_spec.rb +9 -1
  1178. data/spec/unit/module_tool/installed_modules_spec.rb +6 -6
  1179. data/spec/unit/module_tool/metadata_spec.rb +31 -2
  1180. data/spec/unit/module_tool/tar/mini_spec.rb +3 -3
  1181. data/spec/unit/module_tool_spec.rb +3 -3
  1182. data/spec/unit/network/auth_config_parser_spec.rb +16 -0
  1183. data/spec/unit/network/authconfig_spec.rb +62 -32
  1184. data/spec/unit/network/authorization_spec.rb +30 -2
  1185. data/spec/unit/network/authstore_spec.rb +2 -2
  1186. data/spec/unit/network/format_handler_spec.rb +0 -0
  1187. data/spec/unit/network/format_spec.rb +0 -0
  1188. data/spec/unit/network/formats_spec.rb +0 -0
  1189. data/spec/unit/network/http/api/indirected_routes_spec.rb +70 -71
  1190. data/spec/unit/network/http/api/master/v3/environment_spec.rb +60 -0
  1191. data/spec/unit/network/http/api/master/v3_spec.rb +22 -4
  1192. data/spec/unit/network/http/compression_spec.rb +40 -9
  1193. data/spec/unit/network/http/connection_spec.rb +25 -19
  1194. data/spec/unit/network/http/error_spec.rb +2 -1
  1195. data/spec/unit/network/http/factory_spec.rb +18 -0
  1196. data/spec/unit/network/http/handler_spec.rb +11 -8
  1197. data/spec/unit/network/http/nocache_pool_spec.rb +0 -0
  1198. data/spec/unit/network/http/pool_spec.rb +30 -0
  1199. data/spec/unit/network/http/rack/rest_spec.rb +7 -0
  1200. data/spec/unit/network/http/rack_spec.rb +0 -0
  1201. data/spec/unit/network/http/session_spec.rb +0 -0
  1202. data/spec/unit/network/http/site_spec.rb +0 -0
  1203. data/spec/unit/network/http/webrick/rest_spec.rb +0 -0
  1204. data/spec/unit/network/http/webrick_spec.rb +1 -1
  1205. data/spec/unit/network/http_pool_spec.rb +0 -0
  1206. data/spec/unit/network/http_spec.rb +0 -0
  1207. data/spec/unit/network/resolver_spec.rb +0 -0
  1208. data/spec/unit/network/rights_spec.rb +4 -4
  1209. data/spec/unit/network/server_spec.rb +0 -0
  1210. data/spec/unit/node/environment_spec.rb +10 -0
  1211. data/spec/unit/node/facts_spec.rb +0 -0
  1212. data/spec/unit/node_spec.rb +35 -0
  1213. data/spec/unit/other/selinux_spec.rb +0 -0
  1214. data/spec/unit/parameter/path_spec.rb +0 -0
  1215. data/spec/unit/parameter/value_collection_spec.rb +0 -0
  1216. data/spec/unit/parameter/value_spec.rb +0 -0
  1217. data/spec/unit/parameter_spec.rb +11 -0
  1218. data/spec/unit/parser/ast/leaf_spec.rb +1 -1
  1219. data/spec/unit/parser/compiler_spec.rb +134 -33
  1220. data/spec/unit/parser/environment_compiler_spec.rb +688 -0
  1221. data/spec/unit/parser/files_spec.rb +0 -0
  1222. data/spec/unit/parser/functions/create_resources_spec.rb +86 -5
  1223. data/spec/unit/parser/functions/digest_spec.rb +0 -0
  1224. data/spec/unit/parser/functions/fail_spec.rb +0 -0
  1225. data/spec/unit/parser/functions/file_spec.rb +0 -0
  1226. data/spec/unit/parser/functions/fqdn_rand_spec.rb +6 -2
  1227. data/spec/unit/parser/functions/generate_spec.rb +3 -12
  1228. data/spec/unit/parser/functions/hiera_array_spec.rb +1 -1
  1229. data/spec/unit/parser/functions/hiera_hash_spec.rb +1 -1
  1230. data/spec/unit/parser/functions/hiera_include_spec.rb +1 -1
  1231. data/spec/unit/parser/functions/hiera_spec.rb +1 -1
  1232. data/spec/unit/parser/functions/inline_template_spec.rb +0 -0
  1233. data/spec/unit/parser/functions/lookup_spec.rb +1 -1
  1234. data/spec/unit/parser/functions/realize_spec.rb +0 -0
  1235. data/spec/unit/parser/functions/regsubst_spec.rb +1 -1
  1236. data/spec/unit/parser/functions/scanf_spec.rb +0 -0
  1237. data/spec/unit/parser/functions/shellquote_spec.rb +0 -0
  1238. data/spec/unit/parser/functions/split_spec.rb +1 -1
  1239. data/spec/unit/parser/functions/sprintf_spec.rb +0 -0
  1240. data/spec/unit/parser/functions/tag_spec.rb +0 -0
  1241. data/spec/unit/parser/functions/template_spec.rb +0 -0
  1242. data/spec/unit/parser/functions/versioncmp_spec.rb +0 -0
  1243. data/spec/unit/parser/functions_spec.rb +0 -0
  1244. data/spec/unit/parser/relationship_spec.rb +0 -0
  1245. data/spec/unit/parser/resource/param_spec.rb +0 -0
  1246. data/spec/unit/parser/resource_spec.rb +31 -32
  1247. data/spec/unit/parser/scope_spec.rb +83 -16
  1248. data/spec/unit/parser/templatewrapper_spec.rb +0 -0
  1249. data/spec/unit/parser/type_loader_spec.rb +0 -0
  1250. data/spec/unit/pops/binder/config/binder_config_spec.rb +1 -1
  1251. data/spec/unit/pops/binder/injector_spec.rb +3 -3
  1252. data/spec/unit/pops/evaluator/access_ops_spec.rb +115 -19
  1253. data/spec/unit/pops/evaluator/arithmetic_ops_spec.rb +170 -0
  1254. data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -2
  1255. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  1256. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +76 -23
  1257. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +29 -25
  1258. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  1259. data/spec/unit/pops/evaluator/literal_evaluator_spec.rb +43 -0
  1260. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +133 -0
  1261. data/spec/unit/pops/evaluator/variables_spec.rb +1 -1
  1262. data/spec/unit/pops/label_provider_spec.rb +5 -1
  1263. data/spec/unit/pops/loaders/dependency_loader_spec.rb +66 -1
  1264. data/spec/unit/pops/loaders/environment_loader_spec.rb +172 -0
  1265. data/spec/unit/pops/loaders/loader_paths_spec.rb +1 -1
  1266. data/spec/unit/pops/loaders/loaders_spec.rb +323 -27
  1267. data/spec/unit/pops/loaders/module_loaders_spec.rb +63 -2
  1268. data/spec/unit/pops/loaders/static_loader_spec.rb +83 -18
  1269. data/spec/unit/pops/lookup/context_spec.rb +334 -0
  1270. data/spec/unit/pops/lookup/interpolation_spec.rb +333 -0
  1271. data/spec/unit/pops/lookup/lookup_spec.rb +262 -0
  1272. data/spec/unit/pops/merge_strategy_spec.rb +18 -0
  1273. data/spec/unit/pops/parser/lexer2_spec.rb +236 -10
  1274. data/spec/unit/pops/parser/parse_application_spec.rb +35 -0
  1275. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +31 -0
  1276. data/spec/unit/pops/parser/parse_calls_spec.rb +25 -0
  1277. data/spec/unit/pops/parser/parse_capabilities_spec.rb +40 -0
  1278. data/spec/unit/pops/parser/parse_functions_spec.rb +19 -0
  1279. data/spec/unit/pops/parser/parse_lambda_spec.rb +19 -0
  1280. data/spec/unit/pops/parser/parse_site_spec.rb +51 -0
  1281. data/spec/unit/pops/parser/parser_rspec_helper.rb +6 -0
  1282. data/spec/unit/pops/parser/parser_spec.rb +28 -0
  1283. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  1284. data/spec/unit/pops/puppet_stack_spec.rb +79 -0
  1285. data/spec/unit/pops/resource/resource_type_impl_spec.rb +111 -0
  1286. data/spec/unit/pops/serialization/packer_spec.rb +154 -0
  1287. data/spec/unit/pops/serialization/rgen_spec.rb +88 -0
  1288. data/spec/unit/pops/serialization/serialization_spec.rb +314 -0
  1289. data/spec/unit/pops/time/timespan_spec.rb +121 -0
  1290. data/spec/unit/pops/types/enumeration_spec.rb +13 -12
  1291. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  1292. data/spec/unit/pops/types/p_binary_type_spec.rb +243 -0
  1293. data/spec/unit/pops/types/p_object_type_spec.rb +1167 -0
  1294. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +327 -0
  1295. data/spec/unit/pops/types/p_sensitive_type_spec.rb +169 -0
  1296. data/spec/unit/pops/types/p_timespan_type_spec.rb +273 -0
  1297. data/spec/unit/pops/types/p_timestamp_type_spec.rb +311 -0
  1298. data/spec/unit/pops/types/p_type_set_type_spec.rb +453 -0
  1299. data/spec/unit/pops/types/recursion_guard_spec.rb +93 -0
  1300. data/spec/unit/pops/types/ruby_generator_spec.rb +625 -0
  1301. data/spec/unit/pops/types/string_converter_spec.rb +1029 -0
  1302. data/spec/unit/pops/types/type_acceptor_spec.rb +106 -0
  1303. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  1304. data/spec/unit/pops/types/type_calculator_spec.rb +965 -934
  1305. data/spec/unit/pops/types/type_factory_spec.rb +132 -91
  1306. data/spec/unit/pops/types/type_formatter_spec.rb +396 -0
  1307. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +228 -0
  1308. data/spec/unit/pops/types/type_parser_spec.rb +203 -36
  1309. data/spec/unit/pops/types/types_spec.rb +599 -0
  1310. data/spec/unit/pops/validator/validator_spec.rb +400 -18
  1311. data/spec/unit/property/ensure_spec.rb +0 -0
  1312. data/spec/unit/property/keyvalue_spec.rb +0 -0
  1313. data/spec/unit/property/list_spec.rb +0 -0
  1314. data/spec/unit/property/ordered_list_spec.rb +0 -0
  1315. data/spec/unit/property_spec.rb +49 -12
  1316. data/spec/unit/provider/augeas/augeas_spec.rb +59 -0
  1317. data/spec/unit/provider/cisco_spec.rb +0 -0
  1318. data/spec/unit/provider/command_spec.rb +0 -0
  1319. data/spec/unit/provider/cron/crontab_spec.rb +0 -0
  1320. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  1321. data/spec/unit/provider/exec/posix_spec.rb +0 -0
  1322. data/spec/unit/provider/exec/shell_spec.rb +0 -0
  1323. data/spec/unit/provider/exec/windows_spec.rb +0 -0
  1324. data/spec/unit/provider/exec_spec.rb +0 -0
  1325. data/spec/unit/provider/file/posix_spec.rb +0 -0
  1326. data/spec/unit/provider/file/windows_spec.rb +0 -0
  1327. data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
  1328. data/spec/unit/provider/group/groupadd_spec.rb +0 -0
  1329. data/spec/unit/provider/group/ldap_spec.rb +0 -0
  1330. data/spec/unit/provider/group/pw_spec.rb +0 -0
  1331. data/spec/unit/provider/group/windows_adsi_spec.rb +31 -9
  1332. data/spec/unit/provider/host/parsed_spec.rb +0 -0
  1333. data/spec/unit/provider/interface/cisco_spec.rb +0 -0
  1334. data/spec/unit/provider/ldap_spec.rb +0 -0
  1335. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  1336. data/spec/unit/provider/mcx/mcxcontent_spec.rb +0 -0
  1337. data/spec/unit/provider/mount/parsed_spec.rb +0 -0
  1338. data/spec/unit/provider/mount_spec.rb +0 -0
  1339. data/spec/unit/provider/naginator_spec.rb +0 -0
  1340. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  1341. data/spec/unit/provider/nameservice_spec.rb +54 -12
  1342. data/spec/unit/provider/network_device_spec.rb +0 -0
  1343. data/spec/unit/provider/package/aix_spec.rb +0 -0
  1344. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  1345. data/spec/unit/provider/package/apt_spec.rb +0 -0
  1346. data/spec/unit/provider/package/aptitude_spec.rb +0 -0
  1347. data/spec/unit/provider/package/aptrpm_spec.rb +3 -3
  1348. data/spec/unit/provider/package/base_spec.rb +18 -0
  1349. data/spec/unit/provider/package/dnf_spec.rb +30 -0
  1350. data/spec/unit/provider/package/dpkg_spec.rb +0 -0
  1351. data/spec/unit/provider/package/freebsd_spec.rb +0 -0
  1352. data/spec/unit/provider/package/gem_spec.rb +77 -0
  1353. data/spec/unit/provider/package/hpux_spec.rb +0 -0
  1354. data/spec/unit/provider/package/macports_spec.rb +0 -0
  1355. data/spec/unit/provider/package/nim_spec.rb +6 -6
  1356. data/spec/unit/provider/package/openbsd_spec.rb +0 -0
  1357. data/spec/unit/provider/package/opkg_spec.rb +0 -0
  1358. data/spec/unit/provider/package/pacman_spec.rb +55 -0
  1359. data/spec/unit/provider/package/pip3_spec.rb +22 -0
  1360. data/spec/unit/provider/package/pip_spec.rb +164 -46
  1361. data/spec/unit/provider/package/pkg_spec.rb +139 -99
  1362. data/spec/unit/provider/package/pkgdmg_spec.rb +32 -8
  1363. data/spec/unit/provider/package/pkgin_spec.rb +23 -13
  1364. data/spec/unit/provider/package/pkgng_spec.rb +16 -2
  1365. data/spec/unit/provider/package/pkgutil_spec.rb +0 -0
  1366. data/spec/unit/provider/package/portage_spec.rb +64 -8
  1367. data/spec/unit/provider/package/puppet_gem_spec.rb +0 -0
  1368. data/spec/unit/provider/package/rpm_spec.rb +170 -12
  1369. data/spec/unit/provider/package/sun_spec.rb +0 -0
  1370. data/spec/unit/provider/package/tdnf_spec.rb +18 -0
  1371. data/spec/unit/provider/package/windows/package_spec.rb +45 -1
  1372. data/spec/unit/provider/package/windows_spec.rb +8 -2
  1373. data/spec/unit/provider/package/yum_spec.rb +29 -466
  1374. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  1375. data/spec/unit/provider/parsedfile_spec.rb +0 -0
  1376. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +211 -0
  1377. data/spec/unit/provider/selboolean_spec.rb +0 -0
  1378. data/spec/unit/provider/selmodule_spec.rb +0 -0
  1379. data/spec/unit/provider/service/base_spec.rb +6 -0
  1380. data/spec/unit/provider/service/bsd_spec.rb +130 -0
  1381. data/spec/unit/provider/service/daemontools_spec.rb +0 -0
  1382. data/spec/unit/provider/service/debian_spec.rb +34 -4
  1383. data/spec/unit/provider/service/freebsd_spec.rb +16 -0
  1384. data/spec/unit/provider/service/gentoo_spec.rb +7 -0
  1385. data/spec/unit/provider/service/init_spec.rb +24 -1
  1386. data/spec/unit/provider/service/launchd_spec.rb +124 -25
  1387. data/spec/unit/provider/service/openbsd_spec.rb +0 -0
  1388. data/spec/unit/provider/service/openrc_spec.rb +7 -0
  1389. data/spec/unit/provider/service/openwrt_spec.rb +0 -0
  1390. data/spec/unit/provider/service/rcng_spec.rb +41 -0
  1391. data/spec/unit/provider/service/redhat_spec.rb +8 -1
  1392. data/spec/unit/provider/service/runit_spec.rb +0 -0
  1393. data/spec/unit/provider/service/smf_spec.rb +77 -13
  1394. data/spec/unit/provider/service/src_spec.rb +31 -4
  1395. data/spec/unit/provider/service/systemd_spec.rb +228 -39
  1396. data/spec/unit/provider/service/upstart_spec.rb +64 -0
  1397. data/spec/unit/provider/service/windows_spec.rb +0 -0
  1398. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +2 -1
  1399. data/spec/unit/provider/sshkey/parsed_spec.rb +42 -18
  1400. data/spec/unit/provider/user/aix_spec.rb +7 -0
  1401. data/spec/unit/provider/user/directoryservice_spec.rb +164 -83
  1402. data/spec/unit/provider/user/hpux_spec.rb +0 -0
  1403. data/spec/unit/provider/user/ldap_spec.rb +0 -0
  1404. data/spec/unit/provider/user/openbsd_spec.rb +0 -0
  1405. data/spec/unit/provider/user/pw_spec.rb +0 -0
  1406. data/spec/unit/provider/user/user_role_add_spec.rb +0 -0
  1407. data/spec/unit/provider/user/useradd_spec.rb +1 -0
  1408. data/spec/unit/provider/user/windows_adsi_spec.rb +30 -6
  1409. data/spec/unit/provider/vlan/cisco_spec.rb +0 -0
  1410. data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
  1411. data/spec/unit/provider/zfs/zfs_spec.rb +0 -0
  1412. data/spec/unit/provider/zone/solaris_spec.rb +64 -12
  1413. data/spec/unit/provider/zpool/zpool_spec.rb +0 -0
  1414. data/spec/unit/provider_spec.rb +0 -0
  1415. data/spec/unit/puppet_spec.rb +15 -1
  1416. data/spec/unit/relationship_spec.rb +0 -0
  1417. data/spec/unit/reports/http_spec.rb +0 -0
  1418. data/spec/unit/reports/store_spec.rb +0 -0
  1419. data/spec/unit/reports_spec.rb +10 -0
  1420. data/spec/unit/resource/capability_finder_spec.rb +147 -0
  1421. data/spec/unit/resource/catalog_spec.rb +235 -10
  1422. data/spec/unit/resource/status_spec.rb +0 -0
  1423. data/spec/unit/resource/type_collection_spec.rb +23 -2
  1424. data/spec/unit/resource/type_spec.rb +169 -12
  1425. data/spec/unit/resource_spec.rb +137 -48
  1426. data/spec/unit/semver_spec.rb +241 -0
  1427. data/spec/unit/settings/directory_setting_spec.rb +0 -0
  1428. data/spec/unit/settings/duration_setting_spec.rb +0 -0
  1429. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  1430. data/spec/unit/settings/file_setting_spec.rb +37 -0
  1431. data/spec/unit/settings/ini_file_spec.rb +58 -1
  1432. data/spec/unit/settings/path_setting_spec.rb +0 -0
  1433. data/spec/unit/settings/priority_setting_spec.rb +0 -0
  1434. data/spec/unit/settings_spec.rb +105 -3
  1435. data/spec/unit/ssl/base_spec.rb +9 -0
  1436. data/spec/unit/ssl/certificate_authority/interface_spec.rb +180 -13
  1437. data/spec/unit/ssl/certificate_authority_spec.rb +82 -28
  1438. data/spec/unit/ssl/certificate_factory_spec.rb +2 -2
  1439. data/spec/unit/ssl/certificate_request_attributes_spec.rb +6 -0
  1440. data/spec/unit/ssl/certificate_request_spec.rb +4 -5
  1441. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  1442. data/spec/unit/ssl/certificate_spec.rb +1 -1
  1443. data/spec/unit/ssl/configuration_spec.rb +11 -2
  1444. data/spec/unit/ssl/host_spec.rb +3 -3
  1445. data/spec/unit/ssl/inventory_spec.rb +27 -3
  1446. data/spec/unit/ssl/key_spec.rb +7 -7
  1447. data/spec/unit/ssl/oids_spec.rb +24 -13
  1448. data/spec/unit/status_spec.rb +0 -0
  1449. data/spec/unit/transaction/additional_resource_generator_spec.rb +160 -31
  1450. data/spec/unit/transaction/event_manager_spec.rb +0 -0
  1451. data/spec/unit/transaction/event_spec.rb +3 -1
  1452. data/spec/unit/transaction/persistence_spec.rb +178 -0
  1453. data/spec/unit/transaction/report_spec.rb +138 -2
  1454. data/spec/unit/transaction/resource_harness_spec.rb +81 -37
  1455. data/spec/unit/transaction_spec.rb +50 -0
  1456. data/spec/unit/type/augeas_spec.rb +0 -0
  1457. data/spec/unit/type/component_spec.rb +0 -0
  1458. data/spec/unit/type/computer_spec.rb +0 -0
  1459. data/spec/unit/type/cron_spec.rb +0 -0
  1460. data/spec/unit/type/exec_spec.rb +57 -12
  1461. data/spec/unit/type/file/checksum_spec.rb +6 -0
  1462. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  1463. data/spec/unit/type/file/content_spec.rb +59 -208
  1464. data/spec/unit/type/file/ctime_spec.rb +0 -0
  1465. data/spec/unit/type/file/ensure_spec.rb +0 -0
  1466. data/spec/unit/type/file/group_spec.rb +0 -0
  1467. data/spec/unit/type/file/mode_spec.rb +0 -0
  1468. data/spec/unit/type/file/mtime_spec.rb +0 -0
  1469. data/spec/unit/type/file/owner_spec.rb +0 -0
  1470. data/spec/unit/type/file/selinux_spec.rb +0 -0
  1471. data/spec/unit/type/file/source_spec.rb +211 -119
  1472. data/spec/unit/type/file/type_spec.rb +0 -0
  1473. data/spec/unit/type/file_spec.rb +165 -35
  1474. data/spec/unit/type/filebucket_spec.rb +0 -0
  1475. data/spec/unit/type/group_spec.rb +0 -0
  1476. data/spec/unit/type/host_spec.rb +4 -4
  1477. data/spec/unit/type/interface_spec.rb +32 -0
  1478. data/spec/unit/type/k5login_spec.rb +0 -0
  1479. data/spec/unit/type/macauthorization_spec.rb +4 -1
  1480. data/spec/unit/type/mailalias_spec.rb +0 -0
  1481. data/spec/unit/type/maillist_spec.rb +0 -0
  1482. data/spec/unit/type/mcx_spec.rb +0 -0
  1483. data/spec/unit/type/mount_spec.rb +50 -8
  1484. data/spec/unit/type/nagios_spec.rb +0 -0
  1485. data/spec/unit/type/noop_metaparam_spec.rb +0 -0
  1486. data/spec/unit/type/package/package_settings_spec.rb +0 -0
  1487. data/spec/unit/type/package_spec.rb +1 -0
  1488. data/spec/unit/type/resources_spec.rb +0 -0
  1489. data/spec/unit/type/schedule_spec.rb +0 -0
  1490. data/spec/unit/type/selboolean_spec.rb +0 -0
  1491. data/spec/unit/type/selmodule_spec.rb +0 -0
  1492. data/spec/unit/type/service_spec.rb +21 -0
  1493. data/spec/unit/type/ssh_authorized_key_spec.rb +0 -0
  1494. data/spec/unit/type/sshkey_spec.rb +0 -0
  1495. data/spec/unit/type/stage_spec.rb +0 -0
  1496. data/spec/unit/type/tidy_spec.rb +4 -4
  1497. data/spec/unit/type/user_spec.rb +40 -7
  1498. data/spec/unit/type/vlan_spec.rb +1 -1
  1499. data/spec/unit/type/whit_spec.rb +0 -0
  1500. data/spec/unit/type/yumrepo_spec.rb +3 -7
  1501. data/spec/unit/type/zfs_spec.rb +0 -0
  1502. data/spec/unit/type/zone_spec.rb +0 -0
  1503. data/spec/unit/type/zpool_spec.rb +0 -0
  1504. data/spec/unit/type_spec.rb +119 -1
  1505. data/spec/unit/util/autoload_spec.rb +0 -0
  1506. data/spec/unit/util/backups_spec.rb +0 -0
  1507. data/spec/unit/util/character_encoding_spec.rb +88 -0
  1508. data/spec/unit/util/checksums_spec.rb +0 -0
  1509. data/spec/unit/util/colors_spec.rb +0 -0
  1510. data/spec/unit/util/command_line_spec.rb +11 -0
  1511. data/spec/unit/util/constant_inflector_spec.rb +0 -0
  1512. data/spec/unit/util/diff_spec.rb +0 -0
  1513. data/spec/unit/util/errors_spec.rb +0 -0
  1514. data/spec/unit/util/execution_spec.rb +13 -1
  1515. data/spec/unit/util/execution_stub_spec.rb +0 -0
  1516. data/spec/unit/util/feature_spec.rb +1 -1
  1517. data/spec/unit/util/filetype_spec.rb +4 -4
  1518. data/spec/unit/util/http_proxy_spec.rb +91 -0
  1519. data/spec/unit/util/ldap/connection_spec.rb +0 -0
  1520. data/spec/unit/util/ldap/generator_spec.rb +1 -1
  1521. data/spec/unit/util/ldap/manager_spec.rb +0 -0
  1522. data/spec/unit/util/log/destinations_spec.rb +0 -2
  1523. data/spec/unit/util/log_spec.rb +12 -1
  1524. data/spec/unit/util/logging_spec.rb +69 -0
  1525. data/spec/unit/util/metric_spec.rb +0 -0
  1526. data/spec/unit/util/monkey_patches_spec.rb +95 -3
  1527. data/spec/unit/util/multi_match_spec.rb +39 -0
  1528. data/spec/unit/util/nagios_maker_spec.rb +0 -0
  1529. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  1530. data/spec/unit/util/network_device/cisco/facts_spec.rb +0 -0
  1531. data/spec/unit/util/network_device/cisco/interface_spec.rb +0 -0
  1532. data/spec/unit/util/network_device/config_spec.rb +0 -0
  1533. data/spec/unit/util/network_device/ipcalc_spec.rb +0 -0
  1534. data/spec/unit/util/network_device/transport/base_spec.rb +0 -0
  1535. data/spec/unit/util/network_device/transport/ssh_spec.rb +1 -1
  1536. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  1537. data/spec/unit/util/network_device_spec.rb +1 -1
  1538. data/spec/unit/util/package_spec.rb +0 -0
  1539. data/spec/unit/util/plist_spec.rb +135 -0
  1540. data/spec/unit/util/posix_spec.rb +0 -0
  1541. data/spec/unit/util/rdoc_spec.rb +0 -0
  1542. data/spec/unit/util/resource_template_spec.rb +2 -2
  1543. data/spec/unit/util/retry_action_spec.rb +0 -0
  1544. data/spec/unit/util/run_mode_spec.rb +27 -3
  1545. data/spec/unit/util/selinux_spec.rb +0 -0
  1546. data/spec/unit/util/splayer_spec.rb +45 -0
  1547. data/spec/unit/util/storage_spec.rb +8 -1
  1548. data/spec/unit/util/suidmanager_spec.rb +0 -0
  1549. data/spec/unit/util/symbolic_file_mode_spec.rb +0 -0
  1550. data/spec/unit/util/tagging_spec.rb +4 -0
  1551. data/spec/unit/util/user_attr_spec.rb +0 -0
  1552. data/spec/unit/util/warnings_spec.rb +0 -0
  1553. data/spec/unit/util/windows/adsi_spec.rb +82 -40
  1554. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  1555. data/spec/unit/util/windows/file_spec.rb +89 -0
  1556. data/spec/unit/util/windows/root_certs_spec.rb +0 -0
  1557. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  1558. data/spec/unit/util/windows/sid_spec.rb +76 -14
  1559. data/spec/unit/util/yaml_spec.rb +13 -1
  1560. data/spec/unit/util_spec.rb +219 -15
  1561. data/spec/unit/version_spec.rb +19 -0
  1562. data/spec/watchr.rb +0 -0
  1563. data/tasks/cfpropertylist.rake +15 -0
  1564. metadata +724 -115
  1565. data/ext/puppet-nm-dispatcher +0 -13
  1566. data/ext/puppetlisten/puppetlisten.rb +0 -77
  1567. data/ext/puppetlisten/puppetrun.rb +0 -38
  1568. data/ext/systemd/puppetmaster.service +0 -11
  1569. data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
  1570. data/lib/puppet/pops/types/types_meta.rb +0 -234
  1571. data/lib/puppet/resource/type_collection_helper.rb +0 -7
  1572. data/lib/puppet/vendor/load_plist.rb +0 -1
  1573. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  1574. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  1575. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  1576. data/lib/puppet/vendor/plist/README +0 -36
  1577. data/lib/puppet/vendor/plist/Rakefile +0 -144
  1578. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  1579. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  1580. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  1581. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  1582. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  1583. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  1584. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  1585. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  1586. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  1587. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  1588. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  1589. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  1590. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  1591. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  1592. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  1593. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  1594. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  1595. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
  1596. data/lib/puppet/vendor/semantic/Gemfile +0 -20
  1597. data/lib/puppet/vendor/semantic/PUPPET_README.md +0 -6
  1598. data/lib/puppet/vendor/semantic/Rakefile +0 -69
  1599. data/lib/puppet/vendor/semantic/spec/spec_helper.rb +0 -24
  1600. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_node_spec.rb +0 -141
  1601. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_spec.rb +0 -162
  1602. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/module_release_spec.rb +0 -143
  1603. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/source_spec.rb +0 -5
  1604. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/unsatisfiable_graph_spec.rb +0 -44
  1605. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency_spec.rb +0 -383
  1606. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_range_spec.rb +0 -307
  1607. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_spec.rb +0 -608
  1608. data/spec/fixtures/unit/data_providers/environments/sample/manifests/site.pp +0 -6
  1609. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -3
  1610. data/spec/integration/data_binding.rb +0 -104
  1611. data/spec/integration/parser/functions/require_spec.rb +0 -43
  1612. data/spec/integration/provider/package_spec.rb +0 -33
  1613. data/spec/unit/parser/functions/defined_spec.rb +0 -120
  1614. data/spec/unit/parser/functions/include_spec.rb +0 -55
  1615. data/spec/unit/parser/functions/require_spec.rb +0 -68
  1616. data/spec/unit/resource/type_collection_helper_spec.rb +0 -24
  1617. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/environment.conf +0 -0
  1618. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/lib/puppet/functions/environment/data.rb +0 -0
  1619. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/bindings/abc/default.rb +0 -0
  1620. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +0 -0
  1621. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/manifests/init.pp +0 -0
  1622. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/bindings/bad_data/default.rb +0 -0
  1623. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/bindings/bca/default.rb +0 -0
  1624. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/functions/bca/data.rb +0 -0
  1625. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/manifests/init.pp +0 -0
  1626. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/no_provider/manifests/init.pp +0 -0
  1627. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
  1628. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
@@ -1,415 +1,3394 @@
1
- require 'rgen/metamodel_builder'
1
+ require_relative 'iterable'
2
+ require_relative 'enumeration'
3
+ require_relative 'recursion_guard'
4
+ require_relative 'type_acceptor'
5
+ require_relative 'type_asserter'
6
+ require_relative 'type_assertion_error'
7
+ require_relative 'type_conversion_error'
8
+ require_relative 'type_formatter'
9
+ require_relative 'type_calculator'
10
+ require_relative 'type_factory'
11
+ require_relative 'type_parser'
12
+ require_relative 'class_loader'
13
+ require_relative 'type_mismatch_describer'
14
+ require_relative 'puppet_object'
15
+
16
+ module Puppet::Pops
17
+ module Types
18
+
19
+ # The EMPTY_xxx declarations is for backward compatibility. They should not be explicitly referenced
20
+
21
+ # @api private
22
+ # @deprecated
23
+ EMPTY_HASH = Puppet::Pops::EMPTY_HASH
24
+
25
+ # @api private
26
+ # @deprecated
27
+ EMPTY_ARRAY = Puppet::Pops::EMPTY_ARRAY
28
+
29
+ # @api private
30
+ # @deprecated
31
+ EMPTY_STRING = Puppet::Pops::EMPTY_STRING
2
32
 
3
33
  # The Types model is a model of Puppet Language types.
4
- # It consists of two parts; the meta-model expressed using RGen (in types_meta.rb) and this file which
5
- # mixes in the implementation.
34
+ #
35
+ # The exact relationship between types is not visible in this model wrt. the PDataType which is an abstraction
36
+ # of Scalar, Array[Data], and Hash[Scalar, Data] nested to any depth. This means it is not possible to
37
+ # infer the type by simply looking at the inheritance hierarchy. The {TypeCalculator} should
38
+ # be used to answer questions about types. The {TypeFactory} should be used to create an instance
39
+ # of a type whenever one is needed.
40
+ #
41
+ # The implementation of the Types model contains methods that are required for the type objects to behave as
42
+ # expected when comparing them and using them as keys in hashes. (No other logic is, or should be included directly in
43
+ # the model's classes).
6
44
  #
7
45
  # @api public
8
46
  #
9
- module Puppet::Pops
10
- require 'puppet/pops/types/types_meta'
47
+ # TODO: See PUP-2978 for possible performance optimization
48
+ class TypedModelObject < Object
49
+ include PuppetObject
50
+ include Visitable
51
+ include Adaptable
52
+
53
+ def self._ptype
54
+ @type
55
+ end
56
+
57
+ def self.create_ptype(loader, ir, parent_name, attributes_hash = EMPTY_HASH)
58
+ @type = Pcore::create_object_type(loader, ir, self, "Pcore::#{simple_name}Type", "Pcore::#{parent_name}", attributes_hash)
59
+ end
60
+
61
+ def self.register_ptypes(loader, ir)
62
+ types = []
63
+ Types.constants.each do |c|
64
+ cls = Types.const_get(c)
65
+ next unless cls.is_a?(Class) && cls < self
66
+ type = cls.register_ptype(loader, ir)
67
+ types << type unless type.nil?
68
+ end
69
+ tp = TypeParser.singleton
70
+ types.each { |type| type.resolve(tp, loader) }
71
+ end
72
+ end
73
+
74
+ # Base type for all types
75
+ # @api public
76
+ #
77
+ class PAnyType < TypedModelObject
78
+
79
+ def self.register_ptype(loader, ir)
80
+ @type = Pcore::create_object_type(loader, ir, self, 'Pcore::AnyType', 'Any', EMPTY_HASH)
81
+ end
82
+
83
+ # Accept a visitor that will be sent the message `visit`, once with `self` as the
84
+ # argument. The visitor will then visit all types that this type contains.
85
+ #
86
+ def accept(visitor, guard)
87
+ visitor.visit(self, guard)
88
+ end
89
+
90
+ # Checks if _o_ is a type that is assignable to this type.
91
+ # If _o_ is a `Class` then it is first converted to a type.
92
+ # If _o_ is a Variant, then it is considered assignable when all its types are assignable
93
+ #
94
+ # The check for assignable must be guarded against self recursion since `self`, the given type _o_,
95
+ # or both, might be a `TypeAlias`. The initial caller of this method will typically never care
96
+ # about this and hence pass only the first argument, but as soon as a check of a contained type
97
+ # encounters a `TypeAlias`, then a `RecursionGuard` instance is created and passed on in all
98
+ # subsequent calls. The recursion is allowed to continue until self recursion has been detected in
99
+ # both `self` and in the given type. At that point the given type is considered to be assignable
100
+ # to `self` since all checks up to that point were positive.
101
+ #
102
+ # @param o [Class,PAnyType] the class or type to test
103
+ # @param guard [RecursionGuard] guard against recursion. Only used by internal calls
104
+ # @return [Boolean] `true` when _o_ is assignable to this type
105
+ # @api public
106
+ def assignable?(o, guard = nil)
107
+ case o
108
+ when Class
109
+ # Safe to call _assignable directly since a Class never is a Unit or Variant
110
+ _assignable?(TypeCalculator.singleton.type(o), guard)
111
+ when PUnitType
112
+ true
113
+ when PTypeAliasType
114
+ # An alias may contain self recursive constructs.
115
+ if o.self_recursion?
116
+ guard ||= RecursionGuard.new
117
+ if guard.add_that(o) == RecursionGuard::SELF_RECURSION_IN_BOTH
118
+ # Recursion detected both in self and other. This means that other is assignable
119
+ # to self. This point would not have been reached otherwise
120
+ true
121
+ else
122
+ assignable?(o.resolved_type, guard)
123
+ end
124
+ else
125
+ assignable?(o.resolved_type, guard)
126
+ end
127
+ when PVariantType
128
+ # Assignable if all contained types are assignable
129
+ o.types.all? { |vt| assignable?(vt, guard) }
130
+ when PNotUndefType
131
+ if !(o.type.nil? || o.type.assignable?(PUndefType::DEFAULT))
132
+ assignable?(o.type, guard)
133
+ else
134
+ _assignable?(o, guard)
135
+ end
136
+ else
137
+ _assignable?(o, guard)
138
+ end
139
+ end
140
+
141
+ # Returns `true` if this instance is a callable that accepts the given _args_type_ type
142
+ #
143
+ # @param args_type [PAnyType] the arguments to test
144
+ # @param guard [RecursionGuard] guard against recursion. Only used by internal calls
145
+ # @return [Boolean] `true` if this instance is a callable that accepts the given _args_
146
+ def callable?(args_type, guard = nil)
147
+ args_type.is_a?(PAnyType) && kind_of_callable? && args_type.callable_args?(self, guard)
148
+ end
149
+
150
+ # Returns `true` if this instance is a callable that accepts the given _args_
151
+ #
152
+ # @param args [Array] the arguments to test
153
+ # @param block [Proc] block, or nil if not called with a block
154
+ # @return [Boolean] `true` if this instance is a callable that accepts the given _args_
155
+ def callable_with?(args, block = nil)
156
+ false
157
+ end
158
+
159
+ # Returns `true` if this instance is considered valid as arguments to the given `callable`
160
+ # @param callable [PAnyType] the callable
161
+ # @param guard [RecursionGuard] guard against recursion. Only used by internal calls
162
+ # @return [Boolean] `true` if this instance is considered valid as arguments to the given `callable`
163
+ # @api private
164
+ def callable_args?(callable, guard)
165
+ false
166
+ end
167
+
168
+ # Called from the `PTypeAliasType` when it detects self recursion. The default is to do nothing
169
+ # but some self recursive constructs are illegal such as when a `PObjectType` somehow inherits itself
170
+ # @param originator [PTypeAliasType] the starting point for the check
171
+ # @raise Puppet::Error if an illegal self recursion is detected
172
+ # @api private
173
+ def check_self_recursion(originator)
174
+ end
175
+
176
+ # Generalizes value specific types. Types that are not value specific will return `self` otherwise
177
+ # the generalized type is returned.
178
+ #
179
+ # @return [PAnyType] The generalized type
180
+ # @api public
181
+ def generalize
182
+ # Applicable to all types that have no variables
183
+ self
184
+ end
185
+
186
+ # Normalizes the type. This does not change the characteristics of the type but it will remove duplicates
187
+ # and constructs like NotUndef[T] where T is not assignable from Undef and change Variant[*T] where all
188
+ # T are enums into an Enum.
189
+ #
190
+ # @param guard [RecursionGuard] guard against recursion. Only used by internal calls
191
+ # @return [PAnyType] The iterable type that this type is assignable to or `nil`
192
+ # @api public
193
+ def normalize(guard = nil)
194
+ self
195
+ end
196
+
197
+ # Called from the TypeParser once it has found a type using the Loader to enable that this type can
198
+ # resolve internal type expressions using a loader. Presently, this method is a no-op for all types
199
+ # except the {{PTypeAliasType}}.
200
+ #
201
+ # @param type_parser [TypeParser] type parser
202
+ # @param loader [Loader::Loader] loader to use
203
+ # @return [PTypeAliasType] the receiver of the call, i.e. `self`
204
+ # @api private
205
+ def resolve(type_parser, loader)
206
+ self
207
+ end
208
+
209
+ # Responds `true` for all callables, variants of callables and unless _optional_ is
210
+ # false, all optional callables.
211
+ # @param optional [Boolean]
212
+ # @param guard [RecursionGuard] guard against recursion. Only used by internal calls
213
+ # @return [Boolean] `true`if this type is considered callable
214
+ # @api private
215
+ def kind_of_callable?(optional = true, guard = nil)
216
+ false
217
+ end
218
+
219
+ # Returns `true` if an instance of this type is iterable, `false` otherwise
220
+ # The method #iterable_type must produce a `PIterableType` instance when this
221
+ # method returns `true`
222
+ #
223
+ # @param guard [RecursionGuard] guard against recursion. Only used by internal calls
224
+ # @return [Boolean] flag to indicate if instances of this type is iterable.
225
+ def iterable?(guard = nil)
226
+ false
227
+ end
228
+
229
+ # Returns the `PIterableType` that this type should be assignable to, or `nil` if no such type exists.
230
+ # A type that returns a `PIterableType` must respond `true` to `#iterable?`.
231
+ #
232
+ # @example
233
+ # Any Collection[T] is assignable to an Iterable[T]
234
+ # A String is assignable to an Iterable[String] iterating over the strings characters
235
+ # An Integer is assignable to an Iterable[Integer] iterating over the 'times' enumerator
236
+ # A Type[T] is assignable to an Iterable[Type[T]] if T is an Integer or Enum
237
+ #
238
+ # @param guard [RecursionGuard] guard against recursion. Only used by internal calls
239
+ # @return [PIterableType,nil] The iterable type that this type is assignable to or `nil`
240
+ # @api private
241
+ def iterable_type(guard = nil)
242
+ nil
243
+ end
244
+
245
+ def hash
246
+ self.class.hash
247
+ end
248
+
249
+ # Returns true if the given argument _o_ is an instance of this type
250
+ # @param guard [RecursionGuard] guard against recursion. Only used by internal calls
251
+ # @return [Boolean]
252
+ # @api public
253
+ def instance?(o, guard = nil)
254
+ true
255
+ end
256
+
257
+ # An object is considered to really be an instance of a type when something other than a
258
+ # TypeAlias or a Variant responds true to a call to {#instance?}.
259
+ #
260
+ # @return [Integer] -1 = is not instance, 0 = recursion detected, 1 = is instance
261
+ # @api private
262
+ def really_instance?(o, guard = nil)
263
+ instance?(o, guard) ? 1 : -1
264
+ end
265
+
266
+ def eql?(o)
267
+ self.class == o.class
268
+ end
269
+
270
+ def ==(o)
271
+ eql?(o)
272
+ end
273
+
274
+ def simple_name
275
+ self.class.simple_name
276
+ end
277
+
278
+ # Strips the class name from all module prefixes, the leading 'P' and the ending 'Type'. I.e.
279
+ # an instance of PVariantType will return 'Variant'
280
+ # @return [String] the simple name of this type
281
+ def self.simple_name
282
+ if @simple_name.nil?
283
+ n = name
284
+ @simple_name = n[n.rindex('::')+3..n.size-5]
285
+ end
286
+ @simple_name
287
+ end
288
+
289
+ def to_alias_expanded_s
290
+ TypeFormatter.new.alias_expanded_string(self)
291
+ end
292
+
293
+ def to_s
294
+ TypeFormatter.string(self)
295
+ end
296
+
297
+ # Returns the name of the type, without parameters
298
+ # @return [String] the name of the type
299
+ # @api public
300
+ def name
301
+ simple_name
302
+ end
303
+
304
+ def create(*args)
305
+ Loaders.find_loader(nil).load(:function, 'new').call({}, self, *args)
306
+ end
307
+
308
+ def new_function(loader)
309
+ self.class.new_function(self, loader)
310
+ end
311
+
312
+ # This default implementation of of a new_function raises an Argument Error.
313
+ # Types for which creating a new instance is supported, should create and return
314
+ # a Puppet Function class by using Puppet:Loaders.create_loaded_function(:new, loader)
315
+ # and return that result.
316
+ #
317
+ # @raises ArgumentError
318
+ #
319
+ def self.new_function(instance, loader)
320
+ raise ArgumentError.new("Creation of new instance of type '#{instance.to_s}' is not supported")
321
+ end
322
+
323
+
324
+ # The default instance of this type. Each type in the type system has this constant
325
+ # declared.
326
+ #
327
+ DEFAULT = PAnyType.new
328
+
329
+ protected
330
+
331
+ # @api private
332
+ def _assignable?(o, guard)
333
+ o.is_a?(PAnyType)
334
+ end
335
+
336
+ # Produces the tuple entry at the given index given a tuple type, its from/to constraints on the last
337
+ # type, and an index.
338
+ # Produces nil if the index is out of bounds
339
+ # from must be less than to, and from may not be less than 0
340
+ #
341
+ # @api private
342
+ #
343
+ def tuple_entry_at(tuple_t, to, index)
344
+ regular = (tuple_t.types.size - 1)
345
+ if index < regular
346
+ tuple_t.types[index]
347
+ elsif index < regular + to
348
+ # in the varargs part
349
+ tuple_t.types[-1]
350
+ else
351
+ nil
352
+ end
353
+ end
354
+
355
+ # Applies a transformation by sending the given _method_ and _method_args_ to each of the types of the given array
356
+ # and collecting the results in a new array. If all transformation calls returned the type instance itself (i.e. no
357
+ # transformation took place), then this method will return `self`. If a transformation did occur, then this method
358
+ # will either return the transformed array or in case a block was given, the result of calling a given block with
359
+ # the transformed array.
360
+ #
361
+ # @param types [Array<PAnyType>] the array of types to transform
362
+ # @param method [Symbol] The method to call on each type
363
+ # @param method_args [Object] The arguments to pass to the method, if any
364
+ # @return [Object] self, the transformed array, or the result of calling a given block with the transformed array
365
+ # @yieldparam altered_types [Array<PAnyType>] the altered type array
366
+ # @api private
367
+ def alter_type_array(types, method, *method_args)
368
+ modified = false
369
+ modified_types = types.map do |t|
370
+ t_mod = t.send(method, *method_args)
371
+ modified = !t.equal?(t_mod) unless modified
372
+ t_mod
373
+ end
374
+ if modified
375
+ block_given? ? yield(modified_types) : modified_types
376
+ else
377
+ self
378
+ end
379
+ end
380
+ end
381
+
382
+ # @abstract Encapsulates common behavior for a type that contains one type
383
+ # @api public
384
+ class PTypeWithContainedType < PAnyType
385
+ def self.register_ptype(loader, ir)
386
+ # Abstract type. It doesn't register anything
387
+ end
388
+
389
+ attr_reader :type
390
+
391
+ def initialize(type)
392
+ @type = type
393
+ end
394
+
395
+ def accept(visitor, guard)
396
+ super
397
+ @type.accept(visitor, guard) unless @type.nil?
398
+ end
399
+
400
+ def generalize
401
+ if @type.nil?
402
+ self.class::DEFAULT
403
+ else
404
+ ge_type = @type.generalize
405
+ @type.equal?(ge_type) ? self : self.class.new(ge_type)
406
+ end
407
+ end
408
+
409
+ def normalize(guard = nil)
410
+ if @type.nil?
411
+ self.class::DEFAULT
412
+ else
413
+ ne_type = @type.normalize(guard)
414
+ @type.equal?(ne_type) ? self : self.class.new(ne_type)
415
+ end
416
+ end
417
+
418
+ def hash
419
+ self.class.hash ^ @type.hash
420
+ end
421
+
422
+ def eql?(o)
423
+ self.class == o.class && @type == o.type
424
+ end
425
+
426
+ def resolve(type_parser, loader)
427
+ rtype = @type
428
+ rtype = rtype.resolve(type_parser, loader) unless rtype.nil?
429
+ rtype.equal?(@type) ? self : self.class.new(rtype)
430
+ end
431
+ end
432
+
433
+ # The type of types.
434
+ # @api public
435
+ #
436
+ class PType < PTypeWithContainedType
437
+
438
+ def self.register_ptype(loader, ir)
439
+ create_ptype(loader, ir, 'AnyType',
440
+ 'type' => {
441
+ KEY_TYPE => POptionalType.new(PType::DEFAULT),
442
+ KEY_VALUE => nil
443
+ }
444
+ )
445
+ end
446
+
447
+ def instance?(o, guard = nil)
448
+ if o.is_a?(PAnyType)
449
+ type.nil? || type.assignable?(o, guard)
450
+ elsif o.is_a?(Module) || o.is_a?(Puppet::Resource) || o.is_a?(Puppet::Parser::Resource)
451
+ @type.nil? ? true : assignable?(TypeCalculator.infer(o))
452
+ else
453
+ false
454
+ end
455
+ end
456
+
457
+ def iterable?(guard = nil)
458
+ case @type
459
+ when PEnumType
460
+ true
461
+ when PIntegerType
462
+ @type.finite_range?
463
+ else
464
+ false
465
+ end
466
+ end
467
+
468
+ def iterable_type(guard = nil)
469
+ # The types PIntegerType and PEnumType are Iterable
470
+ case @type
471
+ when PEnumType
472
+ # @type describes the element type perfectly since the iteration is made over the
473
+ # contained choices.
474
+ PIterableType.new(@type)
475
+ when PIntegerType
476
+ # @type describes the element type perfectly since the iteration is made over the
477
+ # specified range.
478
+ @type.finite_range? ? PIterableType.new(@type) : nil
479
+ else
480
+ nil
481
+ end
482
+ end
483
+
484
+ def eql?(o)
485
+ self.class == o.class && @type == o.type
486
+ end
487
+
488
+ def self.simple_name
489
+ # since this the class is inconsistently named PType and not PTypeType
490
+ 'Type'
491
+ end
492
+
493
+ DEFAULT = PType.new(nil)
494
+
495
+ protected
496
+
497
+ # @api private
498
+ def _assignable?(o, guard)
499
+ return false unless o.is_a?(PType)
500
+ return true if @type.nil? # wide enough to handle all types
501
+ return false if o.type.nil? # wider than t
502
+ @type.assignable?(o.type, guard)
503
+ end
504
+ end
505
+
506
+ class PNotUndefType < PTypeWithContainedType
507
+ def self.register_ptype(loader, ir)
508
+ create_ptype(loader, ir, 'AnyType',
509
+ 'type' => {
510
+ KEY_TYPE => POptionalType.new(PType::DEFAULT),
511
+ KEY_VALUE => nil
512
+ }
513
+ )
514
+ end
515
+
516
+ def initialize(type = nil)
517
+ super(type.class == PAnyType ? nil : type)
518
+ end
519
+
520
+ def instance?(o, guard = nil)
521
+ !(o.nil? || o == :undef) && (@type.nil? || @type.instance?(o, guard))
522
+ end
523
+
524
+ def normalize(guard = nil)
525
+ n = super
526
+ if n.type.nil?
527
+ n
528
+ else
529
+ if n.type.is_a?(POptionalType)
530
+ # No point in having an optional in a NotUndef
531
+ PNotUndefType.new(n.type.type).normalize
532
+ elsif !n.type.assignable?(PUndefType::DEFAULT)
533
+ # THe type is NotUndef anyway, so it can be stripped of
534
+ n.type
535
+ else
536
+ n
537
+ end
538
+ end
539
+ end
540
+
541
+ def new_function(loader)
542
+ # If only NotUndef, then use Unit's null converter
543
+ if type.nil?
544
+ PUnitType.new_function(self.class, loader)
545
+ else
546
+ type.new_function(loader)
547
+ end
548
+ end
549
+
550
+ DEFAULT = PNotUndefType.new
551
+
552
+ protected
553
+
554
+ # @api private
555
+ def _assignable?(o, guard)
556
+ o.is_a?(PAnyType) && !o.assignable?(PUndefType::DEFAULT, guard) && (@type.nil? || @type.assignable?(o, guard))
557
+ end
558
+ end
559
+
560
+ # @api public
561
+ #
562
+ class PUndefType < PAnyType
563
+ def self.register_ptype(loader, ir)
564
+ create_ptype(loader, ir, 'AnyType')
565
+ end
566
+
567
+ def instance?(o, guard = nil)
568
+ o.nil? || :undef == o
569
+ end
570
+
571
+ # @api private
572
+ def callable_args?(callable_t, guard)
573
+ # if callable_t is Optional (or indeed PUndefType), this means that 'missing callable' is accepted
574
+ callable_t.assignable?(DEFAULT, guard)
575
+ end
576
+
577
+ DEFAULT = PUndefType.new
578
+
579
+ protected
580
+ # @api private
581
+ def _assignable?(o, guard)
582
+ o.is_a?(PUndefType)
583
+ end
584
+ end
585
+
586
+ # A type private to the type system that describes "ignored type" - i.e. "I am what you are"
587
+ # @api private
588
+ #
589
+ class PUnitType < PAnyType
590
+ def self.register_ptype(loader, ir)
591
+ create_ptype(loader, ir, 'AnyType')
592
+ end
593
+
594
+ def instance?(o, guard = nil)
595
+ true
596
+ end
597
+
598
+ # A "null" implementation - that simply returns the given argument
599
+ def self.new_function(_, loader)
600
+ @new_function ||= Puppet::Functions.create_loaded_function(:new_unit, loader) do
601
+ dispatch :from_args do
602
+ param 'Any', :from
603
+ end
604
+
605
+ def from_args(from)
606
+ from
607
+ end
608
+ end
609
+ end
610
+
611
+ DEFAULT = PUnitType.new
612
+
613
+ protected
614
+ # @api private
615
+ def _assignable?(o, guard)
616
+ true
617
+ end
618
+ end
619
+
620
+ # @api public
621
+ #
622
+ class PDefaultType < PAnyType
623
+ def self.register_ptype(loader, ir)
624
+ create_ptype(loader, ir, 'AnyType')
625
+ end
626
+
627
+ def instance?(o, guard = nil)
628
+ o == :default
629
+ end
630
+
631
+ DEFAULT = PDefaultType.new
632
+
633
+ protected
634
+ # @api private
635
+ def _assignable?(o, guard)
636
+ o.is_a?(PDefaultType)
637
+ end
638
+ end
639
+
640
+ # A flexible data type, being assignable to its subtypes as well as PArrayType and PHashType with element type assignable to PDataType.
641
+ #
642
+ # @api public
643
+ #
644
+ class PDataType < PAnyType
645
+ def self.register_ptype(loader, ir)
646
+ create_ptype(loader, ir, 'AnyType')
647
+ end
648
+
649
+ def eql?(o)
650
+ self.class == o.class || o == PVariantType::DATA
651
+ end
652
+
653
+ def instance?(o, guard = nil)
654
+ PVariantType::DATA.instance?(o, guard)
655
+ end
656
+
657
+ DEFAULT = PDataType.new
658
+
659
+ protected
660
+
661
+ # Data is assignable by other Data and by Array[Data] and Hash[Scalar, Data]
662
+ # @api private
663
+ def _assignable?(o, guard)
664
+ # We cannot put the NotUndefType[Data] in the @data_variant_t since that causes an endless recursion
665
+ case o
666
+ when Types::PDataType
667
+ true
668
+ when Types::PNotUndefType
669
+ assignable?(o.type || PUndefType::DEFAULT, guard)
670
+ else
671
+ PVariantType::DATA.assignable?(o, guard)
672
+ end
673
+ end
674
+ end
675
+
676
+ # Type that is PDataType compatible, but is not a PCollectionType.
677
+ # @api public
678
+ #
679
+ class PScalarType < PAnyType
680
+ def self.register_ptype(loader, ir)
681
+ create_ptype(loader, ir, 'AnyType')
682
+ end
683
+
684
+ def instance?(o, guard = nil)
685
+ if o.is_a?(String) || o.is_a?(Numeric) || o.is_a?(TrueClass) || o.is_a?(FalseClass) || o.is_a?(Regexp) || o.is_a?(SemanticPuppet::VersionRange)
686
+ true
687
+ elsif o.is_a?(Array) || o.is_a?(Hash) || o.is_a?(PAnyType) || o.is_a?(NilClass)
688
+ false
689
+ else
690
+ assignable?(TypeCalculator.infer(o))
691
+ end
692
+ end
693
+
694
+ DEFAULT = PScalarType.new
695
+
696
+ protected
697
+
698
+ # @api private
699
+ def _assignable?(o, guard)
700
+ o.is_a?(PScalarType)
701
+ end
702
+ end
703
+
704
+ # A string type describing the set of strings having one of the given values
705
+ # @api public
706
+ #
707
+ class PEnumType < PScalarType
708
+ def self.register_ptype(loader, ir)
709
+ create_ptype(loader, ir, 'ScalarType', 'values' => PArrayType.new(PStringType::NON_EMPTY))
710
+ end
711
+
712
+ attr_reader :values
713
+
714
+ def initialize(values)
715
+ @values = values.uniq.sort.freeze
716
+ end
717
+
718
+ # Returns Enumerator if no block is given, otherwise, calls the given
719
+ # block with each of the strings for this enum
720
+ def each(&block)
721
+ r = Iterable.on(self)
722
+ block_given? ? r.each(&block) : r
723
+ end
724
+
725
+ def generalize
726
+ # General form of an Enum is a String
727
+ if @values.empty?
728
+ PStringType::DEFAULT
729
+ else
730
+ range = @values.map(&:size).minmax
731
+ PStringType.new(PIntegerType.new(range.min, range.max))
732
+ end
733
+ end
734
+
735
+ def iterable?(guard = nil)
736
+ true
737
+ end
738
+
739
+ def iterable_type(guard = nil)
740
+ # An instance of an Enum is a String
741
+ PStringType::ITERABLE_TYPE
742
+ end
743
+
744
+ def hash
745
+ @values.hash
746
+ end
747
+
748
+ def eql?(o)
749
+ self.class == o.class && @values == o.values
750
+ end
751
+
752
+ def instance?(o, guard = nil)
753
+ o.is_a?(String) && @values.any? { |p| p == o }
754
+ end
755
+
756
+ DEFAULT = PEnumType.new(EMPTY_ARRAY)
757
+
758
+ protected
759
+
760
+ # @api private
761
+ def _assignable?(o, guard)
762
+ return true if self == o
763
+ svalues = values
764
+ if svalues.empty?
765
+ return true if o.is_a?(PStringType) || o.is_a?(PEnumType) || o.is_a?(PPatternType)
766
+ end
767
+ case o
768
+ when PStringType
769
+ # if the contained string is found in the set of enums
770
+ instance?(o.value, guard)
771
+ when PEnumType
772
+ !o.values.empty? && o.values.all? { |s| instance?(s, guard) }
773
+ else
774
+ false
775
+ end
776
+ end
777
+ end
778
+
779
+ # Abstract class that encapsulates behavior common to PNumericType and PAbstractTimeDataType
780
+ # @api public
781
+ class PAbstractRangeType < PScalarType
782
+ def initialize(from, to = Float::INFINITY)
783
+ from = -Float::INFINITY if from.nil? || from == :default
784
+ to = Float::INFINITY if to.nil? || to == :default
785
+ raise ArgumentError, "'from' must be less or equal to 'to'. Got (#{from}, #{to}" if from.is_a?(Numeric) && to.is_a?(Numeric) && from > to
786
+ @from = from
787
+ @to = to
788
+ end
789
+
790
+ # Checks if this numeric range intersects with another
791
+ #
792
+ # @param o [PNumericType] the range to compare with
793
+ # @return [Boolean] `true` if this range intersects with the other range
794
+ # @api public
795
+ def intersect?(o)
796
+ self.class == o.class && !(@to < o.numeric_from || o.numeric_to < @from)
797
+ end
798
+
799
+ # Returns the lower bound of the numeric range or `nil` if no lower bound is set.
800
+ # @return [Float,Integer]
801
+ def from
802
+ @from == -Float::INFINITY ? nil : @from
803
+ end
804
+
805
+ # Returns the upper bound of the numeric range or `nil` if no upper bound is set.
806
+ # @return [Float,Integer]
807
+ def to
808
+ @to == Float::INFINITY ? nil : @to
809
+ end
810
+
811
+ # Same as #from but will return `-Float::Infinity` instead of `nil` if no lower bound is set.
812
+ # @return [Float,Integer]
813
+ def numeric_from
814
+ @from
815
+ end
816
+
817
+ # Same as #to but will return `Float::Infinity` instead of `nil` if no lower bound is set.
818
+ # @return [Float,Integer]
819
+ def numeric_to
820
+ @to
821
+ end
822
+
823
+ def hash
824
+ @from.hash ^ @to.hash
825
+ end
826
+
827
+ def eql?(o)
828
+ self.class == o.class && @from == o.numeric_from && @to == o.numeric_to
829
+ end
830
+
831
+ def instance?(o, guard = nil)
832
+ o.is_a?(Numeric) && o >= @from && o <= @to
833
+ end
834
+
835
+ def unbounded?
836
+ @from == -Float::INFINITY && @to == Float::INFINITY
837
+ end
838
+ end
839
+
840
+ # @api public
841
+ #
842
+ class PNumericType < PAbstractRangeType
843
+ def self.register_ptype(loader, ir)
844
+ create_ptype(loader, ir, 'ScalarType',
845
+ 'from' => { KEY_TYPE => POptionalType.new(PNumericType::DEFAULT), KEY_VALUE => nil },
846
+ 'to' => { KEY_TYPE => POptionalType.new(PNumericType::DEFAULT), KEY_VALUE => nil }
847
+ )
848
+ end
849
+
850
+ def self.new_function(_, loader)
851
+ @new_function ||= Puppet::Functions.create_loaded_function(:new_numeric, loader) do
852
+ local_types do
853
+ type 'Convertible = Variant[Undef, Integer, Float, Boolean, String, Timespan, Timestamp]'
854
+ type 'NamedArgs = Struct[{from => Convertible, Optional[abs] => Boolean}]'
855
+ end
856
+
857
+ dispatch :from_args do
858
+ param 'Convertible', :from
859
+ optional_param 'Boolean', :abs
860
+ end
861
+
862
+ dispatch :from_hash do
863
+ param 'NamedArgs', :hash_args
864
+ end
865
+
866
+ def from_args(from, abs = false)
867
+ result = from_convertible(from)
868
+ abs ? result.abs : result
869
+ end
870
+
871
+ def from_hash(args_hash)
872
+ from_args(args_hash['from'], args_hash['abs'] || false)
873
+ end
874
+
875
+ def from_convertible(from)
876
+ case from
877
+ when NilClass
878
+ throw :undefined_value
879
+ when Float
880
+ from
881
+ when Integer
882
+ from
883
+ when Time::TimeData
884
+ from.to_f
885
+ when TrueClass
886
+ 1
887
+ when FalseClass
888
+ 0
889
+ when String
890
+ begin
891
+ if from[0] == '0' && (from[1].downcase == 'b' || from[1].downcase == 'x')
892
+ Integer(from)
893
+ else
894
+ Puppet::Pops::Utils.to_n(from)
895
+ end
896
+ rescue TypeError => e
897
+ raise TypeConversionError.new(e.message)
898
+ rescue ArgumentError => e
899
+ raise TypeConversionError.new(e.message)
900
+ end
901
+ else
902
+ t = Puppet::Pops::Types::TypeCalculator.singleton.infer(from).generalize
903
+ raise TypeConversionError.new("Value of type '#{t}' cannot be converted to Numeric")
904
+ end
905
+ end
906
+ end
907
+ end
908
+
909
+ protected
910
+
911
+ # @api_private
912
+ def _assignable?(o, guard)
913
+ return false unless o.is_a?(self.class)
914
+ # If o min and max are within the range of t
915
+ @from <= o.numeric_from && @to >= o.numeric_to
916
+ end
917
+
918
+ DEFAULT = PNumericType.new(-Float::INFINITY)
919
+ end
920
+
921
+ # @api public
922
+ #
923
+ class PIntegerType < PNumericType
924
+ def self.register_ptype(loader, ir)
925
+ create_ptype(loader, ir, 'NumericType')
926
+ end
927
+
928
+ # Will respond `true` for any range that is bounded at both ends.
929
+ #
930
+ # @return [Boolean] `true` if the type describes a finite range.
931
+ def finite_range?
932
+ @from != -Float::INFINITY && @to != Float::INFINITY
933
+ end
934
+
935
+ def generalize
936
+ DEFAULT
937
+ end
938
+
939
+ def instance?(o, guard = nil)
940
+ o.is_a?(Integer) && o >= numeric_from && o <= numeric_to
941
+ end
942
+
943
+ # Checks if this range is adjacent to the given range
944
+ #
945
+ # @param o [PIntegerType] the range to compare with
946
+ # @return [Boolean] `true` if this range is adjacent to the other range
947
+ # @api public
948
+ def adjacent?(o)
949
+ o.is_a?(PIntegerType) && (@to + 1 == o.from || o.to + 1 == @from)
950
+ end
951
+
952
+ # Concatenates this range with another range provided that the ranges intersect or
953
+ # are adjacent. When that's not the case, this method will return `nil`
954
+ #
955
+ # @param o [PIntegerType] the range to concatenate with this range
956
+ # @return [PIntegerType,nil] the concatenated range or `nil` when the ranges were apart
957
+ # @api public
958
+ def merge(o)
959
+ if intersect?(o) || adjacent?(o)
960
+ min = @from <= o.numeric_from ? @from : o.numeric_from
961
+ max = @to >= o.numeric_to ? @to : o.numeric_to
962
+ PIntegerType.new(min, max)
963
+ else
964
+ nil
965
+ end
966
+ end
967
+
968
+ def iterable?(guard = nil)
969
+ true
970
+ end
971
+
972
+ def iterable_type(guard = nil)
973
+ # It's unknown if the iterable will be a range (min, max) or a "times" (0, max)
974
+ PIterableType.new(PIntegerType::DEFAULT)
975
+ end
976
+
977
+ # Returns Float.Infinity if one end of the range is unbound
978
+ def size
979
+ return Float::INFINITY if @from == -Float::INFINITY || @to == Float::INFINITY
980
+ 1+(to-from).abs
981
+ end
982
+
983
+ # Returns the range as an array ordered so the smaller number is always first.
984
+ # The number may be Infinity or -Infinity.
985
+ def range
986
+ [@from, @to]
987
+ end
988
+
989
+ # Returns Enumerator if no block is given
990
+ # Returns nil if size is infinity (does not yield)
991
+ def each(&block)
992
+ r = Iterable.on(self)
993
+ block_given? ? r.each(&block) : r
994
+ end
995
+
996
+ # Returns a range where both to and from are positive numbers. Negative
997
+ # numbers are converted to zero
998
+ # @return [PIntegerType] a positive range
999
+ def to_size
1000
+ @from >= 0 ? self : PIntegerType.new(0, @to < 0 ? 0 : @to)
1001
+ end
1002
+
1003
+ def new_function(loader)
1004
+ @@new_function ||= Puppet::Functions.create_loaded_function(:new, loader) do
1005
+ local_types do
1006
+ type 'Radix = Variant[Default, Integer[2,2], Integer[8,8], Integer[10,10], Integer[16,16]]'
1007
+ type 'Convertible = Variant[Undef, Numeric, Boolean, String, Timespan, Timestamp]'
1008
+ type 'NamedArgs = Struct[{from => Convertible, Optional[radix] => Radix, Optional[abs] => Boolean}]'
1009
+ end
1010
+
1011
+ dispatch :from_args do
1012
+ param 'Convertible', :from
1013
+ optional_param 'Radix', :radix
1014
+ optional_param 'Boolean', :abs
1015
+ end
1016
+
1017
+ dispatch :from_hash do
1018
+ param 'NamedArgs', :hash_args
1019
+ end
1020
+
1021
+ def from_args(from, radix = :default, abs = false)
1022
+ result = from_convertible(from, radix)
1023
+ abs ? result.abs : result
1024
+ end
1025
+
1026
+ def from_hash(args_hash)
1027
+ from_args(args_hash['from'], args_hash['radix'] || :default, args_hash['abs'] || false)
1028
+ end
1029
+
1030
+ def from_convertible(from, radix)
1031
+ case from
1032
+ when NilClass
1033
+ throw :undefined_value
1034
+ when Float, Time::TimeData
1035
+ from.to_i
1036
+ when Integer
1037
+ from
1038
+ when TrueClass
1039
+ 1
1040
+ when FalseClass
1041
+ 0
1042
+ when String
1043
+ begin
1044
+ radix == :default ? Integer(from) : Integer(from, assert_radix(radix))
1045
+ rescue TypeError => e
1046
+ raise TypeConversionError.new(e.message)
1047
+ rescue ArgumentError => e
1048
+ # Test for special case where there is whitespace between sign and number
1049
+ match = Patterns::WS_BETWEEN_SIGN_AND_NUMBER.match(from)
1050
+ if match
1051
+ begin
1052
+ # Try again, this time with whitespace removed
1053
+ return from_args(match[1] + match[2], radix)
1054
+ rescue TypeConversionError
1055
+ # Ignored to retain original error
1056
+ end
1057
+ end
1058
+ raise TypeConversionError.new(e.message)
1059
+ end
1060
+ else
1061
+ t = Puppet::Pops::Types::TypeCalculator.singleton.infer(from).generalize
1062
+ raise TypeConversionError.new("Value of type '#{t}' cannot be converted to an Integer")
1063
+ end
1064
+ end
1065
+
1066
+ def assert_radix(radix)
1067
+ case radix
1068
+ when 2, 8, 10, 16, :default
1069
+ else
1070
+ raise ArgumentError.new("Illegal radix: '#{radix}', expected 2, 8, 10, 16, or default")
1071
+ end
1072
+ radix
1073
+ end
1074
+
1075
+ end
1076
+ end
1077
+
1078
+ DEFAULT = PIntegerType.new(-Float::INFINITY)
1079
+ end
1080
+
1081
+ # @api public
1082
+ #
1083
+ class PFloatType < PNumericType
1084
+ def self.register_ptype(loader, ir)
1085
+ create_ptype(loader, ir, 'NumericType')
1086
+ end
1087
+
1088
+ def generalize
1089
+ DEFAULT
1090
+ end
1091
+
1092
+ def instance?(o, guard = nil)
1093
+ o.is_a?(Float) && o >= numeric_from && o <= numeric_to
1094
+ end
1095
+
1096
+ # Concatenates this range with another range provided that the ranges intersect. When that's not the case, this
1097
+ # method will return `nil`
1098
+ #
1099
+ # @param o [PFloatType] the range to concatenate with this range
1100
+ # @return [PFloatType,nil] the concatenated range or `nil` when the ranges were apart
1101
+ # @api public
1102
+ def merge(o)
1103
+ if intersect?(o)
1104
+ min = @from <= o.from ? @from : o.from
1105
+ max = @to >= o.to ? @to : o.to
1106
+ PFloatType.new(min, max)
1107
+ else
1108
+ nil
1109
+ end
1110
+ end
1111
+
1112
+ # Returns a new function that produces a Float value
1113
+ #
1114
+ def self.new_function(_, loader)
1115
+ @new_function ||= Puppet::Functions.create_loaded_function(:new_float, loader) do
1116
+ local_types do
1117
+ type 'Convertible = Variant[Undef, Numeric, Boolean, String, Timespan, Timestamp]'
1118
+ type 'NamedArgs = Struct[{from => Convertible, Optional[abs] => Boolean}]'
1119
+ end
1120
+
1121
+ dispatch :from_args do
1122
+ param 'Convertible', :from
1123
+ optional_param 'Boolean', :abs
1124
+ end
1125
+
1126
+ dispatch :from_hash do
1127
+ param 'NamedArgs', :hash_args
1128
+ end
1129
+
1130
+ def from_args(from, abs = false)
1131
+ result = from_convertible(from)
1132
+ abs ? result.abs : result
1133
+ end
1134
+
1135
+ def from_hash(args_hash)
1136
+ from_args(args_hash['from'], args_hash['abs'] || false)
1137
+ end
1138
+
1139
+ def from_convertible(from)
1140
+ case from
1141
+ when NilClass
1142
+ throw :undefined_value
1143
+ when Float
1144
+ from
1145
+ when Integer
1146
+ Float(from)
1147
+ when Time::TimeData
1148
+ from.to_f
1149
+ when TrueClass
1150
+ 1.0
1151
+ when FalseClass
1152
+ 0.0
1153
+ when String
1154
+ begin
1155
+ # support a binary as float
1156
+ if from[0] == '0' && from[1].downcase == 'b'
1157
+ from = Integer(from)
1158
+ end
1159
+ Float(from)
1160
+ rescue TypeError => e
1161
+ raise TypeConversionError.new(e.message)
1162
+ rescue ArgumentError => e
1163
+ # Test for special case where there is whitespace between sign and number
1164
+ match = Patterns::WS_BETWEEN_SIGN_AND_NUMBER.match(from)
1165
+ if match
1166
+ begin
1167
+ # Try again, this time with whitespace removed
1168
+ return from_args(match[1] + match[2])
1169
+ rescue TypeConversionError
1170
+ # Ignored to retain original error
1171
+ end
1172
+ end
1173
+ raise TypeConversionError.new(e.message)
1174
+ end
1175
+ else
1176
+ t = Puppet::Pops::Types::TypeCalculator.singleton.infer(from).generalize
1177
+ raise TypeConversionError.new("Value of type '#{t}' cannot be converted to Float")
1178
+ end
1179
+ end
1180
+ end
1181
+ end
1182
+
1183
+ DEFAULT = PFloatType.new(-Float::INFINITY)
1184
+ end
1185
+
1186
+ # @api public
1187
+ #
1188
+ class PCollectionType < PAnyType
1189
+ def self.register_ptype(loader, ir)
1190
+ create_ptype(loader, ir, 'AnyType',
1191
+ 'size_type' => {
1192
+ KEY_TYPE => POptionalType.new(PType.new(PIntegerType::DEFAULT)),
1193
+ KEY_VALUE => nil
1194
+ }
1195
+ )
1196
+ end
1197
+
1198
+ attr_reader :size_type
1199
+
1200
+ def initialize(size_type)
1201
+ @size_type = size_type
1202
+ end
1203
+
1204
+ def accept(visitor, guard)
1205
+ super
1206
+ @size_type.accept(visitor, guard) unless @size_type.nil?
1207
+ end
1208
+
1209
+ def generalize
1210
+ DEFAULT
1211
+ end
1212
+
1213
+ def normalize(guard = nil)
1214
+ DEFAULT
1215
+ end
1216
+
1217
+ def instance?(o, guard = nil)
1218
+ if o.is_a?(Array) || o.is_a?(Hash)
1219
+ @size_type.nil? || @size_type.instance?(o.size)
1220
+ else
1221
+ false
1222
+ end
1223
+ end
1224
+
1225
+ # Returns an array with from (min) size to (max) size
1226
+ def size_range
1227
+ (@size_type || DEFAULT_SIZE).range
1228
+ end
1229
+
1230
+ def has_empty_range?
1231
+ from, to = size_range
1232
+ from == 0 && to == 0
1233
+ end
1234
+
1235
+ def hash
1236
+ @size_type.hash
1237
+ end
1238
+
1239
+ def iterable?(guard = nil)
1240
+ true
1241
+ end
1242
+
1243
+ def eql?(o)
1244
+ self.class == o.class && @size_type == o.size_type
1245
+ end
1246
+
1247
+
1248
+ DEFAULT_SIZE = PIntegerType.new(0)
1249
+ ZERO_SIZE = PIntegerType.new(0, 0)
1250
+ NOT_EMPTY_SIZE = PIntegerType.new(1)
1251
+ DEFAULT = PCollectionType.new(nil)
1252
+
1253
+ protected
1254
+
1255
+ # @api private
1256
+ #
1257
+ def _assignable?(o, guard)
1258
+ case o
1259
+ when PCollectionType
1260
+ (@size_type || DEFAULT_SIZE).assignable?(o.size_type || DEFAULT_SIZE, guard)
1261
+ when PTupleType
1262
+ # compute the tuple's min/max size, and check if that size matches
1263
+ size_s = size_type || DEFAULT_SIZE
1264
+ size_o = o.size_type
1265
+ if size_o.nil?
1266
+ type_count = o.types.size
1267
+ size_o = PIntegerType.new(type_count, type_count)
1268
+ end
1269
+ size_s.assignable?(size_o)
1270
+ when PStructType
1271
+ from = to = o.elements.size
1272
+ (@size_type || DEFAULT_SIZE).assignable?(PIntegerType.new(from, to), guard)
1273
+ else
1274
+ false
1275
+ end
1276
+ end
1277
+ end
1278
+
1279
+ class PIterableType < PTypeWithContainedType
1280
+ def self.register_ptype(loader, ir)
1281
+ create_ptype(loader, ir, 'AnyType',
1282
+ 'type' => {
1283
+ KEY_TYPE => POptionalType.new(PType::DEFAULT),
1284
+ KEY_VALUE => nil
1285
+ }
1286
+ )
1287
+ end
1288
+
1289
+ def element_type
1290
+ @type
1291
+ end
1292
+
1293
+ def instance?(o, guard = nil)
1294
+ if @type.nil? || @type.assignable?(PAnyType::DEFAULT, guard)
1295
+ # Any element_type will do
1296
+ case o
1297
+ when Iterable, String, Hash, Array, Range, PEnumType
1298
+ true
1299
+ when Integer
1300
+ o >= 0
1301
+ when PIntegerType
1302
+ o.finite_range?
1303
+ else
1304
+ false
1305
+ end
1306
+ else
1307
+ assignable?(TypeCalculator.infer(o), guard)
1308
+ end
1309
+ end
1310
+
1311
+ def iterable?(guard = nil)
1312
+ true
1313
+ end
1314
+
1315
+ def iterable_type(guard = nil)
1316
+ self
1317
+ end
1318
+
1319
+ DEFAULT = PIterableType.new(nil)
1320
+
1321
+ protected
1322
+
1323
+ # @api private
1324
+ def _assignable?(o, guard)
1325
+ if @type.nil? || @type.assignable?(PAnyType::DEFAULT, guard)
1326
+ # Don't request the iterable_type. Since this Iterable accepts Any element, it is enough that o is iterable.
1327
+ o.iterable?
1328
+ else
1329
+ o = o.iterable_type
1330
+ o.nil? || o.element_type.nil? ? false : @type.assignable?(o.element_type, guard)
1331
+ end
1332
+ end
1333
+ end
1334
+
1335
+ # @api public
1336
+ #
1337
+ class PIteratorType < PTypeWithContainedType
1338
+ def self.register_ptype(loader, ir)
1339
+ create_ptype(loader, ir, 'AnyType',
1340
+ 'type' => {
1341
+ KEY_TYPE => POptionalType.new(PType::DEFAULT),
1342
+ KEY_VALUE => nil
1343
+ }
1344
+ )
1345
+ end
1346
+
1347
+ def element_type
1348
+ @type
1349
+ end
1350
+
1351
+ def instance?(o, guard = nil)
1352
+ o.is_a?(Iterable) && (@type.nil? || @type.assignable?(o.element_type, guard))
1353
+ end
1354
+
1355
+ def iterable?(guard = nil)
1356
+ true
1357
+ end
1358
+
1359
+ def iterable_type(guard = nil)
1360
+ @type.nil? ? PIterableType::DEFAULT : PIterableType.new(@type)
1361
+ end
1362
+
1363
+ DEFAULT = PIteratorType.new(nil)
1364
+
1365
+ protected
1366
+
1367
+ # @api private
1368
+ def _assignable?(o, guard)
1369
+ o.is_a?(PIteratorType) && (@type.nil? || @type.assignable?(o.element_type, guard))
1370
+ end
1371
+ end
1372
+
1373
+ # @api public
1374
+ #
1375
+ class PStringType < PScalarType
1376
+ def self.register_ptype(loader, ir)
1377
+ create_ptype(loader, ir, 'ScalarType',
1378
+ 'size_type_or_value' => {
1379
+ KEY_TYPE => POptionalType.new(PVariantType.new([PStringType::DEFAULT, PType.new(PIntegerType::DEFAULT)])),
1380
+ KEY_VALUE => nil
1381
+ })
1382
+ end
1383
+
1384
+ attr_reader :size_type_or_value
1385
+
1386
+ def initialize(size_type_or_value, deprecated_multi_args = EMPTY_ARRAY)
1387
+ unless deprecated_multi_args.empty?
1388
+ if Puppet[:strict] != :off
1389
+ Puppet.warn_once(:deprecatation, "PStringType#initialize_multi_args", "Passing more than one argument to PStringType#initialize is deprecated")
1390
+ end
1391
+ size_type_or_value = deprecated_multi_args[0]
1392
+ end
1393
+ @size_type_or_value = size_type_or_value
1394
+ end
1395
+
1396
+ def accept(visitor, guard)
1397
+ super
1398
+ @size_type_or_value.accept(visitor, guard) if @size_type_or_value.is_a?(PIntegerType)
1399
+ end
1400
+
1401
+ def generalize
1402
+ DEFAULT
1403
+ end
1404
+
1405
+ def hash
1406
+ @size_type_or_value.hash
1407
+ end
1408
+
1409
+ def iterable?(guard = nil)
1410
+ true
1411
+ end
1412
+
1413
+ def iterable_type(guard = nil)
1414
+ ITERABLE_TYPE
1415
+ end
1416
+
1417
+ def eql?(o)
1418
+ self.class == o.class && @size_type_or_value == o.size_type_or_value
1419
+ end
1420
+
1421
+ def instance?(o, guard = nil)
1422
+ # true if size compliant
1423
+ if o.is_a?(String)
1424
+ if @size_type_or_value.is_a?(PIntegerType)
1425
+ @size_type_or_value.instance?(o.size, guard)
1426
+ else
1427
+ @size_type_or_value.nil? ? true : o == value
1428
+ end
1429
+ else
1430
+ false
1431
+ end
1432
+ end
1433
+
1434
+ def value
1435
+ @size_type_or_value.is_a?(PIntegerType) ? nil : @size_type_or_value
1436
+ end
1437
+
1438
+ # @deprecated
1439
+ # @api private
1440
+ def values
1441
+ if Puppet[:strict] != :off
1442
+ Puppet.warn_once(:deprecatation, "PStringType#values", "Method PStringType#values is deprecated. Use #value instead")
1443
+ end
1444
+ @value.is_a?(String) ? [@value] : EMPTY_ARRAY
1445
+ end
1446
+
1447
+ def size_type
1448
+ @size_type_or_value.is_a?(PIntegerType) ? @size_type_or_value : nil
1449
+ end
1450
+
1451
+ def size_type
1452
+ @size_type_or_value.is_a?(PIntegerType) ? @size_type_or_value : nil
1453
+ end
1454
+
1455
+ def derived_size_type
1456
+ if @size_type_or_value.is_a?(PIntegerType)
1457
+ @size_type_or_value
1458
+ elsif @size_type_or_value.is_a?(String)
1459
+ sz = @size_type_or_value.size
1460
+ PIntegerType.new(sz, sz)
1461
+ else
1462
+ PCollectionType::DEFAULT_SIZE
1463
+ end
1464
+ end
1465
+
1466
+ def self.new_function(_, loader)
1467
+ @new_function ||= Puppet::Functions.create_loaded_function(:new_string, loader) do
1468
+ local_types do
1469
+ type 'Format = Pattern[/^%([\s\+\-#0\[\{<\(\|]*)([1-9][0-9]*)?(?:\.([0-9]+))?([a-zA-Z])/]'
1470
+ type 'ContainerFormat = Struct[{
1471
+ Optional[format] => String,
1472
+ Optional[separator] => String,
1473
+ Optional[separator2] => String,
1474
+ Optional[string_formats] => Hash[Type, Format]
1475
+ }]'
1476
+ type 'TypeMap = Hash[Type, Variant[Format, ContainerFormat]]'
1477
+ type 'Convertible = Any'
1478
+ type 'Formats = Variant[Default, String[1], TypeMap]'
1479
+ end
1480
+
1481
+ dispatch :from_args do
1482
+ param 'Convertible', :from
1483
+ optional_param 'Formats', :string_formats
1484
+ end
1485
+
1486
+ def from_args(from, formats = :default)
1487
+ StringConverter.singleton.convert(from, formats)
1488
+ end
1489
+ end
1490
+ end
1491
+
1492
+ DEFAULT = PStringType.new(nil)
1493
+ NON_EMPTY = PStringType.new(PCollectionType::NOT_EMPTY_SIZE)
1494
+
1495
+ # Iterates over each character of the string
1496
+ ITERABLE_TYPE = PIterableType.new(PStringType.new(PIntegerType.new(1,1)))
1497
+
1498
+ protected
1499
+
1500
+ # @api private
1501
+ def _assignable?(o, guard)
1502
+ if @size_type_or_value.is_a?(PIntegerType)
1503
+ # A general string is assignable by any other string or pattern restricted string
1504
+ # if the string has a size constraint it does not match since there is no reasonable way
1505
+ # to compute the min/max length a pattern will match. For enum, it is possible to test that
1506
+ # each enumerator value is within range
1507
+ case o
1508
+ when PStringType
1509
+ @size_type_or_value.assignable?(o.derived_size_type, guard)
1510
+
1511
+ when PEnumType
1512
+ if o.values.empty?
1513
+ # enum represents all enums, and thus all strings, a sized constrained string can thus not
1514
+ # be assigned any enum (unless it is max size).
1515
+ @size_type_or_value.assignable?(PCollectionType::DEFAULT_SIZE, guard)
1516
+ else
1517
+ # true if all enum values are within range
1518
+ orange = o.values.map(&:size).minmax
1519
+ srange = @size_type_or_value.range
1520
+ # If o min and max are within the range of t
1521
+ srange[0] <= orange[0] && srange[1] >= orange[1]
1522
+ end
1523
+
1524
+ when PPatternType
1525
+ # true if size constraint is at least 0 to +Infinity (which is the same as the default)
1526
+ @size_type_or_value.assignable?(PCollectionType::DEFAULT_SIZE, guard)
1527
+ else
1528
+ # no other type matches string
1529
+ false
1530
+ end
1531
+ else
1532
+ case o
1533
+ when PStringType
1534
+ # Must match exactly when value is a string
1535
+ @size_type_or_value.nil? || @size_type_or_value == o.size_type_or_value
1536
+ when PEnumType
1537
+ @size_type_or_value.nil? ? true : o.values.size == 1 && @size_type_or_value == o.values[0]
1538
+ when PPatternType
1539
+ @size_type_or_value.nil?
1540
+ else
1541
+ # All others are false, since no other type describes the same set of specific strings
1542
+ false
1543
+ end
1544
+ end
1545
+ end
1546
+ end
1547
+
1548
+ # @api public
1549
+ #
1550
+ class PRegexpType < PScalarType
1551
+ def self.register_ptype(loader, ir)
1552
+ create_ptype(loader, ir, 'ScalarType',
1553
+ 'pattern' => {
1554
+ KEY_TYPE => PVariantType.new([PUndefType::DEFAULT, PStringType::DEFAULT, PRegexpType::DEFAULT]),
1555
+ KEY_VALUE => nil
1556
+ })
1557
+ end
1558
+ attr_reader :pattern
1559
+
1560
+ def initialize(pattern)
1561
+ if pattern.is_a?(Regexp)
1562
+ @regexp = pattern
1563
+ @pattern = pattern.options == 0 ? pattern.source : pattern.to_s
1564
+ else
1565
+ @pattern = pattern
1566
+ end
1567
+ end
1568
+
1569
+ def regexp
1570
+ @regexp ||= Regexp.new(@pattern || '')
1571
+ end
1572
+
1573
+ def hash
1574
+ @pattern.hash
1575
+ end
1576
+
1577
+ def eql?(o)
1578
+ self.class == o.class && @pattern == o.pattern
1579
+ end
1580
+
1581
+ def instance?(o, guard=nil)
1582
+ o.is_a?(Regexp) && (@pattern.nil? || @pattern == (o.options == 0 ? o.source : o.to_s))
1583
+ end
1584
+
1585
+ DEFAULT = PRegexpType.new(nil)
1586
+
1587
+ protected
1588
+
1589
+ # @api private
1590
+ #
1591
+ def _assignable?(o, guard)
1592
+ o.is_a?(PRegexpType) && (@pattern.nil? || @pattern == o.pattern)
1593
+ end
1594
+ end
1595
+
1596
+ # Represents a subtype of String that narrows the string to those matching the patterns
1597
+ # If specified without a pattern it is basically the same as the String type.
1598
+ #
1599
+ # @api public
1600
+ #
1601
+ class PPatternType < PScalarType
1602
+ def self.register_ptype(loader, ir)
1603
+ create_ptype(loader, ir, 'ScalarType', 'patterns' => PArrayType.new(PRegexpType::DEFAULT))
1604
+ end
1605
+
1606
+ attr_reader :patterns
1607
+
1608
+ def initialize(patterns)
1609
+ @patterns = patterns.freeze
1610
+ end
1611
+
1612
+ def accept(visitor, guard)
1613
+ super
1614
+ @patterns.each { |p| p.accept(visitor, guard) }
1615
+ end
1616
+
1617
+ def hash
1618
+ @patterns.hash
1619
+ end
1620
+
1621
+ def eql?(o)
1622
+ self.class == o.class && @patterns.size == o.patterns.size && (@patterns - o.patterns).empty?
1623
+ end
1624
+
1625
+ def instance?(o, guard = nil)
1626
+ o.is_a?(String) && (@patterns.empty? || @patterns.any? { |p| p.regexp.match(o) })
1627
+ end
1628
+
1629
+ DEFAULT = PPatternType.new(EMPTY_ARRAY)
1630
+
1631
+ protected
1632
+
1633
+ # @api private
1634
+ #
1635
+ def _assignable?(o, guard)
1636
+ return true if self == o
1637
+ case o
1638
+ when PStringType
1639
+ v = o.value
1640
+ if v.nil?
1641
+ # Strings cannot all match a pattern, but if there is no pattern it is ok
1642
+ # (There should really always be a pattern, but better safe than sorry).
1643
+ @patterns.empty?
1644
+ else
1645
+ # the string in String type must match one of the patterns in Pattern type,
1646
+ # or Pattern represents all Patterns == all Strings
1647
+ regexps = @patterns.map { |p| p.regexp }
1648
+ regexps.empty? || regexps.any? { |re| re.match(v) }
1649
+ end
1650
+ when PEnumType
1651
+ if o.values.empty?
1652
+ # Enums (unknown which ones) cannot all match a pattern, but if there is no pattern it is ok
1653
+ # (There should really always be a pattern, but better safe than sorry).
1654
+ @patterns.empty?
1655
+ else
1656
+ # all strings in String/Enum type must match one of the patterns in Pattern type,
1657
+ # or Pattern represents all Patterns == all Strings
1658
+ regexps = @patterns.map { |p| p.regexp }
1659
+ regexps.empty? || o.values.all? { |s| regexps.any? {|re| re.match(s) } }
1660
+ end
1661
+ when PPatternType
1662
+ @patterns.empty?
1663
+ else
1664
+ false
1665
+ end
1666
+ end
1667
+ end
1668
+
1669
+ # @api public
1670
+ #
1671
+ class PBooleanType < PScalarType
1672
+ def self.register_ptype(loader, ir)
1673
+ create_ptype(loader, ir, 'ScalarType')
1674
+ end
1675
+
1676
+ def instance?(o, guard = nil)
1677
+ o == true || o == false
1678
+ end
1679
+
1680
+ def self.new_function(_, loader)
1681
+ @new_function ||= Puppet::Functions.create_loaded_function(:new_boolean, loader) do
1682
+ dispatch :from_args do
1683
+ param 'Variant[Undef, Integer, Float, Boolean, String]', :from
1684
+ end
1685
+
1686
+ def from_args(from)
1687
+ from = from.downcase if from.is_a?(String)
1688
+ case from
1689
+ when NilClass
1690
+ throw :undefined_value
1691
+ when Float
1692
+ from != 0.0
1693
+ when Integer
1694
+ from != 0
1695
+ when true, false
1696
+ from
1697
+ when 'false', 'no', 'n'
1698
+ false
1699
+ when 'true', 'yes', 'y'
1700
+ true
1701
+ else
1702
+ raise TypeConversionError.new("Value '#{from}' of type '#{from.class}' cannot be converted to Boolean")
1703
+ end
1704
+ end
1705
+ end
1706
+ end
1707
+
1708
+ DEFAULT = PBooleanType.new
1709
+
1710
+ protected
1711
+
1712
+ # @api private
1713
+ #
1714
+ def _assignable?(o, guard)
1715
+ o.is_a?(PBooleanType)
1716
+ end
1717
+ end
1718
+
1719
+ # @api public
1720
+ #
1721
+ # @api public
1722
+ #
1723
+ class PStructElement < TypedModelObject
1724
+ def self.register_ptype(loader, ir)
1725
+ @type = Pcore::create_object_type(loader, ir, self, 'Pcore::StructElement'.freeze, nil,
1726
+ 'key_type' => PType::DEFAULT,
1727
+ 'value_type' => PType::DEFAULT)
1728
+ end
1729
+
1730
+ attr_accessor :key_type, :value_type
1731
+
1732
+ def accept(visitor, guard)
1733
+ @key_type.accept(visitor, guard)
1734
+ @value_type.accept(visitor, guard)
1735
+ end
1736
+
1737
+ def hash
1738
+ value_type.hash ^ key_type.hash
1739
+ end
1740
+
1741
+ def name
1742
+ k = key_type
1743
+ k = k.optional_type if k.is_a?(POptionalType)
1744
+ k.value
1745
+ end
1746
+
1747
+ def initialize(key_type, value_type)
1748
+ @key_type = key_type
1749
+ @value_type = value_type
1750
+ end
1751
+
1752
+ def generalize
1753
+ gv_type = @value_type.generalize
1754
+ @value_type.equal?(gv_type) ? self : PStructElement.new(@key_type, gv_type)
1755
+ end
1756
+
1757
+ def normalize(guard = nil)
1758
+ nv_type = @value_type.normalize(guard)
1759
+ @value_type.equal?(nv_type) ? self : PStructElement.new(@key_type, nv_type)
1760
+ end
1761
+
1762
+ def resolve(type_parser, loader)
1763
+ rkey_type = @key_type
1764
+ rkey_type = rkey_type.resolve(type_parser, loader) unless rkey_type.nil?
1765
+ rvalue_type = @value_type
1766
+ rvalue_type = rvalue_type.resolve(type_parser, loader) unless rvalue_type.nil?
1767
+ rkey_type.equal?(@key_type) && rvalue_type.equal?(@value_type) ? self : self.class.new(rkey_type, rvalue_type)
1768
+ end
1769
+
1770
+ def <=>(o)
1771
+ self.name <=> o.name
1772
+ end
1773
+
1774
+ def eql?(o)
1775
+ self == o
1776
+ end
1777
+
1778
+ def ==(o)
1779
+ self.class == o.class && value_type == o.value_type && key_type == o.key_type
1780
+ end
1781
+ end
1782
+
1783
+ # @api public
1784
+ #
1785
+ class PStructType < PAnyType
1786
+ include Enumerable
1787
+
1788
+ def self.register_ptype(loader, ir)
1789
+ create_ptype(loader, ir, 'AnyType', 'elements' => PArrayType.new(PTypeReferenceType.new('Pcore::StructElement')))
1790
+ end
1791
+
1792
+ def initialize(elements)
1793
+ @elements = elements.freeze
1794
+ end
1795
+
1796
+ def accept(visitor, guard)
1797
+ super
1798
+ @elements.each { |elem| elem.accept(visitor, guard) }
1799
+ end
1800
+
1801
+ def each
1802
+ if block_given?
1803
+ elements.each { |elem| yield elem }
1804
+ else
1805
+ elements.to_enum
1806
+ end
1807
+ end
1808
+
1809
+ def generalize
1810
+ if @elements.empty?
1811
+ DEFAULT
1812
+ else
1813
+ alter_type_array(@elements, :generalize) { |altered| PStructType.new(altered) }
1814
+ end
1815
+ end
1816
+
1817
+ def normalize(guard = nil)
1818
+ if @elements.empty?
1819
+ DEFAULT
1820
+ else
1821
+ alter_type_array(@elements, :normalize, guard) { |altered| PStructType.new(altered) }
1822
+ end
1823
+ end
1824
+
1825
+ def hashed_elements
1826
+ @hashed ||= @elements.reduce({}) {|memo, e| memo[e.name] = e; memo }
1827
+ end
1828
+
1829
+ def hash
1830
+ @elements.hash
1831
+ end
1832
+
1833
+ def iterable?(guard = nil)
1834
+ true
1835
+ end
1836
+
1837
+ def iterable_type(guard = nil)
1838
+ if self == DEFAULT
1839
+ PIterableType.new(PHashType::DEFAULT_KEY_PAIR_TUPLE)
1840
+ else
1841
+ tc = TypeCalculator.singleton
1842
+ PIterableType.new(
1843
+ PTupleType.new([
1844
+ PVariantType.maybe_create(@elements.map {|se| se.key_type }),
1845
+ PVariantType.maybe_create(@elements.map {|se| se.value_type })],
1846
+ PHashType::KEY_PAIR_TUPLE_SIZE))
1847
+ end
1848
+ end
1849
+
1850
+ def resolve(type_parser, loader)
1851
+ changed = false
1852
+ relements = @elements.map do |elem|
1853
+ relem = elem.resolve(type_parser, loader)
1854
+ changed ||= !relem.equal?(elem)
1855
+ relem
1856
+ end
1857
+ changed ? self.class.new(relements) : self
1858
+ end
1859
+
1860
+ def eql?(o)
1861
+ self.class == o.class && @elements == o.elements
1862
+ end
1863
+
1864
+ def elements
1865
+ @elements
1866
+ end
1867
+
1868
+ def instance?(o, guard = nil)
1869
+ return false unless o.is_a?(Hash)
1870
+ matched = 0
1871
+ @elements.all? do |e|
1872
+ key = e.name
1873
+ v = o[key]
1874
+ if v.nil? && !o.include?(key)
1875
+ # Entry is missing. Only OK when key is optional
1876
+ e.key_type.assignable?(PUndefType::DEFAULT, guard)
1877
+ else
1878
+ matched += 1
1879
+ e.value_type.instance?(v, guard)
1880
+ end
1881
+ end && matched == o.size
1882
+ end
1883
+
1884
+ def new_function(loader)
1885
+ # Simply delegate to Hash type and let the higher level assertion deal with
1886
+ # compliance with the Struct type regarding the produced result.
1887
+ PHashType.new_function(self, loader)
1888
+ end
1889
+
1890
+ DEFAULT = PStructType.new(EMPTY_ARRAY)
1891
+
1892
+ protected
1893
+
1894
+ # @api private
1895
+ def _assignable?(o, guard)
1896
+ if o.is_a?(Types::PStructType)
1897
+ h2 = o.hashed_elements
1898
+ matched = 0
1899
+ elements.all? do |e1|
1900
+ e2 = h2[e1.name]
1901
+ if e2.nil?
1902
+ e1.key_type.assignable?(PUndefType::DEFAULT, guard)
1903
+ else
1904
+ matched += 1
1905
+ e1.key_type.assignable?(e2.key_type, guard) && e1.value_type.assignable?(e2.value_type, guard)
1906
+ end
1907
+ end && matched == h2.size
1908
+ elsif o.is_a?(Types::PHashType)
1909
+ required = 0
1910
+ required_elements_assignable = elements.all? do |e|
1911
+ key_type = e.key_type
1912
+ if key_type.assignable?(PUndefType::DEFAULT)
1913
+ # Element is optional so Hash does not need to provide it
1914
+ true
1915
+ else
1916
+ required += 1
1917
+ if e.value_type.assignable?(o.value_type, guard)
1918
+ # Hash must have something that is assignable. We don't care about the name or size of the key though
1919
+ # because we have no instance of a hash to compare against.
1920
+ key_type.generalize.assignable?(o.key_type)
1921
+ else
1922
+ false
1923
+ end
1924
+ end
1925
+ end
1926
+ if required_elements_assignable
1927
+ size_o = o.size_type || PCollectionType::DEFAULT_SIZE
1928
+ PIntegerType.new(required, elements.size).assignable?(size_o, guard)
1929
+ else
1930
+ false
1931
+ end
1932
+ else
1933
+ false
1934
+ end
1935
+ end
1936
+ end
1937
+
1938
+ # @api public
1939
+ #
1940
+ class PTupleType < PAnyType
1941
+ include Enumerable
1942
+
1943
+ def self.register_ptype(loader, ir)
1944
+ create_ptype(loader, ir, 'AnyType',
1945
+ 'types' => PArrayType.new(PType::DEFAULT),
1946
+ 'size_type' => {
1947
+ KEY_TYPE => POptionalType.new(PType.new(PIntegerType::DEFAULT)),
1948
+ KEY_VALUE => nil
1949
+ }
1950
+ )
1951
+ end
1952
+
1953
+ # If set, describes min and max required of the given types - if max > size of
1954
+ # types, the last type entry repeats
1955
+ #
1956
+ attr_reader :size_type
1957
+
1958
+ attr_reader :types
1959
+
1960
+ def accept(visitor, guard)
1961
+ super
1962
+ @size_type.accept(visitor, guard) unless @size_type.nil?
1963
+ @types.each { |elem| elem.accept(visitor, guard) }
1964
+ end
1965
+
1966
+ # @api private
1967
+ def callable_args?(callable_t, guard)
1968
+ unless size_type.nil?
1969
+ raise ArgumentError, 'Callable tuple may not have a size constraint when used as args'
1970
+ end
1971
+
1972
+ params_tuple = callable_t.param_types
1973
+ param_block_t = callable_t.block_type
1974
+ arg_types = @types
1975
+ arg_block_t = arg_types.last
1976
+ if arg_block_t.kind_of_callable?(true, guard)
1977
+ # Can't pass a block to a callable that doesn't accept one
1978
+ return false if param_block_t.nil?
1979
+
1980
+ # Check that the block is of the right tyṕe
1981
+ return false unless param_block_t.assignable?(arg_block_t, guard)
1982
+
1983
+ # Check other arguments
1984
+ arg_count = arg_types.size - 1
1985
+ params_size_t = params_tuple.size_type || PIntegerType.new(*params_tuple.size_range)
1986
+ return false unless params_size_t.assignable?(PIntegerType.new(arg_count, arg_count), guard)
1987
+
1988
+ ctypes = params_tuple.types
1989
+ arg_count.times do |index|
1990
+ return false unless (ctypes[index] || ctypes[-1]).assignable?(arg_types[index], guard)
1991
+ end
1992
+ return true
1993
+ end
1994
+
1995
+ # Check that tuple is assignable and that the block (if declared) is optional
1996
+ params_tuple.assignable?(self, guard) && (param_block_t.nil? || param_block_t.assignable?(PUndefType::DEFAULT, guard))
1997
+ end
1998
+
1999
+ def initialize(types, size_type = nil)
2000
+ @types = types
2001
+ @size_type = size_type.nil? ? nil : size_type.to_size
2002
+ end
2003
+
2004
+ # Returns Enumerator for the types if no block is given, otherwise, calls the given
2005
+ # block with each of the types in this tuple
2006
+ def each
2007
+ if block_given?
2008
+ types.each { |x| yield x }
2009
+ else
2010
+ types.to_enum
2011
+ end
2012
+ end
2013
+
2014
+ def generalize
2015
+ if self == DEFAULT
2016
+ DEFAULT
2017
+ else
2018
+ alter_type_array(@types, :generalize) { |altered_types| PTupleType.new(altered_types, @size_type) }
2019
+ end
2020
+ end
2021
+
2022
+ def normalize(guard = nil)
2023
+ if self == DEFAULT
2024
+ DEFAULT
2025
+ else
2026
+ alter_type_array(@types, :normalize, guard) { |altered_types| PTupleType.new(altered_types, @size_type) }
2027
+ end
2028
+ end
2029
+
2030
+ def resolve(type_parser, loader)
2031
+ changed = false
2032
+ rtypes = @types.map do |type|
2033
+ rtype = type.resolve(type_parser, loader)
2034
+ changed ||= !rtype.equal?(type)
2035
+ rtype
2036
+ end
2037
+ changed ? self.class.new(rtypes, @size_type) : self
2038
+ end
2039
+
2040
+ def instance?(o, guard = nil)
2041
+ return false unless o.is_a?(Array)
2042
+ if @size_type
2043
+ return false unless @size_type.instance?(o.size, guard)
2044
+ else
2045
+ return false unless @types.empty? || @types.size == o.size
2046
+ end
2047
+ index = -1
2048
+ @types.empty? || o.all? do |element|
2049
+ @types.fetch(index += 1) { @types.last }.instance?(element, guard)
2050
+ end
2051
+ end
2052
+
2053
+ def iterable?(guard = nil)
2054
+ true
2055
+ end
2056
+
2057
+ def iterable_type(guard = nil)
2058
+ PIterableType.new(PVariantType.maybe_create(types))
2059
+ end
2060
+
2061
+ # Returns the number of elements accepted [min, max] in the tuple
2062
+ def size_range
2063
+ if @size_type.nil?
2064
+ types_size = @types.size
2065
+ types_size == 0 ? [0, Float::INFINITY] : [types_size, types_size]
2066
+ else
2067
+ @size_type.range
2068
+ end
2069
+ end
2070
+
2071
+ # Returns the number of accepted occurrences [min, max] of the last type in the tuple
2072
+ # The defaults is [1,1]
2073
+ #
2074
+ def repeat_last_range
2075
+ if @size_type.nil?
2076
+ return [1, 1]
2077
+ end
2078
+ types_size = @types.size
2079
+ from, to = @size_type.range
2080
+ min = from - (types_size-1)
2081
+ min = min <= 0 ? 0 : min
2082
+ max = to - (types_size-1)
2083
+ [min, max]
2084
+ end
2085
+
2086
+ def hash
2087
+ @size_type.hash ^ @types.hash
2088
+ end
2089
+
2090
+ def eql?(o)
2091
+ self.class == o.class && @types == o.types && @size_type == o.size_type
2092
+ end
2093
+
2094
+ def new_function(loader)
2095
+ # Simply delegate to Array type and let the higher level assertion deal with
2096
+ # compliance with the Tuple type regarding the produced result.
2097
+ PArrayType.new_function(self, loader)
2098
+ end
2099
+
2100
+ DATA = PTupleType.new([PDataType::DEFAULT], PCollectionType::DEFAULT_SIZE)
2101
+ DEFAULT = PTupleType.new(EMPTY_ARRAY)
2102
+
2103
+ protected
2104
+
2105
+ # @api private
2106
+ def _assignable?(o, guard)
2107
+ return true if self == o
2108
+ return false unless o.is_a?(PTupleType) || o.is_a?(PArrayType)
2109
+ s_types = types
2110
+ size_s = size_type || PIntegerType.new(*size_range)
2111
+
2112
+ if o.is_a?(PTupleType)
2113
+ size_o = o.size_type || PIntegerType.new(*o.size_range)
2114
+ return false unless size_s.assignable?(size_o, guard)
2115
+ unless s_types.empty?
2116
+ o_types = o.types
2117
+ return size_s.numeric_from == 0 if o_types.empty?
2118
+ o_types.size.times do |index|
2119
+ return false unless (s_types[index] || s_types[-1]).assignable?(o_types[index], guard)
2120
+ end
2121
+ end
2122
+ else
2123
+ size_o = o.size_type || PCollectionType::DEFAULT_SIZE
2124
+ return false unless size_s.assignable?(size_o, guard)
2125
+ unless s_types.empty?
2126
+ o_entry = o.element_type
2127
+ # Array of anything can not be assigned (unless tuple is tuple of anything) - this case
2128
+ # was handled at the top of this method.
2129
+ #
2130
+ return false if o_entry.nil?
2131
+ [s_types.size, size_o.range[1]].min.times { |index| return false unless (s_types[index] || s_types[-1]).assignable?(o_entry, guard) }
2132
+ end
2133
+ end
2134
+ true
2135
+ end
2136
+ end
2137
+
2138
+ # @api public
2139
+ #
2140
+ class PCallableType < PAnyType
2141
+ def self.register_ptype(loader, ir)
2142
+ create_ptype(loader, ir, 'AnyType',
2143
+ 'param_types' => {
2144
+ KEY_TYPE => POptionalType.new(PTupleType::DEFAULT),
2145
+ KEY_VALUE => nil
2146
+ },
2147
+ 'block_type' => {
2148
+ KEY_TYPE => POptionalType.new(PCallableType::DEFAULT),
2149
+ KEY_VALUE => nil
2150
+ },
2151
+ 'return_type' => {
2152
+ KEY_TYPE => POptionalType.new(PType::DEFAULT),
2153
+ KEY_VALUE => PAnyType::DEFAULT
2154
+ }
2155
+ )
2156
+ end
2157
+
2158
+ # @return [PAnyType] The type for the values returned by this callable. Returns `nil` if return value is unconstrained
2159
+ attr_reader :return_type
2160
+
2161
+ # Types of parameters as a Tuple with required/optional count, or an Integer with min (required), max count
2162
+ # @return [PTupleType] the tuple representing the parameter types
2163
+ attr_reader :param_types
2164
+
2165
+ # Although being an abstract type reference, only Callable, or all Callables wrapped in
2166
+ # Optional or Variant are supported
2167
+ # If not set, the meaning is that block is not supported.
2168
+ # @return [PAnyType|nil] the block type
2169
+ attr_reader :block_type
2170
+
2171
+ # @param param_types [PTupleType]
2172
+ # @param block_type [PAnyType]
2173
+ # @param return_type [PAnyType]
2174
+ def initialize(param_types, block_type = nil, return_type = nil)
2175
+ @param_types = param_types
2176
+ @block_type = block_type
2177
+ @return_type = return_type == PAnyType::DEFAULT ? nil : return_type
2178
+ end
2179
+
2180
+ def accept(visitor, guard)
2181
+ super
2182
+ @param_types.accept(visitor, guard) unless @param_types.nil?
2183
+ @block_type.accept(visitor, guard) unless @block_type.nil?
2184
+ @return_type.accept(visitor, guard) unless @return_type.nil?
2185
+ end
2186
+
2187
+ def generalize
2188
+ if self == DEFAULT
2189
+ DEFAULT
2190
+ else
2191
+ params_t = @param_types.nil? ? nil : @param_types.generalize
2192
+ block_t = @block_type.nil? ? nil : @block_type.generalize
2193
+ return_t = @return_type.nil? ? nil : @return_type.generalize
2194
+ @param_types.equal?(params_t) && @block_type.equal?(block_t) && @return_type.equal?(return_t) ? self : PCallableType.new(params_t, block_t, return_t)
2195
+ end
2196
+ end
2197
+
2198
+ def normalize(guard = nil)
2199
+ if self == DEFAULT
2200
+ DEFAULT
2201
+ else
2202
+ params_t = @param_types.nil? ? nil : @param_types.normalize(guard)
2203
+ block_t = @block_type.nil? ? nil : @block_type.normalize(guard)
2204
+ return_t = @return_type.nil? ? nil : @return_type.normalize(guard)
2205
+ @param_types.equal?(params_t) && @block_type.equal?(block_t) && @return_type.equal?(return_t) ? self : PCallableType.new(params_t, block_t, return_t)
2206
+ end
2207
+ end
2208
+
2209
+ def instance?(o, guard = nil)
2210
+ (o.is_a?(Proc) || o.is_a?(Evaluator::Closure) || o.is_a?(Functions::Function)) && assignable?(TypeCalculator.infer(o), guard)
2211
+ end
2212
+
2213
+ # Returns `true` if this instance is a callable that accepts the given _args_
2214
+ #
2215
+ # @param args [Array] the arguments to test
2216
+ # @return [Boolean] `true` if this instance is a callable that accepts the given _args_
2217
+ def callable_with?(args, block = nil)
2218
+ # nil param_types and compatible return type means other Callable is assignable
2219
+ return true if @param_types.nil?
2220
+ return false unless @param_types.instance?(args)
2221
+ if @block_type.nil?
2222
+ block == nil
2223
+ else
2224
+ @block_type.instance?(block)
2225
+ end
2226
+ end
2227
+
2228
+ # @api private
2229
+ def callable_args?(required_callable_t, guard)
2230
+ # If the required callable is euqal or more specific than self, self is acceptable arguments
2231
+ required_callable_t.assignable?(self, guard)
2232
+ end
2233
+
2234
+ def kind_of_callable?(optional=true, guard = nil)
2235
+ true
2236
+ end
2237
+
2238
+ # Returns the number of accepted arguments [min, max]
2239
+ def size_range
2240
+ @param_types.nil? ? nil : @param_types.size_range
2241
+ end
2242
+
2243
+ # Returns the number of accepted arguments for the last parameter type [min, max]
2244
+ #
2245
+ def last_range
2246
+ @param_types.nil? ? nil : @param_types.repeat_last_range
2247
+ end
2248
+
2249
+ # Range [0,0], [0,1], or [1,1] for the block
2250
+ #
2251
+ def block_range
2252
+ case block_type
2253
+ when POptionalType
2254
+ [0,1]
2255
+ when PVariantType, PCallableType
2256
+ [1,1]
2257
+ else
2258
+ [0,0]
2259
+ end
2260
+ end
2261
+
2262
+ def hash
2263
+ [@param_types, @block_type, @return_type].hash
2264
+ end
2265
+
2266
+ def eql?(o)
2267
+ self.class == o.class && @param_types == o.param_types && @block_type == o.block_type && @return_type == o.return_type
2268
+ end
2269
+
2270
+ def resolve(type_parser, loader)
2271
+ params_t = @param_types.nil? ? nil : @param_types.resolve(type_parser, loader)
2272
+ block_t = @block_type.nil? ? nil : @block_type.resolve(type_parser, loader)
2273
+ return_t = @return_type.nil? ? nil : @return_type.resolve(type_parser, loader)
2274
+ @param_types.equal?(params_t) && @block_type.equal?(block_t) && @return_type.equal?(return_t) ? self : self.class.new(params_t, block_t, return_t)
2275
+ end
2276
+
2277
+ DEFAULT = PCallableType.new(nil, nil, nil)
2278
+
2279
+ protected
2280
+
2281
+ # @api private
2282
+ def _assignable?(o, guard)
2283
+ return false unless o.is_a?(PCallableType)
2284
+ return false unless @return_type.nil? || @return_type.assignable?(o.return_type || PAnyType::DEFAULT, guard)
2285
+
2286
+ # nil param_types and compatible return type means other Callable is assignable
2287
+ return true if @param_types.nil?
2288
+
2289
+ # NOTE: these tests are made in reverse as it is calling the callable that is constrained
2290
+ # (it's lower bound), not its upper bound
2291
+ other_param_types = o.param_types
2292
+
2293
+ return false if other_param_types.nil? || !other_param_types.assignable?(@param_types, guard)
2294
+ # names are ignored, they are just information
2295
+ # Blocks must be compatible
2296
+ this_block_t = @block_type || PUndefType::DEFAULT
2297
+ that_block_t = o.block_type || PUndefType::DEFAULT
2298
+ that_block_t.assignable?(this_block_t, guard)
2299
+ end
2300
+ end
2301
+
2302
+ # @api public
2303
+ #
2304
+ class PArrayType < PCollectionType
2305
+
2306
+ def self.register_ptype(loader, ir)
2307
+ create_ptype(loader, ir, 'CollectionType',
2308
+ 'element_type' => {
2309
+ KEY_TYPE => POptionalType.new(PType::DEFAULT),
2310
+ KEY_VALUE => nil
2311
+ }
2312
+ )
2313
+ end
2314
+
2315
+ attr_reader :element_type
2316
+
2317
+ def initialize(element_type, size_type = nil)
2318
+ super(size_type)
2319
+ if !size_type.nil? && size_type.from == 0 && size_type.to == 0
2320
+ @element_type = PUnitType::DEFAULT
2321
+ else
2322
+ @element_type = element_type
2323
+ end
2324
+ end
2325
+
2326
+ def accept(visitor, guard)
2327
+ super
2328
+ @element_type.accept(visitor, guard) unless @element_type.nil?
2329
+ end
2330
+
2331
+ # @api private
2332
+ def callable_args?(callable, guard = nil)
2333
+ param_t = callable.param_types
2334
+ block_t = callable.block_type
2335
+ # does not support calling with a block, but have to check that callable is ok with missing block
2336
+ (param_t.nil? || param_t.assignable?(self, guard)) && (block_t.nil? || block_t.assignable?(PUndefType::DEFAULT, guard))
2337
+ end
2338
+
2339
+ def generalize
2340
+ if self == DATA
2341
+ self
2342
+ elsif @element_type.nil?
2343
+ DEFAULT
2344
+ else
2345
+ ge_type = @element_type.generalize
2346
+ @size_type.nil? && @element_type.equal?(ge_type) ? self : self.class.new(ge_type, nil)
2347
+ end
2348
+ end
2349
+
2350
+ def eql?(o)
2351
+ super && @element_type == o.element_type
2352
+ end
2353
+
2354
+ def hash
2355
+ super ^ @element_type.hash
2356
+ end
2357
+
2358
+ def normalize(guard = nil)
2359
+ if self == DATA
2360
+ self
2361
+ elsif @element_type.nil?
2362
+ DEFAULT
2363
+ else
2364
+ ne_type = @element_type.normalize(guard)
2365
+ @element_type.equal?(ne_type) ? self : self.class.new(ne_type, @size_type)
2366
+ end
2367
+ end
2368
+
2369
+ def resolve(type_parser, loader)
2370
+ relement_type = @element_type
2371
+ relement_type = relement_type.resolve(type_parser, loader) unless relement_type.nil?
2372
+ relement_type.equal?(@element_type) ? self : self.class.new(relement_type, @size_type)
2373
+ end
2374
+
2375
+ def instance?(o, guard = nil)
2376
+ return false unless o.is_a?(Array)
2377
+ element_t = element_type
2378
+ return false unless element_t.nil? || o.all? {|element| element_t.instance?(element, guard) }
2379
+ size_t = size_type
2380
+ size_t.nil? || size_t.instance?(o.size, guard)
2381
+ end
2382
+
2383
+ def iterable_type(guard = nil)
2384
+ @element_type.nil? ? PIterableType::DEFAULT : PIterableType.new(@element_type)
2385
+ end
2386
+
2387
+ # Returns a new function that produces an Array
2388
+ #
2389
+ def self.new_function(_, loader)
2390
+ @new_function ||= Puppet::Functions.create_loaded_function(:new_array, loader) do
2391
+
2392
+ dispatch :from_args do
2393
+ param 'Any', :from
2394
+ optional_param 'Boolean', :wrap
2395
+ end
2396
+
2397
+ def from_args(from, wrap = false)
2398
+ case from
2399
+ when NilClass
2400
+ if wrap
2401
+ [nil]
2402
+ else
2403
+ throw :undefined_value
2404
+ end
2405
+ when Array
2406
+ from
2407
+ when Hash
2408
+ wrap ? [from] : from.to_a
2409
+
2410
+ when PBinaryType::Binary
2411
+ # For older rubies, the #bytes method returns an Enumerator that must be rolled out
2412
+ wrap ? [from] : from.binary_buffer.bytes.to_a
2413
+
2414
+ else
2415
+ if wrap
2416
+ [from]
2417
+ else
2418
+ if PIterableType::DEFAULT.instance?(from)
2419
+ Iterable.on(from).to_a
2420
+ else
2421
+ t = Puppet::Pops::Types::TypeCalculator.singleton.infer(from).generalize
2422
+ raise TypeConversionError.new("Value of type '#{t}' cannot be converted to Array")
2423
+ end
2424
+ end
2425
+ end
2426
+ end
2427
+ end
2428
+ end
2429
+
2430
+ DATA = PArrayType.new(PDataType::DEFAULT, DEFAULT_SIZE)
2431
+ DEFAULT = PArrayType.new(nil)
2432
+ EMPTY = PArrayType.new(PUnitType::DEFAULT, ZERO_SIZE)
2433
+
2434
+ protected
2435
+
2436
+ # Array is assignable if o is an Array and o's element type is assignable, or if o is a Tuple
2437
+ # @api private
2438
+ def _assignable?(o, guard)
2439
+ s_entry = element_type
2440
+ if o.is_a?(PTupleType)
2441
+ # If s_entry is nil, this Array type has no opinion on element types. Therefore any
2442
+ # tuple can be assigned.
2443
+ return true if s_entry.nil?
2444
+
2445
+ o_types = o.types
2446
+ size_s = size_type || DEFAULT_SIZE
2447
+ size_o = o.size_type
2448
+ if size_o.nil?
2449
+ type_count = o_types.size
2450
+ size_o = PIntegerType.new(type_count, type_count)
2451
+ end
2452
+ size_s.assignable?(size_o) && o_types.all? { |ot| s_entry.assignable?(ot, guard) }
2453
+ elsif o.is_a?(PArrayType)
2454
+ super && (s_entry.nil? || s_entry.assignable?(o.element_type, guard))
2455
+ else
2456
+ false
2457
+ end
2458
+ end
2459
+ end
2460
+
2461
+ # @api public
2462
+ #
2463
+ class PHashType < PCollectionType
2464
+
2465
+ def self.register_ptype(loader, ir)
2466
+ create_ptype(loader, ir, 'CollectionType',
2467
+ 'key_type' => {
2468
+ KEY_TYPE => POptionalType.new(PType::DEFAULT),
2469
+ KEY_VALUE => nil
2470
+ },
2471
+ 'value_type' => {
2472
+ KEY_TYPE => POptionalType.new(PType::DEFAULT),
2473
+ KEY_VALUE => nil,
2474
+ }
2475
+ )
2476
+ end
2477
+
2478
+ attr_accessor :key_type, :value_type
2479
+
2480
+ def initialize(key_type, value_type, size_type = nil)
2481
+ super(size_type)
2482
+ if !size_type.nil? && size_type.from == 0 && size_type.to == 0
2483
+ @key_type = PUnitType::DEFAULT
2484
+ @value_type = PUnitType::DEFAULT
2485
+ else
2486
+ @key_type = key_type
2487
+ @value_type = value_type
2488
+ end
2489
+ end
2490
+
2491
+ def accept(visitor, guard)
2492
+ super
2493
+ @key_type.accept(visitor, guard) unless @key_type.nil?
2494
+ @value_type.accept(visitor, guard) unless @value_type.nil?
2495
+ end
2496
+
2497
+ def element_type
2498
+ if Puppet[:strict] != :off
2499
+ Puppet.warn_once(:deprecation, 'Puppet::Pops::Types::PHashType#element_type',
2500
+ 'Puppet::Pops::Types::PHashType#element_type is deprecated, use #value_type instead')
2501
+ end
2502
+ @value_type
2503
+ end
2504
+
2505
+ def generalize
2506
+ if self == DEFAULT || self == DATA || self == EMPTY
2507
+ self
2508
+ else
2509
+ key_t = @key_type
2510
+ key_t = key_t.generalize unless key_t.nil?
2511
+ value_t = @value_type
2512
+ value_t = value_t.generalize unless value_t.nil?
2513
+ @size_type.nil? && @key_type.equal?(key_t) && @value_type.equal?(value_t) ? self : PHashType.new(key_t, value_t, nil)
2514
+ end
2515
+ end
2516
+
2517
+ def normalize(guard = nil)
2518
+ if self == DEFAULT || self == DATA || self == EMPTY
2519
+ self
2520
+ else
2521
+ key_t = @key_type
2522
+ key_t = key_t.normalize(guard) unless key_t.nil?
2523
+ value_t = @value_type
2524
+ value_t = value_t.normalize(guard) unless value_t.nil?
2525
+ @size_type.nil? && @key_type.equal?(key_t) && @value_type.equal?(value_t) ? self : PHashType.new(key_t, value_t, @size_type)
2526
+ end
2527
+ end
11
2528
 
12
- # TODO: See PUP-2978 for possible performance optimization
2529
+ def hash
2530
+ super ^ @key_type.hash ^ @value_type.hash
2531
+ end
13
2532
 
14
- # Mix in implementation part of the Bindings Module
15
- module Types
16
- class TypeModelObject < RGen::MetamodelBuilder::MMBase
17
- include Puppet::Pops::Visitable
18
- include Puppet::Pops::Adaptable
19
- include Puppet::Pops::Containment
2533
+ def instance?(o, guard = nil)
2534
+ return false unless o.is_a?(Hash)
2535
+ key_t = key_type
2536
+ value_t = value_type
2537
+ if (key_t.nil? || o.keys.all? {|key| key_t.instance?(key, guard) }) &&
2538
+ (value_t.nil? || o.values.all? {|value| value_t.instance?(value, guard) })
2539
+ size_t = size_type
2540
+ size_t.nil? || size_t.instance?(o.size, guard)
2541
+ else
2542
+ false
20
2543
  end
2544
+ end
21
2545
 
22
- class PAnyType < TypeModelObject
23
- module ClassModule
24
- # Produce a deep copy of the type
25
- def copy
26
- Marshal.load(Marshal.dump(self))
27
- end
2546
+ def iterable?(guard = nil)
2547
+ true
2548
+ end
28
2549
 
29
- def hash
30
- self.class.hash
31
- end
2550
+ def iterable_type(guard = nil)
2551
+ if self == DEFAULT || self == EMPTY
2552
+ PIterableType.new(DEFAULT_KEY_PAIR_TUPLE)
2553
+ else
2554
+ PIterableType.new(PTupleType.new([@key_type, @value_type], KEY_PAIR_TUPLE_SIZE))
2555
+ end
2556
+ end
32
2557
 
33
- def ==(o)
34
- self.class == o.class
35
- end
2558
+ def eql?(o)
2559
+ super && @key_type == o.key_type && @value_type == o.value_type
2560
+ end
36
2561
 
37
- alias eql? ==
2562
+ def is_the_empty_hash?
2563
+ self == EMPTY
2564
+ end
38
2565
 
39
- def to_s
40
- Puppet::Pops::Types::TypeCalculator.string(self)
41
- end
2566
+ def resolve(type_parser, loader)
2567
+ rkey_type = @key_type
2568
+ rkey_type = rkey_type.resolve(type_parser, loader) unless rkey_type.nil?
2569
+ rvalue_type = @value_type
2570
+ rvalue_type = rvalue_type.resolve(type_parser, loader) unless rvalue_type.nil?
2571
+ rkey_type.equal?(@key_type) && rvalue_type.equal?(@value_type) ? self : self.class.new(rkey_type, rvalue_type, @size_type)
2572
+ end
2573
+
2574
+ # Returns a new function that produces a Hash
2575
+ #
2576
+ def self.new_function(_, loader)
2577
+ @new_function ||= Puppet::Functions.create_loaded_function(:new_hash, loader) do
2578
+ local_types do
2579
+ type 'KeyValueArray = Array[Tuple[Any,Any],1]'
42
2580
  end
43
- end
44
2581
 
45
- class PNotUndefType < PAnyType
46
- module ClassModule
47
- def hash
48
- [self.class, type].hash
49
- end
2582
+ dispatch :from_tuples do
2583
+ param 'KeyValueArray', :from
2584
+ end
50
2585
 
51
- def ==(o)
52
- self.class == o.class && type == o.type
53
- end
2586
+ dispatch :from_array do
2587
+ param 'Any', :from
54
2588
  end
55
- end
56
2589
 
57
- class PType < PAnyType
58
- module ClassModule
59
- def hash
60
- [self.class, type].hash
61
- end
2590
+ def from_tuples(tuple_array)
2591
+ Hash[tuple_array]
2592
+ end
62
2593
 
63
- def ==(o)
64
- self.class == o.class && type == o.type
2594
+ def from_array(from)
2595
+ case from
2596
+ when NilClass
2597
+ throw :undefined_value
2598
+ when Array
2599
+ if from.size == 0
2600
+ {}
2601
+ else
2602
+ unless from.size % 2 == 0
2603
+ raise TypeConversionError.new("odd number of arguments for Hash")
2604
+ end
2605
+ Hash[*from]
2606
+ end
2607
+ when Hash
2608
+ from
2609
+ else
2610
+ if PIterableType::DEFAULT.instance?(from)
2611
+ Hash[*Iterable.on(from).to_a]
2612
+ else
2613
+ t = Puppet::Pops::Types::TypeCalculator.singleton.infer(from).generalize
2614
+ raise TypeConversionError.new("Value of type '#{t}' cannot be converted to Hash")
2615
+ end
65
2616
  end
66
2617
  end
67
2618
  end
2619
+ end
68
2620
 
69
- class PDataType < PAnyType
70
- module ClassModule
71
- def ==(o)
72
- self.class == o.class ||
73
- o.class == PVariantType && o == Puppet::Pops::Types::TypeCalculator.data_variant()
74
- end
75
- end
2621
+ DEFAULT = PHashType.new(nil, nil)
2622
+ KEY_PAIR_TUPLE_SIZE = PIntegerType.new(2,2)
2623
+ DEFAULT_KEY_PAIR_TUPLE = PTupleType.new([PUnitType::DEFAULT, PUnitType::DEFAULT], KEY_PAIR_TUPLE_SIZE)
2624
+ DATA = PHashType.new(PScalarType::DEFAULT, PDataType::DEFAULT, DEFAULT_SIZE)
2625
+ EMPTY = PHashType.new(PUnitType::DEFAULT, PUnitType::DEFAULT, PIntegerType.new(0, 0))
2626
+
2627
+ protected
2628
+
2629
+ # Hash is assignable if o is a Hash and o's key and element types are assignable
2630
+ # @api private
2631
+ def _assignable?(o, guard)
2632
+ case o
2633
+ when PHashType
2634
+ size_s = size_type
2635
+ return true if (size_s.nil? || size_s.from == 0) && o.is_the_empty_hash?
2636
+ return false unless (key_type.nil? || key_type.assignable?(o.key_type, guard)) && (value_type.nil? || value_type.assignable?(o.value_type, guard))
2637
+ super
2638
+ when PStructType
2639
+ # hash must accept String as key type
2640
+ # hash must accept all value types
2641
+ # hash must accept the size of the struct
2642
+ o_elements = o.elements
2643
+ (size_type || DEFAULT_SIZE).instance?(o_elements.size, guard) &&
2644
+ o_elements.all? {|e| (key_type.nil? || key_type.instance?(e.name, guard)) && (value_type.nil? || value_type.assignable?(e.value_type, guard)) }
2645
+ else
2646
+ false
76
2647
  end
2648
+ end
2649
+ end
77
2650
 
78
- class PVariantType < PAnyType
79
- module ClassModule
2651
+ # A flexible type describing an any? of other types
2652
+ # @api public
2653
+ #
2654
+ class PVariantType < PAnyType
2655
+ include Enumerable
80
2656
 
81
- def hash
82
- [self.class, Set.new(self.types)].hash
83
- end
2657
+ def self.register_ptype(loader, ir)
2658
+ create_ptype(loader, ir, 'AnyType', 'types' => PArrayType.new(PType::DEFAULT))
2659
+ end
84
2660
 
85
- def ==(o)
86
- (self.class == o.class && Set.new(types) == Set.new(o.types)) ||
87
- (o.class == PDataType && self == Puppet::Pops::Types::TypeCalculator.data_variant())
88
- end
89
- end
2661
+ attr_reader :types
2662
+
2663
+ # Checks if the number of unique types in the given array is greater than one, and if so
2664
+ # creates a Variant with those types and returns it. If only one unique type is found,
2665
+ # that type is instead returned.
2666
+ #
2667
+ # @param types [Array<PAnyType>] the variants
2668
+ # @return [PAnyType] the resulting type
2669
+ # @api public
2670
+ def self.maybe_create(types)
2671
+ types = flatten_variants(types).uniq
2672
+ types.size == 1 ? types[0] : new(types)
2673
+ end
2674
+
2675
+ # @param types [Array[PAnyType]] the variants
2676
+ def initialize(types)
2677
+ @types = types.freeze
2678
+ end
2679
+
2680
+ def accept(visitor, guard)
2681
+ super
2682
+ @types.each { |t| t.accept(visitor, guard) }
2683
+ end
2684
+
2685
+ def each
2686
+ if block_given?
2687
+ types.each { |t| yield t }
2688
+ else
2689
+ types.to_enum
90
2690
  end
2691
+ end
91
2692
 
92
- class PEnumType < PScalarType
93
- module ClassModule
94
- def hash
95
- [self.class, Set.new(self.values)].hash
96
- end
2693
+ def generalize
2694
+ if self == DEFAULT || self == DATA
2695
+ self
2696
+ else
2697
+ alter_type_array(@types, :generalize) { |altered| PVariantType.maybe_create(altered) }
2698
+ end
2699
+ end
2700
+
2701
+ def normalize(guard = nil)
2702
+ if self == DEFAULT || self == DATA || @types.empty?
2703
+ self
2704
+ else
2705
+ # Normalize all contained types
2706
+ modified = false
2707
+ types = alter_type_array(@types, :normalize, guard)
2708
+ if types == self
2709
+ types = @types
2710
+ else
2711
+ modified = true
2712
+ end
97
2713
 
98
- def ==(o)
99
- self.class == o.class && Set.new(values) == Set.new(o.values)
2714
+ if types.size == 1
2715
+ types[0]
2716
+ elsif types.any? { |t| t.is_a?(PUndefType) || t.is_a?(POptionalType) }
2717
+ # Undef entry present. Use an OptionalType with a normalized Variant without Undefs and Optional wrappers
2718
+ POptionalType.new(PVariantType.maybe_create(types.reject { |t| t.is_a?(PUndefType) }.map { |t| t.is_a?(POptionalType) ? t.type : t })).normalize
2719
+ else
2720
+ # Merge all variants into this one
2721
+ types = PVariantType.flatten_variants(types)
2722
+ size_before_merge = types.size
2723
+
2724
+ types = swap_not_undefs(types)
2725
+ types = merge_enums(types)
2726
+ types = merge_patterns(types)
2727
+ types = merge_version_ranges(types)
2728
+ types = merge_numbers(PIntegerType, types)
2729
+ types = merge_numbers(PFloatType, types)
2730
+ types = merge_numbers(PTimespanType, types)
2731
+ types = merge_numbers(PTimestampType, types)
2732
+
2733
+ if types.size == 1
2734
+ types[0]
2735
+ else
2736
+ modified || types.size != size_before_merge ? PVariantType.maybe_create(types) : self
100
2737
  end
101
2738
  end
102
2739
  end
2740
+ end
103
2741
 
104
- class PIntegerType < PNumericType
105
- module ClassModule
106
- # The integer type is enumerable when it defines a range
107
- include Enumerable
2742
+ def self.flatten_variants(types)
2743
+ modified = false
2744
+ types = types.map do |t|
2745
+ if t.is_a?(PVariantType)
2746
+ modified = true
2747
+ t.types
2748
+ else
2749
+ t
2750
+ end
2751
+ end
2752
+ types.flatten! if modified
2753
+ types
2754
+ end
108
2755
 
109
- # Returns Float.Infinity if one end of the range is unbound
110
- def size
111
- return Float::INFINITY if from.nil? || to.nil?
112
- 1+(to-from).abs
113
- end
2756
+ def hash
2757
+ @types.hash
2758
+ end
114
2759
 
115
- # Returns the range as an array ordered so the smaller number is always first.
116
- # The number may be Infinity or -Infinity.
117
- def range
118
- f = from || -Float::INFINITY
119
- t = to || Float::INFINITY
120
- if f < t
121
- [f, t]
122
- else
123
- [t,f]
124
- end
125
- end
2760
+ def instance?(o, guard = nil)
2761
+ # instance of variant if o is instance? of any of variant's types
2762
+ @types.any? { |type| type.instance?(o, guard) }
2763
+ end
126
2764
 
127
- # Returns Enumerator if no block is given
128
- # Returns self if size is infinity (does not yield)
129
- def each
130
- return self.to_enum unless block_given?
131
- return nil if from.nil? || to.nil?
132
- if to < from
133
- from.downto(to) {|x| yield x }
134
- else
135
- from.upto(to) {|x| yield x }
136
- end
137
- end
2765
+ def really_instance?(o, guard = nil)
2766
+ @types.reduce(-1) do |memo, type|
2767
+ ri = type.really_instance?(o, guard)
2768
+ ri > memo ? ri : memo
2769
+ end
2770
+ end
138
2771
 
139
- def hash
140
- [self.class, from, to].hash
141
- end
2772
+ def kind_of_callable?(optional = true, guard = nil)
2773
+ @types.all? { |type| type.kind_of_callable?(optional, guard) }
2774
+ end
142
2775
 
143
- def ==(o)
144
- self.class == o.class && from == o.from && to == o.to
145
- end
146
- end
147
- end
2776
+ def resolved?
2777
+ @types.all? { |type| type.resolved? }
2778
+ end
148
2779
 
149
- class PFloatType < PNumericType
150
- module ClassModule
151
- def hash
152
- [self.class, from, to].hash
153
- end
2780
+ def eql?(o)
2781
+ o = DATA if o.is_a?(PDataType)
2782
+ self.class == o.class && @types.size == o.types.size && (@types - o.types).empty?
2783
+ end
154
2784
 
155
- def ==(o)
156
- self.class == o.class && from == o.from && to == o.to
2785
+ # Variant compatible with the Data type.
2786
+ DATA = PVariantType.new([PHashType::DATA, PArrayType::DATA, PScalarType::DEFAULT, PUndefType::DEFAULT, PTupleType::DATA])
2787
+
2788
+ DEFAULT = PVariantType.new(EMPTY_ARRAY)
2789
+
2790
+ protected
2791
+
2792
+ # @api private
2793
+ def _assignable?(o, guard)
2794
+ # Data is a specific variant
2795
+ o = DATA if o.is_a?(PDataType)
2796
+ if o.is_a?(PVariantType)
2797
+ # A variant is assignable if all of its options are assignable to one of this type's options
2798
+ return true if self == o
2799
+ o.types.all? do |other|
2800
+ # if the other is a Variant, all of its options, but be assignable to one of this type's options
2801
+ other = other.is_a?(PDataType) ? DATA : other
2802
+ if other.is_a?(PVariantType)
2803
+ assignable?(other, guard)
2804
+ else
2805
+ types.any? {|option_t| option_t.assignable?(other, guard) }
157
2806
  end
158
2807
  end
2808
+ else
2809
+ # A variant is assignable if o is assignable to any of its types
2810
+ types.any? { |option_t| option_t.assignable?(o, guard) }
159
2811
  end
2812
+ end
160
2813
 
161
- class PStringType < PScalarType
162
- module ClassModule
2814
+ # @api private
2815
+ def swap_not_undefs(array)
2816
+ if array.size > 1
2817
+ parts = array.partition {|t| t.is_a?(PNotUndefType) }
2818
+ not_undefs = parts[0]
2819
+ if not_undefs.size > 1
2820
+ others = parts[1]
2821
+ others << PNotUndefType.new(PVariantType.maybe_create(not_undefs.map { |not_undef| not_undef.type }).normalize)
2822
+ array = others
2823
+ end
2824
+ end
2825
+ array
2826
+ end
163
2827
 
164
- def hash
165
- [self.class, self.size_type, Set.new(self.values)].hash
166
- end
2828
+ # @api private
2829
+ def merge_enums(array)
2830
+ if array.size > 1
2831
+ parts = array.partition {|t| t.is_a?(PEnumType) && !t.values.empty? || t.is_a?(PStringType) && !t.value.nil? }
2832
+ enums = parts[0]
2833
+ if enums.size > 1
2834
+ others = parts[1]
2835
+ others << PEnumType.new(enums.map { |enum| enum.is_a?(PStringType) ? enum.value : enum.values }.flatten.uniq)
2836
+ array = others
2837
+ end
2838
+ end
2839
+ array
2840
+ end
167
2841
 
168
- def ==(o)
169
- self.class == o.class && self.size_type == o.size_type && Set.new(values) == Set.new(o.values)
170
- end
2842
+ # @api private
2843
+ def merge_patterns(array)
2844
+ if array.size > 1
2845
+ parts = array.partition {|t| t.is_a?(PPatternType) }
2846
+ patterns = parts[0]
2847
+ if patterns.size > 1
2848
+ others = parts[1]
2849
+ others << PPatternType.new(patterns.map { |pattern| pattern.patterns }.flatten.uniq)
2850
+ array = others
171
2851
  end
172
2852
  end
2853
+ array
2854
+ end
173
2855
 
174
- class PRegexpType < PScalarType
175
- module ClassModule
176
- def regexp_derived
177
- pattern_or_blank = pattern || ''
178
- @_regexp = Regexp.new(pattern_or_blank) unless @_regexp && @_regexp.source == pattern_or_blank
179
- @_regexp
180
- end
2856
+ # @api private
2857
+ def merge_numbers(clazz, array)
2858
+ if array.size > 1
2859
+ parts = array.partition {|t| t.is_a?(clazz) }
2860
+ ranges = parts[0]
2861
+ array = merge_ranges(ranges) + parts[1] if ranges.size > 1
2862
+ end
2863
+ array
2864
+ end
181
2865
 
182
- def hash
183
- [self.class, pattern].hash
184
- end
2866
+ def merge_version_ranges(array)
2867
+ if array.size > 1
2868
+ parts = array.partition {|t| t.is_a?(PSemVerType) }
2869
+ ranges = parts[0]
2870
+ array = [PSemVerType.new(ranges.map(&:ranges).flatten)] + parts[1] if ranges.size > 1
2871
+ end
2872
+ array
2873
+ end
185
2874
 
186
- def ==(o)
187
- self.class == o.class && pattern == o.pattern
2875
+ # @api private
2876
+ def merge_ranges(ranges)
2877
+ result = []
2878
+ until ranges.empty?
2879
+ unmerged = []
2880
+ x = ranges.pop
2881
+ result << ranges.inject(x) do |memo, y|
2882
+ merged = memo.merge(y)
2883
+ if merged.nil?
2884
+ unmerged << y
2885
+ else
2886
+ memo = merged
188
2887
  end
2888
+ memo
189
2889
  end
2890
+ ranges = unmerged
190
2891
  end
2892
+ result
2893
+ end
2894
+ end
191
2895
 
192
- class PPatternType < PScalarType
193
- module ClassModule
2896
+ # Abstract representation of a type that can be placed in a Catalog.
2897
+ # @api public
2898
+ #
2899
+ class PCatalogEntryType < PAnyType
2900
+ def self.register_ptype(loader, ir)
2901
+ create_ptype(loader, ir, 'AnyType')
2902
+ end
194
2903
 
195
- def hash
196
- [self.class, Set.new(patterns)].hash
197
- end
2904
+ DEFAULT = PCatalogEntryType.new
198
2905
 
199
- def ==(o)
200
- self.class == o.class && Set.new(patterns) == Set.new(o.patterns)
201
- end
202
- end
203
- end
2906
+ def instance?(o, guard = nil)
2907
+ assignable?(TypeCalculator.infer(o), guard)
2908
+ end
204
2909
 
205
- class PCollectionType < PAnyType
206
- module ClassModule
207
- # Returns an array with from (min) size to (max) size
208
- def size_range
209
- return [0, Float::INFINITY] if size_type.nil?
210
- f = size_type.from || 0
211
- t = size_type.to || Float::INFINITY
212
- if f < t
213
- [f, t]
214
- else
215
- [t,f]
216
- end
217
- end
2910
+ protected
2911
+ # @api private
2912
+ def _assignable?(o, guard)
2913
+ o.is_a?(PCatalogEntryType)
2914
+ end
2915
+ end
218
2916
 
219
- def hash
220
- [self.class, element_type, size_type].hash
221
- end
2917
+ # Represents a (host-) class in the Puppet Language.
2918
+ # @api public
2919
+ #
2920
+ class PHostClassType < PCatalogEntryType
2921
+ attr_reader :class_name
2922
+
2923
+ def self.register_ptype(loader, ir)
2924
+ create_ptype(loader, ir, 'CatalogEntryType',
2925
+ 'class_name' => {
2926
+ KEY_TYPE => POptionalType.new(PStringType::NON_EMPTY),
2927
+ KEY_VALUE => nil
2928
+ }
2929
+ )
2930
+ end
222
2931
 
223
- def ==(o)
224
- self.class == o.class && element_type == o.element_type && size_type == o.size_type
225
- end
2932
+ NAME = 'Class'.freeze
2933
+
2934
+ def initialize(class_name)
2935
+ @class_name = class_name
2936
+ end
2937
+
2938
+ def hash
2939
+ 11 ^ @class_name.hash
2940
+ end
2941
+ def eql?(o)
2942
+ self.class == o.class && @class_name == o.class_name
2943
+ end
2944
+
2945
+ def self.simple_name
2946
+ NAME
2947
+ end
2948
+
2949
+ DEFAULT = PHostClassType.new(nil)
2950
+
2951
+ protected
2952
+
2953
+ # @api private
2954
+ def _assignable?(o, guard)
2955
+ return false unless o.is_a?(PHostClassType)
2956
+ # Class = Class[name}, Class[name] != Class
2957
+ return true if @class_name.nil?
2958
+ # Class[name] = Class[name]
2959
+ @class_name == o.class_name
2960
+ end
2961
+ end
2962
+
2963
+ # Represents a Resource Type in the Puppet Language
2964
+ # @api public
2965
+ #
2966
+ class PResourceType < PCatalogEntryType
2967
+
2968
+ def self.register_ptype(loader, ir)
2969
+ create_ptype(loader, ir, 'CatalogEntryType',
2970
+ 'type_name' => {
2971
+ KEY_TYPE => POptionalType.new(PStringType::NON_EMPTY),
2972
+ KEY_VALUE => nil
2973
+ },
2974
+ 'title' => {
2975
+ KEY_TYPE => POptionalType.new(PStringType::NON_EMPTY),
2976
+ KEY_VALUE => nil
2977
+ }
2978
+ )
2979
+ end
2980
+
2981
+ attr_reader :type_name, :title, :downcased_name
2982
+
2983
+ def initialize(type_name, title = nil)
2984
+ @type_name = type_name.freeze
2985
+ @title = title.freeze
2986
+ @downcased_name = type_name.nil? ? nil : @type_name.downcase.freeze
2987
+ end
2988
+
2989
+ def eql?(o)
2990
+ self.class == o.class && @downcased_name == o.downcased_name && @title == o.title
2991
+ end
2992
+
2993
+ def hash
2994
+ @downcased_name.hash ^ @title.hash
2995
+ end
2996
+
2997
+ DEFAULT = PResourceType.new(nil)
2998
+
2999
+ protected
3000
+
3001
+ # @api private
3002
+ def _assignable?(o, guard)
3003
+ o.is_a?(PResourceType) && (@downcased_name.nil? || @downcased_name == o.downcased_name && (@title.nil? || @title == o.title))
3004
+ end
3005
+ end
3006
+
3007
+ # Represents a type that accept PUndefType instead of the type parameter
3008
+ # required_type - is a short hand for Variant[T, Undef]
3009
+ # @api public
3010
+ #
3011
+ class POptionalType < PTypeWithContainedType
3012
+
3013
+ def self.register_ptype(loader, ir)
3014
+ create_ptype(loader, ir, 'AnyType',
3015
+ 'type' => {
3016
+ KEY_TYPE => POptionalType.new(PType::DEFAULT),
3017
+ KEY_VALUE => nil
3018
+ }
3019
+ )
3020
+ end
3021
+
3022
+ def optional_type
3023
+ @type
3024
+ end
3025
+
3026
+ def kind_of_callable?(optional=true, guard = nil)
3027
+ optional && !@type.nil? && @type.kind_of_callable?(optional, guard)
3028
+ end
3029
+
3030
+ def instance?(o, guard = nil)
3031
+ PUndefType::DEFAULT.instance?(o, guard) || (!@type.nil? && @type.instance?(o, guard))
3032
+ end
3033
+
3034
+ def normalize(guard = nil)
3035
+ n = super
3036
+ if n.type.nil?
3037
+ n
3038
+ else
3039
+ if n.type.is_a?(PNotUndefType)
3040
+ # No point in having an NotUndef in an Optional
3041
+ POptionalType.new(n.type.type).normalize
3042
+ elsif n.type.assignable?(PUndefType::DEFAULT)
3043
+ # THe type is Optional anyway, so it can be stripped of
3044
+ n.type
3045
+ else
3046
+ n
226
3047
  end
227
3048
  end
3049
+ end
228
3050
 
229
- class PStructElement < TypeModelObject
230
- module ClassModule
231
- def hash
232
- [self.class, value_type, key_type].hash
233
- end
3051
+ def new_function(loader)
3052
+ optional_type.new_function(loader)
3053
+ end
234
3054
 
235
- def name
236
- k = key_type
237
- k = k.optional_type if k.is_a?(POptionalType)
238
- k.values[0]
239
- end
3055
+ DEFAULT = POptionalType.new(nil)
240
3056
 
241
- def ==(o)
242
- self.class == o.class && value_type == o.value_type && key_type == o.key_type
243
- end
244
- end
3057
+ protected
3058
+
3059
+ # @api private
3060
+ def _assignable?(o, guard)
3061
+ return true if o.is_a?(PUndefType)
3062
+ return true if @type.nil?
3063
+ if o.is_a?(POptionalType)
3064
+ @type.assignable?(o.optional_type, guard)
3065
+ else
3066
+ @type.assignable?(o, guard)
245
3067
  end
3068
+ end
3069
+ end
246
3070
 
3071
+ class PTypeReferenceType < PAnyType
247
3072
 
248
- class PStructType < PAnyType
249
- module ClassModule
250
- def hashed_elements_derived
251
- @_hashed ||= elements.reduce({}) {|memo, e| memo[e.name] = e; memo }
252
- @_hashed
253
- end
3073
+ def self.register_ptype(loader, ir)
3074
+ create_ptype(loader, ir, 'AnyType', 'type_string' => PStringType::NON_EMPTY)
3075
+ end
254
3076
 
255
- def clear_hashed_elements
256
- @_hashed = nil
257
- end
3077
+ attr_reader :type_string
258
3078
 
259
- def hash
260
- [self.class, Set.new(elements)].hash
261
- end
3079
+ def initialize(type_string)
3080
+ @type_string = type_string
3081
+ end
262
3082
 
263
- def ==(o)
264
- self.class == o.class && hashed_elements == o.hashed_elements
265
- end
266
- end
267
- end
3083
+ def callable?(args)
3084
+ false
3085
+ end
268
3086
 
269
- class PTupleType < PAnyType
270
- module ClassModule
271
- # Returns the number of elements accepted [min, max] in the tuple
272
- def size_range
273
- types_size = types.size
274
- size_type.nil? ? [types_size, types_size] : size_type.range
275
- end
3087
+ def instance?(o, guard = nil)
3088
+ false
3089
+ end
276
3090
 
277
- # Returns the number of accepted occurrences [min, max] of the last type in the tuple
278
- # The defaults is [1,1]
279
- #
280
- def repeat_last_range
281
- types_size = types.size
282
- if size_type.nil?
283
- return [1, 1]
284
- end
285
- from, to = size_type.range()
286
- min = from - (types_size-1)
287
- min = min <= 0 ? 0 : min
288
- max = to - (types_size-1)
289
- [min, max]
290
- end
3091
+ def hash
3092
+ @type_string.hash
3093
+ end
291
3094
 
292
- def hash
293
- [self.class, size_type, Set.new(types)].hash
294
- end
3095
+ def eql?(o)
3096
+ super && o.type_string == @type_string
3097
+ end
295
3098
 
296
- def ==(o)
297
- self.class == o.class && types == o.types && size_type == o.size_type
298
- end
299
- end
3099
+ def resolve(type_parser, loader)
3100
+ type_parser.parse(@type_string, loader)
3101
+ end
3102
+
3103
+ protected
3104
+
3105
+ def _assignable?(o, guard)
3106
+ # A type must be assignable to itself or a lot of unit tests will break
3107
+ o == self
3108
+ end
3109
+
3110
+ DEFAULT = PTypeReferenceType.new('UnresolvedReference')
3111
+ end
3112
+
3113
+ # Describes a named alias for another Type.
3114
+ # The alias is created with a name and an unresolved type expression. The type expression may
3115
+ # in turn contain other aliases (including the alias that contains it) which means that an alias
3116
+ # might contain self recursion. Whether or not that is the case is computed and remembered when the alias
3117
+ # is resolved since guarding against self recursive constructs is relatively expensive.
3118
+ #
3119
+ # @api public
3120
+ class PTypeAliasType < PAnyType
3121
+
3122
+ def self.register_ptype(loader, ir)
3123
+ create_ptype(loader, ir, 'AnyType',
3124
+ 'name' => PStringType::NON_EMPTY,
3125
+ 'type_expr' => PAnyType::DEFAULT,
3126
+ 'resolved_type' => {
3127
+ KEY_TYPE => POptionalType.new(PType::DEFAULT),
3128
+ KEY_VALUE => nil
3129
+ }
3130
+ )
3131
+ end
3132
+
3133
+ attr_reader :name
3134
+
3135
+ # @param name [String] The name of the type
3136
+ # @param type_expr [Model::PopsObject] The expression that describes the aliased type
3137
+ # @param resolved_type [PAnyType] the resolve type (only used for the DEFAULT initialization)
3138
+ def initialize(name, type_expr, resolved_type = nil)
3139
+ @name = name
3140
+ @type_expr = type_expr
3141
+ @resolved_type = resolved_type
3142
+ @self_recursion = false
3143
+ end
3144
+
3145
+ def assignable?(o, guard = nil)
3146
+ if @self_recursion
3147
+ guard ||= RecursionGuard.new
3148
+ guard.with_this(self) { |state| state == RecursionGuard::SELF_RECURSION_IN_BOTH ? true : super(o, guard) }
3149
+ else
3150
+ super(o, guard)
300
3151
  end
3152
+ end
301
3153
 
302
- class PCallableType < PAnyType
303
- module ClassModule
304
- # Returns the number of accepted arguments [min, max]
305
- def size_range
306
- param_types.size_range
307
- end
3154
+ # Returns the resolved type. The type must have been resolved by a call prior to calls to this
3155
+ # method or an error will be raised.
3156
+ #
3157
+ # @return [PAnyType] The resolved type of this alias.
3158
+ # @raise [Puppet::Error] unless the type has been resolved prior to calling this method
3159
+ def resolved_type
3160
+ raise Puppet::Error, "Reference to unresolved type #{@name}" unless @resolved_type
3161
+ @resolved_type
3162
+ end
308
3163
 
309
- # Returns the number of accepted arguments for the last parameter type [min, max]
310
- #
311
- def last_range
312
- param_types.repeat_last_range
313
- end
3164
+ def callable_args?(callable, guard)
3165
+ guarded_recursion(guard, false) { |g| resolved_type.callable_args?(callable, g) }
3166
+ end
314
3167
 
315
- # Range [0,0], [0,1], or [1,1] for the block
316
- #
317
- def block_range
318
- case block_type
319
- when Puppet::Pops::Types::POptionalType
320
- [0,1]
321
- when Puppet::Pops::Types::PVariantType, Puppet::Pops::Types::PCallableType
322
- [1,1]
323
- else
324
- [0,0]
325
- end
326
- end
3168
+ def check_self_recursion(originator)
3169
+ resolved_type.check_self_recursion(originator) unless originator.equal?(self)
3170
+ end
327
3171
 
328
- def hash
329
- [self.class, Set.new(param_types), block_type].hash
330
- end
3172
+ def kind_of_callable?(optional=true, guard = nil)
3173
+ guarded_recursion(guard, false) { |g| resolved_type.kind_of_callable?(optional, g) }
3174
+ end
331
3175
 
332
- def ==(o)
333
- self.class == o.class && param_types == o.param_types && block_type == o.block_type
334
- end
3176
+ def instance?(o, guard = nil)
3177
+ really_instance?(o, guard) == 1
3178
+ end
3179
+
3180
+ def iterable?(guard = nil)
3181
+ guarded_recursion(guard, false) { |g| resolved_type.iterable?(g) }
3182
+ end
3183
+
3184
+ def iterable_type(guard = nil)
3185
+ guarded_recursion(guard, nil) { |g| resolved_type.iterable_type(g) }
3186
+ end
3187
+
3188
+ def hash
3189
+ @name.hash
3190
+ end
3191
+
3192
+ # Acceptor used when checking for self recursion and that a type contains
3193
+ # something other than aliases or type references
3194
+ #
3195
+ # @api private
3196
+ class AssertOtherTypeAcceptor
3197
+ def initialize
3198
+ @other_type_detected = false
3199
+ end
3200
+
3201
+ def visit(type, _)
3202
+ unless type.is_a?(PTypeAliasType) || type.is_a?(PVariantType)
3203
+ @other_type_detected = true
335
3204
  end
336
3205
  end
337
3206
 
338
- class PArrayType < PCollectionType
339
- module ClassModule
340
- def hash
341
- [self.class, self.element_type, self.size_type].hash
342
- end
3207
+ def other_type_detected?
3208
+ @other_type_detected
3209
+ end
3210
+ end
343
3211
 
344
- def ==(o)
345
- self.class == o.class && self.element_type == o.element_type && self.size_type == o.size_type
346
- end
347
- end
3212
+ # Acceptor used when re-checking for self recursion after a self recursion has been detected
3213
+ #
3214
+ # @api private
3215
+ class AssertSelfRecursionStatusAcceptor
3216
+ def visit(type, _)
3217
+ type.set_self_recursion_status if type.is_a?(PTypeAliasType)
348
3218
  end
3219
+ end
349
3220
 
350
- class PHashType < PCollectionType
351
- module ClassModule
352
- def hash
353
- [self.class, key_type, self.element_type, self.size_type].hash
354
- end
3221
+ def set_self_recursion_status
3222
+ return if @self_recursion || @resolved_type.is_a?(PTypeReferenceType)
3223
+ @self_recursion = true
3224
+ guard = RecursionGuard.new
3225
+ accept(NoopTypeAcceptor::INSTANCE, guard)
3226
+ @self_recursion = guard.recursive_this?(self)
3227
+ when_self_recursion_detected if @self_recursion # no difference
3228
+ end
355
3229
 
356
- def ==(o)
357
- self.class == o.class &&
358
- key_type == o.key_type &&
359
- self.element_type == o.element_type &&
360
- self.size_type == o.size_type
3230
+ # Called from the TypeParser once it has found a type using the Loader. The TypeParser will
3231
+ # interpret the contained expression and the resolved type is remembered. This method also
3232
+ # checks and remembers if the resolve type contains self recursion.
3233
+ #
3234
+ # @param type_parser [TypeParser] type parser that will interpret the type expression
3235
+ # @param loader [Loader::Loader] loader to use when loading type aliases
3236
+ # @return [PTypeAliasType] the receiver of the call, i.e. `self`
3237
+ # @api private
3238
+ def resolve(type_parser, loader)
3239
+ if @resolved_type.nil?
3240
+ # resolved to PTypeReferenceType::DEFAULT during resolve to avoid endless recursion
3241
+ @resolved_type = PTypeReferenceType::DEFAULT
3242
+ @self_recursion = true # assumed while it being found out below
3243
+ begin
3244
+ if @type_expr.is_a?(PTypeReferenceType)
3245
+ @resolved_type = @type_expr.resolve(type_parser, loader)
3246
+ else
3247
+ @resolved_type = type_parser.interpret(@type_expr, loader).normalize
361
3248
  end
362
3249
 
363
- def is_the_empty_hash?
364
- size_type.is_a?(PIntegerType) && size_type.from == 0 && size_type.to == 0 && key_type.is_a?(PUndefType) && element_type.is_a?(PUndefType)
3250
+ # Find out if this type is recursive. A recursive type has performance implications
3251
+ # on several methods and this knowledge is used to avoid that for non-recursive
3252
+ # types.
3253
+ guard = RecursionGuard.new
3254
+ real_type_asserter = AssertOtherTypeAcceptor.new
3255
+ accept(real_type_asserter, guard)
3256
+ unless real_type_asserter.other_type_detected?
3257
+ raise ArgumentError, "Type alias '#{name}' cannot be resolved to a real type"
3258
+ end
3259
+ @self_recursion = guard.recursive_this?(self)
3260
+ # All aliases involved must re-check status since this alias is now resolved
3261
+ if @self_recursion
3262
+ accept(AssertSelfRecursionStatusAcceptor.new, RecursionGuard.new)
3263
+ when_self_recursion_detected
365
3264
  end
3265
+ rescue
3266
+ @resolved_type = nil
3267
+ raise
366
3268
  end
3269
+ else
3270
+ # An alias may appoint an Object type that isn't resolved yet. The default type
3271
+ # reference is used to prevent endless recursion and should not be resolved here.
3272
+ @resolved_type.resolve(type_parser, loader) unless @resolved_type.equal?(PTypeReferenceType::DEFAULT)
367
3273
  end
3274
+ self
3275
+ end
368
3276
 
369
- class PRuntimeType < PAnyType
370
- module ClassModule
371
- def hash
372
- [self.class, runtime, runtime_type_name].hash
373
- end
3277
+ def eql?(o)
3278
+ super && o.name == @name
3279
+ end
374
3280
 
375
- def ==(o)
376
- self.class == o.class && runtime == o.runtime && runtime_type_name == o.runtime_type_name
377
- end
378
- end
3281
+ def accept(visitor, guard)
3282
+ guarded_recursion(guard, nil) do |g|
3283
+ super(visitor, g)
3284
+ @resolved_type.accept(visitor, g) unless @resolved_type.nil?
379
3285
  end
3286
+ end
380
3287
 
381
- class PHostClassType < PCatalogEntryType
382
- module ClassModule
383
- def hash
384
- [self.class, class_name].hash
385
- end
386
- def ==(o)
387
- self.class == o.class && class_name == o.class_name
388
- end
389
- end
390
- end
3288
+ def self_recursion?
3289
+ @self_recursion
3290
+ end
391
3291
 
392
- class PResourceType < PCatalogEntryType
393
- module ClassModule
394
- def hash
395
- [self.class, type_name, title].hash
396
- end
397
- def ==(o)
398
- self.class == o.class && type_name == o.type_name && title == o.title
399
- end
3292
+ # Returns the expanded string the form of the alias, e.g. <alias name> = <resolved type>
3293
+ #
3294
+ # @return [String] the expanded form of this alias
3295
+ # @api public
3296
+ def to_s
3297
+ TypeFormatter.singleton.alias_expanded_string(self)
3298
+ end
3299
+
3300
+ # Delegates to resolved type
3301
+ def respond_to_missing?(name, include_private)
3302
+ resolved_type.respond_to?(name, include_private)
3303
+ end
3304
+
3305
+ # Delegates to resolved type
3306
+ def method_missing(name, *arguments, &block)
3307
+ super if @resolved_type.equal?(PTypeReferenceType::DEFAULT)
3308
+ resolved_type.send(name, *arguments, &block)
3309
+ end
3310
+
3311
+ # @api private
3312
+ def really_instance?(o, guard = nil)
3313
+ if @self_recursion
3314
+ guard ||= RecursionGuard.new
3315
+ guard.with_that(o) do
3316
+ guard.with_this(self) { |state| state == RecursionGuard::SELF_RECURSION_IN_BOTH ? 0 : resolved_type.really_instance?(o, guard) }
400
3317
  end
3318
+ else
3319
+ resolved_type.really_instance?(o, guard)
401
3320
  end
3321
+ end
402
3322
 
403
- class POptionalType < PAnyType
404
- module ClassModule
405
- def hash
406
- [self.class, optional_type].hash
407
- end
3323
+ # @return `nil` to prevent serialization of the type_expr used when first initializing this instance
3324
+ # @api private
3325
+ def type_expr
3326
+ nil
3327
+ end
3328
+
3329
+ protected
3330
+
3331
+ def _assignable?(o, guard)
3332
+ resolved_type.assignable?(o, guard)
3333
+ end
3334
+
3335
+ def new_function(loader)
3336
+ resolved_type.new_function(loader)
3337
+ end
3338
+
3339
+ private
408
3340
 
409
- def ==(o)
410
- self.class == o.class && optional_type == o.optional_type
3341
+ def guarded_recursion(guard, dflt)
3342
+ if @self_recursion
3343
+ guard ||= RecursionGuard.new
3344
+ guard.with_this(self) { |state| (state & RecursionGuard::SELF_RECURSION_IN_THIS) == 0 ? yield(guard) : dflt }
3345
+ else
3346
+ yield(guard)
3347
+ end
3348
+ end
3349
+
3350
+ def when_self_recursion_detected
3351
+ if @resolved_type.is_a?(PVariantType)
3352
+ # Drop variants that are not real types
3353
+ resolved_types = @resolved_type.types
3354
+ real_types = resolved_types.select do |type|
3355
+ next false if type == self
3356
+ real_type_asserter = AssertOtherTypeAcceptor.new
3357
+ type.accept(real_type_asserter, RecursionGuard.new)
3358
+ real_type_asserter.other_type_detected?
3359
+ end
3360
+ if real_types.size != resolved_types.size
3361
+ if real_types.size == 1
3362
+ @resolved_type = real_types[0]
3363
+ else
3364
+ @resolved_type = PVariantType.maybe_create(real_types)
411
3365
  end
3366
+ # Drop self recursion status in case it's not self recursive anymore
3367
+ guard = RecursionGuard.new
3368
+ accept(NoopTypeAcceptor::INSTANCE, guard)
3369
+ @self_recursion = guard.recursive_this?(self)
412
3370
  end
413
3371
  end
3372
+ @resolved_type.check_self_recursion(self) if @self_recursion
414
3373
  end
3374
+
3375
+ DEFAULT = PTypeAliasType.new('UnresolvedAlias', nil, PTypeReferenceType::DEFAULT)
3376
+ end
415
3377
  end
3378
+ end
3379
+
3380
+ require 'puppet/pops/pcore'
3381
+
3382
+ require_relative 'annotatable'
3383
+ require_relative 'p_meta_type'
3384
+ require_relative 'p_object_type'
3385
+ require_relative 'p_runtime_type'
3386
+ require_relative 'p_sem_ver_type'
3387
+ require_relative 'p_sem_ver_range_type'
3388
+ require_relative 'p_sensitive_type'
3389
+ require_relative 'p_type_set_type'
3390
+ require_relative 'p_timespan_type'
3391
+ require_relative 'p_timestamp_type'
3392
+ require_relative 'p_binary_type'
3393
+ require_relative 'type_set_reference'
3394
+ require_relative 'implementation_registry'