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
@@ -3,9 +3,15 @@
3
3
  require 'yaml'
4
4
 
5
5
  module Puppet::DataProviders
6
+ # TODO: API 5.0, remove this class
6
7
  # @api private
8
+ # @deprecated
7
9
  class YamlDataProviderFactory < Puppet::Plugins::DataProviders::FileBasedDataProviderFactory
8
10
  def create(name, paths, parent_data_provider)
11
+ unless Puppet[:strict] == :off
12
+ Puppet.warn_once(:deprecation, 'Puppet::DataProviders::YamlDataProviderFactory',
13
+ 'Puppet::DataProviders::YamlDataProviderFactory is deprecated and will be removed in the next major version of Puppet')
14
+ end
9
15
  YamlDataProvider.new(name, paths, parent_data_provider)
10
16
  end
11
17
 
@@ -14,9 +20,15 @@ module Puppet::DataProviders
14
20
  end
15
21
  end
16
22
 
23
+ # TODO: API 5.0, remove this class
17
24
  # @api private
25
+ # @deprecated
18
26
  class YamlDataProvider < Puppet::Plugins::DataProviders::PathBasedDataProvider
19
27
  def initialize_data(path, lookup_invocation)
28
+ unless Puppet[:strict] == :off
29
+ Puppet.warn_once(:deprecation, 'Puppet::DataProviders::YamlDataProvider',
30
+ 'Puppet::DataProviders::YamlDataProvider is deprecated and will be removed in the next major version of Puppet')
31
+ end
20
32
  data = YAML.load_file(path)
21
33
  HieraConfig.symkeys_to_string(data.nil? ? {} : data)
22
34
  rescue YAML::SyntaxError => ex
@@ -1,11 +1,11 @@
1
+ # TODO: API 5.0, remove this module
1
2
  # @api private
3
+ # @deprecated
2
4
  module Puppet::DataProviders
3
5
 
4
6
  def self.assert_loaded
5
7
  unless @loaded
6
8
  require 'puppet/pops'
7
- require 'puppet/data_providers/data_adapter'
8
- require 'puppet/data_providers/lookup_adapter'
9
9
  end
10
10
  @loaded = true
11
11
  end
@@ -25,7 +25,10 @@ module Puppet::DataProviders
25
25
  end
26
26
 
27
27
  def self.lookup_adapter(lookup_invocation)
28
+ unless Puppet[:strict] == :off
29
+ Puppet.deprecation_warning('The method Puppet::DataProviders.lookup_adapter is deprecated and will be removed in the next major release of Puppet.')
30
+ end
28
31
  assert_loaded()
29
- LookupAdapter.adapt(lookup_invocation.scope.compiler)
32
+ Puppet::Pops::Lookup::LookupAdapter.adapt(lookup_invocation.scope.compiler)
30
33
  end
31
34
  end
@@ -419,7 +419,20 @@ deprecated and has been replaced by 'always_retry_plugins'."
419
419
  :data_binding_terminus => {
420
420
  :type => :terminus,
421
421
  :default => "hiera",
422
- :desc => "Where to retrieve information about data.",
422
+ :desc =>
423
+ "This setting has been deprecated. Use of any value other than 'hiera' should instead be configured
424
+ in a version 5 hiera.yaml. Until this setting is removed, it controls which data binding terminus
425
+ to use for global automatic data binding (across all environments). By default this value is 'hiera'.
426
+ A value of 'none' turns off the global binding.",
427
+ :call_hook => :on_initialize_and_write,
428
+ :hook => proc do |value|
429
+ if Puppet[:strict] != :off
430
+ s_val = value.to_s # because sometimes the value is a symbol
431
+ unless s_val == 'hiera' || s_val == 'none' || value == '' || value.nil?
432
+ Puppet.deprecation_warning "Setting 'data_binding_terminus' is deprecated. Convert custom terminus to hiera 5 API."
433
+ end
434
+ end
435
+ end
423
436
  },
424
437
  :hiera_config => {
425
438
  :default => lambda do
@@ -517,6 +530,10 @@ deprecated and has been replaced by 'always_retry_plugins'."
517
530
  read after the elapsed interval then the connection will be closed. The default value is unlimited.
518
531
  #{AS_DURATION}",
519
532
  },
