puppet 4.2.0 → 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (422) hide show
  1. data/CONTRIBUTING.md +1 -1
  2. data/Gemfile +5 -7
  3. data/README.md +1 -1
  4. data/Rakefile +20 -0
  5. data/ext/debian/puppet.init +0 -1
  6. data/ext/debian/puppet.logrotate +14 -5
  7. data/ext/osx/puppet.plist +2 -4
  8. data/ext/project_data.yaml +1 -1
  9. data/ext/redhat/client.init +65 -12
  10. data/ext/redhat/logrotate +15 -3
  11. data/ext/redhat/puppet.spec.erb +5 -1
  12. data/ext/redhat/server.init +1 -1
  13. data/ext/solaris/smf/puppet +44 -0
  14. data/ext/solaris/smf/puppet.xml +44 -0
  15. data/ext/suse/client.init +27 -27
  16. data/ext/suse/server.init +2 -2
  17. data/ext/systemd/puppet.service +1 -0
  18. data/install.rb +21 -39
  19. data/lib/hiera/puppet_function.rb +5 -5
  20. data/lib/puppet/agent/locker.rb +11 -2
  21. data/lib/puppet/agent.rb +4 -4
  22. data/lib/puppet/application/agent.rb +28 -14
  23. data/lib/puppet/application/apply.rb +17 -4
  24. data/lib/puppet/application/cert.rb +16 -0
  25. data/lib/puppet/application/filebucket.rb +78 -4
  26. data/lib/puppet/application/lookup.rb +356 -0
  27. data/lib/puppet/application/master.rb +5 -1
  28. data/lib/puppet/configurer.rb +9 -5
  29. data/lib/puppet/context/trusted_information.rb +21 -1
  30. data/lib/puppet/context.rb +16 -1
  31. data/lib/puppet/daemon.rb +17 -13
  32. data/lib/puppet/data_binding.rb +4 -2
  33. data/lib/puppet/data_providers/data_adapter.rb +7 -68
  34. data/lib/puppet/data_providers/data_function_support.rb +5 -26
  35. data/lib/puppet/data_providers/function_env_data_provider.rb +0 -10
  36. data/lib/puppet/data_providers/function_module_data_provider.rb +0 -22
  37. data/lib/puppet/data_providers/hiera_config.rb +106 -0
  38. data/lib/puppet/data_providers/hiera_env_data_provider.rb +18 -0
  39. data/lib/puppet/data_providers/hiera_interpolate.rb +97 -0
  40. data/lib/puppet/data_providers/hiera_module_data_provider.rb +23 -0
  41. data/lib/puppet/data_providers/hiera_support.rb +37 -0
  42. data/lib/puppet/data_providers/json_data_provider_factory.rb +31 -0
  43. data/lib/puppet/data_providers/lookup_adapter.rb +200 -0
  44. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +32 -0
  45. data/lib/puppet/data_providers.rb +12 -13
  46. data/lib/puppet/defaults.rb +14 -3
  47. data/lib/puppet/environments.rb +94 -6
  48. data/lib/puppet/error.rb +4 -0
  49. data/lib/puppet/face/module/changes.rb +2 -1
  50. data/lib/puppet/feature/cfacter.rb +1 -0
  51. data/lib/puppet/file_bucket/dipper.rb +58 -2
  52. data/lib/puppet/file_system/windows.rb +3 -1
  53. data/lib/puppet/functions/assert_type.rb +48 -12
  54. data/lib/puppet/functions/defined.rb +79 -48
  55. data/lib/puppet/functions/each.rb +85 -27
  56. data/lib/puppet/functions/epp.rb +29 -37
  57. data/lib/puppet/functions/filter.rb +60 -25
  58. data/lib/puppet/functions/hiera.rb +76 -3
  59. data/lib/puppet/functions/hiera_array.rb +65 -3
  60. data/lib/puppet/functions/hiera_hash.rb +74 -2
  61. data/lib/puppet/functions/hiera_include.rb +77 -4
  62. data/lib/puppet/functions/inline_epp.rb +44 -71
  63. data/lib/puppet/functions/lookup.rb +19 -17
  64. data/lib/puppet/functions/map.rb +56 -21
  65. data/lib/puppet/functions/match.rb +29 -12
  66. data/lib/puppet/functions/reduce.rb +95 -58
  67. data/lib/puppet/functions/versioncmp.rb +36 -0
  68. data/lib/puppet/functions/with.rb +15 -7
  69. data/lib/puppet/functions.rb +2 -4
  70. data/lib/puppet/indirector/catalog/compiler.rb +3 -3
  71. data/lib/puppet/indirector/catalog/static_compiler.rb +46 -30
  72. data/lib/puppet/indirector/data_binding/none.rb +4 -1
  73. data/lib/puppet/indirector/file_bucket_file/file.rb +58 -1
  74. data/lib/puppet/indirector/hiera.rb +4 -0
  75. data/lib/puppet/indirector/indirection.rb +6 -1
  76. data/lib/puppet/indirector/json.rb +1 -1
  77. data/lib/puppet/indirector/msgpack.rb +1 -1
  78. data/lib/puppet/indirector/request.rb +7 -8
  79. data/lib/puppet/indirector/resource_type/parser.rb +5 -3
  80. data/lib/puppet/info_service/class_information_service.rb +111 -0
  81. data/lib/puppet/info_service.rb +7 -0
  82. data/lib/puppet/module_tool/applications/unpacker.rb +1 -1
  83. data/lib/puppet/module_tool/metadata.rb +32 -9
  84. data/lib/puppet/module_tool/skeleton/templates/generator/README.md.erb +42 -38
  85. data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +25 -18
  86. data/lib/puppet/network/authconfig.rb +21 -1
  87. data/lib/puppet/network/authorization.rb +8 -1
  88. data/lib/puppet/network/http/api/master/v3/environment.rb +59 -0
  89. data/lib/puppet/network/http/api/master/v3.rb +7 -1
  90. data/lib/puppet/node/environment.rb +9 -2
  91. data/lib/puppet/node.rb +11 -5
  92. data/lib/puppet/parser/ast/pops_bridge.rb +39 -1
  93. data/lib/puppet/parser/compiler/catalog_validator/env_relationship_validator.rb +64 -0
  94. data/lib/puppet/parser/compiler/catalog_validator/relationship_validator.rb +38 -0
  95. data/lib/puppet/parser/compiler/catalog_validator/site_validator.rb +20 -0
  96. data/lib/puppet/parser/compiler/catalog_validator.rb +33 -0
  97. data/lib/puppet/parser/compiler.rb +300 -12
  98. data/lib/puppet/parser/environment_compiler.rb +165 -0
  99. data/lib/puppet/parser/functions/assert_type.rb +46 -16
  100. data/lib/puppet/parser/functions/defined.rb +105 -68
  101. data/lib/puppet/parser/functions/each.rb +85 -27
  102. data/lib/puppet/parser/functions/epp.rb +29 -37
  103. data/lib/puppet/parser/functions/filter.rb +59 -23
  104. data/lib/puppet/parser/functions/hiera.rb +83 -27
  105. data/lib/puppet/parser/functions/hiera_array.rb +71 -28
  106. data/lib/puppet/parser/functions/hiera_hash.rb +81 -30
  107. data/lib/puppet/parser/functions/hiera_include.rb +81 -40
  108. data/lib/puppet/parser/functions/inline_epp.rb +35 -60
  109. data/lib/puppet/parser/functions/inline_template.rb +2 -2
  110. data/lib/puppet/parser/functions/map.rb +55 -20
  111. data/lib/puppet/parser/functions/match.rb +27 -12
  112. data/lib/puppet/parser/functions/reduce.rb +97 -60
  113. data/lib/puppet/parser/functions/with.rb +16 -8
  114. data/lib/puppet/parser/resource.rb +103 -21
  115. data/lib/puppet/parser.rb +3 -0
  116. data/lib/puppet/plugins/configuration.rb +3 -2
  117. data/lib/puppet/plugins/data_providers/data_provider.rb +283 -0
  118. data/lib/puppet/plugins/data_providers/registry.rb +84 -0
  119. data/lib/puppet/plugins/data_providers.rb +12 -60
  120. data/lib/puppet/pops/adapters.rb +12 -0
  121. data/lib/puppet/pops/binder/binder.rb +2 -2
  122. data/lib/puppet/pops/binder/bindings_checker.rb +1 -1
  123. data/lib/puppet/pops/binder/bindings_label_provider.rb +3 -1
  124. data/lib/puppet/pops/binder/bindings_loader.rb +6 -2
  125. data/lib/puppet/pops/binder/bindings_model_meta.rb +2 -2
  126. data/lib/puppet/pops/binder/config/binder_config.rb +1 -1
  127. data/lib/puppet/pops/binder/injector.rb +4 -4
  128. data/lib/puppet/pops/binder/key_factory.rb +3 -9
  129. data/lib/puppet/pops/binder/scheme_handler/module_scheme.rb +68 -9
  130. data/lib/puppet/pops/evaluator/access_operator.rb +27 -60
  131. data/lib/puppet/pops/evaluator/closure.rb +8 -8
  132. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
  133. data/lib/puppet/pops/evaluator/evaluator_impl.rb +10 -6
  134. data/lib/puppet/pops/evaluator/literal_evaluator.rb +87 -0
  135. data/lib/puppet/pops/evaluator/relationship_operator.rb +7 -1
  136. data/lib/puppet/pops/functions/dispatcher.rb +3 -3
  137. data/lib/puppet/pops/issues.rb +11 -3
  138. data/lib/puppet/pops/label_provider.rb +1 -1
  139. data/lib/puppet/pops/lookup/explainer.rb +402 -0
  140. data/lib/puppet/pops/lookup/invocation.rb +117 -0
  141. data/lib/puppet/pops/lookup.rb +25 -47
  142. data/lib/puppet/pops/merge_strategy.rb +73 -5
  143. data/lib/puppet/pops/model/factory.rb +38 -3
  144. data/lib/puppet/pops/model/model_label_provider.rb +10 -1
  145. data/lib/puppet/pops/model/model_meta.rb +19 -1
  146. data/lib/puppet/pops/model/model_tree_dumper.rb +18 -0
  147. data/lib/puppet/pops/parser/code_merger.rb +13 -1
  148. data/lib/puppet/pops/parser/egrammar.ra +65 -2
  149. data/lib/puppet/pops/parser/eparser.rb +1569 -1241
  150. data/lib/puppet/pops/parser/lexer2.rb +32 -1
  151. data/lib/puppet/pops/parser/locator.rb +1 -1
  152. data/lib/puppet/pops/parser/parser_support.rb +25 -13
  153. data/lib/puppet/pops/patterns.rb +3 -0
  154. data/lib/puppet/pops/types/enumeration.rb +1 -2
  155. data/lib/puppet/pops/types/type_asserter.rb +16 -15
  156. data/lib/puppet/pops/types/type_assertion_error.rb +1 -0
  157. data/lib/puppet/pops/types/type_calculator.rb +171 -1020
  158. data/lib/puppet/pops/types/type_factory.rb +87 -148
  159. data/lib/puppet/pops/types/type_mismatch_describer.rb +743 -0
  160. data/lib/puppet/pops/types/type_parser.rb +118 -129
  161. data/lib/puppet/pops/types/types.rb +1394 -255
  162. data/lib/puppet/pops/types/types_meta.rb +0 -234
  163. data/lib/puppet/pops/validation/checker4_0.rb +49 -1
  164. data/lib/puppet/pops/validation/validator_factory_4_0.rb +3 -1
  165. data/lib/puppet/pops/validation.rb +7 -2
  166. data/lib/puppet/pops.rb +19 -17
  167. data/lib/puppet/provider/augeas/augeas.rb +50 -0
  168. data/lib/puppet/provider/exec.rb +6 -1
  169. data/lib/puppet/provider/group/directoryservice.rb +10 -0
  170. data/lib/puppet/provider/package/dnf.rb +41 -0
  171. data/lib/puppet/provider/package/gem.rb +7 -2
  172. data/lib/puppet/provider/package/nim.rb +1 -1
  173. data/lib/puppet/provider/package/rpm.rb +1 -0
  174. data/lib/puppet/provider/package/windows/exe_package.rb +10 -8
  175. data/lib/puppet/provider/package/windows/msi_package.rb +4 -3
  176. data/lib/puppet/provider/package/windows/package.rb +9 -1
  177. data/lib/puppet/provider/package/yum.rb +20 -9
  178. data/lib/puppet/provider/service/bsd.rb +1 -1
  179. data/lib/puppet/provider/service/debian.rb +21 -0
  180. data/lib/puppet/provider/service/init.rb +6 -0
  181. data/lib/puppet/provider/service/launchd.rb +36 -7
  182. data/lib/puppet/provider/service/rcng.rb +51 -0
  183. data/lib/puppet/provider/service/redhat.rb +2 -1
  184. data/lib/puppet/provider/service/smf.rb +43 -2
  185. data/lib/puppet/provider/service/src.rb +27 -0
  186. data/lib/puppet/provider/service/systemd.rb +25 -5
  187. data/lib/puppet/provider/sshkey/parsed.rb +19 -9
  188. data/lib/puppet/provider/zone/solaris.rb +2 -2
  189. data/lib/puppet/reference/configuration.rb +10 -4
  190. data/lib/puppet/reference/report.rb +9 -12
  191. data/lib/puppet/reports.rb +5 -1
  192. data/lib/puppet/resource/capability_finder.rb +95 -0
  193. data/lib/puppet/resource/catalog.rb +47 -7
  194. data/lib/puppet/resource/status.rb +0 -2
  195. data/lib/puppet/resource/type.rb +238 -44
  196. data/lib/puppet/resource/type_collection.rb +60 -2
  197. data/lib/puppet/resource.rb +50 -73
  198. data/lib/puppet/settings/file_setting.rb +10 -9
  199. data/lib/puppet/settings.rb +2 -2
  200. data/lib/puppet/ssl/certificate_authority/interface.rb +2 -2
  201. data/lib/puppet/ssl/oids.rb +9 -1
  202. data/lib/puppet/transaction/additional_resource_generator.rb +71 -8
  203. data/lib/puppet/transaction/resource_harness.rb +9 -4
  204. data/lib/puppet/transaction.rb +8 -1
  205. data/lib/puppet/type/augeas.rb +8 -0
  206. data/lib/puppet/type/file/source.rb +14 -12
  207. data/lib/puppet/type/package.rb +9 -6
  208. data/lib/puppet/type/user.rb +4 -2
  209. data/lib/puppet/type.rb +78 -7
  210. data/lib/puppet/util/command_line.rb +4 -0
  211. data/lib/puppet/util/execution.rb +18 -2
  212. data/lib/puppet/util/tagging.rb +7 -1
  213. data/lib/puppet/util/windows/adsi.rb +5 -2
  214. data/lib/puppet/util/windows/security.rb +4 -1
  215. data/lib/puppet/util/windows/taskscheduler.rb +1 -1
  216. data/lib/puppet/util.rb +9 -1
  217. data/lib/puppet/version.rb +1 -1
  218. data/lib/puppet.rb +12 -0
  219. data/spec/fixtures/unit/application/environments/production/data/common.yaml +3 -0
  220. data/spec/fixtures/unit/application/environments/production/environment.conf +1 -0
  221. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/data/bad.json +3 -0
  222. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/environment.conf +2 -0
  223. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/hiera.yaml +5 -0
  224. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_json/manifests/site.pp +5 -0
  225. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/data/bad.yaml +3 -0
  226. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/environment.conf +2 -0
  227. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/hiera.yaml +5 -0
  228. data/spec/fixtures/unit/data_providers/environments/hiera_bad_syntax_yaml/manifests/site.pp +5 -0
  229. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/data/common.yaml +2 -0
  230. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/environment.conf +2 -0
  231. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/manifests/site.pp +1 -0
  232. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/data/common.yaml +2 -0
  233. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/manifests/init.pp +5 -0
  234. data/spec/fixtures/unit/data_providers/environments/hiera_defaults/modules/one/metadata.json +9 -0
  235. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/first.json +3 -0
  236. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/name.yaml +2 -0
  237. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/second.json +3 -0
  238. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data1/single.yaml +2 -0
  239. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/data2/single.yaml +2 -0
  240. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/environment.conf +2 -0
  241. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/hiera.yaml +18 -0
  242. data/spec/fixtures/unit/data_providers/environments/hiera_env_config/manifests/site.pp +5 -0
  243. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +46 -0
  244. data/spec/fixtures/unit/data_providers/environments/hiera_misc/environment.conf +2 -0
  245. data/spec/fixtures/unit/data_providers/environments/hiera_misc/manifests/site.pp +1 -0
  246. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/data/common.yaml +30 -0
  247. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/manifests/init.pp +13 -0
  248. data/spec/fixtures/unit/data_providers/environments/hiera_misc/modules/one/metadata.json +9 -0
  249. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/environment.conf +2 -0
  250. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/manifests/site.pp +1 -0
  251. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/first.json +3 -0
  252. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/name.yaml +1 -0
  253. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/second.json +3 -0
  254. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data1/single.yaml +2 -0
  255. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/data2/single.yaml +2 -0
  256. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/hiera.yaml +18 -0
  257. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/manifests/init.pp +5 -0
  258. data/spec/fixtures/unit/data_providers/environments/hiera_module_config/modules/one/metadata.json +9 -0
  259. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +1 -0
  260. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_module_data.rb +1 -0
  261. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/data/first.json +3 -0
  262. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/hiera.yaml +8 -0
  263. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/manifests/init.pp +5 -0
  264. data/spec/fixtures/unit/functions/lookup/environments/production/modules/hieraprovider/metadata.json +9 -0
  265. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +9 -0
  266. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/manifests/init.pp +3 -0
  267. data/spec/fixtures/unit/functions/lookup/environments/production/modules/meta/metadata.json +9 -0
  268. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +10 -0
  269. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +23 -0
  270. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/manifests/init.pp +3 -0
  271. data/spec/fixtures/unit/functions/lookup/environments/production/modules/metawcp/metadata.json +9 -0
  272. data/spec/fixtures/unit/provider/package/yum/yum-check-update-security.txt +184 -0
  273. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_get/should_yield_to_the_block.yml +24 -0
  274. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_head/should_yield_to_the_block.yml +24 -0
  275. data/spec/fixtures/vcr/cassettes/Puppet_Network_HTTP_Connection/when_handling_requests/_request_post/should_yield_to_the_block.yml +24 -0
  276. data/spec/integration/data_binding_spec.rb +229 -0
  277. data/spec/integration/file_bucket/file_spec.rb +2 -2
  278. data/spec/integration/parser/compiler_spec.rb +30 -24
  279. data/spec/integration/parser/resource_expressions_spec.rb +4 -4
  280. data/spec/integration/parser/undef_param_spec.rb +1 -1
  281. data/spec/integration/provider/package_spec.rb +3 -1
  282. data/spec/integration/resource/catalog_spec.rb +1 -1
  283. data/spec/integration/ssl/certificate_authority_spec.rb +0 -1
  284. data/spec/integration/ssl/certificate_request_spec.rb +0 -1
  285. data/spec/integration/ssl/certificate_revocation_list_spec.rb +0 -1
  286. data/spec/integration/ssl/host_spec.rb +0 -1
  287. data/spec/integration/type/package_spec.rb +2 -0
  288. data/spec/integration/util/rdoc/parser_spec.rb +1 -1
  289. data/spec/integration/util/windows/security_spec.rb +18 -0
  290. data/spec/lib/matchers/include_in_order.rb +2 -2
  291. data/spec/shared_behaviours/iterative_functions.rb +8 -8
  292. data/spec/spec_helper.rb +7 -0
  293. data/spec/unit/agent/locker_spec.rb +4 -4
  294. data/spec/unit/agent_spec.rb +0 -8
  295. data/spec/unit/application/agent_spec.rb +5 -0
  296. data/spec/unit/application/apply_spec.rb +9 -1
  297. data/spec/unit/application/filebucket_spec.rb +88 -2
  298. data/spec/unit/application/lookup_spec.rb +195 -0
  299. data/spec/unit/application/master_spec.rb +2 -2
  300. data/spec/unit/application_spec.rb +3 -3
  301. data/spec/unit/appmgmt_spec.rb +657 -0
  302. data/spec/unit/capability_spec.rb +414 -0
  303. data/spec/unit/configurer_spec.rb +7 -1
  304. data/spec/unit/context/trusted_information_spec.rb +24 -1
  305. data/spec/unit/daemon_spec.rb +18 -8
  306. data/spec/unit/data_providers/hiera_data_provider_spec.rb +201 -0
  307. data/spec/unit/environments_spec.rb +2 -0
  308. data/spec/unit/face/node_spec.rb +1 -1
  309. data/spec/unit/file_bucket/dipper_spec.rb +210 -1
  310. data/spec/unit/file_serving/configuration_spec.rb +1 -1
  311. data/spec/unit/file_system_spec.rb +20 -0
  312. data/spec/unit/functions/assert_type_spec.rb +5 -7
  313. data/spec/unit/functions/defined_spec.rb +2 -2
  314. data/spec/unit/functions/epp_spec.rb +2 -2
  315. data/spec/unit/functions/filter_spec.rb +18 -0
  316. data/spec/unit/functions/hiera_spec.rb +2 -2
  317. data/spec/unit/functions/lookup_spec.rb +200 -9
  318. data/spec/unit/functions/regsubst_spec.rb +17 -8
  319. data/spec/unit/functions/scanf_spec.rb +1 -1
  320. data/spec/unit/functions/split_spec.rb +2 -2
  321. data/spec/unit/functions/versioncmp_spec.rb +36 -0
  322. data/spec/unit/functions4_spec.rb +58 -72
  323. data/spec/unit/graph/sequential_prioritizer_spec.rb +1 -1
  324. data/spec/unit/indirector/catalog/compiler_spec.rb +28 -8
  325. data/spec/unit/indirector/catalog/static_compiler_spec.rb +38 -20
  326. data/spec/unit/indirector/data_binding/none_spec.rb +2 -2
  327. data/spec/unit/indirector/file_bucket_file/file_spec.rb +52 -1
  328. data/spec/unit/indirector/indirection_spec.rb +13 -2
  329. data/spec/unit/indirector/request_spec.rb +8 -8
  330. data/spec/unit/indirector/ssl_file_spec.rb +1 -1
  331. data/spec/unit/indirector/yaml_spec.rb +1 -1
  332. data/spec/unit/info_service_spec.rb +236 -0
  333. data/spec/unit/module_tool/application_spec.rb +1 -1
  334. data/spec/unit/module_tool/applications/builder_spec.rb +1 -1
  335. data/spec/unit/module_tool/metadata_spec.rb +31 -2
  336. data/spec/unit/network/authconfig_spec.rb +62 -32
  337. data/spec/unit/network/authorization_spec.rb +30 -2
  338. data/spec/unit/network/authstore_spec.rb +1 -1
  339. data/spec/unit/network/http/compression_spec.rb +1 -1
  340. data/spec/unit/network/http/connection_spec.rb +14 -19
  341. data/spec/unit/network/http/handler_spec.rb +0 -5
  342. data/spec/unit/network/rights_spec.rb +3 -3
  343. data/spec/unit/node_spec.rb +27 -0
  344. data/spec/unit/parser/ast/leaf_spec.rb +1 -1
  345. data/spec/unit/parser/compiler_spec.rb +86 -2
  346. data/spec/unit/parser/functions/create_resources_spec.rb +1 -1
  347. data/spec/unit/parser/resource_spec.rb +2 -20
  348. data/spec/unit/pops/binder/config/binder_config_spec.rb +1 -1
  349. data/spec/unit/pops/binder/injector_spec.rb +3 -3
  350. data/spec/unit/pops/evaluator/access_ops_spec.rb +13 -11
  351. data/spec/unit/pops/evaluator/basic_expressions_spec.rb +1 -2
  352. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +20 -11
  353. data/spec/unit/pops/evaluator/literal_evaluator_spec.rb +43 -0
  354. data/spec/unit/pops/label_provider_spec.rb +5 -1
  355. data/spec/unit/pops/parser/lexer2_spec.rb +39 -0
  356. data/spec/unit/pops/parser/parse_application_spec.rb +40 -0
  357. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +4 -0
  358. data/spec/unit/pops/parser/parse_capabilities_spec.rb +47 -0
  359. data/spec/unit/pops/parser/parse_site_spec.rb +38 -0
  360. data/spec/unit/pops/parser/parser_rspec_helper.rb +5 -0
  361. data/spec/unit/pops/parser/parser_spec.rb +18 -0
  362. data/spec/unit/pops/types/type_calculator_spec.rb +427 -444
  363. data/spec/unit/pops/types/type_factory_spec.rb +12 -12
  364. data/spec/unit/pops/types/type_parser_spec.rb +15 -12
  365. data/spec/unit/pops/validator/validator_spec.rb +68 -0
  366. data/spec/unit/property_spec.rb +1 -1
  367. data/spec/unit/provider/augeas/augeas_spec.rb +50 -0
  368. data/spec/unit/provider/group/directoryservice_spec.rb +33 -0
  369. data/spec/unit/provider/group/windows_adsi_spec.rb +3 -0
  370. data/spec/unit/provider/package/dnf_spec.rb +92 -0
  371. data/spec/unit/provider/package/gem_spec.rb +7 -0
  372. data/spec/unit/provider/package/nim_spec.rb +6 -6
  373. data/spec/unit/provider/package/rpm_spec.rb +25 -2
  374. data/spec/unit/provider/package/windows/package_spec.rb +41 -0
  375. data/spec/unit/provider/package/yum_spec.rb +35 -12
  376. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +10 -0
  377. data/spec/unit/provider/service/debian_spec.rb +28 -0
  378. data/spec/unit/provider/service/gentoo_spec.rb +1 -0
  379. data/spec/unit/provider/service/init_spec.rb +6 -0
  380. data/spec/unit/provider/service/launchd_spec.rb +85 -10
  381. data/spec/unit/provider/service/openrc_spec.rb +1 -0
  382. data/spec/unit/provider/service/rcng_spec.rb +41 -0
  383. data/spec/unit/provider/service/redhat_spec.rb +8 -1
  384. data/spec/unit/provider/service/smf_spec.rb +30 -5
  385. data/spec/unit/provider/service/src_spec.rb +20 -4
  386. data/spec/unit/provider/service/systemd_spec.rb +79 -29
  387. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +1 -1
  388. data/spec/unit/provider/sshkey/parsed_spec.rb +23 -0
  389. data/spec/unit/provider/user/windows_adsi_spec.rb +2 -1
  390. data/spec/unit/provider/zone/solaris_spec.rb +19 -0
  391. data/spec/unit/reports_spec.rb +10 -0
  392. data/spec/unit/resource/capability_finder_spec.rb +56 -0
  393. data/spec/unit/resource/catalog_spec.rb +31 -8
  394. data/spec/unit/resource/type_collection_spec.rb +23 -2
  395. data/spec/unit/resource/type_spec.rb +1 -1
  396. data/spec/unit/resource_spec.rb +23 -5
  397. data/spec/unit/settings/file_setting_spec.rb +31 -0
  398. data/spec/unit/settings_spec.rb +91 -2
  399. data/spec/unit/ssl/certificate_authority/interface_spec.rb +4 -3
  400. data/spec/unit/ssl/certificate_authority_spec.rb +5 -3
  401. data/spec/unit/ssl/host_spec.rb +2 -2
  402. data/spec/unit/ssl/oids_spec.rb +8 -0
  403. data/spec/unit/transaction/additional_resource_generator_spec.rb +78 -5
  404. data/spec/unit/transaction/report_spec.rb +24 -1
  405. data/spec/unit/transaction_spec.rb +7 -0
  406. data/spec/unit/type/exec_spec.rb +16 -8
  407. data/spec/unit/type/host_spec.rb +4 -4
  408. data/spec/unit/type/package_spec.rb +1 -0
  409. data/spec/unit/type/tidy_spec.rb +4 -4
  410. data/spec/unit/type/user_spec.rb +14 -7
  411. data/spec/unit/type/vlan_spec.rb +1 -1
  412. data/spec/unit/type_spec.rb +1 -1
  413. data/spec/unit/util/ldap/generator_spec.rb +1 -1
  414. data/spec/unit/util/network_device/cisco/device_spec.rb +1 -1
  415. data/spec/unit/util/network_device/transport/ssh_spec.rb +1 -1
  416. data/spec/unit/util/network_device_spec.rb +1 -1
  417. data/spec/unit/util/storage_spec.rb +5 -1
  418. data/spec/unit/util/windows/adsi_spec.rb +13 -0
  419. data/spec/unit/util_spec.rb +21 -2
  420. metadata +173 -7
  421. data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +0 -175
  422. data/spec/integration/data_binding.rb +0 -104
