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,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