puppet 4.3.2 → 4.4.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (487) hide show
  1. checksums.yaml +4 -4
  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/debian/README.source +1 -1
  9. data/ext/debian/control +1 -1
  10. data/ext/debian/copyright +4 -4
  11. data/ext/debian/puppetmaster.README.debian +11 -9
  12. data/ext/emacs/puppet-mode.el +1 -1
  13. data/ext/envpuppet +2 -2
  14. data/ext/ips/puppetagent.xml +1 -1
  15. data/ext/ips/puppetmaster.xml +1 -1
  16. data/ext/project_data.yaml +8 -0
  17. data/ext/puppet-test +3 -3
  18. data/ext/rack/example-passenger-vhost.conf +1 -1
  19. data/ext/redhat/puppet.spec.erb +2 -2
  20. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  21. data/ext/solaris/pkginfo +1 -1
  22. data/ext/solaris/smf/puppet.xml +1 -1
  23. data/ext/suse/puppet.spec +2 -2
  24. data/ext/upload_facts.rb +1 -1
  25. data/ext/windows/puppet_interactive.bat +6 -0
  26. data/ext/windows/puppet_shell.bat +9 -0
  27. data/ext/windows/run_puppet_interactive.bat +9 -0
  28. data/ext/yaml_nodes.rb +1 -1
  29. data/install.rb +30 -20
  30. data/lib/puppet/agent.rb +1 -1
  31. data/lib/puppet/application/agent.rb +4 -2
  32. data/lib/puppet/application/apply.rb +7 -4
  33. data/lib/puppet/application/cert.rb +1 -1
  34. data/lib/puppet/application/device.rb +1 -1
  35. data/lib/puppet/application/filebucket.rb +1 -1
  36. data/lib/puppet/application/inspect.rb +1 -1
  37. data/lib/puppet/application/lookup.rb +4 -4
  38. data/lib/puppet/application/master.rb +2 -2
  39. data/lib/puppet/application/resource.rb +1 -1
  40. data/lib/puppet/configurer.rb +100 -22
  41. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  42. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  43. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  44. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  45. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  46. data/lib/puppet/defaults.rb +65 -19
  47. data/lib/puppet/environments.rb +3 -1
  48. data/lib/puppet/face/config.rb +1 -1
  49. data/lib/puppet/face/epp.rb +1 -1
  50. data/lib/puppet/face/help/man.erb +1 -1
  51. data/lib/puppet/face/module/install.rb +6 -6
  52. data/lib/puppet/face/parser.rb +12 -9
  53. data/lib/puppet/face/status.rb +2 -1
  54. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  55. data/lib/puppet/feature/telnet.rb +9 -0
  56. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  57. data/lib/puppet/file_serving/metadata.rb +18 -2
  58. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  59. data/lib/puppet/file_system.rb +2 -2
  60. data/lib/puppet/file_system/file_impl.rb +2 -2
  61. data/lib/puppet/file_system/memory_impl.rb +1 -1
  62. data/lib/puppet/file_system/uniquefile.rb +1 -1
  63. data/lib/puppet/forge.rb +1 -1
  64. data/lib/puppet/forge/repository.rb +1 -31
  65. data/lib/puppet/functions.rb +45 -6
  66. data/lib/puppet/functions/assert_type.rb +9 -9
  67. data/lib/puppet/functions/each.rb +5 -13
  68. data/lib/puppet/functions/filter.rb +5 -14
  69. data/lib/puppet/functions/map.rb +6 -14
  70. data/lib/puppet/functions/reduce.rb +5 -13
  71. data/lib/puppet/functions/reverse_each.rb +82 -0
  72. data/lib/puppet/functions/scanf.rb +15 -18
  73. data/lib/puppet/functions/slice.rb +22 -36
  74. data/lib/puppet/functions/split.rb +2 -2
  75. data/lib/puppet/functions/step.rb +88 -0
  76. data/lib/puppet/functions/type.rb +70 -0
  77. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  78. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  79. data/lib/puppet/indirector/file_content/http.rb +15 -0
  80. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  81. data/lib/puppet/indirector/generic_http.rb +16 -0
  82. data/lib/puppet/indirector/node/exec.rb +1 -1
  83. data/lib/puppet/indirector/node/ldap.rb +1 -1
  84. data/lib/puppet/indirector/rest.rb +2 -1
  85. data/lib/puppet/info_service/class_information_service.rb +13 -12
  86. data/lib/puppet/loaders.rb +1 -0
  87. data/lib/puppet/module.rb +3 -0
  88. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  89. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  90. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  91. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  92. data/lib/puppet/network/http/pool.rb +9 -0
  93. data/lib/puppet/node.rb +1 -1
  94. data/lib/puppet/node/environment.rb +11 -2
  95. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  96. data/lib/puppet/parser/compiler.rb +3 -3
  97. data/lib/puppet/parser/environment_compiler.rb +0 -1
  98. data/lib/puppet/parser/functions.rb +28 -16
  99. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  100. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  101. data/lib/puppet/parser/functions/map.rb +1 -1
  102. data/lib/puppet/parser/functions/scanf.rb +15 -26
  103. data/lib/puppet/parser/functions/slice.rb +17 -24
  104. data/lib/puppet/parser/functions/split.rb +1 -1
  105. data/lib/puppet/parser/resource.rb +19 -17
  106. data/lib/puppet/parser/scope.rb +176 -5
  107. data/lib/puppet/plugins/data_providers/data_provider.rb +54 -13
  108. data/lib/puppet/pops.rb +0 -8
  109. data/lib/puppet/pops/adaptable.rb +4 -1
  110. data/lib/puppet/pops/adapters.rb +38 -13
  111. data/lib/puppet/pops/binder/binder.rb +21 -17
  112. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  113. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  114. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  115. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  116. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  117. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  118. data/lib/puppet/pops/binder/injector.rb +53 -48
  119. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  120. data/lib/puppet/pops/binder/producers.rb +67 -62
  121. data/lib/puppet/pops/evaluator/access_operator.rb +95 -93
  122. data/lib/puppet/pops/evaluator/closure.rb +84 -68
  123. data/lib/puppet/pops/evaluator/collector_transformer.rb +18 -14
  124. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  125. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  126. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  127. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  128. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  129. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  130. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  131. data/lib/puppet/pops/evaluator/runtime3_support.rb +41 -45
  132. data/lib/puppet/pops/issue_reporter.rb +6 -4
  133. data/lib/puppet/pops/issues.rb +34 -11
  134. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  135. data/lib/puppet/pops/loader/loader.rb +1 -1
  136. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  137. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  138. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +16 -12
  139. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  140. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  141. data/lib/puppet/pops/loaders.rb +51 -9
  142. data/lib/puppet/pops/lookup.rb +14 -12
  143. data/lib/puppet/pops/merge_strategy.rb +16 -19
  144. data/lib/puppet/pops/model/factory.rb +26 -2
  145. data/lib/puppet/pops/model/model.rb +8 -8
  146. data/lib/puppet/pops/model/model_label_provider.rb +13 -7
  147. data/lib/puppet/pops/model/model_meta.rb +17 -0
  148. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  149. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  150. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  151. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  152. data/lib/puppet/pops/parser/evaluating_parser.rb +14 -10
  153. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  154. data/lib/puppet/pops/parser/lexer2.rb +26 -19
  155. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  156. data/lib/puppet/pops/parser/locator.rb +21 -0
  157. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  158. data/lib/puppet/pops/parser/slurp_support.rb +11 -7
  159. data/lib/puppet/pops/types/class_loader.rb +23 -19
  160. data/lib/puppet/pops/types/enumeration.rb +9 -26
  161. data/lib/puppet/pops/types/iterable.rb +308 -0
  162. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  163. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  164. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  165. data/lib/puppet/pops/types/type_calculator.rb +138 -381
  166. data/lib/puppet/pops/types/type_factory.rb +91 -57
  167. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  168. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  169. data/lib/puppet/pops/types/type_parser.rb +159 -112
  170. data/lib/puppet/pops/types/types.rb +2057 -1247
  171. data/lib/puppet/pops/utils.rb +11 -10
  172. data/lib/puppet/pops/validation.rb +11 -9
  173. data/lib/puppet/pops/validation/checker4_0.rb +83 -55
  174. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  175. data/lib/puppet/provider/aixobject.rb +1 -1
  176. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  177. data/lib/puppet/provider/cron/crontab.rb +1 -1
  178. data/lib/puppet/provider/exec/windows.rb +1 -1
  179. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  180. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  181. data/lib/puppet/provider/package/appdmg.rb +3 -2
  182. data/lib/puppet/provider/package/dnf.rb +1 -1
  183. data/lib/puppet/provider/package/pip.rb +5 -8
  184. data/lib/puppet/provider/package/pip3.rb +1 -1
  185. data/lib/puppet/provider/package/pkg.rb +1 -1
  186. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  187. data/lib/puppet/provider/package/pkgng.rb +13 -4
  188. data/lib/puppet/provider/package/windows.rb +1 -1
  189. data/lib/puppet/provider/package/yum.rb +1 -1
  190. data/lib/puppet/provider/package/zypper.rb +19 -0
  191. data/lib/puppet/provider/service/debian.rb +2 -2
  192. data/lib/puppet/provider/service/launchd.rb +6 -18
  193. data/lib/puppet/provider/service/systemd.rb +9 -2
  194. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  195. data/lib/puppet/provider/user/aix.rb +1 -1
  196. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  197. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  198. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  199. data/lib/puppet/reference/configuration.rb +1 -1
  200. data/lib/puppet/reference/providers.rb +1 -1
  201. data/lib/puppet/resource.rb +15 -12
  202. data/lib/puppet/resource/capability_finder.rb +20 -13
  203. data/lib/puppet/resource/catalog.rb +60 -3
  204. data/lib/puppet/resource/status.rb +11 -2
  205. data/lib/puppet/resource/type.rb +28 -38
  206. data/lib/puppet/settings.rb +1 -1
  207. data/lib/puppet/settings/config_file.rb +1 -1
  208. data/lib/puppet/settings/environment_conf.rb +13 -5
  209. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  210. data/lib/puppet/ssl/certificate_request.rb +4 -4
  211. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  212. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  213. data/lib/puppet/test/test_helper.rb +16 -4
  214. data/lib/puppet/transaction.rb +15 -2
  215. data/lib/puppet/transaction/additional_resource_generator.rb +6 -2
  216. data/lib/puppet/transaction/report.rb +31 -1
  217. data/lib/puppet/transaction/resource_harness.rb +0 -25
  218. data/lib/puppet/type.rb +11 -11
  219. data/lib/puppet/type/augeas.rb +1 -1
  220. data/lib/puppet/type/cron.rb +12 -12
  221. data/lib/puppet/type/file.rb +91 -39
  222. data/lib/puppet/type/file/checksum_value.rb +53 -0
  223. data/lib/puppet/type/file/content.rb +26 -111
  224. data/lib/puppet/type/file/data_sync.rb +84 -0
  225. data/lib/puppet/type/file/ensure.rb +17 -14
  226. data/lib/puppet/type/file/selcontext.rb +1 -1
  227. data/lib/puppet/type/file/source.rb +103 -18
  228. data/lib/puppet/type/filebucket.rb +1 -1
  229. data/lib/puppet/type/interface.rb +8 -3
  230. data/lib/puppet/type/macauthorization.rb +1 -1
  231. data/lib/puppet/type/package.rb +6 -0
  232. data/lib/puppet/type/schedule.rb +1 -1
  233. data/lib/puppet/type/stage.rb +1 -1
  234. data/lib/puppet/type/user.rb +19 -17
  235. data/lib/puppet/type/yumrepo.rb +20 -0
  236. data/lib/puppet/util.rb +109 -22
  237. data/lib/puppet/util/autoload.rb +16 -11
  238. data/lib/puppet/util/checksums.rb +74 -31
  239. data/lib/puppet/util/execution.rb +1 -1
  240. data/lib/puppet/util/http_proxy.rb +72 -0
  241. data/lib/puppet/util/log.rb +2 -0
  242. data/lib/puppet/util/logging.rb +43 -1
  243. data/lib/puppet/util/monkey_patches.rb +2 -2
  244. data/lib/puppet/util/multi_match.rb +51 -0
  245. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  246. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  247. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  248. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  249. data/lib/puppet/util/plist.rb +130 -0
  250. data/lib/puppet/util/resource_template.rb +1 -1
  251. data/lib/puppet/util/run_mode.rb +2 -2
  252. data/lib/puppet/util/skip_tags.rb +9 -0
  253. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  254. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  255. data/lib/puppet/util/windows/adsi.rb +4 -4
  256. data/lib/puppet/util/windows/api_types.rb +24 -18
  257. data/lib/puppet/util/windows/com.rb +3 -3
  258. data/lib/puppet/util/windows/error.rb +1 -1
  259. data/lib/puppet/util/windows/file.rb +8 -8
  260. data/lib/puppet/util/windows/principal.rb +23 -14
  261. data/lib/puppet/util/windows/process.rb +78 -11
  262. data/lib/puppet/util/windows/registry.rb +1 -1
  263. data/lib/puppet/util/windows/root_certs.rb +5 -5
  264. data/lib/puppet/util/windows/security.rb +33 -35
  265. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  266. data/lib/puppet/util/windows/sid.rb +42 -4
  267. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  268. data/lib/puppet/util/windows/user.rb +10 -10
  269. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  270. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  271. data/lib/puppet/vendor/pathspec/README.md +1 -1
  272. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  273. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  274. data/lib/puppet/version.rb +1 -1
  275. data/lib/semver.rb +17 -1
  276. data/man/man5/puppet.conf.5 +12 -12
  277. data/man/man8/extlookup2hiera.8 +1 -1
  278. data/man/man8/puppet-agent.8 +2 -2
  279. data/man/man8/puppet-apply.8 +2 -2
  280. data/man/man8/puppet-ca.8 +2 -2
  281. data/man/man8/puppet-catalog.8 +2 -2
  282. data/man/man8/puppet-cert.8 +2 -2
  283. data/man/man8/puppet-certificate.8 +2 -2
  284. data/man/man8/puppet-certificate_request.8 +2 -2
  285. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  286. data/man/man8/puppet-config.8 +3 -3
  287. data/man/man8/puppet-describe.8 +1 -1
  288. data/man/man8/puppet-device.8 +1 -1
  289. data/man/man8/puppet-doc.8 +1 -1
  290. data/man/man8/puppet-epp.8 +2 -2
  291. data/man/man8/puppet-facts.8 +2 -2
  292. data/man/man8/puppet-file.8 +2 -2
  293. data/man/man8/puppet-filebucket.8 +2 -2
  294. data/man/man8/puppet-help.8 +2 -2
  295. data/man/man8/puppet-inspect.8 +2 -2
  296. data/man/man8/puppet-key.8 +2 -2
  297. data/man/man8/puppet-man.8 +2 -2
  298. data/man/man8/puppet-master.8 +2 -2
  299. data/man/man8/puppet-module.8 +9 -9
  300. data/man/man8/puppet-node.8 +2 -2
  301. data/man/man8/puppet-parser.8 +2 -2
  302. data/man/man8/puppet-plugin.8 +2 -2
  303. data/man/man8/puppet-report.8 +2 -2
  304. data/man/man8/puppet-resource.8 +2 -2
  305. data/man/man8/puppet-resource_type.8 +2 -2
  306. data/man/man8/puppet-status.8 +3 -3
  307. data/man/man8/puppet.8 +1 -1
  308. data/spec/fixtures/module.tar.gz +0 -0
  309. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  310. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  311. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  312. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  313. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  314. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  315. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  316. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  317. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  318. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  319. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  320. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  321. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +3 -1
  322. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  323. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  324. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  325. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  326. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  327. 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
  328. 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
  329. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  330. 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
  331. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  332. 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
  333. 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
  334. data/spec/integration/defaults_spec.rb +14 -2
  335. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  336. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  337. data/spec/integration/node/environment_spec.rb +13 -0
  338. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  339. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  340. data/spec/integration/parser/undef_param_spec.rb +8 -0
  341. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  342. data/spec/integration/test/test_helper_spec.rb +28 -0
  343. data/spec/integration/transaction/report_spec.rb +16 -0
  344. data/spec/integration/transaction_spec.rb +11 -0
  345. data/spec/integration/type/file_spec.rb +194 -4
  346. data/spec/integration/type/package_spec.rb +5 -1
  347. data/spec/integration/type/tidy_spec.rb +21 -9
  348. data/spec/integration/util/execution_spec.rb +22 -0
  349. data/spec/integration/util/windows/principal_spec.rb +90 -4
  350. data/spec/integration/util/windows/process_spec.rb +31 -0
  351. data/spec/integration/util/windows/security_spec.rb +6 -6
  352. data/spec/integration/util/windows/user_spec.rb +1 -1
  353. data/spec/integration/util_spec.rb +49 -27
  354. data/spec/lib/puppet_spec/compiler.rb +17 -0
  355. data/spec/lib/puppet_spec/files.rb +2 -2
  356. data/spec/lib/puppet_spec/pops.rb +13 -0
  357. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  358. data/spec/shared_contexts/types_setup.rb +96 -0
  359. data/spec/unit/agent_spec.rb +1 -0
  360. data/spec/unit/application/agent_spec.rb +10 -0
  361. data/spec/unit/application/apply_spec.rb +9 -0
  362. data/spec/unit/configurer/downloader_spec.rb +5 -5
  363. data/spec/unit/configurer_spec.rb +271 -39
  364. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  365. data/spec/unit/defaults_spec.rb +15 -0
  366. data/spec/unit/environments_spec.rb +24 -4
  367. data/spec/unit/face/parser_spec.rb +43 -2
  368. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  369. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  370. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  371. data/spec/unit/file_system_spec.rb +26 -0
  372. data/spec/unit/functions/assert_type_spec.rb +36 -2
  373. data/spec/unit/functions/defined_spec.rb +2 -2
  374. data/spec/unit/functions/epp_spec.rb +11 -3
  375. data/spec/unit/functions/lookup_spec.rb +58 -13
  376. data/spec/unit/functions/regsubst_spec.rb +1 -1
  377. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  378. data/spec/unit/functions/step_spec.rb +113 -0
  379. data/spec/unit/functions/type_spec.rb +35 -0
  380. data/spec/unit/functions4_spec.rb +61 -5
  381. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  382. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  383. data/spec/unit/indirector/indirection_spec.rb +1 -1
  384. data/spec/unit/info_service_spec.rb +94 -32
  385. data/spec/unit/module_spec.rb +14 -0
  386. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  387. data/spec/unit/network/authstore_spec.rb +1 -1
  388. data/spec/unit/network/http/connection_spec.rb +1 -0
  389. data/spec/unit/network/http/pool_spec.rb +30 -0
  390. data/spec/unit/node_spec.rb +1 -1
  391. data/spec/unit/parser/compiler_spec.rb +16 -0
  392. data/spec/unit/parser/scope_spec.rb +28 -11
  393. data/spec/unit/pops/evaluator/access_ops_spec.rb +3 -3
  394. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  395. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +7 -1
  396. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  397. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  398. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  399. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  400. data/spec/unit/pops/loaders/loaders_spec.rb +44 -1
  401. data/spec/unit/pops/parser/lexer2_spec.rb +112 -3
  402. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  403. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  404. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  405. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  406. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  407. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  408. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  409. data/spec/unit/pops/types/type_calculator_spec.rb +275 -373
  410. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  411. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  412. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  413. data/spec/unit/pops/types/types_spec.rb +241 -0
  414. data/spec/unit/pops/validator/validator_spec.rb +100 -43
  415. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  416. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  417. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  418. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  419. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  420. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  421. data/spec/unit/provider/package/pip_spec.rb +47 -34
  422. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  423. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  424. data/spec/unit/provider/package/yum_spec.rb +11 -0
  425. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  426. data/spec/unit/provider/service/launchd_spec.rb +17 -35
  427. data/spec/unit/provider/service/systemd_spec.rb +7 -0
  428. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  429. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  430. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  431. data/spec/unit/resource/catalog_spec.rb +33 -1
  432. data/spec/unit/resource/type_spec.rb +149 -7
  433. data/spec/unit/resource_spec.rb +96 -57
  434. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  435. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  436. data/spec/unit/transaction/report_spec.rb +27 -0
  437. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  438. data/spec/unit/transaction_spec.rb +5 -0
  439. data/spec/unit/type/file/checksum_spec.rb +6 -0
  440. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  441. data/spec/unit/type/file/content_spec.rb +12 -193
  442. data/spec/unit/type/file/source_spec.rb +211 -119
  443. data/spec/unit/type/file_spec.rb +133 -34
  444. data/spec/unit/type/interface_spec.rb +32 -0
  445. data/spec/unit/type/macauthorization_spec.rb +4 -1
  446. data/spec/unit/type/yumrepo_spec.rb +2 -2
  447. data/spec/unit/util/filetype_spec.rb +1 -1
  448. data/spec/unit/util/http_proxy_spec.rb +2 -2
  449. data/spec/unit/util/log/destinations_spec.rb +0 -2
  450. data/spec/unit/util/logging_spec.rb +69 -0
  451. data/spec/unit/util/multi_match_spec.rb +39 -0
  452. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  453. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  454. data/spec/unit/util/plist_spec.rb +110 -0
  455. data/spec/unit/util/resource_template_spec.rb +2 -2
  456. data/spec/unit/util/run_mode_spec.rb +27 -3
  457. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  458. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  459. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  460. data/spec/unit/util/windows/sid_spec.rb +1 -1
  461. data/spec/unit/util_spec.rb +123 -13
  462. data/tasks/cfpropertylist.rake +15 -0
  463. metadata +114 -26
  464. data/lib/puppet/vendor/load_plist.rb +0 -1
  465. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  466. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  467. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  468. data/lib/puppet/vendor/plist/README +0 -36
  469. data/lib/puppet/vendor/plist/Rakefile +0 -144
  470. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  471. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  472. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  473. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  474. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  475. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  476. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  477. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  478. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  479. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  480. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  481. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  482. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  483. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  484. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  485. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  486. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  487. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops'
