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,378 @@
1
+ require 'puppet/parser/ast'
2
+
3
+ # Dumps a Pops::Model in reverse polish notation; i.e. LISP style
4
+ # The intention is to use this for debugging output
5
+ # TODO: BAD NAME - A DUMP is a Ruby Serialization
6
+ #
7
+ class Puppet::Pops::Model::AstTreeDumper < Puppet::Pops::Model::TreeDumper
8
+ AST = Puppet::Parser::AST
9
+ Model = Puppet::Pops::Model
10
+
11
+ def dump_LiteralNumber o
12
+ case o.radix
13
+ when 10
14
+ o.value.to_s
15
+ when 8
16
+ "0%o" % o.value
17
+ when 16
18
+ "0x%X" % o.value
19
+ else
20
+ "bad radix:" + o.value.to_s
21
+ end
22
+ end
23
+
24
+ def dump_Factory o
25
+ do_dump(o.current)
26
+ end
27
+
28
+ def dump_ArithmeticOperator o
29
+ [o.operator.to_s, do_dump(o.lval), do_dump(o.rval)]
30
+ end
31
+ def dump_Relationship o
32
+ [o.arrow.to_s, do_dump(o.left), do_dump(o.right)]
33
+ end
34
+
35
+ # Hostname is tricky, it is either a bare word, a string, or default, or regular expression
36
+ # Least evil, all strings except default are quoted
37
+ def dump_HostName o
38
+ result = do_dump o.value
39
+ unless o.value.is_a? AST::Regex
40
+ result = result == "default" ? ":default" : "'#{result}'"
41
+ end
42
+ result
43
+ end
44
+
45
+ # x[y] prints as (slice x y)
46
+ def dump_HashOrArrayAccess o
47
+ var = o.variable.is_a?(String) ? "$#{o.variable}" : do_dump(o.variable)
48
+ ["slice", var, do_dump(o.key)]
49
+ end
50
+
51
+ # The AST Collection knows about exported or virtual query, not the query.
52
+ def dump_Collection o
53
+ result = ["collect", do_dump(o.type), :indent, :break]
54
+ if o.form == :virtual
55
+ q = ["<| |>"]
56
+ else
57
+ q = ["<<| |>>"]
58
+ end
59
+ q << do_dump(o.query) unless is_nop?(o.query)
60
+ q << :indent
61
+ result << q
62
+ o.override do |ao|
63
+ result << :break << do_dump(ao)
64
+ end
65
+ result += [:dedent, :dedent ]
66
+ result
67
+ end
68
+
69
+ def dump_CollExpr o
70
+ operator = case o.oper
71
+ when 'and'
72
+ '&&'
73
+ when 'or'
74
+ '||'
75
+ else
76
+ o.oper
77
+ end
78
+ [operator, do_dump(o.test1), do_dump(o.test2)]
79
+ end
80
+
81
+ def dump_ComparisonOperator o
82
+ [o.operator.to_s, do_dump(o.lval), do_dump(o.rval)]
83
+ end
84
+
85
+ def dump_Boolean o
86
+ o.to_s
87
+ end
88
+
89
+ def dump_BooleanOperator o
90
+ operator = o.operator == 'and' ? '&&' : '||'
91
+ [operator, do_dump(o.lval), do_dump(o.rval)]
92
+ end
93
+
94
+ def dump_InOperator o
95
+ ["in", do_dump(o.lval), do_dump(o.rval)]
96
+ end
97
+
98
+ # $x = ...
99
+ # $x += ...
100
+ #
101
+ def dump_VarDef o
102
+ operator = o.append ? "+=" : "="
103
+ [operator, '$' + do_dump(o.name), do_dump(o.value)]
104
+ end
105
+
106
+ # Produces (name => expr) or (name +> expr)
107
+ def dump_ResourceParam o
108
+ operator = o.add ? "+>" : "=>"
109
+ [do_dump(o.param), operator, do_dump(o.value)]
110
+ end
111
+
112
+ def dump_Array o
113
+ o.collect {|e| do_dump(e) }
114
+ end
115
+
116
+ def dump_ASTArray o
117
+ ["[]"] + o.children.collect {|x| do_dump(x)}
118
+ end
119
+
120
+ def dump_ASTHash o
121
+ ["{}"] + o.value.sort_by{|k,v| k.to_s}.collect {|x| [do_dump(x[0]), do_dump(x[1])]}
122
+ # ["{}"] + o.value.collect {|x| [do_dump(x[0]), do_dump(x[1])]}
123
+ end
124
+
125
+ def dump_MatchOperator o
126
+ [o.operator.to_s, do_dump(o.lval), do_dump(o.rval)]
127
+ end
128
+
129
+ # Dump a Ruby String in single quotes unless it is a number.
130
+ def dump_String o
131
+
132
+ if o.is_a? String
133
+ o # A Ruby String, not quoted
134
+ elsif n = Puppet::Pops::Utils.to_n(o.value)
135
+ o.value # AST::String that is a number without quotes
136
+ else
137
+ "'#{o.value}'" # AST::String that is not a number
138
+ end
139
+ end
140
+
141
+ def dump_Lambda o
142
+ result = ["lambda"]
143
+ result << ["parameters"] + o.parameters.collect {|p| _dump_ParameterArray(p) } if o.parameters.size() > 0
144
+ if o.children == []
145
+ result << [] # does not have a lambda body
146
+ else
147
+ result << do_dump(o.children)
148
+ end
149
+ result
150
+ end
151
+
152
+ def dump_Default o
153
+ ":default"
154
+ end
155
+
156
+ def dump_Undef o
157
+ ":undef"
158
+ end
159
+
160
+ # Note this is Regex (the AST kind), not Ruby Regexp
161
+ def dump_Regex o
162
+ "/#{o.value.source}/"
163
+ end
164
+
165
+ def dump_Nop o
166
+ ":nop"
167
+ end
168
+
169
+ def dump_NilClass o
170
+ "()"
171
+ end
172
+
173
+ def dump_Not o
174
+ ['!', dump(o.value)]
175
+ end
176
+
177
+ def dump_Variable o
178
+ "$#{dump(o.value)}"
179
+ end
180
+
181
+ def dump_Minus o
182
+ ['-', do_dump(o.value)]
183
+ end
184
+
185
+ def dump_BlockExpression o
186
+ ["block"] + o.children.collect {|x| do_dump(x) }
187
+ end
188
+
189
+ # Interpolated strings are shown as (cat seg0 seg1 ... segN)
190
+ def dump_Concat o
191
+ ["cat"] + o.value.collect {|x| x.is_a?(AST::String) ? " "+do_dump(x) : ["str", do_dump(x)]}
192
+ end
193
+
194
+ def dump_Hostclass o
195
+ # ok, this is kind of crazy stuff in the AST, information in a context instead of in AST, and
196
+ # parameters are in a Ruby Array with each parameter being an Array...
197
+ #
198
+ context = o.context
199
+ args = context[:arguments]
200
+ parent = context[:parent]
201
+ result = ["class", o.name]
202
+ result << ["inherits", parent] if parent
203
+ result << ["parameters"] + args.collect {|p| _dump_ParameterArray(p) } if args && args.size() > 0
204
+ if is_nop?(o.code)
205
+ result << []
206
+ else
207
+ result << do_dump(o.code)
208
+ end
209
+ result
210
+ end
211
+
212
+ def dump_Name o
213
+ o.value
214
+ end
215
+
216
+ def dump_Node o
217
+ context = o.context
218
+ parent = context[:parent]
219
+ code = context[:code]
220
+
221
+ result = ["node"]
222
+ result << ["matches"] + o.names.collect {|m| do_dump(m) }
223
+ result << ["parent", do_dump(parent)] if !is_nop?(parent)
224
+ if is_nop?(code)
225
+ result << []
226
+ else
227
+ result << do_dump(code)
228
+ end
229
+ result
230
+ end
231
+
232
+ def dump_Definition o
233
+ # ok, this is even crazier that Hostclass. The name of the define does not have an accessor
234
+ # and some things are in the context (but not the name). Parameters are called arguments and they
235
+ # are in a Ruby Array where each parameter is an array of 1 or 2 elements.
236
+ #
237
+ context = o.context
238
+ name = o.instance_variable_get("@name")
239
+ args = context[:arguments]
240
+ code = context[:code]
241
+ result = ["define", name]
242
+ result << ["parameters"] + args.collect {|p| _dump_ParameterArray(p) } if args && args.size() > 0
243
+ if is_nop?(code)
244
+ result << []
245
+ else
246
+ result << do_dump(code)
247
+ end
248
+ result
249
+ end
250
+
251
+ def dump_ResourceReference o
252
+ result = ["slice", do_dump(o.type)]
253
+ if o.title.children.size == 1
254
+ result << do_dump(o.title[0])
255
+ else
256
+ result << do_dump(o.title.children)
257
+ end
258
+ result
259
+ end
260
+
261
+ def dump_ResourceOverride o
262
+ result = ["override", do_dump(o.object), :indent]
263
+ o.parameters.each do |p|
264
+ result << :break << do_dump(p)
265
+ end
266
+ result << :dedent
267
+ result
268
+ end
269
+
270
+ # Puppet AST encodes a parameter as a one or two slot Array.
271
+ # This is not a polymorph dump method.
272
+ #
273
+ def _dump_ParameterArray o
274
+ if o.size == 2
275
+ ["=", o[0], do_dump(o[1])]
276
+ else
277
+ o[0]
278
+ end
279
+ end
280
+
281
+ def dump_IfStatement o
282
+ result = ["if", do_dump(o.test), :indent, :break,
283
+ ["then", :indent, do_dump(o.statements), :dedent]]
284
+ result +=
285
+ [:break,
286
+ ["else", :indent, do_dump(o.else), :dedent],
287
+ :dedent] unless is_nop? o.else
288
+ result
289
+ end
290
+
291
+ # Produces (invoke name args...) when not required to produce an rvalue, and
292
+ # (call name args ... ) otherwise.
293
+ #
294
+ def dump_Function o
295
+ # somewhat ugly as Function hides its "ftype" instance variable
296
+ result = [o.instance_variable_get("@ftype") == :rvalue ? "call" : "invoke", do_dump(o.name)]
297
+ o.arguments.collect {|a| result << do_dump(a) }
298
+ result << do_dump(o.pblock) if o.pblock
299
+ result
300
+ end
301
+
302
+ def dump_MethodCall o
303
+ # somewhat ugly as Method call (does the same as function) and hides its "ftype" instance variable
304
+ result = [o.instance_variable_get("@ftype") == :rvalue ? "call-method" : "invoke-method",
305
+ [".", do_dump(o.receiver), do_dump(o.name)]]
306
+ o.arguments.collect {|a| result << do_dump(a) }
307
+ result << do_dump(o.lambda) if o.lambda
308
+ result
309
+ end
310
+
311
+ def dump_CaseStatement o
312
+ result = ["case", do_dump(o.test), :indent]
313
+ o.options.each do |s|
314
+ result << :break << do_dump(s)
315
+ end
316
+ result << :dedent
317
+ end
318
+
319
+ def dump_CaseOpt o
320
+ result = ["when"]
321
+ result << o.value.collect {|x| do_dump(x) }
322
+ # A bit of trickery to get it into the same shape as Pops output
323
+ if is_nop?(o.statements)
324
+ result << ["then", []] # Puppet AST has a nop if there is no body
325
+ else
326
+ result << ["then", do_dump(o.statements) ]
327
+ end
328
+ result
329
+ end
330
+
331
+ def dump_ResourceInstance o
332
+ result = [do_dump(o.title), :indent]
333
+ o.parameters.each do |p|
334
+ result << :break << do_dump(p)
335
+ end
336
+ result << :dedent
337
+ result
338
+ end
339
+
340
+ def dump_ResourceDefaults o
341
+ result = ["resource-defaults", do_dump(o.type), :indent]
342
+ o.parameters.each do |p|
343
+ result << :break << do_dump(p)
344
+ end
345
+ result << :dedent
346
+ result
347
+ end
348
+
349
+ def dump_Resource o
350
+ if o.exported
351
+ form = 'exported-'
352
+ elsif o.virtual
353
+ form = 'virtual-'
354
+ else
355
+ form = ''
356
+ end
357
+ result = [form+"resource", do_dump(o.type), :indent]
358
+ o.instances.each do |b|
359
+ result << :break << do_dump(b)
360
+ end
361
+ result << :dedent
362
+ result
363
+ end
364
+
365
+ def dump_Selector o
366
+ values = o.values
367
+ values = [values] unless values.instance_of? AST::ASTArray or values.instance_of? Array
368
+ ["?", do_dump(o.param)] + values.collect {|x| do_dump(x) }
369
+ end
370
+
371
+ def dump_Object o
372
+ ['dev-error-no-polymorph-dump-for:', o.class.to_s, o.to_s]
373
+ end
374
+
375
+ def is_nop? o
376
+ o.nil? || o.is_a?(Model::Nop) || o.is_a?(AST::Nop)
377
+ end
378
+ end
@@ -0,0 +1,804 @@
1
+ # Factory is a helper class that makes construction of a Pops Model
2
+ # much more convenient. It can be viewed as a small internal DSL for model
3
+ # constructions.
4
+ # For usage see tests using the factory.
5
+ #
6
+ # @todo All those uppercase methods ... they look bad in one way, but stand out nicely in the grammar...
7
+ # decide if they should change into lower case names (some of the are lower case)...
8
+ #
9
+ class Puppet::Pops::Model::Factory
10
+ Model = Puppet::Pops::Model
11
+
12
+ attr_accessor :current
13
+
14
+ # Shared build_visitor, since there are many instances of Factory being used
15
+ @@build_visitor = Puppet::Pops::Visitor.new(self, "build")
16
+ # Initialize a factory with a single object, or a class with arguments applied to build of
17
+ # created instance
18
+ #
19
+ def initialize popsobj, *args
20
+ @current = to_ops(popsobj, *args)
21
+ end
22
+
23
+ # Polymorphic build
24
+ def build(o, *args)
25
+ begin
26
+ @@build_visitor.visit_this(self, o, *args)
27
+ rescue =>e
28
+ # require 'debugger'; debugger # enable this when in trouble...
29
+ raise e
30
+ end
31
+ end
32
+
33
+ # Building of Model classes
34
+
35
+ def build_ArithmeticExpression(o, op, a, b)
36
+ o.operator = op
37
+ build_BinaryExpression(o, a, b)
38
+ end
39
+
40
+ def build_AssignmentExpression(o, op, a, b)
41
+ o.operator = op
42
+ build_BinaryExpression(o, a, b)
43
+ end
44
+
45
+ def build_AttributeOperation(o, name, op, value)
46
+ o.operator = op
47
+ o.attribute_name = name.to_s # BOOLEAN is allowed in the grammar
48
+ o.value_expr = build(value)
49
+ o
50
+ end
51
+
52
+ def build_AccessExpression(o, left, *keys)
53
+ o.left_expr = to_ops(left)
54
+ keys.each {|expr| o.addKeys(to_ops(expr)) }
55
+ o
56
+ end
57
+
58
+ def build_BinaryExpression(o, left, right)
59
+ o.left_expr = to_ops(left)
60
+ o.right_expr = to_ops(right)
61
+ o
62
+ end
63
+
64
+ def build_BlockExpression(o, *args)
65
+ args.each {|expr| o.addStatements(to_ops(expr)) }
66
+ o
67
+ end
68
+
69
+ def build_CollectExpression(o, type_expr, query_expr, attribute_operations)
70
+ o.type_expr = to_ops(type_expr)
71
+ o.query = build(query_expr)
72
+ attribute_operations.each {|op| o.addOperations(build(op)) }
73
+ o
74
+ end
75
+
76
+ def build_ComparisonExpression(o, op, a, b)
77
+ o.operator = op
78
+ build_BinaryExpression(o, a, b)
79
+ end
80
+
81
+ def build_ConcatenatedString(o, *args)
82
+ args.each {|expr| o.addSegments(build(expr)) }
83
+ o
84
+ end
85
+
86
+ def build_CreateTypeExpression(o, name, super_name = nil)
87
+ o.name = name
88
+ o.super_name = super_name
89
+ o
90
+ end
91
+
92
+ def build_CreateEnumExpression(o, *args)
93
+ o.name = args.slice(0) if args.size == 2
94
+ o.values = build(args.last)
95
+ o
96
+ end
97
+
98
+ def build_CreateAttributeExpression(o, name, datatype_expr)
99
+ o.name = name
100
+ o.type = to_ops(datatype_expr)
101
+ o
102
+ end
103
+
104
+ # @param name [String] a valid classname
105
+ # @param parameters [Array<Model::Parameter>] may be empty
106
+ # @param parent_class_name [String, nil] a valid classname referencing a parent class, optional.
107
+ # @param body [Array<Expression>, Expression, nil] expression that constitute the body
108
+ # @return [Model::HostClassDefinition] configured from the parameters
109
+ #
110
+ def build_HostClassDefinition(o, name, parameters, parent_class_name, body)
111
+ build_NamedDefinition(o, name, parameters, body)
112
+ o.parent_class = parent_class_name if parent_class_name
113
+ o
114
+ end
115
+
116
+ # # @param name [String] a valid classname
117
+ # # @param parameters [Array<Model::Parameter>] may be empty
118
+ # # @param body [Array<Expression>, Expression, nil] expression that constitute the body
119
+ # # @return [Model::HostClassDefinition] configured from the parameters
120
+ # #
121
+ # def build_ResourceTypeDefinition(o, name, parameters, body)
122
+ # build_NamedDefinition(o, name, parameters, body)
123
+ # o.name = name
124
+ # parameters.each {|p| o.addParameters(build(p)) }
125
+ # b = f_build_body(body)
126
+ # o.body = b.current if b
127
+ # o
128
+ # end
129
+
130
+ def build_ResourceOverrideExpression(o, resources, attribute_operations)
131
+ o.resources = build(resources)
132
+ attribute_operations.each {|ao| o.addOperations(build(ao)) }
133
+ o
134
+ end
135
+
136
+ def build_KeyedEntry(o, k, v)
137
+ o.key = build(k)
138
+ o.value = build(v)
139
+ o
140
+ end
141
+
142
+ def build_LiteralHash(o, *keyed_entries)
143
+ keyed_entries.each {|entry| o.addEntries build(entry) }
144
+ o
145
+ end
146
+
147
+ def build_LiteralList(o, *values)
148
+ values.each {|v| o.addValues build(v) }
149
+ o
150
+ end
151
+
152
+ def build_LiteralNumber(o, val, radix)
153
+ o.value = val
154
+ o.radix = radix
155
+ o
156
+ end
157
+
158
+ def build_InstanceReferences(o, type_name, name_expressions)
159
+ o.type_name = build(type_name)
160
+ name_expressions.each {|n| o.addNames(build(n)) }
161
+ o
162
+ end
163
+
164
+ def build_ImportExpression(o, files)
165
+ # The argument files has already been built
166
+ files.each {|f| o.addFiles(to_ops(f)) }
167
+ o
168
+ end
169
+
170
+ def build_IfExpression(o, t, ift, els)
171
+ o.test = build(t)
172
+ o.then_expr = build(ift)
173
+ o.else_expr= build(els)
174
+ o
175
+ end
176
+
177
+ def build_MatchExpression(o, op, a, b)
178
+ o.operator = op
179
+ build_BinaryExpression(o, a, b)
180
+ end
181
+
182
+ # Builds body :) from different kinds of input
183
+ # @param body [nil] unchanged, produces nil
184
+ # @param body [Array<Expression>] turns into a BlockExpression
185
+ # @param body [Expression] produces the given expression
186
+ # @param body [Object] produces the result of calling #build with body as argument
187
+ def f_build_body(body)
188
+ case body
189
+ when NilClass
190
+ nil
191
+ when Array
192
+ Puppet::Pops::Model::Factory.new(Model::BlockExpression, *body)
193
+ else
194
+ build(body)
195
+ end
196
+ end
197
+
198
+ def build_Definition(o, parameters, body)
199
+ parameters.each {|p| o.addParameters(build(p)) }
200
+ b = f_build_body(body)
201
+ o.body = b.current if b
202
+ o
203
+ end
204
+
205
+ def build_NamedDefinition(o, name, parameters, body)
206
+ build_Definition(o, parameters, body)
207
+ o.name = name
208
+ o
209
+ end
210
+
211
+ # @param o [Model::NodeDefinition]
212
+ # @param hosts [Array<Expression>] host matches
213
+ # @param parent [Expression] parent node matcher
214
+ # @param body [Object] see {#f_build_body}
215
+ def build_NodeDefinition(o, hosts, parent, body)
216
+ hosts.each {|h| o.addHost_matches(build(h)) }
217
+ o.parent = build(parent) if parent # no nop here
218
+ b = f_build_body(body)
219
+ o.body = b.current if b
220
+ o
221
+ end
222
+
223
+ def build_Parameter(o, name, expr)
224
+ o.name = name
225
+ o.value = build(expr) if expr # don't build a nil/nop
226
+ o
227
+ end
228
+
229
+ def build_QualifiedReference(o, name)
230
+ o.value = name.to_s.downcase
231
+ o
232
+ end
233
+
234
+ def build_RelationshipExpression(o, op, a, b)
235
+ o.operator = op
236
+ build_BinaryExpression(o, a, b)
237
+ end
238
+
239
+ def build_ResourceExpression(o, type_name, bodies)
240
+ o.type_name = build(type_name)
241
+ bodies.each {|b| o.addBodies(build(b)) }
242
+ o
243
+ end
244
+
245
+ def build_ResourceBody(o, title_expression, attribute_operations)
246
+ o.title = build(title_expression)
247
+ attribute_operations.each {|ao| o.addOperations(build(ao)) }
248
+ o
249
+ end
250
+
251
+ def build_ResourceDefaultsExpression(o, type_ref, attribute_operations)
252
+ o.type_ref = build(type_ref)
253
+ attribute_operations.each {|ao| o.addOperations(build(ao)) }
254
+ o
255
+ end
256
+
257
+ def build_SelectorExpression(o, left, *selectors)
258
+ o.left_expr = to_ops(left)
259
+ selectors.each {|s| o.addSelectors(build(s)) }
260
+ o
261
+ end
262
+
263
+ def build_SelectorEntry(o, matching, value)
264
+ o.matching_expr = build(matching)
265
+ o.value_expr = build(value)
266
+ o
267
+ end
268
+
269
+ def build_QueryExpression(o, expr)
270
+ ops = to_ops(expr)
271
+ o.expr = ops unless Puppet::Pops::Model::Factory.nop? ops
272
+ o
273
+ end
274
+
275
+ def build_UnaryExpression(o, expr)
276
+ ops = to_ops(expr)
277
+ o.expr = ops unless Puppet::Pops::Model::Factory.nop? ops
278
+ o
279
+ end
280
+
281
+ def build_QualifiedName(o, name)
282
+ o.value = name.to_s
283
+ o
284
+ end
285
+
286
+ # Puppet::Pops::Model::Factory helpers
287
+ def f_build_unary(klazz, expr)
288
+ Puppet::Pops::Model::Factory.new(build(klazz.new, expr))
289
+ end
290
+
291
+ def f_build_binary_op(klazz, op, left, right)
292
+ Puppet::Pops::Model::Factory.new(build(klazz.new, op, left, right))
293
+ end
294
+
295
+ def f_build_binary(klazz, left, right)
296
+ Puppet::Pops::Model::Factory.new(build(klazz.new, left, right))
297
+ end
298
+
299
+ def f_build_vararg(klazz, left, *arg)
300
+ Puppet::Pops::Model::Factory.new(build(klazz.new, left, *arg))
301
+ end
302
+
303
+ def f_arithmetic(op, r)
304
+ f_build_binary_op(Model::ArithmeticExpression, op, current, r)
305
+ end
306
+
307
+ def f_comparison(op, r)
308
+ f_build_binary_op(Model::ComparisonExpression, op, current, r)
309
+ end
310
+
311
+ def f_match(op, r)
312
+ f_build_binary_op(Model::MatchExpression, op, current, r)
313
+ end
314
+
315
+ # Operator helpers
316
+ def in(r) f_build_binary(Model::InExpression, current, r); end
317
+
318
+ def or(r) f_build_binary(Model::OrExpression, current, r); end
319
+
320
+ def and(r) f_build_binary(Model::AndExpression, current, r); end
321
+
322
+ def not(); f_build_unary(Model::NotExpression, self); end
323
+
324
+ def minus(); f_build_unary(Model::UnaryMinusExpression, self); end
325
+
326
+ def text(); f_build_unary(Model::TextExpression, self); end
327
+
328
+ def var(); f_build_unary(Model::VariableExpression, self); end
329
+
330
+ def [](*r); f_build_vararg(Model::AccessExpression, current, *r); end
331
+
332
+ def dot r; f_build_binary(Model::NamedAccessExpression, current, r); end
333
+
334
+ def + r; f_arithmetic(:+, r); end
335
+
336
+ def - r; f_arithmetic(:-, r); end
337
+
338
+ def / r; f_arithmetic(:/, r); end
339
+
340
+ def * r; f_arithmetic(:*, r); end
341
+
342
+ def % r; f_arithmetic(:%, r); end
343
+
344
+ def << r; f_arithmetic(:<<, r); end
345
+
346
+ def >> r; f_arithmetic(:>>, r); end
347
+
348
+ def < r; f_comparison(:<, r); end
349
+
350
+ def <= r; f_comparison(:<=, r); end
351
+
352
+ def > r; f_comparison(:>, r); end
353
+
354
+ def >= r; f_comparison(:>=, r); end
355
+
356
+ def == r; f_comparison(:==, r); end
357
+
358
+ def ne r; f_comparison(:'!=', r); end
359
+
360
+ def =~ r; f_match(:'=~', r); end
361
+
362
+ def mne r; f_match(:'!~', r); end
363
+
364
+ def paren(); f_build_unary(Model::ParenthesizedExpression, current); end
365
+
366
+ def relop op, r
367
+ f_build_binary_op(Model::RelationshipExpression, op.to_sym, current, r)
368
+ end
369
+
370
+ def select *args
371
+ Puppet::Pops::Model::Factory.new(build(Model::SelectorExpression, current, *args))
372
+ end
373
+
374
+ # For CaseExpression, setting the default for an already build CaseExpression
375
+ def default r
376
+ current.addOptions(Puppet::Pops::Model::Factory.WHEN(:default, r).current)
377
+ self
378
+ end
379
+
380
+ def lambda=(lambda)
381
+ current.lambda = lambda.current
382
+ self
383
+ end
384
+
385
+ # Assignment =
386
+ def set(r)
387
+ f_build_binary_op(Model::AssignmentExpression, :'=', current, r)
388
+ end
389
+
390
+ # Assignment +=
391
+ def plus_set(r)
392
+ f_build_binary_op(Model::AssignmentExpression, :'+=', current, r)
393
+ end
394
+
395
+ def attributes(*args)
396
+ args.each {|a| current.addAttributes(build(a)) }
397
+ self
398
+ end
399
+
400
+ # Catch all delegation to current
401
+ def method_missing(meth, *args, &block)
402
+ if current.respond_to?(meth)
403
+ current.send(meth, *args, &block)
404
+ else
405
+ super
406
+ end
407
+ end
408
+
409
+ def respond_to?(meth)
410
+ current.respond_to?(meth) || super
411
+ end
412
+
413
+ # Records the position (start -> end) and computes the resulting length.
414
+ #
415
+ def record_position(start_pos, end_pos)
416
+ Puppet::Pops::Adapters::SourcePosAdapter.adapt(current) do |a|
417
+ a.line = start_pos.line
418
+ a.offset = start_pos.offset
419
+ a.pos = start_pos.pos
420
+ a.length = start_pos.length
421
+ if(end_pos.offset && end_pos.length)
422
+ a.length = end_pos.offset + end_pos.length - start_pos.offset
423
+ end
424
+ end
425
+ self
426
+ end
427
+
428
+ # Records the origin file of an element
429
+ # Does nothing if file is nil.
430
+ #
431
+ # @param file [String,nil] the file/path to the origin, may contain URI scheme of file: or some other URI scheme
432
+ # @returns [Factory] returns self
433
+ #
434
+ def record_origin(file)
435
+ return self unless file
436
+ Puppet::Pops::Adapters::OriginAdapter.adapt(current) do |a|
437
+ a.origin = file
438
+ end
439
+ self
440
+ end
441
+
442
+ # @return [Puppet::Pops::Adapters::SourcePosAdapter] with location information
443
+ def loc()
444
+ Puppet::Pops::Adapters::SourcePosAdapter.adapt(current)
445
+ end
446
+
447
+ # Returns documentation string, or nil if not available
448
+ # @return [String, nil] associated documentation if available
449
+ def doc()
450
+ a = Puppet::Pops::Adapters::SourcePosAdapter.adapt(current)
451
+ return a.documentation if a
452
+ nil
453
+ end
454
+
455
+ def doc=(doc_string)
456
+ a = Puppet::Pops::Adapters::SourcePosAdapter.adapt(current)
457
+ a.documentation = doc_string
458
+ end
459
+
460
+ # Returns symbolic information about a expected share of a resource expression given the LHS of a resource expr.
461
+ #
462
+ # * `name { }` => `:resource`, create a resource of the given type
463
+ # * `Name { }` => ':defaults`, set defauls for the referenced type
464
+ # * `Name[] { }` => `:override`, ioverrides nstances referenced by LHS
465
+ # * _any other_ => ':error', all other are considered illegal
466
+ #
467
+ def self.resource_shape(expr)
468
+ expr = expr.current if expr.is_a?(Puppet::Pops::Model::Factory)
469
+ case expr
470
+ when Model::QualifiedName
471
+ :resource
472
+ when Model::QualifiedReference
473
+ :defaults
474
+ when Model::AccessExpression
475
+ :override
476
+ when 'class'
477
+ :class
478
+ else
479
+ :error
480
+ end
481
+ end
482
+ # Factory starting points
483
+
484
+ def self.literal(o); new(o); end
485
+
486
+ def self.minus(o); new(o).minus; end
487
+
488
+ def self.var(o); new(o).var; end
489
+
490
+ def self.block(*args); new(Model::BlockExpression, *args); end
491
+
492
+ def self.string(*args); new(Model::ConcatenatedString, *args); end
493
+
494
+ def self.text(o); new(o).text; end
495
+
496
+ def self.IF(test_e,then_e,else_e); new(Model::IfExpression, test_e, then_e, else_e); end
497
+
498
+ def self.UNLESS(test_e,then_e,else_e); new(Model::UnlessExpression, test_e, then_e, else_e); end
499
+
500
+ def self.CASE(test_e,*options); new(Model::CaseExpression, test_e, *options); end
501
+
502
+ def self.WHEN(values_list, block); new(Model::CaseOption, values_list, block); end
503
+
504
+ def self.MAP(match, value); new(Model::SelectorEntry, match, value); end
505
+
506
+ def self.TYPE(name, super_name=nil); new(Model::CreateTypeExpression, name, super_name); end
507
+
508
+ def self.ATTR(name, type_expr=nil); new(Model::CreateAttributeExpression, name, type_expr); end
509
+
510
+ def self.ENUM(*args); new(Model::CreateEnumExpression, *args); end
511
+
512
+ def self.KEY_ENTRY(key, val); new(Model::KeyedEntry, key, val); end
513
+
514
+ def self.HASH(entries); new(Model::LiteralHash, *entries); end
515
+
516
+ def self.LIST(entries); new(Model::LiteralList, *entries); end
517
+
518
+ def self.PARAM(name, expr=nil); new(Model::Parameter, name, expr); end
519
+
520
+ def self.NODE(hosts, parent, body); new(Model::NodeDefinition, hosts, parent, body); end
521
+
522
+ # Creates a QualifiedName representation of o, unless o already represents a QualifiedName in which
523
+ # case it is returned.
524
+ #
525
+ def self.fqn(o)
526
+ o = o.current if o.is_a?(Puppet::Pops::Model::Factory)
527
+ o = new(Model::QualifiedName, o) unless o.is_a? Model::QualifiedName
528
+ o
529
+ end
530
+
531
+ # Creates a QualifiedName representation of o, unless o already represents a QualifiedName in which
532
+ # case it is returned.
533
+ #
534
+ def self.fqr(o)
535
+ o = o.current if o.is_a?(Puppet::Pops::Model::Factory)
536
+ o = new(Model::QualifiedReference, o) unless o.is_a? Model::QualifiedReference
537
+ o
538
+ end
539
+
540
+ def self.TEXT(expr)
541
+ new(Model::TextExpression, expr)
542
+ end
543
+
544
+ # TODO: This is the same a fqn factory method, don't know if callers to fqn and QNAME can live with the
545
+ # same result or not yet - refactor into one method when decided.
546
+ #
547
+ def self.QNAME(name)
548
+ new(Model::QualifiedName, name)
549
+ end
550
+
551
+ # Convert input string to either a qualified name, or a LiteralNumber with radix
552
+ #
553
+ def self.QNAME_OR_NUMBER(name)
554
+ if n_radix = Puppet::Pops::Utils.to_n_with_radix(name)
555
+ new(Model::LiteralNumber, *n_radix)
556
+ else
557
+ new(Model::QualifiedName, name)
558
+ end
559
+ end
560
+
561
+ def self.QREF(name)
562
+ new(Model::QualifiedReference, name)
563
+ end
564
+
565
+ def self.VIRTUAL_QUERY(query_expr)
566
+ new(Model::VirtualQuery, query_expr)
567
+ end
568
+
569
+ def self.EXPORTED_QUERY(query_expr)
570
+ new(Model::ExportedQuery, query_expr)
571
+ end
572
+
573
+ # Used by regular grammar, egrammar creates an AccessExpression instead, and evaluation determines
574
+ # if access is to instances or something else.
575
+ #
576
+ def self.INSTANCE(type_name, name_expressions)
577
+ new(Model::InstanceReferences, type_name, name_expressions)
578
+ end
579
+
580
+ def self.ATTRIBUTE_OP(name, op, expr)
581
+ new(Model::AttributeOperation, name, op, expr)
582
+ end
583
+
584
+ def self.CALL_NAMED(name, rval_required, argument_list)
585
+ unless name.kind_of?(Model::PopsObject)
586
+ name = Puppet::Pops::Model::Factory.fqn(name) unless name.is_a?(Puppet::Pops::Model::Factory)
587
+ end
588
+ new(Model::CallNamedFunctionExpression, name, rval_required, *argument_list)
589
+ end
590
+
591
+ def self.CALL_METHOD(functor, argument_list)
592
+ new(Model::CallMethodExpression, functor, true, nil, *argument_list)
593
+ end
594
+
595
+ def self.COLLECT(type_expr, query_expr, attribute_operations)
596
+ new(Model::CollectExpression, Puppet::Pops::Model::Factory.fqr(type_expr), query_expr, attribute_operations)
597
+ end
598
+
599
+ def self.IMPORT(files)
600
+ new(Model::ImportExpression, files)
601
+ end
602
+
603
+ def self.NAMED_ACCESS(type_name, bodies)
604
+ new(Model::NamedAccessExpression, type_name, bodies)
605
+ end
606
+
607
+ def self.RESOURCE(type_name, bodies)
608
+ new(Model::ResourceExpression, type_name, bodies)
609
+ end
610
+
611
+ def self.RESOURCE_DEFAULTS(type_name, attribute_operations)
612
+ new(Model::ResourceDefaultsExpression, type_name, attribute_operations)
613
+ end
614
+
615
+ def self.RESOURCE_OVERRIDE(resource_ref, attribute_operations)
616
+ new(Model::ResourceOverrideExpression, resource_ref, attribute_operations)
617
+ end
618
+
619
+ def self.RESOURCE_BODY(resource_title, attribute_operations)
620
+ new(Model::ResourceBody, resource_title, attribute_operations)
621
+ end
622
+
623
+ # Builds a BlockExpression if args size > 1, else the single expression/value in args
624
+ def self.block_or_expression(*args)
625
+ if args.size > 1
626
+ new(Model::BlockExpression, *args)
627
+ else
628
+ new(args[0])
629
+ end
630
+ end
631
+
632
+ def self.HOSTCLASS(name, parameters, parent, body)
633
+ new(Model::HostClassDefinition, name, parameters, parent, body)
634
+ end
635
+
636
+ def self.DEFINITION(name, parameters, body)
637
+ new(Model::ResourceTypeDefinition, name, parameters, body)
638
+ end
639
+
640
+ def self.LAMBDA(parameters, body)
641
+ new(Model::LambdaExpression, parameters, body)
642
+ end
643
+
644
+ def self.nop? o
645
+ o.nil? || o.is_a?(Puppet::Pops::Model::Nop)
646
+ end
647
+
648
+ # Transforms an array of expressions containing literal name expressions to calls if followed by an
649
+ # expression, or expression list. Also transforms a "call" to `import` into an ImportExpression.
650
+ #
651
+ def self.transform_calls(expressions)
652
+ expressions.reduce([]) do |memo, expr|
653
+ expr = expr.current if expr.is_a?(Puppet::Pops::Model::Factory)
654
+ name = memo[-1]
655
+ if name.is_a? Model::QualifiedName
656
+ if name.value() == 'import'
657
+ memo[-1] = Puppet::Pops::Model::Factory.IMPORT(expr.is_a?(Array) ? expr : [expr])
658
+ else
659
+ memo[-1] = Puppet::Pops::Model::Factory.CALL_NAMED(name, false, expr.is_a?(Array) ? expr : [expr])
660
+ end
661
+ else
662
+ memo << expr
663
+ end
664
+ if expr.is_a?(Model::CallNamedFunctionExpression)
665
+ # patch expression function call to statement style
666
+ # TODO: This is kind of meaningless, but to make it compatible...
667
+ expr.rval_required = false
668
+ end
669
+ memo
670
+ end
671
+
672
+ end
673
+
674
+ # Building model equivalences of Ruby objects
675
+ # Allows passing regular ruby objects to the factory to produce instructions
676
+ # that when evaluated produce the same thing.
677
+
678
+ def build_String(o)
679
+ x = Model::LiteralString.new
680
+ x.value = o;
681
+ x
682
+ end
683
+
684
+ def build_NilClass(o)
685
+ x = Model::Nop.new
686
+ x
687
+ end
688
+
689
+ def build_TrueClass(o)
690
+ x = Model::LiteralBoolean.new
691
+ x.value = o
692
+ x
693
+ end
694
+
695
+ def build_FalseClass(o)
696
+ x = Model::LiteralBoolean.new
697
+ x.value = o
698
+ x
699
+ end
700
+
701
+ def build_Fixnum(o)
702
+ x = Model::LiteralNumber.new
703
+ x.value = o;
704
+ x
705
+ end
706
+
707
+ def build_Float(o)
708
+ x = Model::LiteralNumber.new
709
+ x.value = o;
710
+ x
711
+ end
712
+
713
+ def build_Regexp(o)
714
+ x = Model::LiteralRegularExpression.new
715
+ x.value = o;
716
+ x
717
+ end
718
+
719
+ # If building a factory, simply unwrap the model oject contained in the factory.
720
+ def build_Factory(o)
721
+ o.current
722
+ end
723
+
724
+ # Creates a String literal, unless the symbol is one of the special :undef, or :default
725
+ # which instead creates a LiterlUndef, or a LiteralDefault.
726
+ def build_Symbol(o)
727
+ case o
728
+ when :undef
729
+ Model::LiteralUndef.new
730
+ when :default
731
+ Model::LiteralDefault.new
732
+ else
733
+ build_String(o.to_s)
734
+ end
735
+ end
736
+
737
+ # Creates a LiteralList instruction from an Array, where the entries are built.
738
+ def build_Array(o)
739
+ x = Model::LiteralList.new
740
+ o.each { |v| x.addValues(build(v)) }
741
+ x
742
+ end
743
+
744
+ # Create a LiteralHash instruction from a hash, where keys and values are built
745
+ # The hash entries are added in sorted order based on key.to_s
746
+ #
747
+ def build_Hash(o)
748
+ x = Model::LiteralHash.new
749
+ (o.sort_by {|k,v| k.to_s}).each {|k,v| x.addEntries(build(Model::KeyedEntry.new, k, v)) }
750
+ x
751
+ end
752
+
753
+ # @param rval_required [Boolean] if the call must produce a value
754
+ def build_CallExpression(o, functor, rval_required, *args)
755
+ o.functor_expr = to_ops(functor)
756
+ o.rval_required = rval_required
757
+ args.each {|x| o.addArguments(to_ops(x)) }
758
+ o
759
+ end
760
+
761
+ # # @param rval_required [Boolean] if the call must produce a value
762
+ # def build_CallNamedFunctionExpression(o, name, rval_required, *args)
763
+ # build_CallExpression(o, name, rval_required, *args)
764
+ ## o.functor_expr = build(name)
765
+ ## o.rval_required = rval_required
766
+ ## args.each {|x| o.addArguments(build(x)) }
767
+ # o
768
+ # end
769
+
770
+ def build_CallMethodExpression(o, functor, rval_required, lambda, *args)
771
+ build_CallExpression(o, functor, rval_required, *args)
772
+ o.lambda = lambda
773
+ o
774
+ end
775
+
776
+ def build_CaseExpression(o, test, *args)
777
+ o.test = build(test)
778
+ args.each {|opt| o.addOptions(build(opt)) }
779
+ o
780
+ end
781
+
782
+ def build_CaseOption(o, value_list, then_expr)
783
+ value_list = [value_list] unless value_list.is_a? Array
784
+ value_list.each { |v| o.addValues(build(v)) }
785
+ b = f_build_body(then_expr)
786
+ o.then_expr = to_ops(b) if b
787
+ o
788
+ end
789
+
790
+ # Build a Class by creating an instance of it, and then calling build on the created instance
791
+ # with the given arguments
792
+ def build_Class(o, *args)
793
+ build(o.new(), *args)
794
+ end
795
+
796
+ # Checks if the object is already a model object, or build it
797
+ def to_ops(o, *args)
798
+ if o.kind_of?(Model::PopsObject)
799
+ o
800
+ else
801
+ build(o, *args)
802
+ end
803
+ end
804
+ end