puppet 4.8.2-x64-mingw32 → 4.9.0-x64-mingw32

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 (348) hide show
  1. checksums.yaml +15 -0
  2. data/CONTRIBUTING.md +25 -1
  3. data/Gemfile +6 -0
  4. data/Rakefile +1 -0
  5. data/ext/project_data.yaml +5 -1
  6. data/ext/windows/service/daemon.rb +2 -1
  7. data/install.rb +43 -6
  8. data/lib/hiera/puppet_function.rb +15 -17
  9. data/lib/hiera/scope.rb +12 -14
  10. data/lib/puppet.rb +52 -0
  11. data/lib/puppet/application/face_base.rb +4 -0
  12. data/lib/puppet/application/lookup.rb +4 -2
  13. data/lib/puppet/application/resource.rb +1 -1
  14. data/lib/puppet/data_providers.rb +6 -3
  15. data/lib/puppet/data_providers/data_adapter.rb +6 -0
  16. data/lib/puppet/data_providers/data_function_support.rb +7 -0
  17. data/lib/puppet/data_providers/function_env_data_provider.rb +7 -0
  18. data/lib/puppet/data_providers/function_module_data_provider.rb +6 -0
  19. data/lib/puppet/data_providers/hiera_config.rb +31 -10
  20. data/lib/puppet/data_providers/hiera_env_data_provider.rb +6 -0
  21. data/lib/puppet/data_providers/hiera_interpolate.rb +2 -1
  22. data/lib/puppet/data_providers/hiera_module_data_provider.rb +6 -0
  23. data/lib/puppet/data_providers/hiera_support.rb +6 -0
  24. data/lib/puppet/data_providers/json_data_provider_factory.rb +12 -0
  25. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +12 -0
  26. data/lib/puppet/defaults.rb +25 -4
  27. data/lib/puppet/face/ca.rb +2 -0
  28. data/lib/puppet/face/certificate_request.rb +2 -0
  29. data/lib/puppet/face/certificate_revocation_list.rb +2 -0
  30. data/lib/puppet/face/file.rb +3 -0
  31. data/lib/puppet/face/help.rb +19 -17
  32. data/lib/puppet/face/help/face.erb +3 -0
  33. data/lib/puppet/face/key.rb +1 -0
  34. data/lib/puppet/face/man.rb +4 -2
  35. data/lib/puppet/face/module/generate.rb +1 -1
  36. data/lib/puppet/face/status.rb +2 -0
  37. data/lib/puppet/feature/base.rb +9 -2
  38. data/lib/puppet/feature/hocon.rb +3 -0
  39. data/lib/puppet/file_system.rb +15 -3
  40. data/lib/puppet/file_system/windows.rb +8 -0
  41. data/lib/puppet/forge.rb +6 -6
  42. data/lib/puppet/forge/repository.rb +1 -2
  43. data/lib/puppet/functions/binary_file.rb +4 -10
  44. data/lib/puppet/functions/hiera_array.rb +1 -1
  45. data/lib/puppet/functions/hiera_include.rb +1 -1
  46. data/lib/puppet/functions/hocon_data.rb +24 -0
  47. data/lib/puppet/functions/json_data.rb +18 -0
  48. data/lib/puppet/functions/yaml_data.rb +21 -0
  49. data/lib/puppet/generate/type.rb +1 -1
  50. data/lib/puppet/graph/simple_graph.rb +4 -2
  51. data/lib/puppet/indirector/file_bucket_file/file.rb +10 -2
  52. data/lib/puppet/indirector/request.rb +5 -1
  53. data/lib/puppet/interface.rb +14 -2
  54. data/lib/puppet/interface/face_collection.rb +1 -1
  55. data/lib/puppet/module.rb +14 -2
  56. data/lib/puppet/module_tool.rb +4 -4
  57. data/lib/puppet/module_tool/applications/builder.rb +3 -2
  58. data/lib/puppet/module_tool/applications/installer.rb +14 -14
  59. data/lib/puppet/module_tool/applications/upgrader.rb +13 -13
  60. data/lib/puppet/module_tool/installed_modules.rb +7 -7
  61. data/lib/puppet/module_tool/local_tarball.rb +3 -3
  62. data/lib/puppet/module_tool/metadata.rb +1 -1
  63. data/lib/puppet/network/http/connection.rb +2 -0
  64. data/lib/puppet/network/http/webrick.rb +2 -1
  65. data/lib/puppet/parser/functions/hiera.rb +14 -0
  66. data/lib/puppet/parser/functions/hiera_array.rb +14 -0
  67. data/lib/puppet/parser/functions/hiera_hash.rb +14 -0
  68. data/lib/puppet/parser/functions/hiera_include.rb +14 -0
  69. data/lib/puppet/parser/scope.rb +14 -20
  70. data/lib/puppet/plugins/data_providers.rb +2 -0
  71. data/lib/puppet/plugins/data_providers/data_provider.rb +108 -17
  72. data/lib/puppet/plugins/data_providers/registry.rb +2 -36
  73. data/lib/puppet/pops.rb +6 -9
  74. data/lib/puppet/pops/adaptable.rb +0 -3
  75. data/lib/puppet/pops/binder/producers.rb +3 -3
  76. data/lib/puppet/pops/evaluator/access_operator.rb +4 -4
  77. data/lib/puppet/pops/evaluator/closure.rb +1 -1
  78. data/lib/puppet/pops/evaluator/compare_operator.rb +4 -4
  79. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  80. data/lib/puppet/pops/issues.rb +4 -0
  81. data/lib/puppet/pops/label_provider.rb +14 -0
  82. data/lib/puppet/pops/loader/loader_paths.rb +3 -1
  83. data/lib/puppet/pops/loader/module_loaders.rb +21 -7
  84. data/lib/puppet/pops/loader/typed_name.rb +0 -2
  85. data/lib/puppet/pops/loaders.rb +31 -12
  86. data/lib/puppet/pops/lookup.rb +4 -3
  87. data/lib/puppet/pops/lookup/configured_data_provider.rb +87 -0
  88. data/lib/puppet/pops/lookup/context.rb +121 -71
  89. data/lib/puppet/pops/lookup/data_adapter.rb +27 -0
  90. data/lib/puppet/pops/lookup/data_dig_function_provider.rb +55 -0
  91. data/lib/puppet/pops/lookup/data_hash_function_provider.rb +111 -0
  92. data/lib/puppet/pops/lookup/data_provider.rb +102 -0
  93. data/lib/puppet/pops/lookup/environment_data_provider.rb +27 -0
  94. data/lib/puppet/pops/lookup/explainer.rb +122 -82
  95. data/lib/puppet/pops/lookup/function_provider.rb +82 -0
  96. data/lib/puppet/pops/lookup/global_data_provider.rb +49 -0
  97. data/lib/puppet/pops/lookup/hiera_config.rb +601 -0
  98. data/lib/puppet/pops/lookup/interpolation.rb +56 -35
  99. data/lib/puppet/pops/lookup/invocation.rb +179 -101
  100. data/lib/puppet/pops/lookup/location_resolver.rb +72 -0
  101. data/lib/puppet/pops/lookup/lookup_adapter.rb +451 -0
  102. data/lib/puppet/pops/lookup/lookup_key.rb +99 -0
  103. data/lib/puppet/pops/lookup/lookup_key_function_provider.rb +119 -0
  104. data/lib/puppet/pops/lookup/module_data_provider.rb +58 -0
  105. data/lib/puppet/pops/lookup/sub_lookup.rb +8 -4
  106. data/lib/puppet/pops/merge_strategy.rb +120 -39
  107. data/lib/puppet/pops/parser/egrammar.ra +2 -0
  108. data/lib/puppet/pops/parser/eparser.rb +816 -808
  109. data/lib/puppet/pops/parser/locator.rb +3 -3
  110. data/lib/puppet/pops/parser/slurp_support.rb +4 -3
  111. data/lib/puppet/pops/pcore.rb +21 -12
  112. data/lib/puppet/pops/serialization/abstract_reader.rb +17 -7
  113. data/lib/puppet/pops/serialization/abstract_writer.rb +27 -12
  114. data/lib/puppet/pops/serialization/deserializer.rb +17 -4
  115. data/lib/puppet/pops/serialization/extension.rb +37 -8
  116. data/lib/puppet/pops/serialization/object.rb +14 -6
  117. data/lib/puppet/pops/serialization/rgen.rb +2 -1
  118. data/lib/puppet/pops/serialization/serializer.rb +30 -7
  119. data/lib/puppet/pops/types/implementation_registry.rb +1 -1
  120. data/lib/puppet/pops/types/p_object_type.rb +55 -12
  121. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +27 -27
  122. data/lib/puppet/pops/types/p_sem_ver_type.rb +12 -12
  123. data/lib/puppet/pops/types/p_timespan_type.rb +6 -6
  124. data/lib/puppet/pops/types/p_timestamp_type.rb +2 -2
  125. data/lib/puppet/pops/types/p_type_set_type.rb +7 -16
  126. data/lib/puppet/pops/types/recursion_guard.rb +64 -20
  127. data/lib/puppet/pops/types/ruby_generator.rb +10 -0
  128. data/lib/puppet/pops/types/type_calculator.rb +23 -13
  129. data/lib/puppet/pops/types/type_factory.rb +20 -9
  130. data/lib/puppet/pops/types/type_formatter.rb +37 -17
  131. data/lib/puppet/pops/types/type_mismatch_describer.rb +7 -6
  132. data/lib/puppet/pops/types/type_parser.rb +6 -0
  133. data/lib/puppet/pops/types/types.rb +225 -132
  134. data/lib/puppet/pops/validation.rb +1 -1
  135. data/lib/puppet/pops/validation/checker4_0.rb +12 -2
  136. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  137. data/lib/puppet/pops/visitor.rb +4 -3
  138. data/lib/puppet/provider/mcx/mcxcontent.rb +2 -1
  139. data/lib/puppet/provider/nameservice.rb +15 -0
  140. data/lib/puppet/provider/package/appdmg.rb +1 -1
  141. data/lib/puppet/provider/package/dnf.rb +1 -1
  142. data/lib/puppet/provider/package/pkg.rb +1 -1
  143. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  144. data/lib/puppet/provider/package/pkgng.rb +1 -1
  145. data/lib/puppet/provider/package/rpm.rb +2 -2
  146. data/lib/puppet/provider/service/smf.rb +3 -3
  147. data/lib/puppet/provider/service/systemd.rb +5 -1
  148. data/lib/puppet/provider/user/directoryservice.rb +1 -0
  149. data/lib/puppet/provider/user/user_role_add.rb +15 -0
  150. data/lib/puppet/provider/yumrepo/inifile.rb +2 -2
  151. data/lib/puppet/provider/zone/solaris.rb +4 -1
  152. data/lib/puppet/reference/indirection.rb +1 -1
  153. data/lib/puppet/resource.rb +2 -3
  154. data/lib/puppet/resource/catalog.rb +12 -4
  155. data/lib/puppet/resource/type.rb +3 -3
  156. data/lib/puppet/settings.rb +1 -1
  157. data/lib/puppet/settings/config_file.rb +2 -1
  158. data/lib/puppet/settings/directory_setting.rb +6 -0
  159. data/lib/puppet/settings/environment_conf.rb +6 -2
  160. data/lib/puppet/settings/file_or_directory_setting.rb +6 -0
  161. data/lib/puppet/settings/file_setting.rb +10 -0
  162. data/lib/puppet/ssl/certificate_authority.rb +13 -2
  163. data/lib/puppet/ssl/host.rb +23 -1
  164. data/lib/puppet/transaction/additional_resource_generator.rb +7 -0
  165. data/lib/puppet/type/user.rb +16 -3
  166. data/lib/puppet/util.rb +1 -0
  167. data/lib/puppet/util/execution.rb +3 -3
  168. data/lib/puppet/util/filetype.rb +11 -5
  169. data/lib/puppet/util/logging.rb +2 -1
  170. data/lib/puppet/util/network_device/config.rb +1 -1
  171. data/lib/puppet/util/plist.rb +6 -0
  172. data/lib/puppet/util/profiler/aggregate.rb +1 -1
  173. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +2 -2
  174. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +2 -1
  175. data/lib/puppet/util/windows/adsi.rb +15 -12
  176. data/lib/puppet/vendor/load_semantic_puppet.rb +1 -0
  177. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +2 -1
  178. data/lib/puppet/vendor/require_vendored.rb +0 -1
  179. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +17 -0
  180. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency.rb +7 -7
  181. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph.rb +2 -2
  182. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph_node.rb +2 -2
  183. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/module_release.rb +58 -0
  184. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/source.rb +2 -2
  185. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/unsatisfiable_graph.rb +2 -2
  186. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/gem_version.rb +3 -0
  187. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/locales/config.yaml +21 -0
  188. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version.rb +48 -21
  189. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version_range.rb +15 -17
  190. data/lib/puppet/version.rb +1 -1
  191. data/lib/semver.rb +19 -12
  192. data/locales/config.yaml +29 -0
  193. data/locales/puppet.pot +79 -0
  194. data/man/man5/puppet.conf.5 +1 -1
  195. data/spec/fixtures/unit/application/environments/puppet_func_provider/functions/{data.pp → environment/data.pp} +0 -0
  196. data/spec/fixtures/unit/data_providers/environments/hiera_misc/data/common.yaml +2 -0
  197. data/spec/fixtures/unit/data_providers/environments/hiera_modules/modules/two/data/common.yaml +1 -1
  198. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/hiera.yaml +5 -0
  199. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet/bindings/backend/default.rb +9 -0
  200. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/lib/puppet_x/backend/special_data_provider_factory.rb +23 -0
  201. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/manifests/init.pp +5 -0
  202. data/spec/fixtures/unit/data_providers/environments/sample/modules/backend/metadata.json +9 -0
  203. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/lib/puppet_x/helindbe/sample_env_data.rb +1 -0
  204. data/spec/fixtures/unit/data_providers/environments/sample/modules/dataprovider/manifests/init.pp +1 -1
  205. data/spec/fixtures/unit/functions/lookup/data/common.yaml +19 -0
  206. data/spec/fixtures/unit/functions/lookup_fixture/data/common.yaml +19 -0
  207. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/environment.conf +0 -0
  208. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/lib/puppet/functions/environment/data.rb +0 -0
  209. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/bindings/abc/default.rb +0 -0
  210. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/lib/puppet/functions/abc/data.rb +0 -0
  211. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/abc/manifests/init.pp +0 -0
  212. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/bindings/bad_data/default.rb +0 -0
  213. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/lib/puppet/functions/bad_data/data.rb +0 -0
  214. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bad_data/manifests/init.pp +0 -0
  215. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/bindings/bca/default.rb +0 -0
  216. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/lib/puppet/functions/bca/data.rb +0 -0
  217. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/bca/manifests/init.pp +0 -0
  218. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/data/empty.json +0 -0
  219. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/hiera.yaml +0 -0
  220. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/manifests/init.pp +0 -0
  221. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_json/metadata.json +0 -0
  222. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/data/empty_key.json +0 -0
  223. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/hiera.yaml +0 -0
  224. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/manifests/init.pp +0 -0
  225. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_json/metadata.json +0 -0
  226. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/data/empty_key.yaml +0 -0
  227. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/hiera.yaml +0 -0
  228. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/manifests/init.pp +0 -0
  229. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_key_yaml/metadata.json +0 -0
  230. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/data/empty.yaml +0 -0
  231. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/hiera.yaml +0 -0
  232. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/manifests/init.pp +0 -0
  233. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/empty_yaml/metadata.json +0 -0
  234. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/data/first.json +0 -0
  235. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/hiera.yaml +0 -0
  236. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/manifests/init.pp +0 -0
  237. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/hieraprovider/metadata.json +0 -0
  238. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/lib/puppet/functions/meta/data.rb +0 -0
  239. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/manifests/init.pp +0 -0
  240. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/meta/metadata.json +0 -0
  241. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/lib/puppet/bindings/metawcp/default.rb +0 -0
  242. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/lib/puppet_x/thallgren/sample_module_data.rb +0 -0
  243. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/manifests/init.pp +0 -0
  244. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/metawcp/metadata.json +0 -0
  245. data/spec/fixtures/unit/functions/{lookup → lookup_fixture}/environments/production/modules/no_provider/manifests/init.pp +0 -0
  246. data/spec/integration/application/apply_spec.rb +88 -2
  247. data/spec/integration/application/lookup_spec.rb +155 -0
  248. data/spec/integration/data_binding_spec.rb +5 -5
  249. data/spec/integration/defaults_spec.rb +13 -0
  250. data/spec/integration/environments/default_manifest_spec.rb +16 -16
  251. data/spec/integration/environments/setting_hooks_spec.rb +1 -1
  252. data/spec/integration/test/test_helper_spec.rb +6 -2
  253. data/spec/integration/transaction_spec.rb +74 -0
  254. data/spec/integration/util/execution_spec.rb +8 -0
  255. data/spec/lib/puppet_spec/module_tool/shared_functions.rb +2 -2
  256. data/spec/lib/puppet_spec/module_tool/stub_source.rb +1 -1
  257. data/spec/lib/puppet_spec/unindent.rb +2 -2
  258. data/spec/unit/application/face_base_spec.rb +16 -0
  259. data/spec/unit/application/lookup_spec.rb +262 -227
  260. data/spec/unit/data_providers/{sample_data_provider_spec.rb → custom_data_provider_spec.rb} +14 -16
  261. data/spec/unit/data_providers/function_data_provider_spec.rb +2 -2
  262. data/spec/unit/data_providers/hiera_data_provider_spec.rb +60 -97
  263. data/spec/unit/defaults_spec.rb +1 -1
  264. data/spec/unit/face/ca_spec.rb +10 -0
  265. data/spec/unit/face/certificate_request_spec.rb +10 -0
  266. data/spec/unit/face/certificate_revocation_list_spec.rb +10 -0
  267. data/spec/unit/face/file_spec.rb +4 -0
  268. data/spec/unit/face/help_spec.rb +17 -0
  269. data/spec/unit/face/key_spec.rb +10 -0
  270. data/spec/unit/face/status_spec.rb +10 -0
  271. data/spec/unit/file_system_spec.rb +143 -6
  272. data/spec/unit/functions/binary_file_spec.rb +1 -1
  273. data/spec/unit/functions/hiera_spec.rb +257 -47
  274. data/spec/unit/functions/lookup_fixture_spec.rb +693 -0
  275. data/spec/unit/functions/lookup_spec.rb +1319 -608
  276. data/spec/unit/functions/new_spec.rb +3 -3
  277. data/spec/unit/graph/rb_tree_map_spec.rb +1 -1
  278. data/spec/unit/graph/simple_graph_spec.rb +1 -1
  279. data/spec/unit/hiera/scope_spec.rb +4 -4
  280. data/spec/unit/indirector/request_spec.rb +9 -0
  281. data/spec/unit/interface_spec.rb +27 -0
  282. data/spec/unit/man_spec.rb +1 -1
  283. data/spec/unit/module_spec.rb +1 -1
  284. data/spec/unit/module_tool/applications/builder_spec.rb +16 -1
  285. data/spec/unit/module_tool/applications/installer_spec.rb +1 -1
  286. data/spec/unit/module_tool/applications/upgrader_spec.rb +1 -1
  287. data/spec/unit/module_tool/installed_modules_spec.rb +6 -6
  288. data/spec/unit/module_tool_spec.rb +3 -3
  289. data/spec/unit/network/http/connection_spec.rb +10 -0
  290. data/spec/unit/network/http/webrick_spec.rb +1 -1
  291. data/spec/unit/pops/evaluator/access_ops_spec.rb +2 -2
  292. data/spec/unit/pops/evaluator/runtime3_converter_spec.rb +9 -9
  293. data/spec/unit/pops/loaders/environment_loader_spec.rb +172 -0
  294. data/spec/unit/pops/lookup/context_spec.rb +45 -16
  295. data/spec/unit/pops/lookup/interpolation_spec.rb +28 -20
  296. data/spec/unit/pops/lookup/lookup_spec.rb +197 -0
  297. data/spec/unit/pops/merge_strategy_spec.rb +18 -0
  298. data/spec/unit/pops/parser/lexer2_spec.rb +16 -1
  299. data/spec/unit/pops/parser/parse_site_spec.rb +4 -0
  300. data/spec/unit/pops/serialization/packer_spec.rb +4 -23
  301. data/spec/unit/pops/serialization/serialization_spec.rb +32 -8
  302. data/spec/unit/pops/types/p_object_type_spec.rb +68 -3
  303. data/spec/unit/pops/types/p_sem_ver_type_spec.rb +4 -4
  304. data/spec/unit/pops/types/p_type_set_type_spec.rb +31 -2
  305. data/spec/unit/pops/types/type_acceptor_spec.rb +18 -17
  306. data/spec/unit/pops/types/type_calculator_spec.rb +39 -40
  307. data/spec/unit/pops/types/type_factory_spec.rb +3 -3
  308. data/spec/unit/pops/types/type_formatter_spec.rb +7 -3
  309. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +13 -2
  310. data/spec/unit/pops/types/types_spec.rb +25 -2
  311. data/spec/unit/pops/validator/validator_spec.rb +60 -4
  312. data/spec/unit/provider/nameservice_spec.rb +42 -0
  313. data/spec/unit/provider/package/aptrpm_spec.rb +1 -1
  314. data/spec/unit/provider/package/pkg_spec.rb +22 -0
  315. data/spec/unit/provider/package/pkgng_spec.rb +12 -0
  316. data/spec/unit/provider/package/rpm_spec.rb +8 -8
  317. data/spec/unit/provider/service/smf_spec.rb +13 -11
  318. data/spec/unit/provider/service/systemd_spec.rb +8 -1
  319. data/spec/unit/provider/user/useradd_spec.rb +1 -0
  320. data/spec/unit/puppet_spec.rb +14 -0
  321. data/spec/unit/resource/catalog_spec.rb +15 -9
  322. data/spec/unit/resource_spec.rb +20 -17
  323. data/spec/unit/semver_spec.rb +14 -0
  324. data/spec/unit/ssl/certificate_authority_spec.rb +12 -1
  325. data/spec/unit/transaction/additional_resource_generator_spec.rb +11 -0
  326. data/spec/unit/type/user_spec.rb +32 -6
  327. data/spec/unit/util/filetype_spec.rb +3 -3
  328. data/spec/unit/util/yaml_spec.rb +1 -1
  329. data/spec/unit/util_spec.rb +10 -2
  330. data/tasks/i18n.rake +20 -0
  331. metadata +2661 -2607
  332. data/lib/puppet/data_providers/lookup_adapter.rb +0 -254
  333. data/lib/puppet/vendor/load_semantic.rb +0 -1
  334. data/lib/puppet/vendor/semantic/Gemfile +0 -20
  335. data/lib/puppet/vendor/semantic/PUPPET_README.md +0 -6
  336. data/lib/puppet/vendor/semantic/Rakefile +0 -69
  337. data/lib/puppet/vendor/semantic/lib/semantic.rb +0 -7
  338. data/lib/puppet/vendor/semantic/lib/semantic/dependency/module_release.rb +0 -60
  339. data/lib/puppet/vendor/semantic/spec/spec_helper.rb +0 -24
  340. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_node_spec.rb +0 -141
  341. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/graph_spec.rb +0 -162
  342. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/module_release_spec.rb +0 -143
  343. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/source_spec.rb +0 -5
  344. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency/unsatisfiable_graph_spec.rb +0 -44
  345. data/lib/puppet/vendor/semantic/spec/unit/semantic/dependency_spec.rb +0 -383
  346. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_range_spec.rb +0 -307
  347. data/lib/puppet/vendor/semantic/spec/unit/semantic/version_spec.rb +0 -608
  348. data/spec/fixtures/unit/data_providers/environments/sample/manifests/site.pp +0 -6
