8000 feat: include object id/key in invalid object errors (#301) · optimizely/ruby-sdk@9b77a5b · GitHub
[go: up one dir, main page]

Skip to content

Commit 9b77a5b

Browse files
stonemanMat001
andauthored
feat: include object id/key in invalid object errors (#301)
* feat: include object id/key in invalid object errors - Include object `id`/`key` in errors when objects not found in datafile - Modifies invalid object `id`/`key` log messages to make them consistent Include object `id`/`key` in errors when an object is not found makes them available to the user or the custom error handler. One example of why this is useful is that the `key` of an experiment could be used within a custom error handler to fetch the details of the experiment. This would indicate whether the experiment has been paused (in which case the error could be ignored) or archived (in which case the code referencing the experiment should be removed from the application). * feat: expose object identifiers as error properties - Expose the object identifiers as error properties so that they are easier to use in error handlers. - Encapsulate the error messages within the error objects to enforce consistency and to simplify initialization - Use the messages of the error objects as log messages to enforce consistency and to simplify logging * Update lib/optimizely/exceptions.rb typo identifier * identifier typo * identifier typo * identifier typo * identifier typo * identifier typo --------- Co-authored-by: Matjaz Pirnovar <Mat001@users.noreply.github.com>
1 parent 85512a2 commit 9b77a5b

File tree

3 files changed

+105
-45
lines changed

3 files changed

+105
-45
lines changed

lib/optimizely/config/datafile_project_config.rb

Lines changed: 48 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,9 @@ def get_experiment_from_key(experiment_key)
223223
experiment = @experiment_key_map[experiment_key]
224224
return experiment if experiment
225225

226-
@logger.log Logger::ERROR, "Experiment key '#{experiment_key}' is not in datafile."
227-
@error_handler.handle_error InvalidExperimentError
226+
invalid_experiment_error = InvalidExperimentError.new(experiment_key: experiment_key)
227+
@logger.log Logger::ERROR, invalid_experiment_error.message
228+
@error_handler.handle_error invalid_experiment_error
228229
nil
229230
end
230231

@@ -238,8 +239,9 @@ def get_experiment_from_id(experiment_id)
238239
experiment = @experiment_id_map[experiment_id]
239240
return experiment if experiment
240241

241-
@logger.log Logger::ERROR, "Experiment id '#{experiment_id}' is not in datafile."
242-
@error_handler.handle_error InvalidExperimentError
242+
invalid_experiment_error = InvalidExperimentError.new(experiment_id: experiment_id)
243+
@logger.log Logger::ERROR, invalid_experiment_error.message
244+
@error_handler.handle_error invalid_experiment_error
243245
nil
244246
end
245247

@@ -253,8 +255,9 @@ def get_experiment_key(experiment_id)
253255
experiment = @experiment_id_map[experiment_id]
254256
return experiment['key'] unless experiment.nil?
255257

256-
@logger.log Logger::ERROR, "Experiment id '#{experiment_id}' is not in datafile."
257-
@error_handler.handle_error InvalidExperimentError
258+
invalid_experiment_error = InvalidExperimentError.new(experiment_id: experiment_id)
259+
@logger.log Logger::ERROR, invalid_experiment_error.message
260+
@error_handler.handle_error invalid_experiment_error
258261
nil
259262
end
260263

@@ -268,8 +271,9 @@ def get_event_from_key(event_key)
268271
event = @event_key_map[event_key]
269272
return event if event
270273

271-
@logger.log Logger::ERROR, "Event '#{event_key}' is not in datafile."
272-
@error_handler.handle_error InvalidEventError
274+
invalid_event_error = InvalidEventError.new(event_key)
275+
@logger.log Logger::ERROR, invalid_event_error.message
276+
@error_handler.handle_error invalid_event_error
273277
nil
274278
end
275279

@@ -283,8 +287,9 @@ def get_audience_from_id(audience_id)
283287
audience = @audience_id_map[audience_id]
284288
return audience if audience
285289

286-
@logger.log Logger::ERROR, "Audience '#{audience_id}' is not in datafile."
287-
@error_handler.handle_error InvalidAudienceError
290+
invalid_audience_error = InvalidAudienceError.new(audience_id)
291+
@logger.log Logger::ERROR, invalid_audience_error.message
292+
@error_handler.handle_error invalid_audience_error
288293
nil
289294
end
290295

@@ -308,13 +313,15 @@ def get_variation_from_id(experiment_key, variation_id)
308313
variation = variation_id_map[variation_id]
309314
return variation if variation
310315

311-
@logger.log Logger::ERROR, "Variation id '#{variation_id}' is not in datafile."
312-
@error_handler.handle_error InvalidVariationError
316+
invalid_variation_error = InvalidVariationError.new(variation_id: variation_id)
317+
@logger.log Logger::ERROR, invalid_variation_error.message
318+
@error_handler.handle_error invalid_variation_error
313319
return nil
314320
end
315321

316-
@logger.log Logger::ERROR, "Experiment key '#{experiment_key}' is not in datafile."
317-
@error_handler.handle_error InvalidExperimentError
322+
invalid_experiment_error = InvalidExperimentError.new(experiment_key: experiment_key)
323+
@logger.log Logger::ERROR, invalid_experiment_error.message
324+
@error_handler.handle_error invalid_experiment_error
318325
nil
319326
end
320327

@@ -331,13 +338,15 @@ def get_variation_from_id_by_experiment_id(experiment_id, variation_id)
331338
variation = variation_id_map_by_experiment_id[variation_id]
332339
return variation if variation
333340

334-
@logger.log Logger::ERROR, "Variation id '#{variation_id}' is not in datafile."
335-
@error_handler.handle_error InvalidVariationError
341+
invalid_variation_error = InvalidVariationError.new(variation_id: variation_id)
342+
@logger.log Logger::ERROR, invalid_variation_error.message
343+
@error_handler.handle_error invalid_variation_error
336344
return nil
337345
end
338346

339-
@logger.log Logger::ERROR, "Experiment id '#{experiment_id}' is not in datafile."
340-
@error_handler.handle_error InvalidExperimentError
347+
invalid_experiment_error = InvalidExperimentError.new(experiment_id: experiment_id)
348+
@logger.log Logger::ERROR, invalid_experiment_error.message
349+
@error_handler.handle_error invalid_experiment_error
341350
nil
342351
end
343352

@@ -354,13 +363,15 @@ def get_variation_id_from_key_by_experiment_id(experiment_id, variation_key)
354363
variation = variation_key_map[variation_key]
355364
return variation['id'] if variation
356365

357-
@logger.log Logger::ERROR, "Variation key '#{variation_key}' is not in datafile."
358-
@error_handler.handle_error InvalidVariationError
366+
invalid_variation_error = InvalidVariationError.new(variation_key: variation_key)
367+
@logger.log Logger::ERROR, invalid_variation_error.message
368+
@error_handler.handle_error invalid_variation_error
359369
return nil
360370
end
361371

362-
@logger.log Logger::ERROR, "Experiment id '#{experiment_id}' is not in datafile."
363-
@error_handler.handle_error InvalidExperimentError
372+
invalid_experiment_error = InvalidExperimentError.new(experiment_id: experiment_id)
373+
@logger.log Logger::ERROR, invalid_experiment_error.message
374+
@error_handler.handle_error invalid_experiment_error
364375
nil
365376
end
366377

@@ -377,13 +388,15 @@ def get_variation_id_from_key(experiment_key, variation_key)
377388
variation = variation_key_map[variation_key]
378389
return variation['id'] if variation
379390

380-
@logger.log Logger::ERROR, "Variation key '#{variation_key}' is not in datafile."
381-
@error_handler.handle_error InvalidVariationError
391+
invalid_variation_error = InvalidVariationError.new(variation_key: variation_key)
392+
@logger.log Logger::ERROR, invalid_variation_error.message
393+
@error_handler.handle_error invalid_variation_error
382394
return nil
383395
end
384396

385-
@logger.log Logger::ERROR, "Experiment key '#{experiment_key}' is not in datafile."
386-
@error_handler.handle_error InvalidExperimentError
397+
invalid_experiment_error = InvalidE 10000 xperimentError.new(experiment_key: experiment_key)
398+
@logger.log Logger::ERROR, invalid_experiment_error.message
399+
@error_handler.handle_error invalid_experiment_error
387400
nil
388401
end
389402

@@ -397,8 +410,9 @@ def get_whitelisted_variations(experiment_id)
397410
experiment = @experiment_id_map[experiment_id]
398411
return experiment['forcedVariations'] if experiment
399412

400-
@logger.log Logger::ERROR, "Experiment ID '#{experiment_id}' is not in datafile."
401-
@error_handler.handle_error InvalidExperimentError
413+
invalid_experiment_error = InvalidExperimentError.new(experiment_id: experiment_id)
414+
@logger.log Logger::ERROR, invalid_experiment_error.message
415+
@error_handler.handle_error invalid_experiment_error
402416
end
403417

404418
def get_attribute_id(attribute_key)
@@ -420,8 +434,9 @@ def get_attribute_id(attribute_key)
420434
end
421435
return attribute_key if has_reserved_prefix
422436

423-
@logger.log Logger::ERROR, "Attribute key '#{attribute_key}' is not in datafile."
424-
@error_handler.handle_error InvalidAttributeError
437+
invalid_attribute_error = InvalidAttributeError.new(attribute_key)
438+
@logger.log Logger::ERROR, invalid_attribute_error.message
439+
@error_handler.handle_error invalid_attribute_error
425440
nil
426441
end
427442

@@ -439,8 +454,9 @@ def variation_id_exists?(experiment_id, variation_id)
439454
variation = variation_id_map[variation_id]
440455
return true if variation
441456

442-
@logger.log Logger::ERROR, "Variation ID '#{variation_id}' is not in datafile."
443-
@error_handler.handle_error InvalidVariationError
457+
invalid_variation_error = InvalidVariationError.new(variation_id: variation_id)
458+
@logger.log Logger::ERROR, invalid_variation_error.message
459+
@error_handler.handle_error invalid_variation_error
444460
end
445461

446462
false

lib/optimizely/exceptions.rb

Lines changed: 54 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -42,16 +42,28 @@ def initialize(msg = 'SDK key not provided/cannot be found in the datafile.')
4242
class InvalidAudienceError < Error
4343
# Raised when an invalid audience is provided
4444

45-
def initialize(msg = 'Provided audience is not in datafile.')
46-
super
45+
attr_reader :audience_id
46+
47+
def initialize(audience_id)
48+
raise ArgumentError, 'audience_id must be provided' if audience_id.nil?
49+
50+
super("Audience id '#{audience_id}' is not in datafile.")
51+
52+
@audience_id = audience_id
4753
end
4854
end
4955

5056
class InvalidAttributeError < Error
5157
# Raised when an invalid attribute is provided
5258

53-
def initialize(msg = 'Provided attribute is not in datafile.')
54-
super
59+
attr_reader :attribute_key
60+
61+
def initialize(attribute_key)
62+
raise ArgumentError, 'attribute_key must be provided' if attribute_key.nil?
63+
64+
super("Attribute key '#{attribute_key}' is not in datafile.")
65+
66+
@attribute_key = attribute_key
5567
end
5668
end
5769

@@ -74,24 +86,56 @@ def initialize(msg = 'Event tags provided are in an invalid format.')
7486
class InvalidExperimentError < Error
7587
# Raised when an invalid experiment key is provided
7688

77-
def initialize(msg = 'Provided experiment is not in datafile.')
78-
super
89+
attr_reader :experiment_id, :experiment_key
90+
91+
def initialize(experiment_id: nil, experiment_key: nil)
92+
raise ArgumentError, 'Either experiment_id or experiment_key must be provided.' if experiment_id.nil? && experiment_key.nil?
93+
raise ArgumentError, 'Cannot provide both experiment_id and experiment_key.' if !experiment_id.nil? && !experiment_key.nil?
94+
95+
if experiment_id.nil?
96+
@experiment_key = experiment_key
97+
identifier = "key '#{@experiment_key}'"
98+
else
99+
@experiment_id = experiment_id
100+
identifier = "id '#{@experiment_id}'"
101+
end
102+
103+
super("Experiment #{identifier} is not in datafile.")
79104
end
80105
end
81106

82107
class InvalidEventError < Error
83108
# Raised when an invalid event key is provided
84109

85-
def initialize(msg = 'Provided event is not in datafile.')
86-
super
110+
attr_reader :event_key
111+
112+
def initialize(event_key)
113+
raise ArgumentError, 'event_key must be provided.' if event_key.nil?
114+
115+
super("Event key '#{event_key}' is not in datafile.")
116+
117+
@event_key = event_key
87118
end
88119
end
89120

90121
class InvalidVariationError < Error
91122
# Raised when an invalid variation key or ID is provided
92123

93-
def initialize(msg = 'Provided variation is not in datafile.')
94-
super
124+
attr_reader :variation_id, :variation_key
125+
126+
def initialize(variation_id: nil, variation_key: nil)
127+
raise ArgumentError, 'Either variation_id or variation_key must be provided.' if variation_id.nil? && variation_key.nil?
128+
raise ArgumentError, 'Cannot provide both variation_id and variation_key.' if !variation_id.nil? && !variation_key.nil?
129+
130+
if variation_id.nil?
131+
identifier = "key '#{variation_key}'"
132+
@variation_key = variation_key
133+
else
134+
identifier = "id '#{variation_id}'"
135+
@variation_id = variation_id
136+
end
137+
138+
super("Variation #{identifier} is not in datafile.")
95139
end
96140
end
97141

spec/config/datafile_project_config_spec.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -837,14 +837,14 @@
837837
describe 'get_event_from_key' do
838838
it 'should log a message when provided event key is invalid' do
839839
config.get_event_from_key('invalid_key')
840-
expect(spy_logger).to have_received(:log).with(Logger::ERROR, "Event 'invalid_key' is not in datafile.")
840+
expect(spy_logger).to have_received(:log).with(Logger::ERROR, "Event key 'invalid_key' is not in datafile.")
841841
end
842842
end
843843

844844
describe 'get_audience_from_id' do
845845
it 'should log a message when provided audience ID is invalid' do
846846
config.get_audience_from_id('invalid_id')
847-
expect(spy_logger).to have_received(:log).with(Logger::ERROR, "Audience 'invalid_id' is not in datafile.")
847+
expect(spy_logger).to have_received(:log).with(Logger::ERROR, "Audience id 'invalid_id' is not in datafile.")
848848
end
849849
end
850850

@@ -948,7 +948,7 @@
948948
it 'should log a message when there is no experiment key map for the experiment' do
949949
config.get_whitelisted_variations('invalid_key')
950950
expect(spy_logger).to have_received(:log).with(Logger::ERROR,
951-
"Experiment ID 'invalid_key' is not in datafile.")
951+
"Experiment id 'invalid_key' is not in datafile.")
952952
end
953953
end
954954

0 commit comments

Comments
 (0)
0