# UML diagram Gardening Project ```plantuml @startuml allowmixing class Bed{ +plants:List[Plant] +needs_water:bool +location:str +water_level:float #{static}WATERING_THRESHOLD --- +__init__(location:str) +plant_plant(plant: Plant) +water(added_water: int = 1) +update() +harvest() +remove_dead_plants() +__repr__() +__str__() } abstract Plant{ +species:str +growth_factor:float +size:int +dead:bool +emoji:str +{static}plant_type:str +{static}PLANT_BOOK: str --- +__init__(species: str, growth_factor: float, **plant_infos) +grow() +{abstract}harvest() +{static}new_plant(name:str) +{static}update_plant_book(plants_file:str) +__repr__() +__str__() } note right of Plant::new_plant(name:str) This is a classmethod end note note right of Plant::update_plant_book(plants_file:str) This is a classmethod end note class FruitBearingPlant{ +fruit_template:Fruit +fruits:List[Fruit] +{static}plant_type:str="fruity" --- +__init__(species: str, growth_factor: float, fruit_calories:int, **plant_infos) +harvest() +grow() +pick() +__str__() } class RootVegetable{ +{static}plant_type:str="rooty" #root:Root #plant_size_to_root_length_factor:float --- +__init__(species: str, growth_factor: float, calories_per_root_length: int, plant_size_to_root_length_factor: float, **plant_infos) +harvest() +grow() +__str__() } exception NoMoreFruitsError{} exception DeadPlantError{} exception NoMoreEnergyError{} exception ConfusionError{} struct Fruit{ +name:str +calories:int } struct Root{ +name:str +calories_per_length:int +length:float +calories:float } class Garden{ +location:str +beds:List[Bed] #gardeners:List[Gardener] #garden_guard:Gardener #days_until_a_new_garden_will_be_choosen:int --- +__init__(location: str) +accept(new_gardener:Gardener) +let_a_day_pass() +celebrate_garden_day() #choose_new_garden_guard() } class Gardener{ +name:str +beds:List[Bed] +energy:int +gardening_skills:int +{static}MAX_ENERGY:int +{static}WATERING_ENERGY:int +{static}PLANTING_ENERGY:int +{static}BED_BUILDING_ENERGY:int +{static}HARVESTING_ENERGY:int +{static}DEAD_PLANT_REMOVAL_ENERGY:int #inventory:List[Bed|Plant] --- +__init__(name: str) +water(bed:Bed, amount:int) +plant(plant:Plant, bed:Bed) +build(location:str) +pick(plant:Plant) +harvest(bed_or_plant:Bed|Plant) +remove_dead_plants(bed:Bed) +eat(fruit:str|Fruit|Root) +sleep() +garden() } class GardenHelpers{ --- +{static}create_bar(symbol:str, length:int, fill:int) } json "<b>example_plant.json" as JSON { "strawberry": { "plant_type": "fruity", "growth_factor": 1.1, "max_size": 10, "water_needed": 2, "emoji": "emoji", "fruit_calories": 33, "fruits_per_day": 5, "fruits_per_size": 3 }, "carrot": { "plant_type": "rooty", "growth_factor": 1.1, "max_size": 10, "water_needed": 2, "emoji": "emoji", "minimum_harvest_size": 7, "calories_per_root_length": 10, "plant_size_to_root_length_factor": 5 } } note top of JSON This is an example "plant.json" file used by the Plant class end note Plant <|-- "0.." FruitBearingPlant: inheritance Plant <|-- "0.." RootVegetable: inheritance FruitBearingPlant *-- "0.." Fruit: composition NoMoreFruitsError <-- FruitBearingPlant: uses RootVegetable *-- "0.." Root: composition DeadPlantError <-- Bed: uses Bed *-- "0.." Plant: composition Gardener *-- "0.." Bed: composition Gardener *-- "0.." Plant: composition NoMoreEnergyError <-- Gardener: uses NoMoreFruitsError <-- Gardener: uses Garden *-- "0.." Gardener: composition Garden *-- "0.." Bed: composition ConfusionError <-- Garden: uses GardenHelpers <-- Bed: uses GardenHelpers <-- RootVegetable: uses GardenHelpers <-- FruitBearingPlant: uses JSON <-- Plant: uses @enduml ```