puppet 5.4.0 → 5.5.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 (441) hide show
  1. data/Gemfile +3 -3
  2. data/MAINTAINERS +0 -19
  3. data/README.md +5 -5
  4. data/Rakefile +26 -0
  5. data/conf/auth.conf +5 -0
  6. data/ext/project_data.yaml +1 -0
  7. data/ext/regexp_nodes/regexp_nodes.rb +3 -4
  8. data/lib/puppet/application/apply.rb +1 -1
  9. data/lib/puppet/application/cert.rb +3 -1
  10. data/lib/puppet/application/device.rb +100 -13
  11. data/lib/puppet/application/facts.rb +5 -0
  12. data/lib/puppet/application/lookup.rb +12 -2
  13. data/lib/puppet/configurer.rb +37 -17
  14. data/lib/puppet/confine.rb +4 -1
  15. data/lib/puppet/datatypes.rb +1 -1
  16. data/lib/puppet/environments.rb +1 -1
  17. data/lib/puppet/error.rb +6 -3
  18. data/lib/puppet/external/dot.rb +0 -7
  19. data/lib/puppet/external/nagios/parser.rb +1 -1
  20. data/lib/puppet/face/config.rb +92 -10
  21. data/lib/puppet/face/epp.rb +31 -6
  22. data/lib/puppet/face/facts.rb +49 -0
  23. data/lib/puppet/face/help.rb +33 -35
  24. data/lib/puppet/face/help/action.erb +1 -1
  25. data/lib/puppet/face/help/face.erb +1 -1
  26. data/lib/puppet/face/man.rb +55 -12
  27. data/lib/puppet/face/parser.rb +30 -3
  28. data/lib/puppet/file_bucket/file.rb +0 -2
  29. data/lib/puppet/file_serving/base.rb +10 -10
  30. data/lib/puppet/forge.rb +3 -3
  31. data/lib/puppet/forge/errors.rb +3 -3
  32. data/lib/puppet/functions.rb +1 -3
  33. data/lib/puppet/functions/alert.rb +1 -1
  34. data/lib/puppet/functions/all.rb +6 -6
  35. data/lib/puppet/functions/annotate.rb +10 -10
  36. data/lib/puppet/functions/any.rb +6 -6
  37. data/lib/puppet/functions/assert_type.rb +4 -4
  38. data/lib/puppet/functions/binary_file.rb +14 -2
  39. data/lib/puppet/functions/break.rb +31 -2
  40. data/lib/puppet/functions/call.rb +4 -4
  41. data/lib/puppet/functions/contain.rb +19 -3
  42. data/lib/puppet/functions/convert_to.rb +6 -5
  43. data/lib/puppet/functions/crit.rb +1 -1
  44. data/lib/puppet/functions/debug.rb +1 -1
  45. data/lib/puppet/functions/defined.rb +11 -9
  46. data/lib/puppet/functions/dig.rb +26 -2
  47. data/lib/puppet/functions/each.rb +8 -8
  48. data/lib/puppet/functions/emerg.rb +1 -1
  49. data/lib/puppet/functions/empty.rb +79 -0
  50. data/lib/puppet/functions/err.rb +1 -1
  51. data/lib/puppet/functions/eyaml_lookup_key.rb +3 -1
  52. data/lib/puppet/functions/filter.rb +7 -7
  53. data/lib/puppet/functions/find_file.rb +15 -1
  54. data/lib/puppet/functions/flatten.rb +64 -0
  55. data/lib/puppet/functions/hiera.rb +6 -6
  56. data/lib/puppet/functions/hiera_array.rb +6 -6
  57. data/lib/puppet/functions/hiera_hash.rb +6 -6
  58. data/lib/puppet/functions/hiera_include.rb +8 -8
  59. data/lib/puppet/functions/include.rb +28 -2
  60. data/lib/puppet/functions/info.rb +1 -1
  61. data/lib/puppet/functions/inline_epp.rb +2 -2
  62. data/lib/puppet/functions/join.rb +56 -0
  63. data/lib/puppet/functions/json_data.rb +2 -2
  64. data/lib/puppet/functions/keys.rb +25 -0
  65. data/lib/puppet/functions/length.rb +44 -0
  66. data/lib/puppet/functions/lest.rb +39 -1
  67. data/lib/puppet/functions/lookup.rb +2 -1
  68. data/lib/puppet/functions/map.rb +10 -9
  69. data/lib/puppet/functions/match.rb +6 -6
  70. data/lib/puppet/functions/new.rb +995 -2
  71. data/lib/puppet/functions/next.rb +1 -1
  72. data/lib/puppet/functions/notice.rb +1 -1
  73. data/lib/puppet/functions/reduce.rb +6 -6
  74. data/lib/puppet/functions/regsubst.rb +9 -3
  75. data/lib/puppet/functions/require.rb +36 -2
  76. data/lib/puppet/functions/return.rb +1 -1
  77. data/lib/puppet/functions/reverse_each.rb +71 -2
  78. data/lib/puppet/functions/slice.rb +23 -9
  79. data/lib/puppet/functions/split.rb +12 -10
  80. data/lib/puppet/functions/step.rb +73 -1
  81. data/lib/puppet/functions/strftime.rb +176 -2
  82. data/lib/puppet/functions/then.rb +65 -2
  83. data/lib/puppet/functions/tree_each.rb +19 -19
  84. data/lib/puppet/functions/type.rb +42 -1
  85. data/lib/puppet/functions/unique.rb +13 -13
  86. data/lib/puppet/functions/unwrap.rb +8 -4
  87. data/lib/puppet/functions/values.rb +25 -0
  88. data/lib/puppet/functions/versioncmp.rb +1 -1
  89. data/lib/puppet/functions/warning.rb +1 -1
  90. data/lib/puppet/functions/with.rb +6 -4
  91. data/lib/puppet/functions/yaml_data.rb +3 -1
  92. data/lib/puppet/indirector/certificate_status/file.rb +1 -1
  93. data/lib/puppet/indirector/facts/facter.rb +1 -3
  94. data/lib/puppet/indirector/facts/rest.rb +21 -0
  95. data/lib/puppet/indirector/facts/yaml.rb +0 -4
  96. data/lib/puppet/indirector/rest.rb +2 -2
  97. data/lib/puppet/module.rb +3 -3
  98. data/lib/puppet/module/task.rb +2 -3
  99. data/lib/puppet/module_tool/applications/application.rb +4 -4
  100. data/lib/puppet/module_tool/applications/builder.rb +2 -2
  101. data/lib/puppet/module_tool/applications/checksummer.rb +3 -3
  102. data/lib/puppet/module_tool/applications/unpacker.rb +2 -2
  103. data/lib/puppet/module_tool/metadata.rb +3 -3
  104. data/lib/puppet/network/authconfig.rb +1 -1
  105. data/lib/puppet/network/format_support.rb +1 -1
  106. data/lib/puppet/network/formats.rb +5 -7
  107. data/lib/puppet/network/http/api/indirected_routes.rb +1 -0
  108. data/lib/puppet/network/http/api/master/v3/environment.rb +2 -2
  109. data/lib/puppet/network/http/api/master/v3/environments.rb +2 -2
  110. data/lib/puppet/network/http/error.rb +3 -3
  111. data/lib/puppet/network/resolver.rb +1 -2
  112. data/lib/puppet/parser/compiler.rb +12 -5
  113. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +1 -1
  114. data/lib/puppet/parser/functions/fqdn_rand.rb +15 -4
  115. data/lib/puppet/parser/functions/new.rb +31 -46
  116. data/lib/puppet/parser/parser_factory.rb +1 -1
  117. data/lib/puppet/parser/resource.rb +1 -1
  118. data/lib/puppet/parser/type_loader.rb +11 -11
  119. data/lib/puppet/pops/evaluator/closure.rb +1 -1
  120. data/lib/puppet/pops/evaluator/collector_transformer.rb +1 -1
  121. data/lib/puppet/pops/evaluator/epp_evaluator.rb +2 -2
  122. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +2 -2
  123. data/lib/puppet/pops/evaluator/runtime3_support.rb +5 -2
  124. data/lib/puppet/pops/functions/dispatch.rb +1 -1
  125. data/lib/puppet/pops/issue_reporter.rb +18 -1
  126. data/lib/puppet/pops/issues.rb +6 -3
  127. data/lib/puppet/pops/loader/ruby_data_type_instantiator.rb +1 -2
  128. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +1 -2
  129. data/lib/puppet/pops/loader/task_instantiator.rb +5 -5
  130. data/lib/puppet/pops/loader/type_definition_instantiator.rb +4 -1
  131. data/lib/puppet/pops/loaders.rb +18 -7
  132. data/lib/puppet/pops/lookup/global_data_provider.rb +1 -1
  133. data/lib/puppet/pops/lookup/lookup_adapter.rb +55 -6
  134. data/lib/puppet/pops/model/factory.rb +6 -3
  135. data/lib/puppet/pops/model/model_tree_dumper.rb +4 -0
  136. data/lib/puppet/pops/model/pn_transformer.rb +400 -0
  137. data/lib/puppet/pops/parser/egrammar.ra +1 -1
  138. data/lib/puppet/pops/parser/eparser.rb +1 -1
  139. data/lib/puppet/pops/parser/heredoc_support.rb +1 -1
  140. data/lib/puppet/pops/parser/lexer_support.rb +3 -2
  141. data/lib/puppet/pops/parser/locator.rb +0 -2
  142. data/lib/puppet/pops/parser/pn_parser.rb +316 -0
  143. data/lib/puppet/pops/pcore.rb +17 -17
  144. data/lib/puppet/pops/pn.rb +236 -0
  145. data/lib/puppet/pops/serialization/json.rb +7 -7
  146. data/lib/puppet/pops/types/class_loader.rb +6 -3
  147. data/lib/puppet/pops/types/implementation_registry.rb +28 -35
  148. data/lib/puppet/pops/types/p_object_type.rb +3 -3
  149. data/lib/puppet/pops/types/p_timespan_type.rb +2 -2
  150. data/lib/puppet/pops/types/p_type_set_type.rb +24 -1
  151. data/lib/puppet/pops/types/ruby_generator.rb +3 -4
  152. data/lib/puppet/pops/types/type_calculator.rb +1 -1
  153. data/lib/puppet/pops/types/type_factory.rb +0 -4
  154. data/lib/puppet/pops/types/type_mismatch_describer.rb +1 -1
  155. data/lib/puppet/pops/types/type_parser.rb +14 -7
  156. data/lib/puppet/pops/types/types.rb +1 -1
  157. data/lib/puppet/pops/utils.rb +2 -2
  158. data/lib/puppet/pops/validation/checker4_0.rb +6 -2
  159. data/lib/puppet/provider/group/groupadd.rb +3 -1
  160. data/lib/puppet/provider/group/windows_adsi.rb +4 -7
  161. data/lib/puppet/provider/nameservice.rb +3 -3
  162. data/lib/puppet/provider/package/pacman.rb +4 -4
  163. data/lib/puppet/provider/package/pip.rb +3 -3
  164. data/lib/puppet/provider/package/pkgdmg.rb +3 -3
  165. data/lib/puppet/provider/package/pkgutil.rb +2 -2
  166. data/lib/puppet/provider/package/portage.rb +9 -9
  167. data/lib/puppet/provider/package/zypper.rb +2 -2
  168. data/lib/puppet/provider/service/base.rb +1 -1
  169. data/lib/puppet/provider/service/smf.rb +3 -2
  170. data/lib/puppet/provider/service/systemd.rb +1 -1
  171. data/lib/puppet/provider/user/useradd.rb +6 -2
  172. data/lib/puppet/provider/user/windows_adsi.rb +1 -1
  173. data/lib/puppet/provider/yumrepo/inifile.rb +20 -9
  174. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  175. data/lib/puppet/reference/configuration.rb +2 -0
  176. data/lib/puppet/reference/type.rb +11 -11
  177. data/lib/puppet/resource.rb +1 -1
  178. data/lib/puppet/resource/capability_finder.rb +5 -5
  179. data/lib/puppet/resource/catalog.rb +6 -3
  180. data/lib/puppet/resource/status.rb +9 -2
  181. data/lib/puppet/resource/type.rb +1 -1
  182. data/lib/puppet/settings.rb +31 -19
  183. data/lib/puppet/settings/base_setting.rb +5 -0
  184. data/lib/puppet/settings/config_file.rb +1 -1
  185. data/lib/puppet/settings/ttl_setting.rb +5 -0
  186. data/lib/puppet/ssl/certificate_factory.rb +2 -2
  187. data/lib/puppet/ssl/certificate_request.rb +0 -2
  188. data/lib/puppet/syntax_checkers/json.rb +1 -1
  189. data/lib/puppet/transaction/additional_resource_generator.rb +2 -2
  190. data/lib/puppet/transaction/event.rb +1 -1
  191. data/lib/puppet/transaction/report.rb +18 -12
  192. data/lib/puppet/type.rb +9 -13
  193. data/lib/puppet/type/augeas.rb +2 -2
  194. data/lib/puppet/type/cron.rb +11 -6
  195. data/lib/puppet/type/exec.rb +1 -1
  196. data/lib/puppet/type/file.rb +4 -5
  197. data/lib/puppet/type/host.rb +1 -1
  198. data/lib/puppet/type/k5login.rb +30 -54
  199. data/lib/puppet/type/package.rb +3 -3
  200. data/lib/puppet/type/schedule.rb +12 -12
  201. data/lib/puppet/type/scheduled_task.rb +2 -2
  202. data/lib/puppet/type/ssh_authorized_key.rb +5 -5
  203. data/lib/puppet/type/sshkey.rb +2 -2
  204. data/lib/puppet/type/tidy.rb +1 -1
  205. data/lib/puppet/type/user.rb +1 -1
  206. data/lib/puppet/type/yumrepo.rb +26 -5
  207. data/lib/puppet/util.rb +0 -4
  208. data/lib/puppet/util/backups.rb +1 -1
  209. data/lib/puppet/util/inifile.rb +3 -4
  210. data/lib/puppet/util/json.rb +68 -0
  211. data/lib/puppet/util/json_lockfile.rb +3 -3
  212. data/lib/puppet/util/log.rb +2 -5
  213. data/lib/puppet/util/log/destinations.rb +2 -2
  214. data/lib/puppet/util/network_device/cisco/facts.rb +1 -1
  215. data/lib/puppet/util/plist.rb +1 -1
  216. data/lib/puppet/util/reference.rb +1 -8
  217. data/lib/puppet/util/tagging.rb +1 -1
  218. data/lib/puppet/util/warnings.rb +0 -2
  219. data/lib/puppet/util/windows/adsi.rb +15 -18
  220. data/lib/puppet/util/windows/com.rb +2 -1
  221. data/lib/puppet/util/windows/file.rb +2 -2
  222. data/lib/puppet/util/windows/principal.rb +7 -6
  223. data/lib/puppet/util/windows/sid.rb +60 -7
  224. data/lib/puppet/util/windows/taskscheduler.rb +0 -9
  225. data/lib/puppet/version.rb +1 -1
  226. data/lib/puppet_pal.rb +53 -48
  227. data/locales/ja/puppet.po +1357 -912
  228. data/locales/puppet.pot +549 -466
  229. data/man/man5/puppet.conf.5 +103 -20
  230. data/man/man8/puppet-agent.8 +6 -2
  231. data/man/man8/puppet-apply.8 +2 -2
  232. data/man/man8/puppet-ca.8 +1 -1
  233. data/man/man8/puppet-catalog.8 +1 -1
  234. data/man/man8/puppet-cert.8 +1 -1
  235. data/man/man8/puppet-certificate.8 +1 -1
  236. data/man/man8/puppet-certificate_request.8 +1 -1
  237. data/man/man8/puppet-certificate_revocation_list.8 +1 -1
  238. data/man/man8/puppet-config.8 +35 -1
  239. data/man/man8/puppet-describe.8 +1 -1
  240. data/man/man8/puppet-device.8 +33 -11
  241. data/man/man8/puppet-doc.8 +1 -1
  242. data/man/man8/puppet-epp.8 +34 -12
  243. data/man/man8/puppet-facts.8 +50 -1
  244. data/man/man8/puppet-filebucket.8 +38 -11
  245. data/man/man8/puppet-generate.8 +1 -1
  246. data/man/man8/puppet-help.8 +1 -1
  247. data/man/man8/puppet-key.8 +1 -1
  248. data/man/man8/puppet-lookup.8 +1 -1
  249. data/man/man8/puppet-man.8 +10 -4
  250. data/man/man8/puppet-master.8 +1 -1
  251. data/man/man8/puppet-module.8 +15 -6
  252. data/man/man8/puppet-node.8 +1 -1
  253. data/man/man8/puppet-parser.8 +31 -8
  254. data/man/man8/puppet-plugin.8 +1 -1
  255. data/man/man8/puppet-report.8 +1 -1
  256. data/man/man8/puppet-resource.8 +1 -1
  257. data/man/man8/puppet-script.8 +67 -0
  258. data/man/man8/puppet-status.8 +1 -1
  259. data/man/man8/puppet.8 +3 -3
  260. data/spec/fixtures/unit/pops/binder/bindings_composer/ok/modules/awesome2/lib/puppet_x/awesome2/echo_scheme_handler.rb +1 -1
  261. data/spec/integration/application/apply_spec.rb +15 -15
  262. data/spec/integration/application/lookup_spec.rb +21 -0
  263. data/spec/integration/faces/config_spec.rb +16 -4
  264. data/spec/integration/network/http/api/indirected_routes_spec.rb +5 -5
  265. data/spec/integration/parser/catalog_spec.rb +1 -1
  266. data/spec/integration/parser/collection_spec.rb +2 -2
  267. data/spec/integration/parser/compiler_spec.rb +17 -18
  268. data/spec/integration/parser/pcore_resource_spec.rb +2 -2
  269. data/spec/integration/parser/scope_spec.rb +2 -2
  270. data/spec/integration/ssl/certificate_authority_spec.rb +7 -7
  271. data/spec/integration/ssl/certificate_revocation_list_spec.rb +1 -1
  272. data/spec/integration/ssl/key_spec.rb +1 -1
  273. data/spec/integration/transaction/report_spec.rb +3 -3
  274. data/spec/integration/transaction_spec.rb +0 -1
  275. data/spec/integration/type/file_spec.rb +10 -11
  276. data/spec/integration/type_spec.rb +1 -2
  277. data/spec/integration/util/windows/adsi_spec.rb +86 -1
  278. data/spec/integration/util/windows/principal_spec.rb +11 -2
  279. data/spec/integration/util/windows/security_spec.rb +2 -2
  280. data/spec/lib/matchers/json.rb +4 -4
  281. data/spec/lib/puppet_spec/language.rb +34 -35
  282. data/spec/lib/puppet_spec/module_tool/shared_functions.rb +2 -2
  283. data/spec/shared_behaviours/file_server_terminus.rb +0 -2
  284. data/spec/shared_behaviours/things_that_declare_options.rb +2 -2
  285. data/spec/spec_helper.rb +1 -1
  286. data/spec/unit/application/cert_spec.rb +21 -9
  287. data/spec/unit/application/device_spec.rb +96 -2
  288. data/spec/unit/application/face_base_spec.rb +2 -2
  289. data/spec/unit/application/lookup_spec.rb +0 -1
  290. data/spec/unit/configurer_spec.rb +14 -0
  291. data/spec/unit/confine_spec.rb +16 -0
  292. data/spec/unit/data_providers/hiera_data_provider_spec.rb +4 -4
  293. data/spec/unit/datatypes_spec.rb +49 -0
  294. data/spec/unit/environments_spec.rb +7 -0
  295. data/spec/unit/face/config_spec.rb +116 -12
  296. data/spec/unit/face/epp_face_spec.rb +53 -2
  297. data/spec/unit/face/facts_spec.rb +53 -0
  298. data/spec/unit/face/help_spec.rb +62 -69
  299. data/spec/unit/face/man_spec.rb +26 -0
  300. data/spec/unit/face/module/list_spec.rb +0 -1
  301. data/spec/unit/face/parser_spec.rb +78 -0
  302. data/spec/unit/file_bucket/dipper_spec.rb +0 -4
  303. data/spec/unit/file_serving/content_spec.rb +0 -1
  304. data/spec/unit/file_serving/fileset_spec.rb +0 -1
  305. data/spec/unit/file_serving/metadata_spec.rb +0 -1
  306. data/spec/unit/file_serving/terminus_selector_spec.rb +0 -2
  307. data/spec/unit/forge_spec.rb +1 -2
  308. data/spec/unit/functions/assert_type_spec.rb +1 -1
  309. data/spec/unit/functions/empty_spec.rb +77 -0
  310. data/spec/unit/functions/epp_spec.rb +1 -1
  311. data/spec/unit/functions/flatten_spec.rb +31 -0
  312. data/spec/unit/functions/include_spec.rb +2 -2
  313. data/spec/unit/functions/inline_epp_spec.rb +1 -1
  314. data/spec/unit/functions/join_spec.rb +33 -0
  315. data/spec/unit/functions/keys_spec.rb +31 -0
  316. data/spec/unit/functions/length_spec.rb +50 -0
  317. data/spec/unit/functions/lookup_fixture_spec.rb +1 -1
  318. data/spec/unit/functions/lookup_spec.rb +52 -0
  319. data/spec/unit/functions/shared.rb +1 -1
  320. data/spec/unit/functions/values_spec.rb +30 -0
  321. data/spec/unit/functions/versioncmp_spec.rb +1 -1
  322. data/spec/unit/functions4_spec.rb +30 -32
  323. data/spec/unit/graph/title_hash_prioritizer_spec.rb +2 -1
  324. data/spec/unit/indirector/catalog/compiler_spec.rb +0 -15
  325. data/spec/unit/indirector/facts/rest_spec.rb +45 -0
  326. data/spec/unit/indirector/facts/yaml_spec.rb +6 -0
  327. data/spec/unit/indirector/file_bucket_file/file_spec.rb +2 -2
  328. data/spec/unit/indirector/indirection_spec.rb +1 -1
  329. data/spec/unit/indirector/node/ldap_spec.rb +2 -2
  330. data/spec/unit/indirector/request_spec.rb +0 -2
  331. data/spec/unit/indirector/rest_spec.rb +2 -2
  332. data/spec/unit/indirector_spec.rb +0 -1
  333. data/spec/unit/info_service_spec.rb +1 -1
  334. data/spec/unit/interface/action_manager_spec.rb +1 -1
  335. data/spec/unit/interface/action_spec.rb +1 -1
  336. data/spec/unit/module_spec.rb +0 -5
  337. data/spec/unit/module_tool/applications/builder_spec.rb +1 -1
  338. data/spec/unit/module_tool/applications/unpacker_spec.rb +4 -4
  339. data/spec/unit/network/formats_spec.rb +5 -13
  340. data/spec/unit/network/http/api/indirected_routes_spec.rb +6 -2
  341. data/spec/unit/network/http/connection_spec.rb +1 -1
  342. data/spec/unit/network/http/handler_spec.rb +3 -2
  343. data/spec/unit/node/environment_spec.rb +1 -1
  344. data/spec/unit/node_spec.rb +3 -3
  345. data/spec/unit/parser/compiler_spec.rb +9 -2
  346. data/spec/unit/parser/environment_compiler_spec.rb +8 -8
  347. data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
  348. data/spec/unit/parser/functions/fail_spec.rb +1 -1
  349. data/spec/unit/parser/functions/fqdn_rand_spec.rb +24 -0
  350. data/spec/unit/parser/functions/realize_spec.rb +1 -1
  351. data/spec/unit/parser/resource_spec.rb +0 -1
  352. data/spec/unit/parser/scope_spec.rb +3 -3
  353. data/spec/unit/parser/type_loader_spec.rb +1 -1
  354. data/spec/unit/pops/adaptable_spec.rb +0 -1
  355. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +0 -3
  356. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +0 -4
  357. data/spec/unit/pops/factory_rspec_helper.rb +1 -1
  358. data/spec/unit/pops/factory_spec.rb +5 -5
  359. data/spec/unit/pops/issues_spec.rb +23 -8
  360. data/spec/unit/pops/loaders/loaders_spec.rb +24 -2
  361. data/spec/unit/pops/loaders/static_loader_spec.rb +1 -1
  362. data/spec/unit/pops/lookup/interpolation_spec.rb +5 -0
  363. data/spec/unit/pops/lookup/lookup_spec.rb +56 -0
  364. data/spec/unit/pops/model/pn_transformer_spec.rb +53 -0
  365. data/spec/unit/pops/parser/lexer2_spec.rb +14 -5
  366. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +9 -9
  367. data/spec/unit/pops/parser/parse_calls_spec.rb +1 -1
  368. data/spec/unit/pops/parser/parse_functions_spec.rb +1 -1
  369. data/spec/unit/pops/parser/parse_heredoc_spec.rb +3 -3
  370. data/spec/unit/pops/parser/parse_lambda_spec.rb +1 -1
  371. data/spec/unit/pops/parser/parse_resource_spec.rb +35 -35
  372. data/spec/unit/pops/parser/pn_parser_spec.rb +101 -0
  373. data/spec/unit/pops/pn_spec.rb +148 -0
  374. data/spec/unit/pops/types/iterable_spec.rb +1 -1
  375. data/spec/unit/pops/types/p_object_type_spec.rb +5 -5
  376. data/spec/unit/pops/types/p_timespan_type_spec.rb +11 -4
  377. data/spec/unit/pops/types/p_timestamp_type_spec.rb +9 -2
  378. data/spec/unit/pops/types/p_type_set_type_spec.rb +106 -2
  379. data/spec/unit/pops/types/ruby_generator_spec.rb +3 -8
  380. data/spec/unit/pops/types/string_converter_spec.rb +3 -3
  381. data/spec/unit/pops/types/type_calculator_spec.rb +1 -1
  382. data/spec/unit/pops/validator/validator_spec.rb +3 -1
  383. data/spec/unit/property_spec.rb +2 -2
  384. data/spec/unit/provider/aixobject_spec.rb +1 -1
  385. data/spec/unit/provider/cron/crontab_spec.rb +3 -3
  386. data/spec/unit/provider/exec/posix_spec.rb +6 -6
  387. data/spec/unit/provider/group/groupadd_spec.rb +4 -4
  388. data/spec/unit/provider/group/windows_adsi_spec.rb +79 -22
  389. data/spec/unit/provider/ldap_spec.rb +0 -1
  390. data/spec/unit/provider/nameservice_spec.rb +5 -5
  391. data/spec/unit/provider/package/rpm_spec.rb +3 -4
  392. data/spec/unit/provider/package/yum_spec.rb +6 -2
  393. data/spec/unit/provider/parsedfile_spec.rb +1 -1
  394. data/spec/unit/provider/service/base_spec.rb +2 -4
  395. data/spec/unit/provider/service/init_spec.rb +2 -2
  396. data/spec/unit/provider/service/openrc_spec.rb +2 -2
  397. data/spec/unit/provider/service/redhat_spec.rb +2 -2
  398. data/spec/unit/provider/service/smf_spec.rb +2 -0
  399. data/spec/unit/provider/service/systemd_spec.rb +3 -3
  400. data/spec/unit/provider/service/upstart_spec.rb +7 -7
  401. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +0 -4
  402. data/spec/unit/provider/sshkey/parsed_spec.rb +0 -2
  403. data/spec/unit/provider/user/useradd_spec.rb +15 -9
  404. data/spec/unit/provider/user/windows_adsi_spec.rb +4 -4
  405. data/spec/unit/provider/yumrepo/inifile_spec.rb +76 -0
  406. data/spec/unit/puppet_pal_2pec.rb +4 -5
  407. data/spec/unit/resource/catalog_spec.rb +8 -3
  408. data/spec/unit/resource/status_spec.rb +15 -4
  409. data/spec/unit/resource/type_spec.rb +2 -3
  410. data/spec/unit/settings_spec.rb +9 -4
  411. data/spec/unit/ssl/certificate_authority_spec.rb +1 -9
  412. data/spec/unit/ssl/certificate_request_spec.rb +1 -2
  413. data/spec/unit/transaction/report_spec.rb +41 -0
  414. data/spec/unit/transaction_spec.rb +1 -1
  415. data/spec/unit/type/exec_spec.rb +7 -9
  416. data/spec/unit/type/file/selinux_spec.rb +0 -1
  417. data/spec/unit/type/file_spec.rb +4 -3
  418. data/spec/unit/type/k5login_spec.rb +79 -10
  419. data/spec/unit/type/mount_spec.rb +1 -1
  420. data/spec/unit/type/nagios_spec.rb +6 -6
  421. data/spec/unit/type/user_spec.rb +1 -1
  422. data/spec/unit/type/yumrepo_spec.rb +18 -0
  423. data/spec/unit/type/zfs_spec.rb +1 -1
  424. data/spec/unit/type_spec.rb +14 -15
  425. data/spec/unit/util/docs_spec.rb +1 -1
  426. data/spec/unit/util/execution_spec.rb +0 -1
  427. data/spec/unit/util/inifile_spec.rb +35 -4
  428. data/spec/unit/util/log/destinations_spec.rb +2 -2
  429. data/spec/unit/util/log_spec.rb +6 -5
  430. data/spec/unit/util/network_device/cisco/device_spec.rb +2 -2
  431. data/spec/unit/util/plist_spec.rb +3 -3
  432. data/spec/unit/util/selinux_spec.rb +2 -2
  433. data/spec/unit/util/tagging_spec.rb +1 -7
  434. data/spec/unit/util/windows/adsi_spec.rb +31 -27
  435. data/spec/unit/util/windows/sid_spec.rb +86 -15
  436. data/spec/unit/util_spec.rb +2 -2
  437. data/spec/watchr.rb +0 -1
  438. data/tasks/benchmark.rake +37 -0
  439. data/tasks/manpages.rake +1 -1
  440. metadata +71 -11
  441. checksums.yaml +0 -7
