csv_record 1.5.0 → 1.6.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.
data/README.md CHANGED
@@ -33,6 +33,8 @@ class Car
33
33
  include CsvRecord::Document
34
34
 
35
35
  attr_accessor :year, :make, :model, :description, :price
36
+
37
+ validates_presence_of :price, :model
36
38
  end
37
39
  ```
38
40
 
@@ -48,7 +50,7 @@ Car.create( # save the new record in the database
48
50
  )
49
51
 
50
52
  car.save # save the record in the database (either creating or changing)
51
-
53
+ car.valid? # verifies its validity, specially if it is declared some of the available validators (e.x:validates_presence_of).
52
54
  car.update_attribute :year, 1999 # update a single field of an object
53
55
  car.update_attributes year: 1999, model: 'E762' # update multiple fields at the same time
54
56
 
@@ -102,7 +104,7 @@ car.company # #<Company:0x007f9b249b24d8>
102
104
  ```
103
105
 
104
106
  ###Has Many
105
- Extending the previous example, you can use the `has_many` method to stablish the inverse relationship:
107
+ Extending the previous example, you can use the `has_many` method to establish the inverse relationship:
106
108
  ```ruby
107
109
  class Company
108
110
  include CsvRecord::Document
@@ -134,6 +136,31 @@ end
134
136
  ```
135
137
  `obj` refers to the instance you are in
136
138
 
139
+ ##Validations
140
+
141
+ Helpers available:
142
+
143
+ `validates_presence_of`: Ensures if the specified attributes were filled
144
+
145
+ ```ruby
146
+ class Company
147
+ include CsvRecord::Document
148
+ validates_presence_of :name
149
+ attr_accessor :name
150
+ end
151
+
152
+ company = Company.create :name => ''
153
+ company.save
154
+ # => false
155
+
156
+ company = Company.create :name => ''
157
+ company.valid?
158
+ # => false
159
+ company.invalid?
160
+ # => true
161
+
162
+ ```
163
+
137
164
  ##Precautions
138
165
  CsvRecord creates a `db` folder in the root of your application. Be sure that it has permission to do so.
139
166
 
data/Rakefile CHANGED
@@ -4,7 +4,7 @@ require "rake/testtask"
4
4
 
5
5
  Rake::TestTask.new do |t|
6
6
  t.libs.push "lib"
7
- t.test_files = FileList['test/csv_record/*_test.rb']
7
+ t.test_files = FileList['test/csv_record/*_test.rb', 'test/monkey_patches/*_test.rb']
8
8
  t.verbose = true
9
9
  end
10
10
 
data/csv_record.gemspec CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |gem|
18
18
  gem.add_dependency 'activesupport'
19
19
 
20
20
  gem.add_development_dependency 'rake'
21
+ gem.add_development_dependency 'pry'
21
22
  gem.add_development_dependency 'timecop'
22
23
  gem.add_development_dependency 'turn'
23
24
  end
@@ -1,5 +1,6 @@
1
1
  module CsvRecord
2
2
  module Callbacks
