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,103 @@
1
+ require_relative '../spec_helper'
2
+ require 'time'
3
+
4
+ module Barometer::Response
5
+ describe Base do
6
+ let(:query) { build_query }
7
+ let(:response) { Base.new }
8
+
9
+ specify { expect( response ).to have_field(:query).of_type(String) }
10
+ specify { expect( response ).to have_field(:weight).of_type(Integer) }
11
+ specify { expect( response ).to have_field(:status_code).of_type(Integer) }
12
+
13
+ describe ".new" do
14
+ specify { expect( response.weight ).to eq 1 }
15
+ specify { expect( response.requested_at ).to be }
16
+ end
17
+
18
+ describe "#success?" do
19
+ it "returns true if :status_code == 200" do
20
+ response.status_code = 200
21
+ expect( response ).to be_success
22
+ end
23
+
24
+ it "returns false if :status_code does not == 200" do
25
+ response.status_code = nil
26
+ expect( response ).not_to be_success
27
+
28
+ response.status_code = 406
29
+ expect( response ).not_to be_success
30
+ end
31
+ end
32
+
33
+ describe "#complete?" do
34
+ before { response.current = Current.new }
35
+
36
+ it "returns true when current is complete" do
37
+ response.current.stub(complete?: true)
38
+ expect( response ).to be_complete
39
+ end
40
+
41
+ it "returns false when the is no current" do
42
+ response.current = nil
43
+ expect( response ).not_to be_complete
44
+ end
45
+
46
+ it "returns false when current is not complete" do
47
+ response.current.stub(complete?: false)
48
+ expect( response ).not_to be_complete
49
+ end
50
+ end
51
+
52
+ describe "#for" do
53
+ let(:date) { double(:date) }
54
+ let(:prediction_collection) { double(:prediction_collection) }
55
+
56
+ before do
57
+ prediction_collection.stub(:for)
58
+ response.forecast = prediction_collection
59
+ end
60
+
61
+ context "when a date is given" do
62
+ it "passes it along to the collection" do
63
+ response.for(date)
64
+ expect( response.forecast ).to have_received(:for).with(date)
65
+ end
66
+ end
67
+
68
+ context "when a date is not given" do
69
+ context "and the timezone is set" do
70
+ it "passes along timezone.today to the collection" do
71
+ timezone = Barometer::Data::Zone.new('EST')
72
+ timezone.stub(today: date)
73
+ response.timezone = timezone
74
+
75
+ response.for
76
+
77
+ expect( response.forecast ).to have_received(:for).with(date)
78
+ end
79
+ end
80
+
81
+ context "and the tiemzone is not set" do
82
+ it "passes along Date.today to the collection" do
83
+ Date.stub(today: date)
84
+ response.timezone = nil
85
+
86
+ response.for
87
+
88
+ expect( response.forecast ).to have_received(:for).with(date)
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ describe "#add_query" do
95
+ let(:query) { double(:query, to_s: 'foo', format: :unknown, metric?: true) }
96
+ before { response.add_query(query) }
97
+
98
+ specify { expect( response ).to be_metric }
99
+ specify { expect( response.format ).to eq :unknown }
100
+ specify { expect( response.query ).to eq 'foo' }
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,33 @@
1
+ require_relative '../spec_helper'
2
+
3
+ module Barometer::Response
4
+ describe Current do
5
+ it { should have_field(:observed_at).of_type(Time) }
6
+ it { should have_field(:stale_at).of_type(Time) }
7
+ it { should have_field(:temperature).of_type(Barometer::Data::Temperature) }
8
+ it { should have_field(:dew_point).of_type(Barometer::Data::Temperature) }
9
+ it { should have_field(:heat_index).of_type(Barometer::Data::Temperature) }
10
+ it { should have_field(:wind_chill).of_type(Barometer::Data::Temperature) }
11
+ it { should have_field(:wind).of_type(Barometer::Data::Vector) }
12
+ it { should have_field(:pressure).of_type(Barometer::Data::Pressure) }
13
+ it { should have_field(:visibility).of_type(Barometer::Data::Distance) }
14
+ it { should have_field(:humidity).of_type(Float) }
15
+ it { should have_field(:icon).of_type(String) }
16
+ it { should have_field(:condition).of_type(String) }
17
+ it { should have_field(:sun).of_type(Barometer::Data::Sun) }
18
+
19
+ describe '#complete?' do
20
+ let(:current) { Current.new }
21
+
22
+ it 'returns true when the temperature is present' do
23
+ current.temperature = 10
24
+ expect( current ).to be_complete
25
+ end
26
+
27
+ it 'returns false when there is no temperature' do
28
+ current.temperature = nil
29
+ expect( current ).not_to be_complete
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,65 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe Barometer::Response::Prediction do
4
+ it { should have_field(:starts_at).of_type(Time) }
5
+ it { should have_field(:ends_at).of_type(Time) }
6
+ it { should have_field(:high).of_type(Barometer::Data::Temperature) }
7
+ it { should have_field(:low).of_type(Barometer::Data::Temperature) }
8
+ it { should have_field(:pop).of_type(Float) }
9
+ it { should have_field(:icon).of_type(String) }
10
+ it { should have_field(:condition).of_type(String) }
11
+ it { should have_field(:sun).of_type(Barometer::Data::Sun) }
12
+
13
+ describe "#date=" do
14
+ it "raises an error if unable to make a Date" do
15
+ expect { subject.date = 'invalid' }.to raise_error(ArgumentError)
16
+ end
17
+
18
+ it "sets the date to a passed in Date" do
19
+ date = Date.new
20
+ subject.date = date
21
+ subject.date.should == date
22
+ end
23
+
24
+ it "sets the date to a passed in date string" do
25
+ subject.date = '2013-02-19'
26
+ subject.date.should == Date.new(2013, 02, 19)
27
+ end
28
+
29
+ it "sets :starts_at to 00:00:00 on given date" do
30
+ subject.starts_at.should be_nil
31
+
32
+ subject.date = Date.new(2013, 02, 19)
33
+ subject.starts_at.year.should == 2013
34
+ subject.starts_at.month.should == 2
35
+ subject.starts_at.day.should == 19
36
+ subject.starts_at.hour.should == 0
37
+ subject.starts_at.min.should == 0
38
+ subject.starts_at.sec.should == 0
39
+ end
40
+
41
+ it "sets :ends_at to 23:59:59 on given date" do
42
+ subject.ends_at.should be_nil
43
+
44
+ subject.date = Date.new(2013, 02, 19)
45
+ subject.ends_at.year.should == 2013
46
+ subject.ends_at.month.should == 2
47
+ subject.ends_at.day.should == 19
48
+ subject.ends_at.hour.should == 23
49
+ subject.ends_at.min.should == 59
50
+ subject.ends_at.sec.should == 59
51
+ end
52
+ end
53
+
54
+ describe "#covers?" do
55
+ it "returns true if the valid_date range includes the given date" do
56
+ subject.date = Date.new(2009,05,05)
57
+ subject.covers?(Time.utc(2009,5,5,12,0,0)).should be_true
58
+ end
59
+
60
+ it "returns false if the valid_date range excludes the given date" do
61
+ subject.date = Date.new(2009,05,05)
62
+ subject.covers?(Time.utc(2009,5,4,12,0,0)).should be_false
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,97 @@
1
+ require_relative '../spec_helper'
2
+
3
+ module Barometer::Response
4
+ describe PredictionCollection do
5
+ let(:prediction_collection) { PredictionCollection.new }
6
+
7
+ describe "#<<" do
8
+ it "adds Prediction" do
9
+ expect {
10
+ prediction_collection << Prediction.new
11
+ }.to change{ prediction_collection.count }.by(1)
12
+ end
13
+ end
14
+
15
+ describe "#[]" do
16
+ let(:prediction) { Prediction.new }
17
+ before { prediction_collection << prediction }
18
+
19
+ it "finds prediction by index when passed a number" do
20
+ expect( prediction_collection[0] ).to eq prediction
21
+ end
22
+
23
+ it "finds prediction by using #for when not passed a number" do
24
+ index = double(:index)
25
+ prediction_collection.stub(:for)
26
+
27
+ prediction_collection[index]
28
+
29
+ expect( prediction_collection ).to have_received(:for).with(index)
30
+ end
31
+ end
32
+
33
+ describe "#for" do
34
+ let(:tommorrow) { Date.today + 1 }
35
+
36
+ context "when there are no predictions" do
37
+ specify { expect( prediction_collection.for(tommorrow) ).to be_nil }
38
+ end
39
+
40
+ context "when there are predictions" do
41
+ before do
42
+ today = Date.today
43
+
44
+ 0.upto(3) do |i|
45
+ prediction = Prediction.new
46
+ prediction.date = today + i
47
+ prediction_collection << prediction
48
+ end
49
+ end
50
+
51
+ it "finds the date using a String" do
52
+ expect( prediction_collection.for(tommorrow.to_s) ).to eq prediction_collection[1]
53
+ end
54
+
55
+ it "finds the date using a Date" do
56
+ expect( prediction_collection.for(tommorrow) ).to eq prediction_collection[1]
57
+ end
58
+
59
+ it "finds the date using a DateTime" do
60
+ # 1.8.7 - Date does not have to_datetime
61
+ datetime = DateTime.new(tommorrow.year, tommorrow.month, tommorrow.day)
62
+ expect( prediction_collection.for(datetime) ).to eq prediction_collection[1]
63
+ end
64
+
65
+ it "finds the date using a Time" do
66
+ # 1.8.7 - Date does not have to_time
67
+ time = Time.parse(tommorrow.to_s)
68
+ expect( prediction_collection.for(time) ).to eq prediction_collection[1]
69
+ end
70
+
71
+ it "finds the date using Data::Time" do
72
+ time = Barometer::Utils::Time.parse(tommorrow.to_s)
73
+ expect( prediction_collection.for(time) ).to eq prediction_collection[1]
74
+ end
75
+
76
+ it "finds nothing when there is not a match" do
77
+ expect( prediction_collection.for(Date.today - 1) ).to be_nil
78
+ end
79
+ end
80
+ end
81
+
82
+ describe "#build" do
83
+ it "yields a new response" do
84
+ expect { |b|
85
+ prediction_collection.build(&b)
86
+ }.to yield_with_args(Prediction)
87
+ end
88
+
89
+ it "adds the new response to forecast array" do
90
+ expect {
91
+ prediction_collection.build do
92
+ end
93
+ }.to change{ prediction_collection.count }.by(1)
94
+ end
95
+ end
96
+ end
97
+ end
@@ -1,30 +1,30 @@
1
- require 'rubygems'
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
2
4
  require 'rspec'
