barometer 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. data/.gitignore +2 -0
  2. data/.pelusa.yml +7 -0
  3. data/.travis.yml +6 -3
  4. data/Gemfile +11 -1
  5. data/README.md +89 -244
  6. data/Rakefile +1 -1
  7. data/barometer.gemspec +22 -24
  8. data/lib/barometer.rb +14 -65
  9. data/lib/barometer/base.rb +35 -65
  10. data/lib/barometer/data.rb +15 -20
  11. data/lib/barometer/data/attribute.rb +19 -0
  12. data/lib/barometer/data/attributes/distance.rb +11 -0
  13. data/lib/barometer/data/attributes/float.rb +11 -0
  14. data/lib/barometer/data/attributes/integer.rb +11 -0
  15. data/lib/barometer/data/attributes/location.rb +11 -0
  16. data/lib/barometer/data/attributes/pressure.rb +11 -0
  17. data/lib/barometer/data/attributes/sun.rb +15 -0
  18. data/lib/barometer/data/attributes/temperature.rb +11 -0
  19. data/lib/barometer/data/attributes/time.rb +11 -0
  20. data/lib/barometer/data/attributes/vector.rb +11 -0
  21. data/lib/barometer/data/attributes/zone.rb +11 -0
  22. data/lib/barometer/data/convertable_units.rb +145 -0
  23. data/lib/barometer/data/coordinates.rb +16 -0
  24. data/lib/barometer/data/distance.rb +14 -133
  25. data/lib/barometer/data/geo.rb +22 -59
  26. data/lib/barometer/data/location.rb +14 -20
  27. data/lib/barometer/data/pressure.rb +14 -135
  28. data/lib/barometer/data/sun.rb +24 -24
  29. data/lib/barometer/data/temperature.rb +14 -169
  30. data/lib/barometer/data/vector.rb +44 -0
  31. data/lib/barometer/data/zone.rb +109 -112
  32. data/lib/barometer/query.rb +23 -161
  33. data/lib/barometer/query/base.rb +88 -0
  34. data/lib/barometer/query/converter.rb +64 -0
  35. data/lib/barometer/query/converters/from_coordinates_to_noaa_station_id.rb +30 -0
  36. data/lib/barometer/query/converters/from_geocode_to_coordinates.rb +28 -0
  37. data/lib/barometer/query/converters/from_short_zipcode_to_zipcode.rb +28 -0
  38. data/lib/barometer/query/converters/from_weather_id_to_geocode.rb +30 -0
  39. data/lib/barometer/query/converters/from_woe_id_or_ipv4_to_geocode.rb +32 -0
  40. data/lib/barometer/query/converters/to_geocode.rb +30 -0
  41. data/lib/barometer/query/converters/to_weather_id.rb +30 -0
  42. data/lib/barometer/query/converters/to_woe_id.rb +30 -0
  43. data/lib/barometer/query/format.rb +59 -0
  44. data/lib/barometer/query/formats/base.rb +22 -0
  45. data/lib/barometer/query/formats/coordinates.rb +14 -0
  46. data/lib/barometer/query/formats/geocode.rb +15 -0
  47. data/lib/barometer/query/formats/icao.rb +35 -0
  48. data/lib/barometer/query/formats/ipv4_address.rb +19 -0
  49. data/lib/barometer/query/formats/noaa_station_id.rb +15 -0
  50. data/lib/barometer/query/formats/postalcode.rb +20 -0
  51. data/lib/barometer/query/formats/short_zipcode.rb +15 -0
  52. data/lib/barometer/{translations → query/formats/translations}/icao_country_codes.yml +0 -0
  53. data/lib/barometer/{translations → query/formats/translations}/weather_country_codes.yml +0 -0
  54. data/lib/barometer/query/formats/unknown.rb +14 -0
  55. data/lib/barometer/query/formats/weather_id.rb +33 -0
  56. data/lib/barometer/query/formats/woe_id.rb +28 -0
  57. data/lib/barometer/query/formats/zipcode.rb +15 -0
  58. data/lib/barometer/query/service.rb +13 -0
  59. data/lib/barometer/query/services/apis/geonames_timezone.rb +26 -0
  60. data/lib/barometer/query/services/apis/google_geocode.rb +35 -0
  61. data/lib/barometer/query/services/apis/noaa_station.rb +31 -0
  62. data/lib/barometer/query/services/apis/weather_id.rb +35 -0
  63. data/lib/barometer/query/services/apis/wunderground_timezone.rb +26 -0
  64. data/lib/barometer/query/services/apis/yahoo_placefinder.rb +35 -0
  65. data/lib/barometer/query/services/apis/yahoo_weather.rb +31 -0
  66. data/lib/barometer/query/services/from_weather_id.rb +64 -0
  67. data/lib/barometer/query/services/geonames_timezone.rb +18 -0
  68. data/lib/barometer/query/services/google_geocode.rb +106 -0
  69. data/lib/barometer/query/services/noaa_station_id.rb +28 -0
  70. data/lib/barometer/query/services/to_weather_id.rb +25 -0
  71. data/lib/barometer/query/services/to_woe_id.rb +29 -0
  72. data/lib/barometer/query/services/wunderground_timezone.rb +18 -0
  73. data/lib/barometer/query/services/yahoo_geocode.rb +69 -0
  74. data/lib/barometer/response.rb +12 -0
  75. data/lib/barometer/response/base.rb +57 -0
  76. data/lib/barometer/response/current.rb +27 -0
  77. data/lib/barometer/response/prediction.rb +41 -0
  78. data/lib/barometer/response/prediction_collection.rb +48 -0
  79. data/lib/barometer/utils.rb +17 -0
  80. data/lib/barometer/utils/address.rb +33 -0
  81. data/lib/barometer/utils/api.rb +30 -0
  82. data/lib/barometer/utils/config_reader.rb +40 -0
  83. data/lib/barometer/utils/get.rb +17 -0
  84. data/lib/barometer/utils/json_reader.rb +22 -0
  85. data/lib/barometer/utils/payload.rb +100 -0
  86. data/lib/barometer/utils/payload_request.rb +37 -0
  87. data/lib/barometer/utils/post.rb +24 -0
  88. data/lib/barometer/utils/time.rb +78 -0
  89. data/lib/barometer/{translations → utils/translations}/zone_codes.yml +0 -0
  90. data/lib/barometer/utils/versioned_registration.rb +70 -0
  91. data/lib/barometer/utils/xml_reader.rb +27 -0
  92. data/lib/barometer/utils/zone_code_lookup.rb +30 -0
  93. data/lib/barometer/version.rb +1 -1
  94. data/lib/barometer/weather.rb +44 -173
  95. data/lib/barometer/weather_service.rb +41 -0
  96. data/lib/barometer/weather_services/base.rb +50 -0
  97. data/lib/barometer/weather_services/forecast_io.rb +36 -0
  98. data/lib/barometer/weather_services/forecast_io/api.rb +22 -0
  99. data/lib/barometer/weather_services/forecast_io/query.rb +38 -0
  100. data/lib/barometer/weather_services/forecast_io/response.rb +31 -0
  101. data/lib/barometer/weather_services/forecast_io/response/current_weather.rb +78 -0
  102. data/lib/barometer/weather_services/forecast_io/response/forecasted_weather.rb +74 -0
  103. data/lib/barometer/weather_services/forecast_io/response/location.rb +19 -0
  104. data/lib/barometer/weather_services/forecast_io/response/timezone.rb +25 -0
  105. data/lib/barometer/weather_services/noaa.rb +21 -305
  106. data/lib/barometer/weather_services/noaa/current_api.rb +25 -0
  107. data/lib/barometer/weather_services/noaa/current_query.rb +30 -0
  108. data/lib/barometer/weather_services/noaa/current_response.rb +29 -0
  109. data/lib/barometer/weather_services/noaa/forecast_api.rb +25 -0
  110. data/lib/barometer/weather_services/noaa/forecast_query.rb +39 -0
  111. data/lib/barometer/weather_services/noaa/forecast_response.rb +28 -0
  112. data/lib/barometer/weather_services/noaa/response/current_location.rb +42 -0
  113. data/lib/barometer/weather_services/noaa/response/current_station.rb +46 -0
  114. data/lib/barometer/weather_services/noaa/response/current_weather.rb +82 -0
  115. data/lib/barometer/weather_services/noaa/response/forecasted_weather.rb +90 -0
  116. data/lib/barometer/weather_services/noaa/response/location.rb +19 -0
  117. data/lib/barometer/weather_services/noaa/response/timezone.rb +15 -0
  118. data/lib/barometer/weather_services/response.rb +9 -0
  119. data/lib/barometer/weather_services/response/location.rb +42 -0
  120. data/lib/barometer/weather_services/response/time_zone.rb +19 -0
  121. data/lib/barometer/weather_services/weather_bug.rb +24 -280
  122. data/lib/barometer/weather_services/weather_bug/current_api.rb +26 -0
  123. data/lib/barometer/weather_services/weather_bug/current_response.rb +33 -0
  124. data/lib/barometer/weather_services/weather_bug/forecast_api.rb +26 -0
  125. data/lib/barometer/weather_services/weather_bug/forecast_response.rb +29 -0
  126. data/lib/barometer/weather_services/weather_bug/query.rb +42 -0
  127. data/lib/barometer/weather_services/weather_bug/response/current_weather.rb +82 -0
  128. data/lib/barometer/weather_services/weather_bug/response/forecasted_weather.rb +67 -0
  129. data/lib/barometer/weather_services/weather_bug/response/location.rb +23 -0
  130. data/lib/barometer/weather_services/weather_bug/response/station.rb +43 -0
  131. data/lib/barometer/weather_services/weather_bug/response/sun.rb +32 -0
  132. data/lib/barometer/weather_services/weather_bug/response/time_helper.rb +52 -0
  133. data/lib/barometer/weather_services/weather_bug/response/timezone.rb +15 -0
  134. data/lib/barometer/weather_services/wunderground_v1.rb +32 -0
  135. data/lib/barometer/weather_services/wunderground_v1/current_api.rb +21 -0
  136. data/lib/barometer/weather_services/wunderground_v1/current_response.rb +31 -0
  137. data/lib/barometer/weather_services/wunderground_v1/forecast_api.rb +21 -0
  138. data/lib/barometer/weather_services/wunderground_v1/forecast_response.rb +33 -0
  139. data/lib/barometer/weather_services/wunderground_v1/query.rb +30 -0
  140. data/lib/barometer/weather_services/wunderground_v1/response/current_weather.rb +92 -0
  141. data/lib/barometer/weather_services/wunderground_v1/response/forecasted_weather.rb +87 -0
  142. data/lib/barometer/weather_services/wunderground_v1/response/full_timezone.rb +22 -0
  143. data/lib/barometer/weather_services/wunderground_v1/response/location.rb +43 -0
  144. data/lib/barometer/weather_services/wunderground_v1/response/station.rb +39 -0
  145. data/lib/barometer/weather_services/wunderground_v1/response/sun.rb +53 -0
  146. data/lib/barometer/weather_services/wunderground_v1/response/timezone.rb +15 -0
  147. data/lib/barometer/weather_services/yahoo.rb +16 -198
  148. data/lib/barometer/weather_services/yahoo/api.rb +21 -0
  149. data/lib/barometer/weather_services/yahoo/query.rb +42 -0
  150. data/lib/barometer/weather_services/yahoo/response.rb +39 -0
  151. data/lib/barometer/weather_services/yahoo/response/current_weather.rb +86 -0
  152. data/lib/barometer/weather_services/yahoo/response/forecasted_weather.rb +71 -0
  153. data/lib/barometer/weather_services/yahoo/response/location.rb +47 -0
  154. data/lib/barometer/weather_services/yahoo/response/sun.rb +43 -0
  155. data/lib/barometer/weather_services/yahoo/response/timezone.rb +15 -0
  156. data/spec/barometer_spec.rb +18 -120
  157. data/spec/base_spec.rb +114 -0
  158. data/spec/cassettes/Converter_FromCoordinatesToNoaaStationId.json +1 -0
  159. data/spec/cassettes/Converter_FromWeatherIdToGeocode.json +1 -0
  160. data/spec/cassettes/Converter_FromWoeIdOrIpv4ToGeocode.json +1 -0
  161. data/spec/cassettes/Converter_ToGeocode.json +1 -0
  162. data/spec/cassettes/Converter_ToWeatherId.json +1 -0
  163. data/spec/cassettes/Converter_ToWoeId.json +1 -0
  164. data/spec/cassettes/Service_FromWeatherId.json +1 -0
  165. data/spec/cassettes/Service_GoogleGeocode.json +1 -0
  166. data/spec/cassettes/Service_NoaaStation.json +1 -0
  167. data/spec/cassettes/Service_ToWeatherId.json +1 -0
  168. data/spec/cassettes/Service_ToWoeId.json +1 -0
  169. data/spec/cassettes/Service_YahooGeocode.json +1 -0
  170. data/spec/cassettes/WeatherService_ForecastIo.json +1 -0
  171. data/spec/cassettes/WeatherService_Noaa.json +1 -1
  172. data/spec/cassettes/WeatherService_WeatherBug.json +1 -1
  173. data/spec/cassettes/WeatherService_WundergroundV1.json +1 -0
  174. data/spec/cassettes/WeatherService_Yahoo.json +1 -1
  175. data/spec/data/attributes/distance_spec.rb +60 -0
  176. data/spec/data/attributes/location_spec.rb +41 -0
  177. data/spec/data/attributes/pressure_spec.rb +60 -0
  178. data/spec/data/attributes/sun_spec.rb +33 -0
  179. data/spec/data/attributes/temperature_spec.rb +60 -0
  180. data/spec/data/attributes/time_spec.rb +58 -0
  181. data/spec/data/attributes/vector_spec.rb +43 -0
  182. data/spec/data/attributes/zone_spec.rb +34 -0
  183. data/spec/data/convertable_units_spec.rb +299 -0
  184. data/spec/data/coordinates_spec.rb +15 -0
  185. data/spec/data/distance_spec.rb +49 -333
  186. data/spec/data/geo_spec.rb +72 -71
  187. data/spec/data/location_spec.rb +70 -65
  188. data/spec/data/pressure_spec.rb +49 -333
  189. data/spec/data/sun_spec.rb +57 -81
  190. data/spec/data/temperature_spec.rb +49 -393
  191. data/spec/data/vector_spec.rb +100 -0
  192. data/spec/data/zone_spec.rb +199 -266
  193. data/spec/query/base_spec.rb +296 -0
  194. data/spec/query/converter_spec.rb +98 -0
  195. data/spec/query/converters/from_coordinates_to_noaa_station_id_spec.rb +35 -0
  196. data/spec/query/converters/from_geocode_to_coordinates_spec.rb +25 -0
  197. data/spec/query/converters/from_short_zipcode_to_zipcode_spec.rb +31 -0
  198. data/spec/query/converters/from_weather_id_to_geocode_spec.rb +40 -0
  199. data/spec/query/converters/from_woe_id_or_ipv4_to_geocode_spec.rb +51 -0
  200. data/spec/query/converters/to_geocode_spec.rb +99 -0
  201. data/spec/query/converters/to_weather_id_spec.rb +35 -0
  202. data/spec/query/converters/to_woe_id_spec.rb +74 -0
  203. data/spec/query/formats/base_spec.rb +15 -0
  204. data/spec/query/formats/coordinates_spec.rb +13 -0
  205. data/spec/query/formats/geocode_spec.rb +9 -0
  206. data/spec/query/formats/icao_spec.rb +20 -0
  207. data/spec/query/formats/ipv4_address_spec.rb +33 -0
  208. data/spec/query/formats/noaa_station_id_spec.rb +9 -0
  209. data/spec/query/formats/postalcode_spec.rb +18 -0
  210. data/spec/query/formats/short_zipcode_spec.rb +18 -0
  211. data/spec/query/formats/unknown_spec.rb +9 -0
  212. data/spec/query/formats/weather_id_spec.rb +31 -0
  213. data/spec/query/formats/woe_id_spec.rb +45 -0
  214. data/spec/query/formats/zipcode_spec.rb +18 -0
  215. data/spec/query/formats_spec.rb +55 -0
  216. data/spec/query/services/from_weather_id_spec.rb +54 -0
  217. data/spec/query/services/google_geocode_spec.rb +60 -0
  218. data/spec/query/services/noaa_station_id_spec.rb +23 -0
  219. data/spec/query/services/to_weather_id_spec.rb +23 -0
  220. data/spec/query/services/to_woe_id_spec.rb +51 -0
  221. data/spec/query/services/yahoo_geocode_spec.rb +72 -0
  222. data/spec/response/base_spec.rb +103 -0
  223. data/spec/response/current_spec.rb +33 -0
  224. data/spec/response/predicition_spec.rb +65 -0
  225. data/spec/response/prediction_collection_spec.rb +97 -0
  226. data/spec/spec_helper.rb +14 -12
  227. data/spec/support/key_file_parser.rb +22 -0
  228. data/spec/support/matchers/formats.rb +36 -0
  229. data/spec/support/matchers/have_data.rb +46 -0
  230. data/spec/support/matchers/have_field.rb +128 -0
  231. data/spec/support/matchers/have_forecast.rb +46 -0
  232. data/spec/support/matchers/path.rb +23 -0
  233. data/spec/support/query_factory.rb +20 -0
  234. data/spec/utils/address_spec.rb +67 -0
  235. data/spec/utils/config_reader_spec.rb +157 -0
  236. data/spec/utils/get_spec.rb +22 -0
  237. data/spec/utils/payload_request_spec.rb +69 -0
  238. data/spec/utils/payload_spec.rb +168 -0
  239. data/spec/utils/post_spec.rb +20 -0
  240. data/spec/utils/time_spec.rb +93 -0
  241. data/spec/utils/versioned_registration_spec.rb +105 -0
  242. data/spec/weather_services/base_spec.rb +116 -0
  243. data/spec/weather_services/forecast_io_spec.rb +71 -0
  244. data/spec/weather_services/noaa/current_response_spec.rb +22 -0
  245. data/spec/weather_services/noaa/forecast_response_spec.rb +33 -0
  246. data/spec/weather_services/noaa_spec.rb +68 -166
  247. data/spec/weather_services/weather_bug/current_response_spec.rb +64 -0
  248. data/spec/weather_services/weather_bug/forecast_response_spec.rb +23 -0
  249. data/spec/weather_services/weather_bug_spec.rb +62 -202
  250. data/spec/weather_services/wunderground_v1/current_response_spec.rb +19 -0
  251. data/spec/weather_services/wunderground_v1/forecast_response_spec.rb +62 -0
  252. data/spec/weather_services/wunderground_v1_spec.rb +78 -0
  253. data/spec/weather_services/yahoo/response_spec.rb +73 -0
  254. data/spec/weather_services/yahoo_spec.rb +52 -135
  255. data/spec/weather_services_spec.rb +103 -0
  256. data/spec/weather_spec.rb +167 -347
  257. metadata +342 -123
  258. data/.document +0 -5
  259. data/TODO +0 -60
  260. data/bin/barometer +0 -441
  261. data/lib/barometer/data/local_datetime.rb +0 -145
  262. data/lib/barometer/data/local_time.rb +0 -134
  263. data/lib/barometer/data/speed.rb +0 -158
  264. data/lib/barometer/data/units.rb +0 -49
  265. data/lib/barometer/formats.rb +0 -13
  266. data/lib/barometer/formats/coordinates.rb +0 -57
  267. data/lib/barometer/formats/format.rb +0 -64
  268. data/lib/barometer/formats/geocode.rb +0 -60
  269. data/lib/barometer/formats/icao.rb +0 -37
  270. data/lib/barometer/formats/postalcode.rb +0 -22
  271. data/lib/barometer/formats/short_zipcode.rb +0 -17
  272. data/lib/barometer/formats/weather_id.rb +0 -92
  273. data/lib/barometer/formats/woe_id.rb +0 -150
  274. data/lib/barometer/formats/zipcode.rb +0 -31
  275. data/lib/barometer/key_file_parser.rb +0 -20
  276. data/lib/barometer/measurements/measurement.rb +0 -202
  277. data/lib/barometer/measurements/result.rb +0 -207
  278. data/lib/barometer/measurements/result_array.rb +0 -75
  279. data/lib/barometer/services.rb +0 -19
  280. data/lib/barometer/weather_services/service.rb +0 -189
  281. data/lib/barometer/weather_services/wunderground.rb +0 -264
  282. data/lib/barometer/web_services/geocode.rb +0 -34
  283. data/lib/barometer/web_services/noaa_station_id.rb +0 -53
  284. data/lib/barometer/web_services/placemaker.rb +0 -95
  285. data/lib/barometer/web_services/timezone.rb +0 -38
  286. data/lib/barometer/web_services/weather_id.rb +0 -50
  287. data/lib/barometer/web_services/web_service.rb +0 -29
  288. data/spec/cassettes/Barometer.json +0 -1
  289. data/spec/cassettes/Query.json +0 -1
  290. data/spec/cassettes/Query_Format_Coordinates.json +0 -1
  291. data/spec/cassettes/Query_Format_Geocode.json +0 -1
  292. data/spec/cassettes/Query_Format_WeatherID.json +0 -1
  293. data/spec/cassettes/Query_Format_WoeID.json +0 -1
  294. data/spec/cassettes/WeatherService.json +0 -1
  295. data/spec/cassettes/WeatherService_Wunderground.json +0 -1
  296. data/spec/cassettes/WebService_Geocode.json +0 -1
  297. data/spec/cassettes/WebService_NoaaStation.json +0 -1
  298. data/spec/data/local_datetime_spec.rb +0 -274
  299. data/spec/data/local_time_spec.rb +0 -239
  300. data/spec/data/speed_spec.rb +0 -374
  301. data/spec/data/units_spec.rb +0 -101
  302. data/spec/formats/coordinates_spec.rb +0 -166
  303. data/spec/formats/format_spec.rb +0 -74
  304. data/spec/formats/geocode_spec.rb +0 -163
  305. data/spec/formats/icao_spec.rb +0 -55
  306. data/spec/formats/postalcode_spec.rb +0 -53
  307. data/spec/formats/short_zipcode_spec.rb +0 -47
  308. data/spec/formats/weather_id_spec.rb +0 -182
  309. data/spec/formats/woe_id_spec.rb +0 -211
  310. data/spec/formats/zipcode_spec.rb +0 -103
  311. data/spec/key_file_parser_spec.rb +0 -28
  312. data/spec/measurements/measurement_spec.rb +0 -381
  313. data/spec/measurements/result_array_spec.rb +0 -150
  314. data/spec/measurements/result_spec.rb +0 -632
  315. data/spec/query_spec.rb +0 -498
  316. data/spec/weather_services/services_spec.rb +0 -135
  317. data/spec/weather_services/wunderground_spec.rb +0 -179
  318. data/spec/web_services/geocode_spec.rb +0 -31
  319. data/spec/web_services/noaa_station_id_spec.rb +0 -33
  320. data/spec/web_services/placemaker_spec.rb +0 -41
  321. data/spec/web_services/web_services_spec.rb +0 -20
