beerdb 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest.txt CHANGED
@@ -6,12 +6,15 @@ bin/beerdb
6
6
  lib/beerdb.rb
7
7
  lib/beerdb/cli/main.rb
8
8
  lib/beerdb/cli/opts.rb
9
+ lib/beerdb/console.rb
9
10
  lib/beerdb/deleter.rb
10
11
  lib/beerdb/models/beer.rb
11
12
  lib/beerdb/models/brewery.rb
12
13
  lib/beerdb/models/city.rb
13
14
  lib/beerdb/models/country.rb
14
15
  lib/beerdb/models/forward.rb
16
+ lib/beerdb/models/region.rb
17
+ lib/beerdb/models/tag.rb
15
18
  lib/beerdb/reader.rb
16
19
  lib/beerdb/schema.rb
17
20
  lib/beerdb/stats.rb
data/Rakefile CHANGED
@@ -67,7 +67,7 @@ namespace :beerdb do
67
67
  require 'beerdb'
68
68
  require 'logutils/db'
69
69
 
70
- LogUtils::Logger.root.level = :info
70
+ LogUtils::Logger.root.level = :debug
71
71
 
72
72
  pp DB_CONFIG
73
73
  ActiveRecord::Base.establish_connection( DB_CONFIG )
@@ -85,7 +85,7 @@ namespace :beerdb do
85
85
  end
86
86
 
87
87
  task :importbeer => :env do
88
- BeerDb.read_setup( 'setups/all', '../beer.db' )
88
+ BeerDb.read_setup( 'setups/at', '../beer.db' )
89
89
  BeerDb.tables
90
90
  end
91
91
 
@@ -0,0 +1,79 @@
1
+ ## for use to run with interactive ruby (irb)
2
+ ## e.g. irb -r sportdb/console
3
+
4
+ require 'beerdb'
5
+
6
+ # some ruby stdlibs
7
+
8
+ require 'logger'
9
+ require 'pp' # pretty printer
10
+ require 'uri'
11
+ require 'json'
12
+ require 'yaml'
13
+
14
+
15
+ ## shortcuts for models
16
+
17
+ Beer = BeerDb::Models::Beer
18
+ Brewery = BeerDb::Models::Brewery
19
+
20
+ Tag = WorldDb::Models::Tag
21
+ Tagging = WorldDb::Models::Tagging
22
+ Continent = WorldDb::Models::Continent
23
+ Country = WorldDb::Models::Country
24
+ Region = WorldDb::Models::Region
25
+ City = WorldDb::Models::City
26
+ Prop = WorldDb::Models::Prop
27
+
28
+ ## connect to db
29
+
30
+ DB_CONFIG = {
31
+ adapter: 'sqlite3',
32
+ database: 'beer.db'
33
+ }
34
+
35
+ pp DB_CONFIG
36
+ ActiveRecord::Base.establish_connection( DB_CONFIG )
37
+
38
+ ## test drive
39
+
40
+ puts "Welcome to beer.db, version #{BeerDb::VERSION} (world.db, version #{WorldDb::VERSION})!"
41
+
42
+ BeerDb.tables
43
+
44
+ puts "Ready."
45
+
46
+ ## add some predefined shortcuts
47
+
48
+ ##### some countries
49
+
50
+ AT = Country.find_by_key( 'at' )
51
+ DE = Country.find_by_key( 'de' )
52
+ EN = Country.find_by_key( 'en' )
53
+
54
+ US = Country.find_by_key( 'us' )
55
+ MX = Country.find_by_key( 'mx' )
56
+
57
+ ### some cities
58
+
59
+ WIEN = City.find_by_key( 'wien' )
60
+
61
+ ### some regions
62
+
63
+ NO = Region.find_by_key_and_country_id( 'no', AT.id ) # at - niederoesterreich
64
+ OO = Region.find_by_key_and_country_id( 'oo', AT.id ) # at - oberoesterreich
65
+
66
+ #### some beers
67
+
68
+ ## to be done
69
+
70
+
71
+ ### some breweries
72
+
73
+ OTTAKRINGER = Brewery.find_by_key( 'ottakringer' )
74
+ SCHWECHAT = Brewery.find_by_key( 'schwechat' )
75
+
76
+
77
+ ## turn on activerecord logging to console
78
+
79
+ ActiveRecord::Base.logger = Logger.new( STDOUT )
@@ -3,8 +3,14 @@ module BeerDb::Models
3
3
  class Beer < ActiveRecord::Base
