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,18 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe Barometer::Query::Format::ShortZipcode do
4
+ it ".country_code" do
5
+ Barometer::Query::Format::ShortZipcode.country_code(nil).should == "US"
6
+ Barometer::Query::Format::ShortZipcode.country_code("ignored").should == "US"
7
+ end
8
+
9
+ describe ".is?" do
10
+ it "recognizes a valid format" do
11
+ Barometer::Query::Format::ShortZipcode.is?("90210").should be_true
12
+ end
13
+
14
+ it "recognizes non-valid format" do
15
+ Barometer::Query::Format::ShortZipcode.is?("90210-5555").should be_false
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe Barometer::Query::Format::Unknown do
4
+ describe ".is?" do
5
+ it "returns true" do
6
+ Barometer::Query::Format::Unknown.is?("New York, NY").should be_true
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,31 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe Barometer::Query::Format::WeatherID do
4
+ it ".country_code" do
5
+ Barometer::Query::Format::WeatherID.country_code(nil).should be_nil
6
+ Barometer::Query::Format::WeatherID.country_code("i").should be_nil
7
+ Barometer::Query::Format::WeatherID.country_code("USGA0000").should == "US"
8
+ Barometer::Query::Format::WeatherID.country_code("CAAB0000").should == "CA"
9
+ Barometer::Query::Format::WeatherID.country_code("SPXX0000").should == "ES"
10
+ end
11
+
12
+ describe ".is?" do
13
+ it "recognizes a valid format" do
14
+ Barometer::Query::Format::WeatherID.is?("USGA0028").should be_true
15
+ end
16
+
17
+ it "recognizes non-valid format" do
18
+ Barometer::Query::Format::WeatherID.is?("invalid").should be_false
19
+ end
20
+ end
21
+
22
+ describe "fixing country codes" do
23
+ it "doesn't fix a correct code" do
24
+ Barometer::Query::Format::WeatherID.send("_fix_country", "CA").should == "CA"
25
+ end
26
+
27
+ it "fixes an incorrect code" do
28
+ Barometer::Query::Format::WeatherID.send("_fix_country", "SP").should == "ES"
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,45 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ module Barometer::Query
4
+ describe Format::WoeID do
5
+ describe '.is?' do
6
+ it 'recognizes a valid 4 digit code format' do
7
+ expect( Format::WoeID.is?('8775') ).to be_true
8
+ end
9
+
10
+ it 'recognizes a valid 6 digit code format' do
11
+ expect( Format::WoeID.is?('615702') ).to be_true
12
+ end
13
+
14
+ it 'recognizes a valid 7 digit code format' do
15
+ expect( Format::WoeID.is?('2459115') ).to be_true
16
+ end
17
+
18
+ it 'recognizes a valid 5 digit code with a prepended "w"' do
19
+ expect( Format::WoeID.is?('w90210') ).to be_true
20
+ end
21
+
22
+ it 'does not recognize a zip code' do
23
+ expect( Format::WoeID.is?('90210') ).to be_false
24
+ end
25
+
26
+ it 'recognizes non-valid format' do
27
+ expect( Format::WoeID.is?('USGA0028') ).to be_false
28
+ end
29
+ end
30
+
31
+ describe '.convert_query' do
32
+ it 'recognizes standard woe ids' do
33
+ query_no_conversion = '2459115'
34
+ query = Barometer::Query.new(query_no_conversion)
35
+ expect( query.q ).to eq query_no_conversion
36
+ end
37
+
38
+ it 'removes the prefix from "w" prefixed queries' do
39
+ query_with_conversion = 'w90210'
40
+ query = Barometer::Query.new(query_with_conversion)
41
+ expect( query.q ).to eq '90210'
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,18 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe Barometer::Query::Format::Zipcode do
4
+ it ".country_code" do
5
+ Barometer::Query::Format::Zipcode.country_code(nil).should == "US"
6
+ Barometer::Query::Format::Zipcode.country_code("ignored").should == "US"
7
+ end
8
+
9
+ describe ".is?" do
10
+ it "recognizes a valid format" do
11
+ Barometer::Query::Format::Zipcode.is?("90210-5555").should be_true
12
+ end
13
+
14
+ it "recognizes non-valid format" do
15
+ Barometer::Query::Format::Zipcode.is?("invalid").should be_false
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,55 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe Barometer::Query::Format do
4
+ def clear_formats
5
+ @formats_cache = Barometer::Query::Format.formats
6
+ Barometer::Query::Format.formats = []
7
+ end
8
+
9
+ def reset_formats
10
+ Barometer::Query::Format.formats = @formats_cache
11
+ end
12
+
13
+ describe ".register" do
14
+ before { clear_formats }
15
+ after { reset_formats }
16
+
17
+ it "adds the query format to the list of available formats" do
18
+ expect {
19
+ Barometer::Query::Format.register(:test_format, double(:format))
20
+ }.to change { Barometer::Query::Format.formats.count }.by(1)
21
+ end
22
+
23
+ it "raises an error if no format class given" do
24
+ expect {
25
+ Barometer::Query::Format.register(:test_format)
26
+ }.to raise_error(ArgumentError)
27
+ end
28
+
29
+ it "only registers a key once" do
30
+ format = double(:format)
31
+ Barometer::Query::Format.register(:test_format, format)
32
+ expect {
33
+ Barometer::Query::Format.register(:test_format, format)
34
+ }.not_to change { Barometer::Query::Format.formats.count }
35
+ end
36
+ end
37
+
38
+ describe ".find" do
39
+ before { clear_formats }
40
+ after { reset_formats }
41
+
42
+ it "returns a registered format" do
43
+ test_format = double(:test_format)
44
+ Barometer::Query::Format.register(:test_format, test_format)
45
+
46
+ Barometer::Query::Format.find(:test_format).should == test_format
47
+ end
48
+
49
+ it "raises an error if the format does not exist" do
50
+ expect {
51
+ Barometer::Query::Format.find(:test_format)
52
+ }.to raise_error(Barometer::Query::Format::NotFound)
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,54 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ module Barometer::Query
4
+ describe Service::FromWeatherId, vcr: {
5
+ cassette_name: 'Service::FromWeatherId'
6
+ } do
7
+ describe '#call' do
8
+ context 'when the query format is not :weather_id' do
9
+ let(:query) { Barometer::Query.new('90210') }
10
+
11
+ it 'returns nothing' do
12
+ geo = Service::FromWeatherId.new(query).call
13
+ expect( geo ).to be_nil
14
+ end
15
+
16
+ context 'and a :weather_id conversion exists' do
17
+ it 'returns the correct geo data' do
18
+ query.add_conversion(:weather_id, 'USNY0996')
19
+ geo = Service::FromWeatherId.new(query).call
20
+
21
+ expect( geo.latitude ).to eq 40.67
22
+ expect( geo.longitude ).to eq -73.94
23
+ expect( geo.locality ).to eq 'New York'
24
+ expect( geo.region ).to eq 'NY'
25
+ expect( geo.country_code ).to eq 'US'
26
+
27
+ expect( geo.query ).to be_nil
28
+ expect( geo.country ).to be_nil
29
+ expect( geo.address ).to be_nil
30
+ expect( geo.postal_code ).to be_nil
31
+ end
32
+ end
33
+ end
34
+
35
+ context 'when the query format is :weather_id' do
36
+ it 'returns the correct geo data' do
37
+ query = Barometer::Query.new('USNY0996')
38
+ geo = Service::FromWeatherId.new(query).call
39
+
40
+ expect( geo.latitude ).to eq 40.67
41
+ expect( geo.longitude ).to eq -73.94
42
+ expect( geo.locality ).to eq 'New York'
43
+ expect( geo.region ).to eq 'NY'
44
+ expect( geo.country_code ).to eq 'US'
45
+
46
+ expect( geo.query ).to be_nil
47
+ expect( geo.country ).to be_nil
48
+ expect( geo.address ).to be_nil
49
+ expect( geo.postal_code ).to be_nil
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,60 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ module Barometer::Query
4
+ describe Service::GoogleGeocode, vcr: {
5
+ cassette_name: 'Service::GoogleGeocode'
6
+ } do
7
+ describe '.call' do
8
+ context 'when the query is a :zipcode' do
9
+ it 'returns the correct Geo data' do
10
+ query = Barometer::Query.new('90210')
11
+ geo = Service::GoogleGeocode.new(query).call
12
+
13
+ expect( geo.query ).to eq '90210'
14
+ expect( geo.latitude ).to eq 34.1030032
15
+ expect( geo.longitude ).to eq -118.4104684
16
+ expect( geo.locality ).to eq 'Beverly Hills'
17
+ expect( geo.region ).to eq 'CA'
18
+ expect( geo.country ).to eq 'United States'
19
+ expect( geo.country_code ).to eq 'US'
20
+ expect( geo.address ).to be_nil
21
+ expect( geo.postal_code ).to eq '90210'
22
+ end
23
+ end
24
+
25
+ context 'when the query is a city/region' do
26
+ it 'returns the correct Geo data' do
27
+ query = Barometer::Query.new('New York, NY')
28
+ geo = Service::GoogleGeocode.new(query).call
29
+
30
+ expect( geo.query ).to eq 'New York, NY, US'
31
+ expect( geo.latitude ).to eq 40.7143528
32
+ expect( geo.longitude ).to eq -74.00597309999999
33
+ expect( geo.locality ).to eq 'New York'
34
+ expect( geo.region ).to eq 'NY'
35
+ expect( geo.country ).to eq 'United States'
36
+ expect( geo.country_code ).to eq 'US'
37
+ expect( geo.address ).to be_nil
38
+ expect( geo.postal_code ).to be_nil
39
+ end
40
+ end
41
+
42
+ context 'when the query is :coordinates' do
43
+ it 'returns the correct Geo data' do
44
+ query = Barometer::Query.new('47,-114')
45
+ geo = Service::GoogleGeocode.new(query).call
46
+
47
+ expect( geo.query ).to be_nil
48
+ expect( geo.latitude ).to eq 47.000623
49
+ expect( geo.longitude ).to eq -114.0016495
50
+ expect( geo.locality ).to eq 'Missoula'
51
+ expect( geo.region ).to eq 'MT'
52
+ expect( geo.country ).to eq 'United States'
53
+ expect( geo.country_code ).to eq 'US'
54
+ expect( geo.address ).to be_nil
55
+ expect( geo.postal_code ).to eq '59808'
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,23 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe Barometer::Query::Service::NoaaStation, vcr: {
4
+ cassette_name: "Service::NoaaStation"
5
+ } do
6
+ describe ".fetch," do
7
+ it "returns nohing if query doesn't have coordinates format" do
8
+ query = Barometer::Query.new("90210")
9
+ Barometer::Query::Service::NoaaStation.fetch(query).should be_nil
10
+ end
11
+
12
+ it "returns a station_id if the query is format coordinates" do
13
+ query = Barometer::Query.new("34.10,-118.41")
14
+ Barometer::Query::Service::NoaaStation.fetch(query).should == "KSMO"
15
+ end
16
+
17
+ it "returns a station_id if the query has a corrdinates conversion" do
18
+ query = Barometer::Query.new("90210")
19
+ query.add_conversion(:coordinates, "34.10,-118.41")
20
+ Barometer::Query::Service::NoaaStation.fetch(query).should == "KSMO"
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ describe Barometer::Query::Service::ToWeatherId, vcr: {
4
+ cassette_name: "Service::ToWeatherId"
5
+ } do
6
+ describe ".call," do
7
+ it "returns nothing if query doesn't have a supported format" do
8
+ query = Barometer::Query.new("90210")
9
+ Barometer::Query::Service::ToWeatherId.call(query).should be_nil
10
+ end
11
+
12
+ it "returns a weather_id if the query is format unknown" do
13
+ query = Barometer::Query.new("Paris, France")
14
+ Barometer::Query::Service::ToWeatherId.call(query).should == "FRXX0076"
15
+ end
16
+
17
+ it "returns a weather_id if the query has a supported conversion" do
18
+ query = Barometer::Query.new("10001")
19
+ query.add_conversion(:geocode, "New York, NY")
20
+ Barometer::Query::Service::ToWeatherId.call(query).should == "USNY0996"
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,51 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ module Barometer::Query
4
+ describe Service::ToWoeId, vcr: {
5
+ cassette_name: 'Service::ToWoeId'
6
+ } do
7
+ describe '.call,' do
8
+ it 'returns nothing if query is an unsupported format' do
9
+ query = Barometer::Query.new('KSFO')
10
+ expect( Service::ToWoeId.new(query).call ).to be_nil
11
+ end
12
+
13
+ it 'returns a weather_id if the query is format short_zipcode' do
14
+ query = Barometer::Query.new('90210')
15
+ expect( Service::ToWoeId.new(query).call ).to eq '12795711'
16
+ end
17
+
18
+ it 'returns a weather_id if the query is format zipcode' do
19
+ query = Barometer::Query.new('10001-5555')
20
+ expect( Service::ToWoeId.new(query).call ).to eq '12761333'
21
+ end
22
+
23
+ it 'returns a weather_id if the query is format unknown' do
24
+ query = Barometer::Query.new('Paris, France')
25
+ expect( Service::ToWoeId.new(query).call ).to eq '12727257'
26
+ end
27
+
28
+ it 'returns a weather_id if the query is format coordinates' do
29
+ query = Barometer::Query.new('40.756054,-73.986951')
30
+ expect( Service::ToWoeId.new(query).call ).to eq '12761367'
31
+ end
32
+
33
+ it 'returns a weather_id if the query is format postal code' do
34
+ query = Barometer::Query.new('T5B 4M9')
35
+ expect( Service::ToWoeId.new(query).call ).to eq '12698082'
36
+ end
37
+
38
+ it 'returns a weather_id if the query is format ipv4 address' do
39
+ query = Barometer::Query.new('98.139.183.24')
40
+ expect( Service::ToWoeId.new(query).call ).to eq '12763119'
41
+ end
42
+
43
+ it 'returns a weather_id if the query has a converted geocode' do
44
+ query = Barometer::Query.new('KJFK')
45
+ query.add_conversion(:zipcode, '10001-5555')
46
+
47
+ expect( Service::ToWoeId.new(query).call ).to eq '12761333'
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,72 @@
1
+ require_relative '../../spec_helper'
2
+
3
+ module Barometer::Query
4
+ describe Service::YahooGeocode, vcr: {
5
+ cassette_name: 'Service::YahooGeocode'
6
+ } do
7
+ describe '#call' do
8
+ context 'when the query format is unsupported' do
9
+ let(:query) { Barometer::Query.new('90210') }
10
+
11
+ it 'returns nothing' do
12
+ geo = Service::YahooGeocode.new(query).call
13
+ expect( geo ).to be_nil
14
+ end
15
+
16
+ context 'and a :woe_id conversion exists' do
17
+ it 'returns the correct geo data' do
18
+ query.add_conversion(:woe_id, '615702')
19
+ geo = Service::YahooGeocode.new(query).call
20
+
21
+ expect( geo.latitude ).to eq 48.85693
22
+ expect( geo.longitude ).to eq 2.3412
23
+ expect( geo.locality ).to eq 'Paris'
24
+ expect( geo.region ).to eq 'Ile-de-France'
25
+ expect( geo.country ).to eq 'France'
26
+ expect( geo.country_code ).to eq 'FR'
27
+ expect( geo.postal_code ).to eq '75001'
28
+
29
+ expect( geo.query ).to be_nil
30
+ expect( geo.address ).to be_nil
31
+ end
32
+ end
33
+ end
34
+
35
+ context 'when the query format is :woe_id' do
36
+ it 'returns the correct geo data' do
37
+ query = Barometer::Query.new('615702')
38
+ geo = Service::YahooGeocode.new(query).call
39
+
40
+ expect( geo.latitude ).to eq 48.85693
41
+ expect( geo.longitude ).to eq 2.3412
42
+ expect( geo.locality ).to eq 'Paris'
43
+ expect( geo.region ).to eq 'Ile-de-France'
44
+ expect( geo.country ).to eq 'France'
45
+ expect( geo.country_code ).to eq 'FR'
46
+ expect( geo.postal_code ).to eq '75001'
47
+
48
+ expect( geo.query ).to be_nil
49
+ expect( geo.address ).to be_nil
50
+ end
51
+ end
52
+
53
+ context 'when the query format is :ipv4_address' do
54
+ it 'returns the correct geo data' do
55
+ query = Barometer::Query.new('8.8.8.8')
56
+ geo = Service::YahooGeocode.new(query).call
57
+
58
+ expect( geo.latitude ).to eq 37.418726
59
+ expect( geo.longitude ).to eq -122.072037
60
+ expect( geo.locality ).to eq 'Mountain View'
61
+ expect( geo.region ).to eq 'CA'
62
+ expect( geo.country_code ).to eq 'US'
63
+ expect( geo.country ).to eq 'United States'
64
+ expect( geo.postal_code ).to eq '94043'
65
+
66
+ expect( geo.query ).to be_nil
67
+ expect( geo.address ).to be_nil
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end