puppet 4.3.2 → 4.4.0

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

Potentially problematic release.


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

Files changed (487) hide show
  1. checksums.yaml +4 -4
  2. data/COMMITTERS.md +2 -2
  3. data/CONTRIBUTING.md +6 -6
  4. data/LICENSE +1 -1
  5. data/README.md +8 -9
  6. data/conf/auth.conf +2 -2
  7. data/ext/README.environment +1 -1
  8. data/ext/debian/README.source +1 -1
  9. data/ext/debian/control +1 -1
  10. data/ext/debian/copyright +4 -4
  11. data/ext/debian/puppetmaster.README.debian +11 -9
  12. data/ext/emacs/puppet-mode.el +1 -1
  13. data/ext/envpuppet +2 -2
  14. data/ext/ips/puppetagent.xml +1 -1
  15. data/ext/ips/puppetmaster.xml +1 -1
  16. data/ext/project_data.yaml +8 -0
  17. data/ext/puppet-test +3 -3
  18. data/ext/rack/example-passenger-vhost.conf +1 -1
  19. data/ext/redhat/puppet.spec.erb +2 -2
  20. data/ext/regexp_nodes/regexp_nodes.rb +1 -1
  21. data/ext/solaris/pkginfo +1 -1
  22. data/ext/solaris/smf/puppet.xml +1 -1
  23. data/ext/suse/puppet.spec +2 -2
  24. data/ext/upload_facts.rb +1 -1
  25. data/ext/windows/puppet_interactive.bat +6 -0
  26. data/ext/windows/puppet_shell.bat +9 -0
  27. data/ext/windows/run_puppet_interactive.bat +9 -0
  28. data/ext/yaml_nodes.rb +1 -1
  29. data/install.rb +30 -20
  30. data/lib/puppet/agent.rb +1 -1
  31. data/lib/puppet/application/agent.rb +4 -2
  32. data/lib/puppet/application/apply.rb +7 -4
  33. data/lib/puppet/application/cert.rb +1 -1
  34. data/lib/puppet/application/device.rb +1 -1
  35. data/lib/puppet/application/filebucket.rb +1 -1
  36. data/lib/puppet/application/inspect.rb +1 -1
  37. data/lib/puppet/application/lookup.rb +4 -4
  38. data/lib/puppet/application/master.rb +2 -2
  39. data/lib/puppet/application/resource.rb +1 -1
  40. data/lib/puppet/configurer.rb +100 -22
  41. data/lib/puppet/data_providers/hiera_config.rb +28 -3
  42. data/lib/puppet/data_providers/hiera_interpolate.rb +30 -15
  43. data/lib/puppet/data_providers/hiera_support.rb +1 -1
  44. data/lib/puppet/data_providers/json_data_provider_factory.rb +2 -2
  45. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +2 -2
  46. data/lib/puppet/defaults.rb +65 -19
  47. data/lib/puppet/environments.rb +3 -1
  48. data/lib/puppet/face/config.rb +1 -1
  49. data/lib/puppet/face/epp.rb +1 -1
  50. data/lib/puppet/face/help/man.erb +1 -1
  51. data/lib/puppet/face/module/install.rb +6 -6
  52. data/lib/puppet/face/parser.rb +12 -9
  53. data/lib/puppet/face/status.rb +2 -1
  54. data/lib/puppet/feature/cfpropertylist.rb +3 -0
  55. data/lib/puppet/feature/telnet.rb +9 -0
  56. data/lib/puppet/file_serving/http_metadata.rb +46 -0
  57. data/lib/puppet/file_serving/metadata.rb +18 -2
  58. data/lib/puppet/file_serving/terminus_selector.rb +2 -0
  59. data/lib/puppet/file_system.rb +2 -2
  60. data/lib/puppet/file_system/file_impl.rb +2 -2
  61. data/lib/puppet/file_system/memory_impl.rb +1 -1
  62. data/lib/puppet/file_system/uniquefile.rb +1 -1
  63. data/lib/puppet/forge.rb +1 -1
  64. data/lib/puppet/forge/repository.rb +1 -31
  65. data/lib/puppet/functions.rb +45 -6
  66. data/lib/puppet/functions/assert_type.rb +9 -9
  67. data/lib/puppet/functions/each.rb +5 -13
  68. data/lib/puppet/functions/filter.rb +5 -14
  69. data/lib/puppet/functions/map.rb +6 -14
  70. data/lib/puppet/functions/reduce.rb +5 -13
  71. data/lib/puppet/functions/reverse_each.rb +82 -0
  72. data/lib/puppet/functions/scanf.rb +15 -18
  73. data/lib/puppet/functions/slice.rb +22 -36
  74. data/lib/puppet/functions/split.rb +2 -2
  75. data/lib/puppet/functions/step.rb +88 -0
  76. data/lib/puppet/functions/type.rb +70 -0
  77. data/lib/puppet/graph/rb_tree_map.rb +1 -1
  78. data/lib/puppet/indirector/catalog/compiler.rb +188 -5
  79. data/lib/puppet/indirector/file_content/http.rb +15 -0
  80. data/lib/puppet/indirector/file_metadata/http.rb +27 -0
  81. data/lib/puppet/indirector/generic_http.rb +16 -0
  82. data/lib/puppet/indirector/node/exec.rb +1 -1
  83. data/lib/puppet/indirector/node/ldap.rb +1 -1
  84. data/lib/puppet/indirector/rest.rb +2 -1
  85. data/lib/puppet/info_service/class_information_service.rb +13 -12
  86. data/lib/puppet/loaders.rb +1 -0
  87. data/lib/puppet/module.rb +3 -0
  88. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +9 -2
  89. data/lib/puppet/module_tool/skeleton/templates/generator/spec/classes/init_spec.rb.erb +1 -1
  90. data/lib/puppet/module_tool/skeleton/templates/generator/tests/init.pp.erb +2 -2
  91. data/lib/puppet/module_tool/tar/mini.rb +3 -3
  92. data/lib/puppet/network/http/pool.rb +9 -0
  93. data/lib/puppet/node.rb +1 -1
  94. data/lib/puppet/node/environment.rb +11 -2
  95. data/lib/puppet/parser/ast/pops_bridge.rb +19 -22
  96. data/lib/puppet/parser/compiler.rb +3 -3
  97. data/lib/puppet/parser/environment_compiler.rb +0 -1
  98. data/lib/puppet/parser/functions.rb +28 -16
  99. data/lib/puppet/parser/functions/fqdn_rand.rb +1 -1
  100. data/lib/puppet/parser/functions/inline_template.rb +1 -1
  101. data/lib/puppet/parser/functions/map.rb +1 -1
  102. data/lib/puppet/parser/functions/scanf.rb +15 -26
  103. data/lib/puppet/parser/functions/slice.rb +17 -24
  104. data/lib/puppet/parser/functions/split.rb +1 -1
  105. data/lib/puppet/parser/resource.rb +19 -17
  106. data/lib/puppet/parser/scope.rb +176 -5
  107. data/lib/puppet/plugins/data_providers/data_provider.rb +54 -13
  108. data/lib/puppet/pops.rb +0 -8
  109. data/lib/puppet/pops/adaptable.rb +4 -1
  110. data/lib/puppet/pops/adapters.rb +38 -13
  111. data/lib/puppet/pops/binder/binder.rb +21 -17
  112. data/lib/puppet/pops/binder/binder_issues.rb +8 -6
  113. data/lib/puppet/pops/binder/bindings_checker.rb +12 -8
  114. data/lib/puppet/pops/binder/bindings_composer.rb +16 -12
  115. data/lib/puppet/pops/binder/bindings_factory.rb +108 -104
  116. data/lib/puppet/pops/binder/bindings_model.rb +49 -47
  117. data/lib/puppet/pops/binder/config/diagnostic_producer.rb +10 -6
  118. data/lib/puppet/pops/binder/injector.rb +53 -48
  119. data/lib/puppet/pops/binder/key_factory.rb +10 -6
  120. data/lib/puppet/pops/binder/producers.rb +67 -62
  121. data/lib/puppet/pops/evaluator/access_operator.rb +95 -93
  122. data/lib/puppet/pops/evaluator/closure.rb +84 -68
  123. data/lib/puppet/pops/evaluator/collector_transformer.rb +18 -14
  124. data/lib/puppet/pops/evaluator/collectors/exported_collector.rb +0 -1
  125. data/lib/puppet/pops/evaluator/compare_operator.rb +13 -9
  126. data/lib/puppet/pops/evaluator/epp_evaluator.rb +9 -8
  127. data/lib/puppet/pops/evaluator/evaluator_impl.rb +78 -76
  128. data/lib/puppet/pops/evaluator/json_strict_literal_evaluator.rb +85 -0
  129. data/lib/puppet/pops/evaluator/relationship_operator.rb +13 -11
  130. data/lib/puppet/pops/evaluator/runtime3_converter.rb +5 -0
  131. data/lib/puppet/pops/evaluator/runtime3_support.rb +41 -45
  132. data/lib/puppet/pops/issue_reporter.rb +6 -4
  133. data/lib/puppet/pops/issues.rb +34 -11
  134. data/lib/puppet/pops/loader/base_loader.rb +1 -1
  135. data/lib/puppet/pops/loader/loader.rb +1 -1
  136. data/lib/puppet/pops/loader/loader_paths.rb +15 -0
  137. data/lib/puppet/pops/loader/module_loaders.rb +17 -13
  138. data/lib/puppet/pops/loader/puppet_function_instantiator.rb +16 -12
  139. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +16 -3
  140. data/lib/puppet/pops/loader/type_definition_instantiator.rb +55 -0
  141. data/lib/puppet/pops/loaders.rb +51 -9
  142. data/lib/puppet/pops/lookup.rb +14 -12
  143. data/lib/puppet/pops/merge_strategy.rb +16 -19
  144. data/lib/puppet/pops/model/factory.rb +26 -2
  145. data/lib/puppet/pops/model/model.rb +8 -8
  146. data/lib/puppet/pops/model/model_label_provider.rb +13 -7
  147. data/lib/puppet/pops/model/model_meta.rb +17 -0
  148. data/lib/puppet/pops/model/model_tree_dumper.rb +8 -0
  149. data/lib/puppet/pops/parser/egrammar.ra +38 -14
  150. data/lib/puppet/pops/parser/eparser.rb +1353 -1276
  151. data/lib/puppet/pops/parser/epp_support.rb +11 -7
  152. data/lib/puppet/pops/parser/evaluating_parser.rb +14 -10
  153. data/lib/puppet/pops/parser/heredoc_support.rb +15 -11
  154. data/lib/puppet/pops/parser/lexer2.rb +26 -19
  155. data/lib/puppet/pops/parser/lexer_support.rb +85 -7
  156. data/lib/puppet/pops/parser/locator.rb +21 -0
  157. data/lib/puppet/pops/parser/parser_support.rb +19 -16
  158. data/lib/puppet/pops/parser/slurp_support.rb +11 -7
  159. data/lib/puppet/pops/types/class_loader.rb +23 -19
  160. data/lib/puppet/pops/types/enumeration.rb +9 -26
  161. data/lib/puppet/pops/types/iterable.rb +308 -0
  162. data/lib/puppet/pops/types/recursion_guard.rb +82 -0
  163. data/lib/puppet/pops/types/type_acceptor.rb +25 -0
  164. data/lib/puppet/pops/types/type_asserter.rb +10 -9
  165. data/lib/puppet/pops/types/type_calculator.rb +138 -381
  166. data/lib/puppet/pops/types/type_factory.rb +91 -57
  167. data/lib/puppet/pops/types/type_formatter.rb +334 -0
  168. data/lib/puppet/pops/types/type_mismatch_describer.rb +226 -59
  169. data/lib/puppet/pops/types/type_parser.rb +159 -112
  170. data/lib/puppet/pops/types/types.rb +2057 -1247
  171. data/lib/puppet/pops/utils.rb +11 -10
  172. data/lib/puppet/pops/validation.rb +11 -9
  173. data/lib/puppet/pops/validation/checker4_0.rb +83 -55
  174. data/lib/puppet/pops/validation/validator_factory_4_0.rb +8 -4
  175. data/lib/puppet/provider/aixobject.rb +1 -1
  176. data/lib/puppet/provider/augeas/augeas.rb +1 -1
  177. data/lib/puppet/provider/cron/crontab.rb +1 -1
  178. data/lib/puppet/provider/exec/windows.rb +1 -1
  179. data/lib/puppet/provider/macauthorization/macauthorization.rb +10 -9
  180. data/lib/puppet/provider/nameservice/directoryservice.rb +35 -50
  181. data/lib/puppet/provider/package/appdmg.rb +3 -2
  182. data/lib/puppet/provider/package/dnf.rb +1 -1
  183. data/lib/puppet/provider/package/pip.rb +5 -8
  184. data/lib/puppet/provider/package/pip3.rb +1 -1
  185. data/lib/puppet/provider/package/pkg.rb +1 -1
  186. data/lib/puppet/provider/package/pkgdmg.rb +3 -2
  187. data/lib/puppet/provider/package/pkgng.rb +13 -4
  188. data/lib/puppet/provider/package/windows.rb +1 -1
  189. data/lib/puppet/provider/package/yum.rb +1 -1
  190. data/lib/puppet/provider/package/zypper.rb +19 -0
  191. data/lib/puppet/provider/service/debian.rb +2 -2
  192. data/lib/puppet/provider/service/launchd.rb +6 -18
  193. data/lib/puppet/provider/service/systemd.rb +9 -2
  194. data/lib/puppet/provider/sshkey/parsed.rb +1 -1
  195. data/lib/puppet/provider/user/aix.rb +1 -1
  196. data/lib/puppet/provider/user/directoryservice.rb +33 -58
  197. data/lib/puppet/provider/zfs/zfs.rb +1 -1
  198. data/lib/puppet/provider/zpool/zpool.rb +1 -1
  199. data/lib/puppet/reference/configuration.rb +1 -1
  200. data/lib/puppet/reference/providers.rb +1 -1
  201. data/lib/puppet/resource.rb +15 -12
  202. data/lib/puppet/resource/capability_finder.rb +20 -13
  203. data/lib/puppet/resource/catalog.rb +60 -3
  204. data/lib/puppet/resource/status.rb +11 -2
  205. data/lib/puppet/resource/type.rb +28 -38
  206. data/lib/puppet/settings.rb +1 -1
  207. data/lib/puppet/settings/config_file.rb +1 -1
  208. data/lib/puppet/settings/environment_conf.rb +13 -5
  209. data/lib/puppet/ssl/certificate_factory.rb +3 -3
  210. data/lib/puppet/ssl/certificate_request.rb +4 -4
  211. data/lib/puppet/ssl/certificate_signer.rb +1 -1
  212. data/lib/puppet/ssl/validator/default_validator.rb +1 -1
  213. data/lib/puppet/test/test_helper.rb +16 -4
  214. data/lib/puppet/transaction.rb +15 -2
  215. data/lib/puppet/transaction/additional_resource_generator.rb +6 -2
  216. data/lib/puppet/transaction/report.rb +31 -1
  217. data/lib/puppet/transaction/resource_harness.rb +0 -25
  218. data/lib/puppet/type.rb +11 -11
  219. data/lib/puppet/type/augeas.rb +1 -1
  220. data/lib/puppet/type/cron.rb +12 -12
  221. data/lib/puppet/type/file.rb +91 -39
  222. data/lib/puppet/type/file/checksum_value.rb +53 -0
  223. data/lib/puppet/type/file/content.rb +26 -111
  224. data/lib/puppet/type/file/data_sync.rb +84 -0
  225. data/lib/puppet/type/file/ensure.rb +17 -14
  226. data/lib/puppet/type/file/selcontext.rb +1 -1
  227. data/lib/puppet/type/file/source.rb +103 -18
  228. data/lib/puppet/type/filebucket.rb +1 -1
  229. data/lib/puppet/type/interface.rb +8 -3
  230. data/lib/puppet/type/macauthorization.rb +1 -1
  231. data/lib/puppet/type/package.rb +6 -0
  232. data/lib/puppet/type/schedule.rb +1 -1
  233. data/lib/puppet/type/stage.rb +1 -1
  234. data/lib/puppet/type/user.rb +19 -17
  235. data/lib/puppet/type/yumrepo.rb +20 -0
  236. data/lib/puppet/util.rb +109 -22
  237. data/lib/puppet/util/autoload.rb +16 -11
  238. data/lib/puppet/util/checksums.rb +74 -31
  239. data/lib/puppet/util/execution.rb +1 -1
  240. data/lib/puppet/util/http_proxy.rb +72 -0
  241. data/lib/puppet/util/log.rb +2 -0
  242. data/lib/puppet/util/logging.rb +43 -1
  243. data/lib/puppet/util/monkey_patches.rb +2 -2
  244. data/lib/puppet/util/multi_match.rb +51 -0
  245. data/lib/puppet/util/network_device/cisco/device.rb +10 -2
  246. data/lib/puppet/util/network_device/cisco/interface.rb +21 -8
  247. data/lib/puppet/util/network_device/transport/ssh.rb +7 -3
  248. data/lib/puppet/util/network_device/transport/telnet.rb +39 -36
  249. data/lib/puppet/util/plist.rb +130 -0
  250. data/lib/puppet/util/resource_template.rb +1 -1
  251. data/lib/puppet/util/run_mode.rb +2 -2
  252. data/lib/puppet/util/skip_tags.rb +9 -0
  253. data/lib/puppet/util/windows/access_control_entry.rb +1 -1
  254. data/lib/puppet/util/windows/access_control_list.rb +3 -3
  255. data/lib/puppet/util/windows/adsi.rb +4 -4
  256. data/lib/puppet/util/windows/api_types.rb +24 -18
  257. data/lib/puppet/util/windows/com.rb +3 -3
  258. data/lib/puppet/util/windows/error.rb +1 -1
  259. data/lib/puppet/util/windows/file.rb +8 -8
  260. data/lib/puppet/util/windows/principal.rb +23 -14
  261. data/lib/puppet/util/windows/process.rb +78 -11
  262. data/lib/puppet/util/windows/registry.rb +1 -1
  263. data/lib/puppet/util/windows/root_certs.rb +5 -5
  264. data/lib/puppet/util/windows/security.rb +33 -35
  265. data/lib/puppet/util/windows/security_descriptor.rb +1 -1
  266. data/lib/puppet/util/windows/sid.rb +42 -4
  267. data/lib/puppet/util/windows/taskscheduler.rb +15 -15
  268. data/lib/puppet/util/windows/user.rb +10 -10
  269. data/lib/puppet/vendor/deep_merge/deep_merge.gemspec +1 -1
  270. data/lib/puppet/vendor/pathspec/LICENSE +2 -2
  271. data/lib/puppet/vendor/pathspec/README.md +1 -1
  272. data/lib/puppet/vendor/rgen/README.rdoc +1 -1
  273. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +14 -0
  274. data/lib/puppet/version.rb +1 -1
  275. data/lib/semver.rb +17 -1
  276. data/man/man5/puppet.conf.5 +12 -12
  277. data/man/man8/extlookup2hiera.8 +1 -1
  278. data/man/man8/puppet-agent.8 +2 -2
  279. data/man/man8/puppet-apply.8 +2 -2
  280. data/man/man8/puppet-ca.8 +2 -2
  281. data/man/man8/puppet-catalog.8 +2 -2
  282. data/man/man8/puppet-cert.8 +2 -2
  283. data/man/man8/puppet-certificate.8 +2 -2
  284. data/man/man8/puppet-certificate_request.8 +2 -2
  285. data/man/man8/puppet-certificate_revocation_list.8 +2 -2
  286. data/man/man8/puppet-config.8 +3 -3
  287. data/man/man8/puppet-describe.8 +1 -1
  288. data/man/man8/puppet-device.8 +1 -1
  289. data/man/man8/puppet-doc.8 +1 -1
  290. data/man/man8/puppet-epp.8 +2 -2
  291. data/man/man8/puppet-facts.8 +2 -2
  292. data/man/man8/puppet-file.8 +2 -2
  293. data/man/man8/puppet-filebucket.8 +2 -2
  294. data/man/man8/puppet-help.8 +2 -2
  295. data/man/man8/puppet-inspect.8 +2 -2
  296. data/man/man8/puppet-key.8 +2 -2
  297. data/man/man8/puppet-man.8 +2 -2
  298. data/man/man8/puppet-master.8 +2 -2
  299. data/man/man8/puppet-module.8 +9 -9
  300. data/man/man8/puppet-node.8 +2 -2
  301. data/man/man8/puppet-parser.8 +2 -2
  302. data/man/man8/puppet-plugin.8 +2 -2
  303. data/man/man8/puppet-report.8 +2 -2
  304. data/man/man8/puppet-resource.8 +2 -2
  305. data/man/man8/puppet-resource_type.8 +2 -2
  306. data/man/man8/puppet-status.8 +3 -3
  307. data/man/man8/puppet.8 +1 -1
  308. data/spec/fixtures/module.tar.gz +0 -0
  309. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +1 -0
  310. data/spec/fixtures/unit/functions/lookup/environments/production/modules/bad_data/manifests/init.pp +0 -1
  311. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/data/empty.json +0 -0
  312. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/hiera.yaml +5 -0
  313. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/manifests/init.pp +2 -0
  314. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_json/metadata.json +9 -0
  315. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/data/empty.yaml +1 -0
  316. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/hiera.yaml +5 -0
  317. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/manifests/init.pp +2 -0
  318. data/spec/fixtures/unit/functions/lookup/environments/production/modules/empty_yaml/metadata.json +9 -0
  319. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +2 -1
  320. data/spec/fixtures/unit/module/trailing-comma.json +1 -1
  321. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/manifests/init.pp +3 -1
  322. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/usee/types/zero.pp +1 -0
  323. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseeone.pp +1 -0
  324. data/spec/fixtures/unit/pops/loaders/loaders/dependent_modules_with_metadata/modules/user/types/withuseezero.pp +1 -0
  325. data/spec/fixtures/unit/provider/package/yum/yum-check-update-broken-notices.txt +187 -0
  326. data/spec/fixtures/unit/provider/sshkey/parsed/sample_with_blank_lines +8 -0
  327. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_fetch_if_not_on_the_local_disk.yml +205 -0
  328. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_not_update_if_content_on_disk_is_up-to-date.yml +213 -0
  329. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_md5/should_update_if_content_differs_on_disk.yml +213 -0
  330. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_mtime_is_older_on_disk.yml +205 -0
  331. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_no_header_specified.yml +197 -0
  332. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_fetch_if_not_on_the_local_disk.yml +205 -0
  333. data/spec/fixtures/vcr/cassettes/Puppet_Type_File/when_sourcing/from_http/using_mtime/should_not_update_if_mtime_is_newer_on_disk.yml +205 -0
  334. data/spec/integration/defaults_spec.rb +14 -2
  335. data/spec/integration/file_system/uniquefile_spec.rb +29 -0
  336. data/spec/integration/module_tool/tar/mini_spec.rb +28 -0
  337. data/spec/integration/node/environment_spec.rb +13 -0
  338. data/spec/integration/parser/dynamic_scoping_spec.rb +67 -0
  339. data/spec/integration/parser/parameter_defaults_spec.rb +336 -0
  340. data/spec/integration/parser/undef_param_spec.rb +8 -0
  341. data/spec/integration/provider/yumrepo_spec.rb +1 -1
  342. data/spec/integration/test/test_helper_spec.rb +28 -0
  343. data/spec/integration/transaction/report_spec.rb +16 -0
  344. data/spec/integration/transaction_spec.rb +11 -0
  345. data/spec/integration/type/file_spec.rb +194 -4
  346. data/spec/integration/type/package_spec.rb +5 -1
  347. data/spec/integration/type/tidy_spec.rb +21 -9
  348. data/spec/integration/util/execution_spec.rb +22 -0
  349. data/spec/integration/util/windows/principal_spec.rb +90 -4
  350. data/spec/integration/util/windows/process_spec.rb +31 -0
  351. data/spec/integration/util/windows/security_spec.rb +6 -6
  352. data/spec/integration/util/windows/user_spec.rb +1 -1
  353. data/spec/integration/util_spec.rb +49 -27
  354. data/spec/lib/puppet_spec/compiler.rb +17 -0
  355. data/spec/lib/puppet_spec/files.rb +2 -2
  356. data/spec/lib/puppet_spec/pops.rb +13 -0
  357. data/spec/shared_behaviours/iterative_functions.rb +1 -1
  358. data/spec/shared_contexts/types_setup.rb +96 -0
  359. data/spec/unit/agent_spec.rb +1 -0
  360. data/spec/unit/application/agent_spec.rb +10 -0
  361. data/spec/unit/application/apply_spec.rb +9 -0
  362. data/spec/unit/configurer/downloader_spec.rb +5 -5
  363. data/spec/unit/configurer_spec.rb +271 -39
  364. data/spec/unit/data_providers/hiera_interpolation_spec.rb +57 -0
  365. data/spec/unit/defaults_spec.rb +15 -0
  366. data/spec/unit/environments_spec.rb +24 -4
  367. data/spec/unit/face/parser_spec.rb +43 -2
  368. data/spec/unit/file_serving/http_metadata_spec.rb +85 -0
  369. data/spec/unit/file_serving/metadata_spec.rb +50 -0
  370. data/spec/unit/file_serving/terminus_selector_spec.rb +12 -2
  371. data/spec/unit/file_system_spec.rb +26 -0
  372. data/spec/unit/functions/assert_type_spec.rb +36 -2
  373. data/spec/unit/functions/defined_spec.rb +2 -2
  374. data/spec/unit/functions/epp_spec.rb +11 -3
  375. data/spec/unit/functions/lookup_spec.rb +58 -13
  376. data/spec/unit/functions/regsubst_spec.rb +1 -1
  377. data/spec/unit/functions/reverse_each_spec.rb +108 -0
  378. data/spec/unit/functions/step_spec.rb +113 -0
  379. data/spec/unit/functions/type_spec.rb +35 -0
  380. data/spec/unit/functions4_spec.rb +61 -5
  381. data/spec/unit/indirector/catalog/compiler_spec.rb +705 -4
  382. data/spec/unit/indirector/file_bucket_file/file_spec.rb +1 -1
  383. data/spec/unit/indirector/indirection_spec.rb +1 -1
  384. data/spec/unit/info_service_spec.rb +94 -32
  385. data/spec/unit/module_spec.rb +14 -0
  386. data/spec/unit/module_tool/applications/builder_spec.rb +4 -4
  387. data/spec/unit/network/authstore_spec.rb +1 -1
  388. data/spec/unit/network/http/connection_spec.rb +1 -0
  389. data/spec/unit/network/http/pool_spec.rb +30 -0
  390. data/spec/unit/node_spec.rb +1 -1
  391. data/spec/unit/parser/compiler_spec.rb +16 -0
  392. data/spec/unit/parser/scope_spec.rb +28 -11
  393. data/spec/unit/pops/evaluator/access_ops_spec.rb +3 -3
  394. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +3 -0
  395. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +7 -1
  396. data/spec/unit/pops/evaluator/evaluator_rspec_helper.rb +4 -4
  397. data/spec/unit/pops/evaluator/json_strict_literal_evaluator_spec.rb +63 -0
  398. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +6 -0
  399. data/spec/unit/pops/loaders/dependency_loader_spec.rb +53 -0
  400. data/spec/unit/pops/loaders/loaders_spec.rb +44 -1
  401. data/spec/unit/pops/parser/lexer2_spec.rb +112 -3
  402. data/spec/unit/pops/parser/parse_calls_spec.rb +8 -0
  403. data/spec/unit/pops/parser/parser_spec.rb +10 -0
  404. data/spec/unit/pops/parser/source_pos_adapter_spec.rb +26 -0
  405. data/spec/unit/pops/types/iterable_spec.rb +262 -0
  406. data/spec/unit/pops/types/recursion_guard_spec.rb +91 -0
  407. data/spec/unit/pops/types/type_acceptor_spec.rb +105 -0
  408. data/spec/unit/pops/types/type_asserter_spec.rb +43 -0
  409. data/spec/unit/pops/types/type_calculator_spec.rb +275 -373
  410. data/spec/unit/pops/types/type_formatter_spec.rb +280 -0
  411. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +152 -0
  412. data/spec/unit/pops/types/type_parser_spec.rb +58 -13
  413. data/spec/unit/pops/types/types_spec.rb +241 -0
  414. data/spec/unit/pops/validator/validator_spec.rb +100 -43
  415. data/spec/unit/provider/cron/parsed_spec.rb +1 -0
  416. data/spec/unit/provider/macauthorization_spec.rb +5 -2
  417. data/spec/unit/provider/nameservice/directoryservice_spec.rb +14 -19
  418. data/spec/unit/provider/package/appdmg_spec.rb +3 -3
  419. data/spec/unit/provider/package/dnf_spec.rb +16 -0
  420. data/spec/unit/provider/package/pip3_spec.rb +60 -42
  421. data/spec/unit/provider/package/pip_spec.rb +47 -34
  422. data/spec/unit/provider/package/pkgdmg_spec.rb +18 -9
  423. data/spec/unit/provider/package/pkgng_spec.rb +4 -2
  424. data/spec/unit/provider/package/yum_spec.rb +11 -0
  425. data/spec/unit/provider/package/zypper_spec.rb +14 -0
  426. data/spec/unit/provider/service/launchd_spec.rb +17 -35
  427. data/spec/unit/provider/service/systemd_spec.rb +7 -0
  428. data/spec/unit/provider/sshkey/parsed_spec.rb +20 -19
  429. data/spec/unit/provider/user/directoryservice_spec.rb +40 -59
  430. data/spec/unit/resource/capability_finder_spec.rb +28 -15
  431. data/spec/unit/resource/catalog_spec.rb +33 -1
  432. data/spec/unit/resource/type_spec.rb +149 -7
  433. data/spec/unit/resource_spec.rb +96 -57
  434. data/spec/unit/settings/environment_conf_spec.rb +18 -1
  435. data/spec/unit/ssl/certificate_revocation_list_spec.rb +3 -3
  436. data/spec/unit/transaction/report_spec.rb +27 -0
  437. data/spec/unit/transaction/resource_harness_spec.rb +0 -47
  438. data/spec/unit/transaction_spec.rb +5 -0
  439. data/spec/unit/type/file/checksum_spec.rb +6 -0
  440. data/spec/unit/type/file/checksum_value_spec.rb +286 -0
  441. data/spec/unit/type/file/content_spec.rb +12 -193
  442. data/spec/unit/type/file/source_spec.rb +211 -119
  443. data/spec/unit/type/file_spec.rb +133 -34
  444. data/spec/unit/type/interface_spec.rb +32 -0
  445. data/spec/unit/type/macauthorization_spec.rb +4 -1
  446. data/spec/unit/type/yumrepo_spec.rb +2 -2
  447. data/spec/unit/util/filetype_spec.rb +1 -1
  448. data/spec/unit/util/http_proxy_spec.rb +2 -2
  449. data/spec/unit/util/log/destinations_spec.rb +0 -2
  450. data/spec/unit/util/logging_spec.rb +69 -0
  451. data/spec/unit/util/multi_match_spec.rb +39 -0
  452. data/spec/unit/util/network_device/cisco/device_spec.rb +253 -216
  453. data/spec/unit/util/network_device/transport/telnet_spec.rb +60 -58
  454. data/spec/unit/util/plist_spec.rb +110 -0
  455. data/spec/unit/util/resource_template_spec.rb +2 -2
  456. data/spec/unit/util/run_mode_spec.rb +27 -3
  457. data/spec/unit/util/windows/adsi_spec.rb +4 -4
  458. data/spec/unit/util/windows/api_types_spec.rb +42 -0
  459. data/spec/unit/util/windows/security_descriptor_spec.rb +3 -3
  460. data/spec/unit/util/windows/sid_spec.rb +1 -1
  461. data/spec/unit/util_spec.rb +123 -13
  462. data/tasks/cfpropertylist.rake +15 -0
  463. metadata +114 -26
  464. data/lib/puppet/vendor/load_plist.rb +0 -1
  465. data/lib/puppet/vendor/plist/CHANGELOG +0 -82
  466. data/lib/puppet/vendor/plist/MIT-LICENSE +0 -21
  467. data/lib/puppet/vendor/plist/PUPPET_README.md +0 -6
  468. data/lib/puppet/vendor/plist/README +0 -36
  469. data/lib/puppet/vendor/plist/Rakefile +0 -144
  470. data/lib/puppet/vendor/plist/docs/USAGE +0 -104
  471. data/lib/puppet/vendor/plist/docs/jamis-template.rb +0 -591
  472. data/lib/puppet/vendor/plist/lib/plist.rb +0 -22
  473. data/lib/puppet/vendor/plist/lib/plist/generator.rb +0 -224
  474. data/lib/puppet/vendor/plist/lib/plist/parser.rb +0 -225
  475. data/lib/puppet/vendor/plist/test/assets/AlbumData.xml +0 -203
  476. data/lib/puppet/vendor/plist/test/assets/Cookies.plist +0 -104
  477. data/lib/puppet/vendor/plist/test/assets/commented.plist +0 -9
  478. data/lib/puppet/vendor/plist/test/assets/example_data.bin +0 -0
  479. data/lib/puppet/vendor/plist/test/assets/example_data.jpg +0 -0
  480. data/lib/puppet/vendor/plist/test/assets/example_data.plist +0 -259
  481. data/lib/puppet/vendor/plist/test/assets/test_data_elements.plist +0 -24
  482. data/lib/puppet/vendor/plist/test/assets/test_empty_key.plist +0 -13
  483. data/lib/puppet/vendor/plist/test/test_data_elements.rb +0 -115
  484. data/lib/puppet/vendor/plist/test/test_generator.rb +0 -59
  485. data/lib/puppet/vendor/plist/test/test_generator_basic_types.rb +0 -58
  486. data/lib/puppet/vendor/plist/test/test_generator_collections.rb +0 -82
  487. data/lib/puppet/vendor/plist/test/test_parser.rb +0 -90
@@ -49,7 +49,7 @@ class Puppet::Pops::Loader::BaseLoader < Puppet::Pops::Loader::Loader
49
49
  # @api private
50
50
  #
51
51
  def set_entry(typed_name, value, origin = nil)
52
- if entry = @named_values[typed_name] then fail_redefined(entry); end
52
+ if entry = @named_values[typed_name] then fail_redefine(entry); end
53
53
  @named_values[typed_name] = Puppet::Pops::Loader::Loader::NamedEntry.new(typed_name, value, origin)
54
54
  end
55
55
 
@@ -22,7 +22,7 @@
22
22
  class Puppet::Pops::Loader::Loader
23
23
 
24
24
  # Describes the kinds of things that loaders can load
25
- LOADABLE_KINDS = [:func_4x, :func_4xpp].freeze
25
+ LOADABLE_KINDS = [:func_4x, :func_4xpp, :type_pp].freeze
26
26
 
27
27
  # Produces the value associated with the given name if already loaded, or available for loading
28
28
  # by this loader, one of its parents, or other loaders visible to this loader.
@@ -23,6 +23,8 @@ module Puppet::Pops::Loader::LoaderPaths
23
23
  result << FunctionPathPP.new(loader)
24
24
  end
25
25
  # When wanted also add FunctionPath3x to load 3x functions
