Source code for memote.suite.collect

# -*- coding: utf-8 -*-

# Copyright 2017 Novo Nordisk Foundation Center for Biosustainability,
# Technical University of Denmark.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Collect results for reporting model quality."""

from __future__ import absolute_import

import os
import platform
import logging

from builtins import dict
from datetime import datetime

import pytest
import pip

from memote.support.helpers import find_biomass_reaction

LOGGER = logging.getLogger(__name__)


[docs]class ResultCollectionPlugin(object): """ Provide functionality for complex test result collection. The plugin exposes the fixture ``store`` which can be used in test functions to store values in a dictionary. The dictionary is namespaced to the module so within a module the same keys should not be re-used (unless intended). """ def __init__(self, model, repository=None, branch=None, commit=None, **kwargs): """ Collect and store values during testing. Parameters ---------- model : cobra.Model The metabolic model under investigation. repository : git.Repo, optional An instance of the git repository (if any). branch : str, optional The name of the git branch to use. commit : str, optional The specific commit hash that is being tested. """ super(ResultCollectionPlugin, self).__init__(**kwargs) self._model = model self._store = dict() self._store["meta"] = self._meta = dict() self._store["report"] = self._data = dict() self.repo = repository self.branch = branch self.commit = commit self._collect_meta_info() def _collect_meta_info(self): """Record environment information.""" os.environ["BIOMASS_REACTIONS"] = "|".join([ rxn.id for rxn in find_biomass_reaction(self._model)]) self._meta["platform"] = platform.system() self._meta["release"] = platform.release() self._meta["python"] = platform.python_version() self._meta["packages"] = dict( (dist.project_name, dist.version) for dist in pip.get_installed_distributions()) self._meta["timestamp"] = datetime.utcnow().isoformat(" ") if self.repo is not None: self._collect_git_info() def _collect_git_info(self): """Record repository meta information.""" if self.branch is None: try: self.branch = self.repo.active_branch except TypeError: LOGGER.error( "Detached HEAD mode, please provide the branch name and" " commit hash.") except AttributeError: LOGGER.error("No git repository found.") if self.branch is not None: self._meta["branch"] = self.branch.name if self.commit is None: try: self.commit = self.branch.commit except AttributeError: LOGGER.error("No git repository found.") if self.commit is not None: self._meta["commit_author"] = self.commit.author.name self._meta["timestamp"] = self.commit.committed_datetime.isoformat( " ") self._meta["commit_hash"] = self.commit.hexsha @property def results(self): """Return the test results as a nested dictionary.""" return self._store @pytest.fixture(scope="session")
[docs] def read_only_model(self): """Provide the model for the complete test session.""" return self._model
@pytest.fixture(scope="function")
[docs] def model(self, read_only_model): """Provide a pristine model for a test unit.""" return self._model.copy()
@pytest.fixture(scope="module")
[docs] def store(self, request): """Expose a `dict` to store values on.""" LOGGER.debug("requested in '%s'", request.module.__name__) self._data[request.module.__name__] = dict() return self._data[request.module.__name__]