mirror of
https://github.com/KRTirtho/spotube.git
synced 2025-09-13 07:55:18 +00:00
refactor: move dart scripts as commands under CLI
This commit is contained in:
parent
a77b6776e8
commit
a838eadc12
@ -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);
|
|
||||||
}
|
|
@ -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');
|
|
||||||
}
|
|
||||||
}
|
|
@ -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,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
@ -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");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
@ -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
114
cli/commands/credits.dart
Normal 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'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
39
cli/commands/translated.dart
Normal file
39
cli/commands/translated.dart
Normal 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');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
48
cli/commands/untranslated.dart
Normal file
48
cli/commands/untranslated.dart
Normal 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),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user