puppet 4.3.0 → 4.4.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 (560) hide show
  1. checksums.yaml +7 -0
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +6 -6
  4. data/LICENSE +1 -1
  5. data/README.md +8 -9
  6. data/conf/auth.conf +2 -2
  7. data/ext/README.environment +1 -1
  8. data/ext/build_defaults.yaml +1 -1
  9. data/ext/debian/README.source +1 -1
  10. data/ext/debian/control +1 -1
  11. data/ext/debian/copyright +4 -4
  12. data/ext/debian/puppetmaster.README.debian +11 -9
  13. data/ext/emacs/puppet-mode.el +1 -1
  14. data/ext/envpuppet +2 -2
  15. data/ext/ips/puppetagent.xml +1 -1
  16. data/ext/ips/puppetmaster.xml +1 -1
  17. data/ext/project_data.yaml +8 -0
  18. data/ext/puppet-test +3 -3
  19. data/ext/rack/example-passenger-vhost.conf +1 -1
  20. data/ext/redhat/puppet.spec.erb +2 -2
  21. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  22. data/ext/solaris/pkginfo +1 -1
  23. data/ext/solaris/smf/puppet.xml +1 -1
  24. data/ext/suse/puppet.spec +2 -2
  25. data/ext/upload_facts.rb +1 -1
  26. data/ext/windows/puppet_interactive.bat +6 -0
  27. data/ext/windows/puppet_shell.bat +9 -0
  28. data/ext/windows/run_puppet_interactive.bat +9 -0
  29. data/ext/yaml_nodes.rb +1 -1
  30. data/install.rb +30 -20
  31. data/lib/hiera/scope.rb +1 -1
  32. data/lib/puppet/agent.rb +1 -1
  33. data/lib/puppet/application/agent.rb +4 -2
  34. data/lib/puppet/application/apply.rb +7 -4
  35. data/lib/puppet/application/cert.rb +1 -1
  36. data/lib/puppet/application/device.rb +1 -1
  37. data/lib/puppet/application/filebucket.rb +1 -1
  38. data/lib/puppet/application/inspect.rb +1 -1
  39. data/lib/puppet/application/lookup.rb +45 -47
  40. data/lib/puppet/application/master.rb +2 -2
  41. data/lib/puppet/application/resource.rb +1 -1
  42. data/lib/puppet/configurer.rb +100 -22
  43. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  44. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  45. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  46. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  47. data/lib/puppet/data_providers/lookup_adapter.rb +73 -26
  48. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  49. data/lib/puppet/defaults.rb +69 -22
  50. data/lib/puppet/environments.rb +3 -1
  51. data/lib/puppet/face/config.rb +1 -1
  52. data/lib/puppet/face/epp.rb +1 -1
  53. data/lib/puppet/face/help/man.erb +1 -1
  54. data/lib/puppet/face/module/install.rb +6 -6
  55. data/lib/puppet/face/parser.rb +12 -9
  56. data/lib/puppet/face/status.rb +2 -1
  57. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  58. data/lib/puppet/feature/telnet.rb +9 -0
  59. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  60. data/lib/puppet/file_serving/metadata.rb +18 -2
  61. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  62. data/lib/puppet/file_system/file_impl.rb +2 -2
  63. data/lib/puppet/file_system/memory_impl.rb +1 -1
  64. data/lib/puppet/file_system/uniquefile.rb +1 -1
  65. data/lib/puppet/file_system.rb +2 -2
  66. data/lib/puppet/forge/repository.rb +1 -31
  67. data/lib/puppet/forge.rb +1 -1
  68. data/lib/puppet/functions/assert_type.rb +9 -9
  69. data/lib/puppet/functions/each.rb +5 -13
  70. data/lib/puppet/functions/filter.rb +5 -14
  71. data/lib/puppet/functions/lookup.rb +126 -150
  72. data/lib/puppet/functions/map.rb +6 -14
  73. data/lib/puppet/functions/match.rb +1 -0
  74. data/lib/puppet/functions/reduce.rb +5 -13
  75. data/lib/puppet/functions/reverse_each.rb +82 -0
  76. data/lib/puppet/functions/scanf.rb +15 -18
  77. data/lib/puppet/functions/slice.rb +22 -36
  78. data/lib/puppet/functions/split.rb +2 -2
  79. data/lib/puppet/functions/step.rb +88 -0
  80. data/lib/puppet/functions/type.rb +70 -0
  81. data/lib/puppet/functions.rb +45 -6
  82. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  83. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  84. data/lib/puppet/indirector/facts/facter.rb +2 -13
  85. data/lib/puppet/indirector/file_content/http.rb +15 -0
  86. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  87. data/lib/puppet/indirector/generic_http.rb +16 -0
  88. data/lib/puppet/indirector/hiera.rb +3 -1
  89. data/lib/puppet/indirector/indirection.rb +6 -2
  90. data/lib/puppet/indirector/json.rb +2 -2
  91. data/lib/puppet/indirector/node/exec.rb +1 -1
  92. data/lib/puppet/indirector/node/ldap.rb +1 -1
  93. data/lib/puppet/indirector/rest.rb +2 -1
  94. data/lib/puppet/info_service/class_information_service.rb +13 -12
  95. data/lib/puppet/loaders.rb +1 -0
  96. data/lib/puppet/module.rb +6 -2
  97. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  98. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  99. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  100. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  101. data/lib/puppet/network/http/pool.rb +9 -0
  102. data/lib/puppet/node/environment.rb +11 -2
  103. data/lib/puppet/node.rb +11 -2
  104. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  105. data/lib/puppet/parser/compiler.rb +4 -11
  106. data/lib/puppet/parser/environment_compiler.rb +0 -1
  107. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  108. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  109. data/lib/puppet/parser/functions/lookup.rb +128 -149
  110. data/lib/puppet/parser/functions/map.rb +1 -1
  111. data/lib/puppet/parser/functions/match.rb +1 -0
  112. data/lib/puppet/parser/functions/scanf.rb +15 -26
  113. data/lib/puppet/parser/functions/slice.rb +17 -24
  114. data/lib/puppet/parser/functions/split.rb +1 -1
  115. data/lib/puppet/parser/functions.rb +28 -16
  116. data/lib/puppet/parser/resource.rb +19 -17
  117. data/lib/puppet/parser/scope.rb +176 -5
  118. data/lib/puppet/plugins/data_providers/data_provider.rb +56 -14
  119. data/lib/puppet/pops/adaptable.rb +4 -1
  120. data/lib/puppet/pops/adapters.rb +80 -12
  121. data/lib/puppet/pops/binder/binder.rb +21 -17
  122. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  123. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  124. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  125. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  126. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  127. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  128. data/lib/puppet/pops/binder/injector.rb +53 -48
  129. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  130. data/lib/puppet/pops/binder/producers.rb +67 -62
  131. data/lib/puppet/pops/evaluator/access_operator.rb +98 -96
  132. data/lib/puppet/pops/evaluator/closure.rb +122 -106
  133. data/lib/puppet/pops/evaluator/collector_transformer.rb +34 -14
  134. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  135. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  136. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  137. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  138. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  139. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  140. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  141. data/lib/puppet/pops/evaluator/runtime3_support.rb +47 -42
  142. data/lib/puppet/pops/functions/function.rb +6 -2
  143. data/lib/puppet/pops/issue_reporter.rb +6 -4
  144. data/lib/puppet/pops/issues.rb +50 -11
  145. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  146. data/lib/puppet/pops/loader/loader.rb +1 -1
  147. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  148. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  149. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +18 -13
  150. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  151. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  152. data/lib/puppet/pops/loaders.rb +51 -9
  153. data/lib/puppet/pops/lookup/explainer.rb +73 -3
  154. data/lib/puppet/pops/lookup/invocation.rb +21 -19
  155. data/lib/puppet/pops/lookup.rb +17 -12
  156. data/lib/puppet/pops/merge_strategy.rb +16 -19
  157. data/lib/puppet/pops/model/factory.rb +179 -157
  158. data/lib/puppet/pops/model/model.rb +17 -8
  159. data/lib/puppet/pops/model/model_label_provider.rb +14 -7
  160. data/lib/puppet/pops/model/model_meta.rb +17 -0
  161. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  162. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  163. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  164. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  165. data/lib/puppet/pops/parser/evaluating_parser.rb +17 -13
  166. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  167. data/lib/puppet/pops/parser/lexer2.rb +428 -403
  168. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  169. data/lib/puppet/pops/parser/locator.rb +21 -0
  170. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  171. data/lib/puppet/pops/parser/slurp_support.rb +16 -8
  172. data/lib/puppet/pops/types/class_loader.rb +23 -19
  173. data/lib/puppet/pops/types/enumeration.rb +9 -26
  174. data/lib/puppet/pops/types/iterable.rb +308 -0
  175. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  176. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  177. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  178. data/lib/puppet/pops/types/type_calculator.rb +140 -387
  179. data/lib/puppet/pops/types/type_factory.rb +91 -57
  180. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  181. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  182. data/lib/puppet/pops/types/type_parser.rb +159 -112
  183. data/lib/puppet/pops/types/types.rb +2057 -1253
  184. data/lib/puppet/pops/utils.rb +11 -10
  185. data/lib/puppet/pops/validation/checker4_0.rb +115 -63
  186. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  187. data/lib/puppet/pops/validation.rb +11 -9
  188. data/lib/puppet/pops.rb +0 -8
  189. data/lib/puppet/provider/aixobject.rb +1 -1
  190. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  191. data/lib/puppet/provider/cron/crontab.rb +1 -1
  192. data/lib/puppet/provider/exec/windows.rb +1 -1
  193. data/lib/puppet/provider/group/windows_adsi.rb +2 -2
  194. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  195. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  196. data/lib/puppet/provider/package/appdmg.rb +3 -2
  197. data/lib/puppet/provider/package/dnf.rb +1 -1
  198. data/lib/puppet/provider/package/pip.rb +16 -9
  199. data/lib/puppet/provider/package/pip3.rb +1 -1
  200. data/lib/puppet/provider/package/pkg.rb +1 -1
  201. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  202. data/lib/puppet/provider/package/pkgng.rb +13 -4
  203. data/lib/puppet/provider/package/rpm.rb +0 -1
  204. data/lib/puppet/provider/package/windows.rb +1 -1
  205. data/lib/puppet/provider/package/yum.rb +2 -2
  206. data/lib/puppet/provider/package/zypper.rb +19 -0
  207. data/lib/puppet/provider/service/debian.rb +7 -20
  208. data/lib/puppet/provider/service/init.rb +7 -0
  209. data/lib/puppet/provider/service/launchd.rb +6 -12
  210. data/lib/puppet/provider/service/systemd.rb +9 -2
  211. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +1 -1
  213. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  214. data/lib/puppet/provider/user/windows_adsi.rb +2 -2
  215. data/lib/puppet/provider/yumrepo/inifile.rb +6 -3
  216. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  217. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  218. data/lib/puppet/reference/configuration.rb +1 -1
  219. data/lib/puppet/reference/providers.rb +1 -1
  220. data/lib/puppet/resource/capability_finder.rb +20 -13
  221. data/lib/puppet/resource/catalog.rb +60 -3
  222. data/lib/puppet/resource/status.rb +11 -2
  223. data/lib/puppet/resource/type.rb +33 -42
  224. data/lib/puppet/resource.rb +15 -12
  225. data/lib/puppet/settings/config_file.rb +1 -1
  226. data/lib/puppet/settings/environment_conf.rb +13 -5
  227. data/lib/puppet/settings.rb +1 -1
  228. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  229. data/lib/puppet/ssl/certificate_request.rb +4 -4
  230. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  231. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  232. data/lib/puppet/test/test_helper.rb +16 -4
  233. data/lib/puppet/transaction/additional_resource_generator.rb +23 -5
  234. data/lib/puppet/transaction/report.rb +31 -1
  235. data/lib/puppet/transaction/resource_harness.rb +0 -25
  236. data/lib/puppet/transaction.rb +15 -2
  237. data/lib/puppet/type/augeas.rb +1 -1
  238. data/lib/puppet/type/cron.rb +12 -12
  239. data/lib/puppet/type/file/checksum_value.rb +53 -0
  240. data/lib/puppet/type/file/content.rb +26 -111
  241. data/lib/puppet/type/file/data_sync.rb +84 -0
  242. data/lib/puppet/type/file/ensure.rb +17 -14
  243. data/lib/puppet/type/file/selcontext.rb +1 -1
  244. data/lib/puppet/type/file/source.rb +103 -18
  245. data/lib/puppet/type/file.rb +91 -39
  246. data/lib/puppet/type/filebucket.rb +1 -1
  247. data/lib/puppet/type/group.rb +6 -2
  248. data/lib/puppet/type/interface.rb +8 -3
  249. data/lib/puppet/type/macauthorization.rb +1 -1
  250. data/lib/puppet/type/package.rb +6 -0
  251. data/lib/puppet/type/schedule.rb +1 -1
  252. data/lib/puppet/type/stage.rb +1 -1
  253. data/lib/puppet/type/user.rb +19 -17
  254. data/lib/puppet/type/yumrepo.rb +20 -0
  255. data/lib/puppet/type.rb +11 -11
  256. data/lib/puppet/util/autoload.rb +16 -11
  257. data/lib/puppet/util/checksums.rb +74 -31
  258. data/lib/puppet/util/execution.rb +1 -1
  259. data/lib/puppet/util/http_proxy.rb +72 -0
  260. data/lib/puppet/util/log.rb +2 -0
  261. data/lib/puppet/util/logging.rb +43 -1
  262. data/lib/puppet/util/monkey_patches.rb +2 -2
  263. data/lib/puppet/util/multi_match.rb +51 -0
  264. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  265. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  266. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  267. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  268. data/lib/puppet/util/plist.rb +130 -0
  269. data/lib/puppet/util/resource_template.rb +1 -1
  270. data/lib/puppet/util/run_mode.rb +2 -2
  271. data/lib/puppet/util/skip_tags.rb +9 -0
  272. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  273. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  274. data/lib/puppet/util/windows/adsi.rb +65 -28
  275. data/lib/puppet/util/windows/api_types.rb +24 -18
  276. data/lib/puppet/util/windows/com.rb +3 -3
  277. data/lib/puppet/util/windows/error.rb +1 -1
  278. data/lib/puppet/util/windows/file.rb +8 -8
  279. data/lib/puppet/util/windows/principal.rb +190 -0
  280. data/lib/puppet/util/windows/process.rb +78 -11
  281. data/lib/puppet/util/windows/registry.rb +22 -16
  282. data/lib/puppet/util/windows/root_certs.rb +5 -5
  283. data/lib/puppet/util/windows/security.rb +33 -35
  284. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  285. data/lib/puppet/util/windows/sid.rb +84 -15
  286. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  287. data/lib/puppet/util/windows/user.rb +10 -10
  288. data/lib/puppet/util/windows.rb +4 -0
  289. data/lib/puppet/util.rb +109 -22
  290. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  291. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  292. data/lib/puppet/vendor/pathspec/README.md +1 -1
  293. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  294. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  295. data/lib/puppet/version.rb +1 -1
  296. data/lib/puppet.rb +17 -0
  297. data/lib/semver.rb +17 -1
  298. data/man/man5/puppet.conf.5 +12 -12
  299. data/man/man8/extlookup2hiera.8 +1 -1
  300. data/man/man8/puppet-agent.8 +2 -2
  301. data/man/man8/puppet-apply.8 +2 -2
  302. data/man/man8/puppet-ca.8 +2 -2
  303. data/man/man8/puppet-catalog.8 +2 -2
  304. data/man/man8/puppet-cert.8 +2 -2
  305. data/man/man8/puppet-certificate.8 +2 -2
  306. data/man/man8/puppet-certificate_request.8 +2 -2
  307. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  308. data/man/man8/puppet-config.8 +3 -3
  309. data/man/man8/puppet-describe.8 +1 -1
  310. data/man/man8/puppet-device.8 +1 -1
  311. data/man/man8/puppet-doc.8 +1 -1
  312. data/man/man8/puppet-epp.8 +2 -2
  313. data/man/man8/puppet-facts.8 +2 -2
  314. data/man/man8/puppet-file.8 +2 -2
  315. data/man/man8/puppet-filebucket.8 +2 -2
  316. data/man/man8/puppet-help.8 +2 -2
  317. data/man/man8/puppet-inspect.8 +2 -2
  318. data/man/man8/puppet-key.8 +2 -2
  319. data/man/man8/puppet-man.8 +2 -2
  320. data/man/man8/puppet-master.8 +2 -2
  321. data/man/man8/puppet-module.8 +9 -9
  322. data/man/man8/puppet-node.8 +2 -2
  323. data/man/man8/puppet-parser.8 +2 -2
  324. data/man/man8/puppet-plugin.8 +2 -2
  325. data/man/man8/puppet-report.8 +2 -2
  326. data/man/man8/puppet-resource.8 +2 -2
  327. data/man/man8/puppet-resource_type.8 +2 -2
  328. data/man/man8/puppet-status.8 +3 -3
  329. data/man/man8/puppet.8 +1 -1
  330. data/spec/fixtures/module.tar.gz +0 -0
  331. data/spec/fixtures/unit/application/environments/production/data/common.yaml +4 -0
  332. data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
  333. data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
  334. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/data.pp +10 -0
  335. data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
  336. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
  337. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
  338. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
  339. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
  340. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
  341. data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
  342. data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
  343. data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
  344. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
  345. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
  346. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
  347. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
  348. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
  349. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
  350. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
  351. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
  352. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  353. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  354. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  355. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  356. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  357. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  358. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  359. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  360. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  361. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  362. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  363. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  364. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
  365. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
  366. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
  367. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  368. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
  369. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
  370. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
  371. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
  372. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
  373. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
  374. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
  375. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
  376. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +81 -0
  377. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
  378. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  379. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  380. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  381. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  382. 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
  383. 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
  384. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  385. 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
  386. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  387. 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
  388. 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
  389. data/spec/integration/defaults_spec.rb +14 -2
  390. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  391. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  392. data/spec/integration/node/environment_spec.rb +13 -0
  393. data/spec/integration/parser/collection_spec.rb +8 -0
  394. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  395. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  396. data/spec/integration/parser/undef_param_spec.rb +8 -0
  397. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  398. data/spec/integration/test/test_helper_spec.rb +28 -0
  399. data/spec/integration/transaction/report_spec.rb +16 -0
  400. data/spec/integration/transaction_spec.rb +11 -0
  401. data/spec/integration/type/file_spec.rb +194 -4
  402. data/spec/integration/type/package_spec.rb +5 -1
  403. data/spec/integration/type/tidy_spec.rb +21 -9
  404. data/spec/integration/util/execution_spec.rb +22 -0
  405. data/spec/integration/util/windows/principal_spec.rb +201 -0
  406. data/spec/integration/util/windows/process_spec.rb +31 -0
  407. data/spec/{unit → integration}/util/windows/registry_spec.rb +91 -1
  408. data/spec/integration/util/windows/security_spec.rb +8 -8
  409. data/spec/integration/util/windows/user_spec.rb +1 -1
  410. data/spec/integration/util_spec.rb +49 -27
  411. data/spec/lib/puppet_spec/compiler.rb +17 -0
  412. data/spec/lib/puppet_spec/files.rb +2 -2
  413. data/spec/lib/puppet_spec/pops.rb +13 -0
  414. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  415. data/spec/shared_contexts/types_setup.rb +96 -0
  416. data/spec/unit/agent_spec.rb +1 -0
  417. data/spec/unit/application/agent_spec.rb +10 -0
  418. data/spec/unit/application/apply_spec.rb +9 -0
  419. data/spec/unit/application/lookup_spec.rb +138 -28
  420. data/spec/unit/configurer/downloader_spec.rb +5 -5
  421. data/spec/unit/configurer_spec.rb +271 -39
  422. data/spec/unit/data_providers/hiera_data_provider_spec.rb +182 -5
  423. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  424. data/spec/unit/defaults_spec.rb +15 -0
  425. data/spec/unit/environments_spec.rb +24 -4
  426. data/spec/unit/face/epp_face_spec.rb +2 -2
  427. data/spec/unit/face/parser_spec.rb +43 -2
  428. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  429. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  430. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  431. data/spec/unit/file_system_spec.rb +26 -0
  432. data/spec/unit/functions/assert_type_spec.rb +36 -2
  433. data/spec/unit/functions/defined_spec.rb +2 -2
  434. data/spec/unit/functions/epp_spec.rb +17 -9
  435. data/spec/unit/functions/inline_epp_spec.rb +4 -4
  436. data/spec/unit/functions/lookup_spec.rb +88 -16
  437. data/spec/unit/functions/regsubst_spec.rb +1 -1
  438. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  439. data/spec/unit/functions/step_spec.rb +113 -0
  440. data/spec/unit/functions/type_spec.rb +35 -0
  441. data/spec/unit/functions4_spec.rb +62 -6
  442. data/spec/unit/hiera/scope_spec.rb +5 -2
  443. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  444. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  445. data/spec/unit/indirector/indirection_spec.rb +1 -1
  446. data/spec/unit/indirector/json_spec.rb +1 -1
  447. data/spec/unit/info_service_spec.rb +94 -32
  448. data/spec/unit/module_spec.rb +14 -0
  449. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  450. data/spec/unit/network/authstore_spec.rb +1 -1
  451. data/spec/unit/network/http/connection_spec.rb +1 -0
  452. data/spec/unit/network/http/pool_spec.rb +30 -0
  453. data/spec/unit/node_spec.rb +8 -0
  454. data/spec/unit/parser/compiler_spec.rb +16 -18
  455. data/spec/unit/parser/scope_spec.rb +28 -11
  456. data/spec/unit/pops/evaluator/access_ops_spec.rb +7 -7
  457. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  458. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -2
  459. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  460. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  461. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  462. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  463. data/spec/unit/pops/loaders/loaders_spec.rb +127 -2
  464. data/spec/unit/pops/parser/lexer2_spec.rb +118 -3
  465. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  466. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  467. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  468. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  469. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  470. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  471. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  472. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  473. data/spec/unit/pops/types/type_calculator_spec.rb +275 -390
  474. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  475. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  476. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  477. data/spec/unit/pops/types/types_spec.rb +241 -0
  478. data/spec/unit/pops/validator/validator_spec.rb +159 -15
  479. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  480. data/spec/unit/provider/group/windows_adsi_spec.rb +8 -8
  481. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  482. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  483. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  484. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  485. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  486. data/spec/unit/provider/package/pip_spec.rb +88 -47
  487. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  488. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  489. data/spec/unit/provider/package/rpm_spec.rb +2 -25
  490. data/spec/unit/provider/package/yum_spec.rb +12 -1
  491. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  492. data/spec/unit/provider/service/debian_spec.rb +6 -24
  493. data/spec/unit/provider/service/init_spec.rb +11 -1
  494. data/spec/unit/provider/service/launchd_spec.rb +18 -25
  495. data/spec/unit/provider/service/systemd_spec.rb +25 -12
  496. data/spec/unit/provider/service/upstart_spec.rb +57 -0
  497. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  498. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  499. data/spec/unit/provider/user/windows_adsi_spec.rb +5 -5
  500. data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
  501. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  502. data/spec/unit/resource/catalog_spec.rb +33 -1
  503. data/spec/unit/resource/type_spec.rb +149 -7
  504. data/spec/unit/resource_spec.rb +99 -50
  505. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  506. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  507. data/spec/unit/transaction/report_spec.rb +27 -0
  508. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  509. data/spec/unit/transaction_spec.rb +5 -0
  510. data/spec/unit/type/file/checksum_spec.rb +6 -0
  511. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  512. data/spec/unit/type/file/content_spec.rb +12 -193
  513. data/spec/unit/type/file/source_spec.rb +211 -119
  514. data/spec/unit/type/file_spec.rb +133 -34
  515. data/spec/unit/type/interface_spec.rb +32 -0
  516. data/spec/unit/type/macauthorization_spec.rb +4 -1
  517. data/spec/unit/type/yumrepo_spec.rb +2 -2
  518. data/spec/unit/util/filetype_spec.rb +1 -1
  519. data/spec/unit/util/http_proxy_spec.rb +2 -2
  520. data/spec/unit/util/log/destinations_spec.rb +0 -2
  521. data/spec/unit/util/logging_spec.rb +69 -0
  522. data/spec/unit/util/multi_match_spec.rb +39 -0
  523. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  524. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  525. data/spec/unit/util/plist_spec.rb +110 -0
  526. data/spec/unit/util/resource_template_spec.rb +2 -2
  527. data/spec/unit/util/run_mode_spec.rb +27 -3
  528. data/spec/unit/util/windows/adsi_spec.rb +46 -38
  529. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  530. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  531. data/spec/unit/util/windows/sid_spec.rb +48 -11
  532. data/spec/unit/util_spec.rb +123 -13
  533. data/tasks/cfpropertylist.rake +15 -0
  534. metadata +3342 -3195
  535. data/lib/puppet/vendor/load_plist.rb +0 -1
  536. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  537. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  538. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  539. data/lib/puppet/vendor/plist/README +0 -36
  540. data/lib/puppet/vendor/plist/Rakefile +0 -144
  541. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  542. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  543. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  544. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  545. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  546. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  547. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  548. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  549. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  550. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  551. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  552. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  553. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  554. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  555. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  556. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  557. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  558. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
  559. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
  560. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
