From 8e9bb10bcd029bb7be51870aced276c86591b03f Mon Sep 17 00:00:00 2001 From: Amir Jabbari Date: Tue, 27 May 2025 16:55:50 +0330 Subject: [PATCH] refactor: rename BaseEvent methods `getName` and `getProperties` to getters `name` and `properties` This commit refactors the `BaseEvent` class by changing the methods `getName()` and `getProperties()` to getters `name` and `properties` respectively. This change simplifies the API for accessing event data. All usages of these methods across the codebase, including in tests, examples, and internal logic, have been updated to use the new getter syntax. Additionally, the example project's pubspec.lock has been updated. --- README.md | 108 +++++++++--------- example/lib/events/app_events.dart | 20 ++-- example/lib/events/business_events.dart | 16 +-- example/lib/events/user_events.dart | 20 ++-- example/lib/screens/home_screen.dart | 10 +- example/lib/screens/setting_screen.dart | 2 +- example/lib/trackers/amplitude_tracker.dart | 6 +- example/lib/trackers/custom_api_tracker.dart | 4 +- example/lib/trackers/firebase_tracker.dart | 6 +- example/lib/trackers/mixpanel_tracker.dart | 6 +- example/lib/utils/gdpr_manager.dart | 4 +- example/pubspec.lock | 2 +- lib/src/core/event_processor.dart | 8 +- lib/src/models/event/base_event.dart | 10 +- lib/src/models/routing/routing_rule.dart | 7 +- lib/src/routing/routing_engine.dart | 12 +- lib/src/strategies/base_tracker_strategy.dart | 4 +- .../strategies/built_in/console_tracker.dart | 12 +- test/core/event_processor_test.dart | 8 +- test/core/flex_track_test.dart | 22 ++-- test/core/tracker_registry_test.dart | 4 +- test/models/routing/routing_config_test.dart | 22 ++-- .../routing/routing_config_test.mocks.dart | 2 +- test/routing/presets/smart_defaults_test.dart | 16 +-- test/routing/route_config_builder_test.dart | 8 +- test/routing/routing_builder_test.dart | 4 +- test/routing/routing_engine_test.dart | 44 +++---- test/routing/routing_rule_builder_test.dart | 4 +- .../base_tracker_strategy_test.dart | 6 +- .../base_tracker_strategy_test.mocks.dart | 2 +- test/test_utils/mock_events.dart | 4 +- 31 files changed, 201 insertions(+), 202 deletions(-) diff --git a/README.md b/README.md index a9b73ba..7a494aa 100644 --- a/README.md +++ b/README.md @@ -216,10 +216,10 @@ class UserSignupEvent extends BaseEvent { }); @override - String getName() => 'user_signup'; + String get name => 'user_signup'; @override - Map getProperties() => { + Map get properties => { 'signup_method': method, 'accepted_marketing': acceptedMarketing, 'timestamp': DateTime.now().millisecondsSinceEpoch, @@ -245,10 +245,10 @@ class PurchaseEvent extends BaseEvent { }); @override - String getName() => 'purchase'; + String get name => 'purchase'; @override - Map getProperties() => { + Map get properties => { 'product_id': productId, 'amount': amount, 'currency': currency, @@ -272,10 +272,10 @@ class ButtonClickEvent extends BaseEvent { }); @override - String getName() => 'button_click'; + String get name => 'button_click'; @override - Map getProperties() => { + Map get properties => { 'button_id': buttonId, 'screen_name': screenName, }; @@ -412,8 +412,8 @@ class FirebaseTracker extends BaseTrackerStrategy { @override Future doTrack(BaseEvent event) async { await _analytics.logEvent( - name: event.getName(), - parameters: _convertProperties(event.getProperties()), + name: event.name, + parameters: _convertProperties(event.properties), ); } @@ -489,7 +489,7 @@ class MixpanelTracker extends BaseTrackerStrategy { @override Future doTrack(BaseEvent event) async { - _mixpanel.track(event.getName(), properties: event.getProperties()); + _mixpanel.track(event.name, properties: event.properties); } @override @@ -559,8 +559,8 @@ class CustomAPITracker extends BaseTrackerStrategy { @override Future doTrack(BaseEvent event) async { final payload = { - 'event_name': event.getName(), - 'properties': event.getProperties(), + 'event_name': event.name, + 'properties': event.properties, 'timestamp': DateTime.now().toIso8601String(), 'category': event.category?.name, }; @@ -1166,7 +1166,7 @@ See exactly how your events are being routed: final event = PurchaseEvent(productId: 'abc', amount: 99.99); final debugInfo = FlexTrack.debugEvent(event); -print('Event: ${debugInfo.event.getName()}'); +print('Event: ${debugInfo.event.name}'); print('Target trackers: ${debugInfo.routingResult.targetTrackers}'); print('Applied rules: ${debugInfo.routingResult.appliedRules.length}'); print('Skipped rules: ${debugInfo.routingResult.skippedRules.length}'); @@ -1301,9 +1301,9 @@ void main() { expect(mockTracker.capturedEvents, hasLength(1)); final event = mockTracker.capturedEvents.first; - expect(event.getName(), equals('user_signup')); + expect(event.name, equals('user_signup')); - final properties = event.getProperties(); + final properties = event.properties; expect(properties?['signup_method'], equals('email')); }); @@ -1318,9 +1318,9 @@ void main() { expect(mockTracker.capturedEvents, hasLength(1)); final event = mockTracker.capturedEvents.first; - expect(event.getName(), equals('purchase')); - expect(event.getProperties()?['amount'], equals(99.99)); - expect(event.getProperties()?['product_id'], equals('test_product')); + expect(event.name, equals('purchase')); + expect(event.properties?['amount'], equals(99.99)); + expect(event.properties?['product_id'], equals('test_product')); }); testWidgets('should not track when disabled', (tester) async { @@ -1418,7 +1418,7 @@ testWidgets('complete user signup flow', (tester) async { expect(mockTracker.capturedEvents.length, greaterThan(0)); final signupEvent = mockTracker.capturedEvents.firstWhere( - (event) => event.getName() == 'user_signup', + (event) => event.name == 'user_signup', ); expect(signupEvent, isNotNull); @@ -1602,17 +1602,17 @@ class MyTracker extends BaseTrackerStrategy { // ❌ WRONG: Not handling errors @override Future doTrack(BaseEvent event) async { - await myAPI.send(event.getName()); // What if this fails? + await myAPI.send(event.name); // What if this fails? } // ✅ CORRECT: Handle errors gracefully @override Future doTrack(BaseEvent event) async { try { - await myAPI.send(event.getName()); + await myAPI.send(event.name); } catch (e) { // Log error but don't crash the app - print('Failed to track ${event.getName()}: $e'); + print('Failed to track ${event.name}: $e'); // FlexTrack will handle the TrackerException } } @@ -1732,10 +1732,10 @@ class ProductViewEvent extends BaseEvent { }); @override - String getName() => 'product_view'; + String get name => 'product_view'; @override - Map getProperties() => { + Map get properties => { 'product_id': productId, 'product_name': productName, 'price': price, @@ -1762,10 +1762,10 @@ class PurchaseCompleteEvent extends BaseEvent { }); @override - String getName() => 'purchase_complete'; + String get name => 'purchase_complete'; @override - Map getProperties() => { + Map get properties => { 'order_id': orderId, 'total_amount': totalAmount, 'currency': currency, @@ -1891,10 +1891,10 @@ class FeatureUsageEvent extends BaseEvent { }); @override - String getName() => 'feature_usage'; + String get name => 'feature_usage'; @override - Map getProperties() => { + Map get properties => { 'feature_name': featureName, 'time_spent_seconds': timeSpentSeconds, 'is_first_time': isFirstTime, @@ -1921,10 +1921,10 @@ class SubscriptionChangeEvent extends BaseEvent { }); @override - String getName() => 'subscription_change'; + String get name => 'subscription_change'; @override - Map getProperties() => { + Map get properties => { 'plan_from': planFrom, 'plan_to': planTo, 'price_change': priceChange, @@ -2064,10 +2064,10 @@ await FlexTrack.track(PurchaseEvent( ```dart class MyEvent extends BaseEvent { @override - String getName() => 'my_event'; // Required + String get name => 'my_event'; // Required @override - Map getProperties() => {}; // Required + Map get properties => {}; // Required @override EventCategory? get category => EventCategory.user; // Recommended @@ -2197,7 +2197,7 @@ class TenantAwareTracker extends BaseTrackerStrategy { @override Future doTrack(BaseEvent event) async { - final tenantId = event.getProperties()?['tenant_id'] as String?; + final tenantId = event.properties?['tenant_id'] as String?; if (tenantId == null) return; final config = _tenantConfigs[tenantId]; @@ -2247,10 +2247,10 @@ class ExperimentEvent extends BaseEvent { }); @override - String getName() => 'experiment_outcome'; + String get name => 'experiment_outcome'; @override - Map getProperties() => { + Map get properties => { 'experiment_id': experimentId, 'variant': variant, 'outcome': outcome, @@ -2301,8 +2301,8 @@ class WebSocketTracker extends BaseTrackerStrategy { final payload = { 'type': 'analytics_event', - 'event': event.getName(), - 'properties': event.getProperties(), + 'event': event.name, + 'properties': event.properties, 'timestamp': DateTime.now().toIso8601String(), }; @@ -2364,8 +2364,8 @@ class RESTAPITracker extends BaseTrackerStrategy { @override Future doTrack(BaseEvent event) async { final eventData = { - 'name': event.getName(), - 'properties': event.getProperties(), + 'name': event.name, + 'properties': event.properties, 'timestamp': event.timestamp.toIso8601String(), 'category': event.category?.name, }; @@ -2488,8 +2488,8 @@ class DatabaseTracker extends BaseTrackerStrategy { @override Future doTrack(BaseEvent event) async { await _database.insert('events', { - 'name': event.getName(), - 'properties': jsonEncode(event.getProperties()), + 'name': event.name, + 'properties': jsonEncode(event.properties), 'category': event.category?.name, 'timestamp': event.timestamp.toIso8601String(), }); @@ -2669,9 +2669,9 @@ void main() { ]; for (final event in testEvents) { - expect(event.getName(), isNotEmpty); - expect(event.getName(), matches(RegExp(r'^[a-z_]+))); - expect(event.getName().length, lessThan(50)); + expect(event.name, isNotEmpty); + expect(event.name, matches(RegExp(r'^[a-z_]+))); + expect(event.name.length, lessThan(50)); } }); @@ -2682,7 +2682,7 @@ void main() { ]; for (final event in testEvents) { - final properties = event.getProperties(); + final properties = event.properties; if (properties != null) { // Should be JSON serializable expect(() => jsonEncode(properties), returnsNormally); @@ -2776,7 +2776,7 @@ class SanitizingTracker extends BaseTrackerStrategy { @override Future doTrack(BaseEvent event) async { - final sanitizedProperties = _sanitizeProperties(event.getProperties()); + final sanitizedProperties = _sanitizeProperties(event.properties); // Create sanitized event final sanitizedEvent = SanitizedEvent( @@ -2836,10 +2836,10 @@ class RevenueAttributionEvent extends BaseEvent { }); @override - String getName() => 'revenue_attribution'; + String get name => 'revenue_attribution'; @override - Map getProperties() => { + Map get properties => { 'revenue': revenue, 'currency': currency, 'source': source, @@ -2897,10 +2897,10 @@ class CLVUpdateEvent extends BaseEvent { }); @override - String getName() => 'clv_update'; + String get name => 'clv_update'; @override - Map getProperties() => { + Map get properties => { 'user_id': userId, 'current_clv': currentCLV, 'previous_clv': previousCLV, @@ -2967,13 +2967,13 @@ void main() async { // ✅ GOOD: Clear, descriptive names class UserCompletedPurchaseEvent extends BaseEvent { @override - String getName() => 'user_completed_purchase'; + String get name => 'user_completed_purchase'; } // ❌ BAD: Vague or abbreviated names class UCPEvent extends BaseEvent { @override - String getName() => 'ucp'; + String get name => 'ucp'; } ``` @@ -2983,17 +2983,17 @@ class UCPEvent extends BaseEvent { // ✅ GOOD: Consistent naming patterns class UserRegistrationStartedEvent extends BaseEvent { @override - String getName() => 'user_registration_started'; + String get name => 'user_registration_started'; } class UserRegistrationCompletedEvent extends BaseEvent { @override - String getName() => 'user_registration_completed'; + String get name => 'user_registration_completed'; } class UserRegistrationAbandonedEvent extends BaseEvent { @override - String getName() => 'user_registration_abandoned'; + String get name => 'user_registration_abandoned'; } ``` diff --git a/example/lib/events/app_events.dart b/example/lib/events/app_events.dart index 569008b..ebaf130 100644 --- a/example/lib/events/app_events.dart +++ b/example/lib/events/app_events.dart @@ -15,10 +15,10 @@ class AppStartEvent extends BaseEvent { platform = platform ?? 'unknown'; @override - String getName() => 'app_start'; + String get name => 'app_start'; @override - Map getProperties() => { + Map get properties => { 'app_version': appVersion, 'build_number': buildNumber, 'platform': platform, @@ -49,10 +49,10 @@ class PageViewEvent extends BaseEvent { }) : timestamp = timestamp ?? DateTime.now(); @override - String getName() => 'page_view'; + String get name => 'page_view'; @override - Map getProperties() => { + Map get properties => { 'page_name': pageName, if (parameters != null) 'parameters': parameters!, 'timestamp': timestamp.millisecondsSinceEpoch, @@ -78,10 +78,10 @@ class ButtonClickEvent extends BaseEvent { }); @override - String getName() => 'button_click'; + String get name => 'button_click'; @override - Map getProperties() => { + Map get properties => { 'button_id': buttonId, 'button_text': buttonText, if (screenName != null) 'screen_name': screenName!, @@ -110,10 +110,10 @@ class ErrorEvent extends BaseEvent { }); @override - String getName() => 'error'; + String get name => 'error'; @override - Map getProperties() => { + Map get properties => { 'error_type': errorType, 'error_message': errorMessage, if (stackTrace != null) 'stack_trace': stackTrace!, @@ -146,10 +146,10 @@ class PerformanceEvent extends BaseEvent { }); @override - String getName() => 'performance_metric'; + String get name => 'performance_metric'; @override - Map getProperties() => { + Map get properties => { 'metric_name': metricName, 'value': value, 'unit': unit, diff --git a/example/lib/events/business_events.dart b/example/lib/events/business_events.dart index 6e2970c..d4dda42 100644 --- a/example/lib/events/business_events.dart +++ b/example/lib/events/business_events.dart @@ -21,10 +21,10 @@ class PurchaseEvent extends BaseEvent { }); @override - String getName() => 'purchase'; + String get name => 'purchase'; @override - Map getProperties() => { + Map get properties => { 'product_id': productId, 'product_name': productName, 'amount': amount, @@ -62,10 +62,10 @@ class CartAbandonmentEvent extends BaseEvent { }); @override - String getName() => 'cart_abandonment'; + String get name => 'cart_abandonment'; @override - Map getProperties() => { + Map get properties => { 'product_ids': productIds, 'total_value': totalValue, 'currency': currency, @@ -98,10 +98,10 @@ class AddToCartEvent extends BaseEvent { }); @override - String getName() => 'add_to_cart'; + String get name => 'add_to_cart'; @override - Map getProperties() => { + Map get properties => { 'product_id': productId, 'product_name': productName, 'price': price, @@ -133,10 +133,10 @@ class SubscriptionEvent extends BaseEvent { }); @override - String getName() => 'subscription_$action'; + String get name => 'subscription_$action'; @override - Map getProperties() => { + Map get properties => { 'plan_id': planId, 'plan_name': planName, 'price': price, diff --git a/example/lib/events/user_events.dart b/example/lib/events/user_events.dart index 85a403a..130cdb2 100644 --- a/example/lib/events/user_events.dart +++ b/example/lib/events/user_events.dart @@ -13,10 +13,10 @@ class UserRegistrationEvent extends BaseEvent { }); @override - String getName() => 'user_registration'; + String get name => 'user_registration'; @override - Map getProperties() => { + Map get properties => { 'registration_method': registrationMethod, 'accepted_terms': hasAcceptedTerms, 'accepted_marketing': hasAcceptedMarketing, @@ -44,10 +44,10 @@ class UserLoginEvent extends BaseEvent { }); @override - String getName() => 'user_login'; + String get name => 'user_login'; @override - Map getProperties() => { + Map get properties => { 'login_method': loginMethod, 'is_first_login': isFirstLogin, 'timestamp': timestamp.millisecondsSinceEpoch, @@ -71,10 +71,10 @@ class UserProfileUpdateEvent extends BaseEvent { }); @override - String getName() => 'user_profile_update'; + String get name => 'user_profile_update'; @override - Map getProperties() => { + Map get properties => { 'updated_fields': updatedFields, 'is_complete': isComplete, 'field_count': updatedFields.length, @@ -103,10 +103,10 @@ class FeatureUsageEvent extends BaseEvent { }); @override - String getName() => 'feature_usage'; + String get name => 'feature_usage'; @override - Map getProperties() => { + Map get properties => { 'feature_name': featureName, 'action': action, if (duration != null) 'duration_seconds': duration!, @@ -137,10 +137,10 @@ class UserEngagementEvent extends BaseEvent { }); @override - String getName() => 'user_engagement'; + String get name => 'user_engagement'; @override - Map getProperties() => { + Map get properties => { 'engagement_type': engagementType, if (sessionDuration != null) 'session_duration_seconds': sessionDuration!, diff --git a/example/lib/screens/home_screen.dart b/example/lib/screens/home_screen.dart index 4e5f96a..16cfac8 100644 --- a/example/lib/screens/home_screen.dart +++ b/example/lib/screens/home_screen.dart @@ -524,7 +524,7 @@ class _AdditionalDemoSection extends StatelessWidget { final routingResults = testEvents.map((event) { final debug = FlexTrack.debugEvent(event); return { - 'event': event.getName(), + 'event': event.name, 'category': event.category?.name ?? 'none', 'trackers': debug.routingResult.targetTrackers, 'rules': debug.routingResult.appliedRules.length, @@ -581,10 +581,10 @@ class HighVolumeTestEvent extends BaseEvent { }); @override - String getName() => 'high_volume_test'; + String get name => 'high_volume_test'; @override - Map getProperties() => { + Map get properties => { 'sequence_number': sequenceNumber, 'batch_id': batchId, 'timestamp': timestamp.millisecondsSinceEpoch, @@ -661,10 +661,10 @@ class DebugEvent extends BaseEvent { }); @override - String getName() => 'debug_event'; + String get name => 'debug_event'; @override - Map getProperties() => { + Map get properties => { 'debug_info': debugInfo, 'level': level, 'timestamp': timestamp.millisecondsSinceEpoch, diff --git a/example/lib/screens/setting_screen.dart b/example/lib/screens/setting_screen.dart index 8433e44..9c5240e 100644 --- a/example/lib/screens/setting_screen.dart +++ b/example/lib/screens/setting_screen.dart @@ -491,7 +491,7 @@ class _SettingsScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - Text('Event: ${testEvent.getName()}'), + Text('Event: ${testEvent.name}'), SizedBox(height: 8), Text( 'Target Trackers: ${debugInfo.routingResult.targetTrackers.join(', ')}'), diff --git a/example/lib/trackers/amplitude_tracker.dart b/example/lib/trackers/amplitude_tracker.dart index c5a9898..ed6b916 100644 --- a/example/lib/trackers/amplitude_tracker.dart +++ b/example/lib/trackers/amplitude_tracker.dart @@ -36,7 +36,7 @@ class AmplitudeTracker extends BaseTrackerStrategy { @override Future doTrack(BaseEvent event) async { - final properties = event.getProperties() ?? {}; + final properties = event.properties ?? {}; // Add event metadata for Amplitude final enhancedProperties = { @@ -49,11 +49,11 @@ class AmplitudeTracker extends BaseTrackerStrategy { // In real implementation: // await Amplitude.getInstance().logEvent( - // event.getName(), + // event.name, // eventProperties: enhancedProperties, // ); - debugPrint('📊 Amplitude tracking: ${event.getName()} $enhancedProperties'); + debugPrint('📊 Amplitude tracking: ${event.name} $enhancedProperties'); // Handle revenue events if (event is PurchaseEvent) { diff --git a/example/lib/trackers/custom_api_tracker.dart b/example/lib/trackers/custom_api_tracker.dart index 7f4c06f..54b2b84 100644 --- a/example/lib/trackers/custom_api_tracker.dart +++ b/example/lib/trackers/custom_api_tracker.dart @@ -91,8 +91,8 @@ class CustomAPITracker extends BaseTrackerStrategy { final payload = { 'events': eventsToSend .map((event) => { - 'name': event.getName(), - 'properties': event.getProperties(), + 'name': event.name, + 'properties': event.properties, 'timestamp': event.timestamp.toIso8601String(), 'category': event.category?.name, 'contains_pii': event.containsPII, diff --git a/example/lib/trackers/firebase_tracker.dart b/example/lib/trackers/firebase_tracker.dart index 84e66df..5514e69 100644 --- a/example/lib/trackers/firebase_tracker.dart +++ b/example/lib/trackers/firebase_tracker.dart @@ -43,12 +43,12 @@ class FirebaseTracker extends BaseTrackerStrategy { Future doTrack(BaseEvent event) async { // In real implementation: // await _analytics.logEvent( - // name: event.getName(), - // parameters: _convertProperties(event.getProperties()), + // name: event.name, + // parameters: _convertProperties(event.properties), // ); debugPrint( - '🔥 Firebase tracking: ${event.getName()} ${event.getProperties()}'); + '🔥 Firebase tracking: ${event.name} ${event.properties}'); // Handle special business events if (event is PurchaseEvent) { diff --git a/example/lib/trackers/mixpanel_tracker.dart b/example/lib/trackers/mixpanel_tracker.dart index 68c6c56..53813b5 100644 --- a/example/lib/trackers/mixpanel_tracker.dart +++ b/example/lib/trackers/mixpanel_tracker.dart @@ -47,7 +47,7 @@ class MixpanelTracker extends BaseTrackerStrategy { @override Future doTrack(BaseEvent event) async { - final properties = event.getProperties() ?? {}; + final properties = event.properties ?? {}; // Add event metadata final enhancedProperties = { @@ -59,9 +59,9 @@ class MixpanelTracker extends BaseTrackerStrategy { }; // In real implementation: - // _mixpanel.track(event.getName(), properties: enhancedProperties); + // _mixpanel.track(event.name, properties: enhancedProperties); - debugPrint('🎯 Mixpanel tracking: ${event.getName()} $enhancedProperties'); + debugPrint('🎯 Mixpanel tracking: ${event.name} $enhancedProperties'); // Handle special events if (event is PurchaseEvent) { diff --git a/example/lib/utils/gdpr_manager.dart b/example/lib/utils/gdpr_manager.dart index cdf90a5..eb387d7 100644 --- a/example/lib/utils/gdpr_manager.dart +++ b/example/lib/utils/gdpr_manager.dart @@ -242,10 +242,10 @@ class ConsentChangeEvent extends BaseEvent { }); @override - String getName() => 'consent_change'; + String get name => 'consent_change'; @override - Map getProperties() => { + Map get properties => { 'general_consent': hasGeneralConsent, 'pii_consent': hasPIIConsent, 'marketing_consent': hasMarketingConsent, diff --git a/example/pubspec.lock b/example/pubspec.lock index d984f66..d048d04 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -143,7 +143,7 @@ packages: path: ".." relative: true source: path - version: "0.1.0" + version: "0.1.1" flutter: dependency: "direct main" description: flutter diff --git a/lib/src/core/event_processor.dart b/lib/src/core/event_processor.dart index d7b86c0..bbde3b1 100644 --- a/lib/src/core/event_processor.dart +++ b/lib/src/core/event_processor.dart @@ -106,7 +106,7 @@ class EventProcessor { error: TrackerException( 'Tracker not found: $trackerId', trackerId: trackerId, - eventName: event.getName(), + eventName: event.name, code: 'NOT_FOUND', ), )); @@ -120,7 +120,7 @@ class EventProcessor { error: TrackerException( 'Tracker is disabled: $trackerId', trackerId: trackerId, - eventName: event.getName(), + eventName: event.name, code: 'DISABLED', ), )); @@ -143,7 +143,7 @@ class EventProcessor { : TrackerException( 'Failed to track event: $e', trackerId: trackerId, - eventName: event.getName(), + eventName: event.name, originalError: e, ), )); @@ -258,7 +258,7 @@ class EventProcessingResult { @override String toString() { return 'EventProcessingResult(' - 'event: ${event.getName()}, ' + 'event: ${event.name}, ' 'routed: $wasRouted, ' 'tracked: $wasTracked, ' 'successful: $successfulTrackingCount/${trackingResults.length}' diff --git a/lib/src/models/event/base_event.dart b/lib/src/models/event/base_event.dart index f2e0adf..041784c 100644 --- a/lib/src/models/event/base_event.dart +++ b/lib/src/models/event/base_event.dart @@ -3,10 +3,10 @@ import 'package:flex_track/src/models/routing/tracker_group.dart'; abstract class BaseEvent { /// Returns the name of the event - String getName(); + String get name; /// Returns the properties associated with the event - Map? getProperties(); + Map? get properties; /// Optional category for automatic routing /// Override this in subclasses to enable category-based routing @@ -47,8 +47,8 @@ abstract class BaseEvent { /// Useful for debugging and serialization Map toMap() { return { - 'name': getName(), - 'properties': getProperties(), + 'name': name, + 'properties': properties, 'category': category?.name, 'preferredGroup': preferredGroup?.name, 'containsPII': containsPII, @@ -63,6 +63,6 @@ abstract class BaseEvent { @override String toString() { - return 'Event(${getName()}${category != null ? ', category: ${category!.name}' : ''})'; + return 'Event($name${category != null ? ', category: ${category!.name}' : ''})'; } } diff --git a/lib/src/models/routing/routing_rule.dart b/lib/src/models/routing/routing_rule.dart index 2e8ab43..8e4bfa1 100644 --- a/lib/src/models/routing/routing_rule.dart +++ b/lib/src/models/routing/routing_rule.dart @@ -60,13 +60,12 @@ class RoutingRule { } // Check event name pattern (contains check) - if (eventNamePattern != null && - !event.getName().contains(eventNamePattern!)) { + if (eventNamePattern != null && !event.name.contains(eventNamePattern!)) { return false; } // Check regex pattern - if (eventNameRegex != null && !eventNameRegex!.hasMatch(event.getName())) { + if (eventNameRegex != null && !eventNameRegex!.hasMatch(event.name)) { return false; } @@ -77,7 +76,7 @@ class RoutingRule { // Check property existence and value if (hasProperty != null) { - final props = event.getProperties(); + final props = event.properties; if (props == null || !props.containsKey(hasProperty)) { return false; } diff --git a/lib/src/routing/routing_engine.dart b/lib/src/routing/routing_engine.dart index 02aa6c5..8d86a17 100644 --- a/lib/src/routing/routing_engine.dart +++ b/lib/src/routing/routing_engine.dart @@ -99,8 +99,8 @@ class RoutingEngine { ); } catch (e, stackTrace) { throw RoutingException( - 'Failed to route event ${event.getName()}: $e', - eventName: event.getName(), + 'Failed to route event ${event.name}: $e', + eventName: event.name, originalError: e, stackTrace: stackTrace, ); @@ -183,15 +183,15 @@ class RoutingEngine { } if (rule.eventNamePattern != null && - !event.getName().contains(rule.eventNamePattern!)) { + !event.name.contains(rule.eventNamePattern!)) { reasons.add( - 'Event name pattern mismatch: "${event.getName()}" does not contain "${rule.eventNamePattern}"'); + 'Event name pattern mismatch: "${event.name}" does not contain "${rule.eventNamePattern}"'); } if (rule.eventNameRegex != null && - !rule.eventNameRegex!.hasMatch(event.getName())) { + !rule.eventNameRegex!.hasMatch(event.name)) { reasons.add( - 'Event name regex mismatch: "${event.getName()}" does not match /${rule.eventNameRegex!.pattern}/'); + 'Event name regex mismatch: "${event.name}" does not match /${rule.eventNameRegex!.pattern}/'); } if (rule.category != null && event.category != rule.category) { diff --git a/lib/src/strategies/base_tracker_strategy.dart b/lib/src/strategies/base_tracker_strategy.dart index cc22b31..47994cc 100644 --- a/lib/src/strategies/base_tracker_strategy.dart +++ b/lib/src/strategies/base_tracker_strategy.dart @@ -66,9 +66,9 @@ abstract class BaseTrackerStrategy implements TrackerStrategy { await doTrack(event); } catch (e) { throw TrackerException( - 'Failed to track event ${event.getName()} with tracker $_id: $e', + 'Failed to track event ${event.name} with tracker $_id: $e', trackerId: _id, - eventName: event.getName(), + eventName: event.name, originalError: e, ); } diff --git a/lib/src/strategies/built_in/console_tracker.dart b/lib/src/strategies/built_in/console_tracker.dart index 0b85ca1..e1dbe19 100644 --- a/lib/src/strategies/built_in/console_tracker.dart +++ b/lib/src/strategies/built_in/console_tracker.dart @@ -59,7 +59,7 @@ class ConsoleTracker extends BaseTrackerStrategy { buffer.write('$_prefix: '); // Add event name - buffer.write(event.getName()); + buffer.write(event.name); // Add category if available if (event.category != null) { @@ -78,8 +78,8 @@ class ConsoleTracker extends BaseTrackerStrategy { _log(buffer.toString()); // Show properties if enabled - if (_showProperties && event.getProperties() != null) { - final properties = event.getProperties()!; + if (_showProperties && event.properties != null) { + final properties = event.properties!; if (properties.isNotEmpty) { _log(' Properties: ${_formatProperties(properties)}', indent: 2); } @@ -109,7 +109,7 @@ class ConsoleTracker extends BaseTrackerStrategy { _eventHistory.add(event); final buffer = StringBuffer(); - buffer.write(' ${i + 1}. ${event.getName()}'); + buffer.write(' ${i + 1}. ${event.name}'); if (event.category != null) { buffer.write(' (${event.category!.name})'); @@ -121,8 +121,8 @@ class ConsoleTracker extends BaseTrackerStrategy { _log(buffer.toString()); - if (_showProperties && event.getProperties() != null) { - final properties = event.getProperties()!; + if (_showProperties && event.properties != null) { + final properties = event.properties!; if (properties.isNotEmpty) { _log(' Props: ${_formatProperties(properties, compact: true)}', indent: 6); diff --git a/test/core/event_processor_test.dart b/test/core/event_processor_test.dart index 2b4068d..72aac43 100644 --- a/test/core/event_processor_test.dart +++ b/test/core/event_processor_test.dart @@ -223,7 +223,7 @@ void main() { final stringResult = result.toString(); expect(stringResult, contains('EventProcessingResult')); - expect(stringResult, contains(event.getName())); + expect(stringResult, contains(event.name)); expect(stringResult, contains('routed: true')); expect(stringResult, contains('tracked: true')); expect(stringResult, contains('successful: 1/1')); @@ -302,10 +302,10 @@ class _TestEvent extends BaseEvent { _TestEvent(this.eventName); @override - String getName() => eventName; + String get name => eventName; @override - Map? getProperties() => {'test': 'value'}; + Map? get properties => {'test': 'value'}; } class _NonTrackerExceptionTracker extends BaseTrackerStrategy { @@ -339,7 +339,7 @@ class _TrackerExceptionTracker extends BaseTrackerStrategy { throw TrackerException( 'Custom tracker error', trackerId: id, - eventName: event.getName(), + eventName: event.name, ); } } diff --git a/test/core/flex_track_test.dart b/test/core/flex_track_test.dart index 051164d..6d560e9 100644 --- a/test/core/flex_track_test.dart +++ b/test/core/flex_track_test.dart @@ -8,10 +8,10 @@ class TestEvent extends BaseEvent { TestEvent({required this.testProperty}); @override - String getName() => 'test_event'; + String get name => 'test_event'; @override - Map getProperties() => {'test_property': testProperty}; + Map get properties => {'test_property': testProperty}; } class PurchaseTestEvent extends BaseEvent { @@ -20,10 +20,10 @@ class PurchaseTestEvent extends BaseEvent { PurchaseTestEvent({required this.amount}); @override - String getName() => 'purchase'; + String get name => 'purchase'; @override - Map getProperties() => {'amount': amount}; + Map get properties => {'amount': amount}; @override EventCategory get category => EventCategory.business; @@ -34,10 +34,10 @@ class PurchaseTestEvent extends BaseEvent { class DebugTestEvent extends BaseEvent { @override - String getName() => 'debug_test'; + String get name => 'debug_test'; @override - Map? getProperties() => null; + Map? get properties => null; @override EventCategory get category => EventCategory.technical; @@ -49,10 +49,10 @@ class PIITestEvent extends BaseEvent { PIITestEvent({required this.email}); @override - String getName() => 'user_data'; + String get name => 'user_data'; @override - Map getProperties() => {'email': email}; + Map get properties => {'email': email}; @override bool get containsPII => true; @@ -63,10 +63,10 @@ class PIITestEvent extends BaseEvent { class EssentialTestEvent extends BaseEvent { @override - String getName() => 'system_essential'; + String get name => 'system_essential'; @override - Map? getProperties() => null; + Map? get properties => null; @override bool get isEssential => true; @@ -124,7 +124,7 @@ void main() { expect(mockTracker1.capturedEvents, hasLength(1)); expect(mockTracker2.capturedEvents, hasLength(1)); expect( - mockTracker1.capturedEvents.first.getName(), equals('test_event')); + mockTracker1.capturedEvents.first.name, equals('test_event')); }); test('should track multiple events', () async { diff --git a/test/core/tracker_registry_test.dart b/test/core/tracker_registry_test.dart index 68db255..2afc051 100644 --- a/test/core/tracker_registry_test.dart +++ b/test/core/tracker_registry_test.dart @@ -392,8 +392,8 @@ void main() { class FakeBaseEvent extends Fake implements BaseEvent { @override - String getName() => 'FakeEvent'; + String get name => 'FakeEvent'; @override - Map? getProperties() => {}; + Map? get properties => {}; } diff --git a/test/models/routing/routing_config_test.dart b/test/models/routing/routing_config_test.dart index 97c561d..767e033 100644 --- a/test/models/routing/routing_config_test.dart +++ b/test/models/routing/routing_config_test.dart @@ -60,7 +60,7 @@ void main() { id: 'rule3', priority: 15, targetGroup: TrackerGroup.all); final config = RoutingConfiguration(rules: [rule1, rule2, rule3]); final event = MockBaseEvent(); - when(event.getName()).thenReturn('test_event'); + when(event.name).thenReturn('test_event'); final matchingRules = config.getMatchingRules(event); expect(matchingRules, @@ -74,7 +74,7 @@ void main() { id: 'default', isDefault: true, targetGroup: TrackerGroup.all); final config = RoutingConfiguration(rules: [defaultRule]); final event = MockBaseEvent(); - when(event.getName()).thenReturn('non_matching_event'); + when(event.name).thenReturn('non_matching_event'); final matchingRules = config.getMatchingRules(event); expect(matchingRules, [defaultRule]); @@ -86,7 +86,7 @@ void main() { final config = RoutingConfiguration(rules: [], defaultGroup: TrackerGroup.all); final event = MockBaseEvent(); - when(event.getName()).thenReturn('non_matching_event'); + when(event.name).thenReturn('non_matching_event'); final matchingRules = config.getMatchingRules(event); expect(matchingRules.length, 1); @@ -100,7 +100,7 @@ void main() { () { final config = RoutingConfiguration.empty(); final event = MockBaseEvent(); - when(event.getName()).thenReturn('non_matching_event'); + when(event.name).thenReturn('non_matching_event'); expect(config.getMatchingRules(event), isEmpty); }); @@ -112,7 +112,7 @@ void main() { final config = RoutingConfiguration( rules: [debugRule, normalRule], isDebugMode: false); final event = MockBaseEvent(); - when(event.getName()).thenReturn('test_event'); + when(event.name).thenReturn('test_event'); final matchingRules = config.getMatchingRules(event); expect(matchingRules, contains(normalRule)); @@ -127,7 +127,7 @@ void main() { final config = RoutingConfiguration( rules: [debugRule, normalRule], isDebugMode: true); final event = MockBaseEvent(); - when(event.getName()).thenReturn('test_event'); + when(event.name).thenReturn('test_event'); final matchingRules = config.getMatchingRules(event); expect(matchingRules, contains(normalRule)); @@ -143,7 +143,7 @@ void main() { id: 'rule2', priority: 5, targetGroup: TrackerGroup.all); final config = RoutingConfiguration(rules: [rule1, rule2]); final event = MockBaseEvent(); - when(event.getName()).thenReturn('test_event'); + when(event.name).thenReturn('test_event'); expect(config.getPrimaryRule(event), rule1); }); @@ -151,7 +151,7 @@ void main() { test('should return null if no rules match', () { final config = RoutingConfiguration.empty(); final event = MockBaseEvent(); - when(event.getName()).thenReturn('test_event'); + when(event.name).thenReturn('test_event'); expect(config.getPrimaryRule(event), isNull); }); }); @@ -172,7 +172,7 @@ void main() { requirePIIConsent: true); final config = RoutingConfiguration(rules: [rule1, rule2, rule3]); final event = MockBaseEvent(); - when(event.getName()).thenReturn('test_event'); + when(event.name).thenReturn('test_event'); when(event.isEssential).thenReturn(false); when(event.requiresConsent).thenReturn(true); when(event.containsPII).thenReturn(true); @@ -218,7 +218,7 @@ void main() { id: 'rule2', priority: 5, targetGroup: TrackerGroup.development); final config = RoutingConfiguration(rules: [rule1, rule2]); final event = MockBaseEvent(); - when(event.getName()).thenReturn('test_event'); + when(event.name).thenReturn('test_event'); when(event.isEssential).thenReturn(false); when(event.requiresConsent).thenReturn(true); when(event.containsPII).thenReturn(false); @@ -236,7 +236,7 @@ void main() { id: 'rule2', priority: 10, targetGroup: TrackerGroup.development); final config = RoutingConfiguration(rules: [rule1, rule2]); final event = MockBaseEvent(); - when(event.getName()).thenReturn('test_event'); + when(event.name).thenReturn('test_event'); when(event.isEssential).thenReturn(false); when(event.requiresConsent).thenReturn(true); when(event.containsPII).thenReturn(false); diff --git a/test/models/routing/routing_config_test.mocks.dart b/test/models/routing/routing_config_test.mocks.dart index 5a5f32c..52c4a7d 100644 --- a/test/models/routing/routing_config_test.mocks.dart +++ b/test/models/routing/routing_config_test.mocks.dart @@ -73,7 +73,7 @@ class MockBaseEvent extends _i1.Mock implements _i2.BaseEvent { ) as DateTime); @override - String getName() => (super.noSuchMethod( + String get name => (super.noSuchMethod( Invocation.method( #getName, [], diff --git a/test/routing/presets/smart_defaults_test.dart b/test/routing/presets/smart_defaults_test.dart index 7313c28..0a1eb18 100644 --- a/test/routing/presets/smart_defaults_test.dart +++ b/test/routing/presets/smart_defaults_test.dart @@ -590,15 +590,15 @@ void main() { class TestEvent extends BaseEvent { final String eventName; final EventCategory? eventCategory; - final Map? properties; + final Map? _properties; - TestEvent(this.eventName, [this.eventCategory, this.properties]); + TestEvent(this.eventName, [this.eventCategory, this._properties]); @override - String getName() => eventName; + String get name => eventName; @override - Map? getProperties() => properties; + Map? get properties => _properties; @override EventCategory? get category => eventCategory; @@ -610,10 +610,10 @@ class HighVolumeTestEvent extends BaseEvent { HighVolumeTestEvent(this.eventName); @override - String getName() => eventName; + String get name => eventName; @override - Map? getProperties() => null; + Map? get properties => null; @override bool get isHighVolume => true; @@ -625,10 +625,10 @@ class EssentialTestEvent extends BaseEvent { EssentialTestEvent(this.eventName); @override - String getName() => eventName; + String get name => eventName; @override - Map? getProperties() => null; + Map? get properties => null; @override bool get isEssential => true; diff --git a/test/routing/route_config_builder_test.dart b/test/routing/route_config_builder_test.dart index 322c4d7..31db35a 100644 --- a/test/routing/route_config_builder_test.dart +++ b/test/routing/route_config_builder_test.dart @@ -568,10 +568,10 @@ class TestEvent extends BaseEvent { TestEvent(this.eventName); @override - String getName() => eventName; + String get name => eventName; @override - Map? getProperties() => null; + Map? get properties => null; } class BusinessEvent extends BaseEvent { @@ -581,10 +581,10 @@ class BusinessEvent extends BaseEvent { BusinessEvent(this.eventName, this.revenue); @override - String getName() => eventName; + String get name => eventName; @override - Map getProperties() => {'revenue': revenue}; + Map get properties => {'revenue': revenue}; @override EventCategory get category => EventCategory.business; diff --git a/test/routing/routing_builder_test.dart b/test/routing/routing_builder_test.dart index ad9c9ff..711dd18 100644 --- a/test/routing/routing_builder_test.dart +++ b/test/routing/routing_builder_test.dart @@ -797,8 +797,8 @@ class TestEvent extends BaseEvent { TestEvent(this.eventName); @override - String getName() => eventName; + String get name => eventName; @override - Map? getProperties() => null; + Map? get properties => null; } diff --git a/test/routing/routing_engine_test.dart b/test/routing/routing_engine_test.dart index f1484b6..af37447 100644 --- a/test/routing/routing_engine_test.dart +++ b/test/routing/routing_engine_test.dart @@ -1268,15 +1268,15 @@ void main() { // Test Event Classes class TestEvent extends BaseEvent { final String eventName; - final Map? properties; + final Map? _properties; - TestEvent(this.eventName, [this.properties]); + TestEvent(this.eventName, [this._properties]); @override - String getName() => eventName; + String get name => eventName; @override - Map? getProperties() => properties; + Map? get properties => _properties; } class BusinessTestEvent extends BaseEvent { @@ -1286,10 +1286,10 @@ class BusinessTestEvent extends BaseEvent { BusinessTestEvent(this.eventName, this.amount); @override - String getName() => eventName; + String get name => eventName; @override - Map getProperties() => {'amount': amount}; + Map get properties => {'amount': amount}; @override EventCategory get category => EventCategory.business; @@ -1304,10 +1304,10 @@ class DebugTestEvent extends BaseEvent { DebugTestEvent(this.eventName); @override - String getName() => eventName; + String get name => eventName; @override - Map? getProperties() => null; + Map? get properties => null; @override EventCategory get category => EventCategory.technical; @@ -1320,10 +1320,10 @@ class PIITestEvent extends BaseEvent { PIITestEvent(this.eventName, this.email); @override - String getName() => eventName; + String get name => eventName; @override - Map getProperties() => {'email': email}; + Map get properties => {'email': email}; @override bool get containsPII => true; @@ -1338,10 +1338,10 @@ class EssentialTestEvent extends BaseEvent { EssentialTestEvent(this.eventName); @override - String getName() => eventName; + String get name => eventName; @override - Map? getProperties() => null; + Map? get properties => null; @override bool get isEssential => true; @@ -1356,10 +1356,10 @@ class HighVolumeTestEvent extends BaseEvent { HighVolumeTestEvent(this.eventName); @override - String getName() => eventName; + String get name => eventName; @override - Map? getProperties() => null; + Map? get properties => null; @override bool get isHighVolume => true; @@ -1372,10 +1372,10 @@ class MarketingTestEvent extends BaseEvent { MarketingTestEvent(this.eventName, this.campaign); @override - String getName() => eventName; + String get name => eventName; @override - Map getProperties() => {'campaign': campaign}; + Map get properties => {'campaign': campaign}; @override EventCategory get category => EventCategory.marketing; @@ -1387,10 +1387,10 @@ class SystemTestEvent extends BaseEvent { SystemTestEvent(this.eventName); @override - String getName() => eventName; + String get name => eventName; @override - Map? getProperties() => null; + Map? get properties => null; @override EventCategory get category => EventCategory.system; @@ -1405,10 +1405,10 @@ class SecurityTestEvent extends BaseEvent { SecurityTestEvent(this.eventName); @override - String getName() => eventName; + String get name => eventName; @override - Map? getProperties() => null; + Map? get properties => null; @override EventCategory get category => EventCategory.security; @@ -1428,10 +1428,10 @@ class PropertyTestEvent extends BaseEvent { PropertyTestEvent(this.eventName, this.eventProperties); @override - String getName() => eventName; + String get name => eventName; @override - Map getProperties() => eventProperties; + Map get properties => eventProperties; @override bool get containsPII => mockContainsPII; diff --git a/test/routing/routing_rule_builder_test.dart b/test/routing/routing_rule_builder_test.dart index 95ef77c..3b2292e 100644 --- a/test/routing/routing_rule_builder_test.dart +++ b/test/routing/routing_rule_builder_test.dart @@ -687,8 +687,8 @@ class TestEvent extends BaseEvent { TestEvent(this.eventName); @override - String getName() => eventName; + String get name => eventName; @override - Map? getProperties() => null; + Map? get properties => null; } diff --git a/test/strategies/base_tracker_strategy_test.dart b/test/strategies/base_tracker_strategy_test.dart index d679d1f..27e4d78 100644 --- a/test/strategies/base_tracker_strategy_test.dart +++ b/test/strategies/base_tracker_strategy_test.dart @@ -106,7 +106,7 @@ void main() { setUp(() { tracker = TestTrackerStrategy(id: 'testId', name: 'Test Tracker'); mockEvent = MockBaseEvent(); - when(mockEvent.getName()).thenReturn('testEvent'); + when(mockEvent.name).thenReturn('testEvent'); }); test('constructor sets id, name, and enabled status correctly', () { @@ -216,8 +216,8 @@ void main() { setUp(() async { mockEvents = [MockBaseEvent(), MockBaseEvent()]; - when(mockEvents[0].getName()).thenReturn('event1'); - when(mockEvents[1].getName()).thenReturn('event2'); + when(mockEvents[0].name).thenReturn('event1'); + when(mockEvents[1].name).thenReturn('event2'); await tracker.initialize(); }); diff --git a/test/strategies/base_tracker_strategy_test.mocks.dart b/test/strategies/base_tracker_strategy_test.mocks.dart index 188b4c2..ae3a5a2 100644 --- a/test/strategies/base_tracker_strategy_test.mocks.dart +++ b/test/strategies/base_tracker_strategy_test.mocks.dart @@ -73,7 +73,7 @@ class MockBaseEvent extends _i1.Mock implements _i2.BaseEvent { ) as DateTime); @override - String getName() => (super.noSuchMethod( + String get name => (super.noSuchMethod( Invocation.method( #getName, [], diff --git a/test/test_utils/mock_events.dart b/test/test_utils/mock_events.dart index 8570e78..e6fbfeb 100644 --- a/test/test_utils/mock_events.dart +++ b/test/test_utils/mock_events.dart @@ -41,12 +41,12 @@ class CustomEvent extends BaseEvent { } @override - String getName() => _name; + String get name => _name; @override @override @override - Map? getProperties() => _properties?.cast(); + Map? get properties => _properties?.cast(); @override EventCategory? get category => _category;