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,280 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops'
3
+
4
+ module Puppet::Pops::Types
5
+ describe 'The type formatter' do
6
+ let(:s) { TypeFormatter.new }
7
+ let(:f) { TypeFactory }
8
+
9
+ context 'when representing the type as string' do
10
+ include_context 'types_setup'
11
+
12
+ it "should yield 'Type' for PType" do
13
+ expect(s.string(f.type_type)).to eq('Type')
14
+ end
15
+
16
+ it "should yield 'Object' for PAnyType" do
17
+ expect(s.string(f.any)).to eq('Any')
18
+ end
19
+
20
+ it "should yield 'Scalar' for PScalarType" do
21
+ expect(s.string(f.scalar)).to eq('Scalar')
22
+ end
23
+
24
+ it "should yield 'Boolean' for PBooleanType" do
25
+ expect(s.string(f.boolean)).to eq('Boolean')
26
+ end
27
+
28
+ it "should yield 'Data' for PDataType" do
29
+ expect(s.string(f.data)).to eq('Data')
30
+ end
31
+
32
+ it "should yield 'Numeric' for PNumericType" do
33
+ expect(s.string(f.numeric)).to eq('Numeric')
34
+ end
35
+
36
+ it "should yield 'Integer' and from/to for PIntegerType" do
37
+ expect(s.string(f.integer)).to eq('Integer')
38
+ expect(s.string(f.range(1,1))).to eq('Integer[1, 1]')
39
+ expect(s.string(f.range(1,2))).to eq('Integer[1, 2]')
40
+ expect(s.string(f.range(:default, 2))).to eq('Integer[default, 2]')
41
+ expect(s.string(f.range(2, :default))).to eq('Integer[2, default]')
42
+ end
43
+
44
+ it "should yield 'Float' for PFloatType" do
45
+ expect(s.string(f.float)).to eq('Float')
46
+ end
47
+
48
+ it "should yield 'Regexp' for PRegexpType" do
49
+ expect(s.string(f.regexp)).to eq('Regexp')
50
+ end
51
+
52
+ it "should yield 'Regexp[/pat/]' for parameterized PRegexpType" do
53
+ expect(s.string(f.regexp('a/b'))).to eq('Regexp[/a\/b/]')
54
+ end
55
+
56
+ it "should yield 'String' for PStringType" do
57
+ expect(s.string(f.string)).to eq('String')
58
+ end
59
+
60
+ it "should yield 'String' for PStringType with multiple values" do
61
+ expect(s.string(f.string(nil, 'a', 'b', 'c'))).to eq('String')
62
+ end
63
+
64
+ it "should yield 'String' and from/to for PStringType" do
65
+ expect(s.string(f.string(f.range(1,1)))).to eq('String[1, 1]')
66
+ expect(s.string(f.string(f.range(1,2)))).to eq('String[1, 2]')
67
+ expect(s.string(f.string(f.range(:default, 2)))).to eq('String[default, 2]')
68
+ expect(s.string(f.string(f.range(2, :default)))).to eq('String[2, default]')
69
+ end
70
+
71
+ it "should yield 'Array[Integer]' for PArrayType[PIntegerType]" do
72
+ expect(s.string(f.array_of(f.integer))).to eq('Array[Integer]')
73
+ end
74
+
75
+ it "should yield 'Array' for PArrayType::DATA" do
76
+ expect(s.string(f.array_of_data)).to eq('Array')
77
+ end
78
+
79
+ it "should yield 'Array[Unit, 0, 0]' for an empty array" do
80
+ t = f.array_of(PUnitType::DEFAULT, f.range(0,0))
81
+ expect(s.string(t)).to eq('Array[Unit, 0, 0]')
82
+ end
83
+
84
+ it "should yield 'Collection' and from/to for PCollectionType" do
85
+ expect(s.string(f.collection(f.range(1,1)))).to eq('Collection[1, 1]')
86
+ expect(s.string(f.collection(f.range(1,2)))).to eq('Collection[1, 2]')
87
+ expect(s.string(f.collection(f.range(:default, 2)))).to eq('Collection[default, 2]')
88
+ expect(s.string(f.collection(f.range(2, :default)))).to eq('Collection[2, default]')
89
+ end
90
+
91
+ it "should yield 'Array' and from/to for PArrayType" do
92
+ expect(s.string(f.array_of(f.string, f.range(1,1)))).to eq('Array[String, 1, 1]')
93
+ expect(s.string(f.array_of(f.string, f.range(1,2)))).to eq('Array[String, 1, 2]')
94
+ expect(s.string(f.array_of(f.string, f.range(:default, 2)))).to eq('Array[String, default, 2]')
95
+ expect(s.string(f.array_of(f.string, f.range(2, :default)))).to eq('Array[String, 2, default]')
96
+ end
97
+
98
+ it "should yield 'Iterable' for PIterableType" do
99
+ expect(s.string(f.iterable)).to eq('Iterable')
100
+ end
101
+
102
+ it "should yield 'Iterable[Integer]' for PIterableType[PIntegerType]" do
103
+ expect(s.string(f.iterable(f.integer))).to eq('Iterable[Integer]')
104
+ end
105
+
106
+ it "should yield 'Iterator' for PIteratorType" do
107
+ expect(s.string(f.iterator)).to eq('Iterator')
108
+ end
109
+
110
+ it "should yield 'Iterator[Integer]' for PIteratorType[PIntegerType]" do
111
+ expect(s.string(f.iterator(f.integer))).to eq('Iterator[Integer]')
112
+ end
113
+
114
+ it "should yield 'Tuple[Integer]' for PTupleType[PIntegerType]" do
115
+ expect(s.string(f.tuple([f.integer]))).to eq('Tuple[Integer]')
116
+ end
117
+
118
+ it "should yield 'Tuple[T, T,..]' for PTupleType[T, T, ...]" do
119
+ expect(s.string(f.tuple([f.integer, f.integer, f.string]))).to eq('Tuple[Integer, Integer, String]')
120
+ end
121
+
122
+ it "should yield 'Tuple' and from/to for PTupleType" do
123
+ types = [f.string]
124
+ expect(s.string(f.tuple(types, f.range(1,1)))).to eq('Tuple[String, 1, 1]')
125
+ expect(s.string(f.tuple(types, f.range(1,2)))).to eq('Tuple[String, 1, 2]')
126
+ expect(s.string(f.tuple(types, f.range(:default, 2)))).to eq('Tuple[String, 0, 2]')
127
+ expect(s.string(f.tuple(types, f.range(2, :default)))).to eq('Tuple[String, 2, default]')
128
+ end
129
+
130
+ it "should yield 'Struct' and details for PStructType" do
131
+ struct_t = f.struct({'a'=>Integer, 'b'=>String})
132
+ expect(s.string(struct_t)).to eq("Struct[{'a' => Integer, 'b' => String}]")
133
+ struct_t = f.struct({})
134
+ expect(s.string(struct_t)).to eq('Struct')
135
+ end
136
+
137
+ it "should yield 'Hash[String, Integer]' for PHashType[PStringType, PIntegerType]" do
138
+ expect(s.string(f.hash_of(f.integer, f.string))).to eq('Hash[String, Integer]')
139
+ end
140
+
141
+ it "should yield 'Hash' and from/to for PHashType" do
142
+ expect(s.string(f.hash_of(f.string, f.string, f.range(1,1)))).to eq('Hash[String, String, 1, 1]')
143
+ expect(s.string(f.hash_of(f.string, f.string, f.range(1,2)))).to eq('Hash[String, String, 1, 2]')
144
+ expect(s.string(f.hash_of(f.string, f.string, f.range(:default, 2)))).to eq('Hash[String, String, default, 2]')
145
+ expect(s.string(f.hash_of(f.string, f.string, f.range(2, :default)))).to eq('Hash[String, String, 2, default]')
146
+ end
147
+
148
+ it "should yield 'Hash' for PHashType::DATA" do
149
+ expect(s.string(f.hash_of_data)).to eq('Hash')
150
+ end
151
+
152
+ it "should yield 'Class' for a PHostClassType" do
153
+ expect(s.string(f.host_class)).to eq('Class')
154
+ end
155
+
156
+ it "should yield 'Class[x]' for a PHostClassType[x]" do
157
+ expect(s.string(f.host_class('x'))).to eq('Class[x]')
158
+ end
159
+
160
+ it "should yield 'Resource' for a PResourceType" do
161
+ expect(s.string(f.resource)).to eq('Resource')
162
+ end
163
+
164
+ it "should yield 'File' for a PResourceType['File']" do
165
+ expect(s.string(f.resource('File'))).to eq('File')
166
+ end
167
+
168
+ it "should yield 'File['/tmp/foo']' for a PResourceType['File', '/tmp/foo']" do
169
+ expect(s.string(f.resource('File', '/tmp/foo'))).to eq("File['/tmp/foo']")
170
+ end
171
+
172
+ it "should yield 'Enum[s,...]' for a PEnumType[s,...]" do
173
+ t = f.enum('a', 'b', 'c')
174
+ expect(s.string(t)).to eq("Enum['a', 'b', 'c']")
175
+ end
176
+
177
+ it "should yield 'Pattern[/pat/,...]' for a PPatternType['pat',...]" do
178
+ t = f.pattern('a')
179
+ t2 = f.pattern('a', 'b', 'c')
180
+ expect(s.string(t)).to eq('Pattern[/a/]')
181
+ expect(s.string(t2)).to eq('Pattern[/a/, /b/, /c/]')
182
+ end
183
+
184
+ it "should escape special characters in the string for a PPatternType['pat',...]" do
185
+ t = f.pattern('a/b')
186
+ expect(s.string(t)).to eq("Pattern[/a\\/b/]")
187
+ end
188
+
189
+ it "should yield 'Variant[t1,t2,...]' for a PVariantType[t1, t2,...]" do
190
+ t1 = f.string
191
+ t2 = f.integer
192
+ t3 = f.pattern('a')
193
+ t = f.variant(t1, t2, t3)
194
+ expect(s.string(t)).to eq('Variant[String, Integer, Pattern[/a/]]')
195
+ end
196
+
197
+ it "should yield 'Callable' for generic callable" do
198
+ expect(s.string(f.all_callables)).to eql('Callable')
199
+ end
200
+
201
+ it "should yield 'Callable[0,0]' for callable without params" do
202
+ expect(s.string(f.callable)).to eql('Callable[0, 0]')
203
+ end
204
+
205
+ it "should yield 'Callable[t,t]' for callable with typed parameters" do
206
+ expect(s.string(f.callable(String, Integer))).to eql('Callable[String, Integer]')
207
+ end
208
+
209
+ it "should yield 'Callable[t,min,max]' for callable with size constraint (infinite max)" do
210
+ expect(s.string(f.callable(String, 0))).to eql('Callable[String, 0, default]')
211
+ end
212
+
213
+ it "should yield 'Callable[t,min,max]' for callable with size constraint (capped max)" do
214
+ expect(s.string(f.callable(String, 0, 3))).to eql('Callable[String, 0, 3]')
215
+ end
216
+
217
+ it "should yield 'Callable[min,max]' callable with size > 0" do
218
+ expect(s.string(f.callable(0, 0))).to eql('Callable[0, 0]')
219
+ expect(s.string(f.callable(0, 1))).to eql('Callable[0, 1]')
220
+ expect(s.string(f.callable(0, :default))).to eql('Callable[0, default]')
221
+ end
222
+
223
+ it "should yield 'Callable[Callable]' for callable with block" do
224
+ expect(s.string(f.callable(f.all_callables))).to eql('Callable[0, 0, Callable]')
225
+ expect(s.string(f.callable(f.string, f.all_callables))).to eql('Callable[String, Callable]')
226
+ expect(s.string(f.callable(f.string, 1,1, f.all_callables))).to eql('Callable[String, 1, 1, Callable]')
227
+ end
228
+
229
+ it 'should yield Unit for a Unit type' do
230
+ expect(s.string(PUnitType::DEFAULT)).to eql('Unit')
231
+ end
232
+
233
+ it "should yield 'NotUndef' for a PNotUndefType" do
234
+ t = f.not_undef
235
+ expect(s.string(t)).to eq('NotUndef')
236
+ end
237
+
238
+ it "should yield 'NotUndef[T]' for a PNotUndefType[T]" do
239
+ t = f.not_undef(f.data)
240
+ expect(s.string(t)).to eq('NotUndef[Data]')
241
+ end
242
+
243
+ it "should yield 'NotUndef['string']' for a PNotUndefType['string']" do
244
+ t = f.not_undef('hey')
245
+ expect(s.string(t)).to eq("NotUndef['hey']")
246
+ end
247
+
248
+ it "should yield the name of an unparameterized type reference" do
249
+ t = f.type_reference('What')
250
+ expect(s.string(t)).to eq('What')
251
+ end
252
+
253
+ it "should yield the name and arguments of an parameterized type reference" do
254
+ t = f.type_reference('What', [f.undef, f.string])
255
+ expect(s.string(t)).to eq('What[Undef, String]')
256
+ end
257
+
258
+ it "should yield the name of a type alias" do
259
+ t = f.type_alias('Alias', 'Integer')
260
+ expect(s.string(t)).to eq('Alias')
261
+ end
262
+
263
+ it "should yield 'Type[Runtime[ruby, Puppet]]' for the Puppet module" do
264
+ expect(s.string(Puppet)).to eq('Runtime[ruby, "Puppet"]')
265
+ end
266
+
267
+ it "should yield 'Type[Runtime[ruby, Puppet::Pops]]' for the Puppet::Resource class" do
268
+ expect(s.string(Puppet::Resource)).to eq('Runtime[ruby, "Puppet::Resource"]')
269
+ end
270
+
271
+ it 'should present a valid simple name' do
272
+ (all_types - [PType]).each do |t|
273
+ name = t::DEFAULT.simple_name
274
+ expect(t.name).to match("^Puppet::Pops::Types::P#{name}Type$")
275
+ end
276
+ expect(PType::DEFAULT.simple_name).to eql('Type')
277
+ end
278
+ end
279
+ end
280
+ end
@@ -0,0 +1,152 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops'
3
+ require 'puppet_spec/compiler'
4
+
5
+ module Puppet::Pops
6
+ module Types
7
+
8
+ describe 'the type mismatch describer' do
9
+ include PuppetSpec::Compiler
10
+
11
+ it 'will report a mismatch between a hash and a struct with details' do
12
+ code = <<-CODE
13
+ function f(Hash[String,String] $h) {
14
+ $h['a']
15
+ }
16
+ f({'a' => 'a', 'b' => 23})
17
+ CODE
18
+ expect { eval_and_collect_notices(code) }.to raise_error(Puppet::Error, /expects a Hash\[String, String\] value, got Struct\[\{'a' => String, 'b' => Integer\}\]/)
19
+ end
20
+
21
+ it 'will report a mismatch between a array and tuple with details' do
22
+ code = <<-CODE
23
+ function f(Array[String] $h) {
24
+ $h[0]
25
+ }
26
+ f(['a', 23])
27
+ CODE
28
+ expect { eval_and_collect_notices(code) }.to raise_error(Puppet::Error, /expects an Array\[String\] value, got Tuple\[String, Integer\]/)
29
+ end
30
+
31
+ it 'will not report details for a mismatch between an array and a struct' do
32
+ code = <<-CODE
33
+ function f(Array[String] $h) {
34
+ $h[0]
35
+ }
36
+ f({'a' => 'a string', 'b' => 23})
37
+ CODE
38
+ expect { eval_and_collect_notices(code) }.to raise_error(Puppet::Error, /expects an Array value, got Struct/)
39
+ end
40
+
41
+ it 'will not report details for a mismatch between a hash and a tuple' do
42
+ code = <<-CODE
43
+ function f(Hash[String,String] $h) {
44
+ $h['a']
45
+ }
46
+ f(['a', 23])
47
+ CODE
48
+ expect { eval_and_collect_notices(code) }.to raise_error(Puppet::Error, /expects a Hash value, got Tuple/)
49
+ end
50
+
51
+ it 'will include the aliased type when reporting a mismatch that involves an alias' do
52
+ code = <<-CODE
53
+ type UnprivilegedPort = Integer[1024,65537]
54
+
55
+ function check_port(UnprivilegedPort $port) {}
56
+ check_port(34)
57
+ CODE
58
+ expect { eval_and_collect_notices(code) }.to raise_error(Puppet::Error, /parameter 'port' expects an UnprivilegedPort = Integer\[1024, 65537\] value, got Integer\[34, 34\]/)
59
+ end
60
+
61
+ it 'will include the aliased type when reporting a mismatch that involves an alias nested in another type' do
62
+ code = <<-CODE
63
+ type UnprivilegedPort = Integer[1024,65537]
64
+ type PortMap = Hash[UnprivilegedPort,String]
65
+
66
+ function check_port(PortMap $ports) {}
67
+ check_port({ 34 => 'some service'})
68
+ CODE
69
+ expect { eval_and_collect_notices(code) }.to(raise_error(Puppet::Error,
70
+ /parameter 'ports' expects a PortMap = Hash\[UnprivilegedPort = Integer\[1024, 65537\], String\] value, got Hash\[Integer\[34, 34\], String\[12, 12\]\]/))
71
+ end
72
+
73
+ it 'will not include the aliased type more than once when reporting a mismatch that involves an alias that is self recursive' do
74
+ code = <<-CODE
75
+ type Tree = Hash[String,Tree]
76
+
77
+ function check_tree(Tree $tree) {}
78
+ check_tree({ 'x' => {'y' => {32 => 'n'}}})
79
+ CODE
80
+ expect { eval_and_collect_notices(code) }.to(raise_error(Puppet::Error,
81
+ /parameter 'tree' expects a Tree = Hash\[String, Tree\] value, got Struct\[\{'x' => Struct\[\{'y' => Hash\[Integer, String\]\}\]\}\]/))
82
+ end
83
+
84
+ it 'will use type normalization' do
85
+ code = <<-CODE
86
+ type EVariants = Variant[Enum[a,b],Enum[b,c],Enum[c,d]]
87
+
88
+ function check_enums(EVariants $evars) {}
89
+ check_enums('n')
90
+ CODE
91
+ expect { eval_and_collect_notices(code) }.to(raise_error(Puppet::Error,
92
+ /parameter 'evars' expects a match for EVariants = Enum\['a', 'b', 'c', 'd'\], got 'n'/))
93
+ end
94
+
95
+ context 'when using present tense' do
96
+ let(:parser) { TypeParser.new }
97
+ let(:subject) { TypeMismatchDescriber.singleton }
98
+ it 'reports a missing parameter as "has no parameter"' do
99
+ t = parser.parse('Struct[{a=>String}]')
100
+ expect { subject.validate_parameters('v', t, {'a'=>'a','b'=>'b'}, false, :present) }.to raise_error(Puppet::Error, "v: has no parameter named 'b'")
101
+ end
102
+
103
+ it 'reports a missing value as "expects a value"' do
104
+ t = parser.parse('Struct[{a=>String,b=>String}]')
105
+ expect { subject.validate_parameters('v', t, {'a'=>'a'}, false, :present) }.to raise_error(Puppet::Error, "v: expects a value for parameter 'b'")
106
+ end
107
+
108
+ it 'reports a missing block as "expects a block"' do
109
+ callable = parser.parse('Callable[String,String,Callable]')
110
+ args_tuple = parser.parse('Tuple[String,String]')
111
+ dispatch = Functions::Dispatch.new(callable, 'foo', ['a','b'], 'block', nil, nil, false)
112
+ expect(subject.describe_signatures('function', [dispatch], args_tuple, :present)).to eq("'function' expects a block")
113
+ end
114
+
115
+ it 'reports an unexpected block as "does not expect a block"' do
116
+ callable = parser.parse('Callable[String,String]')
117
+ args_tuple = parser.parse('Tuple[String,String,Callable]')
118
+ dispatch = Functions::Dispatch.new(callable, 'foo', ['a','b'], nil, nil, nil, false)
119
+ expect(subject.describe_signatures('function', [dispatch], args_tuple, :present)).to eq("'function' does not expect a block")
120
+ end
121
+ end
122
+
123
+ context 'when using past tense' do
124
+ let(:parser) { TypeParser.new }
125
+ let(:subject) { TypeMismatchDescriber.singleton }
126
+ it 'reports a missing parameter as "did not have a parameter"' do
127
+ t = parser.parse('Struct[{a=>String}]')
128
+ expect { subject.validate_parameters('v', t, {'a'=>'a','b'=>'b'}, false, :past) }.to raise_error(Puppet::Error, "v: did not have a parameter named 'b'")
129
+ end
130
+
131
+ it 'reports a missing value as "expected a value"' do
132
+ t = parser.parse('Struct[{a=>String,b=>String}]')
133
+ expect { subject.validate_parameters('v', t, {'a'=>'a'}, false, :past) }.to raise_error(Puppet::Error, "v: expected a value for parameter 'b'")
134
+ end
135
+
136
+ it 'reports a missing block as "expected a block"' do
137
+ callable = parser.parse('Callable[String,String,Callable]')
138
+ args_tuple = parser.parse('Tuple[String,String]')
139
+ dispatch = Functions::Dispatch.new(callable, 'foo', ['a','b'], 'block', nil, nil, false)
140
+ expect(subject.describe_signatures('function', [dispatch], args_tuple, :past)).to eq("'function' expected a block")
141
+ end
142
+
143
+ it 'reports an unexpected block as "did not expect a block"' do
144
+ callable = parser.parse('Callable[String,String]')
145
+ args_tuple = parser.parse('Tuple[String,String,Callable]')
146
+ dispatch = Functions::Dispatch.new(callable, 'foo', ['a','b'], nil, nil, nil, false)
147
+ expect(subject.describe_signatures('function', [dispatch], args_tuple, :past)).to eq("'function' did not expect a block")
148
+ end
149
+ end
150
+ end
151
+ end
152
+ end
@@ -6,8 +6,6 @@ describe Puppet::Pops::Types::TypeParser do
6
6
 
