riveter 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 89d184638bd46e4851c34befdaa1b8451312d210
4
- data.tar.gz: b498d93ece35a0f8bb532fac557cc46de5b9976a
3
+ metadata.gz: ac7829381fcfecbda57c395c23653edc8df876b3
4
+ data.tar.gz: 57005498bcf3833e4b487f8d1e174cfd6adb5b77
5
5
  SHA512:
6
- metadata.gz: 7e85400604b6388dccc7956461f9bed3c012927560d76a7edfdfbdb3db57f5d25a18e4e79736321bcf71694f48b8384151a6a81ef8531341f7e5d282990e8dcf
7
- data.tar.gz: 91ea69d6ac1b17187741125ef6a42b111e7f835dbb0e2922ee29fdeb4e3d058bcfe66f9c85b0797a217a712843d887d90e6af96ef22b9f18c626310fcb25bfdf
6
+ metadata.gz: 3cda2c9c10fa00fef707ed7d8bff72b40684ed8f3f088fb8fecb6879988d30a4ce02d0b57056da324bb8c1a77ac5a3fe9ba822bfa9082ad75ee767d00bbade38
7
+ data.tar.gz: e0853c278c745da742bf13bd9e6d6b2a1319f0297b09b0a9864eccf77b7b397eaa979025f7848ddd683fbaf335f2ab4bbef621c63003747385a72f21722ddcd7
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-2.2.2
1
+ ruby-2.2.4
data/.travis.yml CHANGED
@@ -3,12 +3,9 @@ cache: bundler
3
3
 
4
4
  rvm:
5
5
  - 2.0.0
6
- - 2.1.0
7
- - 2.1.1
8
- - 2.1.2
9
- - 2.2.0
10
- - 2.2.1
11
- - 2.2.2
6
+ - 2.1.8
7
+ - 2.2.4
8
+ - 2.3.0
12
9
 
13
10
  script: 'bundle exec rake spec'
14
11
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- riveter (0.2.1)
4
+ riveter (0.3.0)
5
5
  activemodel (>= 4.0.0)
6
6
  railties (>= 4.0.0)
7
7
  validates_timeliness (>= 3.0.0)
@@ -173,22 +173,22 @@ GEM
173
173
  thor (0.19.1)
174
174
  thread_safe (0.3.5)
175
175
  tilt (2.0.1)
176
- timeliness (0.3.7)
176
+ timeliness (0.3.8)
177
177
  tins (1.5.2)
178
178
  tzinfo (1.2.2)
179
179
  thread_safe (~> 0.1)
180
180
  unf (0.1.4)
181
181
  unf_ext
182
182
  unf_ext (0.0.7.1)
183
- validates_timeliness (3.0.14)
184
- timeliness (~> 0.3.6)
183
+ validates_timeliness (4.0.2)
184
+ timeliness (~> 0.3.7)
185
185
 
186
186
  PLATFORMS
187
187
  ruby
188
188
 
189
189
  DEPENDENCIES
190
190
  ammeter (~> 1.1.2)
191
- bundler (~> 1.10.1)
191
+ bundler (~> 1.11.2)
192
192
  coveralls (~> 0.8.1)
193
193
  haml-rails (~> 0.9.0)
194
194
  pry (~> 0.10.1)
@@ -200,4 +200,4 @@ DEPENDENCIES
200
200
  shoulda-matchers (~> 2.8.0)
201
201
 
202
202
  BUNDLED WITH
203
- 1.10.1
203
+ 1.11.2
@@ -26,6 +26,3 @@ en:
26
26
  email: is not valid
27
27
  invalid_date: is not a valid date
28
28
  invalid_time: is not a valid time
29
- date_range: is not a valid date range
30
- date_range_date_from: "must be before %{date_to}"
31
- date_range_date_to: "must be after %{date_from}"
@@ -11,30 +11,34 @@ class <%= class_name %>QueryFilter < Riveter::QueryFilter::Base
11
11
  #
