adds brewing files

This commit is contained in:
Pamela Hathway 2024-07-17 23:32:12 +02:00
parent d3c22673c0
commit c622d3ba31
6 changed files with 236 additions and 0 deletions

View file

@ -0,0 +1,26 @@
from src.brewing import potion_class
from src.brewing import containers
from src.brewing import cooking
from src.brewing import inspection
def make_example_potion(student_name="ASPP student"):
my_potion = potion_class.Potion(student_name=student_name)
# Set up your old kettle and light an eternal flame underneath it.
my_potion.setup(container=containers.old_kettle)
# Simmer for 5 hours.
cooking.simmer(my_potion, duration=5)
print(f"You successfully ran make_example_potion, {student_name}, well done :).")
return my_potion
def make_python_expert_potion(student_name):
print("I am a Python Expert")
# todo: write this function!
return
if __name__ == "__main__":
my_name = 'ASPP student'
my_potion = make_example_potion(student_name=my_name)
# Let Snape inspect the potion
inspection.inspection_by_Snape(potion=my_potion, target_potion='example_potion')

View file

@ -0,0 +1,6 @@
# containers
pewter_cauldron = 'pewter_cauldron'
copper_cauldron = 'copper_cauldron'
martini_glass = 'martini_glass'
old_kettle = 'old_kettle'
raki_bottle = 'raki_bottle'

50
src/brewing/cooking.py Normal file
View file

@ -0,0 +1,50 @@
# heat sources
fire = 'fire'
eternal_flame = 'eternal_flame'
breathe_on_cauldron = 'breathe_on_cauldron'
def stir(potion, direction):
"""Stirs the potion.
Updates colour in the class instance.
Parameters
----------
potion : Potion instance
The potion to be stirred.
direction : {'clockwise', 'anti-clockwise'} str
The direction in which the potions is to be stirred
"""
if direction == "clockwise":
potion.colour = "vomit-yellow"
print('NO!! Your potion turns vomit-yellow. Did you stir in the right direction?')
elif direction == "anti-clockwise":
potion.colour = "newt-green"
print('Your potion turns a lovely newt-green.')
else:
print("What are you doing to your potion??")
print("You need to stir, not distribute the contents on the floor!")
return
def simmer(potion, duration):
"""Cooks the potion.
Updates simmer_duration and cooked attributes in the class instance.
Parameters
----------
potion : Potion instance
The potion to be cooked.
duration : int
How long to cook the potion for [hours].
"""
potion.simmer_duration = duration
if duration < 2:
print('Are you sure you are cooking the potion enough? Your ingredients look a bit raw...')
elif duration > 5:
print('Oops, you have fallen asleep at your desk! Are you sure you want to simmer this long?')
else:
potion.cooked = True
return

View file

@ -0,0 +1,5 @@
# ingredients
snake_skin = 'snake_skin'
fish_eyes = 'fish_eyes'
unicorn_hair = 'unicorn_hair'
tea_leaves = 'tea_leaves'

103
src/brewing/inspection.py Normal file
View file

