backports 1.7.1 → 1.8.0

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.
Files changed (67) hide show
  1. data/CHANGELOG.rdoc +7 -0
  2. data/README.rdoc +31 -36
  3. data/Rakefile +4 -27
  4. data/VERSION.yml +2 -2
  5. data/backports.gemspec +52 -32
  6. data/lib/backports.rb +4 -15
  7. data/lib/backports/1.8.7.rb +4 -0
  8. data/lib/backports/{argf.rb → 1.8.7/argf.rb} +8 -8
  9. data/lib/backports/{array.rb → 1.8.7/array.rb} +26 -43
  10. data/lib/backports/{binding.rb → 1.8.7/binding.rb} +0 -0
  11. data/lib/backports/1.8.7/dir.rb +7 -0
  12. data/lib/backports/{enumerable.rb → 1.8.7/enumerable.rb} +22 -38
  13. data/lib/backports/1.8.7/enumerator.rb +19 -0
  14. data/lib/backports/1.8.7/env.rb +3 -0
  15. data/lib/backports/1.8.7/fixnum.rb +11 -0
  16. data/lib/backports/1.8.7/float.rb +4 -0
  17. data/lib/backports/{gc.rb → 1.8.7/gc.rb} +0 -0
  18. data/lib/backports/1.8.7/hash.rb +23 -0
  19. data/lib/backports/1.8.7/integer.rb +23 -0
  20. data/lib/backports/{io.rb → 1.8.7/io.rb} +8 -7
  21. data/lib/backports/1.8.7/kernel.rb +39 -0
  22. data/lib/backports/{method.rb → 1.8.7/method.rb} +8 -8
  23. data/lib/backports/1.8.7/module.rb +7 -0
  24. data/lib/backports/1.8.7/numeric.rb +3 -0
  25. data/lib/backports/1.8.7/object_space.rb +5 -0
  26. data/lib/backports/{proc.rb → 1.8.7/proc.rb} +0 -0
  27. data/lib/backports/{process.rb → 1.8.7/process.rb} +0 -0
  28. data/lib/backports/1.8.7/range.rb +4 -0
  29. data/lib/backports/{regexp.rb → 1.8.7/regexp.rb} +2 -1
  30. data/lib/backports/1.8.7/string.rb +90 -0
  31. data/lib/backports/1.8.7/struct.rb +3 -0
  32. data/lib/backports/1.8.7/symbol.rb +6 -0
  33. data/lib/backports/1.9.rb +5 -0
  34. data/lib/backports/1.9/array.rb +12 -0
  35. data/lib/backports/1.9/enumerable.rb +8 -0
  36. data/lib/backports/1.9/enumerator.rb +15 -0
  37. data/lib/backports/1.9/hash.rb +15 -0
  38. data/lib/backports/1.9/integer.rb +3 -0
  39. data/lib/backports/1.9/kernel.rb +11 -0
  40. data/lib/backports/1.9/string.rb +39 -0
  41. data/lib/backports/{symbol.rb → 1.9/symbol.rb} +1 -6
  42. data/lib/backports/rails.rb +4 -0
  43. data/lib/backports/rails/array.rb +6 -0
  44. data/lib/backports/rails/enumerable.rb +12 -0
  45. data/lib/backports/rails/hash.rb +31 -0
  46. data/lib/backports/rails/kernel.rb +12 -0
  47. data/lib/backports/rails/module.rb +6 -0
  48. data/lib/backports/rails/string.rb +42 -0
  49. data/lib/backports/tools.rb +117 -0
  50. data/test/enumerator_test.rb +3 -3
  51. data/test/test_helper.rb +1 -3
  52. metadata +50 -31
  53. data/lib/backports/core_ext.rb +0 -61
  54. data/lib/backports/dir.rb +0 -7
  55. data/lib/backports/enumerator.rb +0 -43
  56. data/lib/backports/env.rb +0 -3
  57. data/lib/backports/fixnum.rb +0 -11
  58. data/lib/backports/float.rb +0 -4
  59. data/lib/backports/hash.rb +0 -64
  60. data/lib/backports/integer.rb +0 -25
  61. data/lib/backports/kernel.rb +0 -55
  62. data/lib/backports/module.rb +0 -30
  63. data/lib/backports/numeric.rb +0 -3
  64. data/lib/backports/object_space.rb +0 -5
  65. data/lib/backports/range.rb +0 -4
  66. data/lib/backports/string.rb +0 -167
  67. data/lib/backports/struct.rb +0 -3
