beerdb 0.7.2 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest.txt +3 -0
- data/lib/beerdb/cli/main.rb +16 -4
- data/lib/beerdb/deleter.rb +4 -0
- data/lib/beerdb/models/beer.rb +9 -0
- data/lib/beerdb/models/bookmark.rb +25 -0
- data/lib/beerdb/models/drink.rb +12 -0
- data/lib/beerdb/models/forward.rb +4 -0
- data/lib/beerdb/models/user.rb +25 -0
- data/lib/beerdb/reader.rb +4 -46
- data/lib/beerdb/schema.rb +73 -0
- data/lib/beerdb/server.rb +59 -0
- data/lib/beerdb/stats.rb +5 -1
- data/lib/beerdb/version.rb +1 -1
- data/lib/beerdb.rb +34 -0
- metadata +15 -12
data/Manifest.txt
CHANGED
@@ -9,13 +9,16 @@ lib/beerdb/cli/opts.rb
|
|
9
9
|
lib/beerdb/console.rb
|
10
10
|
lib/beerdb/deleter.rb
|
11
11
|
lib/beerdb/models/beer.rb
|
12
|
+
lib/beerdb/models/bookmark.rb
|
12
13
|
lib/beerdb/models/brand.rb
|
13
14
|
lib/beerdb/models/brewery.rb
|
14
15
|
lib/beerdb/models/city.rb
|
15
16
|
lib/beerdb/models/country.rb
|
17
|
+
lib/beerdb/models/drink.rb
|
16
18
|
lib/beerdb/models/forward.rb
|
17
19
|
lib/beerdb/models/region.rb
|
18
20
|
lib/beerdb/models/tag.rb
|
21
|
+
lib/beerdb/models/user.rb
|
19
22
|
lib/beerdb/reader.rb
|
20
23
|
lib/beerdb/schema.rb
|
21
24
|
lib/beerdb/serializers/beer.rb
|
data/lib/beerdb/cli/main.rb
CHANGED
@@ -56,6 +56,9 @@ end
|
|
56
56
|
command :create do |c|
|
57
57
|
c.syntax = 'beerdb create [options]'
|
58
58
|
c.description = 'Create DB schema'
|
59
|
+
|
60
|
+
c.option '--extras', 'Extra tables (drinks,bookmarks,users)'
|
61
|
+
|
59
62
|
c.action do |args, options|
|
60
63
|
|
61
64
|
LogUtils::Logger.root.level = :warn if options.quiet.present?
|
@@ -63,10 +66,18 @@ command :create do |c|
|
|
63
66
|
|
64
67
|
myopts.merge_commander_options!( options.__hash__ )
|
65
68
|
connect_to_db( myopts )
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
69
|
+
|
70
|
+
if options.extras.present?
|
71
|
+
# quick hack: only create extra tables
|
72
|
+
BeerDb::CreateUsers.new.up
|
73
|
+
BeerDb::CreateBookmarks.new.up
|
74
|
+
BeerDb::CreateDrinks.new.up
|
75
|
+
else
|
76
|
+
LogDb.create
|
77
|
+
WorldDb.create
|
78
|
+
BeerDb.create
|
79
|
+
end
|
80
|
+
|
70
81
|
puts 'Done.'
|
71
82
|
end # action
|
72
83
|
end # command create
|
@@ -175,6 +186,7 @@ command :serve do |c|
|
|
175
186
|
# NB: server (HTTP service) not included in standard default require
|
176
187
|
require 'beerdb/server'
|
177
188
|
|
189
|
+
### fix: add ActiveRecord rack Middleware to close connection!! how?
|
178
190
|
BeerDb::Server.run!
|
179
191
|
|
180
192
|
puts 'Done.'
|
data/lib/beerdb/deleter.rb
CHANGED
@@ -9,6 +9,10 @@ module BeerDb
|
|
9
9
|
def run
|
10
10
|
# for now delete all tables
|
11
11
|
|
12
|
+
Bookmark.delete_all # db model extension - move to its own addon?
|
13
|
+
Drink.delete_all # db model extension - move to its own addon?
|
14
|
+
User.delete_all # db model extension - move to its own addon?
|
15
|
+
|
12
16
|
Beer.delete_all
|
13
17
|
Brand.delete_all
|
14
18
|
Brewery.delete_all
|
data/lib/beerdb/models/beer.rb
CHANGED
@@ -22,6 +22,15 @@ class Beer < ActiveRecord::Base
|
|
22
22
|
|
23
23
|
validates :key, :format => { :with => /^[a-z][a-z0-9]+$/, :message => 'expected two or more lowercase letters a-z or 0-9 digits' }
|
24
24
|
|
25
|
+
########################
|
26
|
+
# begin extras/extension drink/bookmar/user
|
27
|
+
|
28
|
+
has_many :drinks ## :class_name => 'Drink'
|
29
|
+
has_many :bookmarks, :as => :bookmarkable
|
30
|
+
|
31
|
+
# end extensions
|
32
|
+
########
|
33
|
+
|
25
34
|
|
26
35
|
def self.rnd # find random beer - fix: use "generic" activerecord helper and include/extend class
|
27
36
|
rnd_offset = rand( Beer.count ) ## NB: call "global" std lib rand
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module BeerDb::Models
|
4
|
+
|
5
|
+
class Bookmark < ActiveRecord::Base
|
6
|
+
|
7
|
+
belongs_to :bookmarkable, :polymorphic => true
|
8
|
+
belongs_to :user
|
9
|
+
|
10
|
+
|
11
|
+
### fix - how to do it with has_many macro? use finder_sql?
|
12
|
+
def drinks
|
13
|
+
## todo: check/assert bookmarkable_type == BeerDB::Models::Beer
|
14
|
+
Drink.where( user_id: user_id, beer_id: bookmarkable_id )
|
15
|
+
end
|
16
|
+
|
17
|
+
## todo: check: how to handle polymorphic best for getting beer for bookmarkable?
|
18
|
+
def beer
|
19
|
+
## todo: check/assert bookmarkable_type == BeerDB::Models::Beer
|
20
|
+
Beer.find( bookmarkable_id )
|
21
|
+
end
|
22
|
+
|
23
|
+
end # class Bookmark
|
24
|
+
|
25
|
+
end # module BeerDb::Models
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module BeerDb::Models
|
4
|
+
|
5
|
+
class User < ActiveRecord::Base
|
6
|
+
|
7
|
+
has_many :drinks # beers w/ ratings
|
8
|
+
|
9
|
+
has_many :bookmarks # bookmarked beers
|
10
|
+
|
11
|
+
|
12
|
+
before_save :on_before_save
|
13
|
+
|
14
|
+
def on_before_save
|
15
|
+
if email.blank?
|
16
|
+
self.key = 'xxx'
|
17
|
+
else
|
18
|
+
# NB: remove whitespace and (.-+_) and downcase
|
19
|
+
self.key = email.gsub( /[\s\.\-+_]/, '' ).downcase
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end # class User
|
24
|
+
|
25
|
+
end # module BeerDb::Models
|
data/lib/beerdb/reader.rb
CHANGED
@@ -3,50 +3,7 @@
|
|
3
3
|
module BeerDb
|
4
4
|
|
5
5
|
|
6
|
-
|
7
|
-
# rename n split TextUtils::ValueHelper into
|
8
|
-
# WorldDb::Matcher - match_country, etc.
|
9
|
-
# BeerDb::Matcher - match_brewery, etc.
|
10
|
-
|
11
|
-
|
12
|
-
## todo: move to worlddb for reuse!!! - find a better name?
|
13
|
-
|
14
|
-
module FixtureMatcher
|
15
|
-
|
16
|
-
def match_xxx_for_country( name, xxx, blk ) # xxx e.g. beers|breweries
|
17
|
-
if name =~ /(?:^|\/)([a-z]{2})-[^\/]+\/#{xxx}/
|
18
|
-
# new style: e.g. /at-austria/beers or ^at-austria!/beers
|
19
|
-
# auto-add required country code (from folder structure)
|
20
|
-
country_key = $1.dup
|
21
|
-
blk.call( country_key )
|
22
|
-
true # bingo - match found
|
23
|
-
elsif name =~ /\/([a-z]{2})\/#{xxx}/
|
24
|
-
# classic style: e.g. /at/beers (europe/at/beers)
|
25
|
-
# auto-add required country code (from folder structure)
|
26
|
-
country_key = $1.dup
|
27
|
-
blk.call( country_key )
|
28
|
-
true
|
29
|
-
else
|
30
|
-
false # no match found
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def match_xxx_for_country_n_region( name, xxx, blk ) # xxx e.g. beers|breweries
|
35
|
-
if name =~ /(?:^|\/)([a-z]{2})-[^\/]+\/([a-z]{1,2})-[^\/]+\/#{xxx}/
|
36
|
-
# new style: e.g. /at-austria/w-wien/beers or
|
37
|
-
# ^at-austria!/w-wien/beers
|
38
|
-
# nb: country must start name (^) or coming after / e.g. europe/at-austria/...
|
39
|
-
#
|
40
|
-
# auto-add required country n region code (from folder structure)
|
41
|
-
country_key = $1.dup
|
42
|
-
region_key = $2.dup
|
43
|
-
blk.call( country_key, region_key )
|
44
|
-
true # bingo - match found
|
45
|
-
else
|
46
|
-
false # no match found
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
6
|
+
module Matcher
|
50
7
|
|
51
8
|
def match_beers_for_country( name, &blk )
|
52
9
|
match_xxx_for_country( name, 'beers', blk )
|
@@ -64,8 +21,8 @@ module FixtureMatcher
|
|
64
21
|
match_xxx_for_country_n_region( name, 'breweries', blk )
|
65
22
|
end
|
66
23
|
|
24
|
+
end # module Matcher
|
67
25
|
|
68
|
-
end # module FixtureMatcher
|
69
26
|
|
70
27
|
class Reader
|
71
28
|
|
@@ -73,7 +30,8 @@ class Reader
|
|
73
30
|
|
74
31
|
include BeerDb::Models
|
75
32
|
|
76
|
-
include
|
33
|
+
include WorldDb::Matcher
|
34
|
+
include BeerDb::Matcher # lets us use match_teams_for_country etc.
|
77
35
|
|
78
36
|
attr_reader :include_path
|
79
37
|
|
data/lib/beerdb/schema.rb
CHANGED
@@ -2,6 +2,79 @@
|
|
2
2
|
|
3
3
|
module BeerDb
|
4
4
|
|
5
|
+
|
6
|
+
### some more optional migrations
|
7
|
+
#
|
8
|
+
# see beer.db.admin (copied for possible service/api version only)
|
9
|
+
|
10
|
+
class CreateDrinks < ActiveRecord::Migration
|
11
|
+
|
12
|
+
def up
|
13
|
+
create_table :drinks do |t| # join table (user,beer)
|
14
|
+
t.references :beer, :null => false
|
15
|
+
t.references :user, :null => false
|
16
|
+
t.integer :rating # 1-10 scala (10 is best)
|
17
|
+
t.text :comments
|
18
|
+
t.string :place # location (place) where tasted/drunken
|
19
|
+
|
20
|
+
## todo: add flag for bottle, can, draft
|
21
|
+
|
22
|
+
t.timestamps
|
23
|
+
end
|
24
|
+
end # method up
|
25
|
+
|
26
|
+
def down
|
27
|
+
raise ActiveRecord::IrreversibleMigration
|
28
|
+
end
|
29
|
+
|
30
|
+
end # class CreateDrinks
|
31
|
+
|
32
|
+
class CreateBookmarks < ActiveRecord::Migration
|
33
|
+
|
34
|
+
def up
|
35
|
+
create_table :bookmarks do |t| # join table (user,beer/brewery)
|
36
|
+
t.references :bookmarkable, :polymorphic => true # todo: check add :null => false is possible/needed?
|
37
|
+
t.references :user, :null => false
|
38
|
+
t.boolean :yes, :null => false, :default => false # like/favorite/top
|
39
|
+
t.boolean :no, :null => false, :default => false # dislike/flop/blacklisted
|
40
|
+
t.boolean :wish, :null => false, :default => false # e.g wish == false == drunk / wishlist (beer not yet drunken/tasted)
|
41
|
+
|
42
|
+
t.timestamps
|
43
|
+
end
|
44
|
+
end # method up
|
45
|
+
|
46
|
+
def down
|
47
|
+
raise ActiveRecord::IrreversibleMigration
|
48
|
+
end
|
49
|
+
|
50
|
+
end # class CreateBookmarks
|
51
|
+
|
52
|
+
|
53
|
+
class CreateUsers < ActiveRecord::Migration
|
54
|
+
|
55
|
+
def up
|
56
|
+
create_table :users do |t|
|
57
|
+
t.string :key, :null => false # import/export key
|
58
|
+
t.string :name, :null => false
|
59
|
+
t.string :email, :null => false
|
60
|
+
t.boolean :admin, :null => false, :default => false
|
61
|
+
t.boolean :guest, :null => false, :default => false
|
62
|
+
t.boolean :active, :null => false, :default => true
|
63
|
+
|
64
|
+
t.timestamps
|
65
|
+
end
|
66
|
+
end # method up
|
67
|
+
|
68
|
+
def down
|
69
|
+
raise ActiveRecord::IrreversibleMigration
|
70
|
+
end
|
71
|
+
|
72
|
+
end # class CreateUsers
|
73
|
+
|
74
|
+
|
75
|
+
#####################
|
76
|
+
# main migration
|
77
|
+
|
5
78
|
class CreateDb < ActiveRecord::Migration
|
6
79
|
|
7
80
|
|
data/lib/beerdb/server.rb
CHANGED
@@ -59,6 +59,65 @@ class Server < Sinatra::Base
|
|
59
59
|
erb :index
|
60
60
|
end
|
61
61
|
|
62
|
+
get '/drinks/:key' do |key|
|
63
|
+
|
64
|
+
puts " handle GET /drinks/:key"
|
65
|
+
|
66
|
+
if ['l', 'latest'].include?( key )
|
67
|
+
# get latest drinks (w/ ratings)
|
68
|
+
drinks = Drink.order( 'updated_at DESC' ).limit(10).all
|
69
|
+
elsif ['t', 'top'].include?( key )
|
70
|
+
drinks = Drink.order( 'rating DESC, updated_at DESC' ).limit(10).all
|
71
|
+
else
|
72
|
+
# assume it's a user key
|
73
|
+
user = User.find_by_key!( key )
|
74
|
+
drinks = Drink.order( 'rating DESC, updated_at DESC' ).where( user_id: user.id ).all
|
75
|
+
end
|
76
|
+
|
77
|
+
data = []
|
78
|
+
drinks.each do |drink|
|
79
|
+
data << {
|
80
|
+
beer: { title: drink.beer.title,
|
81
|
+
key: drink.beer.key },
|
82
|
+
rating: drink.rating,
|
83
|
+
user: { name: drink.user.name,
|
84
|
+
key: drink.user.key },
|
85
|
+
comments: drink.comments,
|
86
|
+
place: drink.place,
|
87
|
+
created_at: drink.created_at,
|
88
|
+
updated_at: drink.updated_at
|
89
|
+
}
|
90
|
+
end
|
91
|
+
|
92
|
+
json_or_jsonp( data.to_json )
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
get '/drinks' do
|
97
|
+
if params[:method] == 'post'
|
98
|
+
|
99
|
+
puts " handle GET /drinks?method=post"
|
100
|
+
|
101
|
+
user = User.find_by_key!( params[:user] )
|
102
|
+
beer = Beer.find_by_key!( params[:beer] )
|
103
|
+
rating = params[:rating].to_i
|
104
|
+
place = params[:place] # assumes for now a string or nil / pass through as is
|
105
|
+
|
106
|
+
attribs = {
|
107
|
+
user_id: user.id,
|
108
|
+
beer_id: beer.id,
|
109
|
+
rating: rating,
|
110
|
+
place: place
|
111
|
+
}
|
112
|
+
|
113
|
+
drink = Drink.new
|
114
|
+
drink.update_attributes!( attribs )
|
115
|
+
end
|
116
|
+
|
117
|
+
json_or_jsonp( { status: 'ok' }.to_json )
|
118
|
+
end
|
119
|
+
|
120
|
+
|
62
121
|
get '/d*' do
|
63
122
|
erb :debug
|
64
123
|
end
|
data/lib/beerdb/stats.rb
CHANGED
@@ -10,8 +10,12 @@ module BeerDb
|
|
10
10
|
puts " #{'%5d' % Beer.count} beers"
|
11
11
|
puts " #{'%5d' % Brand.count} brands"
|
12
12
|
puts " #{'%5d' % Brewery.count} breweries"
|
13
|
+
|
14
|
+
puts " #{'%5d' % User.count} users" # db model extension - move to its own addon?
|
15
|
+
puts " #{'%5d' % Bookmark.count} bookmarks" # db model extension - move to its own addon?
|
16
|
+
puts " #{'%5d' % Drink.count} drinks" # db model extension - move to its own addon?
|
13
17
|
end
|
14
|
-
|
18
|
+
|
15
19
|
def props
|
16
20
|
puts "Props:"
|
17
21
|
Prop.order( 'created_at asc' ).all.each do |prop|
|
data/lib/beerdb/version.rb
CHANGED
data/lib/beerdb.rb
CHANGED
@@ -33,6 +33,13 @@ require 'beerdb/models/tag'
|
|
33
33
|
require 'beerdb/models/beer'
|
34
34
|
require 'beerdb/models/brand'
|
35
35
|
require 'beerdb/models/brewery'
|
36
|
+
require 'beerdb/models/user' # db model extensions - move to its own addon gem?
|
37
|
+
require 'beerdb/models/drink' # db model extensions - move to its own addon gem?
|
38
|
+
require 'beerdb/models/bookmark' # db model extensions - move to its own addon gem?
|
39
|
+
|
40
|
+
require 'beerdb/serializers/beer'
|
41
|
+
require 'beerdb/serializers/brewery'
|
42
|
+
|
36
43
|
require 'beerdb/schema'
|
37
44
|
require 'beerdb/reader'
|
38
45
|
require 'beerdb/deleter'
|
@@ -56,10 +63,37 @@ module BeerDb
|
|
56
63
|
|
57
64
|
def self.create
|
58
65
|
CreateDb.new.up
|
66
|
+
|
67
|
+
### fix: make optional do NOT auto create here
|
68
|
+
CreateUsers.new.up
|
69
|
+
CreateBookmarks.new.up
|
70
|
+
CreateDrinks.new.up
|
71
|
+
|
59
72
|
BeerDb::Models::Prop.create!( key: 'db.schema.beer.version', value: VERSION )
|
60
73
|
end
|
61
74
|
|
62
75
|
|
76
|
+
|
77
|
+
module CodeReaderContext
|
78
|
+
# make models available w/o namespace
|
79
|
+
# e.g. lets you use Beer instead of BeerDb::Models::Beer
|
80
|
+
include BeerDb::Models
|
81
|
+
## <evaluated code here>
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.load( name, include_path='.' ) # NB: pass in w/o .rb extension e.g use users etc.
|
85
|
+
path = "#{include_path}/#{name}.rb"
|
86
|
+
|
87
|
+
puts "*** loading seed data '#{name}' (#{path})..."
|
88
|
+
|
89
|
+
::CodeReader.new( path ).eval( CodeReaderContext )
|
90
|
+
## nb: will get evaluated in context of passed in module like
|
91
|
+
## module CodeReaderContext
|
92
|
+
## <seed code here>
|
93
|
+
## end
|
94
|
+
end
|
95
|
+
|
96
|
+
|
63
97
|
def self.read( ary, include_path )
|
64
98
|
reader = Reader.new( include_path )
|
65
99
|
ary.each do |name|
|
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.
|
4
|
+
version: 0.8.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-
|
12
|
+
date: 2013-07-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
16
|
-
requirement: &
|
16
|
+
requirement: &74333290 !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: *
|
24
|
+
version_requirements: *74333290
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: worlddb
|
27
|
-
requirement: &
|
27
|
+
requirement: &74333070 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '1.7'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *74333070
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: commander
|
38
|
-
requirement: &
|
38
|
+
requirement: &74332850 !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: *
|
46
|
+
version_requirements: *74332850
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rdoc
|
49
|
-
requirement: &
|
49
|
+
requirement: &74332630 !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: *
|
57
|
+
version_requirements: *74332630
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: hoe
|
60
|
-
requirement: &
|
60
|
+
requirement: &74332410 !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: *
|
68
|
+
version_requirements: *74332410
|
69
69
|
description: beerdb - beer.db command line tool
|
70
70
|
email: beerdb@googlegroups.com
|
71
71
|
executables:
|
@@ -85,13 +85,16 @@ files:
|
|
85
85
|
- lib/beerdb/console.rb
|
86
86
|
- lib/beerdb/deleter.rb
|
87
87
|
- lib/beerdb/models/beer.rb
|
88
|
+
- lib/beerdb/models/bookmark.rb
|
88
89
|
- lib/beerdb/models/brand.rb
|
89
90
|
- lib/beerdb/models/brewery.rb
|
90
91
|
- lib/beerdb/models/city.rb
|
91
92
|
- lib/beerdb/models/country.rb
|
93
|
+
- lib/beerdb/models/drink.rb
|
92
94
|
- lib/beerdb/models/forward.rb
|
93
95
|
- lib/beerdb/models/region.rb
|
94
96
|
- lib/beerdb/models/tag.rb
|
97
|
+
- lib/beerdb/models/user.rb
|
95
98
|
- lib/beerdb/reader.rb
|
96
99
|
- lib/beerdb/schema.rb
|
97
100
|
- lib/beerdb/serializers/beer.rb
|