puppet 5.4.0-x86-mingw32 → 5.5.0-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (441) hide show
  1. data/Gemfile +3 -3
  2. data/MAINTAINERS +0 -19
  3. data/README.md +5 -5
  4. data/Rakefile +26 -0
  5. data/conf/auth.conf +5 -0
  6. data/ext/project_data.yaml +1 -0
  7. data/ext/regexp_nodes/regexp_nodes.rb +3 -4
  8. data/lib/puppet/application/apply.rb +1 -1
  9. data/lib/puppet/application/cert.rb +3 -1
  10. data/lib/puppet/application/device.rb +100 -13
  11. data/lib/puppet/application/facts.rb +5 -0
  12. data/lib/puppet/application/lookup.rb +12 -2
  13. data/lib/puppet/configurer.rb +37 -17
  14. data/lib/puppet/confine.rb +4 -1
  15. data/lib/puppet/datatypes.rb +1 -1
  16. data/lib/puppet/environments.rb +1 -1
  17. data/lib/puppet/error.rb +6 -3
  18. data/lib/puppet/external/dot.rb +0 -7
  19. data/lib/puppet/external/nagios/parser.rb +1 -1
  20. data/lib/puppet/face/config.rb +92 -10
  21. data/lib/puppet/face/epp.rb +31 -6
  22. data/lib/puppet/face/facts.rb +49 -0
  23. data/lib/puppet/face/help.rb +33 -35
  24. data/lib/puppet/face/help/action.erb +1 -1
  25. data/lib/puppet/face/help/face.erb +1 -1
  26. data/lib/puppet/face/man.rb +55 -12
  27. data/lib/puppet/face/parser.rb +30 -3
  28. data/lib/puppet/file_bucket/file.rb +0 -2
  29. data/lib/puppet/file_serving/base.rb +10 -10
  30. data/lib/puppet/forge.rb +3 -3
  31. data/lib/puppet/forge/errors.rb +3 -3
  32. data/lib/puppet/functions.rb +1 -3
  33. data/lib/puppet/functions/alert.rb +1 -1
  34. data/lib/puppet/functions/all.rb +6 -6
  35. data/lib/puppet/functions/annotate.rb +10 -10
  36. data/lib/puppet/functions/any.rb +6 -6
  37. data/lib/puppet/functions/assert_type.rb +4 -4
  38. data/lib/puppet/functions/binary_file.rb +14 -2
  39. data/lib/puppet/functions/break.rb +31 -2
  40. data/lib/puppet/functions/call.rb +4 -4
  41. data/lib/puppet/functions/contain.rb +19 -3
  42. data/lib/puppet/functions/convert_to.rb +6 -5
  43. data/lib/puppet/functions/crit.rb +1 -1
  44. data/lib/puppet/functions/debug.rb +1 -1
  45. data/lib/puppet/functions/defined.rb +11 -9
  46. data/lib/puppet/functions/dig.rb +26 -2
  47. data/lib/puppet/functions/each.rb +8 -8
  48. data/lib/puppet/functions/emerg.rb +1 -1
  49. data/lib/puppet/functions/empty.rb +79 -0
  50. data/lib/puppet/functions/err.rb +1 -1
  51. data/lib/puppet/functions/eyaml_lookup_key.rb +3 -1
  52. data/lib/puppet/functions/filter.rb +7 -7
  53. data/lib/puppet/functions/find_file.rb +15 -1
  54. data/lib/puppet/functions/flatten.rb +64 -0
  55. data/lib/puppet/functions/hiera.rb +6 -6
  56. data/lib/puppet/functions/hiera_array.rb +6 -6
  57. data/lib/puppet/functions/hiera_hash.rb +6 -6
  58. data/lib/puppet/functions/hiera_include.rb +8 -8
  59. data/lib/puppet/functions/include.rb +28 -2
  60. data/lib/puppet/functions/info.rb +1 -1
  61. data/lib/puppet/functions/inline_epp.rb +2 -2
  62. data/lib/puppet/functions/join.rb +56 -0
  63. data/lib/puppet/functions/json_data.rb +2 -2
  64. data/lib/puppet/functions/keys.rb +25 -0
  65. data/lib/puppet/functions/length.rb +44 -0
  66. data/lib/puppet/functions/lest.rb +39 -1
  67. data/lib/puppet/functions/lookup.rb +2 -1
  68. data/lib/puppet/functions/map.rb +10 -9
  69. data/lib/puppet/functions/match.rb +6 -6
  70. data/lib/puppet/functions/new.rb +995 -2
  71. data/lib/puppet/functions/next.rb +1 -1
  72. data/lib/puppet/functions/notice.rb +1 -1
  73. data/lib/puppet/functions/reduce.rb +6 -6
  74. data/lib/puppet/functions/regsubst.rb +9 -3
  75. data/lib/puppet/functions/require.rb +36 -2
  76. data/lib/puppet/functions/return.rb +1 -1
  77. data/lib/puppet/functions/reverse_each.rb +71 -2
  78. data/lib/puppet/functions/slice.rb +23 -9
  79. data/lib/puppet/functions/split.rb +12 -10
  80. data/lib/puppet/functions/step.rb +73 -1
  81. data/lib/puppet/functions/strftime.rb +176 -2
  82. data/lib/puppet/functions/then.rb +65 -2
  83. data/lib/puppet/functions/tree_each.rb +19 -19
  84. data/lib/puppet/functions/type.rb +42 -1
  85. data/lib/puppet/functions/unique.rb +13 -13
  86. data/lib/puppet/functions/unwrap.rb +8 -4
  87. data/lib/puppet/functions/values.rb +25 -0
  88. data/lib/puppet/functions/versioncmp.rb +1 -1
  89. data/lib/puppet/functions/warning.rb +1 -1
  90. data/lib/puppet/functions/with.rb +6 -4
  91. data/lib/puppet/functions/yaml_data.rb +3 -1
  92. data/lib/puppet/indirector/certificate_status/file.rb +1 -1
  93. data/lib/puppet/indirector/facts/facter.rb +1 -3
  94. data/lib/puppet/indirector/facts/rest.rb +21 -0
  95. data/lib/puppet/indirector/facts/yaml.rb +0 -4
  96. data/lib/puppet/indirector/rest.rb +2 -2
  97. data/lib/puppet/module.rb +3 -3
  98. data/lib/puppet/module/task.rb +2 -3
  99. data/lib/puppet/module_tool/applications/application.rb +4 -4
  100. data/lib/puppet/module_tool/applications/builder.rb +2 -2
  101. data/lib/puppet/module_tool/applications/checksummer.rb +3 -3
  102. data/lib/puppet/module_tool/applications/unpacker.rb +2 -2
  103. data/lib/puppet/module_tool/metadata.rb +3 -3
  104. data/lib/puppet/network/authconfig.rb +1 -1
  105. data/lib/puppet/network/format_support.rb +1 -1
  106. data/lib/puppet/network/formats.rb +5 -7
  107. data/lib/puppet/network/http/api/indirected_routes.rb +1 -0
  108. data/lib/puppet/network/http/api/master/v3/environment.rb +2 -2
  109. data/lib/puppet/network/http/api/master/v3/environments.rb +2 -2
  110. data/lib/puppet/network/http/error.rb +3 -3
  111. data/lib/puppet/network/resolver.rb +1 -2
  112. data/lib/puppet/parser/compiler.rb +12 -5
  113. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +1 -1
  114. data/lib/puppet/parser/functions/fqdn_rand.rb +15 -4
  115. data/lib/puppet/parser/functions/new.rb +31 -46
  116. data/lib/puppet/parser/parser_factory.rb +1 -1
  117. data/lib/puppet/parser/resource.rb +1 -1
  118. data/lib/puppet/parser/type_loader.rb +11 -11
  119. data/lib/puppet/pops/evaluator/closure.rb +1 -1
  120. data/lib/puppet/pops/evaluator/collector_transformer.rb +1 -1
  121. data/lib/puppet/pops/evaluator/epp_evaluator.rb +2 -2
  122. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +2 -2
  123. data/lib/puppet/pops/evaluator/runtime3_support.rb +5 -2
  124. data/lib/puppet/pops/functions/dispatch.rb +1 -1
  125. data/lib/puppet/pops/issue_reporter.rb +18 -1
  126. data/lib/puppet/pops/issues.rb +6 -3
  127. data/lib/puppet/pops/loader/ruby_data_type_instantiator.rb +1 -2
  128. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +1 -2
  129. data/lib/puppet/pops/loader/task_instantiator.rb +5 -5
  130. data/lib/puppet/pops/loader/type_definition_instantiator.rb +4 -1
  131. data/lib/puppet/pops/loaders.rb +18 -7
  132. data/lib/puppet/pops/lookup/global_data_provider.rb +1 -1
  133. data/lib/puppet/pops/lookup/lookup_adapter.rb +55 -6
  134. data/lib/puppet/pops/model/factory.rb +6 -3
  135. data/lib/puppet/pops/model/model_tree_dumper.rb +4 -0
  136. data/lib/puppet/pops/model/pn_transformer.rb +400 -0
  137. data/lib/puppet/pops/parser/egrammar.ra +1 -1
  138. data/lib/puppet/pops/parser/eparser.rb +1 -1
  139. data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
  140. data/lib/puppet/pops/parser/lexer_support.rb +3 -2
  141. data/lib/puppet/pops/parser/locator.rb +0 -2
  142. data/lib/puppet/pops/parser/pn_parser.rb +316 -0
  143. data/lib/puppet/pops/pcore.rb +17 -17
  144. data/lib/puppet/pops/pn.rb +236 -0
  145. data/lib/puppet/pops/serialization/json.rb +7 -7
  146. data/lib/puppet/pops/types/class_loader.rb +6 -3
  147. data/lib/puppet/pops/types/implementation_registry.rb +28 -35
  148. data/lib/puppet/pops/types/p_object_type.rb +3 -3
  149. data/lib/puppet/pops/types/p_timespan_type.rb +2 -2
  150. data/lib/puppet/pops/types/p_type_set_type.rb +24 -1
  151. data/lib/puppet/pops/types/ruby_generator.rb +3 -4
  152. data/lib/puppet/pops/types/type_calculator.rb +1 -1
  153. data/lib/puppet/pops/types/type_factory.rb +0 -4
  154. data/lib/puppet/pops/types/type_mismatch_describer.rb +1 -1
  155. data/lib/puppet/pops/types/type_parser.rb +14 -7
  156. data/lib/puppet/pops/types/types.rb +1 -1
  157. data/lib/puppet/pops/utils.rb +2 -2
  158. data/lib/puppet/pops/validation/checker4_0.rb +6 -2
  159. data/lib/puppet/provider/group/groupadd.rb +3 -1
  160. data/lib/puppet/provider/group/windows_adsi.rb +4 -7
  161. data/lib/puppet/provider/nameservice.rb +3 -3
  162. data/lib/puppet/provider/package/pacman.rb +4 -4
  163. data/lib/puppet/provider/package/pip.rb +3 -3
  164. data/lib/puppet/provider/package/pkgdmg.rb +3 -3
  165. data/lib/puppet/provider/package/pkgutil.rb +2 -2
  166. data/lib/puppet/provider/package/portage.rb +9 -9
  167. data/lib/puppet/provider/package/zypper.rb +2 -2
  168. data/lib/puppet/provider/service/base.rb +1 -1
  169. data/lib/puppet/provider/service/smf.rb +3 -2
  170. data/lib/puppet/provider/service/systemd.rb +1 -1
  171. data/lib/puppet/provider/user/useradd.rb +6 -2
  172. data/lib/puppet/provider/user/windows_adsi.rb +1 -1
  173. data/lib/puppet/provider/yumrepo/inifile.rb +20 -9
  174. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  175. data/lib/puppet/reference/configuration.rb +2 -0
  176. data/lib/puppet/reference/type.rb +11 -11
  177. data/lib/puppet/resource.rb +1 -1
  178. data/lib/puppet/resource/capability_finder.rb +5 -5
  179. data/lib/puppet/resource/catalog.rb +6 -3
  180. data/lib/puppet/resource/status.rb +9 -2
  181. data/lib/puppet/resource/type.rb +1 -1
  182. data/lib/puppet/settings.rb +31 -19
  183. data/lib/puppet/settings/base_setting.rb +5 -0
  184. data/lib/puppet/settings/config_file.rb +1 -1
  185. data/lib/puppet/settings/ttl_setting.rb +5 -0
  186. data/lib/puppet/ssl/certificate_factory.rb +2 -2
  187. data/lib/puppet/ssl/certificate_request.rb +0 -2
  188. data/lib/puppet/syntax_checkers/json.rb +1 -1
  189. data/lib/puppet/transaction/additional_resource_generator.rb +2 -2
  190. data/lib/puppet/transaction/event.rb +1 -1
  191. data/lib/puppet/transaction/report.rb +18 -12
  192. data/lib/puppet/type.rb +9 -13
  193. data/lib/puppet/type/augeas.rb +2 -2
  194. data/lib/puppet/type/cron.rb +11 -6
  195. data/lib/puppet/type/exec.rb +1 -1
  196. data/lib/puppet/type/file.rb +4 -5
  197. data/lib/puppet/type/host.rb +1 -1
  198. data/lib/puppet/type/k5login.rb +30 -54
  199. data/lib/puppet/type/package.rb +3 -3
  200. data/lib/puppet/type/schedule.rb +12 -12
  201. data/lib/puppet/type/scheduled_task.rb +2 -2
  202. data/lib/puppet/type/ssh_authorized_key.rb +5 -5
  203. data/lib/puppet/type/sshkey.rb +2 -2
  204. data/lib/puppet/type/tidy.rb +1 -1
  205. data/lib/puppet/type/user.rb +1 -1
  206. data/lib/puppet/type/yumrepo.rb +26 -5
  207. data/lib/puppet/util.rb +0 -4
  208. data/lib/puppet/util/backups.rb +1 -1
  209. data/lib/puppet/util/inifile.rb +3 -4
  210. data/lib/puppet/util/json.rb +68 -0
  211. data/lib/puppet/util/json_lockfile.rb +3 -3
  212. data/lib/puppet/util/log.rb +2 -5
  213. data/lib/puppet/util/log/destinations.rb +2 -2
  214. data/lib/puppet/util/network_device/cisco/facts.rb +1 -1
  215. data/lib/puppet/util/plist.rb +1 -1
  216. data/lib/puppet/util/reference.rb +1 -8
  217. data/lib/puppet/util/tagging.rb +1 -1
  218. data/lib/puppet/util/warnings.rb +0 -2
  219. data/lib/puppet/util/windows/adsi.rb +15 -18
  220. data/lib/puppet/util/windows/com.rb +2 -1
  221. data/lib/puppet/util/windows/file.rb +2 -2
  222. data/lib/puppet/util/windows/principal.rb +7 -6
  223. data/lib/puppet/util/windows/sid.rb +60 -7
  224. data/lib/puppet/util/windows/taskscheduler.rb +0 -9
  225. data/lib/puppet/version.rb +1 -1
  226. data/lib/puppet_pal.rb +53 -48
  227. data/locales/ja/puppet.po +1357 -912
  228. data/locales/puppet.pot +549 -466
  229. data/man/man5/puppet.conf.5 +103 -20
  230. data/man/man8/puppet-agent.8 +6 -2
  231. data/man/man8/puppet-apply.8 +2 -2
  232. data/man/man8/puppet-ca.8 +1 -1
  233. data/man/man8/puppet-catalog.8 +1 -1
  234. data/man/man8/puppet-cert.8 +1 -1
  235. data/man/man8/puppet-certificate.8 +1 -1
  236. data/man/man8/puppet-certificate_request.8 +1 -1
  237. data/man/man8/puppet-certificate_revocation_list.8 +1 -1
  238. data/man/man8/puppet-config.8 +35 -1
  239. data/man/man8/puppet-describe.8 +1 -1
  240. data/man/man8/puppet-device.8 +33 -11
  241. data/man/man8/puppet-doc.8 +1 -1
  242. data/man/man8/puppet-epp.8 +34 -12
  243. data/man/man8/puppet-facts.8 +50 -1
  244. data/man/man8/puppet-filebucket.8 +38 -11
  245. data/man/man8/puppet-generate.8 +1 -1
  246. data/man/man8/puppet-help.8 +1 -1
  247. data/man/man8/puppet-key.8 +1 -1
  248. data/man/man8/puppet-lookup.8 +1 -1
  249. data/man/man8/puppet-man.8 +10 -4
  250. data/man/man8/puppet-master.8 +1 -1
  251. data/man/man8/puppet-module.8 +15 -6
  252. data/man/man8/puppet-node.8 +1 -1
  253. data/man/man8/puppet-parser.8 +31 -8
  254. data/man/man8/puppet-plugin.8 +1 -1
  255. data/man/man8/puppet-report.8 +1 -1
  256. data/man/man8/puppet-resource.8 +1 -1
  257. data/man/man8/puppet-script.8 +67 -0
  258. data/man/man8/puppet-status.8 +1 -1
  259. data/man/man8/puppet.8 +3 -3
  260. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome2/lib/puppet_x/awesome2/echo_scheme_handler.rb +1 -1
  261. data/spec/integration/application/apply_spec.rb +15 -15
  262. data/spec/integration/application/lookup_spec.rb +21 -0
  263. data/spec/integration/faces/config_spec.rb +16 -4
  264. data/spec/integration/network/http/api/indirected_routes_spec.rb +5 -5
  265. data/spec/integration/parser/catalog_spec.rb +1 -1
  266. data/spec/integration/parser/collection_spec.rb +2 -2
  267. data/spec/integration/parser/compiler_spec.rb +17 -18
  268. data/spec/integration/parser/pcore_resource_spec.rb +2 -2
  269. data/spec/integration/parser/scope_spec.rb +2 -2
  270. data/spec/integration/ssl/certificate_authority_spec.rb +7 -7
  271. data/spec/integration/ssl/certificate_revocation_list_spec.rb +1 -1
  272. data/spec/integration/ssl/key_spec.rb +1 -1
  273. data/spec/integration/transaction/report_spec.rb +3 -3
  274. data/spec/integration/transaction_spec.rb +0 -1
  275. data/spec/integration/type/file_spec.rb +10 -11
  276. data/spec/integration/type_spec.rb +1 -2
  277. data/spec/integration/util/windows/adsi_spec.rb +86 -1
  278. data/spec/integration/util/windows/principal_spec.rb +11 -2
  279. data/spec/integration/util/windows/security_spec.rb +2 -2
  280. data/spec/lib/matchers/json.rb +4 -4
  281. data/spec/lib/puppet_spec/language.rb +34 -35
  282. data/spec/lib/puppet_spec/module_tool/shared_functions.rb +2 -2
  283. data/spec/shared_behaviours/file_server_terminus.rb +0 -2
  284. data/spec/shared_behaviours/things_that_declare_options.rb +2 -2
  285. data/spec/spec_helper.rb +1 -1
  286. data/spec/unit/application/cert_spec.rb +21 -9
  287. data/spec/unit/application/device_spec.rb +96 -2
  288. data/spec/unit/application/face_base_spec.rb +2 -2
  289. data/spec/unit/application/lookup_spec.rb +0 -1
  290. data/spec/unit/configurer_spec.rb +14 -0
  291. data/spec/unit/confine_spec.rb +16 -0
  292. data/spec/unit/data_providers/hiera_data_provider_spec.rb +4 -4
  293. data/spec/unit/datatypes_spec.rb +49 -0
  294. data/spec/unit/environments_spec.rb +7 -0
  295. data/spec/unit/face/config_spec.rb +116 -12
  296. data/spec/unit/face/epp_face_spec.rb +53 -2
  297. data/spec/unit/face/facts_spec.rb +53 -0
  298. data/spec/unit/face/help_spec.rb +62 -69
  299. data/spec/unit/face/man_spec.rb +26 -0
  300. data/spec/unit/face/module/list_spec.rb +0 -1
  301. data/spec/unit/face/parser_spec.rb +78 -0
  302. data/spec/unit/file_bucket/dipper_spec.rb +0 -4
  303. data/spec/unit/file_serving/content_spec.rb +0 -1
  304. data/spec/unit/file_serving/fileset_spec.rb +0 -1
  305. data/spec/unit/file_serving/metadata_spec.rb +0 -1
  306. data/spec/unit/file_serving/terminus_selector_spec.rb +0 -2
  307. data/spec/unit/forge_spec.rb +1 -2
  308. data/spec/unit/functions/assert_type_spec.rb +1 -1
  309. data/spec/unit/functions/empty_spec.rb +77 -0
  310. data/spec/unit/functions/epp_spec.rb +1 -1
  311. data/spec/unit/functions/flatten_spec.rb +31 -0
  312. data/spec/unit/functions/include_spec.rb +2 -2
  313. data/spec/unit/functions/inline_epp_spec.rb +1 -1
  314. data/spec/unit/functions/join_spec.rb +33 -0
  315. data/spec/unit/functions/keys_spec.rb +31 -0
  316. data/spec/unit/functions/length_spec.rb +50 -0
  317. data/spec/unit/functions/lookup_fixture_spec.rb +1 -1
  318. data/spec/unit/functions/lookup_spec.rb +52 -0
  319. data/spec/unit/functions/shared.rb +1 -1
  320. data/spec/unit/functions/values_spec.rb +30 -0
  321. data/spec/unit/functions/versioncmp_spec.rb +1 -1
  322. data/spec/unit/functions4_spec.rb +30 -32
  323. data/spec/unit/graph/title_hash_prioritizer_spec.rb +2 -1
  324. data/spec/unit/indirector/catalog/compiler_spec.rb +0 -15
  325. data/spec/unit/indirector/facts/rest_spec.rb +45 -0
  326. data/spec/unit/indirector/facts/yaml_spec.rb +6 -0
  327. data/spec/unit/indirector/file_bucket_file/file_spec.rb +2 -2
  328. data/spec/unit/indirector/indirection_spec.rb +1 -1
  329. data/spec/unit/indirector/node/ldap_spec.rb +2 -2
  330. data/spec/unit/indirector/request_spec.rb +0 -2
  331. data/spec/unit/indirector/rest_spec.rb +2 -2
  332. data/spec/unit/indirector_spec.rb +0 -1
  333. data/spec/unit/info_service_spec.rb +1 -1
  334. data/spec/unit/interface/action_manager_spec.rb +1 -1
  335. data/spec/unit/interface/action_spec.rb +1 -1
  336. data/spec/unit/module_spec.rb +0 -5
  337. data/spec/unit/module_tool/applications/builder_spec.rb +1 -1
  338. data/spec/unit/module_tool/applications/unpacker_spec.rb +4 -4
  339. data/spec/unit/network/formats_spec.rb +5 -13
  340. data/spec/unit/network/http/api/indirected_routes_spec.rb +6 -2
  341. data/spec/unit/network/http/connection_spec.rb +1 -1
  342. data/spec/unit/network/http/handler_spec.rb +3 -2
  343. data/spec/unit/node/environment_spec.rb +1 -1
  344. data/spec/unit/node_spec.rb +3 -3
  345. data/spec/unit/parser/compiler_spec.rb +9 -2
  346. data/spec/unit/parser/environment_compiler_spec.rb +8 -8
  347. data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
  348. data/spec/unit/parser/functions/fail_spec.rb +1 -1
  349. data/spec/unit/parser/functions/fqdn_rand_spec.rb +24 -0
  350. data/spec/unit/parser/functions/realize_spec.rb +1 -1
  351. data/spec/unit/parser/resource_spec.rb +0 -1
  352. data/spec/unit/parser/scope_spec.rb +3 -3
  353. data/spec/unit/parser/type_loader_spec.rb +1 -1
  354. data/spec/unit/pops/adaptable_spec.rb +0 -1
  355. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +0 -3
  356. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +0 -4
  357. data/spec/unit/pops/factory_rspec_helper.rb +1 -1
  358. data/spec/unit/pops/factory_spec.rb +5 -5
  359. data/spec/unit/pops/issues_spec.rb +23 -8
  360. data/spec/unit/pops/loaders/loaders_spec.rb +24 -2
  361. data/spec/unit/pops/loaders/static_loader_spec.rb +1 -1
  362. data/spec/unit/pops/lookup/interpolation_spec.rb +5 -0
  363. data/spec/unit/pops/lookup/lookup_spec.rb +56 -0
  364. data/spec/unit/pops/model/pn_transformer_spec.rb +53 -0
  365. data/spec/unit/pops/parser/lexer2_spec.rb +14 -5
  366. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +9 -9
  367. data/spec/unit/pops/parser/parse_calls_spec.rb +1 -1
  368. data/spec/unit/pops/parser/parse_functions_spec.rb +1 -1
  369. data/spec/unit/pops/parser/parse_heredoc_spec.rb +3 -3
  370. data/spec/unit/pops/parser/parse_lambda_spec.rb +1 -1
  371. data/spec/unit/pops/parser/parse_resource_spec.rb +35 -35
  372. data/spec/unit/pops/parser/pn_parser_spec.rb +101 -0
  373. data/spec/unit/pops/pn_spec.rb +148 -0
  374. data/spec/unit/pops/types/iterable_spec.rb +1 -1
  375. data/spec/unit/pops/types/p_object_type_spec.rb +5 -5
  376. data/spec/unit/pops/types/p_timespan_type_spec.rb +11 -4
  377. data/spec/unit/pops/types/p_timestamp_type_spec.rb +9 -2
  378. data/spec/unit/pops/types/p_type_set_type_spec.rb +106 -2
  379. data/spec/unit/pops/types/ruby_generator_spec.rb +3 -8
  380. data/spec/unit/pops/types/string_converter_spec.rb +3 -3
  381. data/spec/unit/pops/types/type_calculator_spec.rb +1 -1
  382. data/spec/unit/pops/validator/validator_spec.rb +3 -1
  383. data/spec/unit/property_spec.rb +2 -2
  384. data/spec/unit/provider/aixobject_spec.rb +1 -1
  385. data/spec/unit/provider/cron/crontab_spec.rb +3 -3
  386. data/spec/unit/provider/exec/posix_spec.rb +6 -6
  387. data/spec/unit/provider/group/groupadd_spec.rb +4 -4
  388. data/spec/unit/provider/group/windows_adsi_spec.rb +79 -22
  389. data/spec/unit/provider/ldap_spec.rb +0 -1
  390. data/spec/unit/provider/nameservice_spec.rb +5 -5
  391. data/spec/unit/provider/package/rpm_spec.rb +3 -4
  392. data/spec/unit/provider/package/yum_spec.rb +6 -2
  393. data/spec/unit/provider/parsedfile_spec.rb +1 -1
  394. data/spec/unit/provider/service/base_spec.rb +2 -4
  395. data/spec/unit/provider/service/init_spec.rb +2 -2
  396. data/spec/unit/provider/service/openrc_spec.rb +2 -2
  397. data/spec/unit/provider/service/redhat_spec.rb +2 -2
  398. data/spec/unit/provider/service/smf_spec.rb +2 -0
  399. data/spec/unit/provider/service/systemd_spec.rb +3 -3
  400. data/spec/unit/provider/service/upstart_spec.rb +7 -7
  401. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +0 -4
  402. data/spec/unit/provider/sshkey/parsed_spec.rb +0 -2
  403. data/spec/unit/provider/user/useradd_spec.rb +15 -9
  404. data/spec/unit/provider/user/windows_adsi_spec.rb +4 -4
  405. data/spec/unit/provider/yumrepo/inifile_spec.rb +76 -0
  406. data/spec/unit/puppet_pal_2pec.rb +4 -5
  407. data/spec/unit/resource/catalog_spec.rb +8 -3
  408. data/spec/unit/resource/status_spec.rb +15 -4
  409. data/spec/unit/resource/type_spec.rb +2 -3
  410. data/spec/unit/settings_spec.rb +9 -4
  411. data/spec/unit/ssl/certificate_authority_spec.rb +1 -9
  412. data/spec/unit/ssl/certificate_request_spec.rb +1 -2
  413. data/spec/unit/transaction/report_spec.rb +41 -0
  414. data/spec/unit/transaction_spec.rb +1 -1
  415. data/spec/unit/type/exec_spec.rb +7 -9
  416. data/spec/unit/type/file/selinux_spec.rb +0 -1
  417. data/spec/unit/type/file_spec.rb +4 -3
  418. data/spec/unit/type/k5login_spec.rb +79 -10
  419. data/spec/unit/type/mount_spec.rb +1 -1
  420. data/spec/unit/type/nagios_spec.rb +6 -6
  421. data/spec/unit/type/user_spec.rb +1 -1
  422. data/spec/unit/type/yumrepo_spec.rb +18 -0
  423. data/spec/unit/type/zfs_spec.rb +1 -1
  424. data/spec/unit/type_spec.rb +14 -15
  425. data/spec/unit/util/docs_spec.rb +1 -1
  426. data/spec/unit/util/execution_spec.rb +0 -1
  427. data/spec/unit/util/inifile_spec.rb +35 -4
  428. data/spec/unit/util/log/destinations_spec.rb +2 -2
  429. data/spec/unit/util/log_spec.rb +6 -5
  430. data/spec/unit/util/network_device/cisco/device_spec.rb +2 -2
  431. data/spec/unit/util/plist_spec.rb +3 -3
  432. data/spec/unit/util/selinux_spec.rb +2 -2
  433. data/spec/unit/util/tagging_spec.rb +1 -7
  434. data/spec/unit/util/windows/adsi_spec.rb +31 -27
  435. data/spec/unit/util/windows/sid_spec.rb +86 -15
  436. data/spec/unit/util_spec.rb +2 -2
  437. data/spec/watchr.rb +0 -1
  438. data/tasks/benchmark.rake +37 -0
  439. data/tasks/manpages.rake +1 -1
  440. metadata +83 -11
  441. checksums.yaml +0 -7
