puppet 4.3.2 → 4.4.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 (487) hide show
  1. checksums.yaml +4 -4
  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/debian/README.source +1 -1
  9. data/ext/debian/control +1 -1
  10. data/ext/debian/copyright +4 -4
  11. data/ext/debian/puppetmaster.README.debian +11 -9
  12. data/ext/emacs/puppet-mode.el +1 -1
  13. data/ext/envpuppet +2 -2
  14. data/ext/ips/puppetagent.xml +1 -1
  15. data/ext/ips/puppetmaster.xml +1 -1
  16. data/ext/project_data.yaml +8 -0
  17. data/ext/puppet-test +3 -3
  18. data/ext/rack/example-passenger-vhost.conf +1 -1
  19. data/ext/redhat/puppet.spec.erb +2 -2
  20. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  21. data/ext/solaris/pkginfo +1 -1
  22. data/ext/solaris/smf/puppet.xml +1 -1
  23. data/ext/suse/puppet.spec +2 -2
  24. data/ext/upload_facts.rb +1 -1
  25. data/ext/windows/puppet_interactive.bat +6 -0
  26. data/ext/windows/puppet_shell.bat +9 -0
  27. data/ext/windows/run_puppet_interactive.bat +9 -0
  28. data/ext/yaml_nodes.rb +1 -1
  29. data/install.rb +30 -20
  30. data/lib/puppet/agent.rb +1 -1
  31. data/lib/puppet/application/agent.rb +4 -2
  32. data/lib/puppet/application/apply.rb +7 -4
  33. data/lib/puppet/application/cert.rb +1 -1
  34. data/lib/puppet/application/device.rb +1 -1
  35. data/lib/puppet/application/filebucket.rb +1 -1
  36. data/lib/puppet/application/inspect.rb +1 -1
  37. data/lib/puppet/application/lookup.rb +4 -4
  38. data/lib/puppet/application/master.rb +2 -2
  39. data/lib/puppet/application/resource.rb +1 -1
  40. data/lib/puppet/configurer.rb +100 -22
  41. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  42. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  43. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  44. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  45. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  46. data/lib/puppet/defaults.rb +65 -19
  47. data/lib/puppet/environments.rb +3 -1
  48. data/lib/puppet/face/config.rb +1 -1
  49. data/lib/puppet/face/epp.rb +1 -1
  50. data/lib/puppet/face/help/man.erb +1 -1
  51. data/lib/puppet/face/module/install.rb +6 -6
  52. data/lib/puppet/face/parser.rb +12 -9
  53. data/lib/puppet/face/status.rb +2 -1
  54. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  55. data/lib/puppet/feature/telnet.rb +9 -0
  56. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  57. data/lib/puppet/file_serving/metadata.rb +18 -2
  58. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  59. data/lib/puppet/file_system.rb +2 -2
  60. data/lib/puppet/file_system/file_impl.rb +2 -2
  61. data/lib/puppet/file_system/memory_impl.rb +1 -1
  62. data/lib/puppet/file_system/uniquefile.rb +1 -1
  63. data/lib/puppet/forge.rb +1 -1
  64. data/lib/puppet/forge/repository.rb +1 -31
  65. data/lib/puppet/functions.rb +45 -6
  66. data/lib/puppet/functions/assert_type.rb +9 -9
  67. data/lib/puppet/functions/each.rb +5 -13
  68. data/lib/puppet/functions/filter.rb +5 -14
  69. data/lib/puppet/functions/map.rb +6 -14
  70. data/lib/puppet/functions/reduce.rb +5 -13
  71. data/lib/puppet/functions/reverse_each.rb +82 -0
  72. data/lib/puppet/functions/scanf.rb +15 -18
  73. data/lib/puppet/functions/slice.rb +22 -36
  74. data/lib/puppet/functions/split.rb +2 -2
  75. data/lib/puppet/functions/step.rb +88 -0
  76. data/lib/puppet/functions/type.rb +70 -0
  77. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  78. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  79. data/lib/puppet/indirector/file_content/http.rb +15 -0
  80. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  81. data/lib/puppet/indirector/generic_http.rb +16 -0
  82. data/lib/puppet/indirector/node/exec.rb +1 -1
  83. data/lib/puppet/indirector/node/ldap.rb +1 -1
  84. data/lib/puppet/indirector/rest.rb +2 -1
  85. data/lib/puppet/info_service/class_information_service.rb +13 -12
  86. data/lib/puppet/loaders.rb +1 -0
  87. data/lib/puppet/module.rb +3 -0
  88. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  89. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  90. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  91. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  92. data/lib/puppet/network/http/pool.rb +9 -0
  93. data/lib/puppet/node.rb +1 -1
  94. data/lib/puppet/node/environment.rb +11 -2
  95. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  96. data/lib/puppet/parser/compiler.rb +3 -3
  97. data/lib/puppet/parser/environment_compiler.rb +0 -1
  98. data/lib/puppet/parser/functions.rb +28 -16
  99. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  100. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  101. data/lib/puppet/parser/functions/map.rb +1 -1
  102. data/lib/puppet/parser/functions/scanf.rb +15 -26
  103. data/lib/puppet/parser/functions/slice.rb +17 -24
  104. data/lib/puppet/parser/functions/split.rb +1 -1
  105. data/lib/puppet/parser/resource.rb +19 -17
  106. data/lib/puppet/parser/scope.rb +176 -5
  107. data/lib/puppet/plugins/data_providers/data_provider.rb +54 -13
  108. data/lib/puppet/pops.rb +0 -8
  109. data/lib/puppet/pops/adaptable.rb +4 -1
  110. data/lib/puppet/pops/adapters.rb +38 -13
  111. data/lib/puppet/pops/binder/binder.rb +21 -17
  112. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  113. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  114. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  115. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  116. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  117. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  118. data/lib/puppet/pops/binder/injector.rb +53 -48
  119. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  120. data/lib/puppet/pops/binder/producers.rb +67 -62
  121. data/lib/puppet/pops/evaluator/access_operator.rb +95 -93
  122. data/lib/puppet/pops/evaluator/closure.rb +84 -68
  123. data/lib/puppet/pops/evaluator/collector_transformer.rb +18 -14
  124. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  125. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  126. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  127. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  128. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  129. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  130. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  131. data/lib/puppet/pops/evaluator/runtime3_support.rb +41 -45
  132. data/lib/puppet/pops/issue_reporter.rb +6 -4
  133. data/lib/puppet/pops/issues.rb +34 -11
  134. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  135. data/lib/puppet/pops/loader/loader.rb +1 -1
  136. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  137. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  138. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +16 -12
  139. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  140. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  141. data/lib/puppet/pops/loaders.rb +51 -9
  142. data/lib/puppet/pops/lookup.rb +14 -12
  143. data/lib/puppet/pops/merge_strategy.rb +16 -19
  144. data/lib/puppet/pops/model/factory.rb +26 -2
  145. data/lib/puppet/pops/model/model.rb +8 -8
  146. data/lib/puppet/pops/model/model_label_provider.rb +13 -7
  147. data/lib/puppet/pops/model/model_meta.rb +17 -0
  148. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  149. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  150. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  151. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  152. data/lib/puppet/pops/parser/evaluating_parser.rb +14 -10
  153. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  154. data/lib/puppet/pops/parser/lexer2.rb +26 -19
  155. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  156. data/lib/puppet/pops/parser/locator.rb +21 -0
  157. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  158. data/lib/puppet/pops/parser/slurp_support.rb +11 -7
  159. data/lib/puppet/pops/types/class_loader.rb +23 -19
  160. data/lib/puppet/pops/types/enumeration.rb +9 -26
  161. data/lib/puppet/pops/types/iterable.rb +308 -0
  162. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  163. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  164. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  165. data/lib/puppet/pops/types/type_calculator.rb +138 -381
  166. data/lib/puppet/pops/types/type_factory.rb +91 -57
  167. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  168. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  169. data/lib/puppet/pops/types/type_parser.rb +159 -112
  170. data/lib/puppet/pops/types/types.rb +2057 -1247
  171. data/lib/puppet/pops/utils.rb +11 -10
  172. data/lib/puppet/pops/validation.rb +11 -9
  173. data/lib/puppet/pops/validation/checker4_0.rb +83 -55
  174. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  175. data/lib/puppet/provider/aixobject.rb +1 -1
  176. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  177. data/lib/puppet/provider/cron/crontab.rb +1 -1
  178. data/lib/puppet/provider/exec/windows.rb +1 -1
  179. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  180. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  181. data/lib/puppet/provider/package/appdmg.rb +3 -2
  182. data/lib/puppet/provider/package/dnf.rb +1 -1
  183. data/lib/puppet/provider/package/pip.rb +5 -8
  184. data/lib/puppet/provider/package/pip3.rb +1 -1
  185. data/lib/puppet/provider/package/pkg.rb +1 -1
  186. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  187. data/lib/puppet/provider/package/pkgng.rb +13 -4
  188. data/lib/puppet/provider/package/windows.rb +1 -1
  189. data/lib/puppet/provider/package/yum.rb +1 -1
  190. data/lib/puppet/provider/package/zypper.rb +19 -0
  191. data/lib/puppet/provider/service/debian.rb +2 -2
  192. data/lib/puppet/provider/service/launchd.rb +6 -18
  193. data/lib/puppet/provider/service/systemd.rb +9 -2
  194. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  195. data/lib/puppet/provider/user/aix.rb +1 -1
  196. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  197. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  198. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  199. data/lib/puppet/reference/configuration.rb +1 -1
  200. data/lib/puppet/reference/providers.rb +1 -1
  201. data/lib/puppet/resource.rb +15 -12
  202. data/lib/puppet/resource/capability_finder.rb +20 -13
  203. data/lib/puppet/resource/catalog.rb +60 -3
  204. data/lib/puppet/resource/status.rb +11 -2
  205. data/lib/puppet/resource/type.rb +28 -38
  206. data/lib/puppet/settings.rb +1 -1
  207. data/lib/puppet/settings/config_file.rb +1 -1
  208. data/lib/puppet/settings/environment_conf.rb +13 -5
  209. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  210. data/lib/puppet/ssl/certificate_request.rb +4 -4
  211. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  212. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  213. data/lib/puppet/test/test_helper.rb +16 -4
  214. data/lib/puppet/transaction.rb +15 -2
  215. data/lib/puppet/transaction/additional_resource_generator.rb +6 -2
  216. data/lib/puppet/transaction/report.rb +31 -1
  217. data/lib/puppet/transaction/resource_harness.rb +0 -25
  218. data/lib/puppet/type.rb +11 -11
  219. data/lib/puppet/type/augeas.rb +1 -1
  220. data/lib/puppet/type/cron.rb +12 -12
  221. data/lib/puppet/type/file.rb +91 -39
  222. data/lib/puppet/type/file/checksum_value.rb +53 -0
  223. data/lib/puppet/type/file/content.rb +26 -111
  224. data/lib/puppet/type/file/data_sync.rb +84 -0
  225. data/lib/puppet/type/file/ensure.rb +17 -14
  226. data/lib/puppet/type/file/selcontext.rb +1 -1
  227. data/lib/puppet/type/file/source.rb +103 -18
  228. data/lib/puppet/type/filebucket.rb +1 -1
  229. data/lib/puppet/type/interface.rb +8 -3
  230. data/lib/puppet/type/macauthorization.rb +1 -1
  231. data/lib/puppet/type/package.rb +6 -0
  232. data/lib/puppet/type/schedule.rb +1 -1
  233. data/lib/puppet/type/stage.rb +1 -1
  234. data/lib/puppet/type/user.rb +19 -17
  235. data/lib/puppet/type/yumrepo.rb +20 -0
  236. data/lib/puppet/util.rb +109 -22
  237. data/lib/puppet/util/autoload.rb +16 -11
  238. data/lib/puppet/util/checksums.rb +74 -31
  239. data/lib/puppet/util/execution.rb +1 -1
  240. data/lib/puppet/util/http_proxy.rb +72 -0
  241. data/lib/puppet/util/log.rb +2 -0
  242. data/lib/puppet/util/logging.rb +43 -1
  243. data/lib/puppet/util/monkey_patches.rb +2 -2
  244. data/lib/puppet/util/multi_match.rb +51 -0
  245. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  246. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  247. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  248. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  249. data/lib/puppet/util/plist.rb +130 -0
  250. data/lib/puppet/util/resource_template.rb +1 -1
  251. data/lib/puppet/util/run_mode.rb +2 -2
  252. data/lib/puppet/util/skip_tags.rb +9 -0
  253. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  254. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  255. data/lib/puppet/util/windows/adsi.rb +4 -4
  256. data/lib/puppet/util/windows/api_types.rb +24 -18
  257. data/lib/puppet/util/windows/com.rb +3 -3
  258. data/lib/puppet/util/windows/error.rb +1 -1
  259. data/lib/puppet/util/windows/file.rb +8 -8
  260. data/lib/puppet/util/windows/principal.rb +23 -14
  261. data/lib/puppet/util/windows/process.rb +78 -11
  262. data/lib/puppet/util/windows/registry.rb +1 -1
  263. data/lib/puppet/util/windows/root_certs.rb +5 -5
  264. data/lib/puppet/util/windows/security.rb +33 -35
  265. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  266. data/lib/puppet/util/windows/sid.rb +42 -4
  267. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  268. data/lib/puppet/util/windows/user.rb +10 -10
  269. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  270. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  271. data/lib/puppet/vendor/pathspec/README.md +1 -1
  272. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  273. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  274. data/lib/puppet/version.rb +1 -1
  275. data/lib/semver.rb +17 -1
  276. data/man/man5/puppet.conf.5 +12 -12
  277. data/man/man8/extlookup2hiera.8 +1 -1
  278. data/man/man8/puppet-agent.8 +2 -2
  279. data/man/man8/puppet-apply.8 +2 -2
  280. data/man/man8/puppet-ca.8 +2 -2
  281. data/man/man8/puppet-catalog.8 +2 -2
  282. data/man/man8/puppet-cert.8 +2 -2
  283. data/man/man8/puppet-certificate.8 +2 -2
  284. data/man/man8/puppet-certificate_request.8 +2 -2
  285. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  286. data/man/man8/puppet-config.8 +3 -3
  287. data/man/man8/puppet-describe.8 +1 -1
  288. data/man/man8/puppet-device.8 +1 -1
  289. data/man/man8/puppet-doc.8 +1 -1
  290. data/man/man8/puppet-epp.8 +2 -2
  291. data/man/man8/puppet-facts.8 +2 -2
  292. data/man/man8/puppet-file.8 +2 -2
  293. data/man/man8/puppet-filebucket.8 +2 -2
  294. data/man/man8/puppet-help.8 +2 -2
  295. data/man/man8/puppet-inspect.8 +2 -2
  296. data/man/man8/puppet-key.8 +2 -2
  297. data/man/man8/puppet-man.8 +2 -2
  298. data/man/man8/puppet-master.8 +2 -2
  299. data/man/man8/puppet-module.8 +9 -9
  300. data/man/man8/puppet-node.8 +2 -2
  301. data/man/man8/puppet-parser.8 +2 -2
  302. data/man/man8/puppet-plugin.8 +2 -2
  303. data/man/man8/puppet-report.8 +2 -2
  304. data/man/man8/puppet-resource.8 +2 -2
  305. data/man/man8/puppet-resource_type.8 +2 -2
  306. data/man/man8/puppet-status.8 +3 -3
  307. data/man/man8/puppet.8 +1 -1
  308. data/spec/fixtures/module.tar.gz +0 -0
  309. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  310. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  311. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  312. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  313. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  314. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  315. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  316. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  317. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  318. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  319. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  320. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  321. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +3 -1
  322. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  323. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  324. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  325. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  326. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  327. 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
  328. 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
  329. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  330. 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
  331. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  332. 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
  333. 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
  334. data/spec/integration/defaults_spec.rb +14 -2
  335. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  336. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  337. data/spec/integration/node/environment_spec.rb +13 -0
  338. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  339. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  340. data/spec/integration/parser/undef_param_spec.rb +8 -0
  341. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  342. data/spec/integration/test/test_helper_spec.rb +28 -0
  343. data/spec/integration/transaction/report_spec.rb +16 -0
  344. data/spec/integration/transaction_spec.rb +11 -0
  345. data/spec/integration/type/file_spec.rb +194 -4
  346. data/spec/integration/type/package_spec.rb +5 -1
  347. data/spec/integration/type/tidy_spec.rb +21 -9
  348. data/spec/integration/util/execution_spec.rb +22 -0
  349. data/spec/integration/util/windows/principal_spec.rb +90 -4
  350. data/spec/integration/util/windows/process_spec.rb +31 -0
  351. data/spec/integration/util/windows/security_spec.rb +6 -6
  352. data/spec/integration/util/windows/user_spec.rb +1 -1
  353. data/spec/integration/util_spec.rb +49 -27
  354. data/spec/lib/puppet_spec/compiler.rb +17 -0
  355. data/spec/lib/puppet_spec/files.rb +2 -2
  356. data/spec/lib/puppet_spec/pops.rb +13 -0
  357. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  358. data/spec/shared_contexts/types_setup.rb +96 -0
  359. data/spec/unit/agent_spec.rb +1 -0
  360. data/spec/unit/application/agent_spec.rb +10 -0
  361. data/spec/unit/application/apply_spec.rb +9 -0
  362. data/spec/unit/configurer/downloader_spec.rb +5 -5
  363. data/spec/unit/configurer_spec.rb +271 -39
  364. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  365. data/spec/unit/defaults_spec.rb +15 -0
  366. data/spec/unit/environments_spec.rb +24 -4
  367. data/spec/unit/face/parser_spec.rb +43 -2
  368. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  369. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  370. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  371. data/spec/unit/file_system_spec.rb +26 -0
  372. data/spec/unit/functions/assert_type_spec.rb +36 -2
  373. data/spec/unit/functions/defined_spec.rb +2 -2
  374. data/spec/unit/functions/epp_spec.rb +11 -3
  375. data/spec/unit/functions/lookup_spec.rb +58 -13
  376. data/spec/unit/functions/regsubst_spec.rb +1 -1
  377. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  378. data/spec/unit/functions/step_spec.rb +113 -0
  379. data/spec/unit/functions/type_spec.rb +35 -0
  380. data/spec/unit/functions4_spec.rb +61 -5
  381. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  382. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  383. data/spec/unit/indirector/indirection_spec.rb +1 -1
  384. data/spec/unit/info_service_spec.rb +94 -32
  385. data/spec/unit/module_spec.rb +14 -0
  386. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  387. data/spec/unit/network/authstore_spec.rb +1 -1
  388. data/spec/unit/network/http/connection_spec.rb +1 -0
  389. data/spec/unit/network/http/pool_spec.rb +30 -0
  390. data/spec/unit/node_spec.rb +1 -1
  391. data/spec/unit/parser/compiler_spec.rb +16 -0
  392. data/spec/unit/parser/scope_spec.rb +28 -11
  393. data/spec/unit/pops/evaluator/access_ops_spec.rb +3 -3
  394. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  395. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +7 -1
  396. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  397. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  398. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  399. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  400. data/spec/unit/pops/loaders/loaders_spec.rb +44 -1
  401. data/spec/unit/pops/parser/lexer2_spec.rb +112 -3
  402. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  403. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  404. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  405. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  406. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  407. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  408. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  409. data/spec/unit/pops/types/type_calculator_spec.rb +275 -373
  410. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  411. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  412. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  413. data/spec/unit/pops/types/types_spec.rb +241 -0
  414. data/spec/unit/pops/validator/validator_spec.rb +100 -43
  415. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  416. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  417. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  418. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  419. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  420. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  421. data/spec/unit/provider/package/pip_spec.rb +47 -34
  422. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  423. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  424. data/spec/unit/provider/package/yum_spec.rb +11 -0
  425. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  426. data/spec/unit/provider/service/launchd_spec.rb +17 -35
  427. data/spec/unit/provider/service/systemd_spec.rb +7 -0
  428. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  429. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  430. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  431. data/spec/unit/resource/catalog_spec.rb +33 -1
  432. data/spec/unit/resource/type_spec.rb +149 -7
  433. data/spec/unit/resource_spec.rb +96 -57
  434. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  435. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  436. data/spec/unit/transaction/report_spec.rb +27 -0
  437. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  438. data/spec/unit/transaction_spec.rb +5 -0
  439. data/spec/unit/type/file/checksum_spec.rb +6 -0
  440. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  441. data/spec/unit/type/file/content_spec.rb +12 -193
  442. data/spec/unit/type/file/source_spec.rb +211 -119
  443. data/spec/unit/type/file_spec.rb +133 -34
  444. data/spec/unit/type/interface_spec.rb +32 -0
  445. data/spec/unit/type/macauthorization_spec.rb +4 -1
  446. data/spec/unit/type/yumrepo_spec.rb +2 -2
  447. data/spec/unit/util/filetype_spec.rb +1 -1
  448. data/spec/unit/util/http_proxy_spec.rb +2 -2
  449. data/spec/unit/util/log/destinations_spec.rb +0 -2
  450. data/spec/unit/util/logging_spec.rb +69 -0
  451. data/spec/unit/util/multi_match_spec.rb +39 -0
  452. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  453. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  454. data/spec/unit/util/plist_spec.rb +110 -0
  455. data/spec/unit/util/resource_template_spec.rb +2 -2
  456. data/spec/unit/util/run_mode_spec.rb +27 -3
  457. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  458. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  459. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  460. data/spec/unit/util/windows/sid_spec.rb +1 -1
  461. data/spec/unit/util_spec.rb +123 -13
  462. data/tasks/cfpropertylist.rake +15 -0
  463. metadata +114 -26
  464. data/lib/puppet/vendor/load_plist.rb +0 -1
  465. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  466. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  467. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  468. data/lib/puppet/vendor/plist/README +0 -36
  469. data/lib/puppet/vendor/plist/Rakefile +0 -144
  470. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  471. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  472. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  473. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  474. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  475. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  476. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  477. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  478. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  479. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  480. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  481. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  482. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  483. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  484. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  485. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  486. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  487. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