@@ -15,7 +15,18 @@ require 'puppet/pops/binder/scheme_handler/symbolic_scheme'
15
15
  # Does currently only support checking of optionality against files under a module. If the result should be loaded
16
16
  # from any other location it can not be marked as optional as it will be ignored.
17
17
  #
18
- class Puppet::Pops::Binder::SchemeHandler::ModuleScheme < Puppet::Pops::Binder::SchemeHandler::SymbolicScheme
18
+ module Puppet::Pops::Binder
19
+ class SchemeHandler::ModuleScheme < SchemeHandler::SymbolicScheme
20
+
21
+ METADATA_DATA_PROVIDER = 'data_provider'.freeze
22
+
23
+ def contributed_bindings(uri, scope, composer)
24
+ split_name, fqn = fqn_from_path(uri)
25
+ bindings = Puppet::Bindings.resolve(scope, split_name[0]) || load_bindings(uri, scope, composer, split_name, fqn)
26
+
27
+ # Must clone as the rest mutates the model
28
+ BindingsFactory.contributed_bindings(fqn, Marshal.load(Marshal.dump(bindings)))
29
+ end
19
30
 
20
31
  # Expands URIs with wildcards and checks optionality.
21
32
  # @param uri [URI] the uri to possibly expand
@@ -29,13 +40,18 @@ class Puppet::Pops::Binder::SchemeHandler::ModuleScheme < Puppet::Pops::Binder::
29
40
  # supports wild card in the module name
