puppet 4.1.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 (2014) 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 +2 -2
  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.init +0 -1
  20. data/ext/debian/puppet.logrotate +14 -5
  21. data/ext/debian/puppetmaster.README.debian +11 -9
  22. data/ext/envpuppet +2 -2
  23. data/ext/hiera/hiera.yaml +15 -0
  24. data/ext/ips/puppetagent.xml +1 -1
  25. data/ext/ips/puppetmaster.xml +1 -1
  26. data/ext/logcheck/puppet +1 -1
  27. data/ext/osx/puppet.plist +30 -0
  28. data/ext/project_data.yaml +29 -16
  29. data/ext/puppet-test +3 -27
  30. data/ext/rack/config.ru +2 -2
  31. data/ext/rack/example-passenger-vhost.conf +1 -1
  32. data/ext/redhat/client.init +67 -17
  33. data/ext/redhat/client.sysconfig +1 -10
  34. data/ext/redhat/logrotate +15 -3
  35. data/ext/redhat/puppet.spec.erb +6 -14
  36. data/ext/redhat/server.init +1 -1
  37. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  38. data/ext/solaris/pkginfo +1 -1
  39. data/ext/solaris/smf/puppet +44 -0
  40. data/ext/solaris/smf/puppet.xml +44 -0
  41. data/ext/suse/client.init +30 -33
  42. data/ext/suse/puppet.spec +2 -2
  43. data/ext/suse/server.init +2 -2
  44. data/ext/systemd/puppet.service +13 -1
  45. data/ext/upload_facts.rb +1 -1
  46. data/ext/windows/puppet_interactive.bat +6 -0
  47. data/ext/windows/puppet_shell.bat +9 -0
  48. data/ext/windows/run_puppet_interactive.bat +9 -0
  49. data/ext/windows/service/daemon.rb +10 -15
  50. data/ext/yaml_nodes.rb +1 -1
  51. data/install.rb +99 -66
  52. data/lib/hiera/puppet_function.rb +17 -18
  53. data/lib/hiera/scope.rb +12 -14
  54. data/lib/hiera_puppet.rb +6 -14
  55. data/lib/puppet/agent/disabler.rb +3 -3
  56. data/lib/puppet/agent/locker.rb +12 -3
  57. data/lib/puppet/agent.rb +35 -39
  58. data/lib/puppet/application/agent.rb +48 -25
  59. data/lib/puppet/application/apply.rb +63 -29
  60. data/lib/puppet/application/ca.rb +1 -0
  61. data/lib/puppet/application/cert.rb +54 -5
  62. data/lib/puppet/application/describe.rb +2 -2
  63. data/lib/puppet/application/device.rb +72 -47
  64. data/lib/puppet/application/doc.rb +9 -9
  65. data/lib/puppet/application/face_base.rb +11 -12
  66. data/lib/puppet/application/filebucket.rb +84 -10
  67. data/lib/puppet/application/generate.rb +5 -0
  68. data/lib/puppet/application/lookup.rb +357 -0
  69. data/lib/puppet/application/master.rb +21 -25
  70. data/lib/puppet/application/resource.rb +22 -23
  71. data/lib/puppet/application.rb +31 -15
  72. data/lib/puppet/application_support.rb +1 -1
  73. data/lib/puppet/compilable_resource_type.rb +15 -0
  74. data/lib/puppet/configurer/downloader.rb +2 -2
  75. data/lib/puppet/configurer/fact_handler.rb +13 -4
  76. data/lib/puppet/configurer/plugin_handler.rb +7 -5
  77. data/lib/puppet/configurer.rb +192 -51
  78. data/lib/puppet/context/trusted_information.rb +22 -2
  79. data/lib/puppet/context.rb +20 -5
  80. data/lib/puppet/daemon.rb +17 -13
  81. data/lib/puppet/data_binding.rb +4 -2
  82. data/lib/puppet/defaults.rb +298 -130
  83. data/lib/puppet/environments.rb +104 -9
  84. data/lib/puppet/error.rb +5 -1
  85. data/lib/puppet/etc.rb +161 -0
  86. data/lib/puppet/external/dot.rb +1 -1
  87. data/lib/puppet/external/pson/common.rb +4 -0
  88. data/lib/puppet/face/ca.rb +56 -44
  89. data/lib/puppet/face/catalog/select.rb +4 -4
  90. data/lib/puppet/face/catalog.rb +3 -3
  91. data/lib/puppet/face/certificate.rb +28 -22
  92. data/lib/puppet/face/certificate_request.rb +3 -1
  93. data/lib/puppet/face/certificate_revocation_list.rb +3 -1
  94. data/lib/puppet/face/config.rb +12 -12
  95. data/lib/puppet/face/epp.rb +96 -50
  96. data/lib/puppet/face/facts.rb +5 -5
  97. data/lib/puppet/face/generate.rb +64 -0
  98. data/lib/puppet/face/help/face.erb +3 -0
  99. data/lib/puppet/face/help/man.erb +1 -1
  100. data/lib/puppet/face/help.rb +37 -29
  101. data/lib/puppet/face/key.rb +4 -3
  102. data/lib/puppet/face/man.rb +12 -10
  103. data/lib/puppet/face/module/build.rb +7 -7
  104. data/lib/puppet/face/module/changes.rb +8 -7
  105. data/lib/puppet/face/module/generate.rb +25 -25
  106. data/lib/puppet/face/module/install.rb +19 -15
  107. data/lib/puppet/face/module/list.rb +16 -12
  108. data/lib/puppet/face/module/search.rb +4 -4
  109. data/lib/puppet/face/module/uninstall.rb +13 -10
  110. data/lib/puppet/face/module/upgrade.rb +11 -7
  111. data/lib/puppet/face/module.rb +3 -3
  112. data/lib/puppet/face/node/clean.rb +8 -8
  113. data/lib/puppet/face/node.rb +6 -6
  114. data/lib/puppet/face/parser.rb +28 -25
  115. data/lib/puppet/face/plugin.rb +14 -21
  116. data/lib/puppet/face/report.rb +10 -10
  117. data/lib/puppet/face/resource.rb +13 -13
  118. data/lib/puppet/face/status.rb +9 -6
  119. data/lib/puppet/feature/base.rb +13 -5
  120. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  121. data/lib/puppet/feature/eventlog.rb +1 -1
  122. data/lib/puppet/feature/hiera_eyaml.rb +3 -0
  123. data/lib/puppet/feature/hocon.rb +3 -0
  124. data/lib/puppet/feature/telnet.rb +9 -0
  125. data/lib/puppet/file_bucket/dipper.rb +62 -6
  126. data/lib/puppet/file_bucket/file.rb +4 -17
  127. data/lib/puppet/file_serving/base.rb +3 -3
  128. data/lib/puppet/file_serving/configuration/parser.rb +12 -12
  129. data/lib/puppet/file_serving/configuration.rb +3 -3
  130. data/lib/puppet/file_serving/content.rb +1 -1
  131. data/lib/puppet/file_serving/fileset.rb +7 -5
  132. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  133. data/lib/puppet/file_serving/metadata.rb +22 -6
  134. data/lib/puppet/file_serving/mount/file.rb +6 -6
  135. data/lib/puppet/file_serving/mount/modules.rb +1 -1
  136. data/lib/puppet/file_serving/mount.rb +1 -1
  137. data/lib/puppet/file_serving/terminus_selector.rb +3 -1
  138. data/lib/puppet/file_system/file_impl.rb +9 -4
  139. data/lib/puppet/file_system/memory_impl.rb +6 -2
  140. data/lib/puppet/file_system/path_pattern.rb +7 -6
  141. data/lib/puppet/file_system/uniquefile.rb +5 -5
  142. data/lib/puppet/file_system/windows.rb +31 -16
  143. data/lib/puppet/file_system.rb +33 -5
  144. data/lib/puppet/forge/cache.rb +1 -0
  145. data/lib/puppet/forge/errors.rb +12 -12
  146. data/lib/puppet/forge/repository.rb +5 -36
  147. data/lib/puppet/forge.rb +17 -15
  148. data/lib/puppet/functions/alert.rb +14 -0
  149. data/lib/puppet/functions/annotate.rb +108 -0
  150. data/lib/puppet/functions/assert_type.rb +53 -19
  151. data/lib/puppet/functions/binary_file.rb +19 -0
  152. data/lib/puppet/functions/break.rb +22 -0
  153. data/lib/puppet/functions/call.rb +42 -0
  154. data/lib/puppet/functions/contain.rb +33 -0
  155. data/lib/puppet/functions/crit.rb +14 -0
  156. data/lib/puppet/functions/debug.rb +14 -0
  157. data/lib/puppet/functions/defined.rb +92 -62
  158. data/lib/puppet/functions/dig.rb +23 -0
  159. data/lib/puppet/functions/each.rb +89 -39
  160. data/lib/puppet/functions/emerg.rb +14 -0
  161. data/lib/puppet/functions/epp.rb +29 -37
  162. data/lib/puppet/functions/err.rb +14 -0
  163. data/lib/puppet/functions/eyaml_lookup_key.rb +94 -0
  164. data/lib/puppet/functions/filter.rb +64 -38
  165. data/lib/puppet/functions/find_file.rb +31 -0
  166. data/lib/puppet/functions/hiera.rb +83 -3
  167. data/lib/puppet/functions/hiera_array.rb +73 -4
  168. data/lib/puppet/functions/hiera_hash.rb +82 -2
  169. data/lib/puppet/functions/hiera_include.rb +93 -6
  170. data/lib/puppet/functions/hocon_data.rb +41 -0
  171. data/lib/puppet/functions/include.rb +21 -0
  172. data/lib/puppet/functions/info.rb +14 -0
  173. data/lib/puppet/functions/inline_epp.rb +44 -71
  174. data/lib/puppet/functions/json_data.rb +33 -0
  175. data/lib/puppet/functions/lest.rb +17 -0
  176. data/lib/puppet/functions/lookup.rb +172 -184
  177. data/lib/puppet/functions/map.rb +60 -33
  178. data/lib/puppet/functions/match.rb +32 -14
  179. data/lib/puppet/functions/new.rb +31 -0
  180. data/lib/puppet/functions/next.rb +23 -0
  181. data/lib/puppet/functions/notice.rb +14 -0
  182. data/lib/puppet/functions/reduce.rb +112 -71
  183. data/lib/puppet/functions/regsubst.rb +22 -25
  184. data/lib/puppet/functions/require.rb +37 -0
  185. data/lib/puppet/functions/return.rb +22 -0
  186. data/lib/puppet/functions/reverse_each.rb +25 -0
  187. data/lib/puppet/functions/scanf.rb +15 -18
  188. data/lib/puppet/functions/slice.rb +25 -39
  189. data/lib/puppet/functions/split.rb +2 -2
  190. data/lib/puppet/functions/step.rb +26 -0
  191. data/lib/puppet/functions/strftime.rb +43 -0
  192. data/lib/puppet/functions/then.rb +14 -0
  193. data/lib/puppet/functions/type.rb +31 -0
  194. data/lib/puppet/functions/unique.rb +132 -0
  195. data/lib/puppet/functions/unwrap.rb +40 -0
  196. data/lib/puppet/functions/versioncmp.rb +36 -0
  197. data/lib/puppet/functions/warning.rb +14 -0
  198. data/lib/puppet/functions/with.rb +15 -7
  199. data/lib/puppet/functions/yaml_data.rb +42 -0
  200. data/lib/puppet/functions.rb +194 -74
  201. data/lib/puppet/generate/models/type/property.rb +70 -0
  202. data/lib/puppet/generate/models/type/type.rb +62 -0
  203. data/lib/puppet/generate/templates/type/pcore.erb +42 -0
  204. data/lib/puppet/generate/type.rb +239 -0
  205. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  206. data/lib/puppet/graph/relationship_graph.rb +4 -1
  207. data/lib/puppet/graph/simple_graph.rb +51 -74
  208. data/lib/puppet/indirector/catalog/compiler.rb +241 -37
  209. data/lib/puppet/indirector/catalog/json.rb +18 -0
  210. data/lib/puppet/indirector/certificate/disabled_ca.rb +1 -1
  211. data/lib/puppet/indirector/certificate_request/ca.rb +3 -3
  212. data/lib/puppet/indirector/certificate_request/disabled_ca.rb +1 -1
  213. data/lib/puppet/indirector/certificate_revocation_list/disabled_ca.rb +1 -1
  214. data/lib/puppet/indirector/certificate_status/file.rb +6 -6
  215. data/lib/puppet/indirector/data_binding/none.rb +4 -1
  216. data/lib/puppet/indirector/exec.rb +2 -2
  217. data/lib/puppet/indirector/face.rb +24 -19
  218. data/lib/puppet/indirector/facts/facter.rb +3 -6
  219. data/lib/puppet/indirector/file_bucket_file/file.rb +142 -29
  220. data/lib/puppet/indirector/file_content/http.rb +15 -0
  221. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  222. data/lib/puppet/indirector/file_server.rb +10 -2
  223. data/lib/puppet/indirector/generic_http.rb +16 -0
  224. data/lib/puppet/indirector/hiera.rb +12 -4
  225. data/lib/puppet/indirector/indirection.rb +25 -18
  226. data/lib/puppet/indirector/json.rb +11 -12
  227. data/lib/puppet/indirector/key/ca.rb +2 -2
  228. data/lib/puppet/indirector/key/disabled_ca.rb +1 -1
  229. data/lib/puppet/indirector/key/file.rb +4 -3
  230. data/lib/puppet/indirector/ldap.rb +6 -5
  231. data/lib/puppet/indirector/memory.rb +1 -1
  232. data/lib/puppet/indirector/msgpack.rb +9 -8
  233. data/lib/puppet/indirector/node/exec.rb +9 -7
  234. data/lib/puppet/indirector/node/ldap.rb +10 -8
  235. data/lib/puppet/indirector/node/plain.rb +2 -1
  236. data/lib/puppet/indirector/node/write_only_yaml.rb +6 -1
  237. data/lib/puppet/indirector/node/yaml.rb +0 -9
  238. data/lib/puppet/indirector/report/processor.rb +2 -2
  239. data/lib/puppet/indirector/report/rest.rb +13 -0
  240. data/lib/puppet/indirector/request.rb +40 -23
  241. data/lib/puppet/indirector/resource/ral.rb +1 -1
  242. data/lib/puppet/indirector/resource/validator.rb +1 -1
  243. data/lib/puppet/indirector/rest.rb +103 -10
  244. data/lib/puppet/indirector/ssl_file.rb +33 -12
  245. data/lib/puppet/indirector/terminus.rb +7 -7
  246. data/lib/puppet/indirector/yaml.rb +5 -5
  247. data/lib/puppet/indirector.rb +2 -2
  248. data/lib/puppet/info_service/class_information_service.rb +110 -0
  249. data/lib/puppet/info_service.rb +7 -0
  250. data/lib/puppet/interface/documentation.rb +1 -1
  251. data/lib/puppet/interface/face_collection.rb +7 -2
  252. data/lib/puppet/interface.rb +12 -4
  253. data/lib/puppet/loaders.rb +5 -0
  254. data/lib/puppet/metatype/manager.rb +25 -8
  255. data/lib/puppet/module.rb +73 -34
  256. data/lib/puppet/module_tool/applications/application.rb +8 -9
  257. data/lib/puppet/module_tool/applications/builder.rb +9 -9
  258. data/lib/puppet/module_tool/applications/checksummer.rb +2 -2
  259. data/lib/puppet/module_tool/applications/installer.rb +21 -20
  260. data/lib/puppet/module_tool/applications/searcher.rb +1 -1
  261. data/lib/puppet/module_tool/applications/uninstaller.rb +2 -1
  262. data/lib/puppet/module_tool/applications/unpacker.rb +4 -4
  263. data/lib/puppet/module_tool/applications/upgrader.rb +19 -18
  264. data/lib/puppet/module_tool/checksums.rb +1 -1
  265. data/lib/puppet/module_tool/contents_description.rb +1 -1
  266. data/lib/puppet/module_tool/dependency.rb +0 -1
  267. data/lib/puppet/module_tool/errors/installer.rb +23 -23
  268. data/lib/puppet/module_tool/errors/shared.rb +44 -42
  269. data/lib/puppet/module_tool/errors/uninstaller.rb +13 -9
  270. data/lib/puppet/module_tool/errors/upgrader.rb +11 -11
  271. data/lib/puppet/module_tool/install_directory.rb +1 -1
  272. data/lib/puppet/module_tool/installed_modules.rb +10 -10
  273. data/lib/puppet/module_tool/local_tarball.rb +7 -7
  274. data/lib/puppet/module_tool/metadata.rb +47 -21
  275. data/lib/puppet/module_tool/shared_behaviors.rb +6 -6
  276. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +14 -3
  277. data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +48 -38
  278. data/lib/puppet/module_tool/skeleton/templates/generator/Rakefile +19 -4
  279. data/lib/puppet/module_tool/skeleton/templates/generator/{tests → examples}/init.pp.erb +3 -3
  280. data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +25 -18
  281. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -2
  282. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  283. data/lib/puppet/module_tool/tar.rb +5 -4
  284. data/lib/puppet/module_tool.rb +11 -7
  285. data/lib/puppet/network/auth_config_parser.rb +13 -12
  286. data/lib/puppet/network/authconfig.rb +23 -3
  287. data/lib/puppet/network/authorization.rb +8 -1
  288. data/lib/puppet/network/authstore.rb +2 -2
  289. data/lib/puppet/network/format.rb +7 -7
  290. data/lib/puppet/network/format_handler.rb +12 -9
  291. data/lib/puppet/network/format_support.rb +11 -5
  292. data/lib/puppet/network/formats.rb +38 -27
  293. data/lib/puppet/network/http/api/indirected_routes.rb +86 -58
  294. data/lib/puppet/network/http/api/master/v3/environment.rb +82 -0
  295. data/lib/puppet/network/http/api/master/v3.rb +7 -1
  296. data/lib/puppet/network/http/compression.rb +12 -8
  297. data/lib/puppet/network/http/connection.rb +21 -15
  298. data/lib/puppet/network/http/error.rb +14 -10
  299. data/lib/puppet/network/http/factory.rb +8 -4
  300. data/lib/puppet/network/http/handler.rb +11 -6
  301. data/lib/puppet/network/http/issues.rb +1 -0
  302. data/lib/puppet/network/http/pool.rb +10 -1
  303. data/lib/puppet/network/http/rack/rest.rb +27 -3
  304. data/lib/puppet/network/http/rack.rb +2 -2
  305. data/lib/puppet/network/http/request.rb +34 -20
  306. data/lib/puppet/network/http/response.rb +13 -1
  307. data/lib/puppet/network/http/webrick/rest.rb +2 -2
  308. data/lib/puppet/network/http/webrick.rb +7 -6
  309. data/lib/puppet/network/rights.rb +7 -17
  310. data/lib/puppet/network/server.rb +2 -2
  311. data/lib/puppet/node/environment.rb +69 -17
  312. data/lib/puppet/node/facts.rb +1 -6
  313. data/lib/puppet/node.rb +45 -18
  314. data/lib/puppet/parameter/boolean.rb +1 -1
  315. data/lib/puppet/parameter/package_options.rb +1 -1
  316. data/lib/puppet/parameter/path.rb +3 -3
  317. data/lib/puppet/parameter/value.rb +1 -1
  318. data/lib/puppet/parameter/value_collection.rb +4 -4
  319. data/lib/puppet/parameter.rb +24 -29
  320. data/lib/puppet/parser/ast/node.rb +1 -1
  321. data/lib/puppet/parser/ast/pops_bridge.rb +99 -29
  322. data/lib/puppet/parser/ast/resource.rb +5 -0
  323. data/lib/puppet/parser/ast/resource_instance.rb +5 -1
  324. data/lib/puppet/parser/ast/resourceparam.rb +5 -0
  325. data/lib/puppet/parser/ast.rb +5 -0
  326. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
  327. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +57 -0
  328. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
  329. data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
  330. data/lib/puppet/parser/compiler.rb +345 -131
  331. data/lib/puppet/parser/e4_parser_adapter.rb +14 -14
  332. data/lib/puppet/parser/environment_compiler.rb +199 -0
  333. data/lib/puppet/parser/functions/assert_type.rb +47 -17
  334. data/lib/puppet/parser/functions/binary_file.rb +24 -0
  335. data/lib/puppet/parser/functions/break.rb +39 -0
  336. data/lib/puppet/parser/functions/contain.rb +7 -15
  337. data/lib/puppet/parser/functions/create_resources.rb +49 -25
  338. data/lib/puppet/parser/functions/defined.rb +106 -93
  339. data/lib/puppet/parser/functions/dig.rb +29 -0
  340. data/lib/puppet/parser/functions/each.rb +86 -28
  341. data/lib/puppet/parser/functions/epp.rb +30 -38
  342. data/lib/puppet/parser/functions/file.rb +1 -1
  343. data/lib/puppet/parser/functions/filter.rb +60 -24
  344. data/lib/puppet/parser/functions/find_file.rb +28 -0
  345. data/lib/puppet/parser/functions/fqdn_rand.rb +3 -3
  346. data/lib/puppet/parser/functions/generate.rb +5 -4
  347. data/lib/puppet/parser/functions/hiera.rb +98 -28
  348. data/lib/puppet/parser/functions/hiera_array.rb +86 -29
  349. data/lib/puppet/parser/functions/hiera_hash.rb +96 -31
  350. data/lib/puppet/parser/functions/hiera_include.rb +96 -41
  351. data/lib/puppet/parser/functions/include.rb +5 -8
  352. data/lib/puppet/parser/functions/inline_epp.rb +36 -61
  353. data/lib/puppet/parser/functions/inline_template.rb +3 -3
  354. data/lib/puppet/parser/functions/lest.rb +49 -0
  355. data/lib/puppet/parser/functions/lookup.rb +129 -151
  356. data/lib/puppet/parser/functions/map.rb +56 -21
  357. data/lib/puppet/parser/functions/match.rb +29 -13
  358. data/lib/puppet/parser/functions/new.rb +939 -0
  359. data/lib/puppet/parser/functions/next.rb +38 -0
  360. data/lib/puppet/parser/functions/reduce.rb +98 -61
  361. data/lib/puppet/parser/functions/regsubst.rb +4 -2
  362. data/lib/puppet/parser/functions/require.rb +4 -27
  363. data/lib/puppet/parser/functions/return.rb +71 -0
  364. data/lib/puppet/parser/functions/reverse_each.rb +83 -0
  365. data/lib/puppet/parser/functions/scanf.rb +25 -31
  366. data/lib/puppet/parser/functions/slice.rb +18 -25
  367. data/lib/puppet/parser/functions/split.rb +2 -2
  368. data/lib/puppet/parser/functions/step.rb +84 -0
  369. data/lib/puppet/parser/functions/strftime.rb +185 -0
  370. data/lib/puppet/parser/functions/then.rb +73 -0
  371. data/lib/puppet/parser/functions/type.rb +53 -0
  372. data/lib/puppet/parser/functions/with.rb +17 -9
  373. data/lib/puppet/parser/functions.rb +39 -21
  374. data/lib/puppet/parser/parser_factory.rb +0 -30
  375. data/lib/puppet/parser/relationship.rb +49 -20
  376. data/lib/puppet/parser/resource/param.rb +0 -3
  377. data/lib/puppet/parser/resource.rb +165 -50
  378. data/lib/puppet/parser/scope.rb +412 -202
  379. data/lib/puppet/parser/templatewrapper.rb +2 -2
  380. data/lib/puppet/parser/type_loader.rb +2 -2
  381. data/lib/puppet/parser.rb +3 -1
  382. data/lib/puppet/plugins/configuration.rb +15 -58
  383. data/lib/puppet/plugins/syntax_checkers.rb +6 -11
  384. data/lib/puppet/pops/adaptable.rb +12 -7
  385. data/lib/puppet/pops/adapters.rb +102 -73
  386. data/lib/puppet/pops/evaluator/access_operator.rb +233 -163
  387. data/lib/puppet/pops/evaluator/callable_signature.rb +7 -0
  388. data/lib/puppet/pops/evaluator/closure.rb +231 -115
  389. data/lib/puppet/pops/evaluator/collector_transformer.rb +50 -26
  390. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
  391. data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +2 -2
  392. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +4 -5
  393. data/lib/puppet/pops/evaluator/compare_operator.rb +72 -15
  394. data/lib/puppet/pops/evaluator/epp_evaluator.rb +10 -9
  395. data/lib/puppet/pops/evaluator/evaluator_impl.rb +236 -140
  396. data/lib/puppet/pops/evaluator/external_syntax_support.rb +2 -9
  397. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +82 -0
  398. data/lib/puppet/pops/evaluator/literal_evaluator.rb +87 -0
  399. data/lib/puppet/pops/evaluator/puppet_proc.rb +1 -1
  400. data/lib/puppet/pops/evaluator/relationship_operator.rb +44 -20
  401. data/lib/puppet/pops/evaluator/runtime3_converter.rb +74 -49
  402. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +117 -0
  403. data/lib/puppet/pops/evaluator/runtime3_support.rb +134 -88
  404. data/lib/puppet/pops/functions/dispatch.rb +28 -13
  405. data/lib/puppet/pops/functions/dispatcher.rb +15 -20
  406. data/lib/puppet/pops/functions/function.rb +30 -4
  407. data/lib/puppet/pops/issue_reporter.rb +7 -5
  408. data/lib/puppet/pops/issues.rb +319 -131
  409. data/lib/puppet/pops/label_provider.rb +18 -4
  410. data/lib/puppet/pops/loader/base_loader.rb +74 -20
  411. data/lib/puppet/pops/loader/dependency_loader.rb +27 -2
  412. data/lib/puppet/pops/loader/gem_support.rb +2 -2
  413. data/lib/puppet/pops/loader/loader.rb +47 -49
  414. data/lib/puppet/pops/loader/loader_paths.rb +48 -2
  415. data/lib/puppet/pops/loader/module_loaders.rb +109 -27
  416. data/lib/puppet/pops/loader/null_loader.rb +17 -1
  417. data/lib/puppet/pops/loader/predefined_loader.rb +24 -0
  418. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +34 -28
  419. data/lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb +79 -0
  420. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +19 -7
  421. data/lib/puppet/pops/loader/runtime3_type_loader.rb +96 -0
  422. data/lib/puppet/pops/loader/static_loader.rb +111 -41
  423. data/lib/puppet/pops/loader/type_definition_instantiator.rb +93 -0
  424. data/lib/puppet/pops/loader/typed_name.rb +54 -0
  425. data/lib/puppet/pops/loaders.rb +208 -28
  426. data/lib/puppet/pops/lookup/configured_data_provider.rb +93 -0
  427. data/lib/puppet/pops/lookup/context.rb +200 -0
  428. data/lib/puppet/pops/lookup/data_adapter.rb +27 -0
  429. data/lib/puppet/pops/lookup/data_dig_function_provider.rb +145 -0
  430. data/lib/puppet/pops/lookup/data_hash_function_provider.rb +126 -0
  431. data/lib/puppet/pops/lookup/data_provider.rb +92 -0
  432. data/lib/puppet/pops/lookup/environment_data_provider.rb +35 -0
  433. data/lib/puppet/pops/lookup/explainer.rb +594 -0
  434. data/lib/puppet/pops/lookup/function_provider.rb +110 -0
  435. data/lib/puppet/pops/lookup/global_data_provider.rb +75 -0
  436. data/lib/puppet/pops/lookup/hiera_config.rb +761 -0
  437. data/lib/puppet/pops/lookup/interpolation.rb +154 -0
  438. data/lib/puppet/pops/lookup/invocation.rb +261 -0
  439. data/lib/puppet/pops/lookup/location_resolver.rb +99 -0
  440. data/lib/puppet/pops/lookup/lookup_adapter.rb +471 -0
  441. data/lib/puppet/pops/lookup/lookup_key.rb +99 -0
  442. data/lib/puppet/pops/lookup/lookup_key_function_provider.rb +92 -0
  443. data/lib/puppet/pops/lookup/module_data_provider.rb +89 -0
  444. data/lib/puppet/pops/lookup/sub_lookup.rb +92 -0
  445. data/lib/puppet/pops/lookup.rb +49 -49
  446. data/lib/puppet/pops/merge_strategy.rb +197 -46
  447. data/lib/puppet/pops/migration/migration_checker.rb +4 -0
  448. data/lib/puppet/pops/model/ast.pp +692 -0
  449. data/lib/puppet/pops/model/ast.rb +4833 -0
  450. data/lib/puppet/pops/model/ast_transformer.rb +15 -9
  451. data/lib/puppet/pops/model/factory.rb +547 -528
  452. data/lib/puppet/pops/model/model_label_provider.rb +31 -8
  453. data/lib/puppet/pops/model/model_tree_dumper.rb +52 -7
  454. data/lib/puppet/pops/parser/code_merger.rb +13 -1
  455. data/lib/puppet/pops/parser/egrammar.ra +185 -61
  456. data/lib/puppet/pops/parser/eparser.rb +1819 -1348
  457. data/lib/puppet/pops/parser/epp_support.rb +15 -9
  458. data/lib/puppet/pops/parser/evaluating_parser.rb +25 -17
  459. data/lib/puppet/pops/parser/heredoc_support.rb +16 -13
  460. data/lib/puppet/pops/parser/interpolation_support.rb +11 -4
  461. data/lib/puppet/pops/parser/lexer2.rb +459 -399
  462. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  463. data/lib/puppet/pops/parser/locator.rb +86 -9
  464. data/lib/puppet/pops/parser/parser_support.rb +50 -42
  465. data/lib/puppet/pops/parser/slurp_support.rb +23 -14
  466. data/lib/puppet/pops/patterns.rb +16 -1
  467. data/lib/puppet/pops/pcore.rb +103 -0
  468. data/lib/puppet/pops/puppet_stack.rb +43 -0
  469. data/lib/puppet/pops/resource/param.rb +55 -0
  470. data/lib/puppet/pops/resource/resource_type_impl.rb +314 -0
  471. data/lib/puppet/pops/resource/resource_type_set.pcore +22 -0
  472. data/lib/puppet/pops/semantic_error.rb +12 -0
  473. data/lib/puppet/pops/serialization/abstract_reader.rb +176 -0
  474. data/lib/puppet/pops/serialization/abstract_writer.rb +215 -0
  475. data/lib/puppet/pops/serialization/deserializer.rb +80 -0
  476. data/lib/puppet/pops/serialization/extension.rb +157 -0
  477. data/lib/puppet/pops/serialization/from_data_converter.rb +181 -0
  478. data/lib/puppet/pops/serialization/instance_reader.rb +19 -0
  479. data/lib/puppet/pops/serialization/instance_writer.rb +14 -0
  480. data/lib/puppet/pops/serialization/json.rb +297 -0
  481. data/lib/puppet/pops/serialization/json_path.rb +126 -0
  482. data/lib/puppet/pops/serialization/object.rb +71 -0
  483. data/lib/puppet/pops/serialization/serializer.rb +139 -0
  484. data/lib/puppet/pops/serialization/time_factory.rb +67 -0
  485. data/lib/puppet/pops/serialization/to_data_converter.rb +292 -0
  486. data/lib/puppet/pops/serialization.rb +41 -0
  487. data/lib/puppet/pops/time/timespan.rb +718 -0
  488. data/lib/puppet/pops/time/timestamp.rb +148 -0
  489. data/lib/puppet/pops/types/annotatable.rb +36 -0
  490. data/lib/puppet/pops/types/annotation.rb +71 -0
  491. data/lib/puppet/pops/types/class_loader.rb +29 -29
  492. data/lib/puppet/pops/types/enumeration.rb +9 -27
  493. data/lib/puppet/pops/types/implementation_registry.rb +141 -0
  494. data/lib/puppet/pops/types/iterable.rb +308 -0
  495. data/lib/puppet/pops/types/p_binary_type.rb +226 -0
  496. data/lib/puppet/pops/types/p_meta_type.rb +87 -0
  497. data/lib/puppet/pops/types/p_object_type.rb +925 -0
  498. data/lib/puppet/pops/types/p_runtime_type.rb +115 -0
  499. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +191 -0
  500. data/lib/puppet/pops/types/p_sem_ver_type.rb +141 -0
  501. data/lib/puppet/pops/types/p_sensitive_type.rb +73 -0
  502. data/lib/puppet/pops/types/p_timespan_type.rb +192 -0
  503. data/lib/puppet/pops/types/p_timestamp_type.rb +69 -0
  504. data/lib/puppet/pops/types/p_type_set_type.rb +360 -0
  505. data/lib/puppet/pops/types/puppet_object.rb +26 -0
  506. data/lib/puppet/pops/types/recursion_guard.rb +136 -0
  507. data/lib/puppet/pops/types/ruby_generator.rb +439 -0
  508. data/lib/puppet/pops/types/ruby_method.rb +31 -0
  509. data/lib/puppet/pops/types/string_converter.rb +1099 -0
  510. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  511. data/lib/puppet/pops/types/type_asserter.rb +21 -19
  512. data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
  513. data/lib/puppet/pops/types/type_calculator.rb +251 -1332
  514. data/lib/puppet/pops/types/type_conversion_error.rb +15 -0
  515. data/lib/puppet/pops/types/type_factory.rb +252 -171
  516. data/lib/puppet/pops/types/type_formatter.rb +734 -0
  517. data/lib/puppet/pops/types/type_mismatch_describer.rb +1106 -0
  518. data/lib/puppet/pops/types/type_parser.rb +374 -276
  519. data/lib/puppet/pops/types/type_set_reference.rb +59 -0
  520. data/lib/puppet/pops/types/types.rb +3286 -307
  521. data/lib/puppet/pops/utils.rb +7 -30
  522. data/lib/puppet/pops/validation/checker4_0.rb +305 -109
  523. data/lib/puppet/pops/validation/validator_factory_4_0.rb +13 -5
  524. data/lib/puppet/pops/validation.rb +25 -16
  525. data/lib/puppet/pops/visitor.rb +30 -6
  526. data/lib/puppet/pops.rb +42 -57
  527. data/lib/puppet/property/ensure.rb +4 -4
  528. data/lib/puppet/property/list.rb +1 -10
  529. data/lib/puppet/property.rb +84 -21
  530. data/lib/puppet/provider/aixobject.rb +11 -11
  531. data/lib/puppet/provider/augeas/augeas.rb +89 -34
  532. data/lib/puppet/provider/command.rb +1 -1
  533. data/lib/puppet/provider/cron/crontab.rb +3 -3
  534. data/lib/puppet/provider/exec/posix.rb +4 -4
  535. data/lib/puppet/provider/exec/windows.rb +4 -4
  536. data/lib/puppet/provider/exec.rb +14 -7
  537. data/lib/puppet/provider/file/posix.rb +5 -5
  538. data/lib/puppet/provider/file/windows.rb +4 -4
  539. data/lib/puppet/provider/group/aix.rb +6 -6
  540. data/lib/puppet/provider/group/directoryservice.rb +10 -0
  541. data/lib/puppet/provider/group/groupadd.rb +2 -2
  542. data/lib/puppet/provider/group/pw.rb +2 -1
  543. data/lib/puppet/provider/group/windows_adsi.rb +15 -3
  544. data/lib/puppet/provider/host/parsed.rb +1 -1
  545. data/lib/puppet/provider/macauthorization/macauthorization.rb +20 -19
  546. data/lib/puppet/provider/mailalias/aliases.rb +1 -1
  547. data/lib/puppet/provider/maillist/mailman.rb +2 -2
  548. data/lib/puppet/provider/mcx/mcxcontent.rb +6 -5
  549. data/lib/puppet/provider/mount/parsed.rb +24 -8
  550. data/lib/puppet/provider/mount.rb +2 -1
  551. data/lib/puppet/provider/naginator.rb +1 -1
  552. data/lib/puppet/provider/nameservice/directoryservice.rb +65 -72
  553. data/lib/puppet/provider/nameservice.rb +40 -17
  554. data/lib/puppet/provider/network_device.rb +2 -1
  555. data/lib/puppet/provider/package/aix.rb +5 -5
  556. data/lib/puppet/provider/package/appdmg.rb +7 -6
  557. data/lib/puppet/provider/package/apple.rb +2 -2
  558. data/lib/puppet/provider/package/apt.rb +4 -4
  559. data/lib/puppet/provider/package/aptitude.rb +1 -1
  560. data/lib/puppet/provider/package/aptrpm.rb +2 -2
  561. data/lib/puppet/provider/package/blastwave.rb +4 -4
  562. data/lib/puppet/provider/package/dnf.rb +46 -0
  563. data/lib/puppet/provider/package/dpkg.rb +3 -3
  564. data/lib/puppet/provider/package/fink.rb +3 -3
  565. data/lib/puppet/provider/package/freebsd.rb +1 -1
  566. data/lib/puppet/provider/package/gem.rb +35 -9
  567. data/lib/puppet/provider/package/hpux.rb +1 -1
  568. data/lib/puppet/provider/package/nim.rb +17 -14
  569. data/lib/puppet/provider/package/openbsd.rb +11 -11
  570. data/lib/puppet/provider/package/opkg.rb +1 -1
  571. data/lib/puppet/provider/package/pacman.rb +20 -19
  572. data/lib/puppet/provider/package/pip.rb +72 -20
  573. data/lib/puppet/provider/package/pip3.rb +20 -0
  574. data/lib/puppet/provider/package/pkg.rb +21 -17
  575. data/lib/puppet/provider/package/pkgdmg.rb +12 -9
  576. data/lib/puppet/provider/package/pkgin.rb +6 -6
  577. data/lib/puppet/provider/package/pkgng.rb +16 -7
  578. data/lib/puppet/provider/package/pkgutil.rb +7 -7
  579. data/lib/puppet/provider/package/portage.rb +183 -35
  580. data/lib/puppet/provider/package/ports.rb +3 -3
  581. data/lib/puppet/provider/package/portupgrade.rb +4 -4
  582. data/lib/puppet/provider/package/puppet_gem.rb +0 -0
  583. data/lib/puppet/provider/package/rpm.rb +130 -21
  584. data/lib/puppet/provider/package/rug.rb +1 -1
  585. data/lib/puppet/provider/package/sun.rb +4 -3
  586. data/lib/puppet/provider/package/tdnf.rb +28 -0
  587. data/lib/puppet/provider/package/up2date.rb +1 -1
  588. data/lib/puppet/provider/package/urpmi.rb +1 -1
  589. data/lib/puppet/provider/package/windows/exe_package.rb +10 -8
  590. data/lib/puppet/provider/package/windows/msi_package.rb +4 -3
  591. data/lib/puppet/provider/package/windows/package.rb +12 -4
  592. data/lib/puppet/provider/package/windows.rb +5 -5
  593. data/lib/puppet/provider/package/yum.rb +73 -94
  594. data/lib/puppet/provider/package/zypper.rb +20 -1
  595. data/lib/puppet/provider/package.rb +6 -2
  596. data/lib/puppet/provider/parsedfile.rb +3 -3
  597. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +7 -0
  598. data/lib/puppet/provider/selmodule/semodule.rb +20 -16
  599. data/lib/puppet/provider/service/base.rb +4 -3
  600. data/lib/puppet/provider/service/bsd.rb +9 -9
  601. data/lib/puppet/provider/service/daemontools.rb +5 -5
  602. data/lib/puppet/provider/service/debian.rb +14 -5
  603. data/lib/puppet/provider/service/freebsd.rb +1 -1
  604. data/lib/puppet/provider/service/init.rb +20 -3
  605. data/lib/puppet/provider/service/launchd.rb +57 -19
  606. data/lib/puppet/provider/service/rcng.rb +51 -0
  607. data/lib/puppet/provider/service/redhat.rb +2 -1
  608. data/lib/puppet/provider/service/runit.rb +4 -4
  609. data/lib/puppet/provider/service/smf.rb +59 -8
  610. data/lib/puppet/provider/service/src.rb +66 -39
  611. data/lib/puppet/provider/service/systemd.rb +141 -22
  612. data/lib/puppet/provider/service/upstart.rb +1 -3
  613. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
  614. data/lib/puppet/provider/sshkey/parsed.rb +20 -10
  615. data/lib/puppet/provider/user/aix.rb +12 -6
  616. data/lib/puppet/provider/user/directoryservice.rb +43 -66
  617. data/lib/puppet/provider/user/hpux.rb +1 -1
  618. data/lib/puppet/provider/user/ldap.rb +1 -1
  619. data/lib/puppet/provider/user/pw.rb +1 -0
  620. data/lib/puppet/provider/user/user_role_add.rb +19 -2
  621. data/lib/puppet/provider/user/useradd.rb +1 -1
  622. data/lib/puppet/provider/user/windows_adsi.rb +11 -5
  623. data/lib/puppet/provider/yumrepo/inifile.rb +12 -9
  624. data/lib/puppet/provider/zfs/zfs.rb +2 -2
  625. data/lib/puppet/provider/zone/solaris.rb +6 -3
  626. data/lib/puppet/provider/zpool/zpool.rb +2 -2
  627. data/lib/puppet/provider.rb +11 -7
  628. data/lib/puppet/reference/configuration.rb +13 -5
  629. data/lib/puppet/reference/indirection.rb +2 -2
  630. data/lib/puppet/reference/metaparameter.rb +1 -1
  631. data/lib/puppet/reference/providers.rb +8 -9
  632. data/lib/puppet/reference/report.rb +9 -12
  633. data/lib/puppet/reference/type.rb +3 -3
  634. data/lib/puppet/relationship.rb +7 -9
  635. data/lib/puppet/reports/http.rb +6 -2
  636. data/lib/puppet/reports.rb +5 -1
  637. data/lib/puppet/resource/capability_finder.rb +128 -0
  638. data/lib/puppet/resource/catalog.rb +163 -47
  639. data/lib/puppet/resource/status.rb +34 -20
  640. data/lib/puppet/resource/type.rb +246 -97
  641. data/lib/puppet/resource/type_collection.rb +97 -17
  642. data/lib/puppet/resource.rb +241 -198
  643. data/lib/puppet/settings/array_setting.rb +1 -1
  644. data/lib/puppet/settings/autosign_setting.rb +1 -1
  645. data/lib/puppet/settings/base_setting.rb +9 -3
  646. data/lib/puppet/settings/boolean_setting.rb +1 -1
  647. data/lib/puppet/settings/config_file.rb +4 -3
  648. data/lib/puppet/settings/directory_setting.rb +6 -0
  649. data/lib/puppet/settings/duration_setting.rb +1 -1
  650. data/lib/puppet/settings/enum_setting.rb +1 -1
  651. data/lib/puppet/settings/environment_conf.rb +28 -8
  652. data/lib/puppet/settings/file_or_directory_setting.rb +6 -0
  653. data/lib/puppet/settings/file_setting.rb +22 -11
  654. data/lib/puppet/settings/ini_file.rb +2 -2
  655. data/lib/puppet/settings/priority_setting.rb +1 -1
  656. data/lib/puppet/settings/server_list_setting.rb +20 -0
  657. data/lib/puppet/settings/symbolic_enum_setting.rb +17 -0
  658. data/lib/puppet/settings/terminus_setting.rb +1 -1
  659. data/lib/puppet/settings/ttl_setting.rb +2 -2
  660. data/lib/puppet/settings.rb +99 -46
  661. data/lib/puppet/ssl/base.rb +16 -3
  662. data/lib/puppet/ssl/certificate.rb +1 -1
  663. data/lib/puppet/ssl/certificate_authority/interface.rb +172 -32
  664. data/lib/puppet/ssl/certificate_authority.rb +67 -31
  665. data/lib/puppet/ssl/certificate_factory.rb +5 -5
  666. data/lib/puppet/ssl/certificate_request.rb +19 -19
  667. data/lib/puppet/ssl/certificate_request_attributes.rb +3 -3
  668. data/lib/puppet/ssl/certificate_revocation_list.rb +3 -3
  669. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  670. data/lib/puppet/ssl/configuration.rb +4 -1
  671. data/lib/puppet/ssl/host.rb +47 -25
  672. data/lib/puppet/ssl/inventory.rb +11 -4
  673. data/lib/puppet/ssl/key.rb +8 -4
  674. data/lib/puppet/ssl/oids.rb +48 -8
  675. data/lib/puppet/ssl/validator/default_validator.rb +6 -7
  676. data/lib/puppet/syntax_checkers/base64.rb +41 -0
  677. data/lib/puppet/syntax_checkers/json.rb +5 -7
  678. data/lib/puppet/test/test_helper.rb +21 -11
  679. data/lib/puppet/transaction/additional_resource_generator.rb +105 -11
  680. data/lib/puppet/transaction/event.rb +45 -7
  681. data/lib/puppet/transaction/event_manager.rb +7 -7
  682. data/lib/puppet/transaction/persistence.rb +84 -0
  683. data/lib/puppet/transaction/report.rb +113 -37
  684. data/lib/puppet/transaction/resource_harness.rb +99 -37
  685. data/lib/puppet/transaction.rb +100 -54
  686. data/lib/puppet/type/augeas.rb +15 -6
  687. data/lib/puppet/type/component.rb +11 -0
  688. data/lib/puppet/type/cron.rb +27 -44
  689. data/lib/puppet/type/exec.rb +82 -52
  690. data/lib/puppet/type/file/checksum.rb +1 -0
  691. data/lib/puppet/type/file/checksum_value.rb +53 -0
  692. data/lib/puppet/type/file/content.rb +37 -122
  693. data/lib/puppet/type/file/data_sync.rb +92 -0
  694. data/lib/puppet/type/file/ensure.rb +21 -18
  695. data/lib/puppet/type/file/group.rb +3 -3
  696. data/lib/puppet/type/file/mode.rb +10 -6
  697. data/lib/puppet/type/file/owner.rb +3 -3
  698. data/lib/puppet/type/file/selcontext.rb +19 -2
  699. data/lib/puppet/type/file/source.rb +134 -37
  700. data/lib/puppet/type/file/target.rb +2 -2
  701. data/lib/puppet/type/file.rb +159 -61
  702. data/lib/puppet/type/filebucket.rb +3 -8
  703. data/lib/puppet/type/group.rb +28 -10
  704. data/lib/puppet/type/host.rb +7 -7
  705. data/lib/puppet/type/interface.rb +9 -4
  706. data/lib/puppet/type/k5login.rb +1 -1
  707. data/lib/puppet/type/macauthorization.rb +2 -2
  708. data/lib/puppet/type/mailalias.rb +2 -18
  709. data/lib/puppet/type/maillist.rb +1 -1
  710. data/lib/puppet/type/mount.rb +22 -7
  711. data/lib/puppet/type/notify.rb +3 -1
  712. data/lib/puppet/type/package.rb +37 -17
  713. data/lib/puppet/type/resources.rb +7 -7
  714. data/lib/puppet/type/schedule.rb +14 -14
  715. data/lib/puppet/type/scheduled_task.rb +5 -5
  716. data/lib/puppet/type/service.rb +25 -1
  717. data/lib/puppet/type/ssh_authorized_key.rb +20 -30
  718. data/lib/puppet/type/sshkey.rb +9 -7
  719. data/lib/puppet/type/stage.rb +1 -1
  720. data/lib/puppet/type/tidy.rb +22 -15
  721. data/lib/puppet/type/user.rb +80 -53
  722. data/lib/puppet/type/yumrepo.rb +31 -11
  723. data/lib/puppet/type/zone.rb +13 -13
  724. data/lib/puppet/type/zpool.rb +3 -3
  725. data/lib/puppet/type.rb +175 -47
  726. data/lib/puppet/util/at_fork/noop.rb +18 -0
  727. data/lib/puppet/util/at_fork/solaris.rb +158 -0
  728. data/lib/puppet/util/at_fork.rb +35 -0
  729. data/lib/puppet/util/autoload.rb +18 -13
  730. data/lib/puppet/util/backups.rb +6 -6
  731. data/lib/puppet/util/character_encoding.rb +98 -0
  732. data/lib/puppet/util/checksums.rb +74 -31
  733. data/lib/puppet/util/classgen.rb +5 -5
  734. data/lib/puppet/util/command_line/puppet_option_parser.rb +3 -3
  735. data/lib/puppet/util/command_line/trollop.rb +32 -32
  736. data/lib/puppet/util/command_line.rb +14 -6
  737. data/lib/puppet/util/diff.rb +1 -1
  738. data/lib/puppet/util/errors.rb +4 -4
  739. data/lib/puppet/util/execution.rb +42 -23
  740. data/lib/puppet/util/feature.rb +5 -5
  741. data/lib/puppet/util/fileparsing.rb +8 -8
  742. data/lib/puppet/util/filetype.rb +26 -20
  743. data/lib/puppet/util/http_proxy.rb +132 -0
  744. data/lib/puppet/util/inifile.rb +5 -5
  745. data/lib/puppet/util/instance_loader.rb +2 -2
  746. data/lib/puppet/util/json_lockfile.rb +4 -4
  747. data/lib/puppet/util/ldap/connection.rb +2 -2
  748. data/lib/puppet/util/ldap/manager.rb +2 -2
  749. data/lib/puppet/util/limits.rb +1 -1
  750. data/lib/puppet/util/log/destinations.rb +10 -16
  751. data/lib/puppet/util/log.rb +51 -17
  752. data/lib/puppet/util/logging.rb +53 -7
  753. data/lib/puppet/util/metric.rb +9 -6
  754. data/lib/puppet/util/monkey_patches.rb +41 -65
  755. data/lib/puppet/util/multi_match.rb +51 -0
  756. data/lib/puppet/util/network_device/cisco/device.rb +29 -11
  757. data/lib/puppet/util/network_device/cisco/interface.rb +21 -9
  758. data/lib/puppet/util/network_device/config.rb +7 -7
  759. data/lib/puppet/util/network_device/transport/ssh.rb +13 -9
  760. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  761. data/lib/puppet/util/network_device.rb +1 -1
  762. data/lib/puppet/util/plist.rb +153 -0
  763. data/lib/puppet/util/posix.rb +5 -5
  764. data/lib/puppet/util/profiler/aggregate.rb +1 -1
  765. data/lib/puppet/util/profiler/around_profiler.rb +1 -1
  766. data/lib/puppet/util/profiler/wall_clock.rb +1 -1
  767. data/lib/puppet/util/profiler.rb +1 -1
  768. data/lib/puppet/util/provider_features.rb +1 -1
  769. data/lib/puppet/util/psych_support.rb +4 -12
  770. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +3 -3
  771. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +2 -1
  772. data/lib/puppet/util/rdoc.rb +6 -6
  773. data/lib/puppet/util/reference.rb +9 -7
  774. data/lib/puppet/util/resource_template.rb +2 -2
  775. data/lib/puppet/util/retry_action.rb +2 -2
  776. data/lib/puppet/util/rubygems.rb +1 -1
  777. data/lib/puppet/util/run_mode.rb +2 -2
  778. data/lib/puppet/util/selinux.rb +54 -12
  779. data/lib/puppet/util/skip_tags.rb +9 -0
  780. data/lib/puppet/util/splayer.rb +18 -0
  781. data/lib/puppet/util/storage.rb +5 -5
  782. data/lib/puppet/util/suidmanager.rb +4 -4
  783. data/lib/puppet/util/symbolic_file_mode.rb +9 -9
  784. data/lib/puppet/util/tag_set.rb +1 -4
  785. data/lib/puppet/util/tagging.rb +9 -3
  786. data/lib/puppet/util/watcher/periodic_watcher.rb +2 -2
  787. data/lib/puppet/util/windows/access_control_entry.rb +2 -2
  788. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  789. data/lib/puppet/util/windows/adsi.rb +110 -45
  790. data/lib/puppet/util/windows/api_types.rb +28 -19
  791. data/lib/puppet/util/windows/com.rb +7 -7
  792. data/lib/puppet/util/windows/error.rb +3 -3
  793. data/lib/puppet/util/windows/eventlog.rb +192 -0
  794. data/lib/puppet/util/windows/file.rb +115 -22
  795. data/lib/puppet/util/windows/principal.rb +191 -0
  796. data/lib/puppet/util/windows/process.rb +90 -13
  797. data/lib/puppet/util/windows/registry.rb +31 -25
  798. data/lib/puppet/util/windows/root_certs.rb +6 -6
  799. data/lib/puppet/util/windows/security.rb +52 -51
  800. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  801. data/lib/puppet/util/windows/sid.rb +89 -20
  802. data/lib/puppet/util/windows/taskscheduler.rb +154 -98
  803. data/lib/puppet/util/windows/user.rb +38 -20
  804. data/lib/puppet/util/windows.rb +7 -0
  805. data/lib/puppet/util/yaml.rb +15 -3
  806. data/lib/puppet/util.rb +259 -33
  807. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  808. data/lib/puppet/vendor/deep_merge/test/test_deep_merge.rb +1 -1
  809. data/lib/puppet/vendor/load_semantic_puppet.rb +1 -0
  810. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  811. data/lib/puppet/vendor/pathspec/README.md +1 -1
  812. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +2 -1
  813. data/lib/puppet/vendor/require_vendored.rb +0 -1
  814. data/lib/puppet/vendor/semantic/lib/semantic.rb +4 -6
  815. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph.rb +2 -2
  816. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph_node.rb +2 -2
  817. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/module_release.rb +17 -5
  818. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/source.rb +2 -2
  819. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/unsatisfiable_graph.rb +2 -2
  820. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency.rb +7 -7
  821. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/gem_version.rb +3 -0
  822. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/version.rb +203 -0
  823. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/version_range.rb +758 -0
  824. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +9 -0
  825. data/lib/puppet/vendor/semantic_puppet/locales/config.yaml +21 -0
  826. data/lib/puppet/version.rb +7 -3
  827. data/lib/puppet.rb +104 -6
  828. data/lib/puppet_x.rb +7 -1
  829. data/locales/config.yaml +29 -0
  830. data/locales/puppet.pot +7995 -0
  831. data/man/man5/puppet.conf.5 +13 -35
  832. data/man/man8/puppet-agent.8 +2 -2
  833. data/man/man8/puppet-apply.8 +2 -2
  834. data/man/man8/puppet-ca.8 +2 -2
  835. data/man/man8/puppet-catalog.8 +2 -2
  836. data/man/man8/puppet-cert.8 +2 -2
  837. data/man/man8/puppet-certificate.8 +2 -2
  838. data/man/man8/puppet-certificate_request.8 +2 -2
  839. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  840. data/man/man8/puppet-config.8 +3 -3
  841. data/man/man8/puppet-describe.8 +1 -1
  842. data/man/man8/puppet-device.8 +1 -1
  843. data/man/man8/puppet-doc.8 +1 -1
  844. data/man/man8/puppet-epp.8 +2 -2
  845. data/man/man8/puppet-facts.8 +2 -2
  846. data/man/man8/puppet-filebucket.8 +2 -2
  847. data/man/man8/puppet-help.8 +2 -2
  848. data/man/man8/puppet-inspect.8 +2 -2
  849. data/man/man8/puppet-key.8 +2 -2
  850. data/man/man8/puppet-man.8 +2 -2
  851. data/man/man8/puppet-master.8 +2 -2
  852. data/man/man8/puppet-module.8 +9 -9
  853. data/man/man8/puppet-node.8 +2 -2
  854. data/man/man8/puppet-parser.8 +2 -2
  855. data/man/man8/puppet-plugin.8 +2 -2
  856. data/man/man8/puppet-report.8 +2 -2
  857. data/man/man8/puppet-resource.8 +2 -2
  858. data/man/man8/puppet-status.8 +3 -3
  859. data/man/man8/puppet.8 +1 -1
  860. data/spec/fixtures/module.tar.gz +0 -0
  861. data/spec/fixtures/unit/application/environments/production/data/common.yaml +22 -0
  862. data/spec/fixtures/unit/application/environments/production/environment.conf +1 -0
  863. data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
  864. data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
  865. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/environment/data.pp +10 -0
  866. data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
  867. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/data/bad.json +3 -0
  868. data/spec/fixtures/unit/data_providers/environments/{sample → hiera_bad_syntax_json}/environment.conf +1 -1
  869. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
  870. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
  871. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
  872. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
  873. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
  874. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
  875. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
  876. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
  877. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
  878. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
  879. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
  880. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
  881. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
  882. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
  883. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
  884. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
  885. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/third_utf8.json +3 -0
  886. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/utf8.yaml +3 -0
  887. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
  888. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
  889. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +22 -0
  890. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
  891. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +48 -0
  892. data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
  893. data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
  894. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
  895. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
  896. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -0
  897. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
  898. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
  899. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/environment.conf +2 -0
  900. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
  901. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
  902. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
  903. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +2 -0
  904. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
  905. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/server1.yaml +1 -0
  906. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/server2.yaml +1 -0
  907. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
  908. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
  909. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +20 -0
  910. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
  911. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/metadata.json +9 -0
  912. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
  913. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
  914. data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
  915. data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
  916. data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
  917. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
  918. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
  919. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
  920. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
  921. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
  922. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
  923. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
  924. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
  925. data/spec/fixtures/unit/data_providers/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +2 -1
  926. data/spec/fixtures/unit/data_providers/environments/production/modules/abc/manifests/init.pp +2 -1
  927. data/spec/fixtures/unit/data_providers/environments/production/modules/abc/metadata.json +9 -0
  928. data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/metadata.json +9 -0
  929. data/spec/fixtures/unit/functions/lookup/data/common.yaml +19 -0
  930. data/spec/fixtures/unit/functions/lookup_fixture/data/common.yaml +19 -0
  931. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/abc/metadata.json +9 -0
  932. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  933. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/bad_data/manifests/init.pp +2 -0
  934. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/bad_data/metadata.json +9 -0
  935. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/bca/metadata.json +9 -0
  936. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/data/empty.json +0 -0
  937. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/hiera.yaml +5 -0
  938. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/manifests/init.pp +2 -0
  939. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/metadata.json +9 -0
  940. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/data/empty_key.json +1 -0
  941. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/hiera.yaml +5 -0
  942. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/manifests/init.pp +2 -0
  943. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/metadata.json +9 -0
  944. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/data/empty_key.yaml +1 -0
  945. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/hiera.yaml +5 -0
  946. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/manifests/init.pp +2 -0
  947. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/metadata.json +9 -0
  948. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/data/empty.yaml +2 -0
  949. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  950. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  951. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/metadata.json +9 -0
  952. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/data/first.json +4 -0
  953. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/hiera.yaml +8 -0
  954. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
  955. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/metadata.json +9 -0
  956. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
  957. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/meta/manifests/init.pp +3 -0
  958. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/meta/metadata.json +9 -0
  959. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  960. data/spec/fixtures/unit/parser/lexer/subclass_name_duplication.pp +0 -0
  961. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
  962. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
  963. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/type/usee_type.rb +5 -0
  964. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
  965. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  966. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
  967. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
  968. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
  969. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
  970. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
  971. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
  972. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
  973. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
  974. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +87 -0
  975. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
  976. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  977. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  978. data/spec/fixtures/unit/pops/loaders/loaders/no_modules/manifests/site.pp +10 -0
  979. data/spec/fixtures/unit/pops/parser/lexer/subclass_name_duplication.pp +0 -0
  980. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  981. data/spec/fixtures/unit/provider/package/yum/yum-check-update-obsoletes.txt +195 -0
  982. data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
  983. data/spec/fixtures/unit/provider/service/smf/svcs.out +4 -3
  984. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  985. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
  986. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
  987. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -0
  988. 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
  989. 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
  990. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  991. 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
  992. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  993. 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
  994. 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
  995. data/spec/integration/agent/logging_spec.rb +15 -14
  996. data/spec/integration/application/apply_spec.rb +395 -34
  997. data/spec/integration/application/doc_spec.rb +0 -0
  998. data/spec/integration/application/lookup_spec.rb +155 -0
  999. data/spec/integration/configurer_spec.rb +1 -1
  1000. data/spec/integration/data_binding_spec.rb +195 -0
  1001. data/spec/integration/defaults_spec.rb +29 -4
  1002. data/spec/integration/directory_environments_spec.rb +16 -0
  1003. data/spec/integration/environments/default_manifest_spec.rb +16 -16
  1004. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  1005. data/spec/integration/environments/settings_spec.rb +32 -4
  1006. data/spec/integration/faces/ca_spec.rb +0 -0
  1007. data/spec/integration/faces/config_spec.rb +80 -0
  1008. data/spec/integration/faces/documentation_spec.rb +2 -2
  1009. data/spec/integration/file_bucket/file_spec.rb +2 -2
  1010. data/spec/integration/file_serving/fileset_spec.rb +0 -0
  1011. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -0
  1012. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  1013. data/spec/integration/indirector/catalog/compiler_spec.rb +0 -0
  1014. data/spec/integration/indirector/direct_file_server_spec.rb +0 -0
  1015. data/spec/integration/indirector/facts/facter_spec.rb +38 -0
  1016. data/spec/integration/indirector/file_content/file_server_spec.rb +1 -0
  1017. data/spec/integration/indirector/file_metadata/file_server_spec.rb +1 -0
  1018. data/spec/integration/indirector/node/ldap_spec.rb +0 -0
  1019. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  1020. data/spec/integration/network/formats_spec.rb +0 -0
  1021. data/spec/integration/network/http/api/indirected_routes_spec.rb +33 -0
  1022. data/spec/integration/node/environment_spec.rb +34 -0
  1023. data/spec/integration/node/facts_spec.rb +0 -0
  1024. data/spec/integration/node_spec.rb +0 -0
  1025. data/spec/integration/parser/catalog_spec.rb +15 -3
  1026. data/spec/integration/parser/class_spec.rb +6 -6
  1027. data/spec/integration/parser/collection_spec.rb +18 -0
  1028. data/spec/integration/parser/compiler_spec.rb +323 -920
  1029. data/spec/integration/parser/dynamic_scoping_spec.rb +66 -0
  1030. data/spec/integration/parser/parameter_defaults_spec.rb +358 -0
  1031. data/spec/integration/parser/pcore_resource_spec.rb +260 -0
  1032. data/spec/integration/parser/resource_expressions_spec.rb +9 -7
  1033. data/spec/integration/parser/scope_spec.rb +73 -6
  1034. data/spec/integration/parser/undef_param_spec.rb +9 -1
  1035. data/spec/integration/provider/mailalias/aliases_spec.rb +0 -0
  1036. data/spec/integration/provider/mount_spec.rb +23 -36
  1037. data/spec/integration/provider/service/init_spec.rb +0 -0
  1038. data/spec/integration/provider/service/windows_spec.rb +3 -2
  1039. data/spec/integration/provider/ssh_authorized_key_spec.rb +0 -0
  1040. data/spec/integration/provider/yumrepo_spec.rb +4 -1
  1041. data/spec/integration/reference/providers_spec.rb +0 -0
  1042. data/spec/integration/reports_spec.rb +0 -0
  1043. data/spec/integration/resource/catalog_spec.rb +1 -5
  1044. data/spec/integration/resource/type_collection_spec.rb +14 -0
  1045. data/spec/integration/ssl/autosign_spec.rb +18 -3
  1046. data/spec/integration/ssl/certificate_authority_spec.rb +0 -1
  1047. data/spec/integration/ssl/certificate_request_spec.rb +0 -1
  1048. data/spec/integration/ssl/certificate_revocation_list_spec.rb +0 -1
  1049. data/spec/integration/ssl/host_spec.rb +0 -1
  1050. data/spec/integration/ssl/key_spec.rb +104 -0
  1051. data/spec/integration/test/test_helper_spec.rb +32 -0
  1052. data/spec/integration/transaction/report_spec.rb +683 -1
  1053. data/spec/integration/transaction_spec.rb +127 -3
  1054. data/spec/integration/type/exec_spec.rb +0 -0
  1055. data/spec/integration/type/file_spec.rb +266 -12
  1056. data/spec/integration/type/package_spec.rb +79 -2
  1057. data/spec/integration/type/tidy_spec.rb +21 -9
  1058. data/spec/integration/type/user_spec.rb +13 -6
  1059. data/spec/integration/type_spec.rb +0 -0
  1060. data/spec/integration/util/autoload_spec.rb +0 -0
  1061. data/spec/integration/util/execution_spec.rb +30 -0
  1062. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  1063. data/spec/integration/util/settings_spec.rb +26 -0
  1064. data/spec/integration/util/windows/adsi_spec.rb +99 -0
  1065. data/spec/integration/util/windows/principal_spec.rb +250 -0
  1066. data/spec/integration/util/windows/process_spec.rb +35 -2
  1067. data/spec/{unit → integration}/util/windows/registry_spec.rb +92 -2
  1068. data/spec/integration/util/windows/security_spec.rb +61 -16
  1069. data/spec/integration/util/windows/user_spec.rb +27 -5
  1070. data/spec/integration/util_spec.rb +49 -27
  1071. data/spec/lib/matchers/include_in_order.rb +2 -3
  1072. data/spec/lib/matchers/json.rb +3 -3
  1073. data/spec/lib/puppet/face/1.0.0/huzzah.rb +1 -1
  1074. data/spec/lib/puppet/face/basetest.rb +1 -1
  1075. data/spec/lib/puppet/face/huzzah.rb +1 -1
  1076. data/spec/lib/puppet/face/version_matching.rb +1 -1
  1077. data/spec/lib/puppet/indirector_testing.rb +4 -0
  1078. data/spec/lib/puppet_spec/character_encoding.rb +12 -0
  1079. data/spec/lib/puppet_spec/compiler.rb +40 -4
  1080. data/spec/lib/puppet_spec/files.rb +16 -2
  1081. data/spec/lib/puppet_spec/fixtures.rb +0 -0
  1082. data/spec/lib/puppet_spec/language.rb +3 -1
  1083. data/spec/lib/puppet_spec/module_tool/shared_functions.rb +2 -2
  1084. data/spec/lib/puppet_spec/module_tool/stub_source.rb +1 -1
  1085. data/spec/lib/puppet_spec/modules.rb +2 -2
  1086. data/spec/lib/puppet_spec/network.rb +22 -14
  1087. data/spec/lib/puppet_spec/pops.rb +13 -0
  1088. data/spec/lib/puppet_spec/unindent.rb +5 -0
  1089. data/spec/lib/puppet_spec/verbose.rb +0 -0
  1090. data/spec/shared_behaviours/all_parsedfile_providers.rb +0 -0
  1091. data/spec/shared_behaviours/file_server_terminus.rb +0 -0
  1092. data/spec/shared_behaviours/file_serving.rb +0 -0
  1093. data/spec/shared_behaviours/iterative_functions.rb +9 -9
  1094. data/spec/shared_behaviours/memory_terminus.rb +0 -0
  1095. data/spec/shared_behaviours/path_parameters.rb +0 -0
  1096. data/spec/shared_behaviours/things_that_declare_options.rb +0 -0
  1097. data/spec/shared_contexts/types_setup.rb +143 -0
  1098. data/spec/shared_examples/rhel_package_provider.rb +356 -0
  1099. data/spec/spec_helper.rb +23 -13
  1100. data/spec/unit/agent/locker_spec.rb +4 -4
  1101. data/spec/unit/agent_spec.rb +23 -46
  1102. data/spec/unit/application/agent_spec.rb +22 -0
  1103. data/spec/unit/application/apply_spec.rb +59 -14
  1104. data/spec/unit/application/cert_spec.rb +20 -0
  1105. data/spec/unit/application/certificate_spec.rb +0 -0
  1106. data/spec/unit/application/config_spec.rb +0 -0
  1107. data/spec/unit/application/describe_spec.rb +19 -0
  1108. data/spec/unit/application/device_spec.rb +41 -2
  1109. data/spec/unit/application/doc_spec.rb +0 -0
  1110. data/spec/unit/application/face_base_spec.rb +22 -6
  1111. data/spec/unit/application/facts_spec.rb +0 -0
  1112. data/spec/unit/application/filebucket_spec.rb +88 -2
  1113. data/spec/unit/application/indirection_base_spec.rb +0 -0
  1114. data/spec/unit/application/lookup_spec.rb +532 -0
  1115. data/spec/unit/application/master_spec.rb +24 -8
  1116. data/spec/unit/application/resource_spec.rb +39 -1
  1117. data/spec/unit/application_spec.rb +3 -9
  1118. data/spec/unit/capability_spec.rb +412 -0
  1119. data/spec/unit/configurer/downloader_factory_spec.rb +0 -0
  1120. data/spec/unit/configurer/downloader_spec.rb +5 -5
  1121. data/spec/unit/configurer/fact_handler_spec.rb +76 -20
  1122. data/spec/unit/configurer/plugin_handler_spec.rb +5 -8
  1123. data/spec/unit/configurer_spec.rb +372 -58
  1124. data/spec/unit/confine/exists_spec.rb +0 -0
  1125. data/spec/unit/confine/false_spec.rb +0 -0
  1126. data/spec/unit/confine/feature_spec.rb +0 -0
  1127. data/spec/unit/confine/true_spec.rb +0 -0
  1128. data/spec/unit/confine/variable_spec.rb +0 -0
  1129. data/spec/unit/confine_collection_spec.rb +0 -0
  1130. data/spec/unit/confine_spec.rb +0 -0
  1131. data/spec/unit/confiner_spec.rb +0 -0
  1132. data/spec/unit/context/trusted_information_spec.rb +24 -1
  1133. data/spec/unit/daemon_spec.rb +18 -8
  1134. data/spec/unit/data_providers/function_data_provider_spec.rb +21 -3
  1135. data/spec/unit/data_providers/hiera_data_provider_spec.rb +361 -0
  1136. data/spec/unit/defaults_spec.rb +34 -17
  1137. data/spec/unit/environments_spec.rb +26 -4
  1138. data/spec/unit/etc_spec.rb +442 -0
  1139. data/spec/unit/external/pson_spec.rb +0 -0
  1140. data/spec/unit/face/ca_spec.rb +10 -0
  1141. data/spec/unit/face/catalog_spec.rb +0 -0
  1142. data/spec/unit/face/certificate_request_spec.rb +10 -0
  1143. data/spec/unit/face/certificate_revocation_list_spec.rb +10 -0
  1144. data/spec/unit/face/certificate_spec.rb +10 -2
  1145. data/spec/unit/face/config_spec.rb +47 -0
  1146. data/spec/unit/face/epp_face_spec.rb +24 -5
  1147. data/spec/unit/face/facts_spec.rb +0 -0
  1148. data/spec/unit/face/generate_spec.rb +230 -0
  1149. data/spec/unit/face/help_spec.rb +70 -0
  1150. data/spec/unit/face/key_spec.rb +10 -0
  1151. data/spec/unit/face/module/list_spec.rb +60 -0
  1152. data/spec/unit/face/module/search_spec.rb +1 -1
  1153. data/spec/unit/face/node_spec.rb +1 -1
  1154. data/spec/unit/face/parser_spec.rb +49 -2
  1155. data/spec/unit/face/plugin_spec.rb +29 -4
  1156. data/spec/unit/face/status_spec.rb +10 -0
  1157. data/spec/unit/face_spec.rb +0 -0
  1158. data/spec/unit/file_bucket/dipper_spec.rb +210 -1
  1159. data/spec/unit/file_bucket/file_spec.rb +3 -3
  1160. data/spec/unit/file_serving/base_spec.rb +0 -0
  1161. data/spec/unit/file_serving/configuration/parser_spec.rb +25 -30
  1162. data/spec/unit/file_serving/configuration_spec.rb +1 -1
  1163. data/spec/unit/file_serving/content_spec.rb +0 -0
  1164. data/spec/unit/file_serving/fileset_spec.rb +0 -0
  1165. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  1166. data/spec/unit/file_serving/metadata_spec.rb +84 -8
  1167. data/spec/unit/file_serving/mount/file_spec.rb +0 -0
  1168. data/spec/unit/file_serving/mount/modules_spec.rb +0 -0
  1169. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +0 -0
  1170. data/spec/unit/file_serving/mount/plugins_spec.rb +0 -0
  1171. data/spec/unit/file_serving/mount_spec.rb +0 -0
  1172. data/spec/unit/file_serving/terminus_helper_spec.rb +0 -0
  1173. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  1174. data/spec/unit/file_system/uniquefile_spec.rb +20 -0
  1175. data/spec/unit/file_system_spec.rb +335 -6
  1176. data/spec/unit/forge/forge_spec.rb +112 -0
  1177. data/spec/unit/forge/repository_spec.rb +31 -4
  1178. data/spec/unit/functions/annotate_spec.rb +175 -0
  1179. data/spec/unit/functions/assert_type_spec.rb +48 -8
  1180. data/spec/unit/functions/binary_file_spec.rb +46 -0
  1181. data/spec/unit/functions/break_spec.rb +117 -0
  1182. data/spec/unit/functions/call_spec.rb +77 -0
  1183. data/spec/unit/{parser/functions → functions}/contain_spec.rb +69 -4
  1184. data/spec/unit/functions/defined_spec.rb +2 -2
  1185. data/spec/unit/functions/dig_spec.rb +58 -0
  1186. data/spec/unit/functions/epp_spec.rb +17 -9
  1187. data/spec/unit/functions/filter_spec.rb +18 -0
  1188. data/spec/unit/functions/find_file_spec.rb +69 -0
  1189. data/spec/unit/functions/hiera_spec.rb +447 -47
  1190. data/spec/unit/functions/include_spec.rb +175 -0
  1191. data/spec/unit/functions/inline_epp_spec.rb +4 -4
  1192. data/spec/unit/functions/lest_spec.rb +34 -0
  1193. data/spec/unit/functions/logging_spec.rb +54 -0
  1194. data/spec/unit/functions/lookup_fixture_spec.rb +688 -0
  1195. data/spec/unit/functions/lookup_spec.rb +3108 -264
  1196. data/spec/unit/functions/match_spec.rb +2 -2
  1197. data/spec/unit/functions/new_spec.rb +694 -0
  1198. data/spec/unit/functions/next_spec.rb +93 -0
  1199. data/spec/unit/functions/regsubst_spec.rb +26 -9
  1200. data/spec/unit/functions/require_spec.rb +83 -0
  1201. data/spec/unit/functions/return_spec.rb +105 -0
  1202. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  1203. data/spec/unit/functions/scanf_spec.rb +1 -1
  1204. data/spec/unit/{parser/functions → functions}/shared.rb +15 -12
  1205. data/spec/unit/functions/split_spec.rb +3 -3
  1206. data/spec/unit/functions/step_spec.rb +113 -0
  1207. data/spec/unit/functions/strftime_spec.rb +152 -0
  1208. data/spec/unit/functions/then_spec.rb +40 -0
  1209. data/spec/unit/functions/type_spec.rb +35 -0
  1210. data/spec/unit/functions/unique_spec.rb +111 -0
  1211. data/spec/unit/functions/unwrap_spec.rb +29 -0
  1212. data/spec/unit/functions/versioncmp_spec.rb +36 -0
  1213. data/spec/unit/functions4_spec.rb +265 -115
  1214. data/spec/unit/graph/rb_tree_map_spec.rb +1 -1
  1215. data/spec/unit/graph/relationship_graph_spec.rb +0 -0
  1216. data/spec/unit/graph/sequential_prioritizer_spec.rb +1 -1
  1217. data/spec/unit/graph/simple_graph_spec.rb +59 -56
  1218. data/spec/unit/hiera/scope_spec.rb +6 -3
  1219. data/spec/unit/hiera_puppet_spec.rb +49 -8
  1220. data/spec/unit/indirector/catalog/compiler_spec.rb +887 -83
  1221. data/spec/unit/indirector/catalog/json_spec.rb +50 -1
  1222. data/spec/unit/indirector/catalog/msgpack_spec.rb +0 -0
  1223. data/spec/unit/indirector/catalog/rest_spec.rb +0 -0
  1224. data/spec/unit/indirector/catalog/store_configs_spec.rb +0 -0
  1225. data/spec/unit/indirector/catalog/yaml_spec.rb +0 -0
  1226. data/spec/unit/indirector/certificate/ca_spec.rb +0 -0
  1227. data/spec/unit/indirector/certificate/disabled_ca_spec.rb +0 -0
  1228. data/spec/unit/indirector/certificate/file_spec.rb +0 -0
  1229. data/spec/unit/indirector/certificate/rest_spec.rb +0 -0
  1230. data/spec/unit/indirector/certificate_request/ca_spec.rb +0 -0
  1231. data/spec/unit/indirector/certificate_request/disabled_ca_spec.rb +0 -0
  1232. data/spec/unit/indirector/certificate_request/file_spec.rb +0 -0
  1233. data/spec/unit/indirector/certificate_request/rest_spec.rb +0 -0
  1234. data/spec/unit/indirector/certificate_revocation_list/ca_spec.rb +0 -0
  1235. data/spec/unit/indirector/certificate_revocation_list/disabled_ca_spec.rb +0 -0
  1236. data/spec/unit/indirector/certificate_revocation_list/file_spec.rb +0 -0
  1237. data/spec/unit/indirector/certificate_revocation_list/rest_spec.rb +0 -0
  1238. data/spec/unit/indirector/certificate_status/file_spec.rb +0 -0
  1239. data/spec/unit/indirector/certificate_status/rest_spec.rb +0 -0
  1240. data/spec/unit/indirector/code_spec.rb +0 -0
  1241. data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
  1242. data/spec/unit/indirector/direct_file_server_spec.rb +0 -0
  1243. data/spec/unit/indirector/envelope_spec.rb +0 -0
  1244. data/spec/unit/indirector/exec_spec.rb +0 -0
  1245. data/spec/unit/indirector/face_spec.rb +10 -2
  1246. data/spec/unit/indirector/facts/facter_spec.rb +4 -12
  1247. data/spec/unit/indirector/facts/network_device_spec.rb +0 -0
  1248. data/spec/unit/indirector/facts/store_configs_spec.rb +0 -0
  1249. data/spec/unit/indirector/facts/yaml_spec.rb +0 -0
  1250. data/spec/unit/indirector/file_bucket_file/file_spec.rb +86 -4
  1251. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +0 -0
  1252. data/spec/unit/indirector/file_content/file_server_spec.rb +0 -0
  1253. data/spec/unit/indirector/file_content/file_spec.rb +0 -0
  1254. data/spec/unit/indirector/file_content/rest_spec.rb +0 -0
  1255. data/spec/unit/indirector/file_metadata/file_server_spec.rb +0 -0
  1256. data/spec/unit/indirector/file_metadata/file_spec.rb +0 -0
  1257. data/spec/unit/indirector/file_metadata/rest_spec.rb +0 -0
  1258. data/spec/unit/indirector/file_server_spec.rb +17 -2
  1259. data/spec/unit/indirector/indirection_spec.rb +14 -38
  1260. data/spec/unit/indirector/json_spec.rb +27 -6
  1261. data/spec/unit/indirector/key/ca_spec.rb +0 -0
  1262. data/spec/unit/indirector/key/disabled_ca_spec.rb +0 -0
  1263. data/spec/unit/indirector/key/file_spec.rb +1 -1
  1264. data/spec/unit/indirector/ldap_spec.rb +0 -0
  1265. data/spec/unit/indirector/memory_spec.rb +0 -0
  1266. data/spec/unit/indirector/msgpack_spec.rb +11 -1
  1267. data/spec/unit/indirector/node/exec_spec.rb +12 -12
  1268. data/spec/unit/indirector/node/ldap_spec.rb +29 -8
  1269. data/spec/unit/indirector/node/memory_spec.rb +0 -0
  1270. data/spec/unit/indirector/node/msgpack_spec.rb +0 -0
  1271. data/spec/unit/indirector/node/plain_spec.rb +16 -6
  1272. data/spec/unit/indirector/node/rest_spec.rb +0 -0
  1273. data/spec/unit/indirector/node/store_configs_spec.rb +0 -0
  1274. data/spec/unit/indirector/node/write_only_yaml_spec.rb +12 -0
  1275. data/spec/unit/indirector/node/yaml_spec.rb +0 -0
  1276. data/spec/unit/indirector/plain_spec.rb +0 -0
  1277. data/spec/unit/indirector/report/msgpack_spec.rb +0 -0
  1278. data/spec/unit/indirector/report/processor_spec.rb +2 -2
  1279. data/spec/unit/indirector/report/rest_spec.rb +29 -3
  1280. data/spec/unit/indirector/report/yaml_spec.rb +0 -0
  1281. data/spec/unit/indirector/request_spec.rb +32 -12
  1282. data/spec/unit/indirector/resource/ral_spec.rb +0 -0
  1283. data/spec/unit/indirector/resource/store_configs_spec.rb +0 -0
  1284. data/spec/unit/indirector/rest_spec.rb +158 -18
  1285. data/spec/unit/indirector/ssl_file_spec.rb +4 -4
  1286. data/spec/unit/indirector/status/rest_spec.rb +0 -0
  1287. data/spec/unit/indirector/store_configs_spec.rb +0 -0
  1288. data/spec/unit/indirector/terminus_spec.rb +0 -0
  1289. data/spec/unit/indirector/yaml_spec.rb +1 -1
  1290. data/spec/unit/indirector_spec.rb +0 -0
  1291. data/spec/unit/info_service_spec.rb +298 -0
  1292. data/spec/unit/interface/action_builder_spec.rb +0 -0
  1293. data/spec/unit/interface/action_manager_spec.rb +0 -0
  1294. data/spec/unit/interface/action_spec.rb +0 -0
  1295. data/spec/unit/interface/documentation_spec.rb +0 -0
  1296. data/spec/unit/interface/face_collection_spec.rb +7 -7
  1297. data/spec/unit/interface/option_builder_spec.rb +0 -0
  1298. data/spec/unit/interface/option_spec.rb +0 -0
  1299. data/spec/unit/interface_spec.rb +27 -0
  1300. data/spec/unit/man_spec.rb +1 -1
  1301. data/spec/unit/module_spec.rb +126 -74
  1302. data/spec/unit/module_tool/application_spec.rb +1 -1
  1303. data/spec/unit/module_tool/applications/builder_spec.rb +44 -9
  1304. data/spec/unit/module_tool/applications/installer_spec.rb +11 -3
  1305. data/spec/unit/module_tool/applications/unpacker_spec.rb +2 -1
  1306. data/spec/unit/module_tool/applications/upgrader_spec.rb +9 -2
  1307. data/spec/unit/module_tool/installed_modules_spec.rb +6 -6
  1308. data/spec/unit/module_tool/metadata_spec.rb +31 -2
  1309. data/spec/unit/module_tool/tar/mini_spec.rb +3 -3
  1310. data/spec/unit/module_tool/tar_spec.rb +16 -10
  1311. data/spec/unit/module_tool_spec.rb +3 -3
  1312. data/spec/unit/network/auth_config_parser_spec.rb +16 -0
  1313. data/spec/unit/network/authconfig_spec.rb +62 -32
  1314. data/spec/unit/network/authorization_spec.rb +30 -2
  1315. data/spec/unit/network/authstore_spec.rb +2 -2
  1316. data/spec/unit/network/format_handler_spec.rb +11 -11
  1317. data/spec/unit/network/format_spec.rb +9 -0
  1318. data/spec/unit/network/formats_spec.rb +322 -138
  1319. data/spec/unit/network/http/api/indirected_routes_spec.rb +125 -116
  1320. data/spec/unit/network/http/api/master/v3/environment_spec.rb +186 -0
  1321. data/spec/unit/network/http/api/master/v3_spec.rb +23 -5
  1322. data/spec/unit/network/http/api_spec.rb +1 -1
  1323. data/spec/unit/network/http/compression_spec.rb +132 -84
  1324. data/spec/unit/network/http/connection_spec.rb +25 -19
  1325. data/spec/unit/network/http/error_spec.rb +1 -1
  1326. data/spec/unit/network/http/factory_spec.rb +18 -0
  1327. data/spec/unit/network/http/handler_spec.rb +17 -18
  1328. data/spec/unit/network/http/nocache_pool_spec.rb +0 -0
  1329. data/spec/unit/network/http/pool_spec.rb +30 -0
  1330. data/spec/unit/network/http/rack/rest_spec.rb +9 -2
  1331. data/spec/unit/network/http/rack_spec.rb +0 -0
  1332. data/spec/unit/network/http/request_spec.rb +110 -0
  1333. data/spec/unit/network/http/response_spec.rb +108 -0
  1334. data/spec/unit/network/http/session_spec.rb +0 -0
  1335. data/spec/unit/network/http/site_spec.rb +0 -0
  1336. data/spec/unit/network/http/webrick/rest_spec.rb +0 -0
  1337. data/spec/unit/network/http/webrick_spec.rb +1 -1
  1338. data/spec/unit/network/http_pool_spec.rb +0 -0
  1339. data/spec/unit/network/http_spec.rb +0 -0
  1340. data/spec/unit/network/resolver_spec.rb +0 -0
  1341. data/spec/unit/network/rights_spec.rb +4 -4
  1342. data/spec/unit/network/server_spec.rb +0 -0
  1343. data/spec/unit/node/environment_spec.rb +10 -0
  1344. data/spec/unit/node/facts_spec.rb +13 -13
  1345. data/spec/unit/node_spec.rb +68 -10
  1346. data/spec/unit/other/selinux_spec.rb +0 -0
  1347. data/spec/unit/parameter/path_spec.rb +0 -0
  1348. data/spec/unit/parameter/value_collection_spec.rb +0 -0
  1349. data/spec/unit/parameter/value_spec.rb +0 -0
  1350. data/spec/unit/parameter_spec.rb +84 -5
  1351. data/spec/unit/parser/ast/leaf_spec.rb +1 -1
  1352. data/spec/unit/parser/compiler_spec.rb +135 -34
  1353. data/spec/unit/parser/environment_compiler_spec.rb +686 -0
  1354. data/spec/unit/parser/files_spec.rb +0 -0
  1355. data/spec/unit/parser/functions/create_resources_spec.rb +132 -10
  1356. data/spec/unit/parser/functions/digest_spec.rb +0 -0
  1357. data/spec/unit/parser/functions/fail_spec.rb +0 -0
  1358. data/spec/unit/parser/functions/file_spec.rb +0 -0
  1359. data/spec/unit/parser/functions/fqdn_rand_spec.rb +6 -2
  1360. data/spec/unit/parser/functions/generate_spec.rb +3 -12
  1361. data/spec/unit/parser/functions/hiera_array_spec.rb +1 -1
  1362. data/spec/unit/parser/functions/hiera_hash_spec.rb +1 -1
  1363. data/spec/unit/parser/functions/hiera_include_spec.rb +1 -1
  1364. data/spec/unit/parser/functions/hiera_spec.rb +1 -1
  1365. data/spec/unit/parser/functions/inline_template_spec.rb +0 -0
  1366. data/spec/unit/parser/functions/lookup_spec.rb +1 -1
  1367. data/spec/unit/parser/functions/realize_spec.rb +0 -0
  1368. data/spec/unit/parser/functions/regsubst_spec.rb +1 -1
  1369. data/spec/unit/parser/functions/scanf_spec.rb +0 -0
  1370. data/spec/unit/parser/functions/shellquote_spec.rb +0 -0
  1371. data/spec/unit/parser/functions/split_spec.rb +1 -1
  1372. data/spec/unit/parser/functions/sprintf_spec.rb +0 -0
  1373. data/spec/unit/parser/functions/tag_spec.rb +0 -0
  1374. data/spec/unit/parser/functions/template_spec.rb +0 -0
  1375. data/spec/unit/parser/functions/versioncmp_spec.rb +0 -0
  1376. data/spec/unit/parser/functions_spec.rb +0 -0
  1377. data/spec/unit/parser/relationship_spec.rb +0 -0
  1378. data/spec/unit/parser/resource/param_spec.rb +0 -0
  1379. data/spec/unit/parser/resource_spec.rb +115 -54
  1380. data/spec/unit/parser/scope_spec.rb +83 -85
  1381. data/spec/unit/parser/templatewrapper_spec.rb +0 -0
  1382. data/spec/unit/parser/type_loader_spec.rb +0 -0
  1383. data/spec/unit/pops/benchmark_spec.rb +8 -26
  1384. data/spec/unit/pops/containment_spec.rb +0 -26
  1385. data/spec/unit/pops/evaluator/access_ops_spec.rb +198 -102
  1386. data/spec/unit/pops/evaluator/arithmetic_ops_spec.rb +223 -0
  1387. data/spec/unit/pops/evaluator/basic_expressions_spec.rb +5 -6
  1388. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +29 -26
  1389. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +135 -30
  1390. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +29 -25
  1391. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  1392. data/spec/unit/pops/evaluator/literal_evaluator_spec.rb +43 -0
  1393. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +168 -0
  1394. data/spec/unit/pops/evaluator/string_interpolation_spec.rb +10 -10
  1395. data/spec/unit/pops/evaluator/variables_spec.rb +2 -2
  1396. data/spec/unit/pops/factory_rspec_helper.rb +0 -4
  1397. data/spec/unit/pops/factory_spec.rb +83 -83
  1398. data/spec/unit/pops/label_provider_spec.rb +5 -1
  1399. data/spec/unit/pops/loaders/dependency_loader_spec.rb +66 -1
  1400. data/spec/unit/pops/loaders/environment_loader_spec.rb +172 -0
  1401. data/spec/unit/pops/loaders/loader_paths_spec.rb +1 -1
  1402. data/spec/unit/pops/loaders/loaders_spec.rb +454 -28
  1403. data/spec/unit/pops/loaders/module_loaders_spec.rb +63 -2
  1404. data/spec/unit/pops/loaders/static_loader_spec.rb +80 -19
  1405. data/spec/unit/pops/lookup/context_spec.rb +334 -0
  1406. data/spec/unit/pops/lookup/interpolation_spec.rb +373 -0
  1407. data/spec/unit/pops/lookup/lookup_spec.rb +294 -0
  1408. data/spec/unit/pops/merge_strategy_spec.rb +18 -0
  1409. data/spec/unit/pops/model/model_spec.rb +10 -10
  1410. data/spec/unit/pops/parser/epp_parser_spec.rb +1 -1
  1411. data/spec/unit/pops/parser/lexer2_spec.rb +239 -10
  1412. data/spec/unit/pops/parser/locator_spec.rb +24 -0
  1413. data/spec/unit/pops/parser/parse_application_spec.rb +32 -0
  1414. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +35 -4
  1415. data/spec/unit/pops/parser/parse_calls_spec.rb +25 -0
  1416. data/spec/unit/pops/parser/parse_capabilities_spec.rb +37 -0
  1417. data/spec/unit/pops/parser/parse_containers_spec.rb +17 -19
  1418. data/spec/unit/pops/parser/parse_functions_spec.rb +19 -0
  1419. data/spec/unit/pops/parser/parse_lambda_spec.rb +19 -0
  1420. data/spec/unit/pops/parser/parse_site_spec.rb +48 -0
  1421. data/spec/unit/pops/parser/parser_rspec_helper.rb +6 -0
  1422. data/spec/unit/pops/parser/parser_spec.rb +32 -6
  1423. data/spec/unit/pops/puppet_stack_spec.rb +79 -0
  1424. data/spec/unit/pops/resource/resource_type_impl_spec.rb +109 -0
  1425. data/spec/unit/pops/serialization/packer_spec.rb +154 -0
  1426. data/spec/unit/pops/serialization/serialization_spec.rb +426 -0
  1427. data/spec/unit/pops/serialization/to_from_hr_spec.rb +494 -0
  1428. data/spec/unit/pops/time/timespan_spec.rb +121 -0
  1429. data/spec/unit/pops/time/timestamp_spec.rb +13 -0
  1430. data/spec/unit/pops/types/enumeration_spec.rb +13 -12
  1431. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  1432. data/spec/unit/pops/types/p_binary_type_spec.rb +243 -0
  1433. data/spec/unit/pops/types/p_object_type_spec.rb +1253 -0
  1434. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +322 -0
  1435. data/spec/unit/pops/types/p_sensitive_type_spec.rb +169 -0
  1436. data/spec/unit/pops/types/p_timespan_type_spec.rb +273 -0
  1437. data/spec/unit/pops/types/p_timestamp_type_spec.rb +311 -0
  1438. data/spec/unit/pops/types/p_type_set_type_spec.rb +445 -0
  1439. data/spec/unit/pops/types/recursion_guard_spec.rb +93 -0
  1440. data/spec/unit/pops/types/ruby_generator_spec.rb +662 -0
  1441. data/spec/unit/pops/types/string_converter_spec.rb +1132 -0
  1442. data/spec/unit/pops/types/type_acceptor_spec.rb +106 -0
  1443. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  1444. data/spec/unit/pops/types/type_calculator_spec.rb +1122 -967
  1445. data/spec/unit/pops/types/type_factory_spec.rb +137 -96
  1446. data/spec/unit/pops/types/type_formatter_spec.rb +409 -0
  1447. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +228 -0
  1448. data/spec/unit/pops/types/type_parser_spec.rb +207 -40
  1449. data/spec/unit/pops/types/types_spec.rb +650 -0
  1450. data/spec/unit/pops/validator/validator_spec.rb +395 -21
  1451. data/spec/unit/pops/visitor_spec.rb +1 -1
  1452. data/spec/unit/property/ensure_spec.rb +0 -0
  1453. data/spec/unit/property/keyvalue_spec.rb +0 -0
  1454. data/spec/unit/property/list_spec.rb +2 -2
  1455. data/spec/unit/property/ordered_list_spec.rb +0 -0
  1456. data/spec/unit/property_spec.rb +49 -12
  1457. data/spec/unit/provider/augeas/augeas_spec.rb +60 -1
  1458. data/spec/unit/provider/cisco_spec.rb +0 -0
  1459. data/spec/unit/provider/command_spec.rb +0 -0
  1460. data/spec/unit/provider/cron/crontab_spec.rb +0 -0
  1461. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  1462. data/spec/unit/provider/exec/posix_spec.rb +0 -0
  1463. data/spec/unit/provider/exec/shell_spec.rb +0 -0
  1464. data/spec/unit/provider/exec/windows_spec.rb +0 -0
  1465. data/spec/unit/provider/exec_spec.rb +0 -0
  1466. data/spec/unit/provider/file/posix_spec.rb +0 -0
  1467. data/spec/unit/provider/file/windows_spec.rb +0 -0
  1468. data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
  1469. data/spec/unit/provider/group/groupadd_spec.rb +0 -0
  1470. data/spec/unit/provider/group/ldap_spec.rb +0 -0
  1471. data/spec/unit/provider/group/pw_spec.rb +0 -0
  1472. data/spec/unit/provider/group/windows_adsi_spec.rb +31 -9
  1473. data/spec/unit/provider/host/parsed_spec.rb +0 -0
  1474. data/spec/unit/provider/interface/cisco_spec.rb +0 -0
  1475. data/spec/unit/provider/ldap_spec.rb +0 -0
  1476. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  1477. data/spec/unit/provider/mcx/mcxcontent_spec.rb +0 -0
  1478. data/spec/unit/provider/mount/parsed_spec.rb +0 -0
  1479. data/spec/unit/provider/mount_spec.rb +0 -0
  1480. data/spec/unit/provider/naginator_spec.rb +0 -0
  1481. data/spec/unit/provider/nameservice/directoryservice_spec.rb +16 -19
  1482. data/spec/unit/provider/nameservice_spec.rb +167 -15
  1483. data/spec/unit/provider/network_device_spec.rb +0 -0
  1484. data/spec/unit/provider/package/aix_spec.rb +0 -0
  1485. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  1486. data/spec/unit/provider/package/apt_spec.rb +0 -0
  1487. data/spec/unit/provider/package/aptitude_spec.rb +0 -0
  1488. data/spec/unit/provider/package/aptrpm_spec.rb +3 -3
  1489. data/spec/unit/provider/package/base_spec.rb +18 -0
  1490. data/spec/unit/provider/package/dnf_spec.rb +30 -0
  1491. data/spec/unit/provider/package/dpkg_spec.rb +0 -0
  1492. data/spec/unit/provider/package/freebsd_spec.rb +0 -0
  1493. data/spec/unit/provider/package/gem_spec.rb +77 -0
  1494. data/spec/unit/provider/package/hpux_spec.rb +0 -0
  1495. data/spec/unit/provider/package/macports_spec.rb +0 -0
  1496. data/spec/unit/provider/package/nim_spec.rb +6 -6
  1497. data/spec/unit/provider/package/openbsd_spec.rb +0 -0
  1498. data/spec/unit/provider/package/opkg_spec.rb +0 -0
  1499. data/spec/unit/provider/package/pacman_spec.rb +55 -0
  1500. data/spec/unit/provider/package/pip3_spec.rb +22 -0
  1501. data/spec/unit/provider/package/pip_spec.rb +164 -46
  1502. data/spec/unit/provider/package/pkg_spec.rb +139 -99
  1503. data/spec/unit/provider/package/pkgdmg_spec.rb +32 -8
  1504. data/spec/unit/provider/package/pkgin_spec.rb +23 -13
  1505. data/spec/unit/provider/package/pkgng_spec.rb +16 -2
  1506. data/spec/unit/provider/package/pkgutil_spec.rb +0 -0
  1507. data/spec/unit/provider/package/portage_spec.rb +150 -8
  1508. data/spec/unit/provider/package/puppet_gem_spec.rb +0 -0
  1509. data/spec/unit/provider/package/rpm_spec.rb +183 -12
  1510. data/spec/unit/provider/package/sun_spec.rb +0 -0
  1511. data/spec/unit/provider/package/tdnf_spec.rb +18 -0
  1512. data/spec/unit/provider/package/windows/package_spec.rb +45 -1
  1513. data/spec/unit/provider/package/windows_spec.rb +8 -2
  1514. data/spec/unit/provider/package/yum_spec.rb +29 -466
  1515. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  1516. data/spec/unit/provider/parsedfile_spec.rb +0 -0
  1517. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +211 -0
  1518. data/spec/unit/provider/selboolean_spec.rb +0 -0
  1519. data/spec/unit/provider/selmodule_spec.rb +0 -0
  1520. data/spec/unit/provider/service/base_spec.rb +6 -0
  1521. data/spec/unit/provider/service/bsd_spec.rb +130 -0
  1522. data/spec/unit/provider/service/daemontools_spec.rb +0 -0
  1523. data/spec/unit/provider/service/debian_spec.rb +34 -4
  1524. data/spec/unit/provider/service/freebsd_spec.rb +16 -0
  1525. data/spec/unit/provider/service/gentoo_spec.rb +7 -0
  1526. data/spec/unit/provider/service/init_spec.rb +24 -1
  1527. data/spec/unit/provider/service/launchd_spec.rb +124 -25
  1528. data/spec/unit/provider/service/openbsd_spec.rb +0 -0
  1529. data/spec/unit/provider/service/openrc_spec.rb +7 -0
  1530. data/spec/unit/provider/service/openwrt_spec.rb +0 -0
  1531. data/spec/unit/provider/service/rcng_spec.rb +41 -0
  1532. data/spec/unit/provider/service/redhat_spec.rb +8 -1
  1533. data/spec/unit/provider/service/runit_spec.rb +0 -0
  1534. data/spec/unit/provider/service/smf_spec.rb +77 -13
  1535. data/spec/unit/provider/service/src_spec.rb +31 -4
  1536. data/spec/unit/provider/service/systemd_spec.rb +228 -39
  1537. data/spec/unit/provider/service/upstart_spec.rb +64 -0
  1538. data/spec/unit/provider/service/windows_spec.rb +0 -0
  1539. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +2 -1
  1540. data/spec/unit/provider/sshkey/parsed_spec.rb +42 -18
  1541. data/spec/unit/provider/user/aix_spec.rb +7 -0
  1542. data/spec/unit/provider/user/directoryservice_spec.rb +171 -90
  1543. data/spec/unit/provider/user/hpux_spec.rb +0 -0
  1544. data/spec/unit/provider/user/ldap_spec.rb +0 -0
  1545. data/spec/unit/provider/user/openbsd_spec.rb +0 -0
  1546. data/spec/unit/provider/user/pw_spec.rb +0 -0
  1547. data/spec/unit/provider/user/user_role_add_spec.rb +0 -0
  1548. data/spec/unit/provider/user/useradd_spec.rb +14 -0
  1549. data/spec/unit/provider/user/windows_adsi_spec.rb +30 -6
  1550. data/spec/unit/provider/vlan/cisco_spec.rb +0 -0
  1551. data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
  1552. data/spec/unit/provider/zfs/zfs_spec.rb +0 -0
  1553. data/spec/unit/provider/zone/solaris_spec.rb +64 -12
  1554. data/spec/unit/provider/zpool/zpool_spec.rb +0 -0
  1555. data/spec/unit/provider_spec.rb +0 -0
  1556. data/spec/unit/puppet_spec.rb +16 -3
  1557. data/spec/unit/relationship_spec.rb +15 -36
  1558. data/spec/unit/reports/http_spec.rb +11 -8
  1559. data/spec/unit/reports/store_spec.rb +0 -0
  1560. data/spec/unit/reports_spec.rb +10 -0
  1561. data/spec/unit/resource/capability_finder_spec.rb +147 -0
  1562. data/spec/unit/resource/catalog_spec.rb +294 -41
  1563. data/spec/unit/resource/status_spec.rb +114 -103
  1564. data/spec/unit/resource/type_collection_spec.rb +28 -7
  1565. data/spec/unit/resource/type_spec.rb +172 -82
  1566. data/spec/unit/resource_spec.rb +161 -76
  1567. data/spec/unit/settings/directory_setting_spec.rb +0 -0
  1568. data/spec/unit/settings/duration_setting_spec.rb +0 -0
  1569. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  1570. data/spec/unit/settings/file_setting_spec.rb +37 -0
  1571. data/spec/unit/settings/ini_file_spec.rb +58 -1
  1572. data/spec/unit/settings/path_setting_spec.rb +0 -0
  1573. data/spec/unit/settings/priority_setting_spec.rb +0 -0
  1574. data/spec/unit/settings_spec.rb +109 -5
  1575. data/spec/unit/ssl/base_spec.rb +9 -0
  1576. data/spec/unit/ssl/certificate_authority/interface_spec.rb +180 -13
  1577. data/spec/unit/ssl/certificate_authority_spec.rb +82 -28
  1578. data/spec/unit/ssl/certificate_factory_spec.rb +2 -2
  1579. data/spec/unit/ssl/certificate_request_attributes_spec.rb +6 -0
  1580. data/spec/unit/ssl/certificate_request_spec.rb +4 -5
  1581. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  1582. data/spec/unit/ssl/certificate_spec.rb +1 -1
  1583. data/spec/unit/ssl/configuration_spec.rb +11 -2
  1584. data/spec/unit/ssl/host_spec.rb +37 -37
  1585. data/spec/unit/ssl/inventory_spec.rb +27 -3
  1586. data/spec/unit/ssl/key_spec.rb +7 -7
  1587. data/spec/unit/ssl/oids_spec.rb +24 -13
  1588. data/spec/unit/status_spec.rb +7 -7
  1589. data/spec/unit/transaction/additional_resource_generator_spec.rb +160 -31
  1590. data/spec/unit/transaction/event_manager_spec.rb +0 -0
  1591. data/spec/unit/transaction/event_spec.rb +18 -13
  1592. data/spec/unit/transaction/persistence_spec.rb +178 -0
  1593. data/spec/unit/transaction/report_spec.rb +214 -40
  1594. data/spec/unit/transaction/resource_harness_spec.rb +84 -40
  1595. data/spec/unit/transaction_spec.rb +102 -7
  1596. data/spec/unit/type/augeas_spec.rb +0 -0
  1597. data/spec/unit/type/component_spec.rb +0 -0
  1598. data/spec/unit/type/computer_spec.rb +0 -0
  1599. data/spec/unit/type/cron_spec.rb +0 -0
  1600. data/spec/unit/type/exec_spec.rb +57 -12
  1601. data/spec/unit/type/file/checksum_spec.rb +6 -0
  1602. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  1603. data/spec/unit/type/file/content_spec.rb +59 -208
  1604. data/spec/unit/type/file/ctime_spec.rb +0 -0
  1605. data/spec/unit/type/file/ensure_spec.rb +0 -0
  1606. data/spec/unit/type/file/group_spec.rb +2 -2
  1607. data/spec/unit/type/file/mode_spec.rb +9 -9
  1608. data/spec/unit/type/file/mtime_spec.rb +0 -0
  1609. data/spec/unit/type/file/owner_spec.rb +2 -2
  1610. data/spec/unit/type/file/selinux_spec.rb +2 -0
  1611. data/spec/unit/type/file/source_spec.rb +224 -119
  1612. data/spec/unit/type/file/type_spec.rb +0 -0
  1613. data/spec/unit/type/file_spec.rb +211 -35
  1614. data/spec/unit/type/filebucket_spec.rb +0 -0
  1615. data/spec/unit/type/group_spec.rb +0 -0
  1616. data/spec/unit/type/host_spec.rb +4 -4
  1617. data/spec/unit/type/interface_spec.rb +32 -0
  1618. data/spec/unit/type/k5login_spec.rb +0 -0
  1619. data/spec/unit/type/macauthorization_spec.rb +4 -1
  1620. data/spec/unit/type/mailalias_spec.rb +0 -0
  1621. data/spec/unit/type/maillist_spec.rb +0 -0
  1622. data/spec/unit/type/mcx_spec.rb +0 -0
  1623. data/spec/unit/type/mount_spec.rb +50 -8
  1624. data/spec/unit/type/nagios_spec.rb +0 -0
  1625. data/spec/unit/type/noop_metaparam_spec.rb +0 -0
  1626. data/spec/unit/type/package/package_settings_spec.rb +0 -0
  1627. data/spec/unit/type/package_spec.rb +1 -0
  1628. data/spec/unit/type/resources_spec.rb +0 -0
  1629. data/spec/unit/type/schedule_spec.rb +0 -0
  1630. data/spec/unit/type/selboolean_spec.rb +0 -0
  1631. data/spec/unit/type/selmodule_spec.rb +0 -0
  1632. data/spec/unit/type/service_spec.rb +21 -0
  1633. data/spec/unit/type/ssh_authorized_key_spec.rb +2 -2
  1634. data/spec/unit/type/sshkey_spec.rb +0 -0
  1635. data/spec/unit/type/stage_spec.rb +0 -0
  1636. data/spec/unit/type/tidy_spec.rb +4 -4
  1637. data/spec/unit/type/user_spec.rb +38 -7
  1638. data/spec/unit/type/vlan_spec.rb +1 -1
  1639. data/spec/unit/type/whit_spec.rb +0 -0
  1640. data/spec/unit/type/yumrepo_spec.rb +3 -7
  1641. data/spec/unit/type/zfs_spec.rb +0 -0
  1642. data/spec/unit/type/zone_spec.rb +0 -0
  1643. data/spec/unit/type/zpool_spec.rb +0 -0
  1644. data/spec/unit/type_spec.rb +119 -1
  1645. data/spec/unit/util/at_fork_spec.rb +150 -0
  1646. data/spec/unit/util/autoload_spec.rb +0 -0
  1647. data/spec/unit/util/backups_spec.rb +0 -0
  1648. data/spec/unit/util/character_encoding_spec.rb +229 -0
  1649. data/spec/unit/util/checksums_spec.rb +0 -0
  1650. data/spec/unit/util/colors_spec.rb +0 -0
  1651. data/spec/unit/util/command_line_spec.rb +11 -0
  1652. data/spec/unit/util/constant_inflector_spec.rb +0 -0
  1653. data/spec/unit/util/diff_spec.rb +0 -0
  1654. data/spec/unit/util/errors_spec.rb +0 -0
  1655. data/spec/unit/util/execution_spec.rb +44 -3
  1656. data/spec/unit/util/execution_stub_spec.rb +0 -0
  1657. data/spec/unit/util/feature_spec.rb +1 -1
  1658. data/spec/unit/util/filetype_spec.rb +4 -4
  1659. data/spec/unit/util/http_proxy_spec.rb +91 -0
  1660. data/spec/unit/util/ldap/connection_spec.rb +0 -0
  1661. data/spec/unit/util/ldap/generator_spec.rb +1 -1
  1662. data/spec/unit/util/ldap/manager_spec.rb +0 -0
  1663. data/spec/unit/util/log/destinations_spec.rb +5 -8
  1664. data/spec/unit/util/log_spec.rb +74 -18
  1665. data/spec/unit/util/logging_spec.rb +69 -0
  1666. data/spec/unit/util/metric_spec.rb +9 -2
  1667. data/spec/unit/util/monkey_patches_spec.rb +37 -127
  1668. data/spec/unit/util/multi_match_spec.rb +39 -0
  1669. data/spec/unit/util/nagios_maker_spec.rb +0 -0
  1670. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  1671. data/spec/unit/util/network_device/cisco/facts_spec.rb +0 -0
  1672. data/spec/unit/util/network_device/cisco/interface_spec.rb +0 -0
  1673. data/spec/unit/util/network_device/config_spec.rb +0 -0
  1674. data/spec/unit/util/network_device/ipcalc_spec.rb +0 -0
  1675. data/spec/unit/util/network_device/transport/base_spec.rb +0 -0
  1676. data/spec/unit/util/network_device/transport/ssh_spec.rb +1 -1
  1677. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  1678. data/spec/unit/util/network_device_spec.rb +1 -1
  1679. data/spec/unit/util/package_spec.rb +0 -0
  1680. data/spec/unit/util/plist_spec.rb +135 -0
  1681. data/spec/unit/util/posix_spec.rb +0 -0
  1682. data/spec/unit/util/rdoc_spec.rb +0 -0
  1683. data/spec/unit/util/resource_template_spec.rb +2 -2
  1684. data/spec/unit/util/retry_action_spec.rb +0 -0
  1685. data/spec/unit/util/run_mode_spec.rb +44 -13
  1686. data/spec/unit/util/selinux_spec.rb +0 -0
  1687. data/spec/unit/util/splayer_spec.rb +45 -0
  1688. data/spec/unit/util/storage_spec.rb +8 -1
  1689. data/spec/unit/util/suidmanager_spec.rb +0 -0
  1690. data/spec/unit/util/symbolic_file_mode_spec.rb +0 -0
  1691. data/spec/unit/util/tag_set_spec.rb +2 -2
  1692. data/spec/unit/util/tagging_spec.rb +59 -0
  1693. data/spec/unit/util/user_attr_spec.rb +0 -0
  1694. data/spec/unit/util/warnings_spec.rb +0 -0
  1695. data/spec/unit/util/windows/adsi_spec.rb +82 -40
  1696. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  1697. data/spec/unit/util/windows/eventlog_spec.rb +123 -0
  1698. data/spec/unit/util/windows/file_spec.rb +89 -0
  1699. data/spec/unit/util/windows/root_certs_spec.rb +0 -0
  1700. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  1701. data/spec/unit/util/windows/sid_spec.rb +76 -14
  1702. data/spec/unit/util/yaml_spec.rb +13 -1
  1703. data/spec/unit/util_spec.rb +456 -17
  1704. data/spec/unit/version_spec.rb +19 -0
  1705. data/spec/watchr.rb +0 -0
  1706. data/tasks/benchmark.rake +3 -3
  1707. data/tasks/cfpropertylist.rake +15 -0
  1708. data/tasks/generate_ast_model.rake +78 -0
  1709. metadata +3441 -3081
  1710. checksums.yaml +0 -7
  1711. data/bin/extlookup2hiera +0 -56
  1712. data/ext/emacs/puppet-mode-init.el +0 -6
  1713. data/ext/emacs/puppet-mode.el +0 -433
  1714. data/ext/puppet-nm-dispatcher +0 -13
  1715. data/ext/puppetlisten/puppetlisten.rb +0 -77
  1716. data/ext/puppetlisten/puppetrun.rb +0 -38
  1717. data/ext/systemd/puppetmaster.service +0 -11
  1718. data/ext/vim/README +0 -3
  1719. data/ext/vim/ftdetect/puppet.vim +0 -2
  1720. data/ext/vim/ftplugin/puppet.vim +0 -94
  1721. data/ext/vim/indent/puppet.vim +0 -76
  1722. data/ext/vim/syntax/puppet.vim +0 -115
  1723. data/lib/puppet/application/file.rb +0 -4
  1724. data/lib/puppet/application/inspect.rb +0 -179
  1725. data/lib/puppet/application/resource_type.rb +0 -7
  1726. data/lib/puppet/data_providers/data_adapter.rb +0 -91
  1727. data/lib/puppet/data_providers/data_function_support.rb +0 -45
  1728. data/lib/puppet/data_providers/function_env_data_provider.rb +0 -28
  1729. data/lib/puppet/data_providers/function_module_data_provider.rb +0 -39
  1730. data/lib/puppet/data_providers.rb +0 -31
  1731. data/lib/puppet/face/file/download.rb +0 -56
  1732. data/lib/puppet/face/file/store.rb +0 -21
  1733. data/lib/puppet/face/file.rb +0 -47
  1734. data/lib/puppet/face/resource_type.rb +0 -84
  1735. data/lib/puppet/feature/cfacter.rb +0 -14
  1736. data/lib/puppet/feature/external_facts.rb +0 -5
  1737. data/lib/puppet/indirector/catalog/static_compiler.rb +0 -213
  1738. data/lib/puppet/indirector/resource_type/parser.rb +0 -101
  1739. data/lib/puppet/indirector/resource_type/rest.rb +0 -7
  1740. data/lib/puppet/indirector/resource_type.rb +0 -5
  1741. data/lib/puppet/parser/yaml_trimmer.rb +0 -7
  1742. data/lib/puppet/plugins/binding_schemes.rb +0 -140
  1743. data/lib/puppet/plugins/data_providers.rb +0 -90
  1744. data/lib/puppet/pops/binder/binder.rb +0 -394
  1745. data/lib/puppet/pops/binder/binder_issues.rb +0 -122
  1746. data/lib/puppet/pops/binder/bindings_checker.rb +0 -197
  1747. data/lib/puppet/pops/binder/bindings_composer.rb +0 -177
  1748. data/lib/puppet/pops/binder/bindings_factory.rb +0 -809
  1749. data/lib/puppet/pops/binder/bindings_label_provider.rb +0 -43
  1750. data/lib/puppet/pops/binder/bindings_loader.rb +0 -83
  1751. data/lib/puppet/pops/binder/bindings_model.rb +0 -68
  1752. data/lib/puppet/pops/binder/bindings_model_dumper.rb +0 -215
  1753. data/lib/puppet/pops/binder/bindings_model_meta.rb +0 -215
  1754. data/lib/puppet/pops/binder/bindings_validator_factory.rb +0 -28
  1755. data/lib/puppet/pops/binder/config/binder_config.rb +0 -107
  1756. data/lib/puppet/pops/binder/config/binder_config_checker.rb +0 -142
  1757. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +0 -32
  1758. data/lib/puppet/pops/binder/config/issues.rb +0 -90
  1759. data/lib/puppet/pops/binder/injector.rb +0 -766
  1760. data/lib/puppet/pops/binder/injector_entry.rb +0 -57
  1761. data/lib/puppet/pops/binder/key_factory.rb +0 -67
  1762. data/lib/puppet/pops/binder/producers.rb +0 -826
  1763. data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +0 -34
  1764. data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +0 -84
  1765. data/lib/puppet/pops/binder/scheme_handler/symbolic_scheme.rb +0 -53
  1766. data/lib/puppet/pops/binder/system_bindings.rb +0 -60
  1767. data/lib/puppet/pops/containment.rb +0 -104
  1768. data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
  1769. data/lib/puppet/pops/model/model.rb +0 -114
  1770. data/lib/puppet/pops/model/model_meta.rb +0 -586
  1771. data/lib/puppet/pops/types/types_meta.rb +0 -234
  1772. data/lib/puppet/resource/type_collection_helper.rb +0 -7
  1773. data/lib/puppet/vendor/load_plist.rb +0 -1
  1774. data/lib/puppet/vendor/load_rgen.rb +0 -2
  1775. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  1776. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  1777. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  1778. data/lib/puppet/vendor/plist/README +0 -36
  1779. data/lib/puppet/vendor/plist/Rakefile +0 -144
  1780. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  1781. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  1782. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  1783. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  1784. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  1785. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  1786. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  1787. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  1788. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  1789. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  1790. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  1791. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  1792. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  1793. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  1794. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  1795. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  1796. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  1797. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
  1798. data/lib/puppet/vendor/rgen/CHANGELOG +0 -197
  1799. data/lib/puppet/vendor/rgen/MIT-LICENSE +0 -20
  1800. data/lib/puppet/vendor/rgen/PUPPET_README.md +0 -6
  1801. data/lib/puppet/vendor/rgen/README.rdoc +0 -78
  1802. data/lib/puppet/vendor/rgen/Rakefile +0 -41
  1803. data/lib/puppet/vendor/rgen/TODO +0 -41
  1804. data/lib/puppet/vendor/rgen/anounce.txt +0 -61
  1805. data/lib/puppet/vendor/rgen/design_rationale.txt +0 -71
  1806. data/lib/puppet/vendor/rgen/lib/ea_support/ea_support.rb +0 -54
  1807. data/lib/puppet/vendor/rgen/lib/ea_support/id_store.rb +0 -32
  1808. data/lib/puppet/vendor/rgen/lib/ea_support/uml13_ea_metamodel.rb +0 -562
  1809. data/lib/puppet/vendor/rgen/lib/ea_support/uml13_ea_metamodel_ext.rb +0 -45
  1810. data/lib/puppet/vendor/rgen/lib/ea_support/uml13_ea_metamodel_generator.rb +0 -43
  1811. data/lib/puppet/vendor/rgen/lib/ea_support/uml13_ea_to_uml13.rb +0 -103
  1812. data/lib/puppet/vendor/rgen/lib/ea_support/uml13_to_uml13_ea.rb +0 -89
  1813. data/lib/puppet/vendor/rgen/lib/metamodels/uml13_metamodel.rb +0 -559
  1814. data/lib/puppet/vendor/rgen/lib/metamodels/uml13_metamodel_ext.rb +0 -26
  1815. data/lib/puppet/vendor/rgen/lib/mmgen/metamodel_generator.rb +0 -20
  1816. data/lib/puppet/vendor/rgen/lib/mmgen/mm_ext/ecore_mmgen_ext.rb +0 -91
  1817. data/lib/puppet/vendor/rgen/lib/mmgen/mmgen.rb +0 -28
  1818. data/lib/puppet/vendor/rgen/lib/mmgen/templates/annotations.tpl +0 -37
  1819. data/lib/puppet/vendor/rgen/lib/mmgen/templates/metamodel_generator.tpl +0 -172
  1820. data/lib/puppet/vendor/rgen/lib/rgen/array_extensions.rb +0 -45
  1821. data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore.rb +0 -218
  1822. data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore_builder_methods.rb +0 -81
  1823. data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore_ext.rb +0 -69
  1824. data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore_interface.rb +0 -47
  1825. data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore_to_ruby.rb +0 -167
  1826. data/lib/puppet/vendor/rgen/lib/rgen/ecore/ruby_to_ecore.rb +0 -91
  1827. data/lib/puppet/vendor/rgen/lib/rgen/environment.rb +0 -129
  1828. data/lib/puppet/vendor/rgen/lib/rgen/fragment/dump_file_cache.rb +0 -63
  1829. data/lib/puppet/vendor/rgen/lib/rgen/fragment/fragmented_model.rb +0 -140
  1830. data/lib/puppet/vendor/rgen/lib/rgen/fragment/model_fragment.rb +0 -289
  1831. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_instantiator.rb +0 -66
  1832. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_xml_instantiator.rb +0 -66
  1833. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/default_xml_instantiator.rb +0 -117
  1834. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/ecore_xml_instantiator.rb +0 -169
  1835. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/json_instantiator.rb +0 -126
  1836. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/json_parser.rb +0 -331
  1837. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/json_parser.y +0 -94
  1838. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/nodebased_xml_instantiator.rb +0 -137
  1839. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/qualified_name_resolver.rb +0 -97
  1840. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/reference_resolver.rb +0 -128
  1841. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/resolution_helper.rb +0 -47
  1842. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/xmi11_instantiator.rb +0 -168
  1843. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/builder_extensions.rb +0 -556
  1844. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/builder_runtime.rb +0 -174
  1845. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/constant_order_helper.rb +0 -89
  1846. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/data_types.rb +0 -77
  1847. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/intermediate/annotation.rb +0 -30
  1848. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/intermediate/feature.rb +0 -168
  1849. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/mm_multiple.rb +0 -23
  1850. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/module_extension.rb +0 -42
  1851. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder.rb +0 -224
  1852. data/lib/puppet/vendor/rgen/lib/rgen/model_builder/builder_context.rb +0 -334
  1853. data/lib/puppet/vendor/rgen/lib/rgen/model_builder/model_serializer.rb +0 -225
  1854. data/lib/puppet/vendor/rgen/lib/rgen/model_builder/reference_resolver.rb +0 -156
  1855. data/lib/puppet/vendor/rgen/lib/rgen/model_builder.rb +0 -32
  1856. data/lib/puppet/vendor/rgen/lib/rgen/serializer/json_serializer.rb +0 -121
  1857. data/lib/puppet/vendor/rgen/lib/rgen/serializer/opposite_reference_filter.rb +0 -18
  1858. data/lib/puppet/vendor/rgen/lib/rgen/serializer/qualified_name_provider.rb +0 -47
  1859. data/lib/puppet/vendor/rgen/lib/rgen/serializer/xmi11_serializer.rb +0 -116
  1860. data/lib/puppet/vendor/rgen/lib/rgen/serializer/xmi20_serializer.rb +0 -71
  1861. data/lib/puppet/vendor/rgen/lib/rgen/serializer/xml_serializer.rb +0 -98
  1862. data/lib/puppet/vendor/rgen/lib/rgen/template_language/directory_template_container.rb +0 -83
  1863. data/lib/puppet/vendor/rgen/lib/rgen/template_language/output_handler.rb +0 -87
  1864. data/lib/puppet/vendor/rgen/lib/rgen/template_language/template_container.rb +0 -234
  1865. data/lib/puppet/vendor/rgen/lib/rgen/template_language/template_helper.rb +0 -26
  1866. data/lib/puppet/vendor/rgen/lib/rgen/template_language.rb +0 -297
  1867. data/lib/puppet/vendor/rgen/lib/rgen/transformer.rb +0 -475
  1868. data/lib/puppet/vendor/rgen/lib/rgen/util/auto_class_creator.rb +0 -61
  1869. data/lib/puppet/vendor/rgen/lib/rgen/util/cached_glob.rb +0 -67
  1870. data/lib/puppet/vendor/rgen/lib/rgen/util/file_cache_map.rb +0 -124
  1871. data/lib/puppet/vendor/rgen/lib/rgen/util/file_change_detector.rb +0 -84
  1872. data/lib/puppet/vendor/rgen/lib/rgen/util/method_delegation.rb +0 -114
  1873. data/lib/puppet/vendor/rgen/lib/rgen/util/model_comparator.rb +0 -68
  1874. data/lib/puppet/vendor/rgen/lib/rgen/util/model_comparator_base.rb +0 -142
  1875. data/lib/puppet/vendor/rgen/lib/rgen/util/model_dumper.rb +0 -29
  1876. data/lib/puppet/vendor/rgen/lib/rgen/util/name_helper.rb +0 -42
  1877. data/lib/puppet/vendor/rgen/lib/rgen/util/pattern_matcher.rb +0 -329
  1878. data/lib/puppet/vendor/rgen/lib/transformers/ecore_to_uml13.rb +0 -79
  1879. data/lib/puppet/vendor/rgen/lib/transformers/uml13_to_ecore.rb +0 -127
  1880. data/lib/puppet/vendor/rgen/test/array_extensions_test.rb +0 -64
  1881. data/lib/puppet/vendor/rgen/test/ea_instantiator_test.rb +0 -35
  1882. data/lib/puppet/vendor/rgen/test/ea_serializer_test.rb +0 -23
  1883. data/lib/puppet/vendor/rgen/test/ecore_self_test.rb +0 -54
  1884. data/lib/puppet/vendor/rgen/test/environment_test.rb +0 -90
  1885. data/lib/puppet/vendor/rgen/test/json_test.rb +0 -171
  1886. data/lib/puppet/vendor/rgen/test/metamodel_builder_test.rb +0 -1482
  1887. data/lib/puppet/vendor/rgen/test/metamodel_from_ecore_test.rb +0 -57
  1888. data/lib/puppet/vendor/rgen/test/metamodel_order_test.rb +0 -131
  1889. data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test/TestModel.rb +0 -70
  1890. data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test/houseMetamodel.ecore +0 -42
  1891. data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test/houseMetamodel_from_ecore.rb +0 -44
  1892. data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test/using_builtin_types.ecore +0 -9
  1893. data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test.rb +0 -98
  1894. data/lib/puppet/vendor/rgen/test/method_delegation_test.rb +0 -178
  1895. data/lib/puppet/vendor/rgen/test/model_builder/builder_context_test.rb +0 -59
  1896. data/lib/puppet/vendor/rgen/test/model_builder/builder_test.rb +0 -242
  1897. data/lib/puppet/vendor/rgen/test/model_builder/ecore_original.rb +0 -163
  1898. data/lib/puppet/vendor/rgen/test/model_builder/ecore_original_regenerated.rb +0 -163
  1899. data/lib/puppet/vendor/rgen/test/model_builder/reference_resolver_test.rb +0 -156
  1900. data/lib/puppet/vendor/rgen/test/model_builder/serializer_test.rb +0 -94
  1901. data/lib/puppet/vendor/rgen/test/model_builder/statemachine_metamodel.rb +0 -42
  1902. data/lib/puppet/vendor/rgen/test/model_builder/test_model/statemachine1.rb +0 -23
  1903. data/lib/puppet/vendor/rgen/test/model_builder_test.rb +0 -6
  1904. data/lib/puppet/vendor/rgen/test/model_fragment_test.rb +0 -30
  1905. data/lib/puppet/vendor/rgen/test/output_handler_test.rb +0 -58
  1906. data/lib/puppet/vendor/rgen/test/qualified_name_provider_test.rb +0 -48
  1907. data/lib/puppet/vendor/rgen/test/qualified_name_resolver_test.rb +0 -102
  1908. data/lib/puppet/vendor/rgen/test/reference_resolver_test.rb +0 -117
  1909. data/lib/puppet/vendor/rgen/test/rgen_test.rb +0 -26
  1910. data/lib/puppet/vendor/rgen/test/template_language_test/expected_result1.txt +0 -29
  1911. data/lib/puppet/vendor/rgen/test/template_language_test/expected_result2.txt +0 -9
  1912. data/lib/puppet/vendor/rgen/test/template_language_test/expected_result3.txt +0 -4
  1913. data/lib/puppet/vendor/rgen/test/template_language_test/indentStringTestDefaultIndent.out +0 -1
  1914. data/lib/puppet/vendor/rgen/test/template_language_test/indentStringTestTabIndent.out +0 -1
  1915. data/lib/puppet/vendor/rgen/test/template_language_test/templates/callback_indent_test/a.tpl +0 -12
  1916. data/lib/puppet/vendor/rgen/test/template_language_test/templates/callback_indent_test/b.tpl +0 -5
  1917. data/lib/puppet/vendor/rgen/test/template_language_test/templates/code/array.tpl +0 -11
  1918. data/lib/puppet/vendor/rgen/test/template_language_test/templates/content/author.tpl +0 -7
  1919. data/lib/puppet/vendor/rgen/test/template_language_test/templates/content/chapter.tpl +0 -5
  1920. data/lib/puppet/vendor/rgen/test/template_language_test/templates/define_local_test/local.tpl +0 -8
  1921. data/lib/puppet/vendor/rgen/test/template_language_test/templates/define_local_test/test.tpl +0 -8
  1922. data/lib/puppet/vendor/rgen/test/template_language_test/templates/evaluate_test/test.tpl +0 -7
  1923. data/lib/puppet/vendor/rgen/test/template_language_test/templates/indent_string_test.tpl +0 -12
  1924. data/lib/puppet/vendor/rgen/test/template_language_test/templates/index/c/cmod.tpl +0 -1
  1925. data/lib/puppet/vendor/rgen/test/template_language_test/templates/index/chapter.tpl +0 -3
  1926. data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_backslash_r_test.tpl +0 -5
  1927. data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/no_indent.tpl +0 -3
  1928. data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/sub1/no_indent.tpl +0 -3
  1929. data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/test.tpl +0 -24
  1930. data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/test2.tpl +0 -13
  1931. data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/test3.tpl +0 -10
  1932. data/lib/puppet/vendor/rgen/test/template_language_test/templates/null_context_test.tpl +0 -17
  1933. data/lib/puppet/vendor/rgen/test/template_language_test/templates/root.tpl +0 -31
  1934. data/lib/puppet/vendor/rgen/test/template_language_test/templates/template_resolution_test/sub1/sub1.tpl +0 -3
  1935. data/lib/puppet/vendor/rgen/test/template_language_test/templates/template_resolution_test/sub1.tpl +0 -9
  1936. data/lib/puppet/vendor/rgen/test/template_language_test/templates/template_resolution_test/test.tpl +0 -4
  1937. data/lib/puppet/vendor/rgen/test/template_language_test/testout.txt +0 -29
  1938. data/lib/puppet/vendor/rgen/test/template_language_test.rb +0 -163
  1939. data/lib/puppet/vendor/rgen/test/testmodel/class_model_checker.rb +0 -119
  1940. data/lib/puppet/vendor/rgen/test/testmodel/ea_testmodel.eap +0 -0
  1941. data/lib/puppet/vendor/rgen/test/testmodel/ea_testmodel.xml +0 -1029
  1942. data/lib/puppet/vendor/rgen/test/testmodel/ea_testmodel_partial.xml +0 -317
  1943. data/lib/puppet/vendor/rgen/test/testmodel/ecore_model_checker.rb +0 -101
  1944. data/lib/puppet/vendor/rgen/test/testmodel/manual_testmodel.xml +0 -22
  1945. data/lib/puppet/vendor/rgen/test/testmodel/object_model_checker.rb +0 -67
  1946. data/lib/puppet/vendor/rgen/test/transformer_test.rb +0 -254
  1947. data/lib/puppet/vendor/rgen/test/util/file_cache_map_test.rb +0 -99
  1948. data/lib/puppet/vendor/rgen/test/util/pattern_matcher_test.rb +0 -97
  1949. data/lib/puppet/vendor/rgen/test/util_test.rb +0 -5
  1950. data/lib/puppet/vendor/rgen/test/xml_instantiator_test/simple_ecore_model_checker.rb +0 -94
  1951. data/lib/puppet/vendor/rgen/test/xml_instantiator_test/simple_xmi_ecore_instantiator.rb +0 -53
  1952. data/lib/puppet/vendor/rgen/test/xml_instantiator_test/simple_xmi_metamodel.rb +0 -49
  1953. data/lib/puppet/vendor/rgen/test/xml_instantiator_test/simple_xmi_to_ecore.rb +0 -75
  1954. data/lib/puppet/vendor/rgen/test/xml_instantiator_test.rb +0 -160
  1955. data/lib/puppet/vendor/rgen_patch.rb +0 -132
  1956. data/lib/puppet/vendor/semantic/Gemfile +0 -20
  1957. data/lib/puppet/vendor/semantic/PUPPET_README.md +0 -6
  1958. data/lib/puppet/vendor/semantic/Rakefile +0 -69
  1959. data/lib/puppet/vendor/semantic/lib/semantic/version.rb +0 -168
  1960. data/lib/puppet/vendor/semantic/lib/semantic/version_range.rb +0 -424
  1961. data/lib/puppet/vendor/semantic/spec/spec_helper.rb +0 -24
  1962. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_node_spec.rb +0 -141
  1963. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_spec.rb +0 -162
  1964. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/module_release_spec.rb +0 -143
  1965. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/source_spec.rb +0 -5
  1966. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/unsatisfiable_graph_spec.rb +0 -44
  1967. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency_spec.rb +0 -383
  1968. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_range_spec.rb +0 -307
  1969. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_spec.rb +0 -608
  1970. data/lib/semver.rb +0 -123
  1971. data/man/man8/extlookup2hiera.8 +0 -10
  1972. data/man/man8/puppet-file.8 +0 -189
  1973. data/man/man8/puppet-resource_type.8 +0 -188
  1974. data/spec/fixtures/unit/data_providers/environments/production/modules/abc/lib/puppet/bindings/abc/default.rb +0 -9
  1975. data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/lib/puppet/bindings/xyz/default.rb +0 -9
  1976. data/spec/fixtures/unit/data_providers/environments/sample/manifests/site.pp +0 -6
  1977. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet/bindings/dataprovider/default.rb +0 -54
  1978. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +0 -31
  1979. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_module_data.rb +0 -32
  1980. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/manifests/init.pp +0 -5
  1981. data/spec/fixtures/unit/functions/lookup/environments/production/modules/abc/lib/puppet/bindings/abc/default.rb +0 -9
  1982. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/bindings/bad_data/default.rb +0 -9
  1983. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -3
  1984. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bca/lib/puppet/bindings/bca/default.rb +0 -9
  1985. data/spec/integration/data_binding.rb +0 -104
  1986. data/spec/integration/parser/functions/require_spec.rb +0 -43
  1987. data/spec/integration/provider/package_spec.rb +0 -33
  1988. data/spec/unit/application/inspect_spec.rb +0 -287
  1989. data/spec/unit/data_providers/sample_data_provider_spec.rb +0 -52
  1990. data/spec/unit/face/file_spec.rb +0 -10
  1991. data/spec/unit/indirector/catalog/static_compiler_spec.rb +0 -237
  1992. data/spec/unit/indirector/resource_type/parser_spec.rb +0 -254
  1993. data/spec/unit/indirector/resource_type/rest_spec.rb +0 -14
  1994. data/spec/unit/parser/functions/defined_spec.rb +0 -120
  1995. data/spec/unit/parser/functions/include_spec.rb +0 -55
  1996. data/spec/unit/parser/functions/require_spec.rb +0 -68
  1997. data/spec/unit/pops/binder/binder_spec.rb +0 -43
  1998. data/spec/unit/pops/binder/bindings_checker_spec.rb +0 -155
  1999. data/spec/unit/pops/binder/bindings_composer_spec.rb +0 -64
  2000. data/spec/unit/pops/binder/bindings_validator_factory_spec.rb +0 -18
  2001. data/spec/unit/pops/binder/config/binder_config_spec.rb +0 -42
  2002. data/spec/unit/pops/binder/injector_spec.rb +0 -768
  2003. data/spec/unit/pops/parser/rgen_sanitycheck_spec.rb +0 -23
  2004. data/spec/unit/resource/type_collection_helper_spec.rb +0 -24
  2005. data/spec/unit/semver_spec.rb +0 -305
  2006. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/environment.conf +0 -0
  2007. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/lib/puppet/functions/environment/data.rb +0 -0
  2008. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +0 -0
  2009. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/manifests/init.pp +0 -0
  2010. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/functions/bca/data.rb +0 -0
  2011. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/manifests/init.pp +0 -0
  2012. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/no_provider/manifests/init.pp +0 -0
  2013. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
  2014. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
