7digital 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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