barometer 0.8.0 → 0.9.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/.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
|