puppet 5.3.3 → 5.3.4

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 (291) hide show
  1. data/CONTRIBUTING.md +1 -1
  2. data/Gemfile +3 -0
  3. data/ext/puppet-test +3 -2
  4. data/lib/hiera/puppet_function.rb +5 -2
  5. data/lib/hiera_puppet.rb +3 -3
  6. data/lib/puppet.rb +2 -5
  7. data/lib/puppet/agent.rb +22 -2
  8. data/lib/puppet/agent/locker.rb +6 -5
  9. data/lib/puppet/application.rb +18 -1
  10. data/lib/puppet/application/agent.rb +9 -2
  11. data/lib/puppet/application/apply.rb +1 -1
  12. data/lib/puppet/application/config.rb +1 -0
  13. data/lib/puppet/application/device.rb +1 -2
  14. data/lib/puppet/application/filebucket.rb +22 -5
  15. data/lib/puppet/application/help.rb +1 -0
  16. data/lib/puppet/application/lookup.rb +1 -3
  17. data/lib/puppet/application_support.rb +6 -1
  18. data/lib/puppet/bindings.rb +2 -1
  19. data/lib/puppet/configurer.rb +9 -4
  20. data/lib/puppet/configurer/downloader_factory.rb +10 -0
  21. data/lib/puppet/configurer/plugin_handler.rb +11 -4
  22. data/lib/puppet/daemon.rb +2 -2
  23. data/lib/puppet/defaults.rb +99 -27
  24. data/lib/puppet/environments.rb +2 -0
  25. data/lib/puppet/error.rb +5 -15
  26. data/lib/puppet/external/pson/common.rb +2 -2
  27. data/lib/puppet/face/catalog.rb +1 -1
  28. data/lib/puppet/face/config.rb +14 -1
  29. data/lib/puppet/face/epp.rb +4 -2
  30. data/lib/puppet/face/help.rb +12 -14
  31. data/lib/puppet/face/man.rb +1 -0
  32. data/lib/puppet/face/module/build.rb +1 -1
  33. data/lib/puppet/face/module/list.rb +6 -17
  34. data/lib/puppet/face/module/uninstall.rb +14 -3
  35. data/lib/puppet/face/node.rb +1 -0
  36. data/lib/puppet/face/status.rb +1 -0
  37. data/lib/puppet/file_serving/base.rb +2 -1
  38. data/lib/puppet/file_serving/configuration.rb +3 -0
  39. data/lib/puppet/file_serving/configuration/parser.rb +23 -9
  40. data/lib/puppet/file_serving/mount/locales.rb +35 -0
  41. data/lib/puppet/forge.rb +2 -1
  42. data/lib/puppet/forge/errors.rb +24 -22
  43. data/lib/puppet/functions/binary_file.rb +1 -0
  44. data/lib/puppet/functions/each.rb +10 -4
  45. data/lib/puppet/functions/eyaml_lookup_key.rb +4 -2
  46. data/lib/puppet/functions/lookup.rb +2 -2
  47. data/lib/puppet/functions/map.rb +12 -2
  48. data/lib/puppet/functions/slice.rb +2 -3
  49. data/lib/puppet/functions/unique.rb +1 -1
  50. data/lib/puppet/functions/yaml_data.rb +1 -1
  51. data/lib/puppet/gettext/config.rb +144 -41
  52. data/lib/puppet/gettext/module_translations.rb +42 -0
  53. data/lib/puppet/graph/relationship_graph.rb +1 -1
  54. data/lib/puppet/graph/simple_graph.rb +3 -3
  55. data/lib/puppet/indirector/catalog/compiler.rb +40 -25
  56. data/lib/puppet/indirector/exec.rb +1 -1
  57. data/lib/puppet/indirector/facts/facter.rb +3 -3
  58. data/lib/puppet/indirector/facts/network_device.rb +2 -2
  59. data/lib/puppet/indirector/file_bucket_file/file.rb +4 -1
  60. data/lib/puppet/indirector/indirection.rb +17 -9
  61. data/lib/puppet/indirector/ldap.rb +2 -2
  62. data/lib/puppet/indirector/node/write_only_yaml.rb +3 -1
  63. data/lib/puppet/indirector/rest.rb +8 -5
  64. data/lib/puppet/indirector/ssl_file.rb +2 -2
  65. data/lib/puppet/indirector/terminus.rb +3 -3
  66. data/lib/puppet/interface.rb +2 -1
  67. data/lib/puppet/interface/action.rb +41 -24
  68. data/lib/puppet/interface/action_builder.rb +14 -5
  69. data/lib/puppet/interface/action_manager.rb +1 -1
  70. data/lib/puppet/interface/documentation.rb +21 -10
  71. data/lib/puppet/interface/face_collection.rb +4 -2
  72. data/lib/puppet/interface/option.rb +36 -15
  73. data/lib/puppet/interface/option_builder.rb +23 -9
  74. data/lib/puppet/interface/option_manager.rb +8 -3
  75. data/lib/puppet/metatype/manager.rb +7 -3
  76. data/lib/puppet/module.rb +18 -21
  77. data/lib/puppet/module_tool/errors/installer.rb +18 -20
  78. data/lib/puppet/module_tool/errors/shared.rb +20 -15
  79. data/lib/puppet/module_tool/errors/uninstaller.rb +1 -0
  80. data/lib/puppet/module_tool/errors/upgrader.rb +1 -1
  81. data/lib/puppet/module_tool/tar/mini.rb +57 -4
  82. data/lib/puppet/network/auth_config_parser.rb +18 -13
  83. data/lib/puppet/network/authstore.rb +2 -2
  84. data/lib/puppet/network/client_request.rb +1 -1
  85. data/lib/puppet/network/format.rb +3 -3
  86. data/lib/puppet/network/http/api/indirection_type.rb +1 -1
  87. data/lib/puppet/network/http/api/master/v3/environment.rb +5 -2
  88. data/lib/puppet/network/http/error.rb +7 -7
  89. data/lib/puppet/network/http/factory.rb +9 -0
  90. data/lib/puppet/network/http/rack.rb +2 -2
  91. data/lib/puppet/network/http/webrick.rb +2 -4
  92. data/lib/puppet/node.rb +25 -6
  93. data/lib/puppet/node/environment.rb +14 -0
  94. data/lib/puppet/node/facts.rb +9 -0
  95. data/lib/puppet/parameter.rb +3 -3
  96. data/lib/puppet/parameter/value_collection.rb +9 -9
  97. data/lib/puppet/parser/ast/leaf.rb +1 -1
  98. data/lib/puppet/parser/ast/node.rb +2 -2
  99. data/lib/puppet/parser/ast/pops_bridge.rb +1 -1
  100. data/lib/puppet/parser/compiler.rb +6 -5
  101. data/lib/puppet/parser/functions.rb +1 -1
  102. data/lib/puppet/parser/functions/generate.rb +2 -4
  103. data/lib/puppet/parser/functions/inline_template.rb +1 -2
  104. data/lib/puppet/parser/functions/sprintf.rb +17 -3
  105. data/lib/puppet/parser/functions/template.rb +6 -2
  106. data/lib/puppet/parser/resource.rb +30 -31
  107. data/lib/puppet/parser/scope.rb +20 -11
  108. data/lib/puppet/parser/templatewrapper.rb +4 -3
  109. data/lib/puppet/pops/evaluator/collector_transformer.rb +2 -1
  110. data/lib/puppet/pops/evaluator/collectors/abstract_collector.rb +1 -1
  111. data/lib/puppet/pops/evaluator/epp_evaluator.rb +21 -8
  112. data/lib/puppet/pops/evaluator/evaluator_impl.rb +2 -1
  113. data/lib/puppet/pops/evaluator/external_syntax_support.rb +1 -1
  114. data/lib/puppet/pops/evaluator/runtime3_converter.rb +3 -1
  115. data/lib/puppet/pops/evaluator/runtime3_resource_support.rb +1 -1
  116. data/lib/puppet/pops/evaluator/runtime3_support.rb +4 -4
  117. data/lib/puppet/pops/functions/dispatch.rb +1 -1
  118. data/lib/puppet/pops/functions/function.rb +8 -2
  119. data/lib/puppet/pops/issue_reporter.rb +7 -2
  120. data/lib/puppet/pops/issues.rb +10 -4
  121. data/lib/puppet/pops/label_provider.rb +1 -1
  122. data/lib/puppet/pops/loader/module_loaders.rb +5 -2
  123. data/lib/puppet/pops/loader/static_loader.rb +1 -1
  124. data/lib/puppet/pops/loaders.rb +7 -3
  125. data/lib/puppet/pops/lookup/explainer.rb +2 -1
  126. data/lib/puppet/pops/lookup/hiera_config.rb +2 -2
  127. data/lib/puppet/pops/lookup/lookup_adapter.rb +4 -4
  128. data/lib/puppet/pops/merge_strategy.rb +6 -3
  129. data/lib/puppet/pops/migration/migration_checker.rb +8 -8
  130. data/lib/puppet/pops/model/ast_transformer.rb +1 -1
  131. data/lib/puppet/pops/model/factory.rb +4 -2
  132. data/lib/puppet/pops/resource/resource_type_impl.rb +1 -1
  133. data/lib/puppet/pops/serialization/abstract_writer.rb +2 -1
  134. data/lib/puppet/pops/types/iterable.rb +2 -0
  135. data/lib/puppet/pops/types/p_object_type.rb +36 -15
  136. data/lib/puppet/pops/types/type_calculator.rb +2 -1
  137. data/lib/puppet/pops/types/type_factory.rb +3 -1
  138. data/lib/puppet/pops/types/type_mismatch_describer.rb +19 -6
  139. data/lib/puppet/pops/types/type_parser.rb +7 -7
  140. data/lib/puppet/pops/types/types.rb +10 -4
  141. data/lib/puppet/pops/validation.rb +14 -12
  142. data/lib/puppet/property.rb +14 -6
  143. data/lib/puppet/property/ensure.rb +2 -2
  144. data/lib/puppet/provider.rb +4 -4
  145. data/lib/puppet/provider/group/aix.rb +4 -2
  146. data/lib/puppet/provider/ldap.rb +2 -2
  147. data/lib/puppet/provider/naginator.rb +1 -1
  148. data/lib/puppet/provider/nameservice.rb +7 -4
  149. data/lib/puppet/provider/nameservice/directoryservice.rb +4 -3
  150. data/lib/puppet/provider/package/aix.rb +1 -1
  151. data/lib/puppet/provider/package/nim.rb +7 -8
  152. data/lib/puppet/provider/package/opkg.rb +1 -1
  153. data/lib/puppet/provider/package/pkg.rb +9 -6
  154. data/lib/puppet/provider/package/pkgutil.rb +3 -3
  155. data/lib/puppet/provider/package/yum.rb +1 -1
  156. data/lib/puppet/provider/parsedfile.rb +4 -4
  157. data/lib/puppet/provider/selmodule/semodule.rb +5 -3
  158. data/lib/puppet/provider/service/base.rb +1 -1
  159. data/lib/puppet/provider/service/init.rb +1 -1
  160. data/lib/puppet/provider/service/launchd.rb +2 -2
  161. data/lib/puppet/provider/service/runit.rb +2 -1
  162. data/lib/puppet/provider/service/smf.rb +2 -0
  163. data/lib/puppet/provider/service/systemd.rb +1 -0
  164. data/lib/puppet/provider/service/upstart.rb +1 -1
  165. data/lib/puppet/provider/user/aix.rb +13 -6
  166. data/lib/puppet/provider/user/openbsd.rb +2 -1
  167. data/lib/puppet/provider/yumrepo/inifile.rb +2 -1
  168. data/lib/puppet/provider/zone/solaris.rb +2 -2
  169. data/lib/puppet/reference/configuration.rb +4 -2
  170. data/lib/puppet/relationship.rb +2 -1
  171. data/lib/puppet/reports/store.rb +1 -1
  172. data/lib/puppet/resource.rb +7 -5
  173. data/lib/puppet/resource/capability_finder.rb +14 -11
  174. data/lib/puppet/resource/catalog.rb +33 -18
  175. data/lib/puppet/resource/type.rb +5 -5
  176. data/lib/puppet/settings.rb +19 -13
  177. data/lib/puppet/settings/base_setting.rb +23 -8
  178. data/lib/puppet/settings/config_file.rb +14 -4
  179. data/lib/puppet/settings/environment_conf.rb +19 -9
  180. data/lib/puppet/ssl/base.rb +9 -4
  181. data/lib/puppet/ssl/oids.rb +8 -2
  182. data/lib/puppet/syntax_checkers/base64.rb +5 -6
  183. data/lib/puppet/transaction.rb +7 -3
  184. data/lib/puppet/transaction/persistence.rb +16 -1
  185. data/lib/puppet/transaction/report.rb +6 -0
  186. data/lib/puppet/type.rb +27 -35
  187. data/lib/puppet/type/file.rb +2 -1
  188. data/lib/puppet/type/file/data_sync.rb +2 -1
  189. data/lib/puppet/type/file/source.rb +1 -1
  190. data/lib/puppet/type/group.rb +1 -1
  191. data/lib/puppet/type/mount.rb +1 -1
  192. data/lib/puppet/type/resources.rb +1 -1
  193. data/lib/puppet/type/schedule.rb +26 -14
  194. data/lib/puppet/type/user.rb +9 -3
  195. data/lib/puppet/type/zone.rb +1 -1
  196. data/lib/puppet/util.rb +27 -21
  197. data/lib/puppet/util/at_fork/solaris.rb +6 -4
  198. data/lib/puppet/util/command_line.rb +5 -0
  199. data/lib/puppet/util/command_line/trollop.rb +6 -5
  200. data/lib/puppet/util/errors.rb +61 -8
  201. data/lib/puppet/util/fileparsing.rb +3 -5
  202. data/lib/puppet/util/http_proxy.rb +14 -6
  203. data/lib/puppet/util/instance_loader.rb +1 -3
  204. data/lib/puppet/util/ldap/manager.rb +6 -3
  205. data/lib/puppet/util/log.rb +19 -24
  206. data/lib/puppet/util/logging.rb +21 -28
  207. data/lib/puppet/util/methodhelper.rb +1 -1
  208. data/lib/puppet/util/nagios_maker.rb +1 -1
  209. data/lib/puppet/util/network_device/config.rb +21 -13
  210. data/lib/puppet/util/plist.rb +3 -1
  211. data/lib/puppet/util/posix.rb +1 -1
  212. data/lib/puppet/util/provider_features.rb +1 -1
  213. data/lib/puppet/util/rdoc/generators/puppet_generator.rb +1 -1
  214. data/lib/puppet/util/reference.rb +2 -3
  215. data/lib/puppet/util/selinux.rb +1 -1
  216. data/lib/puppet/util/storage.rb +2 -2
  217. data/lib/puppet/util/windows/eventlog.rb +10 -5
  218. data/lib/puppet/util/windows/file.rb +61 -9
  219. data/lib/puppet/util/windows/process.rb +1 -1
  220. data/lib/puppet/util/windows/taskscheduler.rb +2 -2
  221. data/lib/puppet/vendor/semantic_puppet/lib/semantic_puppet.rb +5 -1
  222. data/lib/puppet/version.rb +1 -1
  223. data/locales/en/puppet.po +19 -0
  224. data/locales/ja/puppet.po +2739 -809
  225. data/locales/puppet.pot +2367 -734
  226. data/spec/fixtures/unit/application/environments/production/data/common.yaml +2 -0
  227. data/spec/integration/agent/logging_spec.rb +2 -0
  228. data/spec/integration/faces/plugin_spec.rb +1 -0
  229. data/spec/integration/network/authconfig_spec.rb +2 -2
  230. data/spec/integration/parser/collection_spec.rb +2 -2
  231. data/spec/integration/parser/scope_spec.rb +16 -3
  232. data/spec/integration/provider/cron/crontab_spec.rb +1 -0
  233. data/spec/integration/transaction/report_spec.rb +5 -0
  234. data/spec/lib/matchers/json.rb +14 -13
  235. data/spec/unit/agent_spec.rb +33 -0
  236. data/spec/unit/application/config_spec.rb +4 -0
  237. data/spec/unit/application/lookup_spec.rb +30 -0
  238. data/spec/unit/application_spec.rb +18 -0
  239. data/spec/unit/configurer/downloader_factory_spec.rb +33 -0
  240. data/spec/unit/configurer/plugin_handler_spec.rb +71 -16
  241. data/spec/unit/environments_spec.rb +15 -0
  242. data/spec/unit/face/config_spec.rb +8 -9
  243. data/spec/unit/face/epp_face_spec.rb +2 -2
  244. data/spec/unit/face/plugin_spec.rb +50 -4
  245. data/spec/unit/file_serving/configuration/parser_spec.rb +2 -2
  246. data/spec/unit/file_serving/mount/locales_spec.rb +73 -0
  247. data/spec/unit/functions/break_spec.rb +108 -50
  248. data/spec/unit/functions/defined_spec.rb +2 -2
  249. data/spec/unit/functions/hiera_spec.rb +0 -1
  250. data/spec/unit/functions/lookup_spec.rb +85 -19
  251. data/spec/unit/functions/next_spec.rb +1 -1
  252. data/spec/unit/functions/return_spec.rb +2 -2
  253. data/spec/unit/gettext/config_spec.rb +125 -0
  254. data/spec/unit/gettext/module_loading_spec.rb +53 -0
  255. data/spec/unit/indirector/json_spec.rb +0 -11
  256. data/spec/unit/indirector/node/exec_spec.rb +1 -1
  257. data/spec/unit/info_service_spec.rb +1 -1
  258. data/spec/unit/interface_spec.rb +12 -0
  259. data/spec/unit/module_spec.rb +0 -28
  260. data/spec/unit/module_tool/tar/mini_spec.rb +34 -5
  261. data/spec/unit/network/http/factory_spec.rb +22 -0
  262. data/spec/unit/network/http/webrick_spec.rb +30 -29
  263. data/spec/unit/node/environment_spec.rb +16 -0
  264. data/spec/unit/node_spec.rb +102 -16
  265. data/spec/unit/parser/environment_compiler_spec.rb +1 -1
  266. data/spec/unit/parser/functions/sprintf_spec.rb +26 -0
  267. data/spec/unit/parser/resource/param_spec.rb +1 -1
  268. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +9 -9
  269. data/spec/unit/pops/loaders/static_loader_spec.rb +1 -1
  270. data/spec/unit/pops/parser/parse_containers_spec.rb +1 -1
  271. data/spec/unit/pops/types/type_calculator_spec.rb +40 -0
  272. data/spec/unit/pops/types/type_mismatch_describer_spec.rb +9 -0
  273. data/spec/unit/provider/selmodule_spec.rb +6 -0
  274. data/spec/unit/provider/service/init_spec.rb +1 -1
  275. data/spec/unit/provider/service/smf_spec.rb +2 -0
  276. data/spec/unit/provider/service/systemd_spec.rb +14 -0
  277. data/spec/unit/resource/catalog_spec.rb +12 -2
  278. data/spec/unit/settings/config_file_spec.rb +1 -1
  279. data/spec/unit/transaction/persistence_spec.rb +42 -0
  280. data/spec/unit/transaction/report_spec.rb +19 -4
  281. data/spec/unit/transaction_spec.rb +27 -0
  282. data/spec/unit/type/schedule_spec.rb +14 -0
  283. data/spec/unit/type_spec.rb +3 -3
  284. data/spec/unit/util/errors_spec.rb +1 -1
  285. data/spec/unit/util/http_proxy_spec.rb +37 -0
  286. data/spec/unit/util/log_spec.rb +3 -3
  287. data/spec/unit/util/logging_spec.rb +7 -7
  288. data/spec/unit/util/monkey_patches_spec.rb +6 -2
  289. metadata +3433 -3416
  290. checksums.yaml +0 -7
  291. data/spec/unit/gettext_config_spec.rb +0 -57
