scilens 0.2.0__py3-none-any.whl → 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scilens/cli/main.py +7 -5
- scilens/components/compare_floats.py +41 -38
- scilens/components/file_reader.py +6 -12
- scilens/config/models/file_reader.py +1 -1
- scilens/config/models/readers.py +13 -2
- scilens/readers/reader_csv.py +1 -1
- scilens/readers/reader_manager.py +27 -8
- scilens/readers/reader_txt.py +1 -1
- scilens/readers/reader_txt_fixed_cols.py +10 -9
- scilens/report/templates/compare_11_summary.html +5 -1
- {scilens-0.2.0.dist-info → scilens-0.2.1.dist-info}/METADATA +1 -1
- {scilens-0.2.0.dist-info → scilens-0.2.1.dist-info}/RECORD +14 -14
- {scilens-0.2.0.dist-info → scilens-0.2.1.dist-info}/WHEEL +0 -0
- {scilens-0.2.0.dist-info → scilens-0.2.1.dist-info}/entry_points.txt +0 -0
scilens/cli/main.py
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
_B='green'
|
|
1
2
|
_A=True
|
|
2
3
|
import logging,os,coloredlogs,rich_click as click
|
|
3
4
|
from scilens.app import pkg_name,pkg_version
|
|
@@ -11,9 +12,9 @@ from scilens.cli.info import echo_info,echo_system_info,echo_draw
|
|
|
11
12
|
from scilens.config.cli_run_options import get_vars
|
|
12
13
|
from scilens.helpers.search_and_index import SearchAndIndex
|
|
13
14
|
def echo_separator(msg=None):
|
|
14
|
-
|
|
15
|
-
if A:A=f" {A}";click.echo(click.style(A.rjust(80,'='),fg=
|
|
16
|
-
else:click.echo(click.style('='*80,fg=
|
|
15
|
+
A=msg
|
|
16
|
+
if A:A=f" {A}";click.echo(click.style(A.rjust(80,'='),fg=_B))
|
|
17
|
+
else:click.echo(click.style('='*80,fg=_B))
|
|
17
18
|
def echo_task_error():click.echo(click.style('='*80,fg='red'))
|
|
18
19
|
@click.group()
|
|
19
20
|
@click.option('--log-level',default='INFO',help='Log level. Default is INFO. Available levels are DEBUG, INFO, WARNING, ERROR, CRITICAL.')
|
|
@@ -27,8 +28,9 @@ def info():echo_draw();echo_info()
|
|
|
27
28
|
@cli.command(short_help='Show system informations. (Useful for dynamic context configuration)')
|
|
28
29
|
def sysinfo():echo_system_info()
|
|
29
30
|
@cli.command(short_help='Show the reader plugins')
|
|
30
|
-
def
|
|
31
|
-
for A in
|
|
31
|
+
def readers():
|
|
32
|
+
J='configuration_type_code';I='class';D='yellow';A=' ';C=ReaderManager()._get_plugin_info();E='Class';F='Configuration Type Code';B=max([len(A[I])for A in C]+[len(E)]);G=max([len(A[J])for A in C]+[len(F)]);click.echo(click.style((E+A).ljust(B,A),fg=_B)+A+click.style(F,fg=D));click.echo(click.style(('-'*B).ljust(B,A),fg=_B)+A+click.style('-'*G,fg=D))
|
|
33
|
+
for H in C:click.echo(click.style(H[I].ljust(B,A),fg=_B)+A+click.style(H[J].ljust(G,A),fg=D))
|
|
32
34
|
@cli.group()
|
|
33
35
|
def config():0
|
|
34
36
|
@config.command(name='default',short_help='Example of default config')
|
|
@@ -2,46 +2,49 @@ _B='amplitude'
|
|
|
2
2
|
_A=None
|
|
3
3
|
from scilens.components.compare_errors import CompareErrors,SEVERITY_ERROR,SEVERITY_WARNING,CompareErrFloats
|
|
4
4
|
from scilens.config.models import CompareFloatThresholdsConfig
|
|
5
|
-
try:from
|
|
5
|
+
try:from scilens_compare import vectors as CheckVectors
|
|
6
6
|
except ModuleNotFoundError:pass
|
|
7
|
-
def vector_get_amplitude(vector):
|
|
7
|
+
def vector_get_amplitude(vector):min_val=min(vector);max_val=max(vector);return{'min':min_val,'max':max_val,_B:abs(max_val-min_val)}
|
|
8
8
|
class CompareFloats:
|
|
9
|
-
def __init__(
|
|
10
|
-
def compare_vectors(
|
|
11
|
-
|
|
12
|
-
if
|
|
13
|
-
|
|
14
|
-
if
|
|
15
|
-
|
|
16
|
-
if
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
if
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
9
|
+
def __init__(self,compare_errors,config):self.compare_errors=compare_errors;self.thresholds=config
|
|
10
|
+
def compare_vectors(self,test_vector,reference_vector,group_idx=_A,info_vector=_A):
|
|
11
|
+
A='ignore';diffs_count=0;counts={SEVERITY_ERROR:0,SEVERITY_WARNING:0};err_limit_reached=False;amplitude_compare=_A
|
|
12
|
+
if self.thresholds.vectors and self.thresholds.vectors.ponderation_method=='amplitude_moderation':amplitude=vector_get_amplitude(test_vector)[_B];amplitude_compare=amplitude*self.thresholds.vectors.amplitude_moderation_multiplier;reduction_method=self.thresholds.vectors.reduction_method
|
|
13
|
+
RIAE_force_severity=_A
|
|
14
|
+
if self.thresholds.vectors and self.thresholds.vectors.ponderation_method in['RIAE','RIAE_trapezoid','RIAE_midpoint']:
|
|
15
|
+
RIAE_force_severity=self.thresholds.vectors.reduction_method
|
|
16
|
+
if'CheckVectors'not in globals():raise Exception('scilens_compare not found. Please install scilens-compare package with `pip install scilens-compare`.')
|
|
17
|
+
riae_error=CheckVectors.relative_integral_absolute_error_trapezoid(reference_vector,test_vector,range(len(test_vector)));riae_error=CheckVectors.relative_integral_absolute_error_midpoint(reference_vector,test_vector,range(len(test_vector)));print('riae_error');print(riae_error)
|
|
18
|
+
if riae_error<self.thresholds.vectors.riae_threshold:RIAE_force_severity=self.thresholds.vectors.reduction_method
|
|
19
|
+
else:0
|
|
20
|
+
nb=len(test_vector)
|
|
21
|
+
for idx in range(nb):
|
|
22
|
+
diff=test_vector[idx]-reference_vector[idx]
|
|
23
|
+
if diff==0:continue
|
|
24
|
+
else:diffs_count+=1
|
|
25
|
+
if err_limit_reached:continue
|
|
26
|
+
if RIAE_force_severity==A:continue
|
|
27
|
+
if amplitude_compare is not _A and abs(diff)<amplitude_compare:
|
|
28
|
+
if reduction_method==A:continue
|
|
29
|
+
elif reduction_method=='soften':severity,message,comp_err=self.compare_2_values(test_vector[idx],reference_vector[idx]);severity=SEVERITY_WARNING
|
|
27
30
|
else:
|
|
28
|
-
|
|
29
|
-
if
|
|
30
|
-
if
|
|
31
|
-
|
|
32
|
-
if
|
|
33
|
-
|
|
34
|
-
return
|
|
35
|
-
def compare_2_values(
|
|
36
|
-
|
|
37
|
-
if abs(
|
|
38
|
-
|
|
39
|
-
if
|
|
40
|
-
if
|
|
41
|
-
else:return SEVERITY_ERROR,f"Rel. err. > {
|
|
31
|
+
severity,message,comp_err=self.compare_2_values(test_vector[idx],reference_vector[idx])
|
|
32
|
+
if RIAE_force_severity:severity=SEVERITY_WARNING
|
|
33
|
+
if comp_err:
|
|
34
|
+
counts[severity]+=1;info={'index':idx}
|
|
35
|
+
if info_vector:info['info']=info_vector[idx]
|
|
36
|
+
err_limit_reached=self.compare_errors.add(severity,message,comp_err,group_idx=group_idx,info=info)
|
|
37
|
+
return err_limit_reached,diffs_count,counts
|
|
38
|
+
def compare_2_values(self,test,reference):
|
|
39
|
+
thr=self.thresholds;sign=-1 if test-reference<0 else 1
|
|
40
|
+
if abs(test)>thr.relative_vs_absolute_min and reference!=0:
|
|
41
|
+
err=abs(test-reference)/abs(reference);comp_err=CompareErrFloats(is_relative=True,value=sign*err,test=test,reference=reference)
|
|
42
|
+
if err<thr.relative_error_max:
|
|
43
|
+
if err>thr.relative_error_min:return SEVERITY_WARNING,f"Rel. err. > {thr.relative_error_min} and < {thr.relative_error_max}",comp_err
|
|
44
|
+
else:return SEVERITY_ERROR,f"Rel. err. > {thr.relative_error_max}",comp_err
|
|
42
45
|
else:
|
|
43
|
-
|
|
44
|
-
if
|
|
45
|
-
if
|
|
46
|
-
else:return SEVERITY_ERROR,f"Abs. err. > {
|
|
46
|
+
err=abs(test-reference);comp_err=CompareErrFloats(is_relative=False,value=sign*err,test=test,reference=reference)
|
|
47
|
+
if err<thr.absolute_error_max:
|
|
48
|
+
if err>thr.absolute_error_min:return SEVERITY_WARNING,f"Abs. err. > {thr.absolute_error_min} and < {thr.absolute_error_max}",comp_err
|
|
49
|
+
else:return SEVERITY_ERROR,f"Abs. err. > {thr.absolute_error_max}",comp_err
|
|
47
50
|
return _A,_A,_A
|
|
@@ -15,17 +15,11 @@ class FileReader:
|
|
|
15
15
|
if not B:raise Exception(f"Custom curve parser not found: {A}")
|
|
16
16
|
J=C.split('/')[-1].replace('.py','');F=importlib.util.spec_from_file_location(J,B);G=importlib.util.module_from_spec(F);F.loader.exec_module(G);return getattr(G,H)
|
|
17
17
|
def read(A,path):
|
|
18
|
-
logging.info(f"Reading file: {path}");
|
|
19
|
-
if
|
|
20
|
-
if isinstance(
|
|
21
|
-
try:
|
|
22
|
-
B=A.reader_mgmr.get_reader_from_file(path,encoding=A.config.encoding,curve_parser=E,extension_mapping=A.config.extension_mapping,extension_fallback=A.config.extension_fallback);C=_A
|
|
23
|
-
if B.__class__.__name__=='ReaderTxt':C=A.readers_config.txt
|
|
24
|
-
elif B.__class__.__name__=='ReaderCsv':C=A.readers_config.csv
|
|
25
|
-
elif B.__class__.__name__=='ReaderTxtFixedCols':C=A.readers_config.txt_fixed_cols
|
|
26
|
-
elif B.__class__.__name__=='ReaderNetcdf':C=A.readers_config.netcdf
|
|
27
|
-
B.read(C)
|
|
18
|
+
logging.info(f"Reading file: {path}");D=_A;B=A.config.custom_curve_parser
|
|
19
|
+
if B:
|
|
20
|
+
if isinstance(B,str):D=A._get_custom_parser(B)
|
|
21
|
+
try:C,E=A.reader_mgmr.get_reader_from_file(path,config=A.config,readers_config=A.readers_config,curve_parser=D);C.read(E)
|
|
28
22
|
except NoReaderFound:
|
|
29
|
-
if A.config.extension_unknown_ignore:
|
|
23
|
+
if A.config.extension_unknown_ignore:C=_A
|
|
30
24
|
else:raise Exception(f"No reader found")
|
|
31
|
-
return
|
|
25
|
+
return C
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
_A=None
|
|
2
2
|
from pydantic import BaseModel,Field
|
|
3
|
-
class FileReaderConfig(BaseModel):extension_unknown_ignore:bool=Field(default=False,description="Si aucun reader n'est trouvé pour une extension, passe au suivant sans générer d'erreur.");extension_mapping:dict|_A=Field(default=_A,description='Mapping d\'extensions source - cible. Ex `{"txt": "csv"}`.');extension_fallback:str|_A=Field(default=_A,description="Si aucun reader n'est trouvé pour une extension, utilise cette extension pour déterminer le reader.");
|
|
3
|
+
class FileReaderConfig(BaseModel):encoding:str=Field(default='utf-8',description='Encodage utilisé pour lire les fichiers.');extension_unknown_ignore:bool=Field(default=False,description="Si aucun reader n'est trouvé pour une extension, passe au suivant sans générer d'erreur.");extension_mapping:dict|_A=Field(default=_A,description='Mapping d\'extensions source - cible. Ex `{"txt": "csv"}`.');extension_fallback:str|_A=Field(default=_A,description="Si aucun reader n'est trouvé pour une extension, utilise cette extension pour déterminer le reader.");extension_readers_catalog:dict[str,str]|_A=Field(default=_A,description="Mapping extension clé du catalogue de readers. Ex: `{'dat1': 'csv_comma', 'dat2': 'csv_semicolon'}`");custom_curve_parser:str|dict[str,str]|_A=Field(default=_A,description="Représente le chemin d'un fichier/module python suivi par :: suivi par le nom d'une fonction à appeller pour parser les courbes d'un fichier. Le chemin peut être absolu ou relatif. Dans le cas, d'un chemin relatif, il testera le `working directory` et le `origin working directory`. Ex: `custom_parser.py::parse_curves`")
|
scilens/config/models/readers.py
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
_B='netcdf'
|
|
2
|
+
_A='txt_fixed_cols'
|
|
3
|
+
from typing import Literal
|
|
4
|
+
from pydantic import BaseModel,Field,model_validator
|
|
2
5
|
from scilens.config.models.reader_format_txt import ReaderTxtConfig
|
|
3
6
|
from scilens.config.models.reader_format_csv import ReaderCsvConfig
|
|
4
7
|
from scilens.config.models.reader_format_txt_fixed_cols import ReaderTxtFixedColsConfig
|
|
5
8
|
from scilens.config.models.reader_format_netcdf import ReaderNetcdfConfig
|
|
6
|
-
|
|
9
|
+
TYPE_PARAMETERS_CLASS={'txt':ReaderTxtConfig,'csv':ReaderCsvConfig,_A:ReaderTxtFixedColsConfig,_B:ReaderNetcdfConfig}
|
|
10
|
+
class ReaderConfig(BaseModel):
|
|
11
|
+
type:Literal['txt','csv',_A,_B]=Field(description='Type du reader. Les paramètres `parameters` dépendent de ce type.');parameters:ReaderTxtConfig|ReaderCsvConfig|ReaderTxtFixedColsConfig|ReaderNetcdfConfig=Field(description='Paramètres du reader')
|
|
12
|
+
@model_validator(mode='after')
|
|
13
|
+
def validate_model(cls,model):
|
|
14
|
+
A=model
|
|
15
|
+
if not isinstance(A.parameters,TYPE_PARAMETERS_CLASS[A.type]):raise ValueError(f"Reader Type {A.type} Parameters are not correct")
|
|
16
|
+
return A
|
|
17
|
+
class ReadersConfig(BaseModel):txt:ReaderTxtConfig=Field(default=ReaderTxtConfig(),description='Configuration des readers txt.');csv:ReaderCsvConfig=Field(default=ReaderCsvConfig(),description='Configuration des readers csv.');txt_fixed_cols:ReaderTxtFixedColsConfig=Field(default=ReaderTxtFixedColsConfig(),description='Configuration des readers txt avec colonnes fixes.');netcdf:ReaderNetcdfConfig=Field(default=ReaderNetcdfConfig(),description='Configuration des readers NetCDF.');catalog:dict[str,ReaderConfig]|None=Field(default=None,description="Catalogue de configuration de readers par clé. Ex: `{'csv_comma': {'type': 'csv', 'parameters': {'delimiter': ','}}, 'csv_semicolon': {'type': 'csv', 'parameters': {'delimiter': ';'}}}`")
|
scilens/readers/reader_csv.py
CHANGED
|
@@ -15,7 +15,7 @@ def csv_row_detect_cols_num(row):return[A for(A,B)in enumerate(row)if is_num(B)!
|
|
|
15
15
|
def csv_detect(path,delimiter,quotechar):
|
|
16
16
|
with open(path,'r')as B:A=csv.reader(B,delimiter=delimiter,quotechar=quotechar);C=next(A);D,E=csv_row_detect_header(C);F=next(A);G=csv_row_detect_cols_num(F);return D,E,G
|
|
17
17
|
class ReaderCsv(ReaderInterface):
|
|
18
|
-
category='datalines';extensions=['CSV']
|
|
18
|
+
configuration_type_code='csv';category='datalines';extensions=['CSV']
|
|
19
19
|
def read(A,reader_options):
|
|
20
20
|
C=reader_options;A.reader_options=C;D,E,K=csv_detect(A.origin.path,A.reader_options.delimiter,A.reader_options.quotechar);A.has_header=D;A.cols=E;A.numeric_col_indexes=K
|
|
21
21
|
if C.ignore_columns:
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
_A=None
|
|
1
2
|
import os,sys
|
|
2
3
|
from importlib.metadata import entry_points
|
|
3
4
|
from scilens.readers.exceptions import NoReaderFound
|
|
4
5
|
from scilens.readers.reader_interface import ReaderOrigin
|
|
6
|
+
from scilens.config.models import FileReaderConfig
|
|
7
|
+
from scilens.config.models.readers import ReadersConfig
|
|
5
8
|
def extension_format(extension):
|
|
6
9
|
A=extension
|
|
7
10
|
if A.startswith('.'):A=A[1:]
|
|
@@ -16,16 +19,32 @@ class ReaderManager:
|
|
|
16
19
|
A.plugins=[]+BUILTIN_PLUGINS;B=entry_points(group=LIB_PLUGINS_ENTRY_POINT)if sys.version_info.minor>=12 else entry_points().get(LIB_PLUGINS_ENTRY_POINT,[])
|
|
17
20
|
for C in B:A.plugins+=C.load()()
|
|
18
21
|
def _get_plugin_names(A):return[A.__name__ for A in A.plugins]
|
|
22
|
+
def _get_plugin_info(A):return[{'class':A.__name__,'configuration_type_code':A.configuration_type_code}for A in A.plugins]
|
|
19
23
|
def __str__(A):return f"plugins: {A._get_plugin_names()}"
|
|
20
24
|
def _get_reader_from_extension(B,extension):
|
|
21
25
|
for A in B.plugins:
|
|
22
26
|
if extension_format(extension)in A.extensions:return A
|
|
23
|
-
def
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
def _get_reader_from_configuration_type_code(B,code):
|
|
28
|
+
for A in B.plugins:
|
|
29
|
+
if code==A.configuration_type_code:return A
|
|
30
|
+
def get_reader_from_file(F,path,name='',config=_A,readers_config=_A,curve_parser=_A):
|
|
31
|
+
I=curve_parser;G=path;C=readers_config;A=config;J=ReaderOrigin(type='file',path=G,short_name=os.path.basename(G));K=A.encoding if A else'utf-8';Q,D=os.path.splitext(G);D=extension_format(D)
|
|
32
|
+
if A and A.extension_readers_catalog:
|
|
33
|
+
for(M,L)in A.extension_readers_catalog.items():
|
|
34
|
+
if extension_format(M)==D:
|
|
35
|
+
if not C.catalog or L not in C.catalog.keys():raise NoReaderFound(f"Reader config not found for {D}")
|
|
36
|
+
H=C.catalog[L];B=F._get_reader_from_configuration_type_code(H.type)
|
|
37
|
+
if not B:raise Exception(f"Reader not found for contiguration type code {H.type}")
|
|
38
|
+
N=H.parameters;return B(J,name=name,encoding=K,curve_parser=I),N
|
|
39
|
+
if A and A.extension_mapping:
|
|
40
|
+
for(O,P)in A.extension_mapping.items():
|
|
41
|
+
if extension_format(O)==D:D=extension_format(P);break
|
|
42
|
+
B=F._get_reader_from_extension(D)
|
|
43
|
+
if not B and A and A.extension_fallback:B=F._get_reader_from_extension(A.extension_fallback)
|
|
30
44
|
if not B:raise NoReaderFound(f"Reader cound not be derived")
|
|
31
|
-
|
|
45
|
+
E=_A
|
|
46
|
+
if B.__name__=='ReaderTxt':E=C.txt
|
|
47
|
+
elif B.__name__=='ReaderCsv':E=C.csv
|
|
48
|
+
elif B.__name__=='ReaderTxtFixedCols':E=C.txt_fixed_cols
|
|
49
|
+
elif B.__name__=='ReaderNetcdf':E=C.netcdf
|
|
50
|
+
return B(J,name=name,encoding=K,curve_parser=I),E
|
scilens/readers/reader_txt.py
CHANGED
|
@@ -10,7 +10,7 @@ from scilens.config.models import ReaderTxtConfig
|
|
|
10
10
|
from scilens.components.compare_errors import SEVERITY_ERROR
|
|
11
11
|
from scilens.components.compare_floats import CompareFloats
|
|
12
12
|
class ReaderTxt(ReaderInterface):
|
|
13
|
-
category='datalines';extensions=['TXT']
|
|
13
|
+
configuration_type_code='txt';category='datalines';extensions=['TXT']
|
|
14
14
|
def read(A,config):
|
|
15
15
|
F='_';B=config;A.reader_options=B;A.get_lines_pre=1;A.get_lines_post=1
|
|
16
16
|
if B.report_lines:
|
|
@@ -6,27 +6,28 @@ from scilens.config.models import ReaderTxtFixedColsConfig
|
|
|
6
6
|
from scilens.config.models.reader_format_cols_curve import ReaderCurveParserNameConfig
|
|
7
7
|
from scilens.components.compare_floats import CompareFloats
|
|
8
8
|
class ReaderTxtFixedCols(ReaderInterface):
|
|
9
|
-
category='datalines';extensions=[
|
|
9
|
+
configuration_type_code='txt_fixed_cols';category='datalines';extensions=[]
|
|
10
10
|
def read(B,reader_options):
|
|
11
|
-
A=reader_options;B.reader_options=A;J=open(B.origin.path,'r',encoding=B.encoding);K=A.column_widths;L=A.ignore_lines_patterns;
|
|
12
|
-
for
|
|
11
|
+
A=reader_options;B.reader_options=A;J=open(B.origin.path,'r',encoding=B.encoding);K=A.column_widths;L=A.ignore_lines_patterns;E=len(K);C=ColsDataset(cols_count=E,names=[f"Column {A+1}"for A in range(E)],numeric_col_indexes=[A for A in range(E)],data=[[]for A in range(E)]);F=None;G=0
|
|
12
|
+
for D in J:
|
|
13
13
|
G+=1
|
|
14
14
|
if L:
|
|
15
15
|
M=False
|
|
16
16
|
for P in L:
|
|
17
|
-
if bool(re.match(P,
|
|
17
|
+
if bool(re.match(P,D)):M=True;break
|
|
18
18
|
if M:continue
|
|
19
19
|
if A.has_header:
|
|
20
|
-
if not
|
|
21
|
-
|
|
20
|
+
if not F:
|
|
21
|
+
F=D.strip();H=F
|
|
22
22
|
if A.has_header_ignore:
|
|
23
23
|
for Q in A.has_header_ignore:H=H.replace(Q,'')
|
|
24
24
|
C.names=H.split();continue
|
|
25
|
-
elif A.has_header_repetition and
|
|
25
|
+
elif A.has_header_repetition and F==D.strip():continue
|
|
26
|
+
if not D.strip():continue
|
|
26
27
|
I=0;N=0
|
|
27
|
-
for O in K:R=
|
|
28
|
+
for O in K:R=D[I:I+O].strip();S=string_2_float(R);C.data[N].append(S);I+=O;N+=1
|
|
28
29
|
C.origin_line_nb.append(G)
|
|
29
|
-
C.rows_count=len(C.origin_line_nb);J.close();B.cols_dataset=C;B.raw_lines_number=G;
|
|
30
|
+
C.rows_count=len(C.origin_line_nb);J.close();B.cols_dataset=C;B.raw_lines_number=G;B.curves=None
|
|
30
31
|
if A.curve_parser:
|
|
31
32
|
if A.curve_parser.name==ReaderCurveParserNameConfig.COL_X:
|
|
32
33
|
B.curves,T=cols_dataset_get_curves_col_x(C,A.curve_parser.parameters.x)
|
|
@@ -53,10 +53,14 @@
|
|
|
53
53
|
<td class="number {{ 'ERROR' if file.comparison_errors.error_nb else '' }}">{{ file.comparison_errors.error_nb }}</td>
|
|
54
54
|
<td class="number {{ 'WARNING' if file.comparison_errors.warning_nb else '' }}">{{ file.comparison_errors.warning_nb }}</td>
|
|
55
55
|
<td class="number">{{ file.comparison.total_diffs }}</td>
|
|
56
|
-
{%
|
|
56
|
+
{% elif not file.skipped %}
|
|
57
57
|
<td class="ERROR">ERROR</td>
|
|
58
58
|
<td class="ERROR">ERROR</td>
|
|
59
59
|
<td class="ERROR">ERROR</td>
|
|
60
|
+
{% else %}
|
|
61
|
+
<td></td>
|
|
62
|
+
<td></td>
|
|
63
|
+
<td></td>
|
|
60
64
|
{% endif %}
|
|
61
65
|
<td class="number test-bg-20">{{ file.test.raw_lines_number }}</td>
|
|
62
66
|
<td class="number refe-bg-20">{{ file.ref.raw_lines_number }}</td>
|
|
@@ -5,15 +5,15 @@ scilens/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
5
5
|
scilens/cli/cglb.py,sha256=R0377H5H193DJ_h4hj32m6qvrZrMnSFOxSGVl2FItiU,443
|
|
6
6
|
scilens/cli/config.py,sha256=XVY6q5E9fb6MZzPct4-X7m6e45erpt5MCIuzKTBKPAI,965
|
|
7
7
|
scilens/cli/info.py,sha256=xE7q9epjrCQRL6Agi3nhKsG6Mr3B8HSUFMti-epMoXA,1929
|
|
8
|
-
scilens/cli/main.py,sha256=
|
|
8
|
+
scilens/cli/main.py,sha256=LljcS0s2E35y4YZpV01GhMhMK9HyRRHYmxc_q_kSurI,6004
|
|
9
9
|
scilens/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
10
|
scilens/components/analyse_folder.py,sha256=yqc-dscKaHLZJCYeXGak2v0c3F2aeX0E11AFPfya6r0,208
|
|
11
11
|
scilens/components/compare_2_files.py,sha256=oQ5p9JwB1r_HhfCb29mv1kkkrUd0EdrVug9T-1fQshY,1286
|
|
12
12
|
scilens/components/compare_errors.py,sha256=_n9uWwLVZyPn99mwsAF8WBfcYppVQCsMwj0xuOrlhkU,1241
|
|
13
|
-
scilens/components/compare_floats.py,sha256=
|
|
13
|
+
scilens/components/compare_floats.py,sha256=UGUJF-WEZJSCpHZUAvVhkWY-mWiQZ8RqYnkTjFdRp1Y,3617
|
|
14
14
|
scilens/components/compare_folders.py,sha256=LZ1AuYxLVHMNbtXWXQrdms4vZgOQthvDy-8NFD_EFjc,2617
|
|
15
15
|
scilens/components/executor.py,sha256=8ZZq9wwoiMr7ys9LXv1pEg5Zc06QatT9PGIigMsDAB8,3620
|
|
16
|
-
scilens/components/file_reader.py,sha256=
|
|
16
|
+
scilens/components/file_reader.py,sha256=2xvBoiJSb0KUihLzRK_o-DdGSRqEBu0-QwT1i9CCWRM,1346
|
|
17
17
|
scilens/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
18
|
scilens/config/cli_run_options.py,sha256=Ls7yK5QDUPFbk73nbjGuPvuRbBRYw4Miag5ISpu3prg,281
|
|
19
19
|
scilens/config/env_var.py,sha256=NqNBoIfngJEXaGEm7jGqre5pmkJ9eUjiWzbDrTVfi2c,292
|
|
@@ -24,13 +24,13 @@ scilens/config/models/compare.py,sha256=_SLMxf81fpuod8izZm72Jn12euRPxB0wHJSfUuIA
|
|
|
24
24
|
scilens/config/models/compare_float_thresholds.py,sha256=J5XBK1dAnmU-i2uA2bsaHnTM_m07_i17wsO8UiCw46o,1844
|
|
25
25
|
scilens/config/models/execute.py,sha256=pFY-gZuBvLbcjTEcoNhPPO7FMFmKa6_TU5IXyKaf81A,1706
|
|
26
26
|
scilens/config/models/execute_and_compare.py,sha256=TWL6yXGvQSaaV6nhHqWLvtr3v396APIoDNt0U1TbMro,582
|
|
27
|
-
scilens/config/models/file_reader.py,sha256=
|
|
27
|
+
scilens/config/models/file_reader.py,sha256=c18vKhVcBX4ufpbnCBJyVyAsQtlxpwx0lGVuf1i8EGA,1176
|
|
28
28
|
scilens/config/models/reader_format_cols_curve.py,sha256=eKLvifq1xuN8sPds9ijfru3vgMZ3Odv5tGfeiK4Sfk4,1860
|
|
29
29
|
scilens/config/models/reader_format_csv.py,sha256=XWZTr6s0PPfcOMRrsNeOZGtExC1uyXb67A158MMWzC4,577
|
|
30
30
|
scilens/config/models/reader_format_netcdf.py,sha256=nbfTB3avO0DidbNa1dCZGFZmmQvzTYhpe6mqfAanaOA,1025
|
|
31
31
|
scilens/config/models/reader_format_txt.py,sha256=eHg90gwEI_VpqwqEjMRhwlS8dHcl5G4ow-37HjQq_zY,1168
|
|
32
32
|
scilens/config/models/reader_format_txt_fixed_cols.py,sha256=xHD1_JOoRZow8lSNaDSYFeNckojctkT4C61mbBcjeKg,1079
|
|
33
|
-
scilens/config/models/readers.py,sha256=
|
|
33
|
+
scilens/config/models/readers.py,sha256=Pq5kOGW3b6g1x5cp_BbwUF7LUB_P3m9bHDYLSTVXNBY,1769
|
|
34
34
|
scilens/config/models/report.py,sha256=nTmP2nIwL2Ku5IH9QMwYLPKmfsK2ttu9UK0GnzPUHeM,870
|
|
35
35
|
scilens/config/models/report_html.py,sha256=9I9iKRDOoLMZRBY0lQV4UFtg5-D-VDfYiFGF1VFAnQ8,1389
|
|
36
36
|
scilens/config/models/report_output.py,sha256=XoqUe-t-y8GRbUR3_bDwwaWf6hif-rZ-5pKDGdCMugw,875
|
|
@@ -50,11 +50,11 @@ scilens/readers/cols_dataset.py,sha256=suEttRHfj9UhHndchAKazLD2z_YY9dFEVLjlodRJS
|
|
|
50
50
|
scilens/readers/exceptions.py,sha256=JzmxcjnR5sH-IOWVeCC5A1bSwxv-jCAtIJvDjzx1CTI,32
|
|
51
51
|
scilens/readers/reader_com_txt_lines.py,sha256=zsCumTD0sv06OQNvRKPMuv94De_6KGMvN904-E1Uqeg,91
|
|
52
52
|
scilens/readers/reader_csv copy.py,sha256=eFWQvMt4Ot7KgUIDsed1QymMbPblgboUclvQj6viVGs,4069
|
|
53
|
-
scilens/readers/reader_csv.py,sha256=
|
|
53
|
+
scilens/readers/reader_csv.py,sha256=oLbA4wU6rlzL1cIrW-AzWifP-RvmG3yHKWQQqITYQ1U,2732
|
|
54
54
|
scilens/readers/reader_interface.py,sha256=nnttHL7wt4MOXpi-SBkk8DYxVWscOPG8JFl_z12mIAo,922
|
|
55
|
-
scilens/readers/reader_manager.py,sha256=
|
|
56
|
-
scilens/readers/reader_txt.py,sha256=
|
|
57
|
-
scilens/readers/reader_txt_fixed_cols.py,sha256=
|
|
55
|
+
scilens/readers/reader_manager.py,sha256=DFinxIk3IIIcB6JxybGcv-mXt3jhXgCwUtzR0TqhB2Q,2684
|
|
56
|
+
scilens/readers/reader_txt.py,sha256=xeiQNrWSr-jRnb0KoYya8Y_gdjT-0L_iXS4TW_bfqQc,3774
|
|
57
|
+
scilens/readers/reader_txt_fixed_cols.py,sha256=KuZd62_cmV9vHRlar2K-acFVVLf28bAqRSbpRRNjblI,2258
|
|
58
58
|
scilens/readers/transform.py,sha256=kppfgPkXymF0qtquFivuosLVfF66L9bE-wGx-3bMHv8,307
|
|
59
59
|
scilens/report/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
60
60
|
scilens/report/assets/logo.svg,sha256=W-1OVqcvdBjf-1AHHcV6WciIUqBoVFUh52Tc3o_jqtA,4519
|
|
@@ -65,7 +65,7 @@ scilens/report/report.py,sha256=aS7ktJ2u0IAMMk-HwqqSsRkr77ZBQyYT4wXJ7djQvAk,1811
|
|
|
65
65
|
scilens/report/template.py,sha256=cPs5gd3uEwb-6JgitGQD_i4IiUxigBTlZLNRS9KVuos,581
|
|
66
66
|
scilens/report/templates/body_01_title.html,sha256=59BmETKHqRO1T_xYp0XLKx3Vha9hU9bu7yaUTVt2p9Y,2146
|
|
67
67
|
scilens/report/templates/body_99_footer.html,sha256=8cWebeWfZwZ-9bYAMZkZj8rbCWq3BLIMjKQThWQxoQM,362
|
|
68
|
-
scilens/report/templates/compare_11_summary.html,sha256=
|
|
68
|
+
scilens/report/templates/compare_11_summary.html,sha256=4rxBlOxTcn59ztYtqDbi6SRQXlaz30HkVl7dJpzCmZE,3776
|
|
69
69
|
scilens/report/templates/compare_12_sections.html,sha256=HWsfCmfdleyRK6IHJeMEheenOuyA0mLzOZ-0qLcuzJU,5952
|
|
70
70
|
scilens/report/templates/compare_13_section_numbers copy.html,sha256=0PWK_I2kNX3LjPLkkY4eSYIeB7YFkA28nk-PPLDhnaY,1753
|
|
71
71
|
scilens/report/templates/compare_13_section_numbers.html,sha256=JjD20F6X2RjzJIgAAF431JOdmUyNNOHJOufdH21iUsM,2820
|
|
@@ -96,7 +96,7 @@ scilens/utils/template.py,sha256=9dlXX3nmfzDRUwzPJOkoxk15UXivZ2SW-McdCwokFa4,443
|
|
|
96
96
|
scilens/utils/time_tracker.py,sha256=DdVBoMpVLXrX0qZZXyLm4g38EwDVLlRcBqcpNex1mYY,545
|
|
97
97
|
scilens/utils/vectors.py,sha256=4N2BZSC5n3HgZqPujDGF5NdjVmSL1rOHb_qw4OoABQY,103
|
|
98
98
|
scilens/utils/web.py,sha256=E4T8Fra65u9g_BpcFANPk4ORvsYavAeiSgWA3vRca2E,804
|
|
99
|
-
scilens-0.2.
|
|
100
|
-
scilens-0.2.
|
|
101
|
-
scilens-0.2.
|
|
102
|
-
scilens-0.2.
|
|
99
|
+
scilens-0.2.1.dist-info/METADATA,sha256=QYXvNkOg3U3JDqKslGVMo1OCq3bCM6yT7eCzAS4onX4,1367
|
|
100
|
+
scilens-0.2.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
101
|
+
scilens-0.2.1.dist-info/entry_points.txt,sha256=DaKGgxUEUv34GJAoXtta6ecL37ercejep9sCSSRQK2s,48
|
|
102
|
+
scilens-0.2.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|