@@ -1,8 +1,10 @@
1
+ module Puppet::Pops
2
+ module Parser
1
3
  # This module is an integral part of the Lexer.
2
4
  # It handles scanning of EPP (Embedded Puppet), a form of string/expression interpolation similar to ERB.
3
5
  #
4
6
  require 'strscan'
5
- module Puppet::Pops::Parser::EppSupport
7
+ module EppSupport
6
8
 
7
9
  TOKEN_RENDER_STRING = [:RENDER_STRING, nil, 0]
8
10
  TOKEN_RENDER_EXPR = [:RENDER_EXPR, nil, 0]
@@ -33,7 +35,7 @@ module Puppet::Pops::Parser::EppSupport
33
35
  ctx = @lexing_context
34
36
  queue = @token_queue
35
37
 
36
- lex_error(Puppet::Pops::Issues::EPP_INTERNAL_ERROR, :error => 'No string or file given to lexer to process.') unless scn
38
+ lex_error(Issues::EPP_INTERNAL_ERROR, :error => 'No string or file given to lexer to process.') unless scn
37
39
 
38
40
  ctx[:epp_mode] = :text
39
41
  enqueue_completed([:EPP_START, nil, 0], 0)
@@ -47,7 +49,7 @@ module Puppet::Pops::Parser::EppSupport
47
49
  end
