coaster 1.0.6 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/coaster.rb +11 -1
- data/lib/coaster/core_ext/object_translation.rb +7 -12
- data/lib/coaster/core_ext/standard_error.rb +43 -29
- data/lib/coaster/core_ext/standard_error/raven.rb +13 -0
- data/lib/coaster/version.rb +1 -1
- data/test/locales/en.yml +4 -0
- data/test/test_helper.rb +4 -0
- data/test/test_object_translation.rb +2 -0
- data/test/test_standard_error.rb +105 -27
- metadata +54 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b275d9ddd61f4631acadb1fee4ebfd3fb1d0bb0856621b732b431721940b460
|
4
|
+
data.tar.gz: f10dfe4a4583ee7ca7594ee514f384d428b3795ff421b420a86b70a89319389e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57169b9c338d9499983fbe438d5739d2b82539652f448ed3e703e9c94570fb6f719f16aa628ea7b8928f1db475ed1e3d490acad9b8246ba43792a563cc9fa3a9
|
7
|
+
data.tar.gz: 7dcb832e9d9e855973a6743ec05c12a25fcd78d58806d5b7b2e1c8f85faf6896f397ac82ed008a600dc8d273597593c3ff651cc7f13c0b3637a0c43a07c52056
|
data/lib/coaster.rb
CHANGED
@@ -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
|
-
|
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
|
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
|
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.
|
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
|
106
|
-
def
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
208
|
+
if !report? || intentional?
|
209
|
+
if defined?(Rails)
|
210
|
+
return if Rails.env.test?
|
211
|
+
else
|
212
|
+
return
|
213
|
+
end
|
202
214
|
end
|
203
|
-
|
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
|
data/lib/coaster/version.rb
CHANGED
data/test/locales/en.yml
CHANGED
@@ -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}'
|
data/test/test_helper.rb
CHANGED
@@ -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
|
data/test/test_standard_error.rb
CHANGED
@@ -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']
|
43
|
-
assert_equal e.to_hash['type']
|
44
|
-
assert_equal e.to_hash['status']
|
45
|
-
assert_equal e.to_hash['http_status']
|
46
|
-
assert_equal e.to_hash['message']
|
47
|
-
assert_equal e.to_hash['cause']['frog']
|
48
|
-
assert_equal e.to_hash['cause']['type']
|
49
|
-
assert_equal e.to_hash['cause']['status']
|
50
|
-
assert_equal e.to_hash['cause']['http_status']
|
51
|
-
assert_equal e.to_hash['cause']['message']
|
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']
|
62
|
-
assert_equal e.attr['frog']
|
63
|
-
assert_equal e.attr['wat']
|
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
|
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
|
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
|
-
|
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
|
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]
|
140
|
-
assert_equal e.notes(the_other: 'something')[:extra][:the_other]
|
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']
|
147
|
-
assert_equal e.to_hash['status']
|
148
|
-
assert_equal e.to_hash['http_status']
|
149
|
-
|
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']
|
221
|
+
assert_equal 1, e.descriptions['a']
|
157
222
|
end
|
158
223
|
|
159
224
|
class SampleErrorSub < SampleError; end
|
160
|
-
class SampleErrorSubSub < SampleErrorSub
|
161
|
-
|
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.
|
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.
|
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-
|
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:
|
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:
|
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: '
|
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: '
|
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
|
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
|
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
|
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
|
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: '
|
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: '
|
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: '
|
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: '
|
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: '
|
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: '
|
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: '
|
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: '
|
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: '
|
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: '
|
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.
|
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
|