refactor: move dart scripts as commands under CLI

This commit is contained in:
Kingkor Roy Tirtho 2024-05-09 16:47:28 +06:00
parent a77b6776e8
commit a838eadc12
8 changed files with 205 additions and 203 deletions

View File

@ -1,103 +0,0 @@
import 'dart:developer';
import 'dart:io';
import 'package:collection/collection.dart';
import 'package:http/http.dart';
import 'package:html/parser.dart';
import 'package:pub_api_client/pub_api_client.dart';
import 'package:pubspec_parse/pubspec_parse.dart';
void main() async {
final client = PubClient();
final pubspec = Pubspec.parse(File('pubspec.yaml').readAsStringSync());
final allDeps = [
...pubspec.dependencies.entries,
...pubspec.devDependencies.entries,
];
final dependencies = allDeps
.where((d) => d.value is HostedDependency)
.map((d) => d.key)
.toSet();
final packageInfo = await Future.wait(dependencies.map(client.packageInfo));
final gitDepsList = List.castFrom<MapEntry<String, Dependency>,
MapEntry<String, GitDependency>>(
allDeps
.where((d) => d.value is GitDependency)
.map((d) => MapEntry(d.key, d.value as GitDependency))
.toList(),
);
final gitDeps = gitDepsList.map(
(d) {
final uri = Uri.parse(
d.value.url.toString().replaceAll('.git', ''),
);
return MapEntry(
d.key,
uri.replace(
pathSegments: [
...uri.pathSegments,
'raw',
d.value.ref ?? 'main',
d.value.path ?? '',
'pubspec.yaml',
],
).toString(),
);
},
).toList();
final gitPubspecs = await Future.wait(
gitDeps.map(
(d) {
Pubspec parser(res) {
try {
return Pubspec.parse(res.body);
} catch (e) {
final document = parse(res.body);
final pre = document.querySelector('pre');
if (pre == null) {
log(d.toString());
rethrow;
}
return Pubspec.parse(pre.text);
}
}
return get(Uri.parse(d.value)).then(parser).catchError(
(_) => get(Uri.parse(d.value.replaceFirst('/main', '/master')))
.then(parser),
);
},
),
);
// ignore: avoid_print
print(
packageInfo
.map(
(package) =>
'1. [${package.name}](${package.latestPubspec.homepage ?? package.url}) - ${package.description.replaceAll('\n', '')}',
)
.join('\n'),
);
// ignore: avoid_print
print(
gitPubspecs.map(
(package) {
final packageUrl = package.homepage ??
gitDepsList
.firstWhereOrNull((dep) => dep.key == package.name)
?.value
.url
.toString();
return '1. [${package.name}]($packageUrl) - ${package.description?.replaceAll('\n', '')}';
},
).join('\n'),
);
exit(0);
}

View File

@ -1,28 +0,0 @@
// ignore_for_file: avoid_print
import 'dart:convert';
import 'dart:io';
void main(List<String> args) async {
final translatedFile =
jsonDecode(await File('tm.json').readAsString()) as Map<String, dynamic>;
for (final MapEntry(:key, :value) in translatedFile.entries) {
print('Updating locale: $key');
final file = File('lib/l10n/app_$key.arb');
final fileContent =
jsonDecode(await file.readAsString()) as Map<String, dynamic>;
final newContent = {
...fileContent,
...value,
};
await file.writeAsString(
const JsonEncoder.withIndent(' ').convert(newContent),
);
print('✅ Updated locale: $key');
}
}

View File