3
+
3
4
  CALLBACKS = [
4
5
  :after_create,
5
6
  :after_initialize,
@@ -7,6 +7,7 @@ require 'csv_record/timestamps'
7
7
  require 'csv_record/callbacks'
8
8
  require 'csv_record/helpers'
9
9
  require 'csv_record/associations'
10
+ require 'csv_record/validations'
10
11
 
11
12
  module CsvRecord
12
13
 
@@ -23,9 +24,11 @@ module CsvRecord
23
24
  receiver.extend CsvRecord::Writer::ClassMethods
24
25
  receiver.extend CsvRecord::Reader::ClassMethods
25
26
  receiver.extend CsvRecord::Associations
27
+ receiver.extend CsvRecord::Validations::ClassMethods
26
28
  receiver.send :include, CsvRecord::Writer::InstanceMethods
27
29
  receiver.send :include, CsvRecord::Reader::InstanceMethods
28
30
  receiver.send :include, CsvRecord::Timestamps
31
+ receiver.send :include, CsvRecord::Validations::InstanceMethods
29
32
  receiver.send :include, CsvRecord::Callbacks
30
33
  end
31
34
  end
@@ -1,12 +1,12 @@
1
1
  class Object
2
2
  def integer?
3
- self.to_s =~ /^\d+$/
4
- !$0.empty?
3
+ /(?<number>^\d+$)/ =~ self.to_s
4
+ not number.nil?
5
5
  end
6
6
 
7
7
  def float?
8
- self.to_s =~ /^\d+\.\d+$/
9
- !$0.empty?
8
+ /(?<number>^\d+\.\d+)$/ =~ self.to_s
9
+ not number.nil?
10
10
  end
11
11
 
12
12
  def to_param
@@ -32,4 +32,10 @@ class String
32
32
  tr("-", "_").
33
33
  downcase
34
34
  end
35
+ end
36
+
37
+ class Array
38
+ def add(obj)
39
+ self << obj
40
+ end
35
41
  end
@@ -0,0 +1,43 @@
1
+ module CsvRecord
2
+ module Validations
3
+ module ClassMethods
4
+ attr_writer :fields_to_validate
5
+
6
+ def fields_to_validate
7
+ @fields_to_validate || []
8
+ end
9
+
10
+ def __validates_presence_of__(*attr_names)
11
+ @fields_to_validate = attr_names
12
+ end
13
+
14
+ alias :validates_presence_of :__validates_presence_of__
15
+ end
16
+
17
+ module InstanceMethods
18
+ def __valid__?
19
+ validate_each(self.class.fields_to_validate)
20
+ errors.empty?
21
+ end
22
+
23
+ def invalid?
24
+ not self.__valid__?
25
+ end
26
+
27
+ def errors
28
+ @errors || []
29
+ end
30
+
31
+ alias :valid? :__valid__?
32
+
33
+ private
34
+ def validate_each(attributes)
35
+ attributes.each do |attribute|
36
+ if self.public_send(attribute).nil?
37
+ @errors = self.errors.add attribute
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,3 +1,3 @@
1
1
  module CsvRecord
2
- VERSION = "1.5.0"
2
+ VERSION = "1.6.0"
3
3
  end
@@ -26,7 +26,11 @@ module CsvRecord
26
26
  end
27
27
 
28
28
  def __save__
29
- self.new_record? ? self.append_registry : self.update_registry
29
+ if self.valid?
30
+ self.new_record? ? self.append_registry : self.update_registry
31
+ else
32
+ false
33
+ end
30
34
  end
31
35
 
32
36
  def new_record?
@@ -59,9 +63,6 @@ module CsvRecord
59
63
 
60
64
  def calculate_id
61
65
  @id = self.class.count + 1
62
- # if self.respond_to? :jedi_order_id
63
- # p "#{self.class} -> #{@id} -> #{self.jedi_order_id}"
64
- # end
65
66
  end
66
67
 
67
68
  def append_registry
@@ -1,5 +1,4 @@
1
1
  require_relative '../test_helper'
2
-
3
2
  require_relative '../models/jedi'
4
3
  require_relative '../models/jedi_order'
5
4
 
@@ -0,0 +1,77 @@
1
+ require_relative '../test_helper'
2
+ require 'pry'
3
+ require_relative '../models/jedi'
4
+ require_relative '../models/jedi_order'
5
+
6
+ describe CsvRecord::Validations do
7
+ describe 'initializing class methods' do
8
+ it ('responds to validates_presence_of') { Jedi.must_respond_to :validates_presence_of }
9
+ it ('responds to valid?') { Jedi.new.must_respond_to :valid? }
10
+ it ('responds to invalid?') { Jedi.new.must_respond_to :invalid? }
11
+ end
12
+
13
+ describe 'validates_presence_of :name and :age behavior' do
14
+ it 'is not valid without name' do
15
+ yoda.name = nil
16
+ yoda.valid?.wont_equal true
17
+ end
18
+
19
+ it 'is not valid without age' do
20
+ yoda.age = nil
21
+ yoda.valid?.wont_equal true
22
+ end
23
+
24
+ it "is valid with all attributes filled" do
25
+ yoda.valid?.must_equal true
26
+ end
27
+
28
+ it "saves with both attributes filled" do
29
+ yoda.save.must_equal true
30
+ end
31
+
32
+ it "doesn't save without name" do
33
+ yoda.name = nil
34
+ yoda.valid?.wont_equal true
35
+ yoda.save.wont_equal true
36
+ end
37
+
38
+ it "doesn't save without age" do
39
+ yoda.age = nil
40
+ yoda.valid?.wont_equal true
41
+ yoda.save.wont_equal true
42
+ end
43
+
44
+ it "doesn't save without both" do
45
+ yoda.age = nil
46
+ yoda.name = nil
47
+ yoda.valid?.wont_equal true
48
+ yoda.save.wont_equal true
49
+ end
50
+ end
51
+
52
+ describe 'default methods' do
53
+ let (:invalid_jedi) { Jedi.new }
54
+
55
+ describe 'invalid?' do
56
+ it 'invalid object' do
57
+ invalid_jedi.invalid?.must_equal true
58
+ end
59
+
60
+ it 'valid object' do
61
+ yoda.invalid?.must_equal false
62
+ end
63
+ end
64
+
65
+ describe 'errors' do
66
+ it 'wont be empty when invalid' do
67
+ invalid_jedi.valid?
68
+ invalid_jedi.errors.wont_be_empty
69
+ end
70
+
71
+ it 'should have two erros' do
72
+ invalid_jedi.valid?
73
+ invalid_jedi.errors.length.must_equal 2
74
+ end
75
+ end
76
+ end
77
+ end
data/test/models/jedi.rb CHANGED
@@ -5,6 +5,8 @@ class Jedi
5
5
 
6
6
  belongs_to :jedi_order
7
7
 
8
+ validates_presence_of :name, :age
9
+
8
10
  def initialize(params={})
9
11
  params.each do |key, value|
10
12
  self.public_send("#{key}=", value)
@@ -0,0 +1,14 @@
1
+ require_relative '../test_helper'
2
+
3
+ describe Array do
4
+ describe 'add' do
5
+ it ('responds to add') { Object.new.must_respond_to :integer? }
6
+
7
+ it 'adding' do
8
+ arr = Array.new
9
+ arr.add(:testing)
10
+ arr.wont_be_empty
11
+ arr.last.must_equal :testing
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,57 @@
1
+ require_relative '../test_helper'
2
+
3
+ describe Object do
4
+ describe 'monkey patch' do
5
+ it ('responds to integer?') { Object.new.must_respond_to :integer? }
6
+ it ('responds to float?') { Object.new.must_respond_to :float? }
7
+ it ('responds to to_param?') { Object.new.must_respond_to :to_param }
8
+ it ('responds to underscored_class_name') { Object.new.must_respond_to :underscored_class_name }
9
+ end
10
+
11
+ describe 'integer?' do
12
+ it 'passing an integer' do
13
+ 15.integer?.must_equal true
14
+ end
15
+
16
+ it 'passing a string' do
17
+ 'abc'.integer?.must_equal false
18
+ end
19
+ end
20
+
21
+ describe 'float?' do
22
+ it 'passing a float' do
23
+ (15.50).float?.must_equal true
24
+ end
25
+
26
+ it 'passing an integer' do
27
+ 15.float?.must_equal false
28
+ end
29
+
30
+ it 'passing a string' do
31
+ 'abc'.float?.must_equal false
32
+ end
33
+ end
34
+
35
+ describe 'to_param?' do
36
+ it 'in an integer' do
37
+ 15.to_param.must_equal 15
38
+ end
39
+
40
+ it 'passing a string' do
41
+ 'abc'.to_param.must_equal 'abc'
42
+ end
43
+
44
+ it 'passing a string' do
45
+ (15.50).to_param.must_equal 15.50
46
+ end
47
+ end
48
+
49
+ describe 'underscored_class_name' do
50
+ it 'custom class' do
51
+ new_class = Class.new
52
+ MyCustomClass = new_class
53
+
54
+ MyCustomClass.new.underscored_class_name.must_equal 'my_custom_class'
55
+ end
56
+ end
57
+ end
data/test/test_helper.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'minitest/spec'
2
2
  require 'minitest/autorun'
3
3
  require 'turn'
4
-
5
4
  require 'csv_record'
6
5
 
7
6
  module TestHelper
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: csv_record
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.6.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-10 00:00:00.000000000 Z
12
+ date: 2012-11-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -43,6 +43,22 @@ dependencies:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: pry
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
46
62
  - !ruby/object:Gem::Dependency
47
63
  name: timecop
48
64
  requirement: !ruby/object:Gem::Requirement
@@ -97,6 +113,7 @@ files:
97
113
  - lib/csv_record/helpers.rb
98
114
  - lib/csv_record/reader.rb
99
115
  - lib/csv_record/timestamps.rb
116
+ - lib/csv_record/validations.rb
100
117
  - lib/csv_record/version.rb
101
118
  - lib/csv_record/writer.rb
102
119
  - test/csv_record/associations_test.rb
@@ -107,11 +124,14 @@ files:
107
124
  - test/csv_record/helpers_test.rb
108
125
  - test/csv_record/reader_test.rb
109
126
  - test/csv_record/timestamps_test.rb
127
+ - test/csv_record/validation_test.rb
110
128
  - test/csv_record/writer_test.rb
111
129
  - test/models/callback_test_class.rb
112
130
  - test/models/car.rb
113
131
  - test/models/jedi.rb
114
132
  - test/models/jedi_order.rb
133
+ - test/monkey_patches/array_test.rb
134
+ - test/monkey_patches/object_test.rb
115
135
  - test/test_helper.rb
116
136
  homepage: https://github.com/lukasalexandre/csv_record
117
137
  licenses: []
@@ -147,9 +167,12 @@ test_files:
147
167
  - test/csv_record/helpers_test.rb
148
168
  - test/csv_record/reader_test.rb
149
169
  - test/csv_record/timestamps_test.rb
170
+ - test/csv_record/validation_test.rb
150
171
  - test/csv_record/writer_test.rb
151
172
  - test/models/callback_test_class.rb
152
173
  - test/models/car.rb
153
174
  - test/models/jedi.rb
154
175
  - test/models/jedi_order.rb
176
+ - test/monkey_patches/array_test.rb
177
+ - test/monkey_patches/object_test.rb
155
178
  - test/test_helper.rb