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,64 @@
1
+ module Barometer
2
+ module Query
3
+ module Converter
4
+ @@converters = {}
5
+
6
+ def self.converters=(converters)
7
+ @@converters = converters
8
+ end
9
+
10
+ def self.converters
11
+ @@converters
12
+ end
13
+
14
+ def self.register(to_format, converter_klass)
15
+ # return unless converter_klass.respond_to?(:from)
16
+
17
+ @@converters[to_format] ||= {}
18
+ converter_klass.from.each do |from_format|
19
+ @@converters[to_format][from_format] = converter_klass
20
+ end
21
+ end
22
+
23
+ def self.find(from_format, to_format)
24
+ converter = @@converters.fetch(to_format, {}).fetch(from_format, nil)
25
+ {to_format => converter} if converter
26
+ end
27
+
28
+ def self.find_all(from_format, to_formats)
29
+ converters = _find_direct_converter(from_format, Array(to_formats))
30
+ return converters unless converters.empty?
31
+
32
+ _find_indirect_converters(from_format, Array(to_formats))
33
+ end
34
+
35
+ def self._find_direct_converter(from_format, to_formats)
36
+ converter = nil
37
+ to_formats.each do |to_format|
38
+ converter = find(from_format, to_format)
39
+ break if converter
40
+ end
41
+ [converter].compact
42
+ end
43
+
44
+ def self._find_indirect_converters(from_format, to_formats)
45
+ geocode_converter = find(from_format, :geocode)
46
+ converter = nil
47
+ to_formats.each do |to_format|
48
+ converter = find(:geocode, to_format)
49
+ break if converter
50
+ end
51
+ geocode_converter && converter ? [geocode_converter, converter] : []
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ require_relative 'converters/from_weather_id_to_geocode'
58
+ require_relative 'converters/from_woe_id_or_ipv4_to_geocode'
59
+ require_relative 'converters/to_woe_id'
60
+ require_relative 'converters/to_geocode'
61
+ require_relative 'converters/from_short_zipcode_to_zipcode'
62
+ require_relative 'converters/to_weather_id'
63
+ require_relative 'converters/from_coordinates_to_noaa_station_id'
64
+ require_relative 'converters/from_geocode_to_coordinates'
@@ -0,0 +1,30 @@
1
+ module Barometer
2
+ module Query
3
+ module Converter
4
+ class FromCoordinatesToNoaaStationId
5
+ def self.from
6
+ [:coordinates]
7
+ end
8
+
9
+ def initialize(query)
10
+ @query = query
11
+ end
12
+
13
+ def call
14
+ return unless can_convert?
15
+
16
+ station_id = Service::NoaaStation.fetch(@query)
17
+ @query.add_conversion(:noaa_station_id, station_id)
18
+ end
19
+
20
+ private
21
+
22
+ def can_convert?
23
+ !!@query.get_conversion(*self.class.from)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ Barometer::Query::Converter.register(:coordinates, Barometer::Query::Converter::FromCoordinatesToNoaaStationId)
@@ -0,0 +1,28 @@
1
+ module Barometer
2
+ module Query
3
+ module Converter
4
+ class FromGeocodeToCoordinates
5
+ def self.from
6
+ [:geocode]
7
+ end
8
+
9
+ def initialize(query)
10
+ @query = query
11
+ end
12
+
13
+ def call
14
+ return unless can_convert?
15
+ @query.add_conversion(:coordinates, @query.geo.coordinates)
16
+ end
17
+
18
+ private
19
+
20
+ def can_convert?
21
+ !!@query.get_conversion(*self.class.from)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ Barometer::Query::Converter.register(:coordinates, Barometer::Query::Converter::FromGeocodeToCoordinates)
@@ -0,0 +1,28 @@
1
+ module Barometer
2
+ module Query
3
+ module Converter
4
+ class FromShortZipcodeToZipcode
5
+ def self.from
6
+ [:short_zipcode]
7
+ end
8
+
9
+ def initialize(query)
10
+ @query = query
11
+ end
12
+
13
+ def call
14
+ return unless can_convert?
15
+ @query.add_conversion(:zipcode, @query.get_conversion(:short_zipcode).q)
16
+ end
17
+
18
+ private
19
+
20
+ def can_convert?
21
+ !!@query.get_conversion(*self.class.from)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+
28
+ Barometer::Query::Converter.register(:zipcode, Barometer::Query::Converter::FromShortZipcodeToZipcode)
@@ -0,0 +1,30 @@
1
+ module Barometer
2
+ module Query
3
+ module Converter
4
+ class FromWeatherIdToGeocode
5
+ def self.from
6
+ [:weather_id]
7
+ end
8
+
9
+ def initialize(query)
10
+ @query = query
11
+ end
12
+
13
+ def call
14
+ return unless can_convert?
15
+
16
+ @query.geo = @query.geo.merge( Service::FromWeatherId.new(@query).call )
17
+ @query.add_conversion(:geocode, @query.geo.to_s)
18
+ end
19
+
20
+ private
21
+
22
+ def can_convert?
23
+ !!@query.get_conversion(*self.class.from)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ Barometer::Query::Converter.register(:geocode, Barometer::Query::Converter::FromWeatherIdToGeocode)
@@ -0,0 +1,32 @@
1
+ module Barometer
2
+ module Query
3
+ module Converter
4
+ class FromWoeIdOrIpv4ToGeocode
5
+ def self.from
6
+ [:woe_id, :ipv4_address]
7
+ end
8
+
9
+ def initialize(query)
10
+ @query = query
11
+ end
12
+
13
+ def call
14
+ return unless can_convert?
15
+
16
+ @query.geo = @query.geo.merge( Service::YahooGeocode.new(@query).call )
17
+
18
+ @query.add_conversion(:coordinates, @query.geo.coordinates)
19
+ @query.add_conversion(:geocode, @query.geo.to_s)
20
+ end
21
+
22
+ private
23
+
24
+ def can_convert?
25
+ !!@query.get_conversion(*self.class.from)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ Barometer::Query::Converter.register(:geocode, Barometer::Query::Converter::FromWoeIdOrIpv4ToGeocode)
@@ -0,0 +1,30 @@
1
+ module Barometer
2
+ module Query
3
+ module Converter
4
+ class ToGeocode
5
+ def self.from
6
+ [:short_zipcode, :zipcode, :postalcode, :coordinates, :icao, :unknown]
7
+ end
8
+
9
+ def initialize(query)
10
+ @query = query
11
+ end
12
+
13
+ def call
14
+ return unless can_convert?
15
+
16
+ @query.geo = @query.geo.merge( Service::GoogleGeocode.new(@query).call )
17
+ @query.add_conversion(:geocode, @query.geo.to_s)
18
+ end
19
+
20
+ private
21
+
22
+ def can_convert?
23
+ !!@query.get_conversion(*self.class.from)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ Barometer::Query::Converter.register(:geocode, Barometer::Query::Converter::ToGeocode)
@@ -0,0 +1,30 @@
1
+ module Barometer
2
+ module Query
3
+ module Converter
4
+ class ToWeatherId
5
+ def self.from
6
+ [:geocode, :unknown]
7
+ end
8
+
9
+ def initialize(query)
10
+ @query = query
11
+ end
12
+
13
+ def call
14
+ return unless can_convert?
15
+
16
+ weather_id = Service::ToWeatherId.call(@query)
17
+ @query.add_conversion(:weather_id, weather_id)
18
+ end
19
+
20
+ private
21
+
22
+ def can_convert?
23
+ !!@query.get_conversion(*self.class.from)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ Barometer::Query::Converter.register(:weather_id, Barometer::Query::Converter::ToWeatherId)
@@ -0,0 +1,30 @@
1
+ module Barometer
2
+ module Query
3
+ module Converter
4
+ class ToWoeId
5
+ def self.from
6
+ [:short_zipcode, :zipcode, :geocode, :unknown, :coordinates, :postalcode]
7
+ end
8
+
9
+ def initialize(query)
10
+ @query = query
11
+ end
12
+
13
+ def call
14
+ return unless can_convert?
15
+
16
+ woe_id = Service::ToWoeId.new(@query).call
17
+ @query.add_conversion(:woe_id, woe_id)
18
+ end
19
+
20
+ private
21
+
22
+ def can_convert?
23
+ !!@query.get_conversion(*self.class.from)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ Barometer::Query::Converter.register(:woe_id, Barometer::Query::Converter::ToWoeId)
@@ -0,0 +1,59 @@
1
+ module Barometer
2
+ module Query
3
+ module Format
4
+ class NotFound < StandardError; end
5
+
6
+ @@formats = []
7
+
8
+ def self.formats=(formats)
9
+ @@formats = formats
10
+ end
11
+
12
+ def self.formats
13
+ @@formats
14
+ end
15
+
16
+ def self.register(key, format)
17
+ @@formats ||= []
18
+ @@formats << [ key.to_sym, format ] unless has?(key)
19
+ end
20
+
21
+ def self.has?(key)
22
+ !@@formats.select{|format| format[0] == key.to_sym}.empty?
23
+ end
24
+
25
+ def self.find(key)
26
+ @@formats ||= []
27
+ format = @@formats.select{|format| format[0] == key.to_sym}
28
+
29
+ if format && format[0]
30
+ format[0][1]
31
+ else
32
+ raise NotFound
33
+ end
34
+ end
35
+
36
+ def self.match?(q)
37
+ @@formats.detect do |key, klass|
38
+ if klass.is?(q)
39
+ yield(key, klass)
40
+ true
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ require_relative 'formats/base'
49
+ require_relative 'formats/short_zipcode'
50
+ require_relative 'formats/zipcode'
51
+ require_relative 'formats/postalcode'
52
+ require_relative 'formats/weather_id'
53
+ require_relative 'formats/coordinates'
54
+ require_relative 'formats/icao'
55
+ require_relative 'formats/ipv4_address'
56
+ require_relative 'formats/woe_id'
57
+ require_relative 'formats/unknown'
58
+ require_relative 'formats/noaa_station_id'
59
+ require_relative 'formats/geocode'
@@ -0,0 +1,22 @@
1
+ module Barometer
2
+ module Query
3
+ module Format
4
+ #
5
+ # Base Format Class
6
+ #
7
+ # Fromats are used to determine if a query is of a certain
8
+ # format, how to convert to and from that format
9
+ # and what the country_code is for that format (if possible).
10
+ #
11
+ class Base
12
+ def self.regex; raise NotImplementedError; end
13
+ def self.country_code(query); nil; end
14
+ def self.convert_query(query); query; end
15
+
16
+ def self.is?(query)
17
+ !(query =~ self.regex).nil?
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,14 @@
1
+ module Barometer
2
+ module Query
3
+ module Format
4
+ #
5
+ # eg. 123.1234,-123.123
6
+ #
7
+ class Coordinates < Base
8
+ def self.regex; /^[-]?[0-9\.]+[,]{1}\s?[-]?[0-9\.]+$/; end
9
+ end
10
+ end
11
+ end
12
+ end
13
+
14
+ Barometer::Query::Format.register(:coordinates, Barometer::Query::Format::Coordinates)
@@ -0,0 +1,15 @@
1
+ module Barometer
2
+ module Query
3
+ module Format
4
+ #
5
+ # eg. 123 Elm St, Mystery, Alaska, USA
6
+ # - this format cannot be detected, only set by explictly
7
+ #
8
+ class Geocode < Base
9
+ def self.is?(query); false; end
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ Barometer::Query::Format.register(:geocode, Barometer::Query::Format::Geocode)
@@ -0,0 +1,35 @@
1
+ module Barometer
2
+ module Query
3
+ module Format
4
+ #
5
+ # ICAO (International Civil Aviation Organization)
6
+ # eg. KLAX (Los Angeles Airport)
7
+ #
8
+ class Icao < Base
9
+ @@codes_file = File.expand_path(
10
+ File.join(File.dirname(__FILE__), 'translations', 'icao_country_codes.yml'))
11
+ @@codes = nil
12
+
13
+ # call any 3-4 letter query, :icao ... obviously this will have a lot
14
+ # of false positives. So far this isn't an issue as all weather services
15
+ # that take :icao (which is just one, :wunderground) also take what
16
+ # this would have been if it was not called :icao.
17
+ #
18
+ def self.regex; /^[A-Za-z]{3,4}$/; end
19
+
20
+ # in some cases the first letter can designate the country
21
+ #
22
+ def self.country_code(query)
23
+ return unless query && query.is_a?(String)
24
+ $:.unshift(File.dirname(__FILE__))
25
+ @@codes ||= YAML.load_file(@@codes_file)
26
+ return unless @@codes && @@codes['one_letter'] && @@codes['two_letter']
27
+ @@codes['one_letter'][query[0..0].upcase.to_s] ||
28
+ @@codes['two_letter'][query[0..1].upcase.to_s] || nil
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ Barometer::Query::Format.register(:icao, Barometer::Query::Format::Icao)