@@ -0,0 +1,128 @@
1
+ require 'rspec/expectations'
2
+
3
+ module Barometer
4
+ module Matchers
5
+ def have_field(field)
6
+ HaveField.new(field)
7
+ end
8
+
9
+ class HaveField
10
+ def initialize(field)
11
+ @field = field
12
+ end
13
+
14
+ def matches?(subject)
15
+ @subject = subject
16
+ has_field? &&
17
+ type_casts_as_type? &&
18
+ sets_value?
19
+ end
20
+
21
+ def failure_message
22
+ "Expected #{expectation} (#{@problem})"
23
+ end
24
+
25
+ def description
26
+ "have data field \"#{@field}\""
27
+ end
28
+
29
+ def of_type(type)
30
+ @type = type
31
+ self
32
+ end
33
+
34
+ protected
35
+
36
+ def has_field?
37
+ assert @subject.respond_to?(@field), "does not have field '#{@field}'"
38
+ end
39
+
40
+ def type_casts_as_type?
41
+ if type_is_time?
42
+ set_value "2013-01-01 10:15:30 am"
43
+ elsif type_is_sun?
44
+ rise = Time.utc(2013,1,1,10,15,30)
45
+ set = Time.utc(2013,1,1,18,14,56)
46
+ set_value Data::Sun.new(rise: rise, set: set)
47
+ else
48
+ set_value 10
49
+ end
50
+ assert value.is_a?(@type), "#{@field} does not typecast as #{@type}"
51
+ end
52
+
53
+ def sets_value?
54
+ if type_is_time?
55
+ set_value "10 15 30 2013 01 01 am", "%H %M %S %Y %m %d %p"
56
+ assert value.to_i == Time.utc(2013,01,01,10,15,30).to_i, "expected value of '2013-01-01 10:15:30 am', got '#{print_value}'"
57
+ elsif type_is_sun?
58
+ rise = Time.utc(2013,1,1,10,15,30)
59
+ set = Time.utc(2013,1,1,18,14,56)
60
+ set_value Data::Sun.new(rise: rise, set: set)
61
+ assert print_value == "rise: 10:15, set: 18:14", "expected value of 'rise: 10:15, set: 18:14'', got '#{print_value}'"
62
+ else
63
+ set_value 10
64
+ assert value.to_i == 10, "expected value of '10', got '#{value.to_i}'"
65
+ end
66
+ end
67
+
68
+ private
69
+
70
+ def value
71
+ @subject.send(@field)
72
+ end
73
+
74
+ def set_value(*value)
75
+ if type_is_time?
76
+ @subject.send("#{@field}=", value)
77
+ else
78
+ @subject.send("#{@field}=", *value)
79
+ end
80
+ end
81
+
82
+ def print_value
83
+ value.to_s
84
+ end
85
+
86
+ def metric_units
87
+ @type.send(:new, true).units
88
+ end
89
+
90
+ def imperial_units
91
+ @type.send(:new, false).units
92
+ end
93
+
94
+ def expectation
95
+ "\"#{@field}\" to be a #{@type}"
96
+ end
97
+
98
+ def value_responds_to_metric?
99
+ if type_is_time?
100
+ false
101
+ elsif @type == Float
102
+ # rubinius does not like Float.new being called on the next line
103
+ # so avoid it
104
+ false
105
+ else
106
+ @type.respond_to?(:new) && @type.new.respond_to?(:metric)
107
+ end
108
+ end
109
+
110
+ def type_is_time?
111
+ @type == Time
112
+ end
113
+
114
+ def type_is_sun?
115
+ @type == Data::Sun
116
+ end
117
+
118
+ def assert(test, failure_message)
119
+ if test
120
+ true
121
+ else
122
+ @problem = failure_message
123
+ false
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,46 @@
1
+ require_relative 'path'
2
+ require_relative 'formats'
3
+
4
+ module Barometer
5
+ module Matchers
6
+ def have_forecast(*paths)
7
+ HaveForecast.new(*paths)
8
+ end
9
+
10
+ class HaveForecast
11
+ include Barometer::Matchers::Formats
12
+
13
+ def initialize(*paths)
14
+ @paths = paths
15
+ end
16
+
17
+ def matches?(subject)
18
+ @result = Walker.new(subject.forecast[0]).follow(@paths)
19
+
20
+ if @format
21
+ is_of_format?(@format, @result)
22
+ else
23
+ @result == @value || @result.to_f == @value
24
+ end
25
+ end
26
+
27
+ def failure_message
28
+ "expected that '#{@result}' matches '#{@value || @format}'"
29
+ end
30
+
31
+ def description
32
+ "have correct forecast value for #{@paths.join('.')}"
33
+ end
34
+
35
+ def as_value(value)
36
+ @value = value
37
+ self
38
+ end
39
+
40
+ def as_format(format)
41
+ @format = format
42
+ self
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,23 @@
1
+ module Barometer
2
+ module Matchers
3
+ class Walker
4
+ attr_reader :value
5
+
6
+ def initialize(value)
7
+ @value = value
8
+ end
9
+
10
+ def follow(paths)
11
+ path_value = value
12
+ paths.each do |path|
13
+ path_value = path_value.send(path)
14
+ end
15
+ if path_value.respond_to?(:strftime)
16
+ path_value.strftime("%Y-%m-%d %H:%M:%S %z")
17
+ else
18
+ path_value.to_s
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,20 @@
1
+ module Barometer
2
+ module Support
3
+ module Factory
4
+ def build_query
5
+ double(
6
+ :query,
7
+ q: 'foo',
8
+ format: :unknown,
9
+ units: :metric,
10
+ geo: nil,
11
+ metric?: true
12
+ )
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+ RSpec.configure do |config|
19
+ config.include Barometer::Support::Factory
20
+ end
@@ -0,0 +1,67 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe Barometer::Utils::Address do
4
+ describe "#url" do
5
+ it "returns the initialized url" do
6
+ address = Barometer::Utils::Address.new("http://www.example.com")
7
+ address.url.should == "http://www.example.com"
8
+ end
9
+
10
+ it "ignores query params in the url" do
11
+ address = Barometer::Utils::Address.new("http://www.example.com?foo=bar")
12
+ address.url.should == "http://www.example.com"
13
+ end
14
+
15
+ it "ignores query params in the url" do
16
+ address = Barometer::Utils::Address.new("http://www.example.com", foo: :bar)
17
+ address.url.should == "http://www.example.com"
18
+ end
19
+ end
20
+
21
+ describe "#query" do
22
+ it "returns the initialized query" do
23
+ address = Barometer::Utils::Address.new("", {"foo" => "bar"})
24
+ address.query.should == {"foo" => "bar"}
25
+ end
26
+
27
+ it "returns the extracted query" do
28
+ address = Barometer::Utils::Address.new("http://www.example.com?foo=bar")
29
+ address.query.should == {"foo" => "bar"}
30
+ end
31
+
32
+ it "combines the extracted query and the provided query" do
33
+ address = Barometer::Utils::Address.new("http://www.example.com?foo=bar", foz: :baz)
34
+ address.query.should == {"foo" => "bar", "foz" => "baz"}
35
+ end
36
+
37
+ it "converts all keys to String" do
38
+ address = Barometer::Utils::Address.new("", {foo: :bar})
39
+ address.query.should == {"foo" => "bar"}
40
+ end
41
+ end
42
+
43
+ describe "#add" do
44
+ it "merges query params with existing params" do
45
+ address = Barometer::Utils::Address.new("", {"foo" => "bar"})
46
+ address.add(foz: :baz)
47
+ address.query.should == {"foo" => "bar", "foz" => "baz"}
48
+ end
49
+ end
50
+
51
+ describe "#to_s" do
52
+ it "formats the query params with the url" do
53
+ address = Barometer::Utils::Address.new("http://www.example.com", foo: :bar)
54
+ address.to_s.should == "http://www.example.com?foo=bar"
55
+ end
56
+
57
+ it "formats the query params with the url" do
58
+ address = Barometer::Utils::Address.new("http://www.example.com?foo=bar", foz: :baz)
59
+ address.to_s.should == "http://www.example.com?foo=bar&foz=baz"
60
+ end
61
+
62
+ it "formats just the url" do
63
+ address = Barometer::Utils::Address.new("http://www.example.com")
64
+ address.to_s.should == "http://www.example.com"
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,157 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe Barometer::Base do
4
+ around do |example|
5
+ cached_config = Barometer.config
6
+ example.run
7
+ Barometer.config = cached_config
8
+ end
9
+
10
+ describe ".take_level_while" do
11
+ context "when multiple tiers are configured" do
12
+ before { Barometer.config = { 1 => :foo, 2 => :bar } }
13
+
14
+ context "and the first iteration returns false" do
15
+ it "only yields once" do
16
+ expect { |b|
17
+ m = Proc.new do |*args|
18
+ b.to_proc.call(*args)
19
+ false
20
+ end
21
+
22
+ Barometer::Utils::ConfigReader.take_level_while(&m)
23
+ }.to yield_successive_args(1)
24
+ end
25
+ end
26
+
27
+ context "and the first iterations returns true" do
28
+ it "yields multiple times" do
29
+ expect { |b|
30
+ m = Proc.new do |*args|
31
+ b.to_proc.call(*args)
32
+ true
33
+ end
34
+
35
+ Barometer::Utils::ConfigReader.take_level_while(&b)
36
+ }.to yield_successive_args(1, 2)
37
+ end
38
+ end
39
+ end
40
+
41
+ context "when only one tier is configured" do
42
+ before { Barometer.config = { 1 => :foo } }
43
+
44
+ context "and the first iteration returns false" do
45
+ it "only yields once" do
46
+ expect { |b|
47
+ Barometer::Utils::ConfigReader.take_level_while(&b)
48
+ }.to yield_successive_args(1)
49
+ end
50
+ end
51
+
52
+ context "and the first iterations returns true" do
53
+ it "only yields once" do
54
+ expect { |b|
55
+ Barometer::Utils::ConfigReader.take_level_while(&b)
56
+ }.to yield_successive_args(1)
57
+ end
58
+ end
59
+ end
60
+
61
+ context "when no tiers are configured" do
62
+ it "never yields" do
63
+ Barometer.config = {}
64
+
65
+ expect { |b|
66
+ Barometer::Utils::ConfigReader.take_level_while(&b)
67
+ }.not_to yield_control
68
+ end
69
+ end
70
+ end
71
+
72
+ describe ".services" do
73
+ context "when there is one service for the tier" do
74
+ context "and that service is just a symbol" do
75
+ it "calls the block with no config" do
76
+ Barometer.config = { 1 => :test }
77
+
78
+ expect { |b|
79
+ Barometer::Utils::ConfigReader.services(1, &b)
80
+ }.to yield_with_args(:test, {})
81
+ end
82
+ end
83
+
84
+ context "and that service is just a string" do
85
+ it "calls the block with no config" do
86
+ Barometer.config = { 1 => 'test' }
87
+
88
+ expect { |b|
89
+ Barometer::Utils::ConfigReader.services(1, &b)
90
+ }.to yield_with_args(:test, {})
91
+ end
92
+ end
93
+
94
+ context "and that service is in an array" do
95
+ it "calls the block with no config" do
96
+ Barometer.config = { 1 => [:test] }
97
+
98
+ expect { |b|
99
+ Barometer::Utils::ConfigReader.services(1, &b)
100
+ }.to yield_with_args(:test, {})
101
+ end
102
+ end
103
+
104
+ context "and that service is a hash with options" do
105
+ it "calls the block with the options" do
106
+ Barometer.config = { 1 => {test: {version: :v1} } }
107
+
108
+ expect { |b|
109
+ Barometer::Utils::ConfigReader.services(1, &b)
110
+ }.to yield_with_args(:test, {version: :v1})
111
+ end
112
+ end
113
+
114
+ context "and that service is a hash with options in an array" do
115
+ it "calls the block with the options" do
116
+ Barometer.config = { 1 => [{test: {version: :v1} }] }
117
+
118
+ expect { |b|
119
+ Barometer::Utils::ConfigReader.services(1, &b)
120
+ }.to yield_with_args(:test, {version: :v1})
121
+ end
122
+ end
123
+ end
124
+
125
+ context "when there are multiple services for the tier" do
126
+ context "and both services have no opitons" do
127
+ it "calls the block twice without options" do
128
+ Barometer.config = { 1 => [:foo, :bar] }
129
+
130
+ expect { |b|
131
+ Barometer::Utils::ConfigReader.services(1, &b)
132
+ }.to yield_successive_args([:foo, {}], [:bar, {}])
133
+ end
134
+ end
135
+
136
+ context "and one service has no options, one has options" do
137
+ it "calls the block twice with and without options" do
138
+ Barometer.config = { 1 => [:foo, {bar: {version: :v1}}] }
139
+
140
+ expect { |b|
141
+ Barometer::Utils::ConfigReader.services(1, &b)
142
+ }.to yield_successive_args([:foo, {}], [:bar, {version: :v1}])
143
+ end
144
+ end
145
+
146
+ context "and both services have opitons" do
147
+ it "calls the block twice with options" do
148
+ Barometer.config = { 1 => [{foo: {weight: 2}}, {bar: {version: :v1}}] }
149
+
150
+ expect { |b|
151
+ Barometer::Utils::ConfigReader.services(1, &b)
152
+ }.to yield_successive_args([:foo, {weight: 2}], [:bar, {version: :v1}])
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,22 @@
1
+ require_relative '../spec_helper'
2
+
3
+ module Barometer
4
+ describe Utils::Get do
5
+ describe '.call' do
6
+ it 'gets http content from a given address' do
7
+ stub_request(:get, 'www.example.com?foo=bar').to_return(body: 'Hello World')
8
+
9
+ response = Utils::Get.call('www.example.com', foo: :bar)
10
+ expect( response.content ).to include('Hello World')
11
+ end
12
+
13
+ it 'raises Barometer::TimeoutError when it times out' do
14
+ stub_request(:get, 'www.example.com').to_timeout
15
+
16
+ expect {
17
+ Utils::Get.call('www.example.com')
18
+ }.to raise_error(Barometer::TimeoutError)
19
+ end
20
+ end
21
+ end
22
+ end