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
@@ -41,7 +41,7 @@ class Puppet::Pops::Evaluator::CallableSignature
41
41
  # or Optional[Variant[Callable, ...]]. The Variant type is used when multiple signatures are acceptable.
42
42
  # The Optional type is used when the block is optional.
43
43
  #
44
- # @return [Puppet::Pops::Types::PAbstractType, nil] the expected type of a block given as the last parameter in a call.
44
+ # @return [Puppet::Pops::Types::PAnyType, nil] the expected type of a block given as the last parameter in a call.
45
45
  #
46
46
  # @api public
47
47
  #
@@ -97,5 +97,4 @@ class Puppet::Pops::Evaluator::CallableSignature
97
97
  def infinity?(x)
98
98
  x == Puppet::Pops::Types::INFINITY
99
99
  end
100
-
101
100
  end
@@ -30,46 +30,88 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
30
30
  # compatible with 3x AST::Lambda
31
31
  # @api public
32
32
  def call(scope, *args)
33
- @evaluator.call(self, args, @enclosing_scope)
33
+ variable_bindings = combine_values_with_parameters(args)
34
+
35
+ tc = Puppet::Pops::Types::TypeCalculator
36
+ final_args = tc.infer_set(parameters.inject([]) do |final_args, param|
37
+ if param.captures_rest
38
+ final_args.concat(variable_bindings[param.name])
39
+ else
40
+ final_args << variable_bindings[param.name]
41
+ end
42
+ end)
43
+
44
+ if tc.callable?(type, final_args)
45
+ @evaluator.evaluate_block_with_bindings(@enclosing_scope, variable_bindings, @model.body)
46
+ else
47
+ raise ArgumentError, "lambda called with mis-matched arguments\n#{Puppet::Pops::Evaluator::CallableMismatchDescriber.diff_string('lambda', final_args, [self])}"
48
+ end
34
49
  end
35
50
 
36
51
  # Call closure with argument assignment by name
37
- def call_by_name(scope, args_hash, spill_over = false)
38
- @evaluator.call_by_name(self, args_hash, @enclosing_scope, spill_over)
52
+ def call_by_name(scope, args_hash, enforce_parameters)
53
+ if enforce_parameters
54
+ if args_hash.size > parameters.size
55
+ raise ArgumentError, "Too many arguments: #{args_hash.size} for #{parameters.size}"
56
+ end
57
+
58
+ # associate values with parameters
59
+ scope_hash = {}
60
+ parameters.each do |p|
61
+ name = p.name
62
+ if (arg_value = args_hash[name]).nil?
63
+ # only set result of default expr if it is defined (it is otherwise not possible to differentiate
64
+ # between explicit undef and no default expression
65
+ unless p.value.nil?
66
+ scope_hash[name] = @evaluator.evaluate(p.value, @enclosing_scope)
67
+ end
68
+ else
69
+ scope_hash[name] = arg_value
70
+ end
71
+ end
72
+
73
+ missing = parameters.select { |p| !scope_hash.include?(p.name) }
74
+ if missing.any?
75
+ raise ArgumentError, "Too few arguments; no value given for required parameters #{missing.collect(&:name).join(" ,")}"
76
+ end
77
+
78
+ tc = Puppet::Pops::Types::TypeCalculator
79
+ final_args = tc.infer_set(parameter_names.collect { |param| scope_hash[param] })
80
+ if !tc.callable?(type, final_args)
81
+ raise ArgumentError, "lambda called with mis-matched arguments\n#{Puppet::Pops::Evaluator::CallableMismatchDescriber.diff_string('lambda', final_args, [self])}"
82
+ end
83
+ else
84
+ scope_hash = args_hash
85
+ end
86
+
87
+ @evaluator.evaluate_block_with_bindings(@enclosing_scope, scope_hash, @model.body)
39
88
  end
40
89
 
41
- # incompatible with 3x except that it is an array of the same size
42
- def parameters()
43
- @model.parameters || []
90
+ def parameters
91
+ @model.parameters
44
92
  end
45
93
 
46
94
  # Returns the number of parameters (required and optional)
47
95
  # @return [Integer] the total number of accepted parameters
48
96
  def parameter_count
49
97
  # yes, this is duplication of code, but it saves a method call
50
- (@model.parameters || []).size
51
- end
52
-
53
- # Returns the number of optional parameters.
54
- # @return [Integer] the number of optional accepted parameters
55
- def optional_parameter_count
56
- @model.parameters.count { |p| !p.value.nil? }
98
+ @model.parameters.size
57
99
  end
58
100
 
59
101
  # @api public
60
102
  def parameter_names
61
- @model.parameters.collect {|p| p.name }
103
+ @model.parameters.collect(&:name)
62
104
  end
63
105
 
64
106
  # @api public
65
107
  def type
66
- @callable || create_callable_type
108
+ @callable ||= create_callable_type
67
109
  end
68
110
 
69
111
  # @api public
70
112
  def last_captures_rest?
71
- # TODO: No support for this yet
72
- false
113
+ last = @model.parameters[-1]
114
+ last && last.captures_rest
73
115
  end
74
116
 
75
117
  # @api public
@@ -80,28 +122,99 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
80
122
 
81
123
  private
82
124
 
125
+ def combine_values_with_parameters(args)
126
+ variable_bindings = {}
127
+
128
+ parameters.each_with_index do |parameter, index|
129
+ param_captures = parameter.captures_rest
130
+ default_expression = parameter.value
131
+
132
+ if index >= args.size
133
+ if default_expression
134
+ # not given, has default
135
+ value = @evaluator.evaluate(default_expression, @enclosing_scope)
136
+ if param_captures && !value.is_a?(Array)
137
+ # correct non array default value
138
+ value = [value]
139
+ end
140
+ else
141
+ # not given, does not have default
142
+ if param_captures
143
+ # default for captures rest is an empty array
144
+ value = []
145
+ else
146
+ @evaluator.fail(Puppet::Pops::Issues::MISSING_REQUIRED_PARAMETER, parameter, { :param_name => parameter.name })
147
+ end
148
+ end
149
+ else
150
+ given_argument = args[index]
151
+ if param_captures
152
+ # get excess arguments
153
+ value = args[(parameter_count-1)..-1]
154
+ # If the input was a single nil, or undef, and there is a default, use the default
155
+ # This supports :undef in case it was used in a 3x data structure and it is passed as an arg
156
+ #
157
+ if value.size == 1 && (given_argument.nil? || given_argument == :undef) && default_expression
158
+ value = @evaluator.evaluate(default_expression, scope)
159
+ # and ensure it is an array
160
+ value = [value] unless value.is_a?(Array)
161
+ end
162
+ else
163
+ value = given_argument
164
+ end
165
+ end
166
+
167
+ variable_bindings[parameter.name] = value
168
+ end
169
+
170
+ variable_bindings
171
+ end
172
+
83
173
  def create_callable_type()