@@ -40,6 +40,15 @@ describe 'The type calculator' do
40
40
  Puppet::Pops::Types::TypeFactory.variant(*types)
41
41
  end
42
42
 
43
+ def type_alias_t(name, type_string)
44
+ type_expr = Puppet::Pops::Parser::EvaluatingParser.new.parse_string(type_string).current
45
+ Puppet::Pops::Types::TypeFactory.type_alias(name, type_expr)
46
+ end
47
+
48
+ def type_reference_t(name, *args)
49
+ Puppet::Pops::Types::TypeFactory.type_reference(name, args)
50
+ end
51
+
43
52
  def integer_t
44
53
  Puppet::Pops::Types::TypeFactory.integer
45
54
  end
@@ -88,6 +97,10 @@ describe 'The type calculator' do
88
97
  Puppet::Pops::Types::TypeFactory.optional(t)
89
98
  end
90
99
 
100
+ def type_t(t)
101
+ Puppet::Pops::Types::TypeFactory.type_type(t)
102
+ end
103
+
91
104
  def not_undef_t(t = nil)
92
105
  Puppet::Pops::Types::TypeFactory.not_undef(t)
93
106
  end
@@ -105,99 +118,6 @@ describe 'The type calculator' do
105
118
  Puppet::Pops::Types
