beer_list 1.1.0 → 2.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/README.md +7 -2
  2. data/beer_list.gemspec +1 -1
  3. data/lib/beer_list/cli.rb +6 -3
  4. data/lib/beer_list/establishments/acadia_cafe.rb +6 -1
  5. data/lib/beer_list/establishments/blue_door_pub.rb +6 -1
  6. data/lib/beer_list/establishments/blue_nile.rb +6 -1
  7. data/lib/beer_list/establishments/bulldog_lowertown.rb +6 -1
  8. data/lib/beer_list/establishments/bulldog_northeast.rb +6 -1
  9. data/lib/beer_list/establishments/bulldog_uptown.rb +6 -1
  10. data/lib/beer_list/establishments/busters_on28th.rb +6 -1
  11. data/lib/beer_list/establishments/edina_grill.rb +6 -1
  12. data/lib/beer_list/establishments/establishment.rb +3 -10
  13. data/lib/beer_list/establishments/ginger_hop.rb +6 -1
  14. data/lib/beer_list/establishments/groveland_tap.rb +6 -1
  15. data/lib/beer_list/establishments/happy_gnome.rb +5 -0
  16. data/lib/beer_list/establishments/icehouse.rb +43 -0
  17. data/lib/beer_list/establishments/longfellow_grill.rb +6 -1
  18. data/lib/beer_list/establishments/lowry_uptown.rb +6 -1
  19. data/lib/beer_list/establishments/mackenzie_pub.rb +6 -1
  20. data/lib/beer_list/establishments/macs_industrial.rb +6 -1
  21. data/lib/beer_list/establishments/mc_coys_mn.rb +5 -0
  22. data/lib/beer_list/establishments/muddy_pig.rb +6 -1
  23. data/lib/beer_list/establishments/muddy_waters.rb +6 -1
  24. data/lib/beer_list/establishments/new_bohemia.rb +6 -1
  25. data/lib/beer_list/establishments/red_cow.rb +31 -0
  26. data/lib/beer_list/establishments/stanleys_bar_room.rb +5 -0
  27. data/lib/beer_list/establishments/three_squares.rb +6 -1
  28. data/lib/beer_list/establishments/washington_square.rb +6 -1
  29. data/lib/beer_list/list.rb +8 -4
  30. data/lib/beer_list/listable.rb +8 -9
  31. data/lib/beer_list/scraper.rb +1 -1
  32. data/lib/beer_list.rb +15 -16
  33. data/lib/generators/establishment_generator.rb +1 -0
  34. data/lib/generators/templates/establishment.erb +6 -1
  35. data/spec/lib/beer_list/establishments/establishment_spec.rb +17 -7
  36. data/spec/lib/beer_list/list_spec.rb +8 -8
  37. data/spec/lib/beer_list_spec.rb +14 -22
  38. metadata +7 -5
data/README.md CHANGED
@@ -88,7 +88,8 @@ will create the following code in path/to/establishments/applebirds.rb
88
88
  module BeerList
89
89
  module Establishments
90
90
  class Applebirds < Establishment
91
- URL = 'http://applebirds.com/beers'
91
+ URL = 'http://applebirds.com/beers'
92
+ ADDRESS = nil
92
93
 
93
94
  # Handles parsing and manipulating a Mechanize::Page object
94
95
  # in order to scrape the contents of your beer list.
@@ -101,6 +102,10 @@ module BeerList
101
102
  def url
102
103
  URL
103
104
  end
105
+
106
+ def address
107
+ ADDRESS
108
+ end
104
109
  end
105
110
  end
106
111
  end
