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,7 +1,7 @@
1
- module Sevendigital
2
-
3
- class Tag
4
- attr_accessor :id, :text, :url, :count
5
- end
6
-
7
- end
1
+ module Sevendigital
2
+
3
+ class Tag
4
+ attr_accessor :id, :text, :url, :count
5
+ end
6
+
7
+ end
@@ -1,29 +1,84 @@
1
- module Sevendigital
2
-
3
- class Track < SevendigitalObject
4
- attr_accessor :id, :title, :version, :release, :artist
5
-
6
- sevendigital_basic_property :track_number,:duration, :explicit_content, :isrc, :url, :price
7
-
8
- def get_details(options={})
9
- track_with_details = @api_client.track.get_details_from_release(@id, @release.id, options)
10
- copy_basic_properties_from(track_with_details)
11
- end
12
-
13
- def short_title
14
- # return title.gsub(/\s+[\(\[](album|lp|single|short|edit|radio)\s+version[\)\]]/ , "")
15
- return title.gsub(/\s+\(.*\s?(version|mix|remix|edit|edition|live|feat|explicit|original|remaster)\s?.*\)/i, "")
16
- end
17
-
18
- def alternate_version_of?(another_track)
19
- return another_track && short_title.downcase == another_track.short_title.downcase \
20
- && another_track.artist && artist.name.downcase == another_track.artist.name.downcase
21
- end
22
-
23
- def preview_url(options={})
24
- #url = "http://previews.7digital.com/clips/34/#{id}.clip.mp3"
25
- @api_client.track.build_preview_url(@id, options)
26
- end
27
-
28
- end
1
+ module Sevendigital
2
+
3
+ class Track < SevendigitalObject
4
+
5
+ #track id
6
+ #@return [Integer]
7
+ attr_accessor :id
8
+
9
+ #title of the track
10
+ #@return [String]
11
+ attr_accessor :title
12
+
13
+ #version of the track (e.g. remix, radio edit)
14
+ #@return [String]
15
+ attr_accessor :version
16
+
17
+ #release the track appears on
18
+ #@return [Release]
19
+ attr_accessor :release
20
+
21
+ #Artist of the track
22
+ #@return [Artist]
23
+ attr_accessor :artist
24
+
25
+ #Number of the track as it appears on the release
26
+ #@return [Integer]
27
+ sevendigital_basic_property :track_number
28
+
29
+ #The length of the track in seconds
30
+ #@return [Integer]
31
+ sevendigital_basic_property :duration
32
+
33
+ #parental advisory - explicit content tag
34
+ #@return [Boolean]
35
+ sevendigital_basic_property :explicit_content
36
+
37
+ #ISRC code
38
+ #@return [String]
39
+ sevendigital_basic_property :isrc
40
+
41
+ #URL link to 7digital page where this track can be purchased
42
+ #@return [String]
43
+ sevendigital_basic_property :url
44
+
45
+ #Pricing information of the track
46
+ #@return [Price]
47
+ sevendigital_basic_property :price
48
+
49
+ #Retrieves and populates all track properties
50
+ #
51
+ #useful with lazy loading turned off
52
+ #@param [Hash] options optional hash of additional API parameters, e.g. image_size => 75, etc
53
+ #@return [Track]
54
+ def get_details(options={})
55
+ track_with_details = @api_client.track.get_details_from_release(@id, @release.id, options)
56
+ copy_basic_properties_from(track_with_details)
57
+ self
58
+ end
59
+
60
+ #Title of the track stripped out of any version information if it's included the title of the track rather than version property
61
+ #e.g. if title is "Some Song (Radio Edit)" it will return "Some Song"
62
+ #@return [String]
63
+ def short_title
64
+ # return title.gsub(/\s+[\(\[](album|lp|single|short|edit|radio)\s+version[\)\]]/ , "")
65
+ return title.gsub(/\s+\(.*\s?(version|mix|remix|edit|edition|live|feat|explicit|original|remaster)\s?.*\)/i, "")
66
+ end
67
+
68
+ #Compares 2 songs whether they're just different versions of the same song by the same artist
69
+ #e.g. track "Some Song (Radio Edit)" is alternate version of "Some Song (Remastered)"
70
+ #returns true also if the 2 songs are the same
71
+ #@return [Boolean]
72
+ def alternate_version_of?(another_track)
73
+ return another_track && short_title.downcase == another_track.short_title.downcase \
74
+ && another_track.artist && artist.name.downcase == another_track.artist.name.downcase
75
+ end
76
+
77
+ #URL of mp3 preview for this track
78
+ #@return [String]
79
+ def preview_url(options={})
80
+ @api_client.track.build_preview_url(@id, options)
81
+ end
82
+
83
+ end
29
84
  end
