motion_blender 0.2.6 → 0.3.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 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