Skip to content

Commit b1a978f

Browse files
committed
Use Binding::ResolutionDetails everywhere
1 parent 1d294d8 commit b1a978f

File tree

10 files changed

+59
-99
lines changed

10 files changed

+59
-99
lines changed

lib/datadog/open_feature/evaluation_engine.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ def fetch_value(flag_key:, expected_type:, evaluation_context: nil)
3737
# do we want to go that way?
3838

3939
@evaluator.get_assignment(flag_key, evaluation_context, expected_type, Time.now.utc.to_i)
40+
# TODO: insert reporting here
4041
rescue => e
4142
@telemetry.report(e, description: 'OpenFeature: Failed to fetch value for flag')
4243

lib/datadog/open_feature/exposures/models/event.rb

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -17,41 +17,15 @@ class Event
1717
FalseClass
1818
].freeze
1919

20-
# NOTE: The result is a Hash-like structure like this
21-
#
22-
# {
23-
# "flag": "boolean-one-of-matches",
24-
# "variationType": "INTEGER",
25-
# "defaultValue": 0,
26-
# "targetingKey": "haley",
27-
# "attributes": {
28-
# "not_matches_flag": "False"
29-
# },
30-
# "result": {
31-
# "value": 4,
32-
# "variant": "4",
33-
# "flagMetadata": {
34-
# "allocationKey": "4-for-not-matches",
35-
# "variationType": "number",
36-
# "doLog": true
37-
# }
38-
# }
39-
# }
4020
class << self
41-
def build(result, context:)
21+
def build(result, flag_key:, context:)
4222
payload = {
4323
timestamp: current_timestamp_ms,
44-
allocation: {
45-
key: result.dig('result', 'flagMetadata', 'allocationKey').to_s
46-
},
47-
flag: {
48-
key: result['flag'].to_s
49-
},
50-
variant: {
51-
key: result.dig('result', 'variant').to_s
52-
},
24+
allocation: {key: result.allocation_key},
25+
flag: {key: flag_key},
26+
variant: {key: result.variant},
5327
subject: {
54-
id: result['targetingKey'].to_s,
28+
id: context.targeting_key,
5529
attributes: extract_attributes(context)
5630
}
5731
}

lib/datadog/open_feature/exposures/reporter.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ def initialize(worker, telemetry:, logger: Datadog.logger)
1414
@deduplicator = Deduplicator.new
1515
end
1616

17-
def report(result, context:)
18-
return false unless result.dig('result', 'flagMetadata', 'doLog')
17+
def report(result, flag_key:, context:)
18+
return false unless result.do_log
1919

20-
event = Models::Event.build(result, context: context)
20+
event = Models::Event.build(result, flag_key: flag_key, context: context)
2121
return false if @deduplicator.duplicate?(event)
2222

2323
@worker.enqueue(event)

sig/datadog/open_feature/evaluation_engine.rbs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ module Datadog
33
class EvaluationEngine
44
ALLOWED_TYPES: ::Array[::Symbol]
55

6-
attr_writer configuration: ::String?
6+
attr_accessor configuration: ::String?
77

88
attr_reader reporter: Exposures::Reporter
99

@@ -12,8 +12,8 @@ module Datadog
1212
def fetch_value: (
1313
flag_key: ::String,
1414
expected_type: ::Symbol,
15-
?evaluation_context: ::OpenFeature::SDK::EvaluationContext
16-
) -> ::Hash[::Symbol, untyped]
15+
?evaluation_context: ::OpenFeature::SDK::EvaluationContext?
16+
) -> Binding::ResolutionDetails
1717

1818
def reconfigure!: () -> void
1919
end

sig/datadog/open_feature/exposures/deduplicator.rbs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,10 @@ module Datadog
66

77
def initialize: (?limit: ::Integer) -> void
88

9-
def duplicate?: (Models::Event) -> bool
9+
def duplicate?: (Models::Event event) -> bool
1010

1111
private
1212

13-
def key: (::String, ::String) -> ::String
14-
1513
def digest: (::String, ::String) -> ::Integer
1614
end
1715
end

