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,5 +1,6 @@
1
1
  require 'puppet/util/autoload'
2
2
  require 'puppet/parser/scope'
3
+ require 'puppet/pops/adaptable'
3
4
 
4
5
  # A module for managing parser functions. Each specified function
5
6
  # is added to a central module that then gets included into the Scope
@@ -17,12 +18,12 @@ module Puppet::Parser::Functions
17
18
  #
18
19
  # @api private
19
20
  def self.reset
20
- @modules = {}
21
-
22
21
  # Runs a newfunction to create a function for each of the log levels
22
+ root_env = Puppet.lookup(:root_environment)
23
+ AnonymousModuleAdapter.clear(root_env)
23
24
  Puppet::Util::Log.levels.each do |level|
24
25
  newfunction(level,
25
- :environment => Puppet.lookup(:root_environment),
26
+ :environment => root_env,
26
27
  :doc => "Log a message on the server at level #{level.to_s}.") do |vals|
27
28
  send(level, vals.join(" "))
28
29
  end
@@ -36,26 +37,37 @@ module Puppet::Parser::Functions
36
37
  @autoloader ||= Puppet::Util::Autoload.new(self, "puppet/parser/functions")
37
38
  end
38
39
 
40
+ # An adapter that ties the anonymous module that acts as the container for all 3x functions to the environment
41
+ # where the functions are created. This adapter ensures that the life-cycle of those functions doesn't exceed
42
+ # the life-cycle of the environment.
43
+ #
44
+ # @api private
45
+ class AnonymousModuleAdapter < Puppet::Pops::Adaptable::Adapter
46
+ attr_accessor :module
47
+ end
48
+
39
49
  # Get the module that functions are mixed into corresponding to an
40
50
  # environment
41
51
  #
42
52
  # @api private
43
53
  def self.environment_module(env)
44
- @modules[env.name] ||= Module.new do
45
- @metadata = {}
54
+ AnonymousModuleAdapter.adapt(env) do |a|
55
+ a.module ||= Module.new do
56
+ @metadata = {}
46
57
 
47
- def self.all_function_info
48
- @metadata
49
- end
58
+ def self.all_function_info
59
+ @metadata
60
+ end
50
61
 
51
- def self.get_function_info(name)
52
- @metadata[name]
53
- end
62
+ def self.get_function_info(name)
63
+ @metadata[name]
64
+ end
54
65
 
55
- def self.add_function_info(name, info)
56
- @metadata[name] = info
66
+ def self.add_function_info(name, info)
67
+ @metadata[name] = info
68
+ end
57
69
  end
58
- end
70
+ end.module
59
71
  end
60
72
 
61
73
  # Create a new Puppet DSL function.
@@ -70,7 +82,7 @@ module Puppet::Parser::Functions
70
82
  # extend the behavior and functionality of Puppet.
71
83
  #
72
84
  # See also [Docs: Custom
73
- # Functions](http://docs.puppetlabs.com/guides/custom_functions.html)
85
+ # Functions](https://docs.puppetlabs.com/guides/custom_functions.html)
74
86
  #
75
87
  # @example Define a new Puppet DSL Function
76
88
  # >> Puppet::Parser::Functions.newfunction(:double, :arity => 1,
@@ -113,7 +125,7 @@ module Puppet::Parser::Functions
113
125
  # This string will be extracted by documentation generation tools.
114
126
  #
115
127
  # @option options [Integer] :arity (-1) the
116
- # [arity](http://en.wikipedia.org/wiki/Arity) of the function. When
128
+ # [arity](https://en.wikipedia.org/wiki/Arity) of the function. When
117
129
  # specified as a positive integer the function is expected to receive
118
130
  # _exactly_ the specified number of arguments. When specified as a
119
131
  # negative number, the function is expected to receive _at least_ the
@@ -244,23 +244,25 @@ class Puppet::Parser::Resource < Puppet::Resource
244
244
  raise "Resource #{self} tries to consume #{cns} but no 'consumes' mapping exists for #{self.resource_type} and #{cns.type}" unless blueprint
245
245
 
246
246
  # setup scope that has, for each attr of cns, a binding to cns[attr]
