Skip to content

Commit acb2a3a

Browse files
authored
Enable with syntax using the new MetopReader.dataset method. (#17)
1 parent 1ab2f0a commit acb2a3a

5 files changed

Lines changed: 80 additions & 15 deletions

File tree

README.md

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ reduced_data_folder = Path(reduced_data_folder)
5959
reduced_data_files = [f for f in reduced_data_folder.iterdir() if f.is_file()]
6060

6161
test_file_name = next((s for s in reduced_data_files if s.name.startswith("ASCA_SZO")))
62-
test_file_path = reduced_data_folder / test_file_name
63-
ds = metop_reader.open_dataset(file_path=str(test_file_path), maskingvalue = float("nan"))
62+
test_file_path = str(reduced_data_folder / test_file_name)
63+
ds = metop_reader.open_dataset(file_path=test_file_path, maskingvalue = float("nan"))
6464
```
6565

6666
2. Check keys
@@ -175,6 +175,26 @@ print(longitude_slice_np)
175175
metop_reader.close_dataset(ds)
176176
```
177177

178+
8. It is recommended to use the `with` syntax to automaticlly close the file
179+
180+
```python
181+
latitude = None
182+
183+
with metop_reader.dataset(test_file_path, maskingvalue = float("nan")) as ds:
184+
latitude = metop_reader.as_array(ds['latitude'])
185+
latitude = np.array(latitude, copy = None)
186+
187+
print(latitude.shape)
188+
```
189+
<details>
190+
191+
<summary>Output of the print </summary>
192+
193+
```
194+
(42, 10)
195+
```
196+
197+
</details>
178198
## Development
179199

180200
Pre-requisite: Install podman or docker in your machine.

metoppy/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"""Metoppy package initialization."""
1212

1313
# Optional: version info
14-
__version__ = "0.1.0"
14+
__version__ = "0.1.1"
1515

1616
# Import main classes/functions
1717
from .metopreader import MetopReader

metoppy/metopreader.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"""MetopDatasets.jl Python wrapper class: MetopReader."""
1313

1414
from juliacall import Main
15-
15+
from contextlib import contextmanager
1616

1717
class MetopReader:
1818
"""Python wrapper class for MetopDatasets.jl Julia package."""
@@ -129,3 +129,23 @@ def get_test_data_artifact(self):
129129
A MetopDataset object containing test data for validation or demo purposes.
130130
"""
131131
return self._get_test_data_artifact()
132+
133+
@contextmanager
134+
def dataset(self, file_path: str, **kwargs):
135+
"""
136+
Open a dataset using the python `with` syntax. The method opens the file using `open_dataset()` and
137+
then finally closes the file using `close_dataset()` once the excution of the `with` block is completed.
138+
139+
Example
140+
----------
141+
::
142+
metop_reader = MetopReader()
143+
with metop_reader.dataset("path to a file") as ds:
144+
# read some data
145+
146+
"""
147+
ds = self.open_dataset(file_path, **kwargs)
148+
try:
149+
yield ds
150+
finally:
151+
self.close_dataset(ds)

metoppy/tests/test_basic_interface.py

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def test_file(request, metop_reader):
3636
test_file_name = next((f for f in reduced_data_files if f.name.startswith(product_type)), None)
3737
test_file_path = reduced_data_folder / test_file_name
3838

39-
return test_file_path
39+
return str(test_file_path)
4040

4141

4242
@pytest.mark.parametrize("test_file", ["ASCA_SZO"], indirect=True)
@@ -45,7 +45,7 @@ def test_get_keys(metop_reader, test_file):
4545
Simple test for metop_reader.get_key
4646
"""
4747
# arrange
48-
ds = metop_reader.open_dataset(file_path=str(test_file))
48+
ds = metop_reader.open_dataset(test_file)
4949

5050
# act
5151
keys = metop_reader.get_keys(ds)
@@ -69,7 +69,7 @@ def test_close_dataset(metop_reader, test_file):
6969
"""
7070
# arrange
7171
import juliacall
72-
ds = metop_reader.open_dataset(file_path=str(test_file))
72+
ds = metop_reader.open_dataset(test_file)
7373

7474
# act
7575
metop_reader.close_dataset(ds)
@@ -85,7 +85,7 @@ def test_shape(metop_reader, test_file):
8585
Simple test for metop_reader.shape.
8686
"""
8787
# arrange
88-
ds = metop_reader.open_dataset(file_path=str(test_file))
88+
ds = metop_reader.open_dataset(test_file)
8989

9090
# act
9191
latitude = ds['latitude']
@@ -110,7 +110,7 @@ def test_read_single_value(metop_reader, test_file):
110110
"""
111111
# arrange
112112
import datetime
113-
ds = metop_reader.open_dataset(file_path=str(test_file))
113+
ds = metop_reader.open_dataset(test_file)
114114

115115
# act
116116
CO2_radiance = ds["gs1cspect"][91, 0, 0, 0]
@@ -137,7 +137,7 @@ def test_read_array(metop_reader, test_file):
137137
"""
138138
# arrange
139139
import numpy as np
140-
ds = metop_reader.open_dataset(file_path=str(test_file))
140+
ds = metop_reader.open_dataset(test_file)
141141

142142
# act
143143
latitude_julia = metop_reader.as_array(ds['latitude'])
@@ -165,7 +165,7 @@ def test_type_stable_array(metop_reader, test_file):
165165
"""
166166
# arrange
167167
import numpy as np
168-
ds = metop_reader.open_dataset(file_path=str(test_file), maskingvalue = float("nan"))
168+
ds = metop_reader.open_dataset(test_file, maskingvalue = float("nan"))
169169

170170
# act
171171
latitude = np.array(metop_reader.as_array(ds['latitude']), copy = None)
@@ -186,7 +186,7 @@ def test_different_file_types(metop_reader, test_file):
186186
Test that different types of test files can be opened.
187187
"""
188188
# act
189-
ds = metop_reader.open_dataset(file_path=str(test_file))
189+
ds = metop_reader.open_dataset(test_file)
190190

191191
# assert
192192
assert ds is not None
@@ -204,7 +204,7 @@ def test_no_auto_convert(metop_reader, test_file):
204204
"""
205205
# arrange
206206
from juliacall import Main as jl
207-
ds = metop_reader.open_dataset(file_path=str(test_file), auto_convert=False)
207+
ds = metop_reader.open_dataset(test_file, auto_convert=False)
208208

209209
# act
210210
start_time = ds["record_start_time"][2]
@@ -216,4 +216,29 @@ def test_no_auto_convert(metop_reader, test_file):
216216
assert start_time.millisecond == 73275381
217217

218218
# clean
219-
metop_reader.close_dataset(ds)
219+
metop_reader.close_dataset(ds)
220+
221+
222+
@pytest.mark.parametrize("test_file", ["ASCA_SZO"], indirect=True)
223+
def test_with_dataset(metop_reader, test_file):
224+
"""
225+
Test using `with` syntax to read data from a data set.
226+
"""
227+
# arrange
228+
import numpy as np
229+
import juliacall
230+
ds_place_holder = None
231+
latitude = None
232+
233+
# act
234+
with metop_reader.dataset(test_file, maskingvalue = float("nan")) as ds:
235+
latitude_julia = metop_reader.as_array(ds['latitude'])
236+
latitude = np.array(latitude_julia, copy = None)
237+
ds_place_holder = ds
238+
239+
# assert
240+
assert np.all((-90 < latitude)&(latitude < 90)) # check values
241+
assert latitude.shape == (42,10) # check size
242+
with pytest.raises(juliacall.JuliaError): # check that file is closed.
243+
ds_place_holder['longitude'][0,0]
244+

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "metoppy"
3-
version = "0.1.0"
3+
version = "0.1.1"
44
description = "Python package wrapper of MetopDatasets.jl Julia package for reading products from the METOP satellites."
55
authors = [
66
{ name = "Simon Kok Lupemba", email = "simon.koklupemba@eumetsat.int" },

0 commit comments

Comments
 (0)