has_safe_dates 0.0.3 → 0.0.4

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b7568105303c5f9d5c1b89473f2285b06e7c3edc
4
+ data.tar.gz: 5b5d33acc5958d838bdec27cef14a0ac7c148058
5
+ SHA512:
6
+ metadata.gz: 744066114fa7efe60a406f1bdbae48b90d6127ead6c021646c208adf391fa899808f0bf7b7e441881d232cd34ccf86237cd13797046a8356778362c466319932
7
+ data.tar.gz: 0043062b200e8a6d55f241ef4a9ec5f6c87bd7b3a25dd65b2d4ee1e3ad52a41453d4a137321372a3363dbd02c783b242c0e8f708e1c5f300e077044a30aa6cc2
data/Gemfile CHANGED
@@ -2,4 +2,4 @@ source "http://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'ruby-debug19'
5
+ # gem 'ruby-debug19'
@@ -39,15 +39,15 @@ Gem::Specification.new do |s|
39
39
  s.specification_version = 3
40
40
 
41
41
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
42
- s.add_development_dependency("activerecord", ['>= 3.1.0'])
43
- s.add_development_dependency("chronic")
44
- s.add_development_dependency("rspec", [">= 0"])
42
+ s.add_development_dependency("activerecord", ['~> 4.0.0'])
43
+ s.add_dependency("chronic")
44
+ s.add_development_dependency("rspec", [">= 0", "< 3"])
45
45
  s.add_development_dependency("rdoc", ["~> 3.12"])
46
- s.add_development_dependency("bundler", ["~> 1.0.0"])
46
+ s.add_development_dependency("bundler", ["~> 1.0"])
47
47
  s.add_development_dependency("sqlite3")
48
- s.add_development_dependency("rspec")
49
48
  s.add_development_dependency('database_cleaner')
50
- else
49
+ s.add_development_dependency('debugger')
50
+ else
51
51
  s.add_dependency("activerecord", ['>= 3.1.0'])
52
52
  s.add_dependency("chronic")
53
53
  s.add_dependency("rspec", [">= 0"])
@@ -6,7 +6,6 @@ module HasSafeDates
6
6
  extend ActiveSupport::Concern
7
7
 
8
8
  module ClassMethods
9
-
10
9
  def has_safe_fields_config
11
10
  @@has_safe_fields_config ||= {}
12
11
  end
@@ -25,42 +24,48 @@ module HasSafeDates
25
24
  raise ArgumentError, 'Must define the fields you want to be converted to safe dates with "has_safe_dates :my_field_name_date, :my_other_field_name_date"'
26
25
  end
27
26
  has_safe_fields_config[self][:fields] = args.map(&:to_s)
27
+
28
28
  has_safe_fields_config[self][:fields].each do |field|
29
29
  define_method "#{field.to_s}=" do |value|
30
30
  if value.present?
31
31
  value = Chronic.parse(value.to_s)
32
- unless value.present?
33
- self.errors.add(field, self.class.has_safe_fields_config[self.class][:error_message])
32
+ if value.blank? && self.class.has_safe_fields_config[self.class][:error_message].present?
33
+ @safe_date_validation_errors ||= {}
34
+ @safe_date_validation_errors[field] = self.class.has_safe_fields_config[self.class][:error_message]
34
35
  end
35
36
  end
36
37
  super value
37
38
  end
38
39
  end
39
- end
40
- end
41
40
 
42
- def read_value_from_parameter(name, values_hash_from_param)
43
- if self.class.has_safe_fields_config[self.class]
44
- fields = self.class.has_safe_fields_config[self.class][:fields]
45
- end
46
-
47
- if fields.present? && fields.include?(name.to_s)
48
-
49
- max_position = extract_max_param_for_multiparameter_attributes(values_hash_from_param, 6)
50
- return nil if (1..3).any? {|position| values_hash_from_param[position].blank?}
51
- set_values = (1..max_position).collect{|position| values_hash_from_param[position] }
41
+ define_method "_set_safe_date_validation_errors" do
42
+ if @safe_date_validation_errors.present?
43
+ @safe_date_validation_errors.each_pair do |field, error|
44
+ errors.add(field, error)
45
+ end
46
+ end
47
+ @safe_date_validation_errors = nil
48
+ end
52
49
 