@@ -16,7 +16,7 @@ module Puppet::Parser
16
16
  # EvaluatingParser to the 3x way of parsing.
17
17
  #
18
18
  def self.evaluating_parser
19
- unless defined?(Puppet::Pops::Parser::E4ParserAdapter)
19
+ unless defined?(Puppet::Parser::E4ParserAdapter)
20
20
  require 'puppet/parser/e4_parser_adapter'
21
21
  require 'puppet/pops/parser/code_merger'
22
22
  end
@@ -332,7 +332,7 @@ class Puppet::Parser::Resource < Puppet::Resource
332
332
  def add_scope_tags
333
333
  scope_resource = scope.resource
334
334
  unless scope_resource.nil? || scope_resource.equal?(self)
335
- merge_tags(scope_resource)
335
+ merge_tags_from(scope_resource)
336
336
  end
337
337
  end
338
338
 
@@ -110,20 +110,20 @@ class Puppet::Parser::TypeLoader
110
110
  # There is currently one user in indirector/resourcetype/parser
111
111
  #
112
112
  if Puppet.lookup(:squelch_parse_errors) {|| false }
113
- begin
114
- loaded_asts << parse_file(file)
115
- rescue => e
116
- # Resume from errors so that all parseable files may
117
- # still be parsed. Mark this file as loaded so that
118
- # it would not be parsed next time (handle it as if
119
- # it was successfully parsed).
120
- Puppet.debug("Unable to parse '#{file}': #{e.message}")
121
- end
122
- else
113
+ begin
123
114
  loaded_asts << parse_file(file)
