diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 19a93a8..309328f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -168,6 +168,35 @@ jobs: name: konsist-reports path: 'konsist/build/reports/tests/**' + metalava: + if: "!contains(github.event.head_commit.message, 'skip ci')" + runs-on: macos-latest + timeout-minutes: 30 + + steps: + - uses: actions/checkout@v7 + + - name: Validate Gradle wrapper + uses: gradle/actions/wrapper-validation@v6 + + - name: Setup JDK + uses: actions/setup-java@v5 + with: + distribution: 'zulu' + java-version: 21 + + - uses: gradle/actions/setup-gradle@v6 + + - name: Check API compatibility + run: ./gradlew metalavaCheckCompatibility -Pandroidx.baselineprofile.skipgeneration + + - name: Upload metalava reports + if: failure() + uses: actions/upload-artifact@v7 + with: + name: metalava-reports + path: '**/build/metalava/**' + device-tests: # Skip if head commit contains 'skip ci' if: "!contains(github.event.head_commit.message, 'skip ci')" diff --git a/CHANGELOG.md b/CHANGELOG.md index 93ab942..9b04c1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,8 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -## [0.1.3] - 2026-07-21 - ### Added - `NetworkMockResourceLoader` fun interface in `devview-networkmock-core`: provides a named type for DI frameworks (Koin, Hilt, etc.) to bind, eliminating the need for a custom bridge interface in multi-module KMP projects where mock resource files live in a different module than where `NetworkMock` is constructed. Both `devview-networkmock` and `devview-networkmock-ktor` now expose `devview-networkmock-core` as an `api` dependency so the type is available to all integrators. @@ -80,8 +78,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added and expanded unit test coverage for all primary `devview-*` modules. - Added Konsist architecture enforcement tests and Kover coverage reporting across the module set. -[Unreleased]: https://github.com/worldline/DevView/compare/v0.1.3...HEAD -[0.1.3]: https://github.com/worldline/DevView/compare/v0.1.2...v0.1.3 +[Unreleased]: https://github.com/worldline/DevView/compare/v0.1.2...HEAD [0.1.2]: https://github.com/worldline/DevView/compare/v0.1.1...v0.1.2 [0.1.1]: https://github.com/worldline/DevView/compare/v0.1.0...v0.1.1 [0.1.0]: https://github.com/worldline/DevView/releases/tag/v0.1.0 diff --git a/devview-networkmock-core/api/0.1.3.txt b/devview-networkmock-core/api/0.1.3.txt deleted file mode 100644 index 6811ebb..0000000 --- a/devview-networkmock-core/api/0.1.3.txt +++ /dev/null @@ -1,297 +0,0 @@ -// Signature format: 4.0 -package com.worldline.devview.networkmock.core { - - public final class NetworkMockDataStoreDelegateKt { - method @InaccessibleFromKotlin public static com.worldline.devview.utils.DataStoreDelegate getNetworkMockDataStoreDelegate(); - property public static String NETWORK_MOCK_DATASTORE_NAME; - property public static com.worldline.devview.utils.DataStoreDelegate NetworkMockDataStoreDelegate; - field public static final String NETWORK_MOCK_DATASTORE_NAME = "network_mock_datastore.preferences_pb"; - } - - public final class NetworkMockInitializer { - method @KotlinOnly @androidx.compose.runtime.Composable public void initialize(androidx.datastore.core.DataStore dataStore, String configPath, kotlin.jvm.functions.Function2,?> resourceLoader); - method public com.worldline.devview.networkmock.core.repository.MockConfigRepository requireConfigRepository(); - method public com.worldline.devview.networkmock.core.repository.MockStateRepository requireStateRepository(); - field public static final com.worldline.devview.networkmock.core.NetworkMockInitializer INSTANCE; - } - -} - -package com.worldline.devview.networkmock.core.model { - - @kotlinx.serialization.Serializable public final class ApiGroupConfig { - ctor public ApiGroupConfig(String id, String name, java.util.List endpoints, java.util.List environments); - method public String component1(); - method public String component2(); - method public java.util.List component3(); - method public java.util.List component4(); - method public com.worldline.devview.networkmock.core.model.ApiGroupConfig copy(optional String id, optional String name, optional java.util.List endpoints, optional java.util.List environments); - method @InaccessibleFromKotlin public java.util.List getEndpoints(); - method @InaccessibleFromKotlin public java.util.List getEnvironments(); - method @InaccessibleFromKotlin public String getId(); - method @InaccessibleFromKotlin public String getName(); - property public java.util.List endpoints; - property public java.util.List environments; - property public String id; - property public String name; - } - - @androidx.compose.runtime.Immutable @kotlinx.serialization.Serializable public final class EndpointConfig implements com.worldline.devview.networkmock.core.model.EndpointDefinition { - ctor public EndpointConfig(String id, String name, String path, String method); - method public String component1(); - method public String component2(); - method public String component3(); - method public String component4(); - method public com.worldline.devview.networkmock.core.model.EndpointConfig copy(optional String id, optional String name, optional String path, optional String method); - method @InaccessibleFromKotlin public String getId(); - method @InaccessibleFromKotlin public String getMethod(); - method @InaccessibleFromKotlin public String getName(); - method @InaccessibleFromKotlin public String getPath(); - property public String id; - property public String method; - property public String name; - property public String path; - } - - public sealed exhaustive interface EndpointDefinition { - method @InaccessibleFromKotlin public String getId(); - method @InaccessibleFromKotlin public String? getMethod(); - method @InaccessibleFromKotlin public String? getName(); - method @InaccessibleFromKotlin public String? getPath(); - property public abstract String id; - property public abstract String? method; - property public abstract String? name; - property public abstract String? path; - } - - @androidx.compose.runtime.Immutable @kotlinx.serialization.Serializable public final class EndpointDescriptor { - ctor public EndpointDescriptor(com.worldline.devview.networkmock.core.model.EndpointKey key, com.worldline.devview.networkmock.core.model.EndpointConfig config, java.util.List availableResponses); - method public com.worldline.devview.networkmock.core.model.EndpointKey component1(); - method public com.worldline.devview.networkmock.core.model.EndpointConfig component2(); - method public java.util.List component3(); - method public com.worldline.devview.networkmock.core.model.EndpointDescriptor copy(optional com.worldline.devview.networkmock.core.model.EndpointKey key, optional com.worldline.devview.networkmock.core.model.EndpointConfig config, optional java.util.List availableResponses); - method @InaccessibleFromKotlin public java.util.List getAvailableResponses(); - method @InaccessibleFromKotlin public com.worldline.devview.networkmock.core.model.EndpointConfig getConfig(); - method @InaccessibleFromKotlin public String getEndpointId(); - method @InaccessibleFromKotlin public String getEnvironmentId(); - method @InaccessibleFromKotlin public String getGroupId(); - method @InaccessibleFromKotlin public com.worldline.devview.networkmock.core.model.EndpointKey getKey(); - property public java.util.List availableResponses; - property public com.worldline.devview.networkmock.core.model.EndpointConfig config; - property public String endpointId; - property public String environmentId; - property public String groupId; - property public com.worldline.devview.networkmock.core.model.EndpointKey key; - field public static final com.worldline.devview.networkmock.core.model.EndpointDescriptor.Companion Companion; - } - - public static final class EndpointDescriptor.Companion { - } - - @androidx.compose.runtime.Immutable @kotlinx.serialization.Serializable public final class EndpointKey { - ctor public EndpointKey(String groupId, String environmentId, String endpointId); - method public String component1(); - method public String component2(); - method public String component3(); - method public com.worldline.devview.networkmock.core.model.EndpointKey copy(optional String groupId, optional String environmentId, optional String endpointId); - method @InaccessibleFromKotlin public String getCompositeKey(); - method @InaccessibleFromKotlin public String getEndpointId(); - method @InaccessibleFromKotlin public String getEnvironmentId(); - method @InaccessibleFromKotlin public String getGroupId(); - property public String compositeKey; - property public String endpointId; - property public String environmentId; - property public String groupId; - field public static final com.worldline.devview.networkmock.core.model.EndpointKey.Companion Companion; - } - - public static final class EndpointKey.Companion { - } - - @androidx.compose.runtime.Immutable @kotlinx.serialization.Serializable @kotlinx.serialization.json.JsonClassDiscriminator(discriminator="type") public sealed exhaustive interface EndpointMockState { - method @InaccessibleFromKotlin public String getDisplayName(); - property public abstract String displayName; - } - - @androidx.compose.runtime.Immutable @kotlinx.serialization.SerialName("mock") @kotlinx.serialization.Serializable public static final class EndpointMockState.Mock implements com.worldline.devview.networkmock.core.model.EndpointMockState { - ctor public EndpointMockState.Mock(String responseFile); - method public String component1(); - method public com.worldline.devview.networkmock.core.model.EndpointMockState.Mock copy(optional String responseFile); - method @InaccessibleFromKotlin public String getDisplayName(); - method @InaccessibleFromKotlin public String getResponseFile(); - method @InaccessibleFromKotlin public Integer? getStatusCode(); - property public String displayName; - property public String responseFile; - property public Integer? statusCode; - } - - @androidx.compose.runtime.Immutable @kotlinx.serialization.SerialName("network") @kotlinx.serialization.Serializable public static final class EndpointMockState.Network implements com.worldline.devview.networkmock.core.model.EndpointMockState { - method @InaccessibleFromKotlin public String getDisplayName(); - property public String displayName; - field public static final com.worldline.devview.networkmock.core.model.EndpointMockState.Network INSTANCE; - } - - @kotlinx.serialization.Serializable public final class EndpointOverride implements com.worldline.devview.networkmock.core.model.EndpointDefinition { - ctor public EndpointOverride(String id, optional String? name, optional String? path, optional String? method); - method public String component1(); - method public String? component2(); - method public String? component3(); - method public String? component4(); - method public com.worldline.devview.networkmock.core.model.EndpointOverride copy(optional String id, optional String? name, optional String? path, optional String? method); - method @InaccessibleFromKotlin public String getId(); - method @InaccessibleFromKotlin public String? getMethod(); - method @InaccessibleFromKotlin public String? getName(); - method @InaccessibleFromKotlin public String? getPath(); - property public String id; - property public String? method; - property public String? name; - property public String? path; - } - - @kotlinx.serialization.Serializable public final class EnvironmentConfig { - ctor public EnvironmentConfig(String id, String name, String url, optional java.util.List endpointOverrides, optional java.util.List additionalEndpoints); - method public String component1(); - method public String component2(); - method public String component3(); - method public java.util.List component4(); - method public java.util.List component5(); - method public com.worldline.devview.networkmock.core.model.EnvironmentConfig copy(optional String id, optional String name, optional String url, optional java.util.List endpointOverrides, optional java.util.List additionalEndpoints); - method @InaccessibleFromKotlin public java.util.List getAdditionalEndpoints(); - method @InaccessibleFromKotlin public java.util.List getEndpointOverrides(); - method @InaccessibleFromKotlin public String getId(); - method @InaccessibleFromKotlin public String getName(); - method @InaccessibleFromKotlin public String getUrl(); - property public java.util.List additionalEndpoints; - property public java.util.List endpointOverrides; - property public String id; - property public String name; - property public String url; - } - - @kotlinx.serialization.Serializable public final class MockConfiguration { - ctor public MockConfiguration(java.util.List apiGroups); - method public java.util.List component1(); - method public com.worldline.devview.networkmock.core.model.MockConfiguration copy(optional java.util.List apiGroups); - method @InaccessibleFromKotlin public java.util.List getApiGroups(); - property public java.util.List apiGroups; - } - - public final class MockConfigurationKt { - method public static java.util.List effectiveEndpoints(com.worldline.devview.networkmock.core.model.ApiGroupConfig, com.worldline.devview.networkmock.core.model.EnvironmentConfig environment); - } - - @androidx.compose.runtime.Immutable public final class MockMatch { - ctor public MockMatch(com.worldline.devview.networkmock.core.model.EndpointKey key, com.worldline.devview.networkmock.core.model.EndpointConfig config); - method public com.worldline.devview.networkmock.core.model.EndpointKey component1(); - method public com.worldline.devview.networkmock.core.model.EndpointConfig component2(); - method public com.worldline.devview.networkmock.core.model.MockMatch copy(optional com.worldline.devview.networkmock.core.model.EndpointKey key, optional com.worldline.devview.networkmock.core.model.EndpointConfig config); - method @InaccessibleFromKotlin public com.worldline.devview.networkmock.core.model.EndpointConfig getConfig(); - method @InaccessibleFromKotlin public String getEndpointId(); - method @InaccessibleFromKotlin public String getEnvironmentId(); - method @InaccessibleFromKotlin public String getGroupId(); - method @InaccessibleFromKotlin public com.worldline.devview.networkmock.core.model.EndpointKey getKey(); - property public com.worldline.devview.networkmock.core.model.EndpointConfig config; - property public String endpointId; - property public String environmentId; - property public String groupId; - property public com.worldline.devview.networkmock.core.model.EndpointKey key; - } - - @androidx.compose.runtime.Immutable @kotlinx.serialization.Serializable public final class MockResponse { - ctor public MockResponse(int statusCode, String fileName, String displayName, String content); - method public int component1(); - method public String component2(); - method public String component3(); - method public String component4(); - method public com.worldline.devview.networkmock.core.model.MockResponse copy(optional int statusCode, optional String fileName, optional String displayName, optional String content); - method @InaccessibleFromKotlin public String getContent(); - method @InaccessibleFromKotlin public String getDisplayName(); - method @InaccessibleFromKotlin public String getFileName(); - method @InaccessibleFromKotlin public int getStatusCode(); - property public String content; - property public String displayName; - property public String fileName; - property public int statusCode; - field public static final com.worldline.devview.networkmock.core.model.MockResponse.Companion Companion; - } - - public static final class MockResponse.Companion { - method public com.worldline.devview.networkmock.core.model.MockResponse? fromFile(String fileName, String content, optional kotlin.jvm.functions.Function1 statusTextProvider); - } - - @kotlinx.serialization.Serializable public final class NetworkMockState { - ctor public NetworkMockState(); - ctor public NetworkMockState(optional boolean globalMockingEnabled, optional java.util.Map endpointStates, optional long lastModified); - method public boolean component1(); - method public java.util.Map component2(); - method public long component3(); - method public com.worldline.devview.networkmock.core.model.NetworkMockState copy(optional boolean globalMockingEnabled, optional java.util.Map endpointStates, optional long lastModified); - method public com.worldline.devview.networkmock.core.model.EndpointMockState? getEndpointState(com.worldline.devview.networkmock.core.model.EndpointKey key); - method public com.worldline.devview.networkmock.core.model.EndpointMockState? getEndpointState(String groupId, String environmentId, String endpointId); - method @InaccessibleFromKotlin public java.util.Map getEndpointStates(); - method @InaccessibleFromKotlin public boolean getGlobalMockingEnabled(); - method @InaccessibleFromKotlin public long getLastModified(); - method public com.worldline.devview.networkmock.core.model.NetworkMockState resetAllToNetwork(); - method public com.worldline.devview.networkmock.core.model.NetworkMockState withEndpointState(com.worldline.devview.networkmock.core.model.EndpointKey key, com.worldline.devview.networkmock.core.model.EndpointMockState state); - method public com.worldline.devview.networkmock.core.model.NetworkMockState withEndpointState(String groupId, String environmentId, String endpointId, com.worldline.devview.networkmock.core.model.EndpointMockState state); - property public java.util.Map endpointStates; - property public boolean globalMockingEnabled; - property public long lastModified; - } - - public enum StatusCodeFamily { - method @InaccessibleFromKotlin public String getDisplayName(); - property public String displayName; - enum_constant public static final com.worldline.devview.networkmock.core.model.StatusCodeFamily CLIENT_ERROR; - enum_constant public static final com.worldline.devview.networkmock.core.model.StatusCodeFamily INFORMATIONAL; - enum_constant public static final com.worldline.devview.networkmock.core.model.StatusCodeFamily REDIRECTION; - enum_constant public static final com.worldline.devview.networkmock.core.model.StatusCodeFamily SERVER_ERROR; - enum_constant public static final com.worldline.devview.networkmock.core.model.StatusCodeFamily SUCCESSFUL; - enum_constant public static final com.worldline.devview.networkmock.core.model.StatusCodeFamily UNKNOWN; - field public static final com.worldline.devview.networkmock.core.model.StatusCodeFamily.Companion Companion; - } - - public static final class StatusCodeFamily.Companion { - method public com.worldline.devview.networkmock.core.model.StatusCodeFamily fromStatusCode(int statusCode); - } - -} - -package com.worldline.devview.networkmock.core.repository { - - public final class MockConfigRepository { - ctor public MockConfigRepository(String configPath, kotlin.jvm.functions.Function2,? extends java.lang.Object?> resourceLoader, optional java.util.List statusCodesToDiscover); - method public suspend Object? discoverResponseFiles(com.worldline.devview.networkmock.core.model.EndpointKey key, kotlin.coroutines.Continuation>); - method public suspend Object? discoverResponseFiles(String groupId, String environmentId, String endpointId, kotlin.coroutines.Continuation>); - method public suspend Object? findMatchingMock(String host, String path, String method, kotlin.coroutines.Continuation); - method @KotlinOnly public suspend Object? loadConfiguration(kotlin.coroutines.Continuation>); - method public suspend Object? loadMockResponse(com.worldline.devview.networkmock.core.model.EndpointKey key, String fileName, kotlin.coroutines.Continuation); - method public suspend Object? loadMockResponse(String groupId, String environmentId, String endpointId, String fileName, kotlin.coroutines.Continuation); - field public static final com.worldline.devview.networkmock.core.repository.MockConfigRepository.Companion Companion; - } - - public static final class MockConfigRepository.Companion { - method @InaccessibleFromKotlin public java.util.List getDEFAULT_STATUS_CODES(); - property public java.util.List DEFAULT_STATUS_CODES; - } - - public final class MockStateRepository { - ctor public MockStateRepository(androidx.datastore.core.DataStore dataStore); - method public suspend Object? getState(kotlin.coroutines.Continuation); - method public kotlinx.coroutines.flow.Flow observeState(); - method public void registerEndpoints(java.util.List endpoints); - method public suspend Object? resetKnownEndpointsToNetwork(kotlin.coroutines.Continuation); - method public suspend Object? setAllEndpointStates(java.util.Map states, kotlin.coroutines.Continuation); - method public suspend Object? setEndpointMockState(com.worldline.devview.networkmock.core.model.EndpointKey key, com.worldline.devview.networkmock.core.model.EndpointMockState state, kotlin.coroutines.Continuation); - method public suspend Object? setEndpointMockState(String groupId, String environmentId, String endpointId, com.worldline.devview.networkmock.core.model.EndpointMockState state, kotlin.coroutines.Continuation); - method public suspend Object? setGlobalMockingEnabled(boolean enabled, kotlin.coroutines.Continuation); - field public static final String ENDPOINT_KEY_PREFIX = "network_mock_endpoint_"; - } - - public final class RequestMatcher { - method public boolean matchesPath(String configPath, String requestPath); - field public static final com.worldline.devview.networkmock.core.repository.RequestMatcher INSTANCE; - } - -} - diff --git a/devview-networkmock-core/api/api.txt b/devview-networkmock-core/api/api.txt index 6811ebb..9c8b288 100644 --- a/devview-networkmock-core/api/api.txt +++ b/devview-networkmock-core/api/api.txt @@ -9,27 +9,34 @@ package com.worldline.devview.networkmock.core { } public final class NetworkMockInitializer { - method @KotlinOnly @androidx.compose.runtime.Composable public void initialize(androidx.datastore.core.DataStore dataStore, String configPath, kotlin.jvm.functions.Function2,?> resourceLoader); + method @KotlinOnly @androidx.compose.runtime.Composable public void initialize(androidx.datastore.core.DataStore dataStore, String configPath, com.worldline.devview.networkmock.core.NetworkMockResourceLoader resourceLoader, optional java.util.List responseSuffixes); method public com.worldline.devview.networkmock.core.repository.MockConfigRepository requireConfigRepository(); method public com.worldline.devview.networkmock.core.repository.MockStateRepository requireStateRepository(); field public static final com.worldline.devview.networkmock.core.NetworkMockInitializer INSTANCE; } + public fun interface NetworkMockResourceLoader { + method public suspend Object? load(String path, kotlin.coroutines.Continuation); + } + } package com.worldline.devview.networkmock.core.model { @kotlinx.serialization.Serializable public final class ApiGroupConfig { - ctor public ApiGroupConfig(String id, String name, java.util.List endpoints, java.util.List environments); + ctor public ApiGroupConfig(String id, String name, java.util.List endpoints, java.util.List environments, optional Long? defaultDelayMs); method public String component1(); method public String component2(); method public java.util.List component3(); method public java.util.List component4(); - method public com.worldline.devview.networkmock.core.model.ApiGroupConfig copy(optional String id, optional String name, optional java.util.List endpoints, optional java.util.List environments); + method public Long? component5(); + method public com.worldline.devview.networkmock.core.model.ApiGroupConfig copy(optional String id, optional String name, optional java.util.List endpoints, optional java.util.List environments, optional Long? defaultDelayMs); + method @InaccessibleFromKotlin public Long? getDefaultDelayMs(); method @InaccessibleFromKotlin public java.util.List getEndpoints(); method @InaccessibleFromKotlin public java.util.List getEnvironments(); method @InaccessibleFromKotlin public String getId(); method @InaccessibleFromKotlin public String getName(); + property public Long? defaultDelayMs; property public java.util.List endpoints; property public java.util.List environments; property public String id; @@ -37,20 +44,26 @@ package com.worldline.devview.networkmock.core.model { } @androidx.compose.runtime.Immutable @kotlinx.serialization.Serializable public final class EndpointConfig implements com.worldline.devview.networkmock.core.model.EndpointDefinition { - ctor public EndpointConfig(String id, String name, String path, String method); + ctor public EndpointConfig(String id, String name, String path, String method, optional Long? delayMs, optional java.util.Map? queryParams); method public String component1(); method public String component2(); method public String component3(); method public String component4(); - method public com.worldline.devview.networkmock.core.model.EndpointConfig copy(optional String id, optional String name, optional String path, optional String method); + method public Long? component5(); + method public java.util.Map? component6(); + method public com.worldline.devview.networkmock.core.model.EndpointConfig copy(optional String id, optional String name, optional String path, optional String method, optional Long? delayMs, optional java.util.Map? queryParams); + method @InaccessibleFromKotlin public Long? getDelayMs(); method @InaccessibleFromKotlin public String getId(); method @InaccessibleFromKotlin public String getMethod(); method @InaccessibleFromKotlin public String getName(); method @InaccessibleFromKotlin public String getPath(); + method @InaccessibleFromKotlin public java.util.Map? getQueryParams(); + property public Long? delayMs; property public String id; property public String method; property public String name; property public String path; + property public java.util.Map? queryParams; } public sealed exhaustive interface EndpointDefinition { @@ -132,20 +145,26 @@ package com.worldline.devview.networkmock.core.model { } @kotlinx.serialization.Serializable public final class EndpointOverride implements com.worldline.devview.networkmock.core.model.EndpointDefinition { - ctor public EndpointOverride(String id, optional String? name, optional String? path, optional String? method); + ctor public EndpointOverride(String id, optional String? name, optional String? path, optional String? method, optional Long? delayMs, optional java.util.Map? queryParams); method public String component1(); method public String? component2(); method public String? component3(); method public String? component4(); - method public com.worldline.devview.networkmock.core.model.EndpointOverride copy(optional String id, optional String? name, optional String? path, optional String? method); + method public Long? component5(); + method public java.util.Map? component6(); + method public com.worldline.devview.networkmock.core.model.EndpointOverride copy(optional String id, optional String? name, optional String? path, optional String? method, optional Long? delayMs, optional java.util.Map? queryParams); + method @InaccessibleFromKotlin public Long? getDelayMs(); method @InaccessibleFromKotlin public String getId(); method @InaccessibleFromKotlin public String? getMethod(); method @InaccessibleFromKotlin public String? getName(); method @InaccessibleFromKotlin public String? getPath(); + method @InaccessibleFromKotlin public java.util.Map? getQueryParams(); + property public Long? delayMs; property public String id; property public String? method; property public String? name; property public String? path; + property public java.util.Map? queryParams; } @kotlinx.serialization.Serializable public final class EnvironmentConfig { @@ -181,16 +200,19 @@ package com.worldline.devview.networkmock.core.model { } @androidx.compose.runtime.Immutable public final class MockMatch { - ctor public MockMatch(com.worldline.devview.networkmock.core.model.EndpointKey key, com.worldline.devview.networkmock.core.model.EndpointConfig config); + ctor public MockMatch(com.worldline.devview.networkmock.core.model.EndpointKey key, com.worldline.devview.networkmock.core.model.EndpointConfig config, optional Long? delayMs); method public com.worldline.devview.networkmock.core.model.EndpointKey component1(); method public com.worldline.devview.networkmock.core.model.EndpointConfig component2(); - method public com.worldline.devview.networkmock.core.model.MockMatch copy(optional com.worldline.devview.networkmock.core.model.EndpointKey key, optional com.worldline.devview.networkmock.core.model.EndpointConfig config); + method public Long? component3(); + method public com.worldline.devview.networkmock.core.model.MockMatch copy(optional com.worldline.devview.networkmock.core.model.EndpointKey key, optional com.worldline.devview.networkmock.core.model.EndpointConfig config, optional Long? delayMs); method @InaccessibleFromKotlin public com.worldline.devview.networkmock.core.model.EndpointConfig getConfig(); + method @InaccessibleFromKotlin public Long? getDelayMs(); method @InaccessibleFromKotlin public String getEndpointId(); method @InaccessibleFromKotlin public String getEnvironmentId(); method @InaccessibleFromKotlin public String getGroupId(); method @InaccessibleFromKotlin public com.worldline.devview.networkmock.core.model.EndpointKey getKey(); property public com.worldline.devview.networkmock.core.model.EndpointConfig config; + property public Long? delayMs; property public String endpointId; property public String environmentId; property public String groupId; @@ -260,10 +282,10 @@ package com.worldline.devview.networkmock.core.model { package com.worldline.devview.networkmock.core.repository { public final class MockConfigRepository { - ctor public MockConfigRepository(String configPath, kotlin.jvm.functions.Function2,? extends java.lang.Object?> resourceLoader, optional java.util.List statusCodesToDiscover); + ctor public MockConfigRepository(String configPath, com.worldline.devview.networkmock.core.NetworkMockResourceLoader resourceLoader, optional java.util.List statusCodesToDiscover, optional java.util.List responseSuffixes); method public suspend Object? discoverResponseFiles(com.worldline.devview.networkmock.core.model.EndpointKey key, kotlin.coroutines.Continuation>); method public suspend Object? discoverResponseFiles(String groupId, String environmentId, String endpointId, kotlin.coroutines.Continuation>); - method public suspend Object? findMatchingMock(String host, String path, String method, kotlin.coroutines.Continuation); + method public suspend Object? findMatchingMock(String host, String path, String method, optional java.util.Map> queryParameters, kotlin.coroutines.Continuation); method @KotlinOnly public suspend Object? loadConfiguration(kotlin.coroutines.Continuation>); method public suspend Object? loadMockResponse(com.worldline.devview.networkmock.core.model.EndpointKey key, String fileName, kotlin.coroutines.Continuation); method public suspend Object? loadMockResponse(String groupId, String environmentId, String endpointId, String fileName, kotlin.coroutines.Continuation); @@ -271,7 +293,9 @@ package com.worldline.devview.networkmock.core.repository { } public static final class MockConfigRepository.Companion { + method @InaccessibleFromKotlin public java.util.List getDEFAULT_RESPONSE_SUFFIXES(); method @InaccessibleFromKotlin public java.util.List getDEFAULT_STATUS_CODES(); + property public java.util.List DEFAULT_RESPONSE_SUFFIXES; property public java.util.List DEFAULT_STATUS_CODES; } @@ -290,6 +314,7 @@ package com.worldline.devview.networkmock.core.repository { public final class RequestMatcher { method public boolean matchesPath(String configPath, String requestPath); + method public boolean matchesQueryParams(java.util.Map? configQueryParams, java.util.Map> requestQueryParams); field public static final com.worldline.devview.networkmock.core.repository.RequestMatcher INSTANCE; } diff --git a/devview-networkmock/api/0.1.3.txt b/devview-networkmock/api/0.1.3.txt deleted file mode 100644 index 88c2983..0000000 --- a/devview-networkmock/api/0.1.3.txt +++ /dev/null @@ -1,158 +0,0 @@ -// Signature format: 4.0 -package com.worldline.devview.networkmock { - - public final class NetworkMock implements com.worldline.devview.core.Module com.worldline.devview.utils.RequiresDataStore { - ctor public NetworkMock(kotlin.jvm.functions.Function2,? extends java.lang.Object?> resourceLoader, optional String configPath); - method @InaccessibleFromKotlin public com.worldline.devview.utils.DataStoreDelegate getDataStoreDelegate(); - method @InaccessibleFromKotlin public String getDataStoreName(); - method @InaccessibleFromKotlin public kotlinx.collections.immutable.PersistentMap,com.worldline.devview.core.DestinationMetadata> getDestinations(); - method @InaccessibleFromKotlin public androidx.navigation3.runtime.NavKey getEntryDestination(); - method @InaccessibleFromKotlin public kotlin.jvm.functions.Function1,kotlin.Unit> getRegisterSerializers(); - method @InaccessibleFromKotlin public com.worldline.devview.core.Section getSection(); - method @KotlinOnly @androidx.compose.runtime.Composable public void initModule(); - method @KotlinOnly public void registerContent(androidx.navigation3.runtime.EntryProviderScope, kotlin.jvm.functions.Function0 onNavigateBack, kotlin.jvm.functions.Function1 onNavigate, androidx.compose.ui.unit.Dp bottomPadding); - property public com.worldline.devview.utils.DataStoreDelegate dataStoreDelegate; - property public String dataStoreName; - property public kotlinx.collections.immutable.PersistentMap,com.worldline.devview.core.DestinationMetadata> destinations; - property public androidx.navigation3.runtime.NavKey entryDestination; - property public kotlin.jvm.functions.Function1,kotlin.Unit> registerSerializers; - property public com.worldline.devview.core.Section section; - } - - public sealed exhaustive interface NetworkMockDestination extends androidx.navigation3.runtime.NavKey { - } - - @kotlinx.serialization.Serializable public static final class NetworkMockDestination.Endpoint implements com.worldline.devview.networkmock.NetworkMockDestination { - ctor public NetworkMockDestination.Endpoint(com.worldline.devview.networkmock.core.model.EndpointKey endpointKey); - method public com.worldline.devview.networkmock.core.model.EndpointKey component1(); - method public com.worldline.devview.networkmock.NetworkMockDestination.Endpoint copy(optional com.worldline.devview.networkmock.core.model.EndpointKey endpointKey); - method @InaccessibleFromKotlin public com.worldline.devview.networkmock.core.model.EndpointKey getEndpointKey(); - property public com.worldline.devview.networkmock.core.model.EndpointKey endpointKey; - } - - @kotlinx.serialization.Serializable public static final class NetworkMockDestination.Main implements com.worldline.devview.networkmock.NetworkMockDestination { - field public static final com.worldline.devview.networkmock.NetworkMockDestination.Main INSTANCE; - } - - public final class NetworkMockScreenKt { - method @KotlinOnly @androidx.compose.runtime.Composable public static void NetworkMockScreen(kotlinx.coroutines.flow.SharedFlow resetToNetworkSharedFlow, kotlin.jvm.functions.Function1 navigateToEndpointScreen, com.worldline.devview.networkmock.viewmodel.NetworkMockViewModel viewModel, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.unit.Dp bottomPadding); - } - -} - -package com.worldline.devview.networkmock.model { - - @androidx.compose.runtime.Immutable public final class EndpointUiModel { - ctor public EndpointUiModel(com.worldline.devview.networkmock.core.model.EndpointDescriptor descriptor, com.worldline.devview.networkmock.core.model.EndpointMockState currentState); - method public com.worldline.devview.networkmock.core.model.EndpointDescriptor component1(); - method public com.worldline.devview.networkmock.core.model.EndpointMockState component2(); - method public com.worldline.devview.networkmock.model.EndpointUiModel copy(optional com.worldline.devview.networkmock.core.model.EndpointDescriptor descriptor, optional com.worldline.devview.networkmock.core.model.EndpointMockState currentState); - method @InaccessibleFromKotlin public com.worldline.devview.networkmock.core.model.EndpointMockState getCurrentState(); - method @InaccessibleFromKotlin public com.worldline.devview.networkmock.core.model.EndpointDescriptor getDescriptor(); - property public com.worldline.devview.networkmock.core.model.EndpointMockState currentState; - property public com.worldline.devview.networkmock.core.model.EndpointDescriptor descriptor; - field public static final com.worldline.devview.networkmock.model.EndpointUiModel.Companion Companion; - } - - public static final class EndpointUiModel.Companion { - } - - @androidx.compose.runtime.Immutable public final class GroupEnvironmentUiModel { - ctor public GroupEnvironmentUiModel(String groupId, String environmentId, String name, String url, kotlinx.collections.immutable.PersistentList endpoints); - method public String component1(); - method public String component2(); - method public String component3(); - method public String component4(); - method public kotlinx.collections.immutable.PersistentList component5(); - method public com.worldline.devview.networkmock.model.GroupEnvironmentUiModel copy(optional String groupId, optional String environmentId, optional String name, optional String url, optional kotlinx.collections.immutable.PersistentList endpoints); - method @InaccessibleFromKotlin public kotlinx.collections.immutable.PersistentList getEndpoints(); - method @InaccessibleFromKotlin public String getEnvironmentId(); - method @InaccessibleFromKotlin public String getGroupId(); - method @InaccessibleFromKotlin public String getName(); - method @InaccessibleFromKotlin public String getUrl(); - property public kotlinx.collections.immutable.PersistentList endpoints; - property public String environmentId; - property public String groupId; - property public String name; - property public String url; - field public static final com.worldline.devview.networkmock.model.GroupEnvironmentUiModel.Companion Companion; - } - - public static final class GroupEnvironmentUiModel.Companion { - } - -} - -package com.worldline.devview.networkmock.viewmodel { - - @androidx.compose.runtime.Immutable public sealed exhaustive interface NetworkMockEndpointUiState { - } - - @androidx.compose.runtime.Immutable public static final class NetworkMockEndpointUiState.Content implements com.worldline.devview.networkmock.viewmodel.NetworkMockEndpointUiState { - ctor public NetworkMockEndpointUiState.Content(com.worldline.devview.networkmock.model.EndpointUiModel endpointUiModel); - method public com.worldline.devview.networkmock.model.EndpointUiModel component1(); - method public com.worldline.devview.networkmock.viewmodel.NetworkMockEndpointUiState.Content copy(optional com.worldline.devview.networkmock.model.EndpointUiModel endpointUiModel); - method @InaccessibleFromKotlin public com.worldline.devview.networkmock.model.EndpointUiModel getEndpointUiModel(); - property public com.worldline.devview.networkmock.model.EndpointUiModel endpointUiModel; - } - - @androidx.compose.runtime.Immutable public static final class NetworkMockEndpointUiState.Error implements com.worldline.devview.networkmock.viewmodel.NetworkMockEndpointUiState { - ctor public NetworkMockEndpointUiState.Error(String message); - method public String component1(); - method public com.worldline.devview.networkmock.viewmodel.NetworkMockEndpointUiState.Error copy(optional String message); - method @InaccessibleFromKotlin public String getMessage(); - property public String message; - } - - @androidx.compose.runtime.Immutable public static final class NetworkMockEndpointUiState.Loading implements com.worldline.devview.networkmock.viewmodel.NetworkMockEndpointUiState { - field public static final com.worldline.devview.networkmock.viewmodel.NetworkMockEndpointUiState.Loading INSTANCE; - } - - public final class NetworkMockEndpointViewModel extends androidx.lifecycle.ViewModel { - ctor public NetworkMockEndpointViewModel(com.worldline.devview.networkmock.core.model.EndpointKey endpointKey, com.worldline.devview.networkmock.core.repository.MockConfigRepository configRepository, com.worldline.devview.networkmock.core.repository.MockStateRepository stateRepository); - method @InaccessibleFromKotlin public kotlinx.coroutines.flow.StateFlow getUiState(); - method public void setMockState(String? responseFileName); - property public kotlinx.coroutines.flow.StateFlow uiState; - } - - @androidx.compose.runtime.Immutable public sealed exhaustive interface NetworkMockUiState { - } - - @androidx.compose.runtime.Immutable public static final class NetworkMockUiState.Content implements com.worldline.devview.networkmock.viewmodel.NetworkMockUiState { - ctor public NetworkMockUiState.Content(boolean globalMockingEnabled, kotlinx.collections.immutable.PersistentList groups); - method public boolean component1(); - method public kotlinx.collections.immutable.PersistentList component2(); - method public com.worldline.devview.networkmock.viewmodel.NetworkMockUiState.Content copy(optional boolean globalMockingEnabled, optional kotlinx.collections.immutable.PersistentList groups); - method @InaccessibleFromKotlin public boolean getGlobalMockingEnabled(); - method @InaccessibleFromKotlin public kotlinx.collections.immutable.PersistentList getGroups(); - property public boolean globalMockingEnabled; - property public kotlinx.collections.immutable.PersistentList groups; - } - - @androidx.compose.runtime.Immutable public static final class NetworkMockUiState.Empty implements com.worldline.devview.networkmock.viewmodel.NetworkMockUiState { - field public static final com.worldline.devview.networkmock.viewmodel.NetworkMockUiState.Empty INSTANCE; - } - - @androidx.compose.runtime.Immutable public static final class NetworkMockUiState.Error implements com.worldline.devview.networkmock.viewmodel.NetworkMockUiState { - ctor public NetworkMockUiState.Error(String message); - method public String component1(); - method public com.worldline.devview.networkmock.viewmodel.NetworkMockUiState.Error copy(optional String message); - method @InaccessibleFromKotlin public String getMessage(); - property public String message; - } - - @androidx.compose.runtime.Immutable public static final class NetworkMockUiState.Loading implements com.worldline.devview.networkmock.viewmodel.NetworkMockUiState { - field public static final com.worldline.devview.networkmock.viewmodel.NetworkMockUiState.Loading INSTANCE; - } - - public final class NetworkMockViewModel extends androidx.lifecycle.ViewModel { - ctor public NetworkMockViewModel(com.worldline.devview.networkmock.core.repository.MockConfigRepository configRepository, com.worldline.devview.networkmock.core.repository.MockStateRepository stateRepository); - method @InaccessibleFromKotlin public kotlinx.coroutines.flow.StateFlow getUiState(); - method public void resetAllToNetwork(); - method public void setEndpointMockState(com.worldline.devview.networkmock.core.model.EndpointKey key, String? responseFileName); - method public void setGlobalMockingEnabled(boolean enabled); - property public kotlinx.coroutines.flow.StateFlow uiState; - } - -} - diff --git a/devview-networkmock/api/api.txt b/devview-networkmock/api/api.txt index 88c2983..9fb5495 100644 --- a/devview-networkmock/api/api.txt +++ b/devview-networkmock/api/api.txt @@ -2,7 +2,7 @@ package com.worldline.devview.networkmock { public final class NetworkMock implements com.worldline.devview.core.Module com.worldline.devview.utils.RequiresDataStore { - ctor public NetworkMock(kotlin.jvm.functions.Function2,? extends java.lang.Object?> resourceLoader, optional String configPath); + ctor public NetworkMock(com.worldline.devview.networkmock.core.NetworkMockResourceLoader resourceLoader, optional String configPath, optional java.util.List responseSuffixes); method @InaccessibleFromKotlin public com.worldline.devview.utils.DataStoreDelegate getDataStoreDelegate(); method @InaccessibleFromKotlin public String getDataStoreName(); method @InaccessibleFromKotlin public kotlinx.collections.immutable.PersistentMap,com.worldline.devview.core.DestinationMetadata> getDestinations(); diff --git a/docs/index.md b/docs/index.md index 68a3592..48276d6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -24,11 +24,11 @@ ## What's New -### v0.1.3 - NetworkMock and navigation fixes +### v0.1.2 - Packaging and sample improvements -- Added `NetworkMockResourceLoader` fun interface in `devview-networkmock-core` for easier DI framework integration (Koin, Hilt, etc.) -- Fixed DevView overlay back navigation: the overlay's back handler now correctly yields priority to the host app when closed -- Fixed crash on Network Mock screen startup caused by `MissingResourceException` when probing absent response files +- Preserved Kotlin module metadata in Android packaging +- Fixed docs list rendering on Home and License pages +- Updated sample `DevViewApp` feature setup --- diff --git a/gradle.properties b/gradle.properties index 0bffe86..0c06fe9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -37,7 +37,7 @@ RELEASE_SIGNING_ENABLED=true mavenCentralAutomaticPublishing=true GROUP=com.worldline.devview -VERSION_NAME=0.2.0-SNAPSHOT +VERSION_NAME=0.1.3-SNAPSHOT POM_DESCRIPTION=DevView POM_URL=https://github.com/worldline/devview/ diff --git a/gradle/build-logic/convention/src/main/kotlin/MetalavaConventionPlugin.kt b/gradle/build-logic/convention/src/main/kotlin/MetalavaConventionPlugin.kt index d94d2b4..a51362e 100644 --- a/gradle/build-logic/convention/src/main/kotlin/MetalavaConventionPlugin.kt +++ b/gradle/build-logic/convention/src/main/kotlin/MetalavaConventionPlugin.kt @@ -20,7 +20,12 @@ class MetalavaConventionPlugin : Plugin { } tasks.named { it.startsWith("metalava") }.configureEach { - dependsOn(tasks.named { it.startsWith("generateResourceAccessors") || it.startsWith("generateActualResourceCollectors") }) + dependsOn(tasks.named { + it.startsWith("generateResourceAccessors") || + it.startsWith("generateActualResourceCollectors") || + it.startsWith("generateComposeResClass") || + it.startsWith("generateExpectResourceCollectors") + }) } } }