rusby 0.1.0 → 0.1.1
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 +4 -4
- data/.travis.yml +3 -1
- data/README.md +35 -5
- data/doc/slides.key +0 -0
- data/lib/rusby.rb +5 -7
- data/lib/rusby/builder.rb +28 -11
- data/lib/rusby/core.rb +13 -4
- data/lib/rusby/generators/assignments.rb +2 -1
- data/lib/rusby/generators/base.rb +18 -14
- data/lib/rusby/generators/conditionals.rb +6 -7
- data/lib/rusby/generators/loops.rb +8 -4
- data/lib/rusby/generators/misc.rb +2 -1
- data/lib/rusby/generators/strings.rb +3 -1
- data/lib/rusby/postprocessor.rb +6 -4
- data/lib/rusby/profiler.rb +2 -1
- data/lib/rusby/rust.rb +2 -1
- data/lib/rusby/version.rb +1 -1
- data/rusby.gemspec +5 -4
- metadata +3 -33
- data/Gemfile.lock +0 -51
- data/examples/Gemfile.lock +0 -31
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c3194c9f2b246c00288fbe537b79ebf90484ace2
|
4
|
+
data.tar.gz: 7725bf97b5b7612fab8bce40108dbf415ca85054
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5b89750908323e010f5cabd541cc45390de0ed67ec6f5ca2d18d9f65928b713305bb2055242133384b280a7abc96fed352701814893e0597e8e7ba4696f6c6a5
|
7
|
+
data.tar.gz: bb5dd9f51c4578aa8a7ad22b64368ce3fdf9d01a7ed1b966f495f335bbd3da6384b0d7b06612352bc5f595141094c4116826fd365ba73a962bd801a7028425fa
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
## About
|
2
2
|
|
3
|
+
[](https://travis-ci.org/rambler-digital-solutions/rusby)
|
4
|
+
|
3
5
|
**Rusby** is a *Ruby* to *Rust* transpiler for simple performance-oriented methods.
|
4
6
|
|
5
7
|
Computations in plain Ruby are painfully slow.
|
@@ -42,21 +44,49 @@ Transpilation was tested only on cases in `./examples` directory.
|
|
42
44
|
- Integer matrix manipulation support
|
43
45
|
|
44
46
|
## Quickstart
|
45
|
-
```
|
46
|
-
|
47
|
-
|
47
|
+
```shell
|
48
|
+
curl -sSf https://static.rust-lang.org/rustup.sh | sh # or install rust via your package manager
|
49
|
+
git clone https://github.com/rambler-digital-solutions/rusby
|
50
|
+
cd rusby/examples
|
48
51
|
bundle
|
49
52
|
ruby run_examples.rb
|
50
53
|
```
|
51
54
|
|
52
|
-
|
55
|
+
or
|
56
|
+
|
57
|
+
```shell
|
58
|
+
gem install rusby
|
53
59
|
```
|
60
|
+
|
61
|
+
Create file test.rb:
|
62
|
+
```ruby
|
63
|
+
require 'rusby'
|
64
|
+
|
65
|
+
class FanaticGreeter
|
66
|
+
extend Rusby::Core
|
67
|
+
|
68
|
+
rusby!
|
69
|
+
def greet(name)
|
70
|
+
"Hello, #{name}!"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
greeter = FanaticGreeter.new
|
75
|
+
2.times { greeter.greet('Ash') }
|
76
|
+
```
|
77
|
+
|
78
|
+
```shell
|
79
|
+
ruby test.rb
|
80
|
+
```
|
81
|
+
|
82
|
+
## Tests
|
83
|
+
```shell
|
54
84
|
rake spec
|
55
85
|
```
|
56
86
|
|
57
87
|
## Contributing
|
58
88
|
|
59
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
89
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/rambler-digital-solutions/rusby. 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.
|
60
90
|
|
61
91
|
|
62
92
|
## License
|
data/doc/slides.key
CHANGED
Binary file
|
data/lib/rusby.rb
CHANGED
@@ -1,12 +1,10 @@
|
|
1
|
-
require 'parser/ruby22'
|
2
|
-
require 'yaml'
|
3
|
-
require 'hashie'
|
4
|
-
require 'method_source'
|
5
|
-
require 'colorize'
|
6
1
|
require 'benchmark'
|
2
|
+
require 'colorize'
|
7
3
|
require 'ffi'
|
8
|
-
|
9
|
-
require
|
4
|
+
require 'hashie'
|
5
|
+
require 'method_source'
|
6
|
+
require 'parser/current'
|
7
|
+
require 'yaml'
|
10
8
|
|
11
9
|
rusby_dir = File.expand_path('../rusby', __FILE__)
|
12
10
|
Dir["#{rusby_dir}/**/*.rb"].each { |file| require file }
|
data/lib/rusby/builder.rb
CHANGED
@@ -9,8 +9,8 @@ module Rusby
|
|
9
9
|
def lib_path
|
10
10
|
return @lib_path if @lib_path
|
11
11
|
path = './tmp/rusby'
|
12
|
-
Dir.mkdir('./tmp') unless Dir.
|
13
|
-
Dir.mkdir(path) unless Dir.
|
12
|
+
Dir.mkdir('./tmp') unless Dir.exist?('./tmp')
|
13
|
+
Dir.mkdir(path) unless Dir.exist?(path)
|
14
14
|
@lib_path = path
|
15
15
|
end
|
16
16
|
|
@@ -48,8 +48,13 @@ module Rusby
|
|
48
48
|
meta[method_name][:args],
|
49
49
|
meta[method_name][:result]
|
50
50
|
)
|
51
|
-
puts "Compiling #{signature.last} #{method_name}
|
52
|
-
|
51
|
+
puts "Compiling #{signature.last} #{method_name}" \
|
52
|
+
"(#{signature.first.join(', ')})".colorize(:yellow)
|
53
|
+
command = 'rustc -A unused_imports --crate-type=dylib '
|
54
|
+
command += "-O -o #{lib_path}/#{method_name}.dylib "
|
55
|
+
command += "#{lib_path}/#{method_name}.rs"
|
56
|
+
puts `#{command}`
|
57
|
+
|
53
58
|
|
54
59
|
Proxy.rusby_load "#{lib_path}/#{method_name}"
|
55
60
|
Proxy.attach_function "ffi_#{method_name}", *signature
|
@@ -97,12 +102,17 @@ module Rusby
|
|
97
102
|
'',
|
98
103
|
'// this function folds ffi arguments and unfolds result to ffi types'
|
99
104
|
]
|
100
|
-
result << "#{rust.exposed_method_prefix} fn
|
105
|
+
result << "#{rust.exposed_method_prefix} fn " \
|
106
|
+
"ffi_#{method_name}(#{args.join(', ')}) -> " \
|
107
|
+
"#{rust.rust_to_ffi_types[return_type] || rust.rust_types[return_type]}" \
|
108
|
+
' {'
|
101
109
|
arg_names.each_with_index.map do |arg_name, i|
|
102
|
-
|
110
|
+
# for simple args we don't need any convertion
|
111
|
+
next unless rust.ffi_to_rust[arg_types[i]]
|
103
112
|
result << rust.ffi_to_rust[arg_types[i]].gsub('<name>', arg_name).to_s
|
104
113
|
end
|
105
|
-
|
114
|
+
# calls the real method with ffi args folded
|
115
|
+
result << "let result = #{method_name}(#{arg_names.join(', ')});"
|
106
116
|
result << "return #{rust.rust_to_ffi[return_type] || 'result'};"
|
107
117
|
result << '}'
|
108
118
|
|
@@ -113,17 +123,24 @@ module Rusby
|
|
113
123
|
arg_types = meta[:args]
|
114
124
|
return_type = meta[:result]
|
115
125
|
|
116
|
-
ast = Parser::
|
126
|
+
ast = Parser::CurrentRuby.parse(source)
|
117
127
|
method_name = ast.children[0]
|
118
128
|
arg_names = ast.children[1].children.map { |ch| ch.children[0].to_s }
|
119
129
|
meta[:names] = arg_names
|
120
130
|
|
121
|
-
result =
|
131
|
+
result = []
|
132
|
+
if exposed
|
133
|
+
result = ffi_wrapper(method_name, arg_names, arg_types, return_type)
|
134
|
+
end
|
122
135
|
result << rust.method_prefix
|
123
136
|
|
124
|
-
args = arg_names.each_with_index.map
|
137
|
+
args = arg_names.each_with_index.map do |arg_name, i|
|
138
|
+
"#{arg_name}: #{rust.rust_types[arg_types[i]]}"
|
139
|
+
end
|
125
140
|
|
126
|
-
result << "fn #{exposed ? '' : 'internal_method_'}
|
141
|
+
result << "fn #{exposed ? '' : 'internal_method_'}" \
|
142
|
+
"#{method_name}(#{args.join(', ')}) -> " \
|
143
|
+
"#{rust.rust_types[return_type]} {"
|
127
144
|
result << rust_method_body(meta, ast)
|
128
145
|
result << '}'
|
129
146
|
|
data/lib/rusby/core.rb
CHANGED
@@ -21,14 +21,17 @@ module Rusby
|
|
21
21
|
bound_method = method_reference.bind(object)
|
22
22
|
result = bound_method.call(*args)
|
23
23
|
|
24
|
-
@rusby_method_table[method_name][:args] = args.map
|
24
|
+
@rusby_method_table[method_name][:args] = args.map do |arg|
|
25
|
+
rusby_type(arg)
|
26
|
+
end
|
25
27
|
@rusby_method_table[method_name][:result] = rusby_type(result)
|
26
28
|
|
27
29
|
if @rusby_method_table[method_name][:exposed]
|
28
30
|
# try to convert to rust or return back the original method
|
29
31
|
rusby_convert_or_bust(method_name, method_reference, object, args)
|
30
32
|
else
|
31
|
-
# if we don't need to convert method to
|
33
|
+
# if we don't need to convert method to
|
34
|
+
# rust return back the original method
|
32
35
|
rusby_replace_method(method_name, method_reference)
|
33
36
|
end
|
34
37
|
|
@@ -63,8 +66,14 @@ module Rusby
|
|
63
66
|
end
|
64
67
|
|
65
68
|
# check if rust method is running faster than the original one
|
66
|
-
puts
|
67
|
-
|
69
|
+
puts "Benchmarking native and rust methods" \
|
70
|
+
" (intertwined pattern)".colorize(:yellow)
|
71
|
+
boost = Profiler.benchit(
|
72
|
+
object,
|
73
|
+
method_reference,
|
74
|
+
wrapped_rust_method,
|
75
|
+
args
|
76
|
+
)
|
68
77
|
|
69
78
|
# coose between rust and ruby methods
|
70
79
|
resulting_method = method_reference
|
@@ -2,21 +2,22 @@ module Rusby
|
|
2
2
|
module Generators
|
3
3
|
module Base
|
4
4
|
def generate(ast)
|
5
|
-
|
5
|
+
if ast.respond_to?(:type)
|
6
|
+
send("generate_#{ast.type.to_s.tr('-', '_')}", ast)
|
7
|
+
else
|
6
8
|
# ok, it's not ast node, but it could be a method
|
7
9
|
# redefine internal ruby methods as needed
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
10
|
+
case ast
|
11
|
+
when :<< || :>>
|
12
|
+
ast
|
13
|
+
when :length
|
14
|
+
'.len()'
|
15
|
+
when :min
|
16
|
+
'.iter().min()'
|
17
|
+
else
|
18
|
+
ast.to_s
|
19
|
+
end
|
18
20
|
end
|
19
|
-
send("generate_#{ast.type.to_s.tr('-', '_')}", ast)
|
20
21
|
end
|
21
22
|
|
22
23
|
def generate_send(ast)
|
@@ -26,7 +27,8 @@ module Rusby
|
|
26
27
|
verb = ast.children[1]
|
27
28
|
case verb
|
28
29
|
when :puts
|
29
|
-
"\nprintln!(\"{}\", #{generate(ast.children[2])});
|
30
|
+
"\nprintln!(\"{}\", #{generate(ast.children[2])});" \
|
31
|
+
"io::stdout().flush().unwrap();\n"
|
30
32
|
# argument of this ruby method is rust code "as is"
|
31
33
|
when :rust
|
32
34
|
ast.children[2].children[0] + ' // generated by Rusby::Preprocessor'
|
@@ -39,7 +41,9 @@ module Rusby
|
|
39
41
|
|
40
42
|
arguments = fold_arrays(ast.children[2..-1])
|
41
43
|
result = "#{verb}(#{arguments.join(', ')});"
|
42
|
-
|
44
|
+
unless known_method?(ast.children[1])
|
45
|
+
result = 'internal_method_' + result
|
46
|
+
end
|
43
47
|
result
|
44
48
|
end
|
45
49
|
end
|
@@ -2,16 +2,15 @@ module Rusby
|
|
2
2
|
module Generators
|
3
3
|
module Conditionals
|
4
4
|
def generate_if(ast)
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
end
|
10
|
-
result.gsub(/^\s+/, '')
|
5
|
+
if ast.children[1]
|
6
|
+
generate_regular_if(ast)
|
7
|
+
else
|
8
|
+
generate_unless(ast)
|
9
|
+
end.gsub(/^\s+/, '')
|
11
10
|
end
|
12
11
|
|
13
12
|
def generate_unless(ast)
|
14
|
-
|
13
|
+
<<-EOF
|
15
14
|
if !(#{generate(ast.children[0])}) {
|
16
15
|
#{generate(ast.children[2])}
|
17
16
|
}
|
@@ -36,18 +36,22 @@ module Rusby
|
|
36
36
|
def generate_each_loop_range(ast)
|
37
37
|
range = ast.children[0].children[0].children[0]
|
38
38
|
range_start = range.children[0].children[0]
|
39
|
-
|
39
|
+
# rust range is inclusive
|
40
|
+
range_end = "(#{range.children[1].children[0]} + 1)"
|
40
41
|
range_variable = ast.children[1].children[0].children[0]
|
41
42
|
statements = ast.children[1..-1].map { |node| generate(node) }.compact
|
42
|
-
"for #{range_variable} in #{range_start}..#{range_end}
|
43
|
+
"for #{range_variable} in #{range_start}..#{range_end}" \
|
44
|
+
" {\n#{statements.join("\n")}\n}"
|
43
45
|
end
|
44
46
|
|
45
47
|
def generate_while(ast)
|
46
|
-
"while #{generate(ast.children[0])}
|
48
|
+
"while #{generate(ast.children[0])}" \
|
49
|
+
" {\n#{generate(ast.children[1])}\n}"
|
47
50
|
end
|
48
51
|
|
49
52
|
def generate_while_post(ast)
|
50
|
-
"while {\n#{generate(ast.children[1])};\n
|
53
|
+
"while {\n#{generate(ast.children[1])};\n" \
|
54
|
+
"#{generate(ast.children[0])}\n}{}"
|
51
55
|
end
|
52
56
|
end
|
53
57
|
end
|
@@ -14,7 +14,8 @@ module Rusby
|
|
14
14
|
|
15
15
|
def generate_return(ast)
|
16
16
|
statements = ast.children.map { |node| generate(node) }
|
17
|
-
"return #{statements.any? ? statements.join(',') : '&-ptr'}
|
17
|
+
"return #{statements.any? ? statements.join(',') : '&-ptr'}" \
|
18
|
+
" as #{@return_type};"
|
18
19
|
end
|
19
20
|
|
20
21
|
def generate_kwbegin(ast)
|
data/lib/rusby/postprocessor.rb
CHANGED
@@ -5,10 +5,12 @@ module Rusby
|
|
5
5
|
def apply(code, meta)
|
6
6
|
# fold the array syntax
|
7
7
|
meta[:args].each_with_index do |el, idx|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
next unless el == 'String'
|
9
|
+
code.gsub!(
|
10
|
+
/#{meta[:names][idx]}\[(.+?)\]/,
|
11
|
+
"#{meta[:names][idx]}.chars().nth(\\1)"
|
12
|
+
)
|
13
|
+
code.gsub!(/;+/, ';')
|
12
14
|
end
|
13
15
|
# process array :<< and :>> operator
|
14
16
|
code.gsub!(/(?:<<|>>)(\S+)/, '.push(\1);')
|
data/lib/rusby/profiler.rb
CHANGED
@@ -24,7 +24,8 @@ module Rusby
|
|
24
24
|
|
25
25
|
boost = m1 > m2 ? m1 / m2 : - m2 / m1
|
26
26
|
|
27
|
-
printf "\r=> got #{'%.2fx boost'.colorize(boost > 0 ? :green : :red)}
|
27
|
+
printf "\r=> got #{'%.2fx boost'.colorize(boost > 0 ? :green : :red)}" \
|
28
|
+
" (%.2fs original vs %.2fs rust) %s\n\n", boost, m1, m2, ' ' * 80
|
28
29
|
|
29
30
|
boost
|
30
31
|
end
|
data/lib/rusby/rust.rb
CHANGED
@@ -60,7 +60,8 @@ module Rusby
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def method_missing(method_name, *args)
|
63
|
-
puts "No method for '#{method_name.to_s.sub('generate_', '')}'
|
63
|
+
puts "No method for '#{method_name.to_s.sub('generate_', '')}'" \
|
64
|
+
' AST node.'.colorize(:red)
|
64
65
|
puts "Please implement #{method_name} in Rusby::Rust.".colorize(:yellow)
|
65
66
|
puts "Arguments: #{args.inspect}".colorize(:yellow)
|
66
67
|
raise RuntimeError
|
data/lib/rusby/version.rb
CHANGED
data/rusby.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# coding: utf-8
|
2
2
|
lib = File.expand_path('../lib', __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'rusby'
|
4
|
+
require 'rusby/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "rusby"
|
@@ -16,17 +16,18 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
17
|
spec.bindir = "exe"
|
18
18
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
19
|
-
spec.require_paths = ["lib"]
|
20
19
|
|
21
20
|
spec.add_development_dependency "bundler", "~> 1.12"
|
22
21
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
22
|
spec.add_development_dependency "rspec", "~> 3.0"
|
24
|
-
spec.add_development_dependency "byebug"
|
25
23
|
|
26
24
|
spec.add_runtime_dependency 'method_source'
|
27
25
|
spec.add_runtime_dependency 'ffi'
|
28
26
|
spec.add_runtime_dependency 'hashie'
|
29
27
|
spec.add_runtime_dependency 'colorize'
|
30
28
|
spec.add_runtime_dependency 'parser'
|
31
|
-
|
29
|
+
|
30
|
+
spec.require_paths = [
|
31
|
+
"lib"
|
32
|
+
]
|
32
33
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rusby
|
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
|
- Alexander Krasnoschekov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-08-
|
11
|
+
date: 2016-08-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,20 +52,6 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3.0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: byebug
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: method_source
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,20 +122,6 @@ dependencies:
|
|
136
122
|
- - ">="
|
137
123
|
- !ruby/object:Gem::Version
|
138
124
|
version: '0'
|
139
|
-
- !ruby/object:Gem::Dependency
|
140
|
-
name: ruby-prof
|
141
|
-
requirement: !ruby/object:Gem::Requirement
|
142
|
-
requirements:
|
143
|
-
- - ">="
|
144
|
-
- !ruby/object:Gem::Version
|
145
|
-
version: '0'
|
146
|
-
type: :runtime
|
147
|
-
prerelease: false
|
148
|
-
version_requirements: !ruby/object:Gem::Requirement
|
149
|
-
requirements:
|
150
|
-
- - ">="
|
151
|
-
- !ruby/object:Gem::Version
|
152
|
-
version: '0'
|
153
125
|
description:
|
154
126
|
email:
|
155
127
|
- akrasnoschekov@gmail.com
|
@@ -161,7 +133,6 @@ files:
|
|
161
133
|
- ".travis.yml"
|
162
134
|
- CODE_OF_CONDUCT.md
|
163
135
|
- Gemfile
|
164
|
-
- Gemfile.lock
|
165
136
|
- LICENSE.txt
|
166
137
|
- README.md
|
167
138
|
- Rakefile
|
@@ -170,7 +141,6 @@ files:
|
|
170
141
|
- doc/img1.png
|
171
142
|
- doc/slides.key
|
172
143
|
- examples/Gemfile
|
173
|
-
- examples/Gemfile.lock
|
174
144
|
- examples/fanatic_greeter.rb
|
175
145
|
- examples/fanatic_pluser.rb
|
176
146
|
- examples/levenshtein_distance.rb
|
@@ -216,7 +186,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
216
186
|
version: '0'
|
217
187
|
requirements: []
|
218
188
|
rubyforge_project:
|
219
|
-
rubygems_version: 2.
|
189
|
+
rubygems_version: 2.5.1
|
220
190
|
signing_key:
|
221
191
|
specification_version: 4
|
222
192
|
summary: Ruby to Rust transpiler for simple performance-oriented methods.
|
data/Gemfile.lock
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: .
|
3
|
-
specs:
|
4
|
-
rusby (0.1.0)
|
5
|
-
colorize
|
6
|
-
ffi
|
7
|
-
hashie
|
8
|
-
method_source
|
9
|
-
parser
|
10
|
-
ruby-prof
|
11
|
-
|
12
|
-
GEM
|
13
|
-
remote: https://rubygems.org/
|
14
|
-
specs:
|
15
|
-
ast (2.2.0)
|
16
|
-
byebug (9.0.5)
|
17
|
-
colorize (0.7.7)
|
18
|
-
diff-lcs (1.2.5)
|
19
|
-
ffi (1.9.10)
|
20
|
-
hashie (3.4.4)
|
21
|
-
method_source (0.8.2)
|
22
|
-
parser (2.3.1.0)
|
23
|
-
ast (~> 2.2)
|
24
|
-
rake (10.5.0)
|
25
|
-
rspec (3.4.0)
|
26
|
-
rspec-core (~> 3.4.0)
|
27
|
-
rspec-expectations (~> 3.4.0)
|
28
|
-
rspec-mocks (~> 3.4.0)
|
29
|
-
rspec-core (3.4.4)
|
30
|
-
rspec-support (~> 3.4.0)
|
31
|
-
rspec-expectations (3.4.0)
|
32
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
33
|
-
rspec-support (~> 3.4.0)
|
34
|
-
rspec-mocks (3.4.1)
|
35
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
36
|
-
rspec-support (~> 3.4.0)
|
37
|
-
rspec-support (3.4.1)
|
38
|
-
ruby-prof (0.15.9)
|
39
|
-
|
40
|
-
PLATFORMS
|
41
|
-
ruby
|
42
|
-
|
43
|
-
DEPENDENCIES
|
44
|
-
bundler (~> 1.12)
|
45
|
-
byebug
|
46
|
-
rake (~> 10.0)
|
47
|
-
rspec (~> 3.0)
|
48
|
-
rusby!
|
49
|
-
|
50
|
-
BUNDLED WITH
|
51
|
-
1.12.4
|
data/examples/Gemfile.lock
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: ..
|
3
|
-
specs:
|
4
|
-
rusby (0.1.0)
|
5
|
-
colorize
|
6
|
-
ffi
|
7
|
-
hashie
|
8
|
-
method_source
|
9
|
-
parser
|
10
|
-
ruby-prof
|
11
|
-
|
12
|
-
GEM
|
13
|
-
remote: https://rubygems.org/
|
14
|
-
specs:
|
15
|
-
ast (2.2.0)
|
16
|
-
colorize (0.7.7)
|
17
|
-
ffi (1.9.10)
|
18
|
-
hashie (3.4.4)
|
19
|
-
method_source (0.8.2)
|
20
|
-
parser (2.3.1.0)
|
21
|
-
ast (~> 2.2)
|
22
|
-
ruby-prof (0.15.9)
|
23
|
-
|
24
|
-
PLATFORMS
|
25
|
-
ruby
|
26
|
-
|
27
|
-
DEPENDENCIES
|
28
|
-
rusby!
|
29
|
-
|
30
|
-
BUNDLED WITH
|
31
|
-
1.12.4
|