7digital 0.1.2 → 0.1.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.
Files changed (197) hide show
  1. checksums.yaml +7 -0
  2. data/README.rdoc +143 -143
  3. data/lib/sevendigital.rb +55 -55
  4. data/lib/sevendigital/api_operator.rb +127 -127
  5. data/lib/sevendigital/api_operator_cached.rb +91 -62
  6. data/lib/sevendigital/api_request.rb +72 -62
  7. data/lib/sevendigital/client.rb +122 -122
  8. data/lib/sevendigital/client_configuration.rb +85 -83
  9. data/lib/sevendigital/client_digestors.rb +122 -122
  10. data/lib/sevendigital/client_managers.rb +57 -57
  11. data/lib/sevendigital/digestion_tract/api_response_digestor.rb +48 -48
  12. data/lib/sevendigital/digestion_tract/artist_digestor.rb +35 -35
  13. data/lib/sevendigital/digestion_tract/basket_digestor.rb +19 -19
  14. data/lib/sevendigital/digestion_tract/basket_item_digestor.rb +26 -26
  15. data/lib/sevendigital/digestion_tract/chart_item_digestor.rb +34 -34
  16. data/lib/sevendigital/digestion_tract/country_digestor.rb +15 -15
  17. data/lib/sevendigital/digestion_tract/digestor.rb +122 -122
  18. data/lib/sevendigital/digestion_tract/download_url_digestor.rb +23 -23
  19. data/lib/sevendigital/digestion_tract/format_digestor.rb +24 -24
  20. data/lib/sevendigital/digestion_tract/label_digestor.rb +21 -21
  21. data/lib/sevendigital/digestion_tract/list_digestor.rb +24 -24
  22. data/lib/sevendigital/digestion_tract/list_item_digestor.rb +26 -26
  23. data/lib/sevendigital/digestion_tract/locker_digestor.rb +22 -22
  24. data/lib/sevendigital/digestion_tract/locker_release_digestor.rb +26 -26
  25. data/lib/sevendigital/digestion_tract/locker_track_digestor.rb +26 -26
  26. data/lib/sevendigital/digestion_tract/oauth_access_token_digestor.rb +18 -18
  27. data/lib/sevendigital/digestion_tract/oauth_request_token_digestor.rb +18 -18
  28. data/lib/sevendigital/digestion_tract/pager_digestor.rb +28 -28
  29. data/lib/sevendigital/digestion_tract/price_digestor.rb +28 -28
  30. data/lib/sevendigital/digestion_tract/release_digestor.rb +45 -45
  31. data/lib/sevendigital/digestion_tract/tag_digestor.rb +23 -23
  32. data/lib/sevendigital/digestion_tract/track_digestor.rb +38 -37
  33. data/lib/sevendigital/digestion_tract/user_card_digestor.rb +24 -24
  34. data/lib/sevendigital/digestion_tract/user_digestor.rb +21 -21
  35. data/lib/sevendigital/management/artist_manager.rb +97 -97
  36. data/lib/sevendigital/management/basket_manager.rb +29 -29
  37. data/lib/sevendigital/management/country_manager.rb +10 -10
  38. data/lib/sevendigital/management/list_manager.rb +18 -18
  39. data/lib/sevendigital/management/manager.rb +12 -12
  40. data/lib/sevendigital/management/oauth_manager.rb +23 -23
  41. data/lib/sevendigital/management/release_manager.rb +54 -54
  42. data/lib/sevendigital/management/tag_manager.rb +10 -10
  43. data/lib/sevendigital/management/track_manager.rb +29 -27
  44. data/lib/sevendigital/management/user_card_manager.rb +26 -26
  45. data/lib/sevendigital/management/user_manager.rb +76 -76
  46. data/lib/sevendigital/model/api_response.rb +32 -32
  47. data/lib/sevendigital/model/artist.rb +104 -104
  48. data/lib/sevendigital/model/basket.rb +15 -15
  49. data/lib/sevendigital/model/basket_item.rb +14 -14
  50. data/lib/sevendigital/model/card.rb +11 -11
  51. data/lib/sevendigital/model/chart_item.rb +9 -9
  52. data/lib/sevendigital/model/download_url.rb +7 -7
  53. data/lib/sevendigital/model/format.rb +7 -7
  54. data/lib/sevendigital/model/label.rb +7 -7
  55. data/lib/sevendigital/model/list.rb +4 -4
  56. data/lib/sevendigital/model/list_item.rb +8 -8
  57. data/lib/sevendigital/model/locker.rb +4 -4
  58. data/lib/sevendigital/model/locker_release.rb +9 -9
  59. data/lib/sevendigital/model/locker_track.rb +9 -9
  60. data/lib/sevendigital/model/price.rb +9 -9
  61. data/lib/sevendigital/model/release.rb +57 -57
  62. data/lib/sevendigital/model/sevendigital_error.rb +11 -11
  63. data/lib/sevendigital/model/sevendigital_object.rb +57 -57
  64. data/lib/sevendigital/model/tag.rb +7 -7
  65. data/lib/sevendigital/model/track.rb +87 -83
  66. data/lib/sevendigital/model/user.rb +74 -74
  67. data/lib/sevendigital/pager.rb +20 -20
  68. data/lib/sevendigital/version.rb +5 -5
  69. data/spec/api_operator_cached_spec.rb +233 -178
  70. data/spec/api_operator_spec.rb +320 -320
  71. data/spec/api_request_spec.rb +46 -31
  72. data/spec/client_configuration_spec.rb +78 -78
  73. data/spec/client_spec.rb +161 -161
  74. data/spec/data/config/sevendigital.yml +5 -5
  75. data/spec/data/configuration_env_override.yml +5 -5
  76. data/spec/data/configuration_override.yml +1 -1
  77. data/spec/digestion_tract/api_response_digestor_spec.rb +93 -93
  78. data/spec/digestion_tract/artist_digestor_spec.rb +81 -81
  79. data/spec/digestion_tract/basket_digestor_spec.rb +31 -31
  80. data/spec/digestion_tract/basket_item_digestor_spec.rb +58 -58
  81. data/spec/digestion_tract/chart_digestor_spec.rb +52 -52
  82. data/spec/digestion_tract/country_digestor_spec.rb +33 -33
  83. data/spec/digestion_tract/digestor_spec.rb +33 -33
  84. data/spec/digestion_tract/download_url_digestor_spec.rb +40 -40
  85. data/spec/digestion_tract/format_digestor_spec.rb +38 -38
  86. data/spec/digestion_tract/label_digestor_spec.rb +33 -33
  87. data/spec/digestion_tract/list_digestor_spec.rb +31 -31
  88. data/spec/digestion_tract/list_item_digestor_spec.rb +80 -80
  89. data/spec/digestion_tract/locker_digestor_spec.rb +30 -30
  90. data/spec/digestion_tract/locker_release_digestor_spec.rb +70 -70
  91. data/spec/digestion_tract/locker_track_digestor_spec.rb +56 -56
  92. data/spec/digestion_tract/oauth_access_token_digestor_spec.rb +34 -34
  93. data/spec/digestion_tract/oauth_request_token_digestor_spec.rb +34 -34
  94. data/spec/digestion_tract/pager_digestor_spec.rb +50 -50
  95. data/spec/digestion_tract/price_digestor_spec.rb +73 -73
  96. data/spec/digestion_tract/release_digestor_spec.rb +115 -115
  97. data/spec/digestion_tract/tag_digestor_spec.rb +46 -46
  98. data/spec/digestion_tract/track_digestor_spec.rb +105 -104
  99. data/spec/digestion_tract/user_card_digestor_spec.rb +58 -58
  100. data/spec/digestion_tract/user_digestor_spec.rb +42 -42
  101. data/spec/integration/artist_spec.rb +99 -86
  102. data/spec/integration/country_spec.rb +18 -18
  103. data/spec/integration/list_spec.rb +22 -22
  104. data/spec/integration/purchasing_spec.rb +24 -24
  105. data/spec/integration/release_spec.rb +34 -34
  106. data/spec/integration/sevendigital_spec.yml +4 -4
  107. data/spec/integration/track_spec.rb +38 -23
  108. data/spec/integration/user_spec.rb +22 -22
  109. data/spec/management/artist_manager_spec.rb +172 -172
  110. data/spec/management/basket_manager_spec.rb +77 -77
  111. data/spec/management/country_manager_spec.rb +34 -34
  112. data/spec/management/list_manager_spec.rb +26 -26
  113. data/spec/management/oauth_manager_spec.rb +72 -72
  114. data/spec/management/release_manager_spec.rb +200 -200
  115. data/spec/management/tag_manager_spec.rb +34 -34
  116. data/spec/management/track_manager_spec.rb +111 -107
  117. data/spec/management/user_card_manager_spec.rb +78 -78
  118. data/spec/management/user_manager_spec.rb +218 -218
  119. data/spec/model/api_response_spec.rb +48 -48
  120. data/spec/model/artist_spec.rb +162 -162
  121. data/spec/model/basket_spec.rb +62 -62
  122. data/spec/model/release_spec.rb +133 -133
  123. data/spec/model/sevendigital_object_spec.rb +73 -73
  124. data/spec/model/track_spec.rb +146 -144
  125. data/spec/model/user_spec.rb +181 -181
  126. data/spec/spec_helper.rb +86 -84
  127. data/spec/test-xml/methods/artist/browse.xml +21 -21
  128. data/spec/test-xml/methods/artist/byTag/top.xml +50 -50
  129. data/spec/test-xml/methods/artist/chart.xml +30 -30
  130. data/spec/test-xml/methods/artist/details.xml +9 -9
  131. data/spec/test-xml/methods/artist/releases.xml +544 -544
  132. data/spec/test-xml/methods/artist/search.xml +18 -18
  133. data/spec/test-xml/methods/artist/similar.xml +39 -39
  134. data/spec/test-xml/methods/artist/tags.xml +11 -11
  135. data/spec/test-xml/methods/artist/toptracks.xml +279 -279
  136. data/spec/test-xml/methods/basket/additem.xml +23 -23
  137. data/spec/test-xml/methods/basket/create.xml +10 -10
  138. data/spec/test-xml/methods/basket/index.xml +23 -23
  139. data/spec/test-xml/methods/basket/removeitem.xml +10 -10
  140. data/spec/test-xml/methods/country/resolve.xml +6 -6
  141. data/spec/test-xml/methods/editorial/list.xml +170 -170
  142. data/spec/test-xml/methods/oauth/accesstoken.xml +5 -5
  143. data/spec/test-xml/methods/oauth/requesttoken.xml +5 -5
  144. data/spec/test-xml/methods/release/bydate.xml +173 -173
  145. data/spec/test-xml/methods/release/bytag/top.xml +150 -150
  146. data/spec/test-xml/methods/release/chart.xml +181 -181
  147. data/spec/test-xml/methods/release/details.xml +48 -48
  148. data/spec/test-xml/methods/release/recommend.xml +89 -89
  149. data/spec/test-xml/methods/release/search.xml +194 -194
  150. data/spec/test-xml/methods/release/tags.xml +27 -27
  151. data/spec/test-xml/methods/release/tracks.xml +28 -28
  152. data/spec/test-xml/methods/tag/index.xml +16 -16
  153. data/spec/test-xml/methods/track/chart.xml +149 -149
  154. data/spec/test-xml/methods/track/details.xml +30 -30
  155. data/spec/test-xml/methods/track/search.xml +159 -159
  156. data/spec/test-xml/methods/user/details.xml +4 -4
  157. data/spec/test-xml/methods/user/locker.xml +49 -49
  158. data/spec/test-xml/methods/user/payment/card/add.xml +7 -7
  159. data/spec/test-xml/methods/user/payment/card/index.xml +7 -7
  160. data/spec/test-xml/methods/user/purchase/basket.xml +48 -48
  161. data/spec/test-xml/methods/user/purchase/item.xml +48 -48
  162. data/spec/test-xml/methods/user/signUp.xml +5 -5
  163. data/spec/test-xml/objects/artist.xml +7 -7
  164. data/spec/test-xml/objects/artist_chart_item.xml +7 -7
  165. data/spec/test-xml/objects/artist_list.xml +22 -22
  166. data/spec/test-xml/objects/artist_list_empty.xml +4 -4
  167. data/spec/test-xml/objects/basket.xml +21 -21
  168. data/spec/test-xml/objects/basket_item.xml +11 -11
  169. data/spec/test-xml/objects/basket_item_list.xml +25 -25
  170. data/spec/test-xml/objects/basket_item_list_empty.xml +1 -1
  171. data/spec/test-xml/objects/download_url.xml +7 -7
  172. data/spec/test-xml/objects/list.xml +89 -89
  173. data/spec/test-xml/objects/list_item_list.xml +85 -85
  174. data/spec/test-xml/objects/list_item_release.xml +13 -13
  175. data/spec/test-xml/objects/locker.xml +47 -47
  176. data/spec/test-xml/objects/locker_release.xml +40 -40
  177. data/spec/test-xml/objects/locker_release_list.xml +87 -87
  178. data/spec/test-xml/objects/locker_release_list_empty.xml +4 -4
  179. data/spec/test-xml/objects/locker_release_one_item_list.xml +43 -43
  180. data/spec/test-xml/objects/locker_track.xml +25 -25
  181. data/spec/test-xml/objects/locker_track_list.xml +26 -26
  182. data/spec/test-xml/objects/locker_track_list_empty.xml +2 -2
  183. data/spec/test-xml/objects/nested_release_list.xml +22 -22
  184. data/spec/test-xml/objects/oauth_access_token.xml +3 -3
  185. data/spec/test-xml/objects/oauth_request_token.xml +3 -3
  186. data/spec/test-xml/objects/price.xml +7 -7
  187. data/spec/test-xml/objects/release.xml +40 -40
  188. data/spec/test-xml/objects/release_chart_item.xml +39 -39
  189. data/spec/test-xml/objects/release_list.xml +18 -18
  190. data/spec/test-xml/objects/release_list_empty.xml +4 -4
  191. data/spec/test-xml/objects/response.xml +38 -38
  192. data/spec/test-xml/objects/tag.xml +4 -4
  193. data/spec/test-xml/objects/track.xml +34 -33
  194. data/spec/test-xml/objects/track_chart_item.xml +27 -27
  195. data/spec/test-xml/objects/user.xml +4 -4
  196. data/spec/test-xml/objects/user_payment_card.xml +5 -5
  197. metadata +15 -25
