puppet 4.0.0 → 4.5.0

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