Class: Barometer::Query::Format::WoeID
- Inherits:
-
Barometer::Query::Format
- Object
- Barometer::Query::Format
- Barometer::Query::Format::WoeID
- Defined in:
- lib/barometer/formats/woe_id.rb
Overview
Format: WOEID "Where on Earth" ID (by Yahoo!)
eg. 2459115, 615702 or w90210
NOTE: zipcodes and WoeIDs can look exactly the same when the WoeID is 5 digits long. For now, a 5 digit number will be detected as zipcode. The way to override this is to prepend a number with the letter 'w'. Therefore 90210 will be a zipcode and w90210 will be a WoeID. In the future, if WoeIDs are moe popular then zipcodes, then I will reverse this ...
This class is used to determine if a query is a :woe_id and how to convert to a :woe_id.
Class Method Summary collapse
-
._parse_geocode(text) ⇒ Object
parse the geo_data.
-
._parse_woe_from_placemaker(doc) ⇒ Object
match the first :woe_id (from search results) expects a Nokogiri doc.
-
._query_placemaker(query = nil) ⇒ Object
Yahoo! Placemaker [:geocode,:coordinates] -> :woe_id.
-
._reverse(query = nil) ⇒ Object
:woe_id -> :geocode query yahoo with :woe_id and parse geo_data.
-
.convert_query(text) ⇒ Object
remove the 'w' from applicable queries (only needed for detection).
- .convertable_formats ⇒ Object
- .format ⇒ Object
- .regex ⇒ Object
-
.reverse(original_query) ⇒ Object
reverse lookup, :woe_id -> (:geocode || :coordinates).
-
.to(original_query) ⇒ Object
convert to this format, X -> :woeid.
Methods inherited from Barometer::Query::Format
_fix_country, converts?, country_code, is?, is_a_query?
Class Method Details
._parse_geocode(text) ⇒ Object
parse the geo_data
142 143 144 145 146 147 |
# File 'lib/barometer/formats/woe_id.rb', line 142 def self._parse_geocode(text) return nil unless text output = [text["city"], text["region"], _fix_country(text["country"])] output.delete("") output.compact.join(', ') end |
._parse_woe_from_placemaker(doc) ⇒ Object
match the first :woe_id (from search results) expects a Nokogiri doc
127 128 129 130 |
# File 'lib/barometer/formats/woe_id.rb', line 127 def self._parse_woe_from_placemaker(doc) return nil unless doc Barometer::WebService::Placemaker.parse_woe_id(doc) end |
._query_placemaker(query = nil) ⇒ Object
Yahoo! Placemaker [:geocode,:coordinates] -> :woe_id
97 98 99 100 101 102 |
# File 'lib/barometer/formats/woe_id.rb', line 97 def self._query_placemaker(query=nil) return nil unless query raise ArgumentError unless is_a_query?(query) doc = Barometer::WebService::Placemaker.fetch(query) _parse_woe_from_placemaker(doc) end |
._reverse(query = nil) ⇒ Object
:woe_id -> :geocode query yahoo with :woe_id and parse geo_data
117 118 119 120 121 122 |
# File 'lib/barometer/formats/woe_id.rb', line 117 def self._reverse(query=nil) return nil unless query raise ArgumentError unless is_a_query?(query) response = Barometer::WebService::Placemaker.reverse(query) _parse_geocode(response) end |
.convert_query(text) ⇒ Object
remove the 'w' from applicable queries (only needed for detection)
28 29 30 31 |
# File 'lib/barometer/formats/woe_id.rb', line 28 def self.convert_query(text) return nil unless text text.delete('w') end |
.convertable_formats ⇒ Object
22 23 24 |
# File 'lib/barometer/formats/woe_id.rb', line 22 def self.convertable_formats [:short_zipcode, :zipcode, :weather_id, :coordinates, :icao, :geocode, :postalcode] end |
.format ⇒ Object
20 |
# File 'lib/barometer/formats/woe_id.rb', line 20 def self.format; :woe_id; end |
.regex ⇒ Object
21 |
# File 'lib/barometer/formats/woe_id.rb', line 21 def self.regex; /(^[0-9]{4}$)|(^[0-9]{6,7}$)|(^w[0-9]{4,7}$)/; end |
.reverse(original_query) ⇒ Object
reverse lookup, :woe_id -> (:geocode || :coordinates)
83 84 85 86 87 88 89 90 |
# File 'lib/barometer/formats/woe_id.rb', line 83 def self.reverse(original_query) raise ArgumentError unless is_a_query?(original_query) return nil unless original_query.format == self.format converted_query = Barometer::Query.new converted_query.q = _reverse(original_query) converted_query.format = Barometer::Query::Format::Geocode.format converted_query end |
.to(original_query) ⇒ Object
convert to this format, X -> :woeid
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/barometer/formats/woe_id.rb', line 35 def self.to(original_query) raise ArgumentError unless is_a_query?(original_query) return nil unless converts?(original_query) # pre-convert (:weather_id -> :geocode) # pre_query = nil if original_query.format == :weather_id pre_query = Barometer::Query::Format::WeatherID.reverse(original_query) end # pre-convert ([:short_zipcode, :zipcode, :postalcode, :icao] -> :geocode) # unless pre_query if [:short_zipcode, :zipcode, :icao].include?(original_query.format) unless pre_query = original_query.get_conversion(Barometer::Query::Format::Geocode.format) pre_query = Barometer::Query::Format::Geocode.to(original_query) end end end converted_query = Barometer::Query.new converted_query.country_code = original_query.country_code if original_query # TODO # use Geomojo.com (when no Yahoo! appid) # # if [:coordinates].include?(pre_query ? pre_query.format : original_query.format) && # Barometer.yahoo_placemaker_app_id.nil? # converted_query.q = _query_geomojo(pre_query || original_query) # converted_query.format = format # end # use Yahoo! Placemaker # if [:coordinates, :geocode, :postalcode].include?(pre_query ? pre_query.format : original_query.format) && !Barometer.yahoo_placemaker_app_id.nil? converted_query.q = _query_placemaker(pre_query || original_query) converted_query.format = format end converted_query.geo = pre_query.geo if pre_query converted_query.country_code = pre_query.country_code if pre_query converted_query end |