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
@@ -174,6 +174,59 @@ describe Puppet::Face[:epp, :current] do
174
174
  expect(@logs[0].message).to match(/Syntax error at 'b'/)
175
175
  expect(@logs[0].level).to eq(:err)
176
176
  end
177
+
178
+ context "using 'pn' format" do
179
+ it "prints the AST of the given expression in PN format" do
180
+ expect(eppface.dump({ :format => 'pn', :e => 'hello world' })).to eq(
181
+ '(lambda {:body [(epp (render-s "hello world"))]})')
182
+ end
183
+
184
+ it "pretty prints the AST of the given expression in PN format when --pretty is given" do
185
+ expect(eppface.dump({ :pretty => true, :format => 'pn', :e => 'hello world' })).to eq(<<-RESULT.unindent[0..-2])
186
+ (lambda
187
+ {
188
+ :body [
189
+ (epp
190
+ (render-s
191
+ "hello world"))]})
192
+ RESULT
193
+ end
194
+ end
195
+
196
+ context "using 'json' format" do
197
+ it "prints the AST of the given expression in JSON based on the PN format" do
198
+ expect(eppface.dump({ :format => 'json', :e => 'hello world' })).to eq(
199
+ '{"^":["lambda",{"#":["body",[{"^":["epp",{"^":["render-s","hello world"]}]}]]}]}')
200
+ end
201
+
202
+ it "pretty prints the AST of the given expression in JSON based on the PN format when --pretty is given" do
203
+ expect(eppface.dump({ :pretty => true, :format => 'json', :e => 'hello world' })).to eq(<<-RESULT.unindent[0..-2])
204
+ {
205
+ "^": [
206
+ "lambda",
207
+ {
208
+ "#": [
209
+ "body",
210
+ [
211
+ {
212
+ "^": [
213
+ "epp",
214
+ {
215
+ "^": [
216
+ "render-s",
217
+ "hello world"
218
+ ]
219
+ }
220
+ ]
221
+ }
222
+ ]
223
+ ]
224
+ }
225
+ ]
226
+ }
227
+ RESULT
228
+ end
229
+ end
177
230
  end
178
231
 
179
232
  context "render" do
@@ -307,7 +360,6 @@ describe Puppet::Face[:epp, :current] do
307
360
  end
308
361
 
309
362
  it "renders multiple files separated by headers by default" do
310
- modules_dir = File.join(dir, 'environments', 'production', 'modules')
311
363
  # chomp the last newline, it is put there by heredoc
312
364
  expect(eppface.render('m1/greetings.epp', 'm2/goodbye.epp')).to eq(<<-EOT.chomp)
313
365
  --- m1/greetings.epp
@@ -318,7 +370,6 @@ goodbye world
318
370
  end
319
371
 
320
372
  it "outputs multiple files verbatim when --no-headers is given" do
321
- modules_dir = File.join(dir, 'environments', 'production', 'modules')
322
373
  expect(eppface.render('m1/greetings.epp', 'm2/goodbye.epp', :header => false)).to eq("hello worldgoodbye world")
323
374
  end
324
375
  end
@@ -1,9 +1,62 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
3
  require 'puppet/face'
4
+ require 'puppet/indirector/facts/facter'
5
+ require 'puppet/indirector/facts/rest'
4
6
 
5
7
  describe Puppet::Face[:facts, '0.0.1'] do
6
8
  describe "#find" do
7
9
  it { is_expected.to be_action :find }
8
10
  end
