7digital 0.0.7 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. data/README.rdoc +8 -1
  2. data/lib/sevendigital.rb +4 -2
  3. data/lib/sevendigital/api_operator.rb +92 -94
  4. data/lib/sevendigital/api_operator_cached.rb +55 -33
  5. data/lib/sevendigital/api_request.rb +50 -54
  6. data/lib/sevendigital/client.rb +15 -6
  7. data/lib/sevendigital/client_configuration.rb +0 -3
  8. data/lib/sevendigital/client_digestors.rb +15 -0
  9. data/lib/sevendigital/client_managers.rb +11 -1
  10. data/lib/sevendigital/digestion_tract/api_response_digestor.rb +31 -40
  11. data/lib/sevendigital/digestion_tract/artist_digestor.rb +16 -13
  12. data/lib/sevendigital/digestion_tract/basket_digestor.rb +5 -5
  13. data/lib/sevendigital/digestion_tract/basket_item_digestor.rb +12 -12
  14. data/lib/sevendigital/digestion_tract/chart_item_digestor.rb +17 -11
  15. data/lib/sevendigital/digestion_tract/country_digestor.rb +16 -0
  16. data/lib/sevendigital/digestion_tract/digestor.rb +82 -28
  17. data/lib/sevendigital/digestion_tract/download_url_digestor.rb +10 -7
  18. data/lib/sevendigital/digestion_tract/format_digestor.rb +11 -9
  19. data/lib/sevendigital/digestion_tract/label_digestor.rb +8 -7
  20. data/lib/sevendigital/digestion_tract/list_digestor.rb +24 -0
  21. data/lib/sevendigital/digestion_tract/list_item_digestor.rb +26 -0
  22. data/lib/sevendigital/digestion_tract/locker_digestor.rb +9 -5
  23. data/lib/sevendigital/digestion_tract/locker_release_digestor.rb +13 -7
  24. data/lib/sevendigital/digestion_tract/locker_track_digestor.rb +13 -9
  25. data/lib/sevendigital/digestion_tract/oauth_access_token_digestor.rb +7 -3
  26. data/lib/sevendigital/digestion_tract/oauth_request_token_digestor.rb +7 -3
  27. data/lib/sevendigital/digestion_tract/pager_digestor.rb +13 -9
  28. data/lib/sevendigital/digestion_tract/price_digestor.rb +15 -12
  29. data/lib/sevendigital/digestion_tract/release_digestor.rb +26 -34
  30. data/lib/sevendigital/digestion_tract/tag_digestor.rb +8 -7
  31. data/lib/sevendigital/digestion_tract/track_digestor.rb +27 -28
  32. data/lib/sevendigital/digestion_tract/user_card_digestor.rb +9 -8
  33. data/lib/sevendigital/digestion_tract/user_digestor.rb +8 -7
  34. data/lib/sevendigital/management/artist_manager.rb +9 -11
  35. data/lib/sevendigital/management/basket_manager.rb +4 -4
  36. data/lib/sevendigital/management/country_manager.rb +11 -0
  37. data/lib/sevendigital/management/list_manager.rb +18 -0
  38. data/lib/sevendigital/management/oauth_manager.rb +2 -2
  39. data/lib/sevendigital/management/release_manager.rb +9 -11
  40. data/lib/sevendigital/management/tag_manager.rb +1 -1
  41. data/lib/sevendigital/management/track_manager.rb +4 -5
  42. data/lib/sevendigital/management/user_card_manager.rb +2 -2
  43. data/lib/sevendigital/management/user_manager.rb +9 -4
  44. data/lib/sevendigital/model/api_response.rb +12 -4
  45. data/lib/sevendigital/model/artist.rb +5 -0
  46. data/lib/sevendigital/model/list.rb +5 -0
  47. data/lib/sevendigital/model/list_item.rb +9 -0
  48. data/lib/sevendigital/model/release.rb +2 -2
  49. data/lib/sevendigital/model/sevendigital_object.rb +1 -1
  50. data/lib/sevendigital/model/user.rb +12 -1
  51. data/lib/sevendigital/pager.rb +2 -6
  52. data/lib/sevendigital/version.rb +1 -1
  53. data/spec/api_operator_cached_spec.rb +14 -14
  54. data/spec/api_operator_spec.rb +18 -34
  55. data/spec/digestion_tract/api_response_digestor_spec.rb +26 -25
  56. data/spec/digestion_tract/artist_digestor_spec.rb +9 -9
  57. data/spec/digestion_tract/basket_digestor_spec.rb +2 -2
  58. data/spec/digestion_tract/basket_item_digestor_spec.rb +4 -4
  59. data/spec/digestion_tract/chart_digestor_spec.rb +4 -4
  60. data/spec/digestion_tract/country_digestor_spec.rb +33 -0
  61. data/spec/digestion_tract/digestor_spec.rb +34 -0
  62. data/spec/digestion_tract/download_url_digestor_spec.rb +2 -2
  63. data/spec/digestion_tract/format_digestor_spec.rb +2 -2
  64. data/spec/digestion_tract/label_digestor_spec.rb +2 -2
  65. data/spec/digestion_tract/list_digestor_spec.rb +32 -0
  66. data/spec/digestion_tract/list_item_digestor_spec.rb +80 -0
  67. data/spec/digestion_tract/locker_digestor_spec.rb +2 -2
  68. data/spec/digestion_tract/locker_release_digestor_spec.rb +5 -5
  69. data/spec/digestion_tract/locker_track_digestor_spec.rb +4 -4
  70. data/spec/digestion_tract/oauth_access_token_digestor_spec.rb +2 -2
  71. data/spec/digestion_tract/oauth_request_token_digestor_spec.rb +2 -2
  72. data/spec/digestion_tract/pager_digestor_spec.rb +3 -3
  73. data/spec/digestion_tract/price_digestor_spec.rb +4 -4
  74. data/spec/digestion_tract/release_digestor_spec.rb +19 -5
  75. data/spec/digestion_tract/tag_digestor_spec.rb +3 -3
  76. data/spec/digestion_tract/track_digestor_spec.rb +4 -4
  77. data/spec/digestion_tract/user_card_digestor_spec.rb +5 -5
  78. data/spec/digestion_tract/user_digestor_spec.rb +4 -6
  79. data/spec/integration/artist_spec.rb +86 -0
  80. data/spec/integration/country_spec.rb +18 -0
  81. data/spec/integration/list_spec.rb +22 -0
  82. data/spec/integration/purchasing_spec.rb +24 -0
  83. data/spec/integration/release_spec.rb +34 -0
  84. data/spec/integration/sevendigital_spec.yml +5 -0
  85. data/spec/integration/track_spec.rb +23 -0
  86. data/spec/integration/user_spec.rb +22 -0
  87. data/spec/management/artist_manager_spec.rb +32 -11
  88. data/spec/management/basket_manager_spec.rb +4 -4
  89. data/spec/management/country_manager_spec.rb +34 -0
  90. data/spec/management/list_manager_spec.rb +27 -0
  91. data/spec/management/oauth_manager_spec.rb +4 -4
  92. data/spec/management/release_manager_spec.rb +13 -13
  93. data/spec/management/tag_manager_spec.rb +1 -1
  94. data/spec/management/track_manager_spec.rb +4 -4
  95. data/spec/management/user_card_manager_spec.rb +2 -2
  96. data/spec/management/user_manager_spec.rb +20 -4
  97. data/spec/model/api_response_spec.rb +3 -3
  98. data/spec/model/artist_spec.rb +2 -2
  99. data/spec/model/sevendigital_object_spec.rb +4 -4
  100. data/spec/model/user_spec.rb +21 -0
  101. data/spec/spec_helper.rb +31 -11
  102. data/spec/test-xml/methods/country/resolve.xml +7 -0
  103. data/spec/test-xml/methods/editorial/list.xml +171 -0
  104. data/spec/test-xml/methods/user/details.xml +5 -0
  105. data/spec/test-xml/objects/artist.xml +1 -0
  106. data/spec/test-xml/objects/list.xml +89 -0
  107. data/spec/test-xml/objects/list_item_list.xml +86 -0
  108. data/spec/test-xml/objects/list_item_release.xml +14 -0
  109. data/spec/test-xml/objects/nested_release_list.xml +23 -0
  110. metadata +126 -273
  111. data/lib/sevendigital/peachy_patchy.rb +0 -9
  112. data/lib/sevendigital/proxy_police.rb +0 -28
  113. data/spec/coverage/assets/0.3.9/app.js +0 -66
  114. data/spec/coverage/assets/0.3.9/fancybox/blank.gif +0 -0
  115. data/spec/coverage/assets/0.3.9/fancybox/fancy_close.png +0 -0
  116. data/spec/coverage/assets/0.3.9/fancybox/fancy_loading.png +0 -0
  117. data/spec/coverage/assets/0.3.9/fancybox/fancy_nav_left.png +0 -0
  118. data/spec/coverage/assets/0.3.9/fancybox/fancy_nav_right.png +0 -0
  119. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_e.png +0 -0
  120. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_n.png +0 -0
  121. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_ne.png +0 -0
  122. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_nw.png +0 -0
  123. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_s.png +0 -0
  124. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_se.png +0 -0
  125. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_sw.png +0 -0
  126. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_w.png +0 -0
  127. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_left.png +0 -0
  128. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_main.png +0 -0
  129. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_over.png +0 -0
  130. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_right.png +0 -0
  131. data/spec/coverage/assets/0.3.9/fancybox/fancybox-x.png +0 -0
  132. data/spec/coverage/assets/0.3.9/fancybox/fancybox-y.png +0 -0
  133. data/spec/coverage/assets/0.3.9/fancybox/fancybox.png +0 -0
  134. data/spec/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.css +0 -363
  135. data/spec/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.pack.js +0 -44
  136. data/spec/coverage/assets/0.3.9/favicon.png +0 -0
  137. data/spec/coverage/assets/0.3.9/jquery-1.4.2.min.js +0 -155
  138. data/spec/coverage/assets/0.3.9/jquery.dataTables.min.js +0 -152
  139. data/spec/coverage/assets/0.3.9/jquery.timeago.js +0 -141
  140. data/spec/coverage/assets/0.3.9/jquery.url.js +0 -174
  141. data/spec/coverage/assets/0.3.9/loading.gif +0 -0
  142. data/spec/coverage/assets/0.3.9/magnify.png +0 -0
  143. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  144. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  145. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  146. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  147. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  148. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  149. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  150. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  151. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_222222_256x240.png +0 -0
  152. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  153. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_454545_256x240.png +0 -0
  154. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_888888_256x240.png +0 -0
  155. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  156. data/spec/coverage/assets/0.3.9/smoothness/jquery-ui-1.8.4.custom.css +0 -295
  157. data/spec/coverage/assets/0.3.9/stylesheet.css +0 -341
  158. data/spec/coverage/index.html +0 -47481
  159. data/spec/coverage/resultset.yml +0 -3556
  160. data/spec/model/coverage/assets/0.3.9/app.js +0 -66
  161. data/spec/model/coverage/assets/0.3.9/fancybox/blank.gif +0 -0
  162. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_close.png +0 -0
  163. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_loading.png +0 -0
  164. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_nav_left.png +0 -0
  165. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_nav_right.png +0 -0
  166. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_e.png +0 -0
  167. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_n.png +0 -0
  168. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_ne.png +0 -0
  169. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_nw.png +0 -0
  170. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_s.png +0 -0
  171. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_se.png +0 -0
  172. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_sw.png +0 -0
  173. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_w.png +0 -0
  174. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_left.png +0 -0
  175. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_main.png +0 -0
  176. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_over.png +0 -0
  177. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_right.png +0 -0
  178. data/spec/model/coverage/assets/0.3.9/fancybox/fancybox-x.png +0 -0
  179. data/spec/model/coverage/assets/0.3.9/fancybox/fancybox-y.png +0 -0
  180. data/spec/model/coverage/assets/0.3.9/fancybox/fancybox.png +0 -0
  181. data/spec/model/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.css +0 -363
  182. data/spec/model/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.pack.js +0 -44
  183. data/spec/model/coverage/assets/0.3.9/favicon.png +0 -0
  184. data/spec/model/coverage/assets/0.3.9/jquery-1.4.2.min.js +0 -155
  185. data/spec/model/coverage/assets/0.3.9/jquery.dataTables.min.js +0 -152
  186. data/spec/model/coverage/assets/0.3.9/jquery.timeago.js +0 -141
  187. data/spec/model/coverage/assets/0.3.9/jquery.url.js +0 -174
  188. data/spec/model/coverage/assets/0.3.9/loading.gif +0 -0
  189. data/spec/model/coverage/assets/0.3.9/magnify.png +0 -0
  190. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  191. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  192. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  193. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  194. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  195. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  196. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  197. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  198. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_222222_256x240.png +0 -0
  199. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  200. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_454545_256x240.png +0 -0
  201. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_888888_256x240.png +0 -0
  202. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  203. data/spec/model/coverage/assets/0.3.9/smoothness/jquery-ui-1.8.4.custom.css +0 -295
  204. data/spec/model/coverage/assets/0.3.9/stylesheet.css +0 -341
  205. data/spec/model/coverage/index.html +0 -8637
  206. data/spec/model/coverage/resultset.yml +0 -642
  207. data/spec/pager_spec.rb +0 -7
  208. data/spec/peachy_spec_helper_patch.rb +0 -7
  209. data/spec/proxy_police_spec.rb +0 -70
  210. data/spec/sevendigital_spec.rb +0 -51
  211. data/spec/sevendigital_spec.yml +0 -5
