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
@@ -1,13 +0,0 @@
1
- $:.unshift(File.dirname(__FILE__))
2
-
3
- # query formats
4
- #
5
- require 'formats/format'
6
- require 'formats/short_zipcode'
7
- require 'formats/zipcode'
8
- require 'formats/postalcode'
9
- require 'formats/weather_id'
10
- require 'formats/coordinates'
11
- require 'formats/icao'
12
- require 'formats/geocode'
13
- require 'formats/woe_id'
@@ -1,57 +0,0 @@
1
- module Barometer
2
- #
3
- # Format: Coordinates
4
- #
5
- # eg. 123.1234,-123.123
6
- #
7
- # This class is used to determine if a query is a
8
- # :coordinates and how to convert to :coordinates.
9
- #
10
- class Query::Format::Coordinates < Query::Format
11
-
12
- def self.format; :coordinates; end
13
- def self.regex; /^[-]?[0-9\.]+[,]{1}\s?[-]?[0-9\.]+$/; end
14
- def self.convertable_formats
15
- [:short_zipcode, :zipcode, :postalcode, :weather_id, :coordinates, :icao, :geocode, :woe_id]
16
- end
17
-
18
- # convert to this format, X -> :coordinates
19
- #
20
- def self.to(original_query)
21
- raise ArgumentError unless is_a_query?(original_query)
22
- return nil unless converts?(original_query)
23
- converted_query = Barometer::Query.new
24
-
25
- # pre-convert
26
- #
27
- pre_query = nil
28
- if original_query.format == :weather_id
29
- unless pre_query = original_query.get_conversion(Query::Format::Geocode.format)
30
- pre_query = Query::Format::WeatherID.reverse(original_query)
31
- original_query.post_conversion(pre_query)
32
- end
33
- elsif original_query.format == :woe_id
34
- pre_query = Query::Format::WoeID.reverse(original_query)
35
- end
36
-
37
- # convert & adjust
38
- #
39
- converted_query = Query::Format::Geocode.geocode(pre_query || original_query)
40
- converted_query.q = converted_query.geo.coordinates if converted_query.geo
41
- converted_query.format = format
42
-
43
- converted_query
44
- end
45
-
46
- def self.parse_latitude(query)
47
- coordinates = query.to_s.split(',')
48
- coordinates ? coordinates[0] : nil
49
- end
50
-
51
- def self.parse_longitude(query)
52
- coordinates = query.to_s.split(',')
53
- coordinates ? coordinates[1] : nil
54
- end
55
-
56
- end
57
- end
@@ -1,64 +0,0 @@
1
- module Barometer
2
- #
3
- # Base Format Class
4
- #
5
- # Fromats are used to determine if a query is of a certain
6
- # format, how to convert to and from that format
7
- # and what the country_code is for that format (if possible).
8
- # Some formats require external Web Services to help
9
- # in the converision. (ie :weather_id -> :geocode)
10
- #
11
- class Query::Format
12
-
13
- @@fixes_file = File.expand_path(
14
- File.join(File.dirname(__FILE__), '..', 'translations', 'weather_country_codes.yml'))
15
- @@fixes = nil
16
-
17
- # stubs
18
- #
19
- def self.regex; raise NotImplementedError; end
20
- def self.format; raise NotImplementedError; end
21
-
22
- # defaults
23
- #
24
- def self.to(query=nil,country=nil); nil; end
25
- def self.country_code(query=nil); nil; end
26
- def self.convertable_formats; []; end
27
- def self.convert_query(text); text; end
28
-
29
- # is the query of this format?
30
- #
31
- def self.is?(query=nil)
32
- raise ArgumentError unless query.is_a?(String)
33
- return !(query =~ self.regex).nil?
34
- end
35
-
36
- # does the format support conversion from the given query?
37
- #
38
- def self.converts?(query=nil)
39
- return false unless is_a_query?(query)
40
- self.convertable_formats.include?(query.format)
41
- end
42
-
43
- # is the object a Barometer::Query?
44
- #
45
- def self.is_a_query?(object=nil)
46
- return false unless object
47
- object.is_a?(Barometer::Query)
48
- end
49
-
50
- private
51
-
52
- # fix the country code
53
- #
54
- # weather.com uses non-standard two letter country codes that
55
- # hinder the ability to determine the country or fetch geo_data.
56
- # correct these "mistakes"
57
- #
58
- def self._fix_country(country_code)
59
- @@fixes ||= YAML.load_file(@@fixes_file)
60
- @@fixes[country_code.upcase.to_s] || country_code
61
- end
62
-
63
- end
64
- end
@@ -1,60 +0,0 @@
1
- module Barometer
2
- #
3
- # Format: Geocode
4
- # (not to be confused with the WebService geocode)
5
- #
6
- # eg. 123 Elm St, Mystery, Alaska, USA
7
- #
8
- # This class is used to determine if a query is a
9
- # :geocode, how to convert to :geocode
10
- #
11
- class Query::Format::Geocode < Query::Format
12
-
13
- def self.format; :geocode; end
14
- def self.is?(query=nil); query.is_a?(String) ? true : false; end
15
- def self.convertable_formats
16
- [:short_zipcode, :zipcode, :coordinates, :weather_id, :icao, :woe_id]
17
- end
18
-
19
- # convert to this format, X -> :geocode
20
- #
21
- def self.to(original_query)
22
- raise ArgumentError unless is_a_query?(original_query)
23
- unless converts?(original_query)
24
- return (original_query.format == format ? original_query.dup : nil)
25
- end
26
-
27
- unless converted_query = original_query.get_conversion(format)
28
- converted_query = Barometer::Query.new
29
-
30
- converted_query = case original_query.format
31
- when :weather_id
32
- Query::Format::WeatherID.reverse(original_query)
33
- when :woe_id
34
- Query::Format::WoeID.reverse(original_query)
35
- else
36
- geocode(original_query)
37
- end
38
-
39
- original_query.post_conversion(converted_query) if converted_query
40
- end
41
- converted_query
42
- end
43
-
44
- # geocode the query
45
- #
46
- def self.geocode(original_query)
47
- raise ArgumentError unless is_a_query?(original_query)
48
-
49
- converted_query = Barometer::Query.new
50
- converted_query.geo = Barometer::WebService::Geocode.fetch(original_query)
51
- if converted_query.geo
52
- converted_query.country_code = converted_query.geo.country_code
53
- converted_query.q = converted_query.geo.to_s
54
- converted_query.format = format
55
- end
56
- converted_query
57
- end
58
-
59
- end
60
- end
@@ -1,37 +0,0 @@
1
- module Barometer
2
- #
3
- # Format: ICAO (International Civil Aviation Organization)
4
- #
5
- # eg. KLAX (Los Angeles Airport)
6
- #
7
- # This class is used to determine if a query is a
8
- # :icao and what the country_code is.
9
- #
10
- class Query::Format::Icao < Query::Format
11
-
12
- @@codes_file = File.expand_path(
13
- File.join(File.dirname(__FILE__), '..', 'translations', 'icao_country_codes.yml'))
14
- @@codes = nil
15
-
16
- def self.format; :icao; end
17
-
18
- # call any 3-4 letter query, :icao ... obviously this will have a lot
19
- # of false positives. So far this isn't an issue as all weather services
20
- # that take :icao (which is just one, :wunderground) also take what
21
- # this would have been if it was not called :icao.
22
- #
23
- def self.regex; /^[A-Za-z]{3,4}$/; end
24
-
25
- # in some cases the first letter can designate the country
26
- #
27
- def self.country_code(query=nil)
28
- return unless query && query.is_a?(String)
29
- $:.unshift(File.dirname(__FILE__))
30
- @@codes ||= YAML.load_file(@@codes_file)
31
- return unless @@codes && @@codes['one_letter'] && @@codes['two_letter']
32
- @@codes['one_letter'][query[0..0].upcase.to_s] ||
33
- @@codes['two_letter'][query[0..1].upcase.to_s] || nil
34
- end
35
-
36
- end
37
- end
@@ -1,22 +0,0 @@
1
- module Barometer
2
- #
3
- # Format: Postal Code
4
- #
5
- # eg. H0H 0H0
6
- #
7
- # This class is used to determine if a query is a
8
- # :postalcode and what the country_code is.
9
- #
10
- class Query::Format::Postalcode < Query::Format
11
-
12
- def self.format; :postalcode; end
13
- def self.country_code(query=nil); "CA"; end
14
- def self.regex
15
- # Rules: no D, F, I, O, Q, or U anywhere
16
- # Basic validation: ^[ABCEGHJ-NPRSTVXY]{1}[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}
17
- # [ ]?[0-9]{1}[ABCEGHJ-NPRSTV-Z]{1}[0-9]{1}$
18
- /^[A-Z]{1}[\d]{1}[A-Z]{1}[ ]?[\d]{1}[A-Z]{1}[\d]{1}$/
19
- end
20
-
21
- end
22
- end
@@ -1,17 +0,0 @@
1
- module Barometer
2
- #
3
- # Format: Zip Code (short)
4
- #
5
- # eg. 90210
6
- #
7
- # This class is used to determine if a query is a
8
- # :short_zipcode and what the country_code is.
9
- #
10
- class Query::Format::ShortZipcode < Query::Format
11
-
12
- def self.format; :short_zipcode; end
13
- def self.country_code(query=nil); "US"; end
14
- def self.regex; /(^[0-9]{5}$)/; end
15
-
16
- end
17
- end
@@ -1,92 +0,0 @@
1
- module Barometer
2
- #
3
- # Format: Weather ID (specific to weather.com)
4
- #
5
- # eg. USGA0028
6
- #
7
- # This class is used to determine if a query is a
8
- # :weather_id, how to convert to and from :weather_id
9
- # and what the country_code is.
10
- #
11
- class Query::Format::WeatherID < Query::Format
12
-
13
- def self.format; :weather_id; end
14
- def self.regex; /(^[A-Za-z]{4}[0-9]{4}$)/; end
15
- def self.convertable_formats
16
- [:short_zipcode, :zipcode, :coordinates, :icao, :geocode]
17
- end
18
-
19
- # the first two letters of the :weather_id is the country_code
20
- #
21
- def self.country_code(query=nil)
22
- (query && query.size >= 2) ? _fix_country(query[0..1]) : nil
23
- end
24
-
25
- # convert to this format, X -> :weather_id
26
- #
27
- def self.to(original_query)
28
- raise ArgumentError unless is_a_query?(original_query)
29
- return nil unless converts?(original_query)
30
-
31
- # convert original query to :geocode, as that is the only
32
- # format we can convert directly from to weather_id
33
- converted_query = Barometer::Query.new
34
- converted_query = Query::Format::Geocode.to(original_query)
35
- converted_query.q = _search(converted_query)
36
- converted_query.format = format
37
- converted_query.country_code = country_code(converted_query.q)
38
- converted_query
39
- end
40
-
41
- # reverse lookup, :weather_id -> (:geocode || :coordinates)
42
- #
43
- def self.reverse(original_query)
44
- raise ArgumentError unless is_a_query?(original_query)
45
- return nil unless original_query.format == format
46
- converted_query = Barometer::Query.new
47
- converted_query.q = _reverse(original_query)
48
- converted_query.format = Query::Format::Geocode.format
49
- converted_query
50
- end
51
-
52
- private
53
-
54
- # :geocode -> :weather_id
55
- # search weather.com for the given query
56
- #
57
- def self._search(query=nil)
58
- return nil unless query
59
- raise ArgumentError unless is_a_query?(query)
60
- response = WebService::WeatherID.fetch(query)
61
- _parse_weather_id(response)
62
- end
63
-
64
- # :weather_id -> :geocode
65
- # query yahoo with :weather_id and parse geo_data
66
- #
67
- def self._reverse(query=nil)
68
- return nil unless query
69
- raise ArgumentError unless is_a_query?(query)
70
- response = WebService::WeatherID.reverse(query)
71
- _parse_geocode(response)
72
- end
73
-
74
- # match the first :weather_id (from search results)
75
- #
76
- def self._parse_weather_id(text)
77
- return nil unless text
78
- match = text.match(/loc id=[\\]?['|""]([0-9a-zA-Z]*)[\\]?['|""]/)
79
- match ? match[1] : nil
80
- end
81
-
82
- # parse the geo_data
83
- #
84
- def self._parse_geocode(text)
85
- return nil unless text
86
- output = [text["city"], text["region"], _fix_country(text["country"])]
87
- output.delete("")
88
- output.compact.join(', ')
89
- end
90
-
91
- end
92
- end
@@ -1,150 +0,0 @@
1
- module Barometer
2
- #
3
- # Format: WOEID
4
- # "Where on Earth" ID (by Yahoo!)
5
- #
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. In the future, if WoeIDs are moe popular then zipcodes,
13
- # then I will reverse this ...
14
- #
15
- # This class is used to determine if a query is a
16
- # :woe_id and how to convert to a :woe_id.
17
- #
18
- class Query::Format::WoeID < Query::Format
19
-
20
- def self.format; :woe_id; end
21
- def self.regex; /(^[0-9]{4}$)|(^[0-9]{6,7}$)|(^w[0-9]{4,7}$)/; end
22
- def self.convertable_formats
23
- [:short_zipcode, :zipcode, :weather_id, :coordinates, :icao, :geocode, :postalcode]
24
- end
25
-
26
- # remove the 'w' from applicable queries (only needed for detection)
27
- #
28
- def self.convert_query(text)
29
- return nil unless text
30
- text.delete('w')
31
- end
32
-
33
- # convert to this format, X -> :woeid
34
- #
35
- def self.to(original_query)
36
- raise ArgumentError unless is_a_query?(original_query)
37
- return nil unless converts?(original_query)
38
-
39
- # pre-convert (:weather_id -> :geocode)
40
- #
41
- pre_query = nil
42
- if original_query.format == :weather_id
43
- pre_query = Barometer::Query::Format::WeatherID.reverse(original_query)
44
- end
45
-
46
- # pre-convert ([:short_zipcode, :zipcode, :postalcode, :icao] -> :geocode)
47
- #
48
- unless pre_query
49
- if [:short_zipcode, :zipcode, :icao].include?(original_query.format)
50
- unless pre_query = original_query.get_conversion(Barometer::Query::Format::Geocode.format)
51
- pre_query = Barometer::Query::Format::Geocode.to(original_query)
52
- end
53
- end
54
- end
55
-
56
- converted_query = Barometer::Query.new
57
- converted_query.country_code = original_query.country_code if original_query
58
-
59
- # TODO
60
- # use Geomojo.com (when no Yahoo! appid)
61
- #
62
- # if [:coordinates].include?(pre_query ? pre_query.format : original_query.format) &&
63
- # Barometer.yahoo_placemaker_app_id.nil?
64
- # converted_query.q = _query_geomojo(pre_query || original_query)
65
- # converted_query.format = format
66
- # end
67
-
68
- # use Yahoo! Placemaker
69
- #
70
- if [:coordinates, :geocode, :postalcode].include?(pre_query ? pre_query.format : original_query.format) &&
71
- !Barometer.yahoo_placemaker_app_id.nil?
72
- converted_query.q = _query_placemaker(pre_query || original_query)
73
- converted_query.format = format
74
- end
75
-
76
- converted_query.geo = pre_query.geo if pre_query
77
- converted_query.country_code = pre_query.country_code if pre_query
78
- converted_query
79
- end
80
-
81
- # reverse lookup, :woe_id -> (:geocode || :coordinates)
82
- #
83
- def self.reverse(original_query)
84
- raise ArgumentError unless is_a_query?(original_query)
85
- return nil unless original_query.format == self.format
86
- converted_query = Barometer::Query.new
87
- converted_query.q = _reverse(original_query)
88
- converted_query.format = Barometer::Query::Format::Geocode.format
89
- converted_query
90
- end
91
-
92
- private
93
-
94
- # Yahoo! Placemaker
95
- # [:geocode,:coordinates] -> :woe_id
96
- #
97
- def self._query_placemaker(query=nil)
98
- return nil unless query
99
- raise ArgumentError unless is_a_query?(query)
100
- doc = Barometer::WebService::Placemaker.fetch(query)
101
- _parse_woe_from_placemaker(doc)
102
- end
103
-
104
- # Geomojo.com
105
- # [:coordinates] -> :woe_id
106
- #
107
- # def self._query_geomojo(query=nil)
108
- # return nil unless query
109
- # raise ArgumentError unless is_a_query?(query)
110
- # doc = WebService::Geomojo.fetch(query)
111
- # _parse_woe_from_geomojo(doc)
112
- # end
113
-
114
- # :woe_id -> :geocode
115
- # query yahoo with :woe_id and parse geo_data
116
- #
117
- def self._reverse(query=nil)
118
- return nil unless query
119
- raise ArgumentError unless is_a_query?(query)
120
- response = Barometer::WebService::Placemaker.reverse(query)
121
- _parse_geocode(response)
122
- end
123
-
124
- # match the first :woe_id (from search results)
125
- # expects a Nokogiri doc
126
- #
127
- def self._parse_woe_from_placemaker(doc)
128
- return nil unless doc
129
- Barometer::WebService::Placemaker.parse_woe_id(doc)
130
- end
131
-
132
- # match the first :woe_id (from search results)
133
- # expects a Nokogiri doc
134
- #
135
- # def self._parse_woe_from_geomojo(doc)
136
- # return nil unless doc
137
- # WebService::Geomojo.parse_woe_id(doc)
138
- # end
139
-
140
- # parse the geo_data
141
- #
142
- def self._parse_geocode(text)
143
- return nil unless text
144
- output = [text["city"], text["region"], _fix_country(text["country"])]
145
- output.delete("")
146
- output.compact.join(', ')
147
- end
148
-
149
- end
150
- end