@@ -120,8 +120,8 @@ GEM  | 
            ||
| 120 | 120 | 
                method_source (0.8.1)  | 
            
| 121 | 121 | 
                mime-types (1.23)  | 
            
| 122 | 122 | 
                mini_portile (0.5.1)  | 
            
| 123 | 
                - multi_json (1.7.7)  | 
            |
| 124 | 
                - multi_xml (0.5.4)  | 
            |
| 123 | 
                + multi_json (1.7.8)  | 
            |
| 124 | 
                + multi_xml (0.5.5)  | 
            |
| 125 | 125 | 
                multipart-post (1.2.0)  | 
            
| 126 | 126 | 
                mysql2 (0.3.13)  | 
            
| 127 | 127 | 
                nokogiri (1.6.0)  | 
            
                @@ -1,11 +1,14 @@  | 
            ||
| 1 | 1 | 
                require 'date'  | 
            
| 2 | 
                +require 'cgi'  | 
            |
| 2 | 3 | 
                 | 
            
| 3 | 4 | 
                module Agents  | 
            
| 4 | 5 | 
                class WeatherAgent < Agent  | 
            
| 5 | 6 | 
                cannot_receive_events!  | 
            
| 6 | 7 | 
                 | 
            
| 7 | 8 | 
                description <<-MD  | 
            
| 8 | 
                - The WeatherAgent creates an event for the following day's weather at `zipcode`.  | 
            |
| 9 | 
                + The WeatherAgent creates an event for the following day's weather at a given `location`.  | 
            |
| 10 | 
                +  | 
            |
| 11 | 
                + The `location` can be a US zipcode, or any location that Wunderground supports. To find one, search [wunderground.com](http://wunderground.com) and copy the location part of the URL. For example, a result for San Francisco gives `http://www.wunderground.com/US/CA/San_Francisco.html` and London, England gives `http://www.wunderground.com/q/zmw:00000.1.03772`. The locations in each are `US/CA/San_Francisco` and `zmw:00000.1.03772`, respectively.  | 
            |
| 9 | 12 | 
                 | 
            
| 10 | 13 | 
                You must setup an [API key for Wunderground](http://www.wunderground.com/weather/api/) in order to use this Agent.  | 
            
| 11 | 14 | 
                MD  | 
            
                @@ -14,7 +17,7 @@ module Agents  | 
            ||
| 14 | 17 | 
                Events look like this:  | 
            
| 15 | 18 | 
                 | 
            
| 16 | 19 | 
                           {
               | 
            
| 17 | 
                - "zipcode": 12345,  | 
            |
| 20 | 
                + "location": 12345,  | 
            |
| 18 | 21 | 
                             "date": {
               | 
            
| 19 | 22 | 
                "epoch": "1357959600",  | 
            
| 20 | 23 | 
                "pretty": "10:00 PM EST on January 11, 2013"  | 
            
                @@ -52,21 +55,20 @@ module Agents  | 
            ||
| 52 | 55 | 
                def default_options  | 
            
| 53 | 56 | 
                       {
               | 
            
| 54 | 57 | 
                :api_key => "your-key",  | 
            
| 55 | 
                - :zipcode => "94103"  | 
            |
| 58 | 
                + :location => "94103"  | 
            |
| 56 | 59 | 
                }  | 
            
| 57 | 
                -  | 
            |
| 58 | 60 | 
                end  | 
            
| 59 | 61 | 
                 | 
            
| 60 | 62 | 
                def validate_options  | 
            
| 61 | 
                - errors.add(:base, "zipcode is required") unless options[:zipcode].present?  | 
            |
| 63 | 
                + errors.add(:base, "location is required") unless options[:location].present? || options[:zipcode].present?  | 
            |
| 62 | 64 | 
                errors.add(:base, "api_key is required") unless options[:api_key].present?  | 
            
| 63 | 65 | 
                end  | 
            
| 64 | 66 | 
                 | 
            
| 65 | 67 | 
                def check  | 
            
| 66 | 68 | 
                if key_setup?  | 
            
| 67 | 
                - wunderground.forecast_for(options[:zipcode])["forecast"]["simpleforecast"]["forecastday"].each do |day|  | 
            |
| 69 | 
                + wunderground.forecast_for(options[:location] || options[:zipcode])["forecast"]["simpleforecast"]["forecastday"].each do |day|  | 
            |
| 68 | 70 | 
                if is_tomorrow?(day)  | 
            
| 69 | 
                - create_event :payload => day.merge(:zipcode => options[:zipcode])  | 
            |
| 71 | 
                + create_event :payload => day.merge(:location => options[:location] || options[:zipcode])  | 
            |
| 70 | 72 | 
                end  | 
            
| 71 | 73 | 
                end  | 
            
| 72 | 74 | 
                end  | 
            
                @@ -13,7 +13,7 @@ unless user.agents.where(:name => "SF Weather Agent").exists?  | 
            ||
| 13 | 13 | 
                   Agent.build_for_type("Agents::WeatherAgent", user,
               | 
            
| 14 | 14 | 
                :name => "SF Weather Agent",  | 
            
| 15 | 15 | 
                :schedule => "10pm",  | 
            
| 16 | 
                -                       :options => { :zipcode => "94103", :api_key => "your-key" }).save!
               | 
            |
| 16 | 
                +                       :options => { :location => "94103", :api_key => "your-key" }).save!
               | 
            |
| 17 | 17 | 
                end  | 
            
| 18 | 18 | 
                 | 
            
| 19 | 19 | 
                unless user.agents.where(:name => "XKCD Source").exists?  | 
            
                @@ -58,7 +58,7 @@ unless user.agents.where(:name => "Rain Notifier").exists?  | 
            ||
| 58 | 58 | 
                :value => "rain|storm",  | 
            
| 59 | 59 | 
                :path => "conditions"  | 
            
| 60 | 60 | 
                }],  | 
            
| 61 | 
                - :message => "Just so you know, it looks like '<conditions>' tomorrow in <zipcode>"  | 
            |
| 61 | 
                + :message => "Just so you know, it looks like '<conditions>' tomorrow in <location>"  | 
            |
| 62 | 62 | 
                }).save!  | 
            