12
12
  # E.g.
13
13
  #
14
- # attr_string :name[, options]
14
+ # attr_string :name[, options] [do |value|
15
+ # # optional converter logic
16
+ # value.to_i
17
+ # end]
15
18
  #
16
19
  # options include:
17
- # :required => true|false # default is false
18
- # :default => 'a value' # default is nil
19
- # :validate => true|false # default is true
20
+ # :required => true|false # default is false
21
+ # :default => 'a value' or lambda # default is nil
22
+ # :validate => true|false # default is true
23
+ #
24
+ # optionally, provide a block which takes one argument and returns the converted value
20
25
  #
21
26
  # supported attributes:
22
27
  #
23
- # attr_string
24
- # attr_text
25
- # attr_integer
26
- # attr_decimal
27
- # attr_date
28
- # attr_date_range
29
- # attr_time
30
- # attr_boolean
31
- # attr_enum
32
- # attr_array
33
- # attr_hash
34
- # attr_model
28
+ # attr_string :attr_name
29
+ # attr_text :attr_name
30
+ # attr_integer :attr_name
31
+ # attr_decimal :attr_name
32
+ # attr_date :attr_name
33
+ # attr_date_range :attr_name[, :min => <date>, :max => <date>]
34
+ # attr_time :attr_name
35
+ # attr_boolean :attr_name
36
+ # attr_enum :attr_name, <enum_module>
37
+ # attr_array :attr_name[, :data_type => :integer]
38
+ # attr_hash :attr_name[, :data_type => :integer]
39
+ #
40
+ # optionally, define additional validations and helper methods
35
41
  #
36
-
37
- # optionally, define additional validations
38
42
  <% end -%>
39
43
 
40
44
  end
data/lib/riveter.rb CHANGED
@@ -14,7 +14,6 @@ module Riveter
14
14
  autoload :BooleanessValidator, 'riveter/booleaness_validator'
15
15
  autoload :Command, 'riveter/command'
16
16
  autoload :CommandController, 'riveter/command_controller'
17
- autoload :DateRangeValidator, 'riveter/date_range_validator'
18
17
  autoload :EmailValidator, 'riveter/email_validator'
19
18
  autoload :Enquiry, 'riveter/enquiry'
20
19
  autoload :EnquiryController, 'riveter/enquiry_controller'
@@ -30,7 +29,6 @@ end
30
29
  module ActiveModel
31
30
  module Validations
32
31
  autoload :BooleanessValidator, 'riveter/booleaness_validator'
33
- autoload :DateRangeValidator, 'riveter/date_range_validator'
34
32
  autoload :EmailValidator, 'riveter/email_validator'
35
33
  end
36
34
  end
@@ -61,15 +61,13 @@ module Riveter
61
61
 
62
62
  required = (true == options.delete(:required))
63
63
 
64
- # expecting the default value to be a date range
65
- # so extract out the first and last parts for the from and to
66
- # otherwise, it may just be a date or nil
67
- default = options.delete(:default)
68
- default = default.is_a?(Range) ? default : (default..default)
69
- defaults = {
70
- :from => default.first,
71
- :to => default.last
72
- }
64
+ [:min, :max].each do |limit|
65
+ limit_value = options.delete(limit)
66
+
67
+ define_method :"#{name}_#{limit}" do
68
+ limit_value.respond_to?(:call) ? limit_value.call : limit_value
69
+ end
70
+ end
73
71
 
74
72
  converter = block_given? ? block : Converters.converter_for(:date)
75
73
 
@@ -79,18 +77,31 @@ module Riveter
79
77
  send(:"#{name}_from")..send(:"#{name}_to") rescue nil
80
78
  end
81
79
 
82
- define_method "#{name}=" do |value|
80
+ define_method :"#{name}=" do |value|
83
81
  value ||= nil..nil
84
82
  range = value.is_a?(Range) ? value : value..value
85
83
  send(:"#{name}_from=", range.first)
