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 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
@@ -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
- LogDb.create
68
- WorldDb.create
69
- BeerDb.create
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.'
@@ -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
@@ -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,12 @@
1
+ # encoding: UTF-8
2
+
3
+ module BeerDb::Models
4
+
5
+ class Drink < ActiveRecord::Base
6
+
7
+ belongs_to :beer, class_name: 'BeerDb::Models::Beer'
8
+ belongs_to :user, class_name: 'BeerDb::Models::User'
9
+
10
+ end # class Drink
11
+
12
+ end # module BeerDb::Models
@@ -19,6 +19,10 @@ module BeerDb::Models
19
19
  class Brand < ActiveRecord::Base ; end
20
20
  class Brewery < ActiveRecord::Base ; end
21
21
 
22
+ class User < ActiveRecord::Base ; end
23
+ class Bookmark < ActiveRecord::Base ; end
24
+ class Drink < ActiveRecord::Base ; end
25
+
22
26
  end
23
27
 
24
28
 
@@ -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 FixtureMatcher # see above
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|
@@ -1,4 +1,4 @@
1
1
 
2
2
  module BeerDb
3
- VERSION = '0.7.2'
3
+ VERSION = '0.8.0'
4
4
  end
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.7.2
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-05-20 00:00:00.000000000 Z
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: &71631860 !ruby/object:Gem::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: *71631860
24
+ version_requirements: *74333290
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: worlddb
27
- requirement: &71631640 !ruby/object:Gem::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: *71631640
35
+ version_requirements: *74333070
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: commander
38
- requirement: &71631420 !ruby/object:Gem::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: *71631420
46
+ version_requirements: *74332850
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rdoc
49
- requirement: &71631200 !ruby/object:Gem::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: *71631200
57
+ version_requirements: *74332630
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: hoe
60
- requirement: &71630980 !ruby/object:Gem::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: *71630980
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