puppet 4.0.0 → 4.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1667) hide show
  1. checksums.yaml +4 -4
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +34 -10
  4. data/Gemfile +26 -9
  5. data/LICENSE +3 -3
  6. data/MAINTAINERS +71 -0
  7. data/README.md +9 -11
  8. data/Rakefile +35 -0
  9. data/conf/auth.conf +2 -2
  10. data/conf/puppet.conf +1 -1
  11. data/ext/README.environment +1 -1
  12. data/ext/build_defaults.yaml +10 -37
  13. data/ext/debian/README.source +1 -1
  14. data/ext/debian/control +3 -5
  15. data/ext/debian/copyright +4 -4
  16. data/ext/debian/puppet.default +0 -5
  17. data/ext/debian/puppet.init +1 -16
  18. data/ext/debian/puppet.logrotate +14 -5
  19. data/ext/debian/puppetmaster.README.debian +11 -9
  20. data/ext/emacs/puppet-mode.el +1 -1
  21. data/ext/envpuppet +2 -2
  22. data/ext/ips/puppetagent.xml +1 -1
  23. data/ext/ips/puppetmaster.xml +1 -1
  24. data/ext/osx/puppet.plist +30 -0
  25. data/ext/project_data.yaml +31 -15
  26. data/ext/puppet-test +3 -3
  27. data/ext/rack/example-passenger-vhost.conf +1 -1
  28. data/ext/redhat/client.init +67 -17
  29. data/ext/redhat/client.sysconfig +1 -10
  30. data/ext/redhat/logrotate +15 -3
  31. data/ext/redhat/puppet.spec.erb +6 -11
  32. data/ext/redhat/server.init +1 -1
  33. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  34. data/ext/solaris/pkginfo +1 -1
  35. data/ext/solaris/smf/puppet +44 -0
  36. data/ext/solaris/smf/puppet.xml +44 -0
  37. data/ext/suse/client.init +30 -33
  38. data/ext/suse/puppet.spec +2 -2
  39. data/ext/suse/server.init +2 -2
  40. data/ext/systemd/puppet.service +13 -1
  41. data/ext/upload_facts.rb +1 -1
  42. data/ext/windows/puppet_interactive.bat +6 -0
  43. data/ext/windows/puppet_shell.bat +9 -0
  44. data/ext/windows/run_puppet_interactive.bat +9 -0
  45. data/ext/windows/service/daemon.rb +2 -1
  46. data/ext/yaml_nodes.rb +1 -1
  47. data/install.rb +98 -65
  48. data/lib/hiera/puppet_function.rb +28 -18
  49. data/lib/hiera/scope.rb +12 -14
  50. data/lib/hiera_puppet.rb +6 -14
  51. data/lib/puppet/agent/locker.rb +11 -2
  52. data/lib/puppet/agent.rb +12 -27
  53. data/lib/puppet/application/agent.rb +40 -19
  54. data/lib/puppet/application/apply.rb +69 -16
  55. data/lib/puppet/application/ca.rb +1 -0
  56. data/lib/puppet/application/cert.rb +52 -3
  57. data/lib/puppet/application/device.rb +10 -5
  58. data/lib/puppet/application/face_base.rb +4 -0
  59. data/lib/puppet/application/filebucket.rb +79 -5
  60. data/lib/puppet/application/generate.rb +5 -0
  61. data/lib/puppet/application/inspect.rb +5 -2
  62. data/lib/puppet/application/lookup.rb +344 -0
  63. data/lib/puppet/application/master.rb +22 -7
  64. data/lib/puppet/application/resource.rb +2 -6
  65. data/lib/puppet/application.rb +20 -4
  66. data/lib/puppet/application_support.rb +1 -1
  67. data/lib/puppet/compilable_resource_type.rb +15 -0
  68. data/lib/puppet/configurer/plugin_handler.rb +7 -5
  69. data/lib/puppet/configurer.rb +184 -42
  70. data/lib/puppet/context/trusted_information.rb +21 -1
  71. data/lib/puppet/context.rb +16 -1
  72. data/lib/puppet/daemon.rb +17 -13
  73. data/lib/puppet/data_binding.rb +4 -2
  74. data/lib/puppet/data_providers/data_adapter.rb +14 -68
  75. data/lib/puppet/data_providers/data_function_support.rb +13 -26
  76. data/lib/puppet/data_providers/function_env_data_provider.rb +7 -9
  77. data/lib/puppet/data_providers/function_module_data_provider.rb +7 -22
  78. data/lib/puppet/data_providers/hiera_config.rb +151 -0
  79. data/lib/puppet/data_providers/hiera_env_data_provider.rb +25 -0
  80. data/lib/puppet/data_providers/hiera_interpolate.rb +21 -0
  81. data/lib/puppet/data_providers/hiera_module_data_provider.rb +30 -0
  82. data/lib/puppet/data_providers/hiera_support.rb +42 -0
  83. data/lib/puppet/data_providers/json_data_provider_factory.rb +38 -0
  84. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +40 -0
  85. data/lib/puppet/data_providers.rb +17 -14
  86. data/lib/puppet/defaults.rb +291 -59
  87. data/lib/puppet/environments.rb +105 -10
  88. data/lib/puppet/error.rb +31 -1
  89. data/lib/puppet/etc.rb +125 -0
  90. data/lib/puppet/external/dot.rb +1 -1
  91. data/lib/puppet/face/ca.rb +6 -1
  92. data/lib/puppet/face/catalog.rb +1 -1
  93. data/lib/puppet/face/certificate.rb +7 -1
  94. data/lib/puppet/face/certificate_request.rb +2 -0
  95. data/lib/puppet/face/certificate_revocation_list.rb +2 -0
  96. data/lib/puppet/face/config.rb +2 -2
  97. data/lib/puppet/face/epp.rb +63 -17
  98. data/lib/puppet/face/file.rb +3 -0
  99. data/lib/puppet/face/generate.rb +64 -0
  100. data/lib/puppet/face/help/face.erb +3 -0
  101. data/lib/puppet/face/help/man.erb +1 -1
  102. data/lib/puppet/face/help.rb +35 -27
  103. data/lib/puppet/face/key.rb +1 -0
  104. data/lib/puppet/face/man.rb +5 -3
  105. data/lib/puppet/face/module/changes.rb +2 -1
  106. data/lib/puppet/face/module/generate.rb +1 -1
  107. data/lib/puppet/face/module/install.rb +6 -6
  108. data/lib/puppet/face/parser.rb +12 -9
  109. data/lib/puppet/face/plugin.rb +7 -14
  110. data/lib/puppet/face/status.rb +4 -1
  111. data/lib/puppet/feature/base.rb +9 -2
  112. data/lib/puppet/feature/cfacter.rb +1 -0
  113. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  114. data/lib/puppet/feature/external_facts.rb +1 -1
  115. data/lib/puppet/feature/hiera_eyaml.rb +3 -0
  116. data/lib/puppet/feature/hocon.rb +3 -0
  117. data/lib/puppet/feature/telnet.rb +9 -0
  118. data/lib/puppet/file_bucket/dipper.rb +58 -2
  119. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  120. data/lib/puppet/file_serving/metadata.rb +30 -9
  121. data/lib/puppet/file_serving/terminus_helper.rb +7 -8
  122. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  123. data/lib/puppet/file_system/file_impl.rb +11 -2
  124. data/lib/puppet/file_system/memory_impl.rb +9 -1
  125. data/lib/puppet/file_system/path_pattern.rb +1 -0
  126. data/lib/puppet/file_system/uniquefile.rb +3 -3
  127. data/lib/puppet/file_system/windows.rb +36 -13
  128. data/lib/puppet/file_system.rb +46 -5
  129. data/lib/puppet/forge/repository.rb +3 -35
  130. data/lib/puppet/forge.rb +7 -7
  131. data/lib/puppet/functions/alert.rb +14 -0
  132. data/lib/puppet/functions/assert_type.rb +53 -19
  133. data/lib/puppet/functions/binary_file.rb +19 -0
  134. data/lib/puppet/functions/break.rb +22 -0
  135. data/lib/puppet/functions/contain.rb +33 -0
  136. data/lib/puppet/functions/crit.rb +14 -0
  137. data/lib/puppet/functions/debug.rb +14 -0
  138. data/lib/puppet/functions/defined.rb +160 -0
  139. data/lib/puppet/functions/dig.rb +23 -0
  140. data/lib/puppet/functions/each.rb +89 -39
  141. data/lib/puppet/functions/emerg.rb +14 -0
  142. data/lib/puppet/functions/epp.rb +29 -37
  143. data/lib/puppet/functions/err.rb +14 -0
  144. data/lib/puppet/functions/eyaml_lookup_key.rb +90 -0
  145. data/lib/puppet/functions/filter.rb +64 -38
  146. data/lib/puppet/functions/find_file.rb +31 -0
  147. data/lib/puppet/functions/hiera.rb +76 -3
  148. data/lib/puppet/functions/hiera_array.rb +66 -4
  149. data/lib/puppet/functions/hiera_hash.rb +74 -2
  150. data/lib/puppet/functions/hiera_include.rb +78 -5
  151. data/lib/puppet/functions/hocon_data.rb +35 -0
  152. data/lib/puppet/functions/include.rb +21 -0
  153. data/lib/puppet/functions/info.rb +14 -0
  154. data/lib/puppet/functions/inline_epp.rb +44 -71
  155. data/lib/puppet/functions/json_data.rb +29 -0
  156. data/lib/puppet/functions/lest.rb +17 -0
  157. data/lib/puppet/functions/lookup.rb +172 -184
  158. data/lib/puppet/functions/map.rb +60 -33
  159. data/lib/puppet/functions/match.rb +30 -12
  160. data/lib/puppet/functions/new.rb +31 -0
  161. data/lib/puppet/functions/next.rb +23 -0
  162. data/lib/puppet/functions/notice.rb +14 -0
  163. data/lib/puppet/functions/reduce.rb +99 -70
  164. data/lib/puppet/functions/regsubst.rb +23 -26
  165. data/lib/puppet/functions/require.rb +37 -0
  166. data/lib/puppet/functions/return.rb +22 -0
  167. data/lib/puppet/functions/reverse_each.rb +25 -0
  168. data/lib/puppet/functions/scanf.rb +15 -18
  169. data/lib/puppet/functions/slice.rb +22 -36
  170. data/lib/puppet/functions/split.rb +3 -3
  171. data/lib/puppet/functions/step.rb +26 -0
  172. data/lib/puppet/functions/strftime.rb +35 -0
  173. data/lib/puppet/functions/then.rb +14 -0
  174. data/lib/puppet/functions/type.rb +31 -0
  175. data/lib/puppet/functions/unwrap.rb +40 -0
  176. data/lib/puppet/functions/versioncmp.rb +36 -0
  177. data/lib/puppet/functions/warning.rb +14 -0
  178. data/lib/puppet/functions/with.rb +15 -7
  179. data/lib/puppet/functions/yaml_data.rb +38 -0
  180. data/lib/puppet/functions.rb +213 -35
  181. data/lib/puppet/generate/models/type/property.rb +70 -0
  182. data/lib/puppet/generate/models/type/type.rb +61 -0
  183. data/lib/puppet/generate/templates/type/pcore.erb +42 -0
  184. data/lib/puppet/generate/type.rb +239 -0
  185. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  186. data/lib/puppet/graph/simple_graph.rb +6 -8
  187. data/lib/puppet/indirector/catalog/compiler.rb +196 -9
  188. data/lib/puppet/indirector/catalog/static_compiler.rb +50 -31
  189. data/lib/puppet/indirector/data_binding/none.rb +4 -1
  190. data/lib/puppet/indirector/face.rb +6 -1
  191. data/lib/puppet/indirector/facts/facter.rb +9 -1
  192. data/lib/puppet/indirector/file_bucket_file/file.rb +137 -25
  193. data/lib/puppet/indirector/file_content/http.rb +15 -0
  194. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  195. data/lib/puppet/indirector/generic_http.rb +16 -0
  196. data/lib/puppet/indirector/hiera.rb +7 -1
  197. data/lib/puppet/indirector/indirection.rb +12 -3
  198. data/lib/puppet/indirector/json.rb +3 -3
  199. data/lib/puppet/indirector/key/ca.rb +2 -2
  200. data/lib/puppet/indirector/key/file.rb +2 -1
  201. data/lib/puppet/indirector/msgpack.rb +2 -2
  202. data/lib/puppet/indirector/node/exec.rb +1 -1
  203. data/lib/puppet/indirector/node/ldap.rb +1 -1
  204. data/lib/puppet/indirector/request.rb +36 -12
  205. data/lib/puppet/indirector/resource_type/parser.rb +10 -3
  206. data/lib/puppet/indirector/rest.rb +80 -5
  207. data/lib/puppet/indirector/ssl_file.rb +24 -3
  208. data/lib/puppet/indirector/terminus.rb +4 -4
  209. data/lib/puppet/info_service/class_information_service.rb +111 -0
  210. data/lib/puppet/info_service.rb +7 -0
  211. data/lib/puppet/interface/documentation.rb +1 -1
  212. data/lib/puppet/interface/face_collection.rb +1 -1
  213. data/lib/puppet/interface.rb +14 -2
  214. data/lib/puppet/loaders.rb +6 -0
  215. data/lib/puppet/metatype/manager.rb +25 -8
  216. data/lib/puppet/module.rb +65 -31
  217. data/lib/puppet/module_tool/applications/application.rb +1 -1
  218. data/lib/puppet/module_tool/applications/builder.rb +5 -4
  219. data/lib/puppet/module_tool/applications/installer.rb +14 -14
  220. data/lib/puppet/module_tool/applications/unpacker.rb +1 -1
  221. data/lib/puppet/module_tool/applications/upgrader.rb +13 -13
  222. data/lib/puppet/module_tool/checksums.rb +1 -1
  223. data/lib/puppet/module_tool/errors/installer.rb +2 -2
  224. data/lib/puppet/module_tool/installed_modules.rb +7 -7
  225. data/lib/puppet/module_tool/local_tarball.rb +3 -3
  226. data/lib/puppet/module_tool/metadata.rb +34 -11
  227. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +14 -3
  228. data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +42 -38
  229. data/lib/puppet/module_tool/skeleton/templates/generator/Rakefile +19 -4
  230. data/lib/puppet/module_tool/skeleton/templates/generator/{tests → examples}/init.pp.erb +2 -2
  231. data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +25 -18
  232. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -2
  233. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  234. data/lib/puppet/module_tool.rb +5 -5
  235. data/lib/puppet/network/auth_config_parser.rb +1 -1
  236. data/lib/puppet/network/authconfig.rb +21 -1
  237. data/lib/puppet/network/authorization.rb +8 -1
  238. data/lib/puppet/network/http/api/indirected_routes.rb +23 -34
  239. data/lib/puppet/network/http/api/master/v3/environment.rb +63 -0
  240. data/lib/puppet/network/http/api/master/v3.rb +7 -1
  241. data/lib/puppet/network/http/compression.rb +2 -1
  242. data/lib/puppet/network/http/connection.rb +2 -0
  243. data/lib/puppet/network/http/error.rb +1 -1
  244. data/lib/puppet/network/http/factory.rb +8 -4
  245. data/lib/puppet/network/http/handler.rb +3 -2
  246. data/lib/puppet/network/http/pool.rb +9 -0
  247. data/lib/puppet/network/http/rack/rest.rb +25 -2
  248. data/lib/puppet/network/http/webrick.rb +2 -1
  249. data/lib/puppet/network/rights.rb +1 -11
  250. data/lib/puppet/node/environment.rb +53 -14
  251. data/lib/puppet/node/facts.rb +1 -1
  252. data/lib/puppet/node.rb +39 -8
  253. data/lib/puppet/parameter/boolean.rb +1 -1
  254. data/lib/puppet/parameter/value.rb +1 -1
  255. data/lib/puppet/parameter.rb +23 -3
  256. data/lib/puppet/parser/ast/pops_bridge.rb +101 -27
  257. data/lib/puppet/parser/ast/resource.rb +5 -0
  258. data/lib/puppet/parser/ast/resource_instance.rb +5 -1
  259. data/lib/puppet/parser/ast/resourceparam.rb +5 -0
  260. data/lib/puppet/parser/ast.rb +5 -0
  261. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
  262. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +60 -0
  263. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
  264. data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
  265. data/lib/puppet/parser/compiler.rb +334 -42
  266. data/lib/puppet/parser/e4_parser_adapter.rb +13 -12
  267. data/lib/puppet/parser/environment_compiler.rb +201 -0
  268. data/lib/puppet/parser/functions/assert_type.rb +47 -17
  269. data/lib/puppet/parser/functions/binary_file.rb +24 -0
  270. data/lib/puppet/parser/functions/break.rb +39 -0
  271. data/lib/puppet/parser/functions/contain.rb +7 -15
  272. data/lib/puppet/parser/functions/create_resources.rb +39 -23
  273. data/lib/puppet/parser/functions/defined.rb +106 -69
  274. data/lib/puppet/parser/functions/dig.rb +29 -0
  275. data/lib/puppet/parser/functions/each.rb +86 -28
  276. data/lib/puppet/parser/functions/epp.rb +30 -38
  277. data/lib/puppet/parser/functions/file.rb +3 -1
  278. data/lib/puppet/parser/functions/filter.rb +60 -24
  279. data/lib/puppet/parser/functions/find_file.rb +28 -0
  280. data/lib/puppet/parser/functions/fqdn_rand.rb +3 -3
  281. data/lib/puppet/parser/functions/hiera.rb +98 -28
  282. data/lib/puppet/parser/functions/hiera_array.rb +86 -29
  283. data/lib/puppet/parser/functions/hiera_hash.rb +96 -31
  284. data/lib/puppet/parser/functions/hiera_include.rb +96 -41
  285. data/lib/puppet/parser/functions/include.rb +4 -8
  286. data/lib/puppet/parser/functions/inline_epp.rb +36 -61
  287. data/lib/puppet/parser/functions/inline_template.rb +2 -2
  288. data/lib/puppet/parser/functions/lest.rb +49 -0
  289. data/lib/puppet/parser/functions/lookup.rb +129 -151
  290. data/lib/puppet/parser/functions/map.rb +56 -21
  291. data/lib/puppet/parser/functions/match.rb +29 -13
  292. data/lib/puppet/parser/functions/new.rb +926 -0
  293. data/lib/puppet/parser/functions/next.rb +38 -0
  294. data/lib/puppet/parser/functions/reduce.rb +98 -61
  295. data/lib/puppet/parser/functions/regsubst.rb +4 -2
  296. data/lib/puppet/parser/functions/require.rb +4 -27
  297. data/lib/puppet/parser/functions/return.rb +71 -0
  298. data/lib/puppet/parser/functions/reverse_each.rb +83 -0
  299. data/lib/puppet/parser/functions/scanf.rb +25 -31
  300. data/lib/puppet/parser/functions/slice.rb +18 -25
  301. data/lib/puppet/parser/functions/split.rb +2 -2
  302. data/lib/puppet/parser/functions/step.rb +84 -0
  303. data/lib/puppet/parser/functions/strftime.rb +185 -0
  304. data/lib/puppet/parser/functions/then.rb +73 -0
  305. data/lib/puppet/parser/functions/type.rb +53 -0
  306. data/lib/puppet/parser/functions/with.rb +17 -9
  307. data/lib/puppet/parser/functions.rb +34 -16
  308. data/lib/puppet/parser/resource.rb +149 -35
  309. data/lib/puppet/parser/scope.rb +354 -89
  310. data/lib/puppet/parser/templatewrapper.rb +2 -1
  311. data/lib/puppet/parser/type_loader.rb +1 -1
  312. data/lib/puppet/parser.rb +3 -1
  313. data/lib/puppet/plugins/configuration.rb +11 -2
  314. data/lib/puppet/plugins/data_providers/data_provider.rb +406 -0
  315. data/lib/puppet/plugins/data_providers/registry.rb +51 -0
  316. data/lib/puppet/plugins/data_providers.rb +15 -60
  317. data/lib/puppet/pops/adaptable.rb +4 -4
  318. data/lib/puppet/pops/adapters.rb +114 -31
  319. data/lib/puppet/pops/binder/binder.rb +21 -17
  320. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  321. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  322. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  323. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  324. data/lib/puppet/pops/binder/bindings_label_provider.rb +3 -1
  325. data/lib/puppet/pops/binder/bindings_loader.rb +6 -2
  326. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  327. data/lib/puppet/pops/binder/bindings_model_meta.rb +2 -2
  328. data/lib/puppet/pops/binder/config/binder_config.rb +1 -1
  329. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  330. data/lib/puppet/pops/binder/injector.rb +55 -50
  331. data/lib/puppet/pops/binder/key_factory.rb +10 -12
  332. data/lib/puppet/pops/binder/producers.rb +70 -65
  333. data/lib/puppet/pops/binder/scheme_handler/confdir_scheme.rb +1 -1
  334. data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +68 -9
  335. data/lib/puppet/pops/evaluator/access_operator.rb +261 -142
  336. data/lib/puppet/pops/evaluator/callable_signature.rb +7 -0
  337. data/lib/puppet/pops/evaluator/closure.rb +251 -109
  338. data/lib/puppet/pops/evaluator/collector_transformer.rb +45 -26
  339. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
  340. data/lib/puppet/pops/evaluator/collectors/catalog_collector.rb +4 -0
  341. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +5 -2
  342. data/lib/puppet/pops/evaluator/compare_operator.rb +110 -10
  343. data/lib/puppet/pops/evaluator/epp_evaluator.rb +16 -10
  344. data/lib/puppet/pops/evaluator/evaluator_impl.rb +239 -117
  345. data/lib/puppet/pops/evaluator/external_syntax_support.rb +1 -1
  346. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +84 -0
  347. data/lib/puppet/pops/evaluator/literal_evaluator.rb +87 -0
  348. data/lib/puppet/pops/evaluator/relationship_operator.rb +18 -11
  349. data/lib/puppet/pops/evaluator/runtime3_converter.rb +60 -51
  350. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +119 -0
  351. data/lib/puppet/pops/evaluator/runtime3_support.rb +119 -82
  352. data/lib/puppet/pops/functions/dispatch.rb +33 -8
  353. data/lib/puppet/pops/functions/dispatcher.rb +17 -16
  354. data/lib/puppet/pops/functions/function.rb +30 -4
  355. data/lib/puppet/pops/issue_reporter.rb +49 -21
  356. data/lib/puppet/pops/issues.rb +292 -18
  357. data/lib/puppet/pops/label_provider.rb +18 -4
  358. data/lib/puppet/pops/loader/base_loader.rb +74 -20
  359. data/lib/puppet/pops/loader/dependency_loader.rb +27 -2
  360. data/lib/puppet/pops/loader/loader.rb +53 -48
  361. data/lib/puppet/pops/loader/loader_paths.rb +113 -6
  362. data/lib/puppet/pops/loader/module_loaders.rb +72 -28
  363. data/lib/puppet/pops/loader/null_loader.rb +17 -1
  364. data/lib/puppet/pops/loader/predefined_loader.rb +29 -0
  365. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +84 -0
  366. data/lib/puppet/pops/loader/puppet_resource_type_impl_instantiator.rb +80 -0
  367. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -4
  368. data/lib/puppet/pops/loader/runtime3_type_loader.rb +96 -0
  369. data/lib/puppet/pops/loader/static_loader.rb +139 -38
  370. data/lib/puppet/pops/loader/type_definition_instantiator.rb +93 -0
  371. data/lib/puppet/pops/loader/typed_name.rb +48 -0
  372. data/lib/puppet/pops/loaders.rb +209 -29
  373. data/lib/puppet/pops/lookup/configured_data_provider.rb +93 -0
  374. data/lib/puppet/pops/lookup/context.rb +200 -0
  375. data/lib/puppet/pops/lookup/data_adapter.rb +27 -0
  376. data/lib/puppet/pops/lookup/data_dig_function_provider.rb +145 -0
  377. data/lib/puppet/pops/lookup/data_hash_function_provider.rb +126 -0
  378. data/lib/puppet/pops/lookup/data_provider.rb +107 -0
  379. data/lib/puppet/pops/lookup/environment_data_provider.rb +35 -0
  380. data/lib/puppet/pops/lookup/explainer.rb +594 -0
  381. data/lib/puppet/pops/lookup/function_provider.rb +110 -0
  382. data/lib/puppet/pops/lookup/global_data_provider.rb +78 -0
  383. data/lib/puppet/pops/lookup/hiera_config.rb +782 -0
  384. data/lib/puppet/pops/lookup/interpolation.rb +153 -0
  385. data/lib/puppet/pops/lookup/invocation.rb +251 -0
  386. data/lib/puppet/pops/lookup/location_resolver.rb +99 -0
  387. data/lib/puppet/pops/lookup/lookup_adapter.rb +510 -0
  388. data/lib/puppet/pops/lookup/lookup_key.rb +99 -0
  389. data/lib/puppet/pops/lookup/lookup_key_function_provider.rb +92 -0
  390. data/lib/puppet/pops/lookup/module_data_provider.rb +81 -0
  391. data/lib/puppet/pops/lookup/sub_lookup.rb +90 -0
  392. data/lib/puppet/pops/lookup.rb +47 -49
  393. data/lib/puppet/pops/merge_strategy.rb +183 -47
  394. data/lib/puppet/pops/migration/migration_checker.rb +58 -0
  395. data/lib/puppet/pops/model/ast_transformer.rb +8 -1
  396. data/lib/puppet/pops/model/factory.rb +257 -161
  397. data/lib/puppet/pops/model/model.rb +25 -8
  398. data/lib/puppet/pops/model/model_label_provider.rb +30 -6
  399. data/lib/puppet/pops/model/model_meta.rb +50 -3
  400. data/lib/puppet/pops/model/model_tree_dumper.rb +44 -0
  401. data/lib/puppet/pops/parser/code_merger.rb +13 -1
  402. data/lib/puppet/pops/parser/egrammar.ra +155 -38
  403. data/lib/puppet/pops/parser/eparser.rb +1894 -1314
  404. data/lib/puppet/pops/parser/epp_support.rb +27 -12
  405. data/lib/puppet/pops/parser/evaluating_parser.rb +27 -13
  406. data/lib/puppet/pops/parser/heredoc_support.rb +20 -16
  407. data/lib/puppet/pops/parser/interpolation_support.rb +14 -1
  408. data/lib/puppet/pops/parser/lexer2.rb +466 -380
  409. data/lib/puppet/pops/parser/lexer_support.rb +132 -25
  410. data/lib/puppet/pops/parser/locator.rb +63 -9
  411. data/lib/puppet/pops/parser/parser_support.rb +49 -40
  412. data/lib/puppet/pops/parser/slurp_support.rb +37 -12
  413. data/lib/puppet/pops/patterns.rb +16 -1
  414. data/lib/puppet/pops/pcore.rb +96 -0
  415. data/lib/puppet/pops/puppet_stack.rb +43 -0
  416. data/lib/puppet/pops/resource/param.rb +55 -0
  417. data/lib/puppet/pops/resource/resource_type_impl.rb +314 -0
  418. data/lib/puppet/pops/resource/resource_type_set.pcore +22 -0
  419. data/lib/puppet/pops/serialization/abstract_reader.rb +176 -0
  420. data/lib/puppet/pops/serialization/abstract_writer.rb +207 -0
  421. data/lib/puppet/pops/serialization/deserializer.rb +77 -0
  422. data/lib/puppet/pops/serialization/extension.rb +157 -0
  423. data/lib/puppet/pops/serialization/instance_reader.rb +19 -0
  424. data/lib/puppet/pops/serialization/instance_writer.rb +14 -0
  425. data/lib/puppet/pops/serialization/json.rb +297 -0
  426. data/lib/puppet/pops/serialization/object.rb +71 -0
  427. data/lib/puppet/pops/serialization/rgen.rb +152 -0
  428. data/lib/puppet/pops/serialization/serializer.rb +118 -0
  429. data/lib/puppet/pops/serialization/time_factory.rb +67 -0
  430. data/lib/puppet/pops/serialization.rb +17 -0
  431. data/lib/puppet/pops/time/timespan.rb +718 -0
  432. data/lib/puppet/pops/time/timestamp.rb +148 -0
  433. data/lib/puppet/pops/types/annotatable.rb +36 -0
  434. data/lib/puppet/pops/types/class_loader.rb +25 -23
  435. data/lib/puppet/pops/types/enumeration.rb +9 -27
  436. data/lib/puppet/pops/types/implementation_registry.rb +141 -0
  437. data/lib/puppet/pops/types/iterable.rb +308 -0
  438. data/lib/puppet/pops/types/p_binary_type.rb +220 -0
  439. data/lib/puppet/pops/types/p_meta_type.rb +83 -0
  440. data/lib/puppet/pops/types/p_object_type.rb +886 -0
  441. data/lib/puppet/pops/types/p_runtime_type.rb +115 -0
  442. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +187 -0
  443. data/lib/puppet/pops/types/p_sem_ver_type.rb +141 -0
  444. data/lib/puppet/pops/types/p_sensitive_type.rb +73 -0
  445. data/lib/puppet/pops/types/p_timespan_type.rb +141 -0
  446. data/lib/puppet/pops/types/p_timestamp_type.rb +69 -0
  447. data/lib/puppet/pops/types/p_type_set_type.rb +352 -0
  448. data/lib/puppet/pops/types/puppet_object.rb +16 -0
  449. data/lib/puppet/pops/types/recursion_guard.rb +136 -0
  450. data/lib/puppet/pops/types/ruby_generator.rb +275 -0
  451. data/lib/puppet/pops/types/string_converter.rb +1033 -0
  452. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  453. data/lib/puppet/pops/types/type_asserter.rb +21 -19
  454. data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
  455. data/lib/puppet/pops/types/type_calculator.rb +244 -1186
  456. data/lib/puppet/pops/types/type_conversion_error.rb +15 -0
  457. data/lib/puppet/pops/types/type_factory.rb +270 -164
  458. data/lib/puppet/pops/types/type_formatter.rb +686 -0
  459. data/lib/puppet/pops/types/type_mismatch_describer.rb +1105 -0
  460. data/lib/puppet/pops/types/type_parser.rb +372 -280
  461. data/lib/puppet/pops/types/type_set_reference.rb +59 -0
  462. data/lib/puppet/pops/types/types.rb +3293 -295
  463. data/lib/puppet/pops/utils.rb +11 -10
  464. data/lib/puppet/pops/validation/checker4_0.rb +289 -75
  465. data/lib/puppet/pops/validation/validator_factory_4_0.rb +13 -5
  466. data/lib/puppet/pops/validation.rb +56 -18
  467. data/lib/puppet/pops/visitor.rb +9 -6
  468. data/lib/puppet/pops.rb +44 -25
  469. data/lib/puppet/property/ensure.rb +1 -1
  470. data/lib/puppet/property.rb +67 -7
  471. data/lib/puppet/provider/aixobject.rb +4 -4
  472. data/lib/puppet/provider/augeas/augeas.rb +57 -2
  473. data/lib/puppet/provider/cron/crontab.rb +1 -1
  474. data/lib/puppet/provider/exec/windows.rb +1 -1
  475. data/lib/puppet/provider/exec.rb +10 -3
  476. data/lib/puppet/provider/group/aix.rb +4 -4
  477. data/lib/puppet/provider/group/directoryservice.rb +10 -0
  478. data/lib/puppet/provider/group/pw.rb +1 -0
  479. data/lib/puppet/provider/group/windows_adsi.rb +23 -7
  480. data/lib/puppet/provider/macauthorization/macauthorization.rb +11 -10
  481. data/lib/puppet/provider/mailalias/aliases.rb +1 -1
  482. data/lib/puppet/provider/mcx/mcxcontent.rb +5 -4
  483. data/lib/puppet/provider/mount/parsed.rb +159 -2
  484. data/lib/puppet/provider/nameservice/directoryservice.rb +55 -62
  485. data/lib/puppet/provider/nameservice.rb +23 -8
  486. data/lib/puppet/provider/package/appdmg.rb +7 -6
  487. data/lib/puppet/provider/package/apple.rb +1 -1
  488. data/lib/puppet/provider/package/apt.rb +1 -1
  489. data/lib/puppet/provider/package/dnf.rb +46 -0
  490. data/lib/puppet/provider/package/gem.rb +29 -3
  491. data/lib/puppet/provider/package/nim.rb +2 -2
  492. data/lib/puppet/provider/package/openbsd.rb +7 -7
  493. data/lib/puppet/provider/package/pacman.rb +11 -10
  494. data/lib/puppet/provider/package/pip.rb +83 -22
  495. data/lib/puppet/provider/package/pip3.rb +20 -0
  496. data/lib/puppet/provider/package/pkg.rb +12 -8
  497. data/lib/puppet/provider/package/pkgdmg.rb +11 -8
  498. data/lib/puppet/provider/package/pkgin.rb +4 -4
  499. data/lib/puppet/provider/package/pkgng.rb +143 -0
  500. data/lib/puppet/provider/package/pkgutil.rb +1 -1
  501. data/lib/puppet/provider/package/portage.rb +48 -8
  502. data/lib/puppet/provider/package/ports.rb +0 -3
  503. data/lib/puppet/provider/package/puppet_gem.rb +0 -0
  504. data/lib/puppet/provider/package/rpm.rb +123 -17
  505. data/lib/puppet/provider/package/sun.rb +1 -1
  506. data/lib/puppet/provider/package/tdnf.rb +28 -0
  507. data/lib/puppet/provider/package/windows/exe_package.rb +10 -9
  508. data/lib/puppet/provider/package/windows/msi_package.rb +4 -4
  509. data/lib/puppet/provider/package/windows/package.rb +9 -1
  510. data/lib/puppet/provider/package/windows.rb +1 -1
  511. data/lib/puppet/provider/package/yum.rb +62 -83
  512. data/lib/puppet/provider/package/zypper.rb +69 -15
  513. data/lib/puppet/provider/package.rb +6 -2
  514. data/lib/puppet/provider/parsedfile.rb +2 -2
  515. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +39 -7
  516. data/lib/puppet/provider/selmodule/semodule.rb +20 -16
  517. data/lib/puppet/provider/service/base.rb +4 -3
  518. data/lib/puppet/provider/service/bsd.rb +9 -9
  519. data/lib/puppet/provider/service/daemontools.rb +5 -5
  520. data/lib/puppet/provider/service/debian.rb +14 -5
  521. data/lib/puppet/provider/service/freebsd.rb +1 -1
  522. data/lib/puppet/provider/service/init.rb +27 -3
  523. data/lib/puppet/provider/service/launchd.rb +57 -19
  524. data/lib/puppet/provider/service/rcng.rb +51 -0
  525. data/lib/puppet/provider/service/redhat.rb +2 -1
  526. data/lib/puppet/provider/service/runit.rb +4 -4
  527. data/lib/puppet/provider/service/smf.rb +59 -8
  528. data/lib/puppet/provider/service/src.rb +66 -39
  529. data/lib/puppet/provider/service/systemd.rb +141 -22
  530. data/lib/puppet/provider/service/upstart.rb +1 -1
  531. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +1 -1
  532. data/lib/puppet/provider/sshkey/parsed.rb +20 -10
  533. data/lib/puppet/provider/user/aix.rb +11 -5
  534. data/lib/puppet/provider/user/directoryservice.rb +43 -66
  535. data/lib/puppet/provider/user/hpux.rb +1 -1
  536. data/lib/puppet/provider/user/openbsd.rb +1 -0
  537. data/lib/puppet/provider/user/pw.rb +1 -0
  538. data/lib/puppet/provider/user/user_role_add.rb +19 -2
  539. data/lib/puppet/provider/user/windows_adsi.rb +51 -2
  540. data/lib/puppet/provider/yumrepo/inifile.rb +9 -6
  541. data/lib/puppet/provider/zfs/zfs.rb +2 -2
  542. data/lib/puppet/provider/zone/solaris.rb +6 -3
  543. data/lib/puppet/provider/zpool/zpool.rb +2 -2
  544. data/lib/puppet/provider.rb +9 -7
  545. data/lib/puppet/reference/configuration.rb +13 -5
  546. data/lib/puppet/reference/indirection.rb +2 -2
  547. data/lib/puppet/reference/providers.rb +2 -3
  548. data/lib/puppet/reference/report.rb +9 -12
  549. data/lib/puppet/reference/type.rb +1 -1
  550. data/lib/puppet/reports.rb +5 -1
  551. data/lib/puppet/resource/capability_finder.rb +128 -0
  552. data/lib/puppet/resource/catalog.rb +167 -40
  553. data/lib/puppet/resource/status.rb +30 -5
  554. data/lib/puppet/resource/type.rb +247 -50
  555. data/lib/puppet/resource/type_collection.rb +83 -10
  556. data/lib/puppet/resource.rb +212 -146
  557. data/lib/puppet/settings/base_setting.rb +9 -3
  558. data/lib/puppet/settings/config_file.rb +3 -2
  559. data/lib/puppet/settings/directory_setting.rb +6 -0
  560. data/lib/puppet/settings/environment_conf.rb +26 -6
  561. data/lib/puppet/settings/file_or_directory_setting.rb +6 -0
  562. data/lib/puppet/settings/file_setting.rb +20 -9
  563. data/lib/puppet/settings/ini_file.rb +2 -2
  564. data/lib/puppet/settings/server_list_setting.rb +20 -0
  565. data/lib/puppet/settings/symbolic_enum_setting.rb +17 -0
  566. data/lib/puppet/settings.rb +117 -45
  567. data/lib/puppet/ssl/base.rb +14 -1
  568. data/lib/puppet/ssl/certificate.rb +1 -1
  569. data/lib/puppet/ssl/certificate_authority/interface.rb +166 -26
  570. data/lib/puppet/ssl/certificate_authority.rb +49 -13
  571. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  572. data/lib/puppet/ssl/certificate_request.rb +5 -5
  573. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  574. data/lib/puppet/ssl/configuration.rb +4 -1
  575. data/lib/puppet/ssl/host.rb +26 -4
  576. data/lib/puppet/ssl/inventory.rb +10 -3
  577. data/lib/puppet/ssl/key.rb +7 -3
  578. data/lib/puppet/ssl/oids.rb +43 -3
  579. data/lib/puppet/ssl/validator/default_validator.rb +3 -3
  580. data/lib/puppet/syntax_checkers/base64.rb +41 -0
  581. data/lib/puppet/syntax_checkers/json.rb +0 -2
  582. data/lib/puppet/test/test_helper.rb +21 -7
  583. data/lib/puppet/transaction/additional_resource_generator.rb +101 -8
  584. data/lib/puppet/transaction/event.rb +29 -2
  585. data/lib/puppet/transaction/event_manager.rb +1 -1
  586. data/lib/puppet/transaction/persistence.rb +84 -0
  587. data/lib/puppet/transaction/report.rb +86 -4
  588. data/lib/puppet/transaction/resource_harness.rb +95 -35
  589. data/lib/puppet/transaction.rb +64 -36
  590. data/lib/puppet/type/augeas.rb +13 -4
  591. data/lib/puppet/type/component.rb +11 -0
  592. data/lib/puppet/type/cron.rb +13 -13
  593. data/lib/puppet/type/exec.rb +43 -19
  594. data/lib/puppet/type/file/checksum.rb +1 -0
  595. data/lib/puppet/type/file/checksum_value.rb +53 -0
  596. data/lib/puppet/type/file/content.rb +36 -121
  597. data/lib/puppet/type/file/data_sync.rb +92 -0
  598. data/lib/puppet/type/file/ensure.rb +22 -19
  599. data/lib/puppet/type/file/selcontext.rb +1 -1
  600. data/lib/puppet/type/file/source.rb +121 -34
  601. data/lib/puppet/type/file/target.rb +2 -2
  602. data/lib/puppet/type/file.rb +146 -46
  603. data/lib/puppet/type/filebucket.rb +1 -1
  604. data/lib/puppet/type/group.rb +26 -8
  605. data/lib/puppet/type/host.rb +1 -1
  606. data/lib/puppet/type/interface.rb +8 -3
  607. data/lib/puppet/type/macauthorization.rb +1 -1
  608. data/lib/puppet/type/mount.rb +25 -2
  609. data/lib/puppet/type/notify.rb +1 -1
  610. data/lib/puppet/type/package.rb +32 -12
  611. data/lib/puppet/type/resources.rb +1 -1
  612. data/lib/puppet/type/schedule.rb +5 -5
  613. data/lib/puppet/type/scheduled_task.rb +14 -1
  614. data/lib/puppet/type/service.rb +24 -0
  615. data/lib/puppet/type/ssh_authorized_key.rb +17 -11
  616. data/lib/puppet/type/sshkey.rb +5 -3
  617. data/lib/puppet/type/stage.rb +1 -1
  618. data/lib/puppet/type/tidy.rb +10 -5
  619. data/lib/puppet/type/user.rb +83 -26
  620. data/lib/puppet/type/yumrepo.rb +28 -8
  621. data/lib/puppet/type/zone.rb +6 -6
  622. data/lib/puppet/type.rb +175 -41
  623. data/lib/puppet/util/autoload.rb +16 -11
  624. data/lib/puppet/util/character_encoding.rb +95 -0
  625. data/lib/puppet/util/checksums.rb +74 -31
  626. data/lib/puppet/util/classgen.rb +1 -1
  627. data/lib/puppet/util/command_line/trollop.rb +1 -1
  628. data/lib/puppet/util/command_line.rb +10 -2
  629. data/lib/puppet/util/execution.rb +35 -16
  630. data/lib/puppet/util/feature.rb +1 -1
  631. data/lib/puppet/util/filetype.rb +11 -5
  632. data/lib/puppet/util/http_proxy.rb +132 -0
  633. data/lib/puppet/util/inifile.rb +1 -1
  634. data/lib/puppet/util/instance_loader.rb +1 -1
  635. data/lib/puppet/util/log/destinations.rb +23 -2
  636. data/lib/puppet/util/log.rb +78 -9
  637. data/lib/puppet/util/logging.rb +82 -3
  638. data/lib/puppet/util/monkey_patches.rb +20 -7
  639. data/lib/puppet/util/multi_match.rb +51 -0
  640. data/lib/puppet/util/network_device/cisco/device.rb +24 -6
  641. data/lib/puppet/util/network_device/cisco/interface.rb +21 -9
  642. data/lib/puppet/util/network_device/config.rb +1 -1
  643. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  644. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  645. data/lib/puppet/util/plist.rb +151 -0
  646. data/lib/puppet/util/profiler/aggregate.rb +1 -1
  647. data/lib/puppet/util/profiler/around_profiler.rb +1 -1
  648. data/lib/puppet/util/profiler.rb +1 -1
  649. data/lib/puppet/util/psych_support.rb +1 -1
  650. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +2 -2
  651. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +2 -1
  652. data/lib/puppet/util/rdoc.rb +2 -2
  653. data/lib/puppet/util/reference.rb +4 -2
  654. data/lib/puppet/util/resource_template.rb +1 -1
  655. data/lib/puppet/util/rubygems.rb +1 -1
  656. data/lib/puppet/util/run_mode.rb +3 -16
  657. data/lib/puppet/util/skip_tags.rb +9 -0
  658. data/lib/puppet/util/splayer.rb +18 -0
  659. data/lib/puppet/util/tagging.rb +8 -2
  660. data/lib/puppet/util/watcher/periodic_watcher.rb +2 -2
  661. data/lib/puppet/util/windows/access_control_entry.rb +2 -2
  662. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  663. data/lib/puppet/util/windows/adsi.rb +212 -75
  664. data/lib/puppet/util/windows/api_types.rb +24 -18
  665. data/lib/puppet/util/windows/com.rb +3 -3
  666. data/lib/puppet/util/windows/error.rb +1 -1
  667. data/lib/puppet/util/windows/file.rb +112 -19
  668. data/lib/puppet/util/windows/principal.rb +190 -0
  669. data/lib/puppet/util/windows/process.rb +88 -11
  670. data/lib/puppet/util/windows/registry.rb +22 -16
  671. data/lib/puppet/util/windows/root_certs.rb +5 -5
  672. data/lib/puppet/util/windows/security.rb +38 -37
  673. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  674. data/lib/puppet/util/windows/sid.rb +84 -15
  675. data/lib/puppet/util/windows/taskscheduler.rb +99 -43
  676. data/lib/puppet/util/windows/user.rb +32 -14
  677. data/lib/puppet/util/windows.rb +5 -0
  678. data/lib/puppet/util/yaml.rb +15 -3
  679. data/lib/puppet/util.rb +125 -23
  680. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  681. data/lib/puppet/vendor/deep_merge/test/test_deep_merge.rb +1 -1
  682. data/lib/puppet/vendor/load_semantic_puppet.rb +1 -0
  683. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  684. data/lib/puppet/vendor/pathspec/README.md +1 -1
  685. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +2 -1
  686. data/lib/puppet/vendor/require_vendored.rb +0 -1
  687. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  688. data/lib/puppet/vendor/rgen_patch.rb +1 -1
  689. data/lib/puppet/vendor/semantic/lib/semantic.rb +4 -6
  690. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph.rb +2 -2
  691. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph_node.rb +2 -2
  692. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/module_release.rb +17 -5
  693. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/source.rb +2 -2
  694. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/unsatisfiable_graph.rb +2 -2
  695. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency.rb +7 -7
  696. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/gem_version.rb +3 -0
  697. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/locales/config.yaml +21 -0
  698. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version.rb +48 -21
  699. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version_range.rb +15 -17
  700. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +17 -0
  701. data/lib/puppet/version.rb +7 -3
  702. data/lib/puppet.rb +86 -2
  703. data/lib/puppet_x.rb +7 -1
  704. data/lib/semver.rb +36 -13
  705. data/locales/config.yaml +29 -0
  706. data/locales/puppet.pot +93 -0
  707. data/man/man5/puppet.conf.5 +61 -19
  708. data/man/man8/extlookup2hiera.8 +2 -2
  709. data/man/man8/puppet-agent.8 +6 -3
  710. data/man/man8/puppet-apply.8 +6 -3
  711. data/man/man8/puppet-ca.8 +3 -3
  712. data/man/man8/puppet-catalog.8 +3 -3
  713. data/man/man8/puppet-cert.8 +3 -3
  714. data/man/man8/puppet-certificate.8 +3 -3
  715. data/man/man8/puppet-certificate_request.8 +3 -3
  716. data/man/man8/puppet-certificate_revocation_list.8 +3 -3
  717. data/man/man8/puppet-config.8 +4 -4
  718. data/man/man8/puppet-describe.8 +2 -2
  719. data/man/man8/puppet-device.8 +7 -4
  720. data/man/man8/puppet-doc.8 +2 -2
  721. data/man/man8/puppet-epp.8 +3 -3
  722. data/man/man8/puppet-facts.8 +3 -3
  723. data/man/man8/puppet-file.8 +3 -3
  724. data/man/man8/puppet-filebucket.8 +3 -3
  725. data/man/man8/puppet-help.8 +3 -3
  726. data/man/man8/puppet-inspect.8 +3 -3
  727. data/man/man8/puppet-key.8 +3 -3
  728. data/man/man8/puppet-man.8 +3 -3
  729. data/man/man8/puppet-master.8 +6 -3
  730. data/man/man8/puppet-module.8 +10 -10
  731. data/man/man8/puppet-node.8 +3 -3
  732. data/man/man8/puppet-parser.8 +3 -3
  733. data/man/man8/puppet-plugin.8 +3 -3
  734. data/man/man8/puppet-report.8 +3 -3
  735. data/man/man8/puppet-resource.8 +3 -3
  736. data/man/man8/puppet-resource_type.8 +3 -3
  737. data/man/man8/puppet-status.8 +4 -4
  738. data/man/man8/puppet.8 +2 -2
  739. data/spec/fixtures/module.tar.gz +0 -0
  740. data/spec/fixtures/unit/application/environments/production/data/common.yaml +22 -0
  741. data/spec/fixtures/unit/application/environments/production/environment.conf +1 -0
  742. data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
  743. data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
  744. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/environment/data.pp +10 -0
  745. data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
  746. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/data/bad.json +3 -0
  747. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/environment.conf +2 -0
  748. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
  749. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
  750. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
  751. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
  752. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
  753. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
  754. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
  755. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
  756. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
  757. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
  758. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
  759. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
  760. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
  761. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
  762. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
  763. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
  764. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/third_utf8.json +3 -0
  765. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/utf8.yaml +3 -0
  766. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
  767. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
  768. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +22 -0
  769. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
  770. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +48 -0
  771. data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
  772. data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
  773. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
  774. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
  775. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -0
  776. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
  777. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
  778. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/environment.conf +2 -0
  779. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
  780. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
  781. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
  782. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +2 -0
  783. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
  784. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/server1.yaml +1 -0
  785. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/server2.yaml +1 -0
  786. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
  787. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
  788. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +20 -0
  789. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
  790. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/metadata.json +9 -0
  791. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
  792. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
  793. data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
  794. data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
  795. data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
  796. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
  797. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
  798. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
  799. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
  800. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
  801. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
  802. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
  803. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
  804. data/spec/fixtures/unit/data_providers/environments/production/lib/puppet/functions/environment/data.rb +3 -1
  805. data/spec/fixtures/unit/data_providers/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +2 -1
  806. data/spec/fixtures/unit/data_providers/environments/production/modules/abc/manifests/init.pp +2 -1
  807. data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/functions/data.pp +6 -0
  808. data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/lib/puppet/bindings/xyz/default.rb +9 -0
  809. data/spec/fixtures/unit/data_providers/environments/production/modules/xyz/manifests/init.pp +9 -0
  810. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/hiera.yaml +5 -0
  811. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet/bindings/backend/default.rb +9 -0
  812. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet_x/backend/special_data_provider_factory.rb +23 -0
  813. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/manifests/init.pp +5 -0
  814. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/metadata.json +9 -0
  815. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +2 -0
  816. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_module_data.rb +1 -0
  817. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/manifests/init.pp +1 -1
  818. data/spec/fixtures/unit/functions/lookup/data/common.yaml +19 -0
  819. data/spec/fixtures/unit/functions/lookup_fixture/data/common.yaml +19 -0
  820. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  821. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/bad_data/manifests/init.pp +2 -0
  822. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/data/empty.json +0 -0
  823. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/hiera.yaml +5 -0
  824. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/manifests/init.pp +2 -0
  825. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_json/metadata.json +9 -0
  826. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/data/empty_key.json +1 -0
  827. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/hiera.yaml +5 -0
  828. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/manifests/init.pp +2 -0
  829. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_json/metadata.json +9 -0
  830. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/data/empty_key.yaml +1 -0
  831. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/hiera.yaml +5 -0
  832. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/manifests/init.pp +2 -0
  833. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_key_yaml/metadata.json +9 -0
  834. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/data/empty.yaml +2 -0
  835. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  836. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  837. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/empty_yaml/metadata.json +9 -0
  838. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/data/first.json +4 -0
  839. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/hiera.yaml +8 -0
  840. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
  841. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/hieraprovider/metadata.json +9 -0
  842. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
  843. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/meta/manifests/init.pp +3 -0
  844. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/meta/metadata.json +9 -0
  845. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +10 -0
  846. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +23 -0
  847. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/manifests/init.pp +3 -0
  848. data/spec/fixtures/unit/functions/lookup_fixture/environments/production/modules/metawcp/metadata.json +9 -0
  849. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  850. data/spec/fixtures/unit/parser/lexer/subclass_name_duplication.pp +0 -0
  851. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
  852. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
  853. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/type/usee_type.rb +5 -0
  854. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
  855. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  856. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
  857. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
  858. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
  859. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
  860. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
  861. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
  862. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
  863. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
  864. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +87 -0
  865. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
  866. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  867. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  868. data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/functions/puppetcalled.pp +3 -0
  869. data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/functions/puppetcaller.pp +3 -0
  870. data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/functions/puppetcaller4.pp +3 -0
  871. data/spec/fixtures/unit/pops/loaders/loaders/mix_4x_and_3x_functions/user/lib/puppet/functions/user/callingpuppet.rb +5 -0
  872. data/spec/fixtures/unit/pops/loaders/loaders/module_no_lib/modules/modulea/functions/hello.pp +3 -0
  873. data/spec/fixtures/unit/pops/loaders/loaders/module_no_lib/modules/modulea/manifests/init.pp +3 -0
  874. data/spec/fixtures/unit/pops/loaders/loaders/module_no_lib/modules/modulea/metadata.json +10 -0
  875. data/spec/fixtures/unit/pops/loaders/loaders/no_modules/manifests/site.pp +10 -0
  876. data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/functions/hello.pp +3 -0
  877. data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/functions/subspace/hello.pp +3 -0
  878. data/spec/fixtures/unit/pops/loaders/loaders/single_module/modules/modulea/metadata.json +1 -10
  879. data/spec/fixtures/unit/pops/parser/lexer/subclass_name_duplication.pp +0 -0
  880. data/spec/fixtures/unit/provider/mount/parsed/aix.filesystems +93 -85
  881. data/spec/fixtures/unit/provider/mount/parsed/aix.mount +11 -7
  882. data/spec/fixtures/unit/provider/package/pkgng/pkg.info +8 -0
  883. data/spec/fixtures/unit/provider/package/pkgng/pkg.query +1 -0
  884. data/spec/fixtures/unit/provider/package/pkgng/pkg.query_absent +1 -0
  885. data/spec/fixtures/unit/provider/package/pkgng/pkg.version +3 -0
  886. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  887. data/spec/fixtures/unit/provider/package/yum/yum-check-update-obsoletes.txt +195 -0
  888. data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
  889. data/spec/fixtures/unit/provider/package/zypper/zypper-list-updates-empty.out +3 -0
  890. data/spec/fixtures/unit/provider/service/smf/svcs.out +4 -3
  891. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  892. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
  893. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
  894. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -0
  895. 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
  896. 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
  897. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  898. 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
  899. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  900. 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
  901. 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
  902. data/spec/integration/agent/logging_spec.rb +15 -14
  903. data/spec/integration/application/apply_spec.rb +432 -29
  904. data/spec/integration/application/doc_spec.rb +0 -0
  905. data/spec/integration/application/lookup_spec.rb +155 -0
  906. data/spec/integration/configurer_spec.rb +0 -0
  907. data/spec/integration/data_binding_spec.rb +195 -0
  908. data/spec/integration/defaults_spec.rb +27 -2
  909. data/spec/integration/directory_environments_spec.rb +16 -0
  910. data/spec/integration/environments/default_manifest_spec.rb +16 -16
  911. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  912. data/spec/integration/environments/settings_spec.rb +32 -4
  913. data/spec/integration/faces/ca_spec.rb +0 -0
  914. data/spec/integration/faces/config_spec.rb +80 -0
  915. data/spec/integration/faces/documentation_spec.rb +1 -1
  916. data/spec/integration/faces/plugin_spec.rb +0 -4
  917. data/spec/integration/file_bucket/file_spec.rb +2 -2
  918. data/spec/integration/file_serving/fileset_spec.rb +0 -0
  919. data/spec/integration/file_serving/terminus_helper_spec.rb +0 -0
  920. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  921. data/spec/integration/indirector/catalog/compiler_spec.rb +0 -0
  922. data/spec/integration/indirector/direct_file_server_spec.rb +0 -0
  923. data/spec/integration/indirector/facts/facter_spec.rb +97 -0
  924. data/spec/integration/indirector/file_content/file_server_spec.rb +0 -0
  925. data/spec/integration/indirector/file_metadata/file_server_spec.rb +0 -0
  926. data/spec/integration/indirector/node/ldap_spec.rb +0 -0
  927. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  928. data/spec/integration/network/formats_spec.rb +0 -0
  929. data/spec/integration/network/http/api/indirected_routes_spec.rb +33 -0
  930. data/spec/integration/node/environment_spec.rb +34 -0
  931. data/spec/integration/node/facts_spec.rb +0 -0
  932. data/spec/integration/node_spec.rb +0 -0
  933. data/spec/integration/parser/catalog_spec.rb +14 -2
  934. data/spec/integration/parser/collection_spec.rb +18 -0
  935. data/spec/integration/parser/compiler_spec.rb +877 -666
  936. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  937. data/spec/integration/parser/parameter_defaults_spec.rb +358 -0
  938. data/spec/integration/parser/pcore_resource_spec.rb +245 -0
  939. data/spec/integration/parser/resource_expressions_spec.rb +10 -5
  940. data/spec/integration/parser/scope_spec.rb +46 -7
  941. data/spec/integration/parser/undef_param_spec.rb +9 -1
  942. data/spec/integration/provider/mailalias/aliases_spec.rb +0 -0
  943. data/spec/integration/provider/mount_spec.rb +23 -36
  944. data/spec/integration/provider/service/init_spec.rb +0 -0
  945. data/spec/integration/provider/service/windows_spec.rb +3 -2
  946. data/spec/integration/provider/ssh_authorized_key_spec.rb +0 -0
  947. data/spec/integration/provider/yumrepo_spec.rb +4 -1
  948. data/spec/integration/reference/providers_spec.rb +0 -0
  949. data/spec/integration/reports_spec.rb +0 -0
  950. data/spec/integration/resource/catalog_spec.rb +1 -1
  951. data/spec/integration/resource/type_collection_spec.rb +8 -0
  952. data/spec/integration/ssl/autosign_spec.rb +18 -3
  953. data/spec/integration/ssl/certificate_authority_spec.rb +0 -1
  954. data/spec/integration/ssl/certificate_request_spec.rb +0 -1
  955. data/spec/integration/ssl/certificate_revocation_list_spec.rb +0 -1
  956. data/spec/integration/ssl/host_spec.rb +0 -1
  957. data/spec/integration/ssl/key_spec.rb +104 -0
  958. data/spec/integration/test/test_helper_spec.rb +32 -0
  959. data/spec/integration/transaction/report_spec.rb +682 -0
  960. data/spec/integration/transaction_spec.rb +126 -2
  961. data/spec/integration/type/exec_spec.rb +0 -0
  962. data/spec/integration/type/file_spec.rb +553 -51
  963. data/spec/integration/type/package_spec.rb +72 -1
  964. data/spec/integration/type/tidy_spec.rb +21 -9
  965. data/spec/integration/type/user_spec.rb +13 -6
  966. data/spec/integration/type_spec.rb +0 -0
  967. data/spec/integration/util/autoload_spec.rb +0 -0
  968. data/spec/integration/util/execution_spec.rb +30 -0
  969. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  970. data/spec/integration/util/settings_spec.rb +26 -0
  971. data/spec/integration/util/windows/adsi_spec.rb +99 -0
  972. data/spec/integration/util/windows/principal_spec.rb +250 -0
  973. data/spec/integration/util/windows/process_spec.rb +35 -2
  974. data/spec/{unit → integration}/util/windows/registry_spec.rb +92 -2
  975. data/spec/integration/util/windows/security_spec.rb +75 -21
  976. data/spec/integration/util/windows/user_spec.rb +27 -5
  977. data/spec/integration/util_spec.rb +49 -27
  978. data/spec/lib/matchers/include_in_order.rb +2 -3
  979. data/spec/lib/matchers/resource.rb +22 -1
  980. data/spec/lib/puppet/face/1.0.0/huzzah.rb +0 -0
  981. data/spec/lib/puppet/face/basetest.rb +0 -0
  982. data/spec/lib/puppet/face/huzzah.rb +0 -0
  983. data/spec/lib/puppet_spec/compiler.rb +32 -3
  984. data/spec/lib/puppet_spec/files.rb +16 -2
  985. data/spec/lib/puppet_spec/fixtures.rb +0 -0
  986. data/spec/lib/puppet_spec/language.rb +3 -1
  987. data/spec/lib/puppet_spec/matchers.rb +6 -4
  988. data/spec/lib/puppet_spec/module_tool/shared_functions.rb +2 -2
  989. data/spec/lib/puppet_spec/module_tool/stub_source.rb +1 -1
  990. data/spec/lib/puppet_spec/network.rb +12 -8
  991. data/spec/lib/puppet_spec/pops.rb +13 -0
  992. data/spec/lib/puppet_spec/unindent.rb +5 -0
  993. data/spec/lib/puppet_spec/verbose.rb +0 -0
  994. data/spec/shared_behaviours/all_parsedfile_providers.rb +0 -0
  995. data/spec/shared_behaviours/file_server_terminus.rb +0 -0
  996. data/spec/shared_behaviours/file_serving.rb +0 -0
  997. data/spec/shared_behaviours/iterative_functions.rb +9 -9
  998. data/spec/shared_behaviours/memory_terminus.rb +0 -0
  999. data/spec/shared_behaviours/path_parameters.rb +0 -0
  1000. data/spec/shared_behaviours/things_that_declare_options.rb +0 -0
  1001. data/spec/shared_contexts/types_setup.rb +106 -0
  1002. data/spec/shared_examples/rhel_package_provider.rb +357 -0
  1003. data/spec/spec_helper.rb +23 -2
  1004. data/spec/unit/agent/locker_spec.rb +4 -4
  1005. data/spec/unit/agent_spec.rb +12 -46
  1006. data/spec/unit/application/agent_spec.rb +15 -0
  1007. data/spec/unit/application/apply_spec.rb +31 -1
  1008. data/spec/unit/application/cert_spec.rb +20 -0
  1009. data/spec/unit/application/certificate_spec.rb +0 -0
  1010. data/spec/unit/application/config_spec.rb +0 -0
  1011. data/spec/unit/application/describe_spec.rb +0 -0
  1012. data/spec/unit/application/device_spec.rb +0 -0
  1013. data/spec/unit/application/doc_spec.rb +0 -0
  1014. data/spec/unit/application/face_base_spec.rb +16 -0
  1015. data/spec/unit/application/facts_spec.rb +0 -0
  1016. data/spec/unit/application/filebucket_spec.rb +88 -2
  1017. data/spec/unit/application/indirection_base_spec.rb +0 -0
  1018. data/spec/unit/application/inspect_spec.rb +28 -10
  1019. data/spec/unit/application/lookup_spec.rb +532 -0
  1020. data/spec/unit/application/master_spec.rb +33 -7
  1021. data/spec/unit/application/resource_spec.rb +0 -0
  1022. data/spec/unit/application_spec.rb +3 -3
  1023. data/spec/unit/capability_spec.rb +416 -0
  1024. data/spec/unit/configurer/downloader_factory_spec.rb +0 -0
  1025. data/spec/unit/configurer/downloader_spec.rb +5 -5
  1026. data/spec/unit/configurer/fact_handler_spec.rb +0 -0
  1027. data/spec/unit/configurer/plugin_handler_spec.rb +18 -15
  1028. data/spec/unit/configurer_spec.rb +336 -39
  1029. data/spec/unit/confine/exists_spec.rb +0 -0
  1030. data/spec/unit/confine/false_spec.rb +0 -0
  1031. data/spec/unit/confine/feature_spec.rb +0 -0
  1032. data/spec/unit/confine/true_spec.rb +0 -0
  1033. data/spec/unit/confine/variable_spec.rb +0 -0
  1034. data/spec/unit/confine_collection_spec.rb +0 -0
  1035. data/spec/unit/confine_spec.rb +0 -0
  1036. data/spec/unit/confiner_spec.rb +0 -0
  1037. data/spec/unit/context/trusted_information_spec.rb +24 -1
  1038. data/spec/unit/daemon_spec.rb +18 -8
  1039. data/spec/unit/data_providers/{sample_data_provider_spec.rb → custom_data_provider_spec.rb} +14 -16
  1040. data/spec/unit/data_providers/function_data_provider_spec.rb +30 -3
  1041. data/spec/unit/data_providers/hiera_data_provider_spec.rb +361 -0
  1042. data/spec/unit/defaults_spec.rb +47 -0
  1043. data/spec/unit/environments_spec.rb +26 -4
  1044. data/spec/unit/etc_spec.rb +234 -0
  1045. data/spec/unit/external/pson_spec.rb +0 -0
  1046. data/spec/unit/face/ca_spec.rb +10 -0
  1047. data/spec/unit/face/catalog_spec.rb +0 -0
  1048. data/spec/unit/face/certificate_request_spec.rb +10 -0
  1049. data/spec/unit/face/certificate_revocation_list_spec.rb +10 -0
  1050. data/spec/unit/face/certificate_spec.rb +10 -2
  1051. data/spec/unit/face/config_spec.rb +47 -0
  1052. data/spec/unit/face/epp_face_spec.rb +24 -5
  1053. data/spec/unit/face/facts_spec.rb +0 -0
  1054. data/spec/unit/face/file_spec.rb +4 -0
  1055. data/spec/unit/face/generate_spec.rb +230 -0
  1056. data/spec/unit/face/help_spec.rb +70 -0
  1057. data/spec/unit/face/key_spec.rb +10 -0
  1058. data/spec/unit/face/module/search_spec.rb +1 -1
  1059. data/spec/unit/face/node_spec.rb +1 -1
  1060. data/spec/unit/face/parser_spec.rb +49 -2
  1061. data/spec/unit/face/plugin_spec.rb +29 -4
  1062. data/spec/unit/face/status_spec.rb +10 -0
  1063. data/spec/unit/face_spec.rb +0 -0
  1064. data/spec/unit/file_bucket/dipper_spec.rb +210 -1
  1065. data/spec/unit/file_bucket/file_spec.rb +0 -0
  1066. data/spec/unit/file_serving/base_spec.rb +0 -0
  1067. data/spec/unit/file_serving/configuration/parser_spec.rb +25 -30
  1068. data/spec/unit/file_serving/configuration_spec.rb +1 -1
  1069. data/spec/unit/file_serving/content_spec.rb +0 -0
  1070. data/spec/unit/file_serving/fileset_spec.rb +0 -0
  1071. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  1072. data/spec/unit/file_serving/metadata_spec.rb +51 -1
  1073. data/spec/unit/file_serving/mount/file_spec.rb +0 -0
  1074. data/spec/unit/file_serving/mount/modules_spec.rb +0 -0
  1075. data/spec/unit/file_serving/mount/pluginfacts_spec.rb +0 -0
  1076. data/spec/unit/file_serving/mount/plugins_spec.rb +0 -0
  1077. data/spec/unit/file_serving/mount_spec.rb +0 -0
  1078. data/spec/unit/file_serving/terminus_helper_spec.rb +2 -3
  1079. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  1080. data/spec/unit/file_system/uniquefile_spec.rb +20 -0
  1081. data/spec/unit/file_system_spec.rb +373 -6
  1082. data/spec/unit/forge/repository_spec.rb +27 -0
  1083. data/spec/unit/functions/assert_type_spec.rb +48 -8
  1084. data/spec/unit/functions/binary_file_spec.rb +46 -0
  1085. data/spec/unit/functions/break_spec.rb +89 -0
  1086. data/spec/unit/{parser/functions → functions}/contain_spec.rb +68 -3
  1087. data/spec/unit/functions/defined_spec.rb +289 -0
  1088. data/spec/unit/functions/dig_spec.rb +58 -0
  1089. data/spec/unit/functions/epp_spec.rb +17 -9
  1090. data/spec/unit/functions/filter_spec.rb +18 -0
  1091. data/spec/unit/functions/find_file_spec.rb +69 -0
  1092. data/spec/unit/functions/hiera_spec.rb +451 -49
  1093. data/spec/unit/functions/include_spec.rb +175 -0
  1094. data/spec/unit/functions/inline_epp_spec.rb +4 -4
  1095. data/spec/unit/functions/lest_spec.rb +34 -0
  1096. data/spec/unit/functions/logging_spec.rb +54 -0
  1097. data/spec/unit/functions/lookup_fixture_spec.rb +693 -0
  1098. data/spec/unit/functions/lookup_spec.rb +2904 -265
  1099. data/spec/unit/functions/match_spec.rb +2 -2
  1100. data/spec/unit/functions/new_spec.rb +694 -0
  1101. data/spec/unit/functions/next_spec.rb +93 -0
  1102. data/spec/unit/functions/regsubst_spec.rb +30 -9
  1103. data/spec/unit/functions/require_spec.rb +83 -0
  1104. data/spec/unit/functions/return_spec.rb +105 -0
  1105. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  1106. data/spec/unit/functions/scanf_spec.rb +1 -1
  1107. data/spec/unit/{parser/functions → functions}/shared.rb +15 -12
  1108. data/spec/unit/functions/split_spec.rb +11 -3
  1109. data/spec/unit/functions/step_spec.rb +113 -0
  1110. data/spec/unit/functions/strftime_spec.rb +152 -0
  1111. data/spec/unit/functions/then_spec.rb +40 -0
  1112. data/spec/unit/functions/type_spec.rb +35 -0
  1113. data/spec/unit/functions/unwrap_spec.rb +29 -0
  1114. data/spec/unit/functions/versioncmp_spec.rb +36 -0
  1115. data/spec/unit/functions4_spec.rb +357 -71
  1116. data/spec/unit/graph/rb_tree_map_spec.rb +1 -1
  1117. data/spec/unit/graph/relationship_graph_spec.rb +0 -0
  1118. data/spec/unit/graph/sequential_prioritizer_spec.rb +1 -1
  1119. data/spec/unit/graph/simple_graph_spec.rb +1 -1
  1120. data/spec/unit/hiera/scope_spec.rb +6 -3
  1121. data/spec/unit/hiera_puppet_spec.rb +49 -8
  1122. data/spec/unit/indirector/catalog/compiler_spec.rb +752 -8
  1123. data/spec/unit/indirector/catalog/json_spec.rb +0 -0
  1124. data/spec/unit/indirector/catalog/msgpack_spec.rb +0 -0
  1125. data/spec/unit/indirector/catalog/rest_spec.rb +0 -0
  1126. data/spec/unit/indirector/catalog/static_compiler_spec.rb +38 -20
  1127. data/spec/unit/indirector/catalog/store_configs_spec.rb +0 -0
  1128. data/spec/unit/indirector/catalog/yaml_spec.rb +0 -0
  1129. data/spec/unit/indirector/certificate/ca_spec.rb +0 -0
  1130. data/spec/unit/indirector/certificate/disabled_ca_spec.rb +0 -0
  1131. data/spec/unit/indirector/certificate/file_spec.rb +0 -0
  1132. data/spec/unit/indirector/certificate/rest_spec.rb +0 -0
  1133. data/spec/unit/indirector/certificate_request/ca_spec.rb +0 -0
  1134. data/spec/unit/indirector/certificate_request/disabled_ca_spec.rb +0 -0
  1135. data/spec/unit/indirector/certificate_request/file_spec.rb +0 -0
  1136. data/spec/unit/indirector/certificate_request/rest_spec.rb +0 -0
  1137. data/spec/unit/indirector/certificate_revocation_list/ca_spec.rb +0 -0
  1138. data/spec/unit/indirector/certificate_revocation_list/disabled_ca_spec.rb +0 -0
  1139. data/spec/unit/indirector/certificate_revocation_list/file_spec.rb +0 -0
  1140. data/spec/unit/indirector/certificate_revocation_list/rest_spec.rb +0 -0
  1141. data/spec/unit/indirector/certificate_status/file_spec.rb +0 -0
  1142. data/spec/unit/indirector/certificate_status/rest_spec.rb +0 -0
  1143. data/spec/unit/indirector/code_spec.rb +0 -0
  1144. data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
  1145. data/spec/unit/indirector/direct_file_server_spec.rb +0 -0
  1146. data/spec/unit/indirector/envelope_spec.rb +0 -0
  1147. data/spec/unit/indirector/exec_spec.rb +0 -0
  1148. data/spec/unit/indirector/face_spec.rb +10 -2
  1149. data/spec/unit/indirector/facts/facter_spec.rb +7 -7
  1150. data/spec/unit/indirector/facts/network_device_spec.rb +0 -0
  1151. data/spec/unit/indirector/facts/store_configs_spec.rb +0 -0
  1152. data/spec/unit/indirector/facts/yaml_spec.rb +0 -0
  1153. data/spec/unit/indirector/file_bucket_file/file_spec.rb +86 -4
  1154. data/spec/unit/indirector/file_bucket_file/rest_spec.rb +0 -0
  1155. data/spec/unit/indirector/file_content/file_server_spec.rb +0 -0
  1156. data/spec/unit/indirector/file_content/file_spec.rb +0 -0
  1157. data/spec/unit/indirector/file_content/rest_spec.rb +0 -0
  1158. data/spec/unit/indirector/file_metadata/file_server_spec.rb +0 -0
  1159. data/spec/unit/indirector/file_metadata/file_spec.rb +0 -0
  1160. data/spec/unit/indirector/file_metadata/rest_spec.rb +0 -0
  1161. data/spec/unit/indirector/file_server_spec.rb +0 -0
  1162. data/spec/unit/indirector/indirection_spec.rb +13 -2
  1163. data/spec/unit/indirector/json_spec.rb +1 -1
  1164. data/spec/unit/indirector/key/ca_spec.rb +0 -0
  1165. data/spec/unit/indirector/key/disabled_ca_spec.rb +0 -0
  1166. data/spec/unit/indirector/key/file_spec.rb +1 -1
  1167. data/spec/unit/indirector/ldap_spec.rb +0 -0
  1168. data/spec/unit/indirector/memory_spec.rb +0 -0
  1169. data/spec/unit/indirector/msgpack_spec.rb +11 -1
  1170. data/spec/unit/indirector/node/exec_spec.rb +0 -0
  1171. data/spec/unit/indirector/node/ldap_spec.rb +0 -0
  1172. data/spec/unit/indirector/node/memory_spec.rb +0 -0
  1173. data/spec/unit/indirector/node/msgpack_spec.rb +0 -0
  1174. data/spec/unit/indirector/node/plain_spec.rb +0 -0
  1175. data/spec/unit/indirector/node/rest_spec.rb +0 -0
  1176. data/spec/unit/indirector/node/store_configs_spec.rb +0 -0
  1177. data/spec/unit/indirector/node/yaml_spec.rb +0 -0
  1178. data/spec/unit/indirector/plain_spec.rb +0 -0
  1179. data/spec/unit/indirector/report/msgpack_spec.rb +0 -0
  1180. data/spec/unit/indirector/report/processor_spec.rb +0 -0
  1181. data/spec/unit/indirector/report/rest_spec.rb +0 -0
  1182. data/spec/unit/indirector/report/yaml_spec.rb +0 -0
  1183. data/spec/unit/indirector/request_spec.rb +17 -8
  1184. data/spec/unit/indirector/resource/ral_spec.rb +0 -0
  1185. data/spec/unit/indirector/resource/store_configs_spec.rb +0 -0
  1186. data/spec/unit/indirector/resource_type/parser_spec.rb +5 -0
  1187. data/spec/unit/indirector/resource_type/rest_spec.rb +0 -0
  1188. data/spec/unit/indirector/rest_spec.rb +107 -9
  1189. data/spec/unit/indirector/ssl_file_spec.rb +4 -4
  1190. data/spec/unit/indirector/status/rest_spec.rb +0 -0
  1191. data/spec/unit/indirector/store_configs_spec.rb +0 -0
  1192. data/spec/unit/indirector/terminus_spec.rb +0 -0
  1193. data/spec/unit/indirector/yaml_spec.rb +1 -1
  1194. data/spec/unit/indirector_spec.rb +0 -0
  1195. data/spec/unit/info_service_spec.rb +298 -0
  1196. data/spec/unit/interface/action_builder_spec.rb +0 -0
  1197. data/spec/unit/interface/action_manager_spec.rb +0 -0
  1198. data/spec/unit/interface/action_spec.rb +0 -0
  1199. data/spec/unit/interface/documentation_spec.rb +0 -0
  1200. data/spec/unit/interface/face_collection_spec.rb +0 -0
  1201. data/spec/unit/interface/option_builder_spec.rb +0 -0
  1202. data/spec/unit/interface/option_spec.rb +0 -0
  1203. data/spec/unit/interface_spec.rb +27 -0
  1204. data/spec/unit/man_spec.rb +1 -1
  1205. data/spec/unit/module_spec.rb +118 -74
  1206. data/spec/unit/module_tool/application_spec.rb +1 -1
  1207. data/spec/unit/module_tool/applications/builder_spec.rb +44 -9
  1208. data/spec/unit/module_tool/applications/installer_spec.rb +11 -2
  1209. data/spec/unit/module_tool/applications/unpacker_spec.rb +2 -1
  1210. data/spec/unit/module_tool/applications/upgrader_spec.rb +9 -1
  1211. data/spec/unit/module_tool/installed_modules_spec.rb +6 -6
  1212. data/spec/unit/module_tool/metadata_spec.rb +31 -2
  1213. data/spec/unit/module_tool/tar/mini_spec.rb +3 -3
  1214. data/spec/unit/module_tool_spec.rb +3 -3
  1215. data/spec/unit/network/auth_config_parser_spec.rb +16 -0
  1216. data/spec/unit/network/authconfig_spec.rb +62 -32
  1217. data/spec/unit/network/authorization_spec.rb +30 -2
  1218. data/spec/unit/network/authstore_spec.rb +2 -2
  1219. data/spec/unit/network/format_handler_spec.rb +0 -0
  1220. data/spec/unit/network/format_spec.rb +0 -0
  1221. data/spec/unit/network/formats_spec.rb +0 -0
  1222. data/spec/unit/network/http/api/indirected_routes_spec.rb +70 -71
  1223. data/spec/unit/network/http/api/master/v3/environment_spec.rb +60 -0
  1224. data/spec/unit/network/http/api/master/v3_spec.rb +22 -4
  1225. data/spec/unit/network/http/compression_spec.rb +40 -9
  1226. data/spec/unit/network/http/connection_spec.rb +25 -19
  1227. data/spec/unit/network/http/error_spec.rb +2 -1
  1228. data/spec/unit/network/http/factory_spec.rb +18 -0
  1229. data/spec/unit/network/http/handler_spec.rb +11 -8
  1230. data/spec/unit/network/http/nocache_pool_spec.rb +0 -0
  1231. data/spec/unit/network/http/pool_spec.rb +30 -0
  1232. data/spec/unit/network/http/rack/rest_spec.rb +7 -0
  1233. data/spec/unit/network/http/rack_spec.rb +0 -0
  1234. data/spec/unit/network/http/session_spec.rb +0 -0
  1235. data/spec/unit/network/http/site_spec.rb +0 -0
  1236. data/spec/unit/network/http/webrick/rest_spec.rb +0 -0
  1237. data/spec/unit/network/http/webrick_spec.rb +1 -1
  1238. data/spec/unit/network/http_pool_spec.rb +0 -0
  1239. data/spec/unit/network/http_spec.rb +0 -0
  1240. data/spec/unit/network/resolver_spec.rb +0 -0
  1241. data/spec/unit/network/rights_spec.rb +4 -4
  1242. data/spec/unit/network/server_spec.rb +0 -0
  1243. data/spec/unit/node/environment_spec.rb +10 -0
  1244. data/spec/unit/node/facts_spec.rb +0 -0
  1245. data/spec/unit/node_spec.rb +41 -0
  1246. data/spec/unit/other/selinux_spec.rb +0 -0
  1247. data/spec/unit/parameter/path_spec.rb +0 -0
  1248. data/spec/unit/parameter/value_collection_spec.rb +0 -0
  1249. data/spec/unit/parameter/value_spec.rb +0 -0
  1250. data/spec/unit/parameter_spec.rb +11 -0
  1251. data/spec/unit/parser/ast/leaf_spec.rb +1 -1
  1252. data/spec/unit/parser/compiler_spec.rb +134 -33
  1253. data/spec/unit/parser/environment_compiler_spec.rb +688 -0
  1254. data/spec/unit/parser/files_spec.rb +0 -0
  1255. data/spec/unit/parser/functions/create_resources_spec.rb +86 -5
  1256. data/spec/unit/parser/functions/digest_spec.rb +0 -0
  1257. data/spec/unit/parser/functions/fail_spec.rb +0 -0
  1258. data/spec/unit/parser/functions/file_spec.rb +7 -1
  1259. data/spec/unit/parser/functions/fqdn_rand_spec.rb +6 -2
  1260. data/spec/unit/parser/functions/generate_spec.rb +3 -12
  1261. data/spec/unit/parser/functions/hiera_array_spec.rb +1 -1
  1262. data/spec/unit/parser/functions/hiera_hash_spec.rb +1 -1
  1263. data/spec/unit/parser/functions/hiera_include_spec.rb +1 -1
  1264. data/spec/unit/parser/functions/hiera_spec.rb +1 -1
  1265. data/spec/unit/parser/functions/inline_template_spec.rb +0 -0
  1266. data/spec/unit/parser/functions/lookup_spec.rb +1 -1
  1267. data/spec/unit/parser/functions/realize_spec.rb +0 -0
  1268. data/spec/unit/parser/functions/regsubst_spec.rb +1 -1
  1269. data/spec/unit/parser/functions/scanf_spec.rb +0 -0
  1270. data/spec/unit/parser/functions/shellquote_spec.rb +0 -0
  1271. data/spec/unit/parser/functions/split_spec.rb +1 -1
  1272. data/spec/unit/parser/functions/sprintf_spec.rb +0 -0
  1273. data/spec/unit/parser/functions/tag_spec.rb +0 -0
  1274. data/spec/unit/parser/functions/template_spec.rb +1 -1
  1275. data/spec/unit/parser/functions/versioncmp_spec.rb +0 -0
  1276. data/spec/unit/parser/functions_spec.rb +0 -0
  1277. data/spec/unit/parser/relationship_spec.rb +0 -0
  1278. data/spec/unit/parser/resource/param_spec.rb +0 -0
  1279. data/spec/unit/parser/resource_spec.rb +31 -32
  1280. data/spec/unit/parser/scope_spec.rb +85 -18
  1281. data/spec/unit/parser/templatewrapper_spec.rb +1 -1
  1282. data/spec/unit/parser/type_loader_spec.rb +0 -0
  1283. data/spec/unit/pops/binder/config/binder_config_spec.rb +1 -1
  1284. data/spec/unit/pops/binder/injector_spec.rb +3 -3
  1285. data/spec/unit/pops/evaluator/access_ops_spec.rb +133 -18
  1286. data/spec/unit/pops/evaluator/arithmetic_ops_spec.rb +170 -0
  1287. data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -2
  1288. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  1289. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +160 -41
  1290. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +29 -25
  1291. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  1292. data/spec/unit/pops/evaluator/literal_evaluator_spec.rb +43 -0
  1293. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +133 -0
  1294. data/spec/unit/pops/evaluator/variables_spec.rb +2 -2
  1295. data/spec/unit/pops/issues_spec.rb +16 -16
  1296. data/spec/unit/pops/label_provider_spec.rb +5 -1
  1297. data/spec/unit/pops/loaders/dependency_loader_spec.rb +66 -1
  1298. data/spec/unit/pops/loaders/environment_loader_spec.rb +172 -0
  1299. data/spec/unit/pops/loaders/loader_paths_spec.rb +1 -1
  1300. data/spec/unit/pops/loaders/loaders_spec.rb +410 -56
  1301. data/spec/unit/pops/loaders/module_loaders_spec.rb +63 -2
  1302. data/spec/unit/pops/loaders/static_loader_spec.rb +83 -18
  1303. data/spec/unit/pops/lookup/context_spec.rb +334 -0
  1304. data/spec/unit/pops/lookup/interpolation_spec.rb +333 -0
  1305. data/spec/unit/pops/lookup/lookup_spec.rb +262 -0
  1306. data/spec/unit/pops/merge_strategy_spec.rb +18 -0
  1307. data/spec/unit/pops/migration_spec.rb +53 -0
  1308. data/spec/unit/pops/parser/lexer2_spec.rb +377 -10
  1309. data/spec/unit/pops/parser/parse_application_spec.rb +35 -0
  1310. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +31 -0
  1311. data/spec/unit/pops/parser/parse_calls_spec.rb +25 -0
  1312. data/spec/unit/pops/parser/parse_capabilities_spec.rb +40 -0
  1313. data/spec/unit/pops/parser/parse_functions_spec.rb +19 -0
  1314. data/spec/unit/pops/parser/parse_heredoc_spec.rb +26 -0
  1315. data/spec/unit/pops/parser/parse_lambda_spec.rb +19 -0
  1316. data/spec/unit/pops/parser/parse_site_spec.rb +51 -0
  1317. data/spec/unit/pops/parser/parser_rspec_helper.rb +6 -0
  1318. data/spec/unit/pops/parser/parser_spec.rb +28 -0
  1319. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  1320. data/spec/unit/pops/puppet_stack_spec.rb +79 -0
  1321. data/spec/unit/pops/resource/resource_type_impl_spec.rb +111 -0
  1322. data/spec/unit/pops/serialization/packer_spec.rb +154 -0
  1323. data/spec/unit/pops/serialization/rgen_spec.rb +88 -0
  1324. data/spec/unit/pops/serialization/serialization_spec.rb +314 -0
  1325. data/spec/unit/pops/time/timespan_spec.rb +121 -0
  1326. data/spec/unit/pops/types/enumeration_spec.rb +13 -12
  1327. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  1328. data/spec/unit/pops/types/p_binary_type_spec.rb +243 -0
  1329. data/spec/unit/pops/types/p_object_type_spec.rb +1167 -0
  1330. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +327 -0
  1331. data/spec/unit/pops/types/p_sensitive_type_spec.rb +169 -0
  1332. data/spec/unit/pops/types/p_timespan_type_spec.rb +273 -0
  1333. data/spec/unit/pops/types/p_timestamp_type_spec.rb +311 -0
  1334. data/spec/unit/pops/types/p_type_set_type_spec.rb +453 -0
  1335. data/spec/unit/pops/types/recursion_guard_spec.rb +93 -0
  1336. data/spec/unit/pops/types/ruby_generator_spec.rb +625 -0
  1337. data/spec/unit/pops/types/string_converter_spec.rb +1029 -0
  1338. data/spec/unit/pops/types/type_acceptor_spec.rb +106 -0
  1339. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  1340. data/spec/unit/pops/types/type_calculator_spec.rb +1095 -871
  1341. data/spec/unit/pops/types/type_factory_spec.rb +132 -91
  1342. data/spec/unit/pops/types/type_formatter_spec.rb +396 -0
  1343. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +228 -0
  1344. data/spec/unit/pops/types/type_parser_spec.rb +203 -36
  1345. data/spec/unit/pops/types/types_spec.rb +599 -0
  1346. data/spec/unit/pops/validation_spec.rb +66 -0
  1347. data/spec/unit/pops/validator/validator_spec.rb +400 -18
  1348. data/spec/unit/property/ensure_spec.rb +0 -0
  1349. data/spec/unit/property/keyvalue_spec.rb +0 -0
  1350. data/spec/unit/property/list_spec.rb +0 -0
  1351. data/spec/unit/property/ordered_list_spec.rb +0 -0
  1352. data/spec/unit/property_spec.rb +49 -12
  1353. data/spec/unit/provider/augeas/augeas_spec.rb +59 -0
  1354. data/spec/unit/provider/cisco_spec.rb +0 -0
  1355. data/spec/unit/provider/command_spec.rb +0 -0
  1356. data/spec/unit/provider/cron/crontab_spec.rb +0 -0
  1357. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  1358. data/spec/unit/provider/exec/posix_spec.rb +0 -0
  1359. data/spec/unit/provider/exec/shell_spec.rb +0 -0
  1360. data/spec/unit/provider/exec/windows_spec.rb +0 -0
  1361. data/spec/unit/provider/exec_spec.rb +0 -0
  1362. data/spec/unit/provider/file/posix_spec.rb +0 -0
  1363. data/spec/unit/provider/file/windows_spec.rb +0 -0
  1364. data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
  1365. data/spec/unit/provider/group/groupadd_spec.rb +0 -0
  1366. data/spec/unit/provider/group/ldap_spec.rb +0 -0
  1367. data/spec/unit/provider/group/pw_spec.rb +0 -0
  1368. data/spec/unit/provider/group/windows_adsi_spec.rb +88 -18
  1369. data/spec/unit/provider/host/parsed_spec.rb +0 -0
  1370. data/spec/unit/provider/interface/cisco_spec.rb +0 -0
  1371. data/spec/unit/provider/ldap_spec.rb +0 -0
  1372. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  1373. data/spec/unit/provider/mcx/mcxcontent_spec.rb +0 -0
  1374. data/spec/unit/provider/mount/parsed_spec.rb +31 -5
  1375. data/spec/unit/provider/mount_spec.rb +0 -0
  1376. data/spec/unit/provider/naginator_spec.rb +0 -0
  1377. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  1378. data/spec/unit/provider/nameservice_spec.rb +54 -12
  1379. data/spec/unit/provider/network_device_spec.rb +0 -0
  1380. data/spec/unit/provider/package/aix_spec.rb +0 -0
  1381. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  1382. data/spec/unit/provider/package/apt_spec.rb +5 -0
  1383. data/spec/unit/provider/package/aptitude_spec.rb +0 -0
  1384. data/spec/unit/provider/package/aptrpm_spec.rb +3 -3
  1385. data/spec/unit/provider/package/base_spec.rb +18 -0
  1386. data/spec/unit/provider/package/dnf_spec.rb +30 -0
  1387. data/spec/unit/provider/package/dpkg_spec.rb +0 -0
  1388. data/spec/unit/provider/package/freebsd_spec.rb +0 -0
  1389. data/spec/unit/provider/package/gem_spec.rb +77 -0
  1390. data/spec/unit/provider/package/hpux_spec.rb +0 -0
  1391. data/spec/unit/provider/package/macports_spec.rb +0 -0
  1392. data/spec/unit/provider/package/nim_spec.rb +6 -6
  1393. data/spec/unit/provider/package/openbsd_spec.rb +0 -0
  1394. data/spec/unit/provider/package/opkg_spec.rb +0 -0
  1395. data/spec/unit/provider/package/pacman_spec.rb +55 -0
  1396. data/spec/unit/provider/package/pip3_spec.rb +22 -0
  1397. data/spec/unit/provider/package/pip_spec.rb +173 -46
  1398. data/spec/unit/provider/package/pkg_spec.rb +139 -99
  1399. data/spec/unit/provider/package/pkgdmg_spec.rb +32 -8
  1400. data/spec/unit/provider/package/pkgin_spec.rb +23 -13
  1401. data/spec/unit/provider/package/pkgng_spec.rb +186 -0
  1402. data/spec/unit/provider/package/pkgutil_spec.rb +0 -0
  1403. data/spec/unit/provider/package/portage_spec.rb +64 -8
  1404. data/spec/unit/provider/package/puppet_gem_spec.rb +0 -0
  1405. data/spec/unit/provider/package/rpm_spec.rb +170 -12
  1406. data/spec/unit/provider/package/sun_spec.rb +0 -0
  1407. data/spec/unit/provider/package/tdnf_spec.rb +18 -0
  1408. data/spec/unit/provider/package/windows/exe_package_spec.rb +0 -1
  1409. data/spec/unit/provider/package/windows/msi_package_spec.rb +0 -1
  1410. data/spec/unit/provider/package/windows/package_spec.rb +45 -1
  1411. data/spec/unit/provider/package/windows_spec.rb +8 -2
  1412. data/spec/unit/provider/package/yum_spec.rb +29 -466
  1413. data/spec/unit/provider/package/zypper_spec.rb +64 -19
  1414. data/spec/unit/provider/parsedfile_spec.rb +0 -0
  1415. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +523 -70
  1416. data/spec/unit/provider/selboolean_spec.rb +0 -0
  1417. data/spec/unit/provider/selmodule_spec.rb +0 -0
  1418. data/spec/unit/provider/service/base_spec.rb +44 -27
  1419. data/spec/unit/provider/service/bsd_spec.rb +130 -0
  1420. data/spec/unit/provider/service/daemontools_spec.rb +0 -0
  1421. data/spec/unit/provider/service/debian_spec.rb +38 -0
  1422. data/spec/unit/provider/service/freebsd_spec.rb +17 -0
  1423. data/spec/unit/provider/service/gentoo_spec.rb +8 -0
  1424. data/spec/unit/provider/service/init_spec.rb +42 -1
  1425. data/spec/unit/provider/service/launchd_spec.rb +124 -25
  1426. data/spec/unit/provider/service/openbsd_spec.rb +1 -0
  1427. data/spec/unit/provider/service/openrc_spec.rb +7 -0
  1428. data/spec/unit/provider/service/openwrt_spec.rb +0 -0
  1429. data/spec/unit/provider/service/rcng_spec.rb +41 -0
  1430. data/spec/unit/provider/service/redhat_spec.rb +9 -1
  1431. data/spec/unit/provider/service/runit_spec.rb +0 -0
  1432. data/spec/unit/provider/service/smf_spec.rb +77 -13
  1433. data/spec/unit/provider/service/src_spec.rb +31 -4
  1434. data/spec/unit/provider/service/systemd_spec.rb +228 -39
  1435. data/spec/unit/provider/service/upstart_spec.rb +64 -0
  1436. data/spec/unit/provider/service/windows_spec.rb +0 -0
  1437. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +2 -1
  1438. data/spec/unit/provider/sshkey/parsed_spec.rb +42 -18
  1439. data/spec/unit/provider/user/aix_spec.rb +7 -0
  1440. data/spec/unit/provider/user/directoryservice_spec.rb +164 -83
  1441. data/spec/unit/provider/user/hpux_spec.rb +0 -0
  1442. data/spec/unit/provider/user/ldap_spec.rb +0 -0
  1443. data/spec/unit/provider/user/openbsd_spec.rb +0 -0
  1444. data/spec/unit/provider/user/pw_spec.rb +0 -0
  1445. data/spec/unit/provider/user/user_role_add_spec.rb +0 -0
  1446. data/spec/unit/provider/user/useradd_spec.rb +1 -0
  1447. data/spec/unit/provider/user/windows_adsi_spec.rb +160 -7
  1448. data/spec/unit/provider/vlan/cisco_spec.rb +0 -0
  1449. data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
  1450. data/spec/unit/provider/zfs/zfs_spec.rb +0 -0
  1451. data/spec/unit/provider/zone/solaris_spec.rb +64 -12
  1452. data/spec/unit/provider/zpool/zpool_spec.rb +0 -0
  1453. data/spec/unit/provider_spec.rb +0 -0
  1454. data/spec/unit/puppet_spec.rb +15 -1
  1455. data/spec/unit/relationship_spec.rb +0 -0
  1456. data/spec/unit/reports/http_spec.rb +0 -0
  1457. data/spec/unit/reports/store_spec.rb +0 -0
  1458. data/spec/unit/reports_spec.rb +10 -0
  1459. data/spec/unit/resource/capability_finder_spec.rb +147 -0
  1460. data/spec/unit/resource/catalog_spec.rb +235 -10
  1461. data/spec/unit/resource/status_spec.rb +0 -0
  1462. data/spec/unit/resource/type_collection_spec.rb +23 -2
  1463. data/spec/unit/resource/type_spec.rb +169 -12
  1464. data/spec/unit/resource_spec.rb +137 -48
  1465. data/spec/unit/semver_spec.rb +241 -0
  1466. data/spec/unit/settings/directory_setting_spec.rb +0 -0
  1467. data/spec/unit/settings/duration_setting_spec.rb +0 -0
  1468. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  1469. data/spec/unit/settings/file_setting_spec.rb +37 -0
  1470. data/spec/unit/settings/ini_file_spec.rb +58 -1
  1471. data/spec/unit/settings/path_setting_spec.rb +0 -0
  1472. data/spec/unit/settings/priority_setting_spec.rb +0 -0
  1473. data/spec/unit/settings_spec.rb +116 -3
  1474. data/spec/unit/ssl/base_spec.rb +9 -0
  1475. data/spec/unit/ssl/certificate_authority/interface_spec.rb +180 -13
  1476. data/spec/unit/ssl/certificate_authority_spec.rb +82 -28
  1477. data/spec/unit/ssl/certificate_factory_spec.rb +2 -2
  1478. data/spec/unit/ssl/certificate_request_attributes_spec.rb +6 -0
  1479. data/spec/unit/ssl/certificate_request_spec.rb +4 -5
  1480. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  1481. data/spec/unit/ssl/certificate_spec.rb +1 -1
  1482. data/spec/unit/ssl/configuration_spec.rb +11 -2
  1483. data/spec/unit/ssl/host_spec.rb +3 -3
  1484. data/spec/unit/ssl/inventory_spec.rb +27 -3
  1485. data/spec/unit/ssl/key_spec.rb +7 -7
  1486. data/spec/unit/ssl/oids_spec.rb +24 -13
  1487. data/spec/unit/status_spec.rb +0 -0
  1488. data/spec/unit/transaction/additional_resource_generator_spec.rb +160 -31
  1489. data/spec/unit/transaction/event_manager_spec.rb +0 -0
  1490. data/spec/unit/transaction/event_spec.rb +3 -1
  1491. data/spec/unit/transaction/persistence_spec.rb +178 -0
  1492. data/spec/unit/transaction/report_spec.rb +138 -2
  1493. data/spec/unit/transaction/resource_harness_spec.rb +81 -37
  1494. data/spec/unit/transaction_spec.rb +50 -0
  1495. data/spec/unit/type/augeas_spec.rb +0 -0
  1496. data/spec/unit/type/component_spec.rb +0 -0
  1497. data/spec/unit/type/computer_spec.rb +0 -0
  1498. data/spec/unit/type/cron_spec.rb +0 -0
  1499. data/spec/unit/type/exec_spec.rb +57 -12
  1500. data/spec/unit/type/file/checksum_spec.rb +6 -0
  1501. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  1502. data/spec/unit/type/file/content_spec.rb +59 -208
  1503. data/spec/unit/type/file/ctime_spec.rb +0 -0
  1504. data/spec/unit/type/file/ensure_spec.rb +0 -0
  1505. data/spec/unit/type/file/group_spec.rb +0 -0
  1506. data/spec/unit/type/file/mode_spec.rb +0 -0
  1507. data/spec/unit/type/file/mtime_spec.rb +0 -0
  1508. data/spec/unit/type/file/owner_spec.rb +0 -0
  1509. data/spec/unit/type/file/selinux_spec.rb +0 -0
  1510. data/spec/unit/type/file/source_spec.rb +211 -119
  1511. data/spec/unit/type/file/type_spec.rb +0 -0
  1512. data/spec/unit/type/file_spec.rb +165 -35
  1513. data/spec/unit/type/filebucket_spec.rb +0 -0
  1514. data/spec/unit/type/group_spec.rb +0 -0
  1515. data/spec/unit/type/host_spec.rb +4 -4
  1516. data/spec/unit/type/interface_spec.rb +32 -0
  1517. data/spec/unit/type/k5login_spec.rb +0 -0
  1518. data/spec/unit/type/macauthorization_spec.rb +4 -1
  1519. data/spec/unit/type/mailalias_spec.rb +0 -0
  1520. data/spec/unit/type/maillist_spec.rb +0 -0
  1521. data/spec/unit/type/mcx_spec.rb +0 -0
  1522. data/spec/unit/type/mount_spec.rb +50 -8
  1523. data/spec/unit/type/nagios_spec.rb +0 -0
  1524. data/spec/unit/type/noop_metaparam_spec.rb +0 -0
  1525. data/spec/unit/type/package/package_settings_spec.rb +0 -0
  1526. data/spec/unit/type/package_spec.rb +1 -0
  1527. data/spec/unit/type/resources_spec.rb +0 -0
  1528. data/spec/unit/type/schedule_spec.rb +0 -0
  1529. data/spec/unit/type/selboolean_spec.rb +0 -0
  1530. data/spec/unit/type/selmodule_spec.rb +0 -0
  1531. data/spec/unit/type/service_spec.rb +21 -0
  1532. data/spec/unit/type/ssh_authorized_key_spec.rb +0 -0
  1533. data/spec/unit/type/sshkey_spec.rb +0 -0
  1534. data/spec/unit/type/stage_spec.rb +0 -0
  1535. data/spec/unit/type/tidy_spec.rb +4 -4
  1536. data/spec/unit/type/user_spec.rb +40 -7
  1537. data/spec/unit/type/vlan_spec.rb +1 -1
  1538. data/spec/unit/type/whit_spec.rb +0 -0
  1539. data/spec/unit/type/yumrepo_spec.rb +3 -7
  1540. data/spec/unit/type/zfs_spec.rb +0 -0
  1541. data/spec/unit/type/zone_spec.rb +0 -0
  1542. data/spec/unit/type/zpool_spec.rb +0 -0
  1543. data/spec/unit/type_spec.rb +119 -1
  1544. data/spec/unit/util/autoload_spec.rb +0 -0
  1545. data/spec/unit/util/backups_spec.rb +0 -0
  1546. data/spec/unit/util/character_encoding_spec.rb +88 -0
  1547. data/spec/unit/util/checksums_spec.rb +0 -0
  1548. data/spec/unit/util/colors_spec.rb +0 -0
  1549. data/spec/unit/util/command_line_spec.rb +11 -0
  1550. data/spec/unit/util/constant_inflector_spec.rb +0 -0
  1551. data/spec/unit/util/diff_spec.rb +0 -0
  1552. data/spec/unit/util/errors_spec.rb +0 -0
  1553. data/spec/unit/util/execution_spec.rb +13 -1
  1554. data/spec/unit/util/execution_stub_spec.rb +0 -0
  1555. data/spec/unit/util/feature_spec.rb +1 -1
  1556. data/spec/unit/util/filetype_spec.rb +4 -4
  1557. data/spec/unit/util/http_proxy_spec.rb +91 -0
  1558. data/spec/unit/util/ldap/connection_spec.rb +0 -0
  1559. data/spec/unit/util/ldap/generator_spec.rb +1 -1
  1560. data/spec/unit/util/ldap/manager_spec.rb +0 -0
  1561. data/spec/unit/util/log/destinations_spec.rb +0 -2
  1562. data/spec/unit/util/log_spec.rb +125 -1
  1563. data/spec/unit/util/logging_spec.rb +69 -0
  1564. data/spec/unit/util/metric_spec.rb +0 -0
  1565. data/spec/unit/util/monkey_patches_spec.rb +95 -3
  1566. data/spec/unit/util/multi_match_spec.rb +39 -0
  1567. data/spec/unit/util/nagios_maker_spec.rb +0 -0
  1568. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  1569. data/spec/unit/util/network_device/cisco/facts_spec.rb +0 -0
  1570. data/spec/unit/util/network_device/cisco/interface_spec.rb +0 -0
  1571. data/spec/unit/util/network_device/config_spec.rb +0 -0
  1572. data/spec/unit/util/network_device/ipcalc_spec.rb +0 -0
  1573. data/spec/unit/util/network_device/transport/base_spec.rb +0 -0
  1574. data/spec/unit/util/network_device/transport/ssh_spec.rb +1 -1
  1575. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  1576. data/spec/unit/util/network_device_spec.rb +1 -1
  1577. data/spec/unit/util/package_spec.rb +0 -0
  1578. data/spec/unit/util/plist_spec.rb +135 -0
  1579. data/spec/unit/util/posix_spec.rb +0 -0
  1580. data/spec/unit/util/rdoc_spec.rb +0 -0
  1581. data/spec/unit/util/resource_template_spec.rb +2 -2
  1582. data/spec/unit/util/retry_action_spec.rb +0 -0
  1583. data/spec/unit/util/run_mode_spec.rb +27 -3
  1584. data/spec/unit/util/selinux_spec.rb +0 -0
  1585. data/spec/unit/util/splayer_spec.rb +45 -0
  1586. data/spec/unit/util/storage_spec.rb +8 -1
  1587. data/spec/unit/util/suidmanager_spec.rb +0 -0
  1588. data/spec/unit/util/symbolic_file_mode_spec.rb +0 -0
  1589. data/spec/unit/util/tagging_spec.rb +4 -0
  1590. data/spec/unit/util/user_attr_spec.rb +0 -0
  1591. data/spec/unit/util/warnings_spec.rb +0 -0
  1592. data/spec/unit/util/windows/adsi_spec.rb +196 -60
  1593. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  1594. data/spec/unit/util/windows/file_spec.rb +89 -0
  1595. data/spec/unit/util/windows/root_certs_spec.rb +0 -0
  1596. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  1597. data/spec/unit/util/windows/sid_spec.rb +76 -24
  1598. data/spec/unit/util/yaml_spec.rb +13 -1
  1599. data/spec/unit/util_spec.rb +219 -15
  1600. data/spec/unit/version_spec.rb +19 -0
  1601. data/spec/watchr.rb +0 -0
  1602. data/tasks/cfpropertylist.rake +15 -0
  1603. metadata +770 -115
  1604. data/ext/puppet-nm-dispatcher +0 -13
  1605. data/ext/puppetlisten/puppetlisten.rb +0 -77
  1606. data/ext/puppetlisten/puppetrun.rb +0 -38
  1607. data/ext/systemd/puppetmaster.service +0 -11
  1608. data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
  1609. data/lib/puppet/pops/types/types_meta.rb +0 -223
  1610. data/lib/puppet/resource/type_collection_helper.rb +0 -7
  1611. data/lib/puppet/vendor/load_plist.rb +0 -1
  1612. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  1613. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  1614. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  1615. data/lib/puppet/vendor/plist/README +0 -36
  1616. data/lib/puppet/vendor/plist/Rakefile +0 -144
  1617. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  1618. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  1619. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  1620. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  1621. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  1622. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  1623. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  1624. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  1625. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  1626. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  1627. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  1628. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  1629. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  1630. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  1631. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  1632. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  1633. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  1634. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
  1635. data/lib/puppet/vendor/semantic/Gemfile +0 -20
  1636. data/lib/puppet/vendor/semantic/PUPPET_README.md +0 -6
  1637. data/lib/puppet/vendor/semantic/Rakefile +0 -69
  1638. data/lib/puppet/vendor/semantic/spec/spec_helper.rb +0 -24
  1639. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_node_spec.rb +0 -141
  1640. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_spec.rb +0 -162
  1641. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/module_release_spec.rb +0 -143
  1642. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/source_spec.rb +0 -5
  1643. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/unsatisfiable_graph_spec.rb +0 -44
  1644. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency_spec.rb +0 -383
  1645. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_range_spec.rb +0 -307
  1646. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_spec.rb +0 -608
  1647. data/spec/fixtures/unit/data_providers/environments/sample/manifests/site.pp +0 -6
  1648. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -3
  1649. data/spec/integration/data_binding.rb +0 -104
  1650. data/spec/integration/parser/functions/require_spec.rb +0 -43
  1651. data/spec/integration/provider/package_spec.rb +0 -33
  1652. data/spec/unit/parser/functions/defined_spec.rb +0 -120
  1653. data/spec/unit/parser/functions/include_spec.rb +0 -55
  1654. data/spec/unit/parser/functions/require_spec.rb +0 -68
  1655. data/spec/unit/resource/type_collection_helper_spec.rb +0 -24
  1656. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/environment.conf +0 -0
  1657. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/lib/puppet/functions/environment/data.rb +0 -0
  1658. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/bindings/abc/default.rb +0 -0
  1659. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +0 -0
  1660. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/manifests/init.pp +0 -0
  1661. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/bindings/bad_data/default.rb +0 -0
  1662. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/bindings/bca/default.rb +0 -0
  1663. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/functions/bca/data.rb +0 -0
  1664. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/manifests/init.pp +0 -0
  1665. /data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/no_provider/manifests/init.pp +0 -0
  1666. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
  1667. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
