Class: Tapioca::Dsl::Compilers::ActiveRecordScope

Inherits:
Tapioca::Dsl::Compiler show all
Extended by:
T::Sig
Includes:
Helpers::ActiveRecordConstantsHelper
Defined in:
lib/tapioca/dsl/compilers/active_record_scope.rb

Overview

Tapioca::Dsl::Compilers::ActiveRecordScope decorates RBI files for subclasses of ActiveRecord::Base which declare scope fields.

For example, with the following ActiveRecord::Base subclass:

class Post < ApplicationRecord
  scope :public_kind, -> { where.not(kind: 'private') }
  scope :private_kind, -> { where(kind: 'private') }
end

this compiler will produce the RBI file post.rbi with the following content:

# post.rbi
# typed: true
class Post
  extend GeneratedRelationMethods

  module GeneratedRelationMethods
    sig { params(args: T.untyped, blk: T.untyped).returns(T.untyped) }
    def private_kind(*args, &blk); end

    sig { params(args: T.untyped, blk: T.untyped).returns(T.untyped) }
    def public_kind(*args, &blk); end
  end
end

Constant Summary collapse

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

Constants included from Runtime::Reflection

Runtime::Reflection::ANCESTORS_METHOD, Runtime::Reflection::CLASS_METHOD, Runtime::Reflection::CONSTANTS_METHOD, Runtime::Reflection::EQUAL_METHOD, Runtime::Reflection::METHOD_METHOD, Runtime::Reflection::NAME_METHOD, Runtime::Reflection::OBJECT_ID_METHOD, Runtime::Reflection::PRIVATE_INSTANCE_METHODS_METHOD, Runtime::Reflection::PROTECTED_INSTANCE_METHODS_METHOD, Runtime::Reflection::PUBLIC_INSTANCE_METHODS_METHOD, Runtime::Reflection::REQUIRED_FROM_LABELS, Runtime::Reflection::SINGLETON_CLASS_METHOD, Runtime::Reflection::SUPERCLASS_METHOD

Constants included from SorbetHelper

SorbetHelper::FEATURE_REQUIREMENTS, SorbetHelper::SORBET_BIN, SorbetHelper::SORBET_EXE_PATH_ENV_VAR, SorbetHelper::SORBET_GEM_SPEC, SorbetHelper::SORBET_PAYLOAD_URL

Instance Attribute Summary

Attributes inherited from Tapioca::Dsl::Compiler

#constant, #root

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Tapioca::Dsl::Compiler

#add_error, #compiler_enabled?, handles?, #initialize, processable_constants

Methods included from T::Generic::TypeStoragePatch

#[], #type_member, #type_template

Methods included from Runtime::Reflection

#ancestors_of, #are_equal?, #class_of, #constant_from_singleton_class, #constant_name_from_singleton_class, #constantize, #constants_of, #descendants_of, #inherited_ancestors_of, #method_of, #name_of, #name_of_type, #object_id_of, #private_instance_methods_of, #protected_instance_methods_of, #public_instance_methods_of, #qualified_name_of, #resolve_loc, #signature_of, #singleton_class_of, #superclass_of

Methods included from RBIHelper

#create_block_param, #create_kw_opt_param, #create_kw_param, #create_kw_rest_param, #create_opt_param, #create_param, #create_rest_param, #create_typed_param, #sanitize_signature_types, serialize_type_variable, #valid_method_name?, #valid_parameter_name?

Methods included from SorbetHelper

#sorbet, #sorbet_path, #sorbet_supports?

Constructor Details

This class inherits a constructor from Tapioca::Dsl::Compiler

Class Method Details

.gather_constantsObject



84
85
86
# File 'lib/tapioca/dsl/compilers/active_record_scope.rb', line 84

def self.gather_constants
  descendants_of(::ActiveRecord::Base).reject(&:abstract_class?)
end

Instance Method Details

#decorateObject



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/tapioca/dsl/compilers/active_record_scope.rb', line 52

def decorate
  method_names = scope_method_names

  return if method_names.empty?

  root.create_path(constant) do |model|
    relations_enabled = compiler_enabled?("ActiveRecordRelations")

    relation_methods_module = model.create_module(RelationMethodsModuleName)
    assoc_relation_methods_mod = model.create_module(AssociationRelationMethodsModuleName) if relations_enabled

    method_names.each do |scope_method|
      generate_scope_method(
        relation_methods_module,
        scope_method.to_s,
        relations_enabled ? RelationClassName : "T.untyped"
      )

      next unless relations_enabled

      generate_scope_method(
        assoc_relation_methods_mod,
        scope_method.to_s,
        AssociationRelationClassName
      )
    end

    model.create_extend(RelationMethodsModuleName)
  end
end