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
@@ -1,74 +1,47 @@
1
- # Evaluates an Embedded Puppet Template (EPP) string and returns the rendered text result as a String.
2
- #
3
- # EPP support the following tags:
4
- #
5
- # * `<%= puppet expression %>` - This tag renders the value of the expression it contains.
6
- # * `<% puppet expression(s) %>` - This tag will execute the expression(s) it contains, but renders nothing.
7
- # * `<%# comment %>` - The tag and its content renders nothing.
8
- # * `<%%` or `%%>` - Renders a literal `<%` or `%>` respectively.
9
- # * `<%-` - Same as `<%` but suppresses any leading whitespace.
10
- # * `-%>` - Same as `%>` but suppresses any trailing whitespace on the same line (including line break).
11
- # * `<%- |parameters| -%>` - When placed as the first tag declares the template's parameters.
12
- #
13
- # Inline EPP supports the following visibilities of variables in scope which depends on how EPP parameters
14
- # are used - see further below:
15
- #
16
- # * Global scope (i.e. top + node scopes) - global scope is always visible
17
- # * Global + Enclosing scope - if the EPP template does not declare parameters, and no arguments are given
18
- # * Global + all given arguments - if the EPP template does not declare parameters, and arguments are given
19
- # * Global + declared parameters - if the EPP declares parameters, given argument names must match
20
- #
21
- # EPP supports parameters by placing an optional parameter list as the very first element in the EPP. As an example,
22
- # `<%- |$x, $y, $z='unicorn'| -%>` when placed first in the EPP text declares that the parameters `x` and `y` must be
23
- # given as template arguments when calling `inline_epp`, and that `z` if not given as a template argument
24
- # defaults to `'unicorn'`. Template parameters are available as variables, e.g.arguments `$x`, `$y` and `$z` in the example.
25
- # Note that `<%-` must be used or any leading whitespace will be interpreted as text
26
- #
27
- # Arguments are passed to the template by calling `inline_epp` with a Hash as the last argument, where parameters
28
- # are bound to values, e.g. `inline_epp('...', {'x'=>10, 'y'=>20})`. Excess arguments may be given
29
- # (i.e. undeclared parameters) only if the EPP templates does not declare any parameters at all.
30
- # Template parameters shadow variables in outer scopes.
31
- #
32
- # Note: An inline template is best stated using a single-quoted string, or a heredoc since a double-quoted string
33
- # is subject to expression interpolation before the string is parsed as an EPP template. Here are examples
34
- # (using heredoc to define the EPP text):
35
- #
36
- # @example Various Examples using `inline_epp`
37
- #
38
- # # produces 'Hello local variable world!'
39
- # $x ='local variable'
40
- # inline_epptemplate(@(END:epp))
41
- # <%- |$x| -%>
42
- # Hello <%= $x %> world!
43
- # END
44
- #
45
- # # produces 'Hello given argument world!'
46
- # $x ='local variable world'
47
- # inline_epptemplate(@(END:epp), { x =>'given argument'})
48
- # <%- |$x| -%>
49
- # Hello <%= $x %> world!
50
- # END
51
- #
52
- # # produces 'Hello given argument world!'
53
- # $x ='local variable world'
54
- # inline_epptemplate(@(END:epp), { x =>'given argument'})
55
- # <%- |$x| -%>
56
- # Hello <%= $x %>!
57
- # END
58
- #
59
- # # results in error, missing value for y
60
- # $x ='local variable world'
61
- # inline_epptemplate(@(END:epp), { x =>'given argument'})
62
- # <%- |$x, $y| -%>
63
- # Hello <%= $x %>!
64
- # END
65
- #
66
- # # Produces 'Hello given argument planet'
67
- # $x ='local variable world'
68
- # inline_epptemplate(@(END:epp), { x =>'given argument'})
69
- # <%- |$x, $y=planet| -%>
70
- # Hello <%= $x %> <%= $y %>!
71
- # END
1
+ # Evaluates an Embedded Puppet (EPP) template string and returns the rendered
2
+ # text result as a String.
3
+ #
4
+ # `inline_epp('<EPP TEMPLATE STRING>', <PARAMETER HASH>)`
5
+ #
6
+ # The first argument to this function should be a string containing an EPP
7
+ # template. In most cases, the last argument is optional; if used, it should be a
8
+ # [hash](/puppet/latest/reference/lang_data_hash.html) that contains parameters to
9
+ # pass to the template.
10
+ #
11
+ # - See the [template](/puppet/latest/reference/lang_template.html) documentation
12
+ # for general template usage information.
13
+ # - See the [EPP syntax](/puppet/latest/reference/lang_template_epp.html)
14
+ # documentation for examples of EPP.
15
+ #
16
+ # For example, to evaluate an inline EPP template and pass it the `docroot` and
17
+ # `virtual_docroot` parameters, call the `inline_epp` function like this:
18
+ #
19
+ # `inline_epp('docroot: <%= $docroot %> Virtual docroot: <%= $virtual_docroot %>',
20
+ # { 'docroot' => '/var/www/html', 'virtual_docroot' => '/var/www/example' })`
21
+ #
22
+ # Puppet produces a syntax error if you pass more parameters than are declared in
23
+ # the template's parameter tag. When passing parameters to a template that
24
+ # contains a parameter tag, use the same names as the tag's declared parameters.
25
+ #
26
+ # Parameters are required only if they are declared in the called template's
27
+ # parameter tag without default values. Puppet produces an error if the
28
+ # `inline_epp` function fails to pass any required parameter.
29
+ #
30
+ # An inline EPP template should be written as a single-quoted string or
31
+ # [heredoc](puppet/latest/reference/lang_data_string.html#heredocs).
32
+ # A double-quoted string is subject to expression interpolation before the string
33
+ # is parsed as an EPP template.
34
+ #
35
+ # For example, to evaluate an inline EPP template using a heredoc, call the
36
+ # `inline_epp` function like this:
37
+ #
38
+ # ~~~ puppet
39
+ # # Outputs 'Hello given argument planet!'
40
+ # inline_epp(@(END), { x => 'given argument' })
41
+ # <%- | $x, $y = planet | -%>
42
+ # Hello <%= $x %> <%= $y %>!
43
+ # END
44
+ # ~~~
72
45
  #
