diff data_schema/__init__.py @ 29:68286d27f27d

FIX: Allow customization of the data stream loader (get_data_stream())
author Franz Glasner <fzglas.hg@dom66.de>
date Sat, 08 Jul 2023 16:10:36 +0200
parents db3491e1b590
children 2e7c08c356ee
line wrap: on
line diff
--- a/data_schema/__init__.py	Sat Jul 08 13:51:20 2023 +0200
+++ b/data_schema/__init__.py	Sat Jul 08 16:10:36 2023 +0200
@@ -236,7 +236,8 @@
 
 ValidationSettings = collections.namedtuple(
     "ValidationSettings",
-    ["skip_keys", "break_on_keynames_problems", "schema_loader"])
+    ["skip_keys", "break_on_keynames_problems",
+     "data_stream_loader", "schema_loader"])
 
 
 class _Schema(dict):
@@ -328,13 +329,16 @@
     def __repr__(self):
         return "<_Schema " + super().__repr__() + ">"
 
-    def get_cached_schema(self, key, load_if_needed=True, schema_loader=None):
+    def get_cached_schema(self, key, load_if_needed=True,
+                          data_stream_loader=None,
+                          schema_loader=None):
         root = self.ROOT
         s = root._schema_cache.get(key, None)
         if s is None and load_if_needed:
             if schema_loader is None:
                 raise SchemaError("no schema loader available")
-            with get_data_stream(key) as schemastream:
+            dsl = data_stream_loader or get_data_stream
+            with dsl(key) as schemastream:
                 # load schema a new `$self' (i.e. sub-root is True)
                 s = _Schema(self, True, schema_loader(schemastream))
             root._schema_cache[key] = s
@@ -501,6 +505,7 @@
     settings = {
         "skip_keys": None,
         "break_on_keynames_problems": True,
+        "data_stream_loader": get_data_stream,
         "schema_loader": default_schema_loader
     }
     settings.update(kwds)
@@ -1408,6 +1413,7 @@
             s = schema.get_cached_schema(
                 uri.path,
                 load_if_needed=True,
+                data_stream_loader=context.settings.data_stream_loader,
                 schema_loader=context.settings.schema_loader)
         if uri.fragment is None:
             raise SchemaError("fragment required in reference")