86
84
  send(:"#{name}_to=", range.last)
87
85
  end
88
86
 
89
- validates name,
90
- :allow_nil => !required,
91
- :date_range => true if options[:validate]
87
+ add_attr(name, :date_range, converter, options)
88
+
89
+ if options[:validate]
90
+
91
+ validate :"#{name}_validation"
92
+
93
+ define_method :"#{name}_validation" do
94
+ date_from = send(:"#{name}_from")
95
+ date_to = send(:"#{name}_to")
96
+
97
+ errors.add(name, :blank) if
98
+ required && (date_from.blank? || date_to.blank?)
99
+
100
+ errors.add(name, :invalid) if
101
+ !(date_from.blank? || date_to.blank?) && (date_from > date_to || date_to < date_from)
102
+ end
92
103
 
93
- add_attr(name, :date_range)
104
+ end
94
105
 
95
106
  # break down into parts
96
107
  [:from, :to].each do |part|
@@ -106,8 +117,32 @@ module Riveter
106
117
  :allow_nil => !required,
107
118
  :timeliness => { :type => :date } if options[:validate]
108
119
 
109
- add_attr(:"#{name}_#{part}", :date, converter, options.merge(:default => defaults[part]))
120
+ add_attr(:"#{name}_#{part}", :date, converter)
121
+ end
122
+
123
+ # helper for determining if both from and to dates have been provided
124
+ define_method :"#{name}_present?" do
125
+ date_from = send(:"#{name}_from")
126
+ date_to = send(:"#{name}_to")
127
+ date_from && date_to
128
+ end
129
+
130
+ # return from and to as range in UTC
131
+ define_method :"#{name}_utc" do
132
+ date_from = send(:"#{name}_from")
133
+ date_to = send(:"#{name}_to")
134
+ if date_from && date_to
135
+ if date_from == date_to
136
+ date = date_from.to_utc_date
137
+ DateTime.new(date.year, date.month, date.day, 0, 0, 0)..DateTime.new(date.year, date.month, date.day, 23, 59, 59)
138
+ else
139
+ date_from.to_utc_date..date_to.to_utc_date
140
+ end
141
+ else
142
+ nil
143
+ end
110
144
  end
145
+
111
146
  end
112
147
 
113
148
  def attr_boolean(name, options={}, &block)
@@ -311,6 +346,7 @@ module Riveter
311
346
 
312
347
  def default
313
348
  @default ||= options[:default]
349
+ @default.respond_to?(:call) ? @default.call : @default
314
350
  end
315
351
 
316
352
  def default?
@@ -354,6 +390,10 @@ module Riveter
354
390
  false
355
391
  end
356
392
 
393
+ def has_attribute?(column)
394
+ self.class._attributes.key?(column)
395
+ end
396
+
357
397
  # forms use this for getting column meta data
358
398
  def column_for_attribute(column)
359
399
  attribute_info = self.class._attributes[column]
@@ -1,3 +1,3 @@
1
1
  module Riveter
2
- VERSION = "0.2.1"
2
+ VERSION = "0.3.0"
3
3
  end
data/riveter.gemspec CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.add_dependency 'activemodel' , '>= 4.0.0'
25
25
  spec.add_dependency 'validates_timeliness' , '>= 3.0.0'
26
26
 
27
- spec.add_development_dependency 'bundler' , '~> 1.10.1'
27
+ spec.add_development_dependency 'bundler' , '~> 1.11.2'
28
28
  spec.add_development_dependency 'rake' , '~> 10.4.2'
29
29
  spec.add_development_dependency 'rails' , '~> 4.2.1'
30
30
  spec.add_development_dependency 'haml-rails' , '~> 0.9.0'
@@ -67,7 +67,6 @@ describe Riveter::Attributes do
67
67
  end
68
68
  let(:instance) { subject.new() }
69
69
 
70
- it { instance.should validate_date_range_of(:an_attribute) }
71
70
  it { instance.should validate_timeliness_of(:an_attribute_from) }