@@ -34,7 +34,7 @@ module HeredocSupport
34
34
  endtag = $1.strip
35
35
  end
36
36
 
37
- lex_error(Issues::HEREDOC_MISSING_ENDTAG) unless endtag.length >= 1
37
+ lex_error(Issues::HEREDOC_EMPTY_ENDTAG) unless endtag.length >= 1
38
38
 
39
39
  resulting_escapes = []
40
40
  if escapes
@@ -30,7 +30,7 @@ module LexerSupport
30
30
 
31
31
  # Raises a Puppet::LexError with the given message
32
32
  def lex_error_without_pos(issue, args = {})
33
- raise Puppet::ParseErrorWithIssue.new(issue.format(args), nil, nil, nil, nil, issue.issue_code)
33
+ raise Puppet::ParseErrorWithIssue.new(issue.format(args), nil, nil, nil, nil, issue.issue_code, args)
34
34
  end
35
35
 
36
36
  # Raises a Puppet::ParserErrorWithIssue with the given issue and arguments
@@ -73,7 +73,8 @@ module LexerSupport
73
73
  line(pos),
74
74
  position(pos),
75
75
  nil,
76
- issue.issue_code)
76
+ issue.issue_code,
77
+ args)
77
78
  end
78
79
 
79
80
  # Asserts that the given string value is a float, or an integer in decimal, octal or hex form.