48
50
  end
49
51
  if ctx[:epp_open_position]
50
- lex_error(Puppet::Pops::Issues::EPP_UNBALANCED_TAG, {}, ctx[:epp_position])
52
+ lex_error(Issues::EPP_UNBALANCED_TAG, {}, ctx[:epp_position])
51
53
  end
52
54
 
53
55
  # Signals end of input
@@ -66,7 +68,7 @@ module Puppet::Pops::Parser::EppSupport
66
68
  when :text
67
69
  # Should be at end of scan, or something is terribly wrong
68
70
  unless @scanner.eos?
69
- lex_error(Puppet::Pops::Issues::EPP_INTERNAL_ERROR, :error => 'template scanner returns text mode and is not and end of input')
71
+ lex_error(Issues::EPP_INTERNAL_ERROR, :error => 'template scanner returns text mode and is not and end of input')
70
72
  end
71
73
  if s
72
74
  # s may be nil if scanned text ends with an epp tag (i.e. no trailing text).
@@ -99,7 +101,7 @@ module Puppet::Pops::Parser::EppSupport
99
101
  ctx[:epp_mode] = :expr
100
102
  ctx[:epp_open_position] = scn.pos
101
103
  else
102
- lex_error(Puppet::Pops::Issues::EPP_INTERNAL_ERROR, :error => "Unknown mode #{eppscanner.mode} returned by template scanner")
104
+ lex_error(Issues::EPP_INTERNAL_ERROR, :error => "Unknown mode #{eppscanner.mode} returned by template scanner")
103
105
  end
