rookout 0.1.34 → 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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rookout/augs/actions/action_run_processor.rb +1 -0
  3. data/lib/rookout/augs/aug_factory.rb +2 -2
  4. data/lib/rookout/augs/aug_rate_limiter.rb +2 -2
  5. data/lib/rookout/augs/locations/location_file_line.rb +5 -1
  6. data/lib/rookout/com_ws/agent_com_ws.rb +5 -3
  7. data/lib/rookout/com_ws/envelope_wrapper.rb +12 -10
  8. data/lib/rookout/com_ws/git.rb +1 -1
  9. data/lib/rookout/com_ws/information.rb +45 -1
  10. data/lib/rookout/com_ws/output.rb +13 -7
  11. data/lib/rookout/commit.rb +1 -1
  12. data/lib/rookout/config.rb +37 -19
  13. data/lib/rookout/exceptions.rb +3 -9
  14. data/lib/rookout/interface.rb +9 -8
  15. data/lib/rookout/logger.rb +13 -7
  16. data/lib/rookout/processor/namespace_serializer.rb +1 -1
  17. data/lib/rookout/processor/namespace_serializer2.rb +18 -11
  18. data/lib/rookout/processor/namespaces/container_namespace.rb +1 -0
  19. data/lib/rookout/processor/namespaces/frame_namespace.rb +2 -3
  20. data/lib/rookout/processor/namespaces/namespace.rb +1 -0
  21. data/lib/rookout/processor/namespaces/noop_namespace.rb +0 -4
  22. data/lib/rookout/processor/namespaces/ruby_object_namespace.rb +31 -16
  23. data/lib/rookout/processor/namespaces/ruby_object_serializer.rb +9 -7
  24. data/lib/rookout/processor/namespaces/ruby_utils_namespace.rb +0 -4
  25. data/lib/rookout/processor/namespaces/stack_namespace.rb +1 -0
  26. data/lib/rookout/processor/namespaces/traceback_namespace.rb +4 -1
  27. data/lib/rookout/processor/operations/set_operation.rb +2 -0
  28. data/lib/rookout/processor/paths/arithmetic_path.rb +3 -1
  29. data/lib/rookout/processor/paths/canopy/actions.rb +5 -1
  30. data/lib/rookout/processor/paths/canopy/consts.rb +6 -4
  31. data/lib/rookout/processor/paths/canopy/markers.rb +15 -5
  32. data/lib/rookout/processor/processor_factory.rb +0 -2
  33. data/lib/rookout/processor/rook_error.rb +3 -1
  34. data/lib/rookout/rookout_singleton.rb +4 -3
  35. data/lib/rookout/services/position.rb +3 -2
  36. data/lib/rookout/services/tracer.rb +2 -2
  37. data/lib/rookout/utils.rb +1 -1
  38. data/lib/rookout/version.rb +1 -1
  39. metadata +24 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 27b1869fb9f3a4797e7fec394a45f96ba46e5d2f7724c4557437a7a1939b0772
4
- data.tar.gz: ff6c10ba341cfc127c8dd336bda018f4384a4ea280bceceb9220194b8b2aab68
3
+ metadata.gz: 661b78a375817aaf8b11e7d11baa2a1a55824a4faeb7b07800b2ab77d05fb21a
4
+ data.tar.gz: d2abdb693639eddc830978c88a426f8d660db1ddcc09359d190eac69e2686de2
5
5
  SHA512:
6
- metadata.gz: 34066a3301315db678b63868ec8bbc9bee3b5afdc4e1a75c087b5b4caa4f6e32fe95078013f8a133ee4451cef0ae3054d0e0953a55ef0ee095cb95b6f77ba469
7
- data.tar.gz: 33a601b3b0950025fc6f38bbf62ccfe19125f90d870543bb51a958543d7d5e5a3f53f99a0b9aba1f0fa2905a945fda2defb92bde35a5de8757c26e283a687b3e
6
+ metadata.gz: 4cfd877508902044f7a6a003ed6b9f4e87f24452dac85873f4281b30e17445f085f4cc7d46dea0919a6536755f01b81b67d89ce4a21eb063f97f69a51403053b
7
+ data.tar.gz: 606d7c8765066bd747ab7d3ecf098c39c934f023708d7e6eef7348bded9bb5b5175b101faf548f39838408ff865b383cab876f41c39fae0c0d6c2acd8d33d036
@@ -5,6 +5,7 @@ module Rookout
5
5
  module Actions
