Conversation
Changes: // ArcaneEnvironment breaking: context.read<ArcaneEnvironment>() -> ArcaneEnvironment.of(context) breaking: context.read<ArcaneEnvironment>().state -> ArcaneEnvironment.of(context).environment; // Feature flag service added: reset() // Logging service added: registerInterface() added: unregisterInterfaces() added: unregisterAllInterfaces() // ArcaneReactiveTheme fixed: currentMode, dark, light now actually emit new values when changed added: getters for lightTheme, darkTheme, and systemTheme TODO: test systemTheme Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
- added: reset() - added: `skipAutodetection` option for module, method, and metadata - added: unregisterInterface() - Created FileAndLineNumber mixin Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
…ness Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
…her, where it is more appropriate Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
…ion for 2.0.0 (#5) * Made ArcaneTheme private (_ArcaneTheme) Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Updated changelog Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Fix updateShouldNotify on ArcaneServiceProvider Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Update service provider Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Put service locators in an extension Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Try using a mixin instead Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Remove 'of' and 'requiredOf' locators Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Re-add service locators. They should be called as: ArcaneService.of<MyService>(context) Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Renamed getters on ArcaneService Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Renamed serviceInstances => registeredServices and added a removeService method Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Broke up arcane service into separate files Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Added requiredServiceOfType getter on ArcaneServiceProvider Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Updated services section of the readme Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Updated example to add a services example Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Removed unused variable Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Update example documentation Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Update example Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Breaking up example into smaller widgets Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Remove bloc dependency Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Fixes the notifier for feature flags and updates the example Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Fixed a bug in the example Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Update ServiceProvider to make service instances optional Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Remove unnecessary notifyListeners calls Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Organize theme service Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Fix authentication interface and service methods for logout and login. * Fix DebugAuthInterface logout method Added environment key to ArcaneEnvironment constructor Renamed switchEnvironment parameter in ArcaneEnvironment constructor Bumped arcane_helper_utils dependency version * Enhance theme management with StreamBuilder for dynamic updates Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Add configuration files and update authentication service error handling - Introduced .vscode/settings.json and .vscode/launch.json for IDE configuration. - Updated DebugAuthInterface and ArcaneAuthenticationService to return const Result.ok() for consistency. - Added ArcaneTheme class for theme management. - Updated pubspec.yaml to change result_monad dependency version. - Modified authentication_service_test to return const Result.ok() in mock setups. Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Update dependency versions to use 'any' for arcane_helper_utils and arcane_analysis Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Remove unnecessary 'const' keyword from Result.ok calls in DebugAuthInterface methods Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Add 'const' keyword to Result.ok calls in DebugAuthInterface methods Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Enhance logging service with new lifecycle capabilities and interceptor support - Updated `LoggingInterface` to remove singleton-style initialization. - Introduced `LoggingInitializable` and `LoggingInitializationMixin` for optional lifecycle management. - Added `LogEvent` and `LogInterceptor` classes for improved logging event handling and interception. - Updated `ArcaneLogger` to support multiple logging interfaces and global interceptors. - Modified `DebugPrint` and `DebugAuthInterface` to align with new logging structure. - Enhanced tests to cover new logging features and interceptor functionality. Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Add stream-based updates for authentication, feature flags, logging, and theming - Added `statusChanges` and `signedInChanges` streams to `ArcaneAuth` for real-time authentication updates. - Introduced `enabledFeaturesChanges` stream in `ArcaneFeatureFlags` for observing feature updates. - Improved `ArcaneLogger` to maintain `logStream` usability after listener cancellation. - Updated `ArcaneTheme` to provide streams for theme mode and theme data changes. - Enhanced documentation and examples to reflect new stream APIs and usage patterns. - Added regression tests for stream listener cancellation and re-subscription across services. Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Refactor ArcaneEnvironment and AuthenticationService for improved environment management and status handling Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Add application environment management and tests for authentication status coherence Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * feat: Enhance service management with ArcaneApp provider composition This commit significantly refactors Arcane's service architecture. ArcaneApp now acts as a StatefulWidget, composing InheritedWidget- based providers for core services (features, environment, theme, auth). Service lookups (e.g., Arcane.features, context.service()) now prioritize provider-registered instances, falling back to singletons. Key changes include: - Renamed ArcaneFeatureFlags to ArcaneFeatureFlagService and ArcaneReactiveTheme to ArcaneThemeService (with typedefs). - Introduced ArcaneEnvironmentService and ArcaneEnvironmentProvider for centralized environment management. - Added BuildContext extensions (e.g., context.featureFlags) for reactive, convenient service access. - Removed .puro.json and its references, streamlining SDK setup. - Updated CHANGELOG.md to reflect a 2.0.0 release, detailing all breaking changes and new features. * chore(example): Add ignore rules for example builds * feat(logging): Introduce log interceptors and origin control Introduces the LogInterceptor class, enabling pre-processing, modification, or suppression of log events before they reach registered interfaces. The LogInterceptorContext provides contextual information such as the originating LoggingInterface. Adds a `skipAutodetection` parameter to Arcane.log, allowing control over the automatic detection of log origin (module, method, file/line). Also makes the LogEvent class extendable to support custom event types and updates existing interceptor callback signatures for consistency. * fix(theme): Update theme mode check to use currentModeOf method Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * fix(theme): Improve theme mode detection and toggling `context.isDarkMode` now reflects the app's effective theme brightness, not the raw platform brightness. This ensures `isDarkMode` accurately reports the currently rendered theme. `switchTheme()` now intelligently toggles from the *effective* theme when in `ThemeMode.system` by considering the current app brightness. `followSystemTheme()` is updated to always read the platform brightness directly, decoupling its behavior from the app's overridden theme settings. * feat(example): Improve theme and service integration demo Updates the example application to better demonstrate service and theme integration. The `FavoriteColorService` now actively sets the app's color scheme and can initialize its state from the current theme. Environment display is now reactive, and the UI responds dynamically to service registration and removal. Initial themes are now explicitly seeded. * feat(example): Add interactive persistent metadata toggle Previously, persistent metadata was added unconditionally. This change allows users to dynamically enable or disable the demo persistent metadata via a UI switch, better showcasing the API functionality. * feat(theme): Add assignment-style theme setters Introduces convenience setters for dark and light themes, allowing `Arcane.theme.dark = ...` and `Arcane.theme.light = ...` as an alternative to `setDarkTheme` and `setLightTheme`. This improves developer ergonomics and conciseness. * docs(README): Add Application Environments section to features list Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * Adds `ArcaneApp.builder` to provide a provider-aware `BuildContext` for the application root. This deprecates the `ArcaneApp.child` parameter, improving developer experience for accessing Arcane's providers at build time. Updates the `ArcaneThemeSwitcher` to default to `followSystemTheme` when mounted under `ArcaneApp`, ensuring system theme behavior is enabled out of the box. Fixes `setDarkTheme` and `setLightTheme` to only update the rendered theme if their respective modes are currently active. This prevents unintended UI changes when updating the definition of an inactive theme. Updates README and examples to reflect the new `builder` API and clarified theme logic. Adds new tests for these changes. * docs(arcane_app): Clarify ArcaneApp API and provider access documentation Updates the documentation for the `ArcaneApp` constructor to explicitly detail the preferred `builder` API and the deprecated `child` parameter, including migration guidance. Also updates the list of provided services to include `ArcaneFeatureFlagsProvider`. * feat: Overhaul Arcane framework for 2.0.0 release notes Migrate Arcane to a static utility surface, removing the instantiable singleton constructor for simpler and more direct access to services. Introduce new reactive streams for environment, authentication, and theme services, enabling real-time observation of state changes. Enhance `ArcaneApp` integration with the new `builder` callback and `BuildContext` convenience accessors for services and feature flags. Update `ArcaneAuthInterface.logout` signature and revise `src` import paths, requiring consumers to update their implementations and imports. Deprecate `ArcaneApp.child` and `BuildContext.serviceOfType<T>()` in favor of new, more idiomatic APIs. Remove direct `flutter_bloc` dependency and upgrade `result_monad` to `^4.0.0`. * refactor(environment): Rename environment access getter to current This change unifies how the current application environment is accessed across Arcane's services and providers. The `state` and `environment` getters have been replaced with a consistent `current` getter, simplifying API usage and aligning with new patterns. Includes corresponding updates in example and internal code, and documents the migration in the CHANGELOG. * chore: Relax result_monad dependency constraint The `result_monad` dependency was recently upgraded to `^4.0.0`. This update relaxes the constraint to `any` to provide greater flexibility and mitigate potential dependency conflicts for consumers of Arcane, allowing them to use other compatible versions. * refactor(logging): Replace LoggingInitializationMixin with LoggingInitialization and add LoggingFeature annotation support Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * docs(changelog): Add migration steps for ArcaneThemeService and update themeMode configuration examples Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * refactor(workflow): Simplify analyze-and-test workflow by removing unused environment variables and steps Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * docs(changelog): Update Arcane.log metadata type and add migration steps for structured values Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * test: Add unit tests for authentication and feature flags functionality Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * feat(theme): track user-defined theme overrides in ArcaneThemeService Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * refactor(service): update service access methods in ArcaneServiceProvider Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * refactor(tests): format login and logout method signatures in MockAuth for improved readability Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> * feat(tests): add unit tests for ArcaneThemeService functionality Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com> --------- Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
…aints Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
fix(logging): ensure proper cancellation of log stream subscriber refactor(arcane): make built-in services list unmodifiable fix(app): update service notifier on widget updates fix(service): improve removeService method to return boolean fix(auth): update BuildContext parameter to unused in setDebug/setNormal fix(logging): correct log level reference in LogInterceptorContext documentation fix(theme): update documentation to reflect ThemeMode instead of ThemeData fix(theme): ensure unawaited cancellation of theme subscriptions chore(dependencies): update arcane_analysis version to ^1.0.4 test: make ArcaneAuthenticationService reset asynchronous in tests Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
…eLogger - Added support for global interceptors that apply to all interfaces. - Introduced type-scoped interceptors for specific interface types. - Updated CHANGELOG with migration steps and new API details. - Adjusted README and tests to reflect changes in interceptor registration. Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
…ptors and global interceptor functionality Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
… APIs and scoped matching Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
There was a problem hiding this comment.
Pull request overview
This PR updates Arcane’s logging interceptor API to use a centralized LoggingInterceptorsService facade (exposed via Arcane.logger.interceptors) and aligns documentation/tests with the new collection-style interceptor management.
Changes:
- Introduces
LoggingInterceptorsServiceand refactorsArcaneLoggerto resolve interceptors via the new facade (global + scoped). - Updates logging service tests and README examples to use
Arcane.logger.interceptors.add/remove/clearand matcher-based scoping. - Minor maintenance updates: theme test formatting, changelog entries, and
.gitignorepatterns.
Reviewed changes
Copilot reviewed 6 out of 7 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
lib/src/services/logging/logging_service.dart |
Refactors logger to use the new interceptor facade and removes the old global-interceptor list APIs. |
lib/src/services/logging/logging_interceptors_service.dart |
Adds the interceptor facade supporting global and matcher-scoped registrations plus per-interface registrations. |
test/services/logging/logging_service_test.dart |
Expands/updates tests to cover the new interceptor collection APIs and matcher scoping behavior. |
README.md |
Updates docs/examples for the new interceptor API and adds a centered logo image. |
CHANGELOG.md |
Documents the interceptor API change and reorders relevant logging notes. |
.gitignore |
Adds an ignore rule for VS Code settings under the example app (currently with an incorrect path). |
test/services/theme/theme_service_test.dart |
Formatting-only change for theme setter calls. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Consolidates various improvements and new features across the Arcane framework, focusing on enhanced service management, reactive updates, and a more streamlined API for application integration. This release significantly refactors core services, introduces new provider patterns, and improves overall usability and extensibility.
Key Changes
ArcaneAppnow centrally manages service registration, allowing built-in services (Arcane.features,Arcane.auth,Arcane.theme,Arcane.environment) to prefer instances registered withArcaneAppand fall back to singletons when no provider is available.statusChanges,signedInChanges), feature flags (enabledFeaturesChanges), logging (logStream), and theming (themeModeChanges,themeDataChanges), enabling more granular and reactive UI updates.LogInterceptor) for pre-processing log messages.LoggingInterceptorsService) now manages registration, resolution, and lifecycle of log interceptors for all logging interfaces. This allows for global, per-interface, or per-event interception, modification, or filtering of log events, providing fine-grained control over logging behavior across the application.LoggingInitializable), and adds support for tagging destinations with@LoggingFeature.ArcaneReactiveThemetoArcaneThemeServicefor clarity, introduces assignment-style theme setters (Arcane.theme.dark = ...), and refines system theme following and theme mode detection logic.ArcaneFeatureFlagstoArcaneFeatureFlagService, addsArcaneFeatureFlagProviderfor widget tree integration, and provides convenientBuildContextextensions.ArcaneEnvironmentCubitwith aValueNotifier-backedArcaneEnvironmentServiceand anInheritedWidgetprovider, offering better integration and direct access viaArcane.environment.ArcaneAppIntegration: IntroducesArcaneApp.builderto provide a provider-awareBuildContextimmediately at app root, deprecating thechildproperty for improved developer experience.flutter_blocdependency and updates version constraints forresult_monadto^4.0.0,arcane_helper_utilsto^1.4.7, andarcane_analysisto^1.0.4.Breaking Changes
ArcaneClass: Now a static utility surface; no longer instantiable. Consumers directly importing frompackage:arcane_framework/src/...must update paths (e.g.,src/providers/...tosrc/service/...).ArcaneApp: Thechildproperty is deprecated; preferbuilderfor constructing the app root with a provider-awareBuildContext.BuildContext.serviceOfType()is deprecated; useBuildContext.service()instead.ArcaneAuthInterface.logoutnow accepts an optionalonLoggedOutcallback. Implementers must update their method signature.ArcaneFeatureFlagsis renamed toArcaneFeatureFlagService. Atypedefis provided for backward compatibility, but update to the new name is recommended.ArcaneFeatureFlagsScopeis renamed toArcaneFeatureFlagProvider.ArcaneReactiveThemeis renamed toArcaneThemeService. Atypedefis provided for backward compatibility, but update to the new name is recommended. The legacyThemeModeread fromArcane.theme.systemTheme.valueshould be replaced withArcane.theme.currentModeOf(context).stategetter has been removed fromArcaneEnvironment; useArcane.environment.currentinstead. TheAuthenticationStatus.debugstatus has been removed.LoggingInterfaceno longer includes built-in singleton state (initializedandinitgetters/methods are removed). ImplementLoggingInitializablefor interfaces requiring setup logic.LoggingInterceptorsServicefacade. Custom or legacy interceptor registration logic should be migrated to use this centralized service for consistency and improved control.How to Test
flutter run.FavoriteColorServiceand change colors, observing dynamic theme updates.flutter pub get,flutter analyze, andflutter testfrom the root of the repository to ensure all checks pass.Review Focus
ArcaneApp.builder,BuildContextextensions for services, feature flags, and themes for intuitiveness and ease of use.LogInterceptorand the newLoggingInterceptorsServicefacade to ensure they provide robust and flexible control over log events, and that global/per-interface interception works as intended.typedefs and deprecated aliases for renamed services function as expected during migration, and the impact of other breaking changes is clear.UI Changes
The example application has been completely refactored to demonstrate the new API.