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
@@ -1,31 +0,0 @@
|
|
1
|
-
module Barometer
|
2
|
-
#
|
3
|
-
# Format: Zip Code
|
4
|
-
#
|
5
|
-
# eg. 90210 or 90210-5555
|
6
|
-
#
|
7
|
-
# This class is used to determine if a query is a
|
8
|
-
# :zip_code, how to convert to a :zip_code
|
9
|
-
# and what the country_code is.
|
10
|
-
#
|
11
|
-
class Query::Format::Zipcode < Query::Format
|
12
|
-
|
13
|
-
def self.format; :zipcode; end
|
14
|
-
def self.country_code(query=nil); "US"; end
|
15
|
-
def self.regex; /(^[0-9]{5}$)|(^[0-9]{5}-[0-9]{4}$)/; end
|
16
|
-
def self.convertable_formats; [:short_zipcode]; end
|
17
|
-
|
18
|
-
# convert to this format, X -> :zipcode
|
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
|
-
converted_query.q = original_query.q
|
25
|
-
converted_query.format = format
|
26
|
-
converted_query.country_code = country_code(converted_query.q)
|
27
|
-
converted_query
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
31
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Barometer
|
2
|
-
KEY_FILE = File.expand_path(File.join('~', '.barometer'))
|
3
|
-
|
4
|
-
class KeyFileParser
|
5
|
-
def self.find(*paths)
|
6
|
-
if File.exists?(KEY_FILE)
|
7
|
-
keys = YAML.load_file(KEY_FILE)
|
8
|
-
|
9
|
-
paths.each do |path|
|
10
|
-
if keys && keys.has_key?(path.to_s)
|
11
|
-
keys = keys.fetch(path.to_s)
|
12
|
-
else
|
13
|
-
keys = nil
|
14
|
-
end
|
15
|
-
end
|
16
|
-
keys
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,202 +0,0 @@
|
|
1
|
-
module Barometer
|
2
|
-
#
|
3
|
-
# Measurement
|
4
|
-
# a class that holds the response from a weather service
|
5
|
-
#
|
6
|
-
# its main purpose is to hold all the data collected from a single weather
|
7
|
-
# service as it is passed to the weather object
|
8
|
-
#
|
9
|
-
# this response includes
|
10
|
-
# - current weather data (using the CurrentMeasurement class)
|
11
|
-
# - forecasted weather data (an Array of instances of the ForecastMeasurement class)
|
12
|
-
# - time_zone information (for the location in question)
|
13
|
-
# - weather station information (for the station that gave collected the data)
|
14
|
-
#
|
15
|
-
class Measurement
|
16
|
-
|
17
|
-
attr_reader :source, :weight
|
18
|
-
attr_reader :measured_at, :utc_time_stamp
|
19
|
-
attr_reader :current, :forecast
|
20
|
-
attr_reader :timezone, :station, :location, :links
|
21
|
-
attr_reader :success
|
22
|
-
attr_accessor :metric, :query, :format
|
23
|
-
attr_accessor :start_at, :end_at
|
24
|
-
|
25
|
-
def initialize(source=nil, metric=true)
|
26
|
-
@source = source
|
27
|
-
@metric = metric
|
28
|
-
@success = false
|
29
|
-
@weight = 1
|
30
|
-
@links = {}
|
31
|
-
end
|
32
|
-
|
33
|
-
def success!
|
34
|
-
current && current.temperature &&
|
35
|
-
!current.temperature.c.nil? && @success = true
|
36
|
-
end
|
37
|
-
|
38
|
-
def stamp!; @utc_time_stamp = Time.now.utc; end
|
39
|
-
def success?; @success; end
|
40
|
-
def metric?; @metric; end
|
41
|
-
def metric!; @metric=true; end
|
42
|
-
def imperial!; @metric=false; end
|
43
|
-
def now; timezone ? timezone.now : nil; end
|
44
|
-
|
45
|
-
#
|
46
|
-
# this will tell us if the measurement is still current ... if it is still
|
47
|
-
# current this means that the CurrentMeasurement can still used as now
|
48
|
-
#
|
49
|
-
# what it also means is that if you took a measurement right now (time = now)
|
50
|
-
# and then asked if current?(time_in_future) that current? would be true for
|
51
|
-
# any time_in_future within 4 hours of now
|
52
|
-
#
|
53
|
-
# where is this useful? lets say you take the measurement now (time = now),
|
54
|
-
# and then you want to know if self.windy?(5_hours_in_future) ... we could
|
55
|
-
# not use the current data for this answser as the time 5_hours_in_future
|
56
|
-
# is not current
|
57
|
-
#
|
58
|
-
def current?(local_time=nil)
|
59
|
-
current_at = ((self.current && self.current.current_at) ?
|
60
|
-
self.current.current_at : self.measured_at)
|
61
|
-
|
62
|
-
local_time = (local_time.nil? ? current_at : Data::LocalTime.parse(local_time))
|
63
|
-
return true unless local_time
|
64
|
-
raise ArgumentError unless local_time.is_a?(Data::LocalTime)
|
65
|
-
|
66
|
-
hours_still_current = 4
|
67
|
-
difference = (local_time.diff(current_at)).to_i.abs
|
68
|
-
difference <= (60*60*hours_still_current).to_i
|
69
|
-
end
|
70
|
-
|
71
|
-
#
|
72
|
-
# Returns a forecast for a day given by a Date, DateTime,
|
73
|
-
# Time, or a string that can be parsed to a date
|
74
|
-
#
|
75
|
-
def for(date=nil)
|
76
|
-
date = @timezone.today unless date || !@timezone
|
77
|
-
date ||= Date.today
|
78
|
-
return nil unless (@forecast && @forecast.size > 0)
|
79
|
-
|
80
|
-
@forecast.for(date)
|
81
|
-
end
|
82
|
-
|
83
|
-
#
|
84
|
-
# accesors (with input checking)
|
85
|
-
#
|
86
|
-
|
87
|
-
def source=(source)
|
88
|
-
raise ArgumentError unless source.is_a?(Symbol)
|
89
|
-
@source = source
|
90
|
-
end
|
91
|
-
|
92
|
-
def utc_time_stamp=(time=Time.now.utc)
|
93
|
-
raise ArgumentError unless time.is_a?(Time)
|
94
|
-
@utc_time_stamp = time
|
95
|
-
end
|
96
|
-
|
97
|
-
def current=(current)
|
98
|
-
raise ArgumentError unless current.is_a?(Measurement::Result)
|
99
|
-
@current = current
|
100
|
-
self.stamp!
|
101
|
-
self.success!
|
102
|
-
end
|
103
|
-
|
104
|
-
def forecast=(forecast)
|
105
|
-
raise ArgumentError unless forecast.is_a?(Measurement::ResultArray)
|
106
|
-
@forecast = forecast
|
107
|
-
end
|
108
|
-
|
109
|
-
def timezone=(timezone)
|
110
|
-
return unless timezone
|
111
|
-
raise ArgumentError unless timezone.is_a?(Data::Zone)
|
112
|
-
@timezone = timezone
|
113
|
-
end
|
114
|
-
|
115
|
-
def station=(station)
|
116
|
-
raise ArgumentError unless station.is_a?(Data::Location)
|
117
|
-
@station = station
|
118
|
-
end
|
119
|
-
|
120
|
-
def location=(location)
|
121
|
-
raise ArgumentError unless location.is_a?(Data::Location)
|
122
|
-
@location = location
|
123
|
-
end
|
124
|
-
|
125
|
-
def weight=(weight)
|
126
|
-
raise ArgumentError unless weight.is_a?(Fixnum)
|
127
|
-
@weight = weight
|
128
|
-
end
|
129
|
-
|
130
|
-
def links=(links)
|
131
|
-
raise ArgumentError unless links.is_a?(Hash)
|
132
|
-
@links = links
|
133
|
-
end
|
134
|
-
|
135
|
-
def measured_at=(measured_at)
|
136
|
-
raise ArgumentError unless measured_at.is_a?(Data::LocalTime)
|
137
|
-
@measured_at = measured_at
|
138
|
-
end
|
139
|
-
|
140
|
-
#
|
141
|
-
# simple questions
|
142
|
-
#
|
143
|
-
|
144
|
-
def windy?(time_string=nil, threshold=10)
|
145
|
-
time_string ||= (measured_at || now)
|
146
|
-
local_time = Data::LocalTime.parse(time_string)
|
147
|
-
|
148
|
-
if current?(local_time)
|
149
|
-
return nil unless current
|
150
|
-
current.windy?(threshold)
|
151
|
-
else
|
152
|
-
return nil unless forecast && (future = forecast[local_time])
|
153
|
-
future.windy?(threshold)
|
154
|
-
end
|
155
|
-
end
|
156
|
-
|
157
|
-
def day?(time_string=nil)
|
158
|
-
time_string ||= (measured_at || now)
|
159
|
-
local_time = Data::LocalTime.parse(time_string)
|
160
|
-
|
161
|
-
if current?(local_time)
|
162
|
-
return nil unless current
|
163
|
-
current.day?(local_time)
|
164
|
-
else
|
165
|
-
return nil unless forecast && (future = forecast[local_time])
|
166
|
-
future.day?(local_time)
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
def sunny?(time_string=nil)
|
171
|
-
time_string ||= (measured_at || now)
|
172
|
-
local_time = Data::LocalTime.parse(time_string)
|
173
|
-
sunny_icons = Barometer::WeatherService.source(@source)._sunny_icon_codes
|
174
|
-
|
175
|
-
is_day = day?(local_time)
|
176
|
-
return is_day unless is_day
|
177
|
-
|
178
|
-
if current?(local_time)
|
179
|
-
return nil unless current
|
180
|
-
current.sunny?(local_time, sunny_icons)
|
181
|
-
else
|
182
|
-
return nil unless forecast && (future = forecast[local_time])
|
183
|
-
future.sunny?(local_time, sunny_icons)
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
def wet?(time_string=nil, pop_threshold=50, humidity_threshold=99)
|
188
|
-
time_string ||= (measured_at || now)
|
189
|
-
local_time = Data::LocalTime.parse(time_string)
|
190
|
-
wet_icons = Barometer::WeatherService.source(@source)._wet_icon_codes
|
191
|
-
|
192
|
-
if current?(local_time)
|
193
|
-
return nil unless current
|
194
|
-
current.wet?(wet_icons, humidity_threshold)
|
195
|
-
else
|
196
|
-
return nil unless forecast && (future = forecast[local_time])
|
197
|
-
future.wet?(wet_icons, pop_threshold, humidity_threshold)
|
198
|
-
end
|
199
|
-
end
|
200
|
-
|
201
|
-
end
|
202
|
-
end
|
@@ -1,207 +0,0 @@
|
|
1
|
-
module Barometer
|
2
|
-
#
|
3
|
-
# Result Measurement
|
4
|
-
# a data class for resulting weather conditions
|
5
|
-
#
|
6
|
-
# This is basically a data holding class for the resulting weather
|
7
|
-
# conditions.
|
8
|
-
#
|
9
|
-
class Measurement::Result
|
10
|
-
|
11
|
-
attr_reader :current_at, :updated_at
|
12
|
-
attr_reader :valid_start_date, :valid_end_date, :date
|
13
|
-
attr_reader :humidity, :icon, :condition
|
14
|
-
attr_reader :temperature, :dew_point, :heat_index, :wind_chill
|
15
|
-
attr_reader :low, :high, :pop
|
16
|
-
attr_reader :wind, :sun, :pressure, :visibility
|
17
|
-
attr_accessor :metric, :description
|
18
|
-
|
19
|
-
def initialize(metric=true); @metric = metric; end
|
20
|
-
|
21
|
-
# accessors (with input checking)
|
22
|
-
#
|
23
|
-
def temperature=(temperature)
|
24
|
-
raise ArgumentError unless temperature.is_a?(Data::Temperature)
|
25
|
-
@temperature = temperature
|
26
|
-
end
|
27
|
-
|
28
|
-
def dew_point=(dew_point)
|
29
|
-
raise ArgumentError unless dew_point.is_a?(Data::Temperature)
|
30
|
-
@dew_point = dew_point
|
31
|
-
end
|
32
|
-
|
33
|
-
def heat_index=(heat_index)
|
34
|
-
raise ArgumentError unless heat_index.is_a?(Data::Temperature)
|
35
|
-
@heat_index = heat_index
|
36
|
-
end
|
37
|
-
|
38
|
-
def wind_chill=(wind_chill)
|
39
|
-
raise ArgumentError unless wind_chill.is_a?(Data::Temperature)
|
40
|
-
@wind_chill = wind_chill
|
41
|
-
end
|
42
|
-
|
43
|
-
def pressure=(pressure)
|
44
|
-
raise ArgumentError unless pressure.is_a?(Data::Pressure)
|
45
|
-
@pressure = pressure
|
46
|
-
end
|
47
|
-
|
48
|
-
def visibility=(visibility)
|
49
|
-
raise ArgumentError unless visibility.is_a?(Data::Distance)
|
50
|
-
@visibility = visibility
|
51
|
-
end
|
52
|
-
|
53
|
-
def current_at=(current_at)
|
54
|
-
raise ArgumentError unless (current_at.is_a?(Data::LocalTime) || current_at.is_a?(Data::LocalDateTime))
|
55
|
-
@current_at = current_at
|
56
|
-
end
|
57
|
-
|
58
|
-
def updated_at=(updated_at)
|
59
|
-
raise ArgumentError unless (updated_at.is_a?(Data::LocalTime) || updated_at.is_a?(Data::LocalDateTime))
|
60
|
-
@updated_at = updated_at
|
61
|
-
end
|
62
|
-
|
63
|
-
def date=(date)
|
64
|
-
raise ArgumentError unless date.is_a?(Date)
|
65
|
-
@date = date
|
66
|
-
@valid_start_date = Data::LocalDateTime.new(date.year,date.month,date.day,0,0,0)
|
67
|
-
@valid_end_date = Data::LocalDateTime.new(date.year,date.month,date.day,23,59,59)
|
68
|
-
end
|
69
|
-
|
70
|
-
def valid_start_date=(date)
|
71
|
-
raise ArgumentError unless date.is_a?(Data::LocalDateTime)
|
72
|
-
@valid_start_date = date
|
73
|
-
end
|
74
|
-
|
75
|
-
def valid_end_date=(date)
|
76
|
-
raise ArgumentError unless date.is_a?(Data::LocalDateTime)
|
77
|
-
@valid_end_date = date
|
78
|
-
end
|
79
|
-
|
80
|
-
def high=(high)
|
81
|
-
raise ArgumentError unless high.is_a?(Data::Temperature)
|
82
|
-
@high = high
|
83
|
-
end
|
84
|
-
|
85
|
-
def low=(low)
|
86
|
-
raise ArgumentError unless low.is_a?(Data::Temperature)
|
87
|
-
@low = low
|
88
|
-
end
|
89
|
-
|
90
|
-
def pop=(pop)
|
91
|
-
raise ArgumentError unless pop.is_a?(Fixnum)
|
92
|
-
@pop = pop
|
93
|
-
end
|
94
|
-
|
95
|
-
def humidity=(humidity)
|
96
|
-
raise ArgumentError unless
|
97
|
-
(humidity.is_a?(Fixnum) || humidity.is_a?(Float))
|
98
|
-
@humidity = humidity
|
99
|
-
end
|
100
|
-
|
101
|
-
def icon=(icon)
|
102
|
-
raise ArgumentError unless icon.is_a?(String)
|
103
|
-
@icon = icon
|
104
|
-
end
|
105
|
-
|
106
|
-
def condition=(condition)
|
107
|
-
raise ArgumentError unless condition.is_a?(String)
|
108
|
-
@condition = condition
|
109
|
-
end
|
110
|
-
|
111
|
-
def wind=(wind)
|
112
|
-
raise ArgumentError unless wind.is_a?(Data::Speed)
|
113
|
-
@wind = wind
|
114
|
-
end
|
115
|
-
|
116
|
-
def sun=(sun)
|
117
|
-
raise ArgumentError unless (sun.is_a?(Data::Sun) || sun.nil?)
|
118
|
-
@sun = sun
|
119
|
-
end
|
120
|
-
|
121
|
-
#
|
122
|
-
# answer simple questions
|
123
|
-
#
|
124
|
-
|
125
|
-
def windy?(threshold=10)
|
126
|
-
raise ArgumentError unless (threshold.is_a?(Fixnum) || threshold.is_a?(Float))
|
127
|
-
return nil unless wind?
|
128
|
-
wind.to_f(metric?) >= threshold.to_f
|
129
|
-
end
|
130
|
-
|
131
|
-
def day?(time)
|
132
|
-
return nil unless time && sun?
|
133
|
-
sun.after_rise?(time) && sun.before_set?(time)
|
134
|
-
end
|
135
|
-
|
136
|
-
def sunny?(time, sunny_icons=nil)
|
137
|
-
return nil unless time
|
138
|
-
is_day = day?(time)
|
139
|
-
return nil if is_day.nil?
|
140
|
-
is_day && _sunny_by_icon?(sunny_icons)
|
141
|
-
end
|
142
|
-
|
143
|
-
def wet?(wet_icons=nil, pop_threshold=50, humidity_threshold=99)
|
144
|
-
result = nil
|
145
|
-
result ||= _wet_by_pop?(pop_threshold) if pop?
|
146
|
-
result ||= _wet_by_icon?(wet_icons) if icon?
|
147
|
-
result ||= _wet_by_humidity?(humidity_threshold) if humidity?
|
148
|
-
result ||= _wet_by_dewpoint? if (dew_point? && temperature?)
|
149
|
-
result
|
150
|
-
end
|
151
|
-
|
152
|
-
#
|
153
|
-
# helpers
|
154
|
-
#
|
155
|
-
|
156
|
-
def metric?; metric; end
|
157
|
-
|
158
|
-
def for_datetime?(datetime)
|
159
|
-
raise ArgumentError unless datetime.is_a?(Data::LocalDateTime)
|
160
|
-
datetime >= @valid_start_date && datetime <= @valid_end_date
|
161
|
-
end
|
162
|
-
|
163
|
-
# creates "?" helpers for all attributes (which maps to nil?)
|
164
|
-
#
|
165
|
-
def method_missing(method,*args)
|
166
|
-
# if the method ends in ?, then strip it off and see if we
|
167
|
-
# respond to the method without the ?
|
168
|
-
if (call_method = method.to_s.chomp!("?")) && respond_to?(call_method)
|
169
|
-
return send(call_method).nil? ? false : true
|
170
|
-
else
|
171
|
-
super(method,*args)
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
private
|
176
|
-
|
177
|
-
def _wet_by_dewpoint?
|
178
|
-
return nil unless dew_point? && temperature?
|
179
|
-
temperature.to_f(metric?) <= dew_point.to_f(metric?)
|
180
|
-
end
|
181
|
-
|
182
|
-
def _wet_by_pop?(threshold=50)
|
183
|
-
raise ArgumentError unless (threshold.is_a?(Fixnum) || threshold.is_a?(Float))
|
184
|
-
return nil unless pop?
|
185
|
-
pop.to_f >= threshold.to_f
|
186
|
-
end
|
187
|
-
|
188
|
-
def _wet_by_humidity?(threshold=99)
|
189
|
-
raise ArgumentError unless (threshold.is_a?(Fixnum) || threshold.is_a?(Float))
|
190
|
-
return nil unless humidity?
|
191
|
-
humidity.to_f >= threshold.to_f
|
192
|
-
end
|
193
|
-
|
194
|
-
def _wet_by_icon?(wet_icons=nil)
|
195
|
-
raise ArgumentError unless (wet_icons.nil? || wet_icons.is_a?(Array))
|
196
|
-
return nil unless (icon? && wet_icons)
|
197
|
-
wet_icons.include?(icon.to_s.downcase)
|
198
|
-
end
|
199
|
-
|
200
|
-
def _sunny_by_icon?(sunny_icons=nil)
|
201
|
-
raise ArgumentError unless (sunny_icons.nil? || sunny_icons.is_a?(Array))
|
202
|
-
return nil unless (icon? && sunny_icons)
|
203
|
-
sunny_icons.include?(icon.to_s.downcase)
|
204
|
-
end
|
205
|
-
|
206
|
-
end
|
207
|
-
end
|