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.
- checksums.yaml +4 -4
- data/.travis.yml +4 -3
- data/Gemfile +4 -0
- data/README.md +35 -49
- data/inum.gemspec +6 -3
- data/lib/inum.rb +2 -0
- data/lib/inum/active_record_mixin.rb +19 -31
- data/lib/inum/base.rb +75 -107
- data/lib/inum/version.rb +1 -1
- data/spec/inum/active_record_mixin_spec.rb +58 -93
- data/spec/inum/base_spec.rb +235 -132
- data/spec/spec_helper.rb +2 -2
- metadata +26 -15
- data/lib/inum/utils.rb +0 -23
- data/spec/inum/utils_spec.rb +0 -23
data/lib/inum/version.rb
CHANGED
@@ -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
|
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 :
|
32
|
-
TV.
|
25
|
+
let :bind_class do
|
26
|
+
TV.tap {|klass| klass.instance_eval{ bind_inum :anime, Anime } }
|
33
27
|
end
|
34
28
|
|
35
|
-
|
36
|
-
|
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
|
-
|
49
|
-
|
50
|
-
|
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
|
-
|
60
|
-
|
61
|
-
expect(
|
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 '
|
65
|
-
|
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
|
-
|
71
|
-
|
72
|
-
expect
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
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
|
-
|
85
|
-
|
86
|
-
end
|
59
|
+
context 'When enum' do
|
60
|
+
let(:target){ Anime::NOURIN }
|
87
61
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
expect(tv.reload.anime).to eq(Anime::NOURIN)
|
62
|
+
it 'set value.' do
|
63
|
+
subject
|
64
|
+
end
|
92
65
|
end
|
93
66
|
|
94
|
-
|
95
|
-
|
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
|
-
|
101
|
-
|
102
|
-
|
70
|
+
it 'set value.' do
|
71
|
+
subject
|
72
|
+
end
|
103
73
|
end
|
104
74
|
|
105
|
-
|
106
|
-
|
107
|
-
expect(validators).to include(:favorite)
|
108
|
-
end
|
75
|
+
context 'When string' do
|
76
|
+
let(:target){ 'KMB' }
|
109
77
|
|
110
|
-
|
111
|
-
|
78
|
+
it 'set value.' do
|
79
|
+
subject
|
80
|
+
end
|
112
81
|
end
|
113
82
|
|
114
|
-
context '
|
115
|
-
|
116
|
-
expect(tv).to be_valid
|
117
|
-
end
|
83
|
+
context 'When string' do
|
84
|
+
let(:target){ :KMB }
|
118
85
|
|
119
|
-
it '
|
120
|
-
|
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
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
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
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
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
|
-
|
139
|
-
|
140
|
-
expect(
|
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
|
data/spec/inum/base_spec.rb
CHANGED
@@ -2,214 +2,317 @@ require 'rspec'
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe Inum::Base do
|
5
|
-
|
6
|
-
|
7
|
-
|
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 :
|
12
|
-
define :MONSTER,
|
9
|
+
define :RED_BULL, 0
|
10
|
+
define :MONSTER, 1
|
11
|
+
define :MONSTER2, 2
|
13
12
|
}
|
14
|
-
|
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
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
15
|
+
it 'pass validation.' do
|
16
|
+
expect { subject }.not_to raise_error
|
17
|
+
end
|
18
|
+
end
|
27
19
|
|
28
|
-
|
29
|
-
|
20
|
+
context 'When define a omit a value enum' do
|
21
|
+
subject do
|
30
22
|
Class.new(Inum::Base) {
|
31
|
-
define :
|
32
|
-
define :
|
23
|
+
define :RED_BULL
|
24
|
+
define :MONSTER
|
25
|
+
define :MONSTER2
|
33
26
|
}
|
34
|
-
|
27
|
+
end
|
35
28
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
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
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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
|
-
|
53
|
-
|
54
|
-
|
47
|
+
it 'fail validation.' do
|
48
|
+
expect { subject }.to raise_error
|
49
|
+
end
|
55
50
|
end
|
56
51
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
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
|
-
|
65
|
-
|
60
|
+
it 'fail validation.' do
|
61
|
+
expect { subject }.to raise_error
|
62
|
+
end
|
63
|
+
end
|
66
64
|
|
67
|
-
|
68
|
-
|
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
|
-
|
71
|
-
|
73
|
+
it 'fail validation.' do
|
74
|
+
expect { subject }.to raise_error
|
75
|
+
end
|
72
76
|
end
|
73
77
|
end
|
74
78
|
|
75
|
-
|
76
|
-
|
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,
|
85
|
+
define :KMB, 3
|
83
86
|
end
|
84
87
|
end
|
85
88
|
|
86
|
-
after :
|
89
|
+
after :all do
|
87
90
|
Object.class_eval{ remove_const :Anime }
|
88
91
|
end
|
89
92
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
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
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
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
|
-
|
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
|
-
|
107
|
-
|
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
|
-
|
111
|
-
|
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
|
-
|
115
|
-
|
116
|
-
|
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
|
-
|
119
|
-
|
120
|
-
|
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
|
-
|
136
|
+
end
|
126
137
|
end
|
127
138
|
|
128
|
-
|
129
|
-
|
130
|
-
|
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
|
-
|
134
|
-
|
135
|
-
|
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
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
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
|
-
|
145
|
-
|
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
|
-
|
149
|
-
it '
|
150
|
-
expect(Anime.
|
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
|
-
|
154
|
-
|
171
|
+
describe '.collection' do
|
172
|
+
subject do
|
173
|
+
allow(I18n).to receive(:t) { 't' }
|
174
|
+
Anime.collection(option)
|
155
175
|
end
|
156
176
|
|
157
|
-
|
158
|
-
|
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
|
-
|
162
|
-
|
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
|
-
|
166
|
-
|
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
|
-
|
170
|
-
|
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
|
-
|
175
|
-
|
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
|
-
|
178
|
-
|
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
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
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
|
-
|
189
|
-
|
190
|
-
|
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
|
-
|
194
|
-
|
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
|
-
|
198
|
-
|
199
|
-
|
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
|
-
|
202
|
-
|
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
|
-
|
206
|
-
|
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
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
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
|