From 15e8953712cf52d7a3c2c32864e12e42a0d218ff Mon Sep 17 00:00:00 2001 From: Roland Thomas Date: Tue, 11 Jun 2024 21:45:22 -0400 Subject: [PATCH] item_manager_table.py --- cli/item_manager_table.py | 139 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 cli/item_manager_table.py diff --git a/cli/item_manager_table.py b/cli/item_manager_table.py new file mode 100644 index 0000000..3ff40e3 --- /dev/null +++ b/cli/item_manager_table.py @@ -0,0 +1,139 @@ +from dataclasses import dataclass, field +from typing import List, Dict, Any, Optional +from rich.console import Console +from rich.text import Text +from rich.table import Table + +@dataclass +class Item: + id: str + name: str + json_data_list: List[Dict[str, Any]] = field(default_factory=list) + data_type: str = 'new' + + def add_json_data(self, json_data: Dict[str, Any], data_type: str): + if json_data not in self.json_data_list: + self.json_data_list.append(json_data) + self.data_type = data_type + +class ItemManager: + def __init__(self): + self.items_by_id: Dict[str, Item] = {} + self.items_by_name: Dict[str, Item] = {} + self.ordered_items: List[Item] = [] + self.new_count: int = 0 + self.old_count: int = 0 + self.total_count: int = 0 + + def add_item(self, json_obj: Dict[str, Any], data_type: str = 'new'): + item_id = json_obj['id'] + item_name = json_obj['name'] + if item_id not in self.items_by_id: + item = Item(id=item_id, name=item_name) + self.items_by_id[item_id] = item + self.items_by_name[item_name] = item + self.ordered_items.append(item) + self.total_count += 1 + if data_type == 'new': + self.new_count += 1 + else: + self.old_count += 1 + else: + item = self.items_by_id[item_id] + if item.data_type == 'new' and data_type == 'old': + self.new_count -= 1 + self.old_count += 1 + elif item.data_type == 'old' and data_type == 'new': + self.old_count -= 1 + self.new_count += 1 + item.add_json_data(json_obj['data'], data_type) + print(f"Item added or updated: {item}") + + def add_items_from_json_list(self, json_list: List[Dict[str, Any]], data_type: str = 'new'): + for json_obj in json_list: + self.add_item(json_obj, data_type) + + def remove_item_by_id(self, item_id: str): + if item_id in self.items_by_id: + item_to_remove = self.items_by_id.pop(item_id) + self.ordered_items = [item for item in self.ordered_items if item.id != item_id] + if item_to_remove.name in self.items_by_name: + del self.items_by_name[item_to_remove.name] + self.total_count -= 1 + if item_to_remove.data_type == 'new': + self.new_count -= 1 + else: + self.old_count -= 1 + print(f"Item removed: {item_to_remove}") + else: + print(f"Item with ID {item_id} not found.") + + def remove_item_by_name(self, name: str): + if name in self.items_by_name: + item_to_remove = self.items_by_name.pop(name) + self.ordered_items = [item for item in self.ordered_items if item.name != name] + if item_to_remove.id in self.items_by_id: + del self.items_by_id[item_to_remove.id] + self.total_count -= 1 + if item_to_remove.data_type == 'new': + self.new_count -= 1 + else: + self.old_count -= 1 + print(f"Item removed: {item_to_remove}") + else: + print(f"Item with name {name} not found.") + + def search_by_name(self, name: str) -> Optional[Item]: + return self.items_by_name.get(name) + + def search_by_id(self, item_id: str) -> Optional[Item]: + return self.items_by_id.get(item_id) + + def get_all_items(self) -> List[Item]: + return self.ordered_items + + def get_counts(self) -> Dict[str, int]: + return { + 'new': self.new_count, + 'old': self.old_count, + 'total': self.total_count + } + + def get_item_tuples(self) -> List[tuple]: + tuples = [] + for item in self.ordered_items: + color = "#D08770" if item.data_type == "new" else "#B48EAD" + tuples.append((item.name, color)) + return tuples + + def print_items_as_table(self): + console = Console() + table = Table(title="Items") + table.add_column("Item Name", justify="left", style="bold") + + for item_name, color in self.get_item_tuples(): + text = Text(item_name) + text.stylize(color) + table.add_row(text) + + console.print(table) + + +item_manager = ItemManager() + +json_list_1 = [ + {"id": "1", "name": "Item1", "data": {"key1": "value1"}}, + {"id": "2", "name": "Item2", "data": {"key2": "value2"}}, + {"id": "1", "name": "Item1", "data": {"key1": "value1a"}} +] + +item_manager.add_items_from_json_list(json_list_1, data_type='new') + +json_list_2 = [ + {"id": "3", "name": "Item3", "data": {"key3": "value3"}}, + {"id": "4", "name": "Item4", "data": {"key4": "value4"}} +] + +item_manager.add_items_from_json_list(json_list_2, data_type='old') + +item_manager.print_items_as_table()