barometer 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. data/.gitignore +2 -0
  2. data/.pelusa.yml +7 -0
  3. data/.travis.yml +6 -3
  4. data/Gemfile +11 -1
  5. data/README.md +89 -244
  6. data/Rakefile +1 -1
  7. data/barometer.gemspec +22 -24
  8. data/lib/barometer.rb +14 -65
  9. data/lib/barometer/base.rb +35 -65
  10. data/lib/barometer/data.rb +15 -20
  11. data/lib/barometer/data/attribute.rb +19 -0
  12. data/lib/barometer/data/attributes/distance.rb +11 -0
  13. data/lib/barometer/data/attributes/float.rb +11 -0
  14. data/lib/barometer/data/attributes/integer.rb +11 -0
  15. data/lib/barometer/data/attributes/location.rb +11 -0
  16. data/lib/barometer/data/attributes/pressure.rb +11 -0
  17. data/lib/barometer/data/attributes/sun.rb +15 -0
  18. data/lib/barometer/data/attributes/temperature.rb +11 -0
  19. data/lib/barometer/data/attributes/time.rb +11 -0
  20. data/lib/barometer/data/attributes/vector.rb +11 -0
  21. data/lib/barometer/data/attributes/zone.rb +11 -0
  22. data/lib/barometer/data/convertable_units.rb +145 -0
  23. data/lib/barometer/data/coordinates.rb +16 -0
  24. data/lib/barometer/data/distance.rb +14 -133
  25. data/lib/barometer/data/geo.rb +22 -59
  26. data/lib/barometer/data/location.rb +14 -20
  27. data/lib/barometer/data/pressure.rb +14 -135
  28. data/lib/barometer/data/sun.rb +24 -24
  29. data/lib/barometer/data/temperature.rb +14 -169
  30. data/lib/barometer/data/vector.rb +44 -0
  31. data/lib/barometer/data/zone.rb +109 -112
  32. data/lib/barometer/query.rb +23 -161
  33. data/lib/barometer/query/base.rb +88 -0
  34. data/lib/barometer/query/converter.rb +64 -0
  35. data/lib/barometer/query/converters/from_coordinates_to_noaa_station_id.rb +30 -0
  36. data/lib/barometer/query/converters/from_geocode_to_coordinates.rb +28 -0
  37. data/lib/barometer/query/converters/from_short_zipcode_to_zipcode.rb +28 -0
  38. data/lib/barometer/query/converters/from_weather_id_to_geocode.rb +30 -0
  39. data/lib/barometer/query/converters/from_woe_id_or_ipv4_to_geocode.rb +32 -0
  40. data/lib/barometer/query/converters/to_geocode.rb +30 -0
  41. data/lib/barometer/query/converters/to_weather_id.rb +30 -0
  42. data/lib/barometer/query/converters/to_woe_id.rb +30 -0
  43. data/lib/barometer/query/format.rb +59 -0
  44. data/lib/barometer/query/formats/base.rb +22 -0
  45. data/lib/barometer/query/formats/coordinates.rb +14 -0
  46. data/lib/barometer/query/formats/geocode.rb +15 -0
  47. data/lib/barometer/query/formats/icao.rb +35 -0
  48. data/lib/barometer/query/formats/ipv4_address.rb +19 -0
  49. data/lib/barometer/query/formats/noaa_station_id.rb +15 -0
  50. data/lib/barometer/query/formats/postalcode.rb +20 -0
  51. data/lib/barometer/query/formats/short_zipcode.rb +15 -0
  52. data/lib/barometer/{translations → query/formats/translations}/icao_country_codes.yml +0 -0
  53. data/lib/barometer/{translations → query/formats/translations}/weather_country_codes.yml +0 -0
  54. data/lib/barometer/query/formats/unknown.rb +14 -0
  55. data/lib/barometer/query/formats/weather_id.rb +33 -0
  56. data/lib/barometer/query/formats/woe_id.rb +28 -0
  57. data/lib/barometer/query/formats/zipcode.rb +15 -0
  58. data/lib/barometer/query/service.rb +13 -0
  59. data/lib/barometer/query/services/apis/geonames_timezone.rb +26 -0
  60. data/lib/barometer/query/services/apis/google_geocode.rb +35 -0
  61. data/lib/barometer/query/services/apis/noaa_station.rb +31 -0
  62. data/lib/barometer/query/services/apis/weather_id.rb +35 -0
  63. data/lib/barometer/query/services/apis/wunderground_timezone.rb +26 -0
  64. data/lib/barometer/query/services/apis/yahoo_placefinder.rb +35 -0
  65. data/lib/barometer/query/services/apis/yahoo_weather.rb +31 -0
  66. data/lib/barometer/query/services/from_weather_id.rb +64 -0
  67. data/lib/barometer/query/services/geonames_timezone.rb +18 -0
  68. data/lib/barometer/query/services/google_geocode.rb +106 -0
  69. data/lib/barometer/query/services/noaa_station_id.rb +28 -0
  70. data/lib/barometer/query/services/to_weather_id.rb +25 -0
  71. data/lib/barometer/query/services/to_woe_id.rb +29 -0
  72. data/lib/barometer/query/services/wunderground_timezone.rb +18 -0
  73. data/lib/barometer/query/services/yahoo_geocode.rb +69 -0
  74. data/lib/barometer/response.rb +12 -0
  75. data/lib/barometer/response/base.rb +57 -0
  76. data/lib/barometer/response/current.rb +27 -0
  77. data/lib/barometer/response/prediction.rb +41 -0
  78. data/lib/barometer/response/prediction_collection.rb +48 -0
  79. data/lib/barometer/utils.rb +17 -0
  80. data/lib/barometer/utils/address.rb +33 -0
  81. data/lib/barometer/utils/api.rb +30 -0
  82. data/lib/barometer/utils/config_reader.rb +40 -0
  83. data/lib/barometer/utils/get.rb +17 -0
  84. data/lib/barometer/utils/json_reader.rb +22 -0
  85. data/lib/barometer/utils/payload.rb +100 -0
  86. data/lib/barometer/utils/payload_request.rb +37 -0
  87. data/lib/barometer/utils/post.rb +24 -0
  88. data/lib/barometer/utils/time.rb +78 -0
  89. data/lib/barometer/{translations → utils/translations}/zone_codes.yml +0 -0
  90. data/lib/barometer/utils/versioned_registration.rb +70 -0
  91. data/lib/barometer/utils/xml_reader.rb +27 -0
  92. data/lib/barometer/utils/zone_code_lookup.rb +30 -0
  93. data/lib/barometer/version.rb +1 -1
  94. data/lib/barometer/weather.rb +44 -173
  95. data/lib/barometer/weather_service.rb +41 -0
  96. data/lib/barometer/weather_services/base.rb +50 -0
  97. data/lib/barometer/weather_services/forecast_io.rb +36 -0
  98. data/lib/barometer/weather_services/forecast_io/api.rb +22 -0
  99. data/lib/barometer/weather_services/forecast_io/query.rb +38 -0
  100. data/lib/barometer/weather_services/forecast_io/response.rb +31 -0
  101. data/lib/barometer/weather_services/forecast_io/response/current_weather.rb +78 -0
  102. data/lib/barometer/weather_services/forecast_io/response/forecasted_weather.rb +74 -0
  103. data/lib/barometer/weather_services/forecast_io/response/location.rb +19 -0
  104. data/lib/barometer/weather_services/forecast_io/response/timezone.rb +25 -0
  105. data/lib/barometer/weather_services/noaa.rb +21 -305
  106. data/lib/barometer/weather_services/noaa/current_api.rb +25 -0
  107. data/lib/barometer/weather_services/noaa/current_query.rb +30 -0
  108. data/lib/barometer/weather_services/noaa/current_response.rb +29 -0
  109. data/lib/barometer/weather_services/noaa/forecast_api.rb +25 -0
  110. data/lib/barometer/weather_services/noaa/forecast_query.rb +39 -0
  111. data/lib/barometer/weather_services/noaa/forecast_response.rb +28 -0
  112. data/lib/barometer/weather_services/noaa/response/current_location.rb +42 -0
  113. data/lib/barometer/weather_services/noaa/response/current_station.rb +46 -0
  114. data/lib/barometer/weather_services/noaa/response/current_weather.rb +82 -0
  115. data/lib/barometer/weather_services/noaa/response/forecasted_weather.rb +90 -0
  116. data/lib/barometer/weather_services/noaa/response/location.rb +19 -0
  117. data/lib/barometer/weather_services/noaa/response/timezone.rb +15 -0
  118. data/lib/barometer/weather_services/response.rb +9 -0
  119. data/lib/barometer/weather_services/response/location.rb +42 -0
  120. data/lib/barometer/weather_services/response/time_zone.rb +19 -0
  121. data/lib/barometer/weather_services/weather_bug.rb +24 -280
  122. data/lib/barometer/weather_services/weather_bug/current_api.rb +26 -0
  123. data/lib/barometer/weather_services/weather_bug/current_response.rb +33 -0
  124. data/lib/barometer/weather_services/weather_bug/forecast_api.rb +26 -0
  125. data/lib/barometer/weather_services/weather_bug/forecast_response.rb +29 -0
  126. data/lib/barometer/weather_services/weather_bug/query.rb +42 -0
  127. data/lib/barometer/weather_services/weather_bug/response/current_weather.rb +82 -0
  128. data/lib/barometer/weather_services/weather_bug/response/forecasted_weather.rb +67 -0
  129. data/lib/barometer/weather_services/weather_bug/response/location.rb +23 -0
  130. data/lib/barometer/weather_services/weather_bug/response/station.rb +43 -0
  131. data/lib/barometer/weather_services/weather_bug/response/sun.rb +32 -0
  132. data/lib/barometer/weather_services/weather_bug/response/time_helper.rb +52 -0
  133. data/lib/barometer/weather_services/weather_bug/response/timezone.rb +15 -0
  134. data/lib/barometer/weather_services/wunderground_v1.rb +32 -0
  135. data/lib/barometer/weather_services/wunderground_v1/current_api.rb +21 -0
  136. data/lib/barometer/weather_services/wunderground_v1/current_response.rb +31 -0
  137. data/lib/barometer/weather_services/wunderground_v1/forecast_api.rb +21 -0
  138. data/lib/barometer/weather_services/wunderground_v1/forecast_response.rb +33 -0
  139. data/lib/barometer/weather_services/wunderground_v1/query.rb +30 -0
  140. data/lib/barometer/weather_services/wunderground_v1/response/current_weather.rb +92 -0
  141. data/lib/barometer/weather_services/wunderground_v1/response/forecasted_weather.rb +87 -0
  142. data/lib/barometer/weather_services/wunderground_v1/response/full_timezone.rb +22 -0
  143. data/lib/barometer/weather_services/wunderground_v1/response/location.rb +43 -0
  144. data/lib/barometer/weather_services/wunderground_v1/response/station.rb +39 -0
  145. data/lib/barometer/weather_services/wunderground_v1/response/sun.rb +53 -0
  146. data/lib/barometer/weather_services/wunderground_v1/response/timezone.rb +15 -0
  147. data/lib/barometer/weather_services/yahoo.rb +16 -198
  148. data/lib/barometer/weather_services/yahoo/api.rb +21 -0
  149. data/lib/barometer/weather_services/yahoo/query.rb +42 -0
  150. data/lib/barometer/weather_services/yahoo/response.rb +39 -0
  151. data/lib/barometer/weather_services/yahoo/response/current_weather.rb +86 -0
  152. data/lib/barometer/weather_services/yahoo/response/forecasted_weather.rb +71 -0
  153. data/lib/barometer/weather_services/yahoo/response/location.rb +47 -0
  154. data/lib/barometer/weather_services/yahoo/response/sun.rb +43 -0
  155. data/lib/barometer/weather_services/yahoo/response/timezone.rb +15 -0
  156. data/spec/barometer_spec.rb +18 -120
  157. data/spec/base_spec.rb +114 -0
  158. data/spec/cassettes/Converter_FromCoordinatesToNoaaStationId.json +1 -0
  159. data/spec/cassettes/Converter_FromWeatherIdToGeocode.json +1 -0
  160. data/spec/cassettes/Converter_FromWoeIdOrIpv4ToGeocode.json +1 -0
  161. data/spec/cassettes/Converter_ToGeocode.json +1 -0
  162. data/spec/cassettes/Converter_ToWeatherId.json +1 -0
  163. data/spec/cassettes/Converter_ToWoeId.json +1 -0
  164. data/spec/cassettes/Service_FromWeatherId.json +1 -0
  165. data/spec/cassettes/Service_GoogleGeocode.json +1 -0
  166. data/spec/cassettes/Service_NoaaStation.json +1 -0
  167. data/spec/cassettes/Service_ToWeatherId.json +1 -0
  168. data/spec/cassettes/Service_ToWoeId.json +1 -0
  169. data/spec/cassettes/Service_YahooGeocode.json +1 -0
  170. data/spec/cassettes/WeatherService_ForecastIo.json +1 -0
  171. data/spec/cassettes/WeatherService_Noaa.json +1 -1
  172. data/spec/cassettes/WeatherService_WeatherBug.json +1 -1
  173. data/spec/cassettes/WeatherService_WundergroundV1.json +1 -0
  174. data/spec/cassettes/WeatherService_Yahoo.json +1 -1
  175. data/spec/data/attributes/distance_spec.rb +60 -0
  176. data/spec/data/attributes/location_spec.rb +41 -0
  177. data/spec/data/attributes/pressure_spec.rb +60 -0
  178. data/spec/data/attributes/sun_spec.rb +33 -0
  179. data/spec/data/attributes/temperature_spec.rb +60 -0
  180. data/spec/data/attributes/time_spec.rb +58 -0
  181. data/spec/data/attributes/vector_spec.rb +43 -0
  182. data/spec/data/attributes/zone_spec.rb +34 -0
  183. data/spec/data/convertable_units_spec.rb +299 -0
  184. data/spec/data/coordinates_spec.rb +15 -0
  185. data/spec/data/distance_spec.rb +49 -333
  186. data/spec/data/geo_spec.rb +72 -71
  187. data/spec/data/location_spec.rb +70 -65
  188. data/spec/data/pressure_spec.rb +49 -333
  189. data/spec/data/sun_spec.rb +57 -81
  190. data/spec/data/temperature_spec.rb +49 -393
  191. data/spec/data/vector_spec.rb +100 -0
  192. data/spec/data/zone_spec.rb +199 -266
  193. data/spec/query/base_spec.rb +296 -0
  194. data/spec/query/converter_spec.rb +98 -0
  195. data/spec/query/converters/from_coordinates_to_noaa_station_id_spec.rb +35 -0
  196. data/spec/query/converters/from_geocode_to_coordinates_spec.rb +25 -0
  197. data/spec/query/converters/from_short_zipcode_to_zipcode_spec.rb +31 -0
  198. data/spec/query/converters/from_weather_id_to_geocode_spec.rb +40 -0
  199. data/spec/query/converters/from_woe_id_or_ipv4_to_geocode_spec.rb +51 -0
  200. data/spec/query/converters/to_geocode_spec.rb +99 -0
  201. data/spec/query/converters/to_weather_id_spec.rb +35 -0
  202. data/spec/query/converters/to_woe_id_spec.rb +74 -0
  203. data/spec/query/formats/base_spec.rb +15 -0
  204. data/spec/query/formats/coordinates_spec.rb +13 -0
  205. data/spec/query/formats/geocode_spec.rb +9 -0
  206. data/spec/query/formats/icao_spec.rb +20 -0
  207. data/spec/query/formats/ipv4_address_spec.rb +33 -0
  208. data/spec/query/formats/noaa_station_id_spec.rb +9 -0
  209. data/spec/query/formats/postalcode_spec.rb +18 -0
  210. data/spec/query/formats/short_zipcode_spec.rb +18 -0
  211. data/spec/query/formats/unknown_spec.rb +9 -0
  212. data/spec/query/formats/weather_id_spec.rb +31 -0
  213. data/spec/query/formats/woe_id_spec.rb +45 -0
  214. data/spec/query/formats/zipcode_spec.rb +18 -0
  215. data/spec/query/formats_spec.rb +55 -0
  216. data/spec/query/services/from_weather_id_spec.rb +54 -0
  217. data/spec/query/services/google_geocode_spec.rb +60 -0
  218. data/spec/query/services/noaa_station_id_spec.rb +23 -0
  219. data/spec/query/services/to_weather_id_spec.rb +23 -0
  220. data/spec/query/services/to_woe_id_spec.rb +51 -0
  221. data/spec/query/services/yahoo_geocode_spec.rb +72 -0
  222. data/spec/response/base_spec.rb +103 -0
  223. data/spec/response/current_spec.rb +33 -0
  224. data/spec/response/predicition_spec.rb +65 -0
  225. data/spec/response/prediction_collection_spec.rb +97 -0
  226. data/spec/spec_helper.rb +14 -12
  227. data/spec/support/key_file_parser.rb +22 -0
  228. data/spec/support/matchers/formats.rb +36 -0
  229. data/spec/support/matchers/have_data.rb +46 -0
  230. data/spec/support/matchers/have_field.rb +128 -0
  231. data/spec/support/matchers/have_forecast.rb +46 -0
  232. data/spec/support/matchers/path.rb +23 -0
  233. data/spec/support/query_factory.rb +20 -0
  234. data/spec/utils/address_spec.rb +67 -0
  235. data/spec/utils/config_reader_spec.rb +157 -0
  236. data/spec/utils/get_spec.rb +22 -0
  237. data/spec/utils/payload_request_spec.rb +69 -0
  238. data/spec/utils/payload_spec.rb +168 -0
  239. data/spec/utils/post_spec.rb +20 -0
  240. data/spec/utils/time_spec.rb +93 -0
  241. data/spec/utils/versioned_registration_spec.rb +105 -0
  242. data/spec/weather_services/base_spec.rb +116 -0
  243. data/spec/weather_services/forecast_io_spec.rb +71 -0
  244. data/spec/weather_services/noaa/current_response_spec.rb +22 -0
  245. data/spec/weather_services/noaa/forecast_response_spec.rb +33 -0
  246. data/spec/weather_services/noaa_spec.rb +68 -166
  247. data/spec/weather_services/weather_bug/current_response_spec.rb +64 -0
  248. data/spec/weather_services/weather_bug/forecast_response_spec.rb +23 -0
  249. data/spec/weather_services/weather_bug_spec.rb +62 -202
  250. data/spec/weather_services/wunderground_v1/current_response_spec.rb +19 -0
  251. data/spec/weather_services/wunderground_v1/forecast_response_spec.rb +62 -0
  252. data/spec/weather_services/wunderground_v1_spec.rb +78 -0
  253. data/spec/weather_services/yahoo/response_spec.rb +73 -0
  254. data/spec/weather_services/yahoo_spec.rb +52 -135
  255. data/spec/weather_services_spec.rb +103 -0
  256. data/spec/weather_spec.rb +167 -347
  257. metadata +342 -123
  258. data/.document +0 -5
  259. data/TODO +0 -60
  260. data/bin/barometer +0 -441
  261. data/lib/barometer/data/local_datetime.rb +0 -145
  262. data/lib/barometer/data/local_time.rb +0 -134
  263. data/lib/barometer/data/speed.rb +0 -158
  264. data/lib/barometer/data/units.rb +0 -49
  265. data/lib/barometer/formats.rb +0 -13
  266. data/lib/barometer/formats/coordinates.rb +0 -57
  267. data/lib/barometer/formats/format.rb +0 -64
  268. data/lib/barometer/formats/geocode.rb +0 -60
  269. data/lib/barometer/formats/icao.rb +0 -37
  270. data/lib/barometer/formats/postalcode.rb +0 -22
  271. data/lib/barometer/formats/short_zipcode.rb +0 -17
  272. data/lib/barometer/formats/weather_id.rb +0 -92
  273. data/lib/barometer/formats/woe_id.rb +0 -150
  274. data/lib/barometer/formats/zipcode.rb +0 -31
  275. data/lib/barometer/key_file_parser.rb +0 -20
  276. data/lib/barometer/measurements/measurement.rb +0 -202
  277. data/lib/barometer/measurements/result.rb +0 -207
  278. data/lib/barometer/measurements/result_array.rb +0 -75
  279. data/lib/barometer/services.rb +0 -19
  280. data/lib/barometer/weather_services/service.rb +0 -189
  281. data/lib/barometer/weather_services/wunderground.rb +0 -264
  282. data/lib/barometer/web_services/geocode.rb +0 -34
  283. data/lib/barometer/web_services/noaa_station_id.rb +0 -53
  284. data/lib/barometer/web_services/placemaker.rb +0 -95
  285. data/lib/barometer/web_services/timezone.rb +0 -38
  286. data/lib/barometer/web_services/weather_id.rb +0 -50
  287. data/lib/barometer/web_services/web_service.rb +0 -29
  288. data/spec/cassettes/Barometer.json +0 -1
  289. data/spec/cassettes/Query.json +0 -1
  290. data/spec/cassettes/Query_Format_Coordinates.json +0 -1
  291. data/spec/cassettes/Query_Format_Geocode.json +0 -1
  292. data/spec/cassettes/Query_Format_WeatherID.json +0 -1
  293. data/spec/cassettes/Query_Format_WoeID.json +0 -1
  294. data/spec/cassettes/WeatherService.json +0 -1
  295. data/spec/cassettes/WeatherService_Wunderground.json +0 -1
  296. data/spec/cassettes/WebService_Geocode.json +0 -1
  297. data/spec/cassettes/WebService_NoaaStation.json +0 -1
  298. data/spec/data/local_datetime_spec.rb +0 -274
  299. data/spec/data/local_time_spec.rb +0 -239
  300. data/spec/data/speed_spec.rb +0 -374
  301. data/spec/data/units_spec.rb +0 -101
  302. data/spec/formats/coordinates_spec.rb +0 -166
  303. data/spec/formats/format_spec.rb +0 -74
  304. data/spec/formats/geocode_spec.rb +0 -163
  305. data/spec/formats/icao_spec.rb +0 -55
  306. data/spec/formats/postalcode_spec.rb +0 -53
  307. data/spec/formats/short_zipcode_spec.rb +0 -47
  308. data/spec/formats/weather_id_spec.rb +0 -182
  309. data/spec/formats/woe_id_spec.rb +0 -211
  310. data/spec/formats/zipcode_spec.rb +0 -103
  311. data/spec/key_file_parser_spec.rb +0 -28
  312. data/spec/measurements/measurement_spec.rb +0 -381
  313. data/spec/measurements/result_array_spec.rb +0 -150
  314. data/spec/measurements/result_spec.rb +0 -632
  315. data/spec/query_spec.rb +0 -498
  316. data/spec/weather_services/services_spec.rb +0 -135
  317. data/spec/weather_services/wunderground_spec.rb +0 -179
  318. data/spec/web_services/geocode_spec.rb +0 -31
  319. data/spec/web_services/noaa_station_id_spec.rb +0 -33
  320. data/spec/web_services/placemaker_spec.rb +0 -41
  321. data/spec/web_services/web_services_spec.rb +0 -20
