csv_record 1.2.0 → 1.3.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/Rakefile +1 -1
- data/lib/csv_record/connector.rb +3 -5
- data/lib/csv_record/reader.rb +16 -2
- data/lib/csv_record/version.rb +1 -1
- data/test/csv_record/reader_test.rb +36 -1
- metadata +1 -1
data/Rakefile
CHANGED
data/lib/csv_record/connector.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
|
-
require 'FileUtils'
|
2
|
-
|
3
1
|
module CsvRecord
|
4
2
|
module Connector
|
5
3
|
def __initialize_db_directory__
|
6
4
|
unless Dir.exists? 'db'
|
7
|
-
|
5
|
+
Dir.mkdir 'db'
|
8
6
|
end
|
9
7
|
end
|
10
8
|
|
@@ -22,14 +20,14 @@ module CsvRecord
|
|
22
20
|
end
|
23
21
|
|
24
22
|
def __open_database_file__(mode='r')
|
25
|
-
CSV.open(self.const_get('DATABASE_LOCATION'), mode, :
|
23
|
+
CSV.open(self.const_get('DATABASE_LOCATION'), mode, headers: true) do |csv|
|
26
24
|
yield(csv)
|
27
25
|
end
|
28
26
|
end
|
29
27
|
|
30
28
|
def __parse_database_file__
|
31
29
|
open_database_file do |csv|
|
32
|
-
CSV.open(self.const_get('DATABASE_LOCATION_TMP'), 'w', :
|
30
|
+
CSV.open(self.const_get('DATABASE_LOCATION_TMP'), 'w', headers: true) do |copy|
|
33
31
|
copy << fields
|
34
32
|
csv.entries.each do |entry|
|
35
33
|
new_row = yield(entry)
|
data/lib/csv_record/reader.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module CsvRecord
|
2
2
|
module Reader
|
3
3
|
module ClassMethods
|
4
|
+
DYNAMIC_FINDER_PATTERN = /^find_by_(.+)$/
|
5
|
+
|
4
6
|
def __fields__
|
5
7
|
instance_methods(false).select { |m| m.to_s !~ /=$/ }
|
6
8
|
end
|
@@ -27,7 +29,7 @@ module CsvRecord
|
|
27
29
|
|
28
30
|
def __find__(param)
|
29
31
|
param = param.id unless param.is_a? Integer
|
30
|
-
(__where__ :
|
32
|
+
(__where__ id: param).first
|
31
33
|
end
|
32
34
|
|
33
35
|
def __where__(params)
|
@@ -56,7 +58,7 @@ module CsvRecord
|
|
56
58
|
end
|
57
59
|
|
58
60
|
def method_missing(meth, *args, &block)
|
59
|
-
if meth.to_s =~
|
61
|
+
if meth.to_s =~ DYNAMIC_FINDER_PATTERN
|
60
62
|
dynamic_finder $1, *args, &block
|
61
63
|
else
|
62
64
|
super # You *must* call super if you don't handle the
|
@@ -65,6 +67,18 @@ module CsvRecord
|
|
65
67
|
end
|
66
68
|
end
|
67
69
|
|
70
|
+
def respond_to?(meth)
|
71
|
+
(meth.to_s =~ DYNAMIC_FINDER_PATTERN) || super
|
72
|
+
end
|
73
|
+
|
74
|
+
protected
|
75
|
+
|
76
|
+
def dynamic_finder(meth, *args, &block)
|
77
|
+
properties = meth.split '_and_'
|
78
|
+
conditions = Hash[properties.zip args]
|
79
|
+
__where__ conditions
|
80
|
+
end
|
81
|
+
|
68
82
|
alias :fields :__fields__
|
69
83
|
alias :find :__find__
|
70
84
|
alias :count :__count__
|
data/lib/csv_record/version.rb
CHANGED
@@ -33,7 +33,7 @@ describe CsvRecord::Reader do
|
|
33
33
|
end
|
34
34
|
|
35
35
|
it "Check the current attributes" do
|
36
|
-
expected_result = {:
|
36
|
+
expected_result = {id: nil, created_at: nil, updated_at: nil, year: 1997, make: 'Ford', model: 'E350', description: 'ac, abs, moon', price: 3000.0}
|
37
37
|
car.attributes.must_equal expected_result
|
38
38
|
end
|
39
39
|
|
@@ -106,6 +106,41 @@ describe CsvRecord::Reader do
|
|
106
106
|
result = Car.where year: 2008, make: 'Chevroletion'
|
107
107
|
result.must_be_empty
|
108
108
|
end
|
109
|
+
|
110
|
+
end
|
111
|
+
describe 'dynamic finders' do
|
112
|
+
before do
|
113
|
+
car.save
|
114
|
+
second_car.save
|
115
|
+
end
|
116
|
+
|
117
|
+
let (:properties) { Car.fields }
|
118
|
+
|
119
|
+
it 'respond to certain dynamic methods' do
|
120
|
+
Car.must_respond_to "find_by_#{properties.sample}"
|
121
|
+
end
|
122
|
+
|
123
|
+
it 'finding with a single field' do
|
124
|
+
found_cars = Car.find_by_year 2007
|
125
|
+
found_cars.wont_be_empty
|
126
|
+
found_cars.first.must_be_instance_of Car
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'finding with multiple fields' do
|
130
|
+
conditions = []
|
131
|
+
properties.each_with_index do |property, i|
|
132
|
+
values = []
|
133
|
+
i.times do |k|
|
134
|
+
conditions[i] = conditions[i] ? "#{conditions[i]}_and_#{properties[k]}" : properties[k]
|
135
|
+
values << car.send(properties[k])
|
136
|
+
end
|
137
|
+
if conditions[i]
|
138
|
+
found_cars = Car.public_send "find_by_#{conditions[i]}", *values
|
139
|
+
found_cars.wont_be_empty
|
140
|
+
found_cars.first.must_be_instance_of Car
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
109
144
|
end
|
110
145
|
end
|
111
146
|
end
|