26
+ when :type
27
+ result << TypePathPP.new(loader) if loader.loadables.include?(:type_pp)
26
28
  else
27
29
  # unknown types, simply produce an empty result; no paths to check, nothing to find... move along...
28
30
  []
@@ -147,6 +149,19 @@ module Puppet::Pops::Loader::LoaderPaths
147
149
  end
148
150
  end
149
151
 
152
+ class TypePathPP < PuppetSmartPath
153
+ # Navigate to directory where 'lib' is, then down again
154
+ TYPE_PATH_PP = File.join('types')
155
+
156
+ def relative_path
157
+ TYPE_PATH_PP
158
+ end
159
+
160
+ def instantiator()
161
+ Puppet::Pops::Loader::TypeDefinitionInstantiator
162
+ end
163
+ end
164
+
150
165
  # SmartPaths
151
166
  # ===
152
167
  # Holds effective SmartPath instances per type
@@ -1,4 +1,5 @@
1
-
1
+ module Puppet::Pops
2
+ module Loader
2
3
  # =ModuleLoaders
3
4
  # A ModuleLoader loads items from a single module.
4
5
  # The ModuleLoaders (ruby) module contains various such loaders. There is currently one concrete
@@ -14,12 +15,12 @@
14
15
  # internal layout etc.)
