puppet 4.8.2-universal-darwin → 4.9.0-universal-darwin

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/application/face_base.rb +4 -0
  11. data/lib/puppet/application/lookup.rb +4 -2
  12. data/lib/puppet/application/resource.rb +1 -1
  13. data/lib/puppet/data_providers/data_adapter.rb +6 -0
  14. data/lib/puppet/data_providers/data_function_support.rb +7 -0
  15. data/lib/puppet/data_providers/function_env_data_provider.rb +7 -0
  16. data/lib/puppet/data_providers/function_module_data_provider.rb +6 -0
  17. data/lib/puppet/data_providers/hiera_config.rb +31 -10
  18. data/lib/puppet/data_providers/hiera_env_data_provider.rb +6 -0
  19. data/lib/puppet/data_providers/hiera_interpolate.rb +2 -1
  20. data/lib/puppet/data_providers/hiera_module_data_provider.rb +6 -0
  21. data/lib/puppet/data_providers/hiera_support.rb +6 -0
  22. data/lib/puppet/data_providers/json_data_provider_factory.rb +12 -0
  23. data/lib/puppet/data_providers/yaml_data_provider_factory.rb +12 -0
  24. data/lib/puppet/data_providers.rb +6 -3
  25. data/lib/puppet/defaults.rb +25 -4
  26. data/lib/puppet/face/ca.rb +2 -0
  27. data/lib/puppet/face/certificate_request.rb +2 -0
  28. data/lib/puppet/face/certificate_revocation_list.rb +2 -0
  29. data/lib/puppet/face/file.rb +3 -0
  30. data/lib/puppet/face/help/face.erb +3 -0
  31. data/lib/puppet/face/help.rb +19 -17
  32. data/lib/puppet/face/key.rb +1 -0
  33. data/lib/puppet/face/man.rb +4 -2
  34. data/lib/puppet/face/module/generate.rb +1 -1
  35. data/lib/puppet/face/status.rb +2 -0
  36. data/lib/puppet/feature/base.rb +9 -2
  37. data/lib/puppet/feature/hocon.rb +3 -0
  38. data/lib/puppet/file_system/windows.rb +8 -0
  39. data/lib/puppet/file_system.rb +15 -3
  40. data/lib/puppet/forge/repository.rb +1 -2
  41. data/lib/puppet/forge.rb +6 -6
  42. data/lib/puppet/functions/binary_file.rb +4 -10
  43. data/lib/puppet/functions/hiera_array.rb +1 -1
  44. data/lib/puppet/functions/hiera_include.rb +1 -1
  45. data/lib/puppet/functions/hocon_data.rb +24 -0
  46. data/lib/puppet/functions/json_data.rb +18 -0
  47. data/lib/puppet/functions/yaml_data.rb +21 -0
  48. data/lib/puppet/generate/type.rb +1 -1
  49. data/lib/puppet/graph/simple_graph.rb +4 -2
  50. data/lib/puppet/indirector/file_bucket_file/file.rb +10 -2
  51. data/lib/puppet/indirector/request.rb +5 -1
  52. data/lib/puppet/interface/face_collection.rb +1 -1
  53. data/lib/puppet/interface.rb +14 -2
  54. data/lib/puppet/module.rb +14 -2
  55. data/lib/puppet/module_tool/applications/builder.rb +3 -2
  56. data/lib/puppet/module_tool/applications/installer.rb +14 -14
  57. data/lib/puppet/module_tool/applications/upgrader.rb +13 -13
  58. data/lib/puppet/module_tool/installed_modules.rb +7 -7
  59. data/lib/puppet/module_tool/local_tarball.rb +3 -3
  60. data/lib/puppet/module_tool/metadata.rb +1 -1
  61. data/lib/puppet/module_tool.rb +4 -4
  62. data/lib/puppet/network/http/connection.rb +2 -0
  63. data/lib/puppet/network/http/webrick.rb +2 -1
  64. data/lib/puppet/parser/functions/hiera.rb +14 -0
  65. data/lib/puppet/parser/functions/hiera_array.rb +14 -0
  66. data/lib/puppet/parser/functions/hiera_hash.rb +14 -0
  67. data/lib/puppet/parser/functions/hiera_include.rb +14 -0
  68. data/lib/puppet/parser/scope.rb +14 -20
  69. data/lib/puppet/plugins/data_providers/data_provider.rb +108 -17
  70. data/lib/puppet/plugins/data_providers/registry.rb +2 -36
  71. data/lib/puppet/plugins/data_providers.rb +2 -0
  72. data/lib/puppet/pops/adaptable.rb +0 -3
  73. data/lib/puppet/pops/binder/producers.rb +3 -3
  74. data/lib/puppet/pops/evaluator/access_operator.rb +4 -4
  75. data/lib/puppet/pops/evaluator/closure.rb +1 -1
  76. data/lib/puppet/pops/evaluator/compare_operator.rb +4 -4
  77. data/lib/puppet/pops/evaluator/evaluator_impl.rb +1 -1
  78. data/lib/puppet/pops/issues.rb +4 -0
  79. data/lib/puppet/pops/label_provider.rb +14 -0
  80. data/lib/puppet/pops/loader/loader_paths.rb +3 -1
  81. data/lib/puppet/pops/loader/module_loaders.rb +21 -7
  82. data/lib/puppet/pops/loader/typed_name.rb +0 -2
  83. data/lib/puppet/pops/loaders.rb +31 -12
  84. data/lib/puppet/pops/lookup/configured_data_provider.rb +87 -0
  85. data/lib/puppet/pops/lookup/context.rb +121 -71
  86. data/lib/puppet/pops/lookup/data_adapter.rb +27 -0
  87. data/lib/puppet/pops/lookup/data_dig_function_provider.rb +55 -0
  88. data/lib/puppet/pops/lookup/data_hash_function_provider.rb +111 -0
  89. data/lib/puppet/pops/lookup/data_provider.rb +102 -0
  90. data/lib/puppet/pops/lookup/environment_data_provider.rb +27 -0
  91. data/lib/puppet/pops/lookup/explainer.rb +122 -82
  92. data/lib/puppet/pops/lookup/function_provider.rb +82 -0
  93. data/lib/puppet/pops/lookup/global_data_provider.rb +49 -0
  94. data/lib/puppet/pops/lookup/hiera_config.rb +601 -0
  95. data/lib/puppet/pops/lookup/interpolation.rb +56 -35
  96. data/lib/puppet/pops/lookup/invocation.rb +179 -101
  97. data/lib/puppet/pops/lookup/location_resolver.rb +72 -0
  98. data/lib/puppet/pops/lookup/lookup_adapter.rb +451 -0
  99. data/lib/puppet/pops/lookup/lookup_key.rb +99 -0
  100. data/lib/puppet/pops/lookup/lookup_key_function_provider.rb +119 -0
  101. data/lib/puppet/pops/lookup/module_data_provider.rb +58 -0
  102. data/lib/puppet/pops/lookup/sub_lookup.rb +8 -4
  103. data/lib/puppet/pops/lookup.rb +4 -3
  104. data/lib/puppet/pops/merge_strategy.rb +120 -39
  105. data/lib/puppet/pops/parser/egrammar.ra +2 -0
  106. data/lib/puppet/pops/parser/eparser.rb +816 -808
  107. data/lib/puppet/pops/parser/locator.rb +3 -3
  108. data/lib/puppet/pops/parser/slurp_support.rb +4 -3
  109. data/lib/puppet/pops/pcore.rb +21 -12
  110. data/lib/puppet/pops/serialization/abstract_reader.rb +17 -7
  111. data/lib/puppet/pops/serialization/abstract_writer.rb +27 -12
  112. data/lib/puppet/pops/serialization/deserializer.rb +17 -4
  113. data/lib/puppet/pops/serialization/extension.rb +37 -8
  114. data/lib/puppet/pops/serialization/object.rb +14 -6
  115. data/lib/puppet/pops/serialization/rgen.rb +2 -1
  116. data/lib/puppet/pops/serialization/serializer.rb +30 -7
  117. data/lib/puppet/pops/types/implementation_registry.rb +1 -1
  118. data/lib/puppet/pops/types/p_object_type.rb +55 -12
  119. data/lib/puppet/pops/types/p_sem_ver_range_type.rb +27 -27
  120. data/lib/puppet/pops/types/p_sem_ver_type.rb +12 -12
  121. data/lib/puppet/pops/types/p_timespan_type.rb +6 -6
  122. data/lib/puppet/pops/types/p_timestamp_type.rb +2 -2
  123. data/lib/puppet/pops/types/p_type_set_type.rb +7 -16
  124. data/lib/puppet/pops/types/recursion_guard.rb +64 -20
  125. data/lib/puppet/pops/types/ruby_generator.rb +10 -0
  126. data/lib/puppet/pops/types/type_calculator.rb +23 -13
  127. data/lib/puppet/pops/types/type_factory.rb +20 -9
  128. data/lib/puppet/pops/types/type_formatter.rb +37 -17
  129. data/lib/puppet/pops/types/type_mismatch_describer.rb +7 -6
  130. data/lib/puppet/pops/types/type_parser.rb +6 -0
  131. data/lib/puppet/pops/types/types.rb +225 -132
  132. data/lib/puppet/pops/validation/checker4_0.rb +12 -2
  133. data/lib/puppet/pops/validation/validator_factory_4_0.rb +1 -0
  134. data/lib/puppet/pops/validation.rb +1 -1
  135. data/lib/puppet/pops/visitor.rb +4 -3
  136. data/lib/puppet/pops.rb +6 -9
  137. data/lib/puppet/provider/mcx/mcxcontent.rb +2 -1
  138. data/lib/puppet/provider/nameservice.rb +15 -0
  139. data/lib/puppet/provider/package/appdmg.rb +1 -1
  140. data/lib/puppet/provider/package/dnf.rb +1 -1
  141. data/lib/puppet/provider/package/pkg.rb +1 -1
  142. data/lib/puppet/provider/package/pkgdmg.rb +1 -1
  143. data/lib/puppet/provider/package/pkgng.rb +1 -1
  144. data/lib/puppet/provider/package/rpm.rb +2 -2
  145. data/lib/puppet/provider/service/smf.rb +3 -3
  146. data/lib/puppet/provider/service/systemd.rb +5 -1
  147. data/lib/puppet/provider/user/directoryservice.rb +1 -0
  148. data/lib/puppet/provider/user/user_role_add.rb +15 -0
  149. data/lib/puppet/provider/yumrepo/inifile.rb +2 -2
  150. data/lib/puppet/provider/zone/solaris.rb +4 -1
  151. data/lib/puppet/reference/indirection.rb +1 -1
  152. data/lib/puppet/resource/catalog.rb +12 -4
  153. data/lib/puppet/resource/type.rb +3 -3
  154. data/lib/puppet/resource.rb +2 -3
  155. data/lib/puppet/settings/config_file.rb +2 -1
  156. data/lib/puppet/settings/directory_setting.rb +6 -0
  157. data/lib/puppet/settings/environment_conf.rb +6 -2
  158. data/lib/puppet/settings/file_or_directory_setting.rb +6 -0
  159. data/lib/puppet/settings/file_setting.rb +10 -0
  160. data/lib/puppet/settings.rb +1 -1
  161. data/lib/puppet/ssl/certificate_authority.rb +13 -2
  162. data/lib/puppet/ssl/host.rb +23 -1
  163. data/lib/puppet/transaction/additional_resource_generator.rb +7 -0
  164. data/lib/puppet/type/user.rb +16 -3
  165. data/lib/puppet/util/execution.rb +3 -3
  166. data/lib/puppet/util/filetype.rb +11 -5
  167. data/lib/puppet/util/logging.rb +2 -1
  168. data/lib/puppet/util/network_device/config.rb +1 -1
  169. data/lib/puppet/util/plist.rb +6 -0
  170. data/lib/puppet/util/profiler/aggregate.rb +1 -1
  171. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +2 -2
  172. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +2 -1
  173. data/lib/puppet/util/windows/adsi.rb +15 -12
  174. data/lib/puppet/util.rb +1 -0
  175. data/lib/puppet/vendor/load_semantic_puppet.rb +1 -0
  176. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +2 -1
  177. data/lib/puppet/vendor/require_vendored.rb +0 -1
  178. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph.rb +2 -2
  179. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/graph_node.rb +2 -2
  180. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/dependency/module_release.rb +58 -0
  181. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/source.rb +2 -2
  182. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency/unsatisfiable_graph.rb +2 -2
  183. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/dependency.rb +7 -7
  184. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/gem_version.rb +3 -0
  185. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet/locales/config.yaml +21 -0
  186. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version.rb +48 -21
  187. data/lib/puppet/vendor/{semantic/lib/semantic → semantic_puppet/lib/semantic_puppet}/version_range.rb +15 -17
  188. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +17 -0
  189. data/lib/puppet/version.rb +1 -1
  190. data/lib/puppet.rb +52 -0
  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 -2595
  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/dependency/module_release.rb +0 -60
  338. data/lib/puppet/vendor/semantic/lib/semantic.rb +0 -7
  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
