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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # This module handles the behaviour for setting up document created at
2
4
  # timestamp.
3
5
  module CsvRecord::Timestamps
@@ -15,7 +17,7 @@ module CsvRecord::Timestamps
15
17
  end
16
18
  end
17
19
 
18
- private
20
+ private
19
21
 
20
22
  # Update the created_at field on the Document to the current time. This is
21
23
  # only called on create.
@@ -41,4 +43,4 @@ private
41
43
 
42
44
  alias :set_created_at :__set_created_at__
43
45
  alias :set_updated_at :__set_updated_at__
44
- end
46
+ end
@@ -1,6 +1,6 @@
1
1
  module CsvRecord
2
- MAJOR = 2
3
- MINOR = 1
4
- PATCH = 2
2
+ MAJOR = 3
3
+ MINOR = 0
4
+ PATCH = 0
5
5
  VERSION = "#{MAJOR}.#{MINOR}.#{PATCH}"
6
6
  end
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CsvRecord::Writer
4
+ module ClassMethods
5
+ def __create__(attributes={})
6
+ build(attributes).tap do |instance|
7
+ yield instance if block_given?
8
+ instance.save
9
+ end
10
+ end
11
+
12
+ [:attr_accessor, :attr_writer].each do |custom_accessor|
13
+ define_method custom_accessor do |*attributes|
14
+ attributes.each do |attribute|
15
+ unless fields.has_name? attribute
16
+ fields << CsvRecord::Field.new(attribute)
17
+ end
18
+ end
19
+ super(*attributes)
20
+ end
21
+ end
22
+
23
+ def store_as(name)
24
+ @table_name = name.to_s.underscore.pluralize
25
+ redefine_database_location
26
+
27
+ @table_name
28
+ end
29
+
30
+ def table_name
31
+ @table_name ||= store_as name
32
+ end
33
+
34
+ def mapping(config=[])
35
+ config.each do |field, doppelganger|
36
+ unless fields.include? field
37
+ fields << CsvRecord::Field.new(field, doppelganger)
38
+ end
39
+ end
40
+ end
41
+
42
+ def redefine_database_location
43
+ if const_defined?('DATABASE_LOCATION') || const_defined?('DATABASE_LOCATION_TMP')
44
+ send :remove_const, 'DATABASE_LOCATION'
45
+ send :remove_const, 'DATABASE_LOCATION_TMP'
46
+ end
47
+
48
+ const_set 'DATABASE_LOCATION', "db/#{@table_name}.csv"
49
+ const_set 'DATABASE_LOCATION_TMP', "db/#{@table_name}_tmp.csv"
50
+ end
51
+
52
+ alias :create :__create__
53
+ end
54
+
55
+ module InstanceMethods
56
+ def self.included(receiver)
57
+ receiver.send :attr_accessor, :id
58
+ end
59
+
60
+ def __save__(validate=true)
61
+ if (not validate) || valid?
62
+ new_record? ? append_registry : update_registry
63
+ else
64
+ false
65
+ end
66
+ end
67
+
68
+ def new_record?
69
+ created_at.nil? || id.nil?
70
+ end
71
+
72
+ def __update_attribute__(field, value)
73
+ public_send "#{field}=", value
74
+ save false
75
+ end
76
+
77
+ def __update_attributes__(params={validate: true})
78
+ validate = params.delete :validate
79
+
80
+ params.each do |field, value|
81
+ public_send "#{field}=", value
82
+ end
83
+
84
+ yield self if block_given?
85
+
86
+ save validate
87
+ end
88
+
89
+ def __destroy__
90
+ self.class.parse_database_file do |row|
91
+ new_row = row
92
+ new_row = nil if id.to_i == row.field('id').to_i
93
+ new_row
94
+ end
95
+ empty_fields
96
+ true
97
+ end
98
+
99
+ private
100
+
101
+ def calculate_id
102
+ @id = self.class.count + 1
103
+ end
104
+
105
+ def append_registry
106
+ write_object
107
+ end
108
+
109
+ def update_registry
110
+ self.class.parse_database_file do |row|
111
+ new_row = row
112
+ new_row = values if id.to_i == row.field('id').to_i
113
+ new_row
114
+ end
115
+ true
116
+ end
117
+
118
+ def __write_object__
119
+ calculate_id
120
+ self.class.open_database_file CsvRecord::Connector::APPEND_MODE do |csv|
121
+ csv << values
122
+ end
123
+ true
124
+ end
125
+
126
+ def empty_fields
127
+ %w(id created_at updated_at).each do |field|
128
+ public_send "#{field}=", nil
129
+ end
130
+ end
131
+
132
+ alias :save :__save__
133
+ alias :write_object :__write_object__
134
+ alias :update_attribute :__update_attribute__
135
+ alias :destroy :__destroy__
136
+ alias :update_attributes :__update_attributes__
137
+ end
138
+
139
+ def self.included(receiver)
140
+ receiver.extend ClassMethods
141
+ receiver.send :include, InstanceMethods
142
+ end
143
+ end
@@ -56,4 +56,4 @@ describe CsvRecord::Associations do
56
56
  qui_gon_jinn.padawan.must_be_instance_of Padawan
57
57
  end
58
58
  end
59
- end
59
+ end
@@ -11,7 +11,7 @@ describe CsvRecord::Connector do
11
11
  describe 'validating the methods behavior' do
12
12
  it "Creates the database folder" do
13
13
  Jedi.initialize_db_directory.wont_be_nil
14
- Dir.exists?('db').must_equal true
14
+ Dir.exist?('db').must_equal true
15
15
  end
16
16
 
17
17
  it "Checks the database initialization state" do
@@ -22,7 +22,7 @@ describe CsvRecord::Connector do
22
22
 
23
23
  it "Creates the database file" do
24
24
  luke.save
25
- File.exists?(Jedi::DATABASE_LOCATION).must_equal true
25
+ File.exist?(Jedi::DATABASE_LOCATION).must_equal true
26
26
  end
27
27
  end
28
- end
28
+ end
@@ -179,9 +179,9 @@ describe CsvRecord::Reader do
179
179
  end
180
180
 
181
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
182
+ found_jedi = Jedi.find_by_age(852)
183
+ found_jedi.wont_be_nil
184
+ found_jedi.must_be_instance_of Jedi
185
185
  end
186
186
 
187
187
  it 'finding with multiple fields' do
@@ -194,10 +194,10 @@ describe CsvRecord::Reader do
194
194
  end
195
195
  if conditions[i]
196
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
197
+ found_jedis.wont_be_nil
198
+ found_jedis.must_be_instance_of Jedi
199
199
  end
200
200
  end
201
201
  end
202
202
  end
203
- end
203
+ end
@@ -79,7 +79,7 @@ describe CsvRecord::Validations do
79
79
  before { yoda.save }
80
80
 
81
81
  let :fake_yoda do
82
- fake_yoda = Jedi.new name: 'Yoda the green', age: 238, midi_chlorians: '1k'
82
+ Jedi.new name: 'Yoda the green', age: 238, midi_chlorians: '1k'
83
83
  end
84
84
 
85
85
  it 'can`t have the same name' do
@@ -58,5 +58,4 @@ class CallbackTestClass
58
58
  before_destroy do
59
59
  self.before_destroy_called = true
60
60
  end
61
-
62
- end
61
+ end
@@ -7,7 +7,8 @@ class CustomErrorsClass
7
7
  end
8
8
 
9
9
  private
10
+
10
11
  def my_custom_validator_method
11
12
  self.errors.add :custom_error
12
13
  end
13
- end
14
+ end
@@ -8,4 +8,4 @@ class CustomizedClass
8
8
  attr_accessor :name
9
9
  end
10
10
 
11
- # raise UndefienedCsvField unless self.fields.include? key
11
+ # raise UndefienedCsvField unless self.fields.include? key
@@ -14,11 +14,12 @@ class Jedi
14
14
 
15
15
  def initialize(params={})
16
16
  params.each do |key, value|
17
- self.public_send("#{key}=", value)
17
+ public_send "#{key}=", value
18
18
  end
19
19
  end
20
20
 
21
- private
21
+ private
22
+
22
23
  def my_custom_validator_method
23
24
  @custom_validator_checker = true
