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,116 @@
1
+ require_relative '../spec_helper'
2
+
3
+ module Barometer
4
+ describe WeatherService::Base 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 "#measure" do
13
+ let(:test_weather) { double(:test_weather) }
14
+ let(:query) { build_query }
15
+ let(:options) { {} }
16
+ let(:test_response) { Response.new }
17
+
18
+ before do
19
+ test_weather.stub(call: test_response)
20
+ WeatherService.register(:test_weather, test_weather)
21
+ end
22
+
23
+ it "calls the requested weather service" do
24
+ WeatherService.new(:test_weather).measure(query)
25
+ expect( test_weather ).to have_received(:call).with(query, {})
26
+ end
27
+
28
+ it "calls the requested version of the weather service" do
29
+ test_weather_v2 = double(:test_weather, call: test_response)
30
+ WeatherService.register(:test_weather, :v2, test_weather_v2)
31
+
32
+ WeatherService.new(:test_weather, :v2).measure(query)
33
+
34
+ expect( test_weather_v2 ).to have_received(:call).with(query, {})
35
+ end
36
+
37
+ it "passes along query and options" do
38
+ WeatherService.new(:test_weather).measure(query, options)
39
+ expect( test_weather ).to have_received(:call).with(query, options)
40
+ end
41
+
42
+ describe "timing information" do
43
+ it "adds response_started_at" do
44
+ response = WeatherService.new(:test_weather).measure(query)
45
+ expect( response.response_started_at ).to be
46
+ end
47
+
48
+ it "adds response_ended_at" do
49
+ response = WeatherService.new(:test_weather).measure(query)
50
+ expect( response.response_ended_at ).to be
51
+ end
52
+ end
53
+
54
+ describe "source information" do
55
+ it "adds the source" do
56
+ response = WeatherService.new(:test_weather).measure(query)
57
+ expect( response.source ).to eq :test_weather
58
+ end
59
+
60
+ it "adds the source weight" do
61
+ response = WeatherService.new(:test_weather).measure(query, {weight: 10})
62
+ expect( response.weight ).to eq 10
63
+ end
64
+
65
+ it "adds the default source weight" do
66
+ response = WeatherService.new(:test_weather).measure(query)
67
+ expect( response.weight ).to eq 1
68
+ end
69
+ end
70
+
71
+ describe "error handling" do
72
+ it "adds code 200 if no errors" do
73
+ test_response.stub(complete?: true)
74
+
75
+ response = WeatherService.new(:test_weather).measure(query)
76
+ expect( response.status_code ).to eq 200
77
+ end
78
+
79
+ it "adds code 204 if service has no data" do
80
+ test_response.stub(complete?: false)
81
+
82
+ response = WeatherService.new(:test_weather).measure(query)
83
+ expect( response.status_code ).to eq 204
84
+ end
85
+
86
+ it "adds code 401 if required key not provided" do
87
+ test_weather.stub(:call).and_raise(WeatherService::KeyRequired)
88
+
89
+ response = WeatherService.new(:test_weather).measure(query)
90
+ expect( response.status_code ).to eq 401
91
+ end
92
+
93
+ it "adds code 406 if query format unsupported" do
94
+ test_weather.stub(:call).and_raise(Query::ConversionNotPossible)
95
+
96
+ response = WeatherService.new(:test_weather).measure(query)
97
+ expect( response.status_code ).to eq 406
98
+ end
99
+
100
+ it "adds code 406 if query region unsupported" do
101
+ test_weather.stub(:call).and_raise(Query::UnsupportedRegion)
102
+
103
+ response = WeatherService.new(:test_weather).measure(query)
104
+ expect( response.status_code ).to eq 406
105
+ end
106
+
107
+ it "adds code 408 if service unavailable (timeout)" do
108
+ test_weather.stub(:call).and_raise(Timeout::Error)
109
+
110
+ response = WeatherService.new(:test_weather).measure(query)
111
+ expect( response.status_code ).to eq 408
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,71 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe Barometer::WeatherService::ForecastIo, vcr: {
4
+ cassette_name: "WeatherService::ForecastIo"
5
+ } do
6
+
7
+ it "auto-registers this weather service as :forecast_io" do
8
+ Barometer::WeatherService.source(:forecast_io).should == Barometer::WeatherService::ForecastIo
9
+ end
10
+
11
+ describe ".call" do
12
+ context "when no keys provided" do
13
+ let(:query) { build_query }
14
+
15
+ it "raises error" do
16
+ expect {
17
+ Barometer::WeatherService::ForecastIo.call(query)
18
+ }.to raise_error(Barometer::WeatherService::KeyRequired)
19
+ end
20
+ end
21
+
22
+ context "when keys are provided" do
23
+ let(:converted_query) { Barometer::ConvertedQuery.new('42.7243,-73.6927', :coordinates, :metric) }
24
+ let(:query) { build_query.tap{|q|q.stub(:convert! => converted_query)} }
25
+ let(:config) { {keys: {api: FORECAST_IO_APIKEY}} }
26
+
27
+ subject { Barometer::WeatherService::ForecastIo.call(query, config) }
28
+
29
+ it "asks the query to convert to accepted formats" do
30
+ query.should_receive(:convert!).with(:coordinates)
31
+ subject
32
+ end
33
+
34
+ it "includes the expected data" do
35
+ subject.query.should == '42.7243,-73.6927'
36
+ subject.format.should == :coordinates
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(:string)
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).as_format(:vector)
48
+ should have_data(:current, :pressure).as_format(:pressure)
49
+ should have_data(:current, :visibility).as_format(:distance)
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(:location, :latitude).as_value(42.7243)
54
+ should have_data(:location, :longitude).as_value(-73.6927)
55
+
56
+ should have_data(:timezone, :to_s).as_value('America/New_York')
57
+ should have_data(:timezone, :code).as_format(/^E[DS]T$/i)
58
+
59
+ subject.forecast.size.should == 8
60
+ should have_forecast(:starts_at).as_format(:time)
61
+ should have_forecast(:ends_at).as_format(:time)
62
+ should have_forecast(:icon).as_format(:string)
63
+ should have_forecast(:condition).as_format(:string)
64
+ should have_forecast(:high).as_format(:temperature)
65
+ should have_forecast(:low).as_format(:temperature)
66
+ should have_forecast(:sun, :rise).as_format(:time)
67
+ should have_forecast(:sun, :set).as_format(:time)
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,22 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ module Barometer::WeatherService
4
+ describe Noaa::CurrentResponse do
5
+ let(:forecast_response) { Barometer::Response.new }
6
+
7
+ it "parses the timezones correctly" do
8
+ payload = Barometer::Utils::Payload.new({
9
+ "observation_time_rfc822" => "Sun, 14 Apr 2013 10:51:00 -0700",
10
+ "observation_time" => "Last Updated on Apr 14 2013, 10:51 am PDT"
11
+ })
12
+ response = Noaa::CurrentResponse.new(forecast_response).parse(payload)
13
+
14
+ utc_observed_at = Time.utc(2013,04,14,17,51,00)
15
+ utc_stale_at = Time.utc(2013,04,14,18,51,00)
16
+
17
+ expect( response.current.observed_at.utc ).to eq utc_observed_at
18
+ expect( response.current.stale_at.utc ).to eq utc_stale_at
19
+ expect( response.timezone.to_s ).to eq 'PDT'
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,33 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ module Barometer::WeatherService
4
+ describe Noaa::ForecastResponse do
5
+ it "parses the timezones correctly" do
6
+ payload = Barometer::Utils::Payload.new({
7
+ "time_layout" => [
8
+ {
9
+ "layout_key"=> "k-p12h-n14-2",
10
+ "start_valid_time" => ["2013-02-09T06:00:00-08:00"],
11
+ "end_valid_time" => ["2013-02-09T18:00:00-08:00"]
12
+ }
13
+ ],
14
+ "parameters" => {
15
+ "temperature" => [
16
+ {"value"=>["55"], "@type"=>"maximum"},
17
+ {"@type"=>"minimum"}
18
+ ],
19
+ "probability_of_precipitation" => { "value" => [] },
20
+ "weather" => { "weather_conditions" => [] },
21
+ "conditions_icon" => { "icon_link" => [] }
22
+ }
23
+ })
24
+ response = Noaa::ForecastResponse.new.parse(payload)
25
+
26
+ utc_starts_at = Time.utc(2013,2,9,14,0,0)
27
+ utc_ends_at = Time.utc(2013,2,10,2,0,0)
28
+
29
+ expect( response.forecast[0].starts_at.utc ).to eq utc_starts_at
30
+ expect( response.forecast[0].ends_at.utc ).to eq utc_ends_at
31
+ end
32
+ end
33
+ end
@@ -1,179 +1,81 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
- include Barometer
1
+ require_relative '../spec_helper'
3
2
 