106
119
  end
107
120
 
108
- shared_context 'types_setup' do
109
-
110
- # Do not include the special type Unit in this list
111
- def all_types
112
- [ Puppet::Pops::Types::PAnyType,
113
- Puppet::Pops::Types::PUndefType,
114
- Puppet::Pops::Types::PNotUndefType,
115
- Puppet::Pops::Types::PDataType,
116
- Puppet::Pops::Types::PScalarType,
117
- Puppet::Pops::Types::PStringType,
118
- Puppet::Pops::Types::PNumericType,
119
- Puppet::Pops::Types::PIntegerType,
120
- Puppet::Pops::Types::PFloatType,
121
- Puppet::Pops::Types::PRegexpType,
122
- Puppet::Pops::Types::PBooleanType,
123
- Puppet::Pops::Types::PCollectionType,
124
- Puppet::Pops::Types::PArrayType,
125
- Puppet::Pops::Types::PHashType,
126
- Puppet::Pops::Types::PRuntimeType,
127
- Puppet::Pops::Types::PHostClassType,
128
- Puppet::Pops::Types::PResourceType,
129
- Puppet::Pops::Types::PPatternType,
130
- Puppet::Pops::Types::PEnumType,
131
- Puppet::Pops::Types::PVariantType,
132
- Puppet::Pops::Types::PStructType,
133
- Puppet::Pops::Types::PTupleType,
134
- Puppet::Pops::Types::PCallableType,
135
- Puppet::Pops::Types::PType,
136
- Puppet::Pops::Types::POptionalType,
137
- Puppet::Pops::Types::PDefaultType,
138
- ]
139
- end
140
-
141
- def scalar_types
142
- # PVariantType is also scalar, if its types are all Scalar
143
- [
144
- Puppet::Pops::Types::PScalarType,
145
- Puppet::Pops::Types::PStringType,
146
- Puppet::Pops::Types::PNumericType,
147
- Puppet::Pops::Types::PIntegerType,
148
- Puppet::Pops::Types::PFloatType,
149
- Puppet::Pops::Types::PRegexpType,
150
- Puppet::Pops::Types::PBooleanType,
151
- Puppet::Pops::Types::PPatternType,
152
- Puppet::Pops::Types::PEnumType,
153
- ]
154
- end
155
-
156
- def numeric_types
157
- # PVariantType is also numeric, if its types are all numeric
158
- [
159
- Puppet::Pops::Types::PNumericType,
160
- Puppet::Pops::Types::PIntegerType,
161
- Puppet::Pops::Types::PFloatType,
162
- ]
163
- end
164
-
165
- def string_types
166
- # PVariantType is also string type, if its types are all compatible
167
- [
168
- Puppet::Pops::Types::PStringType,
169
- Puppet::Pops::Types::PPatternType,
170
- Puppet::Pops::Types::PEnumType,
171
- ]
172
- end
173
-
174
- def collection_types
175
- # PVariantType is also string type, if its types are all compatible
176
- [
177
- Puppet::Pops::Types::PCollectionType,
178
- Puppet::Pops::Types::PHashType,
179
- Puppet::Pops::Types::PArrayType,
180
- Puppet::Pops::Types::PStructType,
181
- Puppet::Pops::Types::PTupleType,
182
- ]
183
- end
184
-
185
- def data_compatible_types
186
- result = scalar_types
187
- result << Puppet::Pops::Types::PDataType
188
- result << array_t(types::PDataType::DEFAULT)
189
- result << types::TypeFactory.hash_of_data
190
- result << Puppet::Pops::Types::PUndefType
191
- result << not_undef_t(types::PDataType.new)
192
- result << constrained_tuple_t(range_t(0, nil), types::PDataType::DEFAULT)
193
- result
194
- end
195
-
196
- def type_from_class(c)
197
- c.is_a?(Class) ? c::DEFAULT : c
198
- end
199
- end
200
-
201
121
  context 'when inferring ruby' do