@@ -37,6 +37,14 @@ describe 'Puppet::Pops::Lookup::Context' do
37
37
  expect(eval_and_collect_notices(code)[0]).to eql('ze_value')
38
38
  end
39
39
 
40
+ it 'the cache method returns the value that is cached' do
41
+ code = <<-PUPPET.unindent
42
+ $ctx = Puppet::LookupContext.new('e', 'm')
43
+ notice($ctx.cache('ze_key', 'ze_value'))
44
+ PUPPET
45
+ expect(eval_and_collect_notices(code)[0]).to eql('ze_value')
46
+ end
47
+
40
48
  it 'can store and retrieve a hash using the cache' do
41
49
  code = <<-PUPPET.unindent
42
50
  $ctx = Puppet::LookupContext.new('e', 'm')
@@ -115,35 +123,56 @@ describe 'Puppet::Pops::Lookup::Context' do
115
123
  end
116
124
 
117
125
  context 'when used in an Invocation' do
118
- let(:invocation) { Invocation.new({}) }
119
- let(:invocation_with_explain) { Invocation.new({}, {}, {}, true) }
126
+ let(:node) { Puppet::Node.new('test') }
127
+ let(:compiler) { Puppet::Parser::Compiler.new(node) }
128
+ let(:invocation) { Invocation.new(compiler.topscope) }
129
+ let(:invocation_with_explain) { Invocation.new(compiler.topscope, {}, {}, true) }
130
+
131
+ def compile_and_get_notices(code, scope_vars = {})
132
+ Puppet[:code] = code
133
+ scope = compiler.topscope
134
+ scope_vars.each_pair { |k,v| scope.setvar(k, v) }
135
+ node.environment.check_for_reparse
136
+ logs = []
137
+ Puppet::Util::Log.with_destination(Puppet::Test::LogCollector.new(logs)) do
138
+ compiler.compile
139
+ end
140
+ logs = logs.select { |log| log.level == :notice }.map { |log| log.message }
141
+ logs
142
+ end
120
143
 
