exception_handling 3.0.1 → 3.1.0.pre.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a29a9092ff7f9301ec3b6bbf825a7d25bc5279fbec1a984c13e90afa95b9200b
4
- data.tar.gz: 69b933ecd257feddbfe6f4a74deb8548d263eab94f9e768aa0a93a939d493dee
3
+ metadata.gz: 31594865f3096183f28bd10c1310bbca3df0170b97b09f51dd1231f02736e50f
4
+ data.tar.gz: 0b638eff8f75896da524b9c1ced003e72e95b5576c0dcba7db0e1e2c8f80b5e8
5
5
  SHA512:
6
- metadata.gz: c966ab01531b3a51698a0247b8f80e703d7b77416b818b112f47024645b61f140f2c0abad685bb5188811f6a8f1862b3db8c8d1cf2bf5d568ee698b7c171b117
7
- data.tar.gz: 042cc68f1c5ee3bba682cc9362f096f7979520e2ba60763a7628de2d9ff9fcbbc38bde0b73b6450bd949bb945b57844e352e306ffc7d425cee45e10282b85f20
6
+ metadata.gz: 5300573e63bd5d9039676ab35b4299812d0a870f60eb63b6039546df8eecdc92d30931537e96a4105295968b87183746d46abeaaa67cdd47d94bd347d8b7631b
7
+ data.tar.gz: 444bde3024de65b88ea660392c22dd624298c362e96a2af8ad4a94fd3f6513d7ed6f32709cdc9244cd8532410529cd0b923f9cb4086e7faf2e2c11a571116bf0
data/CHANGELOG.md CHANGED
@@ -4,9 +4,13 @@ Inspired by [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
4
4
 
5
5
  **Note:** this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
- ## [3.0.1] - 2024-03-07
7
+ ## [3.1.0] - Unreleased
8
+ ### Added
9
+ - Add interface for tagging exceptions sent to honeybadger with values from the log context.
10
+ - `ExceptionHandling.add_honeybadger_tag_from_log_context`
11
+
8
12
  ### Changed
9
- - Allow newer versions of the `psych` gem to be used to avoid conflicts with the default version pulled in by ruby 3.2+
13
+ - Require ruby version 2.7 or greater
10
14
 
11
15
  ## [3.0.0] - 2024-03-01
12
16
  ### Added
data/Gemfile CHANGED
@@ -6,6 +6,7 @@ gemspec
6
6
 
7
7
  gem 'activesupport'
8
8
  gem 'appraisal', '~> 2.2'
9
+ gem 'gem-release'
9
10
  gem 'honeybadger', '~> 4.11'
10
11
  gem 'pry'
11
12
  gem 'pry-byebug'
data/Gemfile.lock CHANGED
@@ -1,12 +1,12 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- exception_handling (3.0.1)
4
+ exception_handling (3.1.0.pre.2)
5
5
  activesupport (>= 5.2)
6
6
  contextual_logger (~> 1.0)
7
7
  escalate (~> 0.3)
8
8
  invoca-utils (~> 0.3)
9
- psych (>= 3.2)
9
+ psych (~> 3.0)
10
10
 
11
11
  GEM
12
12
  remote: https://rubygems.org/
@@ -17,7 +17,7 @@ GEM
17
17
  minitest (~> 5.1)
18
18
  tzinfo (~> 1.1)
19
19
  zeitwerk (~> 2.2, >= 2.2.2)
20
- appraisal (2.2.0)
20
+ appraisal (2.5.0)
21
21
  bundler
22
22
  rake
23
23
  thor (>= 0.14.0)
@@ -30,17 +30,17 @@ GEM
30
30
  json
31
31
  diff-lcs (1.5.0)
32
32
  escalate (0.3.0)
33
+ gem-release (2.2.2)
33
34
  honeybadger (4.11.0)
34
35
  i18n (1.10.0)
35
36
  concurrent-ruby (~> 1.0)
36
37
  invoca-utils (0.5.1)
37
38
  activesupport (>= 5.0)
38
- jaro_winkler (1.5.3)
39
39
  json (2.7.1)
40
40
  method_source (1.0.0)
41
41
  minitest (5.15.0)
42
42
  parallel (1.17.0)
43
- parser (2.6.3.0)
43
+ parser (2.7.1.3)
44
44
  ast (~> 2.4.0)
45
45
  power_assert (1.2.0)
46
46
  pry (0.14.2)
@@ -49,15 +49,16 @@ GEM
49
49
  pry-byebug (3.8.0)
50
50
  byebug (~> 11.0)
51
51
  pry (~> 0.10)
52
- psych (5.1.2)
53
- stringio
52
+ psych (3.3.4)
54
53
  rainbow (3.0.0)
55
54
  rake (13.0.1)
55
+ regexp_parser (2.9.0)
56
+ rexml (3.2.6)
56
57
  rspec (3.9.0)
57
58
  rspec-core (~> 3.9.0)
58
59
  rspec-expectations (~> 3.9.0)
59
60
  rspec-mocks (~> 3.9.0)
60
- rspec-core (3.9.2)
61
+ rspec-core (3.9.3)
61
62
  rspec-support (~> 3.9.3)
62
63
  rspec-expectations (3.9.2)
63
64
  diff-lcs (>= 1.2.0, < 2.0)
@@ -66,18 +67,21 @@ GEM
66
67
  diff-lcs (>= 1.2.0, < 2.0)
67
68
  rspec-support (~> 3.9.0)
68
69
  rspec-support (3.9.4)
69
- rspec_junit_formatter (0.4.1)
70
+ rspec_junit_formatter (0.6.0)
70
71
  rspec-core (>= 2, < 4, != 2.12.0)
71
- rubocop (0.74.0)
72
- jaro_winkler (~> 1.5.1)
72
+ rubocop (0.89.0)
73
73
  parallel (~> 1.10)
74
- parser (>= 2.6)
74
+ parser (>= 2.7.1.1)
75
75
  rainbow (>= 2.2.2, < 4.0)
76
+ regexp_parser (>= 1.7)
77
+ rexml
78
+ rubocop-ast (>= 0.1.0, < 1.0)
76
79
  ruby-progressbar (~> 1.7)
77
- unicode-display_width (>= 1.4.0, < 1.7)
78
- ruby-progressbar (1.10.1)
79
- stringio (3.1.0)
80
- test-unit (3.3.6)
80
+ unicode-display_width (>= 1.4.0, < 2.0)
81
+ rubocop-ast (0.2.0)
82
+ parser (>= 2.7.0.1)
83
+ ruby-progressbar (1.13.0)
84
+ test-unit (3.6.1)
81
85
  power_assert
82
86
  thor (1.0.1)
83
87
  thread_safe (0.3.6)
@@ -93,6 +97,7 @@ DEPENDENCIES
93
97
  activesupport
94
98
  appraisal (~> 2.2)
95
99
  exception_handling!
100
+ gem-release
96
101
  honeybadger (~> 4.11)
97
102
  pry
98
103
  pry-byebug
data/README.md CHANGED
@@ -36,6 +36,7 @@ ExceptionHandling.logger = Rails.logger
36
36
  ExceptionHandling.filter_list_filename = "#{Rails.root}/config/exception_filters.yml"
37
37
  ExceptionHandling.environment = Rails.env
38
38
  ExceptionHandling.honeybadger_auto_tagger = ->(exception) { [] } # See "Automatically Tagging Exceptions" section below for examples
39
+ ExceptionHandling.add_honeybadger_tag_from_log_context("tag-name", path: ["path", "in", "log", "context"])
39
40
  ```
40
41
 
41
42
  ## Usage
@@ -72,7 +73,7 @@ log_error(ex, "A specific error occurred.", honeybadger_tags: ["critical", "sequ
72
73
 
73
74
  **Note**: Manual tags will be merged with any automatic tags.
74
75
 
75
- #### Automatically Tagging Exceptions (`honeybadger_auto_tagger=`)
76
+ #### Automatically Tagging Exceptions via Proc (`honeybadger_auto_tagger=`)
76
77
 
77
78
  Configure exception handling so that you can automatically apply multiple tags to exceptions sent to honeybadger.
78
79
 
@@ -90,6 +91,34 @@ Example to disable auto-tagging:
90
91
  ExceptionHandling.honeybadger_auto_tagger = nil
91
92
  ```
92
93
 
94
+ #### Automatically Tagging Exceptions from Log Context (`add_honeybadger_tag_from_log_context`)
95
+
96
+ Add a tag to exceptions sent to honeybadger based on a value in the log context.
97
+
98
+ To configure this, use the `add_honeybadger_tag_from_log_context` method.
99
+ ```ruby
100
+ ExceptionHandling.add_honeybadger_tag_from_log_context("kubernetes_context", path: ["kubernetes", "context"])
101
+ ```
102
+
103
+ This will add a tag to the exception if the log context contains a value at the specified path: "kubernetes" => { "context" => "value" }.
104
+
105
+ For example:
106
+ ```ruby
107
+ ExceptionHandling.logger.with_context("kubernetes" => { "context" => "local" }) do
108
+ log_error(ex, "A specific error occurred.")
109
+ end
110
+ ```
111
+
112
+ This will add the following tag to the exception sent to honeybadger:
113
+ ```
114
+ kubernetes_context:local
115
+ ```
116
+
117
+ To clear all automated tagging from the log context, use the `clear_honeybadger_tags_from_log_context` method.
118
+ ```ruby
119
+ ExceptionHandling.clear_honeybadger_tags_from_log_context
120
+ ```
121
+
93
122
  ## Custom Hooks
94
123
 
95
124
  ### custom_data_hook
@@ -19,10 +19,11 @@ Gem::Specification.new do |spec|
19
19
  "source_code_uri" => "https://github.com/Invoca/exception_handling",
20
20
  "allowed_push_host" => "https://rubygems.org"
21
21
  }
