Skip to content
Snippets Groups Projects
Commit 9394355a authored by Janet Goldstein's avatar Janet Goldstein
Browse files

WS-740: lose StateIF, TransitionIF

parent 4c5027e1
No related branches found
No related tags found
1 merge request!596WS-740: lose StateIF, TransitionIF
Pipeline #3335 passed
......@@ -22,7 +22,9 @@ import json
import logging
import pathlib
import re
from typing import Dict
from typing import Dict, List
# pylint: disable=C0114, C0115, C0116, E0401, R0201, W0613, W0621, W1203
import pendulum
import sqlalchemy as sa
......@@ -38,8 +40,7 @@ from workspaces.capability.schema_interfaces import (
CapabilityRequestIF,
CapabilityVersionFileIF,
CapabilityVersionIF,
StateIF,
TransitionIF,
PatternIF,
)
from workspaces.capability.services.interfaces import ExecutionManagerIF
from workspaces.products.schema_interfaces import FutureProductIF
......@@ -49,6 +50,8 @@ Base = declarative_base()
logger = logging.getLogger(__name__)
CAPABILITY_NAME_FK = "capabilities.capability_name"
class Action(Base, ActionIF):
__tablename__ = "capability_state_actions"
......@@ -133,13 +136,15 @@ class SendNotification(Action):
logger.info("SEND NOTIFICATION!!!")
class State(Base, StateIF):
class State(Base):
transitions: List[Transition]
__tablename__ = "capability_states"
capability_name = sa.Column(
"capability_name",
sa.String,
sa.ForeignKey("capabilities.capability_name"),
sa.ForeignKey(CAPABILITY_NAME_FK),
primary_key=True,
comment="The capability this state belongs to",
)
......@@ -151,12 +156,12 @@ class State(Base, StateIF):
comment="A state in this state machine, such as 'Executing' or 'Awaiting QA'",
)
def link(self, pattern: str, state: StateIF, action: ActionIF):
def link(self, pattern: str, state: State, action: ActionIF):
transition = Transition(pattern=pattern, from_state=self, to_state=state)
transition.actions.append(action)
self.transitions.append(transition)
def signal(self, message: Dict, execution: CapabilityExecutionIF, manager: ExecutionManagerIF) -> StateIF:
def signal(self, message: Dict, execution: CapabilityExecutionIF, manager: ExecutionManagerIF) -> State:
for transition in self.transitions:
if transition.matches(message):
logger.info("Found matching transition")
......@@ -232,7 +237,13 @@ class Capability(Base, CapabilityIF):
return Capability(**copy)
class Transition(Base, TransitionIF):
class Transition(Base):
pattern: PatternIF
actions: List[ActionIF]
from_state: State
to_state: State
__tablename__ = "capability_state_transitions"
transition_id = sa.Column(
"transition_id",
......@@ -324,7 +335,7 @@ class CapabilityRequest(Base, CapabilityRequestIF):
__tablename__ = "capability_requests"
id = sa.Column("capability_request_id", sa.Integer, primary_key=True)
state = sa.Column("state", sa.String)
capability_name = sa.Column("capability_name", sa.String, sa.ForeignKey("capabilities.capability_name"))
capability_name = sa.Column("capability_name", sa.String, sa.ForeignKey(CAPABILITY_NAME_FK))
ingested = sa.Column("ingested", sa.Boolean, default=False, server_default="false", nullable=False)
created_at = sa.Column(
"created_at",
......@@ -416,7 +427,7 @@ class CapabilityVersion(Base, CapabilityVersionIF):
request = relationship(CapabilityRequest, back_populates="versions")
executions = relationship("CapabilityExecution", back_populates="version")
files = relationship("CapabilityVersionFile", back_populates="version")
capability_name = sa.Column("capability_name", sa.String, sa.ForeignKey("capabilities.capability_name"))
capability_name = sa.Column("capability_name", sa.String, sa.ForeignKey(CAPABILITY_NAME_FK))
capability = relationship(Capability)
@property
......@@ -523,7 +534,7 @@ class CapabilityExecution(Base, CapabilityExecutionIF, JSONSerializable):
current_workflow_request_id = sa.Column("current_workflow_request_id", sa.Integer)
delivery_url = sa.Column("delivery_url", sa.String)
delivery_path = sa.Column("delivery_path", SaPath)
capability_name = sa.Column("capability_name", sa.String, sa.ForeignKey("capabilities.capability_name"))
capability_name = sa.Column("capability_name", sa.String, sa.ForeignKey(CAPABILITY_NAME_FK))
created_at = sa.Column(
"created_at",
......
......@@ -18,7 +18,9 @@
from __future__ import annotations
import pathlib
from typing import Dict, List, Optional
from typing import Dict, List
# pylint: disable=C0114, C0115, C0116, R0903
from workspaces.capability.helpers_interfaces import ParameterIF
from workspaces.products.schema_interfaces import FutureProductIF
......@@ -68,11 +70,12 @@ class CapabilityVersionFileIF:
raise NotImplementedError
# TODO: This interface is slated for eventual removal
class CapabilityExecutionIF:
id: int
capability_version: CapabilityVersionIF
state_name: str
state: StateIF
state: "State"
version: CapabilityVersionIF
current_workflow_request_id: int
capability: CapabilityIF
......@@ -128,51 +131,3 @@ class PatternIF:
:return: true if this pattern matches that event object
"""
raise NotImplementedError
class StateIF:
"""
A state that a machine could reside in.
A state has a suite of transitions to other states. When an event comes in, we match against it; if we find a
matching pattern, we perform that transition to another state.
"""
transitions: List[TransitionIF]
def link(self, pattern: str, state: "StateIf", action: ActionIF):
raise NotImplementedError
def signal(self, message: Dict, execution: CapabilityExecutionIF, manager) -> Optional["StateIf"]:
raise NotImplementedError
def final(self) -> bool:
raise NotImplementedError
class TransitionIF:
"""
A transition between states
"""
pattern: PatternIF
actions: List[ActionIF]
from_state: StateIF
to_state: StateIF
def matches(self, msg: dict) -> bool:
"""
True if this transition is applicable in the supplied state and matches the supplied event.
:param msg: message whose type will be matched against
:return: true if everything matches
"""
raise NotImplementedError
def action(self, execution, manager):
"""
Action assodiated with particular transition
:return:
"""
raise NotImplementedError
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment