Skip to content

Commit 74e773f

Browse files
committed
DRY Parameter, Equation, Variable
* Spell out signature of create() to give proper type hints
1 parent 78d6134 commit 74e773f

File tree

9 files changed

+59
-92
lines changed

9 files changed

+59
-92
lines changed

ixmp4/core/optimization/equation.py

+13-31
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from collections.abc import Iterable
21
from datetime import datetime
32
from typing import TYPE_CHECKING, Any, ClassVar
43

@@ -10,12 +9,14 @@
109
# TODO Import this from typing when dropping Python 3.11
1110
from typing_extensions import Unpack
1211

13-
from ixmp4.core.base import BaseFacade, BaseModelFacade
12+
from ixmp4.core.base import BaseModelFacade
1413
from ixmp4.data.abstract import Docs as DocsModel
1514
from ixmp4.data.abstract import Equation as EquationModel
1615
from ixmp4.data.abstract import Run
1716
from ixmp4.data.abstract.optimization import Column
1817

18+
from .base import Creator, Lister, Retriever, Tabulator
19+
1920

2021
class Equation(BaseModelFacade):
2122
_model: EquationModel
@@ -106,44 +107,25 @@ def __str__(self) -> str:
106107
return f"<Equation {self.id} name={self.name}>"
107108

108109

109-
class EquationRepository(BaseFacade):
110-
_run: Run
111-
110+
class EquationRepository(
111+
Creator[Equation, EquationModel],
112+
Retriever[Equation, EquationModel],
113+
Lister[Equation, EquationModel],
114+
Tabulator[Equation, EquationModel],
115+
):
112116
def __init__(self, _run: Run, **kwargs: Unpack["InitKwargs"]) -> None:
113-
super().__init__(**kwargs)
114-
self._run = _run
117+
super().__init__(_run=_run, **kwargs)
118+
self._backend_repository = self.backend.optimization.equations
119+
self._model_type = Equation
115120