11
+
12
+ describe '#upload' do
13
+ let(:model) { Puppet::Node::Facts }
14
+ let(:test_data) { model.new('puppet.node.test', {test_fact: 'test value'}) }
15
+ let(:facter_terminus) { model.indirection.terminus(:facter) }
16
+ let(:rest_terminus) { model.indirection.terminus(:rest) }
17
+
18
+ before(:each) do
19
+ Puppet.settings.parse_config(<<-CONF)
20
+ [main]
21
+ server=puppet.server.invalid
22
+ certname=puppet.node.invalid
23
+ [agent]
24
+ server=puppet.server.test
25
+ node_name_value=puppet.node.test
26
+ CONF
27
+
28
+ # Faces start in :user run mode
29
+ Puppet.settings.preferred_run_mode = :user
30
+
31
+ facter_terminus.stubs(:find).with(instance_of(Puppet::Indirector::Request)).returns(test_data)
32
+ rest_terminus.stubs(:save).with(instance_of(Puppet::Indirector::Request)).returns(nil)
33
+ end
34
+
35
+ it { is_expected.to be_action :upload }
36
+
37
+ it "finds facts from terminus_class :facter" do
38
+ facter_terminus.expects(:find).with(instance_of(Puppet::Indirector::Request)).returns(test_data)
39
+
40
+ subject.upload
41
+ end
42
+
43
+ it "saves facts to terminus_class :rest" do
44
+ rest_terminus.expects(:save).with(instance_of(Puppet::Indirector::Request)).returns(nil)
45
+
46
+ subject.upload
47
+ end
48
+
49
+ it "uses settings from the agent section of puppet.conf" do
50
+ facter_terminus.expects(:find).with(responds_with(:key, 'puppet.node.test')).returns(test_data)
51
+
52
+ subject.upload
53
+ end
54
+
55
+ it "logs the name of the server that received the upload" do
56
+ subject.upload
57
+
58
+ expect(@logs).to be_any {|log| log.level == :notice &&
59
+ log.message =~ /Uploading facts for '.*' to: 'puppet\.server\.test'/}
60
+ end
61
+ end
9
62
  end
@@ -3,31 +3,30 @@ require 'spec_helper'
3
3
  require 'puppet/face'
4
4
 
5
5
  describe Puppet::Face[:help, '0.0.1'] do
6
- it "has a help action" do
6
+ it 'has a help action' do
7
7
  expect(subject).to be_action :help
8
8
  end
9
9
 
10
- it "has a default action of help" do
10
+ it 'has a default action of help' do
11
11
  expect(subject.get_action('help')).to be_default
12
12
  end
13
13
 
14
- it "accepts a call with no arguments" do
14
+ it 'accepts a call with no arguments' do
15
15
  expect {
16
16
  subject.help()
17
17
  }.to_not raise_error
18
18
  end
19
19
 
20
- it "accepts a face name" do
20
+ it 'accepts a face name' do
21
21
  expect { subject.help(:help) }.to_not raise_error
22
22
  end
23
23
 
24
- it "accepts a face and action name" do
24
+ it 'accepts a face and action name' do
25
25
  expect { subject.help(:help, :help) }.to_not raise_error
26
26
  end
27
27
 
28
- it "fails if more than a face and action are given" do
29
- expect { subject.help(:help, :help, :for_the_love_of_god) }.
30
- to raise_error ArgumentError
28
+ it 'fails if more than a face and action are given' do
29
+ expect { subject.help(:help, :help, :for_the_love_of_god) }.to raise_error ArgumentError
31
30
  end
32
31
 
33
32
  it "treats :current and 'current' identically" do
@@ -36,37 +35,48 @@ describe Puppet::Face[:help, '0.0.1'] do
36
35
  )
37
36
  end
38
37
 
39
- it "raises an error when the face is unavailable" do
38
+ it 'raises an error when the face is unavailable' do
40
39
  expect {
41
40
  subject.help(:huzzah, :bar, :version => '17.0.0')
42
41
  }.to raise_error(ArgumentError, /Could not find version 17\.0\.0/)
43
42
  end
44
43
 
45
- it "finds a face by version" do
44
+ it 'finds a face by version' do
46
45
  face = Puppet::Face[:huzzah, :current]
47
46
  expect(subject.help(:huzzah, :version => face.version)).
48
47
  to eq(subject.help(:huzzah, :version => :current))
49
48
  end
50
49
 
51
- it "raises an ArgumentError if the face raises a StandardError" do
52
- face = Puppet::Face[:module, :current]
53
- face.stubs(:short_description).raises(StandardError, "whoops")
50
+ context 'rendering has an error' do
51
+ it 'raises an ArgumentError if the face raises a StandardError' do
52
+ face = Puppet::Face[:module, :current]
53
+ face.stubs(:short_description).raises(StandardError, 'whoops')
54
54
 
55
- expect {
56
- subject.help(:module)
57
- }.to raise_error(ArgumentError, /Detail: "whoops"/)
58
- end
55
+ expect {
56
+ subject.help(:module)
57
+ }.to raise_error(ArgumentError, /Detail: "whoops"/)
58
+ end
59
59
 