@@ -1,415 +1,3394 @@
1
- require 'rgen/metamodel_builder'
1
+ require_relative 'iterable'
2
+ require_relative 'enumeration'
3
+ require_relative 'recursion_guard'
4
+ require_relative 'type_acceptor'
5
+ require_relative 'type_asserter'
6
+ require_relative 'type_assertion_error'
7
+ require_relative 'type_conversion_error'
8
+ require_relative 'type_formatter'
9
+ require_relative 'type_calculator'
10
+ require_relative 'type_factory'
11
+ require_relative 'type_parser'
12
+ require_relative 'class_loader'
13
+ require_relative 'type_mismatch_describer'
14
+ require_relative 'puppet_object'
15
+
16
+ module Puppet::Pops
17
+ module Types
18
+
19
+ # The EMPTY_xxx declarations is for backward compatibility. They should not be explicitly referenced
20
+
21
+ # @api private
22
+ # @deprecated
23
+ EMPTY_HASH = Puppet::Pops::EMPTY_HASH
24
+
25
+ # @api private
26
+ # @deprecated
27
+ EMPTY_ARRAY = Puppet::Pops::EMPTY_ARRAY
28
+
29
+ # @api private
30
+ # @deprecated
31
+ EMPTY_STRING = Puppet::Pops::EMPTY_STRING
2
32
 
