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
@@ -0,0 +1,53 @@
1
+ module Barometer
2
+ module WeatherService
3
+ class WundergroundV1
4
+ class Response
5
+ class Sun
6
+ def initialize(payload, timezone, response)
7
+ @payload = payload
8
+ @timezone = timezone
9
+ @response = response
10
+ end
11
+
12
+ def parse
13
+ Data::Sun.new(rise: utc_rise_time, set: utc_set_time)
14
+ end
15
+
16
+ private
17
+
18
+ attr_reader :payload, :timezone, :response
19
+
20
+ def utc_rise_time
21
+ return unless response.current
22
+ Utils::Time.utc_from_base_plus_local_time(
23
+ timezone, response.current.observed_at, rise_hour, rise_min
24
+ )
25
+ end
26
+
27
+ def utc_set_time
28
+ return unless response.current
29
+ Utils::Time.utc_from_base_plus_local_time(
30
+ timezone, response.current.observed_at, set_hour, set_min
31
+ )
32
+ end
33
+
34
+ def rise_hour
35
+ payload.fetch('moon_phase', 'sunrise', 'hour')
36
+ end
37
+
38
+ def rise_min
39
+ payload.fetch('moon_phase', 'sunrise', 'minute')
40
+ end
41
+
42
+ def set_hour
43
+ payload.fetch('moon_phase', 'sunset', 'hour')
44
+ end
45
+
46
+ def set_min
47
+ payload.fetch('moon_phase', 'sunset', 'minute')
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,15 @@
1
+ module Barometer
2
+ module WeatherService
3
+ class WundergroundV1
4
+ class Response
5
+ class TimeZone < WeatherService::Response::TimeZone
6
+ private
7
+
8
+ def time_zone
9
+ payload.using(/ (\w*)$/).fetch('local_time')
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,209 +1,27 @@
1
- module Barometer
2
- #
3
- # = Yahoo! Weather
4
- # www.yahoo.com
5
- #
6
- # - key required: NO
7
- # - registration required: NO
8
- # - supported countries: US (by zipcode), International (by Yahoo Location ID)
9
- #
10
- # === performs geo coding
11
- # - city: YES
12
- # - coordinates: YES
13
- #
14
- # === time info
15
- # - sun rise/set: YES (today only)
16
- # - provides timezone: PARTIAL (just short code)
17
- # - requires TZInfo: NO
18
- #
19
- # == resources
20
- # - API: http://developer.yahoo.com/weather/
21
- #
22
- # === Possible queries:
23
- # - http://weather.yahooapis.com/forecastrss?p=94089
24
- # - http://weather.yahooapis.com/forecastrss?p=USCA1116
25
- # - http://weather.yahooapis.com/forecastrss?p=FRXX0076&u=c
26
- #
27
- # where query can be:
28
- # - zipcode (US)
29
- # - Yahoo! Location ID [actually weather.com id] (International)
30
- # - Yahoo! 'Where on Earth ID [WOEID] (International)
31
- #
32
- # = Yahoo! terms of use
33
- # The feeds are provided free of charge for use by individuals and non-profit
34
- # organizations for personal, non-commercial uses. We ask that you provide
35
- # attribution to Yahoo! Weather in connection with your use of the feeds.
36
- # If you provide this attribution in text, please use: "Yahoo! Weather." If you
37
- # provide this attribution with a graphic, please use the Yahoo! Weather logo that
38
- # we have included in the feed itself.
39
- # We reserve all rights in and to the Yahoo! Weather logo, and your right to use
40
- # the Yahoo! Weather logo is limited to providing attribution in connection with
41
- # these RSS feeds. Yahoo! also reserves the right to require you to cease
42
- # distributing these feeds at any time for any reason.
43
- #
44
- # == notes
45
- # - the Yahoo! Location ID is a propreitary number (shared with weather.com)
46
- # - the Yahoo! WOEID is only used by Yahoo!, and is a 32-bit number. Unfortunately
47
- # this number confilcts with US Zipcodes (ie the zipcode=90210 and the
48
- # WOEID=90210 cannot be destinguished and do not mean the same thing). To
49
- # solve this, any 5 digit number will be dtected as a ZIPCODE. To have a
50
- # 5 digit query be detected as a WOEID, prepend it with a 'w' (ie: w90210).
51
- #
52
- class WeatherService::Yahoo < WeatherService
53
-
54
- #########################################################################
55
- # PRIVATE
56
- # If class methods could be private, the remaining methods would be.
57
- #
58
-
59
- def self._source_name; :yahoo; end
60
- def self._accepted_formats; [:zipcode, :weather_id, :woe_id]; end
61
-
62
- def self._wet_icon_codes
63
- codes = [1] + (3..18).to_a + [35] + (37..43).to_a + (45..47).to_a
64
- codes.collect {|c| c.to_s}
65
- end
66
- def self._sunny_icon_codes
67
- codes = (29..34).to_a + [36]
68
- codes.collect {|c| c.to_s}
69
- end
70
-
71
- def self._build_extra(measurement, result, metric=true)
72
- #raise ArgumentError unless measurement.is_a?(Data::Measurement)
73
- #raise ArgumentError unless query.is_a?(Barometer::Query)
74
-
75
- # use todays sun data for all future days
76
- if measurement.forecast && measurement.current.sun
77
- measurement.forecast.each do |forecast|
78
- forecast.sun = measurement.current.sun
79
- end
80
- end
81
- measurement
82
- end
83
-
84
- def self._build_timezone(data)
85
- if data && data['item'] && data['item']['pubDate']
86
- zone_match = data['item']['pubDate'].match(/ ([A-Z]*)$/)
87
- Data::Zone.new(zone_match[1]) if zone_match
88
- end
89
- end
90
-
91
- def self._build_links(data)
92
- links = {}
93
- if data["title"] && data["link"]
94
- links[data["title"]] = data["link"]
95
- end
96
- links
97
- end
1
+ require_relative 'yahoo/api'
2
+ require_relative 'yahoo/response'
98
3
 
