measured-rails 0.0.1 → 0.0.3
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 +4 -4
- data/README.md +16 -1
- data/lib/measured/rails/validations.rb +44 -4
- data/lib/measured/rails/version.rb +1 -1
- data/measured-rails.gemspec +1 -2
- data/shipit.rubygems.yml +1 -0
- metadata +6 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62c58765bafe20ac024a6ffd00a2b50c7e2acdb5
|
4
|
+
data.tar.gz: 97df4dfbc6504706f2429e3ce7b1694eb567091f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 458d356fe3fce7b8b5f49867f87426e2afeebca08eb4f087ca4c6b310f482456bd614de0e62a0a182a73681485c2e4922e110c7fc5ce6468162ce2fa85ab950b
|
7
|
+
data.tar.gz: 1ddde28c5b1e1a3a60ca48ed83633b7f0466f38bb5792b5baa78e121a74ad27a38e96e65ad93b34d72addf81f826551ff39810816b07fcc1e364adbbc14b0ee8
|
data/README.md
CHANGED
@@ -87,8 +87,22 @@ Rather than `true` the validation can accept a hash with the following options:
|
|
87
87
|
|
88
88
|
* `message`: Override the default "is invalid" message.
|
89
89
|
* `units`: A subset of units available for this measurement. Units must be in existing measurement.
|
90
|
+
* `greater_than`
|
91
|
+
* `greater_than_or_equal_to`
|
92
|
+
* `equal_to`
|
93
|
+
* `less_than`
|
94
|
+
* `less_than_or_equal_to`
|
90
95
|
|
91
|
-
|
96
|
+
**Special case** Comparison based validation against 0
|
97
|
+
```ruby
|
98
|
+
class Thing < ActiveRecord::Base
|
99
|
+
measured_length :non_negative_weight
|
100
|
+
|
101
|
+
validates :non_negative_weight, measured: {greater_than: 0}
|
102
|
+
end
|
103
|
+
```
|
104
|
+
|
105
|
+
Most of these options replace the `numericality` validator which compares the measurement/method name/proc to the column's value. Validations can also be combined with `presence` validator.
|
92
106
|
|
93
107
|
**Note:** Validations are strongly recommended since assigning an invalid unit will cause the measurement to return `nil`, even if there is a value:
|
94
108
|
|
@@ -118,3 +132,4 @@ $ bundle exec rake test
|
|
118
132
|
## Authors
|
119
133
|
|
120
134
|
* [Kevin McPhillips](https://github.com/kmcphillips) at [Shopify](http://shopify.com/careers)
|
135
|
+
* [Sai Warang](https://github.com/cyprusad) at [Shopify](http://shopify.com/careers)
|
@@ -1,18 +1,58 @@
|
|
1
1
|
class MeasuredValidator < ActiveModel::EachValidator
|
2
|
+
CHECKS = {
|
3
|
+
greater_than: :>,
|
4
|
+
greater_than_or_equal_to: :>=,
|
5
|
+
equal_to: :==,
|
6
|
+
less_than: :<,
|
7
|
+
less_than_or_equal_to: :<=,
|
8
|
+
}.freeze
|
9
|
+
|
2
10
|
def validate_each(record, attribute, measurable)
|
3
11
|
measured_config = record.class.measured_fields[attribute]
|
4
12
|
|
5
13
|
measured_class = measured_config[:class]
|
6
|
-
measurable_unit = record.
|
7
|
-
measurable_value = record.
|
14
|
+
measurable_unit = record.public_send("#{ attribute }_unit")
|
15
|
+
measurable_value = record.public_send("#{ attribute }_value")
|
16
|
+
|
17
|
+
return unless measurable_unit.present? || measurable_value.present?
|
8
18
|
|
9
|
-
message
|
19
|
+
record.errors.add(attribute, message) if [measurable_unit.blank?, measurable_value.blank?].any?
|
20
|
+
|
21
|
+
record.errors.add(attribute, message) unless measured_class.valid_unit?(measurable_unit)
|
10
22
|
|
11
23
|
if options[:units]
|
12
24
|
valid_units = [options[:units]].flatten.map{|u| measured_class.conversion.to_unit_name(u) }
|
13
25
|
record.errors.add(attribute, message) unless valid_units.include?(measured_class.conversion.to_unit_name(measurable_unit))
|
14
26
|
end
|
15
27
|
|
16
|
-
|
28
|
+
options.slice(*CHECKS.keys).each do |option, value|
|
29
|
+
record.errors.add(attribute, message) unless measurable.public_send(CHECKS[option], value_for(value, record))
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def message
|
36
|
+
options[:message] || "is not a valid unit"
|
37
|
+
end
|
38
|
+
|
39
|
+
def value_for(key, record)
|
40
|
+
value = case key
|
41
|
+
when Proc
|
42
|
+
key.call(record)
|
43
|
+
when Symbol
|
44
|
+
record.send(key)
|
45
|
+
else
|
46
|
+
key
|
47
|
+
end
|
48
|
+
|
49
|
+
if value.is_a?(Numeric)
|
50
|
+
raise ArgumentError, ":#{ value } is a scalar. Please validate against a Measurable object with correct units" unless value == 0
|
51
|
+
return value
|
52
|
+
end
|
53
|
+
|
54
|
+
raise ArgumentError, ":#{ value } must be a Measurable object" unless value.is_a?(Measured::Measurable)
|
55
|
+
|
56
|
+
value
|
17
57
|
end
|
18
58
|
end
|
data/measured-rails.gemspec
CHANGED
@@ -19,9 +19,8 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
21
|
spec.add_runtime_dependency "rails", ">= 4.0"
|
22
|
-
spec.add_runtime_dependency "measured", "0.0.
|
22
|
+
spec.add_runtime_dependency "measured", "0.0.7"
|
23
23
|
|
24
|
-
spec.add_development_dependency "bundler", "~> 1.8"
|
25
24
|
spec.add_development_dependency "rake", "~> 10.0"
|
26
25
|
spec.add_development_dependency "minitest", "~> 5.5.1"
|
27
26
|
spec.add_development_dependency "mocha", "~> 1.1.0"
|
data/shipit.rubygems.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: measured-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin McPhillips
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-06-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -30,28 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.0.
|
33
|
+
version: 0.0.7
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.0.
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: bundler
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '1.8'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '1.8'
|
40
|
+
version: 0.0.7
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: rake
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -148,6 +134,7 @@ files:
|
|
148
134
|
- lib/measured/rails/version.rb
|
149
135
|
- measured-rails.gemspec
|
150
136
|
- repodb.yml
|
137
|
+
- shipit.rubygems.yml
|
151
138
|
homepage: https://github.com/Shopify/measured-rails
|
152
139
|
licenses:
|
153
140
|
- MIT
|
@@ -168,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
168
155
|
version: '0'
|
169
156
|
requirements: []
|
170
157
|
rubyforge_project:
|
171
|
-
rubygems_version: 2.2.
|
158
|
+
rubygems_version: 2.2.3
|
172
159
|
signing_key:
|
173
160
|
specification_version: 4
|
174
161
|
summary: Rails adaptor for measured
|