status_enumerator 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.0.3
@@ -3,55 +3,68 @@ class StatusEnumerator
3
3
  raise ArgumentError, '%s is not redpond to #each' % target.class.name if target.nil? or !target.respond_to?(:each)
4
4
  @target = target
5
5
  end
6
-
7
- def each
8
- raise ArgumentError, 'no block given' unless block_given?
9
- c, stat = 0, Status.new
10
- @target.each do |i|
11
- stat.send(:put_next, i)
12
- c += 1
13
- if c == 3
14
- n = stat.send(:put_prev)
15
- stat.send(:set_flags, true, false)
16
- yield stat
17
- stat.send(:put_next, n)
18
- yield stat
19
- elsif c > 2
20
- yield stat
21
- end
22
- end.tap do
23
- if c > 0
24
- case c
25
- when 1
26
- stat.send(:put_next)
27
- stat.send(:set_flags, true, true)
28
- yield stat
29
- when 2
30
- stat.send(:set_flags, true, false)
31
- yield stat
32
- stat.send(:put_next)
33
- stat.send(:set_flags, false, true)
34
- yield stat
35
- else
36
- stat.send(:put_next)
37
- stat.send(:set_flags, false, true)
38
- yield stat
39
- end
40
- end
41
- end
6
+
7
+ def each(&block)
8
+ status_class.send(:new, nil, &block).send(:each_status, @target)
42
9
  end
43
10
 
44
- class Status # :nodoc:
11
+ def status_class; Status end
12
+
13
+ class Status
14
+ class <<self
15
+ private :new
16
+ end
17
+
45
18
  attr_reader :current, :prev, :next
46
19
  def first?; !!@first_p end
47
20
  def last?; !!@last_p end
48
21
 
49
22
  private
50
23
 
51
- def initialize
24
+ def initialize(owner, &block)
25
+ raise ArgumentError, '%s is not kind of StatusEnumerator::Status' % owner.inspect unless owner.nil? or owner.kind_of?(StatusEnumerator::Status)
26
+ raise ArgumentError, 'block not given' if owner.nil? and block.nil?
27
+ @owner, @block = owner, block || owner.instance_variable_get(:@block)
28
+
52
29
  @prev = @current = @next = nil
53
30
  @first_p = @last_p = true
54
31
  end
32
+
33
+ def each_status(enum)
34
+ c = 0
35
+ enum.each do |i|
36
+ put_next i
37
+ c += 1
38
+ if c == 3
39
+ n = put_prev
40
+ set_flags true, false
41
+ @block.call(self)
42
+ put_next n
43
+ @block.call(self)
44
+ elsif c > 2
45
+ @block.call(self)
46
+ end
47
+ end.tap do
48
+ if c > 0
49
+ case c
50
+ when 1
51
+ put_next
52
+ set_flags true, true
53
+ @block.call(self)
54
+ when 2
55
+ set_flags true, false
56
+ @block.call(self)
57
+ put_next
58
+ set_flags false, true
59
+ @block.call(self)
60
+ else
61
+ put_next
62
+ set_flags false, true
63
+ @block.call(self)
64
+ end
65
+ end
66
+ end
67
+ end
55
68
 
56
69
  def put_next(obj = nil)
57
70
  _prev, @prev, @current, @next = @prev, @current, @next, obj
data/spec/spec_helper.rb CHANGED
@@ -10,3 +10,24 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
10
10
  RSpec.configure do |config|
11
11
 
12
12
  end
13
+
14
+ class Foo
15
+ def initialize(value, *args)
16
+ @value, @children = value, args
17
+ end
18
+ attr_reader :value, :children
19
+
20
+ def self.conv(ary, &block)
21
+ ret = ary.map {|x| x.kind_of?(self) ? x.value : x }
22
+ ret = block.call(ret) if block
23
+ ary.each_with_index do |obj, i|
24
+ if obj.kind_of?(self)
25
+ o = conv(obj.children, &block)
26
+ o.unshift ret[i]
27
+ ret[i] = o
28
+ end
29
+ end
30
+ ret.flatten!
31
+ ret
32
+ end
33
+ end
@@ -158,4 +158,10 @@ describe StatusEnumerator do
158
158
  end
159
159
  end
160
160
  end
161
+
162
+ describe '#status_class' do
163
+ it 'gives back Status' do
164
+ StatusEnumerator.new([]).status_class.should == StatusEnumerator::Status
165
+ end
166
+ end
161
167
  end
