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,19 +1,21 @@
1
+ module Puppet::Pops
2
+ module Loader
1
3
  # The PuppetFunctionInstantiator instantiates a Puppet::Functions::PuppetFunction given a Puppet Programming language
2
4
  # source that when called evaluates the Puppet logic it contains.
3
5
  #
4
- class Puppet::Pops::Loader::PuppetFunctionInstantiator
6
+ class PuppetFunctionInstantiator
5
7
  # Produces an instance of the Function class with the given typed_name, or fails with an error if the
6
8
  # given puppet source does not produce this instance when evaluated.
7
9
  #
8
- # @param loader [Puppet::Pops::Loader::Loader] The loader the function is associated with
9
- # @param typed_name [Puppet::Pops::Loader::TypedName] the type / name of the function to load
10
+ # @param loader [Loader] The loader the function is associated with
11
+ # @param typed_name [TypedName] the type / name of the function to load
10
12
  # @param source_ref [URI, String] a reference to the source / origin of the puppet code to evaluate
11
13
  # @param pp_code_string [String] puppet code in a string
12
14
  #
13
- # @return [Puppet::Pops::Functions::Function] - an instantiated function with global scope closure associated with the given loader
15
+ # @return [Functions::Function] - an instantiated function with global scope closure associated with the given loader
14
16
  #
15
17
  def self.create(loader, typed_name, source_ref, pp_code_string)
16
- parser = Puppet::Pops::Parser::EvaluatingParser.new()
18
+ parser = Parser::EvaluatingParser.new()
17
19
 
18
20
  # parse and validate
19
21
  result = parser.parse_string(pp_code_string, source_ref)
@@ -28,7 +30,7 @@ class Puppet::Pops::Loader::PuppetFunctionInstantiator
28
30
  end
29
31
  the_function_definition = result.model.definitions[0]
30
32
 
31
- unless the_function_definition.is_a?(Puppet::Pops::Model::FunctionDefinition)
33
+ unless the_function_definition.is_a?(Model::FunctionDefinition)
32
34
  raise ArgumentError, "The code loaded from #{source_ref} does not define the function '#{typed_name.name}' - no function found."
33
35
  end
34
36
  unless the_function_definition.name == typed_name.name
@@ -43,7 +45,8 @@ class Puppet::Pops::Loader::PuppetFunctionInstantiator
43
45
  # Adapt the function definition with loader - this is used from logic contained in it body to find the
44
46
  # loader to use when making calls to the new function API. Such logic have a hard time finding the closure (where
45
47
  # the loader is known - hence this mechanism
46
- Puppet::Pops::Adapters::LoaderAdapter.adapt(the_function_definition).loader = loader
48
+ private_loader = loader.private_loader
49
+ Adapters::LoaderAdapter.adapt(the_function_definition).loader = private_loader
47
50
 
48
51
  # TODO: Cheating wrt. scope - assuming it is found in the context
49
52
  closure_scope = Puppet.lookup(:global_scope) { {} }
@@ -53,26 +56,28 @@ class Puppet::Pops::Loader::PuppetFunctionInstantiator
53
56
  # when calling functions etc.
54
57
  # It should be bound to global scope
55
58
 
56
- created.new(closure_scope, loader)
59
+ created.new(closure_scope, private_loader)
57
60
  end
58
61
 
59
62
  # Creates Function class and instantiates it based on a FunctionDefinition model
60
- # @return [Array<Puppet::Pops::Loader::Loader::TypedName, Puppet::Pops::Functions.Function>] - array of
63
+ # @return [Array<Loader::TypedName, Functions.Function>] - array of
61
64
  # typed name, and an instantiated function with global scope closure associated with the given loader
62
65
  #
63
66
  def self.create_from_model(function_definition, loader)
64
67
  closure_scope = Puppet.lookup(:global_scope) { {} }
65
68
  created = create_function_class(function_definition, closure_scope)
66
- typed_name = Puppet::Pops::Loader::Loader::TypedName.new(:function, function_definition.name)
69
+ typed_name = Loader::TypedName.new(:function, function_definition.name)
67
70
  [typed_name, created.new(closure_scope, loader)]
