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
@@ -1,20 +0,0 @@
1
- require 'tempfile'
2
-
3
- class Puppet::FileSystem::Tempfile
4
-
5
- # Variation of Tempfile.open which ensures that the tempfile is closed and
6
- # unlinked before returning
7
- #
8
- # @param identifier [String] additional part of generated pathname
9
- # @yieldparam file [File] the temporary file object
10
- # @return result of the passed block
11
- # @api private
12
- def self.open(identifier)
13
- file = ::Tempfile.new(identifier)
14
-
15
- yield file
16
-
17
- ensure
18
- file.close!
19
- end
20
- end
@@ -1,119 +0,0 @@
1
- require 'puppet/pops'
2
-
3
- module Puppet; module Parser; end; end;
4
- # Adapts an egrammar/eparser to respond to the public API of the classic parser
5
- #
6
- class Puppet::Parser::EParserAdapter
7
-
8
- def initialize(classic_parser)
9
- @classic_parser = classic_parser
10
- @file = ''
11
- @string = ''
12
- @use = :undefined
13
- end
14
-
15
- def file=(file)
16
- @classic_parser.file = file
17
- @file = file
18
- @use = :file
19
- end
20
-
21
- def parse(string = nil)
22
- if @file =~ /\.rb$/
23
- return parse_ruby_file
24
- else
25
- self.string= string if string
26
- parser = Puppet::Pops::Parser::Parser.new()
27
- parse_result = if @use == :string
28
- parser.parse_string(@string)
29
- else
30
- parser.parse_file(@file)
31
- end
32
- # Compute the source_file to set in created AST objects (it was either given, or it may be unknown
33
- # if caller did not set a file and the present a string.
34
- #
35
- source_file = @file || "unknown-source-location"
36
-
37
- # Validate
38
- validate(parse_result)
39
- # Transform the result, but only if not nil
40
- parse_result = Puppet::Pops::Model::AstTransformer.new(source_file, @classic_parser).transform(parse_result) if parse_result
41
- if parse_result && !parse_result.is_a?(Puppet::Parser::AST::BlockExpression)
42
- # Need to transform again, if result is not wrapped in something iterable when handed off to
43
- # a new Hostclass as its code.
44
- parse_result = Puppet::Parser::AST::BlockExpression.new(:children => [parse_result]) if parse_result
45
- end
46
- end
47
-
48
- Puppet::Parser::AST::Hostclass.new('', :code => parse_result)
49
- end
50
-
51
- def validate(parse_result)
52
- # TODO: This is too many hoops to jump through... ugly API
53
- # could reference a ValidatorFactory.validator_3_1(acceptor) instead.
54
- # and let the factory abstract the rest.
55
- #
56
- return unless parse_result
57
-
58
- acceptor = Puppet::Pops::Validation::Acceptor.new
59
- validator = Puppet::Pops::Validation::ValidatorFactory_3_1.new().validator(acceptor)
60
- validator.validate(parse_result)
61
-
62
- max_errors = Puppet[:max_errors]
63
- max_warnings = Puppet[:max_warnings] + 1
64
- max_deprecations = Puppet[:max_deprecations] + 1
65
-
66
- # If there are warnings output them
67
- warnings = acceptor.warnings
68
- if warnings.size > 0
69
- formatter = Puppet::Pops::Validation::DiagnosticFormatterPuppetStyle.new
70
- emitted_w = 0
71
- emitted_dw = 0
72
- acceptor.warnings.each {|w|
73
- if w.severity == :deprecation
74
- # Do *not* call Puppet.deprecation_warning it is for internal deprecation, not
75
- # deprecation of constructs in manifests! (It is not designed for that purpose even if
76
- # used throughout the code base).
77
- #
78
- Puppet.warning(formatter.format(w)) if emitted_dw < max_deprecations
79
- emitted_dw += 1
80
- else
81
- Puppet.warning(formatter.format(w)) if emitted_w < max_warnings
82
- emitted_w += 1
83
- end
84
- break if emitted_w > max_warnings && emitted_dw > max_deprecations # but only then
85
- }
86
- end
87
-
88
- # If there were errors, report the first found. Use a puppet style formatter.
89
- errors = acceptor.errors
90
- if errors.size > 0
91
- formatter = Puppet::Pops::Validation::DiagnosticFormatterPuppetStyle.new
92
- if errors.size == 1 || max_errors <= 1
93
- # raise immediately
94
- raise Puppet::ParseError.new(formatter.format(errors[0]))
95
- end
96
- emitted = 0
97
- errors.each do |e|
98
- Puppet.err(formatter.format(e))
99
- emitted += 1
100
- break if emitted >= max_errors
101
- end
102
- warnings_message = warnings.size > 0 ? ", and #{warnings.size} warnings" : ""
103
- giving_up_message = "Found #{errors.size} errors#{warnings_message}. Giving up"
104
- exception = Puppet::ParseError.new(giving_up_message)
105
- exception.file = errors[0].file
106
- raise exception
107
- end
108
- end
109
-
110
- def string=(string)
111
- @classic_parser.string = string
112
- @string = string
113
- @use = :string
114
- end
115
-
116
- def parse_ruby_file
117
- @classic_parser.parse
118
- end
119
- end
@@ -1,15 +0,0 @@
1
- Puppet::Parser::Functions::newfunction(
2
- :collect,
3
- :type => :rvalue,
4
- :arity => 2,
5
- :doc => <<-'ENDHEREDOC') do |args|
6
- The 'collect' function has been renamed to 'map'. Please update your manifests.
7
-
8
- The collect function is reserved for future use.
9
- - Removed as of 3.4
10
- - requires `parser = future`.
11
- ENDHEREDOC
12
-
13
- raise NotImplementedError,
14
- "The 'collect' function has been renamed to 'map'. Please update your manifests."
15
- end
@@ -1,15 +0,0 @@
1
- Puppet::Parser::Functions::newfunction(
2
- :select,
3
- :type => :rvalue,
4
- :arity => 2,
5
- :doc => <<-'ENDHEREDOC') do |args|
6
- The 'select' function has been renamed to 'filter'. Please update your manifests.
7
-
8
- The select function is reserved for future use.
9
- - Removed as of 3.4
10
- - requires `parser = future`.
11
- ENDHEREDOC
12
-
13
- raise NotImplementedError,
14
- "The 'select' function has been renamed to 'filter'. Please update your manifests."
15
- end
@@ -1,109 +0,0 @@
1
- # The RubyLegacyFunctionInstantiator loads a 3x function and turns it into a 4x function
2
- # that is called with 3x semantics (values are transformed to be 3x compliant).
3
- #
4
- # The code is loaded from a string obtained by reading the 3x function ruby code into a string
5
- # and then passing it to the loaders class method `create`. When Puppet[:biff] == true, the
6
- # 3x Puppet::Parser::Function.newfunction method relays back to this function loader's
7
- # class method legacy_newfunction which creates a Puppet::Functions class wrapping the
8
- # 3x function's block into a method in a function class derived from Puppet::Function.
9
- # This class is then returned, and the Legacy loader continues the same way as it does
10
- # for a 4x function.
11
- #
12
- # TODO: Wrapping of Scope
13
- # The 3x function expects itself to be Scope. It passes itself as scope to other parts of the runtime,
14
- # it expects to find all sorts of information in itself, get/set variables, get compiler, get environment
15
- # etc.
16
- # TODO: Transformation of arguments to 3x compliant objects
17
- #
18
- class Puppet::Pops::Loader::RubyLegacyFunctionInstantiator
19
-
20
- # Produces an instance of the Function class with the given typed_name, or fails with an error if the
21
- # given ruby source does not produce this instance when evaluated.
22
- #
23
- # @param loader [Puppet::Pops::Loader::Loader] The loader the function is associated with
24
- # @param typed_name [Puppet::Pops::Loader::TypedName] the type / name of the function to load
25
- # @param source_ref [URI, String] a reference to the source / origin of the ruby code to evaluate
26
- # @param ruby_code_string [String] ruby code in a string
27
- #
28
- # @return [Puppet::Pops::Functions.Function] - an instantiated function with global scope closure associated with the given loader
29
- #
30
- def self.create(loader, typed_name, source_ref, ruby_code_string)
31
- # Old Ruby API supports calling a method via ::
32
- # this must also be checked as well as call with '.'
33
- #
34
- unless ruby_code_string.is_a?(String) && ruby_code_string =~ /Puppet\:\:Parser\:\:Functions(?:\.|\:\:)newfunction/
35
- raise ArgumentError, "The code loaded from #{source_ref} does not seem to be a Puppet 3x API function - no newfunction call."
36
- end
37
-
38
- # The evaluation of the 3x function creation source should result in a call to the legacy_newfunction
39
- #
40
- created = eval(ruby_code_string)
41
- unless created.is_a?(Class)
42
- raise ArgumentError, "The code loaded from #{source_ref} did not produce a Function class when evaluated. Got '#{created.class}'"
43
- end
44
- unless created.name.to_s == typed_name.name()
45
- raise ArgumentError, "The code loaded from #{source_ref} produced mis-matched name, expected '#{typed_name.name}', got #{created.name}"
46
- end
47
- # create the function instance - it needs closure (scope), and loader (i.e. where it should start searching for things
48
- # when calling functions etc.
49
- # It should be bound to global scope
50
-
51
- # TODO: Cheating wrt. scope - assuming it is found in the context
52
- closure_scope = Puppet.lookup(:global_scope) { {} }
53
- created.new(closure_scope, loader)
54
- end
55
-
56
- # This is a new implementation of the method that is used in 3x to create a function.
57
- # The arguments are the same as those passed to Puppet::Parser::Functions.newfunction, hence its
58
- # deviation from regular method naming practice.
59
- #
60
- def self.legacy_newfunction(name, options, &block)
61
-
62
- # 3x api allows arity to be specified, if unspecified it is 0 or more arguments
63
- # arity >= 0, is an exact count
64
- # airty < 0 is the number of required arguments -1 (i.e. -1 is 0 or more)
65
- # (there is no upper cap, there is no support for optional values, or defaults)
66
- #
67
- arity = options[:arity] || -1
68
- if arity >= 0
69
- min_arg_count = arity
70
- max_arg_count = arity
71
- else
72
- min_arg_count = (arity + 1).abs
73
- # infinity
74
- max_arg_count = :default
75
- end
76
-
77
- # Create a 4x function wrapper around the 3x Function
78
- created_function_class = Puppet::Functions.create_function(name) do
79
- # define a method on the new Function class with the same name as the function, but
80
- # padded with __ because the function may represent a ruby method with the same name that
81
- # expects to have inherited from Kernel, and then Object.
82
- # (This can otherwise lead to infinite recursion, or that an ArgumentError is raised).
83
- #
84
- __name__ = :"__#{name}__"
85
- define_method(__name__, &block)
86
-
87
- # Define the method that is called from dispatch - this method just changes a call
88
- # with multiple unknown arguments to passing all in an array (since this is expected in the 3x API).
89
- # We want the call to be checked for type and number of arguments so cannot call the function
90
- # defined by the block directly since it is defined to take a single argument.
91
- #
92
- define_method(:__relay__call__) do |*args|
93
- # dup the args since the function may destroy them
94
- # TODO: Should convert arguments to 3x, now :undef is send to the function
95
- send(__name__, args.dup)
96
- end
97
-
98
- # Define a dispatch that performs argument type/count checking
99
- #
100
- dispatch :__relay__call__ do
101
- # Use Puppet Type Object (not Optional[Object] since the 3x API passes undef as empty string).
102
- param 'Object', 'args'
103
- # Specify arg count (transformed from 3x function arity specification).
104
- arg_count(min_arg_count, max_arg_count)
105
- end
106
- end
107
- created_function_class
108
- end
109
- end
@@ -1,753 +0,0 @@
1
- # the scanner/lexer
2
-
3
- require 'forwardable'
4
- require 'strscan'
5
- require 'puppet'
6
- require 'puppet/util/methodhelper'
7
-
8
- module Puppet
9
- class LexError < RuntimeError; end
10
- end
11
-
12
- class Puppet::Pops::Parser::Lexer
13
- extend Forwardable
14
-
15
- attr_reader :file, :lexing_context, :token_queue
16
-
17
- attr_reader :locator
18
-
19
- attr_accessor :indefine
20
- alias :indefine? :indefine
21
-
22
- def lex_error msg
23
- raise Puppet::LexError.new(msg)
24
- end
25
-
26
- class Token
27
- ALWAYS_ACCEPTABLE = Proc.new { |context| true }
28
-
29
- include Puppet::Util::MethodHelper
30
-
31
- attr_accessor :regex, :name, :string, :skip, :skip_text
32
- alias skip? skip
33
-
34
- # @overload initialize(string)
35
- # @param string [String] a literal string token matcher
36
- # @param name [String] the token name (what it is known as in the grammar)
37
- # @param options [Hash] see {#set_options}
38
- # @overload initialize(regex)
39
- # @param regex [Regexp] a regular expression token text matcher
40
- # @param name [String] the token name (what it is known as in the grammar)
41
- # @param options [Hash] see {#set_options}
42
- #
43
- def initialize(string_or_regex, name, options = {})
44
- if string_or_regex.is_a?(String)
45
- @name, @string = name, string_or_regex
46
- @regex = Regexp.new(Regexp.escape(string_or_regex))
47
- else
48
- @name, @regex = name, string_or_regex
49
- end
50
-
51
- set_options(options)
52
- @acceptable_when = ALWAYS_ACCEPTABLE
53
- end
54
-
55
- # @return [String] human readable token reference; the String if literal, else the token name
56
- def to_s
57
- string or @name.to_s
58
- end
59
-
60
- # @return [Boolean] if the token is acceptable in the given context or not.
61
- # @param context [Hash] the lexing context
62
- #
63
- def acceptable?(context={})
64
- @acceptable_when.call(context)
65
- end
66
-
67
-
68
- # Defines when the token is able to match.
69
- # This provides context that cannot be expressed otherwise, such as feature flags.
70
- #
71
- # @param block [Proc] a proc that given a context returns a boolean
72
- def acceptable_when(block)
73
- @acceptable_when = block
74
- end
75
- end
76
-
77
- # Maintains a list of tokens.
78
- class TokenList
79
- extend Forwardable
80
-
81
- attr_reader :regex_tokens, :string_tokens
82
- def_delegator :@tokens, :[]
83
- # Adds a new token to the set of recognized tokens
84
- # @param name [String] the token name
85
- # @param regex [Regexp, String] source text token matcher, a litral string or regular expression
86
- # @param options [Hash] see {Token::set_options}
87
- # @param block [Proc] optional block set as the created tokens `convert` method
88
- # @raise [ArgumentError] if the token with the given name is already defined
89
- #
90
- def add_token(name, regex, options = {}, &block)
91
- raise(ArgumentError, "Token #{name} already exists") if @tokens.include?(name)
92
- token = Token.new(regex, name, options)
93
- @tokens[token.name] = token
94
- if token.string
95
- @string_tokens << token
96
- @tokens_by_string[token.string] = token
97
- else
98
- @regex_tokens << token
99
- end
100
-
101
- token.meta_def(:convert, &block) if block_given?
102
-
103
- token
104
- end
105
-
106
- # Creates an empty token list
107
- #
108
- def initialize
109
- @tokens = {}
110
- @regex_tokens = []
111
- @string_tokens = []
112
- @tokens_by_string = {}
113
- end
114
-
115
- # Look up a token by its literal (match) value, rather than name.
116
- # @param string [String, nil] the literal match string to obtain a {Token} for, or nil if it does not exist.
117
- def lookup(string)
118
- @tokens_by_string[string]
119
- end
120
-
121
- # Adds tokens from a hash where key is a matcher (literal string or regexp) and the
122
- # value is the token's name
123
- # @param hash [Hash<{String => Symbol}, Hash<{Regexp => Symbol}] map token text matcher to token name
124
- # @return [void]
125
- #
126
- def add_tokens(hash)
127
- hash.each do |regex, name|
128
- add_token(name, regex)
129
- end
130
- end
131
-
132
- # Sort literal (string-) tokens by length, so we know once we match, we're done.
133
- # This helps avoid the O(n^2) nature of token matching.
134
- # The tokens are sorted in place.
135
- # @return [void]
136
- def sort_tokens
137
- @string_tokens.sort! { |a, b| b.string.length <=> a.string.length }
138
- end
139
-
140
- # Yield each token name and value in turn.
141
- def each
142
- @tokens.each {|name, value| yield name, value }
143
- end
144
- end
145
-
146
- TOKENS = TokenList.new
147
- TOKENS.add_tokens(
148
- '[' => :LBRACK,
149
- ']' => :RBRACK,
150
- # '{' => :LBRACE, # Specialized to handle lambda and brace count
151
- # '}' => :RBRACE, # Specialized to handle brace count
152
- '(' => :LPAREN,
153
- ')' => :RPAREN,
154
- '=' => :EQUALS,
155
- '+=' => :APPENDS,
156
- '-=' => :DELETES,
157
- '==' => :ISEQUAL,
158
- '>=' => :GREATEREQUAL,
159
- '>' => :GREATERTHAN,
160
- '<' => :LESSTHAN,
161
- '<=' => :LESSEQUAL,
162
- '!=' => :NOTEQUAL,
163
- '!' => :NOT,
164
- ',' => :COMMA,
165
- '.' => :DOT,
166
- ':' => :COLON,
167
- '@' => :AT,
168
- '|' => :PIPE,
169
- '<<|' => :LLCOLLECT,
170
- '|>>' => :RRCOLLECT,
171
- '->' => :IN_EDGE,
172
- '<-' => :OUT_EDGE,
173
- '~>' => :IN_EDGE_SUB,
174
- '<~' => :OUT_EDGE_SUB,
175
- '<|' => :LCOLLECT,
176
- '|>' => :RCOLLECT,
177
- ';' => :SEMIC,
178
- '?' => :QMARK,
179
- '\\' => :BACKSLASH,
180
- '=>' => :FARROW,
181
- '+>' => :PARROW,
182
- '+' => :PLUS,
183
- '-' => :MINUS,
184
- '/' => :DIV,
185
- '*' => :TIMES,
186
- '%' => :MODULO,
187
- '<<' => :LSHIFT,
188
- '>>' => :RSHIFT,
189
- '=~' => :MATCH,
190
- '!~' => :NOMATCH,
191
- %r{((::){0,1}[A-Z][-\w]*)+} => :CLASSREF,
192
- "<string>" => :STRING,
193
- "<dqstring up to first interpolation>" => :DQPRE,
194
- "<dqstring between two interpolations>" => :DQMID,
195
- "<dqstring after final interpolation>" => :DQPOST,
196
- "<boolean>" => :BOOLEAN,
197
- "<select start>" => :SELBRACE # A QMARK followed by '{'
198
- )
199
-
200
- module Contextual
201
- QUOTE_TOKENS = [:DQPRE,:DQMID]
202
- REGEX_INTRODUCING_TOKENS = [:NODE,:LBRACE, :SELBRACE, :RBRACE,:MATCH,:NOMATCH,:COMMA]
203
-
204
- NOT_INSIDE_QUOTES = Proc.new do |context|
205
- !QUOTE_TOKENS.include? context[:after]
206
- end
207
-
208
- INSIDE_QUOTES = Proc.new do |context|
209
- QUOTE_TOKENS.include? context[:after]
210
- end
211
-
212
- IN_REGEX_POSITION = Proc.new do |context|
213
- REGEX_INTRODUCING_TOKENS.include? context[:after]
214
- end
215
-
216
- # DASHED_VARIABLES_ALLOWED = Proc.new do |context|
217
- # Puppet[:allow_variables_with_dashes]
218
- # end
219
- #
220
- # VARIABLE_AND_DASHES_ALLOWED = Proc.new do |context|
221
- # Contextual::DASHED_VARIABLES_ALLOWED.call(context) and TOKENS[:VARIABLE].acceptable?(context)
222
- # end
223
- end
224
-
225
- # Numbers are treated separately from names, so that they may contain dots.
226
- TOKENS.add_token :NUMBER, %r{\b(?:0[xX][0-9A-Fa-f]+|0?\d+(?:\.\d+)?(?:[eE]-?\d+)?)\b} do |lexer, value|
227
- lexer.assert_numeric(value)
228
- [TOKENS[:NAME], value]
229
- end
230
- TOKENS[:NUMBER].acceptable_when Contextual::NOT_INSIDE_QUOTES
231
-
232
- TOKENS.add_token :NAME, %r{((::)?[a-z0-9][-\w]*)(::[a-z0-9][-\w]*)*} do |lexer, value|
233
- # A name starting with a number must be a valid numeric string (not that
234
- # NUMBER token captures those names that do not comply with the name rule.
235
- if value =~ /^[0-9].*$/
236
- lexer.assert_numeric(value)
237
- end
238
-
239
- string_token = self
240
- # we're looking for keywords here
241
- if tmp = KEYWORDS.lookup(value)
242
- string_token = tmp
243
- if [:TRUE, :FALSE].include?(string_token.name)
244
- value = eval(value)
245
- string_token = TOKENS[:BOOLEAN]
246
- end
247
- end
248
- [string_token, value]
249
- end
250
- [:NAME, :CLASSREF].each do |name_token|
251
- TOKENS[name_token].acceptable_when Contextual::NOT_INSIDE_QUOTES
252
- end
253
-
254
- TOKENS.add_token :COMMENT, %r{#.*}, :skip => true do |lexer,value|
255
- # value.sub!(/# ?/,'')
256
- [self, ""]
257
- end
258
-
259
- TOKENS.add_token :MLCOMMENT, %r{/\*(.*?)\*/}m, :skip => true do |lexer, value|
260
- # value.sub!(/^\/\* ?/,'')
261
- # value.sub!(/ ?\*\/$/,'')
262
- [self, ""]
263
- end
264
-
265
- TOKENS.add_token :REGEX, %r{/[^/\n]*/} do |lexer, value|
266
- # Make sure we haven't matched an escaped /
267
- while value[-2..-2] == '\\'
268
- other = lexer.scan_until(%r{/})
269
- value += other
270
- end
271
- regex = value.sub(%r{\A/}, "").sub(%r{/\Z}, '').gsub("\\/", "/")
272
- [self, Regexp.new(regex)]
273
- end
274
- TOKENS[:REGEX].acceptable_when Contextual::IN_REGEX_POSITION
275
-
276
- TOKENS.add_token :RETURN, "\n", :skip => true, :skip_text => true
277
-
278
- TOKENS.add_token :SQUOTE, "'" do |lexer, value|
279
- [TOKENS[:STRING], lexer.slurpstring(value,["'"],:ignore_invalid_escapes).first ]
280
- end
281
-
282
- DQ_initial_token_types = {'$' => :DQPRE,'"' => :STRING}
283
- DQ_continuation_token_types = {'$' => :DQMID,'"' => :DQPOST}
284
-
285
- TOKENS.add_token :DQUOTE, /"/ do |lexer, value|
286
- lexer.tokenize_interpolated_string(DQ_initial_token_types)
287
- end
288
-
289
-
290
- # LBRACE needs look ahead to differentiate between '{' and a '{'
291
- # followed by a '|' (start of lambda) The racc grammar can only do one
292
- # token lookahead.
293
- #
294
- TOKENS.add_token :LBRACE, "{" do |lexer, value|
295
- lexer.lexing_context[:brace_count] += 1
296
- if lexer.lexing_context[:after] == :QMARK
297
- [TOKENS[:SELBRACE], value]
298
- else
299
- [TOKENS[:LBRACE], value]
300
- end
301
- end
302
-
303
- # RBRACE needs to differentiate between a regular brace that is part of
304
- # syntax and one that is the ending of a string interpolation.
305
- TOKENS.add_token :RBRACE, "}" do |lexer, value|
306
- context = lexer.lexing_context
307
- if context[:interpolation_stack].empty? || context[:brace_count] != context[:interpolation_stack][-1]
308
- context[:brace_count] -= 1
309
- [TOKENS[:RBRACE], value]
310
- else
311
- lexer.tokenize_interpolated_string(DQ_continuation_token_types)
312
- end
313
- end
314
-
315
- TOKENS.add_token :DOLLAR_VAR, %r{\$(::)?(\w+::)*\w+} do |lexer, value|
316
- [TOKENS[:VARIABLE],value[1..-1]]
317
- end
318
-
319
- TOKENS.add_token :VARIABLE, %r{(::)?(\w+::)*\w+} do |lexer, value|
320
- # If the varname (following $, or ${ is followed by (, it is a function call, and not a variable
321
- # reference.
322
- #
323
- if lexer.match?(%r{[ \t\r]*\(})
324
- # followed by ( is a function call
325
- [TOKENS[:NAME], value]
326
-
327
- elsif kwd_token = KEYWORDS.lookup(value)
328
- # true, false, if, unless, case, and undef are keywords that cannot be used as variables
329
- # but node, and several others are variables
330
- if [ :TRUE, :FALSE ].include?(kwd_token.name)
331
- [ TOKENS[:BOOLEAN], eval(value) ]
332
- elsif [ :IF, :UNLESS, :CASE, :UNDEF ].include?(kwd_token.name)
333
- [kwd_token, value]
334
- else
335
- [TOKENS[:VARIABLE], value]
336
- end
337
- else
338
- [TOKENS[:VARIABLE], value]
339
- end
340
-
341
- end
342
- TOKENS[:VARIABLE].acceptable_when Contextual::INSIDE_QUOTES
343
-
344
- TOKENS.sort_tokens
345
-
346
- @@pairs = {
347
- "{" => "}",
348
- "(" => ")",
349
- "[" => "]",
350
- "<|" => "|>",
351
- "<<|" => "|>>",
352
- "|" => "|"
353
- }
354
-
355
- KEYWORDS = TokenList.new
356
- KEYWORDS.add_tokens(
357
- "case" => :CASE,
358
- "class" => :CLASS,
359
- "default" => :DEFAULT,
360
- "define" => :DEFINE,
361
- # "import" => :IMPORT,
362
- "if" => :IF,
363
- "elsif" => :ELSIF,
364
- "else" => :ELSE,
365
- "inherits" => :INHERITS,
366
- "node" => :NODE,
367
- "and" => :AND,
368
- "or" => :OR,
369
- "undef" => :UNDEF,
370
- "false" => :FALSE,
371
- "true" => :TRUE,
372
- "in" => :IN,
373
- "unless" => :UNLESS
374
- )
375
-
376
- def clear
377
- initvars
378
- end
379
-
380
- def expected
381
- return nil if @expected.empty?
382
- name = @expected[-1]
383
- TOKENS.lookup(name) or lex_error "Internal Lexer Error: Could not find expected token #{name}"
384
- end
385
-
386
- # scan the whole file
387
- # basically just used for testing
388
- def fullscan
389
- array = []
390
-
391
- self.scan { |token, str|
392
- # Ignore any definition nesting problems
393
- @indefine = false
394
- array.push([token,str])
395
- }
396
- array
397
- end
398
-
399
- def file=(file)
400
- @file = file
401
- contents = Puppet::FileSystem.exist?(file) ? Puppet::FileSystem.read(file) : ""
402
- @scanner = StringScanner.new(contents.freeze)
403
- @locator = Puppet::Pops::Parser::Locator.locator(contents, file)
404
- end
405
-
406
- def_delegator :@token_queue, :shift, :shift_token
407
-
408
- def find_string_token
409
- # We know our longest string token is three chars, so try each size in turn
410
- # until we either match or run out of chars. This way our worst-case is three
411
- # tries, where it is otherwise the number of string token we have. Also,
412
- # the lookups are optimized hash lookups, instead of regex scans.
413
- #
414
- _scn = @scanner
415
- s = _scn.peek(3)
416
- token = TOKENS.lookup(s[0,3]) || TOKENS.lookup(s[0,2]) || TOKENS.lookup(s[0,1])
417
- unless token
418
- return [nil, nil]
419
- end
420
- [ token, _scn.scan(token.regex) ]
421
- end
422
-
423
- # Find the next token that matches a regex. We look for these first.
424
- def find_regex_token
425
- best_token = nil
426
- best_length = 0
427
-
428
- # I tried optimizing based on the first char, but it had
429
- # a slightly negative affect and was a good bit more complicated.
430
- _lxc = @lexing_context
431
- _scn = @scanner
432
- TOKENS.regex_tokens.each do |token|
433
- if length = _scn.match?(token.regex) and token.acceptable?(_lxc)
434
- # We've found a longer match
435
- if length > best_length
436
- best_length = length
437
- best_token = token
438
- end
439
- end
440
- end
441
-
442
- return best_token, _scn.scan(best_token.regex) if best_token
443
- end
444
-
445
- # Find the next token, returning the string and the token.
446
- def find_token
447
- shift_token || find_regex_token || find_string_token
448
- end
449
-
450
- MULTIBYTE = Puppet::Pops::Parser::Locator::MULTIBYTE
451
- SKIPPATTERN = MULTIBYTE ? %r{[[:blank:]\r]+} : %r{[ \t\r]+}
452
-
453
- def initialize
454
- initvars
455
- end
456
-
457
- def assert_numeric(value)
458
- if value =~ /^0[xX].*$/
459
- lex_error (positioned_message("Not a valid hex number #{value}")) unless value =~ /^0[xX][0-9A-Fa-f]+$/
460
- elsif value =~ /^0[^.].*$/
461
- lex_error(positioned_message("Not a valid octal number #{value}")) unless value =~ /^0[0-7]+$/
462
- else
463
- lex_error(positioned_message("Not a valid decimal number #{value}")) unless value =~ /0?\d+(?:\.\d+)?(?:[eE]-?\d+)?/
464
- end
465
- end
466
-
467
- def initvars
468
- @previous_token = nil
469
- @scanner = nil
470
- @file = nil
471
-
472
- # AAARRGGGG! okay, regexes in ruby are bloody annoying
473
- # no one else has "\n" =~ /\s/
474
-
475
- @namestack = []
476
- @token_queue = []
477
- @indefine = false
478
- @expected = []
479
- @lexing_context = {
480
- :after => nil,
481
- :start_of_line => true,
482
- :offset => 0, # byte offset before where token starts
483
- :end_offset => 0, # byte offset after scanned token
484
- :brace_count => 0, # nested depth of braces
485
- :interpolation_stack => [] # matching interpolation brace level
486
- }
487
- end
488
-
489
- # Make any necessary changes to the token and/or value.
490
- def munge_token(token, value)
491
- # A token may already have been munged (converted and positioned)
492
- #
493
- return token, value if value.is_a? Hash
494
-
495
- @scanner.skip(SKIPPATTERN) if token.skip_text
496
-
497
- return if token.skip
498
-
499
- token, value = token.convert(self, value) if token.respond_to?(:convert)
500
-
501
- return unless token
502
-
503
- return if token.skip
504
-
505
- # If the conversion performed the munging/positioning
506
- return token, value if value.is_a? Hash
507
-
508
- return token, positioned_value(value)
509
- end
510
-
511
- # Returns a hash with the current position in source based on the current lexing context
512
- #
513
- def positioned_value(value)
514
- {
515
- :value => value,
516
- :locator => @locator,
517
- :offset => @lexing_context[:offset],
518
- :end_offset => @lexing_context[:end_offset]
519
- }
520
- end
521
-
522
- def pos
523
- @locator.pos_on_line(@lexing_context[:offset])
524
- end
525
-
526
- # Handling the namespace stack
527
- def_delegator :@namestack, :pop, :namepop
528
-
529
- # This value might have :: in it, but we don't care -- it'll be handled
530
- # normally when joining, and when popping we want to pop this full value,
531
- # however long the namespace is.
532
- def_delegator :@namestack, :<<, :namestack
533
-
534
- # Collect the current namespace.
535
- def namespace
536
- @namestack.join("::")
537
- end
538
-
539
- def_delegator :@scanner, :rest
540
-
541
- LBRACE_CHAR = '{'
542
-
543
- # this is the heart of the lexer
544
- def scan
545
- _scn = @scanner
546
- #Puppet.debug("entering scan")
547
- lex_error "Internal Error: No string or file given to lexer to process." unless _scn
548
-
549
- # Skip any initial whitespace.
550
- _scn.skip(SKIPPATTERN)
551
- _lbrace = '{'.freeze # faster to compare against a frozen string in
552
-
553
- until token_queue.empty? and _scn.eos? do
554
- offset = _scn.pos
555
- matched_token, value = find_token
556
- end_offset = _scn.pos
557
-
558
- # error out if we didn't match anything at all
559
- lex_error "Could not match #{_scn.rest[/^(\S+|\s+|.*)/]}" unless matched_token
560
-
561
- newline = matched_token.name == :RETURN
562
-
563
- _lxc = @lexing_context
564
- _lxc[:start_of_line] = newline
565
- _lxc[:offset] = offset
566
- _lxc[:end_offset] = end_offset
567
-
568
- final_token, token_value = munge_token(matched_token, value)
569
- # update end position since munging may have moved the end offset
570
- _lxc[:end_offset] = _scn.pos
571
-
572
- unless final_token
573
- _scn.skip(SKIPPATTERN)
574
- next
575
- end
576
-
577
- _lxc[:after] = final_token.name unless newline
578
- if final_token.name == :DQPRE
579
- _lxc[:interpolation_stack] << _lxc[:brace_count]
580
- elsif final_token.name == :DQPOST
581
- _lxc[:interpolation_stack].pop
582
- end
583
-
584
- value = token_value[:value]
585
-
586
- _expected = @expected
587
- if match = @@pairs[value] and final_token.name != :DQUOTE and final_token.name != :SQUOTE
588
- _expected << match
589
- elsif exp = _expected[-1] and exp == value and final_token.name != :DQUOTE and final_token.name != :SQUOTE
590
- _expected.pop
591
- end
592
-
593
- yield [final_token.name, token_value]
594
-
595
- _prv = @previous_token
596
- if _prv
597
- namestack(value) if _prv.name == :CLASS and value != LBRACE_CHAR
598
-
599
- # TODO: Lexer has no business dealing with this - it is semantic
600
- if _prv.name == :DEFINE
601
- if indefine?
602
- msg = "Cannot nest definition #{value} inside #{@indefine}"
603
- self.indefine = false
604
- raise Puppet::ParseError, msg
605
- end
606
-
607
- @indefine = value
608
- end
609
- end
610
- @previous_token = final_token
611
- _scn.skip(SKIPPATTERN)
612
- end
613
- # Cannot reset @scanner to nil here - it is needed to answer questions about context after
614
- # completed parsing.
615
- # Seems meaningless to do this. Everything will be gc anyway.
616
- #@scanner = nil
617
-
618
- # This indicates that we're done parsing.
619
- yield [false,false]
620
- end
621
-
622
- def match? r
623
- @scanner.match?(r)
624
- end
625
-
626
- # Provide some limited access to the scanner, for those
627
- # tokens that need it.
628
- def_delegator :@scanner, :scan_until
629
-
630
- # we've encountered the start of a string...
631
- # slurp in the rest of the string and return it
632
- def slurpstring(terminators,escapes=%w{ \\ $ ' " r n t s }+["\n"],ignore_invalid_escapes=false)
633
- # we search for the next quote that isn't preceded by a
634
- # backslash; the caret is there to match empty strings
635
- last = @scanner.matched
636
- str = @scanner.scan_until(/([^\\]|^|[^\\])([\\]{2})*[#{terminators}]/) || lex_error(positioned_message("Unclosed quote after #{format_quote(last)} followed by '#{followed_by}'"))
637
- str.gsub!(/\\(.)/m) {
638
- ch = $1
639
- if escapes.include? ch
640
- case ch
641
- when 'r'; "\r"
642
- when 'n'; "\n"
643
- when 't'; "\t"
644
- when 's'; " "
645
- when "\n"; ''
646
- else ch
647
- end
648
- else
649
- Puppet.warning(positioned_message("Unrecognized escape sequence '\\#{ch}'")) unless ignore_invalid_escapes
650
- "\\#{ch}"
651
- end
652
- }
653
- [ str[0..-2],str[-1,1] ]
654
- end
655
-
656
- # Formats given message by appending file, line and position if available.
657
- def positioned_message msg
658
- result = [msg]
659
- result << "in file #{file}" if file
660
- result << "at line #{line}:#{pos}" if line
661
- result.join(" ")
662
- end
663
-
664
- # Returns "<eof>" if at end of input, else the following 5 characters with \n \r \t escaped
665
- def followed_by
666
- return "<eof>" if @scanner.eos?
667
- result = @scanner.rest[0,5] + "..."
668
- result.gsub!("\t", '\t')
669
- result.gsub!("\n", '\n')
670
- result.gsub!("\r", '\r')
671
- result
672
- end
673
-
674
- def format_quote q
675
- if q == "'"
676
- '"\'"'
677
- else
678
- "'#{q}'"
679
- end
680
- end
681
-
682
- def tokenize_interpolated_string(token_type,preamble='')
683
- # Expecting a (possibly empty) stretch of text terminated by end of string ", a variable $, or expression ${
684
- # The length of this part includes the start and terminating characters.
685
- value,terminator = slurpstring('"$')
686
-
687
- # Advanced after '{' if this is in expression ${} interpolation
688
- braced = terminator == '$' && @scanner.scan(/\{/)
689
- # make offset to end_ofset be the length of the pre expression string including its start and terminating chars
690
- lxc = @lexing_context
691
- lxc[:end_offset] = @scanner.pos
692
-
693
- token_queue << [TOKENS[token_type[terminator]],positioned_value(preamble+value)]
694
- variable_regex = if Puppet[:allow_variables_with_dashes]
695
- TOKENS[:VARIABLE_WITH_DASH].regex
696
- else
697
- TOKENS[:VARIABLE].regex
698
- end
699
- if terminator != '$' or braced
700
- return token_queue.shift
701
- end
702
-
703
- tmp_offset = @scanner.pos
704
- if var_name = @scanner.scan(variable_regex)
705
- lxc[:offset] = tmp_offset
706
- lxc[:end_offset] = @scanner.pos
707
- warn_if_variable_has_hyphen(var_name)
708
- # If the varname after ${ is followed by (, it is a function call, and not a variable
709
- # reference.
710
- #
711
- if braced && @scanner.match?(%r{[ \t\r]*\(})
712
- token_queue << [TOKENS[:NAME], positioned_value(var_name)]
713
- else
714
- token_queue << [TOKENS[:VARIABLE],positioned_value(var_name)]
715
- end
716
- lxc[:offset] = @scanner.pos
717
- tokenize_interpolated_string(DQ_continuation_token_types)
718
- else
719
- tokenize_interpolated_string(token_type, replace_false_start_with_text(terminator))
720
- end
721
- end
722
-
723
- def replace_false_start_with_text(appendix)
724
- last_token = token_queue.pop
725
- value = last_token.last
726
- if value.is_a? Hash
727
- value[:value] + appendix
728
- else
729
- value + appendix
730
- end
731
- end
732
-
733
- # just parse a string, not a whole file
734
- def string=(string, path='')
735
- @scanner = StringScanner.new(string.freeze)
736
- @locator = Puppet::Pops::Parser::Locator.locator(string, path)
737
- end
738
-
739
- def warn_if_variable_has_hyphen(var_name)
740
- if var_name.include?('-')
741
- Puppet.deprecation_warning("Using `-` in variable names is deprecated at #{file || '<string>'}:#{line}. See http://links.puppetlabs.com/puppet-hyphenated-variable-deprecation")
742
- end
743
- end
744
-
745
- # Returns the line number (starting from 1) for the current position
746
- # in the scanned text (at the end of the last produced, but not necessarily
747
- # consumed.
748
- #
749
- def line
750
- return 1 unless @lexing_context && locator
751
- locator.line_for_offset(@lexing_context[:end_offset])
752
- end
753
- end