Skip to content

Commit f26b24f

Browse files
Améliorer la capacité d'héritage de Crue10_tools (#11)
* Améliorer la capacité d'héritage de Crue10_tools * Ajout préparation version 4.4 * Ensure Python2 compatibility * Upgrade sphinx docs * Exception dans FactoryClass --------- Co-authored-by: Luc DURON <l.duron@cnr.tm.fr>
1 parent 7c7d990 commit f26b24f

File tree

12 files changed

+166
-39
lines changed

12 files changed

+166
-39
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ Journal des modifications
22
=========================
33

44

5+
## [4.4] - 2025-06-04
6+
### Nouveautés
7+
- Améliorer la capacité d'héritage de Crue10_tools (pour `Etude` et `Scenario`)
8+
9+
510
## [4.3] - 2024-10-02
611
### Corrections
712
- Mise à jour des scripts GéoGAMA-Crue (support g1.3)

crue10/etude.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from crue10.scenario import Scenario
1313
from crue10.sous_modele import SousModele
1414
from crue10.utils import check_isinstance, ExceptionCrue10, logger, PREFIX
15+
from crue10.utils.design_patterns import factory_define, factory_make
1516

1617

1718
def read_metadata(elt, keys):
@@ -22,6 +23,7 @@ def read_metadata(elt, keys):
2223
return metadata
2324

2425

