Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/replace cleanup workflow with cli app #62

Merged
merged 49 commits into from
Mar 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
3acddf6
chore: Exec dart create -t console cleanup_template
morikann Mar 13, 2024
538f6b8
feat: Define ExitStatus
morikann Mar 13, 2024
68c6dbc
chore: install riverpod related packages
morikann Mar 13, 2024
9be4000
chore: Setting custom_lint
morikann Mar 13, 2024
86ac153
chore: Add yumemi_lints and setup
morikann Mar 13, 2024
e962203
chore: Add http package
morikann Mar 13, 2024
4633707
feat: Define AppClient
morikann Mar 13, 2024
deaf26a
chore: Add pub_semver
morikann Mar 13, 2024
cd497e8
chore: Add freezed related packages and setup
morikann Mar 13, 2024
b953cad
feat: Define FlutterSdkRelease
morikann Mar 13, 2024
380cbc0
feat: Define FlutterSdkService to fetch latest flutter version
morikann Mar 13, 2024
9dcaa08
feat: Define base code of cleanup_template
morikann Mar 13, 2024
82c6568
feat: Add process to install fvm
morikann Mar 13, 2024
3f77a74
chore: Add file package
morikann Mar 13, 2024
0c0af10
chore: Sort dependencies to fix lint
morikann Mar 13, 2024
8edcf51
chore: Add build.yaml to ignore lint for generated file
morikann Mar 13, 2024
07bb7ef
chore: Remove unused test content
morikann Mar 13, 2024
6935d03
chore: Summarize exceptions raised during decoding into CheckedFromJs…
morikann Mar 13, 2024
1da2836
feat: Define fileSystemProvider to DI easily
morikann Mar 13, 2024
2c6f45f
feat: Use fileSystemProvider in app
morikann Mar 13, 2024
05ca505
feat: Define ProcessRunException to handle for exitStatus is not 0 of…
morikann Mar 13, 2024
01e4368
feat: Define CleanupService to cleanup template
morikann Mar 13, 2024
fb1230d
feat: Use CleanupService.call in app
morikann Mar 13, 2024
920064a
feat: Add error handling to cleanupTemplate method
morikann Mar 13, 2024
cb0ed0e
test: Add FakeCleanupService
morikann Mar 13, 2024
4127ad6
test: Add FakeFlutterSdkService
morikann Mar 13, 2024
bd1b24a
chore: Add test package
morikann Mar 13, 2024
9d80aae
test: Add test of cleanupTemplate
morikann Mar 13, 2024
ed2c06b
chore: Add gitattributes to collapse .freezed.dart and .g.dart code
morikann Mar 13, 2024
2c8aaf6
refactor: Delete unnecessary comment
morikann Mar 13, 2024
3208155
chore: Setting to run cleanup_template with CI
morikann Mar 13, 2024
4ab3777
chore: Add custom_lint.log to gitignore
morikann Mar 13, 2024
3127eee
chore: Control the generation target of using json_serializable and f…
morikann Mar 13, 2024
849c413
chore: Update README
morikann Mar 13, 2024
e767405
chore: Add path package to fix lint warnings
morikann Mar 13, 2024
788d87a
refactor: Rename sdkService variable to flutterSdkService
morikann Mar 13, 2024
cf964e4
refactor: Use LocalFileSystem by default in fileSystemProvider
morikann Mar 19, 2024
7e05e8f
refactor: Move command of "dart pub global activate fvm" to CleanupSe…
morikann Mar 19, 2024
4e68745
refactor: Use FileSystem.systemTempDirector instead of creating tmpDir
morikann Mar 19, 2024
d07969c
refactor: Rename tmpDir to tempDir
morikann Mar 19, 2024
51f361a
chore: Update README to specify dart version and how to exec cli
morikann Mar 19, 2024
b2d5872
refactor: Use map instead of simplify processing
morikann Mar 19, 2024
cdc487f
refactor: Delete toolsDir in cleanup_template
morikann Mar 19, 2024
766dad4
refactor: Add @visibleForTesting to FlutterSdkService.getLatestFlutte…
morikann Mar 19, 2024
41e0b18
refactor: Delete rootDirPath variable
morikann Mar 19, 2024
6216a14
fix: Setting dart.fluttrSdkPath to correct path
morikann Mar 19, 2024
d7690c9
chore: Fix comment
morikann Mar 19, 2024
02b593f
refactor: Change process of updating dart.flutterSdkPath
morikann Mar 19, 2024
2287671
refactor: Change process of updating dart.flutterSdkPath more concisely
morikann Mar 19, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/templates/.vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"dart.flutterSdkPath": ".fvm/flutter_sdk",
"dart.flutterSdkPath": ".fvm/versions/{{flutterVersion}}",
"search.exclude": {
"**/.fvm": true
},
Expand Down
69 changes: 15 additions & 54 deletions .github/workflows/template-cleanup.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,60 +30,21 @@ jobs:
# - name: Create issues from challenges
# uses: ./.github/actions/create-issues-from-challenges

