motion_blender 0.2.6 → 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/lib/motion_blender/graph_maker.rb +90 -0
- data/lib/motion_blender/rake_tasks.rb +20 -0
- data/lib/motion_blender/version.rb +1 -1
- data/motion_blender.gemspec +2 -0
- metadata +31 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5702d8540efa7410bdfbdeb2310dabba7669002b
|
4
|
+
data.tar.gz: 65874dc4ed3a275906aeee85b8200ce82f5ad254
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 23937538ee2436fdc637771e9f51f4f087f841c7d859c68fc7efbd65863d1f8da363484a9131823b7f1f2bdd3c32a65e3052ec6c30f6fcae93c177c3493b4fd3
|
7
|
+
data.tar.gz: fb2e5bab0da21a3f99070c8e280994cea6e75b53373d3d232c61aaa07b8440d50765f64f30211f8fadbf642dea5005a8e9aca86e122809c577449510f9346a54
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'graphviz'
|
2
|
+
require 'colorable'
|
3
|
+
require 'zlib'
|
4
|
+
|
5
|
+
module MotionBlender
|
6
|
+
class GraphMaker
|
7
|
+
attr_reader :dependencies
|
8
|
+
attr_accessor :title, :filter, :layout, :output
|
9
|
+
|
10
|
+
def initialize dependencies, opts = {}
|
11
|
+
@dependencies = dependencies
|
12
|
+
@title = opts[:title]
|
13
|
+
@filter = opts[:filter]
|
14
|
+
@layout = opts[:layout].try(:to_sym) || :sfdp
|
15
|
+
@output = opts[:output] || 'graph.pdf'
|
16
|
+
end
|
17
|
+
|
18
|
+
def build
|
19
|
+
g = GraphViz.new(@title || 'Graph', type: :digraph, use: @layout)
|
20
|
+
label = [@title, (@filter && "/#{@filter}/")].compact.join(' ')
|
21
|
+
g[:label] = label if label.present?
|
22
|
+
g[:overlap] = false
|
23
|
+
|
24
|
+
deps =
|
25
|
+
@dependencies
|
26
|
+
.select { |k, _| acceptable? k }
|
27
|
+
.map { |k, v| [k, v.select { |f| acceptable? f }] }
|
28
|
+
deps.map { |k, v| [k, *v] }.flatten.uniq.reverse_each do |f|
|
29
|
+
g.add_node f, node_options_for(f)
|
30
|
+
end
|
31
|
+
deps.each do |k, v|
|
32
|
+
v.each { |f| g.add_edge k, f, edge_options_for(k, f) }
|
33
|
+
end
|
34
|
+
|
35
|
+
g.output(output_format => @output)
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def output_format
|
41
|
+
File.extname(@output)[1..-1].to_sym
|
42
|
+
end
|
43
|
+
|
44
|
+
def acceptable? file
|
45
|
+
shorten(file) =~ filter_pattern
|
46
|
+
end
|
47
|
+
|
48
|
+
def filter_pattern
|
49
|
+
@filter_pattern ||= /#{@filter}/
|
50
|
+
end
|
51
|
+
|
52
|
+
def shorten_pattern
|
53
|
+
@shorten_pattern ||=
|
54
|
+
begin
|
55
|
+
paths = MotionBlender.config.motion_dirs + $LOAD_PATH
|
56
|
+
patterns = paths.map { |p| Regexp.escape File.join(p, '') }
|
57
|
+
Regexp.new(patterns.join('|'))
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def shorten file
|
62
|
+
file.sub(shorten_pattern, '')
|
63
|
+
end
|
64
|
+
|
65
|
+
def shortened file
|
66
|
+
file[shorten_pattern]
|
67
|
+
end
|
68
|
+
|
69
|
+
def color_for file
|
70
|
+
h = Zlib.crc32(shortened(file)) % 360
|
71
|
+
Colorable::Color.new(Colorable::HSB.new(h, 90, 100))
|
72
|
+
end
|
73
|
+
|
74
|
+
def node_options_for file
|
75
|
+
{
|
76
|
+
label: shorten(file).pathmap('%X'),
|
77
|
+
href: file,
|
78
|
+
color: color_for(file).hex,
|
79
|
+
fillcolor: color_for(file).hex + '99',
|
80
|
+
style: :filled
|
81
|
+
}
|
82
|
+
end
|
83
|
+
|
84
|
+
def edge_options_for file, _
|
85
|
+
{
|
86
|
+
color: (color_for(file) * 'Gray'.to_color).hex + '66'
|
87
|
+
}
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -2,6 +2,7 @@ require 'rake'
|
|
2
2
|
require 'yaml'
|
3
3
|
require 'motion_blender/config'
|
4
4
|
require 'motion_blender/analyzer'
|
5
|
+
require 'motion_blender/graph_maker'
|
5
6
|
|
6
7
|
module MotionBlender
|
7
8
|
class RakeTasks
|
@@ -33,6 +34,14 @@ module MotionBlender
|
|
33
34
|
analyzer = analyze
|
34
35
|
YAML.dump %w(files dependencies).map { |k| [k, analyzer.send(k)] }.to_h
|
35
36
|
end
|
37
|
+
|
38
|
+
def graph options = {}
|
39
|
+
analyzer = analyze
|
40
|
+
graph_maker = GraphMaker.new analyzer.dependencies, options
|
41
|
+
graph_maker.title = Motion::Project::App.config.name
|
42
|
+
graph_maker.build
|
43
|
+
Motion::Project::App.info('Create', graph_maker.output)
|
44
|
+
end
|
36
45
|
end
|
37
46
|
end
|
38
47
|
|
@@ -48,6 +57,17 @@ namespace :motion_blender do
|
|
48
57
|
task :dump do
|
49
58
|
puts MotionBlender::RakeTasks.new.dump
|
50
59
|
end
|
60
|
+
|
61
|
+
options = [
|
62
|
+
'layout=dot',
|
63
|
+
'filter="^(some|any)_pattern"',
|
64
|
+
'output=graph.pdf'
|
65
|
+
].join(', ')
|
66
|
+
desc "Create graph of dependencies (options: #{options})"
|
67
|
+
task :graph do
|
68
|
+
options = ENV.to_h.slice(*%w(layout filter output)).symbolize_keys
|
69
|
+
MotionBlender::RakeTasks.new.graph options
|
70
|
+
end
|
51
71
|
end
|
52
72
|
|
53
73
|
%w(build:simulator build:device).each do |t|
|
data/motion_blender.gemspec
CHANGED
@@ -21,6 +21,8 @@ Gem::Specification.new do |spec|
|
|
21
21
|
|
22
22
|
spec.add_runtime_dependency 'parser'
|
23
23
|
spec.add_runtime_dependency 'activesupport', '~> 4.2'
|
24
|
+
spec.add_runtime_dependency 'colorable', '~> 0.2'
|
25
|
+
spec.add_runtime_dependency 'ruby-graphviz', '~> 1.2'
|
24
26
|
spec.add_development_dependency 'bundler', '~> 1.10'
|
25
27
|
spec.add_development_dependency 'rake', '~> 10.0'
|
26
28
|
spec.add_development_dependency 'rspec'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: motion_blender
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kayhide
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -38,6 +38,34 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '4.2'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: colorable
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.2'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.2'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: ruby-graphviz
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.2'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.2'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: bundler
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -237,6 +265,7 @@ files:
|
|
237
265
|
- lib/motion_blender/config.rb
|
238
266
|
- lib/motion_blender/ext.rb
|
239
267
|
- lib/motion_blender/ext/raketime.rb
|
268
|
+
- lib/motion_blender/graph_maker.rb
|
240
269
|
- lib/motion_blender/rake_tasks.rb
|
241
270
|
- lib/motion_blender/version.rb
|
242
271
|
- motion/motion_blender/ext.rb
|