104
106
  nil
105
107
  end
@@ -198,7 +200,7 @@ module Puppet::Pops::Parser::EppSupport
198
200
  # if s ends with <% then this is an error (unbalanced <% %>)
199
201
  if s.end_with? "<%"
200
202
  @mode = :error
201
- @issue = Puppet::Pops::Issues::EPP_UNBALANCED_EXPRESSION
203
+ @issue = Issues::EPP_UNBALANCED_EXPRESSION
202
204
  else
203
205
  mode = :epp
204
206
  end
@@ -236,7 +238,7 @@ module Puppet::Pops::Parser::EppSupport
236
238
  # preceded by a % (i.e. skip %%>)
237
239
  part = scanner.scan_until(/[^%]%>/)
238
240
  unless part
239
- @issue = Puppet::Pops::Issues::EPP_UNBALANCED_COMMENT
241
+ @issue = Issues::EPP_UNBALANCED_COMMENT
240
242
  @mode = :error
241
243
  return s
242
244
  end
@@ -256,3 +258,5 @@ module Puppet::Pops::Parser::EppSupport
256
258
  end
257
259
 
258
260
  end
261
+ end
262
+ end
@@ -1,12 +1,14 @@
1
+ module Puppet::Pops
2
+ module Parser
1
3
 
2
4
  # Does not support "import" and parsing ruby files
