7digital 0.0.2 → 0.0.5

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 (220) hide show
  1. data/README.rdoc +132 -5
  2. data/lib/sevendigital.rb +1 -2
  3. data/lib/sevendigital/api_operator.rb +103 -12
  4. data/lib/sevendigital/api_operator_cached.rb +14 -8
  5. data/lib/sevendigital/api_request.rb +50 -9
  6. data/lib/sevendigital/client.rb +51 -89
  7. data/lib/sevendigital/client_configuration.rb +86 -0
  8. data/lib/sevendigital/client_digestors.rb +79 -0
  9. data/lib/sevendigital/client_managers.rb +34 -0
  10. data/lib/sevendigital/digestion_tract/api_response_digestor.rb +8 -3
  11. data/lib/sevendigital/digestion_tract/artist_digestor.rb +1 -1
  12. data/lib/sevendigital/digestion_tract/basket_digestor.rb +18 -0
  13. data/lib/sevendigital/digestion_tract/basket_item_digestor.rb +25 -0
  14. data/lib/sevendigital/digestion_tract/chart_item_digestor.rb +1 -1
  15. data/lib/sevendigital/digestion_tract/digestor.rb +7 -3
  16. data/lib/sevendigital/digestion_tract/download_url_digestor.rb +19 -0
  17. data/lib/sevendigital/digestion_tract/format_digestor.rb +1 -1
  18. data/lib/sevendigital/digestion_tract/label_digestor.rb +1 -1
  19. data/lib/sevendigital/digestion_tract/locker_digestor.rb +17 -0
  20. data/lib/sevendigital/digestion_tract/locker_release_digestor.rb +19 -0
  21. data/lib/sevendigital/digestion_tract/locker_track_digestor.rb +21 -0
  22. data/lib/sevendigital/digestion_tract/oauth_access_token_digestor.rb +14 -0
  23. data/lib/sevendigital/digestion_tract/oauth_request_token_digestor.rb +14 -0
  24. data/lib/sevendigital/digestion_tract/pager_digestor.rb +1 -1
  25. data/lib/sevendigital/digestion_tract/price_digestor.rb +3 -3
  26. data/lib/sevendigital/digestion_tract/release_digestor.rb +1 -1
  27. data/lib/sevendigital/digestion_tract/tag_digestor.rb +22 -0
  28. data/lib/sevendigital/digestion_tract/track_digestor.rb +1 -1
  29. data/lib/sevendigital/management/artist_manager.rb +71 -34
  30. data/lib/sevendigital/management/basket_manager.rb +29 -0
  31. data/lib/sevendigital/management/manager.rb +1 -1
  32. data/lib/sevendigital/management/oauth_manager.rb +23 -0
  33. data/lib/sevendigital/management/release_manager.rb +7 -14
  34. data/lib/sevendigital/management/tag_manager.rb +11 -0
  35. data/lib/sevendigital/management/track_manager.rb +9 -9
  36. data/lib/sevendigital/management/user_manager.rb +51 -0
  37. data/lib/sevendigital/model/api_response.rb +19 -3
  38. data/lib/sevendigital/model/artist.rb +27 -9
  39. data/lib/sevendigital/model/basket.rb +16 -0
  40. data/lib/sevendigital/model/basket_item.rb +15 -0
  41. data/lib/sevendigital/model/download_url.rb +7 -0
  42. data/lib/sevendigital/model/format.rb +0 -2
  43. data/lib/sevendigital/model/label.rb +1 -3
  44. data/lib/sevendigital/model/locker.rb +5 -0
  45. data/lib/sevendigital/model/locker_release.rb +9 -0
  46. data/lib/sevendigital/model/locker_track.rb +9 -0
  47. data/lib/sevendigital/model/price.rb +0 -2
  48. data/lib/sevendigital/model/release.rb +22 -8
  49. data/lib/sevendigital/model/sevendigital_error.rb +9 -1
  50. data/lib/sevendigital/model/sevendigital_object.rb +16 -11
  51. data/lib/sevendigital/model/tag.rb +7 -0
  52. data/lib/sevendigital/model/track.rb +4 -4
  53. data/lib/sevendigital/model/user.rb +34 -0
  54. data/lib/sevendigital/pager.rb +8 -2
  55. data/lib/sevendigital/proxy_police.rb +5 -1
  56. data/lib/sevendigital/version.rb +5 -0
  57. data/spec/api_operator_cached_spec.rb +62 -7
  58. data/spec/api_operator_spec.rb +245 -21
  59. data/spec/api_request_spec.rb +20 -15
  60. data/spec/client_configuration_spec.rb +75 -0
  61. data/spec/client_spec.rb +126 -48
  62. data/spec/coverage/assets/0.3.9/app.js +66 -0
  63. data/spec/coverage/assets/0.3.9/fancybox/blank.gif +0 -0
  64. data/spec/coverage/assets/0.3.9/fancybox/fancy_close.png +0 -0
  65. data/spec/coverage/assets/0.3.9/fancybox/fancy_loading.png +0 -0
  66. data/spec/coverage/assets/0.3.9/fancybox/fancy_nav_left.png +0 -0
  67. data/spec/coverage/assets/0.3.9/fancybox/fancy_nav_right.png +0 -0
  68. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_e.png +0 -0
  69. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_n.png +0 -0
  70. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_ne.png +0 -0
  71. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_nw.png +0 -0
  72. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_s.png +0 -0
  73. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_se.png +0 -0
  74. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_sw.png +0 -0
  75. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_w.png +0 -0
  76. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_left.png +0 -0
  77. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_main.png +0 -0
  78. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_over.png +0 -0
  79. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_right.png +0 -0
  80. data/spec/coverage/assets/0.3.9/fancybox/fancybox-x.png +0 -0
  81. data/spec/coverage/assets/0.3.9/fancybox/fancybox-y.png +0 -0
  82. data/spec/coverage/assets/0.3.9/fancybox/fancybox.png +0 -0
  83. data/spec/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.css +363 -0
  84. data/spec/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.pack.js +44 -0
  85. data/spec/coverage/assets/0.3.9/favicon.png +0 -0
  86. data/spec/coverage/assets/0.3.9/jquery-1.4.2.min.js +155 -0
  87. data/spec/coverage/assets/0.3.9/jquery.dataTables.min.js +152 -0
  88. data/spec/coverage/assets/0.3.9/jquery.timeago.js +141 -0
  89. data/spec/coverage/assets/0.3.9/jquery.url.js +174 -0
  90. data/spec/coverage/assets/0.3.9/loading.gif +0 -0
  91. data/spec/coverage/assets/0.3.9/magnify.png +0 -0
  92. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  93. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  94. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  95. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  96. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  97. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  98. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  99. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  100. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_222222_256x240.png +0 -0
  101. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  102. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_454545_256x240.png +0 -0
  103. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_888888_256x240.png +0 -0
  104. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  105. data/spec/coverage/assets/0.3.9/smoothness/jquery-ui-1.8.4.custom.css +295 -0
  106. data/spec/coverage/assets/0.3.9/stylesheet.css +341 -0
  107. data/spec/coverage/index.html +43412 -0
  108. data/spec/coverage/resultset.yml +3251 -0
  109. data/spec/data/configuration_override.yml +2 -1
  110. data/spec/digestion_tract/api_response_digestor_spec.rb +15 -1
  111. data/spec/digestion_tract/artist_digestor_spec.rb +3 -3
  112. data/spec/digestion_tract/basket_digestor_spec.rb +32 -0
  113. data/spec/digestion_tract/basket_item_digestor_spec.rb +58 -0
  114. data/spec/digestion_tract/chart_digestor_spec.rb +2 -2
  115. data/spec/digestion_tract/download_url_digestor_spec.rb +41 -0
  116. data/spec/digestion_tract/format_digestor_spec.rb +2 -2
  117. data/spec/digestion_tract/label_digestor_spec.rb +2 -2
  118. data/spec/digestion_tract/locker_digestor_spec.rb +31 -0
  119. data/spec/digestion_tract/locker_release_digestor_spec.rb +71 -0
  120. data/spec/digestion_tract/locker_track_digestor_spec.rb +56 -0
  121. data/spec/digestion_tract/oauth_access_token_digestor_spec.rb +35 -0
  122. data/spec/digestion_tract/oauth_request_token_digestor_spec.rb +35 -0
  123. data/spec/digestion_tract/pager_digestor_spec.rb +2 -2
  124. data/spec/digestion_tract/price_digestor_spec.rb +21 -5
  125. data/spec/digestion_tract/release_digestor_spec.rb +2 -2
  126. data/spec/digestion_tract/tag_digestor_spec.rb +46 -0
  127. data/spec/digestion_tract/track_digestor_spec.rb +1 -1
  128. data/spec/management/artist_manager_spec.rb +46 -41
  129. data/spec/management/basket_manager_spec.rb +78 -0
  130. data/spec/management/oauth_manager_spec.rb +73 -0
  131. data/spec/management/release_manager_spec.rb +33 -74
  132. data/spec/management/tag_manager_spec.rb +34 -0
  133. data/spec/management/track_manager_spec.rb +42 -25
  134. data/spec/management/user_manager_spec.rb +163 -0
  135. data/spec/model/api_response_spec.rb +69 -2
  136. data/spec/model/artist_spec.rb +1 -26
  137. data/spec/model/basket_spec.rb +63 -0
  138. data/spec/model/coverage/assets/0.3.9/app.js +66 -0
  139. data/spec/model/coverage/assets/0.3.9/fancybox/blank.gif +0 -0
  140. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_close.png +0 -0
  141. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_loading.png +0 -0
  142. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_nav_left.png +0 -0
  143. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_nav_right.png +0 -0
  144. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_e.png +0 -0
  145. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_n.png +0 -0
  146. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_ne.png +0 -0
  147. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_nw.png +0 -0
  148. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_s.png +0 -0
  149. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_se.png +0 -0
  150. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_sw.png +0 -0
  151. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_w.png +0 -0
  152. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_left.png +0 -0
  153. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_main.png +0 -0
  154. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_over.png +0 -0
  155. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_right.png +0 -0
  156. data/spec/model/coverage/assets/0.3.9/fancybox/fancybox-x.png +0 -0
  157. data/spec/model/coverage/assets/0.3.9/fancybox/fancybox-y.png +0 -0
  158. data/spec/model/coverage/assets/0.3.9/fancybox/fancybox.png +0 -0
  159. data/spec/model/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.css +363 -0
  160. data/spec/model/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.pack.js +44 -0
  161. data/spec/model/coverage/assets/0.3.9/favicon.png +0 -0
  162. data/spec/model/coverage/assets/0.3.9/jquery-1.4.2.min.js +155 -0
  163. data/spec/model/coverage/assets/0.3.9/jquery.dataTables.min.js +152 -0
  164. data/spec/model/coverage/assets/0.3.9/jquery.timeago.js +141 -0
  165. data/spec/model/coverage/assets/0.3.9/jquery.url.js +174 -0
  166. data/spec/model/coverage/assets/0.3.9/loading.gif +0 -0
  167. data/spec/model/coverage/assets/0.3.9/magnify.png +0 -0
  168. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  169. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  170. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  171. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  172. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  173. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  174. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  175. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  176. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_222222_256x240.png +0 -0
  177. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  178. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_454545_256x240.png +0 -0
  179. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_888888_256x240.png +0 -0
  180. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  181. data/spec/model/coverage/assets/0.3.9/smoothness/jquery-ui-1.8.4.custom.css +295 -0
  182. data/spec/model/coverage/assets/0.3.9/stylesheet.css +341 -0
  183. data/spec/model/coverage/index.html +8637 -0
  184. data/spec/model/coverage/resultset.yml +642 -0
  185. data/spec/model/release_spec.rb +15 -14
  186. data/spec/model/sevendigital_object_spec.rb +74 -0
  187. data/spec/model/track_spec.rb +8 -4
  188. data/spec/model/user_spec.rb +98 -0
  189. data/spec/pager_spec.rb +2 -2
  190. data/spec/proxy_police_spec.rb +1 -1
  191. data/spec/spec_helper.rb +11 -3
  192. data/spec/test-xml/methods/artist/browse.xml +22 -0
  193. data/spec/test-xml/methods/artist/chart.xml +31 -0
  194. data/spec/test-xml/methods/basket/additem.xml +24 -0
  195. data/spec/test-xml/methods/basket/create.xml +11 -0
  196. data/spec/test-xml/methods/basket/index.xml +24 -0
  197. data/spec/test-xml/methods/basket/removeitem.xml +11 -0
  198. data/spec/test-xml/methods/oauth/accesstoken.xml +6 -0
  199. data/spec/test-xml/methods/oauth/requesttoken.xml +6 -0
  200. data/spec/test-xml/methods/tag/index.xml +17 -0
  201. data/spec/test-xml/methods/user/locker.xml +50 -0
  202. data/spec/test-xml/methods/user/purchase/item.xml +49 -0
  203. data/spec/test-xml/objects/basket.xml +22 -0
  204. data/spec/test-xml/objects/basket_item.xml +12 -0
  205. data/spec/test-xml/objects/basket_item_list.xml +26 -0
  206. data/spec/test-xml/objects/basket_item_list_empty.xml +2 -0
  207. data/spec/test-xml/objects/download_url.xml +8 -0
  208. data/spec/test-xml/objects/locker.xml +48 -0
  209. data/spec/test-xml/objects/locker_release.xml +41 -0
  210. data/spec/test-xml/objects/locker_release_list.xml +87 -0
  211. data/spec/test-xml/objects/locker_release_list_empty.xml +5 -0
  212. data/spec/test-xml/objects/locker_release_one_item_list.xml +43 -0
  213. data/spec/test-xml/objects/locker_track.xml +25 -0
  214. data/spec/test-xml/objects/locker_track_list.xml +26 -0
  215. data/spec/test-xml/objects/locker_track_list_empty.xml +2 -0
  216. data/spec/test-xml/objects/oauth_access_token.xml +4 -0
  217. data/spec/test-xml/objects/oauth_request_token.xml +4 -0
  218. data/spec/test-xml/objects/tag.xml +5 -0
  219. metadata +395 -13
  220. data/lib/sevendigital/peachy_patch.rb +0 -19