@@ -0,0 +1,7 @@
1
+ class Dir
2
+ Backports.make_block_optional self, :each, :test_on => Dir.new(".")
3
+ class << self
4
+ Backports.make_block_optional self, :foreach, :test_on => Dir, :arg => "."
5
+ end
6
+ end
7
+
@@ -1,18 +1,9 @@
1
+ require 'enumerator'
1
2
  module Enumerable
2
- # Standard in rails... See official documentation[http://api.rubyonrails.org/classes/Enumerable.html]
3
- # Modified from rails 2.3 to not rely on size
4
- def sum(identity = 0, &block)
5
- if block_given?
6
- map(&block).sum(identity)
7
- else
8
- inject { |sum, element| sum + element } || identity
9
- end
10
- end unless method_defined? :sum
11
-
12
3
  # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Enumerable.html]
13
- def count(item = Undefined)
4
+ def count(item = Backports::Undefined)
14
5
  seq = 0
15
- if item != Undefined
6
+ if item != Backports::Undefined
16
7
  each { |o| seq += 1 if item == o }
17
8
  elsif block_given?
18
9
  each { |o| seq += 1 if yield(o) }
@@ -26,7 +17,7 @@ module Enumerable
26
17
  def cycle(n = nil, &block)
27
18
  return to_enum(:cycle, n) unless block_given?
28
19
  return loop(&block) if nil == n
29
- n = Type.coerce_to(n, Fixnum, :to_int)
20
+ n = Backports.coerce_to(n, Fixnum, :to_int)
30
21
  if n >= 1
31
22
  cache = []
32
23
  each do |elem|
@@ -37,11 +28,14 @@ module Enumerable
37
28
  end
38
29
  end unless method_defined? :cycle
39
30
 
40
- make_block_optional :detect, :find, :find_all, :select, :sort_by, :partition, :reject, :test_on => 1..2
31
+ # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Enumerable.html]
32
+ Backports.make_block_optional self, :each_cons, :each_slice, :test_on => 1..2, :arg => 1
33
+
34
+ Backports.make_block_optional self, :detect, :find, :find_all, :select, :sort_by, :partition, :reject, :test_on => 1..2
41
35
 
42
36
  # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Enumerable.html]
43
37
  def drop(n)
44
- n = Type.coerce_to(n, Fixnum, :to_int)
38
+ n = Backports.coerce_to(n, Fixnum, :to_int)
45
39
  raise ArgumentError, "attempt to drop negative size" if n < 0
46
40
  ary = to_a
47
41
  return [] if n > ary.size
@@ -59,9 +53,6 @@ module Enumerable
59
53
  ary
60
54
  end unless method_defined? :drop_while
61
55
 
62
- # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Enumerable.html]
63
- make_block_optional :each_cons, :each_slice, :test_on => 1..2, :arg => 1
64
-
65
56
  # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Enumerable.html]
66
57
  if instance_method(:each_with_index).arity.zero?
67
58
  def each_with_index_with_optional_args_and_block(*args, &block)
@@ -70,19 +61,12 @@ module Enumerable
70
61
  each(*args) { |o| yield(o, idx); idx += 1 }
71
62
  self
72
63
  end
73
- alias_method_chain :each_with_index, :optional_args_and_block
64
+ Backports.alias_method_chain self, :each_with_index, :optional_args_and_block
74
65
  end
75
-
76
- # Standard in Ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Enumerable.html]
77
- def each_with_object(memo, &block)
78
- return to_enum(:each_with_object, memo) unless block_given?
79
- each {|obj| block.call(obj, memo)}
80
- memo
81
- end unless method_defined? :each_with_object
82
66
 
83
67
  # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Enumerable.html]
84
- def find_index(obj = Undefined)
85
- if obj != Undefined
68
+ def find_index(obj = Backports::Undefined)
69
+ if obj != Backports::Undefined
86
70
  each_with_index do |element, i|
87
71
  return i if element == obj
88
72
  end
