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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 96bafabeef49a552e30d79d812f9be8fd0a647fbe5502fe8c5c31cef92509297
4
- data.tar.gz: f77529b1c8592ee3e5756e9de84373ad2a241477448f6bf78c5b06de73a0b1c8
3
+ metadata.gz: 0613df17774d270cebd8ded39b2791dada2c9ea7af876336f5abc124c4d7aa1e
4
+ data.tar.gz: e984af52994438d8fe2242f615b0e2b46aec4dbbabf0369f49945750de32b19a
5
5
  SHA512:
6
- metadata.gz: 2f68bc575101df45bf6c82e3b855fba15b03a148576516a88686883f4dec45f89429d9c1911b041134da2d4d9820a21d73e9f26ff4a087f559b0329e72a09bfe
7
- data.tar.gz: b66f0e77ad304f584f0d38872aeef8990eb34f4333142b9e75eb673d9051818e207ddc1f195ad197847a216384e0cb46c0d63e05eda97f4cafe553097bd1e76c
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 { params(name: Symbol, type: T.class_of(T::Enum)).void }
22
- def sorbet_enum(name, type)
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
- T.unsafe(self).enum(name, type.values.map(&:serialize).index_with(&:to_s))
31
+ serialize(name, coder: Serializer.new(type))
27
32
 
28
- T.unsafe(self).define_method("#{name}_enum") do
29
- val = T.unsafe(self).public_send(name)
30
- return unless val
33
+ validates name,
34
+ presence: presence,
35
+ inclusion: { in: type.values, allow_blank: !presence }
31
36
 
32
- type.deserialize(val)
33
- end
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
- T.unsafe(self).define_method("#{name}_enum=") do |arg|
36
- T.unsafe(self).public_send("#{name}=", arg.serialize)
40
+ super(arg)
37
41
  end
38
42
  end
39
43
 
@@ -3,3 +3,4 @@
3
3
 
4
4
  require_relative "version"
5
5
  require_relative "concern"
6
+ require_relative "serializer"
@@ -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
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module RailsSorbetEnum
5
- VERSION = "0.1.0"
5
+ VERSION = "0.2.0"
6
6
  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
- return_type =
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}_enum",
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: enum_type.name)
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.1.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