backports 1.7.1 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
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