simple_state_machine 0.5.2 → 0.6.1
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/.github/workflows/build.yml +46 -0
- data/.gitignore +3 -0
- data/.travis.yml +17 -0
- data/Changelog.rdoc +16 -0
- data/Gemfile +7 -0
- data/README.rdoc +154 -99
- data/examples/conversation.rb +5 -5
- data/examples/lamp.rb +5 -5
- data/examples/relationship.rb +8 -8
- data/examples/traffic_light.rb +3 -3
- data/examples/user.rb +8 -4
- data/gemfiles/Gemfile.activerecord-5.2.x +9 -0
- data/gemfiles/Gemfile.activerecord-6.0.x +9 -0
- data/gemfiles/Gemfile.activerecord-6.1.x +8 -0
- data/gemfiles/Gemfile.activerecord-main.x +9 -0
- data/gemfiles/Gemfile.basic +6 -0
- data/lib/simple_state_machine/.DS_Store +0 -0
- data/lib/simple_state_machine/active_record.rb +2 -64
- data/lib/simple_state_machine/decorator/active_record.rb +68 -0
- data/lib/simple_state_machine/decorator/default.rb +91 -0
- data/lib/simple_state_machine/railtie.rb +1 -1
- data/lib/simple_state_machine/simple_state_machine.rb +8 -251
- data/lib/simple_state_machine/state_machine.rb +88 -0
- data/lib/simple_state_machine/state_machine_definition.rb +72 -0
- data/lib/simple_state_machine/tools/graphviz.rb +21 -0
- data/lib/simple_state_machine/tools/inspector.rb +44 -0
- data/lib/simple_state_machine/transition.rb +40 -0
- data/lib/simple_state_machine/version.rb +1 -1
- data/lib/simple_state_machine.rb +13 -3
- data/lib/tasks/graphviz.rake +31 -0
- data/simple_state_machine.gemspec +14 -24
- data/spec/.DS_Store +0 -0
- data/spec/active_record_spec.rb +216 -179
- data/spec/{decorator_spec.rb → decorator/default_spec.rb} +32 -32
- data/spec/examples_spec.rb +17 -17
- data/spec/mountable_spec.rb +26 -14
- data/spec/simple_state_machine_spec.rb +128 -92
- data/spec/spec_helper.rb +18 -5
- data/spec/state_machine_definition_spec.rb +48 -34
- data/spec/state_machine_spec.rb +36 -2
- data/spec/tools/graphviz_spec.rb +30 -0
- data/spec/tools/inspector_spec.rb +70 -0
- metadata +54 -128
- data/autotest/discover.rb +0 -1
- data/lib/tasks/graphiz.rake +0 -13
- data/rails/graphiz.rake +0 -16
@@ -1,25 +1,25 @@
|
|
1
|
-
require
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe SimpleStateMachine::StateMachineDefinition do
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
let(:klass) do
|
6
|
+
Class.new do
|
7
7
|
extend SimpleStateMachine
|
8
8
|
def initialize(state = 'state1')
|
9
9
|
@state = state
|
10
10
|
end
|
11
|
-
event :event1, :state1 => :state2, :state2 => :state3
|
11
|
+
event :event1, :state1 => :state2, :state2 => :state3
|
12
12
|
end
|
13
|
-
@smd = @klass.state_machine_definition
|
14
13
|
end
|
14
|
+
let(:smd) { klass.state_machine_definition }
|
15
15
|
|
16
16
|
it "is inherited by subclasses" do
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
17
|
+
subject = Class.new(klass).new
|
18
|
+
expect(subject).to be_state1
|
19
|
+
subject.event1
|
20
|
+
expect(subject).to be_state2
|
21
|
+
subject.event1
|
22
|
+
expect(subject).to be_state3
|
23
23
|
end
|
24
24
|
|
25
25
|
describe '#state_method' do
|
@@ -39,51 +39,65 @@ describe SimpleStateMachine::StateMachineDefinition do
|
|
39
39
|
end
|
40
40
|
|
41
41
|
it "is used when changing state" do
|
42
|
-
subject.ssm_state.
|
42
|
+
expect(subject.ssm_state).to eq('state1')
|
43
43
|
subject.event1
|
44
|
-
subject.ssm_state.
|
44
|
+
expect(subject.ssm_state).to eq('state2')
|
45
45
|
subject.event2
|
46
|
-
subject.ssm_state.
|
46
|
+
expect(subject.ssm_state).to eq('state3')
|
47
47
|
end
|
48
48
|
|
49
49
|
it "works with state helper methods" do
|
50
|
-
subject.
|
50
|
+
expect(subject).to be_state1
|
51
51
|
subject.event1
|
52
|
-
subject.
|
52
|
+
expect(subject).to be_state2
|
53
53
|
subject.event2
|
54
|
-
subject.
|
54
|
+
expect(subject).to be_state3
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
it "raise an error if an invalid state_transition is called" do
|
58
|
-
|
58
|
+
expect { subject.event2 }.to raise_error(SimpleStateMachine::IllegalStateTransitionError, "You cannot 'event2' when state is 'state1'")
|
59
59
|
end
|
60
60
|
|
61
61
|
end
|
62
62
|
|
63
|
-
describe
|
64
|
-
|
65
|
-
|
66
|
-
|
63
|
+
describe '#default_error_state' do
|
64
|
+
subject do
|
65
|
+
klass = Class.new do
|
66
|
+
attr_reader :state
|
67
|
+
extend SimpleStateMachine
|
68
|
+
state_machine_definition.default_error_state = :failed
|
69
|
+
|
70
|
+
def initialize(state = 'state1')
|
71
|
+
@state = state
|
72
|
+
end
|
73
|
+
|
74
|
+
def event1
|
75
|
+
raise "Some error during event"
|
76
|
+
end
|
77
|
+
event :event1, :state1 => :state2
|
78
|
+
end
|
79
|
+
klass.new
|
67
80
|
end
|
68
|
-
end
|
69
81
|
|
70
|
-
|
71
|
-
|
72
|
-
|
82
|
+
it "is set when an error occurs during an event" do
|
83
|
+
expect(subject.state).to eq('state1')
|
84
|
+
subject.event1
|
85
|
+
expect(subject.state).to eq('failed')
|
73
86
|
end
|
74
87
|
end
|
75
88
|
|
76
|
-
describe "#
|
77
|
-
it "
|
78
|
-
|
89
|
+
describe "#transitions" do
|
90
|
+
it "has a list of transitions" do
|
91
|
+
expect(smd.transitions).to be_a(Array)
|
92
|
+
expect(smd.transitions.first).to be_a(SimpleStateMachine::Transition)
|
79
93
|
end
|
80
94
|
end
|
81
95
|
|
82
|
-
describe "#
|
83
|
-
it "
|
84
|
-
|
85
|
-
@smd.google_chart_url.should == "http://chart.googleapis.com/chart?cht=gv&chl=digraph{#{::CGI.escape @smd.to_graphiz_dot}}"
|
96
|
+
describe "#to_s" do
|
97
|
+
it "converts to readable string format" do
|
98
|
+
expect(smd.to_s).to match(Regexp.new("state1.event1! => state2"))
|
86
99
|
end
|
87
100
|
end
|
101
|
+
|
88
102
|
end
|
89
103
|
|
data/spec/state_machine_spec.rb
CHANGED
@@ -14,11 +14,45 @@ describe SimpleStateMachine::StateMachine do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
it "returns the next state for the event and current state" do
|
17
|
-
subject.next_state('event1').
|
17
|
+
expect(subject.next_state('event1')).to eq('state2')
|
18
18
|
end
|
19
19
|
|
20
20
|
it "returns nil if no next state for the event and current state exists" do
|
21
|
-
subject.next_state('event2').
|
21
|
+
expect(subject.next_state('event2')).to be_nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#raised_error" do
|
26
|
+
context "given an error can be caught" do
|
27
|
+
let(:class_with_error) do
|
28
|
+
Class.new do
|
29
|
+
extend SimpleStateMachine
|
30
|
+
def initialize(state = 'state1'); @state = state; end
|
31
|
+
def raise_error
|
32
|
+
raise "Something went wrong"
|
33
|
+
end
|
34
|
+
event :raise_error, :state1 => :state2,
|
35
|
+
RuntimeError => :failed
|
36
|
+
event :retry, :failed => :success
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
subject do
|
41
|
+
class_with_error.new.tap{|i| i.raise_error }
|
42
|
+
end
|
43
|
+
|
44
|
+
it "the raised error is accessible" do
|
45
|
+
raised_error = subject.state_machine.raised_error
|
46
|
+
expect(raised_error).to be_a(RuntimeError)
|
47
|
+
expect(raised_error.message).to eq("Something went wrong")
|
48
|
+
end
|
49
|
+
|
50
|
+
it "the raised error is set to nil on the next transition" do
|
51
|
+
expect(subject.state_machine.raised_error).to be
|
52
|
+
subject.retry
|
53
|
+
expect(subject.state_machine.raised_error).not_to be
|
54
|
+
end
|
55
|
+
|
22
56
|
end
|
23
57
|
end
|
24
58
|
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SimpleStateMachine::Tools::Graphviz do
|
4
|
+
|
5
|
+
before do
|
6
|
+
@klass = Class.new do
|
7
|
+
extend SimpleStateMachine
|
8
|
+
def initialize(state = 'state1')
|
9
|
+
@state = state
|
10
|
+
end
|
11
|
+
event :event1, :state1 => :state2, :state2 => :state3
|
12
|
+
end
|
13
|
+
@smd = @klass.state_machine_definition
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#to_graphviz_dot" do
|
17
|
+
it "converts to graphviz dot format" do
|
18
|
+
expect(@smd.to_graphviz_dot).to eq(%(digraph G {\n"state1"->"state2"[label=event1];\n"state2"->"state3"[label=event1]\n}))
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#google_chart_url" do
|
23
|
+
it "shows the state and event dependencies as a Google chart" do
|
24
|
+
graph = @smd.transitions.map { |t| t.to_graphviz_dot }.sort.join(";")
|
25
|
+
expect(@smd.google_chart_url).to eq("http://chart.googleapis.com/chart?cht=gv&chl=digraph{#{::CGI.escape graph}}")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SimpleStateMachine::Tools::Inspector do
|
4
|
+
|
5
|
+
describe "#begin_states" do
|
6
|
+
before do
|
7
|
+
@klass = Class.new(SimpleStateMachine::StateMachineDefinition) do
|
8
|
+
def add_events
|
9
|
+
define_event(:event_a, :state1 => :state2)
|
10
|
+
define_event(:event_b, :state2 => :state3)
|
11
|
+
define_event(:event_c, :state1 => :state3)
|
12
|
+
define_event(:event_c, RuntimeError => :state3)
|
13
|
+
end
|
14
|
+
|
15
|
+
def decorator_class
|
16
|
+
SimpleStateMachine::Decorator::Default
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it "returns all 'from' states that aren't 'to' states" do
|
22
|
+
expect(@klass.new.begin_states).to eq([:state1, RuntimeError])
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#end_states" do
|
27
|
+
before do
|
28
|
+
@klass = Class.new(SimpleStateMachine::StateMachineDefinition) do
|
29
|
+
def add_events
|
30
|
+
define_event(:event_a, :state1 => :state2)
|
31
|
+
define_event(:event_b, :state2 => :state3)
|
32
|
+
define_event(:event_c, :state1 => :state3)
|
33
|
+
end
|
34
|
+
|
35
|
+
def decorator_class
|
36
|
+
SimpleStateMachine::Decorator::Default
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
it "returns all 'to' states that aren't 'from' states" do
|
43
|
+
expect(@klass.new.end_states).to eq([:state3])
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#states" do
|
48
|
+
before do
|
49
|
+
@klass = Class.new(SimpleStateMachine::StateMachineDefinition) do
|
50
|
+
def add_events
|
51
|
+
define_event(:event_a, :state1 => :state2)
|
52
|
+
define_event(:event_b, :state2 => :state3)
|
53
|
+
define_event(:event_c, :state1 => :state3)
|
54
|
+
end
|
55
|
+
|
56
|
+
def decorator_class
|
57
|
+
SimpleStateMachine::Decorator::Default
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
it "returns all states" do
|
64
|
+
expect(@klass.new.states.map(&:to_s).sort).to eq(%w{state1 state2 state3})
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
|
metadata
CHANGED
@@ -1,176 +1,102 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_state_machine
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 5
|
9
|
-
- 2
|
10
|
-
version: 0.5.2
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.6.1
|
11
5
|
platform: ruby
|
12
|
-
authors:
|
6
|
+
authors:
|
13
7
|
- Marek de Heus
|
14
8
|
- Petrik de Heus
|
15
|
-
autorequire:
|
9
|
+
autorequire:
|
16
10
|
bindir: bin
|
17
11
|
cert_chain: []
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
- !ruby/object:Gem::Dependency
|
23
|
-
name: rake
|
24
|
-
prerelease: false
|
25
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
|
-
requirements:
|
28
|
-
- - ">="
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
hash: 3
|
31
|
-
segments:
|
32
|
-
- 0
|
33
|
-
version: "0"
|
34
|
-
type: :development
|
35
|
-
version_requirements: *id001
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: ZenTest
|
38
|
-
prerelease: false
|
39
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
-
none: false
|
41
|
-
requirements:
|
42
|
-
- - ">="
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
hash: 3
|
45
|
-
segments:
|
46
|
-
- 0
|
47
|
-
version: "0"
|
48
|
-
type: :development
|
49
|
-
version_requirements: *id002
|
50
|
-
- !ruby/object:Gem::Dependency
|
51
|
-
name: rspec
|
52
|
-
prerelease: false
|
53
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
-
none: false
|
55
|
-
requirements:
|
56
|
-
- - ">="
|
57
|
-
- !ruby/object:Gem::Version
|
58
|
-
hash: 3
|
59
|
-
segments:
|
60
|
-
- 0
|
61
|
-
version: "0"
|
62
|
-
type: :development
|
63
|
-
version_requirements: *id003
|
64
|
-
- !ruby/object:Gem::Dependency
|
65
|
-
name: activerecord
|
66
|
-
prerelease: false
|
67
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
68
|
-
none: false
|
69
|
-
requirements:
|
70
|
-
- - ~>
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
hash: 9
|
73
|
-
segments:
|
74
|
-
- 2
|
75
|
-
- 3
|
76
|
-
- 5
|
77
|
-
version: 2.3.5
|
78
|
-
type: :development
|
79
|
-
version_requirements: *id004
|
80
|
-
- !ruby/object:Gem::Dependency
|
81
|
-
name: sqlite3-ruby
|
82
|
-
prerelease: false
|
83
|
-
requirement: &id005 !ruby/object:Gem::Requirement
|
84
|
-
none: false
|
85
|
-
requirements:
|
86
|
-
- - ">="
|
87
|
-
- !ruby/object:Gem::Version
|
88
|
-
hash: 3
|
89
|
-
segments:
|
90
|
-
- 0
|
91
|
-
version: "0"
|
92
|
-
type: :development
|
93
|
-
version_requirements: *id005
|
94
|
-
description: Simple State Machine is a state machine that focuses on events instead of states
|
95
|
-
email:
|
12
|
+
date: 2021-12-15 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: A simple DSL to decorate existing methods with state transition guards.
|
15
|
+
email:
|
96
16
|
- FIX@example.com
|
97
17
|
executables: []
|
98
|
-
|
99
18
|
extensions: []
|
100
|
-
|
101
|
-
extra_rdoc_files:
|
19
|
+
extra_rdoc_files:
|
102
20
|
- LICENSE
|
103
21
|
- README.rdoc
|
104
|
-
files:
|
105
|
-
- .
|
106
|
-
- .
|
22
|
+
files:
|
23
|
+
- ".github/workflows/build.yml"
|
24
|
+
- ".gitignore"
|
25
|
+
- ".rspec"
|
26
|
+
- ".travis.yml"
|
27
|
+
- Changelog.rdoc
|
107
28
|
- Gemfile
|
108
29
|
- LICENSE
|
109
30
|
- README.rdoc
|
110
31
|
- Rakefile
|
111
|
-
- autotest/discover.rb
|
112
32
|
- examples/conversation.rb
|
113
33
|
- examples/lamp.rb
|
114
34
|
- examples/relationship.rb
|
115
35
|
- examples/traffic_light.rb
|
116
36
|
- examples/user.rb
|
37
|
+
- gemfiles/Gemfile.activerecord-5.2.x
|
38
|
+
- gemfiles/Gemfile.activerecord-6.0.x
|
39
|
+
- gemfiles/Gemfile.activerecord-6.1.x
|
40
|
+
- gemfiles/Gemfile.activerecord-main.x
|
41
|
+
- gemfiles/Gemfile.basic
|
117
42
|
- lib/simple_state_machine.rb
|
43
|
+
- lib/simple_state_machine/.DS_Store
|
118
44
|
- lib/simple_state_machine/active_record.rb
|
45
|
+
- lib/simple_state_machine/decorator/active_record.rb
|
46
|
+
- lib/simple_state_machine/decorator/default.rb
|
119
47
|
- lib/simple_state_machine/rails2_task_loader.rb
|
120
48
|
- lib/simple_state_machine/railtie.rb
|
121
49
|
- lib/simple_state_machine/simple_state_machine.rb
|
50
|
+
- lib/simple_state_machine/state_machine.rb
|
51
|
+
- lib/simple_state_machine/state_machine_definition.rb
|
52
|
+
- lib/simple_state_machine/tools/graphviz.rb
|
53
|
+
- lib/simple_state_machine/tools/inspector.rb
|
54
|
+
- lib/simple_state_machine/transition.rb
|
122
55
|
- lib/simple_state_machine/version.rb
|
123
|
-
- lib/tasks/
|
124
|
-
- rails/graphiz.rake
|
56
|
+
- lib/tasks/graphviz.rake
|
125
57
|
- simple_state_machine.gemspec
|
58
|
+
- spec/.DS_Store
|
126
59
|
- spec/active_record_spec.rb
|
127
|
-
- spec/
|
60
|
+
- spec/decorator/default_spec.rb
|
128
61
|
- spec/examples_spec.rb
|
129
62
|
- spec/mountable_spec.rb
|
130
63
|
- spec/simple_state_machine_spec.rb
|
131
64
|
- spec/spec_helper.rb
|
132
65
|
- spec/state_machine_definition_spec.rb
|
133
66
|
- spec/state_machine_spec.rb
|
134
|
-
|
67
|
+
- spec/tools/graphviz_spec.rb
|
68
|
+
- spec/tools/inspector_spec.rb
|
135
69
|
homepage: http://github.com/mdh/ssm
|
136
70
|
licenses: []
|
137
|
-
|
138
|
-
post_install_message:
|
139
|
-
rdoc_options:
|
140
|
-
- --charset=UTF-8
|
141
|
-
require_paths:
|
71
|
+
metadata: {}
|
72
|
+
post_install_message:
|
73
|
+
rdoc_options:
|
74
|
+
- "--charset=UTF-8"
|
75
|
+
require_paths:
|
142
76
|
- lib
|
143
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
144
|
-
|
145
|
-
requirements:
|
77
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
146
79
|
- - ">="
|
147
|
-
- !ruby/object:Gem::Version
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
version: "0"
|
152
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
153
|
-
none: false
|
154
|
-
requirements:
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
155
84
|
- - ">="
|
156
|
-
- !ruby/object:Gem::Version
|
157
|
-
|
158
|
-
segments:
|
159
|
-
- 0
|
160
|
-
version: "0"
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
161
87
|
requirements: []
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
signing_key:
|
166
|
-
specification_version: 3
|
88
|
+
rubygems_version: 3.1.6
|
89
|
+
signing_key:
|
90
|
+
specification_version: 4
|
167
91
|
summary: A simple DSL to decorate existing methods with logic that guards state transitions.
|
168
|
-
test_files:
|
92
|
+
test_files:
|
169
93
|
- spec/active_record_spec.rb
|
170
|
-
- spec/
|
94
|
+
- spec/decorator/default_spec.rb
|
171
95
|
- spec/examples_spec.rb
|
172
96
|
- spec/mountable_spec.rb
|
173
97
|
- spec/simple_state_machine_spec.rb
|
174
98
|
- spec/spec_helper.rb
|
175
99
|
- spec/state_machine_definition_spec.rb
|
176
100
|
- spec/state_machine_spec.rb
|
101
|
+
- spec/tools/graphviz_spec.rb
|
102
|
+
- spec/tools/inspector_spec.rb
|
data/autotest/discover.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
Autotest.add_discovery { "rspec2" }
|
data/lib/tasks/graphiz.rake
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
namespace :ssm do
|
2
|
-
namespace :graph do
|
3
|
-
desc 'Generate a url for a google chart for [class]'
|
4
|
-
task :url => :environment do
|
5
|
-
puts ENV['class'].constantize.state_machine_definition.google_chart_url
|
6
|
-
end
|
7
|
-
|
8
|
-
desc 'Opens the google chart in the browser for [class]'
|
9
|
-
task :open => :environment do
|
10
|
-
`open '#{::CGI.unescape(ENV['class'].constantize.state_machine_definition.google_chart_url)}'`
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|