@@ -175,7 +180,7 @@ BeerList.send_lists
175
180
  ```
176
181
 
177
182
  Both .send_list and .send_lists accept an optional URL as the last argument. If you don't pass one,
178
- it will use the default in your configuration. If neither doesn't exist, it will raise an error.
183
+ it will use the default in your configuration. If neither exist, it will raise an error.
179
184
 
180
185
  ### Leads
181
186
 
data/beer_list.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = 'beer_list'
3
- spec.version = '1.1.0'
3
+ spec.version = '2.0.0.rc1'
4
4
  spec.authors = ['Dan Olson']
5
5
  spec.email = ['olson_dan@yahoo.com']
6
6
  spec.description = 'A utility for retrieving the beer list from various establishments'
data/lib/beer_list/cli.rb CHANGED
@@ -12,6 +12,9 @@ module BeerList
12
12
  option :selector,
13
13
  aliases: '-s',
14
14
  banner: 'Optional selector to use for scraping'
15
+ option :address,
16
+ aliases: '-a',
17
+ banner: 'The physical address of your establishment'
15
18
 
16
19
  desc 'establish ESTABLISHMENT', 'Generate a subclass of BeerList::Establishments::Establishment in the given directory'
17
20
  def establish(klass)
@@ -36,9 +39,9 @@ module BeerList
36
39
  puts BeerList.lists_as_json
37
40
  else
38
41
  BeerList.lists.each do |list|
39
- puts '*' * (list.establishment.size + 10)
40
- puts "**** #{list.establishment} ****"
41
- puts '*' * (list.establishment.size + 10)
42
+ puts '*' * (list.listable_name.size + 10)
43
+ puts "**** #{list.listable_name} ****"
44
+ puts '*' * (list.listable_name.size + 10)
42
45
  puts
43
46
  puts list
44
47
  puts
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class AcadiaCafe < Establishment
4
- URL = 'http://acadiacafe.com/as_beer-menu-and-happy-hour-specials'
4
+ URL = 'http://acadiacafe.com/as_beer-menu-and-happy-hour-specials'
5
+ ADDRESS = '329 Cedar Ave, Minneapolis, MN 55454'
5
6
 
6
7
  def get_list
7
8
  base_list
@@ -13,6 +14,10 @@ module BeerList
13
14
  URL
14
15
  end
15
16
 
17
+ def address
18
+ ADDRESS
19
+ end
20
+
16
21
  private
17
22
 
18
23
  def base_list
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class BlueDoorPub < Establishment
4
- URL = 'http://thebdp.com/?page_id=159'
4
+ URL = 'http://thebdp.com/?page_id=159'
5
+ ADDRESS = '1811 Selby Ave, St Paul, MN 55104'
5
6
 
6
7
  def get_list
7
8
  page.search('div.two-columns li a').map(&:text)
@@ -10,6 +11,10 @@ module BeerList
10
11
  def url
11
12
  URL
12
13
  end
14
+
15
+ def address
16
+ ADDRESS
17
+ end
13
18
  end
14
19
  end
15
20
  end
@@ -2,7 +2,8 @@ module BeerList
2
2
  module Establishments
3
3
  class BlueNile < Establishment
4
4
  RESTAURANT_NAME = 'Blue Nile'
5
- URL = 'http://www.bluenilempls.com/bar-b.html'
5
+ URL = 'http://www.bluenilempls.com/bar-b.html'
6
+ ADDRESS = '2027 E Franklin Ave, Minneapolis, MN 55404'
6
7
 
7
8
  def get_list
8
9
  base_list
@@ -13,6 +14,10 @@ module BeerList
13
14
  URL
14
15
  end
15
16
 
17
+ def address
18
+ ADDRESS
19
+ end
20
+
16
21
  private
17
22
 
18
23
  def headers
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class BulldogLowertown < Establishment
4
- URL = 'http://www.thebulldoglowertown.com/beer/'
4
+ URL = 'http://www.thebulldoglowertown.com/beer/'
5
+ ADDRESS = '237 E 6th St, St Paul, MN 55101'
5
6
 
6
7
  def get_list
7
8
  page.search('ul.beerlist li').map(&:text)
@@ -10,6 +11,10 @@ module BeerList
10
11
  def url
11
12
  URL
12
13
  end
14
+
15
+ def address
16
+ ADDRESS
17
+ end
13
18
  end
14
19
  end
15
20
  end
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class BulldogNortheast < Establishment
4
- URL = 'http://www.thebulldognortheast.com/beer/'
4
+ URL = 'http://www.thebulldognortheast.com/beer/'
5
+ ADDRESS = '401 E Hennepin Ave, Minneapolis, MN 55414'
5
6
 
6
7
  def get_list
7
8
  list = page.search('p.copy_menu_item_desc').map(&:text)
@@ -12,6 +13,10 @@ module BeerList
12
13
  def url
13
14
  URL
14
15
  end
16
+
17
+ def address
18
+ ADDRESS
19
+ end
15
20
  end
16
21
  end
17
22
  end
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class BulldogUptown < Establishment
4
- URL = 'http://www.thebulldoguptown.com/beer/'
4
+ URL = 'http://www.thebulldoguptown.com/beer/'
5
+ ADDRESS = '2549 Lyndale Ave S, Minneapolis, MN 55405'
5
6
 
6
7
  def get_list
7
8
  list = page.search('span.menuTitle').map(&:text)
@@ -16,6 +17,10 @@ module BeerList
16
17
  def url
17
18
  URL
18
19
  end
20
+
21
+ def address
22
+ ADDRESS
23
+ end
19
24
  end
20
25
  end
21
26
  end
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class BustersOn28th < Establishment
4
- URL = 'http://busterson28th.com/bottles/'
4
+ URL = 'http://busterson28th.com/bottles/'
5
+ ADDRESS = '4204 S 28th Ave, Minneapolis, Minnesota 55406'
5
6
 
6
7
  def get_list
7
8
  base_list
@@ -15,6 +16,10 @@ module BeerList
15
16
  URL
16
17
  end
17
18
 
19
+ def address
20
+ ADDRESS
21
+ end
22
+
18
23
  private
19
24
 
20
25
  def base_list
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class EdinaGrill < Establishment
4
- URL = 'http://www.edinagrill.com/beer_taps.php'
4
+ URL = 'http://www.edinagrill.com/beer_taps.php'
5
+ ADDRESS = '5028 France Ave S, Edina, MN 55424'
5
6
 
6
7
  def get_list
7
8
  page.search('li span').map(&:text)
@@ -10,6 +11,10 @@ module BeerList
10
11
  def url
11
12
  URL
12
13
  end
14
+
15
+ def address
16
+ ADDRESS
17
+ end
13
18
  end
14
19
  end
15
20
  end
@@ -3,16 +3,9 @@ module BeerList
3
3
  class Establishment
4
4
  include BeerList::Listable
5
5
 
6
- def get_list
7
- raise "#{__method__} is not implemented in #{self.class.name}"
8
- end
9
-
10
- def url
11
- raise "#{__method__} is not implemented in #{self.class.name}"
12
- end
13
-
14
- def short_class_name
15
- self.class.name.split('::').last
6
+ def name
7
+ class_name = self.class.name.split('::').last
8
+ class_name.split(/([A-Z]{1}[a-z]+)/).reject(&:empty?).join(' ')
16
9
  end
17
10
  end
18
11
  end
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class GingerHop < Establishment
4
- URL = 'http://www.gingerhop.com/beer'
4
+ URL = 'http://www.gingerhop.com/beer'
5
+ ADDRESS = '201 E Hennepin Ave, Minneapolis, MN 55414'
5
6
 
6
7
  def get_list
7
8
  page.search('div.left-col h5').map(&:text)
@@ -10,6 +11,10 @@ module BeerList
10
11
  def url
11
12
  URL
12
13
  end
14
+
15
+ def address
16
+ ADDRESS
17
+ end
13
18
  end
14
19
  end
15
20
  end
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class GrovelandTap < Establishment
4
- URL = 'http://www.grovelandtap.com/beer_taps.php'
4
+ URL = 'http://www.grovelandtap.com/beer_taps.php'
5
+ ADDRESS = '1834 St Clair Ave, St Paul, MN 55105'
5
6
 
6
7
  def get_list
7
8
  page.search('p.MsoNormal').map(&:text)
@@ -10,6 +11,10 @@ module BeerList
10
11
  def url
11
12
  URL
12
13
  end
14
+
15
+ def address
16
+ ADDRESS
17
+ end
13
18
  end
14
19
  end
15
20
  end
@@ -3,6 +3,7 @@ module BeerList
3
3
  class HappyGnome < Establishment
4
4
  attr_accessor :url
5
5
 
6
+ ADDRESS = '498 Selby Ave, St Paul, MN 55102'
6
7
  DRAFTS = 'http://thehappygnome.com/menus/drafts/'
7
8
  BOTTLES = 'http://thehappygnome.com/menus/bottled-beers/'
8
9
 
@@ -15,6 +16,10 @@ module BeerList
15
16
  get_bottle_list
16
17
  end
17
18
 
19
+ def address
20
+ ADDRESS
21
+ end
22
+
18
23
  private
19
24
 
20
25
  def get_the_list
@@ -0,0 +1,43 @@
1
+ module BeerList
2
+ module Establishments
3
+ class Icehouse < Establishment
4
+ URL = 'http://www.icehousempls.com/drinks/beer/'
5
+ ADDRESS = "2528 Nicollet Ave, Minneapolis, MN 55404"
6
+
7
+ def get_list
8
+ base_list
9
+ only_caps
10
+ reject_empty
11
+ capitalize
12
+ end
13
+
14
+ def url
15
+ URL
16
+ end
17
+
18
+ def address
19
+ ADDRESS
20
+ end
21
+
22
+ private
23
+
24
+ def base_list
25
+ @icehouse = page.search('article#menu dd').map(&:text)
26
+ end
27
+
28
+ def only_caps
29
+ @icehouse = @icehouse.map { |b| b.match(/\A([0-9]+)?\s?([A-Z]+\s?)+/).to_s }
30
+ end
31
+
32
+ def reject_empty
33
+ @icehouse = @icehouse.reject { |b| b.empty? }
34
+ end
35
+
36
+ def capitalize
37
+ @icehouse.map do |b|
38
+ b.split(' ').map(&:capitalize).join(' ')
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class LongfellowGrill < Establishment
4
- URL = 'http://www.longfellowgrill.com/beer_taps.php'
4
+ URL = 'http://www.longfellowgrill.com/beer_taps.php'
5
+ ADDRESS = '2990 W River Pkwy, Minneapolis, MN 55406'
5
6
  STATE_AND_PRICE_REGEX = /\s*(?:\([A-Z]*\))*\s*\**\s*\d+\.\d{2}$/
6
7
 
7
8
  def get_list
@@ -14,6 +15,10 @@ module BeerList
14
15
  URL
15
16
  end
16
17
 
18
+ def address
19
+ ADDRESS
20
+ end
21
+
17
22
  private
18
23
 
19
24
  def get_base_list
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class LowryUptown < Establishment
4
- URL = 'http://www.thelowryuptown.com/drink'
4
+ URL = 'http://www.thelowryuptown.com/drink'
5
+ ADDRESS = '2112 Hennepin Ave, Minneapolis, MN 55405'
5
6
 
6
7
  def get_list
7
8
  base_list
@@ -13,6 +14,10 @@ module BeerList
13
14
  URL
14
15
  end
15
16
 
17
+ def address
18
+ ADDRESS
19
+ end
20
+
16
21
  private
17
22
 
18
23
  def base_list
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class MackenziePub < Establishment
4
- URL = 'http://mackenziepub.com/drink/beer/'
4
+ URL = 'http://mackenziepub.com/drink/beer/'
5
+ ADDRESS = '918 Hennepin Ave, Minneapolis, MN 55403'
5
6
 
6
7
  def get_list
7
8
  base_list
@@ -12,6 +13,10 @@ module BeerList
12
13
  URL
13
14
  end
14
15
 
16
+ def address
17
+ ADDRESS
18
+ end
19
+
15
20
  private
16
21
 
17
22
  def base_list
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class MacsIndustrial < Establishment
4
- URL = 'http://www.macsindustrial.com/tap_page.php'
4
+ URL = 'http://www.macsindustrial.com/tap_page.php'
5
+ ADDRESS = '312 Central Ave SE, Minneapolis, MN 55414'
5
6
 
6
7
  def get_list
7
8
  build_list
@@ -11,6 +12,10 @@ module BeerList
11
12
  URL
12
13
  end
13
14
 
15
+ def address
16
+ ADDRESS
17
+ end
18
+
14
19
  private
15
20
 
16
21
  def build_list
@@ -3,6 +3,7 @@ module BeerList
3
3
  class McCoysMN < Establishment
4
4
  attr_accessor :url
5
5
 
6
+ ADDRESS = '3801 Grand Way, St Louis Park, MN 55416'
6
7
  DRAFTS = 'http://mccoysmn.com/beer/'
7
8
  BOTTLES = 'http://mccoysmn.com/beer/bottles'
8
9
 
@@ -16,6 +17,10 @@ module BeerList
16
17
  get_bottle_list
17
18
  end
18
19
 
20
+ def address
21
+ ADDRESS
22
+ end
23
+
19
24
  private
20
25
 
21
26
  def get_draft_list
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class MuddyPig < Establishment
4
- URL = 'http://muddypig.com/beer/'
4
+ URL = 'http://muddypig.com/beer/'
5
+ ADDRESS = '162 Dale St N, St Paul, MN 55102'
5
6
 
6
7
  def get_list
7
8
  page.search('p').last.text.split("\n")
@@ -10,6 +11,10 @@ module BeerList
10
11
  def url
11
12
  URL
12
13
  end
14
+
15
+ def address
16
+ ADDRESS
17
+ end
13
18
  end
14
19
  end
15
20
  end
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class MuddyWaters < Establishment
4
- URL = 'http://muddywatersmpls.com/booze.html'
4
+ URL = 'http://muddywatersmpls.com/booze.html'
5
+ ADDRESS = '2933 Lyndale Ave S, Minneapolis, MN 55408'
5
6
 
6
7
  def get_list
7
8
  get_processed_list
@@ -11,6 +12,10 @@ module BeerList
11
12
  URL
12
13
  end
13
14
 
15
+ def address
16
+ ADDRESS
17
+ end
18
+
14
19
  def get_processed_list
15
20
  all = page.search('div.graphic_textbox_layout_style_default p').map(&:text)
16
21
 
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class NewBohemia < Establishment
4
- URL = 'http://www.newbohemiausa.com/bier/'
4
+ URL = 'http://www.newbohemiausa.com/bier/'
5
+ ADDRESS = '233 E Hennepin Ave, Minneapolis, MN 55414'
5
6
 
6
7
  def get_list
7
8
  base_list
@@ -12,6 +13,10 @@ module BeerList
12
13
  URL
13
14
  end
14
15
 
16
+ def address
17
+ ADDRESS
18
+ end
19
+
15
20
  private
16
21
 
17
22
  def base_list
@@ -0,0 +1,31 @@
1
+ module BeerList
2
+ module Establishments
3
+ class RedCow < Establishment
4
+ URL = 'http://redcowmn.com/beer'
5
+ ADDRESS = '3624 W 50th St, Minneapolis, MN 55410'
6
+
7
+ def get_list
8
+ base_list
9
+ match_before_paren
10
+ end
11
+
12
+ def url
13
+ URL
14
+ end
15
+
16
+ def address
17
+ ADDRESS
18
+ end
19
+
20
+ private
21
+
22
+ def base_list
23
+ @red_cow = page.search('.sqs-block-content li').map(&:text)
24
+ end
25
+
26
+ def match_before_paren
27
+ @red_cow = @red_cow.map { |b| b.match(/\(/) ? $`.strip : b.strip }
28
+ end
29
+ end
30
+ end
31
+ end
@@ -2,6 +2,7 @@ module BeerList
2
2
  module Establishments
3
3
  class StanleysBarRoom < Establishment
4
4
  URL = 'http://www.stanleysbarroom.com/drinks/beer-list/'
5
+ ADDRESS = '2500 University Ave NE, Minneapolis, MN 55418'
5
6
 
6
7
  def get_list
7
8
  base_list
@@ -12,6 +13,10 @@ module BeerList
12
13
  URL
13
14
  end
14
15
 
16
+ def address
17
+ ADDRESS
18
+ end
19
+
15
20
  private
16
21
 
17
22
  def base_list
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class ThreeSquares < Establishment
4
- URL = 'http://www.3squaresrestaurant.com/beer_taps.php'
4
+ URL = 'http://www.3squaresrestaurant.com/beer_taps.php'
5
+ ADDRESS = '12690 Arbor Lakes Pkwy N, Maple Grove, Minnesota 55369'
5
6
 
6
7
  def get_list
7
8
  page.at('ul').text.split("\r\n")
@@ -10,6 +11,10 @@ module BeerList
10
11
  def url
11
12
  URL
12
13
  end
14
+
15
+ def address
16
+ ADDRESS
17
+ end
13
18
  end
14
19
  end
15
20
  end
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class WashingtonSquare < Establishment
4
- URL = 'http://www.washingtonsquareonline.net/as_on-tap'
4
+ URL = 'http://www.washingtonsquareonline.net/as_on-tap'
5
+ ADDRESS = '4736 Washington Ave, St Paul, MN 55110'
5
6
 