121
144
  it 'will not call explain unless explanations are active' do
122
- Invocation.expects(:current).returns(invocation)
123
- code = <<-PUPPET.unindent
124
- $ctx = Puppet::LookupContext.new('e', 'm')
125
- $ctx.explain || { notice('stop calling'); 'bad' }
126
- PUPPET
127
- expect(eval_and_collect_notices(code)).to be_empty
145
+ invocation.lookup('dummy', nil) do
146
+ code = <<-PUPPET.unindent
147
+ $ctx = Puppet::LookupContext.new('e', 'm')
148
+ $ctx.explain || { notice('stop calling'); 'bad' }
149
+ PUPPET
150
+ expect(compile_and_get_notices(code)).to be_empty
151
+ end
128
152
  end
129
153
 
130
154
  it 'will call explain when explanations are active' do
131
- Invocation.expects(:current).returns(invocation_with_explain)
132
- invocation_with_explain.with(:global, 'test') do
155
+ invocation_with_explain.lookup('dummy', nil) do
133
156
  code = <<-PUPPET.unindent
134
157
  $ctx = Puppet::LookupContext.new('e', 'm')
135
158
  $ctx.explain || { notice('called'); 'good' }
136
159
  PUPPET
137
- expect(eval_and_collect_notices(code)).to eql(['called'])
160
+ expect(compile_and_get_notices(code)).to eql(['called'])
161
+ end
162
+ expect(invocation_with_explain.explainer.explain).to eql("good\n")
163
+ end
164
+
165
+ it 'will call interpolate to resolve interpolation' do
166
+ invocation.lookup('dummy', nil) do
167
+ code = <<-PUPPET.unindent
168
+ $ctx = Puppet::LookupContext.new('e', 'm')
169
+ notice($ctx.interpolate('-- %{testing} --'))
170
+ PUPPET
171
+ expect(compile_and_get_notices(code, { 'testing' => 'called' })).to eql(['-- called --'])
138
172
  end
