barometer 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
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/.gitignore CHANGED
@@ -11,3 +11,5 @@ coverage
11
11
  .rspec
12
12
  .bundle
13
13
  Gemfile.lock
14
+ .ruby-version
15
+ .rbx
@@ -0,0 +1,7 @@
1
+ sources: lib/**/*.rb
2
+
3
+ lints:
4
+ InstanceVariables:
5
+ limit: 3
6
+ LineRestriction:
7
+ limit: 80
@@ -1,7 +1,10 @@
1
+ language: ruby
1
2
  rvm:
3
+ - 2.0.0
2
4
  - 1.9.3
3
5
  - 1.9.2
4
- - 1.8.7
5
6
  - rbx-19mode
6
- - ree
7
- script: "rake"
7
+ script: 'rake'
8
+ branches:
9
+ only:
10
+ - master
data/Gemfile CHANGED
@@ -1,3 +1,13 @@
1
- source :rubygems
1
+ source 'http://rubygems.org'
2
+
3
+ group :assets do
4
+ platforms :rbx do
5
+ gem 'pelusa'
6
+ end
7
+ end
8
+
9
+ group :test do
10
+ gem 'coveralls', require: false
11
+ end
2
12
 
3
13
  gemspec
data/README.md CHANGED
@@ -1,6 +1,9 @@
1
- # barometer
1
+ # Barometer
2
2
 
