Commit ea04b91b authored by Patrick Shriwise's avatar Patrick Shriwise
Browse files

Adding option for .pygriffin.rc file in user's home dir. Adding customization...

Adding option for .pygriffin.rc file in user's home dir. Adding customization of mpi executable location.
parent bfdbba94
Loading
Loading
Loading
Loading
+36 −2
Original line number Diff line number Diff line
@@ -25,9 +25,18 @@ class PyGriffinConfig:
    """

    __MOD_PATH = Path(__file__).parent.absolute()

    if Path(os.path.expanduser('~/.pygriffin.rc')).exists():
        _RC_FILE = Path(os.path.expanduser('~')) / '.pygriffin.rc'
    elif Path(__MOD_PATH.parent / '.pygriffin.rc').exists():
        _RC_FILE = __MOD_PATH.parent / '.pygriffin.rc'
    else:
        raise RuntimeError('PyGriffin config file (.pygriffin.rc) could not be found.')

    def __init__(self, griffin_exec=None, isoxml_exec=None):
    def __init__(self,
                 griffin_exec=None,
                 isoxml_exec=None,
                 mpi_exec=None):

        # always read the config file,
        # even if we don't use it
@@ -73,6 +82,18 @@ class PyGriffinConfig:

        self.detect_mpi()

        # check for a user-defined MPI executable path
        # in the config file

        if self.mpi_enabled:
            user_mpi_exec = self.get_path('exec', 'mpi')
            if user_mpi_exec is not None:
                self.mpi_exec = user_mpi_exec
            elif mpi_exec is not None:
                self.mpi_exec = mpi_exec
            else:
                self._mpi_exec = 'mpirun'

    def get(self, *args, **kwargs):
        """
        Attempts to get a configuration option from the .rc file.
@@ -90,6 +111,9 @@ class PyGriffinConfig:
        Relative paths are assumed to be relative to the configuration file.
        """
        val = self.get(*args, **kwargs)
        if val is None:
            return val
        # determine path
        path = Path(val)
        if not path.is_absolute():
            path = self._RC_FILE.parent / path
@@ -137,6 +161,16 @@ class PyGriffinConfig:
        cv.check_type('MPI enabled', val, bool)
        self._mpi_enabled = val

    @property
    def mpi_exec(self):
        return self._mpi_exec

    @mpi_exec.setter
    def mpi_exec(self, val):
        self._mpi_exec = cv.check_file('MPI executable',
                                       val,
                                       must_exist=True)

    @griffin_exec.setter
    def griffin_exec(self, val):
        self._griffin_exec = cv.check_file('Griffin executable path',
+1 −1
Original line number Diff line number Diff line
@@ -57,7 +57,7 @@ class PyGriffin:

        if self.n_procs > 1:
            if self.config.mpi_enabled:
                cmd += ['mpirun', '-n', str(self.n_procs)]
                cmd += [self.mpi_exec, '-n', str(self.n_procs)]
            else:
                msg = ("MPI is not enabled for this Griffin executable. "
                       "The n_procs argument will be ignored.")
+2 −1
Original line number Diff line number Diff line
[exec]
griffin = griffin_mock
isoxml = isoxml_mock
mpi = mpi_mock
 No newline at end of file

tests/mpi_mock

0 → 100644
+0 −0

Empty file added.

+15 −9
Original line number Diff line number Diff line
@@ -5,9 +5,11 @@ from pathlib import Path

from pygriffin import PyGriffinConfig

_CWD = Path(__file__).parent.absolute()
_GRIFFIN_MOCK_PATH = _CWD / 'griffin_mock'
_ISOXML_MOCK_PATH = _CWD / 'isoxml_mock'
_TEST_DIR = Path(__file__).parent.absolute()
_GRIFFIN_MOCK_PATH = _TEST_DIR / 'griffin_mock'
_ISOXML_MOCK_PATH = _TEST_DIR / 'isoxml_mock'
_MPI_MOCK_PATH = _TEST_DIR / 'mpi_mock'


def test_griffin_config_fail():
    # expect failure because no configuration is provided
@@ -20,6 +22,8 @@ def test_griffin_config_fail():
            del os.environ['ISOXML_EXEC']
        config = PyGriffinConfig()

        # quick check for default MPI exec value
        assert config.mpi_exec == 'mpirun'

    # expect failure because the griffin executable isn't a valid file
    with pytest.raises(ValueError) as e_info:
@@ -30,18 +34,21 @@ def test_griffin_config_fail():

def test_griffin_exec_direct():
    config = PyGriffinConfig(griffin_exec=_GRIFFIN_MOCK_PATH,
                             isoxml_exec=_ISOXML_MOCK_PATH)
                             isoxml_exec=_ISOXML_MOCK_PATH,
                             mpi_exec=_MPI_MOCK_PATH)
    assert config.griffin_exec == _GRIFFIN_MOCK_PATH
    assert config.isoxml_exec == _ISOXML_MOCK_PATH
    assert config.griffin_dir == _CWD
    assert config.mpi_exec == _MPI_MOCK_PATH
    assert config.griffin_dir == _TEST_DIR


def test_griffin_exec_config():
    PyGriffinConfig._RC_FILE = _CWD / '.pygriffin.test.rc'
    PyGriffinConfig._RC_FILE = _TEST_DIR / '.pygriffin.test.rc'
    config = PyGriffinConfig()
    assert config.griffin_exec == _GRIFFIN_MOCK_PATH
    assert config.isoxml_exec == _ISOXML_MOCK_PATH
    assert config.griffin_dir == _CWD
    assert config.mpi_exec == _MPI_MOCK_PATH
    assert config.griffin_dir == _TEST_DIR


def test_griffin_env_config():
@@ -50,8 +57,7 @@ def test_griffin_env_config():
    config = PyGriffinConfig()
    assert config.griffin_exec == _GRIFFIN_MOCK_PATH
    assert config.isoxml_exec == _ISOXML_MOCK_PATH
    assert config.griffin_dir == _CWD

    assert config.griffin_dir == _TEST_DIR

if __name__ == "__main__":
    pytest.main()