53
- date = set_values[0..2].join('-')
54
- time = set_values[3..5].join(':')
55
- value = Chronic.parse("#{date} #{time}")
50
+ class_eval do
51
+ validate :_set_safe_date_validation_errors
52
+ end
53
+ end
54
+ end
55
+ end
56
56
 
57
- return value
57
+ module MultiparameterAttributeExt
58
+ # Overrides #read_date when has_safe_dates is enabled for the current field the multiparameter.
59
+ # Otherwise the original #read_date method is invoked.
60
+ def read_date
61
+ if ActiveRecord::Base.has_safe_fields_config[object.class] && ActiveRecord::Base.has_safe_fields_config[object.class][:fields].include?(name)
62
+ values.values_at(1,2,3).join("-") # Convert multiparameter parts into a Date string, e.g. "2011-4-23", return it, and allow CoreExt methods handle the result.
58
63
  else
59
- super name, values_hash_from_param
64
+ super # has_safe_dates is not enabled for the current field, so invoke the super method (original #read_date method).
60
65
  end
61
66
  end
62
-
63
67
  end
64
68
  end
65
-
69
+
66
70
  ActiveRecord::Base.send :include, HasSafeDates::CoreExt
71
+ ActiveRecord::AttributeAssignment::MultiparameterAttribute.send :prepend, HasSafeDates::MultiparameterAttributeExt
@@ -1,3 +1,3 @@
1
1
  module HasSafeDates
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -12,7 +12,7 @@ end
12
12
 
13
13
  describe "HasSafeDates" do
14
14
 
15
- before(:each) do
15
+ before(:each) do
16
16
  @post = Post.new
17
17
  @comment = Comment.new
18
18
  end
@@ -53,8 +53,8 @@ describe "HasSafeDates" do
53
53
 
54
54
  [' ', '', nil].each do |date|
55
55
  it "sets the field to nil if given the blank value #{date.inspect}" do
56
- @post.update_attribute(:safe_date, date)
57
- @post.reload
56
+ @post.safe_date = date
57
+ @post.valid?
58
58
  @post.safe_date.should == nil
59
59
  @post.errors.should be_blank
60
60
  end
@@ -62,18 +62,21 @@ describe "HasSafeDates" do
62
62
 
63
63
  ['random', 'does not compute'].each do |date|
64
64
  it "sets the field to nil and sets a validation error if given the value #{date.inspect}" do
65
- @post.update_attribute(:safe_date, date)
66
- @post.reload
65
+ @post.safe_date = date
66
+ @post.valid?
67
67
  @post.safe_date.should == nil
68
68
  @post.errors.should_not be_blank
69
+ @post.errors[:safe_date].should == ['is not a real date']
69
70
  end
70
71
  end
72
+
71
73
  end
72
74
 
73
75
  describe "multiparameter parsing" do
76
+
74
77
  it "doesn't blow up when given an incorrect values" do