202
122
 
203
123
  it 'fixnum translates to PIntegerType' do
@@ -234,12 +154,16 @@ describe 'The type calculator' do
234
154
  expect(calculator.infer(/^a regular expression$/).class).to eq(Puppet::Pops::Types::PRegexpType)
235
155
  end
236
156
 
157
+ it 'iterable translates to PIteratorType' do
158
+ expect(calculator.infer(Puppet::Pops::Types::Iterable.on(1))).to be_a(Puppet::Pops::Types::PIteratorType)
159
+ end
160
+
237
161
  it 'nil translates to PUndefType' do
238
162
  expect(calculator.infer(nil).class).to eq(Puppet::Pops::Types::PUndefType)
239
163
  end
240
164
 
241
- it ':undef translates to PRuntimeType' do
242
- expect(calculator.infer(:undef).class).to eq(Puppet::Pops::Types::PRuntimeType)
165
+ it ':undef translates to PUndefType' do
166
+ expect(calculator.infer(:undef).class).to eq(Puppet::Pops::Types::PUndefType)
243
167
  end
244
168
 
245
169
  it 'an instance of class Foo translates to PRuntimeType[ruby, Foo]' do
@@ -455,35 +379,35 @@ describe 'The type calculator' do
455
379
  it 'computes given resource type commonality' do
456
380
  r1 = Puppet::Pops::Types::PResourceType.new('File', nil)
457
381
  r2 = Puppet::Pops::Types::PResourceType.new('File', nil)
458
- expect(calculator.string(calculator.common_type(r1, r2))).to eq('File')
382
+ expect(calculator.common_type(r1, r2).to_s).to eq('File')
459
383
 
460
384
 
461
385
  r2 = Puppet::Pops::Types::PResourceType.new('File', '/tmp/foo')
462
- expect(calculator.string(calculator.common_type(r1, r2))).to eq('File')
386
+ expect(calculator.common_type(r1, r2).to_s).to eq('File')
463
387
 
464
388
  r1 = Puppet::Pops::Types::PResourceType.new('File', '/tmp/foo')
465
- expect(calculator.string(calculator.common_type(r1, r2))).to eq("File['/tmp/foo']")
389
+ expect(calculator.common_type(r1, r2).to_s).to eq("File['/tmp/foo']")
466
390
 
467
391
  r1 = Puppet::Pops::Types::PResourceType.new('File', '/tmp/bar')
468
- expect(calculator.string(calculator.common_type(r1, r2))).to eq('File')
392
+ expect(calculator.common_type(r1, r2).to_s).to eq('File')
469
393
 
470
394
  r2 = Puppet::Pops::Types::PResourceType.new('Package', 'apache')
471
- expect(calculator.string(calculator.common_type(r1, r2))).to eq('Resource')
395
+ expect(calculator.common_type(r1, r2).to_s).to eq('Resource')
472
396
  end
473
397
 
474
398
  it 'computes given hostclass type commonality' do
475
399
  r1 = Puppet::Pops::Types::PHostClassType.new('foo')
476
400
  r2 = Puppet::Pops::Types::PHostClassType.new('foo')
477
- expect(calculator.string(calculator.common_type(r1, r2))).to eq('Class[foo]')
401
+ expect(calculator.common_type(r1, r2).to_s).to eq('Class[foo]')
478
402
 
479
403
  r2 = Puppet::Pops::Types::PHostClassType.new('bar')
480
- expect(calculator.string(calculator.common_type(r1, r2))).to eq('Class')
404
+ expect(calculator.common_type(r1, r2).to_s).to eq('Class')
481
405
 
482
406
  r2 = Puppet::Pops::Types::PHostClassType.new(nil)
483
- expect(calculator.string(calculator.common_type(r1, r2))).to eq('Class')
407
+ expect(calculator.common_type(r1, r2).to_s).to eq('Class')
484
408
 
485
409
  r1 = Puppet::Pops::Types::PHostClassType.new(nil)
486
- expect(calculator.string(calculator.common_type(r1, r2))).to eq('Class')
410
+ expect(calculator.common_type(r1, r2).to_s).to eq('Class')
487
411
  end
488
412
 
489
413
  context 'of strings' do
@@ -526,7 +450,7 @@ describe 'The type calculator' do
526
450
  common_t = calculator.common_type(t1,t2)
527
451
  expect(common_t.class).to eq(Puppet::Pops::Types::PPatternType)
528
452
  expect(common_t.patterns.map { |pr| pr.pattern }).to eq(['abc', 'xyz'])
529
- expect(calculator.string(common_t)).to eq('Pattern[/abc/, /xyz/]')
453
+ expect(common_t.to_s).to eq('Pattern[/abc/, /xyz/]')
530
454
  end
531
455
 
532
456
  it 'computes enum commonality to value set sum' do
@@ -686,6 +610,36 @@ describe 'The type calculator' do
686
610
  end
687
611
  end
688
612
 
613
+ context "for TypeReference, such that" do
614
+ it 'no other type is assignable' do
615
+ t = Puppet::Pops::Types::PTypeReferenceType::DEFAULT
616
+ all_instances = (all_types - [
617
+ Puppet::Pops::Types::PTypeReferenceType, # Avoid comparison with t
618
+ Puppet::Pops::Types::PVariantType, # DEFAULT contains no variants, so assignability is never tested and always true
619
+ Puppet::Pops::Types::PTypeAliasType # DEFAULT resolves to PTypeReferenceType::DEFAULT, i.e. t
620
+ ]).map {|c| c::DEFAULT }
621
+
622
+ # Add a non-empty variant
623
+ all_instances << variant_t(Puppet::Pops::Types::PAnyType::DEFAULT)
624
+ # Add a type alias that doesn't resolve to 't'
625
+ all_instances << type_alias_t('MyInt', 'Integer').resolve(Puppet::Pops::Types::TypeParser.new, nil)
626
+
627
+ all_instances.each { |i| expect(i).not_to be_assignable_to(t) }
628
+ end
629
+
630
+ it 'a TypeReference to the exact same type is assignable' do
631
+ expect(type_reference_t('Integer[0,10]')).to be_assignable_to(type_reference_t('Integer[0,10]'))
632
+ end
633
+
634
+ it 'a TypeReference to the different type is not assignable' do
635
+ expect(type_reference_t('String')).not_to be_assignable_to(type_reference_t('Integer'))
636
+ end
637
+
638
+ it 'a TypeReference to the different type is not assignable even if the referenced type is' do
639
+ expect(type_reference_t('Integer[1,2]')).not_to be_assignable_to(type_reference_t('Integer[0,3]'))
640
+ end
641
+ end
642
+
689
643
  context 'for Data, such that' do
690
644
  it 'all scalars + array and hash are assignable to Data' do
691
645
  t = Puppet::Pops::Types::PDataType::DEFAULT
@@ -793,7 +747,11 @@ describe 'The type calculator' do
793
747
  end
794
748
 
795
749
  it 'Collection is not assignable to any disjunct type' do
796
- tested_types = all_types - [Puppet::Pops::Types::PAnyType, Puppet::Pops::Types::POptionalType, Puppet::Pops::Types::PNotUndefType] - collection_types
750
+ tested_types = all_types - [
751
+ Puppet::Pops::Types::PAnyType,
752
+ Puppet::Pops::Types::POptionalType,
753
+ Puppet::Pops::Types::PNotUndefType,
754
+ Puppet::Pops::Types::PIterableType] - collection_types
797
755
  t = Puppet::Pops::Types::PCollectionType::DEFAULT