@@ -1,34 +1,64 @@
1
- module Sevendigital
2
-
3
- class User < SevendigitalObject
4
-
5
- attr_accessor :oauth_access_token
6
-
7
- sevendigital_extended_property :locker
8
-
9
- def authenticated?
10
- return !@oauth_access_token.nil?
11
- end
12
-
13
- def get_locker(options={})
14
- raise Sevendigital::SevendigitalError if !authenticated?
15
- @api_client.user.get_locker(@oauth_access_token, options)
16
- end
17
-
18
- def purchase!(release_id, track_id, price, options={})
19
- raise Sevendigital::SevendigitalError if !authenticated?
20
- @api_client.user.purchase(release_id, track_id, price, @oauth_access_token, options)
21
- end
22
-
23
- def stream_track_url(release_id, track_id, options={})
24
- raise Sevendigital::SevendigitalError if !authenticated?
25
- @api_client.user.get_stream_track_url(release_id, track_id, @oauth_access_token, options)
26
- end
27
-
28
- def add_card_url(return_url, options={})
29
- raise Sevendigital::SevendigitalError if !authenticated?
30
- @api_client.user.get_add_card_url(return_url, @oauth_access_token, options)
31
- end
32
-
33
- end
1
+ module Sevendigital
2
+
3
+ class User < SevendigitalObject
4
+
5
+ attr_accessor :oauth_access_token, :id, :type, :email_address
6
+
7
+ sevendigital_extended_property :locker
8
+
9
+ sevendigital_extended_property :cards
10
+
11
+ def authenticated?
12
+ return !@oauth_access_token.nil?
13
+ end
14
+
15
+ def get_locker(options={})
16
+ raise Sevendigital::SevendigitalError if !authenticated?
17
+ @api_client.user.get_locker(@oauth_access_token, options)
18
+ end
19
+
20
+ def get_cards(options={})
21
+ raise Sevendigital::SevendigitalError if !authenticated?
22
+ @api_client.user_payment_card.get_card_list(@oauth_access_token, options)
23
+ end
24
+
25
+ def add_card(card_number, card_type, card_holder_name, card_start_date, card_expiry_date, card_issue_number,
26
+ card_verification_code, card_post_code, card_country, options={})
27
+ raise Sevendigital::SevendigitalError if !authenticated?
28
+ @api_client.user_payment_card.add_card(card_number, card_type, card_holder_name, card_start_date, card_expiry_date, card_issue_number,
29
+ card_verification_code, card_post_code, card_country, @oauth_access_token, options)
30
+ end
31
+
32
+ def select_card(card_id, options={})
33
+ raise Sevendigital::SevendigitalError if !authenticated?
34
+ @api_client.user_payment_card.select_card(card_id, @oauth_access_token, options)
35
+ end
36
+
37
+ # <b>DEPRECATED:</b> Please use <tt>purchase_item!</tt> instead.
38
+ def purchase!(release_id, track_id, price, token, options={})
39
+ warn "[DEPRECATION] `purchase!` is deprecated. Please use 'purchase_item!' instead."
40
+ purchase_item!(release_id, track_id, price, options={})
41
+ end
42
+
43
+ def purchase_item!(release_id, track_id, price, options={})
44
+ raise Sevendigital::SevendigitalError if !authenticated?
45
+ @api_client.user.purchase_item(release_id, track_id, price, @oauth_access_token, options)
46
+ end
47
+
48
+ def purchase_basket!(basket_id, options={})
49
+ raise Sevendigital::SevendigitalError if !authenticated?
50
+ @api_client.user.purchase_basket(basket_id, @oauth_access_token, options)
51
+ end
52
+
53
+ def stream_track_url(release_id, track_id, options={})
54
+ raise Sevendigital::SevendigitalError if !authenticated?
55
+ @api_client.user.get_stream_track_url(release_id, track_id, @oauth_access_token, options)
56
+ end
57
+
58
+ def add_card_url(return_url, options={})
59
+ raise Sevendigital::SevendigitalError if !authenticated?
60
+ @api_client.user.get_add_card_url(return_url, @oauth_access_token, options)
61
+ end
62
+
63
+ end
34
64
  end
