scilens 0.5.1__py3-none-any.whl → 0.5.2__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/compare_2_files.py +41 -36
- scilens/config/models/compare.py +1 -1
- scilens/config/models/file_reader.py +9 -1
- {scilens-0.5.1.dist-info → scilens-0.5.2.dist-info}/METADATA +1 -1
- {scilens-0.5.1.dist-info → scilens-0.5.2.dist-info}/RECORD +7 -7
- {scilens-0.5.1.dist-info → scilens-0.5.2.dist-info}/WHEEL +0 -0
- {scilens-0.5.1.dist-info → scilens-0.5.2.dist-info}/entry_points.txt +0 -0
|
@@ -1,46 +1,51 @@
|
|
|
1
|
-
import os,re
|
|
1
|
+
import os,re,logging,fnmatch
|
|
2
2
|
from scilens.run.task_context import TaskContext
|
|
3
3
|
from scilens.readers.reader_interface import ReaderInterface
|
|
4
4
|
from scilens.components.file_reader import FileReader
|
|
5
5
|
from scilens.components.compare_models import SEVERITY_ERROR,SEVERITY_WARNING
|
|
6
6
|
from scilens.components.compare_errors import CompareErrors
|
|
7
7
|
from scilens.components.compare_floats import CompareFloats
|
|
8
|
+
from scilens.config.models.compare import CompareConfig
|
|
8
9
|
class Compare2Files:
|
|
9
10
|
def __init__(A,context):A.context=context
|
|
10
|
-
def compare(
|
|
11
|
-
|
|
12
|
-
for(C,
|
|
13
|
-
if not
|
|
14
|
-
if
|
|
15
|
-
if
|
|
11
|
+
def compare(H,path_test,path_ref):
|
|
12
|
+
k='status';j='severity';i='comparison_errors';h='comparison';Z=path_test;Y='err_index';X='reader';W='skipped';V=None;U=path_ref;T='metrics';S='error';R=True;Q='ref';M='path';L='test';A={L:{},Q:{},h:V,i:V};I={L:{M:Z},Q:{M:U}};B=H.context.config.compare;J=B.sources.not_matching_source_ignore_pattern
|
|
13
|
+
for(C,N)in I.items():
|
|
14
|
+
if not N.get(M)or not os.path.exists(N[M]):
|
|
15
|
+
if J:
|
|
16
|
+
if J=='*':A[W]=R;return A
|
|
16
17
|
else:
|
|
17
|
-
|
|
18
|
-
if
|
|
19
|
-
A[
|
|
20
|
-
|
|
21
|
-
for(C,
|
|
22
|
-
D=
|
|
23
|
-
if not D or not F:A[
|
|
24
|
-
A[
|
|
25
|
-
if D.read_error:A[
|
|
26
|
-
|
|
27
|
-
if B.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
for
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
18
|
+
l=os.path.basename(U if C==L else Z);m=re.search(J,l)
|
|
19
|
+
if m:A[W]=R;return A
|
|
20
|
+
A[S]=f"file {C} does not exist";return A
|
|
21
|
+
n=FileReader(H.context.working_dir,H.context.config.file_reader,H.context.config.readers,config_alternate_path=H.context.origin_working_dir)
|
|
22
|
+
for(C,N)in I.items():I[C][X]=n.read(N[M])
|
|
23
|
+
D=I[L][X];F=I[Q][X]
|
|
24
|
+
if not D or not F:A[W]=R;return A
|
|
25
|
+
A[L]=D.info();A[Q]=F.info()
|
|
26
|
+
if D.read_error:A[S]=D.read_error;return A
|
|
27
|
+
o=os.path.basename(U);a=B.float_thresholds
|
|
28
|
+
if B.name_patterns_thresholds:
|
|
29
|
+
for(J,p)in B.name_patterns_thresholds.items():
|
|
30
|
+
if fnmatch.fnmatch(o,J):a=p;break
|
|
31
|
+
E=CompareErrors(B.errors_limit,B.ignore_warnings);b=CompareFloats(E,a);c=D.compare(b,F,param_is_ref=R);G=E.root_group;O=V
|
|
32
|
+
if B.metrics_compare and(D.metrics or F.metrics):
|
|
33
|
+
s,O=E.add_group(T,T,parent=G)
|
|
34
|
+
if B.metrics_thresholds:d=CompareFloats(E,B.metrics_thresholds)
|
|
35
|
+
else:d=b
|
|
36
|
+
d.compare_dicts(D.metrics,F.metrics,O)
|
|
37
|
+
K={'total_diffs':G.total_diffs}
|
|
38
|
+
if G.info:K.update(G.info)
|
|
39
|
+
if c:K.update(c)
|
|
40
|
+
if O:
|
|
41
|
+
P={}
|
|
42
|
+
for e in[SEVERITY_ERROR,SEVERITY_WARNING]:
|
|
43
|
+
for(q,f)in enumerate(E.errors[e]):
|
|
44
|
+
if f.group==O.id:P[f.info['key']]={j:e,Y:q}
|
|
45
|
+
K[T]={}
|
|
46
|
+
for C in D.metrics.keys():K[T][C]={k:P[C][j],Y:P[C][Y]}if C in P else{k:'success'}
|
|
47
|
+
A[h]=K;A[i]=E.get_data()
|
|
48
|
+
if G.error:A[S]=G.error;return A
|
|
49
|
+
D.close();F.close();g=len(E.errors[SEVERITY_ERROR])
|
|
50
|
+
if g>0:r=f"{g} comparison errors";A[S]=r
|
|
46
51
|
return A
|
scilens/config/models/compare.py
CHANGED
|
@@ -3,4 +3,4 @@ _A=None
|
|
|
3
3
|
from pydantic import BaseModel,Field
|
|
4
4
|
from scilens.config.models.compare_float_thresholds import CompareFloatThresholdsConfig
|
|
5
5
|
class CompareSourceFoldersConfig(BaseModel,extra=_B):not_matching_source_ignore_pattern:str|_A=Field(default=_A,description="Ignore les fichiers de test et de référence qui ne correspondent pas selon l'expression régulière défini (si = `*` ignore tout).");recursive:bool=Field(default=False,description='Recherche récursive dans les répertoires de test et de référence.');additional_path_suffixes:list[str]|_A=Field(default=_A,description='Additionals paths to add after test and reference folders.');test_folder_relative_path:str=Field(default='test',description='Relative path to the working directory for the test folder.');reference_folder_relative_path:str=Field(default='reference',description='Relative path to the working directory for the reference folder.');test_filename_match_ignore:str|_A=Field(default=_A,description='Chaîne spécifique dans le nom de fichier test à ignorer pour matcher les noms. Ex : `.test` or `test_`');reference_filename_match_ignore:str|_A=Field(default=_A,description='Chaîne spécifique dans le nom de fichier référence à ignorer pour matcher les noms. Ex : `.ref` or `ref_`')
|
|
6
|
-
class CompareConfig(BaseModel,extra=_B):sources:CompareSourceFoldersConfig=Field(default=CompareSourceFoldersConfig(),description='Configuration pour les sources des données de test et de référence.');float_thresholds:CompareFloatThresholdsConfig=Field(default=CompareFloatThresholdsConfig(),description='Seuils de comparaison pour les valeurs flottantes.');ignore_warnings:bool=Field(default=False,description='Si `true`, ne lève pas les erreurs de sévérité `warning`.');errors_limit:int=Field(default=1000,description="Limite d'erreurs à atteindre avant de s'arrêter (Sévérité `warning` et `error`).");metrics_compare:bool=Field(default=True,description='Si `true`, compare les métriques entre les données de test et de référence.');metrics_thresholds:CompareFloatThresholdsConfig|_A=Field(default=_A,description='Seuils de comparaison pour les métriques.')
|
|
6
|
+
class CompareConfig(BaseModel,extra=_B):sources:CompareSourceFoldersConfig=Field(default=CompareSourceFoldersConfig(),description='Configuration pour les sources des données de test et de référence.');float_thresholds:CompareFloatThresholdsConfig=Field(default=CompareFloatThresholdsConfig(),description='Seuils de comparaison pour les valeurs flottantes.');ignore_warnings:bool=Field(default=False,description='Si `true`, ne lève pas les erreurs de sévérité `warning`.');errors_limit:int=Field(default=1000,description="Limite d'erreurs à atteindre avant de s'arrêter (Sévérité `warning` et `error`).");metrics_compare:bool=Field(default=True,description='Si `true`, compare les métriques entre les données de test et de référence.');metrics_thresholds:CompareFloatThresholdsConfig|_A=Field(default=_A,description='Seuils de comparaison pour les métriques.');name_patterns_thresholds:dict[str,CompareFloatThresholdsConfig]|_A=Field(default=_A,description='Mapping de patterns des datasets (Unix shell-style wildcards) (ex: data*.csv) et seuils de comparaison pour les comparaison de valeurs flottantes ')
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
_D="Mapping extension clé du catalogue de readers. Ex: `{'dat1': 'csv_comma', 'dat2': 'csv_semicolon'}`"
|
|
2
|
+
_C='Mapping d\'extensions source - cible. Ex `{"txt": "csv"}`.'
|
|
3
|
+
_B='forbid'
|
|
1
4
|
_A=None
|
|
2
5
|
from pydantic import BaseModel,Field
|
|
3
|
-
|
|
6
|
+
from typing import Literal
|
|
7
|
+
DEFAULT_EXTENTION_ACTIVE=True
|
|
8
|
+
NoReaderFoundMethodType=Literal['Error','Ignore','Fallback']
|
|
9
|
+
class FileReaderNoReaderFoundConfig(BaseModel,extra=_B):method:NoReaderFoundMethodType=Field(default='Error',description="Méthode à éxécuter si aucun reader n'est trouvé");fallback:str|_A=Field(default=_A,description="Si la méthode est `Fallback`, code du Reader (`txt`, `csv`, ...) à utiliser si aucun Reader n'est trouvé.")
|
|
10
|
+
class FileReaderExtensionsConfig(BaseModel,extra=_B):active:bool=Field(default=True,description='Recherche un reader par rapport à son extension.');mapping:dict|_A=Field(default=_A,description=_C);readers_catalog:dict[str,str]|_A=Field(default=_A,description=_D)
|
|
11
|
+
class FileReaderConfig(BaseModel,extra=_B):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_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_mapping:dict|_A=Field(default=_A,description=_C);extension_readers_catalog:dict[str,str]|_A=Field(default=_A,description=_D);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`")
|
|
@@ -8,7 +8,7 @@ scilens/cli/info.py,sha256=xE7q9epjrCQRL6Agi3nhKsG6Mr3B8HSUFMti-epMoXA,1929
|
|
|
8
8
|
scilens/cli/main.py,sha256=C8EWm6JfTBBH74pR3J-O2ZuPX78VcQ5MWC5iqNUFN6Y,6332
|
|
9
9
|
scilens/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
10
|
scilens/components/analyse_folder.py,sha256=yqc-dscKaHLZJCYeXGak2v0c3F2aeX0E11AFPfya6r0,208
|
|
11
|
-
scilens/components/compare_2_files.py,sha256=
|
|
11
|
+
scilens/components/compare_2_files.py,sha256=hpLvlsDeifeZ0SbYBLSFpelLc9nQ02LMaYjxkg6dDPw,2417
|
|
12
12
|
scilens/components/compare_errors.py,sha256=vGb4DWP89HMIeBm0dZU2nt-ksppAs_37xtCHaPd0w5Y,1640
|
|
13
13
|
scilens/components/compare_floats.py,sha256=g6tD8QodXdz3kcgMW1-ccZp6A4bFia3xll8mPQ0rlg8,4685
|
|
14
14
|
scilens/components/compare_folders.py,sha256=s7cgo2JhZi8F7tt3lGbPhkaO2726Lz3c4LYGP2HbWtA,2773
|
|
@@ -23,11 +23,11 @@ scilens/config/load.py,sha256=ltcv90GlsMJR2FE2ZL_jDscL7k5aGoHoMatWw61lrTw,1672
|
|
|
23
23
|
scilens/config/models/__init__.py,sha256=lTpDxeSVAGOJtH9MFg25yh0vwwf3VdMFlhdbrhgkk6o,776
|
|
24
24
|
scilens/config/models/app.py,sha256=UCC7Be6gOwvxQpM5Wl1HIf2Xb61CmslFzXvj_50eqsQ,1558
|
|
25
25
|
scilens/config/models/base.py,sha256=k92CR8TA5L8dZJtg28c8albk16AK9-3umdosA7aYsxw,499
|
|
26
|
-
scilens/config/models/compare.py,sha256=
|
|
26
|
+
scilens/config/models/compare.py,sha256=AvGJEsmYLRlvM766Z9IxfmBqXiHxVXFYnIJoU39xQgI,2398
|
|
27
27
|
scilens/config/models/compare_float_thresholds.py,sha256=4l-AMfzpOUnBYU9hsSFAmIL-B6OyfQeVnsiAhRZSYsQ,2153
|
|
28
28
|
scilens/config/models/execute.py,sha256=yF_q8swd4-s2KyT_RwtSzOW41AY5GiEZaLhGUGJBU0Y,2340
|
|
29
29
|
scilens/config/models/execute_and_compare.py,sha256=aIWF1NIgdq5USS9ZVWOKgpEyMagCvqYYWYSXWvBBgjg,597
|
|
30
|
-
scilens/config/models/file_reader.py,sha256=
|
|
30
|
+
scilens/config/models/file_reader.py,sha256=uQrrwJZLlhgrEvEcYBAZijWtS01ob66fhtP_ipknAMo,1925
|
|
31
31
|
scilens/config/models/reader_format_cols.py,sha256=1SbSqBdwwrc516N3xz80S8jiQQrqQ5zWnRT0Zfa1iEc,3875
|
|
32
32
|
scilens/config/models/reader_format_csv.py,sha256=KWEH0c12n6hdaWAKdHXYMT5SvH4UqBFvP7d3ZkJr7r8,1620
|
|
33
33
|
scilens/config/models/reader_format_netcdf.py,sha256=Skr5lZACqVRrrlvs7R1RVFBpMTDthLJN-Fbs24jtb7o,1271
|
|
@@ -122,7 +122,7 @@ scilens/utils/time_tracker.py,sha256=DdVBoMpVLXrX0qZZXyLm4g38EwDVLlRcBqcpNex1mYY
|
|
|
122
122
|
scilens/utils/vectors.py,sha256=4N2BZSC5n3HgZqPujDGF5NdjVmSL1rOHb_qw4OoABQY,103
|
|
123
123
|
scilens/utils/web.py,sha256=MAFWpIFOKz7QhqDoFh-Qwstvc76KpcxstSgHFT8FOL4,901
|
|
124
124
|
scilens/utils/xml.py,sha256=HcB-ymJy8o4lsczHpXznGrbYahq_3cnnkPOdRfWdHfg,461
|
|
125
|
-
scilens-0.5.
|
|
126
|
-
scilens-0.5.
|
|
127
|
-
scilens-0.5.
|
|
128
|
-
scilens-0.5.
|
|
125
|
+
scilens-0.5.2.dist-info/METADATA,sha256=LivGLk121VECrhRXLow1b07GIeE1yHgySBIj4lyYhZU,1405
|
|
126
|
+
scilens-0.5.2.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
127
|
+
scilens-0.5.2.dist-info/entry_points.txt,sha256=DaKGgxUEUv34GJAoXtta6ecL37ercejep9sCSSRQK2s,48
|
|
128
|
+
scilens-0.5.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|