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 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