@@ -1,6 +1,6 @@
1
1
  module Sevendigital
2
2
 
3
- class PagerDigestor < Digestor
3
+ class PagerDigestor < Digestor # :nodoc:
4
4
 
5
5
  def default_element_name; :results end
6
6
  def default_list_element_name; nil end
@@ -1,7 +1,7 @@
1
1
  require 'rational'
2
2
  module Sevendigital
3
3
 
4
- class PriceDigestor < Digestor
4
+ class PriceDigestor < Digestor # :nodoc:
5
5
 
6
6
  def default_element_name; :price end
7
7
  def default_list_element_name; nil end
@@ -11,11 +11,11 @@ module Sevendigital
11
11
  price = Sevendigital::Price.new()
12
12
  price.currency_code = price_proxy.currency.code.to_s.upcase.to_sym
13
13
  price.currency_symbol= price_proxy.currency.value
14
- price.value= price_proxy.value.value.to_f
14
+ price.value= price_proxy.value.value.to_f if !price_proxy.value.value.to_s.empty?
15
15
  price.formatted_price= price_proxy.formatted_price.value
16
16
  price.rrp= price_proxy.rrp.value.to_f if price_proxy.rrp
17
17
  price.formatted_rrp= price_proxy.formatted_rrp.value if price_proxy.formatted_rrp