6
7
  def get_list
7
8
  base_list
@@ -13,6 +14,10 @@ module BeerList
13
14
  URL
14
15
  end
15
16
 
17
+ def address
18
+ ADDRESS
19
+ end
20
+
16
21
  private
17
22
 
18
23
  def base_list
@@ -1,15 +1,15 @@
1
1
  module BeerList
2
2
  class List < Array
3
- attr_reader :establishment
3
+ attr_reader :listable
4
4
 
5
5
  def initialize(opts={})
6
- ary = opts[:array] || []
7
- @establishment = opts[:establishment]
6
+ ary = opts[:array] || []
7
+ @listable = opts[:listable]
8
8
  super ary.sort
9
9
  end
10
10
 
11
11
  def to_hash
12
- Hash[establishment, self.to_a]
12
+ { name: listable_name, address: listable.address, list: to_a }
13
13
  end
14
14
 
15
15
  alias :old_to_json :to_json
@@ -17,5 +17,9 @@ module BeerList
17
17
  def to_json
18
18
  to_hash.to_json
19
19
  end
20
+
21
+ def listable_name
22
+ listable.name
23
+ end
20
24
  end
21
25
  end
@@ -2,17 +2,16 @@ module BeerList
2
2
  module Listable
3
3
  attr_accessor :page
4
4
 
5
- def list
6
- visit_page unless page
7
- @list ||= BeerList::List.new establishment: short_class_name, array: get_list
8
- end
9
-
10
- def short_class_name
11
- raise NotImplementedError
5
+ # Templates
6
+ [:get_list, :url, :address, :name].each do |m|
7
+ define_method m do
8
+ nil
9
+ end
12
10
  end
13
11
 
14
- def get_list
15
- raise NotImplementedError
12
+ def list
13
+ visit_page unless page
14
+ @list ||= BeerList::List.new listable: self, array: get_list || []
16
15
  end
17
16
 
18
17
  private
@@ -21,7 +21,7 @@ module BeerList
21
21
  end
22
22
 
23
23
  def send_json(url, json)
24
- url = "http://#{url}" unless url.start_with? 'http://'
24
+ url = "http://#{url}" unless url.start_with? 'http'
25
25
  agent.post url, "{\"beer_list\": #{json}}", 'Content-Type' => 'application/json'
26
26
  true
27
27
  end
data/lib/beer_list.rb CHANGED
@@ -32,15 +32,6 @@ module BeerList
32
32
  settings.establishments_dir
33
33
  end
34
34
 
35
- ### DEPRECATED ###
36
- def establishments_dir=(directory)
37
- puts <<-dep
38
- BeerList.establishments_dir= is deprecated and will be removed.
39
- Please use BeerList.configure instead
40
- dep
41
- settings.establishments_dir = directory
42
- end
43
-
44
35
  def establishments
45
36
  return [] if @establishments.nil?
46
37
  @establishments.dup
@@ -67,20 +58,18 @@ module BeerList
67
58
  end
68
59
 
69
60
  def lists_as_hash
70
- lists.inject({}) do |hsh, list|
71
- hsh.merge! list.to_hash
72
- end
61
+ lists.map &:to_hash
73
62
  end
74
63
 
75
64
  def lists_as_json
76
- lists_as_hash.to_json
65
+ lists.map &:to_json
77
66
  end
78
67
 
79
68
  def send_list(list, url=nil)
80
69
  url ||= default_url
81
70
  raise NoUrlError unless url
82
71
  raise NotAListError unless list.is_a? BeerList::List
83
- scraper.send_json url, list.to_json
72
+ scraper.send_json url, [list.to_json]
84
73
  end
85
74
 
86
75
  def send_lists(url=nil)
@@ -104,8 +93,8 @@ module BeerList
104
93
  end
105
94
 
106
95
  def establishments_eq_lists?
107
- list_names = @lists.map(&:establishment)
108
- establishments.map(&:short_class_name).all? { |name| list_names.include? name }
96
+ list_names = @lists.map { |list| list.listable_name }
97
+ establishments.map(&:name).all? { |name| list_names.include? name }
109
98
  end
110
99
 
111
100
  def method_missing(method, *args, &block)
@@ -117,6 +106,16 @@ module BeerList
117
106
  end
118
107
  end
119
108
 
109
+ def respond_to_missing?(method, include_private=false)
110
+ class_name = method.to_s.split('_').map(&:capitalize).join
111
+ !!get_class_with_namespace(class_name) || super
112
+ end if RUBY_VERSION >= '1.9'
113
+
114
+ def respond_to?(method, include_private=false)
115
+ class_name = method.to_s.split('_').map(&:capitalize).join
116
+ !!get_class_with_namespace(class_name) || super
117
+ end if RUBY_VERSION < '1.9'
118
+
120
119
  def is_establishment?(class_name)
121
120
  BeerList::Establishments.constants.include? class_name.to_sym
122
121
  end
@@ -12,6 +12,7 @@ module BeerList
12
12
  @url = args[:url] || DEFAULT_URL
13
13
  @selector = args[:selector] || '.selector'
14
14
  @directory = args[:directory] || ESTABLISHMENTS_DIR
15
+ @address = args[:address] # Fallback to nil if not given
15
16
  write_file
16
17
  end
17
18
 
@@ -1,7 +1,8 @@
1
1
  module BeerList
2
2
  module Establishments
3
3
  class <%= @klass %> < Establishment
4
- URL = '<%= @url %>'
4
+ URL = '<%= @url %>'
5
+ ADDRESS = <%= @address.inspect %>
5
6
 
6
7
  # Handles parsing and manipulating a Mechanize::Page object
7
8
  # in order to scrape the contents of your beer list.
@@ -14,6 +15,10 @@ module BeerList
14
15
  def url
15
16
  URL
16
17
  end
18
+
19
+ def address
20
+ ADDRESS
21
+ end
17
22
  end
18
23
  end
19
24
  end
@@ -4,7 +4,7 @@ module BeerList
4
4
  module Establishments
5
5
 
6
6
  describe Establishment do
7
- let(:establishment){ BeerList::Establishments::MuddyWaters.new }
7
+ let(:establishment){ BeerList::Establishments::Establishment.new }
8
8
 
9
9
  describe '#list' do
10
10
  it 'returns a BeerList::List' do
@@ -16,21 +16,31 @@ module BeerList
16
16
 
17
17
  describe '#get_list' do
18
18
  context 'when it is not implemented in a subclass' do
19
- it 'raises an exception' do
20
- expect { establishment.get_list }.to raise_error
19
+ it 'returns nil' do
20
+ establishment.get_list.should be_nil
21
21
  end
22
22
  end
23
23
  end
24
24
 
25
25
  describe '#url' do
26
- it 'raises an exception unless it is implemented in a subclass' do
27
- expect { establishment.get_list }.to raise_error
26
+ context 'when it is not implemented in a subclass' do
27
+ it 'returns nil' do
28
+ establishment.url.should be_nil
29
+ end
30
+ end
31
+ end
32
+
33
+ describe '#address' do
34
+ context 'when it is not implemented in a subclass' do
35
+ it 'returns nil' do
36
+ establishment.address.should be_nil
37
+ end
28
38
  end
29
39
  end
30
40
 
31
- describe '#short_class_name' do
41
+ describe '#name' do
32
42
  it 'returns a usable name' do
33
- establishment.short_class_name.should == 'MuddyWaters'
43
+ establishment.name.should == 'Establishment'
34
44
  end
35
45
  end
36
46
  end
@@ -2,29 +2,29 @@ require 'spec_helper'
2
2
 
3
3
  module BeerList
4
4
  describe List do
5
- let(:est_name){ 'MuddyWaters' }
6
- let(:list){ List.new array: [], establishment: est_name }
5
+ let(:listable){ stub('listable', name: 'Applebirds', address: '123 Fake St') }
6
+ let(:list){ List.new array: ['item'], listable: listable }
7
7
 
8
- it 'knows its establishent' do
9
- list.establishment.should == est_name
8
+ it 'knows its listable' do
9
+ list.listable.should == listable
10
10
  end
11
11
 
12
12
  describe '#to_hash' do
13
- it 'hashes its establishment name with its content' do
14
- expected = { est_name => [] }
13
+ it 'hashes its listable info with its list' do
14
+ expected = { name: 'Applebirds', address: '123 Fake St', list: ['item']}
15
15
  list.to_hash.should == expected
16
16
  end
17
17
  end
18
18
 
19
19
  describe '#to_json' do
20
20
  it 'returns the list as json' do
21
- expected = "{\"MuddyWaters\":[]}"
21
+ expected = "{\"name\":\"Applebirds\",\"address\":\"123 Fake St\",\"list\":[\"item\"]}"
22
22
  list.to_json.should == expected
23
23
  end
24
24
  end
25
25
 
26
26
  context 'when array is nil (the establishment has yet to implement #get_list)' do
27
- let(:list){ List.new array: nil, establishment: est_name }
27
+ let(:list){ List.new array: nil, listable: listable }
28
28
 
29
29
  it { list.should be_empty }
30
30
  end
@@ -2,6 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  describe BeerList do
4
4
  let(:establishment){ BeerList::Establishments::ThreeSquares.new }
5
+ let(:scraper){ stub }
5
6
 
6
7
  describe '.configure' do
7
8
  before do
@@ -21,11 +22,6 @@ describe BeerList do
21
22
  end
22
23
 
23
24
  describe '.establishments' do
24
-
25
- after(:each) do
26
- BeerList.clear_establishments!
27
- end
28
-
29
25
  it 'returns an array' do
30
26
  BeerList.establishments.should be_an_instance_of Array
31
27
  end
@@ -91,17 +87,13 @@ describe BeerList do
91
87
  end
92
88
 
93
89
  context 'when establishments are registered' do
