coaster 1.0.6 → 1.2.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: cb23e4c7362906cc9877bde117d7f1027adc08726b718526dd16bfe967355553
4
- data.tar.gz: f23ecb00881002158f99bc56daa261317f54b0620de3c6766b4fab93dc0d1e31
3
+ metadata.gz: 2b275d9ddd61f4631acadb1fee4ebfd3fb1d0bb0856621b732b431721940b460
4
+ data.tar.gz: f10dfe4a4583ee7ca7594ee514f384d428b3795ff421b420a86b70a89319389e
5
5
  SHA512:
6
- metadata.gz: b95bdef229ab03c481d31bf5f768ab9e1dec2a7d4d638d3bf1418da33e0665759030de2ef621fad94860b697373b8988dbe61b7955c479e7c9c1e3288c4ac656
7
- data.tar.gz: 57982252eddf851fe0245a8b141aeaab2e3213219ef49688ef59004cf9478054a1849e016f80289b5f3e93e2ec84f8b022fb3e8991bfc602aa1401709eebf481
6
+ metadata.gz: 57169b9c338d9499983fbe438d5739d2b82539652f448ed3e703e9c94570fb6f719f16aa628ea7b8928f1db475ed1e3d490acad9b8246ba43792a563cc9fa3a9
7
+ data.tar.gz: 7dcb832e9d9e855973a6743ec05c12a25fcd78d58806d5b7b2e1c8f85faf6896f397ac82ed008a600dc8d273597593c3ff651cc7f13c0b3637a0c43a07c52056
@@ -5,7 +5,7 @@ require 'active_support/core_ext/string'
5
5
  require 'active_support/core_ext/hash/slice'
6
6
 
7
7
  module Coaster
8
- mattr_accessor :logger
8
+ mattr_writer :logger
9
9
  mattr_writer :default_fingerprint
10
10
 
11
11
  DEFAULT_FINGERPRINT = [:default, :class].freeze
@@ -18,6 +18,16 @@ module Coaster
18
18
  def default_fingerprint
19
19
  @@default_fingerprint ||= DEFAULT_FINGERPRINT
20
20
  end
21
+
22
+ def logger
23
+ return @@logger if defined?(@@logger) && @@logger
24
+ return Rails.logger if defined?(Rails)
25
+ nil
26
+ end
27
+ end
28
+
29
+ def logger
30
+ self.class.logger
21
31
  end
22
32
  end
23
33
 
@@ -4,7 +4,7 @@ class Object
4
4
  class << self
5
5
  def _translate(*args)
6
6
  options = args.last.is_a?(Hash) ? args.pop : {}
7
- options.merge!(_translate_params)
7
+ options = _translate_params.merge(options)
8
8
  options = options.to_hash.symbolize_keys!
9
9
 
10
10
  key = args.shift
@@ -45,7 +45,10 @@ class Object
45
45
 
46
46
  if key_class.superclass == Object || key_class == Object
47
47
  return options[:description] if options[:description].present?
48
- Coaster.logger && Coaster.logger.warn(result)
48
+ if Coaster.logger
49
+ Coaster.logger.info(options[:original_missing])
50
+ Coaster.logger.debug(caller.join("\n"))
51
+ end
49
52
  throw :exception, result if options[:original_throw]
50
53
  missing = options[:original_missing] || result
51
54
  msg = missing.message
@@ -61,6 +64,7 @@ class Object
61
64
  result = result.dup if result.frozen?
62
65
  result.instance_variable_set(:@translated, true)
63
66
  result.instance_variable_set(:@tkey, options[:tkey])
67
+ result.instance_variable_set(:@missing, options[:original_missing])
64
68
  result
65
69
  end
66
70
  end
@@ -78,16 +82,7 @@ class Object
78
82
  def _translate(*args)
79
83
  options = (args.last.is_a?(Hash) ? args.pop : {}).with_indifferent_access
80
84
  key = args.shift || (respond_to?(:tkey) ? tkey : nil)
81
-
82
- if respond_to?(:description) && description.present? && description != 'false' && description != self.class.name
83
- if !key.is_a?(String) && key != :force
84
- desc = description
85
- return desc unless desc.instance_variable_get(:@raw)
86
- end
87
- options.merge!(description: description)
88
- end
89
-
90
- options.merge!(_translate_params)
85
+ options = _translate_params.merge(options)
91
86
  self.class._translate(key, *args, options)