4
- describe Barometer::WeatherService::Noaa, :vcr => {
5
- :cassette_name => "WeatherService::Noaa"
3
+ describe Barometer::WeatherService::Noaa, vcr: {
4
+ cassette_name: "WeatherService::Noaa"
6
5
  } do
7
- before(:each) do
8
- @accepted_formats = [:zipcode, :coordinates]
9
- end
10
-
11
- describe "the class methods" do
12
- it "defines accepted_formats" do
13
- WeatherService::Noaa._accepted_formats.should == @accepted_formats
14
- end
15
-
16
- it "defines source_name" do
17
- WeatherService::Noaa._source_name.should == :noaa
18
- end
19
-
20
- it "defines fetch_current" do
21
- WeatherService::Noaa.respond_to?("_fetch_current").should be_true
22
- end
23
6
 
24
- it "defines fetch_forecast" do
25
- WeatherService::Noaa.respond_to?("_fetch_forecast").should be_true
26
- end
27
-
28
- it "defines get_all" do
29
- WeatherService::Noaa.respond_to?("_fetch").should be_true
30
- end
31
-
32
- describe "acceptable countries" do
33
- before(:each) do
34
- @query = Barometer::Query.new("90210")
35
- @measurement = Barometer::Measurement.new
36
- end
37
-
38
- it "accepts nil" do
39
- @query.country_code = nil
40
- WeatherService::Noaa._supports_country?(@query).should be_true
41
- end
42
-
43
- it "accepts blank" do
44
- @query.country_code = ""
45
- WeatherService::Noaa._supports_country?(@query).should be_true
46
- end
47
-
48
- it "accepts US" do
49
- @query.country_code = "US"
50
- WeatherService::Noaa._supports_country?(@query).should be_true
51
- end
52
-
53
- it "rejects other" do
54
- @query.country_code = "CA"
55
- WeatherService::Noaa._supports_country?(@query).should be_false
56
- end
57
- end
7
+ it "auto-registers this weather service as :noaa" do
8
+ Barometer::WeatherService.source(:noaa).should == Barometer::WeatherService::Noaa
58
9
  end
59
10
 
60
- describe "building the current data" do
61
- it "defines the build method" do
62
- WeatherService::Noaa.respond_to?("_build_current").should be_true
63
- end
64
-
65
- it "requires Hash input" do
66
- lambda { WeatherService::Noaa._build_current }.should raise_error(ArgumentError)
67
- lambda { WeatherService::Noaa._build_current({}) }.should_not raise_error(ArgumentError)
68
- end
11
+ describe ".call" do
12
+ let(:query) { build_query.tap{|q|q.stub(add_conversion: nil)} }
69
13
 
70
- it "returns Barometer::CurrentMeasurement object" do
71
- current = WeatherService::Noaa._build_current({})
72
- current.is_a?(Measurement::Result).should be_true
73
- end
74
- end
14
+ subject { Barometer::WeatherService::Noaa.call(query) }
75
15
 
76
- describe "building the forecast data" do
77
- it "defines the build method" do
78
- WeatherService::Noaa.respond_to?("_build_forecast").should be_true
79
- end
80
-
81
- it "requires Hash input" do
82
- lambda { WeatherService::Noaa._build_forecast }.should raise_error(ArgumentError)
83
- lambda { WeatherService::Noaa._build_forecast({}) }.should_not raise_error(ArgumentError)
84
- end
85
-
86
- it "returns Array object" do
87
- current = WeatherService::Noaa._build_forecast({})
88
- current.is_a?(Array).should be_true
89
- end
90
- end
91
-
92
- describe "when measuring" do
93
- before(:each) do
94
- @query = Barometer::Query.new("90210")
95
- @measurement = Barometer::Measurement.new
96
- end
97
-
98
- describe "all" do
99
- it "responds to _measure" do
100
- Barometer::WeatherService::Noaa.respond_to?("_measure").should be_true
101
- end
102
-
103
- it "requires a Barometer::Measurement object" do
104
- lambda { Barometer::WeatherService::Noaa._measure(nil, @query) }.should raise_error(ArgumentError)
105
- lambda { Barometer::WeatherService::Noaa._measure("invalid", @query) }.should raise_error(ArgumentError)
106
-
107
- lambda { Barometer::WeatherService::Noaa._measure(@measurement, @query) }.should_not raise_error(ArgumentError)
108
- end
109
-
110
- it "requires a Barometer::Query query" do
111
- lambda { Barometer::WeatherService::Noaa._measure }.should raise_error(ArgumentError)
112
- lambda { Barometer::WeatherService::Noaa._measure(@measurement, 1) }.should raise_error(ArgumentError)
113
-
114
- lambda { Barometer::WeatherService::Noaa._measure(@measurement, @query) }.should_not raise_error(ArgumentError)
115
- end
116
-
117
- it "returns a Barometer::Measurement object" do
118
- result = Barometer::WeatherService::Noaa._measure(@measurement, @query)
119
- result.is_a?(Barometer::Measurement).should be_true
120
- result.current.is_a?(Barometer::Measurement::Result).should be_true
121
- result.forecast.is_a?(Barometer::Measurement::ResultArray).should be_true
16
+ before do
17
+ query.stub(:convert!).and_return do |*formats|
18
+ if formats.include?(:noaa_station_id)
19
+ Barometer::ConvertedQuery.new("KSMO", :station_id)
20
+ elsif formats.include?(:zipcode)
21
+ Barometer::ConvertedQuery.new("90210", :zipcode)
22
+ end
122
23
  end
123
24
  end
124
- end
125
-
126
- describe "overall data correctness" do
127
- before(:each) do
128
- @query = Barometer::Query.new("90210")
129
- @measurement = Barometer::Measurement.new
130
- end
131
-
132
- it "should correctly build the data" do
133
- result = WeatherService::Noaa._measure(@measurement, @query)
134
-
135
- # build current
136
- @measurement.current.humidity.to_s.should match(/^\d{0,2}$/i)
137
- @measurement.current.condition.should match(/^[\w ]{2,}$/i)
138
- @measurement.current.icon.to_s.should match(/^\w{1,4}$/i)
139
- @measurement.current.temperature.to_s.should match(/^\d{1,3}[ ]?[cfCF]?$/i)
140
- @measurement.current.dew_point.to_s.should match(/^\d{1,3}[ ]?[cfCF]?$/i)
141
- @measurement.current.wind_chill.to_s.should match(/^\d{0,3}[ ]?[cfCF]?$/i)
142
- @measurement.current.wind.to_s.should match(/^\d{1,3}[ ]?[a-zA-Z]{0,3}$/i)
143
- @measurement.current.wind.direction.to_s.should match(/^[neswNESW][\w ]{3,}$/i)
144
- @measurement.current.wind.degrees.to_s.should match(/^\d{1,3}$/i)
145
- @measurement.current.pressure.to_s.should match(/^\d{1,4}[ ]?[a-zA-Z]{0,3}$/i)
146
-
147
- # build station
148
- @measurement.station.id.should == "KSMO"
149
- @measurement.station.name.should == "Santa Monica Muni, CA"
150
- @measurement.station.city.should == "Santa Monica Muni"
151
- @measurement.station.state_code.should == "CA"
152
- @measurement.station.country_code.should == "US"
153
- @measurement.station.latitude.to_f.should == 34.03
154
- @measurement.station.longitude.to_f.should == -118.45
155
-
156
- # builds location
157
- @measurement.location.city.should == "Santa Monica Muni"
158
- @measurement.location.state_code.should == "CA"
159
- @measurement.location.country_code.should == "US"
160
-
161
- # builds forecasts
162
- @measurement.forecast.size.should == 7
163
-
164
- @measurement.forecast[0].valid_start_date.to_s.should match(/^\d{2,4}-\d{1,2}-\d{1,2}/i)
165
- @measurement.forecast[0].valid_end_date.to_s.should match(/^\d{2,4}-\d{1,2}-\d{1,2}/i)
166
- @measurement.forecast[0].condition.should match(/^[\w ]+$/i)
167
- @measurement.forecast[0].icon.should match(/^[\w ]+$/i)
168
- @measurement.forecast[0].high.f.to_s.should match(/^\d{1,3}[ ]?[cfCF]?$/i)
169
- @measurement.forecast[0].low.f.to_s.should match(/^\d{1,3}[ ]?[cfCF]?$/i)
170
-
171
- # builds local time
172
- @measurement.measured_at.to_s.should match(/^\d{1,2}:\d{1,2}[ ]?[apmAPM]{0,2}$/i)
173
- @measurement.current.current_at.to_s.should match(/^\d{1,2}:\d{1,2}[ ]?[apmAPM]{0,2}$/i)
174
25
 
175
- # builds timezone
176
- @measurement.timezone.code.should match(/(PDT|PST)/i)
26
+ it "asks the query to convert to accepted formats" do
27
+ query.should_receive(:convert!).with(:zipcode, :coordinates)
28
+ subject
29
+ end
30
+
31
+ it "adds a coordinate conversion to the query" do
32
+ query.should_receive(:add_conversion).with(:coordinates, '34.1,-118.41')
33
+ subject
34
+ end
35
+
36
+ it "includes the expected data" do
37
+ subject.query.should == '90210'
38
+ subject.format.should == :zipcode
39
+ subject.should be_metric
40
+
41
+ should have_data(:current, :observed_at).as_format(:time)
42
+ should have_data(:current, :stale_at).as_format(:time)
43
+
44
+ should have_data(:current, :humidity).as_format(:float)
45
+ should have_data(:current, :condition).as_format(:string)
46
+ should have_data(:current, :icon).as_format(:string)
47
+ should have_data(:current, :temperature).as_format(:temperature)
48
+ # should have_data(:current, :wind_chill).as_format(:temperature)
49
+ should have_data(:current, :dew_point).as_format(:temperature)
50
+ should have_data(:current, :wind).as_format(:vector)
51
+ should have_data(:current, :pressure).as_format(:pressure)
52
+ should have_data(:current, :visibility).as_format(:distance)
53
+
54
+ should have_data(:location, :name).as_value("Santa Monica Muni, CA")
55
+ should have_data(:location, :city).as_value("Santa Monica Muni")
56
+ should have_data(:location, :state_code).as_value("CA")
57
+ should have_data(:location, :country_code).as_value("US")
58
+ should have_data(:location, :latitude).as_value(34.10)
59
+ should have_data(:location, :longitude).as_value(-118.41)
60
+
61
+ should have_data(:station, :id).as_value("KSMO")
62
+ should have_data(:station, :name).as_value("Santa Monica Muni, CA")
63
+ should have_data(:station, :city).as_value("Santa Monica Muni")
64
+ should have_data(:station, :state_code).as_value("CA")
65
+ should have_data(:station, :country_code).as_value("US")
66
+ should have_data(:station, :latitude).as_value(34.10)
67
+ should have_data(:station, :longitude).as_value(-118.41)
68
+
69
+ should have_data(:timezone, :to_s).as_format(/^P[DS]T$/i)
70
+
71
+ subject.forecast.size.should == 14
72
+ should have_forecast(:starts_at).as_format(:time)
73
+ should have_forecast(:ends_at).as_format(:time)
74
+ should have_forecast(:icon).as_format(:string)
75
+ should have_forecast(:condition).as_format(:string)
76
+ should have_forecast(:pop).as_format(:float)
77
+ should have_forecast(:high).as_format(:temperature)
78
+ should have_forecast(:low).as_format(:temperature)
177
79
  end
178
80
  end
179
81
  end