Skip to content

Commit

Permalink
deprecate String#encoding_aware? and remove its usage
Browse files Browse the repository at this point in the history
  • Loading branch information
lest committed Dec 24, 2011
1 parent a5fa310 commit 5ca86ac
Show file tree
Hide file tree
Showing 25 changed files with 113 additions and 164 deletions.
13 changes: 5 additions & 8 deletions actionmailer/test/abstract_unit.rb
Expand Up @@ -13,14 +13,11 @@

require 'active_support/core_ext/kernel/reporting'

require 'active_support/core_ext/string/encoding'
if "ruby".encoding_aware?
# These are the normal settings that will be set up by Railties
# TODO: Have these tests support other combinations of these values
silence_warnings do
Encoding.default_internal = "UTF-8"
Encoding.default_external = "UTF-8"
end
# These are the normal settings that will be set up by Railties
# TODO: Have these tests support other combinations of these values
silence_warnings do
Encoding.default_internal = "UTF-8"
Encoding.default_external = "UTF-8"
end

lib = File.expand_path("#{File.dirname(__FILE__)}/../lib")
Expand Down
Expand Up @@ -23,7 +23,7 @@ class Tokenizer #:nodoc:

# Create a new Tokenizer for the given text.
def initialize(text)
text.encode! if text.encoding_aware?
text.encode!
@scanner = StringScanner.new(text)
@position = 0
@line = 0
Expand Down
2 changes: 0 additions & 2 deletions actionpack/lib/action_dispatch/http/parameters.rb
Expand Up @@ -41,8 +41,6 @@ def path_parameters
# you'll get a weird error down the road, but our form handling
# should really prevent that from happening
def encode_params(params)
return params unless "ruby".encoding_aware?

if params.is_a?(String)
return params.force_encoding("UTF-8").encode!
elsif !params.is_a?(Hash)
Expand Down
4 changes: 2 additions & 2 deletions actionpack/lib/action_dispatch/http/upload.rb
Expand Up @@ -22,8 +22,8 @@ def read(*args)

private
def encode_filename(filename)
# Encode the filename in the utf8 encoding, unless it is nil or we're in 1.8
if "ruby".encoding_aware? && filename
# Encode the filename in the utf8 encoding, unless it is nil
if filename
filename.force_encoding("UTF-8").encode!
else
filename
Expand Down
2 changes: 1 addition & 1 deletion actionpack/lib/action_dispatch/routing/route_set.rb
Expand Up @@ -584,7 +584,7 @@ def recognize_path(path, environment = {})
@router.recognize(req) do |route, matches, params|
params.each do |key, value|
if value.is_a?(String)
value = value.dup.force_encoding(Encoding::BINARY) if value.encoding_aware?
value = value.dup.force_encoding(Encoding::BINARY)
params[key] = URI.parser.unescape(value)
end
end
Expand Down
2 changes: 1 addition & 1 deletion actionpack/lib/action_view/buffers.rb
Expand Up @@ -4,7 +4,7 @@ module ActionView
class OutputBuffer < ActiveSupport::SafeBuffer #:nodoc:
def initialize(*)
super
encode! if encoding_aware?
encode!
end

def <<(value)
Expand Down
6 changes: 1 addition & 5 deletions actionpack/lib/action_view/helpers/javascript_helper.rb
Expand Up @@ -14,11 +14,7 @@ module JavaScriptHelper
"'" => "\\'"
}

if "ruby".encoding_aware?
JS_ESCAPE_MAP["\342\200\250".force_encoding('UTF-8').encode!] = '&#x2028;'
else
JS_ESCAPE_MAP["\342\200\250"] = '&#x2028;'
end
JS_ESCAPE_MAP["\342\200\250".force_encoding('UTF-8').encode!] = '&#x2028;'