sig/datadog/open_feature/exposures/reporter.rbs

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,13 @@ module Datadog
22
module OpenFeature
33
module Exposures
44
class Reporter
5-
def initialize: (Worker, ?logger: Core::Logger, telemetry: Core::Telemetry::Component) -> void
5+
def initialize: (Worker worker, telemetry: Core::Telemetry::Component, ?logger: Core::Logger) -> void
66

7-
def report: (::Hash[untyped, untyped], context: untyped) -> bool
8-
9-
def flush: () -> void
10-
11-
private
12-
13-
def normalize: (untyped, untyped) -> ::Hash[Symbol, untyped]?
14-
15-
def build_exposure: (::Hash[Symbol, untyped]) -> ::Hash[Symbol, untyped]
16-
17-
def extract_targeting_key: (untyped) -> (String | nil)
18-
19-
def extract_attributes: (::Hash[untyped, untyped], untyped) -> (::Hash[untyped, untyped] | nil)
20-
21-
def ensure_hash: (untyped) -> ::Hash[untyped, untyped]
7+
def report: (
8+
Binding::ResolutionDetails result,
9+
flag_key: ::String,
10+
context: ::OpenFeature::SDK::EvaluationContext
11+
) -> bool
2212
end
2313
end
2414
end

sig/datadog/open_feature/models/event.rbs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ module Datadog
77

88
TARGETING_KEY_FIELD: ::String
99

10-
def self.build: (::Hash[untyped, untyped], context: untyped) -> Event?
10+
def self.build: (
11+
Binding::ResolutionDetails result,
12+
flag_key: ::String,
13+
context: ::OpenFeature::SDK::EvaluationContext
14+
) -> Event
1115

1216
def initialize: (::Hash[Symbol, untyped]) -> void
1317

@@ -21,11 +25,9 @@ module Datadog
2125

2226
def to_h: () -> ::Hash[Symbol, untyped]
2327

24-
def self.current_timestamp_ms: () -> ::Integer
28+
def self.current_timestamp_ms: () -> ::Integer
2529

26-
def self.extract_attributes: (untyped) -> ::Hash[untyped, untyped]
27-
28-
def self.context_targeting_key: (untyped) -> (::String | nil)
30+
def self.extract_attributes: (::OpenFeature::SDK::EvaluationContext) -> ::Hash[::String, untyped]
2931
end
3032
end
3133
end

spec/datadog/open_feature/exposures/models/event_spec.rb

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,30 +8,24 @@
88
before { allow(Datadog::Core::Utils::Time).to receive(:now).and_return(now) }
99

