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
@@ -1,4 +1,5 @@
1
- module Puppet::Pops::Types
1
+ module Puppet::Pops
2
+ module Types
2
3
  EMPTY_ARRAY = [].freeze
3
4
 
4
5
  class TypePathElement
@@ -19,6 +20,12 @@ module Puppet::Pops::Types
19
20
  alias :eql? :==
20
21
  end
21
22
 
23
+ class SubjectPathElement < TypePathElement
24
+ def to_s
25
+ key
26
+ end
27
+ end
28
+
22
29
  class MemberPathElement < TypePathElement
23
30
  def to_s
24
31
  "struct member #{key}"
@@ -65,7 +72,42 @@ module Puppet::Pops::Types
65
72
  end
66
73
  end
67
74
 
75
+ # Module to handle present/past tense.
76
+ #
77
+ # All method names prefixed with "it_" to avoid conflict with Mocha expectations. Adding a method
78
+ # named 'expects' just doesn't work.
79
+ #
80
+ module TenseVariants
81
+ def it_expects(tense)
82
+ case tense
83
+ when :present
84
+ 'expects'
85
+ else
86
+ 'expected'
87
+ end
88
+ end
89
+
90
+ def it_does_not_expect(tense)
91
+ case tense
92
+ when :present
93
+ 'does not expect'
94
+ else
95
+ 'did not expect'
96
+ end
97
+ end
98
+
99
+ def it_has_no(tense)
100
+ case tense
101
+ when :present
102
+ 'has no'
103
+ else
104
+ 'did not have a'
105
+ end
106
+ end
107
+ end
108
+
68
109
  class Mismatch
110
+ include TenseVariants
69
111
  attr_reader :path
70
112
 
71
113
  def initialize(path)
@@ -76,7 +118,7 @@ module Puppet::Pops::Types
76
118
  @canonical_path ||= @path.reject { |e| e.is_a?(VariantPathElement) }
77
119
  end
78
120
 
79
- def message(variant, position)
121
+ def message(variant, position, tense = :present)
80
122
  "#{variant}unknown mismatch#{position}"
81
123
  end
82
124
 
@@ -108,6 +150,10 @@ module Puppet::Pops::Types
108
150
  end
109
151
 
110
152
  def to_s
153
+ format(:present)
154
+ end
155
+
156
+ def format(tense)
111
157
  p = @path
112
158
  variant = ''
113
159
  position = ''
@@ -119,7 +165,7 @@ module Puppet::Pops::Types
119
165
  end
120
166
  position = " #{p.join(' ')}" unless p.empty?
121
167
  end
122
- message(variant, position)
168
+ message(variant, position, tense)
123
169
  end
124
170
  end
125
171
 
@@ -142,38 +188,38 @@ module Puppet::Pops::Types
142
188
  end
143
189
 
144
190
  class MissingKey < KeyMismatch
145
- def message(variant, position)
146
- "#{variant}#{position} expects a value for key '#{key}'"
191
+ def message(variant, position, tense = :present)
192
+ "#{variant}#{position} #{it_expects(tense)} a value for key '#{key}'"
147
193
  end
148
194
  end
149
195
 
150
196
  class MissingParameter < KeyMismatch
151
- def message(variant, position)
152
- "#{variant}#{position} expects a value for parameter '#{key}'"
197
+ def message(variant, position, tense = :present)
198
+ "#{variant}#{position} #{it_expects(tense)} a value for parameter '#{key}'"
153
199
  end
154
200
  end
155
201
 
156
202
  class ExtraneousKey < KeyMismatch
157
- def message(variant, position)
158
- "#{variant}#{position} has no '#{@key}' key"
203
+ def message(variant, position, tense = :present)
204
+ "#{variant}#{position} #{it_has_no(tense)} '#{@key}' key"
159
205
  end
160
206
  end
161
207
 
162
208
  class InvalidParameter < ExtraneousKey
163
- def message(variant, position)
164
- "#{variant}#{position} has no parameter named '#{@key}'"
209
+ def message(variant, position, tense = :present)
210
+ "#{variant}#{position} #{it_has_no(tense)} parameter named '#{@key}'"
165
211
  end
166
212
  end
167
213
 
168
214
  class UnexpectedBlock < Mismatch
169
- def message(variant, position)
170
- "#{variant}#{position} does not expect a block"
215
+ def message(variant, position, tense = :present)
216
+ "#{variant}#{position} #{it_does_not_expect(tense)} a block"
171
217
  end