139
- expect(invocation_with_explain.explainer.to_s).to eql(<<-TEXT.unindent)
140
- Data Binding "test"
141
- good
142
- TEXT
143
173
  end
144
174
  end
145
175
  end
146
176
  end
147
177
  end
148
178
  end
149
-
@@ -1,18 +1,23 @@
1
1
  #! /usr/bin/env ruby
2
2
  require 'spec_helper'
3
3
  require 'puppet'
4
- require 'puppet/data_providers/hiera_config'
5
- require 'puppet/data_providers/hiera_interpolate'
6
4
 
7
5
  module Puppet::Pops
8
6
  describe 'Puppet::Pops::Lookup::Interpolation' do
7
+ include Lookup::SubLookup
9
8
 
10
9
  let(:interpolator) { Class.new { include Lookup::Interpolation }.new }
11
10
  let(:scope) { {} }
12
11
  let(:lookup_invocation) { Lookup::Invocation.new(scope, {}, {}, nil) }
13
12
 
14
13
  def expect_lookup(*keys)
15
- keys.each { |key| Lookup.expects(:lookup).with(key, nil, '', true, nil, lookup_invocation).returns(data[key]) }
14
+ keys.each do |key|
15
+ segments = split_key(key)
16
+ root_key = segments.shift
17
+ found = data[root_key]
18
+ found = sub_lookup(key, lookup_invocation, segments, found) unless segments.empty?
19
+ Lookup.expects(:lookup).with(key, nil, '', true, nil, lookup_invocation).returns(found)
20
+ end
16
21
  end
17
22
 
18
23
  context 'when interpolating nested data' do
@@ -160,12 +165,12 @@ describe 'Puppet::Pops::Lookup::Interpolation' do
160
165
  end
161
166
 
162
167
  it 'should find an entry using a quoted interpolation with method lookup' do
163
- expect_lookup('a.b')
168
+ expect_lookup("'a.b'")
164
169
  expect(interpolator.interpolate("a dot c: %{lookup(\"'a.b'\")}", lookup_invocation, true)).to eq('a dot c: (lookup) a dot b')
165
170
  end
166
171
 
167
172
  it 'should find an entry using a quoted interpolation with method alias' do
168
- expect_lookup('a.b')
173
+ expect_lookup("'a.b'")
169
174
  expect(interpolator.interpolate("%{alias(\"'a.b'\")}", lookup_invocation, true)).to eq('(lookup) a dot b')
170
175
  end
171
176
 
@@ -173,8 +178,12 @@ describe 'Puppet::Pops::Lookup::Interpolation' do
173
178
  expect(interpolator.interpolate('a dot e: %{a.d}', lookup_invocation, true)).to eq('a dot e: (scope) a dot d is a hash entry')
174
179
  end
175
180
 
176
- it 'should use a dotted key to navigate into a structure when when it is not quoted with method lookup' do
177
- expect_lookup('a')
181
+ it 'should report a key missing and replace with empty string when a dotted key is used to navigate into a structure and then not found' do
182
+ expect(interpolator.interpolate('a dot n: %{a.n}', lookup_invocation, true)).to eq('a dot n: ')
183
+ end
184
+
185
+ it 'should use a dotted key to navigate into a structure when it is not quoted with method lookup' do
186
+ expect_lookup('a.d')
178
187
  expect(interpolator.interpolate("a dot e: %{lookup('a.d')}", lookup_invocation, true)).to eq('a dot e: (lookup) a dot d is a hash entry')