30
41
  case split_name[0]
31
42
  when '*'
32
- # create new URIs, one per module name that has a corresponding .rb file relative to its
33
- # '<root>/lib/puppet/bindings/'
43
+ # create new URIs, one per module name that has a corresponding data_provider entry in metadata.json
44
+ # or an .rb file relative to its '<root>/lib/puppet/bindings/'
34
45
  #
35
- composer.name_to_module.each_pair do | mod_name, mod |
36
- expanded_name_parts = [mod_name] + split_name[1..-1]
46
+ composer.name_to_module.each_pair do | module_name, mod |
47
+ expanded_name_parts = [module_name] + split_name[1..-1]
37
48
  expanded_name = expanded_name_parts.join('::')
38
- if Puppet::Pops::Binder::BindingsLoader.loadable?(mod.path, expanded_name)
49
+
50
+ if is_metadata?(split_name)
51
+ if mod.metadata && mod.metadata[METADATA_DATA_PROVIDER]
52
+ result << URI.parse('module:/' + expanded_name)
53
+ end
54
+ elsif BindingsLoader.loadable?(mod.path, expanded_name)
39
55
  result << URI.parse('module:/' + expanded_name)
40
56
  end
41
57
  end
@@ -43,11 +59,18 @@ class Puppet::Pops::Binder::SchemeHandler::ModuleScheme < Puppet::Pops::Binder::
43
59
  raise ArgumentError, "Bad bindings uri, the #{uri} has neither module name or wildcard '*' in its first path position"
