7digital 0.0.1

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 (85) hide show
  1. data/README.rdoc +7 -0
  2. data/lib/peachy_patchy.rb +14 -0
  3. data/lib/sevendigital.rb +53 -0
  4. data/lib/sevendigital/api_operator.rb +31 -0
  5. data/lib/sevendigital/api_operator_cached.rb +23 -0
  6. data/lib/sevendigital/api_request.rb +24 -0
  7. data/lib/sevendigital/client.rb +124 -0
  8. data/lib/sevendigital/default_configuration.yml +2 -0
  9. data/lib/sevendigital/digestion_tract/api_response_digestor.rb +52 -0
  10. data/lib/sevendigital/digestion_tract/artist_digestor.rb +31 -0
  11. data/lib/sevendigital/digestion_tract/chart_item_digestor.rb +27 -0
  12. data/lib/sevendigital/digestion_tract/digestor.rb +66 -0
  13. data/lib/sevendigital/digestion_tract/format_digestor.rb +21 -0
  14. data/lib/sevendigital/digestion_tract/label_digestor.rb +20 -0
  15. data/lib/sevendigital/digestion_tract/pager_digestor.rb +23 -0
  16. data/lib/sevendigital/digestion_tract/price_digestor.rb +25 -0
  17. data/lib/sevendigital/digestion_tract/release_digestor.rb +52 -0
  18. data/lib/sevendigital/digestion_tract/track_digestor.rb +37 -0
  19. data/lib/sevendigital/management/artist_manager.rb +39 -0
  20. data/lib/sevendigital/management/manager.rb +11 -0
  21. data/lib/sevendigital/management/release_manager.rb +51 -0
  22. data/lib/sevendigital/management/track_manager.rb +18 -0
  23. data/lib/sevendigital/model/api_response.rb +13 -0
  24. data/lib/sevendigital/model/artist.rb +37 -0
  25. data/lib/sevendigital/model/chart_item.rb +9 -0
  26. data/lib/sevendigital/model/format.rb +9 -0
  27. data/lib/sevendigital/model/label.rb +9 -0
  28. data/lib/sevendigital/model/price.rb +11 -0
  29. data/lib/sevendigital/model/release.rb +34 -0
  30. data/lib/sevendigital/model/sevendigital_error.rb +3 -0
  31. data/lib/sevendigital/model/sevendigital_object.rb +51 -0
  32. data/lib/sevendigital/model/track.rb +8 -0
  33. data/lib/sevendigital/pager.rb +17 -0
  34. data/lib/sevendigital/proxy_police.rb +24 -0
  35. data/lib/sevendigital/version.rb +3 -0
  36. data/spec/api_operator_cached_spec.rb +47 -0
  37. data/spec/api_operator_spec.rb +108 -0
  38. data/spec/api_request_spec.rb +27 -0
  39. data/spec/client_spec.rb +46 -0
  40. data/spec/data/config/sevendigital.yml +5 -0
  41. data/spec/data/configuration_env_override.yml +5 -0
  42. data/spec/data/configuration_override.yml +1 -0
  43. data/spec/digestion_tract/api_response_digestor_spec.rb +74 -0
  44. data/spec/digestion_tract/artist_digestor_spec.rb +83 -0
  45. data/spec/digestion_tract/chart_digestor_spec.rb +54 -0
  46. data/spec/digestion_tract/format_digestor_spec.rb +40 -0
  47. data/spec/digestion_tract/label_digestor_spec.rb +35 -0
  48. data/spec/digestion_tract/pager_digestor_spec.rb +52 -0
  49. data/spec/digestion_tract/price_digestor_spec.rb +57 -0
  50. data/spec/digestion_tract/release_digestor_spec.rb +102 -0
  51. data/spec/digestion_tract/track_digestor_spec.rb +107 -0
  52. data/spec/management/artist_manager_spec.rb +108 -0
  53. data/spec/management/release_manager_spec.rb +178 -0
  54. data/spec/management/track_manager_spec.rb +52 -0
  55. data/spec/model/api_response_spec.rb +32 -0
  56. data/spec/model/artist_spec.rb +122 -0
  57. data/spec/model/release_spec.rb +111 -0
  58. data/spec/pager_spec.rb +8 -0
  59. data/spec/proxy_police_spec.rb +49 -0
  60. data/spec/spec_helper.rb +48 -0
  61. data/spec/test-xml/methods/artist/byTag/top.xml +51 -0
  62. data/spec/test-xml/methods/artist/details.xml +10 -0
  63. data/spec/test-xml/methods/artist/releases.xml +545 -0
  64. data/spec/test-xml/methods/artist/similar.xml +40 -0
  65. data/spec/test-xml/methods/artist/toptracks.xml +280 -0
  66. data/spec/test-xml/methods/release/bydate.xml +174 -0
  67. data/spec/test-xml/methods/release/bytag/top.xml +151 -0
  68. data/spec/test-xml/methods/release/chart.xml +182 -0
  69. data/spec/test-xml/methods/release/details.xml +49 -0
  70. data/spec/test-xml/methods/release/recommend.xml +90 -0
  71. data/spec/test-xml/methods/release/tracks.xml +29 -0
  72. data/spec/test-xml/methods/track/chart.xml +150 -0
  73. data/spec/test-xml/methods/track/details.xml +31 -0
  74. data/spec/test-xml/objects/artist.xml +7 -0
  75. data/spec/test-xml/objects/artist_chart_item.xml +8 -0
  76. data/spec/test-xml/objects/artist_list.xml +23 -0
  77. data/spec/test-xml/objects/artist_list_empty.xml +5 -0
  78. data/spec/test-xml/objects/price.xml +8 -0
  79. data/spec/test-xml/objects/release.xml +40 -0
  80. data/spec/test-xml/objects/release_chart_item.xml +34 -0
  81. data/spec/test-xml/objects/release_list.xml +19 -0
  82. data/spec/test-xml/objects/release_list_empty.xml +5 -0
  83. data/spec/test-xml/objects/track.xml +34 -0
  84. data/spec/test-xml/objects/track_chart_item.xml +28 -0
  85. metadata +151 -0
