puppet 4.2.3 → 4.3.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 (337) hide show
  1. data/Gemfile +3 -0
  2. data/README.md +1 -1
  3. data/ext/debian/puppet.init +0 -1
  4. data/ext/debian/puppet.logrotate +14 -5
  5. data/ext/osx/puppet.plist +0 -2
  6. data/ext/redhat/client.init +13 -5
  7. data/ext/redhat/logrotate +15 -3
  8. data/ext/redhat/puppet.spec.erb +5 -1
  9. data/ext/redhat/server.init +1 -1
  10. data/ext/systemd/puppet.service +1 -0
  11. data/lib/puppet.rb +12 -0
  12. data/lib/puppet/agent.rb +4 -4
  13. data/lib/puppet/agent/locker.rb +11 -2
  14. data/lib/puppet/application/agent.rb +5 -1
  15. data/lib/puppet/application/apply.rb +4 -0
  16. data/lib/puppet/application/filebucket.rb +78 -4
  17. data/lib/puppet/application/lookup.rb +356 -0
  18. data/lib/puppet/application/master.rb +3 -0
  19. data/lib/puppet/configurer.rb +9 -5
  20. data/lib/puppet/context.rb +16 -1
  21. data/lib/puppet/context/trusted_information.rb +21 -1
  22. data/lib/puppet/daemon.rb +17 -13
  23. data/lib/puppet/data_binding.rb +4 -2
  24. data/lib/puppet/data_providers.rb +12 -13
  25. data/lib/puppet/data_providers/data_adapter.rb +7 -68
  26. data/lib/puppet/data_providers/data_function_support.rb +5 -26
  27. data/lib/puppet/data_providers/function_env_data_provider.rb +0 -10
  28. data/lib/puppet/data_providers/function_module_data_provider.rb +0 -22
  29. data/lib/puppet/data_providers/hiera_config.rb +106 -0
  30. data/lib/puppet/data_providers/hiera_env_data_provider.rb +18 -0
  31. data/lib/puppet/data_providers/hiera_interpolate.rb +97 -0
  32. data/lib/puppet/data_providers/hiera_module_data_provider.rb +23 -0
  33. data/lib/puppet/data_providers/hiera_support.rb +37 -0
  34. data/lib/puppet/data_providers/json_data_provider_factory.rb +31 -0
  35. data/lib/puppet/data_providers/lookup_adapter.rb +200 -0
  36. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +32 -0
  37. data/lib/puppet/defaults.rb +12 -2
  38. data/lib/puppet/error.rb +4 -0
  39. data/lib/puppet/face/module/changes.rb +2 -1
  40. data/lib/puppet/feature/cfacter.rb +1 -0
  41. data/lib/puppet/file_bucket/dipper.rb +58 -2
  42. data/lib/puppet/functions.rb +2 -4
  43. data/lib/puppet/functions/assert_type.rb +48 -12
  44. data/lib/puppet/functions/defined.rb +79 -48
  45. data/lib/puppet/functions/each.rb +85 -27
  46. data/lib/puppet/functions/filter.rb +58 -23
  47. data/lib/puppet/functions/hiera.rb +76 -3
  48. data/lib/puppet/functions/hiera_array.rb +65 -3
  49. data/lib/puppet/functions/hiera_hash.rb +74 -2
  50. data/lib/puppet/functions/hiera_include.rb +75 -2
  51. data/lib/puppet/functions/lookup.rb +19 -17
  52. data/lib/puppet/functions/map.rb +56 -21
  53. data/lib/puppet/functions/match.rb +29 -12
  54. data/lib/puppet/functions/reduce.rb +95 -58
  55. data/lib/puppet/functions/versioncmp.rb +36 -0
  56. data/lib/puppet/functions/with.rb +15 -7
  57. data/lib/puppet/indirector/catalog/compiler.rb +3 -3
  58. data/lib/puppet/indirector/catalog/static_compiler.rb +46 -30
  59. data/lib/puppet/indirector/data_binding/none.rb +4 -1
  60. data/lib/puppet/indirector/file_bucket_file/file.rb +58 -1
  61. data/lib/puppet/indirector/hiera.rb +4 -0
  62. data/lib/puppet/indirector/json.rb +1 -1
  63. data/lib/puppet/indirector/msgpack.rb +1 -1
  64. data/lib/puppet/indirector/request.rb +7 -8
  65. data/lib/puppet/indirector/resource_type/parser.rb +5 -3
  66. data/lib/puppet/info_service.rb +7 -0
  67. data/lib/puppet/info_service/class_information_service.rb +111 -0
  68. data/lib/puppet/module_tool/metadata.rb +32 -9
  69. data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +42 -38
  70. data/lib/puppet/network/authconfig.rb +21 -1
  71. data/lib/puppet/network/authorization.rb +8 -1
  72. data/lib/puppet/network/http/api/master/v3.rb +7 -1
  73. data/lib/puppet/network/http/api/master/v3/environment.rb +59 -0
  74. data/lib/puppet/node/environment.rb +9 -2
  75. data/lib/puppet/parser.rb +3 -0
  76. data/lib/puppet/parser/ast/pops_bridge.rb +39 -1
  77. data/lib/puppet/parser/compiler.rb +302 -12
  78. data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
  79. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
  80. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +38 -0
  81. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
  82. data/lib/puppet/parser/environment_compiler.rb +165 -0
  83. data/lib/puppet/parser/functions/assert_type.rb +46 -16
  84. data/lib/puppet/parser/functions/defined.rb +105 -68
  85. data/lib/puppet/parser/functions/each.rb +85 -27
  86. data/lib/puppet/parser/functions/filter.rb +59 -23
  87. data/lib/puppet/parser/functions/hiera.rb +83 -27
  88. data/lib/puppet/parser/functions/hiera_array.rb +71 -28
  89. data/lib/puppet/parser/functions/hiera_hash.rb +81 -30
  90. data/lib/puppet/parser/functions/hiera_include.rb +81 -40
  91. data/lib/puppet/parser/functions/map.rb +55 -20
  92. data/lib/puppet/parser/functions/match.rb +27 -12
  93. data/lib/puppet/parser/functions/reduce.rb +97 -60
  94. data/lib/puppet/parser/functions/with.rb +16 -8
  95. data/lib/puppet/parser/resource.rb +98 -19
  96. data/lib/puppet/plugins/configuration.rb +3 -2
  97. data/lib/puppet/plugins/data_providers.rb +12 -60
  98. data/lib/puppet/plugins/data_providers/data_provider.rb +283 -0
  99. data/lib/puppet/plugins/data_providers/registry.rb +84 -0
  100. data/lib/puppet/pops.rb +19 -17
  101. data/lib/puppet/pops/adapters.rb +12 -0
  102. data/lib/puppet/pops/binder/binder.rb +2 -2
  103. data/lib/puppet/pops/binder/bindings_checker.rb +1 -1
  104. data/lib/puppet/pops/binder/bindings_label_provider.rb +3 -1
  105. data/lib/puppet/pops/binder/bindings_loader.rb +6 -2
  106. data/lib/puppet/pops/binder/bindings_model_meta.rb +2 -2
  107. data/lib/puppet/pops/binder/config/binder_config.rb +1 -1
  108. data/lib/puppet/pops/binder/injector.rb +4 -4
  109. data/lib/puppet/pops/binder/key_factory.rb +3 -9
  110. data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +68 -9
  111. data/lib/puppet/pops/evaluator/access_operator.rb +27 -60
  112. data/lib/puppet/pops/evaluator/closure.rb +8 -8
  113. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
  114. data/lib/puppet/pops/evaluator/evaluator_impl.rb +5 -5
  115. data/lib/puppet/pops/evaluator/literal_evaluator.rb +87 -0
  116. data/lib/puppet/pops/evaluator/relationship_operator.rb +7 -1
  117. data/lib/puppet/pops/functions/dispatcher.rb +3 -3
  118. data/lib/puppet/pops/issues.rb +1 -1
  119. data/lib/puppet/pops/label_provider.rb +1 -1
  120. data/lib/puppet/pops/lookup.rb +25 -47
  121. data/lib/puppet/pops/lookup/explainer.rb +402 -0
  122. data/lib/puppet/pops/lookup/invocation.rb +117 -0
  123. data/lib/puppet/pops/merge_strategy.rb +73 -5
  124. data/lib/puppet/pops/model/factory.rb +34 -0
  125. data/lib/puppet/pops/model/model_label_provider.rb +10 -1
  126. data/lib/puppet/pops/model/model_meta.rb +15 -0
  127. data/lib/puppet/pops/model/model_tree_dumper.rb +18 -0
  128. data/lib/puppet/pops/parser/code_merger.rb +13 -1
  129. data/lib/puppet/pops/parser/egrammar.ra +56 -3
  130. data/lib/puppet/pops/parser/eparser.rb +1549 -1352
  131. data/lib/puppet/pops/parser/lexer2.rb +31 -6
  132. data/lib/puppet/pops/parser/locator.rb +1 -1
  133. data/lib/puppet/pops/parser/parser_support.rb +25 -13
  134. data/lib/puppet/pops/types/enumeration.rb +1 -2
  135. data/lib/puppet/pops/types/type_asserter.rb +16 -15
  136. data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
  137. data/lib/puppet/pops/types/type_calculator.rb +171 -1020
  138. data/lib/puppet/pops/types/type_factory.rb +87 -148
  139. data/lib/puppet/pops/types/type_mismatch_describer.rb +743 -0
  140. data/lib/puppet/pops/types/type_parser.rb +116 -127
  141. data/lib/puppet/pops/types/types.rb +1394 -255
  142. data/lib/puppet/pops/types/types_meta.rb +0 -234
  143. data/lib/puppet/pops/validation.rb +7 -2
  144. data/lib/puppet/pops/validation/checker4_0.rb +28 -0
  145. data/lib/puppet/provider/augeas/augeas.rb +50 -0
  146. data/lib/puppet/provider/group/directoryservice.rb +10 -0
  147. data/lib/puppet/provider/package/dnf.rb +41 -0
  148. data/lib/puppet/provider/package/gem.rb +7 -2
  149. data/lib/puppet/provider/package/rpm.rb +1 -0
  150. data/lib/puppet/provider/package/windows/exe_package.rb +10 -8
  151. data/lib/puppet/provider/package/windows/msi_package.rb +4 -3
  152. data/lib/puppet/provider/package/windows/package.rb +9 -1
  153. data/lib/puppet/provider/package/yum.rb +14 -9
  154. data/lib/puppet/provider/service/bsd.rb +1 -1
  155. data/lib/puppet/provider/service/debian.rb +21 -0
  156. data/lib/puppet/provider/service/init.rb +6 -0
  157. data/lib/puppet/provider/service/rcng.rb +51 -0
  158. data/lib/puppet/provider/service/redhat.rb +2 -1
  159. data/lib/puppet/provider/service/smf.rb +43 -2
  160. data/lib/puppet/provider/service/src.rb +27 -0
  161. data/lib/puppet/provider/service/systemd.rb +15 -3
  162. data/lib/puppet/provider/sshkey/parsed.rb +19 -9
  163. data/lib/puppet/reference/report.rb +9 -12
  164. data/lib/puppet/reports.rb +5 -1
  165. data/lib/puppet/resource.rb +50 -73
  166. data/lib/puppet/resource/capability_finder.rb +95 -0
  167. data/lib/puppet/resource/catalog.rb +47 -7
  168. data/lib/puppet/resource/status.rb +0 -2
  169. data/lib/puppet/resource/type.rb +238 -44
  170. data/lib/puppet/resource/type_collection.rb +60 -2
  171. data/lib/puppet/settings.rb +2 -2
  172. data/lib/puppet/ssl/certificate_authority/interface.rb +2 -2
  173. data/lib/puppet/ssl/oids.rb +9 -1
  174. data/lib/puppet/transaction.rb +4 -1
  175. data/lib/puppet/transaction/additional_resource_generator.rb +71 -8
  176. data/lib/puppet/transaction/resource_harness.rb +9 -4
  177. data/lib/puppet/type.rb +74 -3
  178. data/lib/puppet/type/augeas.rb +8 -0
  179. data/lib/puppet/type/file/source.rb +14 -12
  180. data/lib/puppet/type/user.rb +4 -2
  181. data/lib/puppet/util/windows/security.rb +4 -1
  182. data/lib/puppet/util/windows/taskscheduler.rb +1 -1
  183. data/lib/puppet/version.rb +1 -1
  184. data/spec/fixtures/unit/application/environments/production/data/common.yaml +3 -0
  185. data/spec/fixtures/unit/application/environments/production/environment.conf +1 -0
  186. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/data/bad.json +3 -0
  187. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/environment.conf +2 -0
  188. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
  189. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
  190. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
  191. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
  192. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
  193. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
  194. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
  195. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
  196. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
  197. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
  198. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
  199. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
  200. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
  201. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
  202. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
  203. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
  204. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
  205. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
  206. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +18 -0
  207. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
  208. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +46 -0
  209. data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
  210. data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
  211. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
  212. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
  213. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -0
  214. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/environment.conf +2 -0
  215. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
  216. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
  217. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +1 -0
  218. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
  219. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
  220. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
  221. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +18 -0
  222. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
  223. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/metadata.json +9 -0
  224. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +1 -0
  225. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_module_data.rb +1 -0
  226. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +3 -0
  227. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/hiera.yaml +8 -0
  228. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
  229. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/metadata.json +9 -0
  230. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
  231. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/manifests/init.pp +3 -0
  232. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/metadata.json +9 -0
  233. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +10 -0
  234. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +23 -0
  235. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/manifests/init.pp +3 -0
  236. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/metadata.json +9 -0
  237. data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
  238. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
  239. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
  240. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -0
  241. data/spec/integration/data_binding_spec.rb +229 -0
  242. data/spec/integration/file_bucket/file_spec.rb +2 -2
  243. data/spec/integration/parser/compiler_spec.rb +23 -19
  244. data/spec/integration/parser/resource_expressions_spec.rb +4 -4
  245. data/spec/integration/parser/undef_param_spec.rb +1 -1
  246. data/spec/integration/resource/catalog_spec.rb +1 -1
  247. data/spec/integration/type/package_spec.rb +2 -0
  248. data/spec/integration/util/windows/security_spec.rb +18 -0
  249. data/spec/lib/matchers/include_in_order.rb +2 -2
  250. data/spec/shared_behaviours/iterative_functions.rb +8 -8
  251. data/spec/spec_helper.rb +7 -0
  252. data/spec/unit/agent/locker_spec.rb +4 -4
  253. data/spec/unit/agent_spec.rb +0 -8
  254. data/spec/unit/application/agent_spec.rb +5 -0
  255. data/spec/unit/application/apply_spec.rb +8 -0
  256. data/spec/unit/application/filebucket_spec.rb +87 -1
  257. data/spec/unit/application/lookup_spec.rb +195 -0
  258. data/spec/unit/appmgmt_spec.rb +657 -0
  259. data/spec/unit/capability_spec.rb +414 -0
  260. data/spec/unit/configurer_spec.rb +7 -1
  261. data/spec/unit/context/trusted_information_spec.rb +24 -1
  262. data/spec/unit/daemon_spec.rb +18 -8
  263. data/spec/unit/data_providers/hiera_data_provider_spec.rb +201 -0
  264. data/spec/unit/file_bucket/dipper_spec.rb +210 -1
  265. data/spec/unit/functions/assert_type_spec.rb +5 -7
  266. data/spec/unit/functions/defined_spec.rb +2 -2
  267. data/spec/unit/functions/epp_spec.rb +2 -2
  268. data/spec/unit/functions/lookup_spec.rb +200 -9
  269. data/spec/unit/functions/regsubst_spec.rb +17 -8
  270. data/spec/unit/functions/scanf_spec.rb +1 -1
  271. data/spec/unit/functions/split_spec.rb +2 -2
  272. data/spec/unit/functions/versioncmp_spec.rb +36 -0
  273. data/spec/unit/functions4_spec.rb +58 -72
  274. data/spec/unit/indirector/catalog/compiler_spec.rb +28 -8
  275. data/spec/unit/indirector/catalog/static_compiler_spec.rb +38 -20
  276. data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
  277. data/spec/unit/indirector/file_bucket_file/file_spec.rb +52 -1
  278. data/spec/unit/indirector/request_spec.rb +8 -8
  279. data/spec/unit/info_service_spec.rb +236 -0
  280. data/spec/unit/module_tool/metadata_spec.rb +31 -2
  281. data/spec/unit/network/authconfig_spec.rb +62 -32
  282. data/spec/unit/network/authorization_spec.rb +30 -2
  283. data/spec/unit/network/http/connection_spec.rb +14 -19
  284. data/spec/unit/parser/compiler_spec.rb +86 -2
  285. data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
  286. data/spec/unit/parser/resource_spec.rb +2 -20
  287. data/spec/unit/pops/binder/config/binder_config_spec.rb +1 -1
  288. data/spec/unit/pops/binder/injector_spec.rb +3 -3
  289. data/spec/unit/pops/evaluator/access_ops_spec.rb +13 -11
  290. data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -2
  291. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +19 -11
  292. data/spec/unit/pops/evaluator/literal_evaluator_spec.rb +43 -0
  293. data/spec/unit/pops/label_provider_spec.rb +5 -1
  294. data/spec/unit/pops/parser/lexer2_spec.rb +33 -7
  295. data/spec/unit/pops/parser/parse_application_spec.rb +40 -0
  296. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +4 -0
  297. data/spec/unit/pops/parser/parse_capabilities_spec.rb +47 -0
  298. data/spec/unit/pops/parser/parse_site_spec.rb +38 -0
  299. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  300. data/spec/unit/pops/parser/parser_spec.rb +18 -0
  301. data/spec/unit/pops/types/type_calculator_spec.rb +427 -444
  302. data/spec/unit/pops/types/type_factory_spec.rb +12 -12
  303. data/spec/unit/pops/types/type_parser_spec.rb +7 -12
  304. data/spec/unit/pops/validator/validator_spec.rb +25 -0
  305. data/spec/unit/provider/augeas/augeas_spec.rb +50 -0
  306. data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
  307. data/spec/unit/provider/group/windows_adsi_spec.rb +3 -0
  308. data/spec/unit/provider/package/dnf_spec.rb +92 -0
  309. data/spec/unit/provider/package/gem_spec.rb +7 -0
  310. data/spec/unit/provider/package/rpm_spec.rb +25 -2
  311. data/spec/unit/provider/package/windows/package_spec.rb +41 -0
  312. data/spec/unit/provider/package/yum_spec.rb +21 -13
  313. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +10 -0
  314. data/spec/unit/provider/service/debian_spec.rb +27 -0
  315. data/spec/unit/provider/service/rcng_spec.rb +41 -0
  316. data/spec/unit/provider/service/redhat_spec.rb +8 -1
  317. data/spec/unit/provider/service/smf_spec.rb +30 -5
  318. data/spec/unit/provider/service/src_spec.rb +19 -4
  319. data/spec/unit/provider/service/systemd_spec.rb +78 -29
  320. data/spec/unit/provider/sshkey/parsed_spec.rb +23 -0
  321. data/spec/unit/reports_spec.rb +10 -0
  322. data/spec/unit/resource/capability_finder_spec.rb +56 -0
  323. data/spec/unit/resource/catalog_spec.rb +31 -8
  324. data/spec/unit/resource/type_collection_spec.rb +23 -2
  325. data/spec/unit/resource/type_spec.rb +1 -1
  326. data/spec/unit/resource_spec.rb +22 -4
  327. data/spec/unit/settings_spec.rb +90 -1
  328. data/spec/unit/ssl/certificate_authority/interface_spec.rb +4 -3
  329. data/spec/unit/ssl/oids_spec.rb +8 -0
  330. data/spec/unit/transaction/additional_resource_generator_spec.rb +78 -5
  331. data/spec/unit/transaction/report_spec.rb +24 -1
  332. data/spec/unit/type/package_spec.rb +1 -0
  333. data/spec/unit/type/user_spec.rb +14 -7
  334. data/spec/unit/type_spec.rb +1 -1
  335. metadata +169 -5
  336. data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
  337. data/spec/integration/data_binding.rb +0 -104