@@ -155,8 +155,6 @@ class Locator
155
155
  end
156
156
  end
157
157
 
158
- private
159
-
160
158
  class AbstractLocator < Locator
161
159
  attr_accessor :line_index
162
160
  attr_accessor :string
@@ -0,0 +1,316 @@
1
+ module Puppet::Pops
2
+ module Parser
3
+
4
+ class PNParser
5
+ LIT_TRUE = 'true'.freeze
6
+ LIT_FALSE = 'false'.freeze
7
+ LIT_NIL = 'nil'.freeze
8
+
9
+ TOKEN_END = 0
10
+ TOKEN_BOOL = 1
11
+ TOKEN_NIL = 2
12
+ TOKEN_INT = 3
13
+ TOKEN_FLOAT = 4
14
+ TOKEN_IDENTIFIER = 5
15
+ TOKEN_WS = 0x20
16
+ TOKEN_STRING = 0x22
17
+ TOKEN_KEY = 0x3a
18
+ TOKEN_LP = 0x28
19
+ TOKEN_RP = 0x29
20
+ TOKEN_LB = 0x5b
21
+ TOKEN_RB = 0x5d
22
+ TOKEN_LC = 0x7b
23
+ TOKEN_RC = 0x7d
24
+
25
+ TYPE_END = 0
26
+ TYPE_WS = 1
27
+ TYPE_DELIM = 2
28
+ TYPE_KEY_START = 3
29
+ TYPE_STRING_START = 4
30
+ TYPE_IDENTIFIER = 5
31
+ TYPE_MINUS = 6
32
+ TYPE_DIGIT = 7
33
+ TYPE_ALPHA = 8
34
+
35
+ def initialize
36
+ @char_types = self.class.char_types
37
+ end
38
+
39
+ def parse(text, locator = nil, offset = nil)
40
+ @locator = locator
41
+ @offset = offset
42
+ @text = text
43
+ @codepoints = text.codepoints.to_a.freeze
44
+ @pos = 0
45
+ @token = TOKEN_END
46
+ @token_value = nil
47
+ next_token
48
+ parse_next
49
+ end
50
+
51
+ private
52
+
53
+ def parse_next
54
+ case @token
55
+ when TOKEN_LB
56
+ parse_array
57
+ when TOKEN_LC
58
+ parse_map
59
+ when TOKEN_LP
60
+ parse_call
61
+ when TOKEN_BOOL, TOKEN_INT, TOKEN_FLOAT, TOKEN_STRING, TOKEN_NIL
62
+ parse_literal
63
+ when TOKEN_END
64
+ parse_error(_('unexpected end of input'))
65
+ else
66
+ parse_error(_('unexpected %{value}' % { value: @token_value }))
67
+ end
68
+ end
69
+
70
+ def parse_error(message)
71
+ file = ''
72
+ line = 1
73
+ pos = 1
74
+ if @locator
75
+ file = @locator.file
76
+ line = @locator.line_for_offset(@offset)
77
+ pos = @locator.pos_on_line(@offset)
78
+ end
79
+ @codepoints[0, @pos].each do |c|
80
+ if c == 0x09
81
+ line += 1
82
+ pos = 1
83
+ end
84
+ end
85
+ raise Puppet::ParseError.new(message, file, line, pos)
86
+ end
87
+
88
+ def parse_literal
89
+ pn = PN::Literal.new(@token_value)
90
+ next_token
91
+ pn
92
+ end
93
+
94
+ def parse_array
95
+ next_token
96
+ PN::List.new(parse_elements(TOKEN_RB))
97
+ end
98
+
99
+ def parse_map
100
+ next_token
101
+ entries = []
102
+ while @token != TOKEN_RC && @token != TOKEN_END
103
+ parse_error(_('map key expected')) unless @token == TOKEN_KEY
104
+ key = @token_value
105
+ next_token
106
+ entries << parse_next.with_name(key)
107
+ end
108
+ next_token
109
+ PN::Map.new(entries)
110
+ end
111
+
112
+ def parse_call
113
+ next_token
114
+ parse_error(_("expected identifier to follow '('")) unless @token == TOKEN_IDENTIFIER
115
+ name = @token_value
116
+ next_token
117
+ PN::Call.new(name, *parse_elements(TOKEN_RP))
118
+ end
119
+
120
+ def parse_elements(end_token)
121
+ elements = []
122
+ while @token != end_token && @token != TOKEN_END
123
+ elements << parse_next
124
+ end
125
+ parse_error(_("missing '%{token}' to end list") % { token: end_token.chr(Encoding::UTF_8) } ) unless @token == end_token
126
+ next_token
127
+ elements
128
+ end
129
+
130
+ # All methods below belong to the PN lexer
131
+ def self.char_types
132
+ unless instance_variable_defined?(:@char_types)
133
+ @char_types = Array.new(0x80, TYPE_IDENTIFIER)
134
+ @char_types[0] = TYPE_END
135
+ [0x09, 0x0d, 0x0a, 0x20].each { |n| @char_types[n] = TYPE_WS }
136
+ [TOKEN_LP, TOKEN_RP, TOKEN_LB, TOKEN_RB, TOKEN_LC, TOKEN_RC].each { |n| @char_types[n] = TYPE_DELIM }
137
+ @char_types[0x2d] = TYPE_MINUS
138
+ (0x30..0x39).each { |n| @char_types[n] = TYPE_DIGIT }
139
+ (0x41..0x5a).each { |n| @char_types[n] = TYPE_ALPHA }
140
+ (0x61..0x7a).each { |n| @char_types[n] = TYPE_ALPHA }
141
+ @char_types[TOKEN_KEY] = TYPE_KEY_START
142
+ @char_types[TOKEN_STRING] = TYPE_STRING_START
143
+ @char_types.freeze
144
+ end
145
+ @char_types
146
+ end
147
+
148
+ def next_token
149
+ skip_white
150
+ s = @pos
151
+ c = next_cp
152
+
153
+ case @char_types[c]
154
+ when TYPE_END
155
+ @token_value = nil
156
+ @token = TOKEN_END
157
+
158
+ when TYPE_MINUS
159
+ if @char_types[peek_cp] == TYPE_DIGIT
160
+ next_token # consume float or integer
161
+ @token_value = -@token_value
162
+ else
163
+ consume_identifier(s)
164
+ end
165
+
166
+ when TYPE_DIGIT
167
+ skip_decimal_digits
168
+ c = peek_cp
169
+ if c == 0x2e # '.'
170
+ @pos += 1
171
+ consume_float(s, c)
172
+ else
173
+ @token_value = @text[s..@pos].to_i
174
+ @token = TOKEN_INT
175
+ end
176
+
177
+ when TYPE_DELIM
178
+ @token_value = @text[s]
179
+ @token = c
180
+
181
+ when TYPE_KEY_START
182
+ if @char_types[peek_cp] == TYPE_ALPHA
183
+ next_token
184
+ @token = TOKEN_KEY
185
+ else
186
+ parse_error(_("expected identifier after ':'"))
187
+ end
188
+
189
+ when TYPE_STRING_START
190
+ consume_string
191
+ else
192
+ consume_identifier(s)
193
+ end
194
+ end
195
+
196
+ def consume_identifier(s)
197
+ while @char_types[peek_cp] >= TYPE_IDENTIFIER do
198
+ @pos += 1
199
+ end
200
+ id = @text[s...@pos]
201
+ case id
202
+ when LIT_TRUE
203
+ @token = TOKEN_BOOL
204
+ @token_value = true
205
+ when LIT_FALSE
206
+ @token = TOKEN_BOOL
207
+ @token_value = false
208
+ when LIT_NIL
209
+ @token = TOKEN_NIL
210
+ @token_value = nil
211
+ else
212
+ @token = TOKEN_IDENTIFIER
213
+ @token_value = id
214
+ end
215
+ end
216
+
217
+ def consume_string
218
+ s = @pos
219
+ b = ''
220
+ loop do
221
+ c = next_cp
222
+ case c
223
+ when TOKEN_END
224
+ @pos = s - 1
225
+ parse_error(_('unterminated quote'))
226
+ when TOKEN_STRING
227
+ @token_value = b
228
+ @token = TOKEN_STRING
229
+ break
230
+ when 0x5c # '\'
231
+ c = next_cp
232
+ case c
233
+ when 0x74 # 't'
234
+ b << "\t"
235
+ when 0x72 # 'r'
236
+ b << "\r"
237
+ when 0x6e # 'n'
238
+ b << "\n"
239
+ when TOKEN_STRING
240
+ b << '"'
241
+ when 0x5c # '\'
242
+ b << "\\"
243
+ when 0x6f # 'o'
244
+ c = 0
245
+ 3.times do
246
+ n = next_cp
247
+ if 0x30 <= n && n <= 0x37c
248
+ c *= 8
249
+ c += n - 0x30
250
+ else
251
+ parse_error(_('malformed octal quote'))
252
+ end
253
+ end
254
+ b << c
255
+ else
256
+ b << "\\"
257
+ b << c
258
+ end
259
+ else
260
+ b << c
261
+ end
262
+ end
263
+ end
264
+
265
+ def consume_float(s, d)
266
+ parse_error(_('digit expected')) if skip_decimal_digits == 0
267
+ c = peek_cp
268
+ if d == 0x2e # '.'
269
+ if c == 0x45 || c == 0x65 # 'E' or 'e'
270
+ @pos += 1
271
+ parse_error(_('digit expected')) if skip_decimal_digits == 0
272
+ c = peek_cp
273
+ end
274
+ end
275
+ parse_error(_('digit expected')) if @char_types[c] == TYPE_ALPHA
276
+ @token_value = @text[s...@pos].to_f
277
+ @token = TOKEN_FLOAT
278
+ end
279
+
280
+ def skip_decimal_digits
281
+ count = 0
282
+ c = peek_cp
283
+ if c == 0x2d || c == 0x2b # '-' or '+'
284
+ @pos += 1
285
+ c = peek_cp
286
+ end
287
+
288
+ while @char_types[c] == TYPE_DIGIT do
289
+ @pos += 1
290
+ c = peek_cp
291
+ count += 1
292
+ end
293
+ count
294
+ end
295
+
296
+ def skip_white
297
+ while @char_types[peek_cp] == TYPE_WS do
298
+ @pos += 1
299
+ end
300
+ end
301
+
302
+ def next_cp
303
+ c = 0
304
+ if @pos < @codepoints.size
305
+ c = @codepoints[@pos]
306
+ @pos += 1
307
+ end
308
+ c
309
+ end
310
+
311
+ def peek_cp
312
+ @pos < @codepoints.size ? @codepoints[@pos] : 0
313
+ end
314
+ end
315
+ end
316
+ end
@@ -31,14 +31,7 @@ module Pcore
31
31
  instance
