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
@@ -3,7 +3,7 @@ require 'puppet/parameter'
3
3
  # This specialized {Puppet::Parameter} handles munging of package options.
4
4
  # Package options are passed as an array of key value pairs. Special munging is
5
5
  # required as the keys and values needs to be quoted in a safe way.
6
- #
6
+ #
7
7
  class Puppet::Parameter::PackageOptions < Puppet::Parameter
8
8
  def unsafe_munge(values)
9
9
  values = [values] unless values.is_a? Array
@@ -21,7 +21,7 @@ class Puppet::Parameter::Path < Puppet::Parameter
21
21
  # @raise [Puppet::Error] if this property is configured for single paths and an array is given
22
22
  # @raise [Puppet::Error] if a path is not an absolute path
23
23
  # @return [Array<String>] the given paths
24
- #
24
+ #
25
25
  def validate_path(paths)
26
26
  if paths.is_a?(Array) and ! self.class.arrays? then
27
27
  fail "#{name} only accepts a single path, not an array of paths"
@@ -7,7 +7,7 @@ require 'puppet/parameter/value_collection'
7
7
  #
8
8
  class Puppet::Parameter::Value
9
9
  attr_reader :name, :options, :event
10
- attr_accessor :block, :call, :method, :required_features
10
+ attr_accessor :block, :call, :method, :required_features, :invalidate_refreshes
11
11
 
12
12
  # Adds an alias for this value.
13
13
  # Makes the given _name_ be an alias for this acceptable value.
@@ -2,7 +2,7 @@ require 'puppet/parameter/value'
2
2
 
3
3
  # A collection of values and regular expressions, used for specifying allowed values
4
4
  # in a given parameter.
5
- # @note This class is considered part of the internal implementation of {Puppet::Parameter}, and
5
+ # @note This class is considered part of the internal implementation of {Puppet::Parameter}, and
6
6
  # {Puppet::Property} and the functionality provided by this class should be used via their interfaces.
7
7
  # @comment This class probably have several problems when trying to use it with a combination of
8
8
  # regular expressions and aliases as it finds an acceptable value holder vi "name" which may be
@@ -88,7 +88,7 @@ class Puppet::Parameter::ValueCollection
88
88
  end
89
89
 
90
90
  # Munges the value if it is valid, else produces the same value.
91
- # @param value [Object] the value to munge
91
+ # @param value [Object] the value to munge
92
92
  # @return [Object] the munged value, or the given value
93
93
  # @todo This method does not seem to do any munging. It just returns the value if it matches the
94
94
  # regexp, or the (most likely Symbolic) allowed value if it matches (which is more of a replacement
@@ -123,6 +123,10 @@ class Puppet::Parameter::ValueCollection
123
123
  # was possible to specify a value of `:before` or `:after` for the purpose of calling
124
124
  # both the block and the provider. Use of these deprecated options will now raise an exception later
125
125
  # in the process when the _is_ value is set (see Puppet::Property#set).
126
+ # @option options [Symbol] :invalidate_refreshes True if a change on this property should invalidate and
127
+ # remove any scheduled refreshes (from notify or subscribe) targeted at the same resource. For example, if
128
+ # a change in this property takes into account any changes that a scheduled refresh would have performed,
129
+ # then the scheduled refresh would be deleted.
126
130
  # @option options [Object] _any_ Any other option is treated as a call to a setter having the given
127
131
  # option name (e.g. `:required_features` calls `required_features=` with the option's value as an
128
132
  # argument).
@@ -187,7 +191,7 @@ class Puppet::Parameter::ValueCollection
187
191
  # Returns a valid value matcher (a literal or regular expression)
188
192
  # @todo This looks odd, asking for an instance that matches a symbol, or a instance that has
189
193
  # a regexp. What is the intention here? Marking as api private...
190
- #
194
+ #
191
195
  # @return [Puppet::Parameter::Value] a valid valud matcher
192
196
  # @api private
193
197
  #
@@ -14,7 +14,7 @@ class Puppet::Parser::AST
14
14
  include Puppet::Util::MethodHelper
15
15
  include Puppet::Util::Docs
16
16
 
17
- attr_accessor :parent, :scope, :file, :line
17
+ attr_accessor :parent, :scope, :file, :line, :pos
18
18
 
19
19
  def inspect
