weatherdb 1.1.1__py3-none-any.whl → 1.1.2__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
weatherdb/_version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "1.1.1"
1
+ __version__ = "1.1.2"
weatherdb/cli.py CHANGED
@@ -103,10 +103,16 @@ def download_ma_rasters(which, overwrite, update_user_config):
103
103
  """
104
104
  click.echo("starting downloading multi annual raster data")
105
105
  from weatherdb.utils.get_data import download_ma_rasters
106
- download_ma_rasters(overwrite=overwrite)
106
+ download_ma_rasters(
107
+ which=which,
108
+ overwrite=overwrite,
109
+ update_user_config=update_user_config)
107
110
 
108
111
 
109
112
  @cli.command(short_help="Download the needed digital elevation model raster data from Copernicus to the data folder.")
113
+ @click.option('--out-dir', '-d',
114
+ type=click.Path(), default=None, show_default=False,
115
+ help="The directory to save the downloaded DEM data to.")
110
116
  @click.option('--overwrite/--no-overwrite', '-o/-no-o',
111
117
  type=bool, is_flag=True, default=None, show_default=False,
112
118
  help="Should the digital elevation model raster be downloaded even if it already exists?")
@@ -116,7 +122,11 @@ def download_ma_rasters(which, overwrite, update_user_config):
116
122
  @click.option("--update-user-config", "-u",
117
123
  type=bool, default=False, show_default=True, is_flag=True,
118
124
  help="Should the user configuration be updated with the path to the downloaded DEM?")
119
- def download_dem(overwrite, extent):
125
+ @click.option("--service", "-s",
126
+ type=str, default=["prism", "openTopography"], show_default=True, multiple=True,
127
+ help="The service to use to download the DEM. Options are 'prism' or 'openTopography'. " +\
128
+ "You can use this option muultiple times to test both in the given order until the file could be downloaded.")
129
+ def download_dem(out_dir, overwrite, extent, update_user_config, service="prism"):
120
130
  """Download the newest DEM data from the Copernicus Sentinel dataset.
121
131
 
122
132
  Only the GLO-30 DEM, wich has a 30m resolution, is downloaded as it is freely available.