68
71
  end
69
72
 
70
73
  def self.create_function_class(function_definition, closure_scope)
71
74
  # Create a 4x function wrapper around a named closure
72
75
  Puppet::Functions.create_function(function_definition.name, Puppet::Functions::PuppetFunction) do
73
- init_dispatch(Puppet::Pops::Evaluator::Closure::Named.new(
76
+ init_dispatch(Evaluator::Closure::Named.new(
74
77
  function_definition.name,
75
- Puppet::Pops::Evaluator::EvaluatorImpl.new(), function_definition, closure_scope))
78
+ Evaluator::EvaluatorImpl.new(), function_definition, closure_scope))
76
79
  end
77
80
  end
78
- end
81
+ end
82
+ end
83
+ end
@@ -16,7 +16,10 @@ class Puppet::Pops::Loader::RubyFunctionInstantiator
16
16
  unless ruby_code_string.is_a?(String) && ruby_code_string =~ /Puppet\:\:Functions\.create_function/
17
17
  raise ArgumentError, "The code loaded from #{source_ref} does not seem to be a Puppet 4x API function - no create_function call."
18
18
  end
19
- created = eval(ruby_code_string, nil, source_ref, 1)
19
+ # make the private loader available in a binding to allow it to be passed on
20
+ loader_for_function = loader.private_loader
21
+ here = get_binding(loader_for_function)
22
+ created = eval(ruby_code_string, here, source_ref, 1)
20
23
  unless created.is_a?(Class)
21
24
  raise ArgumentError, "The code loaded from #{source_ref} did not produce a Function class when evaluated. Got '#{created.class}'"
22
25
  end
@@ -27,8 +30,18 @@ class Puppet::Pops::Loader::RubyFunctionInstantiator
27
30
  # when calling functions etc.
28
31
  # It should be bound to global scope
29
32
 
30
- # TODO: Cheating wrt. scope - assuming it is found in the context
33
+ # Cheating wrt. scope - assuming it is found in the context (else an empty hash is used).
31
34
  closure_scope = Puppet.lookup(:global_scope) { {} }
32
- created.new(closure_scope, loader.private_loader)
35
+ # If function definition used the loader from the binding to create a new loader, that loader wins
36
+ created.new(closure_scope, loader_for_function)
37
+ end
38
+
39
+ private
40
+
41
+ # Produces a binding where the given loader is bound as a local variable (loader_injected_arg). This variable can be used in loaded
42
+ # ruby code - e.g. to call Puppet::Function.create_loaded_function(:name, loader,...)
43
+ #
44
+ def self.get_binding(loader_injected_arg)
45
+ binding
33
46
  end
34
47
  end
@@ -0,0 +1,55 @@
1
+ # The TypeDefinitionInstantiator instantiates a type alias or a type definition
2
+ #
3
+ module Puppet::Pops
4
+ module Loader
5
+ class TypeDefinitionInstantiator
6
+ def self.create(loader, typed_name, source_ref, pp_code_string)
7
+ # parse and validate
8
+ parser = Parser::EvaluatingParser.new()
9
+ model = parser.parse_string(pp_code_string, source_ref).model
10
+ # Only one type is allowed (and no other definitions)
11
+
12
+ name = typed_name.name
13
+ case model.definitions.size
14
+ when 0
15
+ raise ArgumentError, "The code loaded from #{source_ref} does not define the type '#{name}' - it is empty."
16
+ when 1
17
+ # ok
18
+ else
19
+ raise ArgumentError,
20
+ "The code loaded from #{source_ref} must contain only the type '#{name}' - it has additional definitions."
21
+ end
22
+ type_definition = model.definitions[0]
23
+
24
+ unless type_definition.is_a?(Model::TypeAlias) || type_definition.is_a?(Model::TypeDefinition)
25
+ raise ArgumentError,
26
+ "The code loaded from #{source_ref} does not define the type '#{name}' - no type alias or type definition found."
27
+ end
28
+
29
+ actual_name = type_definition.name
30
+ unless name == actual_name.downcase
31
+ raise ArgumentError,
32
+ "The code loaded from #{source_ref} produced type with the wrong name, expected '#{name}', actual '#{actual_name}'"
33
+ end
34
+
35
+ unless model.body == type_definition
36
+ raise ArgumentError,
37
+ "The code loaded from #{source_ref} contains additional logic - can only contain the type '#{name}'"
38
+ end
39
+
40
+ # Adapt the type definition with loader - this is used from logic contained in its body to find the
41
+ # loader to use when resolving contained aliases API. Such logic have a hard time finding the closure (where
42
+ # the loader is known - hence this mechanism
43
+ private_loader = loader.private_loader
44
+ Adapters::LoaderAdapter.adapt(type_definition).loader = private_loader
45
+
46
+ Types::PTypeAliasType.new(name, type_definition.type_expr)
47
+ end
48
+
49
+ def self.create_from_model(type_definition, loader)
50
+ name = type_definition.name
51
+ [Loader::TypedName.new(:type, name.downcase), Types::PTypeAliasType.new(name, type_definition.type_expr)]
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,4 +1,5 @@
1
- class Puppet::Pops::Loaders
1
+ module Puppet::Pops
2
+ class Loaders
2
3
  class LoaderError < Puppet::Error; end