7
7
  let(:parser) { Puppet::Pops::Types::TypeParser.new }
8
8
  let(:types) { Puppet::Pops::Types::TypeFactory }
9
-
10
-
11
9
  it "rejects a puppet expression" do
12
10
  expect { parser.parse("1 + 1") }.to raise_error(Puppet::ParseError, /The expression <1 \+ 1> is not a valid type specification/)
13
11
  end
@@ -135,20 +133,64 @@ describe Puppet::Pops::Types::TypeParser do
135
133
  expect { parser.parse("Hash[Integer, Integer, 1,2,3]") }.to raise_the_parameter_error("Hash", "2 to 4", 5)
136
134
  end
137
135
 
138
- it "interprets anything that is not a built in type to be a resource type" do
139
- expect(parser.parse("File")).to be_the_type(types.resource('file'))
140
- end
136
+ context 'with scope context and loader' do
137
+ let!(:scope) { {} }
138
+
139
+ before :each do
140
+ loader = mock
141
+ loader.stubs(:load).returns nil
142
+ Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object).with(instance_of(Puppet::Pops::Model::QualifiedReference), scope).at_most_once.returns loader
143
+ end
144
+
145
+ it "interprets anything that is not a built in type to be a resource type" do
146
+ expect(parser.parse('File', scope)).to be_the_type(types.resource('file'))
147
+ end
141
148
 
