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
@@ -268,11 +268,11 @@ describe "the 'defined' function" do
268
268
  end
269
269
 
270
270
  it 'raises error if referencing undef' do
271
- expect{func.call(@scope, nil)}.to raise_error(ArgumentError, /'defined' parameter 'vals' expects a value of type String, Type\[CatalogEntry\], or Type\[Type\[CatalogEntry\]\], got Undef/)
271
+ expect{func.call(@scope, nil)}.to raise_error(ArgumentError, /'defined' parameter 'vals' expects a value of type String or Type, got Undef/)
272
272
  end
273
273
 
274
274
  it 'raises error if referencing a number' do
275
- expect{func.call(@scope, 42)}.to raise_error(ArgumentError, /'defined' parameter 'vals' expects a value of type String, Type\[CatalogEntry\], or Type\[Type\[CatalogEntry\]\], got Integer/)
275
+ expect{func.call(@scope, 42)}.to raise_error(ArgumentError, /'defined' parameter 'vals' expects a value of type String or Type, got Integer/)
276
276
  end
277
277
 
278
278
  it 'is false if referencing empty string' do
@@ -5,7 +5,7 @@ describe "the epp function" do
5
5
 
6
6
  let :node do Puppet::Node.new('localhost') end
7
7
  let :compiler do Puppet::Parser::Compiler.new(node) end
8
- let :scope do Puppet::Parser::Scope.new(compiler) end
8
+ let :scope do compiler.topscope end
9
9
 
10
10
  context "when accessing scope variables as $ variables" do
11
11
  it "looks up the value from the scope" do
@@ -27,11 +27,19 @@ describe "the epp function" do
27
27
  expect(eval_template_with_args("<%= $phantom == dragos %>", 'phantom' => 'dragos')).to eq("true")
28
28
  end
29
29
 
30
- it "can use values from the enclosing scope for defaults" do
30
+ it "can use values from the global scope for defaults" do
31
31
  scope['phantom'] = 'of the opera'
32
- expect(eval_template("<%- |$phantom = $phantom| -%><%= $phantom %>")).to eq("of the opera")
32
+ expect(eval_template("<%- |$phantom = $::phantom| -%><%= $phantom %>")).to eq("of the opera")
33
33
  end
34
34
 
35
+ it "will not use values from the enclosing scope for defaults" do
36
+ scope['the_phantom'] = 'of the state opera'
37
+ scope.new_ephemeral(true)
38
+ scope['the_phantom'] = 'of the local opera'
39
+ expect(scope['the_phantom']).to eq('of the local opera')
40
+ expect(eval_template("<%- |$phantom = $the_phantom| -%><%= $phantom %>")).to eq("of the state opera")
41
+ end
42
+
35
43
  it "uses the default value if the given value is undef/nil" do
36
44
  expect(eval_template_with_args("<%- |$phantom = 'inside your mind'| -%><%= $phantom %>", 'phantom' => nil)).to eq("inside your mind")
37
45
  end
@@ -170,7 +170,7 @@ describe "when performing lookup" do
170
170
  it 'will not accept a succesful lookup of an undef value when the type rejects it' do
171
171
  expect do
172
172
  assemble_and_compile('${r}', "'abc::n'", 'String')
173
- end.to raise_error(Puppet::ParseError, /found value has wrong type/)
173
+ end.to raise_error(Puppet::ParseError, /Found value has wrong type, expected a String value, got Undef/)
174
174
  end
175
175
 
176
176
  it 'will raise an exception when value is not found for array key and no default is provided' do
@@ -248,7 +248,8 @@ describe "when performing lookup" do
248
248
  it 'fails unless default is an instance of value_type' do
249
249
  expect do
250
250
  assemble_and_compile('${r[a]}_${r[b]}', "'abc::x'", 'Hash[String,String]', 'undef', "{'a' => 'dflt_x', 'b' => 32}")
251
- end.to raise_error(Puppet::ParseError, /default_value value has wrong type/)
251
+ end.to raise_error(Puppet::ParseError,
252
+ /Default value has wrong type, expected a Hash\[String, String\] value, got Struct\[\{'a' => String, 'b' => Integer\}\]/)
252
253
  end
253
254
  end
254
255
 
@@ -281,7 +282,8 @@ describe "when performing lookup" do
281
282
  it 'fails unless block returns an instance of value_type' do
282
283
  expect do
