motion_blender 0.1.2 → 0.1.3

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: be3d49bb1ba40b2cde3d4fa5bea800c1764ae21f
4
- data.tar.gz: c09c5e5c2d743614f290936de33a8ecc84c5761a
3
+ metadata.gz: 12f4f266de541f71f053210f9b089eb7a56fb77b
4
+ data.tar.gz: f30217e63c3c013a07862c1ea6f4413b749f6b26
5
5
  SHA512:
6
- metadata.gz: e3a6dcb4522f542645e24f58e60f8623588303a6c86271b029d573b5c899b8cdb5a4528f9b95f1a3a8dd04ca62be4743d3d9967985449258a594e26d5b5060da
7
- data.tar.gz: ac31ed89248e5adeab0b8ead925d030f9870b481d54ccb1def31f955994c4aba585fae1a37039a976ce73593d2124d1c5223d322ad9e3ee4a94222ef83cb8953
6
+ metadata.gz: 8bbca25180fa862d2cdf18dc13589a6dfe8260b6972c19c4be497e25a48519571afe21537281111553f24a6114961262fe5c622b9cd344f7c5d1c918ca2db2f1
7
+ data.tar.gz: dc18bde83fe86c28bdd3e4fbbaf38ea7e8fc0c5a04c92acb3b51ef6ba843918b524d97af251ee98fcb46a8de404d284bfce475fab8cb5bd9d0ce2e703a5aabbe
data/README.md CHANGED
@@ -102,7 +102,7 @@ Dir.glob('lib/**/*.rb').each { |path| require path }
102
102
  Dir[File.dirname(__FILE__) + '/lib/*.rb'].each { |file| require file }
103
103
  ```
104
104
 
105
- Required Files must exist:
105
+ Required files must exist:
106
106
 
107
107
  ```ruby
108
108
  # Bad
@@ -13,7 +13,7 @@ module MotionBlender
13
13
  def parse_args
14
14
  extractor = create_extractor
15
15
  extractor.instance_eval(@ast.loc.expression.source, @file)
16
- extractor.instance_eval { @args }
16
+ extractor.instance_eval { @args || [] }
17
17
  rescue
18
18
  if stack.any?
19
19
  Evaluator.new(@file, stack.last, stack[0..-2], @method).parse_args
@@ -2,15 +2,15 @@ require 'parser/current'
2
2
  require 'pathname'
3
3
 
4
4
  require 'motion_blender/analyzer/evaluator'
5
+ require 'motion_blender/analyzer/require'
5
6
 
6
7
  module MotionBlender
7
8
  class Analyzer
8
9
  class Parser
9
10
  REQUIREMENT_TOKENS = %i(motion_require require_relative require)
10
11
 
11
- Require = Struct.new(:loader, :method, :arg, :file, :trace)
12
-
13
12
  attr_reader :file, :requires, :last_trace
13
+ attr_accessor :exclude_files
14
14
 
15
15
  def initialize file
16
16
  @file = file.to_s
@@ -19,19 +19,21 @@ module MotionBlender
19
19
 
20
20
  def parse
21
21
  ast = ::Parser::CurrentRuby.parse(File.read(@file))
22
- traverse ast
22
+ traverse ast if ast
23
23
  end
24
24
 
25
25
  def traverse ast, stack = []
26
- if ast && ast.type == :send && require_command?(ast)
26
+ @exclude_files ||= Set.new
27
+ if ast.type == :send && require_command?(ast)
27
28
  @last_trace = trace_for ast
28
29
  Evaluator.new(@file, ast, stack).parse_args.each do |arg|
29
30
  req = Require.new(@file, ast.children[1], arg)
30
- req.file = resolve_path req.method, req.arg
31
+ next if @exclude_files.include? req.arg
32
+ next if @exclude_files.include? req.file
31
33
  req.trace = @last_trace
32
34
  @requires << req
33
35
  end
34
- elsif ast
36
+ else
35
37
  ast.children
36
38
  .select { |node| node.is_a?(::Parser::AST::Node) }
37
39
  .each { |node| traverse node, [*stack, ast] }
@@ -45,30 +47,6 @@ module MotionBlender
45
47
  def trace_for ast
46
48
  "#{@file}:#{ast.loc.line}:in `#{ast.children[1]}'"
47
49
  end
48
-
49
- def resolve_path method, arg
50
- if %i(motion_require require_relative).include? method
51
- arg = Pathname.new(@file).dirname.join(arg).to_s
52
- end
53
- path = candidates_for(arg, method == :require).find(&:file?)
54
- fail LoadError, "not found `#{arg}'" unless path
55
- explicit_relative path
56
- end
57
-
58
- def candidates_for feature, uses_load_path
59
- path = Pathname.new(feature)
60
- dirs = (uses_load_path && path.relative?) ? $LOAD_PATH : ['']
61
- exts = path.extname.empty? ? ['', '.rb'] : ['']
62
- Enumerator.new do |y|
63
- dirs.product(exts).each do |dir, ext|
64
- y << Pathname.new(dir).join("#{path}#{ext}")
65
- end
66
- end
67
- end
68
-
69
- def explicit_relative path
70
- path.to_s.sub(%r{^(?![\./])}, './')
71
- end
72
50
  end
