enum_state_machine 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +12 -0
  3. data/.ruby-gemset +1 -0
  4. data/.ruby-version +1 -0
  5. metadata +83 -130
  6. data/.rvmrc +0 -1
  7. data/enum_state_machine.gemspec +0 -25
  8. data/lib/enum_state_machine.rb +0 -9
  9. data/lib/enum_state_machine/assertions.rb +0 -36
  10. data/lib/enum_state_machine/branch.rb +0 -225
  11. data/lib/enum_state_machine/callback.rb +0 -232
  12. data/lib/enum_state_machine/core.rb +0 -12
  13. data/lib/enum_state_machine/core_ext.rb +0 -2
  14. data/lib/enum_state_machine/core_ext/class/state_machine.rb +0 -5
  15. data/lib/enum_state_machine/error.rb +0 -13
  16. data/lib/enum_state_machine/eval_helpers.rb +0 -87
  17. data/lib/enum_state_machine/event.rb +0 -257
  18. data/lib/enum_state_machine/event_collection.rb +0 -141
  19. data/lib/enum_state_machine/extensions.rb +0 -149
  20. data/lib/enum_state_machine/graph.rb +0 -92
  21. data/lib/enum_state_machine/helper_module.rb +0 -17
  22. data/lib/enum_state_machine/initializers.rb +0 -4
  23. data/lib/enum_state_machine/initializers/rails.rb +0 -22
  24. data/lib/enum_state_machine/integrations.rb +0 -97
  25. data/lib/enum_state_machine/integrations/active_model.rb +0 -585
  26. data/lib/enum_state_machine/integrations/active_model/locale.rb +0 -11
  27. data/lib/enum_state_machine/integrations/active_model/observer.rb +0 -33
  28. data/lib/enum_state_machine/integrations/active_model/observer_update.rb +0 -42
  29. data/lib/enum_state_machine/integrations/active_model/versions.rb +0 -31
  30. data/lib/enum_state_machine/integrations/active_record.rb +0 -548
  31. data/lib/enum_state_machine/integrations/active_record/locale.rb +0 -20
  32. data/lib/enum_state_machine/integrations/active_record/versions.rb +0 -123
  33. data/lib/enum_state_machine/integrations/base.rb +0 -100
  34. data/lib/enum_state_machine/machine.rb +0 -2292
  35. data/lib/enum_state_machine/machine_collection.rb +0 -86
  36. data/lib/enum_state_machine/macro_methods.rb +0 -518
  37. data/lib/enum_state_machine/matcher.rb +0 -123
  38. data/lib/enum_state_machine/matcher_helpers.rb +0 -54
  39. data/lib/enum_state_machine/node_collection.rb +0 -222
  40. data/lib/enum_state_machine/path.rb +0 -120
  41. data/lib/enum_state_machine/path_collection.rb +0 -90
  42. data/lib/enum_state_machine/state.rb +0 -297
  43. data/lib/enum_state_machine/state_collection.rb +0 -112
  44. data/lib/enum_state_machine/state_context.rb +0 -138
  45. data/lib/enum_state_machine/state_enum.rb +0 -23
  46. data/lib/enum_state_machine/transition.rb +0 -470
  47. data/lib/enum_state_machine/transition_collection.rb +0 -245
  48. data/lib/enum_state_machine/version.rb +0 -3
  49. data/lib/enum_state_machine/yard.rb +0 -8
  50. data/lib/enum_state_machine/yard/handlers.rb +0 -12
  51. data/lib/enum_state_machine/yard/handlers/base.rb +0 -32
  52. data/lib/enum_state_machine/yard/handlers/event.rb +0 -25
  53. data/lib/enum_state_machine/yard/handlers/machine.rb +0 -344
  54. data/lib/enum_state_machine/yard/handlers/state.rb +0 -25
  55. data/lib/enum_state_machine/yard/handlers/transition.rb +0 -47
  56. data/lib/enum_state_machine/yard/templates.rb +0 -3
  57. data/lib/enum_state_machine/yard/templates/default/class/html/setup.rb +0 -30
  58. data/lib/enum_state_machine/yard/templates/default/class/html/state_machines.erb +0 -12
  59. data/lib/tasks/enum_state_machine.rake +0 -1
  60. data/lib/tasks/enum_state_machine.rb +0 -24
  61. data/lib/yard-enum_state_machine.rb +0 -2
  62. data/test/functional/state_machine_test.rb +0 -1066
  63. data/test/unit/integrations/active_model_test.rb +0 -1245
  64. data/test/unit/integrations/active_record_test.rb +0 -2551
  65. data/test/unit/integrations/base_test.rb +0 -104
  66. data/test/unit/integrations_test.rb +0 -71
  67. data/test/unit/invalid_event_test.rb +0 -20
  68. data/test/unit/invalid_parallel_transition_test.rb +0 -18
  69. data/test/unit/invalid_transition_test.rb +0 -115
  70. data/test/unit/machine_collection_test.rb +0 -603
  71. data/test/unit/machine_test.rb +0 -3395
  72. data/test/unit/state_machine_test.rb +0 -31