3
5
  #
4
- class Puppet::Pops::Parser::EvaluatingParser
6
+ class EvaluatingParser
5
7
 
6
8
  attr_reader :parser
7
9
 
8
10
  def initialize()
9
- @parser = Puppet::Pops::Parser::Parser.new()
11
+ @parser = Parser.new()
10
12
  end
11
13
 
12
14
  def parse_string(s, file_source = nil)
@@ -49,7 +51,7 @@ class Puppet::Pops::Parser::EvaluatingParser
49
51
 
50
52
  # Create a closure that can be called in the given scope
51
53
  def closure(model, scope)
52
- Puppet::Pops::Evaluator::Closure.new(evaluator, model, scope)
54
+ Evaluator::Closure.new(evaluator, model, scope)
53
55
  end
54
56
 
55
57
  def evaluate(scope, model)
@@ -67,9 +69,9 @@ class Puppet::Pops::Parser::EvaluatingParser
67
69
  def evaluator
68
70
  # Do not use the cached evaluator if this is a migration run
69
71
  if (Puppet.lookup(:migration_checker) { nil })
70
- return Puppet::Pops::Evaluator::EvaluatorImpl.new()
72
+ return Evaluator::EvaluatorImpl.new()
71
73
  end
72
- @@evaluator ||= Puppet::Pops::Evaluator::EvaluatorImpl.new()
74
+ @@evaluator ||= Evaluator::EvaluatorImpl.new()
73
75
  @@evaluator
74
76
  end
75
77
 
@@ -84,11 +86,11 @@ class Puppet::Pops::Parser::EvaluatingParser
84
86
  end
85
87
 
86
88
  def acceptor()
87
- Puppet::Pops::Validation::Acceptor.new
89
+ Validation::Acceptor.new
88
90
  end
89
91
 
90
92
  def validator(acceptor)
91
- Puppet::Pops::Validation::ValidatorFactory_4_0.new().validator(acceptor)
93
+ Validation::ValidatorFactory_4_0.new().validator(acceptor)
92
94
  end
93
95
 
94
96
  def assert_and_report(parse_result)
@@ -98,7 +100,7 @@ class Puppet::Pops::Parser::EvaluatingParser
98
100
  end
99
101
  validation_result = validate(parse_result)
100
102
 