92
87
  end
93
88
 
@@ -9,11 +9,7 @@ class StandardError
9
9
  def http_status; 500 end
10
10
  def report?; true end
11
11
  def intentional?; false end
12
-
13
- def title
14
- t = _translate('.title')
15
- t.instance_variable_defined?(:@missing) ? nil : t
16
- end
12
+ def title; _translate('.title') end
17
13
 
18
14
  def before_logging(name, &block)
19
15
  @before_logging_blocks ||= {}
@@ -21,7 +17,7 @@ class StandardError
21
17
  end
22
18
  def before_logging_blocks
23
19
  @before_logging_blocks ||= {}
24
- superclass <= StandardError ? superclass.after_logging_blocks.merge(@before_logging_blocks) : @before_logging_blocks
20
+ superclass <= StandardError ? superclass.before_logging_blocks.merge(@before_logging_blocks) : @before_logging_blocks
25
21
  end
26
22
 
27
23
  def after_logging(name, &block)
@@ -61,6 +57,7 @@ class StandardError
61
57
  msg = hash.delete(:m)
62
58
  msg = hash.delete(:msg) || msg
63
59
  msg = hash.delete(:message) || msg
60
+ hash[:description] ||= hash.delete(:desc) if hash[:desc].present?
64
61
  @fingerprint = hash.delete(:fingerprint) || hash.delete(:fingerprints)
65
62
  @tags = hash.delete(:tags) || hash.delete(:tag)
66
63
  @level = hash.delete(:level) || hash.delete(:severity) || @level
@@ -102,23 +99,44 @@ class StandardError
102
99
  def code; attributes[:code] || status end
103
100
  def code=(value); attributes[:code] = value end
104
101
  def title; attributes[:title] || self.class.title end
105
- def report?; attributes.key?(:report) ? attributes[:report] : self.class.report? end
106
- def intentional?; attributes.key?(:intentional) ? attributes[:intentional] : self.class.intentional? end
102
+ def it_might_happen?; attributes[:it] == :might_happen end
103
+ def it_should_not_happen?; attributes[:it] == :should_not_happen end
104
+ def report?
105
+ return attributes[:report] if attributes.key?(:report)
106
+ return false if it_might_happen?
107
+ self.class.report?
108
+ end
109
+ def intentional? # not logging in test
110
+ return attributes[:intentional] if attributes.key?(:intentional)
111
+ return true if it_should_not_happen?
112
+ self.class.intentional?
113
+ end
107
114
  def object; attributes[:object] || attributes[:obj] end
108
115
  alias_method :obj, :object
109
116
 
110
- # description is user friendly messages, do not use error's message
117
+ # description is user friendly message as a attribute, do not use error's message
111
118
  # error message is not user friendly in many cases.
112
119
  def description
113
- dsc = attributes[:description] || attributes[:desc]
114
- return dsc if dsc
115
- msg = safe_message.dup
116
- msg.instance_variable_set(:@raw, true)
117
- msg
120
+ attributes[:description] || attributes[:desc]
118
121
  end
119
122
  alias_method :desc, :description
120
123
 
121
- # more user friendly messages
124
+ def _translate(*args)
125
+ return description if description.present?
126
+ super
127
+ end
128
+
129
+ def _translate_params
130
+ attributes
131
+ end
132
+
133
+ # user friendly message, for overid
134
+ def user_message
135
+ return description if description.present?
136
+ _translate
137
+ end
138
+
139
+ # another user friendly messages
122
140
  def descriptions
123
141
  return attributes[:descriptions] if attributes[:descriptions]
124
142
  attributes[:descriptions] = {}
@@ -140,13 +158,6 @@ class StandardError
140
158
  hash
141
159
  end
142
160
 
143
- def _translate_params
144
- attributes.merge(
145
- type: self.class.name, status: status,
146
- http_status: http_status, message: message
147
- )
148
- end
149
-
150
161
  def to_json
151
162
  Oj.dump(to_hash.with_indifferent_access, mode: :compat)
152
163
  end
