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.
@@ -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: []