20
20
  "( #{self.class} #{self.to_s} #{@children.inspect} )"
@@ -110,8 +110,10 @@ require 'puppet/parser/ast/function'
110
110
  require 'puppet/parser/ast/hostclass'
111
111
  require 'puppet/parser/ast/ifstatement'
112
112
  require 'puppet/parser/ast/in_operator'
113
+ require 'puppet/parser/ast/lambda'
113
114
  require 'puppet/parser/ast/leaf'
114
115
  require 'puppet/parser/ast/match_operator'
116
+ require 'puppet/parser/ast/method_call'
115
117
  require 'puppet/parser/ast/minus'
116
118
  require 'puppet/parser/ast/node'
117
119
  require 'puppet/parser/ast/nop'
@@ -11,29 +11,73 @@ class Puppet::Parser::AST
11
11
  [@lval,@rval,@operator].each { |child| yield child }
12
12
  end
13
13
 
14
- # Returns a boolean which is the result of the boolean operation
15
- # of lval and rval operands
14
+ # Produces an object which is the result of the applying the operator to the of lval and rval operands.
15
+ # * Supports +, -, *, /, %, and <<, >> on numeric strings.
16
+ # * Supports + on arrays (concatenate), and hashes (merge)
17
+ # * Supports << on arrays (append)
18
+ #
16
19
  def evaluate(scope)
17
20
  # evaluate the operands, should return a boolean value
18
- lval = @lval.safeevaluate(scope)
19
- lval = Puppet::Parser::Scope.number?(lval)
20
- if lval == nil
21
- raise ArgumentError, "left operand of #{@operator} is not a number"
21
+ left = @lval.safeevaluate(scope)
22
+ right = @rval.safeevaluate(scope)
23
+
24
+ if left.is_a?(Array) || right.is_a?(Array)
25
+ eval_array(left, right)
26
+ elsif left.is_a?(Hash) || right.is_a?(Hash)
27
+ eval_hash(left, right)
28
+ else
29
+ eval_numeric(left, right)
22
30
  end
23
- rval = @rval.safeevaluate(scope)
24
- rval = Puppet::Parser::Scope.number?(rval)
25
- if rval == nil
26
- raise ArgumentError, "right operand of #{@operator} is not a number"
31
+ end
32
+
33
+ # Concatenates (+) two arrays, or appends (<<) any object to a newly created array.
34
+ #
35
+ def eval_array(left, right)
36
+ assert_concatenation_supported()
37
+
38
+ raise ArgumentError, "operator #{@operator} is not applicable when one of the operands is an Array." unless %w{+ <<}.include?(@operator)
39
+ raise ArgumentError, "left operand of #{@operator} must be an Array" unless left.is_a?(Array)
40
+ if @operator == '+'
41
+ raise ArgumentError, "right operand of #{@operator} must be an Array when left is an Array." unless right.is_a?(Array)
42
+ return left + right
27
43
  end
44
+ # only append case remains, left asserted to be an array, and right may be any object
45
+ # wrapping right in an array and adding it ensures a new copy (operator << mutates).
46
+ #
47
+ left + [right]
48
+ end
49
+
50
+ # Merges two hashes.
51
+ #
52
+ def eval_hash(left, right)
53
+ assert_concatenation_supported()
54
+
55
+ raise ArgumentError, "operator #{@operator} is not applicable when one of the operands is an Hash." unless @operator == '+'
56
+ raise ArgumentError, "left operand of #{@operator} must be an Hash" unless left.is_a?(Hash)
57
+ raise ArgumentError, "right operand of #{@operator} must be an Hash" unless right.is_a?(Hash)
58
+ # merge produces a merged copy
59
+ left.merge(right)
60
+ end
61
+
62
+ def eval_numeric(left, right)
63
+ left = Puppet::Parser::Scope.number?(left)
64
+ right = Puppet::Parser::Scope.number?(right)
65
+ raise ArgumentError, "left operand of #{@operator} is not a number" unless left != nil
66
+ raise ArgumentError, "right operand of #{@operator} is not a number" unless right != nil
28
67
 
29
68
  # compute result
30
- lval.send(@operator, rval)
69
+ left.send(@operator, right)
70
+ end
71
+
72
+ def assert_concatenation_supported
73
+ return if Puppet[:parser] == 'future'
74
+ raise ParseError.new("Unsupported Operation: Array concatenation available with '--parser future' setting only.")
31
75
  end