@@ -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
@@ -513,7 +513,15 @@ describe 'Lexer2' do
513
513
  "x\\u2713y"
514
514
  CODE
515
515
  # >= Ruby 1.9.3 reports \u
516
- expect(tokens_scanned_from(code)).to match_tokens2([:STRING, "x\u2713y"])
516
+ expect(tokens_scanned_from(code)).to match_tokens2([:STRING, "x\u2713y"])
517
+ end
518
+
519
+ it 'should support adjacent short form unicode characters' do
520
+ code = <<-CODE
521
+ "x\\u2713\\u2713y"
522
+ CODE
523
+ # >= Ruby 1.9.3 reports \u
524
+ expect(tokens_scanned_from(code)).to match_tokens2([:STRING, "x\u2713\u2713y"])
517
525
  end
518
526
 
519
527
  it 'should support unicode characters in long form' do
@@ -523,6 +531,13 @@ describe 'Lexer2' do
523
531
  expect(tokens_scanned_from(code)).to match_tokens2([:STRING, "x\u{1f452}y"])
524
532
  end
525
533
 
534
+ it 'can escape the unicode escape' do
535
+ code = <<-"CODE"
536
+ "x\\\\u{1f452}y"
537
+ CODE
538
+ expect(tokens_scanned_from(code)).to match_tokens2([:STRING, "x\\u{1f452}y"])
539
+ end
540
+
526
541
  it 'produces byte offsets that counts each byte in a comment' do