73
46
  # @since 4.0.0
74
47
  #
@@ -150,18 +150,16 @@
150
150
  # - Since 4.0.0
151
151
  Puppet::Functions.create_function(:lookup, Puppet::Functions::InternalFunction) do
152
152
  name_t = 'Variant[String,Array[String]]'
153
- value_type_t = 'Optional[Type]'
153
+ value_type_t = 'Type'
154
154
  default_value_t = 'Any'
155
- override_t = 'Optional[Hash[String,Any]]'
156
- default_values_hash_t = 'Optional[Hash[String,Any]]'
157
- merge_t = 'Optional[Variant[String[1],Hash[String,Scalar]]]'
155
+ merge_t = 'Variant[String[1],Hash[String,Scalar]]'
158
156
  block_t = "Callable[#{name_t}]"
159
157
  option_pairs =
160
- "value_type=>#{value_type_t},"\
158
+ "value_type=>Optional[#{value_type_t}],"\
161
159
  "default_value=>Optional[#{default_value_t}],"\
162
- "override=>#{override_t},"\
163
- "default_values_hash=>#{default_values_hash_t},"\
164
- "merge=>#{merge_t}"\
160
+ "override=>Optional[Hash[String,Any]],"\
161
+ "default_values_hash=>Optional[Hash[String,Any]],"\
162
+ "merge=>Optional[#{merge_t}]"
165
163
 
166
164
  dispatch :lookup_1 do
167
165
  scope_param
@@ -172,10 +170,10 @@ Puppet::Functions.create_function(:lookup, Puppet::Functions::InternalFunction)
172
170
 
173
171
  dispatch :lookup_2 do
174
172
  scope_param
175
- param name_t, :name
176
- param value_type_t, :value_type
177
- param merge_t, :merge
178
- param default_value_t, :default_value
173
+ param name_t, :name
174
+ param "Optional[#{value_type_t}]", :value_type
175
+ param "Optional[#{merge_t}]", :merge
176
+ param default_value_t, :default_value
179
177
  end
180
178
 