- name: Cleanup
# https://github.com/dart-lang/setup-dart
- name: Set up dart
uses: dart-lang/setup-dart@v1
with:
sdk: "3.3.0" # See: tools/cleanup_template/pubspec.yaml

- name: Install dependencies
run: dart pub get
shell: bash
run: |
# Make tmp dir and move work dir to tmp
mkdir "tmp" && cd tmp || exit

# Install fvm
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
brew tap leoafarias/fvm
brew install fvm

# Install & Setup Flutter
flutterLatestVersion=$(fvm releases | grep -o -E "v?[0-9]+\.[0-9]+\.[0-9]+\s+stable" | sed -e "s/[ ]*stable//g")
fvm install "$flutterLatestVersion"
fvm use "$flutterLatestVersion" --force

# Create Flutter Project
fvm flutter create \
-t app \
--empty \
-i swift \
-a kotlin \
--platforms ios,android \
--org jp.co.yumemi \
--project-name flutter_training \
.

# Add lints to dev_dependencies
fvm flutter pub add dev:yumemi_lints
fvm flutter pub remove flutter_lints

# Override the analysis_options.yaml
cat <<EOF > analysis_options.yaml
# https://pub.dev/packages/yumemi_lints
include: package:yumemi_lints/flutter/$flutterLatestVersion/recommended.yaml
EOF

# Move work dir to project root
cd ..

# Copy templates
cp -R .github/templates/. tmp

# Delete anything except tmp dir
rm -rf \
.github \
docs \
packages \
.gitignore \
LICENSE \
README.md

