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,32 @@
1
+ require_relative 'wunderground_v1/current_api'
2
+ require_relative 'wunderground_v1/current_response'
3
+ require_relative 'wunderground_v1/forecast_api'
4
+ require_relative 'wunderground_v1/forecast_response'
5
+
6
+ module Barometer
7
+ module WeatherService
8
+ class WundergroundV1
9
+ def self.call(query, config={})
10
+ WundergroundV1.new(query).measure!
11
+ end
12
+
13
+ def initialize(query)
14
+ @query = query
15
+ end
16
+
17
+ def measure!
18
+ current_weather_api = CurrentApi.new(query)
19
+ response = CurrentResponse.new.parse(current_weather_api.get)
20
+
21
+ forecast_weather_api = ForecastApi.new(current_weather_api.query)
22
+ ForecastResponse.new(response).parse(forecast_weather_api.get)
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :query
28
+ end
29
+ end
30
+ end
31
+
32
+ Barometer::WeatherService.register(:wunderground, :v1, Barometer::WeatherService::WundergroundV1)
@@ -0,0 +1,21 @@
1
+ require_relative 'query'
2
+
3
+ module Barometer
4
+ module WeatherService
5
+ class WundergroundV1
6
+ class CurrentApi < Utils::Api
7
+ def initialize(query)
8
+ @query = WundergroundV1::Query.new(query)
9
+ end
10
+
11
+ def url
12
+ 'http://api.wunderground.com/auto/wui/geo/WXCurrentObXML/index.xml'
13
+ end
14
+
15
+ def unwrap_nodes
16
+ ['current_observation']
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,31 @@
1
+ require_relative 'response/current_weather'
2
+ require_relative 'response/station'
3
+ require_relative 'response/location'
4
+ require_relative 'response/timezone'
5
+
6
+ module Barometer
7
+ module WeatherService
8
+ class WundergroundV1
9
+ class CurrentResponse
10
+ def initialize
11
+ @response = Barometer::Response.new
12
+ end
13
+
14
+ def parse(payload)
15
+ response.add_query(payload.query)
16
+
17
+ response.current = WundergroundV1::Response::CurrentWeather.new(payload).parse
18
+ response.station = WundergroundV1::Response::Station.new(payload).parse
19
+ response.location = WundergroundV1::Response::Location.new(payload).parse
20
+ response.timezone = WundergroundV1::Response::TimeZone.new(payload).parse
21
+
22
+ response
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :response
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,21 @@
1
+ require_relative 'query'
2
+
3
+ module Barometer
4
+ module WeatherService
5
+ class WundergroundV1
6
+ class ForecastApi < Utils::Api
7
+ def initialize(query)
8
+ @query = WundergroundV1::Query.new(query)
9
+ end
10
+
11
+ def url
12
+ 'http://api.wunderground.com/auto/wui/geo/ForecastXML/index.xml'
13
+ end
14
+
15
+ def unwrap_nodes
16
+ ['forecast']
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,33 @@
1
+ require_relative 'response/full_timezone'
2
+ require_relative 'response/forecasted_weather'
3
+ require_relative 'response/sun'
4
+
5
+ module Barometer
6
+ module WeatherService
7
+ class WundergroundV1
8
+ class ForecastResponse
9
+ def initialize(response)
10
+ @response = response
11
+ end
12
+
13
+ def parse(payload)
14
+ response.timezone = WundergroundV1::Response::FullTimeZone.new(payload).parse
15
+ if response.current
16
+ response.current.sun = WundergroundV1::Response::Sun.new(payload, timezone, response).parse
17
+ end
18
+ response.forecast = WundergroundV1::Response::ForecastedWeather.new(payload, response).parse
19
+
20
+ response
21
+ end
22
+
23
+ private
24
+
25
+ attr_reader :response
26
+
27
+ def timezone
28
+ response.timezone
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,30 @@
1
+ require 'delegate'
2
+
3
+ module Barometer
4
+ module WeatherService
5
+ class WundergroundV1
6
+ class Query < SimpleDelegator
7
+ attr_reader :converted_query
8
+
9
+ def self.accepted_formats
10
+ [:zipcode, :postalcode, :icao, :coordinates, :geocode]
11
+ end
12
+
13
+ def initialize(query)
14
+ super
15
+ @converted_query = convert_query
16
+ end
17
+
18
+ def to_param
19
+ {query: converted_query.q.dup}
20
+ end
21
+
22
+ private
23
+
24
+ def convert_query
25
+ convert!(*self.class.accepted_formats)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,92 @@
1
+ module Barometer
2
+ module WeatherService
3
+ class WundergroundV1
4
+ class Response
5
+ class CurrentWeather
6
+ def initialize(payload)
7
+ @payload = payload
8
+ @current = Barometer::Response::Current.new
9
+ end
10
+
11
+ def parse
12
+ current.observed_at = observed_at, '%B %e, %l:%M %p %Z'
13
+ current.stale_at = stale_at
14
+ current.humidity = humidity
15
+ current.condition = condition
16
+ current.icon = icon
17
+ current.temperature = temperature
18
+ current.dew_point = dew_point
19
+ current.wind_chill = wind_chill
20
+ current.heat_index = heat_index
21
+ current.wind = wind
22
+ current.visibility = visibility
23
+ current.pressure = pressure
24
+
25
+ current
26
+ end
27
+
28
+ private
29
+
30
+ attr_reader :payload, :current
31
+
32
+ def units
33
+ payload.units
34
+ end
35
+
36
+ def observed_at
37
+ payload.fetch('local_time')
38
+ end
39
+
40
+ def stale_at
41
+ return unless current.observed_at
42
+ utc_observed_at = current.observed_at.utc
43
+ Time.utc(
44
+ utc_observed_at.year, utc_observed_at.month, utc_observed_at.day,
45
+ utc_observed_at.hour + 1, 0, 0
46
+ )
47
+ end
48
+
49
+ def humidity
50
+ payload.fetch('relative_humidity')
51
+ end
52
+
53
+ def condition
54
+ payload.fetch('weather')
55
+ end
56
+
57
+ def icon
58
+ payload.fetch('icon')
59
+ end
60
+
61
+ def temperature
62
+ [units, payload.fetch('temp_c'), payload.fetch('temp_f')]
63
+ end
64
+
65
+ def dew_point
66
+ [units, payload.fetch('dewpoint_c'), payload.fetch('dewpoint_f')]
67
+ end
68
+
69
+ def wind_chill
70
+ [units, payload.fetch('windchill_c'), payload.fetch('windchill_f')]
71
+ end
72
+
73
+ def heat_index
74
+ [units, payload.fetch('heat_index_c'), payload.fetch('heat_index_f')]
75
+ end
76
+
77
+ def wind
78
+ [:imperial, payload.fetch('wind_mph').to_i, payload.fetch('wind_degrees').to_i]
79
+ end
80
+
81
+ def visibility
82
+ [units, payload.fetch('visibility_km'), payload.fetch('visibility_mi')]
83
+ end
84
+
85
+ def pressure
86
+ [units, payload.fetch('pressure_mb'), payload.fetch('pressure_in')]
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,87 @@
1
+ module Barometer
2
+ module WeatherService
3
+ class WundergroundV1
4
+ class Response
5
+ class ForecastedWeather
6
+ def initialize(payload, response)
7
+ @payload = payload
8
+ @response = response
9
+ @predictions = Barometer::Response::PredictionCollection.new
10
+ end
11
+
12
+ def parse
13
+ each_prediction do |prediction, forecast_payload|
14
+ prediction.starts_at = starts_at(forecast_payload), '%I:%M %p %Z on %B %d, %Y'
15
+ prediction.ends_at = ends_at(prediction.starts_at)
16
+ prediction.pop = pop(forecast_payload)
17
+ prediction.icon = icon(forecast_payload)
18
+ prediction.high = high(forecast_payload)
19
+ prediction.low = low(forecast_payload)
20
+ prediction.sun = sun(prediction.starts_at, prediction.ends_at)
21
+ end
22
+
23
+ predictions
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :payload, :response, :predictions
29
+
30
+ def units
31
+ payload.units
32
+ end
33
+
34
+ def each_prediction
35
+ payload.fetch_each('simpleforecast', 'forecastday') do |forecast_payload|
36
+ predictions.build do |prediction|
37
+ yield prediction, forecast_payload
38
+ end
39
+ end
40
+ end
41
+
42
+ def starts_at(forecast_payload)
43
+ forecast_payload.fetch('date', 'pretty')
44
+ end
45
+
46
+ def ends_at(starts_at)
47
+ Utils::Time.add_one_day(starts_at)
48
+ end
49
+
50
+ def pop(forecast_payload)
51
+ forecast_payload.fetch('pop')
52
+ end
53
+
54
+ def icon(forecast_payload)
55
+ forecast_payload.fetch('icon')
56
+ end
57
+
58
+ def high(forecast_payload)
59
+ [units, forecast_payload.fetch('high', 'celsius'), forecast_payload.fetch('high', 'fahrenheit')]
60
+ end
61
+
62
+ def low(forecast_payload)
63
+ [units, forecast_payload.fetch('low', 'celsius'), forecast_payload.fetch('low', 'fahrenheit')]
64
+ end
65
+
66
+ def sun(starts_at, ends_at)
67
+ Data::Sun.new(rise: sun_rise_utc(starts_at), set: sun_set_utc(ends_at))
68
+ end
69
+
70
+ def sun_rise_utc(starts_at)
71
+ return unless current_sun?
72
+ Utils::Time.utc_merge_base_plus_time(starts_at, response.current.sun.rise)
73
+ end
74
+
75
+ def sun_set_utc(ends_at)
76
+ return unless current_sun?
77
+ Utils::Time.utc_merge_base_plus_time(ends_at, response.current.sun.set)
78
+ end
79
+
80
+ def current_sun?
81
+ response.current && response.current.sun
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,22 @@
1
+ module Barometer
2
+ module WeatherService
3
+ class WundergroundV1
4
+ class Response
5
+ class FullTimeZone < WeatherService::Response::TimeZone
6
+ def parse
7
+ payload.fetch_each('simpleforecast', 'forecastday') do |forecast_payload|
8
+ timezone = timezone(forecast_payload)
9
+ return Data::Zone.new(timezone) if timezone
10
+ end
11
+ end
12
+
13
+ private
14
+
15
+ def timezone(forecast_payload)
16
+ forecast_payload.fetch('date', 'tz_long')
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,43 @@
1
+ module Barometer
2
+ module WeatherService
3
+ class WundergroundV1
4
+ class Response
5
+ class Location < WeatherService::Response::Location
6
+ private
7
+
8
+ def name
9
+ payload.fetch('display_location', 'full')
10
+ end
11
+
12
+ def city
13
+ payload.fetch('display_location', 'city')
14
+ end
15
+
16
+ def state_code
17
+ payload.fetch('display_location', 'state')
18
+ end
19
+
20
+ def state_name
21
+ payload.fetch('display_location', 'state_name')
22
+ end
23
+
24
+ def zip_code
25
+ payload.fetch('display_location', 'zip')
26
+ end
27
+
28
+ def country_code
29
+ payload.fetch('display_location', 'country')
30
+ end
31
+
32
+ def latitude
33
+ payload.fetch('display_location', 'latitude')
34
+ end
35
+
36
+ def longitude
37
+ payload.fetch('display_location', 'longitude')
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,39 @@
1
+ module Barometer
2
+ module WeatherService
3
+ class WundergroundV1
4
+ class Response
5
+ class Station < WeatherService::Response::Location
6
+ private
7
+
8
+ def id
9
+ payload.fetch('station_id')
10
+ end
11
+
12
+ def name
13
+ payload.fetch('observation_location', 'full')
14
+ end
15
+
16
+ def city
17
+ payload.fetch('observation_location', 'city')
18
+ end
19
+
20
+ def state_code
21
+ payload.fetch('observation_location', 'state')
22
+ end
23
+
24
+ def country_code
25
+ payload.fetch('observation_location', 'country')
26
+ end
27
+
28
+ def latitude
29
+ payload.fetch('observation_location', 'latitude')
30
+ end
31
+
32
+ def longitude
33
+ payload.fetch('observation_location', 'longitude')
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end