3
33
  # The Types model is a model of Puppet Language types.
4
- # It consists of two parts; the meta-model expressed using RGen (in types_meta.rb) and this file which
5
- # mixes in the implementation.
34
+ #
35
+ # The {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
52
+
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
56
+
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?
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
93
+
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)
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
11
2538
 
12
- # TODO: See PUP-2978 for possible performance optimization
2539
+ def hash
2540
+ super ^ @key_type.hash ^ @value_type.hash
2541
+ end
13
2542
 
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
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
20
2551
  end
2552
+ end
21
2553
 
22
- class PAnyType < TypeModelObject
23
- module ClassModule
24
- # Produce a deep copy of the type
25
- def copy
26
- Marshal.load(Marshal.dump(self))
27
- end
2554
+ def iterable?(guard = nil)
2555
+ true
2556
+ end
28
2557
 
29
- def hash
30
- self.class.hash
31
- end
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
32
2565
 
33
- def ==(o)
34
- self.class == o.class
35
- end
2566
+ def eql?(o)
2567
+ super && @key_type == o.key_type && @value_type == o.value_type
2568
+ end
36
2569
 
37
- alias eql? ==
2570
+ def is_the_empty_hash?
2571
+ self == EMPTY
2572
+ end
38
2573
 
39
- def to_s
40
- Puppet::Pops::Types::TypeCalculator.string(self)
41
- 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
2579
+
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]'
42
2586
  end