3
+
4
+ module Puppet::Pops::Types
5
+ describe 'the type asserter' do
6
+ let!(:asserter) { TypeAsserter }
7
+
8
+ context 'when deferring formatting of subject'
9
+ it 'can use an array' do
10
+ expect{ asserter.assert_instance_of(['The %s in the %s', 'gizmo', 'gadget'], PIntegerType::DEFAULT, 'lens') }.to(
11
+ raise_error(TypeAssertionError, 'The gizmo in the gadget has wrong type, expected an Integer value, got String'))
12
+ end
13
+
14
+ it 'can use an array obtained from block' do
15
+ expect do
16
+ asserter.assert_instance_of('gizmo', PIntegerType::DEFAULT, 'lens') { |s| ['The %s in the %s', s, 'gadget'] }
17
+ end.to(raise_error(TypeAssertionError, 'The gizmo in the gadget has wrong type, expected an Integer value, got String'))
18
+ end
19
+
20
+ it 'can use an subject obtained from zero argument block' do
21
+ expect do
22
+ asserter.assert_instance_of(nil, PIntegerType::DEFAULT, 'lens') { 'The gizmo in the gadget' }
23
+ end.to(raise_error(TypeAssertionError, 'The gizmo in the gadget has wrong type, expected an Integer value, got String'))
24
+ end
25
+
26
+ it 'does not produce a string unless the assertion fails' do
27
+ TypeAsserter.expects(:report_type_mismatch).never
28
+ asserter.assert_instance_of(nil, PIntegerType::DEFAULT, 1)
29
+ end
30
+
31
+ it 'does not format string unless the assertion fails' do
32
+ fmt_string = 'The %s in the %s'
33
+ fmt_string.expects(:'%').never
34
+ asserter.assert_instance_of([fmt_string, 'gizmo', 'gadget'], PIntegerType::DEFAULT, 1)
35
+ end
36
+
37
+ it 'does not call block unless the assertion fails' do
38
+ expect do
39
+ asserter.assert_instance_of(nil, PIntegerType::DEFAULT, 1) { |s| raise Error }
40
+ end.not_to raise_error
41
+ end
42
+ end
43
+ end
@@ -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) }
@@ -1323,6 +1285,122 @@ describe 'The type calculator' do
1323
1285
  expect(calculator.assignable?(r1, r2)).to eq(false)
