puppet 3.4.3 → 3.5.0.rc1

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 (811) hide show
  1. data/CONTRIBUTING.md +6 -6
  2. data/Gemfile +22 -16
  3. data/LICENSE +1 -1
  4. data/README.md +33 -11
  5. data/Rakefile +1 -1
  6. data/conf/auth.conf +4 -0
  7. data/ext/build_defaults.yaml +1 -1
  8. data/ext/debian/control +6 -6
  9. data/ext/ips/transforms +1 -1
  10. data/ext/nagios/naggen +1 -1
  11. data/ext/project_data.yaml +21 -1
  12. data/ext/puppet-test +3 -3
  13. data/ext/redhat/puppet.spec.erb +28 -2
  14. data/ext/suse/puppet.spec +1 -1
  15. data/ext/upload_facts.rb +1 -1
  16. data/ext/windows/service/daemon.rb +99 -20
  17. data/lib/hiera_puppet.rb +2 -2
  18. data/lib/puppet.rb +68 -5
  19. data/lib/puppet/agent.rb +5 -1
  20. data/lib/puppet/application.rb +20 -11
  21. data/lib/puppet/application/agent.rb +1 -1
  22. data/lib/puppet/application/apply.rb +61 -41
  23. data/lib/puppet/application/cert.rb +3 -3
  24. data/lib/puppet/application/device.rb +7 -8
  25. data/lib/puppet/application/doc.rb +1 -1
  26. data/lib/puppet/application/filebucket.rb +3 -3
  27. data/lib/puppet/application/kick.rb +2 -2
  28. data/lib/puppet/application/master.rb +1 -1
  29. data/lib/puppet/application/queue.rb +9 -9
  30. data/lib/puppet/application/resource.rb +2 -2
  31. data/lib/puppet/bindings.rb +6 -6
  32. data/lib/puppet/configurer.rb +17 -14
  33. data/lib/puppet/configurer/fact_handler.rb +1 -1
  34. data/lib/puppet/confine/any.rb +26 -0
  35. data/lib/puppet/confine/exists.rb +1 -1
  36. data/lib/puppet/confiner.rb +1 -0
  37. data/lib/puppet/context.rb +55 -0
  38. data/lib/puppet/context/trusted_information.rb +56 -0
  39. data/lib/puppet/defaults.rb +97 -26
  40. data/lib/puppet/environments.rb +187 -0
  41. data/lib/puppet/error.rb +2 -1
  42. data/lib/puppet/external/pson/common.rb +1 -1
  43. data/lib/puppet/external/pson/pure/generator.rb +1 -1
  44. data/lib/puppet/external/pson/pure/parser.rb +1 -1
  45. data/lib/puppet/face/config.rb +73 -15
  46. data/lib/puppet/face/file/store.rb +1 -1
  47. data/lib/puppet/face/help.rb +2 -1
  48. data/lib/puppet/face/help/action.erb +1 -0
  49. data/lib/puppet/face/help/face.erb +1 -0
  50. data/lib/puppet/face/help/global.erb +1 -0
  51. data/lib/puppet/face/help/man.erb +9 -8
  52. data/lib/puppet/face/module/list.rb +13 -7
  53. data/lib/puppet/face/node/clean.rb +2 -2
  54. data/lib/puppet/face/parser.rb +11 -5
  55. data/lib/puppet/face/status.rb +1 -1
  56. data/lib/puppet/feature/external_facts.rb +2 -2
  57. data/lib/puppet/feature/libuser.rb +1 -1
  58. data/lib/puppet/feature/msgpack.rb +2 -0
  59. data/lib/puppet/feature/rails.rb +2 -2
  60. data/lib/puppet/file_bucket/dipper.rb +9 -9
  61. data/lib/puppet/file_bucket/file.rb +9 -5
  62. data/lib/puppet/file_serving/base.rb +1 -1
  63. data/lib/puppet/file_serving/configuration.rb +1 -1
  64. data/lib/puppet/file_serving/configuration/parser.rb +3 -3
  65. data/lib/puppet/file_serving/content.rb +2 -2
  66. data/lib/puppet/file_serving/fileset.rb +4 -4
  67. data/lib/puppet/file_serving/metadata.rb +69 -15
  68. data/lib/puppet/file_serving/mount/file.rb +1 -1
  69. data/lib/puppet/file_system.rb +361 -1
  70. data/lib/puppet/file_system/file18.rb +3 -3
  71. data/lib/puppet/file_system/file19.rb +3 -3
  72. data/lib/puppet/file_system/file19windows.rb +18 -23
  73. data/lib/puppet/file_system/file_impl.rb +145 -0
  74. data/lib/puppet/file_system/memory_file.rb +23 -9
  75. data/lib/puppet/file_system/memory_impl.rb +64 -0
  76. data/lib/puppet/forge.rb +4 -3
  77. data/lib/puppet/forge/repository.rb +0 -1
  78. data/lib/puppet/graph/relationship_graph.rb +7 -7
  79. data/lib/puppet/indirector.rb +1 -0
  80. data/lib/puppet/indirector/catalog/compiler.rb +3 -30
  81. data/lib/puppet/indirector/catalog/msgpack.rb +6 -0
  82. data/lib/puppet/indirector/catalog/static_compiler.rb +3 -7
  83. data/lib/puppet/indirector/data_binding/hiera.rb +1 -1
  84. data/lib/puppet/indirector/direct_file_server.rb +2 -2
  85. data/lib/puppet/indirector/exec.rb +1 -1
  86. data/lib/puppet/indirector/face.rb +3 -2
  87. data/lib/puppet/indirector/facts/facter.rb +1 -1
  88. data/lib/puppet/indirector/file_bucket_file/file.rb +25 -15
  89. data/lib/puppet/indirector/file_metadata/file.rb +1 -1
  90. data/lib/puppet/indirector/file_server.rb +1 -1
  91. data/lib/puppet/indirector/indirection.rb +1 -1
  92. data/lib/puppet/indirector/json.rb +4 -4
  93. data/lib/puppet/indirector/key/file.rb +8 -5
  94. data/lib/puppet/indirector/ldap.rb +1 -1
  95. data/lib/puppet/indirector/memory.rb +4 -0
  96. data/lib/puppet/indirector/msgpack.rb +82 -0
  97. data/lib/puppet/indirector/node/exec.rb +1 -1
  98. data/lib/puppet/indirector/node/ldap.rb +3 -3
  99. data/lib/puppet/indirector/node/msgpack.rb +7 -0
  100. data/lib/puppet/indirector/node/yaml.rb +15 -0
  101. data/lib/puppet/indirector/queue.rb +3 -2
  102. data/lib/puppet/indirector/report/msgpack.rb +11 -0
  103. data/lib/puppet/indirector/request.rb +17 -20
  104. data/lib/puppet/indirector/resource/rest.rb +1 -1
  105. data/lib/puppet/indirector/resource_type/parser.rb +3 -13
  106. data/lib/puppet/indirector/rest.rb +6 -7
  107. data/lib/puppet/indirector/ssl_file.rb +7 -7
  108. data/lib/puppet/indirector/yaml.rb +9 -13
  109. data/lib/puppet/metatype/manager.rb +12 -7
  110. data/lib/puppet/module.rb +14 -9
  111. data/lib/puppet/module_tool.rb +21 -26
  112. data/lib/puppet/module_tool/applications/application.rb +1 -1
  113. data/lib/puppet/module_tool/applications/generator.rb +2 -1
  114. data/lib/puppet/module_tool/applications/installer.rb +9 -4
  115. data/lib/puppet/module_tool/applications/uninstaller.rb +10 -7
  116. data/lib/puppet/module_tool/applications/unpacker.rb +1 -1
  117. data/lib/puppet/module_tool/applications/upgrader.rb +11 -8
  118. data/lib/puppet/module_tool/checksums.rb +1 -1
  119. data/lib/puppet/module_tool/contents_description.rb +2 -0
  120. data/lib/puppet/module_tool/dependency.rb +4 -5
  121. data/lib/puppet/module_tool/errors.rb +2 -0
  122. data/lib/puppet/module_tool/install_directory.rb +3 -0
  123. data/lib/puppet/module_tool/metadata.rb +3 -5
  124. data/lib/puppet/module_tool/modulefile.rb +3 -0
  125. data/lib/puppet/module_tool/shared_behaviors.rb +6 -1
  126. data/lib/puppet/module_tool/skeleton.rb +3 -0
  127. data/lib/puppet/module_tool/tar.rb +3 -0
  128. data/lib/puppet/network/auth_config_parser.rb +1 -1
  129. data/lib/puppet/network/authconfig.rb +5 -2
  130. data/lib/puppet/network/authentication.rb +7 -2
  131. data/lib/puppet/network/authorization.rb +2 -2
  132. data/lib/puppet/network/format_support.rb +4 -0
  133. data/lib/puppet/network/formats.rb +9 -14
  134. data/lib/puppet/network/http.rb +11 -0
  135. data/lib/puppet/network/http/api.rb +0 -2
  136. data/lib/puppet/network/http/api/v1.rb +146 -11
  137. data/lib/puppet/network/http/api/v2.rb +32 -0
  138. data/lib/puppet/network/http/api/v2/authorization.rb +13 -0
  139. data/lib/puppet/network/http/api/v2/environments.rb +21 -0
  140. data/lib/puppet/network/http/connection.rb +94 -37
  141. data/lib/puppet/network/http/error.rb +69 -0
  142. data/lib/puppet/network/http/handler.rb +28 -196
  143. data/lib/puppet/network/http/issues.rb +9 -0
  144. data/lib/puppet/network/http/memory_response.rb +13 -0
  145. data/lib/puppet/network/http/rack/rest.rb +10 -18
  146. data/lib/puppet/network/http/request.rb +56 -0
  147. data/lib/puppet/network/http/response.rb +11 -0
  148. data/lib/puppet/network/http/route.rb +91 -0
  149. data/lib/puppet/network/http/webrick.rb +1 -1
  150. data/lib/puppet/network/http/webrick/rest.rb +7 -12
  151. data/lib/puppet/network/http_pool.rb +3 -3
  152. data/lib/puppet/network/rights.rb +4 -4
  153. data/lib/puppet/node.rb +23 -14
  154. data/lib/puppet/node/environment.rb +149 -125
  155. data/lib/puppet/node/facts.rb +6 -5
  156. data/lib/puppet/parameter.rb +1 -1
  157. data/lib/puppet/parser/ast.rb +1 -1
  158. data/lib/puppet/parser/ast/block_expression.rb +1 -6
  159. data/lib/puppet/parser/ast/collexpr.rb +54 -2
  160. data/lib/puppet/parser/ast/lambda.rb +9 -0
  161. data/lib/puppet/parser/ast/leaf.rb +15 -0
  162. data/lib/puppet/parser/ast/pops_bridge.rb +168 -0
  163. data/lib/puppet/parser/code_merger.rb +13 -0
  164. data/lib/puppet/parser/collector.rb +1 -1
  165. data/lib/puppet/parser/compiler.rb +28 -30
  166. data/lib/puppet/parser/e4_parser_adapter.rb +81 -0
  167. data/lib/puppet/parser/e_parser_adapter.rb +0 -1
  168. data/lib/puppet/parser/files.rb +12 -7
  169. data/lib/puppet/parser/functions.rb +36 -29
  170. data/lib/puppet/parser/functions/collect.rb +1 -1
  171. data/lib/puppet/parser/functions/defined.rb +40 -16
  172. data/lib/puppet/parser/functions/each.rb +55 -41
  173. data/lib/puppet/parser/functions/epp.rb +41 -0
  174. data/lib/puppet/parser/functions/extlookup.rb +2 -2
  175. data/lib/puppet/parser/functions/file.rb +1 -1
  176. data/lib/puppet/parser/functions/filter.rb +68 -16
  177. data/lib/puppet/parser/functions/generate.rb +1 -1
  178. data/lib/puppet/parser/functions/include.rb +3 -2
  179. data/lib/puppet/parser/functions/inline_epp.rb +79 -0
  180. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  181. data/lib/puppet/parser/functions/lookup.rb +127 -27
  182. data/lib/puppet/parser/functions/map.rb +64 -12
  183. data/lib/puppet/parser/functions/reduce.rb +40 -16
  184. data/lib/puppet/parser/functions/select.rb +1 -1
  185. data/lib/puppet/parser/functions/slice.rb +42 -23
  186. data/lib/puppet/parser/grammar.ra +3 -0
  187. data/lib/puppet/parser/lexer.rb +10 -9
  188. data/lib/puppet/parser/parser.rb +15 -12
  189. data/lib/puppet/parser/parser_factory.rb +26 -1
  190. data/lib/puppet/parser/parser_support.rb +13 -4
  191. data/lib/puppet/parser/resource.rb +1 -1
  192. data/lib/puppet/parser/scope.rb +246 -97
  193. data/lib/puppet/parser/templatewrapper.rb +1 -1
  194. data/lib/puppet/parser/type_loader.rb +13 -2
  195. data/lib/puppet/pops.rb +15 -1
  196. data/lib/puppet/pops/adapters.rb +64 -32
  197. data/lib/puppet/pops/binder/binder.rb +122 -150
  198. data/lib/puppet/pops/binder/binder_issues.rb +1 -21
  199. data/lib/puppet/pops/binder/bindings_checker.rb +0 -20
  200. data/lib/puppet/pops/binder/bindings_composer.rb +4 -70
  201. data/lib/puppet/pops/binder/bindings_factory.rb +16 -58
  202. data/lib/puppet/pops/binder/bindings_label_provider.rb +0 -3
  203. data/lib/puppet/pops/binder/bindings_loader.rb +13 -4
  204. data/lib/puppet/pops/binder/bindings_model.rb +17 -31
  205. data/lib/puppet/pops/binder/bindings_model_dumper.rb +2 -20
  206. data/lib/puppet/pops/binder/config/binder_config.rb +8 -40
  207. data/lib/puppet/pops/binder/config/binder_config_checker.rb +2 -43
  208. data/lib/puppet/pops/binder/config/issues.rb +1 -21
  209. data/lib/puppet/pops/binder/injector.rb +86 -7
  210. data/lib/puppet/pops/binder/injector_entry.rb +6 -2
  211. data/lib/puppet/pops/binder/key_factory.rb +7 -1
  212. data/lib/puppet/pops/binder/lookup.rb +191 -0
  213. data/lib/puppet/pops/binder/producers.rb +5 -5
  214. data/lib/puppet/pops/binder/scheme_handler/symbolic_scheme.rb +2 -3
  215. data/lib/puppet/pops/binder/system_bindings.rb +4 -16
  216. data/lib/puppet/pops/containment.rb +72 -5
  217. data/lib/puppet/pops/evaluator/access_operator.rb +548 -0
  218. data/lib/puppet/pops/evaluator/closure.rb +57 -0
  219. data/lib/puppet/pops/evaluator/compare_operator.rb +168 -0
  220. data/lib/puppet/pops/evaluator/epp_evaluator.rb +87 -0
  221. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1069 -0
  222. data/lib/puppet/pops/evaluator/external_syntax_support.rb +49 -0
  223. data/lib/puppet/pops/evaluator/relationship_operator.rb +156 -0
  224. data/lib/puppet/pops/evaluator/runtime3_support.rb +489 -0
  225. data/lib/puppet/pops/issue_reporter.rb +8 -4
  226. data/lib/puppet/pops/issues.rb +199 -4
  227. data/lib/puppet/pops/label_provider.rb +5 -0
  228. data/lib/puppet/pops/model/ast_transformer.rb +55 -31
  229. data/lib/puppet/pops/model/ast_tree_dumper.rb +9 -1
  230. data/lib/puppet/pops/model/factory.rb +265 -111
  231. data/lib/puppet/pops/model/model.rb +179 -140
  232. data/lib/puppet/pops/model/model_label_provider.rb +38 -9
  233. data/lib/puppet/pops/model/model_tree_dumper.rb +38 -13
  234. data/lib/puppet/pops/parser/code_merger.rb +17 -0
  235. data/lib/puppet/pops/parser/egrammar.ra +110 -61
  236. data/lib/puppet/pops/parser/eparser.rb +1415 -1092
  237. data/lib/puppet/pops/parser/epp_parser.rb +51 -0
  238. data/lib/puppet/pops/parser/epp_support.rb +247 -0
  239. data/lib/puppet/pops/parser/evaluating_parser.rb +53 -15
  240. data/lib/puppet/pops/parser/heredoc_support.rb +139 -0
  241. data/lib/puppet/pops/parser/interpolation_support.rb +227 -0
  242. data/lib/puppet/pops/parser/lexer.rb +83 -192
  243. data/lib/puppet/pops/parser/lexer2.rb +684 -0
  244. data/lib/puppet/pops/parser/lexer_support.rb +107 -0
  245. data/lib/puppet/pops/parser/locatable.rb +23 -0
  246. data/lib/puppet/pops/parser/locator.rb +291 -0
  247. data/lib/puppet/pops/parser/makefile +1 -8
  248. data/lib/puppet/pops/parser/parser_support.rb +76 -48
  249. data/lib/puppet/pops/parser/slurp_support.rb +95 -0
  250. data/lib/puppet/pops/patterns.rb +13 -4
  251. data/lib/puppet/pops/types/class_loader.rb +2 -2
  252. data/lib/puppet/pops/types/enumeration.rb +34 -0
  253. data/lib/puppet/pops/types/type_calculator.rb +983 -58
  254. data/lib/puppet/pops/types/type_factory.rb +203 -15
  255. data/lib/puppet/pops/types/type_parser.rb +355 -12
  256. data/lib/puppet/pops/types/types.rb +314 -24
  257. data/lib/puppet/pops/utils.rb +23 -7
  258. data/lib/puppet/pops/validation.rb +14 -8
  259. data/lib/puppet/pops/validation/checker3_1.rb +17 -12
  260. data/lib/puppet/pops/validation/checker4_0.rb +514 -0
  261. data/lib/puppet/pops/validation/validator_factory_4_0.rb +31 -0
  262. data/lib/puppet/pops/visitor.rb +146 -4
  263. data/lib/puppet/property.rb +1 -1
  264. data/lib/puppet/property/ensure.rb +1 -1
  265. data/lib/puppet/provider.rb +47 -26
  266. data/lib/puppet/provider/aixobject.rb +3 -3
  267. data/lib/puppet/provider/augeas/augeas.rb +11 -11
  268. data/lib/puppet/provider/cron/crontab.rb +10 -1
  269. data/lib/puppet/provider/exec.rb +1 -1
  270. data/lib/puppet/provider/exec/posix.rb +1 -1
  271. data/lib/puppet/provider/exec/windows.rb +1 -1
  272. data/lib/puppet/provider/file/posix.rb +2 -2
  273. data/lib/puppet/provider/file/windows.rb +15 -9
  274. data/lib/puppet/provider/group/aix.rb +2 -2
  275. data/lib/puppet/provider/macauthorization/macauthorization.rb +3 -3
  276. data/lib/puppet/provider/mount.rb +7 -0
  277. data/lib/puppet/provider/mount/parsed.rb +0 -1
  278. data/lib/puppet/provider/naginator.rb +1 -1
  279. data/lib/puppet/provider/nameservice.rb +3 -3
  280. data/lib/puppet/provider/nameservice/directoryservice.rb +3 -3
  281. data/lib/puppet/provider/package/aix.rb +1 -1
  282. data/lib/puppet/provider/package/appdmg.rb +1 -4
  283. data/lib/puppet/provider/package/apple.rb +1 -1
  284. data/lib/puppet/provider/package/apt.rb +1 -1
  285. data/lib/puppet/provider/package/blastwave.rb +1 -1
  286. data/lib/puppet/provider/package/fink.rb +1 -1
  287. data/lib/puppet/provider/package/gem.rb +3 -3
  288. data/lib/puppet/provider/package/openbsd.rb +6 -4
  289. data/lib/puppet/provider/package/pacman.rb +58 -5
  290. data/lib/puppet/provider/package/pip.rb +2 -2
  291. data/lib/puppet/provider/package/pkgdmg.rb +25 -10
  292. data/lib/puppet/provider/package/pkgin.rb +48 -23
  293. data/lib/puppet/provider/package/pkgutil.rb +1 -1
  294. data/lib/puppet/provider/package/ports.rb +1 -1
  295. data/lib/puppet/provider/package/portupgrade.rb +7 -7
  296. data/lib/puppet/provider/package/rpm.rb +16 -8
  297. data/lib/puppet/provider/package/windows.rb +1 -1
  298. data/lib/puppet/provider/package/windows/package.rb +1 -1
  299. data/lib/puppet/provider/parsedfile.rb +1 -1
  300. data/lib/puppet/provider/selboolean/getsetsebool.rb +1 -1
  301. data/lib/puppet/provider/selmodule/semodule.rb +5 -5
  302. data/lib/puppet/provider/service/base.rb +1 -1
  303. data/lib/puppet/provider/service/bsd.rb +3 -3
  304. data/lib/puppet/provider/service/daemontools.rb +20 -20
  305. data/lib/puppet/provider/service/debian.rb +1 -1
  306. data/lib/puppet/provider/service/freebsd.rb +3 -3
  307. data/lib/puppet/provider/service/gentoo.rb +2 -2
  308. data/lib/puppet/provider/service/init.rb +5 -5
  309. data/lib/puppet/provider/service/launchd.rb +4 -4
  310. data/lib/puppet/provider/service/redhat.rb +2 -2
  311. data/lib/puppet/provider/service/runit.rb +4 -4
  312. data/lib/puppet/provider/service/service.rb +3 -4
  313. data/lib/puppet/provider/service/smf.rb +1 -1
  314. data/lib/puppet/provider/service/src.rb +3 -3
  315. data/lib/puppet/provider/service/systemd.rb +4 -4
  316. data/lib/puppet/provider/service/upstart.rb +22 -7
  317. data/lib/puppet/provider/service/windows.rb +7 -7
  318. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +3 -3
  319. data/lib/puppet/provider/user/aix.rb +5 -5
  320. data/lib/puppet/provider/user/directoryservice.rb +8 -5
  321. data/lib/puppet/provider/user/ldap.rb +1 -1
  322. data/lib/puppet/provider/user/pw.rb +1 -1
  323. data/lib/puppet/provider/user/user_role_add.rb +2 -2
  324. data/lib/puppet/provider/user/useradd.rb +19 -5
  325. data/lib/puppet/provider/yumrepo/inifile.rb +187 -0
  326. data/lib/puppet/provider/zone/solaris.rb +4 -4
  327. data/lib/puppet/rails.rb +16 -11
  328. data/lib/puppet/rails/benchmark.rb +1 -1
  329. data/lib/puppet/rails/resource.rb +5 -1
  330. data/lib/puppet/reference/configuration.rb +1 -1
  331. data/lib/puppet/reference/report.rb +1 -1
  332. data/lib/puppet/relationship.rb +10 -5
  333. data/lib/puppet/reports/http.rb +8 -2
  334. data/lib/puppet/reports/rrdgraph.rb +1 -1
  335. data/lib/puppet/reports/store.rb +3 -3
  336. data/lib/puppet/reports/tagmail.rb +4 -4
  337. data/lib/puppet/resource.rb +37 -44
  338. data/lib/puppet/resource/catalog.rb +18 -20
  339. data/lib/puppet/resource/status.rb +7 -6
  340. data/lib/puppet/resource/type.rb +6 -5
  341. data/lib/puppet/resource/type_collection.rb +2 -2
  342. data/lib/puppet/run.rb +9 -8
  343. data/lib/puppet/settings.rb +395 -244
  344. data/lib/puppet/settings/base_setting.rb +10 -4
  345. data/lib/puppet/settings/config_file.rb +81 -44
  346. data/lib/puppet/settings/directory_setting.rb +1 -2
  347. data/lib/puppet/settings/file_setting.rb +12 -5
  348. data/lib/puppet/settings/ini_file.rb +171 -0
  349. data/lib/puppet/ssl/base.rb +4 -0
  350. data/lib/puppet/ssl/certificate_authority.rb +16 -11
  351. data/lib/puppet/ssl/certificate_authority/interface.rb +3 -2
  352. data/lib/puppet/ssl/certificate_factory.rb +50 -5
  353. data/lib/puppet/ssl/certificate_request.rb +2 -2
  354. data/lib/puppet/ssl/certificate_request_attributes.rb +1 -1
  355. data/lib/puppet/ssl/certificate_revocation_list.rb +3 -1
  356. data/lib/puppet/ssl/host.rb +9 -8
  357. data/lib/puppet/ssl/inventory.rb +1 -1
  358. data/lib/puppet/ssl/key.rb +1 -1
  359. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  360. data/lib/puppet/status.rb +8 -7
  361. data/lib/puppet/test/test_helper.rb +35 -4
  362. data/lib/puppet/transaction/event.rb +6 -5
  363. data/lib/puppet/transaction/report.rb +10 -10
  364. data/lib/puppet/type.rb +1 -3
  365. data/lib/puppet/type/augeas.rb +2 -1
  366. data/lib/puppet/type/cron.rb +41 -11
  367. data/lib/puppet/type/exec.rb +5 -5
  368. data/lib/puppet/type/file.rb +42 -4
  369. data/lib/puppet/type/file/content.rb +5 -6
  370. data/lib/puppet/type/file/ensure.rb +3 -3
  371. data/lib/puppet/type/file/source.rb +12 -6
  372. data/lib/puppet/type/file/target.rb +5 -5
  373. data/lib/puppet/type/k5login.rb +4 -4
  374. data/lib/puppet/type/mount.rb +1 -1
  375. data/lib/puppet/type/package.rb +79 -3
  376. data/lib/puppet/type/resources.rb +34 -5
  377. data/lib/puppet/type/selboolean.rb +1 -1
  378. data/lib/puppet/type/selmodule.rb +1 -1
  379. data/lib/puppet/type/ssh_authorized_key.rb +2 -1
  380. data/lib/puppet/type/sshkey.rb +2 -1
  381. data/lib/puppet/type/tidy.rb +1 -1
  382. data/lib/puppet/type/user.rb +4 -1
  383. data/lib/puppet/type/yumrepo.rb +219 -344
  384. data/lib/puppet/type/zone.rb +15 -5
  385. data/lib/puppet/util.rb +14 -13
  386. data/lib/puppet/util/adsi.rb +19 -3
  387. data/lib/puppet/util/autoload.rb +27 -24
  388. data/lib/puppet/util/backups.rb +6 -6
  389. data/lib/puppet/util/checksums.rb +2 -2
  390. data/lib/puppet/util/classgen.rb +1 -1
  391. data/lib/puppet/util/colors.rb +4 -12
  392. data/lib/puppet/util/command_line.rb +2 -2
  393. data/lib/puppet/util/command_line/trollop.rb +3 -3
  394. data/lib/puppet/util/docs.rb +2 -2
  395. data/lib/puppet/util/errors.rb +8 -1
  396. data/lib/puppet/util/execution.rb +12 -5
  397. data/lib/puppet/util/filetype.rb +5 -5
  398. data/lib/puppet/util/inifile.rb +19 -4
  399. data/lib/puppet/util/instrumentation/data.rb +5 -0
  400. data/lib/puppet/util/instrumentation/indirection_probe.rb +6 -1
  401. data/lib/puppet/util/instrumentation/listener.rb +6 -1
  402. data/lib/puppet/util/json_lockfile.rb +4 -1
  403. data/lib/puppet/util/ldap/connection.rb +1 -1
  404. data/lib/puppet/util/lockfile.rb +10 -6
  405. data/lib/puppet/util/log.rb +6 -1
  406. data/lib/puppet/util/log/destinations.rb +2 -2
  407. data/lib/puppet/util/metric.rb +9 -4
  408. data/lib/puppet/util/nagios_maker.rb +26 -1
  409. data/lib/puppet/util/network_device.rb +1 -1
  410. data/lib/puppet/util/network_device/config.rb +1 -1
  411. data/lib/puppet/util/network_device/transport/ssh.rb +3 -3
  412. data/lib/puppet/util/plugins.rb +1 -1
  413. data/lib/puppet/util/profiler.rb +13 -1
  414. data/lib/puppet/util/pson.rb +1 -1
  415. data/lib/puppet/util/queue/stomp.rb +2 -2
  416. data/lib/puppet/util/rdoc.rb +1 -1
  417. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +1 -1
  418. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +19 -19
  419. data/lib/puppet/util/reference.rb +1 -1
  420. data/lib/puppet/util/resource_template.rb +1 -1
  421. data/lib/puppet/util/retryaction.rb +1 -1
  422. data/lib/puppet/util/selinux.rb +2 -2
  423. data/lib/puppet/util/storage.rb +3 -3
  424. data/lib/puppet/util/symbolic_file_mode.rb +1 -1
  425. data/lib/puppet/util/tag_set.rb +15 -3
  426. data/lib/puppet/util/tagging.rb +12 -17
  427. data/lib/puppet/util/watched_file.rb +1 -1
  428. data/lib/puppet/util/watcher.rb +1 -1
  429. data/lib/puppet/util/windows/error.rb +2 -2
  430. data/lib/puppet/util/windows/file.rb +20 -4
  431. data/lib/puppet/util/windows/registry.rb +2 -2
  432. data/lib/puppet/vendor/safe_yaml/CHANGES.md +1 -1
  433. data/lib/puppet/version.rb +1 -1
  434. data/lib/puppetx.rb +1 -21
  435. data/lib/puppetx/puppet/syntax_checker.rb +1 -1
  436. data/lib/puppetx/puppetlabs/syntax_checkers/json.rb +9 -11
  437. data/spec/fixtures/integration/node/environment/sitedir/00_a.pp +2 -0
  438. data/spec/fixtures/integration/node/environment/sitedir/01_b.pp +6 -0
  439. data/spec/fixtures/{unit/pops/binder/hiera2/yaml_backend/empty/common.yaml → integration/node/environment/sitedir/03_empty.pp} +0 -0
  440. data/spec/fixtures/integration/node/environment/sitedir/04_include.pp +2 -0
  441. data/spec/fixtures/integration/provider/cron/crontab/purged +8 -0
  442. data/spec/fixtures/releases/jamtur01-apache/lib/puppet/provider/a2mod/debian.rb +1 -1
  443. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/binder_config.yaml +3 -12
  444. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/lib/puppet/bindings/confdirtest.rb +10 -0
  445. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome2/lib/puppet/bindings/awesome2/default.rb +20 -0
  446. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/{awesome/lib/puppetx/awesome → awesome2/lib/puppetx/awesome2}/echo_scheme_handler.rb +2 -2
  447. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/bad/lib/puppet/bindings/bad/default.rb +5 -0
  448. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/good/lib/puppet/bindings/good/default.rb +6 -0
  449. data/spec/fixtures/unit/pops/binder/config/binder_config/ok/binder_config.yaml +2 -2
  450. data/spec/fixtures/unit/provider/service/systemd/{list_units → list_units_services} +0 -1
  451. data/spec/integration/agent/logging_spec.rb +1 -1
  452. data/spec/integration/application/apply_spec.rb +78 -3
  453. data/spec/integration/application/doc_spec.rb +3 -2
  454. data/spec/integration/configurer_spec.rb +5 -3
  455. data/spec/integration/directory_environments_spec.rb +50 -0
  456. data/spec/integration/indirector/direct_file_server_spec.rb +1 -1
  457. data/spec/integration/indirector/file_content/file_server_spec.rb +4 -5
  458. data/spec/integration/network/authconfig_spec.rb +4 -4
  459. data/spec/integration/network/formats_spec.rb +1 -1
  460. data/spec/integration/node/environment_spec.rb +67 -15
  461. data/spec/integration/node/facts_spec.rb +1 -1
  462. data/spec/integration/node_spec.rb +1 -1
  463. data/spec/integration/parser/catalog_spec.rb +100 -60
  464. data/spec/integration/parser/compiler_spec.rb +102 -13
  465. data/spec/integration/parser/future_compiler_spec.rb +416 -0
  466. data/spec/integration/parser/parser_spec.rb +44 -105
  467. data/spec/integration/parser/scope_spec.rb +614 -528
  468. data/spec/integration/provider/cron/crontab_spec.rb +21 -0
  469. data/spec/integration/provider/mount_spec.rb +15 -2
  470. data/spec/integration/resource/catalog_spec.rb +1 -1
  471. data/spec/integration/resource/type_collection_spec.rb +3 -4
  472. data/spec/integration/ssl/autosign_spec.rb +1 -1
  473. data/spec/integration/ssl/certificate_revocation_list_spec.rb +1 -1
  474. data/spec/integration/ssl/host_spec.rb +1 -1
  475. data/spec/integration/transaction_spec.rb +13 -13
  476. data/spec/integration/type/exec_spec.rb +2 -2
  477. data/spec/integration/type/file_spec.rb +114 -41
  478. data/spec/integration/type/nagios_spec.rb +80 -0
  479. data/spec/integration/type/tidy_spec.rb +2 -2
  480. data/spec/integration/util/execution_spec.rb +17 -0
  481. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  482. data/spec/integration/util/settings_spec.rb +1 -1
  483. data/spec/integration/util/windows/security_spec.rb +27 -2
  484. data/spec/lib/matchers/include.rb +27 -0
  485. data/spec/lib/matchers/include_spec.rb +32 -0
  486. data/spec/lib/matchers/json.rb +135 -79
  487. data/spec/lib/matchers/match_tokens2.rb +74 -0
  488. data/spec/lib/matchers/resource.rb +35 -0
  489. data/spec/lib/puppet/indirector/indirector_testing/memory.rb +7 -0
  490. data/spec/lib/puppet/indirector/indirector_testing/msgpack.rb +6 -0
  491. data/spec/lib/puppet/indirector_testing.rb +12 -2
  492. data/spec/lib/puppet_spec/files.rb +1 -0
  493. data/spec/lib/puppet_spec/matchers.rb +5 -0
  494. data/spec/lib/puppet_spec/modules.rb +1 -1
  495. data/spec/lib/puppet_spec/scope.rb +14 -0
  496. data/spec/shared_behaviours/file_server_terminus.rb +2 -2
  497. data/spec/spec_helper.rb +47 -17
  498. data/spec/unit/agent_spec.rb +8 -1
  499. data/spec/unit/application/agent_spec.rb +5 -4
  500. data/spec/unit/application/apply_spec.rb +34 -15
  501. data/spec/unit/application/device_spec.rb +27 -32
  502. data/spec/unit/application/doc_spec.rb +4 -4
  503. data/spec/unit/application/filebucket_spec.rb +1 -1
  504. data/spec/unit/application/master_spec.rb +2 -2
  505. data/spec/unit/application_spec.rb +1 -1
  506. data/spec/unit/configurer/downloader_spec.rb +1 -1
  507. data/spec/unit/configurer/fact_handler_spec.rb +5 -16
  508. data/spec/unit/configurer_spec.rb +2 -2
  509. data/spec/unit/confine/exists_spec.rb +5 -5
  510. data/spec/unit/context/trusted_information_spec.rb +124 -0
  511. data/spec/unit/context_spec.rb +74 -0
  512. data/spec/unit/environments_spec.rb +126 -0
  513. data/spec/unit/face/config_spec.rb +31 -16
  514. data/spec/unit/face/module/build_spec.rb +1 -0
  515. data/spec/unit/face/module/install_spec.rb +21 -104
  516. data/spec/unit/face/module/list_spec.rb +52 -36
  517. data/spec/unit/face/module/uninstall_spec.rb +18 -25
  518. data/spec/unit/face/parser_spec.rb +39 -23
  519. data/spec/unit/file_bucket/dipper_spec.rb +2 -2
  520. data/spec/unit/file_serving/base_spec.rb +9 -13
  521. data/spec/unit/file_serving/configuration/parser_spec.rb +8 -2
  522. data/spec/unit/file_serving/configuration_spec.rb +7 -7
  523. data/spec/unit/file_serving/content_spec.rb +7 -12
  524. data/spec/unit/file_serving/fileset_spec.rb +49 -53
  525. data/spec/unit/file_serving/metadata_spec.rb +83 -32
  526. data/spec/unit/file_serving/mount/file_spec.rb +10 -10
  527. data/spec/unit/file_system/tempfile_spec.rb +3 -3
  528. data/spec/unit/file_system_spec.rb +508 -0
  529. data/spec/unit/forge/errors_spec.rb +1 -1
  530. data/spec/unit/forge/repository_spec.rb +1 -3
  531. data/spec/unit/hiera/scope_spec.rb +6 -2
  532. data/spec/unit/hiera_puppet_spec.rb +13 -6
  533. data/spec/unit/indirector/catalog/msgpack_spec.rb +12 -0
  534. data/spec/unit/indirector/catalog/static_compiler_spec.rb +42 -11
  535. data/spec/unit/indirector/direct_file_server_spec.rb +6 -6
  536. data/spec/unit/indirector/facts/facter_spec.rb +5 -5
  537. data/spec/unit/indirector/file_bucket_file/file_spec.rb +4 -4
  538. data/spec/unit/indirector/file_metadata/file_spec.rb +2 -2
  539. data/spec/unit/indirector/file_server_spec.rb +4 -4
  540. data/spec/unit/indirector/json_spec.rb +6 -6
  541. data/spec/unit/indirector/key/file_spec.rb +8 -8
  542. data/spec/unit/indirector/msgpack_spec.rb +191 -0
  543. data/spec/unit/indirector/node/active_record_spec.rb +1 -1
  544. data/spec/unit/indirector/node/ldap_spec.rb +16 -7
  545. data/spec/unit/indirector/node/msgpack_spec.rb +24 -0
  546. data/spec/unit/indirector/node/plain_spec.rb +1 -1
  547. data/spec/unit/indirector/queue_spec.rb +1 -1
  548. data/spec/unit/indirector/report/msgpack_spec.rb +28 -0
  549. data/spec/unit/indirector/request_spec.rb +16 -8
  550. data/spec/unit/indirector/rest_spec.rb +0 -4
  551. data/spec/unit/indirector/ssl_file_spec.rb +12 -11
  552. data/spec/unit/indirector/yaml_spec.rb +4 -4
  553. data/spec/unit/man_spec.rb +32 -0
  554. data/spec/unit/module_spec.rb +60 -46
  555. data/spec/unit/module_tool/applications/checksummer_spec.rb +1 -1
  556. data/spec/unit/module_tool/applications/installer_spec.rb +53 -16
  557. data/spec/unit/module_tool/applications/uninstaller_spec.rb +26 -25
  558. data/spec/unit/module_tool/tar_spec.rb +1 -1
  559. data/spec/unit/module_tool_spec.rb +17 -90
  560. data/spec/unit/network/authconfig_spec.rb +3 -4
  561. data/spec/unit/network/authentication_spec.rb +20 -6
  562. data/spec/unit/network/authorization_spec.rb +11 -1
  563. data/spec/unit/network/formats_spec.rb +32 -9
  564. data/spec/unit/network/http/api/v1_spec.rb +365 -62
  565. data/spec/unit/network/http/api/v2/authorization_spec.rb +57 -0
  566. data/spec/unit/network/http/api/v2/environments_spec.rb +42 -0
  567. data/spec/unit/network/http/api/v2_spec.rb +14 -0
  568. data/spec/unit/network/http/connection_spec.rb +39 -5
  569. data/spec/unit/network/http/error_spec.rb +30 -0
  570. data/spec/unit/network/http/handler_spec.rb +69 -419
  571. data/spec/unit/network/http/rack/rest_spec.rb +20 -28
  572. data/spec/unit/network/http/route_spec.rb +75 -0
  573. data/spec/unit/network/http/webrick/rest_spec.rb +21 -58
  574. data/spec/unit/network/http_pool_spec.rb +3 -3
  575. data/spec/unit/network/rights_spec.rb +2 -2
  576. data/spec/unit/node/environment_spec.rb +108 -89
  577. data/spec/unit/node/facts_spec.rb +5 -12
  578. data/spec/unit/node_spec.rb +22 -22
  579. data/spec/unit/parser/ast/collection_spec.rb +1 -1
  580. data/spec/unit/parser/ast/leaf_spec.rb +2 -0
  581. data/spec/unit/parser/ast/resource_spec.rb +1 -1
  582. data/spec/unit/parser/compiler_spec.rb +5 -3
  583. data/spec/unit/parser/files_spec.rb +40 -50
  584. data/spec/unit/parser/functions/defined_spec.rb +80 -18
  585. data/spec/unit/parser/functions/epp_spec.rb +88 -0
  586. data/spec/unit/parser/functions/fqdn_rand_spec.rb +4 -1
  587. data/spec/unit/parser/functions/generate_spec.rb +6 -2
  588. data/spec/unit/parser/functions/hiera_array_spec.rb +5 -2
  589. data/spec/unit/parser/functions/hiera_hash_spec.rb +4 -1
  590. data/spec/unit/parser/functions/hiera_include_spec.rb +6 -3
  591. data/spec/unit/parser/functions/hiera_spec.rb +5 -2
  592. data/spec/unit/parser/functions/include_spec.rb +0 -1
  593. data/spec/unit/parser/functions/inline_epp_spec.rb +82 -0
  594. data/spec/unit/parser/functions/lookup_spec.rb +66 -16
  595. data/spec/unit/parser/functions_spec.rb +25 -91
  596. data/spec/unit/parser/lexer_spec.rb +1 -1
  597. data/spec/unit/parser/methods/filter_spec.rb +56 -0
  598. data/spec/unit/parser/methods/map_spec.rb +94 -5
  599. data/spec/unit/parser/methods/reduce_spec.rb +10 -0
  600. data/spec/unit/parser/methods/shared.rb +2 -18
  601. data/spec/unit/parser/methods/slice_spec.rb +39 -1
  602. data/spec/unit/parser/parser_spec.rb +14 -10
  603. data/spec/unit/parser/resource_spec.rb +3 -9
  604. data/spec/unit/parser/scope_spec.rb +81 -78
  605. data/spec/unit/parser/type_loader_spec.rb +0 -4
  606. data/spec/unit/pops/benchmark_spec.rb +142 -0
  607. data/spec/unit/pops/binder/binder_spec.rb +15 -34
  608. data/spec/unit/pops/binder/bindings_checker_spec.rb +0 -41
  609. data/spec/unit/pops/binder/bindings_composer_spec.rb +6 -31
  610. data/spec/unit/pops/binder/config/binder_config_spec.rb +5 -18
  611. data/spec/unit/pops/binder/injector_spec.rb +76 -81
  612. data/spec/unit/pops/evaluator/access_ops_spec.rb +376 -0
  613. data/spec/unit/pops/evaluator/arithmetic_ops_spec.rb +77 -0
  614. data/spec/unit/pops/evaluator/basic_expressions_spec.rb +103 -0
  615. data/spec/unit/pops/evaluator/collections_ops_spec.rb +111 -0
  616. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +256 -0
  617. data/spec/unit/pops/evaluator/conditionals_spec.rb +190 -0
  618. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +1045 -0
  619. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +75 -0
  620. data/spec/unit/pops/evaluator/logical_ops_spec.rb +90 -0
  621. data/spec/unit/pops/evaluator/string_interpolation_spec.rb +44 -0
  622. data/spec/unit/pops/evaluator/variables_spec.rb +194 -0
  623. data/spec/unit/pops/factory_spec.rb +6 -29
  624. data/spec/unit/pops/issues_spec.rb +1 -1
  625. data/spec/unit/pops/model/ast_transformer_spec.rb +6 -9
  626. data/spec/unit/pops/model/model_spec.rb +2 -2
  627. data/spec/unit/pops/parser/epp_parser_spec.rb +86 -0
  628. data/spec/unit/pops/parser/evaluating_parser_spec.rb +4 -2
  629. data/spec/unit/pops/parser/lexer2_spec.rb +428 -0
  630. data/spec/unit/pops/parser/lexer_spec.rb +25 -86
  631. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +29 -4
  632. data/spec/unit/pops/parser/parse_calls_spec.rb +10 -6
  633. data/spec/unit/pops/parser/parse_conditionals_spec.rb +0 -9
  634. data/spec/unit/pops/parser/parse_containers_spec.rb +43 -12
  635. data/spec/unit/pops/parser/parse_heredoc_spec.rb +73 -0
  636. data/spec/unit/pops/parser/parse_resource_spec.rb +14 -0
  637. data/spec/unit/pops/parser/parser_spec.rb +3 -1
  638. data/spec/unit/pops/transformer/transform_basic_expressions_spec.rb +4 -4
  639. data/spec/unit/pops/transformer/transform_calls_spec.rb +41 -6
  640. data/spec/unit/pops/transformer/transform_conditionals_spec.rb +0 -9
  641. data/spec/unit/pops/transformer/transform_containers_spec.rb +12 -4
  642. data/spec/unit/pops/types/enumeration_spec.rb +50 -0
  643. data/spec/unit/pops/types/type_calculator_spec.rb +1171 -196
  644. data/spec/unit/pops/types/type_factory_spec.rb +108 -4
  645. data/spec/unit/pops/types/type_parser_spec.rb +114 -10
  646. data/spec/unit/pops/validator/validator_spec.rb +36 -1
  647. data/spec/unit/provider/augeas/augeas_spec.rb +39 -16
  648. data/spec/unit/provider/cron/parsed_spec.rb +27 -31
  649. data/spec/unit/provider/file/posix_spec.rb +2 -2
  650. data/spec/unit/provider/group/windows_adsi_spec.rb +1 -0
  651. data/spec/unit/provider/mount_spec.rb +12 -1
  652. data/spec/unit/provider/nameservice/directoryservice_spec.rb +3 -3
  653. data/spec/unit/provider/package/apt_spec.rb +1 -1
  654. data/spec/unit/provider/package/aptrpm_spec.rb +1 -1
  655. data/spec/unit/provider/package/gem_spec.rb +12 -0
  656. data/spec/unit/provider/package/msi_spec.rb +4 -0
  657. data/spec/unit/provider/package/openbsd_spec.rb +10 -10
  658. data/spec/unit/provider/package/pacman_spec.rb +36 -7
  659. data/spec/unit/provider/package/pkgin_spec.rb +57 -55
  660. data/spec/unit/provider/package/rpm_spec.rb +51 -6
  661. data/spec/unit/provider/service/base_spec.rb +4 -4
  662. data/spec/unit/provider/service/daemontools_spec.rb +8 -13
  663. data/spec/unit/provider/service/freebsd_spec.rb +3 -3
  664. data/spec/unit/provider/service/gentoo_spec.rb +24 -24
  665. data/spec/unit/provider/service/init_spec.rb +15 -15
  666. data/spec/unit/provider/service/openbsd_spec.rb +16 -16
  667. data/spec/unit/provider/service/openrc_spec.rb +20 -20
  668. data/spec/unit/provider/service/openwrt_spec.rb +1 -1
  669. data/spec/unit/provider/service/runit_spec.rb +5 -8
  670. data/spec/unit/provider/service/src_spec.rb +4 -4
  671. data/spec/unit/provider/service/systemd_spec.rb +24 -14
  672. data/spec/unit/provider/service/upstart_spec.rb +12 -4
  673. data/spec/unit/provider/service/windows_spec.rb +1 -1
  674. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +21 -23
  675. data/spec/unit/provider/user/directoryservice_spec.rb +7 -7
  676. data/spec/unit/provider/user/useradd_spec.rb +43 -15
  677. data/spec/unit/provider/user/windows_adsi_spec.rb +1 -0
  678. data/spec/unit/provider/yumrepo/inifile_spec.rb +105 -0
  679. data/spec/unit/provider/zone/solaris_spec.rb +1 -1
  680. data/spec/unit/provider_spec.rb +120 -62
  681. data/spec/unit/rails/host_spec.rb +1 -1
  682. data/spec/unit/rails/param_value_spec.rb +4 -0
  683. data/spec/unit/relationship_spec.rb +4 -4
  684. data/spec/unit/reports/http_spec.rb +14 -3
  685. data/spec/unit/reports/rrdgraph_spec.rb +0 -1
  686. data/spec/unit/reports/store_spec.rb +2 -2
  687. data/spec/unit/resource/catalog_spec.rb +17 -29
  688. data/spec/unit/resource/status_spec.rb +1 -1
  689. data/spec/unit/resource/type_collection_spec.rb +28 -47
  690. data/spec/unit/resource/type_spec.rb +12 -23
  691. data/spec/unit/resource_spec.rb +54 -93
  692. data/spec/unit/run_spec.rb +3 -3
  693. data/spec/unit/settings/autosign_setting_spec.rb +1 -1
  694. data/spec/unit/settings/config_file_spec.rb +68 -15
  695. data/spec/unit/settings/file_setting_spec.rb +2 -2
  696. data/spec/unit/settings/ini_file_spec.rb +184 -0
  697. data/spec/unit/settings_spec.rb +137 -79
  698. data/spec/unit/ssl/certificate_authority/interface_spec.rb +3 -1
  699. data/spec/unit/ssl/certificate_authority_spec.rb +11 -9
  700. data/spec/unit/ssl/certificate_factory_spec.rb +19 -4
  701. data/spec/unit/ssl/certificate_request_attributes_spec.rb +1 -1
  702. data/spec/unit/ssl/certificate_revocation_list_spec.rb +101 -72
  703. data/spec/unit/ssl/host_spec.rb +8 -20
  704. data/spec/unit/ssl/inventory_spec.rb +2 -2
  705. data/spec/unit/ssl/key_spec.rb +4 -4
  706. data/spec/unit/status_spec.rb +6 -4
  707. data/spec/unit/transaction/additional_resource_generator_spec.rb +3 -11
  708. data/spec/unit/transaction/event_spec.rb +2 -2
  709. data/spec/unit/transaction/report_spec.rb +24 -15
  710. data/spec/unit/transaction/resource_harness_spec.rb +1 -1
  711. data/spec/unit/type/cron_spec.rb +39 -1
  712. data/spec/unit/type/file/content_spec.rb +4 -5
  713. data/spec/unit/type/file/ctime_spec.rb +1 -1
  714. data/spec/unit/type/file/mode_spec.rb +5 -4
  715. data/spec/unit/type/file/mtime_spec.rb +1 -1
  716. data/spec/unit/type/file/source_spec.rb +30 -7
  717. data/spec/unit/type/file_spec.rb +8 -8
  718. data/spec/unit/type/k5login_spec.rb +3 -3
  719. data/spec/unit/type/nagios_spec.rb +6 -0
  720. data/spec/unit/type/package/package_settings_spec.rb +135 -0
  721. data/spec/unit/type/package_spec.rb +13 -1
  722. data/spec/unit/type/resources_spec.rb +155 -0
  723. data/spec/unit/type/service_spec.rb +3 -3
  724. data/spec/unit/type/ssh_authorized_key_spec.rb +96 -93
  725. data/spec/unit/type/sshkey_spec.rb +39 -30
  726. data/spec/unit/type/tidy_spec.rb +19 -12
  727. data/spec/unit/type/user_spec.rb +47 -2
  728. data/spec/unit/type/whit_spec.rb +2 -2
  729. data/spec/unit/type/yumrepo_spec.rb +32 -177
  730. data/spec/unit/type/zone_spec.rb +2 -2
  731. data/spec/unit/type_spec.rb +11 -0
  732. data/spec/unit/util/adsi_spec.rb +48 -1
  733. data/spec/unit/util/autoload_spec.rb +24 -39
  734. data/spec/unit/util/backups_spec.rb +25 -28
  735. data/spec/unit/util/checksums_spec.rb +1 -3
  736. data/spec/unit/util/colors_spec.rb +14 -0
  737. data/spec/unit/util/docs_spec.rb +9 -0
  738. data/spec/unit/util/execution_spec.rb +1 -1
  739. data/spec/unit/util/filetype_spec.rb +7 -7
  740. data/spec/unit/util/instrumentation/data_spec.rb +3 -1
  741. data/spec/unit/util/instrumentation/indirection_probe_spec.rb +2 -0
  742. data/spec/unit/util/instrumentation/listener_spec.rb +3 -2
  743. data/spec/unit/util/json_lockfile_spec.rb +25 -4
  744. data/spec/unit/util/lockfile_spec.rb +49 -7
  745. data/spec/unit/util/log/destinations_spec.rb +1 -0
  746. data/spec/unit/util/log_spec.rb +1 -1
  747. data/spec/unit/util/metric_spec.rb +1 -1
  748. data/spec/unit/util/pidlock_spec.rb +6 -6
  749. data/spec/unit/util/pson_spec.rb +2 -2
  750. data/spec/unit/util/rdoc/parser_spec.rb +32 -29
  751. data/spec/unit/util/resource_template_spec.rb +3 -3
  752. data/spec/unit/util/selinux_spec.rb +5 -5
  753. data/spec/unit/util/storage_spec.rb +4 -4
  754. data/spec/unit/util/tag_set_spec.rb +1 -1
  755. data/spec/unit/util/watcher_spec.rb +1 -4
  756. data/spec/unit/util/yaml_spec.rb +2 -2
  757. data/spec/unit/util_spec.rb +7 -7
  758. data/tasks/benchmark.rake +0 -1
  759. data/tasks/parallel.rake +408 -0
  760. data/tasks/yard.rake +59 -0
  761. metadata +2889 -2782
  762. checksums.yaml +0 -7
  763. data/README_DEVELOPER.md +0 -809
  764. data/lib/puppet/file_system/file.rb +0 -271
  765. data/lib/puppet/network/http/rack/httphandler.rb +0 -13
  766. data/lib/puppet/pops/binder/hiera2.rb +0 -10
  767. data/lib/puppet/pops/binder/hiera2/bindings_provider.rb +0 -148
  768. data/lib/puppet/pops/binder/hiera2/config.rb +0 -69
  769. data/lib/puppet/pops/binder/hiera2/config_checker.rb +0 -68
  770. data/lib/puppet/pops/binder/hiera2/diagnostic_producer.rb +0 -36
  771. data/lib/puppet/pops/binder/hiera2/issues.rb +0 -67
  772. data/lib/puppet/pops/binder/hiera2/json_backend.rb +0 -18
  773. data/lib/puppet/pops/binder/hiera2/yaml_backend.rb +0 -21
  774. data/lib/puppet/pops/binder/scheme_handler/confdir_hiera_scheme.rb +0 -67
  775. data/lib/puppet/pops/binder/scheme_handler/module_hiera_scheme.rb +0 -92
  776. data/lib/puppet/pops/parser/grammar.ra +0 -746
  777. data/lib/puppet/provider/port/parsed.rb +0 -173
  778. data/lib/puppet/type/port.rb +0 -119
  779. data/lib/puppetx/puppet/hiera2_backend.rb +0 -31
  780. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/binder_config.yaml +0 -18
  781. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/hiera.yaml +0 -8
  782. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/modules/good/common.yaml +0 -1
  783. data/spec/fixtures/unit/pops/binder/bindings_composer/hiera1config/modules/good/hiera.yaml +0 -10
  784. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/common.yaml +0 -1
  785. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/hiera.yaml +0 -11
  786. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/localhost.yaml +0 -1
  787. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/common.yaml +0 -3
  788. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/hiera.yaml +0 -13
  789. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/lib/puppet/bindings/awesome/default.rb +0 -4
  790. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/lib/puppetx/awesome/echo_backend.rb +0 -11
  791. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome/localhost.yaml +0 -1
  792. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/bad/common.yaml +0 -3
  793. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/bad/hiera_config.yaml +0 -9
  794. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/good/common.yaml +0 -2
  795. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/good/hiera.yaml +0 -11
  796. data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/hiera.yaml +0 -9
  797. data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/node.example.com.json +0 -9
  798. data/spec/fixtures/unit/pops/binder/hiera2/bindings_provider/ok/node.example.com.yaml +0 -5
  799. data/spec/fixtures/unit/pops/binder/hiera2/config/bad_syntax/hiera.yaml +0 -10
  800. data/spec/fixtures/unit/pops/binder/hiera2/config/malformed_hierarchy/hiera.yaml +0 -8
  801. data/spec/fixtures/unit/pops/binder/hiera2/config/missing/foo.txt +0 -1
  802. data/spec/fixtures/unit/pops/binder/hiera2/config/no_backends/hiera.yaml +0 -7
  803. data/spec/fixtures/unit/pops/binder/hiera2/config/no_hierarchy/hiera.yaml +0 -4
  804. data/spec/fixtures/unit/pops/binder/hiera2/config/not_a_hash/hiera.yaml +0 -2
  805. data/spec/fixtures/unit/pops/binder/hiera2/config/ok/hiera.yaml +0 -8
  806. data/spec/fixtures/unit/pops/binder/hiera2/yaml_backend/invalid/common.yaml +0 -1
  807. data/spec/fixtures/unit/pops/binder/hiera2/yaml_backend/ok/common.yaml +0 -2
  808. data/spec/unit/file_system/file_spec.rb +0 -486
  809. data/spec/unit/pops/binder/hiera2/bindings_provider_spec.rb +0 -74
  810. data/spec/unit/pops/binder/hiera2/config_spec.rb +0 -61
  811. data/spec/unit/pops/binder/hiera2/yaml_backend_spec.rb +0 -33