172
218
  end
173
219
 
174
220
  class MissingRequiredBlock < Mismatch
175
- def message(variant, position)
176
- "#{variant}#{position} expects a block"
221
+ def message(variant, position, tense = :present)
222
+ "#{variant}#{position} #{it_expects(tense)} a block"
177
223
  end
178
224
  end
179
225
 
@@ -182,8 +228,8 @@ module Puppet::Pops::Types
182
228
 
183
229
  def initialize(path, expected, actual)
184
230
  super(path)
185
- @expected = expected
186
- @actual = actual
231
+ @expected = (expected.is_a?(Array) ? PVariantType.new(expected) : expected).normalize
232
+ @actual = actual.normalize
187
233
  end
188
234
 
189
235
  def ==(o)
@@ -195,30 +241,34 @@ module Puppet::Pops::Types
195
241
  hash = hash * 31 + expected.hash
196
242
  hash * 31 + actual.hash
197
243
  end
244
+
245
+ def swap_expected(expected)
246
+ copy = self.clone
247
+ copy.instance_variable_set(:@expected, expected)
248
+ copy
249
+ end
198
250
  end
199
251
 
200
252
  class TypeMismatch < ExpectedActualMismatch
201
- include Puppet::Pops::LabelProvider
253
+ include LabelProvider
202
254
 
203
255
  # @return A new instance with the least restrictive respective boundaries
204
256
  def merge(path, o)
205
257
  self.class.new(path, [expected, o.expected].flatten.uniq, actual)
206
258
  end
207
259
 
208
- def message(variant, position)
260
+ def message(variant, position, tense = :present)
209
261
  e = expected
210
262
  a = actual
211
263
  multi = false
212
- if e.is_a?(Array)
213
- # Use simple names when classes differ, or in other words, only include details
214
- # when the classes are equal.
215
- #
216
- if e.find { |t| t.class == a.class }
217
- e = e.map { |t| t.to_s }
218
- a = a.to_s
264
+ if e.is_a?(PVariantType)
265
+ e = e.types
266
+ if report_detailed?(e, a)
267
+ a = detailed_actual_to_s(e, a)
268
+ e = e.map { |t| t.to_alias_expanded_s }
219
269
  else
220
- sns = e.map { |t| t.simple_name }
221
- e = e.map { |t| s = t.simple_name; sns.count {|x| x == s } == 1 ? s : t.to_s }
270
+ sns = e.map { |t| t.simple_name }.uniq
271
+ e = e.map { |t| s = t.simple_name; sns.count {|x| x == s } == 1 ? s : t.to_s }.uniq
222
272
  a = a.simple_name
223
273
  end
224
274
  case e.size
@@ -232,25 +282,105 @@ module Puppet::Pops::Types
232
282
  multi = true
233
283
  end
234
284
  else
235
- if e.class != a.class
285
+ if report_detailed?(e, a)
286
+ a = detailed_actual_to_s(e, a)
287
+ e = e.to_alias_expanded_s
288
+ else
236
289
  e = e.simple_name
237
290
  a = a.simple_name
238
- else
239
- e = e.to_s
240
- a = a.to_s
241
291
  end
242
292
  end
243
- multi ? "#{variant}#{position} expects a value of type #{e}, got #{label(a)}" : "#{variant}#{position} expects #{a_an(e)} value, got #{label(a)}"
293
+ if multi
294
+ "#{variant}#{position} #{it_expects(tense)} a value of type #{e}, got #{label(a)}"
295
+ else
296
+ "#{variant}#{position} #{it_expects(tense)} #{a_an(e)} value, got #{label(a)}"
297
+ end
244
298
  end
245
299
 
246
300
  def label(o)
247
301
  o.to_s
248
302
  end