32
32
  end
33
33
 
34
- def self.init(loader, ir, for_agent)
35
- add_alias('Pcore::URI_RX', TYPE_URI_RX, loader)
36
- add_type(TYPE_URI_ALIAS, loader)
37
- add_alias('Pcore::SimpleTypeName', TYPE_SIMPLE_TYPE_NAME, loader)
38
- add_alias('Pcore::MemberName', TYPE_MEMBER_NAME, loader)
39
- add_alias('Pcore::TypeName', TYPE_QUALIFIED_REFERENCE, loader)
40
- add_alias('Pcore::QRef', TYPE_QUALIFIED_REFERENCE, loader)
41
-
34
+ def self.init_env(loader)
42
35
  if Puppet[:tasks]
43
36
  add_object_type('Task', <<-PUPPET, loader)
44
37
  {
@@ -83,18 +76,25 @@ module Pcore
83
76
  }
84
77
  PUPPET
85
78
  end
79
+ end
80
+
81
+ def self.init(loader, ir)
82
+ add_alias('Pcore::URI_RX', TYPE_URI_RX, loader)
83
+ add_type(TYPE_URI_ALIAS, loader)
84
+ add_alias('Pcore::SimpleTypeName', TYPE_SIMPLE_TYPE_NAME, loader)
85
+ add_alias('Pcore::MemberName', TYPE_MEMBER_NAME, loader)
86
+ add_alias('Pcore::TypeName', TYPE_QUALIFIED_REFERENCE, loader)
87
+ add_alias('Pcore::QRef', TYPE_QUALIFIED_REFERENCE, loader)
86
88
  Types::TypedModelObject.register_ptypes(loader, ir)
