puppet 3.1.1 → 3.2.0.rc1

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 (477) hide show
  1. data/CONTRIBUTING.md +2 -2
  2. data/Gemfile +32 -19
  3. data/README_DEVELOPER.md +332 -14
  4. data/Rakefile +9 -5
  5. data/ext/build_defaults.yaml +2 -3
  6. data/ext/debian/changelog.erb +6 -0
  7. data/ext/debian/control +6 -6
  8. data/ext/envpuppet +4 -4
  9. data/ext/project_data.yaml +1 -0
  10. data/ext/puppet-nm-dispatcher +13 -0
  11. data/ext/redhat/puppet.spec.erb +17 -0
  12. data/ext/suse/client.init +1 -1
  13. data/ext/systemd/puppetagent.service +2 -2
  14. data/ext/systemd/puppetmaster.service +2 -2
  15. data/lib/hiera/scope.rb +29 -11
  16. data/lib/hiera_puppet.rb +1 -3
  17. data/lib/puppet/agent.rb +3 -3
  18. data/lib/puppet/application.rb +2 -2
  19. data/lib/puppet/application/agent.rb +27 -12
  20. data/lib/puppet/application/apply.rb +11 -1
  21. data/lib/puppet/application/describe.rb +1 -1
  22. data/lib/puppet/application/doc.rb +13 -9
  23. data/lib/puppet/application/filebucket.rb +0 -1
  24. data/lib/puppet/application/kick.rb +1 -0
  25. data/lib/puppet/application/master.rb +16 -8
  26. data/lib/puppet/daemon.rb +19 -64
  27. data/lib/puppet/defaults.rb +61 -5
  28. data/lib/puppet/error.rb +15 -4
  29. data/lib/puppet/external/nagios/grammar.ry +1 -1
  30. data/lib/puppet/external/nagios/makefile +1 -1
  31. data/lib/puppet/external/nagios/parser.rb +185 -618
  32. data/lib/puppet/external/pson/pure/parser.rb +47 -1
  33. data/lib/puppet/face/certificate.rb +3 -3
  34. data/lib/puppet/face/module.rb +1 -1
  35. data/lib/puppet/face/module/changes.rb +3 -1
  36. data/lib/puppet/face/module/uninstall.rb +1 -1
  37. data/lib/puppet/face/node/clean.rb +5 -5
  38. data/lib/puppet/feature/base.rb +3 -1
  39. data/lib/puppet/feature/libuser.rb +8 -0
  40. data/lib/puppet/file_serving/fileset.rb +9 -1
  41. data/lib/puppet/forge.rb +28 -5
  42. data/lib/puppet/forge/errors.rb +34 -0
  43. data/lib/puppet/forge/repository.rb +1 -1
  44. data/lib/puppet/indirector.rb +4 -1
  45. data/lib/puppet/indirector/catalog/compiler.rb +37 -30
  46. data/lib/puppet/indirector/facts/inventory_active_record.rb +1 -0
  47. data/lib/puppet/indirector/indirection.rb +28 -15
  48. data/lib/puppet/indirector/rest.rb +18 -10
  49. data/lib/puppet/interface.rb +11 -4
  50. data/lib/puppet/interface/action.rb +1 -3
  51. data/lib/puppet/interface/action_builder.rb +0 -3
  52. data/lib/puppet/interface/action_manager.rb +0 -3
  53. data/lib/puppet/interface/face_collection.rb +0 -2
  54. data/lib/puppet/interface/option.rb +0 -2
  55. data/lib/puppet/interface/option_builder.rb +0 -2
  56. data/lib/puppet/interface/option_manager.rb +0 -2
  57. data/lib/puppet/metatype/manager.rb +1 -1
  58. data/lib/puppet/module_tool.rb +1 -0
  59. data/lib/puppet/module_tool/applications/application.rb +0 -3
  60. data/lib/puppet/module_tool/applications/builder.rb +8 -20
  61. data/lib/puppet/module_tool/applications/checksummer.rb +1 -1
  62. data/lib/puppet/module_tool/applications/installer.rb +1 -0
  63. data/lib/puppet/module_tool/applications/unpacker.rb +3 -11
  64. data/lib/puppet/module_tool/checksums.rb +1 -1
  65. data/lib/puppet/module_tool/errors/installer.rb +18 -1
  66. data/lib/puppet/module_tool/modulefile.rb +2 -2
  67. data/lib/puppet/module_tool/skeleton/templates/generator/Modulefile.erb +1 -1
  68. data/lib/puppet/module_tool/tar.rb +17 -0
  69. data/lib/puppet/module_tool/tar/gnu.rb +9 -0
  70. data/lib/puppet/module_tool/tar/mini.rb +39 -0
  71. data/lib/puppet/module_tool/tar/solaris.rb +5 -0
  72. data/lib/puppet/network/http.rb +1 -0
  73. data/lib/puppet/network/http/connection.rb +9 -23
  74. data/lib/puppet/network/http/handler.rb +38 -7
  75. data/lib/puppet/network/http/rack/rest.rb +14 -3
  76. data/lib/puppet/network/http/webrick.rb +3 -1
  77. data/lib/puppet/network/http/webrick/rest.rb +11 -2
  78. data/lib/puppet/node/environment.rb +3 -1
  79. data/lib/puppet/parameter.rb +32 -29
  80. data/lib/puppet/parameter/package_options.rb +1 -1
  81. data/lib/puppet/parameter/path.rb +1 -1
  82. data/lib/puppet/parameter/value.rb +1 -1
  83. data/lib/puppet/parameter/value_collection.rb +7 -3
  84. data/lib/puppet/parser/ast.rb +3 -1
  85. data/lib/puppet/parser/ast/arithmetic_operator.rb +56 -12
  86. data/lib/puppet/parser/ast/astarray.rb +1 -1
  87. data/lib/puppet/parser/ast/block_expression.rb +41 -0
  88. data/lib/puppet/parser/ast/function.rb +13 -2
  89. data/lib/puppet/parser/ast/lambda.rb +107 -0
  90. data/lib/puppet/parser/ast/leaf.rb +1 -2
  91. data/lib/puppet/parser/ast/method_call.rb +77 -0
  92. data/lib/puppet/parser/ast/vardef.rb +7 -0
  93. data/lib/puppet/parser/compiler.rb +27 -16
  94. data/lib/puppet/parser/e_parser_adapter.rb +120 -0
  95. data/lib/puppet/parser/files.rb +7 -6
  96. data/lib/puppet/parser/functions.rb +10 -8
  97. data/lib/puppet/parser/functions/collect.rb +43 -0
  98. data/lib/puppet/parser/functions/each.rb +96 -0
  99. data/lib/puppet/parser/functions/foreach.rb +96 -0
  100. data/lib/puppet/parser/functions/fqdn_rand.rb +2 -2
  101. data/lib/puppet/parser/functions/hiera.rb +20 -2
  102. data/lib/puppet/parser/functions/hiera_array.rb +21 -2
  103. data/lib/puppet/parser/functions/hiera_hash.rb +23 -2
  104. data/lib/puppet/parser/functions/hiera_include.rb +33 -2
  105. data/lib/puppet/parser/functions/inline_template.rb +4 -4
  106. data/lib/puppet/parser/functions/reduce.rb +74 -0
  107. data/lib/puppet/parser/functions/reject.rb +46 -0
  108. data/lib/puppet/parser/functions/select.rb +46 -0
  109. data/lib/puppet/parser/functions/slice.rb +96 -0
  110. data/lib/puppet/parser/functions/template.rb +2 -2
  111. data/lib/puppet/parser/grammar.ra +7 -4
  112. data/lib/puppet/parser/lexer.rb +10 -0
  113. data/lib/puppet/parser/methods.rb +69 -0
  114. data/lib/puppet/parser/parser.rb +855 -808
  115. data/lib/puppet/parser/parser_factory.rb +62 -0
  116. data/lib/puppet/parser/parser_support.rb +8 -2
  117. data/lib/puppet/parser/scope.rb +153 -47
  118. data/lib/puppet/parser/templatewrapper.rb +28 -21
  119. data/lib/puppet/parser/type_loader.rb +3 -1
  120. data/lib/puppet/pops.rb +40 -0
  121. data/lib/puppet/pops/adaptable.rb +190 -0
  122. data/lib/puppet/pops/adapters.rb +65 -0
  123. data/lib/puppet/pops/containment.rb +37 -0
  124. data/lib/puppet/pops/issues.rb +258 -0
  125. data/lib/puppet/pops/label_provider.rb +71 -0
  126. data/lib/puppet/pops/model/ast_transformer.rb +636 -0
  127. data/lib/puppet/pops/model/ast_tree_dumper.rb +378 -0
  128. data/lib/puppet/pops/model/factory.rb +804 -0
  129. data/lib/puppet/pops/model/model.rb +567 -0
  130. data/lib/puppet/pops/model/model_label_provider.rb +75 -0
  131. data/lib/puppet/pops/model/model_tree_dumper.rb +352 -0
  132. data/lib/puppet/pops/model/tree_dumper.rb +59 -0
  133. data/lib/puppet/pops/parser/egrammar.ra +723 -0
  134. data/lib/puppet/pops/parser/eparser.rb +2300 -0
  135. data/lib/puppet/pops/parser/grammar.ra +746 -0
  136. data/lib/puppet/pops/parser/lexer.rb +842 -0
  137. data/lib/puppet/pops/parser/makefile +13 -0
  138. data/lib/puppet/pops/parser/parser_support.rb +203 -0
  139. data/lib/puppet/pops/patterns.rb +35 -0
  140. data/lib/puppet/pops/utils.rb +104 -0
  141. data/lib/puppet/pops/validation.rb +297 -0
  142. data/lib/puppet/pops/validation/checker3_1.rb +551 -0
  143. data/lib/puppet/pops/validation/validator_factory_3_1.rb +41 -0
  144. data/lib/puppet/pops/visitable.rb +6 -0
  145. data/lib/puppet/pops/visitor.rb +50 -0
  146. data/lib/puppet/property.rb +37 -28
  147. data/lib/puppet/property/ensure.rb +2 -2
  148. data/lib/puppet/property/ordered_list.rb +1 -1
  149. data/lib/puppet/provider.rb +26 -30
  150. data/lib/puppet/provider/aixobject.rb +45 -44
  151. data/lib/puppet/provider/augeas/augeas.rb +0 -1
  152. data/lib/puppet/provider/confiner.rb +1 -1
  153. data/lib/puppet/provider/cron/crontab.rb +107 -67
  154. data/lib/puppet/provider/group/groupadd.rb +59 -3
  155. data/lib/puppet/provider/interface/cisco.rb +4 -4
  156. data/lib/puppet/provider/mount/parsed.rb +1 -1
  157. data/lib/puppet/provider/nameservice.rb +22 -6
  158. data/lib/puppet/provider/nameservice/pw.rb +1 -1
  159. data/lib/puppet/provider/package/aix.rb +28 -4
  160. data/lib/puppet/provider/package/gem.rb +0 -2
  161. data/lib/puppet/provider/package/macports.rb +1 -1
  162. data/lib/puppet/provider/package/nim.rb +249 -4
  163. data/lib/puppet/provider/package/opkg.rb +77 -0
  164. data/lib/puppet/provider/package/pacman.rb +2 -2
  165. data/lib/puppet/provider/package/rpm.rb +30 -16
  166. data/lib/puppet/provider/package/yum.rb +3 -3
  167. data/lib/puppet/provider/parsedfile.rb +80 -3
  168. data/lib/puppet/provider/selmodule/semodule.rb +2 -2
  169. data/lib/puppet/provider/service/debian.rb +0 -4
  170. data/lib/puppet/provider/service/freebsd.rb +2 -2
  171. data/lib/puppet/provider/service/gentoo.rb +0 -9
  172. data/lib/puppet/provider/service/init.rb +27 -2
  173. data/lib/puppet/provider/service/launchd.rb +1 -1
  174. data/lib/puppet/provider/service/openwrt.rb +36 -0
  175. data/lib/puppet/provider/service/redhat.rb +0 -9
  176. data/lib/puppet/provider/service/src.rb +38 -4
  177. data/lib/puppet/provider/service/systemd.rb +2 -2
  178. data/lib/puppet/provider/service/upstart.rb +1 -8
  179. data/lib/puppet/provider/user/aix.rb +4 -10
  180. data/lib/puppet/provider/user/pw.rb +6 -10
  181. data/lib/puppet/provider/user/useradd.rb +129 -31
  182. data/lib/puppet/provider/vlan/cisco.rb +4 -4
  183. data/lib/puppet/reference/function.rb +2 -2
  184. data/lib/puppet/reference/indirection.rb +46 -5
  185. data/lib/puppet/reference/metaparameter.rb +2 -2
  186. data/lib/puppet/reports.rb +5 -5
  187. data/lib/puppet/reports/rrdgraph.rb +4 -4
  188. data/lib/puppet/reports/tagmail.rb +1 -1
  189. data/lib/puppet/resource.rb +1 -1
  190. data/lib/puppet/resource/type.rb +13 -11
  191. data/lib/puppet/scheduler.rb +16 -0
  192. data/lib/puppet/scheduler/job.rb +53 -0
  193. data/lib/puppet/scheduler/scheduler.rb +45 -0
  194. data/lib/puppet/scheduler/splay_job.rb +32 -0
  195. data/lib/puppet/scheduler/timer.rb +13 -0
  196. data/lib/puppet/settings/base_setting.rb +1 -1
  197. data/lib/puppet/simple_graph.rb +4 -4
  198. data/lib/puppet/ssl/base.rb +12 -2
  199. data/lib/puppet/ssl/certificate.rb +4 -1
  200. data/lib/puppet/ssl/certificate_request.rb +4 -1
  201. data/lib/puppet/ssl/certificate_revocation_list.rb +4 -1
  202. data/lib/puppet/ssl/configuration.rb +32 -0
  203. data/lib/puppet/ssl/host.rb +18 -21
  204. data/lib/puppet/ssl/key.rb +4 -1
  205. data/lib/puppet/ssl/validator.rb +116 -0
  206. data/lib/puppet/transaction.rb +1 -1
  207. data/lib/puppet/transaction/event.rb +3 -10
  208. data/lib/puppet/transaction/event_manager.rb +8 -1
  209. data/lib/puppet/transaction/report.rb +17 -16
  210. data/lib/puppet/type.rb +77 -69
  211. data/lib/puppet/type/cron.rb +20 -8
  212. data/lib/puppet/type/exec.rb +9 -3
  213. data/lib/puppet/type/file.rb +95 -21
  214. data/lib/puppet/type/file/content.rb +1 -1
  215. data/lib/puppet/type/file/mode.rb +7 -1
  216. data/lib/puppet/type/file/source.rb +2 -2
  217. data/lib/puppet/type/group.rb +11 -0
  218. data/lib/puppet/type/scheduled_task.rb +5 -1
  219. data/lib/puppet/type/service.rb +1 -1
  220. data/lib/puppet/type/ssh_authorized_key.rb +2 -2
  221. data/lib/puppet/type/user.rb +24 -6
  222. data/lib/puppet/util.rb +12 -2
  223. data/lib/puppet/util/classgen.rb +4 -4
  224. data/lib/puppet/util/colors.rb +55 -0
  225. data/lib/puppet/util/command_line/trollop.rb +4 -4
  226. data/lib/puppet/util/errors.rb +39 -3
  227. data/lib/puppet/util/fileparsing.rb +5 -0
  228. data/lib/puppet/util/filetype.rb +11 -9
  229. data/lib/puppet/util/instrumentation/instrumentable.rb +2 -2
  230. data/lib/puppet/util/libuser.conf +15 -0
  231. data/lib/puppet/util/libuser.rb +12 -0
  232. data/lib/puppet/util/monkey_patches.rb +48 -0
  233. data/lib/puppet/util/network_device.rb +1 -1
  234. data/lib/puppet/util/network_device/base.rb +2 -2
  235. data/lib/puppet/util/network_device/cisco/device.rb +29 -19
  236. data/lib/puppet/util/network_device/config.rb +5 -2
  237. data/lib/puppet/util/network_device/ipcalc.rb +1 -1
  238. data/lib/puppet/util/network_device/transport/ssh.rb +4 -3
  239. data/lib/puppet/util/network_device/transport/telnet.rb +4 -2
  240. data/lib/puppet/util/plugins.rb +4 -4
  241. data/lib/puppet/util/posix.rb +1 -1
  242. data/lib/puppet/util/profiler.rb +28 -0
  243. data/lib/puppet/util/profiler/logging.rb +47 -0
  244. data/lib/puppet/util/profiler/none.rb +8 -0
  245. data/lib/puppet/util/profiler/object_counts.rb +17 -0
  246. data/lib/puppet/util/profiler/wall_clock.rb +34 -0
  247. data/lib/puppet/util/provider_features.rb +1 -1
  248. data/lib/puppet/util/rdoc/parser.rb +5 -5
  249. data/lib/puppet/util/ssl.rb +38 -0
  250. data/lib/puppet/util/subclass_loader.rb +1 -5
  251. data/lib/puppet/util/windows.rb +1 -0
  252. data/lib/puppet/util/windows/process.rb +3 -0
  253. data/lib/puppet/util/windows/root_certs.rb +86 -0
  254. data/lib/puppet/util/windows/security.rb +1 -0
  255. data/lib/puppet/version.rb +1 -1
  256. data/spec/fixtures/integration/provider/cron/crontab/create_normal_entry +19 -0
  257. data/spec/fixtures/integration/provider/cron/crontab/create_special_entry +18 -0
  258. data/spec/fixtures/integration/provider/cron/crontab/crontab_user1 +15 -0
  259. data/spec/fixtures/integration/provider/cron/crontab/crontab_user2 +4 -0
  260. data/spec/fixtures/integration/provider/cron/crontab/modify_entry +13 -0
  261. data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input1 +15 -0
  262. data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input2 +6 -0
  263. data/spec/fixtures/integration/provider/cron/crontab/remove_named_resource +12 -0
  264. data/spec/fixtures/integration/provider/cron/crontab/remove_unnamed_resource +14 -0
  265. data/spec/fixtures/unit/pops/parser/lexer/aliastest.pp +16 -0
  266. data/spec/fixtures/unit/pops/parser/lexer/append.pp +11 -0
  267. data/spec/fixtures/unit/pops/parser/lexer/argumentdefaults.pp +14 -0
  268. data/spec/fixtures/unit/pops/parser/lexer/arithmetic_expression.pp +8 -0
  269. data/spec/fixtures/unit/pops/parser/lexer/arraytrailingcomma.pp +3 -0
  270. data/spec/fixtures/unit/pops/parser/lexer/casestatement.pp +65 -0
  271. data/spec/fixtures/unit/pops/parser/lexer/classheirarchy.pp +15 -0
  272. data/spec/fixtures/unit/pops/parser/lexer/classincludes.pp +17 -0
  273. data/spec/fixtures/unit/pops/parser/lexer/classpathtest.pp +11 -0
  274. data/spec/fixtures/unit/pops/parser/lexer/collection.pp +10 -0
  275. data/spec/fixtures/unit/pops/parser/lexer/collection_override.pp +8 -0
  276. data/spec/fixtures/unit/pops/parser/lexer/collection_within_virtual_definitions.pp +20 -0
  277. data/spec/fixtures/unit/pops/parser/lexer/componentmetaparams.pp +11 -0
  278. data/spec/fixtures/unit/pops/parser/lexer/componentrequire.pp +8 -0
  279. data/spec/fixtures/unit/pops/parser/lexer/deepclassheirarchy.pp +23 -0
  280. data/spec/fixtures/unit/pops/parser/lexer/defineoverrides.pp +17 -0
  281. data/spec/fixtures/unit/pops/parser/lexer/emptyclass.pp +9 -0
  282. data/spec/fixtures/unit/pops/parser/lexer/emptyexec.pp +3 -0
  283. data/spec/fixtures/unit/pops/parser/lexer/emptyifelse.pp +9 -0
  284. data/spec/fixtures/unit/pops/parser/lexer/falsevalues.pp +3 -0
  285. data/spec/fixtures/unit/pops/parser/lexer/filecreate.pp +11 -0
  286. data/spec/fixtures/unit/pops/parser/lexer/fqdefinition.pp +5 -0
  287. data/spec/fixtures/unit/pops/parser/lexer/fqparents.pp +11 -0
  288. data/spec/fixtures/unit/pops/parser/lexer/funccomma.pp +5 -0
  289. data/spec/fixtures/unit/pops/parser/lexer/hash.pp +33 -0
  290. data/spec/fixtures/unit/pops/parser/lexer/ifexpression.pp +12 -0
  291. data/spec/fixtures/unit/pops/parser/lexer/implicititeration.pp +15 -0
  292. data/spec/fixtures/unit/pops/parser/lexer/multilinecomments.pp +10 -0
  293. data/spec/fixtures/unit/pops/parser/lexer/multipleclass.pp +9 -0
  294. data/spec/fixtures/unit/pops/parser/lexer/multipleinstances.pp +7 -0
  295. data/spec/fixtures/unit/pops/parser/lexer/multisubs.pp +13 -0
  296. data/spec/fixtures/unit/pops/parser/lexer/namevartest.pp +9 -0
  297. data/spec/fixtures/unit/pops/parser/lexer/scopetest.pp +13 -0
  298. data/spec/fixtures/unit/pops/parser/lexer/selectorvalues.pp +49 -0
  299. data/spec/fixtures/unit/pops/parser/lexer/simpledefaults.pp +5 -0
  300. data/spec/fixtures/unit/pops/parser/lexer/simpleselector.pp +38 -0
  301. data/spec/fixtures/unit/pops/parser/lexer/singleary.pp +19 -0
  302. data/spec/fixtures/unit/pops/parser/lexer/singlequote.pp +11 -0
  303. data/spec/fixtures/unit/pops/parser/lexer/singleselector.pp +22 -0
  304. data/spec/fixtures/unit/pops/parser/lexer/subclass_name_duplication.pp +11 -0
  305. data/spec/fixtures/unit/pops/parser/lexer/tag.pp +9 -0
  306. data/spec/fixtures/unit/pops/parser/lexer/tagged.pp +35 -0
  307. data/spec/fixtures/unit/pops/parser/lexer/virtualresources.pp +14 -0
  308. data/spec/fixtures/unit/provider/cron/crontab/single_line.yaml +4 -4
  309. data/spec/fixtures/unit/provider/cron/crontab/vixie_header.txt +3 -0
  310. data/spec/fixtures/unit/provider/cron/parsed/managed +6 -0
  311. data/spec/fixtures/unit/provider/cron/parsed/simple +9 -0
  312. data/spec/fixtures/unit/provider/parsedfile/simple.txt +4 -0
  313. data/spec/fixtures/unit/provider/service/systemd/list_units +18 -0
  314. data/spec/integration/parser/collector_spec.rb +1 -1
  315. data/spec/integration/parser/compiler_spec.rb +252 -227
  316. data/spec/integration/parser/parser_spec.rb +171 -53
  317. data/spec/integration/parser/scope_spec.rb +1 -1
  318. data/spec/integration/provider/cron/crontab_spec.rb +187 -0
  319. data/spec/integration/provider/service/systemd_spec.rb +20 -0
  320. data/spec/integration/type/file_spec.rb +21 -21
  321. data/spec/integration/type/package_spec.rb +1 -1
  322. data/spec/lib/puppet_spec/database.rb +2 -5
  323. data/spec/spec_helper.rb +6 -1
  324. data/spec/unit/application/apply_spec.rb +16 -1
  325. data/spec/unit/application/describe_spec.rb +1 -1
  326. data/spec/unit/application/doc_spec.rb +55 -32
  327. data/spec/unit/application/kick_spec.rb +8 -6
  328. data/spec/unit/application/master_spec.rb +4 -4
  329. data/spec/unit/daemon_spec.rb +1 -1
  330. data/spec/unit/forge/errors_spec.rb +40 -0
  331. data/spec/unit/forge/repository_spec.rb +11 -1
  332. data/spec/unit/forge_spec.rb +13 -3
  333. data/spec/unit/hiera/backend/puppet_backend_spec.rb +1 -0
  334. data/spec/unit/hiera/scope_spec.rb +48 -25
  335. data/spec/unit/indirector/catalog/active_record_spec.rb +6 -3
  336. data/spec/unit/indirector/catalog/compiler_spec.rb +3 -28
  337. data/spec/unit/indirector/catalog/static_compiler_spec.rb +1 -1
  338. data/spec/unit/indirector/facts/inventory_active_record_spec.rb +154 -150
  339. data/spec/unit/indirector/indirection_spec.rb +5 -0
  340. data/spec/unit/indirector/resource/active_record_spec.rb +5 -22
  341. data/spec/unit/indirector_spec.rb +7 -1
  342. data/spec/unit/interface/action_builder_spec.rb +1 -1
  343. data/spec/unit/interface/action_manager_spec.rb +0 -2
  344. data/spec/unit/interface/action_spec.rb +1 -1
  345. data/spec/unit/interface/documentation_spec.rb +0 -2
  346. data/spec/unit/interface/face_collection_spec.rb +1 -1
  347. data/spec/unit/interface/option_builder_spec.rb +1 -1
  348. data/spec/unit/interface/option_spec.rb +0 -1
  349. data/spec/unit/module_spec.rb +17 -19
  350. data/spec/unit/module_tool/application_spec.rb +1 -3
  351. data/spec/unit/module_tool/applications/builder_spec.rb +38 -0
  352. data/spec/unit/module_tool/applications/checksummer_spec.rb +134 -0
  353. data/spec/unit/module_tool/applications/installer_spec.rb +71 -91
  354. data/spec/unit/module_tool/applications/searcher_spec.rb +1 -3
  355. data/spec/unit/module_tool/applications/uninstaller_spec.rb +18 -26
  356. data/spec/unit/module_tool/applications/unpacker_spec.rb +19 -52
  357. data/spec/unit/module_tool/tar/gnu_spec.rb +19 -0
  358. data/spec/unit/module_tool/tar/mini_spec.rb +59 -0
  359. data/spec/unit/module_tool/tar/solaris_spec.rb +19 -0
  360. data/spec/unit/network/http/connection_spec.rb +17 -2
  361. data/spec/unit/network/http/handler_spec.rb +195 -167
  362. data/spec/unit/network/http/rack/rest_spec.rb +26 -4
  363. data/spec/unit/network/http/webrick/rest_spec.rb +28 -1
  364. data/spec/unit/network/http/webrick_spec.rb +12 -3
  365. data/spec/unit/node/environment_spec.rb +421 -404
  366. data/spec/unit/parser/ast/arithmetic_operator_spec.rb +98 -2
  367. data/spec/unit/parser/collector_spec.rb +4 -4
  368. data/spec/unit/parser/compiler_spec.rb +13 -13
  369. data/spec/unit/parser/eparser_adapter_spec.rb +407 -0
  370. data/spec/unit/parser/functions/extlookup_spec.rb +20 -17
  371. data/spec/unit/parser/functions/fqdn_rand_spec.rb +5 -0
  372. data/spec/unit/parser/functions/hiera_include_spec.rb +0 -2
  373. data/spec/unit/parser/functions/hiera_spec.rb +0 -2
  374. data/spec/unit/parser/functions_spec.rb +27 -15
  375. data/spec/unit/parser/methods/collect_spec.rb +110 -0
  376. data/spec/unit/parser/methods/each_spec.rb +91 -0
  377. data/spec/unit/parser/methods/foreach_spec.rb +91 -0
  378. data/spec/unit/parser/methods/reduce_spec.rb +67 -0
  379. data/spec/unit/parser/methods/reject_spec.rb +73 -0
  380. data/spec/unit/parser/methods/select_spec.rb +79 -0
  381. data/spec/unit/parser/methods/shared.rb +61 -0
  382. data/spec/unit/parser/methods/slice_spec.rb +97 -0
  383. data/spec/unit/parser/parser_spec.rb +2 -2
  384. data/spec/unit/parser/scope_spec.rb +39 -16
  385. data/spec/unit/parser/templatewrapper_spec.rb +6 -5
  386. data/spec/unit/parser/type_loader_spec.rb +191 -165
  387. data/spec/unit/pops/adaptable_spec.rb +143 -0
  388. data/spec/unit/pops/containment_spec.rb +25 -0
  389. data/spec/unit/pops/factory_rspec_helper.rb +77 -0
  390. data/spec/unit/pops/factory_spec.rb +329 -0
  391. data/spec/unit/pops/issues_spec.rb +26 -0
  392. data/spec/unit/pops/label_provider_spec.rb +42 -0
  393. data/spec/unit/pops/model/ast_transformer_spec.rb +65 -0
  394. data/spec/unit/pops/model/model_spec.rb +37 -0
  395. data/spec/unit/pops/parser/lexer_spec.rb +884 -0
  396. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +248 -0
  397. data/spec/unit/pops/parser/parse_calls_spec.rb +93 -0
  398. data/spec/unit/pops/parser/parse_conditionals_spec.rb +159 -0
  399. data/spec/unit/pops/parser/parse_containers_spec.rb +175 -0
  400. data/spec/unit/pops/parser/parse_resource_spec.rb +228 -0
  401. data/spec/unit/pops/parser/parser_rspec_helper.rb +11 -0
  402. data/spec/unit/pops/parser/parser_spec.rb +15 -0
  403. data/spec/unit/pops/parser/rgen_sanitycheck_spec.rb +16 -0
  404. data/spec/unit/pops/transformer/transform_basic_expressions_spec.rb +243 -0
  405. data/spec/unit/pops/transformer/transform_calls_spec.rb +80 -0
  406. data/spec/unit/pops/transformer/transform_conditionals_spec.rb +132 -0
  407. data/spec/unit/pops/transformer/transform_containers_spec.rb +182 -0
  408. data/spec/unit/pops/transformer/transform_resource_spec.rb +185 -0
  409. data/spec/unit/pops/transformer/transformer_rspec_helper.rb +27 -0
  410. data/spec/unit/pops/visitor_spec.rb +94 -0
  411. data/spec/unit/property_spec.rb +11 -0
  412. data/spec/unit/provider/augeas/augeas_spec.rb +3 -0
  413. data/spec/unit/provider/cron/crontab_spec.rb +97 -7
  414. data/spec/unit/provider/cron/parsed_spec.rb +325 -0
  415. data/spec/unit/provider/exec/posix_spec.rb +1 -1
  416. data/spec/unit/provider/group/groupadd_spec.rb +33 -3
  417. data/spec/unit/provider/group/pw_spec.rb +5 -5
  418. data/spec/unit/provider/nameservice_spec.rb +304 -0
  419. data/spec/unit/provider/package/aix_spec.rb +53 -11
  420. data/spec/unit/provider/package/aptrpm_spec.rb +6 -0
  421. data/spec/unit/provider/package/gem_spec.rb +6 -11
  422. data/spec/unit/provider/package/nim_spec.rb +216 -7
  423. data/spec/unit/provider/package/opkg_spec.rb +180 -0
  424. data/spec/unit/provider/package/rpm_spec.rb +149 -3
  425. data/spec/unit/provider/package/yum_spec.rb +6 -5
  426. data/spec/unit/provider/parsedfile_spec.rb +122 -28
  427. data/spec/unit/provider/service/freebsd_spec.rb +18 -0
  428. data/spec/unit/provider/service/init_spec.rb +108 -87
  429. data/spec/unit/provider/service/launchd_spec.rb +2 -2
  430. data/spec/unit/provider/service/openwrt_spec.rb +109 -0
  431. data/spec/unit/provider/service/src_spec.rb +117 -41
  432. data/spec/unit/provider/service/systemd_spec.rb +125 -17
  433. data/spec/unit/provider/service/upstart_spec.rb +1 -1
  434. data/spec/unit/provider/user/aix_spec.rb +42 -0
  435. data/spec/unit/provider/user/directoryservice_spec.rb +1 -0
  436. data/spec/unit/provider/user/pw_spec.rb +24 -12
  437. data/spec/unit/provider/user/user_role_add_spec.rb +1 -1
  438. data/spec/unit/provider/user/useradd_spec.rb +179 -15
  439. data/spec/unit/resource/type_spec.rb +3 -3
  440. data/spec/unit/scheduler/job_spec.rb +79 -0
  441. data/spec/unit/scheduler/scheduler_spec.rb +129 -0
  442. data/spec/unit/scheduler/splay_job_spec.rb +35 -0
  443. data/spec/unit/ssl/base_spec.rb +3 -9
  444. data/spec/unit/ssl/certificate_authority_spec.rb +1 -0
  445. data/spec/unit/ssl/certificate_request_spec.rb +3 -1
  446. data/spec/unit/ssl/certificate_spec.rb +3 -1
  447. data/spec/unit/ssl/configuration_spec.rb +74 -0
  448. data/spec/unit/ssl/host_spec.rb +28 -7
  449. data/spec/unit/ssl/validator_spec.rb +311 -0
  450. data/spec/unit/transaction/event_manager_spec.rb +49 -0
  451. data/spec/unit/transaction/event_spec.rb +20 -5
  452. data/spec/unit/transaction/report_spec.rb +8 -0
  453. data/spec/unit/type/cron_spec.rb +9 -0
  454. data/spec/unit/type/exec_spec.rb +11 -0
  455. data/spec/unit/type/file/content_spec.rb +20 -20
  456. data/spec/unit/type/file/mode_spec.rb +6 -0
  457. data/spec/unit/type/file/source_spec.rb +9 -7
  458. data/spec/unit/type/file_spec.rb +22 -3
  459. data/spec/unit/type/service_spec.rb +34 -21
  460. data/spec/unit/type_spec.rb +46 -1
  461. data/spec/unit/util/backups_spec.rb +2 -2
  462. data/spec/unit/util/execution_spec.rb +4 -1
  463. data/spec/unit/util/filetype_spec.rb +6 -0
  464. data/spec/unit/util/monkey_patches_spec.rb +18 -0
  465. data/spec/unit/util/network_device/cisco/device_spec.rb +37 -0
  466. data/spec/unit/util/network_device/config_spec.rb +14 -0
  467. data/spec/unit/util/network_device_spec.rb +3 -3
  468. data/spec/unit/util/profiler/logging_spec.rb +81 -0
  469. data/spec/unit/util/profiler/none_spec.rb +12 -0
  470. data/spec/unit/util/profiler/object_counts_spec.rb +14 -0
  471. data/spec/unit/util/profiler/wall_clock_spec.rb +13 -0
  472. data/spec/unit/util/pson_spec.rb +5 -0
  473. data/spec/unit/util/ssl_spec.rb +51 -0
  474. data/spec/unit/util/windows/root_certs_spec.rb +15 -0
  475. data/spec/unit/util_spec.rb +28 -0
  476. metadata +2593 -2307
  477. data/spec/unit/module_tool/applications/application_spec.rb +0 -19
