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 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