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 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