barometer 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. data/.gitignore +2 -0
  2. data/.pelusa.yml +7 -0
  3. data/.travis.yml +6 -3
  4. data/Gemfile +11 -1
  5. data/README.md +89 -244
  6. data/Rakefile +1 -1
  7. data/barometer.gemspec +22 -24
  8. data/lib/barometer.rb +14 -65
  9. data/lib/barometer/base.rb +35 -65
  10. data/lib/barometer/data.rb +15 -20
  11. data/lib/barometer/data/attribute.rb +19 -0
  12. data/lib/barometer/data/attributes/distance.rb +11 -0
  13. data/lib/barometer/data/attributes/float.rb +11 -0
  14. data/lib/barometer/data/attributes/integer.rb +11 -0
  15. data/lib/barometer/data/attributes/location.rb +11 -0
  16. data/lib/barometer/data/attributes/pressure.rb +11 -0
  17. data/lib/barometer/data/attributes/sun.rb +15 -0
  18. data/lib/barometer/data/attributes/temperature.rb +11 -0
  19. data/lib/barometer/data/attributes/time.rb +11 -0
  20. data/lib/barometer/data/attributes/vector.rb +11 -0
  21. data/lib/barometer/data/attributes/zone.rb +11 -0
  22. data/lib/barometer/data/convertable_units.rb +145 -0
  23. data/lib/barometer/data/coordinates.rb +16 -0
  24. data/lib/barometer/data/distance.rb +14 -133
  25. data/lib/barometer/data/geo.rb +22 -59
  26. data/lib/barometer/data/location.rb +14 -20
  27. data/lib/barometer/data/pressure.rb +14 -135
  28. data/lib/barometer/data/sun.rb +24 -24
  29. data/lib/barometer/data/temperature.rb +14 -169
  30. data/lib/barometer/data/vector.rb +44 -0
  31. data/lib/barometer/data/zone.rb +109 -112
  32. data/lib/barometer/query.rb +23 -161
  33. data/lib/barometer/query/base.rb +88 -0
  34. data/lib/barometer/query/converter.rb +64 -0
  35. data/lib/barometer/query/converters/from_coordinates_to_noaa_station_id.rb +30 -0
  36. data/lib/barometer/query/converters/from_geocode_to_coordinates.rb +28 -0
  37. data/lib/barometer/query/converters/from_short_zipcode_to_zipcode.rb +28 -0
  38. data/lib/barometer/query/converters/from_weather_id_to_geocode.rb +30 -0
  39. data/lib/barometer/query/converters/from_woe_id_or_ipv4_to_geocode.rb +32 -0
  40. data/lib/barometer/query/converters/to_geocode.rb +30 -0
  41. data/lib/barometer/query/converters/to_weather_id.rb +30 -0
  42. data/lib/barometer/query/converters/to_woe_id.rb +30 -0
  43. data/lib/barometer/query/format.rb +59 -0
  44. data/lib/barometer/query/formats/base.rb +22 -0
  45. data/lib/barometer/query/formats/coordinates.rb +14 -0
  46. data/lib/barometer/query/formats/geocode.rb +15 -0
  47. data/lib/barometer/query/formats/icao.rb +35 -0
  48. data/lib/barometer/query/formats/ipv4_address.rb +19 -0
  49. data/lib/barometer/query/formats/noaa_station_id.rb +15 -0
  50. data/lib/barometer/query/formats/postalcode.rb +20 -0
  51. data/lib/barometer/query/formats/short_zipcode.rb +15 -0
  52. data/lib/barometer/{translations → query/formats/translations}/icao_country_codes.yml +0 -0
  53. data/lib/barometer/{translations → query/formats/translations}/weather_country_codes.yml +0 -0
  54. data/lib/barometer/query/formats/unknown.rb +14 -0
  55. data/lib/barometer/query/formats/weather_id.rb +33 -0
  56. data/lib/barometer/query/formats/woe_id.rb +28 -0
  57. data/lib/barometer/query/formats/zipcode.rb +15 -0
  58. data/lib/barometer/query/service.rb +13 -0
  59. data/lib/barometer/query/services/apis/geonames_timezone.rb +26 -0
  60. data/lib/barometer/query/services/apis/google_geocode.rb +35 -0
  61. data/lib/barometer/query/services/apis/noaa_station.rb +31 -0
  62. data/lib/barometer/query/services/apis/weather_id.rb +35 -0
  63. data/lib/barometer/query/services/apis/wunderground_timezone.rb +26 -0
  64. data/lib/barometer/query/services/apis/yahoo_placefinder.rb +35 -0
  65. data/lib/barometer/query/services/apis/yahoo_weather.rb +31 -0
  66. data/lib/barometer/query/services/from_weather_id.rb +64 -0
  67. data/lib/barometer/query/services/geonames_timezone.rb +18 -0
  68. data/lib/barometer/query/services/google_geocode.rb +106 -0
  69. data/lib/barometer/query/services/noaa_station_id.rb +28 -0
  70. data/lib/barometer/query/services/to_weather_id.rb +25 -0
  71. data/lib/barometer/query/services/to_woe_id.rb +29 -0
  72. data/lib/barometer/query/services/wunderground_timezone.rb +18 -0
  73. data/lib/barometer/query/services/yahoo_geocode.rb +69 -0
  74. data/lib/barometer/response.rb +12 -0
  75. data/lib/barometer/response/base.rb +57 -0
  76. data/lib/barometer/response/current.rb +27 -0
  77. data/lib/barometer/response/prediction.rb +41 -0
  78. data/lib/barometer/response/prediction_collection.rb +48 -0
  79. data/lib/barometer/utils.rb +17 -0
  80. data/lib/barometer/utils/address.rb +33 -0
  81. data/lib/barometer/utils/api.rb +30 -0
  82. data/lib/barometer/utils/config_reader.rb +40 -0
  83. data/lib/barometer/utils/get.rb +17 -0
  84. data/lib/barometer/utils/json_reader.rb +22 -0
  85. data/lib/barometer/utils/payload.rb +100 -0
  86. data/lib/barometer/utils/payload_request.rb +37 -0
  87. data/lib/barometer/utils/post.rb +24 -0
  88. data/lib/barometer/utils/time.rb +78 -0
  89. data/lib/barometer/{translations → utils/translations}/zone_codes.yml +0 -0
  90. data/lib/barometer/utils/versioned_registration.rb +70 -0
  91. data/lib/barometer/utils/xml_reader.rb +27 -0
  92. data/lib/barometer/utils/zone_code_lookup.rb +30 -0
  93. data/lib/barometer/version.rb +1 -1
  94. data/lib/barometer/weather.rb +44 -173
  95. data/lib/barometer/weather_service.rb +41 -0
  96. data/lib/barometer/weather_services/base.rb +50 -0
  97. data/lib/barometer/weather_services/forecast_io.rb +36 -0
  98. data/lib/barometer/weather_services/forecast_io/api.rb +22 -0
  99. data/lib/barometer/weather_services/forecast_io/query.rb +38 -0
  100. data/lib/barometer/weather_services/forecast_io/response.rb +31 -0
  101. data/lib/barometer/weather_services/forecast_io/response/current_weather.rb +78 -0
  102. data/lib/barometer/weather_services/forecast_io/response/forecasted_weather.rb +74 -0
  103. data/lib/barometer/weather_services/forecast_io/response/location.rb +19 -0
  104. data/lib/barometer/weather_services/forecast_io/response/timezone.rb +25 -0
  105. data/lib/barometer/weather_services/noaa.rb +21 -305
  106. data/lib/barometer/weather_services/noaa/current_api.rb +25 -0
  107. data/lib/barometer/weather_services/noaa/current_query.rb +30 -0
  108. data/lib/barometer/weather_services/noaa/current_response.rb +29 -0
  109. data/lib/barometer/weather_services/noaa/forecast_api.rb +25 -0
  110. data/lib/barometer/weather_services/noaa/forecast_query.rb +39 -0
  111. data/lib/barometer/weather_services/noaa/forecast_response.rb +28 -0
  112. data/lib/barometer/weather_services/noaa/response/current_location.rb +42 -0
  113. data/lib/barometer/weather_services/noaa/response/current_station.rb +46 -0
  114. data/lib/barometer/weather_services/noaa/response/current_weather.rb +82 -0
  115. data/lib/barometer/weather_services/noaa/response/forecasted_weather.rb +90 -0
  116. data/lib/barometer/weather_services/noaa/response/location.rb +19 -0
  117. data/lib/barometer/weather_services/noaa/response/timezone.rb +15 -0
  118. data/lib/barometer/weather_services/response.rb +9 -0
  119. data/lib/barometer/weather_services/response/location.rb +42 -0
  120. data/lib/barometer/weather_services/response/time_zone.rb +19 -0
  121. data/lib/barometer/weather_services/weather_bug.rb +24 -280
  122. data/lib/barometer/weather_services/weather_bug/current_api.rb +26 -0
  123. data/lib/barometer/weather_services/weather_bug/current_response.rb +33 -0
  124. data/lib/barometer/weather_services/weather_bug/forecast_api.rb +26 -0
  125. data/lib/barometer/weather_services/weather_bug/forecast_response.rb +29 -0
  126. data/lib/barometer/weather_services/weather_bug/query.rb +42 -0
  127. data/lib/barometer/weather_services/weather_bug/response/current_weather.rb +82 -0
  128. data/lib/barometer/weather_services/weather_bug/response/forecasted_weather.rb +67 -0
  129. data/lib/barometer/weather_services/weather_bug/response/location.rb +23 -0
  130. data/lib/barometer/weather_services/weather_bug/response/station.rb +43 -0
  131. data/lib/barometer/weather_services/weather_bug/response/sun.rb +32 -0
  132. data/lib/barometer/weather_services/weather_bug/response/time_helper.rb +52 -0
  133. data/lib/barometer/weather_services/weather_bug/response/timezone.rb +15 -0
  134. data/lib/barometer/weather_services/wunderground_v1.rb +32 -0
  135. data/lib/barometer/weather_services/wunderground_v1/current_api.rb +21 -0
  136. data/lib/barometer/weather_services/wunderground_v1/current_response.rb +31 -0
  137. data/lib/barometer/weather_services/wunderground_v1/forecast_api.rb +21 -0
  138. data/lib/barometer/weather_services/wunderground_v1/forecast_response.rb +33 -0
  139. data/lib/barometer/weather_services/wunderground_v1/query.rb +30 -0
  140. data/lib/barometer/weather_services/wunderground_v1/response/current_weather.rb +92 -0
  141. data/lib/barometer/weather_services/wunderground_v1/response/forecasted_weather.rb +87 -0
  142. data/lib/barometer/weather_services/wunderground_v1/response/full_timezone.rb +22 -0
  143. data/lib/barometer/weather_services/wunderground_v1/response/location.rb +43 -0
  144. data/lib/barometer/weather_services/wunderground_v1/response/station.rb +39 -0
  145. data/lib/barometer/weather_services/wunderground_v1/response/sun.rb +53 -0
  146. data/lib/barometer/weather_services/wunderground_v1/response/timezone.rb +15 -0
  147. data/lib/barometer/weather_services/yahoo.rb +16 -198
  148. data/lib/barometer/weather_services/yahoo/api.rb +21 -0
  149. data/lib/barometer/weather_services/yahoo/query.rb +42 -0
  150. data/lib/barometer/weather_services/yahoo/response.rb +39 -0
  151. data/lib/barometer/weather_services/yahoo/response/current_weather.rb +86 -0
  152. data/lib/barometer/weather_services/yahoo/response/forecasted_weather.rb +71 -0
  153. data/lib/barometer/weather_services/yahoo/response/location.rb +47 -0
  154. data/lib/barometer/weather_services/yahoo/response/sun.rb +43 -0
  155. data/lib/barometer/weather_services/yahoo/response/timezone.rb +15 -0
  156. data/spec/barometer_spec.rb +18 -120
  157. data/spec/base_spec.rb +114 -0
  158. data/spec/cassettes/Converter_FromCoordinatesToNoaaStationId.json +1 -0
  159. data/spec/cassettes/Converter_FromWeatherIdToGeocode.json +1 -0
  160. data/spec/cassettes/Converter_FromWoeIdOrIpv4ToGeocode.json +1 -0
  161. data/spec/cassettes/Converter_ToGeocode.json +1 -0
  162. data/spec/cassettes/Converter_ToWeatherId.json +1 -0
  163. data/spec/cassettes/Converter_ToWoeId.json +1 -0
  164. data/spec/cassettes/Service_FromWeatherId.json +1 -0
  165. data/spec/cassettes/Service_GoogleGeocode.json +1 -0
  166. data/spec/cassettes/Service_NoaaStation.json +1 -0
  167. data/spec/cassettes/Service_ToWeatherId.json +1 -0
  168. data/spec/cassettes/Service_ToWoeId.json +1 -0
  169. data/spec/cassettes/Service_YahooGeocode.json +1 -0
  170. data/spec/cassettes/WeatherService_ForecastIo.json +1 -0
  171. data/spec/cassettes/WeatherService_Noaa.json +1 -1
  172. data/spec/cassettes/WeatherService_WeatherBug.json +1 -1
  173. data/spec/cassettes/WeatherService_WundergroundV1.json +1 -0
  174. data/spec/cassettes/WeatherService_Yahoo.json +1 -1
  175. data/spec/data/attributes/distance_spec.rb +60 -0
  176. data/spec/data/attributes/location_spec.rb +41 -0
  177. data/spec/data/attributes/pressure_spec.rb +60 -0
  178. data/spec/data/attributes/sun_spec.rb +33 -0
  179. data/spec/data/attributes/temperature_spec.rb +60 -0
  180. data/spec/data/attributes/time_spec.rb +58 -0
  181. data/spec/data/attributes/vector_spec.rb +43 -0
  182. data/spec/data/attributes/zone_spec.rb +34 -0
  183. data/spec/data/convertable_units_spec.rb +299 -0
  184. data/spec/data/coordinates_spec.rb +15 -0
  185. data/spec/data/distance_spec.rb +49 -333
  186. data/spec/data/geo_spec.rb +72 -71
  187. data/spec/data/location_spec.rb +70 -65
  188. data/spec/data/pressure_spec.rb +49 -333
  189. data/spec/data/sun_spec.rb +57 -81
  190. data/spec/data/temperature_spec.rb +49 -393
  191. data/spec/data/vector_spec.rb +100 -0
  192. data/spec/data/zone_spec.rb +199 -266
  193. data/spec/query/base_spec.rb +296 -0
  194. data/spec/query/converter_spec.rb +98 -0
  195. data/spec/query/converters/from_coordinates_to_noaa_station_id_spec.rb +35 -0
  196. data/spec/query/converters/from_geocode_to_coordinates_spec.rb +25 -0
  197. data/spec/query/converters/from_short_zipcode_to_zipcode_spec.rb +31 -0
  198. data/spec/query/converters/from_weather_id_to_geocode_spec.rb +40 -0
  199. data/spec/query/converters/from_woe_id_or_ipv4_to_geocode_spec.rb +51 -0
  200. data/spec/query/converters/to_geocode_spec.rb +99 -0
  201. data/spec/query/converters/to_weather_id_spec.rb +35 -0
  202. data/spec/query/converters/to_woe_id_spec.rb +74 -0
  203. data/spec/query/formats/base_spec.rb +15 -0
  204. data/spec/query/formats/coordinates_spec.rb +13 -0
  205. data/spec/query/formats/geocode_spec.rb +9 -0
  206. data/spec/query/formats/icao_spec.rb +20 -0
  207. data/spec/query/formats/ipv4_address_spec.rb +33 -0
  208. data/spec/query/formats/noaa_station_id_spec.rb +9 -0
  209. data/spec/query/formats/postalcode_spec.rb +18 -0
  210. data/spec/query/formats/short_zipcode_spec.rb +18 -0
  211. data/spec/query/formats/unknown_spec.rb +9 -0
  212. data/spec/query/formats/weather_id_spec.rb +31 -0
  213. data/spec/query/formats/woe_id_spec.rb +45 -0
  214. data/spec/query/formats/zipcode_spec.rb +18 -0
  215. data/spec/query/formats_spec.rb +55 -0
  216. data/spec/query/services/from_weather_id_spec.rb +54 -0
  217. data/spec/query/services/google_geocode_spec.rb +60 -0
  218. data/spec/query/services/noaa_station_id_spec.rb +23 -0
  219. data/spec/query/services/to_weather_id_spec.rb +23 -0
  220. data/spec/query/services/to_woe_id_spec.rb +51 -0
  221. data/spec/query/services/yahoo_geocode_spec.rb +72 -0
  222. data/spec/response/base_spec.rb +103 -0
  223. data/spec/response/current_spec.rb +33 -0
  224. data/spec/response/predicition_spec.rb +65 -0
  225. data/spec/response/prediction_collection_spec.rb +97 -0
  226. data/spec/spec_helper.rb +14 -12
  227. data/spec/support/key_file_parser.rb +22 -0
  228. data/spec/support/matchers/formats.rb +36 -0
  229. data/spec/support/matchers/have_data.rb +46 -0
  230. data/spec/support/matchers/have_field.rb +128 -0
  231. data/spec/support/matchers/have_forecast.rb +46 -0
  232. data/spec/support/matchers/path.rb +23 -0
  233. data/spec/support/query_factory.rb +20 -0
  234. data/spec/utils/address_spec.rb +67 -0
  235. data/spec/utils/config_reader_spec.rb +157 -0
  236. data/spec/utils/get_spec.rb +22 -0
  237. data/spec/utils/payload_request_spec.rb +69 -0
  238. data/spec/utils/payload_spec.rb +168 -0
  239. data/spec/utils/post_spec.rb +20 -0
  240. data/spec/utils/time_spec.rb +93 -0
  241. data/spec/utils/versioned_registration_spec.rb +105 -0
  242. data/spec/weather_services/base_spec.rb +116 -0
  243. data/spec/weather_services/forecast_io_spec.rb +71 -0
  244. data/spec/weather_services/noaa/current_response_spec.rb +22 -0
  245. data/spec/weather_services/noaa/forecast_response_spec.rb +33 -0
  246. data/spec/weather_services/noaa_spec.rb +68 -166
  247. data/spec/weather_services/weather_bug/current_response_spec.rb +64 -0
  248. data/spec/weather_services/weather_bug/forecast_response_spec.rb +23 -0
  249. data/spec/weather_services/weather_bug_spec.rb +62 -202
  250. data/spec/weather_services/wunderground_v1/current_response_spec.rb +19 -0
  251. data/spec/weather_services/wunderground_v1/forecast_response_spec.rb +62 -0
  252. data/spec/weather_services/wunderground_v1_spec.rb +78 -0
  253. data/spec/weather_services/yahoo/response_spec.rb +73 -0
  254. data/spec/weather_services/yahoo_spec.rb +52 -135
  255. data/spec/weather_services_spec.rb +103 -0
  256. data/spec/weather_spec.rb +167 -347
  257. metadata +342 -123
  258. data/.document +0 -5
  259. data/TODO +0 -60
  260. data/bin/barometer +0 -441
  261. data/lib/barometer/data/local_datetime.rb +0 -145
  262. data/lib/barometer/data/local_time.rb +0 -134
  263. data/lib/barometer/data/speed.rb +0 -158
  264. data/lib/barometer/data/units.rb +0 -49
  265. data/lib/barometer/formats.rb +0 -13
  266. data/lib/barometer/formats/coordinates.rb +0 -57
  267. data/lib/barometer/formats/format.rb +0 -64
  268. data/lib/barometer/formats/geocode.rb +0 -60
  269. data/lib/barometer/formats/icao.rb +0 -37
  270. data/lib/barometer/formats/postalcode.rb +0 -22
  271. data/lib/barometer/formats/short_zipcode.rb +0 -17
  272. data/lib/barometer/formats/weather_id.rb +0 -92
  273. data/lib/barometer/formats/woe_id.rb +0 -150
  274. data/lib/barometer/formats/zipcode.rb +0 -31
  275. data/lib/barometer/key_file_parser.rb +0 -20
  276. data/lib/barometer/measurements/measurement.rb +0 -202
  277. data/lib/barometer/measurements/result.rb +0 -207
  278. data/lib/barometer/measurements/result_array.rb +0 -75
  279. data/lib/barometer/services.rb +0 -19
  280. data/lib/barometer/weather_services/service.rb +0 -189
  281. data/lib/barometer/weather_services/wunderground.rb +0 -264
  282. data/lib/barometer/web_services/geocode.rb +0 -34
  283. data/lib/barometer/web_services/noaa_station_id.rb +0 -53
  284. data/lib/barometer/web_services/placemaker.rb +0 -95
  285. data/lib/barometer/web_services/timezone.rb +0 -38
  286. data/lib/barometer/web_services/weather_id.rb +0 -50
  287. data/lib/barometer/web_services/web_service.rb +0 -29
  288. data/spec/cassettes/Barometer.json +0 -1
  289. data/spec/cassettes/Query.json +0 -1
  290. data/spec/cassettes/Query_Format_Coordinates.json +0 -1
  291. data/spec/cassettes/Query_Format_Geocode.json +0 -1
  292. data/spec/cassettes/Query_Format_WeatherID.json +0 -1
  293. data/spec/cassettes/Query_Format_WoeID.json +0 -1
  294. data/spec/cassettes/WeatherService.json +0 -1
  295. data/spec/cassettes/WeatherService_Wunderground.json +0 -1
  296. data/spec/cassettes/WebService_Geocode.json +0 -1
  297. data/spec/cassettes/WebService_NoaaStation.json +0 -1
  298. data/spec/data/local_datetime_spec.rb +0 -274
  299. data/spec/data/local_time_spec.rb +0 -239
  300. data/spec/data/speed_spec.rb +0 -374
  301. data/spec/data/units_spec.rb +0 -101
  302. data/spec/formats/coordinates_spec.rb +0 -166
  303. data/spec/formats/format_spec.rb +0 -74
  304. data/spec/formats/geocode_spec.rb +0 -163
  305. data/spec/formats/icao_spec.rb +0 -55
  306. data/spec/formats/postalcode_spec.rb +0 -53
  307. data/spec/formats/short_zipcode_spec.rb +0 -47
  308. data/spec/formats/weather_id_spec.rb +0 -182
  309. data/spec/formats/woe_id_spec.rb +0 -211
  310. data/spec/formats/zipcode_spec.rb +0 -103
  311. data/spec/key_file_parser_spec.rb +0 -28
  312. data/spec/measurements/measurement_spec.rb +0 -381
  313. data/spec/measurements/result_array_spec.rb +0 -150
  314. data/spec/measurements/result_spec.rb +0 -632
  315. data/spec/query_spec.rb +0 -498
  316. data/spec/weather_services/services_spec.rb +0 -135
  317. data/spec/weather_services/wunderground_spec.rb +0 -179
  318. data/spec/web_services/geocode_spec.rb +0 -31
  319. data/spec/web_services/noaa_station_id_spec.rb +0 -33
  320. data/spec/web_services/placemaker_spec.rb +0 -41
  321. data/spec/web_services/web_services_spec.rb +0 -20