44
60
  else
45
61
  joined_name = split_name.join('::')
62
+ module_name = split_name[0]
46
63
  # skip optional uri if it does not exist
47
64
  if is_optional?(uri)
48
- mod = composer.name_to_module[split_name[0]]
49
- if mod && Puppet::Binder::BindingsLoader.loadable?(mod.path, joined_name)
50
- result << URI.parse('module:/' + joined_name)
65
+ mod = composer.name_to_module[module_name]
66
+ unless mod.nil?
67
+ if is_metadata?(split_name)
68
+ if mod.metadata && mod.metadata[METADATA_DATA_PROVIDER]
69
+ result << URI.parse('module:/' + joined_name)
70
+ end
71
+ elsif BindingsLoader.loadable?(mod.path, joined_name)
72
+ result << URI.parse('module:/' + joined_name)
73
+ end
51
74
  end
52
75
  else
53
76
  # assume it exists (do not give error if not, since it may be excluded later)
@@ -81,4 +104,40 @@ class Puppet::Pops::Binder::SchemeHandler::ModuleScheme < Puppet::Pops::Binder::
81
104
  end
82
105
  result
83
106
  end
107
+
108
+ def load_bindings(uri, scope, composer, split_name, fqn)
109
+ module_name = split_name[0]
110
+ mod = composer.name_to_module[module_name]
111
+ # given module name must exist
112
+ raise ArgumentError, "Cannot load bindings '#{uri}' - module not found." if mod.nil?
113
+
114
+ if is_metadata?(split_name)
115
+ metadata = mod.metadata
116
+ data_provider = metadata.nil? ? nil : metadata[METADATA_DATA_PROVIDER]
117
+ unless data_provider.nil?
118
+ # bind the data provider in a binding named after the module
119
+ # loader.load('thallgren/sample_module_data', Puppet.lookup(:current_environment))
120
+ Puppet::Bindings.newbindings(module_name) do
121
+ bind {
122
+ name(module_name)
123
+ to(data_provider)
124
+ in_multibind(Puppet::Plugins::DataProviders::PER_MODULE_DATA_PROVIDER_KEY)
125
+ }
126
+ end
127
+ # pick up and return the just created and registered bindings
128
+ bindings = Puppet::Bindings.resolve(scope, module_name)
129
+ end
130
+ else
131
+ bindings = BindingsLoader.provide(scope, fqn)
132
+ end
133
+ raise ArgumentError, "Cannot load bindings '#{uri}' - no bindings found." unless bindings
134
+ bindings
135
+ end
136
+ private :load_bindings
137
+
138
+ def is_metadata?(split_name)
139
+ split_name.size > 1 && split_name[1] == 'metadata'
140
+ end
141
+ private :is_metadata?
142
+ end
84
143
  end
