bin: move test tool to jadb executable as subcommand

This commit is contained in:
Oystein Kristoffer Tveit 2025-04-19 12:03:21 +02:00
parent a0ef42d6dc
commit a27925d359
Signed by: oysteikt
GPG Key ID: 9F2F7D8250F35146
4 changed files with 80 additions and 68 deletions

@ -1,39 +1,101 @@
import 'dart:convert';
import 'dart:ffi';
import 'dart:io';
import 'package:args/args.dart';
import 'package:args/command_runner.dart';
import 'package:jadb/_data_ingestion/jmdict/parser.dart';
import 'package:jadb/_data_ingestion/kanjidic/parser.dart';
import 'package:jadb/_data_ingestion/radkfile/parser.dart';
import 'package:jadb/search.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'package:sqlite3/open.dart';
ArgParser argParser() {
final parser = ArgParser();
parser.addOption(
void addLibsqliteArg(ArgParser argParser) {
argParser.addOption(
'libsqlite',
help:
'Path to the SQLite library. This is used to load the SQLite library dynamically.',
valueHelp: 'PATH',
defaultsTo: Platform.environment['LIBSQLITE_PATH'],
);
return parser;
}
Future<void> main(List<String> arguments) async {
final parser = argParser();
final ArgResults args = parser.parse(arguments);
void addJadbArg(ArgParser argParser) {
argParser.addOption(
'jadb',
abbr: 'f',
help: 'Path to the SQLite database file.',
valueHelp: 'PATH',
mandatory: true,
);
}
if (args.option('libsqlite') == null) {
print(parser.usage);
exit(64);
class CreateDb extends Command {
final name = "create-db";
final description = "Create the database";
CreateDb() {
addLibsqliteArg(argParser);
}
final db = await createDatabaseFactoryFfi(ffiInit: () {
open.overrideForAll(() => DynamicLibrary.open(args.option('libsqlite')!));
}).openDatabase(Directory.current.uri.resolve('jadb.sqlite').path);
Future<void> run() async {
if (argResults!.option('libsqlite') == null) {
print(argParser.usage);
exit(64);
}
await addDataFromJMdict(db);
await addDataFromRADKFILE(db);
await addDataFromKANJIDIC(db);
final db = await createDatabaseFactoryFfi(ffiInit: () {
open.overrideForAll(
() => DynamicLibrary.open(argResults!.option('libsqlite')!));
}).openDatabase(Directory.current.uri.resolve('jadb.sqlite').path);
await addDataFromJMdict(db);
await addDataFromRADKFILE(db);
await addDataFromKANJIDIC(db);
}
}
class QueryKanji extends Command {
final name = "query-kanji";
final description = "Query the database for kanji data";
QueryKanji() {
addLibsqliteArg(argParser);
addJadbArg(argParser);
}
Future<void> run() async {
if (argResults!.option('libsqlite') == null ||
!argResults!.wasParsed('jadb')) {
print(argParser.usage);
exit(64);
}
final db = await createDatabaseFactoryFfi(ffiInit: () {
open.overrideForAll(
() => DynamicLibrary.open(argResults!.option('libsqlite')!));
}).openDatabase(
Directory.current.uri.resolve(argResults!.option('jadb')!).path);
final result = await JaDBConnection(db).searchKanji('');
if (result == null) {
print("No such kanji");
} else {
print(JsonEncoder.withIndent(' ').convert(result.toJson()));
}
}
}
Future<void> main(List<String> args) async {
final runner = CommandRunner(
'jadb',
"CLI tool to help creating and testing the jadb database",
);
runner.addCommand(CreateDb());
runner.addCommand(QueryKanji());
runner.run(args);
}

@ -1,50 +0,0 @@
import 'dart:ffi';
import 'dart:io';
import 'package:args/args.dart';
import 'package:jadb/search.dart';
import 'package:sqflite_common_ffi/sqflite_ffi.dart';
import 'package:sqlite3/open.dart';
ArgParser argParser() {
final parser = ArgParser();
parser.addOption(
'libsqlite',
help:
'Path to the SQLite library. This is used to load the SQLite library dynamically.',
valueHelp: 'PATH',
defaultsTo: Platform.environment['LIBSQLITE_PATH'],
);
parser.addOption(
'jadb',
help: 'Path to the SQLite database file.',
valueHelp: 'PATH',
mandatory: true,
);
return parser;
}
Future<void> main(List<String> arguments) async {
final parser = argParser();
final ArgResults args = parser.parse(arguments);
if (args.option('libsqlite') == null || !args.wasParsed('jadb')) {
print(parser.usage);
exit(64);
}
final db = await createDatabaseFactoryFfi(ffiInit: () {
open.overrideForAll(() => DynamicLibrary.open(args.option('libsqlite')!));
}).openDatabase(Directory.current.uri.resolve(args.option('jadb')!).path);
final result = await JaDBConnection(db).searchKanji('');
if (result == null) {
print("No such kanji");
} else {
print(result.toJson().toString());
}
}

@ -16,6 +16,7 @@ stdenvNoCC.mkDerivation {
database-tool
sqlite
];
buildPhase = ''
runHook preBuild
@ -28,7 +29,7 @@ stdenvNoCC.mkDerivation {
sqlite3 jadb.sqlite < "$migration"
done
"${lib.getExe database-tool}" --libsqlite "${sqlite.out}/lib/libsqlite3.so"
"${lib.getExe database-tool}" create-db --libsqlite "${sqlite.out}/lib/libsqlite3.so"
runHook postBuild
'';

@ -19,7 +19,6 @@ dev_dependencies:
executables:
jadb: jadb
test: test_tool
topics:
- database