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()