115
+ rescue => e
116
+ # Resume from errors so that all parseable files may
117
+ # still be parsed. Mark this file as loaded so that
118
+ # it would not be parsed next time (handle it as if
119
+ # it was successfully parsed).
120
+ Puppet.debug("Unable to parse '#{file}': #{e.message}")
124
121
  end
122
+ else
123
+ loaded_asts << parse_file(file)
124
+ end
125
125
 
126
- @loaded[file] = true
126
+ @loaded[file] = true
127
127
  end
128
128
 
129
129
  loaded_asts.collect do |ast|
@@ -80,7 +80,7 @@ class Closure < CallableSignature
80
80
 
81
81
  def call_by_name_with_scope(scope, args_hash, enforce_parameters)
82
82
  call_by_name_internal(scope, args_hash, enforce_parameters)
83
- end
83
+ end
84
84
 
85
85
  def call_by_name(args_hash, enforce_parameters)
86
86
  call_by_name_internal(enclosing_scope, args_hash, enforce_parameters)
@@ -124,7 +124,7 @@ protected
124
124
  end
125
125
  end
126
126
 
127
- def query_AccessExpression(o, scope)
127
+ def query_AccessExpression(o, scope)
128
128
  pops_object = @@evaluator.evaluate(o, scope)
129
129
 