1324
1286
  end
1325
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
1326
1404
  end
1327
1405
 
1328
1406
  context 'when testing if x is instance of type t' do
@@ -1340,8 +1418,16 @@ describe 'The type calculator' do
1340
1418
  end
1341
1419
  end
1342
1420
 
1343
- it "should consider :undef to be instance of Runtime['ruby', 'Symbol]" do
1344
- 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)
1345
1431
  end
1346
1432
 
1347
1433
  it 'should consider :undef to be instance of an Optional type' do
@@ -1591,6 +1677,49 @@ describe 'The type calculator' do
1591
1677
  expect(calculator.instance?(callable_t(String), f)).to be_truthy
1592
1678
  end
1593
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
1594
1723
  end
1595
1724
 
1596
1725
  context 'when converting a ruby class' do
@@ -1636,235 +1765,6 @@ describe 'The type calculator' do
1636
1765
  end
1637
1766
  end
1638
1767
 
1639
- context 'when representing the type as string' do
1640
- it 'should yield \'Type\' for PType' do
1641
- expect(calculator.string(Puppet::Pops::Types::PType::DEFAULT)).to eq('Type')
1642
- end
1643
-
1644
- it 'should yield \'Object\' for PAnyType' do
1645
- expect(calculator.string(Puppet::Pops::Types::PAnyType::DEFAULT)).to eq('Any')
1646
- end
1647
-
1648
- it 'should yield \'Scalar\' for PScalarType' do
1649
- expect(calculator.string(Puppet::Pops::Types::PScalarType::DEFAULT)).to eq('Scalar')
1650
- end
1651
-
1652
- it 'should yield \'Boolean\' for PBooleanType' do
1653
- expect(calculator.string(Puppet::Pops::Types::PBooleanType::DEFAULT)).to eq('Boolean')
1654
- end
1655
-
1656
- it 'should yield \'Data\' for PDataType' do
1657
- expect(calculator.string(Puppet::Pops::Types::PDataType::DEFAULT)).to eq('Data')
1658
- end
1659
-
1660
- it 'should yield \'Numeric\' for PNumericType' do
1661
- expect(calculator.string(Puppet::Pops::Types::PNumericType::DEFAULT)).to eq('Numeric')
1662
- end
1663
-
1664
- it 'should yield \'Integer\' and from/to for PIntegerType' do
1665
- int_T = Puppet::Pops::Types::PIntegerType
1666
- expect(calculator.string(int_T::DEFAULT)).to eq('Integer')
1667
- int = int_T.new(1, 1)
1668
- expect(calculator.string(int)).to eq('Integer[1, 1]')
1669
- int = int_T.new(1, 2)
1670
- expect(calculator.string(int)).to eq('Integer[1, 2]')
1671
- int = int_T.new(nil, 2)
1672
- expect(calculator.string(int)).to eq('Integer[default, 2]')
1673
- int = int_T.new(2, nil)
1674
- expect(calculator.string(int)).to eq('Integer[2, default]')
1675
- end
1676
-
1677
- it 'should yield \'Float\' for PFloatType' do
1678
- expect(calculator.string(Puppet::Pops::Types::PFloatType::DEFAULT)).to eq('Float')
1679
- end
1680
-
1681
- it 'should yield \'Regexp\' for PRegexpType' do
1682
- expect(calculator.string(Puppet::Pops::Types::PRegexpType::DEFAULT)).to eq('Regexp')
1683
- end
1684
-
1685
- it 'should yield \'Regexp[/pat/]\' for parameterized PRegexpType' do
1686
- t = Puppet::Pops::Types::PRegexpType.new('a/b')
1687
- expect(calculator.string(t)).to eq('Regexp[/a\/b/]')
1688
- end
1689
-
1690
- it 'should yield \'String\' for PStringType' do
1691
- expect(calculator.string(Puppet::Pops::Types::PStringType::DEFAULT)).to eq('String')
1692
- end
1693
-
1694
- it 'should yield \'String\' for PStringType with multiple values' do
1695
- expect(calculator.string(string_t('a', 'b', 'c'))).to eq('String')
1696
- end
1697
-
1698
- it 'should yield \'String\' and from/to for PStringType' do
1699
- string_T = Puppet::Pops::Types::PStringType
1700
- expect(calculator.string(string_T.new(range_t(1,1)))).to eq('String[1, 1]')
1701
- expect(calculator.string(string_T.new(range_t(1,2)))).to eq('String[1, 2]')
1702
- expect(calculator.string(string_T.new(range_t(:default, 2)))).to eq('String[default, 2]')
1703
- expect(calculator.string(string_T.new(range_t(2, :default)))).to eq('String[2, default]')
1704
- end
1705
-
1706
- it 'should yield \'Array[Integer]\' for PArrayType[PIntegerType]' do
1707
- t = Puppet::Pops::Types::PArrayType.new(Puppet::Pops::Types::PIntegerType::DEFAULT)
1708
- expect(calculator.string(t)).to eq('Array[Integer]')
1709
- end
1710
-
1711
- it 'should yield \'Array[Unit, 0, 0]\' for an empty array' do
1712
- t = empty_array_t
1713
- expect(calculator.string(t)).to eq('Array[Unit, 0, 0]')
1714
- end
1715
-
1716
- it 'should yield \'Collection\' and from/to for PCollectionType' do
1717
- expect(calculator.string(collection_t(range_t(1,1)))).to eq('Collection[1, 1]')
1718
- expect(calculator.string(collection_t(range_t(1,2)))).to eq('Collection[1, 2]')
1719
- expect(calculator.string(collection_t(range_t(:default, 2)))).to eq('Collection[default, 2]')
1720
- expect(calculator.string(collection_t(range_t(2, :default)))).to eq('Collection[2, default]')
1721
- end
1722
-
1723
- it 'should yield \'Array\' and from/to for PArrayType' do
1724
- expect(calculator.string(array_t(string_t, range_t(1,1)))).to eq('Array[String, 1, 1]')
1725
- expect(calculator.string(array_t(string_t, range_t(1,2)))).to eq('Array[String, 1, 2]')
1726
- expect(calculator.string(array_t(string_t, range_t(:default, 2)))).to eq('Array[String, default, 2]')
1727
- expect(calculator.string(array_t(string_t, range_t(2, :default)))).to eq('Array[String, 2, default]')
1728
- end
1729
-
1730
- it 'should yield \'Tuple[Integer]\' for PTupleType[PIntegerType]' do
1731
- t = Puppet::Pops::Types::PTupleType.new([Puppet::Pops::Types::PIntegerType::DEFAULT])
1732
- expect(calculator.string(t)).to eq('Tuple[Integer]')
1733
- end
1734
-
1735
- it 'should yield \'Tuple[T, T,..]\' for PTupleType[T, T, ...]' do
1736
- t = Puppet::Pops::Types::PTupleType.new([Puppet::Pops::Types::PIntegerType::DEFAULT, Puppet::Pops::Types::PIntegerType::DEFAULT, Puppet::Pops::Types::PStringType::DEFAULT])
1737
- expect(calculator.string(t)).to eq('Tuple[Integer, Integer, String]')
1738
- end
1739
-
1740
- it 'should yield \'Tuple\' and from/to for PTupleType' do
1741
- expect(calculator.string(constrained_tuple_t(range_t(1,1), string_t))).to eq('Tuple[String, 1, 1]')
1742
- expect(calculator.string(constrained_tuple_t(range_t(1,2), string_t))).to eq('Tuple[String, 1, 2]')
1743
- expect(calculator.string(constrained_tuple_t(range_t(:default, 2), string_t))).to eq('Tuple[String, 0, 2]')
1744
- expect(calculator.string(constrained_tuple_t(range_t(2, :default), string_t))).to eq('Tuple[String, 2, default]')
1745
- end
1746
-
1747
- it 'should yield \'Struct\' and details for PStructType' do
1748
- struct_t = struct_t({'a'=>Integer, 'b'=>String})
1749
- expect(calculator.string(struct_t)).to eq("Struct[{'a'=>Integer, 'b'=>String}]")
1750
- struct_t = struct_t({})
1751
- expect(calculator.string(struct_t)).to eq('Struct')
1752
- end
1753
-
1754
- it 'should yield \'Hash[String, Integer]\' for PHashType[PStringType, PIntegerType]' do
1755
- t = Puppet::Pops::Types::PHashType.new(Puppet::Pops::Types::PStringType::DEFAULT, Puppet::Pops::Types::PIntegerType::DEFAULT)
1756
- expect(calculator.string(t)).to eq('Hash[String, Integer]')
1757
- end
1758
-
1759
- it 'should yield \'Hash\' and from/to for PHashType' do
1760
- expect(calculator.string(hash_t(string_t, string_t, range_t(1,1)))).to eq('Hash[String, String, 1, 1]')
1761
- expect(calculator.string(hash_t(string_t, string_t, range_t(1,2)))).to eq('Hash[String, String, 1, 2]')
1762
- expect(calculator.string(hash_t(string_t, string_t, range_t(:default, 2)))).to eq('Hash[String, String, default, 2]')
1763
- expect(calculator.string(hash_t(string_t, string_t, range_t(2, :default)))).to eq('Hash[String, String, 2, default]')
1764
- end
1765
-
1766
- it "should yield 'Class' for a PHostClassType" do
1767
- t = Puppet::Pops::Types::PHostClassType::DEFAULT
1768
- expect(calculator.string(t)).to eq('Class')
1769
- end
1770
-
1771
- it "should yield 'Class[x]' for a PHostClassType[x]" do
1772
- t = Puppet::Pops::Types::PHostClassType.new('x')
1773
- expect(calculator.string(t)).to eq('Class[x]')
1774
- end
1775
-
1776
- it "should yield 'Resource' for a PResourceType" do
1777
- t = Puppet::Pops::Types::PResourceType::DEFAULT
1778
- expect(calculator.string(t)).to eq('Resource')
1779
- end
1780
-
1781
- it 'should yield \'File\' for a PResourceType[\'File\']' do
1782
- t = Puppet::Pops::Types::PResourceType.new('File')
1783
- expect(calculator.string(t)).to eq('File')
1784
- end
1785
-
1786
- it "should yield 'File['/tmp/foo']' for a PResourceType['File', '/tmp/foo']" do
1787
- t = Puppet::Pops::Types::PResourceType.new('File', '/tmp/foo')
1788
- expect(calculator.string(t)).to eq("File['/tmp/foo']")
1789
- end
1790
-
1791
- it "should yield 'Enum[s,...]' for a PEnumType[s,...]" do
1792
- t = enum_t('a', 'b', 'c')
1793
- expect(calculator.string(t)).to eq("Enum['a', 'b', 'c']")
1794
- end
1795
-
1796
- it "should yield 'Pattern[/pat/,...]' for a PPatternType['pat',...]" do
1797
- t = pattern_t('a')
1798
- t2 = pattern_t('a', 'b', 'c')
1799
- expect(calculator.string(t)).to eq('Pattern[/a/]')
1800
- expect(calculator.string(t2)).to eq('Pattern[/a/, /b/, /c/]')
1801
- end
1802
-
1803
- it "should escape special characters in the string for a PPatternType['pat',...]" do
1804
- t = pattern_t('a/b')
1805
- expect(calculator.string(t)).to eq("Pattern[/a\\/b/]")
1806
- end
1807
-
1808
- it "should yield 'Variant[t1,t2,...]' for a PVariantType[t1, t2,...]" do
1809
- t1 = string_t
1810
- t2 = integer_t
1811
- t3 = pattern_t('a')
1812
- t = variant_t(t1, t2, t3)
1813
- expect(calculator.string(t)).to eq('Variant[String, Integer, Pattern[/a/]]')
1814
- end
1815
-
1816
- it "should yield 'Callable' for generic callable" do
1817
- expect(calculator.string(all_callables_t)).to eql('Callable')
1818
- end
1819
-
1820
- it "should yield 'Callable[0,0]' for callable without params" do
1821
- expect(calculator.string(callable_t)).to eql('Callable[0, 0]')
1822
- end
1823
-
1824
- it "should yield 'Callable[t,t]' for callable with typed parameters" do
1825
- expect(calculator.string(callable_t(String, Integer))).to eql('Callable[String, Integer]')
1826
- end
1827
-
1828
- it "should yield 'Callable[t,min,max]' for callable with size constraint (infinite max)" do
1829
- expect(calculator.string(callable_t(String, 0))).to eql('Callable[String, 0, default]')
1830
- end
1831
-
1832
- it "should yield 'Callable[t,min,max]' for callable with size constraint (capped max)" do
1833
- expect(calculator.string(callable_t(String, 0, 3))).to eql('Callable[String, 0, 3]')
1834
- end
1835
-
1836
- it "should yield 'Callable[min,max]' callable with size > 0" do
1837
- expect(calculator.string(callable_t(0, 0))).to eql('Callable[0, 0]')
1838
- expect(calculator.string(callable_t(0, 1))).to eql('Callable[0, 1]')
1839
- expect(calculator.string(callable_t(0, :default))).to eql('Callable[0, default]')
1840
- end
1841
-
1842
- it "should yield 'Callable[Callable]' for callable with block" do
1843
- expect(calculator.string(callable_t(all_callables_t))).to eql('Callable[0, 0, Callable]')
1844
- expect(calculator.string(callable_t(string_t, all_callables_t))).to eql('Callable[String, Callable]')
1845
- expect(calculator.string(callable_t(string_t, 1,1, all_callables_t))).to eql('Callable[String, 1, 1, Callable]')
1846
- end
1847
-
1848
- it 'should yield Unit for a Unit type' do
1849
- expect(calculator.string(unit_t)).to eql('Unit')
1850
- end
1851
-
1852
- it "should yield 'NotUndef' for a PNotUndefType" do
1853
- t = not_undef_t
1854
- expect(calculator.string(t)).to eq('NotUndef')
1855
- end
1856
-
1857
- it "should yield 'NotUndef[T]' for a PNotUndefType[T]" do
1858
- t = not_undef_t(data_t)
1859
- expect(calculator.string(t)).to eq('NotUndef[Data]')
1860
- end
1861
-
1862
- it "should yield 'NotUndef['string']' for a PNotUndefType['string']" do
1863
- t = not_undef_t('hey')
1864
- expect(calculator.string(t)).to eq("NotUndef['hey']")
1865
- end
1866
- end
1867
-
1868
1768
  context 'when processing meta type' do