@@ -21,6 +21,13 @@ class Puppet::Parser::AST
21
21
  scope.setvar(name,value, :file => file, :line => line, :append => @append)
22
22
  end
23
23
  end
24
+ if @append
25
+ # Produce resulting value from append operation
26
+ scope[name]
27
+ else
28
+ # Produce assigned value
29
+ value
30
+ end
24
31
  end
25
32
 
26
33
  def each
@@ -90,18 +90,19 @@ class Puppet::Parser::Compiler
90
90
  # This is the main entry into our catalog.
91
91
  def compile
92
92
  # Set the client's parameters into the top scope.
93
- set_node_parameters
94
- create_settings_scope
93
+ Puppet::Util::Profiler.profile("Compile: Set node parameters") { set_node_parameters }
95
94
 
96
- evaluate_main
95
+ Puppet::Util::Profiler.profile("Compile: Created settings scope") { create_settings_scope }
97
96
 
98
- evaluate_ast_node
97
+ Puppet::Util::Profiler.profile("Compile: Evaluated main") { evaluate_main }
99
98
 
100
- evaluate_node_classes
99
+ Puppet::Util::Profiler.profile("Compile: Evaluated AST node") { evaluate_ast_node }
101
100
 
102
- evaluate_generators
101
+ Puppet::Util::Profiler.profile("Compile: Evaluated node classes") { evaluate_node_classes }
103
102
 
