puppet 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. checksums.yaml +7 -0
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +6 -6
  4. data/LICENSE +1 -1
  5. data/README.md +8 -9
  6. data/conf/auth.conf +2 -2
  7. data/ext/README.environment +1 -1
  8. data/ext/build_defaults.yaml +1 -1
  9. data/ext/debian/README.source +1 -1
  10. data/ext/debian/control +1 -1
  11. data/ext/debian/copyright +4 -4
  12. data/ext/debian/puppetmaster.README.debian +11 -9
  13. data/ext/emacs/puppet-mode.el +1 -1
  14. data/ext/envpuppet +2 -2
  15. data/ext/ips/puppetagent.xml +1 -1
  16. data/ext/ips/puppetmaster.xml +1 -1
  17. data/ext/project_data.yaml +8 -0
  18. data/ext/puppet-test +3 -3
  19. data/ext/rack/example-passenger-vhost.conf +1 -1
  20. data/ext/redhat/puppet.spec.erb +2 -2
  21. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  22. data/ext/solaris/pkginfo +1 -1
  23. data/ext/solaris/smf/puppet.xml +1 -1
  24. data/ext/suse/puppet.spec +2 -2
  25. data/ext/upload_facts.rb +1 -1
  26. data/ext/windows/puppet_interactive.bat +6 -0
  27. data/ext/windows/puppet_shell.bat +9 -0
  28. data/ext/windows/run_puppet_interactive.bat +9 -0
  29. data/ext/yaml_nodes.rb +1 -1
  30. data/install.rb +30 -20
  31. data/lib/hiera/scope.rb +1 -1
  32. data/lib/puppet/agent.rb +1 -1
  33. data/lib/puppet/application/agent.rb +4 -2
  34. data/lib/puppet/application/apply.rb +7 -4
  35. data/lib/puppet/application/cert.rb +1 -1
  36. data/lib/puppet/application/device.rb +1 -1
  37. data/lib/puppet/application/filebucket.rb +1 -1
  38. data/lib/puppet/application/inspect.rb +1 -1
  39. data/lib/puppet/application/lookup.rb +45 -47
  40. data/lib/puppet/application/master.rb +2 -2
  41. data/lib/puppet/application/resource.rb +1 -1
  42. data/lib/puppet/configurer.rb +100 -22
  43. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  44. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  45. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  46. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  47. data/lib/puppet/data_providers/lookup_adapter.rb +73 -26
  48. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  49. data/lib/puppet/defaults.rb +69 -22
  50. data/lib/puppet/environments.rb +3 -1
  51. data/lib/puppet/face/config.rb +1 -1
  52. data/lib/puppet/face/epp.rb +1 -1
  53. data/lib/puppet/face/help/man.erb +1 -1
  54. data/lib/puppet/face/module/install.rb +6 -6
  55. data/lib/puppet/face/parser.rb +12 -9
  56. data/lib/puppet/face/status.rb +2 -1
  57. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  58. data/lib/puppet/feature/telnet.rb +9 -0
  59. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  60. data/lib/puppet/file_serving/metadata.rb +18 -2
  61. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  62. data/lib/puppet/file_system/file_impl.rb +2 -2
  63. data/lib/puppet/file_system/memory_impl.rb +1 -1
  64. data/lib/puppet/file_system/uniquefile.rb +1 -1
  65. data/lib/puppet/file_system.rb +2 -2
  66. data/lib/puppet/forge/repository.rb +1 -31
  67. data/lib/puppet/forge.rb +1 -1
  68. data/lib/puppet/functions/assert_type.rb +9 -9
  69. data/lib/puppet/functions/each.rb +5 -13
  70. data/lib/puppet/functions/filter.rb +5 -14
  71. data/lib/puppet/functions/lookup.rb +126 -150
  72. data/lib/puppet/functions/map.rb +6 -14
  73. data/lib/puppet/functions/match.rb +1 -0
  74. data/lib/puppet/functions/reduce.rb +5 -13
  75. data/lib/puppet/functions/reverse_each.rb +82 -0
  76. data/lib/puppet/functions/scanf.rb +15 -18
  77. data/lib/puppet/functions/slice.rb +22 -36
  78. data/lib/puppet/functions/split.rb +2 -2
  79. data/lib/puppet/functions/step.rb +88 -0
  80. data/lib/puppet/functions/type.rb +70 -0
  81. data/lib/puppet/functions.rb +45 -6
  82. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  83. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  84. data/lib/puppet/indirector/facts/facter.rb +2 -13
  85. data/lib/puppet/indirector/file_content/http.rb +15 -0
  86. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  87. data/lib/puppet/indirector/generic_http.rb +16 -0
  88. data/lib/puppet/indirector/hiera.rb +3 -1
  89. data/lib/puppet/indirector/indirection.rb +6 -2
  90. data/lib/puppet/indirector/json.rb +2 -2
  91. data/lib/puppet/indirector/node/exec.rb +1 -1
  92. data/lib/puppet/indirector/node/ldap.rb +1 -1
  93. data/lib/puppet/indirector/rest.rb +2 -1
  94. data/lib/puppet/info_service/class_information_service.rb +13 -12
  95. data/lib/puppet/loaders.rb +1 -0
  96. data/lib/puppet/module.rb +6 -2
  97. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  98. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  99. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  100. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  101. data/lib/puppet/network/http/pool.rb +9 -0
  102. data/lib/puppet/node/environment.rb +11 -2
  103. data/lib/puppet/node.rb +11 -2
  104. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  105. data/lib/puppet/parser/compiler.rb +4 -11
  106. data/lib/puppet/parser/environment_compiler.rb +0 -1
  107. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  108. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  109. data/lib/puppet/parser/functions/lookup.rb +128 -149
  110. data/lib/puppet/parser/functions/map.rb +1 -1
  111. data/lib/puppet/parser/functions/match.rb +1 -0
  112. data/lib/puppet/parser/functions/scanf.rb +15 -26
  113. data/lib/puppet/parser/functions/slice.rb +17 -24
  114. data/lib/puppet/parser/functions/split.rb +1 -1
  115. data/lib/puppet/parser/functions.rb +28 -16
  116. data/lib/puppet/parser/resource.rb +19 -17
  117. data/lib/puppet/parser/scope.rb +176 -5
  118. data/lib/puppet/plugins/data_providers/data_provider.rb +56 -14
  119. data/lib/puppet/pops/adaptable.rb +4 -1
  120. data/lib/puppet/pops/adapters.rb +80 -12
  121. data/lib/puppet/pops/binder/binder.rb +21 -17
  122. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  123. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  124. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  125. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  126. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  127. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  128. data/lib/puppet/pops/binder/injector.rb +53 -48
  129. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  130. data/lib/puppet/pops/binder/producers.rb +67 -62
  131. data/lib/puppet/pops/evaluator/access_operator.rb +98 -96
  132. data/lib/puppet/pops/evaluator/closure.rb +122 -106
  133. data/lib/puppet/pops/evaluator/collector_transformer.rb +34 -14
  134. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  135. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  136. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  137. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  138. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  139. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  140. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  141. data/lib/puppet/pops/evaluator/runtime3_support.rb +47 -42
  142. data/lib/puppet/pops/functions/function.rb +6 -2
  143. data/lib/puppet/pops/issue_reporter.rb +6 -4
  144. data/lib/puppet/pops/issues.rb +50 -11
  145. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  146. data/lib/puppet/pops/loader/loader.rb +1 -1
  147. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  148. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  149. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +18 -13
  150. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  151. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  152. data/lib/puppet/pops/loaders.rb +51 -9
  153. data/lib/puppet/pops/lookup/explainer.rb +73 -3
  154. data/lib/puppet/pops/lookup/invocation.rb +21 -19
  155. data/lib/puppet/pops/lookup.rb +17 -12
  156. data/lib/puppet/pops/merge_strategy.rb +16 -19
  157. data/lib/puppet/pops/model/factory.rb +179 -157
  158. data/lib/puppet/pops/model/model.rb +17 -8
  159. data/lib/puppet/pops/model/model_label_provider.rb +14 -7
  160. data/lib/puppet/pops/model/model_meta.rb +17 -0
  161. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  162. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  163. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  164. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  165. data/lib/puppet/pops/parser/evaluating_parser.rb +17 -13
  166. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  167. data/lib/puppet/pops/parser/lexer2.rb +428 -403
  168. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  169. data/lib/puppet/pops/parser/locator.rb +21 -0
  170. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  171. data/lib/puppet/pops/parser/slurp_support.rb +16 -8
  172. data/lib/puppet/pops/types/class_loader.rb +23 -19
  173. data/lib/puppet/pops/types/enumeration.rb +9 -26
  174. data/lib/puppet/pops/types/iterable.rb +308 -0
  175. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  176. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  177. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  178. data/lib/puppet/pops/types/type_calculator.rb +140 -387
  179. data/lib/puppet/pops/types/type_factory.rb +91 -57
  180. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  181. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  182. data/lib/puppet/pops/types/type_parser.rb +159 -112
  183. data/lib/puppet/pops/types/types.rb +2057 -1253
  184. data/lib/puppet/pops/utils.rb +11 -10
  185. data/lib/puppet/pops/validation/checker4_0.rb +115 -63
  186. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  187. data/lib/puppet/pops/validation.rb +11 -9
  188. data/lib/puppet/pops.rb +0 -8
  189. data/lib/puppet/provider/aixobject.rb +1 -1
  190. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  191. data/lib/puppet/provider/cron/crontab.rb +1 -1
  192. data/lib/puppet/provider/exec/windows.rb +1 -1
  193. data/lib/puppet/provider/group/windows_adsi.rb +2 -2
  194. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  195. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  196. data/lib/puppet/provider/package/appdmg.rb +3 -2
  197. data/lib/puppet/provider/package/dnf.rb +1 -1
  198. data/lib/puppet/provider/package/pip.rb +16 -9
  199. data/lib/puppet/provider/package/pip3.rb +1 -1
  200. data/lib/puppet/provider/package/pkg.rb +1 -1
  201. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  202. data/lib/puppet/provider/package/pkgng.rb +13 -4
  203. data/lib/puppet/provider/package/rpm.rb +0 -1
  204. data/lib/puppet/provider/package/windows.rb +1 -1
  205. data/lib/puppet/provider/package/yum.rb +2 -2
  206. data/lib/puppet/provider/package/zypper.rb +19 -0
  207. data/lib/puppet/provider/service/debian.rb +7 -20
  208. data/lib/puppet/provider/service/init.rb +7 -0
  209. data/lib/puppet/provider/service/launchd.rb +6 -12
  210. data/lib/puppet/provider/service/systemd.rb +9 -2
  211. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +1 -1
  213. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  214. data/lib/puppet/provider/user/windows_adsi.rb +2 -2
  215. data/lib/puppet/provider/yumrepo/inifile.rb +6 -3
  216. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  217. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  218. data/lib/puppet/reference/configuration.rb +1 -1
  219. data/lib/puppet/reference/providers.rb +1 -1
  220. data/lib/puppet/resource/capability_finder.rb +20 -13
  221. data/lib/puppet/resource/catalog.rb +60 -3
  222. data/lib/puppet/resource/status.rb +11 -2
  223. data/lib/puppet/resource/type.rb +33 -42
  224. data/lib/puppet/resource.rb +15 -12
  225. data/lib/puppet/settings/config_file.rb +1 -1
  226. data/lib/puppet/settings/environment_conf.rb +13 -5
  227. data/lib/puppet/settings.rb +1 -1
  228. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  229. data/lib/puppet/ssl/certificate_request.rb +4 -4
  230. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  231. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  232. data/lib/puppet/test/test_helper.rb +16 -4
  233. data/lib/puppet/transaction/additional_resource_generator.rb +23 -5
  234. data/lib/puppet/transaction/report.rb +31 -1
  235. data/lib/puppet/transaction/resource_harness.rb +0 -25
  236. data/lib/puppet/transaction.rb +15 -2
  237. data/lib/puppet/type/augeas.rb +1 -1
  238. data/lib/puppet/type/cron.rb +12 -12
  239. data/lib/puppet/type/file/checksum_value.rb +53 -0
  240. data/lib/puppet/type/file/content.rb +26 -111
  241. data/lib/puppet/type/file/data_sync.rb +84 -0
  242. data/lib/puppet/type/file/ensure.rb +17 -14
  243. data/lib/puppet/type/file/selcontext.rb +1 -1
  244. data/lib/puppet/type/file/source.rb +103 -18
  245. data/lib/puppet/type/file.rb +91 -39
  246. data/lib/puppet/type/filebucket.rb +1 -1
  247. data/lib/puppet/type/group.rb +6 -2
  248. data/lib/puppet/type/interface.rb +8 -3
  249. data/lib/puppet/type/macauthorization.rb +1 -1
  250. data/lib/puppet/type/package.rb +6 -0
  251. data/lib/puppet/type/schedule.rb +1 -1
  252. data/lib/puppet/type/stage.rb +1 -1
  253. data/lib/puppet/type/user.rb +19 -17
  254. data/lib/puppet/type/yumrepo.rb +20 -0
  255. data/lib/puppet/type.rb +11 -11
  256. data/lib/puppet/util/autoload.rb +16 -11
  257. data/lib/puppet/util/checksums.rb +74 -31
  258. data/lib/puppet/util/execution.rb +1 -1
  259. data/lib/puppet/util/http_proxy.rb +72 -0
  260. data/lib/puppet/util/log.rb +2 -0
  261. data/lib/puppet/util/logging.rb +43 -1
  262. data/lib/puppet/util/monkey_patches.rb +2 -2
  263. data/lib/puppet/util/multi_match.rb +51 -0
  264. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  265. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  266. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  267. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  268. data/lib/puppet/util/plist.rb +130 -0
  269. data/lib/puppet/util/resource_template.rb +1 -1
  270. data/lib/puppet/util/run_mode.rb +2 -2
  271. data/lib/puppet/util/skip_tags.rb +9 -0
  272. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  273. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  274. data/lib/puppet/util/windows/adsi.rb +65 -28
  275. data/lib/puppet/util/windows/api_types.rb +24 -18
  276. data/lib/puppet/util/windows/com.rb +3 -3
  277. data/lib/puppet/util/windows/error.rb +1 -1
  278. data/lib/puppet/util/windows/file.rb +8 -8
  279. data/lib/puppet/util/windows/principal.rb +190 -0
  280. data/lib/puppet/util/windows/process.rb +78 -11
  281. data/lib/puppet/util/windows/registry.rb +22 -16
  282. data/lib/puppet/util/windows/root_certs.rb +5 -5
  283. data/lib/puppet/util/windows/security.rb +33 -35
  284. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  285. data/lib/puppet/util/windows/sid.rb +84 -15
  286. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  287. data/lib/puppet/util/windows/user.rb +10 -10
  288. data/lib/puppet/util/windows.rb +4 -0
  289. data/lib/puppet/util.rb +109 -22
  290. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  291. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  292. data/lib/puppet/vendor/pathspec/README.md +1 -1
  293. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  294. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  295. data/lib/puppet/version.rb +1 -1
  296. data/lib/puppet.rb +17 -0
  297. data/lib/semver.rb +17 -1
  298. data/man/man5/puppet.conf.5 +12 -12
  299. data/man/man8/extlookup2hiera.8 +1 -1
  300. data/man/man8/puppet-agent.8 +2 -2
  301. data/man/man8/puppet-apply.8 +2 -2
  302. data/man/man8/puppet-ca.8 +2 -2
  303. data/man/man8/puppet-catalog.8 +2 -2
  304. data/man/man8/puppet-cert.8 +2 -2
  305. data/man/man8/puppet-certificate.8 +2 -2
  306. data/man/man8/puppet-certificate_request.8 +2 -2
  307. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  308. data/man/man8/puppet-config.8 +3 -3
  309. data/man/man8/puppet-describe.8 +1 -1
  310. data/man/man8/puppet-device.8 +1 -1
  311. data/man/man8/puppet-doc.8 +1 -1
  312. data/man/man8/puppet-epp.8 +2 -2
  313. data/man/man8/puppet-facts.8 +2 -2
  314. data/man/man8/puppet-file.8 +2 -2
  315. data/man/man8/puppet-filebucket.8 +2 -2
  316. data/man/man8/puppet-help.8 +2 -2
  317. data/man/man8/puppet-inspect.8 +2 -2
  318. data/man/man8/puppet-key.8 +2 -2
  319. data/man/man8/puppet-man.8 +2 -2
  320. data/man/man8/puppet-master.8 +2 -2
  321. data/man/man8/puppet-module.8 +9 -9
  322. data/man/man8/puppet-node.8 +2 -2
  323. data/man/man8/puppet-parser.8 +2 -2
  324. data/man/man8/puppet-plugin.8 +2 -2
  325. data/man/man8/puppet-report.8 +2 -2
  326. data/man/man8/puppet-resource.8 +2 -2
  327. data/man/man8/puppet-resource_type.8 +2 -2
  328. data/man/man8/puppet-status.8 +3 -3
  329. data/man/man8/puppet.8 +1 -1
  330. data/spec/fixtures/module.tar.gz +0 -0
  331. data/spec/fixtures/unit/application/environments/production/data/common.yaml +4 -0
  332. data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
  333. data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
  334. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/data.pp +10 -0
  335. data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
  336. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
  337. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
  338. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
  339. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
  340. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
  341. data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
  342. data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
  343. data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
  344. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
  345. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
  346. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
  347. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
  348. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
  349. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
  350. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
  351. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
  352. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  353. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  354. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  355. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  356. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  357. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  358. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  359. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  360. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  361. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  362. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  363. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  364. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
  365. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
  366. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
  367. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  368. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
  369. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
  370. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
  371. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
  372. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
  373. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
  374. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
  375. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
  376. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +81 -0
  377. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
  378. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  379. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  380. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  381. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  382. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
  383. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
  384. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  385. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
  386. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  387. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
  388. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
  389. data/spec/integration/defaults_spec.rb +14 -2
  390. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  391. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  392. data/spec/integration/node/environment_spec.rb +13 -0
  393. data/spec/integration/parser/collection_spec.rb +8 -0
  394. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  395. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  396. data/spec/integration/parser/undef_param_spec.rb +8 -0
  397. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  398. data/spec/integration/test/test_helper_spec.rb +28 -0
  399. data/spec/integration/transaction/report_spec.rb +16 -0
  400. data/spec/integration/transaction_spec.rb +11 -0
  401. data/spec/integration/type/file_spec.rb +194 -4
  402. data/spec/integration/type/package_spec.rb +5 -1
  403. data/spec/integration/type/tidy_spec.rb +21 -9
  404. data/spec/integration/util/execution_spec.rb +22 -0
  405. data/spec/integration/util/windows/principal_spec.rb +201 -0
  406. data/spec/integration/util/windows/process_spec.rb +31 -0
  407. data/spec/{unit → integration}/util/windows/registry_spec.rb +91 -1
  408. data/spec/integration/util/windows/security_spec.rb +8 -8
  409. data/spec/integration/util/windows/user_spec.rb +1 -1
  410. data/spec/integration/util_spec.rb +49 -27
  411. data/spec/lib/puppet_spec/compiler.rb +17 -0
  412. data/spec/lib/puppet_spec/files.rb +2 -2
  413. data/spec/lib/puppet_spec/pops.rb +13 -0
  414. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  415. data/spec/shared_contexts/types_setup.rb +96 -0
  416. data/spec/unit/agent_spec.rb +1 -0
  417. data/spec/unit/application/agent_spec.rb +10 -0
  418. data/spec/unit/application/apply_spec.rb +9 -0
  419. data/spec/unit/application/lookup_spec.rb +138 -28
  420. data/spec/unit/configurer/downloader_spec.rb +5 -5
  421. data/spec/unit/configurer_spec.rb +271 -39
  422. data/spec/unit/data_providers/hiera_data_provider_spec.rb +182 -5
  423. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  424. data/spec/unit/defaults_spec.rb +15 -0
  425. data/spec/unit/environments_spec.rb +24 -4
  426. data/spec/unit/face/epp_face_spec.rb +2 -2
  427. data/spec/unit/face/parser_spec.rb +43 -2
  428. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  429. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  430. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  431. data/spec/unit/file_system_spec.rb +26 -0
  432. data/spec/unit/functions/assert_type_spec.rb +36 -2
  433. data/spec/unit/functions/defined_spec.rb +2 -2
  434. data/spec/unit/functions/epp_spec.rb +17 -9
  435. data/spec/unit/functions/inline_epp_spec.rb +4 -4
  436. data/spec/unit/functions/lookup_spec.rb +88 -16
  437. data/spec/unit/functions/regsubst_spec.rb +1 -1
  438. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  439. data/spec/unit/functions/step_spec.rb +113 -0
  440. data/spec/unit/functions/type_spec.rb +35 -0
  441. data/spec/unit/functions4_spec.rb +62 -6
  442. data/spec/unit/hiera/scope_spec.rb +5 -2
  443. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  444. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  445. data/spec/unit/indirector/indirection_spec.rb +1 -1
  446. data/spec/unit/indirector/json_spec.rb +1 -1
  447. data/spec/unit/info_service_spec.rb +94 -32
  448. data/spec/unit/module_spec.rb +14 -0
  449. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  450. data/spec/unit/network/authstore_spec.rb +1 -1
  451. data/spec/unit/network/http/connection_spec.rb +1 -0
  452. data/spec/unit/network/http/pool_spec.rb +30 -0
  453. data/spec/unit/node_spec.rb +8 -0
  454. data/spec/unit/parser/compiler_spec.rb +16 -18
  455. data/spec/unit/parser/scope_spec.rb +28 -11
  456. data/spec/unit/pops/evaluator/access_ops_spec.rb +7 -7
  457. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  458. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -2
  459. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  460. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  461. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  462. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  463. data/spec/unit/pops/loaders/loaders_spec.rb +127 -2
  464. data/spec/unit/pops/parser/lexer2_spec.rb +118 -3
  465. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  466. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  467. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  468. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  469. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  470. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  471. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  472. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  473. data/spec/unit/pops/types/type_calculator_spec.rb +275 -390
  474. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  475. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  476. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  477. data/spec/unit/pops/types/types_spec.rb +241 -0
  478. data/spec/unit/pops/validator/validator_spec.rb +159 -15
  479. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  480. data/spec/unit/provider/group/windows_adsi_spec.rb +8 -8
  481. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  482. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  483. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  484. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  485. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  486. data/spec/unit/provider/package/pip_spec.rb +88 -47
  487. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  488. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  489. data/spec/unit/provider/package/rpm_spec.rb +2 -25
  490. data/spec/unit/provider/package/yum_spec.rb +12 -1
  491. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  492. data/spec/unit/provider/service/debian_spec.rb +6 -24
  493. data/spec/unit/provider/service/init_spec.rb +11 -1
  494. data/spec/unit/provider/service/launchd_spec.rb +18 -25
  495. data/spec/unit/provider/service/systemd_spec.rb +25 -12
  496. data/spec/unit/provider/service/upstart_spec.rb +57 -0
  497. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  498. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  499. data/spec/unit/provider/user/windows_adsi_spec.rb +5 -5
  500. data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
  501. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  502. data/spec/unit/resource/catalog_spec.rb +33 -1
  503. data/spec/unit/resource/type_spec.rb +149 -7
  504. data/spec/unit/resource_spec.rb +99 -50
  505. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  506. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  507. data/spec/unit/transaction/report_spec.rb +27 -0
  508. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  509. data/spec/unit/transaction_spec.rb +5 -0
  510. data/spec/unit/type/file/checksum_spec.rb +6 -0
  511. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  512. data/spec/unit/type/file/content_spec.rb +12 -193
  513. data/spec/unit/type/file/source_spec.rb +211 -119
  514. data/spec/unit/type/file_spec.rb +133 -34
  515. data/spec/unit/type/interface_spec.rb +32 -0
  516. data/spec/unit/type/macauthorization_spec.rb +4 -1
  517. data/spec/unit/type/yumrepo_spec.rb +2 -2
  518. data/spec/unit/util/filetype_spec.rb +1 -1
  519. data/spec/unit/util/http_proxy_spec.rb +2 -2
  520. data/spec/unit/util/log/destinations_spec.rb +0 -2
  521. data/spec/unit/util/logging_spec.rb +69 -0
  522. data/spec/unit/util/multi_match_spec.rb +39 -0
  523. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  524. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  525. data/spec/unit/util/plist_spec.rb +110 -0
  526. data/spec/unit/util/resource_template_spec.rb +2 -2
  527. data/spec/unit/util/run_mode_spec.rb +27 -3
  528. data/spec/unit/util/windows/adsi_spec.rb +46 -38
  529. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  530. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  531. data/spec/unit/util/windows/sid_spec.rb +48 -11
  532. data/spec/unit/util_spec.rb +123 -13
  533. data/tasks/cfpropertylist.rake +15 -0
  534. metadata +3342 -3195
  535. data/lib/puppet/vendor/load_plist.rb +0 -1
  536. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  537. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  538. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  539. data/lib/puppet/vendor/plist/README +0 -36
  540. data/lib/puppet/vendor/plist/Rakefile +0 -144
  541. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  542. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  543. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  544. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  545. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  546. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  547. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  548. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  549. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  550. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  551. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  552. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  553. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  554. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  555. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  556. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  557. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  558. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
  559. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
  560. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
