coaster 1.0.8 → 1.1.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: 30a1cd3050a41f9d174b8f163bc73c86519e46535c875664e044d09b5bf5f1a6
4
- data.tar.gz: 309a1fd5431ced086709b694f9f7a95f330f5342dc09841729f491ab6f8276ca
3
+ metadata.gz: c38985e1f47460405cf2cf2e4f9507d78dd0db1f45d939ad5768269f1e2a6e7a
4
+ data.tar.gz: 5fcefde9af96868f10520648de4d775f58282d42d33e07e8abbbd76806328a93
5
5
  SHA512:
6
- metadata.gz: 9d93263418966554adf4ec4f509a2cd77f8ab3f478d1aeaa9188e1b36856e1ba5dad2ae8e988bbfb28a5324b790da7dc23e429e6f1e0df1f369d0008414dc45d
7
- data.tar.gz: be7411b223a6db84e0e53d738010ad4a620f73b9e2424cb0bfa3c5b9ab5a47bf0d16797c419aa5fd393bc291a67a6946db29f7b783cd79a0230ff3a88a4fdd37
6
+ metadata.gz: d682e58f09d22aff8992360821e7dffc4a02c057882fb9ba9b9603631d76600c591016c1543b2e561190b9c91354049bfeb907c663abe3523b22d1cfc53b0579
7
+ data.tar.gz: f5e73571a6ede546e38c34c2145c96b3832888cc642bdc60c15e61ac5f91241359e66a5387b501c2f60b0c6153fdc1fb9facff4caf1ff98dfde35e4b2c1ea769
@@ -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)
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 ||= {}
@@ -117,18 +113,25 @@ 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
+ # user friendly message, for overid
129
+ def user_message
130
+ return description if description.present?
131
+ _translate
132
+ end
133
+
134
+ # another user friendly messages
132
135
  def descriptions
133
136
  return attributes[:descriptions] if attributes[:descriptions]
134
137
  attributes[:descriptions] = {}
@@ -204,12 +207,15 @@ class StandardError
204
207
  def logging(options = {})
205
208
  before_logging_blocks.values.each { |blk| instance_exec &blk }
206
209
 
207
- logger = nil
208
- if defined?(Rails)
209
- return if Rails.env.test? && (intentional? || !report?)
210
- logger = Rails.logger
210
+ if !report? || intentional?
211
+ if defined?(Rails)
212
+ return if Rails.env.test?
213
+ else
214
+ return
215
+ end
211
216
  end
212
- logger = options[:logger] || Coaster.logger || logger
217
+
218
+ logger = options[:logger] || Coaster.logger
213
219
  return unless logger
214
220
 
215
221
  cl = options[:cleaner] || cleaner
@@ -1,3 +1,3 @@
1
1
  module Coaster
2
- VERSION = '1.0.8'
2
+ VERSION = '1.1.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:
@@ -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,57 @@ 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 title', e.title
31
+ e = StandardError.new(m: 'foo', desc: 'bar')
32
+ assert_equal 'foo', e.message
33
+ assert_equal 'bar', e.description
34
+ assert_equal 'bar', e.desc
35
+ assert_equal 'bar', e._translate
36
+ assert_equal 'bar', e.user_message
37
+ assert_equal 'standard error title', e.title
38
+ end
39
+
40
+ def test_no_translation_class
41
+ e = UntitledError.new('asdf')
42
+ assert_equal 'asdf', e.message
43
+ assert_nil e.description
44
+ assert_nil e.desc
45
+ assert_equal 'standard error translation', e._translate
46
+ assert_equal 'standard error translation', e.user_message
47
+ assert_equal 'standard error title', e.title
48
+ e = UntitledError.new(m: 'foo', desc: 'bar')
49
+ assert_equal 'foo', e.message
50
+ assert_equal 'bar', e.description
51
+ assert_equal 'bar', e.desc
52
+ assert_equal 'bar', e._translate
53
+ assert_equal 'bar', e.user_message
54
+ assert_equal 'standard error title', e.title
55
+ end
56
+
57
+ def test_with_translation_class
58
+ e = SampleError.new('asdf')
59
+ assert_equal 'asdf', e.message
60
+ assert_nil e.description
61
+ assert_nil e.desc
62
+ assert_equal 'Test sample error', e._translate
63
+ assert_equal 'Test sample error', e.user_message
64
+ assert_equal 'Test this title', e.title
65
+ e = SampleError.new(m: 'foo', desc: 'bar')
66
+ assert_equal 'foo', e.message
67
+ assert_equal 'bar', e.description
68
+ assert_equal 'bar', e.desc
69
+ assert_equal 'bar', e._translate
70
+ assert_equal 'bar', e.user_message
71
+ assert_equal 'Test this title', e.title
72
+ end
73
+
23
74
  def test_message