@@ -63,7 +63,13 @@ Puppet::Face.define(:module, '1.0.0') do
63
63
  name = name.gsub('/', '-')
64
64
 
65
65
  Puppet::ModuleTool.set_option_defaults options
66
- Puppet.notice _("Preparing to uninstall '%{name}'") % { name: name } << (options[:version] ? " (#{colorize(:cyan, options[:version].sub(/^(?=\d)/, 'v'))})" : '') << " ..."
66
+ message = if options[:version]
67
+ module_version = colorize(:cyan, options[:version].sub(/^(?=\d)/, 'v'))
68
+ _("Preparing to uninstall '%{name}' (%{module_version}) ...") % { name: name, module_version: module_version }
69
+ else
70
+ _("Preparing to uninstall '%{name}' ...") % { name: name }
71
+ end
72
+ Puppet.notice message
67
73
  Puppet::ModuleTool::Applications::Uninstaller.run(name, options)
68
74
  end
69
75
 
@@ -73,8 +79,13 @@ Puppet::Face.define(:module, '1.0.0') do
73
79
  exit 1
74
80
  else
75
81
  mod = return_value[:affected_modules].first
76
- module_version = mod.version ? " (#{colorize(:cyan, mod.version.to_s.sub(/^(?=\d)/, 'v'))})" : ''
77
- _("Removed '%{name}'%{module_version} from %{path}") % { name: return_value[:module_name], module_version: module_version, path: mod.modulepath }
82
+ message = if mod.version
83
+ module_version = colorize(:cyan, mod.version.to_s.sub(/^(?=\d)/, 'v'))
84
+ _("Removed '%{name}' (%{module_version}) from %{path}") % { name: return_value[:module_name], module_version: module_version, path: mod.modulepath }
85
+ else
86
+ _("Removed '%{name}' from %{path}") % { name: return_value[:module_name], path: mod.modulepath }
87
+ end
88
+ message
78
89
  end
