barometer 0.8.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/.pelusa.yml +7 -0
- data/.travis.yml +6 -3
- data/Gemfile +11 -1
- data/README.md +89 -244
- data/Rakefile +1 -1
- data/barometer.gemspec +22 -24
- data/lib/barometer.rb +14 -65
- data/lib/barometer/base.rb +35 -65
- data/lib/barometer/data.rb +15 -20
- data/lib/barometer/data/attribute.rb +19 -0
- data/lib/barometer/data/attributes/distance.rb +11 -0
- data/lib/barometer/data/attributes/float.rb +11 -0
- data/lib/barometer/data/attributes/integer.rb +11 -0
- data/lib/barometer/data/attributes/location.rb +11 -0
- data/lib/barometer/data/attributes/pressure.rb +11 -0
- data/lib/barometer/data/attributes/sun.rb +15 -0
- data/lib/barometer/data/attributes/temperature.rb +11 -0
- data/lib/barometer/data/attributes/time.rb +11 -0
- data/lib/barometer/data/attributes/vector.rb +11 -0
- data/lib/barometer/data/attributes/zone.rb +11 -0
- data/lib/barometer/data/convertable_units.rb +145 -0
- data/lib/barometer/data/coordinates.rb +16 -0
- data/lib/barometer/data/distance.rb +14 -133
- data/lib/barometer/data/geo.rb +22 -59
- data/lib/barometer/data/location.rb +14 -20
- data/lib/barometer/data/pressure.rb +14 -135
- data/lib/barometer/data/sun.rb +24 -24
- data/lib/barometer/data/temperature.rb +14 -169
- data/lib/barometer/data/vector.rb +44 -0
- data/lib/barometer/data/zone.rb +109 -112
- data/lib/barometer/query.rb +23 -161
- data/lib/barometer/query/base.rb +88 -0
- data/lib/barometer/query/converter.rb +64 -0
- data/lib/barometer/query/converters/from_coordinates_to_noaa_station_id.rb +30 -0
- data/lib/barometer/query/converters/from_geocode_to_coordinates.rb +28 -0
- data/lib/barometer/query/converters/from_short_zipcode_to_zipcode.rb +28 -0
- data/lib/barometer/query/converters/from_weather_id_to_geocode.rb +30 -0
- data/lib/barometer/query/converters/from_woe_id_or_ipv4_to_geocode.rb +32 -0
- data/lib/barometer/query/converters/to_geocode.rb +30 -0
- data/lib/barometer/query/converters/to_weather_id.rb +30 -0
- data/lib/barometer/query/converters/to_woe_id.rb +30 -0
- data/lib/barometer/query/format.rb +59 -0
- data/lib/barometer/query/formats/base.rb +22 -0
- data/lib/barometer/query/formats/coordinates.rb +14 -0
- data/lib/barometer/query/formats/geocode.rb +15 -0
- data/lib/barometer/query/formats/icao.rb +35 -0
- data/lib/barometer/query/formats/ipv4_address.rb +19 -0
- data/lib/barometer/query/formats/noaa_station_id.rb +15 -0
- data/lib/barometer/query/formats/postalcode.rb +20 -0
- data/lib/barometer/query/formats/short_zipcode.rb +15 -0
- data/lib/barometer/{translations → query/formats/translations}/icao_country_codes.yml +0 -0
- data/lib/barometer/{translations → query/formats/translations}/weather_country_codes.yml +0 -0
- data/lib/barometer/query/formats/unknown.rb +14 -0
- data/lib/barometer/query/formats/weather_id.rb +33 -0
- data/lib/barometer/query/formats/woe_id.rb +28 -0
- data/lib/barometer/query/formats/zipcode.rb +15 -0
- data/lib/barometer/query/service.rb +13 -0
- data/lib/barometer/query/services/apis/geonames_timezone.rb +26 -0
- data/lib/barometer/query/services/apis/google_geocode.rb +35 -0
- data/lib/barometer/query/services/apis/noaa_station.rb +31 -0
- data/lib/barometer/query/services/apis/weather_id.rb +35 -0
- data/lib/barometer/query/services/apis/wunderground_timezone.rb +26 -0
- data/lib/barometer/query/services/apis/yahoo_placefinder.rb +35 -0
- data/lib/barometer/query/services/apis/yahoo_weather.rb +31 -0
- data/lib/barometer/query/services/from_weather_id.rb +64 -0
- data/lib/barometer/query/services/geonames_timezone.rb +18 -0
- data/lib/barometer/query/services/google_geocode.rb +106 -0
- data/lib/barometer/query/services/noaa_station_id.rb +28 -0
- data/lib/barometer/query/services/to_weather_id.rb +25 -0
- data/lib/barometer/query/services/to_woe_id.rb +29 -0
- data/lib/barometer/query/services/wunderground_timezone.rb +18 -0
- data/lib/barometer/query/services/yahoo_geocode.rb +69 -0
- data/lib/barometer/response.rb +12 -0
- data/lib/barometer/response/base.rb +57 -0
- data/lib/barometer/response/current.rb +27 -0
- data/lib/barometer/response/prediction.rb +41 -0
- data/lib/barometer/response/prediction_collection.rb +48 -0
- data/lib/barometer/utils.rb +17 -0
- data/lib/barometer/utils/address.rb +33 -0
- data/lib/barometer/utils/api.rb +30 -0
- data/lib/barometer/utils/config_reader.rb +40 -0
- data/lib/barometer/utils/get.rb +17 -0
- data/lib/barometer/utils/json_reader.rb +22 -0
- data/lib/barometer/utils/payload.rb +100 -0
- data/lib/barometer/utils/payload_request.rb +37 -0
- data/lib/barometer/utils/post.rb +24 -0
- data/lib/barometer/utils/time.rb +78 -0
- data/lib/barometer/{translations → utils/translations}/zone_codes.yml +0 -0
- data/lib/barometer/utils/versioned_registration.rb +70 -0
- data/lib/barometer/utils/xml_reader.rb +27 -0
- data/lib/barometer/utils/zone_code_lookup.rb +30 -0
- data/lib/barometer/version.rb +1 -1
- data/lib/barometer/weather.rb +44 -173
- data/lib/barometer/weather_service.rb +41 -0
- data/lib/barometer/weather_services/base.rb +50 -0
- data/lib/barometer/weather_services/forecast_io.rb +36 -0
- data/lib/barometer/weather_services/forecast_io/api.rb +22 -0
- data/lib/barometer/weather_services/forecast_io/query.rb +38 -0
- data/lib/barometer/weather_services/forecast_io/response.rb +31 -0
- data/lib/barometer/weather_services/forecast_io/response/current_weather.rb +78 -0
- data/lib/barometer/weather_services/forecast_io/response/forecasted_weather.rb +74 -0
- data/lib/barometer/weather_services/forecast_io/response/location.rb +19 -0
- data/lib/barometer/weather_services/forecast_io/response/timezone.rb +25 -0
- data/lib/barometer/weather_services/noaa.rb +21 -305
- data/lib/barometer/weather_services/noaa/current_api.rb +25 -0
- data/lib/barometer/weather_services/noaa/current_query.rb +30 -0
- data/lib/barometer/weather_services/noaa/current_response.rb +29 -0
- data/lib/barometer/weather_services/noaa/forecast_api.rb +25 -0
- data/lib/barometer/weather_services/noaa/forecast_query.rb +39 -0
- data/lib/barometer/weather_services/noaa/forecast_response.rb +28 -0
- data/lib/barometer/weather_services/noaa/response/current_location.rb +42 -0
- data/lib/barometer/weather_services/noaa/response/current_station.rb +46 -0
- data/lib/barometer/weather_services/noaa/response/current_weather.rb +82 -0
- data/lib/barometer/weather_services/noaa/response/forecasted_weather.rb +90 -0
- data/lib/barometer/weather_services/noaa/response/location.rb +19 -0
- data/lib/barometer/weather_services/noaa/response/timezone.rb +15 -0
- data/lib/barometer/weather_services/response.rb +9 -0
- data/lib/barometer/weather_services/response/location.rb +42 -0
- data/lib/barometer/weather_services/response/time_zone.rb +19 -0
- data/lib/barometer/weather_services/weather_bug.rb +24 -280
- data/lib/barometer/weather_services/weather_bug/current_api.rb +26 -0
- data/lib/barometer/weather_services/weather_bug/current_response.rb +33 -0
- data/lib/barometer/weather_services/weather_bug/forecast_api.rb +26 -0
- data/lib/barometer/weather_services/weather_bug/forecast_response.rb +29 -0
- data/lib/barometer/weather_services/weather_bug/query.rb +42 -0
- data/lib/barometer/weather_services/weather_bug/response/current_weather.rb +82 -0
- data/lib/barometer/weather_services/weather_bug/response/forecasted_weather.rb +67 -0
- data/lib/barometer/weather_services/weather_bug/response/location.rb +23 -0
- data/lib/barometer/weather_services/weather_bug/response/station.rb +43 -0
- data/lib/barometer/weather_services/weather_bug/response/sun.rb +32 -0
- data/lib/barometer/weather_services/weather_bug/response/time_helper.rb +52 -0
- data/lib/barometer/weather_services/weather_bug/response/timezone.rb +15 -0
- data/lib/barometer/weather_services/wunderground_v1.rb +32 -0
- data/lib/barometer/weather_services/wunderground_v1/current_api.rb +21 -0
- data/lib/barometer/weather_services/wunderground_v1/current_response.rb +31 -0
- data/lib/barometer/weather_services/wunderground_v1/forecast_api.rb +21 -0
- data/lib/barometer/weather_services/wunderground_v1/forecast_response.rb +33 -0
- data/lib/barometer/weather_services/wunderground_v1/query.rb +30 -0
- data/lib/barometer/weather_services/wunderground_v1/response/current_weather.rb +92 -0
- data/lib/barometer/weather_services/wunderground_v1/response/forecasted_weather.rb +87 -0
- data/lib/barometer/weather_services/wunderground_v1/response/full_timezone.rb +22 -0
- data/lib/barometer/weather_services/wunderground_v1/response/location.rb +43 -0
- data/lib/barometer/weather_services/wunderground_v1/response/station.rb +39 -0
- data/lib/barometer/weather_services/wunderground_v1/response/sun.rb +53 -0
- data/lib/barometer/weather_services/wunderground_v1/response/timezone.rb +15 -0
- data/lib/barometer/weather_services/yahoo.rb +16 -198
- data/lib/barometer/weather_services/yahoo/api.rb +21 -0
- data/lib/barometer/weather_services/yahoo/query.rb +42 -0
- data/lib/barometer/weather_services/yahoo/response.rb +39 -0
- data/lib/barometer/weather_services/yahoo/response/current_weather.rb +86 -0
- data/lib/barometer/weather_services/yahoo/response/forecasted_weather.rb +71 -0
- data/lib/barometer/weather_services/yahoo/response/location.rb +47 -0
- data/lib/barometer/weather_services/yahoo/response/sun.rb +43 -0
- data/lib/barometer/weather_services/yahoo/response/timezone.rb +15 -0
- data/spec/barometer_spec.rb +18 -120
- data/spec/base_spec.rb +114 -0
- data/spec/cassettes/Converter_FromCoordinatesToNoaaStationId.json +1 -0
- data/spec/cassettes/Converter_FromWeatherIdToGeocode.json +1 -0
- data/spec/cassettes/Converter_FromWoeIdOrIpv4ToGeocode.json +1 -0
- data/spec/cassettes/Converter_ToGeocode.json +1 -0
- data/spec/cassettes/Converter_ToWeatherId.json +1 -0
- data/spec/cassettes/Converter_ToWoeId.json +1 -0
- data/spec/cassettes/Service_FromWeatherId.json +1 -0
- data/spec/cassettes/Service_GoogleGeocode.json +1 -0
- data/spec/cassettes/Service_NoaaStation.json +1 -0
- data/spec/cassettes/Service_ToWeatherId.json +1 -0
- data/spec/cassettes/Service_ToWoeId.json +1 -0
- data/spec/cassettes/Service_YahooGeocode.json +1 -0
- data/spec/cassettes/WeatherService_ForecastIo.json +1 -0
- data/spec/cassettes/WeatherService_Noaa.json +1 -1
- data/spec/cassettes/WeatherService_WeatherBug.json +1 -1
- data/spec/cassettes/WeatherService_WundergroundV1.json +1 -0
- data/spec/cassettes/WeatherService_Yahoo.json +1 -1
- data/spec/data/attributes/distance_spec.rb +60 -0
- data/spec/data/attributes/location_spec.rb +41 -0
- data/spec/data/attributes/pressure_spec.rb +60 -0
- data/spec/data/attributes/sun_spec.rb +33 -0
- data/spec/data/attributes/temperature_spec.rb +60 -0
- data/spec/data/attributes/time_spec.rb +58 -0
- data/spec/data/attributes/vector_spec.rb +43 -0
- data/spec/data/attributes/zone_spec.rb +34 -0
- data/spec/data/convertable_units_spec.rb +299 -0
- data/spec/data/coordinates_spec.rb +15 -0
- data/spec/data/distance_spec.rb +49 -333
- data/spec/data/geo_spec.rb +72 -71
- data/spec/data/location_spec.rb +70 -65
- data/spec/data/pressure_spec.rb +49 -333
- data/spec/data/sun_spec.rb +57 -81
- data/spec/data/temperature_spec.rb +49 -393
- data/spec/data/vector_spec.rb +100 -0
- data/spec/data/zone_spec.rb +199 -266
- data/spec/query/base_spec.rb +296 -0
- data/spec/query/converter_spec.rb +98 -0
- data/spec/query/converters/from_coordinates_to_noaa_station_id_spec.rb +35 -0
- data/spec/query/converters/from_geocode_to_coordinates_spec.rb +25 -0
- data/spec/query/converters/from_short_zipcode_to_zipcode_spec.rb +31 -0
- data/spec/query/converters/from_weather_id_to_geocode_spec.rb +40 -0
- data/spec/query/converters/from_woe_id_or_ipv4_to_geocode_spec.rb +51 -0
- data/spec/query/converters/to_geocode_spec.rb +99 -0
- data/spec/query/converters/to_weather_id_spec.rb +35 -0
- data/spec/query/converters/to_woe_id_spec.rb +74 -0
- data/spec/query/formats/base_spec.rb +15 -0
- data/spec/query/formats/coordinates_spec.rb +13 -0
- data/spec/query/formats/geocode_spec.rb +9 -0
- data/spec/query/formats/icao_spec.rb +20 -0
- data/spec/query/formats/ipv4_address_spec.rb +33 -0
- data/spec/query/formats/noaa_station_id_spec.rb +9 -0
- data/spec/query/formats/postalcode_spec.rb +18 -0
- data/spec/query/formats/short_zipcode_spec.rb +18 -0
- data/spec/query/formats/unknown_spec.rb +9 -0
- data/spec/query/formats/weather_id_spec.rb +31 -0
- data/spec/query/formats/woe_id_spec.rb +45 -0
- data/spec/query/formats/zipcode_spec.rb +18 -0
- data/spec/query/formats_spec.rb +55 -0
- data/spec/query/services/from_weather_id_spec.rb +54 -0
- data/spec/query/services/google_geocode_spec.rb +60 -0
- data/spec/query/services/noaa_station_id_spec.rb +23 -0
- data/spec/query/services/to_weather_id_spec.rb +23 -0
- data/spec/query/services/to_woe_id_spec.rb +51 -0
- data/spec/query/services/yahoo_geocode_spec.rb +72 -0
- data/spec/response/base_spec.rb +103 -0
- data/spec/response/current_spec.rb +33 -0
- data/spec/response/predicition_spec.rb +65 -0
- data/spec/response/prediction_collection_spec.rb +97 -0
- data/spec/spec_helper.rb +14 -12
- data/spec/support/key_file_parser.rb +22 -0
- data/spec/support/matchers/formats.rb +36 -0
- data/spec/support/matchers/have_data.rb +46 -0
- data/spec/support/matchers/have_field.rb +128 -0
- data/spec/support/matchers/have_forecast.rb +46 -0
- data/spec/support/matchers/path.rb +23 -0
- data/spec/support/query_factory.rb +20 -0
- data/spec/utils/address_spec.rb +67 -0
- data/spec/utils/config_reader_spec.rb +157 -0
- data/spec/utils/get_spec.rb +22 -0
- data/spec/utils/payload_request_spec.rb +69 -0
- data/spec/utils/payload_spec.rb +168 -0
- data/spec/utils/post_spec.rb +20 -0
- data/spec/utils/time_spec.rb +93 -0
- data/spec/utils/versioned_registration_spec.rb +105 -0
- data/spec/weather_services/base_spec.rb +116 -0
- data/spec/weather_services/forecast_io_spec.rb +71 -0
- data/spec/weather_services/noaa/current_response_spec.rb +22 -0
- data/spec/weather_services/noaa/forecast_response_spec.rb +33 -0
- data/spec/weather_services/noaa_spec.rb +68 -166
- data/spec/weather_services/weather_bug/current_response_spec.rb +64 -0
- data/spec/weather_services/weather_bug/forecast_response_spec.rb +23 -0
- data/spec/weather_services/weather_bug_spec.rb +62 -202
- data/spec/weather_services/wunderground_v1/current_response_spec.rb +19 -0
- data/spec/weather_services/wunderground_v1/forecast_response_spec.rb +62 -0
- data/spec/weather_services/wunderground_v1_spec.rb +78 -0
- data/spec/weather_services/yahoo/response_spec.rb +73 -0
- data/spec/weather_services/yahoo_spec.rb +52 -135
- data/spec/weather_services_spec.rb +103 -0
- data/spec/weather_spec.rb +167 -347
- metadata +342 -123
- data/.document +0 -5
- data/TODO +0 -60
- data/bin/barometer +0 -441
- data/lib/barometer/data/local_datetime.rb +0 -145
- data/lib/barometer/data/local_time.rb +0 -134
- data/lib/barometer/data/speed.rb +0 -158
- data/lib/barometer/data/units.rb +0 -49
- data/lib/barometer/formats.rb +0 -13
- data/lib/barometer/formats/coordinates.rb +0 -57
- data/lib/barometer/formats/format.rb +0 -64
- data/lib/barometer/formats/geocode.rb +0 -60
- data/lib/barometer/formats/icao.rb +0 -37
- data/lib/barometer/formats/postalcode.rb +0 -22
- data/lib/barometer/formats/short_zipcode.rb +0 -17
- data/lib/barometer/formats/weather_id.rb +0 -92
- data/lib/barometer/formats/woe_id.rb +0 -150
- data/lib/barometer/formats/zipcode.rb +0 -31
- data/lib/barometer/key_file_parser.rb +0 -20
- data/lib/barometer/measurements/measurement.rb +0 -202
- data/lib/barometer/measurements/result.rb +0 -207
- data/lib/barometer/measurements/result_array.rb +0 -75
- data/lib/barometer/services.rb +0 -19
- data/lib/barometer/weather_services/service.rb +0 -189
- data/lib/barometer/weather_services/wunderground.rb +0 -264
- data/lib/barometer/web_services/geocode.rb +0 -34
- data/lib/barometer/web_services/noaa_station_id.rb +0 -53
- data/lib/barometer/web_services/placemaker.rb +0 -95
- data/lib/barometer/web_services/timezone.rb +0 -38
- data/lib/barometer/web_services/weather_id.rb +0 -50
- data/lib/barometer/web_services/web_service.rb +0 -29
- data/spec/cassettes/Barometer.json +0 -1
- data/spec/cassettes/Query.json +0 -1
- data/spec/cassettes/Query_Format_Coordinates.json +0 -1
- data/spec/cassettes/Query_Format_Geocode.json +0 -1
- data/spec/cassettes/Query_Format_WeatherID.json +0 -1
- data/spec/cassettes/Query_Format_WoeID.json +0 -1
- data/spec/cassettes/WeatherService.json +0 -1
- data/spec/cassettes/WeatherService_Wunderground.json +0 -1
- data/spec/cassettes/WebService_Geocode.json +0 -1
- data/spec/cassettes/WebService_NoaaStation.json +0 -1
- data/spec/data/local_datetime_spec.rb +0 -274
- data/spec/data/local_time_spec.rb +0 -239
- data/spec/data/speed_spec.rb +0 -374
- data/spec/data/units_spec.rb +0 -101
- data/spec/formats/coordinates_spec.rb +0 -166
- data/spec/formats/format_spec.rb +0 -74
- data/spec/formats/geocode_spec.rb +0 -163
- data/spec/formats/icao_spec.rb +0 -55
- data/spec/formats/postalcode_spec.rb +0 -53
- data/spec/formats/short_zipcode_spec.rb +0 -47
- data/spec/formats/weather_id_spec.rb +0 -182
- data/spec/formats/woe_id_spec.rb +0 -211
- data/spec/formats/zipcode_spec.rb +0 -103
- data/spec/key_file_parser_spec.rb +0 -28
- data/spec/measurements/measurement_spec.rb +0 -381
- data/spec/measurements/result_array_spec.rb +0 -150
- data/spec/measurements/result_spec.rb +0 -632
- data/spec/query_spec.rb +0 -498
- data/spec/weather_services/services_spec.rb +0 -135
- data/spec/weather_services/wunderground_spec.rb +0 -179
- data/spec/web_services/geocode_spec.rb +0 -31
- data/spec/web_services/noaa_station_id_spec.rb +0 -33
- data/spec/web_services/placemaker_spec.rb +0 -41
- data/spec/web_services/web_services_spec.rb +0 -20
data/lib/barometer/formats.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
$:.unshift(File.dirname(__FILE__))
|
2
|
-
|
3
|
-
# query formats
|
4
|
-
#
|
5
|
-
require 'formats/format'
|
6
|
-
require 'formats/short_zipcode'
|
7
|
-
require 'formats/zipcode'
|
8
|
-
require 'formats/postalcode'
|
9
|
-
require 'formats/weather_id'
|
10
|
-
require 'formats/coordinates'
|
11
|
-
require 'formats/icao'
|
12
|
-
require 'formats/geocode'
|
13
|
-
require 'formats/woe_id'
|
@@ -1,57 +0,0 @@
|
|
1
|
-
module Barometer
|
2
|
-
#
|
3
|
-
# Format: Coordinates
|
4
|
-
#
|
5
|
-
# eg. 123.1234,-123.123
|
6
|
-
#
|
7
|
-
# This class is used to determine if a query is a
|
8
|
-
# :coordinates and how to convert to :coordinates.
|
9
|
-
#
|
10
|
-
class Query::Format::Coordinates < Query::Format
|
11
|
-
|
12
|
-
def self.format; :coordinates; end
|
13
|
-
def self.regex; /^[-]?[0-9\.]+[,]{1}\s?[-]?[0-9\.]+$/; end
|
14
|
-
def self.convertable_formats
|
15
|
-
[:short_zipcode, :zipcode, :postalcode, :weather_id, :coordinates, :icao, :geocode, :woe_id]
|
16
|
-
end
|
17
|
-
|
18
|
-
# convert to this format, X -> :coordinates
|
19
|
-
#
|
20
|
-
def self.to(original_query)
|
21
|
-
raise ArgumentError unless is_a_query?(original_query)
|
22
|
-
return nil unless converts?(original_query)
|
23
|
-
converted_query = Barometer::Query.new
|
24
|
-
|
25
|
-
# pre-convert
|
26
|
-
#
|
27
|
-
pre_query = nil
|
28
|
-
if original_query.format == :weather_id
|
29
|
-
unless pre_query = original_query.get_conversion(Query::Format::Geocode.format)
|
30
|
-
pre_query = Query::Format::WeatherID.reverse(original_query)
|
31
|
-
original_query.post_conversion(pre_query)
|
32
|
-
end
|
33
|
-
elsif original_query.format == :woe_id
|
34
|
-
pre_query = Query::Format::WoeID.reverse(original_query)
|
35
|
-
end
|
36
|
-
|
37
|
-
# convert & adjust
|
38
|
-
#
|
39
|
-
converted_query = Query::Format::Geocode.geocode(pre_query || original_query)
|
40
|
-
converted_query.q = converted_query.geo.coordinates if converted_query.geo
|
41
|
-
converted_query.format = format
|
42
|
-
|
43
|
-
converted_query
|
44
|
-
end
|
45
|
-
|
46
|
-
def self.parse_latitude(query)
|
47
|
-
coordinates = query.to_s.split(',')
|
48
|
-
coordinates ? coordinates[0] : nil
|
49
|
-
end
|
50
|
-
|
51
|
-
def self.parse_longitude(query)
|
52
|
-
coordinates = query.to_s.split(',')
|
53
|
-
coordinates ? coordinates[1] : nil
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
57
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
module Barometer
|
2
|
-
#
|
3
|
-
# Base Format Class
|
4
|
-
#
|
5
|
-
# Fromats are used to determine if a query is of a certain
|
6
|
-
# format, how to convert to and from that format
|
7
|
-
# and what the country_code is for that format (if possible).
|
8
|
-
# Some formats require external Web Services to help
|
9
|
-
# in the converision. (ie :weather_id -> :geocode)
|
10
|
-
#
|
11
|
-
class Query::Format
|
12
|
-
|
13
|
-
@@fixes_file = File.expand_path(
|
14
|
-
File.join(File.dirname(__FILE__), '..', 'translations', 'weather_country_codes.yml'))
|
15
|
-
@@fixes = nil
|
16
|
-
|
17
|
-
# stubs
|
18
|
-
#
|
19
|
-
def self.regex; raise NotImplementedError; end
|
20
|
-
def self.format; raise NotImplementedError; end
|
21
|
-
|
22
|
-
# defaults
|
23
|
-
#
|
24
|
-
def self.to(query=nil,country=nil); nil; end
|
25
|
-
def self.country_code(query=nil); nil; end
|
26
|
-
def self.convertable_formats; []; end
|
27
|
-
def self.convert_query(text); text; end
|
28
|
-
|
29
|
-
# is the query of this format?
|
30
|
-
#
|
31
|
-
def self.is?(query=nil)
|
32
|
-
raise ArgumentError unless query.is_a?(String)
|
33
|
-
return !(query =~ self.regex).nil?
|
34
|
-
end
|
35
|
-
|
36
|
-
# does the format support conversion from the given query?
|
37
|
-
#
|
38
|
-
def self.converts?(query=nil)
|
39
|
-
return false unless is_a_query?(query)
|
40
|
-
self.convertable_formats.include?(query.format)
|
41
|
-
end
|
42
|
-
|
43
|
-
# is the object a Barometer::Query?
|
44
|
-
#
|
45
|
-
def self.is_a_query?(object=nil)
|
46
|
-
return false unless object
|
47
|
-
object.is_a?(Barometer::Query)
|
48
|
-
end
|
49
|
-
|
50
|
-
private
|
51
|
-
|
52
|
-
# fix the country code
|
53
|
-
#
|
54
|
-
# weather.com uses non-standard two letter country codes that
|
55
|
-
# hinder the ability to determine the country or fetch geo_data.
|
56
|
-
# correct these "mistakes"
|
57
|
-
#
|
58
|
-
def self._fix_country(country_code)
|
59
|
-
@@fixes ||= YAML.load_file(@@fixes_file)
|
60
|
-
@@fixes[country_code.upcase.to_s] || country_code
|
61
|
-
end
|
62
|
-
|
63
|
-
end
|
64
|
-
end
|
@@ -1,60 +0,0 @@
|
|
1
|
-
module Barometer
|
2
|
-
#
|
3
|
-
# Format: Geocode
|
4
|
-
# (not to be confused with the WebService geocode)
|
5
|
-
#
|
6
|
-
# eg. 123 Elm St, Mystery, Alaska, USA
|
7
|
-
#
|
8
|
-
# This class is used to determine if a query is a
|
9
|
-
# :geocode, how to convert to :geocode
|
10
|
-
#
|
11
|
-
class Query::Format::Geocode < Query::Format
|
12
|
-
|
13
|
-
def self.format; :geocode; end
|
14
|
-
def self.is?(query=nil); query.is_a?(String) ? true : false; end
|
15
|
-
def self.convertable_formats
|
16
|
-
[:short_zipcode, :zipcode, :coordinates, :weather_id, :icao, :woe_id]
|
17
|
-
end
|
18
|
-
|
19
|
-
# convert to this format, X -> :geocode
|
20
|
-
#
|
21
|
-
def self.to(original_query)
|
22
|
-
raise ArgumentError unless is_a_query?(original_query)
|
23
|
-
unless converts?(original_query)
|
24
|
-
return (original_query.format == format ? original_query.dup : nil)
|
25
|
-
end
|
26
|
-
|
27
|
-
unless converted_query = original_query.get_conversion(format)
|
28
|
-
converted_query = Barometer::Query.new
|
29
|
-
|
30
|
-
converted_query = case original_query.format
|
31
|
-
when :weather_id
|
32
|
-
Query::Format::WeatherID.reverse(original_query)
|
33
|
-
when :woe_id
|
34
|
-
Query::Format::WoeID.reverse(original_query)
|
35
|
-
else
|
36
|
-
geocode(original_query)
|
37
|
-
end
|
38
|
-
|
39
|
-
original_query.post_conversion(converted_query) if converted_query
|
40
|
-
end
|
41
|
-
converted_query
|
42
|
-
end
|
43
|
-
|
44
|
-
# geocode the query
|
45
|
-
#
|
46
|
-
def self.geocode(original_query)
|
47
|
-
raise ArgumentError unless is_a_query?(original_query)
|
48
|
-
|
49
|
-
converted_query = Barometer::Query.new
|
50
|
-
converted_query.geo = Barometer::WebService::Geocode.fetch(original_query)
|
51
|
-
if converted_query.geo
|
52
|
-
converted_query.country_code = converted_query.geo.country_code
|
53
|
-
converted_query.q = converted_query.geo.to_s
|
54
|
-
converted_query.format = format
|
55
|
-
end
|
56
|
-
converted_query
|
57
|
-
end
|
58
|
-
|
59
|
-
end
|
60
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
module Barometer
|
2
|
-
#
|
3
|
-
# Format: ICAO (International Civil Aviation Organization)
|
4
|
-
#
|
5
|
-
# eg. KLAX (Los Angeles Airport)
|
6
|
-
#
|
7
|
-
# This class is used to determine if a query is a
|
8
|
-
# :icao and what the country_code is.
|
9
|
-
#
|
10
|
-
class Query::Format::Icao < Query::Format
|
11
|
-
|
12
|
-
@@codes_file = File.expand_path(
|
13
|
-
File.join(File.dirname(__FILE__), '..', 'translations', 'icao_country_codes.yml'))
|
14
|
-
@@codes = nil
|
15
|
-
|
16
|
-
def self.format; :icao; end
|
17
|
-
|
18
|
-
# call any 3-4 letter query, :icao ... obviously this will have a lot
|
19
|
-
# of false positives. So far this isn't an issue as all weather services
|
20
|
-
# that take :icao (which is just one, :wunderground) also take what
|
21
|
-
# this would have been if it was not called :icao.
|
22
|
-
#
|
23
|
-
def self.regex; /^[A-Za-z]{3,4}$/; end
|
24
|
-
|
25
|
-
# in some cases the first letter can designate the country
|
26
|
-
#
|
27
|
-
def self.country_code(query=nil)
|
28
|
-
return unless query && query.is_a?(String)
|
29
|
-
$:.unshift(File.dirname(__FILE__))
|
30
|
-
@@codes ||= YAML.load_file(@@codes_file)
|
31
|
-
return unless @@codes && @@codes['one_letter'] && @@codes['two_letter']
|
32
|
-
@@codes['one_letter'][query[0..0].upcase.to_s] ||
|
33
|
-
@@codes['two_letter'][query[0..1].upcase.to_s] || nil
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
module Barometer
|
2
|
-
#
|
3
|
-
# Format: Postal Code
|
4
|
-
#
|
5
|
-
# eg. H0H 0H0
|
6
|
-
#
|
7
|
-
# This class is used to determine if a query is a
|
8
|
-
# :postalcode and what the country_code is.
|
9
|
-
#
|
10
|
-
class Query::Format::Postalcode < Query::Format
|
11
|
-
|
12
|
-
def self.format; :postalcode; end
|
13
|
-
def self.country_code(query=nil); "CA"; end
|
14
|
-
def self.regex
|
15
|
-
# Rules: no D, F, I, O, Q, or U anywhere
|
16
|
-
# Basic validation: ^[ABCEGHJ-NPRSTVXY]{1}[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}
|
17
|
-
# [ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[0-9]{1}$
|
18
|
-
/^[A-Z]{1}[\d]{1}[A-Z]{1}[ ]?[\d]{1}[A-Z]{1}[\d]{1}$/
|
19
|
-
end
|
20
|
-
|
21
|
-
end
|
22
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module Barometer
|
2
|
-
#
|
3
|
-
# Format: Zip Code (short)
|
4
|
-
#
|
5
|
-
# eg. 90210
|
6
|
-
#
|
7
|
-
# This class is used to determine if a query is a
|
8
|
-
# :short_zipcode and what the country_code is.
|
9
|
-
#
|
10
|
-
class Query::Format::ShortZipcode < Query::Format
|
11
|
-
|
12
|
-
def self.format; :short_zipcode; end
|
13
|
-
def self.country_code(query=nil); "US"; end
|
14
|
-
def self.regex; /(^[0-9]{5}$)/; end
|
15
|
-
|
16
|
-
end
|
17
|
-
end
|
@@ -1,92 +0,0 @@
|
|
1
|
-
module Barometer
|
2
|
-
#
|
3
|
-
# Format: Weather ID (specific to weather.com)
|
4
|
-
#
|
5
|
-
# eg. USGA0028
|
6
|
-
#
|
7
|
-
# This class is used to determine if a query is a
|
8
|
-
# :weather_id, how to convert to and from :weather_id
|
9
|
-
# and what the country_code is.
|
10
|
-
#
|
11
|
-
class Query::Format::WeatherID < Query::Format
|
12
|
-
|
13
|
-
def self.format; :weather_id; end
|
14
|
-
def self.regex; /(^[A-Za-z]{4}[0-9]{4}$)/; end
|
15
|
-
def self.convertable_formats
|
16
|
-
[:short_zipcode, :zipcode, :coordinates, :icao, :geocode]
|
17
|
-
end
|
18
|
-
|
19
|
-
# the first two letters of the :weather_id is the country_code
|
20
|
-
#
|
21
|
-
def self.country_code(query=nil)
|
22
|
-
(query && query.size >= 2) ? _fix_country(query[0..1]) : nil
|
23
|
-
end
|
24
|
-
|
25
|
-
# convert to this format, X -> :weather_id
|
26
|
-
#
|
27
|
-
def self.to(original_query)
|
28
|
-
raise ArgumentError unless is_a_query?(original_query)
|
29
|
-
return nil unless converts?(original_query)
|
30
|
-
|
31
|
-
# convert original query to :geocode, as that is the only
|
32
|
-
# format we can convert directly from to weather_id
|
33
|
-
converted_query = Barometer::Query.new
|
34
|
-
converted_query = Query::Format::Geocode.to(original_query)
|
35
|
-
converted_query.q = _search(converted_query)
|
36
|
-
converted_query.format = format
|
37
|
-
converted_query.country_code = country_code(converted_query.q)
|
38
|
-
converted_query
|
39
|
-
end
|
40
|
-
|
41
|
-
# reverse lookup, :weather_id -> (:geocode || :coordinates)
|
42
|
-
#
|
43
|
-
def self.reverse(original_query)
|
44
|
-
raise ArgumentError unless is_a_query?(original_query)
|
45
|
-
return nil unless original_query.format == format
|
46
|
-
converted_query = Barometer::Query.new
|
47
|
-
converted_query.q = _reverse(original_query)
|
48
|
-
converted_query.format = Query::Format::Geocode.format
|
49
|
-
converted_query
|
50
|
-
end
|
51
|
-
|
52
|
-
private
|
53
|
-
|
54
|
-
# :geocode -> :weather_id
|
55
|
-
# search weather.com for the given query
|
56
|
-
#
|
57
|
-
def self._search(query=nil)
|
58
|
-
return nil unless query
|
59
|
-
raise ArgumentError unless is_a_query?(query)
|
60
|
-
response = WebService::WeatherID.fetch(query)
|
61
|
-
_parse_weather_id(response)
|
62
|
-
end
|
63
|
-
|
64
|
-
# :weather_id -> :geocode
|
65
|
-
# query yahoo with :weather_id and parse geo_data
|
66
|
-
#
|
67
|
-
def self._reverse(query=nil)
|
68
|
-
return nil unless query
|
69
|
-
raise ArgumentError unless is_a_query?(query)
|
70
|
-
response = WebService::WeatherID.reverse(query)
|
71
|
-
_parse_geocode(response)
|
72
|
-
end
|
73
|
-
|
74
|
-
# match the first :weather_id (from search results)
|
75
|
-
#
|
76
|
-
def self._parse_weather_id(text)
|
77
|
-
return nil unless text
|
78
|
-
match = text.match(/loc id=[\\]?['|""]([0-9a-zA-Z]*)[\\]?['|""]/)
|
79
|
-
match ? match[1] : nil
|
80
|
-
end
|
81
|
-
|
82
|
-
# parse the geo_data
|
83
|
-
#
|
84
|
-
def self._parse_geocode(text)
|
85
|
-
return nil unless text
|
86
|
-
output = [text["city"], text["region"], _fix_country(text["country"])]
|
87
|
-
output.delete("")
|
88
|
-
output.compact.join(', ')
|
89
|
-
end
|
90
|
-
|
91
|
-
end
|
92
|
-
end
|
@@ -1,150 +0,0 @@
|
|
1
|
-
module Barometer
|
2
|
-
#
|
3
|
-
# Format: WOEID
|
4
|
-
# "Where on Earth" ID (by Yahoo!)
|
5
|
-
#
|
6
|
-
# eg. 2459115, 615702 or w90210
|
7
|
-
#
|
8
|
-
# NOTE: zipcodes and WoeIDs can look exactly the same when the WoeID
|
9
|
-
# is 5 digits long. For now, a 5 digit number will be detected as
|
10
|
-
# zipcode. The way to override this is to prepend a number with the
|
11
|
-
# letter 'w'. Therefore 90210 will be a zipcode and w90210 will be
|
12
|
-
# a WoeID. In the future, if WoeIDs are moe popular then zipcodes,
|
13
|
-
# then I will reverse this ...
|
14
|
-
#
|
15
|
-
# This class is used to determine if a query is a
|
16
|
-
# :woe_id and how to convert to a :woe_id.
|
17
|
-
#
|
18
|
-
class Query::Format::WoeID < Query::Format
|
19
|
-
|
20
|
-
def self.format; :woe_id; end
|
21
|
-
def self.regex; /(^[0-9]{4}$)|(^[0-9]{6,7}$)|(^w[0-9]{4,7}$)/; end
|
22
|
-
def self.convertable_formats
|
23
|
-
[:short_zipcode, :zipcode, :weather_id, :coordinates, :icao, :geocode, :postalcode]
|
24
|
-
end
|
25
|
-
|
26
|
-
# remove the 'w' from applicable queries (only needed for detection)
|
27
|
-
#
|
28
|
-
def self.convert_query(text)
|
29
|
-
return nil unless text
|
30
|
-
text.delete('w')
|
31
|
-
end
|
32
|
-
|
33
|
-
# convert to this format, X -> :woeid
|
34
|
-
#
|
35
|
-
def self.to(original_query)
|
36
|
-
raise ArgumentError unless is_a_query?(original_query)
|
37
|
-
return nil unless converts?(original_query)
|
38
|
-
|
39
|
-
# pre-convert (:weather_id -> :geocode)
|
40
|
-
#
|
41
|
-
pre_query = nil
|
42
|
-
if original_query.format == :weather_id
|
43
|
-
pre_query = Barometer::Query::Format::WeatherID.reverse(original_query)
|
44
|
-
end
|
45
|
-
|
46
|
-
# pre-convert ([:short_zipcode, :zipcode, :postalcode, :icao] -> :geocode)
|
47
|
-
#
|
48
|
-
unless pre_query
|
49
|
-
if [:short_zipcode, :zipcode, :icao].include?(original_query.format)
|
50
|
-
unless pre_query = original_query.get_conversion(Barometer::Query::Format::Geocode.format)
|
51
|
-
pre_query = Barometer::Query::Format::Geocode.to(original_query)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
converted_query = Barometer::Query.new
|
57
|
-
converted_query.country_code = original_query.country_code if original_query
|
58
|
-
|
59
|
-
# TODO
|
60
|
-
# use Geomojo.com (when no Yahoo! appid)
|
61
|
-
#
|
62
|
-
# if [:coordinates].include?(pre_query ? pre_query.format : original_query.format) &&
|
63
|
-
# Barometer.yahoo_placemaker_app_id.nil?
|
64
|
-
# converted_query.q = _query_geomojo(pre_query || original_query)
|
65
|
-
# converted_query.format = format
|
66
|
-
# end
|
67
|
-
|
68
|
-
# use Yahoo! Placemaker
|
69
|
-
#
|
70
|
-
if [:coordinates, :geocode, :postalcode].include?(pre_query ? pre_query.format : original_query.format) &&
|
71
|
-
!Barometer.yahoo_placemaker_app_id.nil?
|
72
|
-
converted_query.q = _query_placemaker(pre_query || original_query)
|
73
|
-
converted_query.format = format
|
74
|
-
end
|
75
|
-
|
76
|
-
converted_query.geo = pre_query.geo if pre_query
|
77
|
-
converted_query.country_code = pre_query.country_code if pre_query
|
78
|
-
converted_query
|
79
|
-
end
|
80
|
-
|
81
|
-
# reverse lookup, :woe_id -> (:geocode || :coordinates)
|
82
|
-
#
|
83
|
-
def self.reverse(original_query)
|
84
|
-
raise ArgumentError unless is_a_query?(original_query)
|
85
|
-
return nil unless original_query.format == self.format
|
86
|
-
converted_query = Barometer::Query.new
|
87
|
-
converted_query.q = _reverse(original_query)
|
88
|
-
converted_query.format = Barometer::Query::Format::Geocode.format
|
89
|
-
converted_query
|
90
|
-
end
|
91
|
-
|
92
|
-
private
|
93
|
-
|
94
|
-
# Yahoo! Placemaker
|
95
|
-
# [:geocode,:coordinates] -> :woe_id
|
96
|
-
#
|
97
|
-
def self._query_placemaker(query=nil)
|
98
|
-
return nil unless query
|
99
|
-
raise ArgumentError unless is_a_query?(query)
|
100
|
-
doc = Barometer::WebService::Placemaker.fetch(query)
|
101
|
-
_parse_woe_from_placemaker(doc)
|
102
|
-
end
|
103
|
-
|
104
|
-
# Geomojo.com
|
105
|
-
# [:coordinates] -> :woe_id
|
106
|
-
#
|
107
|
-
# def self._query_geomojo(query=nil)
|
108
|
-
# return nil unless query
|
109
|
-
# raise ArgumentError unless is_a_query?(query)
|
110
|
-
# doc = WebService::Geomojo.fetch(query)
|
111
|
-
# _parse_woe_from_geomojo(doc)
|
112
|
-
# end
|
113
|
-
|
114
|
-
# :woe_id -> :geocode
|
115
|
-
# query yahoo with :woe_id and parse geo_data
|
116
|
-
#
|
117
|
-
def self._reverse(query=nil)
|
118
|
-
return nil unless query
|
119
|
-
raise ArgumentError unless is_a_query?(query)
|
120
|
-
response = Barometer::WebService::Placemaker.reverse(query)
|
121
|
-
_parse_geocode(response)
|
122
|
-
end
|
123
|
-
|
124
|
-
# match the first :woe_id (from search results)
|
125
|
-
# expects a Nokogiri doc
|
126
|
-
#
|
127
|
-
def self._parse_woe_from_placemaker(doc)
|
128
|
-
return nil unless doc
|
129
|
-
Barometer::WebService::Placemaker.parse_woe_id(doc)
|
130
|
-
end
|
131
|
-
|
132
|
-
# match the first :woe_id (from search results)
|
133
|
-
# expects a Nokogiri doc
|
134
|
-
#
|
135
|
-
# def self._parse_woe_from_geomojo(doc)
|
136
|
-
# return nil unless doc
|
137
|
-
# WebService::Geomojo.parse_woe_id(doc)
|
138
|
-
# end
|
139
|
-
|
140
|
-
# parse the geo_data
|
141
|
-
#
|
142
|
-
def self._parse_geocode(text)
|
143
|
-
return nil unless text
|
144
|
-
output = [text["city"], text["region"], _fix_country(text["country"])]
|
145
|
-
output.delete("")
|
146
|
-
output.compact.join(', ')
|
147
|
-
end
|
148
|
-
|
149
|
-
end
|
150
|
-
end
|