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.
- data/README.rdoc +132 -5
- data/lib/sevendigital.rb +1 -2
- data/lib/sevendigital/api_operator.rb +103 -12
- data/lib/sevendigital/api_operator_cached.rb +14 -8
- data/lib/sevendigital/api_request.rb +50 -9
- data/lib/sevendigital/client.rb +51 -89
- data/lib/sevendigital/client_configuration.rb +86 -0
- data/lib/sevendigital/client_digestors.rb +79 -0
- data/lib/sevendigital/client_managers.rb +34 -0
- data/lib/sevendigital/digestion_tract/api_response_digestor.rb +8 -3
- data/lib/sevendigital/digestion_tract/artist_digestor.rb +1 -1
- data/lib/sevendigital/digestion_tract/basket_digestor.rb +18 -0
- data/lib/sevendigital/digestion_tract/basket_item_digestor.rb +25 -0
- data/lib/sevendigital/digestion_tract/chart_item_digestor.rb +1 -1
- data/lib/sevendigital/digestion_tract/digestor.rb +7 -3
- data/lib/sevendigital/digestion_tract/download_url_digestor.rb +19 -0
- data/lib/sevendigital/digestion_tract/format_digestor.rb +1 -1
- data/lib/sevendigital/digestion_tract/label_digestor.rb +1 -1
- data/lib/sevendigital/digestion_tract/locker_digestor.rb +17 -0
- data/lib/sevendigital/digestion_tract/locker_release_digestor.rb +19 -0
- data/lib/sevendigital/digestion_tract/locker_track_digestor.rb +21 -0
- data/lib/sevendigital/digestion_tract/oauth_access_token_digestor.rb +14 -0
- data/lib/sevendigital/digestion_tract/oauth_request_token_digestor.rb +14 -0
- data/lib/sevendigital/digestion_tract/pager_digestor.rb +1 -1
- data/lib/sevendigital/digestion_tract/price_digestor.rb +3 -3
- data/lib/sevendigital/digestion_tract/release_digestor.rb +1 -1
- data/lib/sevendigital/digestion_tract/tag_digestor.rb +22 -0
- data/lib/sevendigital/digestion_tract/track_digestor.rb +1 -1
- data/lib/sevendigital/management/artist_manager.rb +71 -34
- data/lib/sevendigital/management/basket_manager.rb +29 -0
- data/lib/sevendigital/management/manager.rb +1 -1
- data/lib/sevendigital/management/oauth_manager.rb +23 -0
- data/lib/sevendigital/management/release_manager.rb +7 -14
- data/lib/sevendigital/management/tag_manager.rb +11 -0
- data/lib/sevendigital/management/track_manager.rb +9 -9
- data/lib/sevendigital/management/user_manager.rb +51 -0
- data/lib/sevendigital/model/api_response.rb +19 -3
- data/lib/sevendigital/model/artist.rb +27 -9
- data/lib/sevendigital/model/basket.rb +16 -0
- data/lib/sevendigital/model/basket_item.rb +15 -0
- data/lib/sevendigital/model/download_url.rb +7 -0
- data/lib/sevendigital/model/format.rb +0 -2
- data/lib/sevendigital/model/label.rb +1 -3
- data/lib/sevendigital/model/locker.rb +5 -0
- data/lib/sevendigital/model/locker_release.rb +9 -0
- data/lib/sevendigital/model/locker_track.rb +9 -0
- data/lib/sevendigital/model/price.rb +0 -2
- data/lib/sevendigital/model/release.rb +22 -8
- data/lib/sevendigital/model/sevendigital_error.rb +9 -1
- data/lib/sevendigital/model/sevendigital_object.rb +16 -11
- data/lib/sevendigital/model/tag.rb +7 -0
- data/lib/sevendigital/model/track.rb +4 -4
- data/lib/sevendigital/model/user.rb +34 -0
- data/lib/sevendigital/pager.rb +8 -2
- data/lib/sevendigital/proxy_police.rb +5 -1
- data/lib/sevendigital/version.rb +5 -0
- data/spec/api_operator_cached_spec.rb +62 -7
- data/spec/api_operator_spec.rb +245 -21
- data/spec/api_request_spec.rb +20 -15
- data/spec/client_configuration_spec.rb +75 -0
- data/spec/client_spec.rb +126 -48
- data/spec/coverage/assets/0.3.9/app.js +66 -0
- data/spec/coverage/assets/0.3.9/fancybox/blank.gif +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_close.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_loading.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_nav_left.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_nav_right.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_e.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_n.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_ne.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_nw.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_s.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_se.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_sw.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_w.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_title_left.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_title_main.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_title_over.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_title_right.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancybox-x.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancybox-y.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancybox.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.css +363 -0
- data/spec/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.pack.js +44 -0
- data/spec/coverage/assets/0.3.9/favicon.png +0 -0
- data/spec/coverage/assets/0.3.9/jquery-1.4.2.min.js +155 -0
- data/spec/coverage/assets/0.3.9/jquery.dataTables.min.js +152 -0
- data/spec/coverage/assets/0.3.9/jquery.timeago.js +141 -0
- data/spec/coverage/assets/0.3.9/jquery.url.js +174 -0
- data/spec/coverage/assets/0.3.9/loading.gif +0 -0
- data/spec/coverage/assets/0.3.9/magnify.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/jquery-ui-1.8.4.custom.css +295 -0
- data/spec/coverage/assets/0.3.9/stylesheet.css +341 -0
- data/spec/coverage/index.html +43412 -0
- data/spec/coverage/resultset.yml +3251 -0
- data/spec/data/configuration_override.yml +2 -1
- data/spec/digestion_tract/api_response_digestor_spec.rb +15 -1
- data/spec/digestion_tract/artist_digestor_spec.rb +3 -3
- data/spec/digestion_tract/basket_digestor_spec.rb +32 -0
- data/spec/digestion_tract/basket_item_digestor_spec.rb +58 -0
- data/spec/digestion_tract/chart_digestor_spec.rb +2 -2
- data/spec/digestion_tract/download_url_digestor_spec.rb +41 -0
- data/spec/digestion_tract/format_digestor_spec.rb +2 -2
- data/spec/digestion_tract/label_digestor_spec.rb +2 -2
- data/spec/digestion_tract/locker_digestor_spec.rb +31 -0
- data/spec/digestion_tract/locker_release_digestor_spec.rb +71 -0
- data/spec/digestion_tract/locker_track_digestor_spec.rb +56 -0
- data/spec/digestion_tract/oauth_access_token_digestor_spec.rb +35 -0
- data/spec/digestion_tract/oauth_request_token_digestor_spec.rb +35 -0
- data/spec/digestion_tract/pager_digestor_spec.rb +2 -2
- data/spec/digestion_tract/price_digestor_spec.rb +21 -5
- data/spec/digestion_tract/release_digestor_spec.rb +2 -2
- data/spec/digestion_tract/tag_digestor_spec.rb +46 -0
- data/spec/digestion_tract/track_digestor_spec.rb +1 -1
- data/spec/management/artist_manager_spec.rb +46 -41
- data/spec/management/basket_manager_spec.rb +78 -0
- data/spec/management/oauth_manager_spec.rb +73 -0
- data/spec/management/release_manager_spec.rb +33 -74
- data/spec/management/tag_manager_spec.rb +34 -0
- data/spec/management/track_manager_spec.rb +42 -25
- data/spec/management/user_manager_spec.rb +163 -0
- data/spec/model/api_response_spec.rb +69 -2
- data/spec/model/artist_spec.rb +1 -26
- data/spec/model/basket_spec.rb +63 -0
- data/spec/model/coverage/assets/0.3.9/app.js +66 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/blank.gif +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_close.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_loading.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_nav_left.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_nav_right.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_e.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_n.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_ne.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_nw.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_s.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_se.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_sw.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_w.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_left.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_main.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_over.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_right.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancybox-x.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancybox-y.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancybox.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.css +363 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.pack.js +44 -0
- data/spec/model/coverage/assets/0.3.9/favicon.png +0 -0
- data/spec/model/coverage/assets/0.3.9/jquery-1.4.2.min.js +155 -0
- data/spec/model/coverage/assets/0.3.9/jquery.dataTables.min.js +152 -0
- data/spec/model/coverage/assets/0.3.9/jquery.timeago.js +141 -0
- data/spec/model/coverage/assets/0.3.9/jquery.url.js +174 -0
- data/spec/model/coverage/assets/0.3.9/loading.gif +0 -0
- data/spec/model/coverage/assets/0.3.9/magnify.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/jquery-ui-1.8.4.custom.css +295 -0
- data/spec/model/coverage/assets/0.3.9/stylesheet.css +341 -0
- data/spec/model/coverage/index.html +8637 -0
- data/spec/model/coverage/resultset.yml +642 -0
- data/spec/model/release_spec.rb +15 -14
- data/spec/model/sevendigital_object_spec.rb +74 -0
- data/spec/model/track_spec.rb +8 -4
- data/spec/model/user_spec.rb +98 -0
- data/spec/pager_spec.rb +2 -2
- data/spec/proxy_police_spec.rb +1 -1
- data/spec/spec_helper.rb +11 -3
- data/spec/test-xml/methods/artist/browse.xml +22 -0
- data/spec/test-xml/methods/artist/chart.xml +31 -0
- data/spec/test-xml/methods/basket/additem.xml +24 -0
- data/spec/test-xml/methods/basket/create.xml +11 -0
- data/spec/test-xml/methods/basket/index.xml +24 -0
- data/spec/test-xml/methods/basket/removeitem.xml +11 -0
- data/spec/test-xml/methods/oauth/accesstoken.xml +6 -0
- data/spec/test-xml/methods/oauth/requesttoken.xml +6 -0
- data/spec/test-xml/methods/tag/index.xml +17 -0
- data/spec/test-xml/methods/user/locker.xml +50 -0
- data/spec/test-xml/methods/user/purchase/item.xml +49 -0
- data/spec/test-xml/objects/basket.xml +22 -0
- data/spec/test-xml/objects/basket_item.xml +12 -0
- data/spec/test-xml/objects/basket_item_list.xml +26 -0
- data/spec/test-xml/objects/basket_item_list_empty.xml +2 -0
- data/spec/test-xml/objects/download_url.xml +8 -0
- data/spec/test-xml/objects/locker.xml +48 -0
- data/spec/test-xml/objects/locker_release.xml +41 -0
- data/spec/test-xml/objects/locker_release_list.xml +87 -0
- data/spec/test-xml/objects/locker_release_list_empty.xml +5 -0
- data/spec/test-xml/objects/locker_release_one_item_list.xml +43 -0
- data/spec/test-xml/objects/locker_track.xml +25 -0
- data/spec/test-xml/objects/locker_track_list.xml +26 -0
- data/spec/test-xml/objects/locker_track_list_empty.xml +2 -0
- data/spec/test-xml/objects/oauth_access_token.xml +4 -0
- data/spec/test-xml/objects/oauth_request_token.xml +4 -0
- data/spec/test-xml/objects/tag.xml +5 -0
- metadata +395 -13
- 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
|
-
|
|
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
|
-
|
|
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
|
|
@@ -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
|
|
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
|
-
@
|
|
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;
|
|
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
|
-
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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)
|
|
@@ -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, :
|
|
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.
|
|
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
|
data/lib/sevendigital/pager.rb
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
|
|
1
|
+
begin
|
|
2
|
+
require "will_paginate/collection"
|
|
3
|
+
rescue LoadError
|
|
4
|
+
end
|
|
2
5
|
|
|
3
6
|
module Sevendigital
|
|
4
7
|
|
|
5
|
-
class
|
|
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
|
-
|
|
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
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require
|
|
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(
|
|
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 =
|
|
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(
|
|
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 =
|
|
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
|
-
|
|
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
|