fix role._rc init

This commit is contained in:
better629 2023-11-30 21:42:09 +08:00
parent a6510c44fc
commit 0a80752908
3 changed files with 21 additions and 3 deletions

View file

@ -40,6 +40,7 @@ class Environment(BaseModel):
arbitrary_types_allowed = True
def __init__(self, **kwargs):
roles = []
for role_key, role in kwargs.get("roles", {}).items():
current_role = kwargs["roles"][role_key]
if isinstance(current_role, dict):
@ -50,8 +51,11 @@ class Environment(BaseModel):
current_role = subclass(**current_role)
break
kwargs["roles"][role_key] = current_role
roles.append(current_role)
super().__init__(**kwargs)
self.add_roles(roles) # add_roles again to init the Role.set_env
def serialize(self, stg_path: Path):
roles_path = stg_path.joinpath("roles.json")
roles_info = []

View file

@ -113,6 +113,7 @@ class RoleSetting(BaseModel):
class RoleContext(BaseModel):
"""Role Runtime Context"""
# # env exclude=True to avoid `RecursionError: maximum recursion depth exceeded in comparison`
env: "Environment" = Field(default=None, exclude=True)
msg_buffer: MessageQueue = Field(default_factory=MessageQueue) # Message Buffer with Asynchronous Updates
memory: Memory = Field(default_factory=Memory)

View file

@ -39,7 +39,7 @@ def test_team_deserialize():
assert new_company.environment.get_role(arch.profile) is not None
def test_team_serdeser():
def test_team_serdeser_save():
company = Team()
company.hire([RoleC()])
@ -60,12 +60,19 @@ async def test_team_recover():
shutil.rmtree(stg_path, ignore_errors=True)
company = Team()
company.hire([RoleC()])
role_c = RoleC()
company.hire([role_c])
company.start_project(idea)
await company.run(n_round=4)
ser_data = company.dict()
new_company = Team(**ser_data)
new_role_c = new_company.environment.get_role(role_c.profile)
assert new_role_c._rc.memory == role_c._rc.memory
assert new_role_c._rc.env != role_c._rc.env # due to Action raise, role's memory has been changed.
assert new_role_c._rc.env.memory == role_c._rc.env.memory
assert new_company.environment.memory.count() == 1
assert type(list(new_company.environment.roles.values())[0]._actions[0]) == ActionOK
@ -80,11 +87,17 @@ async def test_team_recover_save():
shutil.rmtree(stg_path, ignore_errors=True)
company = Team()
company.hire([RoleC()])
role_c = RoleC()
company.hire([role_c])
company.start_project(idea)
await company.run(n_round=4)
new_company = Team.recover(stg_path)
new_role_c = new_company.environment.get_role(role_c.profile)
assert new_role_c._rc.memory == role_c._rc.memory
assert new_role_c._rc.env != role_c._rc.env # due to Action raise, role's memory has been changed.
assert new_role_c._rc.env.memory == role_c._rc.env.memory
new_company.start_project(idea)
await new_company.run(n_round=4)