measured-rails 2.4.0 → 2.5.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
- SHA1:
3
- metadata.gz: df2e90752c0498af26eec28e0bf7449943060f86
4
- data.tar.gz: 9bbf70451053b0969d33221dc1fe8d08f493c200
2
+ SHA256:
3
+ metadata.gz: 6077a6cf4bf52eb20d9601faeb82f7d86ed17cdef9f8ba1790911976d947d9e2
4
+ data.tar.gz: 39beec03cf41ae5ecfb31f3f5fc9c6910bd06741403871db080dcef7065347c5
5
5
  SHA512:
6
- metadata.gz: 2002922a7bdd92292bd9b5fc027eae92bbb463026c1230f00dc167c6d51754c3623783947883b10c8155247797d49dd6c9808f07211bacb08f13759a72ff3013
7
- data.tar.gz: 4aa0e718a3f72565c880b8a83b95ea9e0924248445a4038702b3a0f9083e718a0cb78774808475cd87deff132f83b6989ad9af435ce65b1c6ebffc3530d518de
6
+ metadata.gz: 0dd1f19a73555bfdbc885ab5b0a0ac41dc5692bfa68cd573c28add607c12f94c397ed75f3e02245026db799d65b3ecdc538cf5033a49df3562375a6931a0563f
7
+ data.tar.gz: 7c15e21fe5726761ebb6364285c2872f11818158f815601b7a772576c9f99ef11a6b9f7e9bb91d229a375f9fd0eba74b6a7cb03b5abbc3e5c8003e1b283eb391
@@ -2,24 +2,27 @@ language: ruby
2
2
  sudo: false
3
3
  cache: bundler
4
4
  rvm:
5
- - 2.1.8
6
- - 2.2.4
7
- - 2.3.1
8
- - 2.4.0
5
+ - 2.3.8
6
+ - 2.4.5
7
+ - 2.5.5
8
+ - 2.6.3
9
9
  gemfile:
10
10
  - Gemfile
11
- - gemfiles/rails-4.2.gemfile
12
11
  - gemfiles/rails-5.0.gemfile
12
+ - gemfiles/rails-5.1.gemfile
13
+ - gemfiles/rails-6.0.gemfile
13
14
  - gemfiles/rails-master.gemfile
15
+ before_script:
16
+ - gem update --system
14
17
  matrix:
15
18
  exclude:
16
- - gemfile: Gemfile
17
- rvm: 2.1.8
18
19
  - gemfile: gemfiles/rails-master.gemfile
19
- rvm: 2.1.8
20
- - gemfile: gemfiles/rails-5.0.gemfile
21
- rvm: 2.1.8
22
- - gemfile: gemfiles/rails-4.2.gemfile
23
- rvm: 2.4.0
20
+ rvm: 2.3.8
21
+ - gemfile: gemfiles/rails-master.gemfile
22
+ rvm: 2.4.5
23
+ - gemfile: gemfiles/rails-6.0.gemfile
24
+ rvm: 2.3.8
25
+ - gemfile: gemfiles/rails-6.0.gemfile
26
+ rvm: 2.4.5
24
27
  allow_failures:
25
28
  - gemfile: gemfiles/rails-master.gemfile
data/README.md CHANGED
@@ -40,6 +40,7 @@ A column can be declared as a measurement with its measurement subclass:
40
40
  class Thing < ActiveRecord::Base
41
41
  measured Measured::Weight, :minimum_weight
42
42
  measured Measured::Length, :total_length
43
+ measured Measured::Volume, :total_volume
43
44
  end
44
45
  ```
45
46
 
@@ -49,6 +50,7 @@ You can optionally customize the model's unit column by specifying it in the `un
49
50
  class ThingWithCustomUnitAccessor < ActiveRecord::Base
50
51
  measured_length :length, :width, :height, unit_field_name: :size_unit
51
52
  measured_weight :total_weight, :extra_weight, unit_field_name: :weight_unit
53
+ measured_volume :total_volume, :extra_volume, unit_field_name: :volume_unit
52
54
  end
53
55
  ```
54
56
 
@@ -58,6 +60,7 @@ There are some simpler methods for predefined types:
58
60
  class Thing < ActiveRecord::Base
59
61
  measured_weight :minimum_weight
60
62
  measured_length :total_length
63
+ measured_volume :total_volume
61
64
  end
62
65
  ```
63
66
 
File without changes
data/bin/setup CHANGED
File without changes
data/dev.yml CHANGED
@@ -2,7 +2,7 @@ name: measured-rails
2
2
 
3
3
  up:
4
4
  - ruby:
5
- version: 2.3.1
5
+ version: 2.6.3
6
6
  - bundler
7
7
 
8
8
  commands:
@@ -2,5 +2,4 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec path: '..'
4
4
 
5
- gem 'rails', '~> 4.2'
6
- gem 'rack', '< 2.0'
5
+ gem 'rails', '~> 5.1'
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec path: '..'
4
+
5
+ gem 'rails', '~> 6.0.0.rc1'
@@ -2,3 +2,4 @@ require "measured/rails/base"
2
2
 
3
3
  require "measured/rails/units/length"
4
4
  require "measured/rails/units/weight"
5
+ require "measured/rails/units/volume"
@@ -5,7 +5,6 @@ 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 = []
9
8
 
10
9
  measured_class = measured_class.constantize if measured_class.is_a?(String)
11
10
  unless measured_class.is_a?(Class) && measured_class.ancestors.include?(Measured::Measurable)
@@ -34,7 +33,7 @@ module Measured::Rails::ActiveRecord
34
33
 
35
34
  return nil unless value && unit
36
35
 
37
- instance = instance_variable_get("@measured_#{ field }")
36
+ instance = instance_variable_get("@measured_#{ field }") if instance_variable_defined?("@measured_#{ field }")
38
37
  new_instance = begin
39
38
  measured_class.new(value, unit)
40
39
  rescue Measured::UnitError
@@ -72,11 +71,8 @@ module Measured::Rails::ActiveRecord
72
71
  end
73
72
  end
74
73
 
75
- next if defined_unit_accessors.include?(unit_field_name)
76
-
77
74
  # Writer to override unit assignment
