csv_record 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.travis.yml +2 -0
- data/README.md +3 -3
- data/Rakefile +1 -1
- data/csv_record.gemspec +6 -7
- data/lib/csv_record/callbacks.rb +3 -3
- data/lib/csv_record/connector.rb +7 -7
- data/lib/csv_record/csv_fields.rb +45 -0
- data/lib/csv_record/csv_queries/query.rb +1 -1
- data/lib/csv_record/{reader.rb → csv_readers/class_reader.rb} +11 -29
- data/lib/csv_record/csv_readers/instance_reader.rb +29 -0
- data/lib/csv_record/csv_readers/reader.rb +9 -0
- data/lib/csv_record/csv_validations/custom_validation.rb +1 -1
- data/lib/csv_record/csv_validations/validations.rb +2 -2
- data/lib/csv_record/csv_writers/class_writer.rb +52 -0
- data/lib/csv_record/{writer.rb → csv_writers/instance_writer.rb} +4 -21
- data/lib/csv_record/csv_writers/writer.rb +9 -0
- data/lib/csv_record/document.rb +11 -12
- data/lib/csv_record/exceptions.rb +1 -0
- data/lib/csv_record/field.rb +21 -0
- data/lib/csv_record/helpers.rb +1 -1
- data/lib/csv_record/timestamps.rb +11 -2
- data/lib/csv_record/version.rb +4 -1
- data/test/csv_record/associations_test.rb +0 -3
- data/test/csv_record/callbacks_test.rb +0 -1
- data/test/csv_record/connector_test.rb +0 -2
- data/test/csv_record/helpers_test.rb +0 -1
- data/test/csv_record/query_test.rb +0 -1
- data/test/csv_record/reader_test.rb +122 -116
- data/test/csv_record/timestamps_test.rb +2 -5
- data/test/csv_record/validation_test.rb +13 -14
- data/test/csv_record/writer_test.rb +60 -18
- data/test/helpers.rb +7 -0
- data/test/models/customized_class.rb +11 -0
- data/test/monkey_patches/object_test.rb +2 -4
- data/test/test_helper.rb +9 -6
- metadata +38 -43
@@ -1,7 +1,5 @@
|
|
1
1
|
require_relative '../test_helper'
|
2
2
|
|
3
|
-
require_relative '../models/jedi'
|
4
|
-
|
5
3
|
describe CsvRecord::Reader do
|
6
4
|
describe 'initializing class methods' do
|
7
5
|
it ('responds to fields') { Jedi.must_respond_to :fields }
|
@@ -18,8 +16,8 @@ describe CsvRecord::Reader do
|
|
18
16
|
it ('responds to !=') { klass.must_respond_to :!= }
|
19
17
|
end
|
20
18
|
|
21
|
-
describe '
|
22
|
-
it '
|
19
|
+
describe '#build' do
|
20
|
+
it 'traditionally' do
|
23
21
|
new_jedi = Jedi.build(
|
24
22
|
name: 'Yoda the red',
|
25
23
|
age: 148,
|
@@ -29,167 +27,175 @@ describe CsvRecord::Reader do
|
|
29
27
|
new_jedi.must_be_instance_of Jedi
|
30
28
|
end
|
31
29
|
|
32
|
-
it '
|
33
|
-
Jedi.
|
30
|
+
it 'with a block' do
|
31
|
+
new_jedi = Jedi.build do |jedi|
|
32
|
+
jedi.name = 'Yoda the red',
|
33
|
+
jedi.age = 148,
|
34
|
+
jedi.midi_chlorians = '0.5k'
|
35
|
+
end
|
36
|
+
new_jedi.wont_be_nil
|
37
|
+
new_jedi.must_be_instance_of Jedi
|
34
38
|
end
|
39
|
+
end
|
35
40
|
|
36
|
-
|
37
|
-
|
41
|
+
it '.fields' do
|
42
|
+
[:id, :created_at, :updated_at, :name, :age, :midi_chlorians, "jedi_order_id"].each do |field|
|
43
|
+
Jedi.fields.must_include field
|
38
44
|
end
|
45
|
+
end
|
39
46
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
47
|
+
it '.values' do
|
48
|
+
luke.values.must_equal [nil, nil, nil, "Luke Skywalker", 18, "12k", 0]
|
49
|
+
end
|
50
|
+
|
51
|
+
describe 'retrieving resources' do
|
52
|
+
before { luke.save }
|
44
53
|
|
45
54
|
it "Retrieves all registries" do
|
46
|
-
luke.save
|
47
55
|
Jedi.all.size.must_equal 1
|
48
56
|
yoda.save
|
49
57
|
Jedi.all.size.must_equal 2
|
50
58
|
end
|
51
59
|
|
52
60
|
it "counting the registries" do
|
53
|
-
luke.save
|
54
61
|
Jedi.count.must_equal 1
|
55
62
|
yoda.save
|
56
63
|
Jedi.count.must_equal 2
|
57
64
|
end
|
58
65
|
|
59
66
|
it 'checking to_param' do
|
60
|
-
luke.save
|
61
67
|
luke.to_param.wont_be_nil
|
62
68
|
luke.to_param.must_equal '1'
|
63
69
|
end
|
70
|
+
end
|
64
71
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
72
|
+
describe '==' do
|
73
|
+
before do
|
74
|
+
yoda.save
|
75
|
+
luke.save
|
76
|
+
jedi_council.save
|
77
|
+
end
|
71
78
|
|
72
|
-
|
73
|
-
|
74
|
-
|
79
|
+
it 'comparing with the same registry' do
|
80
|
+
(yoda == yoda).must_equal true
|
81
|
+
end
|
75
82
|
|
76
|
-
|
77
|
-
|
78
|
-
|
83
|
+
it 'comparing with a diferent registry' do
|
84
|
+
(yoda == luke).must_equal false
|
85
|
+
end
|
79
86
|
|
80
|
-
|
81
|
-
|
82
|
-
end
|
87
|
+
it 'comparing with another class registry' do
|
88
|
+
(yoda == jedi_council).must_equal false
|
83
89
|
end
|
90
|
+
end
|
84
91
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
92
|
+
describe '!=' do
|
93
|
+
before do
|
94
|
+
yoda.save
|
95
|
+
luke.save
|
96
|
+
jedi_council.save
|
97
|
+
end
|
91
98
|
|
92
|
-
|
93
|
-
|
94
|
-
|
99
|
+
it 'comparing with the same registry' do
|
100
|
+
(yoda != yoda).must_equal false
|
101
|
+
end
|
95
102
|
|
96
|
-
|
97
|
-
|
98
|
-
|
103
|
+
it 'comparing with a diferent registry' do
|
104
|
+
(yoda != luke).must_equal true
|
105
|
+
end
|
99
106
|
|
100
|
-
|
101
|
-
|
102
|
-
end
|
107
|
+
it 'comparing with another class registry' do
|
108
|
+
(yoda != jedi_council).must_equal true
|
103
109
|
end
|
110
|
+
end
|
104
111
|
|
105
|
-
|
106
|
-
|
112
|
+
describe 'simple query' do
|
113
|
+
let (:jedis) { [] }
|
107
114
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
end
|
115
|
+
before do
|
116
|
+
3.times do
|
117
|
+
jedis << luke.clone
|
118
|
+
jedis.last.save
|
113
119
|
end
|
120
|
+
end
|
114
121
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
122
|
+
it 'querying by id' do
|
123
|
+
Jedi.find(jedis.first.id).wont_be_nil
|
124
|
+
Jedi.find(jedis.first.id).must_be_instance_of Jedi
|
125
|
+
end
|
119
126
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
127
|
+
it 'querying by object' do
|
128
|
+
Jedi.find(jedis.first).wont_be_nil
|
129
|
+
Jedi.find(jedis.first.id).must_be_instance_of Jedi
|
130
|
+
end
|
124
131
|
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
132
|
+
it 'gets the first' do
|
133
|
+
first_jedi = Jedi.first
|
134
|
+
first_jedi.wont_be_nil
|
135
|
+
first_jedi.must_be_instance_of Jedi
|
136
|
+
end
|
130
137
|
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
end
|
138
|
+
it 'gets the last' do
|
139
|
+
last_jedi = Jedi.last
|
140
|
+
last_jedi.wont_be_nil
|
141
|
+
last_jedi.must_be_instance_of Jedi
|
136
142
|
end
|
143
|
+
end
|
137
144
|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
145
|
+
describe 'complex queries' do
|
146
|
+
before do
|
147
|
+
luke.save
|
148
|
+
qui_gon_jinn.save
|
149
|
+
end
|
143
150
|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
151
|
+
it 'with a single parameter' do
|
152
|
+
result = Jedi.where age: 37
|
153
|
+
result.wont_be_empty
|
154
|
+
result.first.age.must_equal '37'
|
155
|
+
end
|
149
156
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
157
|
+
it 'with multiple parameters' do
|
158
|
+
result = Jedi.where age: 37, name: 'Qui-Gon Jinn', midi_chlorians: '3k'
|
159
|
+
result.wont_be_empty
|
160
|
+
result.first.age.must_equal '37'
|
161
|
+
end
|
155
162
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
end
|
163
|
+
it 'with invalid parameter' do
|
164
|
+
result = Jedi.where age: 22, name: 'Obi Wan Kenobi'
|
165
|
+
result.must_be_empty
|
160
166
|
end
|
167
|
+
end
|
161
168
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
169
|
+
describe 'dynamic finders' do
|
170
|
+
before do
|
171
|
+
luke.save
|
172
|
+
yoda.save
|
173
|
+
end
|
167
174
|
|
168
|
-
|
175
|
+
let (:properties) { Jedi.fields }
|
169
176
|
|
170
|
-
|
171
|
-
|
172
|
-
|
177
|
+
it 'respond to certain dynamic methods' do
|
178
|
+
Jedi.must_respond_to "find_by_#{properties.sample}"
|
179
|
+
end
|
173
180
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
181
|
+
it 'finding with a single field' do
|
182
|
+
found_jedis = Jedi.find_by_age 852
|
183
|
+
found_jedis.wont_be_empty
|
184
|
+
found_jedis.first.must_be_instance_of Jedi
|
185
|
+
end
|
179
186
|
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
end
|
187
|
+
it 'finding with multiple fields' do
|
188
|
+
conditions = []
|
189
|
+
properties.each_with_index do |property, i|
|
190
|
+
values = []
|
191
|
+
i.times do |k|
|
192
|
+
conditions[i] = conditions[i] ? "#{conditions[i]}_and_#{properties[k]}" : properties[k]
|
193
|
+
values << luke.send(properties[k].name)
|
194
|
+
end
|
195
|
+
if conditions[i]
|
196
|
+
found_jedis = Jedi.public_send "find_by_#{conditions[i]}", *values
|
197
|
+
found_jedis.wont_be_empty
|
198
|
+
found_jedis.first.must_be_instance_of Jedi
|
193
199
|
end
|
194
200
|
end
|
195
201
|
end
|
@@ -10,19 +10,16 @@ describe CsvRecord::Timestamps do
|
|
10
10
|
describe 'defines on create' do
|
11
11
|
before do
|
12
12
|
Timecop.freeze(Time.now.utc)
|
13
|
+
luke.save
|
13
14
|
end
|
14
15
|
|
15
|
-
after
|
16
|
-
Timecop.return
|
17
|
-
end
|
16
|
+
after { Timecop.return }
|
18
17
|
|
19
18
|
it 'sets the time wich the object was created' do
|
20
|
-
luke.save
|
21
19
|
luke.created_at.must_equal Time.now.utc
|
22
20
|
end
|
23
21
|
|
24
22
|
it 'sets the updated time on created' do
|
25
|
-
luke.save
|
26
23
|
luke.updated_at.must_equal Time.now.utc
|
27
24
|
end
|
28
25
|
end
|
@@ -1,8 +1,4 @@
|
|
1
1
|
require_relative '../test_helper'
|
2
|
-
require 'pry'
|
3
|
-
require_relative '../models/jedi'
|
4
|
-
require_relative '../models/jedi_order'
|
5
|
-
require_relative '../models/custom_errors_class'
|
6
2
|
|
7
3
|
describe CsvRecord::Validations do
|
8
4
|
let (:invalid_jedi) { Jedi.new }
|
@@ -13,12 +9,14 @@ describe CsvRecord::Validations do
|
|
13
9
|
end
|
14
10
|
|
15
11
|
describe 'initializing instance methods' do
|
16
|
-
|
17
|
-
|
18
|
-
it ('responds to
|
12
|
+
let (:jedi) { Jedi.new }
|
13
|
+
|
14
|
+
it ('responds to valid?') { jedi.must_respond_to :valid? }
|
15
|
+
it ('responds to invalid?') { jedi.must_respond_to :invalid? }
|
16
|
+
it ('responds to errors') { jedi.must_respond_to :errors }
|
19
17
|
end
|
20
18
|
|
21
|
-
describe 'validates_presence_of' do
|
19
|
+
describe '.validates_presence_of' do
|
22
20
|
it 'all fields valid' do
|
23
21
|
yoda.valid?.must_equal true
|
24
22
|
end
|
@@ -37,7 +35,7 @@ describe CsvRecord::Validations do
|
|
37
35
|
end
|
38
36
|
end
|
39
37
|
|
40
|
-
describe 'invalid?' do
|
38
|
+
describe '#invalid?' do
|
41
39
|
it 'invalid object' do
|
42
40
|
invalid_jedi.invalid?.must_equal true
|
43
41
|
end
|
@@ -47,7 +45,7 @@ describe CsvRecord::Validations do
|
|
47
45
|
end
|
48
46
|
end
|
49
47
|
|
50
|
-
describe 'errors' do
|
48
|
+
describe '#errors' do
|
51
49
|
it 'wont be empty when invalid' do
|
52
50
|
invalid_jedi.valid?
|
53
51
|
invalid_jedi.errors.wont_be_empty
|
@@ -77,7 +75,7 @@ describe CsvRecord::Validations do
|
|
77
75
|
end
|
78
76
|
end
|
79
77
|
|
80
|
-
describe 'validates_uniqueness_of' do
|
78
|
+
describe '.validates_uniqueness_of' do
|
81
79
|
before { yoda.save }
|
82
80
|
|
83
81
|
let :fake_yoda do
|
@@ -89,12 +87,13 @@ describe CsvRecord::Validations do
|
|
89
87
|
end
|
90
88
|
end
|
91
89
|
|
92
|
-
describe 'custom_validator' do
|
93
|
-
it ('responds to validate') { CustomErrorsClass.must_respond_to :validate }
|
94
|
-
|
90
|
+
describe '.custom_validator' do
|
95
91
|
let(:custom_error_class) { CustomErrorsClass.new }
|
92
|
+
|
96
93
|
before { custom_error_class.valid? }
|
97
94
|
|
95
|
+
it ('responds to validate') { CustomErrorsClass.must_respond_to :validate }
|
96
|
+
|
98
97
|
it 'adding a custom validator' do
|
99
98
|
custom_error_class.errors.must_include :custom_error
|
100
99
|
end
|
@@ -10,8 +10,6 @@ describe CsvRecord::Writer do
|
|
10
10
|
describe 'initializing instance methods' do
|
11
11
|
it ('responds to save') { luke.must_respond_to :save }
|
12
12
|
it ('responds to new_record?') { luke.must_respond_to :new_record? }
|
13
|
-
it ('responds to calculate_id') { luke.must_respond_to :calculate_id }
|
14
|
-
it ('responds to write_object') { luke.must_respond_to :write_object }
|
15
13
|
it ('responds to id') { luke.must_respond_to :id }
|
16
14
|
it ('responds to update_attribute') { luke.must_respond_to :update_attribute }
|
17
15
|
it ('responds to update_attributes') { luke.must_respond_to :update_attributes }
|
@@ -19,7 +17,7 @@ describe CsvRecord::Writer do
|
|
19
17
|
end
|
20
18
|
|
21
19
|
describe 'validating the methods behavior' do
|
22
|
-
describe 'create' do
|
20
|
+
describe '.create' do
|
23
21
|
it "Creates more than one registry" do
|
24
22
|
luke.save
|
25
23
|
yoda.save
|
@@ -44,9 +42,18 @@ describe CsvRecord::Writer do
|
|
44
42
|
yoda.save
|
45
43
|
yoda.id.must_equal 2
|
46
44
|
end
|
45
|
+
|
46
|
+
it 'should take a block' do
|
47
|
+
jedi = Jedi.create do |jedi|
|
48
|
+
jedi.name = 'Lukas Alexandre'
|
49
|
+
jedi.age = '24'
|
50
|
+
jedi.midi_chlorians = '99k'
|
51
|
+
end
|
52
|
+
jedi.new_record?.must_equal false
|
53
|
+
end
|
47
54
|
end
|
48
55
|
|
49
|
-
describe 'new_record' do
|
56
|
+
describe '#new_record' do
|
50
57
|
it "Checks whether is a new record" do
|
51
58
|
luke.new_record?.must_equal true
|
52
59
|
luke.save
|
@@ -60,21 +67,33 @@ describe CsvRecord::Writer do
|
|
60
67
|
end
|
61
68
|
|
62
69
|
describe 'updates' do
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
70
|
+
before { luke.save }
|
71
|
+
|
72
|
+
describe '#update_attribute' do
|
73
|
+
it "Updates a single field" do
|
74
|
+
luke.update_attribute :age, 24
|
75
|
+
Jedi.find(luke).age.must_equal '24'
|
76
|
+
end
|
67
77
|
end
|
68
78
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
79
|
+
describe '#update_attributes' do
|
80
|
+
it "Updates multiple fields at the same time" do
|
81
|
+
luke.update_attributes name: 'lukas', midi_chlorians: '99999k'
|
82
|
+
Jedi.find(luke).name.must_equal 'lukas'
|
83
|
+
Jedi.find(luke).midi_chlorians.must_equal '99999k'
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'should take a block' do
|
87
|
+
luke.update_attributes do |jedi|
|
88
|
+
jedi.age = 25
|
89
|
+
jedi.name = 'Lukas Skywalker'
|
90
|
+
end
|
91
|
+
luke.age.must_equal 25
|
92
|
+
luke.name.must_equal 'Lukas Skywalker'
|
93
|
+
end
|
74
94
|
end
|
75
95
|
|
76
96
|
it "Updates multiple fields using save" do
|
77
|
-
luke.save
|
78
97
|
luke.name = 'lukas'
|
79
98
|
luke.age = 24
|
80
99
|
luke.save
|
@@ -84,20 +103,43 @@ describe CsvRecord::Writer do
|
|
84
103
|
end
|
85
104
|
end
|
86
105
|
|
87
|
-
describe 'destroy' do
|
88
|
-
|
106
|
+
describe '#destroy' do
|
107
|
+
before do
|
89
108
|
luke.save
|
90
109
|
luke.destroy
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'remove the object from the database' do
|
91
113
|
Jedi.count.must_equal 0
|
92
114
|
end
|
93
115
|
|
94
116
|
it 'by destroying the object its timestamps and id should be empty' do
|
95
|
-
luke.save
|
96
|
-
luke.destroy
|
97
117
|
luke.id.must_be_nil
|
98
118
|
luke.created_at.must_be_nil
|
99
119
|
luke.updated_at.must_be_nil
|
100
120
|
end
|
101
121
|
end
|
102
122
|
end
|
123
|
+
|
124
|
+
describe '.store_as' do
|
125
|
+
it 'uses the default class name' do
|
126
|
+
Jedi.table_name.must_equal 'jedis'
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'uses a custom database name' do
|
130
|
+
CustomizedClass.table_name.must_equal 'wierd_names'
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
describe '.mapping' do
|
135
|
+
it 'checking the fields initialization' do
|
136
|
+
CustomizedClass.fields.must_include :wierd_field
|
137
|
+
CustomizedClass.doppelganger_fields.wont_include :name
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'checking the recovery of the custom field' do
|
141
|
+
CustomizedClass.create name: 'Ruppert'
|
142
|
+
CustomizedClass.first.name.must_equal 'Ruppert'
|
143
|
+
end
|
144
|
+
end
|
103
145
|
end
|
data/test/helpers.rb
ADDED
@@ -41,16 +41,14 @@ describe Object do
|
|
41
41
|
'abc'.to_param.must_equal 'abc'
|
42
42
|
end
|
43
43
|
|
44
|
-
it 'passing a
|
44
|
+
it 'passing a float' do
|
45
45
|
(15.50).to_param.must_equal 15.50
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
49
|
describe 'underscored_class_name' do
|
50
50
|
it 'custom class' do
|
51
|
-
|
52
|
-
MyCustomClass = new_class
|
53
|
-
|
51
|
+
MyCustomClass = Class.new
|
54
52
|
MyCustomClass.new.underscored_class_name.must_equal 'my_custom_class'
|
55
53
|
end
|
56
54
|
end
|
data/test/test_helper.rb
CHANGED
@@ -3,15 +3,18 @@ require 'minitest/autorun'
|
|
3
3
|
require 'turn'
|
4
4
|
require 'csv_record'
|
5
5
|
|
6
|
-
|
7
|
-
BASE_PATH = File.expand_path("../fixtures", __FILE__)
|
6
|
+
require_relative 'helpers'
|
8
7
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
require_relative 'models/jedi'
|
9
|
+
require_relative 'models/jedi_order'
|
10
|
+
require_relative 'models/padawan'
|
11
|
+
require_relative 'models/callback_test_class'
|
12
|
+
require_relative 'models/custom_errors_class'
|
13
|
+
require_relative 'models/customized_class'
|
13
14
|
|
14
15
|
class MiniTest::Spec
|
16
|
+
include Helpers
|
17
|
+
|
15
18
|
after :each do
|
16
19
|
FileUtils.rm_rf 'db'
|
17
20
|
end
|