99
- def self._build_current(data, metric=true)
100
- raise ArgumentError unless data.is_a?(Hash)
101
- current = Measurement::Result.new(metric)
102
- if data
103
- if data['item'] && data['item']['condition']
104
- condition_result = data['item']['condition']
105
- current.updated_at = Data::LocalDateTime.parse(condition_result['date'])
106
- current.icon = condition_result['code']
107
- current.condition = condition_result['text']
108
- current.temperature = Data::Temperature.new(metric)
109
- current.temperature << condition_result['temp']
110
- end
111
- if data['atmosphere']
112
- atmosphere_result = data['atmosphere']
113
- current.humidity = atmosphere_result['humidity'].to_i
114
- current.pressure = Data::Pressure.new(metric)
115
- current.pressure << atmosphere_result['pressure']
116
- current.visibility = Data::Distance.new(metric)
117
- current.visibility << atmosphere_result['visibility']
118
- end
119
- if data['wind']
120
- wind_result = data['wind']
121
- current.wind = Data::Speed.new(metric)
122
- current.wind << wind_result['speed']
123
- current.wind.degrees = wind_result['degrees'].to_f
124
- current.wind_chill = Data::Temperature.new(metric)
125
- current.wind_chill << wind_result['chill']
126
- end
4
+ module Barometer
5
+ module WeatherService
6
+ class Yahoo
7
+ def self.call(query, config={})
8
+ Yahoo.new(query).measure!
127
9
  end
128
- current
129
- end
130
-
131
- def self._build_forecast(data, metric=true)
132
- raise ArgumentError unless data.is_a?(Hash)
133
- forecasts = Measurement::ResultArray.new
134
-
135
- if data && data['item'] && data['item']['forecast']
136
- forecast_result = data['item']['forecast']
137
10
 