@@ -0,0 +1,241 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe StatusEnumerator::Status do
4
+ def status_new(*args, &block); StatusEnumerator::Status.send(:new, *args, &block) end
5
+
6
+ it 'is Class' do
7
+ StatusEnumerator::Status.should be_instance_of(Class)
8
+ end
9
+
10
+ describe '.new(owner, &block)' do
11
+ it 'is private' do
12
+ StatusEnumerator::Status.tap do |x|
13
+ x.should be_respond_to(:new, true)
14
+ x.should_not be_respond_to(:new)
15
+ end
16
+ end
17
+
18
+ it 'stores owner in @owner' do
19
+ owner = status_new(nil) {}
20
+ status_new(owner) {}.instance_variable_get(:@owner).should == owner
21
+ end
22
+
23
+ it 'permits owner of nil' do
24
+ lambda { status_new(nil) {} }.should_not raise_error
25
+ end
26
+
27
+ it 'when owner is not kind of Status, it raises an ArgumentError' do
28
+ lambda { status_new(:symbol) {} }.should raise_error(ArgumentError)
29
+ end
30
+
31
+ it 'stores block in @block' do
32
+ func = lambda {|e| e == :ok }
33
+ status_new(nil, &func).instance_variable_get(:@block).should == func
34
+ end
35
+
36
+ it 'in case of owner is not nil and block is nil, it store @block of owner in @block' do
37
+ func = lambda {|e| e == :ok }
38
+ status_new(status_new(nil, &func)).instance_variable_get(:@block).should == func
39
+ end
40
+
41
+ it 'in the case of owner and block is nil, it raises an ArgumentError' do
42
+ lambda { status_new(nil) }.should raise_error(ArgumentError)
43
+ end
44
+ end
45
+
46
+ describe '(#each_status(enum))' do
47
+ before do
48
+ @count = 0
49
+ @call = nil
50
+ @each = status_new(nil) do |e|
51
+ @call.call(e) if @call
52
+ @count += 1
53
+ end
54
+ end
55
+ def do_each(enum); @each.send(:each_status, enum) end
56
+
57
+ it 'calls a block set by @block' do
58
+ flag = false
59
+ @each.instance_variable_set(:@block, lambda { flag = true })
60
+ do_each([1,2,3])
61
+ flag.should == true
62
+ end
63
+
64
+ it 'in the case of 0, a number of element of enum does not call a block' do
65
+ do_each([])
66
+ @count.should == 0
67
+ end
68
+
69
+ it 'calls an element of enum once' do
70
+ obj = [:dfa, 1532, /reg/, 'sample', Enumerable, 55.5]
71
+ do_each(obj)
72
+ @count.should == obj.size
73
+ end
74
+ end
75
+
76
+ describe do
77
+ before :all do
78
+ @enum_single = [1]
79
+ @enum_double = [156.3, :ee]
80
+ @enum_triple = ['sam', /ple/, true]
81
+ @enum_many = [:a, 2, 3.0, 'd', /e/, true, nil, false, 'sample', 10]
82
+ end
83
+ before do
84
+ @count, @result, @call = 0, [], lambda { }
85
+ @each = status_new(nil) do |e|
86
+ @result.push @call.call(e)
87
+ @count += 1
88
+ end
89
+ end
90
+ def do_each(enum)
91
+ @each.send(:each_status, enum)
92
+ @count.should == enum.size
93
+ @result
94
+ end
95
+
96
+ describe '#first?' do
97
+ before do
98
+ @call = lambda {|x| x.first? }
99
+ end
100
+ def make_result(enum)
101
+ Array.new(enum.size, false).tap {|x| x[0] = true }
102
+ end
103
+
104
+ it 'initalized true' do
105
+ @each.first?.should == true
106
+ end
107
+
108
+ it 'puts back true to only the first value(single ary)' do
109
+ do_each(@enum_single).should == [true]
110
+ end
111
+
112
+ it 'puts back true to only the first value(double ary)' do
113
+ do_each(@enum_double).should == make_result(@enum_double)
114
+ end
115
+
116
+ it 'puts back true to only the first value(triple ary)' do
117
+ do_each(@enum_triple).should == make_result(@enum_triple)
118
+ end
119
+
120
+ it 'puts back true to only the first value(many ary)' do
121
+ do_each(@enum_many).should == make_result(@enum_many)
122
+ end
123
+ end
124
+
125
+ describe '#last?' do
126
+ before do
127
+ @call = lambda {|x| x.last? }
128
+ end
129
+ def make_result(enum)
130
+ Array.new(enum.size, false).tap {|x| x[-1] = true }
131
+ end
132
+
133
+ it 'initalized true' do
134
+ @each.last?.should == true
135
+ end
136
+
137
+ it 'puts back true to only the last value(single ary)' do
138
+ do_each(@enum_single).should == [true]
139
+ end
140
+
141
+ it 'puts back true to only the last value(double ary)' do
142
+ do_each(@enum_double).should == make_result(@enum_double)
143
+ end
144
+
145
+ it 'puts back true to only the last value(triple ary)' do
146
+ do_each(@enum_triple).should == make_result(@enum_triple)
147
+ end
148
+
149
+ it 'puts back true to only the last value(many ary)' do
150
+ do_each(@enum_many).should == make_result(@enum_many)
151
+ end
152
+ end
153
+
154
+ describe '#current' do
155
+ before do
156
+ @call = lambda {|x| x.current }
157
+ end
158
+ def make_result(enum)
159
+ enum
160
+ end
161
+
162
+ it 'initalized nil' do
163
+ @each.current.should be_nil
164
+ end
165
+
166
+ it 'puts back true to only the current value(single ary)' do
167
+ do_each(@enum_single).should == make_result(@enum_single)
168
+ end
169
+
170
+ it 'puts back true to only the current value(double ary)' do
171
+ do_each(@enum_double).should == make_result(@enum_double)
172
+ end
173
+
174
+ it 'puts back true to only the current value(triple ary)' do
175
+ do_each(@enum_triple).should == make_result(@enum_triple)
176
+ end
177
+
178
+ it 'puts back true to only the current value(many ary)' do
179
+ do_each(@enum_many).should == make_result(@enum_many)
180
+ end
181
+ end
182
+
183
+ describe '#prev' do
184
+ before do
185
+ @call = lambda {|x| x.prev }
186
+ end
187
+ def make_result(enum)
188
+ enum.dup.tap {|x| x.pop; x.unshift nil }
189
+ end
190
+
191
+ it 'initalized nil' do
192
+ @each.prev.should be_nil
193
+ end
194
+
195
+ it 'puts back true to only the prev value(single ary)' do
196
+ do_each(@enum_single).should == make_result(@enum_single)
197
+ end
198
+
199
+ it 'puts back true to only the prev value(double ary)' do
200
+ do_each(@enum_double).should == make_result(@enum_double)
201
+ end
202
+
203
+ it 'puts back true to only the prev value(triple ary)' do
204
+ do_each(@enum_triple).should == make_result(@enum_triple)
205
+ end
206
+
207
+ it 'puts back true to only the prev value(many ary)' do
208
+ do_each(@enum_many).should == make_result(@enum_many)
209
+ end
210
+ end
211
+
212
+ describe '#next' do
213
+ before do
214
+ @call = lambda {|x| x.next }
215
+ end
216
+ def make_result(enum)
217
+ enum.dup.tap {|x| x.shift; x.push nil }
218
+ end
219
+
220
+ it 'initalized nil' do
221
+ @each.next.should be_nil
222
+ end
223
+
224
+ it 'puts back true to only the next value(single ary)' do
225
+ do_each(@enum_single).should == make_result(@enum_single)
226
+ end
227
+
228
+ it 'puts back true to only the next value(double ary)' do
229
+ do_each(@enum_double).should == make_result(@enum_double)
230
+ end
231
+
232
+ it 'puts back true to only the next value(triple ary)' do
233
+ do_each(@enum_triple).should == make_result(@enum_triple)
234
+ end
235
+
236
+ it 'puts back true to only the next value(many ary)' do
237
+ do_each(@enum_many).should == make_result(@enum_many)
238
+ end
239
+ end
240
+ end
241
+ end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{status_enumerator}
8
- s.version = "0.0.2"
8
+ s.version = "0.0.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = [%q{Keiichiro Nishi}]
12
- s.date = %q{2011-05-30}
12
+ s.date = %q{2011-06-19}
13
13
  s.description = %q{This class provides an enumeration function to have the object which I added tree information to in an argument.
14
14
  The instance receives an enumerable object and provides #each and #each_method. The #each method calls a block in an argument in own. The #each_method method calls the method of an object appointed own in an argument.
15
15
  I have the information of the object equal to the ancestors in own and front and back and hierarchy structure, and a block and the argument handed to a method maintain the state flag in the enumeration again.
@@ -33,6 +33,7 @@ This class provides a function to enumerate it, but it is not the object which i
33
33
  "lib/status_enumerator.rb",
34
34
  "spec/spec_helper.rb",
35
35
  "spec/status_enumerator_spec.rb",
36
+ "spec/status_enumerator_status_spec.rb",
36
37
  "status_enumerator.gemspec"
37
38
  ]
38
39
  s.homepage = %q{http://github.com/Ktouth/status_enumerator}
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: status_enumerator
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 25
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 2
10
- version: 0.0.2
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Keiichiro Nishi
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-05-30 00:00:00 Z
18
+ date: 2011-06-19 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  prerelease: false
@@ -122,6 +122,7 @@ files:
122
122
  - lib/status_enumerator.rb
123
123
  - spec/spec_helper.rb
124
124
  - spec/status_enumerator_spec.rb
125
+ - spec/status_enumerator_status_spec.rb
125
126
  - status_enumerator.gemspec
126
127
  homepage: http://github.com/Ktouth/status_enumerator
127
128
  licenses: