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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1663cd7612188f2c8ba2ceef99c49b6d53c71c4b
4
- data.tar.gz: 612a62dec2ede152957a52f7c03bafb45ff93968
3
+ metadata.gz: 5702d8540efa7410bdfbdeb2310dabba7669002b
4
+ data.tar.gz: 65874dc4ed3a275906aeee85b8200ce82f5ad254
5
5
  SHA512:
6
- metadata.gz: 04da33aa753f9cb4bef63be5580b181d5c08afd7bdb808c18849cf3541acfe4ddbeae7ec93080a093797a43982000db9ae0b3a1424533c3ea94adf7249b82265
7
- data.tar.gz: f8fda7abe774051718aac6889bf3a2202e74105c09729e075d731d85b901975eb35ba9ab920529cb59d9c9d47ca7a009d0d2da0830f2818b1267b3c701a4a0a2
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|
@@ -1,3 +1,3 @@
1
1
  module MotionBlender
2
- VERSION = '0.2.6'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -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.2.6
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-01-04 00:00:00.000000000 Z
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