@@ -0,0 +1,227 @@
1
+ # This module is an integral part of the Lexer.
2
+ # It defines interpolation support
3
+ # PERFORMANCE NOTE: There are 4 very similar methods in this module that are designed to be as
4
+ # performant as possible. While it is possible to parameterize them into one common method, the overhead
5
+ # of passing parameters and evaluating conditional logic has a negative impact on performance.
6
+ #
7
+ module Puppet::Pops::Parser::InterpolationSupport
8
+
9
+ PATTERN_VARIABLE = %r{(::)?(\w+::)*\w+}
10
+
11
+ # This is the starting point for a double quoted string with possible interpolation
12
+ # The structure mimics that of the grammar.
13
+ # The logic is explicit (where the former implementation used parameters/strucures) given to a
14
+ # generic handler.
15
+ # (This is both easier to understand and faster).
16
+ #
17
+ def interpolate_dq
18
+ scn = @scanner
19
+ ctx = @lexing_context
20
+ before = scn.pos
21
+ # skip the leading " by doing a scan since the slurp_dqstring uses last matched when there is an error
22
+ scn.scan(/"/)
23
+ value,terminator = slurp_dqstring()
24
+ text = value
25
+ after = scn.pos
26
+ while true
27
+ case terminator
28
+ when '"'
29
+ # simple case, there was no interpolation, return directly
30
+ return emit_completed([:STRING, text, scn.pos-before], before)
31
+ when '${'
32
+ count = ctx[:brace_count]
33
+ ctx[:brace_count] += 1
34
+ # The ${ terminator is counted towards the string part
35
+ enqueue_completed([:DQPRE, text, scn.pos-before], before)
36
+ # Lex expression tokens until a closing (balanced) brace count is reached
37
+ enqueue_until count
38
+ break
39
+ when '$'
40
+ if varname = scn.scan(PATTERN_VARIABLE)
41
+ # The $ is counted towards the variable
42
+ enqueue_completed([:DQPRE, text, after-before-1], before)
43
+ enqueue_completed([:VARIABLE, varname, scn.pos - after + 1], after -1)
44
+ break
45
+ else
46
+ # false $ variable start
47
+ text += value
48
+ value,terminator = slurp_dqstring()
49
+ after = scn.pos
50
+ end
51
+ end
52
+ end
53
+ interpolate_tail_dq
54
+ # return the first enqueued token and shift the queue
55
+ @token_queue.shift
56
+ end
57
+
58
+ def interpolate_tail_dq
59
+ scn = @scanner
60
+ ctx = @lexing_context
61
+ before = scn.pos
62
+ value,terminator = slurp_dqstring
63
+ text = value
64
+ after = scn.pos
65
+ while true
66
+ case terminator
67
+ when '"'
68
+ # simple case, there was no further interpolation, return directly
69
+ enqueue_completed([:DQPOST, text, scn.pos-before], before)
70
+ return
71
+ when '${'
72
+ count = ctx[:brace_count]
73
+ ctx[:brace_count] += 1
74
+ # The ${ terminator is counted towards the string part
75
+ enqueue_completed([:DQMID, text, scn.pos-before], before)
76
+ # Lex expression tokens until a closing (balanced) brace count is reached
77
+ enqueue_until count
78
+ break
79
+ when '$'
80
+ if varname = scn.scan(PATTERN_VARIABLE)
81
+ # The $ is counted towards the variable
82
+ enqueue_completed([:DQMID, text, after-before-1], before)
83
+ enqueue_completed([:VARIABLE, varname, scn.pos - after +1], after -1)
84
+ break
85
+ else
86
+ # false $ variable start
87
+ text += value
88
+ value,terminator = self.send(slurpfunc)
89
+ after = scn.pos
90
+ end
91
+ end
92
+ end
93
+ interpolate_tail_dq
94
+ end
95
+
96
+ # This is the starting point for a un-quoted string with possible interpolation
97
+ # The logic is explicit (where the former implementation used parameters/strucures) given to a
98
+ # generic handler.
99
+ # (This is both easier to understand and faster).
100
+ #
101
+ def interpolate_uq
102
+ scn = @scanner
103
+ ctx = @lexing_context
104
+ before = scn.pos
105
+ value,terminator = slurp_uqstring()
106
+ text = value
107
+ after = scn.pos
108
+ while true
109
+ case terminator
110
+ when ''
111
+ # simple case, there was no interpolation, return directly
112
+ enqueue_completed([:STRING, text, scn.pos-before], before)
113
+ return
114
+ when '${'
115
+ count = ctx[:brace_count]
116
+ ctx[:brace_count] += 1
117
+ # The ${ terminator is counted towards the string part
118
+ enqueue_completed([:DQPRE, text, scn.pos-before], before)
119
+ # Lex expression tokens until a closing (balanced) brace count is reached
120
+ enqueue_until count
121
+ break
122
+ when '$'
123
+ if varname = scn.scan(PATTERN_VARIABLE)
124
+ # The $ is counted towards the variable
125
+ enqueue_completed([:DQPRE, text, after-before-1], before)
126
+ enqueue_completed([:VARIABLE, varname, scn.pos - after + 1], after -1)
127
+ break
128
+ else
129
+ # false $ variable start
130
+ text += value
131
+ value,terminator = slurp_uqstring()
132
+ after = scn.pos
133
+ end
134
+ end
135
+ end
136
+ interpolate_tail_uq
137
+ nil
138
+ end
139
+
140
+ def interpolate_tail_uq
141
+ scn = @scanner
142
+ ctx = @lexing_context
143
+ before = scn.pos
144
+ value,terminator = slurp_uqstring
145
+ text = value
146
+ after = scn.pos
147
+ while true
148
+ case terminator
149
+ when ''
150
+ # simple case, there was no further interpolation, return directly
151
+ enqueue_completed([:DQPOST, text, scn.pos-before], before)
152
+ return
153
+ when '${'
154
+ count = ctx[:brace_count]
155
+ ctx[:brace_count] += 1
156
+ # The ${ terminator is counted towards the string part
157
+ enqueue_completed([:DQMID, text, scn.pos-before], before)
158
+ # Lex expression tokens until a closing (balanced) brace count is reached
159
+ enqueue_until count
160
+ break
161
+ when '$'
162
+ if varname = scn.scan(PATTERN_VARIABLE)
163
+ # The $ is counted towards the variable
164
+ enqueue_completed([:DQMID, text, after-before-1], before)
165
+ enqueue_completed([:VARIABLE, varname, scn.pos - after +1], after -1)
166
+ break
167
+ else
168
+ # false $ variable start
169
+ text += value
170
+ value,terminator = slurp_uqstring
171
+ after = scn.pos
172
+ end
173
+ end
174
+ end
175
+ interpolate_tail_uq
176
+ end
177
+
178
+ # Enqueues lexed tokens until either end of input, or the given brace_count is reached
179
+ #
180
+ def enqueue_until brace_count
181
+ scn = @scanner
182
+ ctx = @lexing_context
183
+ queue = @token_queue
184
+
185
+ scn.skip(self.class::PATTERN_WS)
186
+ queue_size = queue.size
187
+ until scn.eos? do
188
+ if token = lex_token
189
+ token_name = token[0]
190
+ ctx[:after] = token_name
191
+ if token_name == :RBRACE && ctx[:brace_count] == brace_count
192
+ if queue.size - queue_size == 1
193
+ # Single token is subject to replacement
194
+ queue[-1] = transform_to_variable(queue[-1])
195
+ end
196
+ return
197
+ end
198
+ queue << token
199
+ else
200
+ scn.skip(self.class::PATTERN_WS)
201
+ end
202
+ end
203
+ end
204
+
205
+ def transform_to_variable(token)
206
+ token_name = token[0]
207
+ if [:NUMBER, :NAME].include?(token_name) || self.class::KEYWORD_NAMES[token_name]
208
+ t = token[1]
209
+ ta = t.token_array
210
+ [:VARIABLE, self.class::TokenValue.new([:VARIABLE, ta[1], ta[2]], t.offset, t.locator)]
211
+ else
212
+ token
213
+ end
214
+ end
215
+
216
+ # Interpolates unquoted string and transfers the result to the given lexer
217
+ # (This is used when a second lexer instance is used to lex a substring)
218
+ #
219
+ def interpolate_uq_to(lexer)
220
+ interpolate_uq
221
+ queue = @token_queue
222
+ until queue.empty? do
223
+ lexer.enqueue(queue.shift)
224
+ end
225
+ end
226
+
227
+ end
@@ -58,8 +58,7 @@ class Puppet::Pops::Parser::Lexer
58
58
  end
59
59
 
60
60
  # @return [Boolean] if the token is acceptable in the given context or not.
61
- # this implementation always returns true.
62
- # @param context [Hash] ? ? ?
61
+ # @param context [Hash] the lexing context
63
62
  #
64
63
  def acceptable?(context={})
65
64
  @acceptable_when.call(context)
@@ -154,6 +153,7 @@ class Puppet::Pops::Parser::Lexer
154
153
  ')' => :RPAREN,
155
154
  '=' => :EQUALS,
156
155
  '+=' => :APPENDS,
156
+ '-=' => :DELETES,
157
157
  '==' => :ISEQUAL,
158
158
  '>=' => :GREATEREQUAL,
159
159
  '>' => :GREATERTHAN,
@@ -213,13 +213,13 @@ class Puppet::Pops::Parser::Lexer
213
213
  REGEX_INTRODUCING_TOKENS.include? context[:after]
214
214
  end
215
215
 
216
- DASHED_VARIABLES_ALLOWED = Proc.new do |context|
217
- Puppet[:allow_variables_with_dashes]
218
- end
219
-
220
- VARIABLE_AND_DASHES_ALLOWED = Proc.new do |context|
221
- Contextual::DASHED_VARIABLES_ALLOWED.call(context) and TOKENS[:VARIABLE].acceptable?(context)
222
- end
216
+ # DASHED_VARIABLES_ALLOWED = Proc.new do |context|
217
+ # Puppet[:allow_variables_with_dashes]
218
+ # end
219
+ #
220
+ # VARIABLE_AND_DASHES_ALLOWED = Proc.new do |context|
221
+ # Contextual::DASHED_VARIABLES_ALLOWED.call(context) and TOKENS[:VARIABLE].acceptable?(context)
222
+ # end
223
223
  end
224
224
 
225
225
  # Numbers are treated separately from names, so that they may contain dots.
@@ -252,14 +252,14 @@ class Puppet::Pops::Parser::Lexer
252
252
  end
253
253
 
254
254
  TOKENS.add_token :COMMENT, %r{#.*}, :skip => true do |lexer,value|
255
- value.sub!(/# ?/,'')
256
- [self, value]
255
+ # value.sub!(/# ?/,'')
256
+ [self, ""]
257
257
  end
258
258
 
259
259
  TOKENS.add_token :MLCOMMENT, %r{/\*(.*?)\*/}m, :skip => true do |lexer, value|
260
- value.sub!(/^\/\* ?/,'')
261
- value.sub!(/ ?\*\/$/,'')
262
- [self,value]
260
+ # value.sub!(/^\/\* ?/,'')
261
+ # value.sub!(/ ?\*\/$/,'')
262
+ [self, ""]
263
263
  end
264
264
 
265
265
  TOKENS.add_token :REGEX, %r{/[^/\n]*/} do |lexer, value|
@@ -312,30 +312,10 @@ class Puppet::Pops::Parser::Lexer
312
312
  end
313
313
  end
314
314
 
315
- TOKENS.add_token :DOLLAR_VAR_WITH_DASH, %r{\$(?:::)?(?:[-\w]+::)*[-\w]+} do |lexer, value|
316
- lexer.warn_if_variable_has_hyphen(value)
317
-
318
- [TOKENS[:VARIABLE], value[1..-1]]
319
- end
320
- TOKENS[:DOLLAR_VAR_WITH_DASH].acceptable_when Contextual::DASHED_VARIABLES_ALLOWED
321
-
322
315
  TOKENS.add_token :DOLLAR_VAR, %r{\$(::)?(\w+::)*\w+} do |lexer, value|
323
316
  [TOKENS[:VARIABLE],value[1..-1]]
324
317
  end
325
318
 
326
- TOKENS.add_token :VARIABLE_WITH_DASH, %r{(?:::)?(?:[-\w]+::)*[-\w]+} do |lexer, value|
327
- lexer.warn_if_variable_has_hyphen(value)
328
- # If the varname (following $, or ${ is followed by (, it is a function call, and not a variable
329
- # reference.
330
- #
331
- if lexer.match?(%r{[ \t\r]*\(})
332
- [TOKENS[:NAME],value]
333
- else
334
- [TOKENS[:VARIABLE], value]
335
- end
336
- end
337
- TOKENS[:VARIABLE_WITH_DASH].acceptable_when Contextual::VARIABLE_AND_DASHES_ALLOWED
338
-
339
319
  TOKENS.add_token :VARIABLE, %r{(::)?(\w+::)*\w+} do |lexer, value|
340
320
  # If the varname (following $, or ${ is followed by (, it is a function call, and not a variable
341
321
  # reference.
@@ -418,9 +398,9 @@ class Puppet::Pops::Parser::Lexer
418
398
 
419
399
  def file=(file)
420
400
  @file = file
421
- contents = Puppet::FileSystem::File.exist?(file) ? File.read(file) : ""
422
- @scanner = StringScanner.new(contents)
423
- @locator = Locator.new(contents, multibyte?)
401
+ contents = Puppet::FileSystem.exist?(file) ? Puppet::FileSystem.read(file) : ""
402
+ @scanner = StringScanner.new(contents.freeze)
403
+ @locator = Puppet::Pops::Parser::Locator.locator(contents, file)
424
404
  end
425
405
 
426
406
  def_delegator :@token_queue, :shift, :shift_token
@@ -431,9 +411,13 @@ class Puppet::Pops::Parser::Lexer
431
411
  # tries, where it is otherwise the number of string token we have. Also,
432
412
  # the lookups are optimized hash lookups, instead of regex scans.
433
413
  #
434
- s = @scanner.peek(3)
414
+ _scn = @scanner
415
+ s = _scn.peek(3)
435
416
  token = TOKENS.lookup(s[0,3]) || TOKENS.lookup(s[0,2]) || TOKENS.lookup(s[0,1])
436
- [ token, token && @scanner.scan(token.regex) ]
417
+ unless token
418
+ return [nil, nil]
419
+ end
420
+ [ token, _scn.scan(token.regex) ]
437
421
  end
438
422
 
439
423
  # Find the next token that matches a regex. We look for these first.
@@ -443,8 +427,10 @@ class Puppet::Pops::Parser::Lexer
443
427
 
444
428
  # I tried optimizing based on the first char, but it had
445
429
  # a slightly negative affect and was a good bit more complicated.
430
+ _lxc = @lexing_context
431
+ _scn = @scanner
446
432
  TOKENS.regex_tokens.each do |token|
447
- if length = @scanner.match?(token.regex) and token.acceptable?(lexing_context)
433
+ if length = _scn.match?(token.regex) and token.acceptable?(_lxc)
448
434
  # We've found a longer match
449
435
  if length > best_length
450
436
  best_length = length
@@ -453,7 +439,7 @@ class Puppet::Pops::Parser::Lexer
453
439
  end
454
440
  end
455
441
 
456
- return best_token, @scanner.scan(best_token.regex) if best_token
442
+ return best_token, _scn.scan(best_token.regex) if best_token
457
443
  end
458
444
 
459
445
  # Find the next token, returning the string and the token.
@@ -461,8 +447,10 @@ class Puppet::Pops::Parser::Lexer
461
447
  shift_token || find_regex_token || find_string_token
462
448
  end
463
449
 
450
+ MULTIBYTE = Puppet::Pops::Parser::Locator::MULTIBYTE
451
+ SKIPPATTERN = MULTIBYTE ? %r{[[:blank:]\r]+} : %r{[ \t\r]+}
452
+
464
453
  def initialize
465
- @multibyte = init_multibyte
466
454
  initvars
467
455
  end
468
456
 
@@ -476,21 +464,6 @@ class Puppet::Pops::Parser::Lexer
476
464
  end
477
465
  end
478
466
 
479
- # Returns true if ruby version >= 1.9.3 since regexp supports multi-byte matches and expanded
480
- # character categories like [[:blank:]].
481
- #
482
- # This implementation will fail if there are more than 255 minor or micro versions of ruby
483
- #
484
- def init_multibyte
485
- numver = RUBY_VERSION.split(".").collect {|s| s.to_i }
486
- return true if (numver[0] << 16 | numver[1] << 8 | numver[2]) >= (1 << 16 | 9 << 8 | 3)
487
- false
488
- end
489
-
490
- def multibyte?
491
- @multibyte
492
- end
493
-
494
467
  def initvars
495
468
  @previous_token = nil
496
469
  @scanner = nil
@@ -499,13 +472,6 @@ class Puppet::Pops::Parser::Lexer
499
472
  # AAARRGGGG! okay, regexes in ruby are bloody annoying
500
473
  # no one else has "\n" =~ /\s/
501
474
 
502
- if multibyte?
503
- # Skip all kinds of space, and CR, but not newlines
504
- @skip = %r{[[:blank:]\r]+}
505
- else
506
- @skip = %r{[ \t\r]+}
507
- end
508
-
509
475
  @namestack = []
510
476
  @token_queue = []
511
477
  @indefine = false
@@ -526,7 +492,7 @@ class Puppet::Pops::Parser::Lexer
526
492
  #
527
493
  return token, value if value.is_a? Hash
528
494
 
529
- skip if token.skip_text
495
+ @scanner.skip(SKIPPATTERN) if token.skip_text
530
496
 
531
497
  return if token.skip
532
498
 
@@ -539,26 +505,22 @@ class Puppet::Pops::Parser::Lexer
539
505
  # If the conversion performed the munging/positioning
540
506
  return token, value if value.is_a? Hash
541
507
 
542
- pos_hash = position_in_source
543
- pos_hash[:value] = value
544
-
545
- # Add one to pos, first char on line is 1
546
- return token, pos_hash
508
+ return token, positioned_value(value)
547
509
  end
548
510
 
549
511
  # Returns a hash with the current position in source based on the current lexing context
550
512
  #
551
- def position_in_source
552
- pos = @locator.pos_on_line(lexing_context[:offset])
553
- offset = @locator.char_offset(lexing_context[:offset])
554
- length = @locator.char_length(lexing_context[:offset], lexing_context[:end_offset])
555
- start_line = @locator.line_for_offset(lexing_context[:offset])
556
-
557
- return { :line => start_line, :pos => pos, :offset => offset, :length => length}
513
+ def positioned_value(value)
514
+ {
515
+ :value => value,
516
+ :locator => @locator,
517
+ :offset => @lexing_context[:offset],
518
+ :end_offset => @lexing_context[:end_offset]
519
+ }
558
520
  end
559
521
 
560
522
  def pos
561
- @locator.pos_on_line(lexing_context[:offset])
523
+ @locator.pos_on_line(@lexing_context[:offset])
562
524
  end
563
525
 
564
526
  # Handling the namespace stack
@@ -575,58 +537,67 @@ class Puppet::Pops::Parser::Lexer
575
537
  end
576
538
 
577
539
  def_delegator :@scanner, :rest
540
+
541
+ LBRACE_CHAR = '{'
542
+
578
543
  # this is the heart of the lexer
579
544
  def scan
545
+ _scn = @scanner
580
546
  #Puppet.debug("entering scan")
581
- lex_error "Internal Error: No string or file given to lexer to process." unless @scanner
547
+ lex_error "Internal Error: No string or file given to lexer to process." unless _scn
582
548
 
583
549
  # Skip any initial whitespace.
584
- skip
550
+ _scn.skip(SKIPPATTERN)
551
+ _lbrace = '{'.freeze # faster to compare against a frozen string in
585
552
 
586
- until token_queue.empty? and @scanner.eos? do
587
- offset = @scanner.pos
553
+ until token_queue.empty? and _scn.eos? do
554
+ offset = _scn.pos
588
555
  matched_token, value = find_token
589
- end_offset = @scanner.pos
556
+ end_offset = _scn.pos
590
557
 
591
558
  # error out if we didn't match anything at all
592
- lex_error "Could not match #{@scanner.rest[/^(\S+|\s+|.*)/]}" unless matched_token
559
+ lex_error "Could not match #{_scn.rest[/^(\S+|\s+|.*)/]}" unless matched_token
593
560
 
594
561
  newline = matched_token.name == :RETURN
595
562
 
596
- lexing_context[:start_of_line] = newline
597
- lexing_context[:offset] = offset
598
- lexing_context[:end_offset] = end_offset
563
+ _lxc = @lexing_context
564
+ _lxc[:start_of_line] = newline
565
+ _lxc[:offset] = offset
566
+ _lxc[:end_offset] = end_offset
599
567
 
600
568
  final_token, token_value = munge_token(matched_token, value)
601
569
  # update end position since munging may have moved the end offset
602
- lexing_context[:end_offset] = @scanner.pos
570
+ _lxc[:end_offset] = _scn.pos
603
571
 
604
572
  unless final_token
605
- skip
573
+ _scn.skip(SKIPPATTERN)
606
574
  next
607
575
  end
608
576
 
609
- lexing_context[:after] = final_token.name unless newline
577
+ _lxc[:after] = final_token.name unless newline
610
578
  if final_token.name == :DQPRE
611
- lexing_context[:interpolation_stack] << lexing_context[:brace_count]
579
+ _lxc[:interpolation_stack] << _lxc[:brace_count]
612
580
  elsif final_token.name == :DQPOST
613
- lexing_context[:interpolation_stack].pop
581
+ _lxc[:interpolation_stack].pop
614
582
  end
615
583
 
616
584
  value = token_value[:value]
617
585
 
586
+ _expected = @expected
618
587
  if match = @@pairs[value] and final_token.name != :DQUOTE and final_token.name != :SQUOTE
619
- @expected << match
620
- elsif exp = @expected[-1] and exp == value and final_token.name != :DQUOTE and final_token.name != :SQUOTE
621
- @expected.pop
588
+ _expected << match
589
+ elsif exp = _expected[-1] and exp == value and final_token.name != :DQUOTE and final_token.name != :SQUOTE
590
+ _expected.pop
622
591
  end
623
592
 
624
593
  yield [final_token.name, token_value]
625
594
 
626
- if @previous_token
627
- namestack(value) if @previous_token.name == :CLASS and value != '{'
595
+ _prv = @previous_token
596
+ if _prv
597
+ namestack(value) if _prv.name == :CLASS and value != LBRACE_CHAR
628
598
 
629
- if @previous_token.name == :DEFINE
599
+ # TODO: Lexer has no business dealing with this - it is semantic
600
+ if _prv.name == :DEFINE
630
601
  if indefine?
631
602
  msg = "Cannot nest definition #{value} inside #{@indefine}"
632
603
  self.indefine = false
@@ -637,7 +608,7 @@ class Puppet::Pops::Parser::Lexer
637
608
  end
638
609
  end
639
610
  @previous_token = final_token
640
- skip
611
+ _scn.skip(SKIPPATTERN)
641
612
  end
642
613
  # Cannot reset @scanner to nil here - it is needed to answer questions about context after
643
614
  # completed parsing.
@@ -648,11 +619,6 @@ class Puppet::Pops::Parser::Lexer
648
619
  yield [false,false]
649
620
  end
650
621
 
651
- # Skip any skipchars in our remaining string.
652
- def skip
653
- @scanner.skip(@skip)
654
- end
655
-
656
622
  def match? r
657
623
  @scanner.match?(r)
658
624
  end
@@ -721,9 +687,10 @@ class Puppet::Pops::Parser::Lexer
721
687
  # Advanced after '{' if this is in expression ${} interpolation
722
688
  braced = terminator == '$' && @scanner.scan(/\{/)
723
689
  # make offset to end_ofset be the length of the pre expression string including its start and terminating chars
724
- lexing_context[:end_offset] = @scanner.pos
690
+ lxc = @lexing_context
691
+ lxc[:end_offset] = @scanner.pos
725
692
 
726
- token_queue << [TOKENS[token_type[terminator]],position_in_source().merge!({:value => preamble+value})]
693
+ token_queue << [TOKENS[token_type[terminator]],positioned_value(preamble+value)]
727
694
  variable_regex = if Puppet[:allow_variables_with_dashes]
728
695
  TOKENS[:VARIABLE_WITH_DASH].regex
729
696
  else
@@ -735,18 +702,18 @@ class Puppet::Pops::Parser::Lexer
735
702
 
736
703
  tmp_offset = @scanner.pos
737
704
  if var_name = @scanner.scan(variable_regex)
738
- lexing_context[:offset] = tmp_offset
739
- lexing_context[:end_offset] = @scanner.pos
705
+ lxc[:offset] = tmp_offset
706
+ lxc[:end_offset] = @scanner.pos
740
707
  warn_if_variable_has_hyphen(var_name)
741
708
  # If the varname after ${ is followed by (, it is a function call, and not a variable
742
709
  # reference.
743
710
  #
744
711
  if braced && @scanner.match?(%r{[ \t\r]*\(})
745
- token_queue << [TOKENS[:NAME], position_in_source().merge!({:value=>var_name})]
712
+ token_queue << [TOKENS[:NAME], positioned_value(var_name)]
746
713
  else
747
- token_queue << [TOKENS[:VARIABLE],position_in_source().merge!({:value=>var_name})]
714
+ token_queue << [TOKENS[:VARIABLE],positioned_value(var_name)]
748
715
  end
749
- lexing_context[:offset] = @scanner.pos
716
+ lxc[:offset] = @scanner.pos
750
717
  tokenize_interpolated_string(DQ_continuation_token_types)
751
718
  else
752
719
  tokenize_interpolated_string(token_type, replace_false_start_with_text(terminator))
@@ -764,9 +731,9 @@ class Puppet::Pops::Parser::Lexer
764
731
  end
765
732
 
766
733
  # just parse a string, not a whole file
767
- def string=(string)
768
- @scanner = StringScanner.new(string)
769
- @locator = Locator.new(string, multibyte?)
734
+ def string=(string, path='')
735
+ @scanner = StringScanner.new(string.freeze)
736
+ @locator = Puppet::Pops::Parser::Locator.locator(string, path)
770
737
  end
771
738
 
772
739
  def warn_if_variable_has_hyphen(var_name)
@@ -780,83 +747,7 @@ class Puppet::Pops::Parser::Lexer
780
747
  # consumed.
781
748
  #
782
749
  def line
783
- return 1 unless lexing_context && locator
784
- locator.line_for_offset(lexing_context[:end_offset])
785
- end
786
-
787
- # Helper class that keeps track of where line breaks are located and can answer questions about positions.
788
- #
789
- class Locator
790
- attr_reader :line_index
791
- attr_reader :string
792
-
793
- # Create a locator based on a content string, and a boolean indicating if ruby version support multi-byte strings
794
- # or not.
795
- #
796
- def initialize(string, multibyte)
797
- @string = string
798
- @multibyte = multibyte
799
- compute_line_index
800
- end
801
-
802
- # Returns whether this a ruby version that supports multi-byte strings or not
803
- #
804
- def multibyte?
805
- @multibyte
806
- end
807
-
808
- # Computes the start offset for each line.
809
- #
810
- def compute_line_index
811
- scanner = StringScanner.new(@string)
812
- result = [0] # first line starts at 0
813
- while scanner.scan_until(/\n/)
814
- result << scanner.pos
815
- end
816
- @line_index = result
817
- end
818
-
819
- # Returns the line number (first line is 1) for the given offset
820
- def line_for_offset(offset)
821
- if line_nbr = line_index.index {|x| x > offset}
822
- return line_nbr
823
- end
824
- # If not found it is after last
825
- return line_index.size
826
- end
827
-
828
- # Returns the offset on line (first offset on a line is 0).
829
- #
830
- def offset_on_line(offset)
831
- line_offset = line_index[line_for_offset(offset)-1]
832
- if multibyte?
833
- @string.byteslice(line_offset, offset-line_offset).length
834
- else
835
- offset - line_offset
836
- end
837
- end
838
-
839
- # Returns the position on line (first position on a line is 1)
840
- def pos_on_line(offset)
841
- offset_on_line(offset) +1
842
- end
843
-
844
- # Returns the character offset for a given byte offset
845
- def char_offset(byte_offset)
846
- if multibyte?
847
- @string.byteslice(0, byte_offset).length
848
- else
849
- byte_offset
850
- end
851
- end
852
-
853
- # Returns the length measured in number of characters from the given start and end byte offseta
854
- def char_length(offset, end_offset)
855
- if multibyte?
856
- @string.byteslice(offset, end_offset - offset).length
857
- else
858
- end_offset - offset
859
- end
860
- end
750
+ return 1 unless @lexing_context && locator
751
+ locator.line_for_offset(@lexing_context[:end_offset])
861
752
  end
862
753
  end