puppet 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. checksums.yaml +7 -0
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +6 -6
  4. data/LICENSE +1 -1
  5. data/README.md +8 -9
  6. data/conf/auth.conf +2 -2
  7. data/ext/README.environment +1 -1
  8. data/ext/build_defaults.yaml +1 -1
  9. data/ext/debian/README.source +1 -1
  10. data/ext/debian/control +1 -1
  11. data/ext/debian/copyright +4 -4
  12. data/ext/debian/puppetmaster.README.debian +11 -9
  13. data/ext/emacs/puppet-mode.el +1 -1
  14. data/ext/envpuppet +2 -2
  15. data/ext/ips/puppetagent.xml +1 -1
  16. data/ext/ips/puppetmaster.xml +1 -1
  17. data/ext/project_data.yaml +8 -0
  18. data/ext/puppet-test +3 -3
  19. data/ext/rack/example-passenger-vhost.conf +1 -1
  20. data/ext/redhat/puppet.spec.erb +2 -2
  21. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  22. data/ext/solaris/pkginfo +1 -1
  23. data/ext/solaris/smf/puppet.xml +1 -1
  24. data/ext/suse/puppet.spec +2 -2
  25. data/ext/upload_facts.rb +1 -1
  26. data/ext/windows/puppet_interactive.bat +6 -0
  27. data/ext/windows/puppet_shell.bat +9 -0
  28. data/ext/windows/run_puppet_interactive.bat +9 -0
  29. data/ext/yaml_nodes.rb +1 -1
  30. data/install.rb +30 -20
  31. data/lib/hiera/scope.rb +1 -1
  32. data/lib/puppet/agent.rb +1 -1
  33. data/lib/puppet/application/agent.rb +4 -2
  34. data/lib/puppet/application/apply.rb +7 -4
  35. data/lib/puppet/application/cert.rb +1 -1
  36. data/lib/puppet/application/device.rb +1 -1
  37. data/lib/puppet/application/filebucket.rb +1 -1
  38. data/lib/puppet/application/inspect.rb +1 -1
  39. data/lib/puppet/application/lookup.rb +45 -47
  40. data/lib/puppet/application/master.rb +2 -2
  41. data/lib/puppet/application/resource.rb +1 -1
  42. data/lib/puppet/configurer.rb +100 -22
  43. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  44. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  45. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  46. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  47. data/lib/puppet/data_providers/lookup_adapter.rb +73 -26
  48. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  49. data/lib/puppet/defaults.rb +69 -22
  50. data/lib/puppet/environments.rb +3 -1
  51. data/lib/puppet/face/config.rb +1 -1
  52. data/lib/puppet/face/epp.rb +1 -1
  53. data/lib/puppet/face/help/man.erb +1 -1
  54. data/lib/puppet/face/module/install.rb +6 -6
  55. data/lib/puppet/face/parser.rb +12 -9
  56. data/lib/puppet/face/status.rb +2 -1
  57. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  58. data/lib/puppet/feature/telnet.rb +9 -0
  59. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  60. data/lib/puppet/file_serving/metadata.rb +18 -2
  61. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  62. data/lib/puppet/file_system/file_impl.rb +2 -2
  63. data/lib/puppet/file_system/memory_impl.rb +1 -1
  64. data/lib/puppet/file_system/uniquefile.rb +1 -1
  65. data/lib/puppet/file_system.rb +2 -2
  66. data/lib/puppet/forge/repository.rb +1 -31
  67. data/lib/puppet/forge.rb +1 -1
  68. data/lib/puppet/functions/assert_type.rb +9 -9
  69. data/lib/puppet/functions/each.rb +5 -13
  70. data/lib/puppet/functions/filter.rb +5 -14
  71. data/lib/puppet/functions/lookup.rb +126 -150
  72. data/lib/puppet/functions/map.rb +6 -14
  73. data/lib/puppet/functions/match.rb +1 -0
  74. data/lib/puppet/functions/reduce.rb +5 -13
  75. data/lib/puppet/functions/reverse_each.rb +82 -0
  76. data/lib/puppet/functions/scanf.rb +15 -18
  77. data/lib/puppet/functions/slice.rb +22 -36
  78. data/lib/puppet/functions/split.rb +2 -2
  79. data/lib/puppet/functions/step.rb +88 -0
  80. data/lib/puppet/functions/type.rb +70 -0
  81. data/lib/puppet/functions.rb +45 -6
  82. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  83. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  84. data/lib/puppet/indirector/facts/facter.rb +2 -13
  85. data/lib/puppet/indirector/file_content/http.rb +15 -0
  86. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  87. data/lib/puppet/indirector/generic_http.rb +16 -0
  88. data/lib/puppet/indirector/hiera.rb +3 -1
  89. data/lib/puppet/indirector/indirection.rb +6 -2
  90. data/lib/puppet/indirector/json.rb +2 -2
  91. data/lib/puppet/indirector/node/exec.rb +1 -1
  92. data/lib/puppet/indirector/node/ldap.rb +1 -1
  93. data/lib/puppet/indirector/rest.rb +2 -1
  94. data/lib/puppet/info_service/class_information_service.rb +13 -12
  95. data/lib/puppet/loaders.rb +1 -0
  96. data/lib/puppet/module.rb +6 -2
  97. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  98. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  99. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  100. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  101. data/lib/puppet/network/http/pool.rb +9 -0
  102. data/lib/puppet/node/environment.rb +11 -2
  103. data/lib/puppet/node.rb +11 -2
  104. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  105. data/lib/puppet/parser/compiler.rb +4 -11
  106. data/lib/puppet/parser/environment_compiler.rb +0 -1
  107. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  108. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  109. data/lib/puppet/parser/functions/lookup.rb +128 -149
  110. data/lib/puppet/parser/functions/map.rb +1 -1
  111. data/lib/puppet/parser/functions/match.rb +1 -0
  112. data/lib/puppet/parser/functions/scanf.rb +15 -26
  113. data/lib/puppet/parser/functions/slice.rb +17 -24
  114. data/lib/puppet/parser/functions/split.rb +1 -1
  115. data/lib/puppet/parser/functions.rb +28 -16
  116. data/lib/puppet/parser/resource.rb +19 -17
  117. data/lib/puppet/parser/scope.rb +176 -5
  118. data/lib/puppet/plugins/data_providers/data_provider.rb +56 -14
  119. data/lib/puppet/pops/adaptable.rb +4 -1
  120. data/lib/puppet/pops/adapters.rb +80 -12
  121. data/lib/puppet/pops/binder/binder.rb +21 -17
  122. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  123. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  124. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  125. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  126. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  127. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  128. data/lib/puppet/pops/binder/injector.rb +53 -48
  129. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  130. data/lib/puppet/pops/binder/producers.rb +67 -62
  131. data/lib/puppet/pops/evaluator/access_operator.rb +98 -96
  132. data/lib/puppet/pops/evaluator/closure.rb +122 -106
  133. data/lib/puppet/pops/evaluator/collector_transformer.rb +34 -14
  134. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  135. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  136. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  137. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  138. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  139. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  140. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  141. data/lib/puppet/pops/evaluator/runtime3_support.rb +47 -42
  142. data/lib/puppet/pops/functions/function.rb +6 -2
  143. data/lib/puppet/pops/issue_reporter.rb +6 -4
  144. data/lib/puppet/pops/issues.rb +50 -11
  145. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  146. data/lib/puppet/pops/loader/loader.rb +1 -1
  147. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  148. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  149. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +18 -13
  150. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  151. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  152. data/lib/puppet/pops/loaders.rb +51 -9
  153. data/lib/puppet/pops/lookup/explainer.rb +73 -3
  154. data/lib/puppet/pops/lookup/invocation.rb +21 -19
  155. data/lib/puppet/pops/lookup.rb +17 -12
  156. data/lib/puppet/pops/merge_strategy.rb +16 -19
  157. data/lib/puppet/pops/model/factory.rb +179 -157
  158. data/lib/puppet/pops/model/model.rb +17 -8
  159. data/lib/puppet/pops/model/model_label_provider.rb +14 -7
  160. data/lib/puppet/pops/model/model_meta.rb +17 -0
  161. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  162. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  163. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  164. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  165. data/lib/puppet/pops/parser/evaluating_parser.rb +17 -13
  166. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  167. data/lib/puppet/pops/parser/lexer2.rb +428 -403
  168. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  169. data/lib/puppet/pops/parser/locator.rb +21 -0
  170. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  171. data/lib/puppet/pops/parser/slurp_support.rb +16 -8
  172. data/lib/puppet/pops/types/class_loader.rb +23 -19
  173. data/lib/puppet/pops/types/enumeration.rb +9 -26
  174. data/lib/puppet/pops/types/iterable.rb +308 -0
  175. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  176. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  177. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  178. data/lib/puppet/pops/types/type_calculator.rb +140 -387
  179. data/lib/puppet/pops/types/type_factory.rb +91 -57
  180. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  181. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  182. data/lib/puppet/pops/types/type_parser.rb +159 -112
  183. data/lib/puppet/pops/types/types.rb +2057 -1253
  184. data/lib/puppet/pops/utils.rb +11 -10
  185. data/lib/puppet/pops/validation/checker4_0.rb +115 -63
  186. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  187. data/lib/puppet/pops/validation.rb +11 -9
  188. data/lib/puppet/pops.rb +0 -8
  189. data/lib/puppet/provider/aixobject.rb +1 -1
  190. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  191. data/lib/puppet/provider/cron/crontab.rb +1 -1
  192. data/lib/puppet/provider/exec/windows.rb +1 -1
  193. data/lib/puppet/provider/group/windows_adsi.rb +2 -2
  194. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  195. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  196. data/lib/puppet/provider/package/appdmg.rb +3 -2
  197. data/lib/puppet/provider/package/dnf.rb +1 -1
  198. data/lib/puppet/provider/package/pip.rb +16 -9
  199. data/lib/puppet/provider/package/pip3.rb +1 -1
  200. data/lib/puppet/provider/package/pkg.rb +1 -1
  201. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  202. data/lib/puppet/provider/package/pkgng.rb +13 -4
  203. data/lib/puppet/provider/package/rpm.rb +0 -1
  204. data/lib/puppet/provider/package/windows.rb +1 -1
  205. data/lib/puppet/provider/package/yum.rb +2 -2
  206. data/lib/puppet/provider/package/zypper.rb +19 -0
  207. data/lib/puppet/provider/service/debian.rb +7 -20
  208. data/lib/puppet/provider/service/init.rb +7 -0
  209. data/lib/puppet/provider/service/launchd.rb +6 -12
  210. data/lib/puppet/provider/service/systemd.rb +9 -2
  211. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  212. data/lib/puppet/provider/user/aix.rb +1 -1
  213. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  214. data/lib/puppet/provider/user/windows_adsi.rb +2 -2
  215. data/lib/puppet/provider/yumrepo/inifile.rb +6 -3
  216. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  217. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  218. data/lib/puppet/reference/configuration.rb +1 -1
  219. data/lib/puppet/reference/providers.rb +1 -1
  220. data/lib/puppet/resource/capability_finder.rb +20 -13
  221. data/lib/puppet/resource/catalog.rb +60 -3
  222. data/lib/puppet/resource/status.rb +11 -2
  223. data/lib/puppet/resource/type.rb +33 -42
  224. data/lib/puppet/resource.rb +15 -12
  225. data/lib/puppet/settings/config_file.rb +1 -1
  226. data/lib/puppet/settings/environment_conf.rb +13 -5
  227. data/lib/puppet/settings.rb +1 -1
  228. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  229. data/lib/puppet/ssl/certificate_request.rb +4 -4
  230. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  231. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  232. data/lib/puppet/test/test_helper.rb +16 -4
  233. data/lib/puppet/transaction/additional_resource_generator.rb +23 -5
  234. data/lib/puppet/transaction/report.rb +31 -1
  235. data/lib/puppet/transaction/resource_harness.rb +0 -25
  236. data/lib/puppet/transaction.rb +15 -2
  237. data/lib/puppet/type/augeas.rb +1 -1
  238. data/lib/puppet/type/cron.rb +12 -12
  239. data/lib/puppet/type/file/checksum_value.rb +53 -0
  240. data/lib/puppet/type/file/content.rb +26 -111
  241. data/lib/puppet/type/file/data_sync.rb +84 -0
  242. data/lib/puppet/type/file/ensure.rb +17 -14
  243. data/lib/puppet/type/file/selcontext.rb +1 -1
  244. data/lib/puppet/type/file/source.rb +103 -18
  245. data/lib/puppet/type/file.rb +91 -39
  246. data/lib/puppet/type/filebucket.rb +1 -1
  247. data/lib/puppet/type/group.rb +6 -2
  248. data/lib/puppet/type/interface.rb +8 -3
  249. data/lib/puppet/type/macauthorization.rb +1 -1
  250. data/lib/puppet/type/package.rb +6 -0
  251. data/lib/puppet/type/schedule.rb +1 -1
  252. data/lib/puppet/type/stage.rb +1 -1
  253. data/lib/puppet/type/user.rb +19 -17
  254. data/lib/puppet/type/yumrepo.rb +20 -0
  255. data/lib/puppet/type.rb +11 -11
  256. data/lib/puppet/util/autoload.rb +16 -11
  257. data/lib/puppet/util/checksums.rb +74 -31
  258. data/lib/puppet/util/execution.rb +1 -1
  259. data/lib/puppet/util/http_proxy.rb +72 -0
  260. data/lib/puppet/util/log.rb +2 -0
  261. data/lib/puppet/util/logging.rb +43 -1
  262. data/lib/puppet/util/monkey_patches.rb +2 -2
  263. data/lib/puppet/util/multi_match.rb +51 -0
  264. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  265. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  266. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  267. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  268. data/lib/puppet/util/plist.rb +130 -0
  269. data/lib/puppet/util/resource_template.rb +1 -1
  270. data/lib/puppet/util/run_mode.rb +2 -2
  271. data/lib/puppet/util/skip_tags.rb +9 -0
  272. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  273. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  274. data/lib/puppet/util/windows/adsi.rb +65 -28
  275. data/lib/puppet/util/windows/api_types.rb +24 -18
  276. data/lib/puppet/util/windows/com.rb +3 -3
  277. data/lib/puppet/util/windows/error.rb +1 -1
  278. data/lib/puppet/util/windows/file.rb +8 -8
  279. data/lib/puppet/util/windows/principal.rb +190 -0
  280. data/lib/puppet/util/windows/process.rb +78 -11
  281. data/lib/puppet/util/windows/registry.rb +22 -16
  282. data/lib/puppet/util/windows/root_certs.rb +5 -5
  283. data/lib/puppet/util/windows/security.rb +33 -35
  284. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  285. data/lib/puppet/util/windows/sid.rb +84 -15
  286. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  287. data/lib/puppet/util/windows/user.rb +10 -10
  288. data/lib/puppet/util/windows.rb +4 -0
  289. data/lib/puppet/util.rb +109 -22
  290. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  291. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  292. data/lib/puppet/vendor/pathspec/README.md +1 -1
  293. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  294. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  295. data/lib/puppet/version.rb +1 -1
  296. data/lib/puppet.rb +17 -0
  297. data/lib/semver.rb +17 -1
  298. data/man/man5/puppet.conf.5 +12 -12
  299. data/man/man8/extlookup2hiera.8 +1 -1
  300. data/man/man8/puppet-agent.8 +2 -2
  301. data/man/man8/puppet-apply.8 +2 -2
  302. data/man/man8/puppet-ca.8 +2 -2
  303. data/man/man8/puppet-catalog.8 +2 -2
  304. data/man/man8/puppet-cert.8 +2 -2
  305. data/man/man8/puppet-certificate.8 +2 -2
  306. data/man/man8/puppet-certificate_request.8 +2 -2
  307. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  308. data/man/man8/puppet-config.8 +3 -3
  309. data/man/man8/puppet-describe.8 +1 -1
  310. data/man/man8/puppet-device.8 +1 -1
  311. data/man/man8/puppet-doc.8 +1 -1
  312. data/man/man8/puppet-epp.8 +2 -2
  313. data/man/man8/puppet-facts.8 +2 -2
  314. data/man/man8/puppet-file.8 +2 -2
  315. data/man/man8/puppet-filebucket.8 +2 -2
  316. data/man/man8/puppet-help.8 +2 -2
  317. data/man/man8/puppet-inspect.8 +2 -2
  318. data/man/man8/puppet-key.8 +2 -2
  319. data/man/man8/puppet-man.8 +2 -2
  320. data/man/man8/puppet-master.8 +2 -2
  321. data/man/man8/puppet-module.8 +9 -9
  322. data/man/man8/puppet-node.8 +2 -2
  323. data/man/man8/puppet-parser.8 +2 -2
  324. data/man/man8/puppet-plugin.8 +2 -2
  325. data/man/man8/puppet-report.8 +2 -2
  326. data/man/man8/puppet-resource.8 +2 -2
  327. data/man/man8/puppet-resource_type.8 +2 -2
  328. data/man/man8/puppet-status.8 +3 -3
  329. data/man/man8/puppet.8 +1 -1
  330. data/spec/fixtures/module.tar.gz +0 -0
  331. data/spec/fixtures/unit/application/environments/production/data/common.yaml +4 -0
  332. data/spec/fixtures/unit/application/environments/production/manifests/site.pp +1 -0
  333. data/spec/fixtures/unit/application/environments/puppet_func_provider/environment.conf +1 -0
  334. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/data.pp +10 -0
  335. data/spec/fixtures/unit/application/environments/puppet_func_provider/manifests/site.pp +1 -0
  336. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/common.yaml +4 -0
  337. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/data/specific.yaml +4 -0
  338. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/hiera.yaml +7 -0
  339. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/common.yaml +4 -0
  340. data/spec/fixtures/unit/data_providers/environments/hiera_modules/data/specific.yaml +4 -0
  341. data/spec/fixtures/unit/data_providers/environments/hiera_modules/environment.conf +2 -0
  342. data/spec/fixtures/unit/data_providers/environments/hiera_modules/hiera.yaml +7 -0
  343. data/spec/fixtures/unit/data_providers/environments/hiera_modules/manifests/site.pp +1 -0
  344. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/data/common.yaml +6 -0
  345. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/hiera.yaml +5 -0
  346. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/manifests/init.pp +2 -0
  347. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/one/metadata.json +9 -0
  348. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +4 -0
  349. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/hiera.yaml +5 -0
  350. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/manifests/init.pp +3 -0
  351. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/metadata.json +9 -0
  352. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  353. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  354. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  355. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  356. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  357. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  358. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  359. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  360. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  361. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  362. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  363. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  364. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/functions/usee_puppet.pp +3 -0
  365. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/lib/puppet/functions/usee/usee_ruby.rb +6 -0
  366. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +8 -0
  367. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  368. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee2/lib/puppet/functions/usee2/callee.rb +5 -0
  369. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet.pp +5 -0
  370. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_puppet_init.pp +5 -0
  371. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/functions/puppet_calling_ruby.pp +5 -0
  372. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/caller2.rb +5 -0
  373. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet.rb +5 -0
  374. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_puppet_init.rb +5 -0
  375. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/lib/puppet/functions/user/ruby_calling_ruby.rb +5 -0
  376. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/manifests/init.pp +81 -0
  377. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/metadata.json +2 -1
  378. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  379. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  380. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  381. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  382. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
  383. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
  384. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  385. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
  386. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  387. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
  388. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
  389. data/spec/integration/defaults_spec.rb +14 -2
  390. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  391. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  392. data/spec/integration/node/environment_spec.rb +13 -0
  393. data/spec/integration/parser/collection_spec.rb +8 -0
  394. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  395. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  396. data/spec/integration/parser/undef_param_spec.rb +8 -0
  397. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  398. data/spec/integration/test/test_helper_spec.rb +28 -0
  399. data/spec/integration/transaction/report_spec.rb +16 -0
  400. data/spec/integration/transaction_spec.rb +11 -0
  401. data/spec/integration/type/file_spec.rb +194 -4
  402. data/spec/integration/type/package_spec.rb +5 -1
  403. data/spec/integration/type/tidy_spec.rb +21 -9
  404. data/spec/integration/util/execution_spec.rb +22 -0
  405. data/spec/integration/util/windows/principal_spec.rb +201 -0
  406. data/spec/integration/util/windows/process_spec.rb +31 -0
  407. data/spec/{unit → integration}/util/windows/registry_spec.rb +91 -1
  408. data/spec/integration/util/windows/security_spec.rb +8 -8
  409. data/spec/integration/util/windows/user_spec.rb +1 -1
  410. data/spec/integration/util_spec.rb +49 -27
  411. data/spec/lib/puppet_spec/compiler.rb +17 -0
  412. data/spec/lib/puppet_spec/files.rb +2 -2
  413. data/spec/lib/puppet_spec/pops.rb +13 -0
  414. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  415. data/spec/shared_contexts/types_setup.rb +96 -0
  416. data/spec/unit/agent_spec.rb +1 -0
  417. data/spec/unit/application/agent_spec.rb +10 -0
  418. data/spec/unit/application/apply_spec.rb +9 -0
  419. data/spec/unit/application/lookup_spec.rb +138 -28
  420. data/spec/unit/configurer/downloader_spec.rb +5 -5
  421. data/spec/unit/configurer_spec.rb +271 -39
  422. data/spec/unit/data_providers/hiera_data_provider_spec.rb +182 -5
  423. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  424. data/spec/unit/defaults_spec.rb +15 -0
  425. data/spec/unit/environments_spec.rb +24 -4
  426. data/spec/unit/face/epp_face_spec.rb +2 -2
  427. data/spec/unit/face/parser_spec.rb +43 -2
  428. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  429. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  430. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  431. data/spec/unit/file_system_spec.rb +26 -0
  432. data/spec/unit/functions/assert_type_spec.rb +36 -2
  433. data/spec/unit/functions/defined_spec.rb +2 -2
  434. data/spec/unit/functions/epp_spec.rb +17 -9
  435. data/spec/unit/functions/inline_epp_spec.rb +4 -4
  436. data/spec/unit/functions/lookup_spec.rb +88 -16
  437. data/spec/unit/functions/regsubst_spec.rb +1 -1
  438. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  439. data/spec/unit/functions/step_spec.rb +113 -0
  440. data/spec/unit/functions/type_spec.rb +35 -0
  441. data/spec/unit/functions4_spec.rb +62 -6
  442. data/spec/unit/hiera/scope_spec.rb +5 -2
  443. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  444. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  445. data/spec/unit/indirector/indirection_spec.rb +1 -1
  446. data/spec/unit/indirector/json_spec.rb +1 -1
  447. data/spec/unit/info_service_spec.rb +94 -32
  448. data/spec/unit/module_spec.rb +14 -0
  449. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  450. data/spec/unit/network/authstore_spec.rb +1 -1
  451. data/spec/unit/network/http/connection_spec.rb +1 -0
  452. data/spec/unit/network/http/pool_spec.rb +30 -0
  453. data/spec/unit/node_spec.rb +8 -0
  454. data/spec/unit/parser/compiler_spec.rb +16 -18
  455. data/spec/unit/parser/scope_spec.rb +28 -11
  456. data/spec/unit/pops/evaluator/access_ops_spec.rb +7 -7
  457. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  458. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +8 -2
  459. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  460. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  461. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  462. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  463. data/spec/unit/pops/loaders/loaders_spec.rb +127 -2
  464. data/spec/unit/pops/parser/lexer2_spec.rb +118 -3
  465. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  466. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  467. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  468. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  469. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  470. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  471. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  472. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  473. data/spec/unit/pops/types/type_calculator_spec.rb +275 -390
  474. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  475. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  476. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  477. data/spec/unit/pops/types/types_spec.rb +241 -0
  478. data/spec/unit/pops/validator/validator_spec.rb +159 -15
  479. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  480. data/spec/unit/provider/group/windows_adsi_spec.rb +8 -8
  481. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  482. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  483. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  484. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  485. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  486. data/spec/unit/provider/package/pip_spec.rb +88 -47
  487. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  488. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  489. data/spec/unit/provider/package/rpm_spec.rb +2 -25
  490. data/spec/unit/provider/package/yum_spec.rb +12 -1
  491. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  492. data/spec/unit/provider/service/debian_spec.rb +6 -24
  493. data/spec/unit/provider/service/init_spec.rb +11 -1
  494. data/spec/unit/provider/service/launchd_spec.rb +18 -25
  495. data/spec/unit/provider/service/systemd_spec.rb +25 -12
  496. data/spec/unit/provider/service/upstart_spec.rb +57 -0
  497. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  498. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  499. data/spec/unit/provider/user/windows_adsi_spec.rb +5 -5
  500. data/spec/unit/provider/yumrepo/inifile_spec.rb +16 -0
  501. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  502. data/spec/unit/resource/catalog_spec.rb +33 -1
  503. data/spec/unit/resource/type_spec.rb +149 -7
  504. data/spec/unit/resource_spec.rb +99 -50
  505. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  506. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  507. data/spec/unit/transaction/report_spec.rb +27 -0
  508. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  509. data/spec/unit/transaction_spec.rb +5 -0
  510. data/spec/unit/type/file/checksum_spec.rb +6 -0
  511. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  512. data/spec/unit/type/file/content_spec.rb +12 -193
  513. data/spec/unit/type/file/source_spec.rb +211 -119
  514. data/spec/unit/type/file_spec.rb +133 -34
  515. data/spec/unit/type/interface_spec.rb +32 -0
  516. data/spec/unit/type/macauthorization_spec.rb +4 -1
  517. data/spec/unit/type/yumrepo_spec.rb +2 -2
  518. data/spec/unit/util/filetype_spec.rb +1 -1
  519. data/spec/unit/util/http_proxy_spec.rb +2 -2
  520. data/spec/unit/util/log/destinations_spec.rb +0 -2
  521. data/spec/unit/util/logging_spec.rb +69 -0
  522. data/spec/unit/util/multi_match_spec.rb +39 -0
  523. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  524. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  525. data/spec/unit/util/plist_spec.rb +110 -0
  526. data/spec/unit/util/resource_template_spec.rb +2 -2
  527. data/spec/unit/util/run_mode_spec.rb +27 -3
  528. data/spec/unit/util/windows/adsi_spec.rb +46 -38
  529. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  530. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  531. data/spec/unit/util/windows/sid_spec.rb +48 -11
  532. data/spec/unit/util_spec.rb +123 -13
  533. data/tasks/cfpropertylist.rake +15 -0
  534. metadata +3342 -3195
  535. data/lib/puppet/vendor/load_plist.rb +0 -1
  536. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  537. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  538. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  539. data/lib/puppet/vendor/plist/README +0 -36
  540. data/lib/puppet/vendor/plist/Rakefile +0 -144
  541. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  542. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  543. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  544. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  545. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  546. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  547. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  548. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  549. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  550. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  551. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  552. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  553. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  554. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  555. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  556. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  557. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  558. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
  559. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{usee → modules/usee}/lib/puppet/functions/usee/callee.rb +0 -0
  560. /data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/{user → modules/user}/lib/puppet/functions/user/caller.rb +0 -0