@@ -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
@@ -256,7 +256,11 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
256
256
  # Reserved Words fail to evaluate
257
257
  #
258
258
  def eval_ReservedWord(o, scope)
259
- fail(Puppet::Pops::Issues::RESERVED_WORD, o, {:word => o.word})
259
+ if !o.future
260
+ fail(Puppet::Pops::Issues::RESERVED_WORD, o, {:word => o.word})
261
+ else
262
+ o.word
263
+ end
260
264
  end
261
265
 
262
266
  def eval_LiteralDefault(o, scope)
@@ -661,7 +665,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
661
665
 
662
666
  evaluated_name = evaluate(tmp_name, scope)
663
667
  unless type_name_acceptable
664
- actual = type_calculator.generalize!(type_calculator.infer(evaluated_name)).to_s
668
+ actual = type_calculator.generalize(type_calculator.infer(evaluated_name)).to_s
665
669
  fail(Puppet::Pops::Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, {:actual => actual})
666
670
  end
667
671
 
@@ -680,7 +684,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
680
684
  evaluated_name.type_name # assume validated
681
685
 
682
686
  else
683
- actual = type_calculator.generalize!(type_calculator.infer(evaluated_name)).to_s
687
+ actual = type_calculator.generalize(type_calculator.infer(evaluated_name)).to_s
684
688
  fail(Puppet::Pops::Issues::ILLEGAL_RESOURCE_TYPE, o.type_name, {:actual=>actual})
