beerdb-models 0.10.0 → 1.0.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.
- 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
|