@@ -0,0 +1,21 @@
1
+ module Sevendigital
2
+
3
+ class FormatDigestor < Digestor
4
+
5
+ def default_element_name; :format end
6
+ def default_list_element_name; :formats end
7
+
8
+ def from_proxy(format_proxy)
9
+ make_sure_not_eating_nil (format_proxy)
10
+ format = Format.new()
11
+ format.id = format_proxy.id.to_i
12
+ format.file_format = format_proxy.file_format.value.to_sym
13
+ format.bit_rate = format_proxy.bit_rate.value.to_i
14
+ format.drm_free = format_proxy.drm_free.value.to_s.downcase == "true"
15
+
16
+ return format
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,20 @@
1
+ module Sevendigital
2
+
3
+ class LabelDigestor < Digestor
4
+
5
+ def default_element_name; :label end
6
+ def default_list_element_name; :labels end
7
+
8
+ def from_proxy(label_proxy)
9
+ make_sure_not_eating_nil(label_proxy)
10
+
11
+ label = Label.new()
12
+ label.id = label_proxy.id.to_i
13
+ label.name = label_proxy.name.value.to_s
14
+
15
+ return label
16
+ end
17
+
18
+ end
19
+
20
+ end
@@ -0,0 +1,23 @@
1
+ module Sevendigital
2
+
3
+ class PagerDigestor < Digestor
4
+
5
+ def default_element_name; :results end
6
+ def default_list_element_name; nil end
7
+
8
+ def from_proxy(pager_proxy)
9
+ make_sure_not_eating_nil(pager_proxy)
10
+ return nil unless paging_info_available?(pager_proxy)
11
+ pager = Pager.new
12
+ pager.page = pager_proxy.page.value.to_i
13
+ pager.page_size = pager_proxy.page_size.value.to_i
14
+ pager.total_items = pager_proxy.total_items.value.to_i
15
+ return pager
16
+ end
17
+
18
+ def paging_info_available?(pager_proxy)
19
+ pager_proxy.page && pager_proxy.page_size && pager_proxy.total_items
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ require 'rational'
2
+ module Sevendigital
3
+
4
+ class PriceDigestor < Digestor
5
+
6
+ def default_element_name; :price end
7
+ def default_list_element_name; nil end
8
+
9
+ def from_proxy(price_proxy)
10
+ make_sure_not_eating_nil(price_proxy)
11
+ price = Sevendigital::Price.new()
12
+ price.currency_code = price_proxy.currency.code.to_s.upcase.to_sym
13
+ price.currency_symbol= price_proxy.currency.value
14
+ price.value= price_proxy.value.value.to_f
15
+ price.formatted_price= price_proxy.formatted_price.value
16
+ price.rrp= price_proxy.rrp.value.to_f if price_proxy.rrp
17
+ price.formatted_rrp= price_proxy.formatted_rrp.value if price_proxy.formatted_rrp
18
+ price.on_sale = price_proxy.on_sale.value.to_s.downcase == "true"
19
+
20
+ return price
21
+ end
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,52 @@
1
+ module Sevendigital
2
+
3
+ require 'date'
4
+
5
+ class ReleaseDigestor < Digestor
6
+
7
+ def default_element_name; :release end
8
+ def default_list_element_name; :releases end
9
+
10
+ def from_proxy(release_proxy)
11
+ make_sure_not_eating_nil(release_proxy)
12
+ release = Release.new(@api_client)
13
+
14
+ populate_required_properties(release, release_proxy)
15
+ populate_optional_properties(release, release_proxy)
16
+ populate_formats(release, release_proxy)
17
+
18
+ return release
19
+ end
20
+
21
+ def populate_required_properties(release, release_proxy)
22
+ release.id = release_proxy.id.to_i
23
+ release.title = release_proxy.title.value.to_s
24
+ release.artist = @api_client.artist_digestor.from_proxy(release_proxy.artist)
25
+ end
26
+
27
+ def populate_optional_properties(release, release_proxy)
28
+ release.version = release_proxy.version.value.to_s if release_proxy.version
29
+ release.type = release_proxy.type.value.downcase.to_sym if value_present?(release_proxy.type)
30
+ release.barcode = release_proxy.barcode.value.to_s if value_present?(release_proxy.barcode)
31
+ release.year = release_proxy.year.value.to_i if value_present?(release_proxy.year)
32
+ release.explicit_content = release_proxy.explicit_content.value.to_s.downcase == "true" if value_present?(release_proxy.explicit_content)
33
+ release.release_date = DateTime.parse(release_proxy.release_date.value.to_s) if value_present?(release_proxy.release_date)
34
+ release.added_date = DateTime.parse(release_proxy.added_date.value.to_s) if value_present?(release_proxy.added_date)
35
+ release.label = @api_client.label_digestor.from_proxy(release_proxy.label) if content_present?(release_proxy.label)
36
+ release.image = release_proxy.image.value.to_s if value_present?(release_proxy.image)
37
+ release.url = release_proxy.url.value.to_s if value_present?(release_proxy.url)
38
+ release.price = @api_client.price_digestor.from_proxy(release_proxy.price) if content_present?(release_proxy.price)
39
+ end
40
+
41
+ def populate_formats(release, release_proxy)
42
+ if release_proxy.formats && release_proxy.formats.format then
43
+ release.formats = Array.new
44
+ release_proxy.formats.format.each do |format|
45
+ release.formats << @api_client.format_digestor.from_proxy(format)
46
+ end
47
+ end
48
+ end
49
+
50
+ end
51
+
52
+ end
@@ -0,0 +1,37 @@
1
+ module Sevendigital
2
+
3
+ class TrackDigestor < Digestor
4
+
5
+ def default_element_name; :track end
6
+ def default_list_element_name; :tracks end
7
+
8
+
9
+ def from_proxy(track_proxy)
10
+ make_sure_not_eating_nil (track_proxy)
11
+
12
+ track = Track.new(@api_client)
13
+ populate_required_properties(track, track_proxy)
14
+ populate_optional_properties(track, track_proxy)
15
+
16
+ return track
17
+ end
18
+
19
+ def populate_required_properties(track, track_proxy)
20
+ track.id = track_proxy.id.to_i
21
+ track.title = track_proxy.title.value.to_s
22
+ track.artist = @api_client.artist_digestor.from_proxy(track_proxy.artist)
23
+ end
24
+
25
+ def populate_optional_properties(track, track_proxy)
26
+ track.version = track_proxy.version.value.to_s if track_proxy.version
27
+ track.track_number = track_proxy.track_number.value.to_i if track_proxy.track_number
28
+ track.duration = track_proxy.duration.value.to_i if track_proxy.duration
29
+ track.release = @api_client.release_digestor.from_proxy(track_proxy.release) if track_proxy.release
30
+ track.explicit_content = track_proxy.explicit_content.value.to_s.downcase == "true" if track_proxy.explicit_content
31
+ track.isrc = track_proxy.isrc.value.to_s if track_proxy.isrc
32
+ track.image = track_proxy.image.value.to_s if track_proxy.image
33
+ track.url = track_proxy.url.value.to_s if track_proxy.url
34
+ track.price = @api_client.price_digestor.from_proxy(track_proxy.price) if track_proxy.price
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,39 @@
1
+ require "peachy"
2
+
3
+ module Sevendigital
4
+
5
+ class ArtistManager < Manager
6
+
7
+ def get_details(id)
8
+ api_request = Sevendigital::ApiRequest.new("artist/details", {:artistId => id})
9
+ api_response = @api_client.operator.call_api(api_request)
10
+ @api_client.artist_digestor.from_xml(api_response.content.artist)
11
+ end
12
+
13
+ def get_releases(id, options={})
14
+ api_request = Sevendigital::ApiRequest.new("artist/releases", {:artistId => id}, options)
15
+ api_response = @api_client.operator.call_api(api_request)
16
+ @api_client.release_digestor.list_from_xml(api_response.content.releases)
17
+ end
18
+
19
+ def get_top_tracks(id, options={})
20
+ api_request = Sevendigital::ApiRequest.new("artist/toptracks", {:artistId => id}, options)
21
+ api_response = @api_client.operator.call_api(api_request)
22
+ @api_client.track_digestor.list_from_xml(api_response.content.tracks)
23
+ end
24
+
25
+ def get_similar(id, options={})
26
+ api_request = Sevendigital::ApiRequest.new("artist/similar", {:artistId => id}, options)
27
+ api_response = @api_client.operator.call_api(api_request)
28
+ @api_client.artist_digestor.list_from_xml(api_response.content.artists)
29
+ end
30
+
31
+ def get_top_by_tag(tags, options={})
32
+ api_request = Sevendigital::ApiRequest.new("artist/byTag/top", {:tags => tags}, options)
33
+ api_response = @api_client.operator.call_api(api_request)
34
+ @api_client.artist_digestor.nested_list_from_xml(api_response.content.tagged_results, :tagged_item, :tagged_results)
35
+ end
36
+
37
+ end
38
+
39
+ end
@@ -0,0 +1,11 @@
1
+ module Sevendigital
2
+
3
+ class Manager
4
+
5
+ def initialize(api_client)
6
+ @api_client = api_client
7
+ end
8
+
9
+ end
10
+
11
+ end
@@ -0,0 +1,51 @@
1
+ require "peachy"
2
+
3
+ module Sevendigital
4
+
5
+ class ReleaseManager < Manager
6
+
7
+ def get_details(release_id, options = {})
8
+ api_request = Sevendigital::ApiRequest.new("release/details", {:releaseId => release_id}, options)
9
+ api_response = @api_client.operator.call_api(api_request)
10
+ @api_client.release_digestor.from_xml(api_response.content.release)
11
+ end
12
+
13
+ def get_tracks(release_id, options = {})
14
+ api_request = Sevendigital::ApiRequest.new("release/tracks", {:releaseId => release_id}, options)
15
+ api_response = @api_client.operator.call_api(api_request)
16
+ @api_client.track_digestor.list_from_xml(api_response.content.tracks)
17
+ end
18
+
19
+ def get_chart(options={})
20
+ api_request = Sevendigital::ApiRequest.new("release/chart", {}, options)
21
+ api_response = @api_client.operator.call_api(api_request)
22
+ @api_client.chart_item_digestor.list_from_xml(api_response.content.chart)
23
+ end
24
+
25
+ def get_by_date(from_date = nil, to_date = nil, options = {})
26
+ parameters = Hash.new
27
+ parameters[:fromDate] = from_date.strftime("%Y%m%d") if from_date
28
+ parameters[:toDate] = to_date.strftime("%Y%m%d") if to_date
29
+
30
+ api_request = Sevendigital::ApiRequest.new("release/byDate", parameters, options)
31
+ api_response = @api_client.operator.call_api(api_request)
32
+ @api_client.release_digestor.list_from_xml(api_response.content.releases)
33
+ end
34
+
35
+ def get_recommendations(release_id, options = {})
36
+ api_request = Sevendigital::ApiRequest.new("release/recommend", {:releaseId => release_id}, options)
37
+ api_response = @api_client.operator.call_api(api_request)
38
+ @api_client.release_digestor.nested_list_from_xml(api_response.content.recommendations, :recommended_item, :recommendations)
39
+ end
40
+
41
+
42
+ def get_top_by_tag(tags, options = {})
43
+ api_request = Sevendigital::ApiRequest.new("release/byTag/top", {:tags => tags}, options)
44
+ api_response = @api_client.operator.call_api(api_request)
45
+ @api_client.release_digestor.nested_list_from_xml( \
46
+ api_response.content.tagged_results, :tagged_item, :tagged_results )
47
+ end
48
+
49
+ end
50
+
51
+ end
@@ -0,0 +1,18 @@
1
+ module Sevendigital
2
+
3
+ class TrackManager < Manager
4
+
5
+ def get_details(id)
6
+ api_request = Sevendigital::ApiRequest.new("track/details", {:trackId => id})
7
+ api_response = @api_client.operator.call_api(api_request)
8
+ @api_client.track_digestor.from_xml(api_response.content.track)
9
+ end
10
+
11
+ def get_chart(options={})
12
+ api_request = Sevendigital::ApiRequest.new("track/chart", {}, options)
13
+ api_response = @api_client.operator.call_api(api_request)
14
+ @api_client.chart_item_digestor.list_from_xml(api_response.content.chart)
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ module Sevendigital
2
+
3
+ class ApiResponse
4
+
5
+ attr_accessor :error_code, :error_message, :content
6
+
7
+ def ok?
8
+ return (@error_code == 0 && !@content.nil?)
9
+ end
10
+
11
+ end
12
+
13
+ end
@@ -0,0 +1,37 @@
1
+ module Sevendigital
2
+
3
+ class Artist < SevendigitalObject
4
+
5
+ attr_accessor :id, :name, :appears_as
6
+
7
+ sevendigital_basic_property :sort_name, :image, :url
8
+
9
+ def get_details(options={})
10
+ artist_with_details = @api_client.artist.get_details(@id, options)
11
+ copy_basic_properties_from(artist_with_details)
12
+ end
13
+
14
+ sevendigital_extended_property :releases
15
+ sevendigital_extended_property :top_tracks
16
+ sevendigital_extended_property :similar
17
+
18
+ def get_releases(options={})
19
+ @releases = @api_client.artist.get_releases(@id, options).collect do |release|
20
+ release.artist = self
21
+ release
22
+ end
23
+ end
24
+
25
+ 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
30
+ end
31
+
32
+ def get_similar(options={})
33
+ @similar = @api_client.artist.get_similar(@id, options)
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,9 @@
1
+ module Sevendigital
2
+
3
+ class ChartItem < SevendigitalObject
4
+
5
+ attr_accessor :position, :change, :item
6
+
7
+ end
8
+
9
+ end
@@ -0,0 +1,9 @@
1
+ require "peachy"
2
+
3
+ module Sevendigital
4
+
5
+ class Format
6
+ attr_accessor :id, :file_format, :bit_rate, :drm_free
7
+ end
8
+
9
+ end
@@ -0,0 +1,9 @@
1
+ require "peachy"
2
+
3
+ module Sevendigital
4
+
5
+ class Label
6
+ attr_accessor :id, :name
7
+ end
8
+
9
+ end
@@ -0,0 +1,11 @@
1
+ require "peachy"
2
+
3
+ module Sevendigital
4
+
5
+ class Price
6
+
7
+ attr_accessor :currency_code, :currency_symbol, :value, :formatted_price, :rrp, :formatted_rrp, :on_sale
8
+
9
+ end
10
+
11
+ end
@@ -0,0 +1,34 @@
1
+ require "peachy"
2
+ require "will_paginate"
3
+
4
+ module Sevendigital
5
+
6
+ class Release < SevendigitalObject
7
+
8
+ attr_accessor :id, :title
9
+
10
+ sevendigital_basic_property :version, :type, :artist, :image, :url, :release_date,
11
+ :added_date, :barcode, :year, :explicit_content, :formats, :label, :price
12
+
13
+ sevendigital_extended_property :tracks
14
+ sevendigital_extended_property :recommendations
15
+
16
+ def get_details(options={})
17
+ release_with_details = @api_client.release.get_details(@id, options)
18
+ copy_basic_properties_from(release_with_details)
19
+ end
20
+
21
+ def get_tracks(options={})
22
+ @tracks = @api_client.release.get_tracks(@id, options).collect do |track|
23
+ track.release = self
24
+ track
25
+ end
26
+ end
27
+
28
+ def get_recommendations(options={})
29
+ @recommendations = @api_client.release.get_recommendations(@id, options)
30
+ end
31
+
32
+ end
33
+
34
+ end