79
90
  end
80
91
  end
@@ -17,6 +17,7 @@ Puppet::Indirector::Face.define(:node, '0.0.1') do
17
17
  find = get_action(:find)
18
18
  find.summary _("Retrieve a node object.")
19
19
  find.arguments _("<host>")
20
+ #TRANSLATORS the following are specific names and should not be translated `classes`, `environment`, `expiration`, `name`, `parameters`, Puppet::Node
20
21
  find.returns _(<<-'EOT')
21
22
  A hash containing the node's `classes`, `environment`, `expiration`, `name`,
22
23
  `parameters` (its facts, combined with any ENC-set parameters), and `time`.
@@ -13,6 +13,7 @@ Puppet::Indirector::Face.define(:status, '0.0.1') do
13
13
  find = get_action(:find)
14
14
  find.default = true
15
15
  find.summary _("Check status of puppet master server.")
16
+ #TRANSLATORS the string 'Puppet::Status' is a Puppet language object and should not be translated
16
17
  find.returns _(<<-'EOT')
17
18
  A "true" response or a low-level connection error. When used from the Ruby
18
19
  API: returns a Puppet::Status object.
@@ -46,7 +46,8 @@ class Puppet::FileServing::Base
46
46
  def links=(value)
47
47
  value = value.to_sym
