motion_blender 0.3.0 → 0.3.1

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: 5702d8540efa7410bdfbdeb2310dabba7669002b
4
- data.tar.gz: 65874dc4ed3a275906aeee85b8200ce82f5ad254
3
+ metadata.gz: 4e0a26f4930010d2e1105308d10fb471cc3e3892
4
+ data.tar.gz: f537cd46e5096820fc007f634aa127384a7d9bfe
5
5
  SHA512:
6
- metadata.gz: 23937538ee2436fdc637771e9f51f4f087f841c7d859c68fc7efbd65863d1f8da363484a9131823b7f1f2bdd3c32a65e3052ec6c30f6fcae93c177c3493b4fd3
7
- data.tar.gz: fb2e5bab0da21a3f99070c8e280994cea6e75b53373d3d232c61aaa07b8440d50765f64f30211f8fadbf642dea5005a8e9aca86e122809c577449510f9346a54
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,4 +1,8 @@
1
+ os: osx
1
2
  language: ruby
2
3
  rvm:
3
4
  - 2.2.3
4
- before_install: gem install bundler -v 1.10.6
5
+ before_install:
6
+ - gem install bundler -v 1.10.6
7
+ - brew update
8
+ - brew install graphviz --with-gts
@@ -1,6 +1,4 @@
1
- require 'motion_blender/analyzer/source'
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
- extractor = Extractor.new(@source.file)
25
- extractor.instance_eval(@source.code, @source.file, @source.line)
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/source'
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
- ast = ::Parser::CurrentRuby.parse_file(@file)
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 require_command?(source)
40
+ if Collector.requirable?(source)
44
41
  evaluate source
45
- elsif !raketime_block?(source)
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, :cache
8
+ attr_reader :files, :dependencies
9
9
 
10
10
  def initialize
11
11
  @analyzed_files = Set.new
@@ -11,7 +11,7 @@ module MotionBlender
11
11
  def on_require file = nil, &proc
12
12
  filters = {}
13
13
  filters[:if] = -> { match? file } if file
14
- Analyzer::Require.set_callback(:require, filters, &proc)
14
+ Require.set_callback(:require, filters, &proc)
15
15
  end
16
16
  end
17
17
 
@@ -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 thread)
13
+ @builtin_features = Set.new %w(bigdecimal rational date)
14
14
  @cache_dir = Pathname.new('build/analyze')
15
15
  end
16
16
  end
@@ -0,0 +1,13 @@
1
+ require 'tsort'
2
+
3
+ module MotionBlender
4
+ class DependencyGraph < Hash
5
+ include TSort
6
+
7
+ alias_method :tsort_each_node, :each_key
8
+
9
+ def tsort_each_child node, &block
10
+ (self[node] || []).each(&block)
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,4 @@
1
+ MotionBlender.incept
2
+ MotionBlender.use_motion_dir
3
+
4
+ require 'motion_blender/ext'
@@ -1,4 +1,2 @@
1
- MotionBlender.incept
2
- MotionBlender.use_motion_dir
3
-
4
- require 'motion_blender/ext'
1
+ require 'motion_blender/ext/raketime'
2
+ require 'motion_blender/ext/runtime'
@@ -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
@@ -1,3 +1,3 @@
1
1
  module MotionBlender
2
- VERSION = '0.3.0'
2
+ VERSION = '0.3.1'
3
3
  end
@@ -4,7 +4,6 @@ require 'active_support/core_ext'
4
4
  require 'motion_blender/version'
5
5
  require 'motion_blender/rake_tasks'
6
6
  require 'motion_blender/callbacks'
7
- require 'motion_blender/ext/raketime'
8
7
  require 'motion_blender/ext'
9
8
 
10
9
  MotionBlender.except
@@ -0,0 +1,10 @@
1
+ class Object
2
+ def require *_
3
+ end
4
+
5
+ def require_relative *_
6
+ end
7
+
8
+ def __ORIGINAL__ *_
9
+ end
10
+ end
@@ -1,2 +1,2 @@
1
1
  require 'motion_blender/ext/runtime'
2
- require 'motion_blender/ext/require_suppressor'
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.0
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-03 00:00:00.000000000 Z
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
@@ -1,15 +0,0 @@
1
- Module.new do
2
- def require _
3
- end
4
-
5
- def require_relative _
6
- end
7
-
8
- def motion_require _
9
- end
10
-
11
- def __ORIGINAL__
12
- end
13
-
14
- Object.send :include, self
15
- end