@@ -1,48 +1,48 @@
1
- require 'nokogiri'
2
-
3
- module Sevendigital
4
-
5
- #@private
6
- class ApiResponseDigestor < Digestor # :nodoc:
7
-
8
- def default_element_name; :response end
9
-
10
- def from_http_response(http_response)
11
- response = ApiResponse.new
12
- response.headers = http_response.header
13
- response.content = http_response.body.to_s
14
-
15
- parse_xml_doc(response.content, response)
16
-
17
- if response.error_code >= 10000 && !http_response.is_a?(Net::HTTPSuccess)
18
- response.error_code = Integer(http_response.code)
19
- response.error_message= http_response.body.to_s
20
- end
21
- response
22
- end
23
-
24
- def parse_xml_doc(xml, response)
25
-
26
- xml_doc = Nokogiri::XML(xml)
27
-
28
- response_node = xml_doc.at_xpath("./response")
29
- response_status = nil
30
- response_status = get_optional_attribute(response_node, "status") if response_node
31
- if response_status == 'ok' then
32
- response.error_code = 0
33
- else
34
- if response_status == 'error'
35
- error_node = get_required_node(response_node, "error")
36
- response.error_code = get_required_attribute(error_node, "code").to_i
37
- response.error_message = get_required_value(error_node, "errorMessage")
38
- else
39
- response.error_code = 10001
40
- response.error_message = 'Invalid 7digital API response'
41
- end
42
- end
43
-
44
- end
45
-
46
- end
47
-
48
- end
1
+ require 'nokogiri'
2
+
3
+ module Sevendigital
4
+
5
+ #@private
6
+ class ApiResponseDigestor < Digestor # :nodoc:
7
+
8
+ def default_element_name; :response end
9
+
10
+ def from_http_response(http_response)
11
+ response = ApiResponse.new
12
+ response.headers = http_response.header
13
+ response.content = http_response.body.to_s
14
+
15
+ parse_xml_doc(response.content, response)
16
+
17
+ if response.error_code >= 10000 && !http_response.is_a?(Net::HTTPSuccess)
18
+ response.error_code = Integer(http_response.code)
19
+ response.error_message= http_response.body.to_s
20
+ end
21
+ response
22
+ end
23
+
24
+ def parse_xml_doc(xml, response)
25
+
26
+ xml_doc = Nokogiri::XML(xml)
27
+
28
+ response_node = xml_doc.at_xpath("./response")
29
+ response_status = nil
30
+ response_status = get_optional_attribute(response_node, "status") if response_node
31
+ if response_status == 'ok' then
32
+ response.error_code = 0
33
+ else
34
+ if response_status == 'error'
35
+ error_node = get_required_node(response_node, "error")
36
+ response.error_code = get_required_attribute(error_node, "code").to_i
37
+ response.error_message = get_required_value(error_node, "errorMessage")
38
+ else
39
+ response.error_code = 10001
40
+ response.error_message = 'Invalid 7digital API response'
41
+ end
42
+ end
43
+
44
+ end
45
+
46
+ end
47
+
48
+ end
@@ -1,35 +1,35 @@
1
- require 'nokogiri'
2
-
3
- module Sevendigital
4
-
5
- #@private
6
- class ArtistDigestor < Digestor # :nodoc:
7
-
8
- def default_element_name; :artist end
9
- def default_list_element_name; :artists end
10
-
11
- def from_xml_doc(xml_doc)
12
- make_sure_eating_nokogiri_node(xml_doc)
13
- artist = Artist.new(@api_client)
14
- populate_required_properties(artist, xml_doc)
15
- populate_optional_properties(artist, xml_doc)
16
- artist
17
- end
18
-
19
- private
20
-
21
- def populate_required_properties(artist, xml_node)
22
- artist.id = get_required_attribute(xml_node, "id") {|v| v.to_i}
23
- artist.name = get_required_value(xml_node, "name")
24
- end
25
-
26
- def populate_optional_properties(artist, artist_node)
27
- artist.sort_name = get_optional_value(artist_node, :sortName)
28
- artist.appears_as = get_optional_value(artist_node, :appearsAs)
29
- artist.image = get_optional_value(artist_node, :image)
30
- artist.url = get_optional_value(artist_node, :url)
31
- artist.popularity = get_optional_value(artist_node, :popularity) {|v| v.to_s.to_d}
32
- end
33
-
34
- end
35
- end
1
+ require 'nokogiri'
2
+
3
+ module Sevendigital
4
+
5
+ #@private
6
+ class ArtistDigestor < Digestor # :nodoc:
7
+
8
+ def default_element_name; :artist end
9
+ def default_list_element_name; :artists end
10
+
11
+ def from_xml_doc(xml_doc)
12
+ make_sure_eating_nokogiri_node(xml_doc)
13
+ artist = Artist.new(@api_client)
14
+ populate_required_properties(artist, xml_doc)
15
+ populate_optional_properties(artist, xml_doc)
16
+ artist
17
+ end
18
+
19
+ private
20
+
21
+ def populate_required_properties(artist, xml_node)
22
+ artist.id = get_required_attribute(xml_node, "id") {|v| v.to_i}
23
+ artist.name = get_required_value(xml_node, "name")
24
+ end
25
+
26
+ def populate_optional_properties(artist, artist_node)
27
+ artist.sort_name = get_optional_value(artist_node, :sortName)
28
+ artist.appears_as = get_optional_value(artist_node, :appearsAs)
29
+ artist.image = get_optional_value(artist_node, :image)
30
+ artist.url = get_optional_value(artist_node, :url)
31
+ artist.popularity = get_optional_value(artist_node, :popularity) {|v| v.to_s.to_d}
32
+ end
33
+
34
+ end
35
+ end
@@ -1,19 +1,19 @@
1
- module Sevendigital
2
-
3
- #@private
4
- class BasketDigestor < Digestor # :nodoc:
5
-
6
- def default_element_name; :basket end
7
-
8
- def from_xml_doc(xml_node)
9
- make_sure_eating_nokogiri_node(xml_node)
10
- basket = Sevendigital::Basket.new(@api_client)
11
- basket.id = get_required_attribute(xml_node, "id")
12
- basket.basket_items = get_required_node(xml_node, "basketItems") { |v| @api_client.basket_item_digestor.list_from_xml_doc(v) }
13
-
14
- basket
15
- end
16
-
17
- end
18
-
19
- end
1
+ module Sevendigital
2
+
3
+ #@private
4
+ class BasketDigestor < Digestor # :nodoc:
5
+
6
+ def default_element_name; :basket end
7
+
8
+ def from_xml_doc(xml_node)
9
+ make_sure_eating_nokogiri_node(xml_node)
10
+ basket = Sevendigital::Basket.new(@api_client)
11
+ basket.id = get_required_attribute(xml_node, "id")
12
+ basket.basket_items = get_required_node(xml_node, "basketItems") { |v| @api_client.basket_item_digestor.list_from_xml_doc(v) }
13
+
14
+ basket
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -1,26 +1,26 @@
1
- module Sevendigital
2
-
3
- #@private
4
- class BasketItemDigestor < Digestor # :nodoc:
5
-
6
- def default_element_name; :basketItem end
7
- def default_list_element_name; :basketItems end
8
-
9
- def from_xml_doc(xml_node)
10
- make_sure_eating_nokogiri_node(xml_node)
11
- basket_item = BasketItem.new(@api_client)
12
-
13
- basket_item.id = get_required_attribute(xml_node, "id") {|v| v.to_i}
14
- basket_item.type = get_required_value(xml_node, "type") {|v| v.downcase.to_sym}
15
- basket_item.artist_name = get_required_value(xml_node, "artistName")
16
- basket_item.item_name = get_required_value(xml_node, "itemName")
17
- basket_item.release_id = get_required_value(xml_node, "releaseId") {|v| v.to_i}
18
- basket_item.track_id = get_required_value(xml_node, "trackId") {|v| v.to_i}
19
- basket_item.price = get_required_node(xml_node, "price") {|v| @api_client.price_digestor.from_xml_doc(v)}
20
-
21
- basket_item
22
- end
23
-
24
- end
25
-
26
- end
1
+ module Sevendigital
2
+
3
+ #@private
4
+ class BasketItemDigestor < Digestor # :nodoc:
5
+
6
+ def default_element_name; :basketItem end
7
+ def default_list_element_name; :basketItems end
8
+
9
+ def from_xml_doc(xml_node)
10
+ make_sure_eating_nokogiri_node(xml_node)
11
+ basket_item = BasketItem.new(@api_client)
12
+
13
+ basket_item.id = get_required_attribute(xml_node, "id") {|v| v.to_i}
14
+ basket_item.type = get_required_value(xml_node, "type") {|v| v.downcase.to_sym}
15
+ basket_item.artist_name = get_required_value(xml_node, "artistName")
16
+ basket_item.item_name = get_required_value(xml_node, "itemName")
17
+ basket_item.release_id = get_required_value(xml_node, "releaseId") {|v| v.to_i}
18
+ basket_item.track_id = get_required_value(xml_node, "trackId") {|v| v.to_i}
19
+ basket_item.price = get_required_node(xml_node, "price") {|v| @api_client.price_digestor.from_xml_doc(v)}
20
+
21
+ basket_item
22
+ end
23
+
24
+ end
25
+
26
+ end
@@ -1,34 +1,34 @@
1
- module Sevendigital
2
-
3
- #@private
4
- class ChartItemDigestor < Digestor # :nodoc:
5
-
6
- def default_element_name; :chartItem end
7
- def default_list_element_name; :chart end
8
-
9
- def from_proxy(chart_item_proxy)
10
-
11
- from_xml_string(chart_item_proxy.to_s)
12
-
13
- end
14
-
15
- def from_xml_doc(xml_node)
16
- make_sure_eating_nokogiri_node(xml_node)
17
-
18
- chart_item = ChartItem.new(@client)
19
-
20
- chart_item.position = get_required_value(xml_node, "position") {|v| v.to_i}
21
- chart_item.change = get_required_value(xml_node, "change") {|v| v.downcase.to_sym}
22
- if xml_node.at_xpath("./release") then
23
- chart_item.item = get_required_node(xml_node, "release") {|v| @api_client.release_digestor.from_xml_doc(v) }
24
- elsif xml_node.at_xpath("./track")
25
- chart_item.item = get_required_node(xml_node, "track") {|v| @api_client.track_digestor.from_xml_doc(v) }
26
- else
27
- chart_item.item = get_required_node(xml_node, "artist") {|v| @api_client.artist_digestor.from_xml_doc(v) }
28
- end
29
- return chart_item
30
- end
31
-
32
- end
33
-
34
- end
1
+ module Sevendigital
2
+
3
+ #@private
4
+ class ChartItemDigestor < Digestor # :nodoc:
5
+
6
+ def default_element_name; :chartItem end
7
+ def default_list_element_name; :chart end
8
+
9
+ def from_proxy(chart_item_proxy)
10
+
11
+ from_xml_string(chart_item_proxy.to_s)
12
+
13
+ end
14
+
15
+ def from_xml_doc(xml_node)
16
+ make_sure_eating_nokogiri_node(xml_node)
17
+
18
+ chart_item = ChartItem.new(@client)
19
+
20
+ chart_item.position = get_required_value(xml_node, "position") {|v| v.to_i}
21
+ chart_item.change = get_required_value(xml_node, "change") {|v| v.downcase.to_sym}
22
+ if xml_node.at_xpath("./release") then
23
+ chart_item.item = get_required_node(xml_node, "release") {|v| @api_client.release_digestor.from_xml_doc(v) }
24
+ elsif xml_node.at_xpath("./track")
25
+ chart_item.item = get_required_node(xml_node, "track") {|v| @api_client.track_digestor.from_xml_doc(v) }
26
+ else
27
+ chart_item.item = get_required_node(xml_node, "artist") {|v| @api_client.artist_digestor.from_xml_doc(v) }
28
+ end
29
+ return chart_item
30
+ end
31
+
32
+ end
33
+
34
+ end
@@ -1,16 +1,16 @@
1
- module Sevendigital
2
-
3
- #@private
4
- class CountryDigestor < Digestor # :nodoc:
5
-
6
- def default_element_name; :country end
7
-
8
- def from_xml_doc(xml_node)
9
- make_sure_eating_nokogiri_node(xml_node)
10
-
11
- get_required_value(xml_node, "countryCode")
12
- end
13
-
14
- end
15
-
1
+ module Sevendigital
2
+
3
+ #@private
4
+ class CountryDigestor < Digestor # :nodoc:
5
+
6
+ def default_element_name; :country end
7
+
8
+ def from_xml_doc(xml_node)
9
+ make_sure_eating_nokogiri_node(xml_node)
10
+
11
+ get_required_value(xml_node, "countryCode")
12
+ end
13
+
14
+ end
15
+
16
16
  end
