rookout 0.1.52 → 0.1.54
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/lib/rookout/augs/aug.rb +5 -5
- data/lib/rookout/augs/locations/location.rb +2 -2
- data/lib/rookout/com_ws/agent_com_ws.rb +5 -0
- data/lib/rookout/com_ws/information.rb +31 -1
- data/lib/rookout/commit.rb +1 -1
- data/lib/rookout/config.rb +2 -0
- data/lib/rookout/exceptions.rb +13 -0
- data/lib/rookout/interface.rb +9 -3
- data/lib/rookout/processor/namespace_serializer2.rb +5 -5
- data/lib/rookout/processor/namespaces/frame_namespace.rb +18 -15
- data/lib/rookout/processor/namespaces/stack_namespace.rb +5 -4
- data/lib/rookout/processor/namespaces/traceback_namespace.rb +9 -10
- data/lib/rookout/sanitizer.rb +1 -1
- data/lib/rookout/services/tracer.rb +22 -14
- data/lib/rookout/version.rb +1 -1
- metadata +2 -16
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e96a2d7b2fdc74a8731a9c547940f6c03a1bf2ee103ed433a65fdac6bff90e40
|
|
4
|
+
data.tar.gz: 21bdac9616f7b5f7bcbcf781fdb2df81ff8ad7bfb0413ed96dea91565df61652
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9886ef4e56f478fa227a5a50281179df07b2dc3aa28573d815969b2a57e0935b8b783ebe2738dee480de5eb559b28f5ab8f51357af3d21a50b3e3a2a95fcb7f6
|
|
7
|
+
data.tar.gz: 65e7aa8a863b61994278f58540b95c27166543141145545f463cf2f0bd9a2cc989de3cdd6449353110659cca7558dd892214901008f862fcf3716d2da1c0af3f
|
data/lib/rookout/augs/aug.rb
CHANGED
|
@@ -24,7 +24,7 @@ module Rookout
|
|
|
24
24
|
|
|
25
25
|
attr_reader :id
|
|
26
26
|
|
|
27
|
-
def execute
|
|
27
|
+
def execute frame_binding, stack_trace, extracted, output
|
|
28
28
|
return unless @enabled
|
|
29
29
|
|
|
30
30
|
if output.user_messages_queue_full?
|
|
@@ -32,7 +32,7 @@ module Rookout
|
|
|
32
32
|
return
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
namespace = create_namespaces
|
|
35
|
+
namespace = create_namespaces frame_binding, stack_trace, extracted
|
|
36
36
|
return if @condition && !@condition.evaluate(namespace)
|
|
37
37
|
|
|
38
38
|
should_skip_limiters = @condition.nil? && !@executed
|
|
@@ -46,10 +46,10 @@ module Rookout
|
|
|
46
46
|
|
|
47
47
|
private
|
|
48
48
|
|
|
49
|
-
def create_namespaces
|
|
49
|
+
def create_namespaces frame_binding, stack_trace, extracted
|
|
50
50
|
Processor::Namespaces::ContainerNamespace.new(
|
|
51
|
-
"frame" => Processor::Namespaces::FrameNamespace.new(
|
|
52
|
-
"stack" => Processor::Namespaces::StackNamespace.new(
|
|
51
|
+
"frame" => Processor::Namespaces::FrameNamespace.new(frame_binding, stack_trace[0]),
|
|
52
|
+
"stack" => Processor::Namespaces::StackNamespace.new(stack_trace),
|
|
53
53
|
"extracted" => Processor::Namespaces::ContainerNamespace.new(extracted),
|
|
54
54
|
"store" => Processor::Namespaces::ContainerNamespace.new,
|
|
55
55
|
"temp" => Processor::Namespaces::ContainerNamespace.new,
|
|
@@ -20,10 +20,10 @@ module Rookout
|
|
|
20
20
|
@aug.id
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
def execute
|
|
23
|
+
def execute frame_binding, stack_trace, extracted
|
|
24
24
|
UserWarnings.with self do
|
|
25
25
|
begin
|
|
26
|
-
@aug.execute
|
|
26
|
+
@aug.execute frame_binding, stack_trace, extracted, @output
|
|
27
27
|
rescue SystemExit
|
|
28
28
|
raise
|
|
29
29
|
rescue Exception => e
|
|
@@ -130,6 +130,11 @@ module Rookout
|
|
|
130
130
|
@ready_event.set
|
|
131
131
|
end
|
|
132
132
|
|
|
133
|
+
if e.message.include? "400"
|
|
134
|
+
@connection_error = Exceptions::RookWebSocketError.new 400
|
|
135
|
+
@ready_event.set
|
|
136
|
+
end
|
|
137
|
+
|
|
133
138
|
Logger.instance.warning "Connection failed; reason = #{e.message}"
|
|
134
139
|
end
|
|
135
140
|
|
|
@@ -85,10 +85,40 @@ module Rookout
|
|
|
85
85
|
return_value
|
|
86
86
|
end
|
|
87
87
|
|
|
88
|
+
def parse_raw_git_sources
|
|
89
|
+
git_sources_raw = ENV["ROOKOUT_SOURCES"]
|
|
90
|
+
if git_sources_raw.nil?
|
|
91
|
+
return nil
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
git_sources = git_sources_raw.split ";"
|
|
95
|
+
user_git_sources = {}
|
|
96
|
+
git_sources.each do |url|
|
|
97
|
+
url_parts = url.split "#"
|
|
98
|
+
if url_parts.length != 2
|
|
99
|
+
next
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
remote_url = url_parts[0]
|
|
103
|
+
commit = url_parts[1]
|
|
104
|
+
user_git_sources[remote_url] = commit
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
user_git_sources
|
|
108
|
+
end
|
|
109
|
+
|
|
88
110
|
def create_scm_information
|
|
89
111
|
user_git_origin = Config.user_git_origin || ENV["ROOKOUT_REMOTE_ORIGIN"]
|
|
90
112
|
user_git_commit = Config.user_git_commit || ENV["ROOKOUT_COMMIT"]
|
|
91
113
|
|
|
114
|
+
user_git_sources = Config.user_git_sources || parse_raw_git_sources
|
|
115
|
+
|
|
116
|
+
if !user_git_sources.nil? && !user_git_sources.empty?
|
|
117
|
+
user_git_sources = user_git_sources.map do |remote_url, commit|
|
|
118
|
+
Com::Rookout::SCMInformation::SourceInfo.new remoteOriginUrl: remote_url, commit: commit
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
92
122
|
if user_git_origin.nil? && user_git_commit.nil?
|
|
93
123
|
search_path = File.dirname File.absolute_path($PROGRAM_NAME)
|
|
94
124
|
git_root = find_root search_path
|
|
@@ -98,7 +128,7 @@ module Rookout
|
|
|
98
128
|
end
|
|
99
129
|
end
|
|
100
130
|
|
|
101
|
-
Com::Rookout::SCMInformation.new origin: user_git_origin, commit: user_git_commit
|
|
131
|
+
Com::Rookout::SCMInformation.new origin: user_git_origin, commit: user_git_commit, sources: user_git_sources
|
|
102
132
|
end
|
|
103
133
|
|
|
104
134
|
def aws_lambda?
|
data/lib/rookout/commit.rb
CHANGED
data/lib/rookout/config.rb
CHANGED
|
@@ -60,9 +60,11 @@ module Rookout
|
|
|
60
60
|
|
|
61
61
|
attr_accessor :user_git_commit
|
|
62
62
|
attr_accessor :user_git_origin
|
|
63
|
+
attr_accessor :user_git_sources
|
|
63
64
|
|
|
64
65
|
Rookout::Config.user_git_commit = nil
|
|
65
66
|
Rookout::Config.user_git_origin = nil
|
|
67
|
+
Rookout::Config.user_git_sources = nil
|
|
66
68
|
|
|
67
69
|
attr_accessor :rookout_version
|
|
68
70
|
attr_accessor :rookout_commit
|
data/lib/rookout/exceptions.rb
CHANGED
|
@@ -132,6 +132,13 @@ module Rookout
|
|
|
132
132
|
end
|
|
133
133
|
end
|
|
134
134
|
|
|
135
|
+
class RookWebSocketError < ToolException
|
|
136
|
+
def initialize http_status
|
|
137
|
+
super "Received HTTP status #{http_status} from the controller," \
|
|
138
|
+
"Please make sure WebSocket is enabled on the load balancer."
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
135
142
|
class RookSourceFilePathSuggestion < ToolException
|
|
136
143
|
def initialize wanted_path, matching_path
|
|
137
144
|
super "Rookout found alternative file path: #{matching_path}",
|
|
@@ -258,5 +265,11 @@ module Rookout
|
|
|
258
265
|
super "Live Logger is not supported. Try using Rookout Live Debugger instead."
|
|
259
266
|
end
|
|
260
267
|
end
|
|
268
|
+
|
|
269
|
+
class RookLocalsUnavailable < ToolException
|
|
270
|
+
def initialize
|
|
271
|
+
super "Can't collect local variables up the stack"
|
|
272
|
+
end
|
|
273
|
+
end
|
|
261
274
|
end
|
|
262
275
|
end
|
data/lib/rookout/interface.rb
CHANGED
|
@@ -39,7 +39,8 @@ module Rookout
|
|
|
39
39
|
raise if throw_errors
|
|
40
40
|
$stderr.puts "[Rookout] Failed to load Rookout. Please make sure to force build native extensions by setting" \
|
|
41
41
|
"'bundle config force_ruby_platform true'"
|
|
42
|
-
rescue RookMissingToken, RookInvalidToken, RookInvalidOptions,
|
|
42
|
+
rescue RookMissingToken, RookInvalidToken, RookInvalidOptions,
|
|
43
|
+
RookVersionNotSupported, RookBadProtobuf, RookWebSocketError => e
|
|
43
44
|
raise if throw_errors
|
|
44
45
|
$stderr.puts "[Rookout] Failed to start Rookout: #{e.message}"
|
|
45
46
|
rescue RookCommunicationException => e
|
|
@@ -92,6 +93,12 @@ module Rookout
|
|
|
92
93
|
$stderr.puts error.message
|
|
93
94
|
end
|
|
94
95
|
|
|
96
|
+
def configure_scm options
|
|
97
|
+
Config.user_git_origin = options[:git_origin] if options[:git_origin]
|
|
98
|
+
Config.user_git_commit = options[:git_commit] if options[:git_commit]
|
|
99
|
+
Config.user_git_sources = options[:git_sources] if options[:git_sources] && options[:git_sources].is_a?(Hash)
|
|
100
|
+
end
|
|
101
|
+
|
|
95
102
|
def configure_globals options
|
|
96
103
|
if Config.debug
|
|
97
104
|
log_to_stderr = true
|
|
@@ -107,8 +114,7 @@ module Rookout
|
|
|
107
114
|
Config.logger_filename = log_file unless log_file.nil?
|
|
108
115
|
Config.logger_log_level = log_level unless log_level.nil?
|
|
109
116
|
|
|
110
|
-
|
|
111
|
-
Config.user_git_commit = options[:git_commit] if options[:git_commit]
|
|
117
|
+
configure_scm options
|
|
112
118
|
end
|
|
113
119
|
|
|
114
120
|
def configure_start_options options
|
|
@@ -314,12 +314,12 @@ module Rookout
|
|
|
314
314
|
|
|
315
315
|
namespace.depth.times do |i|
|
|
316
316
|
position = i + namespace.offset
|
|
317
|
-
break if position >= namespace.
|
|
318
|
-
|
|
317
|
+
break if position >= namespace.stack_trace.length
|
|
318
|
+
frame_info = namespace.stack_trace[position]
|
|
319
319
|
|
|
320
|
-
code_object = Com::Rookout::Variant::CodeObject.new filename:
|
|
321
|
-
lineno:
|
|
322
|
-
name:
|
|
320
|
+
code_object = Com::Rookout::Variant::CodeObject.new filename: frame_info.path,
|
|
321
|
+
lineno: frame_info.lineno,
|
|
322
|
+
name: frame_info.label
|
|
323
323
|
variant.code_values << code_object
|
|
324
324
|
# See dump_code_object
|
|
325
325
|
@estimated_pending_bytes += 14 # Header + size + (header + number) * 4
|
|
@@ -7,33 +7,35 @@ module Rookout
|
|
|
7
7
|
require_relative "../../exceptions"
|
|
8
8
|
|
|
9
9
|
class FrameNamespace < Namespace
|
|
10
|
-
def initialize
|
|
10
|
+
def initialize frame_binding, top_frame_info
|
|
11
11
|
super()
|
|
12
|
-
@
|
|
12
|
+
@frame_binding = frame_binding
|
|
13
|
+
@top_frame_info = top_frame_info
|
|
13
14
|
end
|
|
14
15
|
|
|
15
16
|
def read_attribute name
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
raise Exceptions::RookLocalsUnavailable if @frame_binding.nil?
|
|
18
|
+
return RubyObjectNamespace.new @frame_binding.receiver if name == "self"
|
|
19
|
+
raise Exceptions::RookAttributeNotFound, name unless @frame_binding.local_variable_defined? name
|
|
20
|
+
RubyObjectNamespace.new @frame_binding.local_variable_get name
|
|
19
21
|
end
|
|
20
22
|
|
|
21
23
|
def call_method name, args
|
|
22
24
|
case name
|
|
23
25
|
when "filename", "module"
|
|
24
|
-
RubyObjectNamespace.new @
|
|
26
|
+
RubyObjectNamespace.new @top_frame_info.path
|
|
25
27
|
when "line"
|
|
26
|
-
RubyObjectNamespace.new @
|
|
28
|
+
RubyObjectNamespace.new @top_frame_info.lineno
|
|
27
29
|
when "function"
|
|
28
|
-
RubyObjectNamespace.new @
|
|
30
|
+
RubyObjectNamespace.new @top_frame_info.label
|
|
29
31
|
when "locals"
|
|
30
32
|
locals args
|
|
31
33
|
when "dump"
|
|
32
34
|
result = {
|
|
33
|
-
"filename" => RubyObjectNamespace.new(@
|
|
34
|
-
"line" => RubyObjectNamespace.new(@
|
|
35
|
-
"function" => RubyObjectNamespace.new(@
|
|
36
|
-
"module" => RubyObjectNamespace.new(@
|
|
35
|
+
"filename" => RubyObjectNamespace.new(@top_frame_info.path),
|
|
36
|
+
"line" => RubyObjectNamespace.new(@top_frame_info.lineno),
|
|
37
|
+
"function" => RubyObjectNamespace.new(@top_frame_info.label),
|
|
38
|
+
"module" => RubyObjectNamespace.new(@top_frame_info.path),
|
|
37
39
|
"locals" => locals(args)
|
|
38
40
|
}
|
|
39
41
|
ContainerNamespace.new result
|
|
@@ -43,19 +45,20 @@ module Rookout
|
|
|
43
45
|
end
|
|
44
46
|
|
|
45
47
|
def locals args
|
|
48
|
+
raise Exceptions::RookLocalsUnavailable if @frame_binding.nil?
|
|
46
49
|
dump_config = nil
|
|
47
50
|
unless args.nil?
|
|
48
51
|
dump_config = OBJECT_DUMP_TABLE[args.downcase]
|
|
49
52
|
end
|
|
50
53
|
|
|
51
54
|
hash = {}
|
|
52
|
-
local_variables = @
|
|
55
|
+
local_variables = @frame_binding.local_variables
|
|
53
56
|
local_variables.each do |var|
|
|
54
|
-
value = @
|
|
57
|
+
value = @frame_binding.local_variable_get var
|
|
55
58
|
hash[var.to_s] = RubyObjectNamespace.new value, dump_config
|
|
56
59
|
end
|
|
57
60
|
|
|
58
|
-
hash["self"] = RubyObjectNamespace.new @
|
|
61
|
+
hash["self"] = RubyObjectNamespace.new @frame_binding.receiver, dump_config
|
|
59
62
|
|
|
60
63
|
ContainerNamespace.new hash
|
|
61
64
|
end
|
|
@@ -5,15 +5,16 @@ module Rookout
|
|
|
5
5
|
require_relative "frame_namespace"
|
|
6
6
|
require_relative "traceback_namespace"
|
|
7
7
|
|
|
8
|
+
|
|
8
9
|
class StackNamespace < Namespace
|
|
9
|
-
def initialize
|
|
10
|
+
def initialize stack_trace, offset = 0
|
|
10
11
|
super()
|
|
11
|
-
@
|
|
12
|
+
@stack_trace = stack_trace
|
|
12
13
|
@offset = offset
|
|
13
14
|
end
|
|
14
15
|
|
|
15
16
|
def read_key key
|
|
16
|
-
FrameNamespace.new @
|
|
17
|
+
FrameNamespace.new nil, @stack_trace[key + @offset]
|
|
17
18
|
end
|
|
18
19
|
|
|
19
20
|
def call_method name, args
|
|
@@ -23,7 +24,7 @@ module Rookout
|
|
|
23
24
|
|
|
24
25
|
def create_traceback args
|
|
25
26
|
args = 1000 if args == ""
|
|
26
|
-
TracebackNamespace.new @
|
|
27
|
+
TracebackNamespace.new @stack_trace, @offset, args.to_i
|
|
27
28
|
end
|
|
28
29
|
end
|
|
29
30
|
end
|
|
@@ -3,23 +3,22 @@ module Rookout
|
|
|
3
3
|
module Namespaces
|
|
4
4
|
require_relative "namespace"
|
|
5
5
|
require_relative "frame_namespace"
|
|
6
|
-
|
|
7
6
|
require_relative "../../protobuf/variant_pb"
|
|
8
7
|
|
|
9
8
|
class TracebackNamespace < Namespace
|
|
10
|
-
def initialize
|
|
9
|
+
def initialize stack_trace, offset, depth
|
|
11
10
|
super()
|
|
12
|
-
@
|
|
11
|
+
@stack_trace = stack_trace
|
|
13
12
|
@offset = offset
|
|
14
13
|
@depth = depth
|
|
15
14
|
end
|
|
16
15
|
|
|
17
|
-
attr_reader :
|
|
16
|
+
attr_reader :stack_trace
|
|
18
17
|
attr_reader :offset
|
|
19
18
|
attr_reader :depth
|
|
20
19
|
|
|
21
20
|
def read_key key
|
|
22
|
-
FrameNamespace.new @
|
|
21
|
+
FrameNamespace.new nil, @stack_trace[key + @offset]
|
|
23
22
|
end
|
|
24
23
|
|
|
25
24
|
def dump _log_object_errors
|
|
@@ -27,12 +26,12 @@ module Rookout
|
|
|
27
26
|
|
|
28
27
|
@depth.times do |i|
|
|
29
28
|
position = i + @offset
|
|
30
|
-
break if position >= @
|
|
31
|
-
|
|
29
|
+
break if position >= @stack_trace.length
|
|
30
|
+
frame_info = @stack_trace[position]
|
|
32
31
|
|
|
33
|
-
code_object = Com::Rookout::Variant::CodeObject.new filename:
|
|
34
|
-
lineno:
|
|
35
|
-
name:
|
|
32
|
+
code_object = Com::Rookout::Variant::CodeObject.new filename: frame_info.path,
|
|
33
|
+
lineno: frame_info.lineno,
|
|
34
|
+
name: frame_info.label
|
|
36
35
|
|
|
37
36
|
traceback.locations << code_object
|
|
38
37
|
end
|
data/lib/rookout/sanitizer.rb
CHANGED
|
@@ -3,9 +3,6 @@ module Rookout
|
|
|
3
3
|
require_relative "../logger"
|
|
4
4
|
|
|
5
5
|
class Tracer
|
|
6
|
-
require "binding_of_caller"
|
|
7
|
-
include BindingOfCaller::BindingExtensions
|
|
8
|
-
|
|
9
6
|
def initialize
|
|
10
7
|
@trace_points = {}
|
|
11
8
|
@augs = {}
|
|
@@ -17,22 +14,25 @@ module Rookout
|
|
|
17
14
|
aug_trace_points = []
|
|
18
15
|
positions.each do |position|
|
|
19
16
|
trace_point = create_trace_point aug
|
|
20
|
-
|
|
21
17
|
begin
|
|
22
18
|
trace_point.enable target: position.method, target_line: position.lineno
|
|
23
19
|
rescue RuntimeError, ArgumentError => e
|
|
20
|
+
trace_point.disable # just to make sure if something was partially added to clear everything
|
|
24
21
|
if e.message.include? "can not enable any hooks"
|
|
25
22
|
raise Exceptions::RookInvalidPositionException.new(aug.filename, position.lineno)
|
|
26
23
|
end
|
|
27
24
|
raise Exceptions::RookSetTracepointFailed.new(position.lineno, e)
|
|
25
|
+
ensure
|
|
26
|
+
# We add and remove a dummy trace point to re-align the tracing mechanism as a result of some bug in adding
|
|
27
|
+
# a breakpoint https://bugs.ruby-lang.org/issues/17302
|
|
28
|
+
begin
|
|
29
|
+
dummy_trace_point = TracePoint.new(:line) {} # Dummy
|
|
30
|
+
dummy_trace_point.enable target: position.method, target_line: position.lineno
|
|
31
|
+
dummy_trace_point.disable
|
|
32
|
+
rescue
|
|
33
|
+
# IGNORE
|
|
34
|
+
end
|
|
28
35
|
end
|
|
29
|
-
|
|
30
|
-
# We add and remove a dummy trace point to re-align the tracing mechanism as a result of some bug in adding
|
|
31
|
-
# a breakpoint
|
|
32
|
-
dummy_trace_point = TracePoint.new(:line) {} # Dummy
|
|
33
|
-
dummy_trace_point.enable target: position.method, target_line: position.lineno
|
|
34
|
-
dummy_trace_point.disable
|
|
35
|
-
|
|
36
36
|
aug_trace_points.push trace_point
|
|
37
37
|
end
|
|
38
38
|
|
|
@@ -71,11 +71,19 @@ module Rookout
|
|
|
71
71
|
private
|
|
72
72
|
|
|
73
73
|
def create_trace_point aug
|
|
74
|
-
TracePoint.new :line do
|
|
74
|
+
TracePoint.new :line do |tp|
|
|
75
75
|
begin
|
|
76
76
|
begin
|
|
77
|
-
#
|
|
78
|
-
|
|
77
|
+
# tp.binding - Binding object of the frame in the location that triggered the TracePoint.
|
|
78
|
+
# This allows us to collect locals.
|
|
79
|
+
# caller_locations - returns the stacktrace. Allows us to collect files, lines and function names.
|
|
80
|
+
# We used to also collect the Bindings up the stack (allowed us to also collect locals up the stack),
|
|
81
|
+
# but we don't actually need that. If we'll ever need this functionality again, we'll have to use the
|
|
82
|
+
# binding_of_caller gem:
|
|
83
|
+
# require "binding_of_caller"
|
|
84
|
+
# include BindingOfCaller::BindingExtensions
|
|
85
|
+
# callers_bindings = callers - The "callers" function retrieves the bindings up the stack
|
|
86
|
+
aug.execute tp.binding, caller_locations, nil
|
|
79
87
|
rescue Exception => e
|
|
80
88
|
Logger.instance.exception "Exception calling aug", e
|
|
81
89
|
end
|
data/lib/rookout/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,29 +1,15 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rookout
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.54
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Liran Haimovitch
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-
|
|
11
|
+
date: 2023-05-14 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
|
-
- !ruby/object:Gem::Dependency
|
|
14
|
-
name: binding_of_caller
|
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
|
16
|
-
requirements:
|
|
17
|
-
- - ">="
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: '0.7'
|
|
20
|
-
type: :runtime
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - ">="
|
|
25
|
-
- !ruby/object:Gem::Version
|
|
26
|
-
version: '0.7'
|
|
27
13
|
- !ruby/object:Gem::Dependency
|
|
28
14
|
name: concurrent-ruby
|
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|