3
3
  [![Build Status](https://travis-ci.org/attack/barometer.png?branch=master)](https://travis-ci.org/attack/barometer)
4
+ [![Gem Version](https://badge.fury.io/rb/barometer.png)](http://badge.fury.io/rb/barometer)
5
+ [![Code Climate](https://codeclimate.com/github/attack/barometer.png)](https://codeclimate.com/github/attack/barometer)
6
+ [![Coverage Status](https://coveralls.io/repos/attack/barometer/badge.png?branch=master)](https://coveralls.io/r/attack/barometer)
4
7
 
5
8
  A multi API consuming weather forecasting superstar.
6
9
 
@@ -12,72 +15,49 @@ unavailable.
12
15
 
13
16
  Barometer handles all conversions of the supplied query, so that the
14
17
  same query can be used for all (or most) services, even if they don't
15
- support the query directly. See the "Query" section for more information on
16
- this.
18
+ support the query directly. See the "[Queries](#queries)" section for more info.
17
19
 
18
- ## version
20
+ ## Key Features
19
21
 
20
- Version 0.7.4 is the current release of this gem. The gem is available from
21
- rubygems (barometer: http://rubygems.org/gems/barometer).
22
- It is fully functional (for five weather service APIs).
22
+ * works with ruby 1.9.x, 2.0, Rubinius (see
23
+ [Travis CI status](https://travis-ci.org/attack/barometer) to confirm)
24
+ * supports 5 weather services, more planned
25
+ * the same query can be used with any supported weather service
26
+ * provides a powerful data object to hold the weather information
27
+ * provides a simple plugin api to allow more weather services to be added
28
+ * failover configuration
29
+ * multiple services configuration to provide average values
23
30
 
24
- ## status
31
+ ## Usage
25
32
 
26
- Currently this project has completed initial development and will work for a
27
- few weather services (wunderground, yahoo, weather_bug).
28
- Barometer is developed using only Ruby 1.9.3, but will probably on both Ruby 1.8.7, 1.9.1 & 1.9.2.
29
-
30
- Features to be added in the future:
31
- * better command line output
32
- * even more weather service drivers (hamweather)
33
- * icon support
34
-
35
- # dependencies
36
-
37
- ## Google API key
38
-
39
- As stated on the Google Geocoding API website
40
- (http://code.google.com/apis/maps/documentation/geocoding/), Google no longer
41
- requires an API key. Therefore Barometer no longer requires a Google API key.
42
-
43
- ### other keys
44
-
45
- The '~/.barometer' file can hold all your weather service API keys.
46
-
47
- eg. weatherbug.com
48
-
49
- weather_bug:
50
- code: YOUR_API_CODE
51
-
52
- eg. Yahoo! Placemaker
33
+ You can use barometer right out of the box, as it is configured to use one
34
+ register-less (no API key required) international weather service
35
+ (wunderground.com).
53
36
 
54
- yahoo:
55
- app_id: YOUR_APP_ID
37
+ ```ruby
38
+ require 'barometer'
56
39
 
57
- ## HTTParty
40
+ barometer = Barometer.new('Paris')
41
+ weather = barometer.measure
58
42
 
59
- Why? HTTParty was created and designed specifically for consuming web services.
60
- I choose to use this over using the Net::HTTP library directly to allow for
61
- faster development of this project.
43
+ puts weather.current.temperature
44
+ ```
62
45
 
63
- It is possible that I will use Net::HTTP in the future.
46
+ *See [detailed usage](#detailed-usage) further down.*
64
47
 
65
- ## tzinfo
48
+ ## Dependencies
66
49
 
67
- Why? Barometer deals with time information for locations all over the world.
68
- This information doesn't mean that much if it can't be converted to times
69
- that don't correspond to the applicable timezone.
70
- Tzinfo handles this time zone manipulation.
50
+ [![Dependency Status](https://gemnasium.com/attack/barometer.png)](https://gemnasium.com/attack/barometer)
71
51
 
72
- # queries
52
+ ## Queries
73
53
 
74
54
  The query handling is one of the most beneficial and powerful features of
75
55
  Barometer. Every weather service accepts a different set of possible
76
56
  queries, so it usually is the case that the same query can only be used
77
57
  for a couple weather services.
78
58
 
79
- Barometer will allow the use of all query formats for all services
80
- (mostly). It does this by first determining the original query format,
59
+ Barometer will allow the use of all query formats for all services.
60
+ It does this by first determining the original query format,
81
61
  then converting the query to a compatible format for each specific
82
62
  weather service.
83
63
 
@@ -85,7 +65,7 @@ For example, Yahoo! only accepts US Zip Code or Weather.com ID. With Barometer
85
65
  you can query Yahoo! with a simple location (ie: Paris) or even an Airport
86
66
  code (ICAO) and it will return the weather as expected.
87
67
 
88
- ## acceptable formats
68
+ ### Acceptable Formats
89
69
 
90
70
  * zipcode
91
71
  * icao (international airport code)
@@ -94,45 +74,21 @@ code (ICAO) and it will return the weather as expected.
94
74
  * weather.com ID
95
75
  * location name (ie address, city, state, landmark, etc.)
96
76
  * woeid (where on earth id, by Yahoo!)
77
+ * IPv4 address
97
78
 
98
- *if the query is of the formats zipcode or postal code it may not
99
- support conversion to other formats.*
79
+ ## Detailed Usage
100
80
 
101
- ## conversion caching
81
+ ### Sources
102
82
 
103
- Barometer has internal conversion caching. No conversion will be
104
- repeated during a measurement, thus limiting the number of web queries
105
- needed.
83
+ The current available sources are:
106
84
 
107
- Example: If you configure Barometer to use both Yahoo and Weather.com,
108
- then use a query like "denver", this will require a conversion from
109
- "denver" to its weather.com weather_id. This conversion is needed for
110
- both web services but will only happen once and be cached.
85
+ * Wunderground.com (:wunderground) [default]
86
+ * Yahoo! Weather (:yahoo)
87
+ * WeatherBug.com (:weather_bug) [requires key]
88
+ * NOAA (:noaa)
89
+ * Forecast.io (:forecast_io) [requires key]
111
90
 
112
- # usage
113
-
114
- You can use barometer right out of the box, as it is configured to use one
115
- register-less (no API key required) international weather service
116
- (wunderground.com).
117
-
118
- ```ruby
119
- require 'barometer'
120
-
121
- barometer = Barometer.new("Paris")
122
- weather = barometer.measure
123
-
124
- puts weather.current.temperature
125
- ```
126
-
127
- ## sources
128
-
129
- The available sources are:
130
-
131
- Wunderground.com (:wunderground) [default]
132
- Yahoo! Weather (:yahoo)
133
- WeatherBug.com (:weather_bug) [requires key]
134
-
135
- ## source configuration
91
+ ### Source Configuration
136
92
 
137
93
  Barometer can be configured to use multiple weather service APIs (either in
138
94
  a primary/failover config or in parallel). Each weather service can also
@@ -141,225 +97,111 @@ have its own config.
141
97
  Weather services in parallel
142
98
 
143
99
  ```ruby
144
- Barometer.config = { 1 => [:yahoo, :wunderground] }
100
+ Barometer.config = { 1 => [:yahoo, :wunderground] }
145
101
  ```
146
102
 
147
103
  Weather services in primary/failover
148
104
 
149
105
  ```ruby
150
- Barometer.config = { 1 => [:yahoo], 2 => :wunderground }
106
+ Barometer.config = { 1 => [:yahoo], 2 => :wunderground }
151
107
  ```
152
108
 
153
109
  Weather services, one with some configuration. In this case we are setting
154
110
  a weight value, this weight is respected when calculating averages.
155
111
 
156
112
  ```ruby
157
- Barometer.config = { 1 => [{:wunderground => {:weight => 2}}, :yahoo] }
113
+ Barometer.config = { 1 => [{wunderground: {weight: 2}}, :yahoo] }
158
114
  ```
159
115
 
160
116
  Weather services, one with keys.
161
117
 
162
118
  ```ruby
163
- Barometer.config = { 1 => [:yahoo, {:weather_bug => {:keys => {:code => CODE_KEY} }}] }
119
+ Barometer.config = { 1 => [:yahoo, {weather_bug: {keys: {code: CODE_KEY} }}] }
164
120
  ```
165
121
 
166
- ### multiple weather API, with hierarchy
122
+ #### Multiple weather API, with hierarchy
167
123
 
168
124
  ```ruby
169
- require 'barometer'
125
+ require 'barometer'
170
126
 
171
- # use yahoo and weather.com, if they both fail, use wunderground
172
- Barometer.config = { 1 => [:yahoo, {:weather_bug => {:keys => {:code => CODE_KEY} }}], 2 => :wunderground }
127
+ # use yahoo and weather bug, if they both fail, use wunderground
128
+ Barometer.config = { 1 => [:yahoo, {weather_bug: {keys: {code: CODE_KEY} }}], 2 => :wunderground }
173
129
 
174
- barometer = Barometer.new("Paris")
175
- weather = barometer.measure
130
+ barometer = Barometer.new('Paris')
131
+ weather = barometer.measure
176
132
 
177
- puts weather.current.temperture
133
+ puts weather.current.temperture
178
134
  ```
179
135
 
180
- ## command line
181
-
182
- You can use barometer from the command line.
136
+ ### Command Line
183
137
 
184
- # barometer berlin
138
+ Extracted to separate gem: [barometer-cli](http://github.com/attack/barometer-cli)
185
139
 
186
- This will output the weather information for the given query.
187
- See the help for more command line information.
188
-
189
- # barometer -h
190
-
191
- ### fail
192
-
193
- What would cause a weather service to fail? The most obvious is that the
194
- particular weather service in currently unavailable or not reachable.
195
- Other possible reasons would include not having the API (or a valid API
196
- key for the particular weather service, if required), not providing a
197
- valid query, or providing a query for a location not supported by the
198
- weather service.
199
-
200
- For example, if you look at the example above, the query of "Paris" refers
201
- to a city in France. Yahoo weather services only supports
202
- weather results for USA (at least at the time of writing). Therefore,
203
- Barometer would not use Yahoo, just WeatherBug and failover to use Wunderground
204
- (if needed).
205
-
206
- ## searching
140
+ ### Searching
207
141
 
208
142
  After you have measured the data, Barometer provides several methods to help
209
143
  you get the data you are after. All examples assume you already have measured
210
144
  the data as shown in the above examples.
211
145
 
212
- ### by preference (default service)
213
-
214
- ```ruby
215
- weather.default # returns measurement for default source
216
- weather.current # returns current_measurement for default
217
- weather.now # returns current_measurement for default
218
- weather.forecast # returns all forecast_measurements for default
219
- weather.today # returns forecast_measurement for default today
220
- weather.tomorrow # returns forecast_measurement for default tomorrow
221
-
222
- puts weather.now.temperature.c
223
- puts weather.tomorrow.high.c
224
- ```
225
-
226
- ### by source
146
+ #### By relativity
227
147
 
228
148
  ```ruby
229
- weather.source(:wunderground) # returns measurement for specified source
230
- weather.sources # lists all successful sources
149
+ weather.current # returns the first successful current_measurement
150
+ weather.forecast # returns the first successful forecast_measurements
151
+ weather.today # returns the first successful forecast_measurement for today
152
+ weather.tomorrow # returns the first successful forecast_measurement for tomorrow
231
153
 
232
- puts weather.source(:wunderground).current.temperature.c
154
+ puts weather.current.temperature.c
155
+ puts weather.tomorrow.high.c
233
156
  ```
234
157
 
235
- ### by date
158
+ #### By date
236
159
 
237
160
  ```ruby
238
- # note, the date is the date of the locations weather, not the date of the
239
- # user measuring the weather
240
- date = Date.parse("01-01-2009")
241
- weather.for(date) # returns forecast_measurement for default on date
242
- weather.source(:wunderground).for(date) # same as above but specific source
161
+ # note, the date is the date of the locations weather, not the date of the
162
+ # user measuring the weather
163
+ date = Date.parse('01-01-2009')
164
+ weather.for(date) # returns the first successful forecast_measurement for the date
243
165
 
244
- puts weather.source(:wunderground).for(date).high.c
166
+ puts weather.for(date).high.c
245
167
  ```
246
168
 
247
- ### by time
169
+ #### By time
248
170
 
249
171
  ```ruby
250
- # note, the time is the time of the locations weather, not the time of the
251
- # user measuring the weather
252
- time = Time.parse("13:00 01-01-2009")
253
- weather.for(time) # returns forecast_measurement for default at time
254
- weather.source(:wunderground).for(time) # same as above but specific source
172
+ # note, the time is the time of the locations weather, not the time of the
173
+ # user measuring the weather
174
+ time = Time.parse('13:00 01-01-2009')
175
+ weather.for(time) # returns the first successful forecast_measurement for the time
255
176
 
256
- puts weather.source(:wunderground).for(time).low.f
177
+ puts weather.for(time).low.f
257
178
  ```
258
179
 
259
- ## averages
180
+ ### Averages
260
181
 
261
- If you consume more then one weather service, Barometer can provide averages
182
+ If you consume more then one weather service, Barometer will provide averages
262
183
  for the values (currently only for the 'current' values and not the forecasted
263
184
  values).
264
185
 
265
186
  ```ruby
266
- require 'barometer'
187
+ require 'barometer'
267
188
 
268
- Barometer.google_geocode_key = "THE_GOOGLE_API_KEY"
269
- # use yahoo and wunderground
270
- Barometer.config = { 1 => [:yahoo, :wunderground] }
189
+ # use yahoo and wunderground
190
+ Barometer.config = { 1 => [:yahoo, :wunderground] }
271
191
 
272
- barometer = Barometer.new("90210")
273
- weather = barometer.measure
192
+ barometer = Barometer.new('90210')
193
+ weather = barometer.measure
274
194
 
275
- puts weather.temperture
195
+ puts weather.temperture
276
196
  ```
277
197
 
278
198
  This will calculate the average temperature as given by :yahoo and :wunderground
279
199
 
280
- ### weights
200
+ #### Weights
281
201
 
282
202
  You can weight the values from a weather service so that the values from that
283
203
  web service have more influence then other values. The weights are set in the
284
- config ... see the config section
285
-
286
- ## simple answers
287
-
288
- After you have measured the data, Barometer provides several "simple answer"
289
- methods to help you get answers to some basic questions. All examples assume
290
- you already have measured the data as shown in the above examples.
291
-
292
- All of these questions are ultimately specific to the weather source(s) you
293
- are configured to use. All sources that have successfully measured data
294
- will be asked, but if there is no data that can answer the question then
295
- there will be no answer.
296
-
297
- ### is it windy?
298
-
299
- # 1st parameter is the threshold wind speed for being windy
300
- # 2nd parameter is the utc_time for which you want to know the answer,
301
- # this defaults to the current time
302
- # NOTE: in my example the values are metric, so the threshold is 10 kph
303
-
304
- weather.windy?(10)
305
-
306
- ### is it wet?
307
-
308
- # 1st parameter is the threshold pop (%) for being wet
309
- # 2nd parameter is the utc_time for which you want to know the answer,
310
- # this defaults to the current time
311
- # NOTE: in my example the threshold is 50 %
312
-
313
- weather.wet?(50)
314
-
315
- ### is it sunny?
316
-
317
- # 1st parameter is the utc_time for which you want to know the answer,
318
- # this defaults to the current time
319
-
320
- weather.sunny?
321
-
322
- ### is it day?
323
-
324
- # 1st parameter is the utc_time for which you want to know the answer,
325
- # this defaults to the current time
326
-
327
- weather.day?
328
-
329
- ### is it night?
330
-
331
- # 1st parameter is the utc_time for which you want to know the answer,
332
- # this defaults to the current time
333
-
334
- weather.night?
335
-
336
- # design
337
-
338
- * create a Barometer instance
339
- * supply a query, there are very little restrictions on the format:
340
- * city, country, specific address (basically anything Google will geocode)
341
- * US zip code (skips conversion if weather service accepts this directly)
342
- * postal code (skips conversion if weather service accepts this directly)
343
- * latitude and longitude (skips conversion if weather service accepts this
344
- directly)
345
- * weather.com weather id (even if the service you are using doesn't use it)
346
- * international airport code (skips conversion if weather service
347
- accepts this directly)
348
- * determine which weather services will be queried (one or multiple)
349
- * if query conversion required for specific weather service, convert the query
350
- * query the weather services
351
- * save the data
352
- * repeat weather service queries as needed
353
-
354
- # extending
355
-
356
- Barometer attempts to be a common API to any weather service API. I have included
357
- several weather service 'drivers', but I know there are many more available.
358
- Please use the provided ones as examples to create more.
359
-
360
- # development
361
-
362
- Barometer now uses 'bundler'. You just need to 'git clone' the repo and 'bundle install'.
204
+ config ... see the [config section](#source-configuration)
363
205
 
364
206
  ## Contributions
365
207
 
@@ -369,12 +211,15 @@ Thank you to these developers who have contributed. No contribution is too small
369
211
  * floere (https://github.com/floere)
370
212
  * plukevdh (https://github.com/plukevdh)
371
213
  * gkop (https://github.com/gkop)
214
+ * avit (https://github.com/avit)
372
215
 
373
- # Links
216
+ ## Links
374
217
 
375
218
  * repo: http://github.com/attack/barometer
376
219
  * rdoc: http://rdoc.info/projects/attack/barometer
220
+ * travis ci: https://travis-ci.org/attack/barometer
221
+ * code climate: https://codeclimate.com/github/attack/barometer
377
222
 
378
- ## copyright
223
+ ## Copyright
379
224
 
380
225
  Copyright (c) 2009-2013 Mark G. See LICENSE for details.