247
- cns_scope = scope.find_global_scope.newscope(:source => self, :resource => self)
248
- cns.to_hash.each { |name, value| cns_scope[name.to_s] = value }
249
-
250
- # evaluate mappings in that scope
251
- resource_type.arguments.keys.each do |name|
252
- if expr = blueprint[:mappings][name]
253
- # Explicit mapping
254
- value = expr.safeevaluate(cns_scope)
255
- else
256
- value = cns[name]
257
- end
258
- unless value.nil?
259
- # @todo lutter 2015-07-01: this should be caught by the checker
260
- # much earlier. We consume several capres, at least two of which
261
- # want to map to the same parameter (PUP-5080)
262
- raise "Attempt to reassign attribute '#{name}' in '#{self}' caused by multiple consumed mappings to the same attribute" if map[name]
263
- map[name] = value
247
+ scope.with_global_scope do |global_scope|
248
+ cns_scope = global_scope.newscope(:source => self, :resource => self)
249
+ cns.to_hash.each { |name, value| cns_scope[name.to_s] = value }
250
+
251
+ # evaluate mappings in that scope
252
+ resource_type.arguments.keys.each do |name|
253
+ if expr = blueprint[:mappings][name]
254
+ # Explicit mapping
255
+ value = expr.safeevaluate(cns_scope)
256
+ else
257
+ value = cns[name]
258
+ end
259
+ unless value.nil?
260
+ # @todo lutter 2015-07-01: this should be caught by the checker
261
+ # much earlier. We consume several capres, at least two of which
262
+ # want to map to the same parameter (PUP-5080)
263
+ raise "Attempt to reassign attribute '#{name}' in '#{self}' caused by multiple consumed mappings to the same attribute" if map[name]
264
+ map[name] = value
265
+ end
264
266
  end
265
267
  end
266
268
  end
@@ -174,13 +174,104 @@ class Puppet::Parser::Scope
174
174
 
175
175
  end
176
176
 
177
+ # @api private
178
+ class ParameterScope < Ephemeral
179
+ class Access
180
+ attr_accessor :value
181
+
182
+ def assigned?
183
+ instance_variable_defined?(:@value)
184
+ end
185
+ end
186
+
187
+ # A parameter default must be evaluated using a special scope. The scope that is given to this method must
188
+ # have a `ParameterScope` as its last ephemeral scope. This method will then push a `MatchScope` while the
189
+ # given `expression` is evaluated. The method will catch any throw of `:unevaluated_parameter` and produce
190
+ # an error saying that the evaluated parameter X tries to access the unevaluated parameter Y.
191
+ #
192
+ # @param name [String] the name of the currently evaluated parameter
193
+ # @param expression [Puppet::Parser::AST] the expression to evaluate
194
+ # @param scope [Puppet::Parser::Scope] a scope where a `ParameterScope` has been pushed
195
+ # @return [Object] the result of the evaluation
196
+ #
197
+ # @api private
198
+ def evaluate3x(name, expression, scope)
199
+ scope.with_guarded_scope do
200
+ bad = catch(:unevaluated_parameter) do
201
+ scope.new_match_scope(nil)
202
+ return as_read_only { expression.safeevaluate(scope) }
203
+ end
204
+ raise Puppet::Error, "default expression for $#{name} tries to illegally access not yet evaluated $#{bad}"
205
+ end
206
+ end
207
+
208
+ def evaluate(name, expression, scope, evaluator)
209
+ scope.with_guarded_scope do
210
+ bad = catch(:unevaluated_parameter) do
211
+ scope.new_match_scope(nil)
212
+ return as_read_only { evaluator.evaluate(expression, scope) }
213
+ end
214
+ raise Puppet::Error, "default expression for $#{name} tries to illegally access not yet evaluated $#{bad}"
215
+ end
216
+ end
217
+
218
+ def initialize(parent, param_names)
219
+ super(parent)
220
+ @params = {}
221
+ param_names.each { |name| @params[name] = Access.new }
222
+ end
223
+
224
+ def [](name)
225
+ access = @params[name]
226
+ return super if access.nil?
227
+ throw(:unevaluated_parameter, name) unless access.assigned?
228
+ access.value
229
+ end
230
+
231
+ def []=(name, value)
232
+ raise Puppet::Error, "Attempt to assign variable #{name} when evaluating parameters" if @read_only
233
+ @params[name] ||= Access.new
234
+ @params[name].value = value
235
+ end
236
+
237
+ def bound?(name)
238
+ @params.include?(name)
239
+ end
240
+
241
+ def include?(name)
242
+ @params.include?(name) || super
243
+ end
244
+
245
+ def is_local_scope?
246
+ true
247
+ end
248
+
249
+ def as_read_only
250
+ read_only = @read_only
251
+ @read_only = true
252
+ begin
253
+ yield
254
+ ensure
255
+ @read_only = read_only
256
+ end
257
+ end
258
+
259
+ def to_hash
260
+ Hash[@params.select {|_, access| access.assigned? }.map { |name, access| [name, access.value] }]
261
+ end
262
+ end
263
+
264
+
177
265
  # Returns true if the variable of the given name has a non nil value.
