just_state_machine 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +11 -3
- data/lib/jsm.rb +6 -0
- data/lib/jsm/drawer/digraph.rb +41 -0
- data/lib/jsm/drawer/graphviz.rb +16 -0
- data/lib/jsm/drawer/node.rb +12 -0
- data/lib/jsm/event.rb +6 -1
- data/lib/jsm/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ffaec8272814487f36a006b35a7fb4ba9d03e212
|
4
|
+
data.tar.gz: 9e6c7df7b81ee6e55d79f47c9a8e44ac36234df1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8f00e1451d1fb713f8000027239c1de502093bb658be3ee7a2c1106103b39b4573053ae88445e4e399a9f2b1b5e455c9b95f789ac498d5e5e32a02253ad7dc0
|
7
|
+
data.tar.gz: dd327c2a4857e9b2795ac11dbb081d31f2da958fa17ce0bcfb2de68288edb7936ccb39a666294ffc2b6bae79b2c8917f5768d990d421c1b79101a7f68104ae3d
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
[![Gem Version](https://badge.fury.io/rb/
|
1
|
+
[![Gem Version](https://badge.fury.io/rb/just_state_machine.svg)](https://badge.fury.io/rb/just_state_machine)
|
2
2
|
[![Code Climate](https://codeclimate.com/github/wendy0402/jsm/badges/gpa.svg)](https://codeclimate.com/github/wendy0402/jsm)
|
3
3
|
# Jsm
|
4
4
|
|
@@ -9,7 +9,7 @@ JSM is abbreviation of Just State Machine. The purpose is to simplify and increa
|
|
9
9
|
Add this line to your application's Gemfile:
|
10
10
|
|
11
11
|
```ruby
|
12
|
-
gem '
|
12
|
+
gem 'just_state_machine'
|
13
13
|
```
|
14
14
|
|
15
15
|
And then execute:
|
@@ -18,7 +18,7 @@ And then execute:
|
|
18
18
|
|
19
19
|
Or install it yourself as:
|
20
20
|
|
21
|
-
$ gem install
|
21
|
+
$ gem install just_state_machine
|
22
22
|
|
23
23
|
## Usage
|
24
24
|
|
@@ -168,7 +168,15 @@ user.title # :beginner
|
|
168
168
|
user.upgrade_title # true
|
169
169
|
user.title # :intermediate
|
170
170
|
```
|
171
|
+
### Transition
|
172
|
+
Transition will transitioning your state from one state to other state. Params `from` in transition can receive one or multiple states.
|
173
|
+
However to put multiple states, you need to put it in array.
|
171
174
|
|
175
|
+
```ruby
|
176
|
+
transition from: :intermediate, to: :beginner #one `from` states
|
177
|
+
transition from: [:intermediate, :master], to: :beginner #multiple `from` states
|
178
|
+
```
|
179
|
+
What above code means for multiple `from` states is the current state either `:intermediate` or `:master`, transform it into `:beginner` state
|
172
180
|
## Active Model Integration
|
173
181
|
```ruby
|
174
182
|
class UserStateMachine < Jsm::Base
|
data/lib/jsm.rb
CHANGED
@@ -0,0 +1,41 @@
|
|
1
|
+
#list of all nodes
|
2
|
+
class Jsm::Drawer::Digraph
|
3
|
+
attr_reader :state_machine
|
4
|
+
def initialize(state_machine)
|
5
|
+
@state_machine = state_machine
|
6
|
+
end
|
7
|
+
|
8
|
+
#list of all nodes
|
9
|
+
# TODO: move it to different class(?)
|
10
|
+
def nodes
|
11
|
+
unless @nodes
|
12
|
+
events = state_machine.events.values
|
13
|
+
@nodes = events.map{ |event| to_nodes(event) }.flatten
|
14
|
+
end
|
15
|
+
@nodes
|
16
|
+
end
|
17
|
+
|
18
|
+
# convert it to string that is compatible with api Graphviz
|
19
|
+
def to_s
|
20
|
+
nodes.map(&:to_s).join(';')
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
# convert transitions of event into nodes object
|
26
|
+
# return value is array
|
27
|
+
# e.g: [Jsm::Drawer::Node.new(:confirmed, :completed, :complete)]
|
28
|
+
def to_nodes(event)
|
29
|
+
nodes = []
|
30
|
+
event.transitions.each do |transition|
|
31
|
+
if transition.multiple_from?
|
32
|
+
temp_nodes = transition.from.map{ |from| Jsm::Drawer::Node.new(from: from, to: transition.to, label: event.name) }
|
33
|
+
else
|
34
|
+
from = transition.from[0] # even only one it is still in array e.g: [:confirmed]
|
35
|
+
temp_nodes = [Jsm::Drawer::Node.new(from: from, to: transition.to, label: event.name)]
|
36
|
+
end
|
37
|
+
nodes += temp_nodes
|
38
|
+
end
|
39
|
+
nodes
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class Jsm::Drawer::Graphviz
|
2
|
+
API_URL = "https://chart.googleapis.com/chart"
|
3
|
+
def self.generate_url(state_machine)
|
4
|
+
new(state_machine).generate_url
|
5
|
+
end
|
6
|
+
|
7
|
+
def initialize(state_machine)
|
8
|
+
@state_machine = state_machine
|
9
|
+
@diagraph = Jsm::Drawer::Digraph.new(@state_machine)
|
10
|
+
end
|
11
|
+
|
12
|
+
def generate_url
|
13
|
+
diagram = @diagraph
|
14
|
+
"#{API_URL}?cht=gv&chl=digraph{#{diagram}}"
|
15
|
+
end
|
16
|
+
end
|
data/lib/jsm/event.rb
CHANGED
@@ -4,7 +4,12 @@ class Jsm::Event
|
|
4
4
|
attr_reader :name, :states, :transitions
|
5
5
|
attr_accessor :attribute_name
|
6
6
|
|
7
|
-
::Jsm::Transition = Struct.new(:from, :to)
|
7
|
+
::Jsm::Transition = Struct.new(:from, :to) do
|
8
|
+
def multiple_from?
|
9
|
+
from.size > 1
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
8
13
|
def initialize(name, params = {}, &block)
|
9
14
|
@name = name
|
10
15
|
@states = params[:states]
|
data/lib/jsm/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: just_state_machine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- wendy0402
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -148,6 +148,9 @@ files:
|
|
148
148
|
- lib/jsm/client/active_model.rb
|
149
149
|
- lib/jsm/client/active_record.rb
|
150
150
|
- lib/jsm/client_extension.rb
|
151
|
+
- lib/jsm/drawer/digraph.rb
|
152
|
+
- lib/jsm/drawer/graphviz.rb
|
153
|
+
- lib/jsm/drawer/node.rb
|
151
154
|
- lib/jsm/event.rb
|
152
155
|
- lib/jsm/event_executor/active_model.rb
|
153
156
|
- lib/jsm/event_executor/active_record.rb
|