48
48
  value = :manage if value == :ignore
49
- raise(ArgumentError, ":links can only be set to :manage or :follow") unless [:manage, :follow].include?(value)
49
+ #TRANSLATORS ':link', ':manage', ':follow' should not be translated
50
+ raise(ArgumentError, _(":links can only be set to :manage or :follow")) unless [:manage, :follow].include?(value)
50
51
  @links = value
51
52
  end
52
53
 
@@ -4,6 +4,7 @@ require 'puppet/file_serving/mount'
4
4
  require 'puppet/file_serving/mount/file'
5
5
  require 'puppet/file_serving/mount/modules'
6
6
  require 'puppet/file_serving/mount/plugins'
7
+ require 'puppet/file_serving/mount/locales'
7
8
  require 'puppet/file_serving/mount/pluginfacts'
8
9
  require 'puppet/file_serving/mount/tasks'
9
10
 
@@ -81,6 +82,8 @@ class Puppet::FileServing::Configuration
81
82
  @mounts["modules"].allow('*') if @mounts["modules"].empty?
82
83
  @mounts["plugins"] ||= Mount::Plugins.new("plugins")
83
84
  @mounts["plugins"].allow('*') if @mounts["plugins"].empty?
85
+ @mounts["locales"] ||= Mount::Locales.new("locales")
86
+ @mounts["locales"].allow('*') if @mounts["locales"].empty?
84
87
  @mounts["pluginfacts"] ||= Mount::PluginFacts.new("pluginfacts")
85
88
  @mounts["pluginfacts"].allow('*') if @mounts["pluginfacts"].empty?
86
89
  @mounts["tasks"] ||= Mount::Tasks.new("tasks")
@@ -13,9 +13,9 @@ class Puppet::FileServing::Configuration::Parser
13
13
  @mounts = {}
14
14
  @count = 0
15
15
 
16
- File.open(@file) { |f|
16
+ File.open(@file) do |f|
17
17
  mount = nil
18
- f.each_line { |line|
18
+ f.each_line do |line|
19
19
  # Have the count increment at the top, in case we throw exceptions.
20
20
  @count += 1
21
21
 
@@ -37,13 +37,17 @@ class Puppet::FileServing::Configuration::Parser
37
37
  when "deny"
38
38
  deny(mount, value)
39
39
  else
40
- raise ArgumentError.new(_("Invalid argument '%{var}' in %{file}, line %{line_num}") % { var: var, file: @file.filename, line_num: @count })
40
+ error_location_str = Puppet::Util::Errors.error_location(@file.filename, @count)
41
+ raise ArgumentError.new(_("Invalid argument '%{var}' at %{error_location}") %
42
+ { var: var, error_location: error_location_str })
41
43
  end
42
44
  else
43
- raise ArgumentError.new(_("Invalid line '%{line}' at %{file}, line %{line_num}") % { line: line.chomp, file: @file.filename, line_num: @count })
45
+ error_location_str = Puppet::Util::Errors.error_location(@file.filename, @count)
46
+ raise ArgumentError.new(_("Invalid entry at %{error_location}: '%{file_text}'") %
47
+ { file_text: line.chomp, error_location: error_location_str })
44
48
  end
45
- }
46
- }
49
+ end
50
+ end
47
51
 
48
52
  validate
49
53
 
@@ -67,7 +71,9 @@ class Puppet::FileServing::Configuration::Parser
67
71
  mount.info _("allowing %{val} access") % { val: val }
68
72
  mount.allow(val)
69
73
  rescue Puppet::AuthStoreError => detail
70
- raise ArgumentError.new(_("%{detail} in %{file}, line %{line_num}") % { detail: detail.to_s, file: @file, line_num: @count })
74
+ error_location_str = Puppet::Util::Errors.error_location(@file, @count)
75
+ raise ArgumentError.new("%{detail} %{error_location}" %
76
+ { detail: detail.to_s, error_location: error_location_str })
71
77
  end
72
78
  }
73
79
  end
@@ -79,14 +85,20 @@ class Puppet::FileServing::Configuration::Parser
79
85
  mount.info _("denying %{val} access") % { val: val }
80
86
  mount.deny(val)
81
87
  rescue Puppet::AuthStoreError => detail
82
- raise ArgumentError.new(_("%{detail} in %{file}, line %{line_num}") % { detail: detail.to_s, file: @file, line_num: @count })
88
+ error_location_str = Puppet::Util::Errors.error_location(@file, @count)
89
+ raise ArgumentError.new("%{detail} %{error_location}" %
90
+ { detail: detail.to_s, error_location: error_location_str })
83
91
  end
84
92
  }
85
93
  end
86
94
 
87
95
  # Create a new mount.
88
96
  def newmount(name)
89
- raise ArgumentError.new(_("%{mount} is already mounted at %{name} in %{file}, line %{line_num}") % { mount: @mounts[name], name: name, file: @file, line_num: @count }) if @mounts.include?(name)
97
+ if @mounts.include?(name)
98
+ error_location_str = Puppet::Util::Errors.error_location(@file, @count)
99
+ raise ArgumentError.new(_("%{mount} is already mounted at %{name} at %{error_location}") %
100
+ { mount: @mounts[name], name: name, error_location: error_location_str })
101
+ end
90
102
  case name
91
103
  when "modules"
92
104
  mount = Mount::Modules.new(name)
@@ -94,6 +106,8 @@ class Puppet::FileServing::Configuration::Parser
94
106
  mount = Mount::Plugins.new(name)
95
107
  when "tasks"
96
108
  mount = Mount::Tasks.new(name)
109
+ when "locales"
110
+ mount = Mount::Locales.new(name)
97
111
  else
98
112
  mount = Mount::File.new(name)
99
113
  end
@@ -0,0 +1,35 @@
1
+ require 'puppet/file_serving/mount'
2
+
3
+ # Find files in the modules' locales directories.
4
+ # This is a very strange mount because it merges
5
+ # many directories into one.
6
+ class Puppet::FileServing::Mount::Locales < Puppet::FileServing::Mount
7
+ # Return an instance of the appropriate class.
8
+ def find(relative_path, request)
9
+ return nil unless mod = request.environment.modules.find { |m| m.locale(relative_path) }
10
+
11
+ path = mod.locale(relative_path)
12
+
13
+ path
14
+ end
15
+
16
+ def search(relative_path, request)
17
+ # We currently only support one kind of search on locales - return
18
+ # them all.
19
+ Puppet.debug("Warning: calling Locales.search with empty module path.") if request.environment.modules.empty?
20
+ paths = request.environment.modules.find_all { |mod| mod.locales? }.collect { |mod| mod.locale_directory }
21
+ if paths.empty?
22
+ # If the modulepath is valid then we still need to return a valid root
23
+ # directory for the search, but make sure nothing inside it is
24
+ # returned.
25
+ request.options[:recurse] = false
26
+ request.environment.modulepath.empty? ? nil : request.environment.modulepath
27
+ else
28
+ paths
29
+ end
30
+ end
31
+
32
+ def valid?
33
+ true
34
+ end
35
+ end
@@ -134,7 +134,8 @@ class Puppet::Forge < SemanticPuppet::Dependency::Source
134
134
  Puppet::ModuleTool::Metadata.new.add_dependency(dep['name'], dep['version_requirement'], dep['repository'])
135
135
  Puppet::ModuleTool.parse_module_dependency(release, dep, strict_semver)[0..1]
136
136
  rescue ArgumentError => e
137
- raise ArgumentError, "Malformed dependency: #{dep['name']}. Exception was: #{e}"
137
+ raise ArgumentError, _("Malformed dependency: %{name}.") % { name: dep['name'] } +
138
+ ' ' + _("Exception was: %{detail}") % { detail: e }
138
139
  end
139
140
  end
140
141
  else
@@ -32,12 +32,12 @@ module Puppet::Forge::Errors
32
32
  #
33
33
  # @return [String] the multiline version of the error message
34
34
  def multiline
35
- _(<<-EOS).chomp % { uri: @uri }
36
- Could not connect via HTTPS to %{uri}
37
- Unable to verify the SSL certificate
38
- The certificate may not be signed by a valid CA
39
- The CA bundle included with OpenSSL may not be valid or up to date
40
- EOS
35
+ message = []
36
+ message << _('Could not connect via HTTPS to %{uri}') % { uri: @uri }
37
+ message << _(' Unable to verify the SSL certificate')
38
+ message << _(' The certificate may not be signed by a valid CA')
39
+ message << _(' The CA bundle included with OpenSSL may not be valid or up to date')
40
+ message.join("\n")
41
41
  end
42
42
  end
43
43
 
@@ -59,12 +59,12 @@ Could not connect via HTTPS to %{uri}
59
59
  #
60
60
  # @return [String] the multiline version of the error message
61
61
  def multiline
62
- _(<<-EOS).chomp % { uri: @uri, detail: @detail }
63
- Could not connect to %{uri}
64
- There was a network communications problem
65
- The error we caught said '%{detail}'
66
- Check your network connection and try again
67
- EOS
62
+ message = []
63
+ message << _('Could not connect to %{uri}') % { uri: @uri }
64
+ message << _(' There was a network communications problem')
65
+ message << _(" The error we caught said '%{detail}'") % { detail: @detail }
66
+ message << _(' Check your network connection and try again')
67
+ message.join("\n")
68
68
  end