181
179
  dispatch :lookup_3 do
@@ -202,23 +200,27 @@ Puppet::Functions.create_function(:lookup, Puppet::Functions::InternalFunction)
202
200
  end
203
201
 
204
202
  def lookup_1(scope, name, value_type=nil, merge=nil)
205
- Puppet::Pops::Lookup.lookup(scope, name, value_type, nil, false, {}, {}, merge)
203
+ do_lookup(scope, name, value_type, nil, false, {}, {}, merge)
206
204
  end
207
205
 
208
206
  def lookup_2(scope, name, value_type, merge, default_value)
209
- Puppet::Pops::Lookup.lookup(scope, name, value_type, default_value, true, {}, {}, merge)
207
+ do_lookup(scope, name, value_type, default_value, true, {}, {}, merge)
210
208
  end
211
209
 
212
210
  def lookup_3(scope, name, value_type=nil, merge=nil, &block)
213
- Puppet::Pops::Lookup.lookup(scope, name, value_type, nil, false, {}, {}, merge, &block)
211
+ do_lookup(scope, name, value_type, nil, false, {}, {}, merge, &block)
214
212
  end
215
213
 
216
214
  def lookup_4(scope, options_hash, &block)
217
- Puppet::Pops::Lookup.lookup(scope, options_hash['name'], *hash_args(options_hash), &block)
215
+ do_lookup(scope, options_hash['name'], *hash_args(options_hash), &block)
218
216
  end
219
217
 
220
218
  def lookup_5(scope, name, options_hash, &block)
221
- Puppet::Pops::Lookup.lookup(scope, name, *hash_args(options_hash), &block)
219
+ do_lookup(scope, name, *hash_args(options_hash), &block)
220
+ end
221
+
222
+ def do_lookup(scope, name, value_type, default_value, has_default, override, default_values_hash, merge, &block)
223
+ Puppet::Pops::Lookup.lookup(name, value_type, default_value, has_default, merge, Puppet::Pops::Lookup::Invocation.new(scope, override, default_values_hash), &block)
222
224
  end
223
225
 
224
226
  def hash_args(options_hash)
@@ -1,33 +1,68 @@
1
- # Applies a parameterized block to each element in a sequence of entries from the first
2
- # argument and returns an array with the result of each invocation of the parameterized block.
1
+ # Applies a [lambda](http://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html)
2
+ # to every value in a data structure and returns an array containing the results.
3
3
  #
4
- # This function takes two mandatory arguments: the first should be an Array, Hash, or of Enumerable type
5
- # (integer, Integer range, or String), and the second a parameterized block as produced by the puppet syntax:
4
+ # This function takes two mandatory arguments, in this order:
6
5
  #
7
- # $a.map |$x| { ... }
8
- # map($a) |$x| { ... }
6
+ # 1. An array or hash the function will iterate over.
7
+ # 2. A lambda, which the function calls for each element in the first argument. It can
8
+ # request one or two parameters.
9
9
  #
10
- # When the first argument `$a` is an Array or of enumerable type, the block is called with each entry in turn.
11
- # When the first argument is a hash the entry is an array with `[key, value]`.
10
+ # @example Using the `map` function
12
11
  #
13
- # @example Using map with two arguments
12
+ # `$transformed_data = $data.map |$parameter| { <PUPPET CODE BLOCK> }`
14
13
  #
15
- # # Turns hash into array of values
16
- # $a.map |$x|{ $x[1] }
14
+ # or
17
15
  #
18
- # # Turns hash into array of keys
19
- # $a.map |$x| { $x[0] }
16
+ # `$transformed_data = map($data) |$parameter| { <PUPPET CODE BLOCK> }`
20
17
  #
21
- # When using a block with 2 parameters, the element's index (starting from 0) for an array, and the key for a hash
22
- # is given to the block's first parameter, and the value is given to the block's second parameter.args.
18
+ # When the first argument (`$data` in the above example) is an array, Puppet passes each
19
+ # value in turn to the lambda.
23
20
  #
24
- # @example Using map with two arguments
21
+ # @example Using the `map` function with an array and a one-parameter lambda
25
22
  #