# Move new training project to project root
mv -f tmp/* tmp/.[^\.]* ./ && rm -rf tmp
working-directory: tools/cleanup_template

- name: Run cleanup_template
run: dart run bin/cleanup_template.dart
shell: bash
working-directory: tools/cleanup_template

- name: Commit files
run: |
Expand All @@ -97,4 +58,4 @@ jobs:
uses: ad-m/[email protected]
with:
branch: main
github_token: ${{ secrets.GITHUB_TOKEN }}
github_token: ${{ secrets.GITHUB_TOKEN }}
2 changes: 2 additions & 0 deletions tools/cleanup_template/.gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
*.freezed.dart linguist-generated=true
*.g.dart linguist-generated=true
6 changes: 6 additions & 0 deletions tools/cleanup_template/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# https://dart.dev/guides/libraries/private-files
# Created by `dart pub`
.dart_tool/

# custom_lint
*.log
3 changes: 3 additions & 0 deletions tools/cleanup_template/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
## 1.0.0

- Initial version.
41 changes: 41 additions & 0 deletions tools/cleanup_template/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# CLI to Cleanup flutter-training-template

This CLI is run when a new repository is created from flutter-training-template.

This CLI provides an environment for receiving Flutter training.
Yamasaki-pan961 marked this conversation as resolved.
Show resolved Hide resolved

## Get Started

### 1. Install Dart SDK

Before using this tool, make sure you have the Dart SDK installed. You can follow the instructions in the official documentation to install the Dart SDK and set up the dart command:

[Install Dart SDK]

> **Note**
> Ensure that your Dart SDK version is 3.3.0.

### 2. Install Dependencies

After installing the Dart SDK, you need to install the project dependencies using the following command:

```shell
dart pub get
```

## Usage

> **Note**
> This package is intended for use exclusively within the GitHub Actions workflow of [yumemi-inc/flutter-training-template] and is not published on [Pub.dev].

To run cleanup_template, execute the following command:

```shell
dart run bin/cleanup_template.dart
```

<!-- Links -->

[Install Dart SDK]: https://dart.dev/get-dart
[yumemi-inc/flutter-training-template]: https://github.com/yumemi-inc/flutter-training-template
[Pub.dev]: https://pub.dev/
8 changes: 8 additions & 0 deletions tools/cleanup_template/analysis_options.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
include: package:yumemi_lints/dart/3.3.0/recommended.yaml

analyzer:
plugins:
- custom_lint
errors:
# https://pub.dev/packages/freezed
invalid_annotation_target: ignore
12 changes: 12 additions & 0 deletions tools/cleanup_template/bin/cleanup_template.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'dart:io';

import 'package:cleanup_template/cleanup_template.dart' as cleanup_template;

void main() async {
final status = await cleanup_template.run();

return Future.wait([
stdout.close(),
stderr.close(),
]).then((_) => exit(status.code));
}
20 changes: 20 additions & 0 deletions tools/cleanup_template/build.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
targets:
$default:
builders:
# https://github.com/dart-lang/source_gen#ignore_for_file
source_gen:combining_builder:
options:
ignore_for_file:
- type=lint
- duplicate_ignore
json_serializable:
generate_for:
include:
- lib/src/models/*.dart
options:
# json のデシリアライズ時に発生する Exception を CheckedFromJsonException にまとめる
Yamasaki-pan961 marked this conversation as resolved.
Show resolved Hide resolved
checked: true
freezed:
generate_for:
include:
- lib/src/models/*.dart
37 changes: 37 additions & 0 deletions tools/cleanup_template/lib/cleanup_template.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import 'package:cleanup_template/src/models/exit_status.dart';
import 'package:cleanup_template/src/services/cleanup_service.dart';
import 'package:cleanup_template/src/services/flutter_sdk_service.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:riverpod/riverpod.dart';

Future<ExitStatus> run() async {
final container = ProviderContainer();

try {
final exitStatus = await cleanupTemplate(container);
return exitStatus;
} finally {
container.dispose();
}
}

Future<ExitStatus> cleanupTemplate(ProviderContainer container) async {
final flutterSdkService = container.read(flutterSdkServiceProvider);
final cleanupService = container.read(cleanupServiceProvider);

try {
final flutterVersion = await flutterSdkService.getLatestFlutterSdkVersion();
final exitStatus = cleanupService.call(flutterVersion);

return exitStatus;
} on CheckedFromJsonException catch (e) {
print(e.message);
return ExitStatus.errors;
} on FormatException catch (e) {
print(e.message);
return ExitStatus.errors;
} on Exception catch (e) {
print(e);
return ExitStatus.errors;
}
}
25 changes: 25 additions & 0 deletions tools/cleanup_template/lib/src/clients/app_client.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import 'package:http/http.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';

part 'app_client.g.dart';

@Riverpod(keepAlive: true, dependencies: [])
AppClient appClient(AppClientRef ref) {
final appClient = AppClient(Client());
ref.onDispose(appClient.close);
return appClient;
}

class AppClient extends BaseClient {
AppClient(this._inner);

final Client _inner;

@override
Future<StreamedResponse> send(BaseRequest request) async {
return _inner.send(request).timeout(const Duration(seconds: 3));
}

@override
void close() => _inner.close();
}
26 changes: 26 additions & 0 deletions tools/cleanup_template/lib/src/clients/app_client.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions tools/cleanup_template/lib/src/file_system.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import 'package:file/file.dart';
import 'package:file/local.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';

part 'file_system.g.dart';

@Riverpod(dependencies: [])
FileSystem fileSystem(FileSystemRef ref) => LocalFileSystem();
26 changes: 26 additions & 0 deletions tools/cleanup_template/lib/src/file_system.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions tools/cleanup_template/lib/src/models/exit_status.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/// https://dart.dev/tutorials/server/cmdline#setting-exit-codes
morikann marked this conversation as resolved.
Show resolved Hide resolved
enum ExitStatus {
success(0),
warnings(1),
errors(2),
;

const ExitStatus(this.code);

factory ExitStatus.fromCode(int code) => switch (code) {
0 => ExitStatus.success,
1 => ExitStatus.warnings,
_ => ExitStatus.errors,
};

final int code;
}
32 changes: 32 additions & 0 deletions tools/cleanup_template/lib/src/models/flutter_sdk_release.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:pub_semver/pub_semver.dart';

part 'flutter_sdk_release.freezed.dart';
part 'flutter_sdk_release.g.dart';

@freezed
class FlutterSdkRelease with _$FlutterSdkRelease {
factory FlutterSdkRelease({
required FlutterChannel channel,
@_VersionJsonConverter() required Version version,
}) = _FlutterSdkRelease;

factory FlutterSdkRelease.fromJson(Map<String, dynamic> json) =>
_$FlutterSdkReleaseFromJson(json);
}

enum FlutterChannel {
dev,
beta,
stable,
}

class _VersionJsonConverter implements JsonConverter<Version, String> {
Yamasaki-pan961 marked this conversation as resolved.
Show resolved Hide resolved
const _VersionJsonConverter();

@override
Version fromJson(String value) => Version.parse(value);

@override
String toJson(Version version) => version.toString();
}
Loading