facets 2.8.1 → 2.8.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/HISTORY.rdoc +121 -91
  2. data/NOTES +13 -1
  3. data/demo/scenario_require.rdoc +0 -5
  4. data/lib/core/facets.rb +6 -382
  5. data/lib/core/facets/array.rb +4 -3
  6. data/lib/core/facets/array/product.rb +0 -9
  7. data/lib/core/facets/array/uniq_by.rb +18 -0
  8. data/lib/core/facets/binding/caller.rb +14 -18
  9. data/lib/core/facets/boolean.rb +75 -78
  10. data/lib/core/facets/denumerable.rb +3 -3
  11. data/lib/core/facets/dir/ascend.rb +2 -1
  12. data/lib/core/facets/enumerable/collapse.rb +12 -0
  13. data/lib/core/facets/enumerable/compact_map.rb +8 -4
  14. data/lib/core/facets/enumerable/defer.rb +3 -2
  15. data/lib/core/facets/enumerable/each_with_object.rb +38 -0
  16. data/lib/core/facets/enumerable/every.rb +4 -4
  17. data/lib/core/facets/enumerable/ewise.rb +22 -16
  18. data/lib/core/facets/enumerable/exclude.rb +13 -0
  19. data/lib/core/facets/enumerable/filter.rb +18 -8
  20. data/lib/core/facets/enumerable/find_yield.rb +37 -0
  21. data/lib/core/facets/enumerable/map_detect.rb +1 -28
  22. data/lib/core/facets/enumerable/map_with_index.rb +2 -2
  23. data/lib/core/facets/enumerable/per.rb +2 -2
  24. data/lib/core/facets/enumerable/purge.rb +43 -0
  25. data/lib/core/facets/enumerator.rb +70 -0
  26. data/lib/core/facets/enumerator/fx.rb +20 -0
  27. data/lib/core/facets/integer/multiple.rb +6 -2
  28. data/lib/core/facets/kernel/false.rb +2 -0
  29. data/lib/core/facets/kernel/true.rb +26 -0
  30. data/lib/core/facets/numeric/length.rb +2 -2
  31. data/lib/core/facets/numeric/spacing.rb +20 -0
  32. data/lib/core/facets/proc/bind_to.rb +9 -0
  33. data/lib/core/facets/string/exclude.rb +10 -0
  34. data/lib/core/facets/string/expand_tab.rb +6 -6
  35. data/lib/core/facets/time/future.rb +14 -0
  36. data/lib/core/facets/time/past.rb +1 -0
  37. data/lib/core/facets/unboundmethod/name.rb +22 -18
  38. data/lib/more/facets/date.rb +38 -3
  39. data/lib/more/facets/fileutils/cp_rx.rb +42 -0
  40. data/lib/more/facets/pathname.rb +1 -1
  41. data/meta/homepage +1 -1
  42. data/meta/released +1 -1
  43. data/meta/version +1 -1
  44. data/test/core/array/test_product.rb +0 -5
  45. data/test/core/enumerable/test_find_yield.rb +75 -0
  46. data/test/core/numeric/test_spacing.rb +12 -0
  47. data/test/core/unboundmethod/test_name.rb +3 -3
  48. metadata +36 -23
  49. data/MANIFEST +0 -756
  50. data/lib/core/facets/enumerable/collect.rb +0 -4
  51. data/lib/core/facets/enumerable/inject.rb +0 -30
  52. data/lib/core/facets/numeric/size.rb +0 -10
  53. data/lib/more/facets/enumerator.rb +0 -62
  54. data/lib/more/facets/tracepoint.rb +0 -209
  55. data/test/core/enumerable/test_map_detect.rb +0 -75
@@ -1,4 +0,0 @@
1
- # to be deprecated
2
- require 'facets/enumerable/map_with_index'
3
- require 'facets/enumerable/compact_map'
4
-
@@ -1,30 +0,0 @@
1
- module Enumerable
2
-
3
- # A small variation of #Inject that save one from having to
4
- # return the aggregating or memo argument.
5
- #
6
- # Say you want to count letters.
7
- #
8
- # some_text.inject!(Hash.new(0)) {|h,l| h[l] += 1}
9
- #
10
- # vs
11
- #
12
- # some_text.inject(Hash.new(0)) {|h,l| h[l] +=1; h}
13
- #
14
- # CREDIT: David Black, Louis J Scoras
15
-
16
- def inject!(s)
17
- k = s
18
- each { |i| yield(k, i) }
19
- k
20
- end
21
-
22
- # HERE AS BACKUP, TO ENSURE THE ABOVE HAS THE SAME FUNCTIONALITY.
23
- #def injecting(s)
24
- # inject(s) do |k, i|
25
- # yield(k, i); k
26
- # end
27
- #end
28
-
29
- end
30
-
@@ -1,10 +0,0 @@
1
- class Numeric
2
-
3
- # Returns +self+.
4
-
5
- def size
6
- self
7
- end
8
-
9
- end
10
-
@@ -1,62 +0,0 @@
1
- begin
2
- require 'enumerator' #if RUBY_VERSION < 1.9
3
- # for Ruby 1.8 -> 1.9 transition
4
- Enumerator = Enumerable::Enumerator unless defined? ::Enumerator
5
- rescue LoadError # Ruby 1.9 already has it built-in.
6
- end
7
-
8
- class Enumerator
9
-
10
- alias :old_initialize :initialize
11
-
12
- # Provides the ruby-1.9 block form of Enumerator, where you can write:
13
- #
14
- # obj = Enumerator.new do |yielder|
15
- # .. do stuff
16
- # yielder.yield data # or: yielder << data
17
- # .. etc
18
- # end
19
- #
20
- # When obj.each is called, the block is run once. It should call
21
- # yielder.yield with each item it wishes to generate.
22
- #
23
- # Example:
24
- #
25
- # fib = Enumerator.new { |y|
26
- # a = b = 1
27
- # loop {
28
- # y << a
29
- # a, b = b, a + b
30
- # }
31
- # }
32
- #
33
- # assert_equal [1, 1, 2, 3, 5, 8, 13, 21, 34, 55], fib.take(10)
34
-
35
- def initialize(*args, &block)
36
- if block_given?
37
- @body = block
38
- old_initialize(self, :_start)
39
- else
40
- old_initialize(*args)
41
- end
42
- end
43
-
44
- def _start(*args,&receiver) #:nodoc:
45
- @body.call(Yielder.new(receiver), *args)
46
- end
47
-
48
- # Wrapper to allow yielder.yield(output) or yielder << output
49
- # in the same way as ruby-1.9
50
-
51
- class Yielder #:nodoc:
52
- def initialize(proc)
53
- @proc = proc
54
- end
55
- def yield(*args)
56
- @proc[*args]
57
- end
58
- alias :<< :yield
59
- end
60
-
61
- end
62
-
@@ -1,209 +0,0 @@
1
- # = TracePoint
2
- #
3
- # A TracePoint is a Binding with the addition event information.
4
- # And it's a better way to use set_trace_func.
5
- #
6
- # A TracePoint is a Binding with the addition of event information.
7
- # Among other things, it functions very well as the join-point for
8
- # Event-based AOP.
9
- #
10
- # == Usage
11
- #
12
- # TracePoint.trace { |tp|
13
- # puts "#{tp.self.class}\t#{tp.called}\t#{tp.event}\t#{tp.return?}\t#{tp.back == tp.bind}"
14
- # }
15
- #
16
- # 1 + 1
17
- #
18
- # produces
19
- #
20
- # Class trace return true false
21
- # Object line false false
22
- # Fixnum + c-call false false
23
- # Fixnum + c-return false false
24
- #
25
- # == Notes
26
- #
27
- # You can't subclass Binding, so we delegate (which is better anyway).
28
- #
29
- # == Authors
30
- #
31
- # * Thomas Sawyer
32
- #
33
- # == Copying
34
- #
35
- # Copyright (c) 2005 Thomas Sawyer
36
- #
37
- # Ruby License
38
- #
39
- # This module is free software. You may use, modify, and/or redistribute this
40
- # software under the same terms as Ruby.
41
- #
42
- # This program is distributed in the hope that it will be useful, but WITHOUT
43
- # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
44
- # FOR A PARTICULAR PURPOSE.
45
-
46
- require 'facets/binding'
47
-
48
- # = CodePoint
49
- #
50
- # This is the same as a Binding. Not really needed, but I like consistency :)
51
-
52
- CodePoint = Binding
53
-
54
- # = TracePoint
55
- #
56
- # A TracePoint is a Binding with the addition of event information.
57
- # Among other things, it functions very well as the join-point for
58
- # Event-based AOP.
59
- #
60
- # == Usage
61
- #
62
- # TracePoint.trace { |tp|
63
- # puts "#{tp.self.class}\t#{tp.called}\t#{tp.event}\t#{tp.return?}\t#{tp.back == tp.bind}"
64
- # }
65
- #
66
- # 1 + 1
67
- #
68
- # produces
69
- #
70
- # Class trace return true false
71
- # Object line false false
72
- # Fixnum + c-call false false
73
- # Fixnum + c-return false false
74
- #
75
- # == Notes
76
- #
77
- # You can't subclass Binding, so we delegate (which is better anyway).
78
-
79
- class TracePoint #< Codepoint
80
-
81
- # -- class ---------------------
82
- class << self
83
-
84
- @@active = false
85
-
86
- def active ; @@active ; end
87
-
88
- def active=(x)
89
- @@active = x ? true : false
90
- unless @@active
91
- set_trace_func nil
92
- end
93
- end
94
-
95
- # Trace execution using a TracePoint.
96
- def trace # :yield:
97
- if active
98
- bb_stack = []
99
- set_trace_func proc{ |e, f, l, m, b, k|
100
- #(p e, f, l, m, b, k, @@bb_stack; puts "---") if $DEBUG
101
- if ['call','c-call','class'].include?(e)
102
- bb_stack << b
103
- elsif ['return','c-return','end'].include?(e)
104
- bb = bb_stack.pop
105
- end
106
- b = bb if ! b # this sucks!
107
- tp = TracePoint.new(e,m,b,bb)
108
- yield(tp)
109
- }
110
- end
111
- end
112
-
113
- end #class
114
-
115
- # -- instance -------------------
116
-
117
- attr_accessor :event, :binding, :back_binding
118
-
119
- # Until Ruby has a built-in way to get the name of the calling method
120
- # that information must be passed into the TracePoint.
121
- def initialize( event, method, bind, back_binding=bind )
122
- @event = event
123
- @method = method
124
- @binding = bind
125
- @back_binding = back_binding
126
- end
127
-
128
- # shorthand for binding
129
- def bind ; @binding ; end
130
-
131
- # shorthand for back_binding
132
- def back ; @back_binding ; end
133
-
134
- # Delegates "self" to the binding which
135
- # in turn delegates the binding object.
136
- def self ; @binding.self ; end
137
-
138
- # Returns the name of the event's method.
139
- # This could delegate to the binding if Ruby had
140
- # an internal way to retrieve the current method name.
141
- def callee ; @method ; end
142
- #def method ; @method ; end # TODO Conflict with Kernel#method?
143
- alias_method( :called, :callee ) # TODO deprecate
144
- alias_method( :method_name, :called ) # TODO deprecate
145
-
146
- # delegate to binding
147
- #def method_missing(meth, *args, &blk)
148
- # @binding.send(meth, *args, &blk)
149
- #end
150
-
151
- ### methods for working with events
152
-
153
- EVENT_MAP = {
154
- :all => ['call', 'c-call', 'return', 'c-return', 'line', 'class', 'end', 'raise'],
155
- :before => ['call', 'c-call'],
156
- :after => ['return', 'c-return'],
157
- :call => ['call'],
158
- :return => ['return'],
159
- :ccall => ['c-call'],
160
- :creturn => ['c-return'],
161
- :line => ['line'],
162
- :class => ['class'],
163
- :end => ['end'],
164
- :raise => ['raise']
165
- }
166
- def event_map(e) ; EVENT_MAP[e] ; end
167
-
168
- # Is the trace point defined or undefined?
169
- def event? ; !! @event ; end
170
- def eventless? ; ! @event ; end
171
-
172
- # For use in case conditions
173
- def ===(e)
174
- EVENT_MAP[e].include?(@event)
175
- end
176
-
177
- # Creates an <event>? method for each of the above event mappings.
178
- EVENT_MAP.each_pair { |m,v|
179
- define_method( "#{m}?" ){ v.include?(@event) }
180
- }
181
-
182
- end
183
-
184
-
185
-
186
- # _____ _
187
- # |_ _|__ ___| |_
188
- # | |/ _ \/ __| __|
189
- # | | __/\__ \ |_
190
- # |_|\___||___/\__|
191
- #
192
-
193
- # TODO
194
-
195
- =begin #test
196
-
197
- # Note: TracePoint will probably prove tricky to test, since
198
- # manipulating set_trace_func tends to wreak havoc on errors,
199
- # the call stack, and so on.
200
-
201
- TracePoint.active = true
202
-
203
- TracePoint.trace { |tp|
204
- puts "#{tp.self.class}\t#{tp.called}\t#{tp.event}\t#{tp.return?}\t#{tp.back == tp.bind}"
205
- }
206
-
207
- 1 + 1
208
-
209
- =end
@@ -1,75 +0,0 @@
1
- require 'facets/enumerable/map_detect'
2
- require 'test/unit'
3
-
4
- class TestEnumerable < Test::Unit::TestCase
5
-
6
- def test_map_detects_a_value
7
- assert_equal true, [true].map_detect { |value| value }
8
- end
9
-
10
- def test_map_detect_detects_correct_value
11
- assert_equal 1, [1].map_detect { |value| value }
12
- end
13
-
14
- def test_map_detect_returns_value_of_block
15
- assert_equal 4, [1].map_detect { |v| v + 3 }
16
- end
17
-
18
- def test_map_detect_detects_first_truthy_value
19
- assert_equal 1, [false, false, 1].map_detect { |value| value }
20
- end
21
-
22
- def test_map_detect_returns_value_when_block_is_true
23
- assert_equal true, [false].map_detect { |value| true }
24
- end
25
-
26
- def test_map_detect_returns_early_when_block_is_true
27
- val1 = lambda { :something }
28
- val2 = lambda { raise "This shouldn't be called" }
29
-
30
- assert_equal :something, [val1, val2].map_detect { |obj| obj.call }
31
- end
32
-
33
- def test_map_detect_returns_nil_when_block_returns_false_for_all_elements
34
- assert_equal nil, [1,2,3,4].map_detect { |value| false }
35
- end
36
-
37
- def test_map_detect_returns_nil_when_no_elements_in_collection
38
- assert_equal nil, [].map_detect { |v| }
39
- end
40
-
41
- def test_map_detect_can_have_return_value_specified_when_block_isnt_true
42
- assert_equal :a_value, [1,2,3].map_detect(:a_value) { |value| false }
43
- end
44
-
45
- def test_map_detect_documentation_correct
46
- obj1, obj2 = Object.new, Object.new
47
-
48
- class << obj1
49
- def foo?
50
- false
51
- end
52
-
53
- def foo
54
- raise
55
- end
56
- end
57
-
58
- class << obj2
59
- def foo?
60
- true
61
- end
62
-
63
- def foo
64
- "a value"
65
- end
66
- end
67
-
68
- assert_equal false, obj1.foo?
69
- assert_equal true, obj2.foo?
70
- assert_equal "a value", obj2.foo
71
-
72
- result = [obj1, obj2].map_detect { |obj| obj.foo if obj.foo? }
73
- assert_equal result, "a value"
74
- end
75
- end