142
- it "parses a resource type with title" do
143
- expect(parser.parse("File['/tmp/foo']")).to be_the_type(types.resource('file', '/tmp/foo'))
149
+ it "parses a resource type with title" do
150
+ expect(parser.parse("File['/tmp/foo']", scope)).to be_the_type(types.resource('file', '/tmp/foo'))
151
+ end
152
+
153
+ it "parses a resource type using 'Resource[type]' form" do
154
+ expect(parser.parse("Resource[File]", scope)).to be_the_type(types.resource('file'))
155
+ end
156
+
157
+ it "parses a resource type with title using 'Resource[type, title]'" do
158
+ expect(parser.parse("Resource[File, '/tmp/foo']", scope)).to be_the_type(types.resource('file', '/tmp/foo'))
159
+ end
144
160
  end
145
161
 
146
- it "parses a resource type using 'Resource[type]' form" do
147
- expect(parser.parse("Resource[File]")).to be_the_type(types.resource('file'))
162
+ context 'with loader context' do
163
+ let(:loader) { Puppet::Pops::Loader::BaseLoader.new(nil, "type_parser_unit_test_loader") }
164
+ before :each do
165
+ loader.stubs(:load).returns nil
166
+ Puppet::Pops::Adapters::LoaderAdapter.expects(:loader_for_model_object).never
167
+ end
168
+
169
+ it "interprets anything that is not a built in type to be a resource type" do
170
+ expect(parser.parse('File', loader)).to be_the_type(types.resource('file'))
171
+ end
172
+
173
+ it "parses a resource type with title" do
174
+ expect(parser.parse("File['/tmp/foo']", loader)).to be_the_type(types.resource('file', '/tmp/foo'))
175
+ end
176
+
177
+ it "parses a resource type using 'Resource[type]' form" do
178
+ expect(parser.parse("Resource[File]", loader)).to be_the_type(types.resource('file'))
179
+ end
180
+
181
+ it "parses a resource type with title using 'Resource[type, title]'" do
182
+ expect(parser.parse("Resource[File, '/tmp/foo']", loader)).to be_the_type(types.resource('file', '/tmp/foo'))
183
+ end
148
184
  end