60
- it "raises an ArgumentError if the face raises a LoadError" do
61
- face = Puppet::Face[:module, :current]
62
- face.stubs(:short_description).raises(LoadError, "cannot load such file -- yard")
60
+ it 'raises an ArgumentError if the face raises a LoadError' do
61
+ face = Puppet::Face[:module, :current]
62
+ face.stubs(:short_description).raises(LoadError, 'cannot load such file -- yard')
63
63
 
64
- expect {
65
- subject.help(:module)
66
- }.to raise_error(ArgumentError, /Detail: "cannot load such file -- yard"/)
64
+ expect {
65
+ subject.help(:module)
66
+ }.to raise_error(ArgumentError, /Detail: "cannot load such file -- yard"/)
67
+ end
68
+
69
+ context 'with face actions' do
70
+ it 'returns an error if we can not get an action for the module' do
71
+ face = Puppet::Face[:module, :current]
72
+ face.stubs(:get_action).returns(nil)
73
+
74
+ expect {subject.help('module', 'list')}.to raise_error(ArgumentError, /Unable to load action list from Puppet::Face/)
75
+ end
76
+ end
67
77
  end
68
78
 
69
- context "when listing subcommands" do
79
+ context 'when listing subcommands' do
70
80
  subject { Puppet::Face[:help, :current].help }
71
81
 
72
82
  RSpec::Matchers.define :have_a_summary do
@@ -78,13 +88,13 @@ describe Puppet::Face[:help, '0.0.1'] do
78
88
  # Check a precondition for the next block; if this fails you have
79
89
  # something odd in your set of face, and we skip testing things that
80
90
  # matter. --daniel 2011-04-10
81
- it "has at least one face with a summary" do
91
+ it 'has at least one face with a summary' do
82
92
  expect(Puppet::Face.faces).to be_any do |name|
83
93
  Puppet::Face[name, :current].summary
84
94
  end
85
95
  end
86
96
 
87
- it "lists all faces which are runnable from the command line" do
97
+ it 'lists all faces which are runnable from the command line' do
88
98
  help_face = Puppet::Face[:help, :current]
89
99
  # The main purpose of the help face is to provide documentation for
90
100
  # command line users. It shouldn't show documentation for faces
@@ -102,36 +112,17 @@ describe Puppet::Face[:help, '0.0.1'] do
102
112
  end
103
113
  end
104
114
 
105
- it "returns an 'unavailable' summary if the 'agent' application fails to generate help" do
106
- Puppet::Application['agent'].class.any_instance.stubs(:summary).raises(ArgumentError, "whoops")
107
-
108
- expect(subject).to match(/agent\s+! Subcommand unavailable due to error\. Check error logs\./)
109
- end
110
-
111
- it "returns an 'unavailable' summary if the legacy application raises a LoadError" do
112
- Puppet::Application['agent'].class.any_instance.stubs(:summary).raises(LoadError, "cannot load such file -- yard")
113
-
114
- expect(subject).to match(/agent\s+! Subcommand unavailable due to error\. Check error logs\./)
115
- end
116
-
117
- context "face summaries" do
118
- it "can generate face summaries" do
115
+ context 'face summaries' do
116
+ it 'can generate face summaries' do
119
117
  faces = Puppet::Face.faces
120
118
  expect(faces.length).to be > 0
121
119
  faces.each do |name|
122
120
  expect(Puppet::Face[name, :current]).to have_a_summary
123
121
  end
124
122
  end
125
-
126
- it "returns an 'unavailable' summary if the face application raises a LoadError" do
127
- face = Puppet::Face[:module, :current]
128
- face.stubs(:summary).raises(LoadError, "cannot load such file -- yard")
129
-
130
- expect(Puppet::Face[:help, :current].help).to match(/module\s+! Subcommand unavailable due to error\. Check error logs\./)
131
- end
132
123
  end
133
124
 
134
- it "lists all legacy applications" do
125
+ it 'lists all legacy applications' do
135
126
  Puppet::Face[:help, :current].legacy_applications.each do |appname|