3
4
 
4
5
  attr_reader :static_loader
@@ -8,7 +9,7 @@ class Puppet::Pops::Loaders
8
9
 
9
10
  def initialize(environment)
10
11
  # The static loader can only be changed after a reboot
11
- @@static_loader ||= Puppet::Pops::Loader::StaticLoader.new()
12
+ @@static_loader ||= Loader::StaticLoader.new()
12
13
 
13
14
  # Create the set of loaders
14
15
  # 1. Puppet, loads from the "running" puppet - i.e. bundled functions, types, extension points and extensions
@@ -35,6 +36,46 @@ class Puppet::Pops::Loaders
35
36
  @puppet_system_loader = nil
36
37
  end
37
38
 
39
+ # Finds the `Loaders` instance by looking up the :loaders in the global Puppet context and then uses it to
40
+ # find the appropriate loader for the given `module_name`, or for the environment in case `module_name`
41
+ # is `nil` or empty.
42
+ #
43
+ # @param module_name [String,nil] the name of the module
44
+ # @return [Loader::Loader] the found loader
45
+ # @raise [Puppet::ParseError] if no loader can be found
46
+ # @api private
47
+ def self.find_loader(module_name)
48
+ loaders = Puppet.lookup(:loaders) { nil }
49
+ raise Puppet::ParseError, "Internal Error: Puppet Context ':loaders' missing" if loaders.nil?
50
+ loaders.find_loader(module_name)
51
+ end
52
+
53
+ # Finds the appropriate loader for the given `module_name`, or for the environment in case `module_name`
54
+ # is `nil` or empty.
55
+ #
56
+ # @param module_name [String,nil] the name of the module
57
+ # @return [Loader::Loader] the found loader
58
+ # @raise [Puppet::ParseError] if no loader can be found
59
+ # @api private
60
+ def find_loader(module_name)
61
+ if module_name.nil? || module_name == ''
62
+ # TODO : Later when fdefinition can be private, a decision is needed regarding what that means.
63
+ # A private environment loader could be used for logic outside of modules, then only that logic
64
+ # would see the definition.
65
+ #
66
+ # Use the private loader, this definition may see the environment's dependencies (currently, all modules)
67
+ loader = private_environment_loader()
68
+ raise Puppet::ParseError, 'Internal Error: did not find public loader' if loader.nil?
69
+ loader
70
+ else
71
+ # TODO : Later check if definition is private, and then add it to private_loader_for_module
72
+ #
73
+ loader = public_loader_for_module(module_name)
74
+ raise Puppet::ParseError, "Internal Error: did not find public loader for module: '#{module_name}'" if loader.nil?
75
+ loader
76
+ end
77
+ end
78
+
38
79
  def static_loader
39
80
  @@static_loader
40
81
  end
@@ -66,7 +107,7 @@ class Puppet::Pops::Loaders
66
107
  private