104
- finish
103
+ Puppet::Util::Profiler.profile("Compile: Evaluated generators") { evaluate_generators }
104
+
105
+ Puppet::Util::Profiler.profile("Compile: Finished catalog") { finish }
105
106
 
106
107
  fail_on_unevaluated
107
108
 
@@ -226,17 +227,18 @@ class Puppet::Parser::Compiler
226
227
  def evaluate_collections
227
228
  return false if @collections.empty?
228
229
 
229
- found_something = false
230
230
  exceptwrap do
231
231
  # We have to iterate over a dup of the array because
232
232
  # collections can delete themselves from the list, which
233
233
  # changes its length and causes some collections to get missed.
234
- @collections.dup.each do |collection|
235
- found_something = true if collection.evaluate
234
+ Puppet::Util::Profiler.profile("Evaluated collections") do
235
+ found_something = false
236
+ @collections.dup.each do |collection|
237
+ found_something = true if collection.evaluate
238
+ end
239
+ found_something
236
240
  end
237
241
  end
238
-
239
- found_something
240
242
  end
241
243
 
242
244
  # Make sure all of our resources have been evaluated into native resources.
@@ -244,7 +246,13 @@ class Puppet::Parser::Compiler
244
246
  # evaluate_generators loop.
245
247
  def evaluate_definitions
