7digital 0.0.2 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
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,4 +1,5 @@
1
- require File.join(File.dirname(__FILE__), %w[../spec_helper])
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+ require 'time'
2
3
 
3
4
  describe "ApiResponse" do
4
5
 
@@ -32,14 +33,80 @@ describe "ApiResponse" do
32
33
  original_response = Sevendigital::ApiResponseDigestor.new(@client).from_xml\
33
34
  ("<response status='ok'><testElement id='123'>value</testElement></response>")
34
35
  original_response.error_code = 99
36
+ original_response.headers = {"header" => "value"}
37
+
35
38
 
36
39
  tmp = Marshal.dump(original_response)
37
40
  restored_response = Marshal.load(tmp)
38
41
 
39
42
  restored_response.error_code.should == original_response.error_code
40
- restored_response.content.should == original_response.content
43
+ restored_response.content.to_s.should == original_response.content.to_s
41
44
  restored_response.content.test_element.value.should == "value"
45
+ restored_response.headers.should == original_response.headers
46
+
47
+ end
48
+
49
+ it "should be out of date if it's past its cache max age" do
50
+ now = Time.now.utc
51
+ yesterday = now - 24*60*60
52
+ max_age = 12*60*60
53
+
54
+ response = Sevendigital::ApiResponse.new
55
+ response.headers = {"cache-control" => "private, max-age=#{max_age}", "Date" => yesterday.httpdate}
56
+
57
+ response.out_of_date?(now).should == true
58
+
59
+ end
60
+
61
+ it "should be out of date if it's past its cache max age" do
62
+ now = Time.now.utc
63
+ yesterday = now - 24*60*60
64
+ max_age = 12*60*60
65
+
66
+ response = Sevendigital::ApiResponse.new
67
+ response.headers = {"cache-control" => "private, max-age=#{max_age}", "Date" => yesterday.httpdate}
68
+
69
+ response.out_of_date?(now).should == true
70
+
71
+ end
72
+
73
+ it "should not be out of date if it's within its cache max age" do
74
+ now = Time.now.utc
75
+ yesterday = now - 24*60*60
76
+ max_age = 48*60*60
77
+ # stub_time(now)
78
+
79
+ response = Sevendigital::ApiResponse.new
80
+ response.headers = {"cache-control" => "private, max-age=#{max_age}", "Date" => yesterday.httpdate}
81
+
82
+ response.out_of_date?(now).should == false
83
+
84
+ end
85
+
86
+ it "should be out of date if it is missing caching headers" do
42
87
 
88
+ response = Sevendigital::ApiResponse.new
89
+ response.out_of_date?(Time.now.utc).should == true
90
+
91
+ response.headers = {"Date" => Time.now.utc.httpdate}
92
+ response.out_of_date?(Time.now.utc).should == true
93
+
94
+ end
95
+
96
+ it "should be out of date if no max-age has been specified" do
97
+
98
+ response = Sevendigital::ApiResponse.new
99
+ response.headers = {"cache-control" => "no-cache", "Date" => Time.now.utc.httpdate}
100
+ response.out_of_date?(Time.now.utc).should == true
101
+
102
+ end
103
+
104
+ it "should be out of date if it is missing Date header" do
105
+
106
+ response = Sevendigital::ApiResponse.new
107
+ response.headers = {"cache-control" => "private, max-age=#{2**30}"}
108
+ response.out_of_date?(Time.now.utc).should == true
109
+
43
110
  end
44
111
 
45
112
  end
@@ -1,5 +1,5 @@
1
1
  require "date"
2
- require File.join(File.dirname(__FILE__), %w[../spec_helper])
2
+ require File.expand_path('../../spec_helper', __FILE__)
3
3
 
4
4
  describe "Artist" do
5
5
 
@@ -41,18 +41,6 @@ describe "Artist" do
41
41
 
42
42
  end
43
43
 
44
- it "get_releases should link all releases back to artist itself" do
45
-
46
- @artist_manager.should_receive(:get_releases) { |artist_id, options|
47
- artist_id.should == @artist.id
48
- fake_release_list
49
- }
50
-
51
- releases = @artist.get_releases()
52
- releases.all?{|release| release.artist == @artist}.should == true
53
-
54
- end
55
-
56
44
  it "get_top_tracks should get tracks from manager" do
57
45
  expected_options = {:page => 2}