179
188
  end
180
189
 
@@ -183,7 +192,7 @@ describe 'Puppet::Pops::Lookup::Interpolation' do
183
192
  end
184
193
 
185
194
  it 'should use a mix of quoted and dotted keys to navigate into a structure containing dotted keys and quoted key is last and method is lookup' do
186
- expect_lookup('a')
195
+ expect_lookup("a.'d.x'")
187
196
  expect(interpolator.interpolate("a dot ex: %{lookup(\"a.'d.x'\")}", lookup_invocation, true)).to eq('a dot ex: (lookup) a dot d.x is a hash entry')
188
197
  end
189
198
 
@@ -192,7 +201,7 @@ describe 'Puppet::Pops::Lookup::Interpolation' do
192
201
  end
193
202
 
194
203
  it 'should use a mix of quoted and dotted keys to navigate into a structure containing dotted keys and quoted key is first and method is lookup' do
195
- expect_lookup('a.x')
204
+ expect_lookup("'a.x'.d")
196
205
  expect(interpolator.interpolate("a dot xe: %{lookup(\"'a.x'.d\")}", lookup_invocation, true)).to eq('a dot xe: (lookup) a.x dot d is a hash entry')
197
206
  end
198
207
 
@@ -201,7 +210,7 @@ describe 'Puppet::Pops::Lookup::Interpolation' do
201
210
  end
202
211
 
203
212
  it 'should use a mix of quoted and dotted keys to navigate into a structure containing dotted keys and quoted key is in the middle and method is lookup' do
204
- expect_lookup('a')
213
+ expect_lookup("a.'d.z'.g")
205
214
  expect(interpolator.interpolate("a dot xm: %{lookup(\"a.'d.z'.g\")}", lookup_invocation, true)).to eq('a dot xm: (lookup) a dot d.z dot g is a hash entry')
206
215
  end
207
216
 
@@ -210,7 +219,7 @@ describe 'Puppet::Pops::Lookup::Interpolation' do
210
219
  end
211
220
 
212
221
  it 'should use a mix of several quoted and dotted keys to navigate into a structure containing dotted keys and quoted key is in the middle and method is lookup' do
213
- expect_lookup('a.x')
222
+ expect_lookup("'a.x'.'d.z'.g")
214
223
  expect(interpolator.interpolate("a dot xx: %{lookup(\"'a.x'.'d.z'.g\")}", lookup_invocation, true)).to eq('a dot xx: (lookup) a.x dot d.z dot g is a hash entry')
215
224
  end
216
225
 
@@ -219,7 +228,7 @@ describe 'Puppet::Pops::Lookup::Interpolation' do
219
228
  end
220
229
 
221
230
  it 'should find an entry using using a quoted interpolation on dotted key containing numbers using method lookup' do
222
- expect_lookup('x.1')
231
+ expect_lookup("'x.1'")
223
232
  expect(interpolator.interpolate("x dot 2: %{lookup(\"'x.1'\")}", lookup_invocation, true)).to eq('x dot 2: (lookup) x dot 1')
224
233
  end
225
234
 
@@ -228,13 +237,12 @@ describe 'Puppet::Pops::Lookup::Interpolation' do
228
237
  end
229
238
 
230
239
  it 'should not find a subkey when the dotted key is quoted with method lookup' do
