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
@@ -0,0 +1,62 @@
1
+ module Puppet; end
2
+
3
+ module Puppet::Parser
4
+ # The ParserFactory makes selection of parser possible.
5
+ # Currently, it is possible to switch between two different parsers:
6
+ # * classic_parser, the parser in 3.1
7
+ # * eparser, the Expression Based Parser
8
+ #
9
+ class ParserFactory
10
+ # Produces a parser instance for the given environment
11
+ def self.parser(environment)
12
+ case Puppet[:parser]
13
+ when 'future'
14
+ eparser(environment)
15
+ else
16
+ classic_parser(environment)
17
+ end
18
+ end
19
+
20
+ # Creates an instance of the classic parser.
21
+ #
22
+ def self.classic_parser(environment)
23
+ require 'puppet/parser'
24
+ Puppet::Parser::Parser.new(environment)
25
+ end
26
+
27
+ # Creates an instance of the expression based parser 'eparser'
28
+ #
29
+ def self.eparser(environment)
30
+ # Since RGen is optional, test that it is installed
31
+ @@asserted ||= false
32
+ assert_rgen_installed() unless @asserted
33
+ require 'puppet/parser'
34
+ require 'puppet/parser/e_parser_adapter'
35
+ EParserAdapter.new(Puppet::Parser::Parser.new(environment))
36
+ end
37
+
38
+ private
39
+
40
+ def self.assert_rgen_installed
41
+ begin
42
+ require 'rgen/metamodel_builder'
43
+ rescue LoadError
44
+ raise Puppet::DevError.new("The gem 'rgen' version >= 0.6.1 is required when using the setting '--parser future'. Please install 'rgen'.")
45
+ end
46
+ # Since RGen is optional, there is nothing specifying its version.
47
+ # It is not installed in any controlled way, so not possible to use gems to check (it may be installed some other way).
48
+ # Instead check that "eContainer, and eContainingFeature" has been installed.
49
+ require 'puppet/pops'
50
+ begin
51
+ litstring = Puppet::Pops::Model::LiteralString.new();
52
+ container = Puppet::Pops::Model::ArithmeticExpression.new();
53
+ container.left_expr = litstring
54
+ raise "no eContainer" if litstring.eContainer() != container
55
+ raise "no eContainingFeature" if litstring.eContainingFeature() != :left_expr
56
+ rescue =>e
57
+ raise Puppet::DevError.new("The gem 'rgen' version >= 0.6.1 is required when using '--parser future'. An older version is installed, please update.")
58
+ end
59
+ end
60
+ end
61
+
62
+ end
@@ -38,6 +38,11 @@ class Puppet::Parser::Parser
38
38
  ast AST::ASTArray, :children => [arg]
39
39
  end
40
40
 
41
+ # Create an AST block containing a single element
42
+ def block(arg)
43
+ ast AST::BlockExpression, :children => [arg]
44
+ end
45
+
41
46
  # Create an AST object, and automatically add the file and line information if
42
47
  # available.
43
48
  def ast(klass, hash = {})
@@ -146,9 +151,10 @@ class Puppet::Parser::Parser
146
151
  rescue Puppet::ParseError => except
147
152
  except.line ||= @lexer.line
148
153
  except.file ||= @lexer.file
154
+ except.pos ||= @lexer.pos
149
155
  raise except
150
156
  rescue => except
151
- raise Puppet::ParseError.new(except.message, @lexer.file, @lexer.line, except)
157
+ raise Puppet::ParseError.new(except.message, @lexer.file, @lexer.line, nil, except)
152
158
  end
153
159
  end
154
160
  # Store the results as the top-level class.
@@ -166,6 +172,6 @@ class Puppet::Parser::Parser
166
172
  main_object.instance_eval(File.read(self.file))
167
173
 
168
174
  # Then extract any types that were created.
169
- Puppet::Parser::AST::ASTArray.new :children => main_object.instance_eval { @__created_ast_objects__ }
175
+ Puppet::Parser::AST::BlockExpression.new :children => main_object.instance_eval { @__created_ast_objects__ }
170
176
  end
171
177
  end
@@ -2,7 +2,7 @@
2
2
  # such.
3
3
  require 'forwardable'
4
4
 
5
- require 'puppet/parser/parser'
5
+ require 'puppet/parser'
6
6
  require 'puppet/parser/templatewrapper'
7
7
 
8
8
  require 'puppet/resource/type_collection_helper'