69
69
  end
70
70
 
@@ -89,9 +89,11 @@ Could not connect to %{uri}
89
89
  rescue JSON::ParserError
90
90
  end
91
91
 
92
- message = _("Request to Puppet Forge failed. Detail: ")
93
- message << @message << " / " if @message
94
- message << @response << "."
92
+ message = if @message
93
+ _("Request to Puppet Forge failed.") + ' ' + _("Detail: %{detail}.") % { detail: "#{@message} / #{@response}" }
94
+ else
95
+ _("Request to Puppet Forge failed.") + ' ' + _("Detail: %{detail}.") % { detail: @response }
96
+ end
95
97
  super(message, original)
96
98
  end
97
99
 
@@ -99,13 +101,13 @@ Could not connect to %{uri}
99
101
  #
100
102
  # @return [String] the multiline version of the error message
101
103
  def multiline
102
- message = _(<<-EOS).chomp % { uri: @uri, response: @response }
103
- Request to Puppet Forge failed.
104
- The server being queried was %{uri}
105
- The HTTP response we received was '%{response}'
106
- EOS
107
- message << _("\n The message we received said '%{message}'") % { message: @message } if @message
108
- message
104
+
105
+ message = []
106
+ message << _('Request to Puppet Forge failed.')
107
+ message << _(' The server being queried was %{uri}') % { uri: @uri }
108
+ message << _(" The HTTP response we received was '%{response}'") % { response: @response }
109
+ message << _(" The message we received said '%{message}'") % { message: @message } if @message
110
+ message.join("\n")
109
111
  end
110
112
  end
111
113
 
