Class: Tapioca::Dsl::Compilers::ActiveRecordAssociations

Inherits:
Tapioca::Dsl::Compiler show all
Includes:
Helpers::ActiveRecordConstantsHelper
Defined in:
lib/tapioca/dsl/compilers/active_record_associations.rb

Overview

Tapioca::Dsl::Compilers::ActiveRecordAssociations refines RBI files for subclasses of ActiveRecord::Base. This compiler is only responsible for defining the methods that would be created for the associations that are defined in the Active Record model.

For example, with the following model class:

class Post < ActiveRecord::Base
  belongs_to :category
  has_many :comments
  has_one :author, class_name: "User"

  accepts_nested_attributes_for :category, :comments, :author
end

this compiler will produce the following methods in the RBI file post.rbi:

# post.rbi
# typed: true

class Post
  include Post::GeneratedAssociationMethods

  module Post::GeneratedAssociationMethods
    sig { returns(T.nilable(::User)) }
    def author; end

    sig { params(value: T.nilable(::User)).void }
    def author=(value); end

    sig { params(attributes: T.untyped).returns(T.untyped) }
    def author_attributes=(attributes); end

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

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

    sig { returns(T.nilable(::Category)) }
    def category; end

    sig { params(value: T.nilable(::Category)).void }
    def category=(value); end

    sig { params(attributes: T.untyped).returns(T.untyped) }
    def category_attributes=(attributes); end

    sig { returns(T::Array[T.untyped]) }
    def comment_ids; end

    sig { params(ids: T::Array[T.untyped]).returns(T::Array[T.untyped]) }
    def comment_ids=(ids); end

    sig { returns(::ActiveRecord::Associations::CollectionProxy[::Comment]) }
    def comments; end

    sig { params(value: T::Enumerable[::Comment]).void }
    def comments=(value); end

    sig { params(attributes: T.untyped).returns(T.untyped) }
    def comments_attributes=(attributes); end

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

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

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

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

    sig { returns(T.nilable(::User)) }
    def reload_author; end

    sig { returns(T.nilable(::Category)) }
    def reload_category; end

    sig { void }
    def reset_author; end

    sig { void }
    def reset_category; end
  end
end

: [ConstantType = singleton(ActiveRecord::Base)]

Defined Under Namespace

Classes: MissingConstantError, SourceReflectionError

Constant Summary

Constants included from Helpers::ActiveRecordConstantsHelper

Helpers::ActiveRecordConstantsHelper::AssociationMethodsModuleName, Helpers::ActiveRecordConstantsHelper::AssociationRelationClassName, Helpers::ActiveRecordConstantsHelper::AssociationRelationGroupChainClassName, Helpers::ActiveRecordConstantsHelper::AssociationRelationMethodsModuleName, Helpers::ActiveRecordConstantsHelper::AssociationRelationWhereChainClassName, Helpers::ActiveRecordConstantsHelper::AssociationsCollectionProxyClassName, Helpers::ActiveRecordConstantsHelper::AttributeMethodsModuleName, Helpers::ActiveRecordConstantsHelper::CommonRelationMethodsModuleName, Helpers::ActiveRecordConstantsHelper::DelegatedTypesModuleName, Helpers::ActiveRecordConstantsHelper::ReflectionType, Helpers::ActiveRecordConstantsHelper::RelationClassName, Helpers::ActiveRecordConstantsHelper::RelationGroupChainClassName, Helpers::ActiveRecordConstantsHelper::RelationMethodsModuleName, Helpers::ActiveRecordConstantsHelper::RelationWhereChainClassName, Helpers::ActiveRecordConstantsHelper::SecureTokensModuleName, Helpers::ActiveRecordConstantsHelper::StoredAttributesModuleName

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, Runtime::Reflection::SignatureBlockError, Runtime::Reflection::UNDEFINED_CONSTANT

Constants included from RBIHelper

RBIHelper::TYPE_PARAMETER_MATCHER

Constants included from SorbetHelper

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

Instance Attribute Summary

Attributes inherited from Tapioca::Dsl::Compiler

#constant, #options, #root

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Tapioca::Dsl::Compiler

#add_error, #compiler_enabled?, handles?, #initialize, processable_constants, requested_constants=, reset_state

Methods included from Runtime::Reflection

#abstract_type_of, #ancestors_of, #are_equal?, #attached_class_of, #class_of, #const_source_location, #constant_defined?, #constantize, #constants_of, #descendants_of, #file_candidates_for, #final_module?, #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, #sealed_module?, #signature_of, #signature_of!, #singleton_class_of, #superclass_of

Methods included from RBIHelper

#as_nilable_type, #as_non_nilable_type, #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, #extract_type_parameters, #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

: -> Enumerable[T::Module[top]]



140
141
142
# File 'lib/tapioca/dsl/compilers/active_record_associations.rb', line 140

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

Instance Method Details

#decorateObject

: -> void



124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/tapioca/dsl/compilers/active_record_associations.rb', line 124

def decorate
  return if constant.reflections.empty?

  root.create_path(constant) do |model|
    model.create_module(AssociationMethodsModuleName) do |mod|
      populate_nested_attribute_writers(mod)
      populate_associations(mod)
    end

    model.create_include(AssociationMethodsModuleName)
  end
end