rspec-support 3.2.1 → 3.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 220288678e55ebf951caa894d9eacf4aa5857879
4
- data.tar.gz: 49631c216c2f0d04734c11a88378d59b122b001e
3
+ metadata.gz: 60a2be459dac1db7bb1f0e0744c43f44096ba5f1
4
+ data.tar.gz: d0aa42011432477ee8022bba5dd6ab339639e1f8
5
5
  SHA512:
6
- metadata.gz: 631750edb88c7a7c9351870fc3216136fbf3fc6e35c8a37aa6a9ff49f46dbf803781f84e231981a34ff933ce6c373c1c8aa0ef9474c86fb4113949ab26f8086c
7
- data.tar.gz: 228c784f40effaa0d75f654413355d133b4641195a169182b42d5e4da1cb375e08c5ea761a039bda62f8915393baebc7c6c8b67cd30afd0b690cfe51bcca6728
6
+ metadata.gz: b68e8f0bc090208f255295646f95c41bbb925fe7068615ab82058bbfa0101895d4b94ae3f4482fa1270dc7e9532b053cc9c735918955e1cf46fe4664b0dd3043
7
+ data.tar.gz: 96062033ec6dfc37bd8d3e430353839c55f04dbaf3f6385b69190e8bee61d821ad966809904f499ff5bc7c7685f4d7d478b8b02f09ec405a22a45cae3e2b3659
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/Changelog.md CHANGED
@@ -1,3 +1,10 @@
1
+ ### 3.2.2 / 2015-02-23
2
+
3
+ Bug Fixes:
4
+
5
+ * Fix an encoding issue with `EncodedString#split` when encountering an
6
+ invalid byte string. (Benjamin Fleischer, #1760)
7
+
1
8
  ### 3.2.1 / 2015-02-04
2
9
  [Full Changelog](http://github.com/rspec/rspec-support/compare/v3.2.0...v3.2.1)
3
10
 
@@ -3,16 +3,32 @@ module RSpec
3
3
  # @private
4
4
  class EncodedString
5
5
  # Reduce allocations by storing constants.
6
- UTF_8 = "UTF-8"
7
- US_ASCII = 'US-ASCII'
8
- # else: '?' 63.chr ("\x3F")
6
+ UTF_8 = "UTF-8"
7
+ US_ASCII = "US-ASCII"
8
+ #
9
+ # In MRI 2.1 'invalid: :replace' changed to also replace an invalid byte sequence
10
+ # see https://github.com/ruby/ruby/blob/v2_1_0/NEWS#L176
11
+ # https://www.ruby-forum.com/topic/6861247
12
+ # https://twitter.com/nalsh/status/553413844685438976
13
+ #
14
+ # For example, given:
15
+ # "\x80".force_encoding("Emacs-Mule").encode(:invalid => :replace).bytes.to_a
16
+ #
17
+ # On MRI 2.1 or above: 63 # '?'
18
+ # else : 128 # "\x80"
19
+ #
20
+ # Ruby's default replacement string is:
21
+ # U+FFFD ("\xEF\xBF\xBD"), for Unicode encoding forms, else
22
+ # ? ("\x3F")
9
23
  REPLACE = "?"
10
24
  ENCODE_UNCONVERTABLE_BYTES = {
11
25
  :invalid => :replace,
12
- :undef => :replace
26
+ :undef => :replace,
27
+ :replace => REPLACE
13
28
  }
14
29
  ENCODE_NO_CONVERTER = {
15
30
  :invalid => :replace,
31
+ :replace => REPLACE
16
32
  }
17
33
 
18
34
  def initialize(string, encoding=nil)
@@ -54,7 +70,7 @@ module RSpec
54
70
  # vs "\x80".encode('UTF-8','ASCII-8BIT', undef: :replace, replace: '<undef>')
55
71
  # # => '<undef>'
56
72
  # Encoding::CompatibilityError
57
- # when Enconding.compatbile?(str1, str2) is false
73
+ # when Encoding.compatibile?(str1, str2) is nil
58
74
  # e.g. utf_16le_emoji_string.split("\n")
59
75
  # e.g. valid_unicode_string.encode(utf8_encoding) << ascii_string
60
76
  # Encoding::InvalidByteSequenceError:
@@ -64,13 +80,13 @@ module RSpec
64
80
  # vs "\x80".encode('UTF-8','US-ASCII', invalid: :replace, replace: '<byte>')
65
81
  # # => '<byte>'
66
82
  # ArgumentError
67
- # when operating on a string with invalid bytes
68
- # e.g."\xEF".split("\n")
83
+ # when operating on a string with invalid bytes
84
+ # e.g."\x80".split("\n")
69
85
  # TypeError
70
- # when a symbol is passed as an encoding
71
- # Encoding.find(:"utf-8")
72
- # when calling force_encoding on an object
73
- # that doesn't respond to #to_str
86
+ # when a symbol is passed as an encoding
87
+ # Encoding.find(:"UTF-8")
88
+ # when calling force_encoding on an object
89
+ # that doesn't respond to #to_str
74
90
  #
75
91
  # Raised by transcoding methods:
76
92
  # Encoding::ConverterNotFoundError:
@@ -80,25 +96,35 @@ module RSpec
80
96
  # e.g. "\x80".force_encoding('ASCII-8BIT').encode('Emacs-Mule')
81
97
  #
82
98
  # Raised by byte <-> char conversions
83
- # RangeError: out of char range
84
- # e.g. the UTF-16LE emoji: 128169.chr
99
+ # RangeError: out of char range
100
+ # e.g. the UTF-16LE emoji: 128169.chr
85
101
  def matching_encoding(string)
102
+ string = remove_invalid_bytes(string)
86
103
  string.encode(@encoding)
87
104
  rescue Encoding::UndefinedConversionError, Encoding::InvalidByteSequenceError
88
- normalize_missing(string.encode(@encoding, ENCODE_UNCONVERTABLE_BYTES))
105
+ string.encode(@encoding, ENCODE_UNCONVERTABLE_BYTES)
89
106
  rescue Encoding::ConverterNotFoundError
90
- normalize_missing(string.dup.force_encoding(@encoding).encode(ENCODE_NO_CONVERTER))
107
+ string.dup.force_encoding(@encoding).encode(ENCODE_NO_CONVERTER)
91
108
  end
92
109
 
93
- # Ruby's default replacement string is:
94
- # for Unicode encoding forms: U+FFFD ("\xEF\xBF\xBD")
95
- MRI_UNICODE_UNKOWN_CHARACTER = "\xEF\xBF\xBD".force_encoding(UTF_8)
96
-
97
- def normalize_missing(string)
98
- if @encoding.to_s == UTF_8
99
- string.gsub(MRI_UNICODE_UNKOWN_CHARACTER, REPLACE)
100
- else
101
- string
110
+ # Prevents raising ArgumentError
111
+ if String.method_defined?(:scrub)
112
+ # https://github.com/ruby/ruby/blob/eeb05e8c11/doc/NEWS-2.1.0#L120-L123
113
+ # https://github.com/ruby/ruby/blob/v2_1_0/string.c#L8242
114
+ # https://github.com/hsbt/string-scrub
115
+ # https://github.com/rubinius/rubinius/blob/v2.5.2/kernel/common/string.rb#L1913-L1972
116
+ def remove_invalid_bytes(string)
117
+ string.scrub(REPLACE)
118
+ end
119
+ else
120
+ # http://stackoverflow.com/a/8711118/879854
121
+ # Loop over chars in a string replacing chars
122
+ # with invalid encoding, which is a pretty good proxy
123
+ # for the invalid byte sequence that causes an ArgumentError
124
+ def remove_invalid_bytes(string)
125
+ string.chars.map do |char|
126
+ char.valid_encoding? ? char : REPLACE
127
+ end.join
102
128
  end
103
129
  end
104
130
 
@@ -1,7 +1,7 @@
1
1
  module RSpec
2
2
  module Support
3
3
  module Version
4
- STRING = '3.2.1'
4
+ STRING = '3.2.2'
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-support
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.2.1
4
+ version: 3.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Chelimsky
@@ -48,7 +48,7 @@ cert_chain:
48
48
  ZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ
49
49
  F3MdtaDehhjC
50
50
  -----END CERTIFICATE-----
51
- date: 2015-02-04 00:00:00.000000000 Z
51
+ date: 2015-02-24 00:00:00.000000000 Z
52
52
  dependencies:
53
53
  - !ruby/object:Gem::Dependency
54
54
  name: bundler
@@ -134,5 +134,5 @@ rubyforge_project: rspec
134
134
  rubygems_version: 2.2.2
135
135
  signing_key:
136
136
  specification_version: 4
137
- summary: rspec-support-3.2.1
137
+ summary: rspec-support-3.2.2
138
138
  test_files: []
metadata.gz.sig CHANGED
Binary file