@@ -1,141 +0,0 @@
1
- require 'enum_state_machine/node_collection'
2
-
3
- module EnumStateMachine
4
- # Represents a collection of events in a state machine
5
- class EventCollection < NodeCollection
6
- def initialize(machine) #:nodoc:
7
- super(machine, :index => [:name, :qualified_name])
8
- end
9
-
10
- # Gets the list of events that can be fired on the given object.
11
- #
12
- # Valid requirement options:
13
- # * <tt>:from</tt> - One or more states being transitioned from. If none
14
- # are specified, then this will be the object's current state.
15
- # * <tt>:to</tt> - One or more states being transitioned to. If none are
16
- # specified, then this will match any to state.
17
- # * <tt>:on</tt> - One or more events that fire the transition. If none
18
- # are specified, then this will match any event.
19
- # * <tt>:guard</tt> - Whether to guard transitions with the if/unless
20
- # conditionals defined for each one. Default is true.
21
- #
22
- # == Examples
23
- #
24
- # class Vehicle
25
- # state_machine :initial => :parked do
26
- # event :park do
27
- # transition :idling => :parked
28
- # end
29
- #
30
- # event :ignite do
31
- # transition :parked => :idling
32
- # end
33
- # end
34
- # end
35
- #
36
- # events = Vehicle.state_machine(:state).events
37
- #
38
- # vehicle = Vehicle.new # => #<Vehicle:0xb7c464b0 @state="parked">
39
- # events.valid_for(vehicle) # => [#<EnumStateMachine::Event name=:ignite transitions=[:parked => :idling]>]
40
- #
41
- # vehicle.state = 'idling'
42
- # events.valid_for(vehicle) # => [#<EnumStateMachine::Event name=:park transitions=[:idling => :parked]>]
43
- def valid_for(object, requirements = {})
44
- match(requirements).select {|event| event.can_fire?(object, requirements)}
45
- end
46
-
47
- # Gets the list of transitions that can be run on the given object.
48
- #
49
- # Valid requirement options:
50
- # * <tt>:from</tt> - One or more states being transitioned from. If none
51
- # are specified, then this will be the object's current state.
52
- # * <tt>:to</tt> - One or more states being transitioned to. If none are
53
- # specified, then this will match any to state.
54
- # * <tt>:on</tt> - One or more events that fire the transition. If none
55
- # are specified, then this will match any event.
56
- # * <tt>:guard</tt> - Whether to guard transitions with the if/unless
57
- # conditionals defined for each one. Default is true.
58
- #
59
- # == Examples
60
- #
61
- # class Vehicle
62
- # state_machine :initial => :parked do
63
- # event :park do
64
- # transition :idling => :parked
65
- # end
66
- #
67
- # event :ignite do
68
- # transition :parked => :idling
69
- # end
70
- # end
71
- # end
72
- #
73
- # events = Vehicle.state_machine.events
74
- #
75
- # vehicle = Vehicle.new # => #<Vehicle:0xb7c464b0 @state="parked">
76
- # events.transitions_for(vehicle) # => [#<EnumStateMachine::Transition attribute=:state event=:ignite from="parked" from_name=:parked to="idling" to_name=:idling>]
77
- #
78
- # vehicle.state = 'idling'
79
- # events.transitions_for(vehicle) # => [#<EnumStateMachine::Transition attribute=:state event=:park from="idling" from_name=:idling to="parked" to_name=:parked>]
80
- #
81
- # # Search for explicit transitions regardless of the current state
82
- # events.transitions_for(vehicle, :from => :parked) # => [#<EnumStateMachine::Transition attribute=:state event=:ignite from="parked" from_name=:parked to="idling" to_name=:idling>]
83
- def transitions_for(object, requirements = {})
84
- match(requirements).map {|event| event.transition_for(object, requirements)}.compact
85
- end
86
-
87
- # Gets the transition that should be performed for the event stored in the
88
- # given object's event attribute. This also takes an additional parameter
89
- # for automatically invalidating the object if the event or transition are
90
- # invalid. By default, this is turned off.
91
- #
92
- # *Note* that if a transition has already been generated for the event, then
93
- # that transition will be used.
94
- #
95
- # == Examples
96
- #
97
- # class Vehicle < ActiveRecord::Base
98
- # state_machine :initial => :parked do
99
- # event :ignite do
100
- # transition :parked => :idling
101
- # end
102
- # end
103
- # end
104
- #
105
- # vehicle = Vehicle.new # => #<Vehicle id: nil, state: "parked">
106
- # events = Vehicle.state_machine.events
107
- #
108
- # vehicle.state_event = nil
109
- # events.attribute_transition_for(vehicle) # => nil # Event isn't defined
110
- #
111
- # vehicle.state_event = 'invalid'
112
- # events.attribute_transition_for(vehicle) # => false # Event is invalid
113
- #
114
- # vehicle.state_event = 'ignite'
115
- # events.attribute_transition_for(vehicle) # => #<EnumStateMachine::Transition attribute=:state event=:ignite from="parked" from_name=:parked to="idling" to_name=:idling>
116
- def attribute_transition_for(object, invalidate = false)
117
- return unless machine.action
118
-
119
- result = machine.read(object, :event_transition) || if event_name = machine.read(object, :event)
120
- if event = self[event_name.to_sym, :name]
121
- event.transition_for(object) || begin
122
- # No valid transition: invalidate
123
- machine.invalidate(object, :event, :invalid_event, [[:state, machine.states.match!(object).human_name(object.class)]]) if invalidate
124
- false
125
- end
126
- else
127
- # Event is unknown: invalidate
128
- machine.invalidate(object, :event, :invalid) if invalidate
129
- false
130
- end
131
- end
132
-
133
- result
134
- end
135
-
136
- private
137
- def match(requirements) #:nodoc:
138
- requirements && requirements[:on] ? [fetch(requirements.delete(:on))] : self
139
- end
140
- end
141
- end
@@ -1,149 +0,0 @@
1
- require 'enum_state_machine/machine_collection'
2
-
3
- module EnumStateMachine
4
- module ClassMethods
5
- def self.extended(base) #:nodoc:
6
- base.class_eval do
7
- @state_machines = MachineCollection.new
8
- end
9
- end
10
-
11
- # Gets the current list of state machines defined for this class. This
12
- # class-level attribute acts like an inheritable attribute. The attribute
13
- # is available to each subclass, each having a copy of its superclass's
14
- # attribute.
15
- #
16
- # The hash of state machines maps <tt>:attribute</tt> => +machine+, e.g.
17
- #
18
- # Vehicle.state_machines # => {:state => #<EnumStateMachine::Machine:0xb6f6e4a4 ...>}
19
- def state_machines
20
- @state_machines ||= superclass.state_machines.dup
21
- end
22
- end
23
-
24
- module InstanceMethods
25
- # Runs one or more events in parallel. All events will run through the
26
- # following steps:
27
- # * Before callbacks
28
- # * Persist state
29
- # * Invoke action
30
- # * After callbacks
31
- #
32
- # For example, if two events (for state machines A and B) are run in
33
- # parallel, the order in which steps are run is:
34
- # * A - Before transition callbacks
35
- # * B - Before transition callbacks
36
- # * A - Persist new state
37
- # * B - Persist new state
38
- # * A - Invoke action
39
- # * B - Invoke action (only if different than A's action)
40
- # * A - After transition callbacks
41
- # * B - After transition callbacks
42
- #
43
- # *Note* that multiple events on the same state machine / attribute cannot
44
- # be run in parallel. If this is attempted, an ArgumentError will be
45
- # raised.
46
- #
47
- # == Halting callbacks
48
- #
49
- # When running multiple events in parallel, special consideration should
50
- # be taken with regard to how halting within callbacks affects the flow.
51
- #
52
- # For *before* callbacks, any <tt>:halt</tt> error that's thrown will
53
- # immediately cancel the perform for all transitions. As a result, it's
54
- # possible for one event's transition to affect the continuation of
55
- # another.
56
- #
57
- # On the other hand, any <tt>:halt</tt> error that's thrown within an
58
- # *after* callback with only affect that event's transition. Other
59
- # transitions will continue to run their own callbacks.
60
- #
61
- # == Example
62
- #
63
- # class Vehicle
64
- # state_machine :initial => :parked do
65
- # event :ignite do
66
- # transition :parked => :idling
67
- # end
68
- #
69
- # event :park do
70
- # transition :idling => :parked
71
- # end
72
- # end
73
- #
74
- # state_machine :alarm_state, :namespace => 'alarm', :initial => :on do
75
- # event :enable do
76
- # transition all => :active
77
- # end
78
- #
79
- # event :disable do
80
- # transition all => :off
81
- # end
82
- # end
83
- # end
84
- #
85
- # vehicle = Vehicle.new # => #<Vehicle:0xb7c02850 @state="parked", @alarm_state="active">
86
- # vehicle.state # => "parked"
87
- # vehicle.alarm_state # => "active"
88
- #
89
- # vehicle.fire_events(:ignite, :disable_alarm) # => true
90
- # vehicle.state # => "idling"
91
- # vehicle.alarm_state # => "off"
92
- #
93
- # # If any event fails, the entire event chain fails
94
- # vehicle.fire_events(:ignite, :enable_alarm) # => false
95
- # vehicle.state # => "idling"
96
- # vehicle.alarm_state # => "off"
97
- #
98
- # # Exception raised on invalid event
99
- # vehicle.fire_events(:park, :invalid) # => EnumStateMachine::InvalidEvent: :invalid is an unknown event
100
- # vehicle.state # => "idling"
101
- # vehicle.alarm_state # => "off"
102
- def fire_events(*events)
103
- self.class.state_machines.fire_events(self, *events)
104
- end
105
-
106
- # Run one or more events in parallel. If any event fails to run, then
107
- # a EnumStateMachine::InvalidTransition exception will be raised.
108
- #
109
- # See EnumStateMachine::InstanceMethods#fire_events for more information.
110
- #
111
- # == Example
112
- #
113
- # class Vehicle
114
- # state_machine :initial => :parked do
115
- # event :ignite do
116
- # transition :parked => :idling
117
- # end
118
- #
119
- # event :park do
120
- # transition :idling => :parked
121
- # end
122
- # end
123
- #
124
- # state_machine :alarm_state, :namespace => 'alarm', :initial => :active do
125
- # event :enable do
126
- # transition all => :active
127
- # end
128
- #
129
- # event :disable do
130
- # transition all => :off
131
- # end
132
- # end
133
- # end
134
- #
135
- # vehicle = Vehicle.new # => #<Vehicle:0xb7c02850 @state="parked", @alarm_state="active">
136
- # vehicle.fire_events(:ignite, :disable_alarm) # => true
137
- #
138
- # vehicle.fire_events!(:ignite, :disable_alarm) # => EnumStateMachine::InvalidTranstion: Cannot run events in parallel: ignite, disable_alarm
139
- def fire_events!(*events)
140
- run_action = [true, false].include?(events.last) ? events.pop : true
141
- fire_events(*(events + [run_action])) || raise(EnumStateMachine::InvalidParallelTransition.new(self, events))
142
- end
143
-
144
- protected
145
- def initialize_state_machines(options = {}, &block) #:nodoc:
146
- self.class.state_machines.initialize_states(self, options, &block)
147
- end
148
- end
149
- end
@@ -1,92 +0,0 @@
1
- begin
2
- require 'rubygems'
3
- gem 'ruby-graphviz', '>=0.9.17'
4
- require 'graphviz'
5
- rescue LoadError => ex
6
- $stderr.puts "Cannot draw the machine (#{ex.message}). `gem install ruby-graphviz` >= v0.9.17 and try again."
7
- raise
8
- end
9
-
10
- require 'enum_state_machine/assertions'
11
-
12
- module EnumStateMachine
13
- # Provides a set of higher-order features on top of the raw GraphViz graphs
14
- class Graph < GraphViz
15
- include Assertions
16
-
17
- # The name of the font to draw state names in
18
- attr_reader :font
19
-
20
- # The graph's full filename
21
- attr_reader :file_path
22
-
23
- # The image format to generate the graph in
24
- attr_reader :file_format
25
-
26
- # Creates a new graph with the given name.
27
- #
28
- # Configuration options:
29
- # * <tt>:path</tt> - The path to write the graph file to. Default is the
30
- # current directory (".").
31
- # * <tt>:format</tt> - The image format to generate the graph in.
32
- # Default is "png'.
33
- # * <tt>:font</tt> - The name of the font to draw state names in.
34
- # Default is "Arial".
35
- # * <tt>:orientation</tt> - The direction of the graph ("portrait" or
36
- # "landscape"). Default is "portrait".
37
- def initialize(name, options = {})
38
- options = {:path => '.', :format => 'png', :font => 'Arial', :orientation => 'portrait'}.merge(options)
39
- assert_valid_keys(options, :path, :format, :font, :orientation)
40
-
41
- @font = options[:font]
42
- @file_path = File.join(options[:path], "#{name}.#{options[:format]}")
43
- @file_format = options[:format]
44
-
45
- super('G', :rankdir => options[:orientation] == 'landscape' ? 'LR' : 'TB')
46
- end
47
-
48
- # Generates the actual image file based on the nodes / edges added to the
49
- # graph. The path to the file is based on the configuration options for
50
- # this graph.
51
- def output
52
- super(@file_format => @file_path)
53
- end
54
-
55
- # Adds a new node to the graph. The font for the node will be automatically
56
- # set based on the graph configuration. The generated node will be returned.
57
- #
58
- # For example,
59
- #
60
- # graph = EnumStateMachine::Graph.new('test')
61
- # graph.add_nodes('parked', :label => 'Parked', :width => '1', :height => '1', :shape => 'ellipse')
62
- def add_nodes(*args)
63
- node = v0_api? ? add_node(*args) : super
64
- node.fontname = @font
65
- node
66
- end
67
-
68
- # Adds a new edge to the graph. The font for the edge will be automatically
69
- # set based on the graph configuration. The generated edge will be returned.
70
- #
71
- # For example,
72
- #
73
- # graph = EnumStateMachine::Graph.new('test')
74
- # graph.add_edges('parked', 'idling', :label => 'ignite')
75
- def add_edges(*args)
76
- edge = v0_api? ? add_edge(*args) : super
77
- edge.fontname = @font
78
- edge
79
- end
80
-
81
- private
82
- # Determines whether the old v0 api is in use
83
- def v0_api?
84
- version[0] == '0' || version[0] == '1' && version[1] == '0' && version[2] <= '2'
85
- end
86
-
87
- # The ruby-graphviz version data
88
- def version
89
- Constants::RGV_VERSION.split('.')
90
- end
91
- end
92
- end
@@ -1,17 +0,0 @@
1
- module EnumStateMachine
2
- # Represents a type of module that defines instance / class methods for a
3
- # state machine
4
- class HelperModule < Module #:nodoc:
5
- def initialize(machine, kind)
6
- @machine = machine
7
- @kind = kind
8
- end
9
-
10
- # Provides a human-readable description of the module
11
- def to_s
12
- owner_class = @machine.owner_class
13
- owner_class_name = owner_class.name && !owner_class.name.empty? ? owner_class.name : owner_class.to_s
14
- "#{owner_class_name} #{@machine.name.inspect} #{@kind} helpers"
15
- end
16
- end
17
- end
@@ -1,4 +0,0 @@
1
- # Load each application initializer
2
- Dir["#{File.dirname(__FILE__)}/initializers/*.rb"].sort.each do |path|
3
- require "enum_state_machine/initializers/#{File.basename(path)}"
4
- end
@@ -1,22 +0,0 @@
1
- if defined?(Rails)
2
- # Track all of the applicable locales to load
3
- locale_paths = []
4
- EnumStateMachine::Integrations.all.each do |integration|
5
- locale_paths << integration.locale_path if integration.available? && integration.locale_path
6
- end
7
-
8
- if defined?(Rails::Engine)
9
- # Rails 3.x
10
- class EnumStateMachine::RailsEngine < Rails::Engine
11
- rake_tasks do
12
- load 'tasks/enum_state_machine.rb'
13
- end
14
- end
15
-
16
- if Rails::VERSION::MAJOR == 3 && Rails::VERSION::MINOR == 0
17
- EnumStateMachine::RailsEngine.paths.config.locales = locale_paths
18
- else
19
- EnumStateMachine::RailsEngine.paths['config/locales'] = locale_paths
20
- end
21
- end
22
- end
@@ -1,97 +0,0 @@
1
- # Load each available integration
2
- require 'enum_state_machine/integrations/base'
3
- Dir["#{File.dirname(__FILE__)}/integrations/*.rb"].sort.each do |path|
4
- require "enum_state_machine/integrations/#{File.basename(path)}"
5
- end
6
-
7
- require 'enum_state_machine/error'
8
-
9
- module EnumStateMachine
10
- # An invalid integration was specified
11
- class IntegrationNotFound < Error
12
- def initialize(name)
13
- super(nil, "#{name.inspect} is an invalid integration")
14
- end
15
- end
16
-
17
- # Integrations allow state machines to take advantage of features within the
18
- # context of a particular library. This is currently most useful with
19
- # database libraries. For example, the various database integrations allow
20
- # state machines to hook into features like:
21
- # * Saving
22
- # * Transactions
23
- # * Observers
24
- # * Scopes
25
- # * Callbacks
26
- # * Validation errors
27
- #
28
- # This type of integration allows the user to work with state machines in a
29
- # fashion similar to other object models in their application.
30
- #
31
- # The integration interface is loosely defined by various unimplemented
32
- # methods in the EnumStateMachine::Machine class. See that class or the various
33
- # built-in integrations for more information about how to define additional
34
- # integrations.
35
- module Integrations
36
- # Attempts to find an integration that matches the given class. This will
37
- # look through all of the built-in integrations under the EnumStateMachine::Integrations
38
- # namespace and find one that successfully matches the class.
39
- #
40
- # == Examples
41
- #
42
- # class Vehicle
43
- # end
44
- #
45
- # class ActiveModelVehicle
46
- # include ActiveModel::Observing
47
- # include ActiveModel::Validations
48
- # end
49
- #
50
- # class ActiveRecordVehicle < ActiveRecord::Base
51
- # end
52
- #
53
- #
54
- # EnumStateMachine::Integrations.match(Vehicle) # => nil
55
- # EnumStateMachine::Integrations.match(ActiveModelVehicle) # => EnumStateMachine::Integrations::ActiveModel
56
- # EnumStateMachine::Integrations.match(ActiveRecordVehicle) # => EnumStateMachine::Integrations::ActiveRecord
57
- def self.match(klass)
58
- all.detect {|integration| integration.matches?(klass)}
59
- end
60
-
61
- # Attempts to find an integration that matches the given list of ancestors.
62
- # This will look through all of the built-in integrations under the EnumStateMachine::Integrations
63
- # namespace and find one that successfully matches one of the ancestors.
64
- #
65
- # == Examples
66
- #
67
- # EnumStateMachine::Integrations.match([]) # => nil
68
- # EnumStateMachine::Integrations.match(['ActiveRecord::Base') # => EnumStateMachine::Integrations::ActiveModel
69
- def self.match_ancestors(ancestors)
70
- all.detect {|integration| integration.matches_ancestors?(ancestors)}
71
- end
72
-
73
- # Finds an integration with the given name. If the integration cannot be
74
- # found, then a NameError exception will be raised.
75
- #
76
- # == Examples
77
- #
78
- # EnumStateMachine::Integrations.find_by_name(:active_record) # => EnumStateMachine::Integrations::ActiveRecord
79
- # EnumStateMachine::Integrations.find_by_name(:active_model) # => EnumStateMachine::Integrations::ActiveModel
80
- # EnumStateMachine::Integrations.find_by_name(:invalid) # => EnumStateMachine::IntegrationNotFound: :invalid is an invalid integration
81
- def self.find_by_name(name)
82
- all.detect {|integration| integration.integration_name == name} || raise(IntegrationNotFound.new(name))
83
- end
84
-
85
- # Gets a list of all of the available integrations for use. This will
86
- # always list the ActiveModel integration last.
87
- #
88
- # == Example
89
- #
90
- # EnumStateMachine::Integrations.all
91
- # # => [EnumStateMachine::Integrations::ActiveRecord, EnumStateMachine::Integrations::ActiveModel]
92
- def self.all
93
- constants = self.constants.map {|c| c.to_s}.select {|c| c != 'ActiveModel'}.sort << 'ActiveModel'
94
- constants.map {|c| const_get(c)}
95
- end
96
- end
97
- end