puppet 3.6.2 → 3.7.0

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 (751) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +2 -3
  3. data/Gemfile +14 -10
  4. data/README.md +1 -1
  5. data/ext/build_defaults.yaml +16 -1
  6. data/ext/debian/control +3 -2
  7. data/ext/debian/puppet-common.dirs +1 -0
  8. data/ext/debian/puppet-common.postinst +8 -8
  9. data/ext/debian/puppet-common.postrm +2 -1
  10. data/ext/project_data.yaml +16 -12
  11. data/ext/rack/example-passenger-vhost.conf +2 -2
  12. data/ext/redhat/puppet.spec.erb +6 -3
  13. data/ext/windows/service/daemon.rb +47 -41
  14. data/install.rb +1 -1
  15. data/lib/puppet.rb +34 -24
  16. data/lib/puppet/application.rb +34 -1
  17. data/lib/puppet/application/agent.rb +9 -8
  18. data/lib/puppet/application/apply.rb +14 -5
  19. data/lib/puppet/application/doc.rb +4 -11
  20. data/lib/puppet/application/master.rb +19 -17
  21. data/lib/puppet/application/queue.rb +1 -1
  22. data/lib/puppet/application/resource.rb +0 -1
  23. data/lib/puppet/configurer.rb +39 -2
  24. data/lib/puppet/configurer/downloader.rb +5 -10
  25. data/lib/puppet/configurer/downloader_factory.rb +34 -0
  26. data/lib/puppet/configurer/plugin_handler.rb +11 -17
  27. data/lib/puppet/defaults.rb +244 -119
  28. data/lib/puppet/environments.rb +8 -0
  29. data/lib/puppet/external/nagios/base.rb +1 -1
  30. data/lib/puppet/external/pson/pure/generator.rb +1 -8
  31. data/lib/puppet/face/ca.rb +7 -0
  32. data/lib/puppet/face/file/download.rb +5 -2
  33. data/lib/puppet/face/file/store.rb +1 -1
  34. data/lib/puppet/face/instrumentation_data.rb +2 -1
  35. data/lib/puppet/face/instrumentation_listener.rb +2 -1
  36. data/lib/puppet/face/instrumentation_probe.rb +2 -1
  37. data/lib/puppet/face/module/build.rb +2 -2
  38. data/lib/puppet/face/module/generate.rb +20 -12
  39. data/lib/puppet/face/module/install.rb +4 -3
  40. data/lib/puppet/face/module/uninstall.rb +7 -0
  41. data/lib/puppet/face/module/upgrade.rb +11 -3
  42. data/lib/puppet/face/node/clean.rb +1 -1
  43. data/lib/puppet/face/parser.rb +99 -7
  44. data/lib/puppet/feature/base.rb +18 -12
  45. data/lib/puppet/feature/cfacter.rb +14 -0
  46. data/lib/puppet/feature/pe_license.rb +4 -0
  47. data/lib/puppet/file_bucket/dipper.rb +19 -12
  48. data/lib/puppet/file_bucket/file.rb +73 -10
  49. data/lib/puppet/file_serving/configuration/parser.rb +3 -3
  50. data/lib/puppet/file_system.rb +1 -1
  51. data/lib/puppet/file_system/file19.rb +41 -0
  52. data/lib/puppet/file_system/file19windows.rb +0 -1
  53. data/lib/puppet/file_system/uniquefile.rb +190 -0
  54. data/lib/puppet/forge.rb +34 -7
  55. data/lib/puppet/forge/errors.rb +5 -6
  56. data/lib/puppet/forge/repository.rb +14 -2
  57. data/lib/puppet/functions.rb +19 -12
  58. data/lib/puppet/functions/assert_type.rb +27 -10
  59. data/lib/puppet/functions/each.rb +111 -0
  60. data/lib/puppet/functions/epp.rb +54 -0
  61. data/lib/puppet/functions/filter.rb +113 -0
  62. data/lib/puppet/functions/inline_epp.rb +88 -0
  63. data/lib/puppet/functions/map.rb +97 -0
  64. data/lib/puppet/functions/match.rb +102 -0
  65. data/lib/puppet/functions/reduce.rb +94 -0
  66. data/lib/puppet/functions/slice.rb +126 -0
  67. data/lib/puppet/functions/with.rb +23 -0
  68. data/lib/puppet/indirector/catalog/compiler.rb +4 -4
  69. data/lib/puppet/indirector/data_binding/hiera.rb +2 -45
  70. data/lib/puppet/indirector/facts/couch.rb +3 -1
  71. data/lib/puppet/indirector/facts/facter.rb +52 -65
  72. data/lib/puppet/indirector/file_bucket_file/file.rb +6 -3
  73. data/lib/puppet/indirector/hiera.rb +48 -0
  74. data/lib/puppet/indirector/indirection.rb +1 -1
  75. data/lib/puppet/indirector/request.rb +9 -3
  76. data/lib/puppet/indirector/resource/ral.rb +1 -1
  77. data/lib/puppet/indirector/rest.rb +7 -3
  78. data/lib/puppet/loaders.rb +0 -1
  79. data/lib/puppet/module.rb +2 -1
  80. data/lib/puppet/module_tool.rb +2 -0
  81. data/lib/puppet/module_tool/applications/application.rb +4 -5
  82. data/lib/puppet/module_tool/applications/builder.rb +64 -5
  83. data/lib/puppet/module_tool/applications/uninstaller.rb +3 -2
  84. data/lib/puppet/module_tool/applications/unpacker.rb +14 -0
  85. data/lib/puppet/module_tool/applications/upgrader.rb +23 -13
  86. data/lib/puppet/module_tool/dependency.rb +12 -0
  87. data/lib/puppet/module_tool/errors/shared.rb +1 -1
  88. data/lib/puppet/module_tool/errors/upgrader.rb +20 -0
  89. data/lib/puppet/module_tool/installed_modules.rb +6 -1
  90. data/lib/puppet/module_tool/metadata.rb +53 -3
  91. data/lib/puppet/module_tool/modulefile.rb +1 -1
  92. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +7 -0
  93. data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +1 -1
  94. data/lib/puppet/module_tool/skeleton/templates/generator/spec/spec_helper.rb +1 -17
  95. data/lib/puppet/module_tool/tar/mini.rb +20 -2
  96. data/lib/puppet/network/http.rb +5 -0
  97. data/lib/puppet/network/http/api/v1.rb +2 -2
  98. data/lib/puppet/network/http/api/v2/environments.rb +15 -1
  99. data/lib/puppet/network/http/connection.rb +54 -68
  100. data/lib/puppet/network/http/factory.rb +44 -0
  101. data/lib/puppet/network/http/handler.rb +12 -6
  102. data/lib/puppet/network/http/nocache_pool.rb +21 -0
  103. data/lib/puppet/network/http/pool.rb +120 -0
  104. data/lib/puppet/network/http/rack/rest.rb +3 -1
  105. data/lib/puppet/network/http/session.rb +17 -0
  106. data/lib/puppet/network/http/site.rb +39 -0
  107. data/lib/puppet/network/http/webrick/rest.rb +3 -1
  108. data/lib/puppet/network/http_pool.rb +3 -4
  109. data/lib/puppet/node.rb +19 -6
  110. data/lib/puppet/node/environment.rb +34 -8
  111. data/lib/puppet/parser/ast/collection.rb +4 -0
  112. data/lib/puppet/parser/ast/collexpr.rb +1 -1
  113. data/lib/puppet/parser/ast/node.rb +5 -0
  114. data/lib/puppet/parser/ast/pops_bridge.rb +49 -6
  115. data/lib/puppet/parser/compiler.rb +66 -38
  116. data/lib/puppet/parser/e4_parser_adapter.rb +2 -2
  117. data/lib/puppet/parser/files.rb +76 -33
  118. data/lib/puppet/parser/functions.rb +1 -7
  119. data/lib/puppet/parser/functions/assert_type.rb +31 -0
  120. data/lib/puppet/parser/functions/contain.rb +15 -5
  121. data/lib/puppet/parser/functions/create_resources.rb +5 -1
  122. data/lib/puppet/parser/functions/digest.rb +5 -0
  123. data/lib/puppet/parser/functions/each.rb +46 -107
  124. data/lib/puppet/parser/functions/epp.rb +13 -9
  125. data/lib/puppet/parser/functions/file.rb +20 -12
  126. data/lib/puppet/parser/functions/filter.rb +32 -88
  127. data/lib/puppet/parser/functions/include.rb +12 -24
  128. data/lib/puppet/parser/functions/inline_epp.rb +9 -12
  129. data/lib/puppet/parser/functions/lookup.rb +1 -1
  130. data/lib/puppet/parser/functions/map.rb +30 -83
  131. data/lib/puppet/parser/functions/match.rb +28 -0
  132. data/lib/puppet/parser/functions/reduce.rb +69 -98
  133. data/lib/puppet/parser/functions/require.rb +13 -5
  134. data/lib/puppet/parser/functions/search.rb +6 -1
  135. data/lib/puppet/parser/functions/slice.rb +35 -103
  136. data/lib/puppet/parser/functions/template.rb +12 -5
  137. data/lib/puppet/parser/functions/with.rb +21 -0
  138. data/lib/puppet/parser/lexer.rb +1 -1
  139. data/lib/puppet/parser/parser_factory.rb +21 -33
  140. data/lib/puppet/parser/resource.rb +2 -3
  141. data/lib/puppet/parser/scope.rb +85 -15
  142. data/lib/puppet/pops.rb +9 -11
  143. data/lib/puppet/pops/adapters.rb +2 -1
  144. data/lib/puppet/pops/binder/bindings_checker.rb +4 -4
  145. data/lib/puppet/pops/binder/bindings_factory.rb +6 -6
  146. data/lib/puppet/pops/binder/bindings_label_provider.rb +1 -1
  147. data/lib/puppet/pops/binder/bindings_loader.rb +2 -2
  148. data/lib/puppet/pops/binder/bindings_model.rb +58 -191
  149. data/lib/puppet/pops/binder/bindings_model_dumper.rb +1 -1
  150. data/lib/puppet/pops/binder/bindings_model_meta.rb +215 -0
  151. data/lib/puppet/pops/binder/injector.rb +9 -9
  152. data/lib/puppet/pops/binder/key_factory.rb +2 -2
  153. data/lib/puppet/pops/binder/lookup.rb +14 -6
  154. data/lib/puppet/pops/binder/producers.rb +9 -12
  155. data/lib/puppet/pops/evaluator/access_operator.rb +35 -29
  156. data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +175 -0
  157. data/lib/puppet/pops/evaluator/callable_signature.rb +1 -2
  158. data/lib/puppet/pops/evaluator/closure.rb +151 -35
  159. data/lib/puppet/pops/evaluator/compare_operator.rb +26 -22
  160. data/lib/puppet/pops/evaluator/epp_evaluator.rb +16 -15
  161. data/lib/puppet/pops/evaluator/evaluator_impl.rb +277 -229
  162. data/lib/puppet/pops/evaluator/relationship_operator.rb +3 -2
  163. data/lib/puppet/pops/evaluator/runtime3_support.rb +86 -53
  164. data/lib/puppet/pops/functions/dispatch.rb +9 -4
  165. data/lib/puppet/pops/functions/dispatcher.rb +2 -169
  166. data/lib/puppet/pops/issue_reporter.rb +14 -6
  167. data/lib/puppet/pops/issues.rb +96 -21
  168. data/lib/puppet/pops/loader/base_loader.rb +3 -3
  169. data/lib/puppet/pops/loader/loader.rb +1 -1
  170. data/lib/puppet/pops/loader/loader_paths.rb +2 -21
  171. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +1 -1
  172. data/lib/puppet/pops/loader/static_loader.rb +12 -2
  173. data/lib/puppet/pops/model/ast_transformer.rb +4 -24
  174. data/lib/puppet/pops/model/factory.rb +72 -10
  175. data/lib/puppet/pops/model/model.rb +82 -574
  176. data/lib/puppet/pops/model/model_label_provider.rb +4 -2
  177. data/lib/puppet/pops/model/model_meta.rb +576 -0
  178. data/lib/puppet/pops/model/model_tree_dumper.rb +27 -5
  179. data/lib/puppet/pops/parser/egrammar.ra +209 -221
  180. data/lib/puppet/pops/parser/eparser.rb +1459 -1431
  181. data/lib/puppet/pops/parser/evaluating_parser.rb +15 -75
  182. data/lib/puppet/pops/parser/lexer2.rb +14 -10
  183. data/lib/puppet/pops/parser/lexer_support.rb +6 -0
  184. data/lib/puppet/pops/parser/locator.rb +1 -1
  185. data/lib/puppet/pops/parser/parser_support.rb +31 -49
  186. data/lib/puppet/pops/patterns.rb +10 -10
  187. data/lib/puppet/pops/semantic_error.rb +1 -1
  188. data/lib/puppet/pops/types/class_loader.rb +24 -13
  189. data/lib/puppet/pops/types/type_calculator.rb +188 -87
  190. data/lib/puppet/pops/types/type_factory.rb +79 -53
  191. data/lib/puppet/pops/types/type_parser.rb +22 -16
  192. data/lib/puppet/pops/types/types.rb +283 -392
  193. data/lib/puppet/pops/types/types_meta.rb +223 -0
  194. data/lib/puppet/pops/utils.rb +16 -14
  195. data/lib/puppet/pops/validation/checker4_0.rb +264 -18
  196. data/lib/puppet/pops/validation/validator_factory_4_0.rb +0 -1
  197. data/lib/puppet/pops/visitor.rb +0 -103
  198. data/lib/puppet/provider/exec.rb +10 -1
  199. data/lib/puppet/provider/file/windows.rb +3 -4
  200. data/lib/puppet/provider/group/windows_adsi.rb +10 -10
  201. data/lib/puppet/provider/nameservice/directoryservice.rb +3 -4
  202. data/lib/puppet/provider/package/apt.rb +5 -1
  203. data/lib/puppet/provider/package/gem.rb +7 -3
  204. data/lib/puppet/provider/package/openbsd.rb +84 -7
  205. data/lib/puppet/provider/package/pacman.rb +29 -4
  206. data/lib/puppet/provider/package/rpm.rb +5 -7
  207. data/lib/puppet/provider/package/sun.rb +5 -1
  208. data/lib/puppet/provider/package/windows.rb +6 -1
  209. data/lib/puppet/provider/package/windows/exe_package.rb +1 -1
  210. data/lib/puppet/provider/package/windows/msi_package.rb +1 -1
  211. data/lib/puppet/provider/package/windows/package.rb +13 -1
  212. data/lib/puppet/provider/package/yum.rb +7 -3
  213. data/lib/puppet/provider/package/zypper.rb +5 -1
  214. data/lib/puppet/provider/parsedfile.rb +17 -1
  215. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +6 -12
  216. data/lib/puppet/provider/service/freebsd.rb +12 -12
  217. data/lib/puppet/provider/service/init.rb +5 -0
  218. data/lib/puppet/provider/service/launchd.rb +0 -3
  219. data/lib/puppet/provider/service/openbsd.rb +8 -7
  220. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +2 -2
  221. data/lib/puppet/provider/sshkey/parsed.rb +5 -0
  222. data/lib/puppet/provider/user/user_role_add.rb +5 -4
  223. data/lib/puppet/provider/user/windows_adsi.rb +8 -8
  224. data/lib/puppet/provider/zone/solaris.rb +1 -1
  225. data/lib/puppet/reference/metaparameter.rb +8 -6
  226. data/lib/puppet/reports/store.rb +4 -9
  227. data/lib/puppet/resource.rb +75 -11
  228. data/lib/puppet/resource/catalog.rb +9 -7
  229. data/lib/puppet/resource/type.rb +27 -0
  230. data/lib/puppet/settings.rb +61 -41
  231. data/lib/puppet/settings/base_setting.rb +9 -3
  232. data/lib/puppet/settings/environment_conf.rb +32 -4
  233. data/lib/puppet/settings/file_setting.rb +9 -1
  234. data/lib/puppet/settings/priority_setting.rb +5 -5
  235. data/lib/puppet/ssl.rb +1 -0
  236. data/lib/puppet/ssl/certificate_authority.rb +15 -6
  237. data/lib/puppet/ssl/certificate_authority/autosign_command.rb +2 -1
  238. data/lib/puppet/ssl/host.rb +3 -2
  239. data/lib/puppet/ssl/inventory.rb +11 -6
  240. data/lib/puppet/ssl/validator/default_validator.rb +1 -0
  241. data/lib/puppet/ssl/validator/no_validator.rb +3 -0
  242. data/lib/puppet/transaction.rb +29 -0
  243. data/lib/puppet/transaction/resource_harness.rb +16 -3
  244. data/lib/puppet/type.rb +71 -49
  245. data/lib/puppet/type/exec.rb +36 -8
  246. data/lib/puppet/type/file.rb +56 -16
  247. data/lib/puppet/type/file/content.rb +3 -3
  248. data/lib/puppet/type/file/mode.rb +12 -3
  249. data/lib/puppet/type/file/source.rb +4 -1
  250. data/lib/puppet/type/group.rb +1 -1
  251. data/lib/puppet/type/mount.rb +1 -3
  252. data/lib/puppet/type/resources.rb +59 -35
  253. data/lib/puppet/type/ssh_authorized_key.rb +54 -16
  254. data/lib/puppet/type/sshkey.rb +1 -1
  255. data/lib/puppet/type/user.rb +17 -11
  256. data/lib/puppet/type/yumrepo.rb +59 -8
  257. data/lib/puppet/type/zone.rb +3 -6
  258. data/lib/puppet/util.rb +64 -55
  259. data/lib/puppet/util/autoload.rb +2 -2
  260. data/lib/puppet/util/colors.rb +61 -19
  261. data/lib/puppet/util/command_line.rb +21 -4
  262. data/lib/puppet/util/execution.rb +41 -29
  263. data/lib/puppet/util/feature.rb +15 -4
  264. data/lib/puppet/util/filetype.rb +6 -2
  265. data/lib/puppet/util/http_proxy.rb +29 -2
  266. data/lib/puppet/util/lockfile.rb +1 -1
  267. data/lib/puppet/util/log/destinations.rb +7 -3
  268. data/lib/puppet/util/logging.rb +44 -14
  269. data/lib/puppet/util/pidlock.rb +11 -5
  270. data/lib/puppet/util/posix.rb +21 -31
  271. data/lib/puppet/util/profiler.rb +17 -9
  272. data/lib/puppet/util/profiler/aggregate.rb +85 -0
  273. data/lib/puppet/util/profiler/around_profiler.rb +67 -0
  274. data/lib/puppet/util/profiler/logging.rb +12 -11
  275. data/lib/puppet/util/profiler/wall_clock.rb +7 -6
  276. data/lib/puppet/util/rdoc.rb +8 -1
  277. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +1 -1
  278. data/lib/puppet/util/suidmanager.rb +1 -8
  279. data/lib/puppet/util/windows.rb +14 -3
  280. data/lib/puppet/util/windows/access_control_list.rb +4 -4
  281. data/lib/puppet/util/{adsi.rb → windows/adsi.rb} +99 -37
  282. data/lib/puppet/util/windows/api_types.rb +255 -0
  283. data/lib/puppet/util/windows/com.rb +224 -0
  284. data/lib/puppet/util/windows/error.rb +72 -5
  285. data/lib/puppet/util/windows/file.rb +254 -132
  286. data/lib/puppet/util/windows/process.rb +293 -177
  287. data/lib/puppet/util/windows/registry.rb +12 -2
  288. data/lib/puppet/util/windows/root_certs.rb +16 -9
  289. data/lib/puppet/util/windows/security.rb +501 -232
  290. data/lib/puppet/util/windows/sid.rb +80 -36
  291. data/lib/puppet/util/windows/string.rb +2 -0
  292. data/lib/puppet/util/windows/taskscheduler.rb +1241 -0
  293. data/lib/puppet/util/windows/user.rb +241 -57
  294. data/lib/puppet/vendor.rb +3 -1
  295. data/lib/puppet/vendor/load_pathspec.rb +1 -0
  296. data/lib/puppet/vendor/load_rgen.rb +1 -0
  297. data/lib/puppet/vendor/pathspec/CHANGELOG.md +2 -0
  298. data/lib/puppet/vendor/pathspec/LICENSE +201 -0
  299. data/lib/puppet/vendor/pathspec/PUPPET_README.md +6 -0
  300. data/lib/puppet/vendor/pathspec/README.md +53 -0
  301. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +121 -0
  302. data/lib/puppet/vendor/pathspec/lib/pathspec/gitignorespec.rb +275 -0
  303. data/lib/puppet/vendor/pathspec/lib/pathspec/regexspec.rb +17 -0
  304. data/lib/puppet/vendor/pathspec/lib/pathspec/spec.rb +14 -0
  305. data/lib/puppet/vendor/require_vendored.rb +2 -0
  306. data/lib/puppet/vendor/rgen/CHANGELOG +197 -0
  307. data/lib/puppet/vendor/rgen/MIT-LICENSE +20 -0
  308. data/lib/puppet/vendor/rgen/PUPPET_README.md +6 -0
  309. data/lib/puppet/vendor/rgen/README.rdoc +78 -0
  310. data/lib/puppet/vendor/rgen/Rakefile +41 -0
  311. data/lib/puppet/vendor/rgen/TODO +41 -0
  312. data/lib/puppet/vendor/rgen/anounce.txt +61 -0
  313. data/lib/puppet/vendor/rgen/design_rationale.txt +71 -0
  314. data/lib/puppet/vendor/rgen/lib/ea_support/ea_support.rb +54 -0
  315. data/lib/puppet/vendor/rgen/lib/ea_support/id_store.rb +32 -0
  316. data/lib/puppet/vendor/rgen/lib/ea_support/uml13_ea_metamodel.rb +562 -0
  317. data/lib/puppet/vendor/rgen/lib/ea_support/uml13_ea_metamodel_ext.rb +45 -0
  318. data/lib/puppet/vendor/rgen/lib/ea_support/uml13_ea_metamodel_generator.rb +43 -0
  319. data/lib/puppet/vendor/rgen/lib/ea_support/uml13_ea_to_uml13.rb +103 -0
  320. data/lib/puppet/vendor/rgen/lib/ea_support/uml13_to_uml13_ea.rb +89 -0
  321. data/lib/puppet/vendor/rgen/lib/metamodels/uml13_metamodel.rb +559 -0
  322. data/lib/puppet/vendor/rgen/lib/metamodels/uml13_metamodel_ext.rb +26 -0
  323. data/lib/puppet/vendor/rgen/lib/mmgen/metamodel_generator.rb +20 -0
  324. data/lib/puppet/vendor/rgen/lib/mmgen/mm_ext/ecore_mmgen_ext.rb +91 -0
  325. data/lib/puppet/vendor/rgen/lib/mmgen/mmgen.rb +28 -0
  326. data/lib/puppet/vendor/rgen/lib/mmgen/templates/annotations.tpl +37 -0
  327. data/lib/puppet/vendor/rgen/lib/mmgen/templates/metamodel_generator.tpl +172 -0
  328. data/lib/puppet/vendor/rgen/lib/rgen/array_extensions.rb +45 -0
  329. data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore.rb +218 -0
  330. data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore_builder_methods.rb +81 -0
  331. data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore_ext.rb +69 -0
  332. data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore_interface.rb +47 -0
  333. data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore_to_ruby.rb +167 -0
  334. data/lib/puppet/vendor/rgen/lib/rgen/ecore/ruby_to_ecore.rb +91 -0
  335. data/lib/puppet/vendor/rgen/lib/rgen/environment.rb +129 -0
  336. data/lib/puppet/vendor/rgen/lib/rgen/fragment/dump_file_cache.rb +63 -0
  337. data/lib/puppet/vendor/rgen/lib/rgen/fragment/fragmented_model.rb +140 -0
  338. data/lib/puppet/vendor/rgen/lib/rgen/fragment/model_fragment.rb +289 -0
  339. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_instantiator.rb +66 -0
  340. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_xml_instantiator.rb +66 -0
  341. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/default_xml_instantiator.rb +117 -0
  342. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/ecore_xml_instantiator.rb +169 -0
  343. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/json_instantiator.rb +126 -0
  344. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/json_parser.rb +331 -0
  345. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/json_parser.y +94 -0
  346. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/nodebased_xml_instantiator.rb +137 -0
  347. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/qualified_name_resolver.rb +97 -0
  348. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/reference_resolver.rb +128 -0
  349. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/resolution_helper.rb +47 -0
  350. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/xmi11_instantiator.rb +168 -0
  351. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder.rb +224 -0
  352. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/builder_extensions.rb +556 -0
  353. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/builder_runtime.rb +174 -0
  354. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/constant_order_helper.rb +89 -0
  355. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/data_types.rb +77 -0
  356. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/intermediate/annotation.rb +30 -0
  357. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/intermediate/feature.rb +168 -0
  358. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/mm_multiple.rb +23 -0
  359. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/module_extension.rb +42 -0
  360. data/lib/puppet/vendor/rgen/lib/rgen/model_builder.rb +32 -0
  361. data/lib/puppet/vendor/rgen/lib/rgen/model_builder/builder_context.rb +334 -0
  362. data/lib/puppet/vendor/rgen/lib/rgen/model_builder/model_serializer.rb +225 -0
  363. data/lib/puppet/vendor/rgen/lib/rgen/model_builder/reference_resolver.rb +156 -0
  364. data/lib/puppet/vendor/rgen/lib/rgen/serializer/json_serializer.rb +121 -0
  365. data/lib/puppet/vendor/rgen/lib/rgen/serializer/opposite_reference_filter.rb +18 -0
  366. data/lib/puppet/vendor/rgen/lib/rgen/serializer/qualified_name_provider.rb +47 -0
  367. data/lib/puppet/vendor/rgen/lib/rgen/serializer/xmi11_serializer.rb +116 -0
  368. data/lib/puppet/vendor/rgen/lib/rgen/serializer/xmi20_serializer.rb +71 -0
  369. data/lib/puppet/vendor/rgen/lib/rgen/serializer/xml_serializer.rb +98 -0
  370. data/lib/puppet/vendor/rgen/lib/rgen/template_language.rb +297 -0
  371. data/lib/puppet/vendor/rgen/lib/rgen/template_language/directory_template_container.rb +83 -0
  372. data/lib/puppet/vendor/rgen/lib/rgen/template_language/output_handler.rb +87 -0
  373. data/lib/puppet/vendor/rgen/lib/rgen/template_language/template_container.rb +234 -0
  374. data/lib/puppet/vendor/rgen/lib/rgen/template_language/template_helper.rb +26 -0
  375. data/lib/puppet/vendor/rgen/lib/rgen/transformer.rb +475 -0
  376. data/lib/puppet/vendor/rgen/lib/rgen/util/auto_class_creator.rb +61 -0
  377. data/lib/puppet/vendor/rgen/lib/rgen/util/cached_glob.rb +67 -0
  378. data/lib/puppet/vendor/rgen/lib/rgen/util/file_cache_map.rb +124 -0
  379. data/lib/puppet/vendor/rgen/lib/rgen/util/file_change_detector.rb +84 -0
  380. data/lib/puppet/vendor/rgen/lib/rgen/util/method_delegation.rb +114 -0
  381. data/lib/puppet/vendor/rgen/lib/rgen/util/model_comparator.rb +68 -0
  382. data/lib/puppet/vendor/rgen/lib/rgen/util/model_comparator_base.rb +142 -0
  383. data/lib/puppet/vendor/rgen/lib/rgen/util/model_dumper.rb +29 -0
  384. data/lib/puppet/vendor/rgen/lib/rgen/util/name_helper.rb +42 -0
  385. data/lib/puppet/vendor/rgen/lib/rgen/util/pattern_matcher.rb +329 -0
  386. data/lib/puppet/vendor/rgen/lib/transformers/ecore_to_uml13.rb +79 -0
  387. data/lib/puppet/vendor/rgen/lib/transformers/uml13_to_ecore.rb +127 -0
  388. data/lib/puppet/vendor/rgen/test/array_extensions_test.rb +64 -0
  389. data/lib/puppet/vendor/rgen/test/ea_instantiator_test.rb +35 -0
  390. data/lib/puppet/vendor/rgen/test/ea_serializer_test.rb +23 -0
  391. data/lib/puppet/vendor/rgen/test/ecore_self_test.rb +54 -0
  392. data/lib/puppet/vendor/rgen/test/environment_test.rb +90 -0
  393. data/lib/puppet/vendor/rgen/test/json_test.rb +171 -0
  394. data/lib/puppet/vendor/rgen/test/metamodel_builder_test.rb +1482 -0
  395. data/lib/puppet/vendor/rgen/test/metamodel_from_ecore_test.rb +57 -0
  396. data/lib/puppet/vendor/rgen/test/metamodel_order_test.rb +131 -0
  397. data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test.rb +98 -0
  398. data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test/TestModel.rb +70 -0
  399. data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test/houseMetamodel.ecore +42 -0
  400. data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test/houseMetamodel_from_ecore.rb +44 -0
  401. data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test/using_builtin_types.ecore +9 -0
  402. data/lib/puppet/vendor/rgen/test/method_delegation_test.rb +178 -0
  403. data/lib/puppet/vendor/rgen/test/model_builder/builder_context_test.rb +59 -0
  404. data/lib/puppet/vendor/rgen/test/model_builder/builder_test.rb +242 -0
  405. data/lib/puppet/vendor/rgen/test/model_builder/ecore_original.rb +163 -0
  406. data/lib/puppet/vendor/rgen/test/model_builder/ecore_original_regenerated.rb +163 -0
  407. data/lib/puppet/vendor/rgen/test/model_builder/reference_resolver_test.rb +156 -0
  408. data/lib/puppet/vendor/rgen/test/model_builder/serializer_test.rb +94 -0
  409. data/lib/puppet/vendor/rgen/test/model_builder/statemachine_metamodel.rb +42 -0
  410. data/lib/puppet/vendor/rgen/test/model_builder/test_model/statemachine1.rb +23 -0
  411. data/lib/puppet/vendor/rgen/test/model_builder_test.rb +6 -0
  412. data/lib/puppet/vendor/rgen/test/model_fragment_test.rb +30 -0
  413. data/lib/puppet/vendor/rgen/test/output_handler_test.rb +58 -0
  414. data/lib/puppet/vendor/rgen/test/qualified_name_provider_test.rb +48 -0
  415. data/lib/puppet/vendor/rgen/test/qualified_name_resolver_test.rb +102 -0
  416. data/lib/puppet/vendor/rgen/test/reference_resolver_test.rb +117 -0
  417. data/lib/puppet/vendor/rgen/test/rgen_test.rb +26 -0
  418. data/lib/puppet/vendor/rgen/test/template_language_test.rb +163 -0
  419. data/lib/puppet/vendor/rgen/test/template_language_test/expected_result1.txt +29 -0
  420. data/lib/puppet/vendor/rgen/test/template_language_test/expected_result2.txt +9 -0
  421. data/lib/puppet/vendor/rgen/test/template_language_test/expected_result3.txt +4 -0
  422. data/lib/puppet/vendor/rgen/test/template_language_test/indentStringTestDefaultIndent.out +1 -0
  423. data/lib/puppet/vendor/rgen/test/template_language_test/indentStringTestTabIndent.out +1 -0
  424. data/lib/puppet/vendor/rgen/test/template_language_test/templates/callback_indent_test/a.tpl +12 -0
  425. data/lib/puppet/vendor/rgen/test/template_language_test/templates/callback_indent_test/b.tpl +5 -0
  426. data/lib/puppet/vendor/rgen/test/template_language_test/templates/code/array.tpl +11 -0
  427. data/lib/puppet/vendor/rgen/test/template_language_test/templates/content/author.tpl +7 -0
  428. data/lib/puppet/vendor/rgen/test/template_language_test/templates/content/chapter.tpl +5 -0
  429. data/lib/puppet/vendor/rgen/test/template_language_test/templates/define_local_test/local.tpl +8 -0
  430. data/lib/puppet/vendor/rgen/test/template_language_test/templates/define_local_test/test.tpl +8 -0
  431. data/lib/puppet/vendor/rgen/test/template_language_test/templates/evaluate_test/test.tpl +7 -0
  432. data/lib/puppet/vendor/rgen/test/template_language_test/templates/indent_string_test.tpl +12 -0
  433. data/lib/puppet/vendor/rgen/test/template_language_test/templates/index/c/cmod.tpl +1 -0
  434. data/lib/puppet/vendor/rgen/test/template_language_test/templates/index/chapter.tpl +3 -0
  435. data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_backslash_r_test.tpl +5 -0
  436. data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/no_indent.tpl +3 -0
  437. data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/sub1/no_indent.tpl +3 -0
  438. data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/test.tpl +24 -0
  439. data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/test2.tpl +13 -0
  440. data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/test3.tpl +10 -0
  441. data/lib/puppet/vendor/rgen/test/template_language_test/templates/null_context_test.tpl +17 -0
  442. data/lib/puppet/vendor/rgen/test/template_language_test/templates/root.tpl +31 -0
  443. data/lib/puppet/vendor/rgen/test/template_language_test/templates/template_resolution_test/sub1.tpl +9 -0
  444. data/lib/puppet/vendor/rgen/test/template_language_test/templates/template_resolution_test/sub1/sub1.tpl +3 -0
  445. data/lib/puppet/vendor/rgen/test/template_language_test/templates/template_resolution_test/test.tpl +4 -0
  446. data/lib/puppet/vendor/rgen/test/template_language_test/testout.txt +29 -0
  447. data/lib/puppet/vendor/rgen/test/testmodel/class_model_checker.rb +119 -0
  448. data/lib/puppet/vendor/rgen/test/testmodel/ea_testmodel.eap +0 -0
  449. data/lib/puppet/vendor/rgen/test/testmodel/ea_testmodel.xml +1029 -0
  450. data/lib/puppet/vendor/rgen/test/testmodel/ea_testmodel_partial.xml +317 -0
  451. data/lib/puppet/vendor/rgen/test/testmodel/ecore_model_checker.rb +101 -0
  452. data/lib/puppet/vendor/rgen/test/testmodel/manual_testmodel.xml +22 -0
  453. data/lib/puppet/vendor/rgen/test/testmodel/object_model_checker.rb +67 -0
  454. data/lib/puppet/vendor/rgen/test/transformer_test.rb +254 -0
  455. data/lib/puppet/vendor/rgen/test/util/file_cache_map_test.rb +99 -0
  456. data/lib/puppet/vendor/rgen/test/util/pattern_matcher_test.rb +97 -0
  457. data/lib/puppet/vendor/rgen/test/util_test.rb +5 -0
  458. data/lib/puppet/vendor/rgen/test/xml_instantiator_test.rb +160 -0
  459. data/lib/puppet/vendor/rgen/test/xml_instantiator_test/simple_ecore_model_checker.rb +94 -0
  460. data/lib/puppet/vendor/rgen/test/xml_instantiator_test/simple_xmi_ecore_instantiator.rb +53 -0
  461. data/lib/puppet/vendor/rgen/test/xml_instantiator_test/simple_xmi_metamodel.rb +49 -0
  462. data/lib/puppet/vendor/rgen/test/xml_instantiator_test/simple_xmi_to_ecore.rb +75 -0
  463. data/lib/puppet/vendor/safe_yaml/PUPPET_README.md +6 -0
  464. data/lib/puppet/vendor/semantic/PUPPET_README.md +6 -0
  465. data/lib/puppet/version.rb +1 -1
  466. data/spec/fixtures/integration/node/environment/sitedir2/00_a.pp +2 -0
  467. data/spec/fixtures/integration/node/environment/sitedir2/02_folder/01_b.pp +6 -0
  468. data/spec/fixtures/integration/node/environment/sitedir2/03_c.pp +1 -0
  469. data/spec/fixtures/integration/node/environment/sitedir2/04_include.pp +2 -0
  470. data/spec/fixtures/releases/jamtur01-apache/manifests/vhost.pp +1 -1
  471. data/spec/fixtures/unit/indirector/hiera/global.yaml +10 -0
  472. data/spec/fixtures/unit/indirector/hiera/invalid.yaml +1 -0
  473. data/spec/fixtures/unit/parser/functions/create_resources/foo/manifests/init.pp +3 -0
  474. data/spec/fixtures/unit/parser/functions/create_resources/foo/manifests/wrongdefine.pp +3 -0
  475. data/spec/fixtures/unit/parser/lexer/argumentdefaults.pp +2 -2
  476. data/spec/fixtures/unit/parser/lexer/casestatement.pp +14 -14
  477. data/spec/fixtures/unit/parser/lexer/classheirarchy.pp +3 -3
  478. data/spec/fixtures/unit/parser/lexer/classincludes.pp +3 -3
  479. data/spec/fixtures/unit/parser/lexer/classpathtest.pp +1 -1
  480. data/spec/fixtures/unit/parser/lexer/collection_override.pp +1 -1
  481. data/spec/fixtures/unit/parser/lexer/componentrequire.pp +2 -2
  482. data/spec/fixtures/unit/parser/lexer/deepclassheirarchy.pp +5 -5
  483. data/spec/fixtures/unit/parser/lexer/defineoverrides.pp +2 -2
  484. data/spec/fixtures/unit/parser/lexer/filecreate.pp +2 -2
  485. data/spec/fixtures/unit/parser/lexer/ifexpression.pp +1 -1
  486. data/spec/fixtures/unit/parser/lexer/implicititeration.pp +4 -4
  487. data/spec/fixtures/unit/parser/lexer/multipleinstances.pp +3 -3
  488. data/spec/fixtures/unit/parser/lexer/multisubs.pp +2 -2
  489. data/spec/fixtures/unit/parser/lexer/namevartest.pp +2 -2
  490. data/spec/fixtures/unit/parser/lexer/simpledefaults.pp +1 -1
  491. data/spec/fixtures/unit/pops/parser/lexer/argumentdefaults.pp +1 -1
  492. data/spec/fixtures/unit/pops/parser/lexer/casestatement.pp +14 -14
  493. data/spec/fixtures/unit/pops/parser/lexer/classheirarchy.pp +3 -3
  494. data/spec/fixtures/unit/pops/parser/lexer/classincludes.pp +3 -3
  495. data/spec/fixtures/unit/pops/parser/lexer/classpathtest.pp +1 -1
  496. data/spec/fixtures/unit/pops/parser/lexer/collection_override.pp +1 -1
  497. data/spec/fixtures/unit/pops/parser/lexer/componentrequire.pp +2 -2
  498. data/spec/fixtures/unit/pops/parser/lexer/deepclassheirarchy.pp +5 -5
  499. data/spec/fixtures/unit/pops/parser/lexer/defineoverrides.pp +2 -2
  500. data/spec/fixtures/unit/pops/parser/lexer/filecreate.pp +2 -2
  501. data/spec/fixtures/unit/pops/parser/lexer/ifexpression.pp +1 -1
  502. data/spec/fixtures/unit/pops/parser/lexer/implicititeration.pp +4 -4
  503. data/spec/fixtures/unit/pops/parser/lexer/multipleinstances.pp +3 -3
  504. data/spec/fixtures/unit/pops/parser/lexer/multisubs.pp +2 -2
  505. data/spec/fixtures/unit/pops/parser/lexer/namevartest.pp +2 -2
  506. data/spec/fixtures/unit/pops/parser/lexer/simpledefaults.pp +1 -1
  507. data/spec/fixtures/unit/provider/package/gem/gem-list-single-package +4 -0
  508. data/spec/fixtures/unit/type/user/authorized_keys +1 -1
  509. data/spec/integration/agent/logging_spec.rb +4 -0
  510. data/spec/integration/application/doc_spec.rb +4 -3
  511. data/spec/integration/configurer_spec.rb +0 -14
  512. data/spec/integration/defaults_spec.rb +26 -0
  513. data/spec/integration/environments/default_manifest_spec.rb +274 -0
  514. data/spec/integration/faces/documentation_spec.rb +0 -4
  515. data/spec/integration/file_bucket/file_spec.rb +21 -0
  516. data/spec/integration/indirector/catalog/compiler_spec.rb +0 -2
  517. data/spec/integration/indirector/catalog/queue_spec.rb +0 -2
  518. data/spec/integration/indirector/facts/facter_spec.rb +1 -1
  519. data/spec/integration/indirector/file_content/file_server_spec.rb +2 -2
  520. data/spec/integration/node/environment_spec.rb +24 -8
  521. data/spec/integration/parser/catalog_spec.rb +10 -10
  522. data/spec/integration/parser/class_spec.rb +37 -0
  523. data/spec/integration/parser/collector_spec.rb +234 -75
  524. data/spec/integration/parser/compiler_spec.rb +385 -401
  525. data/spec/integration/parser/conditionals_spec.rb +117 -0
  526. data/spec/integration/parser/future_compiler_spec.rb +359 -8
  527. data/spec/integration/parser/node_spec.rb +185 -0
  528. data/spec/integration/parser/resource_expressions_spec.rb +286 -0
  529. data/spec/integration/parser/ruby_manifest_spec.rb +0 -4
  530. data/spec/integration/parser/scope_spec.rb +94 -151
  531. data/spec/integration/provider/cron/crontab_spec.rb +137 -148
  532. data/spec/integration/ssl/certificate_authority_spec.rb +26 -0
  533. data/spec/integration/ssl/certificate_request_spec.rb +0 -6
  534. data/spec/integration/ssl/certificate_revocation_list_spec.rb +0 -2
  535. data/spec/integration/ssl/host_spec.rb +0 -2
  536. data/spec/integration/transaction_spec.rb +16 -0
  537. data/spec/integration/type/file_spec.rb +14 -13
  538. data/spec/integration/type/nagios_spec.rb +6 -15
  539. data/spec/integration/type/sshkey_spec.rb +22 -0
  540. data/spec/integration/type/tidy_spec.rb +3 -0
  541. data/spec/integration/type/user_spec.rb +8 -3
  542. data/spec/integration/util/autoload_spec.rb +6 -6
  543. data/spec/integration/util/rdoc/parser_spec.rb +7 -0
  544. data/spec/integration/util/windows/process_spec.rb +12 -0
  545. data/spec/integration/util/windows/security_spec.rb +36 -35
  546. data/spec/integration/util/windows/user_spec.rb +75 -9
  547. data/spec/integration/util_spec.rb +2 -2
  548. data/spec/lib/matchers/resource.rb +1 -0
  549. data/spec/lib/puppet_spec/compiler.rb +15 -2
  550. data/spec/lib/puppet_spec/files.rb +10 -0
  551. data/spec/lib/puppet_spec/language.rb +74 -0
  552. data/spec/lib/puppet_spec/matchers.rb +59 -32
  553. data/spec/lib/puppet_spec/module_tool/stub_source.rb +3 -0
  554. data/spec/shared_behaviours/hiera_indirections.rb +99 -0
  555. data/spec/shared_behaviours/iterative_functions.rb +69 -0
  556. data/spec/unit/application/apply_spec.rb +4 -2
  557. data/spec/unit/application/doc_spec.rb +17 -13
  558. data/spec/unit/application/master_spec.rb +35 -27
  559. data/spec/unit/application/resource_spec.rb +0 -5
  560. data/spec/unit/configurer/downloader_factory_spec.rb +96 -0
  561. data/spec/unit/configurer/downloader_spec.rb +3 -24
  562. data/spec/unit/configurer/plugin_handler_spec.rb +22 -22
  563. data/spec/unit/configurer_spec.rb +0 -4
  564. data/spec/unit/defaults_spec.rb +30 -0
  565. data/spec/unit/face/config_spec.rb +2 -1
  566. data/spec/unit/face/module/build_spec.rb +2 -2
  567. data/spec/unit/face/module/install_spec.rb +8 -8
  568. data/spec/unit/face/parser_spec.rb +71 -33
  569. data/spec/unit/file_bucket/file_spec.rb +2 -2
  570. data/spec/unit/file_system/uniquefile_spec.rb +184 -0
  571. data/spec/unit/forge/errors_spec.rb +4 -6
  572. data/spec/unit/forge/module_release_spec.rb +178 -89
  573. data/spec/unit/forge/repository_spec.rb +110 -2
  574. data/spec/unit/forge_spec.rb +39 -3
  575. data/spec/unit/functions/assert_type_spec.rb +22 -3
  576. data/spec/unit/{parser/methods → functions}/each_spec.rb +21 -1
  577. data/spec/unit/{parser/functions → functions}/epp_spec.rb +61 -9
  578. data/spec/unit/{parser/methods → functions}/filter_spec.rb +34 -38
  579. data/spec/unit/{parser/functions → functions}/inline_epp_spec.rb +18 -3
  580. data/spec/unit/functions/map_spec.rb +169 -0
  581. data/spec/unit/functions/match_spec.rb +57 -0
  582. data/spec/unit/{parser/methods → functions}/reduce_spec.rb +23 -5
  583. data/spec/unit/{parser/methods → functions}/slice_spec.rb +34 -21
  584. data/spec/unit/functions/with_spec.rb +35 -0
  585. data/spec/unit/functions4_spec.rb +7 -8
  586. data/spec/unit/indirector/catalog/compiler_spec.rb +0 -2
  587. data/spec/unit/indirector/catalog/static_compiler_spec.rb +11 -0
  588. data/spec/unit/indirector/data_binding/hiera_spec.rb +1 -96
  589. data/spec/unit/indirector/facts/facter_spec.rb +69 -102
  590. data/spec/unit/indirector/hiera_spec.rb +17 -0
  591. data/spec/unit/indirector/request_spec.rb +2 -4
  592. data/spec/unit/indirector/resource/ral_spec.rb +5 -0
  593. data/spec/unit/indirector/resource_type/parser_spec.rb +17 -12
  594. data/spec/unit/indirector/rest_spec.rb +36 -6
  595. data/spec/unit/interface/face_collection_spec.rb +2 -2
  596. data/spec/unit/module_tool/applications/builder_spec.rb +364 -14
  597. data/spec/unit/module_tool/applications/uninstaller_spec.rb +22 -0
  598. data/spec/unit/module_tool/applications/unpacker_spec.rb +40 -0
  599. data/spec/unit/module_tool/applications/upgrader_spec.rb +22 -0
  600. data/spec/unit/module_tool/installed_modules_spec.rb +49 -0
  601. data/spec/unit/module_tool/metadata_spec.rb +72 -4
  602. data/spec/unit/module_tool/tar/mini_spec.rb +2 -1
  603. data/spec/unit/network/authentication_spec.rb +4 -0
  604. data/spec/unit/network/http/api/v2/environments_spec.rb +24 -3
  605. data/spec/unit/network/http/connection_spec.rb +127 -92
  606. data/spec/unit/network/http/factory_spec.rb +82 -0
  607. data/spec/unit/network/http/handler_spec.rb +23 -13
  608. data/spec/unit/network/http/nocache_pool_spec.rb +43 -0
  609. data/spec/unit/network/http/pool_spec.rb +269 -0
  610. data/spec/unit/network/http/rack/rest_spec.rb +1 -1
  611. data/spec/unit/network/http/session_spec.rb +43 -0
  612. data/spec/unit/network/http/site_spec.rb +90 -0
  613. data/spec/unit/network/http/webrick_spec.rb +1 -1
  614. data/spec/unit/network/http_pool_spec.rb +9 -6
  615. data/spec/unit/network/http_spec.rb +10 -0
  616. data/spec/unit/node/environment_spec.rb +54 -0
  617. data/spec/unit/node_spec.rb +3 -5
  618. data/spec/unit/parser/compiler_spec.rb +9 -2
  619. data/spec/unit/parser/files_spec.rb +19 -0
  620. data/spec/unit/parser/functions/contain_spec.rb +51 -0
  621. data/spec/unit/parser/functions/create_resources_spec.rb +8 -1
  622. data/spec/unit/parser/functions/digest_spec.rb +31 -0
  623. data/spec/unit/parser/functions/file_spec.rb +48 -5
  624. data/spec/unit/parser/functions/include_spec.rb +15 -1
  625. data/spec/unit/parser/functions/realize_spec.rb +43 -35
  626. data/spec/unit/parser/functions/require_spec.rb +19 -5
  627. data/spec/unit/parser/functions/search_spec.rb +5 -0
  628. data/spec/unit/parser/functions/shared.rb +82 -0
  629. data/spec/unit/parser/functions_spec.rb +1 -1
  630. data/spec/unit/parser/lexer_spec.rb +10 -1
  631. data/spec/unit/parser/type_loader_spec.rb +0 -1
  632. data/spec/unit/pops/benchmark_spec.rb +1 -1
  633. data/spec/unit/pops/binder/bindings_composer_spec.rb +24 -22
  634. data/spec/unit/pops/binder/injector_spec.rb +8 -6
  635. data/spec/unit/pops/evaluator/access_ops_spec.rb +3 -3
  636. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +7 -4
  637. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +250 -30
  638. data/spec/unit/pops/evaluator/logical_ops_spec.rb +2 -2
  639. data/spec/unit/pops/evaluator/variables_spec.rb +0 -105
  640. data/spec/unit/pops/issues_spec.rb +170 -0
  641. data/spec/unit/pops/loaders/dependency_loader_spec.rb +17 -0
  642. data/spec/unit/pops/loaders/loader_paths_spec.rb +4 -15
  643. data/spec/unit/pops/loaders/loaders_spec.rb +31 -11
  644. data/spec/unit/pops/loaders/module_loaders_spec.rb +0 -29
  645. data/spec/unit/pops/loaders/static_loader_spec.rb +6 -0
  646. data/spec/unit/pops/parser/epp_parser_spec.rb +38 -9
  647. data/spec/unit/pops/parser/evaluating_parser_spec.rb +0 -1
  648. data/spec/unit/pops/parser/lexer2_spec.rb +21 -4
  649. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +5 -0
  650. data/spec/unit/pops/parser/parse_calls_spec.rb +6 -3
  651. data/spec/unit/pops/parser/parse_conditionals_spec.rb +12 -5
  652. data/spec/unit/pops/parser/parse_containers_spec.rb +62 -7
  653. data/spec/unit/pops/parser/parse_resource_spec.rb +155 -73
  654. data/spec/unit/pops/parser/parser_spec.rb +16 -0
  655. data/spec/unit/pops/parser/parsing_typed_parameters_spec.rb +72 -0
  656. data/spec/unit/pops/transformer/transform_calls_spec.rb +1 -1
  657. data/spec/unit/pops/types/type_calculator_spec.rb +254 -57
  658. data/spec/unit/pops/types/type_factory_spec.rb +8 -3
  659. data/spec/unit/pops/types/type_parser_spec.rb +26 -5
  660. data/spec/unit/pops/validator/validator_spec.rb +143 -27
  661. data/spec/unit/provider/exec/posix_spec.rb +22 -14
  662. data/spec/unit/provider/exec/shell_spec.rb +2 -2
  663. data/spec/unit/provider/file/windows_spec.rb +7 -7
  664. data/spec/unit/provider/group/windows_adsi_spec.rb +17 -17
  665. data/spec/unit/provider/package/gem_spec.rb +10 -0
  666. data/spec/unit/provider/package/openbsd_spec.rb +66 -9
  667. data/spec/unit/provider/package/pacman_spec.rb +90 -71
  668. data/spec/unit/provider/package/windows/package_spec.rb +21 -6
  669. data/spec/unit/provider/package/yum_spec.rb +1 -0
  670. data/spec/unit/provider/parsedfile_spec.rb +1 -1
  671. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +9 -9
  672. data/spec/unit/provider/service/openbsd_spec.rb +26 -2
  673. data/spec/unit/provider/service/upstart_spec.rb +12 -1
  674. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +6 -0
  675. data/spec/unit/provider/user/user_role_add_spec.rb +23 -1
  676. data/spec/unit/provider/user/windows_adsi_spec.rb +17 -17
  677. data/spec/unit/reports/store_spec.rb +0 -16
  678. data/spec/unit/resource/catalog_spec.rb +0 -5
  679. data/spec/unit/resource_spec.rb +2 -2
  680. data/spec/unit/settings/autosign_setting_spec.rb +2 -2
  681. data/spec/unit/settings/environment_conf_spec.rb +77 -10
  682. data/spec/unit/settings/file_setting_spec.rb +5 -4
  683. data/spec/unit/settings/priority_setting_spec.rb +4 -4
  684. data/spec/unit/settings_spec.rb +41 -3
  685. data/spec/unit/ssl/certificate_authority_spec.rb +25 -2
  686. data/spec/unit/ssl/inventory_spec.rb +13 -0
  687. data/spec/unit/ssl/validator_spec.rb +0 -1
  688. data/spec/unit/transaction/resource_harness_spec.rb +64 -0
  689. data/spec/unit/transaction_spec.rb +98 -47
  690. data/spec/unit/type/cron_spec.rb +3 -3
  691. data/spec/unit/type/exec_spec.rb +9 -0
  692. data/spec/unit/type/file/content_spec.rb +54 -71
  693. data/spec/unit/type/file/mode_spec.rb +26 -1
  694. data/spec/unit/type/file/source_spec.rb +26 -4
  695. data/spec/unit/type/file_spec.rb +3 -3
  696. data/spec/unit/type/nagios_spec.rb +12 -3
  697. data/spec/unit/type/resources_spec.rb +64 -30
  698. data/spec/unit/type/user_spec.rb +1 -1
  699. data/spec/unit/type/yumrepo_spec.rb +136 -0
  700. data/spec/unit/type/zone_spec.rb +44 -1
  701. data/spec/unit/type_spec.rb +20 -0
  702. data/spec/unit/util/colors_spec.rb +14 -8
  703. data/spec/unit/util/command_line_spec.rb +11 -7
  704. data/spec/unit/util/execution_spec.rb +35 -42
  705. data/spec/unit/util/feature_spec.rb +12 -0
  706. data/spec/unit/util/http_proxy_spec.rb +43 -1
  707. data/spec/unit/util/log/destinations_spec.rb +45 -1
  708. data/spec/unit/util/logging_spec.rb +38 -0
  709. data/spec/unit/util/pidlock_spec.rb +37 -1
  710. data/spec/unit/util/profiler/aggregate_spec.rb +59 -0
  711. data/spec/unit/util/profiler/around_profiler_spec.rb +61 -0
  712. data/spec/unit/util/profiler/logging_spec.rb +18 -29
  713. data/spec/unit/util/profiler/wall_clock_spec.rb +1 -1
  714. data/spec/unit/util/profiler_spec.rb +55 -0
  715. data/spec/unit/util/queue_spec.rb +0 -1
  716. data/spec/unit/util/rdoc/parser_spec.rb +14 -6
  717. data/spec/unit/util/tagging_spec.rb +1 -1
  718. data/spec/unit/util/windows/access_control_entry_spec.rb +1 -1
  719. data/spec/unit/util/{adsi_spec.rb → windows/adsi_spec.rb} +111 -108
  720. data/spec/unit/util/windows/api_types_spec.rb +28 -0
  721. data/spec/unit/util/windows/registry_spec.rb +7 -6
  722. data/spec/unit/util/windows/sid_spec.rb +3 -6
  723. data/spec/unit/util/windows/string_spec.rb +4 -0
  724. data/spec/unit/util/zaml_spec.rb +5 -1
  725. data/tasks/benchmark.rake +40 -5
  726. data/tasks/parser.rake +16 -2
  727. data/tasks/yard.rake +1 -1
  728. metadata +296 -68
  729. data/lib/puppet/file_system/tempfile.rb +0 -20
  730. data/lib/puppet/parser/e_parser_adapter.rb +0 -119
  731. data/lib/puppet/parser/functions/collect.rb +0 -15
  732. data/lib/puppet/parser/functions/select.rb +0 -15
  733. data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +0 -109
  734. data/lib/puppet/pops/parser/lexer.rb +0 -753
  735. data/lib/puppet/pops/parser/makefile +0 -6
  736. data/lib/puppet/pops/validation/checker3_1.rb +0 -558
  737. data/lib/puppet/pops/validation/validator_factory_3_1.rb +0 -31
  738. data/lib/puppet/util/profiler/none.rb +0 -8
  739. data/spec/unit/face/certificate_request_spec.rb +0 -7
  740. data/spec/unit/face/certificate_revocation_list_spec.rb +0 -7
  741. data/spec/unit/face/key_spec.rb +0 -7
  742. data/spec/unit/face/report_spec.rb +0 -7
  743. data/spec/unit/face/resource_spec.rb +0 -7
  744. data/spec/unit/face/resource_type_spec.rb +0 -7
  745. data/spec/unit/file_system/tempfile_spec.rb +0 -48
  746. data/spec/unit/parser/eparser_adapter_spec.rb +0 -407
  747. data/spec/unit/parser/methods/map_spec.rb +0 -184
  748. data/spec/unit/parser/methods/shared.rb +0 -45
  749. data/spec/unit/pops/parser/lexer_spec.rb +0 -840
  750. data/spec/unit/pops/transformer/transform_resource_spec.rb +0 -185
  751. data/spec/unit/util/profiler/none_spec.rb +0 -12
