gravitheque 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,50 @@
1
+ # Various yeast related calculations
2
+ module Yeast
3
+
4
+ # Calculates yeast cells required for fermentation
5
+ #
6
+ # @note
7
+ # Extract must be measured in Plato, volume in liters
8
+ #
9
+ # @example
10
+ # Yeast.cells_required({
11
+ # extract: 15,
12
+ # volume: 20
13
+ # })
14
+ #
15
+ # Yeast.cells_required({
16
+ # extract: 15,
17
+ # volume: 20,
18
+ # type: lager
19
+ # })
20
+ #
21
+ # @param [Hash] data data required to calculate yeast cells required; `extract`, `volume` and optionally `type`. `type` defaults to `:ale` but may also be `:hybrid` or `:lager`
22
+ # @return [Fixnum] yeast cells required
23
+ def self.cells_required data
24
+ type = data[:type] || :ale
25
+
26
+ cells_per_milliliter = case type
27
+ when :ale then 750_000
28
+ when :hybrid then 1_125_000
29
+ when :lager then 1_500_000
30
+ end
31
+
32
+ (cells_per_milliliter * (data[:volume] * 1000) * data[:extract]).round
33
+ end
34
+
35
+ # Calculates apparent attenuation
36
+ #
37
+ # @note
38
+ # Extract must be measured in Plato
39
+ #
40
+ # @example
41
+ # Yeast.attenuation 13.5, 3.1
42
+ #
43
+ # @param [Float] original original Plato
44
+ # @param [Float] current current Plato
45
+ # @return [Fixnum] apparent attenuation
46
+ def self.attenuation original, current
47
+ (((original - current) / original) * 100).round
48
+ end
49
+
50
+ end
@@ -0,0 +1,3 @@
1
+ $:.push File.expand_path "../../lib", __FILE__
2
+
3
+ require "minitest/autorun"
@@ -0,0 +1,14 @@
1
+ require_relative "helper"
2
+ require "alcohol"
3
+
4
+ describe Alcohol do
5
+
6
+ it "must calculate alcohol by weight" do
7
+ (Alcohol.by_weight 13, 2.5).must_equal 4.5
8
+ end
9
+
10
+ it "must calculate alcohol by volume" do
11
+ (Alcohol.by_volume 13, 2.5).must_equal 5.7
12
+ end
13
+
14
+ end
@@ -0,0 +1,18 @@
1
+ require_relative "helper"
2
+ require "calories"
3
+
4
+ describe Calories do
5
+
6
+ it "must calculate calories from alcohol" do
7
+ (Calories.from_alcohol 1.053, 1.01).must_equal 113
8
+ end
9
+
10
+ it "must calculate calories from extract" do
11
+ (Calories.from_extract 1.053, 1.01).must_equal 62
12
+ end
13
+
14
+ it "must calculate calories per serving" do
15
+ (Calories.per_serving 1.053, 1.01).must_equal 175
16
+ end
17
+
18
+ end
@@ -0,0 +1,68 @@
1
+ require_relative "helper"
2
+ require "hops"
3
+
4
+ describe Hops do
5
+
6
+ it "must adjust IBUs based on boil time" do
7
+ (Hops.time_adjustment 60).must_equal 0.91
8
+ end
9
+
10
+ it "must adjust IBUs based on extract" do
11
+ (Hops.extract_adjustment 1.055).must_equal 1.01
12
+ end
13
+
14
+ it "must calculate hop utilization" do
15
+ (Hops.utilization 10, 1.065).must_equal 0.07
16
+ end
17
+
18
+ it "must calculate IBUs from hop addition" do
19
+ Hops.ibus({
20
+ extract: 1.05,
21
+ time: 60,
22
+ alpha: 5.0,
23
+ mass: 56,
24
+ volume: 19
25
+ }).must_equal 34
26
+ end
27
+
28
+ it "must calculate hop mass required" do
29
+ Hops.mass_required({
30
+ extract: 1.05,
31
+ time: 60,
32
+ alpha: 5.0,
33
+ ibus: 34,
34
+ volume: 19
35
+ }).must_equal 56
36
+ end
37
+
38
+ it "must calculate milliliters of HopShot required" do
39
+ Hops.hopshot_required({
40
+ ibus: 35,
41
+ time: 60,
42
+ volume: 19,
43
+ extract: 1.045
44
+ }).must_equal 3.5
45
+
46
+ Hops.hopshot_required({
47
+ ibus: 80,
48
+ time: 60,
49
+ volume: 38,
50
+ extract: 1.085
51
+ }).must_equal 17.6
52
+
53
+ Hops.hopshot_required({
54
+ ibus: 80,
55
+ time: 60,
56
+ volume: 38,
57
+ extract: 1.1
58
+ }).must_equal 19.2
59
+
60
+ Hops.hopshot_required({
61
+ ibus: 60,
62
+ time: 90,
63
+ volume: 19,
64
+ extract: 1.15
65
+ }).must_equal 7.2
66
+ end
67
+
68
+ end
@@ -0,0 +1,30 @@
1
+ require_relative "helper"
2
+ require "mash"
3
+
4
+ describe Mash do
5
+
6
+ it "must calculate strike temperature" do
7
+ Mash.strike_temperature({
8
+ initial: 21,
9
+ target: 40,
10
+ ratio: 1.5
11
+ }).must_equal 45
12
+
13
+ Mash.strike_temperature({
14
+ initial: 16,
15
+ target: 66,
16
+ ratio: 1.5,
17
+ adjustment: 1.015
18
+ }).must_equal 81
19
+ end
20
+
21
+ it "must calculate infusion volume" do
22
+ Mash.infusion_volume({
23
+ initial: 40,
24
+ target: 60,
25
+ mass: 3.6,
26
+ volume: 3.6
27
+ }).must_equal 2.5
28
+ end
29
+
30
+ end
@@ -0,0 +1,68 @@
1
+ require_relative "helper"
2
+ require "numbers"
3
+
4
+ describe "Numbers" do
5
+
6
+ it "must convert specific gravity to Plato" do
7
+ 1.055.to_plato.must_equal 13.5
8
+ 1.120.to_plato.must_equal 28.0
9
+ end
10
+
11
+ it "must convert Plato to specific gravity" do
12
+ 13.5.to_specific_gravity.must_equal 1.055
13
+ 28.0.to_specific_gravity.must_equal 1.120
14
+ 28.to_specific_gravity.must_equal 1.120
15
+ end
16
+
17
+ it "must convert specific gravity to temperature corrected specific gravity" do
18
+ (1.055.to_temperature_corrected_specific_gravity 3).must_equal 1.054
19
+ (1.055.to_temperature_corrected_specific_gravity 40).must_equal 1.062
20
+ (1.055.to_temperature_corrected_specific_gravity 80).must_equal 1.082
21
+ (1.055.to_temperature_corrected_specific_gravity 37, :fahrenheit).must_equal 1.054
22
+ (1.055.to_temperature_corrected_specific_gravity 104, :fahrenheit).must_equal 1.062
23
+ (1.055.to_temperature_corrected_specific_gravity 176, :fahrenheit).must_equal 1.082
24
+ end
25
+
26
+ it "must convert Fahenheit to Celsius" do
27
+ 37.to_celsius.must_equal 3
28
+ 104.to_celsius.must_equal 40
29
+ 176.to_celsius.must_equal 80
30
+ end
31
+
32
+ it "must convert Celsius to Fahenheit" do
33
+ 3.to_fahrenheit.must_equal 37
34
+ 40.to_fahrenheit.must_equal 104
35
+ 80.to_fahrenheit.must_equal 176
36
+ end
37
+
38
+ it "must convert gallons to liters" do
39
+ 5.5.to_liters.must_equal 20.8
40
+ 5.to_liters.must_equal 18.9
41
+ end
42
+
43
+ it "must convert quarts to liters" do
44
+ (20.5.to_liters :quarts).must_equal 19.4
45
+ (16.to_liters :quarts).must_equal 15.1
46
+ end
47
+
48
+ it "must convert ounces to grams" do
49
+ 2.to_grams.must_equal 56.7
50
+ 4.5.to_grams.must_equal 127.6
51
+ end
52
+
53
+ it "must convert grams to ounces" do
54
+ 56.to_ounces.must_equal 2.0
55
+ 127.6.to_ounces.must_equal 4.5
56
+ end
57
+
58
+ it "must convert pounds to kilograms" do
59
+ 10.to_kilograms.must_equal 4.5
60
+ 20.5.to_kilograms.must_equal 9.3
61
+ end
62
+
63
+ it "must convert kilograms to pounds" do
64
+ 4.to_pounds.must_equal 8.8
65
+ 10.6.to_pounds.must_equal 23.4
66
+ end
67
+
68
+ end
@@ -0,0 +1,47 @@
1
+ require_relative "helper"
2
+ require "yeast"
3
+
4
+ describe Yeast do
5
+
6
+ it "must calculate yeast cells required" do
7
+ Yeast.cells_required({
8
+ extract: 12,
9
+ volume: 20
10
+ }).must_equal 180_000_000_000
11
+
12
+ Yeast.cells_required({
13
+ extract: 12,
14
+ volume: 20,
15
+ type: :hybrid
16
+ }).must_equal 270_000_000_000
17
+
18
+ Yeast.cells_required({
19
+ extract: 12,
20
+ volume: 20,
21
+ type: :lager
22
+ }).must_equal 360_000_000_000
23
+ end
24
+
25
+ it "must calculate apparent attenuation" do
26
+ (Yeast.attenuation 13.5, 3.1).must_equal 77
27
+ end
28
+
29
+ end
30
+
31
+ # it "must calculate apparent attenuation" do
32
+ # (Calculate.apparent_attenuation 13.5, 3.1).must_equal 77
33
+ # end
34
+ #
35
+ # it "must calculate apparent attenuation from specific gravity" do
36
+ # (Calculate.apparent_attenuation 1.055, 1.012, :specific_gravity).must_equal 77
37
+ # end
38
+ #
39
+ # it "must calculate apparent attenuation from brix" do
40
+ # (Calculate.apparent_attenuation 13.3, 7.1, :brix).must_equal 77
41
+ # end
42
+ #
43
+ # it "must raise an exception when the extract unit is unrecognized" do
44
+ # lambda { Calculate.apparent_attenuation 10, 5, :dunno }.must_raise ArgumentError
45
+ # end
46
+ #
47
+ # end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gravitheque
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-02 00:00:00.000000000 Z
12
+ date: 2012-02-05 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Tools for brewers.
15
15
  email:
