csv_record 2.1.2 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
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