533
+ :http_user_agent => {
534
+ :default => "Puppet/#{Puppet.version} Ruby/#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} (#{RUBY_PLATFORM})",
535
+ :desc => "The HTTP User-Agent string to send when making network requests."
536
+ },
520
537
  :filetimeout => {
521
538
  :default => "15s",
522
539
  :type => :duration,
@@ -556,13 +573,17 @@ deprecated and has been replaced by 'always_retry_plugins'."
556
573
  inconsistent catalogs."
557
574
  },
558
575
  :environment_data_provider => {
559
- :default => "none",
560
576
  :desc => "The name of a registered environment data provider used when obtaining environment
561
577
  specific data. The three built in and registered providers are 'none' (no data), 'function' (data
562
578
  obtained by calling the function 'environment::data()') and 'hiera' (data obtained using a data
563
579
  provider configured using a hiera.yaml file in root of the environment).
564
580
  Other environment data providers may be registered in modules on the module path. For such
565
- custom data providers see the respective module documentation."
581
+ custom data providers see the respective module documentation. This setting is deprecated.",
582
+ :hook => proc { |value|
583
+ unless value.nil? || Puppet[:strict] == :off
584
+ Puppet.deprecation_warning "Setting 'environment_data_provider' is deprecated."
585
+ end
586
+ }
566
587
  },
567
588
  :prerun_command => {
568
589
  :default => "",
@@ -1715,7 +1736,7 @@ EOT
1715
1736
  },
1716
1737
 
1717
1738
  :pluginsignore => {
1718
- :default => ".svn CVS .git",
1739
+ :default => ".svn CVS .git .hg",
1719
1740
  :desc => "What files to ignore when pulling down plugins.",
1720
1741
  }
1721
1742
  )
@@ -254,4 +254,6 @@ Puppet::Face.define(:ca, '0.1.0') do
254
254
  end
255
255
  end
256
256
  end
257
+
258
+ deprecate
257
259
  end
@@ -51,4 +51,6 @@ Puppet::Indirector::Face.define(:certificate_request, '0.0.1') do
51
51
 
52
52
  get_action(:save).summary "API only: submit a certificate signing request."
53
53
  get_action(:save).arguments "<x509_CSR>"
54
+
55
+ deprecate
54
56
  end
@@ -51,4 +51,6 @@ Puppet::Indirector::Face.define(:certificate_revocation_list, '0.0.1') do
51
51
 
52
52
  deactivate_action(:search)
53
53
  deactivate_action(:save)
54
+
55
+ deprecate
54
56
  end
@@ -44,4 +44,7 @@ Puppet::Indirector::Face.define(:file, '0.0.1') do
44
44
  deactivate_action(:destroy)
45
45
 
46
46
  set_indirection_name :file_bucket_file
47
+
48
+ # The file face is deprecated
49
+ deprecate
47
50
  end
@@ -1,4 +1,7 @@
1
1
  <%# encoding: UTF-8%>
2
+ <% if face.deprecated? -%>
3
+ <%= "Warning: 'puppet #{face.name}' is deprecated and will be removed in a future release." %>
4
+ <% end %>
2
5
  <% if face.synopsis -%>
3
6
  USAGE: <%= face.synopsis %>
4
7
 
@@ -6,22 +6,22 @@ require 'erb'
6
6
 
7
7
  Puppet::Face.define(:help, '0.0.1') do
8
8
  copyright "Puppet Labs", 2011
9
- license "Apache 2 license; see COPYING"
9
+ license _("Apache 2 license; see COPYING")
10
10
 
11
- summary "Display Puppet help."
11
+ summary _("Display Puppet help.")
12
12
 
13
13
  action(:help) do
14
- summary "Display help about Puppet subcommands and their actions."
15
- arguments "[<subcommand>] [<action>]"
16
- returns "Short help text for the specified subcommand or action."
17
- examples <<-'EOT'
14
+ summary _("Display help about Puppet subcommands and their actions.")
15
+ arguments _("[<subcommand>] [<action>]")
16
+ returns _("Short help text for the specified subcommand or action.")
17
+ examples _(<<-'EOT')
18
18
  Get help for an action:
19
19
 
20
20
  $ puppet help