# Escapes carriage returns and single and double quotes for JavaScript segments.
#
Expand Down
24 changes: 11 additions & 13 deletions actionpack/lib/action_view/template.rb
Expand Up @@ -184,7 +184,7 @@ def inspect
# before passing the source on to the template engine, leaving a
# blank line in its stead.
def encode!
return unless source.encoding_aware? && source.encoding == Encoding::BINARY
return unless source.encoding == Encoding::BINARY

# Look for # encoding: *. If we find one, we'll encode the
# String in that encoding, otherwise, we'll use the
Expand Down Expand Up @@ -265,20 +265,18 @@ def #{method_name}(local_assigns, output_buffer)
end
end_src

if source.encoding_aware?
# Make sure the source is in the encoding of the returned code
source.force_encoding(code.encoding)
# Make sure the source is in the encoding of the returned code
source.force_encoding(code.encoding)

# In case we get back a String from a handler that is not in
# BINARY or the default_internal, encode it to the default_internal
source.encode!
# In case we get back a String from a handler that is not in
# BINARY or the default_internal, encode it to the default_internal
source.encode!

# Now, validate that the source we got back from the template
# handler is valid in the default_internal. This is for handlers
# that handle encoding but screw up
unless source.valid_encoding?
raise WrongEncodingError.new(@source, Encoding.default_internal)
end
# Now, validate that the source we got back from the template
# handler is valid in the default_internal. This is for handlers
# that handle encoding but screw up
unless source.valid_encoding?
raise WrongEncodingError.new(@source, Encoding.default_internal)
end

begin
Expand Down
24 changes: 10 additions & 14 deletions actionpack/lib/action_view/template/handlers/erb.rb
Expand Up @@ -67,23 +67,19 @@ def handles_encoding?
end

def call(template)
if template.source.encoding_aware?
# First, convert to BINARY, so in case the encoding is
# wrong, we can still find an encoding tag
# (<%# encoding %>) inside the String using a regular
# expression
template_source = template.source.dup.force_encoding("BINARY")
# First, convert to BINARY, so in case the encoding is
# wrong, we can still find an encoding tag
# (<%# encoding %>) inside the String using a regular
# expression
template_source = template.source.dup.force_encoding("BINARY")

erb = template_source.gsub(ENCODING_TAG, '')
encoding = $2
erb = template_source.gsub(ENCODING_TAG, '')
encoding = $2

erb.force_encoding valid_encoding(template.source.dup, encoding)
erb.force_encoding valid_encoding(template.source.dup, encoding)

# Always make sure we return a String in the default_internal
erb.encode!
else
erb = template.source.dup
end
# Always make sure we return a String in the default_internal
erb.encode!

