Skip to content

Commit f23abdc

Browse files
committed
Refactor interfaces
1 parent b986c89 commit f23abdc

File tree

9 files changed

+95
-66
lines changed

9 files changed

+95
-66
lines changed

.rubocop.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ AllCops:
44
- 'lib/raven/utils/deep_merge.rb'
55

66
Metrics/ClassLength:
7-
Max: 230
7+
Max: 231
88
CountComments: false
99

1010
Metrics/AbcSize:

lib/raven/event.rb

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,17 @@ class Event
2323
PLATFORM = "ruby".freeze
2424
SDK = { "name" => "sentry-raven", "version" => Raven::VERSION }.freeze
2525

26-
attr_reader :id
27-
attr_accessor :message, :timestamp, :time_spent, :level, :logger,
26+
attr_accessor :id, :timestamp, :time_spent, :level, :logger,
2827
:culprit, :server_name, :release, :modules, :extra, :tags,
2928
:context, :configuration, :checksum, :fingerprint, :environment,
30-
:os, :runtime, :breadcrumbs
29+
:os, :runtime, :breadcrumbs, :user, :backtrace
3130

3231
def initialize(init = {})
3332
@configuration = Raven.configuration
3433
@interfaces = {}
3534
@breadcrumbs = Raven.breadcrumbs
3635
@context = Raven.context
3736
@id = SecureRandom.uuid.delete("-")
38-
@message = nil
3937
@timestamp = Time.now.utc
4038
@time_spent = nil
4139
@level = :error
@@ -44,11 +42,11 @@ def initialize(init = {})
4442
@server_name = @configuration.server_name
4543
@release = @configuration.release
4644
@modules = list_gem_specs if @configuration.send_modules
47-
@user = {}
48-
@extra = {}
49-
@os = {}
50-
@runtime = {}
51-
@tags = {}
45+
@user = {} # TODO: contexts
46+
@extra = {} # TODO: contexts
47+
@os = {} # TODO: contexts
48+
@runtime = {} # TODO: contexts
49+
@tags = {} # TODO: contexts
5250
@checksum = nil
5351
@fingerprint = nil
5452
@environment = @configuration.current_environment
@@ -61,24 +59,36 @@ def initialize(init = {})
6159
end
6260
end
6361

64-
if @context.rack_env
62+
if @context.rack_env # TODO: contexts
6563
@context.user[:ip_address] = calculate_real_ip_from_rack
6664
end
6765

68-
init.each_pair { |key, val| instance_variable_set('@' + key.to_s, val) }
66+
init.each_pair { |key, val| public_send(key.to_s + "=", val) }
6967

70-
@user = @context.user.merge(@user)
71-
@extra = @context.extra.merge(@extra)
72-
@tags = @configuration.tags.merge(@context.tags).merge(@tags)
73-
@os = @context.os
74-
@runtime = @context.runtime
68+
@user = @context.user.merge(@user) # TODO: contexts
69+
@extra = @context.extra.merge(@extra) # TODO: contexts
70+
@tags = @configuration.tags.merge(@context.tags).merge(@tags) # TODO: contexts
71+
@os = @context.os # TODO: contexts
72+
@runtime = @context.runtime # TODO: contexts
7573

7674
# Some type coercion
7775
@timestamp = @timestamp.strftime('%Y-%m-%dT%H:%M:%S') if @timestamp.is_a?(Time)
7876
@time_spent = (@time_spent * 1000).to_i if @time_spent.is_a?(Float)
7977
@level = LOG_LEVELS[@level.to_s.downcase] if @level.is_a?(String) || @level.is_a?(Symbol)
8078
end
8179

80+
def message
81+
@interfaces[:logentry] && @interfaces[:logentry].unformatted_message
82+
end
83+
84+
def message=(args)
85+
message, params = *args
86+
interface(:message) do |int|
87+
int.message = message
88+
int.params = params
89+
end
90+
end
91+
8292
class << self
8393
def from_exception(exc, options = {}, &block)
8494
exception_context = get_exception_context(exc) || {}
@@ -112,11 +122,8 @@ def from_message(message, options = {})
112122

113123
new(options) do |evt|
114124
evt.configuration = configuration
115-
evt.message = message
116125
evt.level = options[:level] || :error
117-
evt.interface :message do |int|
118-
int.message = message
119-
end
126+
evt.message = message, options[:message_params] || []
120127
if options[:backtrace]
121128
evt.interface(:stacktrace) do |int|
122129
stacktrace_interface_from(int, evt, options[:backtrace])
@@ -201,10 +208,10 @@ def list_gem_specs
201208
end
202209

203210
def interface(name, value = nil, &block)
204-
int = Raven.find_interface(name)
211+
int = Interface.registered[name]
205212
raise(Error, "Unknown interface: #{name}") unless int
206-
@interfaces[int.name] = int.new(value, &block) if value || block
207-
@interfaces[int.name]
213+
@interfaces[int.sentry_alias] = int.new(value, &block) if value || block
214+
@interfaces[int.sentry_alias]
208215
end
209216