@@ -598,6 +598,11 @@ describe 'Puppet::Pops::Evaluator::EvaluatorImpl' do
598
598
  expect(result).to include(['b', 20])
599
599
  end
600
600
 
601
+ it "should create an array from an Iterator" do
602
+ expect(parser.evaluate_string(scope, '[1,2,3].reverse_each', __FILE__).is_a?(Array)).to be(false)
603
+ result = parser.evaluate_string(scope, '*[1,2,3].reverse_each', __FILE__)
604
+ expect(result).to eql([3,2,1])
605
+ end
601
606
  end
602
607
 
603
608
  context "When evaluator performs [] operations" do
@@ -861,7 +866,8 @@ describe 'Puppet::Pops::Evaluator::EvaluatorImpl' do
861
866
  # NOTE: these meta-esque parameters are not recognized as such
862
867
  "notify { id: message=>explicit} Notify[id][title]" => /does not have a parameter called 'title'/,
863
868
  "notify { id: message=>explicit} Notify[id]['type']" => /does not have a parameter called 'type'/,
864
- "notify { id: message=>explicit } Notify[id]{message=>override}" => /'message' is already set on Notify\[id\]/
869
+ "notify { id: message=>explicit } Notify[id]{message=>override}" => /'message' is already set on Notify\[id\]/,
870
+ "notify { id: message => 'once', message => 'twice' }" => /'message' has already been set/
865
871
  }.each do |source, result|