18
- price.on_sale = price_proxy.on_sale.value.to_s.downcase == "true"
18
+ price.on_sale = price_proxy.on_sale.value.to_s.downcase == "true" if price_proxy.on_sale
19
19
 
20
20
  return price
21
21
  end
@@ -2,7 +2,7 @@ module Sevendigital
2
2
 
3
3
  require 'date'
4
4
 
5
- class ReleaseDigestor < Digestor
5
+ class ReleaseDigestor < Digestor # :nodoc:
6
6
 
7
7
  def default_element_name; :release end
8
8
  def default_list_element_name; :releases end
@@ -0,0 +1,22 @@
1
+ module Sevendigital
2
+
3
+ class TagDigestor < Digestor # :nodoc:
4
+
5
+ def default_element_name; :tag end
6
+ def default_list_element_name; :tags end
7
+
8
+ def from_proxy(tag_proxy)
9
+ make_sure_not_eating_nil(tag_proxy)
10
+
11
+ tag = Tag.new()
12
+ tag.id = tag_proxy.id.to_s
13
+ tag.text = tag_proxy.text.value.to_s
14
+ tag.url = tag_proxy.url.value.to_s if value_present?(tag_proxy.url)
15
+ tag.count = tag_proxy.count.value.to_i #if value_present?(tag_proxy.count)
16
+
17
+ return tag
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -1,6 +1,6 @@
1
1
  module Sevendigital
