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,182 @@
1
+ #! /usr/bin/env ruby
2
+ require 'spec_helper'
3
+ require 'puppet/pops'
4
+
5
+ # relative to this spec file (./) does not work as this file is loaded by rspec
6
+ require File.join(File.dirname(__FILE__), '/transformer_rspec_helper')
7
+
8
+ describe "transformation to Puppet AST for containers" do
9
+ include TransformerRspecHelper
10
+
11
+ context "When transforming file scope" do
12
+ it "$a = 10 $b = 20" do
13
+ astdump(parse("$a = 10 $b = 20")).should == "(block (= $a 10) (= $b 20))"
14
+ end
15
+
16
+ it "$a = 10" do
17
+ astdump(parse("$a = 10")).should == "(= $a 10)"
18
+ end
19
+ end
20
+
21
+ context "When transforming class" do
22
+ it "class foo {}" do
23
+ astdump(parse("class foo {}")).should == "(class foo ())"
24
+ end
25
+
26
+ it "class foo::bar {}" do
27
+ astdump(parse("class foo::bar {}")).should == "(class foo::bar ())"
28
+ end
29
+
30
+ it "class foo inherits bar {}" do
31
+ astdump(parse("class foo inherits bar {}")).should == "(class foo (inherits bar) ())"
32
+ end
33
+
34
+ it "class foo($a) {}" do
35
+ astdump(parse("class foo($a) {}")).should == "(class foo (parameters a) ())"
36
+ end
37
+
38
+ it "class foo($a, $b) {}" do
39
+ astdump(parse("class foo($a, $b) {}")).should == "(class foo (parameters a b) ())"
40
+ end
41
+
42
+ it "class foo($a, $b=10) {}" do
43
+ astdump(parse("class foo($a, $b=10) {}")).should == "(class foo (parameters a (= b 10)) ())"
44
+ end
45
+
46
+ it "class foo($a, $b) inherits belgo::bar {}" do
47
+ astdump(parse("class foo($a, $b) inherits belgo::bar{}")).should == "(class foo (inherits belgo::bar) (parameters a b) ())"
48
+ end
49
+
50
+ it "class foo {$a = 10 $b = 20}" do
51
+ astdump(parse("class foo {$a = 10 $b = 20}")).should == "(class foo (block (= $a 10) (= $b 20)))"
52
+ end
53
+
54
+ context "it should handle '3x weirdness'" do
55
+ it "class class {} # a class named 'class'" do
56
+ # Not as much weird as confusing that it is possible to name a class 'class'. Can have
57
+ # a very confusing effect when resolving relative names, getting the global hardwired "Class"
58
+ # instead of some foo::class etc.
59
+ # This is allowed in 3.x.
60
+ astdump(parse("class class {}")).should == "(class class ())"
61
+ end
62
+
63
+ it "class default {} # a class named 'default'" do
64
+ # The weirdness here is that a class can inherit 'default' but not declare a class called default.
65
+ # (It will work with relative names i.e. foo::default though). The whole idea with keywords as
66
+ # names is flawed to begin with - it generally just a very bad idea.
67
+ expect { dump(parse("class default {}")).should == "(class default ())" }.to raise_error(Puppet::ParseError)
68
+ end
69
+
70
+ it "class foo::default {} # a nested name 'default'" do
71
+ astdump(parse("class foo::default {}")).should == "(class foo::default ())"
72
+ end
73
+
74
+ it "class class inherits default {} # inherits default", :broken => true do
75
+ astdump(parse("class class inherits default {}")).should == "(class class (inherits default) ())"
76
+ end
77
+
78
+ it "class class inherits default {} # inherits default" do
79
+ # TODO: See previous test marked as :broken=>true, it is actually this test (result) that is wacky,
80
+ # this because a class is named at parse time (since class evaluation is lazy, the model must have the
81
+ # full class name for nested classes - only, it gets this wrong when a class is named "class" - or at least
82
+ # I think it is wrong.)
83
+ #
84
+ astdump(parse("class class inherits default {}")).should == "(class class::class (inherits default) ())"
85
+ end
86
+
87
+ it "class foo inherits class" do
88
+ astdump(parse("class foo inherits class {}")).should == "(class foo (inherits class) ())"
89
+ end
90
+ end
91
+ end
92
+
93
+ context "When transforming define" do
94
+ it "define foo {}" do
95
+ astdump(parse("define foo {}")).should == "(define foo ())"
96
+ end
97
+
98
+ it "define foo::bar {}" do
99
+ astdump(parse("define foo::bar {}")).should == "(define foo::bar ())"
100
+ end
101
+
102
+ it "define foo($a) {}" do
103
+ astdump(parse("define foo($a) {}")).should == "(define foo (parameters a) ())"
104
+ end
105
+
106
+ it "define foo($a, $b) {}" do
107
+ astdump(parse("define foo($a, $b) {}")).should == "(define foo (parameters a b) ())"
108
+ end
109
+
110
+ it "define foo($a, $b=10) {}" do
111
+ astdump(parse("define foo($a, $b=10) {}")).should == "(define foo (parameters a (= b 10)) ())"
112
+ end
113
+
114
+ it "define foo {$a = 10 $b = 20}" do
115
+ astdump(parse("define foo {$a = 10 $b = 20}")).should == "(define foo (block (= $a 10) (= $b 20)))"
116
+ end
117
+
118
+ context "it should handle '3x weirdness'" do
119
+ it "define class {} # a define named 'class'" do
120
+ # This is weird because Class already exists, and instantiating this define will probably not
121
+ # work
122
+ astdump(parse("define class {}")).should == "(define class ())"
123
+ end
124
+
125
+ it "define default {} # a define named 'default'" do
126
+ # Check unwanted ability to define 'default'.
127
+ # The expression below is not allowed (which is good).
128
+ #
129
+ expect { dump(parse("define default {}")).should == "(define default ())"}.to raise_error(Puppet::ParseError)
130
+ end
131
+ end
132
+ end
133
+
134
+ context "When transforming node" do
135
+ it "node foo {}" do
136
+ # AST can not differentiate between bare word and string
137
+ astdump(parse("node foo {}")).should == "(node (matches 'foo') ())"
138
+ end
139
+
140
+ it "node foo, x.bar, default {}" do
141
+ # AST can not differentiate between bare word and string
142
+ astdump(parse("node foo, x_bar, default {}")).should == "(node (matches 'foo' 'x_bar' :default) ())"
143
+ end
144
+
145
+ it "node 'foo' {}" do
146
+ # AST can not differentiate between bare word and string
147
+ astdump(parse("node 'foo' {}")).should == "(node (matches 'foo') ())"
148
+ end
149
+
150
+ it "node foo inherits x::bar {}" do
151
+ # AST can not differentiate between bare word and string
152
+ astdump(parse("node foo inherits x_bar {}")).should == "(node (matches 'foo') (parent x_bar) ())"
153
+ end
154
+
155
+ it "node foo inherits 'bar' {}" do
156
+ # AST can not differentiate between bare word and string
157
+ astdump(parse("node foo inherits 'bar' {}")).should == "(node (matches 'foo') (parent 'bar') ())"
158
+ end
159
+
160
+ it "node foo inherits default {}" do
161
+ # AST can not differentiate between bare word and string
162
+ astdump(parse("node foo inherits default {}")).should == "(node (matches 'foo') (parent :default) ())"
163
+ end
164
+
165
+ it "node /web.*/ {}" do
166
+ astdump(parse("node /web.*/ {}")).should == "(node (matches /web.*/) ())"
167
+ end
168
+
169
+ it "node /web.*/, /do\.wop.*/, and.so.on {}" do
170
+ astdump(parse("node /web.*/, /do\.wop.*/, 'and.so.on' {}")).should == "(node (matches /web.*/ /do\.wop.*/ 'and.so.on') ())"
171
+ end
172
+
173
+ it "node wat inherits /apache.*/ {}" do
174
+ expect { parse("node wat inherits /apache.*/ {}")}.to raise_error(Puppet::ParseError)
175
+ end
176
+
177
+ it "node foo inherits bar {$a = 10 $b = 20}" do
178
+ # AST can not differentiate between bare word and string
179
+ astdump(parse("node foo inherits bar {$a = 10 $b = 20}")).should == "(node (matches 'foo') (parent bar) (block (= $a 10) (= $b 20)))"
180
+ end
181
+ end
182
+ end
@@ -0,0 +1,185 @@
1
+ #! /usr/bin/env ruby
2
+ require 'spec_helper'
3
+ require 'puppet/pops'
4
+
5
+ # relative to this spec file (./) does not work as this file is loaded by rspec
6
+ require File.join(File.dirname(__FILE__), '/transformer_rspec_helper')
7
+
8
+ describe "transformation to Puppet AST for resource declarations" do
9
+ include TransformerRspecHelper
10
+
11
+ context "When transforming regular resource" do
12
+ it "file { 'title': }" do
13
+ astdump(parse("file { 'title': }")).should == [
14
+ "(resource file",
15
+ " ('title'))"
16
+ ].join("\n")
17
+ end
18
+
19
+ it "file { 'title': ; 'other_title': }" do
20
+ astdump(parse("file { 'title': ; 'other_title': }")).should == [
21
+ "(resource file",
22
+ " ('title')",
23
+ " ('other_title'))"
24
+ ].join("\n")
25
+ end
26
+
27
+ it "file { 'title': path => '/somewhere', mode => 0777}" do
28
+ astdump(parse("file { 'title': path => '/somewhere', mode => 0777}")).should == [
29
+ "(resource file",
30
+ " ('title'",
31
+ " (path => '/somewhere')",
32
+ " (mode => 0777)))"
33
+ ].join("\n")
34
+ end
35
+
36
+ it "file { 'title1': path => 'x'; 'title2': path => 'y'}" do
37
+ astdump(parse("file { 'title1': path => 'x'; 'title2': path => 'y'}")).should == [
38
+ "(resource file",
39
+ " ('title1'",
40
+ " (path => 'x'))",
41
+ " ('title2'",
42
+ " (path => 'y')))",
43
+ ].join("\n")
44
+ end
45
+ end
46
+
47
+ context "When transforming resource defaults" do
48
+ it "File { }" do
49
+ astdump(parse("File { }")).should == "(resource-defaults file)"
50
+ end
51
+
52
+ it "File { mode => 0777 }" do
53
+ astdump(parse("File { mode => 0777}")).should == [
54
+ "(resource-defaults file",
55
+ " (mode => 0777))"
56
+ ].join("\n")
57
+ end
58
+ end
59
+
60
+ context "When transforming resource override" do
61
+ it "File['x'] { }" do
62
+ astdump(parse("File['x'] { }")).should == "(override (slice file 'x'))"
63
+ end
64
+
65
+ it "File['x'] { x => 1 }" do
66
+ astdump(parse("File['x'] { x => 1}")).should == "(override (slice file 'x')\n (x => 1))"
67
+ end
68
+
69
+ it "File['x', 'y'] { x => 1 }" do
70
+ astdump(parse("File['x', 'y'] { x => 1}")).should == "(override (slice file ('x' 'y'))\n (x => 1))"
71
+ end
72
+
73
+ it "File['x'] { x => 1, y => 2 }" do
74
+ astdump(parse("File['x'] { x => 1, y=> 2}")).should == "(override (slice file 'x')\n (x => 1)\n (y => 2))"
75
+ end
76
+
77
+ it "File['x'] { x +> 1 }" do
78
+ astdump(parse("File['x'] { x +> 1}")).should == "(override (slice file 'x')\n (x +> 1))"
79
+ end
80
+ end
81
+
82
+ context "When transforming virtual and exported resources" do
83
+ it "@@file { 'title': }" do
84
+ astdump(parse("@@file { 'title': }")).should == "(exported-resource file\n ('title'))"
85
+ end
86
+
87
+ it "@file { 'title': }" do
88
+ astdump(parse("@file { 'title': }")).should == "(virtual-resource file\n ('title'))"
89
+ end
90
+ end
91
+
92
+ context "When transforming class resource" do
93
+ it "class { 'cname': }" do
94
+ astdump(parse("class { 'cname': }")).should == [
95
+ "(resource class",
96
+ " ('cname'))"
97
+ ].join("\n")
98
+ end
99
+
100
+ it "class { 'cname': x => 1, y => 2}" do
101
+ astdump(parse("class { 'cname': x => 1, y => 2}")).should == [
102
+ "(resource class",
103
+ " ('cname'",
104
+ " (x => 1)",
105
+ " (y => 2)))"
106
+ ].join("\n")
107
+ end
108
+
109
+ it "class { 'cname1': x => 1; 'cname2': y => 2}" do
110
+ astdump(parse("class { 'cname1': x => 1; 'cname2': y => 2}")).should == [
111
+ "(resource class",
112
+ " ('cname1'",
113
+ " (x => 1))",
114
+ " ('cname2'",
115
+ " (y => 2)))",
116
+ ].join("\n")
117
+ end
118
+ end
119
+
120
+ context "When transforming Relationships" do
121
+ it "File[a] -> File[b]" do
122
+ astdump(parse("File[a] -> File[b]")).should == "(-> (slice file a) (slice file b))"
123
+ end
124
+
125
+ it "File[a] <- File[b]" do
126
+ astdump(parse("File[a] <- File[b]")).should == "(<- (slice file a) (slice file b))"
127
+ end
128
+
129
+ it "File[a] ~> File[b]" do
130
+ astdump(parse("File[a] ~> File[b]")).should == "(~> (slice file a) (slice file b))"
131
+ end
132
+
133
+ it "File[a] <~ File[b]" do
134
+ astdump(parse("File[a] <~ File[b]")).should == "(<~ (slice file a) (slice file b))"
135
+ end
136
+
137
+ it "Should chain relationships" do
138
+ astdump(parse("a -> b -> c")).should ==
139
+ "(-> (-> a b) c)"
140
+ end
141
+
142
+ it "Should chain relationships" do
143
+ astdump(parse("File[a] -> File[b] ~> File[c] <- File[d] <~ File[e]")).should ==
144
+ "(<~ (<- (~> (-> (slice file a) (slice file b)) (slice file c)) (slice file d)) (slice file e))"
145
+ end
146
+ end
147
+
148
+ context "When transforming collection" do
149
+ context "of virtual resources" do
150
+ it "File <| |>" do
151
+ astdump(parse("File <| |>")).should == "(collect file\n (<| |>))"
152
+ end
153
+ end
154
+
155
+ context "of exported resources" do
156
+ it "File <<| |>>" do
157
+ astdump(parse("File <<| |>>")).should == "(collect file\n (<<| |>>))"
158
+ end
159
+ end
160
+
161
+ context "queries are parsed with correct precedence" do
162
+ it "File <| tag == 'foo' |>" do
163
+ astdump(parse("File <| tag == 'foo' |>")).should == "(collect file\n (<| |> (== tag 'foo')))"
164
+ end
165
+
166
+ it "File <| tag == 'foo' and mode != 0777 |>" do
167
+ astdump(parse("File <| tag == 'foo' and mode != 0777 |>")).should == "(collect file\n (<| |> (&& (== tag 'foo') (!= mode 0777))))"
168
+ end
169
+
170
+ it "File <| tag == 'foo' or mode != 0777 |>" do
171
+ astdump(parse("File <| tag == 'foo' or mode != 0777 |>")).should == "(collect file\n (<| |> (|| (== tag 'foo') (!= mode 0777))))"
172
+ end
173
+
174
+ it "File <| tag == 'foo' or tag == 'bar' and mode != 0777 |>" do
175
+ astdump(parse("File <| tag == 'foo' or tag == 'bar' and mode != 0777 |>")).should ==
176
+ "(collect file\n (<| |> (|| (== tag 'foo') (&& (== tag 'bar') (!= mode 0777)))))"
177
+ end
178
+
179
+ it "File <| (tag == 'foo' or tag == 'bar') and mode != 0777 |>" do
180
+ astdump(parse("File <| (tag == 'foo' or tag == 'bar') and mode != 0777 |>")).should ==
181
+ "(collect file\n (<| |> (&& (|| (== tag 'foo') (== tag 'bar')) (!= mode 0777))))"
182
+ end
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,27 @@
1
+ require 'puppet/pops'
2
+ require 'puppet/parser/ast'
3
+
4
+ require File.join(File.dirname(__FILE__), '/../factory_rspec_helper')
5
+
6
+ module TransformerRspecHelper
7
+ include FactoryRspecHelper
8
+ # Dumps the AST to string form
9
+ #
10
+ def astdump(ast)
11
+ ast = transform(ast) unless ast.kind_of?(Puppet::Parser::AST)
12
+ Puppet::Pops::Model::AstTreeDumper.new.dump(ast)
13
+ end
14
+
15
+ # Transforms the Pops model to an AST model
16
+ #
17
+ def transform(model)
18
+ Puppet::Pops::Model::AstTransformer.new.transform(model)
19
+ end
20
+
21
+ # Parses the string code to a Pops model
22
+ #
23
+ def parse(code)
24
+ parser = Puppet::Pops::Parser::Parser.new()
25
+ parser.parse_string(code)
26
+ end
27
+ end
@@ -0,0 +1,94 @@
1
+ #! /usr/bin/env ruby
2
+ require 'spec_helper'
3
+ require 'puppet/pops'
4
+
5
+ describe Puppet::Pops::Visitor do
6
+ describe "A visitor and a visitable in a configuration with min and max args set to 0" do
7
+ class DuckProcessor
8
+ def initialize
9
+ @friend_visitor = Puppet::Pops::Visitor.new(self, "friend", 0, 0)
10
+ end
11
+
12
+ def hi(o, *args)
13
+ @friend_visitor.visit(o, *args)
14
+ end
15
+
16
+ def friend_Duck(o)
17
+ "Hi #{o.class}"
18
+ end
19
+
20
+ def friend_Numeric(o)
21
+ "Howdy #{o.class}"
22
+ end
23
+ end
24
+
25
+ class Duck
26
+ include Puppet::Pops::Visitable
27
+ end
28
+
29
+ it "should select the expected method when there are no arguments" do
30
+ duck = Duck.new
31
+ duck_processor = DuckProcessor.new
32
+ duck_processor.hi(duck).should == "Hi Duck"
33
+ end
34
+
35
+ it "should fail if there are too many arguments" do
36
+ duck = Duck.new
37
+ duck_processor = DuckProcessor.new
38
+ expect { duck_processor.hi(duck, "how are you?") }.to raise_error(/^Visitor Error: Too many.*/)
39
+ end
40
+
41
+ it "should select method for superclass" do
42
+ duck_processor = DuckProcessor.new
43
+ duck_processor.hi(42).should == "Howdy Fixnum"
44
+ end
45
+
46
+ it "should select method for superclass" do
47
+ duck_processor = DuckProcessor.new
48
+ duck_processor.hi(42.0).should == "Howdy Float"
49
+ end
50
+
51
+ it "should fail if class not handled" do
52
+ duck_processor = DuckProcessor.new
53
+ expect { duck_processor.hi("wassup?") }.to raise_error(/Visitor Error: the configured.*/)
54
+ end
55
+ end
56
+
57
+ describe "A visitor and a visitable in a configuration with min =1, and max args set to 2" do
58
+ class DuckProcessor2
59
+ def initialize
60
+ @friend_visitor = Puppet::Pops::Visitor.new(self, "friend", 1, 2)
61
+ end
62
+
63
+ def hi(o, *args)
64
+ @friend_visitor.visit(o, *args)
65
+ end
66
+
67
+ def friend_Duck(o, drink, eat="grain")
68
+ "Hi #{o.class}, drink=#{drink}, eat=#{eat}"
69
+ end
70
+ end
71
+
72
+ class Duck
73
+ include Puppet::Pops::Visitable
74
+ end
75
+
76
+ it "should select the expected method when there are is one arguments" do
77
+ duck = Duck.new
78
+ duck_processor = DuckProcessor2.new
79
+ duck_processor.hi(duck, "water").should == "Hi Duck, drink=water, eat=grain"
80
+ end
81
+
82
+ it "should fail if there are too many arguments" do
83
+ duck = Duck.new
84
+ duck_processor = DuckProcessor2.new
85
+ expect { duck_processor.hi(duck, "scotch", "soda", "peanuts") }.to raise_error(/^Visitor Error: Too many.*/)
86
+ end
87
+
88
+ it "should fail if there are too few arguments" do
89
+ duck = Duck.new
90
+ duck_processor = DuckProcessor2.new
91
+ expect { duck_processor.hi(duck) }.to raise_error(/^Visitor Error: Too few.*/)
92
+ end
93
+ end
94
+ end