puppet 3.1.1 → 3.2.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (477) hide show
  1. data/CONTRIBUTING.md +2 -2
  2. data/Gemfile +32 -19
  3. data/README_DEVELOPER.md +332 -14
  4. data/Rakefile +9 -5
  5. data/ext/build_defaults.yaml +2 -3
  6. data/ext/debian/changelog.erb +6 -0
  7. data/ext/debian/control +6 -6
  8. data/ext/envpuppet +4 -4
  9. data/ext/project_data.yaml +1 -0
  10. data/ext/puppet-nm-dispatcher +13 -0
  11. data/ext/redhat/puppet.spec.erb +17 -0
  12. data/ext/suse/client.init +1 -1
  13. data/ext/systemd/puppetagent.service +2 -2
  14. data/ext/systemd/puppetmaster.service +2 -2
  15. data/lib/hiera/scope.rb +29 -11
  16. data/lib/hiera_puppet.rb +1 -3
  17. data/lib/puppet/agent.rb +3 -3
  18. data/lib/puppet/application.rb +2 -2
  19. data/lib/puppet/application/agent.rb +27 -12
  20. data/lib/puppet/application/apply.rb +11 -1
  21. data/lib/puppet/application/describe.rb +1 -1
  22. data/lib/puppet/application/doc.rb +13 -9
  23. data/lib/puppet/application/filebucket.rb +0 -1
  24. data/lib/puppet/application/kick.rb +1 -0
  25. data/lib/puppet/application/master.rb +16 -8
  26. data/lib/puppet/daemon.rb +19 -64
  27. data/lib/puppet/defaults.rb +61 -5
  28. data/lib/puppet/error.rb +15 -4
  29. data/lib/puppet/external/nagios/grammar.ry +1 -1
  30. data/lib/puppet/external/nagios/makefile +1 -1
  31. data/lib/puppet/external/nagios/parser.rb +185 -618
  32. data/lib/puppet/external/pson/pure/parser.rb +47 -1
  33. data/lib/puppet/face/certificate.rb +3 -3
  34. data/lib/puppet/face/module.rb +1 -1
  35. data/lib/puppet/face/module/changes.rb +3 -1
  36. data/lib/puppet/face/module/uninstall.rb +1 -1
  37. data/lib/puppet/face/node/clean.rb +5 -5
  38. data/lib/puppet/feature/base.rb +3 -1
  39. data/lib/puppet/feature/libuser.rb +8 -0
  40. data/lib/puppet/file_serving/fileset.rb +9 -1
  41. data/lib/puppet/forge.rb +28 -5
  42. data/lib/puppet/forge/errors.rb +34 -0
  43. data/lib/puppet/forge/repository.rb +1 -1
  44. data/lib/puppet/indirector.rb +4 -1
  45. data/lib/puppet/indirector/catalog/compiler.rb +37 -30
  46. data/lib/puppet/indirector/facts/inventory_active_record.rb +1 -0
  47. data/lib/puppet/indirector/indirection.rb +28 -15
  48. data/lib/puppet/indirector/rest.rb +18 -10
  49. data/lib/puppet/interface.rb +11 -4
  50. data/lib/puppet/interface/action.rb +1 -3
  51. data/lib/puppet/interface/action_builder.rb +0 -3
  52. data/lib/puppet/interface/action_manager.rb +0 -3
  53. data/lib/puppet/interface/face_collection.rb +0 -2
  54. data/lib/puppet/interface/option.rb +0 -2
  55. data/lib/puppet/interface/option_builder.rb +0 -2
  56. data/lib/puppet/interface/option_manager.rb +0 -2
  57. data/lib/puppet/metatype/manager.rb +1 -1
  58. data/lib/puppet/module_tool.rb +1 -0
  59. data/lib/puppet/module_tool/applications/application.rb +0 -3
  60. data/lib/puppet/module_tool/applications/builder.rb +8 -20
  61. data/lib/puppet/module_tool/applications/checksummer.rb +1 -1
  62. data/lib/puppet/module_tool/applications/installer.rb +1 -0
  63. data/lib/puppet/module_tool/applications/unpacker.rb +3 -11
  64. data/lib/puppet/module_tool/checksums.rb +1 -1
  65. data/lib/puppet/module_tool/errors/installer.rb +18 -1
  66. data/lib/puppet/module_tool/modulefile.rb +2 -2
  67. data/lib/puppet/module_tool/skeleton/templates/generator/Modulefile.erb +1 -1
  68. data/lib/puppet/module_tool/tar.rb +17 -0
  69. data/lib/puppet/module_tool/tar/gnu.rb +9 -0
  70. data/lib/puppet/module_tool/tar/mini.rb +39 -0
  71. data/lib/puppet/module_tool/tar/solaris.rb +5 -0
  72. data/lib/puppet/network/http.rb +1 -0
  73. data/lib/puppet/network/http/connection.rb +9 -23
  74. data/lib/puppet/network/http/handler.rb +38 -7
  75. data/lib/puppet/network/http/rack/rest.rb +14 -3
  76. data/lib/puppet/network/http/webrick.rb +3 -1
  77. data/lib/puppet/network/http/webrick/rest.rb +11 -2
  78. data/lib/puppet/node/environment.rb +3 -1
  79. data/lib/puppet/parameter.rb +32 -29
  80. data/lib/puppet/parameter/package_options.rb +1 -1
  81. data/lib/puppet/parameter/path.rb +1 -1
  82. data/lib/puppet/parameter/value.rb +1 -1
  83. data/lib/puppet/parameter/value_collection.rb +7 -3
  84. data/lib/puppet/parser/ast.rb +3 -1
  85. data/lib/puppet/parser/ast/arithmetic_operator.rb +56 -12
  86. data/lib/puppet/parser/ast/astarray.rb +1 -1
  87. data/lib/puppet/parser/ast/block_expression.rb +41 -0
  88. data/lib/puppet/parser/ast/function.rb +13 -2
  89. data/lib/puppet/parser/ast/lambda.rb +107 -0
  90. data/lib/puppet/parser/ast/leaf.rb +1 -2
  91. data/lib/puppet/parser/ast/method_call.rb +77 -0
  92. data/lib/puppet/parser/ast/vardef.rb +7 -0
  93. data/lib/puppet/parser/compiler.rb +27 -16
  94. data/lib/puppet/parser/e_parser_adapter.rb +120 -0
  95. data/lib/puppet/parser/files.rb +7 -6
  96. data/lib/puppet/parser/functions.rb +10 -8
  97. data/lib/puppet/parser/functions/collect.rb +43 -0
  98. data/lib/puppet/parser/functions/each.rb +96 -0
  99. data/lib/puppet/parser/functions/foreach.rb +96 -0
  100. data/lib/puppet/parser/functions/fqdn_rand.rb +2 -2
  101. data/lib/puppet/parser/functions/hiera.rb +20 -2
  102. data/lib/puppet/parser/functions/hiera_array.rb +21 -2
  103. data/lib/puppet/parser/functions/hiera_hash.rb +23 -2
  104. data/lib/puppet/parser/functions/hiera_include.rb +33 -2
  105. data/lib/puppet/parser/functions/inline_template.rb +4 -4
  106. data/lib/puppet/parser/functions/reduce.rb +74 -0
  107. data/lib/puppet/parser/functions/reject.rb +46 -0
  108. data/lib/puppet/parser/functions/select.rb +46 -0
  109. data/lib/puppet/parser/functions/slice.rb +96 -0
  110. data/lib/puppet/parser/functions/template.rb +2 -2
  111. data/lib/puppet/parser/grammar.ra +7 -4
  112. data/lib/puppet/parser/lexer.rb +10 -0
  113. data/lib/puppet/parser/methods.rb +69 -0
  114. data/lib/puppet/parser/parser.rb +855 -808
  115. data/lib/puppet/parser/parser_factory.rb +62 -0
  116. data/lib/puppet/parser/parser_support.rb +8 -2
  117. data/lib/puppet/parser/scope.rb +153 -47
  118. data/lib/puppet/parser/templatewrapper.rb +28 -21
  119. data/lib/puppet/parser/type_loader.rb +3 -1
  120. data/lib/puppet/pops.rb +40 -0
  121. data/lib/puppet/pops/adaptable.rb +190 -0
  122. data/lib/puppet/pops/adapters.rb +65 -0
  123. data/lib/puppet/pops/containment.rb +37 -0
  124. data/lib/puppet/pops/issues.rb +258 -0
  125. data/lib/puppet/pops/label_provider.rb +71 -0
  126. data/lib/puppet/pops/model/ast_transformer.rb +636 -0
  127. data/lib/puppet/pops/model/ast_tree_dumper.rb +378 -0
  128. data/lib/puppet/pops/model/factory.rb +804 -0
  129. data/lib/puppet/pops/model/model.rb +567 -0
  130. data/lib/puppet/pops/model/model_label_provider.rb +75 -0
  131. data/lib/puppet/pops/model/model_tree_dumper.rb +352 -0
  132. data/lib/puppet/pops/model/tree_dumper.rb +59 -0
  133. data/lib/puppet/pops/parser/egrammar.ra +723 -0
  134. data/lib/puppet/pops/parser/eparser.rb +2300 -0
  135. data/lib/puppet/pops/parser/grammar.ra +746 -0
  136. data/lib/puppet/pops/parser/lexer.rb +842 -0
  137. data/lib/puppet/pops/parser/makefile +13 -0
  138. data/lib/puppet/pops/parser/parser_support.rb +203 -0
  139. data/lib/puppet/pops/patterns.rb +35 -0
  140. data/lib/puppet/pops/utils.rb +104 -0
  141. data/lib/puppet/pops/validation.rb +297 -0
  142. data/lib/puppet/pops/validation/checker3_1.rb +551 -0
  143. data/lib/puppet/pops/validation/validator_factory_3_1.rb +41 -0
  144. data/lib/puppet/pops/visitable.rb +6 -0
  145. data/lib/puppet/pops/visitor.rb +50 -0
  146. data/lib/puppet/property.rb +37 -28
  147. data/lib/puppet/property/ensure.rb +2 -2
  148. data/lib/puppet/property/ordered_list.rb +1 -1
  149. data/lib/puppet/provider.rb +26 -30
  150. data/lib/puppet/provider/aixobject.rb +45 -44
  151. data/lib/puppet/provider/augeas/augeas.rb +0 -1
  152. data/lib/puppet/provider/confiner.rb +1 -1
  153. data/lib/puppet/provider/cron/crontab.rb +107 -67
  154. data/lib/puppet/provider/group/groupadd.rb +59 -3
  155. data/lib/puppet/provider/interface/cisco.rb +4 -4
  156. data/lib/puppet/provider/mount/parsed.rb +1 -1
  157. data/lib/puppet/provider/nameservice.rb +22 -6
  158. data/lib/puppet/provider/nameservice/pw.rb +1 -1
  159. data/lib/puppet/provider/package/aix.rb +28 -4
  160. data/lib/puppet/provider/package/gem.rb +0 -2
  161. data/lib/puppet/provider/package/macports.rb +1 -1
  162. data/lib/puppet/provider/package/nim.rb +249 -4
  163. data/lib/puppet/provider/package/opkg.rb +77 -0
  164. data/lib/puppet/provider/package/pacman.rb +2 -2
  165. data/lib/puppet/provider/package/rpm.rb +30 -16
  166. data/lib/puppet/provider/package/yum.rb +3 -3
  167. data/lib/puppet/provider/parsedfile.rb +80 -3
  168. data/lib/puppet/provider/selmodule/semodule.rb +2 -2
  169. data/lib/puppet/provider/service/debian.rb +0 -4
  170. data/lib/puppet/provider/service/freebsd.rb +2 -2
  171. data/lib/puppet/provider/service/gentoo.rb +0 -9
  172. data/lib/puppet/provider/service/init.rb +27 -2
  173. data/lib/puppet/provider/service/launchd.rb +1 -1
  174. data/lib/puppet/provider/service/openwrt.rb +36 -0
  175. data/lib/puppet/provider/service/redhat.rb +0 -9
  176. data/lib/puppet/provider/service/src.rb +38 -4
  177. data/lib/puppet/provider/service/systemd.rb +2 -2
  178. data/lib/puppet/provider/service/upstart.rb +1 -8
  179. data/lib/puppet/provider/user/aix.rb +4 -10
  180. data/lib/puppet/provider/user/pw.rb +6 -10
  181. data/lib/puppet/provider/user/useradd.rb +129 -31
  182. data/lib/puppet/provider/vlan/cisco.rb +4 -4
  183. data/lib/puppet/reference/function.rb +2 -2
  184. data/lib/puppet/reference/indirection.rb +46 -5
  185. data/lib/puppet/reference/metaparameter.rb +2 -2
  186. data/lib/puppet/reports.rb +5 -5
  187. data/lib/puppet/reports/rrdgraph.rb +4 -4
  188. data/lib/puppet/reports/tagmail.rb +1 -1
  189. data/lib/puppet/resource.rb +1 -1
  190. data/lib/puppet/resource/type.rb +13 -11
  191. data/lib/puppet/scheduler.rb +16 -0
  192. data/lib/puppet/scheduler/job.rb +53 -0
  193. data/lib/puppet/scheduler/scheduler.rb +45 -0
  194. data/lib/puppet/scheduler/splay_job.rb +32 -0
  195. data/lib/puppet/scheduler/timer.rb +13 -0
  196. data/lib/puppet/settings/base_setting.rb +1 -1
  197. data/lib/puppet/simple_graph.rb +4 -4
  198. data/lib/puppet/ssl/base.rb +12 -2
  199. data/lib/puppet/ssl/certificate.rb +4 -1
  200. data/lib/puppet/ssl/certificate_request.rb +4 -1
  201. data/lib/puppet/ssl/certificate_revocation_list.rb +4 -1
  202. data/lib/puppet/ssl/configuration.rb +32 -0
  203. data/lib/puppet/ssl/host.rb +18 -21
  204. data/lib/puppet/ssl/key.rb +4 -1
  205. data/lib/puppet/ssl/validator.rb +116 -0
  206. data/lib/puppet/transaction.rb +1 -1
  207. data/lib/puppet/transaction/event.rb +3 -10
  208. data/lib/puppet/transaction/event_manager.rb +8 -1
  209. data/lib/puppet/transaction/report.rb +17 -16
  210. data/lib/puppet/type.rb +77 -69
  211. data/lib/puppet/type/cron.rb +20 -8
  212. data/lib/puppet/type/exec.rb +9 -3
  213. data/lib/puppet/type/file.rb +95 -21
  214. data/lib/puppet/type/file/content.rb +1 -1
  215. data/lib/puppet/type/file/mode.rb +7 -1
  216. data/lib/puppet/type/file/source.rb +2 -2
  217. data/lib/puppet/type/group.rb +11 -0
  218. data/lib/puppet/type/scheduled_task.rb +5 -1
  219. data/lib/puppet/type/service.rb +1 -1
  220. data/lib/puppet/type/ssh_authorized_key.rb +2 -2
  221. data/lib/puppet/type/user.rb +24 -6
  222. data/lib/puppet/util.rb +12 -2
  223. data/lib/puppet/util/classgen.rb +4 -4
  224. data/lib/puppet/util/colors.rb +55 -0
  225. data/lib/puppet/util/command_line/trollop.rb +4 -4
  226. data/lib/puppet/util/errors.rb +39 -3
  227. data/lib/puppet/util/fileparsing.rb +5 -0
  228. data/lib/puppet/util/filetype.rb +11 -9
  229. data/lib/puppet/util/instrumentation/instrumentable.rb +2 -2
  230. data/lib/puppet/util/libuser.conf +15 -0
  231. data/lib/puppet/util/libuser.rb +12 -0
  232. data/lib/puppet/util/monkey_patches.rb +48 -0
  233. data/lib/puppet/util/network_device.rb +1 -1
  234. data/lib/puppet/util/network_device/base.rb +2 -2
  235. data/lib/puppet/util/network_device/cisco/device.rb +29 -19
  236. data/lib/puppet/util/network_device/config.rb +5 -2
  237. data/lib/puppet/util/network_device/ipcalc.rb +1 -1
  238. data/lib/puppet/util/network_device/transport/ssh.rb +4 -3
  239. data/lib/puppet/util/network_device/transport/telnet.rb +4 -2
  240. data/lib/puppet/util/plugins.rb +4 -4
  241. data/lib/puppet/util/posix.rb +1 -1
  242. data/lib/puppet/util/profiler.rb +28 -0
  243. data/lib/puppet/util/profiler/logging.rb +47 -0
  244. data/lib/puppet/util/profiler/none.rb +8 -0
  245. data/lib/puppet/util/profiler/object_counts.rb +17 -0
  246. data/lib/puppet/util/profiler/wall_clock.rb +34 -0
  247. data/lib/puppet/util/provider_features.rb +1 -1
  248. data/lib/puppet/util/rdoc/parser.rb +5 -5
  249. data/lib/puppet/util/ssl.rb +38 -0
  250. data/lib/puppet/util/subclass_loader.rb +1 -5
  251. data/lib/puppet/util/windows.rb +1 -0
  252. data/lib/puppet/util/windows/process.rb +3 -0
  253. data/lib/puppet/util/windows/root_certs.rb +86 -0
  254. data/lib/puppet/util/windows/security.rb +1 -0
  255. data/lib/puppet/version.rb +1 -1
  256. data/spec/fixtures/integration/provider/cron/crontab/create_normal_entry +19 -0
  257. data/spec/fixtures/integration/provider/cron/crontab/create_special_entry +18 -0
  258. data/spec/fixtures/integration/provider/cron/crontab/crontab_user1 +15 -0
  259. data/spec/fixtures/integration/provider/cron/crontab/crontab_user2 +4 -0
  260. data/spec/fixtures/integration/provider/cron/crontab/modify_entry +13 -0
  261. data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input1 +15 -0
  262. data/spec/fixtures/integration/provider/cron/crontab/moved_cronjob_input2 +6 -0
  263. data/spec/fixtures/integration/provider/cron/crontab/remove_named_resource +12 -0
  264. data/spec/fixtures/integration/provider/cron/crontab/remove_unnamed_resource +14 -0
  265. data/spec/fixtures/unit/pops/parser/lexer/aliastest.pp +16 -0
  266. data/spec/fixtures/unit/pops/parser/lexer/append.pp +11 -0
  267. data/spec/fixtures/unit/pops/parser/lexer/argumentdefaults.pp +14 -0
  268. data/spec/fixtures/unit/pops/parser/lexer/arithmetic_expression.pp +8 -0
  269. data/spec/fixtures/unit/pops/parser/lexer/arraytrailingcomma.pp +3 -0
  270. data/spec/fixtures/unit/pops/parser/lexer/casestatement.pp +65 -0
  271. data/spec/fixtures/unit/pops/parser/lexer/classheirarchy.pp +15 -0
  272. data/spec/fixtures/unit/pops/parser/lexer/classincludes.pp +17 -0
  273. data/spec/fixtures/unit/pops/parser/lexer/classpathtest.pp +11 -0
  274. data/spec/fixtures/unit/pops/parser/lexer/collection.pp +10 -0
  275. data/spec/fixtures/unit/pops/parser/lexer/collection_override.pp +8 -0
  276. data/spec/fixtures/unit/pops/parser/lexer/collection_within_virtual_definitions.pp +20 -0
  277. data/spec/fixtures/unit/pops/parser/lexer/componentmetaparams.pp +11 -0
  278. data/spec/fixtures/unit/pops/parser/lexer/componentrequire.pp +8 -0
  279. data/spec/fixtures/unit/pops/parser/lexer/deepclassheirarchy.pp +23 -0
  280. data/spec/fixtures/unit/pops/parser/lexer/defineoverrides.pp +17 -0
  281. data/spec/fixtures/unit/pops/parser/lexer/emptyclass.pp +9 -0
  282. data/spec/fixtures/unit/pops/parser/lexer/emptyexec.pp +3 -0
  283. data/spec/fixtures/unit/pops/parser/lexer/emptyifelse.pp +9 -0
  284. data/spec/fixtures/unit/pops/parser/lexer/falsevalues.pp +3 -0
  285. data/spec/fixtures/unit/pops/parser/lexer/filecreate.pp +11 -0
  286. data/spec/fixtures/unit/pops/parser/lexer/fqdefinition.pp +5 -0
  287. data/spec/fixtures/unit/pops/parser/lexer/fqparents.pp +11 -0
  288. data/spec/fixtures/unit/pops/parser/lexer/funccomma.pp +5 -0
  289. data/spec/fixtures/unit/pops/parser/lexer/hash.pp +33 -0
  290. data/spec/fixtures/unit/pops/parser/lexer/ifexpression.pp +12 -0
  291. data/spec/fixtures/unit/pops/parser/lexer/implicititeration.pp +15 -0
  292. data/spec/fixtures/unit/pops/parser/lexer/multilinecomments.pp +10 -0
  293. data/spec/fixtures/unit/pops/parser/lexer/multipleclass.pp +9 -0
  294. data/spec/fixtures/unit/pops/parser/lexer/multipleinstances.pp +7 -0
  295. data/spec/fixtures/unit/pops/parser/lexer/multisubs.pp +13 -0
  296. data/spec/fixtures/unit/pops/parser/lexer/namevartest.pp +9 -0
  297. data/spec/fixtures/unit/pops/parser/lexer/scopetest.pp +13 -0
  298. data/spec/fixtures/unit/pops/parser/lexer/selectorvalues.pp +49 -0
  299. data/spec/fixtures/unit/pops/parser/lexer/simpledefaults.pp +5 -0
  300. data/spec/fixtures/unit/pops/parser/lexer/simpleselector.pp +38 -0
  301. data/spec/fixtures/unit/pops/parser/lexer/singleary.pp +19 -0
  302. data/spec/fixtures/unit/pops/parser/lexer/singlequote.pp +11 -0
  303. data/spec/fixtures/unit/pops/parser/lexer/singleselector.pp +22 -0
  304. data/spec/fixtures/unit/pops/parser/lexer/subclass_name_duplication.pp +11 -0
  305. data/spec/fixtures/unit/pops/parser/lexer/tag.pp +9 -0
  306. data/spec/fixtures/unit/pops/parser/lexer/tagged.pp +35 -0
  307. data/spec/fixtures/unit/pops/parser/lexer/virtualresources.pp +14 -0
  308. data/spec/fixtures/unit/provider/cron/crontab/single_line.yaml +4 -4
  309. data/spec/fixtures/unit/provider/cron/crontab/vixie_header.txt +3 -0
  310. data/spec/fixtures/unit/provider/cron/parsed/managed +6 -0
  311. data/spec/fixtures/unit/provider/cron/parsed/simple +9 -0
  312. data/spec/fixtures/unit/provider/parsedfile/simple.txt +4 -0
  313. data/spec/fixtures/unit/provider/service/systemd/list_units +18 -0
  314. data/spec/integration/parser/collector_spec.rb +1 -1
  315. data/spec/integration/parser/compiler_spec.rb +252 -227
  316. data/spec/integration/parser/parser_spec.rb +171 -53
  317. data/spec/integration/parser/scope_spec.rb +1 -1
  318. data/spec/integration/provider/cron/crontab_spec.rb +187 -0
  319. data/spec/integration/provider/service/systemd_spec.rb +20 -0
  320. data/spec/integration/type/file_spec.rb +21 -21
  321. data/spec/integration/type/package_spec.rb +1 -1
  322. data/spec/lib/puppet_spec/database.rb +2 -5
  323. data/spec/spec_helper.rb +6 -1
  324. data/spec/unit/application/apply_spec.rb +16 -1
  325. data/spec/unit/application/describe_spec.rb +1 -1
  326. data/spec/unit/application/doc_spec.rb +55 -32
  327. data/spec/unit/application/kick_spec.rb +8 -6
  328. data/spec/unit/application/master_spec.rb +4 -4
  329. data/spec/unit/daemon_spec.rb +1 -1
  330. data/spec/unit/forge/errors_spec.rb +40 -0
  331. data/spec/unit/forge/repository_spec.rb +11 -1
  332. data/spec/unit/forge_spec.rb +13 -3
  333. data/spec/unit/hiera/backend/puppet_backend_spec.rb +1 -0
  334. data/spec/unit/hiera/scope_spec.rb +48 -25
  335. data/spec/unit/indirector/catalog/active_record_spec.rb +6 -3
  336. data/spec/unit/indirector/catalog/compiler_spec.rb +3 -28
  337. data/spec/unit/indirector/catalog/static_compiler_spec.rb +1 -1
  338. data/spec/unit/indirector/facts/inventory_active_record_spec.rb +154 -150
  339. data/spec/unit/indirector/indirection_spec.rb +5 -0
  340. data/spec/unit/indirector/resource/active_record_spec.rb +5 -22
  341. data/spec/unit/indirector_spec.rb +7 -1
  342. data/spec/unit/interface/action_builder_spec.rb +1 -1
  343. data/spec/unit/interface/action_manager_spec.rb +0 -2
  344. data/spec/unit/interface/action_spec.rb +1 -1
  345. data/spec/unit/interface/documentation_spec.rb +0 -2
  346. data/spec/unit/interface/face_collection_spec.rb +1 -1
  347. data/spec/unit/interface/option_builder_spec.rb +1 -1
  348. data/spec/unit/interface/option_spec.rb +0 -1
  349. data/spec/unit/module_spec.rb +17 -19
  350. data/spec/unit/module_tool/application_spec.rb +1 -3
  351. data/spec/unit/module_tool/applications/builder_spec.rb +38 -0
  352. data/spec/unit/module_tool/applications/checksummer_spec.rb +134 -0
  353. data/spec/unit/module_tool/applications/installer_spec.rb +71 -91
  354. data/spec/unit/module_tool/applications/searcher_spec.rb +1 -3
  355. data/spec/unit/module_tool/applications/uninstaller_spec.rb +18 -26
  356. data/spec/unit/module_tool/applications/unpacker_spec.rb +19 -52
  357. data/spec/unit/module_tool/tar/gnu_spec.rb +19 -0
  358. data/spec/unit/module_tool/tar/mini_spec.rb +59 -0
  359. data/spec/unit/module_tool/tar/solaris_spec.rb +19 -0
  360. data/spec/unit/network/http/connection_spec.rb +17 -2
  361. data/spec/unit/network/http/handler_spec.rb +195 -167
  362. data/spec/unit/network/http/rack/rest_spec.rb +26 -4
  363. data/spec/unit/network/http/webrick/rest_spec.rb +28 -1
  364. data/spec/unit/network/http/webrick_spec.rb +12 -3
  365. data/spec/unit/node/environment_spec.rb +421 -404
  366. data/spec/unit/parser/ast/arithmetic_operator_spec.rb +98 -2
  367. data/spec/unit/parser/collector_spec.rb +4 -4
  368. data/spec/unit/parser/compiler_spec.rb +13 -13
  369. data/spec/unit/parser/eparser_adapter_spec.rb +407 -0
  370. data/spec/unit/parser/functions/extlookup_spec.rb +20 -17
  371. data/spec/unit/parser/functions/fqdn_rand_spec.rb +5 -0
  372. data/spec/unit/parser/functions/hiera_include_spec.rb +0 -2
  373. data/spec/unit/parser/functions/hiera_spec.rb +0 -2
  374. data/spec/unit/parser/functions_spec.rb +27 -15
  375. data/spec/unit/parser/methods/collect_spec.rb +110 -0
  376. data/spec/unit/parser/methods/each_spec.rb +91 -0
  377. data/spec/unit/parser/methods/foreach_spec.rb +91 -0
  378. data/spec/unit/parser/methods/reduce_spec.rb +67 -0
  379. data/spec/unit/parser/methods/reject_spec.rb +73 -0
  380. data/spec/unit/parser/methods/select_spec.rb +79 -0
  381. data/spec/unit/parser/methods/shared.rb +61 -0
  382. data/spec/unit/parser/methods/slice_spec.rb +97 -0
  383. data/spec/unit/parser/parser_spec.rb +2 -2
  384. data/spec/unit/parser/scope_spec.rb +39 -16
  385. data/spec/unit/parser/templatewrapper_spec.rb +6 -5
  386. data/spec/unit/parser/type_loader_spec.rb +191 -165
  387. data/spec/unit/pops/adaptable_spec.rb +143 -0
  388. data/spec/unit/pops/containment_spec.rb +25 -0
  389. data/spec/unit/pops/factory_rspec_helper.rb +77 -0
  390. data/spec/unit/pops/factory_spec.rb +329 -0
  391. data/spec/unit/pops/issues_spec.rb +26 -0
  392. data/spec/unit/pops/label_provider_spec.rb +42 -0
  393. data/spec/unit/pops/model/ast_transformer_spec.rb +65 -0
  394. data/spec/unit/pops/model/model_spec.rb +37 -0
  395. data/spec/unit/pops/parser/lexer_spec.rb +884 -0
  396. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +248 -0
  397. data/spec/unit/pops/parser/parse_calls_spec.rb +93 -0
  398. data/spec/unit/pops/parser/parse_conditionals_spec.rb +159 -0
  399. data/spec/unit/pops/parser/parse_containers_spec.rb +175 -0
  400. data/spec/unit/pops/parser/parse_resource_spec.rb +228 -0
  401. data/spec/unit/pops/parser/parser_rspec_helper.rb +11 -0
  402. data/spec/unit/pops/parser/parser_spec.rb +15 -0
  403. data/spec/unit/pops/parser/rgen_sanitycheck_spec.rb +16 -0
  404. data/spec/unit/pops/transformer/transform_basic_expressions_spec.rb +243 -0
  405. data/spec/unit/pops/transformer/transform_calls_spec.rb +80 -0
  406. data/spec/unit/pops/transformer/transform_conditionals_spec.rb +132 -0
  407. data/spec/unit/pops/transformer/transform_containers_spec.rb +182 -0
  408. data/spec/unit/pops/transformer/transform_resource_spec.rb +185 -0
  409. data/spec/unit/pops/transformer/transformer_rspec_helper.rb +27 -0
  410. data/spec/unit/pops/visitor_spec.rb +94 -0
  411. data/spec/unit/property_spec.rb +11 -0
  412. data/spec/unit/provider/augeas/augeas_spec.rb +3 -0
  413. data/spec/unit/provider/cron/crontab_spec.rb +97 -7
  414. data/spec/unit/provider/cron/parsed_spec.rb +325 -0
  415. data/spec/unit/provider/exec/posix_spec.rb +1 -1
  416. data/spec/unit/provider/group/groupadd_spec.rb +33 -3
  417. data/spec/unit/provider/group/pw_spec.rb +5 -5
  418. data/spec/unit/provider/nameservice_spec.rb +304 -0
  419. data/spec/unit/provider/package/aix_spec.rb +53 -11
  420. data/spec/unit/provider/package/aptrpm_spec.rb +6 -0
  421. data/spec/unit/provider/package/gem_spec.rb +6 -11
  422. data/spec/unit/provider/package/nim_spec.rb +216 -7
  423. data/spec/unit/provider/package/opkg_spec.rb +180 -0
  424. data/spec/unit/provider/package/rpm_spec.rb +149 -3
  425. data/spec/unit/provider/package/yum_spec.rb +6 -5
  426. data/spec/unit/provider/parsedfile_spec.rb +122 -28
  427. data/spec/unit/provider/service/freebsd_spec.rb +18 -0
  428. data/spec/unit/provider/service/init_spec.rb +108 -87
  429. data/spec/unit/provider/service/launchd_spec.rb +2 -2
  430. data/spec/unit/provider/service/openwrt_spec.rb +109 -0
  431. data/spec/unit/provider/service/src_spec.rb +117 -41
  432. data/spec/unit/provider/service/systemd_spec.rb +125 -17
  433. data/spec/unit/provider/service/upstart_spec.rb +1 -1
  434. data/spec/unit/provider/user/aix_spec.rb +42 -0
  435. data/spec/unit/provider/user/directoryservice_spec.rb +1 -0
  436. data/spec/unit/provider/user/pw_spec.rb +24 -12
  437. data/spec/unit/provider/user/user_role_add_spec.rb +1 -1
  438. data/spec/unit/provider/user/useradd_spec.rb +179 -15
  439. data/spec/unit/resource/type_spec.rb +3 -3
  440. data/spec/unit/scheduler/job_spec.rb +79 -0
  441. data/spec/unit/scheduler/scheduler_spec.rb +129 -0
  442. data/spec/unit/scheduler/splay_job_spec.rb +35 -0
  443. data/spec/unit/ssl/base_spec.rb +3 -9
  444. data/spec/unit/ssl/certificate_authority_spec.rb +1 -0
  445. data/spec/unit/ssl/certificate_request_spec.rb +3 -1
  446. data/spec/unit/ssl/certificate_spec.rb +3 -1
  447. data/spec/unit/ssl/configuration_spec.rb +74 -0
  448. data/spec/unit/ssl/host_spec.rb +28 -7
  449. data/spec/unit/ssl/validator_spec.rb +311 -0
  450. data/spec/unit/transaction/event_manager_spec.rb +49 -0
  451. data/spec/unit/transaction/event_spec.rb +20 -5
  452. data/spec/unit/transaction/report_spec.rb +8 -0
  453. data/spec/unit/type/cron_spec.rb +9 -0
  454. data/spec/unit/type/exec_spec.rb +11 -0
  455. data/spec/unit/type/file/content_spec.rb +20 -20
  456. data/spec/unit/type/file/mode_spec.rb +6 -0
  457. data/spec/unit/type/file/source_spec.rb +9 -7
  458. data/spec/unit/type/file_spec.rb +22 -3
  459. data/spec/unit/type/service_spec.rb +34 -21
  460. data/spec/unit/type_spec.rb +46 -1
  461. data/spec/unit/util/backups_spec.rb +2 -2
  462. data/spec/unit/util/execution_spec.rb +4 -1
  463. data/spec/unit/util/filetype_spec.rb +6 -0
  464. data/spec/unit/util/monkey_patches_spec.rb +18 -0
  465. data/spec/unit/util/network_device/cisco/device_spec.rb +37 -0
  466. data/spec/unit/util/network_device/config_spec.rb +14 -0
  467. data/spec/unit/util/network_device_spec.rb +3 -3
  468. data/spec/unit/util/profiler/logging_spec.rb +81 -0
  469. data/spec/unit/util/profiler/none_spec.rb +12 -0
  470. data/spec/unit/util/profiler/object_counts_spec.rb +14 -0
  471. data/spec/unit/util/profiler/wall_clock_spec.rb +13 -0
  472. data/spec/unit/util/pson_spec.rb +5 -0
  473. data/spec/unit/util/ssl_spec.rb +51 -0
  474. data/spec/unit/util/windows/root_certs_spec.rb +15 -0
  475. data/spec/unit/util_spec.rb +28 -0
  476. metadata +2593 -2307
  477. data/spec/unit/module_tool/applications/application_spec.rb +0 -19
