class Tapioca::Compilers::Dsl::ActiveRecordTypedStore
`Tapioca::Compilers::DSL::ActiveRecordTypedStore` generates RBI
files for Active Record models that use [`ActiveRecord::TypedStore`](github.com/byroot/activerecord-typedstore) features.
For example, with the following ActiveRecord class:
~~~rb # post.rb class Post < ApplicationRecord
typed_store :metadata do |s| s.string(:reviewer, blank: false, accessor: false) s.date(:review_date) s.boolean(:reviewed, null: false, default: false) end
end ~~~
this generator will produce the RBI
file `post.rbi` with the following content:
~~~rbi # post.rbi # typed: true class Post
sig { params(review_date: T.nilable(Date)).returns(T.nilable(Date)) } def review_date=(review_date); end sig { returns(T.nilable(Date)) } def review_date; end sig { returns(T.nilable(Date)) } def review_date_was; end sig { returns(T::Boolean) } def review_date_changed?; end sig { returns(T.nilable(Date)) } def review_date_before_last_save; end sig { returns(T::Boolean) } def saved_change_to_review_date?; end sig { returns(T.nilable([T.nilable(Date), T.nilable(Date)])) } def review_date_change; end sig { returns(T.nilable([T.nilable(Date), T.nilable(Date)])) } def saved_change_to_review_date; end sig { params(reviewd: T::Boolean).returns(T::Boolean) } def reviewed=(reviewed); end sig { returns(T::Boolean) } def reviewed; end sig { returns(T::Boolean) } def reviewed_was; end sig { returns(T::Boolean) } def reviewed_changed?; end sig { returns(T::Boolean) } def reviewed_before_last_save; end sig { returns(T::Boolean) } def saved_change_to_reviewed?; end sig { returns(T.nilable([T::Boolean, T::Boolean])) } def reviewed_change; end sig { returns(T.nilable([T::Boolean, T::Boolean])) } def saved_change_to_reviewed; end
end ~~~
Constants
- TYPES
Public Instance Methods
decorate(root, constant)
click to toggle source
# File lib/tapioca/compilers/dsl/active_record_typed_store.rb, line 97 def decorate(root, constant) stores = constant.typed_stores return if stores.values.flat_map(&:accessors).empty? root.create_path(constant) do |model| stores.values.each do |store_data| store_data.accessors.each do |accessor| field = store_data.fields[accessor] type = type_for(field.type_sym) type = "T.nilable(#{type})" if field.null && type != "T.untyped" generate_methods(model, field.name.to_s, type) end end end end
gather_constants()
click to toggle source
# File lib/tapioca/compilers/dsl/active_record_typed_store.rb, line 115 def gather_constants descendants_of(::ActiveRecord::Base).select do |klass| klass.include?(ActiveRecord::TypedStore::Behavior) end end
Private Instance Methods
generate_methods(klass, name, type)
click to toggle source
# File lib/tapioca/compilers/dsl/active_record_typed_store.rb, line 148 def generate_methods(klass, name, type) klass.create_method( "#{name}=", parameters: [create_param(name, type: type)], return_type: type ) klass.create_method(name, return_type: type) klass.create_method("#{name}?", return_type: "T::Boolean") klass.create_method("#{name}_was", return_type: type) klass.create_method("#{name}_changed?", return_type: "T::Boolean") klass.create_method("#{name}_before_last_save", return_type: type) klass.create_method("saved_change_to_#{name}?", return_type: "T::Boolean") klass.create_method("#{name}_change", return_type: "T.nilable([#{type}, #{type}])") klass.create_method("saved_change_to_#{name}", return_type: "T.nilable([#{type}, #{type}])") end
type_for(attr_type)
click to toggle source
# File lib/tapioca/compilers/dsl/active_record_typed_store.rb, line 136 def type_for(attr_type) TYPES.fetch(attr_type, "T.untyped") end