@@ -194,13 +205,15 @@ class StandardError
194
205
  def logging(options = {})
195
206
  before_logging_blocks.values.each { |blk| instance_exec &blk }
196
207
 
197
- return unless report?
198
- logger = nil
199
- if defined?(Rails)
200
- return if Rails.env.test? && intentional?
201
- logger = Rails.logger
208
+ if !report? || intentional?
209
+ if defined?(Rails)
210
+ return if Rails.env.test?
211
+ else
212
+ return
213
+ end
202
214
  end
203
- logger = options[:logger] || Coaster.logger || logger
215
+
216
+ logger = options[:logger] || Coaster.logger
204
217
  return unless logger
205
218
 
206
219
  cl = options[:cleaner] || cleaner
@@ -218,7 +231,8 @@ class StandardError
218
231
  else
219
232
  logger.error(msg)
220
233
  end
221
-
234
+ msg
235
+ ensure
222
236
  after_logging_blocks.values.each { |blk| instance_exec &blk }
223
237
  end
224
238
  end
@@ -66,4 +66,17 @@ class StandardError
66
66
  capture(options)
67
67
  just_logging(options)
68
68
  end
69
+
70
+ # https://github.com/getsentry/sentry-ruby/blob/fbbc7a51ed10684d0e8b7bd9d2a1b65a7351c9ef/lib/raven/event.rb#L162
71
+ # sentry use `to_s` as a message
72
+ alias to_origin_s to_s
73
+ def message
74
+ to_origin_s
75
+ end
76
+
77
+ def to_s
78
+ str = super # https://ruby-doc.org/core-2.5.1/Exception.html#method-i-to_s
79
+ str = "#{user_message} / #{str}" if user_message.present?
80
+ str
81
+ end
69
82
  end
@@ -1,3 +1,3 @@
1
1
  module Coaster
2
- VERSION = '1.0.6'
2
+ VERSION = '1.2.2'
3
3
  end
@@ -1,5 +1,8 @@
1
1
  en:
2
2
  class:
3
+ StandardError:
4
+ self: 'standard error translation'
5
+ title: 'standard error title'
3
6
  Coaster:
4
7
  self: 'Coaster Translated'
5
8
  SampleObject:
@@ -15,3 +18,4 @@ en:
15
18
  title: 'Test this title'
16
19
  sample:
17
20
  title: 'Sample Title'
21
+ interpolation: 'Sample Interpolation %{value}'
@@ -6,8 +6,12 @@ require 'pry'
6
6
  require 'rubygems'
7
7
  require 'bundler/setup'
8
8
  require 'coaster'
9
+ require 'logger'
9
10
 
10
11
  class Raven
11
12
  def self.capture_exception(*args)
12
13
  end
13
14
  end
15
+
16
+ Coaster.logger = Logger.new(STDOUT)
17
+ Coaster.logger.level = Logger::WARN
@@ -37,6 +37,7 @@ module Coaster
37
37
  def test_translation_sub
38
38
  assert_equal 'Coaster SampleObject Title (class.Coaster.SampleObject.title)', SampleObject._translate('.title')
39
39
  assert_equal 'Coaster SampleObject Title (class.Coaster.SampleObject.title)', SampleObject._translate(:title)
40
+ assert_nil SampleObject._translate(:title).instance_variable_get(:@missing)
40
41
  end
41
42
 
42
43
  def test_translation_with_key
@@ -46,6 +47,7 @@ module Coaster
46
47
  def test_translation_inheritance
47
48
  assert_equal 'Coaster SampleObject Translated', Inherited._translate
48
49
  assert_equal 'Coaster SampleObject Title (class.Coaster.Inherited.title)', Inherited._translate(:title)
50
+ assert Inherited._translate.instance_variable_get(:@missing)
49
51
  end
50
52
 
51
53
  def test_interpolation
@@ -20,6 +20,71 @@ module Coaster
20
20
  I18n.enforce_available_locales = false
21
21
  end
22
22
 