@ -1,50 +0,0 @@
// ignore_for_file: avoid_print
import 'dart:convert';
import 'dart:io';
/// Generate JSON output for untranslated messages with English values
/// for quick translation in ChatGPT
///
/// Usage: dart bin/untranslated_messages.dart [locale?]
///
/// Example: dart bin/untranslated_messages.dart
///
/// or with specific locale (e.g. bn (Bengali))
///
/// Example: dart bin/untranslated_messages.dart bn
void main(List<String> args) {
final file = jsonDecode(
File('untranslated_messages.json').readAsStringSync(),
) as Map<String, dynamic>;
final englishMessages =
jsonDecode(File('lib/l10n/app_en.arb').readAsStringSync())
as Map<String, dynamic>;
final messagesWithValues = <String, dynamic>{};
for (final MapEntry(key: locale, value: messages) in file.entries) {
messagesWithValues[locale] = Map.fromEntries(
messages
.map(
(message) =>
MapEntry<String, dynamic>(message, englishMessages[message]),
)
.toList()
.cast<MapEntry<String, dynamic>>(),
);
}
print(
"Prompt:\n"
"Translate following to their appropriate locale for flutter arb translations files."
" Put the respective new translations in a map of their corresponding locale.",
);
print(
const JsonEncoder.withIndent(' ').convert(
args.isNotEmpty ? messagesWithValues[args.first] : messagesWithValues,
),
);
}

View File

@ -1,22 +0,0 @@
import 'dart:convert';
import 'dart:io';
void main() {
Process.run("sh", ["-c", '"./scripts/pkgbuild2json.sh aur-struct/PKGBUILD"'])
.then((result) {
try {
final pkgbuild = jsonDecode(result.stdout);
if (pkgbuild["version"] !=
Platform.environment["RELEASE_VERSION"]?.substring(1)) {
throw Exception(
"PKGBUILD version doesn't match current RELEASE_VERSION");
}
if (pkgbuild["release"] != "1") {
throw Exception("In new releases pkgrel should be 1");
}
} catch (e) {
// ignore: avoid_print
print("[Failed to parse PKGBUILD] $e");
}
});
}

View File

@ -1,7 +1,9 @@
import 'package:args/command_runner.dart'; import 'package:args/command_runner.dart';
import 'commands/build.dart'; import 'commands/build.dart';
import 'commands/credits.dart';
import 'commands/install-dependencies.dart'; import 'commands/install-dependencies.dart';
import 'commands/untranslated.dart';
void main(List<String> args) { void main(List<String> args) {
final commandRunner = CommandRunner( final commandRunner = CommandRunner(
@ -11,6 +13,8 @@ void main(List<String> args) {
commandRunner.addCommand(InstallDependenciesCommand()); commandRunner.addCommand(InstallDependenciesCommand());
commandRunner.addCommand(BuildCommand()); commandRunner.addCommand(BuildCommand());
commandRunner.addCommand(CreditsCommand());
commandRunner.addCommand(UntranslatedCommand());
commandRunner.run(args); commandRunner.run(args);
} }

114
cli/commands/credits.dart Normal file
View File

@ -0,0 +1,114 @@
import 'dart:io';
import 'package:args/command_runner.dart';
import 'package:collection/collection.dart';
import 'package:http/http.dart';
import 'package:html/parser.dart';
import 'package:path/path.dart';
import 'package:pub_api_client/pub_api_client.dart';
import 'package:pubspec_parse/pubspec_parse.dart';
class CreditsCommand extends Command {
@override
String get description => "Generate credits for used Library's authors";
@override
String get name => "credits";
@override
run() async {
final client = PubClient();
final cwd = Directory.current;
final pubspec = Pubspec.parse(
File(join(cwd.path, 'pubspec.yaml')).readAsStringSync(),
);
final allDeps = [
...pubspec.dependencies.entries,
...pubspec.devDependencies.entries,
];
final dependencies = allDeps
.where((d) => d.value is HostedDependency)
.map((d) => d.key)
.toSet();
final packageInfo = await Future.wait(dependencies.map(client.packageInfo));
final gitDepsList = List.castFrom<MapEntry<String, Dependency>,
MapEntry<String, GitDependency>>(
allDeps
.where((d) => d.value is GitDependency)
.map((d) => MapEntry(d.key, d.value as GitDependency))
.toList(),
);
final gitDeps = gitDepsList.map(
(d) {
final uri = Uri.parse(
d.value.url.toString().replaceAll('.git', ''),
);
return MapEntry(
d.key,
uri.replace(
pathSegments: [
...uri.pathSegments,
'raw',
d.value.ref ?? 'main',
d.value.path ?? '',
'pubspec.yaml',
],
).toString(),
);
},
).toList();
final gitPubspecs = await Future.wait(
gitDeps.map(
(d) {
Pubspec parser(res) {
try {
return Pubspec.parse(res.body);
} catch (e) {
final document = parse(res.body);
final pre = document.querySelector('pre');
if (pre == null) {
stdout.writeln(d.toString());
rethrow;
}
return Pubspec.parse(pre.text);
}
}
return get(Uri.parse(d.value)).then(parser).catchError(
(_) => get(Uri.parse(d.value.replaceFirst('/main', '/master')))
.then(parser),
);
},
),
);
stdout.writeln(
packageInfo
.map(
(package) =>
'1. [${package.name}](${package.latestPubspec.homepage ?? package.url}) - ${package.description.replaceAll('\n', '')}',
)
.join('\n'),
);
stdout.writeln(
gitPubspecs.map(
(package) {
final packageUrl = package.homepage ??
gitDepsList
.firstWhereOrNull((dep) => dep.key == package.name)
?.value
.url
.toString();
return '1. [${package.name}]($packageUrl) - ${package.description?.replaceAll('\n', '')}';
},
).join('\n'),
);
}
}

View File

@ -0,0 +1,39 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:args/command_runner.dart';
import 'package:path/path.dart';
class TranslatedCommand extends Command {
@override
String get description =>
"Update translation based on generated translated messages";
@override
String get name => "translated";
@override
FutureOr? run() async {
final cwd = Directory.current;
final translatedFile = jsonDecode(
await File(join(cwd.path, 'tm.json')).readAsString(),
) as Map<String, dynamic>;
for (final MapEntry(:key, :value) in translatedFile.entries) {
stdout.writeln('Updating locale: $key');
final file = File(join(cwd.path, 'lib', 'l10n', 'app_$key.arb'));
final fileContent =
jsonDecode(await file.readAsString()) as Map<String, dynamic>;
final newContent = {...fileContent, ...value};
await file.writeAsString(
const JsonEncoder.withIndent(' ').convert(newContent),
);
stdout.writeln('✅ Updated locale: $key');
}
}
}

View File

@ -0,0 +1,48 @@
import 'package:args/command_runner.dart';
import 'dart:convert';
import 'dart:io';
import 'package:path/path.dart';
class UntranslatedCommand extends Command {
@override
get name => "untranslated";
@override
get description =>
"Generate Untranslated Messages for ChatGPT based Translation";
@override
run() async {
final cwd = Directory.current;
final file = jsonDecode(
File(join(cwd.path, 'untranslated_messages.json')).readAsStringSync(),
) as Map<String, dynamic>;
final englishMessages = jsonDecode(
File(join(cwd.path, 'lib', 'l10n', 'app_en.arb')).readAsStringSync(),
) as Map<String, dynamic>;
final messagesWithValues = <String, dynamic>{};
for (final MapEntry(key: locale, value: messages) in file.entries) {
messagesWithValues[locale] = Map.fromEntries(
messages
.map(
(message) =>
MapEntry<String, dynamic>(message, englishMessages[message]),
)
.toList()
.cast<MapEntry<String, dynamic>>(),
);
}
stdout.writeln(
"Prompt:\n"
"Translate following to their appropriate locale for flutter arb translations files."
" Put the respective new translations in a map of their corresponding locale.",
);
stdout.writeln(
const JsonEncoder.withIndent(' ').convert(messagesWithValues),
);
}
}