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,78 @@
1
+ require_relative '../spec_helper'
2
+
3
+ module Barometer::WeatherService
4
+ describe WundergroundV1, vcr: {
5
+ cassette_name: "WeatherService::WundergroundV1"
6
+ } do
7
+
8
+ it "auto-registers this weather service as :wunderground" do
9
+ Barometer::WeatherService.source(:wunderground, :v1).should == WundergroundV1
10
+ end
11
+
12
+ describe ".call" do
13
+ let(:converted_query) { Barometer::ConvertedQuery.new('Calgary,AB', :geocode, :metric) }
14
+ let(:query) { build_query.tap{|q|q.stub(:convert! => converted_query)} }
15
+
16
+ subject { WundergroundV1.call(query) }
17
+
18
+ it "asks the query to convert to accepted formats" do
19
+ query.should_receive(:convert!).with(:zipcode, :postalcode, :icao, :coordinates, :geocode)
20
+ subject
21
+ end
22
+
23
+ it "includes the expected data" do
24
+ subject.query.should == 'Calgary,AB'
25
+ subject.format.should == :geocode
26
+ subject.should be_metric
27
+
28
+ should have_data(:current, :observed_at).as_format(:time)
29
+ should have_data(:current, :stale_at).as_format(:time)
30
+
31
+ should have_data(:current, :humidity).as_format(:float)
32
+ should have_data(:current, :condition).as_format(:string)
33
+ should have_data(:current, :icon).as_format(:string)
34
+ should have_data(:current, :temperature).as_format(:temperature)
35
+ should have_data(:current, :dew_point).as_format(:temperature)
36
+ # should have_data(:current, :wind_chill).as_format(:temperature)
37
+ # should have_data(:current, :heat_index).as_format(:optional_string)
38
+ should have_data(:current, :wind).as_format(:vector)
39
+ should have_data(:current, :visibility).as_format(:distance)
40
+ should have_data(:current, :pressure).as_format(:pressure)
41
+ should have_data(:current, :sun, :rise).as_format(:time)
42
+ should have_data(:current, :sun, :set).as_format(:time)
43
+
44
+ should have_data(:station, :id).as_value("CYYC")
45
+ should have_data(:station, :name).as_value("Calgary,")
46
+ should have_data(:station, :city).as_value("Calgary")
47
+ should have_data(:station, :state_code).as_format(:optional_string)
48
+ should have_data(:station, :country_code).as_value("CA")
49
+ should have_data(:station, :latitude).as_value(51.11999893)
50
+ should have_data(:station, :longitude).as_value(-114.01999664)
51
+
52
+ should have_data(:location, :name).as_value("Calgary, Alberta")
53
+ should have_data(:location, :city).as_value("Calgary")
54
+ should have_data(:location, :state_code).as_value("AB")
55
+ should have_data(:location, :state_name).as_value("Alberta")
56
+ should have_data(:location, :zip_code).as_value("00000")
57
+ should have_data(:location, :country_code).as_value("CA")
58
+ should have_data(:location, :latitude).as_value(51.11999893)
59
+ should have_data(:location, :longitude).as_value(-114.01999664)
60
+
61
+ should have_data(:timezone, :code).as_format(/^M[DS]T$/i)
62
+ should have_data(:timezone, :to_s).as_value('America/Edmonton')
63
+
64
+ subject.forecast.size.should == 6
65
+ should have_forecast(:starts_at).as_format(:time)
66
+ should have_forecast(:ends_at).as_format(:time)
67
+
68
+ subject.forecast[0].ends_at.to_i.should == (subject.forecast[0].starts_at + (60 * 60 * 24 - 1)).to_i
69
+ should have_forecast(:pop).as_format(:float)
70
+ should have_forecast(:icon).as_format(:string)
71
+ should have_forecast(:high).as_format(:temperature)
72
+ should have_forecast(:low).as_format(:temperature)
73
+ should have_forecast(:sun, :rise).as_format(:time)
74
+ should have_forecast(:sun, :set).as_format(:time)
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,73 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ module Barometer::WeatherService
4
+ describe Yahoo::Response do
5
+ it "parses the timezones correctly for current weather" do
6
+ payload = Barometer::Utils::Payload.new({
7
+ "item" => {
8
+ "pubDate" => "Sun, 14 Apr 2013 1:24 pm PDT"
9
+ }
10
+ })
11
+ response = Yahoo::Response.new.parse(payload)
12
+
13
+ utc_observed_at = Time.utc(2013,4,14,20,24,0)
14
+ utc_stale_at = Time.utc(2013,4,14,21,24,0)
15
+
16
+ expect( response.current.observed_at.utc ).to eq utc_observed_at
17
+ expect( response.current.stale_at.utc ).to eq utc_stale_at
18
+ expect( response.timezone.to_s ).to eq 'PDT'
19
+ end
20
+
21
+ it "parses the timezones correctly for forecasted weather" do
22
+ payload = Barometer::Utils::Payload.new({
23
+ "item" => {
24
+ "pubDate" => "Sun, 14 Apr 2013 1:24 pm PDT",
25
+ "forecast" => [
26
+ {
27
+ "@date" => "14 Apr 2013"
28
+ }
29
+ ]
30
+ },
31
+ "astronomy" => {
32
+ "@sunrise" => "6:44 am",
33
+ "@sunset" => "5:32 pm"
34
+ }
35
+ })
36
+ response = Yahoo::Response.new.parse(payload)
37
+
38
+ utc_starts_at = Time.utc(2013,4,14,7,0,0)
39
+ utc_ends_at = Time.utc(2013,4,15,6,59,59)
40
+
41
+ expect( response.forecast[0].starts_at.utc ).to eq utc_starts_at
42
+ expect( response.forecast[0].ends_at.utc ).to eq utc_ends_at
43
+ end
44
+
45
+ it "parses sun timezones correctly" do
46
+ payload = Barometer::Utils::Payload.new({
47
+ "item" => {
48
+ "pubDate" => "Sun, 14 Apr 2013 1:24 pm PDT",
49
+ "forecast" => [
50
+ {
51
+ "@date" => "15 Apr 2013"
52
+ }
53
+ ]
54
+ },
55
+ "astronomy" => {
56
+ "@sunrise" => "6:44 am",
57
+ "@sunset" => "5:32 pm"
58
+ }
59
+ })
60
+ response = Yahoo::Response.new.parse(payload)
61
+
62
+ utc_current_sun_rise = Time.utc(2013,4,14,13,44,0)
63
+ utc_current_sun_set = Time.utc(2013,4,15,0,32,0)
64
+ utc_forecast_sun_rise = Time.utc(2013,4,15,13,44,0)
65
+ utc_forecast_sun_set = Time.utc(2013,4,16,0,32,0)
66
+
67
+ expect( response.current.sun.rise.utc ).to eq utc_current_sun_rise
68
+ expect( response.current.sun.set.utc ).to eq utc_current_sun_set
69
+ expect( response.forecast[0].sun.rise ).to eq utc_forecast_sun_rise
70
+ expect( response.forecast[0].sun.set.utc ).to eq utc_forecast_sun_set
71
+ end
72
+ end
73
+ end
@@ -1,143 +1,60 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
- include Barometer
1
+ require_relative '../spec_helper'
3
2
 