75
- invalid_post_attributes = {'published_date(1)' => "abc", 'published_date(2)' => "12", 'published_date(3)' => "1"}
76
- invalid_comment_attributes = {'approved_at(1)' => "abc", 'approved_at(2)' => "12", 'approved_at(3)' => "1"}
78
+ invalid_post_attributes = {'published_date(1i)' => "2001", 'published_date(2i)' => "12", 'published_date(3i)' => "abc"}
79
+ invalid_comment_attributes = {'approved_at(1i)' => "2001", 'approved_at(2i)' => "12", 'approved_at(3i)' => "abc"}
77
80
  expect {
78
81
  @post.update_attributes(invalid_post_attributes)
79
82
  @comment.update_attributes(invalid_comment_attributes)
@@ -81,14 +84,18 @@ describe "HasSafeDates" do
81
84
  end
82
85
 
83
86
  it "does not interfere with a date column that it has not been told to make safe" do
84
- invalid_attributes = {'unsafe_date(1)' => "abc", 'unsafe_date(2)' => "12", 'unsafe_date(3)' => "1"}
87
+ invalid_attributes = {'unsafe_date(1i)' => "2001", 'unsafe_date(2i)' => "12", 'unsafe_date(3i)' => "abc"}
85
88
  expect {
86
89
  @post.update_attributes(invalid_attributes)
87
- }.to raise_error(ActiveRecord::MultiparameterAssignmentErrors, '1 error(s) on assignment of multiparameter attributes')
90
+ }.to raise_error(ActiveRecord::MultiparameterAssignmentErrors)
88
91
  end
89
92
 
90
- end
91
-
93
+ it "adds an error when Chronic returns nil" do
94
+ invalid_post_attributes = {'published_date(1i)' => "2001", 'published_date(2i)' => "12", 'published_date(3i)' => "abc"}
95
+ @post.update_attributes(invalid_post_attributes)
96
+ @post.errors[:published_date].should == ['is not a real date']
97
+ end
92
98
 
99
+ end
93
100
 
94
101
  end
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require "active_support"
2
2
  require "active_record"
3
3
  require "database_cleaner"
4
+ require 'yaml'
4
5
 
5
6
  ENV['debug'] = 'test' unless ENV['debug']
6
7
 
metadata CHANGED
@@ -1,150 +1,142 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: has_safe_dates
3
- version: !ruby/object:Gem::Version
4
- hash: 25
5
- prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 3
10
- version: 0.0.3
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - kylejginavan
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2012-02-24 00:00:00 -06:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
11
+ date: 2012-02-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
22
14
  name: activerecord
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 3
32
- - 1
33
- - 0
34
- version: 3.1.0
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 4.0.0
35
20
  type: :development
36
- version_requirements: *id001
37
- - !ruby/object:Gem::Dependency
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 4.0.0
27
+ - !ruby/object:Gem::Dependency
38
28
  name: chronic
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
39
35
  prerelease: false
40
- requirement: &id002 !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ">="
44
- - !ruby/object:Gem::Version
45
- hash: 3
46
- segments:
47
- - 0
48
- version: "0"
49
- type: :development
50
- version_requirements: *id002
51
- - !ruby/object:Gem::Dependency
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
52
42
  name: rspec
53
- prerelease: false
54
- requirement: &id003 !ruby/object:Gem::Requirement
55
- none: false
56
- requirements:
57
- - - ">="
58
- - !ruby/object:Gem::Version
59
- hash: 3
60
- segments:
61
- - 0
62
- version: "0"
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ - - <
49
+ - !ruby/object:Gem::Version
50
+ version: '3'
63
51
  type: :development
64
- version_requirements: *id003
65
- - !ruby/object:Gem::Dependency
66
- name: rdoc
67
52
  prerelease: false
68
- requirement: &id004 !ruby/object:Gem::Requirement
69
- none: false
70
- requirements:
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ - - <
59
+ - !ruby/object:Gem::Version
60
+ version: '3'
61
+ - !ruby/object:Gem::Dependency
62
+ name: rdoc
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
71
65
  - - ~>
72
- - !ruby/object:Gem::Version
73
- hash: 31
74
- segments:
75
- - 3
76
- - 12
77
- version: "3.12"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.12'
78
68
  type: :development
79
- version_requirements: *id004
80
- - !ruby/object:Gem::Dependency
81
- name: bundler
82
69
  prerelease: false
83
- requirement: &id005 !ruby/object:Gem::Requirement
84
- none: false
85
- requirements:
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
86
72
  - - ~>