@@ -27,28 +27,19 @@ files:
27
27
  - README.md
28
28
  - bin/test
29
29
  - gravitheque.gemspec
30
- - lib/calculators.rb
31
- - lib/calculators/alcohol.rb
32
- - lib/calculators/calories.rb
33
- - lib/calculators/hops.rb
34
- - lib/calculators/mash.rb
35
- - lib/calculators/yeast.rb
36
- - lib/conversions.rb
37
- - lib/conversions/extract.rb
38
- - lib/conversions/mass.rb
39
- - lib/conversions/temperature.rb
40
- - lib/conversions/volume.rb
41
- - lib/gravitheque.rb
42
- - test/calculators/test_alcohol.rb
43
- - test/calculators/test_calories.rb
44
- - test/calculators/test_hops.rb
45
- - test/calculators/test_mash.rb
46
- - test/calculators/test_yeast.rb
47
- - test/conversions/test_extract.rb
48
- - test/conversions/test_mass.rb
49
- - test/conversions/test_temperature.rb
50
- - test/conversions/test_volume.rb
51
- - test/test_helper.rb
30
+ - lib/alcohol.rb
31
+ - lib/calories.rb
32
+ - lib/hops.rb
33
+ - lib/mash.rb
34
+ - lib/numbers.rb
35
+ - lib/yeast.rb
36
+ - test/helper.rb
37
+ - test/test_alcohol.rb
38
+ - test/test_calories.rb
39
+ - test/test_hops.rb
40
+ - test/test_mash.rb
41
+ - test/test_numbers.rb
42
+ - test/test_yeast.rb
52
43
  homepage: http://gravitheque.herokuapp.com/