685
689
  end
686
690
  end
@@ -716,7 +720,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
716
720
  fail(Puppet::Pops::Issues::MISSING_TITLE_AT, body.title, {:index => index})
717
721
 
718
722
  elsif !title.is_a?(String) && title != :default
719
- actual = type_calculator.generalize!(type_calculator.infer(title)).to_s
723
+ actual = type_calculator.generalize(type_calculator.infer(title)).to_s
720
724
  fail(Puppet::Pops::Issues::ILLEGAL_TITLE_TYPE_AT, body.title, {:index => index, :actual => actual})
721
725
 
722
726
  elsif title == EMPTY_STRING
@@ -775,7 +779,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
775
779
  def eval_AttributesOperation(o, scope)
776
780
  hashed_params = evaluate(o.expr, scope)
777
781
  unless hashed_params.is_a?(Hash)
778
- actual = type_calculator.generalize!(type_calculator.infer(hashed_params)).to_s
782
+ actual = type_calculator.generalize(type_calculator.infer(hashed_params)).to_s
779
783
  fail(Puppet::Pops::Issues::TYPE_MISMATCH, o.expr, {:expected => 'Hash', :actual => actual})
780
784
  end
781
785
  hashed_params.map { |k,v| create_resource_parameter(o, scope, k, v, :'=>') }