@@ -42,12 +42,13 @@ class Puppet::Parser::Scope
42
42
  class Ephemeral
43
43
  extend Forwardable
44
44
 
45
- def initialize(parent=nil)
45
+ def initialize(parent=nil, local=false)
46
46
  @symbols = {}
47
47
  @parent = parent
48
+ @local_scope = local
48
49
  end
49
50
 
50
- def_delegators :@symbols, :include?, :delete, :[]=
51
+ def_delegators :@symbols, :delete, :[]=, :each
51
52
 
52
53
  def [](name)
53
54
  if @symbols.include?(name) or @parent.nil?
@@ -56,6 +57,23 @@ class Puppet::Parser::Scope
56
57
  @parent[name]
57
58
  end
58
59
  end
60
+
61
+ def include?(name)
62
+ bound?(name) or (@parent and @parent.include?(name))
63
+ end
64
+
65
+ def bound?(name)
66
+ @symbols.include?(name)
67
+ end
68
+
69
+ def is_local_scope?
70
+ @local_scope
71
+ end
72
+
73
+ # @return [Ephemeral, Hash, nil]
74
+ def parent
75
+ @parent
76
+ end
59
77
  end
60
78
 
61
79
  # Initialize a new scope suitable for parser function testing. This method
@@ -164,14 +182,9 @@ class Puppet::Parser::Scope
164
182
  @tags = []
165
183
 
166
184
  # The symbol table for this scope. This is where we store variables.
167
- @symtable = {}
185
+ @symtable = Ephemeral.new
168
186
 
169
- # the ephemeral symbol tables
170
- # those should not persist long, and are used for the moment only
171
- # for $0..$xy capture variables of regexes
172
- # this is actually implemented as a stack, with each ephemeral scope
173
- # shadowing the previous one
174
- @ephemeral = [ Ephemeral.new ]
187
+ @ephemeral = [ Ephemeral.new(@symtable) ]
175
188
 
176
189
  # All of the defaults set for types. It's a hash of hashes,
177
190
  # with the first key being the type, then the second key being
@@ -257,27 +270,21 @@ class Puppet::Parser::Scope
257
270
  raise Puppet::DevError, "Scope variable name is a #{name.class}, not a string"
258
271
  end
259
272
 
260
- # Save the originating scope for the request
261
- options[:origin] = self unless options[:origin]
262
- table = ephemeral?(name) ? @ephemeral.last : @symtable
273
+ table = @ephemeral.last
263
274
 
264
275
  if name =~ /^(.*)::(.+)$/
265
- begin
266
- qualified_scope($1).lookupvar($2, options.merge({:origin => nil}))
267
- rescue RuntimeError => e
268
- location = (options[:file] && (options[:line] || options[:lineproc])) ? " at #{options[:file]}:#{options[:line]|| options[:lineproc].call}" : ''
269
- warning "Could not look up qualified variable '#{name}'; #{e.message}#{location}"
270
- nil
271
- end
272
- # If the value is present and either we are top/node scope or originating scope...
273
- elsif (ephemeral_include?(name) or table.include?(name)) and (compiler and self == compiler.topscope or (resource and resource.type == "Node") or self == options[:origin])
276
+ class_name = $1
277
+ variable_name = $2
278
+ lookup_qualified_variable(class_name, variable_name, options)
279
+ elsif table.include?(name)
274
280
  table[name]
275
- elsif resource and resource.type == "Class" and parent_type = resource.resource_type.parent
276
- qualified_scope(parent_type).lookupvar(name, options.merge({:origin => nil}))
277
- elsif parent
278
- parent.lookupvar(name, options)
279
281
  else
280
- nil
282
+ next_scope = inherited_scope || enclosing_scope
283
+ if next_scope
284
+ next_scope.lookupvar(name, options)
285
+ else
286
+ nil
287
+ end
281
288
  end
282
289
  end
283
290
 
@@ -295,6 +302,75 @@ class Puppet::Parser::Scope
295
302
  lookupvar(varname, options)
296
303
  end
297
304
 