798
756
  tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
799
757
  end
@@ -815,6 +773,7 @@ describe 'The type calculator' do
815
773
  Puppet::Pops::Types::PAnyType,
816
774
  Puppet::Pops::Types::POptionalType,
817
775
  Puppet::Pops::Types::PNotUndefType,
776
+ Puppet::Pops::Types::PIterableType,
818
777
  Puppet::Pops::Types::PDataType] - collection_types
819
778
  t = Puppet::Pops::Types::PArrayType::DEFAULT
820
779
  tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
@@ -841,6 +800,7 @@ describe 'The type calculator' do
841
800
  Puppet::Pops::Types::PAnyType,
842
801
  Puppet::Pops::Types::POptionalType,
843
802
  Puppet::Pops::Types::PNotUndefType,
803
+ Puppet::Pops::Types::PIterableType,
844
804
  Puppet::Pops::Types::PDataType] - collection_types
845
805
  t = Puppet::Pops::Types::PHashType::DEFAULT
846
806
  tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
@@ -878,6 +838,7 @@ describe 'The type calculator' do
878
838
  Puppet::Pops::Types::PAnyType,
879
839
  Puppet::Pops::Types::POptionalType,
880
840
  Puppet::Pops::Types::PNotUndefType,
841
+ Puppet::Pops::Types::PIterableType,
881
842
  Puppet::Pops::Types::PDataType] - collection_types
882
843
  t = Puppet::Pops::Types::PTupleType::DEFAULT
883
844
  tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
@@ -899,6 +860,7 @@ describe 'The type calculator' do
899
860
  Puppet::Pops::Types::PAnyType,
900
861
  Puppet::Pops::Types::POptionalType,
901
862
  Puppet::Pops::Types::PNotUndefType,
863
+ Puppet::Pops::Types::PIterableType,
902
864
  Puppet::Pops::Types::PDataType] - collection_types
903
865
  t = Puppet::Pops::Types::PStructType::DEFAULT
904
866
  tested_types.each {|t2| expect(t).not_to be_assignable_to(t2::DEFAULT) }
@@ -970,35 +932,18 @@ describe 'The type calculator' do
970
932
  expect(calculator.assignable?(range_t(2,5), range_t(2,5))).to eq(true)
971
933
  end
972
934
 
973
- it 'should accept an equal reverse range' do
974
- expect(calculator.assignable?(range_t(2,5), range_t(5,2))).to eq(true)
975
- end
976
-
977
935
  it 'should accept a narrower range' do
978
936
  expect(calculator.assignable?(range_t(2,10), range_t(3,5))).to eq(true)
979
937
  end
980
938
 
981
- it 'should accept a narrower reverse range' do
982
- expect(calculator.assignable?(range_t(2,10), range_t(5,3))).to eq(true)
983
- end
984
-
985
939
  it 'should reject a wider range' do
986
940
  expect(calculator.assignable?(range_t(3,5), range_t(2,10))).to eq(false)
987
941
  end
988
942
 
989
- it 'should reject a wider reverse range' do
990
- expect(calculator.assignable?(range_t(3,5), range_t(10,2))).to eq(false)
991
- end
992
-
993
943
  it 'should reject a partially overlapping range' do
994
944
  expect(calculator.assignable?(range_t(3,5), range_t(2,4))).to eq(false)
995
945
  expect(calculator.assignable?(range_t(3,5), range_t(4,6))).to eq(false)
996
946
  end
997
-
998
- it 'should reject a partially overlapping reverse range' do
999
- expect(calculator.assignable?(range_t(3,5), range_t(4,2))).to eq(false)
1000
- expect(calculator.assignable?(range_t(3,5), range_t(6,4))).to eq(false)
1001
- end
1002
947
  end
1003
948
 
1004
949
  context 'when dealing with patterns' do
@@ -1340,6 +1285,122 @@ describe 'The type calculator' do
1340
1285
  expect(calculator.assignable?(r1, r2)).to eq(false)
1341
1286
  end
1342
1287
 
1288
+ context 'for TypeAlias, such that' do
1289
+ let!(:parser) { Puppet::Pops::Types::TypeParser.new }
1290
+
1291
+ it 'it is assignable to the type that it is an alias for' do
1292
+ t = type_alias_t('Alias', 'Integer').resolve(parser, nil)
1293
+ expect(calculator.assignable?(integer_t, t)).to be_truthy
1294
+ end
1295
+
1296
+ it 'the type that it is an alias for is assignable to it' do
1297
+ t = type_alias_t('Alias', 'Integer').resolve(parser, nil)
1298
+ expect(calculator.assignable?(t, integer_t)).to be_truthy
1299
+ end
1300
+
1301
+ it 'a recursive alias can be assignable from a conformant type with any depth' do
1302
+ scope = mock
1303
+
1304
+ t = type_alias_t('Tree', 'Hash[String,Variant[String,Tree]]')
1305
+ loader = mock
1306
+ loader.expects(:load).with(:type, 'tree').returns t
1307
+
1308
+ Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object).with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).at_most_once.returns loader
1309
+
1310
+ t.resolve(parser, scope)
1311
+ expect(calculator.assignable?(t, parser.parse('Hash[String,Variant[String,Hash[String,Variant[String,String]]]]'))).to be_truthy
1312
+ end
1313
+
1314
+
1315
+ it 'similar recursive aliases are assignable' do
1316
+ scope = mock
1317
+
1318
+ t1 = type_alias_t('Tree1', 'Hash[String,Variant[String,Tree1]]')
1319
+ t2 = type_alias_t('Tree2', 'Hash[String,Variant[String,Tree2]]')
1320
+ loader = mock
1321
+ loader.expects(:load).with(:type, 'tree1').returns t1
1322
+ loader.expects(:load).with(:type, 'tree2').returns t2
1323
+
1324
+ Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object).with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).at_least_once.returns loader
1325
+
1326
+ t1.resolve(parser, scope)
1327
+ t2.resolve(parser, scope)
1328
+ expect(calculator.assignable?(t1, t2)).to be_truthy
1329
+ end
1330
+
1331
+ it 'crossing recursive aliases are assignable' do
1332
+ scope = mock
1333
+
1334
+ t1 = type_alias_t('Tree1', 'Hash[String,Variant[String,Tree2]]')
1335
+ t2 = type_alias_t('Tree2', 'Hash[String,Variant[String,Tree1]]')
1336
+ loader = mock
1337
+ loader.expects(:load).with(:type, 'tree1').returns t1
1338
+ loader.expects(:load).with(:type, 'tree2').returns t2
1339
+ loader.expects(:is_a?).with(Puppet::Pops::Loader::Loader).returns true
1340
+
1341
+ Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object).with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).at_least_once.returns loader
1342
+
1343
+ t1.resolve(parser, scope)
1344
+ t2.resolve(parser, scope)
1345
+ expect(calculator.assignable?(t1, t2)).to be_truthy
1346
+ end
1347
+
1348
+ it 'Type[T] is assignable to Type[AT] when AT is an alias for T' do
1349
+ scope = mock
1350
+
1351
+ ta = type_alias_t('PositiveInteger', 'Integer[0,default]')
1352
+ loader = mock
1353
+ loader.expects(:load).with(:type, 'positiveinteger').returns ta
1354
+ Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object)
1355
+ .with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).returns loader
1356
+
1357
+ t1 = type_t(range_t(0, :default))
1358
+ t2 = parser.parse('Type[PositiveInteger]', scope)
1359
+ expect(calculator.assignable?(t2, t1)).to be_truthy
1360
+ end
1361
+
1362
+ it 'Type[T] is assignable to AT when AT is an alias for Type[T]' do
1363
+ scope = mock
1364
+
1365
+ ta = type_alias_t('PositiveIntegerType', 'Type[Integer[0,default]]')
1366
+ loader = mock
1367
+ loader.expects(:load).with(:type, 'positiveintegertype').returns ta
1368
+ Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object)
1369
+ .with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).returns loader
1370
+
1371
+ t1 = type_t(range_t(0, :default))
1372
+ t2 = parser.parse('PositiveIntegerType', scope)
1373
+ expect(calculator.assignable?(t2, t1)).to be_truthy
1374
+ end
1375
+
1376
+ it 'Type[Type[T]] is assignable to Type[Type[AT]] when AT is an alias for T' do
1377
+ scope = mock
1378
+
1379
+ ta = type_alias_t('PositiveInteger', 'Integer[0,default]')
1380
+ loader = mock
1381
+ loader.expects(:load).with(:type, 'positiveinteger').returns ta
1382
+ Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object)
1383
+ .with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).returns loader
1384
+
1385
+ t1 = type_t(type_t(range_t(0, :default)))
1386
+ t2 = parser.parse('Type[Type[PositiveInteger]]', scope)
1387
+ expect(calculator.assignable?(t2, t1)).to be_truthy
1388
+ end
1389
+
1390
+ it 'Type[Type[T]] is assignable to Type[AT] when AT is an alias for Type[T]' do
1391
+ scope = mock
1392
+
1393
+ ta = type_alias_t('PositiveIntegerType', 'Type[Integer[0,default]]')
1394
+ loader = mock
1395
+ loader.expects(:load).with(:type, 'positiveintegertype').returns ta
1396
+ Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object)
1397
+ .with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).returns loader
1398
+
1399
+ t1 = type_t(type_t(range_t(0, :default)))
1400
+ t2 = parser.parse('Type[PositiveIntegerType]', scope)
1401
+ expect(calculator.assignable?(t2, t1)).to be_truthy
1402
+ end
1403
+ end
1343
1404
  end
