rookout 0.1.36 → 0.1.37
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/actions/action_run_processor.rb +1 -0
- data/lib/rookout/augs/aug_factory.rb +2 -2
- data/lib/rookout/augs/aug_rate_limiter.rb +2 -2
- data/lib/rookout/augs/locations/location_file_line.rb +5 -1
- data/lib/rookout/com_ws/agent_com_ws.rb +4 -3
- data/lib/rookout/com_ws/envelope_wrapper.rb +7 -5
- data/lib/rookout/com_ws/git.rb +1 -1
- data/lib/rookout/com_ws/information.rb +2 -1
- data/lib/rookout/com_ws/output.rb +13 -7
- data/lib/rookout/commit.rb +1 -1
- data/lib/rookout/config.rb +35 -17
- data/lib/rookout/exceptions.rb +3 -9
- data/lib/rookout/interface.rb +9 -8
- data/lib/rookout/logger.rb +13 -7
- data/lib/rookout/processor/namespace_serializer.rb +1 -1
- data/lib/rookout/processor/namespace_serializer2.rb +18 -11
- data/lib/rookout/processor/namespaces/container_namespace.rb +1 -0
- data/lib/rookout/processor/namespaces/frame_namespace.rb +2 -3
- data/lib/rookout/processor/namespaces/namespace.rb +1 -0
- data/lib/rookout/processor/namespaces/noop_namespace.rb +0 -4
- data/lib/rookout/processor/namespaces/ruby_object_namespace.rb +31 -16
- data/lib/rookout/processor/namespaces/ruby_object_serializer.rb +9 -7
- data/lib/rookout/processor/namespaces/ruby_utils_namespace.rb +0 -4
- data/lib/rookout/processor/namespaces/stack_namespace.rb +1 -0
- data/lib/rookout/processor/namespaces/traceback_namespace.rb +4 -1
- data/lib/rookout/processor/operations/set_operation.rb +2 -0
- data/lib/rookout/processor/paths/arithmetic_path.rb +3 -1
- data/lib/rookout/processor/paths/canopy/actions.rb +5 -1
- data/lib/rookout/processor/paths/canopy/consts.rb +6 -4
- data/lib/rookout/processor/paths/canopy/markers.rb +15 -5
- data/lib/rookout/processor/processor_factory.rb +0 -2
- data/lib/rookout/processor/rook_error.rb +3 -1
- data/lib/rookout/rookout_singleton.rb +3 -2
- data/lib/rookout/services/position.rb +3 -2
- data/lib/rookout/services/tracer.rb +2 -2
- data/lib/rookout/utils.rb +1 -1
- data/lib/rookout/version.rb +1 -1
- metadata +24 -10
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 661b78a375817aaf8b11e7d11baa2a1a55824a4faeb7b07800b2ab77d05fb21a
|
|
4
|
+
data.tar.gz: d2abdb693639eddc830978c88a426f8d660db1ddcc09359d190eac69e2686de2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4cfd877508902044f7a6a003ed6b9f4e87f24452dac85873f4281b30e17445f085f4cc7d46dea0919a6536755f01b81b67d89ce4a21eb063f97f69a51403053b
|
|
7
|
+
data.tar.gz: 606d7c8765066bd747ab7d3ecf098c39c934f023708d7e6eef7348bded9bb5b5175b101faf548f39838408ff865b383cab876f41c39fae0c0d6c2acd8d33d036
|
|
@@ -52,9 +52,9 @@ module Rookout
|
|
|
52
52
|
|
|
53
53
|
case name
|
|
54
54
|
when "file_line"
|
|
55
|
-
|
|
55
|
+
Locations::LocationFileLine.new configuration, @output, aug
|
|
56
56
|
when "exception_handler"
|
|
57
|
-
|
|
57
|
+
Locations::LocationExceptionHandler.new configuration, @output, aug
|
|
58
58
|
when "log_handler"
|
|
59
59
|
raise Exceptions::RookUnsupportedLiveLogger
|
|
60
60
|
else
|
|
@@ -75,7 +75,7 @@ module Rookout
|
|
|
75
75
|
prev_window_usage = @windows[prev_window_key] || 0
|
|
76
76
|
|
|
77
77
|
# Previous window weight
|
|
78
|
-
prev_weight = 1 - (now_ns - current_window_key) / @window_size.to_f
|
|
78
|
+
prev_weight = 1 - ((now_ns - current_window_key) / @window_size.to_f)
|
|
79
79
|
|
|
80
80
|
# Final weighted usage
|
|
81
81
|
(prev_window_usage * prev_weight) + (@active_count * @active_weight) + current_window_usage
|
|
@@ -91,7 +91,7 @@ module Rookout
|
|
|
91
91
|
end
|
|
92
92
|
|
|
93
93
|
def cleanup now_ns
|
|
94
|
-
@windows.reject! { |key, _| key < (now_ns - @window_size * 5) } if @windows.length > 10
|
|
94
|
+
@windows.reject! { |key, _| key < (now_ns - (@window_size * 5)) } if @windows.length > 10
|
|
95
95
|
end
|
|
96
96
|
end
|
|
97
97
|
end
|
|
@@ -21,7 +21,11 @@ module Rookout
|
|
|
21
21
|
@line_unique = arguments["line_unique"] || false
|
|
22
22
|
end
|
|
23
23
|
|
|
24
|
-
attr_reader :filename
|
|
24
|
+
attr_reader :filename
|
|
25
|
+
attr_reader :lineno
|
|
26
|
+
attr_reader :file_hash
|
|
27
|
+
attr_reader :line_crc
|
|
28
|
+
attr_reader :line_unique
|
|
25
29
|
|
|
26
30
|
def add_aug trigger_services
|
|
27
31
|
trigger_services.get_service("position").add_aug self
|
|
@@ -118,7 +118,7 @@ module Rookout
|
|
|
118
118
|
|
|
119
119
|
if @print_on_initial_connection
|
|
120
120
|
@print_on_initial_connection = false
|
|
121
|
-
|
|
121
|
+
$stderr.puts "[Rookout] Successfully connected to controller"
|
|
122
122
|
end
|
|
123
123
|
Logger.instance.debug "WebSocket connected successfully"
|
|
124
124
|
Logger.instance.info "Finished initialization"
|
|
@@ -205,9 +205,10 @@ module Rookout
|
|
|
205
205
|
msg = envelope_wrapper.envelope
|
|
206
206
|
@pending_messages_length -= envelope_wrapper.calculate_size
|
|
207
207
|
|
|
208
|
-
|
|
208
|
+
case msg
|
|
209
|
+
when ExitMessage
|
|
209
210
|
break if msg.thread == Thread.current
|
|
210
|
-
|
|
211
|
+
when FlushMessage
|
|
211
212
|
msg.event.set
|
|
212
213
|
else
|
|
213
214
|
begin
|
|
@@ -8,8 +8,7 @@ class EnvelopeWrapperBase
|
|
|
8
8
|
timestamp = Google::Protobuf::Timestamp.new
|
|
9
9
|
timestamp.from_time Time.new
|
|
10
10
|
envelope = Com::Rookout::Envelope.new msg: any_message, timestamp: timestamp
|
|
11
|
-
|
|
12
|
-
serialized
|
|
11
|
+
Com::Rookout::Envelope.encode envelope
|
|
13
12
|
end
|
|
14
13
|
|
|
15
14
|
def envelope
|
|
@@ -23,11 +22,13 @@ end
|
|
|
23
22
|
|
|
24
23
|
class Variant2EnvelopeWrapper < EnvelopeWrapperBase
|
|
25
24
|
def initialize agent_id, aug_id, report_id, arguments
|
|
25
|
+
super()
|
|
26
|
+
|
|
26
27
|
@aug_report_message = Com::Rookout::AugReportMessage.new agent_id: agent_id,
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
aug_id: aug_id,
|
|
29
|
+
report_id: report_id
|
|
29
30
|
@serializer = Rookout::Processor::NamespaceSerializer2.new
|
|
30
|
-
@aug_report_message.arguments2 = @serializer.dump arguments
|
|
31
|
+
@aug_report_message.arguments2 = @serializer.dump arguments, true
|
|
31
32
|
@serializer.string_cache.each { |key, value| @aug_report_message.strings_cache[key] = value }
|
|
32
33
|
@envelope = wrap_in_envelope @aug_report_message
|
|
33
34
|
@aug_report_message = nil
|
|
@@ -44,6 +45,7 @@ end
|
|
|
44
45
|
|
|
45
46
|
class EnvelopeWrapper < EnvelopeWrapperBase
|
|
46
47
|
def initialize message
|
|
48
|
+
super()
|
|
47
49
|
@envelope = wrap_in_envelope message
|
|
48
50
|
end
|
|
49
51
|
|
data/lib/rookout/com_ws/git.rb
CHANGED
|
@@ -42,7 +42,8 @@ module Rookout
|
|
|
42
42
|
@closing = false
|
|
43
43
|
end
|
|
44
44
|
|
|
45
|
-
attr_accessor :agent_id
|
|
45
|
+
attr_accessor :agent_id
|
|
46
|
+
attr_accessor :agent_com
|
|
46
47
|
|
|
47
48
|
def close
|
|
48
49
|
@closing = true
|
|
@@ -86,13 +87,17 @@ module Rookout
|
|
|
86
87
|
if arguments.nil? || arguments.call_method("size", "") == 0
|
|
87
88
|
protobuf_arguments = nil
|
|
88
89
|
else
|
|
89
|
-
protobuf_arguments = Processor::NamespaceSerializer.dump arguments
|
|
90
|
+
protobuf_arguments = Processor::NamespaceSerializer.dump arguments, true
|
|
90
91
|
end
|
|
91
92
|
|
|
92
|
-
envelope_wrapper = EnvelopeWrapper.new(
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
93
|
+
envelope_wrapper = EnvelopeWrapper.new(
|
|
94
|
+
Com::Rookout::AugReportMessage.new(
|
|
95
|
+
agent_id: @agent_id,
|
|
96
|
+
aug_id: aug_id,
|
|
97
|
+
report_id: report_id,
|
|
98
|
+
arguments: protobuf_arguments
|
|
99
|
+
)
|
|
100
|
+
)
|
|
96
101
|
end
|
|
97
102
|
|
|
98
103
|
@agent_com.add envelope_wrapper
|
|
@@ -123,7 +128,8 @@ module Rookout
|
|
|
123
128
|
protobuf_arguments = nil
|
|
124
129
|
else
|
|
125
130
|
protobuf_arguments = Processor::NamespaceSerializer.dump(
|
|
126
|
-
Processor::Namespaces::RubyObjectNamespace.new(arguments)
|
|
131
|
+
Processor::Namespaces::RubyObjectNamespace.new(arguments),
|
|
132
|
+
true
|
|
127
133
|
)
|
|
128
134
|
end
|
|
129
135
|
|
data/lib/rookout/commit.rb
CHANGED
data/lib/rookout/config.rb
CHANGED
|
@@ -6,21 +6,26 @@ module Rookout
|
|
|
6
6
|
# Magic to allow for module variables to be easily accessible
|
|
7
7
|
class << self
|
|
8
8
|
attr_accessor :debug
|
|
9
|
+
|
|
9
10
|
Rookout::Config.debug = false
|
|
10
11
|
|
|
11
|
-
attr_accessor :logger_filename
|
|
12
|
+
attr_accessor :logger_filename
|
|
13
|
+
attr_accessor :logger_log_to_stderr
|
|
14
|
+
attr_accessor :logger_log_level
|
|
15
|
+
|
|
12
16
|
Rookout::Config.logger_filename = "rookout/ruby-rook.log".freeze
|
|
13
17
|
Rookout::Config.logger_log_to_stderr = false
|
|
14
18
|
Rookout::Config.logger_log_level = :info
|
|
15
19
|
|
|
16
|
-
attr_accessor :agent_com_configuration_command_thread_name
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
attr_accessor :agent_com_configuration_command_thread_name
|
|
21
|
+
attr_accessor :agent_com_max_message_limit
|
|
22
|
+
attr_accessor :agent_com_max_queue_messages_length
|
|
23
|
+
attr_accessor :agent_com_timeout
|
|
24
|
+
attr_accessor :agent_com_ping_interval
|
|
25
|
+
attr_accessor :agent_com_ping_timeout
|
|
26
|
+
attr_accessor :agent_com_flush_timeout
|
|
27
|
+
attr_accessor :agent_com_max_queued_messages
|
|
28
|
+
|
|
24
29
|
Rookout::Config.agent_com_max_message_limit = 1024 * 1024
|
|
25
30
|
Rookout::Config.agent_com_max_queue_messages_length = 15 * 1024 * 1024
|
|
26
31
|
Rookout::Config.agent_com_timeout = 3
|
|
@@ -29,47 +34,60 @@ module Rookout
|
|
|
29
34
|
Rookout::Config.agent_com_flush_timeout = 3
|
|
30
35
|
Rookout::Config.agent_com_max_queued_messages = 100
|
|
31
36
|
|
|
32
|
-
attr_accessor :backoff_factor
|
|
37
|
+
attr_accessor :backoff_factor
|
|
38
|
+
attr_accessor :backoff_reset_time
|
|
39
|
+
attr_accessor :backoff_max_time
|
|
40
|
+
|
|
33
41
|
Rookout::Config.backoff_factor = 0.2
|
|
34
42
|
Rookout::Config.backoff_max_time = 60
|
|
35
43
|
Rookout::Config.backoff_reset_time = 3 * 60.0
|
|
36
44
|
|
|
37
|
-
attr_accessor :output_max_status_updates
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
45
|
+
attr_accessor :output_max_status_updates
|
|
46
|
+
attr_accessor :output_max_aug_messages
|
|
47
|
+
attr_accessor :output_max_log_items
|
|
48
|
+
attr_accessor :output_bucket_refresh_rate
|
|
49
|
+
|
|
41
50
|
Rookout::Config.output_max_status_updates = 200
|
|
42
51
|
Rookout::Config.output_max_aug_messages = 100
|
|
43
52
|
Rookout::Config.output_max_log_items = 200
|
|
44
53
|
Rookout::Config.output_bucket_refresh_rate = 10
|
|
45
54
|
|
|
46
55
|
attr_accessor :instrumentation_max_aug_time
|
|
56
|
+
|
|
47
57
|
Rookout::Config.instrumentation_max_aug_time = 400
|
|
48
58
|
|
|
49
|
-
attr_accessor :user_git_commit
|
|
59
|
+
attr_accessor :user_git_commit
|
|
60
|
+
attr_accessor :user_git_origin
|
|
61
|
+
|
|
50
62
|
Rookout::Config.user_git_commit = nil
|
|
51
63
|
Rookout::Config.user_git_origin = nil
|
|
52
64
|
|
|
53
|
-
attr_accessor :rookout_version
|
|
65
|
+
attr_accessor :rookout_version
|
|
66
|
+
attr_accessor :rookout_commit
|
|
67
|
+
|
|
54
68
|
Rookout::Config.rookout_version = Rookout::VERSION
|
|
55
69
|
Rookout::Config.rookout_commit = Rookout::COMMIT
|
|
56
70
|
|
|
57
71
|
attr_accessor :protobuf_version2
|
|
72
|
+
|
|
58
73
|
Rookout::Config.protobuf_version2 = false
|
|
59
74
|
|
|
60
75
|
attr_accessor :true_values
|
|
76
|
+
|
|
61
77
|
Rookout::Config.true_values = ["y", "Y", "yes", "Yes", "YES", "true", "True", "TRUE", "1"]
|
|
62
78
|
|
|
63
79
|
|
|
64
80
|
def update_config configuration
|
|
65
81
|
is_config_proto2 = configuration["RUBY_PROTOBUF_VERSION_2"]
|
|
66
82
|
return if is_config_proto2.nil?
|
|
67
|
-
is_env_proto2 = ENV["
|
|
83
|
+
is_env_proto2 = ENV["ROOKOUT_Protobuf_Version2"]
|
|
68
84
|
if is_env_proto2.nil?
|
|
69
85
|
@protobuf_version2 = true if @true_values.include? is_config_proto2
|
|
70
86
|
elsif @true_values.include? is_env_proto2
|
|
87
|
+
Logger.instance.debug "ROOKOUT_Protobuf_Version2 env is preset: #{is_env_proto2}"
|
|
71
88
|
@protobuf_version2 = true
|
|
72
89
|
end
|
|
90
|
+
Logger.instance.info "Updating ROOKOUT_Protobuf_Version2 value to: #{@protobuf_version2}"
|
|
73
91
|
end
|
|
74
92
|
end
|
|
75
93
|
end
|
data/lib/rookout/exceptions.rb
CHANGED
|
@@ -11,9 +11,6 @@ module Rookout
|
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
class RookInterfaceException < ToolException
|
|
14
|
-
def initialize message
|
|
15
|
-
super message
|
|
16
|
-
end
|
|
17
14
|
end
|
|
18
15
|
|
|
19
16
|
class RookVersionNotSupported < ToolException
|
|
@@ -92,8 +89,8 @@ module Rookout
|
|
|
92
89
|
class RookMessageSizeExceeded < ToolException
|
|
93
90
|
def initialize message_size, max_message_size
|
|
94
91
|
super "Message size of #{message_size} exceeds max size limit of #{max_message_size}. " \
|
|
95
|
-
|
|
96
|
-
|
|
92
|
+
"Change the depth of collection or change the default by setting ROOKOUT_MAX_MESSAGE_SIZE " \
|
|
93
|
+
"as environment variable or system property",
|
|
97
94
|
{ "message_size" => message_size, "max_message_size" => max_message_size }
|
|
98
95
|
end
|
|
99
96
|
end
|
|
@@ -101,7 +98,7 @@ module Rookout
|
|
|
101
98
|
class RookRuleRateLimited < ToolException
|
|
102
99
|
def initialize
|
|
103
100
|
super "Breakpoint was disabled due to rate-limiting. " \
|
|
104
|
-
|
|
101
|
+
"For more information: https://docs.rookout.com/docs/breakpoints-tasks.html#rate-limiting"
|
|
105
102
|
end
|
|
106
103
|
end
|
|
107
104
|
|
|
@@ -139,9 +136,6 @@ module Rookout
|
|
|
139
136
|
end
|
|
140
137
|
|
|
141
138
|
class RookInvalidOptions < ToolException
|
|
142
|
-
def initialize description
|
|
143
|
-
super description
|
|
144
|
-
end
|
|
145
139
|
end
|
|
146
140
|
|
|
147
141
|
class RookInvalidLabel < ToolException
|
data/lib/rookout/interface.rb
CHANGED
|
@@ -14,7 +14,7 @@ module Rookout
|
|
|
14
14
|
|
|
15
15
|
def print_debug_messages
|
|
16
16
|
puts "[Rookout] Running in debug mode"
|
|
17
|
-
puts "[Rookout] Rookout SDK for ruby:
|
|
17
|
+
puts "[Rookout] Rookout SDK for ruby: #{Config.rookout_version}"
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
def start options = {}
|
|
@@ -36,16 +36,16 @@ module Rookout
|
|
|
36
36
|
rook.connect(**@start_options)
|
|
37
37
|
rescue LoadError
|
|
38
38
|
raise if throw_errors
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
$stderr.puts "[Rookout] Failed to load Rookout. Please make sure to force build native extensions by setting" \
|
|
40
|
+
"'bundle config force_ruby_platform true'"
|
|
41
41
|
rescue RookMissingToken, RookInvalidToken, RookInvalidOptions, RookVersionNotSupported, RookBadProtobuf => e
|
|
42
42
|
raise if throw_errors
|
|
43
|
-
|
|
43
|
+
$stderr.puts "[Rookout] Failed to start Rookout: #{e.message}"
|
|
44
44
|
rescue RookCommunicationException => e
|
|
45
45
|
raise if throw_errors
|
|
46
|
-
Logger.instance.warning "[Rookout]
|
|
46
|
+
Logger.instance.warning "[Rookout] #{e.message}"
|
|
47
47
|
rescue Exception => e
|
|
48
|
-
|
|
48
|
+
$stderr.puts e.full_message if Config.debug
|
|
49
49
|
raise if throw_errors
|
|
50
50
|
end
|
|
51
51
|
end
|
|
@@ -82,12 +82,13 @@ module Rookout
|
|
|
82
82
|
# Only test alpine
|
|
83
83
|
return unless File.exist? "/etc/alpine-release"
|
|
84
84
|
|
|
85
|
+
# Make sure protobuf is built from source
|
|
85
86
|
protobuf = Gem::Specification.find_by_path "google/protobuf"
|
|
86
|
-
|
|
87
|
+
$stderr.puts RookBadProtobuf.new.message if protobuf.nil?
|
|
87
88
|
return unless protobuf.platform != "ruby"
|
|
88
89
|
|
|
89
90
|
error = RookBadProtobufPlatform.new protobuf.platform
|
|
90
|
-
|
|
91
|
+
$stderr.puts error.message
|
|
91
92
|
end
|
|
92
93
|
|
|
93
94
|
def configure_globals options
|
data/lib/rookout/logger.rb
CHANGED
|
@@ -66,7 +66,7 @@ module Rookout
|
|
|
66
66
|
|
|
67
67
|
arguments.each do |argument|
|
|
68
68
|
if argument.is_a? Exception
|
|
69
|
-
@formatted_message += "\n
|
|
69
|
+
@formatted_message += "\n#{argument.message}\n#{argument.backtrace.join "\n\t"}"
|
|
70
70
|
end
|
|
71
71
|
end
|
|
72
72
|
|
|
@@ -74,7 +74,13 @@ module Rookout
|
|
|
74
74
|
set_caller
|
|
75
75
|
end
|
|
76
76
|
|
|
77
|
-
attr_reader :level
|
|
77
|
+
attr_reader :level
|
|
78
|
+
attr_reader :time
|
|
79
|
+
attr_reader :filename
|
|
80
|
+
attr_reader :lineno
|
|
81
|
+
attr_reader :message
|
|
82
|
+
attr_reader :formatted_message
|
|
83
|
+
attr_reader :arguments
|
|
78
84
|
|
|
79
85
|
def format
|
|
80
86
|
"#{@time} #{Process.pid}:#{Thread.current.name}-" \
|
|
@@ -137,19 +143,19 @@ module Rookout
|
|
|
137
143
|
file = nil
|
|
138
144
|
|
|
139
145
|
if Config.debug
|
|
140
|
-
|
|
141
|
-
|
|
146
|
+
$stderr.puts "[Rookout] Failed to open log file: #{log_file_path}"
|
|
147
|
+
$stderr.puts e.backtrace
|
|
142
148
|
end
|
|
143
149
|
end
|
|
144
150
|
|
|
145
|
-
->(record) { file.write record.format
|
|
151
|
+
->(record) { file.write "#{record.format}\n" if file }
|
|
146
152
|
end
|
|
147
153
|
|
|
148
154
|
def calculate_log_file_path
|
|
149
155
|
return Config.logger_filename if absolute_path? Config.logger_filename
|
|
150
156
|
|
|
151
157
|
if RUBY_PLATFORM.include? "darwin"
|
|
152
|
-
File.join
|
|
158
|
+
File.join Dir.home, Config.logger_filename
|
|
153
159
|
elsif RUBY_PLATFORM.match?(/cygwin|mswin|mingw|bccwin|wince|emx/)
|
|
154
160
|
File.join ENV["USERPROFILE"], Config.logger_filename
|
|
155
161
|
else
|
|
@@ -158,7 +164,7 @@ module Rookout
|
|
|
158
164
|
end
|
|
159
165
|
|
|
160
166
|
def new_stderr_handler
|
|
161
|
-
->(record) {
|
|
167
|
+
->(record) { $stderr.puts record.format }
|
|
162
168
|
end
|
|
163
169
|
|
|
164
170
|
def new_remote_handler
|
|
@@ -14,7 +14,8 @@ module Rookout
|
|
|
14
14
|
@estimated_pending_bytes = 0
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
attr_reader :string_cache
|
|
17
|
+
attr_reader :string_cache
|
|
18
|
+
attr_reader :estimated_pending_bytes
|
|
18
19
|
|
|
19
20
|
def get_string_index_in_cache str
|
|
20
21
|
if @string_cache.key? str
|
|
@@ -35,13 +36,16 @@ module Rookout
|
|
|
35
36
|
variant.variant_type_max_depth = (type << 1) | 1
|
|
36
37
|
end
|
|
37
38
|
|
|
38
|
-
def dump namespace, log_errors
|
|
39
|
-
|
|
39
|
+
def dump namespace, log_errors
|
|
40
|
+
case namespace
|
|
41
|
+
when Namespaces::RubyObjectNamespace
|
|
40
42
|
dump_ruby_object_namespace namespace, log_errors
|
|
41
|
-
|
|
43
|
+
when Namespaces::ContainerNamespace
|
|
42
44
|
dump_container_namespace namespace, log_errors
|
|
43
|
-
|
|
45
|
+
when Namespaces::TracebackNamespace
|
|
44
46
|
dump_traceback_namespace namespace
|
|
47
|
+
else
|
|
48
|
+
raise NotImplementedError
|
|
45
49
|
end
|
|
46
50
|
rescue StandardError => e
|
|
47
51
|
message = "Failed to serialize namespace"
|
|
@@ -80,6 +84,7 @@ module Rookout
|
|
|
80
84
|
# rubocop:disable Metrics/AbcSize
|
|
81
85
|
# rubocop:disable Metrics/PerceivedComplexity
|
|
82
86
|
# rubocop:disable Metrics/CyclomaticComplexity
|
|
87
|
+
# rubocop:disable Style/ClassEqualityComparison
|
|
83
88
|
def unsafe_dump_object obj, current_depth, config, log_object_errors
|
|
84
89
|
variant = Com::Rookout::Variant2.new original_type_index_in_cache: get_string_index_in_cache(obj.class.to_s)
|
|
85
90
|
|
|
@@ -105,6 +110,7 @@ module Rookout
|
|
|
105
110
|
|
|
106
111
|
variant
|
|
107
112
|
end
|
|
113
|
+
# rubocop:enable Style/ClassEqualityComparison
|
|
108
114
|
# rubocop:enable Metrics/AbcSize
|
|
109
115
|
# rubocop:enable Metrics/PerceivedComplexity
|
|
110
116
|
# rubocop:enable Metrics/CyclomaticComplexity
|
|
@@ -120,20 +126,21 @@ module Rookout
|
|
|
120
126
|
INT64_MAX = (1 << 63) - 1
|
|
121
127
|
|
|
122
128
|
def dump_numeric obj, variant, config
|
|
123
|
-
|
|
129
|
+
case obj
|
|
130
|
+
when true
|
|
124
131
|
dump_variant_type variant, Com::Rookout::Variant::Type::VARIANT_LONG
|
|
125
132
|
variant.long_value = 1
|
|
126
|
-
|
|
133
|
+
when false
|
|
127
134
|
dump_variant_type variant, Com::Rookout::Variant::Type::VARIANT_LONG
|
|
128
135
|
variant.long_value = 0
|
|
129
|
-
|
|
136
|
+
when Integer
|
|
130
137
|
dump_integer obj, variant
|
|
131
|
-
|
|
138
|
+
when Float
|
|
132
139
|
dump_variant_type variant, Com::Rookout::Variant::Type::VARIANT_DOUBLE
|
|
133
140
|
variant.double_value = obj.to_f
|
|
134
|
-
|
|
141
|
+
when BigDecimal
|
|
135
142
|
dump_string obj.to_s, variant, config # TODO: NS: This might cut the decimal value, is that ok?
|
|
136
|
-
|
|
143
|
+
when Complex
|
|
137
144
|
dump_variant_type variant, Com::Rookout::Variant::Type::VARIANT_COMPLEX
|
|
138
145
|
variant.complex_value = Com::Rookout::Variant::Complex.new real: obj.real.to_f,
|
|
139
146
|
imaginary: obj.imaginary.to_f
|
|
@@ -8,6 +8,7 @@ module Rookout
|
|
|
8
8
|
|
|
9
9
|
class FrameNamespace < Namespace
|
|
10
10
|
def initialize binding
|
|
11
|
+
super()
|
|
11
12
|
@binding = binding
|
|
12
13
|
end
|
|
13
14
|
|
|
@@ -19,14 +20,12 @@ module Rookout
|
|
|
19
20
|
|
|
20
21
|
def call_method name, args
|
|
21
22
|
case name
|
|
22
|
-
when "filename"
|
|
23
|
+
when "filename", "module"
|
|
23
24
|
RubyObjectNamespace.new @binding.source_location[0]
|
|
24
25
|
when "line"
|
|
25
26
|
RubyObjectNamespace.new @binding.source_location[1]
|
|
26
27
|
when "function"
|
|
27
28
|
RubyObjectNamespace.new @binding.eval("__method__").to_s
|
|
28
|
-
when "module"
|
|
29
|
-
RubyObjectNamespace.new @binding.source_location[0]
|
|
30
29
|
when "locals"
|
|
31
30
|
locals args
|
|
32
31
|
when "dump"
|
|
@@ -17,7 +17,10 @@ module Rookout
|
|
|
17
17
|
@max_string = max_string
|
|
18
18
|
end
|
|
19
19
|
|
|
20
|
-
attr_reader :max_depth
|
|
20
|
+
attr_reader :max_depth
|
|
21
|
+
attr_reader :max_width
|
|
22
|
+
attr_reader :max_collection_depth
|
|
23
|
+
attr_reader :max_string
|
|
21
24
|
end
|
|
22
25
|
|
|
23
26
|
OBJECT_DUMP_CONFIG_STRICT = ObjectDumpConfig.new 2, 10, 2, 128
|
|
@@ -37,12 +40,14 @@ module Rookout
|
|
|
37
40
|
class RubyObjectNamespace < Namespace
|
|
38
41
|
include RubyObjectSerializer
|
|
39
42
|
|
|
40
|
-
def initialize obj, dump_config =
|
|
43
|
+
def initialize obj, dump_config = nil
|
|
44
|
+
super()
|
|
41
45
|
@obj = obj
|
|
42
|
-
@dump_config = dump_config
|
|
46
|
+
@dump_config = dump_config || OBJECT_DUMP_CONFIG_DEFAULT
|
|
43
47
|
end
|
|
44
48
|
|
|
45
|
-
attr_reader :obj
|
|
49
|
+
attr_reader :obj
|
|
50
|
+
attr_reader :dump_config
|
|
46
51
|
|
|
47
52
|
def tailor_limits!
|
|
48
53
|
if @obj.is_a? String
|
|
@@ -62,18 +67,11 @@ module Rookout
|
|
|
62
67
|
end
|
|
63
68
|
|
|
64
69
|
def read_key key
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
elsif @obj.is_a? Hash
|
|
71
|
-
return RubyObjectNamespace.new @obj[key] if @obj.key? key
|
|
72
|
-
return RubyObjectNamespace.new @obj[key.to_sym] if @obj.key? key.to_s.to_sym
|
|
73
|
-
|
|
74
|
-
@obj.each { |it, value| return RubyObjectNamespace.new value if it.to_s == key }
|
|
75
|
-
|
|
76
|
-
raise Exceptions::RookKeyNotFound, key
|
|
70
|
+
case @obj
|
|
71
|
+
when Array, String
|
|
72
|
+
read_key_as_int key
|
|
73
|
+
when Hash
|
|
74
|
+
read_key_from_hash key
|
|
77
75
|
else
|
|
78
76
|
raise Exceptions::RookInvalidObjectForAccess.new(@obj.class.to_s, "ReadKey")
|
|
79
77
|
end
|
|
@@ -94,6 +92,23 @@ module Rookout
|
|
|
94
92
|
dump_raw_object @obj, 0, @dump_config, log_object_errors
|
|
95
93
|
end
|
|
96
94
|
end
|
|
95
|
+
|
|
96
|
+
private
|
|
97
|
+
|
|
98
|
+
def read_key_as_int key
|
|
99
|
+
key_int = key.to_i
|
|
100
|
+
return RubyObjectNamespace.new @obj[key_int] if key_int >= 0 && key_int < @obj.length
|
|
101
|
+
raise Exceptions::RookKeyNotFound, key
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def read_key_from_hash key
|
|
105
|
+
return RubyObjectNamespace.new @obj[key] if @obj.key? key
|
|
106
|
+
return RubyObjectNamespace.new @obj[key.to_sym] if @obj.key? key.to_s.to_sym
|
|
107
|
+
|
|
108
|
+
@obj.each { |it, value| return RubyObjectNamespace.new value if it.to_s == key }
|
|
109
|
+
|
|
110
|
+
raise Exceptions::RookKeyNotFound, key
|
|
111
|
+
end
|
|
97
112
|
end
|
|
98
113
|
end
|
|
99
114
|
end
|
|
@@ -24,6 +24,7 @@ module Rookout
|
|
|
24
24
|
|
|
25
25
|
# rubocop:disable Metrics/PerceivedComplexity
|
|
26
26
|
# rubocop:disable Metrics/CyclomaticComplexity
|
|
27
|
+
# rubocop:disable Style/ClassEqualityComparison
|
|
27
28
|
def unsafe_dump_object obj, current_depth, config, log_object_errors
|
|
28
29
|
variant = create_base_variant obj, current_depth, config, log_object_errors
|
|
29
30
|
|
|
@@ -49,7 +50,7 @@ module Rookout
|
|
|
49
50
|
|
|
50
51
|
variant
|
|
51
52
|
end
|
|
52
|
-
|
|
53
|
+
# rubocop:enable Style/ClassEqualityComparison
|
|
53
54
|
# rubocop:enable Metrics/CyclomaticComplexity
|
|
54
55
|
# rubocop:enable Metrics/PerceivedComplexity
|
|
55
56
|
|
|
@@ -83,23 +84,24 @@ module Rookout
|
|
|
83
84
|
INT64_MAX = (1 << 63) - 1
|
|
84
85
|
|
|
85
86
|
def dump_numeric obj, variant
|
|
86
|
-
|
|
87
|
+
case obj
|
|
88
|
+
when true
|
|
87
89
|
variant.variant_type = :VARIANT_INT
|
|
88
90
|
variant.int_value = 1
|
|
89
|
-
|
|
91
|
+
when false
|
|
90
92
|
variant.variant_type = :VARIANT_INT
|
|
91
93
|
variant.int_value = 0
|
|
92
|
-
|
|
94
|
+
when Integer
|
|
93
95
|
dump_integer obj, variant
|
|
94
|
-
|
|
96
|
+
when Float
|
|
95
97
|
variant.variant_type = :VARIANT_DOUBLE
|
|
96
98
|
variant.double_value = obj.to_f
|
|
97
|
-
|
|
99
|
+
when BigDecimal
|
|
98
100
|
serialized_decimal = obj.to_s
|
|
99
101
|
variant.variant_type = :VARIANT_STRING
|
|
100
102
|
variant.string_value = Com::Rookout::Variant::String.new value: serialized_decimal,
|
|
101
103
|
original_size: serialized_decimal.length
|
|
102
|
-
|
|
104
|
+
when Complex
|
|
103
105
|
variant.variant_type = :VARIANT_COMPLEX
|
|
104
106
|
variant.complex_value = Com::Rookout::Variant::Complex.new real: obj.real.to_f,
|
|
105
107
|
imaginary: obj.imaginary.to_f
|
|
@@ -8,12 +8,15 @@ module Rookout
|
|
|
8
8
|
|
|
9
9
|
class TracebackNamespace < Namespace
|
|
10
10
|
def initialize backtrace, offset, depth
|
|
11
|
+
super()
|
|
11
12
|
@backtrace = backtrace
|
|
12
13
|
@offset = offset
|
|
13
14
|
@depth = depth
|
|
14
15
|
end
|
|
15
16
|
|
|
16
|
-
attr_reader :backtrace
|
|
17
|
+
attr_reader :backtrace
|
|
18
|
+
attr_reader :offset
|
|
19
|
+
attr_reader :depth
|
|
17
20
|
|
|
18
21
|
def read_key key
|
|
19
22
|
FrameNamespace.new @backtrace[key + @offset]
|
|
@@ -13,6 +13,8 @@ module Rookout
|
|
|
13
13
|
|
|
14
14
|
class ArithmeticPath < Path
|
|
15
15
|
def initialize path
|
|
16
|
+
super()
|
|
17
|
+
|
|
16
18
|
if path.is_a? Hash
|
|
17
19
|
path = path["path"] || path[:path]
|
|
18
20
|
end
|
|
@@ -20,7 +22,7 @@ module Rookout
|
|
|
20
22
|
@raw_path = path
|
|
21
23
|
|
|
22
24
|
if path.start_with?("NOT(") && path.end_with?(")")
|
|
23
|
-
@path = path["NOT(".length..-2]
|
|
25
|
+
@path = path[("NOT(".length)..-2]
|
|
24
26
|
@negation = true
|
|
25
27
|
else
|
|
26
28
|
@path = path
|
|
@@ -79,6 +79,8 @@ module Rookout
|
|
|
79
79
|
end
|
|
80
80
|
|
|
81
81
|
# rubocop:disable Metrics/AbcSize
|
|
82
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
|
83
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
|
82
84
|
def make_comp_exp _input, _start, _finish, elements
|
|
83
85
|
# We can assume the following: atom ( opt_ atom )*
|
|
84
86
|
# the first (which must be) will be simple atom
|
|
@@ -108,7 +110,7 @@ module Rookout
|
|
|
108
110
|
flat_elements.each_with_index do |e, index|
|
|
109
111
|
if e.is_a?(Opt) && e.level == level
|
|
110
112
|
result = e.execute_operation flat_elements[index - 1], flat_elements[index + 1]
|
|
111
|
-
flat_elements = flat_elements[0...index - 1] + [result] + flat_elements[index + 2
|
|
113
|
+
flat_elements = flat_elements[0...index - 1] + [result] + flat_elements[index + 2..]
|
|
112
114
|
restart_scan = true
|
|
113
115
|
break
|
|
114
116
|
end
|
|
@@ -122,6 +124,8 @@ module Rookout
|
|
|
122
124
|
|
|
123
125
|
flat_elements[0]
|
|
124
126
|
end
|
|
127
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
|
128
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
|
125
129
|
# rubocop:enable Metrics/AbcSize
|
|
126
130
|
|
|
127
131
|
def make_opt _input, _start, _finish, elements
|
|
@@ -50,9 +50,10 @@ module Rookout
|
|
|
50
50
|
# If it's a dict, scan the keys, compensating for additional abstraction
|
|
51
51
|
if b.is_a? Hash
|
|
52
52
|
b.each_key do |key|
|
|
53
|
-
|
|
53
|
+
case key
|
|
54
|
+
when ObjectMarker
|
|
54
55
|
return true if key.obj == a
|
|
55
|
-
|
|
56
|
+
when a
|
|
56
57
|
return true
|
|
57
58
|
end
|
|
58
59
|
end
|
|
@@ -62,9 +63,10 @@ module Rookout
|
|
|
62
63
|
# If it's an array, scan the value, compensating for additional abstraction
|
|
63
64
|
if b.is_a? Array
|
|
64
65
|
b.each do |value|
|
|
65
|
-
|
|
66
|
+
case value
|
|
67
|
+
when ObjectMarker
|
|
66
68
|
return true if value.obj == a
|
|
67
|
-
|
|
69
|
+
when a
|
|
68
70
|
return true
|
|
69
71
|
end
|
|
70
72
|
end
|
|
@@ -7,7 +7,11 @@ module Rookout
|
|
|
7
7
|
require_relative "../../../exceptions"
|
|
8
8
|
require_relative "../../namespaces/container_namespace"
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
# rubocop:disable Lint/EmptyClass
|
|
11
|
+
class Marker
|
|
12
|
+
# Empty base class
|
|
13
|
+
end
|
|
14
|
+
# rubocop:enable Lint/EmptyClass
|
|
11
15
|
|
|
12
16
|
class Operation < Marker
|
|
13
17
|
def read _namespace, _create
|
|
@@ -21,6 +25,7 @@ module Rookout
|
|
|
21
25
|
|
|
22
26
|
class FunctionOperation < Operation
|
|
23
27
|
def initialize name, args
|
|
28
|
+
super()
|
|
24
29
|
@name = name
|
|
25
30
|
@args = args
|
|
26
31
|
end
|
|
@@ -32,6 +37,7 @@ module Rookout
|
|
|
32
37
|
|
|
33
38
|
class AttributeOperation < Operation
|
|
34
39
|
def initialize name
|
|
40
|
+
super()
|
|
35
41
|
@name = name
|
|
36
42
|
end
|
|
37
43
|
|
|
@@ -49,6 +55,7 @@ module Rookout
|
|
|
49
55
|
|
|
50
56
|
class LookupOperation < Operation
|
|
51
57
|
def initialize text
|
|
58
|
+
super()
|
|
52
59
|
if (text.start_with?("'") && text.end_with?("'")) || (text.start_with?("\"") && text.end_with?("\""))
|
|
53
60
|
@key = text[1...-1]
|
|
54
61
|
else
|
|
@@ -63,11 +70,13 @@ module Rookout
|
|
|
63
70
|
|
|
64
71
|
class ObjectMarker < Marker
|
|
65
72
|
def initialize text, obj
|
|
73
|
+
super()
|
|
66
74
|
@text = text
|
|
67
75
|
@obj = obj
|
|
68
76
|
end
|
|
69
77
|
|
|
70
|
-
attr_reader :text
|
|
78
|
+
attr_reader :text
|
|
79
|
+
attr_reader :obj
|
|
71
80
|
|
|
72
81
|
def to_s
|
|
73
82
|
@obj.to_s
|
|
@@ -136,6 +145,8 @@ module Rookout
|
|
|
136
145
|
|
|
137
146
|
class Opt < Marker
|
|
138
147
|
def initialize opt
|
|
148
|
+
super()
|
|
149
|
+
|
|
139
150
|
@opt = opt
|
|
140
151
|
@level = nil
|
|
141
152
|
|
|
@@ -160,9 +171,8 @@ module Rookout
|
|
|
160
171
|
return
|
|
161
172
|
end
|
|
162
173
|
|
|
163
|
-
|
|
164
|
-
raise Exceptions::RookNonPrimitiveObjectType, first_obj.class.to_s
|
|
165
|
-
PRIMITIVES.include? first_obj.class
|
|
174
|
+
if !first_obj.nil? && !(PRIMITIVES.include? first_obj.class)
|
|
175
|
+
raise Exceptions::RookNonPrimitiveObjectType, first_obj.class.to_s
|
|
166
176
|
end
|
|
167
177
|
|
|
168
178
|
return if second_obj.nil?
|
|
@@ -24,7 +24,9 @@ module Rookout
|
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
-
attr_reader :message
|
|
27
|
+
attr_reader :message
|
|
28
|
+
attr_reader :exception
|
|
29
|
+
attr_reader :parameters
|
|
28
30
|
|
|
29
31
|
def dumps
|
|
30
32
|
parameters = NamespaceSerializer.dump Namespaces::RubyObjectNamespace.new(@parameters), false
|
|
@@ -82,9 +82,10 @@ module Rookout
|
|
|
82
82
|
private
|
|
83
83
|
|
|
84
84
|
def check_version_supported
|
|
85
|
-
raise Exceptions::
|
|
85
|
+
raise Exceptions::RookVersionNotSupported.new("platform", RUBY_ENGINE) unless RUBY_ENGINE == "ruby"
|
|
86
86
|
raise Exceptions::RookVersionNotSupported.new("version", RUBY_VERSION) unless
|
|
87
|
-
RUBY_VERSION.start_with?("2.7") || RUBY_VERSION.start_with?("2.6")
|
|
87
|
+
RUBY_VERSION.start_with?("2.7") || RUBY_VERSION.start_with?("2.6") ||
|
|
88
|
+
RUBY_VERSION.start_with?("3.0") || RUBY_VERSION.start_with?("3.1")
|
|
88
89
|
end
|
|
89
90
|
end
|
|
90
91
|
end
|
|
@@ -11,7 +11,8 @@ module Rookout
|
|
|
11
11
|
@method = method
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
-
attr_reader :lineno
|
|
14
|
+
attr_reader :lineno
|
|
15
|
+
attr_reader :method
|
|
15
16
|
end
|
|
16
17
|
|
|
17
18
|
class PositionResolver
|
|
@@ -54,7 +55,7 @@ module Rookout
|
|
|
54
55
|
end
|
|
55
56
|
|
|
56
57
|
def clear_augs
|
|
57
|
-
@augs.
|
|
58
|
+
@augs.each_value do |aug_id|
|
|
58
59
|
remove_aug aug_id
|
|
59
60
|
end
|
|
60
61
|
|
|
@@ -26,7 +26,7 @@ module Rookout
|
|
|
26
26
|
|
|
27
27
|
# We add and remove a dummy trace point to re-align the tracing mechanism as a result of some bug in adding
|
|
28
28
|
# a breakpoint
|
|
29
|
-
dummy_trace_point = TracePoint.new(:line) {}
|
|
29
|
+
dummy_trace_point = TracePoint.new(:line) {} # Dummy
|
|
30
30
|
dummy_trace_point.enable target: position.method, target_line: position.lineno
|
|
31
31
|
dummy_trace_point.disable
|
|
32
32
|
|
|
@@ -53,7 +53,7 @@ module Rookout
|
|
|
53
53
|
end
|
|
54
54
|
|
|
55
55
|
def clear_augs
|
|
56
|
-
@augs.
|
|
56
|
+
@augs.each_value do |aug_id|
|
|
57
57
|
remove_aug aug_id
|
|
58
58
|
end
|
|
59
59
|
|
data/lib/rookout/utils.rb
CHANGED
data/lib/rookout/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
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.37
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Liran Haimovitch
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-
|
|
11
|
+
date: 2022-07-24 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: binding_of_caller
|
|
@@ -86,56 +86,70 @@ dependencies:
|
|
|
86
86
|
requirements:
|
|
87
87
|
- - '='
|
|
88
88
|
- !ruby/object:Gem::Version
|
|
89
|
-
version: 1.
|
|
89
|
+
version: 1.26.1
|
|
90
90
|
type: :development
|
|
91
91
|
prerelease: false
|
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
93
|
requirements:
|
|
94
94
|
- - '='
|
|
95
95
|
- !ruby/object:Gem::Version
|
|
96
|
-
version: 1.
|
|
96
|
+
version: 1.26.1
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: async
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - ">="
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: 1.0.0
|
|
104
|
+
type: :development
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - ">="
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: 1.0.0
|
|
97
111
|
- !ruby/object:Gem::Dependency
|
|
98
112
|
name: minitest
|
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
|
100
114
|
requirements:
|
|
101
115
|
- - ">="
|
|
102
116
|
- !ruby/object:Gem::Version
|
|
103
|
-
version:
|
|
117
|
+
version: 5.16.2
|
|
104
118
|
type: :development
|
|
105
119
|
prerelease: false
|
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
121
|
requirements:
|
|
108
122
|
- - ">="
|
|
109
123
|
- !ruby/object:Gem::Version
|
|
110
|
-
version:
|
|
124
|
+
version: 5.16.2
|
|
111
125
|
- !ruby/object:Gem::Dependency
|
|
112
126
|
name: minitest-autotest
|
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
|
114
128
|
requirements:
|
|
115
129
|
- - ">="
|
|
116
130
|
- !ruby/object:Gem::Version
|
|
117
|
-
version:
|
|
131
|
+
version: 1.1.1
|
|
118
132
|
type: :development
|
|
119
133
|
prerelease: false
|
|
120
134
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
135
|
requirements:
|
|
122
136
|
- - ">="
|
|
123
137
|
- !ruby/object:Gem::Version
|
|
124
|
-
version:
|
|
138
|
+
version: 1.1.1
|
|
125
139
|
- !ruby/object:Gem::Dependency
|
|
126
140
|
name: minitest-focus
|
|
127
141
|
requirement: !ruby/object:Gem::Requirement
|
|
128
142
|
requirements:
|
|
129
143
|
- - ">="
|
|
130
144
|
- !ruby/object:Gem::Version
|
|
131
|
-
version:
|
|
145
|
+
version: 1.3.1
|
|
132
146
|
type: :development
|
|
133
147
|
prerelease: false
|
|
134
148
|
version_requirements: !ruby/object:Gem::Requirement
|
|
135
149
|
requirements:
|
|
136
150
|
- - ">="
|
|
137
151
|
- !ruby/object:Gem::Version
|
|
138
|
-
version:
|
|
152
|
+
version: 1.3.1
|
|
139
153
|
- !ruby/object:Gem::Dependency
|
|
140
154
|
name: minitest-rg
|
|
141
155
|
requirement: !ruby/object:Gem::Requirement
|