22
+ spec.required_ruby_version = '>= 2.7'
22
23
 
23
24
  spec.add_dependency 'activesupport', '>= 5.2'
24
25
  spec.add_dependency 'contextual_logger', '~> 1.0'
25
26
  spec.add_dependency 'escalate', '~> 0.3'
26
27
  spec.add_dependency 'invoca-utils', '~> 0.3'
27
- spec.add_dependency 'psych', '>= 3.2'
28
+ spec.add_dependency 'psych', '~> 3.0'
28
29
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ExceptionHandling
4
- VERSION = '3.0.1'
4
+ VERSION = '3.1.0.pre.2'
5
5
  end
@@ -28,6 +28,8 @@ module ExceptionHandling # never included
28
28
  AUTHENTICATION_HEADERS = ['HTTP_AUTHORIZATION', 'X-HTTP_AUTHORIZATION', 'X_HTTP_AUTHORIZATION', 'REDIRECT_X_HTTP_AUTHORIZATION'].freeze
29
29
  HONEYBADGER_STATUSES = [:success, :failure, :skipped].freeze
30
30
 
31
+ @honeybadger_log_context_tags = {}
32
+
31
33
  class << self
32
34
 
33
35
  #
@@ -78,6 +80,7 @@ module ExceptionHandling # never included
78
80
 