527
542
  code = <<-"CODE"
528
543
  # \u{0400}\na
@@ -42,6 +42,10 @@ describe "egrammar parsing of site expression" do
42
42
  it "allows the keyword '#{keyword}' as a value in a hash" do
43
43
  expect(dump(parse("$a = {'x'=>#{keyword}}"))).to(eq("(= $a ({} ('x' '#{keyword}')))"))
44
44
  end
45
+
46
+ it "allows the keyword '#{keyword}' as an attribute name" do
47
+ expect(dump(parse("foo { 'x': #{keyword} => 'value' } "))).to eql("(resource foo\n ('x'\n (#{keyword} => 'value')))")
48
+ end
45
49
  end
46
50
  end
47
51
  end
@@ -87,15 +87,6 @@ describe "the Puppet::Pops::Serialization when using #{packer_module.name}" do
87
87
  expect(val2).to eql(val)
88
88
  end
89
89
 
90
- it 'Sensitive' do
91
- sval = 'the sensitive value'
92
- val = Types::PSensitiveType::Sensitive.new(sval)
93
- write(val)
94
- val2 = read
95
- expect(val2).to be_a(Types::PSensitiveType::Sensitive)
96
- expect(val2.unwrap).to eql(sval)
97
- end
98
-
99
90
  it 'Timespan' do
