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
@@ -1,6 +1,7 @@
1
1
  require 'find'
2
2
  require 'forwardable'
3
3
  require 'puppet/node/environment'
4
+ require 'puppet/parser/parser_factory'
4
5
 
5
6
  class Puppet::Parser::TypeLoader
6
7
  extend Forwardable
@@ -137,7 +138,8 @@ class Puppet::Parser::TypeLoader
137
138
 
138
139
  def parse_file(file)
139
140
  Puppet.debug("importing '#{file}' in environment #{environment}")
140
- parser = Puppet::Parser::Parser.new(environment)
141
+ # parser = Puppet::Parser::Parser.new(environment)
142
+ parser = Puppet::Parser::ParserFactory.parser(environment)
141
143
  parser.file = file
142
144
  return parser.parse
143
145
  end
@@ -0,0 +1,40 @@
1
+ module Puppet
2
+ module Pops
3
+ require 'puppet/pops/patterns'
4
+ require 'puppet/pops/utils'
5
+
6
+ require 'puppet/pops/adaptable'
7
+ require 'puppet/pops/adapters'
8
+
9
+ require 'puppet/pops/visitable'
10
+ require 'puppet/pops/visitor'
11
+
12
+ require 'puppet/pops/containment'
13
+
14
+ require 'puppet/pops/issues'
15
+ require 'puppet/pops/label_provider'
16
+ require 'puppet/pops/validation'
17
+
18
+ require 'puppet/pops/model/model'
19
+
20
+ module Model
21
+ require 'puppet/pops/model/tree_dumper'
22
+ require 'puppet/pops/model/ast_transformer'
23
+ require 'puppet/pops/model/ast_tree_dumper'
24
+ require 'puppet/pops/model/factory'
25
+ require 'puppet/pops/model/model_tree_dumper'
26
+ require 'puppet/pops/model/model_label_provider'
27
+ end
28
+
29
+ module Parser
30
+ require 'puppet/pops/parser/eparser'
31
+ require 'puppet/pops/parser/parser_support'
32
+ require 'puppet/pops/parser/lexer'
33
+ end
34
+
35
+ module Validation
36
+ require 'puppet/pops/validation/checker3_1'
37
+ require 'puppet/pops/validation/validator_factory_3_1'
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,190 @@
1
+ # Adaptable is a mix-in module that adds adaptability to a class.
2
+ # This means that an adapter can
3
+ # associate itself with an instance of the class and store additional data/have behavior.
4
+ #
5
+ # This mechanism should be used when there is a desire to keep implementation concerns separate.
6
+ # In Ruby it is always possible to open and modify a class or instance to teach it new tricks, but it
7
+ # is however not possible to do this for two different versions of some service at the same time.
8
+ # The Adaptable pattern is also good when only a few of the objects of some class needs to have extra
9
+ # information (again possible in Ruby by adding instance variables dynamically). In fact, the implementation
10
+ # of Adaptable does just that; it adds an instance variable named after the adapter class and keeps an
11
+ # instance of this class in this slot.
12
+ #
13
+ # @note the implementation details; the fact that an instance variable is used to keep the adapter
14
+ # instance data should not
15
+ # be exploited as the implementation of _being adaptable_ may change in the future.
16
+ # @api private
17
+ #
18
+ module Puppet::Pops::Adaptable
19
+ # Base class for an Adapter.
20
+ #
21
+ # A typical adapter just defines some accessors.
22
+ #
23
+ # A more advanced adapter may need to setup the adapter based on the object it is adapting.
24
+ # @example Making Duck adaptable
25
+ # class Duck
26
+ # include Puppet::Pops::Adaptable
27
+ # end
28
+ # @example Giving a Duck a nick name
29
+ # class NickNameAdapter < Puppet::Pops::Adaptable::Adapter
30
+ # attr_accessor :nick_name
31
+ # end
32
+ # d = Duck.new
33
+ # NickNameAdapter.adapt(d).nick_name = "Daffy"
34
+ # NickNameAdapter.get(d).nick_name # => "Daffy"
35
+ #
36
+ # @example Giving a Duck a more elaborate nick name
37
+ # class NickNameAdapter < Puppet::Pops::Adaptable::Adapter
38
+ # attr_accessor :nick_name, :object
39
+ # def initialize o
40
+ # @object = o
41
+ # @nick_name = "Yo"
42
+ # end
43
+ # def nick_name
44
+ # "#{@nick_name}, the #{o.class.name}"
45
+ # end
46
+ # def NickNameAdapter.create_adapter(o)
47
+ # x = new o
48
+ # x
49
+ # end
50
+ # end
51
+ # d = Duck.new
52
+ # n = NickNameAdapter.adapt(d)
53
+ # n.nick_name # => "Yo, the Duck"
54
+ # n.nick_name = "Daffy"
55
+ # n.nick_name # => "Daffy, the Duck"
56
+ # @example Using a block to set values
57
+ # NickNameAdapter.adapt(o) { |a| a.nick_name = "Buddy!" }
58
+ # NickNameAdapter.adapt(o) { |a, o| a.nick_name = "You're the best #{o.class.name} I met."}
59
+ #
60
+ class Adapter
61
+ # Returns an existing adapter for the given object, or nil, if the object is not
62
+ # adapted.
63
+ #
64
+ # @param o [Adaptable] object to get adapter from
65
+ # @return [Adapter<self>] an adapter of the same class as the receiver of #get
66
+ # @return [nil] if the given object o has not been adapted by the receiving adapter
67
+ # @raise [ArgumentError] if the object is not adaptable
68
+ #
69
+ def self.get(o)
70
+ attr_name = :"@#{instance_var_name(self.name)}"
71
+ if existing = o.instance_variable_defined?(attr_name)
72
+ o.instance_variable_get(attr_name)
73
+ else
74
+ nil
75
+ end
76
+ end
77
+
78
+ # Returns an existing adapter for the given object, or creates a new adapter if the
79
+ # object has not been adapted, or the adapter has been cleared.
80
+ #
81
+ # @example Using a block to set values
82
+ # NickNameAdapter.adapt(o) { |a| a.nick_name = "Buddy!" }
83
+ # NickNameAdapter.adapt(o) { |a, o| a.nick_name = "Your the best #{o.class.name} I met."}
84
+ # @overload adapt(o)
85
+ # @overload adapt(o, {|adapter| block})
86
+ # @overload adapt(o, {|adapter, o| block})
87
+ # @param o [Adaptable] object to add adapter to
88
+ # @yieldparam adapter [Adapter<self>] the created adapter
89
+ # @yieldparam o [Adaptable] optional, the given adaptable
90
+ # @param block [Proc] optional, evaluated in the context of the adapter (existing or new)
91
+ # @return [Adapter<self>] an adapter of the same class as the receiver of the call
92
+ # @raise [ArgumentError] if the given object o is not adaptable
93
+ #
94
+ def self.adapt(o, &block)
95
+ attr_name = :"@#{instance_var_name(self.name)}"
96
+ adapter = if existing = o.instance_variable_defined?(attr_name) && value = o.instance_variable_get(attr_name)
97
+ value
98
+ else
99
+ associate_adapter(create_adapter(o), o)
100
+ end
101
+ if block_given?
102
+ case block.arity
103
+ when 1
104
+ block.call(adapter)
105
+ else
106
+ block.call(adapter, o)
107
+ end
108
+ end
109
+ adapter
110
+ end
111
+
112
+ # Creates a new adapter, associates it with the given object and returns the adapter.
113
+ #
114
+ # @example Using a block to set values
115
+ # NickNameAdapter.adapt_new(o) { |a| a.nick_name = "Buddy!" }
116
+ # NickNameAdapter.adapt_new(o) { |a, o| a.nick_name = "Your the best #{o.class.name} I met."}
117
+ # This is used when a fresh adapter is wanted instead of possible returning an
118
+ # existing adapter as in the case of {Adapter.adapt}.
119
+ # @overload adapt_new(o)
120
+ # @overload adapt_new(o, {|adapter| block})
121
+ # @overload adapt_new(o, {|adapter, o| block})
122
+ # @yieldparam adapter [Adapter<self>] the created adapter
123
+ # @yieldparam o [Adaptable] optional, the given adaptable
124
+ # @param o [Adaptable] object to add adapter to
125
+ # @param block [Proc] optional, evaluated in the context of the new adapter
126
+ # @return [Adapter<self>] an adapter of the same class as the receiver of the call
127
+ # @raise [ArgumentError] if the given object o is not adaptable
128
+ #
129
+ def self.adapt_new(o, &block)
130
+ adapter = associate_adapter(create_adapter(o), o)
131
+ if block_given?
132
+ case block.arity
133
+ when 1
134
+ block.call(adapter)
135
+ else
136
+ block.call(adapter, o)
137
+ end
138
+ end
139
+ adapter
140
+ end
141
+
142
+ # Clears the adapter set in the given object o. Returns any set adapter or nil.
143
+ # @param o [Adaptable] the object where the adapter should be cleared
144
+ # @return [Adapter] if an adapter was set
145
+ # @return [nil] if the adapter has not been set
146
+ #
147
+ def self.clear(o)
148
+ attr_name = :"@#{instance_var_name(self.name)}"
149
+ if o.instance_variable_defined?(attr_name)
150
+ o.send(:remove_instance_variable, attr_name)
151
+ else
152
+ nil
153
+ end
154
+ end
155
+
156
+ # This base version creates an instance of the class (i.e. an instance of the concrete subclass
157
+ # of Adapter). A Specialization may want to create an adapter instance specialized for the given target
158
+ # object.
159
+ # @param o [Adaptable] The object to adapt. This implementation ignores this variable, but a
160
+ # specialization may want to initialize itself differently depending on the object it is adapting.
161
+ # @return [Adapter<self>] instance of the subclass of Adapter receiving the call
162
+ #
163
+ def self.create_adapter(o)
164
+ new
165
+ end
166
+
167
+ # Associates the given adapter with the given target object
168
+ # @param adapter [Adapter] the adapter to associate with the given object _o_
169
+ # @param o [Adaptable] the object to adapt
170
+ # @return [adapter] the given adapter
171
+ #
172
+ def self.associate_adapter(adapter, o)
173
+ attr_name = :"@#{instance_var_name(adapter.class.name)}"
174
+ o.instance_variable_set(attr_name, adapter)
175
+ adapter
176
+ end
177
+
178
+ # Returns a suitable instance variable name given a class name.
179
+ # The returned string is the fully qualified name of a class with '::' replaced by '_' since
180
+ # '::' is not allowed in an instance variable name.
181
+ # @param name [String] the fully qualified name of a class
182
+ # @return [String] the name with all '::' replaced by '_'
183
+ # @api private
184
+ # @private
185
+ #
186
+ def self.instance_var_name(name)
187
+ name.split("::").join('_')
188
+ end
189
+ end
190
+ end
@@ -0,0 +1,65 @@
1
+ # The Adapters module contains adapters for Documentation, Origin, SourcePosition, and Loader.
2
+ #
3
+ module Puppet::Pops::Adapters
4
+ # A documentation adapter adapts an object with a documentation string.
5
+ # (The intended use is for a source text parser to extract documentation and store this
6
+ # in DocumentationAdapter instances).
7
+ #
8
+ class DocumentationAdapter < Puppet::Pops::Adaptable::Adapter
9
+ # @return [String] The documentation associated with an object
10
+ attr_accessor :documentation
11
+ end
12
+
13
+ # An origin adapter adapts an object with where it came from. This origin
14
+ # describes the resource (a file, etc.) where source text originates.
15
+ # Instances of SourcePosAdapter is then used on other objects in a model to
16
+ # describe their relative position versus the origin.
17
+ #
18
+ # @see Puppet::Pops::Utils#find_adapter
19
+ #
20
+ class OriginAdapter < Puppet::Pops::Adaptable::Adapter
21
+ # @return [String] the origin of the adapted (usually a filename)
22
+ attr_accessor :origin
23
+ end
24
+
25
+ # A SourcePosAdapter describes a position relative to an origin. (Typically an {OriginAdapter} is
26
+ # associated with the root of a model. This origin has a URI to the resource, and a line number.
27
+ # The offset in the SourcePosAdapter is then relative to this origin.
28
+ # (This somewhat complex structure makes it possible to correctly refer to a source position
29
+ # in source that is embedded in some resource; a parser only sees the embedded snippet of source text
30
+ # and does not know where it was embedded).
31
+ #
32
+ # @see Puppet::Pops::Utils#find_adapter
33
+ #
34
+ class SourcePosAdapter < Puppet::Pops::Adaptable::Adapter
35
+ # @return [Fixnum] The start line in source starting from 1
36
+ attr_accessor :line
37
+
38
+ # @return [Fixnum] The position on the start_line (in characters) starting from 0
39
+ attr_accessor :pos
40
+
41
+ # @return [Fixnum] The (start) offset of source text characters
42
+ # (starting from 0) representing the adapted object.
43
+ # Value may be nil
44
+ attr_accessor :offset
45
+
46
+ # @return [Fixnum] The length (count) of characters of source text
47
+ # representing the adapted object from the origin. Not including any
48
+ # trailing whitespace.
49
+ attr_accessor :length
50
+ end
51
+
52
+ # A LoaderAdapter adapts an object with a {Puppet::Pops::Loader}. This is used to make further loading from the
53
+ # perspective of the adapted object take place in the perspective of this Loader.
54
+ #
55
+ # It is typically enough to adapt the root of a model as a search is made towards the root of the model
56
+ # until a loader is found, but there is no harm in duplicating this information provided a contained
57
+ # object is adapted with the correct loader.
58
+ #
59
+ # @see Puppet::Pops::Utils#find_adapter
60
+ #
61
+ class LoaderAdapter < Puppet::Pops::Adaptable::Adapter
62
+ # @return [Puppet::Pops::Loader] the loader
63
+ attr_accessor :loader
64
+ end
65
+ end
@@ -0,0 +1,37 @@
1
+ # FIXME: This module should be updated when a newer version of RGen (>0.6.2) adds required meta model "e-method" supports.
2
+ #
3
+ module Puppet::Pops::Containment
4
+ # Returns Enumerable, thus allowing
5
+ # some_element.eAllContents each {|contained| }
6
+ # This is a depth first enumeration where parent appears before children.
7
+ # @note the top-most object itself is not included in the enumeration, only what it contains.
8
+ def eAllContents
9
+ EAllContentsEnumerator.new(self)
10
+ end
11
+
12
+ class EAllContentsEnumerator
13
+ include Enumerable
14
+ def initialize o
15
+ @element = o
16
+ end
17
+
18
+ def each &block
19
+ if block_given?
20
+ eAllContents(@element, &block)
21
+ @element
22
+ else
23
+ self
24
+ end
25
+ end
26
+
27
+ def eAllContents(element, &block)
28
+ element.class.ecore.eAllReferences.select{|r| r.containment}.each do |r|
29
+ children = element.getGenericAsArray(r.name)
30
+ children.each do |c|
31
+ block.call(c)
32
+ eAllContents(c, &block)
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,258 @@
1
+ # Defines classes to deal with issues, and message formatting and defines constants with Issues.
2
+ # @api public
3
+ #
4
+ module Puppet::Pops::Issues
5
+ # Describes an issue, and can produce a message for an occurrence of the issue.
6
+ #
7
+ class Issue
8
+ # The issue code
9
+ # @return [Symbol]
10
+ attr_reader :issue_code
11
+
12
+ # A block producing the message
13
+ # @return [Proc]
14
+ attr_reader :message_block
15
+
16
+ # Names that must be bound in an occurrence of the issue to be able to produce a message.
17
+ # These are the names in addition to requirements stipulated by the Issue formatter contract; i.e. :label`,
18
+ # and `:semantic`.
19
+ #
20
+ attr_reader :arg_names
21
+
22
+ # If this issue can have its severity lowered to :warning, :deprecation, or :ignored
23
+ attr_writer :demotable
24
+ # Configures the Issue with required arguments (bound by occurrence), and a block producing a message.
25
+ def initialize issue_code, *args, &block
26
+ @issue_code = issue_code
27
+ @message_block = block
28
+ @arg_names = args
29
+ @demotable = true
30
+ end
31
+
32
+ # Returns true if it is allowed to demote this issue
33
+ def demotable?
34
+ @demotable
35
+ end
36
+
37
+ # Formats a message for an occurrence of the issue with argument bindings passed in a hash.
38
+ # The hash must contain a LabelProvider bound to the key `label` and the semantic model element
39
+ # bound to the key `semantic`. All required arguments as specified by `arg_names` must be bound
40
+ # in the given `hash`.
41
+ # @api public
42
+ #
43
+ def format(hash ={})
44
+ # Create a Message Data where all hash keys become methods for convenient interpolation
45
+ # in issue text.
46
+ msgdata = MessageData.new(*arg_names)
47
+ # Evaluate the message block in the msg data's binding
48
+ msgdata.format(hash, &message_block)
49
+ end
50
+ end
51
+
52
+ # Provides a binding of arguments passed to Issue.format to method names available
53
+ # in the issue's message producing block.
54
+ # @api private
55
+ #
56
+ class MessageData
57
+ def initialize *argnames
58
+ singleton = class << self; self end
59
+ argnames.each do |name|
60
+ singleton.send(:define_method, name) do
61
+ @data[name]
62
+ end
63
+ end
64
+ end
65
+
66
+ def format(hash, &block)
67
+ @data = hash
68
+ instance_eval &block
69
+ end
70
+
71
+ # Returns the label provider given as a key in the hash passed to #format.
72
+ #
73
+ def label
74
+ raise "Label provider key :label must be set to produce the text of the message!" unless @data[:label]
75
+ @data[:label]
76
+ end
77
+
78
+ # Returns the label provider given as a key in the hash passed to #format.
79
+ #
80
+ def semantic
81
+ raise "Label provider key :semantic must be set to produce the text of the message!" unless @data[:semantic]
82
+ @data[:semantic]
83
+ end
84
+ end
85
+
86
+ # Defines an issue with the given `issue_code`, additional required parameters, and a block producing a message.
87
+ # The block is evaluated in the context of a MessageData which provides convenient access to all required arguments
88
+ # via accessor methods. In addition to accessors for specified arguments, these are also available:
89
+ # * `label` - a `LabelProvider` that provides human understandable names for model elements and production of article (a/an/the).
90
+ # * `semantic` - the model element for which the issue is reported
91
+ #
92
+ # @param issue_code [Symbol] the issue code for the issue used as an identifier, should be the same as the constant
93
+ # the issue is bound to.
94
+ # @param *args [Symbol] required arguments that must be passed when formatting the message, may be empty
95
+ # @param &block [Proc] a block producing the message string, evaluated in a MessageData scope. The produced string
96
+ # should not end with a period as additional information may be appended.
97
+ #
98
+ # @see MessageData
99
+ # @api public
100
+ #
101
+ def self.issue (issue_code, *args, &block)
102
+ Issue.new(issue_code, *args, &block)
103
+ end
104
+
105
+ # Creates a non demotable issue.
106
+ # @see Issue.issue
107
+ #
108
+ def self.hard_issue(issue_code, *args, &block)
109
+ result = Issue.new(issue_code, *args, &block)
110
+ result.demotable = false
111
+ result
112
+ end
113
+
114
+ # @comment Here follows definitions of issues. The intent is to provide a list from which yardoc can be generated
115
+ # containing more detailed information / explanation of the issue.
116
+ # These issues are set as constants, but it is unfortunately not possible for the created object to easily know which
117
+ # name it is bound to. Instead the constant has to be repeated. (Alternatively, it could be done by instead calling
118
+ # #const_set on the module, but the extra work required to get yardoc output vs. the extra effort to repeat the name
119
+ # twice makes it not worth it (if doable at all, since there is no tag to artificially construct a constant, and
120
+ # the parse tag does not produce any result for a constant assignment).
121
+
122
+ # This is allowed (3.1) and has not yet been deprecated.
123
+ # @todo configuration
124
+ #
125
+ NAME_WITH_HYPHEN = issue :NAME_WITH_HYPHEN, :name do
126
+ "#{label.a_an_uc(semantic)} may not have a name contain a hyphen. The name '#{name}' is not legal"
127
+ end
128
+
129
+ # When a variable name contains a hyphen and these are illegal.
130
+ # It is possible to control if a hyphen is legal in a name or not using the setting TODO
131
+ # @todo describe the setting
132
+ # @api public
133
+ # @todo configuration if this is error or warning
134
+ #
135
+ VAR_WITH_HYPHEN = issue :VAR_WITH_HYPHEN, :name do
136
+ "A variable name may not contain a hyphen. The name '#{name}' is not legal"
137
+ end
138
+
139
+ # A class, definition, or node may only appear at top level or inside other classes
140
+ # @todo Is this really true for nodes? Can they be inside classes? Isn't that too late?
141
+ # @api public
142
+ #
143
+ NOT_TOP_LEVEL = hard_issue :NOT_TOP_LEVEL do
144
+ "Classes, definitions, and nodes may only appear at toplevel or inside other classes"
145
+ end
146
+
147
+ CROSS_SCOPE_ASSIGNMENT = hard_issue :CROSS_SCOPE_ASSIGNMENT, :name do
148
+ "Illegal attempt to assign to '#{name}'. Cannot assign to variables in other namespaces"
149
+ end
150
+
151
+ # Assignment can only be made to certain types of left hand expressions such as variables.
152
+ ILLEGAL_ASSIGNMENT = hard_issue :ILLEGAL_ASSIGNMENT do
153
+ "Illegal attempt to assign to '#{label.a_an(semantic)}'. Not an assignable reference"
154
+ end
155
+
156
+ # Assignment cannot be made to numeric match result variables
157
+ ILLEGAL_NUMERIC_ASSIGNMENT = issue :ILLEGAL_NUMERIC_ASSIGNMENT, :varname do
158
+ "Illegal attempt to assign to the numeric match result variable '$#{varname}'. Numeric variables are not assignable"
159
+ end
160
+
161
+ # parameters cannot have numeric names, clashes with match result variables
162
+ ILLEGAL_NUMERIC_PARAMETER = issue :ILLEGAL_NUMERIC_PARAMETER, :name do
163
+ "The numeric parameter name '$#{varname}' cannot be used (clashes with numeric match result variables)"
164
+ end
165
+
166
+ # In certain versions of Puppet it may be allowed to assign to a not already assigned key
167
+ # in an array or a hash. This is an optional validation that may be turned on to prevent accidental
168
+ # mutation.
169
+ #
170
+ ILLEGAL_INDEXED_ASSIGNMENT = issue :ILLEGAL_INDEXED_ASSIGNMENT do
171
+ "Illegal attempt to assign via [index/key]. Not an assignable reference"
172
+ end
173
+
174
+ # When indexed assignment ($x[]=) is allowed, the leftmost expression must be
175
+ # a variable expression.
176
+ #
177
+ ILLEGAL_ASSIGNMENT_VIA_INDEX = hard_issue :ILLEGAL_ASSIGNMENT_VIA_INDEX do
178
+ "Illegal attempt to assign to #{label.a_an(semantic)} via [index/key]. Not an assignable reference"
179
+ end
180
+
181
+ # Some expressions/statements may not produce a value (known as right-value, or rvalue).
182
+ # This may vary between puppet versions.
183
+ #
184
+ NOT_RVALUE = issue :NOT_RVALUE do
185
+ "Invalid use of expression. #{label.a_an_uc(semantic)} does not produce a value"
186
+ end
187
+
188
+ # Appending to attributes is only allowed in certain types of resource expressions.
189
+ #
190
+ ILLEGAL_ATTRIBUTE_APPEND = hard_issue :ILLEGAL_ATTRIBUTE_APPEND, :name, :parent do
191
+ "Illegal +> operation on attribute #{name}. This operator can not be used in #{label.a_an(parent)}"
192
+ end
193
+
194
+ # In case a model is constructed programmatically, it must create valid type references.
195
+ #
196
+ ILLEGAL_CLASSREF = hard_issue :ILLEGAL_CLASSREF, :name do
197
+ "Illegal type reference. The given name '#{name}' does not conform to the naming rule"
198
+ end
199
+
200
+ # This is a runtime issue - storeconfigs must be on in order to collect exported. This issue should be
201
+ # set to :ignore when just checking syntax.
202
+ # @todo should be a :warning by default
203
+ #
204
+ RT_NO_STORECONFIGS = issue :RT_NO_STORECONFIGS do
205
+ "You cannot collect exported resources without storeconfigs being set; the collection will be ignored"
206
+ end
207
+
208
+ # This is a runtime issue - storeconfigs must be on in order to export a resource. This issue should be
209
+ # set to :ignore when just checking syntax.
210
+ # @todo should be a :warning by default
211
+ #
212
+ RT_NO_STORECONFIGS_EXPORT = issue :RT_NO_STORECONFIGS_EXPORT do
213
+ "You cannot collect exported resources without storeconfigs being set; the export is ignored"
214
+ end
215
+
216
+ # A hostname may only contain letters, digits, '_', '-', and '.'.
217
+ #
218
+ ILLEGAL_HOSTNAME_CHARS = hard_issue :ILLEGAL_HOSTNAME_CHARS, :hostname do
219
+ "The hostname '#{hostname}' contains illegal characters (only letters, digits, '_', '-', and '.' are allowed)"
220
+ end
221
+
222
+ # A hostname may only contain letters, digits, '_', '-', and '.'.
223
+ #
224
+ ILLEGAL_HOSTNAME_INTERPOLATION = hard_issue :ILLEGAL_HOSTNAME_INTERPOLATION do
225
+ "An interpolated expression is not allowed in a hostname of a node"
226
+ end
227
+
228
+ # Issues when an expression is used where it is not legal.
229
+ # E.g. an arithmetic expression where a hostname is expected.
230
+ #
231
+ ILLEGAL_EXPRESSION = hard_issue :ILLEGAL_EXPRESSION, :feature, :container do
232
+ "Illegal expression. #{label.a_an_uc(semantic)} is unacceptable as #{feature} in #{label.a_an(container)}"
233
+ end
234
+
235
+ # Issues when an expression is used illegaly in a query.
236
+ # query only supports == and !=, and not <, > etc.
237
+ #
238
+ ILLEGAL_QUERY_EXPRESSION = hard_issue :ILLEGAL_QUERY_EXPRESSION do
239
+ "Illegal query expression. #{label.a_an_uc(semantic)} cannot be used in a query"
240
+ end
241
+
242
+ # If an attempt is made to make a resource default virtual or exported.
243
+ #
244
+ NOT_VIRTUALIZEABLE = hard_issue :NOT_VIRTUALIZEABLE do
245
+ "Resource Defaults are not virtualizable"
246
+ end
247
+
248
+ # When an attempt is made to use multiple keys (to produce a range in Ruby - e.g. $arr[2,-1]).
249
+ # This is currently not supported, but may be in future versions
250
+ #
251
+ UNSUPPORTED_RANGE = issue :UNSUPPORTED_RANGE, :count do
252
+ "Attempt to use unsupported range in #{label.a_an(semantic)}, #{count} values given for max 1"
253
+ end
254
+
255
+ DEPRECATED_NAME_AS_TYPE = issue :DEPRECATED_NAME_AS_TYPE, :name do
256
+ "Resource references should now be capitalized. The given '#{name}' does not have the correct form"
257
+ end
258
+ end