@@ -164,10 +164,7 @@ class Puppet::Pops::Evaluator::AccessOperator
164
164
  keys = keys[0, keys.size - 1]
165
165
  end
166
166
  assert_keys(keys, o, 1, Float::INFINITY, Puppet::Pops::Types::PAnyType)
167
- t = Puppet::Pops::Types::TypeFactory.tuple(*keys)
168
- # set size type, or nil for default (exactly 1)
169
- t.size_type = size_type
170
- t
167
+ Puppet::Pops::Types::TypeFactory.tuple(keys, size_type)
171
168
  end
172
169
 
173
170
  def access_PCallableType(o, scope, keys)
@@ -189,9 +186,7 @@ class Puppet::Pops::Evaluator::AccessOperator
189
186
  else
190
187
  fail(Puppet::Pops::Issues::BAD_STRING_SLICE_ARITY, @semantic, {:actual => keys.size})
191
188
  end
192
- string_t = Puppet::Pops::Types::TypeFactory.string()
193
- string_t.size_type = size_t
194
- string_t
189
+ TYPEFACTORY.string(size_t)
195
190
  end
196
191
 
197
192
  # Asserts type of each key and calls fail with BAD_TYPE_SPECIFICATION
@@ -229,7 +224,7 @@ class Puppet::Pops::Evaluator::AccessOperator
229
224
  when :default
