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,11 +1,31 @@
1
1
  module Sevendigital
2
2
 
3
+ #==Basic properties
4
+ #<tt>*id*</tt>:: \Artist ID
5
+ #<tt>*name*</tt>:: \Artist\'s name
6
+ #<tt>*appears_as*</tt>:: \Artist\'s name as it appears on the release or track (only available when artist is linked from release or track)
7
+ #
8
+ #==Optional properties
9
+ #with lazy loading enabled these will be automatically populated by calling get_details
10
+ #<tt>*sort_name*</tt>:: \Artist name used for sorting, e.g. Beatles, The
11
+ #<tt>*image*</tt>:: \Artist image URL
12
+ #<tt>*url*</tt>:: \Artist buy link URL
13
+ #
14
+ #==Extended properties
15
+ #with lazy loading enabled these will be automatically populated by calling the method in brackets
16
+ #<tt>*releases*</tt>:: array of artist\'s releases (retrieved using get_releases)
17
+ #<tt>*top_tracks*</tt>:: array of artist\'s top tracks (get_top_tracks)
18
+ #<tt>*similar*</tt>:: array of artists similar to this artist (get_similar)
19
+ #additional options can be passed in when accessing lazy loaded properties, e.g.
20
+ # artist.releases({:page_size => 5, :image_size =>250})
21
+
3
22
  class Artist < SevendigitalObject
4
23
 
5
- attr_accessor :id, :name, :appears_as
24
+ attr_accessor :id, :name, :appears_as #:nodoc:
6
25
 
7
26
  sevendigital_basic_property :sort_name, :image, :url
8
27
 
28
+ #Retrieves artist\'s details by calling *artist/details* API method
9
29
  def get_details(options={})
10
30
  artist_with_details = @api_client.artist.get_details(@id, options)
11
31
  copy_basic_properties_from(artist_with_details)
@@ -15,24 +35,22 @@ module Sevendigital
15
35
  sevendigital_extended_property :top_tracks
16
36
  sevendigital_extended_property :similar
17
37
 
38
+ #Retrieves releases by this artist by calling *artist/releases* API method
18
39
  def get_releases(options={})
19
- @releases = @api_client.artist.get_releases(@id, options).collect do |release|
20
- release.artist = self
21
- release
22
- end
40
+ @api_client.artist.get_releases(@id, options)
23
41
  end
24
42
 
43
+ #Retrieves top tracks by this artist by calling *artist/topTracks* API method
25
44
  def get_top_tracks(options={})
26
- @tracks = @api_client.artist.get_top_tracks(@id, options).collect do |track|
27
- track.artist = self
28
- track
29
- end
45
+ @api_client.artist.get_top_tracks(@id, options)
30
46
  end
31
47
 
48
+ #Retrieves artists similar to this artist by calling *artist/similar* API method
32
49
  def get_similar(options={})
33
50
  @similar = @api_client.artist.get_similar(@id, options)
34
51
  end
35
52
 
53
+ #True if this artist represents various artists
36
54
  def various?
37
55
  joined_names = "#{name} #{appears_as}".downcase
38
56
 
@@ -0,0 +1,16 @@
1
+ module Sevendigital
2
+
3
+ class Basket < SevendigitalObject
4
+ attr_accessor :id, :basket_items
5
+
6
+ def add_item(release_id, track_id=nil, options={})
7
+ @basket_items = @api_client.basket.add_item(id, release_id, track_id, options).basket_items
8
+ end
9
+
10
+ def remove_item(item_id, options={})
11
+ @basket_items = @api_client.basket.remove_item(id, item_id, options).basket_items
12
+ end
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,15 @@
1
+ module Sevendigital
2
+
3
+ class BasketItem < SevendigitalObject
4
+
5
+ attr_accessor :id
6
+
7
+ sevendigital_basic_property :type, :artist_name, :item_name, :price, :track_id, :release_id
8
+
9
+ sevendigital_extended_property :artist
10
+ sevendigital_extended_property :release
11
+ sevendigital_extended_property :track
12
+
13
+ end
14
+
15
+ end
@@ -0,0 +1,7 @@
1
+ module Sevendigital
2
+
3
+ class DownloadUrl
4
+ attr_accessor :url, :format
5
+ end
6
+
7
+ end
@@ -1,5 +1,3 @@
1
- require "peachy"
2
-
3
1
  module Sevendigital
4
2
 
5
3
  class Format
@@ -1,9 +1,7 @@
1
- require "peachy"
2
-
3
1
  module Sevendigital
4
2
 
5
3
  class Label
6
4
  attr_accessor :id, :name
7
- end
5
+ end
8
6
 
9
7
  end