231
- expect_lookup('a.d')
240
+ expect_lookup("'a.d'")
232
241
  expect(interpolator.interpolate("a dot f: %{lookup(\"'a.d'\")}", lookup_invocation, true)).to eq('a dot f: ')
233
242
  end
234
243
 
235
244
  it 'should not find a subkey that is matched within a string' do
236
- expect_lookup('key')
237
- expect{ interpolator.interpolate('%{hiera("key.subkey")}', lookup_invocation, true) }.to raise_error(/Got String when a hash-like object was expected to access value using 'subkey' from key 'key.subkey'/)
245
+ expect{ expect_lookup('key.subkey') }.to raise_error(/Got String when a hash-like object was expected to access value using 'subkey' from key 'key.subkey'/)
238
246
  end
239
247
  end
240
248
 
@@ -267,27 +275,27 @@ describe 'Puppet::Pops::Lookup::Interpolation' do
267
275
  end
268
276
 
269
277
  it 'allows dotted keys with non alphanumeric characters' do
270
- expect_lookup('very_angry', '!$\%!')
278
+ expect_lookup('very_angry', '!$\%!.\#@!&%|')
271
279
  expect(interpolator.interpolate("%{lookup('very_angry')}", lookup_invocation, true)).to eq('not happy at all')
272
280
  end
273
281
 
274
282
  it 'allows dotted keys with nested white space' do
275
- expect_lookup('a key with')
283
+ expect_lookup('a key with.nested whitespace')
276
284
  expect(interpolator.interpolate("%{lookup('a key with.nested whitespace')}", lookup_invocation, true)).to eq('value for nested ws key')
277
285
  end
278
286
 
279
287
  it 'will trim each key element' do
280
- expect_lookup('a key with')
288
+ expect_lookup(' a key with . nested whitespace ')
281
289
  expect(interpolator.interpolate("%{lookup(' a key with . nested whitespace ')}", lookup_invocation, true)).to eq('value for nested ws key')
282
290
  end
283
291
 
284
292
  it 'will not trim quoted key element' do
285
- expect_lookup('a key with')
293
+ expect_lookup(' a key with ." untrimmed whitespace "')
286
294
  expect(interpolator.interpolate("%{lookup(' a key with .\" untrimmed whitespace \"')}", lookup_invocation, true)).to eq('value for untrimmed ws key')
287
295
  end
288
296
 
289
297
  it 'will not trim spaces outside of quoted key element' do
290
- expect_lookup('a key with')
298
+ expect_lookup(' a key with . " untrimmed whitespace " ')
291
299
  expect(interpolator.interpolate("%{lookup(' a key with . \" untrimmed whitespace \" ')}", lookup_invocation, true)).to eq('value for untrimmed ws key')
292
300
  end
293
301
  end