84
- t = Puppet::Pops::Types::PCallableType.new()
85
- tuple_t = Puppet::Pops::Types::PTupleType.new()
86
- # since closure lambdas are currently untyped, each parameter becomes Optional[Object]
87
- parameter_names.each do |name|
88
- # TODO: Change when Closure supports typed parameters
89
- tuple_t.addTypes(Puppet::Pops::Types::TypeFactory.optional_object())
174
+ types = []
175
+ range = [0, 0]
176
+ in_optional_parameters = false
177
+ parameters.each do |param|
178
+ type = if param.type_expr
179
+ @evaluator.evaluate(param.type_expr, @enclosing_scope)
180
+ else
181
+ Puppet::Pops::Types::TypeFactory.any()
182
+ end
183
+
184
+ if param.captures_rest && type.is_a?(Puppet::Pops::Types::PArrayType)
185
+ # An array on a slurp parameter is how a size range is defined for a
186
+ # slurp (Array[Integer, 1, 3] *$param). However, the callable that is
187
+ # created can't have the array in that position or else type checking
188
+ # will require the parameters to be arrays, which isn't what is
189
+ # intended. The array type contains the intended information and needs
190
+ # to be unpacked.
191
+ param_range = type.size_range
192
+ type = type.element_type
193
+ elsif param.captures_rest && !type.is_a?(Puppet::Pops::Types::PArrayType)
194
+ param_range = ANY_NUMBER_RANGE
195
+ elsif param.value
196
+ param_range = OPTIONAL_SINGLE_RANGE
197
+ else
198
+ param_range = REQUIRED_SINGLE_RANGE
199
+ end
200
+
201
+ types << type
202
+
203
+ if param_range[0] == 0
204
+ in_optional_parameters = true
205
+ elsif param_range[0] != 0 && in_optional_parameters
206
+ @evaluator.fail(Puppet::Pops::Issues::REQUIRED_PARAMETER_AFTER_OPTIONAL, param, { :param_name => param.name })
207
+ end
208
+
209
+ range[0] += param_range[0]
210
+ range[1] += param_range[1]
90
211
  end
91
212
 
92
- # TODO: A Lambda can not currently declare varargs
93
- to = parameter_count
94
- from = to - optional_parameter_count
95
- if from != to
96
- size_t = Puppet::Pops::Types::PIntegerType.new()
97
- size_t.from = size
98
- size_t.to = size
99
- tuple_t.size_type = size_t
213
+ if range[1] == Puppet::Pops::Types::INFINITY
214
+ range[1] = :default
100
215
  end
101
- t.param_types = tuple_t
102
- # TODO: A Lambda can not currently declare that it accepts a lambda, except as an explicit parameter
103
- # being a Callable
104
- t
216
+
217
+ Puppet::Pops::Types::TypeFactory.callable(*(types + range))
105
218
  end
106
219
 
107
220
  # Produces information about parameters compatible with a 4x Function (which can have multiple signatures)
@@ -109,4 +222,7 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
109
222
  [ self ]
110
223
  end
111
224
 
225
+ ANY_NUMBER_RANGE = [0, Puppet::Pops::Types::INFINITY]
226
+ OPTIONAL_SINGLE_RANGE = [0, 1]
227
+ REQUIRED_SINGLE_RANGE = [1, 1]
112
228
  end
@@ -9,10 +9,15 @@
9
9
  class Puppet::Pops::Evaluator::CompareOperator
10
10
  include Puppet::Pops::Utils
11
11
 
12
+ # Provides access to the Puppet 3.x runtime (scope, etc.)
13
+ # This separation has been made to make it easier to later migrate the evaluator to an improved runtime.
14
+ #
15
+ include Puppet::Pops::Evaluator::Runtime3Support
16
+
12
17
  def initialize
13
18
  @@equals_visitor ||= Puppet::Pops::Visitor.new(self, "equals", 1, 1)
14
19
  @@compare_visitor ||= Puppet::Pops::Visitor.new(self, "cmp", 1, 1)
15
- @@include_visitor ||= Puppet::Pops::Visitor.new(self, "include", 1, 1)
20
+ @@include_visitor ||= Puppet::Pops::Visitor.new(self, "include", 2, 2)
16
21
  @type_calculator = Puppet::Pops::Types::TypeCalculator.new()
17
22
  end
18
23
 
@@ -27,8 +32,8 @@ class Puppet::Pops::Evaluator::CompareOperator
27
32
  end
28
33
 
29
34
  # Answers is b included in a
30
- def include?(a, b)
31
- @@include_visitor.visit_this_1(self, a, b)
35
+ def include?(a, b, scope)
36
+ @@include_visitor.visit_this_2(self, a, b, scope)
32
37
  end
33
38
 
34
39
  protected
@@ -110,50 +115,49 @@ class Puppet::Pops::Evaluator::CompareOperator
110
115
  end
111
116
 
112
117
  def equals_NilClass(a, b)
118
+ # :undef supported in case it is passed from a 3x data structure
113
119
  b.nil? || b == :undef
114
120
  end
115
121
 
116
122
  def equals_Symbol(a, b)
123
+ # :undef supported in case it is passed from a 3x data structure
117
124
  a == b || a == :undef && b.nil?
118
125
  end
119
126
 
120
- def include_Object(a, b)
127
+ def include_Object(a, b, scope)
121
128
  false
122
129
  end
123
130
 
124
- def include_String(a, b)
131
+ def include_String(a, b, scope)
125
132
  case b
126
133
  when String
127
134
  # subsstring search downcased
128
135
  a.downcase.include?(b.downcase)
129
136
  when Regexp
130
- # match (convert to boolean)
131
- !!(a =~ b)
137
+ matched = a.match(b) # nil, or MatchData
138
+ set_match_data(matched, scope) # creates ephemeral
139
+ !!matched # match (convert to boolean)
132
140
  when Numeric
133
141
  # convert string to number, true if ==
134
142
  equals(a, b)
135
- when Puppet::Pops::Types::PStringType
136
- # is there a string in a string? (yes, each char is a string, and an empty string contains an empty string)
137
- true
138
143
  else
139
- if b == Puppet::Pops::Types::PDataType || b == Puppet::Pops::Types::PObjectType
140
- # A String is Data and Object (but not of all subtypes of those types).
141
- true
142
- else
143
- false
144
- end
144
+ false
145
145
  end
146
146
  end
147
147
 
148
- def include_Array(a, b)
148
+ def include_Array(a, b, scope)
149
149
  case b
150
150
  when Regexp
151
+ matched = nil
151
152
  a.each do |element|