32
76
 
33
77
  def initialize(hash)
34
78
  super
35
79
 
36
- raise ArgumentError, "Invalid arithmetic operator #{@operator}" unless %w{+ - * / << >>}.include?(@operator)
80
+ raise ArgumentError, "Invalid arithmetic operator #{@operator}" unless %w{+ - * / % << >>}.include?(@operator)
37
81
  end
38
82
  end
39
83
  end
@@ -9,7 +9,7 @@ class Puppet::Parser::AST
9
9
  class ASTArray < Branch
10
10
  include Enumerable
11
11
 
12
- # Return a child by index. Probably never used.
12
+ # Return a child by index. Used (at least) by tests.
13
13
  def [](index)
14
14
  @children[index]
15
15
  end
@@ -0,0 +1,41 @@
1
+ require 'puppet/parser/ast/branch'
2
+
3
+ class Puppet::Parser::AST
4
+ class BlockExpression < Branch
5
+ include Enumerable
6
+
7
+ # Evaluate contained expressions, produce result of the last
8
+ def evaluate(scope)
9
+ result = nil
10
+ @children.each do |child|
11
+ # Skip things that respond to :instantiate (classes, nodes,
12
+ # and definitions), because they have already been
13
+ # instantiated.
14
+ if !child.respond_to?(:instantiate)
15
+ result = child.safeevaluate(scope)
16
+ end
17
+ end
18
+ result
19
+ end
20
+
21
+ # Return a child by index.
22
+ def [](index)
23
+ @children[index]
24
+ end
25
+
26
+ def push(*ary)
27
+ ary.each { |child|
28
+ #Puppet.debug "adding %s(%s) of type %s to %s" %
29
+ # [child, child.object_id, child.class.to_s.sub(/.+::/,''),
30
+ # self.object_id]
31
+ @children.push(child)
32
+ }
33
+
34
+ self
35
+ end
36
+
37
+ def to_s
38
+ "[" + @children.collect { |c| c.to_s }.join(', ') + "]"
39
+ end
40
+ end
41
+ end
@@ -6,7 +6,7 @@ class Puppet::Parser::AST
6
6
 
7
7
  associates_doc
8
8
 
9
- attr_accessor :name, :arguments
9
+ attr_accessor :name, :arguments, :pblock
10
10
 
11
11
  def evaluate(scope)
12
12
  # Make sure it's a defined function
@@ -16,8 +16,16 @@ class Puppet::Parser::AST
16
16
  case @ftype
17
17
  when :rvalue
18
18
  raise Puppet::ParseError, "Function '#{@name}' does not return a value" unless Puppet::Parser::Functions.rvalue?(@name)
19
+
19
20
  when :statement
20
- if Puppet::Parser::Functions.rvalue?(@name)
21
+ # It is harmless to produce an ignored rvalue, the alternative is to mark functions
22
+ # as appropriate for both rvalue and statements
23
+ # Keeping the old behavior when a pblock is not present. This since it is not known
24
+ # if the lambda contains a statement or not (at least not without a costly search).
25
+ # The purpose of the check is to protect a user for producing a meaningless rvalue where the
26
+ # operation has no side effects.
27
+ #
28
+ if !pblock && Puppet::Parser::Functions.rvalue?(@name)
21
29
  raise Puppet::ParseError,
22
30
  "Function '#{@name}' must be the value of a statement"
23
31
  end
@@ -28,6 +36,9 @@ class Puppet::Parser::AST
28
36
  # We don't need to evaluate the name, because it's plaintext
29
37
  args = @arguments.safeevaluate(scope).map { |x| x == :undef ? '' : x }
30
38
 
39
+ # append a puppet lambda (unevaluated) if it is defined
40
+ args << pblock if pblock
41
+
31
42
  scope.send("function_#{@name}", args)
32
43
  end
33
44
 
