puppet 4.0.0 → 4.9.1

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