Class: Tapioca::Compilers::Dsl::ActiveRecordColumns

Inherits:
Base
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/tapioca/compilers/dsl/active_record_columns.rb

Overview

‘Tapioca::Compilers::Dsl::ActiveRecordColumns` refines RBI files for subclasses of `ActiveRecord::Base` (see api.rubyonrails.org/classes/ActiveRecord/Base.html). This generator is only responsible for defining the attribute methods that would be created for the columns that are defined in the Active Record model.

For example, with the following model class:

~~~rb class Post < ActiveRecord::Base end ~~~

and the following database schema:

~~~rb # db/schema.rb create_table :posts do |t|

t.string :title, null: false
t.string :body
t.boolean :published
t.timestamps

end ~~~

this generator will produce the following methods in the RBI file ‘post.rbi`:

~~~rbi # post.rbi # typed: true class Post

sig { returns(T.nilable(::String)) }
def body; end

sig { params(value: T.nilable(::String)).returns(T.nilable(::String)) }
def body=; end

sig { params(args: T.untyped).returns(T::Boolean) }
def body?; end

sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def created_at; end

sig { params(value: ::ActiveSupport::TimeWithZone).returns(::ActiveSupport::TimeWithZone) }
def created_at=; end

sig { params(args: T.untyped).returns(T::Boolean) }
def created_at?; end

sig { returns(T.nilable(T::Boolean)) }
def published; end

sig { params(value: T::Boolean).returns(T::Boolean) }
def published=; end

sig { params(args: T.untyped).returns(T::Boolean) }
def published?; end

sig { returns(::String) }
def title; end

sig { params(value: ::String).returns(::String) }
def title=(value); end

sig { params(args: T.untyped).returns(T::Boolean) }
def title?(*args); end

sig { returns(T.nilable(::ActiveSupport::TimeWithZone)) }
def updated_at; end

sig { params(value: ::ActiveSupport::TimeWithZone).returns(::ActiveSupport::TimeWithZone) }
def updated_at=; end

sig { params(args: T.untyped).returns(T::Boolean) }
def updated_at?; end

## Also the methods added by https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Dirty.html
## Also the methods added by https://api.rubyonrails.org/classes/ActiveModel/Dirty.html
## Also the methods added by https://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/BeforeTypeCast.html

end ~~~

Instance Attribute Summary

Attributes inherited from Base

#processable_constants

Instance Method Summary collapse

Methods inherited from Base

#handles?, #initialize

Constructor Details

This class inherits a constructor from Tapioca::Compilers::Dsl::Base

Instance Method Details

#decorate(root, constant) ⇒ Object



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/tapioca/compilers/dsl/active_record_columns.rb', line 100

def decorate(root, constant)
  return unless constant.table_exists?

  module_name = "#{constant}::GeneratedAttributeMethods"
  root.create_module(module_name) do |mod|
    constant.columns_hash.each_key do |column_name|
      column_name = column_name.to_s
      add_methods_for_attribute(mod, constant, column_name)
    end

    constant.attribute_aliases.each do |attribute_name, column_name|
      attribute_name = attribute_name.to_s
      column_name = column_name.to_s
      new_method_names = constant.attribute_method_matchers.map { |m| m.method_name(attribute_name) }
      old_method_names = constant.attribute_method_matchers.map { |m| m.method_name(column_name) }
      methods_to_add = new_method_names - old_method_names

      add_methods_for_attribute(mod, constant, column_name, attribute_name, methods_to_add)
    end
  end

  root.path(constant) do |klass|
    klass.create_include(module_name)
  end
end

#gather_constantsObject



127
128
129
# File 'lib/tapioca/compilers/dsl/active_record_columns.rb', line 127

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