measured-rails 1.5.0 → 1.6.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: 4d5f88adb6a1fc196acee3086445d1c4b006fba0
4
- data.tar.gz: b5631f498609ac942c7d872979c9dc3b47e38ed3
3
+ metadata.gz: 92ddafd5d1a33f79eee76d8b642bc787aacc8234
4
+ data.tar.gz: b31d4d3fefbfce82776255ce6dd9d035ffb2fb1c
5
5
  SHA512:
6
- metadata.gz: bcf37b722d81823b4f7d4aae41bc5252f3c10fc2f9ef2196f37a77c7c3ab304d3443c5eaf330ddbfbdb8db098ae128ec26ab66b7100392b6985754f0762d0908
7
- data.tar.gz: 17848420192907297507c09746fb955978cccc84a5e07ab7c21812c499fc8a7d46078552b8d0e8bf71b763255b3d62dd7c8ff2a3c80a6fa50c5dab32eec26df8
6
+ metadata.gz: 440b341b39ad63d13c36a233a6e1943bd7557a863e32a2a7393f25c2e42021afeb12c5b90d2718ffd5b37b5fa70c3890051ed43f3d8de9b060a4b3cf2d180884
7
+ data.tar.gz: 835c01c1bba6432b34c1817bfc7910bd05561a790b1363388f932e7f4e2d4bb7cdbc3daa5edaed7d585d7bc682f2d1b783f3d148eb2b28baac3a590362f9f667
data/README.md CHANGED
@@ -20,7 +20,7 @@ Or stand alone:
20
20
 
21
21
  ### ActiveRecord
22
22
 
23
- Columns are expected to have the `_value` and `_unit` suffix, and be `DECIMAL` and `VARCHAR`, and defaults are accepted:
23
+ Columns are expected to have the `_value` and `_unit` suffix, and be `DECIMAL` and `VARCHAR`, and defaults are accepted. Customizing the column used to hold units is supported, see below for details.
24
24
 
25
25
  ```ruby
26
26
  class AddWeightAndLengthToThings < ActiveRecord::Migration
@@ -43,6 +43,15 @@ class Thing < ActiveRecord::Base
43
43
  end
44
44
  ```
45
45
 
46
+ You can optionally customize the model's unit column by specifying it in the `unit_field_name` option, as follows:
47
+
48
+ ```ruby
49
+ class ThingWithCustomUnitAccessor < ActiveRecord::Base
50
+ measured_length :length, :width, :height, unit_field_name: :size_unit
51
+ measured_weight :total_weight, :extra_weight, unit_field_name: :weight_unit
52
+ end
53
+ ```
54
+
46
55
  There are some simpler methods for predefined types:
47
56
 
48
57
  ```ruby
@@ -5,6 +5,7 @@ module Measured::Rails::ActiveRecord
5
5
  def measured(measured_class, *fields)
6
6
  options = fields.extract_options!
7
7
  options = {}.merge(options)
8
+ defined_unit_accessors = []
8
9
 
9
10
  measured_class = measured_class.constantize if measured_class.is_a?(String)
10
11
 
@@ -14,12 +15,22 @@ module Measured::Rails::ActiveRecord
14
15
 
15
16
  fields.map(&:to_sym).each do |field|
16
17
  raise Measured::Rails::Error, "The field #{ field } has already been measured" if measured_fields.keys.include?(field)
18
+
17
19
  measured_fields[field] = options
18
20
 
21
+ if options[:unit_field_name]
22
+ unit_field_name = options[:unit_field_name].to_s
23
+ measured_fields[field][:unit_field_name] = unit_field_name
24
+ else
25
+ unit_field_name = "#{ field }_unit"
26
+ end
27
+
28
+ value_field_name = "#{ field }_value"
29
+
19
30
  # Reader to retrieve measured object
20
31
  define_method(field) do
21
- value = public_send("#{ field }_value")
22
- unit = public_send("#{ field }_unit")
32
+ value = public_send(value_field_name)
33
+ unit = public_send(unit_field_name)
23
34
 
24
35
  return nil unless value && unit
25
36
 
@@ -41,11 +52,10 @@ module Measured::Rails::ActiveRecord
41
52
  define_method("#{ field }=") do |incoming|
42
53
  if incoming.is_a?(measured_class)
43
54
  instance_variable_set("@measured_#{ field }", incoming)
44
- value_field_name = "#{ field }_value"
45
55
  precision = self.column_for_attribute(value_field_name).precision
46
56
  scale = self.column_for_attribute(value_field_name).scale
47
57
  rounded_to_scale_value = incoming.value.round(scale)
48
-
58
+
49
59
  max = self.class.measured_fields[field][:max_on_assignment]
50
60
  if max && rounded_to_scale_value > max
51
61
  rounded_to_scale_value = max
@@ -53,20 +63,22 @@ module Measured::Rails::ActiveRecord
53
63
  raise Measured::Rails::Error, "The value #{rounded_to_scale_value} being set for column '#{value_field_name}' has too many significant digits. Please ensure it has no more than #{precision - scale} significant digits."
54
64
  end
55
65
  public_send("#{ value_field_name }=", rounded_to_scale_value)
56
- public_send("#{ field }_unit=", incoming.unit)
66
+ public_send("#{ unit_field_name }=", incoming.unit)
57
67
  else
58
68
  instance_variable_set("@measured_#{ field }", nil)
59
- public_send("#{ field }_value=", nil)
60
- public_send("#{ field }_unit=", nil)
69
+ public_send("#{ value_field_name}=", nil)
70
+ public_send("#{ unit_field_name }=", nil)
61
71
  end
62
72
  end
63
73
 
74
+ next if defined_unit_accessors.include?(unit_field_name)
75
+
64
76
  # Writer to override unit assignment
65
- define_method("#{ field }_unit=") do |incoming|
77
+ define_method("#{ unit_field_name }=") do |incoming|
78
+ defined_unit_accessors << unit_field_name
66
79
  incoming = measured_class.conversion.to_unit_name(incoming) if measured_class.valid_unit?(incoming)
67
- write_attribute("#{ field }_unit", incoming)
80
+ write_attribute(unit_field_name, incoming)
68
81
  end
69
-
70
82
  end
71
83
  end
72
84
 
@@ -9,10 +9,13 @@ class MeasuredValidator < ActiveModel::EachValidator
9
9
 
10
10
  def validate_each(record, attribute, measurable)
11
11
  measured_config = record.class.measured_fields[attribute]
12
+ unit_field_name = measured_config[:unit_field_name] || "#{ attribute }_unit"
13
+ value_field_name = "#{ attribute }_value"
12
14
 
13
15
  measured_class = measured_config[:class]
14
- measurable_unit = record.public_send("#{ attribute }_unit")
15
- measurable_value = record.public_send("#{ attribute }_value")
16
+
17
+ measurable_unit = record.public_send(unit_field_name)
18
+ measurable_value = record.public_send(value_field_name)
16
19
 
17
20
  return unless measurable_unit.present? || measurable_value.present?
18
21
 
@@ -1,5 +1,5 @@
1
1
  module Measured
2
2
  module Rails
3
- VERSION = "1.5.0"
3
+ VERSION = "1.6.0"
4
4
  end
5
5
  end
@@ -18,9 +18,10 @@ Gem::Specification.new do |spec|
18
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
19
  spec.require_paths = ["lib"]
20
20
 
21
+ spec.add_runtime_dependency "measured", Measured::Rails::VERSION
22
+
21
23
  spec.add_runtime_dependency "railties", ">= 4.0"
22
24
  spec.add_runtime_dependency "activemodel", ">= 4.0"
23
- spec.add_runtime_dependency "measured", "1.5.0"
24
25
 
25
26
  spec.add_development_dependency "rake", "~> 10.0"
26
27
  spec.add_development_dependency "minitest", "~> 5.5.1"
metadata CHANGED
@@ -1,31 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: measured-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin McPhillips
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-10-11 00:00:00.000000000 Z
11
+ date: 2016-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: railties
14
+ name: measured
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: '4.0'
19
+ version: 1.6.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: '4.0'
26
+ version: 1.6.0
27
27
  - !ruby/object:Gem::Dependency
28
- name: activemodel
28
+ name: railties
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
@@ -39,19 +39,19 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '4.0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: measured
42
+ name: activemodel
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 1.5.0
47
+ version: '4.0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: 1.5.0
54
+ version: '4.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -149,7 +149,6 @@ files:
149
149
  - lib/measured/rails/validations.rb
150
150
  - lib/measured/rails/version.rb
151
151
  - measured-rails.gemspec
152
- - repodb.yml
153
152
  - shipit.rubygems.yml
154
153
  homepage: https://github.com/Shopify/measured-rails
155
154
  licenses:
data/repodb.yml DELETED
@@ -1,3 +0,0 @@
1
- classification: library
2
- ci_urls:
3
- - https://travis-ci.org/Shopify/measured-rails