3
5
  require 'cgi'
4
6
  require 'pry'
5
7
  require 'vcr'
6
- require 'fakefs/spec_helpers'
8
+ require 'webmock/rspec'
9
+
10
+ require_relative '../lib/barometer'
7
11
 
8
- $:.unshift((File.join(File.dirname(__FILE__), '..', 'lib')))
9
- require 'barometer'
12
+ Dir["./spec/support/**/*.rb"].sort.each {|f| require f}
10
13
 
11
- WEATHERBUG_CODE = Barometer::KeyFileParser.find(:weather_bug, :code) || 'weatherbug'
12
- YAHOO_KEY = Barometer::KeyFileParser.find(:yahoo, :app_id) || 'yahoo'
14
+ WEATHERBUG_CODE = Barometer::Support::KeyFileParser.find(:weather_bug, :code) || 'weatherbug'
15
+ FORECAST_IO_APIKEY = Barometer::Support::KeyFileParser.find(:forecast_io, :apikey) || 'forecastio'
13
16
  downcased_weatherbug_code = WEATHERBUG_CODE.to_s
14
17
  downcased_weatherbug_code[0] = WEATHERBUG_CODE.to_s[0..0].downcase
15
18
 
16
- # Barometer.debug!
17
- Barometer.yahoo_placemaker_app_id = 'placemaker'
18
-
19
19
  VCR.configure do |config|