@@ -12,12 +12,14 @@ require 'puppet/pops/parser/interpolation_support'
12
12
  require 'puppet/pops/parser/epp_support'
13
13
  require 'puppet/pops/parser/slurp_support'
14
14
 
15
- class Puppet::Pops::Parser::Lexer2
16
- include Puppet::Pops::Parser::LexerSupport
17
- include Puppet::Pops::Parser::HeredocSupport
18
- include Puppet::Pops::Parser::InterpolationSupport
19
- include Puppet::Pops::Parser::SlurpSupport
20
- include Puppet::Pops::Parser::EppSupport
15
+ module Puppet::Pops
16
+ module Parser
17
+ class Lexer2
18
+ include LexerSupport
19
+ include HeredocSupport
20
+ include InterpolationSupport
21
+ include SlurpSupport
22
+ include EppSupport
21
23
 
22
24
  # ALl tokens have three slots, the token name (a Symbol), the token text (String), and a token text length.
23
25
  # All operator and punctuation tokens reuse singleton arrays Tokens that require unique values create
@@ -111,26 +113,26 @@ class Puppet::Pops::Parser::Lexer2
111
113
  # Booleans are pre-calculated (rather than evaluating the strings "false" "true" repeatedly.
112
114
  #
113
115
  KEYWORDS = {
114
- "case" => [:CASE, 'case', 4],
115
- "class" => [:CLASS, 'class', 5],
116
- "default" => [:DEFAULT, 'default', 7],
117
- "define" => [:DEFINE, 'define', 6],
118
- "if" => [:IF, 'if', 2],
119
- "elsif" => [:ELSIF, 'elsif', 5],
120
- "else" => [:ELSE, 'else', 4],
121
- "inherits" => [:INHERITS, 'inherits', 8],
122
- "node" => [:NODE, 'node', 4],
123
- "and" => [:AND, 'and', 3],
124
- "or" => [:OR, 'or', 2],
125
- "undef" => [:UNDEF, 'undef', 5],
126
- "false" => [:BOOLEAN, false, 5],
127
- "true" => [:BOOLEAN, true, 4],
128
- "in" => [:IN, 'in', 2],
129
- "unless" => [:UNLESS, 'unless', 6],
130
- "function" => [:FUNCTION, 'function', 8],
131
- "type" => [:TYPE, 'type', 4],
132
- "attr" => [:ATTR, 'attr', 4],
133
- "private" => [:PRIVATE, 'private', 7],
116
+ 'case' => [:CASE, 'case', 4],
117
+ 'class' => [:CLASS, 'class', 5],
118
+ 'default' => [:DEFAULT, 'default', 7],
119
+ 'define' => [:DEFINE, 'define', 6],
120
+ 'if' => [:IF, 'if', 2],
121
+ 'elsif' => [:ELSIF, 'elsif', 5],
122
+ 'else' => [:ELSE, 'else', 4],
123
+ 'inherits' => [:INHERITS, 'inherits', 8],
124
+ 'node' => [:NODE, 'node', 4],
125
+ 'and' => [:AND, 'and', 3],
126
+ 'or' => [:OR, 'or', 2],
127
+ 'undef' => [:UNDEF, 'undef', 5],
128
+ 'false' => [:BOOLEAN, false, 5],
129
+ 'true' => [:BOOLEAN, true, 4],
130
+ 'in' => [:IN, 'in', 2],
131
+ 'unless' => [:UNLESS, 'unless', 6],
132
+ 'function' => [:FUNCTION, 'function', 8],
133
+ 'type' => [:TYPE, 'type', 4],
134
+ 'attr' => [:ATTR, 'attr', 4],
135
+ 'private' => [:PRIVATE, 'private', 7],
134
136
  }
