7digital 0.0.5 → 0.0.6

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