87
89
 
88
90
  @type = create_object_type(loader, ir, Pcore, 'Pcore', nil)
89
91
 
90
- ir.register_implementation_namespace('Pcore', 'Puppet::Pops::Pcore', loader)
91
- ir.register_implementation_namespace('Puppet::AST', 'Puppet::Pops::Model', loader)
92
- ir.register_implementation('Puppet::AST::Locator', 'Puppet::Pops::Parser::Locator::Locator19', loader)
93
- unless for_agent
94
- Resource.register_ptypes(loader, ir)
95
- Lookup::Context.register_ptype(loader, ir);
96
- Lookup::DataProvider.register_types(loader)
97
- end
92
+ ir.register_implementation_namespace('Pcore', 'Puppet::Pops::Pcore')
93
+ ir.register_implementation_namespace('Puppet::AST', 'Puppet::Pops::Model')
94
+ ir.register_implementation('Puppet::AST::Locator', 'Puppet::Pops::Parser::Locator::Locator19')
95
+ Resource.register_ptypes(loader, ir)
96
+ Lookup::Context.register_ptype(loader, ir);
97
+ Lookup::DataProvider.register_types(loader)
98
98
  end
99
99
 
100
100
  # Create and register a new `Object` type in the Puppet Type System and map it to an implementation class