@@ -6,17 +6,18 @@ module Sevendigital
6
6
  def default_element_name; :card end
7
7
  def default_list_element_name; :cards end
8
8
 
9
- def from_proxy(card_proxy)
10
- make_sure_not_eating_nil(card_proxy)
9
+ def from_xml_doc(xml_node)
10
+ make_sure_eating_nokogiri_node(xml_node)
11
11
 
12
12
  card = Sevendigital::Card.new(@api_client)
13
- card.id = card_proxy.id.to_i
14
- card.type = card_proxy.type.value.to_s
15
- card.last_4_digits = card_proxy.last4digits.value.to_s
16
- card.card_holder_name = card_proxy.card_holder_name.value.to_s if value_present?(card_proxy.card_holder_name)
17
- card.expiry_date = card_proxy.expiry_date.value.to_s if value_present?(card_proxy.expiry_date)
18
13
 
19
- return card
14
+ card.id = get_optional_attribute(xml_node,"id").to_i
15
+ card.type = get_required_value(xml_node, "type")
16
+ card.last_4_digits = get_required_value(xml_node, "last4digits")
17
+ card.card_holder_name = get_optional_value(xml_node, "cardHolderName")
18
+ card.expiry_date = get_optional_value(xml_node, "expiryDate")
19
+
20
+ card
20
21
  end