4
4
 
5
5
  belongs_to :country, :class_name => 'WorldDb::Models::Country', :foreign_key => 'country_id'
6
+ belongs_to :region, :class_name => 'WorldDb::Models::Region', :foreign_key => 'region_id'
6
7
  belongs_to :city, :class_name => 'WorldDb::Models::City', :foreign_key => 'city_id'
7
8
 
9
+ belongs_to :brewery, :class_name => 'BeerDb::Models::Brewery', :foreign_key => 'brewery_id'
10
+
11
+ has_many :taggings, :as => :taggable, :class_name => 'WorldDb::Models::Tagging'
12
+ has_many :tags, :through => :taggings, :class_name => 'WorldDb::Models::Tag'
13
+
8
14
  end # class Beer
9
15
 
10
16
 
@@ -5,8 +5,14 @@ class Brewery < ActiveRecord::Base
5
5
  self.table_name = 'breweries'
6
6
 
7
7
  belongs_to :country, :class_name => 'WorldDb::Models::Country', :foreign_key => 'country_id'
8
+ belongs_to :region, :class_name => 'WorldDb::Models::Region', :foreign_key => 'region_id'
8
9
  belongs_to :city, :class_name => 'WorldDb::Models::City', :foreign_key => 'city_id'
9
10
 
11
+ has_many :beers, :class_name => 'BeerDb::Models::Beer', :foreign_key => 'brewery_id'
12
+
13
+ has_many :taggings, :as => :taggable, :class_name => 'WorldDb::Models::Tagging'
14
+ has_many :tags, :through => :taggings, :class_name => 'WorldDb::Models::Tag'
15
+
10
16
  end # class Brewery
11
17
 
12
18
 
@@ -1,8 +1,8 @@
1
1
  module WorldDb::Models
2
2
 
3
3
  class City
4
- has_many :beers, :class_name => 'BeerDb::Models::Beer', :foreign_key => 'country_id'
5
- has_many :breweries, :class_name => 'BeerDb::Models::Brewery', :foreign_key => 'country_id'
4
+ has_many :beers, :class_name => 'BeerDb::Models::Beer', :foreign_key => 'city_id'
5
+ has_many :breweries, :class_name => 'BeerDb::Models::Brewery', :foreign_key => 'city_id'
6
6
  end # class Country
7
7
 
8
8
  end # module WorldDb::Models
@@ -9,6 +9,10 @@ module BeerDb::Models
9
9
  Country = WorldDb::Models::Country
10
10
  Region = WorldDb::Models::Region
11
11
  City = WorldDb::Models::City
12
+
13
+ Tag = WorldDb::Models::Tag
14
+ Tagging = WorldDb::Models::Tagging
15
+
12
16
  Prop = WorldDb::Models::Prop
13
17
 
14
18
  class Beer < ActiveRecord::Base ; end
@@ -0,0 +1,9 @@
1
+
2
+ module WorldDb::Models
3
+
4
+ class Region
5
+ has_many :beers, :class_name => 'BeerDb::Models::Beer', :foreign_key => 'region_id'
6
+ has_many :breweries, :class_name => 'BeerDb::Models::Brewery', :foreign_key => 'region_id'
7
+ end # class Region
8
+
9
+ end # module WorldDb::Models
@@ -0,0 +1,9 @@
1
+
2
+ module WorldDb::Models
3
+
4
+ class Tag
5
+ has_many :beers, :through => :taggings, :source => :taggable, :source_type => 'BeerDb::Models::Beer', :class_name => 'BeerDb::Models::Beer'
6
+ has_many :breweries, :through => :taggings, :source => :taggable, :source_type => 'BeerDb::Models::Brewery', :class_name => 'BeerDb::Models::Brewery'
7
+ end # class Country
8
+
9
+ end # module WorldDb::Models
data/lib/beerdb/reader.rb CHANGED
@@ -68,6 +68,9 @@ class Reader
68
68
  if name =~ /\/([a-z]{2})\/beers/
69
69
  ## auto-add required country code (from folder structure)
70
70
  load_beers( $1, name )
71
+ elsif name =~ /\/([a-z]{2})\/breweries/
72
+ ## auto-add required country code (from folder structure)
73
+ load_breweries( $1, name )
71
74
  else
72
75
  logger.error "unknown beer.db fixture type >#{name}<"