149
185
 
150
- it "parses a resource type with title using 'Resource[type, title]'" do
151
- expect(parser.parse("Resource[File, '/tmp/foo']")).to be_the_type(types.resource('file', '/tmp/foo'))
186
+ context 'without a scope' do
187
+ it "interprets anything that is not a built in type to be a type reference" do
188
+ expect(parser.parse('File')).to eq(types.type_reference('File'))
189
+ end
190
+
191
+ it "interprets anything that is not a built in type with parameterers to be type reference with parameters" do
192
+ expect(parser.parse("File['/tmp/foo']")).to eq(types.type_reference('File', ['/tmp/foo']))
193
+ end
152
194
  end
153
195
 
154
196
  it "parses a host class type" do
@@ -163,6 +205,10 @@ describe Puppet::Pops::Types::TypeParser do
163
205
  expect(parser.parse("Integer[1,2]")).to be_the_type(types.range(1,2))
164
206
  end
165
207
 
208
+ it 'parses a negative integer range' do
209
+ expect(parser.parse("Integer[-3,-1]")).to be_the_type(types.range(-3,-1))
210
+ end
211
+
166
212
  it 'parses a float range' do
167
213
  expect(parser.parse("Float[1.0,2.0]")).to be_the_type(types.float_range(1.0,2.0))
168
214
  end
@@ -237,7 +283,6 @@ describe Puppet::Pops::Types::TypeParser do
237
283
  end
238
284
 
239
285
  def the_type_spec_for(type)
240
- calc = Puppet::Pops::Types::TypeCalculator.new
241
- calc.string(type)
286
+ Puppet::Pops::Types::TypeFormatter.string(type)
242
287
  end
243
288
  end