1869
1769
  it 'should infer PType as the type of all other types' do
1870
1770
  ptype = Puppet::Pops::Types::PType
@@ -1880,6 +1780,7 @@ describe 'The type calculator' do
1880
1780
  expect(calculator.infer(Puppet::Pops::Types::PCollectionType::DEFAULT).is_a?(ptype)).to eq(true)
1881
1781
  expect(calculator.infer(Puppet::Pops::Types::PArrayType::DEFAULT ).is_a?(ptype)).to eq(true)
1882
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)
1883
1784
  expect(calculator.infer(Puppet::Pops::Types::PRuntimeType::DEFAULT ).is_a?(ptype)).to eq(true)
1884
1785
  expect(calculator.infer(Puppet::Pops::Types::PHostClassType::DEFAULT ).is_a?(ptype)).to eq(true)
1885
1786
  expect(calculator.infer(Puppet::Pops::Types::PResourceType::DEFAULT ).is_a?(ptype)).to eq(true)
@@ -1892,38 +1793,39 @@ describe 'The type calculator' do
1892
1793
  end
1893
1794
 
1894
1795
  it 'should infer PType as the type of all other types' do
1895
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PUndefType::DEFAULT ))).to eq('Type[Undef]')
1896
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PDataType::DEFAULT ))).to eq('Type[Data]')
1897
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PScalarType::DEFAULT ))).to eq('Type[Scalar]')
1898
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PStringType::DEFAULT ))).to eq('Type[String]')
1899
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PNumericType::DEFAULT ))).to eq('Type[Numeric]')
1900
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PIntegerType::DEFAULT ))).to eq('Type[Integer]')
1901
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PFloatType::DEFAULT ))).to eq('Type[Float]')
1902
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PRegexpType::DEFAULT ))).to eq('Type[Regexp]')
1903
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PBooleanType::DEFAULT ))).to eq('Type[Boolean]')
1904
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PCollectionType::DEFAULT))).to eq('Type[Collection]')
1905
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PArrayType::DEFAULT ))).to eq('Type[Array[?]]')
1906
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PHashType::DEFAULT ))).to eq('Type[Hash[?, ?]]')
1907
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PRuntimeType::DEFAULT ))).to eq('Type[Runtime[?, ?]]')
1908
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PHostClassType::DEFAULT ))).to eq('Type[Class]')
1909
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PResourceType::DEFAULT ))).to eq('Type[Resource]')
1910
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PEnumType::DEFAULT ))).to eq('Type[Enum]')
1911
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PVariantType::DEFAULT ))).to eq('Type[Variant]')
1912
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PPatternType::DEFAULT ))).to eq('Type[Pattern]')
1913
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::PTupleType::DEFAULT ))).to eq('Type[Tuple]')
1914
- expect(calculator.string(calculator.infer(Puppet::Pops::Types::POptionalType::DEFAULT ))).to eq('Type[Optional]')
1915
- 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]')
1916
1818
 
