diff --git a/index.beta.js b/index.beta.js new file mode 100644 index 0000000..2d6f08b --- /dev/null +++ b/index.beta.js @@ -0,0 +1,59 @@ +// FORME PROMISE +utils.corpora.init = function(corporaDir, outputDir) { + // console.log(corporaDir, outputDir); + return new Promise(function(resolve, reject) { + var res = []; + // console.log('readDir :' + corporaDir); + fs.readdir(corporaDir, function(err, files) { + if (err) return reject(err); // Répertoire des corpus invalide + async.each(files, function(file, callback) { + var fullPath = path.join(corporaDir, file); + // console.log('readFile :' + fullPath); + fs.readFile(fullPath, 'utf-8', function(err, res) { + if (err) return callback(); // Ce n'est pas un fichier, on l'ignore + res.push(file); + var outputFile = path.join(outputDir, file); + // console.log('writeFile :' + outputFile); + fs.writeFile(outputFile, res, 'utf-8', function(err) { + // console.log(err); + if (err) return callback(err); + async.each(['in', 'out'], function(directory, cb) { + var dir = path.join(outputDir, directory, file.replace('.txt', '')); + // console.log('mkdirp :' + dir); + mkdirp(dir, + function(err) { + if (err) return cb(err); + return cb(); + }); + }, function(err) { + if (err) return callback(err); + return callback(); + }); + }); + }); + }, function(err) { + if (err) return reject(err, res); + return resolve(null, res); + }); + }); + }); +}; + +// FORME ASYNC/AWAIT (require un code full Promise!!) +utils.corpora.init = async function(corporaDir, outputDir) { + let files = await (fs.readdirAsync(corporaDir)); + for (var i = 0; i < files.length; i++) { + let fullPath = path.join(corporaDir, files[i]); + let stats = await (fs.statAsync(fullPath)); + if (!stats.isFile()) continue; + let directories = ['in', 'out'], + outputFile = path.join(outputDir, files[i]), + content = await (fs.readFileAsync(fullPath, 'utf-8')), + write = await (fs.writeFileAsync(outputFile, content, 'utf-8')); + for (var j = 0; j < directories.length; j++) { + let dir = path.join(outputDir, directories[j], files[i].replace('.txt', '')), + mkdir = await (mkdirp.mkdirpAsync(dir)); + } + } + return files; +}; \ No newline at end of file diff --git a/index.js b/index.js index 7e9cd98..1a9d2d2 100644 --- a/index.js +++ b/index.js @@ -45,128 +45,52 @@ * Objet permettant de traiter un ensemble de Corpus */ utils.corpusManager = {}; - /** - * Prépare les données des corpus (init + harvest des fichiers) - * @param {String} inputDir Chemin vers le répertoire contenant des corpus (un ou plusieurs fichiers .txt contenant des IDs ISTEX) + * Initialise les chemins d'un corpus de TDM dans EzMaster + * @param {String} file Chemin vers le fichier de corpus (un fichiers .corpus contenant sa description) * @param {String} outputDir Chemin vers le répertoire qui contiendra l'architecture créée * @param {function} cb Callback appelée à la fin du traitement, avec comme paramètre disponible : - * - {Error} err Erreurs lors du traitement - * - {Array} res Liste des Corpus correctement traités + * - {Error} err Erreurs de Lecture/Écriture + * - {Corpus} res Informations sur le corpus * @return {undefined} Return undefined - */ -utils.corpusManager.prepare = function(inputDir, outputDir, cb) { - return utils.corpusManager.init(inputDir, outputDir, function(err, corpora) { // Init des corpus - if (err) return cb(err); - var result = []; // Tableau qui contiendra tous les fichiers traités - return async.each(corpora, function(corpus, next) { - return utils.corpusManager.harvest(corpus.file, corpus.in, function(err, res) { // Harvest du corpus - if (err) return next(err); - result.push(corpus); - return next(); - }); - }, function(err) { - if (err) return cb(err, result); - return cb(null, result); - }); - }); -}; - -/** - * Initialise les chemins d'un outil de TDM dans EzMaster - * @param {String} inputDir Chemin vers le répertoire contenant des corpus (un ou plusieurs fichiers .txt contenant des IDs ISTEX) - * @param {String} outputDir Chemin vers le répertoire qui contiendra l'architecture créée - * @param {function} cb Callback appelée à la fin du traitement, avec comme paramètre disponible : - * - {Error} err Erreur de Lecture/Écriture - * - {Array} res Liste des fichiers correctements traités - * @return {undefined} Return undefined - * Exemple d'architecture crée pour 2 corpus x et y : + * Exemple d'architecture crée pour un corpus x : * ./ - * x.txt - * y.txt + * x.corpus * in/ * x/ - * y/ * out/ * x/ - * y/ */ -utils.corpusManager.init = function(inputDir, outputDir, cb) { - // Parcour du répertoire devant contenir les fichier txt - return fs.readdir(inputDir, function(err, files) { - if (err) return cb(err); // Répertoire contenant les fichiers 'corpus' invalide, renvois d'une erreur - var result = []; // Tableau qui contiendra tous les fichiers traités - return async.each(files, function(file, callback) { - if (!file.match(/[\w\W]+.txt$/)) return callback(err); // Nom invalide, on l'ignore - var corpusName = path.basename(file, '.txt'), // [PROVISOIRE] Nom du répertoire = Nom du fichier (sans l'extension) - fullPath = path.join(inputDir, file); // Chemin complet du fichier à partir de l'inputDir - return fs.stat(fullPath, function(err, stats) { - if (err) return callback(err); // Erreur lors du stats, on la remonte - if (!stats.isFile()) return callback(); // Ce n'est pas un fichier, on l'ignore - return fs.readFile(fullPath, 'utf-8', function(err, res) { - if (err) return callback(err); // Erreur lors du readFile, on la remonte - var outputFile = path.join(outputDir, file); // Erreur lors du readFile, on la remonte - return fs.writeFile(outputFile, res, 'utf-8', function(err) { - if (err) return callback(err); // Erreur lors du writeFile, on la remonte - var corpus = new Corpus({ - 'name': corpusName, - 'file': outputFile +utils.corpusManager.init = function(file, outputDir, cb) { + var filename = path.basename(file); // [PROVISOIRE] Nom du répertoire = Nom du fichier + return fs.stat(file, function(err, stats) { + if (err) return cb(err); // Erreur lors du stats, on la remonte + if (!stats.isFile()) return cb(); // Ce n'est pas un fichier, on l'ignore + return fs.readFile(file, 'utf-8', function(err, res) { + if (err) return cb(err); // Erreur lors du readFile, on la remonte + var outputFile = path.join(outputDir, filename); // Erreur lors du readFile, on la remonte + return fs.writeFile(outputFile, res, 'utf-8', function(err) { + if (err) return cb(err); // Erreur lors du writeFile, on la remonte + var corpus = new Corpus({ + 'name': filename, + 'file': outputFile + }); + return async.each(['in', 'out'], function(subDirectory, next) { // Création d'un répertoire dans in et out + var dir = path.join(outputDir, subDirectory, filename); // Chemin complet du répertoire + mkdirp(dir, + function(err) { + if (err) return next(err); // Erreur lors du mkdirp, on la remonte + corpus[subDirectory] = dir; + return next(); }); - return async.each(['in', 'out'], function(subDirectory, next) { // Création d'un répertoire dans in et out - var dir = path.join(outputDir, subDirectory, corpusName); // Chemin complet du répertoire - mkdirp(dir, - function(err) { - if (err) return next(err); // Erreur lors du mkdirp, on la remonte - corpus[subDirectory] = dir; - return next(); - }); - }, function(err) { - if (err) return callback(err); // Renvois de toutes les erreurs remontée lors de la création des répertoires - result.push(corpus); // Corpus correctement traité - return callback(); - }); - }); + }, function(err) { + if (err) return cb(err); // Renvois de toutes les erreurs remontée lors de la création des répertoires + return cb(null, corpus); // // Corpus correctement traité }); }); - }, function(err) { - if (err) return cb(err, result); // Renvois de toutes les erreurs remontée lors de la création des répertoires + copie du fichier - return cb(null, result); // Tout c'est bien passé! }); }); -}; - -/** - * Harvest les fichiers d'un corpus - * @param {String} inputFile Fichier d'entré contenant des Id ISTEX - * @param {String} outputDir Répertoire de sortie où écrire les pdf - * @param {function} cb Callback appelée à la fin du traitement, avec comme paramètre disponible : - * - {Error} err Erreurs lors du traitement - * - {Array} res Liste des Ids correctement traités - * @return {undefined} Return undefined - */ -utils.corpusManager.harvest = function(inputFile, outputDir, cb) { - return fs.readFile(inputFile, 'utf-8', function(err, res) { // Lecture du fichier d'entrée - var ids = res.split('\n'), // Split des Id (un Id / Ligne) - result = []; // Tableau qui contiendra tous les Id traités - return async.eachSeries(ids, function(id, next) { // Pour chaque Id - if (!id.match(/[0-9A-Fa-f]{40}/)) return next('Invalid ISTEX Id : ' + id); // Check si l'Id est valide - var url = 'https://api.istex.fr/document/' + id + '/fulltext/txt'; // Construction de l'url - return request(url, function(error, response, body) { - if (error) return next(error); // Si erreurd de request, on la remonte - if (response.statusCode.toString()[0] !== '2') return next(response); // Si erreur http (code différent de 2XX, on la remonte - var fullPath = path.join(outputDir, id + '.txt'); // Calcul du chemin complet du fichier téléchargé - return fs.writeFile(fullPath, body, function(err, res) { - if (err) return next(err); // Si erreur lors de l'écriture, on remonte l'erreur - result.push(id); // Sinon on considère l'Id comme 'done' - return next(); - }); - }); - }, function(err) { - if (err) return cb(err, result); // Renvoi de toutes les erreurs remontée lors de la création des répertoires + copie du fichier - return cb(null, result); - }); - }); -}; +} /** * Indexe tous les fichiers d'un corpus diff --git a/package.json b/package.json index 3694328..788b5fc 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,9 @@ "ezs-istex": "^1.0.1", "mkdirp": "^0.5.1", "mocha": "^3.2.0", - "rd-tu": "git+ssh://vsistex.intra.inist.fr:22222/istex/rd-tu.git", "rd-teeft": "git+ssh://vsistex.intra.inist.fr:22222/istex/rd-teeft.git", - "request": "^2.79.0" + "rd-tu": "git+ssh://vsistex.intra.inist.fr:22222/istex/rd-tu.git", + "request": "^2.79.0", + "sha1": "^1.1.1" } } diff --git a/test/dataset/in/data/corpusManager.json b/test/dataset/in/data/corpusManager.json index c9f5ccc..65651f2 100644 --- a/test/dataset/in/data/corpusManager.json +++ b/test/dataset/in/data/corpusManager.json @@ -1,18 +1,8 @@ { - "prepare": [{ - "label": "Devrait préparer correctement les données du corpus", - "arguments": { - "input": "./test/dataset/in/resources/corpora/", - "output": "./test/dataset/out/" - }, - "result": { - "equal": null - } - }], "init": [{ "label": "Devrait créer l'architecture de répertoire sans erreur", "arguments": { - "input": "./test/dataset/in/resources/corpora/", + "input": "./test/dataset/in/resources/corpora/corpus1.corpus", "output": "./test/dataset/out/" }, "result": { @@ -21,7 +11,7 @@ }, { "label": "Ne devrait pas créer l'architecture de répertoire (invalid output directory)", "arguments": { - "input": "./test/dataset/in/resources/corpora/", + "input": "./test/dataset/in/resources/corpora/corpus1.corpus", "output": "/opt" }, "result": { @@ -29,26 +19,6 @@ "equal": null } }], - "harvest": [{ - "label": "Devrait harvester le corpus sans erreur", - "arguments": { - "input": "./test/dataset/out/corpus1.txt", - "output": "./test/dataset/out/in/corpus1/" - }, - "result": { - "equal": null - } - }, { - "label": "Ne devrait pas harvester le corpus (Invalid Id)", - "arguments": { - "input": "./test/dataset/in/resources/corpora/errors/invalid_ids.txt", - "output": "./test/dataset/out/errors/" - }, - "result": { - "not": true, - "equal": null - } - }], "indexAll": [{ "label": "Devrait indexer tout le corpus", "arguments": { diff --git a/test/dataset/in/resources/corpora/corpus1.corpus b/test/dataset/in/resources/corpora/corpus1.corpus new file mode 100644 index 0000000..b6e1ebd --- /dev/null +++ b/test/dataset/in/resources/corpora/corpus1.corpus @@ -0,0 +1,2 @@ +0148EC60BFB569EF3D6176BC9B21B454B38473E8 +F6841D7E275289AFD47B1167D8DC665E1913FCED \ No newline at end of file diff --git a/test/dataset/in/resources/corpora/corpus1.txt b/test/dataset/in/resources/corpora/corpus1.txt deleted file mode 100644 index b6e1ebd..0000000 --- a/test/dataset/in/resources/corpora/corpus1.txt +++ /dev/null @@ -1,2 +0,0 @@ -0148EC60BFB569EF3D6176BC9B21B454B38473E8 -F6841D7E275289AFD47B1167D8DC665E1913FCED \ No newline at end of file diff --git a/test/dataset/in/resources/corpora/corpus2.txt b/test/dataset/in/resources/corpora/corpus2.txt deleted file mode 100644 index b6e1ebd..0000000 --- a/test/dataset/in/resources/corpora/corpus2.txt +++ /dev/null @@ -1,2 +0,0 @@ -0148EC60BFB569EF3D6176BC9B21B454B38473E8 -F6841D7E275289AFD47B1167D8DC665E1913FCED \ No newline at end of file diff --git a/test/dataset/in/resources/corpora/errors/invalid_ids.txt b/test/dataset/in/resources/corpora/errors/invalid_ids.txt deleted file mode 100644 index ee483f3..0000000 --- a/test/dataset/in/resources/corpora/errors/invalid_ids.txt +++ /dev/null @@ -1,3 +0,0 @@ -00 -azerty -./././ \ No newline at end of file diff --git a/test/run.js b/test/run.js index fe188a1..eba4156 100644 --- a/test/run.js +++ b/test/run.js @@ -17,8 +17,6 @@ var wrapper = { "corpusManager": { "init": testOf_corpusManagerInit, - "harvest": testOf_corpusManagerHarvest, - "prepare": testOf_corpusManagerPrepare, "indexAll": testOf_indexAll, }, "graphs": { @@ -56,26 +54,6 @@ /** * Fonction de test à appliquée pour : - * - corpusManager.harvest() - */ -function testOf_corpusManagerHarvest(fn, item, cb) { - return fn(item.arguments.input, item.arguments.output, function(err, res) { - return cb(err); - }); -} - -/** - * Fonction de test à appliquée pour : - * - corpusManager.prepare() - */ -function testOf_corpusManagerPrepare(fn, item, cb) { - return fn(item.arguments.input, item.arguments.output, function(err, res) { - return cb(err); - }); -} - -/** - * Fonction de test à appliquée pour : * - corpusManager.indexAll() */ function testOf_indexAll(fn, item, cb) {