inum 3.0.0 → 4.0.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.
data/lib/inum/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Inum
2
- VERSION = "3.0.0"
2
+ VERSION = "4.0.0"
3
3
  end
@@ -2,7 +2,7 @@ require 'rspec'
2
2
  require 'spec_helper'
3
3
 
4
4
  describe Inum::ActiveRecordMixin do
5
- create_temp_table(:tvs){|t| t.integer :anime; t.integer :favorite; t.integer :watching}
5
+ create_temp_table(:tvs){|t| t.integer :anime}
6
6
 
7
7
  before :each do
8
8
  class Anime < Inum::Base
@@ -12,13 +12,7 @@ describe Inum::ActiveRecordMixin do
12
12
  define :KMB, 4
13
13
  end
14
14
 
15
- class TV < ActiveRecord::Base
16
- bind_inum :column => :anime, :class => Anime
17
-
18
- bind_inum :column => :favorite, :class => Anime, :prefix => :fav, :allow_nil => true
19
-
20
- bind_inum :column => :watching, :class => Anime, :prefix => nil, :validation => false
21
- end
15
+ class TV < ActiveRecord::Base; end
22
16
  end
23
17
 
24
18
  after :each do
@@ -28,116 +22,87 @@ describe Inum::ActiveRecordMixin do
28
22
  end
29
23
  end
30
24
 
31
- let :tv do
32
- TV.create(anime: Anime::NYARUKO)
25
+ let :bind_class do
26
+ TV.tap {|klass| klass.instance_eval{ bind_inum :anime, Anime } }
33
27
  end
34
28
 
35
- context 'Comparison methods' do
36
- it 'Be defined' do
37
- expect(TV.method_defined?(:anime_nyaruko?)).to be_true
38
- expect(TV.method_defined?(:anime_muromisan?)).to be_true
39
- expect(TV.method_defined?(:anime_nourin?)).to be_true
40
- expect(TV.method_defined?(:anime_kmb?)).to be_true
41
- end
42
-
43
- it 'Can compare' do
44
- expect(tv.anime_nyaruko?).to be_true
45
- end
29
+ let :instance do
30
+ bind_class.create!(anime: type)
46
31
  end
47
32
 
48
- context 'getter' do
49
- it 'Can set enum' do
50
- tv.anime = Anime::NOURIN
51
- expect(tv.anime_nourin?).to be_true
52
- end
53
-
54
- it 'Can set integer' do
55
- tv.anime = 1
56
- expect(tv.anime_muromisan?).to be_true
57
- end
33
+ let :type do
34
+ Anime::NYARUKO
35
+ end
58
36
 
59
- it 'Can set string' do
60
- tv.anime = 'KMB'
61
- expect(tv.anime_kmb?).to be_true
37
+ describe 'Comparison methods' do
38
+ it 'Will be defined.' do
39
+ expect(bind_class.method_defined?(:anime_nyaruko?)).to be_truthy
40
+ expect(bind_class.method_defined?(:anime_muromisan?)).to be_truthy
41
+ expect(bind_class.method_defined?(:anime_nourin?)).to be_truthy
42
+ expect(bind_class.method_defined?(:anime_kmb?)).to be_truthy
62
43
  end
63
44
 
64
- it 'Can set symbol' do
65
- tv.anime = :KMB
66
- expect(tv.anime_kmb?).to be_true
45
+ it 'Return correct value.' do
46
+ expect(instance.anime_nyaruko?).to be_truthy
67
47
  end
68
48
  end
69
49
 
70
- it 'Prefix is enable, when prefix was set.' do
71
- expect(TV.method_defined?(:fav_nyaruko?)).to be_true
72
- expect(TV.method_defined?(:fav_muromisan?)).to be_true
73
- expect(TV.method_defined?(:fav_nourin?)).to be_true
74
- expect(TV.method_defined?(:fav_kmb?)).to be_true
75
- end
76
-
77
- it 'Prefix is nothing, when prefix is nil.' do
78
- expect(TV.method_defined?(:nyaruko?)).to be_true
79
- expect(TV.method_defined?(:muromisan?)).to be_true
80
- expect(TV.method_defined?(:nourin?)).to be_true
81
- expect(TV.method_defined?(:kmb?)).to be_true
82
- end
50
+ describe '#setter' do
51
+ subject do
52
+ expect {
53
+ instance.anime = target
54
+ }.to change {
55
+ instance.send(:read_attribute, :anime)
56
+ }.from(type.to_i).to(Anime.parse(target).to_i)
57
+ end
83
58
 