6
6
  class ActionRunProcessor < Action
7
7
  def initialize arguments, processor_factory
8
+ super()
8
9
  @processor = processor_factory.create_processor arguments["operations"]
9
10
 
10
11
  post_operations = arguments["post_operations"]
@@ -52,9 +52,9 @@ module Rookout
52
52
 
53
53
  case name
54
54
  when "file_line"
55
- return Locations::LocationFileLine.new configuration, @output, aug
55
+ Locations::LocationFileLine.new configuration, @output, aug
56
56
  when "exception_handler"
57
- return Locations::LocationExceptionHandler.new configuration, @output, aug
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, :lineno, :file_hash, :line_crc, :line_unique
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
@@ -68,6 +68,7 @@ module Rookout
68
68
  end
69
69
 
70
70
  @pending_messages.push envelope_wrapper
71
+ @pending_messages_length += msg_size
71
72
  end
72
73
 
73
74
  def queue_full?
@@ -117,7 +118,7 @@ module Rookout
117
118
 
118
119
  if @print_on_initial_connection
119
120
  @print_on_initial_connection = false
120
- STDERR.puts "[Rookout] Successfully connected to controller"
121
+ $stderr.puts "[Rookout] Successfully connected to controller"
121
122
  end
122
123
  Logger.instance.debug "WebSocket connected successfully"
123
124
  Logger.instance.info "Finished initialization"
@@ -204,9 +205,10 @@ module Rookout
204
205
  msg = envelope_wrapper.envelope
205
206
  @pending_messages_length -= envelope_wrapper.calculate_size
206
207
 
207
- if msg.is_a? ExitMessage
208
+ case msg
209
+ when ExitMessage
208
210
  break if msg.thread == Thread.current
209
- elsif msg.is_a? FlushMessage
211
+ when FlushMessage
210
212
  msg.event.set
211
213
  else
212
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
- serialized = Com::Rookout::Envelope.encode envelope
12
- serialized
11
+ Com::Rookout::Envelope.encode envelope
13
12
  end
14
13
 
15
14
  def envelope
@@ -23,27 +22,30 @@ 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
- aug_id: aug_id,
28
- report_id: report_id
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
- end
32
-
33
- def envelope
34
- return @envelope unless @envelope.nil?
31
+ @aug_report_message.arguments2 = @serializer.dump arguments, true
35
32
  @serializer.string_cache.each { |key, value| @aug_report_message.strings_cache[key] = value }
36
33
  @envelope = wrap_in_envelope @aug_report_message
37
34
  @aug_report_message = nil
38
35
  end
39
36
 
37
+ def envelope
38
+ @envelope
39
+ end
40
+
40
41
  def calculate_size
41
- @envelope.length + @serializer.estimated_pending_bytes
42
+ @envelope.length
42
43
  end
43
44
  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
 
@@ -42,7 +42,7 @@ module Rookout
42
42
  link_contents = File.read link_path
43
43
 
44
44
  if link_contents.start_with? "ref:"
45
- next_link = (link_contents.split " ")[1].strip
45
+ next_link = link_contents.split[1].strip
46
46
  follow_sym_links root, next_link
47
47
  else
48
48
  link_contents.strip
@@ -21,6 +21,8 @@ module Rookout
21
21
  @labels["k8s_namespace"] = k8_namespace
22
22
  end
23
23
 
24
+ collect_serverless_labels
25
+
24
26
  @ip_addr = local_ip
25
27
 
26
28
  @scm_info = create_scm_information
@@ -54,7 +56,8 @@ module Rookout
54
56
  scm: @scm_info
55
57
  end
56
58
 
57
- attr_accessor :agent_id, :labels
59
+ attr_accessor :agent_id
60
+ attr_accessor :labels
58
61
 
59
62
  private
60
63
 
@@ -97,6 +100,47 @@ module Rookout
97
100
 
98
101
  Com::Rookout::SCMInformation.new origin: user_git_origin, commit: user_git_commit
99
102
  end
