env-canada 0.11.1__py3-none-any.whl → 0.11.3__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.
- env_canada/constants.py +1 -1
- env_canada/ec_aqhi.py +5 -3
- env_canada/ec_hydro.py +4 -2
- env_canada/ec_map.py +13 -6
- env_canada/ec_weather.py +4 -2
- {env_canada-0.11.1.dist-info → env_canada-0.11.3.dist-info}/METADATA +1 -3
- env_canada-0.11.3.dist-info/RECORD +17 -0
- env_canada-0.11.1.dist-info/RECORD +0 -17
- {env_canada-0.11.1.dist-info → env_canada-0.11.3.dist-info}/WHEEL +0 -0
- {env_canada-0.11.1.dist-info → env_canada-0.11.3.dist-info}/licenses/LICENSE +0 -0
- {env_canada-0.11.1.dist-info → env_canada-0.11.3.dist-info}/top_level.txt +0 -0
env_canada/constants.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
USER_AGENT = "env_canada/0.11.
|
1
|
+
USER_AGENT = "env_canada/0.11.3"
|
env_canada/ec_aqhi.py
CHANGED
@@ -9,9 +9,11 @@ from lxml import etree as et
|
|
9
9
|
|
10
10
|
from .constants import USER_AGENT
|
11
11
|
|
12
|
-
AQHI_SITE_LIST_URL =
|
13
|
-
|
14
|
-
|
12
|
+
AQHI_SITE_LIST_URL = (
|
13
|
+
"https://dd.weather.gc.ca/today/air_quality/doc/AQHI_XML_File_List.xml"
|
14
|
+
)
|
15
|
+
AQHI_OBSERVATION_URL = "https://dd.weather.gc.ca/today/air_quality/aqhi/{}/observation/realtime/xml/AQ_OBS_{}_CURRENT.xml"
|
16
|
+
AQHI_FORECAST_URL = "https://dd.weather.gc.ca/today/air_quality/aqhi/{}/forecast/realtime/xml/AQ_FCST_{}_CURRENT.xml"
|
15
17
|
|
16
18
|
CLIENT_TIMEOUT = ClientTimeout(10)
|
17
19
|
|
env_canada/ec_hydro.py
CHANGED
@@ -8,8 +8,10 @@ from geopy import distance
|
|
8
8
|
|
9
9
|
from .constants import USER_AGENT
|
10
10
|
|
11
|
-
SITE_LIST_URL =
|
12
|
-
|
11
|
+
SITE_LIST_URL = (
|
12
|
+
"https://dd.weather.gc.ca/today/hydrometric/doc/hydrometric_StationList.csv"
|
13
|
+
)
|
14
|
+
READINGS_URL = "https://dd.weather.gc.ca/today/hydrometric/csv/{prov}/hourly/{prov}_{station}_hourly_hydrometric.csv"
|
13
15
|
|
14
16
|
|
15
17
|
__all__ = ["ECHydro"]
|
env_canada/ec_map.py
CHANGED
@@ -168,15 +168,20 @@ class ECMap:
|
|
168
168
|
self._font = None
|
169
169
|
self.timestamp = None
|
170
170
|
|
171
|
+
def _get_cache_prefix(self):
|
172
|
+
"""Generate a location-specific cache prefix based on bounding box."""
|
173
|
+
return f"{self.bbox[0]:.3f},{self.bbox[1]:.3f},{self.bbox[2]:.3f},{self.bbox[3]:.3f}"
|
174
|
+
|
171
175
|
async def _get_basemap(self):
|
172
176
|
"""Fetch the background map image."""
|
173
|
-
|
177
|
+
basemap_cache_key = f"{self._get_cache_prefix()}-basemap"
|
178
|
+
if base_bytes := Cache.get(basemap_cache_key):
|
174
179
|
return base_bytes
|
175
180
|
|
176
181
|
basemap_params.update(self.map_params)
|
177
182
|
try:
|
178
183
|
base_bytes = await _get_resource(basemap_url, basemap_params)
|
179
|
-
return Cache.add(
|
184
|
+
return Cache.add(basemap_cache_key, base_bytes, timedelta(days=7))
|
180
185
|
except ClientConnectorError as e:
|
181
186
|
LOG.warning("Map from %s could not be retrieved: %s", basemap_url, e)
|
182
187
|
return None
|
@@ -220,7 +225,7 @@ class ECMap:
|
|
220
225
|
async def _get_legend(self):
|
221
226
|
"""Fetch legend image for the layer."""
|
222
227
|
|
223
|
-
legend_cache_key = f"legend-{self.layer}"
|
228
|
+
legend_cache_key = f"{self._get_cache_prefix()}-legend-{self.layer}"
|
224
229
|
if legend := Cache.get(legend_cache_key):
|
225
230
|
return legend
|
226
231
|
|
@@ -269,7 +274,7 @@ class ECMap:
|
|
269
274
|
async def _get_layer_image(self, frame_time):
|
270
275
|
"""Fetch image for the layer at a specific time."""
|
271
276
|
time = frame_time.strftime("%Y-%m-%dT%H:%M:00Z")
|
272
|
-
layer_cache_key = f"layer-{self.layer}-{time}"
|
277
|
+
layer_cache_key = f"{self._get_cache_prefix()}-layer-{self.layer}-{time}"
|
273
278
|
|
274
279
|
if img := Cache.get(layer_cache_key):
|
275
280
|
return img
|
@@ -362,11 +367,13 @@ class ECMap:
|
|
362
367
|
composite.save(img_byte_arr, format="PNG")
|
363
368
|
|
364
369
|
return Cache.add(
|
365
|
-
f"composite-{time}",
|
370
|
+
f"{self._get_cache_prefix()}-composite-{time}",
|
371
|
+
img_byte_arr.getvalue(),
|
372
|
+
timedelta(minutes=200),
|
366
373
|
)
|
367
374
|
|
368
375
|
time = frame_time.strftime("%Y-%m-%dT%H:%M:00Z")
|
369
|
-
cache_key = f"composite-{time}"
|
376
|
+
cache_key = f"{self._get_cache_prefix()}-composite-{time}"
|
370
377
|
|
371
378
|
if img := Cache.get(cache_key):
|
372
379
|
return img
|
env_canada/ec_weather.py
CHANGED
@@ -21,9 +21,11 @@ from lxml.etree import _Element
|
|
21
21
|
from . import ec_exc
|
22
22
|
from .constants import USER_AGENT
|
23
23
|
|
24
|
-
SITE_LIST_URL =
|
24
|
+
SITE_LIST_URL = (
|
25
|
+
"https://dd.weather.gc.ca/today/citypage_weather/docs/site_list_towns_en.csv"
|
26
|
+
)
|
25
27
|
|
26
|
-
WEATHER_BASE_URL = "https://dd.weather.gc.ca/citypage_weather/{province}/{hour}/"
|
28
|
+
WEATHER_BASE_URL = "https://dd.weather.gc.ca/today/citypage_weather/{province}/{hour}/"
|
27
29
|
|
28
30
|
CLIENT_TIMEOUT = ClientTimeout(10)
|
29
31
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: env_canada
|
3
|
-
Version: 0.11.
|
3
|
+
Version: 0.11.3
|
4
4
|
Summary: A package to access meteorological data from Environment Canada
|
5
5
|
Author-email: Michael Davie <michael.davie@gmail.com>
|
6
6
|
Maintainer-email: Michael Davie <michael.davie@gmail.com>
|
@@ -17,9 +17,7 @@ Description-Content-Type: text/markdown
|
|
17
17
|
License-File: LICENSE
|
18
18
|
Requires-Dist: aiohttp>=3.9.0
|
19
19
|
Requires-Dist: geopy>=2.3.0
|
20
|
-
Requires-Dist: imageio>=2.28.0
|
21
20
|
Requires-Dist: lxml>=5.3.0
|
22
|
-
Requires-Dist: numpy>=1.22.2
|
23
21
|
Requires-Dist: pandas>=2.2.3
|
24
22
|
Requires-Dist: Pillow>=10.0.1
|
25
23
|
Requires-Dist: python-dateutil>=2.9
|
@@ -0,0 +1,17 @@
|
|
1
|
+
env_canada/10x20.pbm,sha256=ClKTs2WUmhUhTHAQzPuGwPTICGVBzCvos5l-vHRBE5M,2463
|
2
|
+
env_canada/10x20.pil,sha256=Oki6-TD7b0xFtfm6vxCKsmpEpsZ5Jaia_0v_aDz8bfE,5143
|
3
|
+
env_canada/__init__.py,sha256=EXzGEHwon-usFzLzuJeISKHlfJdV3DBa0_rR9b_XfvE,405
|
4
|
+
env_canada/constants.py,sha256=C9mCx8dS26TjS-XcPBa5Lp1u-Inmjn4OJ8YadKGlreo,33
|
5
|
+
env_canada/ec_aqhi.py,sha256=bmgzq__b8ecvPGR_PAlDBa4uyA6OTVllikBVYwOefRc,8106
|
6
|
+
env_canada/ec_cache.py,sha256=zb3n79ul7hUTE0IohDfZbRBLY-siOHPjYzWldMbuPVk,798
|
7
|
+
env_canada/ec_exc.py,sha256=SBJwzmLf94lTx7KYVLfQYrMXYNYUoIxeVXc-BLkuXoE,67
|
8
|
+
env_canada/ec_historical.py,sha256=qMr4RE6vfNiNa_zFolQ0PQGraok8bQtIVjs_o6sJKD4,16276
|
9
|
+
env_canada/ec_hydro.py,sha256=HxfUsx43A6KBPdzNQs1-204UVstMXAyrpyj8h2B8Hlc,4909
|
10
|
+
env_canada/ec_map.py,sha256=HIyCZ8j9EbuLX3-YhvMKjYPiE2AH_behL6IaOXjXpaQ,15564
|
11
|
+
env_canada/ec_radar.py,sha256=dKZqWJyb66R2EJzAy4K7pii7vPK9FxDKmuW9vA1ADbw,3330
|
12
|
+
env_canada/ec_weather.py,sha256=IGmQ4rvilxclb76h9Gu44e91uEfzmNTHu9gg9V_OTSs,23447
|
13
|
+
env_canada-0.11.3.dist-info/licenses/LICENSE,sha256=BkgGIGgy9sv-OsI7mRi9dIQ3Su0m4IbjpZlfxv8oBbM,1073
|
14
|
+
env_canada-0.11.3.dist-info/METADATA,sha256=Mi-V9ltbxYiHuM-9covAq6H3lhAgDbORlxSh6nWYewk,13618
|
15
|
+
env_canada-0.11.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
16
|
+
env_canada-0.11.3.dist-info/top_level.txt,sha256=fw7Pcl9ULBXYvqnAdyBdmwPXW8GSRFmhO0sLZWVfOCc,11
|
17
|
+
env_canada-0.11.3.dist-info/RECORD,,
|
@@ -1,17 +0,0 @@
|
|
1
|
-
env_canada/10x20.pbm,sha256=ClKTs2WUmhUhTHAQzPuGwPTICGVBzCvos5l-vHRBE5M,2463
|
2
|
-
env_canada/10x20.pil,sha256=Oki6-TD7b0xFtfm6vxCKsmpEpsZ5Jaia_0v_aDz8bfE,5143
|
3
|
-
env_canada/__init__.py,sha256=EXzGEHwon-usFzLzuJeISKHlfJdV3DBa0_rR9b_XfvE,405
|
4
|
-
env_canada/constants.py,sha256=LIgDz8EI__wlzoI4yz5D9tl-XPoCel8vKk45VON0DIs,33
|
5
|
-
env_canada/ec_aqhi.py,sha256=oE52qfk-AKbHdhTSl5RP3vsWL-50eMRCCRVy9RW-pP4,8080
|
6
|
-
env_canada/ec_cache.py,sha256=zb3n79ul7hUTE0IohDfZbRBLY-siOHPjYzWldMbuPVk,798
|
7
|
-
env_canada/ec_exc.py,sha256=SBJwzmLf94lTx7KYVLfQYrMXYNYUoIxeVXc-BLkuXoE,67
|
8
|
-
env_canada/ec_historical.py,sha256=qMr4RE6vfNiNa_zFolQ0PQGraok8bQtIVjs_o6sJKD4,16276
|
9
|
-
env_canada/ec_hydro.py,sha256=JoBe-QVV8GEeZXCNFscIs2R_spgkbxCZpLt7tL6-NUI,4889
|
10
|
-
env_canada/ec_map.py,sha256=936CN6G9ZAY9zQjuph0Xp4f9OwNnHb6qXMnk6M6bE68,15134
|
11
|
-
env_canada/ec_radar.py,sha256=dKZqWJyb66R2EJzAy4K7pii7vPK9FxDKmuW9vA1ADbw,3330
|
12
|
-
env_canada/ec_weather.py,sha256=pFcVKBbYKLj01ocjZmy8RiQaf7YVSQOo4id_BbZ7gds,23421
|
13
|
-
env_canada-0.11.1.dist-info/licenses/LICENSE,sha256=BkgGIGgy9sv-OsI7mRi9dIQ3Su0m4IbjpZlfxv8oBbM,1073
|
14
|
-
env_canada-0.11.1.dist-info/METADATA,sha256=c9TtVd3BBxg1sWEdIW9kQBaceHgBWaHSS52tl4ZYsLI,13678
|
15
|
-
env_canada-0.11.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
16
|
-
env_canada-0.11.1.dist-info/top_level.txt,sha256=fw7Pcl9ULBXYvqnAdyBdmwPXW8GSRFmhO0sLZWVfOCc,11
|
17
|
-
env_canada-0.11.1.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|