@@ -0,0 +1,197 @@
1
+ require 'spec_helper'
2
+ require 'puppet_spec/files'
3
+ require 'puppet/pops'
4
+ require 'deep_merge/core'
5
+
6
+ module Puppet::Pops
7
+ module Lookup
8
+ describe 'The lookup API' do
9
+ include PuppetSpec::Files
10
+
11
+ let(:env_name) { 'spec' }
12
+ let(:code_dir) { Puppet[:environmentpath] }
13
+ let(:env_dir) { File.join(code_dir, env_name) }
14
+ let(:env) { Puppet::Node::Environment.create(env_name.to_sym, [File.join(populated_env_dir, 'modules')]) }
15
+ let(:node) { Puppet::Node.new('test', :environment => env) }
16
+ let(:compiler) { Puppet::Parser::Compiler.new(node) }
17
+ let(:scope) { compiler.topscope }
18
+ let(:invocation) { Invocation.new(scope) }
19
+
20
+ let(:code_dir_content) do
21
+ {
22
+ 'hiera.yaml' => <<-YAML.unindent,
23
+ version: 5
24
+ YAML
25
+ 'data' => {
26
+ 'common.yaml' => <<-YAML.unindent
27
+ a: a (from global)
28
+ d: d (from global)
29
+ mod::e: mod::e (from global)
30
+ YAML
31
+ }
32
+ }
33
+ end
34
+
35
+ let(:env_content) do
36
+ {
37
+ 'hiera.yaml' => <<-YAML.unindent,
38
+ version: 5
39
+ YAML
40
+ 'data' => {
41
+ 'common.yaml' => <<-YAML.unindent
42
+ b: b (from environment)
43
+ d: d (from environment)
44
+ mod::f: mod::f (from environment)
45
+ YAML
46
+ }
47
+ }
48
+ end
49
+
50
+ let(:mod_content) do
51
+ {
52
+ 'hiera.yaml' => <<-YAML.unindent,
53
+ version: 5
54
+ YAML
55
+ 'data' => {
56
+ 'common.yaml' => <<-YAML.unindent
57
+ mod::c: mod::c (from module)
58
+ mod::e: mod::e (from module)
59
+ mod::f: mod::f (from module)
60
+ YAML
61
+ }
62
+ }
63
+ end
64
+
65
+ let(:populated_env_dir) do
66
+ all_content = code_dir_content.merge(env_name => env_content.merge('modules' => { 'mod' => mod_content }))
67
+ dir_contained_in(code_dir, all_content)
68
+ all_content.keys.each { |key| PuppetSpec::Files.record_tmp(File.join(code_dir, key)) }
69
+ env_dir
70
+ end
71
+
72
+ before(:each) do
73
+ Puppet[:hiera_config] = File.join(code_dir, 'hiera.yaml')
74
+ Puppet.push_context(:loaders => Puppet::Pops::Loaders.new(env))
75
+ end
76
+
77
+ after(:each) do
78
+ Puppet.pop_context
79
+ end
80
+
81
+ context 'when doing lookup' do
82
+ it 'finds data in global layer' do
83
+ expect(Lookup.lookup('a', nil, nil, false, nil, invocation)).to eql('a (from global)')
84
+ end
85
+
86
+ it 'finds data in environment layer' do
87
+ expect(Lookup.lookup('b', nil, 'not found', true, nil, invocation)).to eql('b (from environment)')
88
+ end
89
+
90
+ it 'global layer wins over environment layer' do
91
+ expect(Lookup.lookup('d', nil, 'not found', true, nil, invocation)).to eql('d (from global)')
92
+ end
93
+
94
+ it 'finds data in module layer' do
95
+ expect(Lookup.lookup('mod::c', nil, 'not found', true, nil, invocation)).to eql('mod::c (from module)')
96
+ end
97
+
98
+ it 'global layer wins over module layer' do
99
+ expect(Lookup.lookup('mod::e', nil, 'not found', true, nil, invocation)).to eql('mod::e (from global)')
100
+ end
101
+
102
+ it 'environment layer wins over module layer' do
103
+ expect(Lookup.lookup('mod::f', nil, 'not found', true, nil, invocation)).to eql('mod::f (from environment)')
104
+ end
105
+
106
+ context "with 'global_only' set to true in the invocation" do
107
+ let(:invocation) { Invocation.new(scope).set_global_only }
108
+
109
+ it 'finds data in global layer' do
110
+ expect(Lookup.lookup('a', nil, nil, false, nil, invocation)).to eql('a (from global)')
111
+ end
112
+
113
+ it 'does not find data in environment layer' do
114
+ expect(Lookup.lookup('b', nil, 'not found', true, nil, invocation)).to eql('not found')
115
+ end
116
+
117
+ it 'does not find data in module layer' do
118
+ expect(Lookup.lookup('mod::c', nil, 'not found', true, nil, invocation)).to eql('not found')
119
+ end
120
+ end
121
+
122
+ context "with 'global_only' set to true in the lookup adapter" do
123
+ it 'finds data in global layer' do
124
+ invocation.lookup_adapter.set_global_only
125
+ expect(Lookup.lookup('a', nil, nil, false, nil, invocation)).to eql('a (from global)')
126
+ end
127
+
128
+ it 'does not find data in environment layer' do
129
+ invocation.lookup_adapter.set_global_only
130
+ expect(Lookup.lookup('b', nil, 'not found', true, nil, invocation)).to eql('not found')
131
+ end
132
+
133
+ it 'does not find data in module layer' do
134
+ invocation.lookup_adapter.set_global_only
135
+ expect(Lookup.lookup('mod::c', nil, 'not found', true, nil, invocation)).to eql('not found')
136
+ end
137
+ end
138
+
139
+ context 'with subclassed lookup adpater' do
140
+ let(:other_dir) { tmpdir('other') }
141
+ let(:other_dir_content) do
142
+ {
143
+ 'hiera.yaml' => <<-YAML.unindent,
144
+ version: 5
145
+ YAML
146
+ 'data' => {
147
+ 'common.yaml' => <<-YAML.unindent
148
+ a: a (from other global)
149
+ d: d (from other global)
150
+ mod::e: mod::e (from other global)
151
+ YAML
152
+ }
153
+ }
154
+ end
155
+
156
+ let(:populated_other_dir) do
157
+ dir_contained_in(other_dir, other_dir_content)
158
+ other_dir
159
+ end
160
+
161
+ before(:each) do
162
+ eval(<<-RUBY.unindent)
163
+ class SpecialLookupAdapter < LookupAdapter
164
+ def initialize(compiler)
165
+ super
166
+ set_global_only
167
+ set_global_hiera_config_path(File.join('#{populated_other_dir}', 'hiera.yaml'))
168
+ end
169
+ end
170
+ RUBY
171
+ end
172
+
173
+ after(:each) do
174
+ Puppet::Pops::Lookup.send(:remove_const, :SpecialLookupAdapter)
175
+ end
176
+
177
+ let(:other_invocation) { Invocation.new(scope, EMPTY_HASH, EMPTY_HASH, nil, SpecialLookupAdapter) }
178
+
179
+ it 'finds different data in global layer' do
180
+ expect(Lookup.lookup('a', nil, nil, false, nil, other_invocation)).to eql('a (from other global)')
181
+ expect(Lookup.lookup('a', nil, nil, false, nil, invocation)).to eql('a (from global)')
182
+ end
183
+
184
+ it 'does not find data in environment layer' do
185
+ expect(Lookup.lookup('b', nil, 'not found', true, nil, other_invocation)).to eql('not found')
186
+ expect(Lookup.lookup('b', nil, 'not found', true, nil, invocation)).to eql('b (from environment)')
187
+ end
188
+
189
+ it 'does not find data in module layer' do
190
+ expect(Lookup.lookup('mod::c', nil, 'not found', true, nil, other_invocation)).to eql('not found')
191
+ expect(Lookup.lookup('mod::c', nil, 'not found', true, nil, invocation)).to eql('mod::c (from module)')
192
+ end
193
+ end
194
+ end
195
+ end
196
+ end
197
+ end
@@ -0,0 +1,18 @@
1
+ #! /usr/bin/env ruby
2
+ require 'spec_helper'
3
+ require 'puppet/pops'
4
+
5
+ module Puppet::Pops
6
+ describe 'MergeStrategy' do
7
+ context 'deep merge' do
8
+ it 'does not mutate the source of a merge' do
9
+ a = { 'a' => { 'b' => 'va' }, 'c' => 2 }
10
+ b = { 'a' => { 'b' => 'vb' }, 'b' => 3}
11
+ c = MergeStrategy.strategy(:deep).merge(a, b);
12
+ expect(a).to eql({ 'a' => { 'b' => 'va' }, 'c' => 2 })
13
+ expect(b).to eql({ 'a' => { 'b' => 'vb' }, 'b' => 3 })
14
+ expect(c).to eql({ 'a' => { 'b' => 'va' }, 'b' => 3, 'c' => 2 })
15
+ end
16
+ end
17
+ end
18
+ end