283
284
  assemble_and_compile_with_block('${r[a]}_${r[b]}', "{'a' => 'dflt_x', 'b' => 32}", "'abc::x'", 'Hash[String,String]')
284
- end.to raise_error(Puppet::ParseError, /default_block value has wrong type/)
285
+ end.to raise_error(Puppet::ParseError,
286
+ /Value returned from default block has wrong type, expected a Hash\[String, String\] value, got Struct\[\{'a' => String, 'b' => Integer\}\]/)
285
287
  end
286
288
 
287
289
  it 'receives a single name parameter' do
@@ -345,11 +347,28 @@ describe "when performing lookup" do
345
347
  end
346
348
 
347
349
  context 'when accessing from outside a module' do
348
- it 'will raise an exception when key in the function provided module data is not prefixed' do
349
- Puppet[:code] = "include bad_data\nlookup(bad_data::b)"
350
- expect do
351
- compiler.compile()
352
- end.to raise_error(Puppet::ParseError, /data for module 'bad_data' must use keys qualified with the name of the module/)
350
+ it 'will both log a warning and raise an exception when key in the function provided module data is not prefixed' do
351
+ logs = []
352
+ Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
353
+ Puppet[:code] = "include bad_data\nlookup('bad_data::b')"
354
+ expect { compiler.compile }.to raise_error(Puppet::ParseError, /did not find a value for the name 'bad_data::b'/)
355
+ end
356
+ warnings = logs.select {|log| log.level == :warning }.map {|log| log.message }
357
+ expect(warnings).to include("Module data for module 'bad_data' must use keys qualified with the name of the module")
358
+ end
359
+
360
+ it 'will succeed finding prefixed keys even when a key in the function provided module data is not prefixed' do
361
+ logs = []
362
+ resources = nil
363
+ Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
364
+ resources = compile_and_get_notifications(<<-END.gsub(/^ {10}/, ''))
365
+ include bad_data
366
+ notify { lookup('bad_data::c'): }
367
+ END
368
+ expect(resources).to include('module_c')
369
+ end
370
+ warnings = logs.select {|log| log.level == :warning }.map {|log| log.message }
371
+ expect(warnings).to include("Module data for module 'bad_data' must use keys qualified with the name of the module")
353
372
  end
354
373
 
355
374
  it 'will resolve global, environment, and module correctly' do
@@ -378,14 +397,40 @@ describe "when performing lookup" do
378
397
  end
379
398
 
380
399
  context 'when accessing bad data' do
381
- it 'will raise an exception when key in the function provided module data is not prefixed' do
382
- Puppet[:code] = 'include bad_data'
383
- expect do
384
- compiler.compile()
385
- end.to raise_error(Puppet::ParseError, /data for module 'bad_data' must use keys qualified with the name of the module/)
400
+ it 'a warning will be logged when key in the function provided module data is not prefixed' do
401
+ Puppet[:code] = "include bad_data\nlookup('bad_data::c')"
402
+ logs = []
403
+ Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
404
+ compiler.compile
405
+ end
406
+ warnings = logs.select {|log| log.level == :warning }.map {|log| log.message }
407
+ expect(warnings).to include("Module data for module 'bad_data' must use keys qualified with the name of the module")
408
+ end
409
+
410
+ it 'a warning will be logged when key in the hiera provided module data is not prefixed' do
411
+ Puppet[:code] = "include hieraprovider\nlookup('hieraprovider::test::param_a')"
412
+ logs = []
413
+ Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
414
+ compiler.compile
415
+ end
416
+ warnings = logs.select {|log| log.level == :warning }.map {|log| log.message }
417
+ expect(warnings).to include("Module data for module 'hieraprovider' must use keys qualified with the name of the module")
386
418
  end
387
419
  end
388
420
 
421
+ context 'when accessing empty files' do
422
+ # An empty YAML file is OK and should be treated as a file that contains no keys
423
+ it "will fail normally with a 'did not find a value' error when a yaml file is empty" do
424
+ Puppet[:code] = "include empty_yaml\nlookup('empty_yaml::a')"
425
+ expect { compiler.compile }.to raise_error(Puppet::ParseError, /did not find a value for the name 'empty_yaml::a'/)
426
+ end
427
+
428
+ # An empty JSON file is not OK. Should yield a parse error
429
+ it "will fail with a LookupError indicating a parser failure when a json file is empty" do
430
+ Puppet[:code] = "include empty_json\nlookup('empty_json::a')"
431
+ expect { compiler.compile }.to raise_error(Puppet::DataBinding::LookupError, /Unable to parse/)
432
+ end
433
+ end
389
434
 