@@ -0,0 +1,746 @@
1
+ # vim: syntax=ruby
2
+
3
+ # Parser using the Pops model
4
+ # This grammar is a half step between the current 3.1. grammar and egrammar.
5
+ # FIXME! Keep as reference until egrammar is proven to work.
6
+
7
+ class Puppet::Pops::Impl::Parser::Parser
8
+
9
+ token STRING DQPRE DQMID DQPOST
10
+ token LBRACK RBRACK LBRACE RBRACE SYMBOL FARROW COMMA TRUE
11
+ token FALSE EQUALS APPENDS LESSEQUAL NOTEQUAL DOT COLON LLCOLLECT RRCOLLECT
12
+ token QMARK LPAREN RPAREN ISEQUAL GREATEREQUAL GREATERTHAN LESSTHAN
13
+ token IF ELSE IMPORT DEFINE ELSIF VARIABLE CLASS INHERITS NODE BOOLEAN
14
+ token NAME SEMIC CASE DEFAULT AT LCOLLECT RCOLLECT CLASSREF
15
+ token NOT OR AND UNDEF PARROW PLUS MINUS TIMES DIV LSHIFT RSHIFT UMINUS
16
+ token MATCH NOMATCH REGEX IN_EDGE OUT_EDGE IN_EDGE_SUB OUT_EDGE_SUB
17
+ token IN UNLESS PIPE
18
+ token LAMBDA
19
+
20
+ prechigh
21
+ left DOT
22
+ # left LBRACE
23
+ # left LCOLLECT LLCOLLECT
24
+ right NOT
25
+ nonassoc UMINUS
26
+ left IN MATCH NOMATCH
27
+ left TIMES DIV
28
+ left MINUS PLUS
29
+ left LSHIFT RSHIFT
30
+ left NOTEQUAL ISEQUAL
31
+ left GREATEREQUAL GREATERTHAN LESSTHAN LESSEQUAL
32
+ left AND
33
+ left OR
34
+ # left IN_EDGE OUT_EDGE IN_EDGE_SUB OUT_EDGE_SUB
35
+ preclow
36
+
37
+ rule
38
+ # Produces [Model::BlockExpression, Model::Expression, nil] depending on multiple statements, single statement or empty
39
+ program
40
+ : statements { result = Factory.block_or_expression(*val[0]) }
41
+ | nil
42
+
43
+ # Change may have issues with nil; i.e. program is a sequence of nils/nops
44
+ # Simplified from original which had validation for top level constructs - see statement rule
45
+ # Produces Array<Model::Expression>
46
+ statements
47
+ : statement { result = [val[0]]}
48
+ | statements statement { result = val[0].push val[1] }
49
+
50
+ # Removed validation construct regarding "top level statements" as it did not seem to catch all problems
51
+ # and relied on a "top-level-ness" encoded in the abstract syntax tree objects
52
+ #
53
+ # The main list of valid statements
54
+ # Produces Model::Expression
55
+ #
56
+ statement
57
+ : resource
58
+ | virtual_resource
59
+ | collection
60
+ | assignment
61
+ | casestatement
62
+ | if_expression
63
+ | unless_expression
64
+ | import
65
+ | call_named_function
66
+ | definition
67
+ | hostclass
68
+ | nodedef
69
+ | resource_override
70
+ | append
71
+ | relationship
72
+ | call_method_with_lambda
73
+
74
+ keyword
75
+ : AND
76
+ | CASE
77
+ | CLASS
78
+ | DEFAULT
79
+ | DEFINE
80
+ | ELSE
81
+ | ELSIF
82
+ | IF
83
+ | IN
84
+ | IMPORT
85
+ | INHERITS
86
+ | NODE
87
+ | OR
88
+ | UNDEF
89
+ | UNLESS
90
+
91
+ # Produces Model::RelationshipExpression
92
+ relationship
93
+ : relationship_side edge relationship_side { result = val[0].relop(val[1][:value], val[2]); loc result, val[1] }
94
+ | relationship edge relationship_side { result = val[0].relop(val[1][:value], val[2]); loc result, val[1] }
95
+
96
+ # Produces Model::Expression
97
+ relationship_side
98
+ : resource
99
+ | resourceref
100
+ | collection
101
+ | variable
102
+ | quotedtext
103
+ | selector
104
+ | casestatement
105
+ | hasharrayaccesses
106
+
107
+ # Produces String
108
+ edge
109
+ : IN_EDGE
110
+ | OUT_EDGE
111
+ | IN_EDGE_SUB
112
+ | OUT_EDGE_SUB
113
+
114
+ # Produces Model::CallNamedFunctionExpression
115
+ call_named_function
116
+ : NAME LPAREN expressions RPAREN { result = Factory.CALL_NAMED(val[0][:value], false, val[2]) ; loc result, val[0], val[3] }
117
+ | NAME LPAREN expressions COMMA RPAREN { result = Factory.CALL_NAMED(val[0][:value], false, val[2]) ; loc result, val[0], val[4] }
118
+ | NAME LPAREN RPAREN { result = Factory.CALL_NAMED(val[0][:value], false, []) ; loc result, val[0], val[2] }
119
+ | NAME func_call_args { result = Factory.CALL_NAMED(val[0][:value], false, val[1]) ; loc result, val[0] }
120
+
121
+ call_method_with_lambda
122
+ : call_method { result = val[0] }
123
+ | call_method lambda { result = val[0]; val[0].lambda = val[1] }
124
+
125
+ call_method
126
+ : named_access LPAREN expressions RPAREN { result = Factory.CALL_METHOD(val[0], val[2]); loc result, val[1], val[3] }
127
+ | named_access LPAREN RPAREN { result = Factory.CALL_METHOD(val[0], []); loc result, val[1], val[3] }
128
+ | named_access { result = Factory.CALL_METHOD(val[0], []); loc result, val[0] }
129
+
130
+ named_access
131
+ : named_access_lval DOT NAME {
132
+ result = val[0].dot(Factory.fqn(val[2][:value]))
133
+ loc result, val[1], val[2]
134
+ }
135
+
136
+ # Obviously not ideal, it is not possible to use literal array or hash as lhs
137
+ # These must be assigned to a variable - this is also an issue in other places
138
+ #
139
+ named_access_lval
140
+ : variable
141
+ | hasharrayaccesses
142
+ | selector
143
+ | quotedtext
144
+ | call_named_rval_function
145
+
146
+ lambda
147
+ : LAMBDA lambda_parameter_list statements RBRACE {
148
+ result = Factory.LAMBDA(val[1], val[2])
149
+ loc result, val[0], val[3]
150
+ }
151
+ | LAMBDA lambda_parameter_list RBRACE {
152
+ result = Factory.LAMBDA(val[1], nil)
153
+ loc result, val[0], val[2]
154
+ }
155
+ # Produces Array<Model::Parameter>
156
+ lambda_parameter_list
157
+ : PIPE PIPE { result = [] }
158
+ | PIPE parameters endcomma PIPE { result = val[1] }
159
+
160
+ # Produces Array<Model::Expression>
161
+ func_call_args
162
+ : rvalue { result = [val[0]] }
163
+ | func_call_args COMMA rvalue { result = val[0].push(val[2]) }
164
+
165
+ # Produces Array<Model::Expression>
166
+ expressions
167
+ : expression { result = [val[0]] }
168
+ | expressions comma expression { result = val[0].push(val[2]) }
169
+
170
+
171
+ # Produces [Model::ResourceExpression, Model::ResourceDefaultsExpression]
172
+ resource
173
+ : classname LBRACE resourceinstances endsemi RBRACE {
174
+ result = Factory.RESOURCE(Factory.fqn(token_text(val[0])), val[2])
175
+ loc result, val[0], val[4]
176
+ }
177
+ | classname LBRACE attribute_operations endcomma RBRACE {
178
+ # This is a deprecated syntax.
179
+ # It also fails hard - TODO: create model and validate this case
180
+ error "All resource specifications require names"
181
+ }
182
+ | type LBRACE attribute_operations endcomma RBRACE {
183
+ # a defaults setting for a type
184
+ result = Factory.RESOURCE_DEFAULTS(val[0], val[2])
185
+ loc result, val[0], val[4]
186
+ }
187
+
188
+ # Override a value set elsewhere in the configuration.
189
+ # Produces Model::ResourceOverrideExpression
190
+ resource_override
191
+ : resourceref LBRACE attribute_operations endcomma RBRACE {
192
+ @lexer.commentpop
193
+ result = Factory.RESOURCE_OVERRIDE(val[0], val[2])
194
+ loc result, val[0], val[4]
195
+ }
196
+
197
+ # Exported and virtual resources; these don't get sent to the client
198
+ # unless they get collected elsewhere in the db.
199
+ # The original had validation here; checking if storeconfigs is on; this is moved to a validation step
200
+ # Also, validation was performed if an attempt was made to virtualize or export a resource defaults
201
+ # this is also now deferred to validation
202
+ # Produces [Model::ResourceExpression, Model::ResourceDefaultsExpression]
203
+ virtual_resource
204
+ : at resource {
205
+ val[1].form = val[0] # :virtual, :exported, (or :regular)
206
+ result = val[1]
207
+ }
208
+
209
+ # Produces Symbol corresponding to resource form
210
+ at
211
+ : AT { result = :virtual }
212
+ | AT AT { result = :exported }
213
+
214
+ # A collection statement. Currently supports no arguments at all, but eventually
215
+ # will, I assume.
216
+ #
217
+ # Produces Model::CollectExpression
218
+ #
219
+ collection
220
+ : type collect_query LBRACE attribute_operations endcomma RBRACE {
221
+ @lexer.commentpop
222
+ result = Factory.COLLECT(val[0].value.downcase, val[1], val[3])
223
+ loc result, val[0], val[5]
224
+ }
225
+ | type collect_query {
226
+ result = Factory.COLLECT(val[0].value.downcase, val[1], [])
227
+ loc result, val[0], val[1]
228
+ }
229
+
230
+ collect_query
231
+ : LCOLLECT optional_query RCOLLECT { result = Factory.VIRTUAL_QUERY(val[1]) ; loc result, val[0], val[2] }
232
+ | LLCOLLECT optional_query RRCOLLECT { result = Factory.EXPORTED_QUERY(val[1]) ; loc result, val[0], val[2] }
233
+
234
+ # ORIGINAL COMMENT: A mini-language for handling collection comparisons. This is organized
235
+ # to avoid the need for precedence indications.
236
+ # (New implementation is slightly different; and when finished, it may be possible to streamline the
237
+ # grammar - the difference is mostly in evaluation, not in grammar)
238
+ #
239
+ optional_query
240
+ : nil
241
+ | query
242
+
243
+ # ORIGINAL: Had a weird list structure where AND and OR where at the same level, and hence, there was the
244
+ # need to keep track of where parenthesis were (to get order correct).
245
+ #
246
+ # This is now not needed as AND has higher precedence than OR, and parenthesis are low in precedence
247
+
248
+ query
249
+ : predicate_lval ISEQUAL expression { result = (val[0] == val[2]) ; loc result, val[1] }
250
+ | predicate_lval NOTEQUAL expression { result = (val[0].ne(val[2])) ; loc result, val[1] }
251
+ | LPAREN query RPAREN { result = val[1] }
252
+ | query AND query { result = val[0].and(val[2]) ; loc result, val[1] }
253
+ | query OR query { result = val[0].or(val[2]) ; loc result, val[1] }
254
+
255
+
256
+ # Produces Model::VariableExpression, or Model::QualifiedName
257
+ predicate_lval
258
+ : variable
259
+ | name
260
+
261
+ resourceinst
262
+ : resourcename COLON attribute_operations endcomma { result = Factory.RESOURCE_BODY(val[0], val[2]) }
263
+
264
+ resourceinstances
265
+ : resourceinst { result = [val[0]] }
266
+ | resourceinstances SEMIC resourceinst { result = val[0].push val[2] }
267
+
268
+
269
+ resourcename
270
+ : quotedtext
271
+ | name
272
+ | type
273
+ | selector
274
+ | variable
275
+ | array
276
+ | hasharrayaccesses
277
+
278
+ # Assignment, only assignment to variable is legal, but parser builds expression for [] = anyway to
279
+ # enable a better error message
280
+ assignment
281
+ : VARIABLE EQUALS expression { result = Factory.var(Factory.fqn(val[0][:value])).set(val[2]) ; loc result, val[1] }
282
+ | hasharrayaccess EQUALS expression { result val[0].set(val[2]); loc result, val[1] }
283
+
284
+ append
285
+ : VARIABLE APPENDS expression { result = Factory.var(val[0][:value]).plus_set(val[1]) ; loc result, val[1] }
286
+
287
+ # Produces Array<Model::AttributeOperation>
288
+ attribute_operations
289
+ : { result = [] }
290
+ | attribute_operation { result = [val[0]] }
291
+ | attribute_operations COMMA attribute_operation { result = val[0].push(val[2]) }
292
+
293
+ # Produces String
294
+ attribute_name
295
+ : NAME
296
+ | keyword
297
+ | BOOLEAN
298
+
299
+ # Several grammar issues here: the addparam did not allow keyword and booleans as names.
300
+ # In this version, the wrong combinations are validated instead of producing syntax errors
301
+ # (Can give nicer error message +> is not applicable to...)
302
+ # WAT - Boolean as attribute name?
303
+ # Produces Model::AttributeOperation
304
+ #
305
+ attribute_operation
306
+ : attribute_name FARROW expression {
307
+ result = Factory.ATTRIBUTE_OP(val[0][:value], :'=>', val[2])
308
+ loc result, val[0], val[2]
309
+ }
310
+ | attribute_name PARROW expression {
311
+ result = Factory.ATTRIBUTE_OP(val[0][:value], :'+>', val[2])
312
+ loc result, val[0], val[2]
313
+ }
314
+
315
+ # Produces Model::CallNamedFunction
316
+ call_named_rval_function
317
+ : NAME LPAREN expressions RPAREN { result = Factory.CALL_NAMED(val[0][:value], true, val[2]) ; loc result, val[0], val[3] }
318
+ | NAME LPAREN RPAREN { result = Factory.CALL_NAMED(val[0][:value], true, []) ; loc result, val[0], val[2] }
319
+
320
+ quotedtext
321
+ : STRING { result = Factory.literal(val[0][:value]) ; loc result, val[0] }
322
+ | dqpre dqrval { result = Factory.string(val[0], *val[1]) ; loc result, val[0], val[1][-1] }
323
+
324
+ dqpre : DQPRE { result = Factory.literal(val[0][:value]); loc result, val[0] }
325
+ dqpost : DQPOST { result = Factory.literal(val[0][:value]); loc result, val[0] }
326
+ dqmid : DQMID { result = Factory.literal(val[0][:value]); loc result, val[0] }
327
+ text_expression : expression { result = Factory.TEXT(val[0]) }
328
+
329
+ dqrval
330
+ : text_expression dqtail { result = [val[0]] + val[1] }
331
+
332
+ dqtail
333
+ : dqpost { result = [val[0]] }
334
+ | dqmid dqrval { result = [val[0]] + val[1] }
335
+
336
+
337
+ # Reference to Resource (future also reference to other instances of other types than Resources).
338
+ # First form (lower case name) is deprecated (deprecation message handled in validation). Note that
339
+ # this requires use of token NAME since a rule call to name causes shift reduce conflict with
340
+ # a function call NAME NAME (calling function with NAME as argument e.g. foo bar).
341
+ #
342
+ # Produces InstanceReference
343
+ resourceref
344
+ : NAME LBRACK expressions RBRACK {
345
+ # Would want to use rule name here, but can't (need a NAME with higher precedence), so must
346
+ # create a QualifiedName instance here for NAME
347
+ result = Factory.INSTANCE(Factory.QNAME_OR_NUMBER(val[0][:value]), val[2]);
348
+ loc result, val[0], val[2][-1]
349
+ }
350
+ | type LBRACK expressions RBRACK {
351
+ result = Factory.INSTANCE(val[0], val[2]);
352
+ loc result, val[0], val[2][-1]
353
+ }
354
+
355
+ # Changed from Puppet 3x where there is no else part on unless
356
+ #
357
+ unless_expression
358
+ : UNLESS expression LBRACE statements RBRACE unless_else {
359
+ @lexer.commentpop
360
+ result = Factory.UNLESS(val[1], Factory.block_or_expression(*val[3]), val[5])
361
+ loc result, val[0], val[4]
362
+ }
363
+ | UNLESS expression LBRACE RBRACE unless_else {
364
+ @lexer.commentpop
365
+ result = Factory.UNLESS(val[1], nil, nil)
366
+ loc result, val[0], val[4]
367
+ }
368
+
369
+ # Different from else part of if, since "elsif" is not supported, but else is
370
+ #
371
+ # Produces [Model::Expression, nil] - nil if there is no else or elsif part
372
+ unless_else
373
+ : # nothing
374
+ | ELSE LBRACE statements RBRACE {
375
+ @lexer.commentpop
376
+ result = Factory.block_or_expression(*val[2])
377
+ loc result, val[0], val[3]
378
+ }
379
+ | ELSE LBRACE RBRACE {
380
+ @lexer.commentpop
381
+ result = nil # don't think a nop is needed here either
382
+ }
383
+
384
+ # Produces Model::IfExpression
385
+ if_expression
386
+ : IF if_expression_part {
387
+ result = val[1]
388
+ }
389
+
390
+ # Produces Model::IfExpression
391
+ if_expression_part
392
+ : expression LBRACE statements RBRACE else {
393
+ @lexer.commentpop
394
+ result = Factory.IF(val[0], Factory.block_or_expression(*val[2]), val[4])
395
+ loc(result, val[0], (val[4] ? val[4] : val[3]))
396
+ }
397
+ | expression LBRACE RBRACE else {
398
+ result = Factory.IF(val[0], nil, val[3])
399
+ loc(result, val[0], (val[3] ? val[3] : val[2]))
400
+ }
401
+
402
+ # Produces [Model::Expression, nil] - nil if there is no else or elsif part
403
+ else
404
+ : # nothing
405
+ | ELSIF if_expression_part { result = val[1] }
406
+ | ELSE LBRACE statements RBRACE {
407
+ @lexer.commentpop
408
+ result = Factory.block_or_expression(*val[2])
409
+ loc result, val[0], val[3]
410
+ }
411
+ | ELSE LBRACE RBRACE {
412
+ @lexer.commentpop
413
+ result = nil # don't think a nop is needed here either
414
+ }
415
+
416
+ # Produces Model::Expression
417
+ expression
418
+ : rvalue
419
+ | hash
420
+ | expression IN expression { result = val[0].in val[2] ; loc result, val[1] }
421
+ | expression MATCH match_rvalue { result = val[0] =~ val[2] ; loc result, val[1] }
422
+ | expression NOMATCH match_rvalue { result = val[0].mne val[2] ; loc result, val[1] }
423
+ | expression PLUS expression { result = val[0] + val[2] ; loc result, val[1] }
424
+ | expression MINUS expression { result = val[0] - val[2] ; loc result, val[1] }
425
+ | expression DIV expression { result = val[0] / val[2] ; loc result, val[1] }
426
+ | expression TIMES expression { result = val[0] * val[2] ; loc result, val[1] }
427
+ | expression LSHIFT expression { result = val[0] << val[2] ; loc result, val[1] }
428
+ | expression RSHIFT expression { result = val[0] >> val[2] ; loc result, val[1] }
429
+ | MINUS expression =UMINUS { result = val[1].minus() ; loc result, val[0] }
430
+ | expression NOTEQUAL expression { result = val[0].ne val[2] ; loc result, val[1] }
431
+ | expression ISEQUAL expression { result = val[0] == val[2] ; loc result, val[1] }
432
+ | expression GREATERTHAN expression { result = val[0] > val[2] ; loc result, val[1] }
433
+ | expression GREATEREQUAL expression { result = val[0] >= val[2] ; loc result, val[1] }
434
+ | expression LESSTHAN expression { result = val[0] < val[2] ; loc result, val[1] }
435
+ | expression LESSEQUAL expression { result = val[0] <= val[2] ; loc result, val[1] }
436
+ | NOT expression { result = val[1].not ; loc result, val[0] }
437
+ | expression AND expression { result = val[0].and val[2] ; loc result, val[1] }
438
+ | expression OR expression { result = val[0].or val[2] ; loc result, val[1] }
439
+ | LPAREN expression RPAREN { result = val[1] ; }
440
+ | call_method_with_lambda
441
+
442
+ match_rvalue
443
+ : regex
444
+ | quotedtext
445
+
446
+ # Produces Model::CaseExpression
447
+ casestatement
448
+ : CASE expression LBRACE case_options RBRACE {
449
+ @lexer.commentpop
450
+ result = Factory.CASE(val[1], *val[3])
451
+ loc result, val[0], val[4]
452
+ }
453
+
454
+ # Produces Array<Model::CaseOption>
455
+ case_options
456
+ : case_option { result = [val[0]] }
457
+ | case_options case_option { result = val[0].push val[1] }
458
+
459
+ # Produced Model::CaseOption (aka When)
460
+ case_option
461
+ : case_values COLON LBRACE statements RBRACE {
462
+ @lexer.commentpop
463
+ result = Factory.WHEN(val[0], val[3])
464
+ loc result, val[1], val[4]
465
+ }
466
+ | case_values COLON LBRACE RBRACE {
467
+ @lexer.commentpop
468
+ result = Factory.WHEN(val[0], nil)
469
+ loc result, val[1], val[3]
470
+ }
471
+
472
+ # Produces Array<Expression> mostly literals
473
+ case_values
474
+ : selectable { result = [val[0]] }
475
+ | case_values COMMA selectable { result = val[0].push val[2] }
476
+
477
+ # Produces Model::SelectorExpression
478
+ selector
479
+ : selectable QMARK selector_entries { result = val[0].select(*val[2]) ; loc result, val[1] }
480
+
481
+ # Produces Array<Model::SelectorEntry>
482
+ selector_entries
483
+ : selector_entry { result = [val[0]] }
484
+ | LBRACE selector_entry_list endcomma RBRACE {
485
+ @lexer.commentpop
486
+ result = val[1]
487
+ }
488
+
489
+ # Produces Array<Model::SelectorEntry>
490
+ selector_entry_list
491
+ : selector_entry { result = [val[0]] }
492
+ | selector_entry_list COMMA selector_entry { result = val[0].push val[2] }
493
+
494
+ # Produces a Model::SelectorEntry
495
+ selector_entry
496
+ : selectable FARROW rvalue { result = Factory.MAP(val[0], val[2]) ; loc result, val[1] }
497
+
498
+ # Produces Model::Expression (most of the literals)
499
+ selectable
500
+ : name
501
+ | type
502
+ | quotedtext
503
+ | variable
504
+ | call_named_rval_function
505
+ | boolean
506
+ | undef
507
+ | hasharrayaccess
508
+ | default
509
+ | regex
510
+
511
+
512
+
513
+ # Produces nil (noop)
514
+ import
515
+ : IMPORT strings {
516
+ error "Import not supported in this version of the parser", \
517
+ :line => stmt.context[:line], :file => stmt.context[:file]
518
+ result = nil
519
+ }
520
+
521
+ # IMPORT (T.B DEPRECATED IN PUPPET WHEN IT HAS BEEN FIGURED OUT HOW TO SUPPORT
522
+ # THE THINGS IMPORTS ARE USED FOR.
523
+ # BOLDLY DECIDED TO SKIP THIS COMPLETELY IN THIS IMPLEMENTATION - will trigger an error
524
+ #
525
+ # These are only used for importing, no interpolation
526
+ string
527
+ : STRING { result = [val[0][:value]] }
528
+
529
+ strings
530
+ : string
531
+ | strings COMMA string { result = val[0].push val[2] }
532
+
533
+ # Produces Model::Definition
534
+ definition
535
+ : DEFINE classname parameter_list LBRACE statements RBRACE {
536
+ @lexer.commentpop
537
+ result = Factory.DEFINITION(classname(val[1][:value]), val[2], val[4])
538
+ loc result, val[0], val[5]
539
+ @lexer.indefine = false
540
+ }
541
+ | DEFINE classname parameter_list LBRACE RBRACE {
542
+ @lexer.commentpop
543
+ result = Factory.DEFINITION(classname(val[1][:value]), val[2], nil)
544
+ loc result, val[0], val[4]
545
+ @lexer.indefine = false
546
+ }
547
+
548
+ # ORIGINAL COMMENT: Our class gets defined in the parent namespace, not our own.
549
+ # WAT ??! This is way odd; should get its complete name, classnames do not nest
550
+ # Seems like the call to classname makes use of the name scope
551
+ # (This is uneccesary, since the parent name is known when evaluating)
552
+ #
553
+ # Produces Model::HostClassDefinition
554
+ #
555
+ hostclass
556
+ : CLASS classname parameter_list classparent LBRACE statements RBRACE {
557
+ @lexer.commentpop
558
+ @lexer.namepop
559
+ result = Factory.HOSTCLASS(classname(val[1][:value]), val[2], token_text(val[3]), val[5])
560
+ loc result, val[0], val[6]
561
+ }
562
+ | CLASS classname parameter_list classparent LBRACE RBRACE {
563
+ @lexer.commentpop
564
+ @lexer.namepop
565
+ result = Factory.HOSTCLASS(classname(val[1][:value]), val[2], token_text(val[3]), nil)
566
+ loc result, val[0], val[5]
567
+ }
568
+
569
+ # Produces Model::NodeDefinition
570
+ nodedef
571
+ : NODE hostnames nodeparent LBRACE statements RBRACE {
572
+ @lexer.commentpop
573
+ result = Factory.NODE(val[1], val[2], val[4])
574
+ loc result, val[0], val[5]
575
+ }
576
+ | NODE hostnames nodeparent LBRACE RBRACE {
577
+ @lexer.commentpop
578
+ result = Factory.NODE(val[1], val[2], nil)
579
+ loc result, val[0], val[4]
580
+ }
581
+
582
+ # String result
583
+ classname
584
+ : NAME { result = val[0] }
585
+ | CLASS { result = val[0] }
586
+
587
+ # Hostnames is not a list of names, it is a list of name matchers (including a Regexp).
588
+ # (The old implementation had a special "Hostname" object with some minimal validation)
589
+ #
590
+ # Produces Array<Model::LiteralExpression>
591
+ #
592
+ hostnames
593
+ : nodename { result = [result] }
594
+ | hostnames COMMA nodename { result = val[0].push(val[2]) }
595
+
596
+ # Produces Model::LiteralExpression
597
+ #
598
+ nodename
599
+ : hostname
600
+
601
+ # Produces a LiteralExpression (string, :default, or regexp)
602
+ hostname
603
+ : NAME { result = Factory.fqn(val[0][:value]); loc result, val[0] }
604
+ | STRING { result = Factory.literal(val[0][:value]); loc result, val[0] }
605
+ | DEFAULT { result = Factory.literal(:default); loc result, val[0] }
606
+ | regex
607
+
608
+
609
+ # Produces Array<Model::Parameter>
610
+ parameter_list
611
+ : nil { result = [] }
612
+ | LPAREN RPAREN { result = [] }
613
+ | LPAREN parameters endcomma RPAREN { result = val[1] }
614
+
615
+ # Produces Array<Model::Parameter>
616
+ parameters
617
+ : parameter { result = [val[0]] }
618
+ | parameters COMMA parameter { result = val[0].push(val[2]) }
619
+
620
+ # Produces Model::Parameter
621
+ parameter
622
+ : VARIABLE EQUALS expression { result = Factory.PARAM(val[0][:value], val[2]) ; loc result, val[0] }
623
+ | VARIABLE { result = Factory.PARAM(val[0][:value]); loc result, val[0] }
624
+
625
+ # Produces Expression, since hostname is an Expression
626
+ nodeparent
627
+ : nil
628
+ | INHERITS hostname { result = val[1] }
629
+
630
+ # Produces String, name or nil result
631
+ classparent
632
+ : nil
633
+ | INHERITS classnameordefault { result = val[1] }
634
+
635
+ # Produces String (this construct allows a class to be named "default" and to be referenced as
636
+ # the parent class.
637
+ # TODO: Investigate the validity
638
+ # Produces a String (classname), or a token (DEFAULT).
639
+ #
640
+ classnameordefault
641
+ : classname
642
+ | DEFAULT
643
+
644
+ rvalue
645
+ : quotedtext
646
+ | name
647
+ | type
648
+ | boolean
649
+ | selector
650
+ | variable
651
+ | array
652
+ | hasharrayaccesses
653
+ | resourceref
654
+ | call_named_rval_function
655
+ | undef
656
+
657
+ array
658
+ : LBRACK expressions RBRACK { result = Factory.LIST(val[1]); loc result, val[0], val[2] }
659
+ | LBRACK expressions COMMA RBRACK { result = Factory.LIST(val[1]); loc result, val[0], val[3] }
660
+ | LBRACK RBRACK { result = Factory.literal([]) ; loc result, val[0] }
661
+
662
+
663
+ hash
664
+ : LBRACE hashpairs RBRACE { result = Factory.HASH(val[1]); loc result, val[0], val[2] }
665
+ | LBRACE hashpairs COMMA RBRACE { result = Factory.HASH(val[1]); loc result, val[0], val[3] }
666
+ | LBRACE RBRACE { result = Factory.literal({}) ; loc result, val[0], val[3] }
667
+
668
+ hashpairs
669
+ : hashpair { result = [val[0]] }
670
+ | hashpairs COMMA hashpair { result = val[0].push val[2] }
671
+
672
+ hashpair
673
+ : key FARROW expression { result = Factory.KEY_ENTRY(val[0], val[2]); loc result, val[1] }
674
+
675
+ key
676
+ : NAME { result = Factory.literal(val[0][:value]) ; loc result, val[0] }
677
+ | quotedtext { result = val[0] }
678
+
679
+ # NOTE: Limitation that LHS is a variable, means that it is not possible to do foo(10)[2] without
680
+ # using an intermediate variable
681
+ #
682
+ hasharrayaccess
683
+ : variable LBRACK expression RBRACK { result = val[0][val[2]]; loc result, val[0], val[3] }
684
+
685
+ hasharrayaccesses
686
+ : hasharrayaccess
687
+ | hasharrayaccesses LBRACK expression RBRACK { result = val[0][val[2]] ; loc result, val[1], val[3] }
688
+
689
+ # Produces Model::VariableExpression
690
+ variable : VARIABLE { result = Factory.fqn(val[0][:value]).var ; loc result, val[0] }
691
+ undef : UNDEF { result = Factory.literal(:undef); loc result, val[0] }
692
+ name : NAME { result = Factory.QNAME_OR_NUMBER(val[0][:value]) ; loc result, val[0] }
693
+ type : CLASSREF { result = Factory.QREF(val[0][:value]) ; loc result, val[0] }
694
+
695
+ default
696
+ : DEFAULT { result = Factory.literal(:default); loc result, val[0] }
697
+
698
+ boolean
699
+ # Assumes lexer produces a Boolean value for booleans, or this will go wrong (e.g. produce. LiteralString)
700
+ : BOOLEAN { result = Factory.literal(val[0][:value]) ; loc result, val[0] }
701
+
702
+ regex
703
+ : REGEX { result = Factory.literal(val[0][:value]); loc result, val[0] }
704
+
705
+ # ---Special markers & syntactic sugar
706
+
707
+ # WAT !!!! this means array can be [1=>2=>3], func (1=>2=>3), and other retarded constructs
708
+ # TODO: Remove the FARROW (investigate if there is any validity)
709
+ comma
710
+ : FARROW
711
+ | COMMA
712
+
713
+ endcomma
714
+ : #
715
+ | COMMA { result = nil }
716
+
717
+ endsemi
718
+ : #
719
+ | SEMIC
720
+
721
+ nil
722
+ : { result = nil}
723
+
724
+ ## Empty list - not really needed? TODO: Check if this can be removed
725
+ #empty_list
726
+ # : { result = [] }
727
+
728
+ end
729
+
730
+ ---- header ----
731
+ require 'puppet'
732
+ require 'puppet/util/loadedfile'
733
+ require 'puppet/pops'
734
+
735
+ module Puppet
736
+ class ParseError < Puppet::Error; end
737
+ class ImportError < Racc::ParseError; end
738
+ class AlreadyImportedError < ImportError; end
739
+ end
740
+
741
+ ---- inner ----
742
+
743
+ # Make emacs happy
744
+ # Local Variables:
745
+ # mode: ruby
746
+ # End: