puppet 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. checksums.yaml +7 -0
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +6 -6
  4. data/LICENSE +1 -1
  5. data/README.md +8 -9
  6. data/conf/auth.conf +2 -2
  7. data/ext/README.environment +1 -1
  8. data/ext/build_defaults.yaml +1 -1
  9. data/ext/debian/README.source +1 -1
  10. data/ext/debian/control +1 -1
  11. data/ext/debian/copyright +4 -4
  12. data/ext/debian/puppetmaster.README.debian +11 -9
  13. data/ext/emacs/puppet-mode.el +1 -1
  14. data/ext/envpuppet +2 -2
  15. data/ext/ips/puppetagent.xml +1 -1
  16. data/ext/ips/puppetmaster.xml +1 -1
  17. data/ext/project_data.yaml +8 -0
  18. data/ext/puppet-test +3 -3
  19. data/ext/rack/example-passenger-vhost.conf +1 -1
  20. data/ext/redhat/puppet.spec.erb +2 -2
  21. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  22. data/ext/solaris/pkginfo +1 -1
  23. data/ext/solaris/smf/puppet.xml +1 -1
  24. data/ext/suse/puppet.spec +2 -2
  25. data/ext/upload_facts.rb +1 -1
  26. data/ext/windows/puppet_interactive.bat +6 -0
  27. data/ext/windows/puppet_shell.bat +9 -0
  28. data/ext/windows/run_puppet_interactive.bat +9 -0
  29. data/ext/yaml_nodes.rb +1 -1
  30. data/install.rb +30 -20
  31. data/lib/hiera/scope.rb +1 -1
  32. data/lib/puppet/agent.rb +1 -1
  33. data/lib/puppet/application/agent.rb +4 -2
  34. data/lib/puppet/application/apply.rb +7 -4
  35. data/lib/puppet/application/cert.rb +1 -1
  36. data/lib/puppet/application/device.rb +1 -1
  37. data/lib/puppet/application/filebucket.rb +1 -1
  38. data/lib/puppet/application/inspect.rb +1 -1
  39. data/lib/puppet/application/lookup.rb +45 -47
  40. data/lib/puppet/application/master.rb +2 -2
  41. data/lib/puppet/application/resource.rb +1 -1
  42. data/lib/puppet/configurer.rb +100 -22
  43. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  44. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  45. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  46. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  47. data/lib/puppet/data_providers/lookup_adapter.rb +73 -26
  48. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  49. data/lib/puppet/defaults.rb +69 -22
  50. data/lib/puppet/environments.rb +3 -1
  51. data/lib/puppet/face/config.rb +1 -1
  52. data/lib/puppet/face/epp.rb +1 -1
  53. data/lib/puppet/face/help/man.erb +1 -1
  54. data/lib/puppet/face/module/install.rb +6 -6
  55. data/lib/puppet/face/parser.rb +12 -9
  56. data/lib/puppet/face/status.rb +2 -1
  57. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  58. data/lib/puppet/feature/telnet.rb +9 -0
  59. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  60. data/lib/puppet/file_serving/metadata.rb +18 -2
  61. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  62. data/lib/puppet/file_system/file_impl.rb +2 -2
  63. data/lib/puppet/file_system/memory_impl.rb +1 -1
  64. data/lib/puppet/file_system/uniquefile.rb +1 -1
  65. data/lib/puppet/file_system.rb +2 -2
  66. data/lib/puppet/forge/repository.rb +1 -31
  67. data/lib/puppet/forge.rb +1 -1
  68. data/lib/puppet/functions/assert_type.rb +9 -9
  69. data/lib/puppet/functions/each.rb +5 -13
  70. data/lib/puppet/functions/filter.rb +5 -14
  71. data/lib/puppet/functions/lookup.rb +126 -150
  72. data/lib/puppet/functions/map.rb +6 -14
  73. data/lib/puppet/functions/match.rb +1 -0
  74. data/lib/puppet/functions/reduce.rb +5 -13
  75. data/lib/puppet/functions/reverse_each.rb +82 -0
  76. data/lib/puppet/functions/scanf.rb +15 -18
  77. data/lib/puppet/functions/slice.rb +22 -36
  78. data/lib/puppet/functions/split.rb +2 -2
  79. data/lib/puppet/functions/step.rb +88 -0
  80. data/lib/puppet/functions/type.rb +70 -0
  81. data/lib/puppet/functions.rb +45 -6
  82. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  83. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  84. data/lib/puppet/indirector/facts/facter.rb +2 -13
  85. data/lib/puppet/indirector/file_content/http.rb +15 -0
  86. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  87. data/lib/puppet/indirector/generic_http.rb +16 -0
  88. data/lib/puppet/indirector/hiera.rb +3 -1
  89. data/lib/puppet/indirector/indirection.rb +6 -2
  90. data/lib/puppet/indirector/json.rb +2 -2
  91. data/lib/puppet/indirector/node/exec.rb +1 -1
  92. data/lib/puppet/indirector/node/ldap.rb +1 -1
  93. data/lib/puppet/indirector/rest.rb +2 -1
  94. data/lib/puppet/info_service/class_information_service.rb +13 -12
  95. data/lib/puppet/loaders.rb +1 -0
  96. data/lib/puppet/module.rb +6 -2
  97. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  98. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  99. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  100. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  101. data/lib/puppet/network/http/pool.rb +9 -0
  102. data/lib/puppet/node/environment.rb +11 -2
  103. data/lib/puppet/node.rb +11 -2
  104. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  105. data/lib/puppet/parser/compiler.rb +4 -11
  106. data/lib/puppet/parser/environment_compiler.rb +0 -1
  107. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  108. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  109. data/lib/puppet/parser/functions/lookup.rb +128 -149
  110. data/lib/puppet/parser/functions/map.rb +1 -1
  111. data/lib/puppet/parser/functions/match.rb +1 -0
  112. data/lib/puppet/parser/functions/scanf.rb +15 -26
  113. data/lib/puppet/parser/functions/slice.rb +17 -24
  114. data/lib/puppet/parser/functions/split.rb +1 -1
  115. data/lib/puppet/parser/functions.rb +28 -16
  116. data/lib/puppet/parser/resource.rb +19 -17
  117. data/lib/puppet/parser/scope.rb +176 -5
  118. data/lib/puppet/plugins/data_providers/data_provider.rb +56 -14
  119. data/lib/puppet/pops/adaptable.rb +4 -1
  120. data/lib/puppet/pops/adapters.rb +80 -12
  121. data/lib/puppet/pops/binder/binder.rb +21 -17
  122. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  123. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  124. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  125. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  126. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  127. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  128. data/lib/puppet/pops/binder/injector.rb +53 -48
  129. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  130. data/lib/puppet/pops/binder/producers.rb +67 -62
  131. data/lib/puppet/pops/evaluator/access_operator.rb +98 -96
  132. data/lib/puppet/pops/evaluator/closure.rb +122 -106
  133. data/lib/puppet/pops/evaluator/collector_transformer.rb +34 -14
  134. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  135. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  136. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  137. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  138. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  139. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  140. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  141. data/lib/puppet/pops/evaluator/runtime3_support.rb +47 -42
  142. data/lib/puppet/pops/functions/function.rb +6 -2
  143. data/lib/puppet/pops/issue_reporter.rb +6 -4
  144. data/lib/puppet/pops/issues.rb +50 -11
  145. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  146. data/lib/puppet/pops/loader/loader.rb +1 -1
  147. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  148. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  149. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +18 -13
  150. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  151. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  152. data/lib/puppet/pops/loaders.rb +51 -9
  153. data/lib/puppet/pops/lookup/explainer.rb +73 -3
  154. data/lib/puppet/pops/lookup/invocation.rb +21 -19
  155. data/lib/puppet/pops/lookup.rb +17 -12
  156. data/lib/puppet/pops/merge_strategy.rb +16 -19
  157. data/lib/puppet/pops/model/factory.rb +179 -157
  158. data/lib/puppet/pops/model/model.rb +17 -8
  159. data/lib/puppet/pops/model/model_label_provider.rb +14 -7
  160. data/lib/puppet/pops/model/model_meta.rb +17 -0
  161. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  162. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  163. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  164. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  165. data/lib/puppet/pops/parser/evaluating_parser.rb +17 -13
  166. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  167. data/lib/puppet/pops/parser/lexer2.rb +428 -403
  168. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  169. data/lib/puppet/pops/parser/locator.rb +21 -0
  170. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  171. data/lib/puppet/pops/parser/slurp_support.rb +16 -8
  172. data/lib/puppet/pops/types/class_loader.rb +23 -19
  173. data/lib/puppet/pops/types/enumeration.rb +9 -26
  174. data/lib/puppet/pops/types/iterable.rb +308 -0
  175. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  176. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  177. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  178. data/lib/puppet/pops/types/type_calculator.rb +140 -387
  179. data/lib/puppet/pops/types/type_factory.rb +91 -57
  180. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  181. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  182. data/lib/puppet/pops/types/type_parser.rb +159 -112
  183. data/lib/puppet/pops/types/types.rb +2057 -1253
  184. data/lib/puppet/pops/utils.rb +11 -10
  185. data/lib/puppet/pops/validation/checker4_0.rb +115 -63
  186. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  187. data/lib/puppet/pops/validation.rb +11 -9
  188. data/lib/puppet/pops.rb +0 -8
  189. data/lib/puppet/provider/aixobject.rb +1 -1
  190. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  191. data/lib/puppet/provider/cron/crontab.rb +1 -1
  192. data/lib/puppet/provider/exec/windows.rb +1 -1
  193. data/lib/puppet/provider/group/windows_adsi.rb +2 -2
  194. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  195. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  196. data/lib/puppet/provider/package/appdmg.rb +3 -2
  197. data/lib/puppet/provider/package/dnf.rb +1 -1
  198. data/lib/puppet/provider/package/pip.rb +16 -9
  199. data/lib/puppet/provider/package/pip3.rb +1 -1
  200. data/lib/puppet/provider/package/pkg.rb +1 -1
  201. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  202. data/lib/puppet/provider/package/pkgng.rb +13 -4
  203. data/lib/puppet/provider/package/rpm.rb +0 -1
  204. data/lib/puppet/provider/package/windows.rb +1 -1
  205. data/lib/puppet/provider/package/yum.rb +2 -2
  206. data/lib/puppet/provider/package/zypper.rb +19 -0
  207. data/lib/puppet/provider/service/debian.rb +7 -20
  208. data/lib/puppet/provider/service/init.rb +7 -0
  209. data/lib/puppet/provider/service/launchd.rb +6 -12
  210. data/lib/puppet/provider/service/systemd.rb +9 -2
  211. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +1 -1
  213. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  214. data/lib/puppet/provider/user/windows_adsi.rb +2 -2
  215. data/lib/puppet/provider/yumrepo/inifile.rb +6 -3
  216. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  217. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  218. data/lib/puppet/reference/configuration.rb +1 -1
  219. data/lib/puppet/reference/providers.rb +1 -1
  220. data/lib/puppet/resource/capability_finder.rb +20 -13
  221. data/lib/puppet/resource/catalog.rb +60 -3
  222. data/lib/puppet/resource/status.rb +11 -2
  223. data/lib/puppet/resource/type.rb +33 -42
  224. data/lib/puppet/resource.rb +15 -12
  225. data/lib/puppet/settings/config_file.rb +1 -1
  226. data/lib/puppet/settings/environment_conf.rb +13 -5
  227. data/lib/puppet/settings.rb +1 -1
  228. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  229. data/lib/puppet/ssl/certificate_request.rb +4 -4
  230. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  231. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  232. data/lib/puppet/test/test_helper.rb +16 -4
  233. data/lib/puppet/transaction/additional_resource_generator.rb +23 -5
  234. data/lib/puppet/transaction/report.rb +31 -1
  235. data/lib/puppet/transaction/resource_harness.rb +0 -25
  236. data/lib/puppet/transaction.rb +15 -2
  237. data/lib/puppet/type/augeas.rb +1 -1
  238. data/lib/puppet/type/cron.rb +12 -12
  239. data/lib/puppet/type/file/checksum_value.rb +53 -0
  240. data/lib/puppet/type/file/content.rb +26 -111
  241. data/lib/puppet/type/file/data_sync.rb +84 -0
  242. data/lib/puppet/type/file/ensure.rb +17 -14
  243. data/lib/puppet/type/file/selcontext.rb +1 -1
  244. data/lib/puppet/type/file/source.rb +103 -18
  245. data/lib/puppet/type/file.rb +91 -39
  246. data/lib/puppet/type/filebucket.rb +1 -1
  247. data/lib/puppet/type/group.rb +6 -2
  248. data/lib/puppet/type/interface.rb +8 -3
  249. data/lib/puppet/type/macauthorization.rb +1 -1
  250. data/lib/puppet/type/package.rb +6 -0
  251. data/lib/puppet/type/schedule.rb +1 -1
  252. data/lib/puppet/type/stage.rb +1 -1
  253. data/lib/puppet/type/user.rb +19 -17
  254. data/lib/puppet/type/yumrepo.rb +20 -0
  255. data/lib/puppet/type.rb +11 -11
  256. data/lib/puppet/util/autoload.rb +16 -11
  257. data/lib/puppet/util/checksums.rb +74 -31
  258. data/lib/puppet/util/execution.rb +1 -1
  259. data/lib/puppet/util/http_proxy.rb +72 -0
  260. data/lib/puppet/util/log.rb +2 -0
  261. data/lib/puppet/util/logging.rb +43 -1
  262. data/lib/puppet/util/monkey_patches.rb +2 -2
  263. data/lib/puppet/util/multi_match.rb +51 -0
  264. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  265. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  266. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  267. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  268. data/lib/puppet/util/plist.rb +130 -0
  269. data/lib/puppet/util/resource_template.rb +1 -1
  270. data/lib/puppet/util/run_mode.rb +2 -2
  271. data/lib/puppet/util/skip_tags.rb +9 -0
  272. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  273. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  274. data/lib/puppet/util/windows/adsi.rb +65 -28
  275. data/lib/puppet/util/windows/api_types.rb +24 -18
  276. data/lib/puppet/util/windows/com.rb +3 -3
  277. data/lib/puppet/util/windows/error.rb +1 -1
  278. data/lib/puppet/util/windows/file.rb +8 -8
  279. data/lib/puppet/util/windows/principal.rb +190 -0
  280. data/lib/puppet/util/windows/process.rb +78 -11
  281. data/lib/puppet/util/windows/registry.rb +22 -16
  282. data/lib/puppet/util/windows/root_certs.rb +5 -5
  283. data/lib/puppet/util/windows/security.rb +33 -35
  284. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  285. data/lib/puppet/util/windows/sid.rb +84 -15
  286. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  287. data/lib/puppet/util/windows/user.rb +10 -10
  288. data/lib/puppet/util/windows.rb +4 -0
  289. data/lib/puppet/util.rb +109 -22
  290. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  291. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  292. data/lib/puppet/vendor/pathspec/README.md +1 -1
  293. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  294. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  295. data/lib/puppet/version.rb +1 -1
  296. data/lib/puppet.rb +17 -0
  297. data/lib/semver.rb +17 -1
  298. data/man/man5/puppet.conf.5 +12 -12
  299. data/man/man8/extlookup2hiera.8 +1 -1
  300. data/man/man8/puppet-agent.8 +2 -2
  301. data/man/man8/puppet-apply.8 +2 -2
  302. data/man/man8/puppet-ca.8 +2 -2
  303. data/man/man8/puppet-catalog.8 +2 -2
  304. data/man/man8/puppet-cert.8 +2 -2
  305. data/man/man8/puppet-certificate.8 +2 -2
  306. data/man/man8/puppet-certificate_request.8 +2 -2
  307. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  308. data/man/man8/puppet-config.8 +3 -3
  309. data/man/man8/puppet-describe.8 +1 -1
  310. data/man/man8/puppet-device.8 +1 -1
  311. data/man/man8/puppet-doc.8 +1 -1
  312. data/man/man8/puppet-epp.8 +2 -2
  313. data/man/man8/puppet-facts.8 +2 -2
  314. data/man/man8/puppet-file.8 +2 -2
  315. data/man/man8/puppet-filebucket.8 +2 -2
  316. data/man/man8/puppet-help.8 +2 -2
  317. data/man/man8/puppet-inspect.8 +2 -2
  318. data/man/man8/puppet-key.8 +2 -2
  319. data/man/man8/puppet-man.8 +2 -2
  320. data/man/man8/puppet-master.8 +2 -2
  321. data/man/man8/puppet-module.8 +9 -9
  322. data/man/man8/puppet-node.8 +2 -2
  323. data/man/man8/puppet-parser.8 +2 -2
  324. data/man/man8/puppet-plugin.8 +2 -2
  325. data/man/man8/puppet-report.8 +2 -2
  326. data/man/man8/puppet-resource.8 +2 -2
  327. data/man/man8/puppet-resource_type.8 +2 -2
  328. data/man/man8/puppet-status.8 +3 -3
  329. data/man/man8/puppet.8 +1 -1
  330. data/spec/fixtures/module.tar.gz +0 -0
  331. data/spec/fixtures/unit/application/environments/production/data/common.yaml +4 -0
  332. data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
  333. data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
  334. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/data.pp +10 -0
  335. data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
  336. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
  337. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
  338. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
  339. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
  340. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
  341. data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
  342. data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
  343. data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
  344. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
  345. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
  346. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
  347. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
  348. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
  349. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
  350. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
  351. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
  352. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  353. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  354. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  355. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  356. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  357. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  358. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  359. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  360. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  361. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  362. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  363. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  364. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
  365. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
  366. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
  367. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  368. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
  369. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
  370. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
  371. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
  372. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
  373. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
  374. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
  375. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
  376. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +81 -0
  377. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
  378. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  379. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  380. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  381. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  382. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
  383. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
  384. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  385. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
  386. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  387. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
  388. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
  389. data/spec/integration/defaults_spec.rb +14 -2
  390. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  391. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  392. data/spec/integration/node/environment_spec.rb +13 -0
  393. data/spec/integration/parser/collection_spec.rb +8 -0
  394. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  395. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  396. data/spec/integration/parser/undef_param_spec.rb +8 -0
  397. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  398. data/spec/integration/test/test_helper_spec.rb +28 -0
  399. data/spec/integration/transaction/report_spec.rb +16 -0
  400. data/spec/integration/transaction_spec.rb +11 -0
  401. data/spec/integration/type/file_spec.rb +194 -4
  402. data/spec/integration/type/package_spec.rb +5 -1
  403. data/spec/integration/type/tidy_spec.rb +21 -9
  404. data/spec/integration/util/execution_spec.rb +22 -0
  405. data/spec/integration/util/windows/principal_spec.rb +201 -0
  406. data/spec/integration/util/windows/process_spec.rb +31 -0
  407. data/spec/{unit → integration}/util/windows/registry_spec.rb +91 -1
  408. data/spec/integration/util/windows/security_spec.rb +8 -8
  409. data/spec/integration/util/windows/user_spec.rb +1 -1
  410. data/spec/integration/util_spec.rb +49 -27
  411. data/spec/lib/puppet_spec/compiler.rb +17 -0
  412. data/spec/lib/puppet_spec/files.rb +2 -2
  413. data/spec/lib/puppet_spec/pops.rb +13 -0
  414. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  415. data/spec/shared_contexts/types_setup.rb +96 -0
  416. data/spec/unit/agent_spec.rb +1 -0
  417. data/spec/unit/application/agent_spec.rb +10 -0
  418. data/spec/unit/application/apply_spec.rb +9 -0
  419. data/spec/unit/application/lookup_spec.rb +138 -28
  420. data/spec/unit/configurer/downloader_spec.rb +5 -5
  421. data/spec/unit/configurer_spec.rb +271 -39
  422. data/spec/unit/data_providers/hiera_data_provider_spec.rb +182 -5
  423. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  424. data/spec/unit/defaults_spec.rb +15 -0
  425. data/spec/unit/environments_spec.rb +24 -4
  426. data/spec/unit/face/epp_face_spec.rb +2 -2
  427. data/spec/unit/face/parser_spec.rb +43 -2
  428. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  429. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  430. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  431. data/spec/unit/file_system_spec.rb +26 -0
  432. data/spec/unit/functions/assert_type_spec.rb +36 -2
  433. data/spec/unit/functions/defined_spec.rb +2 -2
  434. data/spec/unit/functions/epp_spec.rb +17 -9
  435. data/spec/unit/functions/inline_epp_spec.rb +4 -4
  436. data/spec/unit/functions/lookup_spec.rb +88 -16
  437. data/spec/unit/functions/regsubst_spec.rb +1 -1
  438. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  439. data/spec/unit/functions/step_spec.rb +113 -0
  440. data/spec/unit/functions/type_spec.rb +35 -0
  441. data/spec/unit/functions4_spec.rb +62 -6
  442. data/spec/unit/hiera/scope_spec.rb +5 -2
  443. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  444. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  445. data/spec/unit/indirector/indirection_spec.rb +1 -1
  446. data/spec/unit/indirector/json_spec.rb +1 -1
  447. data/spec/unit/info_service_spec.rb +94 -32
  448. data/spec/unit/module_spec.rb +14 -0
  449. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  450. data/spec/unit/network/authstore_spec.rb +1 -1
  451. data/spec/unit/network/http/connection_spec.rb +1 -0
  452. data/spec/unit/network/http/pool_spec.rb +30 -0
  453. data/spec/unit/node_spec.rb +8 -0
  454. data/spec/unit/parser/compiler_spec.rb +16 -18
  455. data/spec/unit/parser/scope_spec.rb +28 -11
  456. data/spec/unit/pops/evaluator/access_ops_spec.rb +7 -7
  457. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  458. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -2
  459. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  460. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  461. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  462. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  463. data/spec/unit/pops/loaders/loaders_spec.rb +127 -2
  464. data/spec/unit/pops/parser/lexer2_spec.rb +118 -3
  465. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  466. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  467. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  468. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  469. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  470. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  471. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  472. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  473. data/spec/unit/pops/types/type_calculator_spec.rb +275 -390
  474. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  475. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  476. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  477. data/spec/unit/pops/types/types_spec.rb +241 -0
  478. data/spec/unit/pops/validator/validator_spec.rb +159 -15
  479. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  480. data/spec/unit/provider/group/windows_adsi_spec.rb +8 -8
  481. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  482. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  483. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  484. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  485. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  486. data/spec/unit/provider/package/pip_spec.rb +88 -47
  487. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  488. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  489. data/spec/unit/provider/package/rpm_spec.rb +2 -25
  490. data/spec/unit/provider/package/yum_spec.rb +12 -1
  491. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  492. data/spec/unit/provider/service/debian_spec.rb +6 -24
  493. data/spec/unit/provider/service/init_spec.rb +11 -1
  494. data/spec/unit/provider/service/launchd_spec.rb +18 -25
  495. data/spec/unit/provider/service/systemd_spec.rb +25 -12
  496. data/spec/unit/provider/service/upstart_spec.rb +57 -0
  497. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  498. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  499. data/spec/unit/provider/user/windows_adsi_spec.rb +5 -5
  500. data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
  501. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  502. data/spec/unit/resource/catalog_spec.rb +33 -1
  503. data/spec/unit/resource/type_spec.rb +149 -7
  504. data/spec/unit/resource_spec.rb +99 -50
  505. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  506. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  507. data/spec/unit/transaction/report_spec.rb +27 -0
  508. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  509. data/spec/unit/transaction_spec.rb +5 -0
  510. data/spec/unit/type/file/checksum_spec.rb +6 -0
  511. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  512. data/spec/unit/type/file/content_spec.rb +12 -193
  513. data/spec/unit/type/file/source_spec.rb +211 -119
  514. data/spec/unit/type/file_spec.rb +133 -34
  515. data/spec/unit/type/interface_spec.rb +32 -0
  516. data/spec/unit/type/macauthorization_spec.rb +4 -1
  517. data/spec/unit/type/yumrepo_spec.rb +2 -2
  518. data/spec/unit/util/filetype_spec.rb +1 -1
  519. data/spec/unit/util/http_proxy_spec.rb +2 -2
  520. data/spec/unit/util/log/destinations_spec.rb +0 -2
  521. data/spec/unit/util/logging_spec.rb +69 -0
  522. data/spec/unit/util/multi_match_spec.rb +39 -0
  523. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  524. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  525. data/spec/unit/util/plist_spec.rb +110 -0
  526. data/spec/unit/util/resource_template_spec.rb +2 -2
  527. data/spec/unit/util/run_mode_spec.rb +27 -3
  528. data/spec/unit/util/windows/adsi_spec.rb +46 -38
  529. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  530. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  531. data/spec/unit/util/windows/sid_spec.rb +48 -11
  532. data/spec/unit/util_spec.rb +123 -13
  533. data/tasks/cfpropertylist.rake +15 -0
  534. metadata +3342 -3195
  535. data/lib/puppet/vendor/load_plist.rb +0 -1
  536. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  537. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  538. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  539. data/lib/puppet/vendor/plist/README +0 -36
  540. data/lib/puppet/vendor/plist/Rakefile +0 -144
  541. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  542. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  543. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  544. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  545. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  546. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  547. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  548. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  549. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  550. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  551. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  552. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  553. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  554. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  555. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  556. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  557. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  558. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
  559. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
  560. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
@@ -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
@@ -486,7 +531,7 @@ EOS
486
531
  end
487
532
  end
488
533
 
489
- it 'will handle path merge with not found correctly' do
534
+ it 'will handle path merge when some entries are not found correctly' do
490
535
  assemble_and_compile('${r}', "'hieraprovider::test::param_a'") do |scope|
491
536
  lookup_invocation = Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, true)
492
537
  begin
@@ -504,10 +549,10 @@ Merge strategy first
504
549
  Data Provider "two paths"
505
550
  Merge strategy first
506
551
  Path "#{environmentpath}/production/modules/hieraprovider/data/first.json"
507
- Original path: first
552
+ Original path: "first"
508
553
  No such key: "hieraprovider::test::not_found"
509
554
  Path "#{environmentpath}/production/modules/hieraprovider/data/second_not_present.json"
510
- Original path: second_not_present
555
+ Original path: "second_not_present"
511
556
  Path not found
512
557
  EOS
513
558
  end
@@ -551,5 +596,32 @@ EOS
551
596
  )
552
597
  end
553
598
  end
599
+
600
+ it 'will explain that "lookup_options" is an invalid key' do
601
+ assemble_and_compile('${r}', "'abc::a'") do |scope|
602
+ lookup_invocation = Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, true)
603
+ begin
604
+ Puppet::Pops::Lookup.lookup('lookup_options', nil, nil, false, nil, lookup_invocation)
605
+ rescue Puppet::Error
606
+ end
607
+ expect(lookup_invocation.explainer.to_s).to eq(<<EOS)
608
+ Invalid key "lookup_options"
609
+ EOS
610
+ end
611
+ end
612
+
613
+ it 'will explain that "lookup_options" is an invalid key for any key starting with "lookup_options."' do
614
+ assemble_and_compile('${r}', "'abc::a'") do |scope|
615
+ lookup_invocation = Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, true)
616
+ begin
617
+ Puppet::Pops::Lookup.lookup('lookup_options.subkey', nil, nil, false, nil, lookup_invocation)
618
+ rescue Puppet::Error
619
+ end
620
+ expect(lookup_invocation.explainer.to_s).to eq(<<EOS)
621
+ Invalid key "lookup_options"
622
+ EOS
623
+ end
624
+ end
625
+
554
626
  end
555
627
  end
@@ -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)
@@ -420,7 +426,7 @@ describe 'the 4x function api' do
420
426
  end
421
427
  # initiate the function the same way the loader initiates it
422
428
  f = fc.new(:closure_scope, Puppet.lookup(:loaders).puppet_system_loader)
423
- expect{f.call({})}.to raise_error(ArgumentError, "Function test(): cannot call function 'no_such_function' - not found")
429
+ expect{f.call({})}.to raise_error(ArgumentError, "Function test(): Unknown function: 'no_such_function'")
424
430
  end
425
431
  end
426
432
 
@@ -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
@@ -76,9 +76,12 @@ describe Hiera::Scope do
76
76
 
77
77
  describe "#include?" do
78
78
  it "should correctly report missing data" do
79
- real["foo"] = ""
79
+ real["nil_value"] = nil
80
+ real["blank_value"] = ""
80
81
 
81
- expect(scope.include?("foo")).to eq(false)
82
+ expect(scope.include?("nil_value")).to eq(true)
83
+ expect(scope.include?("blank_value")).to eq(true)
84
+ expect(scope.include?("missing_value")).to eq(false)
82
85
  end
83
86
 
84
87
  it "should always return true for calling_class and calling_module" do