1344
1405
 
1345
1406
  context 'when testing if x is instance of type t' do
@@ -1357,8 +1418,16 @@ describe 'The type calculator' do
1357
1418
  end
1358
1419
  end
1359
1420
 
1360
- it "should consider :undef to be instance of Runtime['ruby', 'Symbol]" do
1361
- expect(calculator.instance?(Puppet::Pops::Types::PRuntimeType.new(:ruby, 'Symbol'), :undef)).to eq(true)
1421
+ it "should infer :undef to be Undef" do
1422
+ expect(calculator.infer(:undef)).to be_assignable_to(undef_t)
1423
+ end
1424
+
1425
+ it "should not consider :default to be instance of Runtime['ruby', 'Symbol]" do
1426
+ expect(calculator.instance?(Puppet::Pops::Types::PRuntimeType.new(:ruby, 'Symbol'), :default)).to eq(false)
1427
+ end
1428
+
1429
+ it "should not consider :undef to be instance of Runtime['ruby', 'Symbol]" do
1430
+ expect(calculator.instance?(Puppet::Pops::Types::PRuntimeType.new(:ruby, 'Symbol'), :undef)).to eq(false)
1362
1431
  end
1363
1432
 
1364
1433
  it 'should consider :undef to be instance of an Optional type' do
@@ -1608,6 +1677,49 @@ describe 'The type calculator' do
1608
1677
  expect(calculator.instance?(callable_t(String), f)).to be_truthy
1609
1678
  end
1610
1679
  end
1680
+
1681
+ context 'and t is a TypeAlias' do
1682
+ let!(:parser) { Puppet::Pops::Types::TypeParser.new }
1683
+
1684
+ it 'should consider x an instance of the aliased simple type' do
1685
+ t = type_alias_t('Alias', 'Integer').resolve(parser, nil)
1686
+ expect(calculator.instance?(t, 15)).to be_truthy
1687
+ end
1688
+
1689
+ it 'should consider x an instance of the aliased parameterized type' do
1690
+ t = type_alias_t('Alias', 'Integer[0,20]').resolve(parser, nil)
1691
+ expect(calculator.instance?(t, 15)).to be_truthy
1692
+ end
1693
+
1694
+ it 'should consider x an instance of the aliased type that uses self recursion' do
1695
+ scope = mock
1696
+
1697
+ t = type_alias_t('Tree', 'Hash[String,Variant[String,Tree]]')
1698
+ loader = mock
1699
+ loader.expects(:load).with(:type, 'tree').returns t
1700
+
1701
+ Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object).with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).at_most_once.returns loader
1702
+
1703
+ t.resolve(parser, scope)
1704
+ expect(calculator.instance?(t, {'a'=>{'aa'=>{'aaa'=>'aaaa'}}, 'b'=>'bb'})).to be_truthy
1705
+ end
1706
+
1707
+ it 'should consider x an instance of the aliased type that uses contains an alias that causes self recursion' do
1708
+ scope = mock
1709
+
1710
+ t1 = type_alias_t('Tree', 'Hash[String,Variant[String,OtherTree]]')
1711
+ t2 = type_alias_t('OtherTree', 'Hash[String,Tree]')
1712
+ loader = mock
1713
+ loader.expects(:load).with(:type, 'tree').returns t1
1714
+ loader.expects(:load).with(:type, 'othertree').returns t2
1715
+ loader.expects(:is_a?).with(Puppet::Pops::Loader::Loader).returns true
1716
+
1717
+ Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object).with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).at_least_once.returns loader
1718
+
1719
+ t1.resolve(parser, scope)
1720
+ expect(calculator.instance?(t1, {'a'=>{'aa'=>{'aaa'=>'aaaa'}}, 'b'=>'bb'})).to be_truthy
1721
+ end
1722
+ end
1611
1723
  end
1612
1724
 
1613
1725
  context 'when converting a ruby class' do
@@ -1653,235 +1765,6 @@ describe 'The type calculator' do
1653
1765
  end
1654
1766
  end
1655
1767
 
1656
- context 'when representing the type as string' do
1657
- it 'should yield \'Type\' for PType' do
1658
- expect(calculator.string(Puppet::Pops::Types::PType::DEFAULT)).to eq('Type')
1659
- end
1660
-
1661
- it 'should yield \'Object\' for PAnyType' do
1662
- expect(calculator.string(Puppet::Pops::Types::PAnyType::DEFAULT)).to eq('Any')
1663
- end
1664
-
1665
- it 'should yield \'Scalar\' for PScalarType' do
1666
- expect(calculator.string(Puppet::Pops::Types::PScalarType::DEFAULT)).to eq('Scalar')
1667
- end
1668
-
1669
- it 'should yield \'Boolean\' for PBooleanType' do
1670
- expect(calculator.string(Puppet::Pops::Types::PBooleanType::DEFAULT)).to eq('Boolean')
1671
- end
1672
-
1673
- it 'should yield \'Data\' for PDataType' do
1674
- expect(calculator.string(Puppet::Pops::Types::PDataType::DEFAULT)).to eq('Data')
1675
- end
1676
-
1677
- it 'should yield \'Numeric\' for PNumericType' do
1678
- expect(calculator.string(Puppet::Pops::Types::PNumericType::DEFAULT)).to eq('Numeric')
1679
- end
1680
-
1681
- it 'should yield \'Integer\' and from/to for PIntegerType' do
1682
- int_T = Puppet::Pops::Types::PIntegerType
1683
- expect(calculator.string(int_T::DEFAULT)).to eq('Integer')
1684
- int = int_T.new(1, 1)
1685
- expect(calculator.string(int)).to eq('Integer[1, 1]')
1686
- int = int_T.new(1, 2)
1687
- expect(calculator.string(int)).to eq('Integer[1, 2]')
1688
- int = int_T.new(nil, 2)
1689
- expect(calculator.string(int)).to eq('Integer[default, 2]')
1690
- int = int_T.new(2, nil)
1691
- expect(calculator.string(int)).to eq('Integer[2, default]')
1692
- end
1693
-
1694
- it 'should yield \'Float\' for PFloatType' do
1695
- expect(calculator.string(Puppet::Pops::Types::PFloatType::DEFAULT)).to eq('Float')
1696
- end
1697
-
1698
- it 'should yield \'Regexp\' for PRegexpType' do
1699
- expect(calculator.string(Puppet::Pops::Types::PRegexpType::DEFAULT)).to eq('Regexp')
1700
- end
1701
-
1702
- it 'should yield \'Regexp[/pat/]\' for parameterized PRegexpType' do
1703
- t = Puppet::Pops::Types::PRegexpType.new('a/b')
1704
- expect(calculator.string(t)).to eq('Regexp[/a\/b/]')
1705
- end
1706
-
1707
- it 'should yield \'String\' for PStringType' do
1708
- expect(calculator.string(Puppet::Pops::Types::PStringType::DEFAULT)).to eq('String')
1709
- end
1710
-
1711
- it 'should yield \'String\' for PStringType with multiple values' do
1712
- expect(calculator.string(string_t('a', 'b', 'c'))).to eq('String')
1713
- end
1714
-
1715
- it 'should yield \'String\' and from/to for PStringType' do
1716
- string_T = Puppet::Pops::Types::PStringType
1717
- expect(calculator.string(string_T.new(range_t(1,1)))).to eq('String[1, 1]')
1718
- expect(calculator.string(string_T.new(range_t(1,2)))).to eq('String[1, 2]')
1719
- expect(calculator.string(string_T.new(range_t(:default, 2)))).to eq('String[default, 2]')
1720
- expect(calculator.string(string_T.new(range_t(2, :default)))).to eq('String[2, default]')
1721
- end
1722
-
1723
- it 'should yield \'Array[Integer]\' for PArrayType[PIntegerType]' do
1724
- t = Puppet::Pops::Types::PArrayType.new(Puppet::Pops::Types::PIntegerType::DEFAULT)
1725
- expect(calculator.string(t)).to eq('Array[Integer]')
1726
- end
1727
-
1728
- it 'should yield \'Array[Unit, 0, 0]\' for an empty array' do
1729
- t = empty_array_t
1730
- expect(calculator.string(t)).to eq('Array[Unit, 0, 0]')
1731
- end
1732
-
1733
- it 'should yield \'Collection\' and from/to for PCollectionType' do
1734
- expect(calculator.string(collection_t(range_t(1,1)))).to eq('Collection[1, 1]')
1735
- expect(calculator.string(collection_t(range_t(1,2)))).to eq('Collection[1, 2]')
1736
- expect(calculator.string(collection_t(range_t(:default, 2)))).to eq('Collection[default, 2]')
1737
- expect(calculator.string(collection_t(range_t(2, :default)))).to eq('Collection[2, default]')
1738
- end
1739
-
1740
- it 'should yield \'Array\' and from/to for PArrayType' do
1741
- expect(calculator.string(array_t(string_t, range_t(1,1)))).to eq('Array[String, 1, 1]')
1742
- expect(calculator.string(array_t(string_t, range_t(1,2)))).to eq('Array[String, 1, 2]')
1743
- expect(calculator.string(array_t(string_t, range_t(:default, 2)))).to eq('Array[String, default, 2]')
1744
- expect(calculator.string(array_t(string_t, range_t(2, :default)))).to eq('Array[String, 2, default]')
1745
- end
1746
-
1747
- it 'should yield \'Tuple[Integer]\' for PTupleType[PIntegerType]' do
1748
- t = Puppet::Pops::Types::PTupleType.new([Puppet::Pops::Types::PIntegerType::DEFAULT])
1749
- expect(calculator.string(t)).to eq('Tuple[Integer]')
1750
- end
1751
-
1752
- it 'should yield \'Tuple[T, T,..]\' for PTupleType[T, T, ...]' do
1753
- t = Puppet::Pops::Types::PTupleType.new([Puppet::Pops::Types::PIntegerType::DEFAULT, Puppet::Pops::Types::PIntegerType::DEFAULT, Puppet::Pops::Types::PStringType::DEFAULT])
1754
- expect(calculator.string(t)).to eq('Tuple[Integer, Integer, String]')
1755
- end
1756
-
1757
- it 'should yield \'Tuple\' and from/to for PTupleType' do
1758
- expect(calculator.string(constrained_tuple_t(range_t(1,1), string_t))).to eq('Tuple[String, 1, 1]')
1759
- expect(calculator.string(constrained_tuple_t(range_t(1,2), string_t))).to eq('Tuple[String, 1, 2]')
1760
- expect(calculator.string(constrained_tuple_t(range_t(:default, 2), string_t))).to eq('Tuple[String, 0, 2]')
1761
- expect(calculator.string(constrained_tuple_t(range_t(2, :default), string_t))).to eq('Tuple[String, 2, default]')
1762
- end
1763
-
1764
- it 'should yield \'Struct\' and details for PStructType' do
1765
- struct_t = struct_t({'a'=>Integer, 'b'=>String})
1766
- expect(calculator.string(struct_t)).to eq("Struct[{'a'=>Integer, 'b'=>String}]")
1767
- struct_t = struct_t({})
1768
- expect(calculator.string(struct_t)).to eq('Struct')
1769
- end
1770
-
1771
- it 'should yield \'Hash[String, Integer]\' for PHashType[PStringType, PIntegerType]' do
1772
- t = Puppet::Pops::Types::PHashType.new(Puppet::Pops::Types::PStringType::DEFAULT, Puppet::Pops::Types::PIntegerType::DEFAULT)
1773
- expect(calculator.string(t)).to eq('Hash[String, Integer]')
1774
- end
1775
-
1776
- it 'should yield \'Hash\' and from/to for PHashType' do
1777
- expect(calculator.string(hash_t(string_t, string_t, range_t(1,1)))).to eq('Hash[String, String, 1, 1]')
1778
- expect(calculator.string(hash_t(string_t, string_t, range_t(1,2)))).to eq('Hash[String, String, 1, 2]')
1779
- expect(calculator.string(hash_t(string_t, string_t, range_t(:default, 2)))).to eq('Hash[String, String, default, 2]')
1780
- expect(calculator.string(hash_t(string_t, string_t, range_t(2, :default)))).to eq('Hash[String, String, 2, default]')
1781
- end
1782
-
1783
- it "should yield 'Class' for a PHostClassType" do
1784
- t = Puppet::Pops::Types::PHostClassType::DEFAULT
1785
- expect(calculator.string(t)).to eq('Class')
1786
- end
1787
-
1788
- it "should yield 'Class[x]' for a PHostClassType[x]" do
1789
- t = Puppet::Pops::Types::PHostClassType.new('x')
1790
- expect(calculator.string(t)).to eq('Class[x]')
1791
- end
1792
-
1793
- it "should yield 'Resource' for a PResourceType" do
1794
- t = Puppet::Pops::Types::PResourceType::DEFAULT
1795
- expect(calculator.string(t)).to eq('Resource')
1796
- end
1797
-
1798
- it 'should yield \'File\' for a PResourceType[\'File\']' do
1799
- t = Puppet::Pops::Types::PResourceType.new('File')
1800
- expect(calculator.string(t)).to eq('File')
1801
- end
1802
-
1803
- it "should yield 'File['/tmp/foo']' for a PResourceType['File', '/tmp/foo']" do
1804
- t = Puppet::Pops::Types::PResourceType.new('File', '/tmp/foo')
1805
- expect(calculator.string(t)).to eq("File['/tmp/foo']")
1806
- end
1807
-
1808
- it "should yield 'Enum[s,...]' for a PEnumType[s,...]" do
1809
- t = enum_t('a', 'b', 'c')
1810
- expect(calculator.string(t)).to eq("Enum['a', 'b', 'c']")
1811
- end
1812
-
1813
- it "should yield 'Pattern[/pat/,...]' for a PPatternType['pat',...]" do
1814
- t = pattern_t('a')
1815
- t2 = pattern_t('a', 'b', 'c')
1816
- expect(calculator.string(t)).to eq('Pattern[/a/]')
1817
- expect(calculator.string(t2)).to eq('Pattern[/a/, /b/, /c/]')
1818
- end
1819
-
1820
- it "should escape special characters in the string for a PPatternType['pat',...]" do
1821
- t = pattern_t('a/b')
1822
- expect(calculator.string(t)).to eq("Pattern[/a\\/b/]")
1823
- end
1824
-
1825
- it "should yield 'Variant[t1,t2,...]' for a PVariantType[t1, t2,...]" do
1826
- t1 = string_t
1827
- t2 = integer_t
1828
- t3 = pattern_t('a')
1829
- t = variant_t(t1, t2, t3)
1830
- expect(calculator.string(t)).to eq('Variant[String, Integer, Pattern[/a/]]')
1831
- end
1832
-
1833
- it "should yield 'Callable' for generic callable" do
1834
- expect(calculator.string(all_callables_t)).to eql('Callable')
1835
- end
1836
-
1837
- it "should yield 'Callable[0,0]' for callable without params" do
1838
- expect(calculator.string(callable_t)).to eql('Callable[0, 0]')
1839
- end
1840
-
1841
- it "should yield 'Callable[t,t]' for callable with typed parameters" do
1842
- expect(calculator.string(callable_t(String, Integer))).to eql('Callable[String, Integer]')
1843
- end
1844
-
1845
- it "should yield 'Callable[t,min,max]' for callable with size constraint (infinite max)" do
1846
- expect(calculator.string(callable_t(String, 0))).to eql('Callable[String, 0, default]')
1847
- end
1848
-
1849
- it "should yield 'Callable[t,min,max]' for callable with size constraint (capped max)" do
1850
- expect(calculator.string(callable_t(String, 0, 3))).to eql('Callable[String, 0, 3]')
1851
- end
1852
-
1853
- it "should yield 'Callable[min,max]' callable with size > 0" do
1854
- expect(calculator.string(callable_t(0, 0))).to eql('Callable[0, 0]')
1855
- expect(calculator.string(callable_t(0, 1))).to eql('Callable[0, 1]')
1856
- expect(calculator.string(callable_t(0, :default))).to eql('Callable[0, default]')
1857
- end
1858
-
1859
- it "should yield 'Callable[Callable]' for callable with block" do
1860
- expect(calculator.string(callable_t(all_callables_t))).to eql('Callable[0, 0, Callable]')
1861
- expect(calculator.string(callable_t(string_t, all_callables_t))).to eql('Callable[String, Callable]')
1862
- expect(calculator.string(callable_t(string_t, 1,1, all_callables_t))).to eql('Callable[String, 1, 1, Callable]')
1863
- end
1864
-
1865
- it 'should yield Unit for a Unit type' do
1866
- expect(calculator.string(unit_t)).to eql('Unit')
1867
- end
1868
-
1869
- it "should yield 'NotUndef' for a PNotUndefType" do
1870
- t = not_undef_t
1871
- expect(calculator.string(t)).to eq('NotUndef')
1872
- end
1873
-
1874
- it "should yield 'NotUndef[T]' for a PNotUndefType[T]" do
1875
- t = not_undef_t(data_t)
1876
- expect(calculator.string(t)).to eq('NotUndef[Data]')
1877
- end
1878
-
1879
- it "should yield 'NotUndef['string']' for a PNotUndefType['string']" do
1880
- t = not_undef_t('hey')
1881
- expect(calculator.string(t)).to eq("NotUndef['hey']")
1882
- end
1883
- end
1884
-
1885
1768
  context 'when processing meta type' do
1886
1769
  it 'should infer PType as the type of all other types' do
1887
1770
  ptype = Puppet::Pops::Types::PType
@@ -1897,6 +1780,7 @@ describe 'The type calculator' do
1897
1780
  expect(calculator.infer(Puppet::Pops::Types::PCollectionType::DEFAULT).is_a?(ptype)).to eq(true)
1898
1781
  expect(calculator.infer(Puppet::Pops::Types::PArrayType::DEFAULT ).is_a?(ptype)).to eq(true)
1899
1782
  expect(calculator.infer(Puppet::Pops::Types::PHashType::DEFAULT ).is_a?(ptype)).to eq(true)
1783
+ expect(calculator.infer(Puppet::Pops::Types::PIterableType::DEFAULT ).is_a?(ptype)).to eq(true)
1900
1784
  expect(calculator.infer(Puppet::Pops::Types::PRuntimeType::DEFAULT ).is_a?(ptype)).to eq(true)
1901
1785
  expect(calculator.infer(Puppet::Pops::Types::PHostClassType::DEFAULT ).is_a?(ptype)).to eq(true)
1902
1786
  expect(calculator.infer(Puppet::Pops::Types::PResourceType::DEFAULT ).is_a?(ptype)).to eq(true)
@@ -1909,38 +1793,39 @@ describe 'The type calculator' do
1909
1793
  end
1910
1794
 
1911
1795
  it 'should infer PType as the type of all other types' do
