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,64 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ module Barometer::WeatherService
4
+ describe WeatherBug::CurrentResponse do
5
+ it "parses the timezones correctly" do
6
+ payload = Barometer::Utils::Payload.new({
7
+ 'ob_date' => {
8
+ 'year' => { '@number' => '2013' },
9
+ 'month' => { '@number' => '5' },
10
+ 'day' => { '@number' => '18' },
11
+ 'hour' => { '@hour_24' => '10' },
12
+ 'minute' => { '@number' => '46' },
13
+ 'second' => { '@number' => '0' },
14
+ 'time_zone' => { '@abbrv' => 'PDT' }
15
+ }
16
+ })
17
+ response = WeatherBug::CurrentResponse.new.parse(payload)
18
+
19
+ utc_observed_at = Time.utc(2013,5,18,17,46,0)
20
+ utc_stale_at = Time.utc(2013,5,18,18,46,0)
21
+
22
+ expect( response.current.observed_at.utc ).to eq utc_observed_at
23
+ expect( response.current.stale_at.utc ).to eq utc_stale_at
24
+ expect( response.timezone.to_s ).to eq 'PDT'
25
+ end
26
+
27
+ it "parses sun timezones correctly" do
28
+ payload = Barometer::Utils::Payload.new({
29
+ 'ob_date' => {
30
+ 'year' => { '@number' => '2013' },
31
+ 'month' => { '@number' => '4' },
32
+ 'day' => { '@number' => '13' },
33
+ 'hour' => { '@hour_24' => '10' },
34
+ 'minute' => { '@number' => '23' },
35
+ 'second' => { '@number' => '0' },
36
+ 'time_zone' => { '@abbrv' => 'PDT' }
37
+ },
38
+ 'sunrise' => {
39
+ 'year' => { '@number' => '2013' },
40
+ 'month' => { '@number' => '4' },
41
+ 'day' => { '@number' => '13' },
42
+ 'hour' => { '@hour_24' => '6' },
43
+ 'minute' => { '@number' => '44' },
44
+ 'second' => { '@number' => '19' },
45
+ },
46
+ 'sunset' => {
47
+ 'year' => { '@number' => '2013' },
48
+ 'month' => { '@number' => '4' },
49
+ 'day' => { '@number' => '13' },
50
+ 'hour' => { '@hour_24' => '17' },
51
+ 'minute' => { '@number' => '31' },
52
+ 'second' => { '@number' => '50' },
53
+ }
54
+ })
55
+ response = WeatherBug::CurrentResponse.new.parse(payload)
56
+
57
+ utc_current_sun_rise = Time.utc(2013,4,13,13,44,19)
58
+ utc_current_sun_set = Time.utc(2013,4,14,0,31,50)
59
+
60
+ expect( response.current.sun.rise.utc ).to eq utc_current_sun_rise
61
+ expect( response.current.sun.set.utc ).to eq utc_current_sun_set
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,23 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ module Barometer::WeatherService
4
+ describe WeatherBug::ForecastResponse do
5
+ let(:current_response) { Barometer::Response.new }
6
+
7
+ it "parses the timezones correctly" do
8
+ current_response.timezone = Barometer::Data::Zone.new('PDT')
9
+
10
+ payload = Barometer::Utils::Payload.new({
11
+ "@date" => "4/13/2013 10:23:00 AM",
12
+ "forecast" => [{"high" => "13"}]
13
+ })
14
+ response = WeatherBug::ForecastResponse.new(current_response).parse(payload)
15
+
16
+ utc_starts_at = Time.utc(2013,4,13,7,0,0)
17
+ utc_ends_at = Time.utc(2013,4,14,6,59,59)
18
+
19
+ expect( response.forecast[0].starts_at.utc ).to eq utc_starts_at
20
+ expect( response.forecast[0].ends_at.utc ).to eq utc_ends_at
21
+ end
22
+ end
23
+ end
@@ -1,218 +1,78 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
- include Barometer
1
+ require_relative '../spec_helper'
3
2
 