@@ -0,0 +1,107 @@
1
+ require 'puppet/parser/ast/block_expression'
2
+
3
+ class Puppet::Parser::AST
4
+ # A block of statements/expressions with additional parameters
5
+ # Requires scope to contain the values for the defined parameters when evaluated
6
+ # If evaluated without a prepared scope, the lambda will behave like its super class.
7
+ #
8
+ class Lambda < AST::BlockExpression
9
+
10
+ # The lambda parameters.
11
+ # These are encoded as an array where each entry is an array of one or two object. The first
12
+ # is the parameter name, and the optional second object is the value expression (that will
13
+ # be evaluated when bound to a scope).
14
+ # The value expression is the default value for the parameter. All default values must be
15
+ # at the end of the parameter list.
16
+ #
17
+ # @return [Array<Array<String,String>>] list of parameter names with optional value expression
18
+ attr_accessor :parameters
19
+ # Evaluates each expression/statement and produce the last expression evaluation result
20
+ # @return [Object] what the last expression evaluated to
21
+ def evaluate(scope)
22
+ if @children.is_a? Puppet::Parser::AST::ASTArray
23
+ result = nil
24
+ @children.each {|expr| result = expr.evaluate(scope) }
25
+ result
26
+ else
27
+ @children.evaluate(scope)
28
+ end
29
+ end
30
+
31
+ # Calls the lambda.
32
+ # Assigns argument values in a nested local scope that should be used to evaluate the lambda
33
+ # and then evaluates the lambda.
34
+ # @param scope [Puppet::Scope] the calling scope
35
+ # @return [Object] the result of evaluating the expression(s) in the lambda
36
+ #
37
+ def call(scope, *args)
38
+ raise Puppet::ParseError, "Too many arguments: #{args.size} for #{parameters.size}" unless args.size <= parameters.size
39
+ merged = parameters.zip(args)
40
+ missing = merged.select { |e| !e[1] && e[0].size == 1 }
41
+ unless missing.empty?
42
+ optional = parameters.count { |p| p.size == 2 }
43
+ raise Puppet::ParseError, "Too few arguments; #{args.size} for #{optional > 0 ? ' min ' : ''}#{parameters.size - optional}"
44
+ end
45
+
46
+ evaluated = merged.collect do |m|
47
+ # Ruby 1.8.7 zip seems to produce a different result than Ruby 1.9.3 in some situations
48
+ n = m[0].is_a?(Array) ? m[0][0] : m[0]
49
+ v = m[1] || (m[0][1]).safeevaluate(scope) # given value or default expression value
50
+ [n, v]
51
+ end
52
+
53
+ # Store the evaluated name => value associations in a new inner/local/ephemeral scope
54
+ # (This is made complicated due to the fact that the implementation of scope is overloaded with
55
+ # functionality and an inner ephemeral scope must be used (as opposed to just pushing a local scope
56
+ # on a scope "stack").
57
+ begin
58
+ elevel = scope.ephemeral_level
59
+ scope.ephemeral_from(Hash[evaluated], file, line)
60
+ result = safeevaluate(scope)
61
+ ensure
62
+ scope.unset_ephemeral_var(elevel)
63
+ result ||= nil
64
+ end
65
+ result
66
+ end
67
+
68
+ # Validates the lambda.
69
+ # Validation checks if parameters with default values are at the end of the list. (It is illegal
70
+ # to have a parameter with default value followed by one without).
71
+ #
72
+ # @raise [Puppet::ParseError] if a parameter with a default comes before a parameter without default value
73
+ #
74
+ def validate
75
+ params = parameters || []
76
+ defaults = params.drop_while {|p| p.size < 2 }
77
+ trailing = defaults.drop_while {|p| p.size == 2 }
78
+ raise Puppet::ParseError, "Lambda parameters with default values must be placed last" unless trailing.empty?
79
+ end
80
+
81
+ # Returns the number of parameters (required and optional)
82
+ # @return [Integer] the total number of accepted parameters
83
+ def parameter_count
84
+ @parameters.size
85
+ end
86
+
87
+ # Returns the number of optional parameters.
88
+ # @return [Integer] the number of optional accepted parameters
89
+ def optional_parameter_count
90
+ @parameters.count {|p| p.size == 2 }
91
+ end
92
+
93
+ def initialize(options)
94
+ super(options)
95
+ # ensure there is an empty parameters structure if not given by creator
96
+ @parameters = [] unless options[:parameters]
97
+ validate
98
+ end
99
+
100
+ def to_s
101
+ result = ["{|"]
102
+ result += @parameters.collect {|p| "#{p[0]}" + (p.size == 2 && p[1]) ? p[1].to_s() : '' }.join(', ')
103
+ result << "| ... }"
104
+ result.join('')
105
+ end
106
+ end
107
+ end
@@ -140,7 +140,7 @@ class Puppet::Parser::AST
140
140
 