73
76
  # todo/fix: exit w/ error
@@ -86,15 +89,150 @@ class Reader
86
89
  logger.info "parsing data '#{name}' (#{path})..."
87
90
 
88
91
  reader = ValuesReader.new( path, more_values )
89
-
92
+
90
93
  load_beers_worker( reader )
91
94
 
92
95
  Prop.create_from_fixture!( name, path )
93
96
  end
94
97
 
95
98
 
99
+ def load_breweries( country_key, name, more_values={} )
100
+ country = Country.find_by_key!( country_key )
101
+ logger.debug "Country #{country.key} >#{country.title} (#{country.code})<"
102
+
103
+ more_values[ :country_id ] = country.id
104
+
105
+ path = "#{include_path}/#{name}.txt"
106
+
107
+ logger.info "parsing data '#{name}' (#{path})..."
108
+
109
+ reader = ValuesReader.new( path, more_values )
110
+
111
+ load_breweries_worker( reader )
112
+
113
+ Prop.create_from_fixture!( name, path )
114
+ end
115
+
116
+
96
117
  private
97
118
 
119
+ def load_breweries_worker( reader )
120
+
121
+ ## NB: assumes active activerecord db connection
122
+
123
+ reader.each_line do |attribs, values|
124
+
125
+
126
+ ### todo/fix: move this code to model (lets us reuse it)
127
+
128
+ value_tag_keys = []
129
+
130
+ ### check for "default" tags - that is, if present attribs[:tags] remove from hash
131
+
132
+ if attribs[:tags].present?
133
+ more_tag_keys = attribs[:tags].split('|')
134
+ attribs.delete(:tags)
135
+
136
+ ## unify; replace _ w/ space; remove leading n trailing whitespace
137
+ more_tag_keys = more_tag_keys.map do |key|
138
+ key = key.gsub( '_', ' ' )
139
+ key = key.strip
140
+ key
141
+ end
142
+
143
+ value_tag_keys += more_tag_keys
144
+ end
145
+
146
+
147
+ ## check for optional values
148
+ values.each_with_index do |value,index|
149
+ if value =~ /^country:/ ## country:
150
+ value_country_key = value[8..-1] ## cut off country: prefix
151
+ value_country = Country.find_by_key!( value_country_key )
152
+ attribs[ :country_id ] = value_country.id
153
+ elsif value =~ /^region:/ ## region:
154
+ value_region_key = value[7..-1] ## cut off region: prefix
155
+ value_region = Region.find_by_key_and_country_id!( value_region_key, attribs[:country_id] )
156
+ attribs[ :region_id ] = value_region.id
157
+ elsif value =~ /^[A-Z]{1,2}$/ ## assume region code e.g. TX or N
158
+ value_region = Region.find_by_key_and_country_id!( value.downcase, attribs[:country_id] )
159
+ attribs[ :region_id ] = value_region.id
160
+ elsif value =~ /^city:/ ## city:
161
+ value_city_key = value[5..-1] ## cut off city: prefix
162
+ value_city = City.find_by_key( value_city_key )
163
+ if value_city.present?
164
+ attribs[ :city_id ] = value_city.id
165
+ else
166
+ ## todo/fix: add strict mode flag - fail w/ exit 1 in strict mode
167
+ logger.warn "city with key #{value_city_key} missing"
168
+ end
169
+
170
+ ## for easy queries: cache region_id (from city)
171
+ # - check if city w/ region if yes, use it for brewery too
172
+ if value_city.present? && value_city.region.present?
173
+ attribs[ :region_id ] = value_city.region.id
174
+ end
175
+ elsif value =~ /^[0-9]{4}$/ # founded/established year e.g. 1776
176
+ attribs[ :founded ] = value.to_i
177
+ elsif value =~ /\/{2}/ # if value includes // assume address e.g. 3970 Weitra // Sparkasseplatz 160
178
+ attribs[ :address ] = value
179
+ elsif (values.size==(index+1)) && value =~ /^[a-z0-9\|_ ]+$/ # tags must be last entry
180
+
181
+ logger.debug " found tags: >>#{value}<<"
182
+
183
+ tag_keys = value.split('|')
184
+
185
+ ## unify; replace _ w/ space; remove leading n trailing whitespace
186
+ tag_keys = tag_keys.map do |key|
187
+ key = key.gsub( '_', ' ' )
188
+ key = key.strip
189
+ key
190
+ end
191
+
192
+ value_tag_keys += tag_keys
193
+ else
194
+ # issue warning: unknown type for value
195
+ logger.warn "unknown type for value >#{value}<"
196
+ end
197
+ end # each value
198
+
199
+ rec = Brewery.find_by_key( attribs[ :key ] )
200
+
201
+ if rec.present?
202
+ logger.debug "update Brewery #{rec.id}-#{rec.key}:"
203
+ else
204
+ logger.debug "create Brewery:"
205
+ rec = Brewery.new
206
+ end
207
+
208
+ logger.debug attribs.to_json
209
+
210
+ rec.update_attributes!( attribs )
211
+
212
+ ##################
213
+ ## add taggings
214
+
215
+ if value_tag_keys.size > 0
216
+
217
+ value_tag_keys.uniq! # remove duplicates
218
+ logger.debug " adding #{value_tag_keys.size} taggings: >>#{value_tag_keys.join('|')}<<..."
219
+
220
+ ### fix/todo: check tag_ids and only update diff (add/remove ids)
221
+
222
+ value_tag_keys.each do |key|
223
+ tag = Tag.find_by_key( key )
224
+ if tag.nil? # create tag if it doesn't exit
225
+ logger.debug " creating tag >#{key}<"
226
+ tag = Tag.create!( key: key )
227
+ end
228
+ rec.tags << tag
229
+ end
230
+ end
231
+
232
+ end # each_line
233
+
234
+ end # method load_breweries_worker
235
+
98
236
 