246
248
  exceptwrap do
247
- !unevaluated_resources.each { |resource| resource.evaluate }.empty?
249
+ Puppet::Util::Profiler.profile("Evaluated definitions") do
250
+ !unevaluated_resources.each do |resource|
251
+ Puppet::Util::Profiler.profile("Evaluated resource #{resource}") do
252
+ resource.evaluate
253
+ end
254
+ end.empty?
255
+ end
248
256
  end
249
257
  end
250
258
 
@@ -257,9 +265,12 @@ class Puppet::Parser::Compiler
257
265
  loop do
258
266
  done = true
259
267
 
260
- # Call collections first, then definitions.
261
- done = false if evaluate_collections
262
- done = false if evaluate_definitions
268
+ Puppet::Util::Profiler.profile("Iterated (#{count + 1}) on generators") do
269
+ # Call collections first, then definitions.
270
+ done = false if evaluate_collections
271
+ done = false if evaluate_definitions
272
+ end
273
+
263
274
  break if done
264
275
 
265
276
  count += 1
@@ -0,0 +1,120 @@
1
+ require 'puppet/pops'
2
+
3
+ module Puppet; module Parser; end; end;
4
+ # Adapts an egrammar/eparser to respond to the public API of the classic parser
5
+ #
6
+ class Puppet::Parser::EParserAdapter
7
+
8
+ def initialize(classic_parser)
9
+ @classic_parser = classic_parser
10
+ @file = ''
11
+ @string = ''
12
+ @use = :undefined
13
+ end
14
+
15
+ def file=(file)
16
+ @classic_parser.file = file
17
+ @file = file
18
+ @use = :file
19
+ end
20
+
21
+ def parse(string = nil)
22
+ if @file =~ /\.rb$/
23
+ return parse_ruby_file
24
+ else
25
+ self.string= string if string
26
+ parser = Puppet::Pops::Parser::Parser.new()
27
+ parse_result = if @use == :string
28
+ parser.parse_string(@string)
29
+ else
30
+ parser.parse_file(@file)
31
+ end
32
+ # Compute the source_file to set in created AST objects (it was either given, or it may be unknown
33
+ # if caller did not set a file and the present a string.
34
+ #
35
+ source_file = @file || "unknown-source-location"
36
+
37
+ # Validate
38
+ validate(parse_result)
39
+
40
+ # Transform the result, but only if not nil
41
+ parse_result = Puppet::Pops::Model::AstTransformer.new(source_file, @classic_parser).transform(parse_result) if parse_result
42
+ if parse_result && !parse_result.is_a?(Puppet::Parser::AST::BlockExpression)
43
+ # Need to transform again, if result is not wrapped in something iterable when handed off to
44
+ # a new Hostclass as its code.
45
+ parse_result = Puppet::Parser::AST::BlockExpression.new(:children => [parse_result]) if parse_result
46
+ end
47
+ end
48
+
49
+ Puppet::Parser::AST::Hostclass.new('', :code => parse_result)
50
+ end
51
+
52
+ def validate(parse_result)
53
+ # TODO: This is too many hoops to jump through... ugly API
54
+ # could reference a ValidatorFactory.validator_3_1(acceptor) instead.
55
+ # and let the factory abstract the rest.
56
+ #
57
+ return unless parse_result
58
+
59
+ acceptor = Puppet::Pops::Validation::Acceptor.new
60
+ validator = Puppet::Pops::Validation::ValidatorFactory_3_1.new().validator(acceptor)
61
+ validator.validate(parse_result)
62
+
63
+ max_errors = Puppet[:max_errors]
64
+ max_warnings = Puppet[:max_warnings] + 1
65
+ max_deprecations = Puppet[:max_deprecations] + 1
66
+
67
+ # If there are warnings output them
68
+ warnings = acceptor.warnings
69
+ if warnings.size > 0
70
+ formatter = Puppet::Pops::Validation::DiagnosticFormatterPuppetStyle.new
71
+ emitted_w = 0
72
+ emitted_dw = 0
73
+ acceptor.warnings.each {|w|
74
+ if w.severity == :deprecation
75
+ # Do *not* call Puppet.deprecation_warning it is for internal deprecation, not
76
+ # deprecation of constructs in manifests! (It is not designed for that purpose even if
77
+ # used throughout the code base).
78
+ #
79
+ Puppet.warning(formatter.format(w)) if emitted_dw < max_deprecations
80
+ emitted_dw += 1
81
+ else
82
+ Puppet.warning(formatter.format(w)) if emitted_w < max_warnings
83
+ emitted_w += 1
84
+ end
85
+ break if emitted_w > max_warnings && emitted_dw > max_deprecations # but only then
86
+ }
87
+ end
88
+
89
+ # If there were errors, report the first found. Use a puppet style formatter.
90
+ errors = acceptor.errors
91
+ if errors.size > 0
92
+ formatter = Puppet::Pops::Validation::DiagnosticFormatterPuppetStyle.new
93
+ if errors.size == 1 || max_errors <= 1
94
+ # raise immediately
95
+ raise Puppet::ParseError.new(formatter.format(errors[0]))
96
+ end
97
+ emitted = 0
98
+ errors.each do |e|
99
+ Puppet.err(formatter.format(e))
100
+ emitted += 1
101
+ break if emitted >= max_errors
102
+ end
103
+ warnings_message = warnings.size > 0 ? ", and #{warnings.size} warnings" : ""
104
+ giving_up_message = "Found #{errors.size} errors#{warnings_message}. Giving up"
105
+ exception = Puppet::ParseError.new(giving_up_message)
106
+ exception.file = errors[0].file
107
+ raise exception
108
+ end
109
+ end
110
+
111
+ def string=(string)
112
+ @classic_parser.string = string
113
+ @string = string
114
+ @use = :string
115
+ end
116
+
117
+ def parse_ruby_file
118
+ @classic_parser.parse
119
+ end
120
+ end
@@ -1,11 +1,12 @@
1
1
  require 'puppet/module'
