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