2
2
 
3
- class TrackDigestor < Digestor
3
+ class TrackDigestor < Digestor # :nodoc:
4
4
 
5
5
  def default_element_name; :track end
6
6
  def default_list_element_name; :tracks end
@@ -2,43 +2,80 @@ require "peachy"
2
2
 
3
3
  module Sevendigital
4
4
 
5
+ # provides access to Artist related API methods (artist/*)
5
6
  class ArtistManager < Manager
6
7
 
7
- def get_details(id, options={})
8
- api_request = Sevendigital::ApiRequest.new("artist/details", {:artistId => id}, options)
9
- api_response = @api_client.operator.call_api(api_request)
10
- @api_client.artist_digestor.from_xml(api_response.content.artist)
11
- end
12
-
13
- def get_releases(id, options={})
14
- api_request = Sevendigital::ApiRequest.new("artist/releases", {:artistId => id}, options)
15
- api_response = @api_client.operator.call_api(api_request)
16
- @api_client.release_digestor.list_from_xml(api_response.content.releases)
17
- end
8
+ # calls *artist/details* API method and returns Artist with populated details
9
+ #
10
+ # <tt>artist_id</tt>:: artist ID
11
+ # <tt>options</tt>:: optional hash of additional API parameters, e.g. {page_size => 50}, etc
12
+ def get_details(artist_id, options={})
13
+ api_response = @api_client.make_api_request("artist/details", {:artistId => artist_id}, options)
14
+ @api_client.artist_digestor.from_xml(api_response.content.artist)
15
+ end
16
+
17
+ # calls *artist/releases* API method and returns Release array
18
+ #
19
+ # <tt>artist_id</tt>:: artist ID
20
+ # <tt>options</tt>:: optional hash of additional API parameters, e.g. {page_size => 50}, etc
21
+ def get_releases(artist_id, options={})
22
+ api_response = @api_client.make_api_request("artist/releases", {:artistId => artist_id}, options)
23
+ @api_client.release_digestor.list_from_xml(api_response.content.releases)
24
+ end
18
25
 