24
25
  end
@@ -28,4 +29,4 @@ private
28
29
  def my_after_save_method
29
30
  @after_save_value = true
30
31
  end
31
- end
32
+ end
@@ -7,7 +7,7 @@ class JediOrder
7
7
 
8
8
  def initialize(params={})
9
9
  params.each do |key, value|
10
- self.public_send("#{key}=", value)
10
+ public_send "#{key}=", value
11
11
  end
12
12
  end
13
- end
13
+ end
@@ -4,4 +4,4 @@ class Padawan
4
4
  attr_accessor :name, :age, :midi_chlorians
5
5
 
6
6
  belongs_to :jedi
7
- end
7
+ end
@@ -3,7 +3,7 @@ require 'minitest/autorun'
3
3
  require 'turn'
4
4
  require 'csv_record'
5
5
 
6
- require_relative 'helpers'
6
+ require_relative 'test_helpers'
7
7
 
8
8
  require_relative 'models/jedi'
9
9
  require_relative 'models/jedi_order'
@@ -13,7 +13,7 @@ require_relative 'models/custom_errors_class'
13
13
  require_relative 'models/customized_class'
14
14
 
15
15
  class MiniTest::Spec
16
- include Helpers
16
+ include TestHelpers
17
17
 
18
18
  after :each do
19
19
  FileUtils.rm_rf 'db'
@@ -48,4 +48,4 @@ class MiniTest::Spec
48
48
  midi_chlorians: '4k'
49
49
  )
50
50
  end
51
- end
51
+ end
@@ -1,7 +1,7 @@
1
- module Helpers
1
+ module TestHelpers
2
2
  BASE_PATH = File.expand_path("../fixtures", __FILE__)
3
3
 
4
4
  def fetch_fixture_path(path)
5
5
  File.join(BASE_PATH, path)
6
6
  end
7
- end
7
+ end
metadata CHANGED
@@ -1,96 +1,127 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: csv_record
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.2
5
- prerelease:
4
+ version: 3.0.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Lukas Alexandre
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-03-24 00:00:00.000000000 Z
11
+ date: 2018-01-16 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: activesupport
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ~>
17
+ - - "~>"
20
18
  - !ruby/object:Gem::Version
21
- version: 3.2.9
19
+ version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ~>
24
+ - - "~>"
28
25
  - !ruby/object:Gem::Version
29
- version: 3.2.9
26
+ version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: rake
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ~>
31
+ - - "~>"
36
32
  - !ruby/object:Gem::Version
37
- version: 0.9.2.2
33
+ version: '0'
38
34
  type: :development
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ~>
38
+ - - "~>"
44
39
  - !ruby/object:Gem::Version
45
- version: 0.9.2.2
40
+ version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: timecop
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ~>
45
+ - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: 0.5.3
47
+ version: '0'
54
48
  type: :development
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ~>
52
+ - - "~>"
60
53
  - !ruby/object:Gem::Version
61
- version: 0.5.3
54
+ version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: turn
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ~>
59
+ - - "~>"
68
60
  - !ruby/object:Gem::Version
69
- version: 0.9.6
61
+ version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ~>
66
+ - - "~>"
76
67
  - !ruby/object:Gem::Version
77
- version: 0.9.6
68
+ version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: minitest
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ~>
73
+ - - "~>"
84
74
  - !ruby/object:Gem::Version
85
- version: 4.3.1
75
+ version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ~>
80
+ - - "~>"
92
81
  - !ruby/object:Gem::Version
93
- version: 4.3.1
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: pry
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry-nav
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: m
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
94
125
  description: CSV Object-relational mapping for Ruby
95
126
  email:
96
127
  - lukasalexandre@gmail.com
@@ -98,8 +129,10 @@ executables: []
98
129
  extensions: []
99
130
  extra_rdoc_files: []
100
131
  files:
101
- - .gitignore
102
- - .travis.yml
132
+ - ".gitignore"
133
+ - ".ruby-gemset"
134
+ - ".ruby-version"
135
+ - ".travis.yml"
103
136
  - Gemfile
104
137
  - LICENSE
105
138
  - README.md
@@ -109,26 +142,22 @@ files:
109
142
  - lib/csv_record/associations.rb