26
- # # Turns hash into array of values
27
- # $a.map |$key,$val|{ $val }
23
+ # ~~~ puppet
24
+ # # For the array $data, return an array containing each value multiplied by 10
25
+ # $data = [1,2,3]
26
+ # $transformed_data = $data.map |$items| { $items * 10 }
27
+ # # $transformed_data contains [10,20,30]
28
+ # ~~~
28
29
  #
29
- # # Turns hash into array of keys
30
- # $a.map |$key,$val|{ $key }
30
+ # When the first argument is a hash, Puppet passes each key and value pair to the lambda
31
+ # as an array in the form `[key, value]`.
32
+ #
33
+ # @example Using the `map` function with a hash and a one-parameter lambda
34
+ #
35
+ # ~~~ puppet
36
+ # # For the hash $data, return an array containing the keys
37
+ # $data = {'a'=>1,'b'=>2,'c'=>3}
38
+ # $transformed_data = $data.map |$items| { $items[0] }
39
+ # # $transformed_data contains ['a','b','c']
40
+ # ~~~
41
+ #
42
+ # When the first argument is an array and the lambda has two parameters, Puppet passes the
43
+ # array's indexes (enumerated from 0) in the first parameter and its values in the second
44
+ # parameter.
45
+ #
46
+ # @example Using the `map` function with an array and a two-parameter lambda
47
+ #
48
+ # ~~~ puppet
49
+ # # For the array $data, return an array containing the indexes
50
+ # $data = [1,2,3]
51
+ # $transformed_data = $data.map |$index,$value| { $index }
52
+ # # $transformed_data contains [0,1,2]
53
+ # ~~~
54
+ #
55
+ # When the first argument is a hash, Puppet passes its keys to the first parameter and its
56
+ # values to the second parameter.
57
+ #
58
+ # @example Using the `map` function with a hash and a two-parameter lambda
59
+ #
60
+ # ~~~ puppet
61
+ # # For the hash $data, return an array containing each value
62
+ # $data = {'a'=>1,'b'=>2,'c'=>3}
63
+ # $transformed_data = $data.map |$key,$value| { $value }
64
+ # # $transformed_data contains [1,2,3]
65
+ # ~~~
31
66
  #
32
67
  # @since 4.0.0
33
68
  #
@@ -57,7 +92,7 @@ Puppet::Functions.create_function(:map) do
57
92
  end
58
93
 
59
94
  def map_Hash_2(hash)
60
- hash.map {|x, y| yield(x, y) }
95
+ hash.map {|x, y| yield(x, y) }
61
96
  end
62
97
 
63
98
  def map_Enumerable_1(enumerable)
@@ -1,19 +1,36 @@
1
- # Returns the match result of matching a String or Array[String] with one of:
1
+ # Matches a regular expression against a string and returns an array containing the match
2
+ # and any matched capturing groups.
2
3
  #
3
- # * Regexp
4
- # * String - transformed to a Regexp
5
- # * Pattern type
6
- # * Regexp type
4
+ # The first argument is a string or array of strings. The second argument is either a
5
+ # regular expression, regular expression represented as a string, or Regex or Pattern
6
+ # data type that the function matches against the first argument.
7
7
  #
8
- # Returns An Array with the entire match at index 0, and each subsequent submatch at index 1-n.
9
- # If there was no match, nil (ie. undef) is returned. If the value to match is an Array, a array
10
- # with mapped match results is returned.
8
+ # The returned array contains the entire match at index 0, and each captured group at
9
+ # subsequent index values. If the value or expression being matched is an array, the
10
+ # function returns an array with mapped match results.
11
11
  #
12
- # @example matching
13
- # "abc123".match(/([a-z]+)[1-9]+/) # => ["abc"]
14
- # "abc123".match(/([a-z]+)([1-9]+)/) # => ["abc", "123"]
12
+ # If the function doesn't find a match, it returns 'undef'.
13
+ #
14
+ # @example Matching a regular expression in a string
15
+ #
16
+ # ~~~ ruby
17
+ # $matches = "abc123".match(/[a-z]+[1-9]+/)
18
+ # # $matches contains [abc123]
19
+ # ~~~
20
+ #
21
+ # @example Matching a regular expressions with grouping captures in a string
22
+ #
23
+ # ~~~ ruby
24
+ # $matches = "abc123".match(/([a-z]+)([1-9]+)/)
25
+ # # $matches contains [abc123, abc, 123]
26
+ # ~~~
27
+ #
28
+ # @example Matching a regular expression with grouping captures in an array of strings
29
+ #
30
+ # ~~~ ruby
31
+ # $matches = ["abc123","def456"].match(/([a-z]+)([1-9]+)/)
32
+ # # $matches contains [[abc123, abc, 123], [def456, def, 456]]
15
33
  #