@@ -1,367 +1,385 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet/pops'
3
3
 
4
+ module Puppet::Pops
5
+ module Types
4
6
  describe 'The type calculator' do
5
- let(:calculator) { Puppet::Pops::Types::TypeCalculator.new() }
7
+ let(:calculator) { TypeCalculator.new }
6
8
 
7
9
  def range_t(from, to)
8
- t = Puppet::Pops::Types::PIntegerType.new
9
- t.from = from
10
- t.to = to
11
- t
12
- end
13
- def constrained_t(t, from, to)
14
- Puppet::Pops::Types::TypeFactory.constrain_size(t, from, to)
10
+ PIntegerType.new(from, to)
15
11
  end
16
12
 
17
13
  def pattern_t(*patterns)
18
- Puppet::Pops::Types::TypeFactory.pattern(*patterns)
14
+ TypeFactory.pattern(*patterns)
19
15
  end
20
16
 
21
17
  def regexp_t(pattern)
22
- Puppet::Pops::Types::TypeFactory.regexp(pattern)
18
+ TypeFactory.regexp(pattern)
23
19
  end
24
20
 
25
- def string_t(*strings)
26
- Puppet::Pops::Types::TypeFactory.string(*strings)
21
+ def string_t(string = nil)
22
+ TypeFactory.string(string)
27
23
  end