94
- before(:all) do
95
- BeerList.add_establishments establishment
96
- end
97
-
98
- after(:all) do
99
- BeerList.clear_establishments!
100
- end
90
+ let(:list){ BeerList::List.new listable: establishment, array: [] }
101
91
 
102
92
  before do
103
- establishment.stub(:visit_page)
104
- establishment.stub(:get_list){ ['Darkness', 'Pliney the Elder'] }
93
+ BeerList.stub(:establishments){ [establishment] }
94
+ BeerList.stub(:update_necessary?){ true }
95
+ BeerList.stub(:scraper){ scraper }
96
+ scraper.should_receive(:beer_list).with(establishment){ list }
105
97
  end
106
98
 
107
99
  it 'returns an array of lists' do
@@ -109,28 +101,28 @@ describe BeerList do
109
101
  end
110
102
 
111
103
  it 'contains lists for the registered establishments' do
112
- BeerList.lists.first.establishment.should == 'ThreeSquares'
104
+ BeerList.lists.first.listable.should == establishment
113
105
  end
114
106
 
115
107
  describe '.lists_as_hash' do
116
- it 'returns a hash' do
117
- BeerList.lists_as_hash.should be_an_instance_of Hash
108
+ it 'returns an array of hashes' do
109
+ BeerList.lists_as_hash.all? { |l| l.is_a? Hash }.should be_true
118
110
  end
119
111
  end
120
112
 
121
113
  describe '.lists_as_json' do
122
- it 'returns JSON' do
123
- expect { JSON.parse(BeerList.lists_as_json) }.to_not raise_error
114
+ it 'returns an array of valid JSON' do
115
+ expect { BeerList.lists_as_json.each { |j| JSON.parse(j) } }.to_not raise_error
124
116
  end
125
117
  end
126
118
  end
127
119
  end
128
120
 
129
121
  describe 'sending lists' do
130
- let(:scraper){ stub }
131
122
  let(:url){ 'http://omg.io' }
132
123
  let(:json){ "{\"foo\":\"bar\"}" }
133
124
  let(:list){ BeerList::List.new }
125
+ let(:expected){ [url, [json]] }
134
126
 
135
127
  before do
136
128
  BeerList.stub(:scraper).and_return scraper
@@ -139,7 +131,7 @@ describe BeerList do
139
131
 
140
132
  describe '.send_list' do
141
133
  it 'delegates to the scraper' do
142
- scraper.should_receive(:send_json).with(url, json)
134
+ scraper.should_receive(:send_json).with *expected
143
135
  BeerList.send_list list, url
144
136
  end
145
137
  end
@@ -151,7 +143,7 @@ describe BeerList do
151
143
  end
152
144
 
153
145
  it 'delegates to the scraper' do
154
- scraper.should_receive(:send_json).with(url, json)
146
+ scraper.should_receive(:send_json).with *expected
155
147
  BeerList.send_lists url
156
148
  end
157
149
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: beer_list
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
5
- prerelease:
4
+ version: 2.0.0.rc1
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Dan Olson
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-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: mechanize
@@ -106,6 +106,7 @@ files:
106
106
  - lib/beer_list/establishments/ginger_hop.rb
107
107
  - lib/beer_list/establishments/groveland_tap.rb
108
108
  - lib/beer_list/establishments/happy_gnome.rb
109
+ - lib/beer_list/establishments/icehouse.rb
109
110
  - lib/beer_list/establishments/longfellow_grill.rb
110
111
  - lib/beer_list/establishments/lowry_uptown.rb
111
112
  - lib/beer_list/establishments/mackenzie_pub.rb
@@ -114,6 +115,7 @@ files:
114
115
  - lib/beer_list/establishments/muddy_pig.rb
115
116
  - lib/beer_list/establishments/muddy_waters.rb
116
117
  - lib/beer_list/establishments/new_bohemia.rb
118
+ - lib/beer_list/establishments/red_cow.rb
117
119
  - lib/beer_list/establishments/stanleys_bar_room.rb
118
120
  - lib/beer_list/establishments/three_squares.rb
119
121
  - lib/beer_list/establishments/washington_square.rb
@@ -147,9 +149,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
147
149
  required_rubygems_version: !ruby/object:Gem::Requirement
148
150
  none: false
149
151
  requirements:
150
- - - ! '>='
152
+ - - ! '>'
151
153
  - !ruby/object:Gem::Version
152
- version: '0'
154
+ version: 1.3.1
153
155
  requirements: []
154
156
  rubyforge_project:
155
157
  rubygems_version: 1.8.24