152
153
  next unless element.is_a? String
153
- return true if element =~ b
154
+ matched = element.match(b) # nil, or MatchData
155
+ break if matched
154
156
  end
155
- return false
156
- when Puppet::Pops::Types::PAbstractType
157
+ # Always set match data, a "not found" should not keep old match data visible
158
+ set_match_data(matched, scope) # creates ephemeral
159
+ return !!matched
160
+ when Puppet::Pops::Types::PAnyType
157
161
  a.each {|element| return true if @type_calculator.instance?(b, element) }
158
162
  return false
159
163
  else
@@ -162,7 +166,7 @@ class Puppet::Pops::Evaluator::CompareOperator
162
166
  end
163
167
  end
164
168
 
165
- def include_Hash(a, b)
166
- include?(a.keys, b)
169
+ def include_Hash(a, b, scope)
170
+ include?(a.keys, b, scope)
167
171
  end
168
172
  end
@@ -3,14 +3,14 @@
3
3
  class Puppet::Pops::Evaluator::EppEvaluator
4
4
 
5
5
  def self.inline_epp(scope, epp_source, template_args = nil)
6
- unless epp_source.is_a? String
6
+ unless epp_source.is_a?(String)
7
7
  raise ArgumentError, "inline_epp(): the first argument must be a String with the epp source text, got a #{epp_source.class}"
8
8
  end
9
9
 
10
10
  # Parse and validate the source
11
11
  parser = Puppet::Pops::Parser::EvaluatingParser::EvaluatingEppParser.new
12
12
  begin
13
- result = parser.parse_string(epp_source, 'inlined-epp-text')
13
+ result = parser.parse_string(epp_source, 'inlined-epp-text')
14
14
  rescue Puppet::ParseError => e
15
15
  raise ArgumentError, "inline_epp(): Invalid EPP: #{e.message}"
16
16
  end
@@ -20,7 +20,7 @@ class Puppet::Pops::Evaluator::EppEvaluator
20
20
  end
21
21
 
22
22
  def self.epp(scope, file, env_name, template_args = nil)
23
- unless file.is_a? String
23
+ unless file.is_a?(String)
24
24
  raise ArgumentError, "epp(): the first argument must be a String with the filename, got a #{file.class}"
25
25
  end
26
26
 
@@ -34,7 +34,7 @@ class Puppet::Pops::Evaluator::EppEvaluator
34
34
  # Parse and validate the source
35
35
  parser = Puppet::Pops::Parser::EvaluatingParser::EvaluatingEppParser.new
36
36
  begin
37
- result = parser.parse_file(template_file)
37
+ result = parser.parse_file(template_file)
38
38
  rescue Puppet::ParseError => e
39
39
  raise ArgumentError, "epp(): Invalid EPP: #{e.message}"
40
40
  end
@@ -59,18 +59,19 @@ class Puppet::Pops::Evaluator::EppEvaluator
59
59
  raise ArgumentError, "#{func_name}(): The EPP template contains illegal expressions (definitions)"
60
60
  end
61
61
 
62
- see_scope = body.body.see_scope
63
- if see_scope && !template_args_set
64
- # no epp params and no arguments were given => inline_epp logic sees all local variables, epp all global
65
- closure_scope = use_global_scope_only ? scope.find_global_scope : scope
66
- spill_over = false
67
- else
68
- # no epp params or user provided arguments in a hash, epp logic only sees global + what was given
62
+ parameters_specified = body.body.parameters_specified
63
+ if parameters_specified || template_args_set
64
+ # no epp params or user provided arguments in a hash, epp() logic
65
+ # only sees global + what was given
69
66
  closure_scope = scope.find_global_scope
70
- # given spill over if there are no params (e.g. replace closure scope by a new scope with the given args)
71
- spill_over = see_scope
67
+ enforce_parameters = parameters_specified
68
+ else
69
+ # no epp params and no arguments were given => inline_epp() logic
70
+ # sees all local variables, epp() all global
71
+ closure_scope = use_global_scope_only ? scope.find_global_scope : scope
72
+ enforce_parameters = true
72
73
  end
73
- evaluated_result = parser.closure(body, closure_scope).call_by_name(scope, template_args, spill_over)
74
+ evaluated_result = parser.closure(body, closure_scope).call_by_name(scope, template_args, enforce_parameters)
74
75
  evaluated_result
75
76
  end
76
77
 
@@ -84,4 +85,4 @@ class Puppet::Pops::Evaluator::EppEvaluator
84
85
  [template_args, true]
85
86
  end
86
87
  end
87
- end
88
+ end
@@ -34,6 +34,8 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
34
34
  # Refactor when support is dropped for Ruby 1.8.7.
35
35
  #
36
36
  INFINITY = 1.0 / 0.0
37
+ EMPTY_STRING = ''.freeze
38
+ COMMA_SEPARATOR = ', '.freeze
37
39
 
38
40
  # Reference to Issues name space makes it easier to refer to issues
39
41
  # (Issues are shared with the validator).
@@ -41,7 +43,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
41
43
  Issues = Puppet::Pops::Issues
42
44
 
43
45
  def initialize
44
- @@eval_visitor ||= Puppet::Pops::Visitor.new(self, "eval", 1, 1)
46
+ @@eval_visitor ||= Puppet::Pops::Visitor.new(self, "eval", 1, 1)
45
47
  @@lvalue_visitor ||= Puppet::Pops::Visitor.new(self, "lvalue", 1, 1)
46
48
  @@assign_visitor ||= Puppet::Pops::Visitor.new(self, "assign", 3, 3)
47
49
  @@string_visitor ||= Puppet::Pops::Visitor.new(self, "string", 1, 1)
@@ -61,23 +63,14 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
61
63
  @@type_calculator
62
64
  end
63
65
 
64
- # Polymorphic evaluate - calls eval_TYPE
66
+ # Evaluates the given _target_ object in the given scope.
65
67
  #
66
- # ## Polymorphic evaluate
67
- # Polymorphic evaluate calls a method on the format eval_TYPE where classname is the last
68
- # part of the class of the given _target_. A search is performed starting with the actual class, continuing
69
- # with each of the _target_ class's super classes until a matching method is found.
70
- #
71
- # # Description
72
- # Evaluates the given _target_ object in the given scope, optionally passing a block which will be
73
- # called with the result of the evaluation.
74
- #
75
- # @overload evaluate(target, scope, {|result| block})
68
+ # @overload evaluate(target, scope)
76
69
  # @param target [Object] evaluation target - see methods on the pattern assign_TYPE for actual supported types.
77
70
  # @param scope [Object] the runtime specific scope class where evaluation should take place
78
71
  # @return [Object] the result of the evaluation
79
72
  #
