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
@@ -1,3 +1,5 @@
1
+ module Puppet::Pops
2
+ module Evaluator
1
3
  # A Closure represents logic bound to a particular scope.
2
4
  # As long as the runtime (basically the scope implementation) has the behavior of Puppet 3x it is not
3
5
  # safe to return and later use this closure.
@@ -11,7 +13,7 @@
11
13
  # Note that this class is a CallableSignature, and the methods defined there should be used
12
14
  # as the API for obtaining information in a callable-implementation agnostic way.
13
15
  #
14
- class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignature
16
+ class Closure < CallableSignature
15
17
  attr_reader :evaluator
16
18
  attr_reader :model
17
19
  attr_reader :enclosing_scope
@@ -25,22 +27,7 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
25
27
  # Evaluates a closure in its enclosing scope after having matched given arguments with parameters (from left to right)
26
28
  # @api public
27
29
  def call(*args)
28
- variable_bindings = combine_values_with_parameters(args)
29
-
30
- tc = Puppet::Pops::Types::TypeCalculator.singleton
31
- final_args = tc.infer_set(parameters.reduce([]) do |tmp_args, param|
32
- if param.captures_rest
33
- tmp_args.concat(variable_bindings[param.name])
34
- else
35
- tmp_args << variable_bindings[param.name]
36
- end
37
- end)
38
-
39
- if type.callable?(final_args)
40
- @evaluator.evaluate_block_with_bindings(@enclosing_scope, variable_bindings, @model.body)
41
- else
42
- raise ArgumentError, Puppet::Pops::Types::TypeMismatchDescriber.describe_signatures(closure_name, [self], final_args)
43
- end
30
+ call_with_scope(@enclosing_scope, args)
44
31
  end
45
32
 
46
33
  # This method makes a Closure compatible with a Dispatch. This is used when the closure is wrapped in a Function
@@ -48,46 +35,32 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
48
35
  # checks of the argument type/arity validity).
49
36
  # @api private
50
37
  def invoke(instance, calling_scope, args, &block)
51
- call(*args, &block)
38
+ @enclosing_scope.with_global_scope do |global_scope|
39
+ call_with_scope(global_scope, args, &block)
40
+ end
52
41
  end
53
42
 
54
43
  # Call closure with argument assignment by name
55
44
  def call_by_name(args_hash, enforce_parameters)
56
45
  if enforce_parameters
57
- if args_hash.size > parameters.size
58
- raise ArgumentError, "Too many arguments: #{args_hash.size} for #{parameters.size}"
59
- end
60
-
61
- # associate values with parameters
62
- scope_hash = {}
63
- parameters.each do |p|
64
- name = p.name
65
- if (arg_value = args_hash[name]).nil?
46
+ # Push a temporary parameter scope used while resolving the parameter defaults
47
+ @enclosing_scope.with_parameter_scope(parameter_names) do |param_scope|
48
+ args_hash.each { |k, v| param_scope[k] = v unless v.nil? && parameter_names.include?(k) }
49
+ parameters.each do |p|
50
+ name = p.name
66
51
  # only set result of default expr if it is defined (it is otherwise not possible to differentiate
67
52
  # between explicit undef and no default expression
68
- unless p.value.nil?
69
- scope_hash[name] = @evaluator.evaluate(p.value, @enclosing_scope)
53
+ arg = args_hash[name]
54
+ if arg.nil? && !p.value.nil?
55
+ param_scope[name] = param_scope.evaluate(name, p.value, @enclosing_scope, @evaluator)
70
56
  end
71
- else
72
- scope_hash[name] = arg_value
73
57
  end
58
+ args_hash = param_scope.to_hash
74
59
  end
75
-
76
- missing = parameters.select { |p| !scope_hash.include?(p.name) }
77
- if missing.any?
78
- raise ArgumentError, "Too few arguments; no value given for required parameters #{missing.collect(&:name).join(" ,")}"
79
- end
80
-
81
- tc = Puppet::Pops::Types::TypeCalculator.singleton
82
- final_args = tc.infer_set(parameter_names.collect { |param| scope_hash[param] })
83
- if !type.callable?(final_args)
84
- raise ArgumentError, Puppet::Pops::Types::TypeMismatchDescriber.describe_signatures(closure_name, [self], final_args)
85
- end
86
- else
87
- scope_hash = args_hash
60
+ Types::TypeMismatchDescriber.validate_parameters(closure_name, params_struct, args_hash)
88
61
  end
89
62
 
90
- @evaluator.evaluate_block_with_bindings(@enclosing_scope, scope_hash, @model.body)
63
+ @evaluator.evaluate_block_with_bindings(@enclosing_scope, args_hash, @model.body)
91
64
  end