self.class.erb_implementation.new(
erb,
Expand Down
13 changes: 5 additions & 8 deletions actionpack/test/abstract_unit.rb
Expand Up @@ -14,14 +14,11 @@

require 'active_support/core_ext/kernel/reporting'

require 'active_support/core_ext/string/encoding'
if "ruby".encoding_aware?
# These are the normal settings that will be set up by Railties
# TODO: Have these tests support other combinations of these values
silence_warnings do
Encoding.default_internal = "UTF-8"
Encoding.default_external = "UTF-8"
end
# These are the normal settings that will be set up by Railties
# TODO: Have these tests support other combinations of these values
silence_warnings do
Encoding.default_internal = "UTF-8"
Encoding.default_external = "UTF-8"
end

require 'test/unit'
Expand Down
Expand Up @@ -146,8 +146,6 @@ def assert_parses(expected, actual)
end

def assert_utf8(object)
return unless "ruby".encoding_aware?

correct_encoding = Encoding.default_internal

unless object.is_a?(Hash)
Expand Down
3 changes: 0 additions & 3 deletions actionpack/test/dispatch/response_test.rb
Expand Up @@ -6,9 +6,6 @@ def setup
end

def test_response_body_encoding
# FIXME: remove this conditional on Rails 4.0
return unless "<3".encoding_aware?

body = ["hello".encode('utf-8')]
response = ActionDispatch::Response.new 200, {}, body
assert_equal Encoding::UTF_8, response.body.encoding
Expand Down
8 changes: 3 additions & 5 deletions actionpack/test/dispatch/uploaded_file_test.rb
Expand Up @@ -13,11 +13,9 @@ def test_original_filename
assert_equal 'foo', uf.original_filename
end

if "ruby".encoding_aware?
def test_filename_should_be_in_utf_8
uf = Http::UploadedFile.new(:filename => 'foo', :tempfile => Object.new)
assert_equal "UTF-8", uf.original_filename.encoding.to_s
end
def test_filename_should_be_in_utf_8
uf = Http::UploadedFile.new(:filename => 'foo', :tempfile => Object.new)
assert_equal "UTF-8", uf.original_filename.encoding.to_s
end

def test_content_type
Expand Down
6 changes: 1 addition & 5 deletions actionpack/test/template/javascript_helper_test.rb
Expand Up @@ -28,11 +28,7 @@ def test_escape_javascript
assert_equal %(This \\"thing\\" is really\\n netos\\'), escape_javascript(%(This "thing" is really\n netos'))
assert_equal %(backslash\\\\test), escape_javascript( %(backslash\\test) )
assert_equal %(dont <\\/close> tags), escape_javascript(%(dont </close> tags))
if "ruby".encoding_aware?
assert_equal %(unicode &#x2028; newline), escape_javascript(%(unicode \342\200\250 newline).force_encoding('UTF-8').encode!)
else
assert_equal %(unicode &#x2028; newline), escape_javascript(%(unicode \342\200\250 newline))
end
assert_equal %(unicode &#x2028; newline), escape_javascript(%(unicode \342\200\250 newline).force_encoding('UTF-8').encode!)
assert_equal %(dont <\\/close> tags), j(%(dont </close> tags))
end

Expand Down
98 changes: 48 additions & 50 deletions actionpack/test/template/template_test.rb
Expand Up @@ -114,67 +114,65 @@ def test_refresh_raises_an_error_without_virtual_path
end
end

if "ruby".encoding_aware?
def test_resulting_string_is_utf8
@template = new_template
assert_equal Encoding::UTF_8, render.encoding
end
def test_resulting_string_is_utf8
@template = new_template
assert_equal Encoding::UTF_8, render.encoding
end

def test_no_magic_comment_word_with_utf_8
@template = new_template("hello \u{fc}mlat")
assert_equal Encoding::UTF_8, render.encoding
assert_equal "hello \u{fc}mlat", render
end

def test_no_magic_comment_word_with_utf_8
@template = new_template("hello \u{fc}mlat")
# This test ensures that if the default_external
# is set to something other than UTF-8, we don't
# get any errors and get back a UTF-8 String.
def test_default_external_works
with_external_encoding "ISO-8859-1" do
@template = new_template("hello \xFCmlat")
assert_equal Encoding::UTF_8, render.encoding
assert_equal "hello \u{fc}mlat", render
end
end

# This test ensures that if the default_external
# is set to something other than UTF-8, we don't
# get any errors and get back a UTF-8 String.
def test_default_external_works
with_external_encoding "ISO-8859-1" do
@template = new_template("hello \xFCmlat")
assert_equal Encoding::UTF_8, render.encoding
assert_equal "hello \u{fc}mlat", render
end
end

def test_encoding_can_be_specified_with_magic_comment
@template = new_template("# encoding: ISO-8859-1\nhello \xFCmlat")
assert_equal Encoding::UTF_8, render.encoding
assert_equal "\nhello \u{fc}mlat", render
end
def test_encoding_can_be_specified_with_magic_comment
@template = new_template("# encoding: ISO-8859-1\nhello \xFCmlat")
assert_equal Encoding::UTF_8, render.encoding
assert_equal "\nhello \u{fc}mlat", render
end

# TODO: This is currently handled inside ERB. The case of explicitly
# lying about encodings via the normal Rails API should be handled
# inside Rails.
def test_lying_with_magic_comment
assert_raises(ActionView::Template::Error) do
@template = new_template("# encoding: UTF-8\nhello \xFCmlat", :virtual_path => nil)
render
end
# TODO: This is currently handled inside ERB. The case of explicitly
# lying about encodings via the normal Rails API should be handled
# inside Rails.
def test_lying_with_magic_comment
assert_raises(ActionView::Template::Error) do
@template = new_template("# encoding: UTF-8\nhello \xFCmlat", :virtual_path => nil)
render
end
end

def test_encoding_can_be_specified_with_magic_comment_in_erb
with_external_encoding Encoding::UTF_8 do
@template = new_template("<%# encoding: ISO-8859-1 %>hello \xFCmlat", :virtual_path => nil)
assert_equal Encoding::UTF_8, render.encoding
assert_equal "hello \u{fc}mlat", render
end
def test_encoding_can_be_specified_with_magic_comment_in_erb
with_external_encoding Encoding::UTF_8 do
@template = new_template("<%# encoding: ISO-8859-1 %>hello \xFCmlat", :virtual_path => nil)
assert_equal Encoding::UTF_8, render.encoding
assert_equal "hello \u{fc}mlat", render
end
end

def test_error_when_template_isnt_valid_utf8
assert_raises(ActionView::Template::Error, /\xFC/) do
@template = new_template("hello \xFCmlat", :virtual_path => nil)
render
end
def test_error_when_template_isnt_valid_utf8
assert_raises(ActionView::Template::Error, /\xFC/) do
@template = new_template("hello \xFCmlat", :virtual_path => nil)
render
end
end

def with_external_encoding(encoding)
old = Encoding.default_external
Encoding::Converter.new old, encoding if old != encoding
silence_warnings { Encoding.default_external = encoding }
yield
ensure
silence_warnings { Encoding.default_external = old }
end
def with_external_encoding(encoding)
old = Encoding.default_external
Encoding::Converter.new old, encoding if old != encoding
silence_warnings { Encoding.default_external = encoding }
yield
ensure
silence_warnings { Encoding.default_external = old }
end
end
2 changes: 0 additions & 2 deletions activemodel/lib/active_model/validations/length.rb
Expand Up @@ -60,8 +60,6 @@ def tokenize(value)
if value.kind_of?(String)
if options[:tokenizer]
options[:tokenizer].call(value)
elsif !value.encoding_aware?
value.mb_chars
end
end || value
end
Expand Down
Expand Up @@ -201,25 +201,17 @@ def quoted_date(value) #:nodoc:
end
end

if "<3".encoding_aware?
def type_cast(value, column) # :nodoc:
return value.to_f if BigDecimal === value
return super unless String === value
return super unless column && value

value = super
if column.type == :string && value.encoding == Encoding::ASCII_8BIT
@logger.error "Binary data inserted for `string` type on column `#{column.name}`"
value.encode! 'utf-8'
end
value
end
else
def type_cast(value, column) # :nodoc:
return super unless BigDecimal === value
def type_cast(value, column) # :nodoc:
return value.to_f if BigDecimal === value
return super unless String === value
return super unless column && value

value.to_f
value = super
if column.type == :string && value.encoding == Encoding::ASCII_8BIT
@logger.error "Binary data inserted for `string` type on column `#{column.name}`"
value.encode! 'utf-8'
end
value
end

# DATABASE STATEMENTS ======================================
Expand Down
Expand Up @@ -23,8 +23,6 @@ def setup
end

def test_column_types
return skip('only test encoding on 1.9') unless "<3".encoding_aware?

owner = Owner.create!(:name => "hello".encode('ascii-8bit'))
owner.reload
select = Owner.columns.map { |c| "typeof(#{c.name})" }.join ', '
Expand Down

0 comments on commit 5ca86ac

Please sign in to comment.