1010
let(:now) { Time.utc(2025, 1, 1, 0, 0, 0) }
11-
let(:event) { described_class.build(result, context: context) }
11+
let(:event) { described_class.build(result, flag_key: 'feature_flag', context: context) }
1212
let(:result) do
13-
{
14-
'flag' => 'feature_flag',
15-
'variationType' => 'INTEGER',
16-
'defaultValue' => 0,
17-
'targetingKey' => 'john-doe',
18-
'attributes' => {
19-
'not_matches_flag' => 'False'
13+
Datadog::OpenFeature::Binding::ResolutionDetails.new(
14+
value: 4,
15+
allocation_key: '4-for-john-doe',
16+
variant: '4',
17+
flag_metadata: {
18+
'allocationKey' => '4-for-john-doe',
19+
'variationType' => 'number',
20+
'doLog' => true
2021
},
21-
'result' => {
22-
'value' => 4,
23-
'variant' => '4',
24-
'flagMetadata' => {
25-
'allocationKey' => '4-for-john-doe',
26-
'variationType' => 'number',
27-
'doLog' => true
28-
}
29-
}
30-
}
22+
do_log: true
23+
)
3124
end
3225
let(:context) do
3326
instance_double(
3427
'OpenFeature::SDK::EvaluationContext',
28+
targeting_key: 'john-doe',
3529
fields: {
3630
'targeting_key' => 'john-doe',
3731
'age' => 21,
@@ -82,7 +76,7 @@
8276
context 'when context does not contain extra fields' do
8377
let(:context) do
8478
instance_double(
85-
'OpenFeature::SDK::EvaluationContext', fields: {'targeting_key' => 'john-doe'}
79+
'OpenFeature::SDK::EvaluationContext', targeting_key: 'john-doe', fields: {'targeting_key' => 'john-doe'}
8680
)
8781
end
8882
let(:expected) do

spec/datadog/open_feature/exposures/reporter_spec.rb

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,21 @@
1515
let(:deduplicator) { instance_double(Datadog::OpenFeature::Exposures::Deduplicator) }
1616
let(:context) do
1717
instance_double(
18-
'OpenFeature::SDK::EvaluationContext', fields: {'targeting_key' => 'john-doe'}
18+
'OpenFeature::SDK::EvaluationContext', targeting_key: 'john-doe', fields: {'targeting_key' => 'john-doe'}
1919
)
2020
end
2121
let(:result) do
22-
{
23-
'flag' => 'feature_flag',
24-
'targetingKey' => 'john-doe',
25-
'result' => {
26-
'value' => 4,
27-
'variant' => '4',
28-
'flagMetadata' => {
29-
'allocationKey' => '4-for-john-doe',
30-
'variationType' => 'number',
31-
'doLog' => true
32-
}
33-
}
34-
}
22+
Datadog::OpenFeature::Binding::ResolutionDetails.new(
23+
value: 4,
24+
allocation_key: '4-for-john-doe',
25+
variant: '4',
26+
flag_metadata: {
27+
'allocationKey' => '4-for-john-doe',
28+
'variationType' => 'number',
29+
'doLog' => true
30+
},
31+
do_log: true
32+
)
3533
end
3634

3735
describe '#report' do
@@ -40,7 +38,7 @@
4038

4139
it 'enqueues event' do
4240
expect(worker).to receive(:enqueue).and_return(true)
43-
expect(reporter.report(result, context: context)).to be(true)
41+
expect(reporter.report(result, flag_key: 'feature_flag', context: context)).to be(true)
4442
end
4543
end
4644

@@ -49,7 +47,7 @@
4947

5048
it 'does not enqueue event again' do
5149
expect(worker).not_to receive(:enqueue)
52-
expect(reporter.report(result, context: context)).to be(false)
50+
expect(reporter.report(result, flag_key: 'feature_flag', context: context)).to be(false)
5351
end
5452
end
5553

@@ -61,7 +59,7 @@
6159

6260
it 'returns false and logs debug message' do
6361
expect_lazy_log(logger, :debug, /OpenFeature: Reporter failed to enqueue exposure: StandardError: boom/)
64-
expect(reporter.report(result, context: context)).to be(false)
62+
expect(reporter.report(result, flag_key: 'feature_flag', context: context)).to be(false)
6563
end
6664
end
6765

@@ -86,7 +84,7 @@
8684
expect(deduplicator).not_to receive(:duplicate?)
8785
expect(worker).not_to receive(:enqueue)
8886

89-
expect(reporter.report(result, context: context)).to be(false)
87+
expect(reporter.report(result, flag_key: 'feature_flag', context: context)).to be(false)
9088
end
9189
end
9290
end

vendor/rbs/openfeature-sdk/0/openfeature-sdk.rbs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
module OpenFeature
22
module SDK
33
class EvaluationContext
4+
def targeting_key: () -> ::String?
5+
6+
def fields: () -> ::Hash[::String, untyped]
47
end
58

69
module Provider
@@ -14,7 +17,7 @@ module OpenFeature
1417
def self.new: (
1518
?value: value_t,
1619
?variant: untyped,
17-
?flag_metadata: untyped,
20+
?flag_metadata: ::Hash[untyped, untyped]?,
1821
?error_code: ErrorCode::t,
1922
?error_message: ::String,
2023
?reason: Reason::t

0 commit comments

Comments
 (0)