99
237
  def load_beers_worker( reader )
100
238
 
@@ -102,6 +240,8 @@ private
102
240
  ##
103
241
 
104
242
  reader.each_line do |attribs, values|
243
+
244
+ ### todo/fix: move this code to model (lets us reuse it)
105
245
 
106
246
  value_tag_keys = []
107
247
 
@@ -111,7 +251,7 @@ private
111
251
  more_tag_keys = attribs[:tags].split('|')
112
252
  attribs.delete(:tags)
113
253
 
114
- ## unify; replace _w/ space; remove leading n trailing whitespace
254
+ ## unify; replace _ w/ space; remove leading n trailing whitespace
115
255
  more_tag_keys = more_tag_keys.map do |key|
116
256
  key = key.gsub( '_', ' ' )
117
257
  key = key.strip
@@ -128,17 +268,61 @@ private
128
268
  value_country_key = value[8..-1] ## cut off country: prefix
129
269
  value_country = Country.find_by_key!( value_country_key )
130
270
  attribs[ :country_id ] = value_country.id
271
+ elsif value =~ /^region:/ ## region:
272
+ value_region_key = value[7..-1] ## cut off region: prefix
273
+ value_region = Region.find_by_key_and_country_id!( value_region_key, attribs[:country_id] )
274
+ attribs[ :region_id ] = value_region.id
275
+ elsif value =~ /^[A-Z]{1,2}$/ ## assume region code e.g. TX or N
276
+ value_region = Region.find_by_key_and_country_id!( value.downcase, attribs[:country_id] )
277
+ attribs[ :region_id ] = value_region.id
131
278
  elsif value =~ /^city:/ ## city:
132
279
  value_city_key = value[5..-1] ## cut off city: prefix