103
+
104
+ def aws_lambda?
105
+ !ENV["AWS_LAMBDA_FUNCTION_NAME"].nil?
106
+ end
107
+
108
+ def google_cloud_function?
109
+ !ENV["FUNCTION_TARGET"].nil? && !ENV["FUNCTION_SIGNATURE_TYPE"].nil?
110
+ end
111
+
112
+ def cloud_run_or_fire_base?
113
+ !ENV["K_SERVICE"].nil? &&
114
+ !ENV["K_REVISION"].nil? &&
115
+ !ENV["K_CONFIGURATION"].nil? &&
116
+ !ENV["PORT"].nil?
117
+ end
118
+
119
+ def azure_function?
120
+ !ENV["FUNCTIONS_WORKER_RUNTIME"].nil? && !ENV["WEBSITE_SITE_NAME"].nil?
121
+ end
122
+
123
+ def collect_serverless_labels
124
+ if aws_lambda?
125
+ @labels["function_name"] = ENV["AWS_LAMBDA_FUNCTION_NAME"]
126
+ @labels["aws_region"] = ENV["AWS_REGION"]
127
+
128
+ elsif google_cloud_function? || cloud_run_or_fire_base?
129
+ function_name = ENV["FUNCTION_NAME"]
130
+ if function_name.nil?
131
+ function_name = ENV["K_SERVICE"]
132
+ end
133
+ @labels["function_name"] = function_name
134
+
135
+ elsif azure_function?
136
+ @labels["function_name"] = ENV["WEBSITE_SITE_NAME"]
137
+ @labels["azure_region"] = ENV["REGION_NAME"]
138
+ end
139
+
140
+ return unless @labels.key? "function_name"
141
+
142
+ @labels["rookout_serverless"] = "true"
143
+ end
100
144
  end
101
145
  end
102
146
  end
@@ -42,7 +42,8 @@ module Rookout
42
42
  @closing = false
43
43
  end
44
44
 
45
- attr_accessor :agent_id, :agent_com
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(Com::Rookout::AugReportMessage.new(agent_id: @agent_id,
93
- aug_id: aug_id,
94
- report_id: report_id,
95
- arguments: protobuf_arguments))
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
 
@@ -1,3 +1,3 @@
1
1
  module Rookout
2
- COMMIT = "d0e0c4f1b1b08542dfe7a380f52640ea68f223a6".freeze
2
+ COMMIT = "e56488a23c33cbe4ad104217694c08c994586597".freeze
3
3
  end
@@ -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, :logger_log_to_stderr, :logger_log_level
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
- :agent_com_max_message_limit,
18
- :agent_com_max_queue_messages_length,
19
- :agent_com_timeout,
20
- :agent_com_ping_interval,
21
- :agent_com_ping_timeout,
22
- :agent_com_flush_timeout,
23
- :agent_com_max_queued_messages
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, :backoff_reset_time, :backoff_max_time
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
- :output_max_aug_messages,
39
- :output_max_log_items,
40
- :output_bucket_refresh_rate
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, :user_git_origin
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, :rookout_commit
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["PROTOBUF_VERSION_2"]
83
+ is_env_proto2 = ENV["ROOKOUT_Protobuf_Version2"]
68
84
  if is_env_proto2.nil?
69
- @protobuf_version2 = true if @true_values.includes? is_config_proto2
70
- elsif @true_values.includes? is_env_proto2
85
+ @protobuf_version2 = true if @true_values.include? is_config_proto2
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
@@ -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
- "Change the depth of collection or change the default by setting ROOKOUT_MAX_MESSAGE_SIZE " \
96
- "as environment variable or system property",
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
- "For more information: https://docs.rookout.com/docs/breakpoints-tasks.html#rate-limiting"
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
@@ -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: " + Config.rookout_version
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
- STDERR.puts "[Rookout] Failed to load Rookout. Please make sure to force build native extensions by setting" \
40
- "'bundle config force_ruby_platform true'"
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
- STDERR.puts "[Rookout] Failed to start Rookout: #{e.message}"
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] " + e.message
46
+ Logger.instance.warning "[Rookout] #{e.message}"
47
47
  rescue Exception => e
