[Sorbet][Tapioca] tapiocaで生成する型を追加する方法

custom dsl compilers を書く。

ファイルの置き場所は、sorbet/tapioca/compilers または tapioca/dsl/compilers

default dsl compilers を参考に書くと良い。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# typed: strict
# frozen_string_literal: true

module Tapioca
  module Compilers
    class ActiveRecordImport < Tapioca::Dsl::Compiler
      extend T::Sig

      ConstantType = type_member { { fixed: T.class_of(::ActiveRecord::Base) } }

      sig { override.returns(T::Enumerable[Module]) }
      def self.gather_constants
        descendants_of(::ApplicationRecord).reject(&:abstract_class?)
      end

      sig { override.void }
      def decorate
        root.create_path(constant) do |klass|
          import_params = [
            create_param("values", type: "T::Array[T.any(#{klass}, T::Hash[Symbol, T.untyped])]"),
            create_kw_opt_param("on_duplicate_key_ignore", type: "T::Boolean", default: "false"),
            create_kw_opt_param("on_duplicate_key_update",
              type: "T.any(Symbol, T::Array[Symbol], T::Hash[Symbol, T.untyped])", default: "nil"),
            create_kw_opt_param("validate", type: "T::Boolean", default: "true"),
            create_kw_opt_param("validate_with_context", type: "Symbol", default: ":create/:update"),
          ]

          result_class = klass.create_class("Import::Result", superclass_name: "::Struct")
          result_class.create_method("failed_instances", return_type: "T::Array[#{klass}]")
          result_class.create_method("num_inserts", return_type: "Integer")

          klass.create_method(
            "import!",
            parameters: import_params,
            return_type: "void",
            class_method: true,
          )

          klass.create_method(
            "import",
            parameters: import_params,
            return_type: "Import::Result",
            class_method: true,
          )
        end
      end
    end
  end
end
Built with Hugo
テーマ StackJimmy によって設計されています。