1917
1819
  expect(calculator.infer(Puppet::Pops::Types::PResourceType.new('foo::fee::fum')).to_s).to eq('Type[Foo::Fee::Fum]')
1918
- 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]')
1919
1821
  expect(calculator.infer(Puppet::Pops::Types::PResourceType.new('Foo::Fee::Fum')).to_s).to eq('Type[Foo::Fee::Fum]')
1920
1822
  end
1921
1823
 
1922
1824
  it "computes the common type of PType's type parameter" do
1923
1825
  int_t = Puppet::Pops::Types::PIntegerType::DEFAULT
1924
1826
  string_t = Puppet::Pops::Types::PStringType::DEFAULT
1925
- expect(calculator.string(calculator.infer([int_t]))).to eq('Array[Type[Integer], 1, 1]')
1926
- 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]')
1927
1829
  end
1928
1830
 
1929
1831
  it 'should infer PType as the type of ruby classes' do
@@ -1962,23 +1864,23 @@ describe 'The type calculator' do
1962
1864
  end
1963
1865
  end
1964
1866
 
1965
- context 'when asking for an enumerable ' do
1966
- 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
1967
1869
  t = Puppet::Pops::Types::PIntegerType.new(1, 10)
1968
- expect(calculator.enumerable(t).respond_to?(:each)).to eq(true)
1870
+ expect(calculator.iterable(t).respond_to?(:each)).to eq(true)
1969
1871
  end
