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)
예제 #2
0
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)
예제 #3
0
 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)
예제 #4
0
 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)
예제 #5
0
    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
예제 #6
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)
예제 #8
0
 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)
예제 #9
0
    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,
        )
예제 #10
0
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)
예제 #11
0
    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
예제 #12
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())
예제 #13
0
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)
예제 #14
0
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)
예제 #15
0
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)
예제 #16
0
    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
        )
예제 #17
0
 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
예제 #18
0
    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)
예제 #19
0
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)
예제 #20
0
 def test_validate(self):
     data = self.hop_addition1.to_dict()
     HopAddition.validate(data)
예제 #21
0
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)
예제 #22
0
 def test_validate(self):
     data = self.hop_addition1.to_dict()
     HopAddition.validate(data)
예제 #23
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_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)
예제 #24
0
 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)
예제 #25
0
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,
예제 #26
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)