4
- describe Barometer::WeatherService::WeatherBug, :vcr => {
5
- :cassette_name => "WeatherService::WeatherBug"
3
+ describe Barometer::WeatherService::WeatherBug, vcr: {
4
+ cassette_name: "WeatherService::WeatherBug"
6
5
  } do
7
- before(:each) do
8
- @accepted_formats = [:short_zipcode, :coordinates]
9
- end
10
-
11
- describe "the class methods" do
12
- it "defines accepted_formats" do
13
- WeatherService::WeatherBug._accepted_formats.should == @accepted_formats
14
- end
15
-
16
- it "defines source_name" do
17
- WeatherService::WeatherBug._source_name.should == :weather_bug
18
- end
19
-
20
- it "defines fetch_current" do
21
- WeatherService::WeatherBug.respond_to?("_fetch_current").should be_true
22
- end
23
-
24
- it "defines fetch_forecast" do
25
- WeatherService::WeatherBug.respond_to?("_fetch_forecast").should be_true
26
- end
27
-
28
- it "defines _requires_keys?" do
29
- WeatherService::WeatherBug.respond_to?("_requires_keys?").should be_true
30
- WeatherService::WeatherBug._requires_keys?.should be_true
31
- end
32
-
33
- it "defines _has_keys?" do
34
- WeatherService::WeatherBug.respond_to?("_has_keys?").should be_true
35
- WeatherService::WeatherBug._has_keys?.should be_false
36
- WeatherService::WeatherBug.keys = { :code => WEATHERBUG_CODE }
37
- WeatherService::WeatherBug._has_keys?.should be_true
38
- end
39
- end
40
-
41
- describe "building the current data" do
42
- it "defines the build method" do
43
- WeatherService::WeatherBug.respond_to?("_build_current").should be_true
44
- end
45
-
46
- it "requires Hash input" do
47
- lambda { WeatherService::WeatherBug._build_current }.should raise_error(ArgumentError)
48
- lambda { WeatherService::WeatherBug._build_current({}) }.should_not raise_error(ArgumentError)
49
- end
50
6
 
51
- it "returns Measurement::Current object" do
52
- current = WeatherService::WeatherBug._build_current({})
53
- current.is_a?(Measurement::Result).should be_true
54
- end
55
- end
56
-
57
- describe "building the forecast data" do
58
- it "defines the build method" do
59
- WeatherService::WeatherBug.respond_to?("_build_forecast").should be_true
60
- end
61
-
62
- it "requires Hash input" do
63
- lambda { WeatherService::WeatherBug._build_forecast }.should raise_error(ArgumentError)
64
- lambda { WeatherService::WeatherBug._build_forecast({}) }.should_not raise_error(ArgumentError)
65
- end
66
-
67
- it "returns Array object" do
68
- current = WeatherService::WeatherBug._build_forecast({})
69
- current.is_a?(Array).should be_true
70
- end
7
+ it "auto-registers this weather service as :weather_bug" do
8
+ Barometer::WeatherService.source(:weather_bug).should == Barometer::WeatherService::WeatherBug
71
9
  end
72
10
 
73
- describe "building the location data" do
74
- it "defines the build method" do
75
- WeatherService::WeatherBug.respond_to?("_build_location").should be_true
76
- end
77
-
78
- it "requires Hash input" do
79
- lambda { WeatherService::WeatherBug._build_location }.should raise_error(ArgumentError)
80
- lambda { WeatherService::WeatherBug._build_location({}) }.should_not raise_error(ArgumentError)
81
- end
82
-
83
- it "requires Barometer::Geo input" do
84
- geo = Data::Geo.new({})
85
- lambda { WeatherService::WeatherBug._build_location({}, {}) }.should raise_error(ArgumentError)
86
- lambda { WeatherService::WeatherBug._build_location({}, geo) }.should_not raise_error(ArgumentError)
87
- end
88
-
89
- it "returns Barometer::Location object" do
90
- location = WeatherService::WeatherBug._build_location({})
91
- location.is_a?(Data::Location).should be_true
92
- end
93
- end
11
+ describe ".call" do
12
+ context "when no keys provided" do
13
+ let(:query) { build_query }
94
14
 
95
- describe "building the sun data" do
96
- it "defines the build method" do
97
- WeatherService::WeatherBug.respond_to?("_build_sun").should be_true
98
- end
99
-
100
- it "requires Hash input" do
101
- lambda { WeatherService::WeatherBug._build_sun }.should raise_error(ArgumentError)
102
- lambda { WeatherService::WeatherBug._build_sun({}) }.should_not raise_error(ArgumentError)
103
- end
104
-
105
- it "returns Barometer::Sun object" do
106
- sun = WeatherService::WeatherBug._build_sun({})
107
- sun.is_a?(Data::Sun).should be_true
108
- end
109
- end
110
-
111
- describe "builds other data" do
112
- it "defines _build_extra" do
113
- WeatherService::WeatherBug.respond_to?("_build_extra").should be_true
114
- end
115
-
116
- it "defines _parse_local_time" do
117
- WeatherService::WeatherBug.respond_to?("_parse_local_time").should be_true
118
- end
119
-
120
- it "defines _build_timezone" do
121
- WeatherService::WeatherBug.respond_to?("_build_timezone").should be_true
122
- end
123
- end
124
-
125
- describe "when measuring" do
126
- before(:each) do
127
- @query = Barometer::Query.new("90210")
128
- @measurement = Barometer::Measurement.new
129
- end
130
-
131
- describe "all" do
132
- it "responds to _measure" do
133
- WeatherService::WeatherBug.respond_to?("_measure").should be_true
15
+ it "raises error" do
16
+ expect {
17
+ Barometer::WeatherService::WeatherBug.call(query)
18
+ }.to raise_error(Barometer::WeatherService::KeyRequired)
134
19
  end
20
+ end
135
21
 
136
- it "requires a Barometer::Measurement object" do
137
- lambda { WeatherService::WeatherBug._measure(nil, @query) }.should raise_error(ArgumentError)
138
- lambda { WeatherService::WeatherBug._measure("invalid", @query) }.should raise_error(ArgumentError)
139
-
140
- lambda { WeatherService::WeatherBug._measure(@measurement, @query) }.should_not raise_error(ArgumentError)
141
- end
22
+ context "when keys are provided" do
23
+ let(:converted_query) { Barometer::ConvertedQuery.new("90210", :short_zipcode, :metric) }
24
+ let(:query) { build_query.tap{|q|q.stub(:convert! => converted_query)} }
25
+ let(:config) { {keys: {code: WEATHERBUG_CODE}} }
142
26
 
143
- it "requires a Barometer::Query query" do
144
- lambda { WeatherService::WeatherBug._measure }.should raise_error(ArgumentError)
145
- lambda { WeatherService::WeatherBug._measure(@measurement, 1) }.should raise_error(ArgumentError)
27
+ subject { Barometer::WeatherService::WeatherBug.call(query, config) }
146
28
 
147
- lambda { WeatherService::WeatherBug._measure(@measurement, @query) }.should_not raise_error(ArgumentError)
29
+ it "asks the query to convert to accepted formats" do
30
+ query.should_receive(:convert!).with(:short_zipcode, :coordinates)
31
+ subject
148
32
  end
149
33
 
150
- it "returns a Barometer::Measurement object" do
151
- result = WeatherService::WeatherBug._measure(@measurement, @query)
152
- result.is_a?(Barometer::Measurement).should be_true
153
- result.current.is_a?(Measurement::Result).should be_true
154
- result.forecast.is_a?(Measurement::ResultArray).should be_true
34
+ it "includes the expected data" do
35
+ subject.query.should == '90210'
36
+ subject.format.should == :short_zipcode
37
+ subject.should be_metric
38
+
39
+ should have_data(:current, :observed_at).as_format(:time)
40
+ should have_data(:current, :stale_at).as_format(:time)
41
+
42
+ should have_data(:current, :humidity).as_format(:float)
43
+ should have_data(:current, :condition).as_format(:string)
44
+ should have_data(:current, :icon).as_format(:number)
45
+ should have_data(:current, :temperature).as_format(:temperature)
46
+ should have_data(:current, :dew_point).as_format(:temperature)
47
+ should have_data(:current, :wind_chill).as_format(:temperature)
48
+ should have_data(:current, :wind).as_format(:vector)
49
+ should have_data(:current, :pressure).as_format(:pressure)
50
+ should have_data(:current, :sun, :rise).as_format(:time)
51
+ should have_data(:current, :sun, :set).as_format(:time)
52
+
53
+ should have_data(:station, :id).as_value("NRTSH")
54
+ should have_data(:station, :name).as_value("Campbell Hall School")
55
+ should have_data(:station, :city).as_value("Valley Village")
56
+ should have_data(:station, :state_code).as_value("CA")
57
+ should have_data(:station, :country).as_value("USA")
58
+ should have_data(:station, :zip_code).as_value("91617")
59
+ should have_data(:station, :latitude).as_value(34.1536102294922)
60
+ should have_data(:station, :longitude).as_value(-118.398056030273)
61
+
62
+ should have_data(:location, :city).as_value("Beverly Hills")
63
+ should have_data(:location, :state_code).as_value("CA")
64
+ should have_data(:location, :zip_code).as_value("90210")
65
+
66
+ should have_data(:timezone, :to_s).as_format(/^P[DS]T$/i)
67
+
68
+ subject.forecast.size.should == 7
69
+ should have_forecast(:starts_at).as_format(:time)
70
+ should have_forecast(:ends_at).as_format(:time)
71
+ should have_forecast(:condition).as_format(:string)
72
+ should have_forecast(:icon).as_format(:number)
73
+ should have_forecast(:high).as_format(:temperature)
74
+ should have_forecast(:low).as_format(:temperature)
155
75
  end
156
76
  end
157
77
  end
158
-
159
- describe "overall data correctness" do
160
- before(:each) do
161
- @query = Barometer::Query.new("90210")
162
- @measurement = Barometer::Measurement.new
163
- end
164
-
165
- it "should correctly build the data" do
166
- result = WeatherService::WeatherBug._measure(@measurement, @query)
167
-
168
- # build current
169
- @measurement.current.humidity.to_s.should match(/^\d{1,2}$/i)
170
- @measurement.current.condition.should match(/^[\w ]+$/i)
171
- @measurement.current.icon.to_s.should match(/^\d{1,3}$/i)
172
- @measurement.current.temperature.to_s.should match(/^\d{1,3}[ ]?[cfCF]?$/i)
173
- @measurement.current.dew_point.to_s.should match(/^\d{1,3}[ ]?[cfCF]?$/i)
174
- @measurement.current.wind_chill.to_s.should match(/^\d{1,3}[ ]?[cfCF]?$/i)
175
- @measurement.current.wind.to_s.should match(/^\d{1,3}[ ]?[a-zA-Z]{0,3}$/i)
176
- @measurement.current.wind.direction.to_s.should match(/^[neswNESW]{0,3}$/i)
177
- @measurement.current.pressure.to_s.should match(/^\d{1,4}[ ]?[a-zA-Z]{0,3}$/i)
178
-
179
- # build sun
180
- @measurement.current.sun.rise.to_s.should match(/^\d{1,2}:\d{1,2}[ ]?[apmAPM]{0,2}$/i)
181
- @measurement.current.sun.set.to_s.should match(/^\d{1,2}:\d{1,2}[ ]?[apmAPM]{0,2}$/i)
182
-
183
- # build station
184
- @measurement.station.id.should == "LSNGN"
185
- @measurement.station.name.should == "Alexander Hamilton Senior HS"
186
- @measurement.station.city.should == "Los Angeles"
187
- @measurement.station.state_code.should == "CA"
188
- @measurement.station.country.should == "USA"
189
- @measurement.station.zip_code.should == "90034"
190
- @measurement.station.latitude.to_f.should == 34.0336112976074
191
- @measurement.station.longitude.to_f.should == -118.389999389648
192
-
193
- # builds location
194
- @measurement.location.city.should == "Beverly Hills"
195
- @measurement.location.state_code.should == "CA"
196
- @measurement.location.zip_code.should == "90210"
197
-
198
- # builds forecasts
199
- @measurement.forecast.size.should == 7
200
-
201
- @measurement.forecast[0].date.to_s.should match(/^\d{1,4}-\d{1,2}-\d{1,2}$/i)
202
- @measurement.forecast[0].condition.should match(/^[\w ]+$/i)
203
- @measurement.forecast[0].icon.to_s.should match(/^\d{1,3}$/i)
204
- @measurement.forecast[0].high.to_s.should match(/^\d{1,3}[ ]?[cfCF]?$/i)
205
- @measurement.forecast[0].low.to_s.should match(/^\d{1,3}[ ]?[cfCF]?$/i)
206
-
207
- @measurement.forecast[0].sun.rise.to_s.should match(/^\d{1,2}:\d{1,2}[ ]?[apmAPM]{0,2}$/i)
208
- @measurement.forecast[0].sun.set.to_s.should match(/^\d{1,2}:\d{1,2}[ ]?[apmAPM]{0,2}$/i)
209
-
210
- # builds local time
211
- @measurement.measured_at.to_s.should match(/^\d{1,2}:\d{1,2}[ ]?[apmAPM]{0,2}$/i)
212
- @measurement.current.current_at.to_s.should match(/^\d{1,2}:\d{1,2}[ ]?[apmAPM]{0,2}$/i)
213
-
214
- # builds timezone
215
- @measurement.timezone.code.should match(/^P[DS]T$/i)
216
- end
217
- end
218
78
  end
@@ -0,0 +1,19 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ module Barometer::WeatherService
4
+ describe WundergroundV1::CurrentResponse do
5
+ it "parses the timezones correctly" do
6
+ payload = Barometer::Utils::Payload.new({
7
+ "local_time" => "May 18, 10:46 AM PDT"
8
+ })
9
+ response = WundergroundV1::CurrentResponse.new.parse(payload)
10
+
11
+ utc_observed_at = Time.utc(2013,5,18,17,46,0)
12
+ utc_stale_at = Time.utc(2013,5,18,18,0,0)
13
+
14
+ expect( response.current.observed_at.utc ).to eq utc_observed_at
15
+ expect( response.current.stale_at.utc ).to eq utc_stale_at
16
+ expect( response.timezone.to_s ).to eq 'PDT'
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,62 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ module Barometer::WeatherService
4
+ describe WundergroundV1::ForecastResponse do
5
+ let(:current_response) { Barometer::Response.new }
6
+
7
+ it "parses the timezones correctly" do
8
+ payload = Barometer::Utils::Payload.new({
9
+ "simpleforecast" => { "forecastday" => [
10
+ {
11
+ "date" => {
12
+ "tz_long" => 'America/Los_Angeles',
13
+ "pretty" => '10:46 PM PDT on May 18, 2013'
14
+ }
15
+ }
16
+ ]}
17
+ })
18
+ response = WundergroundV1::ForecastResponse.new(current_response).parse(payload)
19
+
20
+ utc_starts_at = Time.utc(2013,5,19,5,46,0)
21
+ utc_ends_at = Time.utc(2013,5,20,5,45,59)
22
+
23
+ expect( response.forecast[0].starts_at.utc ).to eq utc_starts_at
24
+ expect( response.forecast[0].ends_at.utc ).to eq utc_ends_at
25
+ expect( response.timezone.to_s ).to eq 'America/Los_Angeles'
26
+ end
27
+
28
+ it "parses sun timezones correctly" do
29
+ current_response.current = Barometer::Response::Current.new
30
+ current_response.current.observed_at = Barometer::Utils::Time.parse("May 18, 10:46 AM PDT")
31
+ payload = Barometer::Utils::Payload.new({
32
+ "simpleforecast" => { "forecastday" => [
33
+ {
34
+ "date" => {
35
+ "tz_long" => 'America/Los_Angeles',
36
+ "pretty" => '10:46 PM PDT on May 18, 2013'
37
+ }
38
+ }
39
+ ]},
40
+ "moon_phase" => {
41
+ "sunrise" => {
42
+ "hour" => '7', "minute" => '59'
43
+ },
44
+ "sunset" => {
45
+ "hour" => '17', "minute" => '42'
46
+ }
47
+ }
48
+ })
49
+ response = WundergroundV1::ForecastResponse.new(current_response).parse(payload)
50
+
51
+ utc_current_sun_rise = Time.utc(2013,5,18,14,59,0)
52
+ utc_current_sun_set = Time.utc(2013,5,19,0,42,0)
53
+ utc_forecast_sun_rise = Time.utc(2013,5,19,14,59,0)
54
+ utc_forecast_sun_set = Time.utc(2013,5,20,0,42,0)
55
+
56
+ expect( response.current.sun.rise.utc ).to eq utc_current_sun_rise
57
+ expect( response.current.sun.set.utc ).to eq utc_current_sun_set
58
+ expect( response.forecast[0].sun.rise.utc ).to eq utc_forecast_sun_rise
59
+ expect( response.forecast[0].sun.set.utc ).to eq utc_forecast_sun_set
60
+ end
61
+ end
62
+ end