390
435
  context 'when using explain' do
391
436
  it 'will explain that module is not found' do
@@ -56,7 +56,7 @@ describe 'the regsubst function' do
56
56
  end
57
57
 
58
58
  it 'should raise an Error if given a flag other thant G' do
59
- expect { regsubst('foo', /bar/, 'gazonk', 'I') }.to raise_error(/expected one of/)
59
+ expect { regsubst('foo', /bar/, 'gazonk', 'I') }.to raise_error(/expects one of/)
60
60
  end
61
61
 
62
62
  it 'should handle global substitutions' do
@@ -0,0 +1,108 @@
1
+ require 'puppet'
2
+ require 'spec_helper'
3
+ require 'puppet_spec/compiler'
4
+
5
+ require 'shared_behaviours/iterative_functions'
6
+
7
+ describe 'the reverse_each function' do
8
+ include PuppetSpec::Compiler
9
+
10
+ it 'raises an error when given a type that cannot be iterated' do
11
+ expect do
12
+ compile_to_catalog(<<-MANIFEST)
13
+ 3.14.reverse_each |$v| { }
14
+ MANIFEST
15
+ end.to raise_error(Puppet::Error, /expects an Iterable value, got Float/)
16
+ end
17
+
18
+ it 'raises an error when called with more than one argument and without a block' do
19
+ expect do
20
+ compile_to_catalog(<<-MANIFEST)
21
+ [1].reverse_each(1)
22
+ MANIFEST
23
+ end.to raise_error(Puppet::Error, /expects 1 argument, got 2/)
24
+ end
25
+
26
+ it 'raises an error when called with more than one argument and a block' do
27
+ expect do
28
+ compile_to_catalog(<<-MANIFEST)
29
+ [1].reverse_each(1) |$v| { }
30
+ MANIFEST
31
+ end.to raise_error(Puppet::Error, /expects 1 argument, got 2/)
32
+ end
33
+
34
+ it 'raises an error when called with a block with too many required parameters' do
35
+ expect do
36
+ compile_to_catalog(<<-MANIFEST)
37
+ [1].reverse_each() |$v1, $v2| { }
38
+ MANIFEST
39
+ end.to raise_error(Puppet::Error, /block expects 1 argument, got 2/)
40
+ end
41
+
42
+ it 'raises an error when called with a block with too few parameters' do
43
+ expect do
44
+ compile_to_catalog(<<-MANIFEST)
45
+ [1].reverse_each() | | { }
46
+ MANIFEST
47
+ end.to raise_error(Puppet::Error, /block expects 1 argument, got none/)
48
+ end
49
+
50
+ it 'does not raise an error when called with a block with too many but optional arguments' do
51
+ expect do
52
+ compile_to_catalog(<<-MANIFEST)
53
+ [1].reverse_each() |$v1, $v2=extra| { }
54
+ MANIFEST
55
+ end.to_not raise_error
56
+ end
57
+
58
+ it 'returns an Undef when called with a block' do
59
+ expect do
60
+ compile_to_catalog(<<-MANIFEST)
61
+ assert_type(Undef, [1].reverse_each |$x| { $x })
62
+ MANIFEST
63
+ end.not_to raise_error
64
+ end
65
+
66
+ it 'returns an Iterable when called without a block' do
67
+ expect do
68
+ compile_to_catalog(<<-MANIFEST)
69
+ assert_type(Iterable, [1].reverse_each)
70
+ MANIFEST
71
+ end.not_to raise_error
72
+ end
73
+
74
+ it 'should produce "times" interval of integer in reverse' do
75
+ expect(eval_and_collect_notices('5.reverse_each |$x| { notice($x) }')).to eq(['4', '3', '2', '1', '0'])
76
+ end
77
+
78
+ it 'should produce range Integer[5,8] in reverse' do
79
+ expect(eval_and_collect_notices('Integer[5,8].reverse_each |$x| { notice($x) }')).to eq(['8', '7', '6', '5'])
80
+ end
81
+
82
+ it 'should produce the choices of [first,second,third] in reverse' do
83
+ expect(eval_and_collect_notices('[first,second,third].reverse_each |$x| { notice($x) }')).to eq(%w(third second first))
84
+ end
85
+
86
+ it 'should produce the choices of {first => 1,second => 2,third => 3} in reverse' do
87
+ expect(eval_and_collect_notices('{first => 1,second => 2,third => 3}.reverse_each |$t| { notice($t[0]) }')).to eq(%w(third second first))
88
+ end
89
+
90
+ it 'should produce the choices of Enum[first,second,third] in reverse' do
91
+ expect(eval_and_collect_notices('Enum[first,second,third].reverse_each |$x| { notice($x) }')).to eq(%w(third second first))
92
+ end
93
+
94
+ it 'should produce nth element in reverse of range Integer[5,20] when chained after a step' do
95
+ expect(eval_and_collect_notices('Integer[5,20].step(4).reverse_each |$x| { notice($x) }')
96
+ ).to eq(['17', '13', '9', '5'])
97
+ end
98
+
99
+ it 'should produce nth element in reverse of times 5 when chained after a step' do
100
+ expect(eval_and_collect_notices('5.step(2).reverse_each |$x| { notice($x) }')).to eq(['4', '2', '0'])
101
+ end
102
+
103
+ it 'should produce nth element in reverse of range Integer[5,20] when chained after a step' do
104
+ expect(eval_and_collect_notices(
105
+ '[5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20].step(4).reverse_each |$x| { notice($x) }')
106
+ ).to eq(['17', '13', '9', '5'])
107
+ end
108
+ end
@@ -0,0 +1,113 @@
1
+ require 'puppet'
2
+ require 'spec_helper'
3
+ require 'puppet_spec/compiler'
4
+
5
+ require 'shared_behaviours/iterative_functions'
6
+
7
+ describe 'the step method' do
8
+ include PuppetSpec::Compiler
9
+
10
+ it 'raises an error when given a type that cannot be iterated' do
11
+ expect do
12
+ compile_to_catalog(<<-MANIFEST)
13
+ 3.14.step(1) |$v| { }
14
+ MANIFEST
15
+ end.to raise_error(Puppet::Error, /expects an Iterable value, got Float/)
16
+ end
17
+
18
+ it 'raises an error when called with more than two arguments and a block' do
19
+ expect do
20
+ compile_to_catalog(<<-MANIFEST)
21
+ [1].step(1,2) |$v| { }
22
+ MANIFEST
23
+ end.to raise_error(Puppet::Error, /expects 2 arguments, got 3/)
24
+ end
25
+
26
+ it 'raises an error when called with more than two arguments and without a block' do
27
+ expect do
28
+ compile_to_catalog(<<-MANIFEST)
29
+ [1].step(1,2)
30
+ MANIFEST
31
+ end.to raise_error(Puppet::Error, /expects 2 arguments, got 3/)
32
+ end
33
+
34
+ it 'raises an error when called with a block with too many required parameters' do
35
+ expect do
36
+ compile_to_catalog(<<-MANIFEST)
37
+ [1].step(1) |$v1, $v2| { }
38
+ MANIFEST
39
+ end.to raise_error(Puppet::Error, /block expects 1 argument, got 2/)
40
+ end
41
+
42
+ it 'raises an error when called with a block with too few parameters' do
43
+ expect do
44
+ compile_to_catalog(<<-MANIFEST)
45
+ [1].step(1) | | { }
46
+ MANIFEST
47
+ end.to raise_error(Puppet::Error, /block expects 1 argument, got none/)
48
+ end
49
+
50
+ it 'raises an error when called with step == 0' do
51
+ expect do
52
+ compile_to_catalog(<<-MANIFEST)
53
+ [1].step(0) |$x| { }
54
+ MANIFEST
55
+ end.to raise_error(Puppet::Error, /'step' expects an Integer\[1, default\] value, got Integer\[0, 0\]/)
56
+ end
57
+
58
+ it 'raises an error when step is not an integer' do
59
+ expect do
60
+ compile_to_catalog(<<-MANIFEST)
61
+ [1].step('three') |$x| { }
62
+ MANIFEST
63
+ end.to raise_error(Puppet::Error, /'step' expects an Integer value, got String/)
64
+ end
65
+
66
+ it 'does not raise an error when called with a block with too many but optional arguments' do
67
+ expect do
68
+ compile_to_catalog(<<-MANIFEST)
69
+ [1].step(1) |$v1, $v2=extra| { }
70
+ MANIFEST
71
+ end.to_not raise_error
72
+ end
73
+
74
+ it 'returns Undef when called with a block' do
75
+ expect do
76
+ compile_to_catalog(<<-MANIFEST)
77
+ assert_type(Undef, [1].step(2) |$x| { $x })
78
+ MANIFEST
79
+ end.not_to raise_error
80
+ end
81
+
82
+ it 'returns an Iterable when called without a block' do
83
+ expect do
84
+ compile_to_catalog(<<-MANIFEST)
85
+ assert_type(Iterable, [1].step(2))
86
+ MANIFEST
87
+ end.not_to raise_error
88
+ end
89
+
90
+ it 'should produce "times" interval of integer according to step' do
91
+ expect(eval_and_collect_notices('10.step(2) |$x| { notice($x) }')).to eq(['0', '2', '4', '6', '8'])
92
+ end
93
+
94
+ it 'should produce interval of Integer[5,20] according to step' do
95
+ expect(eval_and_collect_notices('Integer[5,20].step(4) |$x| { notice($x) }')).to eq(['5', '9', '13', '17'])
96
+ end
97
+
98
+ it 'should produce the elements of [a,b,c,d,e,f,g,h] according to step' do
99
+ expect(eval_and_collect_notices('[a,b,c,d,e,f,g,h].step(2) |$x| { notice($x) }')).to eq(%w(a c e g))
100
+ end
101
+
102
+ it 'should produce the elements {a=>1,b=>2,c=>3,d=>4,e=>5,f=>6,g=>7,h=>8} according to step' do
103
+ expect(eval_and_collect_notices('{a=>1,b=>2,c=>3,d=>4,e=>5,f=>6,g=>7,h=>8}.step(2) |$t| { notice($t[1]) }')).to eq(%w(1 3 5 7))
104
+ end
105
+
106
+ it 'should produce the choices of Enum[a,b,c,d,e,f,g,h] according to step' do
107
+ expect(eval_and_collect_notices('Enum[a,b,c,d,e,f,g,h].step(2) |$x| { notice($x) }')).to eq(%w(a c e g))
108
+ end
109
+
110
+ it 'should produce descending interval of Integer[5,20] when chained after a reverse_each' do
111
+ expect(eval_and_collect_notices('Integer[5,20].reverse_each.step(4) |$x| { notice($x) }')).to eq(['20', '16', '12', '8'])
112
+ end
113
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ require 'puppet_spec/compiler'
4
+ require 'matchers/resource'
5
+
6
+ describe 'the type function' do
7
+ include PuppetSpec::Compiler
8
+ include Matchers::Resource
9
+
10
+ it 'produces the type of a given value with default detailed quality' do
11
+ expect(compile_to_catalog('notify { "${ type([2, 3.14]) }": }')).to have_resource(
12
+ 'Notify[Tuple[Integer[2, 2], Float[3.14, 3.14]]]')
13
+ end
14
+
15
+ it 'produces the type of a give value with detailed quality when quality is given' do
16
+ expect(compile_to_catalog('notify { "${ type([2, 3.14], detailed) }": }')).to have_resource(
17
+ 'Notify[Tuple[Integer[2, 2], Float[3.14, 3.14]]]')
18
+ end
19
+
20
+ it 'produces the type of a given value with reduced quality when quality is given' do
21
+ expect(compile_to_catalog('notify { "${ type([2, 3.14], reduced) }": }')).to have_resource(
22
+ 'Notify[Array[Numeric, 2, 2]]')
23
+ end
24
+
25
+ it 'produces the type of a given value with generalized quality when quality is given' do
26
+ expect(compile_to_catalog('notify { "${ type([2, 3.14], generalized) }": }')).to have_resource(
27
+ 'Notify[Array[Numeric]]')
28
+ end
29
+
30
+ it 'errors when given a fault inference quality' do
31
+ expect do
32
+ compile_to_catalog("notify { type([2, 4.14], gobbledygooked): }")
33
+ end.to raise_error(/expects a match for Enum\['detailed', 'generalized', 'reduced'\], got 'gobbledygooked'/)
34
+ end
35
+ end
@@ -10,18 +10,24 @@ module FunctionAPISpecModule
10
10
 
11
11
  class TestFunctionLoader < Puppet::Pops::Loader::StaticLoader
12
12
  def initialize
13
- @functions = {}
13
+ @constants = {}
14
14
  end
15
15
 
16
16
  def add_function(name, function)
17
17
  typed_name = Puppet::Pops::Loader::Loader::TypedName.new(:function, name)
18
18
  entry = Puppet::Pops::Loader::Loader::NamedEntry.new(typed_name, function, __FILE__)
19
- @functions[typed_name] = entry
19
+ @constants[typed_name] = entry
20
+ end
21
+
22
+ def add_type(name, type)
23
+ typed_name = Puppet::Pops::Loader::Loader::TypedName.new(:type, name)
24
+ entry = Puppet::Pops::Loader::Loader::NamedEntry.new(typed_name, type, __FILE__)
25
+ @constants[typed_name] = entry
20
26
  end
21
27
 
22
28
  # override StaticLoader
23
29
  def load_constant(typed_name)
24
- @functions[typed_name]
30
+ @constants[typed_name]
25
31
  end
26
32
  end
27
33
  end
@@ -149,7 +155,7 @@ describe 'the 4x function api' do
149
155
  expect(func.is_a?(Puppet::Functions::Function)).to be_truthy
150
156
  expect do
151
157
  func.call({}, 3, 10, 3, "4")