19
- def get_top_tracks(id, options={})
20
- api_request = Sevendigital::ApiRequest.new("artist/toptracks", {:artistId => id}, options)
21
- api_response = @api_client.operator.call_api(api_request)
22
- @api_client.track_digestor.list_from_xml(api_response.content.tracks)
23
- end
24
-
25
- def get_similar(id, options={})
26
- api_request = Sevendigital::ApiRequest.new("artist/similar", {:artistId => id}, options)
27
- api_response = @api_client.operator.call_api(api_request)
28
- @api_client.artist_digestor.list_from_xml(api_response.content.artists)
29
- end
30
-
31
- def get_top_by_tag(tags, options={})
32
- api_request = Sevendigital::ApiRequest.new("artist/byTag/top", {:tags => tags}, options)
33
- api_response = @api_client.operator.call_api(api_request)
34
- @api_client.artist_digestor.nested_list_from_xml(api_response.content.tagged_results, :tagged_item, :tagged_results)
35
- end
36
-
37
- def search(query, options={})
38
- api_request = Sevendigital::ApiRequest.new("artist/search", {:q => query}, options)
39
- api_response = @api_client.operator.call_api(api_request)
40
- @api_client.artist_digestor.nested_list_from_xml(api_response.content.search_results, :search_result, :search_results)
41
- end
26
+ # calls *artist/toptracks* API method and returns Track array
27
+ #
28
+ # <tt>artist_id</tt>:: artist ID
29
+ # <tt>options</tt>:: optional hash of additional API parameters, e.g. {page_size => 50}, etc
30
+ def get_top_tracks(artist_id, options={})
31
+ api_response = @api_client.make_api_request("artist/topTracks", {:artistId => artist_id}, options)
32
+ @api_client.track_digestor.list_from_xml(api_response.content.tracks)
33
+ end
34
+
35
+ # calls *artist/similar* API method and returns Artist array
36
+ #
37
+ # <tt>artist_id</tt>:: artist ID
38
+ # <tt>options</tt>:: optional hash of additional API parameters, e.g. {page_size => 50}, etc
39
+ def get_similar(artist_id, options={})
40
+ api_response = @api_client.make_api_request("artist/similar", {:artistId => artist_id}, options)
41
+ @api_client.artist_digestor.list_from_xml(api_response.content.artists)
42
+ end
43
+
44
+ # calls *artist/byTag/top* API method and returns Artist array
45
+ #
46
+ # <tt>tags</tt>:: string containing comma separated list of tags
47
+ # <tt>options</tt>:: optional hash of additional API parameters, e.g. {page_size => 50}, etc
48
+ def get_top_by_tag(tags, options={})
49
+ api_response = @api_client.make_api_request("artist/byTag/top", {:tags => tags}, options)
50
+ @api_client.artist_digestor.nested_list_from_xml(api_response.content.tagged_results, :tagged_item, :tagged_results)
51
+ end
52
+
53
+ # calls *artist/search* API method and returns Artist array
54
+ #
55
+ # <tt>query</tt>:: string containing the search query
56
+ # <tt>options</tt>:: optional hash of additional API parameters, e.g. {page_size => 50}, etc
57
+ def search(query, options={})
58
+ api_response = @api_client.make_api_request("artist/search", {:q => query}, options)
59
+ @api_client.artist_digestor.nested_list_from_xml(api_response.content.search_results, :search_result, :search_results)
60
+ end
61
+
62
+ # calls *artist/browse* API method and returns Artist array
63
+ #
64
+ # <tt>letter</tt>:: string containing the search query
65
+ # <tt>options</tt>:: optional hash of additional API parameters, e.g. {page_size => 50}, etc
66
+ def browse(letter, options={})
67
+ api_response = @api_client.make_api_request("artist/browse", {:letter => letter}, options)
68
+ @api_client.artist_digestor.list_from_xml(api_response.content.artists)
69
+ end
70
+
71
+ # calls *artist/chart* API method and returns Artist array
72
+ #
73
+ # <tt>options</tt>:: optional hash of additional API parameters, e.g. {page_size => 50}, etc
74
+ def get_chart(options={})
75
+ api_response = @api_client.make_api_request("artist/chart", {}, options)
76
+ @api_client.chart_item_digestor.list_from_xml(api_response.content.chart)
77
+ end
78
+
42
79
 
