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.
Files changed (321) hide show
  1. data/.gitignore +2 -0
  2. data/.pelusa.yml +7 -0
  3. data/.travis.yml +6 -3
  4. data/Gemfile +11 -1
  5. data/README.md +89 -244
  6. data/Rakefile +1 -1
  7. data/barometer.gemspec +22 -24
  8. data/lib/barometer.rb +14 -65
  9. data/lib/barometer/base.rb +35 -65
  10. data/lib/barometer/data.rb +15 -20
  11. data/lib/barometer/data/attribute.rb +19 -0
  12. data/lib/barometer/data/attributes/distance.rb +11 -0
  13. data/lib/barometer/data/attributes/float.rb +11 -0
  14. data/lib/barometer/data/attributes/integer.rb +11 -0
  15. data/lib/barometer/data/attributes/location.rb +11 -0
  16. data/lib/barometer/data/attributes/pressure.rb +11 -0
  17. data/lib/barometer/data/attributes/sun.rb +15 -0
  18. data/lib/barometer/data/attributes/temperature.rb +11 -0
  19. data/lib/barometer/data/attributes/time.rb +11 -0
  20. data/lib/barometer/data/attributes/vector.rb +11 -0
  21. data/lib/barometer/data/attributes/zone.rb +11 -0
  22. data/lib/barometer/data/convertable_units.rb +145 -0
  23. data/lib/barometer/data/coordinates.rb +16 -0
  24. data/lib/barometer/data/distance.rb +14 -133
  25. data/lib/barometer/data/geo.rb +22 -59
  26. data/lib/barometer/data/location.rb +14 -20
  27. data/lib/barometer/data/pressure.rb +14 -135
  28. data/lib/barometer/data/sun.rb +24 -24
  29. data/lib/barometer/data/temperature.rb +14 -169
  30. data/lib/barometer/data/vector.rb +44 -0
  31. data/lib/barometer/data/zone.rb +109 -112
  32. data/lib/barometer/query.rb +23 -161
  33. data/lib/barometer/query/base.rb +88 -0
  34. data/lib/barometer/query/converter.rb +64 -0
  35. data/lib/barometer/query/converters/from_coordinates_to_noaa_station_id.rb +30 -0
  36. data/lib/barometer/query/converters/from_geocode_to_coordinates.rb +28 -0
  37. data/lib/barometer/query/converters/from_short_zipcode_to_zipcode.rb +28 -0
  38. data/lib/barometer/query/converters/from_weather_id_to_geocode.rb +30 -0
  39. data/lib/barometer/query/converters/from_woe_id_or_ipv4_to_geocode.rb +32 -0
  40. data/lib/barometer/query/converters/to_geocode.rb +30 -0
  41. data/lib/barometer/query/converters/to_weather_id.rb +30 -0
  42. data/lib/barometer/query/converters/to_woe_id.rb +30 -0
  43. data/lib/barometer/query/format.rb +59 -0
  44. data/lib/barometer/query/formats/base.rb +22 -0
  45. data/lib/barometer/query/formats/coordinates.rb +14 -0
  46. data/lib/barometer/query/formats/geocode.rb +15 -0
  47. data/lib/barometer/query/formats/icao.rb +35 -0
  48. data/lib/barometer/query/formats/ipv4_address.rb +19 -0
  49. data/lib/barometer/query/formats/noaa_station_id.rb +15 -0
  50. data/lib/barometer/query/formats/postalcode.rb +20 -0
  51. data/lib/barometer/query/formats/short_zipcode.rb +15 -0
  52. data/lib/barometer/{translations → query/formats/translations}/icao_country_codes.yml +0 -0
  53. data/lib/barometer/{translations → query/formats/translations}/weather_country_codes.yml +0 -0
  54. data/lib/barometer/query/formats/unknown.rb +14 -0
  55. data/lib/barometer/query/formats/weather_id.rb +33 -0
  56. data/lib/barometer/query/formats/woe_id.rb +28 -0
  57. data/lib/barometer/query/formats/zipcode.rb +15 -0
  58. data/lib/barometer/query/service.rb +13 -0
  59. data/lib/barometer/query/services/apis/geonames_timezone.rb +26 -0
  60. data/lib/barometer/query/services/apis/google_geocode.rb +35 -0
  61. data/lib/barometer/query/services/apis/noaa_station.rb +31 -0
  62. data/lib/barometer/query/services/apis/weather_id.rb +35 -0
  63. data/lib/barometer/query/services/apis/wunderground_timezone.rb +26 -0
  64. data/lib/barometer/query/services/apis/yahoo_placefinder.rb +35 -0
  65. data/lib/barometer/query/services/apis/yahoo_weather.rb +31 -0
  66. data/lib/barometer/query/services/from_weather_id.rb +64 -0
  67. data/lib/barometer/query/services/geonames_timezone.rb +18 -0
  68. data/lib/barometer/query/services/google_geocode.rb +106 -0
  69. data/lib/barometer/query/services/noaa_station_id.rb +28 -0
  70. data/lib/barometer/query/services/to_weather_id.rb +25 -0
  71. data/lib/barometer/query/services/to_woe_id.rb +29 -0
  72. data/lib/barometer/query/services/wunderground_timezone.rb +18 -0
  73. data/lib/barometer/query/services/yahoo_geocode.rb +69 -0
  74. data/lib/barometer/response.rb +12 -0
  75. data/lib/barometer/response/base.rb +57 -0
  76. data/lib/barometer/response/current.rb +27 -0
  77. data/lib/barometer/response/prediction.rb +41 -0
  78. data/lib/barometer/response/prediction_collection.rb +48 -0
  79. data/lib/barometer/utils.rb +17 -0
  80. data/lib/barometer/utils/address.rb +33 -0
  81. data/lib/barometer/utils/api.rb +30 -0
  82. data/lib/barometer/utils/config_reader.rb +40 -0
  83. data/lib/barometer/utils/get.rb +17 -0
  84. data/lib/barometer/utils/json_reader.rb +22 -0
  85. data/lib/barometer/utils/payload.rb +100 -0
  86. data/lib/barometer/utils/payload_request.rb +37 -0
  87. data/lib/barometer/utils/post.rb +24 -0
  88. data/lib/barometer/utils/time.rb +78 -0
  89. data/lib/barometer/{translations → utils/translations}/zone_codes.yml +0 -0
  90. data/lib/barometer/utils/versioned_registration.rb +70 -0
  91. data/lib/barometer/utils/xml_reader.rb +27 -0
  92. data/lib/barometer/utils/zone_code_lookup.rb +30 -0
  93. data/lib/barometer/version.rb +1 -1
  94. data/lib/barometer/weather.rb +44 -173
  95. data/lib/barometer/weather_service.rb +41 -0
  96. data/lib/barometer/weather_services/base.rb +50 -0
  97. data/lib/barometer/weather_services/forecast_io.rb +36 -0
  98. data/lib/barometer/weather_services/forecast_io/api.rb +22 -0
  99. data/lib/barometer/weather_services/forecast_io/query.rb +38 -0
  100. data/lib/barometer/weather_services/forecast_io/response.rb +31 -0
  101. data/lib/barometer/weather_services/forecast_io/response/current_weather.rb +78 -0
  102. data/lib/barometer/weather_services/forecast_io/response/forecasted_weather.rb +74 -0
  103. data/lib/barometer/weather_services/forecast_io/response/location.rb +19 -0
  104. data/lib/barometer/weather_services/forecast_io/response/timezone.rb +25 -0
  105. data/lib/barometer/weather_services/noaa.rb +21 -305
  106. data/lib/barometer/weather_services/noaa/current_api.rb +25 -0
  107. data/lib/barometer/weather_services/noaa/current_query.rb +30 -0
  108. data/lib/barometer/weather_services/noaa/current_response.rb +29 -0
  109. data/lib/barometer/weather_services/noaa/forecast_api.rb +25 -0
  110. data/lib/barometer/weather_services/noaa/forecast_query.rb +39 -0
  111. data/lib/barometer/weather_services/noaa/forecast_response.rb +28 -0
  112. data/lib/barometer/weather_services/noaa/response/current_location.rb +42 -0
  113. data/lib/barometer/weather_services/noaa/response/current_station.rb +46 -0
  114. data/lib/barometer/weather_services/noaa/response/current_weather.rb +82 -0
  115. data/lib/barometer/weather_services/noaa/response/forecasted_weather.rb +90 -0
  116. data/lib/barometer/weather_services/noaa/response/location.rb +19 -0
  117. data/lib/barometer/weather_services/noaa/response/timezone.rb +15 -0
  118. data/lib/barometer/weather_services/response.rb +9 -0
  119. data/lib/barometer/weather_services/response/location.rb +42 -0
  120. data/lib/barometer/weather_services/response/time_zone.rb +19 -0
  121. data/lib/barometer/weather_services/weather_bug.rb +24 -280
  122. data/lib/barometer/weather_services/weather_bug/current_api.rb +26 -0
  123. data/lib/barometer/weather_services/weather_bug/current_response.rb +33 -0
  124. data/lib/barometer/weather_services/weather_bug/forecast_api.rb +26 -0
  125. data/lib/barometer/weather_services/weather_bug/forecast_response.rb +29 -0
  126. data/lib/barometer/weather_services/weather_bug/query.rb +42 -0
  127. data/lib/barometer/weather_services/weather_bug/response/current_weather.rb +82 -0
  128. data/lib/barometer/weather_services/weather_bug/response/forecasted_weather.rb +67 -0
  129. data/lib/barometer/weather_services/weather_bug/response/location.rb +23 -0
  130. data/lib/barometer/weather_services/weather_bug/response/station.rb +43 -0
  131. data/lib/barometer/weather_services/weather_bug/response/sun.rb +32 -0
  132. data/lib/barometer/weather_services/weather_bug/response/time_helper.rb +52 -0
  133. data/lib/barometer/weather_services/weather_bug/response/timezone.rb +15 -0
  134. data/lib/barometer/weather_services/wunderground_v1.rb +32 -0
  135. data/lib/barometer/weather_services/wunderground_v1/current_api.rb +21 -0
  136. data/lib/barometer/weather_services/wunderground_v1/current_response.rb +31 -0
  137. data/lib/barometer/weather_services/wunderground_v1/forecast_api.rb +21 -0
  138. data/lib/barometer/weather_services/wunderground_v1/forecast_response.rb +33 -0
  139. data/lib/barometer/weather_services/wunderground_v1/query.rb +30 -0
  140. data/lib/barometer/weather_services/wunderground_v1/response/current_weather.rb +92 -0
  141. data/lib/barometer/weather_services/wunderground_v1/response/forecasted_weather.rb +87 -0
  142. data/lib/barometer/weather_services/wunderground_v1/response/full_timezone.rb +22 -0
  143. data/lib/barometer/weather_services/wunderground_v1/response/location.rb +43 -0
  144. data/lib/barometer/weather_services/wunderground_v1/response/station.rb +39 -0
  145. data/lib/barometer/weather_services/wunderground_v1/response/sun.rb +53 -0
  146. data/lib/barometer/weather_services/wunderground_v1/response/timezone.rb +15 -0
  147. data/lib/barometer/weather_services/yahoo.rb +16 -198
  148. data/lib/barometer/weather_services/yahoo/api.rb +21 -0
  149. data/lib/barometer/weather_services/yahoo/query.rb +42 -0
  150. data/lib/barometer/weather_services/yahoo/response.rb +39 -0
  151. data/lib/barometer/weather_services/yahoo/response/current_weather.rb +86 -0
  152. data/lib/barometer/weather_services/yahoo/response/forecasted_weather.rb +71 -0
  153. data/lib/barometer/weather_services/yahoo/response/location.rb +47 -0
  154. data/lib/barometer/weather_services/yahoo/response/sun.rb +43 -0
  155. data/lib/barometer/weather_services/yahoo/response/timezone.rb +15 -0
  156. data/spec/barometer_spec.rb +18 -120
  157. data/spec/base_spec.rb +114 -0
  158. data/spec/cassettes/Converter_FromCoordinatesToNoaaStationId.json +1 -0
  159. data/spec/cassettes/Converter_FromWeatherIdToGeocode.json +1 -0
  160. data/spec/cassettes/Converter_FromWoeIdOrIpv4ToGeocode.json +1 -0
  161. data/spec/cassettes/Converter_ToGeocode.json +1 -0
  162. data/spec/cassettes/Converter_ToWeatherId.json +1 -0
  163. data/spec/cassettes/Converter_ToWoeId.json +1 -0
  164. data/spec/cassettes/Service_FromWeatherId.json +1 -0
  165. data/spec/cassettes/Service_GoogleGeocode.json +1 -0
  166. data/spec/cassettes/Service_NoaaStation.json +1 -0
  167. data/spec/cassettes/Service_ToWeatherId.json +1 -0
  168. data/spec/cassettes/Service_ToWoeId.json +1 -0
  169. data/spec/cassettes/Service_YahooGeocode.json +1 -0
  170. data/spec/cassettes/WeatherService_ForecastIo.json +1 -0
  171. data/spec/cassettes/WeatherService_Noaa.json +1 -1
  172. data/spec/cassettes/WeatherService_WeatherBug.json +1 -1
  173. data/spec/cassettes/WeatherService_WundergroundV1.json +1 -0
  174. data/spec/cassettes/WeatherService_Yahoo.json +1 -1
  175. data/spec/data/attributes/distance_spec.rb +60 -0
  176. data/spec/data/attributes/location_spec.rb +41 -0
  177. data/spec/data/attributes/pressure_spec.rb +60 -0
  178. data/spec/data/attributes/sun_spec.rb +33 -0
  179. data/spec/data/attributes/temperature_spec.rb +60 -0
  180. data/spec/data/attributes/time_spec.rb +58 -0
  181. data/spec/data/attributes/vector_spec.rb +43 -0
  182. data/spec/data/attributes/zone_spec.rb +34 -0
  183. data/spec/data/convertable_units_spec.rb +299 -0
  184. data/spec/data/coordinates_spec.rb +15 -0
  185. data/spec/data/distance_spec.rb +49 -333
  186. data/spec/data/geo_spec.rb +72 -71
  187. data/spec/data/location_spec.rb +70 -65
  188. data/spec/data/pressure_spec.rb +49 -333
  189. data/spec/data/sun_spec.rb +57 -81
  190. data/spec/data/temperature_spec.rb +49 -393
  191. data/spec/data/vector_spec.rb +100 -0
  192. data/spec/data/zone_spec.rb +199 -266
  193. data/spec/query/base_spec.rb +296 -0
  194. data/spec/query/converter_spec.rb +98 -0
  195. data/spec/query/converters/from_coordinates_to_noaa_station_id_spec.rb +35 -0
  196. data/spec/query/converters/from_geocode_to_coordinates_spec.rb +25 -0
  197. data/spec/query/converters/from_short_zipcode_to_zipcode_spec.rb +31 -0
  198. data/spec/query/converters/from_weather_id_to_geocode_spec.rb +40 -0
  199. data/spec/query/converters/from_woe_id_or_ipv4_to_geocode_spec.rb +51 -0
  200. data/spec/query/converters/to_geocode_spec.rb +99 -0
  201. data/spec/query/converters/to_weather_id_spec.rb +35 -0
  202. data/spec/query/converters/to_woe_id_spec.rb +74 -0
  203. data/spec/query/formats/base_spec.rb +15 -0
  204. data/spec/query/formats/coordinates_spec.rb +13 -0
  205. data/spec/query/formats/geocode_spec.rb +9 -0
  206. data/spec/query/formats/icao_spec.rb +20 -0
  207. data/spec/query/formats/ipv4_address_spec.rb +33 -0
  208. data/spec/query/formats/noaa_station_id_spec.rb +9 -0
  209. data/spec/query/formats/postalcode_spec.rb +18 -0
  210. data/spec/query/formats/short_zipcode_spec.rb +18 -0
  211. data/spec/query/formats/unknown_spec.rb +9 -0
  212. data/spec/query/formats/weather_id_spec.rb +31 -0
  213. data/spec/query/formats/woe_id_spec.rb +45 -0
  214. data/spec/query/formats/zipcode_spec.rb +18 -0
  215. data/spec/query/formats_spec.rb +55 -0
  216. data/spec/query/services/from_weather_id_spec.rb +54 -0
  217. data/spec/query/services/google_geocode_spec.rb +60 -0
  218. data/spec/query/services/noaa_station_id_spec.rb +23 -0
  219. data/spec/query/services/to_weather_id_spec.rb +23 -0
  220. data/spec/query/services/to_woe_id_spec.rb +51 -0
  221. data/spec/query/services/yahoo_geocode_spec.rb +72 -0
  222. data/spec/response/base_spec.rb +103 -0
  223. data/spec/response/current_spec.rb +33 -0
  224. data/spec/response/predicition_spec.rb +65 -0
  225. data/spec/response/prediction_collection_spec.rb +97 -0
  226. data/spec/spec_helper.rb +14 -12
  227. data/spec/support/key_file_parser.rb +22 -0
  228. data/spec/support/matchers/formats.rb +36 -0
  229. data/spec/support/matchers/have_data.rb +46 -0
  230. data/spec/support/matchers/have_field.rb +128 -0
  231. data/spec/support/matchers/have_forecast.rb +46 -0
  232. data/spec/support/matchers/path.rb +23 -0
  233. data/spec/support/query_factory.rb +20 -0
  234. data/spec/utils/address_spec.rb +67 -0
  235. data/spec/utils/config_reader_spec.rb +157 -0
  236. data/spec/utils/get_spec.rb +22 -0
  237. data/spec/utils/payload_request_spec.rb +69 -0
  238. data/spec/utils/payload_spec.rb +168 -0
  239. data/spec/utils/post_spec.rb +20 -0
  240. data/spec/utils/time_spec.rb +93 -0
  241. data/spec/utils/versioned_registration_spec.rb +105 -0
  242. data/spec/weather_services/base_spec.rb +116 -0
  243. data/spec/weather_services/forecast_io_spec.rb +71 -0
  244. data/spec/weather_services/noaa/current_response_spec.rb +22 -0
  245. data/spec/weather_services/noaa/forecast_response_spec.rb +33 -0
  246. data/spec/weather_services/noaa_spec.rb +68 -166
  247. data/spec/weather_services/weather_bug/current_response_spec.rb +64 -0
  248. data/spec/weather_services/weather_bug/forecast_response_spec.rb +23 -0
  249. data/spec/weather_services/weather_bug_spec.rb +62 -202
  250. data/spec/weather_services/wunderground_v1/current_response_spec.rb +19 -0
  251. data/spec/weather_services/wunderground_v1/forecast_response_spec.rb +62 -0
  252. data/spec/weather_services/wunderground_v1_spec.rb +78 -0
  253. data/spec/weather_services/yahoo/response_spec.rb +73 -0
  254. data/spec/weather_services/yahoo_spec.rb +52 -135
  255. data/spec/weather_services_spec.rb +103 -0
  256. data/spec/weather_spec.rb +167 -347
  257. metadata +342 -123
  258. data/.document +0 -5
  259. data/TODO +0 -60
  260. data/bin/barometer +0 -441
  261. data/lib/barometer/data/local_datetime.rb +0 -145
  262. data/lib/barometer/data/local_time.rb +0 -134
  263. data/lib/barometer/data/speed.rb +0 -158
  264. data/lib/barometer/data/units.rb +0 -49
  265. data/lib/barometer/formats.rb +0 -13
  266. data/lib/barometer/formats/coordinates.rb +0 -57
  267. data/lib/barometer/formats/format.rb +0 -64
  268. data/lib/barometer/formats/geocode.rb +0 -60
  269. data/lib/barometer/formats/icao.rb +0 -37
  270. data/lib/barometer/formats/postalcode.rb +0 -22
  271. data/lib/barometer/formats/short_zipcode.rb +0 -17
  272. data/lib/barometer/formats/weather_id.rb +0 -92
  273. data/lib/barometer/formats/woe_id.rb +0 -150
  274. data/lib/barometer/formats/zipcode.rb +0 -31
  275. data/lib/barometer/key_file_parser.rb +0 -20
  276. data/lib/barometer/measurements/measurement.rb +0 -202
  277. data/lib/barometer/measurements/result.rb +0 -207
  278. data/lib/barometer/measurements/result_array.rb +0 -75
  279. data/lib/barometer/services.rb +0 -19
  280. data/lib/barometer/weather_services/service.rb +0 -189
  281. data/lib/barometer/weather_services/wunderground.rb +0 -264
  282. data/lib/barometer/web_services/geocode.rb +0 -34
  283. data/lib/barometer/web_services/noaa_station_id.rb +0 -53
  284. data/lib/barometer/web_services/placemaker.rb +0 -95
  285. data/lib/barometer/web_services/timezone.rb +0 -38
  286. data/lib/barometer/web_services/weather_id.rb +0 -50
  287. data/lib/barometer/web_services/web_service.rb +0 -29
  288. data/spec/cassettes/Barometer.json +0 -1
  289. data/spec/cassettes/Query.json +0 -1
  290. data/spec/cassettes/Query_Format_Coordinates.json +0 -1
  291. data/spec/cassettes/Query_Format_Geocode.json +0 -1
  292. data/spec/cassettes/Query_Format_WeatherID.json +0 -1
  293. data/spec/cassettes/Query_Format_WoeID.json +0 -1
  294. data/spec/cassettes/WeatherService.json +0 -1
  295. data/spec/cassettes/WeatherService_Wunderground.json +0 -1
  296. data/spec/cassettes/WebService_Geocode.json +0 -1
  297. data/spec/cassettes/WebService_NoaaStation.json +0 -1
  298. data/spec/data/local_datetime_spec.rb +0 -274
  299. data/spec/data/local_time_spec.rb +0 -239
  300. data/spec/data/speed_spec.rb +0 -374
  301. data/spec/data/units_spec.rb +0 -101
  302. data/spec/formats/coordinates_spec.rb +0 -166
  303. data/spec/formats/format_spec.rb +0 -74
  304. data/spec/formats/geocode_spec.rb +0 -163
  305. data/spec/formats/icao_spec.rb +0 -55
  306. data/spec/formats/postalcode_spec.rb +0 -53
  307. data/spec/formats/short_zipcode_spec.rb +0 -47
  308. data/spec/formats/weather_id_spec.rb +0 -182
  309. data/spec/formats/woe_id_spec.rb +0 -211
  310. data/spec/formats/zipcode_spec.rb +0 -103
  311. data/spec/key_file_parser_spec.rb +0 -28
  312. data/spec/measurements/measurement_spec.rb +0 -381
  313. data/spec/measurements/result_array_spec.rb +0 -150
  314. data/spec/measurements/result_spec.rb +0 -632
  315. data/spec/query_spec.rb +0 -498
  316. data/spec/weather_services/services_spec.rb +0 -135
  317. data/spec/weather_services/wunderground_spec.rb +0 -179
  318. data/spec/web_services/geocode_spec.rb +0 -31
  319. data/spec/web_services/noaa_station_id_spec.rb +0 -33
  320. data/spec/web_services/placemaker_spec.rb +0 -41
  321. 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