178
266
  # TODO: This has vague semantics - does the variable exist or not?
179
267
  # use ['name'] to get nil or value, and if nil check with exist?('name')
180
268
  # this include? is only useful because of checking against the boolean value false.
181
269
  #
182
270
  def include?(name)
183
- ! self[name].nil?
271
+ catch(:undefined_variable) {
272
+ return ! self[name].nil?
273
+ }
274
+ false
184
275
  end
185
276
 
186
277
  # Returns true if the variable of the given name is set to any value (including nil)
@@ -412,14 +503,28 @@ class Puppet::Parser::Scope
412
503
  end
413
504
  end
414
505
 
506
+ UNDEFINED_VARIABLES_KIND = 'undefined_variables'.freeze
507
+
415
508
  def variable_not_found(name, reason=nil)
416
509
  # Built in variables always exist
417
510
  if BUILT_IN_VARS.include?(name)
418
511
  return nil
419
512
  end
420
513
  if Puppet[:strict_variables]
421
- throw :undefined_variable
514
+ throw(:undefined_variable, reason)
422
515
  else
516
+ # Always warn, unfortunately without location (unless given in "reason") since
517
+ # a location is in most cases not given to scope (operator [], and lookupvar), and
518
+ # would be too expensive to always give.
519
+ # The ideal solution would be to always throw :undefined_variable, but that has to
520
+ # wait until a major release. It would then force all callers of scope to deal with
521
+ # the case of :undefined_variable. (Should check with include? first or catch the throw).
522
+ # Use deprecation warning to enable turning off these warnings, and to ensure each variable
523
+ # is only logged once.
524
+ unless name =~ Puppet::Pops::Patterns::NUMERIC_VAR_NAME
525
+ Puppet.warn_once(UNDEFINED_VARIABLES_KIND, "Variable: #{name}",
526
+ "Undefined variable '#{name}'; #{reason}" )
527
+ end
423
528
  nil
424
529
  end
425
530
  end
@@ -511,7 +616,8 @@ class Puppet::Parser::Scope
511
616
  else
512
617
  ""
513
618
  end
514
- warning "Could not look up qualified variable '#{class_name}::#{variable_name}'; #{reason}#{location}"
619
+ variable_not_found("#{class_name}::#{variable_name}", "#{reason}#{location}")
620
+ return nil
515
621
  end
516
622
  variable_not_found("#{class_name}::#{variable_name}", reason)
517
623
  end
@@ -738,10 +844,12 @@ class Puppet::Parser::Scope
738
844
 
739
845
  alias_method :inspect, :to_s
740
846
 
741
- # remove ephemeral scope up to level
742
- # TODO: Who uses :all ? Remove ??
847
+ # Pop ephemeral scopes up to level and return them
743
848
  #
849
+ # @deprecated use #pop_epehemeral
850
+ # @api private
744
851
  def unset_ephemeral_var(level=:all)
852
+ Puppet.deprecation_warning('Method Parser::Scope#unset_ephemeral_var() is deprecated')
745
853
  if level == :all
746
854
  @ephemeral = [ MatchScope.new(@symtable, nil)]
747
855
  else
@@ -749,6 +857,22 @@ class Puppet::Parser::Scope
749
857
  end
750
858
  end
751
859
 
860
+ # Pop ephemeral scopes up to level and return them
861
+ #
862
+ # @param level [Fixnum] a positive integer
863
+ # @return [Array] the removed ephemeral scopes
864
+ # @api private
865
+ def pop_ephemerals(level)
866
+ @ephemeral.pop(@ephemeral.size - level)
867
+ end
868
+
869
+ # Push ephemeral scopes onto the ephemeral scope stack
870
+ # @param ephemeral_scopes [Array]
871
+ # @api private
872
+ def push_ephemerals(ephemeral_scopes)
873
+ ephemeral_scopes.each { |ephemeral_scope| @ephemeral.push(ephemeral_scope) } unless ephemeral_scopes.nil?
874
+ end
875
+
752
876
  def ephemeral_level
