rails_sorbet_enum 0.1.0 → 0.2.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/.rubocop.yml +6 -0
- data/lib/rails_sorbet_enum/concern.rb +15 -11
- data/lib/rails_sorbet_enum/require.rb +1 -0
- data/lib/rails_sorbet_enum/serializer.rb +31 -0
- data/lib/rails_sorbet_enum/version.rb +1 -1
- data/lib/tapioca/dsl/compilers/rails_sorbet_enum_compiler.rb +3 -7
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0613df17774d270cebd8ded39b2791dada2c9ea7af876336f5abc124c4d7aa1e
|
4
|
+
data.tar.gz: e984af52994438d8fe2242f615b0e2b46aec4dbbabf0369f49945750de32b19a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e19cc7054f62b63dd31bc2f4f08ccaa49b6a7f4596a4c20cdf7106484aa15d88fae8f82ec6efcd0c4143e97960a51c2f2318759798026aff4c1c564a12a2ba83
|
7
|
+
data.tar.gz: 64baa1e994b0a4623d8c03e7a31e84cd2f4459b4e37f758da1e63387d2cde134476c0b9fa1cfd8c81e24e03f1e1451c69c6d31d8f78cd5c50f0cfe383eb9b60e
|
data/.rubocop.yml
CHANGED
@@ -5,9 +5,15 @@ AllCops:
|
|
5
5
|
NewCops: enable
|
6
6
|
TargetRubyVersion: 3.1
|
7
7
|
|
8
|
+
Layout/ArgumentAlignment:
|
9
|
+
EnforcedStyle: with_fixed_indentation
|
10
|
+
|
8
11
|
Metrics/AbcSize:
|
9
12
|
Enabled: false
|
10
13
|
|
14
|
+
Metrics/BlockLength:
|
15
|
+
Enabled: false
|
16
|
+
|
11
17
|
Metrics/MethodLength:
|
12
18
|
Enabled: false
|
13
19
|
|
@@ -7,7 +7,6 @@ require "sorbet-runtime"
|
|
7
7
|
|
8
8
|
module RailsSorbetEnum
|
9
9
|
# Concern allows ActiveRecord models to use typechecked Sorbet T::Enums
|
10
|
-
# with backing ActiveRecord::Enum fields
|
11
10
|
module Concern
|
12
11
|
extend ActiveSupport::Concern
|
13
12
|
|
@@ -18,22 +17,27 @@ module RailsSorbetEnum
|
|
18
17
|
|
19
18
|
include ::ActiveRecord::Enum
|
20
19
|
|
21
|
-
sig
|
22
|
-
|
20
|
+
sig do
|
21
|
+
params(
|
22
|
+
name: Symbol,
|
23
|
+
type: T.class_of(T::Enum),
|
24
|
+
presence: T::Boolean
|
25
|
+
).void
|
26
|
+
end
|
27
|
+
def sorbet_enum(name, type, presence: true)
|
23
28
|
sorbet_enum_attributes << [name, type]
|
24
29
|
|
25
30
|
# The Rails enum values are the serialized T::Enum ones
|
26
|
-
|
31
|
+
serialize(name, coder: Serializer.new(type))
|
27
32
|
|
28
|
-
|
29
|
-
|
30
|
-
|
33
|
+
validates name,
|
34
|
+
presence: presence,
|
35
|
+
inclusion: { in: type.values, allow_blank: !presence }
|
31
36
|
|
32
|
-
|
33
|
-
|
37
|
+
T.unsafe(self).define_method("#{name}=") do |arg|
|
38
|
+
raise ArgumentError, "expected #{type.name} but got #{arg.class}" if arg && arg.class != type
|
34
39
|
|
35
|
-
|
36
|
-
T.unsafe(self).public_send("#{name}=", arg.serialize)
|
40
|
+
super(arg)
|
37
41
|
end
|
38
42
|
end
|
39
43
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# typed: strict
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module RailsSorbetEnum
|
5
|
+
class Serializer
|
6
|
+
extend T::Sig
|
7
|
+
|
8
|
+
sig { params(object_class: T.class_of(T::Enum)).void }
|
9
|
+
def initialize(object_class)
|
10
|
+
@object_class = object_class
|
11
|
+
end
|
12
|
+
|
13
|
+
sig { params(obj: T.untyped).returns(String) }
|
14
|
+
def dump(obj)
|
15
|
+
case obj
|
16
|
+
when T::Enum
|
17
|
+
obj.serialize
|
18
|
+
else
|
19
|
+
raise ActiveRecord::SerializationTypeMismatch,
|
20
|
+
"expected #{@object_class.name} and got #{obj.class}"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
sig { params(str: T.nilable(String)).returns(T.nilable(T::Enum)) }
|
25
|
+
def load(str)
|
26
|
+
return if str.nil?
|
27
|
+
|
28
|
+
@object_class.try_deserialize(str)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -31,7 +31,7 @@ module Tapioca
|
|
31
31
|
root.create_path(constant) do |klass|
|
32
32
|
klass.create_module(RBI_MODULE_NAME) do |methods_mod|
|
33
33
|
T.unsafe(constant).sorbet_enum_attributes.each do |enum_name, enum_type|
|
34
|
-
|
34
|
+
type_with_nilability =
|
35
35
|
if T.unsafe(constant).column_for_attribute(enum_name).null
|
36
36
|
"T.nilable(#{enum_type.name})"
|
37
37
|
else
|
@@ -39,13 +39,9 @@ module Tapioca
|
|
39
39
|
end
|
40
40
|
|
41
41
|
methods_mod.create_method(
|
42
|
-
"#{enum_name}
|
43
|
-
return_type: return_type
|
44
|
-
)
|
45
|
-
methods_mod.create_method(
|
46
|
-
"#{enum_name}_enum=",
|
42
|
+
"#{enum_name}=",
|
47
43
|
parameters: [
|
48
|
-
create_param("value", type:
|
44
|
+
create_param("value", type: type_with_nilability)
|
49
45
|
],
|
50
46
|
return_type: "void"
|
51
47
|
)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_sorbet_enum
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Franklin Hu
|
@@ -81,6 +81,7 @@ files:
|
|
81
81
|
- lib/rails_sorbet_enum.rb
|
82
82
|
- lib/rails_sorbet_enum/concern.rb
|
83
83
|
- lib/rails_sorbet_enum/require.rb
|
84
|
+
- lib/rails_sorbet_enum/serializer.rb
|
84
85
|
- lib/rails_sorbet_enum/version.rb
|
85
86
|
- lib/tapioca/dsl/compilers/rails_sorbet_enum_compiler.rb
|
86
87
|
- sig/rails_sorbet_enum.rbs
|