scilens 0.1.2__py3-none-any.whl → 0.2.0__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/components/__init__.py +0 -0
- scilens/components/compare_floats.py +30 -22
- scilens/components/file_reader.py +9 -7
- scilens/config/models/__init__.py +1 -0
- scilens/config/models/compare_float_thresholds.py +3 -3
- scilens/config/models/reader_format_cols_curve.py +16 -0
- scilens/config/models/reader_format_csv.py +3 -17
- scilens/config/models/reader_format_netcdf.py +1 -1
- scilens/config/models/reader_format_txt_fixed_cols.py +4 -0
- scilens/config/models/readers.py +3 -2
- scilens/readers/cols_dataset.py +45 -0
- scilens/readers/reader_csv copy.py +74 -0
- scilens/readers/reader_csv.py +26 -59
- scilens/readers/reader_manager.py +2 -1
- scilens/readers/reader_txt_fixed_cols.py +37 -0
- scilens/readers/transform.py +5 -0
- scilens/report/templates/compare_11_summary.html +6 -0
- scilens/report/templates/compare_12_sections.html +1 -1
- scilens/report/templates/compare_13_section_numbers.html +2 -0
- scilens/report/templates/index.html +1 -1
- {scilens-0.1.2.dist-info → scilens-0.2.0.dist-info}/METADATA +1 -1
- {scilens-0.1.2.dist-info → scilens-0.2.0.dist-info}/RECORD +24 -18
- {scilens-0.1.2.dist-info → scilens-0.2.0.dist-info}/WHEEL +0 -0
- {scilens-0.1.2.dist-info → scilens-0.2.0.dist-info}/entry_points.txt +0 -0
|
File without changes
|
|
@@ -1,29 +1,37 @@
|
|
|
1
|
-
|
|
2
|
-
_B=False
|
|
1
|
+
_B='amplitude'
|
|
3
2
|
_A=None
|
|
4
3
|
from scilens.components.compare_errors import CompareErrors,SEVERITY_ERROR,SEVERITY_WARNING,CompareErrFloats
|
|
5
4
|
from scilens.config.models import CompareFloatThresholdsConfig
|
|
6
|
-
|
|
5
|
+
try:from scilens_check_vectors import CheckVectors
|
|
6
|
+
except ModuleNotFoundError:pass
|
|
7
|
+
def vector_get_amplitude(vector):A=vector;B=min(A);C=max(A);return{'min':B,'max':C,_B:abs(C-B)}
|
|
7
8
|
class CompareFloats:
|
|
8
9
|
def __init__(A,compare_errors,config):A.compare_errors=compare_errors;A.thresholds=config
|
|
9
|
-
def compare_vectors(
|
|
10
|
-
|
|
11
|
-
if
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
if
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
if
|
|
23
|
-
|
|
24
|
-
if
|
|
25
|
-
|
|
26
|
-
|
|
10
|
+
def compare_vectors(A,test_vector,reference_vector,group_idx=_A,info_vector=_A):
|
|
11
|
+
Q='ignore';J=info_vector;F=reference_vector;C=test_vector;K=0;L={SEVERITY_ERROR:0,SEVERITY_WARNING:0};G=False;H=_A
|
|
12
|
+
if A.thresholds.vectors and A.thresholds.vectors.ponderation_method=='amplitude_moderation':R=vector_get_amplitude(C)[_B];H=R*A.thresholds.vectors.amplitude_moderation_multiplier;M=A.thresholds.vectors.reduction_method
|
|
13
|
+
E=_A
|
|
14
|
+
if A.thresholds.vectors and A.thresholds.vectors.ponderation_method in['RIAE','RIAE_trapezoid','RIAE_midpoint']:
|
|
15
|
+
E=A.thresholds.vectors.reduction_method;S=.01
|
|
16
|
+
if S>=A.thresholds.vectors.riae_threshold:E=A.thresholds.vectors.reduction_method
|
|
17
|
+
T=len(C)
|
|
18
|
+
for B in range(T):
|
|
19
|
+
N=C[B]-F[B]
|
|
20
|
+
if N==0:continue
|
|
21
|
+
else:K+=1
|
|
22
|
+
if G:continue
|
|
23
|
+
if E==Q:continue
|
|
24
|
+
if H is not _A and abs(N)<H:
|
|
25
|
+
if M==Q:continue
|
|
26
|
+
elif M=='soften':D,O,I=A.compare_2_values(C[B],F[B]);D=SEVERITY_WARNING
|
|
27
|
+
else:
|
|
28
|
+
D,O,I=A.compare_2_values(C[B],F[B])
|
|
29
|
+
if E:D=SEVERITY_WARNING
|
|
30
|
+
if I:
|
|
31
|
+
L[D]+=1;P={'index':B}
|
|
32
|
+
if J:P['info']=J[B]
|
|
33
|
+
G=A.compare_errors.add(D,O,I,group_idx=group_idx,info=P)
|
|
34
|
+
return G,K,L
|
|
27
35
|
def compare_2_values(G,test,reference):
|
|
28
36
|
D=test;B=reference;A=G.thresholds;F=-1 if D-B<0 else 1
|
|
29
37
|
if abs(D)>A.relative_vs_absolute_min and B!=0:
|
|
@@ -32,7 +40,7 @@ class CompareFloats:
|
|
|
32
40
|
if C>A.relative_error_min:return SEVERITY_WARNING,f"Rel. err. > {A.relative_error_min} and < {A.relative_error_max}",E
|
|
33
41
|
else:return SEVERITY_ERROR,f"Rel. err. > {A.relative_error_max}",E
|
|
34
42
|
else:
|
|
35
|
-
C=abs(D-B);E=CompareErrFloats(is_relative=
|
|
43
|
+
C=abs(D-B);E=CompareErrFloats(is_relative=False,value=F*C,test=D,reference=B)
|
|
36
44
|
if C<A.absolute_error_max:
|
|
37
45
|
if C>A.absolute_error_min:return SEVERITY_WARNING,f"Abs. err. > {A.absolute_error_min} and < {A.absolute_error_max}",E
|
|
38
46
|
else:return SEVERITY_ERROR,f"Abs. err. > {A.absolute_error_max}",E
|
|
@@ -15,14 +15,16 @@ 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}");E=_A;
|
|
19
|
-
if
|
|
20
|
-
if isinstance(
|
|
18
|
+
logging.info(f"Reading file: {path}");E=_A;D=A.config.custom_curve_parser
|
|
19
|
+
if D:
|
|
20
|
+
if isinstance(D,str):E=A._get_custom_parser(D)
|
|
21
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);
|
|
23
|
-
if B.__class__.__name__=='ReaderTxt':
|
|
24
|
-
elif B.__class__.__name__=='ReaderCsv':
|
|
25
|
-
B.
|
|
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)
|
|
26
28
|
except NoReaderFound:
|
|
27
29
|
if A.config.extension_unknown_ignore:0
|
|
28
30
|
else:raise Exception(f"No reader found")
|
|
@@ -5,6 +5,7 @@ from.execute_and_compare import ExecuteAndCompareConfig
|
|
|
5
5
|
from.execute import ExecuteConfig
|
|
6
6
|
from.reader_format_txt import ReaderTxtIgnoreConfig,ReaderTxtConfig
|
|
7
7
|
from.reader_format_csv import ReaderCsvConfig
|
|
8
|
+
from.reader_format_txt_fixed_cols import ReaderTxtFixedColsConfig
|
|
8
9
|
from.readers import ReadersConfig
|
|
9
10
|
from.file_reader import FileReaderConfig
|
|
10
11
|
from.report_html import ReportHtmlConfig,ReportHtmlCurvesConfig,ReportParameterOpenFileInConfig,ReportParameterPageModeConfig
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
+
_A=None
|
|
1
2
|
from pydantic import BaseModel,Field
|
|
2
|
-
class
|
|
3
|
-
class
|
|
4
|
-
class CompareFloatThresholdsConfig(BaseModel):relative_vs_absolute_min:float=Field(default=1e-12,description="Si la valeur de test est inférieure à ce seuil, calcul de l'erreur absolue.");relative_error_min:float=Field(default=.001,description="Si l'erreur relative est supérieure à ce seuil, génère une erreur de sévérité `warning`.");relative_error_max:float=Field(default=.01,description="Si l'erreur relative est supérieure à ce seuil, génère une erreur de sévérité `error`.");absolute_error_min:float=Field(default=1e-07,description="Si l'erreur absolue est supérieure à ce seuil, génère une erreur de sévérité `warning`.");absolute_error_max:float=Field(default=1e-06,description="Si l'erreur absolue est supérieure à ce seuil, génère une erreur de sévérité `error`.");vectors:CompareFloatVectorsConfig=Field(default=CompareFloatVectorsConfig(),description='Paramètres pour la comparaison de vecteurs de flottants (csv, nc, ...).')
|
|
3
|
+
class CompareFloatVectorsConfig(BaseModel):reduction_method:str=Field(default='soften',description="Méthode de réduction de sévérité des erreurs. Peut être `soften` ou `ignore`. Si `soften`, réduit la sévérité de l'erreur. Si `ignore`, ne lève pas d'erreur.");ponderation_method:str=Field(description='Méthode de calcul de reduction de sévérité. Peut être`amplitude_moderation`, `RIAE`, `RIAE_trapezoid` ou `RIAE_midpoint`.');amplitude_moderation_multiplier:float|_A=Field(default=_A,description="Multipler utilisé dans l'amplitude pondérée `multiplier * |Max(Vector)-Min(Vector)|` qui sera comparée à l'erreur absolue `|Test-Reference|`.");riae_threshold:float|_A=Field(default=_A,description="Seuil de l'erreur relative intégrale absolue. Si l'erreur est supérieure à ce seuil, on appliquera la reduction_method globalement.")
|
|
4
|
+
class CompareFloatThresholdsConfig(BaseModel):relative_vs_absolute_min:float=Field(default=1e-12,description="Si la valeur de test est inférieure à ce seuil, calcul de l'erreur absolue.");relative_error_min:float=Field(default=.001,description="Si l'erreur relative est supérieure à ce seuil, génère une erreur de sévérité `warning`.");relative_error_max:float=Field(default=.01,description="Si l'erreur relative est supérieure à ce seuil, génère une erreur de sévérité `error`.");absolute_error_min:float=Field(default=1e-07,description="Si l'erreur absolue est supérieure à ce seuil, génère une erreur de sévérité `warning`.");absolute_error_max:float=Field(default=1e-06,description="Si l'erreur absolue est supérieure à ce seuil, génère une erreur de sévérité `error`.");vectors:CompareFloatVectorsConfig|_A=Field(default=_A,description='Paramètres pour la comparaison de vecteurs de flottants (csv, nc, ...).')
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
_A='(Valide seulement si la première ligne est les en-têtes)'
|
|
2
|
+
from pydantic import BaseModel,Field,model_validator
|
|
3
|
+
from enum import Enum
|
|
4
|
+
class ReaderCurveParserNameConfig(str,Enum):COL_X='col_x';COLS_COUPLE='cols_couple'
|
|
5
|
+
class ReaderCurveParserColXConfig(BaseModel):x:int|str|list[str]=Field(default=1,description="Si `integer`, index de la colonne pour l'axe x (index `1` pour la première colonne)."+"Si `String`, nom de la colonne pour l'axe x. Si la colonne n'existe pas, il n'y aura pas de parsing."+_A+"Si `List[String] (utiles dans un contexte multi dataset), noms de la colonne pour l'axe x, noms des colonnes pour l'axe x , si plusieurs colonnes correspondent, la première trouvée sera utilisée. Si aucune colonne ne correspond, il n'y aura pas de parsing."+_A)
|
|
6
|
+
class ReaderCurveParserColsCoupleConfig(BaseModel):x_index:int=Field(description='NOT IMPLEMENTED - Index Col x');y_index:int=Field(description='NOT IMPLEMENTED - Index Col y')
|
|
7
|
+
class ReaderColsCurveParserConfig(BaseModel):
|
|
8
|
+
name:ReaderCurveParserNameConfig=Field(description='Le type de `paramètres` dépend de cette valeur');parameters:ReaderCurveParserColXConfig|ReaderCurveParserColsCoupleConfig=Field(description='Paramètres du parser de courbes')
|
|
9
|
+
@model_validator(mode='after')
|
|
10
|
+
def validate_model(cls,model):
|
|
11
|
+
A=model
|
|
12
|
+
if isinstance(A.parameters,ReaderCurveParserColXConfig)and A.name!=ReaderCurveParserNameConfig.COL_X or isinstance(A.parameters,ReaderCurveParserColsCoupleConfig)and A.name!=ReaderCurveParserNameConfig.COLS_COUPLE:raise ValueError(f"Curve Parser {A.name} Parameters are not correct")
|
|
13
|
+
if isinstance(A.parameters,dict):
|
|
14
|
+
if A.name==ReaderCurveParserNameConfig.COL_X:A.parameters=ReaderCurveParserColXConfig(**A.parameters)
|
|
15
|
+
elif A.name==ReaderCurveParserNameConfig.COLS_COUPLE:A.parameters=ReaderCurveParserColsCoupleConfig(**A.parameters)
|
|
16
|
+
return A
|
|
@@ -1,18 +1,4 @@
|
|
|
1
|
-
_B='(Valide seulement si la première ligne est les en-têtes)'
|
|
2
1
|
_A=None
|
|
3
|
-
from pydantic import BaseModel,Field
|
|
4
|
-
from
|
|
5
|
-
class
|
|
6
|
-
class ReaderCsvCurveParserColXConfig(BaseModel):x:int|str|list[str]=Field(default=1,description="Si `integer`, index de la colonne pour l'axe x (index `1` pour la première colonne)."+"Si `String`, nom de la colonne pour l'axe x. Si la colonne n'existe pas, il n'y aura pas de parsing."+_B+"Si `List[String] (utiles dans un contexte multi dataset), noms de la colonne pour l'axe x, noms des colonnes pour l'axe x , si plusieurs colonnes correspondent, la première trouvée sera utilisée. Si aucune colonne ne correspond, il n'y aura pas de parsing."+_B)
|
|
7
|
-
class ReaderCsvCurveParserColsCoupleConfig(BaseModel):x_index:int=Field(description='NOT IMPLEMENTED - Index Col x');y_index:int=Field(description='NOT IMPLEMENTED - Index Col y')
|
|
8
|
-
class ReaderCsvCurveParserConfig(BaseModel):
|
|
9
|
-
name:ReaderCsvCurveParserNameConfig=Field(description='Le type de `paramètres` dépend de cette valeur');parameters:ReaderCsvCurveParserColXConfig|ReaderCsvCurveParserColsCoupleConfig=Field(description='Paramètres du parser de courbes')
|
|
10
|
-
@model_validator(mode='after')
|
|
11
|
-
def validate_model(cls,model):
|
|
12
|
-
A=model
|
|
13
|
-
if isinstance(A.parameters,ReaderCsvCurveParserColXConfig)and A.name!=ReaderCsvCurveParserNameConfig.COL_X or isinstance(A.parameters,ReaderCsvCurveParserColsCoupleConfig)and A.name!=ReaderCsvCurveParserNameConfig.COLS_COUPLE:raise ValueError(f"Curve Parser {A.name} Parameters are not correct")
|
|
14
|
-
if isinstance(A.parameters,dict):
|
|
15
|
-
if A.name==ReaderCsvCurveParserNameConfig.COL_X:A.parameters=ReaderCsvCurveParserColXConfig(**A.parameters)
|
|
16
|
-
elif A.name==ReaderCsvCurveParserNameConfig.COLS_COUPLE:A.parameters=ReaderCsvCurveParserColsCoupleConfig(**A.parameters)
|
|
17
|
-
return A
|
|
18
|
-
class ReaderCsvConfig(BaseModel):ignore_colunmns:list[str]|_A=Field(default=_A,description='Liste des noms des colonnes à ignorer. (Valide seulement si la première ligne est les en-têtes)');curve_parser:ReaderCsvCurveParserConfig|_A=Field(default=_A,description='Parseur de courbe à utiliser.')
|
|
2
|
+
from pydantic import BaseModel,Field
|
|
3
|
+
from scilens.config.models.reader_format_cols_curve import ReaderColsCurveParserConfig
|
|
4
|
+
class ReaderCsvConfig(BaseModel):ignore_columns:list[str]|_A=Field(default=_A,description='Liste des noms des colonnes à ignorer. (Valide seulement si la première ligne est les en-têtes)');delimiter:str|_A=Field(default=',',description='Délimiteur de colonnes.');quotechar:str|_A=Field(default='"',description='Délimiteur de texte.');curve_parser:ReaderColsCurveParserConfig|_A=Field(default=_A,description='Parseur de courbe à utiliser.')
|
|
@@ -2,4 +2,4 @@ _A=None
|
|
|
2
2
|
from typing import Literal
|
|
3
3
|
from pydantic import BaseModel,Field
|
|
4
4
|
CurveParser=Literal['simple_1D','frameseries_2D']
|
|
5
|
-
class ReaderNetcdfConfig(BaseModel):groups_depth:int|_A=Field(default=_A,description='
|
|
5
|
+
class ReaderNetcdfConfig(BaseModel):groups_depth:int|_A=Field(default=_A,description='Définit la profondeur de recherche des groupes. Si vide prendra tous les groupes.');units_attributes:list[str]|_A=Field(default=_A,description='Noms des attributs de variable qui spécifient les unités.');curve_parser:CurveParser|_A=Field(default=_A,description='Parser de courbes: `simple_1D` or `frameseries_2D`.');curve_x_variable:str|_A=Field(default=_A,description='Nom de variable pour les axes X (`simple_1D` et `frameseries_2D`).');curve_step_variable:str|_A=Field(default=_A,description='Nom de variable `Step` (`1D`) (seulement pour `frameseries_2D`).');compare_1D:bool=Field(default=False,description='Pour les processeurs qui comparent, compare les variables vecteurs (`1D`).');compare_2D:bool=Field(default=False,description='Pour les processeurs qui comparent, compare les variables matrices (`2D`).')
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
_A=None
|
|
2
|
+
from pydantic import BaseModel,Field
|
|
3
|
+
from scilens.config.models.reader_format_cols_curve import ReaderColsCurveParserConfig
|
|
4
|
+
class ReaderTxtFixedColsConfig(BaseModel):ignore_lines_patterns:list[str]|_A=Field(default=_A,description='Liste des patterns de lignes à ignorer. Ex: ["^#", "^//"].');has_header:bool=Field(default=False,description="Indique si le dataset contient une ligne d'entête.");has_header_repetition:bool=Field(default=False,description="Indique si l'entête est répétée (pagination).");has_header_ignore:list[str]|_A=Field(default=_A,description="Chaînes de caractères à ignorer dans la ligne d'entête. eex: ['##', '|'].");column_widths:list[int]|_A=Field(default=_A,description='Liste des largeurs de colonnes. Ex: [9, 13, 12]. Exclusif avec `column_indexes`.');column_indexes:list[list[int]]|_A=Field(default=_A,description='Liste des index de début et fin de colonnes. Ex: [[0, 8], [9, 12], [13, 28]]. Exclusif avec `column_widths`.');curve_parser:ReaderColsCurveParserConfig|_A=Field(default=_A,description='Parseur de courbe à utiliser.')
|
scilens/config/models/readers.py
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from pydantic import BaseModel,Field
|
|
2
|
-
from scilens.config.models.reader_format_txt import
|
|
2
|
+
from scilens.config.models.reader_format_txt import ReaderTxtConfig
|
|
3
3
|
from scilens.config.models.reader_format_csv import ReaderCsvConfig
|
|
4
|
+
from scilens.config.models.reader_format_txt_fixed_cols import ReaderTxtFixedColsConfig
|
|
4
5
|
from scilens.config.models.reader_format_netcdf import ReaderNetcdfConfig
|
|
5
|
-
class ReadersConfig(BaseModel):txt:ReaderTxtConfig=Field(default=ReaderTxtConfig(),description='Configuration des readers txt.');csv:ReaderCsvConfig=Field(default=ReaderCsvConfig(),description='Configuration des readers csv.');netcdf:ReaderNetcdfConfig=Field(default=ReaderNetcdfConfig(),description='Configuration des readers NetCDF.')
|
|
6
|
+
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.')
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
_E='charts'
|
|
2
|
+
_D='x_index'
|
|
3
|
+
_C='csv_col_index'
|
|
4
|
+
_B='curves'
|
|
5
|
+
_A=None
|
|
6
|
+
from dataclasses import dataclass,field
|
|
7
|
+
from scilens.components.compare_floats import CompareFloats
|
|
8
|
+
from scilens.config.models.reader_format_cols_curve import ReaderCurveParserNameConfig
|
|
9
|
+
@dataclass
|
|
10
|
+
class ColsDataset:cols_count:int=0;rows_count:int=0;names:list[str]=field(default_factory=lambda:[]);numeric_col_indexes:list[int]=field(default_factory=lambda:[]);data:list[list[float]]=field(default_factory=lambda:[]);origin_line_nb:list[int]=field(default_factory=lambda:[])
|
|
11
|
+
@dataclass
|
|
12
|
+
class ColsCurves:type:str;info:dict;curves:dict
|
|
13
|
+
def cols_dataset_get_curves_col_x(cols_dataset,col_x):
|
|
14
|
+
I='title';B=col_x;A=cols_dataset;E={}
|
|
15
|
+
if isinstance(B,int):
|
|
16
|
+
C=B-1
|
|
17
|
+
if C<0 or C>=A.cols_count:raise Exception('curve parser col_x: col_index is out of range.')
|
|
18
|
+
if isinstance(B,str):B=[B]
|
|
19
|
+
if isinstance(B,list):
|
|
20
|
+
G=[A for(A,C)in enumerate(A.names)if C in B]
|
|
21
|
+
if len(G)==0:return _A,E
|
|
22
|
+
C=G[0]
|
|
23
|
+
E[_D]=C;J=[B for(A,B)in enumerate(A.numeric_col_indexes)if A!=C];F=[];H=[]
|
|
24
|
+
for D in J:B=A.data[C];K=A.data[D];L={I:A.names[D],'short_title':A.names[D],'series':[[B[A],K[A]]for A in range(A.rows_count)],_C:D};F+=[L];M={I:A.names[D],'type':'simple','xaxis':A.names[C],'yaxis':A.names[D],_B:[len(F)-1]};H+=[M]
|
|
25
|
+
return{_B:F,_E:H},E
|
|
26
|
+
def compare(compare_floats,reader_test,reader_ref,cols_curve):
|
|
27
|
+
Q='error';J=compare_floats;I='Errors limit reached';E=reader_ref;C=cols_curve;A=reader_test
|
|
28
|
+
if len(A.numeric_col_indexes)!=len(E.numeric_col_indexes):R=f"Number Float columns indexes are different: {len(A.numeric_col_indexes)} != {len(E.numeric_col_indexes)}";return R,_A
|
|
29
|
+
K=0;D=[''for A in range(A.cols_count)];L=_A;F=_A
|
|
30
|
+
if C and C.type==ReaderCurveParserNameConfig.COL_X:M=C.info[_D];L=A.data[M];F=A.names[M]
|
|
31
|
+
G=False
|
|
32
|
+
for B in range(A.cols_count):
|
|
33
|
+
if B not in A.numeric_col_indexes:continue
|
|
34
|
+
if G:D[B]=I;continue
|
|
35
|
+
S=A.data[B];T=E.data[B];U=J.compare_errors.add_group(A.names[B],data={'info_prefix':F}if F else _A);V,W,N=J.compare_vectors(S,T,group_idx=U,info_vector=L);K+=W
|
|
36
|
+
if V:G=True;D[B]=I;continue
|
|
37
|
+
if N[Q]>0:D[B]=f"{N[Q]} comparison errors"
|
|
38
|
+
if C:
|
|
39
|
+
for O in C.curves[_E]:
|
|
40
|
+
P=0
|
|
41
|
+
for X in O[_B]:
|
|
42
|
+
H=C.curves[_B][X]
|
|
43
|
+
if D[H[_C]]:H['comparison_error']=D[H[_C]];P+=1
|
|
44
|
+
O['comparison']={'curves_nb_with_error':P}
|
|
45
|
+
Y=I if G else _A;return Y,{'type':'vectors','total_diffs':K,'cols_has_error':D}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
_E='charts'
|
|
2
|
+
_D='x_index'
|
|
3
|
+
_C='csv_col_index'
|
|
4
|
+
_B='curves'
|
|
5
|
+
_A=None
|
|
6
|
+
import logging,csv
|
|
7
|
+
from scilens.readers.reader_interface import ReaderInterface
|
|
8
|
+
from scilens.config.models import ReaderCsvConfig
|
|
9
|
+
from scilens.config.models.reader_format_cols_curve import ReaderCurveParserNameConfig
|
|
10
|
+
from scilens.components.compare_floats import CompareFloats
|
|
11
|
+
def is_num(x):
|
|
12
|
+
try:return float(x)
|
|
13
|
+
except ValueError:return
|
|
14
|
+
def csv_row_detect_header(first_row):
|
|
15
|
+
A=first_row
|
|
16
|
+
if all(not A.isdigit()for A in A):return True,A
|
|
17
|
+
else:return False,[f"Column {A}"for(A,B)in enumerate(A)]
|
|
18
|
+
def csv_row_detect_cols_num(row):return[A for(A,B)in enumerate(row)if is_num(B)!=_A]
|
|
19
|
+
def csv_detect(path,delimiter,quotechar):
|
|
20
|
+
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
|
|
21
|
+
class ReaderCsv(ReaderInterface):
|
|
22
|
+
category='datalines';extensions=['CSV']
|
|
23
|
+
def read(A,reader_options):
|
|
24
|
+
B=reader_options;A.reader_options=B;C,G,H=csv_detect(A.origin.path,A.reader_options.delimiter,A.reader_options.quotechar);A.has_header=C;A.cols=G;A.numeric_col_indexes=H
|
|
25
|
+
if B.ignore_columns:
|
|
26
|
+
if not C:raise Exception('Ignore columns is not supported without header.')
|
|
27
|
+
A.numeric_col_indexes=[C for C in A.numeric_col_indexes if A.cols[C]not in B.ignore_columns]
|
|
28
|
+
E=open(A.origin.path,'r',encoding=A.encoding);I=csv.reader(E,delimiter=A.reader_options.delimiter,quotechar=A.reader_options.quotechar);D=[]
|
|
29
|
+
for J in I:D+=[J]
|
|
30
|
+
if C:D.pop(0)
|
|
31
|
+
E.close();A.data_rows=D;A.raw_lines_number=len(A.data_rows)+(1 if C else 0);A.curves=_A
|
|
32
|
+
if B.curve_parser:
|
|
33
|
+
if B.curve_parser.name==ReaderCurveParserNameConfig.COL_X:
|
|
34
|
+
A.curves,K=A._get_curves_col_x(B.curve_parser.parameters.x)
|
|
35
|
+
if A.curves:A.curves_parser_type=B.curve_parser.name;A.curves_info=K
|
|
36
|
+
elif B.curve_parser.name==ReaderCurveParserNameConfig.COLS_COUPLE:raise NotImplementedError('cols_couple not implemented')
|
|
37
|
+
else:raise Exception('Curve parser not supported.')
|
|
38
|
+
A.cols_data=[_A]*len(A.cols)
|
|
39
|
+
for F in A.numeric_col_indexes:A.cols_data[F]=[float(A[F])for A in D]
|
|
40
|
+
def compare(A,compare_floats,param_reader,param_is_ref=True):
|
|
41
|
+
U='error';M=param_is_ref;L=param_reader;K=compare_floats;J='Errors limit reached';C=A if M else L;E=A if not M else L
|
|
42
|
+
if len(C.numeric_col_indexes)!=len(E.numeric_col_indexes):V=f"Number Float columns indexes are different: {len(C.numeric_col_indexes)} != {len(E.numeric_col_indexes)}";return V,_A
|
|
43
|
+
N=0;D=[''for A in C.cols];O=_A;F=_A
|
|
44
|
+
if A.curves and A.curves_parser_type==ReaderCurveParserNameConfig.COL_X:P=A.curves_info[_D];O=C.cols_data[P];F=A.cols[P]
|
|
45
|
+
G=False
|
|
46
|
+
for B in range(len(C.cols_data)):
|
|
47
|
+
if C.cols_data[B]==_A:continue
|
|
48
|
+
logging.debug(f"Comparing {A.cols[B]}")
|
|
49
|
+
if G:D[B]=J;continue
|
|
50
|
+
W=C.cols_data[B];X=E.cols_data[B];Y=K.compare_errors.add_group(A.cols[B],data={'info_prefix':F}if F else _A);Q,R,H=K.compare_vectors(W,X,group_idx=Y,info_vector=O);N+=R;logging.debug(f"limit_reached, diffs_count, counts: {Q}, {R}, {H}")
|
|
51
|
+
if Q:G=True;D[B]=J;continue
|
|
52
|
+
if H[U]>0:D[B]=f"{H[U]} comparison errors"
|
|
53
|
+
if A.curves:
|
|
54
|
+
for S in A.curves[_E]:
|
|
55
|
+
T=0
|
|
56
|
+
for Z in S[_B]:
|
|
57
|
+
I=A.curves[_B][Z]
|
|
58
|
+
if D[I[_C]]:I['comparison_error']=D[I[_C]];T+=1
|
|
59
|
+
S['comparison']={'curves_nb_with_error':T}
|
|
60
|
+
a=J if G else _A;return a,{'type':'vectors','total_diffs':N,'cols_has_error':D}
|
|
61
|
+
def class_info(A):return{'cols':A.cols,'raw_lines_number':A.raw_lines_number,_B:A.curves}
|
|
62
|
+
def _get_curves_col_x(E,col_x):
|
|
63
|
+
J='title';A=col_x;F={};B=E.cols
|
|
64
|
+
if isinstance(A,int):
|
|
65
|
+
C=A-1
|
|
66
|
+
if C<0 or C>=len(B):raise Exception('curve parser col_x: col_index is out of range.')
|
|
67
|
+
if isinstance(A,str):A=[A]
|
|
68
|
+
if isinstance(A,list):
|
|
69
|
+
H=[B for(B,C)in enumerate(B)if C in A]
|
|
70
|
+
if len(H)==0:return _A,F
|
|
71
|
+
C=H[0]
|
|
72
|
+
F[_D]=C;K=[B for(A,B)in enumerate(E.numeric_col_indexes)if A!=C];G=[];I=[]
|
|
73
|
+
for D in K:L={J:B[D],'short_title':B[D],'series':[[float(A[C]),float(A[D])]for A in E.data_rows],_C:D};G+=[L];M={J:B[D],'type':'simple','xaxis':B[C],'yaxis':B[D],_B:[len(G)-1]};I+=[M]
|
|
74
|
+
return{_B:G,_E:I},F
|
scilens/readers/reader_csv.py
CHANGED
|
@@ -1,12 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
_D='x_index'
|
|
3
|
-
_C='csv_col_index'
|
|
4
|
-
_B='curves'
|
|
5
|
-
_A=None
|
|
6
|
-
import csv
|
|
1
|
+
import logging,csv
|
|
7
2
|
from scilens.readers.reader_interface import ReaderInterface
|
|
3
|
+
from scilens.readers.cols_dataset import ColsDataset,ColsCurves,cols_dataset_get_curves_col_x,compare
|
|
8
4
|
from scilens.config.models import ReaderCsvConfig
|
|
9
|
-
from scilens.config.models.
|
|
5
|
+
from scilens.config.models.reader_format_cols_curve import ReaderCurveParserNameConfig
|
|
10
6
|
from scilens.components.compare_floats import CompareFloats
|
|
11
7
|
def is_num(x):
|
|
12
8
|
try:return float(x)
|
|
@@ -15,59 +11,30 @@ def csv_row_detect_header(first_row):
|
|
|
15
11
|
A=first_row
|
|
16
12
|
if all(not A.isdigit()for A in A):return True,A
|
|
17
13
|
else:return False,[f"Column {A}"for(A,B)in enumerate(A)]
|
|
18
|
-
def csv_row_detect_cols_num(row):return[A for(A,B)in enumerate(row)if is_num(B)!=
|
|
19
|
-
def csv_detect(path):
|
|
20
|
-
with open(path,'r')as B:A=csv.reader(B);C=next(A);D,E=csv_row_detect_header(C);F=next(A);G=csv_row_detect_cols_num(F);return D,E,G
|
|
14
|
+
def csv_row_detect_cols_num(row):return[A for(A,B)in enumerate(row)if is_num(B)!=None]
|
|
15
|
+
def csv_detect(path,delimiter,quotechar):
|
|
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
|
|
21
17
|
class ReaderCsv(ReaderInterface):
|
|
22
18
|
category='datalines';extensions=['CSV']
|
|
23
19
|
def read(A,reader_options):
|
|
24
|
-
|
|
25
|
-
if
|
|
26
|
-
if not
|
|
27
|
-
A.numeric_col_indexes=[
|
|
28
|
-
E=open(A.origin.path,'r',encoding=A.encoding);
|
|
29
|
-
for
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
+
if C.ignore_columns:
|
|
22
|
+
if not D:raise Exception('Ignore columns is not supported without header.')
|
|
23
|
+
A.numeric_col_indexes=[B for B in A.numeric_col_indexes if A.cols[B]not in C.ignore_columns]
|
|
24
|
+
H=len(E);B=ColsDataset(cols_count=H,names=E,numeric_col_indexes=A.numeric_col_indexes,data=[[]for A in range(H)]);I=open(A.origin.path,'r',encoding=A.encoding);L=csv.reader(I,delimiter=A.reader_options.delimiter,quotechar=A.reader_options.quotechar);F=0
|
|
25
|
+
for M in L:
|
|
26
|
+
F+=1
|
|
27
|
+
if D and F==1:continue
|
|
28
|
+
for(J,G)in enumerate(M):
|
|
29
|
+
if J in B.numeric_col_indexes:G=float(G)
|
|
30
|
+
B.data[J].append(G)
|
|
31
|
+
B.origin_line_nb.append(F)
|
|
32
|
+
B.rows_count=len(B.origin_line_nb);I.close();A.cols_dataset=B;A.raw_lines_number=B.rows_count+(1 if D else 0);A.curves=None
|
|
33
|
+
if C.curve_parser:
|
|
34
|
+
if C.curve_parser.name==ReaderCurveParserNameConfig.COL_X:
|
|
35
|
+
A.curves,N=cols_dataset_get_curves_col_x(B,C.curve_parser.parameters.x)
|
|
36
|
+
if A.curves:A.cols_curve=ColsCurves(type=ReaderCurveParserNameConfig.COL_X,info=N,curves=A.curves)
|
|
37
|
+
elif C.curve_parser.name==ReaderCurveParserNameConfig.COLS_COUPLE:raise NotImplementedError('cols_couple not implemented')
|
|
37
38
|
else:raise Exception('Curve parser not supported.')
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
def compare(A,compare_floats,param_reader,param_is_ref=True):
|
|
41
|
-
S='error';R='Errors limit reached';J=param_is_ref;I=param_reader;H=compare_floats;B=A if J else I;E=A if not J else I
|
|
42
|
-
if len(B.numeric_col_indexes)!=len(E.numeric_col_indexes):T=f"Number Float columns indexes are different: {len(B.numeric_col_indexes)} != {len(E.numeric_col_indexes)}";return T,_A
|
|
43
|
-
K=0;D=[''for A in B.cols];L=_A;F=_A
|
|
44
|
-
if A.curves and A.curves_parser_type==ReaderCsvCurveParserNameConfig.COL_X:M=A.curves_info[_D];L=B.cols_data[M];F=A.cols[M]
|
|
45
|
-
N=False
|
|
46
|
-
for C in range(len(B.cols_data)):
|
|
47
|
-
if B.cols_data[C]==_A:continue
|
|
48
|
-
if N:D[C]=R;continue
|
|
49
|
-
U=B.cols_data[C];V=E.cols_data[C];W=H.compare_errors.add_group(A.cols[C],data={'info_prefix':F}if F else _A);X,Y,O=H.compare_vectors(U,V,group_idx=W,info_vector=L);K+=Y
|
|
50
|
-
if X:N=True;D[C]=R;continue
|
|
51
|
-
if O[S]>0:D[C]=f"{O[S]} comparison errors"
|
|
52
|
-
if A.curves:
|
|
53
|
-
for P in A.curves[_E]:
|
|
54
|
-
Q=0
|
|
55
|
-
for Z in P[_B]:
|
|
56
|
-
G=A.curves[_B][Z]
|
|
57
|
-
if D[G[_C]]:G['comparison_error']=D[G[_C]];Q+=1
|
|
58
|
-
P['comparison']={'curves_nb_with_error':Q}
|
|
59
|
-
return _A,{'type':'vectors','total_diffs':K,'cols_has_error':D}
|
|
60
|
-
def class_info(A):return{'cols':A.cols,'raw_lines_number':A.raw_lines_number,_B:A.curves}
|
|
61
|
-
def _get_curves_col_x(E,col_x):
|
|
62
|
-
J='title';A=col_x;F={};B=E.cols
|
|
63
|
-
if isinstance(A,int):
|
|
64
|
-
C=A-1
|
|
65
|
-
if C<0 or C>=len(B):raise Exception('curve parser col_x: col_index is out of range.')
|
|
66
|
-
if isinstance(A,str):A=[A]
|
|
67
|
-
if isinstance(A,list):
|
|
68
|
-
H=[B for(B,C)in enumerate(B)if C in A]
|
|
69
|
-
if len(H)==0:return _A,F
|
|
70
|
-
C=H[0]
|
|
71
|
-
F[_D]=C;K=[B for(A,B)in enumerate(E.numeric_col_indexes)if A!=C];G=[];I=[]
|
|
72
|
-
for D in K:L={J:B[D],'short_title':B[D],'series':[[float(A[C]),float(A[D])]for A in E.data_rows],_C:D};G+=[L];M={J:B[D],'type':'simple','xaxis':B[C],'yaxis':B[D],_B:[len(G)-1]};I+=[M]
|
|
73
|
-
return{_B:G,_E:I},F
|
|
39
|
+
def compare(A,compare_floats,param_reader,param_is_ref=True):C=param_is_ref;B=param_reader;D=A.cols_dataset if C else B.cols_dataset;E=A.cols_dataset if not C else B.cols_dataset;F=A.cols_curve;return compare(compare_floats,D,E,F)
|
|
40
|
+
def class_info(A):return{'cols':A.cols,'raw_lines_number':A.raw_lines_number,'curves':A.curves}
|
|
@@ -8,7 +8,8 @@ def extension_format(extension):
|
|
|
8
8
|
return A.upper()
|
|
9
9
|
from scilens.readers.reader_txt import ReaderTxt
|
|
10
10
|
from scilens.readers.reader_csv import ReaderCsv
|
|
11
|
-
|
|
11
|
+
from scilens.readers.reader_txt_fixed_cols import ReaderTxtFixedCols
|
|
12
|
+
BUILTIN_PLUGINS=[ReaderTxt,ReaderCsv,ReaderTxtFixedCols]
|
|
12
13
|
LIB_PLUGINS_ENTRY_POINT='scilens.reader_plugins'
|
|
13
14
|
class ReaderManager:
|
|
14
15
|
def __init__(A):
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import logging,re
|
|
2
|
+
from scilens.readers.transform import string_2_float
|
|
3
|
+
from scilens.readers.reader_interface import ReaderInterface
|
|
4
|
+
from scilens.readers.cols_dataset import ColsDataset,ColsCurves,cols_dataset_get_curves_col_x,compare
|
|
5
|
+
from scilens.config.models import ReaderTxtFixedColsConfig
|
|
6
|
+
from scilens.config.models.reader_format_cols_curve import ReaderCurveParserNameConfig
|
|
7
|
+
from scilens.components.compare_floats import CompareFloats
|
|
8
|
+
class ReaderTxtFixedCols(ReaderInterface):
|
|
9
|
+
category='datalines';extensions=['DAT']
|
|
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;D=len(K);C=ColsDataset(cols_count=D,names=[f"Column {A+1}"for A in range(D)],numeric_col_indexes=[A for A in range(D)],data=[[]for A in range(D)]);E=None;G=0
|
|
12
|
+
for F in J:
|
|
13
|
+
G+=1
|
|
14
|
+
if L:
|
|
15
|
+
M=False
|
|
16
|
+
for P in L:
|
|
17
|
+
if bool(re.match(P,F)):M=True;break
|
|
18
|
+
if M:continue
|
|
19
|
+
if A.has_header:
|
|
20
|
+
if not E:
|
|
21
|
+
E=F.strip();H=E
|
|
22
|
+
if A.has_header_ignore:
|
|
23
|
+
for Q in A.has_header_ignore:H=H.replace(Q,'')
|
|
24
|
+
C.names=H.split();continue
|
|
25
|
+
elif A.has_header_repetition and E==F.strip():continue
|
|
26
|
+
I=0;N=0
|
|
27
|
+
for O in K:R=F[I:I+O].strip();S=string_2_float(R);C.data[N].append(S);I+=O;N+=1
|
|
28
|
+
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;print(C);B.curves=None
|
|
30
|
+
if A.curve_parser:
|
|
31
|
+
if A.curve_parser.name==ReaderCurveParserNameConfig.COL_X:
|
|
32
|
+
B.curves,T=cols_dataset_get_curves_col_x(C,A.curve_parser.parameters.x)
|
|
33
|
+
if B.curves:B.cols_curve=ColsCurves(type=ReaderCurveParserNameConfig.COL_X,info=T,curves=B.curves)
|
|
34
|
+
elif A.curve_parser.name==ReaderCurveParserNameConfig.COLS_COUPLE:raise NotImplementedError('cols_couple not implemented')
|
|
35
|
+
else:raise Exception('Curve parser not supported.')
|
|
36
|
+
def compare(A,compare_floats,param_reader,param_is_ref=True):C=param_is_ref;B=param_reader;D=A.cols_dataset if C else B.cols_dataset;E=A.cols_dataset if not C else B.cols_dataset;F=A.cols_curve;return compare(compare_floats,D,E,F)
|
|
37
|
+
def class_info(A):return{'cols':A.cols_dataset.names,'raw_lines_number':A.raw_lines_number,'curves':A.curves}
|
scilens/readers/transform.py
CHANGED
|
@@ -49,9 +49,15 @@
|
|
|
49
49
|
<td class="{{ 'ERROR' if file.error else '' }}">
|
|
50
50
|
{% if file.error %}<span>{{ file.error }}</span>{% endif %}
|
|
51
51
|
</td>
|
|
52
|
+
{% if file.comparison_errors and file.comparison %}
|
|
52
53
|
<td class="number {{ 'ERROR' if file.comparison_errors.error_nb else '' }}">{{ file.comparison_errors.error_nb }}</td>
|
|
53
54
|
<td class="number {{ 'WARNING' if file.comparison_errors.warning_nb else '' }}">{{ file.comparison_errors.warning_nb }}</td>
|
|
54
55
|
<td class="number">{{ file.comparison.total_diffs }}</td>
|
|
56
|
+
{% else %}
|
|
57
|
+
<td class="ERROR">ERROR</td>
|
|
58
|
+
<td class="ERROR">ERROR</td>
|
|
59
|
+
<td class="ERROR">ERROR</td>
|
|
60
|
+
{% endif %}
|
|
55
61
|
<td class="number test-bg-20">{{ file.test.raw_lines_number }}</td>
|
|
56
62
|
<td class="number refe-bg-20">{{ file.ref.raw_lines_number }}</td>
|
|
57
63
|
<td class="number test-bg-20">{{ file.test.ignore_lines_number }}</td>
|
|
@@ -131,7 +131,7 @@
|
|
|
131
131
|
{% endif %}
|
|
132
132
|
|
|
133
133
|
<!--COMPARISONS ERRORS AND WARNINGS-->
|
|
134
|
-
{% if file.comparison_errors.error_nb or file.comparison_errors.warning_nb %}
|
|
134
|
+
{% if file.comparison_errors and (file.comparison_errors.error_nb or file.comparison_errors.warning_nb) %}
|
|
135
135
|
<h3>Number Comparison Errors or Warnings <action data-command="toogle" data-args="numbers_errors_{{ loop.index|string }}"></action></h3>
|
|
136
136
|
<div id="numbers_errors_{{ loop.index }}" >
|
|
137
137
|
{% with file=file %}
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
{% endmacro %}
|
|
11
11
|
{% set ns = namespace(statuses=['']) %}
|
|
12
12
|
{% for file in data.files %}
|
|
13
|
-
{% set ns.statuses = ns.statuses + ['SKIPPED' if file.skipped else ('ERROR' if file.error else ('WARNING' if file.comparison_errors.error_nb > 0 else 'SUCCESS'))] %}
|
|
13
|
+
{% set ns.statuses = ns.statuses + ['SKIPPED' if file.skipped else ('ERROR' if file.error else ('WARNING' if file.comparison_errors and file.comparison_errors.error_nb > 0 else 'SUCCESS'))] %}
|
|
14
14
|
{% endfor %}
|
|
15
15
|
<html>
|
|
16
16
|
<head>
|
|
@@ -6,28 +6,31 @@ 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
8
|
scilens/cli/main.py,sha256=ozGeSEANZx1FKpq9v55GvCZkXk3cazgLa0gtpjbMImg,5637
|
|
9
|
+
scilens/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
10
|
scilens/components/analyse_folder.py,sha256=yqc-dscKaHLZJCYeXGak2v0c3F2aeX0E11AFPfya6r0,208
|
|
10
11
|
scilens/components/compare_2_files.py,sha256=oQ5p9JwB1r_HhfCb29mv1kkkrUd0EdrVug9T-1fQshY,1286
|
|
11
12
|
scilens/components/compare_errors.py,sha256=_n9uWwLVZyPn99mwsAF8WBfcYppVQCsMwj0xuOrlhkU,1241
|
|
12
|
-
scilens/components/compare_floats.py,sha256=
|
|
13
|
+
scilens/components/compare_floats.py,sha256=FKEppQFv1AxeaLcLI9UpgBlh2ZScbAHNxmrMZih8luc,2406
|
|
13
14
|
scilens/components/compare_folders.py,sha256=LZ1AuYxLVHMNbtXWXQrdms4vZgOQthvDy-8NFD_EFjc,2617
|
|
14
15
|
scilens/components/executor.py,sha256=8ZZq9wwoiMr7ys9LXv1pEg5Zc06QatT9PGIigMsDAB8,3620
|
|
15
|
-
scilens/components/file_reader.py,sha256=
|
|
16
|
+
scilens/components/file_reader.py,sha256=XaGQDTWP8k5GokLegA8-dp4DqM4A1Srqr6nCMiixPRE,1708
|
|
16
17
|
scilens/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
18
|
scilens/config/cli_run_options.py,sha256=Ls7yK5QDUPFbk73nbjGuPvuRbBRYw4Miag5ISpu3prg,281
|
|
18
19
|
scilens/config/env_var.py,sha256=NqNBoIfngJEXaGEm7jGqre5pmkJ9eUjiWzbDrTVfi2c,292
|
|
19
20
|
scilens/config/load.py,sha256=4U51o4cJfqhSuRIHKUDIsDQA0C4wv6SzTkVmInGDJdI,1647
|
|
20
|
-
scilens/config/models/__init__.py,sha256=
|
|
21
|
+
scilens/config/models/__init__.py,sha256=eLCW1OLVINewGFy5GXSrOk8Rab_QsgKAuoErBjphHRs,673
|
|
21
22
|
scilens/config/models/app.py,sha256=JltWRjjqXYkH6rg3OHYhMfkBqHFhZEZdthqES3LxvzY,1453
|
|
22
23
|
scilens/config/models/compare.py,sha256=_SLMxf81fpuod8izZm72Jn12euRPxB0wHJSfUuIANbE,1639
|
|
23
|
-
scilens/config/models/compare_float_thresholds.py,sha256=
|
|
24
|
+
scilens/config/models/compare_float_thresholds.py,sha256=J5XBK1dAnmU-i2uA2bsaHnTM_m07_i17wsO8UiCw46o,1844
|
|
24
25
|
scilens/config/models/execute.py,sha256=pFY-gZuBvLbcjTEcoNhPPO7FMFmKa6_TU5IXyKaf81A,1706
|
|
25
26
|
scilens/config/models/execute_and_compare.py,sha256=TWL6yXGvQSaaV6nhHqWLvtr3v396APIoDNt0U1TbMro,582
|
|
26
27
|
scilens/config/models/file_reader.py,sha256=sDIh1z_q4B5c7PhNC1WvQWLNGR4NMbXr-WhT6zDyLB4,1000
|
|
27
|
-
scilens/config/models/
|
|
28
|
-
scilens/config/models/
|
|
28
|
+
scilens/config/models/reader_format_cols_curve.py,sha256=eKLvifq1xuN8sPds9ijfru3vgMZ3Odv5tGfeiK4Sfk4,1860
|
|
29
|
+
scilens/config/models/reader_format_csv.py,sha256=XWZTr6s0PPfcOMRrsNeOZGtExC1uyXb67A158MMWzC4,577
|
|
30
|
+
scilens/config/models/reader_format_netcdf.py,sha256=nbfTB3avO0DidbNa1dCZGFZmmQvzTYhpe6mqfAanaOA,1025
|
|
29
31
|
scilens/config/models/reader_format_txt.py,sha256=eHg90gwEI_VpqwqEjMRhwlS8dHcl5G4ow-37HjQq_zY,1168
|
|
30
|
-
scilens/config/models/
|
|
32
|
+
scilens/config/models/reader_format_txt_fixed_cols.py,sha256=xHD1_JOoRZow8lSNaDSYFeNckojctkT4C61mbBcjeKg,1079
|
|
33
|
+
scilens/config/models/readers.py,sha256=RDuf2uL9I9N5XJI0J3AKSSNwwdwLW936RTY-tpuAIDU,818
|
|
31
34
|
scilens/config/models/report.py,sha256=nTmP2nIwL2Ku5IH9QMwYLPKmfsK2ttu9UK0GnzPUHeM,870
|
|
32
35
|
scilens/config/models/report_html.py,sha256=9I9iKRDOoLMZRBY0lQV4UFtg5-D-VDfYiFGF1VFAnQ8,1389
|
|
33
36
|
scilens/config/models/report_output.py,sha256=XoqUe-t-y8GRbUR3_bDwwaWf6hif-rZ-5pKDGdCMugw,875
|
|
@@ -43,13 +46,16 @@ scilens/processors/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
|
|
|
43
46
|
scilens/processors/models/results.py,sha256=KoWxh13Zgi7PuPql8hkf4VjCis42ZxAuzIgJxBWVaX8,119
|
|
44
47
|
scilens/processors/processor_interface.py,sha256=jzMp1529JXnMGTJijVy6b_1zmARAMNv70f2lgys7vn4,452
|
|
45
48
|
scilens/readers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
49
|
+
scilens/readers/cols_dataset.py,sha256=suEttRHfj9UhHndchAKazLD2z_YY9dFEVLjlodRJS44,2363
|
|
46
50
|
scilens/readers/exceptions.py,sha256=JzmxcjnR5sH-IOWVeCC5A1bSwxv-jCAtIJvDjzx1CTI,32
|
|
47
51
|
scilens/readers/reader_com_txt_lines.py,sha256=zsCumTD0sv06OQNvRKPMuv94De_6KGMvN904-E1Uqeg,91
|
|
48
|
-
scilens/readers/reader_csv.py,sha256=
|
|
52
|
+
scilens/readers/reader_csv copy.py,sha256=eFWQvMt4Ot7KgUIDsed1QymMbPblgboUclvQj6viVGs,4069
|
|
53
|
+
scilens/readers/reader_csv.py,sha256=VslJZ5sYAay_OgmhdaMeO2hzCWwFQB6_2pkJ9RrBcP8,2702
|
|
49
54
|
scilens/readers/reader_interface.py,sha256=nnttHL7wt4MOXpi-SBkk8DYxVWscOPG8JFl_z12mIAo,922
|
|
50
|
-
scilens/readers/reader_manager.py,sha256=
|
|
55
|
+
scilens/readers/reader_manager.py,sha256=vkCLtFkfs315SW71KJVbVBY5SEUSiT9qW9UDCxRYjFo,1607
|
|
51
56
|
scilens/readers/reader_txt.py,sha256=IpIA_qfdL70wrDnOotUtFjt7Yt0lEenYv93E63mQwZw,3744
|
|
52
|
-
scilens/readers/
|
|
57
|
+
scilens/readers/reader_txt_fixed_cols.py,sha256=6y5VlDNAK3nKuQbs5ZDu0SGnT7N433SJAHNMkmg3mKo,2202
|
|
58
|
+
scilens/readers/transform.py,sha256=kppfgPkXymF0qtquFivuosLVfF66L9bE-wGx-3bMHv8,307
|
|
53
59
|
scilens/report/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
54
60
|
scilens/report/assets/logo.svg,sha256=W-1OVqcvdBjf-1AHHcV6WciIUqBoVFUh52Tc3o_jqtA,4519
|
|
55
61
|
scilens/report/assets/logo_cglb.svg,sha256=tEpkSr2h-jjQMecqiHef98Mxod4GD5j5nCQaFloTYso,2411
|
|
@@ -59,11 +65,11 @@ scilens/report/report.py,sha256=aS7ktJ2u0IAMMk-HwqqSsRkr77ZBQyYT4wXJ7djQvAk,1811
|
|
|
59
65
|
scilens/report/template.py,sha256=cPs5gd3uEwb-6JgitGQD_i4IiUxigBTlZLNRS9KVuos,581
|
|
60
66
|
scilens/report/templates/body_01_title.html,sha256=59BmETKHqRO1T_xYp0XLKx3Vha9hU9bu7yaUTVt2p9Y,2146
|
|
61
67
|
scilens/report/templates/body_99_footer.html,sha256=8cWebeWfZwZ-9bYAMZkZj8rbCWq3BLIMjKQThWQxoQM,362
|
|
62
|
-
scilens/report/templates/compare_11_summary.html,sha256=
|
|
63
|
-
scilens/report/templates/compare_12_sections.html,sha256=
|
|
68
|
+
scilens/report/templates/compare_11_summary.html,sha256=KbOEvK060WJmPEx1SwQtpVBxg7oJLZCH5SFhpIoNt74,3686
|
|
69
|
+
scilens/report/templates/compare_12_sections.html,sha256=HWsfCmfdleyRK6IHJeMEheenOuyA0mLzOZ-0qLcuzJU,5952
|
|
64
70
|
scilens/report/templates/compare_13_section_numbers copy.html,sha256=0PWK_I2kNX3LjPLkkY4eSYIeB7YFkA28nk-PPLDhnaY,1753
|
|
65
|
-
scilens/report/templates/compare_13_section_numbers.html,sha256=
|
|
66
|
-
scilens/report/templates/index.html,sha256=
|
|
71
|
+
scilens/report/templates/compare_13_section_numbers.html,sha256=JjD20F6X2RjzJIgAAF431JOdmUyNNOHJOufdH21iUsM,2820
|
|
72
|
+
scilens/report/templates/index.html,sha256=mNTu-CAzEJ2rhz81cHAdmT_KcQeOQ3b_FSC73NPEi0U,3670
|
|
67
73
|
scilens/report/templates/js_chartlibs_echarts.js,sha256=6YicVhTNIBmmBpV31XCVN5oBeiD0t29JIosJZRUv01M,907
|
|
68
74
|
scilens/report/templates/js_chartlibs_plotly.js,sha256=uVAOKUB5XE33-r04phR-LlRkFoaHEIXyQ3jXT5r97Rc,1521
|
|
69
75
|
scilens/report/templates/js_com_dom.js,sha256=YAJNGmgq2YbF9D3TqB7YSms67-xB88Molp9cKhWlqsI,1228
|
|
@@ -90,7 +96,7 @@ scilens/utils/template.py,sha256=9dlXX3nmfzDRUwzPJOkoxk15UXivZ2SW-McdCwokFa4,443
|
|
|
90
96
|
scilens/utils/time_tracker.py,sha256=DdVBoMpVLXrX0qZZXyLm4g38EwDVLlRcBqcpNex1mYY,545
|
|
91
97
|
scilens/utils/vectors.py,sha256=4N2BZSC5n3HgZqPujDGF5NdjVmSL1rOHb_qw4OoABQY,103
|
|
92
98
|
scilens/utils/web.py,sha256=E4T8Fra65u9g_BpcFANPk4ORvsYavAeiSgWA3vRca2E,804
|
|
93
|
-
scilens-0.
|
|
94
|
-
scilens-0.
|
|
95
|
-
scilens-0.
|
|
96
|
-
scilens-0.
|
|
99
|
+
scilens-0.2.0.dist-info/METADATA,sha256=V12MlFtIhmET6Ht6GmZEwLX2QPCh-k55YD-6cGS5QHw,1367
|
|
100
|
+
scilens-0.2.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
101
|
+
scilens-0.2.0.dist-info/entry_points.txt,sha256=DaKGgxUEUv34GJAoXtta6ecL37ercejep9sCSSRQK2s,48
|
|
102
|
+
scilens-0.2.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|