753
877
  @ephemeral.size
754
878
  end
@@ -762,6 +886,53 @@ class Puppet::Parser::Scope
762
886
  end
763
887
  end
764
888
 
889
+ # Execute given block in global scope with no ephemerals present
890
+ #
891
+ # @yieldparam [Scope] global_scope the global and ephemeral less scope
892
+ # @return [Object] the return of the block
893
+ #
894
+ # @api private
895
+ def with_global_scope(&block)
896
+ find_global_scope.without_ephemeral_scopes(&block)
897
+ end
898
+
899
+ # Execute given block with all ephemeral popped from the ephemeral stack
900
+ #
901
+ # @api private
902
+ def without_ephemeral_scopes
903
+ save_ephemeral = @ephemeral
904
+ begin
905
+ @ephemeral = [ @symtable ]
906
+ yield(self)
907
+ ensure
908
+ @ephemeral = save_ephemeral
909
+ end
910
+ end
911
+
912
+ # Nests a parameter scope
913
+ # @api private
914
+ def with_parameter_scope(param_names)
915
+ param_scope = ParameterScope.new(@ephemeral.last, param_names)
916
+ with_guarded_scope do
917
+ @ephemeral.push(param_scope)
918
+ yield(param_scope)
919
+ end
920
+ end
921
+
922
+ # Execute given block and ensure that ephemeral level is restored
923
+ #
924
+ # @return [Object] the return of the block
925
+ #
926
+ # @api private
927
+ def with_guarded_scope
928
+ elevel = ephemeral_level
929
+ begin
930
+ yield
931
+ ensure
932
+ pop_ephemerals(elevel)
933
+ end
934
+ end
935
+
765
936
  # Sets match data in the most nested scope (which always is a MatchScope), it clobbers match data already set there
766
937
  #
767
938
  def set_match_data(match_data)
@@ -72,7 +72,6 @@ module Puppet::Plugins::DataProviders
72
72
  def data_key(key, lookup_invocation)
73
73
  nil
74
74
  end
75
- protected :data_key
76
75
 
77
76
  # Should be reimplemented by subclass to provide the hash that corresponds to the given name.
78
77
  #
@@ -94,10 +93,10 @@ module Puppet::Plugins::DataProviders
94
93
  def validate_data(data, data_key)
95
94
  data
96
95
  end
97
- protected :validate_data
98
96
  end
99
97
 
100
98
  class ModuleDataProvider
99
+ LOOKUP_OPTIONS = Puppet::Pops::Lookup::LOOKUP_OPTIONS
101
100
  include DataProvider
102
101
 
103
102
  # Retrieve the first segment of the qualified name _key_. This method will throw
@@ -106,27 +105,34 @@ module Puppet::Plugins::DataProviders
106
105
  # @param key [String] The key
107
106
  # @return [String] The first segment of the given key
108
107
  def data_key(key, lookup_invocation)
109
- return lookup_invocation.module_name if key == 'lookup_options'
108
+ return lookup_invocation.module_name if key == LOOKUP_OPTIONS
110
109
  qual_index = key.index('::')
111
110
  throw :no_such_key if qual_index.nil?
112
111
  key[0..qual_index-1]
113
112
  end
114
- protected :data_key
115
113
 
116
- # Assert that all keys in the given _data_ are prefixed with the given _module_name_.
114
+ # Asserts that all keys in the given _data_ are prefixed with the given _module_name_. Remove entries
115
+ # that does not follow the convention and log a warning.
117
116
  #
118
117
  # @param data [Hash] The data hash
119
118
  # @param module_name [String] The name of the module where the data was found
120
- # @return [Hash] The data_hash unaltered
119
+ # @return [Hash] The possibly pruned hash
120
+ # @api public
121
121
  def validate_data(data, module_name)
122
122
  module_prefix = "#{module_name}::"
123
- data.each_key do |k|
124
- unless k.is_a?(String) && (k == 'lookup_options' || k.start_with?(module_prefix))
125
- raise Puppet::DataBinding::LookupError, "Module data for module '#{module_name}' must use keys qualified with the name of the module"
123
+ data.each_key.reduce(data) do |memo, k|
124
+ if k.is_a?(String)
125
+ next memo if k == LOOKUP_OPTIONS || k.start_with?(module_prefix)
126
+ msg = 'must use keys qualified with the name of the module'
127
+ else
128
+ msg = "must use keys of type String, got #{k.class.name}"
126
129
  end
