|
from abc import abstractmethod |
|
from typing import Any, Dict, Optional |
|
|
|
from .collections import ListCollection |
|
from .dataclass import NonPositionalField |
|
from .operator import StreamInstanceOperator |
|
|
|
|
|
class Instruction(StreamInstanceOperator): |
|
"""The role of instruction is to add instruction to every instance. |
|
|
|
Meaning the instruction is taking the instance and generating instruction field for it. |
|
""" |
|
|
|
skip_rendered_instance: bool = NonPositionalField(default=True) |
|
|
|
def process( |
|
self, instance: Dict[str, Any], stream_name: Optional[str] = None |
|
) -> Dict[str, Any]: |
|
if self.skip_rendered_instance: |
|
if "instruction" in instance: |
|
return instance |
|
|
|
instance["instruction"] = self.get_instruction(instance) |
|
|
|
return instance |
|
|
|
@abstractmethod |
|
def get_instruction(self, instance: Dict[str, object]) -> str: |
|
pass |
|
|
|
|
|
class TextualInstruction(Instruction): |
|
text: str |
|
|
|
def get_instruction(self, instance: Dict[str, object]) -> str: |
|
return self.text |
|
|
|
|
|
class EmptyInstruction(Instruction): |
|
def get_instruction(self, instance: Dict[str, object]) -> str: |
|
return "" |
|
|
|
|
|
class InstructionsList(ListCollection): |
|
def verify(self): |
|
for instruction in self.items: |
|
assert isinstance(instruction, Instruction) |
|
|
|
|
|
class InstructionsDict(Dict): |
|
def verify(self): |
|
for _key, instruction in self.items(): |
|
assert isinstance(instruction, Instruction) |
|
|