motion_blender 0.3.0 → 0.3.1
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 +4 -4
- data/.rubocop.yml +5 -5
- data/.travis.yml +5 -1
- data/lib/motion_blender/analyzer/evaluator.rb +3 -27
- data/lib/motion_blender/analyzer/parser.rb +4 -16
- data/lib/motion_blender/analyzer.rb +2 -2
- data/lib/motion_blender/callbacks.rb +1 -1
- data/lib/motion_blender/collector.rb +76 -0
- data/lib/motion_blender/config.rb +1 -1
- data/lib/motion_blender/dependency_graph.rb +13 -0
- data/lib/motion_blender/ext/runtime.rb +4 -0
- data/lib/motion_blender/ext.rb +2 -4
- data/lib/motion_blender/flag_attribute.rb +23 -0
- data/lib/motion_blender/interpreters/base.rb +34 -0
- data/lib/motion_blender/interpreters/original_interpreter.rb +28 -0
- data/lib/motion_blender/interpreters/requirable.rb +45 -0
- data/lib/motion_blender/interpreters/require_interpreter.rb +34 -0
- data/lib/motion_blender/interpreters/require_relative_interpreter.rb +26 -0
- data/lib/motion_blender/interpreters.rb +1 -0
- data/lib/motion_blender/rake_tasks.rb +8 -0
- data/lib/motion_blender/require.rb +22 -0
- data/lib/motion_blender/source.rb +64 -0
- data/lib/motion_blender/version.rb +1 -1
- data/lib/motion_blender.rb +0 -1
- data/motion/motion_blender/ext/suppressors.rb +10 -0
- data/motion/motion_blender/ext.rb +1 -1
- metadata +15 -6
- data/lib/motion_blender/analyzer/original_finder.rb +0 -26
- data/lib/motion_blender/analyzer/require.rb +0 -75
- data/lib/motion_blender/analyzer/source.rb +0 -52
- data/motion/motion_blender/ext/require_suppressor.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e0a26f4930010d2e1105308d10fb471cc3e3892
|
4
|
+
data.tar.gz: f537cd46e5096820fc007f634aa127384a7d9bfe
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bafb18c7858a0d59a7c341ebc1ed6ae809622b3b86c99d9435e0992cc36cead2e819251249798fbca5db20b162363bb01c45d16332fe150c9cdf463d76fb6a0f
|
7
|
+
data.tar.gz: 9948b5186e33231b7d286d6b6b9cd013a3ae3c7a008e6954c4cc4ab13a70bb15a5475d14c64bf572088c416524fe0a3fd0ddd8c55c617b42290d468940e2841f
|
data/.rubocop.yml
CHANGED
@@ -7,14 +7,15 @@ AllCops:
|
|
7
7
|
- 'db/**/*'
|
8
8
|
- 'config/**/*'
|
9
9
|
|
10
|
-
Lint/Eval:
|
11
|
-
Exclude:
|
12
|
-
- 'lib/motion_blender/analyzer/parser.rb'
|
13
|
-
|
14
10
|
# Configuration parameters: CountComments.
|
15
11
|
Metrics/MethodLength:
|
16
12
|
Max: 20
|
17
13
|
|
14
|
+
# Configuration parameters: CountComments.
|
15
|
+
Metrics/ModuleLength:
|
16
|
+
Exclude:
|
17
|
+
- 'spec/**/*'
|
18
|
+
|
18
19
|
Metrics/AbcSize:
|
19
20
|
Max: 25
|
20
21
|
|
@@ -64,7 +65,6 @@ Style/MethodDefParentheses:
|
|
64
65
|
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
65
66
|
Style/MethodName:
|
66
67
|
Exclude:
|
67
|
-
- 'lib/motion_blender/analyzer/evaluator.rb'
|
68
68
|
- 'motion/motion_blender/**/*.rb'
|
69
69
|
|
70
70
|
# Cop supports --auto-correct.
|
data/.travis.yml
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
require 'motion_blender/
|
2
|
-
require 'motion_blender/analyzer/require'
|
3
|
-
require 'motion_blender/analyzer/original_finder'
|
1
|
+
require 'motion_blender/collector'
|
4
2
|
|
5
3
|
module MotionBlender
|
6
4
|
class Analyzer
|
@@ -19,11 +17,9 @@ module MotionBlender
|
|
19
17
|
|
20
18
|
def run
|
21
19
|
return if @source.evaluated?
|
22
|
-
|
23
20
|
@source.evaluated!
|
24
|
-
|
25
|
-
|
26
|
-
@requires = extractor.instance_variable_get(:@_args) || []
|
21
|
+
|
22
|
+
@requires = Collector.collect_requires(@source)
|
27
23
|
@requires.each do |req|
|
28
24
|
req.trace = @trace
|
29
25
|
end
|
@@ -39,26 +35,6 @@ module MotionBlender
|
|
39
35
|
@dynamic = true
|
40
36
|
run
|
41
37
|
end
|
42
|
-
|
43
|
-
class Extractor
|
44
|
-
def initialize file
|
45
|
-
@_file = file
|
46
|
-
end
|
47
|
-
|
48
|
-
Require::TOKENS.each do |method|
|
49
|
-
define_method method do |arg|
|
50
|
-
req = Require.new(@_file, method, arg)
|
51
|
-
unless req.excluded?
|
52
|
-
@_args ||= []
|
53
|
-
@_args << req
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
def __ORIGINAL__
|
59
|
-
OriginalFinder.new(@_file).find
|
60
|
-
end
|
61
|
-
end
|
62
38
|
end
|
63
39
|
end
|
64
40
|
end
|
@@ -1,10 +1,8 @@
|
|
1
|
-
require 'parser/current'
|
2
1
|
require 'active_support'
|
3
2
|
require 'active_support/callbacks'
|
4
3
|
|
5
|
-
require 'motion_blender/analyzer/
|
4
|
+
require 'motion_blender/analyzer/cache'
|
6
5
|
require 'motion_blender/analyzer/evaluator'
|
7
|
-
require 'motion_blender/analyzer/require'
|
8
6
|
|
9
7
|
module MotionBlender
|
10
8
|
class Analyzer
|
@@ -22,8 +20,7 @@ module MotionBlender
|
|
22
20
|
def parse
|
23
21
|
srcs = cache.fetch do
|
24
22
|
run_callbacks :parse do
|
25
|
-
|
26
|
-
ast && traverse(Source.new(ast: ast))
|
23
|
+
traverse(Source.parse_file(@file))
|
27
24
|
@evaluators.map(&:source).map(&:attributes)
|
28
25
|
end
|
29
26
|
end
|
@@ -40,9 +37,9 @@ module MotionBlender
|
|
40
37
|
end
|
41
38
|
|
42
39
|
def traverse source
|
43
|
-
if
|
40
|
+
if Collector.requirable?(source)
|
44
41
|
evaluate source
|
45
|
-
elsif
|
42
|
+
elsif Collector.acceptable?(source)
|
46
43
|
source.children.each { |src| traverse src }
|
47
44
|
end
|
48
45
|
end
|
@@ -59,15 +56,6 @@ module MotionBlender
|
|
59
56
|
def last_trace
|
60
57
|
@evaluators.last.try :trace
|
61
58
|
end
|
62
|
-
|
63
|
-
def require_command? source
|
64
|
-
source.type.send? && Require.acceptable?(source.method)
|
65
|
-
end
|
66
|
-
|
67
|
-
def raketime_block? source
|
68
|
-
source.type.block? &&
|
69
|
-
(source.children.first.code == 'MotionBlender.raketime')
|
70
|
-
end
|
71
59
|
end
|
72
60
|
end
|
73
61
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'set'
|
2
2
|
require 'pathname'
|
3
|
+
require 'motion_blender/interpreters'
|
3
4
|
require 'motion_blender/analyzer/parser'
|
4
|
-
require 'motion_blender/analyzer/cache'
|
5
5
|
|
6
6
|
module MotionBlender
|
7
7
|
class Analyzer
|
8
|
-
attr_reader :files, :dependencies
|
8
|
+
attr_reader :files, :dependencies
|
9
9
|
|
10
10
|
def initialize
|
11
11
|
@analyzed_files = Set.new
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require 'motion_blender/source'
|
2
|
+
require 'motion_blender/require'
|
3
|
+
|
4
|
+
module MotionBlender
|
5
|
+
class Collector
|
6
|
+
class << self
|
7
|
+
def interpreters
|
8
|
+
@interpreters ||= []
|
9
|
+
end
|
10
|
+
|
11
|
+
def register interpreter
|
12
|
+
interpreters << interpreter
|
13
|
+
interpreter
|
14
|
+
end
|
15
|
+
|
16
|
+
def requirable? source
|
17
|
+
interpreters.each_with_object(source).any?(&:requirable?)
|
18
|
+
end
|
19
|
+
|
20
|
+
def acceptable? source
|
21
|
+
!source.type.block? ||
|
22
|
+
(source.children.first.code != 'MotionBlender.raketime')
|
23
|
+
end
|
24
|
+
|
25
|
+
def collect_requires source
|
26
|
+
collector = new(source, interpreters)
|
27
|
+
interpreters.each do |interpreter|
|
28
|
+
get_refinement_for(interpreter.receiver).module_eval do
|
29
|
+
define_method interpreter.method do |*args, &proc|
|
30
|
+
collector.interpreters[interpreter.key].interpret(*args, &proc)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
Object.new.instance_eval(source.code, source.file, source.line)
|
35
|
+
collector.requires
|
36
|
+
ensure
|
37
|
+
clear_refinements
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def refinements
|
43
|
+
@refinements ||= {}
|
44
|
+
end
|
45
|
+
|
46
|
+
def get_refinement_for klass
|
47
|
+
refinements[klass] ||=
|
48
|
+
begin
|
49
|
+
Module.new do
|
50
|
+
klass.prepend self
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def clear_refinements
|
56
|
+
refinements.each do |_, mod|
|
57
|
+
mod.module_eval do
|
58
|
+
instance_methods.each do |m|
|
59
|
+
remove_method m
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
attr_accessor :source, :interpreters, :requires
|
67
|
+
|
68
|
+
def initialize source, interpreters
|
69
|
+
@source = source
|
70
|
+
@interpreters = interpreters.map do |interpreter|
|
71
|
+
[interpreter.key, interpreter.new(self)]
|
72
|
+
end.to_h
|
73
|
+
@requires = []
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -10,7 +10,7 @@ module MotionBlender
|
|
10
10
|
@incepted_files = []
|
11
11
|
@excepted_files = Set.new
|
12
12
|
@motion_dirs = []
|
13
|
-
@builtin_features = Set.new %w(bigdecimal rational date
|
13
|
+
@builtin_features = Set.new %w(bigdecimal rational date)
|
14
14
|
@cache_dir = Pathname.new('build/analyze')
|
15
15
|
end
|
16
16
|
end
|
data/lib/motion_blender/ext.rb
CHANGED
@@ -0,0 +1,23 @@
|
|
1
|
+
module MotionBlender
|
2
|
+
module FlagAttribute
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
module ClassMethods
|
6
|
+
def flag_attribute *args
|
7
|
+
args.each do |attr|
|
8
|
+
define_method "#{attr}?" do
|
9
|
+
!!instance_variable_get("@#{attr}")
|
10
|
+
end
|
11
|
+
|
12
|
+
define_method "#{attr}!" do
|
13
|
+
instance_variable_set "@#{attr}", true
|
14
|
+
end
|
15
|
+
|
16
|
+
define_method "reset_#{attr}!" do
|
17
|
+
instance_variable_set "@#{attr}", false
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'motion_blender/collector'
|
2
|
+
|
3
|
+
module MotionBlender
|
4
|
+
module Interpreters
|
5
|
+
class Base
|
6
|
+
class << self
|
7
|
+
attr_reader :method, :receiver
|
8
|
+
|
9
|
+
def interprets method, options = {}
|
10
|
+
@method = method
|
11
|
+
@receiver = options[:receiver] || Object
|
12
|
+
Collector.register self
|
13
|
+
end
|
14
|
+
|
15
|
+
def key
|
16
|
+
[@receiver, @method]
|
17
|
+
end
|
18
|
+
|
19
|
+
def requirable? _
|
20
|
+
false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
attr_reader :collector
|
25
|
+
delegate :method, :receiver, to: :class
|
26
|
+
delegate :source, :requires, to: :collector
|
27
|
+
delegate :file, to: :source
|
28
|
+
|
29
|
+
def initialize collector
|
30
|
+
@collector = collector
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'motion_blender/interpreters/base'
|
2
|
+
|
3
|
+
module MotionBlender
|
4
|
+
module Interpreters
|
5
|
+
class OriginalInterpreter < Base
|
6
|
+
interprets :__ORIGINAL__
|
7
|
+
|
8
|
+
attr_reader :original
|
9
|
+
|
10
|
+
def interpret
|
11
|
+
dir = MotionBlender.config.motion_dirs.find { |d| file.start_with? d }
|
12
|
+
fail 'not found in motion_dirs' unless dir
|
13
|
+
arg = Pathname.new(file).relative_path_from(Pathname.new(dir))
|
14
|
+
@original = candidates_for(arg).find(&:file?).try(&:to_s)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def candidates_for arg
|
20
|
+
Enumerator.new do |y|
|
21
|
+
$LOAD_PATH.each do |dir|
|
22
|
+
y << Pathname.new(dir).join(arg)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module MotionBlender
|
2
|
+
module Interpreters
|
3
|
+
module Requirable
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
module ClassMethods
|
7
|
+
def requirable? source
|
8
|
+
source.type.send? && (source.method == method)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def find_require arg
|
13
|
+
return if excluded_arg? arg
|
14
|
+
|
15
|
+
req = Require.new(file, method, arg)
|
16
|
+
req.file = resolve_path req.arg
|
17
|
+
return if excluded_file? req.file
|
18
|
+
|
19
|
+
yield req
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
def resolve_path arg
|
24
|
+
path = candidates(arg).find(&:file?)
|
25
|
+
fail LoadError, "not found `#{arg}'" unless path
|
26
|
+
explicit_relative path
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def excluded_arg? arg
|
32
|
+
MotionBlender.config.builtin_features.include?(arg) ||
|
33
|
+
MotionBlender.config.excepted_files.include?(arg)
|
34
|
+
end
|
35
|
+
|
36
|
+
def excluded_file? file
|
37
|
+
MotionBlender.config.excepted_files.include?(file)
|
38
|
+
end
|
39
|
+
|
40
|
+
def explicit_relative path
|
41
|
+
path.to_s.sub(%r{^(?![\./])}, './')
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'motion_blender/interpreters/base'
|
2
|
+
require 'motion_blender/interpreters/requirable'
|
3
|
+
|
4
|
+
module MotionBlender
|
5
|
+
module Interpreters
|
6
|
+
class RequireInterpreter < Base
|
7
|
+
include Requirable
|
8
|
+
interprets :require
|
9
|
+
|
10
|
+
def interpret arg
|
11
|
+
find_require(arg) do |req|
|
12
|
+
requires << req
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def candidates arg
|
17
|
+
path = Pathname.new(arg)
|
18
|
+
dirs = path.relative? && load_path || ['']
|
19
|
+
exts = path.extname.empty? ? ['', '.rb'] : ['']
|
20
|
+
Enumerator.new do |y|
|
21
|
+
dirs.product(exts).each do |dir, ext|
|
22
|
+
y << Pathname.new(dir).join("#{path}#{ext}")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def load_path
|
30
|
+
MotionBlender.config.motion_dirs + $LOAD_PATH
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'motion_blender/interpreters/base'
|
2
|
+
|
3
|
+
module MotionBlender
|
4
|
+
module Interpreters
|
5
|
+
class RequireRelativeInterpreter < Base
|
6
|
+
include Requirable
|
7
|
+
interprets :require_relative
|
8
|
+
|
9
|
+
def interpret arg
|
10
|
+
find_require(arg) do |req|
|
11
|
+
requires << req
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def candidates arg
|
16
|
+
path = Pathname.new(file).dirname.join(arg)
|
17
|
+
exts = path.extname.empty? ? ['', '.rb'] : ['']
|
18
|
+
Enumerator.new do |y|
|
19
|
+
exts.each do |ext|
|
20
|
+
y << Pathname.new("#{path}#{ext}")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
Dir[File.expand_path('../interpreters/*.rb', __FILE__)].each { |f| require f }
|
@@ -3,6 +3,7 @@ require 'yaml'
|
|
3
3
|
require 'motion_blender/config'
|
4
4
|
require 'motion_blender/analyzer'
|
5
5
|
require 'motion_blender/graph_maker'
|
6
|
+
require 'motion_blender/dependency_graph'
|
6
7
|
|
7
8
|
module MotionBlender
|
8
9
|
class RakeTasks
|
@@ -21,6 +22,7 @@ module MotionBlender
|
|
21
22
|
|
22
23
|
def apply
|
23
24
|
analyzer = analyze
|
25
|
+
verify_dependencies analyzer.dependencies
|
24
26
|
Motion::Project::App.setup do |app|
|
25
27
|
new_files = analyzer.files - app.files
|
26
28
|
app.exclude_from_detect_dependencies += new_files
|
@@ -42,6 +44,12 @@ module MotionBlender
|
|
42
44
|
graph_maker.build
|
43
45
|
Motion::Project::App.info('Create', graph_maker.output)
|
44
46
|
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def verify_dependencies hash
|
51
|
+
DependencyGraph[hash].tsort
|
52
|
+
end
|
45
53
|
end
|
46
54
|
end
|
47
55
|
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_support/callbacks'
|
3
|
+
|
4
|
+
module MotionBlender
|
5
|
+
class Require
|
6
|
+
include ActiveSupport::Callbacks
|
7
|
+
define_callbacks :require
|
8
|
+
|
9
|
+
attr_reader :loader, :method, :arg
|
10
|
+
attr_accessor :trace, :file
|
11
|
+
|
12
|
+
def initialize loader, method, arg
|
13
|
+
@loader = loader
|
14
|
+
@method = method
|
15
|
+
@arg = arg
|
16
|
+
end
|
17
|
+
|
18
|
+
def match? arg_or_file
|
19
|
+
[arg, file].compact.include?(arg_or_file)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'parser/current'
|
2
|
+
require 'motion_blender/flag_attribute'
|
3
|
+
|
4
|
+
module MotionBlender
|
5
|
+
class Source
|
6
|
+
def self.parse code, attrs = {}
|
7
|
+
attrs[:ast] = ::Parser::CurrentRuby.parse(code)
|
8
|
+
new(attrs)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.parse_file file
|
12
|
+
ast = ::Parser::CurrentRuby.parse_file(file)
|
13
|
+
new(ast: ast)
|
14
|
+
end
|
15
|
+
|
16
|
+
include FlagAttribute
|
17
|
+
|
18
|
+
attr_reader :code, :file, :line, :parent, :type, :method, :ast
|
19
|
+
flag_attribute :evaluated
|
20
|
+
|
21
|
+
def initialize attrs = {}
|
22
|
+
@evaluated = false
|
23
|
+
ast = attrs.delete :ast
|
24
|
+
if ast
|
25
|
+
@code = ast.loc.expression.try(:source)
|
26
|
+
@file = ast.loc.expression.try(:source_buffer).try(:name)
|
27
|
+
@line = ast.loc.expression.try(:line)
|
28
|
+
@type = ast.type.to_s.inquiry
|
29
|
+
@method = @type.send? ? ast.children[1] : nil
|
30
|
+
@ast = ast
|
31
|
+
end
|
32
|
+
attrs.each do |k, v|
|
33
|
+
instance_variable_set "@#{k}", v
|
34
|
+
end
|
35
|
+
@type = @type.to_s.inquiry
|
36
|
+
@method = @method.try(:to_sym)
|
37
|
+
end
|
38
|
+
|
39
|
+
def to_s
|
40
|
+
"#{file}:#{line}:in `#{method || type}'"
|
41
|
+
end
|
42
|
+
|
43
|
+
def children
|
44
|
+
@children ||=
|
45
|
+
if @ast
|
46
|
+
@ast.children.grep(::Parser::AST::Node).map do |ast|
|
47
|
+
Source.new(ast: ast, parent: self)
|
48
|
+
end
|
49
|
+
else
|
50
|
+
[]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def attributes
|
55
|
+
{
|
56
|
+
'code' => @code,
|
57
|
+
'file' => @file,
|
58
|
+
'line' => @line,
|
59
|
+
'type' => @type.to_s,
|
60
|
+
'method' => @method.try(:to_s)
|
61
|
+
}
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/motion_blender.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
require 'motion_blender/ext/runtime'
|
2
|
-
require 'motion_blender/ext/
|
2
|
+
require 'motion_blender/ext/suppressors'
|
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.3.
|
4
|
+
version: 0.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kayhide
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -257,20 +257,29 @@ files:
|
|
257
257
|
- lib/motion_blender/analyzer.rb
|
258
258
|
- lib/motion_blender/analyzer/cache.rb
|
259
259
|
- lib/motion_blender/analyzer/evaluator.rb
|
260
|
-
- lib/motion_blender/analyzer/original_finder.rb
|
261
260
|
- lib/motion_blender/analyzer/parser.rb
|
262
|
-
- lib/motion_blender/analyzer/require.rb
|
263
|
-
- lib/motion_blender/analyzer/source.rb
|
264
261
|
- lib/motion_blender/callbacks.rb
|
262
|
+
- lib/motion_blender/collector.rb
|
265
263
|
- lib/motion_blender/config.rb
|
264
|
+
- lib/motion_blender/dependency_graph.rb
|
266
265
|
- lib/motion_blender/ext.rb
|
267
266
|
- lib/motion_blender/ext/raketime.rb
|
267
|
+
- lib/motion_blender/ext/runtime.rb
|
268
|
+
- lib/motion_blender/flag_attribute.rb
|
268
269
|
- lib/motion_blender/graph_maker.rb
|
270
|
+
- lib/motion_blender/interpreters.rb
|
271
|
+
- lib/motion_blender/interpreters/base.rb
|
272
|
+
- lib/motion_blender/interpreters/original_interpreter.rb
|
273
|
+
- lib/motion_blender/interpreters/requirable.rb
|
274
|
+
- lib/motion_blender/interpreters/require_interpreter.rb
|
275
|
+
- lib/motion_blender/interpreters/require_relative_interpreter.rb
|
269
276
|
- lib/motion_blender/rake_tasks.rb
|
277
|
+
- lib/motion_blender/require.rb
|
278
|
+
- lib/motion_blender/source.rb
|
270
279
|
- lib/motion_blender/version.rb
|
271
280
|
- motion/motion_blender/ext.rb
|
272
|
-
- motion/motion_blender/ext/require_suppressor.rb
|
273
281
|
- motion/motion_blender/ext/runtime.rb
|
282
|
+
- motion/motion_blender/ext/suppressors.rb
|
274
283
|
- motion_blender.gemspec
|
275
284
|
homepage: https://github.com/kayhide/motion_blender
|
276
285
|
licenses:
|
@@ -1,26 +0,0 @@
|
|
1
|
-
module MotionBlender
|
2
|
-
class Analyzer
|
3
|
-
class OriginalFinder
|
4
|
-
attr_reader :file, :original
|
5
|
-
|
6
|
-
def initialize file
|
7
|
-
@file = file
|
8
|
-
end
|
9
|
-
|
10
|
-
def find
|
11
|
-
dir = MotionBlender.config.motion_dirs.find { |d| @file.start_with? d }
|
12
|
-
fail 'not found in motion_dirs' unless dir
|
13
|
-
arg = Pathname.new(@file).relative_path_from(Pathname.new(dir))
|
14
|
-
@original = candidates_for(arg).find(&:file?).try(&:to_s)
|
15
|
-
end
|
16
|
-
|
17
|
-
def candidates_for arg
|
18
|
-
Enumerator.new do |y|
|
19
|
-
$LOAD_PATH.each do |dir|
|
20
|
-
y << Pathname.new(dir).join(arg)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,75 +0,0 @@
|
|
1
|
-
require 'active_support'
|
2
|
-
require 'active_support/callbacks'
|
3
|
-
|
4
|
-
module MotionBlender
|
5
|
-
class Analyzer
|
6
|
-
class Require
|
7
|
-
include ActiveSupport::Callbacks
|
8
|
-
define_callbacks :require
|
9
|
-
|
10
|
-
TOKENS = %i(motion_require require_relative require)
|
11
|
-
|
12
|
-
attr_accessor :loader, :method, :arg, :trace
|
13
|
-
|
14
|
-
def initialize loader, method, arg
|
15
|
-
@loader = loader
|
16
|
-
@method = method
|
17
|
-
@arg = arg
|
18
|
-
end
|
19
|
-
|
20
|
-
def file
|
21
|
-
@file ||= resolve_path
|
22
|
-
end
|
23
|
-
|
24
|
-
def resolve_path
|
25
|
-
path = candidates.find(&:file?)
|
26
|
-
fail LoadError, "not found `#{arg}'" unless path
|
27
|
-
explicit_relative path
|
28
|
-
end
|
29
|
-
|
30
|
-
def candidates
|
31
|
-
path =
|
32
|
-
if %i(motion_require require_relative).include? method
|
33
|
-
Pathname.new(loader).dirname.join(arg)
|
34
|
-
else
|
35
|
-
Pathname.new(arg)
|
36
|
-
end
|
37
|
-
dirs = path.relative? && load_path || ['']
|
38
|
-
exts = path.extname.empty? ? ['', '.rb'] : ['']
|
39
|
-
Enumerator.new do |y|
|
40
|
-
dirs.product(exts).each do |dir, ext|
|
41
|
-
y << Pathname.new(dir).join("#{path}#{ext}")
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def explicit_relative path
|
47
|
-
path.to_s.sub(%r{^(?![\./])}, './')
|
48
|
-
end
|
49
|
-
|
50
|
-
def uses_load_path?
|
51
|
-
method == :require
|
52
|
-
end
|
53
|
-
|
54
|
-
def load_path
|
55
|
-
if uses_load_path?
|
56
|
-
MotionBlender.config.motion_dirs + $LOAD_PATH
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def match? arg_or_file
|
61
|
-
arg == arg_or_file || file == arg_or_file
|
62
|
-
end
|
63
|
-
|
64
|
-
def excluded?
|
65
|
-
MotionBlender.config.builtin_features.include?(arg) ||
|
66
|
-
MotionBlender.config.excepted_files.include?(arg) ||
|
67
|
-
MotionBlender.config.excepted_files.include?(file)
|
68
|
-
end
|
69
|
-
|
70
|
-
def self.acceptable? method
|
71
|
-
TOKENS.include?(method)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
module MotionBlender
|
2
|
-
class Analyzer
|
3
|
-
class Source
|
4
|
-
attr_reader :code, :file, :line, :parent, :type, :method, :ast
|
5
|
-
attr_reader :evaluated
|
6
|
-
alias_method :evaluated?, :evaluated
|
7
|
-
|
8
|
-
def initialize attrs = {}
|
9
|
-
@evaluated = false
|
10
|
-
ast = attrs.delete :ast
|
11
|
-
if ast
|
12
|
-
@code = ast.loc.expression.try(:source)
|
13
|
-
@file = ast.loc.expression.try(:source_buffer).try(:name)
|
14
|
-
@line = ast.loc.expression.try(:line)
|
15
|
-
@type = ast.type.to_s.inquiry
|
16
|
-
@method = @type.send? ? ast.children[1] : nil
|
17
|
-
@ast = ast
|
18
|
-
end
|
19
|
-
attrs.each do |k, v|
|
20
|
-
instance_variable_set "@#{k}", v
|
21
|
-
end
|
22
|
-
@type = @type.to_s.inquiry
|
23
|
-
@method = @method.try(:to_sym)
|
24
|
-
end
|
25
|
-
|
26
|
-
def evaluated!
|
27
|
-
@evaluated = true
|
28
|
-
end
|
29
|
-
|
30
|
-
def children
|
31
|
-
@children ||=
|
32
|
-
if @ast
|
33
|
-
@ast.children.grep(::Parser::AST::Node).map do |ast|
|
34
|
-
Source.new(ast: ast, parent: self)
|
35
|
-
end
|
36
|
-
else
|
37
|
-
[]
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def attributes
|
42
|
-
{
|
43
|
-
'code' => @code,
|
44
|
-
'file' => @file,
|
45
|
-
'line' => @line,
|
46
|
-
'type' => @type.to_s,
|
47
|
-
'method' => @method.try(:to_s)
|
48
|
-
}
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|