puppet 4.0.0 → 4.5.0

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