@@ -0,0 +1,5 @@
1
+ module Sevendigital
2
+ class Locker < SevendigitalObject
3
+ attr_accessor :locker_releases
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ module Sevendigital
2
+
3
+ class LockerRelease < SevendigitalObject
4
+
5
+ attr_accessor :release, :locker_tracks
6
+
7
+ end
8
+
9
+ end
@@ -0,0 +1,9 @@
1
+ module Sevendigital
2
+
3
+ class LockerTrack < SevendigitalObject
4
+
5
+ attr_accessor :track, :download_urls, :remaining_downloads, :purchase_date
6
+
7
+ end
8
+
9
+ end
@@ -1,5 +1,3 @@
1
- require "peachy"
2
-
3
1
  module Sevendigital
4
2
 
5
3
  class Price
@@ -1,6 +1,3 @@
1
- require "peachy"
2
- require "will_paginate"
3
-
4
1
  module Sevendigital
5
2
 
6
3
  class Release < SevendigitalObject
@@ -8,7 +5,7 @@ module Sevendigital
8
5
  attr_accessor :id, :title
9
6
 
10
7
  sevendigital_basic_property :version, :type, :artist, :image, :url, :release_date,
11
- :added_date, :barcode, :year, :explicit_content, :formats, :label, :price
8
+ :added_date, :barcode, :year, :explicit_content, :formats, :label
12
9
 
13
10
  sevendigital_extended_property :tracks
14
11
  sevendigital_extended_property :recommendations
@@ -16,19 +13,36 @@ module Sevendigital
16
13
  def get_details(options={})
17
14
  release_with_details = @api_client.release.get_details(@id, options)
18
15
  copy_basic_properties_from(release_with_details)
16
+ @price = release_with_details.instance_variable_get("@price")
17
+ release_with_details
19
18
  end
20
19
 
21
20
  def get_tracks(options={})
22
- @tracks = @api_client.release.get_tracks(@id, options).collect do |track|
23
- track.release = self
24
- track
25
- end
21
+ @api_client.release.get_tracks(@id, options)
26
22
  end
27
23
 
28
24
  def get_recommendations(options={})
29
25
  @recommendations = @api_client.release.get_recommendations(@id, options)
30
26
  end
31
27
 
28
+ def demand_price(options={})
29
+ get_details(options) if @price.nil? || @price.value.nil?
30
+ end
31
+
32
+ def price(options={})
33
+ begin
34
+ demand_price(options) if @api_client.configuration.lazy_load?
35
+ rescue
36
+ puts "Error whilst lazyloading price - #{error.error_code} #{error.error_message}" if @api_client.verbose?
37
+ raise error if !@api_client.configuration.ignorant_lazy_load?
38
+ end
39
+ @price
40
+ end
41
+
42
+ def price=(value)
43
+ @price = value
44
+ end
45
+
32
46
  end
33
47
 
34
48
  end
@@ -1,3 +1,11 @@
1
1
  module Sevendigital
2
- class SevendigitalError < StandardError; end
2
+ class SevendigitalError < StandardError;
3
+ attr_accessor :error_code, :error_message
4
+
5
+ def initialize(error_code = 10000, error_message=nil)
6
+ @error_code = error_code
7
+ @error_message = error_message
8
+ end
9
+
10
+ end
3
11
  end
@@ -8,22 +8,27 @@ class Class
8
8
  end
9
9
  end
10
10
 
11
- def sevendigital_extended_property(accessor, get_method = nil)
11
+ def sevendigital_extended_property(accessor, get_method = nil)
12
12
 
13
13
  get_method ||= "get_#{accessor.to_s}".to_sym
14
14
  demand_method = "demand_#{accessor.to_s}".to_sym
15
15
 
16
- define_method(demand_method) do |*options|
17
- if instance_variable_get("@#{accessor}") == nil then
18
- value = send(get_method, *options)
19
- instance_variable_set("@#{accessor}", value) if get_method != :get_details
20
- end
21
- end
16
+ define_method(demand_method) do |*options|
17
+ if instance_variable_get("@#{accessor}").nil? then
18
+ value = send(get_method, *options)
19
+ instance_variable_set("@#{accessor}", value) if get_method != :get_details
20
+ end
21
+ end
22
22
 
23
- define_method("#{accessor}") do |*options|
24
- send(demand_method, *options) if instance_variable_get("@#{accessor}").nil? && @api_client.configuration.lazy_load?
25
- instance_variable_get("@#{accessor}")
26
- end
23
+ define_method("#{accessor}") do |*options|
24
+ begin
25
+ send(demand_method, *options) if instance_variable_get("@#{accessor}").nil? && @api_client.configuration.lazy_load
26
+ rescue Sevendigital::SevendigitalError => error
27
+ puts "Error whilst lazyloading #{accessor} - #{error.error_code} #{error.error_message}" if @api_client.verbose?
28
+ raise error if !@api_client.configuration.ignorant_lazy_load
29
+ end
30
+ instance_variable_get("@#{accessor}")
31
+ end
27
32
 
28
33
  define_method("#{accessor}=") do |val|
29
34
  instance_variable_set("@#{accessor}",val)
@@ -0,0 +1,7 @@
1
+ module Sevendigital
2
+
3
+ class Tag
4
+ attr_accessor :id, :text, :url, :count
5
+ end
6
+
7
+ end
@@ -1,18 +1,18 @@
1
1
  module Sevendigital