305
+ # The scope of the inherited thing of this scope's resource. This could
306
+ # either be a node that was inherited or the class.
307
+ #
308
+ # @returns [Puppet::Parser::Scope] The scope or nil if there is not an inherited scope
309
+ def inherited_scope
310
+ if has_inherited_class?
311
+ qualified_scope(resource.resource_type.parent)
312
+ else
313
+ nil
314
+ end
315
+ end
316
+
317
+ # The enclosing scope (topscope or nodescope) of this scope.
318
+ # The enclosing scopes are produced when a class or define is included at
319
+ # some point. The parent scope of the included class or define becomes the
320
+ # scope in which it was included. The chain of parent scopes is followed
321
+ # until a node scope or the topscope is found
322
+ #
323
+ # @returns [Puppet::Parser::Scope] The scope or nil if there is no enclosing scope
324
+ def enclosing_scope
325
+ if has_enclosing_scope?
326
+ if parent.is_topscope? or parent.is_nodescope?
327
+ parent
328
+ else
329
+ parent.enclosing_scope
330
+ end
331
+ else
332
+ nil
333
+ end
334
+ end
335
+
336
+ def is_classscope?
337
+ resource and resource.type == "Class"
338
+ end
339
+
340
+ def is_nodescope?
341
+ resource and resource.type == "Node"
342
+ end
343
+
344
+ def is_topscope?
345
+ compiler and self == compiler.topscope
346
+ end
347
+
348
+ def lookup_qualified_variable(class_name, variable_name, position)
349
+ begin
350
+ qualified_scope(class_name).lookupvar(variable_name, position)
351
+ rescue RuntimeError => e
352
+ location = if position[:lineproc]
353
+ " at #{position[:lineproc].call}"
354
+ elsif position[:file] && position[:line]
355
+ " at #{position[:file]}:#{position[:line]}"
356
+ else
357
+ ""
358
+ end
359
+ warning "Could not look up qualified variable '#{class_name}::#{variable_name}'; #{e.message}#{location}"
360
+ nil
361
+ end
362
+ end
363
+
364
+ def has_inherited_class?
365
+ is_classscope? and resource.resource_type.parent
366
+ end
367
+ private :has_inherited_class?
368
+
369
+ def has_enclosing_scope?
370
+ not parent.nil?
371
+ end
372
+ private :has_enclosing_scope?
373
+
298
374
  def qualified_scope(classname)
299
375
  raise "class #{classname} could not be found" unless klass = find_hostclass(classname)
300
376
  raise "class #{classname} has not been evaluated" unless kscope = class_scope(klass)
@@ -361,12 +437,15 @@ class Puppet::Parser::Scope
361
437
  # It's preferred that you use self[]= instead of this; only use this
362
438
  # when you need to set options.
363
439
  def setvar(name, value, options = {})
440
+ if name =~ /^[0-9]+$/
441
+ raise Puppet::ParseError.new("Cannot assign to a numeric match result variable '$#{name}'") unless options[:ephemeral]
442
+ end
364
443
  unless name.is_a? String
365
444
  raise Puppet::DevError, "Scope variable name is a #{name.class}, not a string"
366
445
  end
367
446
 
368
- table = options[:ephemeral] ? @ephemeral.last : @symtable
369
- if table.include?(name)
447
+ table = effective_symtable options[:ephemeral]
448
+ if table.bound?(name)
370
449
  if options[:append]
371
450
  error = Puppet::ParseError.new("Cannot append, variable #{name} is defined in this scope")
372
451
  else
@@ -379,9 +458,26 @@ class Puppet::Parser::Scope
379
458
 
380
459
  if options[:append]
381
460
  table[name] = append_value(undef_as('', self[name]), value)
382
- else
461
+ else
383
462
  table[name] = value
384
463
  end
464
+ table[name]
465
+ end
466
+
467
+ # Return the effective "table" for setting variables.
468
+ # This method returns the first ephemeral "table" that acts as a local scope, or this
469
+ # scope's symtable. If the parameter `use_ephemeral` is true, the "top most" ephemeral "table"
470
+ # will be returned (irrespective of it being a match scope or a local scope).
471
+ #
472
+ # @param [Boolean] whether the top most ephemeral (of any kind) should be used or not
473
+ def effective_symtable use_ephemeral
474
+ s = @ephemeral.last
475
+ return s if use_ephemeral
476
+
477
+ while s && !(s.is_a?(Hash) || s.is_local_scope?())
478
+ s = s.parent
479
+ end
480
+ s ? s : @symtable
385
481
  end
386
482
 
387
483
  # Sets the variable value of the name given as an argument to the given value. The value is
@@ -407,7 +503,7 @@ class Puppet::Parser::Scope
407
503
  bound_value.merge(new_value)
408
504
  else
