motion_blender 0.1.1 → 0.1.2

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: 1f62586a884e6abf4b6c8ae93a1d655764f28ad8
4
- data.tar.gz: 4e7a196e3652339c6dc76a35a0b5fd8b78d7b4e7
3
+ metadata.gz: be3d49bb1ba40b2cde3d4fa5bea800c1764ae21f
4
+ data.tar.gz: c09c5e5c2d743614f290936de33a8ecc84c5761a
5
5
  SHA512:
6
- metadata.gz: dcd57b42e5243744ae42c1f968c22c6b507d9a4240e5011a5e66bd19e20638c6768158c09c6afa09482f7680b38ed6d04739e97be15c5c4311b87c3c5c0cc9d7
7
- data.tar.gz: 1cb179e24b2989a47e0c9b27dbc14f4e32895e6b52dcd33a4c1aee37b8acafa95c6d878c70a3c2b225192f330b3b84e26a3f43cd88cfa6b2f149088bb7dbe873
6
+ metadata.gz: e3a6dcb4522f542645e24f58e60f8623588303a6c86271b029d573b5c899b8cdb5a4528f9b95f1a3a8dd04ca62be4743d3d9967985449258a594e26d5b5060da
7
+ data.tar.gz: ac31ed89248e5adeab0b8ead925d030f9870b481d54ccb1def31f955994c4aba585fae1a37039a976ce73593d2124d1c5223d322ad9e3ee4a94222ef83cb8953
data/README.md CHANGED
@@ -92,13 +92,17 @@ The argument must be a string or an eval-able expression:
92
92
  require 'something'
93
93
  require File.join('path', 'to', 'feature')
94
94
  require File.expand_path('../otherthing', __FILE__) # __FILE__ works properly
95
+ ```
95
96
 
96
- # Bad
97
- # analyzer does not eval outside of require method
97
+ Wrapped in outer loop, works fine:
98
+
99
+ ```ruby
100
+ # Good
98
101
  Dir.glob('lib/**/*.rb').each { |path| require path }
102
+ Dir[File.dirname(__FILE__) + '/lib/*.rb'].each { |file| require file }
99
103
  ```
100
104
 
101
- And required files must exist:
105
+ Required Files must exist:
102
106
 
103
107
  ```ruby
104
108
  # Bad
@@ -0,0 +1,36 @@
1
+ module MotionBlender
2
+ class Analyzer
3
+ class Evaluator
4
+ attr_reader :file, :ast, :stack
5
+
6
+ def initialize file, ast, stack = [], method = nil
7
+ @file = file
8
+ @ast = ast
9
+ @stack = stack
10
+ @method = method || @ast.children[1]
11
+ end
12
+
13
+ def parse_args
14
+ extractor = create_extractor
15
+ extractor.instance_eval(@ast.loc.expression.source, @file)
16
+ extractor.instance_eval { @args }
17
+ rescue
18
+ if stack.any?
19
+ Evaluator.new(@file, stack.last, stack[0..-2], @method).parse_args
20
+ else
21
+ exp = @ast.loc.expression.source
22
+ raise LoadError, "failed to parse `#{exp}'"
23
+ end
24
+ end
25
+
26
+ def create_extractor
27
+ obj = Object.new
28
+ obj.define_singleton_method @method do |arg|
29
+ @args ||= []
30
+ @args << arg
31
+ end
32
+ obj
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,6 +1,8 @@
1
1
  require 'parser/current'
2
2
  require 'pathname'
3
3
 
4
+ require 'motion_blender/analyzer/evaluator'
5
+
4
6
  module MotionBlender
5
7
  class Analyzer
6
8
  class Parser
@@ -20,17 +22,19 @@ module MotionBlender
20
22
  traverse ast
21
23
  end
22
24
 
23
- def traverse ast
25
+ def traverse ast, stack = []
24
26
  if ast && ast.type == :send && require_command?(ast)
25
27
  @last_trace = trace_for ast
26
- req = parse_arg ast
27
- req.file = resolve_path req.method, req.arg
28
- req.trace = @last_trace
29
- @requires << req
28
+ Evaluator.new(@file, ast, stack).parse_args.each do |arg|
29
+ req = Require.new(@file, ast.children[1], arg)
30
+ req.file = resolve_path req.method, req.arg
31
+ req.trace = @last_trace
32
+ @requires << req
33
+ end
30
34
  elsif ast
31
35
  ast.children
32
36
  .select { |node| node.is_a?(::Parser::AST::Node) }
33
- .each { |node| traverse node }
37
+ .each { |node| traverse node, [*stack, ast] }
34
38
  end
35
39
  end
36
40
 
@@ -38,23 +42,10 @@ module MotionBlender
38
42
  REQUIREMENT_TOKENS.include?(ast.children[1])
39
43
  end
40
44
 
41
- def parse_arg ast
42
- arg_ast = ast.children[2]
43
- arg = eval arg_ast.loc.expression.source, clean_binding, @file
44
- Require.new(@file, ast.children[1], arg)
45
- rescue
46
- exp = ast.loc.expression.source
47
- raise LoadError, "failed to parse `#{exp}'"
48
- end
49
-
50
45
  def trace_for ast
51
46
  "#{@file}:#{ast.loc.line}:in `#{ast.children[1]}'"
52
47
  end
53
48
 
54
- def clean_binding
55
- binding
56
- end
57
-
58
49
  def resolve_path method, arg
59
50
  if %i(motion_require require_relative).include? method
60
51
  arg = Pathname.new(@file).dirname.join(arg).to_s
@@ -1,3 +1,3 @@
1
1
  module MotionBlender
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.2'
3
3
  end
@@ -32,4 +32,5 @@ Gem::Specification.new do |spec|
32
32
  spec.add_development_dependency 'guard-rubocop'
33
33
  spec.add_development_dependency 'simplecov'
34
34
  spec.add_development_dependency 'simplecov-gem-profile'
35
+ spec.add_development_dependency 'activesupport', '~> 4.2'
35
36
  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.1
4
+ version: 0.1.2
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-07 00:00:00.000000000 Z
11
+ date: 2015-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser
@@ -192,6 +192,20 @@ dependencies:
192
192
  - - ">="
193
193
  - !ruby/object:Gem::Version
194
194
  version: '0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: activesupport
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '4.2'
202
+ type: :development
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '4.2'
195
209
  description: MotionBlender loads ruby gems for RubyMotion
196
210
  email:
197
211
  - kayhide@gmail.com
@@ -213,6 +227,7 @@ files:
213
227
  - bin/setup
214
228
  - lib/motion_blender.rb
215
229
  - lib/motion_blender/analyzer.rb
230
+ - lib/motion_blender/analyzer/evaluator.rb
216
231
  - lib/motion_blender/analyzer/hooker.rb
217
232
  - lib/motion_blender/analyzer/parser.rb
218
233
  - lib/motion_blender/rake_tasks.rb