puppet 3.1.1 → 3.2.0.rc1

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 (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
@@ -8,6 +8,6 @@ Puppet::Parser::Functions::newfunction(:fqdn_rand, :arity => -2, :type => :rvalu
8
8
  $random_number = fqdn_rand(30)
9
9
  $random_number_seed = fqdn_rand(30,30)") do |args|
10
10
  max = args.shift.to_i
11
- srand(Digest::MD5.hexdigest([self['::fqdn'],args].join(':')).hex)
12
- rand(max).to_s
11
+ seed = Digest::MD5.hexdigest([self['::fqdn'],args].join(':')).hex
12
+ Puppet::Util.deterministic_rand(seed,max)
13
13
  end
@@ -1,6 +1,24 @@
1
+ require 'hiera_puppet'
2
+
1
3
  module Puppet::Parser::Functions
2
- newfunction(:hiera, :type => :rvalue, :arity => -2) do |*args|
3
- require 'hiera_puppet'
4
+ newfunction(:hiera, :type => :rvalue, :arity => -2, :doc => "Performs a
5
+ standard priority lookup and returns the most specific value for a given key.
6
+ The returned value can be data of any type (strings, arrays, or hashes).
7
+
8
+ In addition to the required `key` argument, `hiera` accepts two additional
9
+ arguments:
10
+
11
+ - a `default` argument in the second position, providing a value to be
12
+ returned in the absence of matches to the `key` argument
13
+ - an `override` argument in the third position, providing a data source
14
+ to consult for matching values, even if it would not ordinarily be
15
+ part of the matched hierarchy. If Hiera doesn't find a matching key
16
+ in the named override data source, it will continue to search through the
17
+ rest of the hierarchy.
18
+
19
+ More thorough examples of `hiera` are available at:
20
+ <http://docs.puppetlabs.com/hiera/1/puppet.html#hiera-lookup-functions>
21
+ ") do |*args|
4
22
  key, default, override = HieraPuppet.parse_args(args)
5
23
  HieraPuppet.lookup(key, default, self, override, :priority)
6
24
  end
@@ -1,6 +1,25 @@
1
+ require 'hiera_puppet'
2
+
1
3
  module Puppet::Parser::Functions
2
- newfunction(:hiera_array, :type => :rvalue, :arity => -2) do |*args|
3
- require 'hiera_puppet'
4
+ newfunction(:hiera_array, :type => :rvalue, :arity => -2,:doc => "Returns all
5
+ matches throughout the hierarchy --- not just the first match --- as a flattened array of unique values.
6
+ If any of the matched values are arrays, they're flattened and included in the results.
7
+
8
+ In addition to the required `key` argument, `hiera_array` accepts two additional
9
+ arguments:
10
+
11
+ - a `default` argument in the second position, providing a string or array to be returned
12
+ in the absence of matches to the `key` argument
13
+ - an `override` argument in the third position, providing a data source to consult for
14
+ matching values, even if it would not ordinarily be part of the matched hierarchy.
15
+ If Hiera doesn't find a matching key in the named override data source, it will
16
+ continue to search through the rest of the hierarchy.
17
+
18
+ If any matched value is a hash, puppet will raise a type mismatch error.
19
+
20
+ More thorough examples of `hiera` are available at:
21
+ <http://docs.puppetlabs.com/hiera/1/puppet.html#hiera-lookup-functions>
22
+ ") do |*args|
4
23
  key, default, override = HieraPuppet.parse_args(args)
5
24
  HieraPuppet.lookup(key, default, self, override, :array)
6
25
  end
@@ -1,6 +1,27 @@
1
+ require 'hiera_puppet'
2
+
1
3
  module Puppet::Parser::Functions
2
- newfunction(:hiera_hash, :type => :rvalue, :arity => -2) do |*args|
3
- require 'hiera_puppet'
4
+ newfunction(:hiera_hash, :type => :rvalue, :arity => -2, :doc =>
5
+ "Returns a merged hash of matches from throughout the hierarchy. In cases where two or
6
+ more hashes share keys, the hierarchy order determines which key/value pair will be
7
+ used in the returned hash, with the pair in the highest priority data source winning.
8
+
9
+ In addition to the required `key` argument, `hiera_hash` accepts two additional
10
+ arguments:
11
+
12
+ - a `default` argument in the second position, providing a hash to be returned in the
13
+ absence of any matches for the `key` argument
14
+ - an `override` argument in the third position, providing a data source to insert at
15
+ the top of the hierarchy, even if it would not ordinarily match during a Hiera data
16
+ source lookup. If Hiera doesn't find a match in the named override data source, it will
17
+ continue to search through the rest of the hierarchy.
18
+
19
+ `hiera_hash` expects that all values returned will be hashes. If any of the values
20
+ found in the data sources are strings or arrays, puppet will raise a type mismatch error.
21
+
22
+ More thorough examples of `hiera_hash` are available at:
23
+ <http://docs.puppetlabs.com/hiera/1/puppet.html#hiera-lookup-functions>
24
+ ") do |*args|
4
25
  key, default, override = HieraPuppet.parse_args(args)
5
26
  HieraPuppet.lookup(key, default, self, override, :hash)
6
27
  end
@@ -1,6 +1,37 @@
1
+ require 'hiera_puppet'
2
+
1
3
  module Puppet::Parser::Functions
2
- newfunction(:hiera_include, :arity => -2) do |*args|
3
- require 'hiera_puppet'
4
+ newfunction(:hiera_include, :arity => -2, :doc => "Assigns classes to a node
5
+ using an array merge lookup that retrieves the value for a user-specified key
6
+ from a Hiera data source.
7
+
8
+ To use `hiera_include`, the following configuration is required:
9
+
10
+ - A key name to use for classes, e.g. `classes`.
11
+ - A line in the puppet `sites.pp` file (e.g. `/etc/puppet/manifests/sites.pp`)
12
+ reading `hiera_include('classes')`. Note that this line must be outside any node
13
+ definition and below any top-scope variables in use for Hiera lookups.
14
+ - Class keys in the appropriate data sources. In a data source keyed to a node's role,
15
+ one might have:
16
+
17
+ ---
18
+ classes:
19
+ - apache
20
+ - apache::passenger
21
+
22
+ In addition to the required `key` argument, `hiera_include` accepts two additional
23
+ arguments:
24
+
25
+ - a `default` argument in the second position, providing an array to be returned
26
+ in the absence of matches to the `key` argument
27
+ - an `override` argument in the third position, providing a data source to consult
28
+ for matching values, even if it would not ordinarily be part of the matched hierarchy.
29
+ If Hiera doesn't find a matching key in the named override data source, it will continue
30
+ to search through the rest of the hierarchy.
31
+
32
+ More thorough examples of `hiera_include` are available at:
33
+ <http://docs.puppetlabs.com/hiera/1/puppet.html#hiera-lookup-functions>
34
+ ") do |*args|
4
35
  key, default, override = HieraPuppet.parse_args(args)
5
36
  if answer = HieraPuppet.lookup(key, default, self, override, :array)
6
37
  method = Puppet::Parser::Functions.function(:include)
@@ -1,9 +1,9 @@
1
1
  Puppet::Parser::Functions::newfunction(:inline_template, :type => :rvalue, :arity => -2, :doc =>
2
- "Evaluate a template string and return its value. See
3
- [the templating docs](http://docs.puppetlabs.com/guides/templating.html) for
4
- more information. Note that if multiple template strings are specified, their
2
+ "Evaluate a template string and return its value. See
3
+ [the templating docs](http://docs.puppetlabs.com/guides/templating.html) for
4
+ more information. Note that if multiple template strings are specified, their
5
5
  output is all concatenated and returned as the output of the function.") do |vals|
6
-
6
+
7
7
  require 'erb'
8
8
 
9
9
  vals.collect do |string|
@@ -0,0 +1,74 @@
1
+ Puppet::Parser::Functions::newfunction(
2
+ :reduce,
3
+ :type => :rvalue,
4
+ :arity => -2,
5
+ :doc => <<-'ENDHEREDOC') do |args|
6
+ Applies a parameterized block to each element in a sequence of entries from the first
7
+ argument (_the collection_) and returns the last result of the invocation of the parameterized block.
8
+
9
+ This function takes two mandatory arguments: the first should be an Array or a Hash, and the last
10
+ a parameterized block as produced by the puppet syntax:
11
+
12
+ $a.reduce |$memo, $x| { ... }
13
+
14
+ When the first argument is an Array, the block is called with each entry in turn. When the first argument
15
+ is a hash each entry is converted to an array with `[key, value]` before being fed to the block. An optional
16
+ 'start memo' value may be supplied as an argument between the array/hash and mandatory block.
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 collection, and if the collection 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 invocations, the produced value of the invoked parameterized block is given as the memo in the
23
+ next invocation.
24
+
25
+ *Examples*
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
+ It is possible to provide a starting 'memo' as an argument.
38
+
39
+ *Examples*
40
+ # Reduce an array
41
+ $a = [1,2,3]
42
+ $a.reduce(4) |$memo, $entry| { $memo + $entry }
43
+ #=> 10
44
+
45
+ # Reduce hash values
46
+ $a = {a => 1, b => 2, c => 3}
47
+ $a.reduce([na, 4]) |$memo, $entry| { [sum, $memo[1]+$entry[1]] }
48
+ #=> [sum, 10]
49
+
50
+ Since 3.2
51
+ ENDHEREDOC
52
+
53
+ require 'puppet/parser/ast/lambda'
54
+ case args.length
55
+ when 2
56
+ pblock = args[1]
57
+ when 3
58
+ pblock = args[2]
59
+ else
60
+ raise ArgumentError, ("reduce(): wrong number of arguments (#{args.length}; must be 2 or 3)")
61
+ end
62
+ unless pblock.is_a? Puppet::Parser::AST::Lambda
63
+ raise ArgumentError, ("reduce(): wrong argument type (#{args[1].class}; must be a parameterized block.")
64
+ end
65
+ receiver = args[0]
66
+ unless [Array, Hash].include?(receiver.class)
67
+ raise ArgumentError, ("collect(): wrong argument type (#{args[0].class}; must be an Array or a Hash.")
68
+ end
69
+ if args.length == 3
70
+ receiver.reduce(args[1]) {|memo, x| pblock.call(self, memo, x) }
71
+ else
72
+ receiver.reduce {|memo, x| pblock.call(self, memo, x) }
73
+ end
74
+ end
@@ -0,0 +1,46 @@
1
+ require 'puppet/parser/ast/lambda'
2
+
3
+ Puppet::Parser::Functions::newfunction(
4
+ :reject,
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 entires for which the block did *not* evaluate to true.
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.reject |$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
+ The returned filtered object is of the same type as the receiver.
20
+
21
+ *Examples*
22
+
23
+ # selects all that does not end with berry
24
+ $a = ["rasberry", "blueberry", "orange"]
25
+ $a.reject |$x| { $x =~ /berry$/ }
26
+
27
+ Since 3.2
28
+ ENDHEREDOC
29
+
30
+ receiver = args[0]
31
+ pblock = args[1]
32
+
33
+ raise ArgumentError, ("reject(): 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
+ receiver.reject {|x| pblock.call(self, x) }
38
+ when Hash
39
+ result = receiver.reject {|x, y| pblock.call(self, [x, y]) }
40
+ # Ruby 1.8.7 returns Array
41
+ result = Hash[result] unless result.is_a? Hash
42
+ result
43
+ else
44
+ raise ArgumentError, ("reject(): wrong argument type (#{receiver.class}; must be an Array or a Hash.")
45
+ end
46
+ end
@@ -0,0 +1,46 @@
1
+ require 'puppet/parser/ast/lambda'
2
+
3
+ Puppet::Parser::Functions::newfunction(
4
+ :select,
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 entires for which the block evaluates to true.
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.select |$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
+ The returned filtered object is of the same type as the receiver.
20
+
21
+ *Examples*
22
+
23
+ # selects all that end with berry
24
+ $a = ["raspberry", "blueberry", "orange"]
25
+ $a.select |$x| { $x =~ /berry$/ }
26
+
27
+ Since 3.2
28
+ ENDHEREDOC
29
+
30
+ receiver = args[0]
31
+ pblock = args[1]
32
+
33
+ raise ArgumentError, ("select(): 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
+ receiver.select {|x| pblock.call(self, x) }
38
+ when Hash
39
+ result = receiver.select {|x, y| pblock.call(self, [x, y]) }
40
+ # Ruby 1.8.7 returns Array
41
+ result = Hash[result] unless result.is_a? Hash
42
+ result
43
+ else
44
+ raise ArgumentError, ("select(): wrong argument type (#{receiver.class}; must be an Array or a Hash.")
45
+ end
46
+ end
@@ -0,0 +1,96 @@
1
+ Puppet::Parser::Functions::newfunction(
2
+ :slice,
3
+ :type => :rvalue,
4
+ :arity => -2,
5
+ :doc => <<-'ENDHEREDOC') do |args|
6
+ Applies a parameterized block to each _slice_ of elements in a sequence of selected entries from the first
7
+ argument and returns the first argument, or if no block is given returns a new array with a concatenation of
8
+ the slices.
9
+
10
+ This function takes two mandatory arguments: the first should be an Array or a Hash, and the second
11
+ the number of elements to include in each slice. The optional third argument should be a
12
+ a parameterized block as produced by the puppet syntax:
13
+
14
+ |$x| { ... }
15
+
16
+ The parameterized block should have either one parameter (receiving an array with the slice), or the same number
17
+ of parameters as specified by the slice size (each parameter receiving its part of the slice).
18
+ In case there are fewer remaining elements than the slice size for the last slice it will contain the remaining
19
+ elements. When the block has multiple parameters, excess parameters are set to :undef for an array, and to
20
+ empty arrays for a Hash.
21
+
22
+ $a.slice(2) |$first, $second| { ... }
23
+
24
+ When the first argument is a Hash, each key,value entry is counted as one, e.g, a slice size of 2 will produce
25
+ an array of two arrays with key, value.
26
+
27
+ $a.slice(2) |$entry| { notice "first ${$entry[0]}, second ${$entry[1]}" }
28
+ $a.slice(2) |$first, $second| { notice "first ${first}, second ${second}" }
29
+
30
+ When called without a block, the function produces a concatenated result of the slices.
31
+
32
+ slice($[1,2,3,4,5,6], 2) # produces [[1,2], [3,4], [5,6]]
33
+
34
+ Since 3.2
35
+ ENDHEREDOC
36
+ require 'puppet/parser/ast/lambda'
37
+ require 'puppet/parser/scope'
38
+
39
+ def each_Common(o, slice_size, filler, scope, pblock)
40
+ serving_size = pblock ? pblock.parameter_count : 1
41
+ if serving_size == 0
42
+ raise ArgumentError, "Block must define at least one parameter."
43
+ end
44
+ unless serving_size == 1 || serving_size == slice_size
45
+ raise ArgumentError, "Block must define one parameter, or the same number of parameters as the given size of the slice (#{slice_size})."
46
+ end
47
+ enumerator = o.each_slice(slice_size)
48
+ result = []
49
+ if serving_size == 1
50
+ ((o.size.to_f / slice_size).ceil).times do
51
+ if pblock
52
+ pblock.call(scope, enumerator.next)
53
+ else
54
+ result << enumerator.next
55
+ end
56
+ end
57
+ else
58
+ ((o.size.to_f / slice_size).ceil).times do
59
+ a = enumerator.next
60
+ if a.size < serving_size
61
+ a = a.dup.fill(filler, a.length...serving_size)
62
+ end
63
+ pblock.call(scope, *a)
64
+ end
65
+ end
66
+ if pblock
67
+ o
68
+ else
69
+ result
70
+ end
71
+ end
72
+ raise ArgumentError, ("slice(): wrong number of arguments (#{args.length}; must be 2 or 3)") unless args.length == 2 || args.length == 3
73
+ if args.length >= 2
74
+ begin
75
+ slice_size = Puppet::Parser::Scope.number?(args[1])
76
+ rescue
77
+ raise ArgumentError, ("slice(): wrong argument type (#{args[1]}; must be number.")
78
+ end
79
+ end
80
+ raise ArgumentError, ("slice(): wrong argument type (#{args[1]}; must be number.") unless slice_size
81
+ raise ArgumentError, ("slice(): wrong argument value: #{slice_size}; is not an positive integer number > 0") unless slice_size.is_a?(Fixnum) && slice_size > 0
82
+ receiver = args[0]
83
+
84
+ # the block is optional, ok if nil, function then produces an array
85
+ pblock = args[2]
86
+ raise ArgumentError, ("slice(): wrong argument type (#{args[2].class}; must be a parameterized block.") unless pblock.is_a?(Puppet::Parser::AST::Lambda) || args.length == 2
87
+
88
+ case receiver
89
+ when Array
90
+ each_Common(receiver, slice_size, :undef, self, pblock)
91
+ when Hash
92
+ each_Common(receiver, slice_size, [], self, pblock)
93
+ else
94
+ raise ArgumentError, ("slice(): wrong argument type (#{args[0].class}; must be an Array or a Hash.")
95
+ end
96
+ end
@@ -1,8 +1,8 @@
1
1
  Puppet::Parser::Functions::newfunction(:template, :type => :rvalue, :arity => -2, :doc =>
2
2
  "Evaluate a template and return its value. See
3
- [the templating docs](http://docs.puppetlabs.com/guides/templating.html) for
3
+ [the templating docs](http://docs.puppetlabs.com/guides/templating.html) for
4
4
  more information.
5
-
5
+
6
6
  Note that if multiple templates are specified, their output is all
7
7
  concatenated and returned as the output of the function.") do |vals|
8
8
  vals.collect do |file|
@@ -12,13 +12,13 @@ token IF ELSE IMPORT DEFINE ELSIF VARIABLE CLASS INHERITS NODE BOOLEAN
12
12
  token NAME SEMIC CASE DEFAULT AT LCOLLECT RCOLLECT CLASSREF
13
13
  token NOT OR AND UNDEF PARROW PLUS MINUS TIMES DIV LSHIFT RSHIFT UMINUS
14
14
  token MATCH NOMATCH REGEX IN_EDGE OUT_EDGE IN_EDGE_SUB OUT_EDGE_SUB
15
- token IN UNLESS
15
+ token IN UNLESS MODULO
16
16
 
17
17
  prechigh
18
18
  right NOT
19
19
  nonassoc UMINUS
20
20
  left IN MATCH NOMATCH
21
- left TIMES DIV
21
+ left TIMES DIV MODULO
22
22
  left MINUS PLUS
23
23
  left LSHIFT RSHIFT
24
24
  left NOTEQUAL ISEQUAL
@@ -32,7 +32,7 @@ program: statements_and_declarations
32
32
  | nil
33
33
 
34
34
  statements_and_declarations: statement_or_declaration {
35
- result = ast AST::ASTArray, :children => (val[0] ? [val[0]] : [])
35
+ result = ast AST::BlockExpression, :children => (val[0] ? [val[0]] : [])
36
36
  }
37
37
  | statements_and_declarations statement_or_declaration {
38
38
  if val[1]
@@ -488,6 +488,9 @@ expression: rvalue
488
488
  }
489
489
  | expression TIMES expression {
490
490
  result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
491
+ }
492
+ | expression MODULO expression {
493
+ result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
491
494
  }
492
495
  | expression LSHIFT expression {
493
496
  result = ast AST::ArithmeticOperator, :operator => val[1][:value], :lval => val[0], :rval => val[2]
@@ -550,7 +553,7 @@ caseopt: casevalues COLON LBRACE statements RBRACE {
550
553
  AST::CaseOpt,
551
554
  :value => val[0],
552
555
 
553
- :statements => ast(AST::ASTArray)
556
+ :statements => ast(AST::BlockExpression)
554
557
  )
555
558
  }
556
559