puppet 4.2.0 → 4.3.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 (422) hide show
  1. data/CONTRIBUTING.md +1 -1
  2. data/Gemfile +5 -7
  3. data/README.md +1 -1
  4. data/Rakefile +20 -0
  5. data/ext/debian/puppet.init +0 -1
  6. data/ext/debian/puppet.logrotate +14 -5
  7. data/ext/osx/puppet.plist +2 -4
  8. data/ext/project_data.yaml +1 -1
  9. data/ext/redhat/client.init +65 -12
  10. data/ext/redhat/logrotate +15 -3
  11. data/ext/redhat/puppet.spec.erb +5 -1
  12. data/ext/redhat/server.init +1 -1
  13. data/ext/solaris/smf/puppet +44 -0
  14. data/ext/solaris/smf/puppet.xml +44 -0
  15. data/ext/suse/client.init +27 -27
  16. data/ext/suse/server.init +2 -2
  17. data/ext/systemd/puppet.service +1 -0
  18. data/install.rb +21 -39
  19. data/lib/hiera/puppet_function.rb +5 -5
  20. data/lib/puppet/agent/locker.rb +11 -2
  21. data/lib/puppet/agent.rb +4 -4
  22. data/lib/puppet/application/agent.rb +28 -14
  23. data/lib/puppet/application/apply.rb +17 -4
  24. data/lib/puppet/application/cert.rb +16 -0
  25. data/lib/puppet/application/filebucket.rb +78 -4
  26. data/lib/puppet/application/lookup.rb +356 -0
  27. data/lib/puppet/application/master.rb +5 -1
  28. data/lib/puppet/configurer.rb +9 -5
  29. data/lib/puppet/context/trusted_information.rb +21 -1
  30. data/lib/puppet/context.rb +16 -1
  31. data/lib/puppet/daemon.rb +17 -13
  32. data/lib/puppet/data_binding.rb +4 -2
  33. data/lib/puppet/data_providers/data_adapter.rb +7 -68
  34. data/lib/puppet/data_providers/data_function_support.rb +5 -26
  35. data/lib/puppet/data_providers/function_env_data_provider.rb +0 -10
  36. data/lib/puppet/data_providers/function_module_data_provider.rb +0 -22
  37. data/lib/puppet/data_providers/hiera_config.rb +106 -0
  38. data/lib/puppet/data_providers/hiera_env_data_provider.rb +18 -0
  39. data/lib/puppet/data_providers/hiera_interpolate.rb +97 -0
  40. data/lib/puppet/data_providers/hiera_module_data_provider.rb +23 -0
  41. data/lib/puppet/data_providers/hiera_support.rb +37 -0
  42. data/lib/puppet/data_providers/json_data_provider_factory.rb +31 -0
  43. data/lib/puppet/data_providers/lookup_adapter.rb +200 -0
  44. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +32 -0
  45. data/lib/puppet/data_providers.rb +12 -13
  46. data/lib/puppet/defaults.rb +14 -3
  47. data/lib/puppet/environments.rb +94 -6
  48. data/lib/puppet/error.rb +4 -0
  49. data/lib/puppet/face/module/changes.rb +2 -1
  50. data/lib/puppet/feature/cfacter.rb +1 -0
  51. data/lib/puppet/file_bucket/dipper.rb +58 -2
  52. data/lib/puppet/file_system/windows.rb +3 -1
  53. data/lib/puppet/functions/assert_type.rb +48 -12
  54. data/lib/puppet/functions/defined.rb +79 -48
  55. data/lib/puppet/functions/each.rb +85 -27
  56. data/lib/puppet/functions/epp.rb +29 -37
  57. data/lib/puppet/functions/filter.rb +60 -25
  58. data/lib/puppet/functions/hiera.rb +76 -3
  59. data/lib/puppet/functions/hiera_array.rb +65 -3
  60. data/lib/puppet/functions/hiera_hash.rb +74 -2
  61. data/lib/puppet/functions/hiera_include.rb +77 -4
  62. data/lib/puppet/functions/inline_epp.rb +44 -71
  63. data/lib/puppet/functions/lookup.rb +19 -17
  64. data/lib/puppet/functions/map.rb +56 -21
  65. data/lib/puppet/functions/match.rb +29 -12
  66. data/lib/puppet/functions/reduce.rb +95 -58
  67. data/lib/puppet/functions/versioncmp.rb +36 -0
  68. data/lib/puppet/functions/with.rb +15 -7
  69. data/lib/puppet/functions.rb +2 -4
  70. data/lib/puppet/indirector/catalog/compiler.rb +3 -3
  71. data/lib/puppet/indirector/catalog/static_compiler.rb +46 -30
  72. data/lib/puppet/indirector/data_binding/none.rb +4 -1
  73. data/lib/puppet/indirector/file_bucket_file/file.rb +58 -1
  74. data/lib/puppet/indirector/hiera.rb +4 -0
  75. data/lib/puppet/indirector/indirection.rb +6 -1
  76. data/lib/puppet/indirector/json.rb +1 -1
  77. data/lib/puppet/indirector/msgpack.rb +1 -1
  78. data/lib/puppet/indirector/request.rb +7 -8
  79. data/lib/puppet/indirector/resource_type/parser.rb +5 -3
  80. data/lib/puppet/info_service/class_information_service.rb +111 -0
  81. data/lib/puppet/info_service.rb +7 -0
  82. data/lib/puppet/module_tool/applications/unpacker.rb +1 -1
  83. data/lib/puppet/module_tool/metadata.rb +32 -9
  84. data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +42 -38
  85. data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +25 -18
  86. data/lib/puppet/network/authconfig.rb +21 -1
  87. data/lib/puppet/network/authorization.rb +8 -1
  88. data/lib/puppet/network/http/api/master/v3/environment.rb +59 -0
  89. data/lib/puppet/network/http/api/master/v3.rb +7 -1
  90. data/lib/puppet/node/environment.rb +9 -2
  91. data/lib/puppet/node.rb +11 -5
  92. data/lib/puppet/parser/ast/pops_bridge.rb +39 -1
  93. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
  94. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +38 -0
  95. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
  96. data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
  97. data/lib/puppet/parser/compiler.rb +300 -12
  98. data/lib/puppet/parser/environment_compiler.rb +165 -0
  99. data/lib/puppet/parser/functions/assert_type.rb +46 -16
  100. data/lib/puppet/parser/functions/defined.rb +105 -68
  101. data/lib/puppet/parser/functions/each.rb +85 -27
  102. data/lib/puppet/parser/functions/epp.rb +29 -37
  103. data/lib/puppet/parser/functions/filter.rb +59 -23
  104. data/lib/puppet/parser/functions/hiera.rb +83 -27
  105. data/lib/puppet/parser/functions/hiera_array.rb +71 -28
  106. data/lib/puppet/parser/functions/hiera_hash.rb +81 -30
  107. data/lib/puppet/parser/functions/hiera_include.rb +81 -40
  108. data/lib/puppet/parser/functions/inline_epp.rb +35 -60
  109. data/lib/puppet/parser/functions/inline_template.rb +2 -2
  110. data/lib/puppet/parser/functions/map.rb +55 -20
  111. data/lib/puppet/parser/functions/match.rb +27 -12
  112. data/lib/puppet/parser/functions/reduce.rb +97 -60
  113. data/lib/puppet/parser/functions/with.rb +16 -8
  114. data/lib/puppet/parser/resource.rb +103 -21
  115. data/lib/puppet/parser.rb +3 -0
  116. data/lib/puppet/plugins/configuration.rb +3 -2
  117. data/lib/puppet/plugins/data_providers/data_provider.rb +283 -0
  118. data/lib/puppet/plugins/data_providers/registry.rb +84 -0
  119. data/lib/puppet/plugins/data_providers.rb +12 -60
  120. data/lib/puppet/pops/adapters.rb +12 -0
  121. data/lib/puppet/pops/binder/binder.rb +2 -2
  122. data/lib/puppet/pops/binder/bindings_checker.rb +1 -1
  123. data/lib/puppet/pops/binder/bindings_label_provider.rb +3 -1
  124. data/lib/puppet/pops/binder/bindings_loader.rb +6 -2
  125. data/lib/puppet/pops/binder/bindings_model_meta.rb +2 -2
  126. data/lib/puppet/pops/binder/config/binder_config.rb +1 -1
  127. data/lib/puppet/pops/binder/injector.rb +4 -4
  128. data/lib/puppet/pops/binder/key_factory.rb +3 -9
  129. data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +68 -9
  130. data/lib/puppet/pops/evaluator/access_operator.rb +27 -60
  131. data/lib/puppet/pops/evaluator/closure.rb +8 -8
  132. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
  133. data/lib/puppet/pops/evaluator/evaluator_impl.rb +10 -6
  134. data/lib/puppet/pops/evaluator/literal_evaluator.rb +87 -0
  135. data/lib/puppet/pops/evaluator/relationship_operator.rb +7 -1
  136. data/lib/puppet/pops/functions/dispatcher.rb +3 -3
  137. data/lib/puppet/pops/issues.rb +11 -3
  138. data/lib/puppet/pops/label_provider.rb +1 -1
  139. data/lib/puppet/pops/lookup/explainer.rb +402 -0
  140. data/lib/puppet/pops/lookup/invocation.rb +117 -0
  141. data/lib/puppet/pops/lookup.rb +25 -47
  142. data/lib/puppet/pops/merge_strategy.rb +73 -5
  143. data/lib/puppet/pops/model/factory.rb +38 -3
  144. data/lib/puppet/pops/model/model_label_provider.rb +10 -1
  145. data/lib/puppet/pops/model/model_meta.rb +19 -1
  146. data/lib/puppet/pops/model/model_tree_dumper.rb +18 -0
  147. data/lib/puppet/pops/parser/code_merger.rb +13 -1
  148. data/lib/puppet/pops/parser/egrammar.ra +65 -2
  149. data/lib/puppet/pops/parser/eparser.rb +1569 -1241
  150. data/lib/puppet/pops/parser/lexer2.rb +32 -1
  151. data/lib/puppet/pops/parser/locator.rb +1 -1
  152. data/lib/puppet/pops/parser/parser_support.rb +25 -13
  153. data/lib/puppet/pops/patterns.rb +3 -0
  154. data/lib/puppet/pops/types/enumeration.rb +1 -2
  155. data/lib/puppet/pops/types/type_asserter.rb +16 -15
  156. data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
  157. data/lib/puppet/pops/types/type_calculator.rb +171 -1020
  158. data/lib/puppet/pops/types/type_factory.rb +87 -148
  159. data/lib/puppet/pops/types/type_mismatch_describer.rb +743 -0
  160. data/lib/puppet/pops/types/type_parser.rb +118 -129
  161. data/lib/puppet/pops/types/types.rb +1394 -255
  162. data/lib/puppet/pops/types/types_meta.rb +0 -234
  163. data/lib/puppet/pops/validation/checker4_0.rb +49 -1
  164. data/lib/puppet/pops/validation/validator_factory_4_0.rb +3 -1
  165. data/lib/puppet/pops/validation.rb +7 -2
  166. data/lib/puppet/pops.rb +19 -17
  167. data/lib/puppet/provider/augeas/augeas.rb +50 -0
  168. data/lib/puppet/provider/exec.rb +6 -1
  169. data/lib/puppet/provider/group/directoryservice.rb +10 -0
  170. data/lib/puppet/provider/package/dnf.rb +41 -0
  171. data/lib/puppet/provider/package/gem.rb +7 -2
  172. data/lib/puppet/provider/package/nim.rb +1 -1
  173. data/lib/puppet/provider/package/rpm.rb +1 -0
  174. data/lib/puppet/provider/package/windows/exe_package.rb +10 -8
  175. data/lib/puppet/provider/package/windows/msi_package.rb +4 -3
  176. data/lib/puppet/provider/package/windows/package.rb +9 -1
  177. data/lib/puppet/provider/package/yum.rb +20 -9
  178. data/lib/puppet/provider/service/bsd.rb +1 -1
  179. data/lib/puppet/provider/service/debian.rb +21 -0
  180. data/lib/puppet/provider/service/init.rb +6 -0
  181. data/lib/puppet/provider/service/launchd.rb +36 -7
  182. data/lib/puppet/provider/service/rcng.rb +51 -0
  183. data/lib/puppet/provider/service/redhat.rb +2 -1
  184. data/lib/puppet/provider/service/smf.rb +43 -2
  185. data/lib/puppet/provider/service/src.rb +27 -0
  186. data/lib/puppet/provider/service/systemd.rb +25 -5
  187. data/lib/puppet/provider/sshkey/parsed.rb +19 -9
  188. data/lib/puppet/provider/zone/solaris.rb +2 -2
  189. data/lib/puppet/reference/configuration.rb +10 -4
  190. data/lib/puppet/reference/report.rb +9 -12
  191. data/lib/puppet/reports.rb +5 -1
  192. data/lib/puppet/resource/capability_finder.rb +95 -0
  193. data/lib/puppet/resource/catalog.rb +47 -7
  194. data/lib/puppet/resource/status.rb +0 -2
  195. data/lib/puppet/resource/type.rb +238 -44
  196. data/lib/puppet/resource/type_collection.rb +60 -2
  197. data/lib/puppet/resource.rb +50 -73
  198. data/lib/puppet/settings/file_setting.rb +10 -9
  199. data/lib/puppet/settings.rb +2 -2
  200. data/lib/puppet/ssl/certificate_authority/interface.rb +2 -2
  201. data/lib/puppet/ssl/oids.rb +9 -1
  202. data/lib/puppet/transaction/additional_resource_generator.rb +71 -8
  203. data/lib/puppet/transaction/resource_harness.rb +9 -4
  204. data/lib/puppet/transaction.rb +8 -1
  205. data/lib/puppet/type/augeas.rb +8 -0
  206. data/lib/puppet/type/file/source.rb +14 -12
  207. data/lib/puppet/type/package.rb +9 -6
  208. data/lib/puppet/type/user.rb +4 -2
  209. data/lib/puppet/type.rb +78 -7
  210. data/lib/puppet/util/command_line.rb +4 -0
  211. data/lib/puppet/util/execution.rb +18 -2
  212. data/lib/puppet/util/tagging.rb +7 -1
  213. data/lib/puppet/util/windows/adsi.rb +5 -2
  214. data/lib/puppet/util/windows/security.rb +4 -1
  215. data/lib/puppet/util/windows/taskscheduler.rb +1 -1
  216. data/lib/puppet/util.rb +9 -1
  217. data/lib/puppet/version.rb +1 -1
  218. data/lib/puppet.rb +12 -0
  219. data/spec/fixtures/unit/application/environments/production/data/common.yaml +3 -0
  220. data/spec/fixtures/unit/application/environments/production/environment.conf +1 -0
  221. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/data/bad.json +3 -0
  222. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/environment.conf +2 -0
  223. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
  224. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
  225. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
  226. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
  227. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
  228. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
  229. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
  230. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
  231. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
  232. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
  233. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
  234. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
  235. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
  236. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
  237. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
  238. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
  239. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
  240. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
  241. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +18 -0
  242. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
  243. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +46 -0
  244. data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
  245. data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
  246. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
  247. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
  248. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -0
  249. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/environment.conf +2 -0
  250. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
  251. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
  252. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +1 -0
  253. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
  254. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
  255. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
  256. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +18 -0
  257. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
  258. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/metadata.json +9 -0
  259. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +1 -0
  260. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_module_data.rb +1 -0
  261. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +3 -0
  262. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/hiera.yaml +8 -0
  263. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
  264. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/metadata.json +9 -0
  265. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
  266. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/manifests/init.pp +3 -0
  267. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/metadata.json +9 -0
  268. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +10 -0
  269. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +23 -0
  270. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/manifests/init.pp +3 -0
  271. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/metadata.json +9 -0
  272. data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
  273. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
  274. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
  275. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -0
  276. data/spec/integration/data_binding_spec.rb +229 -0
  277. data/spec/integration/file_bucket/file_spec.rb +2 -2
  278. data/spec/integration/parser/compiler_spec.rb +30 -24
  279. data/spec/integration/parser/resource_expressions_spec.rb +4 -4
  280. data/spec/integration/parser/undef_param_spec.rb +1 -1
  281. data/spec/integration/provider/package_spec.rb +3 -1
  282. data/spec/integration/resource/catalog_spec.rb +1 -1
  283. data/spec/integration/ssl/certificate_authority_spec.rb +0 -1
  284. data/spec/integration/ssl/certificate_request_spec.rb +0 -1
  285. data/spec/integration/ssl/certificate_revocation_list_spec.rb +0 -1
  286. data/spec/integration/ssl/host_spec.rb +0 -1
  287. data/spec/integration/type/package_spec.rb +2 -0
  288. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  289. data/spec/integration/util/windows/security_spec.rb +18 -0
  290. data/spec/lib/matchers/include_in_order.rb +2 -2
  291. data/spec/shared_behaviours/iterative_functions.rb +8 -8
  292. data/spec/spec_helper.rb +7 -0
  293. data/spec/unit/agent/locker_spec.rb +4 -4
  294. data/spec/unit/agent_spec.rb +0 -8
  295. data/spec/unit/application/agent_spec.rb +5 -0
  296. data/spec/unit/application/apply_spec.rb +9 -1
  297. data/spec/unit/application/filebucket_spec.rb +88 -2
  298. data/spec/unit/application/lookup_spec.rb +195 -0
  299. data/spec/unit/application/master_spec.rb +2 -2
  300. data/spec/unit/application_spec.rb +3 -3
  301. data/spec/unit/appmgmt_spec.rb +657 -0
  302. data/spec/unit/capability_spec.rb +414 -0
  303. data/spec/unit/configurer_spec.rb +7 -1
  304. data/spec/unit/context/trusted_information_spec.rb +24 -1
  305. data/spec/unit/daemon_spec.rb +18 -8
  306. data/spec/unit/data_providers/hiera_data_provider_spec.rb +201 -0
  307. data/spec/unit/environments_spec.rb +2 -0
  308. data/spec/unit/face/node_spec.rb +1 -1
  309. data/spec/unit/file_bucket/dipper_spec.rb +210 -1
  310. data/spec/unit/file_serving/configuration_spec.rb +1 -1
  311. data/spec/unit/file_system_spec.rb +20 -0
  312. data/spec/unit/functions/assert_type_spec.rb +5 -7
  313. data/spec/unit/functions/defined_spec.rb +2 -2
  314. data/spec/unit/functions/epp_spec.rb +2 -2
  315. data/spec/unit/functions/filter_spec.rb +18 -0
  316. data/spec/unit/functions/hiera_spec.rb +2 -2
  317. data/spec/unit/functions/lookup_spec.rb +200 -9
  318. data/spec/unit/functions/regsubst_spec.rb +17 -8
  319. data/spec/unit/functions/scanf_spec.rb +1 -1
  320. data/spec/unit/functions/split_spec.rb +2 -2
  321. data/spec/unit/functions/versioncmp_spec.rb +36 -0
  322. data/spec/unit/functions4_spec.rb +58 -72
  323. data/spec/unit/graph/sequential_prioritizer_spec.rb +1 -1
  324. data/spec/unit/indirector/catalog/compiler_spec.rb +28 -8
  325. data/spec/unit/indirector/catalog/static_compiler_spec.rb +38 -20
  326. data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
  327. data/spec/unit/indirector/file_bucket_file/file_spec.rb +52 -1
  328. data/spec/unit/indirector/indirection_spec.rb +13 -2
  329. data/spec/unit/indirector/request_spec.rb +8 -8
  330. data/spec/unit/indirector/ssl_file_spec.rb +1 -1
  331. data/spec/unit/indirector/yaml_spec.rb +1 -1
  332. data/spec/unit/info_service_spec.rb +236 -0
  333. data/spec/unit/module_tool/application_spec.rb +1 -1
  334. data/spec/unit/module_tool/applications/builder_spec.rb +1 -1
  335. data/spec/unit/module_tool/metadata_spec.rb +31 -2
  336. data/spec/unit/network/authconfig_spec.rb +62 -32
  337. data/spec/unit/network/authorization_spec.rb +30 -2
  338. data/spec/unit/network/authstore_spec.rb +1 -1
  339. data/spec/unit/network/http/compression_spec.rb +1 -1
  340. data/spec/unit/network/http/connection_spec.rb +14 -19
  341. data/spec/unit/network/http/handler_spec.rb +0 -5
  342. data/spec/unit/network/rights_spec.rb +3 -3
  343. data/spec/unit/node_spec.rb +27 -0
  344. data/spec/unit/parser/ast/leaf_spec.rb +1 -1
  345. data/spec/unit/parser/compiler_spec.rb +86 -2
  346. data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
  347. data/spec/unit/parser/resource_spec.rb +2 -20
  348. data/spec/unit/pops/binder/config/binder_config_spec.rb +1 -1
  349. data/spec/unit/pops/binder/injector_spec.rb +3 -3
  350. data/spec/unit/pops/evaluator/access_ops_spec.rb +13 -11
  351. data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -2
  352. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +20 -11
  353. data/spec/unit/pops/evaluator/literal_evaluator_spec.rb +43 -0
  354. data/spec/unit/pops/label_provider_spec.rb +5 -1
  355. data/spec/unit/pops/parser/lexer2_spec.rb +39 -0
  356. data/spec/unit/pops/parser/parse_application_spec.rb +40 -0
  357. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +4 -0
  358. data/spec/unit/pops/parser/parse_capabilities_spec.rb +47 -0
  359. data/spec/unit/pops/parser/parse_site_spec.rb +38 -0
  360. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  361. data/spec/unit/pops/parser/parser_spec.rb +18 -0
  362. data/spec/unit/pops/types/type_calculator_spec.rb +427 -444
  363. data/spec/unit/pops/types/type_factory_spec.rb +12 -12
  364. data/spec/unit/pops/types/type_parser_spec.rb +15 -12
  365. data/spec/unit/pops/validator/validator_spec.rb +68 -0
  366. data/spec/unit/property_spec.rb +1 -1
  367. data/spec/unit/provider/augeas/augeas_spec.rb +50 -0
  368. data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
  369. data/spec/unit/provider/group/windows_adsi_spec.rb +3 -0
  370. data/spec/unit/provider/package/dnf_spec.rb +92 -0
  371. data/spec/unit/provider/package/gem_spec.rb +7 -0
  372. data/spec/unit/provider/package/nim_spec.rb +6 -6
  373. data/spec/unit/provider/package/rpm_spec.rb +25 -2
  374. data/spec/unit/provider/package/windows/package_spec.rb +41 -0
  375. data/spec/unit/provider/package/yum_spec.rb +35 -12
  376. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +10 -0
  377. data/spec/unit/provider/service/debian_spec.rb +28 -0
  378. data/spec/unit/provider/service/gentoo_spec.rb +1 -0
  379. data/spec/unit/provider/service/init_spec.rb +6 -0
  380. data/spec/unit/provider/service/launchd_spec.rb +85 -10
  381. data/spec/unit/provider/service/openrc_spec.rb +1 -0
  382. data/spec/unit/provider/service/rcng_spec.rb +41 -0
  383. data/spec/unit/provider/service/redhat_spec.rb +8 -1
  384. data/spec/unit/provider/service/smf_spec.rb +30 -5
  385. data/spec/unit/provider/service/src_spec.rb +20 -4
  386. data/spec/unit/provider/service/systemd_spec.rb +79 -29
  387. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +1 -1
  388. data/spec/unit/provider/sshkey/parsed_spec.rb +23 -0
  389. data/spec/unit/provider/user/windows_adsi_spec.rb +2 -1
  390. data/spec/unit/provider/zone/solaris_spec.rb +19 -0
  391. data/spec/unit/reports_spec.rb +10 -0
  392. data/spec/unit/resource/capability_finder_spec.rb +56 -0
  393. data/spec/unit/resource/catalog_spec.rb +31 -8
  394. data/spec/unit/resource/type_collection_spec.rb +23 -2
  395. data/spec/unit/resource/type_spec.rb +1 -1
  396. data/spec/unit/resource_spec.rb +23 -5
  397. data/spec/unit/settings/file_setting_spec.rb +31 -0
  398. data/spec/unit/settings_spec.rb +91 -2
  399. data/spec/unit/ssl/certificate_authority/interface_spec.rb +4 -3
  400. data/spec/unit/ssl/certificate_authority_spec.rb +5 -3
  401. data/spec/unit/ssl/host_spec.rb +2 -2
  402. data/spec/unit/ssl/oids_spec.rb +8 -0
  403. data/spec/unit/transaction/additional_resource_generator_spec.rb +78 -5
  404. data/spec/unit/transaction/report_spec.rb +24 -1
  405. data/spec/unit/transaction_spec.rb +7 -0
  406. data/spec/unit/type/exec_spec.rb +16 -8
  407. data/spec/unit/type/host_spec.rb +4 -4
  408. data/spec/unit/type/package_spec.rb +1 -0
  409. data/spec/unit/type/tidy_spec.rb +4 -4
  410. data/spec/unit/type/user_spec.rb +14 -7
  411. data/spec/unit/type/vlan_spec.rb +1 -1
  412. data/spec/unit/type_spec.rb +1 -1
  413. data/spec/unit/util/ldap/generator_spec.rb +1 -1
  414. data/spec/unit/util/network_device/cisco/device_spec.rb +1 -1
  415. data/spec/unit/util/network_device/transport/ssh_spec.rb +1 -1
  416. data/spec/unit/util/network_device_spec.rb +1 -1
  417. data/spec/unit/util/storage_spec.rb +5 -1
  418. data/spec/unit/util/windows/adsi_spec.rb +13 -0
  419. data/spec/unit/util_spec.rb +21 -2
  420. metadata +173 -7
  421. data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
  422. data/spec/integration/data_binding.rb +0 -104