15
16
  #
16
17
  # A module loader is also not aware of the mapping of name to relative paths - this is performed by the
17
- # included module Puppet::Pops::Loader::PathBasedInstantatorConfig which knows about the map from type/name to
18
+ # included module PathBasedInstantatorConfig which knows about the map from type/name to
18
19
  # relative path, and the logic that can instantiate what is expected to be found in the content of that path.
19
20
  #
20
21
  # @api private
21
22
  #
22
- module Puppet::Pops::Loader::ModuleLoaders
23
+ module ModuleLoaders
23
24
  def self.system_loader_from(parent_loader, loaders)
24
25
  # Puppet system may be installed in a fixed location via RPM, installed as a Gem, via source etc.
25
26
  # The only way to find this across the different ways puppet can be installed is
@@ -27,7 +28,7 @@ module Puppet::Pops::Loader::ModuleLoaders
27
28
  # puppet.
28
29
  #
29
30
  puppet_lib = File.join(File.dirname(__FILE__), '../../..')
30
- Puppet::Pops::Loader::ModuleLoaders::FileBased.new(parent_loader,
31
+ ModuleLoaders::FileBased.new(parent_loader,
31
32
  loaders,
32
33
  nil,
33
34
  puppet_lib, # may or may not have a 'lib' above 'puppet'
@@ -37,7 +38,7 @@ module Puppet::Pops::Loader::ModuleLoaders
37
38
  end
38
39
 
39
40
  def self.module_loader_from(parent_loader, loaders, module_name, module_path)
40
- Puppet::Pops::Loader::ModuleLoaders::FileBased.new(parent_loader,
41
+ ModuleLoaders::FileBased.new(parent_loader,
41
42
  loaders,
42
43
  module_name,
43
44
  File.join(module_path, 'lib'),
@@ -45,7 +46,7 @@ module Puppet::Pops::Loader::ModuleLoaders
45
46
  )
46
47
  end
47
48
 
48
- class AbstractPathBasedModuleLoader < Puppet::Pops::Loader::BaseLoader
49
+ class AbstractPathBasedModuleLoader < BaseLoader
49
50
 
50
51
  # The name of the module, or nil, if this is a global "component"
51
52
  attr_reader :module_name
@@ -64,7 +65,7 @@ module Puppet::Pops::Loader::ModuleLoaders
64
65
  attr_accessor :private_loader
65
66
 
66
67
  # Initialize a kind of ModuleLoader for one module
67
- # @param parent_loader [Puppet::Pops::Loader] loader with higher priority
68
+ # @param parent_loader [Loader] loader with higher priority
68
69
  # @param module_name [String] the name of the module (non qualified name), may be nil for a global "component"
69
70
  # @param path [String] the path to the root of the module (semantics defined by subclass)
70
71
  # @param loader_name [String] a name that is used for human identification (useful when module_name is nil)
@@ -74,7 +75,7 @@ module Puppet::Pops::Loader::ModuleLoaders
74
75
 
75
76
  @module_name = module_name
76
77
  @path = path
77
- @smart_paths = Puppet::Pops::Loader::LoaderPaths::SmartPaths.new(self)
78
+ @smart_paths = LoaderPaths::SmartPaths.new(self)
78
79
  @loaders = loaders
79
80
  @loadables = loadables
80
81
  unless (loadables - LOADABLE_KINDS).empty?
@@ -87,8 +88,8 @@ module Puppet::Pops::Loader::ModuleLoaders
87
88
  end
88
89
 
89
90
  # Finds typed/named entity in this module
90
- # @param typed_name [Puppet::Pops::Loader::TypedName] the type/name to find
91
- # @return [Puppet::Pops::Loader::Loader::NamedEntry, nil found/created entry, or nil if not found
91
+ # @param typed_name [TypedName] the type/name to find
92
+ # @return [Loader::NamedEntry, nil found/created entry, or nil if not found
92
93
  #
93
94
  def find(typed_name)
94
95
  # Assume it is a global name, and that all parts of the name should be used when looking up
@@ -115,6 +116,7 @@ module Puppet::Pops::Loader::ModuleLoaders
115
116
  case typed_name.type
116
117
  when :function
117
118
  when :resource_type
119
+ when :type
118
120
  else
119
121
  # anything else cannot possibly be in this module
120
122
  # TODO: should not be allowed anyway... may have to revisit this decision
@@ -201,7 +203,7 @@ module Puppet::Pops::Loader::ModuleLoaders
201
203
 
202
204
  # Create a kind of ModuleLoader for one module (Puppet Module, or module like)
203
205
  #
204
- # @param parent_loader [Puppet::Pops::Loader::Loader] typically the loader for the environment or root
206
+ # @param parent_loader [Loader] typically the loader for the environment or root
205
207
  # @param module_name [String] the name of the module (non qualified name), may be nil for "modules" only containing globals
206
208
  # @param path [String] the path to the root of the module (semantics defined by subclass)
207
209
  # @param loader_name [String] a name that identifies the loader
@@ -231,7 +233,7 @@ module Puppet::Pops::Loader::ModuleLoaders
231
233
  end
232
234
 
233
235
  def get_contents(effective_path)
234
- Puppet::FileSystem.read(effective_path)
236
+ Puppet::FileSystem.read(effective_path, :encoding => 'utf-8')
235
237
  end
236
238
  end
237
239
 
@@ -246,7 +248,7 @@ module Puppet::Pops::Loader::ModuleLoaders
246
248
  # @api private
247
249
  #
248
250
  class GemBased < FileBased
249
- include Puppet::Pops::Loader::GemSupport
251
+ include GemSupport
250
252
 
251
253
  attr_reader :gem_ref
252
254
 
@@ -267,3 +269,5 @@ module Puppet::Pops::Loader::ModuleLoaders
267
269
  end
268
270
  end
269
271
  end
272
+ end
273
+ end
@@ -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
@@ -44,7 +46,7 @@ class Puppet::Pops::Loader::PuppetFunctionInstantiator
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
48
  private_loader = loader.private_loader
47
- Puppet::Pops::Adapters::LoaderAdapter.adapt(the_function_definition).loader = private_loader
49
+ Adapters::LoaderAdapter.adapt(the_function_definition).loader = private_loader
48
50
 
49
51
  # TODO: Cheating wrt. scope - assuming it is found in the context
50
52
  closure_scope = Puppet.lookup(:global_scope) { {} }
@@ -58,22 +60,24 @@ class Puppet::Pops::Loader::PuppetFunctionInstantiator
58
60
  end
59
61
 
60
62
  # Creates Function class and instantiates it based on a FunctionDefinition model
61
- # @return [Array<Puppet::Pops::Loader::Loader::TypedName, Puppet::Pops::Functions.Function>] - array of
63
+ # @return [Array<Loader::TypedName, Functions.Function>] - array of
62
64
  # typed name, and an instantiated function with global scope closure associated with the given loader
63
65
  #
64
66
  def self.create_from_model(function_definition, loader)
65
67
  closure_scope = Puppet.lookup(:global_scope) { {} }
66
68
  created = create_function_class(function_definition, closure_scope)
67
- typed_name = Puppet::Pops::Loader::Loader::TypedName.new(:function, function_definition.name)
69
+ typed_name = Loader::TypedName.new(:function, function_definition.name)
68
70
  [typed_name, created.new(closure_scope, loader)]
69
71
  end
70
72
 
71
73
  def self.create_function_class(function_definition, closure_scope)
72
74
  # Create a 4x function wrapper around a named closure
73
75
  Puppet::Functions.create_function(function_definition.name, Puppet::Functions::PuppetFunction) do
74
- init_dispatch(Puppet::Pops::Evaluator::Closure::Named.new(
76
+ init_dispatch(Evaluator::Closure::Named.new(
75
77
  function_definition.name,
76
- Puppet::Pops::Evaluator::EvaluatorImpl.new(), function_definition, closure_scope))
78
+ Evaluator::EvaluatorImpl.new(), function_definition, closure_scope))
77
79
  end
78
80
  end
79
- 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
@@ -1,7 +1,8 @@
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
5
6
  LOOKUP_OPTIONS = 'lookup_options'.freeze
6
7
  GLOBAL = '__global__'.freeze
7
8
 
@@ -11,25 +12,25 @@ module Puppet::Pops::Lookup
11
12
  # See puppet/functions/lookup.rb for full documentation and all parameter combinations.
12
13
  #
13
14
  # @param name [String|Array<String>] The name or names to lookup
14
- # @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
15
16
  # @param default_value [Object] The value to use as default when no value is found
16
17
  # @param has_default [Boolean] Set to _true_ if _default_value_ is included (_nil_ is a valid _default_value_)
17
- # @param merge [Puppet::Pops::MergeStrategy,String,Hash<String,Object>,nil] Merge strategy or hash with strategy and options
18
- # @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
19
20
  # @return [Object] The found value
20
21
  #
21
22
  def self.lookup(name, value_type, default_value, has_default, merge, lookup_invocation)
22
- value_type = Puppet::Pops::Types::PDataType::DEFAULT if value_type.nil?
23
+ value_type = Types::PDataType::DEFAULT if value_type.nil?
23
24
  names = name.is_a?(Array) ? name : [name]
24
25
 
25
26
  # find first name that yields a non-nil result and wrap it in a two element array
26
27
  # with name and value.
27
- not_found = Puppet::Pops::MergeStrategy::NOT_FOUND
28
+ not_found = MergeStrategy::NOT_FOUND
28
29
  override_values = lookup_invocation.override_values
29
30
  result_with_name = names.reduce([nil, not_found]) do |memo, key|
30
- 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
31
32
  catch(:no_such_key) { value = search_and_merge(key, lookup_invocation, merge) } if value.equal?(not_found)
32
- 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)
33
34
  memo
34
35
  end
35
36
 
@@ -38,7 +39,7 @@ module Puppet::Pops::Lookup
38
39
  default_values = lookup_invocation.default_values
39
40
  unless default_values.empty?
40
41
  result_with_name = names.reduce(result_with_name) do |memo, key|
41
- 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
42
43
  memo = [key, value]
43
44
  break memo unless value.equal?(not_found)
44
45
  memo
@@ -49,9 +50,9 @@ module Puppet::Pops::Lookup
49
50
  answer = result_with_name[1]
50
51
  if answer.equal?(not_found)
51
52
  if block_given?
52
- answer = assert_type('default_block', value_type, yield(name))
53
+ answer = assert_type('Value returned from default block', value_type, yield(name))
53
54
  elsif has_default
54
- answer = assert_type('default_value', value_type, default_value)
55
+ answer = assert_type('Default value', value_type, default_value)
55
56
  else
56
57
  fail_lookup(names)
57
58
  end
@@ -65,7 +66,7 @@ module Puppet::Pops::Lookup
65
66
  end
66
67
 
67
68
  def self.assert_type(subject, type, value)
68
- Puppet::Pops::Types::TypeAsserter.assert_instance_of(subject, type, value)
69
+ Types::TypeAsserter.assert_instance_of(subject, type, value)
69
70
  end
70
71
  private_class_method :assert_type
71
72
 
@@ -75,3 +76,4 @@ module Puppet::Pops::Lookup
75
76
  end
76
77
  private_class_method :fail_lookup
77
78
  end
79
+ end