72
71
  it { instance.should validate_timeliness_of(:an_attribute_to) }
73
72
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riveter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Stefano
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-01 00:00:00.000000000 Z
11
+ date: 2016-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 1.10.1
61
+ version: 1.11.2
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 1.10.1
68
+ version: 1.11.2
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -304,7 +304,6 @@ files:
304
304
  - lib/riveter/command_controller.rb
305
305
  - lib/riveter/command_routes.rb
306
306
  - lib/riveter/core_extensions.rb
307
- - lib/riveter/date_range_validator.rb
308
307
  - lib/riveter/email_validator.rb
309
308
  - lib/riveter/enquiry.rb
310
309
  - lib/riveter/enquiry_controller.rb
@@ -357,7 +356,6 @@ files:
357
356
  - spec/riveter/command_routes_spec.rb
358
357
  - spec/riveter/command_spec.rb
359
358
  - spec/riveter/core_extensions_spec.rb
360
- - spec/riveter/date_range_validator_spec.rb
361
359
  - spec/riveter/email_validator_spec.rb
362
360
  - spec/riveter/enquiry_controller_spec.rb
363
361
  - spec/riveter/enquiry_routes_spec.rb
@@ -387,7 +385,6 @@ files:
387
385
  - spec/support/test_query_filter.rb
388
386
  - spec/support/test_service.rb
389
387
  - spec/support/validate_booleaness_of_matcher.rb
390
- - spec/support/validate_date_range_of_matcher.rb
391
388
  - spec/support/validate_timeliness_of_matcher.rb
392
389
  - spec/support/validator_detector.rb
393
390
  homepage: https://github.com/virtualstaticvoid/riveter
@@ -410,7 +407,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
410
407
  version: '0'
411
408
  requirements: []
412
409
  rubyforge_project:
413
- rubygems_version: 2.4.6
410
+ rubygems_version: 2.4.8
414
411
  signing_key:
415
412
  specification_version: 4
416
413
  summary: Provides several useful patterns, packaged in a gem, for use in Rails.
@@ -449,7 +446,6 @@ test_files:
449
446
  - spec/riveter/command_routes_spec.rb
450
447
  - spec/riveter/command_spec.rb
451
448
  - spec/riveter/core_extensions_spec.rb
452
- - spec/riveter/date_range_validator_spec.rb
453
449
  - spec/riveter/email_validator_spec.rb
454
450
  - spec/riveter/enquiry_controller_spec.rb
455
451
  - spec/riveter/enquiry_routes_spec.rb
@@ -479,6 +475,5 @@ test_files:
479
475
  - spec/support/test_query_filter.rb
480
476
  - spec/support/test_service.rb
481
477
  - spec/support/validate_booleaness_of_matcher.rb
482
- - spec/support/validate_date_range_of_matcher.rb
483
478
  - spec/support/validate_timeliness_of_matcher.rb
484
479
  - spec/support/validator_detector.rb