409
505
  if bound_value.is_a?(Hash)
410
- raise ArgumentError, "Trying to append to a hash with something which is not a hash is unsupported"
506
+ raise ArgumentError, "Trying to append to a hash with something which is not a hash is unsupported"
411
507
  end
412
508
  bound_value + new_value
413
509
  end
@@ -425,7 +521,7 @@ class Puppet::Parser::Scope
425
521
  # remove ephemeral scope up to level
426
522
  def unset_ephemeral_var(level=:all)
427
523
  if level == :all
428
- @ephemeral = [ Ephemeral.new ]
524
+ @ephemeral = [ Ephemeral.new(@symtable)]
429
525
  else
430
526
  # If we ever drop 1.8.6 and lower, this should be replaced by a single
431
527
  # pop-with-a-count - or if someone more ambitious wants to monkey-patch
@@ -436,32 +532,41 @@ class Puppet::Parser::Scope
436
532
  end
437
533
  end
438
534
 
439
- # check if name exists in one of the ephemeral scope.
535
+ # check if name exists in one of the ephemeral scopes.
440
536
  def ephemeral_include?(name)
441
537
  @ephemeral.any? {|eph| eph.include?(name) }
442
538
  end
443
539
 
444
- # is name an ephemeral variable?
540
+ # Checks whether the variable should be processed in the ephemeral scope or not.
541
+ # All numerical variables are processed in ephemeral scope at all times, and all other
542
+ # variables when the ephemeral scope is a local scope.
543
+ #
445
544
  def ephemeral?(name)
446
- name =~ /^\d+$/
545
+ @ephemeral.last.is_local_scope? || name =~ /^\d+$/
447
546
  end
448
547
 
449
548
  def ephemeral_level
450
549
  @ephemeral.size
451
550
  end
452
551
 
453
- def new_ephemeral
454
- @ephemeral.push(Ephemeral.new(@ephemeral.last))
552
+ def new_ephemeral(local_scope = false)
553
+ @ephemeral.push(Ephemeral.new(@ephemeral.last, local_scope))
455
554
  end
456
555
 
457
556
  def ephemeral_from(match, file = nil, line = nil)
458
- raise(ArgumentError,"Invalid regex match data") unless match.is_a?(MatchData)
459
-
460
- new_ephemeral
461
-
462
- setvar("0", match[0], :file => file, :line => line, :ephemeral => true)
463
- match.captures.each_with_index do |m,i|
464
- setvar("#{i+1}", m, :file => file, :line => line, :ephemeral => true)
557
+ case match
558
+ when Hash
559
+ # Create local scope ephemeral and set all values from hash
560
+ new_ephemeral true
561
+ match.each {|k,v| setvar(k, v, :file => file, :line => line, :ephemeral => true) }
562
+ else
563
+ raise(ArgumentError,"Invalid regex match data. Got a #{match.class}") unless match.is_a?(MatchData)
564
+ # Create a match ephemeral and set values from match data
565
+ new_ephemeral false
566
+ setvar("0", match[0], :file => file, :line => line, :ephemeral => true)
567
+ match.captures.each_with_index do |m,i|
568
+ setvar("#{i+1}", m, :file => file, :line => line, :ephemeral => true)
569
+ end
465
570
  end
466
571
  end
467
572
 
@@ -481,14 +586,15 @@ class Puppet::Parser::Scope
481
586
 
482
587
  def method_missing(method, *args, &block)
483
588
  method.to_s =~ /^function_(.*)$/
484
- super unless $1
485
- super unless Puppet::Parser::Functions.function($1)
589
+ name = $1
590
+ super unless name
591
+ super unless Puppet::Parser::Functions.function(name)
486
592
  # In odd circumstances, this might not end up defined by the previous
487
593
  # method, so we might as well be certain.
488
594
  if respond_to? method
489
595
  send(method, *args)
490
596
  else
491
- raise Puppet::DevError, "Function #{$1} not defined despite being loaded!"
597
+ raise Puppet::DevError, "Function #{name} not defined despite being loaded!"
492
598
  end
493
599
  end
494
600
 
@@ -1,10 +1,11 @@
1
- # A simple wrapper for templates, so they don't have full access to
2
- # the scope objects.
3
1
  require 'puppet/parser/files'
4
2
  require 'erb'
5
3
 
4
+ # A simple wrapper for templates, so they don't have full access to
5
+ # the scope objects.
6
+ #
7
+ # @api private
6
8
  class Puppet::Parser::TemplateWrapper