130
+ memo = memo.clone if memo.equal?(data)
131
+ memo.delete(k)
132
+ Puppet.warning("Module data for module '#{module_name}' #{msg}")
133
+ memo
127
134
  end
128
135
  end
129
- protected :validate_data
130
136
  end
131
137
 
132
138
  class EnvironmentDataProvider
@@ -135,7 +141,6 @@ module Puppet::Plugins::DataProviders
135
141
  def data_key(key, lookup_invocation)
136
142
  'environment'
137
143
  end
138
- protected :data_key
139
144
  end
140
145
 
141
146
  # Class that keeps track of the original path (as it appears in the declaration, before interpolation),
@@ -175,11 +180,38 @@ module Puppet::Plugins::DataProviders
175
180
 
176
181
  # @param name [String] The name of the data provider
177
182
  # @param paths [Array<ResolvedPath>] Paths used by this provider
183
+ # @param parent_data_provider [DataProvider] The data provider that is the container of this data provider
178
184
  #
179
185
  # @api public
180
- def initialize(name, paths)
186
+ def initialize(name, paths, parent_data_provider = nil)
181
187
  @name = name
182
188
  @paths = paths
189
+ @parent_data_provider = parent_data_provider
190
+ end
191
+
192
+ # Gets the data from the compiler, or initializes it by calling #initialize_data if not present in the compiler.
193
+ # This means, that data is initialized once per compilation, and the data is cached for as long as the compiler
194
+ # lives (which is for one catalog production). This makes it possible to return data that is tailored for the
195
+ # request.
196
+ #
197
+ # If data is obtained using the #initialize_data method it will be sent to the #validate_data for validation
198
+ #
199
+ # @param path [String] The path to the data to be loaded (passed to #initialize_data)
200
+ # @param data_key [String] The data key such as the name of a module or the constant 'environment'
201
+ # @param lookup_invocation [Puppet::Pops::Lookup::Invocation] The current lookup invocation
202
+ # @param merge [String|Hash<String,Object>|nil] Merge strategy or hash with strategy and options
203
+ # @return [Hash] The data hash for the given _key_
204
+ #
205
+ # @api public
206
+ def load_data(path, data_key, lookup_invocation)
207
+ compiler = lookup_invocation.scope.compiler
208
+ adapter = Puppet::DataProviders::DataAdapter.get(compiler) || Puppet::DataProviders::DataAdapter.adapt(compiler)
209
+ adapter.data[path] ||= validate_data(initialize_data(path, lookup_invocation), data_key)
210
+ end
211
+ protected :data
212
+
213
+ def validate_data(data, module_name)
214
+ @parent_data_provider.nil? ? data : @parent_data_provider.validate_data(data, module_name)
183
215
  end
184
216
 
185
217
  # Performs a lookup by searching all given paths for the given _key_. A merge will be performed if
@@ -191,13 +223,14 @@ module Puppet::Plugins::DataProviders
191
223
  #
192
224
  # @api public
193
225
  def unchecked_lookup(key, lookup_invocation, merge)
226
+ module_name = @parent_data_provider.nil? ? nil : @parent_data_provider.data_key(key, lookup_invocation)
194
227
  lookup_invocation.with(:data_provider, self) do
195
228
  merge_strategy = Puppet::Pops::MergeStrategy.strategy(merge)
196
229
  lookup_invocation.with(:merge, merge_strategy) do
197
230
  merged_result = merge_strategy.merge_lookup(@paths) do |path|
198
231
  lookup_invocation.with(:path, path) do
199
232
  if path.exists?
200
- hash = data(path.path, lookup_invocation)
233
+ hash = load_data(path.path, module_name, lookup_invocation)
201
234
  value = hash[key]
202
235
  if value || hash.include?(key)
203
236
  lookup_invocation.report_found(key, post_process(value, lookup_invocation))
@@ -226,10 +259,11 @@ module Puppet::Plugins::DataProviders
226
259
  #
227
260
  # @param name [String] the name of the created provider (for logging and debugging)
228
261
  # @param paths [Array<String>] array of resolved paths