230
225
  'Default'
231
226
  else
232
- Puppet::Pops::Types::TypeCalculator.generalize!(Puppet::Pops::Types::TypeCalculator.infer(actual)).to_s
227
+ Puppet::Pops::Types::TypeCalculator.generalize(Puppet::Pops::Types::TypeCalculator.infer(actual)).to_s
233
228
  end
234
229
  end
235
230
 
@@ -252,10 +247,14 @@ class Puppet::Pops::Evaluator::AccessOperator
252
247
  keys.flatten!
253
248
  if keys.size == 1
254
249
  type = keys[0]
255
- unless type.is_a?(Puppet::Pops::Types::PAnyType) || type.is_a?(String)
256
- fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_TYPE, @semantic.keys[0], {:base_type => 'Optional-Type', :actual => type.class})
250
+ unless type.is_a?(Puppet::Pops::Types::PAnyType)
251
+ if type.is_a?(String)
252
+ type = TYPEFACTORY.string(nil, type)
253
+ else
254
+ fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_TYPE, @semantic.keys[0], {:base_type => 'Optional-Type', :actual => type.class})
255
+ end
257
256
  end
258
- TYPEFACTORY.optional(type)
257
+ Puppet::Pops::Types::POptionalType.new(type)
259
258
  else
260
259
  fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_ARITY, @semantic, {:base_type => 'Optional-Type', :min => 1, :actual => keys.size})
