Skip to content

Commit 62a4ae8

Browse files
committed
Tidy up typing, use DI rather than protected attribute access.
1 parent c731ced commit 62a4ae8

File tree

5 files changed

+65
-51
lines changed

5 files changed

+65
-51
lines changed

src/infrablocks/invoke_terraform/invoke_executor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Iterable, Optional
1+
from typing import Iterable
22

33
from invoke.context import Context
44

@@ -11,6 +11,6 @@ def __init__(self, context: Context):
1111
self._context = context
1212

1313
def execute(
14-
self, command: Iterable[str], env: Optional[Environment] = None
14+
self, command: Iterable[str], env: Environment | None = None
1515
) -> None:
1616
self._context.run(" ".join(command), env=(env or {}))

src/infrablocks/invoke_terraform/task_factory.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
from collections.abc import Callable
12
from dataclasses import dataclass
2-
from typing import Callable, Optional
33

44
from invoke.collection import Collection
55
from invoke.context import Context
@@ -20,9 +20,9 @@ class InitConfiguration:
2020
class Configuration:
2121
source_directory: str
2222
variables: tf.Variables
23-
workspace: Optional[str]
23+
workspace: str | None
2424
init_configuration: InitConfiguration
25-
environment: Optional[Environment] = None
25+
environment: Environment | None = None
2626
auto_approve: bool = True
2727

2828
@staticmethod
@@ -44,8 +44,10 @@ def create_empty():
4444

4545

4646
class TaskFactory:
47-
def __init__(self):
48-
self._terraformFactory = TerraformFactory()
47+
def __init__(
48+
self, terraform_factory: TerraformFactory = TerraformFactory()
49+
):
50+
self._terraform_factory = terraform_factory
4951