@@ -97,8 +81,8 @@ module Enumerable
97
81
  end unless method_defined? :find_index
98
82
 
99
83
  # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Enumerable.html]
100
- def first(n = Undefined)
101
- return take(n) unless n == Undefined
84
+ def first(n = Backports::Undefined)
85
+ return take(n) unless n == Backports::Undefined
102
86
  each{|obj| return obj}
103
87
  nil
104
88
  end unless method_defined? :first
@@ -106,7 +90,7 @@ module Enumerable
106
90
  # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Enumerable.html]
107
91
  def group_by
108
92
  return to_enum(:group_by) unless block_given?
109
- returning({}) do |result|
93
+ {}.tap do |result|
110
94
  each do |o|
111
95
  result.fetch(yield(o)){|key| result[key] = []} << o
112
96
  end
@@ -120,7 +104,7 @@ module Enumerable
120
104
  method = args.pop
121
105
  inject_without_symbol(*args) {|memo, obj| memo.send(method, obj)}
122
106
  end
123
- alias_method_chain :inject, :symbol
107
+ Backports.alias_method_chain self, :inject, :symbol
124
108
  end
125
109
 
126
110
  MOST_EXTREME_OBJECT_EVER = Object.new # :nodoc:
@@ -156,8 +140,8 @@ module Enumerable
156
140
  min = max = object
157
141
  first_time = false
158
142
  else
159
- min = object if Type.coerce_to_comparison(min, object, yield(min, object)) > 0
160
- max = object if Type.coerce_to_comparison(max, object, yield(max, object)) < 0
143
+ min = object if Backports.coerce_to_comparison(min, object, yield(min, object)) > 0
144
+ max = object if Backports.coerce_to_comparison(max, object, yield(max, object)) < 0
161
145
  end
162
146
  end
163
147
  [min, max]
@@ -214,9 +198,9 @@ module Enumerable
214
198
 
215
199
  # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Enumerable.html]
216
200
  def take(n)
217
- n = Type.coerce_to(n, Fixnum, :to_int)
201
+ n = Backports.coerce_to(n, Fixnum, :to_int)
218
202
  raise ArgumentError, "attempt to take negative size: #{n}" if n < 0
219
- returning([]) do |array|
203
+ [].tap do |array|
220
204
  each do |elem|
221
205
  array << elem
222
206
  break if array.size >= n
@@ -239,7 +223,7 @@ module Enumerable
239
223
  return to_a_without_optional_arguments if args.empty?
240
224
  to_enum(:each, *args).to_a
241
225
  end
242
- alias_method_chain :to_a, :optional_arguments
226
+ Backports.alias_method_chain self, :to_a, :optional_arguments
243
227
  end
244
228
 
245
229
  # alias_method gives a warning, so instead copy-paste:
@@ -248,7 +232,7 @@ module Enumerable
248
232
  return entries_without_optional_arguments if args.empty?
249
233
  to_enum(:each, *args).entries
250
234
  end
251
- alias_method_chain :entries, :optional_arguments
235
+ Backports.alias_method_chain self, :entries, :optional_arguments
252
236
  end
253
237
 
254
238
  end