@@ -1,143 +1,22 @@
1
1
  module Barometer
2
- #
3
- # A simple Pressure class
4
- #
5
- # Think of this like the Integer class. Enhancement
6
- # is that you can create a number (in a certain unit), then
7
- # get that number back already converted to another unit.
8
- #
9
- # All comparison operations will be done in metric
10
- #
11
- # NOTE: the metric units for pressure aren't commonly used, except
12
- # that this class was designed for storing weather data,
13
- # and it seems that it is more common in this case
14
- #
15
- class Data::Pressure < Data::Units
2
+ module Data
3
+ class Pressure < ConvertableUnits
4
+ def mb; metric; end
5
+ def in; imperial; end
16
6
 
17
- METRIC_UNITS = "mb"
18
- IMPERIAL_UNITS = "in"
7
+ def units
8
+ metric? ? 'mb' : 'in'
9
+ end
19
10
 
20
- attr_accessor :millibars, :inches
11
+ private
21
12
 
22
- def initialize(metric=true)
23
- @millibars = nil
24
- @inches = nil
25
- super(metric)
26
- end
27
-
28
- def metric_default=(value); self.mb = value; end
29
- def imperial_default=(value); self.in = value; end
30
-
31
- #
32
- # CONVERTERS
33
- #
34
-
35
- def self.mb_to_in(mb)
36
- return nil unless mb && (mb.is_a?(Integer) || mb.is_a?(Float))
37
- mb.to_f * 0.02953
38
- end
39
-
40
- def self.in_to_mb(inches)
41
- return nil unless inches &&
42
- (inches.is_a?(Integer) || inches.is_a?(Float))
43
- inches.to_f * 33.8639
44
- end
45
-
46
- #
47
- # ACCESSORS
48
- #
49
-
50
- # store millibars
51
- #
52
- def mb=(mb)
53
- return if !mb || !(mb.is_a?(Integer) || mb.is_a?(Float))
54
- @millibars = mb.to_f
55
- self.update_inches(mb.to_f)
56
- end
57
-
58
- # store inches
59
- #
60
- def in=(inches)
61
- return if !inches || !(inches.is_a?(Integer) || inches.is_a?(Float))
62
- @inches = inches.to_f
63
- self.update_millibars(inches.to_f)
64
- end
65
-
66
- # return the stored millibars or convert from inches
67
- #
68
- def mb(as_integer=true)
69
- mb = (@millibars || Data::Pressure.in_to_mb(@inches))
70
- mb ? (as_integer ? mb.to_i : (100*mb).round/100.0) : nil
71
- end
72
-
73
- # return the stored inches or convert from millibars
74
- #
75
- def in(as_integer=true)
76
- inches = (@inches || Data::Pressure.mb_to_in(@millibars))
77
- inches ? (as_integer ? inches.to_i : (100*inches).round/100.0) : nil
78
- end
79
-
80
- #
81
- # OPERATORS
82
- #
13
+ def convert_imperial_to_metric(imperial_value)
14
+ imperial_value.to_f * 33.8639
15
+ end
83
16
 
