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
@@ -0,0 +1,33 @@
1
+ # Abstract class for a catalog validator that can be registered with the compiler to run at
2
+ # a certain stage.
3
+ class Puppet::Parser::Compiler
4
+ class CatalogValidator
5
+ PRE_FINISH = :pre_finish
6
+ FINAL = :final
7
+
8
+ # Returns true if the validator should run at the given stage. The default
9
+ # implementation will only run at stage `FINAL`
10
+ #
11
+ # @param stage [Symbol] One of the stage constants defined in this class
12
+ # @return [Boolean] true if the validator should run at the given stage
13
+ #
14
+ def self.validation_stage?(stage)
15
+ FINAL.equal?(stage)
16
+ end
17
+
18
+ attr_reader :catalog
19
+
20
+ # @param catalog [Puppet::Resource::Catalog] The catalog to validate
21
+ def initialize(catalog)
22
+ @catalog = catalog
23
+ end
24
+
25
+ # Validate some aspect of the catalog and raise a `CatalogValidationError` on failure
26
+ def validate
27
+ end
28
+ end
29
+
30
+ class CatalogValidationError < Puppet::Error
31
+ include Puppet::ExternalFileError
32
+ end
33
+ end
@@ -0,0 +1,64 @@
1
+ class Puppet::Parser::Compiler
2
+ # Validator that asserts that all capability resources that are referenced by 'consume' or 'require' has
3
+ # been exported by some other resource in the environment
4
+ class CatalogValidator::EnvironmentRelationshipValidator < CatalogValidator
5
+
6
+ def validate
7
+ assumed_exports = {}
8
+ exported = {}
9
+ catalog.resources.each do |resource|
10
+ next unless resource.is_a?(Puppet::Parser::Resource)
11
+ resource.eachparam do |param|
12
+ pclass = Puppet::Type.metaparamclass(param.name)
13
+ validate_relationship(resource, param, assumed_exports, exported) if !pclass.nil? && pclass < Puppet::Type::RelationshipMetaparam
14
+ end
15
+ end
16
+ assumed_exports.each_pair do |key, (param, cap)|
17
+ raise CatalogValidationError.new("Capability '#{cap}' referenced by '#{param.name}' is never exported", param.file, param.line) unless exported.include?(key)
18
+ end
19
+ nil
20
+ end
21
+
22
+ private
23
+
24
+ def validate_relationship(resource, param, assumed_exports, exported)
25
+ case param.name
26
+ when :require, :consume
27
+ add_capability_ref(param, param.value, assumed_exports)
28
+ when :export
29
+ add_exported(resource, param, param.value, exported)
30
+ end
31
+ end
32
+
33
+ def add_capability_ref(param, value, assumed_exports)
34
+ case value
35
+ when Array
36
+ value.each { |v| add_capability_ref(param, v, assumed_exports) }
37
+ when Puppet::Resource
38
+ rt = value.resource_type
39
+ unless rt.nil? || !rt.is_capability?
40
+ title_key = catalog.title_key_for_ref(value.ref)
41
+ assumed_exports[title_key] = [param, value]
42
+ end
43
+ nil
44
+ end
45
+ end
46
+
47
+ def add_exported(resource, param, value, hash)
48
+ case value
49
+ when Array
50
+ value.each { |v| add_exported(resource, param, v, hash) }
51
+ when Puppet::Resource
52
+ rt = value.resource_type
53
+ unless rt.nil? || !rt.is_capability?
54
+ title_key = catalog.title_key_for_ref(value.ref)
55
+ if hash.include?(title_key)
56
+ raise CatalogValidationError.new("'#{value}' is exported by both '#{hash[title_key]}' and '#{resource}'", param.file, param.line)
57
+ else
58
+ hash[title_key] = resource
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,38 @@
1
+ class Puppet::Parser::Compiler
2
+ # Validator that asserts that only 'require', 'consume', and 'export' is used when declaring relationships
3
+ # to capability resources.
4
+ class CatalogValidator::RelationshipValidator < CatalogValidator
5
+ def validate
6
+ catalog.resources.each do |resource|
7
+ next unless resource.is_a?(Puppet::Parser::Resource)
8
+ resource.eachparam do |param|
9
+ pclass = Puppet::Type.metaparamclass(param.name)
10
+ validate_relationship(param) if !pclass.nil? && pclass < Puppet::Type::RelationshipMetaparam
11
+ end
12
+ end
13
+ nil
14
+ end
15
+
16
+ private
17
+
18
+ def validate_relationship(param)
19
+ unless [:require, :consume, :export].find {|pname| pname == param.name }
20
+ raise CatalogValidationError.new("'#{param.name}' is not a valid relationship to a capability", param.file, param.line) if has_capability?(param.value)
21
+ end
22
+ end
23
+
24
+ def has_capability?(value)
25
+ case value
26
+ when Array
27
+ value.find { |v| has_capability?(v) }
28
+ when Puppet::Resource
29
+ rt = value.resource_type
30
+ !rt.nil? && rt.is_capability?
31
+ else
32
+ false
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+
@@ -0,0 +1,20 @@
1
+ class Puppet::Parser::Compiler
2
+ # Validator that asserts that only application components can appear inside a site.
3
+ class CatalogValidator::SiteValidator < CatalogValidator
4
+ def self.validation_stage?(stage)
5
+ PRE_FINISH.equal?(stage)
6
+ end
7
+
8
+ def validate
9
+ the_site_resource = catalog.resource('Site', 'site')
10
+ return unless the_site_resource
11
+
12
+ catalog.downstream_from_vertex(the_site_resource).keys.each do |r|
13
+ unless r.is_application_component? || r.resource_type.application?
14
+ raise CatalogValidationError.new("Only application components can appear inside a site - #{r} is not allowed", r.file, r.line)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+
@@ -0,0 +1,165 @@
1
+ require 'puppet/parser/compiler'
2
+
3
+ class Puppet::Parser::EnvironmentCompiler < Puppet::Parser::Compiler
4
+ def self.compile(env)
5
+ begin
6
+ $env_module_directories = nil
7
+ env.check_for_reparse
8
+
9
+ node = Puppet::Node.new(env)
10
+ node.environment = env
11
+ new(node).compile
12
+ rescue => detail
13
+ message = "#{detail} in environment #{env.name}"
14
+ Puppet.log_exception(detail, message)
15
+ raise Puppet::Error, message, detail.backtrace
16
+ end
17
+ end
18
+
19
+ def add_catalog_validators
20
+ super
21
+ add_catalog_validator(CatalogValidator::SiteValidator)
22
+ add_catalog_validator(CatalogValidator::EnvironmentRelationshipValidator)
23
+ end
24
+
25
+ def compile
26
+ Puppet.override(@context_overrides, "For compiling environment catalog #{environment.name}") do
27
+ @catalog.environment_instance = environment
28
+
29
+ Puppet::Util::Profiler.profile("Env Compile: Created settings scope", [:compiler, :create_settings_scope]) { create_settings_scope }
30
+
31
+ activate_binder
32
+
33
+ Puppet::Util::Profiler.profile("Env Compile: Evaluated main", [:compiler, :evaluate_main]) { evaluate_main }
34
+
35
+ Puppet::Util::Profiler.profile("Env Compile: Evaluated site", [:compiler, :evaluate_site]) { evaluate_site }
36
+
37
+ Puppet::Util::Profiler.profile("Env Compile: Evaluated application instances", [:compiler, :evaluate_applications]) { evaluate_applications }
38
+
39
+ Puppet::Util::Profiler.profile("Env Compile: Prune", [:compiler, :prune_catalog]) { prune_catalog }
40
+
41
+ Puppet::Util::Profiler.profile("Env Compile: Validate Catalog pre-finish", [:compiler, :validate_pre_finish]) do
42
+ validate_catalog(CatalogValidator::PRE_FINISH)
43
+ end
44
+
45
+ Puppet::Util::Profiler.profile("Env Compile: Finished catalog", [:compiler, :finish_catalog]) { finish }
46
+
47
+ fail_on_unevaluated
48
+
49
+ Puppet::Util::Profiler.profile("Env Compile: Validate Catalog final", [:compiler, :validate_final]) do
50
+ validate_catalog(CatalogValidator::FINAL)
51
+ end
52
+
53
+ if block_given?
54
+ yield @catalog
55
+ else
56
+ @catalog
57
+ end
58
+ end
59
+ end
60
+
61
+ # @api private
62
+ def prune_catalog
63
+ prune_env_catalog
64
+ end
65
+
66
+ # Prunes the catalog by dropping all resources that are not contained under the Site (if a site expression is used).
67
+ # As a consequence all edges to/from dropped resources are also dropped.
68
+ # Once the pruning is performed, this compiler returns the pruned list when calling the #resources method.
69
+ # The pruning does not alter the order of resources in the resources list.
70
+ #
71
+ def prune_env_catalog
72
+ # Everything under Class[main], that is not under (inclusive of) Site[site] should be pruned as those resources
73
+ # are intended for nodes in a node catalog.
74
+ #
75
+ the_main_class_resource = @catalog.resource('Class', '')
76
+ the_site_resource = @catalog.resource('Site', 'site')
77
+
78
+ # Get downstream vertexes returns a hash where the keys are the resources and values nesting level
79
+ rooted_in_main = @catalog.downstream_from_vertex(the_main_class_resource).keys
80
+
81
+ to_be_removed =
82
+ if the_site_resource
83
+ keep_from_site = @catalog.downstream_from_vertex(the_site_resource).keys
84
+ keep_from_site << the_site_resource
85
+ rooted_in_main - keep_from_site
86
+ else
87
+ rooted_in_main
88
+ end
89
+
90
+ @catalog.remove_resource(*to_be_removed)
91
+ # The compiler keeps a list of added resources, this shadows that list with the now pruned result
92
+ @pruned_resources = @catalog.resources
93
+ end
94
+
95
+ def add_resource(scope, resource)
96
+ @resources << resource
97
+ @catalog.add_resource(resource)
98
+
99
+ if !resource.class? && resource[:stage]
100
+ raise ArgumentError, "Only classes can set 'stage'; normal resources like #{resource} cannot change run stage"
101
+ end
102
+
103
+ # Stages should not be inside of classes. They are always a
104
+ # top-level container, regardless of where they appear in the
105
+ # manifest.
106
+ return if resource.stage?
107
+
108
+ # This adds a resource to the class it lexically appears in in the
109
+ # manifest.
110
+ unless resource.class?
111
+ @catalog.add_edge(scope.resource, resource)
112
+ end
113
+ resource.mark_unevaluated_consumer if is_capability_consumer?(resource)
114
+ assert_app_in_site(scope, resource)
115
+ end
116
+
117
+ def evaluate_ast_node()
118
+ # Do nothing, the environment catalog is not built for a particular node.
119
+ end
120
+
121
+ def on_empty_site
122
+ Puppet.warning("Environment Compiler: Could not find a site definition to evaluate")
123
+ end
124
+
125
+ def evaluate_applications
126
+ exceptwrap do
127
+ resources.select { |resource| type = resource.resource_type; type.is_a?(Puppet::Resource::Type) && type.application? }.each do |resource|
128
+ Puppet::Util::Profiler.profile("Evaluated application #{resource}", [:compiler, :evaluate_resource, resource]) do
129
+ resource.evaluate
130
+ end
131
+ end
132
+ end
133
+ end
134
+
135
+ def evaluate_classes(titles, scope, lazy)
136
+ # Always lazy in an Environment compilation
137
+ super(titles, scope, true)
138
+ end
139
+
140
+ # Overrides the regular compiler to be able to return the list of resources after a prune
141
+ # has taken place in the graph representation. Before a prune, the list is the same as in the regular
142
+ # compiler
143
+ #
144
+ def resources
145
+ @pruned_resources || super
146
+ end
147
+
148
+ def is_capability?(value)
149
+ if value.is_a?(Array)
150
+ value.find { |ev| is_capability?(ev) }
151
+ elsif value.is_a?(Puppet::Resource)
152
+ rstype = value.resource_type
153
+ rstype.nil? ? false : rstype.is_capability?
154
+ else
155
+ false
156
+ end
157
+ end
158
+ private :is_capability?
159
+
160
+ def is_capability_consumer?(resource)
161
+ resource.eachparam { |param| return true if (param.name == :consume || param.name == :require) && is_capability?(param.value) }
162
+ false
163
+ end
164
+ private :is_capability_consumer?
165
+ end
@@ -2,29 +2,59 @@ Puppet::Parser::Functions::newfunction(
2
2
  :assert_type,
3
3
  :type => :rvalue,
4
4
  :arity => -3,
5
- :doc => "Returns the given value if it is an instance of the given type, and raises an error otherwise.
6
- Optionally, if a block is given (accepting two parameters), it will be called instead of raising
7
- an error. This to enable giving the user richer feedback, or to supply a default value.
5
+ :doc => <<DOC
6
+ Returns the given value if it is of the given
7
+ [data type](https://docs.puppetlabs.com/puppet/latest/reference/lang_data.html), or
8
+ otherwise either raises an error or executes an optional two-parameter
9
+ [lambda](https://docs.puppetlabs.com/puppet/latest/reference/lang_lambdas.html).
8
10
 
9
- Example: assert that `$b` is a non empty `String` and assign to `$a`:
11
+ The function takes two mandatory arguments, in this order:
10
12
 
11
- $a = assert_type(String[1], $b)
13
+ 1. The expected data type.
14
+ 2. A value to compare against the expected data type.
12
15
 
13
- Example using custom error message:
16
+ **Example**: Using `assert_type`
14
17
 
15
- $a = assert_type(String[1], $b) |$expected, $actual| {
16
- fail('The name cannot be empty')
17
- }
18
+ ~~~ puppet
19
+ $raw_username = 'Amy Berry'
18
20
 
19
- Example, using a warning and a default:
21
+ # Assert that $raw_username is a non-empty string and assign it to $valid_username.
22
+ $valid_username = assert_type(String[1], $raw_username)
20
23
 
21
- $a = assert_type(String[1], $b) |$expected, $actual| {
22
- warning('Name is empty, using default')
23
- 'anonymous'
24
- }
24
+ # $valid_username contains "Amy Berry".
25
+ # If $raw_username was an empty string or a different data type, the Puppet run would
26
+ # fail with an "Expected type does not match actual" error.
27
+ ~~~
28
+
29
+ You can use an optional lambda to provide enhanced feedback. The lambda takes two
30
+ mandatory parameters, in this order:
31
+
32
+ 1. The expected data type as described in the function's first argument.
33
+ 2. The actual data type of the value.
34
+
35
+ **Example**: Using `assert_type` with a warning and default value
36
+
37
+ ~~~ puppet
38
+ $raw_username = 'Amy Berry'
39
+
40
+ # Assert that $raw_username is a non-empty string and assign it to $valid_username.
41
+ # If it isn't, output a warning describing the problem and use a default value.
42
+ $valid_username = assert_type(String[1], $raw_username) |$expected, $actual| {
43
+ warning( "The username should be \'${expected}\', not \'${actual}\'. Using 'anonymous'." )
44
+ 'anonymous'
45
+ }
46
+
47
+ # $valid_username contains "Amy Berry".
48
+ # If $raw_username was an empty string, the Puppet run would set $valid_username to
49
+ # "anonymous" and output a warning: "The username should be 'String[1, default]', not
50
+ # 'String[0, 0]'. Using 'anonymous'."
51
+ ~~~
52
+
53
+ For more information about data types, see the
54
+ [documentation](https://docs.puppetlabs.com/puppet/latest/reference/lang_data.html).
25
55
 
26
- See the documentation for 'The Puppet Type System' for more information about types.
27
56
  - Since 4.0.0
28
- ") do |args|
57
+ DOC
58
+ ) do |args|
29
59
  function_fail(["assert_type() is only available when parser/evaluator future is in effect"])
30
60
  end
@@ -1,71 +1,108 @@
1
- # Test whether a given class or definition is defined
2
- Puppet::Parser::Functions::newfunction(:defined, :type => :rvalue, :arity => -2,
3
- :doc => "Determine whether
4
- a given class or resource type is defined. This function can also determine whether a
5
- specific resource has been defined, or whether a variable has been assigned a value
6
- (including `undef` - as opposed to never having been assigned anything). Returns `true`
7
- or `false`. Accepts class names, type names, resource references, and variable
8
- reference strings of the form `'$name'`. When more than one argument is
9
- supplied, `defined()` returns `true` if any are defined.
10
-
11
- The `defined` function checks both native and defined types, including types
12
- provided as plugins via modules. Types and classes are both checked using their names:
13
-
14
- defined(\"file\")
15
- defined(\"customtype\")
16
- defined(\"foo\")
17
- defined(\"foo::bar\")
18
- defined(\'$name\')
19
-
20
- Resource declarations are checked using resource references, e.g.
21
- `defined( File['/tmp/myfile'] )`. Checking whether a given resource
22
- has been declared is, unfortunately, dependent on the evaluation order of
23
- the configuration, and the following code will not work:
24
-
25
- if defined(File['/tmp/foo']) {
26
- notify { \"This configuration includes the /tmp/foo file.\":}
27
- }
28
- file { \"/tmp/foo\":
29
- ensure => present,
30
- }
31
-
32
- However, this order requirement refers to evaluation order only, and ordering of
33
- resources in the configuration graph (e.g. with `before` or `require`) does not
34
- affect the behavior of `defined`.
35
-
36
- You may also search using types:
37
-
38
- defined(Resource[\'file\',\'/some/file\'])
39
- defined(File[\'/some/file\'])
40
- defined(Class[\'foo\'])
41
-
42
- The `defined` function does not answer if 4.x data types (e.g. `Integer`) are defined. If
43
- given the string 'integer' the result is false, and if given a non CatalogEntry type,
44
- an error is raised.
45
-
46
- The rules for asking for undef, empty strings, and the main class are different from 3.x
47
- (non future parser) and 4.x (with future parser or in Puppet 4.0.0 and later):
48
-
49
- defined('') # 3.x => true, 4.x => false
50
- defined(undef) # 3.x => true, 4.x => error
51
- defined('main') # 3.x => false, 4.x => true
52
-
53
- With the future parser, it is also possible to ask specifically if a name is
54
- a resource type (built in or defined), or a class, by giving its type:
55
-
56
- defined(Type[Class['foo']])
57
- defined(Type[Resource['foo']])
58
-
59
- Which is different from asking:
60
-
61
- defined('foo')
62
-
63
- Since the later returns true if 'foo' is either a class, a built-in resource type, or a user defined
64
- resource type, and a specific request like `Type[Class['foo']]` only returns true if `'foo'` is a class.
65
-
66
- - Since 2.7.0
67
- - Since 3.6.0 variable reference and future parser types
68
- - Since 3.8.1 type specific requests with future parser") do |vals|
1
+ Puppet::Parser::Functions::newfunction(
2
+ :defined,
3
+ :type => :rvalue,
4
+ :arity => -2,
5
+ :doc => <<DOC
6
+ Determines whether a given class or resource type is defined and returns a Boolean
7
+ value. You can also use `defined` to determine whether a specific resource is defined,
8
+ or whether a variable has a value (including `undef`, as opposed to the variable never
9
+ being declared or assigned).
10
+
11
+ This function takes at least one string argument, which can be a class name, type name,
12
+ resource reference, or variable reference of the form `'$name'`.
13
+
14
+ The `defined` function checks both native and defined types, including types
15
+ provided by modules. Types and classes are matched by their names. The function matches
16
+ resource declarations by using resource references.
17
+
18
+ **Examples**: Different types of `defined` function matches
19
+
20
+ ~~~ puppet
21
+ # Matching resource types
22
+ defined("file")
23
+ defined("customtype")
24
+
25
+ # Matching defines and classes
26
+ defined("foo")
27
+ defined("foo::bar")
28
+
29
+ # Matching variables
30
+ defined('$name')
31
+
32
+ # Matching declared resources
33
+ defined(File['/tmp/file'])
34
+ ~~~
35
+
36
+ Puppet depends on the configuration's evaluation order when checking whether a resource
37
+ is declared.
38
+
39
+ **Example**: Importance of evaluation order when using `defined`
40
+
41
+ ~~~ puppet
42
+ # Assign values to $is_defined_before and $is_defined_after using identical `defined`
43
+ # functions.
44
+
45
+ $is_defined_before = defined(File['/tmp/file'])
46
+
47
+ file { "/tmp/file":
48
+ ensure => present,
49
+ }
50
+
51
+ $is_defined_after = defined(File['/tmp/file'])
52
+
53
+ # $is_defined_before returns false, but $is_defined_after returns true.
54
+ ~~~
55
+
56
+ This order requirement only refers to evaluation order. The order of resources in the
57
+ configuration graph (e.g. with `before` or `require`) does not affect the `defined`
58
+ function's behavior.
59
+
60
+ > **Warning:** Avoid relying on the result of the `defined` function in modules, as you
61
+ > might not be able to guarantee the evaluation order well enough to produce consistent
62
+ > results. This can cause other code that relies on the function's result to behave
63
+ > inconsistently or fail.
64
+
65
+ If you pass more than one argument to `defined`, the function returns `true` if _any_
66
+ of the arguments are defined. You can also match resources by type, allowing you to
67
+ match conditions of different levels of specificity, such as whether a specific resource
68
+ is of a specific data type.
69
+
70
+ **Example**: Matching multiple resources and resources by different types with `defined`
71
+
72
+ ~~~ puppet
73
+ file { "/tmp/file1":
74
+ ensure => file,
75
+ }
76
+
77
+ $tmp_file = file { "/tmp/file2":
78
+ ensure => file,
79
+ }
80
+
81
+ # Each of these statements return `true` ...
82
+ defined(File['/tmp/file1'])
83
+ defined(File['/tmp/file1'],File['/tmp/file2'])
84
+ defined(File['/tmp/file1'],File['/tmp/file2'],File['/tmp/file3'])
85
+ # ... but this returns `false`.
86
+ defined(File['/tmp/file3'])
87
+
88
+ # Each of these statements returns `true` ...
89
+ defined(Type[Resource['file','/tmp/file2']])
90
+ defined(Resource['file','/tmp/file2'])
91
+ defined(File['/tmp/file2'])
92
+ defined('$tmp_file')
93
+ # ... but each of these returns `false`.
94
+ defined(Type[Resource['exec','/tmp/file2']])
95
+ defined(Resource['exec','/tmp/file2'])
96
+ defined(File['/tmp/file3'])
97
+ defined('$tmp_file2')
98
+ ~~~
99
+
100
+ - Since 2.7.0
101
+ - Since 3.6.0 variable reference and future parser types
102
+ - Since 3.8.1 type specific requests with future parser
103
+ - Since 4.0.0
104
+ DOC
105
+ ) do |vals|
69
106
  vals = [vals] unless vals.is_a?(Array)
70
107
  vals.any? do |val|
71
108
  case val