@@ -0,0 +1,19 @@
1
+ require 'enumerator'
2
+ module Enumerable
3
+ class Enumerator
4
+ def next
5
+ require 'generator'
6
+ @generator ||= Generator.new(self)
7
+ raise StopIteration unless @generator.next?
8
+ @generator.next
9
+ end unless method_defined? :next
10
+
11
+ def rewind
12
+ @object.rewind if @object.respond_to? :rewind
13
+ require 'generator'
14
+ @generator ||= Generator.new(self)
15
+ @generator.rewind
16
+ self
17
+ end unless method_defined? :rewind
18
+ end
19
+ end
@@ -0,0 +1,3 @@
1
+ class << ENV
2
+ Backports.make_block_optional self, :delete_if, :each, :each_key, :each_pair, :each_value, :reject!, :select, :test_on => ENV
3
+ end
@@ -0,0 +1,11 @@
1
+ class Fixnum
2
+ # Standard in ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Fixnum.html]
3
+ def div(n)
4
+ (self / n).to_i
5
+ end unless method_defined? :div
6
+
7
+ # Standard in ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Fixnum.html]
8
+ def fdiv(n)
9
+ to_f / n
10
+ end unless method_defined? :fdiv
11
+ end
@@ -0,0 +1,4 @@
1
+ class Fixnum
2
+ # Standard in ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Fixnum.html]
3
+ alias_method :fdiv, :/ unless method_defined? :fdiv
4
+ end
File without changes
@@ -0,0 +1,23 @@
1
+ class Hash
2
+ # New Ruby 1.8.7+ constructor -- not documented, see redmine # 1385
3
+ # <tt>Hash[[[:foo, :bar],[:hello, "world"]]] ==> {:foo => :bar, :hello => "world"}</tt>
4
+ class << self
5
+ alias_method :original_constructor, :[]
6
+ def [](*args)
7
+ return original_constructor(*args) unless args.length == 1 && args.first.is_a?(Array)
8
+ {}.tap do |h|
9
+ args.first.each do |arr|
10
+ next unless arr.respond_to? :to_ary
11
+ arr = arr.to_ary
12
+ next unless (1..2).include? arr.size
13
+ h[arr.at(0)] = arr.at(1)
14
+ end
15
+ end
16
+ end unless (Hash[[[:test, :test]]] rescue false)
17
+ end
18
+
19
+ Backports.make_block_optional self, :delete_if, :each, :each_key, :each_pair, :each_value, :reject, :reject!, :select, :test_on => {:hello => "world!"}
20
+
21
+ # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Hash.html]
22
+ alias_method :key, :index unless method_defined? :key
23
+ end
@@ -0,0 +1,23 @@
1
+ class Integer
2
+ Backports.make_block_optional self, :downto, :times, :upto, :test_on => 42, :arg => 42
3
+
4
+ # Standard in ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Fixnum.html]
5
+ def even?
6
+ self[0].zero?
7
+ end unless method_defined? :even?
8
+
9
+ # Standard in ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Fixnum.html]
10
+ def odd?
11
+ !even?
12
+ end unless method_defined? :odd?
13
+
14
+ # Standard in ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Fixnum.html]
15
+ def ord
16
+ self
17
+ end unless method_defined? :ord
18
+
19
+ # Standard in ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Fixnum.html]
20
+ def pred
21
+ self - 1
22
+ end unless method_defined? :pred
23
+ end
@@ -1,22 +1,22 @@
1
- if RUBY_VERSION < '1.8.7'
2
- class IO
3
- make_block_optional :each, :each_line, :each_byte
1
+ class IO
2
+ if RUBY_VERSION < '1.8.7'
3
+ Backports.make_block_optional self, :each, :each_line, :each_byte
4
4
  class << self
5
- make_block_optional :foreach
5
+ Backports.make_block_optional self, :foreach
6
6
  end
7
7
  end
8
8
 
9
- end
10
-
11
- class IO
9
+ # Standard in ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/IO.html]
12
10
  def bytes
13
11
  to_enum :each_byte
14
12
  end unless method_defined? :bytes
15
13
 
14
+ # Standard in ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/IO.html]
16
15
  def chars
17
16
  to_enum :each_char
18
17
  end unless method_defined? :chars
19
18
 
19
+ # Standard in ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/IO.html]
20
20
  def each_char
21
21
  return to_enum(:each_char) unless block_given?
22
22
  if $KCODE == "UTF-8"
@@ -47,6 +47,7 @@ class IO
47
47
  alias_method :getbyte, :getc unless method_defined? :getbyte
48
48
  alias_method :readbyte, :readchar unless method_defined? :readchar
49
49
 
50
+ # Standard in ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/IO.html]
50
51
  def lines(*args)
51
52
  to_enum :each_line, *args
52
53
  end unless method_defined? :lines
