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,145 +0,0 @@
1
- require 'date'
2
- module Barometer
3
- #
4
- # A simple DateTime class
5
- #
6
- # A time class that represents the local date_time ...
7
- # it has no concept of time zone
8
- #
9
- class Data::LocalDateTime < Data::LocalTime
10
-
11
- attr_reader :year, :month, :day
12
-
13
- def initialize(y,mon,d,h=0,m=0,s=0)
14
- raise(ArgumentError, "invalid date") unless y && mon && d && Date.civil(y,mon,d)
15
- @year = y
16
- @month = mon
17
- @day = d
18
- super(h,m,s)
19
- self
20
- end
21
-
22
- def year=(y)
23
- unless y && y.is_a?(Fixnum) && Date.civil(y,@month,@day)
24
- raise(ArgumentError, "invalid year")
25
- end
26
- @year = y
27
- end
28
-
29
- def month=(m)
30
- unless m && m.is_a?(Fixnum) && Date.civil(@year,m,@day)
31
- raise(ArgumentError, "invalid month")
32
- end
33
- @month = m
34
- end
35
-
36
- def day=(d)
37
- unless d && d.is_a?(Fixnum) && Date.civil(@year,@month,d)
38
- raise(ArgumentError, "invalid day")
39
- end
40
- @day = d
41
- end
42
-
43
- def parse(string, format=nil)
44
- return unless string
45
- new_date = Data::LocalDateTime.parse(string, format)
46
- @year = new_date.year
47
- @month = new_date.month
48
- @day = new_date.day
49
- @hour = new_date.hour
50
- @min = new_date.min
51
- @sec = new_date.sec
52
- self
53
- end
54
-
55
- def self.parse(string, format=nil)
56
- return nil unless string
57
- return string if string.is_a?(Data::LocalDateTime)
58
-
59
- year = nil; month = nil; day = nil;
60
- hour = nil; min = nil; sec = nil;
61
- if string.is_a?(Time) || string.is_a?(DateTime)
62
- year = string.year
63
- month = string.mon
64
- day = string.day
65
- hour = string.hour
66
- min = string.min
67
- sec = string.sec
68
- elsif string.is_a?(Date)
69
- year = string.year
70
- month = string.mon
71
- day = string.day
72
- elsif string.is_a?(String)
73
- begin
74
- datetime = if format
75
- Time.strptime(string, format)
76
- else
77
- DateTime.parse(string)
78
- end
79
- year = datetime.year
80
- month = datetime.mon
81
- day = datetime.day
82
- hour = datetime.hour
83
- min = datetime.min
84
- sec = datetime.sec
85
- rescue ArgumentError
86
- return nil
87
- end
88
- end
89
- Data::LocalDateTime.new(year, month, day, hour, min, sec)
90
- end
91
-
92
- # convert to a Date class
93
- #
94
- def to_d
95
- Date.civil(@year, @month, @day)
96
- end
97
-
98
- # convert to a DateTime class
99
- #
100
- def to_dt
101
- DateTime.new(@year, @month, @day, @hour, @min, @sec)
102
- end
103
-
104
- def <=>(other)
105
- if other.is_a?(String) || other.is_a?(Time) || other.is_a?(DateTime) || other.is_a?(Date)
106
- the_other = Data::LocalDateTime.parse(other)
107
- else
108
- the_other = other
109
- end
110
- raise ArgumentError unless the_other.is_a?(Data::LocalDateTime) || the_other.is_a?(Data::LocalTime)
111
-
112
- if ((other.is_a?(String) || other.is_a?(Time) || other.is_a?(DateTime)) &&
113
- the_other.is_a?(Data::LocalDateTime)) || other.is_a?(Data::LocalDateTime)
114
- # we are counting days + seconds
115
- if (_total_days <=> the_other._total_days) == 0
116
- return total_seconds <=> the_other.total_seconds
117
- else
118
- return _total_days <=> the_other._total_days
119
- end
120
- elsif other.is_a?(Date) && the_other.is_a?(Data::LocalDateTime)
121
- # we are counting days
122
- return _total_days <=> the_other._total_days
123
- elsif the_other.is_a?(Data::LocalTime)
124
- # we are counting seconds
125
- return total_seconds <=> the_other.total_seconds
126
- end
127
- end
128
-
129
- def to_s(time=false)
130
- datetime = self.to_dt
131
- format = (time ? "%Y-%m-%d %I:%M:%S %p" : "%Y-%m-%d")
132
- datetime.strftime(format).downcase
133
- end
134
-
135
- def nil?; @year == 0 && @month == 0 && @day == 0 && super; end
136
-
137
- # this assumes all years have 366 days (which only is true for leap years)
138
- # but since this is just for comparisons, this will be accurate
139
- #
140
- def _total_days
141
- self.to_d.yday + (@year * 366)
142
- end
143
-
144
- end
145
- end
@@ -1,134 +0,0 @@
1
- module Barometer
2
- #
3
- # A simple Time class
4
- #
5
- # A time class that represents the local time ...
6
- # it has no concept of time zone or date
7
- #
8
- class Data::LocalTime
9
- include Comparable
10
-
11
- attr_reader :hour, :min, :sec
12
-
13
- def initialize(h=0,m=0,s=0)
14
- self.hour = h
15
- self.min = m
16
- self.sec = s
17
- self
18
- end
19
-
20
- def hour=(h)
21
- raise ArgumentError unless (h.is_a?(Fixnum) || h.nil?)
22
- hour_cap = 24
23
- if h.to_i >= hour_cap.to_i
24
- @hour = h.divmod(hour_cap)[1]
25
- else
26
- @hour = h
27
- end
28
- end
29
-
30
- def min=(m)
31
- raise ArgumentError unless (m.is_a?(Fixnum) || m.nil?)
32
- minute_cap = 60
33
- if m.to_i >= minute_cap.to_i
34
- result = m.divmod(minute_cap)
35
- @min = result[1]
36
- self.hour = @hour + result[0]
37
- else
38
- @min = m
39
- end
40
- end
41
-
42
- def sec=(s)
43
- raise ArgumentError unless (s.is_a?(Fixnum) || s.nil?)
44
- second_cap = 60
45
- if s.to_i >= second_cap.to_i
46
- result = s.divmod(second_cap)
47
- @sec = result[1]
48
- self.min = @min + result[0]
49
- else
50
- @sec = s
51
- end
52
- end
53
-
54
- def parse(string)
55
- if string.is_a?(Time) || string.is_a?(DateTime)
56
- @hour = string.hour
57
- @min = string.min
58
- @sec = string.sec
59
- elsif string.is_a?(String)
60
- time = Time.parse(string)
61
- @hour = time.hour
62
- @min = time.min
63
- @sec = time.sec
64
- end
65
- self
66
- end
67
-
68
- def self.parse(string)
69
- return string if string.is_a?(Data::LocalTime)
70
- local = Data::LocalTime.new
71
- local.parse(string)
72
- local
73
- end
74
-
75
- # convert to a Time class
76
- #
77
- def to_t
78
- date = Date.today
79
- Time.local(date.year,date.month,date.day,@hour,@min,@sec)
80
- end
81
-
82
- def total_seconds
83
- (@hour * 60 * 60) + (@min * 60) + @sec
84
- end
85
-
86
- def <=>(other)
87
- if other.is_a?(String) || other.is_a?(Time) || other.is_a?(DateTime)
88
- the_other = Data::LocalTime.parse(other)
89
- else
90
- the_other = other
91
- end
92
- raise ArgumentError unless the_other.is_a?(Data::LocalTime)
93
- total_seconds <=> the_other.total_seconds
94
- end
95
-
96
- def +(seconds)
97
- local_time = Data::LocalTime.new
98
- if seconds.is_a?(Fixnum) || seconds.is_a?(Float)
99
- local_time.sec = self.total_seconds + seconds.to_i
100
- elsif seconds.is_a?(Data::LocalTime)
101
- this_total = self.total_seconds + seconds.total_seconds
102
- local_time.sec = this_total
103
- end
104
- local_time
105
- end
106
-
107
- def -(seconds)
108
- local_time = Data::LocalTime.new
109
- if seconds.is_a?(Fixnum) || seconds.is_a?(Float)
110
- local_time.sec = self.total_seconds - seconds.to_i
111
- elsif seconds.is_a?(Data::LocalTime)
112
- #self.sec += seconds.total_seconds
113
- this_total = self.total_seconds - seconds.total_seconds
114
- local_time.sec = this_total
115
- end
116
- local_time
117
- end
118
-
119
- def diff(other)
120
- the_other = Data::LocalTime.parse(other)
121
- raise ArgumentError unless the_other.is_a?(Data::LocalTime)
122
- (self.total_seconds - the_other.total_seconds).to_i.abs
123
- end
124
-
125
- def to_s(seconds=false)
126
- time = self.to_t
127
- format = (seconds ? "%I:%M:%S %p" : "%I:%M %p")
128
- time.strftime(format).downcase
129
- end
130
-
131
- def nil?; @hour == 0 && @min == 0 && @sec == 0; end
132
-
133
- end
134
- end
@@ -1,158 +0,0 @@
1
- module Barometer
2
- #
3
- # A simple Speed 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
- # Speed is a vector, thus it has a perticular direction, although
10
- # the direction is independent of the units
11
- #
12
- # All comparison operations will be done in metric
13
- #
14
- # NOTE: this currently only supports the scale of
15
- # kilometers (km) and miles (m) per hour. There is currently
16
- # no way to scale to smaller units (eg km -> m -> mm)
17
- #
18
- class Data::Speed < Data::Units
19
-
20
- METRIC_UNITS = "kph"
21
- IMPERIAL_UNITS = "mph"
22
-
23
- attr_accessor :kilometers, :miles
24
- attr_accessor :degrees, :direction
25
-
26
- def initialize(metric=true)
27
- @kilometers = nil
28
- @miles = nil
29
- @degrees = nil
30
- @direction = nil
31
- super(metric)
32
- end
33
-
34
- def metric_default=(value); self.kph = value; end
35
- def imperial_default=(value); self.mph = value; end
36
-
37
- #
38
- # CONVERTERS
39
- #
40
-
41
- def self.km_to_m(km)
42
- return nil unless km && (km.is_a?(Integer) || km.is_a?(Float))
43
- km.to_f * 0.622
44
- end
45
-
46
- def self.m_to_km(m)
47
- return nil unless m && (m.is_a?(Integer) || m.is_a?(Float))
48
- m.to_f * 1.609
49
- end
50
-
51
- #
52
- # ACCESSORS
53
- #
54
-
55
- # store kilometers per hour
56
- #
57
- def kph=(kph)
58
- return if !kph || !(kph.is_a?(Integer) || kph.is_a?(Float))
59
- @kilometers = kph.to_f
60
- self.update_miles(kph.to_f)
61
- end
62
-
63
- # store miles per hour
64
- #
65
- def mph=(mph)
66
- return if !mph || !(mph.is_a?(Integer) || mph.is_a?(Float))
67
- @miles = mph.to_f
68
- self.update_kilometers(mph.to_f)
69
- end
70
-
71
- def direction=(direction)
72
- return if !direction || !direction.is_a?(String)
73
- @direction = direction
74
- end
75
-
76
- def degrees=(degrees)
77
- return if !degrees || !(degrees.is_a?(Integer) || degrees.is_a?(Float))
78
- @degrees = degrees
79
- end
80
-
81
- # return the stored kilometers or convert from miles
82
- #
83
- def kph(as_integer=true)
84
- km = (@kilometers || Data::Speed.m_to_km(@miles))
85
- km ? (as_integer ? km.to_i : (100*km).round/100.0) : nil
86
- end
87
-
88
- # return the stored miles or convert from kilometers
89
- #
90
- def mph(as_integer=true)
91
- m = (@miles || Data::Speed.km_to_m(@kilometers))
92
- m ? (as_integer ? m.to_i : (100*m).round/100.0) : nil
93
- end
94
-
95
- #
96
- # OPERATORS
97
- #
98
-
99
- def <=>(other)
100
- self.kph <=> other.kph
101
- end
102
-
103
- #
104
- # HELPERS
105
- #
106
-
107
- # will just return the value (no units)
108
- #
109
- def to_i(metric=nil)
110
- (metric || (metric.nil? && self.metric?)) ? self.kph : self.mph
111
- end
112
-
113
- # will just return the value (no units) with more precision
114
- #
115
- def to_f(metric=nil)
116
- (metric || (metric.nil? && self.metric?)) ? self.kph(false) : self.mph(false)
117
- end
118
-
119
- # will return the value with units
120
- #
121
- def to_s(metric=nil)
122
- (metric || (metric.nil? && self.metric?)) ? "#{self.kph} #{METRIC_UNITS}" : "#{self.mph} #{IMPERIAL_UNITS}"
123
- end
124
-
125
- # will just return the units (no value)
126
- #
127
- def units(metric=nil)
128
- (metric || (metric.nil? && self.metric?)) ? METRIC_UNITS : IMPERIAL_UNITS
129
- end
130
-
131
- # when we set miles, it is possible the a non-equivalent value of
132
- # kilometers remains. if so, clear it.
133
- #
134
- def update_kilometers(m)
135
- return unless @kilometers
136
- difference = Data::Speed.m_to_km(m.to_f) - @kilometers
137
- # only clear kilometers if the stored kilometers is off be more then 1 unit
138
- # then the conversion of miles
139
- @kilometers = nil unless difference.abs <= 1.0
140
- end
141
-
142
- # when we set kilometers, it is possible the a non-equivalent value of
143
- # miles remains. if so, clear it.
144
- #
145
- def update_miles(km)
146
- return unless @miles
147
- difference = Data::Speed.km_to_m(km.to_f) - @miles
148
- # only clear miles if the stored miles is off be more then 1 unit
149
- # then the conversion of kilometers
150
- @miles = nil unless difference.abs <= 1.0
151
- end
152
-
153
- def nil?
154
- (@kilometers || @miles) ? false : true
155
- end
156
-
157
- end
158
- end
@@ -1,49 +0,0 @@
1
- module Barometer
2
- class Data::Units
3
- include Comparable
4
-
5
- attr_accessor :metric
6
-
7
- def initialize(metric=true); @metric = metric; end
8
-
9
- #
10
- # HELPERS
11
- #
12
-
13
- def metric?; @metric; end
14
- def metric!; @metric=true; end
15
- def imperial!; @metric=false; end
16
-
17
- # assigns a value to the right attribute based on metric setting
18
- #
19
- def <<(value)
20
- return unless value
21
-
22
- # these values can be treated like 'nil'
23
- nil_values = ["NA", "N/A", ""]
24
-
25
- begin
26
- if value.is_a?(Array)
27
- value_m = value[0].to_f if (value[0] && !nil_values.include?(value[0]))
28
- value_i = value[1].to_f if (value[1] && !nil_values.include?(value[1]))
29
- value_b = nil
30
- else
31
- value_m = nil
32
- value_i = nil
33
- value_b = value.to_f if (value && !nil_values.include?(value))
34
- end
35
- rescue
36
- # do nothing
37
- end
38
-
39
- self.metric? ? self.metric_default = value_m || value_b :
40
- self.imperial_default = value_i || value_b
41
- end
42
-
43
- # stubs
44
- #
45
- def metric_default=(value); raise NotImplementedError; end
46
- def imperial_default=(value); raise NotImplementedError; end
47
-
48
- end
49
- end