coaster 1.0.7 → 1.3.0

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: ca45b5184489708bdeeb0381f2d540576f1b58cc324b3dca4f5bd698f021c687
4
- data.tar.gz: 69ab2837c8159634389fefc993503c130bb8e14efcda3a2621646d909a3f9a4f
3
+ metadata.gz: aeeb91379c4231e8622891bfbfee5c93c202e96706bfa7d569b4bcea3e19d696
4
+ data.tar.gz: 124f01130e4fadf67e9e28c134e409986f8d1186e324f1b93e35fdf040a09652
5
5
  SHA512:
6
- metadata.gz: 417805608b285316128c95f4aadaa83d26ab9f2666e0273e1ee987baca5b4d346596dd0d1d8de925f7273bf6a4ee3ac057ceaf43c6213874b025e9df51533c5f
7
- data.tar.gz: 795b2a27aaadf52aad1e6f723397dc13be68e3cd7028ca5c1a982cd9dda6cbe92d688ea4324ed72fd609274993c91c29978bf0d2ecc52bad7b4d6a82c68b4341
6
+ metadata.gz: fe9c0490709aa11a3c96816294702dbebd982b7304af0633f319612035f4be627f030a928749506d454fd2806c485b6e440c37c0895dae8ec2633a780a66f4dd
7
+ data.tar.gz: 5a7de756347f74c4ece3dad9b36a987d44715b29cca55ded06d2a1bdfb0b38f4e16c654a4d9c2db3284c4cf76ab629afcbfa3bc33f373eeb21fc52db8008d6e0
@@ -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,23 +57,23 @@ 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
67
64
  @tkey = hash.delete(:tkey)
68
- msg = cause.message if msg.nil? && cause
69
65
  @attributes.merge!(hash)
70
66
  when String then
71
67
  msg = message
72
68
  when FalseClass, NilClass then
73
- msg = ''
69
+ msg = nil
74
70
  else
75
71
  msg = message
76
72
  end
77
73
 
78
74
  @fingerprint = [] unless @fingerprint.is_a?(Array)
79
75
  @tags = {} unless @tags.is_a?(Hash)
80
- msg ||= self.class._translate
76
+ msg = cause.message if msg.blank? && cause
81
77
  super(msg)
82
78
  end
83
79
 
@@ -117,24 +113,44 @@ class StandardError
117
113
  def object; attributes[:object] || attributes[:obj] end
118
114
  alias_method :obj, :object
119
115
 
120
- # description is user friendly messages, do not use error's message
116
+ # description is user friendly message as a attribute, do not use error's message
121
117
  # error message is not user friendly in many cases.
122
118
  def description
123
- dsc = attributes[:description] || attributes[:desc]
124
- return dsc if dsc
125
- msg = safe_message.dup
126
- msg.instance_variable_set(:@raw, true)
127
- msg
119
+ attributes[:description] || attributes[:desc]
128
120
  end
129
121
  alias_method :desc, :description
130
122
 
131
- # more user friendly messages
123
+ def _translate(*args)
124
+ return description if description.present?
125
+ super
126
+ end
127
+
128
+ def _translate_params
129
+ attributes
130
+ end
131
+
132
+ # user friendly message, for overid
133
+ def user_message
134
+ return description if description.present?
135
+ _translate
136
+ end
137
+
138
+ # another user friendly messages
132
139
  def descriptions
133
140
  return attributes[:descriptions] if attributes[:descriptions]
134
141
  attributes[:descriptions] = {}
135
142
  attributes[:descriptions]
136
143
  end
137
144
 
145
+ # https://github.com/getsentry/sentry-ruby/blob/fbbc7a51ed10684d0e8b7bd9d2a1b65a7351c9ef/lib/raven/event.rb#L162
146
+ # sentry message use `to_s` method
147
+ # https://ruby-doc.org/core-2.5.1/Exception.html#method-i-to_s
148
+ alias to_origin_s to_s
149
+
150
+ def to_s
151
+ "#{_translate}\n#{to_origin_s}"
152
+ end
153
+
138
154
  def to_hash