28
24
 
29
- def callable_t(*params)
30
- Puppet::Pops::Types::TypeFactory.callable(*params)
31
- end
32
- def all_callables_t(*params)
33
- Puppet::Pops::Types::TypeFactory.all_callables()
25
+ def constrained_string_t(size_type)
26
+ TypeFactory.string(size_type)
34
27
  end
35
28
 
36
- def with_block_t(callable_t, *params)
37
- Puppet::Pops::Types::TypeFactory.with_block(callable_t, *params)
29
+ def callable_t(*params)
30
+ TypeFactory.callable(*params)
38
31
  end
39
32
 
40
- def with_optional_block_t(callable_t, *params)
41
- Puppet::Pops::Types::TypeFactory.with_optional_block(callable_t, *params)
33
+ def all_callables_t
34
+ TypeFactory.all_callables
42
35
  end
43
36
 
44
37
  def enum_t(*strings)
45
- Puppet::Pops::Types::TypeFactory.enum(*strings)
38
+ TypeFactory.enum(*strings)
46
39
  end
47
40
 
48
41
  def variant_t(*types)
49
- Puppet::Pops::Types::TypeFactory.variant(*types)
42
+ TypeFactory.variant(*types)
43
+ end
44
+
45
+ def type_alias_t(name, type_string)
46
+ type_expr = Parser::EvaluatingParser.new.parse_string(type_string).current
47
+ TypeFactory.type_alias(name, type_expr)
48
+ end
49
+
50
+ def type_reference_t(type_string)
51
+ TypeFactory.type_reference(type_string)
52
+ end
53
+
54
+ def integer_t
55
+ TypeFactory.integer
50
56
  end