1970
1872
 
1971
- 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
1972
1874
  t = Puppet::Pops::Types::PIntegerType.new(nil, 10)
1973
- expect(calculator.enumerable(t)).to eq(nil)
1875
+ expect(calculator.iterable(t)).to eq(nil)
1974
1876
 
1975
1877
  t = Puppet::Pops::Types::PIntegerType.new(1, nil)
1976
- expect(calculator.enumerable(t)).to eq(nil)
1878
+ expect(calculator.iterable(t)).to eq(nil)
1977
1879
  end
1978
1880
 
1979
- it 'all but Integer range are not enumerable' do
1881
+ it 'all but Integer range are not iterable' do
1980
1882
  [Object, Numeric, Float, String, Regexp, Array, Hash].each do |t|
1981
- expect(calculator.enumerable(calculator.type(t))).to eq(nil)
1883
+ expect(calculator.iterable(calculator.type(t))).to eq(nil)
1982
1884
  end
1983
1885
  end
1984
1886
  end
@@ -2012,16 +1914,16 @@ describe 'The type calculator' do
2012
1914
 
2013
1915
  it 'ensures that Struct key types are not generalized' do
2014
1916
  generic = struct_t({'a' => object_t}).generalize
2015
- expect(calculator.string(generic)).to eq("Struct[{'a'=>Any}]")
1917
+ expect(generic.to_s).to eq("Struct[{'a' => Any}]")
2016
1918
  generic = struct_t({not_undef_t('a') => object_t}).generalize
2017
- expect(calculator.string(generic)).to eq("Struct[{NotUndef['a']=>Any}]")
1919
+ expect(generic.to_s).to eq("Struct[{NotUndef['a'] => Any}]")
2018
1920
  generic = struct_t({optional_t('a') => string_t}).generalize
2019
- expect(calculator.string(generic)).to eq("Struct[{Optional['a']=>String}]")
1921
+ expect(generic.to_s).to eq("Struct[{Optional['a'] => String}]")
2020
1922
  end
2021
1923
 
2022
1924
  it 'ensures that Struct value types are generalized' do
2023
1925
  generic = struct_t({'a' => range_t(1, 3)}).generalize
2024
- expect(calculator.string(generic)).to eq("Struct[{'a'=>Integer}]")
1926
+ expect(generic.to_s).to eq("Struct[{'a' => Integer}]")
2025
1927
  end
2026
1928
 
2027
1929
  it "does not reduce by combining types when using infer_set" do