303
+
304
+ private
305
+
306
+ # Decides whether or not the report must be fully detailed, or if generalization can be permitted
307
+ # in the mismatch report. All comparisons are made using resolved aliases rather than the alias
308
+ # itself.
309
+ #
310
+ # @param e [PAnyType,Array[PAnyType]] the expected type or array of expected types
311
+ # @param a [PAnyType] the actual type
312
+ # @return [Boolean] `true` when the class of _a_ equals the class _e_ or,
313
+ # in case _e_ is an `Array`, the class of at least one element of _e_
314
+ def always_fully_detailed?(e, a)
315
+ if e.is_a?(Array)
316
+ e.any? { |t| always_fully_detailed?(t, a) }
317
+ else
318
+ e.class == a.class || e.is_a?(PTypeAliasType) || a.is_a?(PTypeAliasType)
319
+ end
320
+ end
321
+
322
+ # @param e [PAnyType,Array[PAnyType]] the expected type or array of expected types
323
+ # @param a [PAnyType] the actual type
324
+ # @return [Boolean] `true` when _a_ is assignable to _e_ or, in case _e_ is an `Array`,
325
+ # to at least one element of _e_
326
+ def any_assignable?(e, a)
327
+ e.is_a?(Array) ? e.any? { |t| t.assignable?(a) } : e.assignable?(a)
328
+ end
329
+
330
+ # @param e [PAnyType,Array[PAnyType]] the expected type or array of expected types
331
+ # @param a [PAnyType] the actual type
332
+ # @return [Boolean] `true` when _a_ is assignable to the default generalization of _e_ or,
333
+ # in case _e_ is an `Array`, to the default generalization of at least one element of _e_
334
+ def assignable_to_default?(e, a)
335
+ if e.is_a?(Array)
336
+ e.any? { |t| assignable_to_default?(t, a) }
337
+ else
338
+ e = e.resolved_type if e.is_a?(PTypeAliasType)
339
+ e.class::DEFAULT.assignable?(a)
340
+ end
341
+ end
342
+
343
+ # @param e [PAnyType,Array[PAnyType]] the expected type or array of expected types
344
+ # @param a [PAnyType] the actual type
345
+ # @return [Boolean] `true` when either #always_fully_detailed or #assignable_to_default returns `true`
346
+ def report_detailed?(e, a)
347
+ always_fully_detailed?(e, a) || assignable_to_default?(e, a)
348
+ end
349
+
350
+ # Returns its argument with all type aliases resolved
351
+ # @param e [PAnyType,Array[PAnyType]] the expected type or array of expected types
352
+ # @return [PAnyType,Array[PAnyType]] the resolved result
353
+ def all_resolved(e)
354
+ if e.is_a?(Array)
355
+ e.map { |t| all_resolved(t) }
356
+ else
357
+ e.is_a?(PTypeAliasType) ? e.resolved_type : e
358
+ end
359
+ end
360
+
361
+ # Returns a string that either represents the generalized type _a_ or the type _a_ verbatim. The latter
362
+ # form is used when at least one of the following conditions are met:
363
+ #
364
+ # - #always_fully_detailed returns `true` for the resolved type of _e_ and _a_
365
+ # - #any_assignable? returns `true` for the resolved type of _e_ and the generalized type of _a_.
366
+ #
367
+ # @param e [PAnyType,Array[PAnyType]] the expected type or array of expected types
368
+ # @param a [PAnyType] the actual type
369
+ # @return [String] The string representation of the type _a_ or generalized type _a_
370
+ def detailed_actual_to_s(e, a)
371
+ e = all_resolved(e)
372
+ if always_fully_detailed?(e, a)
373
+ a.to_alias_expanded_s
374
+ else
375
+ g = a.generalize
376
+ any_assignable?(e, g) ? a.to_alias_expanded_s : g.to_s
377
+ end
378
+ end
249
379
  end
250
380
 
251
381
  class PatternMismatch < TypeMismatch
252
- def message(variant, position)
253
- "#{variant}#{position} expects a match for #{expected}, got #{actual_string}"
382
+ def message(variant, position, tense = :present)
383
+ "#{variant}#{position} #{it_expects(tense)} a match for #{expected.to_alias_expanded_s}, got #{actual_string}"
254
384
  end
255
385
 
256
386
  def actual_string
@@ -274,8 +404,8 @@ module Puppet::Pops::Types
274
404
  self.class.new(path, range, @actual)
275
405
  end
276
406
 
277
- def message(variant, position)
278
- "#{variant}#{position} expects size to be #{range_to_s(expected, '0')}, got #{range_to_s(actual, '0')}"
407
+ def message(variant, position, tense = :present)
408
+ "#{variant}#{position} #{it_expects(tense)} size to be #{range_to_s(expected, '0')}, got #{range_to_s(actual, '0')}"
279
409
  end
280
410
 
281
411
  def range_to_s(range, zero_string)
@@ -298,15 +428,17 @@ module Puppet::Pops::Types
298
428
  super(path, expected, actual)
299
429
  end
300
430
 
301
- def message(variant, position)
431
+ def message(variant, position, tense = :present)
302
432
  min = expected.from || 0