21
22
 
22
23
  end
@@ -4,16 +4,17 @@ module Sevendigital
4
4
  class UserDigestor < Digestor # :nodoc:
5
5
 
6
6
  def default_element_name; :user end
7
-
8
- def from_proxy(user_proxy)
9
- make_sure_not_eating_nil(user_proxy)
7
+
8
+ def from_xml_doc(xml_node)
9
+ make_sure_eating_nokogiri_node(xml_node)
10
10
 
11
11
  user = User.new(@api_client)
12
- user.id = user_proxy.id.to_s if !user_proxy.nil?
13
- user.type = user_proxy.type.value.to_sym
14
- user.email_address = user_proxy.email_address.value.to_s if value_present?(user_proxy.email_address)
15
12
 
16
- return user
13
+ user.id = get_optional_attribute(xml_node, "id")
14
+ user.type = get_optional_value(xml_node, "type") {|v| v.to_sym}
15
+ user.email_address = get_optional_value(xml_node, "emailAddress")
16
+
17
+ user
17
18
  end
18
19
 
19
20
  end
@@ -1,5 +1,3 @@
1
- require "peachy"
2
-
3
1
  module Sevendigital
4
2
 
5
3
  # provides access to Artist related API methods (artist/*)
@@ -12,7 +10,7 @@ module Sevendigital
12
10
  # @return [Artist]