262
+ # @param parent_data_provider [DataProvider] The data provider that is the container of this data provider
229
263
  # @return [DataProvider] The created data provider
230
264
  #
231
265
  # @api public
232
- def create(name, paths)
266
+ def create(name, paths, parent_data_provider)
233
267
  raise NotImplementedError, "Subclass of PathBasedDataProviderFactory must implement 'create' method"
234
268
  end
235
269
 
@@ -249,6 +283,14 @@ module Puppet::Plugins::DataProviders
249
283
  def resolve_paths(datadir, declared_paths, paths, lookup_invocation)
250
284
  []
251
285
  end
286
+
287
+ # Returns the data provider factory version.
288
+ #
289
+ # return [Integer] the version of this data provider factory
290
+ # @api public
291
+ def version
292
+ 2
293
+ end
252
294
  end
253
295
 
254
296
  # Factory for creating file based data providers. This is an extension of the path based
@@ -15,7 +15,8 @@
15
15
  # be exploited as the implementation of _being adaptable_ may change in the future.
16
16
  # @api private
17
17
  #
18
- module Puppet::Pops::Adaptable
18
+ module Puppet::Pops
19
+ module Adaptable
19
20
  # Base class for an Adapter.
20
21
  #
21
22
  # A typical adapter just defines some accessors.
@@ -199,3 +200,5 @@ module Puppet::Pops::Adaptable
199
200
  end
200
201
  end
201
202
  end
203
+ end
204
+
@@ -1,11 +1,12 @@
1
1
  # The Adapters module contains adapters for Documentation, Origin, SourcePosition, and Loader.
2
2
  #
3
- module Puppet::Pops::Adapters
3
+ module Puppet::Pops
4
+ module Adapters
4
5
  # A documentation adapter adapts an object with a documentation string.
5
6
  # (The intended use is for a source text parser to extract documentation and store this
6
7
  # in DocumentationAdapter instances).
7
8
  #
8
- class DocumentationAdapter < Puppet::Pops::Adaptable::Adapter
9
+ class DocumentationAdapter < Adaptable::Adapter
9
10
  # @return [String] The documentation associated with an object
10
11
  attr_accessor :documentation
11
12
  end
@@ -19,10 +20,11 @@ module Puppet::Pops::Adapters
19
20
  # @note It is relatively expensive to compute line and position on line - it is not something that
20
21
  # should be done for every token or model object.
21
22
  #
22
- # @see Puppet::Pops::Utils#find_adapter, Puppet::Pops::Utils#find_closest_positioned
23
+ # @see Utils#find_adapter, Utils#find_closest_positioned
23
24
  #
24
- class SourcePosAdapter < Puppet::Pops::Adaptable::Adapter
25
+ class SourcePosAdapter < Adaptable::Adapter
25
26
  attr_accessor :locator
27
+ attr_reader :adapted
26
28
 
27
29
  def self.create_adapter(o)
28
30
  new(o)
@@ -44,10 +46,10 @@ module Puppet::Pops::Adapters
44
46
  raise ArgumentError, "InternalError: SourcePosAdapter for something that has no locator among parents"
45
47
  end
46
48
  case
47
- when o.is_a?(Puppet::Pops::Model::Program)
49
+ when o.is_a?(Model::Program)
48
50
  return o.locator
49
51
  # TODO_HEREDOC use case of SubLocator instead
50
- when o.is_a?(Puppet::Pops::Model::SubLocatedExpression) && !(found_locator = o.locator).nil?
52
+ when o.is_a?(Model::SubLocatedExpression) && !(found_locator = o.locator).nil?
51
53
  return found_locator
52
54
  when adapter = self.class.get(o)
53
55
  return adapter.locator
@@ -82,7 +84,7 @@ module Puppet::Pops::Adapters
82
84
 
83
85
  # Extracts the text represented by this source position (the string is obtained from the locator)
84
86
  def extract_text
85
- locator.string.slice(offset, length)
87
+ locator.extract_text(offset, length)
86
88
  end
87
89
 
88
90
  def extract_tree_text
@@ -90,11 +92,12 @@ module Puppet::Pops::Adapters
90
92
  last = first + @adapted.length
91
93
  @adapted.eAllContents.each do |m|
92
94
  m_offset = m.offset
95
+ next if m_offset.nil?
93
96
  first = m_offset if m_offset < first
94
97
  m_last = m_offset + m.length