135
137
 
136
138
  KEYWORDS.each {|k,v| v[1].freeze; v.freeze }
@@ -142,16 +144,16 @@ class Puppet::Pops::Parser::Lexer2
142
144
  # hit the appmgmt-specific code paths
143
145
  APP_MANAGEMENT_TOKENS = {
144
146
  :with_appm => {
145
- "application" => [:APPLICATION, 'application', 11],
146
- "consumes" => [:CONSUMES, 'consumes', 8],
147
- "produces" => [:PRODUCES, 'produces', 8],
148
- "site" => [:SITE, 'site', 4]
147
+ 'application' => [:APPLICATION, 'application', 11],
148
+ 'consumes' => [:CONSUMES, 'consumes', 8],
149
+ 'produces' => [:PRODUCES, 'produces', 8],
150
+ 'site' => [:SITE, 'site', 4]
149
151
  },
150
152
  :without_appm => {
151
- "application" => [:APPLICATION_R, 'application', 11],
152
- "consumes" => [:CONSUMES_R, 'consumes', 8],
153
- "produces" => [:PRODUCES_R, 'produces', 8],
154
- "site" => [:SITE_R, 'site', 4]
153
+ 'application' => [:APPLICATION_R, 'application', 11],
154
+ 'consumes' => [:CONSUMES_R, 'consumes', 8],
155
+ 'produces' => [:PRODUCES_R, 'produces', 8],
156
+ 'site' => [:SITE_R, 'site', 4]
155
157
  }
156
158
  }
