pygazpar 0.1.21__py3-none-any.whl → 1.3.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.
- pygazpar/__init__.py +10 -3
- pygazpar/__main__.py +89 -58
- pygazpar/api_client.py +228 -0
- pygazpar/client.py +98 -210
- pygazpar/datasource.py +590 -0
- pygazpar/enum.py +31 -8
- pygazpar/excelparser.py +138 -0
- pygazpar/jsonparser.py +53 -0
- pygazpar/resources/daily_data_sample.json +7802 -0
- pygazpar/resources/hourly_data_sample.json +1 -0
- pygazpar/resources/monthly_data_sample.json +146 -0
- pygazpar/resources/weekly_data_sample.json +614 -0
- pygazpar/resources/yearly_data_sample.json +18 -0
- pygazpar/version.py +3 -0
- pygazpar-0.1.21.dist-info/LICENSE.txt → pygazpar-1.3.0.dist-info/LICENSE +21 -21
- pygazpar-1.3.0.dist-info/METADATA +225 -0
- pygazpar-1.3.0.dist-info/RECORD +18 -0
- {pygazpar-0.1.21.dist-info → pygazpar-1.3.0.dist-info}/WHEEL +1 -2
- pygazpar/webdriverwrapper.py +0 -125
- pygazpar/webelementwrapper.py +0 -40
- pygazpar-0.1.21.dist-info/METADATA +0 -149
- pygazpar-0.1.21.dist-info/RECORD +0 -14
- pygazpar-0.1.21.dist-info/entry_points.txt +0 -3
- pygazpar-0.1.21.dist-info/top_level.txt +0 -2
- test/__init__.py +0 -1
- test/test_client.py +0 -50
pygazpar/excelparser.py
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
import logging
|
2
|
+
from datetime import datetime
|
3
|
+
from typing import Any
|
4
|
+
|
5
|
+
from openpyxl import load_workbook
|
6
|
+
from openpyxl.cell.cell import Cell
|
7
|
+
from openpyxl.worksheet.worksheet import Worksheet
|
8
|
+
|
9
|
+
from pygazpar.enum import Frequency, PropertyName
|
10
|
+
|
11
|
+
FIRST_DATA_LINE_NUMBER = 10
|
12
|
+
|
13
|
+
Logger = logging.getLogger(__name__)
|
14
|
+
|
15
|
+
|
16
|
+
# ------------------------------------------------------------------------------------------------------------
|
17
|
+
class ExcelParser: # pylint: disable=too-few-public-methods
|
18
|
+
|
19
|
+
# ------------------------------------------------------
|
20
|
+
@staticmethod
|
21
|
+
def parse(dataFilename: str, dataReadingFrequency: Frequency) -> list[dict[str, Any]]:
|
22
|
+
|
23
|
+
parseByFrequency = {
|
24
|
+
Frequency.HOURLY: ExcelParser.__parseHourly,
|
25
|
+
Frequency.DAILY: ExcelParser.__parseDaily,
|
26
|
+
Frequency.WEEKLY: ExcelParser.__parseWeekly,
|
27
|
+
Frequency.MONTHLY: ExcelParser.__parseMonthly,
|
28
|
+
}
|
29
|
+
|
30
|
+
Logger.debug(f"Loading Excel data file '{dataFilename}'...")
|
31
|
+
|
32
|
+
workbook = load_workbook(filename=dataFilename)
|
33
|
+
|
34
|
+
worksheet = workbook.active
|
35
|
+
|
36
|
+
res = parseByFrequency[dataReadingFrequency](worksheet) # type: ignore
|
37
|
+
|
38
|
+
workbook.close()
|
39
|
+
|
40
|
+
Logger.debug("Processed Excel %s data: %s", dataReadingFrequency, res)
|
41
|
+
|
42
|
+
return res
|
43
|
+
|
44
|
+
# ------------------------------------------------------
|
45
|
+
@staticmethod
|
46
|
+
def __fillRow(row: dict, propertyName: str, cell: Cell, isNumber: bool):
|
47
|
+
|
48
|
+
if cell.value is not None:
|
49
|
+
if isNumber:
|
50
|
+
if type(cell.value) is str:
|
51
|
+
if len(cell.value.strip()) > 0:
|
52
|
+
row[propertyName] = float(cell.value.replace(",", "."))
|
53
|
+
else:
|
54
|
+
row[propertyName] = cell.value
|
55
|
+
else:
|
56
|
+
row[propertyName] = cell.value.strip() if type(cell.value) is str else cell.value
|
57
|
+
|
58
|
+
# ------------------------------------------------------
|
59
|
+
@staticmethod
|
60
|
+
def __parseHourly(worksheet: Worksheet) -> list[dict[str, Any]]: # pylint: disable=unused-argument
|
61
|
+
return []
|
62
|
+
|
63
|
+
# ------------------------------------------------------
|
64
|
+
@staticmethod
|
65
|
+
def __parseDaily(worksheet: Worksheet) -> list[dict[str, Any]]:
|
66
|
+
|
67
|
+
res = []
|
68
|
+
|
69
|
+
# Timestamp of the data.
|
70
|
+
data_timestamp = datetime.now().isoformat()
|
71
|
+
|
72
|
+
minRowNum = FIRST_DATA_LINE_NUMBER
|
73
|
+
maxRowNum = len(worksheet["B"])
|
74
|
+
for rownum in range(minRowNum, maxRowNum + 1):
|
75
|
+
row = dict[str, Any]()
|
76
|
+
if worksheet.cell(column=2, row=rownum).value is not None:
|
77
|
+
ExcelParser.__fillRow(row, PropertyName.TIME_PERIOD.value, worksheet.cell(column=2, row=rownum), False) # type: ignore
|
78
|
+
ExcelParser.__fillRow(row, PropertyName.START_INDEX.value, worksheet.cell(column=3, row=rownum), True) # type: ignore
|
79
|
+
ExcelParser.__fillRow(row, PropertyName.END_INDEX.value, worksheet.cell(column=4, row=rownum), True) # type: ignore
|
80
|
+
ExcelParser.__fillRow(row, PropertyName.VOLUME.value, worksheet.cell(column=5, row=rownum), True) # type: ignore
|
81
|
+
ExcelParser.__fillRow(row, PropertyName.ENERGY.value, worksheet.cell(column=6, row=rownum), True) # type: ignore
|
82
|
+
ExcelParser.__fillRow(row, PropertyName.CONVERTER_FACTOR.value, worksheet.cell(column=7, row=rownum), True) # type: ignore
|
83
|
+
ExcelParser.__fillRow(row, PropertyName.TEMPERATURE.value, worksheet.cell(column=8, row=rownum), True) # type: ignore
|
84
|
+
ExcelParser.__fillRow(row, PropertyName.TYPE.value, worksheet.cell(column=9, row=rownum), False) # type: ignore
|
85
|
+
row[PropertyName.TIMESTAMP.value] = data_timestamp
|
86
|
+
res.append(row)
|
87
|
+
|
88
|
+
Logger.debug(f"Daily data read successfully between row #{minRowNum} and row #{maxRowNum}")
|
89
|
+
|
90
|
+
return res
|
91
|
+
|
92
|
+
# ------------------------------------------------------
|
93
|
+
@staticmethod
|
94
|
+
def __parseWeekly(worksheet: Worksheet) -> list[dict[str, Any]]:
|
95
|
+
|
96
|
+
res = []
|
97
|
+
|
98
|
+
# Timestamp of the data.
|
99
|
+
data_timestamp = datetime.now().isoformat()
|
100
|
+
|
101
|
+
minRowNum = FIRST_DATA_LINE_NUMBER
|
102
|
+
maxRowNum = len(worksheet["B"])
|
103
|
+
for rownum in range(minRowNum, maxRowNum + 1):
|
104
|
+
row = dict[str, Any]()
|
105
|
+
if worksheet.cell(column=2, row=rownum).value is not None:
|
106
|
+
ExcelParser.__fillRow(row, PropertyName.TIME_PERIOD.value, worksheet.cell(column=2, row=rownum), False) # type: ignore
|
107
|
+
ExcelParser.__fillRow(row, PropertyName.VOLUME.value, worksheet.cell(column=3, row=rownum), True) # type: ignore
|
108
|
+
ExcelParser.__fillRow(row, PropertyName.ENERGY.value, worksheet.cell(column=4, row=rownum), True) # type: ignore
|
109
|
+
row[PropertyName.TIMESTAMP.value] = data_timestamp
|
110
|
+
res.append(row)
|
111
|
+
|
112
|
+
Logger.debug(f"Weekly data read successfully between row #{minRowNum} and row #{maxRowNum}")
|
113
|
+
|
114
|
+
return res
|
115
|
+
|
116
|
+
# ------------------------------------------------------
|
117
|
+
@staticmethod
|
118
|
+
def __parseMonthly(worksheet: Worksheet) -> list[dict[str, Any]]:
|
119
|
+
|
120
|
+
res = []
|
121
|
+
|
122
|
+
# Timestamp of the data.
|
123
|
+
data_timestamp = datetime.now().isoformat()
|
124
|
+
|
125
|
+
minRowNum = FIRST_DATA_LINE_NUMBER
|
126
|
+
maxRowNum = len(worksheet["B"])
|
127
|
+
for rownum in range(minRowNum, maxRowNum + 1):
|
128
|
+
row = dict[str, Any]()
|
129
|
+
if worksheet.cell(column=2, row=rownum).value is not None:
|
130
|
+
ExcelParser.__fillRow(row, PropertyName.TIME_PERIOD.value, worksheet.cell(column=2, row=rownum), False) # type: ignore
|
131
|
+
ExcelParser.__fillRow(row, PropertyName.VOLUME.value, worksheet.cell(column=3, row=rownum), True) # type: ignore
|
132
|
+
ExcelParser.__fillRow(row, PropertyName.ENERGY.value, worksheet.cell(column=4, row=rownum), True) # type: ignore
|
133
|
+
row[PropertyName.TIMESTAMP.value] = data_timestamp
|
134
|
+
res.append(row)
|
135
|
+
|
136
|
+
Logger.debug(f"Monthly data read successfully between row #{minRowNum} and row #{maxRowNum}")
|
137
|
+
|
138
|
+
return res
|
pygazpar/jsonparser.py
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
import json
|
2
|
+
import logging
|
3
|
+
from datetime import datetime
|
4
|
+
from typing import Any
|
5
|
+
|
6
|
+
from pygazpar.enum import PropertyName
|
7
|
+
|
8
|
+
INPUT_DATE_FORMAT = "%Y-%m-%d"
|
9
|
+
|
10
|
+
OUTPUT_DATE_FORMAT = "%d/%m/%Y"
|
11
|
+
|
12
|
+
Logger = logging.getLogger(__name__)
|
13
|
+
|
14
|
+
|
15
|
+
# ------------------------------------------------------------------------------------------------------------
|
16
|
+
class JsonParser: # pylint: disable=too-few-public-methods
|
17
|
+
|
18
|
+
# ------------------------------------------------------
|
19
|
+
@staticmethod
|
20
|
+
def parse(jsonStr: str, temperaturesStr: str, pceIdentifier: str) -> list[dict[str, Any]]:
|
21
|
+
|
22
|
+
res = []
|
23
|
+
|
24
|
+
data = json.loads(jsonStr)
|
25
|
+
|
26
|
+
temperatures = json.loads(temperaturesStr)
|
27
|
+
|
28
|
+
# Timestamp of the data.
|
29
|
+
data_timestamp = datetime.now().isoformat()
|
30
|
+
|
31
|
+
for releve in data[pceIdentifier]["releves"]:
|
32
|
+
temperature = releve["temperature"]
|
33
|
+
if temperature is None and temperatures is not None and len(temperatures) > 0:
|
34
|
+
temperature = temperatures.get(releve["journeeGaziere"])
|
35
|
+
|
36
|
+
item = {}
|
37
|
+
item[PropertyName.TIME_PERIOD.value] = datetime.strftime(
|
38
|
+
datetime.strptime(releve["journeeGaziere"], INPUT_DATE_FORMAT), OUTPUT_DATE_FORMAT
|
39
|
+
)
|
40
|
+
item[PropertyName.START_INDEX.value] = releve["indexDebut"]
|
41
|
+
item[PropertyName.END_INDEX.value] = releve["indexFin"]
|
42
|
+
item[PropertyName.VOLUME.value] = releve["volumeBrutConsomme"]
|
43
|
+
item[PropertyName.ENERGY.value] = releve["energieConsomme"]
|
44
|
+
item[PropertyName.CONVERTER_FACTOR.value] = releve["coeffConversion"]
|
45
|
+
item[PropertyName.TEMPERATURE.value] = temperature
|
46
|
+
item[PropertyName.TYPE.value] = releve["qualificationReleve"]
|
47
|
+
item[PropertyName.TIMESTAMP.value] = data_timestamp
|
48
|
+
|
49
|
+
res.append(item)
|
50
|
+
|
51
|
+
Logger.debug("Daily data read successfully from Json")
|
52
|
+
|
53
|
+
return res
|