866
872
  it "should parse '#{source}' and raise error matching #{result}" do
867
873
  expect { parser.evaluate_string(scope, source, __FILE__)}.to raise_error(result)
@@ -960,7 +966,7 @@ describe 'Puppet::Pops::Evaluator::EvaluatorImpl' do
960
966
  end
961
967
 
962
968
  it "provides location information on error in unparenthesized call logic" do
963
- expect{parser.evaluate_string(scope, "include non_existing_class", __FILE__)}.to raise_error(Puppet::ParseError, /line 1\:1/)
969
+ expect{parser.evaluate_string(scope, "include non_existing_class", __FILE__)}.to raise_error(Puppet::ParseError, /:1:1/)
964
970
  end
965
971
 
966
972
  it 'defaults can be given in a lambda and used only when arg is missing' do
@@ -55,10 +55,10 @@ module EvaluatorRspecHelper
55
55
  result = evaluator.evaluate(in_top_scope.current, top_scope)
56
56
  if in_local_scope
57
57
  # This is really bad in 3.x scope
58
- elevel = top_scope.ephemeral_level
59
- top_scope.new_ephemeral(true)
60
- result = evaluator.evaluate(in_local_scope.current, top_scope)
61
- top_scope.unset_ephemeral_var(elevel)
58
+ top_scope.with_guarded_scope do
59
+ top_scope.new_ephemeral(true)
60
+ result = evaluator.evaluate(in_local_scope.current, top_scope)
61
+ end
62
62
  end
