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