78
- define_method("#{ unit_field_name }=") do |incoming|
79
- defined_unit_accessors << unit_field_name
75
+ redefine_method("#{ unit_field_name }=") do |incoming|
80
76
  unit_name = measured_class.unit_system.unit_for(incoming).try!(:name)
81
77
  write_attribute(unit_field_name, unit_name || incoming)
82
78
  end
@@ -1,7 +1,8 @@
1
1
  require "measured/rails/version"
2
2
  require "measured"
3
3
 
4
- require "active_support"
4
+ require "active_support/all"
5
+ require "active_record"
5
6
  require "active_model"
6
7
  require "active_model/validations"
7
8
 
@@ -0,0 +1,13 @@
1
+ module Measured::Rails::ActiveRecord::Volume
2
+ extend ActiveSupport::Concern
3
+
4
+ module ClassMethods
5
+ def measured_volume(*fields)
6
+ measured(Measured::Volume, *fields)
7
+ end
8
+ end
9
+ end
10
+
11
+ ActiveSupport.on_load(:active_record) do
12
+ ::ActiveRecord::Base.send :include, Measured::Rails::ActiveRecord::Volume
13
+ end
@@ -1,5 +1,5 @@
1
1
  module Measured
2
2
  module Rails
3
- VERSION = "2.4.0"
3
+ VERSION = "2.5.0"
4
4
  end
5
5
  end
@@ -13,15 +13,16 @@ Gem::Specification.new do |spec|
13
13
  spec.homepage = "https://github.com/Shopify/measured-rails"
14
14
  spec.license = "MIT"
15
15
 
16
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
- spec.bindir = "exe"
18
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_runtime_dependency "measured", Measured::Rails::VERSION
22
22
 
23
23
  spec.add_runtime_dependency "railties", ">= 4.2"
24
24
  spec.add_runtime_dependency "activemodel", ">= 4.2"
25
+ spec.add_runtime_dependency "activerecord", ">= 4.2"
25
26
 
26
27
  spec.add_development_dependency "rake", "> 10.0"
27
28
  spec.add_development_dependency "minitest", "> 5.5.1"
