Salut,
J'ai jeté un oeil sur nuiton-csv, et je vais en profiter pour rajouter des
tests unitaires et de la doc.
J'ai pour le moment juste tester l'Import.
Quelques retours jusque là :
- Je ne suis pas fan du Iterator anonyme au milieu de la méthode
startImport. Je pense qu'il serait plus intéressant de le sortir en méthode
iterator() et du coup faire que Import implémente Iterable.
- Ma première utilisation de Import fut de l'utiliser tel quel en
implémentant les ImportableColumn. Je me suis aperçu qu'il y avait une
implémentation par défaut très intéressante qui est Column.
Du coup je me pose la question de l'interface. A priori les méthodes
static proposés suffisent pour instancier correctement le Column suivant le
besoin (import, export ou les deux). Je simplifierais donc bien en
utilisant
tout le temps Column. (cela enlèverait donc trois interfaces).
- La solution de mandatory/ignored est un peu confuse. L'implémentation
dans Column suppose que mandatory = !ignored, ce qui finalement se tient.
On aura jamais les deux à true ou les deux à false. A moins que j'ai zappé
un cas, je pense qu'il faut supprimer l'un des deux.
- La notion de readFirstLine pourrait être paramètrable via le modèle. A
moins que ce soit un pré-requis obligatoire que la première ligne soit les
HEADERS. (Ce qui sera ajouter explicitement à la doc)
- J'ai du mal avec la notion de start/stop. Je garderais plutôt l'idée de
read/close plus explicite sur ce qui se cache derrière (un fichier).
L'iterator se chargera du parcours. A noter que le validateCsv ne valide
que les headers et non l'intégralité des données (ce qui serait débile mais
peut porter à confusion).
Utilisation actuelle :
Import<Row> importRow = Import.newImport(rowModel, stream);
try {
Iterator<Row> iterator = importRow.startImport(); // validate headers,
read first line and return iterator
while (iterator.hasNext()) {
Row row = iterator.next();
// treatment
}
} finally {
importRow.stopImport();
}
Utilisation possible :
Import<Row> importRow = Import.newImport(rowModel, stream);
try {
importRow.readHeaders(); // validate headers and read first line
for (Row row : importRow) { // using importRow as Iterable
// treatment
}
} finally {
importRow.close();
}
Voilà pour le moment, je n'ai pas encore regarder le ModelBuilder. Je vais
commiter mon test d'Import (avec Model et ImportableColumn anonymes, avec
Model et Column)
Une autre idée en passant : Est-ce que ce serait pas plus intéressant
d'avoir le choix entre un rapport d'erreurs ou des exceptions dans le cas
d'un problème rencontré sur une ligne ? A l'heure actuelle il faut catcher
les exceptions une par une pour toutes les avoirs. Ce sera probablement
intéressant dans un deuxième temps si le besoin s'en fait sentir.