101
- Puppet::Pops::IssueReporter.assert_and_report(validation_result,
103
+ IssueReporter.assert_and_report(validation_result,
102
104
  :emit_warnings => true)
103
105
  parse_result
104
106
  end
@@ -149,9 +151,11 @@ class Puppet::Pops::Parser::EvaluatingParser
149
151
  escaped << '"'
150
152
  end
151
153
 
152
- class EvaluatingEppParser < Puppet::Pops::Parser::EvaluatingParser
154
+ class EvaluatingEppParser < EvaluatingParser
153
155
  def initialize()
154
- @parser = Puppet::Pops::Parser::EppParser.new()
156
+ @parser = EppParser.new()
155
157
  end
156
158
  end
157
159
  end
160
+ end
161
+ end
@@ -1,5 +1,7 @@
1
- module Puppet::Pops::Parser::HeredocSupport
2
- include Puppet::Pops::Parser::LexerSupport
1
+ module Puppet::Pops
2
+ module Parser
3
+ module HeredocSupport
4
+ include LexerSupport
3
5
 
4
6
  # Pattern for heredoc `@(endtag[:syntax][/escapes])
5
7
  # Produces groups for endtag (group 1), syntax (group 2), and escapes (group 3)
@@ -15,12 +17,12 @@ module Puppet::Pops::Parser::HeredocSupport
15
17
 
16
18
  # scanner is at position before @(
17
19
  # find end of the heredoc spec
18
- str = scn.scan_until(/\)/) || lex_error(Puppet::Pops::Issues::HEREDOC_UNCLOSED_PARENTHESIS, :followed_by => followed_by)
20
+ str = scn.scan_until(/\)/) || lex_error(Issues::HEREDOC_UNCLOSED_PARENTHESIS, :followed_by => followed_by)
19
21
  pos_after_heredoc = scn.pos
20
22
 
21
23
  # Note: allows '+' as separator in syntax, but this needs validation as empty segments are not allowed
22
24
  md = str.match(PATTERN_HEREDOC)
23
- lex_error(Puppet::Pops::Issues::HEREDOC_INVALID_SYNTAX) unless md
25
+ lex_error(Issues::HEREDOC_INVALID_SYNTAX) unless md
24
26
  endtag = md[1]
25
27
  syntax = md[2] || ''
26
28
  escapes = md[3]
@@ -33,7 +35,7 @@ module Puppet::Pops::Parser::HeredocSupport
33
35
  endtag = $1.strip
34
36
  end
35
37
 
36
- lex_error(Puppet::Pops::Issues::HEREDOC_MISSING_ENDTAG) unless endtag.length >= 1
38
+ lex_error(Issues::HEREDOC_MISSING_ENDTAG) unless endtag.length >= 1
37
39
 
38
40
  resulting_escapes = []
39
41
  if escapes
@@ -41,7 +43,7 @@ module Puppet::Pops::Parser::HeredocSupport
41
43
 
42
44
  escapes = escapes.split('')
43
45
  unless escapes.length == escapes.uniq.length
44
- lex_error(Puppet::Pops::Issues::HEREDOC_MULTIPLE_AT_ESCAPES, :escapes => escapes)
46
+ lex_error(Issues::HEREDOC_MULTIPLE_AT_ESCAPES, :escapes => escapes)
45
47
  end
46
48
  resulting_escapes = ["\\"]
47
49
  escapes.each do |e|
@@ -51,7 +53,7 @@ module Puppet::Pops::Parser::HeredocSupport
51
53
  when "L"
52
54
  resulting_escapes += ["\n", "\r\n"]
53
55
  else
54
- lex_error(Puppet::Pops::Issues::HEREDOC_INVALID_ESCAPE, :actual => e)
56
+ lex_error(Issues::HEREDOC_INVALID_ESCAPE, :actual => e)
55
57
  end
56
58
  end
57
59
  end
@@ -66,14 +68,14 @@ module Puppet::Pops::Parser::HeredocSupport
66
68
  if ctx[:newline_jump]
67
69
  scn.pos = ctx[:newline_jump]
68
70
  else
69
- scn.scan_until(/\n/) || lex_error(Puppet::Pops::Issues::HEREDOC_WITHOUT_TEXT)
71
+ scn.scan_until(/\n/) || lex_error(Issues::HEREDOC_WITHOUT_TEXT)
70
72
  end
71
73
  # offset 0 for the heredoc, and its line number
72
74
  heredoc_offset = scn.pos
73
75
  heredoc_line = locator.line_for_offset(heredoc_offset)-1
74
76
 
75
77
  # Compute message to emit if there is no end (to make it refer to the opening heredoc position).
76
- eof_error = create_lex_error(Puppet::Pops::Issues::HEREDOC_WITHOUT_END_TAGGED_LINE)
78
+ eof_error = create_lex_error(Issues::HEREDOC_WITHOUT_END_TAGGED_LINE)
77
79
 
78
80
  # Text from this position (+ lexing contexts offset for any preceding heredoc) is heredoc until a line
79
81
  # that terminates the heredoc is found.
@@ -97,13 +99,13 @@ module Puppet::Pops::Parser::HeredocSupport
97
99
 
98
100
  # Use a new lexer instance configured with a sub-locator to enable correct positioning
99
101
  sublexer = self.class.new()
