state_shifter 0.8.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +10 -12
- data/Gemfile.lock +94 -48
- data/README.md +163 -3
- data/VERSION +1 -1
- data/examples/advanced.rb +15 -3
- data/examples/review.rb +4 -1
- data/lib/state_shifter/definition/active_record_integration_methods.rb +15 -1
- data/lib/state_shifter/definition/class_methods.rb +70 -50
- data/lib/state_shifter/definition/contents.rb +26 -14
- data/lib/state_shifter/definition/instance_methods.rb +17 -18
- data/lib/state_shifter/definition.rb +1 -0
- data/lib/state_shifter/draw.rb +38 -0
- data/lib/state_shifter/event.rb +5 -0
- data/lib/state_shifter/railtie.rb +11 -0
- data/lib/state_shifter/state.rb +26 -4
- data/lib/state_shifter.rb +13 -7
- data/lib/tasks/state_shifter.rake +26 -0
- data/spec/state_shifter_spec.rb +82 -17
- data/state_shifter.gemspec +39 -26
- metadata +95 -75
@@ -2,51 +2,63 @@ module StateShifter
|
|
2
2
|
module Definition
|
3
3
|
class Contents
|
4
4
|
|
5
|
-
attr_accessor :states, :initial_state, :events, :on_transition_proc
|
5
|
+
attr_accessor :states, :initial_state, :events, :state_tags, :on_transition_proc
|
6
6
|
|
7
7
|
def initialize &definition
|
8
|
-
@states
|
9
|
-
@events
|
8
|
+
@states = {}
|
9
|
+
@events = {}
|
10
|
+
@state_tags = {}
|
10
11
|
instance_eval &definition if block_given?
|
11
12
|
end
|
12
13
|
|
13
14
|
def state name, &events_and_stuff
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
if @states.empty? # first state declared is the initial one
|
16
|
+
this_state = State.new(name, true)
|
17
|
+
@initial_state = this_state
|
18
|
+
else
|
19
|
+
this_state = State.new(name)
|
20
|
+
end
|
21
|
+
|
22
|
+
raise RedifiningState, this_state.name if @states.has_key?(this_state.name.to_sym)
|
23
|
+
|
19
24
|
@states[this_state.name.to_sym] = this_state
|
20
25
|
@current_state = this_state
|
21
26
|
instance_eval &events_and_stuff if events_and_stuff
|
22
27
|
end
|
23
28
|
|
29
|
+
def tags *names
|
30
|
+
names.each do |name|
|
31
|
+
@state_tags[name] ||= []
|
32
|
+
@state_tags[name] << @current_state.name
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
24
36
|
def event hash_or_sym, hash=nil
|
25
37
|
this_event =
|
26
38
|
if hash.nil?
|
27
39
|
if hash_or_sym.is_a?(Symbol)
|
28
40
|
# looping event
|
29
41
|
event_name = hash_or_sym
|
30
|
-
|
42
|
+
|
31
43
|
Event.new @current_state.name.to_sym, event_name
|
32
44
|
else
|
33
45
|
# normal event
|
34
46
|
event_guards = hash_or_sym.delete(:if)
|
35
47
|
event_name = hash_or_sym.keys.first
|
36
48
|
event_next_state = hash_or_sym[event_name.to_sym]
|
37
|
-
|
49
|
+
|
38
50
|
Event.new @current_state.name.to_sym, event_name, event_next_state, event_guards
|
39
51
|
end
|
40
52
|
else
|
41
53
|
event_guards = hash.delete(:if)
|
42
54
|
event_name = hash_or_sym
|
43
55
|
event_callback = hash.delete(:call)
|
44
|
-
|
56
|
+
|
45
57
|
Event.new @current_state.name.to_sym, event_name, @current_state.name.to_sym, event_guards, event_callback
|
46
58
|
end
|
47
59
|
|
48
|
-
raise
|
49
|
-
|
60
|
+
raise RedifiningEvent, this_event.name if @events.has_key?(this_event.name.to_sym)
|
61
|
+
|
50
62
|
@events[this_event.name.to_sym] = this_event
|
51
63
|
@current_state.events[event_name.to_sym] = this_event
|
52
64
|
end
|
@@ -56,7 +68,7 @@ module StateShifter
|
|
56
68
|
@current_state.entry_callback = proc_contents
|
57
69
|
else
|
58
70
|
@current_state.entry_callback = event_name
|
59
|
-
@current_state.entry_callback_args = ( event_args.size == 1 ? event_args.first : event_args )
|
71
|
+
@current_state.entry_callback_args = ( event_args.size == 1 ? event_args.first : event_args ) unless event_args.empty?
|
60
72
|
end
|
61
73
|
end
|
62
74
|
|
@@ -7,11 +7,11 @@ module StateShifter
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def get_current_state
|
10
|
-
instance_variable_defined?(:@current_state) ? @current_state : state_machine_definition.initial_state.name.to_sym
|
10
|
+
instance_variable_defined?(:@current_state) ? @current_state.to_sym : state_machine_definition.initial_state.name.to_sym
|
11
11
|
end
|
12
12
|
|
13
13
|
def set_current_state value
|
14
|
-
@current_state = value
|
14
|
+
@current_state = value.to_sym
|
15
15
|
end
|
16
16
|
|
17
17
|
def state_machine_definition
|
@@ -39,16 +39,13 @@ module StateShifter
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def names_for what
|
42
|
-
state_machine_definition.send(what).collect {|name, definition| name }
|
42
|
+
state_machine_definition.send(what).collect {|name, definition| name.to_sym }
|
43
43
|
end
|
44
44
|
|
45
45
|
def check_event_callbacks event_name
|
46
46
|
event_def = state_machine_definition.get(:event, event_name)
|
47
|
-
|
48
|
-
|
49
|
-
rescue NoMethodError
|
50
|
-
raise ::StateShifter::CallbackMethodNotDefined, event_def.callback
|
51
|
-
end
|
47
|
+
|
48
|
+
self.send event_def.callback
|
52
49
|
end
|
53
50
|
|
54
51
|
def current_state_def
|
@@ -60,14 +57,16 @@ module StateShifter
|
|
60
57
|
|
61
58
|
if proc_or_method_name.is_a?(Symbol)
|
62
59
|
method_args = current_state_def.entry_callback_args
|
63
|
-
|
60
|
+
|
61
|
+
if method_args
|
64
62
|
self.send proc_or_method_name, method_args
|
65
|
-
|
66
|
-
|
63
|
+
else
|
64
|
+
self.send proc_or_method_name
|
67
65
|
end
|
66
|
+
|
68
67
|
else
|
69
68
|
self.instance_exec(old_state, trigger.to_sym, &proc_or_method_name)
|
70
|
-
end
|
69
|
+
end
|
71
70
|
end
|
72
71
|
|
73
72
|
def transition args
|
@@ -75,20 +74,20 @@ module StateShifter
|
|
75
74
|
|
76
75
|
# BOOP!
|
77
76
|
old_state = get_current_state
|
78
|
-
set_current_state args[:to]
|
77
|
+
set_current_state args[:to]
|
79
78
|
#
|
80
79
|
|
81
|
-
|
80
|
+
self.instance_exec(old_state, get_current_state, args[:trigger].to_sym, (Time.now - _start), &state_machine_definition.on_transition_proc) if state_machine_definition.has_on_transition_proc?
|
82
81
|
|
83
82
|
call_state_entry_callback(args[:trigger], old_state) if current_state_def.has_entry_callback?
|
84
|
-
|
85
|
-
|
83
|
+
|
84
|
+
check_event_callbacks(args[:trigger]) if state_machine_definition.get(:event, args[:trigger]).has_callback?
|
86
85
|
|
87
86
|
true
|
88
87
|
end
|
89
88
|
|
90
89
|
def halt message
|
91
|
-
raise
|
90
|
+
raise TransitionHalted, message
|
92
91
|
end
|
93
92
|
|
94
93
|
def check_guards event_name
|
@@ -99,7 +98,7 @@ module StateShifter
|
|
99
98
|
begin
|
100
99
|
return false, guard unless self.send(guard.to_sym)
|
101
100
|
rescue NoMethodError
|
102
|
-
raise
|
101
|
+
raise GuardMethodUndefined, guard
|
103
102
|
end
|
104
103
|
end
|
105
104
|
true
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module StateShifter
|
2
|
+
|
3
|
+
class Draw
|
4
|
+
|
5
|
+
gem 'ruby-graphviz', '>=0.9.0'
|
6
|
+
require 'graphviz'
|
7
|
+
|
8
|
+
def self.graph klasses, options
|
9
|
+
klasses.split(',').each do |klass|
|
10
|
+
this_class = eval(klass)
|
11
|
+
|
12
|
+
graph = GraphViz.new(:G, :rankdir => options[:orientation] == 'landscape' ? 'LR' : 'TB')
|
13
|
+
|
14
|
+
this_class.state_machine_definition.states.each do |state_name, state_definition|
|
15
|
+
node = state_definition.draw(graph, options)
|
16
|
+
node.fontname = options[:font] if options[:font]
|
17
|
+
end
|
18
|
+
|
19
|
+
this_class.state_machine_definition.events.each do |event_name, event_definition|
|
20
|
+
edge = event_definition.draw(graph, options)
|
21
|
+
edge.fontname = options[:font] if options[:font]
|
22
|
+
end
|
23
|
+
|
24
|
+
graphvizVersion = Constants::RGV_VERSION.split('.')
|
25
|
+
|
26
|
+
if graphvizVersion[0] == '0' && graphvizVersion[1] == '9' && graphvizVersion[2] == '0'
|
27
|
+
output_options = {:output => options[:format], :file => options[:output_filename]}
|
28
|
+
else
|
29
|
+
output_options = {options[:format] => options[:output_filename]}
|
30
|
+
end
|
31
|
+
|
32
|
+
graph.output(output_options)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
data/lib/state_shifter/event.rb
CHANGED
data/lib/state_shifter/state.rb
CHANGED
@@ -1,21 +1,43 @@
|
|
1
1
|
module StateShifter
|
2
2
|
|
3
3
|
class State
|
4
|
-
|
5
|
-
attr_reader :name, :events
|
4
|
+
|
5
|
+
attr_reader :name, :events, :initial
|
6
6
|
attr_accessor :entry_callback, :entry_callback_args
|
7
7
|
|
8
|
-
def initialize name
|
8
|
+
def initialize name, initial=false
|
9
9
|
@name = name
|
10
10
|
@events = {}
|
11
|
+
@initial = initial
|
11
12
|
@entry_callback = nil
|
12
|
-
@entry_callback_args =
|
13
|
+
@entry_callback_args = nil
|
13
14
|
end
|
14
15
|
|
15
16
|
def has_entry_callback?
|
16
17
|
!@entry_callback.nil?
|
17
18
|
end
|
18
19
|
|
20
|
+
def initial?
|
21
|
+
@initial
|
22
|
+
end
|
23
|
+
|
24
|
+
def final?
|
25
|
+
@events.empty?
|
26
|
+
end
|
27
|
+
|
28
|
+
def draw graph, options
|
29
|
+
node = graph.add_nodes(@name.to_s,
|
30
|
+
:label => @name.to_s,
|
31
|
+
:width => '1',
|
32
|
+
:height => '1',
|
33
|
+
:shape => final? ? 'doublecircle' : 'ellipse'
|
34
|
+
)
|
35
|
+
|
36
|
+
graph.add_edges(graph.add_nodes('starting_state', :shape => 'point'), node) if initial?
|
37
|
+
|
38
|
+
node
|
39
|
+
end
|
40
|
+
|
19
41
|
end
|
20
42
|
|
21
43
|
end
|
data/lib/state_shifter.rb
CHANGED
@@ -5,12 +5,18 @@ require 'state_shifter/definition/contents'
|
|
5
5
|
require 'state_shifter/definition/class_methods'
|
6
6
|
require 'state_shifter/definition/instance_methods'
|
7
7
|
require 'state_shifter/definition/active_record_integration_methods'
|
8
|
+
require 'state_shifter/draw'
|
8
9
|
|
9
|
-
|
10
|
-
class ::StateShifter::GuardMethodUndefined < Exception ; end
|
11
|
-
class ::StateShifter::GuardNotSatisfied < Exception ; end
|
12
|
-
class ::StateShifter::CallbackMethodNotDefined < Exception ; end
|
13
|
-
class ::StateShifter::RedifiningEvent < Exception ; end
|
14
|
-
class ::StateShifter::RedifiningState < Exception ; end
|
15
|
-
class ::StateShifter::PersistenceAttributeAlreadyDefined < Exception ; end
|
10
|
+
require 'state_shifter/railtie' if defined?(Rails)
|
16
11
|
|
12
|
+
module StateShifter
|
13
|
+
|
14
|
+
class TransitionHalted < Exception ; end
|
15
|
+
class GuardMethodUndefined < Exception ; end
|
16
|
+
class GuardNotSatisfied < Exception ; end
|
17
|
+
class CallbackMethodNotDefined < Exception ; end
|
18
|
+
class RedifiningEvent < Exception ; end
|
19
|
+
class RedifiningState < Exception ; end
|
20
|
+
class PersistenceAttributeAlreadyDefined < Exception ; end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
namespace :state_shifter do
|
2
|
+
desc 'Draws state machines using GraphViz (options: CLASS=User,Vehicle; FONT=Arial; FORMAT=png; ORIENTATION=portrait; OUTPUT_FILENAME=filename)'
|
3
|
+
task :draw do
|
4
|
+
|
5
|
+
unless ENV['CLASS']
|
6
|
+
puts 'you need to specify at least one CLASS'
|
7
|
+
exit 1
|
8
|
+
end
|
9
|
+
|
10
|
+
options = {}
|
11
|
+
|
12
|
+
options[:format] = ENV['FORMAT'] || 'png'
|
13
|
+
options[:output_filename] = ENV['OUTPUT_FILENAME'] || "#{ENV['CLASS']}.#{options[:format]}"
|
14
|
+
options[:font] = ENV['FONT'] || 'Arial'
|
15
|
+
options[:orientation] = ENV['ORIENTATION'] || 'portrait'
|
16
|
+
|
17
|
+
if defined?(Rails)
|
18
|
+
Rake::Task['environment'].invoke
|
19
|
+
else
|
20
|
+
$:.unshift(File.dirname(__FILE__) + '/..')
|
21
|
+
require 'state_shifter'
|
22
|
+
end
|
23
|
+
|
24
|
+
StateShifter::Draw.graph(ENV['CLASS'], options)
|
25
|
+
end
|
26
|
+
end
|
data/spec/state_shifter_spec.rb
CHANGED
@@ -5,7 +5,7 @@ require_relative '../examples/review'
|
|
5
5
|
require_relative '../examples/review_custom_persistence'
|
6
6
|
|
7
7
|
shared_examples_for 'a simple state machine' do
|
8
|
-
|
8
|
+
|
9
9
|
before(:each) do
|
10
10
|
@state_machine = described_class.new
|
11
11
|
@state_machine.save if @state_machine.class < ActiveRecord::Base
|
@@ -20,6 +20,8 @@ shared_examples_for 'a simple state machine' do
|
|
20
20
|
@state_machine.initial_state.should == :new
|
21
21
|
@state_machine.current_state.should == :new
|
22
22
|
|
23
|
+
@state_machine.current_state_def.initial?.should be_true
|
24
|
+
|
23
25
|
@state_machine.submit
|
24
26
|
@state_machine.initial_state.should == :new
|
25
27
|
|
@@ -78,6 +80,8 @@ shared_examples_for 'a simple state machine' do
|
|
78
80
|
@state_machine.next_states.should == [:awaiting_review]
|
79
81
|
@state_machine.transitionable_states.should == [:awaiting_review]
|
80
82
|
|
83
|
+
@state_machine.current_state_def.final?.should be_false
|
84
|
+
|
81
85
|
@state_machine.submit!
|
82
86
|
@state_machine.next_states.should == [:being_reviewed]
|
83
87
|
@state_machine.transitionable_states.should == [:being_reviewed]
|
@@ -89,6 +93,8 @@ shared_examples_for 'a simple state machine' do
|
|
89
93
|
@state_machine.accept
|
90
94
|
@state_machine.next_states.should == []
|
91
95
|
@state_machine.transitionable_states.should == []
|
96
|
+
|
97
|
+
@state_machine.current_state_def.final?.should be_true
|
92
98
|
end
|
93
99
|
|
94
100
|
it 'should respect proper transition precedence' do
|
@@ -99,7 +105,7 @@ shared_examples_for 'a simple state machine' do
|
|
99
105
|
end
|
100
106
|
|
101
107
|
describe Simple do
|
102
|
-
|
108
|
+
|
103
109
|
it_should_behave_like 'a simple state machine'
|
104
110
|
|
105
111
|
end
|
@@ -127,24 +133,12 @@ describe 'Advanced state machine functionality' do
|
|
127
133
|
end
|
128
134
|
|
129
135
|
it 'should complain about undefined guards' do
|
130
|
-
advanced
|
131
|
-
lambda { advanced.can_start_date_reached?}.should raise_error(StateShifter::GuardMethodUndefined, 'start_date_reached?')
|
132
|
-
end
|
133
|
-
|
134
|
-
it 'should complain about undefined callbacks on state entry' do
|
135
|
-
advanced = Advanced.new
|
136
|
-
advanced.forced_start!
|
137
|
-
|
138
|
-
lambda { advanced.deadline_reached }.should raise_error(StateShifter::CallbackMethodNotDefined, 'send_notification_to_organizers')
|
139
|
-
end
|
140
|
-
|
141
|
-
it 'should complain about looping event callbacks not being defined' do
|
142
|
-
lambda { @advanced.start_date_changed }.should raise_error(StateShifter::CallbackMethodNotDefined, 'handle_start_date_changed')
|
136
|
+
lambda { @advanced.can_start_date_reached?}.should raise_error(StateShifter::GuardMethodUndefined, 'start_date_reached?')
|
143
137
|
end
|
144
138
|
|
145
139
|
it 'should call looping event callbacks' do
|
146
140
|
@advanced.stub!(:handle_start_date_changed)
|
147
|
-
|
141
|
+
|
148
142
|
@advanced.should_receive(:handle_start_date_changed)
|
149
143
|
@advanced.start_date_changed
|
150
144
|
end
|
@@ -155,7 +149,7 @@ describe 'Advanced state machine functionality' do
|
|
155
149
|
@advanced.forced_start
|
156
150
|
|
157
151
|
# method name only
|
158
|
-
@advanced.should_receive(:send_notification_to_organizers)
|
152
|
+
@advanced.should_receive(:send_notification_to_organizers).with(no_args())
|
159
153
|
@advanced.deadline_reached!
|
160
154
|
end
|
161
155
|
|
@@ -181,6 +175,12 @@ describe 'Advanced state machine functionality' do
|
|
181
175
|
@advanced.forced_start!
|
182
176
|
end
|
183
177
|
|
178
|
+
it 'the on_transition callback should work in the proper order' do
|
179
|
+
@advanced.should_receive(:benchmark).ordered.with(:initialized, :preparing, :event_associated!, an_instance_of(Float)).and_return(nil)
|
180
|
+
@advanced.should_receive(:benchmark).ordered.with(:preparing, :running, :all_done!, an_instance_of(Float)).and_return(nil)
|
181
|
+
@advanced.event_associated!
|
182
|
+
end
|
183
|
+
|
184
184
|
end
|
185
185
|
|
186
186
|
describe Review do
|
@@ -197,8 +197,58 @@ describe Review do
|
|
197
197
|
end
|
198
198
|
end
|
199
199
|
|
200
|
+
after(:each) do
|
201
|
+
described_class.destroy_all
|
202
|
+
end
|
203
|
+
|
200
204
|
it_should_behave_like 'a simple state machine'
|
201
205
|
|
206
|
+
it "should tolerate strings as state names" do
|
207
|
+
state_machine = described_class.new
|
208
|
+
state_machine.save
|
209
|
+
|
210
|
+
state_machine.current_state.should == :new
|
211
|
+
state_machine.update_attribute(:current_state, "new")
|
212
|
+
|
213
|
+
state_machine.new?.should be_true
|
214
|
+
|
215
|
+
state_machine.submit
|
216
|
+
state_machine.initial_state.should == :new
|
217
|
+
|
218
|
+
state_machine.current_state.should == :awaiting_review
|
219
|
+
end
|
220
|
+
|
221
|
+
it "should have tag methods" do
|
222
|
+
described_class.reviewable_states.should eq([:new, :awaiting_review, :being_reviewed])
|
223
|
+
|
224
|
+
state_machine = described_class.new
|
225
|
+
state_machine.save
|
226
|
+
|
227
|
+
state_machine.reviewable?.should be_true
|
228
|
+
state_machine.processing?.should be_false
|
229
|
+
|
230
|
+
state_machine.submit
|
231
|
+
state_machine.reviewable?.should be_true
|
232
|
+
state_machine.processing?.should be_true
|
233
|
+
|
234
|
+
state_machine.review!
|
235
|
+
state_machine.reviewable?.should be_true
|
236
|
+
state_machine.processing?.should be_true
|
237
|
+
|
238
|
+
state_machine.accept!
|
239
|
+
state_machine.reviewable?.should be_false
|
240
|
+
state_machine.processing?.should be_false
|
241
|
+
end
|
242
|
+
|
243
|
+
it "should have state scopes" do
|
244
|
+
state_machine = described_class.new
|
245
|
+
state_machine.save
|
246
|
+
state_machine.submit
|
247
|
+
|
248
|
+
described_class.awaiting_review.size.should eq(1)
|
249
|
+
described_class.reviewable.size.should eq(1)
|
250
|
+
end
|
251
|
+
|
202
252
|
end
|
203
253
|
|
204
254
|
describe ReviewCustomPersistence do
|
@@ -217,6 +267,21 @@ describe ReviewCustomPersistence do
|
|
217
267
|
|
218
268
|
it_should_behave_like 'a simple state machine'
|
219
269
|
|
270
|
+
it "should tolerate strings as state names" do
|
271
|
+
state_machine = described_class.new
|
272
|
+
state_machine.save
|
273
|
+
|
274
|
+
state_machine.current_state.should == :new
|
275
|
+
state_machine.update_attribute(:stamp, "new")
|
276
|
+
|
277
|
+
state_machine.new?.should be_true
|
278
|
+
|
279
|
+
state_machine.submit
|
280
|
+
state_machine.initial_state.should == :new
|
281
|
+
|
282
|
+
state_machine.current_state.should == :awaiting_review
|
283
|
+
end
|
284
|
+
|
220
285
|
end
|
221
286
|
|
222
287
|
describe 'Malformed persistence definition' do
|
data/state_shifter.gemspec
CHANGED
@@ -2,14 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
+
# stub: state_shifter 1.0.3 ruby lib
|
5
6
|
|
6
7
|
Gem::Specification.new do |s|
|
7
8
|
s.name = "state_shifter"
|
8
|
-
s.version = "0.
|
9
|
+
s.version = "1.0.3"
|
9
10
|
|
10
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib"]
|
11
13
|
s.authors = ["Bruno Antunes"]
|
12
|
-
s.date = "
|
14
|
+
s.date = "2015-04-10"
|
13
15
|
s.description = "state_shifter is a gem that adds state machine behavior to a class"
|
14
16
|
s.email = "sardaukar.siet@gmail.com"
|
15
17
|
s.extra_rdoc_files = [
|
@@ -38,55 +40,66 @@ Gem::Specification.new do |s|
|
|
38
40
|
"lib/state_shifter/definition/class_methods.rb",
|
39
41
|
"lib/state_shifter/definition/contents.rb",
|
40
42
|
"lib/state_shifter/definition/instance_methods.rb",
|
43
|
+
"lib/state_shifter/draw.rb",
|
41
44
|
"lib/state_shifter/event.rb",
|
45
|
+
"lib/state_shifter/railtie.rb",
|
42
46
|
"lib/state_shifter/state.rb",
|
47
|
+
"lib/tasks/state_shifter.rake",
|
43
48
|
"spec/spec_helper.rb",
|
44
49
|
"spec/state_shifter_spec.rb",
|
45
50
|
"state_shifter.gemspec"
|
46
51
|
]
|
47
52
|
s.homepage = "http://github.com/sardaukar/state_shifter"
|
48
53
|
s.licenses = ["MIT"]
|
49
|
-
s.
|
50
|
-
s.rubygems_version = "1.8.24"
|
54
|
+
s.rubygems_version = "2.4.5"
|
51
55
|
s.summary = "state_shifter is a gem that adds state machine behavior to a class"
|
52
56
|
|
53
57
|
if s.respond_to? :specification_version then
|
54
|
-
s.specification_version =
|
58
|
+
s.specification_version = 4
|
55
59
|
|
56
60
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
57
|
-
s.add_development_dependency(%q<activerecord>, ["~>
|
58
|
-
s.add_development_dependency(%q<sqlite3>, ["
|
59
|
-
s.add_development_dependency(%q<rspec
|
60
|
-
s.add_development_dependency(%q<rspec>, ["~> 2.9.0"])
|
61
|
+
s.add_development_dependency(%q<activerecord>, ["~> 4.0.9"])
|
62
|
+
s.add_development_dependency(%q<sqlite3>, ["~> 1.3.10"])
|
63
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
61
64
|
s.add_development_dependency(%q<yard>, ["~> 0.7"])
|
62
|
-
s.add_development_dependency(%q<redcarpet>, [">=
|
63
|
-
s.add_development_dependency(%q<rdoc>, ["~>
|
64
|
-
s.add_development_dependency(%q<bundler>, ["
|
65
|
+
s.add_development_dependency(%q<redcarpet>, [">= 3.2.3"])
|
66
|
+
s.add_development_dependency(%q<rdoc>, ["~> 4.0"])
|
67
|
+
s.add_development_dependency(%q<bundler>, [">= 0"])
|
65
68
|
s.add_development_dependency(%q<jeweler>, ["~> 1.8.4"])
|
66
69
|
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
70
|
+
s.add_development_dependency(%q<pry>, [">= 0"])
|
71
|
+
s.add_development_dependency(%q<ruby-graphviz>, [">= 0"])
|
72
|
+
s.add_development_dependency(%q<json>, [">= 1.8.2"])
|
73
|
+
s.add_development_dependency(%q<i18n>, [">= 0.6.6"])
|
67
74
|
else
|
68
|
-
s.add_dependency(%q<activerecord>, ["~>
|
69
|
-
s.add_dependency(%q<sqlite3>, ["
|
70
|
-
s.add_dependency(%q<rspec
|
71
|
-
s.add_dependency(%q<rspec>, ["~> 2.9.0"])
|
75
|
+
s.add_dependency(%q<activerecord>, ["~> 4.0.9"])
|
76
|
+
s.add_dependency(%q<sqlite3>, ["~> 1.3.10"])
|
77
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
72
78
|
s.add_dependency(%q<yard>, ["~> 0.7"])
|
73
|
-
s.add_dependency(%q<redcarpet>, [">=
|
74
|
-
s.add_dependency(%q<rdoc>, ["~>
|
75
|
-
s.add_dependency(%q<bundler>, ["
|
79
|
+
s.add_dependency(%q<redcarpet>, [">= 3.2.3"])
|
80
|
+
s.add_dependency(%q<rdoc>, ["~> 4.0"])
|
81
|
+
s.add_dependency(%q<bundler>, [">= 0"])
|
76
82
|
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
77
83
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
84
|
+
s.add_dependency(%q<pry>, [">= 0"])
|
85
|
+
s.add_dependency(%q<ruby-graphviz>, [">= 0"])
|
86
|
+
s.add_dependency(%q<json>, [">= 1.8.2"])
|
87
|
+
s.add_dependency(%q<i18n>, [">= 0.6.6"])
|
78
88
|
end
|
79
89
|
else
|
80
|
-
s.add_dependency(%q<activerecord>, ["~>
|
81
|
-
s.add_dependency(%q<sqlite3>, ["
|
82
|
-
s.add_dependency(%q<rspec
|
83
|
-
s.add_dependency(%q<rspec>, ["~> 2.9.0"])
|
90
|
+
s.add_dependency(%q<activerecord>, ["~> 4.0.9"])
|
91
|
+
s.add_dependency(%q<sqlite3>, ["~> 1.3.10"])
|
92
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
84
93
|
s.add_dependency(%q<yard>, ["~> 0.7"])
|
85
|
-
s.add_dependency(%q<redcarpet>, [">=
|
86
|
-
s.add_dependency(%q<rdoc>, ["~>
|
87
|
-
s.add_dependency(%q<bundler>, ["
|
94
|
+
s.add_dependency(%q<redcarpet>, [">= 3.2.3"])
|
95
|
+
s.add_dependency(%q<rdoc>, ["~> 4.0"])
|
96
|
+
s.add_dependency(%q<bundler>, [">= 0"])
|
88
97
|
s.add_dependency(%q<jeweler>, ["~> 1.8.4"])
|
89
98
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
99
|
+
s.add_dependency(%q<pry>, [">= 0"])
|
100
|
+
s.add_dependency(%q<ruby-graphviz>, [">= 0"])
|
101
|
+
s.add_dependency(%q<json>, [">= 1.8.2"])
|
102
|
+
s.add_dependency(%q<i18n>, [">= 0.6.6"])
|
90
103
|
end
|
91
104
|
end
|
92
105
|
|