@@ -0,0 +1,434 @@
1
+ require "test_helper"
2
+
3
+ class Measured::Rails::ActiveRecordTest < ActiveSupport::TestCase
4
+ setup do
5
+ reset_db
6
+ end
7
+
8
+ test ".measured raises if called with something that isn't a Measured::Measurable" do
9
+ assert_raises Measured::Rails::Error do
10
+ Thing.measured(Object, :field)
11
+ end
12
+ end
13
+
14
+ test ".measured raises if called with something that isn't a class" do
15
+ assert_raises Measured::Rails::Error do
16
+ Thing.measured(:not_correct, :field)
17
+ end
18
+ end
19
+
20
+ test ".measured raises if you attempt to define a field twice" do
21
+ assert_raises Measured::Rails::Error do
22
+ Thing.measured Measured::Length, :height
23
+ end
24
+ end
25
+
26
+ test ".measured defines a reader for the field" do
27
+ assert_equal length, thing.length
28
+ end
29
+
30
+ test ".measured defines a writer for the field that returns" do
31
+ assert_equal new_length, thing.length=(new_length)
32
+ end
33
+
34
+ test ".measured_fields returns the configuration for all measured fields on the class" do
35
+ expected = {
36
+ length: { class: Measured::Length },
37
+ width: { class: Measured::Length },
38
+ height: { class: Measured::Length },
39
+ volume: { class: Measured::Volume },
40
+ total_weight: { class: Measured::Weight },
41
+ extra_weight: { class: Measured::Weight },
42
+ length_with_max_on_assignment: { max_on_assignment: 500, class: Measured::Length }
43
+ }
44
+
45
+ assert_equal expected, Thing.measured_fields
46
+ end
47
+
48
+ test "reader returns the exact same object if the values are equivalent" do
49
+ thing.length = new_length
50
+ assert_equal new_length.object_id, thing.length.object_id
51
+ end
52
+
53
+ test "reader creates an instance from the _value and _unit columns" do
54
+ thing = Thing.new
55
+ thing.width_value = 23
56
+ thing.width_unit = "ft"
57
+ assert_equal Measured::Length.new(23, :ft), thing.width
58
+ end
59
+
60
+ test "reader creates creating an instance from columns caches the same object" do
61
+ thing = Thing.new
62
+ thing.width_value = 23
63
+ thing.width_unit = "ft"
64
+ assert_equal thing.width.object_id, thing.width.object_id
65
+ end
66
+
67
+ test "reader deals with only the _value column set" do
68
+ thing = Thing.new
69
+ thing.width_value = 23
70
+ assert_nil thing.width
71
+ end
72
+
73
+ test "reader deals with only the _unit column set" do
74
+ thing = Thing.new
75
+ thing.width_unit = "cm"
76
+ assert_nil thing.width
77
+ end
78
+
79
+ test "reader deals with nil-ing out the _value column" do
80
+ thing.width_value = nil
81
+ assert_nil thing.width
82
+ end
83
+
84
+ test "reader deals with nil-ing out the _unit column" do
85
+ thing.width_unit = nil
86
+ assert_nil thing.width
87
+ end
88
+
89
+ test "writer sets the value to nil if it is an incompatible object" do
90
+ thing.length = Object.new
91
+ assert_nil thing.length
92
+ end
93
+
94
+ test "writer assigning nil blanks out the unit and value columns" do
95
+ thing.width = nil
96
+ assert_nil thing.width
97
+ assert_nil thing.width_unit
98
+ assert_nil thing.width_value
99
+ end
100
+
101
+ test "assigning an invalid _unit sets the column but the measurable object is nil" do
102
+ thing.width_unit = "invalid"
103
+ assert_nil thing.width
104
+ assert_equal "invalid", thing.width_unit
105
+ end
106
+
107
+ test "assigning an invalid _unit sets the column but the measurable object is nil and there is validation on the column" do
108
+ validated_thing.length_unit = "invalid"
109
+ validated_thing.valid?
110
+ assert_nil validated_thing.length
111
+ assert_equal "invalid", validated_thing.length_unit
112
+ end
113
+
114
+ test "assigning a valid _unit sets it" do
115
+ thing.width_unit = :mm
116
+ assert_equal thing.width, Measured::Length.new(6, "mm")
117
+ assert_equal "mm", thing.width_unit
118
+ end
119
+
120
+ test "assigning a non-base unit to _unit converts it to its base unit" do
121
+ thing.width_unit = "millimetre"
122
+ assert_equal thing.width, Measured::Length.new(6, "mm")
123
+ assert_equal "mm", thing.width_unit
124
+ end
125
+
126
+ test "building a new object from attributes builds a measured object" do
127
+ thing = Thing.new(length_value: "30", length_unit: "m")
128
+ assert_equal Measured::Length.new(30, :m), thing.length
129
+ end
130
+
131
+ test "building a new object with a measured object assigns the properties" do
132
+ thing = Thing.new(length: new_length)
133
+ assert_equal new_length, thing.length
134
+ assert_equal 20, thing.length_value
135
+ assert_equal "in", thing.length_unit
136
+ end
137
+
138
+ test "assigning attributes updates the measured object" do
139
+ thing.attributes = {length_value: "30", length_unit: "m"}
140
+ assert_equal Measured::Length.new(30, :m), thing.length
141
+ end
142
+
143
+ test "assigning partial attributes updates the measured object" do
144
+ thing.attributes = {length_value: "30"}
145
+ assert_equal Measured::Length.new(30, :cm), thing.length
146
+ end
147
+
148
+ test "assigning the _unit leaves the _value unchanged" do
149
+ thing.total_weight_unit = :lb
150
+ assert_equal thing.total_weight, Measured::Weight.new(200, "lb")
151
+ end
152
+
153
+ test "assigning the _value leaves the _unit unchanged" do
154
+ thing.total_weight_value = "10"
155
+ assert_equal thing.total_weight, Measured::Weight.new(10, :g)
156
+ end
157
+
158
+ test "assigning the _unit to an invalid unit does not raise" do
159
+ thing.total_weight_value = 123
160
+ thing.total_weight_unit = :invalid
161
+ assert_nil thing.total_weight
162
+ end
163
+
164
+ test "save persists the attributes and retrieves an object" do
165
+ thing = Thing.new length: Measured::Length.new(3, :m)
166
+ assert thing.save
167
+ assert_equal 3, thing.length_value
168
+ assert_equal "m", thing.length_unit
169
+ thing.reload
170
+ assert_equal 3, thing.length_value
171
+ assert_equal "m", thing.length_unit
172
+ end
173
+
174
+ test "save pulls attributes from assigned object" do
175
+ thing = Thing.new total_weight_value: "100", total_weight_unit: :lb
176
+ assert thing.save
177
+ thing.reload
178
+ assert_equal 100, thing.total_weight_value
179
+ assert_equal "lb", thing.total_weight_unit
180
+ assert_equal Measured::Weight.new(100, :lb), thing.total_weight
181
+ end
182
+
183
+ test "save succeeds if you assign an invalid unit and there is no validation" do
184
+ thing = Thing.new total_weight_value: "100", total_weight_unit: :invalid
185
+ assert thing.save
186
+ thing.reload
187
+ assert_nil thing.total_weight
188
+ assert_equal 100, thing.total_weight_value
189
+ end
190
+
191
+ test "save fails if you assign an invalid unit and there is validation" do
192
+ thing = validated_thing
193
+ thing.length_unit = "invalid"
194
+ refute thing.save
195
+ assert_nil thing.length
196
+ end
197
+
198
+ test "update_attribute sets only the _value column" do
199
+ thing = Thing.create!
200
+ thing.update_attribute(:width_value, 11)
201
+ assert_nil thing.width
202
+ end
203
+
204
+ test "update_attribute sets only the _unit column" do
205
+ thing = Thing.create!
206
+ thing.update_attribute(:width_unit, "cm")
207
+ assert_nil thing.width
208
+ end
209
+
210
+ test "update_attribute modifies the _value column" do
211
+ assert thing.update_attribute(:width_value, 99)
212
+ assert_equal Measured::Length.new(99, :in), thing.width
213
+ end
214
+
215
+ test "update_attribute modifies only the _unit column" do
216
+ assert thing.update_attribute(:width_unit, :cm)
217
+ assert_equal Measured::Length.new(6, :cm), thing.width
218
+ end
219
+
220
+ test "update_attribute sets one then the other" do
221
+ thing = Thing.create!
222
+ assert thing.update_attribute(:width_value, 11.1)
223
+ assert_nil thing.width
224
+ assert thing.update_attribute(:width_unit, "cm")
225
+ assert_equal Measured::Length.new(11.1, :cm), thing.width
226
+ end
227
+
228
+ test "update_attributes sets only the _value column" do
229
+ thing = Thing.create!
230
+ assert thing.update_attributes(width_value: "314")
231
+ assert_equal 314, thing.width_value
232
+ thing.reload
233
+ assert_equal 314, thing.width_value
234
+ assert_nil thing.width
235
+ end
236
+
237
+ test "update_attributes sets only the _unit column" do
238
+ thing = Thing.create!
239
+ assert thing.update_attributes(width_unit: :cm)
240
+ assert_equal "cm", thing.width_unit
241
+ thing.reload
242
+ assert_equal "cm", thing.width_unit
243
+ assert_nil thing.width
244
+ end
245
+
246
+ test "update_attributes sets only the _unit column and converts it" do
247
+ thing = Thing.create!
248
+ assert thing.update_attributes(width_unit: "inch")
249
+ assert_equal "in", thing.width_unit
250
+ thing.reload
251
+ assert_equal "in", thing.width_unit
252
+ end
253
+
254
+ test "update_attributes sets the _unit column to something invalid" do
255
+ thing = Thing.create!
256
+ assert thing.update_attributes(width_unit: :invalid)
257
+ assert_equal "invalid", thing.width_unit
258
+ thing.reload
259
+ assert_equal "invalid", thing.width_unit
260
+ assert_nil thing.width
261
+ end
262
+
263
+ test "update_attributes does not set the _unit column to something invalid if there is validation" do
264
+ thing = validated_thing
265
+ thing.save!
266
+ refute thing.update_attributes(length_unit: :invalid)
267
+ end
268
+
269
+ test "update_attributes sets one column then the other" do
270
+ thing = Thing.create!
271
+ assert thing.update_attributes(width_unit: "inch")
272
+ assert_nil thing.width
273
+ assert thing.update_attributes(width_value: "314")
274
+ assert_equal Measured::Length.new(314, :in), thing.width
275
+ end
276
+
277
+ test "update_attributes sets both columns" do
278
+ thing = Thing.create!
279
+ assert thing.update_attributes(width_unit: :cm, width_value: 2)
280
+ assert_equal Measured::Length.new(2, :cm), thing.width
281
+ thing.reload
282
+ assert_equal Measured::Length.new(2, :cm), thing.width
283
+ end
284
+
285
+ test "update_attributes modifies the _value column" do
286
+ assert thing.update_attributes(height_value: 2)
287
+ assert_equal Measured::Length.new(2, :m), thing.height
288
+ thing.reload
289
+ assert_equal Measured::Length.new(2, :m), thing.height
290
+ end
291
+
292
+ test "update_attributes modifies only the _unit column" do
293
+ assert thing.update_attributes(height_unit: "foot")
294
+ assert_equal Measured::Length.new(1, :ft), thing.height
295
+ thing.reload
296
+ assert_equal Measured::Length.new(1, :ft), thing.height
297
+ end
298
+
299
+ test "update_attributes modifies the _unit column to be something invalid" do
300
+ assert thing.update_attributes(height_unit: :invalid)
301
+ assert_nil thing.height
302
+ assert_equal "invalid", thing.height_unit
303
+ thing.reload
304
+ assert_nil thing.height
305
+ assert_equal "invalid", thing.height_unit
306
+ end
307
+
308
+ test "update_attributes modifies both columns" do
309
+ assert thing.update_attributes(height_unit: "mm", height_value: 1.23)
310
+ assert_equal Measured::Length.new(1.23, :mm), thing.height
311
+ thing.reload
312
+ assert_equal Measured::Length.new(1.23, :mm), thing.height
313
+ end
314
+
315
+ test "assigning the _value with a BigDecimal rounds to the column's rounding scale" do
316
+ thing.height = Measured::Length.new(BigDecimal('23.4567891'), :mm)
317
+ assert_equal thing.height_value, BigDecimal('23.46')
318
+ end
319
+
320
+ test "assigning the _value with a float uses all the rounding scale permissible" do
321
+ thing.height = Measured::Length.new(4.45678912, :mm)
322
+ assert_equal thing.height_value, BigDecimal('4.46')
323
+ end
324
+
325
+ test "assigning a number with more significant digits than permitted by the column precision does not raise exception when it can be rounded to have lesser significant digits per column's scale" do
326
+ assert_nothing_raised do
327
+ thing.height = Measured::Length.new(4.45678912123123123, :mm)
328
+ assert_equal thing.height_value, BigDecimal('4.46')
329
+ end
330
+ end
331
+
332
+ test "assigning a number with more significant digits than permitted by the column precision raises exception" do
333
+ assert_raises Measured::Rails::Error, "The value 44567891212312312.3 being set for column: 'height' has too many significant digits. Please ensure it has no more than 10 significant digits." do
334
+ thing.height = Measured::Length.new(44567891212312312.3, :mm)
335
+ end
336
+ end
337
+
338
+ test "assigning a large number but with a small amount of significant digits than permitted by the column precision raises exception" do
339
+ assert_raises Measured::Rails::Error, "The value 2000000000000000.0 being set for column: 'height' has too many significant digits. Please ensure it has no more than 10 significant digits." do
340
+ thing.height = Measured::Length.new(2_000_000_000_000_000, :mm)
341
+ end
342
+ end
343
+
344
+ test "assigning a large number that's just smaller, equal to, and over the size of the column precision raises exception" do
345
+ assert_nothing_raised do
346
+ thing.height = Measured::Length.new(99999999.99, :mm)
347
+ end
348
+
349
+ assert_raises Measured::Rails::Error, "The value 100000000.0 being set for column: 'height' has too many significant digits. Please ensure it has no more than 10 significant digits." do
350
+ thing.height = Measured::Length.new(100000000, :mm)
351
+ end
352
+
353
+ assert_raises Measured::Rails::Error, "The value 100000000.01 being set for column: 'height' has too many significant digits. Please ensure it has no more than 10 significant digits." do
354
+ thing.height = Measured::Length.new(100000000.01, :mm)
355
+ end
356
+ end
357
+
358
+ test "assigning a large number to a field that specifies max_on_assignment" do
359
+ thing = Thing.create!(length_with_max_on_assignment: Measured::Length.new(10000000000000000, :mm))
360
+ assert_equal Measured::Length.new(500, :mm), thing.length_with_max_on_assignment
361
+ end
362
+
363
+ test "assigning a small number to a field that specifies max_on_assignment" do
364
+ thing = Thing.create!(length_with_max_on_assignment: Measured::Length.new(1, :mm))
365
+ assert_equal Measured::Length.new(1, :mm), thing.length_with_max_on_assignment
366
+ end
367
+
368
+ test "using a similar unit accessor for multiple size fields" do
369
+ assert_equal Measured::Length.new(1, :m), custom_unit_thing.length
370
+ assert_equal Measured::Length.new(2, :m), custom_unit_thing.width
371
+ assert_equal Measured::Length.new(3, :m), custom_unit_thing.height
372
+ assert_equal Measured::Volume.new(9, :l), custom_unit_thing.volume
373
+ assert_equal Measured::Weight.new(10, :g), custom_unit_thing.total_weight
374
+ assert_equal Measured::Weight.new(12, :g), custom_unit_thing.extra_weight
375
+ end
376
+
377
+ test "changing unit value when shared affects all fields" do
378
+ custom_unit_thing.length = Measured::Length.new(15, :in)
379
+ custom_unit_thing.total_weight = Measured::Weight.new(42, :kg)
380
+
381
+ assert_equal custom_unit_thing.length, Measured::Length.new(15, :in)
382
+ assert_equal custom_unit_thing.width, Measured::Length.new(2, :in)
383
+ assert_equal custom_unit_thing.height, Measured::Length.new(3, :in)
384
+ assert_equal custom_unit_thing.total_weight, Measured::Weight.new(42, :kg)
385
+ assert_equal custom_unit_thing.extra_weight, Measured::Weight.new(12, :kg)
386
+ end
387
+
388
+ private
389
+
390
+ def length
391
+ @length ||= Measured::Length.new(10, :cm)
392
+ end
393
+
394
+ def new_length
395
+ @new_length ||= Measured::Length.new(20, :in)
396
+ end
397
+
398
+ def thing
399
+ @thing ||= Thing.create!(
400
+ length: length,
401
+ width: Measured::Length.new(6, :in),
402
+ volume: Measured::Volume.new(6, :l),
403
+ height: Measured::Length.new(1, :m),
404
+ total_weight: Measured::Weight.new(200, :g),
405
+ extra_weight: Measured::Weight.new(16, :oz)
406
+ )
407
+ end
408
+
409
+ def validated_thing
410
+ @thing ||= ValidatedThing.new(
411
+ length: Measured::Length.new(1, :m),
412
+ length_true: Measured::Length.new(2, :cm),
413
+ length_message: Measured::Length.new(3, :mm),
414
+ length_message_from_block: Measured::Length.new(7, :mm),
415
+ length_units: Measured::Length.new(4, :m),
416
+ length_units_singular: Measured::Length.new(5, :ft),
417
+ length_presence: Measured::Length.new(6, :m),
418
+ length_numericality_inclusive: Measured::Length.new(15, :in),
419
+ length_numericality_exclusive: Measured::Length.new(4, :m),
420
+ length_numericality_equality: Measured::Length.new(100, :cm),
421
+ )
422
+ end
423
+
424
+ def custom_unit_thing
425
+ @custom_unit_thing ||= ThingWithCustomUnitAccessor.new(
426
+ length: Measured::Length.new(1, :m),
427
+ width: Measured::Length.new(2, :m),
428
+ height: Measured::Length.new(3, :m),
429
+ volume: Measured::Volume.new(9, :l),
430
+ total_weight: Measured::Weight.new(10, :g),
431
+ extra_weight: Measured::Weight.new(12, :g),
432
+ )
433
+ end
434
+ end
@@ -0,0 +1,14 @@
1
+ class Thing < ActiveRecord::Base
2
+
3
+ measured_length :length, :width
4
+
5
+ measured Measured::Length, :height
6
+ measured Measured::Volume, :volume
7
+
8
+ measured_weight :total_weight
9
+
10
+ measured "Measured::Weight", :extra_weight
11
+
12
+ measured_length :length_with_max_on_assignment, {max_on_assignment: 500}
13
+
14
+ end
@@ -0,0 +1,18 @@
1
+ class ThingWithCustomUnitAccessor < ActiveRecord::Base
2
+
3
+ measured_length :length, :width, unit_field_name: :size_unit
4
+ validates :length, measured: true
5
+ validates :width, measured: true
6
+
7
+ measured_volume :volume
8
+ validates :volume, measured: true
9
+
10
+ measured Measured::Length, :height, unit_field_name: :size_unit
11
+ validates :height, measured: true
12
+
13
+ measured_weight :total_weight, unit_field_name: :weight_unit
14
+ validates :total_weight, measured: true
15
+
16
+ measured "Measured::Weight", :extra_weight, unit_field_name: :weight_unit
17
+ validates :extra_weight, measured: true
18
+ end
@@ -0,0 +1,46 @@
1
+ class ValidatedThing < ActiveRecord::Base
2
+
3
+ measured_length :length
4
+ validates :length, measured: true
5
+
6
+ measured_length :length_true
7
+ validates :length_true, measured: true
8
+
9
+ measured_length :length_message
10
+ validates :length_message, measured: {message: "has a custom failure message"}
11
+
12
+ measured_length :length_message_from_block
13
+ validates :length_message_from_block, measured: { message: Proc.new { |record| "#{record.length_message_from_block_unit} is not a valid unit" } }
14
+
15
+ measured_length :length_units
16
+ validates :length_units, measured: {units: [:meter, "cm"]}
17
+
18
+ measured_length :length_units_singular
19
+ validates :length_units_singular, measured: {units: :ft, message: "custom message too"}
20
+
21
+ measured_length :length_presence
22
+ validates :length_presence, measured: true, presence: true
23
+
24
+ measured_length :length_numericality_inclusive
25
+ validates :length_numericality_inclusive, measured: {greater_than_or_equal_to: :low_bound, less_than_or_equal_to: :high_bound }
26
+
27
+ measured_length :length_numericality_exclusive
28
+ validates :length_numericality_exclusive, measured: {greater_than: Measured::Length.new(3, :m), less_than: Measured::Length.new(500, :cm), message: "is super not ok"}
29
+
30
+ measured_length :length_numericality_equality
31
+ validates :length_numericality_equality, measured: {equal_to: Proc.new { Measured::Length.new(100, :cm) }, message: "must be exactly 100cm"}
32
+
33
+ measured_length :length_invalid_comparison
34
+ validates :length_invalid_comparison, measured: {equal_to: "not_a_measured_subclass"}
35
+
36
+ private
37
+
38
+ def low_bound
39
+ Measured::Length.new(10, :in)
40
+ end
41
+
42
+ def high_bound
43
+ Measured::Length.new(20, :in)
44
+ end
45
+
46
+ end
@@ -0,0 +1,83 @@
1
+ # This file is auto-generated from the current state of the database. Instead
2
+ # of editing this file, please use the migrations feature of Active Record to
3
+ # incrementally modify your database, and then regenerate this schema definition.
4
+ #
5
+ # Note that this schema.rb definition is the authoritative source for your
6
+ # database schema. If you need to create the application database on another
7
+ # system, you should be using db:schema:load, not running all the migrations
8
+ # from scratch. The latter is a flawed and unsustainable approach (the more migrations
9
+ # you'll amass, the slower it'll run and the greater likelihood for issues).
10
+ #
11
+ # It's strongly recommended that you check this file into your version control system.
12
+
13
+ ActiveRecord::Schema.define(version: 20161118203701) do
14
+
15
+ create_table "thing_with_custom_unit_accessors", force: :cascade do |t|
16
+ t.decimal "length_value", precision: 10, scale: 2
17
+ t.decimal "width_value", precision: 10, scale: 2
18
+ t.decimal "height_value", precision: 10, scale: 2
19
+ t.decimal "volume_value", precision: 10, scale: 2
20
+ t.string "volume_unit", limit: 12
21
+ t.string "size_unit", limit: 12
22
+ t.decimal "total_weight_value", precision: 10, scale: 2, default: "10.0"
23
+ t.decimal "extra_weight_value", precision: 10, scale: 2
24
+ t.string "weight_unit", limit: 12
25
+ t.datetime "created_at", null: false
26
+ t.datetime "updated_at", null: false
27
+ end
28
+
29
+ create_table "things", force: :cascade do |t|
30
+ t.decimal "length_value", precision: 10, scale: 2
31
+ t.string "length_unit", limit: 12
32
+ t.decimal "width_value", precision: 10, scale: 2
33
+ t.string "width_unit", limit: 12
34
+ t.decimal "height_value", precision: 10, scale: 2
35
+ t.string "height_unit", limit: 12
36
+ t.decimal "volume_value", precision: 10, scale: 2
37
+ t.string "volume_unit", limit: 12
38
+ t.decimal "total_weight_value", precision: 10, scale: 2, default: "10.0"
39
+ t.string "total_weight_unit", limit: 12, default: "g"
40
+ t.decimal "extra_weight_value", precision: 10, scale: 2
41
+ t.string "extra_weight_unit", limit: 12
42
+ t.decimal "length_with_max_on_assignment_value", precision: 10, scale: 2
43
+ t.string "length_with_max_on_assignment_unit", limit: 12
44
+ t.datetime "created_at", null: false
45
+ t.datetime "updated_at", null: false
46
+ end
47
+
48
+ create_table "validated_things", force: :cascade do |t|
49
+ t.decimal "length_value", precision: 10, scale: 2
50
+ t.string "length_unit", limit: 12
51
+ t.decimal "length_true_value", precision: 10, scale: 2
52
+ t.string "length_true_unit", limit: 12
53
+ t.decimal "length_message_value", precision: 10, scale: 2
54
+ t.string "length_message_unit", limit: 12
55
+ t.decimal "length_message_from_block_value", precision: 10, scale: 2
56
+ t.string "length_message_from_block_unit", limit: 12
57
+ t.decimal "length_units_value", precision: 10, scale: 2
58
+ t.string "length_units_unit", limit: 12
59
+ t.decimal "length_units_singular_value", precision: 10, scale: 2
60
+ t.string "length_units_singular_unit", limit: 12
61
+ t.decimal "length_presence_value", precision: 10, scale: 2
62
+ t.string "length_presence_unit", limit: 12
63
+ t.decimal "length_invalid_value", precision: 10, scale: 2
64
+ t.string "length_invalid_unit", limit: 12
65
+ t.datetime "created_at", null: false
66
+ t.datetime "updated_at", null: false
67
+ t.decimal "length_numericality_inclusive_value", precision: 10, scale: 2
68
+ t.string "length_numericality_inclusive_unit", limit: 12
69
+ t.decimal "length_numericality_exclusive_value", precision: 10, scale: 2
70
+ t.string "length_numericality_exclusive_unit", limit: 12
71
+ t.decimal "length_numericality_equality_value", precision: 10, scale: 2
72
+ t.string "length_numericality_equality_unit", limit: 12
73
+ t.decimal "length_invalid_comparison_value", precision: 10, scale: 2
74
+ t.string "length_invalid_comparison_unit", limit: 12
75
+ t.decimal "length_non_zero_scalar_value", precision: 10, scale: 2
76
+ t.string "length_non_zero_scalar_unit", limit: 12
77
+ t.decimal "length_zero_scalar_value", precision: 10, scale: 2
78
+ t.string "length_zero_scalar_unit", limit: 12
79
+ t.decimal "length_numericality_less_than_than_scalar_value", precision: 10, scale: 2
80
+ t.string "length_numericality_less_than_than_scalar_unit", limit: 12
81
+ end
82
+
83
+ end
@@ -0,0 +1,29 @@
1
+ require "pry" unless ENV["CI"]
2
+ require "measured"
3
+ require "measured-rails"
4
+ require "minitest/autorun"
5
+ require "minitest/reporters"
6
+ require "mocha/setup"
7
+
8
+ ActiveSupport.test_order = :random
9
+
10
+ # Prevent two reporters from printing
11
+ # https://github.com/kern/minitest-reporters/issues/230
12
+ # https://github.com/rails/rails/issues/30491
13
+ Minitest.load_plugins
14
+ Minitest.extensions.delete('rails')
15
+ Minitest.extensions.unshift('rails')
16
+
17
+ Minitest::Reporters.use! [Minitest::Reporters::ProgressReporter.new(color: true)]
18
+
19
+ class ActiveSupport::TestCase
20
+ def reset_db
21
+ ActiveRecord::Base.subclasses.each do |model|
22
+ model.delete_all
23
+ end
24
+ end
25
+ end
26
+
27
+ Dir.glob(File.expand_path("../support/models/*.rb", __FILE__)).each { |r| require r }
28
+ ActiveRecord::Base.establish_connection adapter: "sqlite3", database: ":memory:"
29
+ require_relative "support/schema.rb"
@@ -0,0 +1,237 @@
1
+ require "test_helper"
2
+
3
+ class Measured::Rails::ValidationTest < ActiveSupport::TestCase
4
+ setup do
5
+ reset_db
6
+ end
7
+
8
+ test "validation mock is valid" do
9
+ assert thing.valid?
10
+ end
11
+
12
+ test "validation measurable: validation leaves a model valid and deals with blank unit" do
13
+ assert ValidatedThing.new(length_presence: Measured::Length.new(4, :in)).valid?
14
+ end
15
+
16
+ test "validation fails when unit is nil" do
17
+ thing.length_unit = ''
18
+ refute thing.valid?
19
+ assert_equal({ length: "is not a valid unit" }, thing.errors.to_h)
20
+ end
21
+
22
+ test "validation fails on model with custom unit with nil value" do
23
+ custom_unit_thing.size_unit = ''
24
+ refute custom_unit_thing.valid?
25
+ assert_equal(
26
+ {
27
+ length: "is not a valid unit",
28
+ width: "is not a valid unit",
29
+ height: "is not a valid unit",
30
+ },
31
+ custom_unit_thing.errors.to_h
32
+ )
33
+ end
34
+
35
+ test "validation true works by default" do
36
+ thing.length_unit = "junk"
37
+ refute thing.valid?
38
+ assert_equal ["Length is not a valid unit"], thing.errors.full_messages
39
+ end
40
+
41
+ test "validation can override the message with a static string" do
42
+ thing.length_message_unit = "junk"
43
+ refute thing.valid?
44
+ assert_equal ["Length message has a custom failure message"], thing.errors.full_messages
45
+ end
46
+
47
+ test "validation can override the message with a block" do
48
+ thing.length_message_from_block_unit = "junk"
49
+ refute thing.valid?
50
+ assert_equal ["Length message from block junk is not a valid unit"], thing.errors.full_messages
51
+ end
52
+
53
+ test "validation may be any valid unit" do
54
+ length_units.each do |unit|
55
+ thing.length_unit = unit
56
+ assert thing.valid?
57
+ thing.length_unit = unit.to_s
58
+ assert thing.valid?
59
+ thing.length = Measured::Length.new(123, unit)
60
+ assert thing.valid?
61
+ end
62
+ end
63
+
64
+ test "validation accepts a list of units in any format as an option and only allows them to be valid" do
65
+ thing.length_units_unit = :m
66
+ assert thing.valid?
67
+ thing.length_units_unit = :cm
68
+ assert thing.valid?
69
+ thing.length_units_unit = "cm"
70
+ assert thing.valid?
71
+ thing.length_units_unit = "meter"
72
+ assert thing.valid?
73
+ thing.length_units = Measured::Length.new(3, :cm)
74
+ assert thing.valid?
75
+ thing.length_units_unit = :mm
76
+ refute thing.valid?
77
+ thing.length_units = Measured::Length.new(3, :ft)
78
+ refute thing.valid?
79
+ end
80
+
81
+ test "validation lets the unit be singular" do
82
+ thing.length_units_singular_unit = :ft
83
+ assert thing.valid?
84
+ thing.length_units_singular_unit = "feet"
85
+ assert thing.valid?
86
+ thing.length_units_singular_unit = :mm
87
+ refute thing.valid?
88
+ thing.length_units_singular_unit = "meter"
89
+ refute thing.valid?
90
+ end
91
+
92
+ test "validation for unit reasons uses the default message" do
93
+ thing.length_units_unit = :mm
94
+ refute thing.valid?
95
+ assert_equal ["Length units is not a valid unit"], thing.errors.full_messages
96
+ end
97
+
98
+ test "validation for unit reasons also uses the custom message" do
99
+ thing.length_units_singular_unit = :mm
100
+ refute thing.valid?
101
+ assert_equal ["Length units singular custom message too"], thing.errors.full_messages
102
+ end
103
+
104
+ test "validation for unit reasons adds one message if unit is not supported by default and is not custom supported" do
105
+ thing.length_units_singular_unit = :t
106
+ refute thing.valid?
107
+
108
+ assert_equal ["Length units singular custom message too"], thing.errors.full_messages
109
+ end
110
+
111
+ test "validation presence works on measured columns" do
112
+ thing.length_presence = nil
113
+ refute thing.valid?
114
+ assert_equal ["Length presence can't be blank"], thing.errors.full_messages
115
+ thing.length_presence_unit = "m"
116
+ refute thing.valid?
117
+ thing.length_presence_value = "3"
118
+ assert thing.valid?
119
+ end
120
+
121
+ test "validation fails if only only the value is set" do
122
+ thing.length_unit = nil
123
+ refute thing.valid?
124
+ end
125
+
126
+ test "validation checks that numericality comparisons are against a Measurable subclass" do
127
+ thing.length_invalid_comparison = Measured::Length.new(30, :in)
128
+ assert_raises ArgumentError, ":not_a_measured_subclass must be a Measurable object" do
129
+ thing.valid?
130
+ end
131
+ end
132
+
133
+ test "validation for numericality uses a default invalid message" do
134
+ thing.length_numericality_inclusive = Measured::Length.new(30, :in)
135
+ refute thing.valid?
136
+ assert_equal ["Length numericality inclusive 30 in must be <= 20 in"], thing.errors.full_messages
137
+
138
+ thing.length_numericality_inclusive = Measured::Length.new(1, :mm)
139
+ refute thing.valid?
140
+ assert_equal ["Length numericality inclusive 1 mm must be >= 10 in"], thing.errors.full_messages
141
+ end
142
+
143
+ test "validation for numericality uses the override message" do
144
+ thing.length_numericality_exclusive = Measured::Length.new(2, :m)
145
+ refute thing.valid?
146
+ assert_equal ["Length numericality exclusive is super not ok"], thing.errors.full_messages
147
+
148
+ thing.length_numericality_exclusive = Measured::Length.new(6000, :mm)
149
+ refute thing.valid?
150
+ assert_equal ["Length numericality exclusive is super not ok"], thing.errors.full_messages
151
+ end
152
+
153
+ test "validation for numericality checks :greater_than and :less_than and can use symbols as method names to look up values" do
154
+ thing.length_numericality_exclusive = Measured::Length.new(4, :m)
155
+ assert thing.valid?
156
+
157
+ thing.length_numericality_exclusive = Measured::Length.new(1, :m)
158
+ refute thing.valid?
159
+ end
160
+
161
+ test "validation for numericality checks :greater_than_or_equal_to and :less_than_or_equal_to" do
162
+ thing.length_numericality_inclusive = Measured::Length.new(10, :in)
163
+ assert thing.valid?
164
+
165
+ thing.length_numericality_exclusive = Measured::Length.new(3, :m)
166
+ refute thing.valid?
167
+ end
168
+
169
+ test "validation for numericality checks :equal_to and can use procs to look up values" do
170
+ thing.length_numericality_equality = Measured::Length.new(100, :cm)
171
+ assert thing.valid?
172
+
173
+ thing.length_numericality_equality = Measured::Length.new(1, :m)
174
+ assert thing.valid?
175
+
176
+ thing.length_numericality_equality = Measured::Length.new("99.9", :cm)
177
+ refute thing.valid?
178
+
179
+ thing.length_numericality_equality = Measured::Length.new(101, :cm)
180
+ refute thing.valid?
181
+ end
182
+
183
+ test "validation for numericality handles a nil unit but a valid value" do
184
+ thing.length_numericality_exclusive_unit = nil
185
+ thing.length_numericality_exclusive_value = 1
186
+ refute thing.valid?
187
+ end
188
+
189
+ test "allow a nil value but a valid unit" do
190
+ thing.length_numericality_exclusive_unit = :cm
191
+ thing.length_numericality_exclusive_value = nil
192
+ assert thing.valid?
193
+ end
194
+
195
+ test "validations work as expected given a measured field with custom validators" do
196
+ assert custom_unit_thing.valid?
197
+
198
+ assert custom_unit_thing.size_unit = 'invalid'
199
+
200
+ refute custom_unit_thing.valid?
201
+
202
+ assert_equal(custom_unit_thing.errors[:length], ["is not a valid unit"])
203
+ assert_equal(custom_unit_thing.errors[:height], ["is not a valid unit"])
204
+ assert_equal(custom_unit_thing.errors[:width], ["is not a valid unit"])
205
+ end
206
+
207
+ private
208
+
209
+ def thing
210
+ @thing ||= ValidatedThing.new(
211
+ length: Measured::Length.new(1, :m),
212
+ length_true: Measured::Length.new(2, :cm),
213
+ length_message: Measured::Length.new(3, :mm),
214
+ length_message_from_block: Measured::Length.new(7, :mm),
215
+ length_units: Measured::Length.new(4, :m),
216
+ length_units_singular: Measured::Length.new(5, :ft),
217
+ length_presence: Measured::Length.new(6, :m),
218
+ length_numericality_inclusive: Measured::Length.new(15, :in),
219
+ length_numericality_exclusive: Measured::Length.new(4, :m),
220
+ length_numericality_equality: Measured::Length.new(100, :cm),
221
+ )
222
+ end
223
+
224
+ def custom_unit_thing
225
+ @custom_unit_thing ||= ThingWithCustomUnitAccessor.new(
226
+ length: Measured::Length.new(1, :m),
227
+ width: Measured::Length.new(2, :m),
228
+ height: Measured::Length.new(3, :m),
229
+ total_weight: Measured::Weight.new(10, :g),
230
+ extra_weight: Measured::Weight.new(12, :g),
231
+ )
232
+ end
233
+
234
+ def length_units
235
+ @length_units ||= [:m, :meter, :cm, :mm, :millimeter, :in, :ft, :feet, :yd]
236
+ end
237
+ end
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: 2.4.0
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin McPhillips
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-24 00:00:00.000000000 Z
11
+ date: 2019-05-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: measured
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 2.4.0
19
+ version: 2.5.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: 2.4.0
26
+ version: 2.5.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: railties
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '4.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activerecord
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '4.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '4.2'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rake
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -140,7 +154,9 @@ description: Rails adapter for assigning and managing measurements with their un
140
154
  provided by the measured gem.
141
155
  email:
142
156
  - gems@shopify.com
143
- executables: []
157
+ executables:
158
+ - console
159
+ - setup
144
160
  extensions: []
145
161
  extra_rdoc_files: []
146
162
  files:
@@ -153,19 +169,28 @@ files:
153
169
  - bin/console
154
170
  - bin/setup
155
171
  - dev.yml
156
- - gemfiles/rails-4.2.gemfile
157
172
  - gemfiles/rails-5.0.gemfile
173
+ - gemfiles/rails-5.1.gemfile
174
+ - gemfiles/rails-6.0.gemfile
158
175
  - gemfiles/rails-master.gemfile
159
176
  - lib/measured-rails.rb
160
177
  - lib/measured/rails/active_record.rb
161
178
  - lib/measured/rails/base.rb
162
179
  - lib/measured/rails/railtie.rb
163
180
  - lib/measured/rails/units/length.rb
181
+ - lib/measured/rails/units/volume.rb
164
182
  - lib/measured/rails/units/weight.rb
165
183
  - lib/measured/rails/validations.rb
166
184
  - lib/measured/rails/version.rb
167
185
  - measured-rails.gemspec
168
186
  - shipit.rubygems.yml
187
+ - test/active_record_test.rb
188
+ - test/support/models/thing.rb
189
+ - test/support/models/thing_with_custom_unit_accessor.rb
190
+ - test/support/models/validated_thing.rb
191
+ - test/support/schema.rb
192
+ - test/test_helper.rb
193
+ - test/validation_test.rb
169
194
  homepage: https://github.com/Shopify/measured-rails
170
195
  licenses:
171
196
  - MIT
@@ -186,8 +211,15 @@ required_rubygems_version: !ruby/object:Gem::Requirement
186
211
  version: '0'
187
212
  requirements: []
188
213
  rubyforge_project:
189
- rubygems_version: 2.6.14
214
+ rubygems_version: 2.7.6
190
215
  signing_key:
191
216
  specification_version: 4
192
217
  summary: Rails adaptor for measured
193
- test_files: []
218
+ test_files:
219
+ - test/active_record_test.rb
220
+ - test/support/models/thing.rb
221
+ - test/support/models/thing_with_custom_unit_accessor.rb
222
+ - test/support/models/validated_thing.rb
223
+ - test/support/schema.rb
224
+ - test/test_helper.rb
225
+ - test/validation_test.rb