261
260
  end
@@ -270,7 +269,7 @@ class Puppet::Pops::Evaluator::AccessOperator
270
269
  type = keys[0]
271
270
  case type
272
271
  when String
273
- type = TYPEFACTORY.string(type)
272
+ type = TYPEFACTORY.string(nil, type)
274
273
  when Puppet::Pops::Types::PAnyType
275
274
  type = nil if type.class == Puppet::Pops::Types::PAnyType
276
275
  else
@@ -288,9 +287,7 @@ class Puppet::Pops::Evaluator::AccessOperator
288
287
  unless keys[0].is_a?(Puppet::Pops::Types::PAnyType)
289
288
  fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_TYPE, @semantic.keys[0], {:base_type => 'Type-Type', :actual => keys[0].class})
290
289
  end
291
- result = Puppet::Pops::Types::PType.new()
292
- result.type = keys[0]
293
- result
290
+ Puppet::Pops::Types::PType.new(keys[0])
294
291
  else
295
292
  fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_ARITY, @semantic, {:base_type => 'Type-Type', :min => 1, :actual => keys.size})
296
293
  end
@@ -312,11 +309,7 @@ class Puppet::Pops::Evaluator::AccessOperator
312
309
  fail(Puppet::Pops::Issues::BAD_INTEGER_SLICE_TYPE, @semantic.keys[index],
313
310
  {:actual => x.class}) unless (x.is_a?(Integer) || x == :default)
314
311
  end
315
- ranged_integer = Puppet::Pops::Types::PIntegerType.new()
316
- from, to = keys
317
- ranged_integer.from = from == :default ? nil : from
318
- ranged_integer.to = to == :default ? nil : to
319
- ranged_integer
312
+ Puppet::Pops::Types::PIntegerType.new(*keys)
320
313
  end
321
314
 
322
315
  def access_PFloatType(o, scope, keys)
