class TestHopsUtilization(unittest.TestCase): def setUp(self): self.utilization_cls = HopsUtilization self.hop = centennial self.addition_kwargs = [{u"boil_time": 60.0, u"weight": 0.57}] # Additions self.plato = 14.0 self.sg = plato_to_sg(self.plato) self.final_volume = 5.0 self.boil_time = 60.0 self.hop_addition = HopAddition( self.hop, boil_time=self.boil_time, weight=0.57, utilization_cls=self.utilization_cls ) def test_get_ibus_raises(self): with self.assertRaises(NotImplementedError): self.hop_addition.get_ibus(self.sg, self.final_volume) def test_get_percent_utilization_raises(self): with self.assertRaises(NotImplementedError): self.hop_addition.utilization_cls.get_percent_utilization(self.sg, self.final_volume) def test_change_units(self): self.assertEquals(self.hop_addition.utilization_cls.units, IMPERIAL_UNITS) util = self.hop_addition.utilization_cls.change_units() self.assertEquals(util.units, SI_UNITS) util = util.change_units() self.assertEquals(util.units, IMPERIAL_UNITS)
class TestHopsUtilization(unittest.TestCase): def setUp(self): self.utilization_cls = HopsUtilization self.hop = centennial self.addition_kwargs = [{u"boil_time": 60.0, u"weight": 0.57}] # Additions self.plato = 14.0 self.sg = plato_to_sg(self.plato) self.final_volume = 5.0 self.boil_time = 60.0 self.hop_addition = HopAddition( self.hop, boil_time=self.boil_time, weight=0.57, utilization_cls=self.utilization_cls, ) def test_get_ibus_raises(self): with self.assertRaises(NotImplementedError): self.hop_addition.get_ibus(self.sg, self.final_volume) def test_get_percent_utilization_raises(self): with self.assertRaises(NotImplementedError): self.hop_addition.utilization_cls.get_percent_utilization( self.sg, self.final_volume) def test_change_units(self): self.assertEquals(self.hop_addition.utilization_cls.units, IMPERIAL_UNITS) util = self.hop_addition.utilization_cls.change_units() self.assertEquals(util.units, SI_UNITS) util = util.change_units() self.assertEquals(util.units, IMPERIAL_UNITS)
def test_ne_hop_type(self): hop_add1 = HopAddition(cascade, boil_time=5.0, weight=0.76) hop_add2 = HopAddition(cascade, boil_time=5.0, weight=0.76, hop_type=HOP_TYPE_WHOLE) self.assertTrue(hop_add1 != hop_add2)
def test_ne_units(self): hop_add1 = HopAddition(cascade, boil_time=5.0, weight=0.76) hop_add2 = HopAddition(cascade, boil_time=5.0, weight=0.76, units=SI_UNITS) self.assertTrue(hop_add1 != hop_add2)
def setUp(self): self.hop1 = centennial self.hop2 = cascade self.addition_kwargs = [ { u"boil_time": 60.0, u"weight": 0.57, u"utilization_cls_kwargs": { u"units": IMPERIAL_UNITS }, }, { u"boil_time": 5.0, u"weight": 0.76, u"utilization_cls_kwargs": { u"units": IMPERIAL_UNITS }, }, ] # Additions self.hop_addition1 = HopAddition(self.hop1, **self.addition_kwargs[0]) self.hop_addition2 = HopAddition(self.hop2, **self.addition_kwargs[1]) # Define Hops self.plato = 14.0 self.sg = plato_to_sg(self.plato) self.target_ibu = 40.0 self.final_volume = 5.0
def main(): # Define Grains pale = Grain(u"Pale Malt (2 Row) US", color=1.8, ppg=37) pale_add = GrainAddition(pale, weight=13.96) crystal = Grain(u"Caramel/Crystal Malt - 20L", color=20.0, ppg=35) crystal_add = GrainAddition(crystal, weight=0.78) grain_additions = [pale_add, crystal_add] # Define Hops centennial = Hop(u"Centennial", percent_alpha_acids=0.14) centennial_add = HopAddition(centennial, weight=0.57, boil_time=60.0) cascade = Hop(u"Cascade (US)", percent_alpha_acids=0.07) cascade_add = HopAddition(cascade, weight=0.76, boil_time=5.0) hop_additions = [centennial_add, cascade_add] # Define Yeast yeast = Yeast(u"Wyeast 1056") # Define Recipe beer = Recipe( u"pale ale", grain_additions=grain_additions, hop_additions=hop_additions, yeast=yeast, brew_house_yield=0.70, # % start_volume=7.0, # G final_volume=5.0, # G ) print(beer.format())
def test_get_ibus_whole_wet(self): # Whole Dry Weight is HOP_UTILIZATION_SCALE_PELLET times more than pellet weight # Whole Wet Weight is HOP_WHOLE_DRY_TO_WET times more than dry weight weight = 0.57 * HOP_UTILIZATION_SCALE_PELLET * HOP_WHOLE_DRY_TO_WET hop_addition = HopAddition(self.hop, boil_time=self.boil_time, weight=weight, hop_type=HOP_TYPE_WHOLE_WET, utilization_cls=self.utilization_cls) ibu = hop_addition.get_ibus(self.sg, self.final_volume) self.assertEquals(round(ibu, 2), 39.18)
def test_get_ibus_whole_wet(self): # Whole Dry Weight is HOP_UTILIZATION_SCALE_PELLET times more than pellet weight # Whole Wet Weight is HOP_WHOLE_DRY_TO_WET times more than dry weight weight = 0.57 * HOP_UTILIZATION_SCALE_PELLET * HOP_WHOLE_DRY_TO_WET hop_addition = HopAddition( self.hop, boil_time=self.boil_time, weight=weight, hop_type=HOP_TYPE_WHOLE_WET, utilization_cls=self.utilization_cls, ) ibu = hop_addition.get_ibus(self.sg, self.final_volume) self.assertEquals(round(ibu, 2), 39.18)
def setUp(self): self.utilization_cls = HopsUtilization self.hop = centennial self.addition_kwargs = [{u"boil_time": 60.0, u"weight": 0.57}] # Additions self.plato = 14.0 self.sg = plato_to_sg(self.plato) self.final_volume = 5.0 self.boil_time = 60.0 self.hop_addition = HopAddition( self.hop, boil_time=self.boil_time, weight=0.57, utilization_cls=self.utilization_cls, )
class TestHopsUtilizationGlennTinseth(unittest.TestCase): def setUp(self): self.utilization_cls = HopsUtilizationGlennTinseth self.hop = centennial self.addition_kwargs = [{u"boil_time": 60.0, u"weight": 0.57}] # Additions self.plato = 14.0 self.sg = plato_to_sg(self.plato) self.final_volume = 5.0 self.boil_time = 60.0 self.hop_addition = HopAddition( self.hop, boil_time=self.boil_time, weight=0.57, utilization_cls=self.utilization_cls ) def test_str(self): self.assertEquals(str(self.hop_addition.utilization_cls), u"Glenn Tinseth") def test_get_ibus(self): ibu = self.hop_addition.get_ibus(self.sg, self.final_volume) self.assertEquals(round(ibu, 2), 28.52) def test_get_bigness_factor(self): bf = self.hop_addition.utilization_cls.get_bigness_factor(self.sg) self.assertEquals(round(bf, 2), 0.99) def test_get_boil_time_factor(self): bf = self.hop_addition.utilization_cls.get_boil_time_factor(self.boil_time) self.assertEquals(round(bf, 2), 0.22) def test_get_percent_utilization(self): utilization = self.hop_addition.utilization_cls.get_percent_utilization(self.sg, self.boil_time) # noqa self.assertEquals(round(utilization * 100, 2), 21.69)
def setUp(self): self.hop1 = centennial self.hop2 = cascade self.addition_kwargs = [ { u'boil_time': 60.0, u'weight': 0.57, u'utilization_cls_kwargs': {u'units': IMPERIAL_UNITS}, }, { u'boil_time': 5.0, u'weight': 0.76, u'utilization_cls_kwargs': {u'units': IMPERIAL_UNITS}, }, ] # Additions self.hop_addition1 = HopAddition(self.hop1, **self.addition_kwargs[0]) self.hop_addition2 = HopAddition(self.hop2, **self.addition_kwargs[1]) # Define Hops self.plato = 14.0 self.sg = plato_to_sg(self.plato) self.target_ibu = 40.0 self.final_volume = 5.0
def main(): # Define Grains pale = Grain(u"Pale Malt (2 Row) US", color=1.8, ppg=37) rye = Grain(u"Rye Malt", color=3.5, ppg=38) crystal = Grain(u"Caramel/Crystal - 60L", color=60, ppg=34) carapils = Grain(u"Carapils/Dextrine Malt", color=1.8, ppg=33) flaked_wheat = Grain(u"Flaked Wheat", color=2, ppg=34) pale_add = GrainAddition(pale, weight=13.96) rye_add = GrainAddition(rye, weight=3.0) crystal_add = GrainAddition(crystal, weight=1.25) carapils_add = GrainAddition(carapils, weight=0.5) flaked_wheat_add = GrainAddition(flaked_wheat, weight=0.5) grain_additions = [ pale_add, rye_add, crystal_add, carapils_add, flaked_wheat_add ] # Define Hops mt_hood = Hop(u"Mount Hood", percent_alpha_acids=0.048) columbus = Hop(u"Columbus", percent_alpha_acids=0.15) mt_hood_add_01 = HopAddition(mt_hood, weight=1.0, boil_time=60.0) columbus_add_01 = HopAddition(columbus, weight=1.0, boil_time=60.0) mt_hood_add_02 = HopAddition(mt_hood, weight=0.5, boil_time=30.0) mt_hood_add_03 = HopAddition(mt_hood, weight=1.5, boil_time=1.0) columbus_add_02 = HopAddition(columbus, weight=1.0, boil_time=0.0) hop_additions = [ mt_hood_add_01, columbus_add_01, mt_hood_add_02, mt_hood_add_03, columbus_add_02 ] # Define Yeast yeast = Yeast(u"Wyeast 1450", percent_attenuation=0.75) # Define Recipe beer = Recipe( u"pale ale", grain_additions=grain_additions, hop_additions=hop_additions, yeast=yeast, brew_house_yield=0.70, # % start_volume=7.5, # G final_volume=5.5, # G ) print(beer.format())
class TestHopsUtilizationGlennTinseth(unittest.TestCase): def setUp(self): self.utilization_cls = HopsUtilizationGlennTinseth self.hop = centennial self.addition_kwargs = [ { u'boil_time': 60.0, u'weight': 0.57, } ] # Additions self.plato = 14.0 self.sg = plato_to_sg(self.plato) self.final_volume = 5.0 self.boil_time = 60.0 self.hop_addition = HopAddition(self.hop, boil_time=self.boil_time, weight=0.57, utilization_cls=self.utilization_cls) def test_str(self): self.assertEquals(str(self.hop_addition.utilization_cls), u"Glenn Tinseth") def test_get_ibus(self): ibu = self.hop_addition.get_ibus(self.sg, self.final_volume) self.assertEquals(round(ibu, 2), 28.52) def test_get_ibus_whole_wet(self): """ Whole Dry Weight is HOP_UTILIZATION_SCALE_PELLET times more than pellet weight Whole Wet Weight is HOP_WHOLE_DRY_TO_WET times more than dry weight """ # noqa weight = 0.57 * HOP_UTILIZATION_SCALE_PELLET * HOP_WHOLE_DRY_TO_WET hop_addition = HopAddition(self.hop, boil_time=self.boil_time, weight=weight, hop_type=HOP_TYPE_WHOLE_WET, utilization_cls=self.utilization_cls) ibu = hop_addition.get_ibus(self.sg, self.final_volume) self.assertEquals(round(ibu, 2), 28.52) def test_get_bigness_factor(self): bf = self.hop_addition.utilization_cls.get_bigness_factor(self.sg) self.assertEquals(round(bf, 2), 0.99) def test_get_boil_time_factor(self): bf = self.hop_addition.utilization_cls.get_boil_time_factor( self.boil_time) self.assertEquals(round(bf, 2), 0.22) def test_get_percent_utilization(self): utilization = self.hop_addition.utilization_cls.get_percent_utilization( # noqa self.sg, self.boil_time) self.assertEquals(round(utilization * 100, 2), 21.69)
class TestHopsUtilizationGlennTinseth(unittest.TestCase): def setUp(self): self.utilization_cls = HopsUtilizationGlennTinseth self.hop = centennial self.addition_kwargs = [{u"boil_time": 60.0, u"weight": 0.57}] # Additions self.plato = 14.0 self.sg = plato_to_sg(self.plato) self.final_volume = 5.0 self.boil_time = 60.0 self.hop_addition = HopAddition( self.hop, boil_time=self.boil_time, weight=0.57, utilization_cls=self.utilization_cls, ) def test_str(self): self.assertEquals(str(self.hop_addition.utilization_cls), u"Glenn Tinseth") def test_get_ibus(self): ibu = self.hop_addition.get_ibus(self.sg, self.final_volume) self.assertEquals(round(ibu, 2), 28.52) def test_get_ibus_whole_wet(self): """ Whole Dry Weight is HOP_UTILIZATION_SCALE_PELLET times more than pellet weight Whole Wet Weight is HOP_WHOLE_DRY_TO_WET times more than dry weight """ # noqa weight = 0.57 * HOP_UTILIZATION_SCALE_PELLET * HOP_WHOLE_DRY_TO_WET hop_addition = HopAddition( self.hop, boil_time=self.boil_time, weight=weight, hop_type=HOP_TYPE_WHOLE_WET, utilization_cls=self.utilization_cls, ) ibu = hop_addition.get_ibus(self.sg, self.final_volume) self.assertEquals(round(ibu, 2), 28.52) def test_get_bigness_factor(self): bf = self.hop_addition.utilization_cls.get_bigness_factor(self.sg) self.assertEquals(round(bf, 2), 0.99) def test_get_boil_time_factor(self): bf = self.hop_addition.utilization_cls.get_boil_time_factor( self.boil_time) self.assertEquals(round(bf, 2), 0.22) def test_get_percent_utilization(self): utilization = self.hop_addition.utilization_cls.get_percent_utilization( # noqa self.sg, self.boil_time) self.assertEquals(round(utilization * 100, 2), 21.69)
def parse_hops(hop, loader, dir_suffix='hops/'): """ Parse hops data from a recipe :param dict hops: A representation of a hop :param DataLoader loader: A class to load additional information Hops must have the following top level attributes: * name (str) * weight (float) * boil_time (float) * data (dict) (optional) Additionally hops may contain override data in the 'data' attribute with the following keys: * percent_alpha_acids (float) """ HopAddition.validate(hop) hop_data = loader.get_item(dir_suffix, hop[u'name']) name = hop_data.get(u'name', hop[u'name']) alpha_acids = None if u'data' in hop: alpha_acids = hop[u'data'].get(u'percent_alpha_acids', None) if not alpha_acids: alpha_acids = hop_data.get(u'percent_alpha_acids', None) hop_obj = Hop(name, percent_alpha_acids=alpha_acids) hop_add_kwargs = { u'weight': float(hop[u'weight']), u'boil_time': hop[u'boil_time'], } if u'hop_type' in hop: hop_add_kwargs[u'hop_type'] = hop[u'hop_type'] if u'units' in hop: hop_add_kwargs[u'units'] = hop[u'units'] return HopAddition(hop_obj, **hop_add_kwargs)
def setUp(self): self.utilization_cls = HopsUtilizationJackieRager self.hop = centennial self.addition_kwargs = [{u"boil_time": 60.0, u"weight": 0.57}] # Additions self.plato = 14.0 self.sg = plato_to_sg(self.plato) self.final_volume = 5.0 self.boil_time = 60.0 self.hop_addition = HopAddition( self.hop, boil_time=self.boil_time, weight=0.57, utilization_cls=self.utilization_cls )
def test_unicode(self): hop = Hop(u"Galaxy ®", percent_alpha_acids=0.11) hop_add = HopAddition(hop, boil_time=60.0, weight=0.57) out = str(hop_add) if sys.version_info[0] >= 3: self.assertEquals( out, u"Galaxy ®, alpha 11.0%, 0.57 oz, 60.0 min, pellet") # noqa else: self.assertEquals( out, u"Galaxy ®, alpha 11.0%, 0.57 oz, 60.0 min, pellet".encode( "utf8")) # noqa
def setUp(self): self.utilization_cls = HopsUtilizationGlennTinseth self.hop = centennial self.addition_kwargs = [ { u'boil_time': 60.0, u'weight': 0.57, } ] # Additions self.plato = 14.0 self.sg = plato_to_sg(self.plato) self.final_volume = 5.0 self.boil_time = 60.0 self.hop_addition = HopAddition(self.hop, boil_time=self.boil_time, weight=0.57, utilization_cls=self.utilization_cls)
class TestHopAdditions(unittest.TestCase): def setUp(self): self.hop1 = centennial self.hop2 = cascade self.addition_kwargs = [ { u'boil_time': 60.0, u'weight': 0.57, u'utilization_cls_kwargs': {u'units': IMPERIAL_UNITS}, }, { u'boil_time': 5.0, u'weight': 0.76, u'utilization_cls_kwargs': {u'units': IMPERIAL_UNITS}, }, ] # Additions self.hop_addition1 = HopAddition(self.hop1, **self.addition_kwargs[0]) self.hop_addition2 = HopAddition(self.hop2, **self.addition_kwargs[1]) # Define Hops self.plato = 14.0 self.sg = plato_to_sg(self.plato) self.target_ibu = 40.0 self.final_volume = 5.0 def test_change_units(self): self.assertEquals(self.hop_addition1.units, IMPERIAL_UNITS) ha = self.hop_addition1.change_units() self.assertEquals(ha.units, SI_UNITS) self.assertEquals(ha.utilization_cls.units, SI_UNITS) ha = ha.change_units() self.assertEquals(ha.units, IMPERIAL_UNITS) self.assertEquals(ha.utilization_cls.units, IMPERIAL_UNITS) def test_str(self): out = str(self.hop_addition1) self.assertEquals( out, u'Centennial, alpha 14.0%, 0.57 oz, 60.0 min, pellet') def test_unicode(self): hop = Hop(u'Galaxy ®', percent_alpha_acids=0.11) hop_add = HopAddition(hop, boil_time=60.0, weight=0.57) out = str(hop_add) if sys.version_info[0] >= 3: self.assertEquals(out, u'Galaxy ®, alpha 11.0%, 0.57 oz, 60.0 min, pellet') # noqa else: self.assertEquals(out, u'Galaxy ®, alpha 11.0%, 0.57 oz, 60.0 min, pellet'.encode('utf8')) # noqa def test_repr(self): out = repr(self.hop_addition1) try: st_type = unicode # noqa self.assertEquals( out, u"HopAddition(Hop('centennial', percent_alpha_acids=0.14), weight=0.57, boil_time=60.0, hop_type='pellet', utilization_cls=HopsUtilizationGlennTinseth, utilization_cls_kwargs={u'units': u'imperial'}, units='imperial')") # noqa except NameError: self.assertEquals( out, u"HopAddition(Hop('centennial', percent_alpha_acids=0.14), weight=0.57, boil_time=60.0, hop_type='pellet', utilization_cls=HopsUtilizationGlennTinseth, utilization_cls_kwargs={'units': 'imperial'}, units='imperial')") # noqa def test_eq(self): hop_add1 = HopAddition(cascade, boil_time=5.0, weight=0.76) hop_add2 = HopAddition(cascade, boil_time=5.0, weight=0.76) self.assertTrue(hop_add1 == hop_add2) def test_ne_boil_time(self): hop_add1 = HopAddition(cascade, boil_time=5.0, weight=0.76) hop_add2 = HopAddition(cascade, boil_time=15.0, weight=0.76) self.assertTrue(hop_add1 != hop_add2) def test_ne_weight(self): hop_add1 = HopAddition(cascade, boil_time=5.0, weight=0.76) hop_add2 = HopAddition(cascade, boil_time=5.0, weight=1.76) self.assertTrue(hop_add1 != hop_add2) def test_ne_hop_type(self): hop_add1 = HopAddition(cascade, boil_time=5.0, weight=0.76) hop_add2 = HopAddition(cascade, boil_time=5.0, weight=0.76, hop_type=HOP_TYPE_WHOLE) self.assertTrue(hop_add1 != hop_add2) def test_ne_units(self): hop_add1 = HopAddition(cascade, boil_time=5.0, weight=0.76) hop_add2 = HopAddition(cascade, boil_time=5.0, weight=0.76, units=SI_UNITS) self.assertTrue(hop_add1 != hop_add2) def test_ne_hop_class(self): self.assertTrue(cascade_add != cascade) def test_to_dict(self): out = self.hop_addition1.to_dict() expected = {u'name': u'centennial', u'data': {u'percent_alpha_acids': 0.14}, u'weight': 0.57, u'boil_time': 60.0, u'hop_type': u'pellet', u'utilization_cls': u'Glenn Tinseth', u'utilization_cls_kwargs': {u'units': u'imperial'}, u'units': u'imperial', } self.assertEquals(out, expected) def test_to_json(self): out = self.hop_addition1.to_json() expected = u'{"boil_time": 60.0, "data": {"percent_alpha_acids": 0.14}, "hop_type": "pellet", "name": "centennial", "units": "imperial", "utilization_cls": "Glenn Tinseth", "utilization_cls_kwargs": {"units": "imperial"}, "weight": 0.57}' # noqa self.assertEquals(out, expected) def test_validate(self): data = self.hop_addition1.to_dict() HopAddition.validate(data) def test_format(self): out = self.hop_addition1.format() msg = textwrap.dedent(u"""\ centennial Addition ----------------------------------- Hop Type: pellet AA %: 14.0% Weight: 0.57 oz Boil Time: 60.0 min""") self.assertEquals(out, msg) def test_get_alpha_acid_units(self): out = self.hop_addition1.get_alpha_acid_units() self.assertEquals(round(out, 2), 7.98) ha = self.hop_addition1.change_units() out = ha.get_alpha_acid_units() self.assertEquals(round(out, 2), 7.98)
def test_validate(self): data = self.hop_addition1.to_dict() HopAddition.validate(data)
class TestHopAdditions(unittest.TestCase): def setUp(self): self.hop1 = centennial self.hop2 = cascade self.addition_kwargs = [ { u"boil_time": 60.0, u"weight": 0.57, u"utilization_cls_kwargs": { u"units": IMPERIAL_UNITS }, }, { u"boil_time": 5.0, u"weight": 0.76, u"utilization_cls_kwargs": { u"units": IMPERIAL_UNITS }, }, ] # Additions self.hop_addition1 = HopAddition(self.hop1, **self.addition_kwargs[0]) self.hop_addition2 = HopAddition(self.hop2, **self.addition_kwargs[1]) # Define Hops self.plato = 14.0 self.sg = plato_to_sg(self.plato) self.target_ibu = 40.0 self.final_volume = 5.0 def test_change_units(self): self.assertEquals(self.hop_addition1.units, IMPERIAL_UNITS) ha = self.hop_addition1.change_units() self.assertEquals(ha.units, SI_UNITS) self.assertEquals(ha.utilization_cls.units, SI_UNITS) ha = ha.change_units() self.assertEquals(ha.units, IMPERIAL_UNITS) self.assertEquals(ha.utilization_cls.units, IMPERIAL_UNITS) def test_str(self): out = str(self.hop_addition1) self.assertEquals( out, u"Centennial, alpha 14.0%, 0.57 oz, 60.0 min, pellet") def test_unicode(self): hop = Hop(u"Galaxy ®", percent_alpha_acids=0.11) hop_add = HopAddition(hop, boil_time=60.0, weight=0.57) out = str(hop_add) if sys.version_info[0] >= 3: self.assertEquals( out, u"Galaxy ®, alpha 11.0%, 0.57 oz, 60.0 min, pellet") # noqa else: self.assertEquals( out, u"Galaxy ®, alpha 11.0%, 0.57 oz, 60.0 min, pellet".encode( "utf8")) # noqa def test_repr(self): out = repr(self.hop_addition1) try: st_type = unicode # noqa self.assertEquals( out, u"HopAddition(Hop('centennial', percent_alpha_acids=0.14), weight=0.57, boil_time=60.0, hop_type='pellet', utilization_cls=HopsUtilizationGlennTinseth, utilization_cls_kwargs={u'units': u'imperial'}, units='imperial')", ) # noqa except NameError: self.assertEquals( out, u"HopAddition(Hop('centennial', percent_alpha_acids=0.14), weight=0.57, boil_time=60.0, hop_type='pellet', utilization_cls=HopsUtilizationGlennTinseth, utilization_cls_kwargs={'units': 'imperial'}, units='imperial')", ) # noqa def test_eq(self): hop_add1 = HopAddition(cascade, boil_time=5.0, weight=0.76) hop_add2 = HopAddition(cascade, boil_time=5.0, weight=0.76) self.assertTrue(hop_add1 == hop_add2) def test_ne_boil_time(self): hop_add1 = HopAddition(cascade, boil_time=5.0, weight=0.76) hop_add2 = HopAddition(cascade, boil_time=15.0, weight=0.76) self.assertTrue(hop_add1 != hop_add2) def test_ne_weight(self): hop_add1 = HopAddition(cascade, boil_time=5.0, weight=0.76) hop_add2 = HopAddition(cascade, boil_time=5.0, weight=1.76) self.assertTrue(hop_add1 != hop_add2) def test_ne_hop_type(self): hop_add1 = HopAddition(cascade, boil_time=5.0, weight=0.76) hop_add2 = HopAddition(cascade, boil_time=5.0, weight=0.76, hop_type=HOP_TYPE_WHOLE) self.assertTrue(hop_add1 != hop_add2) def test_ne_units(self): hop_add1 = HopAddition(cascade, boil_time=5.0, weight=0.76) hop_add2 = HopAddition(cascade, boil_time=5.0, weight=0.76, units=SI_UNITS) self.assertTrue(hop_add1 != hop_add2) def test_ne_hop_class(self): self.assertTrue(cascade_add != cascade) def test_to_dict(self): out = self.hop_addition1.to_dict() expected = { u"name": u"centennial", u"data": { u"percent_alpha_acids": 0.14 }, u"weight": 0.57, u"boil_time": 60.0, u"hop_type": u"pellet", u"utilization_cls": u"Glenn Tinseth", u"utilization_cls_kwargs": { u"units": u"imperial" }, u"units": u"imperial", } self.assertEquals(out, expected) def test_to_json(self): out = self.hop_addition1.to_json() expected = u'{"boil_time": 60.0, "data": {"percent_alpha_acids": 0.14}, "hop_type": "pellet", "name": "centennial", "units": "imperial", "utilization_cls": "Glenn Tinseth", "utilization_cls_kwargs": {"units": "imperial"}, "weight": 0.57}' # noqa self.assertEquals(out, expected) def test_validate(self): data = self.hop_addition1.to_dict() HopAddition.validate(data) def test_format(self): out = self.hop_addition1.format() msg = textwrap.dedent(u"""\ centennial Addition ----------------------------------- Hop Type: pellet AA %: 14.0% Weight: 0.57 oz Boil Time: 60.0 min""") self.assertEquals(out, msg) def test_get_alpha_acid_units(self): out = self.hop_addition1.get_alpha_acid_units() self.assertEquals(round(out, 2), 7.98) ha = self.hop_addition1.change_units() out = ha.get_alpha_acid_units() self.assertEquals(round(out, 2), 7.98)
class TestHopsUtilizationJackieRager(unittest.TestCase): def setUp(self): self.utilization_cls = HopsUtilizationJackieRager self.hop = centennial self.addition_kwargs = [{u"boil_time": 60.0, u"weight": 0.57}] # Additions self.plato = 14.0 self.sg = plato_to_sg(self.plato) self.final_volume = 5.0 self.boil_time = 60.0 self.hop_addition = HopAddition( self.hop, boil_time=self.boil_time, weight=0.57, utilization_cls=self.utilization_cls, ) def test_str(self): self.assertEquals(str(self.hop_addition.utilization_cls), u"Jackie Rager") def test_get_c_gravity(self): out = self.hop_addition.utilization_cls.get_c_gravity(self.sg) self.assertEquals(round(out, 3), 1.034) out = self.hop_addition.utilization_cls.get_c_gravity(1.050) self.assertEquals(round(out, 3), 1.000) out = self.hop_addition.utilization_cls.get_c_gravity(1.010) self.assertEquals(round(out, 3), 1.000) def test_get_ibus(self): ibu = self.hop_addition.get_ibus(self.sg, self.final_volume) self.assertEquals(round(ibu, 2), 39.18) def test_get_ibus_whole_wet(self): # Whole Dry Weight is HOP_UTILIZATION_SCALE_PELLET times more than pellet weight # Whole Wet Weight is HOP_WHOLE_DRY_TO_WET times more than dry weight weight = 0.57 * HOP_UTILIZATION_SCALE_PELLET * HOP_WHOLE_DRY_TO_WET hop_addition = HopAddition( self.hop, boil_time=self.boil_time, weight=weight, hop_type=HOP_TYPE_WHOLE_WET, utilization_cls=self.utilization_cls, ) ibu = hop_addition.get_ibus(self.sg, self.final_volume) self.assertEquals(round(ibu, 2), 39.18) def test_get_percent_utilization(self): utilization = self.hop_addition.utilization_cls.get_percent_utilization( # noqa self.sg, self.boil_time) self.assertEquals(round(utilization * 100, 2), 29.80) def test_get_utilization_table(self): gravity_list = list(range(1030, 1140, 10)) boil_time_list = list(range(0, 60, 3)) + list(range(60, 130, 10)) table = self.utilization_cls.get_utilization_table( gravity_list, boil_time_list) self.assertEquals(table[0][0], 0.051) self.assertEquals(table[13][5], 0.205) self.assertEquals(table[26][10], 0.228) def test_format_utilization_table(self): out = self.utilization_cls.format_utilization_table() expected = u"""\ Percent Alpha Acid Utilization - Boil Time vs Wort Original Gravity =================================================================== 1.030 1.040 1.050 1.060 1.070 1.080 1.090 1.100 1.110 1.120 1.130 -------------------------------------------------------------------------------------------- 0 0.051 0.051 0.051 0.049 0.047 0.045 0.043 0.041 0.039 0.038 0.037 3 0.054 0.054 0.054 0.052 0.049 0.047 0.045 0.044 0.042 0.040 0.039 6 0.059 0.059 0.059 0.056 0.053 0.051 0.049 0.047 0.045 0.044 0.042 9 0.065 0.065 0.065 0.062 0.059 0.056 0.054 0.052 0.050 0.048 0.046 12 0.072 0.072 0.072 0.069 0.066 0.063 0.060 0.058 0.056 0.054 0.052 15 0.082 0.082 0.082 0.078 0.075 0.072 0.069 0.066 0.063 0.061 0.059 18 0.095 0.095 0.095 0.090 0.086 0.082 0.079 0.076 0.073 0.070 0.068 21 0.110 0.110 0.110 0.105 0.100 0.096 0.092 0.088 0.085 0.082 0.079 24 0.128 0.128 0.128 0.122 0.117 0.112 0.107 0.103 0.099 0.095 0.092 27 0.149 0.149 0.149 0.142 0.135 0.129 0.124 0.119 0.115 0.110 0.106 30 0.171 0.171 0.171 0.163 0.156 0.149 0.143 0.137 0.132 0.127 0.122 33 0.194 0.194 0.194 0.185 0.176 0.169 0.162 0.155 0.149 0.144 0.138 36 0.216 0.216 0.216 0.206 0.196 0.188 0.180 0.173 0.166 0.160 0.154 39 0.236 0.236 0.236 0.225 0.215 0.205 0.197 0.189 0.182 0.175 0.169 42 0.254 0.254 0.254 0.242 0.231 0.221 0.212 0.203 0.195 0.188 0.181 45 0.269 0.269 0.269 0.256 0.245 0.234 0.224 0.215 0.207 0.199 0.192 48 0.281 0.281 0.281 0.268 0.256 0.245 0.234 0.225 0.216 0.208 0.201 51 0.291 0.291 0.291 0.277 0.264 0.253 0.242 0.233 0.224 0.215 0.208 54 0.298 0.298 0.298 0.284 0.271 0.259 0.249 0.239 0.229 0.221 0.213 57 0.304 0.304 0.304 0.290 0.276 0.264 0.253 0.243 0.234 0.225 0.217 60 0.308 0.308 0.308 0.294 0.280 0.268 0.257 0.247 0.237 0.228 0.220 70 0.316 0.316 0.316 0.301 0.287 0.275 0.263 0.253 0.243 0.234 0.226 80 0.318 0.318 0.318 0.303 0.289 0.277 0.265 0.255 0.245 0.236 0.227 90 0.319 0.319 0.319 0.304 0.290 0.278 0.266 0.255 0.246 0.236 0.228 100 0.320 0.320 0.320 0.304 0.290 0.278 0.266 0.256 0.246 0.237 0.228 110 0.320 0.320 0.320 0.304 0.291 0.278 0.266 0.256 0.246 0.237 0.228 120 0.320 0.320 0.320 0.304 0.291 0.278 0.266 0.256 0.246 0.237 0.228""" # noqa self.assertEquals(out, expected)
def test_ne_weight(self): hop_add1 = HopAddition(cascade, boil_time=5.0, weight=0.76) hop_add2 = HopAddition(cascade, boil_time=5.0, weight=1.76) self.assertTrue(hop_add1 != hop_add2)
pale_add = GrainAddition(pale, weight=13.96) pale_add_lme = pale_add.convert_to_lme(brew_house_yield=BHY) pale_add_dme = pale_add.convert_to_dme(brew_house_yield=BHY) crystal_add = GrainAddition(crystal, weight=0.78) grain_additions = [pale_add, crystal_add] grain_additions_lme = [pale_add_lme, crystal_add] grain_additions_dme = [pale_add_dme, crystal_add] # Define Hops centennial = Hop(name=u"centennial", percent_alpha_acids=0.14) cascade = Hop(name=u"cascade", percent_alpha_acids=0.07) hop_list = [centennial, cascade] centennial_add = HopAddition(centennial, boil_time=60.0, weight=0.57) cascade_add = HopAddition(cascade, boil_time=5.0, weight=0.76) hop_additions = [centennial_add, cascade_add] # Define Yeast yeast = Yeast(u"Wyeast 1056") # Define Recipes recipe = Recipe( name=u"pale ale", grain_additions=grain_additions, hop_additions=hop_additions, yeast=yeast, brew_house_yield=BHY, start_volume=7.0, final_volume=5.0,
class TestHopsUtilizationJackieRager(unittest.TestCase): def setUp(self): self.utilization_cls = HopsUtilizationJackieRager self.hop = centennial self.addition_kwargs = [{u"boil_time": 60.0, u"weight": 0.57}] # Additions self.plato = 14.0 self.sg = plato_to_sg(self.plato) self.final_volume = 5.0 self.boil_time = 60.0 self.hop_addition = HopAddition( self.hop, boil_time=self.boil_time, weight=0.57, utilization_cls=self.utilization_cls ) def test_str(self): self.assertEquals(str(self.hop_addition.utilization_cls), u"Jackie Rager") def test_get_c_gravity(self): out = self.hop_addition.utilization_cls.get_c_gravity(self.sg) self.assertEquals(round(out, 3), 1.034) out = self.hop_addition.utilization_cls.get_c_gravity(1.050) self.assertEquals(round(out, 3), 1.000) out = self.hop_addition.utilization_cls.get_c_gravity(1.010) self.assertEquals(round(out, 3), 1.000) def test_get_ibus(self): ibu = self.hop_addition.get_ibus(self.sg, self.final_volume) self.assertEquals(round(ibu, 2), 39.18) def test_get_percent_utilization(self): utilization = self.hop_addition.utilization_cls.get_percent_utilization(self.sg, self.boil_time) # noqa self.assertEquals(round(utilization * 100, 2), 29.80) def test_get_utilization_table(self): gravity_list = list(range(1030, 1140, 10)) boil_time_list = list(range(0, 60, 3)) + list(range(60, 130, 10)) table = self.utilization_cls.get_utilization_table(gravity_list, boil_time_list) self.assertEquals(table[0][0], 0.051) self.assertEquals(table[13][5], 0.205) self.assertEquals(table[26][10], 0.228) def test_format_utilization_table(self): out = self.utilization_cls.format_utilization_table() expected = u"""\ Percent Alpha Acid Utilization - Boil Time vs Wort Original Gravity =================================================================== 1.030 1.040 1.050 1.060 1.070 1.080 1.090 1.100 1.110 1.120 1.130 -------------------------------------------------------------------------------------------- 0 0.051 0.051 0.051 0.049 0.047 0.045 0.043 0.041 0.039 0.038 0.037 3 0.054 0.054 0.054 0.052 0.049 0.047 0.045 0.044 0.042 0.040 0.039 6 0.059 0.059 0.059 0.056 0.053 0.051 0.049 0.047 0.045 0.044 0.042 9 0.065 0.065 0.065 0.062 0.059 0.056 0.054 0.052 0.050 0.048 0.046 12 0.072 0.072 0.072 0.069 0.066 0.063 0.060 0.058 0.056 0.054 0.052 15 0.082 0.082 0.082 0.078 0.075 0.072 0.069 0.066 0.063 0.061 0.059 18 0.095 0.095 0.095 0.090 0.086 0.082 0.079 0.076 0.073 0.070 0.068 21 0.110 0.110 0.110 0.105 0.100 0.096 0.092 0.088 0.085 0.082 0.079 24 0.128 0.128 0.128 0.122 0.117 0.112 0.107 0.103 0.099 0.095 0.092 27 0.149 0.149 0.149 0.142 0.135 0.129 0.124 0.119 0.115 0.110 0.106 30 0.171 0.171 0.171 0.163 0.156 0.149 0.143 0.137 0.132 0.127 0.122 33 0.194 0.194 0.194 0.185 0.176 0.169 0.162 0.155 0.149 0.144 0.138 36 0.216 0.216 0.216 0.206 0.196 0.188 0.180 0.173 0.166 0.160 0.154 39 0.236 0.236 0.236 0.225 0.215 0.205 0.197 0.189 0.182 0.175 0.169 42 0.254 0.254 0.254 0.242 0.231 0.221 0.212 0.203 0.195 0.188 0.181 45 0.269 0.269 0.269 0.256 0.245 0.234 0.224 0.215 0.207 0.199 0.192 48 0.281 0.281 0.281 0.268 0.256 0.245 0.234 0.225 0.216 0.208 0.201 51 0.291 0.291 0.291 0.277 0.264 0.253 0.242 0.233 0.224 0.215 0.208 54 0.298 0.298 0.298 0.284 0.271 0.259 0.249 0.239 0.229 0.221 0.213 57 0.304 0.304 0.304 0.290 0.276 0.264 0.253 0.243 0.234 0.225 0.217 60 0.308 0.308 0.308 0.294 0.280 0.268 0.257 0.247 0.237 0.228 0.220 70 0.316 0.316 0.316 0.301 0.287 0.275 0.263 0.253 0.243 0.234 0.226 80 0.318 0.318 0.318 0.303 0.289 0.277 0.265 0.255 0.245 0.236 0.227 90 0.319 0.319 0.319 0.304 0.290 0.278 0.266 0.255 0.246 0.236 0.228 100 0.320 0.320 0.320 0.304 0.290 0.278 0.266 0.256 0.246 0.237 0.228 110 0.320 0.320 0.320 0.304 0.291 0.278 0.266 0.256 0.246 0.237 0.228 120 0.320 0.320 0.320 0.304 0.291 0.278 0.266 0.256 0.246 0.237 0.228""" # noqa self.assertEquals(out, expected)