100
91
  val = Time::Timespan.from_fields(false, 3, 12, 40, 31, 123)
101
92
  write(val)
@@ -113,18 +104,18 @@ describe "the Puppet::Pops::Serialization when using #{packer_module.name}" do
113
104
  end
114
105
 
115
106
  it 'Version' do
116
- val = Semantic::Version.parse('1.2.3-alpha2')
107
+ val = SemanticPuppet::Version.parse('1.2.3-alpha2')
117
108
  write(val)
118
109
  val2 = read
119
- expect(val2).to be_a(Semantic::Version)
110
+ expect(val2).to be_a(SemanticPuppet::Version)
120
111
  expect(val2).to eql(val)
121
112
  end
122
113
 
123
114
  it 'VersionRange' do
124
- val = Semantic::VersionRange.parse('>=1.2.3-alpha2 <1.2.4')
115
+ val = SemanticPuppet::VersionRange.parse('>=1.2.3-alpha2 <1.2.4')
125
116
  write(val)
126
117
  val2 = read
127
- expect(val2).to be_a(Semantic::VersionRange)
118
+ expect(val2).to be_a(SemanticPuppet::VersionRange)
128
119
  expect(val2).to eql(val)
129
120
  end
130
121
 
@@ -135,16 +126,6 @@ describe "the Puppet::Pops::Serialization when using #{packer_module.name}" do
135
126
  expect(val2).to be_a(Types::PBinaryType::Binary)