@@ -12,6 +12,7 @@ Puppet::Functions.create_function(:binary_file, Puppet::Functions::InternalFunct
12
12
  def binary_file(scope, unresolved_path)
13
13
  path = Puppet::Parser::Files.find_file(unresolved_path, scope.compiler.environment)
14
14
  unless path && Puppet::FileSystem.exist?(path)
15
+ #TRANSLATORS the string "binary_file()" should not be translated
15
16
  raise Puppet::ParseError, _("binary_file(): The given file '%{unresolved_path}' does not exist") % { unresolved_path: unresolved_path }
16
17
  end
17
18
  Puppet::Pops::Types::PBinaryType::Binary.from_binary_string(Puppet::FileSystem.binread(path))
@@ -117,8 +117,11 @@ Puppet::Functions.create_function(:each) do
117
117
 
118
118
  def foreach_Hash_1(hash)
119
119
  enumerator = hash.each_pair
120
- hash.size.times do
121
- yield(enumerator.next)
120
+ begin
121
+ hash.size.times do
122
+ yield(enumerator.next)
123
+ end
124
+ rescue StopIteration
122
125
  end
123
126
  # produces the receiver
124
127
  hash
@@ -126,8 +129,11 @@ Puppet::Functions.create_function(:each) do
126
129
 
127
130
  def foreach_Hash_2(hash)
128
131
  enumerator = hash.each_pair
129
- hash.size.times do
130
- yield(*enumerator.next)
132
+ begin
133
+ hash.size.times do
134
+ yield(*enumerator.next)
135
+ end
136
+ rescue StopIteration
131
137
  end
132
138
  # produces the receiver
133
139
  hash
@@ -26,8 +26,10 @@ Puppet::Functions.create_function(:eyaml_lookup_key) do
26
26
  # Can't do this with an argument_mismatch dispatcher since there is no way to declare a struct that at least
27
27
  # contains some keys but may contain other arbitrary keys.
28
28
  unless options.include?('path')
29
+ #TRANSLATORS 'eyaml_lookup_key':, 'path', 'paths' 'glob', 'globs', 'mapped_paths', and lookup_key should not be translated
29
30
  raise ArgumentError,
30
- "'eyaml_lookup_key': one of 'path', 'paths' 'glob', 'globs' or 'mapped_paths' must be declared in hiera.yaml when using this lookup_key function"
31
+ _("'eyaml_lookup_key': one of 'path', 'paths' 'glob', 'globs' or 'mapped_paths' must be declared in hiera.yaml"\
32
+ " when using this lookup_key function")
31
33
  end
32
34
 
33
35
  # nil key is used to indicate that the cache contains the raw content of the eyaml file
@@ -48,7 +50,7 @@ Puppet::Functions.create_function(:eyaml_lookup_key) do
48
50
  if data.is_a?(Hash)
49
51
  Puppet::Pops::Lookup::HieraConfig.symkeys_to_string(data)
50
52
  else
51
- Puppet.warning("#{path}: file does not contain a valid yaml hash")
53
+ Puppet.warning(_("%{path}: file does not contain a valid yaml hash") % { path: path })
52
54
  {}
53
55
  end
54
56
  rescue YAML::SyntaxError => ex
@@ -91,8 +91,8 @@
91
91
  # merged hash. If the same key exists in multiple source hashes, Puppet will
92
92
  # recursively merge hash or array values (with duplicate values removed from
93
93
  # arrays). For conflicting scalar values, the highest-priority value will win.
94
- # * `{'strategy' => 'first|unique|hash'}` --- Same as the string versions of these
95
- # merge behaviors.
94
+ # * `{'strategy' => 'first'}`, `{'strategy' => 'unique'}`,
95
+ # or `{'strategy' => 'hash'}` --- Same as the string versions of these merge behaviors.
96
96
  # * `{'strategy' => 'deep', <DEEP OPTION> => <VALUE>, ...}` --- Same as `'deep'`,
97
97
  # but can adjust the merge with additional options. The available options are:
98
98
  # * `'knockout_prefix'` (string or undef) --- A string prefix to indicate a
@@ -88,11 +88,21 @@ Puppet::Functions.create_function(:map) do
88
88
  end
89
89
 
90
90
  def map_Hash_1(hash)
91
- hash.map {|x, y| yield([x, y]) }
91
+ result = []
92
+ begin
93
+ hash.map {|x, y| result << yield([x, y]) }
94
+ rescue StopIteration
95
+ end
96
+ result
92
97
  end
93
98
 
94
99
  def map_Hash_2(hash)
95
- hash.map {|x, y| yield(x, y) }
100
+ result = []
101
+ begin
102
+ hash.map {|x, y| result << yield(x, y) }
103
+ rescue StopIteration
104
+ end
105
+ result
96
106
  end
97
107
 
98
108
  def map_Enumerable_1(enumerable)
@@ -102,9 +102,8 @@ Puppet::Functions.create_function(:slice) do
102
102
  raise ArgumentError, _("slice(): block must define at least one parameter. Block has 0.")
103
103
  end
104
104
  unless serving_size == 1 || serving_size == slice_size
105
- raise ArgumentError, _("slice(): block must define one parameter, or ") +
106
- _("the same number of parameters as the given size of the slice (%{slice_size}). Block has %{serving_size}; ") % { slice_size: slice_size, serving_size: serving_size }+
107
- pblock.parameter_names.join(', ')
105
+ raise ArgumentError, _("slice(): block must define one parameter, or the same number of parameters as the given size of the slice (%{slice_size}). Block has %{serving_size}; %{parameter_names}") %
106
+ { slice_size: slice_size, serving_size: serving_size, parameter_names: pblock.parameter_names.join(', ') }
108
107
  end
109
108
  serving_size
110
109
  end
@@ -70,7 +70,7 @@
70
70
  #
71
71
  # @example turning a string or array into a hash with index keys
72
72
  #
73
- # ~~puppet
73
+ # ~~~puppet
74
74
  # # Array ['a', 'b', 'c'] to Hash with index results in
75
75
  # # {0 => 'a', 1 => 'b', 2 => 'c'}
76
76
  # Hash(['a', 'b', 'c'].map |$i, $v| { [$i, $v]})
@@ -25,7 +25,7 @@ Puppet::Functions.create_function(:yaml_data) do
25
25
  if data.is_a?(Hash)
26
26
  Puppet::Pops::Lookup::HieraConfig.symkeys_to_string(data)
27
27
  else
28
- Puppet.warning("#{path}: file does not contain a valid yaml hash")
28
+ Puppet.warning(_("%{path}: file does not contain a valid yaml hash" % { path: path }))
29
29
  {}
30
30
  end
31
31
  rescue YAML::SyntaxError => ex
@@ -6,9 +6,10 @@ module Puppet::GettextConfig
6
6
  POSIX_PATH = File.absolute_path('../../../../../share/locale', File.dirname(__FILE__))
7
7
  WINDOWS_PATH = File.absolute_path('../../../../../../../puppet/share/locale', File.dirname(__FILE__))
8
8
 
9
+ DEFAULT_TEXT_DOMAIN = 'default-text-domain'
10
+
9
11
  # Load gettext helpers and track whether they're available.
10
12
  # Used instead of features because we initialize gettext before features is available.
11
- # Stubbing gettext if unavailable is handled in puppet.rb.
12
13
  begin
13
14
  require 'fast_gettext'
14
15
  require 'locale'
@@ -34,33 +35,128 @@ module Puppet::GettextConfig
34
35
  end
35
36
 
36
37
  # @api private
37
- # Whether translations have been loaded for a given project
38
- # @param project_name [String] the project whose translations we are querying
39
- # @return [Boolean] true if translations have been loaded for the project
40
- def self.translations_loaded?(project_name)
41
- return false unless gettext_loaded?
42
- if @loaded_repositories[project_name]
43
- return true
38
+ # Returns the currently selected locale from FastGettext,
39
+ # or 'en' of gettext has not been loaded
40
+ # @return [String] the active locale
41
+ def self.current_locale
42
+ if gettext_loaded?
43
+ return FastGettext.default_locale
44
44
  else
45
- return false
45
+ return 'en'
46
46
  end
47
47
  end
48
48
 
49
49
  # @api private
50
- # Creates a new empty text domain with the given name, replacing
51
- # any existing domain with that name, then switches to using
52
- # that domain. Also clears the cache of loaded translations.
53
- # @param domain_name [String] the name of the domain to create
54
- def self.create_text_domain(domain_name)
55
- return unless gettext_loaded?
56
- # Clear the cache of loaded translation repositories
57
- @loaded_repositories = {}
58
- FastGettext.add_text_domain(domain_name, type: :chain, chain: [])
59
- #TODO remove this when we start managing domains per environment
60
- FastGettext.default_text_domain = domain_name
50
+ # Returns a list of the names of the loaded text domains
51
+ # @return [[String]] the names of the loaded text domains
52
+ def self.loaded_text_domains
53
+ return [] if @gettext_disabled || !gettext_loaded?
54
+
55
+ return FastGettext.translation_repositories.keys
56
+ end
57
+
58
+ # @api private
59
+ # Clears the translation repository for the given text domain,
60
+ # creating it if it doesn't exist, then adds default translations
61
+ # and switches to using this domain.
62
+ # @param [String] domain_name the name of the domain to create
63
+ def self.reset_text_domain(domain_name)
64
+ return if @gettext_disabled || !gettext_loaded?
65
+
66
+ FastGettext.add_text_domain(domain_name,
67
+ type: :chain,
68
+ chain: [],
69
+ report_warning: false)
70
+ copy_default_translations(domain_name)
61
71
  FastGettext.text_domain = domain_name
62
72
  end
63
73
 
74
+ # @api private
75
+ # Creates a default text domain containing the translations for
76
+ # Puppet as the start of chain. When semantic_puppet gets initialized,
77
+ # its translations are added to this chain. This is used as a cache
78
+ # so that all non-module translations only need to be loaded once as
79
+ # we create and reset environment-specific text domains.
80
+ #
81
+ # @return true if Puppet translations were successfully loaded, false
82
+ # otherwise
83
+ def self.create_default_text_domain
84
+ return if @gettext_disabled || !gettext_loaded?
85
+
86
+ FastGettext.add_text_domain(DEFAULT_TEXT_DOMAIN,
87
+ type: :chain,
88
+ chain: [],
89
+ report_warning: false)
90
+ FastGettext.default_text_domain = DEFAULT_TEXT_DOMAIN
91
+
92
+ load_translations('puppet', puppet_locale_path, translation_mode(puppet_locale_path), DEFAULT_TEXT_DOMAIN)
93
+ end
94
+
95
+ # @api private
96
+ # Switches the active text domain, if the requested domain exists.
97
+ # @param [String] domain_name the name of the domain to switch to
98
+ def self.use_text_domain(domain_name)
99
+ return if @gettext_disabled || !gettext_loaded?
100
+
101
+ if FastGettext.translation_repositories.include?(domain_name)
102
+ FastGettext.text_domain = domain_name
103
+ end
104
+ end
105
+
106
+ # @api private
107
+ # Delete all text domains.
108
+ def self.delete_all_text_domains
109
+ FastGettext.translation_repositories.clear
110
+ FastGettext.default_text_domain = nil
111
+ FastGettext.text_domain = nil
112
+ end
113
+
114
+ # @api private
115
+ # Deletes the text domain with the given name
116
+ # @param [String] domain_name the name of the domain to delete
117
+ def self.delete_text_domain(domain_name)
118
+ return if @gettext_disabled || !gettext_loaded?
119
+
120
+ FastGettext.translation_repositories.delete(domain_name)
121
+ if FastGettext.text_domain == domain_name
122
+ FastGettext.text_domain = nil
123
+ end
124
+ end
125
+
126
+ # @api private
127
+ # Deletes all text domains except the default one
128
+ def self.delete_environment_text_domains
129
+ return if @gettext_disabled || !gettext_loaded?
130
+
131
+ FastGettext.translation_repositories.keys.each do |key|
132
+ # do not clear default translations
133
+ next if key == DEFAULT_TEXT_DOMAIN
134
+
135
+ FastGettext.translation_repositories.delete(key)
136
+ end
137
+ FastGettext.text_domain = nil
138
+ end
139
+
140
+ # @api private
141
+ # Adds translations from the default text domain to the specified
142
+ # text domain. Creates the default text domain if one does not exist
143
+ # (this will load Puppet's translations).
144
+ #
145
+ # Since we are currently (Nov 2017) vendoring semantic_puppet, in normal
146
+ # flows these translations will be copied along with Puppet's.
147
+ #
148
+ # @param [String] domain_name the name of the domain to add translations to
149
+ def self.copy_default_translations(domain_name)
150
+ return if @gettext_disabled || !gettext_loaded?
151
+
152
+ if FastGettext.default_text_domain.nil?
153
+ create_default_text_domain
154
+ end
155
+
156
+ puppet_translations = FastGettext.translation_repositories[FastGettext.default_text_domain].chain
157
+ FastGettext.translation_repositories[domain_name].chain.push(*puppet_translations)
158
+ end
159
+
64
160
  # @api private
65
161
  # Search for puppet gettext config files
66
162
  # @return [String] path to the config, or nil if not found
@@ -78,7 +174,7 @@ module Puppet::GettextConfig
78
174
 
79
175
  # @api private
80
176
  # Determine which translation file format to use
81
- # @param conf_path [String] the path to the gettext config file
177
+ # @param [String] conf_path the path to the gettext config file
82
178
  # @return [Symbol] :mo if in a package structure, :po otherwise
83
179
  def self.translation_mode(conf_path)
84
180
  if WINDOWS_PATH == conf_path || POSIX_PATH == conf_path
@@ -96,11 +192,15 @@ module Puppet::GettextConfig
96
192
 
97
193
  # @api private
98
194
  # Attempt to load tranlstions for the given project.
99
- # @param project_name [String] the project whose translations we want to load
100
- # @param locale_dir [String] the path to the directory containing translations
101
- # @param file_format [Symbol] translation file format to use, either :po or :mo
195
+ # @param [String] project_name the project whose translations we want to load
196
+ # @param [String] locale_dir the path to the directory containing translations
197
+ # @param [Symbol] file_format translation file format to use, either :po or :mo
102
198
  # @return true if initialization succeeded, false otherwise
103
- def self.load_translations(project_name, locale_dir, file_format)
199
+ def self.load_translations(project_name, locale_dir, file_format, text_domain = FastGettext.text_domain)
200
+ if project_name.nil? || project_name.empty?
201
+ raise Puppet::Error, "A project name must be specified in order to initialize translations."
202
+ end
203
+
104
204
  return false if @gettext_disabled || !@gettext_loaded
105
205
 
106
206
  return false unless locale_dir && Puppet::FileSystem.exist?(locale_dir)
@@ -109,38 +209,41 @@ module Puppet::GettextConfig
109
209
  raise Puppet::Error, "Unsupported translation file format #{file_format}; please use :po or :mo"
110
210
  end
111
211
 
112
- if project_name.nil? || project_name.empty?
113
- raise Puppet::Error, "A project name must be specified in order to initialize translations."
114
- end
115
-
116
- add_repository_to_domain(project_name, locale_dir, file_format)
212
+ add_repository_to_domain(project_name, locale_dir, file_format, text_domain)
117
213
  return true
118
214
  end
119
215
 
120
216
  # @api private
121
217
  # Add the translations for this project to the domain's repository chain
122
218
  # chain for the currently selected text domain, if needed.
123
- # @param project_name [String] the name of the project for which to load translations
124
- # @param locale_dir [String] the path to the directory containing translations
125
- # @param file_format [Symbol] the fomat of the translations files, :po or :mo
126
- def self.add_repository_to_domain(project_name, locale_dir, file_format)
127
- # check if we've already loaded these transltaions
128
- current_chain = FastGettext.translation_repositories[FastGettext.text_domain].chain
129
- return current_chain if @loaded_repositories[project_name]
219
+ # @param [String] project_name the name of the project for which to load translations
220
+ # @param [String] locale_dir the path to the directory containing translations
221
+ # @param [Symbol] file_format the fomat of the translations files, :po or :mo
222
+ def self.add_repository_to_domain(project_name, locale_dir, file_format, text_domain = FastGettext.text_domain)
223
+ return if @gettext_disabled || !gettext_loaded?
224
+
225
+ current_chain = FastGettext.translation_repositories[text_domain].chain
130
226
 
131
227
  repository = FastGettext::TranslationRepository.build(project_name,
132
228
  path: locale_dir,
133
229
  type: file_format,
134
- ignore_fuzzy: false)
135
- @loaded_repositories[project_name] = true
230
+ report_warning: false)
136
231
  current_chain << repository
137
232
  end
138
233
 
234
+ # @api private
235
+ # Sets FastGettext's locale to the current system locale
236
+ def self.setup_locale
237
+ return if @gettext_disabled || !gettext_loaded?
238
+
239
+ set_locale(Locale.current.language)
240
+ end
241
+
139
242
  # @api private
140
243
  # Sets the language in which to display strings.
141
- # @param locale [String] the language portion of a locale string (e.g. "ja")
244
+ # @param [String] locale the language portion of a locale string (e.g. "ja")
142
245
  def self.set_locale(locale)
143
- return if !gettext_loaded?
246
+ return if @gettext_disabled || !gettext_loaded?
144
247
  # make sure we're not using the `available_locales` machinery
145
248
  FastGettext.default_available_locales = nil
146
249