Skip to content

Commit

Permalink
Allow writers to create output directories if they don't exist
Browse files Browse the repository at this point in the history
  • Loading branch information
djhoese committed Oct 29, 2018
1 parent e596471 commit fd2f28b
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 19 deletions.
61 changes: 60 additions & 1 deletion satpy/tests/test_writers.py
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ def test_enhance_with_sensor_entry2(self):
class TestYAMLFiles(unittest.TestCase):
"""Test and analyze the writer configuration files."""

def test_filename_matches_reader_name(self):
def test_filename_matches_writer_name(self):
"""Test that every writer filename matches the name in the YAML."""
import yaml

Expand Down Expand Up @@ -432,6 +432,64 @@ def test_mixed(self):
self.assertTrue(os.path.isfile(fname2))


class TestBaseWriter(unittest.TestCase):
"""Test the base writer class."""

def setUp(self):
"""Set up tests."""
import tempfile
from datetime import datetime

from satpy.scene import Scene
import dask.array as da

ds1 = xr.DataArray(
da.zeros((100, 200), chunks=50),
dims=('y', 'x'),
attrs={'name': 'test',
'start_time': datetime(2018, 1, 1, 0, 0, 0)}
)
self.scn = Scene()
self.scn['test'] = ds1

# Temp dir
self.base_dir = tempfile.mkdtemp()

def tearDown(self):
"""Remove the temporary directory created for a test"""
try:
shutil.rmtree(self.base_dir, ignore_errors=True)
except OSError:
pass

def test_save_dataset_static_filename(self):
"""Test saving a dataset with a static filename specified."""
self.scn.save_datasets(base_dir=self.base_dir, filename='geotiff.tif')
self.assertTrue(os.path.isfile(os.path.join(self.base_dir, 'geotiff.tif')))

def test_save_dataset_dynamic_filename(self):
"""Test saving a dataset with a format filename specified."""
fmt_fn = 'geotiff_{name}_{start_time:%Y%m%d_%H%M%S}.tif'
exp_fn = 'geotiff_test_20180101_000000.tif'
self.scn.save_datasets(base_dir=self.base_dir, filename=fmt_fn)
self.assertTrue(os.path.isfile(os.path.join(self.base_dir, exp_fn)))

def test_save_dataset_dynamic_filename_with_dir(self):
"""Test saving a dataset with a format filename that includes a directory."""
fmt_fn = os.path.join('{start_time:%Y%m%d}', 'geotiff_{name}_{start_time:%Y%m%d_%H%M%S}.tif')
exp_fn = os.path.join('20180101', 'geotiff_test_20180101_000000.tif')
self.scn.save_datasets(base_dir=self.base_dir, filename=fmt_fn)
self.assertTrue(os.path.isfile(os.path.join(self.base_dir, exp_fn)))

# change the filename pattern but keep the same directory
fmt_fn2 = os.path.join('{start_time:%Y%m%d}', 'geotiff_{name}_{start_time:%Y%m%d_%H}.tif')
exp_fn2 = os.path.join('20180101', 'geotiff_test_20180101_00.tif')
self.scn.save_datasets(base_dir=self.base_dir, filename=fmt_fn2)
self.assertTrue(os.path.isfile(os.path.join(self.base_dir, exp_fn2)))
# the original file should still exist
self.assertTrue(os.path.isfile(os.path.join(self.base_dir, exp_fn)))


def suite():
"""The test suite for test_writers."""
loader = unittest.TestLoader()
Expand All @@ -441,5 +499,6 @@ def suite():
my_suite.addTest(loader.loadTestsFromTestCase(TestEnhancerUserConfigs))
my_suite.addTest(loader.loadTestsFromTestCase(TestYAMLFiles))
my_suite.addTest(loader.loadTestsFromTestCase(TestComputeWriterResults))
my_suite.addTest(loader.loadTestsFromTestCase(TestBaseWriter))

return my_suite
29 changes: 11 additions & 18 deletions satpy/writers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -437,11 +437,7 @@ class Writer(Plugin):
abstract class to be inherited.
"""

def __init__(self,
name=None,
filename=None,
base_dir=None,
**kwargs):
def __init__(self, name=None, filename=None, base_dir=None, **kwargs):
# Load the config
Plugin.__init__(self, **kwargs)
self.info = self.config['writer']
Expand Down Expand Up @@ -487,9 +483,13 @@ def create_filename_parser(self, base_dir):

def get_filename(self, **kwargs):
if self.filename_parser is None:
raise RuntimeError(
"No filename pattern or specific filename provided")
return self.filename_parser.compose(kwargs)
raise RuntimeError("No filename pattern or specific filename provided")
output_filename = self.filename_parser.compose(kwargs)
dirname = os.path.dirname(output_filename)
if not os.path.isdir(dirname):
LOG.info("Creating output directory: {}".format(dirname))
os.makedirs(dirname)
return output_filename

def save_datasets(self, datasets, compute=True, **kwargs):
"""Save all datasets to one or more files.
Expand Down Expand Up @@ -575,17 +575,10 @@ def save_dataset(self, dataset, filename=None, fill_value=None,

class ImageWriter(Writer):

def __init__(self,
name=None,
filename=None,
enhancement_config=None,
base_dir=None,
**kwargs):
Writer.__init__(self, name, filename, base_dir,
**kwargs)
def __init__(self, name=None, filename=None, enhancement_config=None, base_dir=None, **kwargs):
Writer.__init__(self, name, filename, base_dir, **kwargs)
enhancement_config = self.info.get(
"enhancement_config",
None) if enhancement_config is None else enhancement_config
"enhancement_config", None) if enhancement_config is None else enhancement_config

self.enhancer = Enhancer(ppp_config_dir=self.ppp_config_dir,
enhancement_config_file=enhancement_config)
Expand Down

0 comments on commit fd2f28b

Please sign in to comment.