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,19 @@
1
+ require 'ipaddr'
2
+
3
+ module Barometer
4
+ module Query
5
+ module Format
6
+ #
7
+ # eg. 8.8.8.8
8
+ #
9
+ class Ipv4Address < Base
10
+ def self.is?(query)
11
+ (ipaddr = IPAddr.new(query.to_s)) && ipaddr.ipv4?
12
+ rescue ArgumentError
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ Barometer::Query::Format.register(:ipv4_address, Barometer::Query::Format::Ipv4Address)
@@ -0,0 +1,15 @@
1
+ module Barometer
2
+ module Query
3
+ module Format
4
+ #
5
+ # NOAA Station ID
6
+ # - this format cannot be detected, only set explictly
7
+ #
8
+ class NoaaStationId < Base
9
+ def self.is?(query); false; end
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ Barometer::Query::Format.register(:noaa_station_id, Barometer::Query::Format::NoaaStationId)
@@ -0,0 +1,20 @@
1
+ module Barometer
2
+ module Query
3
+ module Format
4
+ #
5
+ # eg. H0H 0H0
6
+ #
7
+ class Postalcode < Base
8
+ def self.country_code(query); "CA"; end
9
+ def self.regex
10
+ # Rules: no D, F, I, O, Q, or U anywhere
11
+ # Basic validation: ^[ABCEGHJ-NPRSTVXY]{1}[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}
12
+ # [ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[0-9]{1}$
13
+ /^[A-Z]{1}[\d]{1}[A-Z]{1}[ ]?[\d]{1}[A-Z]{1}[\d]{1}$/
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ Barometer::Query::Format.register(:postalcode, Barometer::Query::Format::Postalcode)
@@ -0,0 +1,15 @@
1
+ module Barometer
2
+ module Query
3
+ module Format
4
+ #
5
+ # eg. 90210
6
+ #
7
+ class ShortZipcode < Base
8
+ def self.country_code(query); "US"; end
9
+ def self.regex; /(^[0-9]{5}$)/; end
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ Barometer::Query::Format.register(:short_zipcode, Barometer::Query::Format::ShortZipcode)
@@ -0,0 +1,14 @@
1
+ module Barometer
2
+ module Query
3
+ module Format
4
+ #
5
+ # Default value
6
+ #
7
+ class Unknown < Base
8
+ def self.is?(query); true; end
9
+ end
10
+ end
11
+ end
12
+ end
13
+
14
+ Barometer::Query::Format.register(:unknown, Barometer::Query::Format::Unknown)
@@ -0,0 +1,33 @@
1
+ module Barometer
2
+ module Query
3
+ module Format
4
+ #
5
+ # Weather ID (specific to weather.com)
6
+ # eg. USGA0028
7
+ #
8
+ class WeatherID < Base
9
+ @@fixes_file = File.expand_path(
10
+ File.join(File.dirname(__FILE__), 'translations', 'weather_country_codes.yml'))
11
+ @@fixes = nil
12
+
13
+ def self.regex; /(^[A-Za-z]{4}[0-9]{4}$)/; end
14
+ def self.country_code(query)
15
+ (query && query.size >= 2) ? _fix_country(query[0..1]) : nil
16
+ end
17
+
18
+ private
19
+
20
+ # weather.com uses non-standard two letter country codes that
21
+ # hinder the ability to determine the country or fetch geo_data.
22
+ # correct these "mistakes"
23
+ #
24
+ def self._fix_country(country_code)
25
+ @@fixes ||= YAML.load_file(@@fixes_file)
26
+ @@fixes[country_code.upcase.to_s] || country_code
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ Barometer::Query::Format.register(:weather_id, Barometer::Query::Format::WeatherID)
@@ -0,0 +1,28 @@
1
+ module Barometer
2
+ module Query
3
+ module Format
4
+ #
5
+ # WOEID: "Where on Earth" ID (by Yahoo!)
6
+ # eg. 2459115, 615702 or w90210
7
+ #
8
+ # NOTE: zipcodes and WoeIDs can look exactly the same when the WoeID
9
+ # is 5 digits long. For now, a 5 digit number will be detected as
10
+ # zipcode. The way to override this is to prepend a number with the
11
+ # letter 'w'. Therefore 90210 will be a zipcode and w90210 will be
12
+ # a WoeID.
13
+ #
14
+ class WoeID < Base
15
+ def self.regex; /(^[0-9]{4}$)|(^[0-9]{6,7}$)|(^w[0-9]{4,7}$)/; end
16
+
17
+ # remove the 'w' from applicable queries (only needed for detection)
18
+ #
19
+ def self.convert_query(text)
20
+ return nil unless text
21
+ text.delete('w')
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ Barometer::Query::Format.register(:woe_id, Barometer::Query::Format::WoeID)
@@ -0,0 +1,15 @@
1
+ module Barometer
2
+ module Query
3
+ module Format
4
+ #
5
+ # eg. 90210 or 90210-5555
6
+ #
7
+ class Zipcode < Base
8
+ def self.country_code(query); "US"; end
9
+ def self.regex; /(^[0-9]{5}$)|(^[0-9]{5}-[0-9]{4}$)/; end
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ Barometer::Query::Format.register(:zipcode, Barometer::Query::Format::Zipcode)
@@ -0,0 +1,13 @@
1
+ module Barometer
2
+ module Query
3
+ module Service
4
+ end
5
+ end
6
+ end
7
+
8
+ require_relative 'services/google_geocode'
9
+ require_relative 'services/yahoo_geocode'
10
+ require_relative 'services/to_weather_id'
11
+ require_relative 'services/to_woe_id'
12
+ require_relative 'services/noaa_station_id'
13
+ require_relative 'services/from_weather_id'
@@ -0,0 +1,26 @@
1
+ module Barometer
2
+ module Query
3
+ module Service
4
+ class GeonamesTimezone
5
+ class Api < Utils::Api
6
+ def initialize(latitude, longitude)
7
+ @latitude = latitude
8
+ @longitude = longitude
9
+ end
10
+
11
+ def url
12
+ 'http://ws.geonames.org/timezone'
13
+ end
14
+
15
+ def params
16
+ { lat: @latitude, lng: @longitude }
17
+ end
18
+
19
+ def unwrap_nodes
20
+ ['geonames', 'timezone']
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,35 @@
1
+ module Barometer
2
+ module Query
3
+ module Service
4
+ class GoogleGeocode
5
+ class Api < Utils::Api
6
+ def url
7
+ 'http://maps.googleapis.com/maps/api/geocode/json'
8
+ end
9
+
10
+ def params
11
+ format_params
12
+ end
13
+
14
+ def unwrap_nodes
15
+ ['results', 0]
16
+ end
17
+
18
+ private
19
+
20
+ def format_params
21
+ params = { sensor: 'false' }
22
+ params[:region] = query.geo.country_code if query.geo.country_code
23
+
24
+ if query.format == :coordinates
25
+ params[:latlng] = query.q.dup
26
+ else
27
+ params[:address] = query.q.dup
28
+ end
29
+ params
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,31 @@
1
+ module Barometer
2
+ module Query
3
+ module Service
4
+ class NoaaStation
5
+ class Api < Utils::Api
6
+ def url
7
+ 'http://forecast.weather.gov/MapClick.php'
8
+ end
9
+
10
+ def params
11
+ { textField1: latitude, textField2: longitude }
12
+ end
13
+
14
+ def get
15
+ Utils::Get.call(url, params).content
16
+ end
17
+
18
+ private
19
+
20
+ def latitude
21
+ query.q.split(',')[0]
22
+ end
23
+
24
+ def longitude
25
+ query.q.split(',')[1]
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,35 @@
1
+ module Barometer
2
+ module Query
3
+ module Service
4
+ class WeatherId
5
+ class Api < Utils::Api
6
+ def url
7
+ 'http://wxdata.weather.com/wxdata/search/search'
8
+ end
9
+
10
+ def params
11
+ { where: format_query }
12
+ end
13
+
14
+ def unwrap_nodes
15
+ ['search']
16
+ end
17
+
18
+ private
19
+
20
+ # filter out words that weather.com has trouble geo-locating
21
+ # mostly these are icao related
22
+ #
23
+ def format_query
24
+ output = query.q.dup
25
+ words_to_remove = %w(international airport municipal)
26
+ words_to_remove.each do |word|
27
+ output.gsub!(/#{word}/i, "")
28
+ end
29
+ output
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,26 @@
1
+ module Barometer
2
+ module Query
3
+ module Service
4
+ class WundergroundTimezone
5
+ class Api < Utils::Api
6
+ def initialize(latitude, longitude)
7
+ @latitude = latitude
8
+ @longitude = longitude
9
+ end
10
+
11
+ def url
12
+ 'http://api.wunderground.com/auto/wui/geo/ForecastXML/index.xml'
13
+ end
14
+
15
+ def params
16
+ { query: "#{@latitude},#{@longitude}" }
17
+ end
18
+
19
+ def unwrap_nodes
20
+ ['forecast', 'simpleforecast', 'forecastday', 0]
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,35 @@
1
+ module Barometer
2
+ module Query
3
+ module Service
4
+ class YahooPlacefinder
5
+ class Api < Utils::Api
6
+ def url
7
+ 'http://query.yahooapis.com/v1/public/yql'
8
+ end
9
+
10
+ def params
11
+ { q: format_query, format: :json }
12
+ end
13
+
14
+ def unwrap_nodes
15
+ ['query', 'results', 0, 'Result']
16
+ end
17
+
18
+ private
19
+
20
+ def format_query
21
+ "select * from geo.placefinder where #{field}='#{query.q}' and gflags='R'"
22
+ end
23
+
24
+ def field
25
+ if query.format == :woe_id
26
+ 'woeid'
27
+ else
28
+ 'text'
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,31 @@
1
+ module Barometer
2
+ module Query
3
+ module Service
4
+ class YahooWeather
5
+ class Api < Utils::Api
6
+ def url
7
+ 'http://weather.yahooapis.com/forecastrss'
8
+ end
9
+
10
+ def params
11
+ format_params
12
+ end
13
+
14
+ def unwrap_nodes
15
+ ['rss', 'channel']
16
+ end
17
+
18
+ private
19
+
20
+ def format_params
21
+ if query.format == :woe_id
22
+ { w: query.q }
23
+ else
24
+ { p: query.q }
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,64 @@
1
+ require_relative 'apis/yahoo_weather'
2
+
3
+ module Barometer
4
+ module Query
5
+ module Service
6
+ class FromWeatherId
7
+ def initialize(query)
8
+ @query = query
9
+ end
10
+
11
+ def call
12
+ converted_query = query.get_conversion(:weather_id)
13
+ return unless converted_query
14
+
15
+ @payload = YahooWeather::Api.new(converted_query).get
16
+ parse_payload
17
+ end
18
+
19
+ private
20
+
21
+ attr_reader :query, :payload
22
+
23
+ def parse_payload
24
+ Data::Geo.new(
25
+ locality: locality,
26
+ region: region,
27
+ country: country,
28
+ country_code: country_code,
29
+ latitude: latitude,
30
+ longitude: longitude
31
+ )
32
+ end
33
+
34
+ def locality
35
+ payload.fetch('location', '@city')
36
+ end
37
+
38
+ def region
39
+ payload.fetch('location', '@region')
40
+ end
41
+
42
+ def country
43
+ _country if _country.size > 2
44
+ end
45
+
46
+ def country_code
47
+ _country if _country.size <= 2
48
+ end
49
+
50
+ def latitude
51
+ payload.fetch('item', 'lat')
52
+ end
53
+
54
+ def longitude
55
+ payload.fetch('item', 'long')
56
+ end
57
+
58
+ def _country
59
+ @country ||= payload.fetch('location', '@country')
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end