92
65
 
93
66
  def parameters
@@ -111,6 +84,11 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
111
84
  @callable ||= create_callable_type
112
85
  end
113
86
 
87
+ # @api public
88
+ def params_struct
89
+ @params_struct ||= create_params_struct
90
+ end
91
+
114
92
  # @api public
115
93
  def last_captures_rest?
116
94
  last = @model.parameters[-1]
@@ -130,7 +108,7 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
130
108
  CLOSURE_NAME
131
109
  end
132
110
 
133
- class Named < Puppet::Pops::Evaluator::Closure
111
+ class Named < Closure
134
112
  def initialize(name, evaluator, model, scope)
135
113
  @name = name
136
114
  super(evaluator, model, scope)
@@ -143,52 +121,70 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
143
121
 
144
122
  private
145
123
 
146
- def combine_values_with_parameters(args)
147
- variable_bindings = {}
124
+ def call_with_scope(scope, args)
125
+ variable_bindings = combine_values_with_parameters(scope, args)
126
+
127
+ tc = Types::TypeCalculator.singleton
128
+ final_args = tc.infer_set(parameters.reduce([]) do |tmp_args, param|
129
+ if param.captures_rest
130
+ tmp_args.concat(variable_bindings[param.name])
131
+ else
132
+ tmp_args << variable_bindings[param.name]
133
+ end
134
+ end)
148
135
 
149
- parameters.each_with_index do |parameter, index|
150
- param_captures = parameter.captures_rest
151
- default_expression = parameter.value
136
+ if type.callable?(final_args)
137
+ @evaluator.evaluate_block_with_bindings(scope, variable_bindings, @model.body)
138
+ else
139
+ raise ArgumentError, Types::TypeMismatchDescriber.describe_signatures(closure_name, [self], final_args)
140
+ end
141
+ end
152
142
 
153
- if index >= args.size
154
- if default_expression
155
- # not given, has default
156
- value = @evaluator.evaluate(default_expression, @enclosing_scope)
157
- if param_captures && !value.is_a?(Array)
158
- # correct non array default value
159
- value = [value]
143
+ def combine_values_with_parameters(scope, args)
144
+ scope.with_parameter_scope(parameter_names) do |param_scope|
145
+ parameters.each_with_index do |parameter, index|
146
+ param_captures = parameter.captures_rest
147
+ default_expression = parameter.value
148
+
149
+ if index >= args.size
150
+ if default_expression
151
+ # not given, has default
152
+ value = param_scope.evaluate(parameter.name, default_expression, scope, @evaluator)
153
+
154
+ if param_captures && !value.is_a?(Array)
155
+ # correct non array default value
156
+ value = [value]
157
+ end
158
+ else
159
+ # not given, does not have default
160
+ if param_captures
161
+ # default for captures rest is an empty array
162
+ value = []
163
+ else
164
+ @evaluator.fail(Issues::MISSING_REQUIRED_PARAMETER, parameter, { :param_name => parameter.name })
165
+ end
160
166
  end
161
167
  else
162
- # not given, does not have default
168
+ given_argument = args[index]
163
169
  if param_captures
164
- # default for captures rest is an empty array
165
- value = []
170
+ # get excess arguments
171
+ value = args[(parameter_count-1)..-1]
172
+ # If the input was a single nil, or undef, and there is a default, use the default
173
+ # This supports :undef in case it was used in a 3x data structure and it is passed as an arg
174
+ #
175
+ if value.size == 1 && (given_argument.nil? || given_argument == :undef) && default_expression
176
+ value = param_scope.evaluate(parameter.name, default_expression, scope, @evaluator)
177
+ # and ensure it is an array
178
+ value = [value] unless value.is_a?(Array)
179
+ end
166
180
  else
167
- @evaluator.fail(Puppet::Pops::Issues::MISSING_REQUIRED_PARAMETER, parameter, { :param_name => parameter.name })
181
+ value = given_argument
168
182
  end
169
183
  end
170
- else
171
- given_argument = args[index]
172
- if param_captures
173
- # get excess arguments
174
- value = args[(parameter_count-1)..-1]
175
- # If the input was a single nil, or undef, and there is a default, use the default
176
- # This supports :undef in case it was used in a 3x data structure and it is passed as an arg
177
- #
178
- if value.size == 1 && (given_argument.nil? || given_argument == :undef) && default_expression
179
- value = @evaluator.evaluate(default_expression, @enclosing_scope)
180
- # and ensure it is an array
181
- value = [value] unless value.is_a?(Array)
182
- end
183
- else
184
- value = given_argument
185
- end
184
+ param_scope[parameter.name] = value
186
185
  end
187
-
188
- variable_bindings[parameter.name] = value
186
+ param_scope.to_hash
189
187
  end
190
-
191
- variable_bindings
192
188
  end
193
189
 
194
190
  def create_callable_type()
@@ -196,35 +192,14 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
196
192
  range = [0, 0]
197
193
  in_optional_parameters = false
198
194
  parameters.each do |param|
199
- type = if param.type_expr
200
- @evaluator.evaluate(param.type_expr, @enclosing_scope)
201
- else
202
- Puppet::Pops::Types::PAnyType::DEFAULT
203
- end
204
-
205
- if param.captures_rest && type.is_a?(Puppet::Pops::Types::PArrayType)
206
- # An array on a slurp parameter is how a size range is defined for a
207
- # slurp (Array[Integer, 1, 3] *$param). However, the callable that is
208
- # created can't have the array in that position or else type checking
209
- # will require the parameters to be arrays, which isn't what is
210
- # intended. The array type contains the intended information and needs
211
- # to be unpacked.
212
- param_range = type.size_range
213
- type = type.element_type
214
- elsif param.captures_rest && !type.is_a?(Puppet::Pops::Types::PArrayType)
215
- param_range = ANY_NUMBER_RANGE
216
- elsif param.value
217
- param_range = OPTIONAL_SINGLE_RANGE
218
- else
219
- param_range = REQUIRED_SINGLE_RANGE
220
- end
195
+ type, param_range = create_param_type(param)
221
196
 
222
197
  types << type
223
198
 
224
199
  if param_range[0] == 0
225
200
  in_optional_parameters = true
226
201
  elsif param_range[0] != 0 && in_optional_parameters
227
- @evaluator.fail(Puppet::Pops::Issues::REQUIRED_PARAMETER_AFTER_OPTIONAL, param, { :param_name => param.name })
202
+ @evaluator.fail(Issues::REQUIRED_PARAMETER_AFTER_OPTIONAL, param, { :param_name => param.name })
228
203
  end
229
204
 
230
205
  range[0] += param_range[0]
@@ -235,7 +210,46 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
235
210
  range[1] = :default
236
211
  end
237
212
 
238
- Puppet::Pops::Types::TypeFactory.callable(*(types + range))
213
+ Types::TypeFactory.callable(*(types + range))
214
+ end
215
+
216
+ def create_params_struct
217
+ type_factory = Types::TypeFactory
218
+ members = {}
219
+
220
+ parameters.each do |param|
221
+ arg_type, param_range = create_param_type(param)
222
+ key_type = type_factory.string(nil, param.name.to_s)
223
+ key_type = type_factory.optional(key_type) unless param.value.nil?
224
+ members[key_type] = arg_type
225
+ end
226
+ type_factory.struct(members)
227
+ end
228
+
229
+ def create_param_type(param)
230
+ type = if param.type_expr
231
+ @evaluator.evaluate(param.type_expr, @enclosing_scope)
232
+ else
233
+ Types::PAnyType::DEFAULT
234
+ end
235
+
236
+ if param.captures_rest && type.is_a?(Types::PArrayType)
237
+ # An array on a slurp parameter is how a size range is defined for a
238
+ # slurp (Array[Integer, 1, 3] *$param). However, the callable that is
239
+ # created can't have the array in that position or else type checking
240
+ # will require the parameters to be arrays, which isn't what is
241
+ # intended. The array type contains the intended information and needs
242
+ # to be unpacked.
243
+ param_range = type.size_range
244
+ type = type.element_type
245
+ elsif param.captures_rest && !type.is_a?(Types::PArrayType)
246
+ param_range = ANY_NUMBER_RANGE
247
+ elsif param.value
248
+ param_range = OPTIONAL_SINGLE_RANGE
249
+ else
250
+ param_range = REQUIRED_SINGLE_RANGE
251
+ end
252
+ [type, param_range]
239
253
  end
240
254
 
241
255
  # Produces information about parameters compatible with a 4x Function (which can have multiple signatures)
@@ -247,3 +261,5 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
247
261
  OPTIONAL_SINGLE_RANGE = [0, 1]
248
262
  REQUIRED_SINGLE_RANGE = [1, 1]
249
263
  end
264
+ end
265
+ end
@@ -1,16 +1,18 @@
1
- class Puppet::Pops::Evaluator::CollectorTransformer
1
+ module Puppet::Pops
2
+ module Evaluator
3
+ class CollectorTransformer
2
4
 
3
5
  def initialize
4
- @@query_visitor ||= Puppet::Pops::Visitor.new(nil, "query", 1, 1)
5
- @@match_visitor ||= Puppet::Pops::Visitor.new(nil, "match", 1, 1)
6
- @@evaluator ||= Puppet::Pops::Evaluator::EvaluatorImpl.new
7
- @@compare_operator ||= Puppet::Pops::Evaluator::CompareOperator.new()
6
+ @@query_visitor ||= Visitor.new(nil, "query", 1, 1)
7
+ @@match_visitor ||= Visitor.new(nil, "match", 1, 1)
8
+ @@evaluator ||= EvaluatorImpl.new
9
+ @@compare_operator ||= CompareOperator.new()
8
10
  end
9
11
 
10
12
  def transform(o, scope)
11
- raise ArgumentError, "Expected CollectExpression" unless o.is_a? Puppet::Pops::Model::CollectExpression
13
+ raise ArgumentError, "Expected CollectExpression" unless o.is_a? Model::CollectExpression
12
14
 
13
- raise "LHS is not a type" unless o.type_expr.is_a? Puppet::Pops::Model::QualifiedReference
15
+ raise "LHS is not a type" unless o.type_expr.is_a? Model::QualifiedReference
14
16
  type = o.type_expr.value().downcase()
15
17
 
16
18
  if type == 'class'
@@ -20,7 +22,7 @@ class Puppet::Pops::Evaluator::CollectorTransformer
20
22
  resource_type = scope.find_resource_type(type)
21
23
  fail "Resource type #{type} doesn't exist" unless resource_type
22
24
 
23
- adapter = Puppet::Pops::Adapters::SourcePosAdapter.adapt(o)
25
+ adapter = Adapters::SourcePosAdapter.adapt(o)
24
26
  line_num = adapter.line
25
27
  position = adapter.pos
26
28
  file_path = adapter.locator.file
@@ -38,11 +40,11 @@ class Puppet::Pops::Evaluator::CollectorTransformer
38
40
  code = query_unless_nop(o.query, scope)
39
41
 
40
42
  case o.query
41
- when Puppet::Pops::Model::VirtualQuery
42
- newcoll = Puppet::Pops::Evaluator::Collectors::CatalogCollector.new(scope, resource_type.name, code, overrides)
43
- when Puppet::Pops::Model::ExportedQuery
43
+ when Model::VirtualQuery
44
+ newcoll = Collectors::CatalogCollector.new(scope, resource_type.name, code, overrides)
45
+ when Model::ExportedQuery
44
46
  match = match_unless_nop(o.query, scope)
45
- newcoll = Puppet::Pops::Evaluator::Collectors::ExportedCollector.new(scope, resource_type.name, match, code, overrides)
47
+ newcoll = Collectors::ExportedCollector.new(scope, resource_type.name, match, code, overrides)
46
48
  end
47
49
 
48
50
  scope.compiler.add_collection(newcoll)
@@ -61,13 +63,13 @@ protected
61
63
  end
62
64
 
63
65
  def query_unless_nop(query, scope)
64
- unless query.expr.nil? || query.expr.is_a?(Puppet::Pops::Model::Nop)
66
+ unless query.expr.nil? || query.expr.is_a?(Model::Nop)
65
67
  query(query.expr, scope)
66
68
  end
67
69
  end
68
70
 
69
71
  def match_unless_nop(query, scope)
70
- unless query.expr.nil? || query.expr.is_a?(Puppet::Pops::Model::Nop)
72
+ unless query.expr.nil? || query.expr.is_a?(Model::Nop)
71
73
  match(query.expr, scope)
72
74
  end
73
75
  end
@@ -125,6 +127,14 @@ protected
125
127
  end
126
128
  end
127
129
 
130
+ def query_AccessExpression(o, scope)
131
+ pops_object = @@evaluator.evaluate(o, scope)
132
+
133
+ # Convert to Puppet 3 style objects since that is how they are represented
134
+ # in the catalog.
135
+ @@evaluator.convert(pops_object, scope, nil)
136
+ end
137
+
128
138
  def query_VariableExpression(o, scope)
129
139
  @@evaluator.evaluate(o, scope)
130
140
  end
@@ -157,6 +167,14 @@ protected
157
167
  raise ArgumentError, "Cannot transform object of class #{o.class}"
158
168
  end
159
169
 
170
+ def match_AccessExpression(o, scope)
171
+ pops_object = @@evaluator.evaluate(o, scope)
172
+
173
+ # Convert to Puppet 3 style objects since that is how they are represented
174
+ # in the catalog.
175
+ @@evaluator.convert(pops_object, scope, nil)
176
+ end
177
+
160
178
  def match_AndExpression(o, scope)