63
63
  if in_top_scope_again
64
64
  result = evaluator.evaluate(in_top_scope_again.current, top_scope)
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ require 'puppet/pops'
4
+ require 'puppet/pops/evaluator/json_strict_literal_evaluator'
5
+
6
+ describe "Puppet::Pops::Evaluator::JsonStrictLiteralEvaluator" do
7
+ let(:parser) { Puppet::Pops::Parser::EvaluatingParser.new }
8
+ let(:leval) { Puppet::Pops::Evaluator::JsonStrictLiteralEvaluator.new }
9
+
10
+ { "1" => 1,
11
+ "3.14" => 3.14,
12
+ "true" => true,
13
+ "false" => false,
14
+ "'1'" => '1',
15
+ "'a'" => 'a',
16
+ '"a"' => 'a',
17
+ 'a' => 'a',
18
+ 'a::b' => 'a::b',
19
+ 'undef' => nil,
20
+
21
+ # collections
22
+ '[1,2,3]' => [1,2,3],
23
+ '{a=>1,b=>2}' => {'a' => 1, 'b' => 2},
24
+ '[undef]' => [nil],
25
+ '{a=>undef}' => { 'a' => nil }
26
+
27
+ }.each do |source, result|
28
+ it "evaluates '#{source}' to #{result}" do
29
+ expect(leval.literal(parser.parse_string(source))).to eq(result)
30
+ end
31
+ end
32
+
33
+ [ '1+1',
34
+ 'File',
35
+ '[1,2, 1+2]',
36
+ '{a=>1+1}',
37
+ 'Integer[1]',
38
+ '"x$y"',
39
+ '"x${y}z"'
40
+ ].each do |source|
41
+ it "throws :not_literal for non literal expression '#{source}'" do
42
+ expect{leval.literal(parser.parse_string('1+1'))}.to throw_symbol(:not_literal)
43
+ end
44
+ end
45
+
46
+ [ 'default',
47
+ '/.*/',
48
+ '{1=>100}',
49
+ '{undef => 10}',
50
+ '{default => 10}',
51
+ '{/.*/ => 10}',
52
+ '{"ok" => {1 => 100}}',
53
+ '[default]',
54
+ '[[default]]',
55
+ '[/.*/]',
56
+ '[[/.*/]]',
57
+ '[{1 => 100}]',
58
+ ].each do |source|
59
+ it "throws :not_literal for values not representable as pure JSON '#{source}'" do
60
+ expect{leval.literal(parser.parse_string('1+1'))}.to throw_symbol(:not_literal)
61
+ end
62
+ end
63
+ end
@@ -16,4 +16,10 @@ describe 'when converting to 3.x' do
16
16
  converted = Puppet::Pops::Evaluator::Runtime3Converter.instance.catalog_type_to_split_type_title(t)
