beerdb 0.8.0 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -16,6 +16,7 @@ lib/beerdb/models/city.rb
16
16
  lib/beerdb/models/country.rb
17
17
  lib/beerdb/models/drink.rb
18
18
  lib/beerdb/models/forward.rb
19
+ lib/beerdb/models/note.rb
19
20
  lib/beerdb/models/region.rb
20
21
  lib/beerdb/models/tag.rb
21
22
  lib/beerdb/models/user.rb
@@ -36,6 +36,7 @@ require 'beerdb/models/brewery'
36
36
  require 'beerdb/models/user' # db model extensions - move to its own addon gem?
37
37
  require 'beerdb/models/drink' # db model extensions - move to its own addon gem?
38
38
  require 'beerdb/models/bookmark' # db model extensions - move to its own addon gem?
39
+ require 'beerdb/models/note' # db model extensions - move to its own addon gem?
39
40
 
40
41
  require 'beerdb/serializers/beer'
41
42
  require 'beerdb/serializers/brewery'
@@ -65,9 +66,10 @@ module BeerDb
65
66
  CreateDb.new.up
66
67
 
67
68
  ### fix: make optional do NOT auto create here
68
- CreateUsers.new.up
69
- CreateBookmarks.new.up
70
- CreateDrinks.new.up
69
+ CreateDbExtrasUsers.new.up
70
+ CreateDbExtrasBookmarks.new.up
71
+ CreateDbExtrasDrinks.new.up
72
+ CreateDbExtrasNotes.new.up
71
73
 
72
74
  BeerDb::Models::Prop.create!( key: 'db.schema.beer.version', value: VERSION )
73
75
  end
@@ -69,9 +69,10 @@ command :create do |c|
69
69
 
70
70
  if options.extras.present?
71
71
  # quick hack: only create extra tables
72
- BeerDb::CreateUsers.new.up
73
- BeerDb::CreateBookmarks.new.up
74
- BeerDb::CreateDrinks.new.up
72
+ BeerDb::CreateDbExtrasUsers.new.up
73
+ BeerDb::CreateDbExtrasBookmarks.new.up
74
+ BeerDb::CreateDbExtrasNotes.new.up
75
+ BeerDb::CreateDbExtrasDrinks.new.up
75
76
  else
76
77
  LogDb.create
77
78
  WorldDb.create
@@ -11,6 +11,7 @@ module BeerDb
11
11
 
12
12
  Bookmark.delete_all # db model extension - move to its own addon?
13
13
  Drink.delete_all # db model extension - move to its own addon?
14
+ Note.delete_all # db model extension - move to its own addon?
14
15
  User.delete_all # db model extension - move to its own addon?
15
16
 
16
17
  Beer.delete_all
@@ -26,6 +26,7 @@ class Beer < ActiveRecord::Base
26
26
  # begin extras/extension drink/bookmar/user
27
27
 
28
28
  has_many :drinks ## :class_name => 'Drink'
29
+ has_many :notes ## :class_name => 'Note'
29
30
  has_many :bookmarks, :as => :bookmarkable
30
31
 
31
32
  # end extensions
@@ -13,7 +13,13 @@ class Bookmark < ActiveRecord::Base
13
13
  ## todo: check/assert bookmarkable_type == BeerDB::Models::Beer
14
14
  Drink.where( user_id: user_id, beer_id: bookmarkable_id )
15
15
  end
16
-
16
+
17
+ def notes
18
+ ## todo: check/assert bookmarkable_type == BeerDB::Models::Beer
19
+ Note.where( user_id: user_id, beer_id: bookmarkable_id )
20
+ end
21
+
22
+
17
23
  ## todo: check: how to handle polymorphic best for getting beer for bookmarkable?
18
24
  def beer
19
25
  ## todo: check/assert bookmarkable_type == BeerDB::Models::Beer
@@ -7,6 +7,16 @@ class Drink < ActiveRecord::Base
7
7
  belongs_to :beer, class_name: 'BeerDb::Models::Beer'
8
8
  belongs_to :user, class_name: 'BeerDb::Models::User'
9
9
 
10
+ before_save :on_before_save
11
+
12
+ def on_before_save
13
+ # todo/check: can we use blank? for datetime too or just array,strings,etc.
14
+ # check - can we use/access created_at? already set for new records?
15
+
16
+ self.drunk_at = Time.now if drunk_at.blank?
17
+ end
18
+
19
+
10
20
  end # class Drink
11
21
 
12
22
  end # module BeerDb::Models
@@ -22,6 +22,7 @@ module BeerDb::Models
22
22
  class User < ActiveRecord::Base ; end
23
23
  class Bookmark < ActiveRecord::Base ; end
24
24
  class Drink < ActiveRecord::Base ; end
25
+ class Note < ActiveRecord::Base ; end
25
26
 
26
27
  end
27
28
 
@@ -0,0 +1,12 @@
1
+ # encoding: UTF-8
2
+
3
+ module BeerDb::Models
4
+
5
+ class Note < 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 Note
11
+
12
+ end # module BeerDb::Models
@@ -4,13 +4,14 @@ module BeerDb::Models
4
4
 
