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/data/zone.rb
CHANGED
@@ -1,141 +1,138 @@
|
|
1
|
-
require 'rubygems'
|
2
1
|
require 'tzinfo'
|
2
|
+
require 'delegate'
|
3
3
|
|
4
4
|
module Barometer
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
attr_accessor :zone_full, :zone_code, :zone_offset, :tz
|
19
|
-
|
20
|
-
def initialize(zone)
|
21
|
-
if Data::Zone.is_zone_full?(zone)
|
22
|
-
@zone_full = zone
|
23
|
-
@tz = TZInfo::Timezone.get(zone)
|
24
|
-
elsif Data::Zone.is_zone_offset?(zone)
|
25
|
-
@zone_offset = zone
|
26
|
-
elsif Data::Zone.is_zone_code?(zone)
|
27
|
-
@zone_code = zone
|
28
|
-
else
|
29
|
-
raise(ArgumentError, "invalid time zone")
|
5
|
+
module Data
|
6
|
+
class Zone < SimpleDelegator
|
7
|
+
def initialize(zone)
|
8
|
+
zone = if ZoneFull.detect?(zone)
|
9
|
+
ZoneFull.new(zone)
|
10
|
+
elsif ZoneOffset.detect?(zone)
|
11
|
+
ZoneOffset.new(zone)
|
12
|
+
elsif ZoneCode.detect?(zone)
|
13
|
+
ZoneCode.new(zone)
|
14
|
+
else
|
15
|
+
raise(ArgumentError, "invalid time zone")
|
16
|
+
end
|
17
|
+
super(zone)
|
30
18
|
end
|
31
19
|
end
|
32
20
|
|
33
|
-
|
34
|
-
|
35
|
-
|
21
|
+
class ZoneFull
|
22
|
+
def self.detect?(zone)
|
23
|
+
zone.respond_to?(:match) && !!zone.match(/^[A-Za-z]+\/[A-Za-z_]+$/)
|
24
|
+
end
|
36
25
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
end
|
26
|
+
def initialize(zone, time_class=::Time)
|
27
|
+
@zone = zone
|
28
|
+
@time_class = time_class
|
29
|
+
@tz = TZInfo::Timezone.get(zone)
|
30
|
+
end
|
43
31
|
|
44
|
-
|
45
|
-
|
46
|
-
|
32
|
+
def code
|
33
|
+
tz.period_for_utc(time_class.now.utc).zone_identifier.to_s
|
34
|
+
end
|
47
35
|
|
48
|
-
|
49
|
-
|
50
|
-
@zone_offset.to_f * 60 * 60
|
51
|
-
elsif @zone_code
|
52
|
-
Data::Zone.zone_to_offset(@zone_code)
|
53
|
-
elsif @zone_full
|
36
|
+
def offset
|
37
|
+
tz.period_for_utc(time_class.now.utc).utc_total_offset
|
54
38
|
end
|
55
|
-
end
|
56
39
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
@tz.period_for_utc(Time.now.utc).dst?
|
61
|
-
end
|
40
|
+
def now
|
41
|
+
tz.utc_to_local(time_class.now.utc)
|
42
|
+
end
|
62
43
|
|
63
|
-
|
64
|
-
|
65
|
-
if @zone_full
|
66
|
-
now = @tz.utc_to_local(Time.now.utc)
|
67
|
-
elsif @zone_offset || @zone_code
|
68
|
-
now = Time.now.utc + self.offset
|
44
|
+
def to_s
|
45
|
+
zone
|
69
46
|
end
|
70
|
-
convert ? Data::LocalTime.parse(now) : now
|
71
|
-
end
|
72
47
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
Date.new(now.year, now.month, now.day)
|
77
|
-
end
|
48
|
+
def local_to_utc(local_time)
|
49
|
+
tz.local_to_utc(local_time)
|
50
|
+
end
|
78
51
|
|
79
|
-
|
80
|
-
|
81
|
-
@tz.local_to_utc(local_time)
|
82
|
-
elsif @zone_offset || @zone_code
|
83
|
-
local_time -= self.offset
|
84
|
-
Time.utc(local_time.year,local_time.month,local_time.day,
|
85
|
-
local_time.hour,local_time.min,local_time.sec)
|
52
|
+
def utc_to_local(utc_time)
|
53
|
+
tz.utc_to_local(utc_time)
|
86
54
|
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
attr_reader :zone, :tz, :time_class
|
87
59
|
end
|
88
60
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
elsif @zone_offset || @zone_code
|
93
|
-
utc_time + self.offset
|
61
|
+
class ZoneOffset
|
62
|
+
def self.detect?(zone)
|
63
|
+
zone.respond_to?(:abs) && zone.abs <= 14
|
94
64
|
end
|
95
|
-
end
|
96
65
|
|
97
|
-
|
98
|
-
|
99
|
-
|
66
|
+
def initialize(zone, time_class=::Time)
|
67
|
+
@zone = zone
|
68
|
+
@time_class = time_class
|
69
|
+
end
|
100
70
|
|
101
|
-
|
102
|
-
|
103
|
-
_load_zone_codes unless @@zone_codes
|
104
|
-
Time.zone_offset(zone) || (@@zone_codes && @@zone_codes.has_key?(zone))
|
105
|
-
end
|
71
|
+
def code
|
72
|
+
end
|
106
73
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
end
|
74
|
+
def offset
|
75
|
+
zone.to_f * 60 * 60
|
76
|
+
end
|
111
77
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
end
|
78
|
+
def now
|
79
|
+
time_class.now.utc + offset
|
80
|
+
end
|
116
81
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
offset = (@@zone_codes[timezone.to_s.upcase] || 0) * seconds_in_hour
|
131
|
-
end
|
132
|
-
offset
|
133
|
-
end
|
82
|
+
def to_s
|
83
|
+
zone.to_s
|
84
|
+
end
|
85
|
+
|
86
|
+
def local_to_utc(local_time)
|
87
|
+
local_time - offset
|
88
|
+
end
|
89
|
+
|
90
|
+
def utc_to_local(utc_time)
|
91
|
+
utc_time + offset
|
92
|
+
end
|
93
|
+
|
94
|
+
private
|
134
95
|
|
135
|
-
|
136
|
-
$:.unshift(File.dirname(__FILE__))
|
137
|
-
@@zone_codes ||= YAML.load_file(@@zone_codes_file)
|
96
|
+
attr_reader :zone, :time_class
|
138
97
|
end
|
139
98
|
|
99
|
+
class ZoneCode
|
100
|
+
def self.detect?(zone)
|
101
|
+
zone.respond_to?(:to_s) && Utils::ZoneCodeLookup.exists?(zone.to_s)
|
102
|
+
end
|
103
|
+
|
104
|
+
def initialize(zone, time_class=::Time)
|
105
|
+
@zone = zone
|
106
|
+
@time_class = time_class
|
107
|
+
end
|
108
|
+
|
109
|
+
def code
|
110
|
+
zone
|
111
|
+
end
|
112
|
+
|
113
|
+
def offset
|
114
|
+
Utils::ZoneCodeLookup.offset(zone)
|
115
|
+
end
|
116
|
+
|
117
|
+
def now
|
118
|
+
time_class.now.utc + offset
|
119
|
+
end
|
120
|
+
|
121
|
+
def to_s
|
122
|
+
zone
|
123
|
+
end
|
124
|
+
|
125
|
+
def local_to_utc(local_time)
|
126
|
+
local_time - offset
|
127
|
+
end
|
128
|
+
|
129
|
+
def utc_to_local(utc_time)
|
130
|
+
utc_time + offset
|
131
|
+
end
|
132
|
+
|
133
|
+
private
|
134
|
+
|
135
|
+
attr_reader :zone, :time_class
|
136
|
+
end
|
140
137
|
end
|
141
138
|
end
|
data/lib/barometer/query.rb
CHANGED
@@ -1,172 +1,34 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
#
|
6
|
-
# Summary:
|
7
|
-
# When you create a new Query, you set the query string
|
8
|
-
# ie: "New York, NY" or "90210"
|
9
|
-
# The class will then determine the query string format
|
10
|
-
# ie: :zipcode, :postalcode, :geocode, :coordinates
|
11
|
-
# Now, when a Weather API driver asks for the query, it will prefer
|
12
|
-
# certain formats, and only permit certain formats. The Query class
|
13
|
-
# will attempt to either return the query string as-is if acceptable,
|
14
|
-
# or it will attempt to convert it to a format that is acceptable
|
15
|
-
# (most likely this conversion will use Googles geocoding service using
|
16
|
-
# the Graticule gem). Worst case scenario is that the Weather API will
|
17
|
-
# not accept the query string.
|
18
|
-
#
|
19
|
-
class Query
|
20
|
-
|
21
|
-
# This array defines the order to check a query for the format
|
22
|
-
#
|
23
|
-
FORMATS = %w(
|
24
|
-
ShortZipcode Zipcode Postalcode WeatherID Coordinates Icao WoeID Geocode
|
25
|
-
)
|
26
|
-
FORMAT_MAP = {
|
27
|
-
:short_zipcode => "ShortZipcode", :zipcode => "Zipcode",
|
28
|
-
:postalcode => "Postalcode", :weather_id => "WeatherID",
|
29
|
-
:coordinates => "Coordinates", :icao => "Icao",
|
30
|
-
:woe_id => "WoeID", :geocode => "Geocode"
|
31
|
-
}
|
32
|
-
|
33
|
-
attr_writer :q
|
34
|
-
attr_accessor :format, :country_code
|
35
|
-
attr_accessor :geo, :timezone, :conversions
|
1
|
+
require_relative 'query/base'
|
2
|
+
require_relative 'query/format'
|
3
|
+
require_relative 'query/converter'
|
4
|
+
require_relative 'query/service'
|
36
5
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
6
|
+
module Barometer
|
7
|
+
class ConvertedQuery
|
8
|
+
attr_reader :q, :format, :units, :geo
|
9
|
+
|
10
|
+
def initialize(q, format, units=:metric, geo=nil)
|
11
|
+
@q = q
|
12
|
+
@format = format
|
13
|
+
@units = units
|
14
|
+
@geo = geo
|
42
15
|
end
|
43
16
|
|
44
|
-
def
|
45
|
-
|
17
|
+
def metric?
|
18
|
+
units == :metric
|
46
19
|
end
|
47
20
|
|
48
|
-
|
49
|
-
|
50
|
-
# until th right one is found
|
51
|
-
#
|
52
|
-
def analyze!
|
53
|
-
return unless @q
|
54
|
-
FORMATS.each do |format|
|
55
|
-
if Query::Format.const_get(format.to_s).is?(@q)
|
56
|
-
@format = Query::Format.const_get(format.to_s).format
|
57
|
-
@country_code = Query::Format.const_get(format.to_s).country_code(@q)
|
58
|
-
break
|
59
|
-
end
|
60
|
-
end
|
21
|
+
def to_s
|
22
|
+
@q
|
61
23
|
end
|
62
|
-
|
63
|
-
# take a list of acceptable (and ordered by preference) formats and convert
|
64
|
-
# the current query (q) into the most preferred and acceptable format. a
|
65
|
-
# side effect of the conversions may reveal the country_code, if so save it
|
66
|
-
#
|
67
|
-
def convert!(preferred_formats=nil)
|
68
|
-
raise ArgumentError unless (preferred_formats && preferred_formats.size > 0)
|
69
|
-
|
70
|
-
# why convert if we are already there?
|
71
|
-
# (except in the case that the serivce excepts coordinates and we have a
|
72
|
-
# a geocode ... the google geocode results are superior)
|
73
|
-
#
|
74
|
-
skip_conversion = false
|
75
|
-
unless (@format.to_sym == Query::Format::Geocode.format) &&
|
76
|
-
preferred_formats.include?(Query::Format::Coordinates.format)
|
77
|
-
if preferred_formats.include?(@format.to_sym)
|
78
|
-
skip_conversion = true
|
79
|
-
converted_query = self.dup
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
unless skip_conversion
|
84
|
-
# go through each acceptable format and try to convert to that
|
85
|
-
converted = false
|
86
|
-
converted_query = Barometer::Query.new
|
87
|
-
preferred_formats.each do |preferred_format|
|
88
|
-
klass = FORMAT_MAP[preferred_format.to_sym]
|
89
|
-
# if we discover that the format we have is the preferred format, return it
|
90
|
-
if preferred_format == @format
|
91
|
-
converted = true
|
92
|
-
converted_query = Barometer::Query.new(@q)
|
93
|
-
end
|
94
|
-
unless converted
|
95
|
-
unless converted_query = get_conversion(preferred_format)
|
96
|
-
converted_query = Query::Format.const_get(klass.to_s).to(self)
|
97
|
-
end
|
98
|
-
converted = true if converted_query
|
99
|
-
end
|
100
|
-
if converted
|
101
|
-
converted_query.country_code ||= Query::Format.const_get(klass.to_s).country_code(converted_query.q)
|
102
|
-
post_conversion(converted_query)
|
103
|
-
break
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
# force geocode?, unless we already did
|
109
|
-
#
|
110
|
-
if Barometer.force_geocode && !@geo
|
111
|
-
if converted_query && converted_query.geo
|
112
|
-
@geo = converted_query.geo
|
113
|
-
elsif converted_query
|
114
|
-
puts "enhance geocode: #{converted_query.q}" if Barometer::debug?
|
115
|
-
geo_query = Query::Format::Coordinates.to(converted_query)
|
116
|
-
@geo = geo_query.geo if (geo_query && geo_query.geo)
|
117
|
-
converted_query.geo = @geo.dup
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
# enhance timezone?, unless we already did
|
122
|
-
#
|
123
|
-
if Barometer.enhance_timezone && !@timezone
|
124
|
-
if converted_query && converted_query.timezone
|
125
|
-
@geo = converted_query.timezone
|
126
|
-
elsif @geo && @geo.latitude && @geo.longitude
|
127
|
-
puts "enhance timezone: #{@geo.latitude}, #{@geo.longitude}" if Barometer::debug?
|
128
|
-
@timezone = WebService::Timezone.fetch(@geo.latitude,@geo.longitude)
|
129
|
-
converted_query.timezone = @timezone.dup
|
130
|
-
end
|
131
|
-
end
|
132
|
-
|
133
|
-
converted_query
|
134
|
-
end
|
135
|
-
|
136
|
-
# save the important parts of the conversion ... by saving conversion we
|
137
|
-
# can avoid doing the same conversion multiple times
|
138
|
-
#
|
139
|
-
def post_conversion(converted_query)
|
140
|
-
return unless (converted_query && converted_query.q && converted_query.format)
|
141
|
-
@conversions = {} unless @conversions
|
142
|
-
return if @conversions.has_key?(converted_query.format.to_sym)
|
143
|
-
puts "store: #{self.format} -> #{converted_query.format.to_sym} = #{self.q} -> #{converted_query.q}" if Barometer::debug?
|
144
|
-
@conversions[converted_query.format.to_sym] = converted_query.q
|
145
|
-
end
|
146
|
-
|
147
|
-
def get_conversion(format)
|
148
|
-
return nil unless format && @conversions
|
149
|
-
puts "found: #{self.format} -> #{format.to_sym} = #{self.q} -> #{@conversions[format.to_sym]}" if Barometer::debug? && @conversions.has_key?(format.to_sym)
|
150
|
-
# re-constuct converted query
|
151
|
-
if q = @conversions[format.to_sym]
|
152
|
-
converted_query = self.dup
|
153
|
-
converted_query.q = q
|
154
|
-
converted_query.format = format
|
155
|
-
converted_query
|
156
|
-
else
|
157
|
-
nil
|
158
24
|
end
|
159
|
-
end
|
160
25
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
end
|
165
|
-
|
166
|
-
def longitude
|
167
|
-
return nil unless self.format == Query::Format::Coordinates.format
|
168
|
-
Query::Format::Coordinates.parse_longitude(self.q)
|
169
|
-
end
|
26
|
+
module Query
|
27
|
+
class ConversionNotPossible < StandardError; end
|
28
|
+
class UnsupportedRegion < StandardError; end
|
170
29
|
|
30
|
+
def self.new(*args)
|
31
|
+
Barometer::Query::Base.new(*args)
|
32
|
+
end
|
171
33
|
end
|
172
34
|
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module Barometer
|
2
|
+
module Query
|
3
|
+
class Base
|
4
|
+
attr_reader :format, :geo, :units
|
5
|
+
|
6
|
+
def initialize(query, units=:metric)
|
7
|
+
@q = query.dup
|
8
|
+
@units = units
|
9
|
+
@geo = Data::Geo.new
|
10
|
+
detect_format
|
11
|
+
freeze_query
|
12
|
+
@conversions = {}
|
13
|
+
end
|
14
|
+
|
15
|
+
def q
|
16
|
+
@format_klass.convert_query(@q)
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_conversion(format, q)
|
20
|
+
return unless q
|
21
|
+
|
22
|
+
@conversions[format] = q
|
23
|
+
converted_query(q, format)
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_conversion(*formats)
|
27
|
+
converted_format = formats.detect{|f| format == f || @conversions.has_key?(f)}
|
28
|
+
return unless converted_format
|
29
|
+
|
30
|
+
if converted_format == format
|
31
|
+
self
|
32
|
+
else
|
33
|
+
converted_query(@conversions[converted_format], converted_format)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def convert!(*preferred_formats)
|
38
|
+
return self if preferred_formats.include?(format)
|
39
|
+
|
40
|
+
get_conversion(*preferred_formats) ||
|
41
|
+
do_conversion(format, preferred_formats) ||
|
42
|
+
raise(ConversionNotPossible)
|
43
|
+
end
|
44
|
+
|
45
|
+
def metric?
|
46
|
+
units == :metric
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_s
|
50
|
+
q.to_s
|
51
|
+
end
|
52
|
+
|
53
|
+
def geo=(geo)
|
54
|
+
@geo = @geo.merge(geo)
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def converted_query(q, format)
|
60
|
+
ConvertedQuery.new(q, format, units, geo)
|
61
|
+
end
|
62
|
+
|
63
|
+
def detect_format
|
64
|
+
Format.match?(@q) do |key, klass|
|
65
|
+
@format = key
|
66
|
+
@geo = Data::Geo.new(country_code: klass.country_code(@q))
|
67
|
+
@format_klass = klass
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def freeze_query
|
72
|
+
@q.freeze
|
73
|
+
@format.freeze
|
74
|
+
@units.freeze
|
75
|
+
end
|
76
|
+
|
77
|
+
def do_conversion(format, preferred_formats)
|
78
|
+
converters = Converter.find_all(format, preferred_formats)
|
79
|
+
result = converters.map do |converter|
|
80
|
+
to_format = converter.keys.first
|
81
|
+
converter_klass = converter.values.first
|
82
|
+
get_conversion(to_format) || converter_klass.new(self).call
|
83
|
+
end.last
|
84
|
+
get_conversion(*preferred_formats) || result
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|