67
108
 
68
109
  def create_puppet_system_loader()
69
- Puppet::Pops::Loader::ModuleLoaders.system_loader_from(static_loader, self)
110
+ Loader::ModuleLoaders.system_loader_from(static_loader, self)
70
111
  end
71
112
 
72
113
  def create_environment_loader(environment)
@@ -91,10 +132,10 @@ class Puppet::Pops::Loaders
91
132
  env_conf = Puppet.lookup(:environments).get_conf(environment.name)
92
133
  if env_conf.nil? || !env_conf.is_a?(Puppet::Settings::EnvironmentConf)
93
134
  # Not a real directory environment, cannot work as a module TODO: Drop when legacy env are dropped?
94
- loader = Puppet::Pops::Loader::SimpleEnvironmentLoader.new(puppet_system_loader, loader_name)
135
+ loader = Loader::SimpleEnvironmentLoader.new(puppet_system_loader, loader_name)
95
136
  else
96
137
  # View the environment as a module to allow loading from it - this module is always called 'environment'
97
- loader = Puppet::Pops::Loader::ModuleLoaders.module_loader_from(puppet_system_loader, self, 'environment', env_conf.path_to_env)
138
+ loader = Loader::ModuleLoaders.module_loader_from(puppet_system_loader, self, 'environment', env_conf.path_to_env)
98
139
  end
99
140
 
100
141
  # An environment has a module path even if it has a null loader
@@ -105,7 +146,7 @@ class Puppet::Pops::Loaders
105
146
  # Code in the environment gets to see all modules (since there is no metadata for the environment)
106
147
  # but since this is not given to the module loaders, they can not load global code (since they can not
107
148
  # have prior knowledge about this
108
- loader = Puppet::Pops::Loader::DependencyLoader.new(loader, "environment", @module_resolver.all_module_loaders())
149
+ loader = Loader::DependencyLoader.new(loader, "environment", @module_resolver.all_module_loaders())
109
150
 
110
151
  # The module loader gets the private loader via a lazy operation to look up the module's private loader.
111
152
  # This does not work for an environment since it is not resolved the same way.
@@ -121,7 +162,7 @@ class Puppet::Pops::Loaders
121
162
  # Create data about this module
122
163
  md = LoaderModuleData.new(puppet_module)
123
164
  mr[puppet_module.name] = md
124
- md.public_loader = Puppet::Pops::Loader::ModuleLoaders.module_loader_from(parent_loader, self, md.name, md.path)
165
+ md.public_loader = Loader::ModuleLoaders.module_loader_from(parent_loader, self, md.name, md.path)
125
166
  end
126
167
  # NOTE: Do not resolve all modules here - this is wasteful if only a subset of modules / functions are used
127
168
  # The resolution is triggered by asking for a module's private loader, since this means there is interest
@@ -224,7 +265,7 @@ class Puppet::Pops::Loaders
224
265
  def create_loader_with_all_modules_visible(from_module_data)
225
266
  Puppet.debug{"ModuleLoader: module '#{from_module_data.name}' has unknown dependencies - it will have all other modules visible"}
226
267
 
227
- Puppet::Pops::Loader::DependencyLoader.new(from_module_data.public_loader, from_module_data.name, all_module_loaders())
268
+ Loader::DependencyLoader.new(from_module_data.public_loader, from_module_data.name, all_module_loaders())
228
269
  end
229
270
 
230
271
  def create_loader_with_only_dependencies_visible(from_module_data)
@@ -234,7 +275,8 @@ class Puppet::Pops::Loaders
234
275
  " Use 'puppet module list --tree' to see information about modules")
235
276
  end
236
277
  dependency_loaders = from_module_data.dependency_names.collect { |name| @index[name].public_loader }
237
- Puppet::Pops::Loader::DependencyLoader.new(from_module_data.public_loader, from_module_data.name, dependency_loaders)
278
+ Loader::DependencyLoader.new(from_module_data.public_loader, from_module_data.name, dependency_loaders)
238
279
  end
239
280
  end
240
281
  end