17
17
  expect(converted).to eql(['class', 'kermit'])
18
18
  end
19
+
20
+ it "errors on attempts to convert an 'Iterator'" do
21
+ expect {
22
+ Puppet::Pops::Evaluator::Runtime3Converter.convert(Puppet::Pops::Types::Iterable.on((1..3)), {}, nil)
23
+ }.to raise_error(Puppet::Error, /Use of an Iterator is not supported here/)
24
+ end
19
25
  end
@@ -53,6 +53,59 @@ describe 'dependency loader' do
53
53
  expect(function.class.name).to eq('testmodule::foo')
54
54
  expect(function.is_a?(Puppet::Functions::Function)).to eq(true)
55
55
  end
56
+
57
+ describe "when parsing files from disk" do
58
+
59
+ # First line of Rune version of Rune poem at http://www.columbia.edu/~fdc/utf8/
60
+ # characters chosen since they will not parse on Windows with codepage 437 or 1252
61
+ # Section 3.2.1.3 of Ruby spec guarantees that \u strings are encoded as UTF-8
62
+ let (:node) { Puppet::Node.new('node') }
63
+ let (:rune_utf8) { "\u16A0\u16C7\u16BB" } # ᚠᛇᚻ
64
+ let (:code_utf8) do <<-CODE
65
+ Puppet::Functions.create_function('testmodule::foo') {
66
+ def foo
67
+ return \"#{rune_utf8}\"
68
+ end
69
+ }
70
+ CODE
71
+ end
72
+
73
+ context 'when loading files from disk' do
74
+ it 'should always read files as UTF-8' do
75
+ if Puppet.features.microsoft_windows? && Encoding.default_external == Encoding::UTF_8
76
+ raise 'This test must be run in a codepage other than 65001 to validate behavior'
77
+ end
78
+
79
+ module_dir = dir_containing('testmodule', {
80
+ 'lib' => { 'puppet' => { 'functions' => { 'testmodule' => {
81
+ 'foo.rb' => code_utf8
82
+ }}}}})
83
+
84
+ loader = loader_for('testmodule', module_dir)
85
+
86
+ function = loader.load_typed(typed_name(:function, 'testmodule::foo')).value
87
+ expect(function.call({})).to eq(rune_utf8)
88
+ end
89
+
90
+ it 'currently ignores the UTF-8 BOM (Byte Order Mark) when loading module files' do
91
+ bom = "\uFEFF"
92
+
93
+ if Puppet.features.microsoft_windows? && Encoding.default_external == Encoding::UTF_8
94
+ raise 'This test must be run in a codepage other than 65001 to validate behavior'
95
+ end
96
+
97
+ module_dir = dir_containing('testmodule', {
98
+ 'lib' => { 'puppet' => { 'functions' => { 'testmodule' => {
99
+ 'foo.rb' => "#{bom}#{code_utf8}"
100
+ }}}}})
101
+
102
+ loader = loader_for('testmodule', module_dir)
103
+
104
+ function = loader.load_typed(typed_name(:function, 'testmodule::foo')).value
105
+ expect(function.call({})).to eq(rune_utf8)
106
+ end
107
+ end
108
+ end
56
109
  end
57
110
 
58
111
  def loader_for(name, dir)
@@ -1,5 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'puppet_spec/files'
3
+ require 'puppet_spec/compiler'
3
4
 
4
5
  require 'puppet/pops'
5
6
  require 'puppet/loaders'
@@ -25,12 +26,15 @@ end
25
26
 
26
27
  describe 'loaders' do
27
28
  include PuppetSpec::Files
29
+ include PuppetSpec::Compiler
28
30
 
29
31
  let(:module_without_metadata) { File.join(config_dir('wo_metadata_module'), 'modules') }
30
32
  let(:module_without_lib) { File.join(config_dir('module_no_lib'), 'modules') }
31
33
  let(:mix_4x_and_3x_functions) { config_dir('mix_4x_and_3x_functions') }
32
34
  let(:module_with_metadata) { File.join(config_dir('single_module'), 'modules') }
33
35
  let(:dependent_modules_with_metadata) { config_dir('dependent_modules_with_metadata') }
36
+ let(:user_metadata_path) { File.join(dependent_modules_with_metadata, 'modules/user/metadata.json') }
37
+
34
38
  let(:empty_test_env) { environment_for() }
35
39
 
36
40
  # Loaders caches the puppet_system_loader, must reset between tests
@@ -103,7 +107,9 @@ describe 'loaders' do
103
107
  end
104
108
 
105
109
  it 'loader allows loading a function more than once' do
106
- env = environment_for(dependent_modules_with_metadata)
110
+ File.stubs(:read).with(user_metadata_path).returns ''
111
+
112
+ env = environment_for(File.join(dependent_modules_with_metadata, 'modules'))
107
113
  loaders = Puppet::Pops::Loaders.new(env)
108
114
 
109
115
  moduleb_loader = loaders.private_loader_for_module('user')
@@ -116,13 +122,132 @@ describe 'loaders' do
116
122
  end
117
123
 
118
124
  context 'when loading from a module with metadata' do
125
+ let(:env) { environment_for(File.join(dependent_modules_with_metadata, 'modules')) }
126
+ let(:scope) { Puppet::Parser::Compiler.new(Puppet::Node.new("test", :environment => env)).newscope(nil) }
127
+
128
+ let(:environmentpath) { my_fixture_dir }
129
+ let(:node) { Puppet::Node.new('test', :facts => Puppet::Node::Facts.new('facts', {}), :environment => 'dependent_modules_with_metadata') }
130
+ let(:compiler) { Puppet::Parser::Compiler.new(node) }
131
+
132
+ let(:user_metadata) {
133
+ {
134
+ 'name' => 'test-user',
135
+ 'author' => 'test',
136
+ 'description' => '',
137
+ 'license' => '',
138
+ 'source' => '',
139
+ 'version' => '1.0.0',
140
+ 'dependencies' => []
141
+ }
142
+ }
143
+
144
+ def compile_and_get_notifications(code)
145
+ Puppet[:code] = code
146
+ catalog = block_given? ? compiler.compile { |catalog| yield(compiler.topscope); catalog } : compiler.compile
147
+ catalog.resources.map(&:ref).select { |r| r.start_with?('Notify[') }.map { |r| r[7..-2] }
148
+ end
149
+
150
+ around(:each) do |example|
151
+ # Initialize settings to get a full compile as close as possible to a real
152
+ # environment load
153
+ Puppet.settings.initialize_global_settings
154
+
155
+ # Initialize loaders based on the environmentpath. It does not work to
156
+ # just set the setting environmentpath for some reason - this achieves the same:
157
+ # - first a loader is created, loading directory environments from the fixture (there is
158
+ # one environment, 'sample', which will be loaded since the node references this
159
+ # environment by name).
160
+ # - secondly, the created env loader is set as 'environments' in the puppet context.
161
+ #
162
+ environments = Puppet::Environments::Directories.new(environmentpath, [])
163
+ Puppet.override(:environments => environments) do
164
+ example.run
165
+ end
166
+ end
167
+
119
168
  it 'all dependent modules are visible' do
120
- env = environment_for(dependent_modules_with_metadata)
169
+ File.stubs(:read).with(user_metadata_path).returns user_metadata.merge('dependencies' => [ { 'name' => 'test-usee'}, { 'name' => 'test-usee2'} ]).to_pson
121
170
  loaders = Puppet::Pops::Loaders.new(env)
122
171
 
123
172
  moduleb_loader = loaders.private_loader_for_module('user')
124
173
  function = moduleb_loader.load_typed(typed_name(:function, 'user::caller')).value
125
174
  expect(function.call({})).to eql("usee::callee() was told 'passed value' + I am user::caller()")
175
+
176
+ function = moduleb_loader.load_typed(typed_name(:function, 'user::caller2')).value
177
+ expect(function.call({})).to eql("usee2::callee() was told 'passed value' + I am user::caller2()")
178
+ end
179
+
180
+ [ 'outside a function', 'a puppet function declared under functions', 'a puppet function declared in init.pp', 'a ruby function'].each_with_index do |from, from_idx|
181
+ [ {:from => from, :called => 'a puppet function declared under functions', :expects => "I'm the function usee::usee_puppet()"},
182
+ {:from => from, :called => 'a puppet function declared in init.pp', :expects => "I'm the function usee::usee_puppet_init()"},
183
+ {:from => from, :called => 'a ruby function', :expects => "I'm the function usee::usee_ruby()"} ].each_with_index do |desc, called_idx|
184
+ case_number = from_idx * 3 + called_idx + 1
185
+ it "can call #{desc[:called]} from #{desc[:from]} when dependency is present in metadata.json" do
186
+ File.stubs(:read).with(user_metadata_path).returns user_metadata.merge('dependencies' => [ { 'name' => 'test-usee'} ]).to_pson
187
+ Puppet[:code] = "$case_number = #{case_number}\ninclude ::user"
188
+ catalog = compiler.compile
189
+ resource = catalog.resource('Notify', "case_#{case_number}")
190
+ expect(resource).not_to be_nil
191
+ expect(resource['message']).to eq(desc[:expects])
192
+ end
193
+
194
+ it "can call #{desc[:called]} from #{desc[:from]} when no metadata is present" do
195
+ Puppet::Module.any_instance.expects('has_metadata?').at_least_once.returns(false)
196
+ Puppet[:code] = "$case_number = #{case_number}\ninclude ::user"
197
+ catalog = compiler.compile
198
+ resource = catalog.resource('Notify', "case_#{case_number}")
199
+ expect(resource).not_to be_nil
200
+ expect(resource['message']).to eq(desc[:expects])
201
+ end
202
+
203
+ it 'can not call ruby function in a dependent module from outside a function if dependency is missing in existing metadata.json' do
204
+ File.stubs(:read).with(user_metadata_path).returns user_metadata.merge('dependencies' => []).to_pson
205
+ Puppet[:code] = "$case_number = #{case_number}\ninclude ::user"
206
+ expect { catalog = compiler.compile }.to raise_error(Puppet::Error, /Unknown function/)
207
+ end
208
+ end
209
+ end
210
+
211
+ it "a type can reference an autoloaded type alias from another module when dependency is present in metadata.json" do
212
+ File.stubs(:read).with(user_metadata_path).returns user_metadata.merge('dependencies' => [ { 'name' => 'test-usee'} ]).to_pson
213
+ expect(eval_and_collect_notices(<<-CODE, node)).to eq(['ok'])
214
+ assert_type(Usee::Zero, 0)
215
+ notice(ok)
216
+ CODE
217
+ end
218
+
219
+ it "a type can reference an autoloaded type alias from another module when no metadata is present" do
220
+ Puppet::Module.any_instance.expects('has_metadata?').at_least_once.returns(false)
221
+ expect(eval_and_collect_notices(<<-CODE, node)).to eq(['ok'])
222
+ assert_type(Usee::Zero, 0)
223
+ notice(ok)
224
+ CODE
225
+ end
226
+
227
+ it "a type can reference a type alias from another module when other module has it declared in init.pp" do
228
+ File.stubs(:read).with(user_metadata_path).returns user_metadata.merge('dependencies' => [ { 'name' => 'test-usee'} ]).to_pson
229
+ expect(eval_and_collect_notices(<<-CODE, node)).to eq(['ok'])
230
+ include 'usee'
231
+ assert_type(Usee::One, 1)
232
+ notice(ok)
233
+ CODE
234
+ end
235
+
236
+ it "an autoloaded type can reference an autoloaded type alias from another module when dependency is present in metadata.json" do
237
+ File.stubs(:read).with(user_metadata_path).returns user_metadata.merge('dependencies' => [ { 'name' => 'test-usee'} ]).to_pson
238
+ expect(eval_and_collect_notices(<<-CODE, node)).to eq(['ok'])
239
+ assert_type(User::WithUseeZero, [0])
240
+ notice(ok)
241
+ CODE
242
+ end
243
+
244
+ it "an autoloaded type can reference an autoloaded type alias from another module when other module has it declared in init.pp" do
245
+ File.stubs(:read).with(user_metadata_path).returns user_metadata.merge('dependencies' => [ { 'name' => 'test-usee'} ]).to_pson
246
+ expect(eval_and_collect_notices(<<-CODE, node)).to eq(['ok'])
247
+ include 'usee'
248
+ assert_type(User::WithUseeOne, [1])
249
+ notice(ok)
250
+ CODE
126
251
  end