24
75
  raise SampleError, {m: 'beer is proof'}
25
76
  rescue => e
@@ -39,16 +90,16 @@ module Coaster
39
90
  raise ExampleError, {wat: 'cha'}
40
91
  end
41
92
  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'
93
+ assert_equal 'cha', e.to_hash['wat']
94
+ assert_equal 'Coaster::TestStandardError::ExampleError', e.to_hash['type']
95
+ assert_equal 20, e.to_hash['status']
96
+ assert_equal 500, e.to_hash['http_status']
97
+ assert_equal 'Test sample error', e.to_hash['message']
98
+ assert_equal 'rams', e.to_hash['cause']['frog']
99
+ assert_equal 'Coaster::TestStandardError::SampleError', e.to_hash['cause']['type']
100
+ assert_equal 10, e.to_hash['cause']['status']
101
+ assert_equal 500, e.to_hash['cause']['http_status']
102
+ assert_equal 'Test sample error', e.to_hash['cause']['message']
52
103
  end
53
104
 
54
105
  def test_cause_attributes
@@ -58,9 +109,9 @@ module Coaster
58
109
  raise ExampleError, {wat: 'cha'}
59
110
  end
60
111
  rescue => e
61
- assert_equal e.cause.attr['frog'], 'rams'
62
- assert_equal e.attr['frog'], 'rams'
63
- assert_equal e.attr['wat'], 'cha'
112
+ assert_equal 'rams', e.cause.attr['frog']
113
+ assert_equal 'rams', e.attr['frog']
114
+ assert_equal 'cha', e.attr['wat']
64
115
  end
65
116
 
66
117
  def test_to_detail
@@ -94,19 +145,19 @@ LOG
94
145
  def test_translation
95
146
  raise SampleError, {tkey: '.test'}
96
147
  rescue => e
97
- assert_equal e._translate, 'Test this translation'
148
+ assert_equal 'Test this translation', e._translate
98
149
  end
99
150
 
100
151
  def test_title
101
152
  raise SampleError, 'foobar'
102
153
  rescue => e
103
- assert_equal e.title, 'Test this title'
154
+ assert_equal 'Test this title', e.title
104
155
  end
105
156
 
106
157
  def test_title_missing
107
158
  raise UntitledError, 'untitled'
108
159
  rescue => e
109
- assert_nil e.title
160
+ assert_equal 'standard error title', e.title
110
161
  end
111
162
 
112
163
  def root_cause_sample1
@@ -129,31 +180,31 @@ LOG
129
180
  begin
130
181
  root_cause_sample3
131
182
  rescue => e
132
- assert_equal e.root_cause.message, 'a'
183
+ assert_equal 'a', e.root_cause.message
133
184
  end
134
185
  end
135
186
 
136
187
  def test_raven_notes
137
188
  raise SampleError, m: 'foofoo', something: 'other'
138
189
  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'
190
+ assert_equal 'other', e.notes(the_other: 'something')[:extra][:something]
191
+ assert_equal 'something', e.notes(the_other: 'something')[:extra][:the_other]
141
192
  end
142
193
 
143
194
  def test_to_hash
144
195
  aa # raise NameError
145
196
  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'/
197
+ assert_equal 'NameError', e.to_hash['type']
198
+ assert_equal 999999, e.to_hash['status']
199
+ assert_equal 500, e.to_hash['http_status']
200
+ assert_match /undefined local variable or method `aa'/, e.to_hash['message']
150
201
  end
151
202
 
152
203
  def test_descriptions
153
204
  raise SampleError
154
205
  rescue => e
155
206
  e.descriptions.merge!(a: 1)
156
- assert_equal e.descriptions['a'], 1
207
+ assert_equal 1, e.descriptions['a']
157
208
  end
158
209
 
159
210
  class SampleErrorSub < SampleError; end
@@ -168,8 +219,8 @@ LOG
168
219
  e = SampleErrorSubSub.new(m: 'foo')
169
220
  assert !e.after_logging_blocks[:blah].nil?
170
221
  e.logging
171
- assert_equal e.attributes[:abc], 100
172
- assert_equal e.instance_variable_get(:@blah), 101
222
+ assert_equal 100, e.attributes[:abc]
223
+ assert_equal 101, e.instance_variable_get(:@blah)
173
224
  end
174
225
  class SampleErrorMightHappen < SampleErrorSub
175
226
  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.8
4
+ version: 1.1.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-24 00:00:00.000000000 Z
11
+ date: 2020-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: i18n