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
|