@@ -1,23 +1,24 @@
1
- begin
2
- require "will_paginate/collection"
3
- rescue LoadError
4
- end
5
-
6
- module Sevendigital
7
-
8
- #internal class used to page array results if will_paginate is available
9
- class Pager # :nodoc:
10
-
11
- attr_accessor :page, :page_size, :total_items
12
-
13
- def paginate_list(list)
14
- return list unless defined?(WillPaginate)
15
- paged_list = WillPaginate::Collection.create(@page, @page_size, @total_items) do |pager|
16
- pager.replace(list)
17
- end
18
- return paged_list
19
- end
20
-
21
- end
22
-
1
+ begin
2
+ require "will_paginate/collection"
3
+ rescue LoadError
4
+ end
5
+
6
+ module Sevendigital
7
+
8
+ #@private
9
+ #internal class used to page array results if will_paginate is available
10
+ class Pager # :nodoc:
11
+
12
+ attr_accessor :page, :page_size, :total_items
13
+
14
+ def paginate_list(list)
15
+ return list unless defined?(WillPaginate)
16
+ paged_list = WillPaginate::Collection.create(@page, @page_size, @total_items) do |pager|
17
+ pager.replace(list)
18
+ end
19
+ return paged_list
20
+ end
21
+
22
+ end
23
+
23
24
  end
@@ -0,0 +1,9 @@
1
+ module Peachy
2
+ class MethodName
3
+
4
+ # let's also allow numbers and trailing underscores in element(method) names
5
+ def matches_convention?
6
+ @method_name =~ /^[a-z0-9]+(?:[_a-z0-9]+)*(?:NS[a-z0-9]+(?:[_a-z0-9]+)*)?$/
7
+ end
8
+ end
9
+ end
@@ -1,28 +1,28 @@
1
- module Sevendigital
2
-
3
- #internal class used to ensure the XML being processed is a Peachy::Proxy object
4
- #if not it checks the expected element name matches the supplied XML string and converts it to Peachy::Proxy
5
- class ProxyPolice # :nodoc:
6
-
7
- def ProxyPolice.ensure_is_proxy(xml_or_proxy, element_name)
8
- if xml_or_proxy.kind_of? Peachy::Proxy then
9
- return xml_or_proxy
10
- else
11
- return ProxyPolice.create_release_proxy(xml_or_proxy, element_name)
12
- end
13
- end
14
-
15
- def ProxyPolice.create_release_proxy(xml, element_name)
16
- #TODO don't use eval
17
- parent_proxy = Peachy::Proxy.new(xml)
18
- if element_name
19
- # parent_proxy.send(element_name)
20
- puts element_name.to_s
21
- eval "parent_proxy.#{element_name.to_s}"
22
- else
23
- parent_proxy
24
- end
25
- end
26
-
27
- end
1
+ module Sevendigital
2
+
3
+ #@private
4
+ #internal class used to ensure the XML being processed is a Peachy::Proxy object
5
+ #if not it checks the expected element name matches the supplied XML string and converts it to Peachy::Proxy
6
+ class ProxyPolice # :nodoc:
7
+
8
+ def ProxyPolice.ensure_is_proxy(xml_or_proxy, element_name)
9
+ if xml_or_proxy.kind_of?(Peachy::Proxy) || xml_or_proxy.kind_of?(Peachy::SimpleContent) then
10
+ return xml_or_proxy
11
+ else
12
+ return ProxyPolice.create_release_proxy(xml_or_proxy, element_name)
13
+ end
14
+ end
15
+
16
+ def ProxyPolice.create_release_proxy(xml, element_name)
17
+ #TODO don't use eval
18
+ parent_proxy = Peachy::Proxy.new(xml)
19
+ if element_name
20
+ # parent_proxy.send(element_name)
21
+ eval "parent_proxy.#{element_name.to_s}"
22
+ else
23
+ parent_proxy
24
+ end
25
+ end
26
+
27
+ end
28
28
  end