43
80
  end
44
81
 
@@ -0,0 +1,29 @@
1
+ module Sevendigital
2
+
3
+ class BasketManager < Manager
4
+
5
+ def get(basket_id, options={})
6
+ api_response = @api_client.make_api_request("basket", {:basketId => basket_id}, options)
7
+ @api_client.basket_digestor.from_xml(api_response.content.basket)
8
+ end
9
+
10
+ def create(options={})
11
+ api_response = @api_client.make_api_request("basket/create", {}, options)
12
+ @api_client.basket_digestor.from_xml(api_response.content.basket)
13
+ end
14
+
15
+ def add_item(basket_id, release_id, track_id=nil, options={})
16
+ api_response = @api_client.make_api_request("basket/addItem", {:basketId => basket_id, :releaseId => release_id, :trackId => track_id}, options)
17
+ @api_client.basket_digestor.from_xml(api_response.content.basket)
18
+ end
19
+
20
+
21
+ def remove_item(basket_id, item_id, options={})
22
+ api_response = @api_client.make_api_request("basket/removeItem", {:basketId => basket_id, :itemId => item_id}, options)
23
+ @api_client.basket_digestor.from_xml(api_response.content.basket)
24
+ end
25
+
26
+
27
+ end
28
+
29
+ end
@@ -1,6 +1,6 @@
1
1
  module Sevendigital
2
2
 
3
- class Manager
3
+ class Manager # :nodoc:
4
4
 
5
5
  def initialize(api_client)
6
6
  @api_client = api_client
@@ -0,0 +1,23 @@
1
+ module Sevendigital
2
+
3
+ class OAuthManager < Manager
4
+
5
+ def get_request_token
6
+ api_response = @api_client.make_signed_api_request("oauth/requestToken", {})
7
+ @api_client.oauth_request_token_digestor.from_xml(api_response.content.oauth_request_token, :oauth_request_token)
8
+ end
9
+
10
+ def get_access_token(request_token)
11
+ api_response = @api_client.make_signed_api_request("oauth/accessToken", {}, {}, request_token)
12
+ @api_client.oauth_access_token_digestor.from_xml(api_response.content.oauth_access_token, :oauth_access_token)
13
+ end
14
+
15
+ def authorise_request_token(username, password, request_token)
16
+ api_response = @api_client.make_signed_api_request("oauth/requestToken/authorise", \
17
+ {:username => username, :password => password, :token => request_token.token})
18
+ api_response.ok?
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -5,21 +5,18 @@ module Sevendigital
5
5
  class ReleaseManager < Manager
6
6
 
7
7
  def get_details(release_id, options = {})
8
- api_request = Sevendigital::ApiRequest.new("release/details", {:releaseId => release_id}, options)
9
- api_response = @api_client.operator.call_api(api_request)
8
+ api_response = @api_client.make_api_request("release/details", {:releaseId => release_id}, options)
10
9
  @api_client.release_digestor.from_xml(api_response.content.release)
11
10
  end
12
11
 
13
12
  def get_tracks(release_id, options = {})
14
13
  options[:page_size] ||= 100