5
5
  class User < ActiveRecord::Base
6
6
 
7
- has_many :drinks # beers w/ ratings
8
-
7
+ has_many :notes # beers w/ ratings
8
+ has_many :drinks
9
+
9
10
  has_many :bookmarks # bookmarked beers
10
11
 
11
12
 
12
13
  before_save :on_before_save
13
-
14
+
14
15
  def on_before_save
15
16
  if email.blank?
16
17
  self.key = 'xxx'
@@ -7,13 +7,17 @@ module BeerDb
7
7
  #
8
8
  # see beer.db.admin (copied for possible service/api version only)
9
9
 
10
- class CreateDrinks < ActiveRecord::Migration
10
+
11
+ ####
12
+ # tasting notes (w/ ratings)
13
+ class CreateDbExtrasNotes < ActiveRecord::Migration
11
14
 
12
15
  def up
13
- create_table :drinks do |t| # join table (user,beer)
16
+ create_table :notes do |t| # join table (user,beer)
14
17
  t.references :beer, :null => false
15
18
  t.references :user, :null => false
16
- t.integer :rating # 1-10 scala (10 is best)
19
+ t.integer :rating, :null => false # 1-10 scala (10 is best)
20
+
17
21
  t.text :comments
18
22
  t.string :place # location (place) where tasted/drunken
19
23
 
@@ -27,18 +31,43 @@ def down
27
31
  raise ActiveRecord::IrreversibleMigration
28
32
  end
29
33
 
34
+ end
35
+
36
+
37
+ #################
38
+ # +1 - beer drink log; track beers
39
+ class CreateDbExtrasDrinks < ActiveRecord::Migration
40
+
41
+ def up
42
+ create_table :drinks do |t| # join table (user,beer)
43
+ t.references :beer, :null => false
44
+ t.references :user, :null => false
45
+ t.datetime :drunk_at ## , :null => false # todo: pre-set if nil to created_at?
46
+
47
+ t.string :place # location (place) where tasted/drunken
48
+
49
+ ## todo: add flag for bottle, can, draft
50
+
51
+ t.timestamps
52
+ end
53
+ end # method up
54
+
55
+ def down
56
+ raise ActiveRecord::IrreversibleMigration
57
+ end
58
+
30
59
  end # class CreateDrinks
31
60
 
32
- class CreateBookmarks < ActiveRecord::Migration
61
+ class CreateDbExtrasBookmarks < ActiveRecord::Migration
33
62
 
34
63
  def up
35
64
  create_table :bookmarks do |t| # join table (user,beer/brewery)
36
65
  t.references :bookmarkable, :polymorphic => true # todo: check add :null => false is possible/needed?
37
66
  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
67
+ t.boolean :yes, :null => false, :default => false # like/favorite/top
68
+ t.boolean :no, :null => false, :default => false # dislike/flop/blacklisted
40
69
  t.boolean :wish, :null => false, :default => false # e.g wish == false == drunk / wishlist (beer not yet drunken/tasted)
41
-
70
+
42
71
  t.timestamps
43
72
  end
44
73
  end # method up
@@ -50,7 +79,7 @@ end
50
79
  end # class CreateBookmarks
51
80
 
52
81
 
53
- class CreateUsers < ActiveRecord::Migration
82
+ class CreateDbExtrasUsers < ActiveRecord::Migration
54
83
 
55
84
  def up
56
85
  create_table :users do |t|
@@ -59,19 +59,85 @@ class Server < Sinatra::Base
59
59
  erb :index
60
60
  end
61
61
 
62
+ get '/notes/:key' do |key|
63
+
64
+ puts " handle GET /notes/:key"
65
+
66
+ if ['l', 'latest'].include?( key )
67
+ # get latest tasting notes (w/ ratings)
68
+ notes = Note.order( 'updated_at DESC' ).limit(10).all
69
+ elsif ['h', 'hot'].include?( key )
70
+ # get latest tasting notes (w/ ratings)
71
+ # fix: use log algo for "hotness" - for now same as latest
72
+ notes = Note.order( 'updated_at DESC' ).limit(10).all
73
+ elsif ['t', 'top'].include?( key )
74
+ notes = Note.order( 'rating DESC, updated_at DESC' ).limit(10).all
75
+ else
76
+ ### todo: move to /u/:key/notes ??
77
+
78
+ # assume it's a user key
79
+ user = User.find_by_key!( key )
80
+ notes = Note.order( 'rating DESC, updated_at DESC' ).where( user_id: user.id ).all
81
+ end
82
+
83
+ data = []
84
+ notes.each do |note|
85
+ data << {
86
+ beer: { title: note.beer.title,
87
+ key: note.beer.key },
88
+ user: { name: note.user.name,
89
+ key: note.user.key },
90
+ rating: note.rating,
91
+ comments: note.comments,
92
+ place: note.place,
93
+ created_at: note.created_at,
94
+ updated_at: note.updated_at
95
+ }
96
+ end
97
+
98
+ json_or_jsonp( data.to_json )
99
+ end
100
+
101
+
102
+ get '/notes' do
103
+ if params[:method] == 'post'
104
+
105
+ puts " handle GET /notes?method=post"
106
+
107
+ user = User.find_by_key!( params[:user] )
108
+ beer = Beer.find_by_key!( params[:beer] )
109
+ rating = params[:rating].to_i
110
+ place = params[:place] # assumes for now a string or nil / pass through as is
111
+
112
+ attribs = {
113
+ user_id: user.id,
114
+ beer_id: beer.id,
115
+ rating: rating,
116
+ place: place
117
+ }
118
+
119
+ note = Note.new
120
+ note.update_attributes!( attribs )
121
+ end
122
+
123
+ json_or_jsonp( { status: 'ok' }.to_json )
124
+ end
125
+
126
+
62
127
  get '/drinks/:key' do |key|