20
20
  config.cassette_library_dir = 'spec/cassettes'
21
21
  config.hook_into :webmock
22
- config.default_cassette_options = { :record => :none, :serialize_with => :json }
22
+ config.default_cassette_options = { record: :none, serialize_with: :json }
23
23
 
24
24
  config.filter_sensitive_data('WEATHERBUG_CODE') { WEATHERBUG_CODE.to_s }
25
+ # weather bug uses api as host name. this is downcased when the request it made
25
26
  config.filter_sensitive_data('WEATHERBUG_CODE') { downcased_weatherbug_code }
26
- config.filter_sensitive_data('<YAHOO_KEY>') { YAHOO_KEY.to_s }
27
- config.filter_sensitive_data('<PLACEMAKER_KEY>') { Barometer.yahoo_placemaker_app_id.to_s }
27
+ config.filter_sensitive_data('FORECAST_IO_APIKEY') { FORECAST_IO_APIKEY.to_s }
28
28
 
29
29
  config.configure_rspec_metadata!
30
30
  end
@@ -32,3 +32,5 @@ end
32
32
  RSpec.configure do |config|
33
33
  config.treat_symbols_as_metadata_keys_with_true_values = true
34
34
  end
35
+
36
+ include Barometer::Matchers
@@ -0,0 +1,22 @@
1
+ module Barometer
2
+ KEY_FILE = File.expand_path(File.join('~', '.barometer'))
3
+
4
+ module Support
5
+ class KeyFileParser
6
+ def self.find(*paths)
7
+ if File.exists?(KEY_FILE)
8
+ keys = YAML.load_file(KEY_FILE)
9
+
10
+ paths.each do |path|
11
+ if keys && keys.has_key?(path.to_s)
12
+ keys = keys.fetch(path.to_s)
13
+ else
14
+ keys = nil
15
+ end
16
+ end
17
+ keys
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,36 @@
1
+ require 'rspec/expectations'
2
+
3
+ module Barometer
4
+ module Matchers
5
+ module Formats
6
+ def is_of_format?(format, value)
7
+ value.match(_find_regex(format))
8
+ end
9
+
10
+ def _find_regex(format)
11
+ case format
12
+ when :time
13
+ /^\d{1,4}-\d{1,2}-\d{1,2} \d{2}:\d{2}:\d{2} [\-\+\d]{5}$/i
14
+ when :optional_string
15
+ /^[\w \.-]*$/i
16
+ when :string
17
+ /^[\w \.-]{2,}$/i
18
+ when :number
19
+ /^\d{1,3}$/i
20
+ when :float
21
+ /^[\d\.]{1,5}$/i
22
+ when :temperature
23
+ /^-?[0-9\.]{1,5}[ ]?[cfCF]?$/i
24
+ when :pressure
25
+ /^[0-9\.]{1,7}[ ]?[a-zA-Z]{0,3}$/i
26
+ when :vector
27
+ /^[0-9\.]{1,5} (?:mph|kph) (?:[nesw]{1,3}(?:orth|outh|t|ast)?|@ [0-9\.]{1,5} degrees)$/i
28
+ when :distance
29
+ /^[0-9\.]{1,5}[ ]?k?m?$/i
30
+ when Regexp
31
+ format
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,46 @@
1
+ require_relative 'path'
2
+ require_relative 'formats'
3
+
4
+ module Barometer
5
+ module Matchers
6
+ def have_data(*paths)
7
+ HaveData.new(*paths)
8
+ end
9
+
10
+ class HaveData
11
+ include Barometer::Matchers::Formats
12
+
13
+ def initialize(*paths)
14
+ @paths = paths
15
+ end
16
+
17
+ def matches?(subject)
18
+ @result = Walker.new(subject).follow(@paths)
19
+
20
+ if @format
21
+ is_of_format?(@format, @result)
22
+ else
23
+ @result == @value || @result.to_f == @value
24
+ end
25
+ end
26
+
27
+ def failure_message
28
+ "expected that '#{@result}' matches '#{@value || @format}'"
29
+ end
30
+
31
+ def description
32
+ "have correct value for #{@paths.join('.')}"
33
+ end
34
+
35
+ def as_value(value)
36
+ @value = value
37
+ self
38
+ end
39
+
40
+ def as_format(format)
41
+ @format = format
42
+ self
43
+ end
44
+ end
45
+ end
46
+ end