51
57
 
52
- def integer_t()
53
- Puppet::Pops::Types::TypeFactory.integer()
58
+ def array_t(t, s = nil)
59
+ TypeFactory.array_of(t, s)
54
60
  end
55
61
 
56
- def array_t(t)
57
- Puppet::Pops::Types::TypeFactory.array_of(t)
62
+ def empty_array_t
63
+ empty_array = array_t(unit_t, range_t(0,0))
58
64
  end
59
65
 
60
- def hash_t(k,v)
61
- Puppet::Pops::Types::TypeFactory.hash_of(v, k)
66
+ def hash_t(k,v,s = nil)
67
+ TypeFactory.hash_of(v, k, s)
62
68
  end
63
69
 
64
- def data_t()
65
- Puppet::Pops::Types::TypeFactory.data()
70
+ def data_t
71
+ TypeFactory.data
66
72
  end
67
73
 
68
- def factory()
69
- Puppet::Pops::Types::TypeFactory
74
+ def factory
75
+ TypeFactory
70
76
  end
71
77
 
72
- def collection_t()
73
- Puppet::Pops::Types::TypeFactory.collection()
78
+ def collection_t(size_type = nil)
79
+ TypeFactory.collection(size_type)
74
80
  end
75
81
 
76
82
  def tuple_t(*types)
77
- Puppet::Pops::Types::TypeFactory.tuple(*types)
83
+ TypeFactory.tuple(types)
84
+ end
85
+
86
+ def constrained_tuple_t(size_type, *types)
87
+ TypeFactory.tuple(types, size_type)
78
88
  end
79
89
 
80
90
  def struct_t(type_hash)
81
- Puppet::Pops::Types::TypeFactory.struct(type_hash)
91
+ TypeFactory.struct(type_hash)
82
92
  end
83
93
 
84
94
  def object_t
85
- Puppet::Pops::Types::TypeFactory.any()
95
+ TypeFactory.any
86
96
  end
87
97
 
88
98
  def optional_t(t)
89
- Puppet::Pops::Types::TypeFactory.optional(t)
99
+ TypeFactory.optional(t)
100
+ end
101
+
102
+ def type_t(t)
103
+ TypeFactory.type_type(t)
104
+ end
105
+
106
+ def not_undef_t(t = nil)
107
+ TypeFactory.not_undef(t)
90
108
  end
91
109
 
92
110
  def undef_t
93
- Puppet::Pops::Types::TypeFactory.undef
111
+ TypeFactory.undef
94
112
  end
95
113
 
96
114
  def unit_t
97
115
  # Cannot be created via factory, the type is private to the type system
98
- Puppet::Pops::Types::PUnitType.new
116
+ PUnitType::DEFAULT
99
117
  end
100
118
 
101
119
  def types
102
- Puppet::Pops::Types
103
- end
104
-
105
- shared_context "types_setup" do
106
-
107
- # Do not include the special type Unit in this list
108
- def all_types
109
- [ Puppet::Pops::Types::PAnyType,
110
- Puppet::Pops::Types::PUndefType,
111
- Puppet::Pops::Types::PDataType,
112
- Puppet::Pops::Types::PScalarType,
113
- Puppet::Pops::Types::PStringType,
114
- Puppet::Pops::Types::PNumericType,
115
- Puppet::Pops::Types::PIntegerType,
116
- Puppet::Pops::Types::PFloatType,
117
- Puppet::Pops::Types::PRegexpType,
118
- Puppet::Pops::Types::PBooleanType,
119
- Puppet::Pops::Types::PCollectionType,
120
- Puppet::Pops::Types::PArrayType,
121
- Puppet::Pops::Types::PHashType,
122
- Puppet::Pops::Types::PRuntimeType,
123
- Puppet::Pops::Types::PHostClassType,
124
- Puppet::Pops::Types::PResourceType,
125
- Puppet::Pops::Types::PPatternType,
126
- Puppet::Pops::Types::PEnumType,
127
- Puppet::Pops::Types::PVariantType,
128
- Puppet::Pops::Types::PStructType,
129
- Puppet::Pops::Types::PTupleType,
130
- Puppet::Pops::Types::PCallableType,
131
- Puppet::Pops::Types::PType,
132
- Puppet::Pops::Types::POptionalType,
133
- Puppet::Pops::Types::PDefaultType,
134
- ]
135
- end
136
-
137
- def scalar_types
138
- # PVariantType is also scalar, if its types are all Scalar
139
- [
140
- Puppet::Pops::Types::PScalarType,
141
- Puppet::Pops::Types::PStringType,
142
- Puppet::Pops::Types::PNumericType,
143
- Puppet::Pops::Types::PIntegerType,
144
- Puppet::Pops::Types::PFloatType,
145
- Puppet::Pops::Types::PRegexpType,
146
- Puppet::Pops::Types::PBooleanType,
147
- Puppet::Pops::Types::PPatternType,
148
- Puppet::Pops::Types::PEnumType,
149
- ]
150
- end
151
-
152
- def numeric_types
153
- # PVariantType is also numeric, if its types are all numeric
154
- [
155
- Puppet::Pops::Types::PNumericType,
156
- Puppet::Pops::Types::PIntegerType,
157
- Puppet::Pops::Types::PFloatType,
158
- ]
159
- end
160
-
161
- def string_types
162
- # PVariantType is also string type, if its types are all compatible
163
- [
164
- Puppet::Pops::Types::PStringType,
165
- Puppet::Pops::Types::PPatternType,
166
- Puppet::Pops::Types::PEnumType,
167
- ]
168
- end
169
-
170
- def collection_types
171
- # PVariantType is also string type, if its types are all compatible
172
- [
173
- Puppet::Pops::Types::PCollectionType,
174
- Puppet::Pops::Types::PHashType,
175
- Puppet::Pops::Types::PArrayType,
176
- Puppet::Pops::Types::PStructType,
177
- Puppet::Pops::Types::PTupleType,
178
- ]
179
- end
180
-
181
- def data_compatible_types
182
- result = scalar_types
183
- result << Puppet::Pops::Types::PDataType
184
- result << array_t(types::PDataType.new)
185
- result << types::TypeFactory.hash_of_data
186
- result << Puppet::Pops::Types::PUndefType
187
- tmp = tuple_t(types::PDataType.new)
188
- result << (tmp)
189
- tmp.size_type = range_t(0, nil)
190
- result
191
- end
192
-
193
- def type_from_class(c)
194
- c.is_a?(Class) ? c.new : c
195
- end
120
+ Types
196
121
  end
197
122
 
198
123
  context 'when inferring ruby' do
199
124
 
200
125
  it 'fixnum translates to PIntegerType' do
201
- expect(calculator.infer(1).class).to eq(Puppet::Pops::Types::PIntegerType)
126
+ expect(calculator.infer(1).class).to eq(PIntegerType)
202
127
  end
203
128
 
204
129
  it 'large fixnum (or bignum depending on architecture) translates to PIntegerType' do
205
- expect(calculator.infer(2**33).class).to eq(Puppet::Pops::Types::PIntegerType)
130
+ expect(calculator.infer(2**33).class).to eq(PIntegerType)
206
131
  end
207
132
 
208
133
  it 'float translates to PFloatType' do
209
- expect(calculator.infer(1.3).class).to eq(Puppet::Pops::Types::PFloatType)
134
+ expect(calculator.infer(1.3).class).to eq(PFloatType)
210
135
  end
211
136
 
212
137
  it 'string translates to PStringType' do
213
- expect(calculator.infer('foo').class).to eq(Puppet::Pops::Types::PStringType)
138
+ expect(calculator.infer('foo').class).to eq(PStringType)
214
139
  end
215
140
 
216
141
  it 'inferred string type knows the string value' do
217
142
  t = calculator.infer('foo')
218
- expect(t.class).to eq(Puppet::Pops::Types::PStringType)
219
- expect(t.values).to eq(['foo'])
143
+ expect(t.class).to eq(PStringType)
144
+ expect(t.value).to eq('foo')
220
145
  end
221
146
 
222
147
  it 'boolean true translates to PBooleanType' do
223
- expect(calculator.infer(true).class).to eq(Puppet::Pops::Types::PBooleanType)
148
+ expect(calculator.infer(true).class).to eq(PBooleanType)
224
149
  end
225
150
 
226
151
  it 'boolean false translates to PBooleanType' do
227
- expect(calculator.infer(false).class).to eq(Puppet::Pops::Types::PBooleanType)
152
+ expect(calculator.infer(false).class).to eq(PBooleanType)
228
153
  end
229
154
 
230
155
  it 'regexp translates to PRegexpType' do
231
- expect(calculator.infer(/^a regular expression$/).class).to eq(Puppet::Pops::Types::PRegexpType)
156
+ expect(calculator.infer(/^a regular expression$/).class).to eq(PRegexpType)
157
+ end
158
+
159
+ it 'iterable translates to PIteratorType' do
160
+ expect(calculator.infer(Iterable.on(1))).to be_a(PIteratorType)
232
161
  end
233
162
 
234
163
  it 'nil translates to PUndefType' do
235
- expect(calculator.infer(nil).class).to eq(Puppet::Pops::Types::PUndefType)
164
+ expect(calculator.infer(nil).class).to eq(PUndefType)
236
165
  end
237
166
 
238
- it ':undef translates to PRuntimeType' do
239
- expect(calculator.infer(:undef).class).to eq(Puppet::Pops::Types::PRuntimeType)
167
+ it ':undef translates to PUndefType' do
168
+ expect(calculator.infer(:undef).class).to eq(PUndefType)
240
169
  end
241
170
 
242
171
  it 'an instance of class Foo translates to PRuntimeType[ruby, Foo]' do
243
- class Foo
172
+ ::Foo = Class.new
173
+ begin
174
+ t = calculator.infer(::Foo.new)
175
+ expect(t.class).to eq(PRuntimeType)
176
+ expect(t.runtime).to eq(:ruby)
177
+ expect(t.runtime_type_name).to eq('Foo')
178
+ ensure
179
+ Object.send(:remove_const, :Foo)
180
+ end
181
+ end
182
+
183
+ it 'Class Foo translates to PType[PRuntimeType[ruby, Foo]]' do
184
+ ::Foo = Class.new
185
+ begin
186
+ t = calculator.infer(::Foo)
187
+ expect(t.class).to eq(PType)
188
+ tt = t.type
189
+ expect(tt.class).to eq(PRuntimeType)
190
+ expect(tt.runtime).to eq(:ruby)
191
+ expect(tt.runtime_type_name).to eq('Foo')
192
+ ensure
193
+ Object.send(:remove_const, :Foo)
194
+ end
195
+ end
196
+
197
+ it 'Module FooModule translates to PType[PRuntimeType[ruby, FooModule]]' do
198
+ ::FooModule = Module.new
199
+ begin
200
+ t = calculator.infer(::FooModule)
201
+ expect(t.class).to eq(PType)
202
+ tt = t.type
203
+ expect(tt.class).to eq(PRuntimeType)
204
+ expect(tt.runtime).to eq(:ruby)
205
+ expect(tt.runtime_type_name).to eq('FooModule')
206
+ ensure
207
+ Object.send(:remove_const, :FooModule)
208
+ end
209
+ end
210
+
211
+ context 'sensitive' do
212
+ it 'translates to PSensitiveType' do
213
+ expect(calculator.infer(PSensitiveType::Sensitive.new("hunter2")).class).to eq(PSensitiveType)
214
+ end
215
+ end
216
+
217
+ context 'binary' do
218
+ it 'translates to PBinaryType' do
219
+ expect(calculator.infer(PBinaryType::Binary.from_binary_string("binary")).class).to eq(PBinaryType)
220
+ end
221
+ end
222
+
223
+ context 'version' do
224
+ it 'translates to PVersionType' do
225
+ expect(calculator.infer(SemanticPuppet::Version.new(1,0,0)).class).to eq(PSemVerType)
226
+ end
227
+
228
+ it 'range translates to PVersionRangeType' do
229
+ expect(calculator.infer(SemanticPuppet::VersionRange.parse('1.x')).class).to eq(PSemVerRangeType)
230
+ end
231
+
232
+ it 'translates to a limited PVersionType by infer_set' do
233
+ v = SemanticPuppet::Version.new(1,0,0)
234
+ t = calculator.infer_set(v)
235
+ expect(t.class).to eq(PSemVerType)
236
+ expect(t.ranges.size).to eq(1)
237
+ expect(t.ranges[0].min).to eq(v)
238
+ expect(t.ranges[0].max).to eq(v)
239
+ end
240
+ end
241
+
242
+ context 'timespan' do
243
+ it 'translates to PTimespanType' do
244
+ expect(calculator.infer(Time::Timespan.from_fields_hash('days' => 2))).to be_a(PTimespanType)
245
+ end
246
+
247
+ it 'translates to a limited PTimespanType by infer_set' do
248
+ ts = Time::Timespan.from_fields_hash('days' => 2)
249
+ t = calculator.infer_set(ts)
250
+ expect(t.class).to eq(PTimespanType)
251
+ expect(t.from).to be(ts)
252
+ expect(t.to).to be(ts)
244
253
  end
254
+ end
245
255
 
246
- t = calculator.infer(Foo.new)
247
- expect(t.class).to eq(Puppet::Pops::Types::PRuntimeType)
248
- expect(t.runtime).to eq(:ruby)
249
- expect(t.runtime_type_name).to eq('Foo')
256
+ context 'timestamp' do
257
+ it 'translates to PTimespanType' do
258
+ expect(calculator.infer(Time::Timestamp.now)).to be_a(PTimestampType)
259
+ end
260
+
261
+ it 'translates to a limited PTimespanType by infer_set' do
262
+ ts = Time::Timestamp.now
263
+ t = calculator.infer_set(ts)
264
+ expect(t.class).to eq(PTimestampType)
265
+ expect(t.from).to be(ts)
266
+ expect(t.to).to be(ts)
267
+ end
250
268
  end
251
269
 
252
270
  context 'array' do
253
271
  it 'translates to PArrayType' do
254
- expect(calculator.infer([1,2]).class).to eq(Puppet::Pops::Types::PArrayType)
272
+ expect(calculator.infer([1,2]).class).to eq(PArrayType)
255
273
  end
256
274
 
257
275
  it 'with fixnum values translates to PArrayType[PIntegerType]' do
258
- expect(calculator.infer([1,2]).element_type.class).to eq(Puppet::Pops::Types::PIntegerType)
276
+ expect(calculator.infer([1,2]).element_type.class).to eq(PIntegerType)
259
277
  end
260
278
 
261
279
  it 'with 32 and 64 bit integer values translates to PArrayType[PIntegerType]' do
262
- expect(calculator.infer([1,2**33]).element_type.class).to eq(Puppet::Pops::Types::PIntegerType)
280
+ expect(calculator.infer([1,2**33]).element_type.class).to eq(PIntegerType)
263
281
  end
264
282
 
265
283
  it 'Range of integer values are computed' do
266
284
  t = calculator.infer([-3,0,42]).element_type
267
- expect(t.class).to eq(Puppet::Pops::Types::PIntegerType)
285
+ expect(t.class).to eq(PIntegerType)
268
286
  expect(t.from).to eq(-3)
269
287
  expect(t.to).to eq(42)
270
288
  end
271
289
 
272
- it "Compound string values are computed" do
290
+ it 'Compound string values are converted to enums' do
273
291
  t = calculator.infer(['a','b', 'c']).element_type
274
- expect(t.class).to eq(Puppet::Pops::Types::PStringType)
292
+ expect(t.class).to eq(PEnumType)
275
293
  expect(t.values).to eq(['a', 'b', 'c'])
276
294
  end
277
295
 
278
296
  it 'with fixnum and float values translates to PArrayType[PNumericType]' do
279
- expect(calculator.infer([1,2.0]).element_type.class).to eq(Puppet::Pops::Types::PNumericType)
297
+ expect(calculator.infer([1,2.0]).element_type.class).to eq(PNumericType)
280
298
  end
281
299
 
282
300
  it 'with fixnum and string values translates to PArrayType[PScalarType]' do
283
- expect(calculator.infer([1,'two']).element_type.class).to eq(Puppet::Pops::Types::PScalarType)
301
+ expect(calculator.infer([1,'two']).element_type.class).to eq(PScalarType)
284
302
  end
285
303
 
286
304
  it 'with float and string values translates to PArrayType[PScalarType]' do
287
- expect(calculator.infer([1.0,'two']).element_type.class).to eq(Puppet::Pops::Types::PScalarType)
305
+ expect(calculator.infer([1.0,'two']).element_type.class).to eq(PScalarType)
288
306
  end
289
307
 
290
308
  it 'with fixnum, float, and string values translates to PArrayType[PScalarType]' do
291
- expect(calculator.infer([1, 2.0,'two']).element_type.class).to eq(Puppet::Pops::Types::PScalarType)
309
+ expect(calculator.infer([1, 2.0,'two']).element_type.class).to eq(PScalarType)
292
310
  end
293
311
 
294
312
  it 'with fixnum and regexp values translates to PArrayType[PScalarType]' do