80
- # @api
73
+ # @api public
81
74
  #
82
75
  def evaluate(target, scope)
83
76
  begin
@@ -96,152 +89,56 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
96
89
  end
97
90
  end
98
91
 
99
- # Polymorphic assign - calls assign_TYPE
100
- #
101
- # ## Polymorphic assign
102
- # Polymorphic assign calls a method on the format assign_TYPE where TYPE is the last
103
- # part of the class of the given _target_. A search is performed starting with the actual class, continuing
104
- # with each of the _target_ class's super classes until a matching method is found.
105
- #
106
- # # Description
107
92
  # Assigns the given _value_ to the given _target_. The additional argument _o_ is the instruction that
108
93
  # produced the target/value tuple and it is used to set the origin of the result.
94
+ #
109
95
  # @param target [Object] assignment target - see methods on the pattern assign_TYPE for actual supported types.
110
96
  # @param value [Object] the value to assign to `target`
111
97
  # @param o [Puppet::Pops::Model::PopsObject] originating instruction
112
98
  # @param scope [Object] the runtime specific scope where evaluation should take place
113
99
  #
114
- # @api
100
+ # @api private
115
101
  #
116
102
  def assign(target, value, o, scope)
117
103
  @@assign_visitor.visit_this_3(self, target, value, o, scope)
118
104
  end
119
105
 
106
+ # Computes a value that can be used as the LHS in an assignment.
107
+ # @param o [Object] the expression to evaluate as a left (assignable) entity
108
+ # @param scope [Object] the runtime specific scope where evaluation should take place
109
+ #
110
+ # @api private
111
+ #
120
112
  def lvalue(o, scope)
121
113
  @@lvalue_visitor.visit_this_1(self, o, scope)
122
114
  end
123
115
 
116
+ # Produces a String representation of the given object _o_ as used in interpolation.
117
+ # @param o [Object] the expression of which a string representation is wanted
118
+ # @param scope [Object] the runtime specific scope where evaluation should take place
119
+ #
120
+ # @api public
121
+ #
124
122
  def string(o, scope)
125
123
  @@string_visitor.visit_this_1(self, o, scope)
126
124
  end
127
125
 
128
- # Call a closure matching arguments by name - Can only be called with a Closure (for now), may be refactored later
129
- # to also handle other types of calls (function calls are also handled by CallNamedFunction and CallMethod, they
130
- # could create similar objects to Closure, wait until other types of defines are instantiated - they may behave
131
- # as special cases of calls - i.e. 'new').
126
+ # Evaluate a BlockExpression in a new scope with variables bound to the
127
+ # given values.
132
128
  #
133
- # Call by name supports a "spill_over" mode where extra arguments in the given args_hash are introduced
134
- # as variables in the resulting scope.
129
+ # @param scope [Puppet::Parser::Scope] the parent scope
130
+ # @param variable_bindings [Hash{String => Object}] the variable names and values to bind (names are keys, bound values are values)
131
+ # @param block [Puppet::Pops::Model::BlockExpression] the sequence of expressions to evaluate in the new scope
135
132
  #
136
- # @raise ArgumentError, if there are to many or too few arguments
137
- # @raise ArgumentError, if given closure is not a Puppet::Pops::Evaluator::Closure
138
- #
139
- def call_by_name(closure, args_hash, scope, spill_over = false)
140
- raise ArgumentError, "Can only call a Lambda" unless closure.is_a?(Puppet::Pops::Evaluator::Closure)
141
- pblock = closure.model
142
- parameters = pblock.parameters || []
143
-
144
- if !spill_over && args_hash.size > parameters.size
145
- raise ArgumentError, "Too many arguments: #{args_hash.size} for #{parameters.size}"
146
- end
147
-
148
- # associate values with parameters
149
- scope_hash = {}
150
- parameters.each do |p|
151
- scope_hash[p.name] = args_hash[p.name] || evaluate(p.value, scope)
152
- end
153
- missing = scope_hash.reduce([]) {|memo, entry| memo << entry[0] if entry[1].nil?; memo }
154
- unless missing.empty?
155
- optional = parameters.count { |p| !p.value.nil? }
156
- raise ArgumentError, "Too few arguments; no value given for required parameters #{missing.join(" ,")}"
157
- end
158
- if spill_over
159
- # all args from given hash should be used, nil entries replaced by default values should win
160
- scope_hash = args_hash.merge(scope_hash)
161
- end
162
-
163
- # Store the evaluated name => value associations in a new inner/local/ephemeral scope
164
- # (This is made complicated due to the fact that the implementation of scope is overloaded with
165
- # functionality and an inner ephemeral scope must be used (as opposed to just pushing a local scope
166
- # on a scope "stack").
167
-
168
- # Ensure variable exists with nil value if error occurs.
169
- # Some ruby implementations does not like creating variable on return
170
- result = nil
171
- begin
172
- scope_memo = get_scope_nesting_level(scope)
173
- # change to create local scope_from - cannot give it file and line - that is the place of the call, not
174
- # "here"
175
- create_local_scope_from(scope_hash, scope)
176
- result = evaluate(pblock.body, scope)
177
- ensure
178
- set_scope_nesting_level(scope, scope_memo)
179
- end
180
- result
181
- end
182
-
183
- # Call a closure - Can only be called with a Closure (for now), may be refactored later
184
- # to also handle other types of calls (function calls are also handled by CallNamedFunction and CallMethod, they
185
- # could create similar objects to Closure, wait until other types of defines are instantiated - they may behave
186
- # as special cases of calls - i.e. 'new')
187
- #
188
- # @raise ArgumentError, if there are to many or too few arguments
189
- # @raise ArgumentError, if given closure is not a Puppet::Pops::Evaluator::Closure
133
+ # @api private
190
134
  #
