puppet 4.3.2 → 4.4.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (487) hide show
  1. checksums.yaml +4 -4
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +6 -6
  4. data/LICENSE +1 -1
  5. data/README.md +8 -9
  6. data/conf/auth.conf +2 -2
  7. data/ext/README.environment +1 -1
  8. data/ext/debian/README.source +1 -1
  9. data/ext/debian/control +1 -1
  10. data/ext/debian/copyright +4 -4
  11. data/ext/debian/puppetmaster.README.debian +11 -9
  12. data/ext/emacs/puppet-mode.el +1 -1
  13. data/ext/envpuppet +2 -2
  14. data/ext/ips/puppetagent.xml +1 -1
  15. data/ext/ips/puppetmaster.xml +1 -1
  16. data/ext/project_data.yaml +8 -0
  17. data/ext/puppet-test +3 -3
  18. data/ext/rack/example-passenger-vhost.conf +1 -1
  19. data/ext/redhat/puppet.spec.erb +2 -2
  20. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  21. data/ext/solaris/pkginfo +1 -1
  22. data/ext/solaris/smf/puppet.xml +1 -1
  23. data/ext/suse/puppet.spec +2 -2
  24. data/ext/upload_facts.rb +1 -1
  25. data/ext/windows/puppet_interactive.bat +6 -0
  26. data/ext/windows/puppet_shell.bat +9 -0
  27. data/ext/windows/run_puppet_interactive.bat +9 -0
  28. data/ext/yaml_nodes.rb +1 -1
  29. data/install.rb +30 -20
  30. data/lib/puppet/agent.rb +1 -1
  31. data/lib/puppet/application/agent.rb +4 -2
  32. data/lib/puppet/application/apply.rb +7 -4
  33. data/lib/puppet/application/cert.rb +1 -1
  34. data/lib/puppet/application/device.rb +1 -1
  35. data/lib/puppet/application/filebucket.rb +1 -1
  36. data/lib/puppet/application/inspect.rb +1 -1
  37. data/lib/puppet/application/lookup.rb +4 -4
  38. data/lib/puppet/application/master.rb +2 -2
  39. data/lib/puppet/application/resource.rb +1 -1
  40. data/lib/puppet/configurer.rb +100 -22
  41. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  42. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  43. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  44. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  45. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  46. data/lib/puppet/defaults.rb +65 -19
  47. data/lib/puppet/environments.rb +3 -1
  48. data/lib/puppet/face/config.rb +1 -1
  49. data/lib/puppet/face/epp.rb +1 -1
  50. data/lib/puppet/face/help/man.erb +1 -1
  51. data/lib/puppet/face/module/install.rb +6 -6
  52. data/lib/puppet/face/parser.rb +12 -9
  53. data/lib/puppet/face/status.rb +2 -1
  54. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  55. data/lib/puppet/feature/telnet.rb +9 -0
  56. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  57. data/lib/puppet/file_serving/metadata.rb +18 -2
  58. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  59. data/lib/puppet/file_system.rb +2 -2
  60. data/lib/puppet/file_system/file_impl.rb +2 -2
  61. data/lib/puppet/file_system/memory_impl.rb +1 -1
  62. data/lib/puppet/file_system/uniquefile.rb +1 -1
  63. data/lib/puppet/forge.rb +1 -1
  64. data/lib/puppet/forge/repository.rb +1 -31
  65. data/lib/puppet/functions.rb +45 -6
  66. data/lib/puppet/functions/assert_type.rb +9 -9
  67. data/lib/puppet/functions/each.rb +5 -13
  68. data/lib/puppet/functions/filter.rb +5 -14
  69. data/lib/puppet/functions/map.rb +6 -14
  70. data/lib/puppet/functions/reduce.rb +5 -13
  71. data/lib/puppet/functions/reverse_each.rb +82 -0
  72. data/lib/puppet/functions/scanf.rb +15 -18
  73. data/lib/puppet/functions/slice.rb +22 -36
  74. data/lib/puppet/functions/split.rb +2 -2
  75. data/lib/puppet/functions/step.rb +88 -0
  76. data/lib/puppet/functions/type.rb +70 -0
  77. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  78. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  79. data/lib/puppet/indirector/file_content/http.rb +15 -0
  80. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  81. data/lib/puppet/indirector/generic_http.rb +16 -0
  82. data/lib/puppet/indirector/node/exec.rb +1 -1
  83. data/lib/puppet/indirector/node/ldap.rb +1 -1
  84. data/lib/puppet/indirector/rest.rb +2 -1
  85. data/lib/puppet/info_service/class_information_service.rb +13 -12
  86. data/lib/puppet/loaders.rb +1 -0
  87. data/lib/puppet/module.rb +3 -0
  88. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  89. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  90. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  91. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  92. data/lib/puppet/network/http/pool.rb +9 -0
  93. data/lib/puppet/node.rb +1 -1
  94. data/lib/puppet/node/environment.rb +11 -2
  95. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  96. data/lib/puppet/parser/compiler.rb +3 -3
  97. data/lib/puppet/parser/environment_compiler.rb +0 -1
  98. data/lib/puppet/parser/functions.rb +28 -16
  99. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  100. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  101. data/lib/puppet/parser/functions/map.rb +1 -1
  102. data/lib/puppet/parser/functions/scanf.rb +15 -26
  103. data/lib/puppet/parser/functions/slice.rb +17 -24
  104. data/lib/puppet/parser/functions/split.rb +1 -1
  105. data/lib/puppet/parser/resource.rb +19 -17
  106. data/lib/puppet/parser/scope.rb +176 -5
  107. data/lib/puppet/plugins/data_providers/data_provider.rb +54 -13
  108. data/lib/puppet/pops.rb +0 -8
  109. data/lib/puppet/pops/adaptable.rb +4 -1
  110. data/lib/puppet/pops/adapters.rb +38 -13
  111. data/lib/puppet/pops/binder/binder.rb +21 -17
  112. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  113. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  114. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  115. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  116. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  117. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  118. data/lib/puppet/pops/binder/injector.rb +53 -48
  119. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  120. data/lib/puppet/pops/binder/producers.rb +67 -62
  121. data/lib/puppet/pops/evaluator/access_operator.rb +95 -93
  122. data/lib/puppet/pops/evaluator/closure.rb +84 -68
  123. data/lib/puppet/pops/evaluator/collector_transformer.rb +18 -14
  124. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  125. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  126. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  127. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  128. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  129. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  130. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  131. data/lib/puppet/pops/evaluator/runtime3_support.rb +41 -45
  132. data/lib/puppet/pops/issue_reporter.rb +6 -4
  133. data/lib/puppet/pops/issues.rb +34 -11
  134. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  135. data/lib/puppet/pops/loader/loader.rb +1 -1
  136. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  137. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  138. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +16 -12
  139. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  140. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  141. data/lib/puppet/pops/loaders.rb +51 -9
  142. data/lib/puppet/pops/lookup.rb +14 -12
  143. data/lib/puppet/pops/merge_strategy.rb +16 -19
  144. data/lib/puppet/pops/model/factory.rb +26 -2
  145. data/lib/puppet/pops/model/model.rb +8 -8
  146. data/lib/puppet/pops/model/model_label_provider.rb +13 -7
  147. data/lib/puppet/pops/model/model_meta.rb +17 -0
  148. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  149. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  150. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  151. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  152. data/lib/puppet/pops/parser/evaluating_parser.rb +14 -10
  153. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  154. data/lib/puppet/pops/parser/lexer2.rb +26 -19
  155. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  156. data/lib/puppet/pops/parser/locator.rb +21 -0
  157. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  158. data/lib/puppet/pops/parser/slurp_support.rb +11 -7
  159. data/lib/puppet/pops/types/class_loader.rb +23 -19
  160. data/lib/puppet/pops/types/enumeration.rb +9 -26
  161. data/lib/puppet/pops/types/iterable.rb +308 -0
  162. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  163. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  164. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  165. data/lib/puppet/pops/types/type_calculator.rb +138 -381
  166. data/lib/puppet/pops/types/type_factory.rb +91 -57
  167. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  168. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  169. data/lib/puppet/pops/types/type_parser.rb +159 -112
  170. data/lib/puppet/pops/types/types.rb +2057 -1247
  171. data/lib/puppet/pops/utils.rb +11 -10
  172. data/lib/puppet/pops/validation.rb +11 -9
  173. data/lib/puppet/pops/validation/checker4_0.rb +83 -55
  174. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  175. data/lib/puppet/provider/aixobject.rb +1 -1
  176. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  177. data/lib/puppet/provider/cron/crontab.rb +1 -1
  178. data/lib/puppet/provider/exec/windows.rb +1 -1
  179. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  180. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  181. data/lib/puppet/provider/package/appdmg.rb +3 -2
  182. data/lib/puppet/provider/package/dnf.rb +1 -1
  183. data/lib/puppet/provider/package/pip.rb +5 -8
  184. data/lib/puppet/provider/package/pip3.rb +1 -1
  185. data/lib/puppet/provider/package/pkg.rb +1 -1
  186. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  187. data/lib/puppet/provider/package/pkgng.rb +13 -4
  188. data/lib/puppet/provider/package/windows.rb +1 -1
  189. data/lib/puppet/provider/package/yum.rb +1 -1
  190. data/lib/puppet/provider/package/zypper.rb +19 -0
  191. data/lib/puppet/provider/service/debian.rb +2 -2
  192. data/lib/puppet/provider/service/launchd.rb +6 -18
  193. data/lib/puppet/provider/service/systemd.rb +9 -2
  194. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  195. data/lib/puppet/provider/user/aix.rb +1 -1
  196. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  197. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  198. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  199. data/lib/puppet/reference/configuration.rb +1 -1
  200. data/lib/puppet/reference/providers.rb +1 -1
  201. data/lib/puppet/resource.rb +15 -12
  202. data/lib/puppet/resource/capability_finder.rb +20 -13
  203. data/lib/puppet/resource/catalog.rb +60 -3
  204. data/lib/puppet/resource/status.rb +11 -2
  205. data/lib/puppet/resource/type.rb +28 -38
  206. data/lib/puppet/settings.rb +1 -1
  207. data/lib/puppet/settings/config_file.rb +1 -1
  208. data/lib/puppet/settings/environment_conf.rb +13 -5
  209. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  210. data/lib/puppet/ssl/certificate_request.rb +4 -4
  211. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  212. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  213. data/lib/puppet/test/test_helper.rb +16 -4
  214. data/lib/puppet/transaction.rb +15 -2
  215. data/lib/puppet/transaction/additional_resource_generator.rb +6 -2
  216. data/lib/puppet/transaction/report.rb +31 -1
  217. data/lib/puppet/transaction/resource_harness.rb +0 -25
  218. data/lib/puppet/type.rb +11 -11
  219. data/lib/puppet/type/augeas.rb +1 -1
  220. data/lib/puppet/type/cron.rb +12 -12
  221. data/lib/puppet/type/file.rb +91 -39
  222. data/lib/puppet/type/file/checksum_value.rb +53 -0
  223. data/lib/puppet/type/file/content.rb +26 -111
  224. data/lib/puppet/type/file/data_sync.rb +84 -0
  225. data/lib/puppet/type/file/ensure.rb +17 -14
  226. data/lib/puppet/type/file/selcontext.rb +1 -1
  227. data/lib/puppet/type/file/source.rb +103 -18
  228. data/lib/puppet/type/filebucket.rb +1 -1
  229. data/lib/puppet/type/interface.rb +8 -3
  230. data/lib/puppet/type/macauthorization.rb +1 -1
  231. data/lib/puppet/type/package.rb +6 -0
  232. data/lib/puppet/type/schedule.rb +1 -1
  233. data/lib/puppet/type/stage.rb +1 -1
  234. data/lib/puppet/type/user.rb +19 -17
  235. data/lib/puppet/type/yumrepo.rb +20 -0
  236. data/lib/puppet/util.rb +109 -22
  237. data/lib/puppet/util/autoload.rb +16 -11
  238. data/lib/puppet/util/checksums.rb +74 -31
  239. data/lib/puppet/util/execution.rb +1 -1
  240. data/lib/puppet/util/http_proxy.rb +72 -0
  241. data/lib/puppet/util/log.rb +2 -0
  242. data/lib/puppet/util/logging.rb +43 -1
  243. data/lib/puppet/util/monkey_patches.rb +2 -2
  244. data/lib/puppet/util/multi_match.rb +51 -0
  245. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  246. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  247. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  248. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  249. data/lib/puppet/util/plist.rb +130 -0
  250. data/lib/puppet/util/resource_template.rb +1 -1
  251. data/lib/puppet/util/run_mode.rb +2 -2
  252. data/lib/puppet/util/skip_tags.rb +9 -0
  253. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  254. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  255. data/lib/puppet/util/windows/adsi.rb +4 -4
  256. data/lib/puppet/util/windows/api_types.rb +24 -18
  257. data/lib/puppet/util/windows/com.rb +3 -3
  258. data/lib/puppet/util/windows/error.rb +1 -1
  259. data/lib/puppet/util/windows/file.rb +8 -8
  260. data/lib/puppet/util/windows/principal.rb +23 -14
  261. data/lib/puppet/util/windows/process.rb +78 -11
  262. data/lib/puppet/util/windows/registry.rb +1 -1
  263. data/lib/puppet/util/windows/root_certs.rb +5 -5
  264. data/lib/puppet/util/windows/security.rb +33 -35
  265. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  266. data/lib/puppet/util/windows/sid.rb +42 -4
  267. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  268. data/lib/puppet/util/windows/user.rb +10 -10
  269. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  270. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  271. data/lib/puppet/vendor/pathspec/README.md +1 -1
  272. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  273. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  274. data/lib/puppet/version.rb +1 -1
  275. data/lib/semver.rb +17 -1
  276. data/man/man5/puppet.conf.5 +12 -12
  277. data/man/man8/extlookup2hiera.8 +1 -1
  278. data/man/man8/puppet-agent.8 +2 -2
  279. data/man/man8/puppet-apply.8 +2 -2
  280. data/man/man8/puppet-ca.8 +2 -2
  281. data/man/man8/puppet-catalog.8 +2 -2
  282. data/man/man8/puppet-cert.8 +2 -2
  283. data/man/man8/puppet-certificate.8 +2 -2
  284. data/man/man8/puppet-certificate_request.8 +2 -2
  285. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  286. data/man/man8/puppet-config.8 +3 -3
  287. data/man/man8/puppet-describe.8 +1 -1
  288. data/man/man8/puppet-device.8 +1 -1
  289. data/man/man8/puppet-doc.8 +1 -1
  290. data/man/man8/puppet-epp.8 +2 -2
  291. data/man/man8/puppet-facts.8 +2 -2
  292. data/man/man8/puppet-file.8 +2 -2
  293. data/man/man8/puppet-filebucket.8 +2 -2
  294. data/man/man8/puppet-help.8 +2 -2
  295. data/man/man8/puppet-inspect.8 +2 -2
  296. data/man/man8/puppet-key.8 +2 -2
  297. data/man/man8/puppet-man.8 +2 -2
  298. data/man/man8/puppet-master.8 +2 -2
  299. data/man/man8/puppet-module.8 +9 -9
  300. data/man/man8/puppet-node.8 +2 -2
  301. data/man/man8/puppet-parser.8 +2 -2
  302. data/man/man8/puppet-plugin.8 +2 -2
  303. data/man/man8/puppet-report.8 +2 -2
  304. data/man/man8/puppet-resource.8 +2 -2
  305. data/man/man8/puppet-resource_type.8 +2 -2
  306. data/man/man8/puppet-status.8 +3 -3
  307. data/man/man8/puppet.8 +1 -1
  308. data/spec/fixtures/module.tar.gz +0 -0
  309. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  310. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  311. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  312. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  313. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  314. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  315. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  316. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  317. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  318. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  319. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  320. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  321. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +3 -1
  322. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  323. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  324. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  325. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  326. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  327. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
  328. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
  329. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  330. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
  331. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  332. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
  333. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
  334. data/spec/integration/defaults_spec.rb +14 -2
  335. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  336. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  337. data/spec/integration/node/environment_spec.rb +13 -0
  338. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  339. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  340. data/spec/integration/parser/undef_param_spec.rb +8 -0
  341. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  342. data/spec/integration/test/test_helper_spec.rb +28 -0
  343. data/spec/integration/transaction/report_spec.rb +16 -0
  344. data/spec/integration/transaction_spec.rb +11 -0
  345. data/spec/integration/type/file_spec.rb +194 -4
  346. data/spec/integration/type/package_spec.rb +5 -1
  347. data/spec/integration/type/tidy_spec.rb +21 -9
  348. data/spec/integration/util/execution_spec.rb +22 -0
  349. data/spec/integration/util/windows/principal_spec.rb +90 -4
  350. data/spec/integration/util/windows/process_spec.rb +31 -0
  351. data/spec/integration/util/windows/security_spec.rb +6 -6
  352. data/spec/integration/util/windows/user_spec.rb +1 -1
  353. data/spec/integration/util_spec.rb +49 -27
  354. data/spec/lib/puppet_spec/compiler.rb +17 -0
  355. data/spec/lib/puppet_spec/files.rb +2 -2
  356. data/spec/lib/puppet_spec/pops.rb +13 -0
  357. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  358. data/spec/shared_contexts/types_setup.rb +96 -0
  359. data/spec/unit/agent_spec.rb +1 -0
  360. data/spec/unit/application/agent_spec.rb +10 -0
  361. data/spec/unit/application/apply_spec.rb +9 -0
  362. data/spec/unit/configurer/downloader_spec.rb +5 -5
  363. data/spec/unit/configurer_spec.rb +271 -39
  364. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  365. data/spec/unit/defaults_spec.rb +15 -0
  366. data/spec/unit/environments_spec.rb +24 -4
  367. data/spec/unit/face/parser_spec.rb +43 -2
  368. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  369. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  370. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  371. data/spec/unit/file_system_spec.rb +26 -0
  372. data/spec/unit/functions/assert_type_spec.rb +36 -2
  373. data/spec/unit/functions/defined_spec.rb +2 -2
  374. data/spec/unit/functions/epp_spec.rb +11 -3
  375. data/spec/unit/functions/lookup_spec.rb +58 -13
  376. data/spec/unit/functions/regsubst_spec.rb +1 -1
  377. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  378. data/spec/unit/functions/step_spec.rb +113 -0
  379. data/spec/unit/functions/type_spec.rb +35 -0
  380. data/spec/unit/functions4_spec.rb +61 -5
  381. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  382. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  383. data/spec/unit/indirector/indirection_spec.rb +1 -1
  384. data/spec/unit/info_service_spec.rb +94 -32
  385. data/spec/unit/module_spec.rb +14 -0
  386. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  387. data/spec/unit/network/authstore_spec.rb +1 -1
  388. data/spec/unit/network/http/connection_spec.rb +1 -0
  389. data/spec/unit/network/http/pool_spec.rb +30 -0
  390. data/spec/unit/node_spec.rb +1 -1
  391. data/spec/unit/parser/compiler_spec.rb +16 -0
  392. data/spec/unit/parser/scope_spec.rb +28 -11
  393. data/spec/unit/pops/evaluator/access_ops_spec.rb +3 -3
  394. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  395. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +7 -1
  396. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  397. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  398. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  399. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  400. data/spec/unit/pops/loaders/loaders_spec.rb +44 -1
  401. data/spec/unit/pops/parser/lexer2_spec.rb +112 -3
  402. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  403. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  404. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  405. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  406. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  407. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  408. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  409. data/spec/unit/pops/types/type_calculator_spec.rb +275 -373
  410. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  411. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  412. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  413. data/spec/unit/pops/types/types_spec.rb +241 -0
  414. data/spec/unit/pops/validator/validator_spec.rb +100 -43
  415. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  416. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  417. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  418. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  419. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  420. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  421. data/spec/unit/provider/package/pip_spec.rb +47 -34
  422. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  423. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  424. data/spec/unit/provider/package/yum_spec.rb +11 -0
  425. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  426. data/spec/unit/provider/service/launchd_spec.rb +17 -35
  427. data/spec/unit/provider/service/systemd_spec.rb +7 -0
  428. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  429. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  430. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  431. data/spec/unit/resource/catalog_spec.rb +33 -1
  432. data/spec/unit/resource/type_spec.rb +149 -7
  433. data/spec/unit/resource_spec.rb +96 -57
  434. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  435. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  436. data/spec/unit/transaction/report_spec.rb +27 -0
  437. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  438. data/spec/unit/transaction_spec.rb +5 -0
  439. data/spec/unit/type/file/checksum_spec.rb +6 -0
  440. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  441. data/spec/unit/type/file/content_spec.rb +12 -193
  442. data/spec/unit/type/file/source_spec.rb +211 -119
  443. data/spec/unit/type/file_spec.rb +133 -34
  444. data/spec/unit/type/interface_spec.rb +32 -0
  445. data/spec/unit/type/macauthorization_spec.rb +4 -1
  446. data/spec/unit/type/yumrepo_spec.rb +2 -2
  447. data/spec/unit/util/filetype_spec.rb +1 -1
  448. data/spec/unit/util/http_proxy_spec.rb +2 -2
  449. data/spec/unit/util/log/destinations_spec.rb +0 -2
  450. data/spec/unit/util/logging_spec.rb +69 -0
  451. data/spec/unit/util/multi_match_spec.rb +39 -0
  452. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  453. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  454. data/spec/unit/util/plist_spec.rb +110 -0
  455. data/spec/unit/util/resource_template_spec.rb +2 -2
  456. data/spec/unit/util/run_mode_spec.rb +27 -3
  457. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  458. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  459. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  460. data/spec/unit/util/windows/sid_spec.rb +1 -1
  461. data/spec/unit/util_spec.rb +123 -13
  462. data/tasks/cfpropertylist.rake +15 -0
  463. metadata +114 -26
  464. data/lib/puppet/vendor/load_plist.rb +0 -1
  465. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  466. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  467. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  468. data/lib/puppet/vendor/plist/README +0 -36
  469. data/lib/puppet/vendor/plist/Rakefile +0 -144
  470. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  471. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  472. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  473. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  474. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  475. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  476. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  477. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  478. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  479. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  480. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  481. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  482. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  483. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  484. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  485. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  486. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  487. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
@@ -116,13 +116,25 @@ describe "Puppet defaults" do
116
116
  end
117
117
 
118
118
  describe "on a Windows-like platform it", :if => Puppet.features.microsoft_windows? do
119
- it "should not add anything" do
119
+ let (:rune_utf8) { "\u16A0\u16C7\u16BB\u16EB\u16D2\u16E6\u16A6\u16EB\u16A0\u16B1\u16A9\u16A0\u16A2\u16B1\u16EB\u16A0\u16C1\u16B1\u16AA\u16EB\u16B7\u16D6\u16BB\u16B9\u16E6\u16DA\u16B3\u16A2\u16D7" }
120
+
121
+ it "path should not add anything" do
120
122
  path = "c:\\windows\\system32#{File::PATH_SEPARATOR}c:\\windows"
121
- Puppet::Util.withenv("PATH" => path) do
123
+ Puppet::Util.withenv( {"PATH" => path }, :windows ) do
122
124
  Puppet.settings[:path] = "none" # this causes it to ignore the setting
123
125
  expect(ENV["PATH"]).to eq(path)
124
126
  end
125
127
  end
128
+
129
+ it "path should support UTF8 characters" do
130
+ path = "c:\\windows\\system32#{File::PATH_SEPARATOR}c:\\windows#{File::PATH_SEPARATOR}C:\\" + rune_utf8
131
+ Puppet::Util.withenv( {"PATH" => path }, :windows) do
132
+ Puppet.settings[:path] = "none" # this causes it to ignore the setting
133
+
134
+ envhash = Puppet::Util::Windows::Process.get_environment_strings
135
+ expect(envhash['Path']).to eq(path)
136
+ end
137
+ end
126
138
  end
127
139
 
128
140
  it "should default to pson for the preferred serialization format" do
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe Puppet::FileSystem::Uniquefile do
4
+
5
+ describe "#open_tmp on Windows", :if => Puppet.features.microsoft_windows? do
6
+
7
+ describe "with UTF8 characters" do
8
+ include PuppetSpec::Files
9
+
10
+ let(:rune_utf8) { "\u16A0\u16C7\u16BB\u16EB\u16D2\u16E6\u16A6\u16EB\u16A0\u16B1\u16A9\u16A0\u16A2\u16B1\u16EB\u16A0\u16C1\u16B1\u16AA\u16EB\u16B7\u16D6\u16BB\u16B9\u16E6\u16DA\u16B3\u16A2\u16D7" }
11
+ let(:temp_rune_utf8) { tmpdir(rune_utf8) }
12
+
13
+ it "should use UTF8 characters in TMP,TEMP,TMPDIR environment variable" do
14
+ # Set the temporary environment variables to the UTF8 temp path
15
+ Puppet::Util::Windows::Process.set_environment_variable('TMPDIR', temp_rune_utf8)
16
+ Puppet::Util::Windows::Process.set_environment_variable('TMP', temp_rune_utf8)
17
+ Puppet::Util::Windows::Process.set_environment_variable('TEMP', temp_rune_utf8)
18
+
19
+ # Create a unique file
20
+ filename = Puppet::FileSystem::Uniquefile.open_tmp('foo') do |file|
21
+ File.dirname(file.path)
22
+ end
23
+
24
+ expect(filename).to eq(temp_rune_utf8)
25
+ end
26
+ end
27
+ end
28
+
29
+ end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+ require 'puppet/module_tool'
3
+ require 'puppet_spec/files'
4
+
5
+ describe Puppet::ModuleTool::Tar::Mini, :if => (Puppet.features.minitar? && Puppet.features.zlib?) do
6
+ let(:minitar) { described_class.new }
7
+
8
+ describe "Extracts tars with long and short pathnames" do
9
+ let (:sourcetar) { File.expand_path('../../../../fixtures/module.tar.gz', __FILE__) }
10
+
11
+ let (:longfilepath) { "puppetlabs-dsc-1.0.0/lib/puppet_x/dsc_resources/xWebAdministration/DSCResources/MSFT_xWebAppPoolDefaults/MSFT_xWebAppPoolDefaults.schema.mof" }
12
+ let (:shortfilepath) { "puppetlabs-dsc-1.0.0/README.md" }
13
+
14
+ it "unpacks a tar with a short path length" do
15
+ extractdir = PuppetSpec::Files.tmpdir('minitar')
16
+
17
+ minitar.unpack(sourcetar,extractdir,'module')
18
+ expect(File).to exist(File.expand_path("#{extractdir}/#{shortfilepath}"))
19
+ end
20
+
21
+ it "unpacks a tar with a long path length" do
22
+ extractdir = PuppetSpec::Files.tmpdir('minitar')
23
+
24
+ minitar.unpack(sourcetar,extractdir,'module')
25
+ expect(File).to exist(File.expand_path("#{extractdir}/#{longfilepath}"))
26
+ end
27
+ end
28
+ end
@@ -119,4 +119,17 @@ describe Puppet::Node::Environment do
119
119
  # be raised if 'b' is evaluated before 'a').
120
120
  :strict_variables => true
121
121
  end
122
+
123
+ describe "#extralibs on Windows", :if => Puppet.features.microsoft_windows? do
124
+
125
+ describe "with UTF8 characters in PUPPETLIB" do
126
+ let(:rune_utf8) { "\u16A0\u16C7\u16BB\u16EB\u16D2\u16E6\u16A6\u16EB\u16A0\u16B1\u16A9\u16A0\u16A2\u16B1\u16EB\u16A0\u16C1\u16B1\u16AA\u16EB\u16B7\u16D6\u16BB\u16B9\u16E6\u16DA\u16B3\u16A2\u16D7" }
127
+
128
+ before { Puppet::Util::Windows::Process.set_environment_variable('PUPPETLIB', rune_utf8) }
129
+
130
+ it "should use UTF8 characters in PUPPETLIB environment variable" do
131
+ expect(Puppet::Node::Environment.extralibs()).to eq([rune_utf8])
132
+ end
133
+ end
134
+ end
122
135
  end
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+ require 'puppet/pops'
3
+ require 'puppet/parser/parser_factory'
4
+ require 'puppet_spec/compiler'
5
+ require 'puppet_spec/pops'
6
+ require 'puppet_spec/scope'
7
+ require 'matchers/resource'
8
+ require 'rgen/metamodel_builder'
9
+
10
+ # These tests are in a separate file since othr compiler related tests have
11
+ # been dramatically changed between 3.x and 4.x and it is a pain to merge
12
+ # them.
13
+ #
14
+ describe "Puppet::Parser::Compiler when dealing with relative naming" do
15
+ include PuppetSpec::Compiler
16
+ include Matchers::Resource
17
+
18
+ describe "the compiler when using 4.x parser and evaluator" do
19
+ it "should use absolute references even if references are not anchored" do
20
+ node = Puppet::Node.new("testnodex")
21
+ catalog = compile_to_catalog(<<-PP, node)
22
+ class foo::thing {
23
+ notify {"from foo::thing":}
24
+ }
25
+
26
+ class thing {
27
+ notify {"from ::thing":}
28
+ }
29
+
30
+ class foo {
31
+ # include thing
32
+ class {'thing':}
33
+ }
34
+
35
+ include foo
36
+ PP
37
+
38
+ catalog = Puppet::Parser::Compiler.compile(node)
39
+
40
+ expect(catalog).to have_resource("Notify[from ::thing]")
41
+ end
42
+
43
+ it "should use absolute references when references are absolute" do
44
+ node = Puppet::Node.new("testnodex")
45
+ catalog = compile_to_catalog(<<-PP, node)
46
+ class foo::thing {
47
+ notify {"from foo::thing":}
48
+ }
49
+
50
+ class thing {
51
+ notify {"from ::thing":}
52
+ }
53
+
54
+ class foo {
55
+ # include thing
56
+ class {'::thing':}
57
+ }
58
+
59
+ include foo
60
+ PP
61
+
62
+ catalog = Puppet::Parser::Compiler.compile(node)
63
+
64
+ expect(catalog).to have_resource("Notify[from ::thing]")
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,336 @@
1
+ require 'spec_helper'
2
+ require 'puppet_spec/language'
3
+
4
+ ['Function', 'EPP'].each do |call_type|
5
+ describe "#{call_type} parameter default expressions" do
6
+ let! (:func_bodies) {
7
+ [
8
+ '{}',
9
+ '{ notice("\$a == ${a}") }',
10
+ '{ notice("\$a == ${a}") notice("\$b == ${b}") }',
11
+ '{ notice("\$a == ${a}") notice("\$b == ${b}") notice("\$c == ${c}") }'
12
+ ]
13
+ }
14
+
15
+ let! (:epp_bodies) {
16
+ [
17
+ '',
18
+ '<% notice("\$a == ${a}") %>',
19
+ '<% notice("\$a == ${a}") notice("\$b == ${b}") %>',
20
+ '<% notice("\$a == ${a}") notice("\$b == ${b}") notice("\$c == ${c}") %>'
21
+ ]
22
+ }
23
+ let! (:param_names) { ('a'..'c').to_a }
24
+
25
+ let (:call_type) { call_type }
26
+
27
+ let (:compiler) { Puppet::Parser::Compiler.new(Puppet::Node.new('specification')) }
28
+
29
+ def collect_notices(code)
30
+ logs = []
31
+ Puppet[:code] = code
32
+ Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
33
+ compiler.compile
34
+ yield
35
+ end
36
+ logs.select { |log| log.level == :notice }.map { |log| log.message }
37
+ end
38
+
39
+ # @param arg_list [String] comma separated parameter declarations. Not enclosed in parenthesis
40
+ # @param body [String,Integer] verbatim body or index of an entry in func_bodies
41
+ # @param call_params [Array[#to_s]] array of call parameters
42
+ # @return [Array] array of notice output entries
43
+ #
44
+ def eval_collect_notices(arg_list, body, call_params)
45
+ call = call_params.is_a?(String) ? call_params : "example(#{call_params.join(',')})"
46
+ body = func_bodies[body] if body.is_a?(Integer)
47
+ evaluator = Puppet::Pops::Parser::EvaluatingParser.new()
48
+ collect_notices("function example(#{arg_list}) #{body}") do
49
+ evaluator.evaluate_string(compiler.topscope, call)
50
+ end
51
+ end
52
+
53
+ # @param arg_list [String] comma separated parameter declarations. Not enclosed in parenthesis
54
+ # @param body [String,Integer] verbatim body or index of an entry in bodies
55
+ # @param call_params [Array] array of call parameters
56
+ # @param code [String] code to evaluate
57
+ # @return [Array] array of notice output entries
58
+ #
59
+ def epp_eval_collect_notices(arg_list, body, call_params, code, inline_epp)
60
+ body = body.is_a?(Integer) ? epp_bodies[body] : body.strip
61
+ source = "<%| #{arg_list} |%>#{body}"
62
+ named_params = call_params.reduce({}) {|h, v| h[param_names[h.size]] = v; h }
63
+ collect_notices(code) do
64
+ if inline_epp
65
+ Puppet::Pops::Evaluator::EppEvaluator.inline_epp(compiler.topscope, source, named_params)
66
+ else
67
+ file = Tempfile.new(['epp-script', '.epp'])
68
+ begin
69
+ file.write(source)
70
+ file.close
71
+ Puppet::Pops::Evaluator::EppEvaluator.epp(compiler.topscope, file.path, 'test', named_params)
72
+ ensure
73
+ file.unlink
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+
80
+ # evaluates a function or EPP call, collects notice output in a log and compares log to expected result
81
+ #
82
+ # @param decl [Array[]] two element array with argument list declaration and body. Body can a verbatim string
83
+ # or an integer index of an entry in bodies
84
+ # @param call_params [Array[#to_s]] array of call parameters
85
+ # @param code [String] code to evaluate. Only applicable when call_type == 'EPP'
86
+ # @param inline_epp [Boolean] true for inline_epp, false for file based epp, Only applicable when call_type == 'EPP'
87
+ # @return [Array] array of notice output entries
88
+ #
89
+ def expect_log(decl, call_params, result, code = 'undef', inline_epp = true)
90
+ if call_type == 'Function'
91
+ expect(eval_collect_notices(decl[0], decl[1], call_params)).to include(*result)
92
+ else
93
+ expect(epp_eval_collect_notices(decl[0], decl[1], call_params, code, inline_epp)).to include(*result)
94
+ end
95
+ end
96
+
97
+ # evaluates a function or EPP call and expects a failure
98
+ #
99
+ # @param decl [Array[]] two element array with argument list declaration and body. Body can a verbatim string
100
+ # or an integer index of an entry in bodies
101
+ # @param call_params [Array[#to_s]] array of call parameters
102
+ # @param text [String,Regexp] expected error message
103
+ def expect_fail(decl, call, text, inline_epp = true)
104
+ if call_type == 'Function'
105
+ expect{eval_collect_notices(decl[0], decl[1], call) }.to raise_error(StandardError, text)
106
+ else
107
+ expect{epp_eval_collect_notices(decl[0], decl[1], call, 'undef', inline_epp) }.to raise_error(StandardError, text)
108
+ end
109
+ end
110
+
111
+ context 'that references a parameter to the left that has no default' do
112
+ let!(:params) { [ <<-SOURCE, 2 ]
113
+ $a,
114
+ $b = $a
115
+ SOURCE
116
+ }
117
+
118
+ it 'fails when no value is provided for required first parameter', :if => call_type == 'Function' do
119
+ expect_fail(params, [], /expects between 1 and 2 arguments, got none/)
120
+ end
121
+
122
+ it 'fails when no value is provided for required first parameter', :if => call_type == 'EPP' do
123
+ expect_fail(params, [], /default expression for \$b tries to illegally access not yet evaluated \$a/)
124
+ end
125
+
126
+ it "will use the referenced parameter's given value" do
127
+ expect_log(params, [2], ['$a == 2', '$b == 2'])
128
+ end
129
+
130
+ it 'will not be evaluated when a value is given' do
131
+ expect_log(params, [2, 5], ['$a == 2', '$b == 5'])
132
+ end
133
+ end
134
+
135
+ context 'that references a parameter to the left that has a default' do
136
+ let!(:params) { [ <<-SOURCE, 2 ]
137
+ $a = 10,
138
+ $b = $a
139
+ SOURCE
140
+ }
141
+
142
+ it "will use the referenced parameter's default value when no value is given for the referenced parameter" do
143
+ expect_log(params, [], ['$a == 10', '$b == 10'])
144
+ end
145
+
146
+ it "will use the referenced parameter's given value" do
147
+ expect_log(params, [2], ['$a == 2', '$b == 2'])
148
+ end
149
+
150
+ it 'will not be evaluated when a value is given' do
151
+ expect_log(params, [2, 5], ['$a == 2', '$b == 5'])
152
+ end
153
+ end
154
+
155
+ context 'that references a variable to the right' do
156
+ let!(:params) { [ <<-SOURCE, 3 ]
157
+ $a = 10,
158
+ $b = $c,
159
+ $c = 20
160
+ SOURCE
161
+ }
162
+
163
+ it 'fails when the reference is evaluated' do
164
+ expect_fail(params, [1], /default expression for \$b tries to illegally access not yet evaluated \$c/)
165
+ end
166
+
167
+ it 'does not fail when a value is given for the culprit parameter' do
168
+ expect_log(params, [1,2], ['$a == 1', '$b == 2', '$c == 20'])
169
+ end
170
+
171
+ it 'does not fail when all values are given' do
172
+ expect_log(params, [1,2,3], ['$a == 1', '$b == 2', '$c == 3'])
173
+ end
174
+ end
175
+
176
+ context 'with regular expressions' do
177
+ it "evaluates unset match scope parameter's to undef" do
178
+ expect_log([<<-SOURCE, 2], [], ['$a == ', '$b == '])
179
+ $a = $0,
180
+ $b = $1
181
+ SOURCE
182
+ end
183
+
184
+ it 'does not leak match variables from one expression to the next' do
185
+ expect_log([<<-SOURCE, 2], [], ['$a == [true, h, ello]', '$b == '])
186
+ $a = ['hello' =~ /(h)(.*)/, $1, $2],
187
+ $b = $1
188
+ SOURCE
189
+ end
190
+
191
+ it 'can evaluate expressions in separate match scopes' do
192
+ expect_log([<<-SOURCE, 3], [], ['$a == [true, h, ell, o]', '$b == [true, h, i, ]', '$c == '])
193
+ $a = ['hello' =~ /(h)(.*)(o)/, $1, $2, $3],
194
+ $b = ['hi' =~ /(h)(.*)/, $1, $2, $3],
195
+ $c = $1
196
+ SOURCE
197
+ end
198
+
199
+ it 'can have nested match expressions' do
200
+ expect_log([<<-SOURCE, 2], [], ['$a == [true, h, oo, h, i]', '$b == '] )
201
+ $a = ['hi' =~ /(h)(.*)/, $1, if'foo' =~ /f(oo)/ { $1 }, $1, $2],
202
+ $b = $0
203
+ SOURCE
204
+ end
205
+
206
+ it 'can not see match scope from calling scope', :if => call_type == 'Function' do
207
+ expect_log([<<-SOURCE, <<-BODY], <<-CALL, ['$a == '])
208
+ $a = $0
209
+ SOURCE
210
+ {
211
+ notice("\\$a == ${a}")
212
+ }
213
+ function caller() {
214
+ example()
215
+ }
216
+ BODY
217
+ $tmp = 'foo' =~ /(f)(o)(o)/
218
+ caller()
219
+ CALL
220
+ end
221
+
222
+ context 'matches in calling scope', :if => call_type == 'EPP' do
223
+ it 'are available when using inlined epp' do
224
+ # Note that CODE is evaluated before the EPP is evaluated
225
+ #
226
+ expect_log([<<-SOURCE, <<-BODY], [], ['$ax == true', '$bx == foo'], <<-CODE, true)
227
+ $a = $tmp,
228
+ $b = $0
229
+ SOURCE
230
+ <% called_from_template($a, $b) %>
231
+ BODY
232
+ function called_from_template($ax, $bx) {
233
+ notice("\\$ax == $ax")
234
+ notice("\\$bx == $bx")
235
+ }
236
+ $tmp = 'foo' =~ /(f)(o)(o)/
237
+ CODE
238
+ end
239
+
240
+ it 'are not available when using epp file' do
241
+ # Note that CODE is evaluated before the EPP is evaluated
242
+ #
243
+ expect_log([<<-SOURCE, <<-BODY], [], ['$ax == true', '$bx == '], <<-CODE, false)
244
+ $a = $tmp,
245
+ $b = $0
246
+ SOURCE
247
+ <% called_from_template($a, $b) %>
248
+ BODY
249
+ function called_from_template($ax, $bx) {
250
+ notice("\\$ax == $ax")
251
+ notice("\\$bx == $bx")
252
+ }
253
+ $tmp = 'foo' =~ /(f)(o)(o)/
254
+ CODE
255
+ end
256
+ end
257
+
258
+
259
+ it 'will allow nested lambdas to access enclosing match scope' do
260
+ expect_log([<<-SOURCE, 1], [], ['$a == [1-ello, 2-ello, 3-ello]'])
261
+ $a = case "hello" {
262
+ /(h)(.*)/ : {
263
+ [1,2,3].map |$x| { "$x-$2" }
264
+ }
265
+ }
266
+ SOURCE
267
+ end
268
+
269
+ it "will not make match scope available to #{call_type} body" do
270
+ expect_log([<<-SOURCE, call_type == 'Function' ? <<-BODY : <<-EPP_BODY], [], ['Yes'])
271
+ $a = "hello" =~ /.*/
272
+ SOURCE
273
+ {
274
+ notice("Y${0}es")
275
+ }
276
+ BODY
277
+ <%
278
+ notice("Y${0}es")
279
+ %>
280
+ EPP_BODY
281
+ end
282
+
283
+ it 'can access earlier match results when produced using the match function' do
284
+ expect_log([<<-SOURCE, 3], [], ['$a == [hello, h, ello]', '$b == hello', '$c == h'])
285
+ $a = 'hello'.match(/(h)(.*)/),
286
+ $b = $a[0],
287
+ $c = $a[1]
288
+ SOURCE
289
+ end
290
+ end
291
+
292
+
293
+ context 'will not permit assignments' do
294
+ it 'at top level' do
295
+ expect_fail([<<-SOURCE, 0], [], /Syntax error at '='/)
296
+ $a = $x = $0
297
+ SOURCE
298
+ end
299
+
300
+ it 'in arrays' do
301
+ expect_fail([<<-SOURCE, 0], [], /Assignment not allowed here/)
302
+ $a = [$x = 3]
303
+ SOURCE
304
+ end
305
+
306
+ it 'of variable with the same name as a subsequently declared parameter' do
307
+ expect_fail([<<-SOURCE, 0], [], /Assignment not allowed here/)
308
+ $a = ($b = 3),
309
+ $b = 5
310
+ SOURCE
311
+ end
312
+
313
+ it 'of variable with the same name as a previously declared parameter' do
314
+ expect_fail([<<-SOURCE, 0], [], /Assignment not allowed here/)
315
+ $a = 10,
316
+ $b = ($a = 10)
317
+ SOURCE
318
+ end
319
+ end
320
+
321
+ it 'will permit assignments in nested scope' do
322
+ expect_log([<<-SOURCE, 3], [], ['$a == [1, 2, 3]', '$b == 0', '$c == [6, 12, 18]'])
323
+ $a = [1,2,3],
324
+ $b = 0,
325
+ $c = $a.map |$x| { $b = $x; $b * $a.reduce |$x, $y| {$x + $y} }
326
+ SOURCE
327
+ end
328
+
329
+ it 'will not permit duplicate parameter names' do
330
+ expect_fail([<<-SOURCE, 0], [], /The parameter 'a' is declared more than once/ )
331
+ $a = 2,
332
+ $a = 5
333
+ SOURCE
334
+ end
335
+ end
336
+ end