@@ -789,7 +793,7 @@ class Puppet::Pops::Evaluator::EvaluatorImpl
789
793
  if type.is_a?(Puppet::Pops::Types::PResourceType) && !type.type_name.nil? && type.title.nil?
790
794
  type.type_name # assume it is a valid name
791
795
  else
792
- actual = type_calculator.generalize!(type_calculator.infer(type))
796
+ actual = type_calculator.generalize(type_calculator.infer(type))
793
797
  fail(Issues::ILLEGAL_RESOURCE_TYPE, o.type_ref, {:actual => actual})
794
798
  end
795
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
@@ -261,11 +261,15 @@ module Puppet::Pops::Issues
261
261
  end
262
262
 
263
263
  ILLEGAL_NAME = hard_issue :ILLEGAL_NAME, :name do
264
- "Illegal name. The given name #{name} does not conform to the naming rule /^((::)?[a-z_]\w*)(::[a-z]\w*)*$/"
264
+ "Illegal name. The given name '#{name}' does not conform to the naming rule /^((::)?[a-z_]\w*)(::[a-z]\\w*)*$/"
265
+ end
266
+
267
+ ILLEGAL_PARAM_NAME = hard_issue :ILLEGAL_PARAM_NAME, :name do
268
+ "Illegal parameter name. The given name '#{name}' does not conform to the naming rule /^[a-z_]\\w*$/"
265
269
  end
