# sasdata.data_util.registry module

File extension registry.

This provides routines for opening files based on extension, and registers the built-in file extensions.

class sasdata.data_util.registry.CustomFileOpen(filename, mode='rb')

  Bases: `object`

  Custom context manager to fetch file contents depending on where the file is located.

class sasdata.data_util.registry.ExtensionRegistry

  Bases: `object`

  Associate a file loader with an extension.

  Note that there may be multiple loaders for the same extension.

  Example:

      registry = ExtensionRegistry()

      # Add an association by setting an element
      registry['.zip'] = unzip

      # Multiple extensions for one loader
      registry['.tgz'] = untar
      registry['.tar.gz'] = untar

      # Generic extensions to use after trying more specific extensions;
      # these will be checked after the more specific extensions fail.
      registry['.gz'] = gunzip

      # Multiple loaders for one extension
      registry['.cx'] = cx1
      registry['.cx'] = cx2
      registry['.cx'] = cx3

      # Show registered extensions
      print registry.extensions()

      # Can also register a format name for explicit control from caller
      registry['cx3'] = cx3
      print registry.formats()

      # Retrieve loaders for a file name
      registry.lookup('hello.cx') -> [cx3,cx2,cx1]

      # Run loader on a filename
      registry.load('hello.cx') ->
          try:
              return cx3('hello.cx')
          except:
              try:
                  return cx2('hello.cx')
              except:
                  return cx1('hello.cx')

      # Load in a specific format ignoring extension
      registry.load('hello.cx',format='cx3') ->
          return cx3('hello.cx')

  extensions() → List[str]

    Return a sorted list of registered extensions.

  formats() → List[str]

    Return a sorted list of the registered formats.

  load(path: str, ext: str | None = None) → List[Data1D | Data2D]

    Call the loader for a single file.

    Exceptions are stored in Data1D instances, with the errors in Data1D.errors

  lookup(path: str) → List[callable]

    Return the loader associated with the file type of path.

    Parameters:

      path – Data file path

    Returns:

      List of available readers for the file extension (maybe empty)

sasdata.data_util.registry.create_empty_data_with_errors(path: str | Path, errors: List[Exception])

  Create a Data1D instance that only holds errors and a filepath. This allows all file paths to return a common data type, regardless if the data loading was successful or a failure.