84
- def <=>(other)
85
- self.mb <=> other.mb
17
+ def convert_metric_to_imperial(metric_value)
18
+ metric_value.to_f * 0.02953
19
+ end
86
20
  end
87
-
88
- #
89
- # HELPERS
90
- #
91
-
92
- # will just return the value (no units)
93
- #
94
- def to_i(metric=nil)
95
- (metric || (metric.nil? && self.metric?)) ? self.mb : self.in
96
- end
97
-
98
- # will just return the value (no units) with more precision
99
- #
100
- def to_f(metric=nil)
101
- (metric || (metric.nil? && self.metric?)) ? self.mb(false) : self.in(false)
102
- end
103
-
104
- # will return the value with units
105
- #
106
- def to_s(metric=nil)
107
- (metric || (metric.nil? && self.metric?)) ? "#{self.mb} #{METRIC_UNITS}" : "#{self.in} #{IMPERIAL_UNITS}"
108
- end
109
-
110
- # will just return the units (no value)
111
- #
112
- def units(metric=nil)
113
- (metric || (metric.nil? && self.metric?)) ? METRIC_UNITS : IMPERIAL_UNITS
114
- end
115
-
116
- # when we set inches, it is possible the a non-equivalent value of
117
- # millibars remains. if so, clear it.
118
- #
119
- def update_millibars(inches)
120
- return unless @millibars
121
- difference = Data::Pressure.in_to_mb(inches.to_f) - @millibars
122
- # only clear millibars if the stored millibars is off be more then 1 unit
123
- # then the conversion of inches
124
- @millibars = nil unless difference.abs <= 1.0
125
- end
126
-
127
- # when we set millibars, it is possible the a non-equivalent value of
128
- # inches remains. if so, clear it.
129
- #
130
- def update_inches(mb)
131
- return unless @inches
132
- difference = Data::Pressure.mb_to_in(mb.to_f) - @inches
133
- # only clear inches if the stored inches is off be more then 1 unit
134
- # then the conversion of millibars
135
- @inches = nil unless difference.abs <= 1.0
136
- end
137
-
138
- def nil?
139
- (@millibars || @inches) ? false : true
140
- end
141
-
142
21
  end
