refactor(branding): rename app Tanemaki → Tane

Public name is now Tane (種, "seed"); Tanemaki (種まき, "to scatter seeds")
is kept only as etymology in the About screen and onboarding.

App not yet distributed, so format tokens rename cleanly with no migration:
backup extension .tanemaki→.tane, QR scheme tanemaki://→tane://, file
prefixes tane-*. Website link and species-catalog User-Agent →
tane.comunes.org. Android label capitalised to "Tane".

Identity/crypto constants already use org.comunes.tane (derivation, HKDF
backup, sync namespace, TANE1 recovery tag) — left untouched, so keys,
backups and sync are unaffected. Tests updated; analyze + full suite green.
This commit is contained in:
vjrj 2026-07-12 13:04:16 +02:00
parent 2c113cc17d
commit a534c14983
34 changed files with 180 additions and 180 deletions

View file

@ -74,7 +74,7 @@ void main() {
.listSync()
.whereType<File>()
.map((f) => f.uri.pathSegments.last)
.where((n) => n.startsWith('tanemaki-auto-'))
.where((n) => n.startsWith('tane-auto-'))
.toList()
..sort();
@ -89,7 +89,7 @@ void main() {
expect(await service.runIfDue(), isTrue);
final copies = autoCopies();
expect(copies, ['tanemaki-auto-2026-07-10.tanemaki']);
expect(copies, ['tane-auto-2026-07-10.tane']);
final bytes = File('${dir.path}/${copies.single}').readAsBytesSync();
expect(BackupBox.looksSealed(bytes), isTrue);
});
@ -117,12 +117,12 @@ void main() {
);
expect(await service.runIfDue(), isTrue);
expect(autoCopies(), ['tanemaki-auto-2026-07-10.tanemaki']);
expect(autoCopies(), ['tane-auto-2026-07-10.tane']);
});
test('rotation keeps only the newest three copies', () async {
for (final d in ['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04']) {
File('${dir.path}/tanemaki-auto-$d.tanemaki').writeAsBytesSync([0]);
File('${dir.path}/tane-auto-$d.tane').writeAsBytesSync([0]);
}
final service = newService(
newExporter(),
@ -133,9 +133,9 @@ void main() {
await service.runIfDue();
expect(autoCopies(), [
'tanemaki-auto-2020-01-03.tanemaki',
'tanemaki-auto-2020-01-04.tanemaki',
'tanemaki-auto-2026-07-10.tanemaki',
'tane-auto-2020-01-03.tane',
'tane-auto-2020-01-04.tane',
'tane-auto-2026-07-10.tane',
]);
});
@ -151,7 +151,7 @@ void main() {
// runIfDue is a no-op today, but an explicit tap still makes a copy.
expect(await service.runIfDue(), isFalse);
expect(await service.backupNow(), isTrue);
expect(autoCopies(), ['tanemaki-auto-2026-07-10.tanemaki']);
expect(autoCopies(), ['tane-auto-2026-07-10.tane']);
});
test('a failed backup returns false and never throws', () async {

View file

@ -65,7 +65,7 @@ void main() {
await service.exportBackup();
expect(files.savedName, endsWith('.tanemaki'));
expect(files.savedName, endsWith('.tane'));
expect(BackupBox.looksSealed(files.saved!), isTrue);
expect(String.fromCharCodes(files.saved!).contains('Secret'), isFalse);
});

View file

@ -30,11 +30,11 @@ const _labels = [
commonName: 'Acelga',
scientificName: 'Beta vulgaris',
details: '2006 · Perales',
qrData: 'tanemaki://seed?v=Acelga+de+Perales&y=2006',
qrData: 'tane://seed?v=Acelga+de+Perales&y=2006',
),
LabelSheetLabel(
varietyLabel: 'Alubia de Tolosa',
qrData: 'tanemaki://seed?v=Alubia+de+Tolosa',
qrData: 'tane://seed?v=Alubia+de+Tolosa',
),
];
@ -57,7 +57,7 @@ void main() {
final service = LabelSheetService(files: _RecordingFileService());
final bytes = await service.buildPdf(
labels: const [
LabelSheetLabel(varietyLabel: 'Maíz', qrData: 'tanemaki://seed?v=Maíz'),
LabelSheetLabel(varietyLabel: 'Maíz', qrData: 'tane://seed?v=Maíz'),
],
format: LabelSheetFormat.stickers,
);
@ -68,7 +68,7 @@ void main() {
final service = LabelSheetService(files: _RecordingFileService());
final bytes = await service.buildPdf(
labels: const [
LabelSheetLabel(varietyLabel: 'بامية', qrData: 'tanemaki://seed?v=x'),
LabelSheetLabel(varietyLabel: 'بامية', qrData: 'tane://seed?v=x'),
],
format: LabelSheetFormat.cards,
rtl: true,
@ -82,11 +82,11 @@ void main() {
final saved = await service.saveLabels(
labels: _labels,
format: LabelSheetFormat.cards,
suggestedName: 'tanemaki-labels-2026-07-10.pdf',
suggestedName: 'tane-labels-2026-07-10.pdf',
);
expect(saved, isTrue);
expect(files.savedName, 'tanemaki-labels-2026-07-10.pdf');
expect(files.savedName, 'tane-labels-2026-07-10.pdf');
expect(String.fromCharCodes(files.saved!.take(5)), '%PDF-');
});
}

View file

@ -55,12 +55,12 @@ void main() {
final saved = await service.saveCatalog(
title: 'What I share',
date: 'July 9, 2026',
suggestedName: 'tanemaki-catalog-2026-07-09.pdf',
suggestedName: 'tane-catalog-2026-07-09.pdf',
rows: const [ShareCatalogRow(name: 'Maize', mode: 'To give away')],
);
expect(saved, isTrue);
expect(files.savedName, 'tanemaki-catalog-2026-07-09.pdf');
expect(files.savedName, 'tane-catalog-2026-07-09.pdf');
expect(String.fromCharCodes(files.saved!.take(5)), '%PDF-');
});
}