Skip to content

Commit

Permalink
refactor(WorkerManager): use attribute getters for type narrowing
Browse files Browse the repository at this point in the history
  • Loading branch information
tumidi committed Mar 18, 2024
1 parent 7594fe6 commit 98ac46b
Showing 1 changed file with 14 additions and 54 deletions.
68 changes: 14 additions & 54 deletions questionpy_server/worker/runtime/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
LoadQPyPackage,
MessageIds,
MessageToServer,
MessageToWorker,
ScoreAttempt,
StartAttempt,
ViewAttempt,
Expand All @@ -51,12 +50,12 @@ def register_on_request_callback(self, callback: OnRequestCallback) -> None:

class WorkerManager:
def __init__(self, server_connection: WorkerToServerConnection):
self.worker_type: str | None = None
self._worker_type: str | None = None
self.server_connection: WorkerToServerConnection = server_connection
self.limits: WorkerResourceLimits | None = None
self.loaded_packages: dict[str, ImportablePackage] = {}
self.main_package: ImportablePackage | None = None
self.question_type: BaseQuestionType | None = None
self._question_type: BaseQuestionType | None = None
self.message_dispatch: dict[MessageIds, Callable[[Any], MessageToServer]] = {
LoadQPyPackage.message_id: self.on_msg_load_qpy_package,
GetQPyPackageManifest.message_id: self.on_msg_get_qpy_package_manifest,
Expand All @@ -74,7 +73,7 @@ def bootstrap(self) -> None:
msg = f"'{InitWorker.__name__}' message expected, '{type(init_msg).__name__}' received"
raise WorkerNotInitializedError(msg)

self.worker_type = init_msg.worker_type
self._worker_type = init_msg.worker_type
self.limits = init_msg.limits
if self.limits:
# Limit memory usage.
Expand All @@ -96,12 +95,6 @@ def loop(self) -> None:
self.server_connection.send_message(response)

def on_msg_load_qpy_package(self, msg: LoadQPyPackage) -> MessageToServer:
self._require_init(msg)

if not self.worker_type:
errmsg = "'worker_type' is not set."
raise RuntimeError(errmsg)

package = load_package(msg.location)
package.setup_imports()
self.loaded_packages[str(msg.location)] = package
Expand All @@ -121,37 +114,21 @@ def on_msg_load_qpy_package(self, msg: LoadQPyPackage) -> MessageToServer:
raise PackageInitFailedError(msg)

self.main_package = package
self.question_type = qtype
self._question_type = qtype

return LoadQPyPackage.Response()

def on_msg_get_qpy_package_manifest(self, msg: GetQPyPackageManifest) -> MessageToServer:
self._require_init(msg)

package = self.loaded_packages[msg.path]
return GetQPyPackageManifest.Response(manifest=package.manifest)

def on_msg_get_options_form_definition(self, msg: GetOptionsForm) -> MessageToServer:
self._require_init(msg)
self._require_main_package_loaded(msg)

if not self.question_type:
errmsg = "'question_type' is not set."
raise RuntimeError(errmsg)

with self._with_request_user(msg.request_user):
definition, form_data = self.question_type.get_options_form(msg.question_state)

return GetOptionsForm.Response(definition=definition, form_data=form_data)

def on_msg_create_question_from_options(self, msg: CreateQuestionFromOptions) -> CreateQuestionFromOptions.Response:
self._require_init(msg)
self._require_main_package_loaded(msg)

if not self.question_type:
errmsg = "'question_type' is not set."
raise RuntimeError(errmsg)

with self._with_request_user(msg.request_user):
question = self.question_type.create_question_from_options(msg.question_state, msg.form_data)

Expand All @@ -160,26 +137,12 @@ def on_msg_create_question_from_options(self, msg: CreateQuestionFromOptions) ->
)

def on_msg_start_attempt(self, msg: StartAttempt) -> StartAttempt.Response:
self._require_init(msg)
self._require_main_package_loaded(msg)

if not self.question_type:
errmsg = "'question_type' is not set."
raise RuntimeError(errmsg)

with self._with_request_user(msg.request_user):
question = self.question_type.create_question_from_state(msg.question_state)
attempt = question.start_attempt(msg.variant)
return StartAttempt.Response(attempt_state=attempt.export_attempt_state(), attempt_model=attempt.export())

def on_msg_view_attempt(self, msg: ViewAttempt) -> ViewAttempt.Response:
self._require_init(msg)
self._require_main_package_loaded(msg)

if not self.question_type:
errmsg = "'question_type' is not set."
raise RuntimeError(errmsg)

with self._with_request_user(msg.request_user):
question = self.question_type.create_question_from_state(msg.question_state)
attempt = question.get_attempt(
Expand All @@ -195,13 +158,6 @@ def on_msg_view_attempt(self, msg: ViewAttempt) -> ViewAttempt.Response:
return ViewAttempt.Response(attempt_model=attempt.export())

def on_msg_score_attempt(self, msg: ScoreAttempt) -> ScoreAttempt.Response:
self._require_init(msg)
self._require_main_package_loaded(msg)

if not self.question_type:
errmsg = "'question_type' is not set."
raise RuntimeError(errmsg)

with self._with_request_user(msg.request_user):
question = self.question_type.create_question_from_state(msg.question_state)
attempt = question.get_attempt(
Expand All @@ -210,15 +166,19 @@ def on_msg_score_attempt(self, msg: ScoreAttempt) -> ScoreAttempt.Response:
scored_model = attempt.export_scored_attempt()
return ScoreAttempt.Response(attempt_scored_model=scored_model)

def _require_init(self, msg: MessageToWorker) -> None:
if not self.worker_type:
errmsg = f"'{InitWorker.__name__}' message expected, '{type(msg).__name__}' received"
@property
def worker_type(self) -> str:
if not self._worker_type:
errmsg = "'{InitWorker.__name__}' message expected"
raise WorkerNotInitializedError(errmsg)
return self._worker_type

def _require_main_package_loaded(self, msg: MessageToWorker) -> None:
if not (self.main_package and self.loaded_packages and self.question_type):
errmsg = f"'{LoadQPyPackage.__name__}(main=True)' message expected, '{type(msg).__name__}' received"
@property
def question_type(self) -> BaseQuestionType:
if not self._question_type:
errmsg = f"'{LoadQPyPackage.__name__}(main=True)' message expected"
raise MainPackageNotLoadedError(errmsg)
return self._question_type

@contextmanager
def _with_request_user(self, request_user: RequestUser) -> Generator[None, None, None]:
Expand Down

0 comments on commit 98ac46b

Please sign in to comment.