295
- expect(calculator.infer([1, /two/]).element_type.class).to eq(Puppet::Pops::Types::PScalarType)
313
+ expect(calculator.infer([1, /two/]).element_type.class).to eq(PScalarType)
296
314
  end
297
315
 
298
316
  it 'with string and regexp values translates to PArrayType[PScalarType]' do
299
- expect(calculator.infer(['one', /two/]).element_type.class).to eq(Puppet::Pops::Types::PScalarType)
317
+ expect(calculator.infer(['one', /two/]).element_type.class).to eq(PScalarType)
300
318
  end
301
319
 
302
320
  it 'with string and symbol values translates to PArrayType[PAnyType]' do
303
- expect(calculator.infer(['one', :two]).element_type.class).to eq(Puppet::Pops::Types::PAnyType)
321
+ expect(calculator.infer(['one', :two]).element_type.class).to eq(PAnyType)
304
322
  end
305
323
 
306
324
  it 'with fixnum and nil values translates to PArrayType[PIntegerType]' do
307
- expect(calculator.infer([1, nil]).element_type.class).to eq(Puppet::Pops::Types::PIntegerType)
325
+ expect(calculator.infer([1, nil]).element_type.class).to eq(PIntegerType)
308
326
  end
309
327
 
310
328
  it 'with arrays of string values translates to PArrayType[PArrayType[PStringType]]' do
311
- et = calculator.infer([['first' 'array'], ['second','array']])
312
- expect(et.class).to eq(Puppet::Pops::Types::PArrayType)
329
+ et = calculator.infer([['first', 'array'], ['second','array']])
330
+ expect(et.class).to eq(PArrayType)
313
331
  et = et.element_type
314
- expect(et.class).to eq(Puppet::Pops::Types::PArrayType)
332
+ expect(et.class).to eq(PArrayType)
315
333
  et = et.element_type
316
- expect(et.class).to eq(Puppet::Pops::Types::PStringType)
334
+ expect(et.class).to eq(PEnumType)
317
335
  end
318
336
 
319
337
  it 'with array of string values and array of fixnums translates to PArrayType[PArrayType[PScalarType]]' do
320
- et = calculator.infer([['first' 'array'], [1,2]])
321
- expect(et.class).to eq(Puppet::Pops::Types::PArrayType)
338
+ et = calculator.infer([['first', 'array'], [1,2]])
339
+ expect(et.class).to eq(PArrayType)
322
340
  et = et.element_type
323
- expect(et.class).to eq(Puppet::Pops::Types::PArrayType)
341
+ expect(et.class).to eq(PArrayType)
324
342
  et = et.element_type
325
- expect(et.class).to eq(Puppet::Pops::Types::PScalarType)
343
+ expect(et.class).to eq(PScalarType)
326
344
  end
327
345
 
328
- it 'with hashes of string values translates to PArrayType[PHashType[PStringType]]' do
346
+ it 'with hashes of string values translates to PArrayType[PHashType[PEnumType]]' do
329
347
  et = calculator.infer([{:first => 'first', :second => 'second' }, {:first => 'first', :second => 'second' }])
330
- expect(et.class).to eq(Puppet::Pops::Types::PArrayType)
348
+ expect(et.class).to eq(PArrayType)
331
349
  et = et.element_type
332
- expect(et.class).to eq(Puppet::Pops::Types::PHashType)
333
- et = et.element_type
334
- expect(et.class).to eq(Puppet::Pops::Types::PStringType)
350
+ expect(et.class).to eq(PHashType)
351
+ et = et.value_type
352
+ expect(et.class).to eq(PEnumType)
335
353
  end
336
354
 
337
355
  it 'with hash of string values and hash of fixnums translates to PArrayType[PHashType[PScalarType]]' do
338
356
  et = calculator.infer([{:first => 'first', :second => 'second' }, {:first => 1, :second => 2 }])
339
- expect(et.class).to eq(Puppet::Pops::Types::PArrayType)
340
- et = et.element_type
341
- expect(et.class).to eq(Puppet::Pops::Types::PHashType)
357
+ expect(et.class).to eq(PArrayType)
342
358
  et = et.element_type
343
- expect(et.class).to eq(Puppet::Pops::Types::PScalarType)
359
+ expect(et.class).to eq(PHashType)
360
+ et = et.value_type
361
+ expect(et.class).to eq(PScalarType)
344
362
  end
345
363
  end
346
364
 
347
365
  context 'hash' do
348
366
  it 'translates to PHashType' do
349
- expect(calculator.infer({:first => 1, :second => 2}).class).to eq(Puppet::Pops::Types::PHashType)
367
+ expect(calculator.infer({:first => 1, :second => 2}).class).to eq(PHashType)
350
368
  end
351
369
 
352
370
  it 'with symbolic keys translates to PHashType[PRuntimeType[ruby, Symbol], value]' do
353
371
  k = calculator.infer({:first => 1, :second => 2}).key_type
354
- expect(k.class).to eq(Puppet::Pops::Types::PRuntimeType)
372
+ expect(k.class).to eq(PRuntimeType)
355
373
  expect(k.runtime).to eq(:ruby)
356
374
  expect(k.runtime_type_name).to eq('Symbol')
357
375
  end
358
376
 
359
- it 'with string keys translates to PHashType[PStringType, value]' do
360
- expect(calculator.infer({'first' => 1, 'second' => 2}).key_type.class).to eq(Puppet::Pops::Types::PStringType)
377
+ it 'with string keys translates to PHashType[PEnumType, value]' do
378
+ expect(calculator.infer({'first' => 1, 'second' => 2}).key_type.class).to eq(PEnumType)
361
379
  end
362
380
 
363
381
  it 'with fixnum values translates to PHashType[key, PIntegerType]' do
364
- expect(calculator.infer({:first => 1, :second => 2}).element_type.class).to eq(Puppet::Pops::Types::PIntegerType)
382
+ expect(calculator.infer({:first => 1, :second => 2}).value_type.class).to eq(PIntegerType)
365
383
  end
366
384
 
367
385
  it 'when empty infers a type that answers true to is_the_empty_hash?' do
@@ -374,110 +392,132 @@ describe 'The type calculator' do
374
392
  end
375
393
 
376
394
  it 'when empty is not assignable to a PHashType with from size > 0' do
377
- expect(calculator.assignable?(constrained_t(hash_t(string_t,string_t), 1, 1), calculator.infer({}))).to eq(false)
395
+ expect(calculator.assignable?(hash_t(string_t,string_t,range_t(1, 1)), calculator.infer({}))).to eq(false)
378
396
  end
379
397
 
380
398
  context 'using infer_set' do
381
399
  it "with 'first' and 'second' keys translates to PStructType[{first=>value,second=>value}]" do
382
400
  t = calculator.infer_set({'first' => 1, 'second' => 2})
383
- expect(t.class).to eq(Puppet::Pops::Types::PStructType)
401
+ expect(t.class).to eq(PStructType)
384
402
  expect(t.elements.size).to eq(2)
385
403
  expect(t.elements.map { |e| e.name }.sort).to eq(['first', 'second'])
386
404
  end
387
405
 
388
406
  it 'with string keys and string and array values translates to PStructType[{key1=>PStringType,key2=>PTupleType}]' do
389
407
  t = calculator.infer_set({ 'mode' => 'read', 'path' => ['foo', 'fee' ] })
390
- expect(t.class).to eq(Puppet::Pops::Types::PStructType)
408
+ expect(t.class).to eq(PStructType)
391
409
  expect(t.elements.size).to eq(2)
392
- els = t.elements.map { |e| e.type }.sort {|a,b| a.to_s <=> b.to_s }
393
- expect(els[0].class).to eq(Puppet::Pops::Types::PStringType)
394
- expect(els[1].class).to eq(Puppet::Pops::Types::PTupleType)
410
+ els = t.elements.map { |e| e.value_type }.sort {|a,b| a.to_s <=> b.to_s }
411
+ expect(els[0].class).to eq(PStringType)
412
+ expect(els[1].class).to eq(PTupleType)
395
413
  end
396
414
 
397
415
  it 'with mixed string and non-string keys translates to PHashType' do
398
416
  t = calculator.infer_set({ 1 => 'first', 'second' => 'second' })
399
- expect(t.class).to eq(Puppet::Pops::Types::PHashType)
417
+ expect(t.class).to eq(PHashType)
400
418
  end
401
419
 
402
420
  it 'with empty string keys translates to PHashType' do
403
421
  t = calculator.infer_set({ '' => 'first', 'second' => 'second' })
404
- expect(t.class).to eq(Puppet::Pops::Types::PHashType)
422
+ expect(t.class).to eq(PHashType)
405
423
  end
406
424
  end
407
425
  end
408
426
  end
409
427
 
410
428
  context 'patterns' do
411
- it "constructs a PPatternType" do
429
+ it 'constructs a PPatternType' do
412
430
  t = pattern_t('a(b)c')
413
- expect(t.class).to eq(Puppet::Pops::Types::PPatternType)
431
+ expect(t.class).to eq(PPatternType)
414
432
  expect(t.patterns.size).to eq(1)
415
- expect(t.patterns[0].class).to eq(Puppet::Pops::Types::PRegexpType)
433
+ expect(t.patterns[0].class).to eq(PRegexpType)
416
434
  expect(t.patterns[0].pattern).to eq('a(b)c')
417
435
  expect(t.patterns[0].regexp.match('abc')[1]).to eq('b')
418
436
  end
419
437
 
420
- it "constructs a PStringType with multiple strings" do
421
- t = string_t('a', 'b', 'c', 'abc')
422
- expect(t.values).to eq(['a', 'b', 'c', 'abc'])
438
+ it 'constructs a PEnumType with multiple strings' do
439
+ t = enum_t('a', 'b', 'c', 'abc')
440
+ expect(t.values).to eq(['a', 'b', 'c', 'abc'].sort)
423
441
  end
424
442
  end
425
443
 
426
444
  # Deal with cases not covered by computing common type
427
445
  context 'when computing common type' do
428
446
  it 'computes given resource type commonality' do
429
- r1 = Puppet::Pops::Types::PResourceType.new()
430
- r1.type_name = 'File'
431
- r2 = Puppet::Pops::Types::PResourceType.new()
432
- r2.type_name = 'File'
433
- expect(calculator.string(calculator.common_type(r1, r2))).to eq("File")
447
+ r1 = PResourceType.new('File', nil)
448
+ r2 = PResourceType.new('File', nil)
449
+ expect(calculator.common_type(r1, r2).to_s).to eq('File')
450
+
434
451
 
435
- r2 = Puppet::Pops::Types::PResourceType.new()
436
- r2.type_name = 'File'
437
- r2.title = '/tmp/foo'
438
- expect(calculator.string(calculator.common_type(r1, r2))).to eq("File")
452
+ r2 = PResourceType.new('File', '/tmp/foo')
453
+ expect(calculator.common_type(r1, r2).to_s).to eq('File')
439
454
 
440
- r1 = Puppet::Pops::Types::PResourceType.new()
441
- r1.type_name = 'File'
442
- r1.title = '/tmp/foo'
443
- expect(calculator.string(calculator.common_type(r1, r2))).to eq("File['/tmp/foo']")
455
+ r1 = PResourceType.new('File', '/tmp/foo')
456
+ expect(calculator.common_type(r1, r2).to_s).to eq("File['/tmp/foo']")
444
457
 
445
- r1 = Puppet::Pops::Types::PResourceType.new()
446
- r1.type_name = 'File'
447
- r1.title = '/tmp/bar'
448
- expect(calculator.string(calculator.common_type(r1, r2))).to eq("File")
458
+ r1 = PResourceType.new('File', '/tmp/bar')
459
+ expect(calculator.common_type(r1, r2).to_s).to eq('File')
449
460
 
450
- r2 = Puppet::Pops::Types::PResourceType.new()
451
- r2.type_name = 'Package'
452
- r2.title = 'apache'
453
- expect(calculator.string(calculator.common_type(r1, r2))).to eq("Resource")
461
+ r2 = PResourceType.new('Package', 'apache')
462
+ expect(calculator.common_type(r1, r2).to_s).to eq('Resource')
454
463
  end
455
464
 
456
465
  it 'computes given hostclass type commonality' do
457
- r1 = Puppet::Pops::Types::PHostClassType.new()
458
- r1.class_name = 'foo'
459
- r2 = Puppet::Pops::Types::PHostClassType.new()
460
- r2.class_name = 'foo'
461
- expect(calculator.string(calculator.common_type(r1, r2))).to eq("Class[foo]")
466
+ r1 = PHostClassType.new('foo')
467
+ r2 = PHostClassType.new('foo')
468
+ expect(calculator.common_type(r1, r2).to_s).to eq('Class[foo]')
469
+
470
+ r2 = PHostClassType.new('bar')
471
+ expect(calculator.common_type(r1, r2).to_s).to eq('Class')
472
+
473
+ r2 = PHostClassType.new(nil)
474
+ expect(calculator.common_type(r1, r2).to_s).to eq('Class')
462
475
 
463
- r2 = Puppet::Pops::Types::PHostClassType.new()
464
- r2.class_name = 'bar'
465
- expect(calculator.string(calculator.common_type(r1, r2))).to eq("Class")
476
+ r1 = PHostClassType.new(nil)
477
+ expect(calculator.common_type(r1, r2).to_s).to eq('Class')
478
+ end
479
+
480
+ context 'of strings' do
481
+ it 'computes commonality' do
482
+ t1 = string_t('abc')
483
+ t2 = string_t('xyz')
484
+ common_t = calculator.common_type(t1,t2)
485
+ expect(common_t.class).to eq(PEnumType)
486
+ expect(common_t.values).to eq(['abc', 'xyz'])
487
+ end
488
+
489
+ it 'computes common size_type' do
490
+ t1 = constrained_string_t(range_t(3,6))
491
+ t2 = constrained_string_t(range_t(2,4))
492
+ common_t = calculator.common_type(t1,t2)
493
+ expect(common_t.class).to eq(PStringType)
494
+ expect(common_t.size_type).to eq(range_t(2,6))
495
+ end
466
496
 
467
- r2 = Puppet::Pops::Types::PHostClassType.new()
468
- expect(calculator.string(calculator.common_type(r1, r2))).to eq("Class")
497
+ it 'computes common size_type to be undef when one of the types has no size_type' do
498
+ t1 = string_t
499
+ t2 = constrained_string_t(range_t(2,4))
500
+ common_t = calculator.common_type(t1,t2)
501
+ expect(common_t.class).to eq(PStringType)
502
+ expect(common_t.size_type).to be_nil
503
+ end
469
504
 
470
- r1 = Puppet::Pops::Types::PHostClassType.new()
471
- expect(calculator.string(calculator.common_type(r1, r2))).to eq("Class")
505
+ it 'computes values to be empty if the one has empty values' do
506
+ t1 = string_t('apa')
507
+ t2 = constrained_string_t(range_t(2,4))
508
+ common_t = calculator.common_type(t1,t2)
509
+ expect(common_t.class).to eq(PStringType)
510
+ expect(common_t.value).to be_nil
511
+ end
472
512
  end
473
513
 
474
514
  it 'computes pattern commonality' do
475
515
  t1 = pattern_t('abc')
476
516
  t2 = pattern_t('xyz')
477
517
  common_t = calculator.common_type(t1,t2)
478
- expect(common_t.class).to eq(Puppet::Pops::Types::PPatternType)
518
+ expect(common_t.class).to eq(PPatternType)
479
519
  expect(common_t.patterns.map { |pr| pr.pattern }).to eq(['abc', 'xyz'])
480
- expect(calculator.string(common_t)).to eq("Pattern[/abc/, /xyz/]")
520
+ expect(common_t.to_s).to eq('Pattern[/abc/, /xyz/]')
481
521
  end
482
522
 
483
523
  it 'computes enum commonality to value set sum' do
@@ -488,131 +528,228 @@ describe 'The type calculator' do
488
528
  end
489
529
 
490
530
  it 'computed variant commonality to type union where added types are not sub-types' do
491
- a_t1 = integer_t()
531
+ a_t1 = integer_t
492
532
  a_t2 = enum_t('b')
493
533
  v_a = variant_t(a_t1, a_t2)
494
- b_t1 = enum_t('a')
495
- v_b = variant_t(b_t1)
534
+ b_t1 = integer_t
535
+ b_t2 = enum_t('a')
536
+ v_b = variant_t(b_t1, b_t2)
496
537
  common_t = calculator.common_type(v_a, v_b)
497
- expect(common_t.class).to eq(Puppet::Pops::Types::PVariantType)
498
- expect(Set.new(common_t.types)).to eq(Set.new([a_t1, a_t2, b_t1]))
538
+ expect(common_t.class).to eq(PVariantType)
539
+ expect(Set.new(common_t.types)).to eq(Set.new([a_t1, a_t2, b_t1, b_t2]))
499
540
  end
500
541
 
501
542
  it 'computed variant commonality to type union where added types are sub-types' do
502
- a_t1 = integer_t()
503
- a_t2 = string_t()
543
+ a_t1 = integer_t
544
+ a_t2 = string_t
504
545
  v_a = variant_t(a_t1, a_t2)
505
- b_t1 = enum_t('a')
506
- v_b = variant_t(b_t1)
546
+ b_t1 = integer_t
547
+ b_t2 = enum_t('a')
548
+ v_b = variant_t(b_t1, b_t2)
507
549
  common_t = calculator.common_type(v_a, v_b)
508
- expect(common_t.class).to eq(Puppet::Pops::Types::PVariantType)
550
+ expect(common_t.class).to eq(PVariantType)
509
551
  expect(Set.new(common_t.types)).to eq(Set.new([a_t1, a_t2]))
510
552
  end
511
553
 
512
- context "of callables" do
554
+ context 'of callables' do
513
555
  it 'incompatible instances => generic callable' do
514
556
  t1 = callable_t(String)
515
557
  t2 = callable_t(Integer)
516
558
  common_t = calculator.common_type(t1, t2)
517
- expect(common_t.class).to be(Puppet::Pops::Types::PCallableType)
559
+ expect(common_t.class).to be(PCallableType)
518
560
  expect(common_t.param_types).to be_nil
519
561
  expect(common_t.block_type).to be_nil
520
562
  end
521
563
 
522
564
  it 'compatible instances => the most specific' do
523
565
  t1 = callable_t(String)
524
- scalar_t = Puppet::Pops::Types::PScalarType.new
566
+ scalar_t = PScalarType.new
525
567
  t2 = callable_t(scalar_t)
526
568
  common_t = calculator.common_type(t1, t2)
527
- expect(common_t.class).to be(Puppet::Pops::Types::PCallableType)
528
- expect(common_t.param_types.class).to be(Puppet::Pops::Types::PTupleType)
569
+ expect(common_t.class).to be(PCallableType)
570
+ expect(common_t.param_types.class).to be(PTupleType)
529
571
  expect(common_t.param_types.types).to eql([string_t])
530
572
  expect(common_t.block_type).to be_nil
531
573
  end
532
574
 
533
575
  it 'block_type is included in the check (incompatible block)' do
534
- t1 = with_block_t(callable_t(String), String)
535
- t2 = with_block_t(callable_t(String), Integer)
576
+ b1 = callable_t(String)
577
+ b2 = callable_t(Integer)
578
+ t1 = callable_t(String, b1)
579
+ t2 = callable_t(String, b2)
536
580
  common_t = calculator.common_type(t1, t2)
537
- expect(common_t.class).to be(Puppet::Pops::Types::PCallableType)
581
+ expect(common_t.class).to be(PCallableType)
538
582
  expect(common_t.param_types).to be_nil
539
583
  expect(common_t.block_type).to be_nil
540
584
  end
541
585
 
542
586
  it 'block_type is included in the check (compatible block)' do
543
- t1 = with_block_t(callable_t(String), String)
544
- scalar_t = Puppet::Pops::Types::PScalarType.new
545
- t2 = with_block_t(callable_t(String), scalar_t)
587
+ b1 = callable_t(String)
588
+ t1 = callable_t(String, b1)
589
+ scalar_t = PScalarType::DEFAULT
590
+ b2 = callable_t(scalar_t)
591
+ t2 = callable_t(String, b2)
546
592
  common_t = calculator.common_type(t1, t2)
547
- expect(common_t.param_types.class).to be(Puppet::Pops::Types::PTupleType)
593
+ expect(common_t.param_types.class).to be(PTupleType)
548
594
  expect(common_t.block_type).to eql(callable_t(scalar_t))
549
595
  end
596
+
597
+ it 'return_type is included in the check (incompatible return_type)' do
598
+ t1 = callable_t([String], String)
599
+ t2 = callable_t([String], Integer)
600
+ common_t = calculator.common_type(t1, t2)
601
+ expect(common_t.class).to be(PCallableType)
602
+ expect(common_t.param_types).to be_nil
603
+ expect(common_t.return_type).to be_nil
604
+ end
605
+
606
+ it 'return_type is included in the check (compatible return_type)' do
607
+ t1 = callable_t([String], Numeric)
608
+ t2 = callable_t([String], Integer)
609
+ common_t = calculator.common_type(t1, t2)
610
+ expect(common_t.class).to be(PCallableType)
611
+ expect(common_t.param_types).to be_a(PTupleType)
612
+ expect(common_t.return_type).to eql(PNumericType::DEFAULT)
613
+ end
550
614
  end
551
615
  end
552
616
 
553
617
  context 'computes assignability' do
554
- include_context "types_setup"
618
+ include_context 'types_setup'
619
+
620
+ it 'such that all types are assignable to themselves' do
621
+ all_types.each do |tc|
622
+ t = tc::DEFAULT
623
+ expect(t).to be_assignable_to(t)
624
+ end
625
+ end
555
626
 
556
627
  context 'for Unit, such that' do
557
628
  it 'all types are assignable to Unit' do
558
- t = Puppet::Pops::Types::PUnitType.new()
559
- all_types.each { |t2| expect(t2.new).to be_assignable_to(t) }
629
+ t = PUnitType::DEFAULT
630
+ all_types.each { |t2| expect(t2::DEFAULT).to be_assignable_to(t) }
560
631
  end
561
632
 
562
633
  it 'Unit is assignable to all other types' do
563
- t = Puppet::Pops::Types::PUnitType.new()
564
- all_types.each { |t2| expect(t).to be_assignable_to(t2.new) }
634
+ t = PUnitType::DEFAULT
635
+ all_types.each { |t2| expect(t).to be_assignable_to(t2::DEFAULT) }
565
636
  end
566
637
 
567
638
  it 'Unit is assignable to Unit' do
568
- t = Puppet::Pops::Types::PUnitType.new()
569
- t2 = Puppet::Pops::Types::PUnitType.new()
639
+ t = PUnitType::DEFAULT
640
+ t2 = PUnitType::DEFAULT
570
641
  expect(t).to be_assignable_to(t2)
571
642
  end
572
643
  end
573
644
 
574
- context "for Any, such that" do
645
+ context 'for Any, such that' do
575
646
  it 'all types are assignable to Any' do
576
- t = Puppet::Pops::Types::PAnyType.new()
577
- all_types.each { |t2| expect(t2.new).to be_assignable_to(t) }
647
+ t = PAnyType::DEFAULT
648
+ all_types.each { |t2| expect(t2::DEFAULT).to be_assignable_to(t) }
649
+ end
650
+
651
+ it 'Any is not assignable to anything but Any and Optional (implied Optional[Any])' do
652
+ tested_types = all_types() - [PAnyType, POptionalType]
653
+ t = PAnyType::DEFAULT
654
+ tested_types.each { |t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
655
+ end
656
+ end
657
+
658
+ context "for NotUndef, such that" do
659
+ it 'all types except types assignable from Undef are assignable to NotUndef' do
660
+ t = not_undef_t
661
+ tc = TypeCalculator.singleton
662
+ undef_t = PUndefType::DEFAULT
663
+ all_types.each do |c|
664
+ t2 = c::DEFAULT
665
+ if tc.assignable?(t2, undef_t)
666
+ expect(t2).not_to be_assignable_to(t)
667
+ else
668
+ expect(t2).to be_assignable_to(t)
669
+ end
670
+ end
671
+ end
672
+
673
+ it 'type NotUndef[T] is assignable from T unless T is assignable from Undef ' do
674
+ tc = TypeCalculator.singleton
675
+ undef_t = PUndefType::DEFAULT
676
+ all_types().select do |c|
677
+ t2 = c::DEFAULT
678
+ not_undef_t = not_undef_t(t2)
679
+ if tc.assignable?(t2, undef_t)
680
+ expect(t2).not_to be_assignable_to(not_undef_t)
681
+ else
682
+ expect(t2).to be_assignable_to(not_undef_t)
683
+ end
684
+ end
685
+ end
686
+
687
+ it 'type T is assignable from NotUndef[T] unless T is assignable from Undef' do
688
+ tc = TypeCalculator.singleton
689
+ undef_t = PUndefType::DEFAULT
690
+ all_types().select do |c|
691
+ t2 = c::DEFAULT
692
+ not_undef_t = not_undef_t(t2)
693
+ unless tc.assignable?(t2, undef_t)
694
+ expect(not_undef_t).to be_assignable_to(t2)
695
+ end
696
+ end
697
+ end
698
+ end
699
+
700
+ context "for TypeReference, such that" do
701
+ it 'no other type is assignable' do
702
+ t = PTypeReferenceType::DEFAULT
703
+ all_instances = (all_types - [
704
+ PTypeReferenceType, # Avoid comparison with t
705
+ PVariantType, # DEFAULT contains no variants, so assignability is never tested and always true
706
+ PTypeAliasType # DEFAULT resolves to PTypeReferenceType::DEFAULT, i.e. t
707
+ ]).map {|c| c::DEFAULT }
708
+
709
+ # Add a non-empty variant
710
+ all_instances << variant_t(PAnyType::DEFAULT, PUnitType::DEFAULT)
711
+ # Add a type alias that doesn't resolve to 't'
712
+ all_instances << type_alias_t('MyInt', 'Integer').resolve(TypeParser.singleton, nil)
713
+
714
+ all_instances.each { |i| expect(i).not_to be_assignable_to(t) }
715
+ end
716
+
717
+ it 'a TypeReference to the exact same type is assignable' do
718
+ expect(type_reference_t('Integer[0,10]')).to be_assignable_to(type_reference_t('Integer[0,10]'))
719
+ end
720
+
721
+ it 'a TypeReference to the different type is not assignable' do
722
+ expect(type_reference_t('String')).not_to be_assignable_to(type_reference_t('Integer'))
578
723
  end
579
724
 
580
- it 'Any is not assignable to anything but Any' do
581
- tested_types = all_types() - [Puppet::Pops::Types::PAnyType]
582
- t = Puppet::Pops::Types::PAnyType.new()
583
- tested_types.each { |t2| expect(t).not_to be_assignable_to(t2.new) }
725
+ it 'a TypeReference to the different type is not assignable even if the referenced type is' do
726
+ expect(type_reference_t('Integer[1,2]')).not_to be_assignable_to(type_reference_t('Integer[0,3]'))
584
727
  end
585
728
  end
586
729
 
587
- context "for Data, such that" do
730
+ context 'for Data, such that' do
588
731
  it 'all scalars + array and hash are assignable to Data' do
589
- t = Puppet::Pops::Types::PDataType.new()
732
+ t = PDataType::DEFAULT
590
733
  data_compatible_types.each { |t2|
591
734
  expect(type_from_class(t2)).to be_assignable_to(t)
592
735
  }
593
736
  end
594
737
 
595
- it 'a Variant of scalar, hash, or array is assignable to Data' do
596
- t = Puppet::Pops::Types::PDataType.new()
597
- data_compatible_types.each { |t2| expect(variant_t(type_from_class(t2))).to be_assignable_to(t) }
738
+ it 'a scalar, hash, or array is assignable to Data' do
739
+ t = PDataType::DEFAULT
740
+ data_compatible_types.each { |t2| expect(type_from_class(t2)).to be_assignable_to(t) }
598
741
  end
599
742
 
600
743
  it 'Data is not assignable to any of its subtypes' do
601
- t = Puppet::Pops::Types::PDataType.new()
602
- types_to_test = data_compatible_types- [Puppet::Pops::Types::PDataType]
744
+ t = PDataType::DEFAULT
745
+ types_to_test = data_compatible_types- [PDataType]
603
746
  types_to_test.each {|t2| expect(t).not_to be_assignable_to(type_from_class(t2)) }
604
747
  end
605
748
 
606
- it 'Data is not assignable to a Variant of Data subtype' do
607
- t = Puppet::Pops::Types::PDataType.new()
608
- types_to_test = data_compatible_types- [Puppet::Pops::Types::PDataType]
609
- types_to_test.each { |t2| expect(t).not_to be_assignable_to(variant_t(type_from_class(t2))) }
610
- end
611
-
612
749
  it 'Data is not assignable to any disjunct type' do
613
- tested_types = all_types - [Puppet::Pops::Types::PAnyType, Puppet::Pops::Types::PDataType] - scalar_types
614
- t = Puppet::Pops::Types::PDataType.new()
615
- tested_types.each {|t2| expect(t).not_to be_assignable_to(t2.new) }
750
+ tested_types = all_types - [PAnyType, POptionalType, PDataType] - scalar_types
751
+ t = PDataType::DEFAULT
752
+ tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
616
753
  end
617
754
  end
618
755
 
@@ -634,102 +771,132 @@ describe 'The type calculator' do
634
771
  end
635
772
  end
636
773
 
637
- context "for Scalar, such that" do
638
- it "all scalars are assignable to Scalar" do
639
- t = Puppet::Pops::Types::PScalarType.new()
640
- scalar_types.each {|t2| expect(t2.new).to be_assignable_to(t) }
774
+ context 'for Scalar, such that' do
775
+ it 'all scalars are assignable to Scalar' do
776
+ t = PScalarType::DEFAULT
777
+ scalar_types.each {|t2| expect(t2::DEFAULT).to be_assignable_to(t) }
641
778
  end
642
779
 
643
780
  it 'Scalar is not assignable to any of its subtypes' do
644
- t = Puppet::Pops::Types::PScalarType.new()
645
- types_to_test = scalar_types - [Puppet::Pops::Types::PScalarType]
646
- types_to_test.each {|t2| expect(t).not_to be_assignable_to(t2.new) }
781
+ t = PScalarType::DEFAULT
782
+ types_to_test = scalar_types - [PScalarType]
783
+ types_to_test.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
647
784
  end
648
785
 
649
786
  it 'Scalar is not assignable to any disjunct type' do
650
- tested_types = all_types - [Puppet::Pops::Types::PAnyType, Puppet::Pops::Types::PDataType] - scalar_types
651
- t = Puppet::Pops::Types::PScalarType.new()
652
- tested_types.each {|t2| expect(t).not_to be_assignable_to(t2.new) }
787
+ tested_types = all_types - [PAnyType, POptionalType, PNotUndefType, PDataType] - scalar_types
788
+ t = PScalarType::DEFAULT
789
+ tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
653
790
  end
654
791
  end
655
792
 
656
- context "for Numeric, such that" do
657
- it "all numerics are assignable to Numeric" do
658
- t = Puppet::Pops::Types::PNumericType.new()
659
- numeric_types.each {|t2| expect(t2.new).to be_assignable_to(t) }
793
+ context 'for Numeric, such that' do
794
+ it 'all numerics are assignable to Numeric' do
795
+ t = PNumericType::DEFAULT
796
+ numeric_types.each {|t2| expect(t2::DEFAULT).to be_assignable_to(t) }
660
797
  end
661
798
 
662
799
  it 'Numeric is not assignable to any of its subtypes' do
663
- t = Puppet::Pops::Types::PNumericType.new()
664
- types_to_test = numeric_types - [Puppet::Pops::Types::PNumericType]
665
- types_to_test.each {|t2| expect(t).not_to be_assignable_to(t2.new) }
800
+ t = PNumericType::DEFAULT
801
+ types_to_test = numeric_types - [PNumericType]
802
+ types_to_test.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
666
803
  end
667
804
 
668
805
  it 'Numeric is not assignable to any disjunct type' do
669
806
  tested_types = all_types - [
670
- Puppet::Pops::Types::PAnyType,
671
- Puppet::Pops::Types::PDataType,
672
- Puppet::Pops::Types::PScalarType,
807
+ PAnyType,
808
+ POptionalType,
809
+ PNotUndefType,
810
+ PDataType,
811
+ PScalarType,
673
812
  ] - numeric_types
674
- t = Puppet::Pops::Types::PNumericType.new()
675
- tested_types.each {|t2| expect(t).not_to be_assignable_to(t2.new) }
813
+ t = PNumericType::DEFAULT
814
+ tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
676
815
  end
677
816
  end
678
817
 
679
- context "for Collection, such that" do
680
- it "all collections are assignable to Collection" do
681
- t = Puppet::Pops::Types::PCollectionType.new()
682
- collection_types.each {|t2| expect(t2.new).to be_assignable_to(t) }
818
+ context 'for Collection, such that' do
819
+ it 'all collections are assignable to Collection' do
820
+ t = PCollectionType::DEFAULT
821
+ collection_types.each {|t2| expect(t2::DEFAULT).to be_assignable_to(t) }
683
822
  end
684
823
 
685
824
  it 'Collection is not assignable to any of its subtypes' do
686
- t = Puppet::Pops::Types::PCollectionType.new()
687
- types_to_test = collection_types - [Puppet::Pops::Types::PCollectionType]
688
- types_to_test.each {|t2| expect(t).not_to be_assignable_to(t2.new) }
825
+ t = PCollectionType::DEFAULT
826
+ types_to_test = collection_types - [PCollectionType]
827
+ types_to_test.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
689
828
  end
690
829
 
691
830
  it 'Collection is not assignable to any disjunct type' do
692
- tested_types = all_types - [Puppet::Pops::Types::PAnyType] - collection_types
693
- t = Puppet::Pops::Types::PCollectionType.new()
694
- tested_types.each {|t2| expect(t).not_to be_assignable_to(t2.new) }
831
+ tested_types = all_types - [
832
+ PAnyType,
833
+ POptionalType,
834
+ PNotUndefType,
835
+ PIterableType] - collection_types
836
+ t = PCollectionType::DEFAULT
837
+ tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
695
838
  end
696
839
  end
697
840
 
698
- context "for Array, such that" do
699
- it "Array is not assignable to non Array based Collection type" do
700
- t = Puppet::Pops::Types::PArrayType.new()
841
+ context 'for Array, such that' do
842
+ it 'Array is not assignable to non Array based Collection type' do
843
+ t = PArrayType::DEFAULT
701
844
  tested_types = collection_types - [
702
- Puppet::Pops::Types::PCollectionType,
703
- Puppet::Pops::Types::PArrayType,
704
- Puppet::Pops::Types::PTupleType]
705
- tested_types.each {|t2| expect(t).not_to be_assignable_to(t2.new) }
845
+ PCollectionType,
846
+ PNotUndefType,
847
+ PArrayType,
848
+ PTupleType]
849
+ tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
706
850
  end
707
851
 
708
852
  it 'Array is not assignable to any disjunct type' do
709
853
  tested_types = all_types - [
710
- Puppet::Pops::Types::PAnyType,
711
- Puppet::Pops::Types::PDataType] - collection_types
712
- t = Puppet::Pops::Types::PArrayType.new()
713
- tested_types.each {|t2| expect(t).not_to be_assignable_to(t2.new) }
854
+ PAnyType,
855
+ POptionalType,
856
+ PNotUndefType,
857
+ PIterableType,
858
+ PDataType] - collection_types
859
+ t = PArrayType::DEFAULT
860
+ tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
861
+ end
862
+
863
+ it 'Empty Array is assignable to an array that accepts 0 entries' do
864
+ expect(empty_array_t).to be_assignable_to(array_t(string_t))
865
+ expect(empty_array_t).to be_assignable_to(array_t(integer_t))
866
+ end
867
+
868
+ it 'A Tuple is assignable to an array' do
869
+ expect(tuple_t(String)).to be_assignable_to(array_t(String))
870
+ end
871
+
872
+ it 'A Tuple with <n> elements is assignable to an array with min size <n>' do
873
+ expect(tuple_t(String,String)).to be_assignable_to(array_t(String, range_t(2, :default)))
874
+ end
875
+
876
+ it 'A Tuple with <n> elements where the last 2 are optional is assignable to an array with size <n> - 2' do
877
+ expect(constrained_tuple_t(range_t(2, :default), String,String,String,String)).to be_assignable_to(array_t(String, range_t(2, :default)))
714
878
  end
715
879
  end
716
880
 
717
- context "for Hash, such that" do
718
- it "Hash is not assignable to any other Collection type" do
719
- t = Puppet::Pops::Types::PHashType.new()
881
+ context 'for Hash, such that' do
882
+ it 'Hash is not assignable to any other Collection type' do
883
+ t = PHashType::DEFAULT
720
884
  tested_types = collection_types - [
721
- Puppet::Pops::Types::PCollectionType,
722
- Puppet::Pops::Types::PStructType,
723
- Puppet::Pops::Types::PHashType]
724
- tested_types.each {|t2| expect(t).not_to be_assignable_to(t2.new) }
885
+ PCollectionType,
886
+ PStructType,
887
+ PHashType]
888
+ tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
725
889
  end
726
890
 
727
891
  it 'Hash is not assignable to any disjunct type' do
728
892
  tested_types = all_types - [
729
- Puppet::Pops::Types::PAnyType,
730
- Puppet::Pops::Types::PDataType] - collection_types
731
- t = Puppet::Pops::Types::PHashType.new()
732
- tested_types.each {|t2| expect(t).not_to be_assignable_to(t2.new) }
893
+ PAnyType,
894
+ POptionalType,
895
+ PNotUndefType,
896
+ PIterableType,
897
+ PDataType] - collection_types
898
+ t = PHashType::DEFAULT
899
+ tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
733
900
  end
734
901
 
735
902
  it 'Struct is assignable to Hash with Pattern that matches all keys' do
@@ -749,68 +916,187 @@ describe 'The type calculator' do
749
916
  end
750
917
  end
751
918
 
752
- context "for Tuple, such that" do
753
- it "Tuple is not assignable to any other non Array based Collection type" do
754
- t = Puppet::Pops::Types::PTupleType.new()
919
+ context 'for Timespan such that' do
920
+ it 'Timespan is assignable to less constrained Timespan' do
921
+ t1 = PTimespanType.new('00:00:10', '00:00:20')
922
+ t2 = PTimespanType.new('00:00:11', '00:00:19')
923
+ expect(t2).to be_assignable_to(t1)
924
+ end
925
+
926
+ it 'Timespan is not assignable to more constrained Timespan' do
927
+ t1 = PTimespanType.new('00:00:10', '00:00:20')
928
+ t2 = PTimespanType.new('00:00:11', '00:00:19')
929
+ expect(t1).not_to be_assignable_to(t2)
930
+ end
931
+ end
932
+
933
+ context 'for Timestamp such that' do
934
+ it 'Timestamp is assignable to less constrained Timestamp' do
935
+ t1 = PTimestampType.new('2016-01-01', '2016-12-31')
936
+ t2 = PTimestampType.new('2016-02-01', '2016-11-30')
937
+ expect(t2).to be_assignable_to(t1)
938
+ end
939
+
940
+ it 'Timestamp is not assignable to more constrained Timestamp' do
941
+ t1 = PTimestampType.new('2016-01-01', '2016-12-31')
942
+ t2 = PTimestampType.new('2016-02-01', '2016-11-30')
943
+ expect(t1).not_to be_assignable_to(t2)
944
+ end
945
+ end
946
+
947
+ context 'for Tuple, such that' do
948
+ it 'Tuple is not assignable to any other non Array based Collection type' do
949
+ t = PTupleType::DEFAULT
755
950
  tested_types = collection_types - [
756
- Puppet::Pops::Types::PCollectionType,
757
- Puppet::Pops::Types::PTupleType,
758
- Puppet::Pops::Types::PArrayType]
759
- tested_types.each {|t2| expect(t).not_to be_assignable_to(t2.new) }
951
+ PCollectionType,
952
+ PTupleType,
953
+ PArrayType]
954
+ tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
955
+ end
956
+
957
+ it 'A tuple with parameters is assignable to the default Tuple' do
958
+ t = PTupleType::DEFAULT
959
+ t2 = PTupleType.new([PStringType::DEFAULT])
960
+ expect(t2).to be_assignable_to(t)
760
961
  end
761
962
 
762
963
  it 'Tuple is not assignable to any disjunct type' do
763
964
  tested_types = all_types - [
764
- Puppet::Pops::Types::PAnyType,
765
- Puppet::Pops::Types::PDataType] - collection_types
766
- t = Puppet::Pops::Types::PTupleType.new()
767
- tested_types.each {|t2| expect(t).not_to be_assignable_to(t2.new) }
965
+ PAnyType,
966
+ POptionalType,
967
+ PNotUndefType,
968
+ PIterableType,
969
+ PDataType] - collection_types
970
+ t = PTupleType::DEFAULT
971
+ tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
768
972
  end
769
973
  end
770
974
 
771
- context "for Struct, such that" do
772
- it "Struct is not assignable to any other non Hashed based Collection type" do
773
- t = Puppet::Pops::Types::PStructType.new()
975
+ context 'for Struct, such that' do
976
+ it 'Struct is not assignable to any other non Hashed based Collection type' do
977
+ t = PStructType::DEFAULT
774
978
  tested_types = collection_types - [
775
- Puppet::Pops::Types::PCollectionType,
776
- Puppet::Pops::Types::PStructType,
777
- Puppet::Pops::Types::PHashType]
778
- tested_types.each {|t2| expect(t).not_to be_assignable_to(t2.new) }
979
+ PCollectionType,
980
+ PStructType,
981
+ PHashType]
982
+ tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
779
983
  end
780
984
 
781
985
  it 'Struct is not assignable to any disjunct type' do
782
986
  tested_types = all_types - [
783
- Puppet::Pops::Types::PAnyType,
784
- Puppet::Pops::Types::PDataType] - collection_types
785
- t = Puppet::Pops::Types::PStructType.new()
786
- tested_types.each {|t2| expect(t).not_to be_assignable_to(t2.new) }
987
+ PAnyType,
988
+ POptionalType,
989
+ PNotUndefType,
990
+ PIterableType,
991
+ PDataType] - collection_types
992
+ t = PStructType::DEFAULT
993
+ tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
994
+ end
995
+
996
+ it 'Default key optionality is controlled by value assignability to undef' do
997
+ t1 = struct_t({'member' => string_t})
998
+ expect(t1.elements[0].key_type).to eq(string_t('member'))
999
+ t1 = struct_t({'member' => object_t})
1000
+ expect(t1.elements[0].key_type).to eq(optional_t(string_t('member')))
1001
+ end
1002
+
1003
+ it "NotUndef['key'] becomes String['key'] (since its implied that String is required)" do
1004
+ t1 = struct_t({not_undef_t('member') => string_t})
1005
+ expect(t1.elements[0].key_type).to eq(string_t('member'))
1006
+ end
1007
+
1008
+ it "Optional['key'] becomes Optional[String['key']]" do
1009
+ t1 = struct_t({optional_t('member') => string_t})
1010
+ expect(t1.elements[0].key_type).to eq(optional_t(string_t('member')))
1011
+ end
1012
+
1013
+ it 'Optional members are not required' do
1014
+ t1 = struct_t({optional_t('optional_member') => string_t, not_undef_t('other_member') => string_t})
1015
+ t2 = struct_t({not_undef_t('other_member') => string_t})
1016
+ expect(t2).to be_assignable_to(t1)
1017
+ end
1018
+
1019
+ it 'Required members not optional even when value is' do
1020
+ t1 = struct_t({not_undef_t('required_member') => object_t, not_undef_t('other_member') => string_t})
1021
+ t2 = struct_t({not_undef_t('other_member') => string_t})
1022
+ expect(t2).not_to be_assignable_to(t1)
1023
+ end
1024
+
1025
+ it 'A hash of string is not assignable to struct with integer value' do
1026
+ t1 = struct_t({'foo' => integer_t, 'bar' => string_t})
1027
+ t2 = hash_t(string_t, string_t, range_t(2, 2))
1028
+ expect(t1.assignable?(t2)).to eql(false)
1029
+ end
1030
+
1031
+ it 'A hash of with integer key is not assignable to struct with string key' do
1032
+ t1 = struct_t({'foo' => string_t, 'bar' => string_t})
1033
+ t2 = hash_t(integer_t, string_t, range_t(2, 2))
1034
+ expect(t1.assignable?(t2)).to eql(false)
787
1035
  end
788
1036
  end
789
1037
 
790
- context "for Callable, such that" do
791
- it "Callable is not assignable to any disjunct type" do
792
- t = Puppet::Pops::Types::PCallableType.new()
1038
+ context 'for Callable, such that' do
1039
+ it 'Callable is not assignable to any disjunct type' do
1040
+ t = PCallableType::DEFAULT
793
1041
  tested_types = all_types - [
794
- Puppet::Pops::Types::PCallableType,
795
- Puppet::Pops::Types::PAnyType]
796
- tested_types.each {|t2| expect(t).not_to be_assignable_to(t2.new) }
1042
+ PCallableType,
1043
+ PAnyType,
1044
+ POptionalType,
1045
+ PNotUndefType]
1046
+ tested_types.each {|t2| expect(t).to_not be_assignable_to(t2::DEFAULT) }
1047
+ end
1048
+
1049
+ it 'a callable with parameter is assignable to the default callable' do
1050
+ expect(callable_t(string_t)).to be_assignable_to(PCallableType::DEFAULT)
1051
+ end
1052
+
1053
+ it 'the default callable is not assignable to a callable with parameter' do
1054
+ expect(PCallableType::DEFAULT).not_to be_assignable_to(callable_t(string_t))
1055
+ end
1056
+
1057
+ it 'a callable with a return type is assignable to the default callable' do
1058
+ expect(callable_t([], string_t)).to be_assignable_to(PCallableType::DEFAULT)
1059
+ end
1060
+
1061
+ it 'the default callable is not assignable to a callable with a return type' do
1062
+ expect(PCallableType::DEFAULT).not_to be_assignable_to(callable_t([],string_t))
1063
+ end
1064
+
1065
+ it 'a callable with a return type Any is assignable to the default callable' do
1066
+ expect(callable_t([], object_t)).to be_assignable_to(PCallableType::DEFAULT)
1067
+ end
1068
+
1069
+ it 'a callable with a return type Any is equal to a callable with the same parameters and no return type' do
1070
+ expect(callable_t([string_t], object_t)).to eql(callable_t(string_t))
1071
+ end
1072
+
1073
+ it 'a callable with a return type different than Any is not equal to a callable with the same parameters and no return type' do
1074
+ expect(callable_t([string_t], string_t)).not_to eql(callable_t(string_t))
1075
+ end
1076
+
1077
+ it 'a callable with a return type is assignable from another callable with an assignable return type' do
1078
+ expect(callable_t([], string_t)).to be_assignable_to(callable_t([], PScalarType::DEFAULT))
1079
+ end
1080
+
1081
+ it 'a callable with a return type is not assignable from another callable unless the return type is assignable' do
1082
+ expect(callable_t([], string_t)).not_to be_assignable_to(callable_t([], integer_t))
797
1083
  end
798
1084
  end
799
1085
 
800
1086
  it 'should recognize mapped ruby types' do
801
- { Integer => Puppet::Pops::Types::PIntegerType.new,
802
- Fixnum => Puppet::Pops::Types::PIntegerType.new,
803
- Bignum => Puppet::Pops::Types::PIntegerType.new,
804
- Float => Puppet::Pops::Types::PFloatType.new,
805
- Numeric => Puppet::Pops::Types::PNumericType.new,
806
- NilClass => Puppet::Pops::Types::PUndefType.new,
807
- TrueClass => Puppet::Pops::Types::PBooleanType.new,
808
- FalseClass => Puppet::Pops::Types::PBooleanType.new,
809
- String => Puppet::Pops::Types::PStringType.new,
810
- Regexp => Puppet::Pops::Types::PRegexpType.new,
811
- Regexp => Puppet::Pops::Types::PRegexpType.new,
812
- Array => Puppet::Pops::Types::TypeFactory.array_of_data(),
813
- Hash => Puppet::Pops::Types::TypeFactory.hash_of_data()
1087
+ { Integer => PIntegerType::DEFAULT,
1088
+ Fixnum => PIntegerType::DEFAULT,
1089
+ Bignum => PIntegerType::DEFAULT,
1090
+ Float => PFloatType::DEFAULT,
1091
+ Numeric => PNumericType::DEFAULT,
1092
+ NilClass => PUndefType::DEFAULT,
1093
+ TrueClass => PBooleanType::DEFAULT,
1094
+ FalseClass => PBooleanType::DEFAULT,
1095
+ String => PStringType::DEFAULT,
1096
+ Regexp => PRegexpType::DEFAULT,
1097
+ Regexp => PRegexpType::DEFAULT,
1098
+ Array => TypeFactory.array_of_data,
1099
+ Hash => TypeFactory.hash_of_data
814
1100
  }.each do |ruby_type, puppet_type |
815
1101
  expect(ruby_type).to be_assignable_to(puppet_type)
816
1102
  end
@@ -821,35 +1107,18 @@ describe 'The type calculator' do
821
1107
  expect(calculator.assignable?(range_t(2,5), range_t(2,5))).to eq(true)
822
1108
  end
823
1109
 
824
- it 'should accept an equal reverse range' do
825
- expect(calculator.assignable?(range_t(2,5), range_t(5,2))).to eq(true)
826
- end
827
-
828
1110
  it 'should accept a narrower range' do
829
1111
  expect(calculator.assignable?(range_t(2,10), range_t(3,5))).to eq(true)
830
1112
  end
831
1113
 
832
- it 'should accept a narrower reverse range' do
833
- expect(calculator.assignable?(range_t(2,10), range_t(5,3))).to eq(true)
834
- end
835
-
836
1114
  it 'should reject a wider range' do
837
1115
  expect(calculator.assignable?(range_t(3,5), range_t(2,10))).to eq(false)
838
1116
  end
839
1117
 
840
- it 'should reject a wider reverse range' do
841
- expect(calculator.assignable?(range_t(3,5), range_t(10,2))).to eq(false)
842
- end
843
-
844
1118
  it 'should reject a partially overlapping range' do
845
1119
  expect(calculator.assignable?(range_t(3,5), range_t(2,4))).to eq(false)
846
1120
  expect(calculator.assignable?(range_t(3,5), range_t(4,6))).to eq(false)
847
1121
  end
848
-
849
- it 'should reject a partially overlapping reverse range' do
850
- expect(calculator.assignable?(range_t(3,5), range_t(4,2))).to eq(false)
851
- expect(calculator.assignable?(range_t(3,5), range_t(6,4))).to eq(false)
852
- end
853
1122
  end
854
1123
 
855
1124
  context 'when dealing with patterns' do
@@ -885,7 +1154,7 @@ describe 'The type calculator' do
885
1154
 
886
1155
  it 'should accept multiple strings if they all match any patterns' do
887
1156
  p_t = pattern_t('X', 'Y', 'abc')
888
- p_s = string_t('Xa', 'aY', 'abc')
1157
+ p_s = enum_t('Xa', 'aY', 'abc')
889
1158
  expect(calculator.assignable?(p_t, p_s)).to eq(true)
890
1159
  end
891
1160
 
@@ -897,7 +1166,7 @@ describe 'The type calculator' do
897
1166
 
898
1167
  it 'should reject multiple strings if not all match any patterns' do
899
1168
  p_t = pattern_t('abc', 'ab', 'c', 'q')
900
- p_s = string_t('X', 'Y', 'Z')
1169
+ p_s = enum_t('X', 'Y', 'Z')
901
1170
  expect(calculator.assignable?(p_t, p_s)).to eq(false)
902
1171
  end
903
1172
 
@@ -913,18 +1182,18 @@ describe 'The type calculator' do
913
1182
  end
914
1183
 
915
1184
  it 'pattern representing all patterns should accept any pattern' do
916
- expect(calculator.assignable?(pattern_t(), pattern_t('a'))).to eq(true)
917
- expect(calculator.assignable?(pattern_t(), pattern_t())).to eq(true)
1185
+ expect(calculator.assignable?(pattern_t, pattern_t('a'))).to eq(true)
1186
+ expect(calculator.assignable?(pattern_t, pattern_t)).to eq(true)
918
1187
  end
919
1188
 
920
1189
  it 'pattern representing all patterns should accept any enum' do
921
- expect(calculator.assignable?(pattern_t(), enum_t('a'))).to eq(true)
922
- expect(calculator.assignable?(pattern_t(), enum_t())).to eq(true)
1190
+ expect(calculator.assignable?(pattern_t, enum_t('a'))).to eq(true)
1191
+ expect(calculator.assignable?(pattern_t, enum_t)).to eq(true)
923
1192
  end
924
1193
 
925
1194
  it 'pattern representing all patterns should accept any string' do
926
- expect(calculator.assignable?(pattern_t(), string_t('a'))).to eq(true)
927
- expect(calculator.assignable?(pattern_t(), string_t())).to eq(true)
1195
+ expect(calculator.assignable?(pattern_t, string_t('a'))).to eq(true)
1196
+ expect(calculator.assignable?(pattern_t, string_t)).to eq(true)
928
1197
  end
929
1198
 
930
1199
  end
@@ -943,8 +1212,8 @@ describe 'The type calculator' do
943
1212
  end
944
1213
 
945
1214
  it 'non parameterized enum accepts any other enum but not the reverse' do
946
- expect(calculator.assignable?(enum_t(), enum_t('a'))).to eq(true)
947
- expect(calculator.assignable?(enum_t('a'), enum_t())).to eq(false)
1215
+ expect(calculator.assignable?(enum_t, enum_t('a'))).to eq(true)
1216
+ expect(calculator.assignable?(enum_t('a'), enum_t)).to eq(false)
948
1217
  end
949
1218
 
950
1219
  it 'enum should accept a variant where all variants are acceptable' do
@@ -955,54 +1224,53 @@ describe 'The type calculator' do
955
1224
 
956
1225
  context 'when dealing with string and enum combinations' do
957
1226
  it 'should accept assigning any enum to unrestricted string' do
958
- expect(calculator.assignable?(string_t(), enum_t('blue'))).to eq(true)
959
- expect(calculator.assignable?(string_t(), enum_t('blue', 'red'))).to eq(true)
1227
+ expect(calculator.assignable?(string_t, enum_t('blue'))).to eq(true)
1228
+ expect(calculator.assignable?(string_t, enum_t('blue', 'red'))).to eq(true)
960
1229
  end
961
1230
 
962
1231
  it 'should not accept assigning longer enum value to size restricted string' do
963
- expect(calculator.assignable?(constrained_t(string_t(),2,2), enum_t('a','blue'))).to eq(false)
1232
+ expect(calculator.assignable?(constrained_string_t(range_t(2,2)), enum_t('a','blue'))).to eq(false)
964
1233
  end
965
1234
 
966
1235
  it 'should accept assigning any string to empty enum' do
967
- expect(calculator.assignable?(enum_t(), string_t())).to eq(true)
1236
+ expect(calculator.assignable?(enum_t, string_t)).to eq(true)
968
1237
  end
969
1238
 
970
1239
  it 'should accept assigning empty enum to any string' do
971
- expect(calculator.assignable?(string_t(), enum_t())).to eq(true)
1240
+ expect(calculator.assignable?(string_t, enum_t)).to eq(true)
972
1241
  end
973
1242
 
974
1243
  it 'should not accept assigning empty enum to size constrained string' do
975
- expect(calculator.assignable?(constrained_t(string_t(),2,2), enum_t())).to eq(false)
1244
+ expect(calculator.assignable?(constrained_string_t(range_t(2,2)), enum_t)).to eq(false)
976
1245
  end
977
1246
  end
978
1247
 
979
1248
  context 'when dealing with string/pattern/enum combinations' do
980
1249
  it 'any string is equal to any enum is equal to any pattern' do
981
- expect(calculator.assignable?(string_t(), enum_t())).to eq(true)
982
- expect(calculator.assignable?(string_t(), pattern_t())).to eq(true)
983
- expect(calculator.assignable?(enum_t(), string_t())).to eq(true)
984
- expect(calculator.assignable?(enum_t(), pattern_t())).to eq(true)
985
- expect(calculator.assignable?(pattern_t(), string_t())).to eq(true)
986
- expect(calculator.assignable?(pattern_t(), enum_t())).to eq(true)
1250
+ expect(calculator.assignable?(string_t, enum_t)).to eq(true)
1251
+ expect(calculator.assignable?(string_t, pattern_t)).to eq(true)
1252
+ expect(calculator.assignable?(enum_t, string_t)).to eq(true)
1253
+ expect(calculator.assignable?(enum_t, pattern_t)).to eq(true)
1254
+ expect(calculator.assignable?(pattern_t, string_t)).to eq(true)
1255
+ expect(calculator.assignable?(pattern_t, enum_t)).to eq(true)
987
1256
  end
988
1257
  end
989
1258
 
990
1259
  context 'when dealing with tuples' do
991
1260
  it 'matches empty tuples' do
992
- tuple1 = tuple_t()
993
- tuple2 = tuple_t()
1261
+ tuple1 = tuple_t
1262
+ tuple2 = tuple_t
994
1263
 
995
1264
  expect(calculator.assignable?(tuple1, tuple2)).to eq(true)
996
1265
  expect(calculator.assignable?(tuple2, tuple1)).to eq(true)
997
1266
  end
998
1267
 
999
1268
  it 'accepts an empty tuple as assignable to a tuple with a min size of 0' do
1000
- tuple1 = tuple_t(Object)
1001
- factory.constrain_size(tuple1, 0, :default)
1269
+ tuple1 = constrained_tuple_t(range_t(0, :default))
1002
1270
  tuple2 = tuple_t()
1003
1271
 
1004
1272
  expect(calculator.assignable?(tuple1, tuple2)).to eq(true)
1005
- expect(calculator.assignable?(tuple2, tuple1)).to eq(false)
1273
+ expect(calculator.assignable?(tuple2, tuple1)).to eq(true)
1006
1274
  end
1007
1275
 
1008
1276
  it 'should accept matching tuples' do
@@ -1020,62 +1288,51 @@ describe 'The type calculator' do
1020
1288
  end
1021
1289
 
1022
1290
  it 'should accept ranged tuples' do
1023
- tuple1 = tuple_t(1)
1024
- factory.constrain_size(tuple1, 5, 5)
1291
+ tuple1 = constrained_tuple_t(range_t(5,5), 1)
1025
1292
  tuple2 = tuple_t(Integer,Integer, Integer, Integer, Integer)
1026
1293
  expect(calculator.assignable?(tuple1, tuple2)).to eq(true)
1027
1294
  expect(calculator.assignable?(tuple2, tuple1)).to eq(true)
1028
1295
  end
1029
1296
 
1030
1297
  it 'should reject ranged tuples when ranges does not match' do
1031
- tuple1 = tuple_t(1)
1032
- factory.constrain_size(tuple1, 4, 5)
1298
+ tuple1 = constrained_tuple_t(range_t(4, 5), 1)
1033
1299
  tuple2 = tuple_t(Integer,Integer, Integer, Integer, Integer)
1034
1300
  expect(calculator.assignable?(tuple1, tuple2)).to eq(true)
1035
1301
  expect(calculator.assignable?(tuple2, tuple1)).to eq(false)
1036
1302
  end
1037
1303
 
1038
1304
  it 'should reject ranged tuples when ranges does not match (using infinite upper bound)' do
1039
- tuple1 = tuple_t(1)
1040
- factory.constrain_size(tuple1, 4, :default)
1305
+ tuple1 = constrained_tuple_t(range_t(4, :default), 1)
1041
1306
  tuple2 = tuple_t(Integer,Integer, Integer, Integer, Integer)
1042
1307
  expect(calculator.assignable?(tuple1, tuple2)).to eq(true)
1043
1308
  expect(calculator.assignable?(tuple2, tuple1)).to eq(false)
1044
1309
  end
1045
1310
 
1046
1311
  it 'should accept matching tuples with optional entries by repeating last' do
1047
- tuple1 = tuple_t(1,2)
1048
- factory.constrain_size(tuple1, 0, :default)
1049
- tuple2 = tuple_t(Numeric,Numeric)
1050
- factory.constrain_size(tuple2, 0, :default)
1312
+ tuple1 = constrained_tuple_t(range_t(0, :default), 1,2)
1313
+ tuple2 = constrained_tuple_t(range_t(0, :default), Numeric,Numeric)
1051
1314
  expect(calculator.assignable?(tuple1, tuple2)).to eq(false)
1052
1315
  expect(calculator.assignable?(tuple2, tuple1)).to eq(true)
1053
1316
  end
1054
1317
 
1055
1318
  it 'should accept matching tuples with optional entries' do
1056
- tuple1 = tuple_t(Integer, Integer, String)
1057
- factory.constrain_size(tuple1, 1, 3)
1058
- array2 = factory.constrain_size(array_t(Integer),2,2)
1319
+ tuple1 = constrained_tuple_t(range_t(1, 3), Integer, Integer, String)
1320
+ array2 = array_t(Integer, range_t(2,2))
1059
1321
  expect(calculator.assignable?(tuple1, array2)).to eq(true)
1060
- factory.constrain_size(tuple1, 3, 3)
1322
+ tuple1 = constrained_tuple_t(range_t(3, 3), tuple1.types)
1061
1323
  expect(calculator.assignable?(tuple1, array2)).to eq(false)
1062
1324
  end
1063
1325
 
1064
1326
  it 'should accept matching array' do
1065
1327
  tuple1 = tuple_t(1,2)
1066
- array = array_t(Integer)
1067
- factory.constrain_size(array, 2, 2)
1328
+ array = array_t(Integer, range_t(2, 2))
1068
1329
  expect(calculator.assignable?(tuple1, array)).to eq(true)
1069
1330
  expect(calculator.assignable?(array, tuple1)).to eq(true)
1070
1331
  end
1071
1332
 
1072
1333
  it 'should accept empty array when tuple allows min of 0' do
1073
- tuple1 = tuple_t(Integer)
1074
- factory.constrain_size(tuple1, 0, 1)
1075
-
1076
- array = array_t(Integer)
1077
- factory.constrain_size(array, 0, 0)
1078
-
1334
+ tuple1 = constrained_tuple_t(range_t(0, 1), Integer)
1335
+ array = array_t(unit_t, range_t(0, 0))
1079
1336
  expect(calculator.assignable?(tuple1, array)).to eq(true)
1080
1337
  expect(calculator.assignable?(array, tuple1)).to eq(false)
1081
1338
  end
@@ -1122,18 +1379,15 @@ describe 'The type calculator' do
1122
1379
 
1123
1380
  it 'should accept matching hash' do
1124
1381
  struct1 = struct_t({'a'=>Integer, 'b'=>Integer})
1125
- non_empty_string = string_t()
1126
- non_empty_string.size_type = range_t(1, nil)
1127
- hsh = hash_t(non_empty_string, Integer)
1128
- factory.constrain_size(hsh, 2, 2)
1382
+ non_empty_string = constrained_string_t(range_t(1, nil))
1383
+ hsh = hash_t(non_empty_string, Integer, range_t(2,2))
1129
1384
  expect(calculator.assignable?(struct1, hsh)).to eq(true)
1130
1385
  expect(calculator.assignable?(hsh, struct1)).to eq(true)
1131
1386
  end
1132
1387
 
1133
- it 'should accept empty hash with key_type undef' do
1388
+ it 'should accept empty hash with key_type unit' do
1134
1389
  struct1 = struct_t({'a'=>optional_t(Integer)})
1135
- hsh = hash_t(undef_t, undef_t)
1136
- factory.constrain_size(hsh, 0, 0)
1390
+ hsh = hash_t(unit_t, unit_t, range_t(0, 0))
1137
1391
  expect(calculator.assignable?(struct1, hsh)).to eq(true)
1138
1392
  end
1139
1393
  end
@@ -1158,107 +1412,225 @@ describe 'The type calculator' do
1158
1412
  expect(calculator.assignable?(Bar, fooType)).to eq(false)
1159
1413
  end
1160
1414
 
1161
- it "should allow host class with same name" do
1162
- hc1 = Puppet::Pops::Types::TypeFactory.host_class('the_name')
1163
- hc2 = Puppet::Pops::Types::TypeFactory.host_class('the_name')
1415
+ it 'should allow host class with same name' do
1416
+ hc1 = TypeFactory.host_class('the_name')
1417
+ hc2 = TypeFactory.host_class('the_name')
1164
1418
  expect(calculator.assignable?(hc1, hc2)).to eq(true)
1165
1419
  end
1166
1420
 
1167
- it "should allow host class with name assigned to hostclass without name" do
1168
- hc1 = Puppet::Pops::Types::TypeFactory.host_class()
1169
- hc2 = Puppet::Pops::Types::TypeFactory.host_class('the_name')
1421
+ it 'should allow host class with name assigned to hostclass without name' do
1422
+ hc1 = TypeFactory.host_class
1423
+ hc2 = TypeFactory.host_class('the_name')
1170
1424
  expect(calculator.assignable?(hc1, hc2)).to eq(true)
1171
1425
  end
1172
1426
 
1173
- it "should reject host classes with different names" do
1174
- hc1 = Puppet::Pops::Types::TypeFactory.host_class('the_name')
1175
- hc2 = Puppet::Pops::Types::TypeFactory.host_class('another_name')
1427
+ it 'should reject host classes with different names' do
1428
+ hc1 = TypeFactory.host_class('the_name')
1429
+ hc2 = TypeFactory.host_class('another_name')
1176
1430
  expect(calculator.assignable?(hc1, hc2)).to eq(false)
1177
1431
  end
1178
1432
 
1179
- it "should reject host classes without name assigned to host class with name" do
1180
- hc1 = Puppet::Pops::Types::TypeFactory.host_class('the_name')
1181
- hc2 = Puppet::Pops::Types::TypeFactory.host_class()
1433
+ it 'should reject host classes without name assigned to host class with name' do
1434
+ hc1 = TypeFactory.host_class('the_name')
1435
+ hc2 = TypeFactory.host_class
1182
1436
  expect(calculator.assignable?(hc1, hc2)).to eq(false)
1183
1437
  end
1184
1438
 
1185
- it "should allow resource with same type_name and title" do
1186
- r1 = Puppet::Pops::Types::TypeFactory.resource('file', 'foo')
1187
- r2 = Puppet::Pops::Types::TypeFactory.resource('file', 'foo')
1439
+ it 'should allow resource with same type_name and title' do
1440
+ r1 = TypeFactory.resource('file', 'foo')
1441
+ r2 = TypeFactory.resource('file', 'foo')
1188
1442
  expect(calculator.assignable?(r1, r2)).to eq(true)
1189
1443
  end
1190
1444
 
1191
- it "should allow more specific resource assignment" do
1192
- r1 = Puppet::Pops::Types::TypeFactory.resource()
1193
- r2 = Puppet::Pops::Types::TypeFactory.resource('file')
1445
+ it 'should allow more specific resource assignment' do
1446
+ r1 = TypeFactory.resource
1447
+ r2 = TypeFactory.resource('file')
1194
1448
  expect(calculator.assignable?(r1, r2)).to eq(true)
1195
- r2 = Puppet::Pops::Types::TypeFactory.resource('file', '/tmp/foo')
1449
+ r2 = TypeFactory.resource('file', '/tmp/foo')
1196
1450
  expect(calculator.assignable?(r1, r2)).to eq(true)
1197
- r1 = Puppet::Pops::Types::TypeFactory.resource('file')
1451
+ r1 = TypeFactory.resource('file')
1198
1452
  expect(calculator.assignable?(r1, r2)).to eq(true)
1199
1453
  end
1200
1454
 
1201
- it "should reject less specific resource assignment" do
1202
- r1 = Puppet::Pops::Types::TypeFactory.resource('file', '/tmp/foo')
1203
- r2 = Puppet::Pops::Types::TypeFactory.resource('file')
1455
+ it 'should reject less specific resource assignment' do
1456
+ r1 = TypeFactory.resource('file', '/tmp/foo')
1457
+ r2 = TypeFactory.resource('file')
1204
1458
  expect(calculator.assignable?(r1, r2)).to eq(false)
1205
- r2 = Puppet::Pops::Types::TypeFactory.resource()
1459
+ r2 = TypeFactory.resource
1206
1460
  expect(calculator.assignable?(r1, r2)).to eq(false)
1207
1461
  end
1208
1462
 
1463
+ context 'for TypeAlias, such that' do
1464
+ let!(:parser) { TypeParser.singleton }
1465
+
1466
+ it 'it is assignable to the type that it is an alias for' do
1467
+ t = type_alias_t('Alias', 'Integer').resolve(parser, nil)
1468
+ expect(calculator.assignable?(integer_t, t)).to be_truthy
1469
+ end
1470
+
1471
+ it 'the type that it is an alias for is assignable to it' do
1472
+ t = type_alias_t('Alias', 'Integer').resolve(parser, nil)
1473
+ expect(calculator.assignable?(t, integer_t)).to be_truthy
1474
+ end
1475
+
1476
+ it 'a recursive alias can be assignable from a conformant type with any depth' do
1477
+ scope = Object.new
1478
+
1479
+ t = type_alias_t('Tree', 'Hash[String,Variant[String,Tree]]')
1480
+ loader = Object.new
1481
+ loader.expects(:load).with(:type, 'tree').returns t
1482
+
1483
+ Adapters::LoaderAdapter.expects(:loader_for_model_object).at_least_once.returns loader
1484
+
1485
+ t.resolve(parser, scope)
1486
+ expect(calculator.assignable?(t, parser.parse('Hash[String,Variant[String,Hash[String,Variant[String,String]]]]'))).to be_truthy
1487
+ end
1488
+
1489
+
1490
+ it 'similar recursive aliases are assignable' do
1491
+ scope = Object.new
1492
+
1493
+ t1 = type_alias_t('Tree1', 'Hash[String,Variant[String,Tree1]]')
1494
+ t2 = type_alias_t('Tree2', 'Hash[String,Variant[String,Tree2]]')
1495
+ loader = Object.new
1496
+ loader.expects(:load).with(:type, 'tree1').returns t1
1497
+ loader.expects(:load).with(:type, 'tree2').returns t2
1498
+
1499
+ Adapters::LoaderAdapter.expects(:loader_for_model_object).at_least_once.returns loader
1500
+
1501
+ t1.resolve(parser, scope)
1502
+ t2.resolve(parser, scope)
1503
+ expect(calculator.assignable?(t1, t2)).to be_truthy
1504
+ end
1505
+
1506
+ it 'crossing recursive aliases are assignable' do
1507
+ t1 = type_alias_t('Tree1', 'Hash[String,Variant[String,Tree2]]')
1508
+ t2 = type_alias_t('Tree2', 'Hash[String,Variant[String,Tree1]]')
1509
+ loader = Object.new
1510
+ loader.expects(:load).with(:type, 'tree1').returns t1
1511
+ loader.expects(:load).with(:type, 'tree2').returns t2
1512
+
1513
+ Adapters::LoaderAdapter.expects(:loader_for_model_object).at_least_once.returns loader
1514
+
1515
+ t1.resolve(parser, loader)
1516
+ t2.resolve(parser, loader)
1517
+ expect(calculator.assignable?(t1, t2)).to be_truthy
1518
+ end
1519
+
1520
+ it 'Type[T] is assignable to Type[AT] when AT is an alias for T' do
1521
+ scope = Object.new
1522
+
1523
+ ta = type_alias_t('PositiveInteger', 'Integer[0,default]')
1524
+ loader = Object.new
1525
+ loader.expects(:load).with(:type, 'positiveinteger').returns ta
1526
+ Adapters::LoaderAdapter.expects(:loader_for_model_object).at_least_once.returns loader
1527
+
1528
+ t1 = type_t(range_t(0, :default))
1529
+ t2 = parser.parse('Type[PositiveInteger]', scope)
1530
+ expect(calculator.assignable?(t2, t1)).to be_truthy
1531
+ end
1532
+
1533
+ it 'Type[T] is assignable to AT when AT is an alias for Type[T]' do
1534
+ scope = Object.new
1535
+
1536
+ ta = type_alias_t('PositiveIntegerType', 'Type[Integer[0,default]]')
1537
+ loader = Object.new
1538
+ loader.expects(:load).with(:type, 'positiveintegertype').returns ta
1539
+ Adapters::LoaderAdapter.expects(:loader_for_model_object).at_least_once.returns loader
1540
+
1541
+ t1 = type_t(range_t(0, :default))
1542
+ t2 = parser.parse('PositiveIntegerType', scope)
1543
+ expect(calculator.assignable?(t2, t1)).to be_truthy
1544
+ end
1545
+
1546
+ it 'Type[Type[T]] is assignable to Type[Type[AT]] when AT is an alias for T' do
1547
+ scope = Object.new
1548
+
1549
+ ta = type_alias_t('PositiveInteger', 'Integer[0,default]')
1550
+ loader = Object.new
1551
+ loader.expects(:load).with(:type, 'positiveinteger').returns ta
1552
+ Adapters::LoaderAdapter.expects(:loader_for_model_object).at_least_once.returns loader
1553
+
1554
+ t1 = type_t(type_t(range_t(0, :default)))
1555
+ t2 = parser.parse('Type[Type[PositiveInteger]]', scope)
1556
+ expect(calculator.assignable?(t2, t1)).to be_truthy
1557
+ end
1558
+
1559
+ it 'Type[Type[T]] is assignable to Type[AT] when AT is an alias for Type[T]' do
1560
+ scope = Object.new
1561
+
1562
+ ta = type_alias_t('PositiveIntegerType', 'Type[Integer[0,default]]')
1563
+ loader = Object.new
1564
+ loader.expects(:load).with(:type, 'positiveintegertype').returns ta
1565
+ Adapters::LoaderAdapter.expects(:loader_for_model_object).at_least_once.returns loader
1566
+
1567
+ t1 = type_t(type_t(range_t(0, :default)))
1568
+ t2 = parser.parse('Type[PositiveIntegerType]', scope)
1569
+ expect(calculator.assignable?(t2, t1)).to be_truthy
1570
+ end
1571
+ end
1209
1572
  end
1210
1573
 
1211
1574
  context 'when testing if x is instance of type t' do
1212
- include_context "types_setup"
1575
+ include_context 'types_setup'
1213
1576
 
1214
1577
  it 'should consider undef to be instance of Any, NilType, and optional' do
1215
- expect(calculator.instance?(Puppet::Pops::Types::PUndefType.new(), nil)).to eq(true)
1216
- expect(calculator.instance?(Puppet::Pops::Types::PAnyType.new(), nil)).to eq(true)
1217
- expect(calculator.instance?(Puppet::Pops::Types::POptionalType.new(), nil)).to eq(true)
1578
+ expect(calculator.instance?(PUndefType::DEFAULT, nil)).to eq(true)
1579
+ expect(calculator.instance?(PAnyType::DEFAULT, nil)).to eq(true)
1580
+ expect(calculator.instance?(POptionalType::DEFAULT, nil)).to eq(true)
1218
1581
  end
1219
1582
 
1220
1583
  it 'all types should be (ruby) instance of PAnyType' do
1221
1584
  all_types.each do |t|
1222
- expect(t.new.is_a?(Puppet::Pops::Types::PAnyType)).to eq(true)
1585
+ expect(t::DEFAULT.is_a?(PAnyType)).to eq(true)
1223
1586
  end
1224
1587
  end
1225
1588
 
1226
- it "should consider :undef to be instance of Runtime['ruby', 'Symbol]" do
1227
- expect(calculator.instance?(Puppet::Pops::Types::PRuntimeType.new(:runtime => :ruby, :runtime_type_name => 'Symbol'), :undef)).to eq(true)
1589
+ it "should infer :undef to be Undef" do
1590
+ expect(calculator.infer(:undef)).to be_assignable_to(undef_t)
1591
+ end
1592
+
1593
+ it "should not consider :default to be instance of Runtime['ruby', 'Symbol]" do
1594
+ expect(calculator.instance?(PRuntimeType.new(:ruby, 'Symbol'), :default)).to eq(false)
1595
+ end
1596
+
1597
+ it "should not consider :undef to be instance of Runtime['ruby', 'Symbol]" do
1598
+ expect(calculator.instance?(PRuntimeType.new(:ruby, 'Symbol'), :undef)).to eq(false)
1228
1599
  end
1229
1600
 
1230
- it "should consider :undef to be instance of an Optional type" do
1231
- expect(calculator.instance?(Puppet::Pops::Types::POptionalType.new(), :undef)).to eq(true)
1601
+ it 'should consider :undef to be instance of an Optional type' do
1602
+ expect(calculator.instance?(POptionalType::DEFAULT, :undef)).to eq(true)
1232
1603
  end
1233
1604
 
1234
- it 'should not consider undef to be an instance of any other type than Any, NilType and Data' do
1605
+ it 'should not consider undef to be an instance of any other type than Any, UndefType and Data' do
1235
1606
  types_to_test = all_types - [
1236
- Puppet::Pops::Types::PAnyType,
1237
- Puppet::Pops::Types::PUndefType,
1238
- Puppet::Pops::Types::PDataType,
1239
- Puppet::Pops::Types::POptionalType,
1607
+ PAnyType,
1608
+ PUndefType,
1609
+ PDataType,
1610
+ POptionalType,
1240
1611
  ]
1241
1612
 
1242
- types_to_test.each {|t| expect(calculator.instance?(t.new, nil)).to eq(false) }
1243
- types_to_test.each {|t| expect(calculator.instance?(t.new, :undef)).to eq(false) }
1613
+ types_to_test.each {|t| expect(calculator.instance?(t::DEFAULT, nil)).to eq(false) }
1614
+ types_to_test.each {|t| expect(calculator.instance?(t::DEFAULT, :undef)).to eq(false) }
1244
1615
  end
1245
1616
 
1246
1617
  it 'should consider default to be instance of Default and Any' do
1247
- expect(calculator.instance?(Puppet::Pops::Types::PDefaultType.new(), :default)).to eq(true)
1248
- expect(calculator.instance?(Puppet::Pops::Types::PAnyType.new(), :default)).to eq(true)
1618
+ expect(calculator.instance?(PDefaultType::DEFAULT, :default)).to eq(true)
1619
+ expect(calculator.instance?(PAnyType::DEFAULT, :default)).to eq(true)
1249
1620
  end
1250
1621
 
1251
- it 'should not consider "default" to be an instance of anything but Default, and Any' do
1622
+ it 'should not consider "default" to be an instance of anything but Default, NotUndef, and Any' do
1252
1623
  types_to_test = all_types - [
1253
- Puppet::Pops::Types::PAnyType,
1254
- Puppet::Pops::Types::PDefaultType,
1624
+ PAnyType,
1625
+ PNotUndefType,
1626
+ PDefaultType,
1255
1627
  ]
1256
1628
 
1257
- types_to_test.each {|t| expect(calculator.instance?(t.new, :default)).to eq(false) }
1629
+ types_to_test.each {|t| expect(calculator.instance?(t::DEFAULT, :default)).to eq(false) }
1258
1630
  end
1259
1631
 
1260
1632
  it 'should consider fixnum instanceof PIntegerType' do
1261
- expect(calculator.instance?(Puppet::Pops::Types::PIntegerType.new(), 1)).to eq(true)
1633
+ expect(calculator.instance?(PIntegerType::DEFAULT, 1)).to eq(true)
1262
1634
  end
1263
1635
 
1264
1636
  it 'should consider fixnum instanceof Fixnum' do
@@ -1274,15 +1646,21 @@ describe 'The type calculator' do
1274
1646
  end
1275
1647
 
1276
1648
  it 'should consider string in length range' do
1277
- range = factory.constrain_size(string_t, 1,3)
1649
+ range = constrained_string_t(range_t(1,3))
1278
1650
  expect(calculator.instance?(range, 'a')).to eq(true)
1279
1651
  expect(calculator.instance?(range, 'abc')).to eq(true)
1280
1652
  expect(calculator.instance?(range, '')).to eq(false)
1281
1653
  expect(calculator.instance?(range, 'abcd')).to eq(false)
1282
1654
  end
1283
1655
 
1656
+ it 'should consider string values' do
1657
+ string = string_t('a')
1658
+ expect(calculator.instance?(string, 'a')).to eq(true)
1659
+ expect(calculator.instance?(string, 'c')).to eq(false)
1660
+ end
1661
+
1284
1662
  it 'should consider array in length range' do
1285
- range = factory.constrain_size(array_t(integer_t), 1,3)
1663
+ range = array_t(integer_t, range_t(1,3))
1286
1664
  expect(calculator.instance?(range, [1])).to eq(true)
1287
1665
  expect(calculator.instance?(range, [1,2,3])).to eq(true)
1288
1666
  expect(calculator.instance?(range, [])).to eq(false)
@@ -1290,7 +1668,7 @@ describe 'The type calculator' do
1290
1668
  end
1291
1669
 
1292
1670
  it 'should consider hash in length range' do
1293
- range = factory.constrain_size(hash_t(integer_t, integer_t), 1,2)
1671
+ range = hash_t(integer_t, integer_t, range_t(1,2))
1294
1672
  expect(calculator.instance?(range, {1=>1})).to eq(true)
1295
1673
  expect(calculator.instance?(range, {1=>1, 2=>2})).to eq(true)
1296
1674
  expect(calculator.instance?(range, {})).to eq(false)
@@ -1298,7 +1676,7 @@ describe 'The type calculator' do
1298
1676
  end
1299
1677
 
1300
1678
  it 'should consider collection in length range for array ' do
1301
- range = factory.constrain_size(collection_t, 1,3)
1679
+ range = collection_t(range_t(1,3))
1302
1680
  expect(calculator.instance?(range, [1])).to eq(true)
1303
1681
  expect(calculator.instance?(range, [1,2,3])).to eq(true)
1304
1682
  expect(calculator.instance?(range, [])).to eq(false)
@@ -1306,7 +1684,7 @@ describe 'The type calculator' do
1306
1684
  end
1307
1685
 
1308
1686
  it 'should consider collection in length range for hash' do
1309
- range = factory.constrain_size(collection_t, 1,2)
1687
+ range = collection_t(range_t(1,2))
1310
1688
  expect(calculator.instance?(range, {1=>1})).to eq(true)
1311
1689
  expect(calculator.instance?(range, {1=>1, 2=>2})).to eq(true)
1312
1690
  expect(calculator.instance?(range, {})).to eq(false)
@@ -1380,6 +1758,26 @@ describe 'The type calculator' do
1380
1758
  struct = struct_t({'a'=>Integer, 'b'=>String, 'c'=>optional_t(Float)})
1381
1759
  expect(calculator.instance?(struct, {'a'=>1, 'b'=>'a', 'c'=>'x'})).to eq(false)
1382
1760
  end
1761
+
1762
+ it 'should consider nil to be a valid element value' do
1763
+ struct = struct_t({not_undef_t('a') => object_t, 'b'=>String})
1764
+ expect(calculator.instance?(struct, {'a'=>nil , 'b'=>'a'})).to eq(true)
1765
+ end
1766
+
1767
+ it 'should consider nil to be a valid element value but subject to value type' do
1768
+ struct = struct_t({not_undef_t('a') => String, 'b'=>String})
1769
+ expect(calculator.instance?(struct, {'a'=>nil , 'b'=>'a'})).to eq(false)
1770
+ end
1771
+
1772
+ it 'should consider nil to be a valid element value but subject to value type even when key is optional' do
1773
+ struct = struct_t({optional_t('a') => String, 'b'=>String})
1774
+ expect(calculator.instance?(struct, {'a'=>nil , 'b'=>'a'})).to eq(false)
1775
+ end
1776
+
1777
+ it 'should consider a hash where optional key is missing as assignable even if value of optional key is required' do
1778
+ struct = struct_t({optional_t('a') => String, 'b'=>String})
1779
+ expect(calculator.instance?(struct, {'b'=>'a'})).to eq(true)
1780
+ end
1383
1781
  end
1384
1782
 
1385
1783
  context 'and t is Data' do
@@ -1417,13 +1815,13 @@ describe 'The type calculator' do
1417
1815
  end
1418
1816
  end
1419
1817
 
1420
- context "and t is something Callable" do
1818
+ context 'and t is something Callable' do
1421
1819
 
1422
1820
  it 'a Closure should be considered a Callable' do
1423
- factory = Puppet::Pops::Model::Factory
1821
+ factory = Model::Factory
1424
1822
  params = [factory.PARAM('a')]
1425
- the_block = factory.LAMBDA(params,factory.literal(42))
1426
- the_closure = Puppet::Pops::Evaluator::Closure.new(:fake_evaluator, the_block, :fake_scope)
1823
+ the_block = factory.LAMBDA(params,factory.literal(42), nil)
1824
+ the_closure = Evaluator::Closure::Dynamic.new(:fake_evaluator, the_block, :fake_scope)
1427
1825
  expect(calculator.instance?(all_callables_t, the_closure)).to be_truthy
1428
1826
  expect(calculator.instance?(callable_t(object_t), the_closure)).to be_truthy
1429
1827
  expect(calculator.instance?(callable_t(object_t, object_t), the_closure)).to be_falsey
@@ -1446,456 +1844,282 @@ describe 'The type calculator' do
1446
1844
  expect(calculator.instance?(callable_t(String), f)).to be_truthy
1447
1845
  end
1448
1846
  end
1847
+
1848
+ context 'and t is a TypeAlias' do
1849
+ let!(:parser) { TypeParser.singleton }
1850
+
1851
+ it 'should consider x an instance of the aliased simple type' do
1852
+ t = type_alias_t('Alias', 'Integer').resolve(parser, nil)
1853
+ expect(calculator.instance?(t, 15)).to be_truthy
1854
+ end
1855
+
1856
+ it 'should consider x an instance of the aliased parameterized type' do
1857
+ t = type_alias_t('Alias', 'Integer[0,20]').resolve(parser, nil)
1858
+ expect(calculator.instance?(t, 15)).to be_truthy
1859
+ end
1860
+
1861
+ it 'should consider x an instance of the aliased type that uses self recursion' do
1862
+ t = type_alias_t('Tree', 'Hash[String,Variant[String,Tree]]')
1863
+ loader = Object.new
1864
+ loader.expects(:load).with(:type, 'tree').returns t
1865
+
1866
+ Adapters::LoaderAdapter.expects(:loader_for_model_object).at_least_once.returns loader
1867
+
1868
+ t.resolve(parser, loader)
1869
+ expect(calculator.instance?(t, {'a'=>{'aa'=>{'aaa'=>'aaaa'}}, 'b'=>'bb'})).to be_truthy
1870
+ end
1871
+
1872
+ it 'should consider x an instance of the aliased type that uses contains an alias that causes self recursion' do
1873
+ t1 = type_alias_t('Tree', 'Hash[String,Variant[String,OtherTree]]')
1874
+ t2 = type_alias_t('OtherTree', 'Hash[String,Tree]')
1875
+ loader = Object.new
1876
+ loader.expects(:load).with(:type, 'tree').returns t1
1877
+ loader.expects(:load).with(:type, 'othertree').returns t2
1878
+
1879
+ Adapters::LoaderAdapter.expects(:loader_for_model_object).at_least_once.returns loader
1880
+
1881
+ t1.resolve(parser, loader)
1882
+ expect(calculator.instance?(t1, {'a'=>{'aa'=>{'aaa'=>'aaaa'}}, 'b'=>'bb'})).to be_truthy
1883
+ end
1884
+ end
1449
1885
  end
1450
1886
 
1451
1887
  context 'when converting a ruby class' do
1452
1888
  it 'should yield \'PIntegerType\' for Integer, Fixnum, and Bignum' do
1453
1889
  [Integer,Fixnum,Bignum].each do |c|
1454
- expect(calculator.type(c).class).to eq(Puppet::Pops::Types::PIntegerType)
1890
+ expect(calculator.type(c).class).to eq(PIntegerType)
1455
1891
  end
1456
1892
  end
1457
1893
 
1458
1894
  it 'should yield \'PFloatType\' for Float' do
1459
- expect(calculator.type(Float).class).to eq(Puppet::Pops::Types::PFloatType)
1895
+ expect(calculator.type(Float).class).to eq(PFloatType)
1460
1896
  end
1461
1897
 
1462
1898
  it 'should yield \'PBooleanType\' for FalseClass and TrueClass' do
1463
1899
  [FalseClass,TrueClass].each do |c|
1464
- expect(calculator.type(c).class).to eq(Puppet::Pops::Types::PBooleanType)
1900
+ expect(calculator.type(c).class).to eq(PBooleanType)
1465
1901
  end
1466
1902
  end
1467
1903
 
1468
1904
  it 'should yield \'PUndefType\' for NilClass' do
1469
- expect(calculator.type(NilClass).class).to eq(Puppet::Pops::Types::PUndefType)
1905
+ expect(calculator.type(NilClass).class).to eq(PUndefType)
1470
1906
  end
1471
1907
 
1472
1908
  it 'should yield \'PStringType\' for String' do
1473
- expect(calculator.type(String).class).to eq(Puppet::Pops::Types::PStringType)
1909
+ expect(calculator.type(String).class).to eq(PStringType)
1474
1910
  end
1475
1911
 
1476
1912
  it 'should yield \'PRegexpType\' for Regexp' do
1477
- expect(calculator.type(Regexp).class).to eq(Puppet::Pops::Types::PRegexpType)
1913
+ expect(calculator.type(Regexp).class).to eq(PRegexpType)
1478
1914
  end
1479
1915
 
1480
1916
  it 'should yield \'PArrayType[PDataType]\' for Array' do
1481
1917
  t = calculator.type(Array)
1482
- expect(t.class).to eq(Puppet::Pops::Types::PArrayType)
1483
- expect(t.element_type.class).to eq(Puppet::Pops::Types::PDataType)
1918
+ expect(t.class).to eq(PArrayType)
1919
+ expect(t.element_type.class).to eq(PDataType)
1484
1920
  end
1485
1921
 
1486
1922
  it 'should yield \'PHashType[PScalarType,PDataType]\' for Hash' do
1487
1923
  t = calculator.type(Hash)
1488
- expect(t.class).to eq(Puppet::Pops::Types::PHashType)
1489
- expect(t.key_type.class).to eq(Puppet::Pops::Types::PScalarType)
1490
- expect(t.element_type.class).to eq(Puppet::Pops::Types::PDataType)
1491
- end
1492
- end
1493
-
1494
- context 'when representing the type as string' do
1495
- it 'should yield \'Type\' for PType' do
1496
- expect(calculator.string(Puppet::Pops::Types::PType.new())).to eq('Type')
1497
- end
1498
-
1499
- it 'should yield \'Object\' for PAnyType' do
1500
- expect(calculator.string(Puppet::Pops::Types::PAnyType.new())).to eq('Any')
1501
- end
1502
-
1503
- it 'should yield \'Scalar\' for PScalarType' do
1504
- expect(calculator.string(Puppet::Pops::Types::PScalarType.new())).to eq('Scalar')
1505
- end
1506
-
1507
- it 'should yield \'Boolean\' for PBooleanType' do
1508
- expect(calculator.string(Puppet::Pops::Types::PBooleanType.new())).to eq('Boolean')
1509
- end
1510
-
1511
- it 'should yield \'Data\' for PDataType' do
1512
- expect(calculator.string(Puppet::Pops::Types::PDataType.new())).to eq('Data')
1513
- end
1514
-
1515
- it 'should yield \'Numeric\' for PNumericType' do
1516
- expect(calculator.string(Puppet::Pops::Types::PNumericType.new())).to eq('Numeric')
1517
- end
1518
-
1519
- it 'should yield \'Integer\' and from/to for PIntegerType' do
1520
- int_T = Puppet::Pops::Types::PIntegerType
1521
- expect(calculator.string(int_T.new())).to eq('Integer')
1522
- int = int_T.new()
1523
- int.from = 1
1524
- int.to = 1
1525
- expect(calculator.string(int)).to eq('Integer[1, 1]')
1526
- int = int_T.new()
1527
- int.from = 1
1528
- int.to = 2
1529
- expect(calculator.string(int)).to eq('Integer[1, 2]')
1530
- int = int_T.new()
1531
- int.from = nil
1532
- int.to = 2
1533
- expect(calculator.string(int)).to eq('Integer[default, 2]')
1534
- int = int_T.new()
1535
- int.from = 2
1536
- int.to = nil
1537
- expect(calculator.string(int)).to eq('Integer[2, default]')
1538
- end
1539
-
1540
- it 'should yield \'Float\' for PFloatType' do
1541
- expect(calculator.string(Puppet::Pops::Types::PFloatType.new())).to eq('Float')
1542
- end
1543
-
1544
- it 'should yield \'Regexp\' for PRegexpType' do
1545
- expect(calculator.string(Puppet::Pops::Types::PRegexpType.new())).to eq('Regexp')
1546
- end
1547
-
1548
- it 'should yield \'Regexp[/pat/]\' for parameterized PRegexpType' do
1549
- t = Puppet::Pops::Types::PRegexpType.new()
1550
- t.pattern = ('a/b')
1551
- expect(calculator.string(Puppet::Pops::Types::PRegexpType.new())).to eq('Regexp')
1552
- end
1553
-
1554
- it 'should yield \'String\' for PStringType' do
1555
- expect(calculator.string(Puppet::Pops::Types::PStringType.new())).to eq('String')
1556
- end
1557
-
1558
- it 'should yield \'String\' for PStringType with multiple values' do
1559
- expect(calculator.string(string_t('a', 'b', 'c'))).to eq('String')
1560
- end
1561
-
1562
- it 'should yield \'String\' and from/to for PStringType' do
1563
- string_T = Puppet::Pops::Types::PStringType
1564
- expect(calculator.string(factory.constrain_size(string_T.new(), 1,1))).to eq('String[1, 1]')
1565
- expect(calculator.string(factory.constrain_size(string_T.new(), 1,2))).to eq('String[1, 2]')
1566
- expect(calculator.string(factory.constrain_size(string_T.new(), :default, 2))).to eq('String[default, 2]')
1567
- expect(calculator.string(factory.constrain_size(string_T.new(), 2, :default))).to eq('String[2, default]')
1568
- end
1569
-
1570
- it 'should yield \'Array[Integer]\' for PArrayType[PIntegerType]' do
1571
- t = Puppet::Pops::Types::PArrayType.new()
1572
- t.element_type = Puppet::Pops::Types::PIntegerType.new()
1573
- expect(calculator.string(t)).to eq('Array[Integer]')
1574
- end
1575
-
1576
- it 'should yield \'Collection\' and from/to for PCollectionType' do
1577
- col = collection_t()
1578
- expect(calculator.string(factory.constrain_size(col.copy, 1,1))).to eq('Collection[1, 1]')
1579
- expect(calculator.string(factory.constrain_size(col.copy, 1,2))).to eq('Collection[1, 2]')
1580
- expect(calculator.string(factory.constrain_size(col.copy, :default, 2))).to eq('Collection[default, 2]')
1581
- expect(calculator.string(factory.constrain_size(col.copy, 2, :default))).to eq('Collection[2, default]')
1582
- end
1583
-
1584
- it 'should yield \'Array\' and from/to for PArrayType' do
1585
- arr = array_t(string_t)
1586
- expect(calculator.string(factory.constrain_size(arr.copy, 1,1))).to eq('Array[String, 1, 1]')
1587
- expect(calculator.string(factory.constrain_size(arr.copy, 1,2))).to eq('Array[String, 1, 2]')
1588
- expect(calculator.string(factory.constrain_size(arr.copy, :default, 2))).to eq('Array[String, default, 2]')
1589
- expect(calculator.string(factory.constrain_size(arr.copy, 2, :default))).to eq('Array[String, 2, default]')
1590
- end
1591
-
1592
- it 'should yield \'Tuple[Integer]\' for PTupleType[PIntegerType]' do
1593
- t = Puppet::Pops::Types::PTupleType.new()
1594
- t.addTypes(Puppet::Pops::Types::PIntegerType.new())
1595
- expect(calculator.string(t)).to eq('Tuple[Integer]')
1596
- end
1597
-
1598
- it 'should yield \'Tuple[T, T,..]\' for PTupleType[T, T, ...]' do
1599
- t = Puppet::Pops::Types::PTupleType.new()
1600
- t.addTypes(Puppet::Pops::Types::PIntegerType.new())
1601
- t.addTypes(Puppet::Pops::Types::PIntegerType.new())
1602
- t.addTypes(Puppet::Pops::Types::PStringType.new())
1603
- expect(calculator.string(t)).to eq('Tuple[Integer, Integer, String]')
1604
- end
1605
-
1606
- it 'should yield \'Tuple\' and from/to for PTupleType' do
1607
- tuple_t = tuple_t(string_t)
1608
- expect(calculator.string(factory.constrain_size(tuple_t.copy, 1,1))).to eq('Tuple[String, 1, 1]')
1609
- expect(calculator.string(factory.constrain_size(tuple_t.copy, 1,2))).to eq('Tuple[String, 1, 2]')
1610
- expect(calculator.string(factory.constrain_size(tuple_t.copy, :default, 2))).to eq('Tuple[String, default, 2]')
1611
- expect(calculator.string(factory.constrain_size(tuple_t.copy, 2, :default))).to eq('Tuple[String, 2, default]')
1612
- end
1613
-
1614
- it 'should yield \'Struct\' and details for PStructType' do
1615
- struct_t = struct_t({'a'=>Integer, 'b'=>String})
1616
- expect(calculator.string(struct_t)).to eq("Struct[{'a'=>Integer, 'b'=>String}]")
1617
- struct_t = struct_t({})
1618
- expect(calculator.string(struct_t)).to eq("Struct")
1619
- end
1620
-
1621
- it 'should yield \'Hash[String, Integer]\' for PHashType[PStringType, PIntegerType]' do
1622
- t = Puppet::Pops::Types::PHashType.new()
1623
- t.key_type = Puppet::Pops::Types::PStringType.new()
1624
- t.element_type = Puppet::Pops::Types::PIntegerType.new()
1625
- expect(calculator.string(t)).to eq('Hash[String, Integer]')
1626
- end
1627
-
1628
- it 'should yield \'Hash\' and from/to for PHashType' do
1629
- hsh = hash_t(string_t, string_t)
1630
- expect(calculator.string(factory.constrain_size(hsh.copy, 1,1))).to eq('Hash[String, String, 1, 1]')
1631
- expect(calculator.string(factory.constrain_size(hsh.copy, 1,2))).to eq('Hash[String, String, 1, 2]')
1632
- expect(calculator.string(factory.constrain_size(hsh.copy, :default, 2))).to eq('Hash[String, String, default, 2]')
1633
- expect(calculator.string(factory.constrain_size(hsh.copy, 2, :default))).to eq('Hash[String, String, 2, default]')
1634
- end
1635
-
1636
- it "should yield 'Class' for a PHostClassType" do
1637
- t = Puppet::Pops::Types::PHostClassType.new()
1638
- expect(calculator.string(t)).to eq('Class')
1639
- end
1640
-
1641
- it "should yield 'Class[x]' for a PHostClassType[x]" do
1642
- t = Puppet::Pops::Types::PHostClassType.new()
1643
- t.class_name = 'x'
1644
- expect(calculator.string(t)).to eq('Class[x]')
1645
- end
1646
-
1647
- it "should yield 'Resource' for a PResourceType" do
1648
- t = Puppet::Pops::Types::PResourceType.new()
1649
- expect(calculator.string(t)).to eq('Resource')
1650
- end
1651
-
1652
- it 'should yield \'File\' for a PResourceType[\'File\']' do
1653
- t = Puppet::Pops::Types::PResourceType.new()
1654
- t.type_name = 'File'
1655
- expect(calculator.string(t)).to eq('File')
1656
- end
1657
-
1658
- it "should yield 'File['/tmp/foo']' for a PResourceType['File', '/tmp/foo']" do
1659
- t = Puppet::Pops::Types::PResourceType.new()
1660
- t.type_name = 'File'
1661
- t.title = '/tmp/foo'
1662
- expect(calculator.string(t)).to eq("File['/tmp/foo']")
1663
- end
1664
-
1665
- it "should yield 'Enum[s,...]' for a PEnumType[s,...]" do
1666
- t = enum_t('a', 'b', 'c')
1667
- expect(calculator.string(t)).to eq("Enum['a', 'b', 'c']")
1668
- end
1669
-
1670
- it "should yield 'Pattern[/pat/,...]' for a PPatternType['pat',...]" do
1671
- t = pattern_t('a')
1672
- t2 = pattern_t('a', 'b', 'c')
1673
- expect(calculator.string(t)).to eq("Pattern[/a/]")
1674
- expect(calculator.string(t2)).to eq("Pattern[/a/, /b/, /c/]")
1675
- end
1676
-
1677
- it "should escape special characters in the string for a PPatternType['pat',...]" do
1678
- t = pattern_t('a/b')
1679
- expect(calculator.string(t)).to eq("Pattern[/a\\/b/]")
1680
- end
1681
-
1682
- it "should yield 'Variant[t1,t2,...]' for a PVariantType[t1, t2,...]" do
1683
- t1 = string_t()
1684
- t2 = integer_t()
1685
- t3 = pattern_t('a')
1686
- t = variant_t(t1, t2, t3)
1687
- expect(calculator.string(t)).to eq("Variant[String, Integer, Pattern[/a/]]")
1688
- end
1689
-
1690
- it "should yield 'Callable' for generic callable" do
1691
- expect(calculator.string(all_callables_t)).to eql("Callable")
1692
- end
1693
-
1694
- it "should yield 'Callable[0,0]' for callable without params" do
1695
- expect(calculator.string(callable_t)).to eql("Callable[0, 0]")
1696
- end
1697
-
1698
- it "should yield 'Callable[t,t]' for callable with typed parameters" do
1699
- expect(calculator.string(callable_t(String, Integer))).to eql("Callable[String, Integer]")
1700
- end
1701
-
1702
- it "should yield 'Callable[t,min,max]' for callable with size constraint (infinite max)" do
1703
- expect(calculator.string(callable_t(String, 0))).to eql("Callable[String, 0, default]")
1704
- end
1705
-
1706
- it "should yield 'Callable[t,min,max]' for callable with size constraint (capped max)" do
1707
- expect(calculator.string(callable_t(String, 0, 3))).to eql("Callable[String, 0, 3]")
1708
- end
1709
-
1710
- it "should yield 'Callable[min,max]' callable with size > 0" do
1711
- expect(calculator.string(callable_t(0, 0))).to eql("Callable[0, 0]")
1712
- expect(calculator.string(callable_t(0, 1))).to eql("Callable[0, 1]")
1713
- expect(calculator.string(callable_t(0, :default))).to eql("Callable[0, default]")
1714
- end
1715
-
1716
- it "should yield 'Callable[Callable]' for callable with block" do
1717
- expect(calculator.string(callable_t(all_callables_t))).to eql("Callable[0, 0, Callable]")
1718
- expect(calculator.string(callable_t(string_t, all_callables_t))).to eql("Callable[String, Callable]")
1719
- expect(calculator.string(callable_t(string_t, 1,1, all_callables_t))).to eql("Callable[String, 1, 1, Callable]")
1720
- end
1721
-
1722
- it "should yield Unit for a Unit type" do
1723
- expect(calculator.string(unit_t)).to eql('Unit')
1924
+ expect(t.class).to eq(PHashType)
1925
+ expect(t.key_type.class).to eq(PScalarType)
1926
+ expect(t.value_type.class).to eq(PDataType)
1724
1927
  end
1725
1928
  end
1726
1929
 
1727
1930
  context 'when processing meta type' do
1728
1931
  it 'should infer PType as the type of all other types' do
1729
- ptype = Puppet::Pops::Types::PType
1730
- expect(calculator.infer(Puppet::Pops::Types::PUndefType.new() ).is_a?(ptype)).to eq(true)
1731
- expect(calculator.infer(Puppet::Pops::Types::PDataType.new() ).is_a?(ptype)).to eq(true)
1732
- expect(calculator.infer(Puppet::Pops::Types::PScalarType.new() ).is_a?(ptype)).to eq(true)
1733
- expect(calculator.infer(Puppet::Pops::Types::PStringType.new() ).is_a?(ptype)).to eq(true)
1734
- expect(calculator.infer(Puppet::Pops::Types::PNumericType.new() ).is_a?(ptype)).to eq(true)
1735
- expect(calculator.infer(Puppet::Pops::Types::PIntegerType.new() ).is_a?(ptype)).to eq(true)
1736
- expect(calculator.infer(Puppet::Pops::Types::PFloatType.new() ).is_a?(ptype)).to eq(true)
1737
- expect(calculator.infer(Puppet::Pops::Types::PRegexpType.new() ).is_a?(ptype)).to eq(true)
1738
- expect(calculator.infer(Puppet::Pops::Types::PBooleanType.new() ).is_a?(ptype)).to eq(true)
1739
- expect(calculator.infer(Puppet::Pops::Types::PCollectionType.new()).is_a?(ptype)).to eq(true)
1740
- expect(calculator.infer(Puppet::Pops::Types::PArrayType.new() ).is_a?(ptype)).to eq(true)
1741
- expect(calculator.infer(Puppet::Pops::Types::PHashType.new() ).is_a?(ptype)).to eq(true)
1742
- expect(calculator.infer(Puppet::Pops::Types::PRuntimeType.new() ).is_a?(ptype)).to eq(true)
1743
- expect(calculator.infer(Puppet::Pops::Types::PHostClassType.new() ).is_a?(ptype)).to eq(true)
1744
- expect(calculator.infer(Puppet::Pops::Types::PResourceType.new() ).is_a?(ptype)).to eq(true)
1745
- expect(calculator.infer(Puppet::Pops::Types::PEnumType.new() ).is_a?(ptype)).to eq(true)
1746
- expect(calculator.infer(Puppet::Pops::Types::PPatternType.new() ).is_a?(ptype)).to eq(true)
1747
- expect(calculator.infer(Puppet::Pops::Types::PVariantType.new() ).is_a?(ptype)).to eq(true)
1748
- expect(calculator.infer(Puppet::Pops::Types::PTupleType.new() ).is_a?(ptype)).to eq(true)
1749
- expect(calculator.infer(Puppet::Pops::Types::POptionalType.new() ).is_a?(ptype)).to eq(true)
1750
- expect(calculator.infer(Puppet::Pops::Types::PCallableType.new() ).is_a?(ptype)).to eq(true)
1932
+ ptype = PType
1933
+ expect(calculator.infer(PUndefType::DEFAULT ).is_a?(ptype)).to eq(true)
1934
+ expect(calculator.infer(PDataType::DEFAULT ).is_a?(ptype)).to eq(true)
1935
+ expect(calculator.infer(PScalarType::DEFAULT ).is_a?(ptype)).to eq(true)
1936
+ expect(calculator.infer(PStringType::DEFAULT ).is_a?(ptype)).to eq(true)
1937
+ expect(calculator.infer(PNumericType::DEFAULT ).is_a?(ptype)).to eq(true)
1938
+ expect(calculator.infer(PIntegerType::DEFAULT ).is_a?(ptype)).to eq(true)
1939
+ expect(calculator.infer(PFloatType::DEFAULT ).is_a?(ptype)).to eq(true)
1940
+ expect(calculator.infer(PRegexpType::DEFAULT ).is_a?(ptype)).to eq(true)
1941
+ expect(calculator.infer(PBooleanType::DEFAULT ).is_a?(ptype)).to eq(true)
1942
+ expect(calculator.infer(PCollectionType::DEFAULT).is_a?(ptype)).to eq(true)
1943
+ expect(calculator.infer(PArrayType::DEFAULT ).is_a?(ptype)).to eq(true)
1944
+ expect(calculator.infer(PHashType::DEFAULT ).is_a?(ptype)).to eq(true)
1945
+ expect(calculator.infer(PIterableType::DEFAULT ).is_a?(ptype)).to eq(true)
1946
+ expect(calculator.infer(PRuntimeType::DEFAULT ).is_a?(ptype)).to eq(true)
1947
+ expect(calculator.infer(PHostClassType::DEFAULT ).is_a?(ptype)).to eq(true)
1948
+ expect(calculator.infer(PResourceType::DEFAULT ).is_a?(ptype)).to eq(true)
1949
+ expect(calculator.infer(PEnumType::DEFAULT ).is_a?(ptype)).to eq(true)
1950
+ expect(calculator.infer(PPatternType::DEFAULT ).is_a?(ptype)).to eq(true)
1951
+ expect(calculator.infer(PVariantType::DEFAULT ).is_a?(ptype)).to eq(true)
1952
+ expect(calculator.infer(PTupleType::DEFAULT ).is_a?(ptype)).to eq(true)
1953
+ expect(calculator.infer(POptionalType::DEFAULT ).is_a?(ptype)).to eq(true)
1954
+ expect(calculator.infer(PCallableType::DEFAULT ).is_a?(ptype)).to eq(true)
1751
1955
  end
1752
1956
 
1753
1957
  it 'should infer PType as the type of all other types' do
1754
- ptype = Puppet::Pops::Types::PType
1755
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PUndefType.new() ))).to eq("Type[Undef]")
1756
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PDataType.new() ))).to eq("Type[Data]")
1757
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PScalarType.new() ))).to eq("Type[Scalar]")
1758
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PStringType.new() ))).to eq("Type[String]")
1759
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PNumericType.new() ))).to eq("Type[Numeric]")
1760
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PIntegerType.new() ))).to eq("Type[Integer]")
1761
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PFloatType.new() ))).to eq("Type[Float]")
1762
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PRegexpType.new() ))).to eq("Type[Regexp]")
1763
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PBooleanType.new() ))).to eq("Type[Boolean]")
1764
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PCollectionType.new()))).to eq("Type[Collection]")
1765
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PArrayType.new() ))).to eq("Type[Array[?]]")
1766
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PHashType.new() ))).to eq("Type[Hash[?, ?]]")
1767
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PRuntimeType.new() ))).to eq("Type[Runtime[?, ?]]")
1768
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PHostClassType.new() ))).to eq("Type[Class]")
1769
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PResourceType.new() ))).to eq("Type[Resource]")
1770
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PEnumType.new() ))).to eq("Type[Enum]")
1771
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PVariantType.new() ))).to eq("Type[Variant]")
1772
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PPatternType.new() ))).to eq("Type[Pattern]")
1773
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PTupleType.new() ))).to eq("Type[Tuple]")
1774
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::POptionalType.new() ))).to eq("Type[Optional]")
1775
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PCallableType.new() ))).to eq("Type[Callable]")
1776
-
1777
- expect(calculator.infer(Puppet::Pops::Types::PResourceType.new(:type_name => 'foo::fee::fum')).to_s).to eq("Type[Foo::Fee::Fum]")
1778
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PResourceType.new(:type_name => 'foo::fee::fum')))).to eq("Type[Foo::Fee::Fum]")
1779
- expect(calculator.infer(Puppet::Pops::Types::PResourceType.new(:type_name => 'Foo::Fee::Fum')).to_s).to eq("Type[Foo::Fee::Fum]")
1958
+ expect(calculator.infer(PUndefType::DEFAULT ).to_s).to eq('Type[Undef]')
1959
+ expect(calculator.infer(PDataType::DEFAULT ).to_s).to eq('Type[Data]')
1960
+ expect(calculator.infer(PScalarType::DEFAULT ).to_s).to eq('Type[Scalar]')
1961
+ expect(calculator.infer(PStringType::DEFAULT ).to_s).to eq('Type[String]')
1962
+ expect(calculator.infer(PNumericType::DEFAULT ).to_s).to eq('Type[Numeric]')
1963
+ expect(calculator.infer(PIntegerType::DEFAULT ).to_s).to eq('Type[Integer]')
1964
+ expect(calculator.infer(PFloatType::DEFAULT ).to_s).to eq('Type[Float]')
1965
+ expect(calculator.infer(PRegexpType::DEFAULT ).to_s).to eq('Type[Regexp]')
1966
+ expect(calculator.infer(PBooleanType::DEFAULT ).to_s).to eq('Type[Boolean]')
1967
+ expect(calculator.infer(PCollectionType::DEFAULT).to_s).to eq('Type[Collection]')
1968
+ expect(calculator.infer(PArrayType::DEFAULT ).to_s).to eq('Type[Array[?]]')
1969
+ expect(calculator.infer(PHashType::DEFAULT ).to_s).to eq('Type[Hash[?, ?]]')
1970
+ expect(calculator.infer(PIterableType::DEFAULT ).to_s).to eq('Type[Iterable]')
1971
+ expect(calculator.infer(PRuntimeType::DEFAULT ).to_s).to eq('Type[Runtime[?, ?]]')
1972
+ expect(calculator.infer(PHostClassType::DEFAULT ).to_s).to eq('Type[Class]')
1973
+ expect(calculator.infer(PResourceType::DEFAULT ).to_s).to eq('Type[Resource]')
1974
+ expect(calculator.infer(PEnumType::DEFAULT ).to_s).to eq('Type[Enum]')
1975
+ expect(calculator.infer(PVariantType::DEFAULT ).to_s).to eq('Type[Variant]')
1976
+ expect(calculator.infer(PPatternType::DEFAULT ).to_s).to eq('Type[Pattern]')
1977
+ expect(calculator.infer(PTupleType::DEFAULT ).to_s).to eq('Type[Tuple]')
1978
+ expect(calculator.infer(POptionalType::DEFAULT ).to_s).to eq('Type[Optional]')
1979
+ expect(calculator.infer(PCallableType::DEFAULT ).to_s).to eq('Type[Callable]')
1980
+
1981
+ expect(calculator.infer(PResourceType.new('foo::fee::fum')).to_s).to eq('Type[Foo::Fee::Fum]')
1982
+ expect(calculator.infer(PResourceType.new('foo::fee::fum')).to_s).to eq('Type[Foo::Fee::Fum]')
1983
+ expect(calculator.infer(PResourceType.new('Foo::Fee::Fum')).to_s).to eq('Type[Foo::Fee::Fum]')
1780
1984
  end