139
155
  hash = attributes.merge(
140
156
  type: self.class.name, status: status,
@@ -150,13 +166,6 @@ class StandardError
150
166
  hash
151
167
  end
152
168
 
153
- def _translate_params
154
- attributes.merge(
155
- type: self.class.name, status: status,
156
- http_status: http_status, message: message
157
- )
158
- end
159
-
160
169
  def to_json
161
170
  Oj.dump(to_hash.with_indifferent_access, mode: :compat)
162
171
  end
@@ -204,13 +213,15 @@ class StandardError
204
213
  def logging(options = {})
205
214
  before_logging_blocks.values.each { |blk| instance_exec &blk }
206
215
 
207
- return unless report?
208
- logger = nil
209
- if defined?(Rails)
210
- return if Rails.env.test? && intentional?
211
- logger = Rails.logger
216
+ if !report? || intentional?
217
+ if defined?(Rails)
218
+ return if Rails.env.test?
219
+ else
220
+ return
221
+ end
212
222
  end
213
- logger = options[:logger] || Coaster.logger || logger
223
+
224
+ logger = options[:logger] || Coaster.logger
214
225
  return unless logger
215
226
 
216
227
  cl = options[:cleaner] || cleaner
@@ -228,7 +239,8 @@ class StandardError
228
239
  else
229
240
  logger.error(msg)
230
241
  end
231
-
242
+ msg
243
+ ensure
232
244
  after_logging_blocks.values.each { |blk| instance_exec &blk }
233
245
  end
234
246
  end
@@ -1,3 +1,3 @@
1
1
  module Coaster
2
- VERSION = '1.0.7'
2
+ VERSION = '1.3.0'
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,10 +20,91 @@ module Coaster
20
20
  I18n.enforce_available_locales = false
21
21
  end
22
22
 
23
+ def test_standard_messages
24
+ e = StandardError.new('developer message')
25
+ assert_equal "standard error translation\ndeveloper message", e.to_s
26
+ assert_equal "standard error translation\ndeveloper message", e.message
27
+ assert_nil e.description
28
+ assert_nil e.desc
29
+ assert_equal 'standard error translation', e._translate
30
+ assert_equal 'standard error translation', e.user_message
31
+ assert_equal 'standard error title', e.title
32
+ e = StandardError.new(m: 'developer message', desc: 'user message')
33
+ assert_equal "user message\ndeveloper message", e.to_s
34
+ assert_equal "user message\ndeveloper message", e.message
35
+ assert_equal 'user message', e.description
36
+ assert_equal 'user message', e.desc
37
+ assert_equal 'user message', e._translate
38
+ assert_equal 'user message', e.user_message
39
+ assert_equal 'standard error title', e.title
40
+ end
41
+
42
+ def test_no_translation_class
43
+ e = UntitledError.new('developer message')
44
+ assert_equal "standard error translation\ndeveloper message", e.to_s
45
+ assert_equal "standard error translation\ndeveloper message", e.message
46
+ assert_nil e.description
47
+ assert_nil e.desc
48
+ assert_equal 'standard error translation', e._translate
49
+ assert_equal 'standard error translation', e.user_message
50
+ assert_equal 'standard error title', e.title
51
+ e = UntitledError.new(m: 'developer message', desc: 'user message')
52
+ assert_equal "user message\ndeveloper message", e.to_s
53
+ assert_equal "user message\ndeveloper message", e.message
54
+ assert_equal 'user message', e.description
55
+ assert_equal 'user message', e.desc
56
+ assert_equal 'user message', e._translate
57
+ assert_equal 'user message', e.user_message
58
+ assert_equal 'standard error title', e.title
59
+ end
60
+
61
+ def test_with_translation_class
62
+ e = SampleError.new
63
+ assert_equal "Test sample error\nCoaster::TestStandardError::SampleError", e.to_s
64
+ assert_equal "Test sample error\nCoaster::TestStandardError::SampleError", e.message
65
+ assert_nil e.description
66
+ assert_nil e.desc
67
+ assert_equal 'Test sample error', e._translate
68
+ assert_equal 'Test sample error', e.user_message
69
+ assert_equal 'Test this title', e.title
70
+ e = SampleError.new(beet: 'apple')
71
+ assert_equal "Test sample error\nCoaster::TestStandardError::SampleError", e.to_s
72
+ assert_equal "Test sample error\nCoaster::TestStandardError::SampleError", e.message
73
+ assert_nil e.description
74
+ assert_nil e.desc
75
+ assert_equal 'Test sample error', e._translate
76
+ assert_equal 'Test sample error', e.user_message
77
+ assert_equal 'Test this title', e.title
78
+ e = SampleError.new('developer message')
79
+ assert_equal "Test sample error\ndeveloper message", e.to_s
80
+ assert_equal "Test sample error\ndeveloper message", e.message
81
+ assert_nil e.description
82
+ assert_nil e.desc
83
+ assert_equal 'Test sample error', e._translate
84
+ assert_equal 'Test sample error', e.user_message
85
+ assert_equal 'Test this title', e.title
86
+ e = SampleError.new(m: 'developer message', desc: 'user message')
87
+ assert_equal "user message\ndeveloper message", e.to_s
88
+ assert_equal "user message\ndeveloper message", e.message
89
+ assert_equal 'user message', e.description
90
+ assert_equal 'user message', e.desc
91
+ assert_equal 'user message', e._translate
92
+ assert_equal 'user message', e.user_message
93
+ assert_equal 'Test this title', e.title
94
+ e = SampleError.new(tkey: 'sample.interpolation', value: 'blah')
95
+ assert_equal "Sample Interpolation blah\nCoaster::TestStandardError::SampleError", e.to_s
96
+ assert_equal "Sample Interpolation blah\nCoaster::TestStandardError::SampleError", e.message
97
+ assert_nil e.description
98
+ assert_nil e.desc
99
+ assert_equal 'Sample Interpolation blah', e._translate
100
+ assert_equal 'Sample Interpolation blah', e.user_message
101
+ assert_equal 'Test this title', e.title
102
+ end
103
+
23
104
  def test_message
24
105
  raise SampleError, {m: 'beer is proof'}
25
106
  rescue => e
26
- assert_equal 'beer is proof', e.message
107
+ assert_equal "Test sample error\nbeer is proof", e.message
27
108
  end
28
109
 
29
110
  def test_attributes
@@ -39,16 +120,16 @@ module Coaster
39
120
  raise ExampleError, {wat: 'cha'}
40
121
  end
41
122
  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'
123
+ assert_equal 'cha', e.to_hash['wat']
124
+ assert_equal 'Coaster::TestStandardError::ExampleError', e.to_hash['type']
125
+ assert_equal 20, e.to_hash['status']
126
+ assert_equal 500, e.to_hash['http_status']
127
+ assert_equal "Test example error\nTest sample error\n#{SampleError.name}", e.to_hash['message']
128
+ assert_equal 'rams', e.to_hash['cause']['frog']
129
+ assert_equal 'Coaster::TestStandardError::SampleError', e.to_hash['cause']['type']
130
+ assert_equal 10, e.to_hash['cause']['status']
131
+ assert_equal 500, e.to_hash['cause']['http_status']
132
+ assert_equal "Test sample error\nCoaster::TestStandardError::SampleError", e.to_hash['cause']['message']
52
133
  end
53
134
 
54
135
  def test_cause_attributes
@@ -58,9 +139,9 @@ module Coaster
58
139
  raise ExampleError, {wat: 'cha'}
59
140
  end
60
141
  rescue => e
61
- assert_equal e.cause.attr['frog'], 'rams'
62
- assert_equal e.attr['frog'], 'rams'
63
- assert_equal e.attr['wat'], 'cha'
142
+ assert_equal 'rams', e.cause.attr['frog']
143
+ assert_equal 'rams', e.attr['frog']
144
+ assert_equal 'cha', e.attr['wat']
64
145
  end
65
146
 
66
147
  def test_to_detail
@@ -72,7 +153,9 @@ module Coaster
72
153
  rescue => e
73
154
  detail = <<-LOG
74
155
  [Coaster::TestStandardError::ExampleError] status:20
75
- MESSAGE: Test sample error
156
+ MESSAGE: Test example error
157
+ Test sample error
158
+ Coaster::TestStandardError::SampleError
76
159
  @fingerprint: []
77
160
  @tags: {}
78
161
  @level: \"error\"
@@ -81,6 +164,7 @@ module Coaster
81
164
  @raven: {}
82
165
  CAUSE: [Coaster::TestStandardError::SampleError] status:10
83
166
  MESSAGE: Test sample error
167
+ Coaster::TestStandardError::SampleError
84
168
  @fingerprint: []
85
169
  @tags: {}
86
170
  @level: \"error\"
@@ -94,19 +178,19 @@ LOG
94
178
  def test_translation
95
179
  raise SampleError, {tkey: '.test'}
96
180
  rescue => e
97
- assert_equal e._translate, 'Test this translation'
181
+ assert_equal 'Test this translation', e._translate
98
182
  end
99
183
 
100
184
  def test_title
101
185
  raise SampleError, 'foobar'
102
186
  rescue => e
103
- assert_equal e.title, 'Test this title'
187
+ assert_equal 'Test this title', e.title
104
188
  end
105
189
 
106
190
  def test_title_missing
107
191
  raise UntitledError, 'untitled'
108
192
  rescue => e
109
- assert_nil e.title
193
+ assert_equal 'standard error title', e.title
110
194
  end
111
195
 
112
196
  def root_cause_sample1
@@ -129,35 +213,37 @@ LOG
129
213
  begin
130
214
  root_cause_sample3
131
215
  rescue => e
132
- assert_equal e.root_cause.message, 'a'
216
+ assert_equal "standard error translation\na", e.root_cause.message
133
217
  end
134
218
  end
135
219
 
136
220
  def test_raven_notes
137
221
  raise SampleError, m: 'foofoo', something: 'other'
138
222
  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'
223
+ assert_equal 'other', e.notes(the_other: 'something')[:extra][:something]
224
+ assert_equal 'something', e.notes(the_other: 'something')[:extra][:the_other]
141
225
  end
142
226
 
143
227
  def test_to_hash
144
228
  aa # raise NameError
145
229
  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'/
230
+ assert_equal 'NameError', e.to_hash['type']
231
+ assert_equal 999999, e.to_hash['status']
232
+ assert_equal 500, e.to_hash['http_status']
233
+ assert_match /undefined local variable or method `aa'/, e.to_hash['message']
150
234
  end
151
235
 
152
236
  def test_descriptions
153
237
  raise SampleError
154
238
  rescue => e
155
239
  e.descriptions.merge!(a: 1)
156
- assert_equal e.descriptions['a'], 1
240
+ assert_equal 1, e.descriptions['a']
157
241
  end
158
242
 
159
243
  class SampleErrorSub < SampleError; end
160
- class SampleErrorSubSub < SampleErrorSub; end
244
+ class SampleErrorSubSub < SampleErrorSub
245
+ def it_might_happen?; true end
246
+ end
161
247
  SampleError.after_logging(:blah) do
162
248
  self.attributes[:abc] = 100
163
249
  @blah = 101
@@ -166,8 +252,8 @@ LOG
166
252
  e = SampleErrorSubSub.new(m: 'foo')
167
253
  assert !e.after_logging_blocks[:blah].nil?
168
254
  e.logging
169
- assert_equal e.attributes[:abc], 100
170
- assert_equal e.instance_variable_get(:@blah), 101
255
+ assert_equal 100, e.attributes[:abc]
256
+ assert_equal 101, e.instance_variable_get(:@blah)
171
257
  end
172
258
  class SampleErrorMightHappen < SampleErrorSub
173
259
  def it_might_happen?; true 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.7
4
+ version: 1.3.0
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-22 00:00:00.000000000 Z
11
+ date: 2020-10-14 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,72 @@ dependencies:
70
70
  name: bundler
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '1.12'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '1.12'
83
- - !ruby/object:Gem::Dependency
84
- name: pry
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '0.8'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '0.8'
97
- - !ruby/object:Gem::Dependency
98
- name: pry-stack_explorer
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - "~>"
102
- - !ruby/object:Gem::Version
103
- version: '0.4'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - "~>"
109
- - !ruby/object:Gem::Version
110
- version: '0.4'
111
- - !ruby/object:Gem::Dependency
112
- name: pry-byebug
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
73
+ - - ">="
116
74
  - !ruby/object:Gem::Version
117
- version: '3.0'
75
+ version: '0'
118
76
  type: :development
119
77
  prerelease: false
120
78
  version_requirements: !ruby/object:Gem::Requirement
121
79
  requirements:
122
- - - "~>"
80
+ - - ">="
123
81
  - !ruby/object:Gem::Version
124
- version: '3.0'
82
+ version: '0'
125
83
  - !ruby/object:Gem::Dependency
126
84
  name: minitest
127
85
  requirement: !ruby/object:Gem::Requirement
128
86
  requirements:
129
- - - "~>"
87
+ - - ">="
130
88
  - !ruby/object:Gem::Version
131
- version: '5.0'
89
+ version: '0'
132
90
  type: :development
133
91
  prerelease: false
134
92
  version_requirements: !ruby/object:Gem::Requirement
135
93
  requirements:
136
- - - "~>"
94
+ - - ">="
137
95
  - !ruby/object:Gem::Version
138
- version: '5.0'
96
+ version: '0'
139
97
  - !ruby/object:Gem::Dependency
140
98
  name: mocha
141
99
  requirement: !ruby/object:Gem::Requirement
142
100
  requirements:
143
- - - "~>"
101
+ - - ">="
144
102
  - !ruby/object:Gem::Version
145
- version: '1.0'
103
+ version: '0'
146
104
  type: :development
147
105
  prerelease: false
148
106
  version_requirements: !ruby/object:Gem::Requirement
149
107
  requirements:
150
- - - "~>"
108
+ - - ">="
151
109
  - !ruby/object:Gem::Version
152
- version: '1.0'
110
+ version: '0'
153
111
  - !ruby/object:Gem::Dependency
154
112
  name: shoulda
155
113
  requirement: !ruby/object:Gem::Requirement
156
114
  requirements:
157
- - - "~>"
115
+ - - ">="
158
116
  - !ruby/object:Gem::Version
159
- version: '3.0'
117
+ version: '0'
160
118
  type: :development
161
119
  prerelease: false
162
120
  version_requirements: !ruby/object:Gem::Requirement
163
121
  requirements:
164
- - - "~>"
122
+ - - ">="
165
123
  - !ruby/object:Gem::Version
166
- version: '3.0'
124
+ version: '0'
167
125
  - !ruby/object:Gem::Dependency
168
126
  name: shoulda-context
169
127
  requirement: !ruby/object:Gem::Requirement
170
128
  requirements:
171
- - - "~>"
129
+ - - ">="
172
130
  - !ruby/object:Gem::Version
173
- version: '1.0'
131
+ version: '0'
174
132
  type: :development
175
133
  prerelease: false
176
134
  version_requirements: !ruby/object:Gem::Requirement
177
135
  requirements:
178
- - - "~>"
136
+ - - ">="
179
137
  - !ruby/object:Gem::Version
180
- version: '1.0'
138
+ version: '0'
181
139
  description: Ruby Core Extensions
182
140
  email: buzz@frograms.com
183
141
  executables: []
@@ -221,12 +179,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
221
179
  - !ruby/object:Gem::Version
222
180
  version: '0'
223
181
  requirements: []
224
- rubygems_version: 3.0.3
182
+ rubygems_version: 3.1.2
225
183
  signing_key:
226
184
  specification_version: 4
227
185
  summary: A little convenient feature for standard library
228
186
  test_files:
229
187
  - test/test_object_translation.rb
230
- - test/locales/en.yml
231
- - test/test_standard_error.rb
232
188
  - test/test_helper.rb
189
+ - test/test_standard_error.rb
190
+ - test/locales/en.yml