84
- it 'setter return enum' do
85
- expect(tv.anime.instance_of?(Anime)).to be_true
86
- end
59
+ context 'When enum' do
60
+ let(:target){ Anime::NOURIN }
87
61
 
88
- context 'update methods can update enum column' do
89
- it 'update' do
90
- tv.update!(anime: Anime::NOURIN)
91
- expect(tv.reload.anime).to eq(Anime::NOURIN)
62
+ it 'set value.' do
63
+ subject
64
+ end
92
65
  end
93
66
 
94
- it 'update_attribute' do
95
- tv.update_attribute(:anime, Anime::NOURIN)
96
- expect(tv.reload.anime).to eq(Anime::NOURIN)
97
- end
98
- end
67
+ context 'When integer' do
68
+ let(:target){ 1 }
99
69
 
100
- context 'validation' do
101
- let :validators do
102
- TV.validators.map{|v| v.attributes[0]}
70
+ it 'set value.' do
71
+ subject
72
+ end
103
73
  end
104
74
 
105
- it 'Enable validator' do
106
- expect(validators).to include(:anime)
107
- expect(validators).to include(:favorite)
108
- end
75
+ context 'When string' do
76
+ let(:target){ 'KMB' }
109
77
 
110
- it 'Disable validator when column has option of validation false.' do
111
- expect(validators).not_to include(:watching)
78
+ it 'set value.' do
79
+ subject
80
+ end
112
81
  end
113
82
 
114
- context 'valid' do
115
- it 'default is validation passed.' do
116
- expect(tv).to be_valid
117
- end
83
+ context 'When string' do
84
+ let(:target){ :KMB }
118
85
 
119
- it 'Correct values are validation passed.' do
120
- Anime.each do |enum|
121
- tv.anime = enum
122
- expect(tv).to be_valid
123
- end
86
+ it 'set value.' do
87
+ subject
124
88
  end
89
+ end
90
+ end
125
91
 
126
- it 'Incorrect values are validation failed.' do
127
- [-1000, 9999, 'Nothing!!', :Nothing].each do |value|
128
- tv.anime = value
129
- expect(tv).not_to be_valid
130
- end
131
- end
92
+ describe '#getter' do
93
+ it 'Return enum' do
94
+ expect(instance.anime.instance_of?(Anime)).to be_truthy
95
+ end
96
+ end
132
97
 
133
- it 'Can not set nil' do
134
- tv.anime = nil
135
- expect(tv).not_to be_valid
136
- end
98
+ context 'When with prefix option' do
99
+ let :bind_class do
100
+ TV.tap {|klass| klass.instance_eval{ bind_inum :anime, Anime, prefix: 'prefix' } }
101
+ end
137
102
 
138
- it 'Can set nil when column has option of allow_nil true.' do
139
- tv.favorite = nil
140
- expect(tv).to be_valid
103
+ describe 'Comparison methods' do
104
+ it 'Will be defined with prefix.' do
105
+ expect(bind_class.method_defined?(:prefix_nyaruko?)).to be_truthy
141
106
  end
142
107
  end
143
108
  end
@@ -2,214 +2,317 @@ require 'rspec'
2
2
  require 'spec_helper'
3
3
 
4
4
  describe Inum::Base do