143
22
  end
@@ -1,33 +1,33 @@
1
1
  module Barometer
2
- #
3
- # A simple Sun class
4
- #
5
- # Used to store sunrise and sunset information
6
- #
7
- class Data::Sun
2
+ module Data
3
+ class Sun
4
+ include Virtus.value_object
8
5
 
9
- attr_reader :rise, :set
6
+ attribute :rise, ::Time
7
+ attribute :set, ::Time
10
8
 
11
- def initialize(rise=nil, set=nil)
12
- raise ArgumentError unless (rise.is_a?(Data::LocalTime) || rise.nil?)
13
- raise ArgumentError unless (set.is_a?(Data::LocalTime) || set.nil?)
14
- @rise = rise
15
- @set = set
16
- end
9
+ def nil?
10
+ !(rise || set)
11
+ end
17
12
 
18
- def nil?
19
- (@rise || @set) ? false : true
20
- end
13
+ def after_rise?(time)
14
+ time >= rise
15
+ end
21
16
 
22
- def after_rise?(time)
23
- raise ArgumentError unless time.is_a?(Data::LocalTime)
24
- time >= @rise
25
- end
17
+ def before_set?(time)
18
+ time <= set
19
+ end
26
20
 
27
- def before_set?(time)
28
- raise ArgumentError unless time.is_a?(Data::LocalTime)
29
- time <= @set
30
- end
21
+ def to_s
22
+ [_to_s('rise', rise), _to_s('set', set)].compact.join(', ')
23
+ end
24
+
25
+ private
31
26
 
