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,69 @@
1
+ require_relative '../spec_helper'
2
+
3
+ module Barometer::Utils
4
+ describe PayloadRequest do
5
+ describe '#get' do
6
+ let(:api) { double(:api, url: nil, params: nil, unwrap_nodes: [], current_query: nil) }
7
+ let(:payload_request) { PayloadRequest.new(api) }
8
+
9
+ before { Get.stub(call: double(content: '<foo></foo>', headers: {})) }
10
+
11
+ it 'makes a GET request' do
12
+ url = double(:url)
13
+ params = double(:params)
14
+ api.stub(url: url, params: params)
15
+
16
+ payload_request.get
17
+
18
+ expect( Get ).to have_received(:call).with(url, params)
19
+ end
20
+
21
+ it 'XML parses the GET response by default' do
22
+ content = double(:content)
23
+ Get.stub(call: double(content: content, headers: {}))
24
+ unwrap_nodes = double(:unwrap_nodes)
25
+ api.stub(unwrap_nodes: unwrap_nodes)
26
+ XmlReader.stub(:parse)
27
+
28
+ payload_request.get
29
+
30
+ expect( XmlReader ).to have_received(:parse).with(content, unwrap_nodes)
31
+ end
32
+
33
+ it 'wraps the result as a payload' do
34
+ expect( payload_request.get ).to be_a Payload
35
+ end
36
+
37
+ it 'stores the query used to make the request' do
38
+ current_query = double(:query)
39
+ api.stub(current_query: current_query)
40
+
41
+ payload = payload_request.get
42
+
43
+ expect( payload.query ).to eq current_query
44
+ end
45
+
46
+ context 'when the returned content type is */xml' do
47
+ it 'uses the XmlReader' do
48
+ Get.stub(call: double(content: '', headers: {'Content-Type' => 'text/xml'}))
49
+ XmlReader.stub(:parse)
50
+
51
+ payload_request.get
52
+
53
+ expect( XmlReader ).to have_received(:parse)
54
+ end
55
+ end
56
+
57
+ context 'when the returned content type is */json' do
58
+ it 'uses the JsonReader' do
59
+ Get.stub(call: double(content: '', headers: {'Content-Type' => 'application/json'}))
60
+ JsonReader.stub(:parse)
61
+
62
+ payload_request.get
63
+
64
+ expect( JsonReader ).to have_received(:parse)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,168 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe Barometer::Utils::Payload do
4
+ describe "#fetch" do
5
+ it "returns the value for the key provided" do
6
+ hash = {one: 1}
7
+ parser = Barometer::Utils::Payload.new(hash)
8
+ parser.fetch(:one).should == 1
9
+ end
10
+
11
+ it "returns nil when the key cannot be found" do
12
+ hash = {}
13
+ parser = Barometer::Utils::Payload.new(hash)
14
+ parser.fetch(:one).should be_nil
15
+ end
16
+
17
+ it "traverses multiple levels to get the value" do
18
+ hash = {one: {two: {three: 3}}}
19
+ parser = Barometer::Utils::Payload.new(hash)
20
+ parser.fetch(:one, :two, :three).should == 3
21
+ end
22
+
23
+ it "returns nil when any level cannot be found" do
24
+ hash = {one: {two: {three: {four: 4}}}}
25
+ parser = Barometer::Utils::Payload.new(hash)
26
+ parser.fetch(:one, :too, :three).should be_nil
27
+ end
28
+
29
+ it "returns nil when the starting value is nil" do
30
+ hash = nil
31
+ parser = Barometer::Utils::Payload.new(hash)
32
+ parser.fetch(:one).should be_nil
33
+ end
34
+
35
+ it "returns a stripped result" do
36
+ hash = {one: " one "}
37
+ parser = Barometer::Utils::Payload.new(hash)
38
+ parser.fetch(:one).should == "one"
39
+ end
40
+
41
+ it "returns nil when the value is NA" do
42
+ hash = {one: "NA"}
43
+ parser = Barometer::Utils::Payload.new(hash)
44
+ parser.fetch(:one).should be_nil
45
+ end
46
+
47
+ context "when the data is accessed via an attribute" do
48
+ it "returns the value of the key" do
49
+ hash = {one: {'@two' => 2}}
50
+ parser = Barometer::Utils::Payload.new(hash)
51
+ parser.fetch(:one, '@two').should == 2
52
+ end
53
+
54
+ it "returns the value accessed via :attributes" do
55
+ class StringWithAttributes < String
56
+ attr_accessor :attributes
57
+ end
58
+ value_with_attributes = StringWithAttributes.new('one')
59
+ value_with_attributes.attributes = {'two' => 2}
60
+ hash = {one: value_with_attributes}
61
+ parser = Barometer::Utils::Payload.new(hash)
62
+ parser.fetch(:one, '@two').should == 2
63
+ end
64
+ end
65
+
66
+ context "when the data is accessed via an index" do
67
+ it "returns the value at that index" do
68
+ hash = {one: [2]}
69
+ parser = Barometer::Utils::Payload.new(hash)
70
+ parser.fetch(:one, 0).should == 2
71
+ end
72
+ end
73
+ end
74
+
75
+ describe "#fetch_each" do
76
+ it "returns a payload for each result found at the key" do
77
+ hash = {one: [{two: 2}, {two: 2}]}
78
+ parser = Barometer::Utils::Payload.new(hash)
79
+
80
+ expect { |b|
81
+ parser.fetch_each(:one, &b)
82
+ }.to yield_successive_args(Barometer::Utils::Payload, Barometer::Utils::Payload)
83
+ end
84
+
85
+ it "returns a payload for each result found at the key" do
86
+ hash = {one: [{two: 2}, {two: 2}]}
87
+ parser = Barometer::Utils::Payload.new(hash)
88
+
89
+ parser.fetch_each(:one) do |each_parser|
90
+ each_parser.fetch(:two).should == 2
91
+ end
92
+ end
93
+
94
+ it "raises an error when result is not an array" do
95
+ hash = {one: 1}
96
+ parser = Barometer::Utils::Payload.new(hash)
97
+
98
+ expect {
99
+ parser.fetch_each(:one){ |p| nil }
100
+ }.to raise_error(NoMethodError)
101
+ end
102
+ end
103
+
104
+ describe "#fetch_each_with_index" do
105
+ it "returns a payload for each result found at the key" do
106
+ hash = {one: [{two: 2}, {two: 2}]}
107
+ parser = Barometer::Utils::Payload.new(hash)
108
+
109
+ i = 0
110
+ parser.fetch_each_with_index(:one) do |each_parser, index|
111
+ each_parser.fetch(:two).should == 2
112
+ index.should == i
113
+ i += 1
114
+ end
115
+ end
116
+
117
+ it "raises an error when result is not an array" do
118
+ hash = {one: 1}
119
+ parser = Barometer::Utils::Payload.new(hash)
120
+
121
+ expect {
122
+ parser.fetch_each_with_index(:one){ |p| nil }
123
+ }.to raise_error(NoMethodError)
124
+ end
125
+ end
126
+
127
+ describe "#using" do
128
+ it "applies the regex to the fetched result" do
129
+ hash = {one: 'two, three'}
130
+ parser = Barometer::Utils::Payload.new(hash)
131
+ parser.using(/^(.*),/).fetch(:one).should == 'two'
132
+ end
133
+
134
+ it "does nothing if valid regex does not exist" do
135
+ hash = {one: 'two, three'}
136
+ parser = Barometer::Utils::Payload.new(hash)
137
+ parser.using(:invalid_regex).fetch(:one).should == 'two, three'
138
+ end
139
+
140
+ it "does nothing if regex does not capture proper result" do
141
+ hash = {one: 'two, three'}
142
+ parser = Barometer::Utils::Payload.new(hash)
143
+ parser.using(/^.*,.*$/).fetch(:one).should == 'two, three'
144
+ end
145
+
146
+ it "forgets the regex" do
147
+ hash = {one: 'two, three'}
148
+ parser = Barometer::Utils::Payload.new(hash)
149
+ parser.using(/^(.*),/).fetch(:one).should == 'two'
150
+ parser.fetch(:one).should == 'two, three'
151
+ end
152
+ end
153
+
154
+ describe '#units' do
155
+ it 'returns the query units when the query is present' do
156
+ units = double(:units)
157
+ query = double(:query, units: units)
158
+ payload = Barometer::Utils::Payload.new({}, query)
159
+ expect( payload.units ).to eq units
160
+ end
161
+
162
+ it 'returns nil when the query is not present' do
163
+ payload = Barometer::Utils::Payload.new({}, nil)
164
+ expect( payload.units ).to be_nil
165
+ end
166
+ end
167
+ end
168
+
@@ -0,0 +1,20 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe Barometer::Utils::Post do
4
+ describe ".call" do
5
+ it "posts http content to a given address" do
6
+ stub_request(:post, "www.example.com").to_return(body: "Hello World")
7
+
8
+ content = Barometer::Utils::Post.call('www.example.com', foo: :bar)
9
+ content.should include('Hello World')
10
+ end
11
+
12
+ it "raises Barometer::TimeoutError when it times out" do
13
+ stub_request(:post, "www.example.com").to_timeout
14
+
15
+ expect {
16
+ Barometer::Utils::Post.call('www.example.com')
17
+ }.to raise_error(Barometer::TimeoutError)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,93 @@
1
+ require_relative '../spec_helper'
2
+
3
+ module Barometer
4
+ describe Utils::Time do
5
+ describe ".parse" do
6
+ it "accepts nil, does nothing" do
7
+ time = Utils::Time.parse
8
+ time.should be_nil
9
+ end
10
+
11
+ it "parses a Time object" do
12
+ t = ::Time.now.utc
13
+ time = Utils::Time.parse(t)
14
+
15
+ assert_times_are_equal(time, t)
16
+ end
17
+
18
+ it "parses a DateTime object" do
19
+ dt = ::DateTime.now
20
+ time = Utils::Time.parse(dt)
21
+
22
+ assert_times_are_equal(time, ::Time.now)
23
+ end
24
+
25
+ it "parses a Date object" do
26
+ d = ::Date.today
27
+ time = Utils::Time.parse(d)
28
+
29
+ now = ::Time.now
30
+ start_of_local_day = ::Time.local(
31
+ now.year, now.month, now.day,
32
+ 0, 0, 0
33
+ )
34
+
35
+ assert_times_are_equal(time, start_of_local_day)
36
+ end
37
+
38
+ it "parses a String (with no format), assumes UTC" do
39
+ t = "March 15, 10:36 AM 2013"
40
+
41
+ time = Utils::Time.parse(t)
42
+ assert_times_are_equal(time, ::Time.utc(2013, 3, 15, 10, 36, 0))
43
+ end
44
+
45
+ it "parses a String (with optional format), assumes UTC" do
46
+ format = "%B %e, %l:%M %p %Y"
47
+ t = "March 15, 10:36 AM 2013"
48
+
49
+ time = Utils::Time.parse(t, format)
50
+ assert_times_are_equal(time, ::Time.utc(2013, 3, 15, 10, 36, 0))
51
+ end
52
+
53
+ it "parses a timezoned String (with optional format)" do
54
+ format = "%B %e, %l:%M %p %z %Y"
55
+ t = "March 15, 10:36 AM -0800 2013"
56
+
57
+ time = Utils::Time.parse(t, format)
58
+ assert_times_are_equal(time, ::Time.utc(2013, 3, 15, 18, 36, 0))
59
+ end
60
+
61
+ it "accepts an array of values, creating a UTC time" do
62
+ time = Utils::Time.parse(2013, 3, 15, 18, 36, 0)
63
+ assert_times_are_equal(time, ::Time.utc(2013, 3, 15, 18, 36, 0))
64
+ end
65
+ end
66
+
67
+ describe ".strptime" do
68
+ end
69
+
70
+ describe ".strftime" do
71
+ end
72
+
73
+ describe ".utc_from_base_plus_local_time" do
74
+ end
75
+
76
+ describe ".utc_merge_base_plus_time" do
77
+ end
78
+
79
+ describe ".add_one_day" do
80
+ end
81
+
82
+ describe ".add_one_hour" do
83
+ end
84
+
85
+ def assert_times_are_equal(t1, t2)
86
+ if t1.to_i == t2.to_i
87
+ expect( t1.to_i ).to eq t2.to_i
88
+ else
89
+ expect( t1.to_i ).to be_within(2).of(t2.to_i)
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,105 @@
1
+ require_relative '../spec_helper'
2
+
3
+ describe Barometer::Utils::VersionedRegistration do
4
+ describe "#register" do
5
+ let(:registrations) { Barometer::Utils::VersionedRegistration.new }
6
+
7
+ it "treats no version as nil" do
8
+ expect {
9
+ registrations.register(:foo, double(:bar))
10
+ }.to change{ registrations.size }.by(1)
11
+ end
12
+
13
+ it "will register for the given key" do
14
+ expect {
15
+ registrations.register(:foo, :v1, double(:bar))
16
+ }.to change{ registrations.size }.by(1)
17
+ end
18
+
19
+ it "will not register the same key/version combination" do
20
+ registrations.register(:foo, :v1, double(:bar))
21
+
22
+ expect {
23
+ registrations.register(:foo, :v1, double(:bar))
24
+ }.not_to change{ registrations.size }
25
+ end
26
+
27
+ it "will not register the same key with default version" do
28
+ registrations.register(:foo, nil, double(:bar))
29
+
30
+ expect {
31
+ registrations.register(:foo, nil, double(:bar))
32
+ }.not_to change{ registrations.size }
33
+ end
34
+
35
+ it "will register a the same key but unique version" do
36
+ registrations.register(:foo, :v1, double(:bar))
37
+
38
+ expect {
39
+ registrations.register(:foo, :v2, double(:bar))
40
+ }.to change{ registrations.size }.by(1)
41
+ end
42
+
43
+ it "registers a block without a version" do
44
+ registration = Proc.new do
45
+ end
46
+
47
+ registrations.register(:foo, &registration)
48
+ registrations.find(:foo).should == registration
49
+ end
50
+
51
+ it "registers a block with a version" do
52
+ registration = Proc.new do
53
+ end
54
+
55
+ registrations.register(:foo, :v1, &registration)
56
+ registrations.find(:foo, :v1).should == registration
57
+ end
58
+ end
59
+
60
+ describe "#find" do
61
+ let(:registrations) { Barometer::Utils::VersionedRegistration.new }
62
+
63
+ it "finds the registration with no version by default" do
64
+ registration = double(:bar)
65
+ registrations.register(:foo, nil, registration)
66
+
67
+ registrations.find(:foo).should == registration
68
+ registrations.find(:foo, :v1).should == registration
69
+ end
70
+
71
+ it "finds the matching registration" do
72
+ registration_default = double(:bar_default)
73
+ registration_v1 = double(:bar_v1)
74
+ registration_v2 = double(:bar_v2)
75
+ registrations.register(:foo, nil, registration_default)
76
+ registrations.register(:foo, :v1, registration_v1)
77
+ registrations.register(:foo, :v2, registration_v2)
78
+
79
+ registrations.find(:foo, :v1).should == registration_v1
80
+ registrations.find(:foo, :v2).should == registration_v2
81
+ end
82
+
83
+ it "returns nothing if requested key not found" do
84
+ registrations.register(:foo, nil, double(:bar))
85
+ registrations.find(:bar, :v1).should be_nil
86
+ end
87
+
88
+ it "returns nothing if requested version not found" do
89
+ registrations.register(:foo, :v1, double(:bar))
90
+ registrations.find(:foo, :v2).should be_nil
91
+ end
92
+ end
93
+
94
+ describe "#size" do
95
+ let(:registration) { double(:registration) }
96
+ let(:registrations) { Barometer::Utils::VersionedRegistration.new }
97
+
98
+ it "counts versions" do
99
+ registrations.register(:foo, nil, registration)
100
+ registrations.register(:foo, :v1, registration)
101
+ registrations.register(:bar, :v1, registration)
102
+ registrations.size.should == 3
103
+ end
104
+ end
105
+ end