motion_blender 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +107 -10
- data/lib/motion_blender/analyzer/parser.rb +5 -5
- data/lib/motion_blender/analyzer.rb +13 -8
- data/lib/motion_blender/version.rb +1 -1
- data/lib/motion_blender.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f62586a884e6abf4b6c8ae93a1d655764f28ad8
|
4
|
+
data.tar.gz: 4e7a196e3652339c6dc76a35a0b5fd8b78d7b4e7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dcd57b42e5243744ae42c1f968c22c6b507d9a4240e5011a5e66bd19e20638c6768158c09c6afa09482f7680b38ed6d04739e97be15c5c4311b87c3c5c0cc9d7
|
7
|
+
data.tar.gz: 1cb179e24b2989a47e0c9b27dbc14f4e32895e6b52dcd33a4c1aee37b8acafa95c6d878c70a3c2b225192f330b3b84e26a3f43cd88cfa6b2f149088bb7dbe873
|
data/README.md
CHANGED
@@ -1,28 +1,125 @@
|
|
1
|
-
# MotionBlender
|
1
|
+
# MotionBlender [![Build Status](https://travis-ci.org/kayhide/motion_blender.svg?branch=master)](https://travis-ci.org/kayhide/motion_blender)
|
2
2
|
|
3
|
-
|
3
|
+
MotionBlender enables to:
|
4
4
|
|
5
|
-
|
5
|
+
- require *Ruby* files (must be RubyMotion-compatible) from RubyMotion files
|
6
|
+
- require RubyMotion files from RubyMotion files as well
|
7
|
+
|
8
|
+
and then:
|
9
|
+
|
10
|
+
- add required files to `app.files`
|
11
|
+
- resolve dependencies following require tree and put it to `app.files_dependencies`
|
12
|
+
|
13
|
+
This is a sccessor of [motion-require](https://github.com/clayallsopp/motion-require) and [MotionBundler](https://github.com/archan937/motion-bundler).
|
14
|
+
|
15
|
+
*motion-require* is to resolve dependencies between RubyMotion files with `motion_require` method.
|
16
|
+
This is only for RubyMotion files and not for using Ruby gems.
|
17
|
+
|
18
|
+
*MotionBundler* aims for using Ruby gems from RubyMotion.
|
19
|
+
This is good for making an application but not for making a gem, because it requires to setup your application Gemfile explicitly.
|
20
|
+
|
21
|
+
|
22
|
+
So, MotionBlender is good for making RubyMotion-compatible gem which depends on other RubyMotion-compatible gems.
|
23
|
+
|
24
|
+
I made a fork of MotionSupport which is based on MotionBlender:
|
25
|
+
|
26
|
+
- [motion_blender-support](https://github.com/kayhide/motion_blender-support)
|
27
|
+
|
28
|
+
This is ready to use to make RubyMotion-compatible gems.
|
6
29
|
|
7
30
|
## Installation
|
8
31
|
|
32
|
+
### When making a gem
|
33
|
+
|
34
|
+
Add a dependency:
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
# in .gemspec file
|
38
|
+
|
39
|
+
Gem::Specification.new do |spec|
|
40
|
+
# ...
|
41
|
+
spec.add_runtime_dependency "motion_blender"
|
42
|
+
# ...
|
43
|
+
end
|
44
|
+
```
|
45
|
+
|
46
|
+
### When making an application
|
47
|
+
|
9
48
|
Add this line to your application's Gemfile:
|
10
49
|
|
11
50
|
```ruby
|
12
51
|
gem 'motion_blender'
|
13
52
|
```
|
14
53
|
|
15
|
-
|
54
|
+
## Usage
|
16
55
|
|
17
|
-
|
56
|
+
Add RubyMotion-compatible gem into your project (may be an application or a gem).
|
18
57
|
|
19
|
-
|
58
|
+
And just call `require` from anywhare:
|
20
59
|
|
21
|
-
|
60
|
+
```ruby
|
61
|
+
require 'rubymotion_conpatible_gem'
|
22
62
|
|
23
|
-
|
63
|
+
# your code goes on...
|
64
|
+
```
|
65
|
+
|
66
|
+
Writing a gem (*motion_hoge*), this idiom is handy:
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
# in lib/motion_hoge.rb
|
70
|
+
require 'motion_blender'
|
71
|
+
MotionBlender.add __FILE__
|
72
|
+
|
73
|
+
require 'motion_hoge/simsim'
|
74
|
+
require 'motion_hoge/mishmish'
|
75
|
+
require 'motion_hoge/version'
|
76
|
+
# ...
|
77
|
+
```
|
78
|
+
|
79
|
+
This makes an app or a gem which depends on *motion_hoge* to load functionalities properly, even if it is compile-time.
|
80
|
+
|
81
|
+
As a default, `motion_blender` lib files themselves are excluded for analyzing.
|
82
|
+
So don't worry about requiring `motion_blender` in compile target files.
|
83
|
+
|
84
|
+
### Limitation
|
85
|
+
|
86
|
+
Currently, `require` has some limitation because of the way how to analyze the code.
|
87
|
+
|
88
|
+
The argument must be a string or an eval-able expression:
|
89
|
+
|
90
|
+
```ruby
|
91
|
+
# Good
|
92
|
+
require 'something'
|
93
|
+
require File.join('path', 'to', 'feature')
|
94
|
+
require File.expand_path('../otherthing', __FILE__) # __FILE__ works properly
|
95
|
+
|
96
|
+
# Bad
|
97
|
+
# analyzer does not eval outside of require method
|
98
|
+
Dir.glob('lib/**/*.rb').each { |path| require path }
|
99
|
+
```
|
100
|
+
|
101
|
+
And required files must exist:
|
102
|
+
|
103
|
+
```ruby
|
104
|
+
# Bad
|
105
|
+
begin
|
106
|
+
require 'may_not_exist'
|
107
|
+
rescue LoadError
|
108
|
+
require 'alternative'
|
109
|
+
end
|
110
|
+
```
|
111
|
+
|
112
|
+
## How does it work?
|
113
|
+
|
114
|
+
In the RubyMotion application's Rakefile, `motion_blender` is to be required, typically via `Bundler.require`.
|
115
|
+
Then it hooks `build` tasks.
|
116
|
+
You can hit `rake -P` and see `motion_blender:analyze` task is hooked.
|
117
|
+
|
118
|
+
At the analyze task, MotionBlender runs analyzer on all `Motion::Project::Config#files`.
|
119
|
+
It uses [parser](https://github.com/whitequark/parser) and follows all `require` and `require_relative`.
|
120
|
+
After that, add the newly encountered files to the head of `Motion::Project::Config#files` and put file dependencies to `Motion::Project::Config#dependencies`.
|
24
121
|
|
25
|
-
|
122
|
+
When compiling, `require` and `require_relative` is overwritten as noop.
|
26
123
|
|
27
124
|
## Development
|
28
125
|
|
@@ -32,7 +129,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
32
129
|
|
33
130
|
## Contributing
|
34
131
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/kayhide/motion_blender. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
|
132
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/kayhide/motion_blender. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
|
36
133
|
|
37
134
|
|
38
135
|
## License
|
@@ -6,9 +6,9 @@ module MotionBlender
|
|
6
6
|
class Parser
|
7
7
|
REQUIREMENT_TOKENS = %i(motion_require require_relative require)
|
8
8
|
|
9
|
-
Require = Struct.new(:loader, :method, :arg, :file)
|
9
|
+
Require = Struct.new(:loader, :method, :arg, :file, :trace)
|
10
10
|
|
11
|
-
attr_reader :file, :requires
|
11
|
+
attr_reader :file, :requires, :last_trace
|
12
12
|
|
13
13
|
def initialize file
|
14
14
|
@file = file.to_s
|
@@ -22,16 +22,16 @@ module MotionBlender
|
|
22
22
|
|
23
23
|
def traverse ast
|
24
24
|
if ast && ast.type == :send && require_command?(ast)
|
25
|
+
@last_trace = trace_for ast
|
25
26
|
req = parse_arg ast
|
26
27
|
req.file = resolve_path req.method, req.arg
|
28
|
+
req.trace = @last_trace
|
27
29
|
@requires << req
|
28
30
|
elsif ast
|
29
31
|
ast.children
|
30
32
|
.select { |node| node.is_a?(::Parser::AST::Node) }
|
31
33
|
.each { |node| traverse node }
|
32
34
|
end
|
33
|
-
rescue LoadError => err
|
34
|
-
raise err, err.message, [trace_for(ast), *caller]
|
35
35
|
end
|
36
36
|
|
37
37
|
def require_command? ast
|
@@ -44,7 +44,7 @@ module MotionBlender
|
|
44
44
|
Require.new(@file, ast.children[1], arg)
|
45
45
|
rescue
|
46
46
|
exp = ast.loc.expression.source
|
47
|
-
raise LoadError, "failed to parse `#{exp}'"
|
47
|
+
raise LoadError, "failed to parse `#{exp}'"
|
48
48
|
end
|
49
49
|
|
50
50
|
def trace_for ast
|
@@ -9,27 +9,32 @@ module MotionBlender
|
|
9
9
|
|
10
10
|
def initialize
|
11
11
|
@analyzed_files = Set.new
|
12
|
+
@exclude_files = Set.new
|
12
13
|
@files = []
|
13
14
|
@dependencies = {}
|
14
|
-
@exclude_files = []
|
15
15
|
end
|
16
16
|
|
17
|
-
def analyze file
|
17
|
+
def analyze file, backtrace = []
|
18
18
|
return if @exclude_files.include? file
|
19
19
|
return if @analyzed_files.include? file
|
20
20
|
@analyzed_files << file
|
21
21
|
|
22
22
|
parser = Parser.new file
|
23
|
-
|
24
|
-
|
23
|
+
begin
|
24
|
+
parser.parse
|
25
|
+
rescue LoadError => err
|
26
|
+
err.set_backtrace [parser.last_trace, *backtrace].compact
|
27
|
+
raise err
|
28
|
+
end
|
29
|
+
requires = parser.requires.reject do |req|
|
25
30
|
@exclude_files.include? req.file
|
26
31
|
end
|
27
32
|
|
28
|
-
if
|
29
|
-
@dependencies[file] =
|
33
|
+
if requires.any?
|
34
|
+
@dependencies[file] = requires.map(&:file)
|
30
35
|
@files = (@files + [file] + @dependencies[file]).uniq
|
31
|
-
|
32
|
-
analyze
|
36
|
+
requires.each do |req|
|
37
|
+
analyze req.file, [req.trace, *backtrace]
|
33
38
|
end
|
34
39
|
end
|
35
40
|
end
|
data/lib/motion_blender.rb
CHANGED
@@ -8,7 +8,7 @@ module MotionBlender
|
|
8
8
|
def analyze
|
9
9
|
Motion::Project::App.setup do |app|
|
10
10
|
analyzer = Analyzer.new
|
11
|
-
analyzer.exclude_files
|
11
|
+
analyzer.exclude_files += Dir[File.expand_path('../**/*.rb', __FILE__)]
|
12
12
|
app.files.flatten.each do |file|
|
13
13
|
analyzer.analyze file
|
14
14
|
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.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kayhide
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|