beerdb-models 0.10.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Manifest.txt +5 -0
- data/README.md +5 -0
- data/lib/beerdb/models.rb +5 -1
- data/lib/beerdb/reader.rb +0 -71
- data/lib/beerdb/reader_file.rb +10 -4
- data/lib/beerdb/reader_zip.rb +11 -2
- data/lib/beerdb/readers/beer.rb +86 -0
- data/lib/beerdb/readers/brewery.rb +73 -0
- data/lib/beerdb/readers/quick.rb +127 -0
- data/lib/beerdb/schema.rb +29 -29
- data/lib/beerdb/version.rb +2 -2
- data/test/data/great-beers-europe.txt +155 -0
- data/test/test_reader_quick.rb +27 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb9be2add651cb418cd11f1fcded05d8bfb4b571
|
4
|
+
data.tar.gz: 6f3ea6a6df8dbe92638db7993448693d766edaaf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc605a8fdbd6a1b32000da48925e37cdac5efaf60b55fe74e4fc83e3908c5c0efb6e7752003d590e24464c84c82c250e08ce47bf2604631235896b6bcd05d090
|
7
|
+
data.tar.gz: 0c87ea1a5a0610f0198b7612319821ea547ab611dc7b5da5f72d97f7477d1841bd63816a12d30b1c8486b4f62e9eeb3db8ee62e4c6a0a8bdd6485b818ae71768
|
data/Manifest.txt
CHANGED
@@ -15,11 +15,16 @@ lib/beerdb/models/world/region.rb
|
|
15
15
|
lib/beerdb/reader.rb
|
16
16
|
lib/beerdb/reader_file.rb
|
17
17
|
lib/beerdb/reader_zip.rb
|
18
|
+
lib/beerdb/readers/beer.rb
|
19
|
+
lib/beerdb/readers/brewery.rb
|
20
|
+
lib/beerdb/readers/quick.rb
|
18
21
|
lib/beerdb/schema.rb
|
19
22
|
lib/beerdb/serializers/beer.rb
|
20
23
|
lib/beerdb/serializers/brewery.rb
|
21
24
|
lib/beerdb/stats.rb
|
22
25
|
lib/beerdb/version.rb
|
26
|
+
test/data/great-beers-europe.txt
|
23
27
|
test/helper.rb
|
24
28
|
test/test_fixture_matchers.rb
|
29
|
+
test/test_reader_quick.rb
|
25
30
|
test/test_values.rb
|
data/README.md
CHANGED
data/lib/beerdb/models.rb
CHANGED
@@ -17,10 +17,14 @@ require 'beerdb/models/beer'
|
|
17
17
|
require 'beerdb/models/brand'
|
18
18
|
require 'beerdb/models/brewery'
|
19
19
|
|
20
|
-
|
21
20
|
require 'beerdb/serializers/beer'
|
22
21
|
require 'beerdb/serializers/brewery'
|
23
22
|
|
23
|
+
require 'beerdb/readers/beer'
|
24
|
+
require 'beerdb/readers/brewery'
|
25
|
+
require 'beerdb/readers/quick'
|
26
|
+
|
27
|
+
|
24
28
|
require 'beerdb/schema'
|
25
29
|
require 'beerdb/reader'
|
26
30
|
require 'beerdb/reader_file'
|
data/lib/beerdb/reader.rb
CHANGED
@@ -112,50 +112,6 @@ class ReaderBase
|
|
112
112
|
end
|
113
113
|
|
114
114
|
|
115
|
-
def load_beers_worker( name, more_attribs={} )
|
116
|
-
|
117
|
-
reader = create_beers_reader( name, more_attribs ) ### "virtual" method - required by concrete class
|
118
|
-
|
119
|
-
### todo: cleanup - check if [] works for build_title...
|
120
|
-
# better cleaner way ???
|
121
|
-
if more_attribs[:region_id].present?
|
122
|
-
known_breweries_source = Brewery.where( region_id: more_attribs[:region_id] )
|
123
|
-
elsif more_attribs[:country_id].present?
|
124
|
-
known_breweries_source = Brewery.where( country_id: more_attribs[:country_id] )
|
125
|
-
else
|
126
|
-
logger.warn "no region or country specified; use empty brewery ary for header mapper"
|
127
|
-
known_breweries_source = []
|
128
|
-
end
|
129
|
-
|
130
|
-
known_breweries = TextUtils.build_title_table_for( known_breweries_source )
|
131
|
-
|
132
|
-
|
133
|
-
reader.each_line do |new_attributes, values|
|
134
|
-
|
135
|
-
## note: check for header attrib; if present remove
|
136
|
-
### todo: cleanup code later
|
137
|
-
## fix: add to new_attributes hash instead of values ary
|
138
|
-
## - fix: match_brewery() move region,city code out of values loop for reuse at the end
|
139
|
-
if new_attributes[:header].present?
|
140
|
-
brewery_line = new_attributes[:header].dup # note: make sure we make a copy; will use in-place string ops
|
141
|
-
new_attributes.delete(:header) ## note: do NOT forget to remove from hash!
|
142
|
-
|
143
|
-
logger.debug " trying to find brewery in line >#{brewery_line}<"
|
144
|
-
## todo: check what map_titles_for! returns (nothing ???)
|
145
|
-
TextUtils.map_titles_for!( 'brewery', brewery_line, known_breweries )
|
146
|
-
brewery_key = TextUtils.find_key_for!( 'brewery', brewery_line )
|
147
|
-
logger.debug " brewery_key = >#{brewery_key}<"
|
148
|
-
unless brewery_key.nil?
|
149
|
-
## bingo! add brewery_id upfront, that is, as first value in ary
|
150
|
-
values = values.unshift "by:#{brewery_key}"
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
|
-
Beer.create_or_update_from_attribs( new_attributes, values )
|
155
|
-
end # each_line
|
156
|
-
end
|
157
|
-
|
158
|
-
|
159
115
|
def load_breweries_for_country_n_region( country_key, region_key, name, more_attribs={} )
|
160
116
|
country = Country.find_by_key!( country_key )
|
161
117
|
logger.debug "Country #{country.key} >#{country.title} (#{country.code})<"
|
@@ -188,32 +144,5 @@ class ReaderBase
|
|
188
144
|
load_breweries_worker( name, more_attribs )
|
189
145
|
end
|
190
146
|
|
191
|
-
def load_breweries_worker( name, more_attribs={} )
|
192
|
-
|
193
|
-
if name =~ /\(m\)/ # check for (m) mid-size/medium marker -todo- use $?? must be last?
|
194
|
-
more_attribs[ :prod_m ] = true
|
195
|
-
elsif name =~ /\(l\)/ # check for (l) large marker - todo - use $?? must be last?
|
196
|
-
more_attribs[ :prod_l ] = true
|
197
|
-
else
|
198
|
-
## no marker; do nothing
|
199
|
-
end
|
200
|
-
|
201
|
-
reader = create_breweries_reader( name, more_attribs ) ### "virtual" method - required by concrete class
|
202
|
-
|
203
|
-
reader.each_line do |new_attributes, values|
|
204
|
-
|
205
|
-
#######
|
206
|
-
# fix: move to (inside)
|
207
|
-
# Brewery.create_or_update_from_attribs ||||
|
208
|
-
## note: group header not used for now; do NOT forget to remove from hash!
|
209
|
-
if new_attributes[:header].present?
|
210
|
-
logger.warn "removing unused group header #{new_attributes[:header]}"
|
211
|
-
new_attributes.delete(:header) ## note: do NOT forget to remove from hash!
|
212
|
-
end
|
213
|
-
|
214
|
-
Brewery.create_or_update_from_attribs( new_attributes, values )
|
215
|
-
end # each_line
|
216
|
-
end
|
217
|
-
|
218
147
|
end # class ReaderBase
|
219
148
|
end # module BeerDb
|
data/lib/beerdb/reader_file.rb
CHANGED
@@ -25,8 +25,7 @@ class Reader < ReaderBase
|
|
25
25
|
|
26
26
|
logger.info "parsing data (beers) '#{name}' (#{path})..."
|
27
27
|
|
28
|
-
|
29
|
-
## ValuesReaderV2.new( name, @include_path, more_attribs )
|
28
|
+
BeerReader.from_file( path, more_attribs )
|
30
29
|
end
|
31
30
|
|
32
31
|
def create_breweries_reader( name, more_attribs={} )
|
@@ -36,8 +35,15 @@ class Reader < ReaderBase
|
|
36
35
|
|
37
36
|
logger.info "parsing data (breweries) '#{name}' (#{path})..."
|
38
37
|
|
39
|
-
|
40
|
-
|
38
|
+
if name =~ /\(m\)/ # check for (m) mid-size/medium marker -todo- use $?? must be last?
|
39
|
+
more_attribs[ :prod_m ] = true
|
40
|
+
elsif name =~ /\(l\)/ # check for (l) large marker - todo - use $?? must be last?
|
41
|
+
more_attribs[ :prod_l ] = true
|
42
|
+
else
|
43
|
+
## no marker; do nothing
|
44
|
+
end
|
45
|
+
|
46
|
+
BreweryReader.from_file( path, more_attribs )
|
41
47
|
end
|
42
48
|
|
43
49
|
private
|
data/lib/beerdb/reader_zip.rb
CHANGED
@@ -68,15 +68,24 @@ class ZipReader < ReaderBase
|
|
68
68
|
|
69
69
|
logger.debug "parsing data (beers) in zip '#{name}' (#{path})..."
|
70
70
|
|
71
|
-
|
71
|
+
BeerReader.from_zip( @zip_file, path, more_attribs )
|
72
72
|
end
|
73
73
|
|
74
|
+
|
74
75
|
def create_breweries_reader( name, more_attribs={} )
|
75
76
|
path = name_to_zip_entry_path( name )
|
76
77
|
|
77
78
|
logger.debug "parsing data (breweries) in zip '#{name}' (#{path})..."
|
78
79
|
|
79
|
-
|
80
|
+
if name =~ /\(m\)/ # check for (m) mid-size/medium marker -todo- use $?? must be last?
|
81
|
+
more_attribs[ :prod_m ] = true
|
82
|
+
elsif name =~ /\(l\)/ # check for (l) large marker - todo - use $?? must be last?
|
83
|
+
more_attribs[ :prod_l ] = true
|
84
|
+
else
|
85
|
+
## no marker; do nothing
|
86
|
+
end
|
87
|
+
|
88
|
+
BreweryReader.from_zip( @zip_file, path, more_attribs )
|
80
89
|
end
|
81
90
|
|
82
91
|
private
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module BeerDb
|
4
|
+
|
5
|
+
class BeerReader
|
6
|
+
|
7
|
+
include LogUtils::Logging
|
8
|
+
|
9
|
+
## make models available by default with namespace
|
10
|
+
# e.g. lets you use Usage instead of Model::Usage
|
11
|
+
include Models
|
12
|
+
|
13
|
+
def self.from_zip( zip_file, entry_path, more_attribs={} )
|
14
|
+
## get text content from zip
|
15
|
+
entry = zip_file.find_entry( entry_path )
|
16
|
+
|
17
|
+
text = entry.get_input_stream().read()
|
18
|
+
text = text.force_encoding( Encoding::UTF_8 )
|
19
|
+
|
20
|
+
self.from_string( text, more_attribs )
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.from_file( path, more_attribs={} )
|
24
|
+
## note: assume/enfore utf-8 encoding (with or without BOM - byte order mark)
|
25
|
+
## - see textutils/utils.rb
|
26
|
+
text = File.read_utf8( path )
|
27
|
+
self.from_string( text, more_attribs )
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.from_string( text, more_attribs={} )
|
31
|
+
BeerReader.new( text, more_attribs )
|
32
|
+
end
|
33
|
+
|
34
|
+
def initialize( text, more_attribs={} )
|
35
|
+
## todo/fix: how to add opts={} ???
|
36
|
+
@text = text
|
37
|
+
@more_attribs = more_attribs
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
def read()
|
42
|
+
|
43
|
+
reader = ValuesReader.from_string( @text, @more_attribs )
|
44
|
+
|
45
|
+
### todo: cleanup - check if [] works for build_title...
|
46
|
+
# better cleaner way ???
|
47
|
+
if @more_attribs[:region_id].present?
|
48
|
+
known_breweries_source = Brewery.where( region_id: @more_attribs[:region_id] )
|
49
|
+
elsif @more_attribs[:country_id].present?
|
50
|
+
known_breweries_source = Brewery.where( country_id: @more_attribs[:country_id] )
|
51
|
+
else
|
52
|
+
logger.warn "no region or country specified; use empty brewery ary for header mapper"
|
53
|
+
known_breweries_source = []
|
54
|
+
end
|
55
|
+
|
56
|
+
known_breweries = TextUtils.build_title_table_for( known_breweries_source )
|
57
|
+
|
58
|
+
|
59
|
+
reader.each_line do |new_attributes, values|
|
60
|
+
|
61
|
+
## note: check for header attrib; if present remove
|
62
|
+
### todo: cleanup code later
|
63
|
+
## fix: add to new_attributes hash instead of values ary
|
64
|
+
## - fix: match_brewery() move region,city code out of values loop for reuse at the end
|
65
|
+
if new_attributes[:header].present?
|
66
|
+
brewery_line = new_attributes[:header].dup # note: make sure we make a copy; will use in-place string ops
|
67
|
+
new_attributes.delete(:header) ## note: do NOT forget to remove from hash!
|
68
|
+
|
69
|
+
logger.debug " trying to find brewery in line >#{brewery_line}<"
|
70
|
+
## todo: check what map_titles_for! returns (nothing ???)
|
71
|
+
TextUtils.map_titles_for!( 'brewery', brewery_line, known_breweries )
|
72
|
+
brewery_key = TextUtils.find_key_for!( 'brewery', brewery_line )
|
73
|
+
logger.debug " brewery_key = >#{brewery_key}<"
|
74
|
+
unless brewery_key.nil?
|
75
|
+
## bingo! add brewery_id upfront, that is, as first value in ary
|
76
|
+
values = values.unshift "by:#{brewery_key}"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
Beer.create_or_update_from_attribs( new_attributes, values )
|
81
|
+
end # each_line
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
end # class BeerReader
|
86
|
+
end # module BeerDb
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module BeerDb
|
4
|
+
|
5
|
+
class BreweryReader
|
6
|
+
|
7
|
+
include LogUtils::Logging
|
8
|
+
|
9
|
+
## make models available by default with namespace
|
10
|
+
# e.g. lets you use Usage instead of Model::Usage
|
11
|
+
include Models
|
12
|
+
|
13
|
+
def self.from_zip( zip_file, entry_path, more_attribs={} )
|
14
|
+
## get text content from zip
|
15
|
+
entry = zip_file.find_entry( entry_path )
|
16
|
+
|
17
|
+
text = entry.get_input_stream().read()
|
18
|
+
text = text.force_encoding( Encoding::UTF_8 )
|
19
|
+
|
20
|
+
self.from_string( text, more_attribs )
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.from_file( path, more_attribs={} )
|
24
|
+
## note: assume/enfore utf-8 encoding (with or without BOM - byte order mark)
|
25
|
+
## - see textutils/utils.rb
|
26
|
+
text = File.read_utf8( path )
|
27
|
+
self.from_string( text, more_attribs )
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.from_string( text, more_attribs={} )
|
31
|
+
BreweryReader.new( text, more_attribs )
|
32
|
+
end
|
33
|
+
|
34
|
+
def initialize( text, more_attribs={} )
|
35
|
+
## todo/fix: how to add opts={} ???
|
36
|
+
@text = text
|
37
|
+
@more_attribs = more_attribs
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
|
42
|
+
|
43
|
+
def read()
|
44
|
+
|
45
|
+
=begin
|
46
|
+
if name =~ /\(m\)/ # check for (m) mid-size/medium marker -todo- use $?? must be last?
|
47
|
+
more_attribs[ :prod_m ] = true
|
48
|
+
elsif name =~ /\(l\)/ # check for (l) large marker - todo - use $?? must be last?
|
49
|
+
more_attribs[ :prod_l ] = true
|
50
|
+
else
|
51
|
+
## no marker; do nothing
|
52
|
+
end
|
53
|
+
=end
|
54
|
+
|
55
|
+
reader = ValuesReader.from_string( @text, @more_attribs )
|
56
|
+
|
57
|
+
reader.each_line do |new_attributes, values|
|
58
|
+
|
59
|
+
#######
|
60
|
+
# fix: move to (inside)
|
61
|
+
# Brewery.create_or_update_from_attribs ||||
|
62
|
+
## note: group header not used for now; do NOT forget to remove from hash!
|
63
|
+
if new_attributes[:header].present?
|
64
|
+
logger.warn "removing unused group header #{new_attributes[:header]}"
|
65
|
+
new_attributes.delete(:header) ## note: do NOT forget to remove from hash!
|
66
|
+
end
|
67
|
+
|
68
|
+
Brewery.create_or_update_from_attribs( new_attributes, values )
|
69
|
+
end # each_line
|
70
|
+
end
|
71
|
+
|
72
|
+
end # class BreweryReader
|
73
|
+
end # module BeerDb
|
@@ -0,0 +1,127 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
#####################################
|
4
|
+
# quick (all-in-one-file) reader
|
5
|
+
#
|
6
|
+
# reads breweries n beers "mixed-up" in a single-file
|
7
|
+
|
8
|
+
|
9
|
+
module BeerDb
|
10
|
+
|
11
|
+
class QuickReader
|
12
|
+
|
13
|
+
include LogUtils::Logging
|
14
|
+
|
15
|
+
## make models available by default with namespace
|
16
|
+
# e.g. lets you use Usage instead of Model::Usage
|
17
|
+
include Models
|
18
|
+
|
19
|
+
def self.from_zip( zip_file, entry_path, more_attribs={} )
|
20
|
+
## get text content from zip
|
21
|
+
entry = zip_file.find_entry( entry_path )
|
22
|
+
|
23
|
+
text = entry.get_input_stream().read()
|
24
|
+
text = text.force_encoding( Encoding::UTF_8 )
|
25
|
+
|
26
|
+
self.from_string( text, more_attribs )
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.from_file( path, more_attribs={} )
|
30
|
+
## note: assume/enfore utf-8 encoding (with or without BOM - byte order mark)
|
31
|
+
## - see textutils/utils.rb
|
32
|
+
text = File.read_utf8( path )
|
33
|
+
self.from_string( text, more_attribs )
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.from_string( text, more_attribs={} )
|
37
|
+
QuickReader.new( text, more_attribs )
|
38
|
+
end
|
39
|
+
|
40
|
+
def initialize( text, more_attribs={} )
|
41
|
+
## todo/fix: how to add opts={} ???
|
42
|
+
@text = text
|
43
|
+
@more_attribs = more_attribs
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
def read()
|
48
|
+
|
49
|
+
########
|
50
|
+
# note:
|
51
|
+
# assume meta.format == multiline => brewery
|
52
|
+
# == line => beer
|
53
|
+
|
54
|
+
last_brewery = nil
|
55
|
+
|
56
|
+
reader = ValuesReader.from_string( @text, @more_attribs )
|
57
|
+
|
58
|
+
reader.each_line_with_meta do |attributes|
|
59
|
+
|
60
|
+
## note: group header not used for now; do NOT forget to remove from hash!
|
61
|
+
if attributes[:header].present?
|
62
|
+
logger.warn "removing unused group header #{attributes[:header]}"
|
63
|
+
attributes.delete(:header) ## note: do NOT forget to remove from hash!
|
64
|
+
end
|
65
|
+
|
66
|
+
if attributes[:meta][:format] == :multiline
|
67
|
+
### assume new brewery
|
68
|
+
puts
|
69
|
+
puts "new brewery w/ attributes: #{attributes.inspect}"
|
70
|
+
else
|
71
|
+
### assume new beer
|
72
|
+
puts
|
73
|
+
puts "new beer w/ attributes: #{attributes.inspect}"
|
74
|
+
end
|
75
|
+
|
76
|
+
meta = attributes[:meta]
|
77
|
+
values = attributes[:values]
|
78
|
+
|
79
|
+
attributes.delete(:meta)
|
80
|
+
attributes.delete(:values)
|
81
|
+
|
82
|
+
if meta[:format] == :multiline
|
83
|
+
## assume new brewery
|
84
|
+
### check values for worldtree entry w/ › e.g. Hainaut › Belgium
|
85
|
+
|
86
|
+
worldtree = values.find {|val| val.index('›') }
|
87
|
+
if worldtree
|
88
|
+
puts " worldtree: #{worldtree}"
|
89
|
+
worldtree_ary = worldtree.split( /\s*›\s*/ ) ## note: remove leading n trailing spaces
|
90
|
+
pp worldtree_ary
|
91
|
+
## assume last entry is country
|
92
|
+
country_name = worldtree_ary[-1]
|
93
|
+
puts " country: #{country_name}"
|
94
|
+
|
95
|
+
country = Country.find_by_name( country_name )
|
96
|
+
if country.nil?
|
97
|
+
puts " auto-add country #{country_name}"
|
98
|
+
## hack: fix use worldlite to get proper key,code,area,pop etc.
|
99
|
+
country = Country.create!( key: country_name[0..2].downcase,
|
100
|
+
name: country_name,
|
101
|
+
code: country_name[0..2].upcase,
|
102
|
+
area: 0,
|
103
|
+
pop: 0 )
|
104
|
+
end
|
105
|
+
|
106
|
+
attributes[:country_id] = country.id
|
107
|
+
|
108
|
+
last_brewery = Brewery.create_or_update_from_attribs( attributes, values )
|
109
|
+
else
|
110
|
+
puts " worldtree missing (no country etc.) !!!!!"
|
111
|
+
exit
|
112
|
+
end
|
113
|
+
else
|
114
|
+
## assume new beer
|
115
|
+
attributes[:brewery_id] = last_brewery.id
|
116
|
+
attributes[:country_id] = last_brewery.country_id
|
117
|
+
|
118
|
+
Beer.create_or_update_from_attribs( attributes, values )
|
119
|
+
end
|
120
|
+
|
121
|
+
end # each_line
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
end # class QuickReader
|
126
|
+
end # module BeerDb
|
127
|
+
|
data/lib/beerdb/schema.rb
CHANGED
@@ -8,8 +8,8 @@ class CreateDb < ActiveRecord::Migration
|
|
8
8
|
def up
|
9
9
|
|
10
10
|
create_table :beers do |t|
|
11
|
-
t.string :key,
|
12
|
-
t.string :title,
|
11
|
+
t.string :key, null: false # import/export key
|
12
|
+
t.string :title, null: false
|
13
13
|
t.string :synonyms # comma separated list of synonyms
|
14
14
|
|
15
15
|
t.string :web # optional url link (e.g. )
|
@@ -18,17 +18,17 @@ create_table :beers do |t|
|
|
18
18
|
# t.boolean :bottle, :null => false, :default => false # Flaschenbier
|
19
19
|
# t.boolean :draft, :null => false, :default => false # Fassbier
|
20
20
|
## todo: check seasonal is it proper english?
|
21
|
-
t.boolean :seasonal, :
|
22
|
-
t.boolean :limited,
|
21
|
+
t.boolean :seasonal, null: false, default: false # all year or just eg. Festbier/Oktoberfest Special
|
22
|
+
t.boolean :limited, null: false, default: false # one year or season only
|
23
23
|
## todo: add microbrew/brewpub flag?
|
24
24
|
#### t.boolean :brewpub, :null => false, :default => false
|
25
|
-
|
25
|
+
|
26
26
|
## add t.boolean :lite flag ??
|
27
|
-
t.decimal :kcal
|
27
|
+
t.decimal :kcal, precision: 10, scale: 2 # kcal/100ml e.g. 45.0 kcal/100ml
|
28
28
|
|
29
29
|
## check: why decimal and not float?
|
30
|
-
t.decimal :abv
|
31
|
-
t.decimal :og # malt extract (original gravity) in plato
|
30
|
+
t.decimal :abv, precision: 10, scale: 2 # Alcohol by volume (abbreviated as ABV, abv, or alc/vol) e.g. 4.9 %
|
31
|
+
t.decimal :og, precision: 10, scale: 2 # malt extract (original gravity) in plato
|
32
32
|
t.integer :srm # color in srm
|
33
33
|
t.integer :ibu # bitterness in ibu
|
34
34
|
|
@@ -66,13 +66,13 @@ create_table :beers do |t|
|
|
66
66
|
# - C-grade /3nd class/ tier3/ / speciality, minor ?
|
67
67
|
|
68
68
|
# use stars in .txt e.g. # ***/**/*/- => 1/2/3/4
|
69
|
-
t.integer :grade,
|
69
|
+
t.integer :grade, null: false, default: 4
|
70
70
|
|
71
71
|
t.string :txt # source ref
|
72
|
-
t.boolean :txt_auto, :
|
72
|
+
t.boolean :txt_auto, null: false, default: false # inline? got auto-added?
|
73
73
|
|
74
74
|
|
75
|
-
t.references :country, :
|
75
|
+
t.references :country, null: false
|
76
76
|
t.references :region # optional
|
77
77
|
t.references :city # optional
|
78
78
|
|
@@ -81,33 +81,33 @@ end
|
|
81
81
|
|
82
82
|
|
83
83
|
create_table :brands do |t| # beer families (sharing same name e.g. brand)
|
84
|
-
t.string :key,
|
85
|
-
t.string :title,
|
84
|
+
t.string :key, null: false # import/export key
|
85
|
+
t.string :title, null: false
|
86
86
|
t.string :synonyms # comma separated list of synonyms
|
87
87
|
t.string :web # optional web page (e.g. www.ottakringer.at)
|
88
88
|
t.string :wiki # optional wiki(pedia page)
|
89
89
|
t.integer :since
|
90
90
|
|
91
91
|
## scope of brand (global/intern'l/national/regional/local) ??
|
92
|
-
t.boolean :global, :
|
93
|
-
t.boolean :internl, :
|
94
|
-
t.boolean :national, :
|
95
|
-
t.boolean :regional, :
|
96
|
-
t.boolean :local, :
|
92
|
+
t.boolean :global, null: false, default: false
|
93
|
+
t.boolean :internl, null: false, default: false
|
94
|
+
t.boolean :national, null: false, default: false
|
95
|
+
t.boolean :regional, null: false, default: false
|
96
|
+
t.boolean :local, null: false, default: false
|
97
97
|
|
98
98
|
# t.integer :brand_grade # 1/2/3/4/5 (global/intern'l/national/regional/local)
|
99
99
|
|
100
100
|
# use stars in .txt e.g. # ***/**/*/- => 1/2/3/4
|
101
|
-
t.integer :grade, :
|
101
|
+
t.integer :grade, null: false, default: 4
|
102
102
|
# -- todo: add plus 1 for brewery w/ *** ??
|
103
103
|
|
104
104
|
t.string :txt # source ref
|
105
|
-
t.boolean :txt_auto,
|
105
|
+
t.boolean :txt_auto, null: false, default: false # inline? got auto-added?
|
106
106
|
|
107
107
|
|
108
108
|
t.references :brewery # optional (for now)
|
109
109
|
|
110
|
-
t.references :country,
|
110
|
+
t.references :country, null: false
|
111
111
|
t.references :region # optional
|
112
112
|
t.references :city # optional
|
113
113
|
|
@@ -115,8 +115,8 @@ create_table :brands do |t| # beer families (sharing same name e.g. brand)
|
|
115
115
|
end
|
116
116
|
|
117
117
|
create_table :breweries do |t|
|
118
|
-
t.string :key,
|
119
|
-
t.string :title,
|
118
|
+
t.string :key, null: false # import/export key
|
119
|
+
t.string :title, null: false
|
120
120
|
t.string :synonyms # comma separated list of synonyms
|
121
121
|
t.string :address
|
122
122
|
t.integer :since
|
@@ -129,10 +129,10 @@ create_table :breweries do |t|
|
|
129
129
|
|
130
130
|
## todo: add optional parent brewery (owned_by) ???
|
131
131
|
|
132
|
-
t.boolean :brewpub, :
|
133
|
-
t.boolean :prod_m, :
|
132
|
+
t.boolean :brewpub, null: false, default: false
|
133
|
+
t.boolean :prod_m, null: false, default: false # prod medium (mid-size/regional brewery)
|
134
134
|
# e.g. > 15_000 barrels (us)
|
135
|
-
t.boolean :prod_l, :
|
135
|
+
t.boolean :prod_l, null: false, default: false # prod large
|
136
136
|
# e.g. > 500_000 hl (at), > 6_000_000 barrels (us)
|
137
137
|
|
138
138
|
t.integer :prod # (estimated) annual production/capacity in hl (1hl=100l) e.g. megabrewery 2_000_000, microbrewery 1_000 hl; brewbup 500 hl etc.
|
@@ -153,11 +153,11 @@ create_table :breweries do |t|
|
|
153
153
|
|
154
154
|
|
155
155
|
# use stars in .txt e.g. # ***/**/*/- => 1/2/3/4
|
156
|
-
t.integer :grade,
|
156
|
+
t.integer :grade, null: false, default: 4
|
157
157
|
|
158
158
|
|
159
159
|
t.string :txt # source ref
|
160
|
-
t.boolean :txt_auto, :
|
160
|
+
t.boolean :txt_auto, null: false, default: false # inline? got auto-added?
|
161
161
|
|
162
162
|
t.string :web # optional web page (e.g. www.ottakringer.at)
|
163
163
|
t.string :wikipedia # optional wiki(pedia page)
|
@@ -176,7 +176,7 @@ create_table :breweries do |t|
|
|
176
176
|
# todo: add t.references :parent # for parent brewery
|
177
177
|
# (or better use has many parents w/ percentage of ownership; might not be 100%)
|
178
178
|
|
179
|
-
t.references :country, :
|
179
|
+
t.references :country, null: false
|
180
180
|
t.references :region # optional
|
181
181
|
t.references :city # optional
|
182
182
|
|
data/lib/beerdb/version.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
module BeerDb
|
4
|
-
MAJOR =
|
5
|
-
MINOR =
|
4
|
+
MAJOR = 1 ## todo: namespace inside version or something - why? why not??
|
5
|
+
MINOR = 0
|
6
6
|
PATCH = 0
|
7
7
|
VERSION = [MAJOR,MINOR,PATCH].join('.')
|
8
8
|
|
@@ -0,0 +1,155 @@
|
|
1
|
+
###############################
|
2
|
+
# Great Beers from Europe
|
3
|
+
|
4
|
+
|
5
|
+
[Aass Bryggeri]
|
6
|
+
Ole Steens Gate 10 // 3007 Drammen
|
7
|
+
Buskerud › Østlandet › Norway
|
8
|
+
www.aass.no
|
9
|
+
|
10
|
+
# Norways's oldest brewery, 1834
|
11
|
+
# Bryggeri -- is norwegian for brewery
|
12
|
+
# Østlandet -- is norwegian for eastern norway (region)
|
13
|
+
|
14
|
+
Aass Bock, 6.5%, dunkler_bock
|
15
|
+
Aass Juleøl, 6.2%, dunkler_bock
|
16
|
+
|
17
|
+
|
18
|
+
[Abbaye des Rocs] ## Brasserie des Rocs (formerly known as Brasserie de l'Abbaye des Rocs
|
19
|
+
Chaussée Brunehault 37 // 7387 Montignies-sur-Roc
|
20
|
+
Hainaut › Wallonie › Belgium
|
21
|
+
www.abbaye-des-rocs.com
|
22
|
+
|
23
|
+
Blanche des Honnelles, 6%, belgian_witbier
|
24
|
+
Abbaye des Rocs Brune, 9%, dunkles_starkbier
|
25
|
+
|
26
|
+
|
27
|
+
[Achelse Kluis]
|
28
|
+
De Kluis 1 // De Sint-Benedictusabdij // 3930 Hamont-Achel
|
29
|
+
Limburg › Vlaanderen › Belgium
|
30
|
+
www.achelsekluis.org
|
31
|
+
|
32
|
+
# De Sint-Benedictusabdij -- in dutch is Saint-Benedictus Abbey
|
33
|
+
|
34
|
+
Achel 8 Bruin, 8%, trappist
|
35
|
+
Achel Extra Bruin, 9.5%, trappist
|
36
|
+
|
37
|
+
|
38
|
+
[Airbräu]
|
39
|
+
Terminalstraße Mitte 18 // München Airport Center // 85356 München
|
40
|
+
Oberbayern › Bayern › Germany
|
41
|
+
www.airbraeu.de
|
42
|
+
|
43
|
+
Fliegerquell (Helles), 5.2%, lager|unfiltriert
|
44
|
+
Kumulus (Weißbier), 5.4%, weissbier
|
45
|
+
|
46
|
+
|
47
|
+
[Aktienbrauerei] ## Aktienbrauerei Kaufbeuren (ABK)
|
48
|
+
Hohe Buchleuthe 3 // 87600 Kaufbeuren
|
49
|
+
Schwaben › Bayern › Germany
|
50
|
+
www.aktienbrauerei.de
|
51
|
+
|
52
|
+
Kellerbier Naturtrüb, 5.1%, kellerbier
|
53
|
+
Fendt Dieselrossöl, 5.9%, maerzen
|
54
|
+
|
55
|
+
|
56
|
+
[A. Le Coq]
|
57
|
+
Laulupeo Pst 15 // 50050 Tartu
|
58
|
+
Tartu › Estonia
|
59
|
+
www.alecoq.ee
|
60
|
+
|
61
|
+
A. Le Coq Porter, 6.5%, porter
|
62
|
+
A. Le Coq Double Bock, 7%, bock
|
63
|
+
|
64
|
+
|
65
|
+
[Alhambra]
|
66
|
+
Avenida de Murcia 1 // 18012 Granada
|
67
|
+
www.cervezasalhambra.es
|
68
|
+
Andalucía › Spain
|
69
|
+
|
70
|
+
Alhambra Premium Lager, 4.6%, lager
|
71
|
+
Mezquita, 7.2%, weizenbier
|
72
|
+
|
73
|
+
|
74
|
+
[Allersheim]
|
75
|
+
Allersheim 6 // 37603 Holzminden
|
76
|
+
Niedersachsen › Germany
|
77
|
+
www.brauerei-allersheim.de
|
78
|
+
|
79
|
+
Allersheimer Landbier, 5%, pilsner
|
80
|
+
## Allersheimer Blue Moon, 1.9%, colabiermix ## Cola-Bier-Mix
|
81
|
+
|
82
|
+
|
83
|
+
[Almond 22] ## Birra Almond '22
|
84
|
+
Contrada Remartello 47/H // 65014 Loreto Aprutino
|
85
|
+
www.birraalmond.com
|
86
|
+
Pescara › Abruzzo › Italy
|
87
|
+
|
88
|
+
## old address (until 2014?): Via Colle di Mezzo 25 // 65010 Spoltore
|
89
|
+
|
90
|
+
Torbata, 8.7%, barleywine
|
91
|
+
Farrotta, 5.7%, dinkelbier
|
92
|
+
|
93
|
+
|
94
|
+
[Alpirsbach] ## Alpirsbacher Klosterbräu
|
95
|
+
Marktplatz 1 // 72275 Alpirsbach
|
96
|
+
Baden-Württemberg › Germany
|
97
|
+
www.alpirsbacher.de
|
98
|
+
|
99
|
+
Alpirsbacher Klosterbräu Kleiner Mönch, 5.2%, lager
|
100
|
+
Alpirsbacher Klosterbräu Schwarzes Pils, 4.9%, pilsner ## note: no longer available
|
101
|
+
|
102
|
+
|
103
|
+
[Altöttinger] ## Altöttinger Hell-Bräu
|
104
|
+
Herrenmühlstraße 15 // 84503 Altötting
|
105
|
+
Oberbayern › Bayern › Germany
|
106
|
+
www.hellbraeu.de
|
107
|
+
|
108
|
+
Altöttinger Bayrisch Dunkel, 5.2%, dunkel
|
109
|
+
Altöttinger Fein-Herb, 5%, lager
|
110
|
+
|
111
|
+
|
112
|
+
[Amber] ## Browar Amber
|
113
|
+
Bielkówko // ul. Gregorkiewicza 1 // 83-050 Kolbudy
|
114
|
+
Gdańsk › Pomorskie [Pomeranian] › Poland
|
115
|
+
www.browar-amber.pl
|
116
|
+
|
117
|
+
Koźlak, 6.5%, dunkler_bock
|
118
|
+
Żywe, 6.2%, pilsner
|
119
|
+
|
120
|
+
|
121
|
+
[Andechs] ## Klosterbrauerei Andechs
|
122
|
+
Bergstr. 2 // 82346 Andechs
|
123
|
+
Oberbayern › Bayern › Germany
|
124
|
+
www.andechs.de
|
125
|
+
|
126
|
+
Andechser Bergbock Hell, 7%, bock
|
127
|
+
Andechser Doppelbock Dunkel, 7%, dunkler_bock
|
128
|
+
|
129
|
+
|
130
|
+
[Anker] ## Brouwerij Het Anker
|
131
|
+
Guido Gezellelaan 49 // 2800 Mechelen
|
132
|
+
Antwerpen › Vlaanderen › Belgium
|
133
|
+
www.hetanker.be
|
134
|
+
|
135
|
+
Gouden Carolus Classic, 8.5%, strong_dark_ale
|
136
|
+
Gouden Carolus Christmas, 10.5%, strong_dark_ale
|
137
|
+
|
138
|
+
|
139
|
+
[Ankerbrauerei Nördlingen] ## Ankerbräu
|
140
|
+
Ankergasse 4 // 86720 Nördlingen
|
141
|
+
www.ankerbrauerei.de
|
142
|
+
Schwaben › Bayern › Germany
|
143
|
+
|
144
|
+
Ankerbräu Lager Hell, 5%, lager
|
145
|
+
Nördlinger Premium Pils, 4.7%, pilsner
|
146
|
+
|
147
|
+
|
148
|
+
[Apatinska Pivara]
|
149
|
+
Trg oslobodjenja 5 // 25260 Apatin
|
150
|
+
www.jelenpivo.com
|
151
|
+
West Bačka › Vojvodina › Serbia
|
152
|
+
|
153
|
+
Jelen Pivo, 5%, lager
|
154
|
+
Apatinsko Pivo, 5%, lager
|
155
|
+
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
###
|
4
|
+
# to run use
|
5
|
+
# ruby -I ./lib -I ./test test/test_reader_quick.rb
|
6
|
+
# or better
|
7
|
+
# rake test
|
8
|
+
|
9
|
+
require 'helper'
|
10
|
+
|
11
|
+
|
12
|
+
class TestReaderQuick < MiniTest::Test
|
13
|
+
|
14
|
+
def setup
|
15
|
+
# delete all beers, brands, breweries in in-memory only db
|
16
|
+
BeerDb.delete!
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_reader
|
20
|
+
|
21
|
+
reader = BeerDb::QuickReader.from_file( "#{BeerDb.root}/test/data/great-beers-europe.txt")
|
22
|
+
reader.read()
|
23
|
+
|
24
|
+
assert true
|
25
|
+
end
|
26
|
+
|
27
|
+
end # class TestReaderQuick
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: beerdb-models
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gerald Bauer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-02-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: worlddb-models
|
@@ -79,13 +79,18 @@ files:
|
|
79
79
|
- lib/beerdb/reader.rb
|
80
80
|
- lib/beerdb/reader_file.rb
|
81
81
|
- lib/beerdb/reader_zip.rb
|
82
|
+
- lib/beerdb/readers/beer.rb
|
83
|
+
- lib/beerdb/readers/brewery.rb
|
84
|
+
- lib/beerdb/readers/quick.rb
|
82
85
|
- lib/beerdb/schema.rb
|
83
86
|
- lib/beerdb/serializers/beer.rb
|
84
87
|
- lib/beerdb/serializers/brewery.rb
|
85
88
|
- lib/beerdb/stats.rb
|
86
89
|
- lib/beerdb/version.rb
|
90
|
+
- test/data/great-beers-europe.txt
|
87
91
|
- test/helper.rb
|
88
92
|
- test/test_fixture_matchers.rb
|
93
|
+
- test/test_reader_quick.rb
|
89
94
|
- test/test_values.rb
|
90
95
|
homepage: https://github.com/beerkit/beer.db.models
|
91
96
|
licenses:
|
@@ -115,4 +120,5 @@ specification_version: 4
|
|
115
120
|
summary: beerdb-models - beer.db schema 'n' models for easy (re)use
|
116
121
|
test_files:
|
117
122
|
- test/test_values.rb
|
123
|
+
- test/test_reader_quick.rb
|
118
124
|
- test/test_fixture_matchers.rb
|