110
143
  - lib/csv_record/callback.rb
111
144
  - lib/csv_record/callbacks.rb
145
+ - lib/csv_record/condition.rb
112
146
  - lib/csv_record/connector.rb
113
- - lib/csv_record/csv_fields.rb
114
- - lib/csv_record/csv_queries/condition.rb
115
- - lib/csv_record/csv_queries/query.rb
116
- - lib/csv_record/csv_readers/class_reader.rb
117
- - lib/csv_record/csv_readers/instance_reader.rb
118
- - lib/csv_record/csv_readers/reader.rb
119
147
  - lib/csv_record/csv_validations/custom_validation.rb
120
148
  - lib/csv_record/csv_validations/presence_validation.rb
121
149
  - lib/csv_record/csv_validations/uniqueness_validation.rb
122
150
  - lib/csv_record/csv_validations/validations.rb
123
- - lib/csv_record/csv_writers/class_writer.rb
124
- - lib/csv_record/csv_writers/instance_writer.rb
125
- - lib/csv_record/csv_writers/writer.rb
126
151
  - lib/csv_record/document.rb
127
152
  - lib/csv_record/exceptions.rb
128
153
  - lib/csv_record/field.rb
154
+ - lib/csv_record/fields.rb
129
155
  - lib/csv_record/helpers.rb
156
+ - lib/csv_record/query.rb
157
+ - lib/csv_record/reader.rb
130
158
  - lib/csv_record/timestamps.rb
131
159
  - lib/csv_record/version.rb
160
+ - lib/csv_record/writer.rb
132
161
  - test/csv_record/associations_test.rb
133
162
  - test/csv_record/callbacks_test.rb
134
163
  - test/csv_record/condition_test.rb
@@ -139,7 +168,6 @@ files:
139
168
  - test/csv_record/timestamps_test.rb
140
169
  - test/csv_record/validation_test.rb
141
170
  - test/csv_record/writer_test.rb
142
- - test/helpers.rb
143
171
  - test/models/callback_test_class.rb
144
172
  - test/models/custom_errors_class.rb
145
173
  - test/models/customized_class.rb
@@ -148,30 +176,30 @@ files:
148
176
  - test/models/padawan.rb
149
177
  - test/monkey_patches/object_test.rb
150
178
  - test/test_helper.rb
179
+ - test/test_helpers.rb
151
180
  homepage: https://github.com/lukelex/csv_record
152
181
  licenses:
153
182
  - MIT
183
+ metadata: {}
154
184
  post_install_message:
155
185
  rdoc_options: []
156
186
  require_paths:
157
187
  - lib
158
188
  required_ruby_version: !ruby/object:Gem::Requirement
159
- none: false
160
189
  requirements:
161
- - - ! '>='
190
+ - - ">="
162
191
  - !ruby/object:Gem::Version
163
192
  version: '0'
164
193
  required_rubygems_version: !ruby/object:Gem::Requirement
165
- none: false
166
194
  requirements:
167
- - - ! '>='
195
+ - - ">="
168
196
  - !ruby/object:Gem::Version
169
197
  version: '0'
170
198
  requirements: []
171
199
  rubyforge_project:
172
- rubygems_version: 1.8.25
200
+ rubygems_version: 2.6.14
173
201
  signing_key:
174
- specification_version: 3
202
+ specification_version: 4
175
203
  summary: CSV Record connects Ruby classes to CSV documents database to establish an
176
204
  almost zero-configuration persistence layer for applications.
177
205
  test_files:
@@ -185,7 +213,6 @@ test_files:
185
213
  - test/csv_record/timestamps_test.rb
186
214
  - test/csv_record/validation_test.rb
187
215
  - test/csv_record/writer_test.rb
188
- - test/helpers.rb
189
216
  - test/models/callback_test_class.rb
190
217
  - test/models/custom_errors_class.rb
191
218
  - test/models/customized_class.rb
@@ -194,3 +221,4 @@ test_files:
194
221
  - test/models/padawan.rb
195
222
  - test/monkey_patches/object_test.rb
196
223
  - test/test_helper.rb
224
+ - test/test_helpers.rb