7digital 0.0.1 → 0.0.2

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 (91) hide show
  1. data/README.rdoc +9 -7
  2. data/lib/sevendigital.rb +54 -53
  3. data/lib/sevendigital/api_operator.rb +33 -30
  4. data/lib/sevendigital/api_operator_cached.rb +23 -23
  5. data/lib/sevendigital/api_request.rb +23 -23
  6. data/lib/sevendigital/client.rb +136 -124
  7. data/lib/sevendigital/default_configuration.yml +2 -2
  8. data/lib/sevendigital/digestion_tract/api_response_digestor.rb +52 -52
  9. data/lib/sevendigital/digestion_tract/artist_digestor.rb +31 -31
  10. data/lib/sevendigital/digestion_tract/chart_item_digestor.rb +27 -27
  11. data/lib/sevendigital/digestion_tract/digestor.rb +66 -66
  12. data/lib/sevendigital/digestion_tract/format_digestor.rb +21 -21
  13. data/lib/sevendigital/digestion_tract/label_digestor.rb +19 -19
  14. data/lib/sevendigital/digestion_tract/pager_digestor.rb +23 -23
  15. data/lib/sevendigital/digestion_tract/price_digestor.rb +24 -24
  16. data/lib/sevendigital/digestion_tract/release_digestor.rb +52 -52
  17. data/lib/sevendigital/digestion_tract/track_digestor.rb +37 -37
  18. data/lib/sevendigital/management/artist_manager.rb +45 -39
  19. data/lib/sevendigital/management/manager.rb +11 -11
  20. data/lib/sevendigital/management/release_manager.rb +57 -50
  21. data/lib/sevendigital/management/track_manager.rb +28 -17
  22. data/lib/sevendigital/model/api_response.rb +24 -12
  23. data/lib/sevendigital/model/artist.rb +46 -36
  24. data/lib/sevendigital/model/chart_item.rb +9 -9
  25. data/lib/sevendigital/model/format.rb +9 -9
  26. data/lib/sevendigital/model/label.rb +9 -9
  27. data/lib/sevendigital/model/price.rb +11 -11
  28. data/lib/sevendigital/model/release.rb +33 -33
  29. data/lib/sevendigital/model/sevendigital_error.rb +3 -3
  30. data/lib/sevendigital/model/sevendigital_object.rb +51 -51
  31. data/lib/sevendigital/model/track.rb +28 -7
  32. data/lib/sevendigital/pager.rb +16 -16
  33. data/lib/sevendigital/peachy_patch.rb +19 -0
  34. data/lib/sevendigital/proxy_police.rb +23 -23
  35. data/spec/api_operator_cached_spec.rb +47 -46
  36. data/spec/api_operator_spec.rb +114 -107
  37. data/spec/api_request_spec.rb +26 -27
  38. data/spec/client_spec.rb +75 -45
  39. data/spec/data/config/sevendigital.yml +5 -5
  40. data/spec/data/configuration_env_override.yml +5 -5
  41. data/spec/digestion_tract/api_response_digestor_spec.rb +78 -74
  42. data/spec/digestion_tract/artist_digestor_spec.rb +81 -82
  43. data/spec/digestion_tract/chart_digestor_spec.rb +52 -53
  44. data/spec/digestion_tract/format_digestor_spec.rb +38 -39
  45. data/spec/digestion_tract/label_digestor_spec.rb +33 -34
  46. data/spec/digestion_tract/pager_digestor_spec.rb +50 -51
  47. data/spec/digestion_tract/price_digestor_spec.rb +57 -57
  48. data/spec/digestion_tract/release_digestor_spec.rb +101 -102
  49. data/spec/digestion_tract/track_digestor_spec.rb +104 -106
  50. data/spec/management/artist_manager_spec.rb +128 -107
  51. data/spec/management/release_manager_spec.rb +222 -178
  52. data/spec/management/track_manager_spec.rb +88 -52
  53. data/spec/model/api_response_spec.rb +44 -31
  54. data/spec/model/artist_spec.rb +166 -121
  55. data/spec/model/release_spec.rb +109 -110
  56. data/spec/model/track_spec.rb +140 -0
  57. data/spec/pager_spec.rb +7 -8
  58. data/spec/peachy_spec_helper_patch.rb +7 -0
  59. data/spec/proxy_police_spec.rb +47 -48
  60. data/spec/spec_helper.rb +52 -48
  61. data/spec/test-xml/methods/artist/byTag/top.xml +50 -50
  62. data/spec/test-xml/methods/artist/details.xml +9 -9
  63. data/spec/test-xml/methods/artist/releases.xml +544 -544
  64. data/spec/test-xml/methods/artist/search.xml +19 -0
  65. data/spec/test-xml/methods/artist/similar.xml +39 -39
  66. data/spec/test-xml/methods/artist/toptracks.xml +279 -279
  67. data/spec/test-xml/methods/release/bydate.xml +173 -173
  68. data/spec/test-xml/methods/release/bytag/top.xml +150 -150
  69. data/spec/test-xml/methods/release/chart.xml +181 -181
  70. data/spec/test-xml/methods/release/details.xml +48 -48
  71. data/spec/test-xml/methods/release/recommend.xml +89 -89
  72. data/spec/test-xml/methods/release/search.xml +195 -0
  73. data/spec/test-xml/methods/release/tracks.xml +28 -28
  74. data/spec/test-xml/methods/track/chart.xml +149 -149
  75. data/spec/test-xml/methods/track/details.xml +30 -30
  76. data/spec/test-xml/methods/track/search.xml +160 -0
  77. data/spec/test-xml/objects/artist.xml +6 -6
  78. data/spec/test-xml/objects/artist_chart_item.xml +7 -7
  79. data/spec/test-xml/objects/artist_list.xml +22 -22
  80. data/spec/test-xml/objects/artist_list_empty.xml +4 -4
  81. data/spec/test-xml/objects/price.xml +7 -7
  82. data/spec/test-xml/objects/release.xml +40 -40
  83. data/spec/test-xml/objects/release_chart_item.xml +39 -34
  84. data/spec/test-xml/objects/release_list.xml +18 -18
  85. data/spec/test-xml/objects/release_list_empty.xml +4 -4
  86. data/spec/test-xml/objects/response.xml +39 -0
  87. data/spec/test-xml/objects/track.xml +33 -33
  88. data/spec/test-xml/objects/track_chart_item.xml +27 -27
  89. metadata +10 -5
  90. data/lib/peachy_patchy.rb +0 -14
  91. data/lib/sevendigital/version.rb +0 -3
@@ -1,2 +1,2 @@
1
- api_url: api.7digital.com
2
- api_version: 1.2
1
+ api_url: api.7digital.com
2
+ api_version: 1.2
@@ -1,52 +1,52 @@
1
- module Sevendigital
2
-
3
- class ApiResponseDigestor < Digestor
4
-
5
- def from_xml(xml_or_proxy, element_name = :response)
6
- return from_proxy(ProxyPolice.ensure_is_proxy(xml_or_proxy, element_name))
7
- end
8
-
9
- def from_proxy(proxy)
10
- if proxy && proxy.status then
11
- return from_ok_response(proxy) if proxy.status == 'ok'
12
- return from_error_response(proxy.error) if proxy.status == 'error' && proxy.error
13
- end
14
- return from_invalid_xml
15
- end
16
-
17
- def from_invalid_xml
18
- response = ApiResponse.new
19
- response.error_code = 10000
20
- response.error_message = 'Invalid 7digital API response'
21
- return response
22
- end
23
-
24
- def from_error_response(error)
25
- response = ApiResponse.new
26
- response.error_code = error.code.to_i
27
- response.error_message = error.error_message.value.to_s
28
- return response
29
- end
30
-
31
- def from_ok_response(response_content)
32
- response = ApiResponse.new
33
- response.error_code = 0
34
- response.content = response_content
35
- return response
36
- end
37
-
38
- def from_http_response(http_response)
39
- return from_xml(http_response.body.to_s) if http_response.is_a?(Net::HTTPSuccess)
40
- from_invalid_http_response(http_response)
41
- end
42
-
43
- def from_invalid_http_response(http_response)
44
- response = ApiResponse.new
45
- response.error_code = Integer(http_response.code)
46
- response.error_message= http_response.body.to_s
47
- return response
48
- end
49
-
50
- end
51
-
52
- end
1
+ module Sevendigital
2
+
3
+ class ApiResponseDigestor < Digestor
4
+
5
+ def from_xml(xml_or_proxy, element_name = :response)
6
+ return from_proxy(ProxyPolice.ensure_is_proxy(xml_or_proxy, element_name))
7
+ end
8
+
9
+ def from_proxy(proxy)
10
+ if proxy && proxy.status then
11
+ return from_ok_response(proxy) if proxy.status == 'ok'
12
+ return from_error_response(proxy.error) if proxy.status == 'error' && proxy.error
13
+ end
14
+ return from_invalid_xml
15
+ end
16
+
17
+ def from_invalid_xml
18
+ response = ApiResponse.new
19
+ response.error_code = 10000
20
+ response.error_message = 'Invalid 7digital API response'
21
+ return response
22
+ end
23
+
24
+ def from_error_response(error)
25
+ response = ApiResponse.new
26
+ response.error_code = error.code.to_i
27
+ response.error_message = error.error_message.value.to_s
28
+ return response
29
+ end
30
+
31
+ def from_ok_response(response_content)
32
+ response = ApiResponse.new
33
+ response.error_code = 0
34
+ response.content = response_content
35
+ return response
36
+ end
37
+
38
+ def from_http_response(http_response)
39
+ return from_xml(http_response.body.to_s) if http_response.is_a?(Net::HTTPSuccess)
40
+ from_invalid_http_response(http_response)
41
+ end
42
+
43
+ def from_invalid_http_response(http_response)
44
+ response = ApiResponse.new
45
+ response.error_code = Integer(http_response.code)
46
+ response.error_message= http_response.body.to_s
47
+ return response
48
+ end
49
+
50
+ end
51
+
52
+ end
@@ -1,31 +1,31 @@
1
- module Sevendigital
2
-
3
- class ArtistDigestor < Digestor
4
-
5
- def default_element_name; :artist end
6
- def default_list_element_name; :artists end
7
-
8
- def from_proxy(artist_proxy)
9
- make_sure_not_eating_nil(artist_proxy)
10
- artist = Artist.new(@api_client)
11
- populate_required_properties(artist, artist_proxy)
12
- populate_optional_properties(artist, artist_proxy)
13
- return artist
14
- end
15
-
16
- private
17
-
18
- def populate_required_properties(artist, artist_proxy)
19
- artist.id = artist_proxy.id.to_i
20
- artist.name = artist_proxy.name.value.to_s
21
- end
22
-
23
- def populate_optional_properties(artist, artist_proxy)
24
- artist.sort_name = artist_proxy.sort_name.value.to_s if artist_proxy.sort_name
25
- artist.appears_as = artist_proxy.appears_as.value.to_s if artist_proxy.appears_as
26
- artist.image = artist_proxy.image.value.to_s if artist_proxy.image
27
- artist.url = artist_proxy.url.value.to_s if artist_proxy.url
28
- end
29
-
30
- end
31
- end
1
+ module Sevendigital
2
+
3
+ class ArtistDigestor < Digestor
4
+
5
+ def default_element_name; :artist end
6
+ def default_list_element_name; :artists end
7
+
8
+ def from_proxy(artist_proxy)
9
+ make_sure_not_eating_nil(artist_proxy)
10
+ artist = Artist.new(@api_client)
11
+ populate_required_properties(artist, artist_proxy)
12
+ populate_optional_properties(artist, artist_proxy)
13
+ return artist
14
+ end
15
+
16
+ private
17
+
18
+ def populate_required_properties(artist, artist_proxy)
19
+ artist.id = artist_proxy.id.to_i
20
+ artist.name = artist_proxy.name.value.to_s
21
+ end
22
+
23
+ def populate_optional_properties(artist, artist_proxy)
24
+ artist.sort_name = artist_proxy.sort_name.value.to_s if artist_proxy.sort_name
25
+ artist.appears_as = artist_proxy.appears_as.value.to_s if artist_proxy.appears_as
26
+ artist.image = artist_proxy.image.value.to_s if artist_proxy.image
27
+ artist.url = artist_proxy.url.value.to_s if artist_proxy.url
28
+ end
29
+
30
+ end
31
+ end
@@ -1,27 +1,27 @@
1
- module Sevendigital
2
-
3
- class ChartItemDigestor < Digestor
4
-
5
- def default_element_name; :chart_item end
6
- def default_list_element_name; :chart end
7
-
8
- def from_proxy(chart_item_proxy)
9
-
10
- make_sure_not_eating_nil(chart_item_proxy)
11
-
12
- chart_item = ChartItem.new(@client)
13
- chart_item.position = chart_item_proxy.position.value.to_i
14
- chart_item.change = chart_item_proxy.change.value.to_s.downcase.to_sym
15
- if chart_item_proxy.release then
16
- chart_item.item = @api_client.release_digestor.from_proxy(chart_item_proxy.release)
17
- elsif chart_item_proxy.track
18
- chart_item.item = @api_client.track_digestor.from_proxy(chart_item_proxy.track)
19
- else
20
- chart_item.item = @api_client.artist_digestor.from_proxy(chart_item_proxy.artist)
21
- end
22
- return chart_item
23
- end
24
-
25
- end
26
-
27
- end
1
+ module Sevendigital
2
+
3
+ class ChartItemDigestor < Digestor
4
+
5
+ def default_element_name; :chart_item end
6
+ def default_list_element_name; :chart end
7
+
8
+ def from_proxy(chart_item_proxy)
9
+
10
+ make_sure_not_eating_nil(chart_item_proxy)
11
+
12
+ chart_item = ChartItem.new(@client)
13
+ chart_item.position = chart_item_proxy.position.value.to_i
14
+ chart_item.change = chart_item_proxy.change.value.to_s.downcase.to_sym
15
+ if chart_item_proxy.release then
16
+ chart_item.item = @api_client.release_digestor.from_proxy(chart_item_proxy.release)
17
+ elsif chart_item_proxy.track
18
+ chart_item.item = @api_client.track_digestor.from_proxy(chart_item_proxy.track)
19
+ else
20
+ chart_item.item = @api_client.artist_digestor.from_proxy(chart_item_proxy.artist)
21
+ end
22
+ return chart_item
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -1,66 +1,66 @@
1
- module Sevendigital
2
-
3
- class Digestor
4
-
5
- #TODO TEST THIS CRAP
6
-
7
- def initialize(api_client)
8
- @api_client = api_client
9
- end
10
-
11
- def from_xml(xml_or_proxy, element_name = default_element_name)
12
- return from_proxy(ProxyPolice.ensure_is_proxy(xml_or_proxy, element_name))
13
- end
14
-
15
- def list_from_xml(xml_or_proxy, list_element_name = default_list_element_name)
16
- list_from_proxy(ProxyPolice.ensure_is_proxy(xml_or_proxy, list_element_name))
17
- end
18
-
19
- def list_from_proxy(object_list_proxy)
20
- make_sure_not_eating_nil(object_list_proxy)
21
- list = []
22
- if object_list_proxy.send(default_element_name) then
23
- object_list_proxy.send(default_element_name).each { |object_proxy| list << from_proxy(object_proxy) }
24
- end
25
- return paginate_results(object_list_proxy, list)
26
- end
27
-
28
- #nested parsing for api methods that return standard object inside containers with no additional (useful) information
29
- #e.g. tagged_item.artist, recommendation.release, search_result.track, etc
30
-
31
- def nested_list_from_xml(xml_or_proxy, container_element_name, list_element_name = default_list_element_name)
32
- nested_list_from_proxy(ProxyPolice.ensure_is_proxy(xml_or_proxy, list_element_name), container_element_name)
33
- end
34
-
35
- def nested_list_from_proxy(object_list_proxy, container_element_name)
36
- make_sure_not_eating_nil(object_list_proxy)
37
- list = []
38
- if object_list_proxy.send(container_element_name) then
39
- object_list_proxy.send(container_element_name).each do
40
- |object_proxy| list << from_proxy(object_proxy.send(default_element_name))
41
- end
42
- end
43
- return paginate_results(object_list_proxy, list)
44
- end
45
-
46
- def paginate_results(xml_results, list)
47
- @api_client.pager_digestor.from_xml(xml_results).paginate_list(list)
48
- end
49
-
50
- def make_sure_not_eating_nil(proxy)
51
- raise DigestiveProblem, "There's nothing i can digest" unless proxy
52
- end
53
-
54
- def value_present?(proxy_node)
55
- !proxy_node.nil? && !proxy_node.value.nil? && !proxy_node.value.empty?
56
- end
57
-
58
- def content_present?(proxy_node)
59
- !proxy_node.nil?
60
- end
61
-
62
- end
63
-
64
- class DigestiveProblem < StandardError; end
65
-
66
- end
1
+ module Sevendigital
2
+
3
+ class Digestor
4
+
5
+ #TODO TEST THIS CRAP
6
+
7
+ def initialize(api_client)
8
+ @api_client = api_client
9
+ end
10
+
11
+ def from_xml(xml_or_proxy, element_name = default_element_name)
12
+ return from_proxy(ProxyPolice.ensure_is_proxy(xml_or_proxy, element_name))
13
+ end
14
+
15
+ def list_from_xml(xml_or_proxy, list_element_name = default_list_element_name)
16
+ list_from_proxy(ProxyPolice.ensure_is_proxy(xml_or_proxy, list_element_name))
17
+ end
18
+
19
+ def list_from_proxy(object_list_proxy)
20
+ make_sure_not_eating_nil(object_list_proxy)
21
+ list = []
22
+ if object_list_proxy.send(default_element_name) then
23
+ object_list_proxy.send(default_element_name).each { |object_proxy| list << from_proxy(object_proxy) }
24
+ end
25
+ return paginate_results(object_list_proxy, list)
26
+ end
27
+
28
+ #nested parsing for api methods that return standard object inside containers with no additional (useful) information
29
+ #e.g. tagged_item.artist, recommendation.release, search_result.track, etc
30
+
31
+ def nested_list_from_xml(xml_or_proxy, container_element_name, list_element_name = default_list_element_name)
32
+ nested_list_from_proxy(ProxyPolice.ensure_is_proxy(xml_or_proxy, list_element_name), container_element_name)
33
+ end
34
+
35
+ def nested_list_from_proxy(object_list_proxy, container_element_name)
36
+ make_sure_not_eating_nil(object_list_proxy)
37
+ list = []
38
+ if object_list_proxy.send(container_element_name) then
39
+ object_list_proxy.send(container_element_name).each do
40
+ |object_proxy| list << from_proxy(object_proxy.send(default_element_name))
41
+ end
42
+ end
43
+ return paginate_results(object_list_proxy, list)
44
+ end
45
+
46
+ def paginate_results(xml_results, list)
47
+ @api_client.pager_digestor.from_xml(xml_results).paginate_list(list)
48
+ end
49
+
50
+ def make_sure_not_eating_nil(proxy)
51
+ raise DigestiveProblem, "There's nothing i can digest" unless proxy
52
+ end
53
+
54
+ def value_present?(proxy_node)
55
+ !proxy_node.nil? && !proxy_node.value.nil? && !proxy_node.value.empty?
56
+ end
57
+
58
+ def content_present?(proxy_node)
59
+ !proxy_node.nil?
60
+ end
61
+
62
+ end
63
+
64
+ class DigestiveProblem < StandardError; end
65
+
66
+ end
@@ -1,21 +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
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
@@ -1,20 +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
-
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
20
  end
@@ -1,23 +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
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