readapt 1.0.0 → 1.1.0
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/.gitignore +16 -15
- data/.rspec +2 -2
- data/.travis.yml +18 -18
- data/CHANGELOG.md +72 -69
- data/Gemfile +4 -4
- data/LICENSE.txt +21 -21
- data/README.md +37 -29
- data/Rakefile +14 -14
- data/bin/console +14 -14
- data/bin/setup +8 -8
- data/exe/readapt +5 -5
- data/ext/readapt/breakpoints.c +83 -83
- data/ext/readapt/breakpoints.h +11 -11
- data/ext/readapt/extconf.rb +0 -0
- data/ext/readapt/frame.c +137 -137
- data/ext/readapt/frame.h +17 -17
- data/ext/readapt/hash_table.c +211 -211
- data/ext/readapt/hash_table.h +30 -30
- data/ext/readapt/inspector.c +51 -51
- data/ext/readapt/inspector.h +8 -8
- data/ext/readapt/monitor.c +1 -1
- data/ext/readapt/monitor.h +0 -0
- data/ext/readapt/normalize.c +59 -59
- data/ext/readapt/normalize.h +7 -7
- data/ext/readapt/readapt.c +18 -18
- data/ext/readapt/stack.c +86 -86
- data/ext/readapt/stack.h +20 -20
- data/ext/readapt/threads.c +15 -11
- data/ext/readapt/threads.h +1 -1
- data/lib/readapt.rb +21 -20
- data/lib/readapt/adapter.rb +98 -98
- data/lib/readapt/breakpoint.rb +20 -20
- data/lib/readapt/data_reader.rb +62 -62
- data/lib/readapt/debugger.rb +220 -220
- data/lib/readapt/error.rb +63 -63
- data/lib/readapt/finder.rb +20 -20
- data/lib/readapt/frame.rb +40 -40
- data/lib/readapt/input.rb +7 -7
- data/lib/readapt/message.rb +62 -62
- data/lib/readapt/message/attach.rb +11 -11
- data/lib/readapt/message/base.rb +32 -32
- data/lib/readapt/message/configuration_done.rb +11 -11
- data/lib/readapt/message/continue.rb +15 -15
- data/lib/readapt/message/disconnect.rb +13 -13
- data/lib/readapt/message/evaluate.rb +18 -18
- data/lib/readapt/message/initialize.rb +13 -13
- data/lib/readapt/message/launch.rb +11 -11
- data/lib/readapt/message/next.rb +12 -12
- data/lib/readapt/message/pause.rb +11 -11
- data/lib/readapt/message/scopes.rb +26 -26
- data/lib/readapt/message/set_breakpoints.rb +25 -25
- data/lib/readapt/message/set_exception_breakpoints.rb +8 -8
- data/lib/readapt/message/stack_trace.rb +38 -38
- data/lib/readapt/message/step_in.rb +11 -11
- data/lib/readapt/message/step_out.rb +11 -11
- data/lib/readapt/message/threads.rb +18 -18
- data/lib/readapt/message/variables.rb +61 -61
- data/lib/readapt/monitor.rb +0 -0
- data/lib/readapt/output.rb +25 -25
- data/lib/readapt/references.rb +27 -0
- data/lib/readapt/server.rb +22 -22
- data/lib/readapt/shell.rb +104 -104
- data/lib/readapt/snapshot.rb +0 -0
- data/lib/readapt/thread.rb +23 -23
- data/lib/readapt/variable.rb +1 -1
- data/lib/readapt/version.rb +3 -3
- data/readapt.gemspec +39 -39
- metadata +4 -3
data/lib/readapt/monitor.rb
CHANGED
File without changes
|
data/lib/readapt/output.rb
CHANGED
@@ -1,25 +1,25 @@
|
|
1
|
-
module Readapt
|
2
|
-
module Output
|
3
|
-
class << self
|
4
|
-
attr_accessor :adapter
|
5
|
-
end
|
6
|
-
|
7
|
-
def receiving data
|
8
|
-
send_event('output', {
|
9
|
-
output: data,
|
10
|
-
category: 'stdout'
|
11
|
-
})
|
12
|
-
end
|
13
|
-
|
14
|
-
def send_event event, data
|
15
|
-
obj = {
|
16
|
-
type: 'event',
|
17
|
-
event: event
|
18
|
-
}
|
19
|
-
obj[:body] = data unless data.nil?
|
20
|
-
json = obj.to_json
|
21
|
-
envelope = "Content-Length: #{json.bytesize}\r\n\r\n#{json}"
|
22
|
-
Output.adapter.write envelope
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
1
|
+
module Readapt
|
2
|
+
module Output
|
3
|
+
class << self
|
4
|
+
attr_accessor :adapter
|
5
|
+
end
|
6
|
+
|
7
|
+
def receiving data
|
8
|
+
send_event('output', {
|
9
|
+
output: data,
|
10
|
+
category: 'stdout'
|
11
|
+
})
|
12
|
+
end
|
13
|
+
|
14
|
+
def send_event event, data
|
15
|
+
obj = {
|
16
|
+
type: 'event',
|
17
|
+
event: event
|
18
|
+
}
|
19
|
+
obj[:body] = data unless data.nil?
|
20
|
+
json = obj.to_json
|
21
|
+
envelope = "Content-Length: #{json.bytesize}\r\n\r\n#{json}"
|
22
|
+
Output.adapter.write envelope
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Readapt
|
2
|
+
module References
|
3
|
+
module_function
|
4
|
+
|
5
|
+
@variable_reference_map = {}
|
6
|
+
@reference_variable_map = {}
|
7
|
+
@reference_id = 1000
|
8
|
+
|
9
|
+
def clear
|
10
|
+
@variable_reference_map.clear
|
11
|
+
@reference_variable_map.clear
|
12
|
+
@reference_id = 1000
|
13
|
+
end
|
14
|
+
|
15
|
+
def identify object
|
16
|
+
return @variable_reference_map[object] if @variable_reference_map.has_key?(object)
|
17
|
+
@reference_id += 1
|
18
|
+
@variable_reference_map[object] = @reference_id
|
19
|
+
@reference_variable_map[@reference_id] = object
|
20
|
+
@reference_id
|
21
|
+
end
|
22
|
+
|
23
|
+
def get id
|
24
|
+
@reference_variable_map[id]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/readapt/server.rb
CHANGED
@@ -1,22 +1,22 @@
|
|
1
|
-
require 'securerandom'
|
2
|
-
require 'stringio'
|
3
|
-
|
4
|
-
module Readapt
|
5
|
-
module Server
|
6
|
-
class << self
|
7
|
-
attr_accessor :target_in
|
8
|
-
attr_accessor :target_pid
|
9
|
-
end
|
10
|
-
|
11
|
-
def opening
|
12
|
-
Error.adapter = self
|
13
|
-
Output.adapter = self
|
14
|
-
end
|
15
|
-
|
16
|
-
def receiving data
|
17
|
-
Server.target_in.syswrite data
|
18
|
-
rescue Errno::EPIPE, IOError
|
19
|
-
close
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
1
|
+
require 'securerandom'
|
2
|
+
require 'stringio'
|
3
|
+
|
4
|
+
module Readapt
|
5
|
+
module Server
|
6
|
+
class << self
|
7
|
+
attr_accessor :target_in
|
8
|
+
attr_accessor :target_pid
|
9
|
+
end
|
10
|
+
|
11
|
+
def opening
|
12
|
+
Error.adapter = self
|
13
|
+
Output.adapter = self
|
14
|
+
end
|
15
|
+
|
16
|
+
def receiving data
|
17
|
+
Server.target_in.syswrite data
|
18
|
+
rescue Errno::EPIPE, IOError
|
19
|
+
close
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/readapt/shell.rb
CHANGED
@@ -1,104 +1,104 @@
|
|
1
|
-
require 'thor'
|
2
|
-
require 'backport'
|
3
|
-
require 'open3'
|
4
|
-
require 'securerandom'
|
5
|
-
require 'socket'
|
6
|
-
|
7
|
-
module Readapt
|
8
|
-
class Shell < Thor
|
9
|
-
map %w[--version -v] => :version
|
10
|
-
|
11
|
-
desc "--version, -v", "Print the version"
|
12
|
-
def version
|
13
|
-
puts Readapt::VERSION
|
14
|
-
end
|
15
|
-
|
16
|
-
desc 'socket', 'Run a DAP server over TCP'
|
17
|
-
option :host, type: :string, aliases: :h, description: 'The server host', default: '127.0.0.1'
|
18
|
-
option :port, type: :numeric, aliases: :p, description: 'The server port', default: 1234
|
19
|
-
def socket
|
20
|
-
machine = Backport::Machine.new
|
21
|
-
machine.run do
|
22
|
-
prepare_machine machine
|
23
|
-
server = Backport::Server::Tcpip.new(host: options[:host], port: options[:port], adapter: Readapt::Server)
|
24
|
-
machine.prepare server
|
25
|
-
STDERR.puts "Readapt Debugger #{Readapt::VERSION} is listening HOST=#{options[:host]} PORT=#{options[:port]} PID=#{Process.pid}"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
map serve: :socket
|
29
|
-
|
30
|
-
desc 'stdio', 'Run a DAP server over STDIO'
|
31
|
-
def stdio
|
32
|
-
machine = Backport::Machine.new
|
33
|
-
machine.run do
|
34
|
-
prepare_machine machine
|
35
|
-
server = Backport::Server::Stdio.new(adapter: Readapt::Server)
|
36
|
-
machine.prepare server
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
desc 'target [PROCID]', 'Run a target process'
|
41
|
-
def target procid = nil
|
42
|
-
STDIN.binmode
|
43
|
-
STDOUT.binmode
|
44
|
-
STDERR.binmode
|
45
|
-
STDOUT.sync = true
|
46
|
-
STDERR.sync = true
|
47
|
-
Readapt::Adapter.procid = procid
|
48
|
-
machine = Backport::Machine.new
|
49
|
-
Signal.trap("INT") do
|
50
|
-
graceful_shutdown machine
|
51
|
-
end
|
52
|
-
Signal.trap("TERM") do
|
53
|
-
graceful_shutdown machine
|
54
|
-
end
|
55
|
-
machine.run do
|
56
|
-
debugger = Readapt::Debugger.new
|
57
|
-
Readapt::Adapter.host debugger
|
58
|
-
machine.prepare Backport::Server::Stdio.new(input: STDIN, output: STDERR, adapter: Readapt::Adapter)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
private
|
63
|
-
|
64
|
-
# @param machine [Backport::Machine]
|
65
|
-
# @return [void]
|
66
|
-
def prepare_machine machine
|
67
|
-
STDOUT.sync = true
|
68
|
-
STDERR.sync = true
|
69
|
-
Signal.trap("INT") do
|
70
|
-
graceful_shutdown machine
|
71
|
-
end
|
72
|
-
Signal.trap("TERM") do
|
73
|
-
graceful_shutdown machine
|
74
|
-
end
|
75
|
-
procid = SecureRandom.hex(8)
|
76
|
-
Readapt::Error.procid = procid
|
77
|
-
stdin, stdout, stderr, thr = Open3.popen3('ruby', $0, 'target', procid)
|
78
|
-
stdin.sync = true
|
79
|
-
stdout.sync = true
|
80
|
-
stderr.sync = true
|
81
|
-
stdin.binmode
|
82
|
-
Readapt::Server.target_in = stdin
|
83
|
-
Readapt::Server.target_pid = thr[:pid]
|
84
|
-
output = Backport::Server::Stdio.new(input: stdout, output: stdin, adapter: Readapt::Output)
|
85
|
-
error = Backport::Server::Stdio.new(input: stderr, output: stdin, adapter: Readapt::Error)
|
86
|
-
machine.prepare output
|
87
|
-
machine.prepare error
|
88
|
-
at_exit do
|
89
|
-
begin
|
90
|
-
Process.kill 'KILL', thr[:pid]
|
91
|
-
rescue Errno::ESRCH
|
92
|
-
# Ignore
|
93
|
-
end
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
# @param machine [Backport::Machine]
|
98
|
-
# @return [void]
|
99
|
-
def graceful_shutdown machine
|
100
|
-
machine.stop
|
101
|
-
exit
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
1
|
+
require 'thor'
|
2
|
+
require 'backport'
|
3
|
+
require 'open3'
|
4
|
+
require 'securerandom'
|
5
|
+
require 'socket'
|
6
|
+
|
7
|
+
module Readapt
|
8
|
+
class Shell < Thor
|
9
|
+
map %w[--version -v] => :version
|
10
|
+
|
11
|
+
desc "--version, -v", "Print the version"
|
12
|
+
def version
|
13
|
+
puts Readapt::VERSION
|
14
|
+
end
|
15
|
+
|
16
|
+
desc 'socket', 'Run a DAP server over TCP'
|
17
|
+
option :host, type: :string, aliases: :h, description: 'The server host', default: '127.0.0.1'
|
18
|
+
option :port, type: :numeric, aliases: :p, description: 'The server port', default: 1234
|
19
|
+
def socket
|
20
|
+
machine = Backport::Machine.new
|
21
|
+
machine.run do
|
22
|
+
prepare_machine machine
|
23
|
+
server = Backport::Server::Tcpip.new(host: options[:host], port: options[:port], adapter: Readapt::Server)
|
24
|
+
machine.prepare server
|
25
|
+
STDERR.puts "Readapt Debugger #{Readapt::VERSION} is listening HOST=#{options[:host]} PORT=#{options[:port]} PID=#{Process.pid}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
map serve: :socket
|
29
|
+
|
30
|
+
desc 'stdio', 'Run a DAP server over STDIO'
|
31
|
+
def stdio
|
32
|
+
machine = Backport::Machine.new
|
33
|
+
machine.run do
|
34
|
+
prepare_machine machine
|
35
|
+
server = Backport::Server::Stdio.new(adapter: Readapt::Server)
|
36
|
+
machine.prepare server
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
desc 'target [PROCID]', 'Run a target process'
|
41
|
+
def target procid = nil
|
42
|
+
STDIN.binmode
|
43
|
+
STDOUT.binmode
|
44
|
+
STDERR.binmode
|
45
|
+
STDOUT.sync = true
|
46
|
+
STDERR.sync = true
|
47
|
+
Readapt::Adapter.procid = procid
|
48
|
+
machine = Backport::Machine.new
|
49
|
+
Signal.trap("INT") do
|
50
|
+
graceful_shutdown machine
|
51
|
+
end
|
52
|
+
Signal.trap("TERM") do
|
53
|
+
graceful_shutdown machine
|
54
|
+
end
|
55
|
+
machine.run do
|
56
|
+
debugger = Readapt::Debugger.new
|
57
|
+
Readapt::Adapter.host debugger
|
58
|
+
machine.prepare Backport::Server::Stdio.new(input: STDIN, output: STDERR, adapter: Readapt::Adapter)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
# @param machine [Backport::Machine]
|
65
|
+
# @return [void]
|
66
|
+
def prepare_machine machine
|
67
|
+
STDOUT.sync = true
|
68
|
+
STDERR.sync = true
|
69
|
+
Signal.trap("INT") do
|
70
|
+
graceful_shutdown machine
|
71
|
+
end
|
72
|
+
Signal.trap("TERM") do
|
73
|
+
graceful_shutdown machine
|
74
|
+
end
|
75
|
+
procid = SecureRandom.hex(8)
|
76
|
+
Readapt::Error.procid = procid
|
77
|
+
stdin, stdout, stderr, thr = Open3.popen3('ruby', $0, 'target', procid)
|
78
|
+
stdin.sync = true
|
79
|
+
stdout.sync = true
|
80
|
+
stderr.sync = true
|
81
|
+
stdin.binmode
|
82
|
+
Readapt::Server.target_in = stdin
|
83
|
+
Readapt::Server.target_pid = thr[:pid]
|
84
|
+
output = Backport::Server::Stdio.new(input: stdout, output: stdin, adapter: Readapt::Output)
|
85
|
+
error = Backport::Server::Stdio.new(input: stderr, output: stdin, adapter: Readapt::Error)
|
86
|
+
machine.prepare output
|
87
|
+
machine.prepare error
|
88
|
+
at_exit do
|
89
|
+
begin
|
90
|
+
Process.kill 'KILL', thr[:pid]
|
91
|
+
rescue Errno::ESRCH
|
92
|
+
# Ignore
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# @param machine [Backport::Machine]
|
98
|
+
# @return [void]
|
99
|
+
def graceful_shutdown machine
|
100
|
+
machine.stop
|
101
|
+
exit
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
data/lib/readapt/snapshot.rb
CHANGED
File without changes
|
data/lib/readapt/thread.rb
CHANGED
@@ -1,23 +1,23 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'ostruct'
|
4
|
-
|
5
|
-
module Readapt
|
6
|
-
class Thread
|
7
|
-
@@next_id = 0
|
8
|
-
|
9
|
-
# @return [Symbol]
|
10
|
-
attr_accessor :control
|
11
|
-
|
12
|
-
def name
|
13
|
-
@name ||= begin
|
14
|
-
@@next_id += 1
|
15
|
-
"Thread #{@@next_id}"
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def object
|
20
|
-
ObjectSpace._id2ref(id)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ostruct'
|
4
|
+
|
5
|
+
module Readapt
|
6
|
+
class Thread
|
7
|
+
@@next_id = 0
|
8
|
+
|
9
|
+
# @return [Symbol]
|
10
|
+
attr_accessor :control
|
11
|
+
|
12
|
+
def name
|
13
|
+
@name ||= begin
|
14
|
+
@@next_id += 1
|
15
|
+
"Thread #{@@next_id}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def object
|
20
|
+
ObjectSpace._id2ref(id)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/readapt/variable.rb
CHANGED
data/lib/readapt/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
module Readapt
|
2
|
-
VERSION = "1.
|
3
|
-
end
|
1
|
+
module Readapt
|
2
|
+
VERSION = "1.1.0"
|
3
|
+
end
|
data/readapt.gemspec
CHANGED
@@ -1,39 +1,39 @@
|
|
1
|
-
lib = File.expand_path("lib", __dir__)
|
2
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
-
require "readapt/version"
|
4
|
-
|
5
|
-
Gem::Specification.new do |spec|
|
6
|
-
spec.name = "readapt"
|
7
|
-
spec.version = Readapt::VERSION
|
8
|
-
spec.authors = ["Fred Snyder"]
|
9
|
-
spec.email = ["fsnyder@castwide.com"]
|
10
|
-
|
11
|
-
spec.summary = 'A Ruby debugger for the Debug Adapter Protocol'
|
12
|
-
spec.description = 'Readapt is a Ruby debugger that natively supports the Debug Adapter Protocol. Features include next/step in/step out, local and global variable data, and individual thread control.'
|
13
|
-
spec.homepage = "https://castwide.com"
|
14
|
-
spec.license = "MIT"
|
15
|
-
|
16
|
-
spec.metadata["homepage_uri"] = spec.homepage
|
17
|
-
spec.metadata["source_code_uri"] = "https://github.com/castwide/readapt"
|
18
|
-
spec.metadata["changelog_uri"] = "https://github.com/castwide/readapt/blob/master/CHANGELOG.md"
|
19
|
-
|
20
|
-
# Specify which files should be added to the gem when it is released.
|
21
|
-
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
22
|
-
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
23
|
-
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
24
|
-
end
|
25
|
-
spec.bindir = "exe"
|
26
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
27
|
-
spec.require_paths = ["lib"]
|
28
|
-
spec.extensions = ['ext/readapt/extconf.rb']
|
29
|
-
|
30
|
-
spec.required_ruby_version = '>= 2.2'
|
31
|
-
|
32
|
-
spec.add_dependency 'backport', '~> 1.1'
|
33
|
-
spec.add_dependency 'thor', '~> 1.0'
|
34
|
-
|
35
|
-
spec.add_development_dependency "rake", "~> 10.0"
|
36
|
-
spec.add_development_dependency "rake-compiler", "~> 1.0"
|
37
|
-
spec.add_development_dependency "rspec", "~> 3.0"
|
38
|
-
spec.add_development_dependency 'simplecov', '~> 0.14'
|
39
|
-
end
|
1
|
+
lib = File.expand_path("lib", __dir__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require "readapt/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "readapt"
|
7
|
+
spec.version = Readapt::VERSION
|
8
|
+
spec.authors = ["Fred Snyder"]
|
9
|
+
spec.email = ["fsnyder@castwide.com"]
|
10
|
+
|
11
|
+
spec.summary = 'A Ruby debugger for the Debug Adapter Protocol'
|
12
|
+
spec.description = 'Readapt is a Ruby debugger that natively supports the Debug Adapter Protocol. Features include next/step in/step out, local and global variable data, and individual thread control.'
|
13
|
+
spec.homepage = "https://castwide.com"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
17
|
+
spec.metadata["source_code_uri"] = "https://github.com/castwide/readapt"
|
18
|
+
spec.metadata["changelog_uri"] = "https://github.com/castwide/readapt/blob/master/CHANGELOG.md"
|
19
|
+
|
20
|
+
# Specify which files should be added to the gem when it is released.
|
21
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
22
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
23
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
24
|
+
end
|
25
|
+
spec.bindir = "exe"
|
26
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
27
|
+
spec.require_paths = ["lib"]
|
28
|
+
spec.extensions = ['ext/readapt/extconf.rb']
|
29
|
+
|
30
|
+
spec.required_ruby_version = '>= 2.2'
|
31
|
+
|
32
|
+
spec.add_dependency 'backport', '~> 1.1'
|
33
|
+
spec.add_dependency 'thor', '~> 1.0'
|
34
|
+
|
35
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
36
|
+
spec.add_development_dependency "rake-compiler", "~> 1.0"
|
37
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
38
|
+
spec.add_development_dependency 'simplecov', '~> 0.14'
|
39
|
+
end
|