79
81
  attr_reader :filter_list_filename
80
82
  attr_reader :honeybadger_auto_tagger
83
+ attr_reader :honeybadger_log_context_tags
81
84
 
82
85
  @filter_list_filename = "./config/exception_filters.yml"
83
86
 
@@ -98,6 +101,21 @@ module ExceptionHandling # never included
98
101
  end
99
102
  # rubocop:enable Style/TrivialAccessors
100
103
 
104
+ # @param tag_name [String]
105
+ # @param path [Array<String>]
106
+ def add_honeybadger_tag_from_log_context(tag_name, path:)
107
+ tag_name.is_a?(String) or raise ArgumentError, "tag_name must be a String, #{tag_name.inspect}"
108
+ (path.is_a?(Array) && path.all? { _1.is_a?(String) }) or raise ArgumentError, "path must be an Array<String>, #{path.inspect}"
109
+ if @honeybadger_log_context_tags.key?(tag_name)
110
+ log_warning("Overwriting existing tag path for #{tag_name.inspect} from #{@honeybadger_log_context_tags[tag_name]} to #{path}")
111
+ end
112
+ @honeybadger_log_context_tags[tag_name] = path
113
+ end
114
+
115
+ def clear_honeybadger_tags_from_log_context
116
+ @honeybadger_log_context_tags = {}
117
+ end
118
+
101
119
  #