7
- attr_writer :scope
8
9
  include Puppet::Util
9
10
  Puppet::Util.logmethods(self)
10
11
 
@@ -12,41 +13,47 @@ class Puppet::Parser::TemplateWrapper
12
13
  @__scope__ = scope
13
14
  end
14
15
 
16
+ # @return [String] The full path name of the template that is being executed
17
+ # @api public
15
18
  def file
16
19
  @__file__
17
20
  end
18
21
 
22
+ # @return [Puppet::Parser::Scope] The scope in which the template is evaluated
23
+ # @api public
19
24
  def scope
20
25
  @__scope__
21
26
  end
22
27
 
23
- def script_line_proc
24
- # find which line in the template (if any) we were called from
25
- # but defer to when necessary since fetching the caller information on
26
- # every variable lookup can be quite time consuming
27
- Proc.new { (caller.find { |l| l =~ /#{@__file__}:/ }||"")[/:(\d+):/,1] }
28
- end
29
-
28
+ # Find which line in the template (if any) we were called from.
29
+ # @return [String] the line number
30
+ # @api private
30
31
  def script_line
31
- script_line_proc.call
32
+ identifier = Regexp.escape(@__file__ || "(erb)")
33
+ (caller.find { |l| l =~ /#{identifier}:/ }||"")[/:(\d+):/,1]
32
34
  end
35
+ private :script_line
33
36
 
34
37
  # Should return true if a variable is defined, false if it is not
38
+ # @api public
35
39
  def has_variable?(name)
36
40
  scope.include?(name.to_s)
37
41
  end
38
42
 
39
- # Allow templates to access the defined classes
43
+ # @return [Array<String>] The list of defined classes
44
+ # @api public
40
45
  def classes
41
46
  scope.catalog.classes
42
47
  end
43
48
 
44
- # Allow templates to access the tags defined in the current scope
49
+ # @return [Array<String>] The tags defined in the current scope
50
+ # @api public
45
51
  def tags
46
52
  scope.tags
47
53
  end
48
54
 
49
- # Allow templates to access the all the defined tags
55
+ # @return [Array<String>] All the defined tags
56
+ # @api public
50
57
  def all_tags
51
58
  scope.catalog.tags
52
59
  end
@@ -64,15 +71,18 @@ class Puppet::Parser::TemplateWrapper
64
71
  # the missing_method definition here until we declare the syntax finally
65
72
  # dead.
66
73
  def method_missing(name, *args)
74
+ line_number = script_line
67
75
  if scope.include?(name.to_s)
68
- return scope[name.to_s, {:file => @__file__, :lineproc => script_line_proc}]
76
+ Puppet.deprecation_warning("Variable access via '#{name}' is deprecated. Use '@#{name}' instead. #{to_s}:#{line_number}")
77
+ return scope[name.to_s, { :file => @__file__, :line => line_number }]
69
78
  else
70
79
  # Just throw an error immediately, instead of searching for
71
80
  # other missingmethod things or whatever.
72
- raise Puppet::ParseError.new("Could not find value for '#{name}'", @__file__, script_line)
81
+ raise Puppet::ParseError.new("Could not find value for '#{name}'", @__file__, line_number)
73
82
  end
74
83
  end
75
84
 
85
+ # @api private
76
86
  def file=(filename)
77
87
  unless @__file__ = Puppet::Parser::Files.find_template(filename, scope.compiler.environment.to_s)
78
88
  raise Puppet::ParseError, "Could not find template '#{filename}'"
@@ -82,6 +92,7 @@ class Puppet::Parser::TemplateWrapper
82
92
  scope.known_resource_types.watch_file(@__file__)
83
93
  end
84
94
 
95
+ # @api private
85
96
  def result(string = nil)
86
97
  if string
87
98
  template_source = "inline template"
@@ -95,11 +106,7 @@ class Puppet::Parser::TemplateWrapper
95
106
  # to the regular methods.
96
107
  benchmark(:debug, "Bound template variables for #{template_source}") do
97
108
  scope.to_hash.each do |name, value|
98
- if name.kind_of?(String)
99
- realname = name.gsub(/[^\w]/, "_")
100
- else
101
- realname = name
102
- end
109
+ realname = name.gsub(/[^\w]/, "_")
103
110
  instance_variable_set("@#{realname}", value)
104
111
  end
105
112
  end