class Tapioca::Compilers::Dsl::ActiveSupportCurrentAttributes

`Tapioca::Compilers::Dsl::ActiveSupportCurrentAttributes` decorates RBI files for all subclasses of [`ActiveSupport::CurrentAttributes`](api.rubyonrails.org/classes/ActiveSupport/CurrentAttributes.html).

For example, with the following singleton class

~~~rb class Current < ActiveSupport::CurrentAttributes

extend T::Sig

attribute :account

def helper
  # ...
end

sig { params(user_id: Integer).void }
def authenticate(user_id)
  # ...
end

end ~~~

this generator will produce an RBI file with the following content: ~~~rbi # typed: true

class Current

sig { returns(T.untyped) }
def self.account; end

sig { returns(T.untyped) }
def account; end

sig { params(account: T.untyped).returns(T.untyped) }
def self.account=(account); end

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

sig { params(user_id: Integer).void }
def self.authenticate(user_id); end

sig { returns(T.untyped) }
def self.helper; end

end ~~~

Public Instance Methods

decorate(root, constant) click to toggle source
# File lib/tapioca/compilers/dsl/active_support_current_attributes.rb, line 73
def decorate(root, constant)
  dynamic_methods = dynamic_methods_for(constant)
  instance_methods = instance_methods_for(constant) - dynamic_methods
  return if dynamic_methods.empty? && instance_methods.empty?

  root.create_path(constant) do |current_attributes|
    dynamic_methods.each do |method|
      method = method.to_s
      # We want to generate each method both on the class
      generate_method(current_attributes, method, class_method: true)
      # and on the instance
      generate_method(current_attributes, method, class_method: false)
    end

    instance_methods.each do |method|
      # instance methods are only elevated to class methods
      # no need to add separate instance methods for them
      method = constant.instance_method(method)
      create_method_from_def(current_attributes, method, class_method: true)
    end
  end
end
gather_constants() click to toggle source
# File lib/tapioca/compilers/dsl/active_support_current_attributes.rb, line 97
def gather_constants
  descendants_of(::ActiveSupport::CurrentAttributes)
end

Private Instance Methods

dynamic_methods_for(constant) click to toggle source
# File lib/tapioca/compilers/dsl/active_support_current_attributes.rb, line 104
def dynamic_methods_for(constant)
  constant.instance_variable_get(:@generated_attribute_methods)&.instance_methods(false) || []
end
generate_method(klass, method, class_method:) click to toggle source
# File lib/tapioca/compilers/dsl/active_support_current_attributes.rb, line 114
def generate_method(klass, method, class_method:)
  if method.end_with?("=")
    parameter = create_param("value", type: "T.untyped")
    klass.create_method(
      method,
      class_method: class_method,
      parameters: [parameter],
      return_type: "T.untyped"
    )
  else
    klass.create_method(method, class_method: class_method, return_type: "T.untyped")
  end
end
instance_methods_for(constant) click to toggle source
# File lib/tapioca/compilers/dsl/active_support_current_attributes.rb, line 109
def instance_methods_for(constant)
  constant.instance_methods(false)
end