@@ -328,11 +321,10 @@ class Puppet::Pops::Evaluator::AccessOperator
328
321
  fail(Puppet::Pops::Issues::BAD_FLOAT_SLICE_TYPE, @semantic.keys[index],
329
322
  {:actual => x.class}) unless (x.is_a?(Float) || x.is_a?(Integer) || x == :default)
330
323
  end
331
- ranged_float = Puppet::Pops::Types::PFloatType.new()
332
324
  from, to = keys
333
- ranged_float.from = from == :default || from.nil? ? nil : Float(from)
334
- ranged_float.to = to == :default || to.nil? ? nil : Float(to)
335
- ranged_float
325
+ from = from == :default || from.nil? ? nil : Float(from)
326
+ to = to == :default || to.nil? ? nil : Float(to)
327
+ Puppet::Pops::Types::PFloatType.new(from, to)
336
328
  end
337
329
 
338
330
  # A Hash can create a new Hash type, one arg sets value type, two args sets key and value type in new type.
@@ -348,29 +340,18 @@ class Puppet::Pops::Evaluator::AccessOperator
348
340
  end
349
341
  case keys.size
350
342
  when 2
351
- result = Puppet::Pops::Types::PHashType.new()
352
- result.key_type = keys[0]
353
- result.element_type = keys[1]
354
- result
343
+ Puppet::Pops::Types::PHashType.new(keys[0], keys[1], nil)
355
344
  when 3
356
- result = Puppet::Pops::Types::PHashType.new()
357
- result.key_type = keys[0]
358
- result.element_type = keys[1]
359
- size_t = collection_size_t(1, keys[2])
360
- result
345
+ size_t = keys[2]
346
+ size_t = Puppet::Pops::Types::PIntegerType.new(size_t) unless size_t.is_a?(Puppet::Pops::Types::PIntegerType)
347
+ Puppet::Pops::Types::PHashType.new(keys[0], keys[1], size_t)
361
348
  when 4
362
- result = Puppet::Pops::Types::PHashType.new()
363
- result.key_type = keys[0]
364
- result.element_type = keys[1]
365
- size_t = collection_size_t(1, keys[2], keys[3])
366
- result
349
+ Puppet::Pops::Types::PHashType.new(keys[0], keys[1], collection_size_t(1, keys[2], keys[3]))
367
350
  else
368
351
  fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_ARITY, @semantic, {
369
352
  :base_type => 'Hash-Type', :min => 2, :max => 4, :actual => keys.size
370
353
  })
371
354
  end
372
- result.size_type = size_t if size_t
373
- result
374
355
  end
375
356
 
376
357
  # CollectionType is parameterized with a range
@@ -385,9 +366,7 @@ class Puppet::Pops::Evaluator::AccessOperator
385
366
  fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_ARITY, @semantic,
386
367
  {:base_type => 'Collection-Type', :min => 1, :max => 2, :actual => keys.size})
387
368
  end
388
- result = Puppet::Pops::Types::PCollectionType.new()
389
- result.size_type = size_t
390
- result
369
+ Puppet::Pops::Types::PCollectionType.new(size_t)
391
370
  end
392
371
 
393
372
  # An Array can create a new Array type. It is not possible to create a collection of Array types.
@@ -408,26 +387,19 @@ class Puppet::Pops::Evaluator::AccessOperator
408
387
  unless keys[0].is_a?(Puppet::Pops::Types::PAnyType)
409
388
  fail(Puppet::Pops::Issues::BAD_TYPE_SLICE_TYPE, @semantic.keys[0], {:base_type => 'Array-Type', :actual => keys[0].class})
410
389
  end
411
- result = Puppet::Pops::Types::PArrayType.new()
412
- result.element_type = keys[0]
413
- result.size_type = size_t
414
- result
390
+ Puppet::Pops::Types::PArrayType.new(keys[0], size_t)
415
391
  end
416
392
 
417
393
  # Produces an PIntegerType (range) given one or two keys.
418
394
  def collection_size_t(start_index, *keys)
419
395
  if keys.size == 1 && keys[0].is_a?(Puppet::Pops::Types::PIntegerType)
420
- keys[0].copy
396
+ keys[0]
421
397
  else
422
398
  keys.each_with_index do |x, index|
423
399
  fail(Puppet::Pops::Issues::BAD_COLLECTION_SLICE_TYPE, @semantic.keys[start_index + index],
424
400
  {:actual => x.class}) unless (x.is_a?(Integer) || x == :default)
425
401
  end
426
- ranged_integer = Puppet::Pops::Types::PIntegerType.new()
427
- from, to = keys
428
- ranged_integer.from = from == :default ? nil : from
429
- ranged_integer.to = to == :default ? nil : to
430
- ranged_integer
402
+ Puppet::Pops::Types::PIntegerType.new(*keys)
431
403
  end
432
404
  end
433
405
 
@@ -527,10 +499,7 @@ class Puppet::Pops::Evaluator::AccessOperator
527
499
  })
528
500
  end
529
501
 
530
- rtype = Puppet::Pops::Types::PResourceType.new()
531
- rtype.type_name = type_name
532
- rtype.title = (t == :no_title ? nil : t)
533
- rtype
502
+ Puppet::Pops::Types::PResourceType.new(type_name, t == :no_title ? nil : t)
534
503
  end
535
504
  # returns single type if request was for a single entity, else an array of types (possibly empty)
536
505
  return result_type_array ? result : result.pop
@@ -577,10 +546,8 @@ class Puppet::Pops::Evaluator::AccessOperator
577
546
  end
578
547
 
579
548
  if name =~ Puppet::Pops::Patterns::NAME
580
- ctype = Puppet::Pops::Types::PHostClassType.new()
581
549
  # Remove leading '::' since all references are global, and 3x runtime does the wrong thing
582
- ctype.class_name = name.sub(/^::/, EMPTY_STRING)
583
- ctype
550
+ Puppet::Pops::Types::PHostClassType.new(name.sub(/^::/, EMPTY_STRING))
584
551
  else
585
552
  fail(Issues::ILLEGAL_NAME, @semantic.keys[i], {:name=>c})
586
553
  end
@@ -27,8 +27,8 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
27
27
  def call(*args)
28
28
  variable_bindings = combine_values_with_parameters(args)
29
29
 