157
159
 
@@ -205,6 +207,382 @@ class Puppet::Pops::Parser::Lexer2
205
207
  attr_reader :locator
206
208
 
207
209
  def initialize()
210
+ @selector = {
211
+ '.' => lambda { emit(TOKEN_DOT, @scanner.pos) },
212
+ ',' => lambda { emit(TOKEN_COMMA, @scanner.pos) },
213
+ '[' => lambda do
214
+ before = @scanner.pos
215
+ if (before == 0 || @scanner.string[locator.char_offset(before)-1,1] =~ /[[:blank:]\r\n]+/)
216
+ emit(TOKEN_LISTSTART, before)
217
+ else
218
+ emit(TOKEN_LBRACK, before)
219
+ end
220
+ end,
221
+ ']' => lambda { emit(TOKEN_RBRACK, @scanner.pos) },
222
+ '(' => lambda { emit(TOKEN_LPAREN, @scanner.pos) },
223
+ ')' => lambda { emit(TOKEN_RPAREN, @scanner.pos) },
224
+ ';' => lambda { emit(TOKEN_SEMIC, @scanner.pos) },
225
+ '?' => lambda { emit(TOKEN_QMARK, @scanner.pos) },
226
+ '*' => lambda { emit(TOKEN_TIMES, @scanner.pos) },
227
+ '%' => lambda do
228
+ scn = @scanner
229
+ before = scn.pos
230
+ la = scn.peek(2)
231
+ if la[1] == '>' && @lexing_context[:epp_mode]
232
+ scn.pos += 2
233
+ if @lexing_context[:epp_mode] == :expr
234
+ enqueue_completed(TOKEN_EPPEND, before)
235
+ end
236
+ @lexing_context[:epp_mode] = :text
237
+ interpolate_epp
238
+ else
239
+ emit(TOKEN_MODULO, before)
240
+ end
241
+ end,
242
+ '{' => lambda do
243
+ # The lexer needs to help the parser since the technology used cannot deal with
244
+ # lookahead of same token with different precedence. This is solved by making left brace
245
+ # after ? into a separate token.
246
+ #
247
+ @lexing_context[:brace_count] += 1
248
+ emit(if @lexing_context[:after] == :QMARK
249
+ TOKEN_SELBRACE
250
+ else
251
+ TOKEN_LBRACE
252
+ end, @scanner.pos)
253
+ end,
254
+ '}' => lambda do
255
+ @lexing_context[:brace_count] -= 1
256
+ emit(TOKEN_RBRACE, @scanner.pos)
257
+ end,
258
+
259
+
260
+ # TOKENS @, @@, @(
261
+ '@' => lambda do
262
+ scn = @scanner
263
+ la = scn.peek(2)
264
+ if la[1] == '@'
265
+ emit(TOKEN_ATAT, scn.pos) # TODO; Check if this is good for the grammar
266
+ elsif la[1] == '('
267
+ heredoc
268
+ else
269
+ emit(TOKEN_AT, scn.pos)
270
+ end
271
+ end,
272
+
273
+ # TOKENS |, |>, |>>
274
+ '|' => lambda do
275
+ scn = @scanner
276
+ la = scn.peek(3)
277
+ emit(la[1] == '>' ? (la[2] == '>' ? TOKEN_RRCOLLECT : TOKEN_RCOLLECT) : TOKEN_PIPE, scn.pos)
278
+ end,
279
+
280
+ # TOKENS =, =>, ==, =~
281
+ '=' => lambda do
282
+ scn = @scanner
283
+ la = scn.peek(2)
284
+ emit(case la[1]
285
+ when '='
286
+ TOKEN_ISEQUAL
287
+ when '>'
288
+ TOKEN_FARROW
289
+ when '~'
290
+ TOKEN_MATCH
291
+ else
292
+ TOKEN_EQUALS
293
+ end, scn.pos)
294
+ end,
295
+
296
+ # TOKENS '+', '+=', and '+>'
297
+ '+' => lambda do
298
+ scn = @scanner
299
+ la = scn.peek(2)
300
+ emit(case la[1]
301
+ when '='
302
+ TOKEN_APPENDS
303
+ when '>'
304
+ TOKEN_PARROW
305
+ else
306
+ TOKEN_PLUS
307
+ end, scn.pos)
308
+ end,
309
+
310
+ # TOKENS '-', '->', and epp '-%>' (end of interpolation with trim)
311
+ '-' => lambda do
312
+ scn = @scanner
313
+ la = scn.peek(3)
314
+ before = scn.pos
315
+ if @lexing_context[:epp_mode] && la[1] == '%' && la[2] == '>'
316
+ scn.pos += 3
317
+ if @lexing_context[:epp_mode] == :expr
318
+ enqueue_completed(TOKEN_EPPEND_TRIM, before)
319
+ end
320
+ interpolate_epp(:with_trim)
321
+ else
322
+ emit(case la[1]
323
+ when '>'
324
+ TOKEN_IN_EDGE
325
+ when '='
326
+ TOKEN_DELETES
327
+ else
328
+ TOKEN_MINUS
329
+ end, before)
330
+ end
331
+ end,
332
+
333
+ # TOKENS !, !=, !~
334
+ '!' => lambda do
335
+ scn = @scanner
336
+ la = scn.peek(2)
337
+ emit(case la[1]
338
+ when '='
339
+ TOKEN_NOTEQUAL
340
+ when '~'
341
+ TOKEN_NOMATCH
342
+ else
343
+ TOKEN_NOT
344
+ end, scn.pos)
345
+ end,
346
+
347
+ # TOKENS ~>, ~
348
+ '~' => lambda do
349
+ scn = @scanner
350
+ la = scn.peek(2)
351
+ emit(la[1] == '>' ? TOKEN_IN_EDGE_SUB : TOKEN_TILDE, scn.pos)
352
+ end,
353
+
354
+ '#' => lambda { @scanner.skip(PATTERN_COMMENT); nil },
355
+
356
+ # TOKENS '/', '/*' and '/ regexp /'
357
+ '/' => lambda do
358
+ scn = @scanner
359
+ la = scn.peek(2)
360
+ if la[1] == '*'
361
+ lex_error(Issues::UNCLOSED_MLCOMMENT) if scn.skip(PATTERN_MLCOMMENT).nil?
362
+ nil
363
+ else
364
+ before = scn.pos
365
+ # regexp position is a regexp, else a div
366
+ if regexp_acceptable? && value = scn.scan(PATTERN_REGEX)
367
+ # Ensure an escaped / was not matched
368
+ while value[-2..-2] == STRING_BSLASH_BSLASH # i.e. \\
369
+ value += scn.scan_until(PATTERN_REGEX_END)
370
+ end
371
+ regex = value.sub(PATTERN_REGEX_A, '').sub(PATTERN_REGEX_Z, '').gsub(PATTERN_REGEX_ESC, '/')
372
+ emit_completed([:REGEX, Regexp.new(regex), scn.pos-before], before)
373
+ else
374
+ emit(TOKEN_DIV, before)
375
+ end
376
+ end
377
+ end,
378
+
379
+ # TOKENS <, <=, <|, <<|, <<, <-, <~
380
+ '<' => lambda do
381
+ scn = @scanner
382
+ la = scn.peek(3)
383
+ emit(case la[1]
384
+ when '<'
385
+ if la[2] == '|'
386
+ TOKEN_LLCOLLECT
387
+ else
388
+ TOKEN_LSHIFT
389
+ end
390
+ when '='
391
+ TOKEN_LESSEQUAL
392
+ when '|'
393
+ TOKEN_LCOLLECT
394
+ when '-'
395
+ TOKEN_OUT_EDGE
396
+ when '~'
397
+ TOKEN_OUT_EDGE_SUB
398
+ else
399
+ TOKEN_LESSTHAN
400
+ end, scn.pos)
401
+ end,
402
+
403
+ # TOKENS >, >=, >>
404
+ '>' => lambda do
405
+ scn = @scanner
406
+ la = scn.peek(2)
407
+ emit(case la[1]
408
+ when '>'
409
+ TOKEN_RSHIFT
410
+ when '='
411
+ TOKEN_GREATEREQUAL
412
+ else
413
+ TOKEN_GREATERTHAN
414
+ end, scn.pos)
415
+ end,
416
+
417
+ # TOKENS :, ::CLASSREF, ::NAME
418
+ ':' => lambda do
419
+ scn = @scanner
420
+ la = scn.peek(3)
421
+ before = scn.pos
422
+ if la[1] == ':'
423
+ # PERFORMANCE NOTE: This could potentially be speeded up by using a case/when listing all
424
+ # upper case letters. Alternatively, the 'A', and 'Z' comparisons may be faster if they are
425
+ # frozen.
426
+ #
427
+ la2 = la[2]
428
+ if la2 >= 'A' && la2 <= 'Z'
429
+ # CLASSREF or error
430
+ value = scn.scan(PATTERN_CLASSREF)
431
+ if value && scn.peek(2) != '::'
432
+ after = scn.pos
433
+ emit_completed([:CLASSREF, value.freeze, after-before], before)
434
+ else
435
+ # move to faulty position ('::<uc-letter>' was ok)
436
+ scn.pos = scn.pos + 3
437
+ lex_error(Issues::ILLEGAL_FULLY_QUALIFIED_CLASS_REFERENCE)
438
+ end
439
+ else
440
+ value = scn.scan(PATTERN_BARE_WORD)
441
+ if value
442
+ if value =~ PATTERN_NAME
443
+ emit_completed([:NAME, value.freeze, scn.pos - before], before)
444
+ else
445
+ emit_completed([:WORD, value.freeze, scn.pos - before], before)
446
+ end
447
+ else
448
+ # move to faulty position ('::' was ok)
449
+ scn.pos = scn.pos + 2
450
+ lex_error(Issues::ILLEGAL_FULLY_QUALIFIED_NAME)
451
+ end
452
+ end
453
+ else
454
+ emit(TOKEN_COLON, before)
455
+ end
456
+ end,
457
+
458
+ '$' => lambda do
459
+ scn = @scanner
460
+ before = scn.pos
461
+ if value = scn.scan(PATTERN_DOLLAR_VAR)
462
+ emit_completed([:VARIABLE, value[1..-1].freeze, scn.pos - before], before)
463
+ else
464
+ # consume the $ and let higher layer complain about the error instead of getting a syntax error
465
+ emit(TOKEN_VARIABLE_EMPTY, before)
466
+ end
467
+ end,
468
+
469
+ '"' => lambda do
470
+ # Recursive string interpolation, 'interpolate' either returns a STRING token, or
471
+ # a DQPRE with the rest of the string's tokens placed in the @token_queue
472
+ interpolate_dq
473
+ end,
474
+
475
+ "'" => lambda do
476
+ scn = @scanner
477
+ before = scn.pos
478
+ emit_completed([:STRING, slurp_sqstring.freeze, scn.pos - before], before)
479
+ end,
480
+
481
+ "\n" => lambda do
482
+ # If heredoc_cont is in effect there are heredoc text lines to skip over
483
+ # otherwise just skip the newline.
484
+ #
485
+ ctx = @lexing_context
486
+ if ctx[:newline_jump]
487
+ @scanner.pos = ctx[:newline_jump]
488
+ ctx[:newline_jump] = nil
489
+ else
490
+ @scanner.pos += 1
491
+ end
492
+ nil
493
+ end,
494
+ '' => lambda { nil } # when the peek(1) returns empty
495
+ }
496
+
497
+ [ ' ', "\t", "\r" ].each { |c| @selector[c] = lambda { @scanner.skip(PATTERN_WS); nil } }
498
+
499
+ [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'].each do |c|
500
+ @selector[c] = lambda do
501
+ scn = @scanner
502
+ before = scn.pos
503
+ value = scn.scan(PATTERN_NUMBER)
504
+ if value
505
+ length = scn.pos - before
506
+ assert_numeric(value, before)
507
+ emit_completed([:NUMBER, value.freeze, length], before)
508
+ else
509
+ invalid_number = scn.scan_until(PATTERN_NON_WS)
510
+ if before > 1
511
+ after = scn.pos
512
+ scn.pos = before - 1
513
+ if scn.peek(1) == '.'
514
+ # preceded by a dot. Is this a bad decimal number then?
515
+ scn.pos = before - 2
516
+ while scn.peek(1) =~ /^\d$/
517
+ invalid_number = nil
518
+ before = scn.pos
519
+ break if before == 0
520
+ scn.pos = scn.pos - 1
521
+ end
522
+ end
523
+ scn.pos = before
524
+ invalid_number = scn.peek(after - before) unless invalid_number
525
+ end
526
+ length = scn.pos - before
527
+ assert_numeric(invalid_number, before)
528
+ scn.pos = before + 1
529
+ lex_error(Issues::ILLEGAL_NUMBER, {:value => invalid_number})
530
+ end
531
+ end
532
+ end
533
+ ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
534
+ 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '_'].each do |c|
535
+ @selector[c] = lambda do
536
+
537
+ scn = @scanner
538
+ before = scn.pos
539
+ value = scn.scan(PATTERN_BARE_WORD)
540
+ if value && value =~ PATTERN_NAME
541
+ emit_completed(KEYWORDS[value] || @appm_keywords[value] || [:NAME, value.freeze, scn.pos - before], before)
542
+ elsif value
543
+ emit_completed([:WORD, value.freeze, scn.pos - before], before)
544
+ else
545
+ # move to faulty position ([a-z_] was ok)
546
+ scn.pos = scn.pos + 1
547
+ fully_qualified = scn.match?(/::/)
548
+ if fully_qualified
549
+ lex_error(Issues::ILLEGAL_FULLY_QUALIFIED_NAME)
550
+ else
551
+ lex_error(Issues::ILLEGAL_NAME_OR_BARE_WORD)
552
+ end
553
+ end
554
+ end
555
+ end
556
+
557
+ ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
558
+ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'].each do |c|
559
+ @selector[c] = lambda do
560
+ scn = @scanner
561
+ before = scn.pos
562
+ value = @scanner.scan(PATTERN_CLASSREF)
563
+ if value && @scanner.peek(2) != '::'
564
+ emit_completed([:CLASSREF, value.freeze, scn.pos - before], before)
565
+ else
566
+ # move to faulty position ([A-Z] was ok)
567
+ scn.pos = scn.pos + 1
568
+ lex_error(Issues::ILLEGAL_CLASS_REFERENCE)
569
+ end
570
+ end
571
+ end
572
+
573
+ @selector.default = lambda do
574
+ # In case of unicode spaces of various kinds that are captured by a regexp, but not by the
575
+ # simpler case expression above (not worth handling those special cases with better performance).
576
+ scn = @scanner
577
+ if scn.skip(PATTERN_WS)
578
+ nil
579
+ else
580
+ # "unrecognized char"
581
+ emit([:OTHER, scn.peek(0), 1], scn.pos)
582
+ end
583
+ end
584
+ @selector.each { |k,v| k.freeze }
585
+ @selector.freeze
208
586
  end