2
- require 'puppet/parser/parser'
2
+ #require 'puppet/parser/parser'
3
3
 
4
4
  # This is a silly central module for finding
5
5
  # different kinds of files while parsing. This code
6
6
  # doesn't really belong in the Puppet::Module class,
7
7
  # but it doesn't really belong anywhere else, either.
8
- module Puppet::Parser::Files
8
+ module Puppet; module Parser; module Files
9
+
9
10
  module_function
10
11
 
11
12
  # Return a list of manifests (as absolute filenames) that match +pat+
@@ -28,9 +29,9 @@ module Puppet::Parser::Files
28
29
  end
29
30
 
30
31
  # Find the concrete file denoted by +file+. If +file+ is absolute,
31
- # return it directly. Otherwise try to find it as a template in a
32
- # module. If that fails, return it relative to the +templatedir+ config
33
- # param.
32
+ # return it directly. Otherwise try to find relative to the +templatedir+
33
+ # config param. If that fails try to find it as a template in a
34
+ # module.
34
35
  # In all cases, an absolute path is returned, which does not
35
36
  # necessarily refer to an existing file
36
37
  def find_template(template, environment = nil)
@@ -85,4 +86,4 @@ module Puppet::Parser::Files
85
86
  path.split(File::SEPARATOR, 2) unless path == "" or Puppet::Util.absolute_path?(path)