191
- def call(closure, args, scope)
192
- raise ArgumentError, "Can only call a Lambda" unless closure.is_a?(Puppet::Pops::Evaluator::Closure)
193
- pblock = closure.model
194
- parameters = pblock.parameters || []
195
-
196
- raise ArgumentError, "Too many arguments: #{args.size} for #{parameters.size}" unless args.size <= parameters.size
197
-
198
- # associate values with parameters
199
- merged = parameters.zip(args)
200
- # calculate missing arguments
201
- missing = parameters.slice(args.size, parameters.size - args.size).select {|p| p.value.nil? }
202
- unless missing.empty?
203
- optional = parameters.count { |p| !p.value.nil? }
204
- raise ArgumentError, "Too few arguments; #{args.size} for #{optional > 0 ? ' min ' : ''}#{parameters.size - optional}"
205
- end
206
-
207
- evaluated = merged.collect do |m|
208
- # m can be one of
209
- # m = [Parameter{name => "name", value => nil], "given"]
210
- # | [Parameter{name => "name", value => Expression}, "given"]
211
- #
212
- # "given" is always an optional entry. If a parameter was provided then
213
- # the entry will be in the array, otherwise the m array will be a
214
- # single element.
215
- given_argument = m[1]
216
- argument_name = m[0].name
217
- default_expression = m[0].value
218
-
219
- value = if default_expression
220
- evaluate(default_expression, scope)
221
- else
222
- given_argument
223
- end
224
- [argument_name, value]
225
- end
226
-
227
- # Store the evaluated name => value associations in a new inner/local/ephemeral scope
228
- # (This is made complicated due to the fact that the implementation of scope is overloaded with
229
- # functionality and an inner ephemeral scope must be used (as opposed to just pushing a local scope
230
- # on a scope "stack").
231
-
232
- # Ensure variable exists with nil value if error occurs.
233
- # Some ruby implementations does not like creating variable on return
234
- result = nil
235
- begin
236
- scope_memo = get_scope_nesting_level(scope)
237
- # change to create local scope_from - cannot give it file and line - that is the place of the call, not
238
- # "here"
239
- create_local_scope_from(Hash[evaluated], scope)
240
- result = evaluate(pblock.body, scope)
241
- ensure
242
- set_scope_nesting_level(scope, scope_memo)
135
+ def evaluate_block_with_bindings(scope, variable_bindings, block_expr)
136
+ with_guarded_scope(scope) do
137
+ # change to create local scope_from - cannot give it file and line -
138
+ # that is the place of the call, not "here"
139
+ create_local_scope_from(variable_bindings, scope)
140
+ evaluate(block_expr, scope)
243
141
  end
244
- result
245
142
  end
246
143
 
247
144
  protected
@@ -294,17 +191,12 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
294
191
  o
295
192
  end
296
193
 
297
- # Allows nil to be used as a Nop.
298
- # Evaluates to nil
299
- # TODO: What is the difference between literal undef, nil, and nop?
300
- #
194
+ # Allows nil to be used as a Nop, Evaluates to nil
301
195
  def eval_NilClass(o, scope)
302
196
  nil
303
197
  end
304
198
 
305
199
  # Evaluates Nop to nil.
306
- # TODO: or is this the same as :undef
307
- # TODO: is this even needed as a separate instruction when there is a literal undef?
308
200
  def eval_Nop(o, scope)
309
201
  nil
310
202
  end
@@ -315,12 +207,18 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
315
207
  o.value
316
208
  end
317
209
 
210
+ # Reserved Words fail to evaluate
211
+ #
212
+ def eval_ReservedWord(o, scope)
213
+ fail(Puppet::Pops::Issues::RESERVED_WORD, o, {:word => o.word})
214
+ end
215
+
318
216
  def eval_LiteralDefault(o, scope)
319
217
  :default
320
218
  end
321
219
 
322
220
  def eval_LiteralUndef(o, scope)
323
- :undef # TODO: or just use nil for this?
221
+ nil
324
222
  end
325
223
 
326
224
  # A QualifiedReference (i.e. a capitalized qualified name such as Foo, or Foo::Bar) evaluates to a PType
@@ -337,6 +235,19 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
337
235
  - coerce_numeric(evaluate(o.expr, scope), o, scope)
338
236
  end
339
237
 
238
+ def eval_UnfoldExpression(o, scope)
239
+ candidate = evaluate(o.expr, scope)
240
+ case candidate
241
+ when Array
242
+ candidate
243
+ when Hash
244
+ candidate.to_a
245
+ else
246
+ # turns anything else into an array (so result can be unfolded)
247
+ [candidate]
248
+ end
249
+ end
250
+
340
251
  # Abstract evaluation, returns array [left, right] with the evaluated result of left_expr and
341
252
  # right_expr
342
253
  # @return <Array<Object, Object>> array with result of evaluating left and right expressions
@@ -356,41 +267,8 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
356
267
  name = lvalue(o.left_expr, scope)
357
268
  value = evaluate(o.right_expr, scope)
358
269
 
359
- case o.operator
360
- when :'=' # regular assignment
270
+ if o.operator == :'='
361
271
  assign(name, value, o, scope)
362
-
363
- when :'+='
364
- # if value does not exist and strict is on, looking it up fails, else it is nil or :undef
365
- existing_value = get_variable_value(name, o, scope)
366
- begin
367
- if existing_value.nil? || existing_value == :undef
368
- assign(name, value, o, scope)
369
- else
370
- # Delegate to calculate function to deal with check of LHS, and perform ´+´ as arithmetic or concatenation the
371
- # same way as ArithmeticExpression performs `+`.
372
- assign(name, calculate(existing_value, value, :'+', o.left_expr, o.right_expr, scope), o, scope)
373
- end
374
- rescue ArgumentError => e
375
- fail(Issues::APPEND_FAILED, o, {:message => e.message})
376
- end
377
-
378
- when :'-='
379
- # If an attempt is made to delete values from something that does not exists, the value is :undef (it is guaranteed to not
380
- # include any values the user wants deleted anyway :-)
381
- #
382
- # if value does not exist and strict is on, looking it up fails, else it is nil or :undef
383
- existing_value = get_variable_value(name, o, scope)
384
- begin
385
- if existing_value.nil? || existing_value == :undef
386
- assign(name, :undef, o, scope)
387
- else
388
- # Delegate to delete function to deal with check of LHS, and perform deletion
389
- assign(name, delete(get_variable_value(name, o, scope), value), o, scope)
390
- end
391
- rescue ArgumentError => e
392
- fail(Issues::APPEND_FAILED, o, {:message => e.message}, e)
393
- end
394
272
  else
395
273
  fail(Issues::UNSUPPORTED_OPERATOR, o, {:operator => o.operator})
396
274
  end
@@ -403,7 +281,9 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
403
281
  # Handles binary expression where lhs and rhs are array/hash or numeric and operator is +, - , *, % / << >>
404
282
  #
405
283
  def eval_ArithmeticExpression(o, scope)
406
- left, right = eval_BinaryExpression(o, scope)
284
+ left = evaluate(o.left_expr, scope)
285
+ right = evaluate(o.right_expr, scope)
286
+
407
287
  begin
408
288
  result = calculate(left, right, o.operator, o.left_expr, o.right_expr, scope)
409
289
  rescue ArgumentError => e
@@ -458,7 +338,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
458
338
  def eval_EppExpression(o, scope)
459
339
  scope["@epp"] = []
460
340
  evaluate(o.body, scope)
461
- result = scope["@epp"].join('')
341
+ result = scope["@epp"].join
462
342
  result
463
343
  end
464
344
 
@@ -493,11 +373,12 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
493
373
  # Evaluates <, <=, >, >=, and ==
494
374
  #
495
375
  def eval_ComparisonExpression o, scope
496
- left, right = eval_BinaryExpression o, scope
376
+ left = evaluate(o.left_expr, scope)
377
+ right = evaluate(o.right_expr, scope)
497
378
 
498
379
  begin
499
380
  # Left is a type
500
- if left.is_a?(Puppet::Pops::Types::PAbstractType)
381
+ if left.is_a?(Puppet::Pops::Types::PAnyType)
501
382
  case o.operator
502
383
  when :'=='
503
384
  @@type_calculator.equals(left,right)
@@ -548,7 +429,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
548
429
  end
549
430
 
550
431
  # Evaluates matching expressions with type, string or regexp rhs expression.
551
- # If RHS is a type, the =~ matches compatible (assignable?) type.
432
+ # If RHS is a type, the =~ matches compatible (instance? of) type.
552
433
  #
553
434
  # @example
554
435
  # x =~ /abc.*/
@@ -559,21 +440,22 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
559
440
  # x =~ "${y}.*"
560
441
  # @example
561
442
  # [1,2,3] =~ Array[Integer[1,10]]
443
+ #
444
+ # Note that a string is not instance? of Regexp, only Regular expressions are.
445
+ # The Pattern type should instead be used as it is specified as subtype of String.
446
+ #
562
447
  # @return [Boolean] if a match was made or not. Also sets $0..$n to matchdata in current scope.
563
448
  #
564
449
  def eval_MatchExpression o, scope
565
- left, pattern = eval_BinaryExpression o, scope
450
+ left = evaluate(o.left_expr, scope)
451
+ pattern = evaluate(o.right_expr, scope)
452
+
566
453
  # matches RHS types as instance of for all types except a parameterized Regexp[R]
567
- if pattern.is_a?(Puppet::Pops::Types::PAbstractType)
568
- if pattern.is_a?(Puppet::Pops::Types::PRegexpType) && pattern.pattern
569
- # A qualified PRegexpType, get its ruby regexp
570
- pattern = pattern.regexp
571
- else
572
- # evaluate as instance?
573
- matched = @@type_calculator.instance?(pattern, left)
574
- # convert match result to Boolean true, or false
575
- return o.operator == :'=~' ? !!matched : !matched
576
- end
454
+ if pattern.is_a?(Puppet::Pops::Types::PAnyType)
455
+ # evaluate as instance? of type check
456
+ matched = @@type_calculator.instance?(pattern, left)
457
+ # convert match result to Boolean true, or false
458
+ return o.operator == :'=~' ? !!matched : !matched
577
459
  end
578
460
 
579
461
  begin
@@ -586,7 +468,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
586
468
  end
587
469
 
588
470
  matched = pattern.match(left) # nil, or MatchData
589
- set_match_data(matched, o, scope) # creates ephemeral
471
+ set_match_data(matched,scope) # creates ephemeral
590
472
 
591
473
  # convert match result to Boolean true, or false
592
474
  o.operator == :'=~' ? !!matched : !matched
@@ -595,8 +477,9 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
595
477
  # Evaluates Puppet DSL `in` expression
596
478
  #
597
479
  def eval_InExpression o, scope
598
- left, right = eval_BinaryExpression o, scope
599
- @@compare_operator.include?(right, left)
480
+ left = evaluate(o.left_expr, scope)
481
+ right = evaluate(o.right_expr, scope)
482
+ @@compare_operator.include?(right, left, scope)
600
483
  end
601
484
 
602
485
  # @example
@@ -616,19 +499,19 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
616
499
  end
617
500
 
618
501
  # Evaluates each entry of the literal list and creates a new Array
502
+ # Supports unfolding of entries
619
503
  # @return [Array] with the evaluated content
620
504
  #
621
505
  def eval_LiteralList o, scope
622
- o.values.collect {|expr| evaluate(expr, scope)}
506
+ unfold([], o.values, scope)
623
507
  end
624
508
 
625
509
  # Evaluates each entry of the literal hash and creates a new Hash.
626
510
  # @return [Hash] with the evaluated content
627
511
  #
628
512
  def eval_LiteralHash o, scope
629
- h = Hash.new
630
- o.entries.each {|entry| h[ evaluate(entry.key, scope)]= evaluate(entry.value, scope)}
631
- h
513
+ # optimized
514
+ o.entries.reduce({}) {|h,entry| h[evaluate(entry.key, scope)] = evaluate(entry.value, scope); h }
632
515
  end
633
516
 
634
517
  # Evaluates all statements and produces the last evaluated value
@@ -656,8 +539,17 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
656
539
  if o.options.find do |co|
657
540
  # the first case option that matches
658
541
  if co.values.find do |c|
659
- the_default = co.then_expr if c.is_a? Puppet::Pops::Model::LiteralDefault
660
- is_match?(test, evaluate(c, scope), c, scope)
542
+ case c
543
+ when Puppet::Pops::Model::LiteralDefault
544
+ the_default = co.then_expr
545
+ is_match?(test, evaluate(c, scope), c, scope)
546
+ when Puppet::Pops::Model::UnfoldExpression
547
+ # not ideal for error reporting, since it is not known which unfolded result
548
+ # that caused an error - the entire unfold expression is blamed (i.e. the var c, passed to is_match?)
549
+ evaluate(c, scope).any? {|v| is_match?(test, v, c, scope) }
550
+ else
551
+ is_match?(test, evaluate(c, scope), c, scope)
552
+ end
661
553
  end
662
554
  result = evaluate(co.then_expr, scope)
663
555
  true # the option was picked
@@ -712,16 +604,123 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
712
604
  evaluate(o.body, scope)
713
605
  end
714
606
 
715
- # Produces Array[PObjectType], an array of resource references
607
+ # Produces Array[PAnyType], an array of resource references
716
608
  #
717
609
  def eval_ResourceExpression(o, scope)
718
610
  exported = o.exported
719
611
  virtual = o.virtual
720
- type_name = evaluate(o.type_name, scope)
721
- o.bodies.map do |body|
722
- titles = [evaluate(body.title, scope)].flatten
723
- evaluated_parameters = body.operations.map {|op| evaluate(op, scope) }
724
- create_resources(o, scope, virtual, exported, type_name, titles, evaluated_parameters)
612
+
613
+ # Get the type name
614
+ type_name =
615
+ if (tmp_name = o.type_name).is_a?(Puppet::Pops::Model::QualifiedName)
616
+ tmp_name.value # already validated as a name
617
+ else
618
+ type_name_acceptable =
619
+ case o.type_name
620
+ when Puppet::Pops::Model::QualifiedReference
621
+ true
622
+ when Puppet::Pops::Model::AccessExpression
623
+ o.type_name.left_expr.is_a?(Puppet::Pops::Model::QualifiedReference)
624
+ end
625
+
626
+ evaluated_name = evaluate(tmp_name, scope)
627
+ unless type_name_acceptable
628
+ actual = type_calculator.generalize!(type_calculator.infer(evaluated_name)).to_s
629
+ fail(Puppet::Pops::Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, {:actual => actual})
630
+ end
631
+
632
+ # must be a CatalogEntry subtype
633
+ case evaluated_name
634
+ when Puppet::Pops::Types::PHostClassType
635
+ unless evaluated_name.class_name.nil?
636
+ fail(Puppet::Pops::Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, {:actual=> evaluated_name.to_s})
637
+ end
638
+ 'class'
639
+
640
+ when Puppet::Pops::Types::PResourceType
641
+ unless evaluated_name.title().nil?
642
+ fail(Puppet::Pops::Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, {:actual=> evaluated_name.to_s})
643
+ end
644
+ evaluated_name.type_name # assume validated
645
+
646
+ else
647
+ actual = type_calculator.generalize!(type_calculator.infer(evaluated_name)).to_s
648
+ fail(Puppet::Pops::Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, {:actual=>actual})
649
+ end
650
+ end
651
+
652
+ # This is a runtime check - the model is valid, but will have runtime issues when evaluated
653
+ # and storeconfigs is not set.
654
+ if(o.exported)
655
+ optionally_fail(Puppet::Pops::Issues::RT_NO_STORECONFIGS_EXPORT, o);
656
+ end
657
+
658
+ titles_to_body = {}
659
+ body_to_titles = {}
660
+ body_to_params = {}
661
+
662
+ # titles are evaluated before attribute operations
663
+ o.bodies.map do | body |
664
+ titles = evaluate(body.title, scope)
665
+
666
+ # Title may not be nil
667
+ # Titles may be given as an array, it is ok if it is empty, but not if it contains nil entries
668
+ # Titles may not be an empty String
669
+ # Titles must be unique in the same resource expression
670
+ # There may be a :default entry, its entries apply with lower precedence
671
+ #
672
+ if titles.nil?
673
+ fail(Puppet::Pops::Issues::MISSING_TITLE, body.title)
674
+ end
675
+ titles = [titles].flatten
676
+
677
+ # Check types of evaluated titles and duplicate entries
678
+ titles.each_with_index do |title, index|
679
+ if title.nil?
680
+ fail(Puppet::Pops::Issues::MISSING_TITLE_AT, body.title, {:index => index})
681
+
682
+ elsif !title.is_a?(String) && title != :default
683
+ actual = type_calculator.generalize!(type_calculator.infer(title)).to_s
684
+ fail(Puppet::Pops::Issues::ILLEGAL_TITLE_TYPE_AT, body.title, {:index => index, :actual => actual})
685
+
686
+ elsif title == EMPTY_STRING
687
+ fail(Puppet::Pops::Issues::EMPTY_STRING_TITLE_AT, body.title, {:index => index})
688
+
689
+ elsif titles_to_body[title]
690
+ fail(Puppet::Pops::Issues::DUPLICATE_TITLE, o, {:title => title})
691
+ end
692
+ titles_to_body[title] = body
693
+ end
694
+
695
+ # Do not create a real instance from the :default case
696
+ titles.delete(:default)
697
+
698
+ body_to_titles[body] = titles
699
+
700
+ # Store evaluated parameters in a hash associated with the body, but do not yet create resource
701
+ # since the entry containing :defaults may appear later
702
+ body_to_params[body] = body.operations.reduce({}) do |param_memo, op|
703
+ params = evaluate(op, scope)
704
+ params = [params] unless params.is_a?(Array)
705
+ params.each do |p|
706
+ if param_memo.include? p.name
707
+ fail(Puppet::Pops::Issues::DUPLICATE_ATTRIBUTE, o, {:attribute => p.name})
708
+ end
709
+ param_memo[p.name] = p
710
+ end
711
+ param_memo
712
+ end
713
+ end
714
+
715
+ # Titles and Operations have now been evaluated and resources can be created
716
+ # Each production is a PResource, and an array of all is produced as the result of
717
+ # evaluating the ResourceExpression.
718
+ #
719
+ defaults_hash = body_to_params[titles_to_body[:default]] || {}
720
+ o.bodies.map do | body |
721
+ titles = body_to_titles[body]
722
+ params = defaults_hash.merge(body_to_params[body] || {})
723
+ create_resources(o, scope, virtual, exported, type_name, titles, params.values)
725
724
  end.flatten.compact
726
725
  end
727
726
 
@@ -732,19 +731,35 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
732
731
  evaluated_resources
733
732
  end
734
733
 
735
- # Produces 3x array of parameters
734
+ # Produces 3x parameter
736
735
  def eval_AttributeOperation(o, scope)
737
736
  create_resource_parameter(o, scope, o.attribute_name, evaluate(o.value_expr, scope), o.operator)
738
737
  end
739
738
 
739
+ def eval_AttributesOperation(o, scope)
740
+ hashed_params = evaluate(o.expr, scope)
741
+ unless hashed_params.is_a?(Hash)
742
+ actual = type_calculator.generalize!(type_calculator.infer(hashed_params)).to_s
743
+ fail(Puppet::Pops::Issues::TYPE_MISMATCH, o.expr, {:expected => 'Hash', :actual => actual})
744
+ end
745
+ hashed_params.map { |k,v| create_resource_parameter(o, scope, k, v, :'=>') }
746
+ end
747
+
740
748
  # Sets default parameter values for a type, produces the type
741
749
  #
742
750
  def eval_ResourceDefaultsExpression(o, scope)
743
- type_name = o.type_ref.value # a QualifiedName's string value
751
+ type = evaluate(o.type_ref, scope)
752
+ type_name =
753
+ if type.is_a?(Puppet::Pops::Types::PResourceType) && !type.type_name.nil? && type.title.nil?
754
+ type.type_name # assume it is a valid name
755
+ else
756
+ actual = type_calculator.generalize!(type_calculator.infer(type))
757
+ fail(Issues::ILLEGAL_RESOURCE_TYPE, o.type_ref, {:actual => actual})
758
+ end
744
759
  evaluated_parameters = o.operations.map {|op| evaluate(op, scope) }
745
760
  create_resource_defaults(o, scope, type_name, evaluated_parameters)
746
761
  # Produce the type
747
- evaluate(o.type_ref, scope)
762
+ type
748
763
  end
749
764
 
750
765
  # Evaluates function call by name.
@@ -762,7 +777,9 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
762
777
  fail(Issues::ILLEGAL_EXPRESSION, o.functor_expr, {:feature=>'function name', :container => o})
763
778
  end
