Skip to content

Commit

Permalink
set up lefthook and ci format check
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexisChoupault committed Mar 6, 2025
1 parent cb1f05b commit e172133
Show file tree
Hide file tree
Showing 6 changed files with 129 additions and 51 deletions.
7 changes: 7 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,13 @@ jobs:
run: flutter analyze --fatal-infos
working-directory: lib

- name: Analyze example app source
run: flutter analyze --fatal-infos
working-directory: example/lib

- name: Format code
run: dart format --set-exit-if-changed .

- name: Run tests
run: flutter test --coverage

Expand Down
9 changes: 9 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,15 @@

Ensure to use a version mentionned in `pubspec.yaml`.

## Lefthook

[Lefthook](https://github.com/evilmartians/lefthook) is used to ensure proper code formatting and detect errors ahead of CI.

Install lefthook on your machine then run at the root of the project :
```bash
lefthook install
```

## Build API

This project uses [pigeon](https://pub.dev/packages/pigeon) to make communication between Flutter and host platforms easier.
Expand Down
8 changes: 5 additions & 3 deletions lefthook.yaml
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
pre-commit:
piped: true
parallel: false
commands:
linter:
run: flutter analyze lib
run: |
flutter analyze lib
flutter analyze example/lib
sort-imports:
glob: "*.dart"
run: flutter pub run import_sorter:main {staged_files} && git add {staged_files}
pretty:
glob: "*.dart"
run: flutter format {staged_files} && git add {staged_files}
run: dart format {staged_files} && git add {staged_files}
138 changes: 97 additions & 41 deletions lib/src/calendar_api.g.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@
// See also: https://pub.dev/packages/pigeon
// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers

// Dart imports:
import 'dart:async';
import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List;

// Flutter imports:
import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer;
import 'package:flutter/services.dart';

Expand Down Expand Up @@ -173,21 +175,20 @@ class Account {
}
}


class _PigeonCodec extends StandardMessageCodec {
const _PigeonCodec();
@override
void writeValue(WriteBuffer buffer, Object? value) {
if (value is int) {
buffer.putUint8(4);
buffer.putInt64(value);
} else if (value is Calendar) {
} else if (value is Calendar) {
buffer.putUint8(129);
writeValue(buffer, value.encode());
} else if (value is Event) {
} else if (value is Event) {
buffer.putUint8(130);
writeValue(buffer, value.encode());
} else if (value is Account) {
} else if (value is Account) {
buffer.putUint8(131);
writeValue(buffer, value.encode());
} else {
Expand All @@ -198,11 +199,11 @@ class _PigeonCodec extends StandardMessageCodec {
@override
Object? readValueOfType(int type, ReadBuffer buffer) {
switch (type) {
case 129:
case 129:
return Calendar.decode(readValue(buffer)!);
case 130:
case 130:
return Event.decode(readValue(buffer)!);
case 131:
case 131:
return Account.decode(readValue(buffer)!);
default:
return super.readValueOfType(type, buffer);
Expand All @@ -214,18 +215,22 @@ class CalendarApi {
/// Constructor for [CalendarApi]. The [binaryMessenger] named argument is
/// available for dependency injection. If it is left null, the default
/// BinaryMessenger will be used which routes to the host platform.
CalendarApi({BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''})
CalendarApi(
{BinaryMessenger? binaryMessenger, String messageChannelSuffix = ''})
: pigeonVar_binaryMessenger = binaryMessenger,
pigeonVar_messageChannelSuffix = messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : '';
pigeonVar_messageChannelSuffix =
messageChannelSuffix.isNotEmpty ? '.$messageChannelSuffix' : '';
final BinaryMessenger? pigeonVar_binaryMessenger;

static const MessageCodec<Object?> pigeonChannelCodec = _PigeonCodec();

final String pigeonVar_messageChannelSuffix;

Future<bool> requestCalendarPermission() async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.eventide.CalendarApi.requestCalendarPermission$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
final String pigeonVar_channelName =
'dev.flutter.pigeon.eventide.CalendarApi.requestCalendarPermission$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
Expand All @@ -251,14 +256,21 @@ class CalendarApi {
}
}

Future<Calendar> createCalendar({required String title, required int color, required Account? account, }) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.eventide.CalendarApi.createCalendar$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
Future<Calendar> createCalendar({
required String title,
required int color,
required Account? account,
}) async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.eventide.CalendarApi.createCalendar$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[title, color, account]);
final Future<Object?> pigeonVar_sendFuture =
pigeonVar_channel.send(<Object?>[title, color, account]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
Expand All @@ -279,14 +291,18 @@ class CalendarApi {
}
}

Future<List<Calendar>> retrieveCalendars({required bool onlyWritableCalendars, required Account? from}) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.eventide.CalendarApi.retrieveCalendars$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
Future<List<Calendar>> retrieveCalendars(
{required bool onlyWritableCalendars, required Account? from}) async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.eventide.CalendarApi.retrieveCalendars$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[onlyWritableCalendars, from]);
final Future<Object?> pigeonVar_sendFuture =
pigeonVar_channel.send(<Object?>[onlyWritableCalendars, from]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
Expand All @@ -308,13 +324,16 @@ class CalendarApi {
}

Future<void> deleteCalendar({required String calendarId}) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.eventide.CalendarApi.deleteCalendar$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
final String pigeonVar_channelName =
'dev.flutter.pigeon.eventide.CalendarApi.deleteCalendar$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[calendarId]);
final Future<Object?> pigeonVar_sendFuture =
pigeonVar_channel.send(<Object?>[calendarId]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
Expand All @@ -330,14 +349,33 @@ class CalendarApi {
}
}

Future<Event> createEvent({required String calendarId, required String title, required int startDate, required int endDate, required bool isAllDay, required String? description, required String? url, }) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.eventide.CalendarApi.createEvent$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
Future<Event> createEvent({
required String calendarId,
required String title,
required int startDate,
required int endDate,
required bool isAllDay,
required String? description,
required String? url,
}) async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.eventide.CalendarApi.createEvent$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[calendarId, title, startDate, endDate, isAllDay, description, url]);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel
.send(<Object?>[
calendarId,
title,
startDate,
endDate,
isAllDay,
description,
url
]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
Expand All @@ -358,14 +396,21 @@ class CalendarApi {
}
}

Future<List<Event>> retrieveEvents({required String calendarId, required int startDate, required int endDate, }) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.eventide.CalendarApi.retrieveEvents$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
Future<List<Event>> retrieveEvents({
required String calendarId,
required int startDate,
required int endDate,
}) async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.eventide.CalendarApi.retrieveEvents$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[calendarId, startDate, endDate]);
final Future<Object?> pigeonVar_sendFuture =
pigeonVar_channel.send(<Object?>[calendarId, startDate, endDate]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
Expand All @@ -387,13 +432,16 @@ class CalendarApi {
}

Future<void> deleteEvent({required String eventId}) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.eventide.CalendarApi.deleteEvent$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
final String pigeonVar_channelName =
'dev.flutter.pigeon.eventide.CalendarApi.deleteEvent$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[eventId]);
final Future<Object?> pigeonVar_sendFuture =
pigeonVar_channel.send(<Object?>[eventId]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
Expand All @@ -409,14 +457,18 @@ class CalendarApi {
}
}

Future<Event> createReminder({required int reminder, required String eventId}) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.eventide.CalendarApi.createReminder$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
Future<Event> createReminder(
{required int reminder, required String eventId}) async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.eventide.CalendarApi.createReminder$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[reminder, eventId]);
final Future<Object?> pigeonVar_sendFuture =
pigeonVar_channel.send(<Object?>[reminder, eventId]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
Expand All @@ -437,14 +489,18 @@ class CalendarApi {
}
}

Future<Event> deleteReminder({required int reminder, required String eventId}) async {
final String pigeonVar_channelName = 'dev.flutter.pigeon.eventide.CalendarApi.deleteReminder$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel = BasicMessageChannel<Object?>(
Future<Event> deleteReminder(
{required int reminder, required String eventId}) async {
final String pigeonVar_channelName =
'dev.flutter.pigeon.eventide.CalendarApi.deleteReminder$pigeonVar_messageChannelSuffix';
final BasicMessageChannel<Object?> pigeonVar_channel =
BasicMessageChannel<Object?>(
pigeonVar_channelName,
pigeonChannelCodec,
binaryMessenger: pigeonVar_binaryMessenger,
);
final Future<Object?> pigeonVar_sendFuture = pigeonVar_channel.send(<Object?>[reminder, eventId]);
final Future<Object?> pigeonVar_sendFuture =
pigeonVar_channel.send(<Object?>[reminder, eventId]);
final List<Object?>? pigeonVar_replyList =
await pigeonVar_sendFuture as List<Object?>?;
if (pigeonVar_replyList == null) {
Expand Down
3 changes: 2 additions & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,8 @@ dev_dependencies:
pigeon: ^24.2.1
timezone: ^0.10.0
mocktail: ^1.0.4
clock: ^1.1.2
clock: ^1.1.1
import_sorter: ^4.6.0

flutter:
plugin:
Expand Down
15 changes: 9 additions & 6 deletions test/event_test.dart
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
import 'package:eventide/eventide.dart';
import 'package:eventide/src/eventide_extensions.dart';
import 'package:eventide/src/eventide_platform_interface.dart';
// Flutter imports:
import 'package:flutter/foundation.dart';

// Package imports:
import 'package:flutter_test/flutter_test.dart';
import 'package:eventide/src/eventide.dart';
import 'package:eventide/src/calendar_api.g.dart';
import 'package:mocktail/mocktail.dart';
import 'package:timezone/timezone.dart';
import 'package:timezone/data/latest.dart' as tz;
import 'package:timezone/timezone.dart';

// Project imports:
import 'package:eventide/eventide.dart';
import 'package:eventide/src/calendar_api.g.dart';
import 'package:eventide/src/eventide_extensions.dart';

class _MockCalendarApi extends Mock implements CalendarApi {}

Expand Down

0 comments on commit e172133

Please sign in to comment.