27
+ def _to_s(prefix, value)
28
+ return unless value
29
+ "#{prefix}: #{value.strftime('%H:%M')}"
30
+ end
31
+ end
32
32
  end
33
33
  end
@@ -1,177 +1,22 @@
1
1
  module Barometer
2
- #
3
- # A simple Temperature class
4
- #
5
- # Think of this like the Integer class. Enhancement
6
- # is that you can create a number (in a certain unit), then
7
- # get that number back already converted to another unit.
8
- #
9
- # All comparison operations will be done in the absolute
10
- # scale of Kelvin (K)
11
- #
12
- class Data::Temperature < Data::Units
2
+ module Data
3
+ class Temperature < ConvertableUnits
4
+ def c; metric; end
5
+ def f; imperial; end
13
6
 
14
- METRIC_UNITS = "C"
15
- IMPERIAL_UNITS = "F"
7
+ def units
8
+ metric? ? 'C' : 'F'
9
+ end
16
10
 
17
- attr_accessor :celsius, :fahrenheit, :kelvin
11
+ private
18
12
 
19
- def initialize(metric=true)
20
- @celsius = nil
21
- @fahrenheit = nil
22
- @kelvin = nil
23
- super(metric)
24
- end
25
-
26
- def metric_default=(value); self.c = value; end
27
- def imperial_default=(value); self.f = value; end
28
-
29
- #
30
- # CONVERTERS
31
- #
32
-
33
- def self.c_to_k(c)
34
- return nil unless c && (c.is_a?(Integer) || c.is_a?(Float))
35
- 273.15 + c.to_f
36
- end
37
-
38
- # Tf = (9/5)*Tc+32
39
- #
40
- def self.c_to_f(c)
41
- return nil unless c && (c.is_a?(Integer) || c.is_a?(Float))
42
- ((9.0/5.0)*c.to_f)+32.0
43
- end
44
-
45
- # Tc = (5/9)*(Tf-32)
46
- #
47
- def self.f_to_c(f)
48
- return nil unless f && (f.is_a?(Integer) || f.is_a?(Float))
49
- (5.0/9.0)*(f.to_f-32.0)
50
- end
51
-
52
- def self.f_to_k(f)
53
- return nil unless f && (f.is_a?(Integer) || f.is_a?(Float))
54
- c = self.f_to_c(f.to_f)
55
- self.c_to_k(c)
56
- end
57
-
58
- def self.k_to_c(k)
59
- return nil unless k && (k.is_a?(Integer) || k.is_a?(Float))
60
- k.to_f - 273.15
61
- end
62
-
63
- def self.k_to_f(k)
64
- return nil unless k && (k.is_a?(Integer) || k.is_a?(Float))
65
- c = self.k_to_c(k.to_f)
66
- self.c_to_f(c)
67
- end
68
-
69
- #
70
- # ACCESSORS
71
- #
72
-
73
- # store celsius and kelvin
74
- #
75
- def c=(c)
76
- return if !c || !(c.is_a?(Integer) || c.is_a?(Float))
77
- @celsius = c.to_f
78
- @kelvin = Data::Temperature.c_to_k(c.to_f)
79
- self.update_fahrenheit(c.to_f)
80
- end
81
-
82
- # store fahrenheit and kelvin
83
- #
84
- def f=(f)
85
- return if !f || !(f.is_a?(Integer) || f.is_a?(Float))
86
- @fahrenheit = f.to_f
87
- @kelvin = Data::Temperature.f_to_k(f.to_f)
88
- self.update_celsius(f.to_f)
89
- end
90
-
91
- # store kelvin, convert to all
92
- #
93
- def k=(k)
94
- return if !k || !(k.is_a?(Integer) || k.is_a?(Float))
95
- @kelvin = k.to_f
96
- @celsius = Data::Temperature.k_to_c(k.to_f)
97
- @fahrenheit = Data::Temperature.k_to_f(k.to_f)
98
- end
13
+ def convert_imperial_to_metric(imperial_value)
14
+ (5.0/9.0)*(imperial_value.to_f-32.0)
15
+ end
99
16
 
