PySimultan 0.5.0__py3-none-any.whl → 0.5.2.5__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.
- PySimultan2/CHANGELOG.md +4 -0
- PySimultan2/__about__.py +1 -1
- PySimultan2/default_types.py +0 -4
- PySimultan2/object_mapper.py +96 -10
- PySimultan2/utils.py +30 -0
- {pysimultan-0.5.0.dist-info → pysimultan-0.5.2.5.dist-info}/METADATA +1 -1
- {pysimultan-0.5.0.dist-info → pysimultan-0.5.2.5.dist-info}/RECORD +9 -8
- {pysimultan-0.5.0.dist-info → pysimultan-0.5.2.5.dist-info}/WHEEL +0 -0
- {pysimultan-0.5.0.dist-info → pysimultan-0.5.2.5.dist-info}/licenses/LICENSE.txt +0 -0
PySimultan2/CHANGELOG.md
ADDED
PySimultan2/__about__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
version = '0.5.
|
1
|
+
version = '0.5.2.5'
|
PySimultan2/default_types.py
CHANGED
@@ -1,14 +1,10 @@
|
|
1
1
|
from __future__ import annotations
|
2
2
|
|
3
|
-
import xxsubtype
|
4
3
|
from collections.abc import Iterable
|
5
4
|
import numpy as np
|
6
|
-
import pandas as pd
|
7
5
|
import colorlog
|
8
6
|
from typing import Union, List, Type, Set, Tuple, Any, Optional
|
9
7
|
|
10
|
-
from reactivex import return_value
|
11
|
-
|
12
8
|
from .utils import (sort_slots, create_simultan_component_for_taxonomy, create_mapped_python_object,
|
13
9
|
set_property_to_sim_component, set_property_to_parameter, set_property_to_file_info,
|
14
10
|
set_property_to_list, set_property_to_value_field, set_property_to_unknown_type,
|
PySimultan2/object_mapper.py
CHANGED
@@ -32,9 +32,21 @@ default_taxonomy_maps = {'ComponentList': component_list_map,
|
|
32
32
|
|
33
33
|
class PythonMapper(object):
|
34
34
|
|
35
|
+
mappers = {}
|
36
|
+
|
35
37
|
def __new__(cls, *args, **kwargs):
|
36
38
|
instance = super(PythonMapper, cls).__new__(cls)
|
37
39
|
config.set_default_mapper(instance)
|
40
|
+
|
41
|
+
if kwargs.get('add_to_mappers', True):
|
42
|
+
initial_module_name = kwargs.get('module', 'unknown_module')
|
43
|
+
module_name = initial_module_name
|
44
|
+
i = 0
|
45
|
+
while module_name in cls.mappers.keys():
|
46
|
+
module_name = f'{initial_module_name}_{i}'
|
47
|
+
i+=1
|
48
|
+
cls.mappers[module_name] = instance
|
49
|
+
|
38
50
|
return instance
|
39
51
|
|
40
52
|
def __init__(self, *args, **kwargs):
|
@@ -42,6 +54,9 @@ class PythonMapper(object):
|
|
42
54
|
self._mapped_classes = {}
|
43
55
|
|
44
56
|
self.name = kwargs.get('name', 'PythonMapper')
|
57
|
+
self._module = kwargs.get('module', 'unknown_module')
|
58
|
+
self.submodules = kwargs.get('submodules', {})
|
59
|
+
|
45
60
|
self.registered_classes: dict[str: SimultanObject] = copy(default_registered_classes) # dict with all registered classes: {taxonomy: class}
|
46
61
|
|
47
62
|
self.undefined_registered_classes: dict[str: SimultanObject] = {} # dict with all registered classes: {taxonomy: class}
|
@@ -59,6 +74,18 @@ class PythonMapper(object):
|
|
59
74
|
self.re_register = False
|
60
75
|
self.load_undefined = False
|
61
76
|
|
77
|
+
@property
|
78
|
+
def module(self):
|
79
|
+
return self._module
|
80
|
+
|
81
|
+
@module.setter
|
82
|
+
def module(self, value):
|
83
|
+
if self._module != value:
|
84
|
+
del self.mappers[self._module]
|
85
|
+
|
86
|
+
self._module = value
|
87
|
+
self.mappers[value] = self
|
88
|
+
|
62
89
|
@property
|
63
90
|
def mapped_classes(self):
|
64
91
|
if len(self.registered_classes) > len(self._mapped_classes):
|
@@ -73,10 +100,14 @@ class PythonMapper(object):
|
|
73
100
|
self._mapped_classes = value
|
74
101
|
|
75
102
|
def register(self,
|
76
|
-
taxonomy,
|
77
|
-
cls,
|
78
|
-
re_register=
|
103
|
+
taxonomy: str,
|
104
|
+
cls: Type[Any],
|
105
|
+
re_register=True,
|
106
|
+
update_in_other_mappers=False,
|
79
107
|
taxonomy_map=None):
|
108
|
+
|
109
|
+
# print(f'Registering {taxonomy} with {cls} {hash(cls)}')
|
110
|
+
|
80
111
|
if not (self.re_register or re_register) and taxonomy in self.registered_classes.keys():
|
81
112
|
return
|
82
113
|
|
@@ -95,8 +126,28 @@ class PythonMapper(object):
|
|
95
126
|
self.registered_classes[taxonomy] = cls
|
96
127
|
self.taxonomy_maps[taxonomy] = taxonomy_map
|
97
128
|
|
129
|
+
if update_in_other_mappers:
|
130
|
+
self.update_from_other_mappers()
|
131
|
+
|
98
132
|
return self.get_mapped_class(taxonomy)
|
99
133
|
|
134
|
+
def update_from_other_mappers(self):
|
135
|
+
for mapper in self.mappers.values():
|
136
|
+
if mapper is not self:
|
137
|
+
for cls, taxonomy in mapper.registered_classes.items():
|
138
|
+
if cls in self.registered_classes.values():
|
139
|
+
key = list(filter(lambda x: mapper.registered_classes[x] == cls,
|
140
|
+
mapper.registered_classes)
|
141
|
+
)[0]
|
142
|
+
mapper.registered_classes[key] = cls
|
143
|
+
print(f'Updated {cls} in {mapper.module} with {taxonomy}')
|
144
|
+
|
145
|
+
def update_from_submodules(self):
|
146
|
+
for submodule in self.submodules.values():
|
147
|
+
self.registered_classes.update(submodule.registered_classes)
|
148
|
+
self.taxonomy_maps.update(submodule.taxonomy_maps)
|
149
|
+
self.registered_geometry_classes.update(submodule.registered_geometry_classes)
|
150
|
+
|
100
151
|
def create_mapped_class(self, taxonomy, cls):
|
101
152
|
|
102
153
|
if any([issubclass(cls, x) for x in (SimultanObject, UserList)]):
|
@@ -342,19 +393,31 @@ class PythonMapper(object):
|
|
342
393
|
def copy(self,
|
343
394
|
*args,
|
344
395
|
**kwargs) -> 'PythonMapper':
|
345
|
-
|
396
|
+
|
397
|
+
orig_new_module_name = kwargs.get('module', self.module)
|
398
|
+
new_module_name = orig_new_module_name
|
399
|
+
i = 0
|
400
|
+
while new_module_name in self.mappers.keys():
|
401
|
+
new_module_name = f'copy_{i}_of_{new_module_name}'
|
402
|
+
i+=1
|
403
|
+
|
404
|
+
new_mapper = PythonMapper(add_to_mappers=kwargs.get('add_to_mappers', True),
|
405
|
+
module=new_module_name)
|
346
406
|
new_mapper.registered_classes = self.registered_classes
|
347
407
|
new_mapper.taxonomy_maps = self.taxonomy_maps
|
348
408
|
new_mapper.registered_geometry_classes = self.registered_geometry_classes
|
349
409
|
new_mapper.load_undefined = self.load_undefined
|
410
|
+
|
350
411
|
return new_mapper
|
351
412
|
|
352
413
|
def __add__(self, other: 'PythonMapper') -> 'PythonMapper':
|
353
|
-
new_mapper = self.copy()
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
414
|
+
# new_mapper = self.copy(add_to_mappers=True)
|
415
|
+
self.submodules[other.module] = other
|
416
|
+
self.submodules.update(other.submodules)
|
417
|
+
self.registered_classes.update(other.registered_classes)
|
418
|
+
self.taxonomy_maps.update(other.taxonomy_maps)
|
419
|
+
self.registered_geometry_classes.update(other.registered_geometry_classes)
|
420
|
+
return self
|
358
421
|
|
359
422
|
def get_mapped_class_for_python_type(self, python_type: type) -> Optional[Type[SimultanObject]]:
|
360
423
|
try:
|
@@ -366,6 +429,29 @@ class PythonMapper(object):
|
|
366
429
|
except IndexError:
|
367
430
|
return None
|
368
431
|
|
432
|
+
def __repr__(self):
|
433
|
+
return f'PythonMapper(module={self.module}, {len(self.registered_classes)} registered classes)'
|
434
|
+
|
369
435
|
|
370
436
|
if config.get_default_mapper() is None:
|
371
|
-
config.set_default_mapper(PythonMapper())
|
437
|
+
config.set_default_mapper(PythonMapper(module='default'))
|
438
|
+
|
439
|
+
|
440
|
+
def register(taxonomy: str,
|
441
|
+
taxonomy_map: TaxonomyMap,
|
442
|
+
re_register=True,
|
443
|
+
module: str = 'unknown_module') -> Any:
|
444
|
+
|
445
|
+
if module not in PythonMapper.mappers.keys():
|
446
|
+
PythonMapper(module=module)
|
447
|
+
|
448
|
+
mapper = PythonMapper.mappers[module]
|
449
|
+
|
450
|
+
def decorator(cls):
|
451
|
+
mapper.register(taxonomy,
|
452
|
+
cls,
|
453
|
+
re_register=re_register,
|
454
|
+
taxonomy_map=taxonomy_map)
|
455
|
+
return cls
|
456
|
+
|
457
|
+
return decorator
|
PySimultan2/utils.py
CHANGED
@@ -1448,3 +1448,33 @@ def add_properties(prop_name: str,
|
|
1448
1448
|
delx.__taxonomy__ = taxonomy
|
1449
1449
|
|
1450
1450
|
return property(getx, setx, delx, "automatic created property")
|
1451
|
+
|
1452
|
+
|
1453
|
+
def uncache(exclude):
|
1454
|
+
"""Remove package modules from cache except excluded ones.
|
1455
|
+
On next import they will be reloaded.
|
1456
|
+
|
1457
|
+
Args:
|
1458
|
+
exclude (iter<str>): Sequence of module paths.
|
1459
|
+
"""
|
1460
|
+
pkgs = []
|
1461
|
+
for mod in exclude:
|
1462
|
+
pkg = mod.split('.', 1)[0]
|
1463
|
+
pkgs.append(pkg)
|
1464
|
+
|
1465
|
+
to_uncache = []
|
1466
|
+
for mod in sys.modules:
|
1467
|
+
if mod in exclude:
|
1468
|
+
continue
|
1469
|
+
|
1470
|
+
if mod in pkgs:
|
1471
|
+
to_uncache.append(mod)
|
1472
|
+
continue
|
1473
|
+
|
1474
|
+
for pkg in pkgs:
|
1475
|
+
if mod.startswith(pkg + '.'):
|
1476
|
+
to_uncache.append(mod)
|
1477
|
+
break
|
1478
|
+
|
1479
|
+
for mod in to_uncache:
|
1480
|
+
del sys.modules[mod]
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: PySimultan
|
3
|
-
Version: 0.5.
|
3
|
+
Version: 0.5.2.5
|
4
4
|
Project-URL: Documentation, https://github.com/Bühler Maximilian/PySimultan2#readme
|
5
5
|
Project-URL: Issues, https://github.com/Bühler Maximilian/PySimultan2/issues
|
6
6
|
Project-URL: Source, https://github.com/Bühler Maximilian/PySimultan2
|
@@ -1,14 +1,15 @@
|
|
1
|
-
PySimultan2/
|
1
|
+
PySimultan2/CHANGELOG.md,sha256=kzZ_OWSL_ov67WjTEONAHoDsIf9YrbMva3g2L_ECCAw,132
|
2
|
+
PySimultan2/__about__.py,sha256=DzvKElNXxadVB8RhRx00rjp7pH4Z08fLEOKXuSsr0HE,21
|
2
3
|
PySimultan2/__init__.py,sha256=PGVR1uhY01dF5tHyad-znURUZ_LVB95vsjId2BT0aJM,3245
|
3
4
|
PySimultan2/data_model.py,sha256=wSEHnx5uU81CSbUpKkmpQ2gbWfDziDxNGIiKnF9-Bck,31731
|
4
|
-
PySimultan2/default_types.py,sha256=
|
5
|
+
PySimultan2/default_types.py,sha256=K-Eka5BCKk8DT3HU5761Ym_-ZFmu1_Dro0zW0LVGoHA,27157
|
5
6
|
PySimultan2/files.py,sha256=_KQNn1WS9LEETSADbxaFXNaTZ9e66dAGhPU5K1iOcOk,14068
|
6
7
|
PySimultan2/multi_values.py,sha256=ZFXlTLuZo32x7_7diYAp2XEjp5uwgHLgNOzN7v74-5I,13650
|
7
|
-
PySimultan2/object_mapper.py,sha256=
|
8
|
+
PySimultan2/object_mapper.py,sha256=hfb28szyH_AeGetYm3ij_RTV2eBdPaBUeHZuagoYRFQ,18630
|
8
9
|
PySimultan2/simultan_object.py,sha256=akaSUZZWIVfwx1wT5EdOgRR2UeShUthX-LE2Uk6w8CQ,19058
|
9
10
|
PySimultan2/taxonomy_maps.py,sha256=abMB2RSKEaliW-Ewegq-Inq9npHeOD1VVrMYoKJAlC0,8762
|
10
11
|
PySimultan2/type_setter_lookup.py,sha256=WtopIR2Z3v3wNFtqmeVorH7ZUbKoJYTTe5I3vfQuKUI,3404
|
11
|
-
PySimultan2/utils.py,sha256=
|
12
|
+
PySimultan2/utils.py,sha256=_GnKNdpCTQaYg4XYvaSSV1LeVOcTiKhFmUOfHc7YiH0,63805
|
12
13
|
PySimultan2/geometry/__init__.py,sha256=nJolTD1i5J8qUkOQa-r3D20aq3Co3sN31Xc0n4wJpJo,248
|
13
14
|
PySimultan2/geometry/geometry_base.py,sha256=nbb9U2W3vFviVLxISLHRi2CVyLEM-3zIKvoZ1uSYs_8,23420
|
14
15
|
PySimultan2/geometry/utils.py,sha256=J25YsK8sso_UL7xRusItQZvyjtvxdOsSPelBQYFABhY,8519
|
@@ -74,7 +75,7 @@ PySimultan2/resources/assimp.dll,sha256=HwfDwXqoPDTFRyoQpA3qmgZoUdFtziJkV5fNtktE
|
|
74
75
|
PySimultan2/resources/componentmanager.user,sha256=hrzr1US4pqkFnLHXcvPkvrgGd7QvlxaV8mhS6fuikEs,760
|
75
76
|
PySimultan2/resources/defaultsettings.xml,sha256=s6Tk1tubLz5UYqXZWpD42EDHzedemRY1nEneoIVcUfg,392
|
76
77
|
PySimultan2/resources/setup.bat,sha256=fjvvYfVM6TalS-QTSiKAbAId5nTsk8kGGo06ba-wWaY,32
|
77
|
-
pysimultan-0.5.
|
78
|
-
pysimultan-0.5.
|
79
|
-
pysimultan-0.5.
|
80
|
-
pysimultan-0.5.
|
78
|
+
pysimultan-0.5.2.5.dist-info/METADATA,sha256=7FPc9s_qFPm-LzcXJG9G1WxikeyZHKmm2SBzJJ_TkIA,2667
|
79
|
+
pysimultan-0.5.2.5.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
|
80
|
+
pysimultan-0.5.2.5.dist-info/licenses/LICENSE.txt,sha256=pmSr98k6N005KMojnZxzLGRuRlDjDx3PUrK1lFj53HA,1126
|
81
|
+
pysimultan-0.5.2.5.dist-info/RECORD,,
|
File without changes
|
File without changes
|