gringoireDM/MERLin
52.6
Adequate · 21 September 2026
2.1k
lines of production code
Swift
primary language
4
measurements over time
What this system is
MERLin is an iOS framework that provides a structured approach to building modular, navigable, and observable iOS applications. It manages the lifecycle of independent modules, handles deep linking with priority-based matching, and offers a typed event system for inter-module communication. The library also includes reactive extensions for UI and data binding, along with a routing abstraction for consistent view presentation.
Features
Add MERLin sample application
The MERLinSample directory now contains a complete sample iOS application, including the main AppDelegate, event definitions, and configuration files. This provides a concrete example of how to integrate and use the MERLin framework in a real-world app structure.
MERLinSample/MERLinSample · high confidence
Added MERLinSample iOS sample project
A new sample application named MERLinSample has been added to the repository. This Xcode project demonstrates the usage of the library, including configurations for modules like RestaurantsListModule and RestaurantDetailModule, along with associated Swift source files, storyboards, and resources.
MERLinSample/MERLinSample.xcodeproj · high confidence
Added Restaurant Detail view with menu item cells
The RestaurantDetailModule now includes a new view layer for displaying restaurant details, featuring a custom MenuItemCell for menu items alongside standard table view cells for image and description. The RestaurantDetailViewController manages the UI, binding to a ViewModel to fetch and display restaurant data, including handling errors and user interactions like selecting menu items.
MERLinSample/RestaurantDetailModule/View · high confidence
Added mock repositories for sample project
The sample project now includes mock implementations for the restaurant list and detail modules. In the RestaurantsListModule, a MockRepository provides paginated lists of restaurants using a simple state machine for offset tracking. In the RestaurantDetailModule, a MockRepository returns static menu and restaurant data. These changes allow the sample app to function with hardcoded data, facilitating development and testing without a live backend.
MERLinSample/RestaurantDetailModule/ViewModel, MERLinSample/RestaurantsListModule/ViewModel · high confidence
Added sample app event listeners
The MERLinSample project now includes three new event listener implementations: AppDelegateEventsListener, ConsoleLogEventsListener, and RoutingEventsListener. These listeners demonstrate how to subscribe to and handle various application lifecycle events, console logs, and routing actions within the sample app.
MERLinSample/MERLinSample/EventsListeners · high confidence
Added sample project for the Restaurants List feature
A new sample project has been added to demonstrate the Restaurants List module. This includes the \RestaurantsListViewController\ implementation, which binds to the view model to display a list of restaurants with titles and price rates, and handles pagination by requesting new pages when the user scrolls to the end of the list. The associated storyboard file defines the table view layout and cell structure for this view.
MERLinSample/RestaurantsListModule/View · high confidence
Added sample project with iOS app structure and data models
A new sample iOS application named MERLinSample has been added to the repository. This includes the Xcode workspace configuration, a launch screen storyboard, and Swift protocol definitions for restaurant and menu data models, providing a concrete example of how to integrate and use the library within an iOS project.
(repo-wide) · high confidence
Added sample routing steps for restaurant modules
The sample project now includes specific routing step implementations for the RestaurantDetail and RestaurantsList modules. These additions provide concrete examples of how to define and register routing steps within the application's navigation flow, demonstrating the usage of the ModuleRoutingStep extension for these specific features.
MERLinSample/MERLinSample/RoutingSteps · high confidence
Initial project setup with CI, code coverage, and Swift 5.0 support
The repository is initialized with configuration files that establish the project's build and quality infrastructure. A .swift-version file specifies Swift 5.0 as the target language version. A .travis.yml file configures the Travis CI pipeline to build the iOS project using Xcode 11 and run tests on an iPhone 11 simulator. Code coverage reporting is enabled via codecov.yml, which excludes test files from analysis. Additionally, SwiftFormat is configured via swiftformat.config to enforce code style rules, and a README.md file provides project documentation and badges for build status and coverage.
(repo-wide) · high confidence
Introduce BaseModuleManager with OS logging and weak-retain pattern for modules
The library adds a new \BaseModuleManager\ class that manages the lifecycle of modules by retaining them via a \WeakDictionary\ keyed to their view controllers, ensuring modules are released when their view controllers are dismissed. It also introduces structured \os\_log\ logging for the module manager, router, and events listener, and provides methods to set up event listeners and handle deep links.
MERLin/MERLin · medium confidence
Introduce new Restaurant and RestaurantsList modules with deep linking support
Added the RestaurantDetailModule and RestaurantsListModule as new framework components, each with their own Info.plist, header, and Swift implementation. The RestaurantDetailModule now supports deep linking via the 'rest' URL scheme, allowing users to navigate directly to a restaurant's detail view. Both modules expose typed event streams for user interactions, such as tapping a restaurant in the list or the booking button in the detail view.
MERLinSample/RestaurantDetailModule · high confidence
Introduced SimpleRouter and RoutingContext for navigation
Added a new SimpleRouter implementation and a RoutingContext enum to handle application navigation. The SimpleRouter class manages the root view controller and integrates with the existing MERLin framework, while the RoutingContext enum defines navigation states such as 'mainFlow' and 'deeplink'.
MERLinSample/MERLinSample/Router · medium confidence
New RxSwift and RxCocoa extensions for observables and UI components
Added new RxSwift and RxCocoa extensions to simplify reactive programming and UI binding. For booleans, added operators to negate, filter true/false, and handle nil values. For strings, added isEmpty and isNotEmpty checks that trim whitespace. For general observables, added convenience methods like toVoid, unwrap, and several compactFlatMap variants. For UICollectionViewFlowLayout, added bindable properties for item, header, and footer sizes. For EventProtocol, added helpers to convert to AnyEvent and capture specific event types.
MERLin/MERLin/Extensions · high confidence
Behavioural changes
Automated Swift code formatting on commit
A new pre-commit hook has been added to automatically format Swift files using SwiftFormat. When a commit is made, any staged Swift files are automatically reformatted and re-staged, ensuring consistent code style without manual intervention.
.githooks · medium confidence
Deeplink remainder logic and priority system introduced
The deeplinking system now supports priority-based matching and allows modules to access the default implementation of \remainderDeeplink(fromDeeplink:)\ even when overridden. A new \DeeplinkMatchingPriority\ enum and \priority\ property on the \Deeplinkable\ protocol enable developers to control matching order. Additionally, the \Deeplinkable\ protocol exposes \remainderDeeplink\ and \canPush\ methods, allowing modules to customize how unmatched deeplink parts are handled and whether view controllers are pushed or presented. The \DeeplinkMatcher\ is now a pure Objective-C object that automatically registers all \Module\ subclasses conforming to \DeeplinkResponder\ at runtime.
MERLin/MERLin/Deeplinking · medium confidence
Introduce typed, protocol-based event system for view controllers and modules
The events layer has been refactored to use a new \EventProtocol\ and \AnyEvent\ wrapper, replacing the previous \EventsDescriptor\ and \RoutingEventsProducer\ concepts. View controllers now expose a typed \events\ observable for standard lifecycle events (appear/disappear), while modules expose their own typed event streams. Listeners and producers are now strongly typed via the \EventsListener\ and \EventsProducer\ protocols, enabling safer event matching and payload extraction. This change also introduces \ModuleEventsListener\ and \ModuleEventsListenersAggregator\ to handle module-scoped events with optional routing context filtering.
MERLin/MERLin/Events · high confidence
Introduces new routing and presentation abstractions
The routing layer now uses new types to define how views are presented and built. PresentableRoutingStep and ModuleRoutingStep encapsulate routing context and presentation modes (push, modal, embed, or none), allowing callers to specify how a view controller should be displayed. The RouterProtocol defines methods for routing to these steps and handling deep links, while the ViewControllerBuilding protocol provides a factory for creating view controllers from routing steps. This change shifts the API to use these new structs and protocols for all routing and presentation logic.
MERLin/MERLin/Routing · high confidence
Updated MERLin Xcode scheme for compatibility with newer Xcode versions
The Xcode project scheme for MERLin has been updated to support building with newer versions of Xcode. This includes configuration changes to the build, test, and launch actions to ensure compatibility with the latest Xcode release, as indicated by the scheme file creation and associated project updates.
MERLin/MERLin.xcodeproj/xcshareddata · medium confidence
Updated project configuration to support Swift 5 and RxSwift 5
The Xcode project file has been updated to object version 51, which is required for Swift 5 compatibility. This change aligns the project with modern Swift standards and ensures compatibility with RxSwift 5, as indicated by the presence of Swift 5 and RxSwift 5 related test files and source files in the project structure.
MERLin/MERLin.xcodeproj · medium confidence
Xcode workspace configuration and IDE checks added
The Xcode project workspace is now explicitly configured with a contents.xcworkspacedata file that references the main project, and an IDE workspace check file is added to suppress the 32-bit build warning.
MERLin/MERLin.xcodeproj/project.xcworkspace · high confidence
Xcode workspace configuration files added
The MERLin workspace was updated to include the standard Xcode workspace data file, IDE workspace checks plist, and workspace settings. These files define the workspace structure, reference the main project and CocoaPods dependencies, and configure IDE build settings, ensuring the workspace is properly initialized for development and build processes.
MERLin/MERLin.xcworkspace · high confidence
Test coverage
Added mock implementations for testing modules, events, and routing; Added tests for RxSwift extensions; Added unit tests for Router and RoutingStepPresentationMode; Added unit tests for RxExtension; Added unit tests for module and deeplink handling; Added unit tests for the Events layer.
Dependencies
Updated framework dependencies to Swift 5 and RxSwift 5.1
The MERLin framework and its sample project have been updated to require Swift 5.0 and target iOS 10.0. Dependencies have been upgraded to RxSwift and RxCocoa version 5.1, EnumKit 1.1.2, and LNZWeakCollection 1.3.2. The podspec and Podfile configurations now reflect these version constraints, ensuring compatibility with modern Xcode and Swift toolchains.
(dependencies) · medium confidence
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
How this codebase got here
Score
- CAI 55 → 53 (-2.1)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 100 → 97 (-2.8)
- Architecture 100 → 91 (-8.7)
- Maturity 35 → 45 (+10.0)
- Readiness 41 → 33 (-7.1)
- Security 100 → 100 (+0.0)
Resolved (6)
- Coverage not included — suite not readable by the collector
- Dependency hygiene not measured — no supported dependency manifest was read
- No exposed public API
- Test reliability not included
- complexity unreadable for .swift — churn × complexity hotspots could not be measured
- dormant codebase — no living knowledge left to concentrate
New (11)
- Coverage not measured — no coverage collector is wired up
- Documentation: no contributor guidance (README.md)
- Documentation: no installation or build instructions (README.md)
- Documentation: no usage examples (README.md)
- Duplicated block (5 lines × 2) (MERLin/MERLin/Events/EventsListener.swift)
- Duplicated block (5 lines × 2) (MERLinSample/RestaurantDetailModule/View/RestaurantDetailViewController.swift)
- Duplicated block (8 lines × 2) (MERLinSample/RestaurantDetailModule/ViewModel/Repositories/MockRepository.swift)
- Low cohesion: RestaurantsListViewController (LCOM4 4) (MERLinSample/RestaurantsListModule/View/RestaurantsListViewController.swift)
- Low cohesion: SimpleRouter (LCOM4 4) (MERLinSample/MERLinSample/Router/SimpleRouter.swift)
- Router.handle (cognitive 38) (MERLin/MERLin/Routing/RouterProtocol.swift)
- Router.handle (cyclomatic 23) (MERLin/MERLin/Routing/RouterProtocol.swift)
Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.
Survey your own repository
gringoireDM/MERLin was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.
About this page
- The score is its most recent published measurement, taken on 21 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
- Measured at commit 858ea0593894c80ea88325763685e21f3c71b113 — the exact code this score is about.
- Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
- Measured by watchdog.canine.dev using codehealth-analyzer preprod-b84573e22831.