5
-
6
- context 'When define enum,' do
7
- it 'Correct definition be validation passed.' do
8
- expect{
9
- Class.new(Inum::Base) { define :REDBULL, 0 }
5
+ describe '.define' do
6
+ context 'When define a correct enum' do
7
+ subject do
10
8
  Class.new(Inum::Base) {
11
- define :REDBULL, 0
12
- define :MONSTER, 1
9
+ define :RED_BULL, 0
10
+ define :MONSTER, 1
11
+ define :MONSTER2, 2
13
12
  }
14
- }.not_to raise_error
15
- end
16
-
17
- it 'Incorrect definition be validation failed.' do
18
- # wrong name.
19
- expect{
20
- Class.new(Inum::Base) { define 1111, 0 }
21
- }.to raise_error
13
+ end
22
14
 
23
- # wrong value.
24
- expect{
25
- Class.new(Inum::Base) { define :REDBULL, :no_int }
26
- }.to raise_error
15
+ it 'pass validation.' do
16
+ expect { subject }.not_to raise_error
17
+ end
18
+ end
27
19
 
28
- # dup name.
29
- expect{
20
+ context 'When define a omit a value enum' do
21
+ subject do
30
22
  Class.new(Inum::Base) {
31
- define :REDBULL, 0
32
- define :REDBULL, 1
23
+ define :RED_BULL
24
+ define :MONSTER
25
+ define :MONSTER2
33
26
  }
34
- }.to raise_error
27
+ end
35
28
 
36
- # dup value.
37
- expect{
38
- Class.new(Inum::Base) {
39
- define :REDBULL, 0
40
- define :MONSTER, 0
41
- }
42
- }.to raise_error
29
+ it 'pass validation.' do
30
+ expect { subject }.not_to raise_error
31
+ end
32
+
33
+ it 'auto incremented value.' do
34
+ expect(subject::RED_BULL.to_i).to eq(0)
35
+ expect(subject::MONSTER.to_i).to eq(1)
36
+ expect(subject::MONSTER2.to_i).to eq(2)
37
+ end
43
38
  end
44
39
 
45
- it 'Autoincrement value when without default value.' do
46
- enum = Class.new(Inum::Base) do
47
- define :REDBULL
48
- define :MONSTER
49
- define :BURN
40
+ context 'When define a enum having wrong label' do
41
+ subject do
42
+ Class.new(Inum::Base) {
43
+ define :red_bull, 0
44
+ }
50
45
  end
51
46
 
52
- expect(enum::REDBULL.value).to eq(0)
53
- expect(enum::MONSTER.value).to eq(1)
54
- expect(enum::BURN.value).to eq(2)
47
+ it 'fail validation.' do
48
+ expect { subject }.to raise_error
49
+ end
55
50
  end
56
51
 
57
- it 'Instances of enum are different each definition.' do
58
- first = Class.new(Inum::Base){ define :REDBULL }
59
- second = Class.new(Inum::Base){ define :MONSTER }
60
-
61
- first_enum_format = first.instance_variable_get(:@enum_format)
62
- second_enum_format = second.instance_variable_get(:@enum_format)
52
+ context 'When define a enum having duplicate label' do
53
+ subject do
54
+ Class.new(Inum::Base) {
55
+ define :RED_BULL, 0
56
+ define :RED_BULL, 1
57
+ }
58
+ end
63
59
 
64
- first_enums = first.instance_variable_get(:@enums)
65
- second_enums = second.instance_variable_get(:@enums)
60
+ it 'fail validation.' do
61
+ expect { subject }.to raise_error
62
+ end
63
+ end
66
64
 
67
- expect(first_enum_format.eql?(second_enum_format)).to be_false
68
- expect(first_enum_format.equal?(second_enum_format)).to be_false
65
+ context 'When define a enum having duplicate value' do
66
+ subject do
67
+ Class.new(Inum::Base) {
68
+ define :RED_BULL, 0
69
+ define :MONSTER, 0
70
+ }
71
+ end
69
72
 
70
- expect(first_enums.eql?(second_enums)).to be_false
71
- expect(first_enums.equal?(second_enums)).to be_false
73
+ it 'fail validation.' do
74
+ expect { subject }.to raise_error
75
+ end
72
76
  end
73
77
  end
74
78
 