4
- describe Barometer::WeatherService::Yahoo, :vcr => {
5
- :cassette_name => "WeatherService::Yahoo"
3
+ describe Barometer::WeatherService::Yahoo, vcr: {
4
+ cassette_name: "WeatherService::Yahoo"
6
5
  } do
7
- before(:each) do
8
- @accepted_formats = [:zipcode, :weather_id, :woe_id]
9
- end
10
-
11
- describe "the class methods" do
12
- it "defines accepted_formats" do
13
- WeatherService::Yahoo._accepted_formats.should == @accepted_formats
14
- end
15
-
16
- it "defines source_name" do
17
- WeatherService::Yahoo._source_name.should == :yahoo
18
- end
19
-
20
- it "defines get_all" do
21
- WeatherService::Yahoo.respond_to?("_fetch").should be_true
22
- end
23
- end
24
-
25
- describe "building the current data" do
26
- it "defines the build method" do
27
- WeatherService::Yahoo.respond_to?("_build_current").should be_true
28
- end
29
-
30
- it "requires Hash input" do
31
- lambda { WeatherService::Yahoo._build_current }.should raise_error(ArgumentError)
32
- lambda { WeatherService::Yahoo._build_current({}) }.should_not raise_error(ArgumentError)
33
- end
34
-
35
- it "returns Barometer::CurrentMeasurement object" do
36
- current = WeatherService::Yahoo._build_current({})
37
- current.is_a?(Measurement::Result).should be_true
38
- end
39
- end
40
-
41
- describe "building the forecast data" do
42
- it "defines the build method" do
43
- WeatherService::Yahoo.respond_to?("_build_forecast").should be_true
44
- end
45
-
46
- it "requires Hash input" do
47
- lambda { WeatherService::Yahoo._build_forecast }.should raise_error(ArgumentError)
48
- lambda { WeatherService::Yahoo._build_forecast({}) }.should_not raise_error(ArgumentError)
49
- end
50
-
51
- it "returns Array object" do
52
- current = WeatherService::Yahoo._build_forecast({})
53
- current.is_a?(Array).should be_true
54
- end
55
- end
56
-
57
- describe "building the location data" do
58
- it "defines the build method" do
59
- WeatherService::Yahoo.respond_to?("_build_location").should be_true
60
- end
61
-
62
- it "requires Hash input" do
63
- lambda { WeatherService::Yahoo._build_location }.should raise_error(ArgumentError)
64
- lambda { WeatherService::Yahoo._build_location({}) }.should_not raise_error(ArgumentError)
65
- end
66
6
 
67
- it "requires Barometer::Geo input" do
68
- geo = Data::Geo.new({})
69
- lambda { WeatherService::Yahoo._build_location({}, {}) }.should raise_error(ArgumentError)
70
- lambda { WeatherService::Yahoo._build_location({}, geo) }.should_not raise_error(ArgumentError)
71
- end
72
-
73
- it "returns Barometer::Location object" do
74
- location = WeatherService::Yahoo._build_location({})
75
- location.is_a?(Data::Location).should be_true
76
- end
7
+ it "auto-registers this weather service as :yahoo" do
8
+ Barometer::WeatherService.source(:yahoo).should == Barometer::WeatherService::Yahoo
77
9
  end
78
10
 
79
- describe "when measuring" do
80
- before(:each) do
81
- @query = Barometer::Query.new("90210")
82
- @measurement = Barometer::Measurement.new
83
- end
84
-
85
- describe "all" do
86
- it "responds to _measure" do
87
- WeatherService::Yahoo.respond_to?("_measure").should be_true
88
- end
89
-
90
- it "requires a Barometer::Measurement object" do
91
- lambda { WeatherService::Yahoo._measure(nil, @query) }.should raise_error(ArgumentError)
92
- lambda { WeatherService::Yahoo._measure("invlaid", @query) }.should raise_error(ArgumentError)
93
-
94
- lambda { WeatherService::Yahoo._measure(@measurement, @query) }.should_not raise_error(ArgumentError)
95
- end
96
-
97
- it "requires a Barometer::Query query" do
98
- lambda { WeatherService::Yahoo._measure }.should raise_error(ArgumentError)
99
- lambda { WeatherService::Yahoo._measure(@measurement, 1) }.should raise_error(ArgumentError)
100
-
101
- lambda { WeatherService::Yahoo._measure(@measurement, @query) }.should_not raise_error(ArgumentError)
102
- end
103
-
104
- it "returns a Barometer::Measurement object" do
105
- result = WeatherService::Yahoo._measure(@measurement, @query)
106
- result.is_a?(Barometer::Measurement).should be_true
107
- result.current.is_a?(Measurement::Result).should be_true
108
- result.forecast.is_a?(Array).should be_true
109
- end
110
- end
111
- end
112
-
113
- describe "overall data correctness" do
114
- before(:each) do
115
- @query = Barometer::Query.new("90210")
116
- @measurement = Barometer::Measurement.new
117
- end
118
-
119
- it "should correctly build the data" do
120
- result = WeatherService::Yahoo._measure(@measurement, @query)
121
-
122
- # build current
123
- @measurement.current.sun.rise.to_s.should match(/^\d{1,2}:\d{1,2}[ ]?[apmAPM]{0,2}$/i)
124
- @measurement.current.sun.set.to_s.should match(/^\d{1,2}:\d{1,2}[ ]?[apmAPM]{0,2}$/i)
125
-
126
- # builds location
127
- @measurement.location.city.should == "Beverly Hills"
128
-
129
- # builds forecasts
130
- @measurement.forecast.size.should == 2
131
-
132
- @measurement.forecast[0].condition.should match(/^[\w ]+$/i)
133
- @measurement.forecast[0].icon.to_s.should match(/^\d{1,3}$/i)
134
- @measurement.forecast[0].sun.rise.to_s.should match(/^\d{1,2}:\d{1,2}[ ]?[apmAPM]{0,2}$/i)
135
- @measurement.forecast[0].sun.set.to_s.should match(/^\d{1,2}:\d{1,2}[ ]?[apmAPM]{0,2}$/i)
136
-
137
- @measurement.forecast[1].condition.should match(/^[\w ]+$/i)
138
- @measurement.forecast[1].icon.to_s.should match(/^\d{1,3}$/i)
139
- @measurement.forecast[1].sun.rise.to_s.should match(/^\d{1,2}:\d{1,2}[ ]?[apmAPM]{0,2}$/i)
140
- @measurement.forecast[1].sun.set.to_s.should match(/^\d{1,2}:\d{1,2}[ ]?[apmAPM]{0,2}$/i)
11
+ describe ".call" do
12
+ let(:converted_query) { Barometer::ConvertedQuery.new('90210', :zipcode, :metric) }
13
+ let(:query) { build_query.tap{|q|q.stub(:convert! => converted_query)} }
14
+
15
+ subject { Barometer::WeatherService::Yahoo.call(query) }
16
+
17
+ it "asks the query to convert to accepted formats" do
18
+ query.should_receive(:convert!).with(:zipcode, :weather_id, :woe_id)
19
+ subject
20
+ end
21
+
22
+ it "includes the expected data" do
23
+ subject.query.should == '90210'
24
+ subject.format.should == :zipcode
25
+ subject.should be_metric
26
+
27
+ should have_data(:current, :observed_at).as_format(:time)
28
+ should have_data(:current, :stale_at).as_format(:time)
29
+
30
+ should have_data(:current, :humidity).as_format(:float)
31
+ should have_data(:current, :condition).as_format(:string)
32
+ should have_data(:current, :icon).as_format(:number)
33
+ should have_data(:current, :temperature).as_format(:temperature)
34
+ should have_data(:current, :wind_chill).as_format(:temperature)
35
+ should have_data(:current, :wind).as_format(:vector)
36
+ should have_data(:current, :pressure).as_format(:pressure)
37
+ should have_data(:current, :visibility).as_format(:distance)
38
+ should have_data(:current, :sun, :rise).as_format(:time)
39
+ should have_data(:current, :sun, :set).as_format(:time)
40
+
41
+ should have_data(:location, :city).as_value("Beverly Hills")
42
+ should have_data(:location, :state_code).as_value("CA")
43
+ should have_data(:location, :country_code).as_value("US")
44
+ should have_data(:location, :latitude).as_value(34.08)
45
+ should have_data(:location, :longitude).as_value(-118.4)
46
+
47
+ should have_data(:timezone, :to_s).as_format(/^P[DS]T$/i)
48
+
49
+ subject.forecast.size.should == 5
50
+ should have_forecast(:starts_at).as_format(:time)
51
+ should have_forecast(:ends_at).as_format(:time)
52
+ should have_forecast(:icon).as_format(:number)
53
+ should have_forecast(:condition).as_format(:string)
54
+ should have_forecast(:high).as_format(:temperature)
55
+ should have_forecast(:low).as_format(:temperature)
56
+ should have_forecast(:sun, :rise).as_format(:time)
57
+ should have_forecast(:sun, :set).as_format(:time)
141
58
  end
142
59
  end
143
60
  end
@@ -0,0 +1,103 @@
1
+ require 'spec_helper'
2
+
3
+ module Barometer
4
+ describe WeatherService do
5
+ around do |example|
6
+ services_cache = WeatherService.services
7
+ WeatherService.services = Utils::VersionedRegistration.new
8
+ example.run
9
+ WeatherService.services = services_cache
10
+ end
11
+
12
+ describe ".register" do
13
+ it "adds the weather service to the list of available services" do
14
+ expect {
15
+ WeatherService.register(:test_weather, double(:weather_service))
16
+ }.to change { WeatherService.services.size }.by(1)
17
+ end
18
+
19
+ it "registers the service for a given version" do
20
+ weather_service = double(:weather_service)
21
+ WeatherService.register(:test_weather, :v1, weather_service)
22
+ expect {
23
+ WeatherService.register(:test_weather, :v2, weather_service)
24
+ }.to change { WeatherService.services.size }.by(1)
25
+ end
26
+
27
+ it "adds the block as an available weather service" do
28
+ expect {
29
+ WeatherService.register(:test_weather) do
30
+ Response.new.tap do |r|
31
+ r.current = Response::Current.new
32
+ r.current.temperature = 30
33
+ end
34
+ end
35
+ }.to change { WeatherService.services.size }.by(1)
36
+
37
+ expect( WeatherService.new(:test_weather).measure(build_query).current.temperature.to_i ).to eq 30
38
+ end
39
+
40
+ it "raises an error if no service or block given" do
41
+ expect {
42
+ WeatherService.register(:test_weather)
43
+ }.to raise_error(ArgumentError)
44
+ end
45
+
46
+ it "allows the serivce to be referenced by key" do
47
+ expect( WeatherService.services ).not_to have_key :test_weather
48
+ WeatherService.register(:test_weather, double(:weather_service))
49
+ expect( WeatherService.services ).to have_key :test_weather
50
+ end
51
+
52
+ it "only registers a key once" do
53
+ weather_service = double(:weather_service)
54
+ WeatherService.register(:test_weather, weather_service)
55
+ expect {
56
+ WeatherService.register(:test_weather, weather_service)
57
+ }.not_to change { WeatherService.services.size }
58
+ end
59
+
60
+ it "only registers a version once" do
61
+ weather_service = double(:weather_service)
62
+ WeatherService.register(:test_weather, :v1, weather_service)
63
+ expect {
64
+ WeatherService.register(:test_weather, :v1, weather_service)
65
+ }.not_to change { WeatherService.services.size }
66
+ end
67
+ end
68
+
69
+ describe ".source" do
70
+ it "returns a registered source" do
71
+ test_weather = double(:test_weather)
72
+ WeatherService.register(:test_weather, test_weather)
73
+
74
+ expect( WeatherService.source(:test_weather) ).to eq test_weather
75
+ end
76
+
77
+ it "raises an error if the source does not exist" do
78
+ expect {
79
+ WeatherService.source(:test_weather)
80
+ }.to raise_error(WeatherService::NotFound)
81
+ end
82
+
83
+ it "raises an error if the version does not exist" do
84
+ expect {
85
+ WeatherService.source(:test_weather, :v1)
86
+ }.to raise_error(WeatherService::NotFound)
87
+ end
88
+
89
+ context "when multiple versions are registered" do
90
+ it "returns the requested version" do
91
+ test_weather = double(:test_weather)
92
+ other_weather = double(:other_weather)
93
+ WeatherService.register(:test_weather, nil, test_weather)
94
+ WeatherService.register(:test_weather, :v1, other_weather)
95
+
96
+ expect( WeatherService.source(:test_weather) ).to eq test_weather
97
+ expect( WeatherService.source(:test_weather, nil) ).to eq test_weather
98
+ expect( WeatherService.source(:test_weather, :v1) ).to eq other_weather
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end