133
- value_city = City.find_by_key!( value_city_key )
134
- attribs[ :city_id ] = value_city.id
280
+ value_city = City.find_by_key( value_city_key )
281
+ if value_city.present?
282
+ attribs[ :city_id ] = value_city.id
283
+ else
284
+ ## todo/fix: add strict mode flag - fail w/ exit 1 in strict mode
285
+ logger.warn "city with key #{value_city_key} missing"
286
+ end
287
+ elsif value =~ /^by:/ ## by: -brewed by/brewery
288
+ value_brewery_key = value[3..-1] ## cut off by: prefix
289
+ value_brewery = Brewery.find_by_key!( value_brewery_key )
290
+ attribs[ :brewery_id ] = value_brewery.id
291
+
292
+ # for easy queries cache city and region ids
293
+
294
+ # 1) check if brewery has city - if yes, use it for beer too
295
+ if value_brewery.city.present?
296
+ attribs[ :city_id ] = value_brewery.city.id
297
+ end
298
+
299
+ # 2) check if brewery has city w/ region if yes, use it for beer to
300
+ # if not check for region for brewery
301
+ if value_brewery.city.present? && value_brewery.city.region.present?
302
+ attribs[ :region_id ] = value_brewery.city.region.id
303
+ elsif value_brewery.region.present?
304
+ attribs[ :region_id ] = value_brewery.region.id
305
+ end
306
+
307
+ elsif value =~ /^<?\s*(\d+(?:\.\d+)?)\s*%$/ ## abv (alcohol by volumee)
308
+ ## nb: allow leading < e.g. <0.5%
309
+ value_abv_str = $1.dup # convert to decimal? how? use float?
310
+ attribs[ :abv ] = value_abv_str
311
+ elsif value =~ /^(\d+(?:\.\d+)?)°$/ ## plato (stammwuerze/gravity?) e.g. 11.2°
312
+ ## nb: no whitespace allowed between ° and number e.g. 11.2°
313
+ value_plato_str = $1.dup # convert to decimal? how? use float?
314
+ attribs[ :plato ] = value_plato_str
315
+ elsif value =~ /^(\d+(?:\.\d+)?)\s*kcal(?:\/100ml)?$/ ## kcal
316
+ ## nb: allow 44.4 kcal/100ml or 44.4 kcal or 44.4kcal
317
+ value_kcal_str = $1.dup # convert to decimal? how? use float?
318
+ attribs[ :kcal ] = value_kcal_str
135
319
  elsif (values.size==(index+1)) && value =~ /^[a-z0-9\|_ ]+$/ # tags must be last entry
136
320
 
137
321
  logger.debug " found tags: >>#{value}<<"
138
322
 
139
323
  tag_keys = value.split('|')
140
324
 
141
- ## unify; replace _w/ space; remove leading n trailing whitespace
325
+ ## unify; replace _ w/ space; remove leading n trailing whitespace
142
326
  tag_keys = tag_keys.map do |key|
143
327
  key = key.gsub( '_', ' ' )
144
328
  key = key.strip
@@ -166,7 +350,6 @@ private
166
350
 
167
351
  rec.update_attributes!( attribs )
168
352
 
169
- =begin
170
353
  ##################
171
354
  ## add taggings
172
355
 
@@ -186,8 +369,7 @@ private
186
369
  rec.tags << tag
187
370
  end
188
371
  end
189
- =end
190
-
372
+
191
373
  end # each_line
192
374
 
193
375
  end # method load_beers_worker
data/lib/beerdb/schema.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # encoding: UTF-8
1
2
 
2
3
  module BeerDb
3
4
 
@@ -7,9 +8,10 @@ class CreateDb < ActiveRecord::Migration
7
8
  def up
8
9
 
9
10
  create_table :beers do |t|
10
- t.string :title, :null => false
11
11
  t.string :key, :null => false # import/export key
12
+ t.string :title, :null => false
12
13
  t.string :synonyms # comma separated list of synonyms
14
+
13
15
  t.boolean :bottle, :null => false, :default => false # Flaschenbier
14
16
  t.boolean :draft, :null => false, :default => false # Fassbier
15
17
  ## todo: check seasonal is it proper english?
@@ -17,19 +19,52 @@ create_table :beers do |t|
17
19
  ## todo: add microbrew/brewpub flag?
18
20
  #### t.boolean :brewpub, :null => false, :default => false
19
21
 
22
+ ## add t.boolean :lite flag ??
23
+ t.decimal :kcal # kcal/100ml e.g. 45.0 kcal/100ml
24
+
25
+ ## check: why decimal and not float?
26
+ t.decimal :abv # Alcohol by volume (abbreviated as ABV, abv, or alc/vol) e.g. 4.9 %
27
+ t.decimal :plato # stammwuerze / gravity in plato scale (e.g. °P) e.g. 12.6° - todo: use a different field name e.g. just p or gravity?
28
+ t.integer :color # beer color in Standard Reference Method (SRM)
29
+
30
+ # see en.wikipedia.org/wiki/Plato_scale#Colour
31
+
32
+ # SRM/Lovibond | Example | Beer color | EBC
33
+ # ---------------------------------------------------------------
34
+ # 2 | Pale lager, Witbier, Pilsener, Berliner Weisse | #F8F753 | 4
35
+ # 3 | Maibock, Blonde Ale | #F6F513 | 6
36
+ # 4 | Weissbier | #ECE61A | 8
37
+ # 6 | American Pale Ale, India Pale Ale | #D5BC26 | 12
38
+ # 8 | Weissbier, Saison | #BF923B | 16
39
+ # 10 | English Bitter, ESB | #BF813A | 20
40
+ # 13 | Biere de Garde, Double IPA | #BC6733 | 26
41
+ # 17 | Dark lager, Vienna lager, Marzen, Amber Ale | #8D4C32 | 33
42
+ # 20 | Brown Ale, Bock, Dunkel, Dunkelweizen | #5D341A | 39
43
+ # 24 | Irish Dry Stout, Doppelbock, Porter | #261716 | 47
44
+ # 29 | Stout | #0F0B0A | 57
45
+ # 35 | Foreign Stout, Baltic Porter | #080707 | 69
46
+ # 40+ | Imperial Stout | #030403 | 79
47
+
48
+ t.references :brewery # optional (for now)
49
+
20
50
  t.references :country, :null => false