266
270
 
267
271
  ILLEGAL_VAR_NAME = hard_issue :ILLEGAL_VAR_NAME, :name do
268
- "Illegal variable name, The given name '#{name}' does not conform to the naming rule /^((::)?[a-z]\w*)*((::)?[a-z_]\w*)$/"
272
+ "Illegal variable name, The given name '#{name}' does not conform to the naming rule /^((::)?[a-z]\\w*)*((::)?[a-z_]\\w*)$/"
269
273
  end
270
274
 
271
275
  ILLEGAL_NUMERIC_VAR_NAME = hard_issue :ILLEGAL_NUMERIC_VAR_NAME, :name do
@@ -529,7 +533,7 @@ module Puppet::Pops::Issues
529
533
  end
530
534
 
531
535
  IDEM_EXPRESSION_NOT_LAST = issue :IDEM_EXPRESSION_NOT_LAST do
532
- "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)"
533
537
  end
534
538
 
535
539
  IDEM_NOT_ALLOWED_LAST = hard_issue :IDEM_NOT_ALLOWED_LAST, :container do
@@ -540,6 +544,10 @@ module Puppet::Pops::Issues
540
544
  "Use of reserved word: #{word}, must be quoted if intended to be a String value"
541
545
  end
542
546
 
547
+ FUTURE_RESERVED_WORD = issue :FUTURE_RESERVED_WORD, :word do
548
+ "Use of future reserved word: '#{word}'"
549
+ end
550
+
543
551
  RESERVED_TYPE_NAME = hard_issue :RESERVED_TYPE_NAME, :name do
544
552
  "The name: '#{name}' is already defined by Puppet and can not be used as the name of #{label.a_an(semantic)}."
545
553
  end
@@ -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"