23
+ def test_standard_messages
24
+ e = StandardError.new('asdf')
25
+ assert_equal 'asdf', e.message
26
+ assert_nil e.description
27
+ assert_nil e.desc
28
+ assert_equal 'standard error translation', e._translate
29
+ assert_equal 'standard error translation', e.user_message
30
+ assert_equal 'standard error translation / asdf', e.to_s
31
+ assert_equal 'standard error title', e.title
32
+ e = StandardError.new(m: 'foo', desc: 'bar')
33
+ assert_equal 'foo', e.message
34
+ assert_equal 'bar', e.description
35
+ assert_equal 'bar', e.desc
36
+ assert_equal 'bar', e._translate
37
+ assert_equal 'bar', e.user_message
38
+ assert_equal 'standard error title', e.title
39
+ assert_equal 'bar / foo', e.to_s
40
+ end
41
+
42
+ def test_no_translation_class
43
+ e = UntitledError.new('asdf')
44
+ assert_equal 'asdf', e.message
45
+ assert_nil e.description
46
+ assert_nil e.desc
47
+ assert_equal 'standard error translation', e._translate
48
+ assert_equal 'standard error translation', e.user_message
49
+ assert_equal 'standard error translation / asdf', e.to_s
50
+ assert_equal 'standard error title', e.title
51
+ e = UntitledError.new(m: 'foo', desc: 'bar')
52
+ assert_equal 'foo', e.message
53
+ assert_equal 'bar', e.description
54
+ assert_equal 'bar', e.desc
55
+ assert_equal 'bar', e._translate
56
+ assert_equal 'bar', e.user_message
57
+ assert_equal 'bar / foo', e.to_s
58
+ assert_equal 'standard error title', e.title
59
+ end
60
+
61
+ def test_with_translation_class
62
+ e = SampleError.new('asdf')
63
+ assert_equal 'asdf', e.message
64
+ assert_nil e.description
65
+ assert_nil e.desc
66
+ assert_equal 'Test sample error', e._translate
67
+ assert_equal 'Test sample error', e.user_message
68
+ assert_equal 'Test sample error / asdf', e.to_s
69
+ assert_equal 'Test this title', e.title
70
+ e = SampleError.new(m: 'foo', desc: 'bar')
71
+ assert_equal 'foo', e.message
72
+ assert_equal 'bar', e.description
73
+ assert_equal 'bar', e.desc
74
+ assert_equal 'bar', e._translate
75
+ assert_equal 'bar', e.user_message
76
+ assert_equal 'bar / foo', e.to_s
77
+ assert_equal 'Test this title', e.title
78
+ e = SampleError.new(tkey: 'sample.interpolation', value: 'blah')
79
+ assert_equal 'Test sample error', e.message
80
+ assert_nil e.description
81
+ assert_nil e.desc
82
+ assert_equal 'Sample Interpolation blah', e._translate
83
+ assert_equal 'Sample Interpolation blah', e.user_message
84
+ assert_equal 'Sample Interpolation blah / Test sample error', e.to_s
85
+ assert_equal 'Test this title', e.title
86
+ end
87
+
23
88
  def test_message
24
89
  raise SampleError, {m: 'beer is proof'}
25
90
  rescue => e
@@ -39,16 +104,16 @@ module Coaster
39
104
  raise ExampleError, {wat: 'cha'}
40
105
  end
41
106
  rescue => e
42
- assert_equal e.to_hash['wat'], 'cha'
43
- assert_equal e.to_hash['type'], 'Coaster::TestStandardError::ExampleError'
44
- assert_equal e.to_hash['status'], 20
45
- assert_equal e.to_hash['http_status'], 500
46
- assert_equal e.to_hash['message'], 'Test sample error'
47
- assert_equal e.to_hash['cause']['frog'], 'rams'
48
- assert_equal e.to_hash['cause']['type'], 'Coaster::TestStandardError::SampleError'
49
- assert_equal e.to_hash['cause']['status'], 10
50
- assert_equal e.to_hash['cause']['http_status'], 500
51
- assert_equal e.to_hash['cause']['message'], 'Test sample error'
107
+ assert_equal 'cha', e.to_hash['wat']
108
+ assert_equal 'Coaster::TestStandardError::ExampleError', e.to_hash['type']
109
+ assert_equal 20, e.to_hash['status']
110
+ assert_equal 500, e.to_hash['http_status']
111
+ assert_equal 'Test sample error', e.to_hash['message']
112
+ assert_equal 'rams', e.to_hash['cause']['frog']
113
+ assert_equal 'Coaster::TestStandardError::SampleError', e.to_hash['cause']['type']
114
+ assert_equal 10, e.to_hash['cause']['status']
115
+ assert_equal 500, e.to_hash['cause']['http_status']
116
+ assert_equal 'Test sample error', e.to_hash['cause']['message']
52
117
  end
