cloudnetpy 1.74.4__py3-none-any.whl → 1.75.1__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.
@@ -4,6 +4,7 @@ import datetime
4
4
  import logging
5
5
  from collections import defaultdict
6
6
  from pathlib import Path
7
+ from typing import Literal
7
8
 
8
9
  import netCDF4
9
10
  import numpy as np
@@ -17,7 +18,7 @@ from cloudnetpy import output, utils
17
18
  from cloudnetpy.cloudnetarray import CloudnetArray
18
19
  from cloudnetpy.exceptions import HatproDataError, ValidTimeStampError
19
20
  from cloudnetpy.instruments import rpg
20
- from cloudnetpy.instruments.instruments import HATPRO
21
+ from cloudnetpy.instruments.instruments import HATPRO, LHATPRO, LHUMPRO_U90, Instrument
21
22
  from cloudnetpy.instruments.rpg_reader import (
22
23
  HatproBin,
23
24
  HatproBinCombined,
@@ -25,11 +26,19 @@ from cloudnetpy.instruments.rpg_reader import (
25
26
  HatproBinLwp,
26
27
  )
27
28
 
29
+ IType = Literal["hatpro", "lhatpro", "lhumpro_u90"]
30
+ ITYPE_MAP: dict[IType, Instrument] = {
31
+ "hatpro": HATPRO,
32
+ "lhatpro": LHATPRO,
33
+ "lhumpro_u90": LHUMPRO_U90,
34
+ }
35
+
28
36
 
29
37
  def hatpro2l1c(
30
38
  mwr_dir: str,
31
39
  output_file: str,
32
40
  site_meta: dict,
41
+ instrument_type: IType = "hatpro",
33
42
  uuid: str | None = None,
34
43
  date: datetime.date | str | None = None,
35
44
  ) -> str:
@@ -39,6 +48,7 @@ def hatpro2l1c(
39
48
  mwr_dir: Folder containing one day of HATPRO files.
40
49
  output_file: Output file name.
41
50
  site_meta: Dictionary containing information about the site and instrument
51
+ instrument_type: Specific type of the RPG microwave radiometer.
42
52
  uuid: Set specific UUID for the file.
43
53
  date: Expected date in the input files.
44
54
 
@@ -55,6 +65,7 @@ def hatpro2l1c(
55
65
  hatpro_raw = lev1_to_nc(
56
66
  "1C01",
57
67
  mwr_dir,
68
+ instrument_type=instrument_type,
58
69
  output_file=output_file,
59
70
  coeff_files=coeff_files,
60
71
  instrument_config=site_meta,
@@ -64,7 +75,7 @@ def hatpro2l1c(
64
75
  except MissingInputData as err:
65
76
  raise HatproDataError(str(err)) from err
66
77
 
67
- hatpro = HatproL1c(hatpro_raw, site_meta)
78
+ hatpro = HatproL1c(hatpro_raw, site_meta, ITYPE_MAP[instrument_type])
68
79
 
69
80
  flags = hatpro.data["quality_flag"][:]
70
81
  bad_percentage = ma.sum(flags != 0) / flags.size * 100
@@ -123,18 +134,19 @@ def hatpro2l1c(
123
134
 
124
135
 
125
136
  class HatproL1c:
126
- def __init__(self, hatpro, site_meta: dict):
137
+ def __init__(self, hatpro, site_meta: dict, instrument: Instrument):
127
138
  self.raw_data = hatpro.raw_data
128
139
  self.data = hatpro.data
129
140
  self.date = hatpro.date.isoformat().split("-")
130
141
  self.site_meta = site_meta
131
- self.instrument = HATPRO
142
+ self.instrument = instrument
132
143
 
133
144
 
134
145
  def hatpro2nc(
135
146
  path_to_files: str,
136
147
  output_file: str,
137
148
  site_meta: dict,
149
+ instrument_type: IType = "hatpro",
138
150
  uuid: str | None = None,
139
151
  date: str | None = None,
140
152
  ) -> tuple[str, list]:
@@ -154,6 +166,7 @@ def hatpro2nc(
154
166
  - `latitude` (optional).
155
167
  - `longitude` (optional).
156
168
 
169
+ instrument_type: Specific type of the RPG microwave radiometer.
157
170
  uuid: Set specific UUID for the file.
158
171
  date: Expected date in the input files. If not set,
159
172
  all files will be used. This might cause unexpected behavior if
@@ -183,7 +196,7 @@ def hatpro2nc(
183
196
  if is_iwv_files:
184
197
  _add_missing_variables(hatpro_objects, ("lwp", "iwv"))
185
198
  one_day_of_data = rpg.create_one_day_data_record(hatpro_objects)
186
- hatpro = rpg.Hatpro(one_day_of_data, site_meta)
199
+ hatpro = rpg.Hatpro(one_day_of_data, site_meta, ITYPE_MAP[instrument_type])
187
200
  hatpro.add_site_geolocation()
188
201
  hatpro.convert_time_to_fraction_hour("float64")
189
202
  hatpro.sort_timestamps()
@@ -137,6 +137,20 @@ HATPRO = Instrument(
137
137
  model="HATPRO",
138
138
  )
139
139
 
140
+ LHATPRO = Instrument(
141
+ manufacturer="RPG-Radiometer Physics",
142
+ domain="mwr",
143
+ category="microwave radiometer",
144
+ model="LHATPRO",
145
+ )
146
+
147
+ LHUMPRO_U90 = Instrument(
148
+ manufacturer="RPG-Radiometer Physics",
149
+ domain="mwr",
150
+ category="microwave radiometer",
151
+ model="LHUMPRO-U90",
152
+ )
153
+
140
154
  RADIOMETRICS = Instrument(
141
155
  manufacturer="Radiometrics",
142
156
  domain="mwr",
@@ -247,15 +247,15 @@ def _get_keymap(filetype: str) -> dict:
247
247
  keymaps = {
248
248
  "znc": OrderedDict(
249
249
  [
250
- ("Zg", "Zh"),
250
+ ("Zg", "Zh"), # fallback
251
251
  ("Zh2l", "Zh"),
252
- ("VELg", "v"),
252
+ ("VELg", "v"), # fallback
253
253
  ("VELh2l", "v"),
254
- ("RMSg", "width"),
254
+ ("RMSg", "width"), # fallback
255
255
  ("RMSh2l", "width"),
256
- ("LDRg", "ldr"),
256
+ ("LDRg", "ldr"), # fallback
257
257
  ("LDRh2l", "ldr"),
258
- ("SNRg", "SNR"),
258
+ ("SNRg", "SNR"), # fallback
259
259
  ("SNRh2l", "SNR"),
260
260
  ("elv", "elevation"),
261
261
  ("azi", "azimuth_angle"),
@@ -265,20 +265,23 @@ def _get_keymap(filetype: str) -> dict:
265
265
  ("rg0", "rg0"),
266
266
  ],
267
267
  ),
268
- "mmclx": {
269
- "Zg": "Zh",
270
- "VELg": "v",
271
- "RMSg": "width",
272
- "LDRg": "ldr",
273
- "SNRg": "SNR",
274
- "elv": "elevation",
275
- "azi": "azimuth_angle",
276
- "nfft": "nfft",
277
- "nave": "nave",
278
- "prf": "prf",
279
- "rg0": "rg0",
280
- "NyquistVelocity": "NyquistVelocity", # variable in some mmclx files
281
- },
268
+ "mmclx": OrderedDict(
269
+ [
270
+ ("Ze", "Zh"), # fallback for old mmclx files
271
+ ("Zg", "Zh"),
272
+ ("VELg", "v"),
273
+ ("RMSg", "width"),
274
+ ("LDRg", "ldr"),
275
+ ("SNRg", "SNR"),
276
+ ("elv", "elevation"),
277
+ ("azi", "azimuth_angle"),
278
+ ("nfft", "nfft"),
279
+ ("nave", "nave"),
280
+ ("prf", "prf"),
281
+ ("rg0", "rg0"),
282
+ ("NyquistVelocity", "NyquistVelocity"), # variable in some mmclx files
283
+ ]
284
+ ),
282
285
  }
283
286
 
284
287
  return keymaps.get(filetype.lower(), keymaps["mmclx"])
@@ -3,7 +3,6 @@
3
3
  import logging
4
4
  import math
5
5
  from collections.abc import Sequence
6
- from typing import TYPE_CHECKING
7
6
 
8
7
  import numpy as np
9
8
  from numpy import ma
@@ -15,12 +14,10 @@ from cloudnetpy.constants import G_TO_KG, HPA_TO_PA, KM_H_TO_M_S, MM_H_TO_M_S
15
14
  from cloudnetpy.exceptions import InconsistentDataError, ValidTimeStampError
16
15
  from cloudnetpy.instruments import instruments
17
16
  from cloudnetpy.instruments.cloudnet_instrument import CloudnetInstrument
17
+ from cloudnetpy.instruments.instruments import Instrument
18
18
  from cloudnetpy.instruments.rpg_reader import Fmcw94Bin, HatproBinCombined
19
19
  from cloudnetpy.metadata import MetaData
20
20
 
21
- if TYPE_CHECKING:
22
- from cloudnetpy.instruments.instruments import Instrument
23
-
24
21
 
25
22
  def rpg2nc(
26
23
  path_to_l1_files: str,
@@ -331,9 +328,9 @@ class Fmcw(Rpg):
331
328
  class Hatpro(Rpg):
332
329
  """Class for RPG HATPRO mwr."""
333
330
 
334
- def __init__(self, raw_data: dict, site_properties: dict):
331
+ def __init__(self, raw_data: dict, site_properties: dict, instrument: Instrument):
335
332
  super().__init__(raw_data, site_properties)
336
- self.instrument = instruments.HATPRO
333
+ self.instrument = instrument
337
334
 
338
335
 
339
336
  def _filter_zenith_angle(zenith: ma.MaskedArray) -> np.ndarray:
@@ -4,4 +4,4 @@ from .drizzle import generate_drizzle
4
4
  from .ier import generate_ier
5
5
  from .iwc import generate_iwc
6
6
  from .lwc import generate_lwc
7
- from .mwr_tools import generate_mwr_multi, generate_mwr_single
7
+ from .mwr_tools import generate_mwr_lhumpro, generate_mwr_multi, generate_mwr_single
@@ -1,10 +1,11 @@
1
1
  import os
2
2
  import tempfile
3
- from typing import Literal
3
+ from typing import TYPE_CHECKING, Literal
4
4
 
5
5
  import netCDF4
6
6
  import numpy as np
7
7
  import requests
8
+ from mwrpy.level2.lev2_collocated import generate_lev2_lhumpro as gen_lhumpro
8
9
  from mwrpy.level2.lev2_collocated import generate_lev2_multi as gen_multi
9
10
  from mwrpy.level2.lev2_collocated import generate_lev2_single as gen_single
10
11
  from mwrpy.level2.write_lev2_nc import MissingInputData
@@ -13,6 +14,9 @@ from mwrpy.version import __version__ as mwrpy_version
13
14
  from cloudnetpy import output, utils
14
15
  from cloudnetpy.exceptions import ValidTimeStampError
15
16
 
17
+ if TYPE_CHECKING:
18
+ from collections.abc import Callable
19
+
16
20
 
17
21
  def generate_mwr_single(
18
22
  mwr_l1c_file: str, output_file: str, uuid: str | None = None
@@ -34,6 +38,26 @@ def generate_mwr_single(
34
38
  return _generate_product(mwr_l1c_file, output_file, uuid, "single")
35
39
 
36
40
 
41
+ def generate_mwr_lhumpro(
42
+ mwr_l1c_file: str, output_file: str, uuid: str | None = None
43
+ ) -> str:
44
+ """Generates LHUMPRO single-pointing product including liquid water path, integrated
45
+ water vapor, etc. from zenith measurements.
46
+
47
+ Args:
48
+ mwr_l1c_file: The Level 1C MWR file to be processed.
49
+ output_file: The file path where the output file should be saved.
50
+ uuid: The UUID, if any, associated with the output file. Defaults to None.
51
+
52
+ Returns:
53
+ UUID of generated file.
54
+
55
+ Example:
56
+ >>> generate_mwr_lhumpro('input_mwr_l1c_file', 'output_file', 'abcdefg1234567')
57
+ """
58
+ return _generate_product(mwr_l1c_file, output_file, uuid, "lhumpro")
59
+
60
+
37
61
  def generate_mwr_multi(
38
62
  mwr_l1c_file: str, output_file: str, uuid: str | None = None
39
63
  ) -> str:
@@ -56,9 +80,19 @@ def _generate_product(
56
80
  mwr_l1c_file: str,
57
81
  output_file: str,
58
82
  uuid: str | None,
59
- product: Literal["multi", "single"],
83
+ product: Literal["multi", "single", "lhumpro"],
60
84
  ) -> str:
61
- fun = gen_multi if product == "multi" else gen_single
85
+ fun: Callable
86
+ if product == "multi":
87
+ fun = gen_multi
88
+ elif product == "single":
89
+ fun = gen_single
90
+ elif product == "lhumpro":
91
+ fun = gen_lhumpro
92
+ product = "single"
93
+ else:
94
+ msg = f"Invalid product: {product}"
95
+ raise ValueError(msg)
62
96
  with tempfile.TemporaryDirectory() as temp_dir:
63
97
  coeffs = _read_mwrpy_coeffs(mwr_l1c_file, temp_dir)
64
98
  try:
cloudnetpy/utils.py CHANGED
@@ -965,7 +965,8 @@ def get_files_with_common_range(filenames: list) -> list:
965
965
  with netCDF4.Dataset(file) as nc:
966
966
  n_range.append(len(nc.variables["range"]))
967
967
  most_common = np.bincount(n_range).argmax()
968
- if n_removed := len(filenames) - n_range.count(int(most_common)) > 0:
968
+ n_removed = len(filenames) - n_range.count(int(most_common))
969
+ if n_removed > 0:
969
970
  logging.warning(
970
971
  "Removing %s files due to inconsistent height vector", n_removed
971
972
  )
cloudnetpy/version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  MAJOR = 1
2
- MINOR = 74
3
- PATCH = 4
2
+ MINOR = 75
3
+ PATCH = 1
4
4
  __version__ = f"{MAJOR}.{MINOR}.{PATCH}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cloudnetpy
3
- Version: 1.74.4
3
+ Version: 1.75.1
4
4
  Summary: Python package for Cloudnet processing
5
5
  Author: Simo Tukiainen
6
6
  License: MIT License
@@ -41,7 +41,7 @@ License-File: LICENSE
41
41
  Requires-Dist: ceilopyter
42
42
  Requires-Dist: doppy>=0.5.0
43
43
  Requires-Dist: matplotlib
44
- Requires-Dist: mwrpy>=1.2.0
44
+ Requires-Dist: mwrpy>=1.3.0
45
45
  Requires-Dist: netCDF4
46
46
  Requires-Dist: requests
47
47
  Requires-Dist: rpgpy>=0.14.5
@@ -8,8 +8,8 @@ cloudnetpy/exceptions.py,sha256=hYbUtBwjCIfxnPe_5mELDEw87AWITBrwuo7WYIEKmJ8,1579
8
8
  cloudnetpy/metadata.py,sha256=lO7BCbVAzFoH3Nq-VuezYX0f7MnbG1Zp11g5GSiuQwM,6189
9
9
  cloudnetpy/output.py,sha256=l0LoOhcGCBrg2EJ4NT1xZ7-UKWdV7X7yQ0fJmhkwJVc,15829
10
10
  cloudnetpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- cloudnetpy/utils.py,sha256=mzibw-RiC4e6rJGeJUf3RR_j-LmmcwqejzbacmXCmZA,33460
12
- cloudnetpy/version.py,sha256=y9RgCPl0qtP9IUebjQy1PGFXDnttvhLWaPkMwq2OnFU,72
11
+ cloudnetpy/utils.py,sha256=SSZWk82c4nkAiTcLdOKGVvxt5ovETdAMn_TLxVeYpBY,33473
12
+ cloudnetpy/version.py,sha256=tMFs6L1VKyLJzgBVt3-cNkUiP4Yz4Ld_Cu8UkEL_7U4,72
13
13
  cloudnetpy/categorize/__init__.py,sha256=s-SJaysvVpVVo5kidiruWQO6p3gv2TXwY1wEHYO5D6I,44
14
14
  cloudnetpy/categorize/atmos_utils.py,sha256=RcmbKxm2COkE7WEya0mK3yX5rzUbrewRVh3ekm01RtM,10598
15
15
  cloudnetpy/categorize/attenuation.py,sha256=Y_-fzmQTltWTqIZTulJhovC7a6ifpMcaAazDJcnMIOc,990
@@ -41,17 +41,17 @@ cloudnetpy/instruments/cl61d.py,sha256=g6DNBFju3wYhLFl32DKmC8pUup7y-EupXoUU0fuoG
41
41
  cloudnetpy/instruments/cloudnet_instrument.py,sha256=3qJe8STIvsU8irj79xuElFUZa0jUsSSg2lq7Ozo1om4,4401
42
42
  cloudnetpy/instruments/copernicus.py,sha256=99idcn6-iKOSvSslNjwFRng3gwlTLFjKPiT1tnVytpQ,6613
43
43
  cloudnetpy/instruments/galileo.py,sha256=BjWE15_S3tTCOmAM5k--oicI3wghKaO0hv9EUBxtbl8,4830
44
- cloudnetpy/instruments/hatpro.py,sha256=D1iTR58ao6zA556LegPDhh4JHozxiup_9mUuLjR0NzE,9006
45
- cloudnetpy/instruments/instruments.py,sha256=BdtUBvBUpjIyXubirHkP1Xa9mtlF8CgPEnFPokJgyrQ,4408
44
+ cloudnetpy/instruments/hatpro.py,sha256=G1fHsY9LTos4vHP5kFubjE5Wg2uTVFZpYDSD8VAo-zw,9590
45
+ cloudnetpy/instruments/instruments.py,sha256=hdELBl4zw9gZghXLjmUBmC_XnyGvNuOyaYZzSl9M17k,4704
46
46
  cloudnetpy/instruments/lufft.py,sha256=nIoEKuuFGKq2dLqkX7zW-HpAifefG472tZhKfXE1yoA,4212
47
- cloudnetpy/instruments/mira.py,sha256=Wofp8HbiAwJce_IbOLjpEFV07H_Kh4170C9Wygiz-ew,11401
47
+ cloudnetpy/instruments/mira.py,sha256=IH88dnV5fdAQ-A04S23ROgNmT4GBAtzXQxCr_9fWj-Q,11634
48
48
  cloudnetpy/instruments/mrr.py,sha256=eeAzCp3CiHGauywjwvMUAFwZ4vBOZMcd3IlF8KsrLQo,5711
49
49
  cloudnetpy/instruments/nc_lidar.py,sha256=5gQG9PApnNPrHmS9_zanl8HEYIQuGRpbnzC3wfTcOyQ,1705
50
50
  cloudnetpy/instruments/nc_radar.py,sha256=HlaZeH5939R86ukF8K-P4Kfzb5-CpLB15LU2u94C5eI,7330
51
51
  cloudnetpy/instruments/pollyxt.py,sha256=U3g-ttmcs02LuLwVOydP3GjeNcmDyoYQroB-leIGdHY,10060
52
52
  cloudnetpy/instruments/radiometrics.py,sha256=ySG4a042XkgjMTG8d20oAPNvFvw9bMwwiqS3zv-JF_w,11825
53
53
  cloudnetpy/instruments/rain_e_h3.py,sha256=9TdpP4UzMBNIt2iE2GL6K9dFldzTHPLOrU8Q3tcosCU,5317
54
- cloudnetpy/instruments/rpg.py,sha256=gjvDomyoqSaeS3-X4EuesvWBp32BNoD-CeuvBOP19AI,17359
54
+ cloudnetpy/instruments/rpg.py,sha256=m3-xLJ-w2T7Ip7jBveWsGrts4tmNvdc-Lb4HebvHQjQ,17319
55
55
  cloudnetpy/instruments/rpg_reader.py,sha256=ThztFuVrWxhmWVAfZTfQDeUiKK1XMTbtv08IBe8GK98,11364
56
56
  cloudnetpy/instruments/toa5.py,sha256=CfmmBMv5iMGaWHIGBK01Rw24cuXC1R1RMNTXkmsm340,1760
57
57
  cloudnetpy/instruments/vaisala.py,sha256=RKAw_fVry4YOUF0i2_-2jLIc6_H85oL8USA4ji9rh0o,4583
@@ -103,7 +103,7 @@ cloudnetpy/model_evaluation/tests/unit/test_tools.py,sha256=Ia_VrLdV2NstX5gbx_3A
103
103
  cloudnetpy/plotting/__init__.py,sha256=lg9Smn4BI0dVBgnDLC3JVJ4GmwoSnO-qoSd4ApvwV6Y,107
104
104
  cloudnetpy/plotting/plot_meta.py,sha256=qfyZJNis937uM-NJseer8i4FO7I_v5jhQPyFl5Uszi8,17390
105
105
  cloudnetpy/plotting/plotting.py,sha256=ghdR-DW0N4wMju20LM0sNCPXkueR1WpsimQfiA-eQQQ,38422
106
- cloudnetpy/products/__init__.py,sha256=2hRb5HG9hNrxH1if5laJkLeFeaZCd5W1q3hh4ewsX0E,273
106
+ cloudnetpy/products/__init__.py,sha256=cBJdJBYltz5ZTKDqnRo-0StytAZK8gE3RYxxriFA4ak,295
107
107
  cloudnetpy/products/classification.py,sha256=KwAiBSgFwDqhM114NIgYiUjj8HoYc7gAlc8E1QgcSig,8207
108
108
  cloudnetpy/products/der.py,sha256=soypE7uSEP4uHUCCQVEhyXsKY6e9mzV9B_2S5GUizqk,12729
109
109
  cloudnetpy/products/drizzle.py,sha256=58C9Mo6oRXR8KpbVPghbJvHvFX9GfS3xUp058pbf0qw,10804
@@ -114,12 +114,12 @@ cloudnetpy/products/ier.py,sha256=XW4gg_H-JWMWKToMqLVl6v8kx1S65GBwclWDCn1EfSk,59
114
114
  cloudnetpy/products/iwc.py,sha256=WcPdAZx3zW0zaNJNp2vpAD4JnG0NJjFmCUAhDWzNxMg,9459
115
115
  cloudnetpy/products/lwc.py,sha256=sl6Al2tuH3KkCBrPbWTmuz3jlD5UQJ4D6qBsn1tt2CQ,18962
116
116
  cloudnetpy/products/mie_lu_tables.nc,sha256=It4fYpqJXlqOgL8jeZ-PxGzP08PMrELIDVe55y9ob58,16637951
117
- cloudnetpy/products/mwr_tools.py,sha256=1SRaQRW6-1svfnUk25sMyWXSwRJ1fg7v48TsMENZQpg,5103
117
+ cloudnetpy/products/mwr_tools.py,sha256=8HPZpQMTojKZP1JS1S83IE0sxmbDE9bxlaWoqmGnUZE,6199
118
118
  cloudnetpy/products/product_tools.py,sha256=uu4l6reuGbPcW3TgttbaSrqIKbyYGhBVTdnC7opKvmg,11101
119
- cloudnetpy-1.74.4.dist-info/licenses/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
119
+ cloudnetpy-1.75.1.dist-info/licenses/LICENSE,sha256=wcZF72bdaoG9XugpyE95Juo7lBQOwLuTKBOhhtANZMM,1094
120
120
  docs/source/conf.py,sha256=IKiFWw6xhUd8NrCg0q7l596Ck1d61XWeVjIFHVSG9Og,1490
121
- cloudnetpy-1.74.4.dist-info/METADATA,sha256=5Ok-P4mHlXu-sIxwnh_tSlGyV5wQ2odutXvGOka3tio,5796
122
- cloudnetpy-1.74.4.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
123
- cloudnetpy-1.74.4.dist-info/entry_points.txt,sha256=HhY7LwCFk4qFgDlXx_Fy983ZTd831WlhtdPIzV-Y3dY,51
124
- cloudnetpy-1.74.4.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
125
- cloudnetpy-1.74.4.dist-info/RECORD,,
121
+ cloudnetpy-1.75.1.dist-info/METADATA,sha256=E9p1xLzJFAIa_z2emwjuzlVEHuWB1YiYuY1z9pn1ZR4,5796
122
+ cloudnetpy-1.75.1.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
123
+ cloudnetpy-1.75.1.dist-info/entry_points.txt,sha256=HhY7LwCFk4qFgDlXx_Fy983ZTd831WlhtdPIzV-Y3dY,51
124
+ cloudnetpy-1.75.1.dist-info/top_level.txt,sha256=ibSPWRr6ojS1i11rtBFz2_gkIe68mggj7aeswYfaOo0,16
125
+ cloudnetpy-1.75.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (79.0.1)
2
+ Generator: setuptools (80.3.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5