unidata 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/unidata/field.rb +11 -2
- data/lib/unidata/model.rb +16 -5
- data/lib/unidata/version.rb +1 -1
- data/spec/unidata/field_spec.rb +40 -0
- data/spec/unidata/model_spec.rb +25 -4
- metadata +1 -1
data/lib/unidata/field.rb
CHANGED
@@ -1,11 +1,20 @@
|
|
1
1
|
module Unidata
|
2
2
|
class Field
|
3
|
-
attr_reader :index, :name, :type
|
3
|
+
attr_reader :index, :name, :type
|
4
4
|
|
5
|
-
def initialize(index, name, type=String)
|
5
|
+
def initialize(index, name, type=String, options={})
|
6
6
|
@index = [*index]
|
7
7
|
@name = name
|
8
8
|
@type = type
|
9
|
+
@default = options[:default]
|
10
|
+
end
|
11
|
+
|
12
|
+
def default
|
13
|
+
if @default.respond_to?(:call)
|
14
|
+
@default.call
|
15
|
+
else
|
16
|
+
@default
|
17
|
+
end
|
9
18
|
end
|
10
19
|
|
11
20
|
def typecast(value)
|
data/lib/unidata/model.rb
CHANGED
@@ -20,8 +20,8 @@ module Unidata
|
|
20
20
|
fields.keys.include?(name.to_sym)
|
21
21
|
end
|
22
22
|
|
23
|
-
def field(index, name, type=String)
|
24
|
-
fields[name.to_sym] = Field.new(index, name, type)
|
23
|
+
def field(index, name, type=String, options={})
|
24
|
+
fields[name.to_sym] = Field.new(index, name, type, options)
|
25
25
|
define_attribute_accessor(name)
|
26
26
|
end
|
27
27
|
|
@@ -79,8 +79,9 @@ module Unidata
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def initialize(attributes={})
|
82
|
-
|
83
|
-
|
82
|
+
initialize_attributes
|
83
|
+
|
84
|
+
attributes.each do |key, value|
|
84
85
|
next unless self.class.field?(key.to_sym)
|
85
86
|
write_attribute(key, value)
|
86
87
|
end
|
@@ -92,13 +93,23 @@ module Unidata
|
|
92
93
|
end
|
93
94
|
|
94
95
|
private
|
96
|
+
def initialize_attributes
|
97
|
+
@attributes = {}
|
98
|
+
|
99
|
+
self.class.fields.each do |key, field|
|
100
|
+
write_attribute(key, field.default)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
95
104
|
def read_attribute(attribute_name)
|
96
105
|
@attributes[attribute_name.to_sym]
|
97
106
|
end
|
98
107
|
|
99
108
|
def write_attribute(attribute_name, value)
|
100
109
|
field = self.class.fields[attribute_name.to_sym]
|
101
|
-
|
110
|
+
value = field.typecast(value) unless value.nil?
|
111
|
+
|
112
|
+
@attributes[attribute_name.to_sym] = value
|
102
113
|
end
|
103
114
|
end
|
104
115
|
end
|
data/lib/unidata/version.rb
CHANGED
data/spec/unidata/field_spec.rb
CHANGED
@@ -20,6 +20,46 @@ describe Unidata::Field do
|
|
20
20
|
field = subject.new(2, :name)
|
21
21
|
field.type.should == String
|
22
22
|
end
|
23
|
+
|
24
|
+
context 'when default value provided' do
|
25
|
+
it 'captures default value' do
|
26
|
+
field = subject.new(3, :status, String, :default => 'N')
|
27
|
+
field.default.should == 'N'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'when default value not provided' do
|
32
|
+
it 'does not set default value' do
|
33
|
+
field = subject.new(3, :status, String)
|
34
|
+
field.default.should be_nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#default' do
|
40
|
+
context 'when default is a proc/lambda/etc' do
|
41
|
+
it 'evaluates and returns result of default' do
|
42
|
+
field = subject.new(4, :created, Date, :default => proc { Date.today })
|
43
|
+
field.default.should == Date.today
|
44
|
+
|
45
|
+
field = subject.new(4, :created, Date, :default => lambda { Date.today })
|
46
|
+
field.default.should == Date.today
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'when default is a not a proc/lambda/etc' do
|
51
|
+
it 'returns default' do
|
52
|
+
field = subject.new(3, :status, String, :default => 'active')
|
53
|
+
field.default.should == 'active'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'when no default defined' do
|
58
|
+
it 'returns nil' do
|
59
|
+
field = subject.new(2, :name)
|
60
|
+
field.default.should be_nil
|
61
|
+
end
|
62
|
+
end
|
23
63
|
end
|
24
64
|
|
25
65
|
describe '#typecast' do
|
data/spec/unidata/model_spec.rb
CHANGED
@@ -12,6 +12,7 @@ describe Unidata::Model do
|
|
12
12
|
field [4,1], :employer
|
13
13
|
field [4,2], :job_title
|
14
14
|
field [4,3], :salary, BigDecimal
|
15
|
+
field 5, :status, String, :default => 'active'
|
15
16
|
end
|
16
17
|
|
17
18
|
describe '.connection' do
|
@@ -22,11 +23,17 @@ describe Unidata::Model do
|
|
22
23
|
end
|
23
24
|
|
24
25
|
describe '.field' do
|
25
|
-
it 'adds Field with given index, name, and
|
26
|
+
it 'adds Field with given index, name, type, and options to fields hash' do
|
26
27
|
field = Record.fields[:age]
|
27
28
|
field.index.should == [2]
|
28
29
|
field.name.should == :age
|
29
30
|
field.type.should == Integer
|
31
|
+
|
32
|
+
field = Record.fields[:status]
|
33
|
+
field.index.should == [5]
|
34
|
+
field.name.should == :status
|
35
|
+
field.type.should == String
|
36
|
+
field.default.should == 'active'
|
30
37
|
end
|
31
38
|
|
32
39
|
it 'defines attribute reader/writer for field' do
|
@@ -45,7 +52,8 @@ describe Unidata::Model do
|
|
45
52
|
:birth_date => Date.today,
|
46
53
|
:employer => 'Awesome Company',
|
47
54
|
:job_title => 'Manager',
|
48
|
-
:salary => BigDecimal.new('60_000.00')
|
55
|
+
:salary => BigDecimal.new('60_000.00'),
|
56
|
+
:status => 'inactive'
|
49
57
|
)
|
50
58
|
end
|
51
59
|
|
@@ -57,6 +65,7 @@ describe Unidata::Model do
|
|
57
65
|
record.extract(4, 1).to_s.should == 'AWESOME COMPANY'
|
58
66
|
record.extract(4, 2).to_s.should == 'MANAGER'
|
59
67
|
record.extract(4, 3).to_s.should == '6000000'
|
68
|
+
record.extract(5).to_s.should == 'INACTIVE'
|
60
69
|
end
|
61
70
|
|
62
71
|
it 'skips id field' do
|
@@ -75,6 +84,7 @@ describe Unidata::Model do
|
|
75
84
|
@record.replace 4, 1, 'AWESOME COMPANY'
|
76
85
|
@record.replace 4, 2, 'MANAGER'
|
77
86
|
@record.replace 4, 3, 6_000_000
|
87
|
+
@record.replace 5, 'INACTIVE'
|
78
88
|
end
|
79
89
|
|
80
90
|
it 'converts UniDynArray to model' do
|
@@ -85,6 +95,7 @@ describe Unidata::Model do
|
|
85
95
|
obj.employer.should == 'AWESOME COMPANY'
|
86
96
|
obj.job_title.should == 'MANAGER'
|
87
97
|
obj.salary.should == BigDecimal.new('60_000.00')
|
98
|
+
obj.status.should == 'INACTIVE'
|
88
99
|
end
|
89
100
|
|
90
101
|
it 'skips id field' do
|
@@ -120,6 +131,7 @@ describe Unidata::Model do
|
|
120
131
|
@record.replace 4, 1, 'AWESOME COMPANY'
|
121
132
|
@record.replace 4, 2, 'MANAGER'
|
122
133
|
@record.replace 4, 3, 6_000_000
|
134
|
+
@record.replace 5, 'INACTIVE'
|
123
135
|
|
124
136
|
@connection = double('connection', :read => @record)
|
125
137
|
Unidata.stub(:connection).and_return(@connection)
|
@@ -139,14 +151,21 @@ describe Unidata::Model do
|
|
139
151
|
obj.employer.should == 'AWESOME COMPANY'
|
140
152
|
obj.job_title.should == 'MANAGER'
|
141
153
|
obj.salary.should == BigDecimal.new('60_000.00')
|
154
|
+
obj.status.should == 'INACTIVE'
|
142
155
|
end
|
143
156
|
end
|
144
157
|
|
145
158
|
describe '#initialize' do
|
146
159
|
it 'captures provied attributes' do
|
147
|
-
instance = Record.new(:id => '123', :name => 'John Doe')
|
160
|
+
instance = Record.new(:id => '123', :name => 'John Doe', :status => 'inactive')
|
148
161
|
instance.id.should == '123'
|
149
162
|
instance.name.should == 'John Doe'
|
163
|
+
instance.status.should == 'inactive'
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'defaults attributes if field defines a default value' do
|
167
|
+
instance = Record.new(:id => '123', :name => 'John Doe')
|
168
|
+
instance.status.should == 'active'
|
150
169
|
end
|
151
170
|
|
152
171
|
it 'ignores attributes that are not defined in fields' do
|
@@ -178,7 +197,8 @@ describe Unidata::Model do
|
|
178
197
|
:birth_date => Date.today,
|
179
198
|
:employer => 'Awesome Company',
|
180
199
|
:job_title => 'Manager',
|
181
|
-
:salary => BigDecimal.new('60_000.00')
|
200
|
+
:salary => BigDecimal.new('60_000.00'),
|
201
|
+
:status => 'inactive'
|
182
202
|
)
|
183
203
|
|
184
204
|
record = Unidata::UniDynArray.new
|
@@ -188,6 +208,7 @@ describe Unidata::Model do
|
|
188
208
|
record.replace 4, 1, 'AWESOME COMPANY'
|
189
209
|
record.replace 4, 2, 'MANAGER'
|
190
210
|
record.replace 4, 3, 6_000_000
|
211
|
+
record.replace 5, 'INACTIVE'
|
191
212
|
|
192
213
|
connection.should_receive(:write).with('TEST', '1234', record)
|
193
214
|
obj.save
|