13
11
  def get_details(artist_id, options={})
14
12
  api_response = @api_client.make_api_request(:GET, "artist/details", {:artistId => artist_id}, options)
15
- @api_client.artist_digestor.from_xml(api_response.content.artist)
13
+ @api_client.artist_digestor.from_xml_doc(api_response.item_xml("artist"))
16
14
  end
17
15
 
18
16
  # calls *artist/releases* API method and returns Release array
@@ -22,7 +20,7 @@ module Sevendigital
22
20
  # @return [[Artist]]
23
21
  def get_releases(artist_id, options={})
24
22
  api_response = @api_client.make_api_request(:GET, "artist/releases", {:artistId => artist_id}, options)
25
- @api_client.release_digestor.list_from_xml(api_response.content.releases)
23
+ @api_client.release_digestor.list_from_xml_doc(api_response.item_xml("releases"))
26
24
  end
27
25
 
28
26
  # calls *artist/toptracks* API method and returns Track array
@@ -32,7 +30,7 @@ module Sevendigital
32
30
  # @return [Array<Track>]
33
31
  def get_top_tracks(artist_id, options={})
34
32
  api_response = @api_client.make_api_request(:GET, "artist/topTracks", {:artistId => artist_id}, options)
35
- @api_client.track_digestor.list_from_xml(api_response.content.tracks)
33
+ @api_client.track_digestor.list_from_xml_doc(api_response.item_xml("tracks"))
36
34
  end
37
35
 
38
36
  # calls *artist/similar* API method and returns Artist array
@@ -42,7 +40,7 @@ module Sevendigital
42
40
  # @return [Array<Artist>]
43
41
  def get_similar(artist_id, options={})
44
42
  api_response = @api_client.make_api_request(:GET, "artist/similar", {:artistId => artist_id}, options)
45
- @api_client.artist_digestor.list_from_xml(api_response.content.artists)
43
+ @api_client.artist_digestor.list_from_xml_doc(api_response.item_xml("artists"))
46
44
  end
