Permalink
Browse files

Merge pull request #174 from korny/dont-modify-options-hash

Fix #158: never modify the given options hash
  • Loading branch information...
2 parents 18ac029 + 3627280 commit d9dbe2e87eaa5003d03c04edb879244e3e344ed3 @knapo knapo committed Dec 5, 2012
Showing with 18 additions and 3 deletions.
  1. +4 −3 lib/i18n.rb
  2. +7 −0 lib/i18n/tests/localization/date.rb
  3. +7 −0 lib/i18n/tests/lookup.rb
View
@@ -141,7 +141,7 @@ def reload!
# always return the same translations/values per unique combination of argument
# values.
def translate(*args)
- options = args.last.is_a?(Hash) ? args.pop : {}
+ options = args.last.is_a?(Hash) ? args.pop.dup : {}
key = args.shift
backend = config.backend
locale = options.delete(:locale) || config.locale
@@ -219,7 +219,7 @@ def translate!(key, options={})
# I18n.transliterate("Jürgen", :locale => :en) # => "Jurgen"
# I18n.transliterate("Jürgen", :locale => :de) # => "Juergen"
def transliterate(*args)
- options = args.pop if args.last.is_a?(Hash)
+ options = args.pop.dup if args.last.is_a?(Hash)
key = args.shift
locale = options && options.delete(:locale) || config.locale
handling = options && (options.delete(:throw) && :throw || options.delete(:raise) && :raise)
@@ -230,7 +230,8 @@ def transliterate(*args)
end
# Localizes certain objects, such as dates and numbers to local formatting.
- def localize(object, options = {})
+ def localize(object, options = nil)
+ options = options ? options.dup : {}
locale = options.delete(:locale) || config.locale
format = options.delete(:format) || :default
config.backend.localize(locale, object, format, options)
@@ -44,6 +44,13 @@ def setup
assert_nothing_raised { I18n.l(@date, :format => '%x') }
end
+ test "localize Date: does not modify the options hash" do
+ options = { :format => '%b', :locale => :de }
+ assert_equal 'Mar', I18n.l(@date, options)
+ assert_equal({ :format => '%b', :locale => :de }, options)
+ assert_nothing_raised { I18n.l(@date, options.freeze) }
+ end
+
test "localize Date: given nil it raises I18n::ArgumentError" do
assert_raise(I18n::ArgumentError) { I18n.l(nil) }
end
View
@@ -41,6 +41,13 @@ def setup
assert_nothing_raised { I18n.t(:foo, :locale => :xx) }
end
+ test "lookup: does not modify the options hash" do
+ options = {}
+ assert_equal "a", I18n.t(:string, options)
+ assert_equal({}, options)
+ assert_nothing_raised { I18n.t(:string, options.freeze) }
+ end
+
test "lookup: given an array of keys it translates all of them" do
assert_equal %w(bar baz), I18n.t([:bar, :baz], :scope => [:foo])
end

0 comments on commit d9dbe2e

Please sign in to comment.