5052
def create(
5153
self,
@@ -111,7 +113,7 @@ def _pre_command_setup(
111113
arguments,
112114
configuration,
113115
)
114-
terraform = self._terraformFactory.build(context)
116+
terraform = self._terraform_factory.build(context)
115117
terraform.init(
116118
chdir=configuration.source_directory,
117119
backend_config=configuration.init_configuration.backend_config,

src/infrablocks/invoke_terraform/terraform/__init__.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,10 @@
22
from .terraform import Executor as Executor
33
from .terraform import Terraform as Terraform
44

5-
__all__ = ["ConfigurationValue", "Variables", "BackendConfig"]
5+
__all__ = [
6+
"BackendConfig",
7+
"ConfigurationValue",
8+
"Executor",
9+
"Terraform",
10+
"Variables",
11+
]

src/infrablocks/invoke_terraform/terraform/terraform.py

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
1-
from typing import Dict, Iterable, List, Optional, Union
1+
from collections.abc import Mapping, Sequence
22

3-
type ConfigurationValue = Union[bool, int, float, str, None]
4-
type Variables = Dict[str, ConfigurationValue]
5-
type BackendConfig = Union[str, Dict[str, ConfigurationValue]]
6-
type Environment = Dict[str, str]
3+
type ConfigurationValue = bool | int | float | str | None
4+
type Variables = Mapping[str, ConfigurationValue]
5+
type BackendConfig = str | Mapping[str, ConfigurationValue]
6+
type Environment = Mapping[str, str]
77

88

99
class Executor:
10-
def execute(
11-
self, command: Iterable[str], env: Optional[Environment]
12-
) -> None:
10+
def execute(self, command: Sequence[str], env: Environment | None) -> None:
1311
raise Exception("NotImplementedException")
1412

1513

@@ -19,10 +17,10 @@ def __init__(self, executor: Executor):
1917

2018
def init(
2119
self,
22-
chdir: Optional[str] = None,
23-
backend_config: Optional[BackendConfig] = {},
24-
reconfigure: Optional[bool] = False,
25-
environment: Optional[Environment] = None,
20+
chdir: str | None = None,
21+
backend_config: BackendConfig | None = None,
22+
reconfigure: bool = False,
23+
environment: Environment | None = None,
2624
):
2725
base_command = self._build_base_command(chdir)
2826
command = (
@@ -38,9 +36,9 @@ def init(
3836

3937
def plan(
4038
self,
41-
chdir: Optional[str] = None,
42-
vars: Optional[Variables] = {},
43-
environment: Optional[Environment] = None,
39+
chdir: str | None = None,
40+
vars: Variables | None = None,
41+
environment: Environment | None = None,
4442
):
4543
base_command = self._build_base_command(chdir)
4644
command = base_command + ["plan"] + self._build_vars(vars)
@@ -49,10 +47,10 @@ def plan(
4947

5048
def apply(
5149
self,
52-
chdir: Optional[str] = None,
53-
vars: Optional[Variables] = {},
50+
chdir: str | None = None,
51+
vars: Variables | None = None,
5452
autoapprove: bool = False,
55-
environment: Optional[Environment] = None,
53+
environment: Environment | None = None,
5654
):
5755
base_command = self._build_base_command(chdir)
5856
autoapprove_flag = ["-auto-approve"] if autoapprove else []
@@ -68,9 +66,9 @@ def apply(
6866
def select_workspace(
6967
self,
7068
workspace: str,
71-
chdir: Optional[str] = None,
69+
chdir: str | None = None,
7270
or_create: bool = False,
73-
environment: Optional[Environment] = None,
71+
environment: Environment | None = None,
7472
):
7573
base_command = self._build_base_command(chdir)
7674
command = base_command + ["workspace", "select"]
@@ -83,16 +81,16 @@ def select_workspace(
8381
self._executor.execute(command, env=environment)
8482

8583
@staticmethod
86-
def _build_base_command(chdir: Optional[str]) -> List[str]:
84+
def _build_base_command(chdir: str | None) -> list[str]:
8785
command = ["terraform"]
8886

8987
if chdir is not None:
9088
return command + [f"-chdir={chdir}"]
9189

9290
return command
9391

94-
def _build_vars(self, variables: Optional[Variables]) -> List[str]:
95-
if not variables:
92+
def _build_vars(self, variables: Variables | None) -> list[str]:
93+
if variables is None:
9694
return []
9795

9896
return [
@@ -118,9 +116,9 @@ def _format_configuration_value(
118116
)
119117

120118
def _build_backend_config(
121-
self, backend_config: Optional[BackendConfig]
122-
) -> List[str]:
123-
if not backend_config:
119+
self, backend_config: BackendConfig | None
120+
) -> list[str]:
121+
if backend_config is None:
124122
return []
125123

126124
if isinstance(backend_config, str):

tests/unit/infrablocks/invoke_terraform/test_task_factory.py

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ def test_creates_plan_task(self):
3535

3636
def test_plan_does_not_use_workspace_when_not_set(self):
3737
terraform = Mock(spec=tf.Terraform)
38-
task_factory = TaskFactory()
39-
task_factory._terraformFactory = TerraformFactory(terraform)
38+
task_factory = TaskFactory(
39+
terraform_factory=TerraformFactory(terraform)
40+
)
4041

4142
def pre_task_function(_context, _, configuration: Configuration):
4243
configuration.source_directory = "/some/path"
@@ -51,8 +52,9 @@ def pre_task_function(_context, _, configuration: Configuration):
5152

5253
def test_plan_uses_workspace_when_set(self):
5354
terraform = Mock(spec=tf.Terraform)
54-
task_factory = TaskFactory()
55-
task_factory._terraformFactory = TerraformFactory(terraform)
55+
task_factory = TaskFactory(
56+
terraform_factory=TerraformFactory(terraform)
57+
)
5658
workspace = "workspace"
5759
source_directory = "/some/path"
5860

@@ -71,8 +73,9 @@ def pre_task_function(_context, _, configuration: Configuration):
7173

7274
def test_plan_initialises_with_reconfigure(self):
7375
terraform = Mock(spec=tf.Terraform)
74-
task_factory = TaskFactory()
75-
task_factory._terraformFactory = TerraformFactory(terraform)
76+
task_factory = TaskFactory(
77+
terraform_factory=TerraformFactory(terraform)
78+
)
7679
source_directory = "/some/path"
7780

7881
def pre_task_function(_context, _, configuration: Configuration):
@@ -93,8 +96,9 @@ def pre_task_function(_context, _, configuration: Configuration):
9396

9497
def test_plan_invokes_init_and_plan(self):
9598
terraform = Mock(spec=tf.Terraform)
96-
task_factory = TaskFactory()
97-
task_factory._terraformFactory = TerraformFactory(terraform)
99+
task_factory = TaskFactory(
100+
terraform_factory=TerraformFactory(terraform)
101+
)
98102
source_directory = "/some/path"
99103
variables: tf.Variables = {"foo": 1}
100104
backend_config: tf.BackendConfig = {"path": "state_file.tfstate"}
@@ -121,8 +125,9 @@ def pre_task_function(_context, _, configuration: Configuration):
121125

122126
def test_plan_uses_environment_in_all_commands_when_set(self):
123127
terraform = Mock(spec=tf.Terraform)
124-
task_factory = TaskFactory()
125-
task_factory._terraformFactory = TerraformFactory(terraform)
128+
task_factory = TaskFactory(
129+
terraform_factory=TerraformFactory(terraform)
130+
)
126131
source_directory = "/some/path"
127132
environment = {"ENV_VAR": "value"}
128133
workspace = "workspace"
@@ -166,8 +171,9 @@ def test_creates_apply_task(self):
166171

167172
def test_apply_invokes_init_and_apply(self):
168173
terraform = Mock(spec=tf.Terraform)
169-
task_factory = TaskFactory()
170-
task_factory._terraformFactory = TerraformFactory(terraform)
174+
task_factory = TaskFactory(
175+
terraform_factory=TerraformFactory(terraform)
176+
)
171177
source_directory = "/some/path"
172178
variables: tf.Variables = {"foo": 1}
173179
backend_config: tf.BackendConfig = {"path": "state_file.tfstate"}
@@ -197,8 +203,9 @@ def pre_task_function(_context, _, configuration: Configuration):
197203

198204
def test_apply_uses_workspace(self):
199205
terraform = Mock(spec=tf.Terraform)
200-
task_factory = TaskFactory()
201-
task_factory._terraformFactory = TerraformFactory(terraform)
206+
task_factory = TaskFactory(
207+
terraform_factory=TerraformFactory(terraform)
208+
)
202209
workspace = "workspace"
203210
source_directory = "/some/path"
204211

@@ -217,8 +224,9 @@ def pre_task_function(_context, _, configuration: Configuration):
217224

218225
def test_apply_uses_environment_in_all_commands_when_set(self):
219226
terraform = Mock(spec=tf.Terraform)
220-
task_factory = TaskFactory()
221-
task_factory._terraformFactory = TerraformFactory(terraform)
227+
task_factory = TaskFactory(
228+
terraform_factory=TerraformFactory(terraform)
229+
)
222230
source_directory = "/some/path"
223231
environment = {"ENV_VAR": "value"}
224232
workspace = "workspace"

0 commit comments

Comments
 (0)