Class: Tapioca::Dsl::Compilers::StateMachinesExtended
- Inherits:
-
Compiler
- Object
- Compiler
- Tapioca::Dsl::Compilers::StateMachinesExtended
- Extended by:
- T::Sig
- Defined in:
- lib/tapioca/dsl/compilers/state_machines_extended.rb
Overview
‘Tapioca::Dsl::Compilers::StateMachines` generates RBI files for classes that setup a [`state_machine`](github.com/state-machines/state_machines). The compiler also processes the extra methods generated by [StateMachines Active Record](github.com/state-machines/state_machines-activerecord) and [StateMachines Active Model](github.com/state-machines/state_machines-activemodel) integrations.
For example, with the following ‘Vehicle` class:
~~~rb class Vehicle
state_machine :alarm_state, initial: :active, namespace: :'alarm' do
event :enable do
transition all => :active
end
event :disable do
transition all => :off
end
state :active, :value => 1
state :off, :value => 0
end
end ~~~
this compiler will produce the RBI file ‘vehicle.rbi` with the following content:
~~~rbi # vehicle.rbi # typed: true class Vehicle
include StateMachineInstanceHelperModule
extend StateMachineClassHelperModule
module StateMachineClassHelperModule
sig { params(event: T.any(String, Symbol)).returns(String) }
def human_alarm_state_event_name(event); end
sig { params(state: T.any(String, Symbol)).returns(String) }
def human_alarm_state_name(state); end
end
module StateMachineInstanceHelperModule
sig { returns(T::Boolean) }
def alarm_active?; end
sig { returns(T::Boolean) }
def alarm_off?; end
sig { returns(Integer) }
def alarm_state; end
sig { params(value: Integer).returns(Integer) }
def alarm_state=(value); end
sig { params(state: T.any(String, Symbol)).returns(T::Boolean) }
def alarm_state?(state); end
sig { params(args: T.untyped).returns(T::Array[T.any(String, Symbol)]) }
def alarm_state_events(*args); end
sig { returns(T.any(String, Symbol)) }
def alarm_state_name; end
sig { params(args: T.untyped).returns(T::Array[::StateMachines::Transition]) }
def alarm_state_paths(*args); end
sig { params(args: T.untyped).returns(T::Array[::StateMachines::Transition]) }
def alarm_state_transitions(*args); end
sig { returns(T::Boolean) }
def can_disable_alarm?; end
sig { returns(T::Boolean) }
def can_enable_alarm?; end
sig { params(args: T.untyped).returns(T::Boolean) }
def disable_alarm(*args); end
sig { params(args: T.untyped).returns(T::Boolean) }
def disable_alarm!(*args); end
sig { params(args: T.untyped).returns(T.nilable(::StateMachines::Transition)) }
def disable_alarm_transition(*args); end
sig { params(args: T.untyped).returns(T::Boolean) }
def enable_alarm(*args); end
sig { params(args: T.untyped).returns(T::Boolean) }
def enable_alarm!(*args); end
sig { params(args: T.untyped).returns(T.nilable(::StateMachines::Transition)) }
def enable_alarm_transition(*args); end
sig { params(event: T.any(String, Symbol), args: T.untyped).returns(T::Boolean) }
def fire_alarm_state_event(event, *args); end
sig { returns(String) }
def human_alarm_state_name; end
end
end ~~~
Constant Summary collapse
- ACTIVE_RECORD_RELATION_MODULE_NAMES =
[ "GeneratedRelationMethods", "GeneratedAssociationRelationMethods", ].freeze
- ConstantType =
type_member { { fixed: T.all(Module, ::StateMachines::ClassMethods) } }
Class Method Summary collapse
Instance Method Summary collapse
Class Method Details
.gather_constants ⇒ Object
172 173 174 |
# File 'lib/tapioca/dsl/compilers/state_machines_extended.rb', line 172 def gather_constants all_classes.select { |mod| ::StateMachines::InstanceMethods > mod } end |
Instance Method Details
#decorate ⇒ Object
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
# File 'lib/tapioca/dsl/compilers/state_machines_extended.rb', line 125 def decorate return if constant.state_machines.empty? root.create_path(T.unsafe(constant)) do |klass| instance_module_name = "StateMachineInstanceHelperModule" class_module_name = "StateMachineClassHelperModule" instance_module = RBI::Module.new(instance_module_name) klass << instance_module class_module = RBI::Module.new(class_module_name) klass << class_module constant.state_machines.each_value do |machine| state_type = state_type_for(machine) define_state_accessor(instance_module, machine, state_type) define_state_predicate(instance_module, machine) define_event_helpers(instance_module, machine) define_path_helpers(instance_module, machine) define_name_helpers(instance_module, class_module, machine) define_scopes(class_module, machine) define_state_methods(instance_module, machine) define_event_methods(instance_module, machine) end if uses_active_record_integration?(constant) define_activerecord_methods(instance_module) [ Tapioca::Dsl::Helpers::ActiveRecordConstantsHelper::RelationMethodsModuleName, Tapioca::Dsl::Helpers::ActiveRecordConstantsHelper::AssociationRelationMethodsModuleName, ].each do |module_name| klass.create_module(module_name).create_include(class_module_name) end end klass.create_include(instance_module_name) klass.create_extend(class_module_name) end end |