130
130
  # Convert to Puppet 3 style objects since that is how they are represented
@@ -53,8 +53,6 @@ class Puppet::Pops::Evaluator::EppEvaluator
53
53
  evaluate(parser, 'epp', scope, true, result, template_args)
54
54
  end
55
55
 
56
- private
57
-
58
56
  def self.evaluate(parser, func_name, scope, use_global_scope_only, parse_result, template_args)
59
57
  template_args, template_args_set = handle_template_args(func_name, template_args)
60
58
 
@@ -104,6 +102,7 @@ class Puppet::Pops::Evaluator::EppEvaluator
104
102
  parser.closure(body, scope).call_by_name(template_args, enforce_parameters)
105
103
  end
106
104
  end
105
+ private_class_method :evaluate
107
106
 
108
107
  def self.handle_template_args(func_name, template_args)
109
108
  if template_args.nil?
@@ -117,4 +116,5 @@ class Puppet::Pops::Evaluator::EppEvaluator
117
116
  [template_args, true]
118
117
  end
119
118
  end
119
+ private_class_method :handle_template_args
120
120
  end
@@ -89,8 +89,6 @@ module Runtime3ResourceSupport
89
89
  scope.environment.known_resource_types.find_hostclass(class_name)
90
90
  end
91
91
 