43
- end
44
2587
 
45
- class PNotUndefType < PAnyType
46
- module ClassModule
47
- def hash
48
- [self.class, type].hash
49
- end
2588
+ dispatch :from_tuples do
2589
+ param 'KeyValueArray', :from
2590
+ end
50
2591
 
51
- def ==(o)
52
- self.class == o.class && type == o.type
53
- end
2592
+ dispatch :from_array do
2593
+ param 'Any', :from
54
2594
  end
55
- end
56
2595
 
57
- class PType < PAnyType
58
- module ClassModule
59
- def hash
60
- [self.class, type].hash
61
- end
2596
+ def from_tuples(tuple_array)
2597
+ Hash[tuple_array]
2598
+ end
62
2599
 
63
- def ==(o)
64
- self.class == o.class && type == o.type
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
65
2622
  end
66
2623
  end
67
2624
  end
2625
+ end
68
2626
 
69
- class PDataType < PAnyType
70
- module ClassModule
71
- def ==(o)
72
- self.class == o.class ||
73
- o.class == PVariantType && o == Puppet::Pops::Types::TypeCalculator.data_variant()
74
- end
75
- end
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))
2631
+
2632
+ protected
2633
+
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
76
2652
  end
2653
+ end
2654
+ end
77
2655
 
78
- class PVariantType < PAnyType
79
- module ClassModule
2656
+ # A flexible type describing an any? of other types
2657
+ # @api public
2658
+ #
2659
+ class PVariantType < PAnyType
2660
+ include Enumerable
80
2661
 