16
- # See the documentation for "The Puppet Type System" for more information about types.
17
34
  # @since 4.0.0
18
35
  #
19
36
  Puppet::Functions.create_function(:match) do
@@ -1,61 +1,98 @@
1
- # Applies a parameterized block to each element in a sequence of entries from the first
2
- # argument (_the enumerable_) and returns the last result of the invocation of the parameterized block.
3
- #
4
- # This function takes two mandatory arguments: the first should be an Array, Hash, or something of
5
- # enumerable type, and the last a parameterized block as produced by the puppet syntax:
6
- #
7
- # $a.reduce |$memo, $x| { ... }
8
- # reduce($a) |$memo, $x| { ... }
9
- #
10
- # When the first argument is an Array or someting of an enumerable type, the block is called with each entry in turn.
11
- # When the first argument is a hash each entry is converted to an array with `[key, value]` before being
12
- # fed to the block. An optional 'start memo' value may be supplied as an argument between the array/hash
13
- # and mandatory block.
14
- #
15
- # $a.reduce(start) |$memo, $x| { ... }
16
- # reduce($a, start) |$memo, $x| { ... }
17
- #
18
- # If no 'start memo' is given, the first invocation of the parameterized block will be given the first and second
19
- # elements of the enumeration, and if the enumerable has fewer than 2 elements, the first
20
- # element is produced as the result of the reduction without invocation of the block.
21
- #
22
- # On each subsequent invocation, the produced value of the invoked parameterized block is given as the memo in the
23
- # next invocation.
24
- #
25
- # @example Using reduce
26
- #
27
- # # Reduce an array
28
- # $a = [1,2,3]
29
- # $a.reduce |$memo, $entry| { $memo + $entry }
30
- # #=> 6
31
- #
32
- # # Reduce hash values
33
- # $a = {a => 1, b => 2, c => 3}
34
- # $a.reduce |$memo, $entry| { [sum, $memo[1]+$entry[1]] }
35
- # #=> [sum, 6]
36
- #
37
- # # reverse a string
38
- # "abc".reduce |$memo, $char| { "$char$memo" }
39
- # #=>"cbe"
40
- #
41
- # It is possible to provide a starting 'memo' as an argument.
42
- #
43
- # @example Using reduce with given start 'memo'
44
- #
45
- # # Reduce an array
46
- # $a = [1,2,3]
47
- # $a.reduce(4) |$memo, $entry| { $memo + $entry }
48
- # #=> 10
49
- #
50
- # # Reduce hash values
51
- # $a = {a => 1, b => 2, c => 3}
52
- # $a.reduce([na, 4]) |$memo, $entry| { [sum, $memo[1]+$entry[1]] }
53
- # #=> [sum, 10]
54
- #
55
- # @example Using reduce with an Integer range
56
- #
57
- # Integer[1,4].reduce |$memo, $x| { $memo + $x }
58
- # #=> 10
1
+ # Applies a [lambda](https://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html)
2
+ # to every value in a data structure from the first argument, carrying over the returned
3
+ # value of each iteration, and returns the result of the lambda's final iteration. This
4
+ # lets you create a new value or data structure by combining values from the first
5
+ # argument's data structure.
6
+ #
7
+ # This function takes two mandatory arguments, in this order:
8
+ #
9
+ # 1. An array or hash the function will iterate over.
10
+ # 2. A lambda, which the function calls for each element in the first argument. It takes
11
+ # two mandatory parameters:
12
+ # 1. A memo value that is overwritten after each iteration with the iteration's result.
13
+ # 2. A second value that is overwritten after each iteration with the next value in the
14
+ # function's first argument.
15
+ #
16
+ # @example Using the `reduce` function
17
+ #
18
+ # `$data.reduce |$memo, $value| { ... }`
19
+ #
20
+ # or
21
+ #
22
+ # `reduce($data) |$memo, $value| { ... }`
23
+ #
24
+ # You can also pass an optional "start memo" value as an argument, such as `start` below:
25
+ #
26
+ # `$data.reduce(start) |$memo, $value| { ... }`
27
+ #
28
+ # or
29
+ #
30
+ # `reduce($data, start) |$memo, $value| { ... }`
31
+ #
32
+ # When the first argument (`$data` in the above example) is an array, Puppet passes each
33
+ # of the data structure's values in turn to the lambda's parameters. When the first
34
+ # argument is a hash, Puppet converts each of the hash's values to an array in the form
35
+ # `[key, value]`.
36
+ #
37
+ # If you pass a start memo value, Puppet executes the lambda with the provided memo value
38
+ # and the data structure's first value. Otherwise, Puppet passes the structure's first two
39
+ # values to the lambda.
40
+ #
41
+ # Puppet calls the lambda for each of the data structure's remaining values. For each
42
+ # call, it passes the result of the previous call as the first parameter ($memo in the
43
+ # above examples) and the next value from the data structure as the second parameter
44
+ # ($value).
45
+ #
46
+ # If the structure has one value, Puppet returns the value and does not call the lambda.
47
+ #
48
+ # @example Using the `reduce` function
49
+ #
50
+ # ~~~ puppet
51
+ # # Reduce the array $data, returning the sum of all values in the array.
52
+ # $data = [1, 2, 3]
53
+ # $sum = $data.reduce |$memo, $value| { $memo + $value }
54
+ # # $sum contains 6
55
+ #
56
+ # # Reduce the array $data, returning the sum of a start memo value and all values in the
57
+ # # array.
58
+ # $data = [1, 2, 3]
59
+ # $sum = $data.reduce(4) |$memo, $value| { $memo + $value }
60
+ # # $sum contains 10
61
+ #
62
+ # # Reduce the hash $data, returning the sum of all values and concatenated string of all
63
+ # # keys.
64
+ # $data = {a => 1, b => 2, c => 3}
65
+ # $combine = $data.reduce |$memo, $value| {
66
+ # $string = "${memo[0]}${value[0]}"
67
+ # $number = $memo[1] + $value[1]
68
+ # [$string, $number]
69
+ # }
70
+ # # $combine contains [abc, 6]
71
+ # ~~~
72
+ #
73
+ # @example Using the `reduce` function with a start memo and two-parameter lambda
74
+ #
75
+ # ~~~ puppet
76
+ # # Reduce the array $data, returning the sum of all values in the array and starting
77
+ # # with $memo set to an arbitrary value instead of $data's first value.
78
+ # $data = [1, 2, 3]
79
+ # $sum = $data.reduce(4) |$memo, $value| { $memo + $value }
80
+ # # At the start of the lambda's first iteration, $memo contains 4 and $value contains 1.
81
+ # # After all iterations, $sum contains 10.
82
+ #
83
+ # # Reduce the hash $data, returning the sum of all values and concatenated string of
84
+ # # all keys, and starting with $memo set to an arbitrary array instead of $data's first
85
+ # # key-value pair.
86
+ # $data = {a => 1, b => 2, c => 3}
87
+ # $combine = $data.reduce( [d, 4] ) |$memo, $value| {
88
+ # $string = "${memo[0]}${value[0]}"
89
+ # $number = $memo[1] + $value[1]
90
+ # [$string, $number]
91
+ # }
92
+ # # At the start of the lambda's first iteration, $memo contains [d, 4] and $value
93
+ # # contains [a, 1].
94
+ # # $combine contains [dabc, 10]
95
+ # ~~~
59
96
  #