102
120
  # internal settings (don't set directly)
103
121
  #
@@ -217,7 +235,7 @@ module ExceptionHandling # never included
217
235
 
218
236
  # Note: Both commas and spaces are treated as delimiters for the :tags string. Space-delimiters are not officially documented.
219
237
  # https://github.com/honeybadger-io/honeybadger-ruby/pull/422
220
- tags = (honeybadger_auto_tags(exception) + exception_info.honeybadger_tags).join(' ')
238
+ tags = tags_for_honeybadger(exception_info).join(' ')
221
239
  response = Honeybadger.notify(error_class: exception_description ? exception_description.filter_name : exception.class.name,
222
240
  error_message: exception.message.to_s,
223
241
  exception: exception,
@@ -231,18 +249,6 @@ module ExceptionHandling # never included
231
249
  :failure
232
250
  end
233
251
 
234
- # @param exception [Exception]
235
- #
236
- # @return [Array<String>]
237
- def honeybadger_auto_tags(exception)
238
- @honeybadger_auto_tagger&.call(exception) || []
239
- rescue => ex
240
- traces = ex.backtrace.join("\n")
241
- message = "Unable to execute honeybadger_auto_tags callback. #{ExceptionHandling.encode_utf8(ex.message.to_s)} #{traces}\n"
242
- ExceptionHandling.log_info(message)
243
- []
244
- end
245
-
246
252
  #
247
253
  # Check if Honeybadger defined.
248
254
  #
@@ -346,6 +352,41 @@ module ExceptionHandling # never included
346
352
 
347
353
  private
348
354
 
355
+ # @param exception_info [ExceptionInfo]
356
+ #
357
+ # @return [Array<String>]
358
+ def tags_for_honeybadger(exception_info)
359
+ (
360
+ honeybadger_auto_tags(exception_info.exception) +
361
+ exception_info.honeybadger_tags +
362
+ honeybadger_tags_from_log_context(exception_info.honeybadger_context_data)
363
+ ).uniq
364
+ end
365
+
366
+ # @param exception [Exception]
367
+ #
368
+ # @return [Array<String>]
369
+ def honeybadger_auto_tags(exception)
370
+ @honeybadger_auto_tagger&.call(exception) || []
371
+ rescue => ex
372
+ traces = ex.backtrace.join("\n")
373
+ message = "Unable to execute honeybadger_auto_tags callback. #{ExceptionHandling.encode_utf8(ex.message.to_s)} #{traces}\n"
374
+ ExceptionHandling.log_info(message)
375
+ []
376
+ end
377
+
378
+ def honeybadger_tags_from_log_context(honeybadger_context_data)
379
+ if @honeybadger_log_context_tags
380
+ @honeybadger_log_context_tags.map do |tag_name, tag_path|
381
+ if (value_from_log_context = honeybadger_context_data.dig(:log_context, *tag_path))
382
+ "#{tag_name}:#{value_from_log_context}"
383
+ end
384
+ end.compact
385
+ else
386
+ []
387
+ end
388
+ end
389
+
349
390
  def execute_custom_log_error_callback(exception_data, exception, treat_like_warning, external_notification_results)
350
391
  if ExceptionHandling.post_log_error_hook
351
392
  honeybadger_status = external_notification_results[:honeybadger_status] || :skipped
data/spec/spec_helper.rb CHANGED
@@ -5,6 +5,7 @@ require 'rspec/mocks'
5
5
  require 'rspec_junit_formatter'
6
6
 
7
7
  require 'pry'
8
+ require 'pry-byebug'
8
9
  require 'honeybadger'
9
10
  require 'contextual_logger'
10
11
 
@@ -22,20 +23,28 @@ class LoggerStub
22
23
  clear
23
24
  end
24
25
 
25
- def debug(message, log_context = {})
26
- logged << { message: message, context: log_context, severity: 'DEBUG' }
26
+ def debug(message, **log_context)
27
+ super.tap do
28
+ logged << { message: message, context: log_context, severity: 'DEBUG' }
29
+ end
27
30
  end
28
31
 
29
- def info(message, log_context = {})
30
- logged << { message: message, context: log_context, severity: 'INFO' }
32
+ def info(message, **log_context)
33
+ super.tap do
34
+ logged << { message: message, context: log_context, severity: 'INFO' }
35
+ end
31
36
  end
32
37
 
33
- def warn(message, log_context = {})
34
- logged << { message: message, context: log_context, severity: 'WARN' }
38
+ def warn(message, **log_context)
39
+ super.tap do
40
+ logged << { message: message, context: log_context, severity: 'WARN' }
41
+ end
35
42
  end
36
43
 
37
- def fatal(message, log_context = {})
38
- logged << { message: message, context: log_context, severity: 'FATAL' }
44
+ def fatal(message, **log_context)
45
+ super.tap do
46
+ logged << { message: message, context: log_context, severity: 'FATAL' }
47
+ end
39
48
  end
40
49
 
41
50
  def clear
@@ -107,9 +107,10 @@ describe ExceptionHandling do
107
107
  class SmtpClientErrbackStub < SmtpClientStub
108
108
  end
109
109
 
110
- before(:each) do
110
+ before do
111
111
  # Reset this for every test since they are applied to the class
112
112
  ExceptionHandling.honeybadger_auto_tagger = nil
113
+ ExceptionHandling.clear_honeybadger_tags_from_log_context
113
114
  end
114
115
 
115
116
  context "with warn and honeybadger notify stubbed" do
@@ -1029,6 +1030,117 @@ describe ExceptionHandling do
1029
1030
  ExceptionHandling.log_error(exception, nil, honeybadger_tags: ["some-other-tag"])
1030
1031
  end
1031
1032
  end
1033
+
1034
+ describe "#add_honeybadger_tag_from_log_context" do
1035
+ subject(:add_hb_tag) { ExceptionHandling.add_honeybadger_tag_from_log_context(tag_name, path: path) }
1036
+ let(:tag_name) { "sample-tag" }
1037
+ let(:path) { ["sample", "path"] }
1038
+
1039
+ it "sets the honeybadger log context tags to the tag name and path" do
1040
+ add_hb_tag
1041
+ expect(ExceptionHandling.honeybadger_log_context_tags).to include("sample-tag" => ["sample", "path"])
1042
+ end
1043
+
1044
+ context "when path is not an array" do
1045
+ let(:path) { "not an array" }
1046
+
1047
+ it "raises an argument error" do
1048
+ expect { add_hb_tag }.to raise_error(ArgumentError, /path must be an Array/)
1049
+ end
1050
+ end
1051
+
1052
+ context "when path doesn't contain only strings" do
1053
+ let(:path) { [:sample, :path] }
1054
+
1055
+ it "raises an argument error" do
1056
+ expect { add_hb_tag }.to raise_error(ArgumentError, /path must be an Array<String>/)
1057
+ end
1058
+ end
1059
+
1060
+ context "when tag_name is not a string" do
1061
+ let(:tag_name) { 1 }
1062
+
1063
+ it "raises an argument error" do
1064
+ expect { add_hb_tag }.to raise_error(ArgumentError, /tag_name must be a String/)
1065
+ end
1066
+ end
1067
+
1068
+ context "when there already exists a tag with the same name" do
1069
+ before do
1070
+ ExceptionHandling.add_honeybadger_tag_from_log_context(tag_name, path: ["other", "path"])
1071
+ end
1072
+
1073
+ it "overwrites the existing tag to the new one" do
1074
+ add_hb_tag
1075
+ expect(ExceptionHandling.honeybadger_log_context_tags).to include("sample-tag" => ["sample", "path"])
1076
+ end
1077
+
1078
+ it "logs a warning" do
1079
+ expect(ExceptionHandling.logger).to receive(:warn).with(/Overwriting existing tag path for "sample-tag"/, **{})
1080
+ add_hb_tag
1081
+ end
1082
+ end
1083
+ end
1084
+
1085
+ describe "honey badger tags" do
1086
+ context "with log context tags" do
1087
+ before do
1088
+ ExceptionHandling.add_honeybadger_tag_from_log_context("kubernetes_context", path: ["kubernetes", "context"])
1089
+ end
1090
+
1091
+ context "when error is logged within a log context that matches the path" do
1092
+ it "notifies honeybadger with the tags from the log context" do
1093
+ ExceptionHandling.logger.with_context("kubernetes" => { "context" => "local" }) do
1094
+ expect(Honeybadger).to receive(:notify).with(hash_including({ tags: "kubernetes_context:local" }))
1095
+ ExceptionHandling.log_error(StandardError.new("Error"), nil)
1096
+ end
1097
+ end
1098
+ end
1099
+
1100
+ context "when error is logged within a log context that doesn't match the path" do
1101
+ it "does not specify any tags in the honeybadger notify" do
1102
+ ExceptionHandling.logger.with_context("kubernetes" => { "pod" => "frontend-abc" }) do
1103
+ expect(Honeybadger).to receive(:notify).with(hash_including({ tags: "" }))
1104
+ ExceptionHandling.log_error(StandardError.new("Error"), nil)
1105
+ end
1106
+ end
1107
+ end
1108
+
1109
+ context "when error is logged outside of a log context block" do
1110
+ it "does not specify any tags in the honeybadger notify" do
1111
+ expect(Honeybadger).to receive(:notify).with(hash_including({ tags: "" }))
1112
+ ExceptionHandling.log_error(StandardError.new("Error"), nil)
1113
+ end
1114
+ end
1115
+ end
1116
+
1117
+ context "with all different honeybadger tagging" do
1118
+ subject(:log_error) { ExceptionHandling.log_error(StandardError.new("Error"), nil, honeybadger_tags: inline_tags) }
1119
+ let(:inline_tags) { ["inline-tag"] }
1120
+ before do
1121
+ ExceptionHandling.honeybadger_auto_tagger = ->(_exception) { ["auto-tag"] }
1122
+ ExceptionHandling.add_honeybadger_tag_from_log_context("log-context", path: ["inside", "context"])
1123
+ end
1124
+
1125
+ it "combines all the tags from different sources" do
1126
+ expect(Honeybadger).to receive(:notify).with(hash_including({ tags: "auto-tag inline-tag log-context:tag" }))
1127
+ ExceptionHandling.logger.with_context("inside" => { "context" => "tag" }) do
1128
+ log_error
1129
+ end
1130
+ end
1131
+
1132
+ context "when there are duplicate tags" do
1133
+ let(:inline_tags) { ["auto-tag"] }
1134
+
1135
+ it "notifies honeybadger with the set of tags" do
1136
+ expect(Honeybadger).to receive(:notify).with(hash_including({ tags: "auto-tag log-context:tag" }))
1137
+ ExceptionHandling.logger.with_context("inside" => { "context" => "tag" }) do
1138
+ log_error
1139
+ end
1140
+ end
1141
+ end
1142
+ end
1143
+ end
1032
1144
  end
1033
1145
 
1034
1146
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: exception_handling
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 3.1.0.pre.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Invoca
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-03-07 00:00:00.000000000 Z
11
+ date: 2024-03-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -70,16 +70,16 @@ dependencies:
70
70
  name: psych
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '3.2'
75
+ version: '3.0'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '3.2'
82
+ version: '3.0'
83
83
  description: Exception handling logger
84
84
  email:
85
85
  - development@invoca.com
@@ -139,12 +139,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
139
139
  requirements:
140
140
  - - ">="
141
141
  - !ruby/object:Gem::Version
142
- version: '0'
142
+ version: '2.7'
143
143
  required_rubygems_version: !ruby/object:Gem::Requirement
144
144
  requirements:
145
- - - ">="
145
+ - - ">"
146
146
  - !ruby/object:Gem::Version
147
- version: '0'
147
+ version: 1.3.1
148
148
  requirements: []
149
149
  rubygems_version: 3.3.7
150
150
  signing_key: