File: conftest.py

package info (click to toggle)
python-cobra 0.29.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 11,512 kB
  • sloc: python: 14,703; xml: 12,841; makefile: 137; sh: 32
file content (171 lines) | stat: -rw-r--r-- 5,070 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
"""Define global fixtures."""

import importlib.resources
from pathlib import Path
from pickle import load as _load
from typing import List, Tuple

import pytest

import cobra
from cobra import Metabolite, Model, Reaction, Solution
from cobra.io import read_sbml_model
from cobra.util import solver as sutil


data_dir = Path(__file__).parent / "data"
cobra_data_dir = importlib.resources.files(cobra.data)


def create_test_model(model_name: str = "salmonella") -> Model:
    """Return a cobra model for testing.

    Parameters
    ----------
    model_name: str
        One of 'ecoli', 'textbook', or 'salmonella', or the
        path to a pickled cobra.Model .

    Returns
    -------
    cobra.Model
        The cobra model.

    Raises
    ------
    OSError
        If no file is found at the path specified by `model_name`.

    """
    if model_name == "ecoli":
        ecoli_sbml = str((cobra_data_dir / "iJO1366.xml.gz").resolve())
        return read_sbml_model(ecoli_sbml)
    elif model_name == "textbook":
        textbook_sbml = str((cobra_data_dir / "textbook.xml.gz").resolve())
        return read_sbml_model(textbook_sbml)
    elif model_name == "mini":
        mini_sbml = str((data_dir / "mini_fbc2.xml").resolve())
        return read_sbml_model(mini_sbml)
    elif model_name == "salmonella":
        salmonella_pickle = str((data_dir / "salmonella.pickle").resolve())
        model_name = salmonella_pickle
    with open(model_name, mode="rb") as infile:
        return _load(infile)


@pytest.fixture(scope="session")
def data_directory() -> Path:
    """Provide session-level fixture for test data directory."""
    return data_dir


@pytest.fixture(scope="session")
def cobra_data_directory() -> Path:
    """Provide session-level fixture for cobra data directory."""
    return Path(cobra_data_dir)


@pytest.fixture(scope="session")
def empty_once() -> Model:
    """Provide session-level fixture for empty model."""
    return Model()


@pytest.fixture(scope="function")
def empty_model(empty_once: Model) -> Model:
    """Provide function-level fixture for empty model."""
    return empty_once.copy()


@pytest.fixture(scope="session")
def small_model() -> Model:
    """Provide session-level fixture for textbook model."""
    return create_test_model("textbook")


@pytest.fixture(scope="function")
def model(small_model: Model) -> Model:
    """Provide function-level fixture for textbook model."""
    return small_model.copy()


@pytest.fixture(scope="session")
def large_once() -> Model:
    """Provide session-level fixture for ecoli model."""
    return create_test_model("ecoli")


@pytest.fixture(scope="function")
def large_model(large_once: Model) -> Model:
    """Provide function-level fixture for ecoli model."""
    return large_once.copy()


@pytest.fixture(scope="session")
def medium_model() -> Model:
    """Provide session-level fixture for salmonella model."""
    return create_test_model("salmonella")


@pytest.fixture(scope="function")
def salmonella(medium_model: Model) -> Model:
    """Provide function-level fixture for salmonella model."""
    return medium_model.copy()


@pytest.fixture(scope="function")
def solved_model(data_directory: Path) -> Tuple[Solution, Model]:
    """Provide function-level fixture for solved textbook model."""
    model = create_test_model("textbook")
    with (data_directory / "textbook_solution.pickle").open(mode="rb") as infile:
        solution = _load(infile)
    return solution, model


@pytest.fixture(scope="session")
def tiny_toy_model() -> Model:
    """Provide session-level fixture for tiny toy model."""
    tiny = Model("Toy Model")
    m1 = Metabolite("M1")
    d1 = Reaction("ex1")
    d1.add_metabolites({m1: -1})
    d1.upper_bound = 0
    d1.lower_bound = -1000
    tiny.add_reactions([d1])
    tiny.objective = "ex1"
    return tiny


stable_optlang = ["glpk", "cplex", "gurobi"]
all_solvers = ["optlang-" + s for s in stable_optlang if s in sutil.solvers]


@pytest.fixture(params=all_solvers, scope="session")
def opt_solver(request: pytest.FixtureRequest) -> str:
    """Provide session-level fixture for parametrized optlang solver names."""
    return request.param


@pytest.fixture(scope="function")
def metabolites(model: Model, request: pytest.FixtureRequest) -> List[Metabolite]:
    """Provide function-level fixture for metabolite set based on `request`."""
    if request.param == "exchange":
        return [
            met
            for met in model.metabolites
            if met.compartment == "e" and "EX_" + met.id not in model.reactions
        ]
    elif request.param == "demand":
        return [
            met
            for met in model.metabolites
            if met.compartment == "c" and "DM_" + met.id not in model.reactions
        ]
    elif request.param == "sink":
        return [
            met
            for met in model.metabolites
            if met.compartment == "c" and "SK_" + met.id not in model.reactions
        ]
    else:
        raise ValueError("Unknown metabolites {}".format(request.param))