From f4e423f53156ab3a4548749db975c5612990c2eb Mon Sep 17 00:00:00 2001 From: "Charles T. Gray" Date: Sat, 11 Oct 2025 09:22:34 +0200 Subject: [PATCH] blackboard works but pytest fails, need to debug --- .quarto/project-cache/deno-kv-file | Bin 0 -> 36864 bytes _quarto.yml | 11 +++ button_2/blackboard.py | 50 ----------- button_2/blackboard.qmd | 78 ++++++++++++++++++ button_2/blackboard_node_logic.py | 27 ++++++ button_2/classes/data/button_dat.py | 15 +++- .../{textblock => entities}/__init__.py | 0 button_2/classes/entities/employee.py | 20 +++-- .../textblock => classes/game}/__init__.py | 0 button_2/classes/game/node_context.py | 18 ++++ button_2/classes/text_gen/__init__.py | 0 button_2/classes/text_gen/textgen_employee.py | 13 +++ button_2/classes/text_render/__init__.py | 0 .../text_render/text_render_employee.py | 10 +++ button_2/data/employee.csv | 20 +++-- button_2/tests/entities/test_employee.py | 22 +++-- button_2/tests/textgen/__init__.py | 0 .../tests/textgen/test_textgen_employee.py | 21 +++++ button_2/tests/textrend/__init__.py | 0 .../tests/textrend/test_textrend_employee.py | 28 +++++++ 20 files changed, 260 insertions(+), 73 deletions(-) create mode 100644 .quarto/project-cache/deno-kv-file create mode 100644 _quarto.yml delete mode 100644 button_2/blackboard.py create mode 100644 button_2/blackboard.qmd create mode 100644 button_2/blackboard_node_logic.py rename button_2/classes/{textblock => entities}/__init__.py (100%) rename button_2/{tests/textblock => classes/game}/__init__.py (100%) create mode 100644 button_2/classes/game/node_context.py create mode 100644 button_2/classes/text_gen/__init__.py create mode 100644 button_2/classes/text_gen/textgen_employee.py create mode 100644 button_2/classes/text_render/__init__.py create mode 100644 button_2/classes/text_render/text_render_employee.py create mode 100644 button_2/tests/textgen/__init__.py create mode 100644 button_2/tests/textgen/test_textgen_employee.py create mode 100644 button_2/tests/textrend/__init__.py create mode 100644 button_2/tests/textrend/test_textrend_employee.py diff --git a/.quarto/project-cache/deno-kv-file b/.quarto/project-cache/deno-kv-file new file mode 100644 index 0000000000000000000000000000000000000000..f31f490aafc40389dca9e531d3d98a748bf5ccf5 GIT binary patch literal 36864 zcmeI)KX21O7=ZD+q>a-;8ajZtazdasYC%+pfdPpE8ITGRg#i|fTVIM5*KQpoHMb=7tdZL9s* z-*e+5)zwF9rnEmS4WmSbX%OT^jt+Ms&kuK%A0~QN$Er}RxFE6@N&koZCf56{npC2m@Vt%Gb1UF#XkU&^hOk|*_!>>{xijppk|`>b{4sV>%*8h zzFv-r_w}0na8Z8ECA)p6Fex41JM8x7Mo=$aJ#W7=@l)PLnE=S*s<3lwaHC?`ckakR zl%F=6J&qatEL&$Ijg=AnNQ0tg_000IagfB*srAb str: + return f"Your day begins as a {self.job_title} in the {self.department} department." diff --git a/button_2/classes/text_render/__init__.py b/button_2/classes/text_render/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/button_2/classes/text_render/text_render_employee.py b/button_2/classes/text_render/text_render_employee.py new file mode 100644 index 0000000..315012c --- /dev/null +++ b/button_2/classes/text_render/text_render_employee.py @@ -0,0 +1,10 @@ +from ..text_gen.textgen_employee import EmployeeTextGenerator + +class EmployeeTextRenderer: + def __init__(self, employee_text_gen: EmployeeTextGenerator): + self.employee_text_gen = employee_text_gen + self.rendered_text = self.render_text() + + def render_text(self) -> str: + # We need to apply string wrapping in renderers. + return self.employee_text_gen.employee_text diff --git a/button_2/data/employee.csv b/button_2/data/employee.csv index d9f3934..31dafca 100644 --- a/button_2/data/employee.csv +++ b/button_2/data/employee.csv @@ -1,6 +1,16 @@ job_title,department -data scientist,data -data analyst,data analytics -data engineer,business intelligence -analytics engineer,data & analytics -business intelligence analyst,data science +Data scientist,Data & analytics +Data analyst,Data analytics +Data engineer,Businsess intelligence +Analytics engineer,Data & AI +Business intelligence analyst,Data science +ML engineer,AI +AI engineer,AI/ML +Decision scientist,Machine learning +Insights analyst,Data strategy +Data architect,Data governance & strategy +Predictive modeller,Data enablement +Research software engineer,Data innovation +ML developer,Data transformation +AI developer,Analytics +Data developer,Insights & reporting diff --git a/button_2/tests/entities/test_employee.py b/button_2/tests/entities/test_employee.py index 88c9edb..94f268f 100644 --- a/button_2/tests/entities/test_employee.py +++ b/button_2/tests/entities/test_employee.py @@ -1,22 +1,25 @@ from button_2.classes.entities.employee import Employee import pandas as pd -from button_2.classes.button_dat import ButtonDat +from button_2.classes.data.button_dat import ButtonDat + +button_dat = ButtonDat() +employee = Employee( + job_title=button_dat.employee_df.iloc[0]['job_title'] if not button_dat.employee_df.empty else None, + department=button_dat.employee_df.iloc[0]['department'] if not button_dat.employee_df.empty else None +) def test_employee_init(): - employee = Employee() assert employee is not None assert hasattr(employee, 'employee_id') assert hasattr(employee, 'job_title') assert hasattr(employee, 'department') def test_employee_methods(): - employee = Employee() assert callable(employee.reorg), ( "Employee should have a callable reorg method" ) def test_texgen_employee_attributes(): - employee = Employee() assert employee.employee_id is not None assert employee.job_title is not None assert employee.department is not None @@ -30,9 +33,11 @@ def helper_test_reorg_method(): # low probability of change expected, # so will run multiple times in main test - employee = Employee() initial_state = (employee.job_title, employee.department) - employee.reorg() + employee.set_current_titles( + job_titles=button_dat.employee_df['job_title'].dropna().values, + departments=button_dat.employee_df['department'].dropna().values + ) new_state = (employee.job_title, employee.department) return {"state_change": initial_state != new_state, "job_title": employee.job_title, @@ -52,7 +57,6 @@ def test_employee_reorg_method_changes_state(): changes = sum(sim_df['state_change']) - button_dat = ButtonDat() assert changes > 0, ( "reorg method should change employee state occasionally" @@ -62,11 +66,11 @@ def test_employee_reorg_method_changes_state(): ) # check generated job titles are expected values from employee df assert set(sim_df["job_title"].unique()).issubset( - set(button_dat.employee["job_title"].unique()) + set(button_dat.employee_df["job_title"].unique()) ), "Unexpected job titles generated" # check generated departments are expected values from employee df assert set(sim_df["department"].unique()).issubset( - set(button_dat.employee["department"].unique()) + set(button_dat.employee_df["department"].unique()) ), "Unexpected departments generated" diff --git a/button_2/tests/textgen/__init__.py b/button_2/tests/textgen/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/button_2/tests/textgen/test_textgen_employee.py b/button_2/tests/textgen/test_textgen_employee.py new file mode 100644 index 0000000..de5b64a --- /dev/null +++ b/button_2/tests/textgen/test_textgen_employee.py @@ -0,0 +1,21 @@ +from button_2.classes.text_gen.textgen_employee import EmployeeTextGenerator +from button_2.classes.entities.employee import Employee +from button_2.classes.data.button_dat import ButtonDat + +button_dat = ButtonDat() +employee = Employee(button_dat) + +# assert that the text generator works +def test_employee_text_generator(): + + text_generator = EmployeeTextGenerator(employee) + assert text_generator is not None + +# assert that the text generator has attributes: +# job_title +# department + +def test_employee_text_generator_attributes(): + text_generator = EmployeeTextGenerator(employee) + assert hasattr(text_generator, "job_title") + assert hasattr(text_generator, "department") \ No newline at end of file diff --git a/button_2/tests/textrend/__init__.py b/button_2/tests/textrend/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/button_2/tests/textrend/test_textrend_employee.py b/button_2/tests/textrend/test_textrend_employee.py new file mode 100644 index 0000000..f066d0a --- /dev/null +++ b/button_2/tests/textrend/test_textrend_employee.py @@ -0,0 +1,28 @@ +from button_2.classes.entities.employee import Employee +from button_2.classes.data.button_dat import ButtonDat +from button_2.classes.text_gen.textgen_employee import EmployeeTextGenerator +from button_2.classes.text_render.text_render_employee import EmployeeTextRenderer + +button_dat = ButtonDat() +employee = Employee(button_dat) +employee_text = EmployeeTextGenerator(employee) + +def test_employee_text_renderer(): + employee_text_renderer = EmployeeTextRenderer(employee_text) + + # More comprehensive assertions + assert employee_text_renderer.rendered_text is not None + assert isinstance(employee_text_renderer.rendered_text, str) + assert len(employee_text_renderer.rendered_text) > 0 + +def test_employee_text_renderer_type(): + employee_text_renderer = EmployeeTextRenderer(employee_text) + assert hasattr(employee_text_renderer, 'rendered_text') + +def test_employee_text_renderer_consistency(): + employee_text_renderer = EmployeeTextRenderer(employee_text) + + # Should return same result on multiple calls + first_render = employee_text_renderer.rendered_text + second_render = employee_text_renderer.rendered_text + assert first_render == second_render \ No newline at end of file