47
45
 
48
46
  # calls *artist/byTag/top* API method and returns Artist array
@@ -52,7 +50,7 @@ module Sevendigital
52
50
  # @return [Array<Artist>]
53
51
  def get_top_by_tag(tags, options={})
54
52
  api_response = @api_client.make_api_request(:GET, "artist/byTag/top", {:tags => tags}, options)
55
- @api_client.artist_digestor.nested_list_from_xml(api_response.content.tagged_results, :tagged_item, :tagged_results)
53
+ @api_client.artist_digestor.nested_list_from_xml_doc(api_response.item_xml("taggedResults"), :taggedItem, :artist)
56
54
  end
57
55
 
58
56
  # calls *artist/search* API method and returns Artist array
@@ -62,7 +60,7 @@ module Sevendigital
62
60
  # @return [Array<Artist>]
63
61
  def search(query, options={})
64
62
  api_response = @api_client.make_api_request(:GET, "artist/search", {:q => query}, options)
65
- @api_client.artist_digestor.nested_list_from_xml(api_response.content.search_results, :search_result, :search_results)
63
+ @api_client.artist_digestor.nested_list_from_xml_doc(api_response.item_xml("searchResults"), :searchResult, :artist)
66
64
  end
67
65
 
68
66
  # calls *artist/browse* API method and returns Artist array
@@ -72,7 +70,7 @@ module Sevendigital
72
70
  # @return [Array<Artist>]
73
71
  def browse(letter, options={})
74
72
  api_response = @api_client.make_api_request(:GET, "artist/browse", {:letter => letter}, options)
75
- @api_client.artist_digestor.list_from_xml(api_response.content.artists)
73
+ @api_client.artist_digestor.list_from_xml_doc(api_response.item_xml("artists"))
76
74
  end
77
75
 
78
76
  # calls *artist/chart* API method and returns Artist array
@@ -80,7 +78,7 @@ module Sevendigital
80
78
  # @param [Hash] options optional hash of additional API parameters, e.g. page_size => 50, etc
81
79
  def get_chart(options={})
82
80
  api_response = @api_client.make_api_request(:GET, "artist/chart", {}, options)
83
- @api_client.chart_item_digestor.list_from_xml(api_response.content.chart)
81
+ @api_client.chart_item_digestor.list_from_xml_doc(api_response.item_xml("chart"))
84
82
  end
85
83
 
86
84
  # calls *artist/tags* API method and returns Tag array
@@ -90,7 +88,7 @@ module Sevendigital
90
88
  # @return [Array<Tag>]
91
89
  def get_tags(artist_id, options={})
92
90
  api_response = @api_client.make_api_request(:GET, "artist/tags", {:artistId => artist_id}, options)
93
- @api_client.tag_digestor.list_from_xml(api_response.content.tags)
91
+ @api_client.tag_digestor.list_from_xml_doc(api_response.item_xml("tags"))
94
92
  end
95
93
 
96
94
 
@@ -4,23 +4,23 @@ module Sevendigital
4
4
 
5
5
  def get(basket_id, options={})
6
6
  api_response = @api_client.make_api_request(:GET, "basket", {:basketId => basket_id}, options)
7
- @api_client.basket_digestor.from_xml(api_response.content.basket)
7
+ @api_client.basket_digestor.from_xml_doc(api_response.item_xml("basket"))
8
8
  end
9
9
 
10
10
  def create(options={})
11
11
  api_response = @api_client.make_api_request(:GET, "basket/create", {}, options)
12
- @api_client.basket_digestor.from_xml(api_response.content.basket)
12
+ @api_client.basket_digestor.from_xml_doc(api_response.item_xml("basket"))
13
13
  end
14
14
 
15
15
  def add_item(basket_id, release_id, track_id=nil, options={})
16
16
  api_response = @api_client.make_api_request(:GET, "basket/addItem", {:basketId => basket_id, :releaseId => release_id, :trackId => track_id}, options)
17
- @api_client.basket_digestor.from_xml(api_response.content.basket)
17
+ @api_client.basket_digestor.from_xml_doc(api_response.item_xml("basket"))
18
18
  end
19
19
 
20
20
 
21
21
  def remove_item(basket_id, item_id, options={})
22
22
  api_response = @api_client.make_api_request(:GET, "basket/removeItem", {:basketId => basket_id, :itemId => item_id}, options)
23
- @api_client.basket_digestor.from_xml(api_response.content.basket)
23
+ @api_client.basket_digestor.from_xml_doc(api_response.item_xml("basket"))
24
24
  end
25
25
 