92
- private
93
-
94
92
  def self.find_builtin_resource_type(scope, type_name)
95
93
  if type_name.include?(':')
96
94
  # Skip the search for built in types as they are always in global namespace
@@ -106,11 +104,13 @@ module Runtime3ResourceSupport
106
104
  # horrible - should be loaded by a "last loader" in 4.x loaders instead.
107
105
  Puppet::Type.type(type_name)
108
106
  end
107
+ private_class_method :find_builtin_resource_type
109
108
 
110
109
  def self.find_defined_resource_type(scope, type_name)
111
110
  krt = scope.environment.known_resource_types
112
111
  krt.find_definition(type_name) || krt.application(type_name)
113
112
  end
113
+ private_class_method :find_defined_resource_type
114
114
 
115
115
  end
116
116
  end
@@ -301,10 +301,13 @@ module Runtime3Support
301
301
  def call_function(name, args, o, scope, &block)
302
302
  file, line = extract_file_line(o)
303
303
  loader = Adapters::LoaderAdapter.loader_for_model_object(o, file)
304
- if loader && func = loader.load(:function, name)
304
+ # 'ruby -wc' thinks that _func is unused, because the only reference to it
305
+ # is inside of the Kernel.eval string below. By prefixing it with the
306
+ # underscore, we let Ruby know to not worry about whether it's unused or not.
307
+ if loader && _func = loader.load(:function, name)
305
308
  Puppet::Util::Profiler.profile(name, [:functions, name]) do