81
- def hash
82
- [self.class, Set.new(self.types)].hash
83
- end
2662
+ def self.register_ptype(loader, ir)
2663
+ create_ptype(loader, ir, 'AnyType', 'types' => PArrayType.new(PType::DEFAULT))
2664
+ end
84
2665
 
85
- def ==(o)
86
- (self.class == o.class && Set.new(types) == Set.new(o.types)) ||
87
- (o.class == PDataType && self == Puppet::Pops::Types::TypeCalculator.data_variant())
88
- end
89
- end
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 PEnumType < PScalarType
93
- module ClassModule
94
- def hash
95
- [self.class, Set.new(self.values)].hash
96
- end
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
2705
+
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
97
2718
 
98
- def ==(o)
99
- self.class == o.class && Set.new(values) == Set.new(o.values)
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
2728
+
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)
2737
+
2738
+ if types.size == 1
2739
+ types[0]
2740
+ else
2741
+ modified || types.size != size_before_merge ? PVariantType.maybe_create(types) : self
100
2742
  end
101
2743
  end
102
2744
  end
2745
+ end
103
2746
 
104
- class PIntegerType < PNumericType
105
- module ClassModule
106
- # The integer type is enumerable when it defines a range
107
- include Enumerable
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
2755
+ end
2756
+ end
2757
+ types.flatten! if modified
2758
+ types
2759
+ end
108
2760
 