75
-
76
- describe 'Defined Inum::Base' do
77
- before :each do
79
+ describe 'Defined enum class' do
80
+ before :all do
78
81
  class Anime < Inum::Base
79
82
  define :NYARUKO, 0
80
83
  define :MUROMISAN, 1
81
84
  define :NOURIN, 2
82
- define :KMB, 4
85
+ define :KMB, 3
83
86
  end
84
87
  end
85
88
 
86
- after :each do
89
+ after :all do
87
90
  Object.class_eval{ remove_const :Anime }
88
91
  end
89
92
 
90
- it 'Can not create instance.(Singleton)' do
91
- expect{ Anime.new(:NICONICO, 2525) }.to raise_error
92
- end
93
-
94
- it 'The instance of enum is equal.' do
95
- expect(Anime::NYARUKO.equal?(Anime.parse!('NYARUKO'))).to be_true
96
- end
93
+ describe '#<=>' do
94
+ context 'self == other' do
95
+ it 'Return 0.' do
96
+ expect(Anime::MUROMISAN <=> 1).to eq(0)
97
+ end
98
+ end
97
99
 
98
- it '<=> method return a correct value.' do
99
- expect((Anime::MUROMISAN <=> 0) > 0 ).to be_true
100
- expect((Anime::MUROMISAN <=> 1) == 0 ).to be_true
101
- expect((Anime::MUROMISAN <=> 2) < 0 ).to be_true
100
+ context 'self < other' do
101
+ it 'Return a negative values.' do
102
+ expect(Anime::MUROMISAN <=> 2).to be < 0
103
+ end
104
+ end
102
105
 
103
- expect(Anime::NYARUKO <=> 'Value can not compare.').to be_nil
106
+ context 'self > other' do
107
+ it 'Return a positive values.' do
108
+ expect(Anime::MUROMISAN <=> 0).to be > 0
109
+ end
110
+ end
104
111
  end
105
112
 
106
- it '+ method return a correct Inum.' do
107
- expect(Anime::NYARUKO + 1).to eq(Anime::MUROMISAN)
113
+ describe '#+' do
114
+ it 'Returning value is correct.' do
115
+ expect(Anime::NYARUKO + 1).to eq(Anime::MUROMISAN)
116
+ end
108
117
  end
109
118
 
110
- it '- method return a correct Inum.' do
111
- expect(Anime::NOURIN - 1).to eq(Anime::MUROMISAN)
119
+ describe '#-' do
120
+ it 'Returning value is correct.' do
121
+ expect(Anime::MUROMISAN - 1).to eq(Anime::NYARUKO)
122
+ end
112
123
  end
113
124
 
114
- it 'Comparable module enable.' do
115
- expect(Anime::MUROMISAN.between?(0,2)).to be_true
116
- end
125
+ describe '#eql?' do
126
+ context 'When compare same enum' do
127
+ it 'Return truthy value.' do
128
+ expect(Anime::KMB.eql?(Anime::KMB)).to be_truthy
129
+ end
130
+ end
117
131
 
118
- it 'each method can execute block with enum' do
119
- count = 0
120
- expect{
121
- Anime.each do |enum|
122
- expect(enum.instance_of?(Anime)).to be_true
123
- count += 1
132
+ context 'When compare other enum' do
133
+ it 'Return falsey value.' do
134
+ expect(Anime::KMB.eql?(Anime::NYARUKO)).to be_falsey
124
135
  end
125
- }.to change{count}.by(Anime.length)
136
+ end
126
137
  end
127
138
 
128
- it 'Enumerable module enable.' do
129
- expect(Anime.count).to eq(Anime.length)
130
- expect(Anime.include?(Anime::NOURIN)).to be_true
139
+ describe '#t' do
140
+ subject do
141
+ expect(I18n).to receive(:t).with('animes.kmb') { 'ok' }
142
+ expect(Anime::KMB.t).to eq('ok')
143
+ end
131
144
  end
132
145
 