100
- locator = Puppet::Pops::Parser::Locator::SubLocator.sub_locator(str,
102
+ locator = Locator::SubLocator.sub_locator(str,
101
103
  locator.file, heredoc_line, heredoc_offset, leading.length())
102
104
 
103
105
  # Emit a token that provides the grammar with location information about the lines on which the heredoc
104
106
  # content is based.
105
107
  enqueue([:SUBLOCATE,
106
- Puppet::Pops::Parser::LexerSupport::TokenValue.new([:SUBLOCATE,
108
+ LexerSupport::TokenValue.new([:SUBLOCATE,
107
109
  lines, lines.reduce(0) {|size, s| size + s.length} ],
108
110
  heredoc_offset,
109
111
  locator)])
@@ -138,3 +140,5 @@ module Puppet::Pops::Parser::HeredocSupport
138
140
 
139
141
 
140
142
  end
143
+ end
144
+ end
@@ -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
@@ -356,7 +358,7 @@ class Puppet::Pops::Parser::Lexer2
356
358
  scn = @scanner
357
359
  la = scn.peek(2)
358
360
  if la[1] == '*'
359
- lex_error(Puppet::Pops::Issues::UNCLOSED_MLCOMMENT) if scn.skip(PATTERN_MLCOMMENT).nil?
361
+ lex_error(Issues::UNCLOSED_MLCOMMENT) if scn.skip(PATTERN_MLCOMMENT).nil?
360
362
  nil
361
363
  else
362
364
  before = scn.pos
@@ -432,7 +434,7 @@ class Puppet::Pops::Parser::Lexer2
432
434
  else
433
435
  # move to faulty position ('::<uc-letter>' was ok)
434
436
  scn.pos = scn.pos + 3
435
- lex_error(Puppet::Pops::Issues::ILLEGAL_FULLY_QUALIFIED_CLASS_REFERENCE)
437
+ lex_error(Issues::ILLEGAL_FULLY_QUALIFIED_CLASS_REFERENCE)
436
438
  end
437
439
  else
438
440
  value = scn.scan(PATTERN_BARE_WORD)
@@ -445,7 +447,7 @@ class Puppet::Pops::Parser::Lexer2
445
447
  else
446
448
  # move to faulty position ('::' was ok)
447
449
  scn.pos = scn.pos + 2
448
- lex_error(Puppet::Pops::Issues::ILLEGAL_FULLY_QUALIFIED_NAME)
450
+ lex_error(Issues::ILLEGAL_FULLY_QUALIFIED_NAME)
449
451
  end
450
452
  end
451
453
  else
@@ -524,7 +526,7 @@ class Puppet::Pops::Parser::Lexer2
524
526
  length = scn.pos - before
525
527
  assert_numeric(invalid_number, before)
526
528
  scn.pos = before + 1
527
- lex_error(Puppet::Pops::Issues::ILLEGAL_NUMBER, {:value => invalid_number})
529
+ lex_error(Issues::ILLEGAL_NUMBER, {:value => invalid_number})
528
530
  end
529
531
  end
530
532
  end
@@ -544,9 +546,9 @@ class Puppet::Pops::Parser::Lexer2
544
546
  scn.pos = scn.pos + 1
545
547
  fully_qualified = scn.match?(/::/)
546
548
  if fully_qualified
547
- lex_error(Puppet::Pops::Issues::ILLEGAL_FULLY_QUALIFIED_NAME)
549
+ lex_error(Issues::ILLEGAL_FULLY_QUALIFIED_NAME)
548
550
  else
549
- lex_error(Puppet::Pops::Issues::ILLEGAL_NAME_OR_BARE_WORD)
551
+ lex_error(Issues::ILLEGAL_NAME_OR_BARE_WORD)
550
552
  end
551
553
  end
552
554
  end
@@ -563,7 +565,7 @@ class Puppet::Pops::Parser::Lexer2
563
565
  else
564
566
  # move to faulty position ([A-Z] was ok)
565
567
  scn.pos = scn.pos + 1
566
- lex_error(Puppet::Pops::Issues::ILLEGAL_CLASS_REFERENCE)
568
+ lex_error(Issues::ILLEGAL_CLASS_REFERENCE)
567
569
  end
568
570
  end
569
571
  end
@@ -604,20 +606,22 @@ class Puppet::Pops::Parser::Lexer2
604
606
 
605
607
  def lex_string(string, path='')
606
608
  initvars
609
+ assert_not_bom(string)
607
610
  @scanner = StringScanner.new(string)
608
- @locator = Puppet::Pops::Parser::Locator.locator(string, path)
611
+ @locator = Locator.locator(string, path)
609
612
  end
610
613
 
611
614
  # Lexes an unquoted string.
612
615
  # @param string [String] the string to lex
613
- # @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)
614
617
  # @param escapes [Array<String>] array of character strings representing the escape sequences to transform
615
618
  # @param interpolate [Boolean] whether interpolation of expressions should be made or not.
616
619
  #
617
620
  def lex_unquoted_string(string, locator, escapes, interpolate)
618
621
  initvars
622
+ assert_not_bom(string)
619
623
  @scanner = StringScanner.new(string)
620
- @locator = locator || Puppet::Pops::Parser::Locator.locator(string, '')
624
+ @locator = locator || Locator.locator(string, '')
621
625
  @lexing_context[:escapes] = escapes || UQ_ESCAPES
622
626
  @lexing_context[:uq_slurp_pattern] = interpolate ? (escapes.include?('$') ? SLURP_UQ_PATTERN : SLURP_UQNE_PATTERN) : SLURP_ALL_PATTERN
623
627
  end
@@ -640,9 +644,10 @@ class Puppet::Pops::Parser::Lexer2
640
644
  #
641
645
  def lex_file(file)
642
646
  initvars
643
- 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)
644
649
  @scanner = StringScanner.new(contents.freeze)
645
- @locator = Puppet::Pops::Parser::Locator.locator(contents, file)
650
+ @locator = Locator.locator(contents, file)
646
651
  end
647
652
 
648
653
  def initvars
@@ -679,7 +684,7 @@ class Puppet::Pops::Parser::Lexer2
679
684
  # every token in the lexed content.
680
685
  #
681
686
  scn = @scanner
682
- lex_error_without_pos(Puppet::Pops::Issues::NO_INPUT_TO_LEXER) unless scn
687
+ lex_error_without_pos(Issues::NO_INPUT_TO_LEXER) unless scn
683
688
 
684
689
  ctx = @lexing_context
685
690
  queue = @token_queue
@@ -759,3 +764,5 @@ class Puppet::Pops::Parser::Lexer2
759
764
  end
760
765
 
761
766
  end
767
+ end
768
+ end
@@ -1,7 +1,13 @@
1
+
2
+ module Puppet::Pops
3
+ module Parser
4
+
5
+ require 'puppet/util/multi_match'
6
+
1
7
  # This is an integral part of the Lexer. It is broken out into a separate module
2
8
  # for maintainability of the code, and making the various parts of the lexer focused.
3
9
  #
4
- module Puppet::Pops::Parser::LexerSupport
10
+ module LexerSupport
5
11
 
6
12
  # Returns "<eof>" if at end of input, else the following 5 characters with \n \r \t escaped
7
13
  def followed_by
@@ -56,7 +62,7 @@ module Puppet::Pops::Parser::LexerSupport
56
62
  })