161
179
  left_match = match(o.left_expr, scope)
162
180
  right_match = match(o.right_expr, scope)
@@ -207,3 +225,5 @@ protected
207
225
  raise ArgumentError, "Cannot transform object of class #{o.class}"
208
226
  end
209
227
  end
228
+ end
229
+ end
@@ -19,7 +19,6 @@ class Puppet::Pops::Evaluator::Collectors::ExportedCollector < Puppet::Pops::Eva
19
19
  # evaluate method
20
20
  def evaluate
21
21
  if Puppet[:storeconfigs] != true
22
- Puppet.warning "Not collecting exported resources without storeconfigs"
23
22
  return false
24
23
  end
25
24
 
@@ -1,3 +1,5 @@
1
+ module Puppet::Pops
2
+ module Evaluator
1
3
  # Compares the puppet DSL way
2
4
  #
3
5
  # ==Equality
@@ -6,20 +8,20 @@
6
8
  # Hashes are equal to hashes if they have the same size and keys and values #equals.
7
9
  # All other objects are equal if they are ruby #== equal
8
10
  #
9
- class Puppet::Pops::Evaluator::CompareOperator
10
- include Puppet::Pops::Utils
11
+ class CompareOperator
12
+ include Utils
11
13
 
12
14
  # Provides access to the Puppet 3.x runtime (scope, etc.)
13
15
  # This separation has been made to make it easier to later migrate the evaluator to an improved runtime.
14
16
  #
15
- include Puppet::Pops::Evaluator::Runtime3Support
17
+ include Runtime3Support
16
18
 
17
19
  def initialize
18
- @@equals_visitor ||= Puppet::Pops::Visitor.new(self, "equals", 1, 1)
19
- @@compare_visitor ||= Puppet::Pops::Visitor.new(self, "cmp", 1, 1)
20
- @@match_visitor ||= Puppet::Pops::Visitor.new(self, "match", 2, 2)
21
- @@include_visitor ||= Puppet::Pops::Visitor.new(self, "include", 2, 2)
22
- @type_calculator = Puppet::Pops::Types::TypeCalculator.new()
20
+ @@equals_visitor ||= Visitor.new(self, "equals", 1, 1)
21
+ @@compare_visitor ||= Visitor.new(self, "cmp", 1, 1)
22
+ @@match_visitor ||= Visitor.new(self, "match", 2, 2)
23
+ @@include_visitor ||= Visitor.new(self, "include", 2, 2)
24
+ @type_calculator = Types::TypeCalculator.new()
23
25
  end
24
26
 
25
27
  def equals (a, b)
@@ -143,7 +145,7 @@ class Puppet::Pops::Evaluator::CompareOperator
143
145
  # Always set match data, a "not found" should not keep old match data visible
144
146
  set_match_data(matched, scope) # creates ephemeral
145
147
  return !!matched
146
- when Puppet::Pops::Types::PAnyType
148
+ when Types::PAnyType
147
149
  a.each {|element| return true if @type_calculator.instance?(b, element) }
148
150
  return false
149
151
  else
@@ -193,3 +195,5 @@ class Puppet::Pops::Evaluator::CompareOperator
193
195
  equals(left, default, scope)
194
196
  end
195
197
  end
198
+ end
199
+ end
@@ -66,18 +66,19 @@ class Puppet::Pops::Evaluator::EppEvaluator
66
66
 
67
67
  parameters_specified = body.body.parameters_specified
68
68
  if parameters_specified || template_args_set
69
- # no epp params or user provided arguments in a hash, epp() logic
70
- # only sees global + what was given
71
- closure_scope = scope.find_global_scope
72
69
  enforce_parameters = parameters_specified
73
70
  else
74
- # no epp params and no arguments were given => inline_epp() logic
75
- # sees all local variables, epp() all global
76
- closure_scope = use_global_scope_only ? scope.find_global_scope : scope
77
71
  enforce_parameters = true
78
72
  end
79
- evaluated_result = parser.closure(body, closure_scope).call_by_name(template_args, enforce_parameters)
80
- evaluated_result
73
+
74
+ # inline_epp() logic sees all local variables, epp() all global
75
+ if use_global_scope_only
76
+ scope.with_global_scope do |global_scope|
77
+ parser.closure(body, global_scope).call_by_name(template_args, enforce_parameters)
78
+ end
79
+ else
80
+ parser.closure(body, scope).call_by_name(template_args, enforce_parameters)
81
+ end
81
82
  end
82
83
 
83
84
  def self.handle_template_args(func_name, template_args)