backports 1.5.0 → 1.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +78 -1
- data/README.rdoc +75 -25
- data/VERSION.yml +1 -1
- data/lib/backports.rb +8 -1
- data/lib/backports/array.rb +16 -27
- data/lib/backports/binding.rb +6 -0
- data/lib/backports/dir.rb +7 -0
- data/lib/backports/enumerable.rb +4 -32
- data/lib/backports/enumerator.rb +41 -0
- data/lib/backports/fixnum.rb +0 -22
- data/lib/backports/hash.rb +29 -13
- data/lib/backports/integer.rb +34 -0
- data/lib/backports/io.rb +12 -0
- data/lib/backports/kernel.rb +20 -0
- data/lib/backports/method.rb +47 -0
- data/lib/backports/module.rb +24 -0
- data/lib/backports/object.rb +14 -2
- data/lib/backports/object_space.rb +6 -0
- data/lib/backports/range.rb +4 -0
- data/lib/backports/regexp.rb +11 -0
- data/lib/backports/string.rb +101 -45
- data/lib/backports/struct.rb +3 -0
- data/lib/backports/symbol.rb +14 -0
- data/test/binding_test.rb +20 -0
- data/test/enumerable_test.rb +10 -0
- data/test/enumerator_test.rb +29 -0
- data/test/kernel_test.rb +30 -0
- data/test/method_test.rb +73 -0
- data/test/module_test.rb +20 -0
- data/test/object_test.rb +35 -0
- data/test/regexp_test.rb +14 -0
- data/test/string_test.rb +25 -0
- data/test/test_helper.rb +2 -2
- metadata +27 -2
data/CHANGELOG.rdoc
CHANGED
@@ -1,11 +1,88 @@
|
|
1
1
|
= Packable --- History
|
2
2
|
|
3
|
+
== Version 1.6 - April 29, 2009
|
4
|
+
|
5
|
+
Completed backport to 1.8.7.
|
6
|
+
|
7
|
+
* Array
|
8
|
+
* <tt>extract_options!</tt>
|
9
|
+
|
10
|
+
* Binding
|
11
|
+
* +eval+
|
12
|
+
|
13
|
+
* Dir
|
14
|
+
* +each+, +foreach+
|
15
|
+
|
16
|
+
* Enumerator
|
17
|
+
* +new+
|
18
|
+
* +with_object+
|
19
|
+
* +next+, +rewind+
|
20
|
+
|
21
|
+
* Hash
|
22
|
+
* Optional block for <tt>delete_if, each, each_key, each_pair, each_value, reject!, select</tt> (and ENV)
|
23
|
+
|
24
|
+
* Integer
|
25
|
+
* moved stuff out of Fixnum
|
26
|
+
* Optional block for +downto+, +times+, +upto+
|
27
|
+
|
28
|
+
* IO
|
29
|
+
* Optional block for +each+, +each_line+, +each_byte+, +foreach+ (and ARGF)
|
30
|
+
|
31
|
+
* Kernel
|
32
|
+
* +loop+, +StopIteration+
|
33
|
+
* +__method__+, +__callee__+
|
34
|
+
|
35
|
+
* Method
|
36
|
+
* +name+, +owner+, +receiver+
|
37
|
+
|
38
|
+
* Module
|
39
|
+
* +class_exec+, +module_exec+
|
40
|
+
|
41
|
+
* Numeric
|
42
|
+
* +step+
|
43
|
+
|
44
|
+
* Object
|
45
|
+
* +define_singleton_method+
|
46
|
+
* +instance_exec+
|
47
|
+
|
48
|
+
* ObjectSpace
|
49
|
+
* +each_object+
|
50
|
+
|
51
|
+
* Range
|
52
|
+
* Optional block for +each+, +step+
|
53
|
+
|
54
|
+
* Regexp
|
55
|
+
* +union+
|
56
|
+
|
57
|
+
* String
|
58
|
+
* +try_convert+
|
59
|
+
* <tt>ascii_only?</tt>
|
60
|
+
* +bytesize+
|
61
|
+
* +chr+
|
62
|
+
* +clear+
|
63
|
+
* +codepoints+, +each_codepoint+
|
64
|
+
* +stringify_keys+, +stringify_keys!+
|
65
|
+
* +each+, +each_line+, +each_byte+
|
66
|
+
* +gsub+
|
67
|
+
* +upto+
|
68
|
+
|
69
|
+
* Struct
|
70
|
+
* +each+, +each_pair+
|
71
|
+
|
72
|
+
* Symbol
|
73
|
+
* <tt><=></tt>, +casecmp+
|
74
|
+
* +capitalize+, +downcase+, +next+, +succ+, +swapcase+, +upcase+
|
75
|
+
* <tt>=~, [], empty?, length, match, size</tt>
|
76
|
+
|
77
|
+
* UnboundMethod
|
78
|
+
* +name+, +owner+
|
79
|
+
|
3
80
|
== Version 1.5 - April 24, 2009
|
4
81
|
|
5
82
|
* Array (completed)
|
6
83
|
* +combination+
|
7
84
|
* +try_convert+
|
8
|
-
* Optional block for collect!, :map!, :each, :each_index, :reject, :reject!, :delete_if
|
85
|
+
* Optional block for <tt>collect!, :map!, :each, :each_index, :reject, :reject!, :delete_if</tt>
|
9
86
|
* +pop+, +shift+
|
10
87
|
* +product+
|
11
88
|
|
data/README.rdoc
CHANGED
@@ -30,45 +30,95 @@ Compatible with Ruby 1.8 & 1.9.
|
|
30
30
|
|
31
31
|
= List of backports
|
32
32
|
|
33
|
+
== Ruby 1.8.7
|
34
|
+
|
35
|
+
Complete Ruby 1.8.7 backporting. Refer to the official list of changes[http://svn.ruby-lang.org/repos/ruby/tags/v1_8_7/NEWS]. All builtin classes are compatible with Ruby 1.8.7:
|
36
|
+
* Array
|
37
|
+
* Binding
|
38
|
+
* Dir
|
39
|
+
* Enumerable
|
40
|
+
* Enumerator
|
41
|
+
* Fixnum
|
42
|
+
* Hash
|
43
|
+
* Integer
|
44
|
+
* IO (& ARGF)
|
45
|
+
* Method
|
46
|
+
* Numeric
|
47
|
+
* Object
|
48
|
+
* ObjectSpace
|
49
|
+
* Range
|
50
|
+
* Regexp
|
33
51
|
* Symbol
|
34
|
-
|
52
|
+
* UnboundMethod
|
53
|
+
|
54
|
+
Only exceptions:
|
55
|
+
* GC.stress=
|
56
|
+
* Process.exec
|
57
|
+
* recursive data handling (Array and Hash)
|
58
|
+
|
59
|
+
As in Ruby 1.8.7+, there is no need to <tt>require 'enumerator'</tt> in older Ruby, and +Enumerator+ can be accessed directly (instead of <tt>Enumerable::Enumerator</tt>)
|
60
|
+
|
61
|
+
== Ruby 1.9
|
62
|
+
|
63
|
+
Additionally, the following Ruby 1.9 have been backported:
|
64
|
+
|
65
|
+
* Array
|
66
|
+
* +sample+
|
67
|
+
|
68
|
+
* Enumerable
|
69
|
+
* +each_with_object+
|
70
|
+
* +reverse_each+
|
71
|
+
|
72
|
+
* Enumerator
|
73
|
+
* +new+ (with block)
|
74
|
+
|
75
|
+
* Hash
|
76
|
+
* <tt>Hash[[[:foo, :bar],[:hello, "world"]]] ==> {:foo => :bar, :hello => "world"}</tt> (see _note_)
|
77
|
+
* <tt>default_proc=</tt>
|
78
|
+
|
35
79
|
* Kernel
|
36
80
|
* +require_relative+
|
81
|
+
|
82
|
+
* Object
|
83
|
+
* +define_singleton_method+
|
84
|
+
|
85
|
+
* Proc
|
86
|
+
* +yield+
|
87
|
+
|
88
|
+
* String
|
89
|
+
* +try_convert+
|
90
|
+
* <tt>ascii_only?</tt>
|
91
|
+
* +chr+
|
92
|
+
* +clear+
|
93
|
+
* +codepoints+, +each_codepoint+
|
94
|
+
|
95
|
+
_note_: This usage of <tt>Hash::[]</tt> is not yet documented[http://redmine.ruby-lang.org/issues/show/1385].
|
96
|
+
|
97
|
+
== Rails
|
98
|
+
|
99
|
+
Some generic methods from Rails methods have been copied:
|
100
|
+
|
101
|
+
* Enumerable
|
102
|
+
* +sum+
|
103
|
+
|
104
|
+
* Hash
|
105
|
+
* +symbolize_keys+, <tt>symbolize_keys!</tt>
|
106
|
+
* +reverse_merge+, <tt>reverse_merge!</tt>
|
107
|
+
|
37
108
|
* Module
|
38
109
|
* +alias_method_chain+
|
110
|
+
|
39
111
|
* Object
|
40
|
-
* +tap+, +returning+
|
41
112
|
* +try+
|
113
|
+
* +returning+
|
114
|
+
|
42
115
|
* String
|
43
|
-
* +each_char+, +chars+
|
44
|
-
* <tt>start_with?</tt>, <tt>end_with?</tt>
|
45
116
|
* +camelize+, +underscore+
|
46
117
|
* +dasherize+, +demodulize+
|
47
118
|
* +constantize+
|
48
|
-
* +partition+, +rpartition+
|
49
|
-
* Hash
|
50
|
-
* +symbolize_keys+, <tt>symbolize_keys!</tt>
|
51
|
-
* +reverse_merge+, <tt>reverse_merge!</tt>
|
52
|
-
* <tt>Hash[[[:foo, :bar],[:hello, "world"]]] ==> {:foo => :bar, :hello => "world"}</tt> (see _note_)
|
53
|
-
* +key+
|
54
|
-
* <tt>default_proc=</tt>
|
55
|
-
* Enumerable
|
56
|
-
* +sum+
|
57
|
-
* complete Ruby 1.8.7 backport
|
58
|
-
* Array
|
59
|
-
* complete Ruby 1.8.7 backport
|
60
|
-
* Fixnum
|
61
|
-
* complete Ruby 1.8.7 backport
|
62
|
-
* Proc
|
63
|
-
* +yield+
|
64
|
-
|
65
|
-
Finally, there is no need to <tt>require 'enumerator'</tt> in older Ruby, and +Enumerator+ can be accessed directly (instead of <tt>Enumerable::Enumerator</tt>)
|
66
|
-
|
67
|
-
_note_: This usage of <tt>Hash::[]</tt> is not yet documented[http://redmine.ruby-lang.org/issues/show/1385].
|
68
119
|
|
69
120
|
= License
|
70
121
|
|
71
122
|
+backports+ is released under the terms of the MIT License, see the included LICENSE file.
|
72
|
-
The code for backports was copied from rails when available.
|
73
123
|
|
74
124
|
Author:: Marc-André Lafortune
|
data/VERSION.yml
CHANGED
data/lib/backports.rb
CHANGED
@@ -10,6 +10,13 @@ module Kernel
|
|
10
10
|
end unless method_defined? :require_relative
|
11
11
|
end
|
12
12
|
|
13
|
-
|
13
|
+
class Array
|
14
|
+
# Standard in rails, and we use it in module.
|
15
|
+
def extract_options!
|
16
|
+
last.is_a?(::Hash) ? pop : {}
|
17
|
+
end unless method_defined? :extract_options!
|
18
|
+
end
|
19
|
+
|
20
|
+
%w(object module kernel object_space array enumerable enumerator string symbol integer fixnum hash proc binding dir io method regexp struct).each do |lib|
|
14
21
|
require_relative "backports/#{lib}"
|
15
22
|
end
|
data/lib/backports/array.rb
CHANGED
@@ -7,19 +7,7 @@ class Array
|
|
7
7
|
end
|
8
8
|
|
9
9
|
# Standard in Ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Array.html]
|
10
|
-
|
11
|
-
# Make block optional for...
|
12
|
-
[:collect!, :map!, :each, :each_index, :reverse_each, :reject, :reject!, :delete_if].each do |selector|
|
13
|
-
alias_method_chain(selector, :optional_block) do |aliased_target, punctuation|
|
14
|
-
module_eval <<-end_eval
|
15
|
-
def #{aliased_target}_with_optional_block#{punctuation}(*args, &block)
|
16
|
-
return to_enum(:#{aliased_target}_without_optional_block#{punctuation}, *args) unless block_given?
|
17
|
-
#{aliased_target}_without_optional_block#{punctuation}(*args, &block)
|
18
|
-
end
|
19
|
-
end_eval
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
10
|
+
make_block_optional :collect!, :map!, :each, :each_index, :reverse_each, :reject, :reject!, :delete_if, :test_on => [42]
|
23
11
|
|
24
12
|
# Standard in Ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Array.html]
|
25
13
|
def combination(num)
|
@@ -47,6 +35,8 @@ class Array
|
|
47
35
|
nb.to_i.times{each(&block)}
|
48
36
|
end unless method_defined? :cycle
|
49
37
|
|
38
|
+
# extract_options! in backports.rb
|
39
|
+
|
50
40
|
# flatten & flatten!, standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Array.html]
|
51
41
|
unless ([[]].flatten(1) rescue false)
|
52
42
|
|
@@ -72,8 +62,7 @@ class Array
|
|
72
62
|
alias_method_chain :flatten, :optional_argument
|
73
63
|
alias_method_chain :flatten!, :optional_argument
|
74
64
|
|
75
|
-
# Helper to recurse through flattening
|
76
|
-
# is not allowed to recurse itself. Detects recursive structures.
|
65
|
+
# Helper to recurse through flattening
|
77
66
|
# Adapted from rubinius'; recursion guards are not needed because level is finite
|
78
67
|
def recursively_flatten_finite(array, out, level)
|
79
68
|
ret = nil
|
@@ -116,19 +105,19 @@ class Array
|
|
116
105
|
end
|
117
106
|
|
118
107
|
def product(*arg)
|
119
|
-
arg.
|
120
|
-
|
108
|
+
arrays = [self, *arg].reverse
|
109
|
+
first_enum = Enumerator.new{|yielder| yielder.yield [] }
|
110
|
+
arrays.inject(first_enum) do |enum, array|
|
111
|
+
Enumerator.new do |yielder|
|
112
|
+
array.each do |obj|
|
113
|
+
enum.each do |partial_product|
|
114
|
+
yielder.yield [obj] + partial_product
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end.to_a
|
121
119
|
end unless method_defined? :product
|
122
|
-
|
123
|
-
def _partial_cartesian_product(combi, iterate_index, result)
|
124
|
-
action = iterate_index.zero? ? Proc.new(result << combi.dup) : Proc.new(_sub(combi, iterate_index-1, &block))
|
125
|
-
self[iterate_index].each do |obj|
|
126
|
-
combi[iterate_index] = obj
|
127
|
-
action.call
|
128
|
-
end
|
129
|
-
end
|
130
|
-
private :_partial_cartesian_product
|
131
|
-
|
120
|
+
|
132
121
|
# rindex
|
133
122
|
unless ([1].rindex{true} rescue false)
|
134
123
|
def rindex_with_block(*arg)
|
data/lib/backports/enumerable.rb
CHANGED
@@ -29,15 +29,7 @@ module Enumerable
|
|
29
29
|
to_a.cycle(*arg, &block)
|
30
30
|
end unless method_defined? :cycle
|
31
31
|
|
32
|
-
|
33
|
-
unless ([].detect rescue false)
|
34
|
-
def detect_with_optional_block(ifnone = nil, &block)
|
35
|
-
return to_enum(:detect, ifnone) unless block_given?
|
36
|
-
detect_without_optional_block(ifnone, &block)
|
37
|
-
end
|
38
|
-
alias_method_chain :detect, :optional_block
|
39
|
-
alias_method :find, :detect
|
40
|
-
end
|
32
|
+
make_block_optional :detect, :find, :test_on => [42]
|
41
33
|
|
42
34
|
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Enumerable.html]
|
43
35
|
def drop(n)
|
@@ -56,24 +48,7 @@ module Enumerable
|
|
56
48
|
end unless method_defined? :drop_while
|
57
49
|
|
58
50
|
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Enumerable.html]
|
59
|
-
|
60
|
-
def each_cons_with_optional_block(len, &block)
|
61
|
-
raise ArgumentError, "invalid size" if len <= 0
|
62
|
-
return to_enum(:each_cons, len) unless block_given?
|
63
|
-
each_cons_without_optional_block(len, &block)
|
64
|
-
end
|
65
|
-
alias_method_chain :each_cons, :optional_block
|
66
|
-
end
|
67
|
-
|
68
|
-
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Enumerable.html]
|
69
|
-
unless ((1..2).each_slice(1) rescue false)
|
70
|
-
def each_slice_with_optional_block(len, &block)
|
71
|
-
raise ArgumentError, "invalid slice size" if len <= 0
|
72
|
-
return to_enum(:each_slice, len) unless block_given?
|
73
|
-
each_slice_without_optional_block(len, &block)
|
74
|
-
end
|
75
|
-
alias_method_chain :each_slice, :optional_block
|
76
|
-
end
|
51
|
+
make_block_optional :each_cons, :each_slice, :test_on => 1..2, :arg => 1
|
77
52
|
|
78
53
|
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Enumerable.html]
|
79
54
|
if instance_method(:each_with_index).arity.zero?
|
@@ -93,6 +68,7 @@ module Enumerable
|
|
93
68
|
|
94
69
|
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Enumerable.html]
|
95
70
|
def find_index(*args)
|
71
|
+
raise ArgumentError, "Wrong number of arguments (#{args.size} for 1)" if args.size > 1
|
96
72
|
if args.size == 1
|
97
73
|
obj = args.first
|
98
74
|
each_with_index do |element, i|
|
@@ -104,7 +80,7 @@ module Enumerable
|
|
104
80
|
end
|
105
81
|
each_with_index{|o,i| return i if yield o}
|
106
82
|
else
|
107
|
-
|
83
|
+
return to_enum(:find_index)
|
108
84
|
end
|
109
85
|
nil
|
110
86
|
end unless method_defined? :find_index
|
@@ -239,7 +215,3 @@ module Enumerable
|
|
239
215
|
end
|
240
216
|
|
241
217
|
end
|
242
|
-
|
243
|
-
class Enumerator
|
244
|
-
alias_method :with_object, :each_with_object unless method_defined? :with_object
|
245
|
-
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class Enumerator
|
2
|
+
alias_method :with_object, :each_with_object unless method_defined? :with_object
|
3
|
+
|
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
|
+
require 'generator'
|
13
|
+
@generator ||= Generator.new(self)
|
14
|
+
@generator.rewind
|
15
|
+
self
|
16
|
+
end unless method_defined? :rewind
|
17
|
+
|
18
|
+
# new with block, standard in Ruby 1.9
|
19
|
+
unless (self.new{} rescue false)
|
20
|
+
class Yielder
|
21
|
+
def initialize(&block)
|
22
|
+
@main_block = block
|
23
|
+
end
|
24
|
+
|
25
|
+
def each(&block)
|
26
|
+
@final_block = block
|
27
|
+
@main_block.call(self)
|
28
|
+
end
|
29
|
+
|
30
|
+
def yield(*arg)
|
31
|
+
@final_block.yield(*arg)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def initialize_with_optional_block(*arg, &block)
|
36
|
+
return initialize_without_optional_block(*arg, &nil) unless arg.empty? # Ruby 1.9 apparently ignores the block if any argument is present
|
37
|
+
initialize_without_optional_block(Yielder.new(&block))
|
38
|
+
end
|
39
|
+
alias_method_chain :initialize, :optional_block
|
40
|
+
end
|
41
|
+
end
|
data/lib/backports/fixnum.rb
CHANGED
@@ -4,30 +4,8 @@ class Fixnum
|
|
4
4
|
(self / n).round
|
5
5
|
end unless method_defined? :div
|
6
6
|
|
7
|
-
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Fixnum.html]
|
8
|
-
def even?
|
9
|
-
self & 1 == 0
|
10
|
-
end unless method_defined? :even?
|
11
|
-
|
12
7
|
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Fixnum.html]
|
13
8
|
def fdiv(n)
|
14
9
|
to_f / n
|
15
10
|
end unless method_defined? :fdiv
|
16
|
-
|
17
|
-
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Fixnum.html]
|
18
|
-
def odd?
|
19
|
-
self & 1 == 1
|
20
|
-
end unless method_defined? :odd?
|
21
|
-
|
22
|
-
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Fixnum.html]
|
23
|
-
def succ
|
24
|
-
self + 1
|
25
|
-
end unless method_defined? :succ
|
26
|
-
|
27
|
-
alias_method :magnitude, :abs unless method_defined? :magnitude
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
11
|
end
|
data/lib/backports/hash.rb
CHANGED
@@ -16,16 +16,13 @@ class Hash
|
|
16
16
|
end unless method_defined? :to_hash
|
17
17
|
end
|
18
18
|
|
19
|
-
|
20
|
-
def symbolize_keys
|
21
|
-
Hash[map{|key,value| [(key.to_sym rescue key) || key, value] }]
|
22
|
-
end unless method_defined? :symbolize_keys
|
23
|
-
|
24
|
-
# Standard in rails. See official documentation[http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Keys.html]
|
25
|
-
def symbolize_keys!
|
26
|
-
self.replace(self.symbolize_keys)
|
27
|
-
end unless method_defined? :symbolize_keys!
|
19
|
+
make_block_optional :delete_if, :each, :each_key, :each_pair, :each_value, :reject!, :select, :test_on => {:hello => "world!"}
|
28
20
|
|
21
|
+
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Hash.html]
|
22
|
+
def default_proc=(proc)
|
23
|
+
replace(Hash.new(&proc).merge!(self))
|
24
|
+
end unless method_defined? :default_proc=
|
25
|
+
|
29
26
|
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Hash.html]
|
30
27
|
alias_method :key, :index unless method_defined? :key
|
31
28
|
|
@@ -39,8 +36,27 @@ class Hash
|
|
39
36
|
replace(reverse_merge(other_hash))
|
40
37
|
end
|
41
38
|
|
42
|
-
# Standard in
|
43
|
-
def
|
44
|
-
|
45
|
-
end unless method_defined? :
|
39
|
+
# Standard in rails. See official documentation[http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Keys.html]
|
40
|
+
def symbolize_keys
|
41
|
+
Hash[map{|key,value| [(key.to_sym rescue key) || key, value] }]
|
42
|
+
end unless method_defined? :symbolize_keys
|
43
|
+
|
44
|
+
# Standard in rails. See official documentation[http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Keys.html]
|
45
|
+
def symbolize_keys!
|
46
|
+
self.replace(self.symbolize_keys)
|
47
|
+
end unless method_defined? :symbolize_keys!
|
48
|
+
|
49
|
+
# Standard in rails. See official documentation[http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Keys.html]
|
50
|
+
def stringify_keys
|
51
|
+
Hash[map{|key,value| [key.to_s, value] }]
|
52
|
+
end unless method_defined? :stringify_keys
|
53
|
+
|
54
|
+
# Standard in rails. See official documentation[http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Keys.html]
|
55
|
+
def stringify_keys!
|
56
|
+
self.replace(self.stringify_keys)
|
57
|
+
end unless method_defined? :stringify_keys!
|
58
|
+
end
|
59
|
+
|
60
|
+
class << ENV
|
61
|
+
make_block_optional :delete_if, :each, :each_key, :each_pair, :each_value, :reject!, :select, :test_on => ENV
|
46
62
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
class Integer
|
2
|
+
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Fixnum.html]
|
3
|
+
def even?
|
4
|
+
self[0].zero?
|
5
|
+
end unless method_defined? :even?
|
6
|
+
|
7
|
+
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Fixnum.html]
|
8
|
+
def odd?
|
9
|
+
!even?
|
10
|
+
end unless method_defined? :odd?
|
11
|
+
|
12
|
+
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Fixnum.html]
|
13
|
+
def ord
|
14
|
+
self
|
15
|
+
end
|
16
|
+
|
17
|
+
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Fixnum.html]
|
18
|
+
def succ
|
19
|
+
self + 1
|
20
|
+
end unless method_defined? :succ
|
21
|
+
|
22
|
+
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/Fixnum.html]
|
23
|
+
def pred
|
24
|
+
self - 1
|
25
|
+
end unless method_defined? :succ
|
26
|
+
|
27
|
+
alias_method :magnitude, :abs unless method_defined? :magnitude
|
28
|
+
|
29
|
+
make_block_optional :downto, :times, :upto, :test_on => 42, :arg => 42
|
30
|
+
end
|
31
|
+
|
32
|
+
class Numeric
|
33
|
+
make_block_optional :step, :test_on => 42, :arg => [100, 6]
|
34
|
+
end
|
data/lib/backports/io.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
module Kernel
|
2
|
+
unless const_defined? :StopIteration
|
3
|
+
|
4
|
+
class StopIteration < IndexError; end
|
5
|
+
|
6
|
+
def loop_with_stop_iteration(&block)
|
7
|
+
loop_without_stop_iteration(&block)
|
8
|
+
rescue StopIteration
|
9
|
+
# ignore silently
|
10
|
+
end
|
11
|
+
alias_method_chain :loop, :stop_iteration
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
def __callee__
|
16
|
+
caller(1).first[/`(.*)'/,1].try(:to_sym)
|
17
|
+
end unless (__callee__ || true rescue false)
|
18
|
+
|
19
|
+
alias_method :__method__, :__callee__ unless (__method__ || true rescue false)
|
20
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
unless Method.method_defined? :name
|
2
|
+
class Method
|
3
|
+
attr_accessor :name, :receiver, :owner
|
4
|
+
|
5
|
+
def unbind_with_additional_info
|
6
|
+
returning unbind_without_additional_info do |unbound|
|
7
|
+
unbound.name = name
|
8
|
+
unbound.owner = owner
|
9
|
+
end
|
10
|
+
end
|
11
|
+
alias_method_chain :unbind, :additional_info
|
12
|
+
end
|
13
|
+
|
14
|
+
class UnboundMethod
|
15
|
+
attr_accessor :name, :owner
|
16
|
+
|
17
|
+
def bind_with_additional_info(to)
|
18
|
+
returning bind_without_additional_info(to) do |bound|
|
19
|
+
bound.name = name
|
20
|
+
bound.owner = owner
|
21
|
+
bound.receiver = to
|
22
|
+
end
|
23
|
+
end
|
24
|
+
alias_method_chain :bind, :additional_info
|
25
|
+
end
|
26
|
+
|
27
|
+
class Object
|
28
|
+
def method_with_additional_info(name)
|
29
|
+
returning method_without_additional_info(name) do |bound|
|
30
|
+
bound.name = name.to_sym
|
31
|
+
bound.receiver = self
|
32
|
+
bound.owner = self.class.ancestors.find{|mod| mod.instance_methods(false).include? name.to_s}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
alias_method_chain :method, :additional_info
|
36
|
+
end
|
37
|
+
|
38
|
+
class Module
|
39
|
+
def instance_method_with_additional_info(name)
|
40
|
+
returning instance_method_without_additional_info(name) do |unbound|
|
41
|
+
unbound.name = name.to_sym
|
42
|
+
unbound.owner = ancestors.find{|mod| mod.instance_methods(false).include? name.to_s}
|
43
|
+
end
|
44
|
+
end
|
45
|
+
alias_method_chain :instance_method, :additional_info
|
46
|
+
end
|
47
|
+
end
|
data/lib/backports/module.rb
CHANGED
@@ -20,4 +20,28 @@ class Module
|
|
20
20
|
private target
|
21
21
|
end
|
22
22
|
end unless method_defined? :alias_method_chain
|
23
|
+
|
24
|
+
alias_method :module_exec, :instance_exec unless method_defined? :module_exec
|
25
|
+
alias_method :class_exec, :module_exec unless method_defined? :class_exec
|
26
|
+
|
27
|
+
# Metaprogramming utility to make block optional.
|
28
|
+
# Tests first if block is already optional when given options
|
29
|
+
def make_block_optional(*methods)
|
30
|
+
options = methods.extract_options!
|
31
|
+
methods.each do |selector|
|
32
|
+
next unless method_defined? selector
|
33
|
+
unless options.empty?
|
34
|
+
test_on = options[:test_on] || self.new
|
35
|
+
next if (test_on.send(selector, *options.fetch(:arg, [])) rescue false)
|
36
|
+
end
|
37
|
+
alias_method_chain(selector, :optional_block) do |aliased_target, punctuation|
|
38
|
+
module_eval <<-end_eval
|
39
|
+
def #{aliased_target}_with_optional_block#{punctuation}(*args, &block)
|
40
|
+
return to_enum(:#{aliased_target}_without_optional_block#{punctuation}, *args) unless block_given?
|
41
|
+
#{aliased_target}_without_optional_block#{punctuation}(*args, &block)
|
42
|
+
end
|
43
|
+
end_eval
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
23
47
|
end
|
data/lib/backports/object.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'enumerator'
|
2
2
|
|
3
|
-
|
3
|
+
module Kernel # Did you know that object instance methods are defined in Kernel?
|
4
|
+
|
4
5
|
# Standard in rails. See official documentation[http://api.rubyonrails.org/classes/Object.html]
|
5
6
|
def try(method_id, *args, &block)
|
6
7
|
send(method_id, *args, &block) unless self.nil? #todo: check new def
|
@@ -19,4 +20,15 @@ class Object
|
|
19
20
|
end unless method_defined? :returning
|
20
21
|
|
21
22
|
Enumerator = Enumerable::Enumerator unless const_defined? :Enumerator # Standard in ruby 1.9
|
22
|
-
|
23
|
+
|
24
|
+
def define_singleton_method(symbol, &block)
|
25
|
+
class << self
|
26
|
+
self
|
27
|
+
end.send(:define_method, symbol, block)
|
28
|
+
end unless method_defined? :define_singleton_method
|
29
|
+
|
30
|
+
def instance_exec(*arg, &block)
|
31
|
+
define_singleton_method(:"temporary method for instance_exec", &block)
|
32
|
+
send(:"temporary method for instance_exec", *arg)
|
33
|
+
end unless method_defined? :instance_exec
|
34
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class Regexp
|
2
|
+
class << self
|
3
|
+
unless (union(%w(a b)) rescue false)
|
4
|
+
def union_with_array_argument(*arg)
|
5
|
+
return union_without_array_argument(*arg) unless arg.size == 1
|
6
|
+
union_without_array_argument(*arg.first)
|
7
|
+
end
|
8
|
+
alias_method_chain :union, :array_argument
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
data/lib/backports/string.rb
CHANGED
@@ -1,13 +1,93 @@
|
|
1
1
|
class String
|
2
|
+
class << self
|
3
|
+
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/String.html]
|
4
|
+
def try_convert(x)
|
5
|
+
return nil unless x.respond_do(:to_str)
|
6
|
+
x.to_str
|
7
|
+
end unless method_defined? :try_convert
|
8
|
+
end
|
9
|
+
|
10
|
+
def ascii_only?
|
11
|
+
!(self =~ /[^\x00-\x7f]/)
|
12
|
+
end unless method_defined? :ascii_only?
|
13
|
+
|
14
|
+
alias_method :bytesize, :length unless method_defined? :bytesize
|
15
|
+
|
16
|
+
# Standard in rails. See official documentation[http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/String/Inflections.html]
|
17
|
+
def camelize(first_letter = :upper)
|
18
|
+
if first_letter == :upper
|
19
|
+
gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
20
|
+
else
|
21
|
+
first.downcase + camelize[1..-1]
|
22
|
+
end
|
23
|
+
end unless method_defined? :camelize
|
24
|
+
|
2
25
|
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/String.html]
|
3
|
-
def
|
4
|
-
|
5
|
-
|
6
|
-
|
26
|
+
def chr
|
27
|
+
chars.first
|
28
|
+
end unless method_defined? :chr?
|
29
|
+
|
30
|
+
|
31
|
+
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/String.html]
|
32
|
+
def clear
|
33
|
+
self[0,length] = ""
|
34
|
+
self
|
35
|
+
end unless method_defined? :clear?
|
36
|
+
|
37
|
+
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/String.html]
|
38
|
+
def codepoints
|
39
|
+
return to_enum(:codepoints) unless block_given?
|
40
|
+
each_char.each do |s|
|
41
|
+
utf8 = s.each_byte.to_a
|
42
|
+
utf8[0] &= 0xff >> utf8.size # clear high bits (1 to 4, depending of number of bytes used)
|
43
|
+
yield utf8.inject{|result, b| (result << 6) + (b & 0x3f) }
|
7
44
|
end
|
8
|
-
|
9
|
-
|
45
|
+
end unless method_defined? :codepoints
|
46
|
+
|
47
|
+
# Standard in rails. See official documentation[http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/String/Inflections.html]
|
48
|
+
def constantize(camel_cased_word)
|
49
|
+
names = camel_cased_word.split('::')
|
50
|
+
names.shift if names.empty? || names.first.empty?
|
51
|
+
|
52
|
+
constant = Object
|
53
|
+
names.each do |name|
|
54
|
+
constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
|
55
|
+
end
|
56
|
+
constant
|
57
|
+
end unless method_defined? :constantize
|
58
|
+
|
59
|
+
# Standard in rails. See official documentation[http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/String/Inflections.html]
|
60
|
+
def dasherize(underscored_word)
|
61
|
+
underscored_word.gsub(/_/, '-')
|
62
|
+
end unless method_defined? :dasherize
|
63
|
+
|
64
|
+
# Standard in rails. See official documentation[http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/String/Inflections.html]
|
65
|
+
def demodulize(class_name_in_module)
|
66
|
+
class_name_in_module.to_s.gsub(/^.*::/, '')
|
67
|
+
end unless method_defined? :demodulize
|
68
|
+
|
69
|
+
make_block_optional :each_byte, :each, :each_line, :test_on => "abc"
|
70
|
+
|
71
|
+
unless ("abc".gsub(/./) rescue false)
|
72
|
+
def gsub_with_optional_block(*arg, &block)
|
73
|
+
return to_enum(:gsub_with_optional_block, *arg) unless block_given? || arg.size > 1
|
74
|
+
gsub_without_optional_block(*arg, &block)
|
75
|
+
end
|
76
|
+
alias_method_chain :gsub, :optional_block
|
77
|
+
end
|
78
|
+
|
79
|
+
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/String.html]
|
80
|
+
unless method_defined? :each_char
|
81
|
+
def each_char(&block)
|
82
|
+
return to_enum(:each_char) unless block_given?
|
83
|
+
scan(/./, &block)
|
84
|
+
end
|
85
|
+
|
86
|
+
alias_method :chars, :each_char unless method_defined? :chars
|
87
|
+
end
|
10
88
|
|
89
|
+
alias_method :each_codepoint, :codepoints unless method_defined? :each_codepoint
|
90
|
+
|
11
91
|
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/String.html]
|
12
92
|
def end_with?(*suffixes)
|
13
93
|
suffixes.each do |suffix|
|
@@ -22,17 +102,6 @@ class String
|
|
22
102
|
self[i]
|
23
103
|
end unless method_defined? :getbyte
|
24
104
|
|
25
|
-
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/String.html]
|
26
|
-
unless method_defined? :each_char
|
27
|
-
def each_char(&block)
|
28
|
-
return to_enum(:each_char) unless block_given?
|
29
|
-
scan(/./, &block)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
alias_method :chars, :each_char unless method_defined? :chars
|
34
|
-
|
35
|
-
|
36
105
|
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/String.html]
|
37
106
|
unless ("check partition".partition(" ") rescue false)
|
38
107
|
def partition_with_new_meaning(*args, &block)
|
@@ -68,14 +137,14 @@ class String
|
|
68
137
|
end unless method_defined? :rpartition
|
69
138
|
|
70
139
|
|
71
|
-
# Standard in
|
72
|
-
def
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
first.downcase + camelize[1..-1]
|
140
|
+
# Standard in ruby 1.9. See official documentation[http://ruby-doc.org/core-1.9/classes/String.html]
|
141
|
+
def start_with?(*prefixes)
|
142
|
+
prefixes.each do |prefix|
|
143
|
+
prefix = prefix.to_s
|
144
|
+
return true if self[0, prefix.length] == prefix
|
77
145
|
end
|
78
|
-
|
146
|
+
false
|
147
|
+
end unless method_defined? :start_with?
|
79
148
|
|
80
149
|
# Standard in rails. See official documentation[http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/String/Inflections.html]
|
81
150
|
def underscore(camel_cased_word)
|
@@ -86,26 +155,13 @@ class String
|
|
86
155
|
downcase
|
87
156
|
end unless method_defined? :underscore
|
88
157
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
names.each do |name|
|
96
|
-
constant = constant.const_defined?(name) ? constant.const_get(name) : constant.const_missing(name)
|
158
|
+
unless ("abc".upto("def", true) rescue false)
|
159
|
+
def upto_with_exclusive(to, excl=false, &block)
|
160
|
+
enum = Range.new(self, to, excl).to_enum
|
161
|
+
return enum unless block_given?
|
162
|
+
enum.each(&block)
|
163
|
+
self
|
97
164
|
end
|
98
|
-
|
99
|
-
end
|
100
|
-
|
101
|
-
# Standard in rails. See official documentation[http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/String/Inflections.html]
|
102
|
-
def dasherize(underscored_word)
|
103
|
-
underscored_word.gsub(/_/, '-')
|
104
|
-
end unless method_defined? :dasherize
|
105
|
-
|
106
|
-
# Standard in rails. See official documentation[http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/String/Inflections.html]
|
107
|
-
def demodulize(class_name_in_module)
|
108
|
-
class_name_in_module.to_s.gsub(/^.*::/, '')
|
109
|
-
end unless method_defined? :demodulize
|
110
|
-
|
165
|
+
alias_method_chain :upto, :exclusive
|
166
|
+
end
|
111
167
|
end
|
data/lib/backports/symbol.rb
CHANGED
@@ -3,4 +3,18 @@ class Symbol
|
|
3
3
|
def to_proc
|
4
4
|
Proc.new { |*args| args.shift.__send__(self, *args) }
|
5
5
|
end unless :to_proc.respond_to?(:to_proc)
|
6
|
+
|
7
|
+
include Enumerable
|
8
|
+
|
9
|
+
[ [%w(<=> casecmp), {:before => "return nil unless args.first.is_a? Symbol" }],
|
10
|
+
[%w(capitalize downcase next succ swapcase upcase), {:after => ".to_s"}],
|
11
|
+
[%w(=~ [] empty? length match size), {}]
|
12
|
+
].each { |methods, options| methods.each do |method|
|
13
|
+
module_eval <<-end_eval
|
14
|
+
def #{method}(*args)
|
15
|
+
#{options[:before]}
|
16
|
+
to_s.#{method}(*args)#{options[:after]}
|
17
|
+
end unless method_defined? :#{method}
|
18
|
+
end_eval
|
19
|
+
end }
|
6
20
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class BindingTest < Test::Unit::TestCase
|
4
|
+
class Demo
|
5
|
+
def initialize(n)
|
6
|
+
@secret = n
|
7
|
+
end
|
8
|
+
def get_binding
|
9
|
+
return binding()
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
context "Binding" do
|
14
|
+
context "#eval" do
|
15
|
+
should "conform to doc" do
|
16
|
+
assert_equal 99, Demo.new(99).get_binding.eval("@secret")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/test/enumerable_test.rb
CHANGED
@@ -83,6 +83,16 @@ class EnumerableTest < Test::Unit::TestCase
|
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
86
|
+
context "#find" do
|
87
|
+
should "not require a block" do
|
88
|
+
assert_equal 3, (1..10).find.each {|item| item > 2 }
|
89
|
+
end
|
90
|
+
|
91
|
+
should "work as expected" do
|
92
|
+
assert_equal 3, (1..10).find {|item| item > 2 }
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
86
96
|
context "#find_index" do
|
87
97
|
should "conform to doc" do
|
88
98
|
assert_equal 3, %w{ant bat cat dog}.find_index {|item| item =~ /g/ }
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
|
4
|
+
class EnumeratorTest < Test::Unit::TestCase
|
5
|
+
context "Enumerator" do
|
6
|
+
context "#with_object" do
|
7
|
+
should "conform to doc" do
|
8
|
+
animals = %w(cat dog wombat).to_enum
|
9
|
+
hash = animals.with_object({}).each do |item, memo|
|
10
|
+
memo[item] = item.upcase.reverse
|
11
|
+
end
|
12
|
+
assert_equal({"cat"=>"TAC", "dog"=>"GOD", "wombat"=>"TABMOW"}, hash)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "#new" do
|
17
|
+
should "should accept block" do
|
18
|
+
enum = Enumerator.new do |yielder|
|
19
|
+
yielder.yield "This cool new syntax is sponsored by"
|
20
|
+
yielder.yield yielder.class
|
21
|
+
end
|
22
|
+
assert enum.is_a?(Enumerator)
|
23
|
+
2.times do
|
24
|
+
assert_equal ["This cool new syntax is sponsored by", Enumerator::Yielder], enum.to_a
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/test/kernel_test.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
$outside = __callee__
|
4
|
+
def fred
|
5
|
+
"I'm in #{__callee__.inspect}"
|
6
|
+
end
|
7
|
+
|
8
|
+
class KernelTest < Test::Unit::TestCase
|
9
|
+
context "Kernel" do
|
10
|
+
context ".loop" do
|
11
|
+
should "conform to doc" do
|
12
|
+
enum1 = [1, 2, 3].to_enum
|
13
|
+
enum2 = [10, 20].to_enum
|
14
|
+
r = []
|
15
|
+
loop do
|
16
|
+
r << enum1.next + enum2.next
|
17
|
+
end
|
18
|
+
assert_equal [11,22], r
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
context ".__callee__" do
|
24
|
+
should "conform to doc" do
|
25
|
+
assert_equal "I'm in :fred", fred
|
26
|
+
assert_equal nil, $outside
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/test/method_test.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ArrayTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "Method" do
|
6
|
+
setup do
|
7
|
+
@cat = "cat"
|
8
|
+
@bound = @cat.method(:upcase)
|
9
|
+
end
|
10
|
+
|
11
|
+
context "#name" do
|
12
|
+
should "conform to doc" do
|
13
|
+
assert_equal :upcase, @bound.name
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context "#owner" do
|
18
|
+
should "conform to doc" do
|
19
|
+
assert_equal String, @bound.owner
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "#receiver" do
|
24
|
+
should "conform to doc" do
|
25
|
+
assert @cat === @bound.receiver
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "Unbound" do
|
30
|
+
setup do
|
31
|
+
@unbound = @bound.unbind
|
32
|
+
end
|
33
|
+
|
34
|
+
context "#name" do
|
35
|
+
should "conform to doc" do
|
36
|
+
assert_equal :upcase, @unbound.name
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "#owner" do
|
41
|
+
should "conform to doc" do
|
42
|
+
assert_equal String, @unbound.owner
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "bound again" do
|
47
|
+
setup do
|
48
|
+
@dog = "dog"
|
49
|
+
@bound_again = @unbound.bind(@dog)
|
50
|
+
end
|
51
|
+
|
52
|
+
context "#name" do
|
53
|
+
should "conform to doc" do
|
54
|
+
assert_equal :upcase, @bound_again.name
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context "#owner" do
|
59
|
+
should "conform to doc" do
|
60
|
+
assert_equal String, @bound_again.owner
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context "#receiver" do
|
65
|
+
should "conform to doc" do
|
66
|
+
assert @dog === @bound_again.receiver
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/test/module_test.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class Thing
|
4
|
+
end
|
5
|
+
|
6
|
+
class ModuleTest < Test::Unit::TestCase
|
7
|
+
context "Module" do
|
8
|
+
context "#module_exec" do
|
9
|
+
should "conform to doc" do
|
10
|
+
name = :new_instance_variable
|
11
|
+
Thing.module_exec(name) do |iv_name|
|
12
|
+
attr_accessor iv_name
|
13
|
+
end
|
14
|
+
t = Thing.new
|
15
|
+
t.new_instance_variable = "wibble"
|
16
|
+
assert_equal "wibble", t.new_instance_variable
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/test/object_test.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ObjectTest < Test::Unit::TestCase
|
4
|
+
class KlassWithSecret
|
5
|
+
def initialize
|
6
|
+
@secret = 99
|
7
|
+
end
|
8
|
+
end
|
9
|
+
context "Object" do
|
10
|
+
context "#instance_exec" do
|
11
|
+
should "conform to doc" do
|
12
|
+
k = KlassWithSecret.new
|
13
|
+
assert_equal 104, k.instance_exec(5) {|x| @secret+x }
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context "#define_singleton_method" do
|
18
|
+
should "conform to doc" do
|
19
|
+
a = "cat"
|
20
|
+
a.define_singleton_method(:speak) do
|
21
|
+
"miaow"
|
22
|
+
end
|
23
|
+
assert_equal "miaow", a.speak
|
24
|
+
|
25
|
+
KlassWithSecret.class_eval do
|
26
|
+
define_method(:one) { "instance method" }
|
27
|
+
define_singleton_method(:two) { "class method" }
|
28
|
+
end
|
29
|
+
t = KlassWithSecret.new
|
30
|
+
assert_equal "instance method", t.one
|
31
|
+
assert_equal "class method", KlassWithSecret.two
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/test/regexp_test.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class RegexpTest < Test::Unit::TestCase
|
4
|
+
context "Regexp" do
|
5
|
+
context ".union" do
|
6
|
+
should "conform to doc" do
|
7
|
+
assert_equal /cat/ , Regexp.union("cat")
|
8
|
+
assert_equal /cat|dog/ , Regexp.union("cat", "dog")
|
9
|
+
assert_equal /cat|dog/ , Regexp.union(%w{ cat dog })
|
10
|
+
assert_equal /cat|(?i-mx:dog)/, Regexp.union("cat", /dog/i)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/test/string_test.rb
CHANGED
@@ -4,6 +4,14 @@ require 'test_helper'
|
|
4
4
|
|
5
5
|
class StringTest < Test::Unit::TestCase
|
6
6
|
context "String" do
|
7
|
+
context "#ascii_only?" do
|
8
|
+
should "conform to doc" do
|
9
|
+
assert_equal true, "dog".ascii_only?
|
10
|
+
assert_equal false, "δog".ascii_only?
|
11
|
+
assert_equal true, "\x00 to \x7f".ascii_only?
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
7
15
|
context "#chars" do
|
8
16
|
should "conform to doc" do
|
9
17
|
assert_equal ["d", "o", "g"], "dog".chars.to_a
|
@@ -13,6 +21,23 @@ class StringTest < Test::Unit::TestCase
|
|
13
21
|
assert_equal ["δ", "o", "g"], result
|
14
22
|
end
|
15
23
|
end
|
24
|
+
|
25
|
+
context "#chr" do
|
26
|
+
should "conform to doc" do
|
27
|
+
assert_equal "d", "dog".chr
|
28
|
+
assert_equal "δ", "δog".chr
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "#codepoints" do
|
33
|
+
should "conform to doc" do
|
34
|
+
assert_equal [100, 111, 103], "dog".codepoints.to_a
|
35
|
+
assert_equal [948, 111, 103], "δog".codepoints.to_a # Note, there is an error in Pragmatics' book
|
36
|
+
result = []
|
37
|
+
assert_equal "δog", "δog".codepoints.each {|b| result << b }
|
38
|
+
assert_equal [948, 111, 103], result
|
39
|
+
end
|
40
|
+
end
|
16
41
|
|
17
42
|
context "#start_with" do
|
18
43
|
should "conform to doc" do
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: backports
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Marc-Andr\xC3\xA9 Lafortune"
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-04-
|
12
|
+
date: 2009-04-29 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -30,17 +30,35 @@ files:
|
|
30
30
|
- VERSION.yml
|
31
31
|
- lib/backports.rb
|
32
32
|
- lib/backports/array.rb
|
33
|
+
- lib/backports/binding.rb
|
34
|
+
- lib/backports/dir.rb
|
33
35
|
- lib/backports/enumerable.rb
|
36
|
+
- lib/backports/enumerator.rb
|
34
37
|
- lib/backports/fixnum.rb
|
35
38
|
- lib/backports/hash.rb
|
39
|
+
- lib/backports/integer.rb
|
40
|
+
- lib/backports/io.rb
|
41
|
+
- lib/backports/kernel.rb
|
42
|
+
- lib/backports/method.rb
|
36
43
|
- lib/backports/module.rb
|
37
44
|
- lib/backports/object.rb
|
45
|
+
- lib/backports/object_space.rb
|
38
46
|
- lib/backports/proc.rb
|
47
|
+
- lib/backports/range.rb
|
48
|
+
- lib/backports/regexp.rb
|
39
49
|
- lib/backports/string.rb
|
50
|
+
- lib/backports/struct.rb
|
40
51
|
- lib/backports/symbol.rb
|
41
52
|
- test/array_test.rb
|
53
|
+
- test/binding_test.rb
|
42
54
|
- test/enumerable_test.rb
|
55
|
+
- test/enumerator_test.rb
|
43
56
|
- test/hash_test.rb
|
57
|
+
- test/kernel_test.rb
|
58
|
+
- test/method_test.rb
|
59
|
+
- test/module_test.rb
|
60
|
+
- test/object_test.rb
|
61
|
+
- test/regexp_test.rb
|
44
62
|
- test/string_test.rb
|
45
63
|
- test/test_helper.rb
|
46
64
|
has_rdoc: true
|
@@ -77,7 +95,14 @@ specification_version: 2
|
|
77
95
|
summary: Backports or ruby 1.8.7+ & rails for older ruby.
|
78
96
|
test_files:
|
79
97
|
- test/array_test.rb
|
98
|
+
- test/binding_test.rb
|
80
99
|
- test/enumerable_test.rb
|
100
|
+
- test/enumerator_test.rb
|
81
101
|
- test/hash_test.rb
|
102
|
+
- test/kernel_test.rb
|
103
|
+
- test/method_test.rb
|
104
|
+
- test/module_test.rb
|
105
|
+
- test/object_test.rb
|
106
|
+
- test/regexp_test.rb
|
82
107
|
- test/string_test.rb
|
83
108
|
- test/test_helper.rb
|