86
87
  end
87
88
 
88
- end
89
+ end; end; end
@@ -137,15 +137,17 @@ module Puppet::Parser::Functions
137
137
 
138
138
  fname = "function_#{name}"
139
139
  environment_module.send(:define_method, fname) do |*args|
140
- if args[0].is_a? Array
141
- if arity >= 0 and args[0].size != arity
142
- raise ArgumentError, "#{name}(): Wrong number of arguments given (#{args[0].size} for #{arity})"
143
- elsif arity < 0 and args[0].size < (arity+1).abs
144
- raise ArgumentError, "#{name}(): Wrong number of arguments given (#{args[0].size} for minimum #{(arity+1).abs})"
140
+ Puppet::Util::Profiler.profile("Called #{name}") do
141
+ if args[0].is_a? Array
142
+ if arity >= 0 and args[0].size != arity
143
+ raise ArgumentError, "#{name}(): Wrong number of arguments given (#{args[0].size} for #{arity})"
144
+ elsif arity < 0 and args[0].size < (arity+1).abs
145
+ raise ArgumentError, "#{name}(): Wrong number of arguments given (#{args[0].size} for minimum #{(arity+1).abs})"
146
+ end
147
+ self.send(real_fname, args[0])
148
+ else
149
+ raise ArgumentError, "custom functions must be called with a single array that contains the arguments. For example, function_example([1]) instead of function_example(1)"
145
150
  end