209
587
 
210
588
  # Clears the lexer state (it is not required to call this as it will be garbage collected
@@ -228,20 +606,22 @@ class Puppet::Pops::Parser::Lexer2
228
606
 
229
607
  def lex_string(string, path='')
230
608
  initvars
609
+ assert_not_bom(string)
231
610
  @scanner = StringScanner.new(string)
232
- @locator = Puppet::Pops::Parser::Locator.locator(string, path)
611
+ @locator = Locator.locator(string, path)
233
612
  end
234
613
 
235
614
  # Lexes an unquoted string.
236
615
  # @param string [String] the string to lex
237
- # @param locator [Puppet::Pops::Parser::Locator] the locator to use (a default is used if nil is given)
616
+ # @param locator [Locator] the locator to use (a default is used if nil is given)
238
617
  # @param escapes [Array<String>] array of character strings representing the escape sequences to transform
239
618
  # @param interpolate [Boolean] whether interpolation of expressions should be made or not.
240
619
  #
241
620
  def lex_unquoted_string(string, locator, escapes, interpolate)
242
621
  initvars
622
+ assert_not_bom(string)
243
623
  @scanner = StringScanner.new(string)
244
- @locator = locator || Puppet::Pops::Parser::Locator.locator(string, '')
624
+ @locator = locator || Locator.locator(string, '')
245
625
  @lexing_context[:escapes] = escapes || UQ_ESCAPES