136
127
  expect(subject).to match(%r{ #{appname} })
137
128
 
@@ -141,24 +132,24 @@ describe Puppet::Face[:help, '0.0.1'] do
141
132
  end
142
133
  end
143
134
 
144
- context "deprecated faces" do
145
- it "prints a deprecation warning for deprecated faces" do
135
+ context 'deprecated faces' do
136
+ it 'prints a deprecation warning for deprecated faces' do
146
137
  Puppet::Face[:module, :current].stubs(:deprecated?).returns(true)
147
138
  expect(Puppet::Face[:help, :current].help(:module)).to match(/Warning: 'puppet module' is deprecated/)
148
139
  end
149
140
  end
150
141
 
151
- context "#all_application_summaries" do
152
- it "appends a deprecation warning for deprecated faces" do
142
+ context '#all_application_summaries' do
143
+ it 'appends a deprecation warning for deprecated faces' do
153
144
  # Stub the module face as deprecated
154
145
  Puppet::Face[:module, :current].expects(:deprecated?).returns(true)
155
- result = Puppet::Face[:help, :current].all_application_summaries.each do |appname,summary|
146
+ Puppet::Face[:help, :current].all_application_summaries.each do |appname,summary|
156
147
  expect(summary).to match(/Deprecated/) if appname == 'module'
157
148
  end
158
149
  end
159
150
  end
160
151
 
161
- context "#legacy_applications" do
152
+ context '#legacy_applications' do
162
153
  subject { Puppet::Face[:help, :current].legacy_applications }
163
154
 
164
155
  # If we don't, these tests are ... less than useful, because they assume
@@ -175,7 +166,7 @@ describe Puppet::Face[:help, '0.0.1'] do
175
166
  end
176
167
  end
177
168
 
178
- context "help for legacy applications" do
169
+ context 'help for legacy applications' do
179
170
  subject { Puppet::Face[:help, :current] }
180
171
  let :appname do subject.legacy_applications.first end
181
172
 
@@ -183,7 +174,7 @@ describe Puppet::Face[:help, '0.0.1'] do
183
174
  # we don't get into a loop where we either test a face-based replacement
184
175
  # and fail to notice breakage, or where we have to constantly rewrite this
185
176
  # test and all. --daniel 2011-04-11
186
- it "returns the legacy help when given the subcommand" do
177
+ it 'returns the legacy help when given the subcommand' do
187
178
  help = subject.help(appname)
188
179
  expect(help).to match(/puppet-#{appname}/)
189
180
  %w{SYNOPSIS USAGE DESCRIPTION OPTIONS COPYRIGHT}.each do |heading|
@@ -191,25 +182,27 @@ describe Puppet::Face[:help, '0.0.1'] do
191
182
  end
192
183
  end
193
184
 
194
- it "fails when asked for an action on a legacy command" do
185
+ it 'fails when asked for an action on a legacy command' do
195
186
  expect { subject.help(appname, :whatever) }.
196
- to raise_error ArgumentError, /Legacy subcommands don't take actions/
187
+ to raise_error(ArgumentError, /The legacy subcommand '#{appname}' does not support supplying an action/)
197
188
  end
198
189
 
199
- it "raises an ArgumentError if a legacy application raises a StandardError" do
200
- Puppet::Application[appname].class.any_instance.stubs(:help).raises(StandardError, "whoops")
190
+ context 'rendering has an error' do
191
+ it 'raises an ArgumentError if a legacy application raises a StandardError' do
192
+ Puppet::Application[appname].class.any_instance.stubs(:help).raises(StandardError, 'whoops')
201
193
 
202
- expect {
203
- subject.help(appname)
204
- }.to raise_error ArgumentError, /Detail: "whoops"/
205
- end
194
+ expect {
195
+ subject.help(appname)
196
+ }.to raise_error(ArgumentError, /Detail: "whoops"/)
197
+ end
206
198
 
207
- it "raises an ArgumentError if a legacy application raises a LoadError" do
208
- Puppet::Application[appname].class.any_instance.stubs(:help).raises(LoadError, "cannot load such file -- yard")
199
+ it 'raises an ArgumentError if a legacy application raises a LoadError' do
200
+ Puppet::Application[appname].class.any_instance.stubs(:help).raises(LoadError, 'cannot load such file -- yard')
209
201
 
210
- expect {
211
- subject.help(appname)
212
- }.to raise_error ArgumentError, /Detail: "cannot load such file -- yard"/
202
+ expect {
203
+ subject.help(appname)
204
+ }.to raise_error(ArgumentError, /Detail: "cannot load such file -- yard"/)
205
+ end
213
206
  end
214
207
  end
215
208
  end
@@ -0,0 +1,26 @@
1
+ #! /usr/bin/env ruby
2
+ require 'spec_helper'
3
+ require 'puppet/face'
4
+
5
+ describe Puppet::Face[:man, '0.0.1'] do
6
+ it 'should be deprecated' do
7
+ expect(subject.deprecated?).to be_truthy
8
+ end
9
+
10
+ it 'has a man action' do
11
+ expect(subject).to be_action(:man)
12
+ end
13
+
14
+ it 'has a default action of man' do
15
+ expect(subject.get_action('man')).to be_default
16
+ end
17
+
18
+ it 'accepts a call with no arguments' do
19
+ expect { subject.man() }.to have_printed(/USAGE: puppet man <action>/)
20
+ end
21
+
22
+ it 'raises an ArgumentError when given to many arguments' do
23
+ subject.stubs(:print_man_help)
24
+ expect { subject.man(:man, 'cert', 'extra') }.to raise_error(ArgumentError)
25
+ end
26
+ end
@@ -83,7 +83,6 @@ describe "puppet module list" do
83
83
  it "prefers a given modulepath over the modulepath from the given environment" do
84
84
  foomod = PuppetSpec::Modules.create('foo', @modpath1)
85
85
  barmod = PuppetSpec::Modules.create('bar', @modpath2)
86
- env = Puppet::Node::Environment.create(:myenv, ['/tmp/notused'])
87
86
 
88
87
  modules = Puppet::Face[:module, :current].list(:environment => 'myenv', :modulepath => "#{@modpath1}#{File::PATH_SEPARATOR}#{@modpath2}")[:modules_by_path]
89
88
 
@@ -145,6 +145,84 @@ describe Puppet::Face[:parser, :current] do
145
145
  parser.dump(manifest)
146
146
  }.to_not raise_error
147
147
  end
148
+
149
+ context "using 'pn' format" do
150
+ it "prints the AST of the given expression in PN format" do
151
+ expect(parser.dump({ :format => 'pn', :e => 'if $x { "hi ${x[2]}" }' })).to eq(
152
+ '(if {:test (var "x") :then [(concat "hi " (str (access (var "x") 2)))]})')
153
+ end
154
+
155
+ it "pretty prints the AST of the given expression in PN format when --pretty is given" do
156
+ expect(parser.dump({ :pretty => true, :format => 'pn', :e => 'if $x { "hi ${x[2]}" }' })).to eq(<<-RESULT.unindent[0..-2])
157
+ (if
158
+ {
159
+ :test (var
160
+ "x")
161
+ :then [
162
+ (concat
163
+ "hi "
164
+ (str
165
+ (access
166
+ (var
167
+ "x")
168
+ 2)))]})
169
+ RESULT
170
+ end
171
+ end
172
+
173
+ context "using 'json' format" do
174
+ it "prints the AST of the given expression in JSON based on the PN format" do
175
+ expect(parser.dump({ :format => 'json', :e => 'if $x { "hi ${x[2]}" }' })).to eq(
176
+ '{"^":["if",{"#":["test",{"^":["var","x"]},"then",[{"^":["concat","hi ",{"^":["str",{"^":["access",{"^":["var","x"]},2]}]}]}]]}]}')
177
+ end
178
+
179
+ it "pretty prints the AST of the given expression in JSON based on the PN format when --pretty is given" do
180
+ expect(parser.dump({ :pretty => true, :format => 'json', :e => 'if $x { "hi ${x[2]}" }' })).to eq(<<-RESULT.unindent[0..-2])
181
+ {
182
+ "^": [
183
+ "if",
184
+ {
185
+ "#": [
186
+ "test",
187
+ {
188
+ "^": [
189
+ "var",
190
+ "x"
191
+ ]
192
+ },
193
+ "then",
194
+ [
195
+ {
196
+ "^": [
197
+ "concat",
198
+ "hi ",
199
+ {
200
+ "^": [
201
+ "str",
202
+ {
203
+ "^": [
204
+ "access",
205
+ {
206
+ "^": [
207
+ "var",
208
+ "x"
209
+ ]
210
+ },
211
+ 2
212
+ ]
213
+ }
214
+ ]
215
+ }
216
+ ]
217
+ }
218
+ ]
219
+ ]
220
+ }
221
+ ]
222
+ }
223
+ RESULT
224
+ end
225
+ end
148
226
  end
149
227
 
150
228
  def from_an_interactive_terminal