Skip to content

Commit fefb7d2

Browse files
committed
Re-introduced ActiveModel for casting types
Because removing ActiveModel requires a lot more work than we initially thought, we restored the original functionality. When/if we remove ActiveRecord, it would probably be a breaking change
1 parent 37f0a56 commit fefb7d2

2 files changed

Lines changed: 25 additions & 17 deletions

File tree

json_path_attribute.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ Gem::Specification.new do |spec|
3030
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
3131
spec.require_paths = ["lib"]
3232

33+
spec.add_dependency "activemodel", "~> 7.2"
3334
spec.add_dependency "activesupport", "~> 7.2"
3435
spec.add_dependency "jsonpath", "~> 1.1"
3536
end

lib/json_path_attribute/type.rb

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,44 @@
11
# frozen_string_literal: true
22

3+
require "active_model"
4+
35
module JsonPathAttribute
46
# Provides a way to cast values to a specific type
57
# This class is intended to be used internally by JsonPathAttribute
68
class Type
79
class << self
810
def cast_attribute(type, value, array: false)
911
return value if type == :source
12+
return cast_object_attribute(type, value, array: array) if type.is_a?(Class)
1013

11-
if value.nil?
12-
return [] if array
13-
return false if type == :boolean
14-
end
15-
16-
array ? cast_array(type, value) : cast_value(type, value, array)
14+
cast_to(type, value, array: array)
1715
end
1816

19-
def cast_value(type, value, array)
20-
return cast_object_attribute(type, value, array: array) if type.is_a?(Class)
21-
return false if type == :boolean && value.nil?
17+
def cast_to(type, value, array: false)
18+
return [] if value.nil? && array
19+
return false if value.nil? && type == :boolean
20+
21+
cast_type = ActiveModel::Type.lookup(type)
2222

23-
case type
24-
when :string, :decimal
25-
value.to_s
26-
when :integer
27-
value.to_i
23+
if array
24+
cast_array(value, type, cast_type)
2825
else
29-
raise TypeError, "Unable to cast #{value.inspect} to #{type}"
26+
cast_value(value, type, cast_type)
27+
end
28+
end
29+
30+
def cast_array(values, type, cast_type)
31+
values.map do |value|
32+
next false if value.nil? && type == :boolean
33+
34+
cast_type.cast(value)
3035
end
3136
end
3237

33-
def cast_array(type, values)
34-
values.map { |element| cast_value(type, element, false) }
38+
def cast_value(value, type, cast_type)
39+
value = value.to_s if type == :decimal && value.is_a?(Float)
40+
41+
cast_type.cast(value)
3542
end
3643

3744
def cast_object_attribute(type, value, array:)

0 commit comments

Comments
 (0)