15
- api_request = Sevendigital::ApiRequest.new("release/tracks", {:releaseId => release_id}, options)
16
- api_response = @api_client.operator.call_api(api_request)
14
+ api_response = @api_client.make_api_request("release/tracks", {:releaseId => release_id}, options)
17
15
  @api_client.track_digestor.list_from_xml(api_response.content.tracks)
18
16
  end
19
17
 
20
18
  def get_chart(options={})
21
- api_request = Sevendigital::ApiRequest.new("release/chart", {}, options)
22
- api_response = @api_client.operator.call_api(api_request)
19
+ api_response = @api_client.make_api_request("release/chart", {}, options)
23
20
  @api_client.chart_item_digestor.list_from_xml(api_response.content.chart)
24
21
  end
25
22
 
@@ -28,28 +25,24 @@ module Sevendigital
28
25
  parameters[:fromDate] = from_date.strftime("%Y%m%d") if from_date
29
26
  parameters[:toDate] = to_date.strftime("%Y%m%d") if to_date
30
27
 
31
- api_request = Sevendigital::ApiRequest.new("release/byDate", parameters, options)
32
- api_response = @api_client.operator.call_api(api_request)
28
+ api_response = @api_client.make_api_request("release/byDate", parameters, options)
33
29
  @api_client.release_digestor.list_from_xml(api_response.content.releases)
34
30
  end
35
31
 
36
32
  def get_recommendations(release_id, options = {})
37
- api_request = Sevendigital::ApiRequest.new("release/recommend", {:releaseId => release_id}, options)
38
- api_response = @api_client.operator.call_api(api_request)
33
+ api_response = @api_client.make_api_request("release/recommend", {:releaseId => release_id}, options)
39
34
  @api_client.release_digestor.nested_list_from_xml(api_response.content.recommendations, :recommended_item, :recommendations)
40
35
  end
41
36
 
42
37
 
43
38
  def get_top_by_tag(tags, options = {})
44
- api_request = Sevendigital::ApiRequest.new("release/byTag/top", {:tags => tags}, options)
45
- api_response = @api_client.operator.call_api(api_request)
39
+ api_response = @api_client.make_api_request("release/byTag/top", {:tags => tags}, options)
46
40
  @api_client.release_digestor.nested_list_from_xml( \
47
41
  api_response.content.tagged_results, :tagged_item, :tagged_results )
48
42
  end
49
43
 
50
44
  def search(query, options={})
51
- api_request = Sevendigital::ApiRequest.new("release/search", {:q => query}, options)
52
- api_response = @api_client.operator.call_api(api_request)
45
+ api_response = @api_client.make_api_request("release/search", {:q => query}, options)
53
46
  @api_client.release_digestor.nested_list_from_xml(api_response.content.search_results, :search_result, :search_results)
54
47
  end
55
48
 
@@ -0,0 +1,11 @@
1
+ module Sevendigital
2
+
3
+ class TagManager < Manager
4
+
5
+ def get_tag_list(options={})
6
+ api_response = @api_client.make_api_request("tag", {}, options)
7
+ @api_client.tag_digestor.list_from_xml(api_response.content.tags)
8
+ end
9
+
10
+ end
11
+ end
@@ -2,28 +2,28 @@ module Sevendigital
2
2
 
3
3
  class TrackManager < Manager
4
4
 
5
- def get_details(id)
6
- api_request = Sevendigital::ApiRequest.new("track/details", {:trackId => id})
7
- api_response = @api_client.operator.call_api(api_request)
5
+ def get_details(id, options={})
6
+ api_response = @api_client.make_api_request("track/details", {:trackId => id}, options)
8
7
  @api_client.track_digestor.from_xml(api_response.content.track)
9
8
  end
10
9
 
10
+ def get_details_from_release(track_id, release_id, options={})
11
+ @api_client.release.get_tracks(release_id, options).find {|track| track.id = track_id}
12
+ end
13
+
11
14
  def get_chart(options={})
12
- api_request = Sevendigital::ApiRequest.new("track/chart", {}, options)
13
- api_response = @api_client.operator.call_api(api_request)
15
+ api_response = @api_client.make_api_request("track/chart", {}, options)
14
16
  @api_client.chart_item_digestor.list_from_xml(api_response.content.chart)
15
17
  end
16
18
 
17
19
  def build_preview_url(id, options={})
18
- api_request = Sevendigital::ApiRequest.new("track/preview", {:trackId => id}, options)
20
+ api_request = @api_client.create_api_request("track/preview", {:trackId => id}, options)
19
21
  @api_client.operator.create_request_uri(api_request)