@@ -0,0 +1,39 @@
1
+ module Kernel
2
+
3
+ def __method__
4
+ m = caller(1).first[/`(.*)'/,1]
5
+ m.to_sym if m
6
+ end unless (__method__ || true rescue false)
7
+
8
+ # Standard in ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Object.html]
9
+ def define_singleton_method(*args, &block)
10
+ class << self
11
+ self
12
+ end.send(:define_method, *args, &block)
13
+ end unless method_defined? :define_singleton_method
14
+
15
+ # Standard in ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Object.html]
16
+ def instance_exec(*arg, &block)
17
+ define_singleton_method(:"temporary method for instance_exec", &block)
18
+ send(:"temporary method for instance_exec", *arg)
19
+ end unless method_defined? :instance_exec
20
+
21
+ # Loop. Standard in ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/Object.html]
22
+ unless const_defined? :StopIteration
23
+ class StopIteration < IndexError; end
24
+
25
+ def loop_with_stop_iteration(&block)
26
+ loop_without_stop_iteration(&block)
27
+ rescue StopIteration
28
+ # ignore silently
29
+ end
30
+ Backports.alias_method_chain self, :loop, :stop_iteration
31
+ end
32
+
33
+ # Standard in ruby 1.8.7. See official documentation[http://ruby-doc.org/core-1.9/classes/Object.html]
34
+ def tap
35
+ yield self
36
+ self
37
+ end unless method_defined? :tap
38
+
39
+ end
@@ -3,45 +3,45 @@ unless Method.method_defined? :name
3
3
  attr_accessor :name, :receiver, :owner
4
4
 
5
5
  def unbind_with_additional_info
6
- returning unbind_without_additional_info do |unbound|
6
+ unbind_without_additional_info.tap do |unbound|
7
7
  unbound.name = name
8
8
  unbound.owner = owner
9
9
  end
10
10
  end
11
- alias_method_chain :unbind, :additional_info
11
+ Backports.alias_method_chain self, :unbind, :additional_info
12
12
  end
13
13
 
14
14
  class UnboundMethod
15
15
  attr_accessor :name, :owner
16
16
 
17
17
  def bind_with_additional_info(to)
18
- returning bind_without_additional_info(to) do |bound|
18
+ bind_without_additional_info(to).tap do |bound|
19
19
  bound.name = name
20
20
  bound.owner = owner
21
21
  bound.receiver = to
22
22
  end
23
23
  end
24
- alias_method_chain :bind, :additional_info
24
+ Backports.alias_method_chain self, :bind, :additional_info
25
25
  end
26
26
 
27
27
  class Object
28
28
  def method_with_additional_info(name)
29
- returning method_without_additional_info(name) do |bound|
29
+ method_without_additional_info(name).tap do |bound|
30
30
  bound.name = name.to_sym
31
31
  bound.receiver = self
32
32
  bound.owner = self.class.ancestors.find{|mod| mod.instance_methods(false).include? name.to_s}
33
33
  end
34
34
  end
35
- alias_method_chain :method, :additional_info
35
+ Backports.alias_method_chain self, :method, :additional_info
36
36
  end
37
37
 
38
38
  class Module
39
39
  def instance_method_with_additional_info(name)
40
- returning instance_method_without_additional_info(name) do |unbound|
40
+ instance_method_without_additional_info(name).tap do |unbound|
41
41
  unbound.name = name.to_sym
42
42
  unbound.owner = ancestors.find{|mod| mod.instance_methods(false).include? name.to_s}
43
43
  end
44
44
  end
45
- alias_method_chain :instance_method, :additional_info
45
+ Backports.alias_method_chain self, :instance_method, :additional_info
46
46
  end
47
47
  end
@@ -0,0 +1,7 @@
1
+ class Module
2
+ # Can't use alias_method here because of jruby (see http://jira.codehaus.org/browse/JRUBY-2435 )
3
+ def module_exec(*arg, &block)
4
+ instance_exec(*arg, &block)
5
+ end unless method_defined? :module_exec
6
+ alias_method :class_exec, :module_exec unless method_defined? :class_exec
7
+ end
@@ -0,0 +1,3 @@
1
+ class Numeric
2
+ Backports.make_block_optional self, :step, :test_on => 42, :arg => [100, 6]
3
+ end
@@ -0,0 +1,5 @@
1
+ module ObjectSpace
2
+ class << self
3
+ Backports.make_block_optional self, :each_object, :test_on => ObjectSpace
4
+ end
5
+ end
File without changes
@@ -0,0 +1,4 @@
1
+ class Range
2
+ Backports.make_block_optional self, :each, :test_on => 69..666
3
+ Backports.make_block_optional self, :step, :test_on => 69..666, :arg => 42
4
+ end
@@ -1,11 +1,12 @@
1
1
  class Regexp
2
+ # Standard in Ruby 1.8.7+. See official documentation[http://www.ruby-doc.org/core-1.8.7/classes/Regexp.html]
2
3
  class << self
3
4
  unless (union(%w(a b)) rescue false)
4
5
  def union_with_array_argument(*arg)
5
6
  return union_without_array_argument(*arg) unless arg.size == 1
6
7
  union_without_array_argument(*arg.first)
7
8
  end
8
- alias_method_chain :union, :array_argument
9
+ Backports.alias_method_chain self, :union, :array_argument
9
10
  end
10
11
  end
11
12
  end
@@ -0,0 +1,90 @@
1
+ class String
2
+ # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/String.html]
3
+ alias_method :bytesize, :length unless method_defined? :bytesize
4
+
5
+ # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/String.html]
6
+ def chr
7
+ chars.first
8
+ end unless method_defined? :chr
9
+
10
+ Backports.make_block_optional self, :each_byte, :each, :each_line, :test_on => "abc"
11
+
12
+ # gsub: Left alone because of $~, $1, etc... which needs to be "pushed" up one level
13
+ # It's possible to do so, but gsub is used everywhere so i felt
14
+ # the performance hit was too big compared to the dubious gain.
15
+
16
+ # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/String.html]
17
+ unless method_defined? :each_char
18
+ def each_char(&block)
19
+ return to_enum(:each_char) unless block_given?
20
+ scan(/./, &block)
21
+ end
22
+
23
+ alias_method :chars, :each_char unless method_defined? :chars
24
+ end
25
+
26
+ # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/String.html]
27
+ def end_with?(*suffixes)
28
+ suffixes.each do |suffix|
29
+ next unless suffix.respond_to? :to_str
30
+ suffix = suffix.to_str
31
+ return true if self[-suffix.length, suffix.length] == suffix
32
+ end
33
+ false
34
+ end unless method_defined? :end_with?
35
+
36
+ # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/String.html]
37
+ unless ("check partition".partition(" ") rescue false)
38
+ def partition_with_new_meaning(pattern = Backports::Undefined, &block)
39
+ return partition_without_new_meaning(&block) if pattern == Backports::Undefined
40
+ pattern = Backports.coerce_to(pattern, String, :to_str) unless pattern.is_a? Regexp
41
+ i = index(pattern)
42
+ return [self, "", ""] unless i
43
+ if pattern.is_a? Regexp
44
+ match = Regexp.last_match
45
+ [match.pre_match, match[0], match.post_match]
46
+ else
47
+ last = i+pattern.length
48
+ [self[0...i], self[i...last], self[last...length]]
49
+ end
50
+ end
51
+ Backports.alias_method_chain self, :partition, :new_meaning
52
+ end
53
+
54
+ # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/String.html]
55
+ def rpartition(pattern)
56
+ pattern = Backports.coerce_to(pattern, String, :to_str) unless pattern.is_a? Regexp
57
+ i = rindex(pattern)
58
+ return ["", "", self] unless i
59
+
60
+ if pattern.is_a? Regexp
61
+ match = Regexp.last_match
62
+ [match.pre_match, match[0], match.post_match]
63
+ else
64
+ last = i+pattern.length
65
+ [self[0...i], self[i...last], self[last...length]]
66
+ end
67
+ end unless method_defined? :rpartition
68
+
69
+ # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/String.html]
70
+ def start_with?(*prefixes)
71
+ prefixes.each do |prefix|
72
+ next unless prefix.respond_to? :to_str
73
+ prefix = prefix.to_str
74
+ return true if self[0, prefix.length] == prefix
75
+ end
76
+ false
77
+ end unless method_defined? :start_with?
78
+
79
+ # Standard in Ruby 1.8.7+. See official documentation[http://ruby-doc.org/core-1.9/classes/String.html]
80
+ unless ("abc".upto("def", true) rescue false)
81
+ def upto_with_exclusive(to, excl=false, &block)
82
+ return upto_without_exclusive(to, &block) if block_given? && !excl
83
+ enum = Range.new(self, to, excl).to_enum
84
+ return enum unless block_given?
85
+ enum.each(&block)
86
+ self
87
+ end
88
+ Backports.alias_method_chain self, :upto, :exclusive
89
+ end
90
+ end