@@ -1,34 +0,0 @@
1
- module Riveter
2
- class DateRangeValidator < ActiveModel::EachValidator
3
- def initialize(options={})
4
- @date_from_attr = options.delete(:date_from_attr)
5
- @date_to_attr = options.delete(:date_to_attr)
6
-
7
- super
8
- end
9
-
10
- def validate_each(record, attribute, value)
11
- # NOTE: validate_each usually isn't called when the value is nil
12
- # however it is possible to have a nil..nil range, so check for this
13
- if value.is_a?(Range) && value.first && value.last
14
- date_from = value.first
15
- date_to = value.last
16
- if date_from > date_to
17
- record.errors.add(attribute, :date_range)
18
- record.errors.add(@date_from_attr || :"#{attribute}_from", :date_range_date_from, :date_to => date_to)
19
- record.errors.add(@date_to_attr || :"#{attribute}_to", :date_range_date_to, :date_from => date_from)
20
- end
21
- else
22
- unless options[:allow_nil] || options[:allow_blank]
23
- record.errors.add(attribute, :blank)
24
- record.errors.add(@date_from_attr || :"#{attribute}_from", :blank)
25
- record.errors.add(@date_to_attr || :"#{attribute}_to", :blank)
26
- end
27
- end
28
- end
29
- end
30
- end
31
-
32
- # add compatibility with ActiveModel validates method which
33
- # matches option keys to their validator class
34
- ActiveModel::Validations::DateRangeValidator = Riveter::DateRangeValidator
@@ -1,97 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Riveter::DateRangeValidator do
4
- subject { Riveter::DateRangeValidator }
5
-
6
- describe "#validate_each" do
7
- def record_for(value)
8
- record = double()
9
- allow(record).to receive(:read_attribute_for_validation) { value }
10
- record
11
- end
12
-
13
- def errors
14
- errors = double
15
- allow(errors).to receive(:add)
16
- errors
17
- end
18
-
19
- describe "with defaults" do
20
- it {
21
- validator = subject.new(:attributes => [:test])
22
- record = record_for('not_a_date_range')
23
- expect(record).to receive(:errors).at_least(:once).and_return(errors)
24
-
25
- validator.validate(record)
26
- }
27
-
28
- it {
29
- validator = subject.new(:attributes => [:test])
30
- record = record_for(nil..nil)
31
- expect(record).to receive(:errors).at_least(:once).and_return(errors)
32
-
33
- validator.validate(record)
34
- }
35
-
36
- it {
37
- validator = subject.new(:attributes => [:test])
38
- record = record_for(Date.new(2010, 1, 1)..Date.new(2011, 1, 1))
39
- expect(record).to_not receive(:errors)
40
-
41
- validator.validate(record)
42
- }
43
-
44
- it {
45
- validator = subject.new(:attributes => [:test])
46
- record = record_for(Date.new(2012, 1, 1)..Date.new(2011, 1, 1))
47
- expect(record).to receive(:errors).at_least(:once).and_return(errors)
48
-
49
- validator.validate(record)
50
- }
51
- end
52
-
53
- describe "with allow_nil" do
54
- it {
55
- validator = subject.new(:attributes => [:test], :allow_nil => false)
56
- record = record_for(nil)
57
- expect(record).to receive(:errors).at_least(:once).and_return(errors)
58
-
59
- validator.validate(record)
60
- }
61
-
62
- it {
63
- validator = subject.new(:attributes => [:test], :allow_nil => true)
64
- record = record_for(nil)
65
- expect(record).to_not receive(:errors)
66
-
67
- validator.validate(record)
68
- }
69
-
70
- it {
71
- validator = subject.new(:attributes => [:test], :allow_nil => true)
72
- record = record_for(nil..nil)
73
- expect(record).to_not receive(:errors)
74
-
75
- validator.validate(record)
76
- }
77
- end
78
-
79
- describe "with allow_blank" do
80
- it {
81
- validator = subject.new(:attributes => [:test], :allow_blank => false)
82
- record = record_for('')
83
- expect(record).to receive(:errors).at_least(:once).and_return(errors)
84
-
85
- validator.validate(record)
86
- }
87
-
88
- it {
89
- validator = subject.new(:attributes => [:test], :allow_blank => true)
90
- record = record_for('')
91
- expect(record).to_not receive(:errors)
92
-
93
- validator.validate(record)
94
- }
95
- end
96
- end
97
- end
@@ -1,17 +0,0 @@
1
- RSpec::Matchers.define :validate_date_range_of do |attribute|
2
- match do |model|
3
- ValidatorDetector.detect(model, attribute, Riveter::DateRangeValidator)
4
- end
5
-
6
- failure_message do |actual|
7
- "expect #{attribute} to validate date range of"
8
- end
9
-
10
- failure_message_when_negated do |actual|
11
- "expect #{attribute} to not validate date range of"
12
- end
13
-
14
- description do
15
- "expect #{attribute} to validate date range of"
16
- end
17
- end