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
data/.document DELETED
@@ -1,5 +0,0 @@
1
- README.rdoc
2
- lib/**/*.rb
3
- bin/*
4
- features/**/*.feature
5
- LICENSE
data/TODO DELETED
@@ -1,60 +0,0 @@
1
- == now
2
- - use Yahoo placemaker for geocoding (as exclusive, or as priority for supported conversions)
3
-
4
- == very soon
5
-
6
- - google geocoding terms of service indicate that "a map must be shown" ... what to do?
7
- - driver: hamweather
8
- - driver: metar
9
- - improve code based on metrics
10
- - use Geomojo to convert coords to woe_id (when no yahoo key)
11
- - remove use of HTTParty, use Net:HTTP and Nokogiri instead
12
-
13
- == soon
14
-
15
- - refactor: data-zone
16
- - methods to use service_specific icons/images
17
-
18
- == future
19
-
20
- - Rdoc compatible documentation
21
- - add uv, moon, elevation info to current
22
- - driver: intellicast
23
- - weather.com simple_questions improve answers (use extra data)
24
- - make sure you can compare LocalTime to LocalDateTime in LocalTime class
25
-
26
- - be smart, never make duplicate queries
27
- - ie. if you are including wunderground, do it first and use the timezone info
28
-
29
- - conversion and weather fetching queries should have hooks to allow
30
- for configurable caching via memcache, then web service calls can
31
- be cached across multiple measurement instances.
32
-
33
- == bugs
34
-
35
- == refactoring
36
-
37
- - Parsing dates is slow (ie Time.parse)
38
- for data parsing with known date/time formats, parse the
39
- needed information explicitly
40
-
41
- example:
42
-
43
- _parse_date(text)
44
- text =~ /^(\d\d\d\d)-(\d\d)-(\d\d)/
45
- Time.new($3,$2,$1)
46
- end
47
-
48
-
49
- == other weather info
50
-
51
- === intellicast
52
- http://www.intellicast.com/IcastRSS/Signup.aspx
53
- http://www.intellicast.com/content/
54
- http://www.nws.noaa.gov/mdl/synop/nam.php
55
- http://www.hamweather.net/hw3/hw3php/democss/hw3.php?config=&forecast=zandh&icao=PADQ
56
- http://www.arl.noaa.gov/READYcmet.php
57
- http://www.windguru.cz/int/index.php
58
- http://www.nco.ncep.noaa.gov/pmb/products/gfs/
59
- http://www.weatherdeveloper.com/2008/01/31/grib2-migration/
60
- http://www.cpc.noaa.gov/products/wesley/wgrib2/
@@ -1,441 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # == Barometer
4
- # This is the command line interface to the barometer gem.
5
- #
6
- # == Examples
7
- # This command will measure the weather for the given query.
8
- # barometer berlin
9
- #
10
- # Other examples:
11
- # barometer --yahoo 90210
12
- # barometer --verbose 'new york'
13
- #
14
- # == Usage
15
- # barometer [options] query
16
- #
17
- # For help use: barometer -h
18
- #
19
- # Options:
20
- # -v, --version Display the version, then exit
21
- # -V, --verbose Verbose output
22
- # -t, --timeout seconds until service queries will timeout
23
- # -g, --geocode Force Geocoding of query
24
- # -z, --timezone Enhance Timezone
25
- # -m, --metric measure in metric
26
- # -i, --imperial measure in imperial
27
- # --wunderground add wunderground as a source
28
- # --yahoo add yahoo as a source
29
- # --bug add weather_bug as a source
30
- # --noaa add NOAA as a source
31
- # -p, --pop pop threshold used to determine wet?
32
- # -s, --wind wind speed threshold used to determine windy?
33
- # -a, --at time/date used to determine when to calculate summary
34
- #
35
- # == Author
36
- # Mark G
37
- # http://github.com/attack/barometer
38
- #
39
- # == Copyright
40
- # Copyright (c) 2009-2013 Mark G. Licensed under the MIT License:
41
- # http://www.opensource.org/licenses/mit-license.php
42
-
43
- require 'rubygems'
44
- require 'barometer'
45
- #require '/Users/mark/code/gems/barometer/lib/barometer'
46
-
47
- require 'optparse'
48
- require 'ostruct'
49
- require 'time'
50
- require 'date'
51
- require 'yaml'
52
-
53
- # file where API keys are stored
54
- KEY_FILE = File.expand_path(File.join('~', '.barometer'))
55
-
56
- class App
57
- attr_reader :options
58
-
59
- def initialize(arguments, stdin)
60
- @arguments = arguments.dup
61
-
62
- # Set defaults
63
- @options = OpenStruct.new
64
- @options.timeout = 15
65
- @options.geocode = false
66
- @options.timezone = false
67
- @options.metric = true
68
- @options.sources = []
69
- @options.verbose = false
70
- @options.at = nil
71
- @options.default = true
72
-
73
- # thresholds
74
- @options.windy_m = 10
75
- @options.windy_i = 7
76
- @options.pop = 50
77
- end
78
-
79
- # Parse options, check arguments, then process the command
80
- def run
81
- if parsed_options? && arguments_valid?
82
- puts "Start at #{DateTime.now}\n\n" if @options.verbose
83
- output_options if @options.verbose # [Optional]
84
-
85
- process_command
86
-
87
- puts "\nFinished at #{DateTime.now}" if @options.verbose
88
- else
89
- output_usage
90
- end
91
- end
92
-
93
- protected
94
-
95
- # future options
96
- #
97
- # time: -a --at
98
- #
99
- def parsed_options?
100
- # Specify options
101
- opt = OptionParser.new
102
- opt.on('-v', '--version') { output_version ; exit 0 }
103
- opt.on('-h', '--help') { output_help }
104
- opt.on('-V', '--verbose') { @options.verbose = true }
105
- opt.on('-a n', '--at n') {|n| @options.at = Time.parse(n.to_s) }
106
- opt.on('-t n', '--timeout n') {|n| @options.timeout = n }
107
- opt.on('-g', '--geocode') { @options.geocode = true }
108
- opt.on('-z', '--timezone') { @options.timezone = true }
109
- opt.on('-m', '--metric') { @options.metric = true }
110
- opt.on('-i', '--imperial') { @options.metric = false }
111
- opt.on('--wunderground') { @options.sources << :wunderground; @options.default = false }
112
- opt.on('--yahoo') { @options.sources << :yahoo; @options.default = false }
113
- opt.on('--bug') { @options.sources << :weather_bug; @options.default = false }
114
- opt.on('--noaa') { @options.sources << :noaa; @options.default = false }
115
- opt.on('-p n', '--pop n') {|n| @options.pop = n.to_i || 50 }
116
- opt.on('-s n', '--wind n') {|n| @options.metric ? @options.windy_m = n.to_f || 10 : @options.windy_i = n.to_f || 7 }
117
-
118
- opt.parse!(@arguments) rescue return false
119
-
120
- process_options
121
- true
122
- end
123
-
124
- def config_weather_bug
125
- if File.exists?(KEY_FILE)
126
- keys = YAML.load_file(KEY_FILE)
127
- if keys["weather_bug"] && keys["weather_bug"]["code"]
128
- code = keys["weather_bug"]["code"].to_s
129
- else
130
- bug_key_message
131
- exit
132
- end
133
- else
134
- File.open(KEY_FILE, 'w') {|f| f << "\nweather_bug:\n code: API_CODE" }
135
- bug_key_message
136
- exit
137
- end
138
- { :weather_bug => { :keys => { :code => code } } }
139
- end
140
-
141
- # Performs post-parse processing on options
142
- def process_options
143
- @options.sources << :wunderground if @options.default
144
- @options.sources = @options.sources.uniq
145
- Barometer.force_geocode = @options.geocode
146
- Barometer.enhance_timezone = @options.timezone
147
- if @options.sources.include?(:weather_bug)
148
- @options.sources.delete(:weather_bug)
149
- @options.sources << config_weather_bug
150
- end
151
- Barometer.config = { 1 => @options.sources }
152
- Barometer.timeout = @options.timeout
153
- end
154
-
155
- def output_options
156
- puts "Options:\n"
157
-
158
- @options.marshal_dump.each do |name, val|
159
- puts " #{name} = #{val}"
160
- end
161
- puts
162
- end
163
-
164
- # True if required arguments were provided
165
- def arguments_valid?
166
- true if (@arguments.length >= 1 || @options.web)
167
- end
168
-
169
- def output_help
170
- output_version
171
- end
172
-
173
- def output_usage
174
- puts "Usage: "
175
- puts "barometer [options] query"
176
- puts
177
- puts "For help use: barometer -h"
178
- puts
179
- puts "options:"
180
- puts " -v, --version Display the version, then exit"
181
- puts " -V, --verbose Verbose output"
182
- puts " -t, --timeout seconds until service queries will timeout"
183
- puts " -g, --geocode Force Geocoding of query"
184
- puts " -z, --timezone Force timezone query"
185
- puts " -m, --metric measure in metric"
186
- puts " -i, --imperial measure in imperial"
187
- puts " --wunderground add wunderground as a source"
188
- puts " --yahoo add yahoo as a source"
189
- puts " --bug add weather_bug as a source"
190
- puts " --noaa add NOAA as a source"
191
- puts " -p, --pop pop threshold used to determine wet?"
192
- puts " -s, --wind wind speed threshold used to determine windy?"
193
- puts " -a, --at time/date used to determine when to calculate summary"
194
- end
195
-
196
- def output_version
197
- puts "#{File.basename(__FILE__)} version #{Barometer::VERSION}"
198
- end
199
-
200
- def process_command
201
- barometer = Barometer.new(@arguments.join(" "))
202
- begin
203
- if @options.verbose
204
- Barometer::debug!
205
- div(char="*")
206
- puts "DEBUG LOG"
207
- blank
208
- end
209
- barometer.measure(@options.metric) if barometer
210
- blank if @options.verbose
211
- pretty_output(barometer) if barometer.weather
212
- rescue Barometer::OutOfSources
213
- puts
214
- puts " SORRY: your query did not provide any results"
215
- puts
216
- end
217
- end
218
- end
219
-
220
- #
221
- # HELPERS
222
- #
223
-
224
- @level = 1
225
-
226
- def y(value)
227
- value ? "yes" : "no"
228
- end
229
-
230
- def div(char="#")
231
- puts char*50
232
- end
233
-
234
- def title(title, level=1)
235
- @level = level
236
- puts "#{" " * @level}-- #{title} --"
237
- end
238
-
239
- def value(title, value)
240
- puts "#{" " * @level}#{title}: #{value}" unless value.nil?
241
- end
242
-
243
- def blank
244
- puts
245
- end
246
-
247
- def section(title, level=1, show_blank=true)
248
- @level = level
249
- title(title, level); yield; blank if show_blank
250
- end
251
-
252
- def pretty_hash(hash)
253
- return unless hash.is_a?(Hash)
254
- hash.each { |k,v| value(k,v) }
255
- end
256
-
257
- def pretty_summary(s)
258
- return unless s
259
- section("AVERAGES") do
260
- pretty_hash({
261
- "humidity" => s.humidity.to_i, "temperature" => s.temperature,
262
- "wind" => s.wind, "pressure" => s.pressure,
263
- "dew_point" => s.dew_point, "heat_index" => s.heat_index,
264
- "wind_chill" => s.wind_chill, "visibility" => s.visibility })
265
- end
266
- section("SUMMARY#{ " (@ #{@options.at})" if @options.at }") do
267
- pretty_hash({
268
- "day?" => s.day?(@options.at), "sunny?" => s.sunny?(@options.at),
269
- "windy?" => s.windy?(@options.at, @options.metric ? @options.windy_m : @options.windy_i),
270
- "wet?" => s.wet?(@options.at, @options.pop) })
271
- end
272
- end
273
-
274
- def pretty_query(q)
275
- return unless q
276
- section("ORIGINAL QUERY", 1) do
277
- pretty_hash({
278
- "Query" => q.q, "Format" => q.format,
279
- "Country Code" => q.country_code })
280
- end
281
- if q.geo
282
- section("GEO", 2) do
283
- pretty_hash({
284
- "Address" => q.geo.address, "Query" => q.geo.query,
285
- "Locality" => q.geo.locality, "Region" => q.geo.region,
286
- "Country" => q.geo.country, "Country Code" => q.geo.country_code,
287
- "Latitude" => q.geo.latitude, "Longitude" => q.geo.longitude })
288
- end
289
- end
290
- end
291
-
292
- def pretty_location(l)
293
- return unless l
294
- section("LOCATION", 2) do
295
- pretty_hash({
296
- "ID" => l.id, "Name" => l.name,
297
- "City" => l.city, "State Name" => l.state_name,
298
- "State Code" => l.state_code, "Country" => l.country,
299
- "Country Code" => l.country_code, "Zip Code" => l.zip_code,
300
- "Latitude" => l.latitude, "Longitude" => l.longitude })
301
- end
302
- end
303
-
304
- def pretty_station(s)
305
- return unless s
306
- section("STATION", 2) do
307
- pretty_hash({
308
- "ID" => s.id, "Name" => s.name,
309
- "City" => s.city, "State Name" => s.state_name,
310
- "State Code" => s.state_code, "Country" => s.country,
311
- "Country Code" => s.country_code, "Zip Code" => s.zip_code,
312
- "Latitude" => s.latitude, "Longitude" => s.longitude })
313
- end
314
- end
315
-
316
- def pretty_timezone(t)
317
- return unless t
318
- section("TIMEZONE", 2) do
319
- pretty_hash({ "Long" => t.full, "Code" => t.code, "DST?" => t.dst?,
320
- "Now" => t.now(true), "Today" => t.today })
321
- end
322
- end
323
-
324
- def pretty_current(c)
325
- return unless c
326
- section("CURRENT", 2) do
327
- pretty_hash({
328
- "Measured at" => c.current_at, "Updated at" => c.updated_at.to_s(true),
329
- "Humidity" => c.humidity, "Icon" => c.icon,
330
- "Condition" => c.condition, "Temperature" => c.temperature,
331
- "Dew Point" => c.dew_point, "Heat Index" => c.heat_index,
332
- "Pressure" => c.pressure, "Visibility" => c.visibility,
333
- "Wind Chill" => c.wind_chill })
334
- pretty_hash({ "Wind" => c.wind, "Wind Direction" => c.wind.direction,
335
- "Wind Degrees" => c.wind.degrees }) if c.wind
336
- pretty_hash({ "Sun Rise" => c.sun.rise, "Sun Set" => c.sun.set }) if c.sun
337
- end
338
- end
339
-
340
- def pretty_forecast(f)
341
- return unless f
342
- section("FOR: #{f.date}", 3) do
343
- pretty_hash({
344
- "Valid From" => f.valid_start_date.to_s(true),
345
- "Valid Until" => f.valid_end_date.to_s(true),
346
- "Icon" => f.icon, "Description" => f.description,
347
- "Condition" => f.condition, "High" => f.high,
348
- "Low" => f.low, "POP" => f.pop, "Humidity" => f.humidity })
349
- pretty_hash({ "Wind" => f.wind, "Wind Direction" => f.wind.direction,
350
- "Wind Degrees" => f.wind.degrees }) if f.wind
351
- pretty_hash({ "Sun Rise" => f.sun.rise, "Sun Set" => f.sun.set }) if f.sun
352
- end
353
- end
354
-
355
- def pretty_forecasts(forecasts)
356
- return unless forecasts
357
- section("FORECAST(s)", 3, false) do
358
- blank
359
- forecasts.each do |forecast|
360
- pretty_forecast(forecast)
361
- end
362
- end
363
- end
364
-
365
- def pretty_measurement(m)
366
- return unless m
367
- section(m.source.to_s, 1) do
368
- pretty_hash({
369
- "Measured At" => m.measured_at,
370
- "Source" => m.source, "Time Stamp" => m.utc_time_stamp,
371
- "Metric" => m.metric?, "Success" => m.success?,
372
- "Service Time" => "#{(m.end_at - m.start_at)} s" })
373
- end
374
- section("MODIFIED QUERY", 2) do
375
- pretty_hash({ "Query" => m.query, "Format" => m.format })
376
- end
377
- pretty_location(m.location)
378
- pretty_station(m.station)
379
- pretty_timezone(m.timezone)
380
- pretty_current(m.current)
381
- pretty_forecasts(m.forecast)
382
- end
383
-
384
- def pretty_measurements(w)
385
- return unless w
386
- section("MEASUREMENTS", 1) do
387
- blank
388
- w.measurements.each do |m|
389
- pretty_measurement(m)
390
- end
391
- end
392
- end
393
-
394
- def pretty_info(w)
395
- title("INFO", 1)
396
- value("GitHub", "http://github.com/attack/barometer")
397
- value("Barometer Version", Barometer::VERSION)
398
- value("Total Time", "#{(w.end_at - w.start_at)} s")
399
- end
400
-
401
- def pretty_output(barometer)
402
- weather = barometer.weather
403
- if weather
404
- div
405
- puts "#"
406
- puts "# #{weather.default.location.name || barometer.query.q}"
407
- puts "#"
408
- div
409
- blank
410
- pretty_summary(weather)
411
- pretty_query(barometer.query)
412
- pretty_measurements(weather)
413
- pretty_info(weather)
414
- div("-")
415
- end
416
- end
417
-
418
- def bug_key_message
419
- puts
420
- puts "MISSING KEYS !!!"
421
- puts "Please update the key_file '#{KEY_FILE}' with your weather_bug api key"
422
- puts "Get it here: ???"
423
- puts "Then, add these lines to the file:"
424
- puts "weather_bug:"
425
- puts " code: API_CODE"
426
- puts
427
- end
428
-
429
- # set API keys
430
- if File.exists?(KEY_FILE)
431
- keys = YAML.load_file(KEY_FILE)
432
- if keys["yahoo"] && keys["yahoo"]["app_id"]
433
- Barometer.yahoo_placemaker_app_id = keys["yahoo"]["app_id"]
434
- end
435
- else
436
- File.open(KEY_FILE, 'w') {|f| f << "yahoo:\n app_id: YOUR_KEY_KERE" }
437
- end
438
-
439
- # Create and run the application
440
- app = App.new(ARGV, STDIN)
441
- app.run