21
21
  EOT
22
22
 
23
- option "--version VERSION" do
24
- summary "The version of the subcommand for which to show help."
23
+ option _("--version VERSION") do
24
+ summary _("The version of the subcommand for which to show help.")
25
25
  end
26
26
 
27
27
  default
@@ -47,7 +47,7 @@ Puppet::Face.define(:help, '0.0.1') do
47
47
  EOT
48
48
  353.times{i,x=i.divmod(1184);a,b=x.divmod(37);print(c[a]*b)}
49
49
  end
50
- raise ArgumentError, "Puppet help only takes two (optional) arguments: a subcommand and an action"
50
+ raise ArgumentError, _("Puppet help only takes two (optional) arguments: a subcommand and an action")
51
51
  end
52
52
 
53
53
  version = :current
@@ -56,7 +56,7 @@ Puppet::Face.define(:help, '0.0.1') do
56
56
  version = options[:version]
57
57
  else
58
58
  if args.length == 0 then
59
- raise ArgumentError, "Version only makes sense when a Faces subcommand is given"
59
+ raise ArgumentError, _("Version only makes sense when a Faces subcommand is given")
60
60
  end
61
61
  end
62
62
  end
@@ -66,7 +66,7 @@ Puppet::Face.define(:help, '0.0.1') do
66
66
  facename, actionname = args
67
67
  if legacy_applications.include? facename then
68
68
  if actionname then
69
- raise ArgumentError, "Legacy subcommands don't take actions"
69
+ raise ArgumentError, _("Legacy subcommands don't take actions")
70
70
  end
71
71
  return render_application_help(facename)
72
72
  else
@@ -78,7 +78,7 @@ Puppet::Face.define(:help, '0.0.1') do
78
78
  def render_application_help(applicationname)
79
79
  return Puppet::Application[applicationname].help
80
80
  rescue StandardError, LoadError => detail
81
- msg = <<-MSG
81
+ msg = _(<<-MSG)
82
82
  Could not load help for the application #{applicationname}.
83
83
  Please check the error logs for more information.
84
84
 
@@ -91,7 +91,7 @@ MSG
91
91
  face, action = load_face_help(facename, actionname, version)
92
92
  return template_for(face, action).result(binding)
93
93
  rescue StandardError, LoadError => detail
94
- msg = <<-MSG
94
+ msg = _(<<-MSG)
95
95
  Could not load help for the face #{facename}.
96
96
  Please check the error logs for more information.
97
97
 
@@ -105,7 +105,7 @@ MSG
105
105
  if actionname
106
106
  action = face.get_action(actionname.to_sym)
107
107
  if not action
108
- fail ArgumentError, "Unable to load action #{actionname} from #{face}"
108
+ fail ArgumentError, _("Unable to load action #{actionname} from #{face}")
109
109
  end
110
110
  end
111
111
 
@@ -146,9 +146,11 @@ MSG
146
146
  if (is_face_app?(appname))
147
147
  begin
148
148
  face = Puppet::Face[appname, :current]
149
- result << [appname, face.summary]
149
+ # Add deprecation message to summary if the face is deprecated
150
+ summary = face.deprecated? ? face.summary + _(" (Deprecated)") : face.summary
151
+ result << [appname, summary]
150
152
  rescue StandardError, LoadError
151
- result << [ "! #{appname}", "! Subcommand unavailable due to error. Check error logs." ]
153
+ result << [ "! #{appname}", _("! Subcommand unavailable due to error. Check error logs.") ]
152
154
  end
153
155
  else
154
156
  result << [appname, horribly_extract_summary_from(appname)]
@@ -169,7 +171,7 @@ MSG
169
171
  end
170
172
  end
171
173
  rescue StandardError, LoadError
172
- return "! Subcommand unavailable due to error. Check error logs."
174
+ return _("! Subcommand unavailable due to error. Check error logs.")
173
175
  end
174
176
  return ''
175
177
  end
@@ -12,4 +12,5 @@ Puppet::Indirector::Face.define(:key, '0.0.1') do
12
12
  subcommand directly.
13
13
  EOT
14
14
 
15
+ deprecate
15
16
  end
@@ -76,11 +76,13 @@ Puppet::Face.define(:man, '0.0.1') do
76
76
  if pager then ENV['PAGER'] = pager end