109
- # Returns Float.Infinity if one end of the range is unbound
110
- def size
111
- return Float::INFINITY if from.nil? || to.nil?
112
- 1+(to-from).abs
113
- end
2761
+ def hash
2762
+ @types.hash
2763
+ end
114
2764
 
115
- # Returns the range as an array ordered so the smaller number is always first.
116
- # The number may be Infinity or -Infinity.
117
- def range
118
- f = from || -Float::INFINITY
119
- t = to || Float::INFINITY
120
- if f < t
121
- [f, t]
122
- else
123
- [t,f]
124
- end
125
- end
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
126
2769
 
127
- # Returns Enumerator if no block is given
128
- # Returns self if size is infinity (does not yield)
129
- def each
130
- return self.to_enum unless block_given?
131
- return nil if from.nil? || to.nil?
132
- if to < from
133
- from.downto(to) {|x| yield x }
134
- else
135
- from.upto(to) {|x| yield x }
136
- end
137
- end
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
2774
+ end
2775
+ end
138
2776
 
139
- def hash
140
- [self.class, from, to].hash
141
- end
2777
+ def kind_of_callable?(optional = true, guard = nil)
2778
+ @types.all? { |type| type.kind_of_callable?(optional, guard) }
2779
+ end
142
2780
 
143
- def ==(o)
144
- self.class == o.class && from == o.from && to == o.to
145
- end
146
- end
147
- end
2781
+ def resolved?
2782
+ @types.all? { |type| type.resolved? }
2783
+ end
148
2784
 