136
127
  expect(val2).to eql(val)
137
128
  end
138
-
139
- it 'Sensitive with rich data' do
140
- sval = Time::Timestamp.now
141
- val = Types::PSensitiveType::Sensitive.new(sval)
142
- write(val)
143
- val2 = read
144
- expect(val2).to be_a(Types::PSensitiveType::Sensitive)
145
- expect(val2.unwrap).to be_a(Time::Timestamp)
146
- expect(val2.unwrap).to eql(sval)
147
- end
148
129
  end
149
130
 
150
131
  context 'will fail on attempts to write' do
@@ -121,19 +121,19 @@ module Serialization
121
121
 
122
122
  it 'Version' do
123
123
  # It does succeed on rare occasions, so we need to repeat
124
- val = Semantic::Version.parse('1.2.3-alpha2')
124
+ val = SemanticPuppet::Version.parse('1.2.3-alpha2')
125
125
  write(val)
126
126
  val2 = read
127
- expect(val2).to be_a(Semantic::Version)
127
+ expect(val2).to be_a(SemanticPuppet::Version)
128
128
  expect(val2).to eql(val)
129
129
  end
130
130
 
131
131
  it 'VersionRange' do
132
132
  # It does succeed on rare occasions, so we need to repeat
133
- val = Semantic::VersionRange.parse('>=1.2.3-alpha2 <1.2.4')
133
+ val = SemanticPuppet::VersionRange.parse('>=1.2.3-alpha2 <1.2.4')
134
134
  write(val)
135
135
  val2 = read
136
- expect(val2).to be_a(Semantic::VersionRange)
136
+ expect(val2).to be_a(SemanticPuppet::VersionRange)
137
137
  expect(val2).to eql(val)
138
138
  end
139
139
 
@@ -186,6 +186,30 @@ module Serialization
186
186
  expect(val2).to eql(val)
187
187
  end
188
188
 
189
+ it 'Collection' do
190
+ val = Types::TypeFactory.collection(Types::TypeFactory.range(0, 20))
191
+ write(val)
192
+ val2 = read
193
+ expect(val2).to be_a(Types::PCollectionType)
194
+ expect(val2).to eql(val)
195
+ end
196
+
197
+ it 'Array' do
198
+ val = Types::TypeFactory.array_of(Types::TypeFactory.integer, Types::TypeFactory.range(0, 20))
199
+ write(val)
200
+ val2 = read
201
+ expect(val2).to be_a(Types::PArrayType)
202
+ expect(val2).to eql(val)
203
+ end
204
+
205
+ it 'Hash' do
206
+ val = Types::TypeFactory.hash_kv(Types::TypeFactory.string, Types::TypeFactory.integer, Types::TypeFactory.range(0, 20))
207
+ write(val)
208
+ val2 = read
209
+ expect(val2).to be_a(Types::PHashType)
210
+ expect(val2).to eql(val)
211
+ end
212
+
189
213
  it 'Variant' do
190
214
  val = Types::TypeFactory.variant(Types::TypeFactory.string, Types::TypeFactory.range(1, :default))
191
215
  write(val)