53
44
  licenses: []
54
45
  post_install_message:
@@ -74,14 +65,11 @@ signing_key:
74
65
  specification_version: 3
75
66
  summary: The library that will eventually power the web application of the same name.
76
67
  test_files:
77
- - test/calculators/test_alcohol.rb
78
- - test/calculators/test_calories.rb
79
- - test/calculators/test_hops.rb
80
- - test/calculators/test_mash.rb
81
- - test/calculators/test_yeast.rb
82
- - test/conversions/test_extract.rb
83
- - test/conversions/test_mass.rb
84
- - test/conversions/test_temperature.rb
85
- - test/conversions/test_volume.rb
86
- - test/test_helper.rb
68
+ - test/helper.rb
69
+ - test/test_alcohol.rb
70
+ - test/test_calories.rb
71
+ - test/test_hops.rb
72
+ - test/test_mash.rb
73
+ - test/test_numbers.rb
74
+ - test/test_yeast.rb
87
75
  has_rdoc:
@@ -1,6 +0,0 @@
1
- require "calculators/alcohol"
2
- require "calculators/calories"
3
-
4
- # Zymological mathematics.
5
- module Calculate
6
- end
@@ -1,71 +0,0 @@
1
- require "conversions/extract"
2
-
3
- module Calculate
4
-
5
- # Calculates alcohol by weight given original and terminal extract levels.
6
- # Supported extract units are `:brix`, `:plato` and `:specific_gravity`. Default: `:plato`
7
- #
8
- # @example
9
- # Calculate.alcohol_by_weight({ original: 17.5, terminal: 3.2 })
10
- #
11
- # Calculate.alcohol_by_weight({
12
- # original: 1.055,
13
- # terminal: 1.010
14
- # }, :specific_gravity)
15
- #
16
- # Calculate.alcohol_by_weight({
17
- # original: 15.2,
18
- # terminal: 7.8
19
- # }, :brix)
20
- #
21
- # @param [Hash] extract the original and terminal extract levels
22
- # @param [Symbol] unit the unit used to measure extract
23
- # @return [Float] the alcohol content by weight
24
- def self.alcohol_by_weight extract, units = :plato
25
- original = extract[:original]
26
- terminal = extract[:terminal]
27
-
28
- unless units == :plato
29
- case units
30
- when :specific_gravity
31
- original = Convert.specific_gravity_to_plato(extract[:original])
32
- terminal = Convert.specific_gravity_to_plato(extract[:terminal])
33
- when :brix
34
- original = Convert.specific_gravity_to_plato(
35
- Convert.brix_to_specific_gravity(extract[:original]))
36
- terminal = Convert.specific_gravity_to_plato(
37
- Convert.terminal_brix_to_terminal_gravity(
38
- extract[:original], extract[:terminal]))
39
- else
40
- raise ArgumentError, "#{units} is an unknown unit of extract. Use :brix, :plato or :specific_gravity"
41
- end
42
- end
43
-
44
- ((original - ((0.1808 * original) + (0.8192 * terminal))) /
45
- (2.0665 - (0.010665 * original))).round 1
46
- end
47
-
48
- # Calculates alcohol by volume given original and terminal extract levels.
49
- # Supported extract units are `:brix`, `:plato` and `:specific_gravity`. Default: `:plato`
50
- #
51
- # @example
52
- # Calculate.alcohol_by_volume({ original: 17.5, terminal: 3.2 })
53
- #
54
- # Calculate.alcohol_by_volume({
55
- # original: 1.055,
56
- # terminal: 1.010
57
- # }, :specific_gravity)
58
- #
59
- # Calculate.alcohol_by_volume({
60
- # original: 15.2,
61
- # terminal: 7.8
62
- # }, :brix)
63
- #
64
- # @param [Hash] extract the original and terminal extract levels
65
- # @param [Symbol] unit the unit used to measure extract
66
- # @return [Float] the alcohol content by volume
67
- def self.alcohol_by_volume extract, units = :plato
68
- ((alcohol_by_weight extract, units) / 0.793573).round 1
69
- end
70
-
71
- end