141
141
  def array_index_or_key(object, key)
142
142
  if object.is_a?(Array)
143
- raise Puppet::ParserError, "#{key} is not an integer, but is used as an index of an array" unless key = Puppet::Parser::Scope.number?(key)
143
+ raise Puppet::ParseError, "#{key} is not an integer, but is used as an index of an array" unless key = Puppet::Parser::Scope.number?(key)
144
144
  end
145
145
  key
146
146
  end
@@ -148,7 +148,6 @@ class Puppet::Parser::AST
148
148
  def evaluate(scope)
149
149
  object = evaluate_container(scope)
150
150
  accesskey = evaluate_key(scope)
151
-
152
151
  raise Puppet::ParseError, "#{variable} is not an hash or array when accessing it with #{accesskey}" unless object.is_a?(Hash) or object.is_a?(Array)
153
152
 
154
153
  object[array_index_or_key(object, accesskey)] || :undef
@@ -0,0 +1,77 @@
1
+ require 'puppet/parser/ast/branch'
2
+ require 'puppet/parser/methods'
3
+
4
+ class Puppet::Parser::AST
5
+ # An AST object to call a method
6
+ class MethodCall < AST::Branch
7
+
8
+ associates_doc
9
+
10
+ # An AST that evaluates to the object the method is applied to
11
+ # @return [Puppet::Parser::AST]
12
+ attr_accessor :receiver
13
+
14
+ # The name of the method
15
+ # @return [String]
16
+ attr_accessor :name
17
+
18
+ # The arguments to evaluate as arguments to the method.
19
+ # @return [Array<Puppet::Parser::AST>]
20
+ attr_accessor :arguments
21
+
22
+ # An optional lambda/block that will be yielded to by the called method (if it supports this)
23
+ # @return [Puppet::Parser::AST::Lambda]
24
+ attr_accessor :lambda
25
+
26
+ # Evaluates the method call and returns what the called method/function returns.
27
+ # The evaluation evaluates all arguments in the calling scope and then delegates
28
+ # to a "method" instance produced by Puppet::Parser::Methods for this method call.
29
+ # @see Puppet::Parser::Methods
30
+ # @return [Object] what the called method/function returns
31
+ def evaluate(scope)
32
+ # Make sure it's a defined method for the receiver
33
+ r = @receiver.evaluate(scope)
34
+ raise Puppet::ParseError, "No object to apply method #{@name} to" unless r
35
+ m = Puppet::Parser::Methods.find_method(scope, r, @name)
36
+ raise Puppet::ParseError, "Unknown method #{@name} for #{r}" unless m
37
+
38
+ # Now check if rvalue is required (in expressions)
39
+ case @ftype
40
+ when :rvalue
41
+ raise Puppet::ParseError, "Method '#{@name}' does not return a value" unless m.is_rvalue?
42
+ when :statement
43
+ # When used as a statement, ignore if it produces a rvalue (it is simply not used)
44
+ else
45
+ raise Puppet::DevError, "Invalid method type #{@ftype.inspect}"
46
+ end
47
+
48
+ # Evaluate arguments
49
+ args = @arguments ? @arguments.safeevaluate(scope).map { |x| x == :undef ? '' : x } : []
50
+
51
+ # There is no need to evaluate the name, since it is a literal ruby string
52
+
53
+ # call the method (it is already bound to the receiver and name)
54
+ m.invoke(scope, args, @lambda)
55
+ end
56
+
57
+ def initialize(hash)
58
+ @ftype = hash[:ftype] || :rvalue
59
+ hash.delete(:ftype) if hash.include? :ftype
60
+
61
+ super(hash)
62
+
63
+ # Lastly, check the parity
64
+ end
65
+
66
+ # Sets this method call in statement mode where a produced rvalue is ignored.
67
+ # @return [void]
68
+ def ignore_rvalue
69
+ @ftype = :statement
70
+ end
71
+
72
+ def to_s
73
+ args = arguments.is_a?(ASTArray) ? arguments.to_s.gsub(/\[(.*)\]/,'\1') : arguments
74
+ "#{@receiver.to_s}.#{name} (#{args})" + (@lambda ? " #{@lambda.to_s}" : '')
75
+ end
76
+ end
77
+ end