26
26
 
@@ -0,0 +1,11 @@
1
+ module Sevendigital
2
+
3
+ class CountryManager < Manager
4
+
5
+ def resolve(ip_address, options={})
6
+ api_response = @api_client.make_api_request(:GET, "country/resolve", {:ipaddress=>ip_address}, options)
7
+ @api_client.country_digestor.from_xml_doc(api_response.item_xml("GeoIpLookup"))
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,18 @@
1
+ module Sevendigital
2
+
3
+ # provides access to Artist related API methods (artist/*)
4
+ class ListManager < Manager
5
+
6
+ # calls *editorial/list* API method and returns Artist with populated details
7
+ #
8
+ # @param [String] key
9
+ # @param [Hash] options optional hash of additional API parameters, e.g. page_size => 50, etc
10
+ # @return [List]
11
+ def get_editorial_list(key, options={})
12
+ api_response = @api_client.make_api_request(:GET, "editorial/list", {:key => key}, options)
13
+ @api_client.list_digestor.from_xml_doc(api_response.item_xml("list"))
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -4,12 +4,12 @@ module Sevendigital
4
4
 
5
5
  def get_request_token
6
6
  api_response = @api_client.make_signed_api_request(:GET, "oauth/requestToken", {})
7
- @api_client.oauth_request_token_digestor.from_xml(api_response.content.oauth_request_token, :oauth_request_token)
7
+ @api_client.oauth_request_token_digestor.from_xml_doc(api_response.item_xml("oauth_request_token"))
8
8
  end
9
9
 
10
10
  def get_access_token(request_token)
11
11
  api_response = @api_client.make_signed_api_request(:GET, "oauth/accessToken", {}, {}, request_token)
12
- @api_client.oauth_access_token_digestor.from_xml(api_response.content.oauth_access_token, :oauth_access_token)
12
+ @api_client.oauth_access_token_digestor.from_xml_doc(api_response.item_xml("oauth_access_token"))
13
13
  end
14
14
 
15
15
  def authorise_request_token(username, password, request_token)
@@ -1,23 +1,21 @@
1
- require "peachy"
2
-
3
1
  module Sevendigital
4
2
 
5
3
  class ReleaseManager < Manager
6
4
 
7
5
  def get_details(release_id, options = {})
8
6
  api_response = @api_client.make_api_request(:GET, "release/details", {:releaseId => release_id}, options)
9
- @api_client.release_digestor.from_xml(api_response.content.release)
7
+ @api_client.release_digestor.from_xml_doc(api_response.item_xml("release"))
10
8
  end
11
9
 
12
10
  def get_tracks(release_id, options = {})
13
11
  options[:page_size] ||= 100
14
12
  api_response = @api_client.make_api_request(:GET, "release/tracks", {:releaseId => release_id}, options)
15
- @api_client.track_digestor.list_from_xml(api_response.content.tracks)
13
+ @api_client.track_digestor.list_from_xml_doc(api_response.item_xml("tracks"))
16
14
  end
17
15
 
18
16
  def get_chart(options={})
19
17
  api_response = @api_client.make_api_request(:GET, "release/chart", {}, options)
20
- @api_client.chart_item_digestor.list_from_xml(api_response.content.chart)
18
+ @api_client.chart_item_digestor.list_from_xml_doc(api_response.item_xml("chart"))
21
19
  end
22
20
 
23
21
  def get_by_date(from_date = nil, to_date = nil, options = {})
@@ -26,30 +24,30 @@ module Sevendigital
26
24
  parameters[:toDate] = to_date.strftime("%Y%m%d") if to_date
27
25
 
28
26
  api_response = @api_client.make_api_request(:GET, "release/byDate", parameters, options)
29
- @api_client.release_digestor.list_from_xml(api_response.content.releases)
27
+ @api_client.release_digestor.list_from_xml_doc(api_response.item_xml("releases"))
30
28
  end
31
29
 
32
30
  def get_recommendations(release_id, options = {})
33
31
  api_response = @api_client.make_api_request(:GET, "release/recommend", {:releaseId => release_id}, options)
34
- @api_client.release_digestor.nested_list_from_xml(api_response.content.recommendations, :recommended_item, :recommendations)
32
+ @api_client.release_digestor.nested_list_from_xml_doc(api_response.item_xml("recommendations"), :recommendedItem, :release)
35
33
  end
36
34
 
37
35
 
38
36
  def get_top_by_tag(tags, options = {})
39
37
  api_response = @api_client.make_api_request(:GET, "release/byTag/top", {:tags => tags}, options)
