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.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/.ruby-gemset +1 -0
  3. data/.ruby-version +1 -0
  4. data/.travis.yml +4 -1
  5. data/README.md +51 -39
  6. data/Rakefile +1 -1
  7. data/csv_record.gemspec +8 -6
  8. data/lib/csv_record.rb +0 -23
  9. data/lib/csv_record/associations.rb +1 -1
  10. data/lib/csv_record/callback.rb +4 -2
  11. data/lib/csv_record/callbacks.rb +21 -19
  12. data/lib/csv_record/{csv_queries/condition.rb → condition.rb} +4 -2
  13. data/lib/csv_record/connector.rb +9 -7
  14. data/lib/csv_record/csv_validations/custom_validation.rb +8 -5
  15. data/lib/csv_record/csv_validations/presence_validation.rb +6 -4
  16. data/lib/csv_record/csv_validations/uniqueness_validation.rb +8 -5
  17. data/lib/csv_record/csv_validations/validations.rb +23 -28
  18. data/lib/csv_record/document.rb +12 -12
  19. data/lib/csv_record/field.rb +6 -4
  20. data/lib/csv_record/fields.rb +45 -0
  21. data/lib/csv_record/helpers.rb +10 -6
  22. data/lib/csv_record/{csv_queries/query.rb → query.rb} +8 -15
  23. data/lib/csv_record/reader.rb +120 -0
  24. data/lib/csv_record/timestamps.rb +4 -2
  25. data/lib/csv_record/version.rb +3 -3
  26. data/lib/csv_record/writer.rb +143 -0
  27. data/test/csv_record/associations_test.rb +1 -1
  28. data/test/csv_record/connector_test.rb +3 -3
  29. data/test/csv_record/reader_test.rb +6 -6
  30. data/test/csv_record/validation_test.rb +1 -1
  31. data/test/models/callback_test_class.rb +1 -2
  32. data/test/models/custom_errors_class.rb +2 -1
  33. data/test/models/customized_class.rb +1 -1
  34. data/test/models/jedi.rb +4 -3
  35. data/test/models/jedi_order.rb +2 -2
  36. data/test/models/padawan.rb +1 -1
  37. data/test/test_helper.rb +3 -3
  38. data/test/{helpers.rb → test_helpers.rb} +2 -2
  39. metadata +80 -52
  40. data/lib/csv_record/csv_fields.rb +0 -45
  41. data/lib/csv_record/csv_readers/class_reader.rb +0 -82
  42. data/lib/csv_record/csv_readers/instance_reader.rb +0 -29
  43. data/lib/csv_record/csv_readers/reader.rb +0 -9
  44. data/lib/csv_record/csv_writers/class_writer.rb +0 -52
  45. data/lib/csv_record/csv_writers/instance_writer.rb +0 -86
  46. 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,9 +0,0 @@
1
- require 'csv_record/csv_readers/class_reader'
2
- require 'csv_record/csv_readers/instance_reader'
3
-
4
- module CsvRecord::Reader
5
- def self.included(receiver)
6
- receiver.extend ClassMethods
7
- receiver.send :include, InstanceMethods
8
- end
9
- 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
@@ -1,9 +0,0 @@
1
- require 'csv_record/csv_writers/instance_writer'
2
- require 'csv_record/csv_writers/class_writer'
3
-
4
- module CsvRecord::Writer
5
- def self.included(receiver)
6
- receiver.extend ClassMethods
7
- receiver.send :include, InstanceMethods
8
- end
9
- end