Hydro-Quebec-API-Wrapper 4.2.0__py3-none-any.whl → 4.2.2__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Hydro-Quebec-API-Wrapper
3
- Version: 4.2.0
3
+ Version: 4.2.2
4
4
  Summary: A wrapper library to access hydro quebec API and more
5
5
  Home-page: https://hydroqc.ca
6
6
  Author-email: Hydroqc Team <info@hydroqc.ca>
@@ -1,4 +1,4 @@
1
- hydro_quebec_api_wrapper-4.2.0.dist-info/licenses/LICENSE,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
1
+ hydro_quebec_api_wrapper-4.2.2.dist-info/licenses/LICENSE,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
2
2
  hydroqc/__init__.py,sha256=sFhCh7-LWoISCQuAtdrLQOmj2x5wjHBGbAAPg4SN6Pc,40
3
3
  hydroqc/account.py,sha256=84PO2npB_VG8cEzGIbmXj9sD1whG8qynkiGd-yEYddM,3375
4
4
  hydroqc/consts.py,sha256=a9dWq5i6t5VedYosUbP8zIuG2q5TPw4ruT0jOaC8Yo8,209
@@ -15,7 +15,7 @@ hydroqc/contract/__init__.py,sha256=uqxjOgyhpKFd-n_umxdaW5FB_DkJJaettWnEFC0nRYc,
15
15
  hydroqc/contract/common.py,sha256=xVw9z_Yjqp95SGCPNAfJVABvgp_C-KM51VTBEU9wjeM,15705
16
16
  hydroqc/contract/contract_d.py,sha256=6jPYTCjFq8zonfbXPrEujDVz58n5RUEuq54VCGqph6o,856
17
17
  hydroqc/contract/contract_d_cpc.py,sha256=-Y2S4MkzAfsbf_L2jCKfU7OD-nbzgoEpyT3SWh0U0tQ,1418
18
- hydroqc/contract/contract_dpc.py,sha256=EF60N9Xl5K4XXPHAV6KtTK5SYVtQD8pKUzn_wATjKXg,7165
18
+ hydroqc/contract/contract_dpc.py,sha256=JNWZqpALuw1kNQhZXN4ql8KiEU3OeJteHLU4d489pdA,7579
19
19
  hydroqc/contract/contract_dt.py,sha256=TSKf2oh-MlG8A42xVUCCyf7oezlWTFoyATF9xlQn2JE,1687
20
20
  hydroqc/contract/contract_m.py,sha256=2hSSb9Tw2eZu7PV1XicfTFKLCRiffq72NfOYiVz8QMk,2108
21
21
  hydroqc/contract/contract_m_gdp.py,sha256=y8seZHmjkkul0TZ5Epxuxc4g0JVbs9o8KjL_y1gIldU,801
@@ -40,14 +40,14 @@ hydroqc/peak/dpc/peak.py,sha256=clb1j6LaBndPo0qPlOxumGuUGYB4-_ob_s8UQa-m49o,1313
40
40
  hydroqc/types/__init__.py,sha256=INBHElvUfZTZV3w9ywyLa-d7GfpXy096FApAGkKOYwI,1502
41
41
  hydroqc/types/account.py,sha256=yXwqjU3lBG7cGt8RF0cyvNSxtBCaIoWgmtvsLisvQTY,3696
42
42
  hydroqc/types/common.py,sha256=s1DA48svkJGsNaNUVcpEhoYLjiUOpfQI8WQ5xN6Yfco,1365
43
- hydroqc/types/consump.py,sha256=uCQ5ZHs_Qts5iLe9Q14tDZKby4iTxBd1QewUMkr3B8I,5594
43
+ hydroqc/types/consump.py,sha256=iNZ-Fyb4_ciWjLtYIosK4XRksMxArGxaMFuayFKhyRo,5753
44
44
  hydroqc/types/contract.py,sha256=OTi8c5CEces3vwwQLbPzo1jB7sgwOweS1imFPnJMML0,1657
45
45
  hydroqc/types/cpc.py,sha256=ghmtBTT1FKuqVodJJ0kCtUbYNTLCOrngxgcrzjJYvok,2116
46
- hydroqc/types/dpc.py,sha256=OgJr7xbJZ1N2qPOY8JvNfruI7zqxnL47nJE2D7cb50s,1822
47
- hydroqc/types/dt.py,sha256=8Ypeo3JP9uaoJ_PUZJiPOJ8L0fkGXmEUU5tqoeV1fMY,564
46
+ hydroqc/types/dpc.py,sha256=mwA5T9fGcNTA-kb_f25wq2ALJCwa5lKABOS73L6znY0,1981
47
+ hydroqc/types/dt.py,sha256=rEXDgNewhlOsRbso0Shlq69TvJFoT56EGYOAjTFZU80,693
48
48
  hydroqc/types/outage.py,sha256=XTsNyu8mmxUx44XWvOOUHKSoijp-lgbXwQroiqm9S0o,3932
49
- hydro_quebec_api_wrapper-4.2.0.dist-info/METADATA,sha256=33dDyFhsA5rjlC1e26nGMkNb4YMaVTGcLGWMkW0MQD0,7948
50
- hydro_quebec_api_wrapper-4.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
51
- hydro_quebec_api_wrapper-4.2.0.dist-info/entry_points.txt,sha256=G2YKkCH9rFt2dXbFyHINBp4bmqY2HTEIaf7F1CwbC_k,57
52
- hydro_quebec_api_wrapper-4.2.0.dist-info/top_level.txt,sha256=YAcYLnu5YYkbxt1psUoBfo_opl-lAZKq0A7B3IN_P6M,8
53
- hydro_quebec_api_wrapper-4.2.0.dist-info/RECORD,,
49
+ hydro_quebec_api_wrapper-4.2.2.dist-info/METADATA,sha256=pHB876NvBQYDH2R0wTvKQmTaMeyTTLmR5RLjm4InHRQ,7948
50
+ hydro_quebec_api_wrapper-4.2.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
51
+ hydro_quebec_api_wrapper-4.2.2.dist-info/entry_points.txt,sha256=G2YKkCH9rFt2dXbFyHINBp4bmqY2HTEIaf7F1CwbC_k,57
52
+ hydro_quebec_api_wrapper-4.2.2.dist-info/top_level.txt,sha256=YAcYLnu5YYkbxt1psUoBfo_opl-lAZKq0A7B3IN_P6M,8
53
+ hydro_quebec_api_wrapper-4.2.2.dist-info/RECORD,,
@@ -19,11 +19,13 @@ class WinterState(str, Enum):
19
19
 
20
20
 
21
21
  def check_dpc_data_present(
22
- method: Callable[..., None | str | bool | float | date],
23
- ) -> Callable[..., None | str | bool | float | date]:
22
+ method: Callable[..., None | str | bool | float | int | date | WinterState],
23
+ ) -> Callable[..., None | str | bool | float | int | date | WinterState]:
24
24
  """Check if contractDPC's data are present."""
25
25
 
26
- def wrapper(contract: "ContractDPC") -> None | str | bool | float | date:
26
+ def wrapper(
27
+ contract: "ContractDPC",
28
+ ) -> None | str | bool | float | int | date | WinterState:
27
29
  if not hasattr(contract, "_dpc_data"):
28
30
  contract._logger.warning("You need to call get_dpc_data method first")
29
31
  return None
@@ -109,11 +111,17 @@ class ContractDPC(ContractResidential):
109
111
  return self._dpc_data
110
112
 
111
113
  def _get_dpc_field(self, field_name: str) -> str | float | int:
112
- """Get DPC field from periodesHiver data."""
114
+ """Get DPC field from periodesHiver data.
115
+
116
+ Raises:
117
+ KeyError: If the required field is not present in the API response.
118
+ """
113
119
  winter_period = self._dpc_data["periodesHiver"][0]
114
- if field_name in winter_period:
115
- return winter_period[field_name] # type: ignore
116
- raise KeyError(f"Field {field_name} not found in DPC data")
120
+ if field_name not in winter_period:
121
+ raise KeyError(
122
+ f"Required field '{field_name}' not found in DPC periodesHiver data"
123
+ )
124
+ return winter_period[field_name] # type: ignore
117
125
 
118
126
  @property
119
127
  @check_period_data_present
@@ -160,9 +168,15 @@ class ContractDPC(ContractResidential):
160
168
 
161
169
  @property
162
170
  @check_dpc_data_present
163
- def amount_saved_vs_base_rate(self) -> float:
164
- """Amount saved or not versus the base rate."""
165
- return float(self._get_dpc_field("montantEconPerteVSTarifBase"))
171
+ def amount_saved_vs_base_rate(self) -> float | None:
172
+ """Amount saved or not versus the base rate.
173
+
174
+ Returns None if comparison data is not yet available (e.g., first year on Flex D).
175
+ """
176
+ try:
177
+ return float(self._get_dpc_field("montantEconPerteVSTarifBase"))
178
+ except KeyError:
179
+ return None
166
180
 
167
181
  @property
168
182
  @check_dpc_data_present
hydroqc/types/consump.py CHANGED
@@ -155,8 +155,12 @@ class ConsumpAnnualTyping(TypedDict, total=True):
155
155
  results: list[ConsumpAnnualResultsTyping]
156
156
 
157
157
 
158
- class DPCDataResultsTyping(TypedDict, total=True):
159
- """FlexD data json sub output format."""
158
+ class DPCDataResultsTyping(TypedDict, total=False):
159
+ """FlexD data json sub output format.
160
+
161
+ Note: montantEconPerteVSTarifBase may not be available in the first year of Flex D
162
+ as it requires comparison data from previous Rate D billing.
163
+ """
160
164
 
161
165
  dateDebut: str
162
166
  dateFin: str
hydroqc/types/dpc.py CHANGED
@@ -4,8 +4,12 @@
4
4
  from typing import TypedDict
5
5
 
6
6
 
7
- class DPCPeriodeHiverTyping(TypedDict, total=True):
8
- """FlexD winter period data (API v3_0 format)."""
7
+ class DPCPeriodeHiverTyping(TypedDict, total=False):
8
+ """FlexD winter period data (API v3_0 format).
9
+
10
+ Note: montantEconPerteVSTarifBase may not be available in the first year of Flex D
11
+ as it requires comparison data from previous Rate D billing.
12
+ """
9
13
 
10
14
  dateDebut: str
11
15
  dateFin: str
hydroqc/types/dt.py CHANGED
@@ -4,8 +4,12 @@
4
4
  from typing import TypedDict
5
5
 
6
6
 
7
- class DTDataResultsTyping(TypedDict, total=True):
8
- """DT winter period data (legacy format)."""
7
+ class DTDataResultsTyping(TypedDict, total=False):
8
+ """DT winter period data (legacy format).
9
+
10
+ Note: montantEconPerteVSTarifBase may not be available when comparison
11
+ data from previous billing is unavailable.
12
+ """
9
13
 
10
14
  dateDebut: str
11
15
  dateFin: str