40
- @api_client.release_digestor.nested_list_from_xml( \
41
- api_response.content.tagged_results, :tagged_item, :tagged_results )
38
+ @api_client.release_digestor.nested_list_from_xml_doc( \
39
+ api_response.item_xml("taggedResults"), :taggedItem, :release )
42
40
  end
43
41
 
44
42
  def search(query, options={})
45
43
  api_response = @api_client.make_api_request(:GET, "release/search", {:q => query}, options)
46
- @api_client.release_digestor.nested_list_from_xml(api_response.content.search_results, :search_result, :search_results)
44
+ @api_client.release_digestor.nested_list_from_xml_doc(api_response.item_xml("searchResults"), :searchResult, :release)
47
45
  end
48
46
 
49
47
 
50
48
  def get_tags(release_id, options = {})
51
49
  api_response = @api_client.make_api_request(:GET, "release/tags", {:releaseId => release_id}, options)
52
- @api_client.tag_digestor.list_from_xml(api_response.content.tags)
50
+ @api_client.tag_digestor.list_from_xml_doc(api_response.item_xml("tags"))
53
51
  end
54
52
 
55
53
  end
@@ -4,7 +4,7 @@ module Sevendigital
4
4
 
5
5
  def get_tag_list(options={})
6
6
  api_response = @api_client.make_api_request(:GET, "tag", {}, options)
7
- @api_client.tag_digestor.list_from_xml(api_response.content.tags)
7
+ @api_client.tag_digestor.list_from_xml_doc(api_response.item_xml("tags"))
8
8
  end
9
9
 
10
10
  end
@@ -1,10 +1,8 @@
1
1
  module Sevendigital
2
-
3
2
  class TrackManager < Manager
4
-
5
3
  def get_details(id, options={})
6
4
  api_response = @api_client.make_api_request(:GET, "track/details", {:trackId => id}, options)
7
- @api_client.track_digestor.from_xml(api_response.content.track)
5
+ @api_client.track_digestor.from_xml_doc(api_response.item_xml("track"))
8
6
  end
9
7
 
10
8
  def get_details_from_release(track_id, release_id, options={})
@@ -13,7 +11,7 @@ module Sevendigital
13
11
 
14
12
  def get_chart(options={})
15
13
  api_response = @api_client.make_api_request(:GET, "track/chart", {}, options)
16
- @api_client.chart_item_digestor.list_from_xml(api_response.content.chart)
14
+ @api_client.chart_item_digestor.list_from_xml_doc(api_response.item_xml("chart"))
17
15
  end
18
16
 
19
17
  def build_preview_url(id, options={})
@@ -23,7 +21,8 @@ module Sevendigital
23
21
 
24
22
  def search(query, options={})
25
23
  api_response = @api_client.make_api_request(:GET, "track/search", {:q => query}, options)
26
- @api_client.track_digestor.nested_list_from_xml(api_response.content.search_results, :search_result, :search_results)
24
+ @api_client.track_digestor.nested_list_from_xml_doc(api_response.item_xml("searchResults"), :searchResult, :track)
27
25
  end
26
+
28
27
  end
29
28
  end
@@ -4,7 +4,7 @@ module Sevendigital
4
4
 
5
5
  def get_card_list(token, options={})
6
6
  api_response = @api_client.make_signed_api_request(:GET, "user/payment/card", {}, options, token)
7
- @api_client.user_card_digestor.list_from_xml(api_response.content.cards)
7
+ @api_client.user_card_digestor.list_from_xml_doc(api_response.item_xml("cards"))
8
8
  end
9
9
 
10
10
  def add_card(card_number, card_type, card_holder_name, card_start_date, card_expiry_date, card_issue_number,
@@ -14,7 +14,7 @@ module Sevendigital
14
14
  :cardStartDate => card_start_date, :cardExpiryDate => card_expiry_date, :cardIssueNumber => card_issue_number,
15
15
  :cardVerificationCode => card_verification_code, :cardPostCode => card_post_code, :cardCountry => card_country
16
16
  }, options, token)
17
- @api_client.user_card_digestor.from_xml(api_response.content.card)
17
+ @api_client.user_card_digestor.from_xml_doc(api_response.item_xml("card"))
18
18
  end
19
19
 
20
20
  def select_card(card_id, token, options={})
@@ -2,6 +2,11 @@ module Sevendigital
2
2
 
3
3
  class UserManager < Manager
4
4
 
5
+ def get_details(token, options={})
6
+ api_response = @api_client.make_signed_api_request(:GET, "user/details", {}, options, token)
7
+ @locker = @api_client.user_digestor.from_xml_doc(api_response.item_xml("user"))
8
+ end
9
+
5
10
  def login(access_token)