149
- class PFloatType < PNumericType
150
- module ClassModule
151
- def hash
152
- [self.class, from, to].hash
153
- end
2785
+ def eql?(o)
2786
+ self.class == o.class && @types.size == o.types.size && (@types - o.types).empty?
2787
+ end
154
2788
 
155
- def ==(o)
156
- self.class == o.class && from == o.from && to == o.to
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) }
157
2804
  end
158
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) }
159
2809
  end
2810
+ end
160
2811
 
161
- class PStringType < PScalarType
162
- module ClassModule
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
163
2825
 
164
- def hash
165
- [self.class, self.size_type, Set.new(self.values)].hash
166
- 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
167
2839
 
168
- def ==(o)
169
- self.class == o.class && self.size_type == o.size_type && Set.new(values) == Set.new(o.values)
170
- 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
171
2849
  end
172
2850
  end
2851
+ array
2852
+ end
173
2853
 
174
- class PRegexpType < PScalarType
175
- module ClassModule
176
- def regexp_derived
177
- pattern_or_blank = pattern || ''
178
- @_regexp = Regexp.new(pattern_or_blank) unless @_regexp && @_regexp.source == pattern_or_blank
179
- @_regexp
180
- end
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, pattern].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 && pattern == o.pattern
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 PPatternType < PScalarType
193
- module ClassModule
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
194
2901
 