@@ -131,7 +141,12 @@ def download_dem(overwrite, extent):
131
141
  """
132
142
  click.echo("Starting downloading digital elevation model from Copernicus")
133
143
  from weatherdb.utils.get_data import download_dem
134
- download_dem(overwrite=overwrite, extent=extent)
144
+ download_dem(
145
+ out_dir=out_dir,
146
+ overwrite=overwrite,
147
+ extent=extent,
148
+ service=service,
149
+ update_user_config=update_user_config)
135
150
 
136
151
 
137
152
  # cli statements to update the database
@@ -526,7 +526,9 @@ class GroupStation(object):
526
526
  period_new = period_filled.union(
527
527
  period,
528
528
  how="inner")
529
- if period_new != period:
529
+ if period_new != period and not (
530
+ (period.start == period_new.start) and
531
+ ((period.end - period_new.end) <= pd.Timedelta(days=1))):
530
532
  warnings.warn(
531
533
  f"The Period for Station {self.id} got changed from {str(period)} to {str(period_new)}.")
532
534
  period = period_new
@@ -504,10 +504,12 @@ class StationBase:
504
504
  '{interval}'::INTERVAL)::{tstp_dtype} AS timestamp)
505
505
  INSERT INTO timeseries."{stid}_{para}"(timestamp)
506
506
  (SELECT wts.timestamp
507
- FROM whole_ts wts
508
- LEFT JOIN timeseries."{stid}_{para}" ts
507
+ FROM whole_ts wts
508
+ LEFT JOIN timeseries."{stid}_{para}" ts
509
509
  ON ts.timestamp=wts.timestamp
510
- WHERE ts.timestamp IS NULL);
510
+ WHERE ts.timestamp IS NULL);
511
+ DELETE FROM timeseries."{stid}_{para}"
512
+ WHERE timestamp < '{min_date} 00:00'::{tstp_dtype};
511
513
  """.format(
512
514
  stid=self.id,
513
515
  para=self._para,
@@ -6,9 +6,19 @@ from pathlib import Path
6
6
  from distutils.util import strtobool
7
7
  import hashlib
8
8
  import progressbar as pb
9
+ import keyring
10
+ import os
11
+ import getpass
12
+ import logging
9
13
 
10
14
  from ..config import config
11
15
 
16
+ __all__ = ["download_ma_rasters", "download_dem"]
17
+
18
+ log = logging.getLogger(__name__)
19
+
20
+ # Multi annual rasters
21
+ # --------------------
12
22
  def download_ma_rasters(which="all", overwrite=None, update_user_config=False):
13
23
  """Get the multi annual rasters on which bases the regionalisation is done.
14
24
 
@@ -60,7 +70,7 @@ def download_ma_rasters(which="all", overwrite=None, update_user_config=False):
60
70
  if file_key in which:
61
71
  # check if file is in config
62
72
  if f"data:rasters:{file_key}" not in config:
63
- print(f"Skipping {file_key} as it is not in your configuration.\nPlease add a section 'data:rasters:{file_key}' to your configuration file.")
73
+ log.debug(f"Skipping {file_key} as it is not in your configuration.\nPlease add a section 'data:rasters:{file_key}' to your configuration file.")
64
74
  continue
65
75
 
66
76
  # check if file already exists
@@ -75,7 +85,7 @@ def download_ma_rasters(which="all", overwrite=None, update_user_config=False):
75
85
  "Do you want to overwrite it? [y/n] "))
76
86
 
77
87
  if skip:
78
- print(f"Skipping {file_key} as overwriting is not allowed.")
88
+ log.debug(f"Skipping {file_key} as overwriting is not allowed.")
79
89
  continue
80
90
 
81
91
  # check if the directory exists
@@ -126,24 +136,42 @@ def download_ma_rasters(which="all", overwrite=None, update_user_config=False):
126
136
  if config.has_user_config:
127
137
  config.update_user_config(f"data:rasters:{file_key}", "file", str(file_path))
128
138
  else:
129
- print(f"No user configuration file found, therefor the raster '{file_key}' is not set in the user configuration file.")
139
+ log.error(f"No user configuration file found, therefor the raster '{file_key}' is not set in the user configuration file.")
130
140
 
141
+ # DEM data
142
+ # --------
143
+ def _check_write_fp(fp, overwrite):
144
+ """Check if a file exists and if it should be overwritten.
131
145
 
132
- def download_dem(overwrite=None, extent=(5.3, 46.1, 15.6, 55.4), update_user_config=False):
133
- """Download the newest DEM data from the Copernicus Sentinel dataset.
134
-
135
- Only the GLO-30 DEM, which has a 30m resolution, is downloaded as it is freely available.
136
- If you register as a scientific researcher also the EEA-10, with 10 m resolution, is available.
137
- You will have to download the data yourself and define it in the configuration file.
138
-
139
- After downloading the data, the files are merged and saved as a single tif file in the data directory in a subfolder called 'DEM'.
140
- To use the DEM data in the WeatherDB, you will have to define the path to the tif file in the configuration file.
146
+ Parameters
147
+ ----------
148
+ fp : str or Path
149
+ The path to the file to check.
150
+ overwrite : bool
151
+ Should the file be overwritten?
152
+
153
+ Returns
154
+ -------
155
+ bool
156
+ Should the file be written?
157
+ """
158
+ fp = Path(fp)
159
+ if fp.exists():
160
+ log.info(f"The file already exists at {fp}.")
161
+ if overwrite is None:
162
+ overwrite = strtobool(input(f"{fp} already exists. Do you want to overwrite it? [y/n] "))
163
+ if not overwrite:
164
+ log.info("Skipping, because overwritting was turned of.")
165
+ return False
166
+ return True
141
167
 
142
- Source:
143
- Copernicus DEM - Global and European Digital Elevation Model. Digital Surface Model (DSM) provided in 3 different resolutions (90m, 30m, 10m) with varying geographical extent (EEA: European and GLO: global) and varying format (INSPIRE, DGED, DTED). DOI:10.5270/ESA-c5d3d65.
168
+ def _download_dem_prism(out_dir, overwrite=None, extent=(5.3, 46.1, 15.6, 55.4)):
169
+ """Download the DEM data from the Copernicus PRISM service.
144
170
 
145
171
  Parameters
146
172
  ----------
173
+ out_dir: str or Path
174
+ The directory to save the DEM data to.
147
175
  overwrite : bool, optional
148
176
  Should the DEM data be downloaded even if it already exists?
149
177
  If None the user will be asked.
@@ -151,9 +179,11 @@ def download_dem(overwrite=None, extent=(5.3, 46.1, 15.6, 55.4), update_user_con
151
179
  extent : tuple, optional
152
180
  The extent in WGS84 of the DEM data to download.
153
181
  The default is the boundary of germany + ~40km = (5.3, 46.1, 15.6, 55.4).
154
- update_user_config : bool, optional
155
- Should the downloaded DEM be set as the used DEM in the user configuration file?
156
- The default is False.
182
+
183
+ Returns
184
+ -------
185
+ fp : Path
186
+ The path to the downloaded DEM file.
157
187
  """
158
188
  # import necessary modules
159
189
  import rasterio as rio
@@ -164,10 +194,8 @@ def download_dem(overwrite=None, extent=(5.3, 46.1, 15.6, 55.4), update_user_con
164
194
  import re
165
195
  import json
166
196
 
167
- # get dem_dir
168
- base_dir = Path(config.get("data", "base_dir"))
169
- dem_dir = base_dir / "DEM"
170
- dem_dir.mkdir(parents=True, exist_ok=True)
197
+ # check dir
198
+ out_dir = Path(out_dir)
171
199
 
172
200
  # get available datasets
173
201
  prism_url = "https://prism-dem-open.copernicus.eu/pd-desk-open-access/publicDemURLs"
@@ -191,20 +219,12 @@ def download_dem(overwrite=None, extent=(5.3, 46.1, 15.6, 55.4), update_user_con
191
219
  )[-1]["id"]
192
220
 
193
221
  # check if dataset already exists
194
- dem_file = dem_dir / f'{ds_id.replace("/", "__")}.tif'
195
- if dem_file.exists():
196
- print(f"The DEM data already exists at {dem_file}.")
197
- if overwrite is None:
198
- overwrite = strtobool(input("Do you want to overwrite it? [y/n] "))
199
- if not overwrite:
200
- print("Skipping, because overwritting was turned of.")
201
- return
202
- else:
203
- print("Overwriting the dataset.")
204
- dem_dir.mkdir(exist_ok=True)
222
+ dem_file = out_dir / f'{ds_id.replace("/", "__")}.tif'
223
+ if not _check_write_fp(dem_file, overwrite):
224
+ return
205
225
 
206
226
  # selecting DEM tiles
207
- print(f"getting available tiles for Copernicus dataset '{ds_id}'")
227
+ log.info(f"getting available tiles for Copernicus dataset '{ds_id}'")
208
228
  ds_files_req = json.loads(
209
229
  requests.get(
210
230
  f"{prism_url}/{ds_id.replace('/', '__')}",
@@ -225,13 +245,13 @@ def download_dem(overwrite=None, extent=(5.3, 46.1, 15.6, 55.4), update_user_con
225
245
  ds_files_all))
226
246
 
227
247
  # download DEM tiles
228
- print("downloading tiles")
248
+ log.info("downloading tiles")
229
249
  with TemporaryDirectory() as tmp_dir:
230
250
  tmp_dir_fp = Path(tmp_dir)
231
251
  for f in pb.progressbar(ds_files):
232
252
  with open(tmp_dir_fp / Path(f["nativeDemUrl"]).name, "wb") as d:
233
253
  d.write(requests.get(f["nativeDemUrl"]).content)
234
- print("downloaded all files")
254
+ log.info("downloaded all files")
235
255
 
236
256
  # extracting tifs from tars
237
257
  for i, f in pb.progressbar(list(enumerate(tmp_dir_fp.glob("*.tar")))):
@@ -269,17 +289,161 @@ def download_dem(overwrite=None, extent=(5.3, 46.1, 15.6, 55.4), update_user_con
269
289
  tmp_eula_fp = next(tmp_dir_fp.glob("*.pdf"))
270
290
  shutil.copyfile(
271
291
  tmp_eula_fp,
272
- dem_dir / tmp_eula_fp.name
292
+ out_dir / tmp_eula_fp.name
273
293
  )
274
294
 
275
- print(f"created DEM at '{dem_file}'.")
295
+ log.info(f"created DEM at '{dem_file}'.")
296
+ return dem_file
297
+
298
+ def _download_dem_opentopo(
299
+ out_dir,
300
+ overwrite=None,
301
+ extent=(5.3, 46.1, 15.6, 55.4),
302
+ api_key=os.environ.get(
303
+ "WEATHERDB_OPENTOPO_API_KEY",
304
+ fallback=keyring.get_password("weatherdb", "opentopo_api_key"))):
305
+ """Download the DEM data from the OpenTopography service.
306
+
307
+ Get an API key from (OpenTopography)[https://portal.opentopography.org/] to use this service.
308
+
309
+ Parameters
310
+ ----------
311
+ out_dir : str or Path
312
+ The directory to save the DEM data to.
313
+ overwrite : bool, optional
314
+ Should the DEM data be downloaded even if it already exists?
315
+ If None the user will be asked.
316
+ The default is None.
317
+ extent : tuple, optional
318
+ The extent in WGS84 of the DEM data to download.
319
+ Should be in the format (south, west, north, east).
320
+ The default is the boundary of germany + ~40km = (5.3, 46.1, 15.6, 55.4).
321
+ api_key : str, optional
322
+ The API key for the OpenTopography service.
323
+ If None the user will be asked.
324
+ The default is to check if the environment variable "WEATHERDB_OPENTOPO_API_KEY" is set or if the keyring has a password for "weatherdb" and "opentopo_api_key".
325
+
326
+ Returns
327
+ -------
328
+ fp : Path
329
+ The path to the downloaded DEM file.
330
+ """
331
+ # check api key
332
+ if api_key is None:
333
+ print("No API key for OpenTopography was given or found in the keyring or environment variable.")
334
+ api_key = getpass("Please enter your API key for OpenTopography: ")
335
+
336
+ # make query
337
+ w, s, e, n = extent
338
+ url = f"https://portal.opentopography.org/API/globaldem?demtype=COP30&west={w}&south={s}&east={e}&north={n}&outputFormat=GTiff&API_Key={api_key}"
339
+ r = requests.get(url)
340
+ if r.status_code == 200:
341
+ # store api key
342
+ if api_key != keyring.get_password("weatherdb", "opentopo_api_key"):
343
+ keyring.set_password("weatherdb", "opentopo_api_key", api_key)
344
+
345
+ # get dem file
346
+ out_fp = out_dir / "OpenTopo_COP30.tif"
347
+
348
+ # check if file already exists
349
+ if not _check_write_fp(out_fp, overwrite):
350
+ return
351
+
352
+ # download file
353
+ with open(out_fp, "wb") as f:
354
+ for chunk in r.iter_content(chunk_size=1024):
355
+ f.write(chunk)
356
+ log.info(f"Downloaded DEM data from OpenTopography to '{out_fp}'.")
357
+ return out_fp
358
+
359
+ log.error(f"Request to openTopography API with url {r.url.replace(api_key, "[MASKED]")} returned status code {r.status_code}")
360
+
361
+ def download_dem(out_dir=None,
362
+ overwrite=None,
363
+ extent=(5.3, 46.1, 15.6, 55.4),
364
+ update_user_config=False,
365
+ service=["prism", "openTopography"], **kwargs):
366
+ """Download the newest DEM data from the Copernicus Sentinel dataset.
367
+
368
+ Only the GLO-30 DEM, which has a 30m resolution, is downloaded as it is freely available.
369
+ If you register as a scientific researcher also the EEA-10, with 10 m resolution, is available.
370
+ You will have to download the data yourself and define it in the configuration file.
371
+
372
+ After downloading the data, the files are merged and saved as a single tif file in the data directory in a subfolder called 'DEM'.
373
+ To use the DEM data in the WeatherDB, you will have to define the path to the tif file in the configuration file.
374
+
375
+ Source:
376
+ Copernicus DEM - Global and European Digital Elevation Model. Digital Surface Model (DSM) provided in 3 different resolutions (90m, 30m, 10m) with varying geographical extent (EEA: European and GLO: global) and varying format (INSPIRE, DGED, DTED). DOI:10.5270/ESA-c5d3d65.
377
+
378
+ Parameters
379
+ ----------
380
+ out_dir : str or Path, optional
381
+ The directory to save the DEM data to.
382
+ If None the data is saved in the data directory in a subfolder called 'DEM'.
383
+ The default is None.
384
+ overwrite : bool, optional
385
+ Should the DEM data be downloaded even if it already exists?
386
+ If None the user will be asked.
387
+ The default is None.
388
+ extent : tuple, optional
389
+ The extent in WGS84 of the DEM data to download.
390
+ The default is the boundary of germany + ~40km = (5.3, 46.1, 15.6, 55.4).
391
+ update_user_config : bool, optional
392
+ Should the downloaded DEM be set as the used DEM in the user configuration file?
393
+ The default is False.
394
+ service : str or list of str, optional
395
+ The service to use to download the DEM data.
396
+ Options are "prism" and "openTopography".
397
+ If Both are given they are executed in the order they are given.
398
+ If OpenTopography is selected, you will have to provide an API key.
399
+ The default is ["prism", "openTopography"].
400
+ """
401
+ # check service
402
+ if isinstance(service, str):
403
+ service = [service]
404
+
405
+ # check dir
406
+ if out_dir is None:
407
+ out_dir = Path(config.get("data", "base_dir")) / "DEM"
408
+ else:
409
+ out_dir = Path(out_dir)
410
+ out_dir.mkdir(parents=True, exist_ok=True)
411
+
412
+ # download data
413
+ fp=None
414
+ for s in service:
415
+ if s == "prism":
416
+ try:
417
+ fp = _download_dem_prism(
418
+ out_dir=out_dir,
419
+ overwrite=overwrite,
420
+ extent=extent,
421
+ **kwargs)
422
+ break
423
+ except Exception as e:
424
+ log.debug(f"Error while downloading DEM from PRISM: {e}")
425
+ elif s == "openTopography":
426
+ try:
427
+ fp = _download_dem_opentopo(
428
+ out_dir=out_dir,
429
+ overwrite=overwrite,
430
+ extent=extent,
431
+ **kwargs)
432
+ break
433
+ except Exception as e:
434
+ log.debug(f"Error while downloading DEM from OpenTopography: {e}")
435
+
436
+ # check if file was downloaded
437
+ if fp is None:
438
+ log.error("No DEM data was downloaded.")
439
+ return
276
440
 
277
441
  # update user config
278
442
  if update_user_config:
279
443
  if config.has_user_config:
280
- config.update_user_config("data:rasters", "dems", str(dem_file))
444
+ config.update_user_config("data:rasters", "dems", str(fp))
281
445
  return
282
446
  else:
283
- print("No user configuration file found, therefor the DEM is not set in the user configuration file.")
447
+ log.info("No user configuration file found, therefor the DEM is not set in the user configuration file.")
284
448
 
285
- print("To use the DEM data in the WeatherDB, you will have to define the path to the tif file in the user configuration file.")
449
+ log.info("To use the DEM data in the WeatherDB, you will have to define the path to the tif file in the user configuration file.")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: weatherdb
3
- Version: 1.1.1
3
+ Version: 1.1.2
4
4
  Summary: This is a package to work with and to create the Weather Database which handles, checks, fills and corrects DWD Weather Station data.
5
5
  Author-email: Max Schmit <max.schmit@hydrology.uni-freiburg.de>
6
6
  License: GNU GENERAL PUBLIC LICENSE
@@ -26,9 +26,9 @@ docs/source/setup/Install.md,sha256=IdmycMBztQFs_FAqfiU1OxtN2ihGXfIqwW4KBnsG_Iw,
26
26
  docs/source/setup/Quickstart.md,sha256=NmTvECVOS_uKoyWxgKtwQWHaH87gVFf1_QGGmZ97AZY,7062
27
27
  docs/source/setup/setup.rst,sha256=bOmfcf-n9iivxbaBWk5t0nmiIc87bks_BMIJ1d6UHOM,258
28
28
  weatherdb/__init__.py,sha256=2BzziScTYzA65WS6nhtCRZOWSLfwHTCwvZdeyuHw79U,846
29
- weatherdb/_version.py,sha256=y4gEwC0Q8o2BsM98PtyuCntN1nW-ViBe6bKQWBL7isA,21
29
+ weatherdb/_version.py,sha256=gtlfDPgq15HdgNzpLyxP5z-pg7TxLdIYeJw2QiTMNWs,21
30
30
  weatherdb/broker.py,sha256=gA5zWq4RpTJxgvKIzo9Bc5ol3k8JxAZ1BKZGkYCcr80,24474
31
- weatherdb/cli.py,sha256=BF555wpg2m0aeMTH5CdTTDKu7M6iCZABpnPISi_NgpY,9528
31
+ weatherdb/cli.py,sha256=jS_QNu4k2y7Q3d-iXTkdGP8qAEw2MWmE70wQdxBtqPo,10301
32
32
  weatherdb/alembic/README.md,sha256=6hq24TPr8z3nqJCaqrmj6__kLikVG66kLGqfC_aFPWQ,440
33
33
  weatherdb/alembic/alembic.ini,sha256=Mc3-qkQfA42ApX9douZT77g1pWE9gn4oMVJEDoebmdQ,3087
34
34
  weatherdb/alembic/config.py,sha256=Q4aolMUUT7f6VmbY0uz_dWBtKkj3KgTUs_xOY_Gbzjw,264
@@ -47,8 +47,8 @@ weatherdb/db/models.py,sha256=6Oor07T1sAD6qEtoxwEcpmY1SkLVVONChXIIcTjbUk4,15242
47
47
  weatherdb/db/views.py,sha256=DxY_IIonmiiRM-IhQrUMLwj12gIg6Q30rQAmR3wP3BE,6359
48
48
  weatherdb/db/fixtures/RichterParameters.json,sha256=CKxrB5FBX_BRKqxegXNyNtn9DUKmgibUtdvHoE8E5JI,836
49
49
  weatherdb/db/queries/get_quotient.py,sha256=9wVFmXE8tk8igGj-Xk5uSI0eiF_PQ9d-yRq7RJpvMAA,6787
50
- weatherdb/station/GroupStation.py,sha256=Q7-1npCCyqDsHcvpg1iWkWh6avQm4awe8olpnMDzAIw,30138
51
- weatherdb/station/StationBases.py,sha256=YYnmg4Qdphw_-uAVtcfZh-EpxlABzOYLUg6eI67DHao,125553
50
+ weatherdb/station/GroupStation.py,sha256=XAovs-zK5mZmJuvNJ3iCgpWH-1yWHL0axtygYu1mVi0,30292
51
+ weatherdb/station/StationBases.py,sha256=x0MlqHesPVQgijcThWBoIbgM7-_iJQLL86Teab-nlJc,125671
52
52
  weatherdb/station/StationET.py,sha256=hM6K8fCLC6mOLaE4cN92LHOyPGP01ifO6l2qO77I_bA,3621
53
53
  weatherdb/station/StationP.py,sha256=ENmWqEFwKR1WFsWmZ8-webEGTmrxODan8QO0gwIDDIU,32719
54
54
  weatherdb/station/StationPD.py,sha256=Bcg_uQTgIQPffsMGhNEwKAXhYs1Ii4VeB75afdFG-Kk,3367
@@ -67,11 +67,11 @@ weatherdb/utils/TimestampPeriod.py,sha256=6whEr2FLoHC-ldpMg9wW27ELEse5RW6dvaZ84M
67
67
  weatherdb/utils/__init__.py,sha256=siIvJT8lKLVvtdvWMpY3F9_h72Ky2d71DEdRGMWud5M,85
68
68
  weatherdb/utils/dwd.py,sha256=amEVVPLzXTSScBP5VAK35dBxuiy-Ua4hHyKnDGxD_4Q,12394
69
69
  weatherdb/utils/geometry.py,sha256=Od-RDAW1MASVAsGBXpHti9osbVJDqUbumSKBSJPbQqc,1823
70
- weatherdb/utils/get_data.py,sha256=5imKK_1Pm9cd6GWq44VP5NPZbeECDsyT8lPU8xYpYJE,11431
70
+ weatherdb/utils/get_data.py,sha256=RyRQjgUjnRadGmpu88SKyxOwtkqw9f8qEDe7HJby4LY,16997
71
71
  weatherdb/utils/logging.py,sha256=iaWnzCdBYxFmzWgLq9a6VAeBMdwy-rnt2d9PSAQq4lA,4242
72
- weatherdb-1.1.1.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
73
- weatherdb-1.1.1.dist-info/METADATA,sha256=wm05_Yd6aIf_rrOF9y356OEbFWTlvauwJMFhHAoadBA,44266
74
- weatherdb-1.1.1.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
75
- weatherdb-1.1.1.dist-info/entry_points.txt,sha256=kJemTd9Cm_QWPZt03KUWhpn1aB0-l_5ce6Ms3EoS_NM,55
76
- weatherdb-1.1.1.dist-info/top_level.txt,sha256=fI1xpTdDzn7NW-aRqQSj_VHgLvfN7wbK8Z1YXMx7ktM,22
77
- weatherdb-1.1.1.dist-info/RECORD,,
72
+ weatherdb-1.1.2.dist-info/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
73
+ weatherdb-1.1.2.dist-info/METADATA,sha256=nADh5aUQ2vFhvlFlN_uVWEIyBotUkXpp35KULolqCec,44266
74
+ weatherdb-1.1.2.dist-info/WHEEL,sha256=bFJAMchF8aTQGUgMZzHJyDDMPTO3ToJ7x23SLJa1SVo,92
75
+ weatherdb-1.1.2.dist-info/entry_points.txt,sha256=kJemTd9Cm_QWPZt03KUWhpn1aB0-l_5ce6Ms3EoS_NM,55
76
+ weatherdb-1.1.2.dist-info/top_level.txt,sha256=fI1xpTdDzn7NW-aRqQSj_VHgLvfN7wbK8Z1YXMx7ktM,22
77
+ weatherdb-1.1.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.45.1)
2
+ Generator: bdist_wheel (0.45.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5