Source code for clu.store
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# @Author: José Sánchez-Gallego (gallegoj@uw.edu)
# @Date: 2022-09-01
# @Filename: store.py
# @License: BSD 3-clause (http://www.opensource.org/licenses/BSD-3-Clause)
from __future__ import annotations
from collections import defaultdict
from dataclasses import dataclass
from datetime import datetime
from typing import TYPE_CHECKING, Any
if TYPE_CHECKING:
from .base import BaseActor, Reply
__all__ = ["KeywordStore", "KeywordOutput"]
[docs]
class KeywordStore(defaultdict):
"""Stores the keywords output by an actor.
Parameters
----------
actor
The actor to which this store is attached to.
filter
A list of keyword names to filter. If provided, only those keywords
will be tracked.
"""
def __init__(self, actor: BaseActor, filter: list[str] | None = None):
self.actor = actor
self.name = self.actor.name
self.filter = filter
defaultdict.__init__(self, list)
[docs]
def add_reply(self, reply: Reply):
"""Processes a reply and adds new entries to the store.
Parameters
----------
reply
The `.Reply` object containing the keywords output in a message
from the actor.
"""
for keyword, value in reply.message.items():
if self.filter is not None and keyword not in self.filter:
continue
key_out = KeywordOutput(keyword, reply.message_code, datetime.now(), value)
if keyword in self:
self[keyword].append(key_out)
else:
self[keyword] = [key_out]
[docs]
def head(self, keyword: str, n: int = 1):
"""Returns the first N output values of a keyword.
Parameters
----------
keyword
The name of the keyword to search for.
n
Return the first ``n`` times the keyword was output.
"""
return self[keyword][:n]
[docs]
def tail(self, keyword: str, n: int = 1):
"""Returns the last N output values of a keyword.
Parameters
----------
keyword
The name of the keyword to search for.
n
Return the last ``n`` times the keyword was output.
"""
return self[keyword][-n:]
[docs]
@dataclass
class KeywordOutput:
"""Records a single output of a keyword.
Parameters
----------
name
The name of the keyword.
message_code
The message code with which the keyword was output.
date
A `.datetime` object with the date-time at which the keyword was
output this time.
value
The value of the keyword when it was output.
"""
name: str
message_code: Any
date: datetime
value: Any