From ffbe921a2f629532231d60a1b632045ab771c378 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Piotr=20Ma=C5=9Blanka?= <piotr.maslanka@henrietta.com.pl>
Date: Thu, 7 Mar 2024 08:28:49 +0100
Subject: [PATCH] DirectorySource will raise an exception if directory does not
 exist and on_fail is set to RAISE

---
 CHANGELOG.md                                      |  1 +
 satella/__init__.py                               |  2 +-
 satella/configuration/sources/file.py             | 15 +++++++++------
 .../test_configuration/test_sources/test_file.py  |  7 +++++++
 4 files changed, 18 insertions(+), 7 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0ad1d67a..e9110c8f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,7 @@
 
 * added safe_listdir
 * fixed a bug occurring in Python 3.10 with whereis
+* DirectorySource will raise an exception if directory does not exist and on_fail is set to RAISE
 
 Build system
 ============
diff --git a/satella/__init__.py b/satella/__init__.py
index 507e1b6b..b8a2e669 100644
--- a/satella/__init__.py
+++ b/satella/__init__.py
@@ -1 +1 @@
-__version__ = '2.25.0a2'
+__version__ = '2.25.0a3'
diff --git a/satella/configuration/sources/file.py b/satella/configuration/sources/file.py
index 1c6732a8..9a1607ee 100644
--- a/satella/configuration/sources/file.py
+++ b/satella/configuration/sources/file.py
@@ -30,9 +30,9 @@ class FileSource(BaseSource):
         """
         super().__init__()
         from .. import sources
-        self.source_classes = [  # type: tp.List[tp.Type[FormatSource]]
+        self.source_classes = [
             (p if not isinstance(p, str) else getattr(sources, p)) for p in
-            interpret_as]
+            interpret_as]        # type: tp.List[tp.Type[FormatSource]]
         self.path = path  # type: str
         self.encoding = encoding  # type: str
 
@@ -93,10 +93,13 @@ class DirectorySource(FileSource):
         try:
             files = self.filter(os.path.join(directory, x) for x in os.listdir(directory))
         except OSError as e:
-            logger.warning(
-                'OSError %s while accessing configuration directory %s, skipping files' % (
-                    e, directory))
-            return []
+            if self.on_fail == DirectorySource.SILENT:
+                logger.warning(
+                    'OSError %s while accessing configuration directory %s, skipping files' % (
+                        e, directory))
+                return []
+            else:
+                raise ConfigurationError(f'Directory {directory} does not exist')
 
         for file_name in files:
 
diff --git a/tests/test_configuration/test_sources/test_file.py b/tests/test_configuration/test_sources/test_file.py
index c27ff676..a3ddf43e 100644
--- a/tests/test_configuration/test_sources/test_file.py
+++ b/tests/test_configuration/test_sources/test_file.py
@@ -5,6 +5,7 @@ import unittest
 from satella.coding import silence_excs
 from satella.configuration.sources import FileSource, FORMAT_SOURCES, \
     DirectorySource
+from satella.exceptions import ConfigurationError
 from .utils import SourceTestCase
 
 
@@ -54,6 +55,12 @@ class TestDirectorySource(SourceTestCase):
             self.assertEqual(self.ds.provide(),
                              {'amqp': 'amqp', 'logstash': {'host': 'localhost', 'port': 9600}})
 
+    def test_invalid_directory(self):
+        ds = DirectorySource('not-existing', on_fail=DirectorySource.SILENT)
+        self.assertEqual(ds.provide(), {})
+        ds = DirectorySource('not-existing', on_fail=DirectorySource.RAISE)
+        self.assertRaises(ConfigurationError, ds.provide)
+
     def test_directory_source(self):
         with tempfile.TemporaryDirectory() as outdir:
             self.filename = outdir
-- 
GitLab