282
+ end
@@ -28,7 +28,8 @@ module Puppet::Pops::Lookup
28
28
  end
29
29
 
30
30
  class ExplainTreeNode < ExplainNode
31
- attr_reader :parent, :event, :key, :value
31
+ attr_reader :parent, :event, :value
32
+ attr_accessor :key
32
33
 
33
34
  def initialize(parent)
34
35
  @parent = parent
@@ -133,6 +134,55 @@ module Puppet::Pops::Lookup
133
134
  end
134
135
  end
135
136
 
137
+ class ExplainTop < ExplainTreeNode
138
+ def initialize(parent, type, key)
139
+ super(parent)
140
+ @type = type
141
+ self.key = key
142
+ end
143
+
144
+ def dump_on(io, indent, first_indent)
145
+ io << first_indent << 'Searching for "' << key << "\"\n"
146
+ indent = increase_indent(indent)
147
+ branches.each {|b| b.dump_on(io, indent, indent)}
148
+ end
149
+ end
150
+
151
+ class ExplainInvalidKey < ExplainTreeNode
152
+ def initialize(parent, key)
153
+ super(parent)
154
+ @key = key
155
+ end
156
+
157
+ def dump_on(io, indent, first_indent)
158
+ io << first_indent << "Invalid key \"" << @key << "\"\n"
159
+ end
160
+
161
+ def type
162
+ :invalid_key
163
+ end
164
+ end
165
+
166
+ class ExplainMergeSource < ExplainNode
167
+ attr_reader :merge_source
168
+
169
+ def initialize(merge_source)
170
+ @merge_source = merge_source
171
+ end
172
+
173
+ def dump_on(io, indent, first_indent)
174
+ io << first_indent << 'Using merge options from "' << merge_source << "\" hash\n"
175
+ end
176
+
177
+ def to_hash
178
+ { :type => type, :merge_source => merge_source }
179
+ end
180
+
181
+ def type
182
+ :merge_source
183
+ end
184
+ end
185
+
136
186
  class ExplainInterpolate < ExplainTreeNode
137
187
  def initialize(parent, expression)
138
188
  super(parent)
@@ -163,6 +213,8 @@ module Puppet::Pops::Lookup
163
213
  end
164
214
 
165
215
  def dump_on(io, indent, first_indent)
216
+ return if branches.size == 0
217
+
166
218
  # It's pointless to report a merge where there's only one branch
167
219
  return branches[0].dump_on(io, indent, first_indent) if branches.size == 1
168
220
 
@@ -297,7 +349,7 @@ module Puppet::Pops::Lookup
297
349
  def dump_on(io, indent, first_indent)
298
350
  io << indent << 'Path "' << @path.path << "\"\n"
299
351
  indent = increase_indent(indent)
300
- io << indent << 'Original path: ' << @path.original_path << "\n"
352
+ io << indent << 'Original path: "' << @path.original_path << "\"\n"
301
353
  branches.each {|b| b.dump_on(io, indent, indent)}
302
354
  io << indent << "Path not found\n" if @event == :path_not_found
303
355
  dump_outcome(io, indent)
@@ -332,8 +384,10 @@ module Puppet::Pops::Lookup
332
384
  end
333
385
 
334
386
  class Explainer < ExplainNode
335
- def initialize
387
+ def initialize(explain_options = false, only_explain_options = false)
336
388
  @current = self
389
+ @explain_options = explain_options
390
+ @only_explain_options = only_explain_options
337
391
  end
338
392
 
339
393
  def push(qualifier_type, qualifier)
@@ -352,6 +406,10 @@ module Puppet::Pops::Lookup
352
406
  ExplainMerge.new(@current, qualifier)
353
407
  when :scope
354
408
  ExplainScope.new(@current)
409
+ when :meta, :data
410
+ ExplainTop.new(@current, qualifier_type, qualifier)
411
+ when :invalid_key
412
+ ExplainInvalidKey.new(@current, qualifier)
355
413
  else
356
414
  raise ArgumentError, "Unknown Explain type #{qualifier_type}"
357
415
  end
@@ -359,6 +417,14 @@ module Puppet::Pops::Lookup
359
417
  @current = node