77
77
 
78
78
  args = "--man --manual='Puppet Manual' --organization='Puppet Labs, LLC'"
79
- IO.popen("#{ronn} #{args}", 'w') do |fh| fh.write text end
79
+ # manual pages could contain UTF-8 text
80
+ IO.popen("#{ronn} #{args}", 'w:UTF-8') do |fh| fh.write text end
80
81
 
81
82
  '' # suppress local output, neh?
82
83
  elsif pager then
83
- IO.popen(pager, 'w') do |fh| fh.write text end
84
+ # manual pages could contain UTF-8 text
85
+ IO.popen(pager, 'w:UTF-8') do |fh| fh.write text end
84
86
  ''
85
87
  else
86
88
  text
@@ -236,7 +236,7 @@ module Puppet::ModuleTool::Generate
236
236
  content = block[path.read, binding]
237
237
 
238
238
  target = path.parent + path.basename(".#{type}")
239
- target.open('w') { |f| f.write(content) }
239
+ target.open('w:UTF-8') { |f| f.write(content) }
240
240
  path.unlink
241
241
  end
242
242
  end
@@ -45,4 +45,6 @@ Puppet::Indirector::Face.define(:status, '0.0.1') do
45
45
 
46
46
  $ puppet status find --terminus rest
47
47
  EOT
48
+
49
+ deprecate
48
50
  end
@@ -17,8 +17,15 @@ end
17
17
  Puppet.features.add(:microsoft_windows) do
18
18
  begin
19
19
  # ruby
20
- require 'Win32API' # case matters in this require!
21
- require 'win32ole'
20
+ require 'Win32API' # case matters in this require!
21
+
22
+ # Note: Setting codepage here globally ensures all strings returned via
23
+ # WIN32OLE (Ruby's late-bound COM support) are encoded in Encoding::UTF_8
24
+ #
25
+ # Also, this does not modify the value of WIN32OLE.locale - which defaults
26
+ # to 2048 (at least on US English Windows) and is not listed in the MS
27
+ # locales table, here: https://msdn.microsoft.com/en-us/library/ms912047(v=winembedded.10).aspx
28
+ require 'win32ole' ; WIN32OLE.codepage = WIN32OLE::CP_UTF8
22
29
  # gems
23
30
  require 'win32/process'
24
31
  require 'win32/dir'
@@ -0,0 +1,3 @@
1
+ require 'puppet/util/feature'
2
+
3
+ Puppet.features.add(:hocon, :libs => ['hocon'])
@@ -3,6 +3,14 @@ require 'puppet/util/windows'
3
3
 
4
4
  class Puppet::FileSystem::Windows < Puppet::FileSystem::Posix
5
5
 
6
+ def open(path, mode, options, &block)
7
+ # PUP-6959 mode is explicitly ignored until it can be implemented
8
+ # Ruby on Windows uses mode for setting file attributes like read-only and
9
+ # archived, not for setting permissions like POSIX
10
+ raise TypeError.new('mode must be specified as an Integer') if mode && !mode.is_a?(Numeric)
11
+ ::File.open(path, options, nil, &block)
12
+ end
13
+
6
14
  def expand_path(path, dir_string = nil)
7
15
  # ensure `nil` values behave like underlying File.expand_path
8
16
  string_path = ::File.expand_path(path.nil? ? nil : path_string(path), dir_string)
@@ -32,6 +32,15 @@ module Puppet::FileSystem
32
32
 
33
33
  # Opens the given path with given mode, and options and optionally yields it to the given block.
34
34
  #
35
+ # @param path [String, Pathname] the path to the file to operate on
36
+ # @param mode [Integer] The mode to apply to the file if it is created
37
+ # @param options [String] Extra file operation mode information to use
38
+ # This is the standard mechanism Ruby uses in the IO class, and therefore
39
+ # encoding may be specified explicitly as fmode : encoding or fmode : "BOM|UTF-*"
40
+ # for example, a:ASCII or w+:UTF-8
41
+ # @yield The file handle, in the mode given by options, else read-write mode
42
+ # @return [Void]
43
+ #
35
44
  # @api public
36
45
  #
37
46
  def self.open(path, mode, options, &block)
