measured-rails 0.0.1 → 0.0.3

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: 95f2b762444dc351bf41886d19054fe2679893ae
4
- data.tar.gz: 233c3ddf282c3b5a54be7df01ed11c9220682a6d
3
+ metadata.gz: 62c58765bafe20ac024a6ffd00a2b50c7e2acdb5
4
+ data.tar.gz: 97df4dfbc6504706f2429e3ce7b1694eb567091f
5
5
  SHA512:
6
- metadata.gz: 4eed05964aa33c9319aa450b20a44976736e7be1db767a55a18aa1787484a78a6f8bf85514668047efa08fe4d585125029f6c175aff4ba6db2e07ff1f0bee6dc
7
- data.tar.gz: 4f757002ed6692ab97feefd2d3b19be9093e6f74dfdfc470736b6d2323500a114cafc0c63734d28e4461cecc9a0f79d1835b82a6fba17b14adf14eae1e1178dc
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
- Validations can be combined with `presence` validator.
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.send("#{ attribute }_unit")
7
- measurable_value = record.send("#{ attribute }_value")
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 = options[:message] || "is not a valid unit"
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
- record.errors.add(attribute, message) unless measured_class.valid_unit?(measurable_unit)
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
@@ -1,5 +1,5 @@
1
1
  module Measured
2
2
  module Rails
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.3"
4
4
  end
5
5
  end
@@ -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.4"
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"
@@ -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.1
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-05-14 00:00:00.000000000 Z
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.4
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.4
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.2
158
+ rubygems_version: 2.2.3
172
159
  signing_key:
173
160
  specification_version: 4
174
161
  summary: Rails adaptor for measured