7digital 0.0.6 → 0.0.7

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 (269) hide show
  1. data/README.rdoc +136 -136
  2. data/lib/sevendigital.rb +53 -53
  3. data/lib/sevendigital/api_operator.rb +130 -130
  4. data/lib/sevendigital/api_operator_cached.rb +41 -41
  5. data/lib/sevendigital/api_request.rb +65 -65
  6. data/lib/sevendigital/client.rb +113 -113
  7. data/lib/sevendigital/client_configuration.rb +86 -86
  8. data/lib/sevendigital/client_digestors.rb +107 -107
  9. data/lib/sevendigital/client_managers.rb +47 -47
  10. data/lib/sevendigital/digestion_tract/api_response_digestor.rb +58 -58
  11. data/lib/sevendigital/digestion_tract/artist_digestor.rb +32 -32
  12. data/lib/sevendigital/digestion_tract/basket_digestor.rb +19 -19
  13. data/lib/sevendigital/digestion_tract/basket_item_digestor.rb +26 -26
  14. data/lib/sevendigital/digestion_tract/chart_item_digestor.rb +28 -28
  15. data/lib/sevendigital/digestion_tract/digestor.rb +71 -71
  16. data/lib/sevendigital/digestion_tract/download_url_digestor.rb +20 -20
  17. data/lib/sevendigital/digestion_tract/format_digestor.rb +22 -22
  18. data/lib/sevendigital/digestion_tract/label_digestor.rb +20 -20
  19. data/lib/sevendigital/digestion_tract/locker_digestor.rb +18 -18
  20. data/lib/sevendigital/digestion_tract/locker_release_digestor.rb +20 -20
  21. data/lib/sevendigital/digestion_tract/locker_track_digestor.rb +22 -22
  22. data/lib/sevendigital/digestion_tract/oauth_access_token_digestor.rb +14 -14
  23. data/lib/sevendigital/digestion_tract/oauth_request_token_digestor.rb +14 -14
  24. data/lib/sevendigital/digestion_tract/pager_digestor.rb +24 -24
  25. data/lib/sevendigital/digestion_tract/price_digestor.rb +25 -25
  26. data/lib/sevendigital/digestion_tract/release_digestor.rb +53 -53
  27. data/lib/sevendigital/digestion_tract/tag_digestor.rb +22 -22
  28. data/lib/sevendigital/digestion_tract/track_digestor.rb +38 -38
  29. data/lib/sevendigital/digestion_tract/user_card_digestor.rb +23 -23
  30. data/lib/sevendigital/digestion_tract/user_digestor.rb +20 -20
  31. data/lib/sevendigital/management/artist_manager.rb +99 -99
  32. data/lib/sevendigital/management/basket_manager.rb +29 -29
  33. data/lib/sevendigital/management/manager.rb +12 -12
  34. data/lib/sevendigital/management/oauth_manager.rb +23 -23
  35. data/lib/sevendigital/management/release_manager.rb +56 -56
  36. data/lib/sevendigital/management/tag_manager.rb +10 -10
  37. data/lib/sevendigital/management/track_manager.rb +28 -28
  38. data/lib/sevendigital/management/user_card_manager.rb +26 -26
  39. data/lib/sevendigital/management/user_manager.rb +71 -71
  40. data/lib/sevendigital/model/api_response.rb +25 -25
  41. data/lib/sevendigital/model/artist.rb +94 -94
  42. data/lib/sevendigital/model/basket.rb +15 -15
  43. data/lib/sevendigital/model/basket_item.rb +14 -14
  44. data/lib/sevendigital/model/card.rb +11 -11
  45. data/lib/sevendigital/model/chart_item.rb +9 -9
  46. data/lib/sevendigital/model/download_url.rb +7 -7
  47. data/lib/sevendigital/model/format.rb +7 -7
  48. data/lib/sevendigital/model/label.rb +7 -7
  49. data/lib/sevendigital/model/locker.rb +4 -4
  50. data/lib/sevendigital/model/locker_release.rb +9 -9
  51. data/lib/sevendigital/model/locker_track.rb +9 -9
  52. data/lib/sevendigital/model/price.rb +9 -9
  53. data/lib/sevendigital/model/release.rb +52 -52
  54. data/lib/sevendigital/model/sevendigital_error.rb +11 -11
  55. data/lib/sevendigital/model/sevendigital_object.rb +57 -57
  56. data/lib/sevendigital/model/tag.rb +7 -7
  57. data/lib/sevendigital/model/track.rb +83 -83
  58. data/lib/sevendigital/model/user.rb +63 -63
  59. data/lib/sevendigital/pager.rb +23 -23
  60. data/lib/sevendigital/peachy_patchy.rb +9 -9
  61. data/lib/sevendigital/proxy_police.rb +27 -27
  62. data/lib/sevendigital/version.rb +5 -5
  63. data/spec/api_operator_cached_spec.rb +178 -178
  64. data/spec/api_operator_spec.rb +336 -336
  65. data/spec/api_request_spec.rb +31 -31
  66. data/spec/client_configuration_spec.rb +79 -74
  67. data/spec/client_spec.rb +162 -162
  68. data/spec/coverage/assets/0.3.9/app.js +66 -0
  69. data/spec/coverage/assets/0.3.9/fancybox/blank.gif +0 -0
  70. data/spec/coverage/assets/0.3.9/fancybox/fancy_close.png +0 -0
  71. data/spec/coverage/assets/0.3.9/fancybox/fancy_loading.png +0 -0
  72. data/spec/coverage/assets/0.3.9/fancybox/fancy_nav_left.png +0 -0
  73. data/spec/coverage/assets/0.3.9/fancybox/fancy_nav_right.png +0 -0
  74. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_e.png +0 -0
  75. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_n.png +0 -0
  76. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_ne.png +0 -0
  77. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_nw.png +0 -0
  78. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_s.png +0 -0
  79. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_se.png +0 -0
  80. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_sw.png +0 -0
  81. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_w.png +0 -0
  82. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_left.png +0 -0
  83. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_main.png +0 -0
  84. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_over.png +0 -0
  85. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_right.png +0 -0
  86. data/spec/coverage/assets/0.3.9/fancybox/fancybox-x.png +0 -0
  87. data/spec/coverage/assets/0.3.9/fancybox/fancybox-y.png +0 -0
  88. data/spec/coverage/assets/0.3.9/fancybox/fancybox.png +0 -0
  89. data/spec/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.css +363 -0
  90. data/spec/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.pack.js +44 -0
  91. data/spec/coverage/assets/0.3.9/favicon.png +0 -0
  92. data/spec/coverage/assets/0.3.9/jquery-1.4.2.min.js +155 -0
  93. data/spec/coverage/assets/0.3.9/jquery.dataTables.min.js +152 -0
  94. data/spec/coverage/assets/0.3.9/jquery.timeago.js +141 -0
  95. data/spec/coverage/assets/0.3.9/jquery.url.js +174 -0
  96. data/spec/coverage/assets/0.3.9/loading.gif +0 -0
  97. data/spec/coverage/assets/0.3.9/magnify.png +0 -0
  98. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  99. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  100. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  101. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  102. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  103. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  104. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  105. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  106. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_222222_256x240.png +0 -0
  107. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  108. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_454545_256x240.png +0 -0
  109. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_888888_256x240.png +0 -0
  110. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  111. data/spec/coverage/assets/0.3.9/smoothness/jquery-ui-1.8.4.custom.css +295 -0
  112. data/spec/coverage/assets/0.3.9/stylesheet.css +341 -0
  113. data/spec/coverage/index.html +47481 -0
  114. data/spec/coverage/resultset.yml +3556 -0
  115. data/spec/data/config/sevendigital.yml +5 -5
  116. data/spec/data/configuration_env_override.yml +5 -5
  117. data/spec/data/configuration_override.yml +1 -1
  118. data/spec/digestion_tract/api_response_digestor_spec.rb +92 -92
  119. data/spec/digestion_tract/artist_digestor_spec.rb +81 -81
  120. data/spec/digestion_tract/basket_digestor_spec.rb +31 -31
  121. data/spec/digestion_tract/basket_item_digestor_spec.rb +58 -58
  122. data/spec/digestion_tract/chart_digestor_spec.rb +52 -52
  123. data/spec/digestion_tract/download_url_digestor_spec.rb +40 -40
  124. data/spec/digestion_tract/format_digestor_spec.rb +38 -38
  125. data/spec/digestion_tract/label_digestor_spec.rb +33 -33
  126. data/spec/digestion_tract/locker_digestor_spec.rb +30 -30
  127. data/spec/digestion_tract/locker_release_digestor_spec.rb +70 -70
  128. data/spec/digestion_tract/locker_track_digestor_spec.rb +56 -56
  129. data/spec/digestion_tract/oauth_access_token_digestor_spec.rb +34 -34
  130. data/spec/digestion_tract/oauth_request_token_digestor_spec.rb +34 -34
  131. data/spec/digestion_tract/pager_digestor_spec.rb +50 -50
  132. data/spec/digestion_tract/price_digestor_spec.rb +73 -73
  133. data/spec/digestion_tract/release_digestor_spec.rb +101 -101
  134. data/spec/digestion_tract/tag_digestor_spec.rb +46 -46
  135. data/spec/digestion_tract/track_digestor_spec.rb +104 -104
  136. data/spec/digestion_tract/user_card_digestor_spec.rb +58 -58
  137. data/spec/digestion_tract/user_digestor_spec.rb +44 -44
  138. data/spec/management/artist_manager_spec.rb +151 -151
  139. data/spec/management/basket_manager_spec.rb +77 -77
  140. data/spec/management/oauth_manager_spec.rb +72 -72
  141. data/spec/management/release_manager_spec.rb +200 -200
  142. data/spec/management/tag_manager_spec.rb +34 -34
  143. data/spec/management/track_manager_spec.rb +107 -107
  144. data/spec/management/user_card_manager_spec.rb +78 -78
  145. data/spec/management/user_manager_spec.rb +202 -202
  146. data/spec/model/api_response_spec.rb +48 -48
  147. data/spec/model/artist_spec.rb +154 -154
  148. data/spec/model/basket_spec.rb +62 -62
  149. data/spec/model/coverage/assets/0.3.9/app.js +66 -0
  150. data/spec/model/coverage/assets/0.3.9/fancybox/blank.gif +0 -0
  151. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_close.png +0 -0
  152. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_loading.png +0 -0
  153. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_nav_left.png +0 -0
  154. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_nav_right.png +0 -0
  155. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_e.png +0 -0
  156. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_n.png +0 -0
  157. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_ne.png +0 -0
  158. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_nw.png +0 -0
  159. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_s.png +0 -0
  160. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_se.png +0 -0
  161. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_sw.png +0 -0
  162. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_w.png +0 -0
  163. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_left.png +0 -0
  164. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_main.png +0 -0
  165. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_over.png +0 -0
  166. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_right.png +0 -0
  167. data/spec/model/coverage/assets/0.3.9/fancybox/fancybox-x.png +0 -0
  168. data/spec/model/coverage/assets/0.3.9/fancybox/fancybox-y.png +0 -0
  169. data/spec/model/coverage/assets/0.3.9/fancybox/fancybox.png +0 -0
  170. data/spec/model/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.css +363 -0
  171. data/spec/model/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.pack.js +44 -0
  172. data/spec/model/coverage/assets/0.3.9/favicon.png +0 -0
  173. data/spec/model/coverage/assets/0.3.9/jquery-1.4.2.min.js +155 -0
  174. data/spec/model/coverage/assets/0.3.9/jquery.dataTables.min.js +152 -0
  175. data/spec/model/coverage/assets/0.3.9/jquery.timeago.js +141 -0
  176. data/spec/model/coverage/assets/0.3.9/jquery.url.js +174 -0
  177. data/spec/model/coverage/assets/0.3.9/loading.gif +0 -0
  178. data/spec/model/coverage/assets/0.3.9/magnify.png +0 -0
  179. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  180. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  181. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  182. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  183. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  184. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  185. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  186. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  187. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_222222_256x240.png +0 -0
  188. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  189. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_454545_256x240.png +0 -0
  190. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_888888_256x240.png +0 -0
  191. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  192. data/spec/model/coverage/assets/0.3.9/smoothness/jquery-ui-1.8.4.custom.css +295 -0
  193. data/spec/model/coverage/assets/0.3.9/stylesheet.css +341 -0
  194. data/spec/model/coverage/index.html +8637 -0
  195. data/spec/model/coverage/resultset.yml +642 -0
  196. data/spec/model/release_spec.rb +122 -122
  197. data/spec/model/sevendigital_object_spec.rb +73 -73
  198. data/spec/model/track_spec.rb +144 -144
  199. data/spec/model/user_spec.rb +160 -160
  200. data/spec/pager_spec.rb +7 -7
  201. data/spec/peachy_spec_helper_patch.rb +6 -6
  202. data/spec/proxy_police_spec.rb +69 -69
  203. data/spec/sevendigital_spec.rb +51 -70
  204. data/spec/sevendigital_spec.yml +4 -4
  205. data/spec/spec_helper.rb +64 -64
  206. data/spec/test-xml/methods/artist/browse.xml +21 -21
  207. data/spec/test-xml/methods/artist/byTag/top.xml +50 -50
  208. data/spec/test-xml/methods/artist/chart.xml +30 -30
  209. data/spec/test-xml/methods/artist/details.xml +9 -9
  210. data/spec/test-xml/methods/artist/releases.xml +544 -544
  211. data/spec/test-xml/methods/artist/search.xml +18 -18
  212. data/spec/test-xml/methods/artist/similar.xml +39 -39
  213. data/spec/test-xml/methods/artist/tags.xml +11 -11
  214. data/spec/test-xml/methods/artist/toptracks.xml +279 -279
  215. data/spec/test-xml/methods/basket/additem.xml +23 -23
  216. data/spec/test-xml/methods/basket/create.xml +10 -10
  217. data/spec/test-xml/methods/basket/index.xml +23 -23
  218. data/spec/test-xml/methods/basket/removeitem.xml +10 -10
  219. data/spec/test-xml/methods/oauth/accesstoken.xml +5 -5
  220. data/spec/test-xml/methods/oauth/requesttoken.xml +5 -5
  221. data/spec/test-xml/methods/release/bydate.xml +173 -173
  222. data/spec/test-xml/methods/release/bytag/top.xml +150 -150
  223. data/spec/test-xml/methods/release/chart.xml +181 -181
  224. data/spec/test-xml/methods/release/details.xml +48 -48
  225. data/spec/test-xml/methods/release/recommend.xml +89 -89
  226. data/spec/test-xml/methods/release/search.xml +194 -194
  227. data/spec/test-xml/methods/release/tags.xml +27 -27
  228. data/spec/test-xml/methods/release/tracks.xml +28 -28
  229. data/spec/test-xml/methods/tag/index.xml +16 -16
  230. data/spec/test-xml/methods/track/chart.xml +149 -149
  231. data/spec/test-xml/methods/track/details.xml +30 -30
  232. data/spec/test-xml/methods/track/search.xml +159 -159
  233. data/spec/test-xml/methods/user/locker.xml +49 -49
  234. data/spec/test-xml/methods/user/payment/card/add.xml +7 -7
  235. data/spec/test-xml/methods/user/payment/card/index.xml +7 -7
  236. data/spec/test-xml/methods/user/purchase/basket.xml +49 -0
  237. data/spec/test-xml/methods/user/purchase/item.xml +48 -48
  238. data/spec/test-xml/methods/user/signUp.xml +5 -5
  239. data/spec/test-xml/objects/artist.xml +6 -6
  240. data/spec/test-xml/objects/artist_chart_item.xml +7 -7
  241. data/spec/test-xml/objects/artist_list.xml +22 -22
  242. data/spec/test-xml/objects/artist_list_empty.xml +4 -4
  243. data/spec/test-xml/objects/basket.xml +21 -21
  244. data/spec/test-xml/objects/basket_item.xml +11 -11
  245. data/spec/test-xml/objects/basket_item_list.xml +25 -25
  246. data/spec/test-xml/objects/basket_item_list_empty.xml +1 -1
  247. data/spec/test-xml/objects/download_url.xml +7 -7
  248. data/spec/test-xml/objects/locker.xml +47 -47
  249. data/spec/test-xml/objects/locker_release.xml +40 -40
  250. data/spec/test-xml/objects/locker_release_list.xml +87 -87
  251. data/spec/test-xml/objects/locker_release_list_empty.xml +4 -4
  252. data/spec/test-xml/objects/locker_release_one_item_list.xml +43 -43
  253. data/spec/test-xml/objects/locker_track.xml +25 -25
  254. data/spec/test-xml/objects/locker_track_list.xml +26 -26
  255. data/spec/test-xml/objects/locker_track_list_empty.xml +2 -2
  256. data/spec/test-xml/objects/oauth_access_token.xml +3 -3
  257. data/spec/test-xml/objects/oauth_request_token.xml +3 -3
  258. data/spec/test-xml/objects/price.xml +7 -7
  259. data/spec/test-xml/objects/release.xml +40 -40
  260. data/spec/test-xml/objects/release_chart_item.xml +39 -39
  261. data/spec/test-xml/objects/release_list.xml +18 -18
  262. data/spec/test-xml/objects/release_list_empty.xml +4 -4
  263. data/spec/test-xml/objects/response.xml +38 -38
  264. data/spec/test-xml/objects/tag.xml +4 -4
  265. data/spec/test-xml/objects/track.xml +33 -33
  266. data/spec/test-xml/objects/track_chart_item.xml +27 -27
  267. data/spec/test-xml/objects/user.xml +4 -4
  268. data/spec/test-xml/objects/user_payment_card.xml +5 -5
  269. metadata +193 -3