21
- t.references :city # optional
22
-
51
+ t.references :region # optional
52
+ t.references :city # optional
53
+
23
54
  t.timestamps
24
55
  end
25
56
 
26
57
 
27
58
  create_table :breweries do |t|
28
- t.string :title
29
59
  t.string :key, :null => false # import/export key
60
+ t.string :title, :null => false
30
61
  t.string :synonyms # comma separated list of synonyms
62
+ t.string :address
63
+ t.integer :founded # year founded/established
64
+
31
65
  t.references :country, :null => false
32
- t.references :city # optional
66
+ t.references :region # optional
67
+ t.references :city # optional
33
68
 
34
69
  t.timestamps
35
70
  end
@@ -1,4 +1,4 @@
1
1
 
2
2
  module BeerDb
3
- VERSION = '0.1.0'
3
+ VERSION = '0.2.0'
4
4
  end
data/lib/beerdb.rb CHANGED
@@ -27,7 +27,9 @@ require 'beerdb/version'
27
27
 
28
28
  require 'beerdb/models/forward'
29
29
  require 'beerdb/models/country'
30
+ require 'beerdb/models/region'
30
31
  require 'beerdb/models/city'
32
+ require 'beerdb/models/tag'
31
33
  require 'beerdb/models/beer'
32
34
  require 'beerdb/models/brewery'
33
35
  require 'beerdb/schema'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beerdb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-29 00:00:00.000000000 Z
12
+ date: 2013-03-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
16
- requirement: &73327670 !ruby/object:Gem::Requirement
16
+ requirement: &83368970 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '3.2'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *73327670
24
+ version_requirements: *83368970
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: worlddb
27
- requirement: &73327440 !ruby/object:Gem::Requirement
27
+ requirement: &83368740 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '1.6'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *73327440
35
+ version_requirements: *83368740
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: commander
38
- requirement: &73327210 !ruby/object:Gem::Requirement
38
+ requirement: &83368520 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: 4.1.3
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *73327210
46
+ version_requirements: *83368520
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rdoc
49
- requirement: &72898760 !ruby/object:Gem::Requirement
49
+ requirement: &83368300 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '3.10'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *72898760
57
+ version_requirements: *83368300
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: hoe
60
- requirement: &72898510 !ruby/object:Gem::Requirement
60
+ requirement: &84239690 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ~>
@@ -65,7 +65,7 @@ dependencies:
65
65
  version: '3.3'
66
66
  type: :development
67
67
  prerelease: false
68
- version_requirements: *72898510
68
+ version_requirements: *84239690
69
69
  description: beerdb - beer.db command line tool
70
70
  email: tobedone@googlegroups.com
71
71
  executables:
@@ -82,12 +82,15 @@ files:
82
82
  - lib/beerdb.rb
83
83
  - lib/beerdb/cli/main.rb
84
84
  - lib/beerdb/cli/opts.rb
85
+ - lib/beerdb/console.rb
85
86
  - lib/beerdb/deleter.rb
86
87
  - lib/beerdb/models/beer.rb
87
88
  - lib/beerdb/models/brewery.rb
88
89
  - lib/beerdb/models/city.rb
89
90
  - lib/beerdb/models/country.rb
90
91
  - lib/beerdb/models/forward.rb
92
+ - lib/beerdb/models/region.rb
93
+ - lib/beerdb/models/tag.rb
91
94
  - lib/beerdb/reader.rb
92
95
  - lib/beerdb/schema.rb
93
96
  - lib/beerdb/stats.rb