@@ -1,5 +1,5 @@
1
- module Sevendigital
2
- # The version of the gem
3
- NAME = "7digital"
4
- VERSION = '0.0.5'
5
- end
1
+ module Sevendigital
2
+ # The version of the gem
3
+ NAME = "7digital"
4
+ VERSION = '0.0.6'
5
+ end
@@ -1,103 +1,179 @@
1
- require "spec_helper"
2
- require 'ostruct'
3
-
4
- describe "ApiOperatorCached" do
5
-
6
- before do
7
- @client = stub(Sevendigital::Client)
8
- @client.stub!(:verbose?).and_return(false)
9
- @client.stub!(:very_verbose?).and_return(false)
10
- @cache = stub(Hash)
11
- @cached_operator = Sevendigital::ApiOperatorCached.new(@client, @cache)
12
- @stub_api_request = stub_api_request()
13
- end
14
-
15
- it "should not look into cache if request requires signature" do
16
- @stub_api_request.stub!(:requires_signature?).and_return(true)
17
- @cached_operator.stub(:create_request_uri).and_return("key")
18
- @cache.stub!(:get).with("key").and_return(nil)
19
- @cached_operator.should_receive(:make_http_request_and_digest).with(@stub_api_request).and_return(stub_api_response())
20
- @cached_operator.call_api(@stub_api_request)
21
- end
22
-
23
- it "should not make an http request if response already in cache " do
24
- @cached_operator.stub(:create_request_uri).and_return("key")
25
- @cache.stub!(:get).with("key").and_return(stub_api_response())
26
- @cached_operator.should_not_receive(:make_http_request_and_digest)
27
- @cached_operator.call_api(@stub_api_request)
28
- end
29
-
30
- it "should make an http request if cached response is out of date " do
31
-
32
- expired_response = stub_api_response()
33
- expired_response.stub!(:out_of_date?).and_return(true)
34
-
35
- @cached_operator.stub(:create_request_uri).and_return("key")
36
- @cache.stub!(:get).with("key").and_return(expired_response)
37
- @cache.stub!(:set).and_return(nil)
38
- @cached_operator.should_receive(:make_http_request_and_digest)
39
- @cached_operator.call_api(@stub_api_request)
40
- end
41
-
42
- it "should make an http request if response not yet in cache and return the result " do
43
- api_response = stub_api_response()
44
-
45
- @cached_operator.stub(:create_request_uri).and_return("key")
46
- @cache.stub!(:get).with("key").and_return(nil)
47
- @cache.stub!(:set).and_return(nil)
48
- @cached_operator.should_receive(:make_http_request_and_digest).with(@stub_api_request).and_return(api_response)
49
-
50
- response = @cached_operator.call_api(@stub_api_request)
51
- response.should == api_response
52
- end
53
-
54
- it "should cache uncached api response if request was not signed" do
55
- api_response = stub_api_response()
56
-
57
- @cached_operator.stub(:create_request_uri).and_return("key")
58
- @cache.stub!(:get).with("key").and_return(nil)
59
- @cached_operator.stub!(:make_http_request_and_digest).and_return(api_response)
60
-
61
- @cache.should_receive(:set).with("key", api_response).and_return(nil)
62
- response = @cached_operator.call_api(@stub_api_request)
63
- end
64
-
65
- it "should not cache api response if request was signed" do
66
- api_response = stub_api_response()
67
- @stub_api_request.stub!(:requires_signature?).and_return(true)
68
-
69
- @cached_operator.stub(:create_request_uri).and_return("key")
70
- @cache.stub!(:get).with("key").and_return(nil)
71
- @cached_operator.stub!(:make_http_request_and_digest).and_return(api_response)
72
-
73
- @cache.should_not_receive(:set)
74
- response = @cached_operator.call_api(@stub_api_request)
75
- end
76
-
77
- def fake_http_response
78
- return Net::HTTP.new("1.1", 200, "response_body")
79
- end
80
-
81
- def stub_time(time)
82
- Time.stub!(:now).and_return(time)
83
- end
84
-
85
- def stub_api_response
86
- api_response = stub(Sevendigital::ApiResponse)
87
- api_response.stub!(:out_of_date?).and_return(false)
88
- api_response
89
- end
90
-
91
- def stub_api_request
92
- api_request = stub(Sevendigital::ApiRequest)
93
-
94
- api_request.stub!(:parameters).and_return({})
95
- api_request.stub!(:api_service).and_return(nil)
96
- api_request.stub!(:api_method).and_return("m")
97
- api_request.stub!(:requires_signature?).and_return(false)
98
- api_request.stub!(:requires_secure_connection?).and_return(false)
99
- api_request.stub!(:ensure_country_is_set)
100
- return api_request
101
- end
102
-
1
+ require "spec_helper"
2
+ require 'ostruct'
3
+
4
+ describe "ApiOperatorCached" do
5
+
6
+ before do
7
+ @client = stub(Sevendigital::Client)
8
+ @client.stub!(:verbose?).and_return(false)
9
+ @client.stub!(:very_verbose?).and_return(false)
10
+ @cache = stub(Hash)
11
+ @cached_operator = Sevendigital::ApiOperatorCached.new(@client, @cache)
12
+ @stub_api_request = stub_api_request()
13
+ end
14
+
15
+ it "should not look into cache if request requires signature" do
16
+ http_response = stub_http_response
17
+ @stub_api_request.stub!(:requires_signature?).and_return(true)
18
+ @cached_operator.stub(:create_request_uri).and_return("key")
19
+ @cache.should_not_receive(:get)
20
+ @cached_operator.should_receive(:make_http_request).with(@stub_api_request).and_return(http_response)
21
+ @cached_operator.should_receive(:digest_http_response).with(http_response)
22
+ @cached_operator.call_api(@stub_api_request)
23
+ end
24
+
25
+ it "should not cache api response if request was signed" do
26
+
27
+ http_response = stub_http_response
28
+ @stub_api_request.stub!(:requires_signature?).and_return(true)
29
+ @cached_operator.stub(:create_request_uri).and_return("key")
30
+
31
+ @cached_operator.stub!(:make_http_request).and_return(http_response)
32
+ @cached_operator.stub!(:digest_http_response)
33
+ @cache.should_not_receive(:set)
34
+ @cached_operator.call_api(@stub_api_request)
35
+ end
36
+
37
+ it "should not make an http request if response already in cache and not out of date " do
38
+ http_response = stub_http_response
39
+ @cached_operator.stub(:create_request_uri).and_return("key")
40
+ @cache.stub!(:get).with("key").and_return(http_response)
41
+ @cached_operator.stub!(:response_out_of_date?).with(http_response).and_return(false)
42
+ @cached_operator.should_not_receive(:make_http_request)
43
+ @cached_operator.should_receive(:digest_http_response).with(http_response)
44
+ @cached_operator.call_api(@stub_api_request)
45
+ end
46
+
47
+ it "should make an http request if cached response is out of date " do
48
+
49
+ expired_http_response = stub_http_response
50
+ fresh_http_response = stub_http_response
51
+ @cached_operator.stub(:create_request_uri).and_return("key")
52
+ @cache.stub!(:get).with("key").and_return(expired_http_response)
53
+ @cached_operator.stub!(:response_out_of_date?).with(expired_http_response).and_return(true)
54
+
55
+ @cache.stub!(:set).and_return(nil)
56
+ @cached_operator.should_receive(:make_http_request).and_return(fresh_http_response)
57
+ @cached_operator.should_receive(:digest_http_response).with(fresh_http_response)
58
+ @cached_operator.call_api(@stub_api_request)
59
+ end
60
+
61
+ it "should make an http request if response not yet in cache, digest it and return the result " do
62
+ api_response = stub_api_response()
63
+ http_response = fake_http_response()
64
+
65
+ @cached_operator.stub(:create_request_uri).and_return("key")
66
+ @cache.stub!(:get).with("key").and_return(nil)
67
+ @cache.stub!(:set).and_return(nil)
68
+ @cached_operator.should_receive(:make_http_request).with(@stub_api_request).and_return(http_response)
69
+ @cached_operator.should_receive(:digest_http_response).with(http_response).and_return(api_response)
70
+
71
+ response = @cached_operator.call_api(@stub_api_request)
72
+ response.should == api_response
73
+ end
74
+
75
+ it "should cache uncached api response if request was not signed" do
76
+ http_response = stub_http_response()
77
+
78
+ @cached_operator.stub(:create_request_uri).and_return("key")
79
+ @cache.stub!(:get).with("key").and_return(nil)
80
+ @cached_operator.stub!(:make_http_request).and_return(http_response)
81
+ @cached_operator.stub!(:digest_http_response)
82
+
83
+ @cache.should_receive(:set).with("key", http_response).and_return(nil)
84
+ @cached_operator.call_api(@stub_api_request)
85
+ end
86
+
87
+ it "response should be out of date if it's past its cache max age" do
88
+ now = Time.now.utc
89
+ yesterday = now - 24*60*60
90
+ max_age = 12*60*60
91
+
92
+ http_response = stub_http_response
93
+ http_response.stub!(:header).and_return({
94
+ "cache-control" => "private, max-age=#{max_age}",
95
+ "Date" => yesterday.httpdate
96
+ })
97
+
98
+ @cached_operator.response_out_of_date?(http_response, now).should == true
99
+
100
+ end
101
+
102
+
103
+ it "response should not be out of date if it's within its cache max age" do
104
+ now = Time.now.utc
105
+ yesterday = now - 24*60*60
106
+ max_age = 48*60*60
107
+
108
+ http_response = stub_http_response
109
+ http_response.stub!(:header).and_return({
110
+ "cache-control" => "private, max-age=#{max_age}",
111
+ "Date" => yesterday.httpdate
112
+ })
113
+
114
+ @cached_operator.response_out_of_date?(http_response, now).should == false
115
+
116
+ end
117
+
118
+ it "response should be out of date if it is missing caching headers" do
119
+
120
+ http_response = stub_http_response
121
+ http_response.stub!(:header).and_return({})
122
+ @cached_operator.response_out_of_date?(http_response, Time.now.utc).should == true
123
+
124
+ http_response.stub!(:header).and_return({
125
+ "Date" => Time.now.utc.httpdate
126
+ })
127
+ @cached_operator.response_out_of_date?(http_response, Time.now.utc).should == true
128
+
129
+ end
130
+
131
+ it "response should be out of date if no max-age has been specified" do
132
+
133
+ http_response = stub_http_response
134
+ http_response.stub!(:header).and_return({"cache-control" => "no-cache", "Date" => Time.now.utc.httpdate})
135
+ @cached_operator.response_out_of_date?(http_response, Time.now.utc).should == true
136
+
137
+ end
138
+
139
+ it "response should be out of date if it is missing Date header" do
140
+
141
+ http_response = stub_http_response
142
+ http_response.stub!(:header).and_return({"cache-control" => "private, max-age=#{2**30}"})
143
+ @cached_operator.response_out_of_date?(http_response, Time.now.utc).should == true
144
+
145
+ end
146
+
147
+
148
+ def fake_http_response
149
+ return Net::HTTP.new("1.1", 200, "response_body")
150
+ end
151
+
152
+ def stub_http_response
153
+ http_response = stub(Net::HTTP)
154
+ http_response
155
+ end
156
+
157
+ def stub_time(time)
158
+ Time.stub!(:now).and_return(time)
159
+ end
160
+
161
+ def stub_api_response
162
+ api_response = stub(Sevendigital::ApiResponse)
163
+ api_response.stub!(:out_of_date?).and_return(false)
164
+ api_response
165
+ end
166
+
167
+ def stub_api_request
168
+ api_request = stub(Sevendigital::ApiRequest)
169
+
170
+ api_request.stub!(:parameters).and_return({})
171
+ api_request.stub!(:api_service).and_return(nil)
172
+ api_request.stub!(:api_method).and_return("m")
173
+ api_request.stub!(:requires_signature?).and_return(false)
174
+ api_request.stub!(:requires_secure_connection?).and_return(false)
175
+ api_request.stub!(:ensure_country_is_set)
176
+ return api_request
177
+ end
178
+
103
179
  end