aasm-diagram 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -0,0 +1,6 @@
1
+ Gemfile.lock
2
+
3
+ aasm-diagram-*.gem
4
+
5
+ # rspec failure tracking
6
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in aasm-diagram.gemspec
4
+ gemspec
@@ -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
+ ![Diagram of Job state machine](docs/job.png)
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
+ ![Diagram of Cleaner state machine](docs/guard-cleaner.png)
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
+ ![Diagram of state machine 1](docs/multiple-state-machines-1.png)
130
+ ![Diagram of state machine 2](docs/multiple-state-machines-2.png)
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
Binary file
@@ -0,0 +1,5 @@
1
+ require 'aasm'
2
+ require 'graphviz'
3
+
4
+ require 'aasm_diagram/version'
5
+ require 'aasm_diagram/diagram'
@@ -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
@@ -0,0 +1,3 @@
1
+ module AASMDiagram
2
+ VERSION = '0.1.0'.freeze
3
+ 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: []