2
2
 
3
3
  class Track < SevendigitalObject
4
- attr_accessor :id, :title, :version, :artist
4
+ attr_accessor :id, :title, :version, :release, :artist
5
5
 
6
- sevendigital_basic_property :track_number,:duration, :explicit_content, :isrc, :release, :url, :price
6
+ sevendigital_basic_property :track_number,:duration, :explicit_content, :isrc, :url, :price
7
7
 
8
8
  def get_details(options={})
9
- track_with_details = @api_client.track.get_details(@id, options)
9
+ track_with_details = @api_client.track.get_details_from_release(@id, @release.id, options)
10
10
  copy_basic_properties_from(track_with_details)
11
11
  end
12
12
 
13
13
  def short_title
14
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)\s?.*\)/i, "")
15
+ return title.gsub(/\s+\(.*\s?(version|mix|remix|edit|edition|live|feat|explicit|original|remaster)\s?.*\)/i, "")
16
16
  end
17
17
 
18
18
  def alternate_version_of?(another_track)
@@ -0,0 +1,34 @@
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
34
+ end
@@ -1,11 +1,17 @@
1
- require "will_paginate/collection"
1
+ begin
2
+ require "will_paginate/collection"
3
+ rescue LoadError
4
+ end
2
5
 
3
6
  module Sevendigital
4
7
 
5
- class Pager
8
+ #internal class used to page array results if will_paginate is available
9
+ class Pager # :nodoc:
10
+
6
11
  attr_accessor :page, :page_size, :total_items
7
12
 
8
13
  def paginate_list(list)
14
+ return list unless defined?(WillPaginate)
9
15
  paged_list = WillPaginate::Collection.create(@page, @page_size, @total_items) do |pager|
10
16
  pager.replace(list)
11
17
  end
@@ -1,5 +1,8 @@
1
1
  module Sevendigital
2
- class ProxyPolice
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:
3
6
 
4
7
  def ProxyPolice.ensure_is_proxy(xml_or_proxy, element_name)
5
8
  if xml_or_proxy.kind_of? Peachy::Proxy then
@@ -14,6 +17,7 @@ module Sevendigital
14
17
  parent_proxy = Peachy::Proxy.new(xml)
15
18
  if element_name
16
19
  # parent_proxy.send(element_name)
20
+ puts element_name.to_s
17
21
  eval "parent_proxy.#{element_name.to_s}"
18
22
  else
19
23
  parent_proxy
@@ -0,0 +1,5 @@
1
+ module Sevendigital
2
+ # The version of the gem
3
+ NAME = "7digital"
4
+ VERSION = '0.0.5'
5
+ end
@@ -1,4 +1,4 @@
1
- require File.join(File.dirname(__FILE__), %w[spec_helper])
1
+ require "spec_helper"
2
2
  require 'ostruct'
3
3
 
4
4
  describe "ApiOperatorCached" do
@@ -9,29 +9,50 @@ describe "ApiOperatorCached" do
9
9
  @client.stub!(:very_verbose?).and_return(false)
10
10
  @cache = stub(Hash)
11
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)
12
21
  end
13
22
 
14
23
  it "should not make an http request if response already in cache " do
15
24
  @cached_operator.stub(:create_request_uri).and_return("key")
16
- @cache.stub!(:get).with("key").and_return(:something)
25
+ @cache.stub!(:get).with("key").and_return(stub_api_response())
17
26
  @cached_operator.should_not_receive(:make_http_request_and_digest)
18
27
  @cached_operator.call_api(@stub_api_request)
19
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
20
41
 
21
42
  it "should make an http request if response not yet in cache and return the result " do
22
- api_response = fake_api_response()
43
+ api_response = stub_api_response()
23
44
 
24
45
  @cached_operator.stub(:create_request_uri).and_return("key")
25
46
  @cache.stub!(:get).with("key").and_return(nil)
26
47
  @cache.stub!(:set).and_return(nil)
27
- @cached_operator.should_receive(:make_http_request_and_digest).with("key").and_return(api_response)
48
+ @cached_operator.should_receive(:make_http_request_and_digest).with(@stub_api_request).and_return(api_response)
28
49
 
29
50
  response = @cached_operator.call_api(@stub_api_request)
30
51
  response.should == api_response
31
52
  end
32
53
 
33
- it "should cache uncached api response" do
34
- api_response = fake_api_response()
54
+ it "should cache uncached api response if request was not signed" do
55
+ api_response = stub_api_response()
35
56
 
36
57
  @cached_operator.stub(:create_request_uri).and_return("key")
37
58
  @cache.stub!(:get).with("key").and_return(nil)
@@ -41,8 +62,42 @@ describe "ApiOperatorCached" do
41
62
  response = @cached_operator.call_api(@stub_api_request)
42
63
  end
43
64
 
44
- def fake_api_response
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
45
78
  return Net::HTTP.new("1.1", 200, "response_body")
46
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
47
102
 
48
103
  end