306
309
  # Add stack frame when calling. See Puppet::Pops::PuppetStack
307
- return Kernel.eval('func.call(scope, *args, &block)', Kernel.binding, file || '', line)
310
+ return Kernel.eval('_func.call(scope, *args, &block)'.freeze, Kernel.binding, file || '', line)
308
311
  end
309
312
  end
310
313
  # Call via 3x API if function exists there
@@ -1,5 +1,5 @@
1
1
  module Puppet::Pops
2
- module Functions
2
+ module Functions
3
3
  # Defines a connection between a implementation method and the signature that
4
4
  # the method will handle.
5
5
  #
@@ -86,6 +86,22 @@ class IssueReporter
86
86
  [prefix, message].join(' ')
87
87
  end
88
88
 
89
+ def self.warning(semantic, issue, args)
90
+ Puppet::Util::Log.create({
91
+ :level => :warning,
92
+ :message => issue.format(args),
93
+ :arguments => args,
94
+ :issue_code => issue.issue_code,
95
+ :file => semantic.file,
96
+ :line => semantic.line,
97
+ :pos => semantic.pos,
98
+ })
99
+ end
100
+
101
+ def self.error(exception_class, semantic, issue, args)
102
+ raise exception_class.new(issue.format(args), semantic.file, semantic.line, semantic.pos, nil, issue.issue_code, args)
103
+ end
104
+
89
105
  def self.create_exception(exception_class, emit_message, formatter, diagnostic)
90
106
  file = diagnostic.file
91
107
  file = (file.is_a?(String) && file.empty?) ? nil : file
@@ -94,7 +110,7 @@ class IssueReporter
94
110
  line = diagnostic.source_pos.line
95
111
  pos = diagnostic.source_pos.pos
96
112
  end
97
- exception_class.new(format_with_prefix(emit_message, formatter.format_message(diagnostic)), file, line, pos, nil, diagnostic.issue.issue_code)
113
+ exception_class.new(format_with_prefix(emit_message, formatter.format_message(diagnostic)), file, line, pos, nil, diagnostic.issue.issue_code, diagnostic.arguments)
98
114
  end
99
115
  private_class_method :create_exception
100
116
 