303
433
  max = expected.to || Float::INFINITY
304
434
  suffix = min == 1 && (max == 1 || max == Float::INFINITY) || min == 0 && max == 1 ? '' : 's'
305
- "#{variant}#{position} expects #{range_to_s(expected, 'no')} argument#{suffix}, got #{range_to_s(actual, 'none')}"
435
+ "#{variant}#{position} #{it_expects(tense)} #{range_to_s(expected, 'no')} argument#{suffix}, got #{range_to_s(actual, 'none')}"
306
436
  end
307
437
  end
308
438
 
309
439
  class TypeMismatchDescriber
440
+ include TenseVariants
441
+
310
442
  def self.validate_parameters(subject, params_struct, given_hash, missing_ok = false)
311
443
  singleton.validate_parameters(subject, params_struct, given_hash, missing_ok)
312
444
  end
@@ -330,15 +462,36 @@ module Puppet::Pops::Types
330
462
  # @param params_struct [PStructType] Struct to use for validation
331
463
  # @param given_hash [Hash<String,Object>] the parameters to validate
332
464
  # @param missing_ok [Boolean] Do not generate errors on missing parameters
465
+ # @param tense [Symbol] the symbol :present or :past
333
466
  #
334
- def validate_parameters(subject, params_struct, given_hash, missing_ok = false)
467
+ def validate_parameters(subject, params_struct, given_hash, missing_ok = false, tense = :present)
335
468
  errors = describe_struct_signature(params_struct, given_hash, missing_ok).flatten
336
469
  case errors.size
337
470
  when 0
338
471
  when 1
339
- raise Puppet::ParseError.new("#{subject}:#{errors[0]}")
472
+ raise Puppet::ParseError.new("#{subject}:#{errors[0].format(tense)}")
340
473
  else
341
- raise Puppet::ParseError.new("#{subject}:\n #{errors.join("\n ")}")
474
+ errors_str = errors.map { |error| error.format(tense) }.join("\n ")
475
+ raise Puppet::ParseError.new("#{subject}:\n #{errors_str}")
476
+ end
477
+ end
478
+
479
+ # Describe a confirmed mismatch using present tense
480
+ #
481
+ # @param name [String] name of mismatch
482
+ # @param expected [PAnyType] expected type
483
+ # @param actual [PAnyType] actual type
484
+ # @param tense [Symbol] the symbol :present or :past
485
+ #
486
+ def describe_mismatch(name, expected, actual, tense = :past)
487
+ errors = describe(expected, actual, [SubjectPathElement.new(name)])
488
+ case errors.size
489
+ when 0
490
+ ''
491
+ when 1
492
+ errors[0].format(tense).strip
493
+ else
494
+ errors.map { |error| error.format(tense) }.join("\n ")
342
495
  end
343
496
  end
344
497
 
@@ -346,16 +499,18 @@ module Puppet::Pops::Types
346
499
  # @param param_name [String] parameter name
347
500
  # @param param_type [PAnyType] parameter type
348
501
  # @param value [Object] value to be validated against the given type
502
+ # @param tense [Symbol] the symbol :present or :past
349
503
  #
350
- def validate_default_parameter(subject, param_name, param_type, value)
504
+ def validate_default_parameter(subject, param_name, param_type, value, tense = :present)
351
505
  unless param_type.instance?(value)
352
506
  errors = describe(param_type, TypeCalculator.singleton.infer_set(value).generalize, [ParameterPathElement.new(param_name)])
353
507
  case errors.size
354
508
  when 0
355
509
  when 1
356
- raise Puppet::ParseError.new("#{subject}:#{errors[0]}")
510
+ raise Puppet::ParseError.new("#{subject}:#{errors[0].format(tense)}")
357
511
  else
358
- raise Puppet::ParseError.new("#{subject}:\n #{errors.join("\n ")}")
512
+ errors_str = errors.map { |error| error.format(tense) }.join("\n ")
513
+ raise Puppet::ParseError.new("#{subject}:\n #{errors_str}")
359
514
  end
360
515
  end
361
516
  end
@@ -385,7 +540,7 @@ module Puppet::Pops::Types
385
540
  result
386
541
  end
387
542
 
388
- def describe_signatures(closure, signatures, args_tuple)
543
+ def describe_signatures(closure, signatures, args_tuple, tense = :present)
389
544
  error_arrays = []
390
545
  signatures.each_with_index do |signature, index|