48
- STDERR.puts e.full_message if Config.debug
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
- STDERR.puts RookBadProtobuf.new.message if protobuf.nil?
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
- STDERR.puts error.message
91
+ $stderr.puts error.message
91
92
  end
92
93
 
93
94
  def configure_globals options
@@ -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" + argument.message + "\n" + argument.backtrace.join("\n\t")
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, :time, :filename, :lineno, :message, :formatted_message, :arguments
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
- STDERR.puts "[Rookout] Failed to open log file: #{log_file_path}"
141
- STDERR.puts e.backtrace
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 + "\n" if file }
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 ENV["HOME"], Config.logger_filename
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) { STDERR.puts record.format }
167
+ ->(record) { $stderr.puts record.format }
162
168
  end
163
169
 
164
170
  def new_remote_handler
@@ -7,7 +7,7 @@ module Rookout
7
7
 
8
8
  module_function
9
9
 
10
- def dump namespace, log_errors = true
10
+ def dump namespace, log_errors
11
11
  namespace.dump log_errors
12
12
  rescue StandardError => e
13
13
  message = "Failed to serialize namespace"
@@ -14,7 +14,8 @@ module Rookout
14
14
  @estimated_pending_bytes = 0
15
15
  end
16
16
 
17
- attr_reader :string_cache, :estimated_pending_bytes
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 = true
39
- if namespace.is_a? Namespaces::RubyObjectNamespace
39
+ def dump namespace, log_errors
40
+ case namespace
41
+ when Namespaces::RubyObjectNamespace
40
42
  dump_ruby_object_namespace namespace, log_errors
41
- elsif namespace.is_a? Namespaces::ContainerNamespace
43
+ when Namespaces::ContainerNamespace
42
44
  dump_container_namespace namespace, log_errors
43
- elsif namespace.is_a? Namespaces::TracebackNamespace
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
- if obj == true
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
- elsif obj == false
133
+ when false
127
134
  dump_variant_type variant, Com::Rookout::Variant::Type::VARIANT_LONG
128
135
  variant.long_value = 0
129
- elsif obj.is_a? Integer
136
+ when Integer
130
137
  dump_integer obj, variant
131
- elsif obj.is_a? Float
138
+ when Float
132
139
  dump_variant_type variant, Com::Rookout::Variant::Type::VARIANT_DOUBLE
133
140
  variant.double_value = obj.to_f
134
- elsif obj.is_a? BigDecimal
141
+ when BigDecimal
135
142
  dump_string obj.to_s, variant, config # TODO: NS: This might cut the decimal value, is that ok?
136
- elsif obj.is_a? Complex
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
@@ -11,6 +11,7 @@ module Rookout
11
11
 
12
12
  class ContainerNamespace < Namespace
13
13
  def initialize hash = {}
14
+ super()
14
15
  @hash = hash
15
16
  end
16
17
 
@@ -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"
@@ -3,6 +3,7 @@ module Rookout
3
3
  module Namespaces
4
4
  class Namespace
5
5
  require_relative "../../exceptions"
6
+
6
7
  def call_method name, _args
7
8
  raise Exceptions::RookMethodNotFound.new(self.class.to_s, name)
8
9
  end
@@ -7,10 +7,6 @@ module Rookout
7
7
  require_relative "../../protobuf/variant_pb"
8
8
 
9
9
  class NoopNamespace < Namespace
10
- def initialize
11
- super
12
- end
13
-
14
10
  def call_method _name, _args
15
11
  Rookout::Processor::Namespaces::RubyObjectNamespace.new nil
16
12
  end
@@ -17,7 +17,10 @@ module Rookout
17
17
  @max_string = max_string
18
18
  end
19
19
 
20
- attr_reader :max_depth, :max_width, :max_collection_depth, :max_string
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 = OBJECT_DUMP_CONFIG_DEFAULT
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, :dump_config
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
- if @obj.is_a?(Array) || @obj.is_a?(String)
66
- key_int = key.to_i
67
- return RubyObjectNamespace.new @obj[key_int] if key_int >= 0 && key_int < @obj.length
68
- raise Exceptions::RookKeyNotFound, key
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
- if obj == true
87
+ case obj
88
+ when true
87
89
  variant.variant_type = :VARIANT_INT
88
90
  variant.int_value = 1
89
- elsif obj == false
91
+ when false
90
92
  variant.variant_type = :VARIANT_INT