57
63
  end
58
64
 
59
- # @param issue [Puppet::Pops::Issues::Issue] the issue
65
+ # @param issue [Issues::Issue] the issue
60
66
  # @param args [Hash<Symbol,String>] Issue arguments
61
67
  # @param pos [Integer]
62
68
  # @return [Puppet::ParseErrorWithIssue] the created error
@@ -75,16 +81,16 @@ module Puppet::Pops::Parser::LexerSupport
75
81
  #
76
82
  def assert_numeric(value, pos)
77
83
  if value =~ /^0[xX]/
78
- lex_error(Puppet::Pops::Issues::INVALID_HEX_NUMBER, {:value => value}, pos) unless value =~ /^0[xX][0-9A-Fa-f]+$/
84
+ lex_error(Issues::INVALID_HEX_NUMBER, {:value => value}, pos) unless value =~ /^0[xX][0-9A-Fa-f]+$/
79
85
 
80
86
  elsif value =~ /^0[^.]/
81
- lex_error(Puppet::Pops::Issues::INVALID_OCTAL_NUMBER, {:value => value}, pos) unless value =~ /^0[0-7]+$/
87
+ lex_error(Issues::INVALID_OCTAL_NUMBER, {:value => value}, pos) unless value =~ /^0[0-7]+$/
82
88
 
83
89
  elsif value =~ /^\d+[eE.]/
84
- lex_error(Puppet::Pops::Issues::INVALID_DECIMAL_NUMBER, {:value => value}, pos) unless value =~ /^\d+(?:\.\d+)?(?:[eE]-?\d+)?$/
90
+ lex_error(Issues::INVALID_DECIMAL_NUMBER, {:value => value}, pos) unless value =~ /^\d+(?:\.\d+)?(?:[eE]-?\d+)?$/
85
91
 
86
92
  else
87
- lex_error(Puppet::Pops::Issues::ILLEGAL_NUMBER, {:value => value}, pos) unless value =~ /^\d+$/
93
+ lex_error(Issues::ILLEGAL_NUMBER, {:value => value}, pos) unless value =~ /^\d+$/
88
94
  end
89
95
  end
90
96
 
@@ -92,7 +98,7 @@ module Puppet::Pops::Parser::LexerSupport
92
98
  # and its position in its source container. There is a cost associated with computing the
93
99
  # line and position on line information.
94
100
  #
95
- class TokenValue < Puppet::Pops::Parser::Locatable
101
+ class TokenValue < Locatable
96
102
  attr_reader :token_array
97
103
  attr_reader :offset
98
104
  attr_reader :locator
@@ -139,4 +145,76 @@ module Puppet::Pops::Parser::LexerSupport
139
145
  #
140
146
  end
141
147
 
148
+
149
+ MM = Puppet::Util::MultiMatch
150
+ MM_ANY = MM::NOT_NIL
151
+
152
+ BOM_UTF_8 = MM.new(0xEF, 0xBB, 0xBF, MM_ANY)
153
+ BOM_UTF_16_1 = MM.new(0xFE, 0xFF, MM_ANY, MM_ANY)
154
+ BOM_UTF_16_2 = MM.new(0xFF, 0xFE, MM_ANY, MM_ANY)
155
+ BOM_UTF_32_1 = MM.new(0x00, 0x00, 0xFE, 0xFF )
156
+ BOM_UTF_32_2 = MM.new(0xFF, 0xFE, 0x00, 0x00 )
157
+
158
+ BOM_UTF_1 = MM.new(0xF7, 0x64, 0x4C, MM_ANY)
159
+ BOM_UTF_EBCDIC = MM.new(0xDD, 0x73, 0x66, 0x73 )
160
+ BOM_SCSU = MM.new(0x0E, 0xFE, 0xFF, MM_ANY)
161
+ BOM_BOCU = MM.new(0xFB, 0xEE, 0x28, MM_ANY)
162
+ BOM_GB_18030 = MM.new(0x84, 0x31, 0x95, 0x33 )
163
+
164
+ LONGEST_BOM = 4
165
+
166
+ def assert_not_bom(content)
167
+ name, size =
168
+ case bom = get_bom(content)
169
+
170
+ when BOM_UTF_32_1, BOM_UTF_32_2
171
+ ['UTF-32', 4]
172
+
173
+ when BOM_GB_18030
174
+ ['GB-18030', 4]
175
+
176
+ when BOM_UTF_EBCDIC
177
+ ['UTF-EBCDIC', 4]
178
+
179
+ when BOM_SCSU
180
+ ['SCSU', 3]
181
+
182
+ when BOM_UTF_8
183
+ ['UTF-8', 3]
184
+
185
+ when BOM_UTF_1
186
+ ['UTF-1', 3]
187
+
188
+ when BOM_BOCU
189
+ ['BOCU', 3]
190
+
191
+ when BOM_UTF_16_1, BOM_UTF_16_2
192
+ ['UTF-16', 2]
193
+
194
+ else
195
+ return
196
+ end
197
+
198
+ lex_error_without_pos(
199
+ Puppet::Pops::Issues::ILLEGAL_BOM,
200
+ { :format_name => name,
201
+ :bytes => "[#{bom.values[0,size].map {|b| "%X" % b}.join(" ")}]"
202
+ })
203
+ end
204
+
205
+ def get_bom(content)
206
+ # get 5 bytes as efficiently as possible (none of the string methods works since a bom consists of
207
+ # illegal characters on most platforms, and there is no get_bytes(n). xplicit calls are faster than
208
+ # looping with a lambda. The get_byte returns nil if there are too few characters, and they
209
+ # are changed to spaces
210
+ MM.new(
211
+ (content.getbyte(0) || ' '),
212
+ (content.getbyte(1) || ' '),
213
+ (content.getbyte(2) || ' '),
214
+ (content.getbyte(3) || ' ')
215
+ )
216
+ end
217
+
218
+ end
219
+ end
142
220
  end