6
11
  raise Sevendigital::SevendigitalError if !access_token.kind_of? OAuth::AccessToken
7
12
  user = Sevendigital::User.new(@api_client)
@@ -20,14 +25,14 @@ module Sevendigital
20
25
  def sign_up(email, password, options={})
21
26
  api_response = @api_client.make_signed_api_request(:POST, "user/signUp", \
22
27
  {:emailAddress => email, :password=> password}, options)
23
- user = @api_client.user_digestor.from_xml(api_response.content.user)
28
+ user = @api_client.user_digestor.from_xml_doc(api_response.item_xml("user"))
24
29
  user.oauth_access_token = authenticate(email, password).oauth_access_token
25
30
  user
26
31
  end
27
32
 
28
33
  def get_locker(token, options={})
29
34
  api_response = @api_client.make_signed_api_request(:GET, "user/locker", {}, options, token)
30
- @locker = @api_client.locker_digestor.from_xml(api_response.content.locker)
35
+ @locker = @api_client.locker_digestor.from_xml_doc(api_response.item_xml("locker"))
31
36
  end
32
37
 
33
38
  # <b>DEPRECATED:</b> Please use <tt>purchase_item</tt> instead.
@@ -39,13 +44,13 @@ module Sevendigital
39
44
  def purchase_item(release_id, track_id, price, token, options={})
40
45
  api_response = @api_client.make_signed_api_request(:GET, "user/purchase/item", \
41
46
  {:releaseId => release_id, :trackId => track_id, :price => price}, options, token)
42
- @api_client.locker_digestor.from_xml(api_response.content.purchase)
47
+ @api_client.locker_digestor.from_xml_doc(api_response.item_xml("purchase"))
43
48
  end
44
49
 
45
50
  def purchase_basket(basket_id, token, options={})
46
51
  api_response = @api_client.make_signed_api_request(:GET, "user/purchase/basket", \
47
52
  {:basketId => basket_id}, options, token)
48
- @api_client.locker_digestor.from_xml(api_response.content.purchase)
53
+ @api_client.locker_digestor.from_xml_doc(api_response.item_xml("purchase"))
49
54
  end
50
55
 
51
56
  def get_stream_track_url(release_id, track_id, token, options={})
@@ -7,17 +7,25 @@ module Sevendigital
7
7
 
8
8
  #True if no API error has been returned
9
9
  def ok?
10
- return (@error_code == 0 && !@content.nil?)
10
+ (@error_code == 0 && !@content.nil?)
11
+ end
12
+
13
+ def content_xml
14
+ puts @content
15
+ @content_xml ||= Nokogiri::XML(@content)
16
+ end
17
+
18
+ def item_xml(element_name)
19
+ content_xml.at_xpath("./response/#{element_name}")
11
20
  end
12
21
 
13
22
  def _dump(depth)
14
- Marshal.dump([@error_code, @error_message, @headers, @content.to_s])
23
+ Marshal.dump([@error_code, @error_message, @headers, @content])
15
24
  end
16
25
 
17
26
  def self._load(properties)
18
27
  response = ApiResponse.new
19
- response.error_code, response.error_message, response.headers, content_xml = Marshal.load(properties)
20
- response.content = Peachy::Proxy.new(content_xml).response
28
+ response.error_code, response.error_message, response.headers, response.content = Marshal.load(properties)
21
29
  response
22
30
  end
23
31
 
@@ -32,6 +32,10 @@ class Artist < SevendigitalObject
32
32
  #@return [String]
33
33
  sevendigital_basic_property :url
34
34
 
35
+ #popularity of the artist (lazy loaded using #get_tags)
36
+ #@return [decimal] similar
37
+ sevendigital_basic_property :popularity
38
+
35
39
  #artist's releases (lazy loaded using get_releases)
36
40
  #@return [Array<Release>]
37
41
  sevendigital_extended_property :releases
@@ -53,6 +57,7 @@ class Artist < SevendigitalObject
53
57
  def get_details(options={})
54
58
  artist_with_details = @api_client.artist.get_details(@id, options)
55
59
  copy_basic_properties_from(artist_with_details)
60
+ artist_with_details
56
61
  end
57
62
 
58
63
  #releases by this artist retrieved by calling *artist/releases* API method
@@ -0,0 +1,5 @@
1
+ module Sevendigital
2
+ class List < SevendigitalObject
3
+ attr_accessor :id, :key, :list_items
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ module Sevendigital
2
+
3
+ class ListItem < SevendigitalObject
4
+
5
+ attr_accessor :id, :type, :release
6
+
7
+ end
8
+
9
+ end