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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 220468d5f249c9e28f702ff82cc05857fec824a3
4
- data.tar.gz: ac156b073759a711c1889f0d4cdb39fedc823ff7
3
+ metadata.gz: c3194c9f2b246c00288fbe537b79ebf90484ace2
4
+ data.tar.gz: 7725bf97b5b7612fab8bce40108dbf415ca85054
5
5
  SHA512:
6
- metadata.gz: addbb61765e9957e47af6b79f28cbc17597144997e667728f71628d93a80c231e8e3ba0efc1b7806f851c194ab5560540c8de0dba746ad17ae8e4d1ee38e2ae2
7
- data.tar.gz: 80795fd42665c369763f4d72ecba264a977ecd3c5cc808e08dc6aef13886770e597f93cbfebc1aaa6fee55a47ee359c7da59c5e7e166d7b412044867923b000e
6
+ metadata.gz: 5b89750908323e010f5cabd541cc45390de0ed67ec6f5ca2d18d9f65928b713305bb2055242133384b280a7abc96fed352701814893e0597e8e7ba4696f6c6a5
7
+ data.tar.gz: bb5dd9f51c4578aa8a7ad22b64368ce3fdf9d01a7ed1b966f495f335bbd3da6384b0d7b06612352bc5f595141094c4116826fd365ba73a962bd801a7028425fa
data/.travis.yml CHANGED
@@ -1,5 +1,7 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
+ - 1.9.3
4
5
  - 2.2.2
5
- before_install: gem install bundler -v 1.12.4
6
+ before_install:
7
+ - gem install bundler -v 1.12.4
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
- brew install rust # or similar
47
- cd examples
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
- ## Tests
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/[USERNAME]/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.
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 "rusby/version"
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.exists?('./tmp')
13
- Dir.mkdir(path) unless Dir.exists?(path)
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}(#{signature.first.join(', ')})".colorize(:yellow)
52
- puts `rustc -A unused_imports --crate-type=dylib -O -o #{lib_path}/#{method_name}.dylib #{lib_path}/#{method_name}.rs`
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 ffi_#{method_name}(#{args.join(', ')}) -> #{rust.rust_to_ffi_types[return_type] || rust.rust_types[return_type]} {"
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
- next unless rust.ffi_to_rust[arg_types[i]] # for simple args we don't need any convertion
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
- result << "let result = #{method_name}(#{arg_names.join(', ')});" # calls the real method with ffi args folded
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::Ruby22.parse(source)
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 = exposed ? ffi_wrapper(method_name, arg_names, arg_types, return_type) : []
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 { |arg_name, i| "#{arg_name}: #{rust.rust_types[arg_types[i]]}" }
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_'}#{method_name}(#{args.join(', ')}) -> #{rust.rust_types[return_type]} {"
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 { |arg| rusby_type(arg) }
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 rust return back the original method
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 'Benchmarking native and rust methods (intertwined pattern)'.colorize(:yellow)
67
- boost = Profiler.benchit(object, method_reference, wrapped_rust_method, args)
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
@@ -33,7 +33,8 @@ module Rusby
33
33
  end
34
34
 
35
35
  def generate_op_asgn(ast)
36
- "#{generate(ast.children[0])} #{ast.children[1]}= #{generate(ast.children[2])}"
36
+ "#{generate(ast.children[0])} #{ast.children[1]}=" \
37
+ " #{generate(ast.children[2])}"
37
38
  end
38
39
  end
39
40
  end
@@ -2,21 +2,22 @@ module Rusby
2
2
  module Generators
3
3
  module Base
4
4
  def generate(ast)
5
- unless ast.respond_to?(:type)
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
- return case ast
9
- when :<< || :>>
10
- ast
11
- when :length
12
- '.len()'
13
- when :min
14
- '.iter().min()'
15
- else
16
- ast.to_s
17
- end
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])});io::stdout().flush().unwrap();\n"
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
- result = 'internal_method_' + result unless known_method?(ast.children[1])
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
- result = if ast.children[1]
6
- generate_regular_if(ast)
7
- else
8
- generate_unless(ast)
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
- result = <<-EOF
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
- range_end = "(#{range.children[1].children[0]} + 1)" # rust range is inclusive
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} {\n#{statements.join("\n")}\n}"
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])} {\n#{generate(ast.children[1])}\n}"
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#{generate(ast.children[0])}\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'} as #{@return_type};"
17
+ "return #{statements.any? ? statements.join(',') : '&-ptr'}" \
18
+ " as #{@return_type};"
18
19
  end
19
20
 
20
21
  def generate_kwbegin(ast)
@@ -3,7 +3,9 @@ module Rusby
3
3
  module Strings
4
4
  # string interpolation
5
5
  def generate_dstr(ast)
6
- ast.children.map { |node| "(#{generate(node)}).to_string()" }.join(' + &')
6
+ ast.children.map do |node|
7
+ "(#{generate(node)}).to_string()"
8
+ end.join(' + &')
7
9
  end
8
10
  end
9
11
  end
@@ -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
- if el == 'String'
9
- code.gsub!(/#{meta[:names][idx]}\[(.+?)\]/, "#{meta[:names][idx]}.chars().nth(\\1)")
10
- code.gsub!(/;+/, ';')
11
- end
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);')
@@ -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)} (%.2fs original vs %.2fs rust) %s\n\n", boost, m1, m2, ' ' * 80
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_', '')}' AST node.".colorize(:red)
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
@@ -1,3 +1,3 @@
1
1
  module Rusby
2
- VERSION = "0.1.0"
2
+ VERSION = '0.1.1'.freeze
3
3
  end
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
- spec.add_runtime_dependency 'ruby-prof'
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.0
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-04 00:00:00.000000000 Z
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.4.5
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
@@ -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