| 63 | 63 | 
                end  | 
            
| 64 | 64 | 
                 | 
            
                @@ -34,7 +34,7 @@ bob_weather_agent:  | 
            ||
| 34 | 34 | 
                schedule: "midnight"  | 
            
| 35 | 35 | 
                name: "SF Weather"  | 
            
| 36 | 36 | 
                   options: <%= {
               | 
            
| 37 | 
                - :zipcode => 94102,  | 
            |
| 37 | 
                + :location => 94102,  | 
            |
| 38 | 38 | 
                :lat => 37.779329,  | 
            
| 39 | 39 | 
                :lng => -122.41915,  | 
            
| 40 | 40 | 
                :api_key => 'test'  | 
            
                @@ -46,7 +46,7 @@ jane_weather_agent:  | 
            ||
| 46 | 46 | 
                schedule: "midnight"  | 
            
| 47 | 47 | 
                name: "SF Weather"  | 
            
| 48 | 48 | 
                   options: <%= {
               | 
            
| 49 | 
                - :zipcode => 94103,  | 
            |
| 49 | 
                + :location => 94103,  | 
            |
| 50 | 50 | 
                :lat => 37.779329,  | 
            
| 51 | 51 | 
                :lng => -122.41915,  | 
            
| 52 | 52 | 
                :api_key => 'test'  | 
            
                @@ -63,7 +63,7 @@ jane_rain_notifier_agent:  | 
            ||
| 63 | 63 | 
                :value => "rain",  | 
            
| 64 | 64 | 
                :path => "conditions"  | 
            
| 65 | 65 | 
                }],  | 
            
| 66 | 
                - :message => "Just so you know, it looks like '<conditions>' tomorrow in <zipcode>"  | 
            |
| 66 | 
                + :message => "Just so you know, it looks like '<conditions>' tomorrow in <location>"  | 
            |
| 67 | 67 | 
                }.to_yaml.inspect %>  | 
            
| 68 | 68 | 
                 | 
            
| 69 | 69 | 
                bob_rain_notifier_agent:  | 
            
                @@ -77,7 +77,7 @@ bob_rain_notifier_agent:  | 
            ||
| 77 | 77 | 
                :value => "rain",  | 
            
| 78 | 78 | 
                :path => "conditions"  | 
            
| 79 | 79 | 
                }],  | 
            
| 80 | 
                - :message => "Just so you know, it looks like '<conditions>' tomorrow in <zipcode>"  | 
            |
| 80 | 
                + :message => "Just so you know, it looks like '<conditions>' tomorrow in <location>"  | 
            |
| 81 | 81 | 
                }.to_yaml.inspect %>  | 
            
| 82 | 82 | 
                 | 
            
| 83 | 83 | 
                bob_twitter_user_agent:  |