csv_record 2.1.2 → 3.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 +7 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +4 -1
- data/README.md +51 -39
- data/Rakefile +1 -1
- data/csv_record.gemspec +8 -6
- data/lib/csv_record.rb +0 -23
- data/lib/csv_record/associations.rb +1 -1
- data/lib/csv_record/callback.rb +4 -2
- data/lib/csv_record/callbacks.rb +21 -19
- data/lib/csv_record/{csv_queries/condition.rb → condition.rb} +4 -2
- data/lib/csv_record/connector.rb +9 -7
- data/lib/csv_record/csv_validations/custom_validation.rb +8 -5
- data/lib/csv_record/csv_validations/presence_validation.rb +6 -4
- data/lib/csv_record/csv_validations/uniqueness_validation.rb +8 -5
- data/lib/csv_record/csv_validations/validations.rb +23 -28
- data/lib/csv_record/document.rb +12 -12
- data/lib/csv_record/field.rb +6 -4
- data/lib/csv_record/fields.rb +45 -0
- data/lib/csv_record/helpers.rb +10 -6
- data/lib/csv_record/{csv_queries/query.rb → query.rb} +8 -15
- data/lib/csv_record/reader.rb +120 -0
- data/lib/csv_record/timestamps.rb +4 -2
- data/lib/csv_record/version.rb +3 -3
- data/lib/csv_record/writer.rb +143 -0
- data/test/csv_record/associations_test.rb +1 -1
- data/test/csv_record/connector_test.rb +3 -3
- data/test/csv_record/reader_test.rb +6 -6
- data/test/csv_record/validation_test.rb +1 -1
- data/test/models/callback_test_class.rb +1 -2
- data/test/models/custom_errors_class.rb +2 -1
- data/test/models/customized_class.rb +1 -1
- data/test/models/jedi.rb +4 -3
- data/test/models/jedi_order.rb +2 -2
- data/test/models/padawan.rb +1 -1
- data/test/test_helper.rb +3 -3
- data/test/{helpers.rb → test_helpers.rb} +2 -2
- metadata +80 -52
- data/lib/csv_record/csv_fields.rb +0 -45
- data/lib/csv_record/csv_readers/class_reader.rb +0 -82
- data/lib/csv_record/csv_readers/instance_reader.rb +0 -29
- data/lib/csv_record/csv_readers/reader.rb +0 -9
- data/lib/csv_record/csv_writers/class_writer.rb +0 -52
- data/lib/csv_record/csv_writers/instance_writer.rb +0 -86
- data/lib/csv_record/csv_writers/writer.rb +0 -9
@@ -1,45 +0,0 @@
|
|
1
|
-
class CsvRecord::CsvFields
|
2
|
-
include Enumerable
|
3
|
-
|
4
|
-
def fields
|
5
|
-
@fields ||= []
|
6
|
-
end
|
7
|
-
|
8
|
-
def <<(field)
|
9
|
-
self.fields << field
|
10
|
-
end
|
11
|
-
|
12
|
-
def include?(field)
|
13
|
-
self.has_doppelganger? field
|
14
|
-
end
|
15
|
-
|
16
|
-
[:name, :doppelganger].each do |attribute|
|
17
|
-
define_method "has_#{attribute}?" do |field|
|
18
|
-
self.fields.any? do |field_model|
|
19
|
-
field_model.public_send(attribute) == field
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def find_with_doppelganger(doppelganger)
|
25
|
-
self.fields.select do |field|
|
26
|
-
field.is? doppelganger
|
27
|
-
end.first
|
28
|
-
end
|
29
|
-
|
30
|
-
def each(&block)
|
31
|
-
self.fields.each &block
|
32
|
-
end
|
33
|
-
|
34
|
-
def method_missing(meth, *args, &block)
|
35
|
-
if self.to_a.respond_to? meth
|
36
|
-
self.to_a.public_send meth, *args, &block
|
37
|
-
else
|
38
|
-
super # You *must* call super if you don't handle the
|
39
|
-
# method, otherwise you'll mess up Ruby's method
|
40
|
-
# lookup.
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
alias :add :<<
|
45
|
-
end
|
@@ -1,82 +0,0 @@
|
|
1
|
-
require 'csv_record/csv_queries/query'
|
2
|
-
|
3
|
-
module CsvRecord::Reader
|
4
|
-
module ClassMethods
|
5
|
-
DYNAMIC_FINDER_PATTERN = /^find_by_(.+)$/
|
6
|
-
|
7
|
-
def build(params={})
|
8
|
-
inst = new
|
9
|
-
params.each do |key, value|
|
10
|
-
attribute = fields.find_with_doppelganger(key)
|
11
|
-
attr_name = attribute ? attribute.name : key
|
12
|
-
inst.public_send "#{attr_name}=", value
|
13
|
-
end if params
|
14
|
-
yield inst if block_given?
|
15
|
-
inst
|
16
|
-
end
|
17
|
-
|
18
|
-
def __fields__
|
19
|
-
@fields ||= CsvRecord::CsvFields.new
|
20
|
-
end
|
21
|
-
|
22
|
-
def __doppelganger_fields__
|
23
|
-
self.__fields__.map &:doppelganger
|
24
|
-
end
|
25
|
-
|
26
|
-
def all
|
27
|
-
open_database_file do |csv|
|
28
|
-
csv.entries.map { |attributes| self.build attributes }
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def first
|
33
|
-
all.first
|
34
|
-
end
|
35
|
-
|
36
|
-
def last
|
37
|
-
all.last
|
38
|
-
end
|
39
|
-
|
40
|
-
def __count__
|
41
|
-
open_database_file do |csv|
|
42
|
-
csv.entries.size
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def __find__(condition)
|
47
|
-
(__where__ id: condition.to_param).first
|
48
|
-
end
|
49
|
-
|
50
|
-
def __where__(params)
|
51
|
-
CsvRecord::Query.new self, params
|
52
|
-
end
|
53
|
-
|
54
|
-
def method_missing(meth, *args, &block)
|
55
|
-
if meth.to_s =~ DYNAMIC_FINDER_PATTERN
|
56
|
-
dynamic_finder $1, *args, &block
|
57
|
-
else
|
58
|
-
super # You *must* call super if you don't handle the
|
59
|
-
# method, otherwise you'll mess up Ruby's method
|
60
|
-
# lookup.
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def respond_to?(meth)
|
65
|
-
(meth.to_s =~ DYNAMIC_FINDER_PATTERN) || super
|
66
|
-
end
|
67
|
-
|
68
|
-
protected
|
69
|
-
|
70
|
-
def dynamic_finder(meth, *args, &block)
|
71
|
-
properties = meth.split '_and_'
|
72
|
-
conditions = Hash[properties.zip args]
|
73
|
-
__where__ conditions
|
74
|
-
end
|
75
|
-
|
76
|
-
alias :fields :__fields__
|
77
|
-
alias :find :__find__
|
78
|
-
alias :count :__count__
|
79
|
-
alias :where :__where__
|
80
|
-
alias :doppelganger_fields :__doppelganger_fields__
|
81
|
-
end
|
82
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module CsvRecord::Reader
|
2
|
-
module InstanceMethods
|
3
|
-
def __values__
|
4
|
-
self.class.fields.map do |attribute|
|
5
|
-
self.public_send attribute.name
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
def __attributes__
|
10
|
-
Hash[self.class.fields.zip self.values]
|
11
|
-
end
|
12
|
-
|
13
|
-
def __to_param__
|
14
|
-
self.id.to_s
|
15
|
-
end
|
16
|
-
|
17
|
-
def ==(obj)
|
18
|
-
self.class == obj.class and self.to_param == obj.to_param
|
19
|
-
end
|
20
|
-
|
21
|
-
def !=(obj)
|
22
|
-
self.class != obj.class || self.to_param != obj.to_param
|
23
|
-
end
|
24
|
-
|
25
|
-
alias :attributes :__attributes__
|
26
|
-
alias :values :__values__
|
27
|
-
alias :to_param :__to_param__
|
28
|
-
end
|
29
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
module CsvRecord::Writer
|
2
|
-
module ClassMethods
|
3
|
-
def __create__(attributes={})
|
4
|
-
instance = self.build attributes
|
5
|
-
yield instance if block_given?
|
6
|
-
result = instance.save
|
7
|
-
instance
|
8
|
-
end
|
9
|
-
|
10
|
-
[:attr_accessor, :attr_writer].each do |custom_accessor|
|
11
|
-
define_method custom_accessor do |*attributes|
|
12
|
-
attributes.each do |attribute|
|
13
|
-
unless self.fields.has_name? attribute
|
14
|
-
self.fields << CsvRecord::Field.new(attribute)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
super *attributes
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def store_as(name)
|
22
|
-
@table_name = name.to_s.underscore.pluralize
|
23
|
-
redefine_database_location
|
24
|
-
|
25
|
-
@table_name
|
26
|
-
end
|
27
|
-
|
28
|
-
def table_name
|
29
|
-
@table_name ||= store_as name
|
30
|
-
end
|
31
|
-
|
32
|
-
def mapping(config=[])
|
33
|
-
config.each do |field, doppelganger|
|
34
|
-
unless self.fields.include? field
|
35
|
-
self.fields << (CsvRecord::Field.new field, doppelganger)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def redefine_database_location
|
41
|
-
if const_defined?('DATABASE_LOCATION') || const_defined?('DATABASE_LOCATION_TMP')
|
42
|
-
send :remove_const, 'DATABASE_LOCATION'
|
43
|
-
send :remove_const, 'DATABASE_LOCATION_TMP'
|
44
|
-
end
|
45
|
-
|
46
|
-
const_set 'DATABASE_LOCATION', "db/#{@table_name}.csv"
|
47
|
-
const_set 'DATABASE_LOCATION_TMP', "db/#{@table_name}_tmp.csv"
|
48
|
-
end
|
49
|
-
|
50
|
-
alias :create :__create__
|
51
|
-
end
|
52
|
-
end
|
@@ -1,86 +0,0 @@
|
|
1
|
-
module CsvRecord::Writer
|
2
|
-
module InstanceMethods
|
3
|
-
def self.included(receiver)
|
4
|
-
receiver.send :attr_accessor, :id
|
5
|
-
end
|
6
|
-
|
7
|
-
def __save__(validate=true)
|
8
|
-
if (not validate) || self.valid?
|
9
|
-
self.new_record? ? self.append_registry : self.update_registry
|
10
|
-
else
|
11
|
-
false
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def new_record?
|
16
|
-
self.created_at.nil? || self.id.nil?
|
17
|
-
end
|
18
|
-
|
19
|
-
def __update_attribute__(field, value)
|
20
|
-
self.public_send "#{field}=", value
|
21
|
-
self.save false
|
22
|
-
end
|
23
|
-
|
24
|
-
def __update_attributes__(params={validate: true})
|
25
|
-
validate = params[:validate]
|
26
|
-
params.delete :validate
|
27
|
-
|
28
|
-
params.each do |field, value|
|
29
|
-
self.public_send "#{field}=", value
|
30
|
-
end
|
31
|
-
|
32
|
-
yield self if block_given?
|
33
|
-
|
34
|
-
self.save validate
|
35
|
-
end
|
36
|
-
|
37
|
-
def __destroy__
|
38
|
-
self.class.parse_database_file do |row|
|
39
|
-
new_row = row
|
40
|
-
new_row = nil if self.id.to_i == row.field('id').to_i
|
41
|
-
new_row
|
42
|
-
end
|
43
|
-
empty_fields
|
44
|
-
true
|
45
|
-
end
|
46
|
-
|
47
|
-
protected
|
48
|
-
|
49
|
-
def calculate_id
|
50
|
-
@id = self.class.count + 1
|
51
|
-
end
|
52
|
-
|
53
|
-
def append_registry
|
54
|
-
write_object
|
55
|
-
end
|
56
|
-
|
57
|
-
def update_registry
|
58
|
-
self.class.parse_database_file do |row|
|
59
|
-
new_row = row
|
60
|
-
new_row = self.values if self.id.to_i == row.field('id').to_i
|
61
|
-
new_row
|
62
|
-
end
|
63
|
-
true
|
64
|
-
end
|
65
|
-
|
66
|
-
def __write_object__
|
67
|
-
calculate_id
|
68
|
-
self.class.open_database_file CsvRecord::Connector::APPEND_MODE do |csv|
|
69
|
-
csv << values
|
70
|
-
end
|
71
|
-
true
|
72
|
-
end
|
73
|
-
|
74
|
-
def empty_fields
|
75
|
-
%w(id created_at updated_at).each do |field|
|
76
|
-
self.public_send "#{field}=", nil
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
alias :save :__save__
|
81
|
-
alias :write_object :__write_object__
|
82
|
-
alias :update_attribute :__update_attribute__
|
83
|
-
alias :destroy :__destroy__
|
84
|
-
alias :update_attributes :__update_attributes__
|
85
|
-
end
|
86
|
-
end
|