@@ -27,19 +27,24 @@ describe "when performing lookup" do
27
27
  # @param *args [String] splat of args that will be concatenated to form the puppet args sent to lookup
28
28
  # @return [Array<String>] List of names of Notify resources in the resulting catalog
29
29
  #
30
- def assemble_and_compile(fmt, *lookup_args)
31
- assemble_and_compile_with_block(fmt, "'no_block_present'", *lookup_args)
30
+ def assemble_and_compile(fmt, *lookup_args, &block)
31
+ assemble_and_compile_with_block(fmt, "'no_block_present'", *lookup_args, &block)
32
32
  end
33
33
 
34
- def assemble_and_compile_with_block(fmt, block, *lookup_args)
35
- Puppet[:code] = <<-END.gsub(/^ {6}/, '')
34
+ def assemble_and_compile_with_block(fmt, block, *lookup_args, &cblock)
35
+ compile_and_get_notifications(<<-END.gsub(/^ {6}/, ''), &cblock)
36
36
  $args = [#{lookup_args.join(',')}]
37
37
  $block = #{block}
38
38
  include abc
39
39
  $r = if $abc::result == undef { 'no_value' } else { $abc::result }
40
40
  notify { \"#{fmt}\": }
41
41
  END
42
- compiler.compile().resources.map(&:ref).select { |r| r.start_with?('Notify[') }.map { |r| r[7..-2] }
42
+ end
43
+
44
+ def compile_and_get_notifications(code)
45
+ Puppet[:code] = code
46
+ catalog = block_given? ? compiler.compile { |catalog| yield(compiler.topscope); catalog } : compiler.compile
47
+ catalog.resources.map(&:ref).select { |r| r.start_with?('Notify[') }.map { |r| r[7..-2] }
43
48
  end
44
49
 
45
50
  # There is a fully configured 'production' environment in fixtures at this location
@@ -76,7 +81,18 @@ describe "when performing lookup" do
76
81
  expect(resources).to include('module_b')
77
82
  end
78
83
 
84
+ it "can lookup value provided by the module that has 'function' data_provider entry in metadata.json" do
85
+ resources = compile_and_get_notifications("$args = ['meta::b']\ninclude meta\nnotify { $meta::result: }\n")
86
+ expect(resources).to include('module_b')
87
+ end
88
+
89
+ it "can lookup value provided by the module that has 'sample' data_provider entry in metadata.json" do
90
+ resources = compile_and_get_notifications("$args = ['metawcp::b']\ninclude metawcp\nnotify { $metawcp::result: }\n")
91
+ expect(resources).to include('module_b')
92
+ end
93
+
79
94
  it 'can lookup value provided in global scope' do
95
+ Hiera.any_instance.expects(:lookup).with('lookup_options', any_parameters).at_most_once.throws(:no_such_key)
80
96
  Hiera.any_instance.expects(:lookup).with('abc::a', any_parameters).returns('global_a')
81
97
  resources = assemble_and_compile('${r}', "'abc::a'")
82
98
  expect(resources).to include('global_a')
@@ -108,6 +124,7 @@ describe "when performing lookup" do
108
124
  end
109
125
 
110
126
  it "can 'hash' merge values provided by global, environment, and module" do
127
+ Hiera.any_instance.expects(:lookup).with('lookup_options', any_parameters).at_most_once.throws(:no_such_key)
111
128
  Hiera.any_instance.expects(:lookup).with('abc::e', any_parameters).returns({ 'k1' => 'global_e1' })
112
129
  resources = assemble_and_compile('${r[k1]}_${r[k2]}_${r[k3]}', "'abc::e'", 'Hash[String,String]', "'hash'")
113
130
  expect(resources).to include('global_e1_module_e2_env_e3')
@@ -173,30 +190,35 @@ describe "when performing lookup" do
173
190
  end
174
191
 
175
192
  it 'can lookup and deep merge deep values provided by global, environment, and module' do
193
+ Hiera.any_instance.expects(:lookup).with('lookup_options', any_parameters).at_most_once.throws(:no_such_key)
176
194
  Hiera.any_instance.expects(:lookup).with('abc::f', any_parameters).returns({ 'k1' => { 's1' => 'global_f11' }, 'k2' => { 's3' => 'global_f23' }})
177
195
  resources = assemble_and_compile('${r[k1][s1]}_${r[k1][s2]}_${r[k1][s3]}_${r[k2][s1]}_${r[k2][s2]}_${r[k2][s3]}', "'abc::f'", 'Hash[String,Hash[String,String]]', "'deep'")
178
196
  expect(resources).to include('global_f11_env_f12_module_f13_env_f21_module_f22_global_f23')
179
197
  end
180
198
 
181
199
  it 'will propagate resolution_type :array to Hiera when merge == \'unique\'' do
200
+ Hiera.any_instance.expects(:lookup).with('lookup_options', any_parameters).at_most_once.throws(:no_such_key)
182
201
  Hiera.any_instance.expects(:lookup).with('abc::c', anything, anything, anything, :array).returns(['global_c'])
183
202
  resources = assemble_and_compile('${r[0]}_${r[1]}_${r[2]}', "'abc::c'", 'Array[String]', "'unique'")
184
203
  expect(resources).to include('global_c_env_c_module_c')
185
204
  end
186
205
 
187
206
  it 'will propagate a Hash resolution_type with :behavior => :native to Hiera when merge == \'hash\'' do
207
+ Hiera.any_instance.expects(:lookup).with('lookup_options', any_parameters).at_most_once.throws(:no_such_key)
188
208
  Hiera.any_instance.expects(:lookup).with('abc::e', anything, anything, anything, { :behavior => :native }).returns({ 'k1' => 'global_e1' })
189
209
  resources = assemble_and_compile('${r[k1]}_${r[k2]}_${r[k3]}', "'abc::e'", 'Hash[String,String]', "{strategy => 'hash'}")
190
210
  expect(resources).to include('global_e1_module_e2_env_e3')
191
211
  end
192
212
 
193
213
  it 'will propagate a Hash resolution_type with :behavior => :deeper to Hiera when merge == \'deep\'' do
214
+ Hiera.any_instance.expects(:lookup).with('lookup_options', any_parameters).at_most_once.throws(:no_such_key)
194
215
  Hiera.any_instance.expects(:lookup).with('abc::f', anything, anything, anything, { :behavior => :deeper }).returns({ 'k1' => { 's1' => 'global_f11' }, 'k2' => { 's3' => 'global_f23' }})
195
216
  resources = assemble_and_compile('${r[k1][s1]}_${r[k1][s2]}_${r[k1][s3]}_${r[k2][s1]}_${r[k2][s2]}_${r[k2][s3]}', "'abc::f'", 'Hash[String,Hash[String,String]]', "'deep'")
196
217
  expect(resources).to include('global_f11_env_f12_module_f13_env_f21_module_f22_global_f23')
197
218
  end
198
219
 
199
220
  it 'will propagate a Hash resolution_type with symbolic deep merge options to Hiera' do
221
+ Hiera.any_instance.expects(:lookup).with('lookup_options', any_parameters).at_most_once.throws(:no_such_key)
200
222
  Hiera.any_instance.expects(:lookup).with('abc::f', anything, anything, anything, { :behavior => :deeper, :knockout_prefix => '--' }).returns({ 'k1' => { 's1' => 'global_f11' }, 'k2' => { 's3' => 'global_f23' }})
201
223
  resources = assemble_and_compile('${r[k1][s1]}_${r[k1][s2]}_${r[k1][s3]}_${r[k2][s1]}_${r[k2][s2]}_${r[k2][s3]}', "'abc::f'", 'Hash[String,Hash[String,String]]', "{ 'strategy' => 'deep', 'knockout_prefix' => '--' }")
202
224
  expect(resources).to include('global_f11_env_f12_module_f13_env_f21_module_f22_global_f23')
@@ -331,24 +353,26 @@ describe "when performing lookup" do
331
353
  end
332
354
 
333
355
  it 'will resolve global, environment, and module correctly' do
356
+ Hiera.any_instance.expects(:lookup).with('lookup_options', any_parameters).at_most_once.throws(:no_such_key)
334
357
  Hiera.any_instance.expects(:lookup).with('bca::e', any_parameters).returns({ 'k1' => 'global_e1' })
335
- Puppet[:code] = <<-END.gsub(/^ {8}/, '')
358
+ resources = compile_and_get_notifications(<<-END.gsub(/^ {8}/, '')
336
359
  include bca
337
360
  $r = lookup(bca::e, Hash[String,String], hash)
338
361
  notify { "${r[k1]}_${r[k2]}_${r[k3]}": }
339
362
  END
340
- resources = compiler.compile().resources.map(&:ref).select { |r| r.start_with?('Notify[') }.map { |r| r[7..-2] }
363
+ )
341
364
  expect(resources).to include('global_e1_module_bca_e2_env_bca_e3')
342
365
  end
343
366
 
344
367
  it 'will resolve global and environment correctly when module has no provider' do
368
+ Hiera.any_instance.expects(:lookup).with('lookup_options', any_parameters).at_most_once.throws(:no_such_key)
345
369
  Hiera.any_instance.expects(:lookup).with('no_provider::e', any_parameters).returns({ 'k1' => 'global_e1' })
346
- Puppet[:code] = <<-END.gsub(/^ {8}/, '')
370
+ resources = compile_and_get_notifications(<<-END.gsub(/^ {8}/, '')
347
371
  include no_provider
348
372
  $r = lookup(no_provider::e, Hash[String,String], hash)
349
373
  notify { "${r[k1]}_${r[k2]}_${r[k3]}": }
350
374
  END
351
- resources = compiler.compile().resources.map(&:ref).select { |r| r.start_with?('Notify[') }.map { |r| r[7..-2] }
375
+ )
352
376
  expect(resources).to include('global_e1__env_no_provider_e3') # k2 is missing
353
377
  end
354
378
  end
@@ -361,4 +385,171 @@ describe "when performing lookup" do
361
385
  end.to raise_error(Puppet::ParseError, /data for module 'bad_data' must use keys qualified with the name of the module/)
362
386
  end
363
387
  end
388
+
389
+
390
+ context 'when using explain' do
391
+ it 'will explain that module is not found' do
392
+ assemble_and_compile('${r}', "'abc::a'") do |scope|
393
+ lookup_invocation = Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, true)
394
+ begin
395
+ Puppet::Pops::Lookup.lookup('ppx::e',nil, nil, false, nil, lookup_invocation)
396
+ rescue Puppet::Error
397
+ end
398
+ expect(lookup_invocation.explainer.to_s).to eq(<<EOS)
399
+ Merge strategy first
400
+ Data Binding "hiera"
401
+ No such key: "ppx::e"
402
+ Data Provider "FunctionEnvDataProvider"
403
+ No such key: "ppx::e"
404
+ Module "ppx"
405
+ Module not found
406
+ EOS
407
+ end
408
+ end
409
+
410
+ it 'will explain that module does not find a key' do
411
+ assemble_and_compile('${r}', "'abc::a'") do |scope|
412
+ lookup_invocation = Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, true)
413
+ begin
414
+ Puppet::Pops::Lookup.lookup('abc::x', nil, nil, false, nil, lookup_invocation)
415
+ rescue Puppet::Error
416
+ end
417
+ expect(lookup_invocation.explainer.to_s).to eq(<<EOS)
418
+ Merge strategy first
419
+ Data Binding "hiera"
420
+ No such key: "abc::x"
421
+ Data Provider "FunctionEnvDataProvider"
422
+ No such key: "abc::x"
423
+ Module "abc" using Data Provider "FunctionModuleDataProvider"
424
+ No such key: "abc::x"
425
+ EOS
426
+ end
427
+ end
428
+
429
+ it 'will explain deep merge results without options' do
430
+ assemble_and_compile('${r}', "'abc::a'") do |scope|
431
+ lookup_invocation = Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, true)
432
+ Puppet::Pops::Lookup.lookup('abc::e', Puppet::Pops::Types::TypeParser.new.parse('Hash[String,String]'), nil, false, 'deep', lookup_invocation)
433
+ expect(lookup_invocation.explainer.to_s).to eq(<<EOS)
434
+ Merge strategy deep
435
+ Data Binding "hiera"
436
+ No such key: "abc::e"
437
+ Data Provider "FunctionEnvDataProvider"
438
+ Found key: "abc::e" value: {
439
+ "k1" => "env_e1",
440
+ "k3" => "env_e3"
441
+ }
442
+ Module "abc" using Data Provider "FunctionModuleDataProvider"
443
+ Found key: "abc::e" value: {
444
+ "k1" => "module_e1",
445
+ "k2" => "module_e2"
446
+ }
447
+ Merged result: {
448
+ "k1" => "env_e1",
449
+ "k2" => "module_e2",
450
+ "k3" => "env_e3"
451
+ }
452
+ EOS
453
+ end
454
+ end
455
+
456
+ it 'will explain deep merge results with options' do
457
+ assemble_and_compile('${r}', "'abc::a'") do |scope|
458
+ Hiera.any_instance.expects(:lookup).with(any_parameters).returns({'k1' => 'global_g1'})
459
+ lookup_invocation = Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, true)
460
+ Puppet::Pops::Lookup.lookup('abc::e', Puppet::Pops::Types::TypeParser.new.parse('Hash[String,String]'), nil, false, {'strategy' => 'deep', 'merge_hash_arrays' => true}, lookup_invocation)
461
+ expect(lookup_invocation.explainer.to_s).to eq(<<EOS)
462
+ Merge strategy deep
463
+ Options: {
464
+ "merge_hash_arrays" => true
465
+ }
466
+ Data Binding "hiera"
467
+ Found key: "abc::e" value: {
468
+ "k1" => "global_g1"
469
+ }
470
+ Data Provider "FunctionEnvDataProvider"
471
+ Found key: "abc::e" value: {
472
+ "k1" => "env_e1",
473
+ "k3" => "env_e3"
474
+ }
475
+ Module "abc" using Data Provider "FunctionModuleDataProvider"
476
+ Found key: "abc::e" value: {
477
+ "k1" => "module_e1",
478
+ "k2" => "module_e2"
479
+ }
480
+ Merged result: {
481
+ "k1" => "global_g1",
482
+ "k2" => "module_e2",
483
+ "k3" => "env_e3"
484
+ }
485
+ EOS
486
+ end
487
+ end
488
+
489
+ it 'will handle path merge with not found correctly' do
490
+ assemble_and_compile('${r}', "'hieraprovider::test::param_a'") do |scope|
491
+ lookup_invocation = Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, true)
492
+ begin
493
+ Puppet::Pops::Lookup.lookup('hieraprovider::test::not_found', nil, nil, false, nil, lookup_invocation)
494
+ rescue Puppet::DataBinding::LookupError
495
+ end
496
+ expect(lookup_invocation.explainer.to_s).to eq(<<EOS)
497
+ Merge strategy first
498
+ Data Binding "hiera"
499
+ No such key: "hieraprovider::test::not_found"
500
+ Data Provider "FunctionEnvDataProvider"
501
+ No such key: "hieraprovider::test::not_found"
502
+ Module "hieraprovider" using Data Provider "Hiera Data Provider, version 4"
503
+ ConfigurationPath "#{environmentpath}/production/modules/hieraprovider/hiera.yaml"
504
+ Data Provider "two paths"
505
+ Merge strategy first
506
+ Path "#{environmentpath}/production/modules/hieraprovider/data/first.json"
507
+ Original path: first
508
+ No such key: "hieraprovider::test::not_found"
509
+ Path "#{environmentpath}/production/modules/hieraprovider/data/second_not_present.json"
510
+ Original path: second_not_present
511
+ Path not found
512
+ EOS
513
+ end
514
+ end
515
+
516
+ it 'will provide a hash containing all explanation elements' do
517
+ assemble_and_compile('${r}', "'abc::a'") do |scope|
518
+ lookup_invocation = Puppet::Pops::Lookup::Invocation.new(scope, {}, {}, true)
519
+ Puppet::Pops::Lookup.lookup('abc::e', Puppet::Pops::Types::TypeParser.new.parse('Hash[String,String]'), nil, false, {'strategy' => 'deep', 'merge_hash_arrays' => true}, lookup_invocation)
520
+ expect(lookup_invocation.explainer.to_hash).to eq(
521
+ {
522
+ :branches => [
523
+ {
524
+ :key => 'abc::e',
525
+ :event => :not_found,
526
+ :type => :global,
527
+ :name => :hiera
528
+ },
529
+ {
530
+ :key => 'abc::e',
531
+ :value => { 'k1' => 'env_e1', 'k3' => 'env_e3' },
532
+ :event => :found,
533
+ :type => :data_provider,
534
+ :name => 'FunctionEnvDataProvider'
535
+ },
536
+ {
537
+ :key => 'abc::e',
538
+ :value => { 'k1' => 'module_e1', 'k2' => 'module_e2' },
539
+ :event => :found,
540
+ :type => :data_provider,
541
+ :name => 'FunctionModuleDataProvider',
542
+ :module => 'abc'
543
+ }
544
+ ],
545
+ :value => { 'k1' => 'env_e1', 'k2' => 'module_e2', 'k3' => 'env_e3' },
546
+ :event => :result,
547
+ :merge => :deep,
548
+ :options => { 'merge_hash_arrays' => true },
549
+ :type => :merge
550
+ }
551
+ )
552
+ end
553
+ end
554
+ end
364
555
  end