1781
1985
 
1782
1986
  it "computes the common type of PType's type parameter" do
1783
- int_t = Puppet::Pops::Types::PIntegerType.new()
1784
- string_t = Puppet::Pops::Types::PStringType.new()
1785
- expect(calculator.string(calculator.infer([int_t]))).to eq("Array[Type[Integer], 1, 1]")
1786
- expect(calculator.string(calculator.infer([int_t, string_t]))).to eq("Array[Type[Scalar], 2, 2]")
1987
+ int_t = PIntegerType::DEFAULT
1988
+ string_t = PStringType::DEFAULT
1989
+ expect(calculator.infer([int_t]).to_s).to eq('Array[Type[Integer], 1, 1]')
1990
+ expect(calculator.infer([int_t, string_t]).to_s).to eq('Array[Type[Scalar], 2, 2]')
1787
1991
  end
1788
1992
 
1789
1993
  it 'should infer PType as the type of ruby classes' do
1790
1994
  class Foo
1791
1995
  end
1792
1996
  [Object, Numeric, Integer, Fixnum, Bignum, Float, String, Regexp, Array, Hash, Foo].each do |c|
1793
- expect(calculator.infer(c).is_a?(Puppet::Pops::Types::PType)).to eq(true)
1997
+ expect(calculator.infer(c).is_a?(PType)).to eq(true)
1794
1998
  end
1795
1999
  end
1796
2000
 
1797
2001
  it 'should infer PType as the type of PType (meta regression short-circuit)' do
1798
- expect(calculator.infer(Puppet::Pops::Types::PType.new()).is_a?(Puppet::Pops::Types::PType)).to eq(true)
2002
+ expect(calculator.infer(PType::DEFAULT).is_a?(PType)).to eq(true)
1799
2003
  end
1800
2004
 
1801
2005
  it 'computes instance? to be true if parameterized and type match' do
1802
- int_t = Puppet::Pops::Types::PIntegerType.new()
1803
- type_t = Puppet::Pops::Types::TypeFactory.type_type(int_t)
1804
- type_type_t = Puppet::Pops::Types::TypeFactory.type_type(type_t)
2006
+ int_t = PIntegerType::DEFAULT
2007
+ type_t = TypeFactory.type_type(int_t)
2008
+ type_type_t = TypeFactory.type_type(type_t)
1805
2009
  expect(calculator.instance?(type_type_t, type_t)).to eq(true)
1806
2010
  end
1807
2011
 
1808
2012
  it 'computes instance? to be false if parameterized and type do not match' do
1809
- int_t = Puppet::Pops::Types::PIntegerType.new()
1810
- string_t = Puppet::Pops::Types::PStringType.new()
1811
- type_t = Puppet::Pops::Types::TypeFactory.type_type(int_t)
1812
- type_t2 = Puppet::Pops::Types::TypeFactory.type_type(string_t)
1813
- type_type_t = Puppet::Pops::Types::TypeFactory.type_type(type_t)
2013
+ int_t = PIntegerType::DEFAULT
2014
+ string_t = PStringType::DEFAULT
2015
+ type_t = TypeFactory.type_type(int_t)
2016
+ type_t2 = TypeFactory.type_type(string_t)
2017
+ type_type_t = TypeFactory.type_type(type_t)
1814
2018
  # i.e. Type[Integer] =~ Type[Type[Integer]] # false
1815
2019
  expect(calculator.instance?(type_type_t, type_t2)).to eq(false)
1816
2020
  end
1817
2021
 
1818
2022
  it 'computes instance? to be true if unparameterized and matched against a type[?]' do
1819
- int_t = Puppet::Pops::Types::PIntegerType.new()
1820
- type_t = Puppet::Pops::Types::TypeFactory.type_type(int_t)
1821
- expect(calculator.instance?(Puppet::Pops::Types::PType.new, type_t)).to eq(true)
2023
+ int_t = PIntegerType::DEFAULT
2024
+ type_t = TypeFactory.type_type(int_t)
2025
+ expect(calculator.instance?(PType::DEFAULT, type_t)).to eq(true)
1822
2026
  end
1823
2027
  end
1824
2028
 
1825
- context "when asking for an enumerable " do
1826
- it "should produce an enumerable for an Integer range that is not infinite" do
1827
- t = Puppet::Pops::Types::PIntegerType.new()
1828
- t.from = 1
1829
- t.to = 10
1830
- expect(calculator.enumerable(t).respond_to?(:each)).to eq(true)
2029
+ context 'when asking for an iterable ' do
2030
+ it 'should produce an iterable for an Integer range that is finite' do
2031
+ t = PIntegerType.new(1, 10)
2032
+ expect(calculator.iterable(t).respond_to?(:each)).to eq(true)
1831
2033
  end
1832
2034
 
1833
- it "should not produce an enumerable for an Integer range that has an infinite side" do
1834
- t = Puppet::Pops::Types::PIntegerType.new()
1835
- t.from = nil
1836
- t.to = 10
1837
- expect(calculator.enumerable(t)).to eq(nil)
2035
+ it 'should not produce an iterable for an Integer range that has an infinite side' do
2036
+ t = PIntegerType.new(nil, 10)
2037
+ expect(calculator.iterable(t)).to eq(nil)
1838
2038
 
1839
- t = Puppet::Pops::Types::PIntegerType.new()
1840
- t.from = 1
1841
- t.to = nil
1842
- expect(calculator.enumerable(t)).to eq(nil)
2039
+ t = PIntegerType.new(1, nil)
2040
+ expect(calculator.iterable(t)).to eq(nil)
1843
2041
  end
1844
2042
 
1845
- it "all but Integer range are not enumerable" do
2043
+ it 'all but Integer range are not iterable' do
1846
2044
  [Object, Numeric, Float, String, Regexp, Array, Hash].each do |t|
1847
- expect(calculator.enumerable(calculator.type(t))).to eq(nil)
2045
+ expect(calculator.iterable(calculator.type(t))).to eq(nil)
1848
2046
  end
1849
2047
  end
1850
2048
  end
1851
2049
 
1852
- context "when dealing with different types of inference" do
1853
- it "an instance specific inference is produced by infer" do
2050
+ context 'when dealing with different types of inference' do
2051
+ it 'an instance specific inference is produced by infer' do
1854
2052
  expect(calculator.infer(['a','b']).element_type.values).to eq(['a', 'b'])
1855
2053
  end
1856
2054
 
1857
- it "a generic inference is produced using infer_generic" do
1858
- expect(calculator.infer_generic(['a','b']).element_type.values).to eq([])
2055
+ it 'a generic inference is produced using infer_generic' do
2056
+ expect(calculator.infer_generic(['a','b']).element_type).to eql(string_t(range_t(1,1)))
1859
2057
  end
1860
2058
 
1861
- it "a generic result is created by generalize! given an instance specific result for an Array" do
2059
+ it 'a generic result is created by generalize given an instance specific result for an Array' do
1862
2060
  generic = calculator.infer(['a','b'])
1863
- expect(generic.element_type.values).to eq(['a', 'b'])
1864
- calculator.generalize!(generic)
1865
- expect(generic.element_type.values).to eq([])
2061
+ expect(generic.element_type.values).to eq(['a','b'])
2062
+ generic = generic.generalize
2063
+ expect(generic.element_type).to eql(string_t(range_t(1,1)))
2064
+ end
2065
+
2066
+ it 'a generic result is created by generalize given an instance specific result for a Hash' do
2067
+ generic = calculator.infer({'a' =>1,'bcd' => 2})
2068
+ expect(generic.key_type.values.sort).to eq(['a', 'bcd'])
2069
+ expect(generic.value_type.from).to eq(1)
2070
+ expect(generic.value_type.to).to eq(2)
2071
+ generic = generic.generalize
2072
+ expect(generic.key_type.size_type).to eq(range_t(1,3))
2073
+ expect(generic.value_type.from).to eq(nil)
2074
+ expect(generic.value_type.to).to eq(nil)
2075
+ end
2076
+
2077
+ it 'ensures that Struct key types are not generalized' do
2078
+ generic = struct_t({'a' => object_t}).generalize
2079
+ expect(generic.to_s).to eq("Struct[{'a' => Any}]")
2080
+ generic = struct_t({not_undef_t('a') => object_t}).generalize
2081
+ expect(generic.to_s).to eq("Struct[{NotUndef['a'] => Any}]")
2082
+ generic = struct_t({optional_t('a') => string_t}).generalize
2083
+ expect(generic.to_s).to eq("Struct[{Optional['a'] => String}]")
1866
2084
  end
1867
2085
 
1868
- it "a generic result is created by generalize! given an instance specific result for a Hash" do
1869
- generic = calculator.infer({'a' =>1,'b' => 2})
1870
- expect(generic.key_type.values.sort).to eq(['a', 'b'])
1871
- expect(generic.element_type.from).to eq(1)
1872
- expect(generic.element_type.to).to eq(2)
1873
- calculator.generalize!(generic)
1874
- expect(generic.key_type.values).to eq([])
1875
- expect(generic.element_type.from).to eq(nil)
1876
- expect(generic.element_type.to).to eq(nil)
2086
+ it 'ensures that Struct value types are generalized' do
2087
+ generic = struct_t({'a' => range_t(1, 3)}).generalize
2088
+ expect(generic.to_s).to eq("Struct[{'a' => Integer}]")
1877
2089
  end
1878
2090
 
1879
2091
  it "does not reduce by combining types when using infer_set" do
1880
2092
  element_type = calculator.infer(['a','b',1,2]).element_type
1881
- expect(element_type.class).to eq(Puppet::Pops::Types::PScalarType)
2093
+ expect(element_type.class).to eq(PScalarType)
1882
2094
  inferred_type = calculator.infer_set(['a','b',1,2])
1883
- expect(inferred_type.class).to eq(Puppet::Pops::Types::PTupleType)
2095
+ expect(inferred_type.class).to eq(PTupleType)
1884
2096
  element_types = inferred_type.types
1885
- expect(element_types[0].class).to eq(Puppet::Pops::Types::PStringType)
1886
- expect(element_types[1].class).to eq(Puppet::Pops::Types::PStringType)
1887
- expect(element_types[2].class).to eq(Puppet::Pops::Types::PIntegerType)
1888
- expect(element_types[3].class).to eq(Puppet::Pops::Types::PIntegerType)
2097
+ expect(element_types[0].class).to eq(PStringType)
2098
+ expect(element_types[1].class).to eq(PStringType)
2099
+ expect(element_types[2].class).to eq(PIntegerType)
2100
+ expect(element_types[3].class).to eq(PIntegerType)
1889
2101
  end
1890
2102
 
1891
- it "does not reduce by combining types when using infer_set and values are undef" do
2103
+ it 'does not reduce by combining types when using infer_set and values are undef' do
1892
2104
  element_type = calculator.infer(['a',nil]).element_type
1893
- expect(element_type.class).to eq(Puppet::Pops::Types::PStringType)
2105
+ expect(element_type.class).to eq(PStringType)
1894
2106
  inferred_type = calculator.infer_set(['a',nil])
1895
- expect(inferred_type.class).to eq(Puppet::Pops::Types::PTupleType)
2107
+ expect(inferred_type.class).to eq(PTupleType)
1896
2108
  element_types = inferred_type.types
1897
- expect(element_types[0].class).to eq(Puppet::Pops::Types::PStringType)
1898
- expect(element_types[1].class).to eq(Puppet::Pops::Types::PUndefType)
2109
+ expect(element_types[0].class).to eq(PStringType)
2110
+ expect(element_types[1].class).to eq(PUndefType)
2111
+ end
2112
+
2113
+ it 'infers on an empty Array produces Array[Unit,0,0]' do
2114
+ inferred_type = calculator.infer([])
2115
+ expect(inferred_type.element_type.class).to eq(PUnitType)
2116
+ expect(inferred_type.size_range).to eq([0, 0])
2117
+ end
2118
+
2119
+ it 'infer_set on an empty Array produces Array[Unit,0,0]' do
2120
+ inferred_type = calculator.infer_set([])
2121
+ expect(inferred_type.element_type.class).to eq(PUnitType)
2122
+ expect(inferred_type.size_range).to eq([0, 0])
1899
2123
  end
1900
2124
  end
1901
2125
 
@@ -1921,8 +2145,7 @@ describe 'The type calculator' do
1921
2145
 
1922
2146
  it 'with args array' do
1923
2147
  required = callable_t(string_t)
1924
- given = array_t(string_t)
1925
- factory.constrain_size(given, 1, 1)
2148
+ given = array_t(string_t, range_t(1, 1))
1926
2149
  expect(calculator.callable?(required, given)).to eq(true)
1927
2150
  end
1928
2151
  end
@@ -1981,7 +2204,7 @@ describe 'The type calculator' do
1981
2204
  end
1982
2205
 
1983
2206
  matcher :be_assignable_to do |type|
1984
- calc = Puppet::Pops::Types::TypeCalculator.new
2207
+ calc = TypeCalculator.singleton
1985
2208
 
1986
2209
  match do |actual|
1987
2210
  calc.assignable?(type, actual)
@@ -1995,5 +2218,6 @@ describe 'The type calculator' do
1995
2218
  "#{calc.string(actual)} is assignable to #{calc.string(type)} when it should not"
1996
2219
  end
1997
2220
  end
1998
-
2221
+ end
2222
+ end
1999
2223
  end