measured 2.8.2 → 3.0.0
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/.github/workflows/ci.yml +11 -5
- data/.github/workflows/cla.yml +23 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +8 -0
- data/Gemfile +2 -0
- data/README.md +114 -4
- data/dev.yml +1 -2
- data/gemfiles/{activesupport-6.0.gemfile → rails-6.0.gemfile} +1 -0
- data/gemfiles/{activesupport-6.1.gemfile → rails-6.1.gemfile} +1 -0
- data/gemfiles/rails-7.0.gemfile +6 -0
- data/gemfiles/rails-edge.gemfile +6 -0
- data/lib/measured/measurable.rb +3 -1
- data/lib/measured/rails/active_record.rb +130 -0
- data/lib/measured/rails/validations.rb +68 -0
- data/lib/measured/railtie.rb +12 -0
- data/lib/measured/units/weight.rb +1 -1
- data/lib/measured/version.rb +1 -1
- data/lib/measured.rb +2 -0
- data/lib/tapioca/dsl/compilers/measured_rails.rb +110 -0
- data/measured.gemspec +5 -0
- data/test/internal/app/models/thing.rb +14 -0
- data/test/internal/app/models/thing_with_custom_unit_accessor.rb +18 -0
- data/test/internal/app/models/thing_with_custom_value_accessor.rb +19 -0
- data/test/internal/app/models/validated_thing.rb +45 -0
- data/test/internal/config/database.yml +3 -0
- data/test/internal/config.ru +9 -0
- data/test/internal/db/.gitignore +1 -0
- data/test/internal/db/schema.rb +99 -0
- data/test/internal/log/.gitignore +1 -0
- data/test/measurable_test.rb +4 -0
- data/test/rails/active_record_test.rb +433 -0
- data/test/rails/validation_test.rb +252 -0
- data/test/tapioca/dsl/compilers/measured_rails_test.rb +220 -0
- data/test/test_helper.rb +15 -0
- data/test/units/weight_test.rb +3 -1
- metadata +80 -7
- data/gemfiles/activesupport-5.2.gemfile +0 -5
@@ -0,0 +1,252 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "test_helper"
|
3
|
+
|
4
|
+
class Measured::Rails::ValidationTest < ActiveSupport::TestCase
|
5
|
+
setup do
|
6
|
+
reset_db
|
7
|
+
end
|
8
|
+
|
9
|
+
test "validation mock is valid" do
|
10
|
+
assert thing.valid?
|
11
|
+
end
|
12
|
+
|
13
|
+
test "validation measurable: validation leaves a model valid and deals with blank unit" do
|
14
|
+
assert ValidatedThing.new(length_presence: Measured::Length.new(4, :in)).valid?
|
15
|
+
end
|
16
|
+
|
17
|
+
test "validation fails when unit is nil" do
|
18
|
+
thing.length_unit = ''
|
19
|
+
refute thing.valid?
|
20
|
+
assert_equal({ length: ["is not a valid unit"] }, thing.errors.to_hash)
|
21
|
+
end
|
22
|
+
|
23
|
+
test "validation fails on model with custom unit with nil value" do
|
24
|
+
custom_unit_thing.size_unit = ''
|
25
|
+
refute custom_unit_thing.valid?
|
26
|
+
assert_equal(
|
27
|
+
{
|
28
|
+
length: ["is not a valid unit"],
|
29
|
+
width: ["is not a valid unit"],
|
30
|
+
height: ["is not a valid unit"],
|
31
|
+
},
|
32
|
+
custom_unit_thing.errors.to_hash
|
33
|
+
)
|
34
|
+
end
|
35
|
+
|
36
|
+
test "validation true works by default" do
|
37
|
+
thing.length_unit = "junk"
|
38
|
+
refute thing.valid?
|
39
|
+
assert_equal ["Length is not a valid unit"], thing.errors.full_messages
|
40
|
+
end
|
41
|
+
|
42
|
+
test "validation can override the message with a static string" do
|
43
|
+
thing.length_message_unit = "junk"
|
44
|
+
refute thing.valid?
|
45
|
+
assert_equal ["Length message has a custom failure message"], thing.errors.full_messages
|
46
|
+
end
|
47
|
+
|
48
|
+
test "validation can override the message with a block" do
|
49
|
+
thing.length_message_from_block_unit = "junk"
|
50
|
+
refute thing.valid?
|
51
|
+
assert_equal ["Length message from block junk is not a valid unit"], thing.errors.full_messages
|
52
|
+
end
|
53
|
+
|
54
|
+
test "validation may be any valid unit" do
|
55
|
+
length_units.each do |unit|
|
56
|
+
thing.length_unit = unit
|
57
|
+
assert thing.valid?
|
58
|
+
thing.length_unit = unit.to_s
|
59
|
+
assert thing.valid?
|
60
|
+
thing.length = Measured::Length.new(123, unit)
|
61
|
+
assert thing.valid?
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
test "validation accepts a list of units in any format as an option and only allows them to be valid" do
|
66
|
+
thing.length_units_unit = :m
|
67
|
+
assert thing.valid?
|
68
|
+
thing.length_units_unit = :cm
|
69
|
+
assert thing.valid?
|
70
|
+
thing.length_units_unit = "cm"
|
71
|
+
assert thing.valid?
|
72
|
+
thing.length_units_unit = "meter"
|
73
|
+
assert thing.valid?
|
74
|
+
thing.length_units = Measured::Length.new(3, :cm)
|
75
|
+
assert thing.valid?
|
76
|
+
thing.length_units_unit = :mm
|
77
|
+
refute thing.valid?
|
78
|
+
thing.length_units = Measured::Length.new(3, :ft)
|
79
|
+
refute thing.valid?
|
80
|
+
end
|
81
|
+
|
82
|
+
test "validation lets the unit be singular" do
|
83
|
+
thing.length_units_singular_unit = :ft
|
84
|
+
assert thing.valid?
|
85
|
+
thing.length_units_singular_unit = "feet"
|
86
|
+
assert thing.valid?
|
87
|
+
thing.length_units_singular_unit = :mm
|
88
|
+
refute thing.valid?
|
89
|
+
thing.length_units_singular_unit = "meter"
|
90
|
+
refute thing.valid?
|
91
|
+
end
|
92
|
+
|
93
|
+
test "validation for unit reasons uses the default message" do
|
94
|
+
thing.length_units_unit = :mm
|
95
|
+
refute thing.valid?
|
96
|
+
assert_equal ["Length units is not a valid unit"], thing.errors.full_messages
|
97
|
+
end
|
98
|
+
|
99
|
+
test "validation for unit reasons also uses the custom message" do
|
100
|
+
thing.length_units_singular_unit = :mm
|
101
|
+
refute thing.valid?
|
102
|
+
assert_equal ["Length units singular custom message too"], thing.errors.full_messages
|
103
|
+
end
|
104
|
+
|
105
|
+
test "validation for unit reasons adds one message if unit is not supported by default and is not custom supported" do
|
106
|
+
thing.length_units_singular_unit = :t
|
107
|
+
refute thing.valid?
|
108
|
+
|
109
|
+
assert_equal ["Length units singular custom message too"], thing.errors.full_messages
|
110
|
+
end
|
111
|
+
|
112
|
+
test "validation presence works on measured columns" do
|
113
|
+
thing.length_presence = nil
|
114
|
+
refute thing.valid?
|
115
|
+
assert_equal ["Length presence can't be blank"], thing.errors.full_messages
|
116
|
+
thing.length_presence_unit = "m"
|
117
|
+
refute thing.valid?
|
118
|
+
thing.length_presence_value = "3"
|
119
|
+
assert thing.valid?
|
120
|
+
end
|
121
|
+
|
122
|
+
test "validation fails if only only the value is set" do
|
123
|
+
thing.length_unit = nil
|
124
|
+
refute thing.valid?
|
125
|
+
end
|
126
|
+
|
127
|
+
test "validation checks that numericality comparisons are against a Measurable subclass" do
|
128
|
+
thing.length_invalid_comparison = Measured::Length.new(30, :in)
|
129
|
+
assert_raises ArgumentError, ":not_a_measured_subclass must be a Measurable object" do
|
130
|
+
thing.valid?
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
test "validation for numericality uses a default invalid message" do
|
135
|
+
thing.length_numericality_inclusive = Measured::Length.new(30, :in)
|
136
|
+
refute thing.valid?
|
137
|
+
assert_equal ["Length numericality inclusive 30 in must be <= 20 in"], thing.errors.full_messages
|
138
|
+
|
139
|
+
thing.length_numericality_inclusive = Measured::Length.new(1, :mm)
|
140
|
+
refute thing.valid?
|
141
|
+
assert_equal ["Length numericality inclusive 1 mm must be >= 10 in"], thing.errors.full_messages
|
142
|
+
end
|
143
|
+
|
144
|
+
test "validation for numericality uses the override message" do
|
145
|
+
thing.length_numericality_exclusive = Measured::Length.new(2, :m)
|
146
|
+
refute thing.valid?
|
147
|
+
assert_equal ["Length numericality exclusive is super not ok"], thing.errors.full_messages
|
148
|
+
|
149
|
+
thing.length_numericality_exclusive = Measured::Length.new(6000, :mm)
|
150
|
+
refute thing.valid?
|
151
|
+
assert_equal ["Length numericality exclusive is super not ok"], thing.errors.full_messages
|
152
|
+
end
|
153
|
+
|
154
|
+
test "validation for numericality checks :greater_than and :less_than and can use symbols as method names to look up values" do
|
155
|
+
thing.length_numericality_exclusive = Measured::Length.new(4, :m)
|
156
|
+
assert thing.valid?
|
157
|
+
|
158
|
+
thing.length_numericality_exclusive = Measured::Length.new(1, :m)
|
159
|
+
refute thing.valid?
|
160
|
+
end
|
161
|
+
|
162
|
+
test "validation for numericality checks :greater_than_or_equal_to and :less_than_or_equal_to" do
|
163
|
+
thing.length_numericality_inclusive = Measured::Length.new(10, :in)
|
164
|
+
assert thing.valid?
|
165
|
+
|
166
|
+
thing.length_numericality_exclusive = Measured::Length.new(3, :m)
|
167
|
+
refute thing.valid?
|
168
|
+
end
|
169
|
+
|
170
|
+
test "validation for numericality checks :equal_to and can use procs to look up values" do
|
171
|
+
thing.length_numericality_equality = Measured::Length.new(100, :cm)
|
172
|
+
assert thing.valid?
|
173
|
+
|
174
|
+
thing.length_numericality_equality = Measured::Length.new(1, :m)
|
175
|
+
assert thing.valid?
|
176
|
+
|
177
|
+
thing.length_numericality_equality = Measured::Length.new("99.9", :cm)
|
178
|
+
refute thing.valid?
|
179
|
+
|
180
|
+
thing.length_numericality_equality = Measured::Length.new(101, :cm)
|
181
|
+
refute thing.valid?
|
182
|
+
end
|
183
|
+
|
184
|
+
test "validation for numericality handles a nil unit but a valid value" do
|
185
|
+
thing.length_numericality_exclusive_unit = nil
|
186
|
+
thing.length_numericality_exclusive_value = 1
|
187
|
+
refute thing.valid?
|
188
|
+
end
|
189
|
+
|
190
|
+
test "allow a nil value but a valid unit" do
|
191
|
+
thing.length_numericality_exclusive_unit = :cm
|
192
|
+
thing.length_numericality_exclusive_value = nil
|
193
|
+
assert thing.valid?
|
194
|
+
end
|
195
|
+
|
196
|
+
test "validations work as expected given a measured field with custom validators" do
|
197
|
+
assert custom_unit_thing.valid?
|
198
|
+
|
199
|
+
assert custom_unit_thing.size_unit = 'invalid'
|
200
|
+
|
201
|
+
refute custom_unit_thing.valid?
|
202
|
+
|
203
|
+
assert_equal(custom_unit_thing.errors[:length], ["is not a valid unit"])
|
204
|
+
assert_equal(custom_unit_thing.errors[:height], ["is not a valid unit"])
|
205
|
+
assert_equal(custom_unit_thing.errors[:width], ["is not a valid unit"])
|
206
|
+
end
|
207
|
+
|
208
|
+
test "validations work as expected on measured field with custom value accessor" do
|
209
|
+
assert custom_value_thing.valid?
|
210
|
+
end
|
211
|
+
|
212
|
+
private
|
213
|
+
|
214
|
+
def thing
|
215
|
+
@thing ||= ValidatedThing.new(
|
216
|
+
length: Measured::Length.new(1, :m),
|
217
|
+
length_true: Measured::Length.new(2, :cm),
|
218
|
+
length_message: Measured::Length.new(3, :mm),
|
219
|
+
length_message_from_block: Measured::Length.new(7, :mm),
|
220
|
+
length_units: Measured::Length.new(4, :m),
|
221
|
+
length_units_singular: Measured::Length.new(5, :ft),
|
222
|
+
length_presence: Measured::Length.new(6, :m),
|
223
|
+
length_numericality_inclusive: Measured::Length.new(15, :in),
|
224
|
+
length_numericality_exclusive: Measured::Length.new(4, :m),
|
225
|
+
length_numericality_equality: Measured::Length.new(100, :cm),
|
226
|
+
)
|
227
|
+
end
|
228
|
+
|
229
|
+
def custom_unit_thing
|
230
|
+
@custom_unit_thing ||= ThingWithCustomUnitAccessor.new(
|
231
|
+
length: Measured::Length.new(1, :m),
|
232
|
+
width: Measured::Length.new(2, :m),
|
233
|
+
height: Measured::Length.new(3, :m),
|
234
|
+
total_weight: Measured::Weight.new(10, :g),
|
235
|
+
extra_weight: Measured::Weight.new(12, :g),
|
236
|
+
)
|
237
|
+
end
|
238
|
+
|
239
|
+
def custom_value_thing
|
240
|
+
@custom_value_thing = ThingWithCustomValueAccessor.new(
|
241
|
+
length: Measured::Length.new(1, :m),
|
242
|
+
width: Measured::Length.new(2, :m),
|
243
|
+
height: Measured::Length.new(3, :m),
|
244
|
+
total_weight: Measured::Weight.new(10, :g),
|
245
|
+
extra_weight: Measured::Weight.new(12, :g),
|
246
|
+
)
|
247
|
+
end
|
248
|
+
|
249
|
+
def length_units
|
250
|
+
@length_units ||= [:m, :meter, :cm, :mm, :millimeter, :in, :ft, :feet, :yd]
|
251
|
+
end
|
252
|
+
end
|
@@ -0,0 +1,220 @@
|
|
1
|
+
# typed: true
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "test_helper"
|
5
|
+
require "tapioca/internal"
|
6
|
+
require "tapioca/helpers/test/dsl_compiler"
|
7
|
+
require "tapioca/dsl/compilers/measured_rails"
|
8
|
+
|
9
|
+
module Tapioca
|
10
|
+
module Dsl
|
11
|
+
module Compilers
|
12
|
+
class MeasuredRailsTest < ActiveSupport::TestCase
|
13
|
+
include Tapioca::Helpers::Test::DslCompiler
|
14
|
+
|
15
|
+
setup do
|
16
|
+
use_dsl_compiler(Tapioca::Dsl::Compilers::MeasuredRails)
|
17
|
+
end
|
18
|
+
|
19
|
+
test "#initialize gathers only ActiveRecord subclasses" do
|
20
|
+
add_ruby_file("content.rb", <<~RUBY)
|
21
|
+
class Post < ActiveRecord::Base
|
22
|
+
end
|
23
|
+
class Current
|
24
|
+
end
|
25
|
+
RUBY
|
26
|
+
|
27
|
+
assert_includes(gathered_constants, "Post")
|
28
|
+
refute_includes(gathered_constants, "Current")
|
29
|
+
end
|
30
|
+
|
31
|
+
test "generates empty RBI file if there are no measured fields" do
|
32
|
+
add_ruby_file("package.rb", <<~RUBY)
|
33
|
+
class Package < ActiveRecord::Base
|
34
|
+
end
|
35
|
+
RUBY
|
36
|
+
|
37
|
+
expected = <<~RBI
|
38
|
+
# typed: strong
|
39
|
+
RBI
|
40
|
+
|
41
|
+
assert_equal(expected, rbi_for(:Package))
|
42
|
+
end
|
43
|
+
|
44
|
+
test "generates RBI file for measured method" do
|
45
|
+
add_ruby_file("schema.rb", <<~RUBY)
|
46
|
+
ActiveRecord::Migration.suppress_messages do
|
47
|
+
ActiveRecord::Schema.define do
|
48
|
+
create_table :packages, force: :cascade do |t|
|
49
|
+
t.decimal :minimum_weight_value, precision: 10, scale: 2
|
50
|
+
t.string :minimum_weight_unit, limit: 12
|
51
|
+
t.decimal :total_length_value, precision: 10, scale: 2, default: 0
|
52
|
+
t.string :total_length_unit, limit: 12, default: "cm"
|
53
|
+
t.decimal :total_volume_value, precision: 10, scale: 2, default: 0
|
54
|
+
t.string :total_volume_unit, limit: 12, default: "l"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
RUBY
|
59
|
+
|
60
|
+
add_ruby_file("package.rb", <<~RUBY)
|
61
|
+
class Package < ActiveRecord::Base
|
62
|
+
measured Measured::Weight, :minimum_weight
|
63
|
+
measured Measured::Length, :total_length
|
64
|
+
measured Measured::Volume, :total_volume
|
65
|
+
end
|
66
|
+
RUBY
|
67
|
+
|
68
|
+
expected = <<~RBI
|
69
|
+
# typed: strong
|
70
|
+
|
71
|
+
class Package
|
72
|
+
include GeneratedMeasuredRailsMethods
|
73
|
+
|
74
|
+
module GeneratedMeasuredRailsMethods
|
75
|
+
sig { returns(T.nilable(::Measured::Weight)) }
|
76
|
+
def minimum_weight; end
|
77
|
+
|
78
|
+
sig { params(value: T.nilable(::Measured::Weight)).void }
|
79
|
+
def minimum_weight=(value); end
|
80
|
+
|
81
|
+
sig { returns(T.nilable(::Measured::Length)) }
|
82
|
+
def total_length; end
|
83
|
+
|
84
|
+
sig { params(value: T.nilable(::Measured::Length)).void }
|
85
|
+
def total_length=(value); end
|
86
|
+
|
87
|
+
sig { returns(T.nilable(::Measured::Volume)) }
|
88
|
+
def total_volume; end
|
89
|
+
|
90
|
+
sig { params(value: T.nilable(::Measured::Volume)).void }
|
91
|
+
def total_volume=(value); end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
RBI
|
95
|
+
|
96
|
+
assert_equal(expected, rbi_for(:Package))
|
97
|
+
end
|
98
|
+
|
99
|
+
test "generates RBI file for measured_weight method" do
|
100
|
+
add_ruby_file("schema.rb", <<~RUBY)
|
101
|
+
ActiveRecord::Migration.suppress_messages do
|
102
|
+
ActiveRecord::Schema.define do
|
103
|
+
create_table :packages, force: :cascade do |t|
|
104
|
+
t.decimal :minimum_weight_value, precision: 10, scale: 2
|
105
|
+
t.string :minimum_weight_unit, limit: 12
|
106
|
+
t.decimal :total_length_value, precision: 10, scale: 2, default: 0
|
107
|
+
t.string :total_length_unit, limit: 12, default: "cm"
|
108
|
+
t.decimal :total_volume_value, precision: 10, scale: 2, default: 0
|
109
|
+
t.string :total_volume_unit, limit: 12, default: "l"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
RUBY
|
114
|
+
|
115
|
+
add_ruby_file("package.rb", <<~RUBY)
|
116
|
+
class Package < ActiveRecord::Base
|
117
|
+
measured_weight :minimum_weight
|
118
|
+
end
|
119
|
+
RUBY
|
120
|
+
|
121
|
+
expected = <<~RBI
|
122
|
+
# typed: strong
|
123
|
+
|
124
|
+
class Package
|
125
|
+
include GeneratedMeasuredRailsMethods
|
126
|
+
|
127
|
+
module GeneratedMeasuredRailsMethods
|
128
|
+
sig { returns(T.nilable(::Measured::Weight)) }
|
129
|
+
def minimum_weight; end
|
130
|
+
|
131
|
+
sig { params(value: T.nilable(::Measured::Weight)).void }
|
132
|
+
def minimum_weight=(value); end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
RBI
|
136
|
+
|
137
|
+
assert_equal(expected, rbi_for(:Package))
|
138
|
+
end
|
139
|
+
|
140
|
+
test "generates RBI file for measured_length method" do
|
141
|
+
add_ruby_file("schema.rb", <<~RUBY)
|
142
|
+
ActiveRecord::Migration.suppress_messages do
|
143
|
+
ActiveRecord::Schema.define do
|
144
|
+
create_table :packages, force: :cascade do |t|
|
145
|
+
t.decimal :minimum_weight_value, precision: 10, scale: 2
|
146
|
+
t.string :minimum_weight_unit, limit: 12
|
147
|
+
t.decimal :total_length_value, precision: 10, scale: 2, default: 0
|
148
|
+
t.string :total_length_unit, limit: 12, default: "cm"
|
149
|
+
t.decimal :total_volume_value, precision: 10, scale: 2, default: 0
|
150
|
+
t.string :total_volume_unit, limit: 12, default: "l"
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
RUBY
|
155
|
+
|
156
|
+
add_ruby_file("package.rb", <<~RUBY)
|
157
|
+
class Package < ActiveRecord::Base
|
158
|
+
measured_length :total_length
|
159
|
+
end
|
160
|
+
RUBY
|
161
|
+
|
162
|
+
expected = <<~RBI
|
163
|
+
# typed: strong
|
164
|
+
|
165
|
+
class Package
|
166
|
+
include GeneratedMeasuredRailsMethods
|
167
|
+
|
168
|
+
module GeneratedMeasuredRailsMethods
|
169
|
+
sig { returns(T.nilable(::Measured::Length)) }
|
170
|
+
def total_length; end
|
171
|
+
|
172
|
+
sig { params(value: T.nilable(::Measured::Length)).void }
|
173
|
+
def total_length=(value); end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
RBI
|
177
|
+
|
178
|
+
assert_equal(expected, rbi_for(:Package))
|
179
|
+
end
|
180
|
+
|
181
|
+
test "generates RBI file for measured_volume method" do
|
182
|
+
add_ruby_file("schema.rb", <<~RUBY)
|
183
|
+
ActiveRecord::Migration.suppress_messages do
|
184
|
+
ActiveRecord::Schema.define do
|
185
|
+
create_table :packages, force: :cascade do |t|
|
186
|
+
t.decimal :total_volume_value, precision: 10, scale: 2, default: 0
|
187
|
+
t.string :total_volume_unit, limit: 12, default: "l"
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
RUBY
|
192
|
+
|
193
|
+
add_ruby_file("package.rb", <<~RUBY)
|
194
|
+
class Package < ActiveRecord::Base
|
195
|
+
measured_volume :total_volume
|
196
|
+
end
|
197
|
+
RUBY
|
198
|
+
|
199
|
+
expected = <<~RBI
|
200
|
+
# typed: strong
|
201
|
+
|
202
|
+
class Package
|
203
|
+
include GeneratedMeasuredRailsMethods
|
204
|
+
|
205
|
+
module GeneratedMeasuredRailsMethods
|
206
|
+
sig { returns(T.nilable(::Measured::Volume)) }
|
207
|
+
def total_volume; end
|
208
|
+
|
209
|
+
sig { params(value: T.nilable(::Measured::Volume)).void }
|
210
|
+
def total_volume=(value); end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
RBI
|
214
|
+
|
215
|
+
assert_equal(expected, rbi_for(:Package))
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require "pry" unless ENV["CI"]
|
4
|
+
require "combustion"
|
5
|
+
Combustion.path = "test/internal"
|
6
|
+
Combustion.initialize! :active_record, :active_model
|
3
7
|
require "measured"
|
4
8
|
require "minitest/reporters"
|
5
9
|
require "minitest/autorun"
|
@@ -7,6 +11,13 @@ require "mocha/minitest"
|
|
7
11
|
|
8
12
|
ActiveSupport.test_order = :random
|
9
13
|
|
14
|
+
# Prevent two reporters from printing
|
15
|
+
# https://github.com/kern/minitest-reporters/issues/230
|
16
|
+
# https://github.com/rails/rails/issues/30491
|
17
|
+
Minitest.load_plugins
|
18
|
+
Minitest.extensions.delete('rails')
|
19
|
+
Minitest.extensions.unshift('rails')
|
20
|
+
|
10
21
|
Minitest::Reporters.use! [Minitest::Reporters::ProgressReporter.new(color: true)]
|
11
22
|
|
12
23
|
require "support/subclasses"
|
@@ -44,4 +55,8 @@ class ActiveSupport::TestCase
|
|
44
55
|
error = assert_raise(exception) { yield }
|
45
56
|
assert_equal expected_message, error.message, "Exception #{exception} raised but messages are not equal"
|
46
57
|
end
|
58
|
+
|
59
|
+
def reset_db
|
60
|
+
Combustion::Database::LoadSchema.call
|
61
|
+
end
|
47
62
|
end
|
data/test/units/weight_test.rb
CHANGED
@@ -15,6 +15,8 @@ class Measured::WeightTest < ActiveSupport::TestCase
|
|
15
15
|
g
|
16
16
|
gram
|
17
17
|
grams
|
18
|
+
gm
|
19
|
+
gms
|
18
20
|
imperial_ton
|
19
21
|
imperial_tons
|
20
22
|
lb
|
@@ -39,7 +41,7 @@ class Measured::WeightTest < ActiveSupport::TestCase
|
|
39
41
|
weight_tons
|
40
42
|
)
|
41
43
|
expected_units += Measured::UnitSystemBuilder::SI_PREFIXES.flat_map do |short, long, _|
|
42
|
-
["#{short}g", "#{long}gram", "#{long}grams"]
|
44
|
+
["#{short}g", "#{long}gram", "#{long}grams", "#{long}gm", "#{long}gms"]
|
43
45
|
end
|
44
46
|
|
45
47
|
assert_equal expected_units.sort, Measured::Weight.unit_names_with_aliases
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: measured
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kevin McPhillips
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2024-04-19 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -96,6 +96,48 @@ dependencies:
|
|
96
96
|
- - ">="
|
97
97
|
- !ruby/object:Gem::Version
|
98
98
|
version: '0'
|
99
|
+
- !ruby/object:Gem::Dependency
|
100
|
+
name: combustion
|
101
|
+
requirement: !ruby/object:Gem::Requirement
|
102
|
+
requirements:
|
103
|
+
- - ">="
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
version: '0'
|
106
|
+
type: :development
|
107
|
+
prerelease: false
|
108
|
+
version_requirements: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: sqlite3
|
115
|
+
requirement: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - "~>"
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '1.4'
|
120
|
+
type: :development
|
121
|
+
prerelease: false
|
122
|
+
version_requirements: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - "~>"
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '1.4'
|
127
|
+
- !ruby/object:Gem::Dependency
|
128
|
+
name: tapioca
|
129
|
+
requirement: !ruby/object:Gem::Requirement
|
130
|
+
requirements:
|
131
|
+
- - ">="
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '0'
|
99
141
|
description: Wrapper objects which encapsulate measurements and their associated units
|
100
142
|
in Ruby.
|
101
143
|
email:
|
@@ -105,7 +147,9 @@ extensions: []
|
|
105
147
|
extra_rdoc_files: []
|
106
148
|
files:
|
107
149
|
- ".github/workflows/ci.yml"
|
150
|
+
- ".github/workflows/cla.yml"
|
108
151
|
- ".gitignore"
|
152
|
+
- ".ruby-version"
|
109
153
|
- CHANGELOG.md
|
110
154
|
- Gemfile
|
111
155
|
- LICENSE
|
@@ -116,9 +160,10 @@ files:
|
|
116
160
|
- cache/volume.json
|
117
161
|
- cache/weight.json
|
118
162
|
- dev.yml
|
119
|
-
- gemfiles/
|
120
|
-
- gemfiles/
|
121
|
-
- gemfiles/
|
163
|
+
- gemfiles/rails-6.0.gemfile
|
164
|
+
- gemfiles/rails-6.1.gemfile
|
165
|
+
- gemfiles/rails-7.0.gemfile
|
166
|
+
- gemfiles/rails-edge.gemfile
|
122
167
|
- lib/measured.rb
|
123
168
|
- lib/measured/arithmetic.rb
|
124
169
|
- lib/measured/base.rb
|
@@ -130,6 +175,9 @@ files:
|
|
130
175
|
- lib/measured/measurable.rb
|
131
176
|
- lib/measured/missing_conversion_path.rb
|
132
177
|
- lib/measured/parser.rb
|
178
|
+
- lib/measured/rails/active_record.rb
|
179
|
+
- lib/measured/rails/validations.rb
|
180
|
+
- lib/measured/railtie.rb
|
133
181
|
- lib/measured/unit.rb
|
134
182
|
- lib/measured/unit_already_added.rb
|
135
183
|
- lib/measured/unit_error.rb
|
@@ -139,6 +187,7 @@ files:
|
|
139
187
|
- lib/measured/units/volume.rb
|
140
188
|
- lib/measured/units/weight.rb
|
141
189
|
- lib/measured/version.rb
|
190
|
+
- lib/tapioca/dsl/compilers/measured_rails.rb
|
142
191
|
- measured.gemspec
|
143
192
|
- shipit.rubygems.yml
|
144
193
|
- test/arithmetic_test.rb
|
@@ -147,11 +196,23 @@ files:
|
|
147
196
|
- test/cache/null_test.rb
|
148
197
|
- test/cache_consistency_test.rb
|
149
198
|
- test/conversion_table_builder_test.rb
|
199
|
+
- test/internal/app/models/thing.rb
|
200
|
+
- test/internal/app/models/thing_with_custom_unit_accessor.rb
|
201
|
+
- test/internal/app/models/thing_with_custom_value_accessor.rb
|
202
|
+
- test/internal/app/models/validated_thing.rb
|
203
|
+
- test/internal/config.ru
|
204
|
+
- test/internal/config/database.yml
|
205
|
+
- test/internal/db/.gitignore
|
206
|
+
- test/internal/db/schema.rb
|
207
|
+
- test/internal/log/.gitignore
|
150
208
|
- test/measurable_test.rb
|
151
209
|
- test/parser_test.rb
|
210
|
+
- test/rails/active_record_test.rb
|
211
|
+
- test/rails/validation_test.rb
|
152
212
|
- test/support/always_true_cache.rb
|
153
213
|
- test/support/fake_system.rb
|
154
214
|
- test/support/subclasses.rb
|
215
|
+
- test/tapioca/dsl/compilers/measured_rails_test.rb
|
155
216
|
- test/test_helper.rb
|
156
217
|
- test/unit_error_test.rb
|
157
218
|
- test/unit_system_builder_test.rb
|
@@ -173,14 +234,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
173
234
|
requirements:
|
174
235
|
- - ">="
|
175
236
|
- !ruby/object:Gem::Version
|
176
|
-
version:
|
237
|
+
version: 3.0.0
|
177
238
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
178
239
|
requirements:
|
179
240
|
- - ">="
|
180
241
|
- !ruby/object:Gem::Version
|
181
242
|
version: '0'
|
182
243
|
requirements: []
|
183
|
-
rubygems_version: 3.
|
244
|
+
rubygems_version: 3.5.9
|
184
245
|
signing_key:
|
185
246
|
specification_version: 4
|
186
247
|
summary: Encapsulate measurements with their units in Ruby
|
@@ -191,11 +252,23 @@ test_files:
|
|
191
252
|
- test/cache/null_test.rb
|
192
253
|
- test/cache_consistency_test.rb
|
193
254
|
- test/conversion_table_builder_test.rb
|
255
|
+
- test/internal/app/models/thing.rb
|
256
|
+
- test/internal/app/models/thing_with_custom_unit_accessor.rb
|
257
|
+
- test/internal/app/models/thing_with_custom_value_accessor.rb
|
258
|
+
- test/internal/app/models/validated_thing.rb
|
259
|
+
- test/internal/config.ru
|
260
|
+
- test/internal/config/database.yml
|
261
|
+
- test/internal/db/.gitignore
|
262
|
+
- test/internal/db/schema.rb
|
263
|
+
- test/internal/log/.gitignore
|
194
264
|
- test/measurable_test.rb
|
195
265
|
- test/parser_test.rb
|
266
|
+
- test/rails/active_record_test.rb
|
267
|
+
- test/rails/validation_test.rb
|
196
268
|
- test/support/always_true_cache.rb
|
197
269
|
- test/support/fake_system.rb
|
198
270
|
- test/support/subclasses.rb
|
271
|
+
- test/tapioca/dsl/compilers/measured_rails_test.rb
|
199
272
|
- test/test_helper.rb
|
200
273
|
- test/unit_error_test.rb
|
201
274
|
- test/unit_system_builder_test.rb
|