@@ -1,41 +1,41 @@
1
- module Sevendigital
2
-
3
- #@private
4
- #Cached version of ApiOperator
5
- #If response for an API request is already in cache and
6
- #and it hasn't expired returns the cached response is returned instead of making an API call
7
- #otherwise uses methods inherited from ApiOperator to make an HTTP call to the API
8
- class ApiOperatorCached < ApiOperator # :nodoc:
9
-
10
- def initialize(client, cache)
11
- @cache = cache
12
- super(client)
13
- end
14
-
15
- def call_api(api_request)
16
- request_cache_key = create_request_uri(api_request)
17
- http_response = @cache.get(request_cache_key.to_s) if !api_request.requires_signature?
18
- puts "ApiOperatorCached: Got from cache #{request_cache_key}" if @client.verbose? && http_response
19
- puts "but the response is out of date" if @client.verbose? && http_response && response_out_of_date?(http_response)
20
- if (!http_response || response_out_of_date?(http_response)) then
21
- http_response = make_http_request(api_request)
22
- @cache.set(request_cache_key.to_s, http_response) if !api_request.requires_signature?
23
- end
24
- api_response = digest_http_response(http_response)
25
- p api_response if @client.very_verbose?
26
- api_response
27
- end
28
-
29
- def response_out_of_date?(http_response, current_time=nil)
30
- return true if http_response.header.nil? || http_response.header["Date"].nil? || http_response.header["cache-control"].nil?
31
- puts "cache headers present"
32
- return true if !(http_response.header["cache-control"] =~ /max-age=([0-9]+)/)
33
- current_time ||= Time.now.utc
34
- response_time = Time.parse(http_response.header["Date"])
35
- max_age = /max-age=([0-9]+)/.match(http_response.header["cache-control"])[1].to_i
36
- response_time + max_age < current_time
37
- end
38
-
39
- end
40
-
41
- end
1
+ module Sevendigital
2
+
3
+ #@private
4
+ #Cached version of ApiOperator
5
+ #If response for an API request is already in cache and
6
+ #and it hasn't expired returns the cached response is returned instead of making an API call
7
+ #otherwise uses methods inherited from ApiOperator to make an HTTP call to the API
8
+ class ApiOperatorCached < ApiOperator # :nodoc:
9
+
10
+ def initialize(client, cache)
11
+ @cache = cache
12
+ super(client)
13
+ end
14
+
15
+ def call_api(api_request)
16
+ request_cache_key = create_request_uri(api_request)
17
+ http_response = @cache.get(request_cache_key.to_s) if !api_request.requires_signature?
18
+ puts "ApiOperatorCached: Got from cache #{request_cache_key}" if @client.verbose? && http_response
19
+ puts "but the response is out of date" if @client.verbose? && http_response && response_out_of_date?(http_response)
20
+ if (!http_response || response_out_of_date?(http_response)) then
21
+ http_response = make_http_request(api_request)
22
+ @cache.set(request_cache_key.to_s, http_response) if !api_request.requires_signature?
23
+ end
24
+ api_response = digest_http_response(http_response)
25
+ p api_response if @client.very_verbose?
26
+ api_response
27
+ end
28
+
29
+ def response_out_of_date?(http_response, current_time=nil)
30
+ return true if http_response.header.nil? || http_response.header["Date"].nil? || http_response.header["cache-control"].nil?
31
+ puts "cache headers present"
32
+ return true if !(http_response.header["cache-control"] =~ /max-age=([0-9]+)/)
33
+ current_time ||= Time.now.utc
34
+ response_time = Time.parse(http_response.header["Date"])
35
+ max_age = /max-age=([0-9]+)/.match(http_response.header["cache-control"])[1].to_i
36
+ response_time + max_age < current_time
37
+ end
38
+
39
+ end
40
+
41
+ end
@@ -1,66 +1,66 @@
1
- module Sevendigital
2
-
3
- #@private
4
- #Abstraction of a HTTP API request, ApiOperator uses this ApiRequest to build a real HTTP requests
5
- class ApiRequest # :nodoc:
6
-
7
- attr_reader :api_method, :parameters, :signed
8
- attr_accessor :token, :api_service, :http_method
9
- attr_accessor :signature_scheme
10
- attr_writer :form_parameters
11
-
12
- def initialize(http_method, api_method, parameters, options={})
13
- @api_method = api_method
14
- @parameters = parameters
15
- @signature_scheme = :header
16
- @http_method = http_method
17
- comb_parameters(parameters)
18
- @form_parameters = Hash.new
19
- end
20
-
21
- def form_parameters
22
- comb_parameters(@form_parameters)
23
- end
24
-
25
- def requires_signature?
26
- @signed == true
27
- end
28
-
29
- def require_signature
30
- @signed = true
31
- end
32
-
33
- def requires_secure_connection?
34
- @secure == true
35
- end
36
-
37
- def require_secure_connection
38
- @secure = true
39
- end
40
-
41
- def comb_parameters(parameters)
42
- comb_parameter(parameters, :pageSize, [:page_size, :per_page])
43
- comb_parameter(parameters, :shopId, :shop_id)
44
- comb_parameter(parameters, :imageSize, :image_size)
45
- remove_empty_parameters(parameters)
46
- parameters
47
- end
48
-
49
- def comb_parameter(parameters, correct_name, alternative_names)
50
- param_value = nil
51
- alternative_names = [alternative_names] unless alternative_names.is_a?(Array)
52
- alternative_names.each do |alternative_name|
53
- param_value ||= parameters[alternative_name]
54
- parameters.delete(alternative_name)
55
- end
56
- parameters[correct_name] ||= param_value if param_value
57
- end
58
-
59
- def remove_empty_parameters(parameters)
60
- parameters.delete_if { |key, value| value.nil? }
61
- end
62
-
63
-
64
- end
65
-
1
+ module Sevendigital
2
+
3
+ #@private
4
+ #Abstraction of a HTTP API request, ApiOperator uses this ApiRequest to build a real HTTP requests
5
+ class ApiRequest # :nodoc:
6
+
7
+ attr_reader :api_method, :parameters, :signed
8
+ attr_accessor :token, :api_service, :http_method
9
+ attr_accessor :signature_scheme
10
+ attr_writer :form_parameters
11
+
12
+ def initialize(http_method, api_method, parameters, options={})
13
+ @api_method = api_method
14
+ @parameters = parameters
15
+ @signature_scheme = :header
16
+ @http_method = http_method
17
+ comb_parameters(parameters)
18
+ @form_parameters = Hash.new
19
+ end
20
+
21
+ def form_parameters
22
+ comb_parameters(@form_parameters)
23
+ end
24
+
25
+ def requires_signature?
26
+ @signed == true
27
+ end
28
+
29
+ def require_signature
30
+ @signed = true
31
+ end
32
+
33
+ def requires_secure_connection?
34
+ @secure == true
35
+ end
36
+
37
+ def require_secure_connection
38
+ @secure = true
39
+ end
40
+
41
+ def comb_parameters(parameters)
42
+ comb_parameter(parameters, :pageSize, [:page_size, :per_page])
43
+ comb_parameter(parameters, :shopId, :shop_id)
44
+ comb_parameter(parameters, :imageSize, :image_size)
45
+ remove_empty_parameters(parameters)
46
+ parameters
47
+ end
48
+
49
+ def comb_parameter(parameters, correct_name, alternative_names)
50
+ param_value = nil
51
+ alternative_names = [alternative_names] unless alternative_names.is_a?(Array)
52
+ alternative_names.each do |alternative_name|
53
+ param_value ||= parameters[alternative_name]
54
+ parameters.delete(alternative_name)
55
+ end
56
+ parameters[correct_name] ||= param_value if param_value
57
+ end
58
+
59
+ def remove_empty_parameters(parameters)
60
+ parameters.delete_if { |key, value| value.nil? }
61
+ end
62
+
63
+
64
+ end
65
+
66
66
  end
