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.
Files changed (95) hide show
  1. scilens/LICENSE +37 -0
  2. scilens/__init__.py +1 -0
  3. scilens/app.py +9 -0
  4. scilens/cli/__init__.py +0 -0
  5. scilens/cli/cglb.py +10 -0
  6. scilens/cli/config.py +15 -0
  7. scilens/cli/info.py +12 -0
  8. scilens/cli/main.py +74 -0
  9. scilens/components/analyse_folder.py +4 -0
  10. scilens/components/compare_2_files.py +22 -0
  11. scilens/components/compare_errors.py +22 -0
  12. scilens/components/compare_floats.py +39 -0
  13. scilens/components/compare_folders.py +39 -0
  14. scilens/components/executor.py +58 -0
  15. scilens/components/file_reader.py +29 -0
  16. scilens/config/__init__.py +0 -0
  17. scilens/config/cli_run_options.py +8 -0
  18. scilens/config/env_var.py +3 -0
  19. scilens/config/load.py +40 -0
  20. scilens/config/models/__init__.py +12 -0
  21. scilens/config/models/app.py +9 -0
  22. scilens/config/models/compare.py +5 -0
  23. scilens/config/models/compare_float_thresholds.py +4 -0
  24. scilens/config/models/execute.py +4 -0
  25. scilens/config/models/execute_and_compare.py +4 -0
  26. scilens/config/models/file_reader.py +3 -0
  27. scilens/config/models/reader_format_csv.py +18 -0
  28. scilens/config/models/reader_format_txt.py +5 -0
  29. scilens/config/models/readers.py +4 -0
  30. scilens/config/models/report.py +6 -0
  31. scilens/config/models/report_html.py +6 -0
  32. scilens/config/models/report_output.py +4 -0
  33. scilens/helpers/assets.py +27 -0
  34. scilens/helpers/search_and_index.py +26 -0
  35. scilens/helpers/templates/index.html +20 -0
  36. scilens/helpers/templates/style.css +124 -0
  37. scilens/processors/__init__.py +3 -0
  38. scilens/processors/analyse.py +14 -0
  39. scilens/processors/compare.py +7 -0
  40. scilens/processors/execute_and_compare.py +17 -0
  41. scilens/processors/models/__init__.py +0 -0
  42. scilens/processors/models/results.py +2 -0
  43. scilens/processors/processor_interface.py +9 -0
  44. scilens/readers/__init__.py +0 -0
  45. scilens/readers/exceptions.py +1 -0
  46. scilens/readers/reader_com_txt_lines.py +2 -0
  47. scilens/readers/reader_csv.py +73 -0
  48. scilens/readers/reader_interface.py +15 -0
  49. scilens/readers/reader_manager.py +30 -0
  50. scilens/readers/reader_txt.py +82 -0
  51. scilens/readers/transform.py +8 -0
  52. scilens/report/__init__.py +0 -0
  53. scilens/report/assets/logo.svg +9 -0
  54. scilens/report/assets/logo_cglb.svg +1 -0
  55. scilens/report/assets.py +11 -0
  56. scilens/report/html_report.py +26 -0
  57. scilens/report/report.py +30 -0
  58. scilens/report/template.py +8 -0
  59. scilens/report/templates/body_01_title.html +61 -0
  60. scilens/report/templates/body_99_footer.html +11 -0
  61. scilens/report/templates/compare_11_summary.html +75 -0
  62. scilens/report/templates/compare_12_sections.html +150 -0
  63. scilens/report/templates/compare_13_section_numbers copy.html +48 -0
  64. scilens/report/templates/compare_13_section_numbers.html +91 -0
  65. scilens/report/templates/index.html +92 -0
  66. scilens/report/templates/js_chartlibs_echarts.js +34 -0
  67. scilens/report/templates/js_chartlibs_plotly.js +55 -0
  68. scilens/report/templates/js_com_dom.js +21 -0
  69. scilens/report/templates/js_com_page.js +199 -0
  70. scilens/report/templates/js_com_palette.js +7 -0
  71. scilens/report/templates/js_curvemgr.js +319 -0
  72. scilens/report/templates/style.css +144 -0
  73. scilens/report/templates/utils_compare_report_anim.js +73 -0
  74. scilens/report/templates/utils_compare_report_framesseries.js +143 -0
  75. scilens/report/vendors/tailwindcss_3_4_15.js +83 -0
  76. scilens/report/vendors/tailwindcss_min_4.0.0-beta.4.js +26 -0
  77. scilens/run/__init__.py +0 -0
  78. scilens/run/models/task_results.py +5 -0
  79. scilens/run/models/task_runtime.py +2 -0
  80. scilens/run/run_task.py +41 -0
  81. scilens/run/standalone_task_runner.py +9 -0
  82. scilens/run/task_context.py +12 -0
  83. scilens/run/tasks_collector.py +52 -0
  84. scilens/utils/dict.py +6 -0
  85. scilens/utils/file.py +43 -0
  86. scilens/utils/php.py +15 -0
  87. scilens/utils/system.py +2 -0
  88. scilens/utils/template.py +5 -0
  89. scilens/utils/time_tracker.py +6 -0
  90. scilens/utils/vectors.py +4 -0
  91. scilens/utils/web.py +20 -0
  92. scilens-0.1.0.dist-info/METADATA +44 -0
  93. scilens-0.1.0.dist-info/RECORD +95 -0
  94. scilens-0.1.0.dist-info/WHEEL +4 -0
  95. 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
@@ -0,0 +1,2 @@
1
+ from pydantic import BaseModel
2
+ class TaskRuntime(BaseModel):sys:dict[str,str];env:dict[str,str];vars:dict[str,str]
@@ -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
@@ -0,0 +1,6 @@
1
+ from functools import reduce
2
+ def dict_path_set(obj,path,value):
3
+ A=obj;B=path.split('.')
4
+ for C in B[:-1]:A=A.setdefault(C,{})
5
+ A[B[-1]]=value
6
+ def dict_path_get(obj,path):return reduce(dict.get,path.split('.'),obj)
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
@@ -0,0 +1,2 @@
1
+ import platform,sys
2
+ def info():A=sys.version_info;return{'os':platform.system().lower(),'arch':platform.machine(),'python':f"{A.major}.{A.minor}.{A.micro}",'python_info':sys.version}
@@ -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}
@@ -0,0 +1,4 @@
1
+ def min_max_scaling(vector):
2
+ A=vector;B=min(A);C=max(A)
3
+ if C==B:return
4
+ return[(A-B)/(C-B)for A in A]
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
+ ![](https://media.cesgenslab.fr/cglb-logo/lens_v0_name.png)
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,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: poetry-core 1.9.1
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,3 @@
1
+ [console_scripts]
2
+ scilens=scilens.cli.main:cli
3
+