class Tapioca::Dsl::Compilers::ActiveModelSecurePassword
~~~
end
def token_confirmation=(unencrypted_password); end
sig { params(unencrypted_password: T.untyped).returns(T.untyped) }
def token=(unencrypted_password); end
sig { params(unencrypted_password: T.untyped).returns(T.untyped) }
def token; end
sig { returns(T.untyped) }
def password_confirmation=(unencrypted_password); end
sig { params(unencrypted_password: T.untyped).returns(T.untyped) }
def password=(unencrypted_password); end
sig { params(unencrypted_password: T.untyped).returns(T.untyped) }
def password; end
sig { returns(T.untyped) }
def authenticate_token(unencrypted_password); end
sig { params(unencrypted_password: T.untyped).returns(T.untyped) }
def authenticate_password(unencrypted_password); end
sig { params(unencrypted_password: T.untyped).returns(T.untyped) }
def authenticate(unencrypted_password); end
sig { params(unencrypted_password: T.untyped).returns(T.untyped) }
class User
# typed: true
~~~rbi
this compiler will produce an RBI file with the following content:
~~~
end
has_secure_password :token
has_secure_password
include ActiveModel::SecurePassword
class User
~~~rb
For example, with the following class:
classes that use [‘ActiveModel::SecurePassword`](api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html).
`Tapioca::Dsl::Compilers::ActiveModelSecurePassword` decorates RBI files for all
def decorate
def decorate instance_methods_modules = if constant < ActiveModel::SecurePassword::InstanceMethodsOnActivation # pre Rails 6.0, this used to be a single static module [ActiveModel::SecurePassword::InstanceMethodsOnActivation] else # post Rails 6.0, this is now using a dynamic module builder pattern # and we can have multiple different ones included into the model constant.ancestors.grep(ActiveModel::SecurePassword::InstanceMethodsOnActivation) end return if instance_methods_modules.empty? methods = instance_methods_modules.flat_map { |mod| mod.instance_methods(false) } return if methods.empty? root.create_path(constant) do |klass| methods.each do |method| if method == :authenticate || method.start_with?("authenticate_") klass.create_method( method.to_s, parameters: [create_param("unencrypted_password", type: "T.untyped")], return_type: "T.any(#{constant}, FalseClass)", ) else create_method_from_def(klass, constant.instance_method(method)) end end end end
def gather_constants
def gather_constants # This selects all classes that are `ActiveModel::SecurePassword::ClassMethods === klass`. # In other words, we select all classes that have `ActiveModel::SecurePassword::ClassMethods` # as an ancestor of its singleton class, i.e. all classes that have extended the # `ActiveModel::SecurePassword::ClassMethods` module. all_classes.grep(::ActiveModel::SecurePassword::ClassMethods) end