195
- def hash
196
- [self.class, Set.new(patterns)].hash
197
- end
2902
+ DEFAULT = PCatalogEntryType.new
198
2903
 
199
- def ==(o)
200
- self.class == o.class && Set.new(patterns) == Set.new(o.patterns)
201
- end
202
- end
203
- end
2904
+ def instance?(o, guard = nil)
2905
+ assignable?(TypeCalculator.infer(o), guard)
2906
+ end
204
2907
 
205
- class PCollectionType < PAnyType
206
- module ClassModule
207
- # Returns an array with from (min) size to (max) size
208
- def size_range
209
- return [0, Float::INFINITY] if size_type.nil?
210
- f = size_type.from || 0
211
- t = size_type.to || Float::INFINITY
212
- if f < t
213
- [f, t]
214
- else
215
- [t,f]
216
- end
217
- end
2908
+ protected
2909
+ # @api private
2910
+ def _assignable?(o, guard)
2911
+ o.is_a?(PCatalogEntryType)
2912
+ end
2913
+ end
218
2914
 
219
- def hash
220
- [self.class, element_type, size_type].hash
221
- end
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
222
2929
 
223
- def ==(o)
224
- self.class == o.class && element_type == o.element_type && size_type == o.size_type
225
- end
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
226
3045
  end
227
3046
  end
3047
+ end
228
3048
 
229
- class PStructElement < TypeModelObject
230
- module ClassModule
231
- def hash
232
- [self.class, value_type, key_type].hash
233
- end
3049
+ def new_function(loader)
3050
+ optional_type.new_function(loader)
3051
+ end
234
3052
 
235
- def name
236
- k = key_type
237
- k = k.optional_type if k.is_a?(POptionalType)
238
- k.values[0]
239
- end
3053
+ DEFAULT = POptionalType.new(nil)
240
3054
 
241
- def ==(o)
242
- self.class == o.class && value_type == o.value_type && key_type == o.key_type
243
- end
244
- end
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)
245
3065
  end
3066
+ end
3067
+ end
246
3068
 
3069
+ class PTypeReferenceType < PAnyType
247
3070
 
248
- class PStructType < PAnyType
249
- module ClassModule
250
- def hashed_elements_derived
251
- @_hashed ||= elements.reduce({}) {|memo, e| memo[e.name] = e; memo }
252
- @_hashed
253
- end
3071
+ def self.register_ptype(loader, ir)
3072
+ create_ptype(loader, ir, 'AnyType', 'type_string' => PStringType::NON_EMPTY)
3073
+ end
254
3074
 
255
- def clear_hashed_elements
256
- @_hashed = nil
257
- end
3075
+ attr_reader :type_string
258
3076
 
259
- def hash
260
- [self.class, Set.new(elements)].hash
261
- end
3077
+ def initialize(type_string)
3078
+ @type_string = type_string
3079
+ end
262
3080
 
263
- def ==(o)
264
- self.class == o.class && hashed_elements == o.hashed_elements
265
- end
266
- end
267
- end
3081
+ def callable?(args)
3082
+ false
3083
+ end
268
3084
 
269
- class PTupleType < PAnyType
270
- module ClassModule
271
- # Returns the number of elements accepted [min, max] in the tuple
272
- def size_range
273
- types_size = types.size
274
- size_type.nil? ? [types_size, types_size] : size_type.range
275
- end
3085
+ def instance?(o, guard = nil)
3086
+ false
3087
+ end
276
3088
 
277
- # Returns the number of accepted occurrences [min, max] of the last type in the tuple
278
- # The defaults is [1,1]
279
- #
280
- def repeat_last_range
281
- types_size = types.size
282
- if size_type.nil?
283
- return [1, 1]
284
- end
285
- from, to = size_type.range()
286
- min = from - (types_size-1)
287
- min = min <= 0 ? 0 : min
288
- max = to - (types_size-1)
289
- [min, max]
290
- end
3089
+ def hash
3090
+ @type_string.hash
3091
+ end
291
3092
 
292
- def hash
293
- [self.class, size_type, Set.new(types)].hash
294
- end
3093
+ def eql?(o)
3094
+ super && o.type_string == @type_string
3095
+ end
295
3096
 
296
- def ==(o)
297
- self.class == o.class && types == o.types && size_type == o.size_type
298
- end
299
- 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)
300
3149
  end
3150
+ end
301
3151
 
302
- class PCallableType < PAnyType
303
- module ClassModule
304
- # Returns the number of accepted arguments [min, max]
305
- def size_range
306
- param_types.size_range
307
- end
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
308
3161
 
309
- # Returns the number of accepted arguments for the last parameter type [min, max]
310
- #
311
- def last_range
312
- param_types.repeat_last_range
313
- end
3162
+ def callable_args?(callable, guard)
3163
+ guarded_recursion(guard, false) { |g| resolved_type.callable_args?(callable, g) }
3164
+ end
314
3165
 
315
- # Range [0,0], [0,1], or [1,1] for the block
316
- #
317
- def block_range
318
- case block_type
319
- when Puppet::Pops::Types::POptionalType
320
- [0,1]
321
- when Puppet::Pops::Types::PVariantType, Puppet::Pops::Types::PCallableType
322
- [1,1]
323
- else
324
- [0,0]
325
- end
326
- end
3166
+ def check_self_recursion(originator)
3167
+ resolved_type.check_self_recursion(originator) unless originator.equal?(self)
3168
+ end
327
3169
 
328
- def hash
329
- [self.class, Set.new(param_types), block_type].hash
330
- 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
331
3173
 
332
- def ==(o)
333
- self.class == o.class && param_types == o.param_types && block_type == o.block_type
334
- 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
335
3202
  end
336
3203
  end
337
3204
 
338
- class PArrayType < PCollectionType
339
- module ClassModule
340
- def hash
341
- [self.class, self.element_type, self.size_type].hash
342
- end
3205
+ def other_type_detected?
3206
+ @other_type_detected
3207
+ end
3208
+ end
343
3209
 
344
- def ==(o)
345
- self.class == o.class && self.element_type == o.element_type && self.size_type == o.size_type
346
- end
347
- 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)
348
3216
  end
3217
+ end
349
3218
 
350
- class PHashType < PCollectionType
351
- module ClassModule
352
- def hash
353
- [self.class, key_type, self.element_type, self.size_type].hash
354
- 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
355
3227
 
356
- def ==(o)
357
- self.class == o.class &&
358
- key_type == o.key_type &&
359
- self.element_type == o.element_type &&
360
- self.size_type == o.size_type
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
361
3246
  end
362
3247
 
363
- def is_the_empty_hash?
364
- size_type.is_a?(PIntegerType) && size_type.from == 0 && size_type.to == 0 && key_type.is_a?(PUndefType) && element_type.is_a?(PUndefType)
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"
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
365
3262
  end
3263
+ rescue
3264
+ @resolved_type = nil
3265
+ raise
366
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)
367
3271
  end
3272
+ self
3273
+ end
368
3274
 
369
- class PRuntimeType < PAnyType
370
- module ClassModule
371
- def hash
372
- [self.class, runtime, runtime_type_name].hash
373
- end
3275
+ def eql?(o)
3276
+ super && o.name == @name
3277
+ end
374
3278
 
375
- def ==(o)
376
- self.class == o.class && runtime == o.runtime && runtime_type_name == o.runtime_type_name
377
- end
378
- 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?
379
3283
  end
3284
+ end
380
3285
 
381
- class PHostClassType < PCatalogEntryType
382
- module ClassModule
383
- def hash
384
- [self.class, class_name].hash
385
- end
386
- def ==(o)
387
- self.class == o.class && class_name == o.class_name
388
- end
389
- end
390
- end
3286
+ def self_recursion?
3287
+ @self_recursion
3288
+ end
391
3289
 
392
- class PResourceType < PCatalogEntryType
393
- module ClassModule
394
- def hash
395
- [self.class, type_name, title].hash
396
- end
397
- def ==(o)
398
- self.class == o.class && type_name == o.type_name && title == o.title
399
- end
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) }
400
3315
  end
3316
+ else
3317
+ resolved_type.really_instance?(o, guard)
401
3318
  end
3319
+ end
402
3320
 
403
- class POptionalType < PAnyType
404
- module ClassModule
405
- def hash
406
- [self.class, optional_type].hash
407
- 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
408
3338
 
409
- def ==(o)
410
- self.class == o.class && optional_type == o.optional_type
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
3347
+
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)
411
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)
412
3368
  end
413
3369
  end
3370
+ @resolved_type.check_self_recursion(self) if @self_recursion
414
3371
  end
3372
+
3373
+ DEFAULT = PTypeAliasType.new('UnresolvedAlias', nil, PTypeReferenceType::DEFAULT)
3374
+ end
415
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'