@ -0,0 +1,103 @@
import time
def inspection_by_Snape(potion, target_potion='python_expert'):
"""Checks if potion was brewed correctly.
Prints narration of inspection process - read to see if potion passed inspection.
Snape checks container, heat_source, ingredients, and whether potion was cooked.
If something is wrong, function returns at that point.
Parameters
----------
potion : obj
Instance of Potion (class from potion_class).
target_potion: str, optional
Name of potion to be checked by Snape. Currently possible potions are 'python expert', 'example_potion'
"""
print('-------------------------------')
if not potion:
print(f'"There is no potion I can inspect!"')
print(f' (Tip: are you actually returning a proper potion and passing it to Snape?)')
return
print(f'A sour looking Snape walks towards you to inspect your {target_potion} potion.')
print(f'"What do we have here, {potion.student_name}...?"')
print_delay_dots()
# set variables for each potion that need to be checked
if target_potion == 'python_expert':
expected_container = 'pewter_cauldron'
expected_heat_source = 'fire'
elif target_potion == 'example_potion':
expected_container = 'old_kettle'
expected_heat_source = 'eternal_flame'
else:
print(f'"What is this, {potion.student_name}? This is not the name of an existing potion, check your spelling!"')
print(f' (Target potion was not recognised, please check your spelling.)')
return
# check that correct setup was used
if potion.container == expected_container and potion.heat_source == expected_heat_source:
print(f'You have used the correct setup, Snape cannot complain - he looks even more sour.')
else:
print(f'Snape smirks and remarks "You have used the wrong cauldron or heat, {potion.student_name}!" \n'
f'With a flick of his wand he vanishes the potion. \n'
f'"I am taking 10 points from Ravenclaw, {potion.student_name}. Start again!"')
return
print_delay_dots()
# set variables for each potion that need to be checked
if target_potion == 'python_expert':
expected_ingredients = ['fish_eyes', 'tea_leaves', 'unicorn_hair']
expected_cooked = True
expected_simmer_duration = 2
elif target_potion == 'example_potion':
expected_ingredients = []
expected_cooked = True
expected_simmer_duration = 5
else:
print(f'"What is this, {potion.student_name}? This is not the name of an existing potion, check your spelling!"')
print(f' (Target potion was not recognised, please check your spelling.)')
return
# check if all ingredients are there
if sorted(potion.ingredients) == expected_ingredients:
print(f'You have used the correct ingredients, Snape cannot complain - his face darkens.')
else:
print(f'Snape smirks and remarks "You have used the wrong ingredients, {potion.student_name}!" \n'
f'With a flick of his wand he vanishes the potion. \n'
f'"I am taking 10 points from Gryffindor, {potion.student_name}. Start again!"')
return
print_delay_dots()
# check that potion is cooked
if potion.cooked == expected_cooked and potion.simmer_duration == expected_simmer_duration:
print(f'The potion is cooked properly, Snape cannot complain - he is looking annyoyed now.')
else:
if potion.simmer_duration < expected_simmer_duration:
print(f'Snape smirks and remarks "Your potion is undercooked!" \n')
elif potion.simmer_duration > expected_simmer_duration:
print(f'Snape smirks and remarks "Your potion is overcooked!" \n')
print(f'With a flick of his wand he vanishes the potion. \n'
f'"I am taking 10 points from Hufflepuff, {potion.student_name}. Start again!"')
return
print_delay_dots()
print(f'Snape mutters "You got away this time, {potion.student_name}!", since there is nothing wrong with '
f'your {target_potion} potion.')
print_delay_dots()
print(f'You pack your bags and leave as fast as you can to have a butterbeer at the lake!')
return
def print_delay_dots(dur=0.5, number=2):
for i in range(number):
time.sleep(dur)
print('.')

View file

@ -0,0 +1,46 @@
class Potion:
def __init__(self, student_name):
"""This is a class for brewing potions."""
self.colour = 'there-is-no-potion-so-the-potion-has-no-color'
self.cooked = False
self.container = None
self.heat_source = None
self.ingredients = []
self.simmer_duration = -1
self.student_name = student_name
def setup(self, container=None, heat_source=None):
"""Add a container and/or heat_source to the potion.
Updates container and heat_source attributes in the class instance.
Parameters
----------
container : str, optional
The name of the container to brew the potion in.
heat_source : str, optional
The name of the heat source used to cook the potions
"""
if container == None:
print(f'You have not specified a container - where do you think you will brew your potion?')
if heat_source == None:
print(f'You have not specified a heat source - how will you cook the potion?')
self.container = container
self.heat_source = heat_source
def add_ingredients(self, ingredients=None):
"""Add ingredients to the potion.
Updates ingredients and colour attributes in the class instance.
Parameters
----------
ingredients : array_like, optional
A list of ingredients (str) to add to the potion.
"""
if ingredients is None:
print(f'You have added no ingredients - have you spilt them on the floor again?')
else:
self.ingredients = ingredients
self.colour = "transparent"