210217
def [](key)
@@ -218,7 +225,6 @@ def []=(key, value)
218225
def to_hash
219226
data = {
220227
:event_id => @id,
221-
:message => @message,
222228
:timestamp => @timestamp,
223229
:time_spent => @time_spent,
224230
:level => @level,
@@ -227,6 +233,7 @@ def to_hash
227233
:os => @os,
228234
:runtime => @runtime
229235
}
236+
230237
data[:logger] = @logger if @logger
231238
data[:culprit] = @culprit if @culprit
232239
data[:server_name] = @server_name if @server_name
@@ -239,9 +246,11 @@ def to_hash
239246
data[:user] = @user if @user
240247
data[:breadcrumbs] = @breadcrumbs.to_hash unless @breadcrumbs.empty?
241248
data[:checksum] = @checksum if @checksum
249+
242250
@interfaces.each_pair do |name, int_data|
243251
data[name.to_sym] = int_data.to_hash
244252
end
253+
data[:message] = message
245254
data
246255
end
247256

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
module Raven
2-
INTERFACES = {} # rubocop:disable Style/MutableConstant
3-
42
class Interface
53
def initialize(attributes = nil)
64
attributes.each do |attr, value|
@@ -10,23 +8,18 @@ def initialize(attributes = nil)
108
yield self if block_given?
119
end
1210

13-
def self.name(value = nil)
14-
@interface_name ||= value
11+
def self.inherited(klass)
12+
name = klass.name.split("::").last.downcase.gsub("interface", "")
13+
registered[name.to_sym] = klass
14+
super
1515
end
1616

17-
def to_hash
18-
Hash[instance_variables.map { |name| [name[1..-1].to_sym, instance_variable_get(name)] }]
17+
def self.registered
18+
@@registered ||= {} # rubocop:disable Style/ClassVars
1919
end
20-
end
2120

22-
def self.register_interface(mapping)
23-
mapping.each_pair do |key, klass|
24-
INTERFACES[key.to_s] = klass
25-
INTERFACES[klass.name] = klass
21+
def to_hash
22+
Hash[instance_variables.map { |name| [name[1..-1].to_sym, instance_variable_get(name)] }]
2623
end
2724
end
28-
29-
def self.find_interface(name)
30-
INTERFACES[name.to_s]
31-
end
3225
end

lib/raven/interfaces/exception.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
1-
require 'raven/interfaces'
1+
require 'raven/interface'
22

33
module Raven
44
class ExceptionInterface < Interface
5-
name 'exception'
65
attr_accessor :values
76

7+
def self.sentry_alias
8+
:exception
9+
end
10+
811
def to_hash(*args)
912
data = super(*args)
1013
data[:values] = data[:values].map(&:to_hash) if data[:values]
1114
data
1215
end
1316
end
14-
15-
register_interface :exception => ExceptionInterface
1617
end

lib/raven/interfaces/http.rb

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,18 @@
1-
require 'raven/interfaces'
1+
require 'raven/interface'
22

33
module Raven
44
class HttpInterface < Interface
5-
name 'request'
6-
attr_accessor :url
7-
attr_accessor :method
8-
attr_accessor :data
9-
attr_accessor :query_string
10-
attr_accessor :cookies
11-
attr_accessor :headers
12-
attr_accessor :env
5+
attr_accessor :url, :method, :data, :query_string, :cookies, :headers, :env
136

147
def initialize(*arguments)
158
self.headers = {}
169
self.env = {}
1710
self.cookies = nil
1811
super(*arguments)
1912
end
20-
end
2113

22-
register_interface :http => HttpInterface
14+
def self.sentry_alias
15+
:request
16+
end
17+
end
2318
end

lib/raven/interfaces/message.rb

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1-
require 'raven/interfaces'
1+
require 'raven/interface'
22

33
module Raven
44
class MessageInterface < Interface
5-
name 'sentry.interfaces.Message'
6-
attr_accessor :message
7-
attr_accessor :params
5+
attr_accessor :message, :params
86

97
def initialize(*arguments)
108
self.params = []
119
super(*arguments)
1210
end
13-
end
1411

15-
register_interface :message => MessageInterface
12+
def unformatted_message
13+
message % params
14+
end
15+
16+
def self.sentry_alias
17+
:logentry
18+
end
19+
end
1620
end

lib/raven/interfaces/single_exception.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
require 'raven/interfaces'
1+
require 'raven/interface'
22

33
module Raven
44
class SingleExceptionInterface < Interface

lib/raven/interfaces/stack_trace.rb

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1-
require 'raven/interfaces'
1+
require 'raven/interface'
22

33
module Raven
44
class StacktraceInterface < Interface
5-
name 'stacktrace'
65
attr_accessor :frames
76

87
def initialize(*arguments)
98
self.frames = []
109
super(*arguments)
1110
end
1211

12+
def self.sentry_alias
13+
:stacktrace
14+
end
15+
1316
def to_hash(*args)
1417
data = super(*args)
1518
data[:frames] = data[:frames].map(&:to_hash)
@@ -71,6 +74,4 @@ def to_hash(*args)
7174
end
7275
end
7376
end
74-
75-
register_interface :stack_trace => StacktraceInterface
7677
end

spec/raven/interface_spec.rb

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
require 'spec_helper'
2+
3+
class TestInterface < Raven::Interface
4+
attr_accessor :some_attr
5+
end
6+
7+
describe Raven::Interface do
8+
it "should register an interface when a new class is defined" do
9+
expect(Raven::Interface.registered[:test]).to eq(TestInterface)
10+
end
11+
12+
it "can be initialized with some attributes" do
13+
interface = TestInterface.new(:some_attr => "test")
14+
expect(interface.some_attr).to eq("test")
15+
end
16+
17+
it "can initialize with a block" do
18+
interface = TestInterface.new { |int| int.some_attr = "test" }
19+
expect(interface.some_attr).to eq("test")
20+
end
21+
22+
it "serializes to a Hash" do
23+
interface = TestInterface.new(:some_attr => "test")
24+
expect(interface.to_hash).to eq(:some_attr => "test")
25+
end
26+
end

0 commit comments

Comments
 (0)