246
626
  @lexing_context[:uq_slurp_pattern] = interpolate ? (escapes.include?('$') ? SLURP_UQ_PATTERN : SLURP_UQNE_PATTERN) : SLURP_ALL_PATTERN
247
627
  end
@@ -264,9 +644,10 @@ class Puppet::Pops::Parser::Lexer2
264
644
  #
265
645
  def lex_file(file)
266
646
  initvars
267
- contents = Puppet::FileSystem.exist?(file) ? Puppet::FileSystem.read(file) : ""
647
+ contents = Puppet::FileSystem.exist?(file) ? Puppet::FileSystem.read(file, :encoding => 'utf-8') : ''
648
+ assert_not_bom(contents)
268
649
  @scanner = StringScanner.new(contents.freeze)
269
- @locator = Puppet::Pops::Parser::Locator.locator(contents, file)
650
+ @locator = Locator.locator(contents, file)
270
651
  end
271
652
 
272
653
  def initvars
@@ -285,7 +666,7 @@ class Puppet::Pops::Parser::Lexer2
285
666
  #
286
667
  def fullscan
287
668
  result = []
288
- scan {|token, value| result.push([token, value]) }
669
+ scan {|token| result.push(token) }
289
670
  result
290
671
  end
291
672
 
@@ -303,16 +684,17 @@ class Puppet::Pops::Parser::Lexer2
303
684
  # every token in the lexed content.