100
- # return the stored celsius or convert from Kelvin
101
- #
102
- def c(as_integer=true)
103
- c = (@celsius || Data::Temperature.k_to_c(@kelvin))
104
- c ? (as_integer ? c.to_i : (100*c).round/100.0) : nil
17
+ def convert_metric_to_imperial(metric_value)
18
+ ((9.0/5.0)*metric_value.to_f)+32.0
19
+ end
105
20
  end
106
-
107
- # return the stored fahrenheit or convert from Kelvin
108
- #
109
- def f(as_integer=true)
110
- f = (@fahrenheit || Data::Temperature.k_to_f(@kelvin))
111
- f ? (as_integer ? f.to_i : (100*f).round/100.0) : nil
112
- end
113
-
114
- #
115
- # OPERATORS
116
- #
117
-
118
- def <=>(other)
119
- @kelvin <=> other.kelvin
120
- end
121
-
122
- #
123
- # HELPERS
124
- #
125
-
126
- # will just return the value (no units)
127
- #
128
- def to_i(metric=nil)
129
- (metric || (metric.nil? && self.metric?)) ? self.c : self.f
130
- end
131
-
132
- # will just return the value (no units) with more precision
133
- #
134
- def to_f(metric=nil)
135
- (metric || (metric.nil? && self.metric?)) ? self.c(false) : self.f(false)
136
- end
137
-
138
- # will return the value with units
139
- #
140
- def to_s(metric=nil)
141
- (metric || (metric.nil? && self.metric?)) ? "#{self.c} #{METRIC_UNITS}" : "#{self.f} #{IMPERIAL_UNITS}"
142
- end
143
-
144
- # will just return the units (no value)
145
- #
146
- def units(metric=nil)
147
- (metric || (metric.nil? && self.metric?)) ? METRIC_UNITS : IMPERIAL_UNITS
148
- end
149
-
150
- # when we set fahrenheit, it is possible the a non-equivalent value of
151
- # celsius remains. if so, clear it.
152
- #
153
- def update_celsius(f)
154
- return unless @celsius
155
- difference = Data::Temperature.f_to_c(f.to_f) - @celsius
156
- # only clear celsius if the stored celsius is off be more then 1 degree
157
- # then the conversion of fahrenheit
158
- @celsius = nil unless difference.abs <= 1.0
159
- end
160
-
161
- # when we set celsius, it is possible the a non-equivalent value of
162
- # fahrenheit remains. if so, clear it.
163
- #
164
- def update_fahrenheit(c)
165
- return unless @fahrenheit
166
- difference = Data::Temperature.c_to_f(c.to_f) - @fahrenheit
167
- # only clear fahrenheit if the stored fahrenheit is off be more then 1 degree
168
- # then the conversion of celsius
169
- @fahrenheit = nil unless difference.abs <= 1.0
170
- end
171
-
172
- def nil?
173
- (@celsius || @fahrenheit || @kelvin) ? false : true
174
- end
175
-
176
21
  end
177
22
  end
@@ -0,0 +1,44 @@
1
+ module Barometer
2
+ module Data
3
+ class Vector < ConvertableUnits
4
+ attr_reader :bearing
5
+
6
+ def kph; metric; end
7
+ def mph; imperial; end
8
+
9
+ def units
10
+ metric? ? 'kph' : 'mph'
11
+ end
12
+
13
+ def to_s
14
+ [super, bearing_to_s].compact.join(' @ ')
15
+ end
16
+
17
+ def nil?
18
+ super && bearing.nil?
19
+ end
20
+
21
+ private
22
+
23
+ def convert_imperial_to_metric(imperial_value)
24
+ imperial_value.to_f * 1.609
25
+ end
26
+
27
+ def convert_metric_to_imperial(metric_value)
28
+ metric_value.to_f * 0.622
29
+ end
30
+
31
+ def parse_extra_values!(args)
32
+ @bearing = args.pop if args.size > 1
33
+ end
34
+
35
+ def bearing_to_s
36
+ "#{bearing} degrees" unless bearing.nil?
37
+ end
38
+
39
+ def freeze_extra
40
+ @bearing.freeze
41
+ end
42
+ end
43
+ end
44
+ end