26+
@factory_define('Etude') # Cette classe pourra être appelée par factory_make('Etude')
2527
class Etude(EnsembleFichiersXML):
2628
"""
2729
Étude Crue10
@@ -251,7 +253,7 @@ def _read_etu(self):
251253
raise NotImplementedError # A single Modele for a Scenario!
252254

253255
metadata = read_metadata(elt_scenario, Scenario.METADATA_FIELDS)
254-
scenario = Scenario(nom_scenario, modele, files=files, metadata=metadata,
256+
scenario = factory_make('Scenario')(nom_scenario, modele, files=files, metadata=metadata,
255257
version_grammaire=self.version_grammaire)
256258

257259
runs = elt_scenario.find(PREFIX + 'Runs')
@@ -421,7 +423,7 @@ def create_empty_scenario(self, nom_scenario, nom_modele, nom_sous_modele=None,
421423
version_grammaire=version_grammaire)
422424
if nom_sous_modele is not None:
423425
modele.create_empty_sous_modele(nom_sous_modele, self.mode, metadata=metadata)
424-
scenario = Scenario(nom_scenario, modele, mode=self.mode, metadata=metadata,
426+
scenario = factory_make('Scenario')(nom_scenario, modele, mode=self.mode, metadata=metadata,
425427
version_grammaire=version_grammaire)
426428
self.ajouter_scenario(scenario)
427429
if not self.nom_scenario_courant:
@@ -597,7 +599,7 @@ def ajouter_scenario_par_copie(self, nom_scenario_source, nom_scenario_cible, ov
597599
out_path = os.path.join(self.folder, nom_scenario_cible[3:] + '.' + xml_type + '.xml')
598600
copyfile(in_path, out_path)
599601
scenario_files[xml_type] = out_path # overwrite Scenario file path
600-
scenario = Scenario(nom_scenario_cible, scenario_ori.modele, mode='w',
602+
scenario = factory_make('Scenario')(nom_scenario_cible, scenario_ori.modele, mode='w',
601603
files=scenario_files, metadata=scenario_ori.metadata)
602604
scenario.read_all()
603605
if overwrite and scenario.id in self.scenarios:

crue10/scenario/__init__.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
duration_iso8601_to_seconds, duration_seconds_to_iso8601, \
1717
ExceptionCrue10, extract_pdt_from_elt, get_optional_commentaire, get_xml_root_from_file, \
1818
JINJA_ENV, logger, parse_loi, PREFIX, write_default_xml_file, write_xml_from_tree, DATA_FOLDER_ABSPATH
19+
from crue10.utils.design_patterns import factory_define, factory_make
1920
from crue10.utils.crueconfigmetier import CCM_FILE
2021
from crue10.utils.settings import CRUE10_EXE_PATH
2122
from crue10.utils.sorties import Sorties
@@ -99,6 +100,7 @@ def get_pdt_res_in_iso8601(self):
99100
return res
100101

101102

103+
@factory_define('Scenario') # Cette classe pourra être appelée par factory_make('Scenario')
102104
class Scenario(EnsembleFichiersXML):
103105
"""
104106
Scénario Crue10
@@ -207,8 +209,8 @@ def ajouter_loi_hydraulique(self, loi_hydraulique):
207209
"""
208210
Ajouter une loi hydraulique au scénario
209211
210-
:param run: loi hydraulique à ajouter
211-
:type run: LoiHydraulique
212+
:param loi_hydraulique: loi hydraulique à ajouter
213+
:type loi_hydraulique: LoiHydraulique
212214
"""
213215
check_isinstance(loi_hydraulique, LoiHydraulique)
214216
self.lois_hydrauliques[loi_hydraulique.id] = loi_hydraulique
@@ -751,13 +753,13 @@ def create_and_launch_new_run(self, etude, run_id=None, exe_path=CRUE10_EXE_PATH
751753
run.launch_services(Run.SERVICES, exe_path=exe_path)
752754
return run
753755

754-
def create_and_launch_new_multiple_sequential_runs(self, modifications_liste, etude,
755-
exe_path=CRUE10_EXE_PATH, force=False):
756+
def create_and_launch_new_multiple_sequential_runs(
757+
self, modifications_liste, etude, exe_path=CRUE10_EXE_PATH, force=False):
756758
"""
757759
Créer et lancer des runs séquentiels selon les modifications demandées
758760
759-
:param modifications: liste avec les dictionnaires contenant les modifications
760-
:type modifications: list(dict(str))
761+
:param modifications_liste: liste avec les dictionnaires contenant les modifications
762+
:type modifications_liste: list(dict(str))
761763
:param etude: étude courante
762764
:type etude: Etude
763765
:param exe_path: chemin vers l'exécutable crue10.exe

crue10/utils/design_patterns.py

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
# coding: utf-8
2+
3+
"""
4+
Ensemble d'utilitaires mettant en œuvre divers design patterns.
5+
- Singleton
6+
- Factory
7+
© CNR
8+
PBa 2025-06 Création
9+
"""
10+
from future.utils import with_metaclass # python2 compatibility
11+
from crue10.utils import ExceptionCrue10
12+
13+
14+
class Singleton(type):
15+
""" Classe à utiliser comme une métaclasse pour mettre en œuvre le design pattern Singleton.
16+
Cela permet d'instancier une classe à divers endroits du code, en n'en ayant qu'une seule et unique instance.
17+
"""
18+
# Variable de classe: dictionnaire des instances {}
19+
_dic_nom_obj = {}
20+
21+
def __call__(cls, *args, **kwargs):
22+
""" Fournir une instance de la classe, en la créant seulement la première fois.
23+
"""
24+
if cls not in cls._dic_nom_obj:
25+
cls._dic_nom_obj[cls] = super(Singleton, cls).__call__(*args, **kwargs) # Appeler le constructeur, une fois
26+
return cls._dic_nom_obj[cls] # Renvoyer une instance déjà créée
27+
28+
29+
class FactoryClass(with_metaclass(Singleton)):
30+
""" Classe utilitaire mettant en œuvre le design pattern Factory.
31+
Cela permet de récupérer une classe associée à un nom, pour ensuite l'instancier en late binding. On peut ainsi
32+
spécialiser une classe de Crue10_tools dans un autre package, sans toucher à Crue10_tools.
33+
Ensemble cohérent: 'FactoryClass', 'factory_define', 'factory_make' (les deux fonctions constituent l'interface).
34+
"""
35+
# Variable de classe: dictionnaire d'association {nom_cls: cls}
36+
_dic_nom_cls = {}
37+
38+
def define(self, nom_cls, cls):
39+
""" Définir une association entre un nom et une classe.
40+
41+
:param nom_cls: nom associé
42+
:type nom_cls: str
43+
:param cls: classe à utiliser
44+
:type cls: callable
45+
"""
46+
# print(f"Définir '{nom_cls}' comme {cls}")
47+
self._dic_nom_cls[nom_cls] = cls
48+
49+
def make(self, nom_cls):
50+
""" Fournir la classe à partir du nom qui lui est associé.
51+
52+
:param nom_cls: nom associé
53+
:type nom_cls: str
54+
:return: classe à utiliser
55+
"""
56+
if nom_cls in self._dic_nom_cls:
57+
# print(f"Utiliser '{nom_cls}' comme {self._dic_nom_cls.get(nom_cls)}")
58+
return self._dic_nom_cls[nom_cls]
59+
else:
60+
raise ExceptionCrue10("Le nom `%s` est inconnu de FactoryClass (pas de @factory_define associé)" % nom_cls)
61+
62+
63+
def factory_define(nom_cls):
64+
""" Décorateur qui associe le nom passé en paramètre à la classe décorée; pour ensuite utiliser 'factory'.
65+
Ensemble cohérent: 'FactoryClass', 'factory_define', 'factory_make'.
66+
67+
:param nom_cls: nom associé à la classe
68+
:type nom_cls: str
69+
"""
70+
def decorator(cls):
71+
""" Récupérer la classe décorée pour pouvoir l'utiliser via 'factory'.
72+
73+
:param cls: classe décorée
74+
:return: classe définie
75+
:rtype: callable
76+
"""
77+
FactoryClass().define(nom_cls, cls) # Mémoriser l'association entre nom_cls et cls
78+
return cls
79+
return decorator
80+
81+
82+
def factory_make(nom_cls):
83+
""" Renvoyer la classe associée à un nom; utiliser le décorateur '@factory_define' sur la classe pour l'associer.
84+
Ensemble cohérent: 'FactoryClass', 'factory_define', 'factory_make'.
85+
Exemple d'utilisation: etu = factory_make('Etude')(etu_path=r"path/to/Etu_XX.etu.xml")
86+
87+
:param nom_cls: nom associé à la classe à renvoyer
88+
:return: classe associée
89+
:rtype: callable
90+
"""
91+
return FactoryClass().make(nom_cls)

docs/conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
# -- Project information -----------------------------------------------------
1919

2020
project = 'Crue10_tools'
21-
copyright = '2024, CNR-Engineering'
21+
copyright = '2025, CNR-Engineering'
2222
author = 'CNR-Engineering'
2323

2424

docs/crue10.base.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ Module contents
66

77
.. automodule:: crue10.base
88
:members:
9-
:undoc-members:
109
:show-inheritance:
1110
:special-members: __init__
11+
:undoc-members:

docs/crue10.emh.rst

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,41 +9,41 @@ crue10.emh.branche module
99

1010
.. automodule:: crue10.emh.branche
1111
:members:
12-
:undoc-members:
1312
:show-inheritance:
1413
:special-members: __init__
14+
:undoc-members:
1515

1616
crue10.emh.casier module
1717
------------------------
1818

1919
.. automodule:: crue10.emh.casier
2020
:members:
21-
:undoc-members:
2221
:show-inheritance:
2322
:special-members: __init__
23+
:undoc-members:
2424

2525
crue10.emh.noeud module
2626
-----------------------
2727

2828
.. automodule:: crue10.emh.noeud
2929
:members:
30-
:undoc-members:
3130
:show-inheritance:
3231
:special-members: __init__
32+
:undoc-members:
3333

3434
crue10.emh.section module
3535
-------------------------
3636

3737
.. automodule:: crue10.emh.section
3838
:members:
39-
:undoc-members:
4039
:show-inheritance:
4140
:special-members: __init__
41+
:undoc-members:
4242

4343
Module contents
4444
---------------
4545

4646
.. automodule:: crue10.emh
4747
:members:
48-
:undoc-members:
4948
:show-inheritance:
49+
:undoc-members:

docs/crue10.rst

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Subpackages
55
-----------
66

77
.. toctree::
8+
:maxdepth: 4
89

910
crue10.base
1011
crue10.emh
@@ -15,39 +16,47 @@ Subpackages
1516
Submodules
1617
----------
1718

19+
crue10.campagne\_otfa module
20+
----------------------------
21+
22+
.. automodule:: crue10.campagne_otfa
23+
:members:
24+
:show-inheritance:
25+
:special-members: __init__
26+
:undoc-members:
27+
1828
crue10.etude module
1929
-------------------
2030

2131
.. automodule:: crue10.etude
2232
:members:
23-
:undoc-members:
2433
:show-inheritance:
2534
:special-members: __init__
35+
:undoc-members:
2636

2737
crue10.modele module
2838
--------------------
2939

3040
.. automodule:: crue10.modele
3141
:members:
32-
:undoc-members:
3342
:show-inheritance:
3443
:special-members: __init__
44+
:undoc-members:
3545

3646
crue10.sous\_modele module
3747
--------------------------
3848

3949
.. automodule:: crue10.sous_modele
4050
:members:
41-
:undoc-members:
4251
:show-inheritance:
4352
:special-members: __init__
44-
53+
:undoc-members:
4554

4655
Module contents
4756
---------------
4857

4958
.. automodule:: crue10
5059
:members:
51-
:undoc-members:
5260
:show-inheritance:
5361
:special-members: __init__
62+
:undoc-members:

docs/crue10.run.rst

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,29 @@ crue10.run package
44
Submodules
55
----------
66

7-
crue10.run.resultats_calcul module
8-
-------------------------
7+
crue10.run.resultats\_calcul module
8+
-----------------------------------
99

1010
.. automodule:: crue10.run.resultats_calcul
1111
:members:
12-
:undoc-members:
1312
:show-inheritance:
1413
:special-members: __init__
14+
:undoc-members:
1515

1616
crue10.run.trace module
1717
-----------------------
1818

1919
.. automodule:: crue10.run.trace
2020
:members:
21-
:undoc-members:
2221
:show-inheritance:
2322
:special-members: __init__
24-
23+
:undoc-members:
2524

2625
Module contents
2726
---------------
2827

2928
.. automodule:: crue10.run
3029
:members:
31-
:undoc-members:
3230
:show-inheritance:
3331
:special-members: __init__
32+
:undoc-members:

docs/crue10.scenario.rst

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,24 @@ crue10.scenario.calcul module
99

1010
.. automodule:: crue10.scenario.calcul
1111
:members:
12-
:undoc-members:
1312
:show-inheritance:
1413
:special-members: __init__
14+
:undoc-members:
1515

1616
crue10.scenario.loi\_hydraulique module
1717
---------------------------------------
1818

1919
.. automodule:: crue10.scenario.loi_hydraulique
2020
:members:
21-
:undoc-members:
2221
:show-inheritance:
2322
:special-members: __init__
24-
23+
:undoc-members:
2524

2625
Module contents
2726
---------------
2827

2928
.. automodule:: crue10.scenario
3029
:members:
31-
:undoc-members:
3230
:show-inheritance:
3331
:special-members: __init__
32+
:undoc-members:

0 commit comments

Comments
 (0)