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 +4 -4
- data/README.md +7 -3
- data/lib/motion_blender/analyzer/evaluator.rb +36 -0
- data/lib/motion_blender/analyzer/parser.rb +10 -19
- data/lib/motion_blender/version.rb +1 -1
- data/motion_blender.gemspec +1 -0
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be3d49bb1ba40b2cde3d4fa5bea800c1764ae21f
|
4
|
+
data.tar.gz: c09c5e5c2d743614f290936de33a8ecc84c5761a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
97
|
-
|
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
|
-
|
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
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
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
|
data/motion_blender.gemspec
CHANGED
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.
|
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-
|
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
|