20
22
  end
21
23
 
22
24
  def search(query, options={})
23
- api_request = Sevendigital::ApiRequest.new("track/search", {:q => query}, options)
24
- api_response = @api_client.operator.call_api(api_request)
25
+ api_response = @api_client.make_api_request("track/search", {:q => query}, options)
25
26
  @api_client.track_digestor.nested_list_from_xml(api_response.content.search_results, :search_result, :search_results)
26
27
  end
27
-
28
28
  end
29
29
  end
@@ -0,0 +1,51 @@
1
+ module Sevendigital
2
+
3
+ class UserManager < Manager
4
+
5
+ def login(access_token)
6
+ raise Sevendigital::SevendigitalError if !access_token.kind_of? OAuth::AccessToken
7
+ user = Sevendigital::User.new(@api_client)
8
+ user.oauth_access_token = access_token
9
+ user
10
+ end
11
+
12
+ def authenticate(email, password)
13
+ request_token = @api_client.oauth.get_request_token
14
+ return nil unless @api_client.oauth.authorise_request_token(email, password, request_token)
15
+ user = Sevendigital::User.new(@api_client)
16
+ user.oauth_access_token = @api_client.oauth.get_access_token(request_token)
17
+ user
18
+ end
19
+
20
+ def get_locker(token, options={})
21
+ api_response = @api_client.make_signed_api_request("user/locker", {}, {}, token)
22
+ @locker = @api_client.locker_digestor.from_xml(api_response.content.locker)
23
+ end
24
+
25
+ def purchase(release_id, track_id, price, token, options={})
26
+ api_response = @api_client.make_signed_api_request("user/purchase/item", \
27
+ {:releaseId => release_id, :trackId => track_id, :price => price}, options, token)
28
+ @api_client.locker_digestor.from_xml(api_response.content.purchase)
29
+ end
30
+
31
+ def get_stream_track_url(release_id, track_id, token, options={})
32
+ api_request = @api_client.create_api_request("user/streamtrack", {:releaseId => release_id, :trackId => track_id}, options)
33
+ api_request.api_service = :media
34
+ api_request.require_signature
35
+ api_request.token = token
36
+ @api_client.operator.get_request_uri(api_request)
37
+ end
38
+
39
+ def get_add_card_url(return_url, token, options={})
40
+ api_request = @api_client.create_api_request("payment/addcard", {:returnUrl => return_url}, options)
41
+ api_request.api_service = :account
42
+ api_request.require_signature
43
+ api_request.require_secure_connection
44
+ api_request.token = token
45
+ @api_client.operator.get_request_uri(api_request)
46
+ end
47
+
48
+
49
+ end
50
+
51
+ end
@@ -1,24 +1,40 @@
1
1
  module Sevendigital
2
2
 
3
+ #Holds the complete API response
3
4
  class ApiResponse
4
5
 
5
- attr_accessor :error_code, :error_message, :content
6
+ attr_accessor :error_code, :error_message, :content, :headers
6
7
 
8
+ #True if no API error has been returned
7
9
  def ok?
8
10
  return (@error_code == 0 && !@content.nil?)
9
11
  end
10
12
 
11
13
  def _dump(depth)
12
- Marshal.dump([@error_code, @error_message, @content.to_s])
14
+ Marshal.dump([@error_code, @error_message, @headers, @content.to_s])
13
15
  end
14
16
 
15
17
  def self._load(properties)
16
18
  response = ApiResponse.new
17
- response.error_code, response.error_message, content_xml = Marshal.load(properties)
19
+ response.error_code, response.error_message, response.headers, content_xml = Marshal.load(properties)
18
20
  response.content = Peachy::Proxy.new(content_xml).response
19
21
  response
20
22
  end
21
23
 
24
+ #Returns true if the response has been retrieved from cache but has since expired
25
+ def out_of_date?(current_time=nil)
26
+ return true if @headers.nil? || @headers["Date"].nil? || @headers["cache-control"].nil?
27
+ return true if !(@headers["cache-control"] =~ /max-age=([0-9]+)/)
28
+ current_time ||= Time.now.utc
29
+ response_time = Time.parse(@headers["Date"])
30
+ max_age = /max-age=([0-9]+)/.match(@headers["cache-control"])[1].to_i
31
+ response_time + max_age < current_time
32
+ end
33
+
34
+
35
+ def response_cacheable?
36
+ return true
37
+ end
22
38
 
23
39
  end
24
40