scilens 0.1.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/LICENSE +37 -0
- scilens/__init__.py +1 -0
- scilens/app.py +9 -0
- scilens/cli/__init__.py +0 -0
- scilens/cli/cglb.py +10 -0
- scilens/cli/config.py +15 -0
- scilens/cli/info.py +12 -0
- scilens/cli/main.py +74 -0
- scilens/components/analyse_folder.py +4 -0
- scilens/components/compare_2_files.py +22 -0
- scilens/components/compare_errors.py +22 -0
- scilens/components/compare_floats.py +39 -0
- scilens/components/compare_folders.py +39 -0
- scilens/components/executor.py +58 -0
- scilens/components/file_reader.py +29 -0
- scilens/config/__init__.py +0 -0
- scilens/config/cli_run_options.py +8 -0
- scilens/config/env_var.py +3 -0
- scilens/config/load.py +40 -0
- scilens/config/models/__init__.py +12 -0
- scilens/config/models/app.py +9 -0
- scilens/config/models/compare.py +5 -0
- scilens/config/models/compare_float_thresholds.py +4 -0
- scilens/config/models/execute.py +4 -0
- scilens/config/models/execute_and_compare.py +4 -0
- scilens/config/models/file_reader.py +3 -0
- scilens/config/models/reader_format_csv.py +18 -0
- scilens/config/models/reader_format_txt.py +5 -0
- scilens/config/models/readers.py +4 -0
- scilens/config/models/report.py +6 -0
- scilens/config/models/report_html.py +6 -0
- scilens/config/models/report_output.py +4 -0
- scilens/helpers/assets.py +27 -0
- scilens/helpers/search_and_index.py +26 -0
- scilens/helpers/templates/index.html +20 -0
- scilens/helpers/templates/style.css +124 -0
- scilens/processors/__init__.py +3 -0
- scilens/processors/analyse.py +14 -0
- scilens/processors/compare.py +7 -0
- scilens/processors/execute_and_compare.py +17 -0
- scilens/processors/models/__init__.py +0 -0
- scilens/processors/models/results.py +2 -0
- scilens/processors/processor_interface.py +9 -0
- scilens/readers/__init__.py +0 -0
- scilens/readers/exceptions.py +1 -0
- scilens/readers/reader_com_txt_lines.py +2 -0
- scilens/readers/reader_csv.py +73 -0
- scilens/readers/reader_interface.py +15 -0
- scilens/readers/reader_manager.py +30 -0
- scilens/readers/reader_txt.py +82 -0
- scilens/readers/transform.py +8 -0
- scilens/report/__init__.py +0 -0
- scilens/report/assets/logo.svg +9 -0
- scilens/report/assets/logo_cglb.svg +1 -0
- scilens/report/assets.py +11 -0
- scilens/report/html_report.py +26 -0
- scilens/report/report.py +30 -0
- scilens/report/template.py +8 -0
- scilens/report/templates/body_01_title.html +61 -0
- scilens/report/templates/body_99_footer.html +11 -0
- scilens/report/templates/compare_11_summary.html +75 -0
- scilens/report/templates/compare_12_sections.html +150 -0
- scilens/report/templates/compare_13_section_numbers copy.html +48 -0
- scilens/report/templates/compare_13_section_numbers.html +91 -0
- scilens/report/templates/index.html +92 -0
- scilens/report/templates/js_chartlibs_echarts.js +34 -0
- scilens/report/templates/js_chartlibs_plotly.js +55 -0
- scilens/report/templates/js_com_dom.js +21 -0
- scilens/report/templates/js_com_page.js +199 -0
- scilens/report/templates/js_com_palette.js +7 -0
- scilens/report/templates/js_curvemgr.js +319 -0
- scilens/report/templates/style.css +144 -0
- scilens/report/templates/utils_compare_report_anim.js +73 -0
- scilens/report/templates/utils_compare_report_framesseries.js +143 -0
- scilens/report/vendors/tailwindcss_3_4_15.js +83 -0
- scilens/report/vendors/tailwindcss_min_4.0.0-beta.4.js +26 -0
- scilens/run/__init__.py +0 -0
- scilens/run/models/task_results.py +5 -0
- scilens/run/models/task_runtime.py +2 -0
- scilens/run/run_task.py +41 -0
- scilens/run/standalone_task_runner.py +9 -0
- scilens/run/task_context.py +12 -0
- scilens/run/tasks_collector.py +52 -0
- scilens/utils/dict.py +6 -0
- scilens/utils/file.py +43 -0
- scilens/utils/php.py +15 -0
- scilens/utils/system.py +2 -0
- scilens/utils/template.py +5 -0
- scilens/utils/time_tracker.py +6 -0
- scilens/utils/vectors.py +4 -0
- scilens/utils/web.py +20 -0
- scilens-0.1.0.dist-info/METADATA +44 -0
- scilens-0.1.0.dist-info/RECORD +95 -0
- scilens-0.1.0.dist-info/WHEEL +4 -0
- scilens-0.1.0.dist-info/entry_points.txt +3 -0
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
_A=None
|
|
2
|
+
from pydantic import BaseModel
|
|
3
|
+
from scilens.processors.models.results import ProcessorResults
|
|
4
|
+
from scilens.report.report import ReportProcessResults
|
|
5
|
+
class TaskResults(BaseModel):error:str|_A=_A;processor_results:ProcessorResults|_A=_A;report_results:ReportProcessResults|_A=_A
|
scilens/run/run_task.py
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import logging,os
|
|
2
|
+
from enum import Enum
|
|
3
|
+
from pydantic import BaseModel
|
|
4
|
+
from scilens.config.models import AppConfig
|
|
5
|
+
from scilens.run.models.task_results import TaskResults
|
|
6
|
+
from scilens.run.models.task_runtime import TaskRuntime
|
|
7
|
+
from scilens.run.task_context import TaskContext
|
|
8
|
+
from scilens.processors.models.results import ProcessorResults
|
|
9
|
+
from scilens.processors import Analyse,Compare,ExecuteAndCompare
|
|
10
|
+
from scilens.report.report import Report
|
|
11
|
+
from scilens.utils.system import info as system_info
|
|
12
|
+
from scilens.utils.time_tracker import TimeTracker
|
|
13
|
+
from scilens.utils.template import template_render_string
|
|
14
|
+
def var_render(value,runtime):return template_render_string(value,runtime.model_dump())
|
|
15
|
+
def runtime_process_vars(config):
|
|
16
|
+
A=TaskRuntime(sys=system_info(),env=os.environ.copy(),vars={})
|
|
17
|
+
for(B,C)in config.variables.items():A.vars[B]=var_render(C,A)
|
|
18
|
+
return A
|
|
19
|
+
def runtime_apply_to_config(runtime,config_model):
|
|
20
|
+
C=runtime;B=config_model
|
|
21
|
+
for(D,J)in B.__class__.__pydantic_fields__.items():
|
|
22
|
+
A=getattr(B,D);E=issubclass(A.__class__,BaseModel);F=isinstance(A.__class__,type)and issubclass(A.__class__,Enum);G=isinstance(A,str);H=isinstance(A,list)and all(isinstance(A,str)for A in A);I=isinstance(A,dict)and all(isinstance(A,str)and isinstance(B,str)for(A,B)in A.items())
|
|
23
|
+
if E:runtime_apply_to_config(C,A)
|
|
24
|
+
elif G and not F:setattr(B,D,var_render(A,C))
|
|
25
|
+
elif H:setattr(B,D,[var_render(A,C)for A in A])
|
|
26
|
+
elif I:setattr(B,D,{A:var_render(B,C)for(A,B)in A.items()})
|
|
27
|
+
class RunTask:
|
|
28
|
+
def __init__(A,context):A.context=context
|
|
29
|
+
def _get_processors(A):return{A.__name__:A for A in[Analyse,Compare,ExecuteAndCompare]}
|
|
30
|
+
def process(A):
|
|
31
|
+
logging.info(f"Running task");logging.info(f"Prepare runtime variables");H=runtime_process_vars(A.context.config);logging.info(f"Apply runtime variables to config");runtime_apply_to_config(H,A.context.config);logging.debug(f"on working_dir '{A.context.working_dir}'");logging.debug(f"with origin_working_dir '{A.context.origin_working_dir}'");logging.debug(f"with config {A.context.config.model_dump_json(indent=4)}");C=A.context.config.processor
|
|
32
|
+
if not C:raise Exception('Processor not defined in config.')
|
|
33
|
+
D=A._get_processors().get(C)
|
|
34
|
+
if not D:raise Exception('Processor not found.')
|
|
35
|
+
logging.info(f"Processor '{D.__name__}'")
|
|
36
|
+
try:F=TimeTracker();G=D(A.context);E=G.process();F.stop();I=F.get_data()
|
|
37
|
+
except Exception as B:logging.error(B);return TaskResults(error=str(B))
|
|
38
|
+
finally:G=None
|
|
39
|
+
try:J=Report(A.context.working_dir,[A.context.origin_working_dir],A.context.config.report,A.context.task_name).process({'meta':{'system_info':system_info(),'task_info':{'processor':C,'process_time':I}},'processor_results':E.data},C)
|
|
40
|
+
except Exception as B:logging.error(B);return TaskResults(error=str(B),processor_results=E)
|
|
41
|
+
return TaskResults(processor_results=E,report_results=J)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from scilens.config.load import config_load
|
|
3
|
+
from scilens.run.task_context import TaskContext
|
|
4
|
+
from scilens.run.run_task import RunTask
|
|
5
|
+
from scilens.config.models import AppConfig
|
|
6
|
+
class StandaloneTaskRunner:
|
|
7
|
+
config_path=None
|
|
8
|
+
def __init__(A,config):A.config=config_load(config)
|
|
9
|
+
def process(A,working_dir,origin_working_dir=None):B=TaskContext(config=A.config,config_file=A.config_path,working_dir=working_dir,origin_working_dir=origin_working_dir);C=RunTask(B);D=C.process();return D
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from scilens.config.models import AppConfig
|
|
3
|
+
class TaskContext:
|
|
4
|
+
working_dir:str;origin_working_dir:str;config:AppConfig;config_file:str|None=None
|
|
5
|
+
def __init__(A,working_dir,origin_working_dir,config,config_file):
|
|
6
|
+
E='working_dir must be an absolute path.';D='working_dir does not exist.';C=origin_working_dir;B=working_dir
|
|
7
|
+
if not os.path.isdir(B):raise Exception(D)
|
|
8
|
+
if not os.path.isabs(B):raise Exception(E)
|
|
9
|
+
if not os.path.isdir(C):raise Exception(D)
|
|
10
|
+
if not os.path.isabs(C):raise Exception(E)
|
|
11
|
+
A.config=config;A.config_file=config_file;A.working_dir=B;A.origin_working_dir=C;A.task_name=''
|
|
12
|
+
if len(B)>len(C):A.task_name=B.replace(C,'')
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
_A=None
|
|
2
|
+
import logging,os
|
|
3
|
+
from scilens.app import pkg_name
|
|
4
|
+
from scilens.config.load import config_load
|
|
5
|
+
from scilens.run.task_context import TaskContext
|
|
6
|
+
from scilens.run.run_task import RunTask
|
|
7
|
+
from scilens.utils.file import list_paths_at_depth
|
|
8
|
+
def configfile_search_in_folder(folder):
|
|
9
|
+
for B in['yml','yaml']:
|
|
10
|
+
A=f"{folder}/{pkg_name}.{B}"
|
|
11
|
+
if os.path.isfile(A):return A
|
|
12
|
+
def configfile_search_in_folder_recursive(folder):
|
|
13
|
+
A=folder;B=[];C=configfile_search_in_folder(A)
|
|
14
|
+
if C:return[(A,C)]
|
|
15
|
+
else:
|
|
16
|
+
D=[os.path.join(A,B)for B in os.listdir(A)if os.path.isdir(os.path.join(A,B))]
|
|
17
|
+
for dir in D:B+=configfile_search_in_folder_recursive(dir)
|
|
18
|
+
return B
|
|
19
|
+
class TasksCollector:
|
|
20
|
+
def __init__(A,absolute_working_dir,config_filepath=_A,collect_discover=False,collect_depth=_A,tags=_A,processor=_A):
|
|
21
|
+
F=processor;E=collect_discover;D=config_filepath;C=collect_depth;B=absolute_working_dir
|
|
22
|
+
if not os.path.isdir(B):raise Exception('absolute_working_dir does not exist.')
|
|
23
|
+
if not os.path.isabs(B):raise Exception('absolute_working_dir must be an absolute path.')
|
|
24
|
+
A.path=B
|
|
25
|
+
if not bool(D)+E+(bool(C)or C==0)+bool(F)in[0,1]:raise Exception('config_filepath, collect_discover, collect_depth and processor are mutually exclusive.')
|
|
26
|
+
A.config_filepath=D;A.collect_discover=E;A.collect_depth=C;A.processor=F;A.tags=tags
|
|
27
|
+
def process(A,options_path_value):
|
|
28
|
+
F=options_path_value;logging.info(f"Collecting tasks");B=[]
|
|
29
|
+
if A.collect_discover:
|
|
30
|
+
logging.info(f"Collect-discover: Exploring recursively the folder '{A.path}'");H=configfile_search_in_folder_recursive(A.path);logging.info(f"Collect-discover: Number of config files found: {len(H)}");logging.info(f"Loading configurations")
|
|
31
|
+
for(K,I)in H:E=config_load(I,F);C=TaskContext(config=E,config_file=I,working_dir=K,origin_working_dir=A.path);B.append(RunTask(C))
|
|
32
|
+
elif A.processor:E=config_load({'processor':A.processor},F);C=TaskContext(config=E,config_file=_A,working_dir=A.path,origin_working_dir=A.path);B.append(RunTask(C))
|
|
33
|
+
else:
|
|
34
|
+
D=_A
|
|
35
|
+
if A.config_filepath:
|
|
36
|
+
if not os.path.isfile(A.config_filepath):raise Exception(f"Config file '{A.config_filepath}' not found.")
|
|
37
|
+
else:D=os.path.abspath(A.config_filepath)
|
|
38
|
+
else:
|
|
39
|
+
D=configfile_search_in_folder(A.path)
|
|
40
|
+
if D:logging.info(f"Config file found at '{D}'")
|
|
41
|
+
else:raise Exception(f"Config file not found in '{A.path}'")
|
|
42
|
+
E=config_load(D,F)
|
|
43
|
+
if A.collect_depth is not _A:
|
|
44
|
+
logging.info(f"Collecting tasks at depth: {A.collect_depth}");J=list_paths_at_depth(A.path,A.collect_depth);logging.info(f"Number of dirs found: {len(J)}")
|
|
45
|
+
for dir in J:
|
|
46
|
+
G=configfile_search_in_folder(dir)
|
|
47
|
+
if G:L=config_load(D,F,config_override=G);C=TaskContext(config=L,config_file=G,working_dir=dir,origin_working_dir=A.path)
|
|
48
|
+
else:C=TaskContext(config=E,config_file=D,working_dir=dir,origin_working_dir=A.path)
|
|
49
|
+
B.append(RunTask(C))
|
|
50
|
+
else:C=TaskContext(config=E,config_file=D,working_dir=A.path,origin_working_dir=A.path);B.append(RunTask(C))
|
|
51
|
+
if A.tags:logging.info(f"Filtering tasks with tags: {A.tags}");B=[B for B in B if any(A in(B.context.config.tags or[])for A in A.tags)]
|
|
52
|
+
logging.info(f"Number of tasks collected: {len(B)}");return B
|
scilens/utils/dict.py
ADDED
scilens/utils/file.py
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import json,os,shutil,yaml
|
|
2
|
+
def file_remove(path):
|
|
3
|
+
if os.path.exists(path):os.remove(path)
|
|
4
|
+
def dir_remove(path):
|
|
5
|
+
if os.path.exists(path):shutil.rmtree(path)
|
|
6
|
+
def dir_create(path):
|
|
7
|
+
if not os.path.exists(path):os.makedirs(path)
|
|
8
|
+
def dir_copy(source_dir,target_dir):shutil.copytree(source_dir,target_dir)
|
|
9
|
+
def dir_is_empty(path):return len(os.listdir(path))==0
|
|
10
|
+
def file_copy(source_file,destination_file):A=destination_file;os.makedirs(os.path.dirname(A),exist_ok=True);shutil.copy(source_file,A)
|
|
11
|
+
def copy(src,dst):
|
|
12
|
+
A=src
|
|
13
|
+
if os.path.isfile(A):file_copy(A,dst)
|
|
14
|
+
else:dir_copy(A,dst)
|
|
15
|
+
def text_write(path,data):
|
|
16
|
+
with open(path,'w')as A:A.write(data)
|
|
17
|
+
def text_append(path,data):
|
|
18
|
+
with open(path,'a')as A:A.write(data)
|
|
19
|
+
def text_load(path):
|
|
20
|
+
with open(path,'r')as A:return A.read()
|
|
21
|
+
def json_write(path,data):
|
|
22
|
+
with open(path,'w')as A:json.dump(data,A,indent=4)
|
|
23
|
+
def json_write_small(path,data):
|
|
24
|
+
with open(path,'w')as A:json.dump(data,A)
|
|
25
|
+
def json_load(path):
|
|
26
|
+
with open(path)as A:return json.load(A)
|
|
27
|
+
def yaml_write(path,data):
|
|
28
|
+
with open(path,'w')as A:yaml.dump(data,A,default_flow_style=False)
|
|
29
|
+
def move(source,target):shutil.move(source,target)
|
|
30
|
+
def list_paths_at_depth(root_dir,depth):
|
|
31
|
+
B=depth;A=root_dir;C=[]
|
|
32
|
+
for(D,F,G)in os.walk(A):
|
|
33
|
+
E=D.count(os.sep)-A.count(os.sep)
|
|
34
|
+
if E==B:C.append(D)
|
|
35
|
+
elif E>B:F.clear()
|
|
36
|
+
return C
|
|
37
|
+
def list_paths_for_file_recursive(path,filename):
|
|
38
|
+
B=filename;A=path;C=[];D=os.path.join(A,B)
|
|
39
|
+
if os.path.isfile(D):return[A]
|
|
40
|
+
else:
|
|
41
|
+
E=[os.path.join(A,B)for B in os.listdir(A)if os.path.isdir(os.path.join(A,B))]
|
|
42
|
+
for dir in E:C+=list_paths_for_file_recursive(dir,B)
|
|
43
|
+
return C
|
scilens/utils/php.py
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
def dict_to_php_array(data,indent=0):
|
|
2
|
+
F='array(\n';D=indent;B=data;A='';C=' '*(D*4)
|
|
3
|
+
if isinstance(B,dict):
|
|
4
|
+
A+=F
|
|
5
|
+
for(G,E)in B.items():A+=f"{C} '{G}' => {dict_to_php_array(E,D+1)},\n"
|
|
6
|
+
A+=f"{C})"
|
|
7
|
+
elif isinstance(B,list):
|
|
8
|
+
A+=F
|
|
9
|
+
for E in B:A+=f"{C} {dict_to_php_array(E,D+1)},\n"
|
|
10
|
+
A+=f"{C})"
|
|
11
|
+
elif isinstance(B,str):A+=f"'{B}'"
|
|
12
|
+
elif isinstance(B,bool):A+='true'if B else'false'
|
|
13
|
+
elif B is None:A+='null'
|
|
14
|
+
else:A+=str(B)
|
|
15
|
+
return A
|
scilens/utils/system.py
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
from jinja2 import Template,Environment,FileSystemLoader
|
|
2
|
+
def template_render_string(template_str,context):return Template(template_str).render(context)
|
|
3
|
+
def template_render_path(filepath,context):
|
|
4
|
+
with open(filepath,'r')as A:B=A.read();return template_render_string(B,context)
|
|
5
|
+
def template_render_infolder(filename,context,template_dir):A=FileSystemLoader([template_dir]);B=Environment(loader=A);return B.get_template(filename).render(context)
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import datetime as dt
|
|
2
|
+
class TimeTracker:
|
|
3
|
+
def __init__(A):A.start_time=dt.datetime.now(dt.timezone.utc);A.end_time=None
|
|
4
|
+
def stop(A):A.end_time=dt.datetime.now(dt.timezone.utc)
|
|
5
|
+
def get_datetime_data(B,datetime):A=datetime;return{'datetime':A.strftime('%Y-%m-%d %H:%M:%S'),'date':A.strftime('%Y-%m-%d'),'time':A.strftime('%H:%M:%S')}
|
|
6
|
+
def get_data(A):return{'start':A.get_datetime_data(A.start_time),'end':A.get_datetime_data(A.end_time)if A.end_time else None,'duration_seconds':(A.end_time-A.start_time).total_seconds()if A.end_time else None}
|
scilens/utils/vectors.py
ADDED
scilens/utils/web.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import requests
|
|
2
|
+
from urllib.parse import urlparse
|
|
3
|
+
BASE_HEADERS={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
|
|
4
|
+
class Web:
|
|
5
|
+
def download(E,url,filename,headers=None):
|
|
6
|
+
A=headers;B=BASE_HEADERS.copy()
|
|
7
|
+
if A:B.update(A)
|
|
8
|
+
C=requests.get(url,headers=B);C.raise_for_status()
|
|
9
|
+
with open(filename,'wb')as D:D.write(C.content)
|
|
10
|
+
def download_progress(L,url,filename,headers=None,callback100=None):
|
|
11
|
+
D=callback100;C=headers;E=BASE_HEADERS.copy()
|
|
12
|
+
if C:E.update(C)
|
|
13
|
+
F=requests.get(url,headers=E,stream=True);I=int(F.headers.get('Content-Length',0));G=0;J=I//100;A=0
|
|
14
|
+
with open(filename,'wb')as K:
|
|
15
|
+
for B in F.iter_content(chunk_size=1024):
|
|
16
|
+
if B:
|
|
17
|
+
K.write(B);G+=len(B);H=G//J
|
|
18
|
+
if H>A:
|
|
19
|
+
A=H
|
|
20
|
+
if D:D(A)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: scilens
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: A CesGensLaB framework for data collecting and deep analysis
|
|
5
|
+
Home-page: https://scilens.dev
|
|
6
|
+
License: Proprietary
|
|
7
|
+
Author: CesGensLaB
|
|
8
|
+
Author-email: contact@cesgenlab.fr
|
|
9
|
+
Requires-Python: >=3.10,<4.0
|
|
10
|
+
Classifier: License :: Other/Proprietary License
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
16
|
+
Requires-Dist: coloredlogs (>=15.0.1,<16.0.0)
|
|
17
|
+
Requires-Dist: jinja2 (>=3.1.4,<4.0.0)
|
|
18
|
+
Requires-Dist: pydantic (>=2.10.2,<3.0.0)
|
|
19
|
+
Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
|
|
20
|
+
Requires-Dist: requests (>=2.32.3,<3.0.0)
|
|
21
|
+
Requires-Dist: rich-click (>=1.8.4,<2.0.0)
|
|
22
|
+
Project-URL: Documentation, https://scilens.dev/docs
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
|
|
25
|
+
# SciLens
|
|
26
|
+
|
|
27
|
+

|
|
28
|
+
|
|
29
|
+
A [CesGensLaB](https://cesgenslab.fr) framework for **data collecting** and **data deep analysis**.
|
|
30
|
+
|
|
31
|
+
**Resources:**
|
|
32
|
+
|
|
33
|
+
- [Homepage](https://scilens.dev)
|
|
34
|
+
|
|
35
|
+
- [Documentation](https://scilens.dev/docs)
|
|
36
|
+
|
|
37
|
+
- [License](https://scilens.dev/legal/license)
|
|
38
|
+
|
|
39
|
+
- [Demos](https://github.com/CesGensLaB/scilens-demos)
|
|
40
|
+
|
|
41
|
+
- [Issue Tracker](https://forge-02.cesgenslab.cloud/cglb-registry/scilens-issues/issues)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
scilens/LICENSE,sha256=31mXfX-uKAQ5w5KEIbqyofK5fgFmwQYWrZ7kBlVZ_zk,2005
|
|
2
|
+
scilens/__init__.py,sha256=SfPXEsAFmHysqDyi_vsJv-jianWa5mvKbAQAII5Nek0,59
|
|
3
|
+
scilens/app.py,sha256=rcYSDXZwQ5LhilKT_Ln3JyCk21t1JLDXiwe-s27zGEI,395
|
|
4
|
+
scilens/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
5
|
+
scilens/cli/cglb.py,sha256=R0377H5H193DJ_h4hj32m6qvrZrMnSFOxSGVl2FItiU,443
|
|
6
|
+
scilens/cli/config.py,sha256=XVY6q5E9fb6MZzPct4-X7m6e45erpt5MCIuzKTBKPAI,965
|
|
7
|
+
scilens/cli/info.py,sha256=xE7q9epjrCQRL6Agi3nhKsG6Mr3B8HSUFMti-epMoXA,1929
|
|
8
|
+
scilens/cli/main.py,sha256=ozGeSEANZx1FKpq9v55GvCZkXk3cazgLa0gtpjbMImg,5637
|
|
9
|
+
scilens/components/analyse_folder.py,sha256=yqc-dscKaHLZJCYeXGak2v0c3F2aeX0E11AFPfya6r0,208
|
|
10
|
+
scilens/components/compare_2_files.py,sha256=oQ5p9JwB1r_HhfCb29mv1kkkrUd0EdrVug9T-1fQshY,1286
|
|
11
|
+
scilens/components/compare_errors.py,sha256=_n9uWwLVZyPn99mwsAF8WBfcYppVQCsMwj0xuOrlhkU,1241
|
|
12
|
+
scilens/components/compare_floats.py,sha256=T461VNiwVXtYWqrIr5LMiUwBkHsPmhv6LjzIVfkQOI8,1978
|
|
13
|
+
scilens/components/compare_folders.py,sha256=LZ1AuYxLVHMNbtXWXQrdms4vZgOQthvDy-8NFD_EFjc,2617
|
|
14
|
+
scilens/components/executor.py,sha256=8ZZq9wwoiMr7ys9LXv1pEg5Zc06QatT9PGIigMsDAB8,3620
|
|
15
|
+
scilens/components/file_reader.py,sha256=V_W_eeSvnJ0nePrJ0Yml_w_G0wMtFN3LS3B2AO6L7Lo,1552
|
|
16
|
+
scilens/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
+
scilens/config/cli_run_options.py,sha256=Ls7yK5QDUPFbk73nbjGuPvuRbBRYw4Miag5ISpu3prg,281
|
|
18
|
+
scilens/config/env_var.py,sha256=NqNBoIfngJEXaGEm7jGqre5pmkJ9eUjiWzbDrTVfi2c,292
|
|
19
|
+
scilens/config/load.py,sha256=4U51o4cJfqhSuRIHKUDIsDQA0C4wv6SzTkVmInGDJdI,1647
|
|
20
|
+
scilens/config/models/__init__.py,sha256=B3D5sAUfms8urbWPKQ-OgsU1Hm9p6hRHU1dAGAcJbOo,607
|
|
21
|
+
scilens/config/models/app.py,sha256=JltWRjjqXYkH6rg3OHYhMfkBqHFhZEZdthqES3LxvzY,1453
|
|
22
|
+
scilens/config/models/compare.py,sha256=_SLMxf81fpuod8izZm72Jn12euRPxB0wHJSfUuIANbE,1639
|
|
23
|
+
scilens/config/models/compare_float_thresholds.py,sha256=wvXJ_ewmjp8ro_aiq_9AS2eo4wnW26GI6swN3zw5drs,1570
|
|
24
|
+
scilens/config/models/execute.py,sha256=pFY-gZuBvLbcjTEcoNhPPO7FMFmKa6_TU5IXyKaf81A,1706
|
|
25
|
+
scilens/config/models/execute_and_compare.py,sha256=TWL6yXGvQSaaV6nhHqWLvtr3v396APIoDNt0U1TbMro,582
|
|
26
|
+
scilens/config/models/file_reader.py,sha256=sDIh1z_q4B5c7PhNC1WvQWLNGR4NMbXr-WhT6zDyLB4,1000
|
|
27
|
+
scilens/config/models/reader_format_csv.py,sha256=r2ERmC_dWoESr9sCJ_T3dF2F00ypttZfSH8ZFG-PKnw,2208
|
|
28
|
+
scilens/config/models/reader_format_txt.py,sha256=eHg90gwEI_VpqwqEjMRhwlS8dHcl5G4ow-37HjQq_zY,1168
|
|
29
|
+
scilens/config/models/readers.py,sha256=5doJjhau8qk7nWFmBa2ixO_yU1rsGNv3wZ77bweDZgo,421
|
|
30
|
+
scilens/config/models/report.py,sha256=nTmP2nIwL2Ku5IH9QMwYLPKmfsK2ttu9UK0GnzPUHeM,870
|
|
31
|
+
scilens/config/models/report_html.py,sha256=9I9iKRDOoLMZRBY0lQV4UFtg5-D-VDfYiFGF1VFAnQ8,1389
|
|
32
|
+
scilens/config/models/report_output.py,sha256=XoqUe-t-y8GRbUR3_bDwwaWf6hif-rZ-5pKDGdCMugw,875
|
|
33
|
+
scilens/helpers/assets.py,sha256=XphDA3-yE1PPKw4XFZhDrlLQjMZfGMlpOBXa8uy_xX0,1552
|
|
34
|
+
scilens/helpers/search_and_index.py,sha256=kXZ7124ra_SGAdKUZ7msy55UOWQ9dCSuPuNoU-NdUyM,1522
|
|
35
|
+
scilens/helpers/templates/index.html,sha256=hwoABZ7mWbN92VZhAMrloTdm_-leW8aQRbRfyafXl3Q,490
|
|
36
|
+
scilens/helpers/templates/style.css,sha256=2_IndKW2qtGhuoU9T3Sru4NkHR5CXTTs5_nc9byktVI,3185
|
|
37
|
+
scilens/processors/__init__.py,sha256=x6bmqQVCcdJ7R2oG-_xTVtvl9qRleliEZlZR-Hq9Yc0,105
|
|
38
|
+
scilens/processors/analyse.py,sha256=hG2jALUqtoEwTPiLxDGV9Nbv6TU_SrfzwV_-1RkuiKw,828
|
|
39
|
+
scilens/processors/compare.py,sha256=wCdtDC8nJUeG9dolu2B6rTg4-jW0MYllPbvXFBX64nU,529
|
|
40
|
+
scilens/processors/execute_and_compare.py,sha256=oUaI8kh8pkR86kGvN2EXtq-tbgphkzKiURcrhjXbnL4,1736
|
|
41
|
+
scilens/processors/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
42
|
+
scilens/processors/models/results.py,sha256=KoWxh13Zgi7PuPql8hkf4VjCis42ZxAuzIgJxBWVaX8,119
|
|
43
|
+
scilens/processors/processor_interface.py,sha256=jzMp1529JXnMGTJijVy6b_1zmARAMNv70f2lgys7vn4,452
|
|
44
|
+
scilens/readers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
45
|
+
scilens/readers/exceptions.py,sha256=JzmxcjnR5sH-IOWVeCC5A1bSwxv-jCAtIJvDjzx1CTI,32
|
|
46
|
+
scilens/readers/reader_com_txt_lines.py,sha256=zsCumTD0sv06OQNvRKPMuv94De_6KGMvN904-E1Uqeg,91
|
|
47
|
+
scilens/readers/reader_csv.py,sha256=6im4FdkCFQXz2nVQlrKzwViQUh6yBZ0Vw8zpKKwzesw,3753
|
|
48
|
+
scilens/readers/reader_interface.py,sha256=nnttHL7wt4MOXpi-SBkk8DYxVWscOPG8JFl_z12mIAo,922
|
|
49
|
+
scilens/readers/reader_manager.py,sha256=1ULW0cPOtgep2JhS-KmvvW1bSfrjGHkpwSUfIi41vyg,1519
|
|
50
|
+
scilens/readers/reader_txt.py,sha256=IpIA_qfdL70wrDnOotUtFjt7Yt0lEenYv93E63mQwZw,3744
|
|
51
|
+
scilens/readers/transform.py,sha256=5OAcexHf2vj4obKsltWpwc_iNdsN7qgZNZEQJ18v3D0,185
|
|
52
|
+
scilens/report/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
53
|
+
scilens/report/assets/logo.svg,sha256=W-1OVqcvdBjf-1AHHcV6WciIUqBoVFUh52Tc3o_jqtA,4519
|
|
54
|
+
scilens/report/assets/logo_cglb.svg,sha256=tEpkSr2h-jjQMecqiHef98Mxod4GD5j5nCQaFloTYso,2411
|
|
55
|
+
scilens/report/assets.py,sha256=CcfGc9NNGnPVinkHZkEyN2S_BGKNIyMFvVdA__-M6-0,532
|
|
56
|
+
scilens/report/html_report.py,sha256=PGbaar0UTUsHrH9HxSibLi7lEv6cean0-yKEhmSAKzQ,1845
|
|
57
|
+
scilens/report/report.py,sha256=aS7ktJ2u0IAMMk-HwqqSsRkr77ZBQyYT4wXJ7djQvAk,1811
|
|
58
|
+
scilens/report/template.py,sha256=cPs5gd3uEwb-6JgitGQD_i4IiUxigBTlZLNRS9KVuos,581
|
|
59
|
+
scilens/report/templates/body_01_title.html,sha256=59BmETKHqRO1T_xYp0XLKx3Vha9hU9bu7yaUTVt2p9Y,2146
|
|
60
|
+
scilens/report/templates/body_99_footer.html,sha256=8cWebeWfZwZ-9bYAMZkZj8rbCWq3BLIMjKQThWQxoQM,362
|
|
61
|
+
scilens/report/templates/compare_11_summary.html,sha256=wskX861ISVQKFyEf3cF5mD53XNP1DhsCt6gQ-ebL9Cw,3476
|
|
62
|
+
scilens/report/templates/compare_12_sections.html,sha256=m6HK-BL4Sb8VKNbCl-48Kmu9rh-IFkdp-Hckdedp7Gg,5923
|
|
63
|
+
scilens/report/templates/compare_13_section_numbers copy.html,sha256=0PWK_I2kNX3LjPLkkY4eSYIeB7YFkA28nk-PPLDhnaY,1753
|
|
64
|
+
scilens/report/templates/compare_13_section_numbers.html,sha256=ocPnazj2YsoroZUaBMNLqluejr7s8Kp71egceDxjzOI,2776
|
|
65
|
+
scilens/report/templates/index.html,sha256=0KOhFUWdUvK3_s6j9t3xARqguXk1pr6gtc096CtH-3I,3307
|
|
66
|
+
scilens/report/templates/js_chartlibs_echarts.js,sha256=6YicVhTNIBmmBpV31XCVN5oBeiD0t29JIosJZRUv01M,907
|
|
67
|
+
scilens/report/templates/js_chartlibs_plotly.js,sha256=uVAOKUB5XE33-r04phR-LlRkFoaHEIXyQ3jXT5r97Rc,1521
|
|
68
|
+
scilens/report/templates/js_com_dom.js,sha256=YAJNGmgq2YbF9D3TqB7YSms67-xB88Molp9cKhWlqsI,1228
|
|
69
|
+
scilens/report/templates/js_com_page.js,sha256=ZxYHR-KGQRH726rPOXrEgyzBKM9NtGH3_APvcawKxQw,6862
|
|
70
|
+
scilens/report/templates/js_com_palette.js,sha256=3aZVDxBmz6cxp0plcTsQO03SrcsXg5Cn5COyeHmVO1g,242
|
|
71
|
+
scilens/report/templates/js_curvemgr.js,sha256=uBLiWzAcg4kOm3KpFFlLPiPzZ30yzAAVebwKVbufmvw,10799
|
|
72
|
+
scilens/report/templates/style.css,sha256=thZ_LZonmY9qH9oBie1BcK2H2FPPqik11YFr1hyo6ng,4071
|
|
73
|
+
scilens/report/templates/utils_compare_report_anim.js,sha256=a7FHRco17BmgOAHb9kiDsFcSoxbmTGqjBbXBprf3hnU,2923
|
|
74
|
+
scilens/report/templates/utils_compare_report_framesseries.js,sha256=y2y73nNilmCXcHqJH47oc0iDrYKaLDOn3j8f4muWYxc,5770
|
|
75
|
+
scilens/report/vendors/tailwindcss_3_4_15.js,sha256=niHw6Rf0uS2pE5_8h-E18NI24o1urZL5Ac31_n9htKE,407279
|
|
76
|
+
scilens/report/vendors/tailwindcss_min_4.0.0-beta.4.js,sha256=fy2LOvMX7m4b1V9WdtWC0dCPNIYhE2cLkFiD3JNcYhI,177617
|
|
77
|
+
scilens/run/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
78
|
+
scilens/run/models/task_results.py,sha256=hdr_QEwMnjdfdawpfuBRMGqCHWQvsF61G39CVEMXKl8,284
|
|
79
|
+
scilens/run/models/task_runtime.py,sha256=VNbMPS1ocl6WUDG5ipUxp3RSAST2OZ5DqGcfJWFEed8,114
|
|
80
|
+
scilens/run/run_task.py,sha256=suCnACK2RmcwGdmOUAxnb0UD3LC_VT8RH9S525rsr14,2828
|
|
81
|
+
scilens/run/standalone_task_runner.py,sha256=XhbwoUdjdfM2m2CfWHym05HyvPB5xK2A9M-o5zMu8dA,498
|
|
82
|
+
scilens/run/task_context.py,sha256=NnujvpwnxY-YEzivYPYWaX-YChcZlEXt9y0_DXLqZkk,659
|
|
83
|
+
scilens/run/tasks_collector.py,sha256=m_FQaJdQRi4fCLW17ryJxU0TvGNJN54JTw2Mg6XPojY,3174
|
|
84
|
+
scilens/utils/dict.py,sha256=1MVQc8vZCs8_gQJMBkBSXO828wMe2eIWFiraLVmcjqk,214
|
|
85
|
+
scilens/utils/file.py,sha256=3JkynZORUWah-dwaVpUDzyOSlOQkub1d9R3QqCkNYXE,1597
|
|
86
|
+
scilens/utils/php.py,sha256=VBJxpzwwRPNcr3379f6ViwhpTzjGc4BKlSXHv4lnor8,444
|
|
87
|
+
scilens/utils/system.py,sha256=drXp_Vdv2dP9wFQoEQZIhxyCJhFliBLFPylGwv89FF4,182
|
|
88
|
+
scilens/utils/template.py,sha256=9dlXX3nmfzDRUwzPJOkoxk15UXivZ2SW-McdCwokFa4,443
|
|
89
|
+
scilens/utils/time_tracker.py,sha256=DdVBoMpVLXrX0qZZXyLm4g38EwDVLlRcBqcpNex1mYY,545
|
|
90
|
+
scilens/utils/vectors.py,sha256=4N2BZSC5n3HgZqPujDGF5NdjVmSL1rOHb_qw4OoABQY,103
|
|
91
|
+
scilens/utils/web.py,sha256=E4T8Fra65u9g_BpcFANPk4ORvsYavAeiSgWA3vRca2E,804
|
|
92
|
+
scilens-0.1.0.dist-info/METADATA,sha256=mx8t-WYXNC1BlREUVJ5cwzb1mL6VLsuFIm6_APAuNB8,1367
|
|
93
|
+
scilens-0.1.0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
|
|
94
|
+
scilens-0.1.0.dist-info/entry_points.txt,sha256=DaKGgxUEUv34GJAoXtta6ecL37ercejep9sCSSRQK2s,48
|
|
95
|
+
scilens-0.1.0.dist-info/RECORD,,
|