304
685
  #
305
686
  scn = @scanner
687
+ lex_error_without_pos(Issues::NO_INPUT_TO_LEXER) unless scn
688
+
306
689
  ctx = @lexing_context
307
690
  queue = @token_queue
308
-
309
- lex_error_without_pos(Puppet::Pops::Issues::NO_INPUT_TO_LEXER) unless scn
691
+ selector = @selector
310
692
 
311
693
  scn.skip(PATTERN_WS)
312
694
 
313
695
  # This is the lexer's main loop
314
696
  until queue.empty? && scn.eos? do
315
- if token = queue.shift || lex_token
697
+ if token = queue.shift || selector[scn.peek(1)].call
316
698
  ctx[:after] = token[0]
317
699
  yield token
318
700
  end
@@ -326,366 +708,7 @@ class Puppet::Pops::Parser::Lexer2
326
708
  # PERFORMANCE NOTE: Any change to this logic should be performance measured.
327
709
  #
328
710
  def lex_token
329
- # Using three char look ahead (may be faster to do 2 char look ahead since only 2 tokens require a third
330
- scn = @scanner
331
- ctx = @lexing_context
332
- before = @scanner.pos
333
-
334
- # A look ahead of 3 characters is used since the longest operator ambiguity is resolved at that point.
335
- # PERFORMANCE NOTE: It is faster to peek once and use three separate variables for lookahead 0, 1 and 2.
336
- #
337
- la = scn.peek(3)
338
- return nil if la.empty?
339
-
340
- # PERFORMANCE NOTE.
341
- # It is slightly faster to use these local variables than accessing la[0], la[1] etc. in ruby 1.9.3
342
- # But not big enough to warrant two completely different implementations.
343
- #
344
- la0 = la[0]
345
- la1 = la[1]
346
- la2 = la[2]
347
-
348
- # PERFORMANCE NOTE:
349
- # A case when, where all the cases are literal values is the fastest way to map from data to code.
350
- # It is much faster than using a hash with lambdas, hash with symbol used to then invoke send etc.
351
- # This case statement is evaluated for most character positions in puppet source, and great care must
352
- # be taken to not introduce performance regressions.
353
- #
354
- case la0
355
-
356
- when '.'
357
- emit(TOKEN_DOT, before)
358
-
359
- when ','
360
- emit(TOKEN_COMMA, before)
361
-
362
- when '['
363
- if (before == 0 || scn.string[locator.char_offset(before)-1,1] =~ /[[:blank:]\r\n]+/)
364
- emit(TOKEN_LISTSTART, before)
365
- else
366
- emit(TOKEN_LBRACK, before)
367
- end
368
-
369
- when ']'
370
- emit(TOKEN_RBRACK, before)
371
-
372
- when '('
373
- emit(TOKEN_LPAREN, before)
374
-
375
- when ')'
376
- emit(TOKEN_RPAREN, before)
377
-
378
- when ';'
379
- emit(TOKEN_SEMIC, before)
380
-
381
- when '?'
382
- emit(TOKEN_QMARK, before)
383
-
384
- when '*'
385
- emit(TOKEN_TIMES, before)
386
-
387
- when '%'
388
- if la1 == '>' && ctx[:epp_mode]
389
- scn.pos += 2
390
- if ctx[:epp_mode] == :expr
391
- enqueue_completed(TOKEN_EPPEND, before)
392
- end
393
- ctx[:epp_mode] = :text
394
- interpolate_epp
395
- else
396
- emit(TOKEN_MODULO, before)
397
- end
398
-
399
- when '{'
400
- # The lexer needs to help the parser since the technology used cannot deal with
401
- # lookahead of same token with different precedence. This is solved by making left brace
402
- # after ? into a separate token.
403
- #
404
- ctx[:brace_count] += 1
405
- emit(if ctx[:after] == :QMARK
406
- TOKEN_SELBRACE
407
- else
408
- TOKEN_LBRACE
409
- end, before)
410
-
411
- when '}'
412
- ctx[:brace_count] -= 1
413
- emit(TOKEN_RBRACE, before)
414
-
415
- # TOKENS @, @@, @(
416
- when '@'
417
- case la1
418
- when '@'
419
- emit(TOKEN_ATAT, before) # TODO; Check if this is good for the grammar
420
- when '('
421
- heredoc
422
- else
423
- emit(TOKEN_AT, before)
424
- end
425
-
426
- # TOKENS |, |>, |>>
427
- when '|'
428
- emit(case la1
429
- when '>'
430
- la2 == '>' ? TOKEN_RRCOLLECT : TOKEN_RCOLLECT
431
- else
432
- TOKEN_PIPE
433
- end, before)
434
-
435
- # TOKENS =, =>, ==, =~
436
- when '='
437
- emit(case la1
438
- when '='
439
- TOKEN_ISEQUAL
440
- when '>'
441
- TOKEN_FARROW
442
- when '~'
443
- TOKEN_MATCH
444
- else
445
- TOKEN_EQUALS
446
- end, before)
447
-
448
- # TOKENS '+', '+=', and '+>'
449
- when '+'
450
- emit(case la1
451
- when '='
452
- TOKEN_APPENDS
453
- when '>'
454
- TOKEN_PARROW
455
- else
456
- TOKEN_PLUS
457
- end, before)
458
-
459
- # TOKENS '-', '->', and epp '-%>' (end of interpolation with trim)
460
- when '-'
461
- if ctx[:epp_mode] && la1 == '%' && la2 == '>'
462
- scn.pos += 3
463
- if ctx[:epp_mode] == :expr
464
- enqueue_completed(TOKEN_EPPEND_TRIM, before)
465
- end
466
- interpolate_epp(:with_trim)
467
- else
468
- emit(case la1
469
- when '>'
470
- TOKEN_IN_EDGE
471
- when '='
472
- TOKEN_DELETES
473
- else
474
- TOKEN_MINUS
475
- end, before)
476
- end
477
-
478
- # TOKENS !, !=, !~
479
- when '!'
480
- emit(case la1
481
- when '='
482
- TOKEN_NOTEQUAL
483
- when '~'
484
- TOKEN_NOMATCH
485
- else
486
- TOKEN_NOT
487
- end, before)
488
-
489
- # TOKENS ~>, ~
490
- when '~'
491
- emit(la1 == '>' ? TOKEN_IN_EDGE_SUB : TOKEN_TILDE, before)
492
-
493
- when '#'
494
- scn.skip(PATTERN_COMMENT)
495
- nil
496
-
497
- # TOKENS '/', '/*' and '/ regexp /'
498
- when '/'
499
- case la1
500
- when '*'
501
- scn.skip(PATTERN_MLCOMMENT)
502
- nil
503
-
504
- else
505
- # regexp position is a regexp, else a div
506
- if regexp_acceptable? && value = scn.scan(PATTERN_REGEX)
507
- # Ensure an escaped / was not matched
508
- while value[-2..-2] == STRING_BSLASH_BSLASH # i.e. \\
509
- value += scn.scan_until(PATTERN_REGEX_END)
510
- end
511
- regex = value.sub(PATTERN_REGEX_A, '').sub(PATTERN_REGEX_Z, '').gsub(PATTERN_REGEX_ESC, '/')
512
- emit_completed([:REGEX, Regexp.new(regex), scn.pos-before], before)
513
- else
514
- emit(TOKEN_DIV, before)
515
- end
516
- end
517
-
518
- # TOKENS <, <=, <|, <<|, <<, <-, <~
519
- when '<'
520
- emit(case la1
521
- when '<'
522
- if la2 == '|'
523
- TOKEN_LLCOLLECT
524
- else
525
- TOKEN_LSHIFT
526
- end
527
- when '='
528
- TOKEN_LESSEQUAL
529
- when '|'
530
- TOKEN_LCOLLECT
531
- when '-'
532
- TOKEN_OUT_EDGE
533
- when '~'
534
- TOKEN_OUT_EDGE_SUB
535
- else
536
- TOKEN_LESSTHAN
537
- end, before)
538
-
539
- # TOKENS >, >=, >>
540
- when '>'
541
- emit(case la1
542
- when '>'
543
- TOKEN_RSHIFT
544
- when '='
545
- TOKEN_GREATEREQUAL
546
- else
547
- TOKEN_GREATERTHAN
548
- end, before)
549
-
550
- # TOKENS :, ::CLASSREF, ::NAME
551
- when ':'
552
- if la1 == ':'
553
- before = scn.pos
554
- # PERFORMANCE NOTE: This could potentially be speeded up by using a case/when listing all
555
- # upper case letters. Alternatively, the 'A', and 'Z' comparisons may be faster if they are
556
- # frozen.
557
- #
558
- if la2 >= 'A' && la2 <= 'Z'
559
- # CLASSREF or error
560
- value = scn.scan(PATTERN_CLASSREF)
561
- if value && scn.peek(2) != '::'
562
- after = scn.pos
563
- emit_completed([:CLASSREF, value.freeze, after-before], before)
564
- else
565
- # move to faulty position ('::<uc-letter>' was ok)
566
- scn.pos = scn.pos + 3
567
- lex_error(Puppet::Pops::Issues::ILLEGAL_FULLY_QUALIFIED_CLASS_REFERENCE)
568
- end
569
- else
570
- value = scn.scan(PATTERN_BARE_WORD)
571
- if value
572
- if value =~ PATTERN_NAME
573
- emit_completed([:NAME, value.freeze, scn.pos-before], before)
574
- else
575
- emit_completed([:WORD, value.freeze, scn.pos - before], before)
576
- end
577
- else
578
- # move to faulty position ('::' was ok)
579
- scn.pos = scn.pos + 2
580
- lex_error(Puppet::Pops::Issues::ILLEGAL_FULLY_QUALIFIED_NAME)
581
- end
582
- end
583
- else
584
- emit(TOKEN_COLON, before)
585
- end
586
-
587
- when '$'
588
- if value = scn.scan(PATTERN_DOLLAR_VAR)
589
- emit_completed([:VARIABLE, value[1..-1].freeze, scn.pos - before], before)
590
- else
591
- # consume the $ and let higher layer complain about the error instead of getting a syntax error
592
- emit(TOKEN_VARIABLE_EMPTY, before)
593
- end
594
-
595
- when '"'
596
- # Recursive string interpolation, 'interpolate' either returns a STRING token, or
597
- # a DQPRE with the rest of the string's tokens placed in the @token_queue
598
- interpolate_dq
599
-
600
- when "'"
601
- emit_completed([:STRING, slurp_sqstring.freeze, scn.pos - before], before)
602
-
603
- when '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
604
- value = scn.scan(PATTERN_NUMBER)
605
- if value
606
- length = scn.pos - before
607
- assert_numeric(value, before)
608
- emit_completed([:NUMBER, value.freeze, length], before)
609
- else
610
- invalid_number = scn.scan_until(PATTERN_NON_WS)
611
- if before > 1
612
- after = scn.pos
613
- scn.pos = before - 1
614
- if scn.peek(1) == '.'
615
- # preceded by a dot. Is this a bad decimal number then?
616
- scn.pos = before - 2
617
- while scn.peek(1) =~ /^\d$/
618
- invalid_number = nil
619
- before = scn.pos
620
- break if before == 0
621
- scn.pos = scn.pos - 1
622
- end
623
- end
624
- scn.pos = before
625
- invalid_number = scn.peek(after - before) unless invalid_number
626
- end
627
- length = scn.pos - before
628
- assert_numeric(invalid_number, before)
629
- scn.pos = before + 1
630
- lex_error(Puppet::Pops::Issues::ILLEGAL_NUMBER, {:value => invalid_number})
631
- end
632
-
633
- when 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
634
- 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '_'
635
-
636
- value = scn.scan(PATTERN_BARE_WORD)
637
- if value && value =~ PATTERN_NAME
638
- emit_completed(KEYWORDS[value] || @appm_keywords[value] || [:NAME, value.freeze, scn.pos - before], before)
639
- elsif value
640
- emit_completed([:WORD, value.freeze, scn.pos - before], before)
641
- else
642
- # move to faulty position ([a-z_] was ok)
643
- scn.pos = scn.pos + 1
644
- fully_qualified = scn.match?(/::/)
645
- if fully_qualified
646
- lex_error(Puppet::Pops::Issues::ILLEGAL_FULLY_QUALIFIED_NAME)
647
- else
648
- lex_error(Puppet::Pops::Issues::ILLEGAL_NAME_OR_BARE_WORD)
649
- end
650
- end
651
-
652
- when 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
653
- 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
654
- value = scn.scan(PATTERN_CLASSREF)
655
- if value && scn.peek(2) != '::'
656
- emit_completed([:CLASSREF, value.freeze, scn.pos - before], before)
657
- else
658
- # move to faulty position ([A-Z] was ok)
659
- scn.pos = scn.pos + 1
660
- lex_error(Puppet::Pops::Issues::ILLEGAL_CLASS_REFERENCE)
661
- end
662
-
663
- when "\n"
664
- # If heredoc_cont is in effect there are heredoc text lines to skip over
665
- # otherwise just skip the newline.
666
- #
667
- if ctx[:newline_jump]
668
- scn.pos = ctx[:newline_jump]
669
- ctx[:newline_jump] = nil
670
- else
671
- scn.pos += 1
672
- end
673
- return nil
674
-
675
- when ' ', "\t", "\r"
676
- scn.skip(PATTERN_WS)
677
- return nil
678
-
679
- else
680
- # In case of unicode spaces of various kinds that are captured by a regexp, but not by the
681
- # simpler case expression above (not worth handling those special cases with better performance).
682
- if scn.skip(PATTERN_WS)
683
- nil
684
- else
685
- # "unrecognized char"
686
- emit([:OTHER, la0, 1], before)
687
- end
688
- end
711
+ @selector[@scanner.peek(1)].call
689
712
  end
690
713
 
691
714
  # Emits (produces) a token [:tokensymbol, TokenValue] and moves the scanner's position past the token
@@ -741,3 +764,5 @@ class Puppet::Pops::Parser::Lexer2
741
764
  end
742
765
 
743
766
  end
767
+ end
768
+ end