133
- it 'eql? method return a correct result.' do
134
- expect(Anime::KMB.eql?(0) ).to be_false
135
- expect(Anime::KMB.eql?(4) ).to be_true
146
+ describe '#to_i' do
147
+ it 'Return integer.' do
148
+ expect(Anime::KMB.to_i).to eq(3)
149
+ end
136
150
  end
137
151
 
138
- it 'labels method return Array<Symbol>.' do
139
- expect(Anime.labels.length).to eq(Anime.length)
140
- expect(Anime.labels.instance_of?(Array)).to be_true
141
- expect(Anime.labels[0].instance_of?(Symbol)).to be_true
152
+ describe '#to_s ' do
153
+ it 'Return string.' do
154
+ expect(Anime::NOURIN.to_s).to eq('NOURIN')
155
+ end
142
156
  end
143
157
 
144
- it 'length return count of enum.' do
145
- expect(Anime.length).to eq(4)
158
+ describe '#translate' do
159
+ subject do
160
+ expect(I18n).to receive(:t).with('animes.kmb') { 'ok' }
161
+ expect(Anime::KMB.translate).to eq('ok')
162
+ end
146
163
  end
147
164
 
148
- context 'Parse method' do
149
- it 'Parsable string.' do
150
- expect(Anime.parse('NOURIN')).to eq(Anime::NOURIN)
165
+ describe '#value' do
166
+ it 'Return integer.' do
167
+ expect(Anime::KMB.value).to eq(3)
151
168
  end
169
+ end
152
170
 
153
- it 'Parsable integer.' do
154
- expect(Anime.parse(1)).to eq(Anime::MUROMISAN)
171
+ describe '.collection' do
172
+ subject do
173
+ allow(I18n).to receive(:t) { 't' }
174
+ Anime.collection(option)
155
175
  end
156
176
 
157
- it 'Parsable symbol.' do
158
- expect(Anime.parse(:KMB)).to eq(Anime::KMB)
177
+ let(:option) { Hash.new }
178
+
179
+ it 'Return all item array.' do
180
+ expect(subject).to match_array([
181
+ ['t', 0],
182
+ ['t', 1],
183
+ ['t', 2],
184
+ ['t', 3],
185
+ ])
159
186
  end
160
187
 
161
- it 'Parsable self instance.' do
162
- expect(Anime.parse(Anime::NYARUKO)).to eq(Anime::NYARUKO)
188
+ context 'When with only option' do
189
+ let(:option) { {only: [:KMB]} }
190
+
191
+ it 'Return only selected item array.' do
192
+ expect(subject).to match_array([['t', 3]])
193
+ end
163
194
  end
164
195
 
165
- it 'return nil for a unknown value.' do
166
- expect(Anime.parse('Nothing') ).to eq(nil)
196
+ context 'When with except option' do
197
+ let(:option) { {except: [:KMB]} }
198
+
199
+ it 'Return only except item array.' do
200
+ expect(subject).to match_array([
201
+ ['t', 0],
202
+ ['t', 1],
203
+ ['t', 2],
204
+ ])
205
+ end
167
206
  end
207
+ end
168
208
 
169
- it 'parse! method raise exception for a unknown value.' do
170
- expect{Anime.parse!('Nothing') }.to raise_error(NameError)
209
+ describe '.new' do
210
+ it 'Can not create a instance of enum.' do
211
+ expect{ Anime.new(:NICONICO, 2525) }.to raise_error
171
212
  end
172
213
  end
173
214
 
174
- it 'to_a method return Array<Enum>.' do
175
- enums = Anime.instance_variable_get(:@enums)
215
+ describe '.each' do
216
+ it 'Execute block with a right order.' do
217
+ count = 0
218
+ orders = [Anime::NYARUKO, Anime::MUROMISAN, Anime::NOURIN, Anime::KMB]
176
219
 
177
- expect(Anime.to_a.eql?(enums)).to be_true
178
- expect(Anime.to_a.equal?(enums)).to be_false
220
+ Anime.each do |enum|
221
+ expect(enum).to eq(orders[count])
222
+ count += 1
223
+ end
224
+ end
179
225
  end
180
226
 