764
779
  name = o.functor_expr.value
765
- evaluated_arguments = o.arguments.collect {|arg| evaluate(arg, scope) }
780
+
781
+ evaluated_arguments = unfold([], o.arguments, scope)
782
+
766
783
  # wrap lambda in a callable block if it is present
767
784
  evaluated_arguments << Puppet::Pops::Evaluator::Closure.new(self, o.lambda, scope) if o.lambda
768
785
  call_function(name, evaluated_arguments, o, scope)
@@ -780,7 +797,10 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
780
797
  fail(Issues::ILLEGAL_EXPRESSION, o.functor_expr, {:feature=>'function name', :container => o})
781
798
  end
782
799
  name = name.value # the string function name
783
- evaluated_arguments = [receiver] + (o.arguments || []).collect {|arg| evaluate(arg, scope) }
800
+
801
+ evaluated_arguments = unfold([receiver], o.arguments || [], scope)
802
+
803
+ # wrap lambda in a callable block if it is present
784
804
  evaluated_arguments << Puppet::Pops::Evaluator::Closure.new(self, o.lambda, scope) if o.lambda
785
805
  call_function(name, evaluated_arguments, o, scope)
786
806
  end
@@ -794,14 +814,27 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
794
814
  #
795
815
  with_guarded_scope(scope) do
796
816
  test = evaluate(o.left_expr, scope)
817
+ the_default = nil
797
818
  selected = o.selectors.find do |s|
798
- candidate = evaluate(s.matching_expr, scope)
799
- candidate == :default || is_match?(test, candidate, s.matching_expr, scope)
819
+ me = s.matching_expr
820
+ case me
821
+ when Puppet::Pops::Model::LiteralDefault
822
+ the_default = s.value_expr
823
+ false
824
+ when Puppet::Pops::Model::UnfoldExpression
825
+ # not ideal for error reporting, since it is not known which unfolded result
826
+ # that caused an error - the entire unfold expression is blamed (i.e. the var c, passed to is_match?)
827
+ evaluate(me, scope).any? {|v| is_match?(test, v, me, scope) }
828
+ else
829
+ is_match?(test, evaluate(me, scope), me, scope)
830
+ end
800
831
  end
801
832
  if selected
802
833
  evaluate(selected.value_expr, scope)
834
+ elsif the_default
835
+ evaluate(the_default, scope)
803
836
  else
804
- nil
837
+ fail(Issues::UNMATCHED_SELECTOR, o.left_expr, :param_value => test)
805
838
  end
806
839
  end
807
840
  end
@@ -851,15 +884,13 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
851
884
  name = evaluate(o.expr, scope)
852
885
 
853
886
  # Should be caught by validation, but make this explicit here as well, or mysterious evaluation issues
854
- # may occur.
887
+ # may occur for some evaluation use cases.
855
888
  case name
856
889
  when String
857
890
  when Numeric
858
891
  else
859
892
  fail(Issues::ILLEGAL_VARIABLE_EXPRESSION, o.expr)
860
893
  end
861
- # TODO: Check for valid variable name (Task for validator)
862
- # TODO: semantics of undefined variable in scope, this just returns what scope does == value or nil
863
894
  get_variable_value(name, o, scope)
864
895
  end
865
896
 
@@ -882,7 +913,6 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
882
913
  #
883
914
  def eval_TextExpression o, scope
884
915
  if o.expr.is_a?(Puppet::Pops::Model::QualifiedName)
885
- # TODO: formalize, when scope returns nil, vs error
886
916
  string(get_variable_value(o.expr.value, o, scope), scope)
887
917
  else
888
918
  string(evaluate(o.expr, scope), scope)
@@ -894,27 +924,26 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
894
924
  end
895
925
 
896
926
  def string_Symbol(o, scope)
897
- case o
898
- when :undef
899
- ''
927
+ if :undef == o # optimized comparison 1.44 vs 1.95
928
+ EMPTY_STRING
900
929
  else
901
930
  o.to_s
902
931
  end
903
932
  end
904
933
 
905
- def string_Array(o, scope)
906
- ['[', o.map {|e| string(e, scope)}.join(', '), ']'].join()
934
+ def string_Array(o, scope)
935
+ "[#{o.map {|e| string(e, scope)}.join(COMMA_SEPARATOR)}]"
907
936
  end
908
937
 
909
938
  def string_Hash(o, scope)
910
- ['{', o.map {|k,v| string(k, scope) + " => " + string(v, scope)}.join(', '), '}'].join()
939
+ "{#{o.map {|k,v| "#{string(k, scope)} => #{string(v, scope)}"}.join(COMMA_SEPARATOR)}}"
911
940
  end
912
941
 
913
942
  def string_Regexp(o, scope)
914
- ['/', o.source, '/'].join()
943
+ "/#{o.source}/"
915
944
  end
916
945
 
917
- def string_PAbstractType(o, scope)
946
+ def string_PAnyType(o, scope)
918
947
  @@type_calculator.string(o)
919
948
  end
920
949
 
@@ -1041,9 +1070,9 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
1041
1070
  if right.is_a?(Regexp)
1042
1071
  return false unless left.is_a? String
1043
1072
  matched = right.match(left)
1044
- set_match_data(matched, o, scope) # creates or clears ephemeral
1073
+ set_match_data(matched, scope) # creates or clears ephemeral
1045
1074
  !!matched # convert to boolean
1046
- elsif right.is_a?(Puppet::Pops::Types::PAbstractType)
1075
+ elsif right.is_a?(Puppet::Pops::Types::PAnyType)
1047
1076
  # right is a type and left is not - check if left is an instance of the given type
1048
1077
  # (The reverse is not terribly meaningful - computing which of the case options that first produces
1049
1078
  # an instance of a given type).
@@ -1064,4 +1093,23 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
1064
1093
  end
1065
1094
  end
1066
1095
 
1096
+ # Maps the expression in the given array to their product except for UnfoldExpressions which are first unfolded.
1097
+ # The result is added to the given result Array.
1098
+ # @param result [Array] Where to add the result (may contain information to add to)
1099
+ # @param array [Array[Puppet::Pops::Model::Expression] the expressions to map
1100
+ # @param scope [Puppet::Parser::Scope] the scope to evaluate in
1101
+ # @return [Array] the given result array with content added from the operation
1102
+ #
1103
+ def unfold(result, array, scope)
1104
+ array.each do |x|
1105
+ if x.is_a?(Puppet::Pops::Model::UnfoldExpression)
1106
+ result.concat(evaluate(x, scope))
1107
+ else
1108
+ result << evaluate(x, scope)
1109
+ end
1110
+ end
1111
+ result
1112
+ end
1113
+ private :unfold
1114
+
1067
1115
  end