360
418
  end
361
419
 
420
+ def only_explain_options?
421
+ @only_explain_options
422
+ end
423
+
424
+ def explain_options?
425
+ @explain_options
426
+ end
427
+
362
428
  def pop
363
429
  @current = @current.parent unless @current.parent.nil?
364
430
  end
@@ -375,6 +441,10 @@ module Puppet::Pops::Lookup
375
441
  @current.found(key, value)
376
442
  end
377
443
 
444
+ def accept_merge_source(merge_source)
445
+ @current.branches << ExplainMergeSource.new(merge_source)
446
+ end
447
+
378
448
  def accept_not_found(key)
379
449
  @current.not_found(key)
380
450
  end
@@ -1,6 +1,7 @@
1
1
  module Puppet::Pops::Lookup
2
2
  class Invocation
3
- attr_reader :scope, :override_values, :default_values, :explainer, :module_name
3
+ attr_reader :scope, :override_values, :default_values, :explainer
4
+ attr_accessor :module_name, :top_key
4
5
 
5
6
  # Creates a context object for a lookup invocation. The object contains the current scope, overrides, and default
6
7
  # values and may optionally contain an {ExplanationAcceptor} instance that will receive book-keeping information
@@ -50,34 +51,31 @@ module Puppet::Pops::Lookup
50
51
  # :merge - qualifier is a MergeStrategy instance
51
52
  # :module - qualifier is the name of a module
52
53
  # :interpolation - qualifier is the unresolved interpolation expression
53
- # :meta - qualifier is the name of a module or nil if that's not applicable
54
+ # :meta - qualifier is the module name
55
+ # :data - qualifier is the key
54
56
  #
55
57
  # @param qualifier [Object] A branch, a provider, or a path
56
58
  def with(qualifier_type, qualifier)
57
- is_meta = qualifier_type == :meta
58
- @module_name = qualifier if is_meta
59
59
  if @explainer.nil?
60
60
  yield
61
61
  else
62
- if is_meta
63
- save_explainer = @explainer
64
- @explainer = nil
65
- begin
66
- yield
67
- ensure
68
- @explainer = save_explainer
69
- end
70
- else
71
- @explainer.push(qualifier_type, qualifier)
72
- begin
73
- yield
74
- ensure
75
- @explainer.pop
76
- end
62
+ @explainer.push(qualifier_type, qualifier)
63
+ begin
64
+ yield
65
+ ensure
66
+ @explainer.pop
77
67
  end
78
68
  end
79
69
  end
80
70
 
71
+ def only_explain_options?
72
+ @explainer.nil? ? false : @explainer.only_explain_options?
73
+ end
74
+
75
+ def explain_options?
76
+ @explainer.nil? ? false : @explainer.explain_options?
77
+ end
78
+
81
79
  def report_found_in_overrides(key, value)
82
80
  @explainer.accept_found_in_overrides(key, value) unless @explainer.nil?
83
81
  value
@@ -93,6 +91,10 @@ module Puppet::Pops::Lookup
93
91
  value
94
92
  end
95
93
 
94
+ def report_merge_source(merge_source)
95
+ @explainer.accept_merge_source(merge_source) unless @explainer.nil?
96
+ end
97
+
96
98
  # Report the result of a merge or fully resolved interpolated string
97
99
  # @param value [Object] The result to report
98
100
  # @return [Object] the given value
@@ -1,32 +1,36 @@
1
1
  # This class is the backing implementation of the Puppet function 'lookup'.
2
2
  # See puppet/functions/lookup.rb for documentation.
3
3
  #
4
- module Puppet::Pops::Lookup
4
+ module Puppet::Pops
5
+ module Lookup
6
+ LOOKUP_OPTIONS = 'lookup_options'.freeze
7
+ GLOBAL = '__global__'.freeze
8
+
5
9
  # Performs a lookup in the configured scopes and optionally merges the default.
6
10
  #
7
11
  # This is a backing function and all parameters are assumed to have been type checked.
8
12
  # See puppet/functions/lookup.rb for full documentation and all parameter combinations.
