beer_list 1.0.0 → 1.1.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/Gemfile.lock +3 -3
- data/README.md +59 -11
- data/beer_list.gemspec +1 -1
- data/lib/beer_list.rb +44 -4
- data/lib/beer_list/cli.rb +33 -4
- data/lib/beer_list/establishments/blue_door_pub.rb +15 -0
- data/lib/beer_list/establishments/ginger_hop.rb +15 -0
- data/lib/beer_list/establishments/mc_coys_mn.rb +36 -0
- data/lib/beer_list/exceptions.rb +14 -0
- data/lib/beer_list/scraper.rb +12 -2
- data/lib/beer_list/settings.rb +5 -0
- data/spec/lib/beer_list/scraper_spec.rb +62 -0
- data/spec/lib/beer_list_spec.rb +47 -0
- metadata +8 -2
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: .
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                beer_list ( | 
| 4 | 
            +
                beer_list (1.1.0)
         | 
| 5 5 | 
             
                  mechanize (~> 2.6.0)
         | 
| 6 6 | 
             
                  thor (~> 0.18.1)
         | 
| 7 7 |  | 
| 8 8 | 
             
            GEM
         | 
| 9 9 | 
             
              specs:
         | 
| 10 10 | 
             
                diff-lcs (1.1.3)
         | 
| 11 | 
            -
                domain_name (0.5. | 
| 11 | 
            +
                domain_name (0.5.11)
         | 
| 12 12 | 
             
                  unf (>= 0.0.5, < 1.0.0)
         | 
| 13 13 | 
             
                mechanize (2.6.0)
         | 
| 14 14 | 
             
                  domain_name (~> 0.5, >= 0.5.1)
         | 
| @@ -18,7 +18,7 @@ GEM | |
| 18 18 | 
             
                  nokogiri (~> 1.4)
         | 
| 19 19 | 
             
                  ntlm-http (~> 0.1, >= 0.1.1)
         | 
| 20 20 | 
             
                  webrobots (>= 0.0.9, < 0.2)
         | 
| 21 | 
            -
                mime-types (1. | 
| 21 | 
            +
                mime-types (1.23)
         | 
| 22 22 | 
             
                net-http-digest_auth (1.3)
         | 
| 23 23 | 
             
                net-http-persistent (2.8)
         | 
| 24 24 | 
             
                nokogiri (1.5.9)
         | 
    
        data/README.md
    CHANGED
    
    | @@ -4,6 +4,8 @@ A utility for retrieving the beer list from various establishments | |
| 4 4 |  | 
| 5 5 | 
             
            ## Usage
         | 
| 6 6 |  | 
| 7 | 
            +
            ### Installation
         | 
| 8 | 
            +
             | 
| 7 9 | 
             
            `gem install beer_list`
         | 
| 8 10 |  | 
| 9 11 | 
             
            or in your gemfile:
         | 
| @@ -18,7 +20,7 @@ then require the gem: | |
| 18 20 |  | 
| 19 21 | 
             
            See what's on tap:
         | 
| 20 22 |  | 
| 21 | 
            -
            ```
         | 
| 23 | 
            +
            ```ruby
         | 
| 22 24 | 
             
            # An array-like object
         | 
| 23 25 | 
             
            list = BeerList.groveland_tap
         | 
| 24 26 |  | 
| @@ -38,7 +40,7 @@ but its easy to [extend BeerList](#extending-beerlist-with-more-establishments) | |
| 38 40 |  | 
| 39 41 | 
             
            First, let's try one out of the box:
         | 
| 40 42 |  | 
| 41 | 
            -
            ```
         | 
| 43 | 
            +
            ```ruby
         | 
| 42 44 | 
             
            bulldog_northeast = BeerList::Establishments::BulldogNortheast.new
         | 
| 43 45 |  | 
| 44 46 | 
             
            # Now get the list
         | 
| @@ -48,7 +50,7 @@ bulldog_northeast.list | |
| 48 50 | 
             
            You may want to get lists for more than one establishment at a time. To do so, register
         | 
| 49 51 | 
             
            the desired establishments in BeerList.establishments:
         | 
| 50 52 |  | 
| 51 | 
            -
            ```
         | 
| 53 | 
            +
            ```ruby
         | 
| 52 54 | 
             
            three_squares = BeerList::Establishments::ThreeSquares.new
         | 
| 53 55 | 
             
            muddy_waters  = BeerList::Establishments::MuddyWaters.new
         | 
| 54 56 |  | 
| @@ -82,7 +84,7 @@ For example: | |
| 82 84 |  | 
| 83 85 | 
             
            will create the following code in path/to/establishments/applebirds.rb
         | 
| 84 86 |  | 
| 85 | 
            -
            ```
         | 
| 87 | 
            +
            ```ruby
         | 
| 86 88 | 
             
            module BeerList
         | 
| 87 89 | 
             
              module Establishments
         | 
| 88 90 | 
             
                class Applebirds < Establishment
         | 
| @@ -107,7 +109,7 @@ end | |
| 107 109 |  | 
| 108 110 | 
             
            For all options you can pass to beer_list establish, run:
         | 
| 109 111 |  | 
| 110 | 
            -
            `$ beer_list help`
         | 
| 112 | 
            +
            `$ beer_list help establish`
         | 
| 111 113 |  | 
| 112 114 | 
             
            ### Using Your Generated Establishments
         | 
| 113 115 |  | 
| @@ -116,10 +118,15 @@ use the fruit of your labor in a real application. You'll need to tell BeerList | |
| 116 118 | 
             
            about the generated files so that it can require them. If you're using Rails, add
         | 
| 117 119 | 
             
            the following code in an initializer:
         | 
| 118 120 |  | 
| 119 | 
            -
             | 
| 121 | 
            +
            ```ruby
         | 
| 122 | 
            +
            BeerList.configure do |c|
         | 
| 123 | 
            +
              c.establishments_dir = File.join(Rails.root, 'path/to/establishments')
         | 
| 124 | 
            +
            end
         | 
| 125 | 
            +
            ```
         | 
| 120 126 |  | 
| 127 | 
            +
            Then in your app:
         | 
| 121 128 |  | 
| 122 | 
            -
            ```
         | 
| 129 | 
            +
            ```ruby
         | 
| 123 130 | 
             
            # Fetch just the list at Applebirds
         | 
| 124 131 | 
             
            BeerList.applebirds
         | 
| 125 132 |  | 
| @@ -137,12 +144,45 @@ AND... | |
| 137 144 |  | 
| 138 145 | 
             
            Checkout [This link](http://mechanize.rubyforge.org/) for more on Mechanize
         | 
| 139 146 |  | 
| 147 | 
            +
            ### Sending Lists
         | 
| 148 | 
            +
             | 
| 149 | 
            +
            Once you have lists, you can use them locally (obviously), or you can send them elsewhere.
         | 
| 150 | 
            +
            Configure BeerList with a default URL like this:
         | 
| 151 | 
            +
             | 
| 152 | 
            +
            ```ruby
         | 
| 153 | 
            +
            BeerList.configure do |c|
         | 
| 154 | 
            +
              c.default_url = 'https://yourapp.com/some_sweet_beer_route'
         | 
| 155 | 
            +
            end
         | 
| 156 | 
            +
            ```
         | 
| 157 | 
            +
             | 
| 158 | 
            +
            Then in your code, send a list!
         | 
| 159 | 
            +
             | 
| 160 | 
            +
            ```ruby
         | 
| 161 | 
            +
            applebirds = BeerList.applebirds
         | 
| 162 | 
            +
             | 
| 163 | 
            +
            # POSTs your list to your default_url as JSON under the "beer_list" name
         | 
| 164 | 
            +
            BeerList.send_list(applebirds)
         | 
| 165 | 
            +
             | 
| 166 | 
            +
            # You can also give it an explicit URL
         | 
| 167 | 
            +
            other_route = 'http://myotherapp.com/another_beer_route'
         | 
| 168 | 
            +
            BeerList.send_list(applebirds, other_route)
         | 
| 169 | 
            +
             | 
| 170 | 
            +
            # Register some lists and send 'em all at once:
         | 
| 171 | 
            +
            thursdays = BeerList::Establishments::Thursdays.new
         | 
| 172 | 
            +
             | 
| 173 | 
            +
            BeerList.add_establishments(applebirds, thursdays)
         | 
| 174 | 
            +
            BeerList.send_lists
         | 
| 175 | 
            +
            ```
         | 
| 176 | 
            +
             | 
| 177 | 
            +
            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.
         | 
| 179 | 
            +
             | 
| 140 180 | 
             
            ### Leads
         | 
| 141 181 |  | 
| 142 182 | 
             
            If you're out of ideas on what establishments you may want lists for, fear not: BeerList can
         | 
| 143 183 | 
             
            give you some ideas.
         | 
| 144 184 |  | 
| 145 | 
            -
            ```
         | 
| 185 | 
            +
            ```ruby
         | 
| 146 186 | 
             
            # You might be interested in good beer bars located in California:
         | 
| 147 187 | 
             
            cali = BeerList::Leads::CA.new
         | 
| 148 188 |  | 
| @@ -163,12 +203,14 @@ it in the not-too-distant future. | |
| 163 203 | 
             
            ### CLI
         | 
| 164 204 |  | 
| 165 205 | 
             
            In addition to the [establish](#extending-beerlist-with-more-establishments) command, which
         | 
| 166 | 
            -
            generates Establishment files for you, BeerList also offers  | 
| 206 | 
            +
            generates Establishment files for you, BeerList also offers a few other commands:
         | 
| 207 | 
            +
             | 
| 208 | 
            +
            There's the `list` command. For example,
         | 
| 167 209 | 
             
            say you have the following two establishments a directory called ~/my_beer_lists:
         | 
| 168 210 |  | 
| 169 211 | 
             
            ```
         | 
| 170 | 
            -
             | 
| 171 | 
            -
             | 
| 212 | 
            +
            applebirds.rb
         | 
| 213 | 
            +
            thursdays.rb
         | 
| 172 214 | 
             
            ```
         | 
| 173 215 |  | 
| 174 216 | 
             
            You can get the beer lists for these places from the command line:
         | 
| @@ -182,3 +224,9 @@ $ beer_list list applebirds thursdays -d ~/my_beer_lists | |
| 182 224 | 
             
            # pass -j for JSON
         | 
| 183 225 | 
             
            $ beer_list list applebirds thursdays -j -d ~/my_beer_lists
         | 
| 184 226 | 
             
            ```
         | 
| 227 | 
            +
             | 
| 228 | 
            +
            There's also the `send` command for [sending your lists](#sending-lists) to a given URL:
         | 
| 229 | 
            +
             | 
| 230 | 
            +
            `$ beer_list send applebirds thursdays -u 'http://mybeerapiendpoint.com/beer_list'`
         | 
| 231 | 
            +
             | 
| 232 | 
            +
            See `$ beer_list help` for all commands
         | 
    
        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. | 
| 3 | 
            +
              spec.version       = '1.1.0'
         | 
| 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.rb
    CHANGED
    
    | @@ -2,6 +2,7 @@ require 'mechanize' | |
| 2 2 | 
             
            require 'json'
         | 
| 3 3 |  | 
| 4 4 | 
             
            module BeerList
         | 
| 5 | 
            +
              require 'beer_list/settings'
         | 
| 5 6 | 
             
              require 'beer_list/scraper'
         | 
| 6 7 | 
             
              require 'beer_list/list'
         | 
| 7 8 | 
             
              require 'beer_list/exceptions'
         | 
| @@ -14,12 +15,30 @@ module BeerList | |
| 14 15 |  | 
| 15 16 | 
             
              class << self
         | 
| 16 17 |  | 
| 18 | 
            +
                def configure
         | 
| 19 | 
            +
                  yield settings
         | 
| 20 | 
            +
                  true
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                def settings
         | 
| 24 | 
            +
                  @settings ||= Settings.new
         | 
| 25 | 
            +
                end
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                def default_url
         | 
| 28 | 
            +
                  settings.default_url
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 17 31 | 
             
                def establishments_dir
         | 
| 18 | 
            -
                   | 
| 32 | 
            +
                  settings.establishments_dir
         | 
| 19 33 | 
             
                end
         | 
| 20 34 |  | 
| 35 | 
            +
                ### DEPRECATED ###
         | 
| 21 36 | 
             
                def establishments_dir=(directory)
         | 
| 22 | 
            -
                   | 
| 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
         | 
| 23 42 | 
             
                end
         | 
| 24 43 |  | 
| 25 44 | 
             
                def establishments
         | 
| @@ -57,6 +76,19 @@ module BeerList | |
| 57 76 | 
             
                  lists_as_hash.to_json
         | 
| 58 77 | 
             
                end
         | 
| 59 78 |  | 
| 79 | 
            +
                def send_list(list, url=nil)
         | 
| 80 | 
            +
                  url ||= default_url
         | 
| 81 | 
            +
                  raise NoUrlError unless url
         | 
| 82 | 
            +
                  raise NotAListError unless list.is_a? BeerList::List
         | 
| 83 | 
            +
                  scraper.send_json url, list.to_json
         | 
| 84 | 
            +
                end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                def send_lists(url=nil)
         | 
| 87 | 
            +
                  url ||= default_url
         | 
| 88 | 
            +
                  raise NoUrlError unless url
         | 
| 89 | 
            +
                  scraper.send_json url, lists_as_json
         | 
| 90 | 
            +
                end
         | 
| 91 | 
            +
             | 
| 60 92 | 
             
                def scraper
         | 
| 61 93 | 
             
                  @scraper ||= Scraper.instance
         | 
| 62 94 | 
             
                end
         | 
| @@ -78,11 +110,19 @@ module BeerList | |
| 78 110 |  | 
| 79 111 | 
             
                def method_missing(method, *args, &block)
         | 
| 80 112 | 
             
                  class_name = method.to_s.split('_').map(&:capitalize).join
         | 
| 81 | 
            -
                  klass = get_class_with_namespace | 
| 82 | 
            -
             | 
| 113 | 
            +
                  if klass = get_class_with_namespace(class_name)
         | 
| 114 | 
            +
                    scraper.beer_list klass.new
         | 
| 115 | 
            +
                  else
         | 
| 116 | 
            +
                    super
         | 
| 117 | 
            +
                  end
         | 
| 118 | 
            +
                end
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                def is_establishment?(class_name)
         | 
| 121 | 
            +
                  BeerList::Establishments.constants.include? class_name.to_sym
         | 
| 83 122 | 
             
                end
         | 
| 84 123 |  | 
| 85 124 | 
             
                def get_class_with_namespace(class_name)
         | 
| 125 | 
            +
                  return nil unless is_establishment? class_name
         | 
| 86 126 | 
             
                  ['BeerList', 'Establishments', class_name].inject(Object){ |o, name| o.const_get(name) }
         | 
| 87 127 | 
             
                end
         | 
| 88 128 | 
             
              end
         | 
    
        data/lib/beer_list/cli.rb
    CHANGED
    
    | @@ -11,7 +11,7 @@ module BeerList | |
| 11 11 | 
             
                       banner:   'The directory in which BeerList will put your establishments'
         | 
| 12 12 | 
             
                option :selector,
         | 
| 13 13 | 
             
                       aliases: '-s',
         | 
| 14 | 
            -
                       banner: | 
| 14 | 
            +
                       banner:  'Optional selector to use for scraping'
         | 
| 15 15 |  | 
| 16 16 | 
             
                desc 'establish ESTABLISHMENT', 'Generate a subclass of BeerList::Establishments::Establishment in the given directory'
         | 
| 17 17 | 
             
                def establish(klass)
         | 
| @@ -30,8 +30,8 @@ module BeerList | |
| 30 30 |  | 
| 31 31 | 
             
                desc 'list ESTABLISHMENTS', 'Retrieve the beer list at the given establishments'
         | 
| 32 32 | 
             
                def list(*establishments)
         | 
| 33 | 
            -
                   | 
| 34 | 
            -
                   | 
| 33 | 
            +
                  configure
         | 
| 34 | 
            +
                  add_establishments establishments
         | 
| 35 35 | 
             
                  if options[:json]
         | 
| 36 36 | 
             
                    puts BeerList.lists_as_json
         | 
| 37 37 | 
             
                  else
         | 
| @@ -46,13 +46,42 @@ module BeerList | |
| 46 46 | 
             
                  end
         | 
| 47 47 | 
             
                end
         | 
| 48 48 |  | 
| 49 | 
            +
                option :url,
         | 
| 50 | 
            +
                       aliases:  '-u',
         | 
| 51 | 
            +
                       required: true,
         | 
| 52 | 
            +
                       banner:   'the URL to which to post your lists'
         | 
| 53 | 
            +
                desc 'send ESTABLISHMENTS', 'Send (POST) the lists (as JSON) for the given establishments to the given URL'
         | 
| 54 | 
            +
                def send(*establishments)
         | 
| 55 | 
            +
                  configure
         | 
| 56 | 
            +
                  add_establishments establishments
         | 
| 57 | 
            +
                  puts "Sent!" if BeerList.send_lists
         | 
| 58 | 
            +
                end
         | 
| 59 | 
            +
             | 
| 49 60 | 
             
                private
         | 
| 50 61 |  | 
| 62 | 
            +
                def add_establishments(establishments)
         | 
| 63 | 
            +
                  BeerList.add_establishments *classify(establishments)
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                def configure
         | 
| 67 | 
            +
                  BeerList.configure do |c|
         | 
| 68 | 
            +
                    c.establishments_dir = options[:directory]
         | 
| 69 | 
            +
                    c.default_url        = options[:url]
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
             | 
| 51 73 | 
             
                def classify(establishments)
         | 
| 52 74 | 
             
                  establishments.map do |est|
         | 
| 53 75 | 
             
                    class_name = est.to_s.split('_').map(&:capitalize).join
         | 
| 54 | 
            -
                     | 
| 76 | 
            +
                    instantiate_or_die class_name
         | 
| 77 | 
            +
                  end
         | 
| 78 | 
            +
                end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                def instantiate_or_die(class_name)
         | 
| 81 | 
            +
                  if klass = BeerList.send(:get_class_with_namespace, class_name)
         | 
| 55 82 | 
             
                    klass.new
         | 
| 83 | 
            +
                  else
         | 
| 84 | 
            +
                    abort "#{class_name} is not recognized. Is it in your BeerList.establishments_dir?"
         | 
| 56 85 | 
             
                  end
         | 
| 57 86 | 
             
                end
         | 
| 58 87 | 
             
              end
         | 
| @@ -0,0 +1,36 @@ | |
| 1 | 
            +
            module BeerList
         | 
| 2 | 
            +
              module Establishments
         | 
| 3 | 
            +
                class McCoysMN < Establishment
         | 
| 4 | 
            +
                  attr_accessor :url
         | 
| 5 | 
            +
             | 
| 6 | 
            +
                  DRAFTS  = 'http://mccoysmn.com/beer/'
         | 
| 7 | 
            +
                  BOTTLES = 'http://mccoysmn.com/beer/bottles'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                  def initialize
         | 
| 10 | 
            +
                    @url = DRAFTS
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                  def get_list
         | 
| 14 | 
            +
                    @beers = []
         | 
| 15 | 
            +
                    get_draft_list
         | 
| 16 | 
            +
                    get_bottle_list
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  private
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  def get_draft_list
         | 
| 22 | 
            +
                    @beers += base_list
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  def get_bottle_list
         | 
| 26 | 
            +
                    self.url  = BOTTLES
         | 
| 27 | 
            +
                    self.page = BeerList.scraper.visit self
         | 
| 28 | 
            +
                    @beers   += base_list
         | 
| 29 | 
            +
                  end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                  def base_list
         | 
| 32 | 
            +
                    page.search('td.title a').map(&:text)
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
            end
         | 
    
        data/lib/beer_list/exceptions.rb
    CHANGED
    
    | @@ -6,4 +6,18 @@ module BeerList | |
| 6 6 | 
             
                  super msg
         | 
| 7 7 | 
             
                end
         | 
| 8 8 | 
             
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              class NoUrlError < StandardError
         | 
| 11 | 
            +
                def initialize(msg=nil)
         | 
| 12 | 
            +
                  msg ||= "No url was specified and no default_url exists"
         | 
| 13 | 
            +
                  super msg
         | 
| 14 | 
            +
                end
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              class NotAListError < StandardError
         | 
| 18 | 
            +
                def initialize(msg=nil)
         | 
| 19 | 
            +
                  msg ||= "That object was not a BeerList::List"
         | 
| 20 | 
            +
                  super msg
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 9 23 | 
             
            end
         | 
    
        data/lib/beer_list/scraper.rb
    CHANGED
    
    | @@ -17,13 +17,23 @@ module BeerList | |
| 17 17 | 
             
                end
         | 
| 18 18 |  | 
| 19 19 | 
             
                def visit(visitable)
         | 
| 20 | 
            -
                  visitable.page =  | 
| 20 | 
            +
                  visitable.page = agent.get(visitable.url)
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                def send_json(url, json)
         | 
| 24 | 
            +
                  url = "http://#{url}" unless url.start_with? 'http://'
         | 
| 25 | 
            +
                  agent.post url, "{\"beer_list\": #{json}}", 'Content-Type' => 'application/json'
         | 
| 26 | 
            +
                  true
         | 
| 21 27 | 
             
                end
         | 
| 22 28 |  | 
| 23 29 | 
             
                private
         | 
| 24 30 |  | 
| 25 31 | 
             
                def set_user_agent
         | 
| 26 | 
            -
                   | 
| 32 | 
            +
                  agent.user_agent_alias = USER_AGENT
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                def agent
         | 
| 36 | 
            +
                  @agent
         | 
| 27 37 | 
             
                end
         | 
| 28 38 | 
             
              end
         | 
| 29 39 | 
             
            end
         | 
| @@ -0,0 +1,62 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module BeerList
         | 
| 4 | 
            +
              describe Scraper do
         | 
| 5 | 
            +
                let(:establishment){ BeerList::Establishments::Establishment.new }
         | 
| 6 | 
            +
                let(:scraper){ Scraper.instance }
         | 
| 7 | 
            +
                let(:agent){ stub }
         | 
| 8 | 
            +
                let(:url){ "http://omg.io" }
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                before do
         | 
| 11 | 
            +
                  scraper.stub(:agent){ agent }
         | 
| 12 | 
            +
                  agent.stub(:user_agent_alias=)
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                describe '#send_json' do
         | 
| 16 | 
            +
                  let(:json){ "{\"foo\":\"bar\"}" }
         | 
| 17 | 
            +
                  let(:headers){ { 'Content-Type' => 'application/json' } }
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  it 'posts to the given url with namespaced parameters' do
         | 
| 20 | 
            +
                    expected_json = "{\"beer_list\": #{json}}"
         | 
| 21 | 
            +
                    agent.should_receive(:post).with url, expected_json, headers
         | 
| 22 | 
            +
                    scraper.send_json url, json
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                  it 'prepends a scheme if one is not given' do
         | 
| 26 | 
            +
                    expected_json = "{\"beer_list\": #{json}}"
         | 
| 27 | 
            +
                    no_scheme_url = 'www.foobar.com'
         | 
| 28 | 
            +
                    agent.should_receive(:post).with "http://#{no_scheme_url}", expected_json, headers
         | 
| 29 | 
            +
                    scraper.send_json no_scheme_url, json
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
                end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                describe '#beer_list' do
         | 
| 34 | 
            +
                  before do
         | 
| 35 | 
            +
                    scraper.should_receive(:visit).with establishment
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  it "calls the establishment's #list method" do
         | 
| 39 | 
            +
                    establishment.should_receive :list
         | 
| 40 | 
            +
                    scraper.beer_list establishment
         | 
| 41 | 
            +
                  end
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                describe '#visit' do
         | 
| 45 | 
            +
                  before do
         | 
| 46 | 
            +
                    establishment.stub(:url){ url }
         | 
| 47 | 
            +
                    establishment.stub(:list)
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  it "visits the establishment's url" do
         | 
| 51 | 
            +
                    agent.should_receive(:get).with(url){ 'the page' }
         | 
| 52 | 
            +
                    scraper.beer_list establishment
         | 
| 53 | 
            +
                  end
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                  it "assigns to establishment.page" do
         | 
| 56 | 
            +
                    agent.stub(:get){ 'the page' }
         | 
| 57 | 
            +
                    establishment.should_receive(:page=).with 'the page'
         | 
| 58 | 
            +
                    scraper.beer_list establishment
         | 
| 59 | 
            +
                  end
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
              end
         | 
| 62 | 
            +
            end
         | 
    
        data/spec/lib/beer_list_spec.rb
    CHANGED
    
    | @@ -3,6 +3,23 @@ require 'spec_helper' | |
| 3 3 | 
             
            describe BeerList do
         | 
| 4 4 | 
             
              let(:establishment){ BeerList::Establishments::ThreeSquares.new }
         | 
| 5 5 |  | 
| 6 | 
            +
              describe '.configure' do
         | 
| 7 | 
            +
                before do
         | 
| 8 | 
            +
                  BeerList.configure do |c|
         | 
| 9 | 
            +
                    c.establishments_dir = '/home/foo'
         | 
| 10 | 
            +
                    c.default_url        = 'http://omg.io'
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                it 'stores the establishments_dir' do
         | 
| 15 | 
            +
                  BeerList.establishments_dir.should == '/home/foo'
         | 
| 16 | 
            +
                end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                it 'stores the default_url' do
         | 
| 19 | 
            +
                  BeerList.default_url.should == 'http://omg.io'
         | 
| 20 | 
            +
                end
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
             | 
| 6 23 | 
             
              describe '.establishments' do
         | 
| 7 24 |  | 
| 8 25 | 
             
                after(:each) do
         | 
| @@ -109,4 +126,34 @@ describe BeerList do | |
| 109 126 | 
             
                end
         | 
| 110 127 | 
             
              end
         | 
| 111 128 |  | 
| 129 | 
            +
              describe 'sending lists' do
         | 
| 130 | 
            +
                let(:scraper){ stub }
         | 
| 131 | 
            +
                let(:url){ 'http://omg.io' }
         | 
| 132 | 
            +
                let(:json){ "{\"foo\":\"bar\"}" }
         | 
| 133 | 
            +
                let(:list){ BeerList::List.new }
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                before do
         | 
| 136 | 
            +
                  BeerList.stub(:scraper).and_return scraper
         | 
| 137 | 
            +
                  list.stub(:to_json).and_return json
         | 
| 138 | 
            +
                end
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                describe '.send_list' do
         | 
| 141 | 
            +
                  it 'delegates to the scraper' do
         | 
| 142 | 
            +
                    scraper.should_receive(:send_json).with(url, json)
         | 
| 143 | 
            +
                    BeerList.send_list list, url
         | 
| 144 | 
            +
                  end
         | 
| 145 | 
            +
                end
         | 
| 146 | 
            +
             | 
| 147 | 
            +
                describe '.send_lists' do
         | 
| 148 | 
            +
                  before do
         | 
| 149 | 
            +
                    BeerList.stub(:lists).and_return [list]
         | 
| 150 | 
            +
                    list.stub(:to_hash).and_return({ foo: 'bar' })
         | 
| 151 | 
            +
                  end
         | 
| 152 | 
            +
             | 
| 153 | 
            +
                  it 'delegates to the scraper' do
         | 
| 154 | 
            +
                    scraper.should_receive(:send_json).with(url, json)
         | 
| 155 | 
            +
                    BeerList.send_lists url
         | 
| 156 | 
            +
                  end
         | 
| 157 | 
            +
                end
         | 
| 158 | 
            +
              end
         | 
| 112 159 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: beer_list
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.1.0
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,7 +9,7 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2013-05- | 
| 12 | 
            +
            date: 2013-05-20 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: mechanize
         | 
| @@ -95,6 +95,7 @@ files: | |
| 95 95 | 
             
            - lib/beer_list/cli.rb
         | 
| 96 96 | 
             
            - lib/beer_list/establishments.rb
         | 
| 97 97 | 
             
            - lib/beer_list/establishments/acadia_cafe.rb
         | 
| 98 | 
            +
            - lib/beer_list/establishments/blue_door_pub.rb
         | 
| 98 99 | 
             
            - lib/beer_list/establishments/blue_nile.rb
         | 
| 99 100 | 
             
            - lib/beer_list/establishments/bulldog_lowertown.rb
         | 
| 100 101 | 
             
            - lib/beer_list/establishments/bulldog_northeast.rb
         | 
| @@ -102,12 +103,14 @@ files: | |
| 102 103 | 
             
            - lib/beer_list/establishments/busters_on28th.rb
         | 
| 103 104 | 
             
            - lib/beer_list/establishments/edina_grill.rb
         | 
| 104 105 | 
             
            - lib/beer_list/establishments/establishment.rb
         | 
| 106 | 
            +
            - lib/beer_list/establishments/ginger_hop.rb
         | 
| 105 107 | 
             
            - lib/beer_list/establishments/groveland_tap.rb
         | 
| 106 108 | 
             
            - lib/beer_list/establishments/happy_gnome.rb
         | 
| 107 109 | 
             
            - lib/beer_list/establishments/longfellow_grill.rb
         | 
| 108 110 | 
             
            - lib/beer_list/establishments/lowry_uptown.rb
         | 
| 109 111 | 
             
            - lib/beer_list/establishments/mackenzie_pub.rb
         | 
| 110 112 | 
             
            - lib/beer_list/establishments/macs_industrial.rb
         | 
| 113 | 
            +
            - lib/beer_list/establishments/mc_coys_mn.rb
         | 
| 111 114 | 
             
            - lib/beer_list/establishments/muddy_pig.rb
         | 
| 112 115 | 
             
            - lib/beer_list/establishments/muddy_waters.rb
         | 
| 113 116 | 
             
            - lib/beer_list/establishments/new_bohemia.rb
         | 
| @@ -119,11 +122,13 @@ files: | |
| 119 122 | 
             
            - lib/beer_list/list.rb
         | 
| 120 123 | 
             
            - lib/beer_list/listable.rb
         | 
| 121 124 | 
             
            - lib/beer_list/scraper.rb
         | 
| 125 | 
            +
            - lib/beer_list/settings.rb
         | 
| 122 126 | 
             
            - lib/ext/string.rb
         | 
| 123 127 | 
             
            - lib/generators/establishment_generator.rb
         | 
| 124 128 | 
             
            - lib/generators/templates/establishment.erb
         | 
| 125 129 | 
             
            - spec/lib/beer_list/establishments/establishment_spec.rb
         | 
| 126 130 | 
             
            - spec/lib/beer_list/list_spec.rb
         | 
| 131 | 
            +
            - spec/lib/beer_list/scraper_spec.rb
         | 
| 127 132 | 
             
            - spec/lib/beer_list_spec.rb
         | 
| 128 133 | 
             
            - spec/spec_helper.rb
         | 
| 129 134 | 
             
            homepage: https://github.com/DanOlson/beer_list
         | 
| @@ -154,5 +159,6 @@ summary: A beer list scraper | |
| 154 159 | 
             
            test_files:
         | 
| 155 160 | 
             
            - spec/lib/beer_list/establishments/establishment_spec.rb
         | 
| 156 161 | 
             
            - spec/lib/beer_list/list_spec.rb
         | 
| 162 | 
            +
            - spec/lib/beer_list/scraper_spec.rb
         | 
| 157 163 | 
             
            - spec/lib/beer_list_spec.rb
         | 
| 158 164 | 
             
            - spec/spec_helper.rb
         |