@@ -98,10 +107,13 @@ module Puppet::FileSystem
98
107
  #
99
108
  # @param path [Pathname] the path to the file to operate on
100
109
  # @param mode [Integer] The mode to apply to the file if it is created
101
- # @param options [Integer] Extra file operation mode information to use
102
- # (defaults to read-only mode)
110
+ # @param options [String] Extra file operation mode information to use
111
+ # (defaults to read-only mode 'r')
112
+ # This is the standard mechanism Ruby uses in the IO class, and therefore
113
+ # encoding may be specified explicitly as fmode : encoding or fmode : "BOM|UTF-*"
114
+ # for example, a:ASCII or w+:UTF-8
103
115
  # @param timeout [Integer] Number of seconds to wait for the lock (defaults to 300)
104
- # @yield The file handle, in read-write mode
116
+ # @yield The file handle, in the mode given by options, else read-write mode
105
117
  # @return [Void]
106
118
  # @raise [Timeout::Error] If the timeout is exceeded while waiting to acquire the lock
107
119
  #
@@ -147,8 +147,7 @@ class Puppet::Forge
147
147
  def user_agent
148
148
  @user_agent ||= [
149
149
  @agent,
150
- "Puppet/#{Puppet.version}",
151
- "Ruby/#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} (#{RUBY_PLATFORM})",
150
+ Puppet[:http_user_agent]
152
151
  ].join(' ').freeze
153
152
  end
154
153
  end
data/lib/puppet/forge.rb CHANGED
@@ -6,9 +6,9 @@ require 'tempfile'
6
6
  require 'uri'
7
7
  require 'pathname'
8
8
  require 'json'
9
- require 'semantic'
9
+ require 'semantic_puppet'
10
10
 
11
- class Puppet::Forge < Semantic::Dependency::Source
11
+ class Puppet::Forge < SemanticPuppet::Dependency::Source
12
12
  require 'puppet/forge/cache'
13
13
  require 'puppet/forge/repository'
14
14
  require 'puppet/forge/errors'
@@ -83,9 +83,9 @@ class Puppet::Forge < Semantic::Dependency::Source
83
83
  # Fetches {ModuleRelease} entries for each release of the named module.
84
84
  #
85
85
  # @param input [String] the module name to look up
86
- # @return [Array<Semantic::Dependency::ModuleRelease>] a list of releases for
86
+ # @return [Array<SemanticPuppet::Dependency::ModuleRelease>] a list of releases for
87
87
  # the given name
88
- # @see Semantic::Dependency::Source#fetch
88
+ # @see SemanticPuppet::Dependency::Source#fetch
89
89
  def fetch(input)
90
90
  name = input.tr('/', '-')
91
91
  uri = "/v3/releases?module=#{name}"
@@ -114,7 +114,7 @@ class Puppet::Forge < Semantic::Dependency::Source
114
114
  @repository.make_http_request(*args)
115
115
  end
116
116
 
117
- class ModuleRelease < Semantic::Dependency::ModuleRelease
117
+ class ModuleRelease < SemanticPuppet::Dependency::ModuleRelease
118
118
  attr_reader :install_dir, :metadata
119
119
 
120
120
  def initialize(source, data)
@@ -122,7 +122,7 @@ class Puppet::Forge < Semantic::Dependency::Source
122
122
  @metadata = meta = data['metadata']
123
123
 
124
124
  name = meta['name'].tr('/', '-')
125
- version = Semantic::Version.parse(meta['version'])
125
+ version = SemanticPuppet::Version.parse(meta['version'])
126
126
  release = "#{name}@#{version}"
127
127
 
128
128
  if meta['dependencies']
