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 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