@@ -208,8 +232,8 @@ module Serialization
208
232
  val = [
209
233
  Time::Timespan.from_fields(false, 3, 12, 40, 31, 123),
210
234
  Time::Timestamp.now,
211
- Semantic::Version.parse('1.2.3-alpha2'),
212
- Semantic::VersionRange.parse('>=1.2.3-alpha2 <1.2.4'),
235
+ SemanticPuppet::Version.parse('1.2.3-alpha2'),
236
+ SemanticPuppet::VersionRange.parse('>=1.2.3-alpha2 <1.2.4'),
213
237
  Types::PBinaryType::Binary.from_base64('w5ZzdGVuIG1lZCByw7ZzdGVuCg==')
214
238
  ]
215
239
  write(val)
@@ -222,8 +246,8 @@ module Serialization
222
246
  val = {
223
247
  'duration' => Time::Timespan.from_fields(false, 3, 12, 40, 31, 123),
224
248
  'time' => Time::Timestamp.now,
225
- 'version' => Semantic::Version.parse('1.2.3-alpha2'),
226
- 'range' => Semantic::VersionRange.parse('>=1.2.3-alpha2 <1.2.4'),
249
+ 'version' => SemanticPuppet::Version.parse('1.2.3-alpha2'),
250
+ 'range' => SemanticPuppet::VersionRange.parse('>=1.2.3-alpha2 <1.2.4'),
227
251
  'binary' => Types::PBinaryType::Binary.from_base64('w5ZzdGVuIG1lZCByw7ZzdGVuCg==')
228
252
  }
229
253
  write(val)
@@ -9,9 +9,15 @@ describe 'The Object Type' do
9
9
 
10
10
  let(:parser) { TypeParser.singleton }
11
11
  let(:pp_parser) { Parser::EvaluatingParser.new }
12
- let(:loader) { Loader::BaseLoader.new(nil, 'type_parser_unit_test_loader') }
12
+ let(:loader) { Loaders.find_loader(nil) }
13
13
  let(:factory) { TypeFactory }
14
14
 
15
+ around(:each) do |example|
16
+ Puppet.override(:loaders => Loaders.new(Puppet::Node::Environment.create(:testing, []))) do
17
+ example.run
18
+ end
19
+ end
20
+
15
21
  def type_object_t(name, body_string)
16
22
  object = PObjectType.new(name, pp_parser.parse_string("{#{body_string}}").current.body)
17
23
  loader.set_entry(Loader::TypedName.new(:type, name.downcase), object)
@@ -148,7 +154,7 @@ describe 'The Object Type' do
148
154
  end
149
155
 
150
156
  context 'when dealing with functions' do
151
- it 'raises an error when the function type is a Type[Callable]' do
157
+ it 'raises an error unless the function type is a Type[Callable]' do
152
158
  obj = <<-OBJECT
153
159
  functions => {
154
160
  a => String
@@ -207,7 +213,7 @@ describe 'The Object Type' do
207
213
  'function MyDerivedObject[a] attempts to override attribute MyObject[a]')
208
214
  end
209
215
 
210
- it 'raises an error when the an function overrides an attribute' do
216
+ it 'raises an error when the a function overrides an attribute' do
211
217
  parent = <<-OBJECT