63
128
 
64
129
  puts " handle GET /drinks/:key"
65
130
 
66
131
  if ['l', 'latest'].include?( key )
67
- # get latest drinks (w/ ratings)
132
+ # get latest +1 drinks
133
+ ## todo: order by drunk_at??
68
134
  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
135
  else
136
+ ### todo: move to /u/:key/drinks ??
137
+
72
138
  # assume it's a user key
73
139
  user = User.find_by_key!( key )
74
- drinks = Drink.order( 'rating DESC, updated_at DESC' ).where( user_id: user.id ).all
140
+ drinks = Drink.order( 'updated_at DESC' ).where( user_id: user.id ).all
75
141
  end
76
142
 
77
143
  data = []
@@ -79,16 +145,15 @@ class Server < Sinatra::Base
79
145
  data << {
80
146
  beer: { title: drink.beer.title,
81
147
  key: drink.beer.key },
82
- rating: drink.rating,
83
148
  user: { name: drink.user.name,
84
149
  key: drink.user.key },
85
- comments: drink.comments,
86
150
  place: drink.place,
151
+ drunk_at: drink.drunk_at,
87
152
  created_at: drink.created_at,
88
153
  updated_at: drink.updated_at
89
154
  }
90
155
  end
91
-
156
+
92
157
  json_or_jsonp( data.to_json )
93
158
  end
94
159
 
@@ -100,13 +165,11 @@ class Server < Sinatra::Base
100
165
 
101
166
  user = User.find_by_key!( params[:user] )
102
167
  beer = Beer.find_by_key!( params[:beer] )
103
- rating = params[:rating].to_i
104
168
  place = params[:place] # assumes for now a string or nil / pass through as is
105
169
 
106
170
  attribs = {
107
171
  user_id: user.id,
108
172
  beer_id: beer.id,
109
- rating: rating,
110
173
  place: place
111
174
  }
112
175
 
@@ -10,10 +10,11 @@ module BeerDb
10
10
  puts " #{'%5d' % Beer.count} beers"
11
11
  puts " #{'%5d' % Brand.count} brands"
12
12
  puts " #{'%5d' % Brewery.count} breweries"
13
-
13
+ puts
14
14
  puts " #{'%5d' % User.count} users" # db model extension - move to its own addon?
15
15
  puts " #{'%5d' % Bookmark.count} bookmarks" # db model extension - move to its own addon?
16
16
  puts " #{'%5d' % Drink.count} drinks" # db model extension - move to its own addon?
17
+ puts " #{'%5d' % Note.count} notes" # db model extension - move to its own addon?
17
18
  end
18
19
 
19
20
  def props
@@ -1,4 +1,4 @@
1
1
 
2
2
  module BeerDb
3
- VERSION = '0.8.0'
3
+ VERSION = '0.8.1'
4
4
  end
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.8.0
4
+ version: 0.8.1
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-07-14 00:00:00.000000000 Z
12
+ date: 2013-07-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
16
- requirement: &74333290 !ruby/object:Gem::Requirement
16
+ requirement: &77241100 !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: *74333290
24
+ version_requirements: *77241100
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: worlddb
27
- requirement: &74333070 !ruby/object:Gem::Requirement
27
+ requirement: &77240880 !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: *74333070
35
+ version_requirements: *77240880
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: commander
38
- requirement: &74332850 !ruby/object:Gem::Requirement
38
+ requirement: &77240660 !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: *74332850
46
+ version_requirements: *77240660
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rdoc
49
- requirement: &74332630 !ruby/object:Gem::Requirement
49
+ requirement: &77240440 !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: *74332630
57
+ version_requirements: *77240440
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: hoe
60
- requirement: &74332410 !ruby/object:Gem::Requirement
60
+ requirement: &77240220 !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: *74332410
68
+ version_requirements: *77240220
69
69
  description: beerdb - beer.db command line tool
70
70
  email: beerdb@googlegroups.com
71
71
  executables:
@@ -92,6 +92,7 @@ files:
92
92
  - lib/beerdb/models/country.rb
93
93
  - lib/beerdb/models/drink.rb
94
94
  - lib/beerdb/models/forward.rb
95
+ - lib/beerdb/models/note.rb
95
96
  - lib/beerdb/models/region.rb
96
97
  - lib/beerdb/models/tag.rb
97
98
  - lib/beerdb/models/user.rb