@@ -0,0 +1,83 @@
1
+ # RGen Framework
2
+ # (c) Martin Thiede, 2006
3
+
4
+ require 'rgen/template_language/template_container'
5
+ require 'rgen/template_language/template_helper'
6
+
7
+ module RGen
8
+
9
+ module TemplateLanguage
10
+
11
+ class DirectoryTemplateContainer
12
+ include TemplateHelper
13
+
14
+ def initialize(metamodel=nil, output_path=nil, parent=nil)
15
+ @containers = {}
16
+ @directoryContainers = {}
17
+ @parent = parent
18
+ @metamodel = metamodel
19
+ @output_path = output_path
20
+ end
21
+
22
+ def load(dir)
23
+ Dir.foreach(dir) { |f|
24
+ qf = dir+"/"+f
25
+ if !File.directory?(qf) && f =~ /^(.*)\.tpl$/
26
+ (@containers[$1] = TemplateContainer.new(@metamodel, @output_path, self,qf)).load
27
+ elsif File.directory?(qf) && f != "." && f != ".."
28
+ (@directoryContainers[f] = DirectoryTemplateContainer.new(@metamodel, @output_path, self)).load(qf)
29
+ end
30
+ }
31
+ end
32
+
33
+ def expand(template, *all_args)
34
+ if template =~ /^\//
35
+ if @parent
36
+ # pass to parent
37
+ @parent.expand(template, *all_args)
38
+ else
39
+ # this is root
40
+ _expand(template, *all_args)
41
+ end
42
+ elsif template =~ /^\.\.\/(.*)/
43
+ if @parent
44
+ # pass to parent
45
+ @parent.expand($1, *all_args)
46
+ else
47
+ raise "No parent directory for root"
48
+ end
49
+ else
50
+ _expand(template, *all_args)
51
+ end
52
+ end
53
+
54
+ # Set indentation string.
55
+ # Every generated line will be prependend with n times this string at an indentation level of n.
56
+ # Defaults to " " (3 spaces)
57
+ def indentString=(str)
58
+ @indentString = str
59
+ end
60
+
61
+ def indentString
62
+ @indentString || (@parent && @parent.indentString) || " "
63
+ end
64
+
65
+ private
66
+
67
+ def _expand(template, *all_args)
68
+ if template =~ /^\/?(\w+)::(\w.*)/
69
+ raise "Template not found: #{$1}" unless @containers[$1]
70
+ @containers[$1].expand($2, *all_args)
71
+ elsif template =~ /^\/?(\w+)\/(\w.*)/
72
+ raise "Template not found: #{$1}" unless @directoryContainers[$1]
73
+ @directoryContainers[$1].expand($2, *all_args)
74
+ else
75
+ raise "Invalid template name: #{template}"
76
+ end
77
+ end
78
+
79
+ end
80
+
81
+ end
82
+
83
+ end
@@ -0,0 +1,87 @@
1
+ # RGen Framework
2
+ # (c) Martin Thiede, 2006
3
+
4
+ module RGen
5
+
6
+ module TemplateLanguage
7
+
8
+ class OutputHandler
9
+ attr_writer :indent
10
+ attr_accessor :noIndentNextLine
11
+
12
+ def initialize(indent=0, indentString=" ", mode=:explicit)
13
+ self.mode = mode
14
+ @indent = indent
15
+ @indentString = indentString
16
+ @state = :wait_for_nonws
17
+ @output = ""
18
+ end
19
+
20
+ # ERB will call this method for every string s which is part of the
21
+ # template file in between %> and <%. If s contains a newline, it will
22
+ # call this method for every part of s which is terminated by a \n
23
+ #
24
+ def concat(s)
25
+ return @output.concat(s) if s.is_a? OutputHandler
26
+ #puts [object_id, noIndentNextLine, @state, @output.to_s, s].inspect
27
+ s = s.to_str.gsub(/^[\t ]*\r?\n/,'') if @ignoreNextNL
28
+ s = s.to_str.gsub(/^\s+/,'') if @ignoreNextWS
29
+ @ignoreNextNL = @ignoreNextWS = false if s =~ /\S/
30
+ if @mode == :direct
31
+ @output.concat(s)
32
+ elsif @mode == :explicit
33
+ while s.size > 0
34
+ if @state == :wait_for_nl
35
+ if s =~ /\A([^\r\n]*\r?\n)(.*)/m
36
+ rest = $2
37
+ @output.concat($1.gsub(/[\t ]+(?=\r|\n)/,''))
38
+ s = rest || ""
39
+ @state = :wait_for_nonws
40
+ else
41
+ @output.concat(s)
42
+ s = ""
43
+ end
44
+ elsif @state == :wait_for_nonws
45
+ if s =~ /\A\s*(\S+.*)/m
46
+ s = $1 || ""
47
+ if !@noIndentNextLine && !(@output.to_s.size > 0 && @output.to_s[-1] != "\n"[0])
48
+ @output.concat(@indentString * @indent)
49
+ else
50
+ @noIndentNextLine = false
51
+ end
52
+ @state = :wait_for_nl
53
+ else
54
+ s = ""
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ alias << concat
61
+
62
+ def to_str
63
+ @output
64
+ end
65
+ alias to_s to_str
66
+
67
+ def direct_concat(s)
68
+ @output.concat(s)
69
+ end
70
+
71
+ def ignoreNextNL
72
+ @ignoreNextNL = true
73
+ end
74
+
75
+ def ignoreNextWS
76
+ @ignoreNextWS = true
77
+ end
78
+
79
+ def mode=(m)
80
+ raise StandardError.new("Unknown mode: #{m}") unless [:direct, :explicit].include?(m)
81
+ @mode = m
82
+ end
83
+ end
84
+
85
+ end
86
+
87
+ end
@@ -0,0 +1,234 @@
1
+ # RGen Framework
2
+ # (c) Martin Thiede, 2006
3
+
4
+ require 'erb'
5
+ require 'fileutils'
6
+ require 'rgen/template_language/output_handler'
7
+ require 'rgen/template_language/template_helper'
8
+
9
+ module RGen
10
+
11
+ module TemplateLanguage
12
+
13
+ class TemplateContainer
14
+ include TemplateHelper
15
+
16
+ def initialize(metamodels, output_path, parent, filename)
17
+ @templates = {}
18
+ @parent = parent
19
+ @filename = filename
20
+ @indent = 0
21
+ @output_path = output_path
22
+ @metamodels = metamodels
23
+ @metamodels = [ @metamodels ] unless @metamodels.is_a?(Array)
24
+ end
25
+
26
+ def load
27
+ File.open(@filename,"rb") do |f|
28
+ begin
29
+ @@metamodels = @metamodels
30
+ fileContent = f.read
31
+ _detectNewLinePattern(fileContent)
32
+ ERB.new(fileContent,nil,nil,'@output').result(binding)
33
+ rescue Exception => e
34
+ processAndRaise(e)
35
+ end
36
+ end
37
+ end
38
+
39
+ def expand(template, *all_args)
40
+ args, params = _splitArgsAndOptions(all_args)
41
+ if params.has_key?(:foreach)
42
+ raise StandardError.new("expand :foreach argument is not enumerable") \
43
+ unless params[:foreach].is_a?(Enumerable)
44
+ _expand_foreach(template, args, params)
45
+ else
46
+ _expand(template, args, params)
47
+ end
48
+ end
49
+
50
+ def evaluate(template, *all_args)
51
+ args, params = _splitArgsAndOptions(all_args)
52
+ raise StandardError.new(":foreach can not be used with evaluate") if params[:foreach]
53
+ _expand(template, args, params.merge({:_evalOnly => true}))
54
+ end
55
+
56
+ def this
57
+ @context
58
+ end
59
+
60
+ def method_missing(name, *args)
61
+ @context.send(name, *args)
62
+ end
63
+
64
+ def self.const_missing(name)
65
+ super unless @@metamodels
66
+ @@metamodels.each do |mm|
67
+ return mm.const_get(name) rescue NameError
68
+ end
69
+ super
70
+ end
71
+
72
+ private
73
+
74
+ def nonl
75
+ @output.ignoreNextNL
76
+ end
77
+
78
+ def nows
79
+ @output.ignoreNextWS
80
+ end
81
+
82
+ def nl
83
+ _direct_concat(@newLinePattern)
84
+ end
85
+
86
+ def ws
87
+ _direct_concat(" ")
88
+ end
89
+
90
+ def iinc
91
+ @indent += 1
92
+ @output.indent = @indent
93
+ end
94
+
95
+ def idec
96
+ @indent -= 1 if @indent > 0
97
+ @output.indent = @indent
98
+ end
99
+
100
+ TemplateDesc = Struct.new(:block, :local)
101
+
102
+ def define(template, params={}, &block)
103
+ _define(template, params, &block)
104
+ end
105
+
106
+ def define_local(template, params={}, &block)
107
+ _define(template, params.merge({:local => true}), &block)
108
+ end
109
+
110
+ def file(name, indentString=nil)
111
+ old_output, @output = @output, OutputHandler.new(@indent, indentString || @parent.indentString)
112
+ begin
113
+ yield
114
+ rescue Exception => e
115
+ processAndRaise(e)
116
+ end
117
+ path = ""
118
+ path += @output_path+"/" if @output_path
119
+ dirname = File.dirname(path+name)
120
+ FileUtils.makedirs(dirname) unless File.exist?(dirname)
121
+ File.open(path+name,"wb") { |f| f.write(@output) }
122
+ @output = old_output
123
+ end
124
+
125
+ # private private
126
+
127
+ def _define(template, params={}, &block)
128
+ @templates[template] ||= {}
129
+ cls = params[:for] || Object
130
+ @templates[template][cls] = TemplateDesc.new(block, params[:local])
131
+ end
132
+
133
+ def _expand_foreach(template, args, params)
134
+ sep = params[:separator]
135
+ params[:foreach].each_with_index {|e,i|
136
+ _direct_concat(sep.to_s) if sep && i > 0
137
+ output = _expand(template, args, params.merge({:for => e}))
138
+ }
139
+ end
140
+
141
+ LOCAL_TEMPLATE_REGEX = /^:*(\w+)$/
142
+
143
+ def _expand(template, args, params)
144
+ raise StandardError.new("expand :for argument evaluates to nil") if params.has_key?(:for) && params[:for].nil?
145
+ context = params[:for]
146
+ old_indent = @indent
147
+ @indent = params[:indent] || @indent
148
+ noIndentNextLine = params[:_noIndentNextLine] ||
149
+ (@output.is_a?(OutputHandler) && @output.noIndentNextLine) ||
150
+ (@output.to_s.size > 0 && @output.to_s[-1] != "\n"[0])
151
+ caller = params[:_caller] || self
152
+ old_context, @context = @context, context if context
153
+ local_output = nil
154
+ if template =~ LOCAL_TEMPLATE_REGEX
155
+ tplname = $1
156
+ raise StandardError.new("Template not found: #{$1}") unless @templates[tplname]
157
+ old_output, @output = @output, OutputHandler.new(@indent, @parent.indentString)
158
+ @output.noIndentNextLine = noIndentNextLine
159
+ _call_template(tplname, @context, args, caller == self)
160
+ old_output.noIndentNextLine = false if old_output.is_a?(OutputHandler) && !old_output.noIndentNextLine
161
+ local_output, @output = @output, old_output
162
+ else
163
+ local_output = @parent.expand(template, *(args.dup << {:for => @context, :indent => @indent, :_noIndentNextLine => noIndentNextLine, :_evalOnly => true, :_caller => caller}))
164
+ end
165
+ _direct_concat(local_output) unless params[:_evalOnly]
166
+ @context = old_context if old_context
167
+ @indent = old_indent
168
+ local_output.to_s
169
+ end
170
+
171
+ def processAndRaise(e, tpl=nil)
172
+ bt = e.backtrace.dup
173
+ e.backtrace.each_with_index do |t,i|
174
+ if t =~ /\(erb\):(\d+):/
175
+ bt[i] = "#{@filename}:#{$1}"
176
+ bt[i] += ":in '#{tpl}'" if tpl
177
+ break
178
+ end
179
+ end
180
+ raise e, e.to_s, bt
181
+ end
182
+
183
+ def _call_template(tpl, context, args, localCall)
184
+ found = false
185
+ @templates[tpl].each_pair do |key, value|
186
+ if context.is_a?(key)
187
+ templateDesc = @templates[tpl][key]
188
+ proc = templateDesc.block
189
+ arity = proc.arity
190
+ arity = 0 if arity == -1 # if no args are given
191
+ raise StandardError.new("Wrong number of arguments calling template #{tpl}: #{args.size} for #{arity} "+
192
+ "(Beware: Hashes as last arguments are taken as options and are ignored)") \
193
+ if arity != args.size
194
+ raise StandardError.new("Template can only be called locally: #{tpl}") \
195
+ if templateDesc.local && !localCall
196
+ begin
197
+ @@metamodels = @metamodels
198
+ proc.call(*args)
199
+ rescue Exception => e
200
+ processAndRaise(e, tpl)
201
+ end
202
+ found = true
203
+ end
204
+ end
205
+ raise StandardError.new("Template class not matching: #{tpl} for #{context.class.name}") unless found
206
+ end
207
+
208
+ def _direct_concat(s)
209
+ if @output.is_a? OutputHandler
210
+ @output.direct_concat(s)
211
+ else
212
+ @output << s
213
+ end
214
+ end
215
 
216
+ def _detectNewLinePattern(text)
217
+ tests = 0
218
+ rnOccurances = 0
219
+ text.scan(/(\r?)\n/) do |groups|
220
+ tests += 1
221
+ rnOccurances += 1 if groups[0] == "\r"
222
+ break if tests >= 10
223
+ end
224
+ if rnOccurances > (tests / 2)
225
+ @newLinePattern = "\r\n"
226
+ else
227
+ @newLinePattern = "\n"
228
+ end
229
+ end
230
+
231
+ end
232
+
233
+ end
234
+
235
+ end
@@ -0,0 +1,26 @@
1
+ # RGen Framework
2
+ # (c) Martin Thiede, 2006
3
+
4
+ module RGen
5
+
6
+ module TemplateLanguage
7
+
8
+ module TemplateHelper
9
+
10
+ private
11
+
12
+ def _splitArgsAndOptions(all)
13
+ if all[-1] and all[-1].is_a? Hash
14
+ args = all[0..-2] || []
15
+ options = all[-1]
16
+ else
17
+ args = all
18
+ options = {}
19
+ end
20
+ return args, options
21
+ end
22
+ end
23
+
24
+ end
25
+
26
+ end
@@ -0,0 +1,475 @@
1
+ require 'rgen/ecore/ecore'
2
+ require 'rgen/ecore/ecore_ext'
3
+
4
+ module RGen
5
+
6
+ # The Transformer class can be used to specify model transformations.
7
+ #
8
+ # Model transformations take place between a <i>source model</i> (located in the <i>source
9
+ # environment</i> being an instance of the <i>source metamodel</i>) and a <i>target model</i> (located
10
+ # in the <i>target environment</i> being an instance of the <i>target metamodel</i>).
11
+ # Normally a "model" consists of several model elements associated with each other.
12
+ #
13
+ # =Transformation Rules
14
+ #
15
+ # The transformation is specified within a subclass of Transformer.
16
+ # Within the subclass, the Transformer.transform class method can be used to specify transformation
17
+ # blocks for specific metamodel classes of the source metamodel.
18
+ #
19
+ # If there is no transformation rule for the current object's class, a rule for the superclass
20
+ # is used instead. If there's no rule for the superclass, the class hierarchy is searched
21
+ # this way until Object.
22
+ #
23
+ # Here is an example:
24
+ #
25
+ # class MyTransformer < RGen::Transformer
26
+ #
27
+ # transform InputClass, :to => OutputClass do
28
+ # { :name => name, :otherClass => trans(otherClass) }
29
+ # end
30
+ #
31
+ # transform OtherInputClass, :to => OtherOutputClass do
32
+ # { :name => name }
33
+ # end
34
+ # end
35
+ #
36
+ # In this example a transformation rule is specified for model elements of class InputClass
37
+ # as well as for elements of class OtherInputClass. The former is to be transformed into
38
+ # an instance of OutputClass, the latter into an instance of OtherOutputClass.
39
+ # Note that the Ruby class objects are used to specifiy the classes.
40
+ #
41
+ # =Transforming Attributes
42
+ #
43
+ # Besides the target class of a transformation, the attributes of the result object are
44
+ # specified in the above example. This is done by providing a Ruby block with the call of
45
+ # +transform+. Within this block arbitrary Ruby code may be placed, however the block
46
+ # must return a hash. This hash object specifies the attribute assignment of the
47
+ # result object using key/value pairs: The key must be a Symbol specifying the attribute
48
+ # which is to be assigned by name, the value is the value that will be assigned.
49
+ #
50
+ # For convenience, the transformation block will be evaluated in the context of the
51
+ # source model element which is currently being converted. This way it is possible to just
52
+ # write <code>:name => name</code> in the example in order to assign the name of the source
53
+ # object to the name attribute of the target object.
54
+ #
55
+ # =Transforming References
56
+ #
57
+ # When attributes of elements are references to other elements, those referenced
58
+ # elements have to be transformed as well. As shown above, this can be done by calling
59
+ # the Transformer#trans method. This method initiates a transformation of the element
60
+ # or array of elements passed as parameter according to transformation rules specified
61
+ # using +transform+. In fact the +trans+ method is the only way to start the transformation
62
+ # at all.
63
+ #
64
+ # For convenience and performance reasons, the result of +trans+ is cached with respect
65
+ # to the parameter object. I.e. calling trans on the same source object a second time will
66
+ # return the same result object _without_ a second evaluation of the corresponding
67
+ # transformation rules.
68
+ #
69
+ # This way the +trans+ method can be used to lookup the target element for some source
70
+ # element without the need to locally store a reference to the target element. In addition
71
+ # this can be useful if it is not clear if certain element has already been transformed
72
+ # when it is required within some other transformation block. See example below.
73
+ #
74
+ # Special care has been taken to allow the transformation of elements which reference
75
+ # each other cyclically. The key issue here is that the target element of some transformation
76
+ # is created _before_ the transformation's block is evaluated, i.e before the elements
77
+ # attributes are set. Otherwise a call to +trans+ within the transformation's block
78
+ # could lead to a +trans+ of the element itself.
79
+ #
80
+ # Here is an example:
81
+ #
82
+ # transform ModelAIn, :to => ModelAOut do
83
+ # { :name => name, :modelB => trans(modelB) }
84
+ # end
85
+ #
86
+ # transform ModelBIn, :to => ModelBOut do
87
+ # { :name => name, :modelA => trans(modelA) }
88
+ # end
89
+ #
90
+ # Note that in this case it does not matter if the transformation is initiated by calling
91
+ # +trans+ with a ModelAIn element or ModelBIn element due to the caching feature described
92
+ # above.
93
+ #
94
+ # =Transformer Methods
95
+ #
96
+ # When code in transformer blocks becomes more complex it might be useful to refactor
97
+ # it into smaller methods. If regular Ruby methods within the Transformer subclass are
98
+ # used for this purpose, it is necessary to know the source element being transformed.
99
+ # This could be achieved by explicitly passing the +@current_object+ as parameter of the
100
+ # method (see Transformer#trans).
101
+ #
102
+ # A more convenient way however is to define a special kind of method using the
103
+ # Transformer.method class method. Those methods are evaluated within the context of the
104
+ # current source element being transformed just the same as transformer blocks are.
105
+ #
106
+ # Here is an example:
107
+ #
108
+ # transform ModelIn, :to => ModelOut do
109
+ # { :number => doubleNumber }
110
+ # end
111
+ #
112
+ # method :doubleNumber do
113
+ # number * 2;
114
+ # end
115
+ #
116
+ # In this example the transformation assigns the 'number' attribute of the source element
117
+ # multiplied by 2 to the target element. The multiplication is done in a dedicated method
118
+ # called 'doubleNumber'. Note that the 'number' attribute of the source element is
119
+ # accessed without an explicit reference to the source element as the method's body
120
+ # evaluates in the source element's context.
121
+ #
122
+ # =Conditional Transformations
123
+ #
124
+ # Using the transformations as described above, all elements of the same class are
125
+ # transformed the same way. Conditional transformations allow to transform elements of
126
+ # the same class into elements of different target classes as well as applying different
127
+ # transformations on the attributes.
128
+ #
129
+ # Conditional transformations are defined by specifying multiple transformer blocks for
130
+ # the same source class and providing a condition with each block. Since it is important
131
+ # to create the target object before evaluation of the transformation block (see above),
132
+ # the conditions must also be evaluated separately _before_ the transformer block.
133
+ #
134
+ # Conditions are specified using transformer methods as described above. If the return
135
+ # value is true, the corresponding block is used for transformation. If more than one
136
+ # conditions are true, only the first transformer block will be evaluated.
137
+ #
138
+ # If there is no rule with a condition evaluating to true, rules for superclasses will
139
+ # be checked as described above.
140
+ #
141
+ # Here is an example:
142
+ #
143
+ # transform ModelIn, :to => ModelOut, :if => :largeNumber do
144
+ # { :number => number * 2}
145
+ # end
146
+ #
147
+ # transform ModelIn, :to => ModelOut, :if => :smallNumber do
148
+ # { :number => number / 2 }
149
+ # end
150
+ #
151
+ # method :largeNumber do
152
+ # number > 1000
153
+ # end
154
+ #
155
+ # method :smallNumber do
156
+ # number < 500
157
+ # end
158
+ #
159
+ # In this case the transformation of an element of class ModelIn depends on the value
160
+ # of the element's 'number' attribute. If the value is greater than 1000, the first rule
161
+ # as taken and the number is doubled. If the value is smaller than 500, the second rule
162
+ # is taken and the number is divided by two.
163
+ #
164
+ # Note that it is up to the user to avoid cycles within the conditions. A cycle could
165
+ # occure if the condition are based on transformation target elements, i.e. if +trans+
166
+ # is used within the condition to lookup or transform other elements.
167
+ #
168
+ # = Copy Transformations
169
+ #
170
+ # In some cases, transformations should just copy a model, either in the same metamodel
171
+ # or in another metamodel with the same package/class structure. Sometimes, a transformation
172
+ # is not exactly a copy, but a copy with slight modifications. Also in this case most
173
+ # classes need to be copied verbatim.
174
+ #
175
+ # The class method Transformer.copy can be used to specify a copy rule for a single
176
+ # metamodel class. If no target class is specified using the :to named parameter, the
177
+ # target class will be the same as the source class (i.e. in the same metamodel).
178
+ #
179
+ # copy MM1::ClassA # copy within the same metamodel
180
+ # copy MM1::ClassA, :to => MM2::ClassA
181
+ #
182
+ # The class method Transfomer.copy_all can be used to specify copy rules for all classes
183
+ # of a particular metamodel package. Again with :to, the target metamodel package may
184
+ # be specified which must have the same package/class structure. If :to is omitted, the
185
+ # target metamodel is the same as the source metamodel. In case that for some classes
186
+ # specific transformation rules should be used instead of copy rules, exceptions may be
187
+ # specified using the :except named parameter. +copy_all+ also provides an easy way to
188
+ # copy (clone) a model within the same metamodel.
189
+ #
190
+ # copy_all MM1 # copy rules for the whole metamodel MM1,
191
+ # # used to clone models of MM1
192
+ #
193
+ # copy_all MM1, :to => MM2, :except => %w( # copy rules for all classes of MM1 to
194
+ # ClassA # equally named classes in MM2, except
195
+ # Sub1::ClassB # "ClassA" and "Sub1::ClassB"
196
+ # )
197
+ #
198
+ # If a specific class transformation is not an exact copy, the Transformer.transform method
199
+ # should be used to actually specify the transformation. If this transformation is also
200
+ # mostly a copy, the helper method Transformer#copy_features can be used to create the
201
+ # transformation Hash required by the transform method. Any changes to this hash may be done
202
+ # in a hash returned by a block given to +copy_features+. This hash will extend or overwrite
203
+ # the default copy hash. In case a particular feature should not be part of the copy hash
204
+ # (e.g. because it does not exist in the target metamodel), exceptions can be specified using
205
+ # the :except named parameter. Here is an example:
206
+ #
207
+ # transform ClassA, :to => ClassAx do
208
+ # copy_features :except => [:featA] do
209
+ # { :featB => featA }
210
+ # end
211
+ # end
212
+ #
213
+ # In this example, ClassAx is a copy of ClassA except, that feature "featA" in ClassA is renamed
214
+ # into "featB" in ClassAx. Using +copy_features+ all features are copied except "featA". Then
215
+ # "featB" of the target class is assigned the value of "featA" of the source class.
216
+ #
217
+ class Transformer
218
+
219
+ TransformationDescription = Struct.new(:block, :target) # :nodoc:
220
+
221
+ @@methods = {}
222
+ @@transformer_blocks = {}
223
+
224
+ def self._transformer_blocks # :nodoc:
225
+ @@transformer_blocks[self] ||= {}
226
+ end
227
+
228
+ def self._methods # :nodoc:
229
+ @@methods[self] ||= {}
230
+ end
231
+
232
+ # This class method is used to specify a transformation rule.
233
+ #
234
+ # The first argument specifies the class of elements for which this rule applies.
235
+ # The second argument must be a hash including the target class
236
+ # (as value of key ':to') and an optional condition (as value of key ':if').
237
+ #
238
+ # The target class is specified by passing the actual Ruby class object.
239
+ # The condition is either the name of a transformer method (see Transfomer.method) as
240
+ # a symbol or a proc object. In either case the block is evaluated at transformation
241
+ # time and its result value determines if the rule applies.
242
+ #
243
+ def self.transform(from, desc=nil, &block)
244
+ to = (desc && desc.is_a?(Hash) && desc[:to])
245
+ condition = (desc && desc.is_a?(Hash) && desc[:if])
246
+ raise StandardError.new("No transformation target specified.") unless to
247
+ block_desc = TransformationDescription.new(block, to)
248
+ if condition
249
+ _transformer_blocks[from] ||= {}
250
+ raise StandardError.new("Multiple (non-conditional) transformations for class #{from.name}.") unless _transformer_blocks[from].is_a?(Hash)
251
+ _transformer_blocks[from][condition] = block_desc
252
+ else
253
+ raise StandardError.new("Multiple (non-conditional) transformations for class #{from.name}.") unless _transformer_blocks[from].nil?
254
+ _transformer_blocks[from] = block_desc
255
+ end
256
+ end
257
+
258
+ # This class method specifies that all objects of class +from+ are to be copied
259
+ # into an object of class +to+. If +to+ is omitted, +from+ is used as target class.
260
+ # The target class may also be specified using the :to => <class> hash notation.
261
+ # During copy, all attributes and references of the target object
262
+ # are set to their transformed counterparts of the source object.
263
+ #
264
+ def self.copy(from, to=nil)
265
+ raise StandardError.new("Specify target class either directly as second parameter or using :to => <class>") \
266
+ unless to.nil? || to.is_a?(Class) || (to.is_a?(Hash) && to[:to].is_a?(Class))
267
+ to = to[:to] if to.is_a?(Hash)
268
+ transform(from, :to => to || from) do
269
+ copy_features
270
+ end
271
+ end
272
+
273
+ # Create copy rules for all classes of metamodel package (module) +from+ and its subpackages.
274
+ # The target classes are the classes with the same name in the metamodel package
275
+ # specified using named parameter :to. If no target metamodel is specified, source
276
+ # and target classes will be the same.
277
+ # The named parameter :except can be used to specify classes by qualified name for which
278
+ # no copy rules should be created. Qualified names are relative to the metamodel package
279
+ # specified.
280
+ #
281
+ def self.copy_all(from, hash={})
282
+ to = hash[:to] || from
283
+ except = hash[:except]
284
+ fromDepth = from.ecore.qualifiedName.split("::").size
285
+ from.ecore.eAllClasses.each do |c|
286
+ path = c.qualifiedName.split("::")[fromDepth..-1]
287
+ next if except && except.include?(path.join("::"))
288
+ copy c.instanceClass, :to => path.inject(to){|m,c| m.const_get(c)}
289
+ end
290
+ end
291
+
292
+ # Define a transformer method for the current transformer class.
293
+ # In contrast to regular Ruby methods, a method defined this way executes in the
294
+ # context of the object currently being transformed.
295
+ #
296
+ def self.method(name, &block)
297
+ _methods[name.to_s] = block
298
+ end
299
+
300
+
301
+ # Creates a new transformer
302
+ # Optionally an input and output Environment can be specified.
303
+ # If an elementMap is provided (normally a Hash) this map will be used to lookup
304
+ # and store transformation results. This way results can be predefined
305
+ # and it is possible to have several transformers work on the same result map.
306
+ #
307
+ def initialize(env_in=nil, env_out=nil, elementMap=nil)
308
+ @env_in = env_in
309
+ @env_out = env_out
310
+ @transformer_results = elementMap || {}
311
+ @transformer_jobs = []
312
+ end
313
+
314
+
315
+ # Transforms a given model element according to the rules specified by means of
316
+ # the Transformer.transform class method.
317
+ #
318
+ # The transformation result element is created in the output environment and returned.
319
+ # In addition, the result is cached, i.e. a second invocation with the same parameter
320
+ # object will return the same result object without any further evaluation of the
321
+ # transformation rules. Nil will be transformed into nil. Ruby "singleton" objects
322
+ # +true+, +false+, numerics and symbols will be returned without any change. Ruby strings
323
+ # will be duplicated with the result being cached.
324
+ #
325
+ # The transformation input can be given as:
326
+ # * a single object
327
+ # * an array each element of which is transformed in turn
328
+ # * a hash used as input to Environment#find with the result being transformed
329
+ #
330
+ def trans(obj)
331
+ if obj.is_a?(Hash)
332
+ raise StandardError.new("No input environment available to find model element.") unless @env_in
333
+ obj = @env_in.find(obj)
334
+ end
335
+ return nil if obj.nil?
336
+ return obj if obj.is_a?(TrueClass) or obj.is_a?(FalseClass) or obj.is_a?(Numeric) or obj.is_a?(Symbol)
337
+ return @transformer_results[obj] if @transformer_results[obj]
338
+ return @transformer_results[obj] = obj.dup if obj.is_a?(String)
339
+ return obj.collect{|o| trans(o)}.compact if obj.is_a? Array
340
+ raise StandardError.new("No transformer for class #{obj.class.name}") unless _transformerBlock(obj.class)
341
+ block_desc = _evaluateCondition(obj)
342
+ return nil unless block_desc
343
+ @transformer_results[obj] = _instantiateTargetClass(obj, block_desc.target)
344
+ # we will transform the properties later
345
+ @transformer_jobs << TransformerJob.new(self, obj, block_desc)
346
+ # if there have been jobs in the queue before, don't process them in this call
347
+ # this way calls to trans are not nested; a recursive implementation
348
+ # may cause a "Stack level too deep" exception for large models
349
+ return @transformer_results[obj] if @transformer_jobs.size > 1
350
+ # otherwise this is the first call of trans, process all jobs here
351
+ # more jobs will be added during job execution
352
+ while @transformer_jobs.size > 0
353
+ @transformer_jobs.first.execute
354
+ @transformer_jobs.shift
355
+ end
356
+ @transformer_results[obj]
357
+ end
358
+
359
+ # Create the hash required as return value of the block given to the Transformer.transform method.
360
+ # The hash will assign feature values of the source class to the features of the target class,
361
+ # assuming the features of both classes are the same. If the :except named parameter specifies
362
+ # an Array of symbols, the listed features are not copied by the hash. In order to easily manipulate
363
+ # the resulting hash, a block may be given which should also return a feature assignmet hash. This
364
+ # hash should be created manually and will extend/overwrite the automatically created hash.
365
+ #
366
+ def copy_features(options={})
367
+ hash = {}
368
+ @current_object.class.ecore.eAllStructuralFeatures.each do |f|
369
+ next if f.derived
370
+ next if options[:except] && options[:except].include?(f.name.to_sym)
371
+ hash[f.name.to_sym] = trans(@current_object.send(f.name))
372
+ end
373
+ hash.merge!(yield) if block_given?
374
+ hash
375
+ end
376
+
377
+ def _transformProperties(obj, block_desc) #:nodoc:
378
+ old_object, @current_object = @current_object, obj
379
+ block_result = instance_eval(&block_desc.block)
380
+ raise StandardError.new("Transformer must return a hash") unless block_result.is_a? Hash
381
+ @current_object = old_object
382
+ _attributesFromHash(@transformer_results[obj], block_result)
383
+ end
384
+
385
+ class TransformerJob #:nodoc:
386
+ def initialize(transformer, obj, block_desc)
387
+ @transformer, @obj, @block_desc = transformer, obj, block_desc
388
+ end
389
+ def execute
390
+ @transformer._transformProperties(@obj, @block_desc)
391
+ end
392
+ end
393
+
394
+ # Each call which is not handled by the transformer object is passed to the object
395
+ # currently being transformed.
396
+ # If that object also does not respond to the call, it is treated as a transformer
397
+ # method call (see Transformer.method).
398
+ #
399
+ def method_missing(m, *args) #:nodoc:
400
+ if @current_object.respond_to?(m)
401
+ @current_object.send(m, *args)
402
+ else
403
+ _invokeMethod(m, *args)
404
+ end
405
+ end
406
+
407
+ private
408
+
409
+ # returns _transformer_blocks content for clazz or one of its superclasses
410
+ def _transformerBlock(clazz) # :nodoc:
411
+ block = self.class._transformer_blocks[clazz]
412
+ block = _transformerBlock(clazz.superclass) if block.nil? && clazz != Object
413
+ block
414
+ end
415
+
416
+ # returns the first TransformationDescription for clazz or one of its superclasses
417
+ # for which condition is true
418
+ def _evaluateCondition(obj, clazz=obj.class) # :nodoc:
419
+ tb = self.class._transformer_blocks[clazz]
420
+ block_description = nil
421
+ if tb.is_a?(TransformationDescription)
422
+ # non-conditional
423
+ block_description = tb
424
+ elsif tb
425
+ old_object, @current_object = @current_object, obj
426
+ tb.each_pair {|condition, block|
427
+ if condition.is_a?(Proc)
428
+ result = instance_eval(&condition)
429
+ elsif condition.is_a?(Symbol)
430
+ result = _invokeMethod(condition)
431
+ else
432
+ result = condition
433
+ end
434
+ if result
435
+ block_description = block
436
+ break
437
+ end
438
+ }
439
+ @current_object = old_object
440
+ end
441
+ block_description = _evaluateCondition(obj, clazz.superclass) if block_description.nil? && clazz != Object
442
+ block_description
443
+ end
444
+
445
+ def _instantiateTargetClass(obj, target_desc) # :nodoc:
446
+ old_object, @current_object = @current_object, obj
447
+ if target_desc.is_a?(Proc)
448
+ target_class = instance_eval(&target_desc)
449
+ elsif target_desc.is_a?(Symbol)
450
+ target_class = _invokeMethod(target_desc)
451
+ else
452
+ target_class = target_desc
453
+ end
454
+ @current_object = old_object
455
+ result = target_class.new
456
+ @env_out << result if @env_out
457
+ result
458
+ end
459
+
460
+ def _invokeMethod(m) # :nodoc:
461
+ raise StandardError.new("Method not found: #{m}") unless self.class._methods[m.to_s]
462
+ instance_eval(&self.class._methods[m.to_s])
463
+ end
464
+
465
+ def _attributesFromHash(obj, hash) # :nodoc:
466
+ hash.delete(:class)
467
+ hash.each_pair{|k,v|
468
+ obj.send("#{k}=", v)
469
+ }
470
+ obj
471
+ end
472
+
473
+ end
474
+
475
+ end