138
- forecast_result.each do |forecast|
139
- forecast_measurement = Measurement::Result.new
140
- forecast_measurement.icon = forecast['code']
141
- forecast_measurement.date = Date.parse(forecast['date'])
142
- forecast_measurement.condition = forecast['text']
143
- forecast_measurement.high = Data::Temperature.new(metric)
144
- forecast_measurement.high << forecast['high'].to_f
145
- forecast_measurement.low = Data::Temperature.new(metric)
146
- forecast_measurement.low << forecast['low'].to_f
147
- forecasts << forecast_measurement
148
- end
11
+ def initialize(query)
12
+ @query = query
149
13
  end
150
- forecasts
151
- end
152
14
 
153
- def self._build_location(data, geo=nil)
154
- raise ArgumentError unless data.is_a?(Hash)
155
- raise ArgumentError unless (geo.nil? || geo.is_a?(Data::Geo))
156
- location = Data::Location.new
157
- # use the geocoded data if available, otherwise get data from result
158
- if geo
159
- location.city = geo.locality
160
- location.state_code = geo.region
161
- location.country = geo.country
162
- location.country_code = geo.country_code
163
- location.latitude = geo.latitude
164
- location.longitude = geo.longitude
165
- else
166
- if data && data['location']
167
- location.city = data['location']['city']
168
- location.state_code = data['location']['region']
169
- location.country_code = data['location']['country']
170
- if data['item']
171
- location.latitude = data['item']['lat']
172
- location.longitude = data['item']['long']
173
- end
174
- end
15
+ def measure!
16
+ api = Yahoo::Api.new(query)
17
+ Yahoo::Response.new.parse(api.get)
175
18
  end
176
- location
177
- end
178
19
 
179
- def self._build_sun(data)
180
- raise ArgumentError unless data.is_a?(Hash)
181
- sun = nil
182
- if data && data['astronomy'] && data['item']
183
- local_rise = Data::LocalTime.parse(data['astronomy']['sunrise'])
184
- local_set = Data::LocalTime.parse(data['astronomy']['sunset'])
185
- sun = Data::Sun.new(local_rise, local_set)
186
- end
187
- sun || Data::Sun.new
188
- end
20
+ private
189
21
 
190
- # use HTTParty to get the current weather
191
- def self._fetch(query, metric=true)
192
- return unless query
193
- puts "fetch yahoo: #{query.q}" if Barometer::debug?
194
- options = {
195
- :p => query.format == :woe_id ? nil : query.q,
196
- :w => query.format == :woe_id ? query.q : nil,
197
- :u => (metric ? 'c' : 'f')
198
- }.delete_if {|k,v| v.nil? }
199
- r = self.get(
200
- "http://weather.yahooapis.com/forecastrss",
201
- :query => options,
202
- :format => :xml,
203
- :timeout => Barometer.timeout
204
- )
205
- r['rss']['channel']
22
+ attr_reader :query
206
23
  end
207
-
208
24
  end
209
25
  end