152
- end.to raise_error(ArgumentError, "'min' expected one of:
158
+ end.to raise_error(ArgumentError, "'min' expects one of:
153
159
  (Numeric x, Numeric y, Numeric a?, Numeric b?, Numeric c*)
154
160
  rejected: parameter 'b' expects a Numeric value, got String
155
161
  (String x, String y, String a+)
@@ -217,7 +223,7 @@ describe 'the 4x function api' do
217
223
  expect(func.is_a?(Puppet::Functions::Function)).to be_truthy
218
224
  expect do
219
225
  func.call({}, 10, '20')
220
- end.to raise_error(ArgumentError, "'min' expected one of:
226
+ end.to raise_error(ArgumentError, "'min' expects one of:
221
227
  (Numeric a, Numeric b)
222
228
  rejected: parameter 'b' expects a Numeric value, got String
223
229
  (String s1, String s2)
@@ -466,6 +472,48 @@ describe 'the 4x function api' do
466
472
  end
467
473
  end
468
474
 
475
+ context 'can use a loader when parsing types in function dispatch' do
476
+ let(:parser) { Puppet::Pops::Parser::EvaluatingParser.new }
477
+
478
+ it 'and resolve a referenced Type alias' do
479
+ the_loader = loader()
480
+ the_loader.add_type('myalias', type_alias_t('MyAlias', 'Integer'))
481
+ here = get_binding(the_loader)
482
+ fc = eval(<<-CODE, here)
483
+ Puppet::Functions.create_function('testing::test') do
484
+ dispatch :test do
485
+ param 'MyAlias', :x
486
+ end
487
+ def test(x)
488
+ x
489
+ end
490
+ end
491
+ CODE
492
+ the_loader.add_function('testing::test', fc.new({}, the_loader))
493
+ program = parser.parse_string('testing::test(10)', __FILE__)
494
+ Puppet::Pops::Adapters::LoaderAdapter.adapt(program.model).loader = the_loader
495
+ expect(parser.evaluate({}, program)).to eql(10)
496
+ end
497
+
498
+ it 'and distinguish between a Type alias and a Resource type' do
499
+ the_loader = loader()
500
+ here = get_binding(the_loader)
501
+ fc = eval(<<-CODE, here)
502
+ Puppet::Functions.create_function('testing::test') do
503
+ dispatch :test do
504
+ param 'MyAlias', :x
505
+ end
506
+ def test(x)
507
+ x
508
+ end
509
+ end
510
+ CODE
511
+ the_loader.add_function('testing::test', fc.new({}, the_loader))
512
+ program = parser.parse_string('testing::test(10)', __FILE__)
513
+ Puppet::Pops::Adapters::LoaderAdapter.adapt(program.model).loader = the_loader
514
+ expect { parser.evaluate({}, program) }.to raise_error(Puppet::Error, /parameter 'x' expects a Resource value, got Integer/)
515
+ end
516
+ end
469
517
  end
470
518
 
471
519
  def create_noargs_function_class
@@ -801,4 +849,12 @@ describe 'the 4x function api' do
801
849
  end
802
850
  end
803
851
 
852
+ def type_alias_t(name, type_string)
853
+ type_expr = Puppet::Pops::Parser::EvaluatingParser.new.parse_string(type_string).current
854
+ Puppet::Pops::Types::TypeFactory.type_alias(name, type_expr)
855
+ end
856
+
857
+ def get_binding(loader_injected_arg)
858
+ binding
859
+ end
804
860
  end