91
93
  variant.int_value = 0
92
- elsif obj.is_a? Integer
94
+ when Integer
93
95
  dump_integer obj, variant
94
- elsif obj.is_a? Float
96
+ when Float
95
97
  variant.variant_type = :VARIANT_DOUBLE
96
98
  variant.double_value = obj.to_f
97
- elsif obj.is_a? BigDecimal
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
- elsif obj.is_a? Complex
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
@@ -9,10 +9,6 @@ module Rookout
9
9
  require_relative "ruby_object_namespace"
10
10
 
11
11
  class RubyUtilsNamespace < Namespace
12
- def initialize
13
- super
14
- end
15
-
16
12
  def call_method name, args
17
13
  case name
18
14
  when "exception"
@@ -7,6 +7,7 @@ module Rookout
7
7
 
8
8
  class StackNamespace < Namespace
9
9
  def initialize backtrace, offset = 0
10
+ super()
10
11
  @backtrace = backtrace
11
12
  @offset = offset
12
13
  end
@@ -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, :offset, :depth
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]
@@ -11,6 +11,8 @@ module Rookout
11
11
 
12
12
  class SetOperation < Operation
13
13
  def initialize configuration, factory
14
+ super()
15
+
14
16
  @paths = []
15
17
 
16
18
  configuration["paths"].each do |key, value|
@@ -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..-1]
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
- if key.is_a? ObjectMarker
53
+ case key
54
+ when ObjectMarker
54
55
  return true if key.obj == a
55
- elsif key == a
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
- if value.is_a? ObjectMarker
66
+ case value
67
+ when ObjectMarker
66
68
  return true if value.obj == a
67
- elsif value == a
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
- class Marker; end
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, :obj
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
- unless first_obj.nil?
164
- raise Exceptions::RookNonPrimitiveObjectType, first_obj.class.to_s unless
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?
@@ -5,8 +5,6 @@ module Rookout
5
5
  require_relative "paths/arithmetic_path"
6
6
 
7
7
  class ProcessorFactory
8
- def initialize; end
9
-
10
8
  def create_operation configuration
11
9
  Operations::SetOperation.new configuration, self
12
10
  end
@@ -24,7 +24,9 @@ module Rookout
24
24
  end
25
25
  end
26
26
 
27
- attr_reader :message, :exception, :parameters
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
@@ -40,7 +40,7 @@ module Rookout
40
40
  @services_started = false
41
41
  end
42
42
 
43
- def connect token: nil, host: nil, port: nil, proxy: nil, labels: [], async_start: false, fork: false,
43
+ def connect token: nil, host: nil, port: nil, proxy: nil, labels: {}, async_start: false, fork: false,
44
44
  throw_errors: false
45
45
  raise Exceptions::RookInterfaceException, "Multiple connection attempts not supported!" unless @agent_com.nil?
46
46
 
@@ -82,9 +82,10 @@ module Rookout
82
82
  private
83
83
 
84
84
  def check_version_supported
85
- raise Exceptions:: RookVersionNotSupported.new("platform", RUBY_ENGINE) unless RUBY_ENGINE == "ruby"
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, :method
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.values.each do |aug_id|
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.values.each do |aug_id|
56
+ @augs.each_value do |aug_id|
57
57
  remove_aug aug_id
58
58
  end
59
59
 
data/lib/rookout/utils.rb CHANGED
@@ -15,6 +15,6 @@ module Utils
15
15
  def time_to_nanoseconds time_obj
16
16
  secs = time_obj.to_i
17
17
  nsecs = time_obj.nsec
18
- (10**9) * secs + nsecs
18
+ ((10**9) * secs) + nsecs
19
19
  end
20
20
  end
@@ -1,3 +1,3 @@
1
1
  module Rookout
2
- VERSION = "0.1.34".freeze
2
+ VERSION = "0.1.37".freeze
3
3
  end
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.34
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-05-15 00:00:00.000000000 Z
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.24.0
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.24.0
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: '5.14'
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: '5.14'
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: '1.0'
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: '1.0'
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: '1.1'
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: '1.1'
152
+ version: 1.3.1
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: minitest-rg
141
155
  requirement: !ruby/object:Gem::Requirement