@@ -0,0 +1,18 @@
1
+ require_relative 'apis/geonames_timezone'
2
+
3
+ module Barometer
4
+ module Query
5
+ module Service
6
+ class GeonamesTimezone
7
+ def self.fetch(latitude, longitude)
8
+ return unless latitude && longitude
9
+
10
+ api = GeonamesTimezone::Api.new(latitude, longitude)
11
+ payload = api.get
12
+
13
+ Data::Zone.new( payload.fetch('timezoneId') )
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,106 @@
1
+ require_relative 'apis/google_geocode'
2
+
3
+ module Barometer
4
+ module Query
5
+ module Service
6
+ class GoogleGeocode
7
+ def initialize(query)
8
+ @query = query
9
+ end
10
+
11
+ def call
12
+ converted_query = query.get_conversion(:short_zipcode, :zipcode, :postalcode, :coordinates, :icao, :unknown)
13
+ return unless converted_query
14
+
15
+ @payload = GoogleGeocode::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
+ latitude: latitude,
26
+ longitude: longitude,
27
+ locality: locality,
28
+ region: region,
29
+ country: country,
30
+ country_code: country_code,
31
+ postal_code: postal_code,
32
+ query: full_query
33
+ )
34
+ end
35
+
36
+ def latitude
37
+ payload.fetch('geometry', 'location', 'lat')
38
+ end
39
+
40
+ def longitude
41
+ payload.fetch('geometry', 'location', 'lng')
42
+ end
43
+
44
+ def locality
45
+ find_name('sublocality', 'long_name') || find_name('locality', 'long_name')
46
+ end
47
+
48
+ def region
49
+ find_name('administrative_area_level_1', 'short_name')
50
+ end
51
+
52
+ def country
53
+ find_name('country', 'long_name')
54
+ end
55
+
56
+ def country_code
57
+ find_name('country', 'short_name')
58
+ end
59
+
60
+ def postal_code
61
+ find_name('postal_code', 'short_name')
62
+ end
63
+
64
+ def full_query
65
+ return if query_is_street_address? || query_is_route?
66
+ find_detected_types.map{|address_component| address_component.fetch('short_name')}.join(', ')
67
+ end
68
+
69
+ def address_components
70
+ @address_components ||= payload.fetch('address_components').
71
+ select{|address_component| address_component.has_key? 'types'}
72
+ end
73
+
74
+ def find_type(address_component_type)
75
+ address_components.find do |address_component|
76
+ address_component.fetch('types').include?(address_component_type)
77
+ end
78
+ end
79
+
80
+ def find_name(address_component_type, name)
81
+ if result = find_type(address_component_type)
82
+ result.fetch(name)
83
+ end
84
+ end
85
+
86
+ def detected_query_types
87
+ @detected_query_types ||= payload.fetch('types')
88
+ end
89
+
90
+ def find_detected_types
91
+ address_components.select do |address_component|
92
+ (address_component.fetch('types') & detected_query_types).any?
93
+ end
94
+ end
95
+
96
+ def query_is_street_address?
97
+ detected_query_types.include? 'street_address'
98
+ end
99
+
100
+ def query_is_route?
101
+ detected_query_types.include? 'route'
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,28 @@
1
+ require_relative 'apis/noaa_station'
2
+ require 'nokogiri'
3
+
4
+ module Barometer
5
+ module Query
6
+ module Service
7
+ class NoaaStation
8
+ def self.fetch(query)
9
+ converted_query = query.get_conversion(:coordinates)
10
+ return unless converted_query
11
+
12
+ api = NoaaStation::Api.new(converted_query)
13
+ _parse_content(api.get)
14
+ end
15
+
16
+ def self._parse_content(content)
17
+ doc = Nokogiri::HTML.parse(content)
18
+ if doc && links = doc.search(".current-conditions-extra a")
19
+ sid_link = links.detect{|link| link.attr("href").match(/sid=(.*)&/)}
20
+ sid_link.attr("href").match(/sid=(.*?)&/)[1]
21
+ end
22
+ rescue
23
+ nil
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,25 @@
1
+ require_relative 'apis/weather_id'
2
+
3
+ module Barometer
4
+ module Query
5
+ module Service
6
+ module ToWeatherId
7
+ def self.call(query)
8
+ converted_query = query.get_conversion(:geocode, :unknown)
9
+ return unless converted_query
10
+
11
+ api = WeatherId::Api.new(converted_query)
12
+ _parse_content(api.get)
13
+ end
14
+
15
+ def self._parse_content(payload)
16
+ if payload.fetch('loc').is_a? Array
17
+ payload.fetch('loc', 0, '@id')
18
+ else
19
+ payload.fetch('loc', '@id')
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,29 @@
1
+ require_relative 'apis/yahoo_placefinder'
2
+
3
+ module Barometer
4
+ module Query
5
+ module Service
6
+ class ToWoeId
7
+ def initialize(query)
8
+ @query = query
9
+ end
10
+
11
+ def call
12
+ converted_query = query.get_conversion(:short_zipcode, :zipcode, :geocode, :unknown, :coordinates, :postalcode, :ipv4_address)
13
+ return unless converted_query
14
+
15
+ @payload = YahooPlacefinder::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
+ payload.fetch('woeid')
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,18 @@
1
+ require_relative 'apis/wunderground_timezone'
2
+
3
+ module Barometer
4
+ module Query
5
+ module Service
6
+ class WundergroundTimezone
7
+ def self.fetch(latitude, longitude)
8
+ return unless latitude && longitude
9
+
10
+ api = WundergroundTimezone::Api.new(latitude, longitude)
11
+ payload = api.get
12
+
13
+ Data::Zone.new( payload.fetch('date', 'tz_long') )
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,69 @@
1
+ require_relative 'apis/yahoo_placefinder'
2
+
3
+ module Barometer
4
+ module Query
5
+ module Service
6
+ class YahooGeocode
7
+ def initialize(query)
8
+ @query = query
9
+ end
10
+
11
+ def call
12
+ converted_query = query.get_conversion(:woe_id, :ipv4_address)
13
+ return unless converted_query
14
+
15
+ @payload = YahooPlacefinder::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
+ latitude: latitude,
26
+ longitude: longitude,
27
+ locality: locality,
28
+ region: region,
29
+ country: country,
30
+ country_code: country_code,
31
+ postal_code: postal_code,
32
+ query: full_query
33
+ )
34
+ end
35
+
36
+ def latitude
37
+ payload.fetch('latitude')
38
+ end
39
+
40
+ def longitude
41
+ payload.fetch('longitude')
42
+ end
43
+
44
+ def locality
45
+ payload.fetch('city')
46
+ end
47
+
48
+ def region
49
+ payload.fetch('statecode') || payload.fetch('state')
50
+ end
51
+
52
+ def country
53
+ payload.fetch('country')
54
+ end
55
+
56
+ def country_code
57
+ payload.fetch('countrycode')
58
+ end
59
+
60
+ def postal_code
61
+ payload.fetch('uzip')
62
+ end
63
+
64
+ def full_query
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,12 @@
1
+ module Barometer
2
+ module Response
3
+ def self.new
4
+ Barometer::Response::Base.new
5
+ end
6
+ end
7
+ end
8
+
9
+ require_relative 'response/base'
10
+ require_relative 'response/current'
11
+ require_relative 'response/prediction'
12
+ require_relative 'response/prediction_collection'
@@ -0,0 +1,57 @@
1
+ require 'virtus'
2
+
3
+ module Barometer
4
+ module Response
5
+ class Base
6
+ include Virtus.model
7
+
8
+ attribute :weight, Data::Attribute::Integer, default: 1
9
+ attribute :status_code, Integer
10
+ attribute :query, String
11
+ attribute :location, Data::Attribute::Location
12
+ attribute :station, Data::Attribute::Location
13
+ attribute :timezone, Data::Attribute::Zone
14
+ attribute :response_started_at, Data::Attribute::Time
15
+ attribute :response_ended_at, Data::Attribute::Time
16
+ attribute :requested_at, Data::Attribute::Time
17
+ attribute :source, Symbol
18
+ attribute :format, Symbol
19
+
20
+ attr_accessor :current, :forecast
21
+
22
+ def initialize
23
+ super
24
+ @requested_at = Time.now.utc
25
+ end
26
+
27
+ def success?
28
+ status_code == 200
29
+ end
30
+
31
+ def complete?
32
+ current && current.complete?
33
+ end
34
+
35
+ def for(date=nil)
36
+ forecast.for(date || today)
37
+ end
38
+
39
+ def add_query(query)
40
+ return unless query
41
+ @query = query.to_s
42
+ @format = query.format
43
+ @metric = query.metric?
44
+ end
45
+
46
+ def metric?
47
+ !!@metric
48
+ end
49
+
50
+ private
51
+
52
+ def today
53
+ timezone ? timezone.today : Date.today
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,27 @@
1
+ require 'virtus'
2
+
3
+ module Barometer
4
+ module Response
5
+ class Current
6
+ include Virtus.model
7
+
8
+ attribute :temperature, Data::Attribute::Temperature
9
+ attribute :dew_point, Data::Attribute::Temperature
10
+ attribute :heat_index, Data::Attribute::Temperature
11
+ attribute :wind_chill, Data::Attribute::Temperature
12
+ attribute :wind, Data::Attribute::Vector
13
+ attribute :pressure, Data::Attribute::Pressure
14
+ attribute :visibility, Data::Attribute::Distance
15
+ attribute :humidity, Data::Attribute::Float
16
+ attribute :sun, Data::Attribute::Sun
17
+ attribute :observed_at, Data::Attribute::Time
18
+ attribute :stale_at, Data::Attribute::Time
19
+ attribute :icon, String
20
+ attribute :condition, String
21
+
22
+ def complete?
23
+ !temperature.nil?
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,41 @@
1
+ require 'virtus'
2
+
3
+ module Barometer
4
+ module Response
5
+ class Prediction
6
+ include Virtus.model
7
+
8
+ attribute :high, Data::Attribute::Temperature
9
+ attribute :low, Data::Attribute::Temperature
10
+ attribute :pop, Data::Attribute::Float
11
+ attribute :sun, Data::Attribute::Sun
12
+ attribute :starts_at, Data::Attribute::Time
13
+ attribute :ends_at, Data::Attribute::Time
14
+ attribute :icon, String
15
+ attribute :condition, String
16
+
17
+ attr_reader :date
18
+
19
+ def date=(args)
20
+ args = Array(args)
21
+ date = args.shift
22
+ timezone = args.shift
23
+
24
+ date_as_time = Utils::Time.parse(date)
25
+ @starts_at = Utils::Time.start_of_day(date_as_time)
26
+ @ends_at = Utils::Time.end_of_day(date_as_time)
27
+ @date = ::Date.new(@starts_at.year, @starts_at.month, @starts_at.day)
28
+
29
+ if timezone
30
+ @starts_at = timezone.local_to_utc(@starts_at)
31
+ @ends_at = timezone.local_to_utc(@ends_at)
32
+ end
33
+ end
34
+
35
+ def covers?(time)
36
+ raise ArgumentError unless time.is_a?(Time)
37
+ time >= @starts_at && time <= @ends_at
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,48 @@
1
+ require 'date'
2
+
3
+ module Barometer
4
+ module Response
5
+ class PredictionCollection
6
+ include Enumerable
7
+
8
+ def initialize(*predictions)
9
+ @predictions = predictions
10
+ end
11
+
12
+ def each(&block)
13
+ @predictions.each(&block)
14
+ end
15
+
16
+ def <<(prediction)
17
+ @predictions << prediction
18
+ end
19
+
20
+ def [](index)
21
+ index.respond_to?(:to_i) ? @predictions[index] : self.for(index)
22
+ end
23
+
24
+ def size
25
+ @predictions.size
26
+ end
27
+
28
+ def for(time)
29
+ return nil unless size > 0
30
+
31
+ time = case time
32
+ when Date
33
+ Time.utc(time.year,time.month,time.day,12,0,0)
34
+ else
35
+ Utils::Time.parse(time)
36
+ end
37
+
38
+ detect{ |forecast| forecast.covers?(time) }
39
+ end
40
+
41
+ def build
42
+ prediction = Prediction.new
43
+ yield(prediction)
44
+ @predictions << prediction
45
+ end
46
+ end
47
+ end
48
+ end