@@ -109,6 +125,7 @@ class IssueReporter
109
125
  Puppet::Util::Log.create({
110
126
  :level => severity,
111
127
  :message => formatter.format_message(diagnostic),
128
+ :arguments => diagnostic.arguments,
112
129
  :issue_code => diagnostic.issue.issue_code,
113
130
  :file => file,
114
131
  :line => line,
@@ -49,7 +49,6 @@ module Issues
49
49
  # Evaluate the message block in the msg data's binding
50
50
  msgdata.format(hash, &message_block)
51
51
  rescue StandardError => e
52
- MessageData
53
52
  raise RuntimeError, _("Error while reporting issue: %{code}. %{message}") % { code: issue_code, message: e.message }, caller
54
53
  end
55
54
  end
@@ -71,7 +70,7 @@ module Issues
71
70
 
72
71
  def format(hash, &block)
73
72
  @data = hash
74
- instance_eval &block
73
+ instance_eval(&block)
75
74
  end
76
75
 
77
76
  # Obtains the label provider given as a key `:label` in the hash passed to #format. The label provider is
@@ -119,7 +118,7 @@ module Issues
119
118
  # @see MessageData
120
119
  # @api public
121
120
  #
122
- def self.issue (issue_code, *args, &block)
121
+ def self.issue(issue_code, *args, &block)
123
122
  Issue.new(issue_code, *args, &block)
124
123
  end
125
124
 
@@ -741,6 +740,10 @@ module Issues
741
740
  _('Heredoc without any following lines of text')
742
741
  end
743
742
 
743
+ HEREDOC_EMPTY_ENDTAG = hard_issue :HEREDOC_EMPTY_ENDTAG do
744
+ _('Heredoc with an empty endtag')
745
+ end
746
+
744
747
  HEREDOC_MULTIPLE_AT_ESCAPES = hard_issue :HEREDOC_MULTIPLE_AT_ESCAPES, :escapes do
745
748
  _("An escape char for @() may only appear once. Got '%{escapes}'") % { escapes: escapes.join(', ') }
746
749
  end
@@ -29,12 +29,11 @@ class Puppet::Pops::Loader::RubyDataTypeInstantiator
29
29
  created
30
30
  end
31
31
 
32
- private
33
-
34
32
  # Produces a binding where the given loader is bound as a local variable (loader_injected_arg). This variable can be used in loaded
35
33
  # ruby code - e.g. to call Puppet::Function.create_loaded_function(:name, loader,...)
36
34
  #
37
35
  def self.get_binding(loader_injected_arg)
38
36
  binding
39
37
  end
38
+ private_class_method :get_binding
40
39
  end
@@ -35,12 +35,11 @@ class Puppet::Pops::Loader::RubyFunctionInstantiator
35
35
  created.new(nil, loader_for_function)
36
36
  end
37
37
 
38
- private
39
-
40
38
  # Produces a binding where the given loader is bound as a local variable (loader_injected_arg). This variable can be used in loaded
41
39
  # ruby code - e.g. to call Puppet::Function.create_loaded_function(:name, loader,...)
42
40
  #
43
41
  def self.get_binding(loader_injected_arg)
44
42
  binding
45
43
  end
44
+ private_class_method :get_binding
46
45
  end
@@ -27,12 +27,12 @@ class TaskInstantiator
27
27
 
28
28
  def self.create_task(loader, name, task_source, metadata)
29
29
  if metadata.nil?
30
- create_task_from_hash(loader, name, task_source, EMPTY_HASH)
30
+ create_task_from_hash(name, task_source, EMPTY_HASH)
31
31
  else
32
32
  json_text = loader.get_contents(metadata)
33
33
  begin
34
- create_task_from_hash(loader, name, task_source, JSON.parse(json_text) || EMPTY_HASH)
35
- rescue JSON::ParserError => ex
34
+ create_task_from_hash(name, task_source, Puppet::Util::Json.load(json_text) || EMPTY_HASH)
35
+ rescue Puppet::Util::Json::ParseError => ex
36
36
  raise Puppet::ParseError.new(ex.message, metadata)
37
37
  rescue Types::TypeAssertionError => ex
38
38
  # Not strictly a parser error but from the users perspective, the file content didn't parse properly. The
@@ -43,7 +43,7 @@ class TaskInstantiator
43
43
  end
44
44
  end
45
45
 
46
- def self.create_task_from_hash(loader, name, task_source, hash)
46
+ def self.create_task_from_hash(name, task_source, hash)
47
47
  arguments = {
48
48
  'name' => name,
49
49
  'executable' => task_source
@@ -54,7 +54,7 @@ class TaskInstantiator
54
54
  value.each_pair do |k, v|
55
55
  pd = v.dup
56
56
  t = v['type']
57
- pd['type'] = t.nil? ? Types::TypeFactory.data : Types::TypeParser.singleton.parse(t, loader)
57
+ pd['type'] = t.nil? ? Types::TypeFactory.data : Types::TypeParser.singleton.parse(t)
58
58
  ps[k] = pd
59
59
  end
60
60
  value = ps
@@ -73,7 +73,9 @@ class TypeDefinitionInstantiator
73
73
  case type_name
74
74
  when 'Object'
75
75
  # No need for an alias. The Object type itself will receive the name instead
76
- type_expr = type_expr.keys.empty? ? nil : type_expr.keys[0] unless type_expr.is_a?(Hash)
76
+ unless type_expr.is_a?(Model::LiteralHash)
77
+ type_expr = type_expr.keys.empty? ? nil : type_expr.keys[0] unless type_expr.is_a?(Hash)
78
+ end
77
79
  Types::PObjectType.new(name, type_expr)
78
80
  when 'TypeSet'
79
81
  # No need for an alias. The Object type itself will receive the name instead
@@ -86,6 +88,7 @@ class TypeDefinitionInstantiator
86
88
 
87
89
  # @api private
88
90
  def self.named_definition(te)
91
+ return 'Object' if te.is_a?(Model::LiteralHash)
89
92
  te.is_a?(Model::AccessExpression) && (left = te.left_expr).is_a?(Model::QualifiedReference) ? left.cased_value : nil
90
93
  end
91
94
 
@@ -15,7 +15,6 @@ class Loaders
15
15
  attr_reader :puppet_system_loader
16
16
  attr_reader :public_environment_loader
17
17
  attr_reader :private_environment_loader
18
- attr_reader :implementation_registry
19
18
  attr_reader :environment
20
19
 
21
20
  def self.new(environment, for_agent = false)
@@ -55,12 +54,9 @@ class Loaders
55
54
  create_environment_loader(environment)
56
55
  end
57
56
 
58
- # 3. The implementation registry maintains mappings between Puppet types and Runtime types for
59
- # the current environment
60
- @implementation_registry = Types::ImplementationRegistry.new(@private_environment_loader)
61
- Pcore.init(@puppet_system_loader, @implementation_registry, for_agent)
57
+ Pcore.init_env(@private_environment_loader)
62
58
 
63
- # 4. module loaders are set up from the create_environment_loader, they register themselves
59
+ # 3. module loaders are set up from the create_environment_loader, they register themselves
64
60
  end
65
61
 
66
62
  # Called after loader has been added to Puppet Context as :loaders so that dynamic types can
@@ -91,11 +87,21 @@ class Loaders
91
87
  loaders.find_loader(module_name)
92
88
  end
93
89
 
90
+ def self.static_implementation_registry
91
+ if !class_variable_defined?(:@@static_implementation_registry) || @@static_implementation_registry.nil?
92
+ ir = Types::ImplementationRegistry.new
93
+ Types::TypeParser.type_map.values.each { |t| ir.register_implementation(t.simple_name, t.class.name) }
94
+ @@static_implementation_registry = ir
95
+ end
96
+ @@static_implementation_registry
97
+ end
98
+
94
99
  def self.static_loader
95
100
  # The static loader can only be changed after a reboot
96
101
  if !class_variable_defined?(:@@static_loader) || @@static_loader.nil?
97
102
  @@static_loader = Loader::StaticLoader.new()
98
103
  @@static_loader.register_aliases
104
+ Pcore.init(@@static_loader, static_implementation_registry)
99
105
  end
100
106
  @@static_loader
101
107
  end
@@ -206,6 +212,11 @@ class Loaders
206
212
  end
207
213
  end
208
214
 
215
+ def implementation_registry
216
+ # Environment specific implementation registry
217
+ @implementation_registry ||= Types::ImplementationRegistry.new(self.class.static_implementation_registry)
218
+ end
219
+
209
220
  def static_loader
210
221
  self.class.static_loader
211
222
  end
@@ -337,7 +348,7 @@ class Loaders
337
348
  tf = Types::TypeParser.singleton
338
349
  lhs = tf.interpret(type_mapping.type_expr, loader)
339
350
  rhs = tf.interpret_any(type_mapping.mapping_expr, loader)
340
- implementation_registry.register_type_mapping(lhs, rhs, loader)
351
+ implementation_registry.register_type_mapping(lhs, rhs)
341
352
  nil
342
353
  end
343
354
 
@@ -1,3 +1,4 @@
1
+ require 'hiera/scope'
1
2
  require_relative 'configured_data_provider'
2
3
 
3
4
  module Puppet::Pops
@@ -11,7 +12,6 @@ class GlobalDataProvider < ConfiguredDataProvider
11
12
  def unchecked_key_lookup(key, lookup_invocation, merge)
12
13
  config = config(lookup_invocation)
13
14
  if(config.version == 3)
14
- require 'hiera/scope'
15
15
  # Hiera version 3 needs access to special scope variables
16
16
  scope = lookup_invocation.scope
17
17
  unless scope.is_a?(Hiera::Scope)
@@ -16,6 +16,8 @@ class LookupAdapter < DataAdapter
16
16
 
17
17
  HASH = 'hash'.freeze
18
18
  MERGE = 'merge'.freeze
19
+ CONVERT_TO = 'convert_to'.freeze
20
+ NEW = 'new'.freeze
19
21
 
20
22
  def self.create_adapter(compiler)
21
23
  new(compiler)
@@ -52,18 +54,65 @@ class LookupAdapter < DataAdapter
52
54
  catch(:no_such_key) { do_lookup(LookupKey::LOOKUP_OPTIONS, lookup_invocation, HASH) }
53
55
  nil
54
56
  else
57
+ lookup_options = lookup_lookup_options(key, lookup_invocation) || {}
58
+
55
59
  if merge.nil?
56
60
  # Used cached lookup_options
57
- merge = lookup_merge_options(key, lookup_invocation)
61
+ # merge = lookup_merge_options(key, lookup_invocation)
62
+ merge = lookup_options[MERGE]
58
63
  lookup_invocation.report_merge_source(LOOKUP_OPTIONS) unless merge.nil?
59
64
  end
60
- lookup_invocation.with(:data, key.to_s) do
61
- catch(:no_such_key) { return do_lookup(key, lookup_invocation, merge) }
62
- throw :no_such_key if lookup_invocation.global_only?
63
- key.dig(lookup_invocation, lookup_default_in_module(key, lookup_invocation))
64
- end
65
+ convert_result(key.to_s, lookup_options, lookup_invocation, lambda do
66
+ lookup_invocation.with(:data, key.to_s) do
67
+ catch(:no_such_key) { return do_lookup(key, lookup_invocation, merge) }
68
+ throw :no_such_key if lookup_invocation.global_only?
69
+ key.dig(lookup_invocation, lookup_default_in_module(key, lookup_invocation))
70
+ end
71
+ end)
72
+ end
73
+ end
74
+ end
75
+
76
+ # Performs a possible conversion of the result of calling `the_lookup` lambda
77
+ # The conversion takes place if there is a 'convert_to' key in the lookup_options
78
+ # If there is no conversion, the result of calling `the_lookup` is returned
79
+ # otherwise the successfully converted value.
80
+ # Errors are raised if the convert_to is faulty (bad type string, or if a call to
81
+ # new(T, <args>) fails.
82
+ #
83
+ # @param key [String] The key to lookup
84
+ # @param lookup_options [Hash] a hash of options
85
+ # @param lookup_invocation [Invocation] the lookup invocation
86
+ # @param the_lookup [Lambda] zero arg lambda that performs the lookup of a value
87
+ # @return [Object] the looked up value, or converted value if there was conversion
88
+ # @throw :no_such_key when the object is not found (if thrown by `the_lookup`)
89
+ #
90
+ def convert_result(key, lookup_options, lookup_invocation, the_lookup)
91
+ result = the_lookup.call
92
+ convert_to = lookup_options[CONVERT_TO]
93
+ return result if convert_to.nil?
94
+
95
+ convert_to = convert_to.is_a?(Array) ? convert_to : [convert_to]
96
+ if convert_to[0].is_a?(String)
97
+ begin
98
+ convert_to[0] = Puppet::Pops::Types::TypeParser.singleton.parse(convert_to[0])
99
+ rescue StandardError => e
100
+ raise Puppet::DataBinding::LookupError,
101
+ _("Invalid data type in lookup_options for key '%{key}' could not parse '%{source}', error: '%{msg}") %
102
+ { key: key, source: convert_to[0], msg: e.message}
65
103
  end
66
104
  end
105
+ begin
106
+ result = lookup_invocation.scope.call_function(NEW, [convert_to[0], result, *convert_to[1..-1]])
107
+ # TRANSLATORS 'lookup_options', 'convert_to' and args_string variable should not be translated,
108
+ args_string = Puppet::Pops::Types::StringConverter.singleton.convert(convert_to)
109
+ lookup_invocation.report_text { _("Applying convert_to lookup_option with arguments %{args}") % { args: args_string } }
110
+ rescue StandardError => e
111
+ raise Puppet::DataBinding::LookupError,
112
+ _("The convert_to lookup_option for key '%{key}' raised error: %{msg}") %
113
+ { key: key, msg: e.message}
114
+ end
115
+ result
67
116
  end
68
117
 
69
118
  def lookup_global(key, lookup_invocation, merge_strategy)