53
118
 
54
119
  def test_cause_attributes
@@ -58,9 +123,9 @@ module Coaster
58
123
  raise ExampleError, {wat: 'cha'}
59
124
  end
60
125
  rescue => e
61
- assert_equal e.cause.attr['frog'], 'rams'
62
- assert_equal e.attr['frog'], 'rams'
63
- assert_equal e.attr['wat'], 'cha'
126
+ assert_equal 'rams', e.cause.attr['frog']
127
+ assert_equal 'rams', e.attr['frog']
128
+ assert_equal 'cha', e.attr['wat']
64
129
  end
65
130
 
66
131
  def test_to_detail
@@ -94,19 +159,19 @@ LOG
94
159
  def test_translation
95
160
  raise SampleError, {tkey: '.test'}
96
161
  rescue => e
97
- assert_equal e._translate, 'Test this translation'
162
+ assert_equal 'Test this translation', e._translate
98
163
  end
99
164
 
100
165
  def test_title
101
166
  raise SampleError, 'foobar'
102
167
  rescue => e
103
- assert_equal e.title, 'Test this title'
168
+ assert_equal 'Test this title', e.title
104
169
  end
105
170
 
106
171
  def test_title_missing
107
172
  raise UntitledError, 'untitled'
108
173
  rescue => e
109
- assert_nil e.title
174
+ assert_equal 'standard error title', e.title
110
175
  end
111
176
 
112
177
  def root_cause_sample1
@@ -129,41 +194,54 @@ LOG
129
194
  begin
130
195
  root_cause_sample3
131
196
  rescue => e
132
- assert_equal e.root_cause.message, 'a'
197
+ assert_equal 'a', e.root_cause.message
133
198
  end
134
199
  end
135
200
 
136
201
  def test_raven_notes
137
202
  raise SampleError, m: 'foofoo', something: 'other'
138
203
  rescue => e
139
- assert_equal e.notes(the_other: 'something')[:extra][:something], 'other'
140
- assert_equal e.notes(the_other: 'something')[:extra][:the_other], 'something'
204
+ assert_equal 'other', e.notes(the_other: 'something')[:extra][:something]
205
+ assert_equal 'something', e.notes(the_other: 'something')[:extra][:the_other]
141
206
  end
142
207
 
143
208
  def test_to_hash
144
209
  aa # raise NameError
145
210
  rescue => e
146
- assert_equal e.to_hash['type'], 'NameError'
147
- assert_equal e.to_hash['status'], 999999
148
- assert_equal e.to_hash['http_status'], 500
149
- assert e.to_hash['message'] =~ /undefined local variable or method `aa'/
211
+ assert_equal 'NameError', e.to_hash['type']
212
+ assert_equal 999999, e.to_hash['status']
213
+ assert_equal 500, e.to_hash['http_status']
214
+ assert_match /undefined local variable or method `aa'/, e.to_hash['message']
150
215
  end
151
216
 
152
217
  def test_descriptions
153
218
  raise SampleError
154
219
  rescue => e
155
220
  e.descriptions.merge!(a: 1)
156
- assert_equal e.descriptions['a'], 1
221
+ assert_equal 1, e.descriptions['a']
157
222
  end
158
223
 
159
224
  class SampleErrorSub < SampleError; end
160
- class SampleErrorSubSub < SampleErrorSub; end
161
- SampleError.after_logging(:blah) { @blah = 101 }
225
+ class SampleErrorSubSub < SampleErrorSub
226
+ def it_might_happen?; true end
227
+ end
228
+ SampleError.after_logging(:blah) do
229
+ self.attributes[:abc] = 100
230
+ @blah = 101
231
+ end
162
232
  def test_before_logging
163
233
  e = SampleErrorSubSub.new(m: 'foo')
164
234
  assert !e.after_logging_blocks[:blah].nil?
165
235
  e.logging
166
- assert_equal e.instance_variable_get(:@blah), 101
236
+ assert_equal 100, e.attributes[:abc]
237
+ assert_equal 101, e.instance_variable_get(:@blah)
238
+ end
239
+ class SampleErrorMightHappen < SampleErrorSub
240
+ def it_might_happen?; true end
241
+ end
242
+ def test_might_happen
243
+ e = SampleErrorMightHappen.new('fbar')
244
+ assert !e.report?
167
245
  end
168
246
  end
169
247
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coaster
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.6
4
+ version: 1.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - buzz jung
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-18 00:00:00.000000000 Z
11
+ date: 2020-10-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: i18n
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '3.0'
47
+ version: 6.0.3.1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '3.0'
54
+ version: 6.0.3.1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: attr_extras
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -70,114 +70,128 @@ dependencies:
70
70
  name: bundler
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '1.12'
75
+ version: '0'
76
76
  type: :development
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: '1.12'
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: pry
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '0.8'
89
+ version: '0'
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: '0.8'
96
+ version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: pry-stack_explorer
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - "~>"
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
- version: '0.4'
103
+ version: '0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - "~>"
108
+ - - ">="
109
109
  - !ruby/object:Gem::Version
110
- version: '0.4'
110
+ version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: pry-byebug
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - "~>"
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: '3.0'
117
+ version: '0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - "~>"
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: pry-doc
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
123
137
  - !ruby/object:Gem::Version
124
- version: '3.0'
138
+ version: '0'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: minitest
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
- - - "~>"
143
+ - - ">="
130
144
  - !ruby/object:Gem::Version
131
- version: '5.0'
145
+ version: '0'
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: '5.0'
152
+ version: '0'
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: mocha
141
155
  requirement: !ruby/object:Gem::Requirement
142
156
  requirements:
143
- - - "~>"
157
+ - - ">="
144
158
  - !ruby/object:Gem::Version
145
- version: '1.0'
159
+ version: '0'
146
160
  type: :development
147
161
  prerelease: false
148
162
  version_requirements: !ruby/object:Gem::Requirement
149
163
  requirements:
150
- - - "~>"
164
+ - - ">="
151
165
  - !ruby/object:Gem::Version
152
- version: '1.0'
166
+ version: '0'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: shoulda
155
169
  requirement: !ruby/object:Gem::Requirement
156
170
  requirements:
157
- - - "~>"
171
+ - - ">="
158
172
  - !ruby/object:Gem::Version
159
- version: '3.0'
173
+ version: '0'
160
174
  type: :development
161
175
  prerelease: false
162
176
  version_requirements: !ruby/object:Gem::Requirement
163
177
  requirements:
164
- - - "~>"
178
+ - - ">="
165
179
  - !ruby/object:Gem::Version
166
- version: '3.0'
180
+ version: '0'
167
181
  - !ruby/object:Gem::Dependency
168
182
  name: shoulda-context
169
183
  requirement: !ruby/object:Gem::Requirement
170
184
  requirements:
171
- - - "~>"
185
+ - - ">="
172
186
  - !ruby/object:Gem::Version
173
- version: '1.0'
187
+ version: '0'
174
188
  type: :development
175
189
  prerelease: false
176
190
  version_requirements: !ruby/object:Gem::Requirement
177
191
  requirements:
178
- - - "~>"
192
+ - - ">="
179
193
  - !ruby/object:Gem::Version
180
- version: '1.0'
194
+ version: '0'
181
195
  description: Ruby Core Extensions
182
196
  email: buzz@frograms.com
183
197
  executables: []
@@ -221,12 +235,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
221
235
  - !ruby/object:Gem::Version
222
236
  version: '0'
223
237
  requirements: []
224
- rubygems_version: 3.0.3
238
+ rubygems_version: 3.1.2
225
239
  signing_key:
226
240
  specification_version: 4
227
241
  summary: A little convenient feature for standard library
228
242
  test_files:
229
- - test/locales/en.yml
230
- - test/test_standard_error.rb
231
- - test/test_helper.rb
232
243
  - test/test_object_translation.rb
244
+ - test/test_helper.rb
245
+ - test/test_standard_error.rb
246
+ - test/locales/en.yml