@@ -22,19 +22,19 @@ describe 'the regsubst function' do
22
22
 
23
23
  context 'when using a string pattern' do
24
24
  it 'should raise an Error if there is less than 3 arguments' do
25
- expect { regsubst('foo', 'bar') }.to raise_error(/called with mis-matched arguments/)
25
+ expect { regsubst('foo', 'bar') }.to raise_error(/expects between 3 and 5 arguments, got 2/)
26
26
  end
27
27
 
28
28
  it 'should raise an Error if there is more than 5 arguments' do
29
- expect { regsubst('foo', 'bar', 'gazonk', 'G', 'U', 'y') }.to raise_error(/called with mis-matched arguments/)
29
+ expect { regsubst('foo', 'bar', 'gazonk', 'G', 'U', 'y') }.to raise_error(/expects between 3 and 5 arguments, got 6/)
30
30
  end
31
31
 
32
32
  it 'should raise an Error if given a bad flag' do
33
- expect { regsubst('foo', 'bar', 'gazonk', 'X') }.to raise_error(/called with mis-matched arguments/)
33
+ expect { regsubst('foo', 'bar', 'gazonk', 'X') }.to raise_error(/parameter 'flags' expects a match for Pattern\[\/\^\[GEIM\]\*\$\/\], got 'X'/)
34
34
  end
35
35
 
36
36
  it 'should raise an Error if given a bad encoding' do
37
- expect { regsubst('foo', 'bar', 'gazonk', nil, 'X') }.to raise_error(/called with mis-matched arguments/)
37
+ expect { regsubst('foo', 'bar', 'gazonk', nil, 'X') }.to raise_error(/parameter 'encoding' expects a match for Enum\['E', 'N', 'S', 'U'\], got 'X'/)
38
38
  end
39
39
 
40
40
  it 'should raise an Error if given a bad regular expression' do
@@ -48,15 +48,15 @@ describe 'the regsubst function' do
48
48
 
49
49
  context 'when using a regexp pattern' do
50
50
  it 'should raise an Error if there is less than 3 arguments' do
51
- expect { regsubst('foo', /bar/) }.to raise_error(/called with mis-matched arguments/)
51
+ expect { regsubst('foo', /bar/) }.to raise_error(/expects between 3 and 5 arguments, got 2/)
52
52
  end
53
53
 
54
- it 'should raise an Error if there is more than 4 arguments' do
55
- expect { regsubst('foo', /bar/, 'gazonk', 'G', 'y') }.to raise_error(/called with mis-matched arguments/)
54
+ it 'should raise an Error if there is more than 5 arguments' do
55
+ expect { regsubst('foo', /bar/, 'gazonk', 'G', 'E', 'y') }.to raise_error(/expects between 3 and 5 arguments, got 6/)
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(/called with mis-matched arguments/)
59
+ expect { regsubst('foo', /bar/, 'gazonk', 'I') }.to raise_error(/expected one of/)
60
60
  end
61
61
 
62
62
  it 'should handle global substitutions' do
@@ -94,5 +94,14 @@ describe 'the regsubst function' do
94
94
  'G')
95
95
  ).to eql(['<130>.<236>.<254>.<10>', '<foo>.<example>.<com>','<coconut>', '<10>.<20>.<30>.<40>'])
96
96
  end
97
+
98
+ it 'should return an empty array if given an empty array and string pattern' do
99
+ expect(regsubst([], '', '')).to eql([])
100
+ end
101
+
102
+ it 'should return an empty array if given an empty array and regexp pattern' do
103
+ expect(regsubst([], //, '')).to eql([])
104
+ end
105
+
97
106
  end
98
107
  end
@@ -27,6 +27,6 @@ describe 'the scanf function' do
27
27
  it 'errors when not given enough arguments' do
28
28
  expect do
29
29
  compile_to_catalog("'42'.scanf()")
30
- end.to raise_error(/.*expected.*scanf\(String data, String format, Callable block \{0,1\}\)/m)
30
+ end.to raise_error(/'scanf' expects 2 arguments, got 1/)
31
31
  end
32
32
  end
@@ -21,11 +21,11 @@ describe 'the split function' do
21
21
  let(:type_parser) { Puppet::Pops::Types::TypeParser.new }
22
22
 
23
23
  it 'should raise an Error if there is less than 2 arguments' do
24
- expect { split('a,b') }.to raise_error(/called with mis-matched arguments/)
24
+ expect { split('a,b') }.to raise_error(/'split' expects 2 arguments, got 1/)
25
25
  end
26
26
 
27
27
  it 'should raise an Error if there is more than 2 arguments' do
28
- expect { split('a,b','foo', 'bar') }.to raise_error(/called with mis-matched arguments/)
28
+ expect { split('a,b','foo', 'bar') }.to raise_error(/'split' expects 2 arguments, got 3/)
29
29
  end
30
30
 
31
31
  it 'should raise a RegexpError if the regexp is malformed' do
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops'
3
+ require 'puppet/loaders'
4
+
5
+ describe "the versioncmp function" do
6
+
7
+ before(:all) do
8
+ loaders = Puppet::Pops::Loaders.new(Puppet::Node::Environment.create(:testing, []))
9
+ Puppet.push_context({:loaders => loaders}, "test-examples")
10
+ end
11
+
12
+ after(:all) do
13
+ Puppet::Pops::Loaders.clear
14
+ Puppet::pop_context()
15
+ end
16
+
17
+ def versioncmp(*args)
18
+ Puppet.lookup(:loaders).puppet_system_loader.load(:function, 'versioncmp').call({}, *args)
19
+ end
20
+
21
+ let(:type_parser) { Puppet::Pops::Types::TypeParser.new }
22
+
23
+ it 'should raise an Error if there is less than 2 arguments' do
24
+ expect { versioncmp('a,b') }.to raise_error(/expects 2 arguments, got 1/)
25
+ end
26
+
27
+ it 'should raise an Error if there is more than 2 arguments' do
28
+ expect { versioncmp('a,b','foo', 'bar') }.to raise_error(/expects 2 arguments, got 3/)
29
+ end
30
+
31
+ it "should call Puppet::Util::Package.versioncmp (included in scope)" do
32
+ Puppet::Util::Package.expects(:versioncmp).with('1.2', '1.3').returns(-1)
33
+
34
+ expect(versioncmp('1.2', '1.3')).to eq -1
35
+ end
36
+ end
@@ -74,11 +74,7 @@ describe 'the 4x function api' do
74
74
  it 'an error is raised when calling a no arguments function with arguments' do
75
75
  f = create_noargs_function_class()
76
76
  func = f.new(:closure_scope, :loader)
77
- expect{func.call({}, 'surprise')}.to raise_error(ArgumentError, "function 'test' called with mis-matched arguments
78
- expected:
79
- test() - arg count {0}
80
- actual:
81
- test(String) - arg count {1}")
77
+ expect{func.call({}, 'surprise')}.to raise_error(ArgumentError, "'test' expects no arguments, got 1")
82
78
  end
83
79
 
84
80
  it 'a simple function can be called' do
@@ -97,11 +93,7 @@ actual:
97
93
  signature = 'Any x, Any y'
98
94
  expect do
99
95
  func.call({}, 10)
100
- end.to raise_error(ArgumentError, "function 'min' called with mis-matched arguments
101
- expected:
102
- min(#{signature}) - arg count {2}
103
- actual:
104
- min(Integer) - arg count {1}")
96
+ end.to raise_error(ArgumentError, "'min' expects 2 arguments, got 1")
105
97
  end
106
98
 
107
99
  it 'an error is raised if called with too many arguments' do
@@ -112,12 +104,7 @@ actual:
112
104
  signature = 'Any x, Any y'
113
105
  expect do
114
106
  func.call({}, 10, 10, 10)
115
- end.to raise_error(ArgumentError, Regexp.new(Regexp.escape(
116
- "function 'min' called with mis-matched arguments
117
- expected:
118
- min(#{signature}) - arg count {2}
119
- actual:
120
- min(Integer, Integer, Integer) - arg count {3}")))
107
+ end.to raise_error(ArgumentError, "'min' expects 2 arguments, got 3")
121
108
  end
122
109
 
123
110
  it 'an error is raised if simple function-name and method are not matched' do
@@ -151,44 +138,22 @@ actual:
151
138
  func = f.new(:closure_scope, :loader)
152
139
  expect(func.is_a?(Puppet::Functions::Function)).to be_truthy
153
140
  expect do
154
- func.call({}, 10, 10, 10)
155
- end.to raise_error(ArgumentError, Regexp.new(Regexp.escape(
156
- "function 'min' called with mis-matched arguments
157
- expected:
158
- min(Numeric a, Numeric b) - arg count {2}
159
- actual:
160
- min(Integer, Integer, Integer) - arg count {3}")))
141
+ func.call({}, 10, 'ten')
142
+ end.to raise_error(ArgumentError, "'min' parameter 'b' expects a Numeric value, got String")
161
143
  end
162
144
 
163
- it 'an error includes optional indicators and count for last element' do
164
- f = create_function_with_optionals_and_varargs()
145
+ it 'an error includes optional indicators for last element' do
146
+ f = create_function_with_optionals_and_repeated_via_multiple_dispatch()
165
147
  # TODO: Bogus parameters, not yet used
166
148
  func = f.new(:closure_scope, :loader)
167
149
  expect(func.is_a?(Puppet::Functions::Function)).to be_truthy
168
- signature = 'Any x, Any y, Any a?, Any b?, Any c{0,}'
169
150
  expect do
170
- func.call({}, 10)
171
- end.to raise_error(ArgumentError,
172
- "function 'min' called with mis-matched arguments
173
- expected:
174
- min(#{signature}) - arg count {2,}
175
- actual:
176
- min(Integer) - arg count {1}")
177
- end
178
-
179
- it 'an error includes optional indicators and count for last element when defined via dispatch' do
180
- f = create_function_with_optionals_and_repeated_via_dispatch()
181
- # TODO: Bogus parameters, not yet used
182
- func = f.new(:closure_scope, :loader)
183
- expect(func.is_a?(Puppet::Functions::Function)).to be_truthy
184
- expect do
185
- func.call({}, 10)
186
- end.to raise_error(ArgumentError,
187
- "function 'min' called with mis-matched arguments
188
- expected:
189
- min(Numeric x, Numeric y, Numeric a?, Numeric b?, Numeric c{0,}) - arg count {2,}
190
- actual:
191
- min(Integer) - arg count {1}")
151
+ func.call({}, 3, 10, 3, "4")
152
+ end.to raise_error(ArgumentError, "'min' expected one of:
153
+ (Numeric x, Numeric y, Numeric a?, Numeric b?, Numeric c*)
154
+ rejected: parameter 'b' expects a Numeric value, got String
155
+ (String x, String y, String a+)
156
+ rejected: parameter 'x' expects a String value, got Integer")
192
157
  end
193
158
 
194
159
  it 'can create optional repeated parameter' do
@@ -210,12 +175,7 @@ actual:
210
175
  func = f.new(:closure_scope, :loader)
211
176
  expect(func.call({}, 1)).to eql(1)
212
177
  expect(func.call({}, 1, 2)).to eql(2)
213
- expect { func.call({}) }.to raise_error(ArgumentError,
214
- "function 'count_args' called with mis-matched arguments
215
- expected:
216
- count_args(Any c{1,}) - arg count {1,}
217
- actual:
218
- count_args(Undef{0}) - arg count {0}")
178
+ expect { func.call({}) }.to raise_error(ArgumentError, "'count_args' expects at least 1 argument, got none")
219
179
  end
220
180
 
221
181
  it 'can create scope_param followed by repeated parameter' do
@@ -256,14 +216,12 @@ actual:
256
216
  func = f.new(:closure_scope, :loader)
257
217
  expect(func.is_a?(Puppet::Functions::Function)).to be_truthy
258
218
  expect do
259
- func.call({}, 10, 10, 10)
260
- end.to raise_error(ArgumentError,
261
- "function 'min' called with mis-matched arguments
262
- expected one of:
263
- min(Numeric a, Numeric b) - arg count {2}
264
- min(String s1, String s2) - arg count {2}
265
- actual:
266
- min(Integer, Integer, Integer) - arg count {3}")
219
+ func.call({}, 10, '20')
220
+ end.to raise_error(ArgumentError, "'min' expected one of:
221
+ (Numeric a, Numeric b)
222
+ rejected: parameter 'b' expects a Numeric value, got String
223
+ (String s1, String s2)
224
+ rejected: parameter 's1' expects a String value, got Integer")
267
225
  end
268
226
 
269
227
  context 'can use injection' do
@@ -334,12 +292,7 @@ actual:
334
292
  the_function = create_function_with_required_block_all_defaults().new(:closure_scope, :loader)
335
293
  expect do
336
294
  the_function.call({}, 10)
337
- end.to raise_error(ArgumentError,
338
- "function 'test' called with mis-matched arguments
339
- expected:
340
- test(Integer x, Callable block) - arg count {2}
341
- actual:
342
- test(Integer) - arg count {1}")
295
+ end.to raise_error(ArgumentError, "'test' expects a block")
343
296
  end
344
297
 
345
298
  it 'such that, an optional block can be defined and given as an argument' do
@@ -361,7 +314,7 @@ actual:
361
314
 
362
315
  context 'provides signature information' do
363
316
  it 'about capture rest (varargs)' do
364
- fc = create_function_with_optionals_and_varargs
317
+ fc = create_function_with_optionals_and_repeated
365
318
  signatures = fc.signatures
366
319
  expect(signatures.size).to eql(1)
367
320
  signature = signatures[0]
@@ -369,14 +322,14 @@ actual:
369
322
  end
370
323
 
371
324
  it 'about optional and required parameters' do
372
- fc = create_function_with_optionals_and_varargs
325
+ fc = create_function_with_optionals_and_repeated
373
326
  signature = fc.signatures[0]
374
327
  expect(signature.args_range).to eql( [2, Float::INFINITY ] )
375
328
  expect(signature.infinity?(signature.args_range[1])).to be_truthy
376
329
  end
377
330
 
378
331
  it 'about block not being allowed' do
379
- fc = create_function_with_optionals_and_varargs
332
+ fc = create_function_with_optionals_and_repeated
380
333
  signature = fc.signatures[0]
381
334
  expect(signature.block_range).to eql( [ 0, 0 ] )
382
335
  expect(signature.block_type).to be_nil
@@ -582,7 +535,7 @@ actual:
582
535
  end
583
536
  end
584
537
 
585
- def create_function_with_optionals_and_varargs
538
+ def create_function_with_optionals_and_repeated
586
539
  f = Puppet::Functions.create_function('min') do
587
540
  def min(x,y,a=1, b=1, *c)
588
541
  x <= y ? x : y
@@ -605,6 +558,39 @@ actual:
605
558
  end
606
559
  end
607
560
 
561
+ def create_function_with_optionals_and_repeated_via_multiple_dispatch
562
+ f = Puppet::Functions.create_function('min') do
563
+ dispatch :min do
564
+ param 'Numeric', :x
565
+ param 'Numeric', :y
566
+ optional_param 'Numeric', :a
567
+ optional_param 'Numeric', :b
568
+ repeated_param 'Numeric', :c
569
+ end
570
+ dispatch :min do
571
+ param 'String', :x
572
+ param 'String', :y
573
+ required_repeated_param 'String', :a
574
+ end
575
+ def min(x,y,a=1, b=1, *c)
576
+ x <= y ? x : y
577
+ end
578
+ end
579
+ end
580
+
581
+ def create_function_with_required_repeated_via_dispatch
582
+ f = Puppet::Functions.create_function('min') do
583
+ dispatch :min do
584
+ param 'Numeric', :x
585
+ param 'Numeric', :y
586
+ required_repeated_param 'Numeric', :z
587
+ end
588
+ def min(x,y, *z)
589
+ x <= y ? x : y
590
+ end
591
+ end
592
+ end
593
+
608
594
  def create_function_with_repeated
609
595
  f = Puppet::Functions.create_function('count_args') do
610
596
  dispatch :count_args do
@@ -27,6 +27,6 @@ describe Puppet::Graph::SequentialPrioritizer do
27
27
  it "fails to prioritize a key contained in an unknown container" do
28
28
  expect do
29
29
  priorities.generate_priority_contained_in("unknown", "child 1")
30
- end.to raise_error
30
+ end.to raise_error(NoMethodError, /`down' for nil/)
31
31
  end
32
32
  end