391
546
  error_arrays << describe_signature_arguments(signature, args_tuple, [SignaturePathElement.new(index)])
@@ -411,17 +566,17 @@ module Puppet::Pops::Types
411
566
  label = closure == 'lambda' ? 'block' : "'#{closure}'"
412
567
  errors = merge_descriptions(0, CountMismatch, error_arrays)
413
568
  if errors.size == 1
414
- "#{label}#{errors[0]}"
569
+ "#{label}#{errors[0].format(tense)}"
415
570
  else
416
571
  if signatures.size == 1
417
572
  sig = signatures[0]
418
- result = ["#{label} expected (#{signature_string(sig)})"]
419
- result.concat(error_arrays[0].map { |e| " rejected:#{e.chop_path(0)}" })
573
+ result = ["#{label} #{it_expects(tense)} (#{signature_string(sig)})"]
574
+ result.concat(error_arrays[0].map { |e| " rejected:#{e.chop_path(0).format(tense)}" })
420
575
  else
421
- result = ["#{label} expected one of:"]
576
+ result = ["#{label} #{it_expects(tense)} one of:"]
422
577
  signatures.each_with_index do |sg, index|
423
578
  result << " (#{signature_string(sg)})"
424
- result.concat(error_arrays[index].map { |e| " rejected:#{e.chop_path(0)}" })
579
+ result.concat(error_arrays[index].map { |e| " rejected:#{e.chop_path(0).format(tense)}" })
425
580
  end
426
581
  end
427
582
  result.join("\n")
@@ -531,6 +686,17 @@ module Puppet::Pops::Types
531
686
  [PatternMismatch.new(path, expected, actual)]
532
687
  end
533
688
 
689
+ def describe_PTypeAliasType(expected, actual, path)
690
+ resolved_type = expected.resolved_type.normalize
691
+ describe(resolved_type, actual, path).map do |description|
692
+ if description.is_a?(ExpectedActualMismatch) && description.expected.equal?(resolved_type)
693
+ description.swap_expected(expected)
694
+ else
695
+ description
696
+ end
697
+ end
698
+ end
699
+
534
700
  def describe_PStructType(expected, actual, path)
535
701
  elements = expected.elements
536
702
  descriptions = []
@@ -667,6 +833,8 @@ module Puppet::Pops::Types
667
833
  describe_PPatternType(expected, actual, path)
668
834
  when PEnumType
669
835
  describe_PEnumType(expected, actual, path)
836
+ when PTypeAliasType
837
+ describe_PTypeAliasType(expected, actual, path)
670
838
  else
671
839
  describe_PAnyType(expected, actual, path)
672
840
  end
@@ -688,12 +856,11 @@ module Puppet::Pops::Types
688
856
  required_count = from
689
857
  types =
690
858
  case param_types
691
- when Puppet::Pops::Types::PTupleType
859
+ when PTupleType
692
860
  param_types.types
693
- when Puppet::Pops::Types::PArrayType
861
+ when PArrayType
694
862
  [param_types.element_type]
695
863
  end
696
- tc = Puppet::Pops::Types::TypeCalculator.singleton
697
864
 
698
865
  # join type with names (types are always present, names are optional)
699
866
  # separate entries with comma
@@ -708,17 +875,17 @@ module Puppet::Pops::Types
708
875
  indicator = from == param_names.size ? '+' : '*'
709
876
  elsif optional(index, required_count)
710
877
  indicator = '?'
711
- type = type.optional_type if type.is_a?(Puppet::Pops::Types::POptionalType)
878
+ type = type.optional_type if type.is_a?(POptionalType)
712
879
  end
713
- "#{tc.string(type)} #{name}#{indicator}"
880
+ "#{type} #{name}#{indicator}"
714
881
  end.join(', ')
715
882
 
716
883
  # If there is a block, include it
717
884
  case signature.type.block_type
718
- when Puppet::Pops::Types::POptionalType
885
+ when POptionalType
719
886
  result << ', ' unless result == ''
720
887
  result << "#{signature.type.block_type.optional_type} #{signature.block_name}?"
721
- when Puppet::Pops::Types::PCallableType
888
+ when PCallableType
722
889
  result << ', ' unless result == ''
723
890
  result << "#{signature.type.block_type} #{signature.block_name}"
724
891
  when NilClass
@@ -740,4 +907,4 @@ module Puppet::Pops::Types
740
907
  end
741
908
  end
742
909
  end
743
-
910
+ end