181
- it 'to_h method return Hash' do
182
- enum_format = Anime.instance_variable_get(:@enum_format)
183
-
184
- expect(Anime.to_h.eql?(enum_format)).to be_true
185
- expect(Anime.to_h.equal?(enum_format)).to be_false
227
+ describe '.labels' do
228
+ it 'Return array of label.' do
229
+ expect(Anime.labels).to match_array([:NYARUKO, :MUROMISAN, :NOURIN, :KMB])
230
+ end
186
231
  end
187
232
 
188
- it 'to_i and value methods return integer.' do
189
- expect(Anime::KMB.to_i).to eq(4)
190
- expect(Anime::KMB.value).to eq(4)
233
+ describe '.length' do
234
+ it 'Return correct count of enum.' do
235
+ expect(Anime.length).to eq(4)
236
+ end
191
237
  end
192
238
 
193
- it 'to_s method return string.' do
194
- expect(Anime::NOURIN.to_s ).to eq('NOURIN')
239
+ describe '.parse' do
240
+ subject do
241
+ expect(Anime.parse(source)).to eq(destination)
242
+ end
243
+
244
+ let(:destination) { Anime::KMB }
245
+
246
+ context 'source is string' do
247
+ let(:source) { 'KMB' }
248
+ it 'success.' do
249
+ subject
250
+ end
251
+ end
252
+
253
+ context 'source is symbol' do
254
+ let(:source) { :kmb }
255
+ it 'success.' do
256
+ subject
257
+ end
258
+ end
259
+
260
+ context 'source is integer' do
261
+ let(:source) { 3 }
262
+ it 'success.' do
263
+ subject
264
+ end
265
+ end
266
+
267
+ context 'source is enum' do
268
+ let(:source) { Anime::KMB }
269
+ it 'success.' do
270
+ subject
271
+ end
272
+ end
273
+
274
+ context 'source is incorrect' do
275
+ let(:source) { '' }
276
+ let(:destination) { nil }
277
+ it 'return nil.' do
278
+ subject
279
+ end
280
+ end
195
281
  end
196
282
 
197
- it 'translate and t methods return localized string.' do
198
- I18n.should_receive(:t).with('inum.anime.nourin').and_return('NO-RIN!')
199
- I18n.should_receive(:t).with('inum.anime.kmb').and_return('KIRUMI-BEIBE-')
283
+ describe '.parse!' do
284
+ subject do
285
+ expect(Anime).to receive(:parse).with(:hoge) { returning_value }
286
+ expect(Anime.parse!(:hoge)).to eq(returning_value)
287
+ end
288
+
289
+ context '#parse return enum' do
290
+ let(:returning_value) { Anime::KMB }
291
+
292
+ it 'success.' do
293
+ subject
294
+ end
295
+ end
200
296
 
201
- expect(Anime::NOURIN.t).to eq('NO-RIN!')
202
- expect(Anime::KMB.translate).to eq('KIRUMI-BEIBE-')
297
+ context '#parse return nil' do
298
+ let(:returning_value) { nil }
299
+
300
+ it 'raise error.' do
301
+ expect{subject}.to raise_error
302
+ end
303
+ end
203
304
  end
204
305
 
205
- it 'underscore method return underscore string.' do
206
- expect(Anime::NYARUKO.underscore).to eq('nyaruko')
306
+ describe '.to_a' do
307
+ it 'Return array of enum.' do
308
+ expect(Anime.to_a).to match_array([Anime::NYARUKO, Anime::MUROMISAN, Anime::NOURIN, Anime::KMB])
309
+ end
207
310
  end
208
311
 
209
- it 'values method return Array<integer>.' do
210
- expect(Anime.values.length).to eq(Anime.length)
211
- expect(Anime.values.instance_of?(Array)).to be_true
212
- expect(Anime.values[0].integer?).to be_true
312
+ describe '.values' do
313
+ it 'Return array of value.' do
314
+ expect(Anime.values).to match_array([0, 1, 2, 3])
315
+ end
213
316
  end
214
317
  end
215
318
  end