From 32962953d4e3ea69c442c8ee7fe501018c96fd52 Mon Sep 17 00:00:00 2001 From: Evgeny Metelkin Date: Mon, 13 Nov 2023 16:45:14 +0200 Subject: [PATCH] check empty exports --- TODO.md | 1 - src/core/abstract-export.js | 26 +++++++++++++++++++++++--- src/dbsolve-export/index.js | 12 ++++++------ src/dot-export/index.js | 4 +--- src/heta-code-export/index.js | 1 + src/json-export/index.js | 6 ++---- src/julia-export/index.js | 7 ++++--- src/matlab-export/index.js | 7 ++++--- src/mrgsolve-export/index.js | 7 ++++--- src/sbml-export/index.js | 3 +-- src/simbio-export/index.js | 10 +++++----- src/slv-export/index.js | 7 ++++--- src/yaml-export/index.js | 6 ++---- 13 files changed, 57 insertions(+), 40 deletions(-) diff --git a/TODO.md b/TODO.md index eb135432..b726ac6f 100644 --- a/TODO.md +++ b/TODO.md @@ -32,7 +32,6 @@ ## features -- check empty exports - default `filepath` for Export - checking legal functions inside Expressions and functionDefinition - `#defineFunction`: circular dependences within functions, internal functions, different exports, functionDef vs units diff --git a/src/core/abstract-export.js b/src/core/abstract-export.js index d6a1f1df..464eda23 100644 --- a/src/core/abstract-export.js +++ b/src/core/abstract-export.js @@ -52,10 +52,30 @@ class AbstractExport extends Top { type: 'text' // currently support only text }] */ - makeText(){ + makeText() { throw new TypeError(`No method makeText() for "${this.className}"`); } - make(){ // Buffer + get requireConcrete() { + return false; + } + selectedNamespaces() { + let logger = this._container.logger; + // filter namespaces if set + let namespaces0 = [...this._container.namespaceStorage] + .filter(([spaceName, ns]) => new RegExp(this.spaceFilter).test(spaceName)); + + let namespaces1 = this.requireConcrete + ? namespaces0.filter(([spaceName, ns]) => !ns.isAbstract) + : namespaces0; + + if (namespaces1.length === 0) { + let msg = `Nothing was exported because there is no concrete namespaces matching spaceFilter in "${this.format}".`; + logger.warn(msg, {}); + } + + return namespaces1; + } + make() { // Buffer let text = this.makeText(); let buffer = text.map((x) => { return { @@ -67,7 +87,7 @@ class AbstractExport extends Top { return buffer; } - static get validate(){ + static get validate() { return ajv.compile(schema); } } diff --git a/src/dbsolve-export/index.js b/src/dbsolve-export/index.js index 4d1a234f..6bdb34b6 100644 --- a/src/dbsolve-export/index.js +++ b/src/dbsolve-export/index.js @@ -33,6 +33,9 @@ class DBSolveExport extends AbstractExport{ if (q.defaultTask) this.defaultTask = q.defaultTask; } + get requireConcrete() { + return true; + } /** * The method creates text code to save as SLV file. * @@ -47,13 +50,10 @@ class DBSolveExport extends AbstractExport{ logger.warn(`"FunctionDef" object: ${functionsNames.join(', ')} are presented in platform but not supported by DBSolve export.`); } - // filter namespaces if set - let selectedNamespaces = [...this._container.namespaceStorage] - .filter(([spaceName, space]) => new RegExp(this.spaceFilter).test(spaceName)) - .filter(([spaceName, space]) => !space.isAbstract); + let selectedNamespaces = this.selectedNamespaces(); - let results = selectedNamespaces.map(([spaceName, namespace]) => { - let image = this.getSLVImage(namespace); + let results = selectedNamespaces.map(([spaceName, ns]) => { + let image = this.getSLVImage(ns); let content = this.getSLVCode(image); return { diff --git a/src/dot-export/index.js b/src/dot-export/index.js index c65474e1..54c70168 100644 --- a/src/dot-export/index.js +++ b/src/dot-export/index.js @@ -26,9 +26,7 @@ class DotExport extends AbstractExport{ makeText(){ let logger = this._container.logger; - // filter namespaces if set - let selectedNamespaces = [...this._container.namespaceStorage] - .filter(([spaceName, ns]) => new RegExp(this.spaceFilter).test(spaceName)); + let selectedNamespaces = this.selectedNamespaces(); let results = selectedNamespaces.map(([spaceName, ns]) => { let image = this.getDotImage(ns); diff --git a/src/heta-code-export/index.js b/src/heta-code-export/index.js index ab8affbd..2c209c0a 100644 --- a/src/heta-code-export/index.js +++ b/src/heta-code-export/index.js @@ -31,6 +31,7 @@ class HetaCodeExport extends AbstractExport{ makeText(){ // let logger = this._container.logger; + // XXX: do not filter namespaces let image = this.getHetaCodeImage(this._container); let content = this.getHetaCodeCode(image); diff --git a/src/json-export/index.js b/src/json-export/index.js index 13463b36..65fd524d 100644 --- a/src/json-export/index.js +++ b/src/json-export/index.js @@ -33,12 +33,10 @@ class JSONExport extends AbstractExport { } makeText(){ // filtered namespaces - let nsArrayFiltered = [...this._container.namespaceStorage] - .filter(([spaceName, ns]) => new RegExp(this.spaceFilter).test(spaceName)) - .map(([spaceName, ns]) => ns); + let nsArrayFiltered = this.selectedNamespaces(); // create qArr from NS - let qArr_ns = nsArrayFiltered.reduce((accumulator, ns) => { + let qArr_ns = nsArrayFiltered.reduce((accumulator, [spaceName, ns]) => { let qArr_setns = ns.spaceName === 'nameless' ? [] : [ns.toQ()]; // skip default NS let qArr_components = ns.toQArr(true, { noUnitsExpr: this.noUnitsExpr }); return accumulator.concat(qArr_setns, qArr_components); diff --git a/src/julia-export/index.js b/src/julia-export/index.js index 38c14dc3..95a45f49 100644 --- a/src/julia-export/index.js +++ b/src/julia-export/index.js @@ -28,14 +28,15 @@ class JuliaExport extends AbstractExport { static get validate(){ return ajv.compile(schema); } + get requireConcrete() { + return true; + } // skipVersionCode means that the version will not be printed in output // this is required for autotests makeText(skipVersionCode = false){ //let logger = this._container.logger; // create image for multiple namespaces - let nsImages = [...this._container.namespaceStorage] - .filter(([spaceName, ns]) => new RegExp(this.spaceFilter).test(spaceName)) - .filter(([spaceName, ns]) => !ns.isAbstract) + let nsImages = this.selectedNamespaces() .map(([spaceName, ns]) => this.getJuliaImage(ns)); // create Content diff --git a/src/matlab-export/index.js b/src/matlab-export/index.js index e8c5d557..8ce0162e 100644 --- a/src/matlab-export/index.js +++ b/src/matlab-export/index.js @@ -28,6 +28,9 @@ class MatlabExport extends AbstractExport { static get validate(){ return ajv.compile(schema); } + get requireConcrete() { + return true; + } // TODO: skipVersionCode does not work // skipVersionCode means that the version will not be printed in output // this is required for autotests @@ -35,9 +38,7 @@ class MatlabExport extends AbstractExport { let logger = this._container.logger; // filter namespaces if set - let selectedNamespaces = [...this._container.namespaceStorage] - .filter(([spaceName, ns]) => new RegExp(this.spaceFilter).test(spaceName)) - .filter(([spaceName, ns]) => !ns.isAbstract); + let selectedNamespaces = this.selectedNamespaces(); let results = []; diff --git a/src/mrgsolve-export/index.js b/src/mrgsolve-export/index.js index 2b9c074e..70896f29 100644 --- a/src/mrgsolve-export/index.js +++ b/src/mrgsolve-export/index.js @@ -27,13 +27,14 @@ class MrgsolveExport extends AbstractExport { static get validate(){ return ajv.compile(schema); } + get requireConcrete() { + return true; + } makeText(){ let logger = this._container.logger; // filter namespaces if set - let selectedNamespaces = [...this._container.namespaceStorage] - .filter(([spaceName, ns]) => new RegExp(this.spaceFilter).test(spaceName)) - .filter(([spaceName, ns]) => !ns.isAbstract); + let selectedNamespaces = this.selectedNamespaces(); // display that function definition is not supported let functionsNames = [...this._container.functionDefStorage.keys()]; diff --git a/src/sbml-export/index.js b/src/sbml-export/index.js index b62e59b9..d539b582 100644 --- a/src/sbml-export/index.js +++ b/src/sbml-export/index.js @@ -39,8 +39,7 @@ class SBMLExport extends AbstractExport { let logger = this._container.logger; // filter namespaces if set - let selectedNamespaces = [...this._container.namespaceStorage] - .filter(([spaceName, ns]) => new RegExp(this.spaceFilter).test(spaceName)); + let selectedNamespaces = this.selectedNamespaces(); let results = selectedNamespaces.map(([spaceName, ns]) => { let image = this.getSBMLImage(ns); diff --git a/src/simbio-export/index.js b/src/simbio-export/index.js index cab69de8..7fd62873 100644 --- a/src/simbio-export/index.js +++ b/src/simbio-export/index.js @@ -24,14 +24,14 @@ class SimbioExport extends AbstractExport{ get format(){ return 'Simbio'; } + get requireConcrete() { + return true; + } makeText(){ let logger = this._container.logger; - // filter namespaces if set - let selectedNamespaces = [...this._container.namespaceStorage] - .filter(([spaceName, ns]) => new RegExp(this.spaceFilter).test(spaceName)) - .filter(([spaceName, ns]) => !ns.isAbstract); - + let selectedNamespaces = this.selectedNamespaces(); + let results = selectedNamespaces.map(([spaceName, ns]) => { // checking unitTerm for Species ns.selectByInstanceOf('Species') diff --git a/src/slv-export/index.js b/src/slv-export/index.js index f46ec812..7d66182c 100644 --- a/src/slv-export/index.js +++ b/src/slv-export/index.js @@ -38,6 +38,9 @@ class SLVExport extends AbstractExport{ get format(){ return 'SLV'; } + get requireConcrete() { + return true; + } /** * The method creates text code to save as SLV file. * @@ -53,9 +56,7 @@ class SLVExport extends AbstractExport{ } // filter namespaces if set - let selectedNamespaces = [...this._container.namespaceStorage] - .filter(([spaceName, ns]) => new RegExp(this.spaceFilter).test(spaceName)) - .filter(([spaceName, ns]) => !ns.isAbstract); + let selectedNamespaces = this.selectedNamespaces(); let results = selectedNamespaces.map(([spaceName, ns]) => { let image = this.getSLVImage(ns); diff --git a/src/yaml-export/index.js b/src/yaml-export/index.js index 8424e4dc..aafc11c2 100644 --- a/src/yaml-export/index.js +++ b/src/yaml-export/index.js @@ -31,12 +31,10 @@ class YAMLExport extends AbstractExport { } makeText(){ // filtered namespaces - let nsArrayFiltered = [...this._container.namespaceStorage] - .filter(([spaceName, ns]) => new RegExp(this.spaceFilter).test(spaceName)) - .map(([spaceName, ns]) => ns); + let nsArrayFiltered = this.selectedNamespaces(); // create qArr from NS - let qArr_ns = nsArrayFiltered.reduce((accumulator, ns) => { + let qArr_ns = nsArrayFiltered.reduce((accumulator, [spaceName, ns]) => { let qArr_setns = ns.spaceName === 'nameless' ? [] : [ns.toQ()]; // skip default NS let qArr_components = ns.toQArr(true, { noUnitsExpr: this.noUnitsExpr }); return accumulator.concat(qArr_setns, qArr_components);