127
252
  end
128
253
 
@@ -329,13 +329,19 @@ describe 'Lexer2' do
329
329
  end
330
330
  end
331
331
 
332
+ it 'detects unterminated multiline comment' do
333
+ expect { tokens_scanned_from("/* not terminated\nmultiline\ncomment") }.to raise_error(Puppet::ParseErrorWithIssue) { |e|
334
+ expect(e.issue_code).to be(Puppet::Pops::Issues::UNCLOSED_MLCOMMENT.issue_code)
335
+ }
336
+ end
337
+
332
338
  { "=~" => [:MATCH, "=~ /./"],
333
339
  "!~" => [:NOMATCH, "!~ /./"],
334
340
  "," => [:COMMA, ", /./"],
335
341
  "(" => [:LPAREN, "( /./"],
336
- "[" => [:LISTSTART, "[ /./"],
337
- "[" => [[:NAME, :LBRACK], "a[ /./"],
338
- "[" => [[:NAME, :LISTSTART], "a [ /./"],
342
+ "[ (liststart)" => [:LISTSTART, "[ /./"],
343
+ "[ (LBRACK)" => [[:NAME, :LBRACK], "a[ /./"],
344
+ "[ (liststart after name)" => [[:NAME, :LISTSTART], "a [ /./"],
339
345
  "{" => [:LBRACE, "{ /./"],
340
346
  "+" => [:PLUS, "+ /./"],
341
347
  "-" => [:MINUS, "- /./"],
@@ -471,6 +477,18 @@ describe 'Lexer2' do
471
477
  end
472
478
  end
473
479
  end
480
+ context 'when not given multi byte characters' do
481
+ it 'produces byte offsets for tokens' do
482
+ code = <<-"CODE"
483
+ 1 2\n3
484
+ CODE
485
+ expect(tokens_scanned_from(code)).to match_tokens2(
486
+ [:NUMBER, '1', {:line => 1, :offset => 0, :length=>1}],
487
+ [:NUMBER, '2', {:line => 1, :offset => 2, :length=>1}],
488
+ [:NUMBER, '3', {:line => 2, :offset => 4, :length=>1}]
489
+ )
490
+ end
491
+ end
474
492
 
475
493
  context 'when dealing with multi byte characters' do
476
494
  it 'should support unicode characters' do
@@ -480,6 +498,7 @@ describe 'Lexer2' do
480
498
  # >= Ruby 1.9.3 reports \u
481
499
  expect(tokens_scanned_from(code)).to match_tokens2([:STRING, "x\u2713y"])
482
500
  end
501
+
483
502
  it 'should support unicode characters in long form' do
484
503
  code = <<-CODE
485
504
  "x\\u{1f452}y"
@@ -487,6 +506,23 @@ describe 'Lexer2' do
487
506
  expect(tokens_scanned_from(code)).to match_tokens2([:STRING, "x\u{1f452}y"])
488
507
  end
489
508
 
509
+ it 'produces byte offsets that counts each byte in a comment' do
510
+ code = <<-"CODE"
511
+ # \u{0400}\na
512
+ CODE
513
+ expect(tokens_scanned_from(code.strip)).to match_tokens2([:NAME, 'a', {:line => 2, :offset => 5, :length=>1}])
514
+ end
515
+
516
+ it 'produces byte offsets that counts each byte in value token' do
517
+ code = <<-"CODE"
518
+ '\u{0400}'\na
519
+ CODE
520
+ expect(tokens_scanned_from(code.strip)).to match_tokens2(
521
+ [:STRING, "\u{400}", {:line => 1, :offset => 0, :length=>4}],
522
+ [:NAME, 'a', {:line => 2, :offset => 5, :length=>1}]
523
+ )
524
+ end
525
+
490
526
  it 'should not select LISTSTART token when preceded by multibyte chars' do
491
527
  # This test is sensitive to the number of multibyte characters and position of the expressions
492
528
  # within the string - it is designed to fail if the position is calculated on the byte offset of the '['
@@ -696,4 +732,83 @@ describe 'Lexer2' do
696
732
  expect_issue('"asd', Puppet::Pops::Issues::UNCLOSED_QUOTE)
697
733
  end
698
734
  end
735
+
736
+ context 'when dealing with non UTF-8 and Byte Order Marks (BOMs)' do
737
+ {
738
+ 'UTF_8' => [0xEF, 0xBB, 0xBF],
739
+ 'UTF_16_1' => [0xFE, 0xFF],
740
+ 'UTF_16_2' => [0xFF, 0xFE],
741
+ 'UTF_32_1' => [0x00, 0x00, 0xFE, 0xFF],
742
+ 'UTF_32_2' => [0xFF, 0xFE, 0x00, 0x00],
743
+ 'UTF_1' => [0xF7, 0x64, 0x4C],
744
+ 'UTF_EBCDIC' => [0xDD, 0x73, 0x66, 0x73],
745
+ 'SCSU' => [0x0E, 0xFE, 0xFF],
746
+ 'BOCU' => [0xFB, 0xEE, 0x28],
747
+ 'GB_18030' => [0x84, 0x31, 0x95, 0x33]
748
+ }.each do |key, bytes|
749
+ it "errors on the byte order mark for #{key} '[#{bytes.map() {|b| '%X' % b}.join(' ')}]'" do
750
+ format_name = key.split('_')[0,2].join('-')
751
+ bytes_str = "\\[#{bytes.map {|b| '%X' % b}.join(' ')}\\]"
752
+ fix = " - remove these from the puppet source"
753
+ expect {
754
+ tokens_scanned_from(bytes.pack('C*'))
755
+ }.to raise_error(Puppet::ParseErrorWithIssue,
756
+ /Illegal #{format_name} .* at beginning of input: #{bytes_str}#{fix}/)
757
+ end
758
+
759
+ it "can use a possibly 'broken' UTF-16 string without problems for #{key}" do
760
+ format_name = key.split('_')[0,2].join('-')
761
+ string = bytes.pack('C*').force_encoding('UTF-16')
762
+ bytes_str = "\\[#{string.bytes.map {|b| '%X' % b}.join(' ')}\\]"
763
+ fix = " - remove these from the puppet source"
764
+ expect {
765
+ tokens_scanned_from(string)
766
+ }.to raise_error(Puppet::ParseErrorWithIssue,
767
+ /Illegal #{format_name} .* at beginning of input: #{bytes_str}#{fix}/)
768
+ end
769
+ end
770
+ end
771
+ end
772
+
773
+ describe Puppet::Pops::Parser::Lexer2 do
774
+
775
+ include PuppetSpec::Files
776
+
777
+ # First line of Rune version of Rune poem at http://www.columbia.edu/~fdc/utf8/
778
+ # characters chosen since they will not parse on Windows with codepage 437 or 1252
779
+ # Section 3.2.1.3 of Ruby spec guarantees that \u strings are encoded as UTF-8
780
+ # Runes (may show up as garbage if font is not available): ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ
781
+ let (:rune_utf8) {
782
+ "\u16A0\u16C7\u16BB\u16EB\u16D2\u16E6\u16A6\u16EB\u16A0\u16B1\u16A9\u16A0\u16A2"
783
+ "\u16B1\u16EB\u16A0\u16C1\u16B1\u16AA\u16EB\u16B7\u16D6\u16BB\u16B9\u16E6\u16DA"
784
+ "\u16B3\u16A2\u16D7"
785
+ }
786
+
787
+ context 'when lexing files from disk' do
788
+ it 'should always read files as UTF-8' do
789
+ if Puppet.features.microsoft_windows? && Encoding.default_external == Encoding::UTF_8
790
+ raise 'This test must be run in a codepage other than 65001 to validate behavior'
791
+ end
792
+
793
+ manifest_code = "notify { '#{rune_utf8}': }"
794
+ manifest = file_containing('manifest.pp', manifest_code)
795
+ lexed_file = described_class.new.lex_file(manifest)
796
+
797
+ expect(lexed_file.string.encoding).to eq(Encoding::UTF_8)
798
+ expect(lexed_file.string).to eq(manifest_code)
799
+ end
800
+
801
+ it 'currently errors when the UTF-8 BOM (Byte Order Mark) is present when lexing files' do
802
+ bom = "\uFEFF"
803
+
804
+ manifest_code = "#{bom}notify { '#{rune_utf8}': }"
805
+ manifest = file_containing('manifest.pp', manifest_code)
806
+
807
+ expect {
808
+ lexed_file = described_class.new.lex_file(manifest)
809
+ }.to raise_error(Puppet::ParseErrorWithIssue,
810
+ 'Illegal UTF-8 Byte Order mark at beginning of input: [EF BB BF] - remove these from the puppet source')
811
+ end
812
+ end
813
+
699
814
  end
@@ -26,6 +26,10 @@ describe "egrammar parsing function calls" do
26
26
  expect(dump(parse("foo(bar)"))).to eq("(invoke foo bar)")
27
27
  end
28
28
 
29
+ it "notice {a=>2}" do
30
+ expect(dump(parse("notice {a => 2}"))).to eq("(invoke notice ({} ('a' 2)))")
31
+ end
32
+
29
33
  it "foo(bar,)" do
30
34
  expect(dump(parse("foo(bar,)"))).to eq("(invoke foo bar)")
31
35
  end
@@ -37,6 +41,10 @@ describe "egrammar parsing function calls" do
37
41
  it "notice fqdn_rand(30)" do
38
42
  expect(dump(parse("notice fqdn_rand(30)"))).to eq('(invoke notice (call fqdn_rand 30))')
39
43
  end
44
+
45
+ it "notice type(42)" do
46
+ expect(dump(parse("notice type(42)"))).to eq('(invoke notice (call type 42))')
47
+ end
40
48
  end
41
49
 
42
50
  context "in nested scopes" do
@@ -13,4 +13,9 @@ module ParserRspecHelper
13
13
  parser = Puppet::Pops::Parser::Parser.new()
14
14
  parser.parse_string(code)
15
15
  end
16
+
17
+ def parse_epp(code)
18
+ parser = Puppet::Pops::Parser::EppParser.new()
19
+ parser.parse_string(code)
20
+ end
16
21
  end
@@ -31,6 +31,16 @@ describe Puppet::Pops::Parser::Parser do
31
31
  expect(adapter.length).to eq(0)
32
32
  end
33
33
 
34
+ it "multi byte characters in a comment are counted as individual bytes" do
35
+ parser = Puppet::Pops::Parser::Parser.new()
36
+ model = parser.parse_string("# \u{0400}comment\n").current
37
+ expect(model.class).to eq(Puppet::Pops::Model::Program)
38
+ expect(model.body.class).to eq(Puppet::Pops::Model::Nop)
39
+ adapter = Puppet::Pops::Adapters::SourcePosAdapter.adapt(model.body)
40
+ expect(adapter.offset).to eq(12)
41
+ expect(adapter.length).to eq(0)
42
+ end
43
+
34
44
  it "should raise an error with position information when error is raised from within parser" do
35
45
  parser = Puppet::Pops::Parser::Parser.new()
36
46
  the_error = nil
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops'
3
+
4
+ describe Puppet::Pops::Adapters::SourcePosAdapter do
5
+
6
+ it "multi byte characters in a comment does not interfere with AST node text extraction" do
7
+ parser = Puppet::Pops::Parser::Parser.new()
8
+ model = parser.parse_string("# \u{0400}comment\nabcdef#XXXXXXXXXX").current
9
+ expect(model.class).to eq(Puppet::Pops::Model::Program)
10
+ adapter = Puppet::Pops::Adapters::SourcePosAdapter.adapt(model.body)
11
+ expect(adapter.offset).to eq(12)
12
+ expect(adapter.length).to eq(6)
13
+ expect(adapter.extract_text).to eq('abcdef')
14
+ end
15
+
16
+ it "multi byte characters in a comment does not interfere with AST node text extraction" do
17
+ parser = Puppet::Pops::Parser::Parser.new()
18
+ model = parser.parse_string("# \u{0400}comment\n1 + 2#XXXXXXXXXX").current
19
+ expect(model.class).to eq(Puppet::Pops::Model::Program)
20
+ adapter = Puppet::Pops::Adapters::SourcePosAdapter.adapt(model.body)
21
+ expect(adapter.offset).to eq(14) # The '+'
22
+ expect(adapter.length).to eq(1)
23
+ expect(adapter.extract_tree_text).to eq('1 + 2')
24
+ end
25
+
26
+ end