212
218
  functions => {
213
219
  a => Callable
@@ -699,6 +705,43 @@ describe 'The Object Type' do
699
705
  end
700
706
  end
701
707
 
708
+ context 'when stringifying created instances' do
709
+ it 'outputs a Puppet constructor using the initializer hash' do
710
+ code = <<-CODE
711
+ type Spec::MyObject = Object[{attributes => { a => Integer }}]
712
+ type Spec::MySecondObject = Object[{parent => Spec::MyObject, attributes => { b => String }}]
713
+ notice(Spec::MySecondObject(42, 'Meaning of life'))
714
+ CODE
715
+ expect(eval_and_collect_notices(code)).to eql(["Spec::MySecondObject({\n 'a' => 42,\n 'b' => 'Meaning of life'\n})"])
716
+ end
717
+ end
718
+
719
+ context 'when used from Ruby' do
720
+ it 'can create an instance without scope using positional arguments' do
721
+ parse_object('MyObject', <<-OBJECT)
722
+ attributes => {
723
+ a => { type => Integer }
724
+ }
725
+ OBJECT
726
+
727
+ t = Puppet::Pops::Types::TypeParser.singleton.parse('MyObject', Puppet::Pops::Loaders.find_loader(nil))
728
+ instance = t.create(32)
729
+ expect(instance.a).to eql(32)
730
+ end
731
+
732
+ it 'can create an instance without scope using initialization hash' do
733
+ parse_object('MyObject', <<-OBJECT)
734
+ attributes => {
735
+ a => { type => Integer }
736
+ }
737
+ OBJECT
738
+
739
+ t = Puppet::Pops::Types::TypeParser.singleton.parse('MyObject', Puppet::Pops::Loaders.find_loader(nil))
740
+ instance = t.from_hash('a' => 32)
741
+ expect(instance.a).to eql(32)
742
+ end
743
+ end
744
+
702
745
  context 'when used in Puppet expressions' do
703
746
  it 'two anonymous empty objects are equal' do
704
747
  code = <<-CODE
@@ -763,6 +806,28 @@ describe 'The Object Type' do
763
806
  /attribute MySecondObject\[a\] attempts to override final attribute MyObject\[a\]/)
764
807
  end
765
808
 
809
+ it 'can inherit from an aliased type' do
810
+ code = <<-CODE
811
+ type MyObject = Object[{ name => 'MyFirstObject', attributes => { a => Integer }}]
812
+ type MyObjectAlias = MyObject
813
+ type MySecondObject = Object[{ parent => MyObjectAlias, attributes => { b => String }}]
814
+ notice(MySecondObject < MyObjectAlias)
815
+ notice(MySecondObject < MyObject)
816
+ CODE
817
+ expect(eval_and_collect_notices(code)).to eql(['true', 'true'])
818
+ end
819
+
820
+ it 'detects equality duplication when inherited from an aliased type' do
821
+ code = <<-CODE
822
+ type MyObject = Object[{ name => 'MyFirstObject', attributes => { a => Integer }}]
823
+ type MyObjectAlias = MyObject
824
+ type MySecondObject = Object[{ parent => MyObjectAlias, attributes => { b => String }, equality => a}]
825
+ notice(MySecondObject < MyObject)
826
+ CODE
827
+ expect { eval_and_collect_notices(code) }.to raise_error(Puppet::Error,
828
+ /MySecondObject equality is referencing attribute MyObject\[a\] which is included in equality of MyObject/)
829
+ end
830
+
766
831
  it 'raises an error when object when circular inheritance is detected' do
767
832
  code = <<-CODE
768
833
  type MyFirstObject = Object[{
@@ -20,12 +20,12 @@ describe 'Semantic Versions' do
20
20
  end
21
21
 
22
22
  it 'returns its argument when the argument is a version' do
23
- v = Semantic::Version.new(1,0,0)
23
+ v = SemanticPuppet::Version.new(1,0,0)
24
24
  expect(PSemVerType.convert(v)).to equal(v)
25
25
  end
26
26
 
27
27
  it 'converts a valid version string argument to a version' do
28
- v = Semantic::Version.new(1,0,0)
28
+ v = SemanticPuppet::Version.new(1,0,0)
29
29
  expect(PSemVerType.convert('1.0.0')).to eq(v)
30
30
  end
31
31
 
@@ -42,12 +42,12 @@ describe 'Semantic Versions' do
42
42
  end
43
43
 
44
44
  it 'returns its argument when the argument is a version range' do
45
- vr = Semantic::VersionRange.parse('1.x')
45
+ vr = SemanticPuppet::VersionRange.parse('1.x')
46
46
  expect(PSemVerRangeType.convert(vr)).to equal(vr)
47
47
  end
48
48
 
49
49
  it 'converts a valid version string argument to a version range' do
50
- vr = Semantic::VersionRange.parse('1.x')
50
+ vr = SemanticPuppet::VersionRange.parse('1.x')
51
51
  expect(PSemVerRangeType.convert('1.x')).to eq(vr)
52
52
  end
53
53