26
+
27
+ Barometer::WeatherService.register(:yahoo, Barometer::WeatherService::Yahoo)
@@ -0,0 +1,21 @@
1
+ require_relative 'query'
2
+
3
+ module Barometer
4
+ module WeatherService
5
+ class Yahoo
6
+ class Api < Utils::Api
7
+ def initialize(query)
8
+ @query = Yahoo::Query.new(query)
9
+ end
10
+
11
+ def url
12
+ 'http://weather.yahooapis.com/forecastrss'
13
+ end
14
+
15
+ def unwrap_nodes
16
+ ['rss', 'channel']
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,42 @@
1
+ require 'delegate'
2
+
3
+ module Barometer
4
+ module WeatherService
5
+ class Yahoo
6
+ class Query < SimpleDelegator
7
+ attr_reader :converted_query
8
+
9
+ def self.accepted_formats
10
+ [:zipcode, :weather_id, :woe_id]
11
+ end
12
+
13
+ def initialize(query)
14
+ super
15
+ @converted_query = convert_query
16
+ end
17
+
18
+ def to_param
19
+ {u: unit_type}.merge(format_query)
20
+ end
21
+
22
+ private
23
+
24
+ def convert_query
25
+ convert!(*self.class.accepted_formats)
26
+ end
27
+
28
+ def format_query
29
+ if converted_query.format == :woe_id
30
+ { w: converted_query.q }
31
+ else
32
+ { p: converted_query.q }
33
+ end
34
+ end
35
+
36
+ def unit_type
37
+ converted_query.metric? ? 'c' : 'f'
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,39 @@
1
+ require_relative 'response/timezone'
2
+ require_relative 'response/location'
3
+ require_relative 'response/current_weather'
4
+ require_relative 'response/forecasted_weather'
5
+
6
+ module Barometer
7
+ module WeatherService
8
+ class Yahoo
9
+ class Response
10
+ def initialize
11
+ @response = Barometer::Response.new
12
+ end
13
+
14
+ def parse(payload)
15
+ response.add_query(payload.query)
16
+
17
+ response.timezone = Yahoo::Response::TimeZone.new(payload).parse
18
+ response.location = Yahoo::Response::Location.new(payload).parse
19
+ response.current = Yahoo::Response::CurrentWeather.new(payload, timezone).parse
20
+ response.forecast = Yahoo::Response::ForecastedWeather.new(payload, timezone, current_sun).parse
21
+
22
+ response
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :response
28
+
29
+ def timezone
30
+ response.timezone
31
+ end
32
+
33
+ def current_sun
34
+ response.current.sun
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,86 @@
1
+ require_relative 'sun'
2
+ require 'ostruct'
3
+
4
+ module Barometer
5
+ module WeatherService
6
+ class Yahoo
7
+ class Response
8
+ class CurrentWeather
9
+ def initialize(payload, timezone)
10
+ @payload = payload
11
+ @timezone = timezone
12
+ @current = Barometer::Response::Current.new # needs query or metric
13
+ end
14
+
15
+ def parse
16
+ current.observed_at = observed_at, '%a, %d %b %Y %l:%M %P %Z'
17
+ current.stale_at = stale_at
18
+ current.condition = condition
19
+ current.icon = icon
20
+ current.temperature = temperature
21
+ current.humidity = humidity
22
+ current.pressure = pressure
23
+ current.visibility = visibility
24
+ current.wind_chill = wind_chill
25
+ current.wind = wind
26
+ current.sun = Yahoo::Response::Sun.new(payload, base_time).parse
27
+
28
+ current
29
+ end
30
+
31
+ private
32
+
33
+ attr_reader :payload, :timezone, :current
34
+
35
+ def units
36
+ payload.units
37
+ end
38
+
39
+ def base_time
40
+ OpenStruct.new(timezone: timezone, base: current.observed_at)
41
+ end
42
+
43
+ def observed_at
44
+ payload.fetch('item', 'pubDate')
45
+ end
46
+
47
+ def stale_at
48
+ (current.observed_at + (60 * 60 * 1)) if current.observed_at
49
+ end
50
+
51
+ def condition
52
+ payload.fetch('item', 'condition', '@text')
53
+ end
54
+
55
+ def icon
56
+ payload.fetch('item', 'condition', '@code')
57
+ end
58
+
59
+ def temperature
60
+ [units, payload.fetch('item', 'condition', '@temp')]
61
+ end
62
+
63
+ def humidity
64
+ payload.fetch('atmosphere', '@humidity')
65
+ end
66
+
67
+ def pressure
68
+ [units, payload.fetch('atmosphere', '@pressure')]
69
+ end
70
+
71
+ def visibility
72
+ [units, payload.fetch('atmosphere', '@visibility')]
73
+ end
74
+
75
+ def wind_chill
76
+ [units, payload.fetch('wind', '@chill')]
77
+ end
78
+
79
+ def wind
80
+ [units, payload.fetch('wind', '@speed'), payload.fetch('wind', '@direction').to_f]
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end