has_safe_dates 0.0.3 → 0.0.4

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