9
13
  #
10
14
  # @param name [String|Array<String>] The name or names to lookup
11
- # @param type [Puppet::Pops::Types::PAnyType|nil] The expected type of the found value
15
+ # @param type [Types::PAnyType|nil] The expected type of the found value
12
16
  # @param default_value [Object] The value to use as default when no value is found
13
17
  # @param has_default [Boolean] Set to _true_ if _default_value_ is included (_nil_ is a valid _default_value_)
14
- # @param merge [Puppet::Pops::MergeStrategy,String,Hash<String,Object>,nil] Merge strategy or hash with strategy and options
15
- # @param lookup_invocation [Puppet::Pops::Lookup::Invocation] Invocation data containing scope, overrides, and defaults
18
+ # @param merge [MergeStrategy,String,Hash<String,Object>,nil] Merge strategy or hash with strategy and options
19
+ # @param lookup_invocation [Invocation] Invocation data containing scope, overrides, and defaults
16
20
  # @return [Object] The found value
17
21
  #
18
22
  def self.lookup(name, value_type, default_value, has_default, merge, lookup_invocation)
19
- value_type = Puppet::Pops::Types::PDataType::DEFAULT if value_type.nil?
23
+ value_type = Types::PDataType::DEFAULT if value_type.nil?
20
24
  names = name.is_a?(Array) ? name : [name]
21
25
 
22
26
  # find first name that yields a non-nil result and wrap it in a two element array
23
27
  # with name and value.
24
- not_found = Puppet::Pops::MergeStrategy::NOT_FOUND
28
+ not_found = MergeStrategy::NOT_FOUND
25
29
  override_values = lookup_invocation.override_values
26
30
  result_with_name = names.reduce([nil, not_found]) do |memo, key|
27
- value = override_values.include?(key) ? assert_type('override', value_type, override_values[key]) : not_found
31
+ value = override_values.include?(key) ? assert_type(["Value found for key '%s' in override hash", key], value_type, override_values[key]) : not_found
28
32
  catch(:no_such_key) { value = search_and_merge(key, lookup_invocation, merge) } if value.equal?(not_found)
29
- break [key, assert_type('found', value_type, value)] unless value.equal?(not_found)
33
+ break [key, assert_type('Found value', value_type, value)] unless value.equal?(not_found)
30
34
  memo
31
35
  end
32
36
 
@@ -35,7 +39,7 @@ module Puppet::Pops::Lookup
35
39
  default_values = lookup_invocation.default_values
36
40
  unless default_values.empty?
37
41
  result_with_name = names.reduce(result_with_name) do |memo, key|
38
- value = default_values.include?(key) ? assert_type('default_values_hash', value_type, default_values[key]) : not_found
42
+ value = default_values.include?(key) ? assert_type(["Value found for key '%s' in default values hash", key], value_type, default_values[key]) : not_found
39
43
  memo = [key, value]
40
44
  break memo unless value.equal?(not_found)
41
45
  memo
@@ -46,9 +50,9 @@ module Puppet::Pops::Lookup
46
50
  answer = result_with_name[1]
47
51
  if answer.equal?(not_found)
48
52
  if block_given?
49
- answer = assert_type('default_block', value_type, yield(name))
53
+ answer = assert_type('Value returned from default block', value_type, yield(name))
50
54
  elsif has_default
51
- answer = assert_type('default_value', value_type, default_value)
55
+ answer = assert_type('Default value', value_type, default_value)
52
56
  else
53
57
  fail_lookup(names)
54
58
  end
@@ -62,7 +66,7 @@ module Puppet::Pops::Lookup
62
66
  end
63
67
 
64
68
  def self.assert_type(subject, type, value)
65
- Puppet::Pops::Types::TypeAsserter.assert_instance_of(subject, type, value)
69
+ Types::TypeAsserter.assert_instance_of(subject, type, value)
66
70
  end
67
71
  private_class_method :assert_type
68
72
 
@@ -72,3 +76,4 @@ module Puppet::Pops::Lookup
72
76
  end
73
77
  private_class_method :fail_lookup
74
78
  end
79
+ end