rusby 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/.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
|
+
[![Build Status](https://travis-ci.org/rambler-digital-solutions/rusby.svg?branch=master)](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
|