@@ -1,122 +1,122 @@
1
- module Sevendigital
2
-
3
- #@private
4
- #internal generic class used for digesting XML responses from the API
5
- class Digestor # :nodoc:
6
-
7
- #TODO TEST THIS CRAP
8
-
9
- def initialize(api_client)
10
- @api_client = api_client
11
- end
12
-
13
- def from_xml_string(xml, element_name = default_element_name)
14
- xml_doc = Nokogiri::XML(xml)
15
- from_xml_doc(xml_doc.at_xpath("./#{element_name}"))
16
- end
17
-
18
- def list_from_xml_string(xml, list_element_name = default_list_element_name)
19
- xml_doc = Nokogiri::XML(xml)
20
- list_from_xml_doc(xml_doc.at_xpath("./#{list_element_name}"))
21
- end
22
-
23
- def list_from_xml_doc(list_node)
24
- make_sure_eating_nokogiri_node(list_node)
25
- list = []
26
- list_node.xpath("./#{default_element_name}").each { |node| list << from_xml_doc(node)}
27
- paginate_results(list_node, list)
28
- end
29
-
30
- #nested parsing for api methods that return standard object inside containers with no additional (useful) information
31
- #e.g. tagged_item.artist, recommendation.release, search_result.track, etc
32
-
33
- def nested_list_from_xml_string(xml, container_element_name, list_element_name = default_list_element_name)
34
- xml_doc = Nokogiri::XML(xml)
35
- nested_list_from_xml_doc(xml_doc.at_xpath("./#{container_element_name}"), list_element_name)
36
- end
37
-
38
- def nested_list_from_xml_doc(list_node, list_element_name = default_list_element_name, element_name = default_element_name)
39
- make_sure_eating_nokogiri_node(list_node)
40
- list = []
41
- list_node.xpath("./#{list_element_name}/#{element_name}").each { |node| list << from_xml_doc(node)}
42
- paginate_results(list_node, list)
43
- end
44
-
45
- def paginate_results(results_xml_node, list)
46
- pager = @api_client.pager_digestor.from_xml_doc(results_xml_node)
47
- return list if !pager
48
- pager.paginate_list(list)
49
- end
50
-
51
- def make_sure_eating_nokogiri_node(xml)
52
- raise DigestiveProblem, "There's nothing i can digest" unless xml
53
- raise DigestiveProblem, "I'm not eating this! It's not a Nokogiri XML node.'" unless xml.kind_of?(Nokogiri::XML::Node)
54
- end
55
-
56
- def value_present?(proxy_node)
57
- !proxy_node.nil? && !proxy_node.value.nil? && !proxy_node.value.empty?
58
- end
59
-
60
- def content_present?(proxy_node)
61
- !proxy_node.nil?
62
- end
63
-
64
- def get_required_value(node, element_name)
65
- if node.at_xpath("./#{element_name}") then
66
- content = node.at_xpath("./#{element_name}").content
67
- return yield(content) if block_given?
68
- return content
69
- end
70
- raise DigestiveProblem, "I need #{element_name} element to digest the response"
71
- end
72
-
73
- def get_required_node(node, element_name)
74
- if node.at_xpath("./#{element_name}") then
75
- subnode = node.at_xpath("./#{element_name}")
76
- return yield(subnode) if block_given?
77
- return subnode
78
- end
79
- raise DigestiveProblem, "I need #{element_name} element to digest the response"
80
- end
81
-
82
- def get_required_attribute(node, attribute_name)
83
- if node.at_xpath("@#{attribute_name}") then
84
- content = node.at_xpath("@#{attribute_name}").content
85
- return yield(content) if block_given?
86
- return content
87
- end
88
- raise DigestiveProblem, "I need #{attribute_name} attribute to digest the response"
89
- end
90
-
91
- def get_optional_value(node, element_name)
92
- if node.at_xpath("./#{element_name}") then
93
- content = node.at_xpath("./#{element_name}").content
94
- return yield(content) if block_given?
95
- return content
96
- end
97
- nil
98
- end
99
-
100
- def get_optional_node(node, element_name)
101
- if node.at_xpath("./#{element_name}") then
102
- subnode = node.at_xpath("./#{element_name}")
103
- return yield(subnode) if block_given?
104
- return subnode
105
- end
106
- nil
107
- end
108
-
109
- def get_optional_attribute(node, attribute_name)
110
- if node.at_xpath("@#{attribute_name}") then
111
- content = node.at_xpath("@#{attribute_name}").content
112
- return yield(content) if block_given?
113
- return content
114
- end
115
- nil
116
- end
117
-
118
- end
119
-
120
- class DigestiveProblem < StandardError; end
121
-
122
- end
1
+ module Sevendigital
2
+
3
+ #@private
4
+ #internal generic class used for digesting XML responses from the API
5
+ class Digestor # :nodoc:
6
+
7
+ #TODO TEST THIS CRAP
8
+
9
+ def initialize(api_client)
10
+ @api_client = api_client
11
+ end
12
+
13
+ def from_xml_string(xml, element_name = default_element_name)
14
+ xml_doc = Nokogiri::XML(xml)
15
+ from_xml_doc(xml_doc.at_xpath("./#{element_name}"))
16
+ end
17
+
18
+ def list_from_xml_string(xml, list_element_name = default_list_element_name)
19
+ xml_doc = Nokogiri::XML(xml)
20
+ list_from_xml_doc(xml_doc.at_xpath("./#{list_element_name}"))
21
+ end
22
+
23
+ def list_from_xml_doc(list_node)
24
+ make_sure_eating_nokogiri_node(list_node)
25
+ list = []
26
+ list_node.xpath("./#{default_element_name}").each { |node| list << from_xml_doc(node)}
27
+ paginate_results(list_node, list)
28
+ end
29
+
30
+ #nested parsing for api methods that return standard object inside containers with no additional (useful) information
31
+ #e.g. tagged_item.artist, recommendation.release, search_result.track, etc
32
+
33
+ def nested_list_from_xml_string(xml, container_element_name, list_element_name = default_list_element_name)
34
+ xml_doc = Nokogiri::XML(xml)
35
+ nested_list_from_xml_doc(xml_doc.at_xpath("./#{container_element_name}"), list_element_name)
36
+ end
37
+
38
+ def nested_list_from_xml_doc(list_node, list_element_name = default_list_element_name, element_name = default_element_name)
39
+ make_sure_eating_nokogiri_node(list_node)
40
+ list = []
41
+ list_node.xpath("./#{list_element_name}/#{element_name}").each { |node| list << from_xml_doc(node)}
42
+ paginate_results(list_node, list)
43
+ end
44
+
45
+ def paginate_results(results_xml_node, list)
46
+ pager = @api_client.pager_digestor.from_xml_doc(results_xml_node)
47
+ return list if !pager
48
+ pager.paginate_list(list)
49
+ end
50
+
51
+ def make_sure_eating_nokogiri_node(xml)
52
+ raise DigestiveProblem, "There's nothing i can digest" unless xml
53
+ raise DigestiveProblem, "I'm not eating this! It's not a Nokogiri XML node.'" unless xml.kind_of?(Nokogiri::XML::Node)
54
+ end
55
+
56
+ def value_present?(proxy_node)
57
+ !proxy_node.nil? && !proxy_node.value.nil? && !proxy_node.value.empty?
58
+ end
59
+
60
+ def content_present?(proxy_node)
61
+ !proxy_node.nil?
62
+ end
63
+
64
+ def get_required_value(node, element_name)
65
+ if node.at_xpath("./#{element_name}") then
66
+ content = node.at_xpath("./#{element_name}").content
67
+ return yield(content) if block_given?
68
+ return content
69
+ end
70
+ raise DigestiveProblem, "I need #{element_name} element to digest the response"
71
+ end
72
+
73
+ def get_required_node(node, element_name)
74
+ if node.at_xpath("./#{element_name}") then
75
+ subnode = node.at_xpath("./#{element_name}")
76
+ return yield(subnode) if block_given?
77
+ return subnode
78
+ end
79
+ raise DigestiveProblem, "I need #{element_name} element to digest the response"
80
+ end
81
+
82
+ def get_required_attribute(node, attribute_name)
83
+ if node.at_xpath("@#{attribute_name}") then
84
+ content = node.at_xpath("@#{attribute_name}").content
85
+ return yield(content) if block_given?
86
+ return content
87
+ end
88
+ raise DigestiveProblem, "I need #{attribute_name} attribute to digest the response"
89
+ end
90
+
91
+ def get_optional_value(node, element_name)
92
+ if node.at_xpath("./#{element_name}") then
93
+ content = node.at_xpath("./#{element_name}").content
94
+ return yield(content) if block_given?
95
+ return content
96
+ end
97
+ nil
98
+ end
99
+
100
+ def get_optional_node(node, element_name)
101
+ if node.at_xpath("./#{element_name}") then
102
+ subnode = node.at_xpath("./#{element_name}")
103
+ return yield(subnode) if block_given?
104
+ return subnode
105
+ end
106
+ nil
107
+ end
108
+
109
+ def get_optional_attribute(node, attribute_name)
110
+ if node.at_xpath("@#{attribute_name}") then
111
+ content = node.at_xpath("@#{attribute_name}").content
112
+ return yield(content) if block_given?
113
+ return content
114
+ end
115
+ nil
116
+ end
117
+
118
+ end
119
+
120
+ class DigestiveProblem < StandardError; end
121
+
122
+ end