zpp_config 1.0.0__tar.gz
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.
- zpp_config-1.0.0/PKG-INFO +158 -0
- zpp_config-1.0.0/README.md +143 -0
- zpp_config-1.0.0/setup.cfg +4 -0
- zpp_config-1.0.0/setup.py +17 -0
- zpp_config-1.0.0/zpp_config/__init__.py +6 -0
- zpp_config-1.0.0/zpp_config/config.py +417 -0
- zpp_config-1.0.0/zpp_config.egg-info/PKG-INFO +158 -0
- zpp_config-1.0.0/zpp_config.egg-info/SOURCES.txt +8 -0
- zpp_config-1.0.0/zpp_config.egg-info/dependency_links.txt +1 -0
- zpp_config-1.0.0/zpp_config.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: zpp_config
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Module pour le chargement et la modification de fichier de configuration
|
|
5
|
+
Home-page: https://github.com/ZephyrOff/py-zpp_config
|
|
6
|
+
Author: ZephyrOff
|
|
7
|
+
Author-email: contact@apajak.fr
|
|
8
|
+
License: MIT
|
|
9
|
+
Description: # zpp-config
|
|
10
|
+
## Informations
|
|
11
|
+
Librairie pour l'utilisation et la modification de fichier de configuration:<br>
|
|
12
|
+
- Charger un ou plusieurs paramètres
|
|
13
|
+
- Modifier un paramètre existant
|
|
14
|
+
- Ajout un paramètre ou une section
|
|
15
|
+
- Supprimer un paramètre ou une section
|
|
16
|
+
- Lister les sections disponibles
|
|
17
|
+
- Lister les paramètres et/ou sections désactivés
|
|
18
|
+
|
|
19
|
+
Prends en compte les paramètres commentés.<br>
|
|
20
|
+
Compatible avec les fichiers de configuration indentés.<br><br>
|
|
21
|
+
Traduit les paramètres pour les types str, int, float, bool, list, dict
|
|
22
|
+
|
|
23
|
+
### Prérequis
|
|
24
|
+
- Python 3
|
|
25
|
+
<br>
|
|
26
|
+
|
|
27
|
+
# Installation
|
|
28
|
+
```console
|
|
29
|
+
pip install zpp_config
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
# Utilisation
|
|
33
|
+
### Conseil d'importation du module
|
|
34
|
+
```python
|
|
35
|
+
from zpp_config import Config
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
<br>
|
|
39
|
+
|
|
40
|
+
### Exemple de fichier de config
|
|
41
|
+
```xml
|
|
42
|
+
[section]
|
|
43
|
+
value1 = key1
|
|
44
|
+
value2 = key2
|
|
45
|
+
value3 = key3
|
|
46
|
+
|
|
47
|
+
[section2]
|
|
48
|
+
value1 = key1
|
|
49
|
+
value2 = key2
|
|
50
|
+
value3 = key3
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
<br>
|
|
54
|
+
|
|
55
|
+
### Initialisaton d'un fichier de configuration
|
|
56
|
+
```python
|
|
57
|
+
c = Config("conf.ini")
|
|
58
|
+
```
|
|
59
|
+
>En paramètre supplémentaire, nous pouvons mettre:<br/>
|
|
60
|
+
>- separator: Définir le séparateur entre la clé et la valeur dans le fichier. (Par défaut: " = ")
|
|
61
|
+
>- escape_line: Définir le caractère utilisé pour commenter une valeur ou une section. (Par défaut: "#")
|
|
62
|
+
>- auto_create: Créer le fichier de configuration s'il n'existe pas. (Par défaut: "False")
|
|
63
|
+
>- read_only: Ouvrir le fichier de configuration en lecture seule. (Par défaut: "False")
|
|
64
|
+
|
|
65
|
+
<br>
|
|
66
|
+
|
|
67
|
+
### Chargement de paramètre
|
|
68
|
+
|
|
69
|
+
La fonction renvoie la valeur si un unique paramètre a été trouvé, sinon renvoie un dictionnaire avec les différentes valeurs trouvées (classé par section)
|
|
70
|
+
Renvoie un tableau vide si aucun paramètre n'a été trouvé
|
|
71
|
+
|
|
72
|
+
#### Chargement de tous les paramètres
|
|
73
|
+
```python
|
|
74
|
+
data = c.load()
|
|
75
|
+
```
|
|
76
|
+
#### Chargement d'une section du fichier
|
|
77
|
+
```python
|
|
78
|
+
data = c.load(section='section_name')
|
|
79
|
+
```
|
|
80
|
+
#### Chargement d'une valeur dans tout le fichier
|
|
81
|
+
```python
|
|
82
|
+
data = c.load(val='value_name')
|
|
83
|
+
```
|
|
84
|
+
#### Chargement d'une valeur dans une section spécifique
|
|
85
|
+
```python
|
|
86
|
+
data = c.load(val='value_name', section='section_name')
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
<br>
|
|
90
|
+
|
|
91
|
+
### Changement de paramètre
|
|
92
|
+
#### Changement d'une valeur dans tout le fichier
|
|
93
|
+
```python
|
|
94
|
+
c.change(val='value_name', key='key_value')
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
#### Changement d'une valeur dans une section spécifique
|
|
98
|
+
```python
|
|
99
|
+
c.change(val='value_name', key='key_value', section='section_name')
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
<br>
|
|
103
|
+
|
|
104
|
+
### Ajout de paramètre ou de section
|
|
105
|
+
|
|
106
|
+
Ajoute une section ou un paramètre dans le fichier de configuration.
|
|
107
|
+
Dans le cas de l'ajout d'un paramètre, rajoute la section si elle n'existe pas.
|
|
108
|
+
|
|
109
|
+
#### Ajout d'une section
|
|
110
|
+
```python
|
|
111
|
+
c.add(section='section_name')
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
#### Ajout d'un paramètre dans une section
|
|
115
|
+
```python
|
|
116
|
+
c.add(val='value_name', key='key_value', section='section_name')
|
|
117
|
+
```
|
|
118
|
+
> Si aucune section est défini, rajoute le paramètre en dehors des sections.
|
|
119
|
+
|
|
120
|
+
<br>
|
|
121
|
+
|
|
122
|
+
### Suppression de paramètre ou de section
|
|
123
|
+
|
|
124
|
+
#### Suppression d'une section
|
|
125
|
+
```python
|
|
126
|
+
c.delete(section='section_name')
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
#### Suppression d'un paramètre dans une section
|
|
130
|
+
```python
|
|
131
|
+
c.delete(val='value_name', section='section_name')
|
|
132
|
+
```
|
|
133
|
+
> Si aucune section est défini, recherche le paramètre en dehors des sections.
|
|
134
|
+
|
|
135
|
+
<br>
|
|
136
|
+
|
|
137
|
+
### Liste des paramètres non pris en compte
|
|
138
|
+
|
|
139
|
+
Retourne la liste des paramètres qui sont non pris en compte dans le fichier de configuration.
|
|
140
|
+
|
|
141
|
+
```python
|
|
142
|
+
data = c.disabled_line()
|
|
143
|
+
```
|
|
144
|
+
> Possibilité de préciser la section en utilisant le paramètre section
|
|
145
|
+
|
|
146
|
+
<br>
|
|
147
|
+
|
|
148
|
+
### Liste les sections disponibles
|
|
149
|
+
```python
|
|
150
|
+
data = c.list_section()
|
|
151
|
+
```
|
|
152
|
+
Keywords: config file terminal zephyroff
|
|
153
|
+
Platform: ALL
|
|
154
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
155
|
+
Classifier: Environment :: Console
|
|
156
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
157
|
+
Classifier: Programming Language :: Python :: 3
|
|
158
|
+
Description-Content-Type: text/markdown
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# zpp-config
|
|
2
|
+
## Informations
|
|
3
|
+
Librairie pour l'utilisation et la modification de fichier de configuration:<br>
|
|
4
|
+
- Charger un ou plusieurs paramètres
|
|
5
|
+
- Modifier un paramètre existant
|
|
6
|
+
- Ajout un paramètre ou une section
|
|
7
|
+
- Supprimer un paramètre ou une section
|
|
8
|
+
- Lister les sections disponibles
|
|
9
|
+
- Lister les paramètres et/ou sections désactivés
|
|
10
|
+
|
|
11
|
+
Prends en compte les paramètres commentés.<br>
|
|
12
|
+
Compatible avec les fichiers de configuration indentés.<br><br>
|
|
13
|
+
Traduit les paramètres pour les types str, int, float, bool, list, dict
|
|
14
|
+
|
|
15
|
+
### Prérequis
|
|
16
|
+
- Python 3
|
|
17
|
+
<br>
|
|
18
|
+
|
|
19
|
+
# Installation
|
|
20
|
+
```console
|
|
21
|
+
pip install zpp_config
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
# Utilisation
|
|
25
|
+
### Conseil d'importation du module
|
|
26
|
+
```python
|
|
27
|
+
from zpp_config import Config
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
<br>
|
|
31
|
+
|
|
32
|
+
### Exemple de fichier de config
|
|
33
|
+
```xml
|
|
34
|
+
[section]
|
|
35
|
+
value1 = key1
|
|
36
|
+
value2 = key2
|
|
37
|
+
value3 = key3
|
|
38
|
+
|
|
39
|
+
[section2]
|
|
40
|
+
value1 = key1
|
|
41
|
+
value2 = key2
|
|
42
|
+
value3 = key3
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
<br>
|
|
46
|
+
|
|
47
|
+
### Initialisaton d'un fichier de configuration
|
|
48
|
+
```python
|
|
49
|
+
c = Config("conf.ini")
|
|
50
|
+
```
|
|
51
|
+
>En paramètre supplémentaire, nous pouvons mettre:<br/>
|
|
52
|
+
>- separator: Définir le séparateur entre la clé et la valeur dans le fichier. (Par défaut: " = ")
|
|
53
|
+
>- escape_line: Définir le caractère utilisé pour commenter une valeur ou une section. (Par défaut: "#")
|
|
54
|
+
>- auto_create: Créer le fichier de configuration s'il n'existe pas. (Par défaut: "False")
|
|
55
|
+
>- read_only: Ouvrir le fichier de configuration en lecture seule. (Par défaut: "False")
|
|
56
|
+
|
|
57
|
+
<br>
|
|
58
|
+
|
|
59
|
+
### Chargement de paramètre
|
|
60
|
+
|
|
61
|
+
La fonction renvoie la valeur si un unique paramètre a été trouvé, sinon renvoie un dictionnaire avec les différentes valeurs trouvées (classé par section)
|
|
62
|
+
Renvoie un tableau vide si aucun paramètre n'a été trouvé
|
|
63
|
+
|
|
64
|
+
#### Chargement de tous les paramètres
|
|
65
|
+
```python
|
|
66
|
+
data = c.load()
|
|
67
|
+
```
|
|
68
|
+
#### Chargement d'une section du fichier
|
|
69
|
+
```python
|
|
70
|
+
data = c.load(section='section_name')
|
|
71
|
+
```
|
|
72
|
+
#### Chargement d'une valeur dans tout le fichier
|
|
73
|
+
```python
|
|
74
|
+
data = c.load(val='value_name')
|
|
75
|
+
```
|
|
76
|
+
#### Chargement d'une valeur dans une section spécifique
|
|
77
|
+
```python
|
|
78
|
+
data = c.load(val='value_name', section='section_name')
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
<br>
|
|
82
|
+
|
|
83
|
+
### Changement de paramètre
|
|
84
|
+
#### Changement d'une valeur dans tout le fichier
|
|
85
|
+
```python
|
|
86
|
+
c.change(val='value_name', key='key_value')
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
#### Changement d'une valeur dans une section spécifique
|
|
90
|
+
```python
|
|
91
|
+
c.change(val='value_name', key='key_value', section='section_name')
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
<br>
|
|
95
|
+
|
|
96
|
+
### Ajout de paramètre ou de section
|
|
97
|
+
|
|
98
|
+
Ajoute une section ou un paramètre dans le fichier de configuration.
|
|
99
|
+
Dans le cas de l'ajout d'un paramètre, rajoute la section si elle n'existe pas.
|
|
100
|
+
|
|
101
|
+
#### Ajout d'une section
|
|
102
|
+
```python
|
|
103
|
+
c.add(section='section_name')
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
#### Ajout d'un paramètre dans une section
|
|
107
|
+
```python
|
|
108
|
+
c.add(val='value_name', key='key_value', section='section_name')
|
|
109
|
+
```
|
|
110
|
+
> Si aucune section est défini, rajoute le paramètre en dehors des sections.
|
|
111
|
+
|
|
112
|
+
<br>
|
|
113
|
+
|
|
114
|
+
### Suppression de paramètre ou de section
|
|
115
|
+
|
|
116
|
+
#### Suppression d'une section
|
|
117
|
+
```python
|
|
118
|
+
c.delete(section='section_name')
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
#### Suppression d'un paramètre dans une section
|
|
122
|
+
```python
|
|
123
|
+
c.delete(val='value_name', section='section_name')
|
|
124
|
+
```
|
|
125
|
+
> Si aucune section est défini, recherche le paramètre en dehors des sections.
|
|
126
|
+
|
|
127
|
+
<br>
|
|
128
|
+
|
|
129
|
+
### Liste des paramètres non pris en compte
|
|
130
|
+
|
|
131
|
+
Retourne la liste des paramètres qui sont non pris en compte dans le fichier de configuration.
|
|
132
|
+
|
|
133
|
+
```python
|
|
134
|
+
data = c.disabled_line()
|
|
135
|
+
```
|
|
136
|
+
> Possibilité de préciser la section en utilisant le paramètre section
|
|
137
|
+
|
|
138
|
+
<br>
|
|
139
|
+
|
|
140
|
+
### Liste les sections disponibles
|
|
141
|
+
```python
|
|
142
|
+
data = c.list_section()
|
|
143
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
from setuptools import setup
|
|
2
|
+
import os
|
|
3
|
+
import zpp_config
|
|
4
|
+
|
|
5
|
+
setup(name="zpp_config",
|
|
6
|
+
version=zpp_config.__version__,
|
|
7
|
+
author="ZephyrOff",
|
|
8
|
+
author_email="contact@apajak.fr",
|
|
9
|
+
keywords = "config file terminal zephyroff",
|
|
10
|
+
classifiers = ["Development Status :: 5 - Production/Stable", "Environment :: Console", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3"],
|
|
11
|
+
packages=["zpp_config"],
|
|
12
|
+
description="Module pour le chargement et la modification de fichier de configuration",
|
|
13
|
+
long_description = open(os.path.join(os.path.dirname(__file__), 'README.md')).read(),
|
|
14
|
+
long_description_content_type='text/markdown',
|
|
15
|
+
url = "https://github.com/ZephyrOff/py-zpp_config",
|
|
16
|
+
platforms = "ALL",
|
|
17
|
+
license="MIT")
|
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
####################################################################
|
|
2
|
+
#/ Nom du projet: py-zpp_config /#
|
|
3
|
+
#/ Nom du fichier: config.py /#
|
|
4
|
+
#/ Type de fichier: fichier principal /#
|
|
5
|
+
#/ Fichier annexe: /#
|
|
6
|
+
#/ /#
|
|
7
|
+
#/ Auteur: ZephyrOff (Alexandre Pajak) /#
|
|
8
|
+
#/ Version: 1.0 /#
|
|
9
|
+
#/ Description: Module pour le chargement et la modification /#
|
|
10
|
+
#/ de fichier de configuration /#
|
|
11
|
+
#/ Date: 01/06/2022 /#
|
|
12
|
+
####################################################################
|
|
13
|
+
|
|
14
|
+
import re
|
|
15
|
+
import ast
|
|
16
|
+
from os.path import isfile, exists
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class Config():
|
|
20
|
+
def __init__(self,file,separator=" = ", escape_line="#", auto_create=False, read_only=False):
|
|
21
|
+
self.reg = r'\[[0-9A-Za-z-_ ]*\]'
|
|
22
|
+
|
|
23
|
+
self.separator=separator
|
|
24
|
+
self.escape_line = escape_line
|
|
25
|
+
|
|
26
|
+
self.read_only = read_only
|
|
27
|
+
|
|
28
|
+
if isfile(file) and exists(file):
|
|
29
|
+
self.file = file
|
|
30
|
+
else:
|
|
31
|
+
if auto_create==False:
|
|
32
|
+
print("Error: File not exists")
|
|
33
|
+
else:
|
|
34
|
+
with open(file,'w') as f:
|
|
35
|
+
self.file = file
|
|
36
|
+
|
|
37
|
+
#Str to real type
|
|
38
|
+
def return_data(self, data):
|
|
39
|
+
if data=="true" or data=="True":
|
|
40
|
+
return True
|
|
41
|
+
elif data=="false" or data=="False":
|
|
42
|
+
return False
|
|
43
|
+
else:
|
|
44
|
+
try:
|
|
45
|
+
return ast.literal_eval(data)
|
|
46
|
+
except:
|
|
47
|
+
return data
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def indent_line(self,line):
|
|
51
|
+
lineC = line.replace("\t","")
|
|
52
|
+
line = ""
|
|
53
|
+
l = ""
|
|
54
|
+
for i, char in enumerate(lineC):
|
|
55
|
+
if (char=="'" and lineC.count("'")%2==0) or (char=='"' and lineC.count('"')%2==0):
|
|
56
|
+
if l==char:
|
|
57
|
+
l=""
|
|
58
|
+
else:
|
|
59
|
+
l=char
|
|
60
|
+
else:
|
|
61
|
+
if len(l)==0 and i+1<len(lineC) and lineC[i]==" " and lineC[i+1]==" ":
|
|
62
|
+
pass
|
|
63
|
+
else:
|
|
64
|
+
line+=char
|
|
65
|
+
return line
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def list_section(self):
|
|
69
|
+
if hasattr(self,'file'):
|
|
70
|
+
with open(self.file) as f:
|
|
71
|
+
sec_array = []
|
|
72
|
+
for line in f.readlines():
|
|
73
|
+
line = self.indent_line(line.strip())
|
|
74
|
+
if re.match(self.reg,line):
|
|
75
|
+
sec_array.append(line.replace("[","").replace("]",""))
|
|
76
|
+
return sec_array
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def load(self,val=None,section=None):
|
|
80
|
+
lock=False
|
|
81
|
+
ban = False
|
|
82
|
+
data = []
|
|
83
|
+
sec = ''
|
|
84
|
+
dict_data = {}
|
|
85
|
+
|
|
86
|
+
if hasattr(self,'file'):
|
|
87
|
+
if section!=None and section!="" and section not in self.list_section():
|
|
88
|
+
return data
|
|
89
|
+
|
|
90
|
+
with open(self.file) as f:
|
|
91
|
+
for line in f.readlines():
|
|
92
|
+
line = self.indent_line(line.strip())
|
|
93
|
+
if ban==True and line.startswith("[") and line.endswith("]"):
|
|
94
|
+
ban=False
|
|
95
|
+
|
|
96
|
+
if line.startswith(self.escape_line+"[") and line.endswith("]"):
|
|
97
|
+
ban=True
|
|
98
|
+
elif line.startswith(self.escape_line):
|
|
99
|
+
pass
|
|
100
|
+
else:
|
|
101
|
+
if ban==False:
|
|
102
|
+
if section!=None:
|
|
103
|
+
if section!="" and re.match(self.reg,line):
|
|
104
|
+
if lock==False:
|
|
105
|
+
if line=="["+section+"]":
|
|
106
|
+
lock=True
|
|
107
|
+
data = []
|
|
108
|
+
else:
|
|
109
|
+
lock=False
|
|
110
|
+
break
|
|
111
|
+
|
|
112
|
+
else:
|
|
113
|
+
if lock==True:
|
|
114
|
+
if len(line)!=0:
|
|
115
|
+
if val==None:
|
|
116
|
+
data.append(line)
|
|
117
|
+
else:
|
|
118
|
+
line = line.split(self.separator)
|
|
119
|
+
if line[0]==val:
|
|
120
|
+
return self.return_data(line[1])
|
|
121
|
+
elif section=="":
|
|
122
|
+
if len(line)!=0:
|
|
123
|
+
if not line.startswith("[") and not line.endswith("]"):
|
|
124
|
+
if val==None:
|
|
125
|
+
data.append(line)
|
|
126
|
+
else:
|
|
127
|
+
line = line.split(self.separator)
|
|
128
|
+
if line[0]==val:
|
|
129
|
+
return self.return_data(line[1])
|
|
130
|
+
else:
|
|
131
|
+
break
|
|
132
|
+
|
|
133
|
+
elif val!=None:
|
|
134
|
+
if re.match(self.reg,line):
|
|
135
|
+
sec = line.replace("[","").replace("]","")
|
|
136
|
+
|
|
137
|
+
if len(line)!=0:
|
|
138
|
+
line = line.split(self.separator)
|
|
139
|
+
if line[0]==val:
|
|
140
|
+
data.append(sec + self.separator + line[1])
|
|
141
|
+
|
|
142
|
+
else:
|
|
143
|
+
if len(line)!=0:
|
|
144
|
+
if sec not in dict_data.keys():
|
|
145
|
+
dict_data[sec] = {}
|
|
146
|
+
if not re.match(self.reg,line):
|
|
147
|
+
line = line.split(self.separator)
|
|
148
|
+
dict_data[sec][line[0]] = self.return_data(line[1])
|
|
149
|
+
else:
|
|
150
|
+
sec = line.replace("[","").replace("]","")
|
|
151
|
+
|
|
152
|
+
if val==None and section==None:
|
|
153
|
+
return dict_data
|
|
154
|
+
|
|
155
|
+
if len(data)!=0:
|
|
156
|
+
for element in data:
|
|
157
|
+
element=element.split(self.separator)
|
|
158
|
+
dict_data[element[0]] = self.return_data(element[1])
|
|
159
|
+
return dict_data
|
|
160
|
+
|
|
161
|
+
return data
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def edit(self,line,val,key,temp):
|
|
165
|
+
if len(line)!=0:
|
|
166
|
+
if val!=None:
|
|
167
|
+
lineT = line.split(self.separator)
|
|
168
|
+
if lineT[0]==val:
|
|
169
|
+
self.new_content.append(temp.replace(self.separator+lineT[1], self.separator+str(key)))
|
|
170
|
+
return True
|
|
171
|
+
else:
|
|
172
|
+
self.new_content.append(temp)
|
|
173
|
+
return True
|
|
174
|
+
return False
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def change(self,val=None,key=None,section=None):
|
|
178
|
+
if self.read_only==False:
|
|
179
|
+
if val!=None and key!=None:
|
|
180
|
+
if isinstance(key,str) or isinstance(key,list) or isinstance(key,int) or isinstance(key,float) or isinstance(key,bool) or isinstance(key,dict):
|
|
181
|
+
if hasattr(self,'file'):
|
|
182
|
+
with open(self.file) as f:
|
|
183
|
+
self.new_content = []
|
|
184
|
+
lock=False
|
|
185
|
+
|
|
186
|
+
for line in f.readlines():
|
|
187
|
+
temp = line.rstrip()
|
|
188
|
+
line = self.indent_line(line.strip())
|
|
189
|
+
if len(line)!=0:
|
|
190
|
+
if section!=None:
|
|
191
|
+
if section!="" and re.match(self.reg,line):
|
|
192
|
+
if lock==False:
|
|
193
|
+
if line=="["+section+"]":
|
|
194
|
+
lock=True
|
|
195
|
+
else:
|
|
196
|
+
lock=False
|
|
197
|
+
|
|
198
|
+
else:
|
|
199
|
+
if lock==True:
|
|
200
|
+
if self.edit(line,val,key,temp):
|
|
201
|
+
continue
|
|
202
|
+
else:
|
|
203
|
+
if self.edit(line,val,key,temp):
|
|
204
|
+
continue
|
|
205
|
+
|
|
206
|
+
self.new_content.append(temp)
|
|
207
|
+
else:
|
|
208
|
+
self.new_content.append(temp)
|
|
209
|
+
|
|
210
|
+
with open(self.file,"w") as f:
|
|
211
|
+
f.write("\n".join(self.new_content))
|
|
212
|
+
else:
|
|
213
|
+
print("Read-only mode")
|
|
214
|
+
|
|
215
|
+
|
|
216
|
+
def add(self,val=None,key=None,section=None):
|
|
217
|
+
if self.read_only==False:
|
|
218
|
+
exist = True
|
|
219
|
+
new_content=None
|
|
220
|
+
lock=False
|
|
221
|
+
|
|
222
|
+
if hasattr(self,'file'):
|
|
223
|
+
if section!=None and section!="" and section not in self.list_section():
|
|
224
|
+
exist = False
|
|
225
|
+
|
|
226
|
+
if val!=None and val!="" and key!=None and not (isinstance(key,str) or isinstance(key,list) or isinstance(key,int) or isinstance(key,float) or isinstance(key,bool) or isinstance(key,dict)):
|
|
227
|
+
print("Key not supported")
|
|
228
|
+
return
|
|
229
|
+
|
|
230
|
+
with open(self.file) as f:
|
|
231
|
+
if exist==False:
|
|
232
|
+
new_content=f.read()
|
|
233
|
+
if new_content[len(new_content)-1]=="\n":
|
|
234
|
+
new_content+="\n["+section+"]"
|
|
235
|
+
else:
|
|
236
|
+
new_content+="\n\n["+section+"]"
|
|
237
|
+
if val!=None and val!="" and key!=None:
|
|
238
|
+
new_content+="\n"+val+self.separator+str(key)
|
|
239
|
+
|
|
240
|
+
else:
|
|
241
|
+
data = c.load()
|
|
242
|
+
if section!=None:
|
|
243
|
+
se_test = section
|
|
244
|
+
else:
|
|
245
|
+
se_test = ""
|
|
246
|
+
|
|
247
|
+
if val!=None:
|
|
248
|
+
se = data[se_test]
|
|
249
|
+
if val in se.keys():
|
|
250
|
+
print("Key already exist")
|
|
251
|
+
return
|
|
252
|
+
|
|
253
|
+
if val!=None and val!="" and key!=None:
|
|
254
|
+
if section=="" or section==None:
|
|
255
|
+
new_content=val+self.separator+str(key)+"\n"
|
|
256
|
+
new_content+=f.read()
|
|
257
|
+
else:
|
|
258
|
+
new_content = []
|
|
259
|
+
for line in f.readlines():
|
|
260
|
+
line_temp = line.rstrip()
|
|
261
|
+
line = self.indent_line(line.strip())
|
|
262
|
+
if line_temp!="":
|
|
263
|
+
if section!=None:
|
|
264
|
+
if section!="" and re.match(self.reg,line):
|
|
265
|
+
if lock==False:
|
|
266
|
+
if line=="["+section+"]":
|
|
267
|
+
if len(se.keys())==0:
|
|
268
|
+
line_temp+="\n"+val+self.separator+str(key)
|
|
269
|
+
lock=True
|
|
270
|
+
else:
|
|
271
|
+
lock=False
|
|
272
|
+
|
|
273
|
+
else:
|
|
274
|
+
if lock==True:
|
|
275
|
+
if "\t" in line_temp:
|
|
276
|
+
line_temp+="\n"+("\t"*line_temp.count('\t'))+val+self.separator+str(key)
|
|
277
|
+
lock=False
|
|
278
|
+
|
|
279
|
+
new_content.append(line_temp)
|
|
280
|
+
|
|
281
|
+
new_content = "\n".join(new_content)
|
|
282
|
+
|
|
283
|
+
if new_content!=None:
|
|
284
|
+
with open(self.file,'w') as f:
|
|
285
|
+
f.write(new_content)
|
|
286
|
+
else:
|
|
287
|
+
print("Read-only mode")
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
def delete(self,val=None,section=None):
|
|
291
|
+
if self.read_only==False:
|
|
292
|
+
if hasattr(self,'file'):
|
|
293
|
+
with open(self.file) as f:
|
|
294
|
+
lock=False
|
|
295
|
+
new_content=""
|
|
296
|
+
sec = ""
|
|
297
|
+
ban=False
|
|
298
|
+
|
|
299
|
+
for line in f.readlines():
|
|
300
|
+
lineT = line
|
|
301
|
+
line = self.indent_line(line.strip())
|
|
302
|
+
|
|
303
|
+
if line.startswith("[") and line.endswith("]"):
|
|
304
|
+
ban=False
|
|
305
|
+
sec = line.replace("[","").replace("]","")
|
|
306
|
+
|
|
307
|
+
elif line.startswith(self.escape_line+"[") and line.endswith("]"):
|
|
308
|
+
ban=True
|
|
309
|
+
sec = line.replace(self.escape_line+"[","").replace("]","")
|
|
310
|
+
|
|
311
|
+
if ban!=True:
|
|
312
|
+
if section!=None and section!="":
|
|
313
|
+
if section!="" and re.match(self.reg,line):
|
|
314
|
+
if lock==False:
|
|
315
|
+
if line=="["+section+"]":
|
|
316
|
+
lock=True
|
|
317
|
+
if val!=None:
|
|
318
|
+
new_content+=lineT
|
|
319
|
+
else:
|
|
320
|
+
new_content+=lineT
|
|
321
|
+
else:
|
|
322
|
+
new_content+=lineT
|
|
323
|
+
lock=False
|
|
324
|
+
else:
|
|
325
|
+
if lock==True:
|
|
326
|
+
if val==None:
|
|
327
|
+
pass
|
|
328
|
+
else:
|
|
329
|
+
line = line.split(self.separator)
|
|
330
|
+
if line[0]==val:
|
|
331
|
+
pass
|
|
332
|
+
else:
|
|
333
|
+
new_content+=lineT
|
|
334
|
+
else:
|
|
335
|
+
new_content+=lineT
|
|
336
|
+
else:
|
|
337
|
+
if val!=None and sec=="":
|
|
338
|
+
line = line.split(self.separator)
|
|
339
|
+
if line[0]==val:
|
|
340
|
+
pass
|
|
341
|
+
else:
|
|
342
|
+
new_content+=lineT
|
|
343
|
+
else:
|
|
344
|
+
new_content+=lineT
|
|
345
|
+
else:
|
|
346
|
+
new_content+=lineT
|
|
347
|
+
|
|
348
|
+
if new_content!="":
|
|
349
|
+
with open(self.file,'w') as f:
|
|
350
|
+
f.write(new_content)
|
|
351
|
+
else:
|
|
352
|
+
print("Read-only mode")
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
def disabled_line(self, section=None):
|
|
356
|
+
dict_data = {}
|
|
357
|
+
|
|
358
|
+
if hasattr(self,'file'):
|
|
359
|
+
with open(self.file) as f:
|
|
360
|
+
ban=False
|
|
361
|
+
sec = ""
|
|
362
|
+
|
|
363
|
+
for line in f.readlines():
|
|
364
|
+
line = self.indent_line(line.strip())
|
|
365
|
+
if len(line)!=0:
|
|
366
|
+
if line.startswith("[") and line.endswith("]"):
|
|
367
|
+
sec = line.replace("[","").replace("]","")
|
|
368
|
+
if ban==True:
|
|
369
|
+
ban=False
|
|
370
|
+
|
|
371
|
+
if line.startswith(self.escape_line+"[") and line.endswith("]"):
|
|
372
|
+
ban=True
|
|
373
|
+
sec = line.replace(self.escape_line+"[","").replace("]","")
|
|
374
|
+
|
|
375
|
+
elif line.startswith(self.escape_line):
|
|
376
|
+
line = line[1:len(line)].split(self.separator)
|
|
377
|
+
if sec not in dict_data.keys():
|
|
378
|
+
dict_data[sec] = {}
|
|
379
|
+
dict_data[sec][line[0]] = self.return_data(line[1])
|
|
380
|
+
|
|
381
|
+
else:
|
|
382
|
+
if ban==True:
|
|
383
|
+
line = line.split(self.separator)
|
|
384
|
+
if sec not in dict_data.keys():
|
|
385
|
+
dict_data[sec] = {}
|
|
386
|
+
dict_data[sec][line[0]] = self.return_data(line[1])
|
|
387
|
+
return dict_data
|
|
388
|
+
|
|
389
|
+
|
|
390
|
+
#c = Config("conf.dat",auto_create=True)
|
|
391
|
+
c = Config("conf.dat",read_only=True)
|
|
392
|
+
#c.add(val="test4",key=5,section="f_section")
|
|
393
|
+
#d = c.list_section()
|
|
394
|
+
#print(d)
|
|
395
|
+
#d = c.load(val="conf",section="second_section")
|
|
396
|
+
#print(d)
|
|
397
|
+
#d = c.load(section='section')
|
|
398
|
+
#print(d)
|
|
399
|
+
#c.change(val="conf",key="NULL",section="second_section")
|
|
400
|
+
|
|
401
|
+
#d = c.load(section='second_section',val='conf')
|
|
402
|
+
#print(d)
|
|
403
|
+
#d = c.disabled_line()
|
|
404
|
+
#print(d)
|
|
405
|
+
#c.delete(section="f_section")
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
'''
|
|
409
|
+
list_section(self)
|
|
410
|
+
load(self,val=None,section=None)
|
|
411
|
+
change(self,val=None,key=None,section=None)
|
|
412
|
+
add(self,val=None,key=None,section=None)
|
|
413
|
+
delete(self,val=None,section=None)
|
|
414
|
+
disabled_line(self, section=None)
|
|
415
|
+
'''
|
|
416
|
+
|
|
417
|
+
#read-only
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: zpp-config
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Module pour le chargement et la modification de fichier de configuration
|
|
5
|
+
Home-page: https://github.com/ZephyrOff/py-zpp_config
|
|
6
|
+
Author: ZephyrOff
|
|
7
|
+
Author-email: contact@apajak.fr
|
|
8
|
+
License: MIT
|
|
9
|
+
Description: # zpp-config
|
|
10
|
+
## Informations
|
|
11
|
+
Librairie pour l'utilisation et la modification de fichier de configuration:<br>
|
|
12
|
+
- Charger un ou plusieurs paramètres
|
|
13
|
+
- Modifier un paramètre existant
|
|
14
|
+
- Ajout un paramètre ou une section
|
|
15
|
+
- Supprimer un paramètre ou une section
|
|
16
|
+
- Lister les sections disponibles
|
|
17
|
+
- Lister les paramètres et/ou sections désactivés
|
|
18
|
+
|
|
19
|
+
Prends en compte les paramètres commentés.<br>
|
|
20
|
+
Compatible avec les fichiers de configuration indentés.<br><br>
|
|
21
|
+
Traduit les paramètres pour les types str, int, float, bool, list, dict
|
|
22
|
+
|
|
23
|
+
### Prérequis
|
|
24
|
+
- Python 3
|
|
25
|
+
<br>
|
|
26
|
+
|
|
27
|
+
# Installation
|
|
28
|
+
```console
|
|
29
|
+
pip install zpp_config
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
# Utilisation
|
|
33
|
+
### Conseil d'importation du module
|
|
34
|
+
```python
|
|
35
|
+
from zpp_config import Config
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
<br>
|
|
39
|
+
|
|
40
|
+
### Exemple de fichier de config
|
|
41
|
+
```xml
|
|
42
|
+
[section]
|
|
43
|
+
value1 = key1
|
|
44
|
+
value2 = key2
|
|
45
|
+
value3 = key3
|
|
46
|
+
|
|
47
|
+
[section2]
|
|
48
|
+
value1 = key1
|
|
49
|
+
value2 = key2
|
|
50
|
+
value3 = key3
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
<br>
|
|
54
|
+
|
|
55
|
+
### Initialisaton d'un fichier de configuration
|
|
56
|
+
```python
|
|
57
|
+
c = Config("conf.ini")
|
|
58
|
+
```
|
|
59
|
+
>En paramètre supplémentaire, nous pouvons mettre:<br/>
|
|
60
|
+
>- separator: Définir le séparateur entre la clé et la valeur dans le fichier. (Par défaut: " = ")
|
|
61
|
+
>- escape_line: Définir le caractère utilisé pour commenter une valeur ou une section. (Par défaut: "#")
|
|
62
|
+
>- auto_create: Créer le fichier de configuration s'il n'existe pas. (Par défaut: "False")
|
|
63
|
+
>- read_only: Ouvrir le fichier de configuration en lecture seule. (Par défaut: "False")
|
|
64
|
+
|
|
65
|
+
<br>
|
|
66
|
+
|
|
67
|
+
### Chargement de paramètre
|
|
68
|
+
|
|
69
|
+
La fonction renvoie la valeur si un unique paramètre a été trouvé, sinon renvoie un dictionnaire avec les différentes valeurs trouvées (classé par section)
|
|
70
|
+
Renvoie un tableau vide si aucun paramètre n'a été trouvé
|
|
71
|
+
|
|
72
|
+
#### Chargement de tous les paramètres
|
|
73
|
+
```python
|
|
74
|
+
data = c.load()
|
|
75
|
+
```
|
|
76
|
+
#### Chargement d'une section du fichier
|
|
77
|
+
```python
|
|
78
|
+
data = c.load(section='section_name')
|
|
79
|
+
```
|
|
80
|
+
#### Chargement d'une valeur dans tout le fichier
|
|
81
|
+
```python
|
|
82
|
+
data = c.load(val='value_name')
|
|
83
|
+
```
|
|
84
|
+
#### Chargement d'une valeur dans une section spécifique
|
|
85
|
+
```python
|
|
86
|
+
data = c.load(val='value_name', section='section_name')
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
<br>
|
|
90
|
+
|
|
91
|
+
### Changement de paramètre
|
|
92
|
+
#### Changement d'une valeur dans tout le fichier
|
|
93
|
+
```python
|
|
94
|
+
c.change(val='value_name', key='key_value')
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
#### Changement d'une valeur dans une section spécifique
|
|
98
|
+
```python
|
|
99
|
+
c.change(val='value_name', key='key_value', section='section_name')
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
<br>
|
|
103
|
+
|
|
104
|
+
### Ajout de paramètre ou de section
|
|
105
|
+
|
|
106
|
+
Ajoute une section ou un paramètre dans le fichier de configuration.
|
|
107
|
+
Dans le cas de l'ajout d'un paramètre, rajoute la section si elle n'existe pas.
|
|
108
|
+
|
|
109
|
+
#### Ajout d'une section
|
|
110
|
+
```python
|
|
111
|
+
c.add(section='section_name')
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
#### Ajout d'un paramètre dans une section
|
|
115
|
+
```python
|
|
116
|
+
c.add(val='value_name', key='key_value', section='section_name')
|
|
117
|
+
```
|
|
118
|
+
> Si aucune section est défini, rajoute le paramètre en dehors des sections.
|
|
119
|
+
|
|
120
|
+
<br>
|
|
121
|
+
|
|
122
|
+
### Suppression de paramètre ou de section
|
|
123
|
+
|
|
124
|
+
#### Suppression d'une section
|
|
125
|
+
```python
|
|
126
|
+
c.delete(section='section_name')
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
#### Suppression d'un paramètre dans une section
|
|
130
|
+
```python
|
|
131
|
+
c.delete(val='value_name', section='section_name')
|
|
132
|
+
```
|
|
133
|
+
> Si aucune section est défini, recherche le paramètre en dehors des sections.
|
|
134
|
+
|
|
135
|
+
<br>
|
|
136
|
+
|
|
137
|
+
### Liste des paramètres non pris en compte
|
|
138
|
+
|
|
139
|
+
Retourne la liste des paramètres qui sont non pris en compte dans le fichier de configuration.
|
|
140
|
+
|
|
141
|
+
```python
|
|
142
|
+
data = c.disabled_line()
|
|
143
|
+
```
|
|
144
|
+
> Possibilité de préciser la section en utilisant le paramètre section
|
|
145
|
+
|
|
146
|
+
<br>
|
|
147
|
+
|
|
148
|
+
### Liste les sections disponibles
|
|
149
|
+
```python
|
|
150
|
+
data = c.list_section()
|
|
151
|
+
```
|
|
152
|
+
Keywords: config file terminal zephyroff
|
|
153
|
+
Platform: ALL
|
|
154
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
155
|
+
Classifier: Environment :: Console
|
|
156
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
157
|
+
Classifier: Programming Language :: Python :: 3
|
|
158
|
+
Description-Content-Type: text/markdown
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
zpp_config
|