60
97
  # @since 4.0.0
61
98
  #
@@ -0,0 +1,36 @@
1
+ require 'puppet/util/package'
2
+
3
+ # Compares two version numbers.
4
+ #
5
+ # Prototype:
6
+ #
7
+ # \$result = versioncmp(a, b)
8
+ #
9
+ # Where a and b are arbitrary version strings.
10
+ #
11
+ # This function returns:
12
+ #
13
+ # * `1` if version a is greater than version b
14
+ # * `0` if the versions are equal
15
+ # * `-1` if version a is less than version b
16
+ #
17
+ # @example
18
+ #
19
+ # if versioncmp('2.6-1', '2.4.5') > 0 {
20
+ # notice('2.6-1 is > than 2.4.5')
21
+ # }
22
+ #
23
+ # This function uses the same version comparison algorithm used by Puppet's
24
+ # `package` type.
25
+ #
26
+ Puppet::Functions.create_function(:versioncmp) do
27
+
28
+ dispatch :versioncmp do
29
+ param 'String', :a
30
+ param 'String', :b
31
+ end
32
+
33
+ def versioncmp(a, b)
34
+ Puppet::Util::Package.versioncmp(a, b)
35
+ end
36
+ end
@@ -1,12 +1,20 @@
1
- # Call a lambda with the given arguments. Since the parameters of the lambda
2
- # are local to the lambda's scope, this can be used to create private sections
3
- # of logic in a class so that the variables are not visible outside of the
4
- # class.
1
+ # Call a [lambda](https://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html)
2
+ # with the given arguments and return the result. Since a lambda's scope is
3
+ # [local](https://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html#lambda-scope)
4
+ # to the lambda, you can use the `with` function to create private blocks of code within a
5
+ # class using variables whose values cannot be accessed outside of the lambda.
5
6
  #
