Source code for kalasiris.pysis
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""Makes the 'regular' ISIS functions return what pysis did.
If you have old code that was built with pysis and is doing this::
from pysis import isis
value = isis.getkey(from_='W1467351325_4.map.cal.cub',
keyword='minimumringradius',
grp='mapping')
And you want to start using kalasiris, but don't want to overhaul
a bunch of code, you can just change the import line like so::
import kalasiris.pysis as isis
value = isis.getkey(from_='W1467351325_4.map.cal.cub',
keyword='minimumringradius',
grp='mapping')
And you should be good to go. Note that this works for calls to
ISIS programs, but does not provide the pysis IsisPool functionality,
nor any of the non-ISIS pysis functions or classes, like ``pysis.cubefile``,
``pysis.specialpixels``, etc.
"""
# Copyright 2015, William Trevor Olson
# Copyright 2020, Ross A. Beyer (rbeyer@seti.org)
#
# Reuse is permitted under the terms of the license.
# The AUTHORS file and the LICENSE file are at the
# top level of this library.
import subprocess
import sys
import kalasiris as kala
from .kalasiris import _get_isis_program_names as gipn
[docs]
class IsisException(Exception):
"""Base exception for pysis errors."""
[docs]
class ProcessError(IsisException):
"""This exception is raised when an ISIS process returns a non-zero
exit status."""
def __init__(self, returncode, cmd, stdout, stderr):
self.returncode = returncode
self.cmd = cmd
self.stdout = stdout
self.stderr = stderr
msg = f"Command {self.cmd} returned non-zero exit " f"status {self.returncode}."
super(ProcessError, self).__init__(msg)
def _build_pysis_fn(fn_name: str):
"""This factory builds a simple function call to wrap
kalasiris function calls for pysis return types and
pysis Exception types."""
# Define the structure:
def pysis_fn(*args, **kwargs):
__name__ = fn_name # noqa: F841
__doc__ = f"Runs ISIS {fn_name}" # noqa: F841
try:
kala_fn = getattr(kala, fn_name)
return kala_fn(*args, **kwargs).stdout.encode()
except subprocess.CalledProcessError as err:
raise ProcessError(err.returncode, err.cmd, err.stdout, err.stderr)
# Then add it by name to the enclosing module, pysis.
setattr(sys.modules[__name__], fn_name, pysis_fn)
for p in gipn():
_build_pysis_fn(p)