58
46
 
@@ -63,19 +51,6 @@ describe "Artist" do
63
51
  }
64
52
  @artist.get_top_tracks(expected_options)
65
53
 
66
- end
67
-
68
- it "get_top_tracks should link all tracks back to artist itself" do
69
-
70
- @artist_manager.should_receive(:get_top_tracks) { |artist_id, options|
71
- artist_id.should == @artist.id
72
- fake_track_list
73
- }
74
-
75
- tracks = @artist.get_top_tracks()
76
-
77
- tracks.all?{|track| track.artist == @artist}.should == true
78
-
79
54
  end
80
55
 
81
56
  it "get_similar should get similar artists from manager" do
@@ -0,0 +1,63 @@
1
+ require File.expand_path('../../spec_helper', __FILE__)
2
+
3
+ describe "Basket" do
4
+
5
+ before do
6
+ @client = stub(Sevendigital::Client)
7
+ @basket_manager = mock(Sevendigital::BasketManager)
8
+ @client.stub!(:basket).and_return @basket_manager
9
+
10
+ @basket = Sevendigital::Basket.new(@client)
11
+ @basket.id = "00000000-0000-0000-0000-000000000001"
12
+ end
13
+
14
+ it "add_item should should call add_item on basket manager and update the basket items" do
15
+ expected_options = {:page => 2}
16
+ a_track_id = 123
17
+ a_release_id = 456
18
+
19
+ a_basket_id = @basket.id
20
+ an_updated_basket = fake_basket_with_items(@basket.id)
21
+
22
+ @basket_manager.should_receive(:add_item) { |basket_id, release_id, track_id, options|
23
+ basket_id.should == @basket.id
24
+ release_id.should == a_release_id
25
+ track_id.should == a_track_id
26
+ (options.keys & expected_options.keys).should == expected_options.keys
27
+ an_updated_basket
28
+ }
29
+ @basket.add_item(a_release_id, a_track_id, expected_options)
30
+
31
+ @basket.id.should == a_basket_id
32
+ @basket.basket_items.should == an_updated_basket.basket_items
33
+
34
+ end
35
+
36
+ it "remove_item should should call remove_item on basket manager and update the basket items" do
37
+ expected_options = {:page => 2}
38
+ an_item_id = 123
39
+
40
+ a_basket_id = @basket.id
41
+ an_updated_basket = fake_basket_with_items(@basket.id)
42
+
43
+ @basket_manager.should_receive(:remove_item) { |basket_id, item_id, options|
44
+ basket_id.should == @basket.id
45
+ item_id.should == an_item_id
46
+ (options.keys & expected_options.keys).should == expected_options.keys
47
+ an_updated_basket
48
+ }
49
+ @basket.remove_item(an_item_id, expected_options)
50
+
51
+ @basket.id.should == a_basket_id
52
+ @basket.basket_items.should == an_updated_basket.basket_items
53
+
54
+ end
55
+
56
+
57
+ def fake_basket_with_items(id)
58
+ basket = Sevendigital::Basket.new(@client)
59
+ basket.id = id
60
+ basket.basket_items = [Sevendigital::BasketItem.new(@client), Sevendigital::BasketItem.new(@client)]
61
+ basket
62
+ end
63
+ end
@@ -0,0 +1,66 @@
1
+ $(document).ready(function() {
2
+ $('.file_list').dataTable({
3
+ "aaSorting": [[ 1, "asc" ]],
4
+ "bPaginate": false,
5
+ "bJQueryUI": true,
6
+ "aoColumns": [
7
+ null,
8
+ { "sType": "percent" },
9
+ null,
10
+ null,
11
+ null,
12
+ null
13
+ ]
14
+ });
15
+
16
+ $('.source_table tbody tr:odd').addClass('odd');
17
+ $('.source_table tbody tr:even').addClass('even');
18
+
19
+ $("a.src_link").fancybox({
20
+ 'hideOnContentClick': true
21
+ });
22
+
23
+ // Hide src files and file list container
24
+ $('.source_files').hide();
25
+ $('.file_list_container').hide();
26
+
27
+ // Add tabs based upon existing file_list_containers
28
+ $('.file_list_container h2').each(function(){
29
+ $('.group_tabs').append('<li><a href="#' + $(this).parent().attr('id') + '">' + $(this).html() + '</a></li>');
30
+ });
31
+
32
+ $('.group_tabs a').each( function() {
33
+ $(this).addClass($(this).attr('href').replace('#', ''));
34
+ });
35
+
36
+ $('.group_tabs a').live('focus', function() {
37
+ $(this).blur();
38
+ });
39
+
40
+ var favicon_path = $('link[rel="shortcut icon"]').attr('href')
41
+ $('.group_tabs a').live('click', function(){
42
+ if (!$(this).parent().hasClass('active')) {
43
+ $('.group_tabs a').parent().removeClass('active');
44
+ $(this).parent().addClass('active');
45
+ $('.file_list_container').hide();
46
+ $(".file_list_container" + $(this).attr('href')).show();
47
+ window.location.href = window.location.href.split('#')[0] + $(this).attr('href').replace('#', '#_');
48
+
49
+ // Force favicon reload - otherwise the location change containing anchor would drop the favicon...
50
+ // Works only on firefox, but still... - Anyone know a better solution to force favicon?
51
+ $('link[rel="shortcut icon"]').remove();
52
+ $('head').append('<link rel="shortcut icon" type="image/png" href="'+ favicon_path +'" />');
53
+ };
54
+ return false;
55
+ });
56
+
57
+ if (jQuery.url.attr('anchor')) {
58
+ $('.group_tabs a.'+jQuery.url.attr('anchor').replace('_', '')).click();
59
+ } else {
60
+ $('.group_tabs a:first').click();
61
+ };
62
+
63
+ $("abbr.timeago").timeago();
64
+ $('#loading').fadeOut();
65
+ $('#wrapper').show();
66
+ });
@@ -0,0 +1,363 @@
1
+ /*
2
+ * FancyBox - jQuery Plugin
3
+ * Simple and fancy lightbox alternative
4
+ *
5
+ * Examples and documentation at: http://fancybox.net
6
+ *
7
+ * Copyright (c) 2008 - 2010 Janis Skarnelis
8
+ *
9
+ * Version: 1.3.1 (05/03/2010)
10
+ * Requires: jQuery v1.3+
11
+ *
12
+ * Dual licensed under the MIT and GPL licenses:
13
+ * http://www.opensource.org/licenses/mit-license.php
14
+ * http://www.gnu.org/licenses/gpl.html
15
+ */
16
+
17
+ #fancybox-loading {
18
+ position: fixed;
19
+ top: 50%;
20
+ left: 50%;
21
+ height: 40px;
22
+ width: 40px;
23
+ margin-top: -20px;
24
+ margin-left: -20px;
25
+ cursor: pointer;
26
+ overflow: hidden;
27
+ z-index: 1104;
28
+ display: none;
29
+ }
30
+
31
+ * html #fancybox-loading { /* IE6 */
32
+ position: absolute;
33
+ margin-top: 0;
34
+ }
35
+
36
+ #fancybox-loading div {
37
+ position: absolute;
38
+ top: 0;
39
+ left: 0;
40
+ width: 40px;
41
+ height: 480px;
42
+ background-image: url('fancybox.png');
43
+ }
44
+
45
+ #fancybox-overlay {
46
+ position: fixed;
47
+ top: 0;
48
+ left: 0;
49
+ bottom: 0;
50
+ right: 0;
51
+ background: #000;
52
+ z-index: 1100;
53
+ display: none;
54
+ }
55
+
56
+ * html #fancybox-overlay { /* IE6 */
57
+ position: absolute;
58
+ width: 100%;
59
+ }
60
+
61
+ #fancybox-tmp {
62
+ padding: 0;
63
+ margin: 0;
64
+ border: 0;
65
+ overflow: auto;
66
+ display: none;
67
+ }
68
+
69
+ #fancybox-wrap {
70
+ position: absolute;
71
+ top: 0;
72
+ left: 0;
73
+ margin: 0;
74
+ padding: 20px;
75
+ z-index: 1101;
76
+ display: none;
77
+ }
78
+
79
+ #fancybox-outer {
80
+ position: relative;
81
+ width: 100%;
82
+ height: 100%;
83
+ background: #FFF;
84
+ }
85
+
86
+ #fancybox-inner {
87
+ position: absolute;
88
+ top: 0;
89
+ left: 0;
90
+ width: 1px;
91
+ height: 1px;
92
+ padding: 0;
93
+ margin: 0;
94
+ outline: none;
95
+ overflow: hidden;
96
+ }
97
+
98
+ #fancybox-hide-sel-frame {
99
+ position: absolute;
100
+ top: 0;
101
+ left: 0;
102
+ width: 100%;
103
+ height: 100%;
104
+ background: transparent;
105
+ }
106
+
107
+ #fancybox-close {
108
+ position: absolute;
109
+ top: -15px;
110
+ right: -15px;
111
+ width: 30px;
112
+ height: 30px;
113
+ background-image: url('fancybox.png');
114
+ background-position: -40px 0px;
115
+ cursor: pointer;
116
+ z-index: 1103;
117
+ display: none;
118
+ }
119
+
120
+ #fancybox_error {
121
+ color: #444;
122
+ font: normal 12px/20px Arial;
123
+ padding: 7px;
124
+ margin: 0;
125
+ }
126
+
127
+ #fancybox-content {
128
+ height: auto;
129
+ width: auto;
130
+ padding: 0;
131
+ margin: 0;
132
+ }
133
+
134
+ #fancybox-img {
135
+ width: 100%;
136
+ height: 100%;
137
+ padding: 0;
138
+ margin: 0;
139
+ border: none;
140
+ outline: none;
141
+ line-height: 0;
142
+ vertical-align: top;
143
+ -ms-interpolation-mode: bicubic;
144
+ }
145
+
146
+ #fancybox-frame {
147
+ position: relative;
148
+ width: 100%;
149
+ height: 100%;
150
+ border: none;
151
+ display: block;
152
+ }
153
+
154
+ #fancybox-title {
155
+ position: absolute;
156
+ bottom: 0;
157
+ left: 0;
158
+ font-family: Arial;
159
+ font-size: 12px;
160
+ z-index: 1102;
161
+ }
162
+
163
+ .fancybox-title-inside {
164
+ padding: 10px 0;
165
+ text-align: center;
166
+ color: #333;
167
+ }
168
+
169
+ .fancybox-title-outside {
170
+ padding-top: 5px;
171
+ color: #FFF;
172
+ text-align: center;
173
+ font-weight: bold;
174
+ }
175
+
176
+ .fancybox-title-over {
177
+ color: #FFF;
178
+ text-align: left;
179
+ }
180
+
181
+ #fancybox-title-over {
182
+ padding: 10px;
183
+ background-image: url('fancy_title_over.png');
184
+ display: block;
185
+ }
186
+
187
+ #fancybox-title-wrap {
188
+ display: inline-block;
189
+ }
190
+
191
+ #fancybox-title-wrap span {
192
+ height: 32px;
193
+ float: left;
194
+ }
195
+
196
+ #fancybox-title-left {
197
+ padding-left: 15px;
198
+ background-image: url('fancybox.png');
199
+ background-position: -40px -90px;
200
+ background-repeat: no-repeat;
201
+ }
202
+
203
+ #fancybox-title-main {
204
+ font-weight: bold;
205
+ line-height: 29px;
206
+ background-image: url('fancybox-x.png');
207
+ background-position: 0px -40px;
208
+ color: #FFF;
209
+ }
210
+
211
+ #fancybox-title-right {
212
+ padding-left: 15px;
213
+ background-image: url('fancybox.png');
214
+ background-position: -55px -90px;
215
+ background-repeat: no-repeat;
216
+ }
217
+
218
+ #fancybox-left, #fancybox-right {
219
+ position: absolute;
220
+ bottom: 0px;
221
+ height: 100%;
222
+ width: 35%;
223
+ cursor: pointer;
224
+ outline: none;
225
+ background-image: url('blank.gif');
226
+ z-index: 1102;
227
+ display: none;
228
+ }
229
+
230
+ #fancybox-left {
231
+ left: 0px;
232
+ }
233
+
234
+ #fancybox-right {
235
+ right: 0px;
236
+ }
237
+
238
+ #fancybox-left-ico, #fancybox-right-ico {
239
+ position: absolute;
240
+ top: 50%;
241
+ left: -9999px;
242
+ width: 30px;
243
+ height: 30px;
244
+ margin-top: -15px;
245
+ cursor: pointer;
246
+ z-index: 1102;
247
+ display: block;
248
+ }
249
+
250
+ #fancybox-left-ico {
251
+ background-image: url('fancybox.png');
252
+ background-position: -40px -30px;
253
+ }
254
+
255
+ #fancybox-right-ico {
256
+ background-image: url('fancybox.png');
257
+ background-position: -40px -60px;
258
+ }
259
+
260
+ #fancybox-left:hover, #fancybox-right:hover {
261
+ visibility: visible; /* IE6 */
262
+ }
263
+
264
+ #fancybox-left:hover span {
265
+ left: 20px;
266
+ }
267
+
268
+ #fancybox-right:hover span {
269
+ left: auto;
270
+ right: 20px;
271
+ }
272
+
273
+ .fancy-bg {
274
+ position: absolute;
275
+ padding: 0;
276
+ margin: 0;
277
+ border: 0;
278
+ width: 20px;
279
+ height: 20px;
280
+ z-index: 1001;
281
+ }
282
+
283
+ #fancy-bg-n {
284
+ top: -20px;
285
+ left: 0;
286
+ width: 100%;
287
+ background-image: url('fancybox-x.png');
288
+ }
289
+
290
+ #fancy-bg-ne {
291
+ top: -20px;
292
+ right: -20px;
293
+ background-image: url('fancybox.png');
294
+ background-position: -40px -162px;
295
+ }
296
+
297
+ #fancy-bg-e {
298
+ top: 0;
299
+ right: -20px;
300
+ height: 100%;
301
+ background-image: url('fancybox-y.png');
302
+ background-position: -20px 0px;
303
+ }
304
+
305
+ #fancy-bg-se {
306
+ bottom: -20px;
307
+ right: -20px;
308
+ background-image: url('fancybox.png');
309
+ background-position: -40px -182px;
310
+ }
311
+
312
+ #fancy-bg-s {
313
+ bottom: -20px;
314
+ left: 0;
315
+ width: 100%;
316
+ background-image: url('fancybox-x.png');
317
+ background-position: 0px -20px;
318
+ }
319
+
320
+ #fancy-bg-sw {
321
+ bottom: -20px;
322
+ left: -20px;
323
+ background-image: url('fancybox.png');
324
+ background-position: -40px -142px;
325
+ }
326
+
327
+ #fancy-bg-w {
328
+ top: 0;
329
+ left: -20px;
330
+ height: 100%;
331
+ background-image: url('fancybox-y.png');
332
+ }
333
+
334
+ #fancy-bg-nw {
335
+ top: -20px;
336
+ left: -20px;
337
+ background-image: url('fancybox.png');
338
+ background-position: -40px -122px;
339
+ }
340
+
341
+ /* IE */
342
+
343
+ #fancybox-loading.fancybox-ie div { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_loading.png', sizingMethod='scale'); }
344
+ .fancybox-ie #fancybox-close { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_close.png', sizingMethod='scale'); }
345
+
346
+ .fancybox-ie #fancybox-title-over { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_over.png', sizingMethod='scale'); zoom: 1; }
347
+ .fancybox-ie #fancybox-title-left { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_left.png', sizingMethod='scale'); }
348
+ .fancybox-ie #fancybox-title-main { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_main.png', sizingMethod='scale'); }
349
+ .fancybox-ie #fancybox-title-right { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_right.png', sizingMethod='scale'); }
350
+
351
+ .fancybox-ie #fancybox-left-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_nav_left.png', sizingMethod='scale'); }
352
+ .fancybox-ie #fancybox-right-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_nav_right.png', sizingMethod='scale'); }
353
+
354
+ .fancybox-ie .fancy-bg { background: transparent !important; }
355
+
356
+ .fancybox-ie #fancy-bg-n { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_n.png', sizingMethod='scale'); }
357
+ .fancybox-ie #fancy-bg-ne { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_ne.png', sizingMethod='scale'); }
358
+ .fancybox-ie #fancy-bg-e { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_e.png', sizingMethod='scale'); }
359
+ .fancybox-ie #fancy-bg-se { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_se.png', sizingMethod='scale'); }
360
+ .fancybox-ie #fancy-bg-s { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_s.png', sizingMethod='scale'); }
361
+ .fancybox-ie #fancy-bg-sw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_sw.png', sizingMethod='scale'); }
362
+ .fancybox-ie #fancy-bg-w { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_w.png', sizingMethod='scale'); }
363
+ .fancybox-ie #fancy-bg-nw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_nw.png', sizingMethod='scale'); }