Skip to content

Commit 9672200

Browse files
committed
Remove Optional and Union type hint
1 parent b622f50 commit 9672200

64 files changed

Lines changed: 306 additions & 325 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

docs/update_state_diagram.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import ast
22
import os
3-
from typing import List, Optional
3+
from typing import List
44

55
from python_to_mermaid import MermaidDiagram
66

77

8-
def get_imports(source_code: str) -> tuple[Optional[str], list]:
8+
def get_imports(source_code: str) -> tuple[str | None, list]:
99
own_class_name = None
1010
imported_states = []
1111
tree = ast.parse(source_code)

src/isar/apis/api.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from datetime import datetime, timezone
44
from http import HTTPStatus
55
from logging import Logger
6-
from typing import Any, List, Union
6+
from typing import Any, List
77

88
import click
99
import uvicorn
@@ -82,7 +82,7 @@ def _create_app(self) -> FastAPI:
8282
)
8383

8484
if self.authenticator.should_authenticate():
85-
backend_cors_origins: List[Union[str, AnyHttpUrl]] = [
85+
backend_cors_origins: List[str | AnyHttpUrl] = [
8686
f"http://{self.host}:{self.port}"
8787
]
8888

src/isar/apis/models/models.py

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

33
from alitra import Frame, Orientation, Pose, Position
44
from pydantic import BaseModel, Field
@@ -8,8 +8,8 @@
88

99
class TaskResponse(BaseModel):
1010
id: str
11-
tag_id: Optional[str] = None
12-
inspection_id: Optional[str] = None
11+
tag_id: str | None = None
12+
inspection_id: str | None = None
1313
type: TaskTypes
1414

1515

@@ -20,23 +20,23 @@ class StartMissionResponse(BaseModel):
2020

2121
class ControlMissionResponse(BaseModel):
2222
success: bool
23-
failure_reason: Optional[str] = None
23+
failure_reason: str | None = None
2424

2525

2626
class MissionStartResponse(BaseModel):
27-
mission_id: Optional[str] = None
27+
mission_id: str | None = None
2828
mission_started: bool
29-
mission_not_started_reason: Optional[str] = None
29+
mission_not_started_reason: str | None = None
3030

3131

3232
class LockdownResponse(BaseModel):
3333
lockdown_started: bool
34-
failure_reason: Optional[str] = None
34+
failure_reason: str | None = None
3535

3636

3737
class MaintenanceResponse(BaseModel):
3838
is_maintenance_mode: bool
39-
failure_reason: Optional[str] = None
39+
failure_reason: str | None = None
4040

4141

4242
class RobotInfoResponse(BaseModel):

src/isar/apis/models/start_mission_definition.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import time
22
from enum import Enum
3-
from typing import List, Optional
3+
from typing import List
44
from uuid import uuid4
55

66
from pydantic import BaseModel, Field
@@ -38,28 +38,28 @@ class TaskType(str, Enum):
3838
class StartMissionInspectionDefinition(BaseModel):
3939
type: InspectionTypes = Field(default=InspectionTypes.image)
4040
inspection_target: InputPosition
41-
inspection_description: Optional[str] = None
42-
duration: Optional[float] = None
41+
inspection_description: str | None = None
42+
duration: float | None = None
4343

4444

4545
class StartMissionTaskDefinition(BaseModel):
46-
id: Optional[str] = None
46+
id: str | None = None
4747
type: TaskType = Field(default=TaskType.Inspection)
4848
pose: InputPose
49-
inspection: Optional[StartMissionInspectionDefinition] = None
50-
tag: Optional[str] = None
51-
zoom: Optional[ZoomDescription] = None
49+
inspection: StartMissionInspectionDefinition | None = None
50+
tag: str | None = None
51+
zoom: ZoomDescription | None = None
5252

5353

5454
class StartMissionDefinition(BaseModel):
55-
id: Optional[str] = None
55+
id: str | None = None
5656
tasks: List[StartMissionTaskDefinition]
57-
name: Optional[str] = None
58-
start_pose: Optional[InputPose] = None
57+
name: str | None = None
58+
start_pose: InputPose | None = None
5959

6060

6161
class StopMissionDefinition(BaseModel):
62-
mission_id: Optional[str] = None
62+
mission_id: str | None = None
6363

6464

6565
class MissionFormatError(Exception):

src/isar/apis/robot_control/robot_controller.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import logging
2-
from typing import Optional
32

43
from fastapi import HTTPException
54
from opentelemetry import trace
@@ -22,9 +21,7 @@ def __init__(
2221

2322
@tracer.start_as_current_span("generate_media_config")
2423
def generate_media_config(self) -> MediaConfig:
25-
media_config: Optional[MediaConfig] = (
26-
self.robot_utilities.generate_media_config()
27-
)
24+
media_config: MediaConfig | None = self.robot_utilities.generate_media_config()
2825
if media_config is None:
2926
raise HTTPException(
3027
status_code=204,

src/isar/apis/security/authentication.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import logging
2-
from typing import Any, Callable, Coroutine, Type, Union
2+
from typing import Any, Callable, Coroutine, Type
33

44
from fastapi import Depends
55
from fastapi.security.base import SecurityBase
@@ -56,7 +56,7 @@ def should_authenticate(self) -> bool:
5656

5757
def get_scheme(
5858
self,
59-
) -> Union[Callable[[Any], Coroutine[Any, Any, None]], Type[NoSecurity]]:
59+
) -> Callable[[Any], Coroutine[Any, Any, None]] | Type[NoSecurity]:
6060
if self.should_authenticate():
6161
return validate_has_role
6262
return NoSecurity

src/isar/eventhandlers/eventhandler.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from copy import deepcopy
55
from dataclasses import dataclass
66
from threading import Event as ThreadEvent
7-
from typing import TYPE_CHECKING, Any, Callable, Generic, List, Optional, TypeVar
7+
from typing import TYPE_CHECKING, Any, Callable, Generic, List, TypeVar
88

99
from isar.config.settings import settings
1010
from isar.models.events import Event
@@ -20,15 +20,15 @@
2020
class EventHandlerMapping(Generic[T]):
2121
name: str
2222
event: Event[T]
23-
handler: Callable[[T], Optional[Transition]]
23+
handler: Callable[[T], Transition | None]
2424
should_not_consume: bool = False
2525

2626

2727
@dataclass
2828
class TimeoutHandlerMapping:
2929
name: str
3030
timeout_in_seconds: float
31-
handler: Callable[[], Optional[Transition]]
31+
handler: Callable[[], Transition | None]
3232

3333

3434
if TYPE_CHECKING:
@@ -55,7 +55,7 @@ def __init__(
5555

5656
def get_event_handler_by_name(
5757
self, event_handler_name: str
58-
) -> Optional[EventHandlerMapping]:
58+
) -> EventHandlerMapping | None:
5959
filtered_handlers = list(
6060
filter(
6161
lambda mapping: mapping.name == event_handler_name,
@@ -66,7 +66,7 @@ def get_event_handler_by_name(
6666

6767
def get_event_timer_by_name(
6868
self, event_timer_name: str
69-
) -> Optional[TimeoutHandlerMapping]:
69+
) -> TimeoutHandlerMapping | None:
7070
filtered_timers = list(
7171
filter(
7272
lambda mapping: mapping.name == event_timer_name,
@@ -75,7 +75,7 @@ def get_event_timer_by_name(
7575
)
7676
return filtered_timers[0] if len(filtered_timers) > 0 else None
7777

78-
def run(self) -> Optional["State"]:
78+
def run(self) -> "State | None":
7979
should_exit_state: bool = False
8080
timers = deepcopy(self.timers)
8181
entered_time = time.time()
@@ -95,7 +95,7 @@ def run(self) -> Optional["State"]:
9595
break
9696

9797
for handler_mapping in self.event_handler_mappings:
98-
event_value: Optional[Any]
98+
event_value: Any | None
9999
if handler_mapping.should_not_consume:
100100
event_value = handler_mapping.event.check()
101101
else:

src/isar/models/events.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from collections import deque
22
from queue import Empty, Queue
33
from threading import Lock
4-
from typing import Generic, Optional, Tuple, TypeVar
4+
from typing import Generic, Tuple, TypeVar
55

66
from isar.apis.models.models import (
77
ControlMissionResponse,
@@ -35,7 +35,7 @@ def __init__(self, name: str) -> None:
3535
super().__init__(maxsize=1)
3636
self.name = name
3737

38-
def trigger_event(self, data: T, timeout: Optional[int] = None) -> None:
38+
def trigger_event(self, data: T, timeout: int | None = None) -> None:
3939
try:
4040
# We always want a timeout when blocking for results, so that
4141
# the thread will never get stuck waiting for a result
@@ -45,7 +45,7 @@ def trigger_event(self, data: T, timeout: Optional[int] = None) -> None:
4545
raise EventTimeoutError
4646
return None
4747

48-
def consume_event(self, timeout: Optional[int] = None) -> Optional[T]:
48+
def consume_event(self, timeout: int | None = None) -> T | None:
4949
try:
5050
return self.get(block=timeout is not None, timeout=timeout)
5151
except Empty:
@@ -69,7 +69,7 @@ def has_event(self) -> bool:
6969
self.qsize() != 0
7070
) # Queue size is not reliable, but should be sufficient for this case
7171

72-
def check(self) -> Optional[T]:
72+
def check(self) -> T | None:
7373
if not self._qsize():
7474
return None
7575
with self.mutex:

src/isar/robot/robot.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from queue import Queue
33
from threading import Event as ThreadEvent
44
from threading import Thread
5-
from typing import Callable, List, Optional, Tuple
5+
from typing import Callable, List, Tuple
66

77
from isar.config.settings import settings
88
from isar.models.events import (
@@ -45,17 +45,17 @@ def __init__(
4545
self.upload_queue: Queue = events.upload_queue
4646
self.shared_state: SharedState = shared_state
4747
self.robot: RobotInterface = robot
48-
self.start_mission_thread: Optional[RobotStartMissionThread] = None
49-
self.robot_battery_thread: Optional[RobotBatteryThread] = None
50-
self.robot_status_thread: Optional[RobotStatusThread] = None
51-
self.monitor_mission_thread: Optional[RobotMonitorMissionThread] = None
52-
self.stop_mission_thread: Optional[RobotStopMissionThread] = None
53-
self.pause_mission_thread: Optional[RobotPauseMissionThread] = None
54-
self.resume_mission_thread: Optional[RobotResumeMissionThread] = None
48+
self.start_mission_thread: RobotStartMissionThread | None = None
49+
self.robot_battery_thread: RobotBatteryThread | None = None
50+
self.robot_status_thread: RobotStatusThread | None = None
51+
self.monitor_mission_thread: RobotMonitorMissionThread | None = None
52+
self.stop_mission_thread: RobotStopMissionThread | None = None
53+
self.pause_mission_thread: RobotPauseMissionThread | None = None
54+
self.resume_mission_thread: RobotResumeMissionThread | None = None
5555
self.upload_inspection_threads: List[RobotUploadInspectionThread] = []
5656
self.signal_thread_quitting: ThreadEvent = ThreadEvent()
5757
self.signal_mission_stopped: ThreadEvent = ThreadEvent()
58-
self.inspection_callback_thread: Optional[Thread] = None
58+
self.inspection_callback_thread: Thread | None = None
5959

6060
def stop(self) -> None:
6161
self.signal_thread_quitting.set()

src/isar/robot/robot_monitor_mission.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import logging
22
import time
33
from threading import Event, Thread
4-
from typing import Callable, Iterator, Optional
4+
from typing import Callable, Iterator
55

66
from isar.config.settings import settings
77
from isar.services.utilities.mqtt_utilities import (
@@ -24,7 +24,7 @@
2424
from robot_interface.telemetry.mqtt_client import MqttClientInterface
2525

2626

27-
def get_next_task(task_iterator: Iterator[TASKS]) -> Optional[TASKS]:
27+
def get_next_task(task_iterator: Iterator[TASKS]) -> TASKS | None:
2828
try:
2929
return next(task_iterator)
3030
except StopIteration:
@@ -70,13 +70,13 @@ def __init__(
7070
self.mission_id: str = mission.id
7171
self.tasks = mission.tasks
7272

73-
self.error_message: Optional[ErrorMessage] = None
73+
self.error_message: ErrorMessage | None = None
7474

7575
Thread.__init__(self, name="Robot mission monitoring thread")
7676

7777
def _get_task_status(self, task_id: str) -> TaskStatus:
7878
task_status: TaskStatus = TaskStatus.NotStarted
79-
failed_task_error: Optional[ErrorMessage] = None
79+
failed_task_error: ErrorMessage | None = None
8080
request_status_failure_counter: int = 0
8181

8282
while (
@@ -137,7 +137,7 @@ def _get_task_status(self, task_id: str) -> TaskStatus:
137137

138138
def _get_mission_status(self, mission_id: str) -> MissionStatus:
139139
mission_status: MissionStatus = MissionStatus.NotStarted
140-
failed_mission_error: Optional[ErrorMessage] = None
140+
failed_mission_error: ErrorMessage | None = None
141141
request_status_failure_counter: int = 0
142142

143143
while (
@@ -225,7 +225,7 @@ def _get_mission_status_based_on_task_status(self) -> MissionStatus:
225225
else:
226226
return MissionStatus.Successful
227227

228-
def _get_and_handle_task_status(self, current_task: TASKS) -> Optional[TASKS]:
228+
def _get_and_handle_task_status(self, current_task: TASKS) -> TASKS | None:
229229
try:
230230
new_task_status = self._get_task_status(current_task.id)
231231
except RobotTaskStatusException as e:
@@ -253,7 +253,7 @@ def _get_and_handle_task_status(self, current_task: TASKS) -> Optional[TASKS]:
253253
return next_task
254254
return current_task
255255

256-
def _handle_stopped_mission(self, current_task: Optional[TASKS]) -> None:
256+
def _handle_stopped_mission(self, current_task: TASKS | None) -> None:
257257
if current_task is not None:
258258
current_task.status = TaskStatus.Cancelled
259259
publish_task_status(self.mqtt_publisher, current_task, self.mission_id)
@@ -267,7 +267,7 @@ def _handle_stopped_mission(self, current_task: Optional[TASKS]) -> None:
267267
def run(self) -> None:
268268

269269
self.task_iterator: Iterator[TASKS] = iter(self.tasks)
270-
current_task: Optional[TASKS] = get_next_task(self.task_iterator)
270+
current_task: TASKS | None = get_next_task(self.task_iterator)
271271
current_task.status = TaskStatus.NotStarted # type: ignore
272272
current_mission_status = MissionStatus.NotStarted
273273

0 commit comments

Comments
 (0)