@@ -116,7 +116,7 @@ module Pcore
116
116
  init_hash[Types::KEY_ATTRIBUTES] = attributes_hash unless attributes_hash.empty?
117
117
  init_hash[Types::KEY_FUNCTIONS] = functions_hash unless functions_hash.empty?
118
118
  init_hash[Types::KEY_EQUALITY] = equality unless equality.nil?
119
- ir.register_implementation(type_name, impl_class, loader)
119
+ ir.register_implementation(type_name, impl_class)
120
120
  add_type(Types::PObjectType.new(type_name, init_hash), loader)
121
121
  end
122
122
 
@@ -0,0 +1,236 @@
1
+ module Puppet::Pops
2
+ module PN
3
+ KEY_PATTERN = /^[A-Za-z_-][0-9A-Za-z_-]*$/
4
+
5
+ def pnError(message)
6
+ raise ArgumentError, message
7
+ end
8
+
9
+ def as_call(name)
10
+ Call.new(name, self)
11
+ end
12
+
13
+ def as_parameters
14
+ [self]
15
+ end
16
+
17
+ def ==(o)
18
+ eql?(o)
19
+ end
20
+
21
+ def to_s
22
+ s = ''
23
+ format(nil, s)
24
+ s
25
+ end
26
+
27
+ def with_name(name)
28
+ Entry.new(name, self)
29
+ end
30
+
31
+ def double_quote(str, bld)
32
+ bld << '"'
33
+ str.each_codepoint do |codepoint|
34
+ case codepoint
35
+ when 0x09
36
+ bld << '\\t'
37
+ when 0x0a
38
+ bld << '\\n'
39
+ when 0x0d
40
+ bld << '\\r'
41
+ when 0x22
42
+ bld << '\\"'
43
+ when 0x5c
44
+ bld << '\\\\'
45
+ else
46
+ if codepoint < 0x20
47
+ bld << sprintf('\\o%3.3o', codepoint)
48
+ elsif codepoint <= 0x7f
49
+ bld << codepoint
50
+ else
51
+ bld << [codepoint].pack('U')
52
+ end
53
+ end
54
+ end
55
+ bld << '"'
56
+ end
57
+
58
+ def format_elements(elements, indent, b)
59
+ elements.each_with_index do |e, i|
60
+ if indent
61
+ b << "\n" << indent.current
62
+ elsif i > 0
63
+ b << ' '
64
+ end
65
+ e.format(indent, b)
66
+ end
67
+ end
68
+
69
+ class Indent
70
+ attr_reader :current
71
+ def initialize(indent = ' ', current = '')
72
+ @indent = indent
73
+ @current = current
74
+ end
75
+
76
+ def increase
77
+ Indent.new(@indent, @current + @indent)
78
+ end
79
+ end
80
+
81
+ class Call
82
+ include PN
83
+ attr_reader :name, :elements
84
+
85
+ def initialize(name, *elements)
86
+ @name = name
87
+ @elements = elements
88
+ end
89
+
90
+ def [](idx)
91
+ @elements[idx]
92
+ end
93
+
94
+ def as_call(name)
95
+ Call.new(name, *@elements)
96
+ end
97
+
98
+ def as_parameters
99
+ List.new(@elements)
100
+ end
101
+
102
+ def eql?(o)
103
+ o.is_a?(Call) && @name == o.name && @elements == o.elements
104
+ end
105
+
106
+ def format(indent, b)
107
+ b << '(' << @name
108
+ if @elements.size > 0
109
+ b << ' ' unless indent
110
+ format_elements(@elements, indent ? indent.increase : nil, b)
111
+ end
112
+ b << ')'
113
+ end
114
+
115
+ def to_data
116
+ { '^' => [@name] + @elements.map { |e| e.to_data } }
117
+ end
118
+ end
119
+
120
+ class Entry
121
+ attr_reader :key, :value
122
+ def initialize(key, value)
123
+ @key = key
124
+ @value = value
125
+ end
126
+
127
+ def eql?(o)
128
+ o.is_a?(Entry) && @key == o.key && @value == o.value
129
+ end
130
+
131
+ alias == eql?
132
+ end
133
+
134
+ class List
135
+ include PN
136
+ attr_reader :elements
137
+
138
+ def initialize(elements)
139
+ @elements = elements
140
+ end
141
+
142
+ def [](idx)
143
+ @elements[idx]
144
+ end
145
+
146
+ def as_call(name)
147
+ Call.new(name, *@elements)
148
+ end
149
+
150
+ def as_parameters
151
+ @elements
152
+ end
153
+
154
+ def eql?(o)
155
+ o.is_a?(List) && @elements == o.elements
156
+ end
157
+
158
+ def format(indent, b)
159
+ b << '['
160
+ format_elements(@elements, indent ? indent.increase : nil, b) unless @elements.empty?
161
+ b << ']'
162
+ end
163
+
164
+ def to_data
165
+ @elements.map { |e| e.to_data }
166
+ end
167
+ end
168
+
169
+ class Literal
170
+ include PN
171
+ attr_reader :value
172
+
173
+ def initialize(value)
174
+ @value = value
175
+ end
176
+
177
+ def format(indent, b)
178
+ if @value.nil?
179
+ b << 'nil'
180
+ elsif value.is_a?(String)
181
+ double_quote(value, b)
182
+ else
183
+ b << value.to_s
184
+ end
185
+ end
186
+
187
+ def eql?(o)
188
+ o.is_a?(Literal) && @value == o.value
189
+ end
190
+
191
+ def to_data
192
+ @value
193
+ end
194
+ end
195
+
196
+ class Map
197
+ include PN
198
+ attr_reader :entries
199
+
200
+ def initialize(entries)
201
+ entries.each { |e| pnError("key #{e.key} does not conform to pattern /#{KEY_PATTERN.source}/)") unless e.key =~ KEY_PATTERN }
202
+ @entries = entries
203
+ end
204
+
205
+ def eql?(o)
206
+ o.is_a?(Map) && @entries == o.entries
207
+ end
208
+
209
+ def format(indent, b)
210
+ local_indent = indent ? indent.increase : nil
211
+ b << '{'
212
+ @entries.each_with_index do |e,i|
213
+ if indent
214
+ b << "\n" << local_indent.current
215
+ elsif i > 0
216
+ b << ' '
217
+ end
218
+ b << ':' << e.key
219
+ b << ' '
220
+ e.value.format(local_indent, b)
221
+ end
222
+ b << '}'
223
+ end
224
+
225
+ def to_data
226
+ r = []
227
+ @entries.each { |e| r << e.key << e.value.to_data }
228
+ { '#' => r }
229
+ end
230
+ end
231
+ end
232
+ end
233
+
234
+ require_relative 'model/pn_transformer'
235
+ require_relative 'parser/pn_parser'
236
+