73
51
  end
74
52
  end
@@ -0,0 +1,47 @@
1
+ module MotionBlender
2
+ class Analyzer
3
+ class Require
4
+ attr_accessor :loader, :method, :arg, :trace
5
+
6
+ def initialize loader, method, arg
7
+ @loader = loader
8
+ @method = method
9
+ @arg = arg
10
+ end
11
+
12
+ def file
13
+ @file ||= resolve_path
14
+ end
15
+
16
+ def resolve_path
17
+ path = candidates.find(&:file?)
18
+ fail LoadError, "not found `#{arg}'" unless path
19
+ explicit_relative path
20
+ end
21
+
22
+ def candidates
23
+ path =
24
+ if %i(motion_require require_relative).include? method
25
+ Pathname.new(loader).dirname.join(arg)
26
+ else
27
+ Pathname.new(arg)
28
+ end
29
+ dirs = (uses_load_path? && path.relative?) ? $LOAD_PATH : ['']
30
+ exts = path.extname.empty? ? ['', '.rb'] : ['']
31
+ Enumerator.new do |y|
32
+ dirs.product(exts).each do |dir, ext|
33
+ y << Pathname.new(dir).join("#{path}#{ext}")
34
+ end
35
+ end
36
+ end
37
+
38
+ def explicit_relative path
39
+ path.to_s.sub(%r{^(?![\./])}, './')
40
+ end
41
+
42
+ def uses_load_path?
43
+ method == :require
44
+ end
45
+ end
46
+ end
47
+ end
@@ -20,19 +20,18 @@ module MotionBlender
20
20
  @analyzed_files << file
21
21
 
22
22
  parser = Parser.new file
23
+ parser.exclude_files = @exclude_files
23
24
  begin
24
25
  parser.parse
25
26
  rescue LoadError => err
26
27
  err.set_backtrace [parser.last_trace, *backtrace].compact
27
28
  raise err
28
29
  end
29
- requires = parser.requires.reject do |req|
30
- @exclude_files.include? req.file
31
- end
32
30
 
31
+ requires = parser.requires
33
32
  if requires.any?
34
33
  @dependencies[file] = requires.map(&:file)
35
- @files = (@files + [file] + @dependencies[file]).uniq
34
+ @files = [*@files, file, *@dependencies[file]].uniq
36
35
  requires.each do |req|
37
36
  analyze req.file, [req.trace, *backtrace]
38
37
  end
@@ -1,3 +1,3 @@
1
1
  module MotionBlender
2
- VERSION = '0.1.2'
2
+ VERSION = '0.1.3'
3
3
  end
@@ -9,6 +9,7 @@ module MotionBlender
9
9
  Motion::Project::App.setup do |app|
10
10
  analyzer = Analyzer.new
11
11
  analyzer.exclude_files += Dir[File.expand_path('../**/*.rb', __FILE__)]
12
+ analyzer.exclude_files += builtin_features
12
13
  app.files.flatten.each do |file|
13
14
  analyzer.analyze file
14
15
  end
@@ -21,15 +22,32 @@ module MotionBlender
21
22
  end
22
23
  end
23
24
 
24
- def add file
25
- if defined?(Motion::Project::Config)
26
- Motion::Project::App.setup do |app|
27
- app.files.unshift file
28
- end
25
+ def add file = nil
26
+ return unless motion?
27
+
28
+ file ||= caller.first.split(':', 2).first
29
+ Motion::Project::App.setup do |app|
30
+ app.files.unshift file
29
31
  end
30
32
  end
31
33
 
34
+ def use_motion_dir dir = nil
35
+ return unless motion?
36
+
37
+ dir ||= File.expand_path('../../motion', caller.first.split(':', 2).first)
38
+ $LOAD_PATH.delete dir
39
+ $LOAD_PATH.unshift dir
40
+ end
41
+
42
+ def motion?
43
+ defined?(Motion::Project::Config)
44
+ end
45
+
32
46
  def ext_file
33
47
  File.expand_path('../../motion/ext.rb', __FILE__)
34
48
  end
49
+
50
+ def builtin_features
51
+ %w(bigdecimal date thread)
52
+ end
35
53
  end
data/motion/ext.rb CHANGED
@@ -14,6 +14,13 @@ end
14
14
  module MotionBlender
15
15
  module_function
16
16
 
17
- def add _
17
+ def add _ = nil
18
+ end
19
+
20
+ def use_motion_dir _ = nil
21
+ end
22
+
23
+ def motion?
24
+ true
18
25
  end
19
26
  end
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.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - kayhide
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-10-12 00:00:00.000000000 Z
11
+ date: 2015-10-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser
@@ -230,6 +230,7 @@ files:
230
230
  - lib/motion_blender/analyzer/evaluator.rb
231
231
  - lib/motion_blender/analyzer/hooker.rb
232
232
  - lib/motion_blender/analyzer/parser.rb
233
+ - lib/motion_blender/analyzer/require.rb
233
234
  - lib/motion_blender/rake_tasks.rb
234
235
  - lib/motion_blender/version.rb
235
236
  - motion/ext.rb