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.
@@ -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(B,path_test,path_ref):
11
- i='status';h='severity';g='comparison_errors';f='comparison';Y=path_ref;X=path_test;W='err_index';V='reader';U='skipped';T=None;R='metrics';Q='error';P=True;O='ref';K='path';J='test';A={J:{},O:{},f:T,g:T};H={J:{K:X},O:{K:Y}};S=B.context.config.compare.sources.not_matching_source_ignore_pattern
12
- for(C,L)in H.items():
13
- if not L.get(K)or not os.path.exists(L[K]):
14
- if S:
15
- if S=='*':A[U]=P;return A
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
- j=os.path.basename(Y if C==J else X);k=re.search(S,j)
18
- if k:A[U]=P;return A
19
- A[Q]=f"file {C} does not exist";return A
20
- l=FileReader(B.context.working_dir,B.context.config.file_reader,B.context.config.readers,config_alternate_path=B.context.origin_working_dir)
21
- for(C,L)in H.items():H[C][V]=l.read(L[K])
22
- D=H[J][V];F=H[O][V]
23
- if not D or not F:A[U]=P;return A
24
- A[J]=D.info();A[O]=F.info()
25
- if D.read_error:A[Q]=D.read_error;return A
26
- E=CompareErrors(B.context.config.compare.errors_limit,B.context.config.compare.ignore_warnings);Z=CompareFloats(E,B.context.config.compare.float_thresholds);a=D.compare(Z,F,param_is_ref=P);G=E.root_group;M=T
27
- if B.context.config.compare.metrics_compare and(D.metrics or F.metrics):
28
- o,M=E.add_group(R,R,parent=G)
29
- if B.context.config.compare.metrics_thresholds:b=CompareFloats(E,B.context.config.compare.metrics_thresholds)
30
- else:b=Z
31
- b.compare_dicts(D.metrics,F.metrics,M)
32
- I={'total_diffs':G.total_diffs}
33
- if G.info:I.update(G.info)
34
- if a:I.update(a)
35
- if M:
36
- N={}
37
- for c in[SEVERITY_ERROR,SEVERITY_WARNING]:
38
- for(m,d)in enumerate(E.errors[c]):
39
- if d.group==M.id:N[d.info['key']]={h:c,W:m}
40
- I[R]={}
41
- for C in D.metrics.keys():I[R][C]={i:N[C][h],W:N[C][W]}if C in N else{i:'success'}
42
- A[f]=I;A[g]=E.get_data()
43
- if G.error:A[Q]=G.error;return A
44
- D.close();F.close();e=len(E.errors[SEVERITY_ERROR])
45
- if e>0:n=f"{e} comparison errors";A[Q]=n
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
@@ -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
- class FileReaderConfig(BaseModel,extra='forbid'):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`")
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`")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: scilens
3
- Version: 0.5.1
3
+ Version: 0.5.2
4
4
  Summary: A CesGensLaB framework for data collecting and deep analysis
5
5
  Home-page: https://scilens.dev
6
6
  License: Proprietary
@@ -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=IlgfAi9GTAa9TlCXXjCkSZut_yJoCoXh31ctEokAjjE,2330
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=IiH1wJWYVnPnUJ3BiMeGDy8CFHwPOw1nQS2wfk-0p44,2152
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=0-ldLt4YVmb2IwdfEHiIqDsioyXwqSkxrlfuEOmcyrA,1191
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.1.dist-info/METADATA,sha256=DOsseDeHbJk5qKFuuvkZGdNkTOc4BiJb_nGfmsxa_qw,1405
126
- scilens-0.5.1.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
127
- scilens-0.5.1.dist-info/entry_points.txt,sha256=DaKGgxUEUv34GJAoXtta6ecL37ercejep9sCSSRQK2s,48
128
- scilens-0.5.1.dist-info/RECORD,,
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,,