@@ -10,16 +10,10 @@ Puppet::Functions.create_function(:binary_file, Puppet::Functions::InternalFunct
10
10
  end
11
11
 
12
12
  def binary_file(scope, unresolved_path)
13
- path = nil
14
- found = Puppet::Parser::Files.find_file(unresolved_path, scope.compiler.environment)
15
- if found && Puppet::FileSystem.exist?(found)
16
- path = found
17
- end
18
-
19
- if path
20
- Puppet::Pops::Types::PBinaryType::Binary.from_binary_string(Puppet::FileSystem.binread(path))
21
- else
22
- raise Puppet::ParseError, "binary_file(): The given file '#{path}' does not exist"
13
+ path = Puppet::Parser::Files.find_file(unresolved_path, scope.compiler.environment)
14
+ unless path && Puppet::FileSystem.exist?(path)
15
+ raise Puppet::ParseError, "binary_file(): The given file '#{unresolved_path}' does not exist"
23
16
  end
17
+ Puppet::Pops::Types::PBinaryType::Binary.from_binary_string(Puppet::FileSystem.binread(path))
24
18
  end
25
19
  end
@@ -69,6 +69,6 @@ Puppet::Functions.create_function(:hiera_array, Hiera::PuppetFunction) do
69
69
  init_dispatch
70
70
 
71
71
  def merge_type
72
- :array
72
+ :unique
73
73
  end
74
74
  end
@@ -80,7 +80,7 @@ Puppet::Functions.create_function(:hiera_include, Hiera::PuppetFunction) do
80
80
  init_dispatch
81
81
 
82
82
  def merge_type
83
- :array
83
+ :unique
84
84
  end
85
85
 
86
86
  def post_lookup(scope, key, value)
@@ -0,0 +1,24 @@
1
+ # @since 4.9.0
2
+ #
3
+ Puppet::Functions.create_function(:hocon_data) do
4
+ unless Puppet.features.hocon?
5
+ raise Puppet::DataBinding::LookupError, 'Lookup using Hocon data_hash function is not supported without hocon library'
6
+ end
7
+
8
+ require 'hocon'
9
+ require 'hocon/config_error'
10
+
11
+ dispatch :hocon_data do
12
+ param 'Struct[{path=>String[1]}]', :options
13
+ param 'Puppet::LookupContext', :context
14
+ end
15
+
16
+ def hocon_data(options, context)
17
+ path = options['path']
18
+ begin
19
+ Hocon.parse(Puppet::FileSystem.read(path, :encoding => 'utf-8'))
20
+ rescue Hocon::ConfigError => ex
21
+ raise Puppet::DataBinding::LookupError, "Unable to parse (#{path}): #{ex.message}"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,18 @@
1
+ # @since 4.8.0
2
+ #
3
+ Puppet::Functions.create_function(:json_data) do
4
+ dispatch :json_data do
5
+ param 'Struct[{path=>String[1]}]', :options
6
+ param 'Puppet::LookupContext', :context
7
+ end
8
+
9
+ def json_data(options, context)
10
+ path = options['path']
11
+ begin
12
+ JSON.parse(Puppet::FileSystem.read(path, :encoding => 'utf-8'))
13
+ rescue JSON::ParserError => ex
14
+ # Filename not included in message, so we add it here.
15
+ raise Puppet::DataBinding::LookupError, "Unable to parse (#{path}): #{ex.message}"
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ # @since 4.8.0
2
+ #
3
+ require 'yaml'
4
+
5
+ Puppet::Functions.create_function(:yaml_data) do
6
+ dispatch :yaml_data do
7
+ param 'Struct[{path=>String[1]}]', :options
8
+ param 'Puppet::LookupContext', :context
9
+ end
10
+
11
+ def yaml_data(options, context)
12
+ begin
13
+ data = YAML.load_file(options['path'])
14
+ Puppet::Pops::Lookup::HieraConfig.symkeys_to_string(data.nil? ? {} : data)
15
+ rescue YAML::SyntaxError => ex
16
+ # Psych errors includes the absolute path to the file, so no need to add that
17
+ # to the message
18
+ raise Puppet::DataBinding::LookupError, "Unable to parse #{ex.message}"
19
+ end
20
+ end
21
+ end
@@ -222,7 +222,7 @@ module Puppet
222
222
  effective_output_path = input.effective_output_path(outputdir)
223
223
  Puppet.notice "Generating '#{effective_output_path}' using '#{input.format}' format."
224
224
  FileUtils.mkdir_p(File.dirname(effective_output_path))
225
- File.open(effective_output_path, 'w') do |file|
225
+ Puppet::FileSystem.open(effective_output_path, nil, 'w:UTF-8') do |file|
226
226
  file.write(result)
227
227
  end
228
228
  rescue Exception => e
@@ -258,7 +258,8 @@ class Puppet::Graph::SimpleGraph
258
258
  graph << '}'
259
259
 
260
260
  filename = File.join(Puppet[:graphdir], "cycles.dot")
261
- File.open(filename, "w") { |f| f.puts graph }
261
+ # DOT files are assumed to be UTF-8 by default - http://www.graphviz.org/doc/info/lang.html
262
+ File.open(filename, "w:UTF-8") { |f| f.puts graph }
262
263
  return filename
263
264
  end
264
265
 
@@ -463,7 +464,8 @@ class Puppet::Graph::SimpleGraph
463
464
  return unless Puppet[:graph]
464
465
 
465
466
  file = File.join(Puppet[:graphdir], "#{name}.dot")
466
- File.open(file, "w") { |f|
467
+ # DOT files are assumed to be UTF-8 by default - http://www.graphviz.org/doc/info/lang.html
468
+ File.open(file, "w:UTF-8") { |f|
467
469
  f.puts to_dot("name" => name.to_s.capitalize)
468
470
  }
469
471
  end
@@ -115,7 +115,11 @@ module Puppet::FileBucketFile
115
115
  # @param files_original_path [String]
116
116
  #
117
117
  def matches(paths_file, files_original_path)
118
- Puppet::FileSystem.open(paths_file, 0640, 'a+') do |f|
118
+ # Puppet will have already written the paths_file in the systems encoding
119
+ # given its possible that request.options[:bucket_path] or Puppet[:bucketdir]
120
+ # contained characters in an encoding that are not represented the
121
+ # same way when the bytes are decoded as UTF-8, continue using system encoding
122
+ Puppet::FileSystem.open(paths_file, 0640, 'a+:external') do |f|
119
123
  path_match(f, files_original_path)
120
124
  end
121
125
  end
@@ -138,7 +142,11 @@ module Puppet::FileBucketFile
138
142
  Puppet::FileSystem.dir_mkpath(paths_file)
139
143
  end
140
144
 
141
- Puppet::FileSystem.exclusive_open(paths_file, 0640, 'a+') do |f|
145
+ # Puppet will have already written the paths_file in the systems encoding
146
+ # given its possible that request.options[:bucket_path] or Puppet[:bucketdir]
147
+ # contained characters in an encoding that are not represented the
148
+ # same way when the bytes are decoded as UTF-8, continue using system encoding
149
+ Puppet::FileSystem.exclusive_open(paths_file, 0640, 'a+:external') do |f|
142
150
  if Puppet::FileSystem.exist?(contents_file)
143
151
  verify_identical_file!(contents_file, bucket_file)
144
152
  Puppet::FileSystem.touch(contents_file)
@@ -243,6 +243,8 @@ class Puppet::Indirector::Request
243
243
  def set_uri_key(key)
244
244
  @uri = key
245
245
  begin
246
+ # calling URI.escape for UTF-8 characters will % escape them
247
+ # and the resulting string components of the URI are now ASCII
246
248
  uri = URI.parse(URI.escape(key))
247
249
  rescue => detail
248
250
  raise ArgumentError, "Could not understand URL #{key}: #{detail}", detail.backtrace
@@ -272,6 +274,8 @@ class Puppet::Indirector::Request
272
274
  @protocol = uri.scheme
273
275
  end
274
276
 
275
- @key = URI.unescape(uri.path.sub(/^\//, ''))
277
+ # The unescaped bytes are correct but in ASCII and must be treated
278
+ # as UTF-8 for the sake of performing string comparisons later
279
+ @key = URI.unescape(uri.path.sub(/^\//, '')).force_encoding(Encoding::UTF_8)
276
280
  end
277
281
  end
@@ -27,7 +27,7 @@ module Puppet::Interface::FaceCollection
27
27
  # ...we need to search for it bound to an o{lder,ther} version. Since
28
28
  # we load all actions when the face is first references, this will be in
29
29
  # memory in the known set of versions of the face.
30
- (@faces[name].keys - [ :current ]).sort.reverse.each do |vers|
30
+ (@faces[name].keys - [ :current ]).sort.reverse_each do |vers|
31
31
  break if action = @faces[name][vers].get_action(action_name)
32
32
  end
33
33
  end