beerxml 0.0.2 → 0.3.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.
- data/beerxml.gemspec +0 -1
- data/lib/beerxml.rb +0 -1
- data/lib/beerxml/fermentable.rb +9 -1
- data/lib/beerxml/hop.rb +3 -3
- data/lib/beerxml/model.rb +22 -7
- data/lib/beerxml/properties.rb +5 -1
- data/lib/beerxml/recipe.rb +17 -3
- data/lib/beerxml/unit.rb +0 -15
- data/lib/beerxml/version.rb +1 -1
- data/lib/beerxml/yeast.rb +26 -0
- data/spec/dumping_spec.rb +37 -0
- data/spec/full_stack_spec.rb +106 -0
- data/spec/parsing_spec.rb +21 -1
- data/spec/recipes_spec.rb +7 -1
- data/spec/spec_helper.rb +2 -0
- metadata +19 -29
data/beerxml.gemspec
CHANGED
@@ -20,7 +20,6 @@ Gem::Specification.new do |s|
|
|
20
20
|
s.add_dependency "nokogiri", "~> 1.4"
|
21
21
|
s.add_dependency "dm-core", "~> 1.0"
|
22
22
|
s.add_dependency "dm-validations", "~> 1.0"
|
23
|
-
s.add_dependency "dm-types", "~> 1.0"
|
24
23
|
|
25
24
|
s.add_development_dependency "rspec", "~> 2.5"
|
26
25
|
s.add_development_dependency "autotest-standalone"
|
data/lib/beerxml.rb
CHANGED
data/lib/beerxml/fermentable.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
class Beerxml::Fermentable < Beerxml::Model
|
2
2
|
property :name, String, :required => true
|
3
|
-
property :type,
|
3
|
+
property :type, String, :set => ['Grain', 'Sugar', 'Extract', 'Dry Extract', 'Adjunct'], :required => true
|
4
4
|
property :amount, Weight, :required => true
|
5
5
|
property :yield, Float, :required => true
|
6
6
|
property :color, Float, :required => true
|
@@ -21,6 +21,10 @@ class Beerxml::Fermentable < Beerxml::Model
|
|
21
21
|
property :id, Serial
|
22
22
|
belongs_to :recipe, :required => false
|
23
23
|
|
24
|
+
def ppg=(ppg)
|
25
|
+
self.yield = Beerxml.round((ppg / 46.214) / 0.01, 2)
|
26
|
+
end
|
27
|
+
|
24
28
|
def ppg
|
25
29
|
# potential is (yield * 0.001 + 1)
|
26
30
|
(self.yield * 0.01) * 46.214
|
@@ -31,4 +35,8 @@ class Beerxml::Fermentable < Beerxml::Model
|
|
31
35
|
total *= (efficiency * 0.01) unless efficiency.nil? || type != 'Grain'
|
32
36
|
total
|
33
37
|
end
|
38
|
+
|
39
|
+
def total_color
|
40
|
+
amount.in_pounds.to_f * color
|
41
|
+
end
|
34
42
|
end
|
data/lib/beerxml/hop.rb
CHANGED
@@ -2,12 +2,12 @@ class Beerxml::Hop < Beerxml::Model
|
|
2
2
|
property :name, String, :required => true
|
3
3
|
property :alpha, Float, :required => true
|
4
4
|
property :amount, Weight, :required => true
|
5
|
-
property :use,
|
5
|
+
property :use, String, :set => ['Boil', 'Dry Hop', 'Mash', 'First Wort', 'Aroma'], :required => true
|
6
6
|
property :time, Time, :required => true
|
7
7
|
|
8
8
|
property :notes, String, :length => 65535
|
9
|
-
property :type,
|
10
|
-
property :form,
|
9
|
+
property :type, String, :set => ['Bittering', 'Aroma', 'Both']
|
10
|
+
property :form, String, :set => ['Pellet', 'Plug', 'Leaf']
|
11
11
|
property :beta, Float
|
12
12
|
property :hsi, Float
|
13
13
|
property :origin, String, :length => 512
|
data/lib/beerxml/model.rb
CHANGED
@@ -43,13 +43,10 @@ class Beerxml::Model
|
|
43
43
|
read_xml_field(node, property.name.to_s)
|
44
44
|
end
|
45
45
|
# load any has-many relationships with other beerxml models
|
46
|
-
|
47
|
-
child_model = rel.child_model
|
48
|
-
next unless child_model.ancestors.include?(Beerxml::Model)
|
49
|
-
|
46
|
+
each_beerxml_relationship do |rel|
|
50
47
|
# look for the plural element in the children of this node
|
51
48
|
# e.g., for Hop, see if there's any HOPS element.
|
52
|
-
(node>child_model.beerxml_plural_name).each do |child_wrapper_node|
|
49
|
+
(node>rel.child_model.beerxml_plural_name).each do |child_wrapper_node|
|
53
50
|
collection = Beerxml::Model.collection_from_xml(child_wrapper_node)
|
54
51
|
self.send(rel.name).concat(collection)
|
55
52
|
end
|
@@ -83,9 +80,16 @@ class Beerxml::Model
|
|
83
80
|
attributes.each do |attr, val|
|
84
81
|
next if attr.to_s.match(/id\z/) || val.nil?
|
85
82
|
x = Nokogiri::XML::Node.new(self.class.xml_attr_name(attr), parent)
|
86
|
-
x.content = val
|
83
|
+
x.content = self.class.properties[attr].dump(val)
|
87
84
|
node.add_child(x)
|
88
85
|
end
|
86
|
+
each_beerxml_relationship do |rel|
|
87
|
+
objs = self.send(rel.name)
|
88
|
+
next if objs.empty?
|
89
|
+
sub_node = Nokogiri::XML::Node.new(rel.child_model.beerxml_plural_name, node)
|
90
|
+
node.add_child(sub_node)
|
91
|
+
objs.each { |o| o.to_beerxml(sub_node) }
|
92
|
+
end
|
89
93
|
parent.add_child(node)
|
90
94
|
parent
|
91
95
|
end
|
@@ -97,7 +101,18 @@ class Beerxml::Model
|
|
97
101
|
def self.xml_attr_name(name)
|
98
102
|
name.to_s.upcase
|
99
103
|
end
|
104
|
+
|
105
|
+
def beerxml_relationships
|
106
|
+
[]
|
107
|
+
end
|
108
|
+
|
109
|
+
def each_beerxml_relationship
|
110
|
+
relationships.each do |name, rel|
|
111
|
+
next unless beerxml_relationships.include?(rel.name)
|
112
|
+
yield rel
|
113
|
+
end
|
114
|
+
end
|
100
115
|
end
|
101
116
|
|
102
|
-
%w(hop recipe fermentable).
|
117
|
+
%w(hop recipe fermentable yeast).
|
103
118
|
each { |f| require "beerxml/#{f}" }
|
data/lib/beerxml/properties.rb
CHANGED
@@ -8,10 +8,14 @@ module Beerxml::Properties
|
|
8
8
|
true
|
9
9
|
end
|
10
10
|
|
11
|
+
def primitive?(value)
|
12
|
+
value.is_a?(Beerxml::Unit) && value.type == unit_type
|
13
|
+
end
|
14
|
+
|
11
15
|
def load(value)
|
12
16
|
return if value.nil?
|
13
17
|
if value.is_a?(Beerxml::Unit)
|
14
|
-
raise(ArgumentError,
|
18
|
+
raise(ArgumentError, "#{value.inspect} is not a #{unit_type}") unless value.type == unit_type
|
15
19
|
value
|
16
20
|
else
|
17
21
|
U(value, base_unit)
|
data/lib/beerxml/recipe.rb
CHANGED
@@ -2,7 +2,7 @@ class Beerxml::Recipe < Beerxml::Model
|
|
2
2
|
include DataMapper::Resource
|
3
3
|
|
4
4
|
property :name, String, :required => true
|
5
|
-
property :type,
|
5
|
+
property :type, String, :set => ['Extract', 'Partial Mash', 'All Grain'], :required => true
|
6
6
|
# has 1, :style, :required => true
|
7
7
|
property :brewer, String, :required => true
|
8
8
|
property :batch_size, Volume, :required => true
|
@@ -14,9 +14,13 @@ class Beerxml::Recipe < Beerxml::Model
|
|
14
14
|
has n, :hops
|
15
15
|
has n, :fermentables
|
16
16
|
# has n, :miscs
|
17
|
-
|
17
|
+
has n, :yeasts
|
18
18
|
# has n, :waters
|
19
19
|
|
20
|
+
def beerxml_relationships
|
21
|
+
[:hops, :fermentables, :miscs, :yeasts, :waters]
|
22
|
+
end
|
23
|
+
|
20
24
|
property :asst_brewer, String
|
21
25
|
property :notes, String, :length => 65535
|
22
26
|
property :taste_notes, String, :length => 65535
|
@@ -47,7 +51,7 @@ class Beerxml::Recipe < Beerxml::Model
|
|
47
51
|
property :id, Serial
|
48
52
|
|
49
53
|
def tinseth
|
50
|
-
Beerxml.round(hops.select { |h| h.use == 'Boil' }.inject(0) { |v, h| v + h.tinseth(
|
54
|
+
Beerxml.round(hops.select { |h| h.use == 'Boil' }.inject(0) { |v, h| v + h.tinseth(calculate_og, batch_size) }, 1)
|
51
55
|
end
|
52
56
|
alias_method :ibus, :tinseth
|
53
57
|
|
@@ -56,4 +60,14 @@ class Beerxml::Recipe < Beerxml::Model
|
|
56
60
|
og = 1 + ((total_ppg / batch_size.in_gallons.to_f) * 0.001)
|
57
61
|
Beerxml.round(og, 3)
|
58
62
|
end
|
63
|
+
|
64
|
+
def calculate_fg
|
65
|
+
og = calculate_og
|
66
|
+
Beerxml.round(og - ((og - 1) * yeasts.first.attenuation * 0.01), 3)
|
67
|
+
end
|
68
|
+
|
69
|
+
def color
|
70
|
+
color = fermentables.inject(0) { |v, f| v + f.total_color }
|
71
|
+
Beerxml.round(1.4922 * ((color / batch_size.in_gallons.to_f) ** 0.6859), 1)
|
72
|
+
end
|
59
73
|
end
|
data/lib/beerxml/unit.rb
CHANGED
@@ -96,25 +96,10 @@ class Unit
|
|
96
96
|
end
|
97
97
|
end
|
98
98
|
|
99
|
-
# todo: remove this, to_beerxml is using it (and incorrectly at that)
|
100
|
-
def to_s
|
101
|
-
to_f.to_s
|
102
|
-
end
|
103
|
-
|
104
99
|
def inspect
|
105
100
|
"[#{to_f} #{unit}]"
|
106
101
|
end
|
107
102
|
|
108
|
-
def *(rhs)
|
109
|
-
if rhs.is_a?(Numeric)
|
110
|
-
ret = Unit.new(self.to_f * rhs, self.unit)
|
111
|
-
elsif rhs.is_a?(Unit) && rhs.type == type
|
112
|
-
ret = Unit.new(self.to_f * rhs.to(self.unit).to_f, self.unit)
|
113
|
-
else
|
114
|
-
super
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
103
|
# Assumes earth gravity ;)
|
119
104
|
module Weight
|
120
105
|
def self.included(k)
|
data/lib/beerxml/version.rb
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
class Beerxml::Yeast < Beerxml::Model
|
2
|
+
include DataMapper::Resource
|
3
|
+
|
4
|
+
property :name, String, :required => true
|
5
|
+
property :type, String, :set => ['Ale', 'Lager', 'Wheat', 'Wine', 'Champagne'], :required => true
|
6
|
+
property :form, String, :set => ['Liquid', 'Dry', 'Slant', 'Culture'], :required => true
|
7
|
+
# TODO: sheesh... this can be a Weight instead, if amount_is_weight
|
8
|
+
property :amount, Volume, :required => true
|
9
|
+
|
10
|
+
property :amount_is_weight, Boolean
|
11
|
+
property :laboratory, String
|
12
|
+
property :product_id, String
|
13
|
+
property :min_temperature, Temperature
|
14
|
+
property :max_temperature, Temperature
|
15
|
+
property :flocculation, String, :set => ['Low', 'Medium', 'High', 'Very High']
|
16
|
+
property :attenuation, Float
|
17
|
+
property :notes, String, :length => 65535
|
18
|
+
property :best_for, String
|
19
|
+
property :times_cultured, Integer
|
20
|
+
property :max_reuse, Integer
|
21
|
+
property :add_to_secondary, Boolean
|
22
|
+
|
23
|
+
# these are not used in the xml
|
24
|
+
property :id, Serial
|
25
|
+
belongs_to :recipe, :required => false
|
26
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/spec_helper"
|
2
|
+
|
3
|
+
describe "dumping" do
|
4
|
+
describe "sanity checks" do
|
5
|
+
it "should dump hops" do
|
6
|
+
model = Beerxml::Hop.new({
|
7
|
+
:name => 'Northern Brewer',
|
8
|
+
:origin => 'Germany',
|
9
|
+
:alpha => 8.5,
|
10
|
+
:amount => 0.0,
|
11
|
+
:use => 'Boil',
|
12
|
+
:time => 0.0,
|
13
|
+
:notes => %{Also called Hallertauer Northern Brewers
|
14
|
+
Use for: Bittering and finishing both ales and lagers of all kinds
|
15
|
+
Aroma: Fine, dry, clean bittering hop. Unique flavor.
|
16
|
+
Substitute: Hallertauer Mittelfrueh, Hallertauer
|
17
|
+
Examples: Anchor Steam, Old Peculiar, },
|
18
|
+
:type => 'Both',
|
19
|
+
:form => 'Pellet',
|
20
|
+
:beta => 4.0,
|
21
|
+
:hsi => 35.0,
|
22
|
+
})
|
23
|
+
model.should be_valid
|
24
|
+
xml = model.to_beerxml.root
|
25
|
+
(xml>'NAME').text.should == 'Northern Brewer'
|
26
|
+
(xml>'ORIGIN').text.should == 'Germany'
|
27
|
+
(xml>'ALPHA').text.should == '8.5'
|
28
|
+
(xml>'AMOUNT').text.should == '0.0'
|
29
|
+
(xml>'USE').text.should == 'Boil'
|
30
|
+
(xml>'TIME').text.should == '0.0'
|
31
|
+
(xml>'TYPE').text.should == 'Both'
|
32
|
+
(xml>'FORM').text.should == 'Pellet'
|
33
|
+
(xml>'BETA').text.should == '4.0'
|
34
|
+
(xml>'HSI').text.should == '35.0'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require "#{File.dirname(__FILE__)}/spec_helper"
|
2
|
+
|
3
|
+
include Beerxml
|
4
|
+
|
5
|
+
describe "Centennial Blonde" do
|
6
|
+
before(:each) do
|
7
|
+
# http://www.homebrewtalk.com/f66/centennial-blonde-simple-4-all-grain-5-10-gall-42841/
|
8
|
+
@recipe = Recipe.new(:name => 'Centennial Blonde',
|
9
|
+
:type => 'All Grain',
|
10
|
+
:brewer => 'BierMuncher',
|
11
|
+
:batch_size => 5.5.gallons,
|
12
|
+
:boil_size => 6.75.gallons,
|
13
|
+
:boil_time => 60.minutes,
|
14
|
+
:efficiency => 70.0)
|
15
|
+
@recipe.hops << Hop.new(:name => 'Centennial',
|
16
|
+
:alpha => 9.5,
|
17
|
+
:amount => 0.25.oz,
|
18
|
+
:use => 'Boil',
|
19
|
+
:time => 55)
|
20
|
+
@recipe.hops << Hop.new(:name => 'Centennial',
|
21
|
+
:alpha => 9.5,
|
22
|
+
:amount => 0.25.oz,
|
23
|
+
:use => 'Boil',
|
24
|
+
:time => 35)
|
25
|
+
@recipe.hops << Hop.new(:name => 'Cascade',
|
26
|
+
:alpha => 7.8,
|
27
|
+
:amount => 0.25.oz,
|
28
|
+
:use => 'Boil',
|
29
|
+
:time => 20)
|
30
|
+
@recipe.hops << Hop.new(:name => 'Cascade',
|
31
|
+
:alpha => 7.8,
|
32
|
+
:amount => 0.25.oz,
|
33
|
+
:use => 'Boil',
|
34
|
+
:time => 5)
|
35
|
+
@recipe.fermentables << Fermentable.new(:name => 'Pale Malt (2 Row)',
|
36
|
+
:type => 'Grain',
|
37
|
+
:amount => 7.pounds,
|
38
|
+
:ppg => 37,
|
39
|
+
:color => 2)
|
40
|
+
@recipe.fermentables << Fermentable.new(:name => 'Cara-Pils',
|
41
|
+
:type => 'Grain',
|
42
|
+
:amount => 0.75.lb,
|
43
|
+
:ppg => 33,
|
44
|
+
:color => 2)
|
45
|
+
@recipe.fermentables << Fermentable.new(:name => 'Crystal 10L',
|
46
|
+
:type => 'Grain',
|
47
|
+
:amount => 0.5.pounds,
|
48
|
+
:ppg => 35,
|
49
|
+
:color => 10)
|
50
|
+
@recipe.fermentables << Fermentable.new(:name => 'Vienna',
|
51
|
+
:type => 'Grain',
|
52
|
+
:amount => U(0.5, 'lb'),
|
53
|
+
:ppg => 35,
|
54
|
+
:color => 4)
|
55
|
+
@recipe.yeasts << Yeast.new(:name => 'Nottingham',
|
56
|
+
:type => 'Ale',
|
57
|
+
:form => 'Dry',
|
58
|
+
:amount => 0.2.liters,
|
59
|
+
:attenuation => 75)
|
60
|
+
@recipe.should be_valid
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should calculate basic stats" do
|
64
|
+
@recipe.ibus.round.should == 20
|
65
|
+
@recipe.calculate_og.should == 1.041
|
66
|
+
@recipe.calculate_fg.should == 1.010
|
67
|
+
@recipe.color == 3.9
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should survive the serialization round trip" do
|
71
|
+
xml = Nokogiri::XML(@recipe.to_xml)
|
72
|
+
r2 = Recipe.new.from_xml(xml.root)
|
73
|
+
r2.should be_valid
|
74
|
+
r2.attributes.should == @recipe.attributes
|
75
|
+
r2.each_beerxml_relationship do |rel|
|
76
|
+
r2.send(rel.name).map(&:attributes).should == @recipe.send(rel.name).map(&:attributes)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should calculate basic stats for the extract version" do
|
81
|
+
@extract = Recipe.new(:name => 'Centennial Blonde',
|
82
|
+
:type => 'Extract',
|
83
|
+
:brewer => 'BierMuncher',
|
84
|
+
:batch_size => U(5.5, 'gallons'),
|
85
|
+
:boil_size => U(6.75, 'gallons'),
|
86
|
+
:boil_time => U(60, 'minutes'),
|
87
|
+
:efficiency => 70.0)
|
88
|
+
@extract.hops.concat @recipe.hops
|
89
|
+
@extract.yeasts.concat @recipe.yeasts
|
90
|
+
@extract.fermentables << Fermentable.new(:name => 'Extra Light DME',
|
91
|
+
:type => 'Dry Extract',
|
92
|
+
:amount => U(5, 'lb'),
|
93
|
+
:ppg => 43,
|
94
|
+
:color => 3)
|
95
|
+
@extract.fermentables << Fermentable.new(:name => 'Cara-Pils',
|
96
|
+
:type => 'Grain',
|
97
|
+
:amount => U(1, 'lb'),
|
98
|
+
:ppg => 33,
|
99
|
+
:color => 2)
|
100
|
+
@extract.should be_valid
|
101
|
+
@extract.ibus.round.should == 20
|
102
|
+
@extract.calculate_og.should == 1.043
|
103
|
+
@extract.calculate_fg.should == 1.011
|
104
|
+
@extract.color == 3.2
|
105
|
+
end
|
106
|
+
end
|
data/spec/parsing_spec.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require "#{File.dirname(__FILE__)}/spec_helper"
|
2
2
|
|
3
|
-
describe "
|
3
|
+
describe "parsing" do
|
4
4
|
it "should parse the first recipe and its hops" do
|
5
5
|
recipe = Beerxml::Recipe.new.from_xml(read_xml("recipes").root.children[1])
|
6
6
|
|
@@ -101,6 +101,26 @@ Examples: Anchor Steam, Old Peculiar, },
|
|
101
101
|
:hsi => 35.0,
|
102
102
|
})
|
103
103
|
end
|
104
|
+
it "should parse yeasts" do
|
105
|
+
check_parse(Beerxml::Yeast, "yeast", 3, {
|
106
|
+
:name => 'European Ale',
|
107
|
+
:type => 'Ale',
|
108
|
+
:form => 'Liquid',
|
109
|
+
:amount => 0.035,
|
110
|
+
:amount_is_weight => false,
|
111
|
+
:laboratory => 'White Labs',
|
112
|
+
:product_id => 'WLP011',
|
113
|
+
:min_temperature => 18.3,
|
114
|
+
:max_temperature => 21.1,
|
115
|
+
:flocculation => 'Medium',
|
116
|
+
:attenuation => 67.5,
|
117
|
+
:notes => "Malty, Northern European ale yeast. Low ester production, low sulfer, gives a clean profile. Low attenuation contributes to malty taste.",
|
118
|
+
:best_for => "Alt, Kolsch, malty English Ales, Fruit beers",
|
119
|
+
:max_reuse => 5,
|
120
|
+
:times_cultured => 0,
|
121
|
+
:add_to_secondary => false,
|
122
|
+
})
|
123
|
+
end
|
104
124
|
it "should parse recipes" do
|
105
125
|
recipe = check_parse(Beerxml::Recipe, "recipes", 3, {
|
106
126
|
:name => 'Dry Stout',
|
data/spec/recipes_spec.rb
CHANGED
@@ -4,7 +4,7 @@ describe Beerxml::Recipe do
|
|
4
4
|
it "should calculate IBUs using the tinseth method" do
|
5
5
|
recipe = Beerxml::Recipe.new.from_xml(read_xml("recipes").root.children[1])
|
6
6
|
recipe.should be_valid
|
7
|
-
recipe.ibus.round.should ==
|
7
|
+
recipe.ibus.round.should == 31
|
8
8
|
end
|
9
9
|
|
10
10
|
it "should calculate the OG for an all grain batch" do
|
@@ -12,4 +12,10 @@ describe Beerxml::Recipe do
|
|
12
12
|
recipe.should be_valid
|
13
13
|
recipe.calculate_og.should == 1.056
|
14
14
|
end
|
15
|
+
|
16
|
+
it "should calculate the FG for an all grain batch" do
|
17
|
+
recipe = Beerxml::Recipe.new.from_xml(read_xml("recipes").root.children[1])
|
18
|
+
recipe.should be_valid
|
19
|
+
recipe.calculate_fg.should == 1.016
|
20
|
+
end
|
15
21
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beerxml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
+
- 3
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 0.0.2
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Brian Palmer
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-03-
|
18
|
+
date: 2011-03-08 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -63,25 +63,10 @@ dependencies:
|
|
63
63
|
version: "1.0"
|
64
64
|
type: :runtime
|
65
65
|
version_requirements: *id003
|
66
|
-
- !ruby/object:Gem::Dependency
|
67
|
-
name: dm-types
|
68
|
-
prerelease: false
|
69
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
70
|
-
none: false
|
71
|
-
requirements:
|
72
|
-
- - ~>
|
73
|
-
- !ruby/object:Gem::Version
|
74
|
-
hash: 15
|
75
|
-
segments:
|
76
|
-
- 1
|
77
|
-
- 0
|
78
|
-
version: "1.0"
|
79
|
-
type: :runtime
|
80
|
-
version_requirements: *id004
|
81
66
|
- !ruby/object:Gem::Dependency
|
82
67
|
name: rspec
|
83
68
|
prerelease: false
|
84
|
-
requirement: &
|
69
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
85
70
|
none: false
|
86
71
|
requirements:
|
87
72
|
- - ~>
|
@@ -92,11 +77,11 @@ dependencies:
|
|
92
77
|
- 5
|
93
78
|
version: "2.5"
|
94
79
|
type: :development
|
95
|
-
version_requirements: *
|
80
|
+
version_requirements: *id004
|
96
81
|
- !ruby/object:Gem::Dependency
|
97
82
|
name: autotest-standalone
|
98
83
|
prerelease: false
|
99
|
-
requirement: &
|
84
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
100
85
|
none: false
|
101
86
|
requirements:
|
102
87
|
- - ">="
|
@@ -106,11 +91,11 @@ dependencies:
|
|
106
91
|
- 0
|
107
92
|
version: "0"
|
108
93
|
type: :development
|
109
|
-
version_requirements: *
|
94
|
+
version_requirements: *id005
|
110
95
|
- !ruby/object:Gem::Dependency
|
111
96
|
name: autotest-growl
|
112
97
|
prerelease: false
|
113
|
-
requirement: &
|
98
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
114
99
|
none: false
|
115
100
|
requirements:
|
116
101
|
- - ">="
|
@@ -120,11 +105,11 @@ dependencies:
|
|
120
105
|
- 0
|
121
106
|
version: "0"
|
122
107
|
type: :development
|
123
|
-
version_requirements: *
|
108
|
+
version_requirements: *id006
|
124
109
|
- !ruby/object:Gem::Dependency
|
125
110
|
name: rcov
|
126
111
|
prerelease: false
|
127
|
-
requirement: &
|
112
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
128
113
|
none: false
|
129
114
|
requirements:
|
130
115
|
- - ">="
|
@@ -134,11 +119,11 @@ dependencies:
|
|
134
119
|
- 0
|
135
120
|
version: "0"
|
136
121
|
type: :development
|
137
|
-
version_requirements: *
|
122
|
+
version_requirements: *id007
|
138
123
|
- !ruby/object:Gem::Dependency
|
139
124
|
name: yard
|
140
125
|
prerelease: false
|
141
|
-
requirement: &
|
126
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
142
127
|
none: false
|
143
128
|
requirements:
|
144
129
|
- - ">="
|
@@ -148,7 +133,7 @@ dependencies:
|
|
148
133
|
- 0
|
149
134
|
version: "0"
|
150
135
|
type: :development
|
151
|
-
version_requirements: *
|
136
|
+
version_requirements: *id008
|
152
137
|
description: |-
|
153
138
|
Library for parsing and generating beerxml (http://www.beerxml.com/).
|
154
139
|
More than that, this library also contains various methods for doing calculations on beer ingredients and recipes, among other helpers.
|
@@ -185,6 +170,9 @@ files:
|
|
185
170
|
- lib/beerxml/recipe.rb
|
186
171
|
- lib/beerxml/unit.rb
|
187
172
|
- lib/beerxml/version.rb
|
173
|
+
- lib/beerxml/yeast.rb
|
174
|
+
- spec/dumping_spec.rb
|
175
|
+
- spec/full_stack_spec.rb
|
188
176
|
- spec/hops_spec.rb
|
189
177
|
- spec/parsing_spec.rb
|
190
178
|
- spec/recipes_spec.rb
|
@@ -225,6 +213,8 @@ signing_key:
|
|
225
213
|
specification_version: 3
|
226
214
|
summary: Library for parsing and generating beerxml (http://www.beerxml.com/)
|
227
215
|
test_files:
|
216
|
+
- spec/dumping_spec.rb
|
217
|
+
- spec/full_stack_spec.rb
|
228
218
|
- spec/hops_spec.rb
|
229
219
|
- spec/parsing_spec.rb
|
230
220
|
- spec/recipes_spec.rb
|