1912
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PUndefType::DEFAULT ))).to eq('Type[Undef]')
1913
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PDataType::DEFAULT ))).to eq('Type[Data]')
1914
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PScalarType::DEFAULT ))).to eq('Type[Scalar]')
1915
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PStringType::DEFAULT ))).to eq('Type[String]')
1916
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PNumericType::DEFAULT ))).to eq('Type[Numeric]')
1917
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PIntegerType::DEFAULT ))).to eq('Type[Integer]')
1918
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PFloatType::DEFAULT ))).to eq('Type[Float]')
1919
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PRegexpType::DEFAULT ))).to eq('Type[Regexp]')
1920
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PBooleanType::DEFAULT ))).to eq('Type[Boolean]')
1921
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PCollectionType::DEFAULT))).to eq('Type[Collection]')
1922
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PArrayType::DEFAULT ))).to eq('Type[Array[?]]')
1923
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PHashType::DEFAULT ))).to eq('Type[Hash[?, ?]]')
1924
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PRuntimeType::DEFAULT ))).to eq('Type[Runtime[?, ?]]')
1925
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PHostClassType::DEFAULT ))).to eq('Type[Class]')
1926
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PResourceType::DEFAULT ))).to eq('Type[Resource]')
1927
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PEnumType::DEFAULT ))).to eq('Type[Enum]')
1928
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PVariantType::DEFAULT ))).to eq('Type[Variant]')
1929
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PPatternType::DEFAULT ))).to eq('Type[Pattern]')
1930
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PTupleType::DEFAULT ))).to eq('Type[Tuple]')
1931
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::POptionalType::DEFAULT ))).to eq('Type[Optional]')
1932
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PCallableType::DEFAULT ))).to eq('Type[Callable]')
1796
+ expect(calculator.infer(Puppet::Pops::Types::PUndefType::DEFAULT ).to_s).to eq('Type[Undef]')
1797
+ expect(calculator.infer(Puppet::Pops::Types::PDataType::DEFAULT ).to_s).to eq('Type[Data]')
1798
+ expect(calculator.infer(Puppet::Pops::Types::PScalarType::DEFAULT ).to_s).to eq('Type[Scalar]')
1799
+ expect(calculator.infer(Puppet::Pops::Types::PStringType::DEFAULT ).to_s).to eq('Type[String]')
1800
+ expect(calculator.infer(Puppet::Pops::Types::PNumericType::DEFAULT ).to_s).to eq('Type[Numeric]')
1801
+ expect(calculator.infer(Puppet::Pops::Types::PIntegerType::DEFAULT ).to_s).to eq('Type[Integer]')
1802
+ expect(calculator.infer(Puppet::Pops::Types::PFloatType::DEFAULT ).to_s).to eq('Type[Float]')
1803
+ expect(calculator.infer(Puppet::Pops::Types::PRegexpType::DEFAULT ).to_s).to eq('Type[Regexp]')
1804
+ expect(calculator.infer(Puppet::Pops::Types::PBooleanType::DEFAULT ).to_s).to eq('Type[Boolean]')
1805
+ expect(calculator.infer(Puppet::Pops::Types::PCollectionType::DEFAULT).to_s).to eq('Type[Collection]')
1806
+ expect(calculator.infer(Puppet::Pops::Types::PArrayType::DEFAULT ).to_s).to eq('Type[Array[?]]')
1807
+ expect(calculator.infer(Puppet::Pops::Types::PHashType::DEFAULT ).to_s).to eq('Type[Hash[?, ?]]')
1808
+ expect(calculator.infer(Puppet::Pops::Types::PIterableType::DEFAULT ).to_s).to eq('Type[Iterable]')
1809
+ expect(calculator.infer(Puppet::Pops::Types::PRuntimeType::DEFAULT ).to_s).to eq('Type[Runtime[?, ?]]')
1810
+ expect(calculator.infer(Puppet::Pops::Types::PHostClassType::DEFAULT ).to_s).to eq('Type[Class]')
1811
+ expect(calculator.infer(Puppet::Pops::Types::PResourceType::DEFAULT ).to_s).to eq('Type[Resource]')
1812
+ expect(calculator.infer(Puppet::Pops::Types::PEnumType::DEFAULT ).to_s).to eq('Type[Enum]')
1813
+ expect(calculator.infer(Puppet::Pops::Types::PVariantType::DEFAULT ).to_s).to eq('Type[Variant]')
1814
+ expect(calculator.infer(Puppet::Pops::Types::PPatternType::DEFAULT ).to_s).to eq('Type[Pattern]')
1815
+ expect(calculator.infer(Puppet::Pops::Types::PTupleType::DEFAULT ).to_s).to eq('Type[Tuple]')
1816
+ expect(calculator.infer(Puppet::Pops::Types::POptionalType::DEFAULT ).to_s).to eq('Type[Optional]')
1817
+ expect(calculator.infer(Puppet::Pops::Types::PCallableType::DEFAULT ).to_s).to eq('Type[Callable]')
1933
1818
 
1934
1819
  expect(calculator.infer(Puppet::Pops::Types::PResourceType.new('foo::fee::fum')).to_s).to eq('Type[Foo::Fee::Fum]')
1935
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PResourceType.new('foo::fee::fum')))).to eq('Type[Foo::Fee::Fum]')
1820
+ expect(calculator.infer(Puppet::Pops::Types::PResourceType.new('foo::fee::fum')).to_s).to eq('Type[Foo::Fee::Fum]')
1936
1821
  expect(calculator.infer(Puppet::Pops::Types::PResourceType.new('Foo::Fee::Fum')).to_s).to eq('Type[Foo::Fee::Fum]')
1937
1822
  end
1938
1823
 
1939
1824
  it "computes the common type of PType's type parameter" do
1940
1825
  int_t = Puppet::Pops::Types::PIntegerType::DEFAULT
1941
1826
  string_t = Puppet::Pops::Types::PStringType::DEFAULT
1942
- expect(calculator.string(calculator.infer([int_t]))).to eq('Array[Type[Integer], 1, 1]')
1943
- expect(calculator.string(calculator.infer([int_t, string_t]))).to eq('Array[Type[Scalar], 2, 2]')
1827
+ expect(calculator.infer([int_t]).to_s).to eq('Array[Type[Integer], 1, 1]')
1828
+ expect(calculator.infer([int_t, string_t]).to_s).to eq('Array[Type[Scalar], 2, 2]')
1944
1829
  end
1945
1830
 
1946
1831
  it 'should infer PType as the type of ruby classes' do
@@ -1979,23 +1864,23 @@ describe 'The type calculator' do
1979
1864
  end
1980
1865
  end
1981
1866
 
1982
- context 'when asking for an enumerable ' do
1983
- it 'should produce an enumerable for an Integer range that is not infinite' do
1867
+ context 'when asking for an iterable ' do
1868
+ it 'should produce an iterable for an Integer range that is finite' do
1984
1869
  t = Puppet::Pops::Types::PIntegerType.new(1, 10)
1985
- expect(calculator.enumerable(t).respond_to?(:each)).to eq(true)
1870
+ expect(calculator.iterable(t).respond_to?(:each)).to eq(true)
1986
1871
  end
1987
1872
 
1988
- it 'should not produce an enumerable for an Integer range that has an infinite side' do
1873
+ it 'should not produce an iterable for an Integer range that has an infinite side' do
1989
1874
  t = Puppet::Pops::Types::PIntegerType.new(nil, 10)
1990
- expect(calculator.enumerable(t)).to eq(nil)
1875
+ expect(calculator.iterable(t)).to eq(nil)
1991
1876
 
1992
1877
  t = Puppet::Pops::Types::PIntegerType.new(1, nil)
1993
- expect(calculator.enumerable(t)).to eq(nil)
1878
+ expect(calculator.iterable(t)).to eq(nil)
1994
1879
  end
1995
1880
 
1996
- it 'all but Integer range are not enumerable' do
1881
+ it 'all but Integer range are not iterable' do
1997
1882
  [Object, Numeric, Float, String, Regexp, Array, Hash].each do |t|
1998
- expect(calculator.enumerable(calculator.type(t))).to eq(nil)
1883
+ expect(calculator.iterable(calculator.type(t))).to eq(nil)
1999
1884
  end
2000
1885
  end
2001
1886
  end
@@ -2029,16 +1914,16 @@ describe 'The type calculator' do
2029
1914
 
2030
1915
  it 'ensures that Struct key types are not generalized' do
2031
1916
  generic = struct_t({'a' => object_t}).generalize
2032
- expect(calculator.string(generic)).to eq("Struct[{'a'=>Any}]")
1917
+ expect(generic.to_s).to eq("Struct[{'a' => Any}]")
2033
1918
  generic = struct_t({not_undef_t('a') => object_t}).generalize
2034
- expect(calculator.string(generic)).to eq("Struct[{NotUndef['a']=>Any}]")
1919
+ expect(generic.to_s).to eq("Struct[{NotUndef['a'] => Any}]")
2035
1920
  generic = struct_t({optional_t('a') => string_t}).generalize
2036
- expect(calculator.string(generic)).to eq("Struct[{Optional['a']=>String}]")
1921
+ expect(generic.to_s).to eq("Struct[{Optional['a'] => String}]")
2037
1922
  end
2038
1923
 
2039
1924
  it 'ensures that Struct value types are generalized' do
2040
1925
  generic = struct_t({'a' => range_t(1, 3)}).generalize
2041
- expect(calculator.string(generic)).to eq("Struct[{'a'=>Integer}]")
1926
+ expect(generic.to_s).to eq("Struct[{'a' => Integer}]")
2042
1927
  end
2043
1928
 
2044
1929
  it "does not reduce by combining types when using infer_set" do