fix: add ci and linter

This commit is contained in:
mike doornenbal 2024-02-06 16:32:50 +01:00
parent 500ed1d080
commit 85939335f1
6 changed files with 86 additions and 38 deletions

14
.github/workflows/compponent-ci.yml vendored Normal file
View file

@ -0,0 +1,14 @@
name: Iconica Standard Component CI Workflow
# Workflow Caller version: 2.0.0
on:
pull_request:
workflow_dispatch:
jobs:
call-global-iconica-workflow:
uses: Iconica-Development/.github/.github/workflows/component-ci.yml@master
secrets: inherit
permissions: write-all
with:
subfolder: "." # add optional subfolder to run workflow in

View file

@ -1,3 +1,7 @@
## 1.0.1
- Added CI and linter
## 1.0.0 ## 1.0.0
- Initial release - Initial release

View file

@ -1,4 +1,9 @@
include: package:flutter_lints/flutter.yaml include: package:flutter_iconica_analysis/analysis_options.yaml
# Additional information about this file can be found at # Possible to overwrite the rules from the package
# https://dart.dev/guides/language/analysis-options
analyzer:
exclude:
linter:
rules:

View file

@ -1,9 +1,10 @@
// SPDX-FileCopyrightText: 2022 Iconica // SPDX-FileCopyrightText: 2022 Iconica
// //
// SPDX-License-Identifier: BSD-3-Clause // SPDX-License-Identifier: BSD-3-Clause
///
library plugin_platform_interface; library plugin_platform_interface;
// ignore: depend_on_referenced_packages
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
/// Base class for data interfaces. /// Base class for data interfaces.
@ -11,20 +12,25 @@ import 'package:meta/meta.dart';
/// Provides a static helper method for ensuring that data interfaces are /// Provides a static helper method for ensuring that data interfaces are
/// implemented using `extends` instead of `implements`. /// implemented using `extends` instead of `implements`.
/// ///
/// Data interface classes are expected to have a private static token object which will be /// Data interface classes are expected to have a private static token object
/// which will be
/// be passed to [verify] along with a data interface object for verification. /// be passed to [verify] along with a data interface object for verification.
/// ///
/// Sample usage: /// Sample usage:
/// ///
/// ///
/// Mockito mocks of data interfaces will fail the verification, in test code only it is possible /// Mockito mocks of data interfaces will fail the verification, in test code
/// to include the [MockDataInterfaceMixin] for the verification to be temporarily disabled. See /// only it is possible
/// [MockDataInterfaceMixin] for a sample of using Mockito to mock a data interface. /// to include the [MockDataInterfaceMixin] for the verification to be
/// temporarily disabled. See
/// [MockDataInterfaceMixin] for a sample of using Mockito to mock a data
/// interface.
abstract class DataInterface { abstract class DataInterface {
/// Constructs a DataInterface, for use only in constructors of abstract /// Constructs a DataInterface, for use only in constructors of abstract
/// derived classes. /// derived classes.
/// ///
/// @param token The same, non-`const` `Object` that will be passed to `verify`. /// @param token The same, non-`const` `Object` that will be passed
/// to `verify`.
DataInterface({required Object token}) { DataInterface({required Object token}) {
_instanceTokens[this] = token; _instanceTokens[this] = token;
} }
@ -69,14 +75,18 @@ abstract class DataInterface {
required bool preventConstObject, required bool preventConstObject,
}) { }) {
if (instance is MockDataInterfaceMixin) { if (instance is MockDataInterfaceMixin) {
bool assertionsEnabled = false; var assertionsEnabled = false;
assert(() { assert(
() {
assertionsEnabled = true; assertionsEnabled = true;
return true; return true;
}()); }(),
'',
);
if (!assertionsEnabled) { if (!assertionsEnabled) {
throw AssertionError( throw AssertionError(
'`MockDataInterfaceMixin` is not intended for use in release builds.'); '`MockDataInterfaceMixin` is not intended for use in release builds.',
);
} }
return; return;
} }
@ -86,7 +96,8 @@ abstract class DataInterface {
} }
if (!identical(token, _instanceTokens[instance])) { if (!identical(token, _instanceTokens[instance])) {
throw AssertionError( throw AssertionError(
'Data interfaces must not be implemented with `implements`'); 'Data interfaces must not be implemented with `implements`',
);
} }
} }
} }