146
- self.send(real_fname, args[0])
147
- else
148
- raise ArgumentError, "custom functions must be called with a single array that contains the arguments. For example, function_example([1]) instead of function_example(1)"
149
151
  end
150
152
  end
151
153
 
@@ -0,0 +1,43 @@
1
+ require 'puppet/parser/ast/lambda'
2
+
3
+ Puppet::Parser::Functions::newfunction(
4
+ :collect,
5
+ :type => :rvalue,
6
+ :arity => 2,
7
+ :doc => <<-'ENDHEREDOC') do |args|
8
+ Applies a parameterized block to each element in a sequence of entries from the first
9
+ argument and returns an array with the result of each invocation of the parameterized block.
10
+
11
+ This function takes two mandatory arguments: the first should be an Array or a Hash, and the second
12
+ a parameterized block as produced by the puppet syntax:
13
+
14
+ $a.collect |$x| { ... }
15
+
16
+ When the first argument is an Array, the block is called with each entry in turn. When the first argument
17
+ is a hash the entry is an array with `[key, value]`.
18
+
19
+ *Examples*
20
+
21
+ # Turns hash into array of values
22
+ $a.collect |$x|{ $x[1] }
23
+
24
+ # Turns hash into array of keys
25
+ $a.collect |$x| { $x[0] }
26
+
27
+ Since 3.2
28
+ ENDHEREDOC
29
+
30
+ receiver = args[0]
31
+ pblock = args[1]
32
+
33
+ raise ArgumentError, ("collect(): wrong argument type (#{pblock.class}; must be a parameterized block.") unless pblock.is_a? Puppet::Parser::AST::Lambda
34
+
35
+ case receiver
36
+ when Array
37
+ when Hash
38
+ else
39
+ raise ArgumentError, ("collect(): wrong argument type (#{receiver.class}; must be an Array or a Hash.")
40
+ end
41
+
42
+ receiver.to_a.collect {|x| pblock.call(self, x) }
43
+ end
@@ -0,0 +1,96 @@
1
+ Puppet::Parser::Functions::newfunction(
2
+ :each,
3
+ :type => :rvalue,
4
+ :arity => 2,
5
+ :doc => <<-'ENDHEREDOC') do |args|
6
+ Applies a parameterized block to each element in a sequence of selected entries from the first
7
+ argument and returns the first argument.
8
+
9
+ This function takes two mandatory arguments: the first should be an Array or a Hash, and the second
10
+ a parameterized block as produced by the puppet syntax:
11
+
12
+ $a.each {|$x| ... }
13
+
14
+ When the first argument is an Array, the parameterized block should define one or two block parameters.
15
+ For each application of the block, the next element from the array is selected, and it is passed to
16
+ the block if the block has one parameter. If the block has two parameters, the first is the elements
17
+ index, and the second the value. The index starts from 0.
18
+
19
+ $a.each {|$index, $value| ... }
20
+
21
+ When the first argument is a Hash, the parameterized block should define one or two parameters.
22
+ When one parameter is defined, the iteration is performed with each entry as an array of `[key, value]`,
23
+ and when two parameters are defined the iteration is performed with key and value.
24
+
25
+ $a.each {|$entry| ..."key ${$entry[0]}, value ${$entry[1]}" }
26
+ $a.each {|$key, $value| ..."key ${key}, value ${value}" }
27
+
28
+ Since 3.2
29
+ ENDHEREDOC
30
+ require 'puppet/parser/ast/lambda'
31
+
32
+ def foreach_Array(o, scope, pblock)
33
+ return nil unless pblock
34
+
35
+ serving_size = pblock.parameter_count
36
+ if serving_size == 0
37
+ raise ArgumentError, "Block must define at least one parameter; value."
38
+ end
39
+ if serving_size > 2
40
+ raise ArgumentError, "Block must define at most two parameters; index, value"
41
+ end
42
+ enumerator = o.each
43
+ index = 0
44
+ result = nil
45
+ if serving_size == 1
46
+ (o.size).times do
47
+ pblock.call(scope, enumerator.next)
48
+ end
49
+ else
50
+ (o.size).times do
51
+ pblock.call(scope, index, enumerator.next)
52
+ index = index +1
53
+ end
54
+ end
55
+ o
56
+ end
57
+
58
+ def foreach_Hash(o, scope, pblock)
59
+ return nil unless pblock
60
+ serving_size = pblock.parameter_count
61
+ case serving_size
62
+ when 0
63
+ raise ArgumentError, "Block must define at least one parameter (for hash entry key)."
64
+ when 1
65
+ when 2
66
+ else
67
+ raise ArgumentError, "Block must define at most two parameters (for hash entry key and value)."
68
+ end
69
+ enumerator = o.each_pair
70
+ result = nil
71
+ if serving_size == 1
72
+ (o.size).times do
73
+ pblock.call(scope, enumerator.next)
74
+ end
75
+ else
76
+ (o.size).times do
77
+ pblock.call(scope, *enumerator.next)
78
+ end
79
+ end
80
+ o
81
+ end
82
+
83
+ raise ArgumentError, ("each(): wrong number of arguments (#{args.length}; must be 2)") if args.length != 2
84
+ receiver = args[0]
85
+ pblock = args[1]
86
+ raise ArgumentError, ("each(): wrong argument type (#{args[1].class}; must be a parameterized block.") unless pblock.is_a? Puppet::Parser::AST::Lambda
87
+
88
+ case receiver
89
+ when Array
90
+ foreach_Array(receiver, self, pblock)
91
+ when Hash
92
+ foreach_Hash(receiver, self, pblock)
93
+ else
94
+ raise ArgumentError, ("each(): wrong argument type (#{args[0].class}; must be an Array or a Hash.")
95
+ end
96
+ end
@@ -0,0 +1,96 @@
1
+ Puppet::Parser::Functions::newfunction(
2
+ :foreach,
3
+ :type => :rvalue,
4
+ :arity => 2,
5
+ :doc => <<-'ENDHEREDOC') do |args|
6
+ Applies a parameterized block to each element in a sequence of selected entries from the first
7
+ argument and returns the first argument.
8
+
9
+ This function takes two mandatory arguments: the first should be an Array or a Hash, and the second
10
+ a parameterized block as produced by the puppet syntax:
11
+
12
+ $a.foreach {|$x| ... }
13
+
14
+ When the first argument is an Array, the parameterized block should define one or two block parameters.
15
+ For each application of the block, the next element from the array is selected, and it is passed to
16
+ the block if the block has one parameter. If the block has two parameters, the first is the elements
17
+ index, and the second the value. The index starts from 0.
18
+
19
+ $a.foreach {|$index, $value| ... }
20
+
21
+ When the first argument is a Hash, the parameterized block should define one or two parameters.
22
+ When one parameter is defined, the iteration is performed with each entry as an array of `[key, value]`,
23
+ and when two parameters are defined the iteration is performed with key and value.
24
+
25
+ $a.foreach {|$entry| ..."key ${$entry[0]}, value ${$entry[1]}" }
26
+ $a.foreach {|$key, $value| ..."key ${key}, value ${value}" }
27
+
28
+ Since 3.2
29
+ ENDHEREDOC
30
+ require 'puppet/parser/ast/lambda'
31
+
32
+ def foreach_Array(o, scope, pblock)
33
+ return nil unless pblock
34
+
35
+ serving_size = pblock.parameter_count
36
+ if serving_size == 0
37
+ raise ArgumentError, "Block must define at least one parameter; value."
38
+ end
39
+ if serving_size > 2
40
+ raise ArgumentError, "Block must define at most two parameters; index, value"
41
+ end
42
+ enumerator = o.each
43
+ index = 0
44
+ result = nil
45
+ if serving_size == 1
46
+ (o.size).times do
47
+ pblock.call(scope, enumerator.next)
48
+ end
49
+ else
50
+ (o.size).times do
51
+ pblock.call(scope, index, enumerator.next)
52
+ index = index +1
53
+ end
54
+ end
55
+ o
56
+ end
57
+
58
+ def foreach_Hash(o, scope, pblock)
59
+ return nil unless pblock
60
+ serving_size = pblock.parameter_count
61
+ case serving_size
62
+ when 0
63
+ raise ArgumentError, "Block must define at least one parameter (for hash entry key)."
64
+ when 1
65
+ when 2
66
+ else
67
+ raise ArgumentError, "Block must define at most two parameters (for hash entry key and value)."
68
+ end
69
+ enumerator = o.each_pair
70
+ result = nil
71
+ if serving_size == 1
72
+ (o.size).times do
73
+ pblock.call(scope, enumerator.next)
74
+ end
75
+ else
76
+ (o.size).times do
77
+ pblock.call(scope, *enumerator.next)
78
+ end
79
+ end
80
+ o
81
+ end
82
+
83
+ raise ArgumentError, ("foreach(): wrong number of arguments (#{args.length}; must be 2)") if args.length != 2
84
+ receiver = args[0]
85
+ pblock = args[1]
86
+ raise ArgumentError, ("foreach(): wrong argument type (#{args[1].class}; must be a parameterized block.") unless pblock.is_a? Puppet::Parser::AST::Lambda
87
+
88
+ case receiver
89
+ when Array
90
+ foreach_Array(receiver, self, pblock)
91
+ when Hash
92
+ foreach_Hash(receiver, self, pblock)
93
+ else
94
+ raise ArgumentError, ("foreach(): wrong argument type (#{args[0].class}; must be an Array or a Hash.")
95
+ end
96
+ end