@@ -1,113 +1,113 @@
1
- module Sevendigital
2
-
3
- class Client
4
-
5
- #if default values for any of these parameters are set in configuration, they will be passed along with every single API request
6
- COMMON_REQUEST_PARAMETERS = [:shop_id, :country, :page, :page_size, :image_size]
7
-
8
- def initialize(*args)
9
- @configuration = Sevendigital::ClientConfiguration.new(*args)
10
- yield @configuration if block_given?
11
- @api_operator = hire_api_operator
12
- end
13
-
14
- def create_api_request(http_method, api_method, parameters, options = {})
15
- parameters = options.merge(parameters)
16
- parameters = add_default_parameters(parameters)
17
- if http_method != :POST then
18
- request = ApiRequest.new(http_method, api_method, parameters)
19
- else
20
- request = ApiRequest.new(http_method, api_method, {})
21
- request.form_parameters = parameters
22
- end
23
- request
24
- end
25
-
26
- def make_api_request(http_method, api_method, parameters, options = {})
27
- api_request = create_api_request(http_method, api_method, parameters, options)
28
- operator.call_api(api_request)
29
- end
30
-
31
- def make_signed_api_request(http_method, api_method, parameters, options = {}, token = nil)
32
- api_request = create_api_request(http_method, api_method, parameters, options)
33
- api_request.require_signature
34
- api_request.require_secure_connection
35
- api_request.token = token
36
-
37
- operator.call_api(api_request)
38
- end
39
-
40
- def oauth_consumer
41
- host, version = api_host_and_version(:account)
42
-
43
- consumer_options = {
44
- :authorize_path => "https://#{host}/#{version}/oauth/authorise",
45
- :http_method => :get
46
- }
47
-
48
- @oauth_consumer ||= OAuth::Consumer.new( \
49
- @configuration.oauth_consumer_key, \
50
- @configuration.oauth_consumer_secret, \
51
- consumer_options \
52
- )
53
- end
54
-
55
- def configuration
56
- return @configuration
57
- end
58
-
59
- def operator
60
- @api_operator
61
- end
62
-
63
- def verbose?
64
- !!(@verbose || @configuration.verbose)
65
- end
66
-
67
- def very_verbose?
68
- verbose? && (@verbose || @configuration.verbose).to_s == "very_verbose"
69
- end
70
-
71
- #@private
72
- def api_host_and_version(api_service=nil)
73
- service = api_service && !api_service.to_s.empty? ? "#{api_service}_" : ""
74
- return configuration.send("#{service}api_url".to_sym), configuration.send("#{service}api_version".to_sym)
75
- end
76
-
77
- #@private
78
- def user_agent_info
79
- app_info = @configuration.app_name ? "/#{@configuration.app_name}" : nil
80
- app_info += " #{@configuration.app_version}" if app_info && @configuration.app_version
81
- "#{Sevendigital::NAME} Gem #{Sevendigital::VERSION}#{app_info}"
82
- end
83
-
84
- private
85
-
86
- #@private
87
- def default_parameters
88
- params = {}
89
- COMMON_REQUEST_PARAMETERS.each do |param|
90
- value = @configuration.send(param)
91
- params[param] = value if value
92
- end
93
- params
94
- end
95
-
96
- #@private
97
- def hire_api_operator
98
- @configuration.cache ? ApiOperatorCached.new(self, @configuration.cache) : ApiOperator.new(self)
99
- end
100
-
101
- #@private
102
- def add_default_parameters(parameters)
103
- params = parameters
104
- default_parameters.each do |name, value|
105
- params[name] ||= value
106
- end
107
- params
108
- end
109
-
110
-
111
- end
112
-
113
- end
1
+ module Sevendigital
2
+
3
+ class Client
4
+
5
+ #if default values for any of these parameters are set in configuration, they will be passed along with every single API request
6
+ COMMON_REQUEST_PARAMETERS = [:shop_id, :country, :page, :page_size, :image_size]
7
+
8
+ def initialize(*args)
9
+ @configuration = Sevendigital::ClientConfiguration.new(*args)
10
+ yield @configuration if block_given?
11
+ @api_operator = hire_api_operator
12
+ end
13
+
14
+ def create_api_request(http_method, api_method, parameters, options = {})
15
+ parameters = options.merge(parameters)
16
+ parameters = add_default_parameters(parameters)
17
+ if http_method != :POST then
18
+ request = ApiRequest.new(http_method, api_method, parameters)
19
+ else
20
+ request = ApiRequest.new(http_method, api_method, {})
21
+ request.form_parameters = parameters
22
+ end
23
+ request
24
+ end
25
+
26
+ def make_api_request(http_method, api_method, parameters, options = {})
27
+ api_request = create_api_request(http_method, api_method, parameters, options)
28
+ operator.call_api(api_request)
29
+ end
30
+
31
+ def make_signed_api_request(http_method, api_method, parameters, options = {}, token = nil)
32
+ api_request = create_api_request(http_method, api_method, parameters, options)
33
+ api_request.require_signature
34
+ api_request.require_secure_connection
35
+ api_request.token = token
36
+
37
+ operator.call_api(api_request)
38
+ end
39
+
40
+ def oauth_consumer
41
+ host, version = api_host_and_version(:account)
42
+
43
+ consumer_options = {
44
+ :authorize_path => "https://#{host}/#{version}/oauth/authorise",
45
+ :http_method => :get
46
+ }
47
+
48
+ @oauth_consumer ||= OAuth::Consumer.new( \
49
+ @configuration.oauth_consumer_key, \
50
+ @configuration.oauth_consumer_secret, \
51
+ consumer_options \
52
+ )
53
+ end
54
+
55
+ def configuration
56
+ return @configuration
57
+ end
58
+
59
+ def operator
60
+ @api_operator
61
+ end
62
+
63
+ def verbose?
64
+ !!(@verbose || @configuration.verbose)
65
+ end
66
+
67
+ def very_verbose?
68
+ verbose? && (@verbose || @configuration.verbose).to_s == "very_verbose"
69
+ end
70
+
71
+ #@private
72
+ def api_host_and_version(api_service=nil)
73
+ service = api_service && !api_service.to_s.empty? ? "#{api_service}_" : ""
74
+ return configuration.send("#{service}api_url".to_sym), configuration.send("#{service}api_version".to_sym)
75
+ end
76
+
77
+ #@private
78
+ def user_agent_info
79
+ app_info = @configuration.app_name ? "/#{@configuration.app_name}" : nil
80
+ app_info += " #{@configuration.app_version}" if app_info && @configuration.app_version
81
+ "#{Sevendigital::NAME} Gem #{Sevendigital::VERSION}#{app_info}"
82
+ end
83
+
84
+ private
85
+
86
+ #@private
87
+ def default_parameters
88
+ params = {}
89
+ COMMON_REQUEST_PARAMETERS.each do |param|
90
+ value = @configuration.send(param)
91
+ params[param] = value if value
92
+ end
93
+ params
94
+ end
95
+
96
+ #@private
97
+ def hire_api_operator
98
+ @configuration.cache ? ApiOperatorCached.new(self, @configuration.cache) : ApiOperator.new(self)
99
+ end
100
+
101
+ #@private
102
+ def add_default_parameters(parameters)
103
+ params = parameters
104
+ default_parameters.each do |name, value|
105
+ params[name] ||= value
106
+ end
107
+ params
108
+ end
109
+
110
+
111
+ end
112
+
113
+ end
@@ -1,86 +1,86 @@
1
- require 'ostruct'
2
- require 'yaml'
3
-
4
- module Sevendigital
5
-
6
- DEFAULT_CONFIGURATION = {
7
- :api_url => "api.7digital.com",
8
- :api_version => "1.2",
9
- :media_api_url => "media-eu.7digital.com",
10
- :media_api_version => "media",
11
- :account_api_url => "account.7digital.com",
12
- :account_api_version => "web"
13
- }.freeze
14
-
15
- class ClientConfiguration < OpenStruct
16
-
17
- def initialize(*args)
18
-
19
- super()
20
-
21
- self.override_with(Sevendigital::DEFAULT_CONFIGURATION)
22
-
23
- self.override_with(default_configuration_file)
24
-
25
- args.each do |configuration_argument|
26
- self.override_with(configuration_argument)
27
- end
28
- #puts "Now: #{self.inspect}"
29
-
30
- end
31
-
32
- def override_with(configuration)
33
- #puts "Now: #{self.inspect}"
34
- #puts "Overriding with #{configuration.class}: #{configuration.inspect}"
35
- return self unless configuration
36
- if configuration.kind_of? Hash then
37
- table.merge!(configuration)
38
- return self
39
- end
40
- if configuration.kind_of? OpenStruct then
41
- table.merge!(configuration.marshal_dump)
42
- return self
43
- end
44
- if (configuration.kind_of? String) && is_it_yml_file?(configuration) then
45
- table.merge!(load_configuration_from_yml(configuration, current_environment))
46
- return self
47
- end
48
-
49
- end
50
-
51
- def default_configuration_file
52
- return nil unless defined?(RAILS_ROOT)
53
- "#{RAILS_ROOT}/config/sevendigital.yml"
54
- end
55
-
56
- def current_environment
57
- defined?(RAILS_ENV) ? RAILS_ENV : nil
58
- end
59
-
60
- def load_configuration_from_yml(file_name, environment=nil)
61
- plain_settings = transform_keys_to_symbols(YAML.load_file(file_name))
62
- if (plain_settings[:common] || (environment && plain_settings[environment.to_sym])) then
63
- environment_settings = plain_settings[:common] || {}
64
- environment_settings.update(plain_settings[environment.to_sym]) if environment
65
- environment_settings
66
- else
67
- plain_settings
68
- end
69
- end
70
-
71
- private
72
-
73
- def is_it_yml_file?(file_name)
74
- file_name.include?('.yml')
75
- end
76
-
77
- def transform_keys_to_symbols(hash)
78
- return hash if not hash.is_a?(Hash)
79
- new_hash = hash.inject({}){|memo,(k,v)| memo[k.to_sym] = transform_keys_to_symbols(v); memo}
80
- return new_hash
81
- end
82
-
83
-
84
- end
85
-
86
- end
1
+ require 'ostruct'
2
+ require 'yaml'
3
+
4
+ module Sevendigital
5
+
6
+ DEFAULT_CONFIGURATION = {
7
+ :api_url => "api.7digital.com",
8
+ :api_version => "1.2",
9
+ :media_api_url => "media-eu.7digital.com",
10
+ :media_api_version => "media",
11
+ :account_api_url => "account.7digital.com",
12
+ :account_api_version => "web"
13
+ }.freeze
14
+
15
+ class ClientConfiguration < OpenStruct
16
+
17
+ def initialize(*args)
18
+
19
+ super()
20
+
21
+ self.override_with(Sevendigital::DEFAULT_CONFIGURATION)
22
+
23
+ self.override_with(default_configuration_file)
24
+
25
+ args.each do |configuration_argument|
26
+ self.override_with(configuration_argument)
27
+ end
28
+ #puts "Now: #{self.inspect}"
29
+
30
+ end
31
+
32
+ def override_with(configuration)
33
+ #puts "Now: #{self.inspect}"
34
+ #puts "Overriding with #{configuration.class}: #{configuration.inspect}"
35
+ return self unless configuration
36
+ if configuration.kind_of? Hash then
37
+ table.merge!(configuration)
38
+ return self
39
+ end
40
+ if configuration.kind_of? OpenStruct then
41
+ table.merge!(configuration.marshal_dump)
42
+ return self
43
+ end
44
+ if (configuration.kind_of? String) && is_it_yml_file?(configuration) then
45
+ table.merge!(load_configuration_from_yml(configuration, current_environment))
46
+ return self
47
+ end
48
+
49
+ end
50
+
51
+ def default_configuration_file
52
+ return nil unless defined?(Rails.root)
53
+ Rails.root.join('config', 'sevendigital.yml').to_s
54
+ end
55
+
56
+ def current_environment
57
+ defined?(Rails.env) ? Rails.env : nil
58
+ end
59
+
60
+ def load_configuration_from_yml(file_name, environment=nil)
61
+ plain_settings = transform_keys_to_symbols(YAML.load_file(file_name))
62
+ if (plain_settings[:common] || (environment && plain_settings[environment.to_sym])) then
63
+ environment_settings = plain_settings[:common] || {}
64
+ environment_settings.update(plain_settings[environment.to_sym]) if environment
65
+ environment_settings
66
+ else
67
+ plain_settings
68
+ end
69
+ end
70
+
71
+ private
72
+
73
+ def is_it_yml_file?(file_name)
74
+ file_name.include?('.yml')
75
+ end
76
+
77
+ def transform_keys_to_symbols(hash)
78
+ return hash if not hash.is_a?(Hash)
79
+ new_hash = hash.inject({}){|memo,(k,v)| memo[k.to_sym] = transform_keys_to_symbols(v); memo}
80
+ new_hash
81
+ end
82
+
83
+
84
+ end
85
+
86
+ end