30
- tc = Puppet::Pops::Types::TypeCalculator
31
- final_args = tc.infer_set(parameters.inject([]) do |tmp_args, param|
30
+ tc = Puppet::Pops::Types::TypeCalculator.singleton
31
+ final_args = tc.infer_set(parameters.reduce([]) do |tmp_args, param|
32
32
  if param.captures_rest
33
33
  tmp_args.concat(variable_bindings[param.name])
34
34
  else
@@ -36,10 +36,10 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
36
36
  end
37
37
  end)
38
38
 
39
- if tc.callable?(type, final_args)
39
+ if type.callable?(final_args)
40
40
  @evaluator.evaluate_block_with_bindings(@enclosing_scope, variable_bindings, @model.body)
41
41
  else
42
- raise ArgumentError, "#{closure_name} called with mis-matched arguments\n#{Puppet::Pops::Evaluator::CallableMismatchDescriber.diff_string(closure_name, final_args, [self])}"
42
+ raise ArgumentError, Puppet::Pops::Types::TypeMismatchDescriber.describe_signatures(closure_name, [self], final_args)
43
43
  end
44
44
  end
45
45
 
@@ -78,10 +78,10 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
78
78
  raise ArgumentError, "Too few arguments; no value given for required parameters #{missing.collect(&:name).join(" ,")}"
79
79
  end
80
80
 
81
- tc = Puppet::Pops::Types::TypeCalculator
81
+ tc = Puppet::Pops::Types::TypeCalculator.singleton
82
82
  final_args = tc.infer_set(parameter_names.collect { |param| scope_hash[param] })
83
- if !tc.callable?(type, final_args)
84
- raise ArgumentError, "#{closure_name} called with mis-matched arguments\n#{Puppet::Pops::Evaluator::CallableMismatchDescriber.diff_string(closure_name, final_args, [self])}"
83
+ if !type.callable?(final_args)
84
+ raise ArgumentError, Puppet::Pops::Types::TypeMismatchDescriber.describe_signatures(closure_name, [self], final_args)
85
85
  end
86
86
  else
87
87
  scope_hash = args_hash
@@ -199,7 +199,7 @@ class Puppet::Pops::Evaluator::Closure < Puppet::Pops::Evaluator::CallableSignat
199
199
  type = if param.type_expr
200
200
  @evaluator.evaluate(param.type_expr, @enclosing_scope)
201
201
  else
202
- Puppet::Pops::Types::TypeFactory.any()
202
+ Puppet::Pops::Types::PAnyType::DEFAULT
203
203
  end
204
204
 
205
205
  if param.captures_rest && type.is_a?(Puppet::Pops::Types::PArrayType)
@@ -61,7 +61,7 @@ class Puppet::Pops::Evaluator::Collectors::AbstractCollector
61
61
 
62
62
  return false if objects.empty?
63
63
 
64
- objects.inject(@collected) { |c,o| c[o.ref]=o; c }
64
+ objects.reduce(@collected) { |c,o| c[o.ref]=o; c }
65
65
 
66
66
  objects
67
67
  end
@@ -665,7 +665,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
665
665
 
666
666
  evaluated_name = evaluate(tmp_name, scope)
667
667
  unless type_name_acceptable
668
- actual = type_calculator.generalize!(type_calculator.infer(evaluated_name)).to_s
668
+ actual = type_calculator.generalize(type_calculator.infer(evaluated_name)).to_s
669
669
  fail(Puppet::Pops::Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, {:actual => actual})
670
670
  end
671
671
 
@@ -684,7 +684,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
684
684
  evaluated_name.type_name # assume validated
685
685
 
686
686
  else
687
- actual = type_calculator.generalize!(type_calculator.infer(evaluated_name)).to_s
687
+ actual = type_calculator.generalize(type_calculator.infer(evaluated_name)).to_s
688
688
  fail(Puppet::Pops::Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, {:actual=>actual})
689
689
  end
690
690
  end
@@ -720,7 +720,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
720
720
  fail(Puppet::Pops::Issues::MISSING_TITLE_AT, body.title, {:index => index})
721
721
 
722
722
  elsif !title.is_a?(String) && title != :default
723
- actual = type_calculator.generalize!(type_calculator.infer(title)).to_s
723
+ actual = type_calculator.generalize(type_calculator.infer(title)).to_s
724
724
  fail(Puppet::Pops::Issues::ILLEGAL_TITLE_TYPE_AT, body.title, {:index => index, :actual => actual})
725
725
 
726
726
  elsif title == EMPTY_STRING
@@ -779,7 +779,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
779
779
  def eval_AttributesOperation(o, scope)
780
780
  hashed_params = evaluate(o.expr, scope)
781
781
  unless hashed_params.is_a?(Hash)
782
- actual = type_calculator.generalize!(type_calculator.infer(hashed_params)).to_s
782
+ actual = type_calculator.generalize(type_calculator.infer(hashed_params)).to_s
783
783
  fail(Puppet::Pops::Issues::TYPE_MISMATCH, o.expr, {:expected => 'Hash', :actual => actual})
784
784
  end
785
785
  hashed_params.map { |k,v| create_resource_parameter(o, scope, k, v, :'=>') }
@@ -793,7 +793,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
793
793
  if type.is_a?(Puppet::Pops::Types::PResourceType) && !type.type_name.nil? && type.title.nil?
794
794
  type.type_name # assume it is a valid name
795
795
  else
796
- actual = type_calculator.generalize!(type_calculator.infer(type))
796
+ actual = type_calculator.generalize(type_calculator.infer(type))
797
797
  fail(Issues::ILLEGAL_RESOURCE_TYPE, o.type_ref, {:actual => actual})
798
798
  end
799
799
  evaluated_parameters = o.operations.map {|op| evaluate(op, scope) }
@@ -0,0 +1,87 @@
1
+ require 'rgen/ecore/ecore'
2
+
3
+ # Literal values for
4
+ # String (not containing interpolation)
5
+ # Numbers
6
+ # Booleans
7
+ # Undef (produces nil)
8
+ # Array
9
+ # Hash
10
+ # QualifiedName
11
+ # Default (produced :default)
12
+ # Regular Expression (produces ruby reqular expression)
13
+ #
14
+ # Not considered literal
15
+ # QualifiedReference # i.e. File, FooBar
16
+ #
17
+ class Puppet::Pops::Evaluator::LiteralEvaluator
18
+ #include Puppet::Pops::Utils
19
+
20
+ EMPTY_STRING = ''.freeze
21
+ COMMA_SEPARATOR = ', '.freeze
22
+
23
+ def initialize
24
+ @@literal_visitor ||= Puppet::Pops::Visitor.new(self, "literal", 0, 0)
25
+ end
26
+
27
+ def literal(ast)
28
+ @@literal_visitor.visit_this_0(self, ast)
29
+ end
30
+
31
+ def literal_Object(o)
32
+ throw :not_literal
33
+ end
34
+
35
+ def literal_Factory(o)
36
+ literal(o.model)
37
+ end
38
+
39
+ def literal_Program(o)
40
+ literal(o.body)
41
+ end
42
+
43
+ def literal_LiteralString(o)
44
+ o.value
45
+ end
46
+
47
+ def literal_QualifiedName(o)
48
+ o.value
49
+ end
50
+
51
+ def literal_LiteralNumber(o)
52
+ o.value
53
+ end
54
+
55
+ def literal_LiteralBoolean(o)
56
+ o.value
57
+ end
58
+
59
+ def literal_LiteralUndef(o)
60
+ nil
61
+ end
62
+
63
+ def literal_LiteralDefault(o)
64
+ :default
65
+ end
66
+
67
+ def literal_LiteralRegularExpression(o)
68
+ o.value
69
+ end
70
+
71
+ def literal_ConcatenatedString(o)
72
+ # use double quoted string value if there is no interpolation
73
+ throw :not_literal unless o.segments.size == 1 && o.segments[0].is_a?(Puppet::Pops::Model::LiteralString)
74
+ o.segments[0].value
75
+ end
76
+
77
+ def literal_LiteralList(o)
78
+ o.values.map {|v| literal(v) }
79
+ end
80
+
81
+ def literal_LiteralHash(o)
82
+ o.entries.reduce({}) do |result, entry|
83
+ result[literal(entry.key)] = literal(entry.value)
84
+ result
85
+ end
86
+ end
87
+ end
@@ -48,6 +48,12 @@ class Puppet::Pops::Evaluator::RelationshipOperator
48
48
  raise IllegalRelationshipOperandError.new(o)
49
49
  end
50
50
 
51
+ # A Resource is by definition a Catalog type, but of 3.x type
52
+ # @api private
53
+ def transform_Resource(o, scope)
54
+ Puppet::Pops::Types::TypeFactory.resource(o.type, o.title)
55
+ end
56
+
51
57
  # A string must be a type reference in string format
52
58
  # @api private
53
59
  def transform_String(o, scope)
@@ -149,7 +155,7 @@ class Puppet::Pops::Evaluator::RelationshipOperator
149
155
  # Produce the transformed source RHS (if this is a chain, this does not need to be done again)
150
156
  real.slice(1)
151
157
  rescue NotCatalogTypeError => e
152
- fail(Issues::ILLEGAL_RELATIONSHIP_OPERAND_TYPE, relationship_expression, {:type => @type_calculator.string(e.type)})
158
+ fail(Issues::NOT_CATALOG_TYPE, relationship_expression, {:type => @type_calculator.string(e.type)})
153
159
  rescue IllegalRelationshipOperandError => e
154
160
  fail(Issues::ILLEGAL_RELATIONSHIP_OPERAND_TYPE, relationship_expression, {:operand => e.operand})
155
161
  end
@@ -28,13 +28,13 @@ class Puppet::Pops::Functions::Dispatcher
28
28
  #
29
29
  # @api private
30
30
  def dispatch(instance, calling_scope, args, &block)
31
- tc = Puppet::Pops::Types::TypeCalculator
31
+ tc = Puppet::Pops::Types::TypeCalculator.singleton
32
32
  actual = tc.infer_set(block_given? ? args + [block] : args)
33
33
  found = @dispatchers.find { |d| tc.callable?(d.type, actual) }
34
34
  if found
35
35
  found.invoke(instance, calling_scope, args, &block)
36
36
  else
37
- raise ArgumentError, "function '#{instance.class.name}' called with mis-matched arguments\n#{Puppet::Pops::Evaluator::CallableMismatchDescriber.diff_string(instance.class.name, actual, @dispatchers)}"
37
+ raise ArgumentError, Puppet::Pops::Types::TypeMismatchDescriber.describe_signatures(instance.class.name, @dispatchers, actual)
38
38
  end
39
39
  end
40
40
 
@@ -62,7 +62,7 @@ class Puppet::Pops::Functions::Dispatcher
62
62
  # make a copy to make sure it can be contained by someone else (even if it is not contained here, it
63
63
  # should be treated as immutable).
64
64
  #
65
- callables = dispatchers.map { | dispatch | dispatch.type.copy }
65
+ callables = dispatchers.map { | dispatch | dispatch.type }
66
66
 
67
67
  # multiple signatures, produce a Variant type of Callable1-n (must copy them)
68
68
  # single signature, produce single Callable
@@ -533,7 +533,7 @@ module Puppet::Pops::Issues
533
533
  end
534
534
 
535
535
  IDEM_EXPRESSION_NOT_LAST = issue :IDEM_EXPRESSION_NOT_LAST do
536
- "This #{label.label(semantic)} has no effect. A value-producing expression without other effect may only be placed last in a block/sequence"
536
+ "This #{label.label(semantic)} has no effect. A value was produced and then forgotten (one or more preceding expressions may have the wrong form)"
537
537
  end
538
538
 
539
539
  IDEM_NOT_ALLOWED_LAST = hard_issue :IDEM_NOT_ALLOWED_LAST, :container do
@@ -1,7 +1,7 @@
1
1
  # Provides a label for an object.
2
2
  # This simple implementation calls #to_s on the given object, and handles articles 'a/an/the'.
3
3
  #
4
- class Puppet::Pops::LabelProvider
4
+ module Puppet::Pops::LabelProvider
5
5
  VOWELS = %w{a e i o u y}
6
6
  SKIPPED_CHARACTERS = %w{" '}
7
7
  A = "a"
@@ -1,43 +1,45 @@
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
- class Puppet::Pops::Lookup
4
+ module Puppet::Pops::Lookup
5
5
  # Performs a lookup in the configured scopes and optionally merges the default.
6
6
  #
7
7
  # This is a backing function and all parameters are assumed to have been type checked.
8
8
  # See puppet/functions/lookup.rb for full documentation and all parameter combinations.
9
9
  #
10
- # @param scope [Puppet::Parser::Scope] The scope to use for the lookup
11
10
  # @param name [String|Array<String>] The name or names to lookup
12
11
  # @param type [Puppet::Pops::Types::PAnyType|nil] The expected type of the found value
13
12
  # @param default_value [Object] The value to use as default when no value is found
14
13
  # @param has_default [Boolean] Set to _true_ if _default_value_ is included (_nil_ is a valid _default_value_)
15
- # @param override [Hash<String,Object>|nil] A map to use as override. Values found here are returned immediately (no merge)
16
- # @param default_values_hash [Hash<String,Object>] A map to use as the last resort (but before default)
17
- # @param merge [String|Hash<String,Object>|nil] Merge strategy or hash with strategy and options
14
+ # @param merge [Puppet::Pops::MergeStrategy,String,Hash<String,Object>,nil] Merge strategy or hash with strategy and options
15
+ # @param lookup_invocation [Puppet::Pops::Lookup::Invocation] Invocation data containing scope, overrides, and defaults
18
16
  # @return [Object] The found value
19
17
  #
20
- def self.lookup(scope, name, value_type, default_value, has_default, override, default_values_hash, merge)
21
- value_type = Puppet::Pops::Types::PDataType.new if value_type.nil?
18
+ def self.lookup(name, value_type, default_value, has_default, merge, lookup_invocation)
19
+ value_type = Puppet::Pops::Types::PDataType::DEFAULT if value_type.nil?
22
20
  names = name.is_a?(Array) ? name : [name]
23
21
 
24
22
  # find first name that yields a non-nil result and wrap it in a two element array
25
23
  # with name and value.
26
- not_found = Object.new
27
- result_with_name = names.reduce([nil,not_found]) do |memo, key|
28
- value = override.include?(key) ? assert_type('override', value_type, override[key]) : not_found
29
- value = search_and_merge(key, scope, merge, not_found) if value.equal?(not_found)
24
+ not_found = Puppet::Pops::MergeStrategy::NOT_FOUND
25
+ override_values = lookup_invocation.override_values
26
+ result_with_name = names.reduce([nil, not_found]) do |memo, key|
27
+ value = override_values.include?(key) ? assert_type('override', value_type, override_values[key]) : not_found
28
+ catch(:no_such_key) { value = search_and_merge(key, lookup_invocation, merge) } if value.equal?(not_found)
30
29
  break [key, assert_type('found', value_type, value)] unless value.equal?(not_found)
31
30
  memo
32
31
  end
33
32
 
34
- # Use the 'default_values_hash' map as a last resort if nothing is found
35
- if result_with_name[1].equal?(not_found) && !default_values_hash.empty?
36
- result_with_name = names.reduce(result_with_name) do |memo, key|
37
- value = default_values_hash.include?(key) ? assert_type('default_values_hash', value_type, default_values_hash[key]) : not_found
38
- memo = [ key, value ]
39
- break memo unless value.equal?(not_found)
40
- memo
33
+ # Use the 'default_values' hash as a last resort if nothing is found
34
+ if result_with_name[1].equal?(not_found)
35
+ default_values = lookup_invocation.default_values
36
+ unless default_values.empty?
37
+ result_with_name = names.reduce(result_with_name) do |memo, key|
38
+ value = default_values.include?(key) ? assert_type('default_values_hash', value_type, default_values[key]) : not_found
39
+ memo = [key, value]
40
+ break memo unless value.equal?(not_found)
41
+ memo
42
+ end
41
43
  end
42
44
  end
43
45
 
@@ -54,34 +56,10 @@ class Puppet::Pops::Lookup
54
56
  answer
55
57
  end
56
58
 
57
- def self.search_and_merge(name, scope, merge, not_found)
58
- in_global = lambda { lookup_with_databinding(name, scope, merge) }
59
- in_env = lambda { Puppet::DataProviders.lookup_in_environment(name, scope, merge) }
60
- in_module = lambda { Puppet::DataProviders.lookup_in_module(name, scope, merge) }
61
-
62
- [in_global, in_env, in_module].reduce(not_found) do |memo, f|
63
- found = false # can't trust catch return value since nil is valid
64
- value = catch (:no_such_key) do
65
- answer = f.call
66
- found = true
67
- answer
68
- end
69
- next memo unless found
70
- break value if merge.nil? # value found and no merge
71
- strategy = Puppet::Pops::MergeStrategy.strategy(merge)
72
- memo.equal?(not_found) ? strategy.convert_value(value) : strategy.merge(memo, value)
73
- end
74
- end
75
- private_class_method :search_and_merge
76
-
77
- def self.lookup_with_databinding(key, scope, merge)
78
- begin
79
- Puppet::DataBinding.indirection.find(key, { :environment => scope.environment.to_s, :variables => scope, :merge => merge })
80
- rescue Puppet::DataBinding::LookupError => e
81
- raise Puppet::Error, "Error from DataBinding '#{Puppet[:data_binding_terminus]}' while looking up '#{name}': #{e.message}", e
82
- end
59
+ # @api private
60
+ def self.search_and_merge(name, lookup_invocation, merge)
61
+ return Puppet::DataProviders.lookup_adapter(lookup_invocation).lookup(name, lookup_invocation, merge)
83
62
  end
84
- private_class_method :lookup_with_databinding
85
63
 
86
64
  def self.assert_type(subject, type, value)
87
65
  Puppet::Pops::Types::TypeAsserter.assert_instance_of(subject, type, value)
@@ -89,8 +67,8 @@ class Puppet::Pops::Lookup
89
67
  private_class_method :assert_type
90
68
 
91
69
  def self.fail_lookup(names)
92
- name_part = names.size == 1 ? "the name '#{names[0]}'" : 'any of the names [' + names.map {|n| "'#{n}'"} .join(', ') + ']'
93
- raise Puppet::Error, "Function lookup() did not find a value for #{name_part}"
70
+ name_part = names.size == 1 ? "the name '#{names[0]}'" : 'any of the names [' + names.map { |n| "'#{n}'" }.join(', ') + ']'
71
+ raise Puppet::DataBinding::LookupError, "Function lookup() did not find a value for #{name_part}"
94
72
  end
95
73
  private_class_method :fail_lookup
96
74
  end