116121
def create(
117122
self,
118123
name: str,
119124
constrained_to_indexsets: list[str],
120125
column_names: list[str] | None = None,
121126
) -> Equation:
122-
model = self.backend.optimization.equations.create(
127+
return super().create(
123128
name=name,
124-
run_id=self._run.id,
125129
constrained_to_indexsets=constrained_to_indexsets,
126130
column_names=column_names,
127131
)
128-
return Equation(_backend=self.backend, _model=model)
129-
130-
def get(self, name: str) -> Equation:
131-
model = self.backend.optimization.equations.get(run_id=self._run.id, name=name)
132-
return Equation(_backend=self.backend, _model=model)
133-
134-
def list(self, name: str | None = None) -> Iterable[Equation]:
135-
equations = self.backend.optimization.equations.list(
136-
run_id=self._run.id, name=name
137-
)
138-
return [
139-
Equation(
140-
_backend=self.backend,
141-
_model=i,
142-
)
143-
for i in equations
144-
]
145-
146-
def tabulate(self, name: str | None = None) -> pd.DataFrame:
147-
return self.backend.optimization.equations.tabulate(
148-
run_id=self._run.id, name=name
149-
)

ixmp4/core/optimization/indexset.py

+3
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,6 @@ def __init__(self, _run: Run, **kwargs: Unpack["InitKwargs"]) -> None:
9191
super().__init__(_run=_run, **kwargs)
9292
self._backend_repository = self.backend.optimization.indexsets
9393
self._model_type = IndexSet
94+
95+
def create(self, name: str) -> IndexSet:
96+
return super().create(name=name)

ixmp4/core/optimization/parameter.py

+13-31
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from collections.abc import Iterable
21
from datetime import datetime
32
from typing import TYPE_CHECKING, Any, ClassVar
43

@@ -10,12 +9,14 @@
109
# TODO Import this from typing when dropping Python 3.11
1110
from typing_extensions import Unpack
1211

13-
from ixmp4.core.base import BaseFacade, BaseModelFacade
12+
from ixmp4.core.base import BaseModelFacade
1413
from ixmp4.data.abstract import Docs as DocsModel
1514
from ixmp4.data.abstract import Parameter as ParameterModel
1615
from ixmp4.data.abstract import Run, Unit
1716
from ixmp4.data.abstract.optimization import Column
1817

18+
from .base import Creator, Lister, Retriever, Tabulator
19+
1920

2021
class Parameter(BaseModelFacade):
2122
_model: ParameterModel
@@ -99,44 +100,25 @@ def __str__(self) -> str:
99100
return f"<Parameter {self.id} name={self.name}>"
100101

101102

102-
class ParameterRepository(BaseFacade):
103-
_run: Run
104-
103+
class ParameterRepository(
104+
Creator[Parameter, ParameterModel],
105+
Retriever[Parameter, ParameterModel],
106+
Lister[Parameter, ParameterModel],
107+
Tabulator[Parameter, ParameterModel],
108+
):
105109
def __init__(self, _run: Run, **kwargs: Unpack["InitKwargs"]) -> None:
106-
super().__init__(**kwargs)
107-
self._run = _run
110+
super().__init__(_run=_run, **kwargs)
111+
self._backend_repository = self.backend.optimization.parameters
112+
self._model_type = Parameter
108113

109114
def create(
110115
self,
111116
name: str,
112117
constrained_to_indexsets: list[str],
113118
column_names: list[str] | None = None,
114119
) -> Parameter:
115-
model = self.backend.optimization.parameters.create(
120+
return super().create(
116121
name=name,
117-
run_id=self._run.id,
118122
constrained_to_indexsets=constrained_to_indexsets,
119123
column_names=column_names,
120124
)
121-
return Parameter(_backend=self.backend, _model=model)
122-
123-
def get(self, name: str) -> Parameter:
124-
model = self.backend.optimization.parameters.get(run_id=self._run.id, name=name)
125-
return Parameter(_backend=self.backend, _model=model)
126-
127-
def list(self, name: str | None = None) -> Iterable[Parameter]:
128-
parameters = self.backend.optimization.parameters.list(
129-
run_id=self._run.id, name=name
130-
)
131-
return [
132-
Parameter(
133-
_backend=self.backend,
134-
_model=i,
135-
)
136-
for i in parameters
137-
]
138-
139-
def tabulate(self, name: str | None = None) -> pd.DataFrame:
140-
return self.backend.optimization.parameters.tabulate(
141-
run_id=self._run.id, name=name
142-
)

ixmp4/core/optimization/table.py

+12
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,15 @@ def __init__(self, _run: Run, **kwargs: Unpack["InitKwargs"]) -> None:
9898
super().__init__(_run=_run, **kwargs)
9999
self._backend_repository = self.backend.optimization.tables
100100
self._model_type = Table
101+
102+
def create(
103+
self,
104+
name: str,
105+
constrained_to_indexsets: list[str],
106+
column_names: list[str] | None = None,
107+
) -> Table:
108+
return super().create(
109+
name=name,
110+
constrained_to_indexsets=constrained_to_indexsets,
111+
column_names=column_names,
112+
)

ixmp4/core/optimization/variable.py

+11-28
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from collections.abc import Iterable
21
from datetime import datetime
32
from typing import TYPE_CHECKING, Any, ClassVar
43

@@ -10,12 +9,14 @@
109
# TODO Import this from typing when dropping Python 3.11
1110
from typing_extensions import Unpack
1211

13-
from ixmp4.core.base import BaseFacade, BaseModelFacade
12+
from ixmp4.core.base import BaseModelFacade
1413
from ixmp4.data.abstract import Docs as DocsModel
1514
from ixmp4.data.abstract import OptimizationVariable as VariableModel
1615
from ixmp4.data.abstract import Run
1716
from ixmp4.data.abstract.optimization import Column
1817

18+
from .base import Lister, Retriever, Tabulator
19+
1920

2021
class Variable(BaseModelFacade):
2122
_model: VariableModel
@@ -110,12 +111,15 @@ def __str__(self) -> str:
110111
return f"<Variable {self.id} name={self.name}>"
111112

112113

113-
class VariableRepository(BaseFacade):
114-
_run: Run
115-
114+
class VariableRepository(
115+
Retriever[Variable, VariableModel],
116+
Lister[Variable, VariableModel],
117+
Tabulator[Variable, VariableModel],
118+
):
116119
def __init__(self, _run: Run, **kwargs: Unpack["InitKwargs"]) -> None:
117-
super().__init__(**kwargs)
118-
self._run = _run
120+
super().__init__(_run=_run, **kwargs)
121+
self._backend_repository = self.backend.optimization.variables
122+
self._model_type = Variable
119123

120124
def create(
121125
self,
@@ -130,24 +134,3 @@ def create(
130134
column_names=column_names,
131135
)
132136
return Variable(_backend=self.backend, _model=model)
133-
134-
def get(self, name: str) -> Variable:
135-
model = self.backend.optimization.variables.get(run_id=self._run.id, name=name)
136-
return Variable(_backend=self.backend, _model=model)
137-
138-
def list(self, name: str | None = None) -> Iterable[Variable]:
139-
variables = self.backend.optimization.variables.list(
140-
run_id=self._run.id, name=name
141-
)
142-
return [
143-
Variable(
144-
_backend=self.backend,
145-
_model=i,
146-
)
147-
for i in variables
148-
]
149-
150-
def tabulate(self, name: str | None = None) -> pd.DataFrame:
151-
return self.backend.optimization.variables.tabulate(
152-
run_id=self._run.id, name=name
153-
)

ixmp4/data/abstract/optimization/base.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,7 @@
2020
class CreateKwargs(TypedDict, total=False):
2121
value: float
2222
unit: str | Unit | None
23-
# TODO But how do we now show in core layer that e.g. Table needs these?
24-
constrained_to_indexsets: list[str]
23+
constrained_to_indexsets: str | list[str] | None
2524
column_names: list[str] | None
2625

2726

ixmp4/data/abstract/optimization/equation.py

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
from .. import base
1515
from ..docs import DocsRepository
16+
from .base import BackendBaseRepository
1617
from .column import Column
1718

1819

@@ -39,6 +40,7 @@ def __str__(self) -> str:
3940

4041

4142
class EquationRepository(
43+
BackendBaseRepository[Equation],
4244
base.Creator,
4345
base.Retriever,
4446
base.Enumerator,

ixmp4/data/abstract/optimization/parameter.py

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
from .. import base
1515
from ..docs import DocsRepository
16+
from .base import BackendBaseRepository
1617
from .column import Column
1718

1819

@@ -39,6 +40,7 @@ def __str__(self) -> str:
3940

4041

4142
class ParameterRepository(
43+
BackendBaseRepository[Parameter],
4244
base.Creator,
4345
base.Retriever,
4446
base.Enumerator,

ixmp4/data/abstract/optimization/variable.py

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
from .. import base
1414
from ..docs import DocsRepository
15+
from .base import BackendBaseRepository
1516
from .column import Column
1617

1718

@@ -38,6 +39,7 @@ def __str__(self) -> str:
3839

3940

4041
class VariableRepository(
42+
BackendBaseRepository[Variable],
4143
base.Creator,
4244
base.Retriever,
4345
base.Enumerator,

0 commit comments

Comments
 (0)