class Tapioca::Compilers::Dsl::ActiveRecordEnum
`Tapioca::Compilers::Dsl::ActiveRecordEnum` decorates RBI
files for subclasses of `ActiveRecord::Base` which declare [`enum` fields](api.rubyonrails.org/classes/ActiveRecord/Enum.html).
For example, with the following `ActiveRecord::Base` subclass:
~~~rb class Post < ApplicationRecord
enum title_type: %i(book all web), _suffix: :title
end ~~~
this generator will produce the RBI
file `post.rbi` with the following content:
~~~rbi # post.rbi # typed: true class Post
include EnumMethodsModule module EnumMethodsModule sig { void } def all_title!; end sig { returns(T::Boolean) } def all_title?; end sig { returns(T::Hash[T.any(String, Symbol), Integer]) } def self.title_types; end sig { void } def book_title!; end sig { returns(T::Boolean) } def book_title?; end sig { void } def web_title!; end sig { returns(T::Boolean) } def web_title?; end end
end ~~~
Public Instance Methods
decorate(root, constant)
click to toggle source
# File lib/tapioca/compilers/dsl/active_record_enum.rb, line 62 def decorate(root, constant) return if constant.defined_enums.empty? root.create_path(constant) do |model| module_name = "EnumMethodsModule" model.create_module(module_name) do |mod| generate_instance_methods(constant, mod) end model.create_include(module_name) constant.defined_enums.each do |name, enum_map| type = type_for_enum(enum_map) model.create_method(name.pluralize, class_method: true, return_type: type) end end end
gather_constants()
click to toggle source
# File lib/tapioca/compilers/dsl/active_record_enum.rb, line 82 def gather_constants descendants_of(::ActiveRecord::Base).reject(&:abstract_class?) end
Private Instance Methods
generate_instance_methods(constant, klass)
click to toggle source
# File lib/tapioca/compilers/dsl/active_record_enum.rb, line 101 def generate_instance_methods(constant, klass) methods = constant.send(:_enum_methods_module).instance_methods methods.each do |method| method = method.to_s return_type = method.end_with?("?") ? "T::Boolean" : "void" klass.create_method(method, return_type: return_type) end end
type_for_enum(enum_map)
click to toggle source
# File lib/tapioca/compilers/dsl/active_record_enum.rb, line 89 def type_for_enum(enum_map) value_type = enum_map.values.map { |v| v.class.name }.uniq value_type = if value_type.length == 1 value_type.first else "T.any(#{value_type.join(", ")})" end "T::Hash[T.any(String, Symbol), #{value_type}]" end