6
- # @example Using with
7
+ # @example Using `with`
7
8
  #
8
- # # notices the array [1, 2, 'foo']
9
- # with(1, 2, 'foo') |$x, $y, $z| { notice [$x, $y, $z] }
9
+ # ~~~ puppet
10
+ # # Concatenate three strings into a single string formatted as a list.
11
+ # $fruit = with("apples", "oranges", "bananas") |$x, $y, $z| {
12
+ # "${x}, ${y}, and ${z}"
13
+ # }
14
+ # $check_var = $x
15
+ # # $fruit contains "apples, oranges, and bananas"
16
+ # # $check_var is undefined, as the value of $x is local to the lambda.
17
+ # ~~~
10
18
  #
11
19
  # @since 4.0.0
12
20
  #
@@ -349,12 +349,10 @@ module Puppet::Functions
349
349
  def block_param(*type_and_name)
350
350
  case type_and_name.size
351
351
  when 0
352
- # the type must be an independent instance since it will be contained in another type
353
- type = @all_callables.copy
352
+ type = @all_callables
354
353
  name = :block
355
354
  when 1
356
- # the type must be an independent instance since it will be contained in another type
357
- type = @all_callables.copy
355
+ type = @all_callables
358
356
  name = type_and_name[0]
359
357
  when 2
360
358
  type_string, name = type_and_name
@@ -47,7 +47,7 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
47
47
  node = node_from_request(request)
48
48
  node.trusted_data = Puppet.lookup(:trusted_information) { Puppet::Context::TrustedInformation.local(node) }.to_h
49
49
 
50
- if catalog = compile(node)
50
+ if catalog = compile(node, request.options[:code_id])
51
51
  return catalog
52
52
  else
53
53
  # This shouldn't actually happen; we should either return
@@ -82,7 +82,7 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
82
82
  end
83
83
 
84
84
  # Compile the actual catalog.
85
- def compile(node)
85
+ def compile(node, code_id)
86
86
  str = "Compiled catalog for #{node.name}"
87
87
  str += " in environment #{node.environment}" if node.environment
88
88
  config = nil
@@ -90,7 +90,7 @@ class Puppet::Resource::Catalog::Compiler < Puppet::Indirector::Code
90
90
  benchmark(:notice, str) do
91
91
  Puppet::Util::Profiler.profile(str, [:compiler, :compile, node.environment, node.name]) do
92
92
  begin
93
- config = Puppet::Parser::Compiler.compile(node)
93
+ config = Puppet::Parser::Compiler.compile(node, code_id)
94
94
  rescue Puppet::Error => detail
95
95
  Puppet.err(detail.to_s) if networked?
96
96
  raise