motion_blender 0.1.2 → 0.1.3

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