87
- - !ruby/object:Gem::Version
88
- hash: 23
89
- segments:
90
- - 1
91
- - 0
92
- - 0
93
- version: 1.0.0
73
+ - !ruby/object:Gem::Version
74
+ version: '3.12'
75
+ - !ruby/object:Gem::Dependency
76
+ name: bundler
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ~>
80
+ - !ruby/object:Gem::Version
81
+ version: '1.0'
94
82
  type: :development
95
- version_requirements: *id005
96
- - !ruby/object:Gem::Dependency
97
- name: sqlite3
98
83
  prerelease: false
99
- requirement: &id006 !ruby/object:Gem::Requirement
100
- none: false
101
- requirements:
102
- - - ">="
103
- - !ruby/object:Gem::Version
104
- hash: 3
105
- segments:
106
- - 0
107
- version: "0"
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ~>
87
+ - !ruby/object:Gem::Version
88
+ version: '1.0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: sqlite3
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
108
96
  type: :development
109
- version_requirements: *id006
110
- - !ruby/object:Gem::Dependency
111
- name: rspec
112
97
  prerelease: false
113
- requirement: &id007 !ruby/object:Gem::Requirement
114
- none: false
115
- requirements:
116
- - - ">="
117
- - !ruby/object:Gem::Version
118
- hash: 3
119
- segments:
120
- - 0
121
- version: "0"
122
- type: :development
123
- version_requirements: *id007
124
- - !ruby/object:Gem::Dependency
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - '>='
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ - !ruby/object:Gem::Dependency
125
104
  name: database_cleaner
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
126
111
  prerelease: false
127
- requirement: &id008 !ruby/object:Gem::Requirement
128
- none: false
129
- requirements:
130
- - - ">="
131
- - !ruby/object:Gem::Version
132
- hash: 3
133
- segments:
134
- - 0
135
- version: "0"
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - '>='
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: debugger
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - '>='
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
136
124
  type: :development
137
- version_requirements: *id008
138
- description: Uses Chronic to parse incoming dates and does not raise errors on invalid multi parameter settings
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ description: Uses Chronic to parse incoming dates and does not raise errors on invalid
132
+ multi parameter settings
139
133
  email: kylejginavan@gmail.com
140
134
  executables: []
141
-
142
135
  extensions: []
143
-
144
- extra_rdoc_files:
136
+ extra_rdoc_files:
145
137
  - MIT-LICENSE.txt
146
138
  - README.md
147
- files:
139
+ files:
148
140
  - Gemfile
149
141
  - Rakefile
150
142
  - MIT-LICENSE.txt
@@ -157,39 +149,27 @@ files:
157
149
  - spec/db/schema.rb
158
150
  - spec/has_safe_dates_spec.rb
159
151
  - spec/spec_helper.rb
160
- has_rdoc: true
161
152
  homepage: http://github.com/kylejginavan/has_safe_dates
162
153
  licenses: []
163
-
154
+ metadata: {}
164
155
  post_install_message:
165
156
  rdoc_options: []
166
-
167
- require_paths:
157
+ require_paths:
168
158
  - lib
169
- required_ruby_version: !ruby/object:Gem::Requirement
170
- none: false
171
- requirements:
172
- - - ">="
173
- - !ruby/object:Gem::Version
174
- hash: 3
175
- segments:
176
- - 0
177
- version: "0"
178
- required_rubygems_version: !ruby/object:Gem::Requirement
179
- none: false
180
- requirements:
181
- - - ">="
182
- - !ruby/object:Gem::Version
183
- hash: 3
184
- segments:
185
- - 0
186
- version: "0"
159
+ required_ruby_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - '>='
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ required_rubygems_version: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - '>='
167
+ - !ruby/object:Gem::Version
168
+ version: '0'
187
169
  requirements: []
188
-
189
170
  rubyforge_project:
190
- rubygems_version: 1.5.2
171
+ rubygems_version: 2.0.14
191
172
  signing_key:
192
173
  specification_version: 3
193
174
  summary: Chronic based date setting for ActiveRecord models
194
175
  test_files: []
195
-