Skip to content

Commit 0069909

Browse files
authored
Fix feature flag model keys (#2943)
1 parent bc3ad3c commit 0069909

13 files changed

+78
-53
lines changed

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## Unreleased
4+
5+
### Fixes
6+
7+
- Fix feature flag model keys ([#2943](https://github.com/getsentry/sentry-dart/pull/2943))
8+
39
## 9.0.0-RC
410

511
### Various fixes & improvements

dart/lib/src/feature_flags_integration.dart

+4-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ class FeatureFlagsIntegration extends Integration<SentryOptions> {
1616
options.sdk.addIntegration('FeatureFlagsIntegration');
1717
}
1818

19-
FutureOr<void> addFeatureFlag(String name, bool value) async {
19+
FutureOr<void> addFeatureFlag(String flag, bool result) async {
2020
final flags =
2121
_hub?.scope.contexts[SentryFeatureFlags.type] as SentryFeatureFlags? ??
2222
SentryFeatureFlags(values: []);
@@ -26,11 +26,11 @@ class FeatureFlagsIntegration extends Integration<SentryOptions> {
2626
values.removeAt(0);
2727
}
2828

29-
final index = values.indexWhere((element) => element.name == name);
29+
final index = values.indexWhere((element) => element.flag == flag);
3030
if (index != -1) {
31-
values[index] = SentryFeatureFlag(name: name, value: value);
31+
values[index] = SentryFeatureFlag(flag: flag, result: result);
3232
} else {
33-
values.add(SentryFeatureFlag(name: name, value: value));
33+
values.add(SentryFeatureFlag(flag: flag, result: result));
3434
}
3535

3636
flags.values = values;

dart/lib/src/protocol/sentry_feature_flag.dart

+12-12
Original file line numberDiff line numberDiff line change
@@ -3,45 +3,45 @@ import 'package:meta/meta.dart';
33
import 'access_aware_map.dart';
44

55
class SentryFeatureFlag {
6-
final String name;
7-
final bool value;
6+
final String flag;
7+
final bool result;
88

99
@internal
1010
final Map<String, dynamic>? unknown;
1111

1212
SentryFeatureFlag({
13-
required this.name,
14-
required this.value,
13+
required this.flag,
14+
required this.result,
1515
this.unknown,
1616
});
1717

1818
factory SentryFeatureFlag.fromJson(Map<String, dynamic> data) {
1919
final json = AccessAwareMap(data);
2020

2121
return SentryFeatureFlag(
22-
name: json['name'],
23-
value: json['value'],
22+
flag: json['flag'],
23+
result: json['result'],
2424
unknown: json.notAccessed(),
2525
);
2626
}
2727

2828
Map<String, dynamic> toJson() {
2929
return {
3030
...?unknown,
31-
'name': name,
32-
'value': value,
31+
'flag': flag,
32+
'result': result,
3333
};
3434
}
3535

3636
@Deprecated('Assign values directly to the instance.')
3737
SentryFeatureFlag copyWith({
38-
String? name,
39-
bool? value,
38+
String? flag,
39+
bool? result,
4040
Map<String, dynamic>? unknown,
4141
}) {
4242
return SentryFeatureFlag(
43-
name: name ?? this.name,
44-
value: value ?? this.value,
43+
flag: flag ?? this.flag,
44+
result: result ?? this.result,
4545
unknown: unknown ?? this.unknown,
4646
);
4747
}

dart/lib/src/sentry.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -365,8 +365,8 @@ class Sentry {
365365
/// Returns `null` if performance is disabled in the options.
366366
static ISentrySpan? getSpan() => _hub.getSpan();
367367

368-
static Future<void> addFeatureFlag(String name, dynamic value) async {
369-
if (value is! bool) {
368+
static Future<void> addFeatureFlag(String flag, dynamic result) async {
369+
if (result is! bool) {
370370
return;
371371
}
372372

@@ -382,7 +382,7 @@ class Sentry {
382382
return;
383383
}
384384

385-
await featureFlagsIntegration.addFeatureFlag(name, value);
385+
await featureFlagsIntegration.addFeatureFlag(flag, result);
386386
}
387387

388388
@internal

dart/test/contexts_test.dart

+8-8
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ void main() {
4949

5050
final flags = SentryFeatureFlags(
5151
values: [
52-
SentryFeatureFlag(name: 'feature_flag_1', value: true),
53-
SentryFeatureFlag(name: 'feature_flag_2', value: false),
52+
SentryFeatureFlag(flag: 'feature_flag_1', result: true),
53+
SentryFeatureFlag(flag: 'feature_flag_2', result: false),
5454
],
5555
);
5656

@@ -104,8 +104,8 @@ void main() {
104104
'version': {'value': 9},
105105
'flags': {
106106
'values': [
107-
{'name': 'feature_flag_1', 'value': true},
108-
{'name': 'feature_flag_2', 'value': false},
107+
{'flag': 'feature_flag_1', 'result': true},
108+
{'flag': 'feature_flag_2', 'result': false},
109109
]
110110
},
111111
};
@@ -204,8 +204,8 @@ void main() {
204204
final contexts = Contexts();
205205
contexts.flags = SentryFeatureFlags(
206206
values: [
207-
SentryFeatureFlag(name: 'feature_flag_1', value: true),
208-
SentryFeatureFlag(name: 'feature_flag_2', value: false),
207+
SentryFeatureFlag(flag: 'feature_flag_1', result: true),
208+
SentryFeatureFlag(flag: 'feature_flag_2', result: false),
209209
],
210210
);
211211
expect(contexts.flags!.toJson(), flags.toJson());
@@ -323,8 +323,8 @@ const jsonContexts = '''
323323
"gpu": {"name": "Radeon", "version": "1"},
324324
"flags": {
325325
"values": [
326-
{"name": "feature_flag_1", "value": true},
327-
{"name": "feature_flag_2", "value": false}
326+
{"flag": "feature_flag_1", "result": true},
327+
{"flag": "feature_flag_2", "result": false}
328328
]
329329
}
330330
}

dart/test/feature_flags_integration_test.dart

+16-12
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,11 @@ void main() {
3232

3333
expect(fixture.hub.scope.contexts[SentryFeatureFlags.type], isNotNull);
3434
expect(
35-
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.first.name,
35+
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.first.flag,
3636
equals('foo'));
3737
expect(
38-
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.first.value,
38+
fixture
39+
.hub.scope.contexts[SentryFeatureFlags.type]?.values.first.result,
3940
equals(true));
4041
});
4142

@@ -49,10 +50,11 @@ void main() {
4950

5051
expect(fixture.hub.scope.contexts[SentryFeatureFlags.type], isNotNull);
5152
expect(
52-
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.first.name,
53+
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.first.flag,
5354
equals('foo'));
5455
expect(
55-
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.first.value,
56+
fixture
57+
.hub.scope.contexts[SentryFeatureFlags.type]?.values.first.result,
5658
equals(false));
5759
});
5860

@@ -69,17 +71,18 @@ void main() {
6971
equals(100));
7072

7173
expect(
72-
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.first.name,
74+
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.first.flag,
7375
equals('foo_0'));
7476
expect(
75-
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.first.value,
77+
fixture
78+
.hub.scope.contexts[SentryFeatureFlags.type]?.values.first.result,
7679
equals(true));
7780

7881
expect(
79-
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.last.name,
82+
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.last.flag,
8083
equals('foo_99'));
8184
expect(
82-
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.last.value,
85+
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.last.result,
8386
equals(false));
8487

8588
await sut.addFeatureFlag('foo_100', true);
@@ -88,17 +91,18 @@ void main() {
8891
equals(100));
8992

9093
expect(
91-
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.first.name,
94+
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.first.flag,
9295
equals('foo_1'));
9396
expect(
94-
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.first.value,
97+
fixture
98+
.hub.scope.contexts[SentryFeatureFlags.type]?.values.first.result,
9599
equals(false));
96100

97101
expect(
98-
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.last.name,
102+
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.last.flag,
99103
equals('foo_100'));
100104
expect(
101-
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.last.value,
105+
fixture.hub.scope.contexts[SentryFeatureFlags.type]?.values.last.result,
102106
equals(true));
103107
});
104108
}

dart/test/protocol/contexts_test.dart

+9-1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ void main() {
3838
culture: SentryCulture(locale: 'foo-bar'),
3939
trace: _trace,
4040
feedback: _feedback,
41+
flags: SentryFeatureFlags(values: [
42+
SentryFeatureFlag(flag: 'name', result: true),
43+
]),
4144
);
4245

4346
final _contextsJson = <String, dynamic>{
@@ -63,7 +66,12 @@ void main() {
6366
'replay_id': 'fixture-replayId',
6467
'url': 'https://fixture-url.com',
6568
'associated_event_id': '8a32c0f9be1d34a5efb2c4a10d80de9a',
66-
}
69+
},
70+
'flags': {
71+
'values': [
72+
{'flag': 'name', 'result': true}
73+
],
74+
},
6775
};
6876

6977
final _contextsMutlipleRuntimes = Contexts(

dart/test/protocol/sentry_feature_flag_tests.dart

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ import '../mocks.dart';
66

77
void main() {
88
final featureFlag = SentryFeatureFlag(
9-
name: 'feature_flag_1',
10-
value: true,
9+
flag: 'feature_flag_1',
10+
result: true,
1111
unknown: testUnknown,
1212
);
1313
final featureFlagJson = <String, dynamic>{
1414
...testUnknown,
15-
'name': 'feature_flag_1',
16-
'value': true,
15+
'flag': 'feature_flag_1',
16+
'result': true,
1717
};
1818

1919
group('json', () {

dart/test/protocol/sentry_feature_flags_tests.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import '../mocks.dart';
77
void main() {
88
final featureFlags = SentryFeatureFlags(
99
values: [
10-
SentryFeatureFlag(name: 'feature_flag_1', value: true),
11-
SentryFeatureFlag(name: 'feature_flag_2', value: false),
10+
SentryFeatureFlag(flag: 'feature_flag_1', result: true),
11+
SentryFeatureFlag(flag: 'feature_flag_2', result: false),
1212
],
1313
unknown: testUnknown,
1414
);

dart/test/scope_test.dart

+3-3
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ void main() {
440440
await scope.setContexts(
441441
SentryFeatureFlags.type,
442442
SentryFeatureFlags(
443-
values: [SentryFeatureFlag(name: 'foo', value: true)],
443+
values: [SentryFeatureFlag(flag: 'foo', result: true)],
444444
));
445445
await scope.setUser(scopeUser);
446446

@@ -456,10 +456,10 @@ void main() {
456456
expect(
457457
updatedEvent?.extra, {'e-infos': 'abc', 'company-name': 'Dart Inc'});
458458
expect(updatedEvent?.contexts['theme'], {'value': 'material'});
459-
expect(updatedEvent?.contexts[SentryFeatureFlags.type]?.values.first.name,
459+
expect(updatedEvent?.contexts[SentryFeatureFlags.type]?.values.first.flag,
460460
'foo');
461461
expect(
462-
updatedEvent?.contexts[SentryFeatureFlags.type]?.values.first.value,
462+
updatedEvent?.contexts[SentryFeatureFlags.type]?.values.first.result,
463463
true);
464464
});
465465

dart/test/sentry_test.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -313,12 +313,12 @@ void main() {
313313

314314
expect(
315315
Sentry.currentHub.scope.contexts[SentryFeatureFlags.type]?.values.first
316-
.name,
316+
.flag,
317317
equals('foo'),
318318
);
319319
expect(
320320
Sentry.currentHub.scope.contexts[SentryFeatureFlags.type]?.values.first
321-
.value,
321+
.result,
322322
equals(true),
323323
);
324324
});

firebase_remote_config/test/src/sentry_firebase_remote_config_integration_test.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ void main() {
6969

7070
expect(featureFlags, isNotNull);
7171
expect(featureFlags?.values.length, 1);
72-
expect(featureFlags?.values.first.name, 'test');
73-
expect(featureFlags?.values.first.value, true);
72+
expect(featureFlags?.values.first.flag, 'test');
73+
expect(featureFlags?.values.first.result, true);
7474
});
7575

7676
test('stream canceld on close', () async {

flutter/example/lib/main.dart

+7
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,13 @@ class MainScaffold extends StatelessWidget {
520520
'Demonstrates the logging integration. log.info() will create an info event send it to Sentry.',
521521
buttonTitle: 'Logging',
522522
),
523+
TooltipButton(
524+
onPressed: () {
525+
Sentry.addFeatureFlag('feature-one', true);
526+
},
527+
text: 'Demonstrates the feature flags.',
528+
buttonTitle: 'Add "feature-one" flag',
529+
),
523530
if (UniversalPlatform.isIOS || UniversalPlatform.isMacOS)
524531
const CocoaExample(),
525532
if (UniversalPlatform.isAndroid) const AndroidExample(),

0 commit comments

Comments
 (0)