beerdb 0.7.2 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/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
|