View file

@ -1,11 +1,10 @@
name: flutter_data_interface name: flutter_data_interface
description: Generic data interface package description: Generic data interface package
version: 1.0.0 version: 1.0.1
repository: https://github.com/Iconica-Development/flutter_data_interface repository: https://github.com/Iconica-Development/flutter_data_interface
environment: environment:
sdk: '>=2.18.0 <3.0.0' sdk: ">=2.18.0 <3.0.0"
flutter: ">=1.17.0" flutter: ">=1.17.0"
dependencies: dependencies:
@ -16,6 +15,9 @@ dependencies:
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter
flutter_lints: ^2.0.0 flutter_iconica_analysis:
git:
url: https://github.com/Iconica-Development/flutter_iconica_analysis
ref: 6.0.0
flutter: flutter:

View file

@ -99,26 +99,32 @@ class StaticMethodsOnlyMockPlatformInterfaceMixinTest
void main() { void main() {
group('`verify`', () { group('`verify`', () {
test('prevents implementation with `implements`', () { test('prevents implementation with `implements`', () {
expect(() { expect(
() {
SamplePluginPlatform.instance = ImplementsSamplePluginPlatform(); SamplePluginPlatform.instance = ImplementsSamplePluginPlatform();
}, throwsA(isA<AssertionError>())); },
throwsA(isA<AssertionError>()),
);
}); });
test('prevents implmentation with `implements` and `noSuchMethod`', () { test('prevents implmentation with `implements` and `noSuchMethod`', () {
expect(() { expect(
() {
SamplePluginPlatform.instance = SamplePluginPlatform.instance =
ImplementsSamplePluginPlatformUsingNoSuchMethod(); ImplementsSamplePluginPlatformUsingNoSuchMethod();
}, throwsA(isA<AssertionError>())); },
throwsA(isA<AssertionError>()),
);
}); });
test('allows mocking with `implements`', () { test('allows mocking with `implements`', () {
final SamplePluginPlatform mock = SamplePluginPlatform mock =
ImplementsSamplePluginPlatformUsingMockPlatformInterfaceMixin(); ImplementsSamplePluginPlatformUsingMockPlatformInterfaceMixin();
SamplePluginPlatform.instance = mock; SamplePluginPlatform.instance = mock;
}); });
test('allows faking with `implements`', () { test('allows faking with `implements`', () {
final SamplePluginPlatform fake = SamplePluginPlatform fake =
ImplementsSamplePluginPlatformUsingFakePlatformInterfaceMixin(); ImplementsSamplePluginPlatformUsingFakePlatformInterfaceMixin();
SamplePluginPlatform.instance = fake; SamplePluginPlatform.instance = fake;
}); });
@ -128,23 +134,29 @@ void main() {
}); });
test('prevents `const Object()` token', () { test('prevents `const Object()` token', () {
expect(() { expect(
() {
ConstTokenPluginPlatform.instance = ExtendsConstTokenPluginPlatform(); ConstTokenPluginPlatform.instance = ExtendsConstTokenPluginPlatform();
}, throwsA(isA<AssertionError>())); },
throwsA(isA<AssertionError>()),
);
}); });
}); });
// Tests of the earlier, to-be-deprecated `verifyToken` method // Tests of the earlier, to-be-deprecated `verifyToken` method
group('`verifyToken`', () { group('`verifyToken`', () {
test('prevents implementation with `implements`', () { test('prevents implementation with `implements`', () {
expect(() { expect(
() {
VerifyTokenPluginPlatform.instance = VerifyTokenPluginPlatform.instance =
ImplementsVerifyTokenPluginPlatform(); ImplementsVerifyTokenPluginPlatform();
}, throwsA(isA<AssertionError>())); },
throwsA(isA<AssertionError>()),
);
}); });
test('allows mocking with `implements`', () { test('allows mocking with `implements`', () {
final VerifyTokenPluginPlatform mock = VerifyTokenPluginPlatform mock =
ImplementsVerifyTokenPluginPlatformUsingMockPlatformInterfaceMixin(); ImplementsVerifyTokenPluginPlatformUsingMockPlatformInterfaceMixin();
VerifyTokenPluginPlatform.instance = mock; VerifyTokenPluginPlatform.instance = mock;
}); });