95
98
  last = m_last if m_last > last
96
99
  end
97
- locator.string.slice(first, last-first)
100
+ locator.extract_text(first, last-first)
98
101
  end
99
102
 
100
103
  # Produces an URI with path?line=n&pos=n. If origin is unknown the URI is string:?line=n&pos=n
@@ -105,17 +108,82 @@ module Puppet::Pops::Adapters
105
108
  end
106
109
  end
107
110
 
108
- # A LoaderAdapter adapts an object with a {Puppet::Pops::Loader}. This is used to make further loading from the
111
+ # A LoaderAdapter adapts an object with a {Loader}. This is used to make further loading from the
109
112
  # perspective of the adapted object take place in the perspective of this Loader.
110
113
  #
111
114
  # It is typically enough to adapt the root of a model as a search is made towards the root of the model
112
115
  # until a loader is found, but there is no harm in duplicating this information provided a contained
113
116
  # object is adapted with the correct loader.
114
117
  #
115
- # @see Puppet::Pops::Utils#find_adapter
118
+ # @see Utils#find_adapter
116
119
  #
117
- class LoaderAdapter < Puppet::Pops::Adaptable::Adapter
118
- # @return [Puppet::Pops::Loader::Loader] the loader
120
+ class LoaderAdapter < Adaptable::Adapter
121
+ # @return [Loader::Loader] the loader
119
122
  attr_accessor :loader
123
+
124
+ # Finds the loader to use when loading originates from the source position of the given argument.
125
+ #
126
+ # @param instance [Model::PopsObject] The model object
127
+ # @param scope [Puppet::Parser::Scope] The scope to use
128
+ # @return [Loader,nil] the found loader or `nil` if it could not be found
129
+ #
130
+ def self.loader_for_model_object(model, scope)
131
+ # find the loader that loaded the code, or use the private_environment_loader (sees env + all modules)
132
+ adapter = Utils.find_adapter(model, self)
133
+ return adapter.loader unless adapter.nil?
134
+
135
+ if scope.nil?
136
+ loaders = Puppet.lookup(:loaders) { nil }
137
+ loaders.nil? ? nil : loaders.private_environment_loader
138
+ else
139
+ # Use source location to determine calling module, or use the private_environment_loader (sees env + all modules)
140
+ # This is necessary since not all .pp files are loaded by a Loader (see PUP-1833)
141
+ adapter = adapt_by_source(scope, model)
142
+ adapter.nil? ? scope.compiler.loaders.private_environment_loader : adapter.loader
143
+ end
144
+ end
145
+
146
+ # Attempts to find the module that `instance` originates from by looking at it's {SourcePosAdapter} and
147
+ # compare the `locator.file` found there with the module paths given in the environment found in the
148
+ # given `scope`. If the file is found to be relative to a path, then the first segment of the relative
149
+ # path is interpreted as the name of a module. The object that the {SourcePosAdapter} is adapted to
150
+ # will then be adapted to the private loader for that module and that adapter is returned.
151
+ #
152
+ # The method returns `nil` when no module could be found.
153
+ #
154
+ # @param scope
155
+ # @param instance
156
+ def self.adapt_by_source(scope, instance)
157
+ source_pos = Utils.find_adapter(instance, SourcePosAdapter)
158
+ unless source_pos.nil?
159
+ mod = find_module_for_file(scope.environment, source_pos.locator.file)
160
+ unless mod.nil?
161
+ adapter = LoaderAdapter.adapt(source_pos.adapted)
162
+ adapter.loader = scope.compiler.loaders.private_loader_for_module(mod.name)
163
+ return adapter
164
+ end
165
+ end
166
+ nil
167
+ end
168
+
169
+ def self.find_module_for_file(environment, file)
170
+ return nil if file.nil?
171
+ file_path = Pathname.new(file)
172
+ environment.modulepath.each do |path|
173
+ begin
174
+ relative_path = file_path.relative_path_from(Pathname.new(path)).to_s.split(File::SEPARATOR)
175
+ rescue ArgumentError
176
+ # file_path was not relative to the module_path. That's OK.
177
+ next
178
+ end
179
+ if relative_path.length > 1
180
+ mod = environment.module(relative_path[0])
181
+ return mod unless mod.nil?
182
+ end
183
+ end
184
+ nil
185
+ end
186
+ private_class_method :find_module_for_file
120
187
  end
121
188
  end
189
+ end