aasm-diagram 0.1.0
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/.gitignore +6 -0
- data/.rspec +3 -0
- data/Gemfile +4 -0
- data/README.md +138 -0
- data/aasm-diagram.gemspec +31 -0
- data/docs/guard-cleaner.png +0 -0
- data/docs/job.png +0 -0
- data/docs/multiple-state-machines-1.png +0 -0
- data/docs/multiple-state-machines-2.png +0 -0
- data/lib/aasm-diagram.rb +5 -0
- data/lib/aasm_diagram/diagram.rb +53 -0
- data/lib/aasm_diagram/version.rb +3 -0
- metadata +126 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b604cccce71edd0a95f6d09957930855dd64de6b
|
4
|
+
data.tar.gz: afdc4b655659c8ff3764bd2b5a9182585c20c51e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 311921f61fc3536de515dabc309c067fbedfe953060902ffa30d5cd01793003ff7d2c86d1b58cb8a98918cb27dcfe052065c85d38913f2acc1fbb145d4e38187
|
7
|
+
data.tar.gz: 933bb4fa55f73efbe3ca2a9d65a95c836ba9090a8ac81acca90cffbfa0c5cfdc9ab03ca573fe6436a13f87281b1169c76ce441ce6b980577b2aaf698a7b25709
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
# AASM Diagram
|
2
|
+
|
3
|
+
[AASM Diagram](https://github.com/katee/aasm-diagram) creates diagrams for [ASSM](https://github.com/aasm/aasm) state machines. To take an example from the AASM Readme:
|
4
|
+
|
5
|
+
```ruby
|
6
|
+
require 'aasm-diagram'
|
7
|
+
|
8
|
+
class Job
|
9
|
+
include AASM
|
10
|
+
|
11
|
+
aasm do
|
12
|
+
state :sleeping, :initial => true
|
13
|
+
state :running, :cleaning
|
14
|
+
|
15
|
+
event :run do
|
16
|
+
transitions :from => :sleeping, :to => :running
|
17
|
+
end
|
18
|
+
|
19
|
+
event :clean do
|
20
|
+
transitions :from => :running, :to => :cleaning
|
21
|
+
end
|
22
|
+
|
23
|
+
event :sleep do
|
24
|
+
transitions :from => [:running, :cleaning], :to => :sleeping
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
job = Job.new
|
30
|
+
|
31
|
+
AASMDiagram::Diagram.new(job.aasm, 'docs/job.png')
|
32
|
+
```
|
33
|
+
|
34
|
+
Generates the following diagram:
|
35
|
+
|
36
|
+

|
37
|
+
|
38
|
+
## Installation
|
39
|
+
|
40
|
+
* Install Graphviz ([see the rails-erd guide for more details](https://voormedia.github.io/rails-erd/install.html)). If you use Homebrew try `brew install graphviz`.
|
41
|
+
* Add `gem 'aasm-diagram', require: false, group: :development` to your `Gemfile` and run `bundle`.
|
42
|
+
|
43
|
+
## More Examples
|
44
|
+
|
45
|
+
### Guards
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
class Cleaner
|
49
|
+
include AASM
|
50
|
+
|
51
|
+
aasm do
|
52
|
+
state :idle, :initial => true
|
53
|
+
state :cleaning
|
54
|
+
|
55
|
+
event :clean do
|
56
|
+
transitions :from => :idle, :to => :cleaning, :guard => :cleaning_needed?
|
57
|
+
end
|
58
|
+
|
59
|
+
event :clean_if_needed do
|
60
|
+
transitions :from => :idle, :to => :cleaning do
|
61
|
+
guard do
|
62
|
+
cleaning_needed?
|
63
|
+
end
|
64
|
+
end
|
65
|
+
transitions :from => :idle, :to => :idle
|
66
|
+
end
|
67
|
+
|
68
|
+
event :clean_if_dirty do
|
69
|
+
transitions :from => :idle, :to => :cleaning, :guard => :if_dirty?
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def cleaning_needed?
|
74
|
+
false
|
75
|
+
end
|
76
|
+
|
77
|
+
def if_dirty?(status)
|
78
|
+
status == :dirty
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
cleaner = Cleaner.new
|
83
|
+
AASMDiagram::Diagram.new(job.aasm, '../docs/guard-cleaner.png')
|
84
|
+
```
|
85
|
+
|
86
|
+

|
87
|
+
|
88
|
+
### Multiple state machines per class
|
89
|
+
|
90
|
+
```ruby
|
91
|
+
class SimpleMultipleExample
|
92
|
+
include AASM
|
93
|
+
aasm(:move) do
|
94
|
+
state :standing, :initial => true
|
95
|
+
state :walking
|
96
|
+
state :running
|
97
|
+
|
98
|
+
event :walk do
|
99
|
+
transitions :from => :standing, :to => :walking
|
100
|
+
end
|
101
|
+
event :run do
|
102
|
+
transitions :from => [:standing, :walking], :to => :running
|
103
|
+
end
|
104
|
+
event :hold do
|
105
|
+
transitions :from => [:walking, :running], :to => :standing
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
aasm(:work) do
|
110
|
+
state :sleeping, :initial => true
|
111
|
+
state :processing
|
112
|
+
|
113
|
+
event :start do
|
114
|
+
transitions :from => :sleeping, :to => :processing
|
115
|
+
end
|
116
|
+
event :stop do
|
117
|
+
transitions :from => :processing, :to => :sleeping
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
simple = SimpleMultipleExample.new
|
123
|
+
AASMDiagram::Diagram.new(simple.aasm(:move), 'docs/multiple-state-machines-1.png')
|
124
|
+
AASMDiagram::Diagram.new(simple.aasm(:work), 'docs/multiple-state-machines-2.png')
|
125
|
+
```
|
126
|
+
|
127
|
+
Generates two images:
|
128
|
+
|
129
|
+

|
130
|
+

|
131
|
+
|
132
|
+
## Notes
|
133
|
+
|
134
|
+
AASM Diagram is heavily inspired by [rails-erd](https://github.com/voormedia/rails-erd).
|
135
|
+
|
136
|
+
## License
|
137
|
+
|
138
|
+
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
require 'aasm_diagram/version'
|
7
|
+
|
8
|
+
Gem::Specification.new do |spec|
|
9
|
+
spec.name = 'aasm-diagram'
|
10
|
+
spec.version = AASMDiagram::VERSION
|
11
|
+
spec.authors = ['Kate Murphy']
|
12
|
+
spec.email = ['hello@kate.io']
|
13
|
+
|
14
|
+
spec.summary = 'Automatically generate diagrams of AASM state machines.'
|
15
|
+
spec.homepage = 'https://github.com/katee/aasm-diagram'
|
16
|
+
spec.license = 'MIT'
|
17
|
+
|
18
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
19
|
+
f.match(%r{^(test|spec|features)/})
|
20
|
+
end
|
21
|
+
spec.bindir = 'exe'
|
22
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
|
+
spec.require_paths = ['lib']
|
24
|
+
|
25
|
+
spec.add_runtime_dependency 'aasm', '~> 4.12'
|
26
|
+
spec.add_runtime_dependency 'ruby-graphviz', '~> 1.2'
|
27
|
+
|
28
|
+
spec.add_development_dependency 'bundler', '~> 1.14'
|
29
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
30
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
31
|
+
end
|
Binary file
|
data/docs/job.png
ADDED
Binary file
|
Binary file
|
Binary file
|
data/lib/aasm-diagram.rb
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
module AASMDiagram
|
2
|
+
#
|
3
|
+
# Save a diagram of a single AASM state machine to an image
|
4
|
+
#
|
5
|
+
class Diagram
|
6
|
+
def initialize(aasm_instance, filename)
|
7
|
+
@aasm_instance = aasm_instance
|
8
|
+
draw
|
9
|
+
save(filename)
|
10
|
+
end
|
11
|
+
|
12
|
+
def draw
|
13
|
+
@graphviz = GraphViz.new(:G, type: :digraph)
|
14
|
+
draw_nodes
|
15
|
+
draw_edges
|
16
|
+
end
|
17
|
+
|
18
|
+
def draw_nodes
|
19
|
+
state_names.map do |state_name|
|
20
|
+
@graphviz.add_nodes(state_name.to_s)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def draw_edges
|
25
|
+
events.each do |event|
|
26
|
+
event.transitions.each do |transition|
|
27
|
+
from = @graphviz.get_node(transition.from.to_s)
|
28
|
+
to = @graphviz.get_node(transition.to.to_s)
|
29
|
+
label = event.name.to_s
|
30
|
+
@graphviz.add_edges(from, to, label: label)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def save(filename)
|
36
|
+
@graphviz.output(png: filename)
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def states
|
42
|
+
@aasm_instance.states
|
43
|
+
end
|
44
|
+
|
45
|
+
def state_names
|
46
|
+
states.map(&:name)
|
47
|
+
end
|
48
|
+
|
49
|
+
def events
|
50
|
+
@aasm_instance.events.first.state_machine.events.values
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
metadata
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: aasm-diagram
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kate Murphy
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-09-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: aasm
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.12'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.12'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: ruby-graphviz
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.2'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.14'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.14'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rake
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '10.0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '10.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '3.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '3.0'
|
83
|
+
description:
|
84
|
+
email:
|
85
|
+
- hello@kate.io
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- ".gitignore"
|
91
|
+
- ".rspec"
|
92
|
+
- Gemfile
|
93
|
+
- README.md
|
94
|
+
- aasm-diagram.gemspec
|
95
|
+
- docs/guard-cleaner.png
|
96
|
+
- docs/job.png
|
97
|
+
- docs/multiple-state-machines-1.png
|
98
|
+
- docs/multiple-state-machines-2.png
|
99
|
+
- lib/aasm-diagram.rb
|
100
|
+
- lib/aasm_diagram/diagram.rb
|
101
|
+
- lib/aasm_diagram/version.rb
|
102
|
+
homepage: https://github.com/katee/aasm-diagram
|
103
|
+
licenses:
|
104
|
+
- MIT
|
105
|
+
metadata: {}
|
106
|
+
post_install_message:
|
107
|
+
rdoc_options: []
|
108
|
+
require_paths:
|
109
|
+
- lib
|
110
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '0'
|
115
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
requirements: []
|
121
|
+
rubyforge_project:
|
122
|
+
rubygems_version: 2.6.13
|
123
|
+
signing_key:
|
124
|
+
specification_version: 4
|
125
|
+
summary: Automatically generate diagrams of AASM state machines.
|
126
|
+
test_files: []
|