7digital 0.0.7 → 0.1.0

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 (211) hide show
  1. data/README.rdoc +8 -1
  2. data/lib/sevendigital.rb +4 -2
  3. data/lib/sevendigital/api_operator.rb +92 -94
  4. data/lib/sevendigital/api_operator_cached.rb +55 -33
  5. data/lib/sevendigital/api_request.rb +50 -54
  6. data/lib/sevendigital/client.rb +15 -6
  7. data/lib/sevendigital/client_configuration.rb +0 -3
  8. data/lib/sevendigital/client_digestors.rb +15 -0
  9. data/lib/sevendigital/client_managers.rb +11 -1
  10. data/lib/sevendigital/digestion_tract/api_response_digestor.rb +31 -40
  11. data/lib/sevendigital/digestion_tract/artist_digestor.rb +16 -13
  12. data/lib/sevendigital/digestion_tract/basket_digestor.rb +5 -5
  13. data/lib/sevendigital/digestion_tract/basket_item_digestor.rb +12 -12
  14. data/lib/sevendigital/digestion_tract/chart_item_digestor.rb +17 -11
  15. data/lib/sevendigital/digestion_tract/country_digestor.rb +16 -0
  16. data/lib/sevendigital/digestion_tract/digestor.rb +82 -28
  17. data/lib/sevendigital/digestion_tract/download_url_digestor.rb +10 -7
  18. data/lib/sevendigital/digestion_tract/format_digestor.rb +11 -9
  19. data/lib/sevendigital/digestion_tract/label_digestor.rb +8 -7
  20. data/lib/sevendigital/digestion_tract/list_digestor.rb +24 -0
  21. data/lib/sevendigital/digestion_tract/list_item_digestor.rb +26 -0
  22. data/lib/sevendigital/digestion_tract/locker_digestor.rb +9 -5
  23. data/lib/sevendigital/digestion_tract/locker_release_digestor.rb +13 -7
  24. data/lib/sevendigital/digestion_tract/locker_track_digestor.rb +13 -9
  25. data/lib/sevendigital/digestion_tract/oauth_access_token_digestor.rb +7 -3
  26. data/lib/sevendigital/digestion_tract/oauth_request_token_digestor.rb +7 -3
  27. data/lib/sevendigital/digestion_tract/pager_digestor.rb +13 -9
  28. data/lib/sevendigital/digestion_tract/price_digestor.rb +15 -12
  29. data/lib/sevendigital/digestion_tract/release_digestor.rb +26 -34
  30. data/lib/sevendigital/digestion_tract/tag_digestor.rb +8 -7
  31. data/lib/sevendigital/digestion_tract/track_digestor.rb +27 -28
  32. data/lib/sevendigital/digestion_tract/user_card_digestor.rb +9 -8
  33. data/lib/sevendigital/digestion_tract/user_digestor.rb +8 -7
  34. data/lib/sevendigital/management/artist_manager.rb +9 -11
  35. data/lib/sevendigital/management/basket_manager.rb +4 -4
  36. data/lib/sevendigital/management/country_manager.rb +11 -0
  37. data/lib/sevendigital/management/list_manager.rb +18 -0
  38. data/lib/sevendigital/management/oauth_manager.rb +2 -2
  39. data/lib/sevendigital/management/release_manager.rb +9 -11
  40. data/lib/sevendigital/management/tag_manager.rb +1 -1
  41. data/lib/sevendigital/management/track_manager.rb +4 -5
  42. data/lib/sevendigital/management/user_card_manager.rb +2 -2
  43. data/lib/sevendigital/management/user_manager.rb +9 -4
  44. data/lib/sevendigital/model/api_response.rb +12 -4
  45. data/lib/sevendigital/model/artist.rb +5 -0
  46. data/lib/sevendigital/model/list.rb +5 -0
  47. data/lib/sevendigital/model/list_item.rb +9 -0
  48. data/lib/sevendigital/model/release.rb +2 -2
  49. data/lib/sevendigital/model/sevendigital_object.rb +1 -1
  50. data/lib/sevendigital/model/user.rb +12 -1
  51. data/lib/sevendigital/pager.rb +2 -6
  52. data/lib/sevendigital/version.rb +1 -1
  53. data/spec/api_operator_cached_spec.rb +14 -14
  54. data/spec/api_operator_spec.rb +18 -34
  55. data/spec/digestion_tract/api_response_digestor_spec.rb +26 -25
  56. data/spec/digestion_tract/artist_digestor_spec.rb +9 -9
  57. data/spec/digestion_tract/basket_digestor_spec.rb +2 -2
  58. data/spec/digestion_tract/basket_item_digestor_spec.rb +4 -4
  59. data/spec/digestion_tract/chart_digestor_spec.rb +4 -4
  60. data/spec/digestion_tract/country_digestor_spec.rb +33 -0
  61. data/spec/digestion_tract/digestor_spec.rb +34 -0
  62. data/spec/digestion_tract/download_url_digestor_spec.rb +2 -2
  63. data/spec/digestion_tract/format_digestor_spec.rb +2 -2
  64. data/spec/digestion_tract/label_digestor_spec.rb +2 -2
  65. data/spec/digestion_tract/list_digestor_spec.rb +32 -0
  66. data/spec/digestion_tract/list_item_digestor_spec.rb +80 -0
  67. data/spec/digestion_tract/locker_digestor_spec.rb +2 -2
  68. data/spec/digestion_tract/locker_release_digestor_spec.rb +5 -5
  69. data/spec/digestion_tract/locker_track_digestor_spec.rb +4 -4
  70. data/spec/digestion_tract/oauth_access_token_digestor_spec.rb +2 -2
  71. data/spec/digestion_tract/oauth_request_token_digestor_spec.rb +2 -2
  72. data/spec/digestion_tract/pager_digestor_spec.rb +3 -3
  73. data/spec/digestion_tract/price_digestor_spec.rb +4 -4
  74. data/spec/digestion_tract/release_digestor_spec.rb +19 -5
  75. data/spec/digestion_tract/tag_digestor_spec.rb +3 -3
  76. data/spec/digestion_tract/track_digestor_spec.rb +4 -4
  77. data/spec/digestion_tract/user_card_digestor_spec.rb +5 -5
  78. data/spec/digestion_tract/user_digestor_spec.rb +4 -6
  79. data/spec/integration/artist_spec.rb +86 -0
  80. data/spec/integration/country_spec.rb +18 -0
  81. data/spec/integration/list_spec.rb +22 -0
  82. data/spec/integration/purchasing_spec.rb +24 -0
  83. data/spec/integration/release_spec.rb +34 -0
  84. data/spec/integration/sevendigital_spec.yml +5 -0
  85. data/spec/integration/track_spec.rb +23 -0
  86. data/spec/integration/user_spec.rb +22 -0
  87. data/spec/management/artist_manager_spec.rb +32 -11
  88. data/spec/management/basket_manager_spec.rb +4 -4
  89. data/spec/management/country_manager_spec.rb +34 -0
  90. data/spec/management/list_manager_spec.rb +27 -0
  91. data/spec/management/oauth_manager_spec.rb +4 -4
  92. data/spec/management/release_manager_spec.rb +13 -13
  93. data/spec/management/tag_manager_spec.rb +1 -1
  94. data/spec/management/track_manager_spec.rb +4 -4
  95. data/spec/management/user_card_manager_spec.rb +2 -2
  96. data/spec/management/user_manager_spec.rb +20 -4
  97. data/spec/model/api_response_spec.rb +3 -3
  98. data/spec/model/artist_spec.rb +2 -2
  99. data/spec/model/sevendigital_object_spec.rb +4 -4
  100. data/spec/model/user_spec.rb +21 -0
  101. data/spec/spec_helper.rb +31 -11
  102. data/spec/test-xml/methods/country/resolve.xml +7 -0
  103. data/spec/test-xml/methods/editorial/list.xml +171 -0
  104. data/spec/test-xml/methods/user/details.xml +5 -0
  105. data/spec/test-xml/objects/artist.xml +1 -0
  106. data/spec/test-xml/objects/list.xml +89 -0
  107. data/spec/test-xml/objects/list_item_list.xml +86 -0
  108. data/spec/test-xml/objects/list_item_release.xml +14 -0
  109. data/spec/test-xml/objects/nested_release_list.xml +23 -0
  110. metadata +126 -273
  111. data/lib/sevendigital/peachy_patchy.rb +0 -9
  112. data/lib/sevendigital/proxy_police.rb +0 -28
  113. data/spec/coverage/assets/0.3.9/app.js +0 -66
  114. data/spec/coverage/assets/0.3.9/fancybox/blank.gif +0 -0
  115. data/spec/coverage/assets/0.3.9/fancybox/fancy_close.png +0 -0
  116. data/spec/coverage/assets/0.3.9/fancybox/fancy_loading.png +0 -0
  117. data/spec/coverage/assets/0.3.9/fancybox/fancy_nav_left.png +0 -0
  118. data/spec/coverage/assets/0.3.9/fancybox/fancy_nav_right.png +0 -0
  119. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_e.png +0 -0
  120. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_n.png +0 -0
  121. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_ne.png +0 -0
  122. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_nw.png +0 -0
  123. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_s.png +0 -0
  124. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_se.png +0 -0
  125. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_sw.png +0 -0
  126. data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_w.png +0 -0
  127. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_left.png +0 -0
  128. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_main.png +0 -0
  129. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_over.png +0 -0
  130. data/spec/coverage/assets/0.3.9/fancybox/fancy_title_right.png +0 -0
  131. data/spec/coverage/assets/0.3.9/fancybox/fancybox-x.png +0 -0
  132. data/spec/coverage/assets/0.3.9/fancybox/fancybox-y.png +0 -0
  133. data/spec/coverage/assets/0.3.9/fancybox/fancybox.png +0 -0
  134. data/spec/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.css +0 -363
  135. data/spec/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.pack.js +0 -44
  136. data/spec/coverage/assets/0.3.9/favicon.png +0 -0
  137. data/spec/coverage/assets/0.3.9/jquery-1.4.2.min.js +0 -155
  138. data/spec/coverage/assets/0.3.9/jquery.dataTables.min.js +0 -152
  139. data/spec/coverage/assets/0.3.9/jquery.timeago.js +0 -141
  140. data/spec/coverage/assets/0.3.9/jquery.url.js +0 -174
  141. data/spec/coverage/assets/0.3.9/loading.gif +0 -0
  142. data/spec/coverage/assets/0.3.9/magnify.png +0 -0
  143. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  144. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  145. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  146. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  147. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  148. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  149. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  150. data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  151. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_222222_256x240.png +0 -0
  152. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  153. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_454545_256x240.png +0 -0
  154. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_888888_256x240.png +0 -0
  155. data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  156. data/spec/coverage/assets/0.3.9/smoothness/jquery-ui-1.8.4.custom.css +0 -295
  157. data/spec/coverage/assets/0.3.9/stylesheet.css +0 -341
  158. data/spec/coverage/index.html +0 -47481
  159. data/spec/coverage/resultset.yml +0 -3556
  160. data/spec/model/coverage/assets/0.3.9/app.js +0 -66
  161. data/spec/model/coverage/assets/0.3.9/fancybox/blank.gif +0 -0
  162. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_close.png +0 -0
  163. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_loading.png +0 -0
  164. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_nav_left.png +0 -0
  165. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_nav_right.png +0 -0
  166. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_e.png +0 -0
  167. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_n.png +0 -0
  168. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_ne.png +0 -0
  169. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_nw.png +0 -0
  170. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_s.png +0 -0
  171. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_se.png +0 -0
  172. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_sw.png +0 -0
  173. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_w.png +0 -0
  174. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_left.png +0 -0
  175. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_main.png +0 -0
  176. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_over.png +0 -0
  177. data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_right.png +0 -0
  178. data/spec/model/coverage/assets/0.3.9/fancybox/fancybox-x.png +0 -0
  179. data/spec/model/coverage/assets/0.3.9/fancybox/fancybox-y.png +0 -0
  180. data/spec/model/coverage/assets/0.3.9/fancybox/fancybox.png +0 -0
  181. data/spec/model/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.css +0 -363
  182. data/spec/model/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.pack.js +0 -44
  183. data/spec/model/coverage/assets/0.3.9/favicon.png +0 -0
  184. data/spec/model/coverage/assets/0.3.9/jquery-1.4.2.min.js +0 -155
  185. data/spec/model/coverage/assets/0.3.9/jquery.dataTables.min.js +0 -152
  186. data/spec/model/coverage/assets/0.3.9/jquery.timeago.js +0 -141
  187. data/spec/model/coverage/assets/0.3.9/jquery.url.js +0 -174
  188. data/spec/model/coverage/assets/0.3.9/loading.gif +0 -0
  189. data/spec/model/coverage/assets/0.3.9/magnify.png +0 -0
  190. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  191. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  192. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  193. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  194. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  195. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  196. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  197. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  198. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_222222_256x240.png +0 -0
  199. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  200. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_454545_256x240.png +0 -0
  201. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_888888_256x240.png +0 -0
  202. data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  203. data/spec/model/coverage/assets/0.3.9/smoothness/jquery-ui-1.8.4.custom.css +0 -295
  204. data/spec/model/coverage/assets/0.3.9/stylesheet.css +0 -341
  205. data/spec/model/coverage/index.html +0 -8637
  206. data/spec/model/coverage/resultset.yml +0 -642
  207. data/spec/pager_spec.rb +0 -7
  208. data/spec/peachy_spec_helper_patch.rb +0 -7
  209. data/spec/proxy_police_spec.rb +0 -70
  210. data/spec/sevendigital_spec.rb +0 -51
  211. data/spec/sevendigital_spec.yml +0 -5
@@ -53,7 +53,13 @@ module Sevendigital
53
53
  end
54
54
 
55
55
  def configuration
56
- return @configuration
56
+ @configuration
57
+ end
58
+
59
+ def log(severity, &block)
60
+ if self.send("#{severity}?")
61
+ logger.info(yield) if block_given?
62
+ end
57
63
  end
58
64
 
59
65
  def operator
@@ -61,17 +67,17 @@ module Sevendigital
61
67
  end
62
68
 
63
69
  def verbose?
64
- !!(@verbose || @configuration.verbose)
70
+ very_verbose? || !!@verbose || !!@configuration.verbose
65
71
  end
66
72
 
67
73
  def very_verbose?
68
- verbose? && (@verbose || @configuration.verbose).to_s == "very_verbose"
74
+ @very_verbose || @configuration.verbose.to_s == "very_verbose"
69
75
  end
70
76
 
71
77
  #@private
72
78
  def api_host_and_version(api_service=nil)
73
79
  service = api_service && !api_service.to_s.empty? ? "#{api_service}_" : ""
74
- return configuration.send("#{service}api_url".to_sym), configuration.send("#{service}api_version".to_sym)
80
+ [configuration.send("#{service}api_url".to_sym), configuration.send("#{service}api_version".to_sym)]
75
81
  end
76
82
 
77
83
  #@private
@@ -107,7 +113,10 @@ module Sevendigital
107
113
  params
108
114
  end
109
115
 
110
-
116
+ #@private
117
+ def logger
118
+ path = (@configuration.logfile_path.nil? || @configuration.logfile_path.blank?) ? STDOUT : @configuration.logfile_path
119
+ @logger ||= Logger.new(path)
120
+ end
111
121
  end
112
-
113
122
  end
@@ -79,8 +79,5 @@ module Sevendigital
79
79
  new_hash = hash.inject({}){|memo,(k,v)| memo[k.to_sym] = transform_keys_to_symbols(v); memo}
80
80
  new_hash
81
81
  end
82
-
83
-
84
82
  end
85
-
86
83
  end
@@ -27,6 +27,11 @@ module Sevendigital
27
27
  @chart_item_digestor ||= ChartItemDigestor.new(self)
28
28
  end
29
29
 
30
+ #@private
31
+ def country_digestor
32
+ @country_digestor ||= CountryDigestor.new(self)
33
+ end
34
+
30
35
  #@private
31
36
  def download_url_digestor
32
37
  @download_url_digestor ||= DownloadUrlDigestor.new(self)
@@ -57,6 +62,16 @@ module Sevendigital
57
62
  @locker_track_digestor ||= LockerTrackDigestor.new(self)
58
63
  end
59
64
 
65
+ #@private
66
+ def list_digestor
67
+ @list_digestor ||= ListDigestor.new(self)
68
+ end
69
+
70
+ #@private
71
+ def list_item_digestor
72
+ @list_item_digestor ||= ListItemDigestor.new(self)
73
+ end
74
+
60
75
  #@private
61
76
  def oauth_request_token_digestor
62
77
  @oauth_request_token_digestor ||= OAuthRequestTokenDigestor.new(self)
@@ -4,7 +4,7 @@ module Sevendigital
4
4
 
5
5
  #@return [ArtistManager]
6
6
  def artist
7
- @artist_manager ||= ArtistManager.new(self)
7
+ @artist_manager ||= ArtistManager.new(self)
8
8
  end
9
9
 
10
10
  #@return [BasketManager]
@@ -12,6 +12,16 @@ module Sevendigital
12
12
  @basket_manager ||= BasketManager.new(self)
13
13
  end
14
14
 
15
+ #@return [CountrytManager]
16
+ def country
17
+ @country_manager ||= CountryManager.new(self)
18
+ end
19
+
20
+ #@return [ListManager]
21
+ def list
22
+ @list_manager ||= ListManager.new(self)
23
+ end
24
+
15
25
  #@return [ReleaseManager]
16
26
  def release
17
27
  @release_manager ||= ReleaseManager.new(self)
@@ -1,58 +1,49 @@
1
+ require 'nokogiri'
2
+
1
3
  module Sevendigital
2
4
 
3
5
  #@private
4
6
  class ApiResponseDigestor < Digestor # :nodoc:
5
7
 
6
- def from_xml(xml_or_proxy, element_name = :response)
7
- return from_proxy(ProxyPolice.ensure_is_proxy(xml_or_proxy, element_name))
8
- end
9
-
10
- def from_proxy(proxy)
11
- if proxy && proxy.status then
12
- return from_ok_response(proxy) if proxy.status == 'ok'
13
- return from_error_response(proxy.error) if proxy.status == 'error' && proxy.error
14
- end
15
- return from_invalid_xml
16
- end
8
+ def default_element_name; :response end
17
9
 
18
- def from_invalid_xml
10
+ def from_http_response(http_response)
19
11
  response = ApiResponse.new
20
- response.error_code = 10000
21
- response.error_message = 'Invalid 7digital API response'
22
- return response
23
- end
12
+ response.headers = http_response.header
13
+ response.content = http_response.body.to_s
24
14
 
25
- def from_error_response(error)
26
- response = ApiResponse.new
27
- response.error_code = error.code.to_i
28
- response.error_message = error.error_message.value.to_s
29
- return response
30
- end
15
+ parse_xml_doc(response.content, response)
31
16
 
32
- def from_ok_response(response_content)
33
- response = ApiResponse.new
34
- response.error_code = 0
35
- response.content = response_content
36
- return response
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
37
22
  end
38
23
 
39
- def from_http_response(http_response)
40
- if http_response.is_a?(Net::HTTPSuccess) then
41
- response = from_xml(http_response.body.to_s)
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
+ puts xml.inspect
32
+ if response_status == 'ok' then
33
+ response.error_code = 0
42
34
  else
43
- response = from_invalid_http_response(http_response)
35
+ if response_status == 'error'
36
+ error_node = get_required_node(response_node, "error")
37
+ response.error_code = get_required_attribute(error_node, "code").to_i
38
+ response.error_message = get_required_value(error_node, "errorMessage")
39
+ else
40
+ response.error_code = 10001
41
+ response.error_message = 'Invalid 7digital API response'
42
+ end
44
43
  end
45
- response.headers = http_response.header
46
- response
47
- end
48
44
 
49
- def from_invalid_http_response(http_response)
50
- response = ApiResponse.new
51
- response.error_code = Integer(http_response.code)
52
- response.error_message= http_response.body.to_s
53
- return response
54
45
  end
55
-
46
+
56
47
  end
57
48
 
58
49
  end
@@ -1,3 +1,5 @@
1
+ require 'nokogiri'
2
+
1
3
  module Sevendigital
2
4
 
3
5
  #@private
@@ -6,26 +8,27 @@ module Sevendigital
6
8
  def default_element_name; :artist end
7
9
  def default_list_element_name; :artists end
8
10
 
9
- def from_proxy(artist_proxy)
10
- make_sure_not_eating_nil(artist_proxy)
11
+ def from_xml_doc(xml_doc)
12
+ make_sure_eating_nokogiri_node(xml_doc)
11
13
  artist = Artist.new(@api_client)
12
- populate_required_properties(artist, artist_proxy)
13
- populate_optional_properties(artist, artist_proxy)
14
- return artist
14
+ populate_required_properties(artist, xml_doc)
15
+ populate_optional_properties(artist, xml_doc)
16
+ artist
15
17
  end
16
18
 
17
19
  private
18
20
 
19
- def populate_required_properties(artist, artist_proxy)
20
- artist.id = artist_proxy.id.to_i
21
- artist.name = artist_proxy.name.value.to_s
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")
22
24
  end
23
25
 
24
- def populate_optional_properties(artist, artist_proxy)
25
- artist.sort_name = artist_proxy.sort_name.value.to_s if artist_proxy.sort_name
26
- artist.appears_as = artist_proxy.appears_as.value.to_s if artist_proxy.appears_as
27
- artist.image = artist_proxy.image.value.to_s if artist_proxy.image
28
- artist.url = artist_proxy.url.value.to_s if artist_proxy.url
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}
29
32
  end
30
33
 
31
34
  end
@@ -5,13 +5,13 @@ module Sevendigital
5
5
 
6
6
  def default_element_name; :basket end
7
7
 
8
- def from_proxy(basket_proxy)
9
- make_sure_not_eating_nil (basket_proxy)
8
+ def from_xml_doc(xml_node)
9
+ make_sure_eating_nokogiri_node(xml_node)
10
10
  basket = Sevendigital::Basket.new(@api_client)
11
- basket.id = basket_proxy.id.to_s
12
- basket.basket_items = @api_client.basket_item_digestor.list_from_proxy(basket_proxy.basket_items)
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
13
 
14
- return basket
14
+ basket
15
15
  end
16
16
 
17
17
  end
@@ -3,22 +3,22 @@ module Sevendigital
3
3
  #@private
4
4
  class BasketItemDigestor < Digestor # :nodoc:
5
5
 
6
- def default_element_name; :basket_item end
7
- def default_list_element_name; :basket_items end
6
+ def default_element_name; :basketItem end
7
+ def default_list_element_name; :basketItems end
8
8
 
9
- def from_proxy(basket_item_proxy)
10
- make_sure_not_eating_nil(basket_item_proxy)
9
+ def from_xml_doc(xml_node)
10
+ make_sure_eating_nokogiri_node(xml_node)
11
11
  basket_item = BasketItem.new(@api_client)
12
12
 
13
- basket_item.id = basket_item_proxy.id.to_i
14
- basket_item.type = basket_item_proxy.type.value.downcase.to_sym
15
- basket_item.artist_name = basket_item_proxy.artist_name.value.to_s
16
- basket_item.item_name = basket_item_proxy.item_name.value.to_s
17
- basket_item.release_id = basket_item_proxy.release_id.value.to_i
18
- basket_item.track_id = basket_item_proxy.track_id.value.to_i
19
- basket_item.price = @api_client.price_digestor.from_proxy(basket_item_proxy.price)
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
20
 
21
- return basket_item
21
+ basket_item
22
22
  end
23
23
 
24
24
  end
@@ -3,25 +3,31 @@ module Sevendigital
3
3
  #@private
4
4
  class ChartItemDigestor < Digestor # :nodoc:
5
5
 
6
- def default_element_name; :chart_item end
6
+ def default_element_name; :chartItem end
7
7
  def default_list_element_name; :chart end
8
8
 
9
9
  def from_proxy(chart_item_proxy)
10
10
 
11
- make_sure_not_eating_nil(chart_item_proxy)
12
-
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
+
13
18
  chart_item = ChartItem.new(@client)
14
- chart_item.position = chart_item_proxy.position.value.to_i
15
- chart_item.change = chart_item_proxy.change.value.to_s.downcase.to_sym
16
- if chart_item_proxy.release then
17
- chart_item.item = @api_client.release_digestor.from_proxy(chart_item_proxy.release)
18
- elsif chart_item_proxy.track
19
- chart_item.item = @api_client.track_digestor.from_proxy(chart_item_proxy.track)
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) }
20
26
  else
21
- chart_item.item = @api_client.artist_digestor.from_proxy(chart_item_proxy.artist)
27
+ chart_item.item = get_required_node(xml_node, "artist") {|v| @api_client.artist_digestor.from_xml_doc(v) }
22
28
  end
23
29
  return chart_item
24
- end
30
+ end
25
31
 
26
32
  end
27
33
 
@@ -0,0 +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
+
16
+ end
@@ -10,50 +10,50 @@ module Sevendigital
10
10
  @api_client = api_client
11
11
  end
12
12
 
13
- def from_xml(xml_or_proxy, element_name = default_element_name)
14
- return from_proxy(ProxyPolice.ensure_is_proxy(xml_or_proxy, element_name))
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}"))
15
16
  end
16
17
 
17
- def list_from_xml(xml_or_proxy, list_element_name = default_list_element_name)
18
- list_from_proxy(ProxyPolice.ensure_is_proxy(xml_or_proxy, list_element_name))
19
- end
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
20
22
 
21
- def list_from_proxy(object_list_proxy)
22
- make_sure_not_eating_nil(object_list_proxy)
23
- list = []
24
- return list if object_list_proxy.kind_of?(Peachy::SimpleContent)
25
- if object_list_proxy.send(default_element_name) then
26
- object_list_proxy.send(default_element_name).each { |object_proxy| list << from_proxy(object_proxy) }
27
- end
28
- paginate_results(object_list_proxy, list)
29
- end
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
30
29
 
31
30
  #nested parsing for api methods that return standard object inside containers with no additional (useful) information
32
31
  #e.g. tagged_item.artist, recommendation.release, search_result.track, etc
33
32
 
34
- def nested_list_from_xml(xml_or_proxy, container_element_name, list_element_name = default_list_element_name)
35
- nested_list_from_proxy(ProxyPolice.ensure_is_proxy(xml_or_proxy, list_element_name), container_element_name)
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
36
  end
37
37
 
38
- def nested_list_from_proxy(object_list_proxy, container_element_name)
39
- make_sure_not_eating_nil(object_list_proxy)
38
+ def nested_list_from_xml_doc(list_node, list_element_name = default_list_element_name, element_name = default_element_name)
39
+ puts list_element_name
40
+ puts element_name
41
+ puts list_node.inspect
42
+ make_sure_eating_nokogiri_node(list_node)
40
43
  list = []
41
- if object_list_proxy.send(container_element_name) then
42
- object_list_proxy.send(container_element_name).each do
43
- |object_proxy| list << from_proxy(object_proxy.send(default_element_name))
44
- end
45
- end
46
- return paginate_results(object_list_proxy, list)
44
+ list_node.xpath("./#{list_element_name}/#{element_name}").each { |node| list << from_xml_doc(node)}
45
+ paginate_results(list_node, list)
47
46
  end
48
47
 
49
- def paginate_results(xml_results, list)
50
- pager = @api_client.pager_digestor.from_xml(xml_results)
48
+ def paginate_results(results_xml_node, list)
49
+ pager = @api_client.pager_digestor.from_xml_doc(results_xml_node)
51
50
  return list if !pager
52
51
  pager.paginate_list(list)
53
52
  end
54
53
 
55
- def make_sure_not_eating_nil(proxy)
56
- raise DigestiveProblem, "There's nothing i can digest" unless proxy
54
+ def make_sure_eating_nokogiri_node(xml)
55
+ raise DigestiveProblem, "There's nothing i can digest" unless xml
56
+ raise DigestiveProblem, "I'm not eating this! It's not a Nokogiri XML node.'" unless xml.kind_of?(Nokogiri::XML::Node)
57
57
  end
58
58
 
59
59
  def value_present?(proxy_node)
@@ -64,6 +64,60 @@ module Sevendigital
64
64
  !proxy_node.nil?
65
65
  end
66
66
 
67
+ def get_required_value(node, element_name)
68
+ if node.at_xpath("./#{element_name}") then
69
+ content = node.at_xpath("./#{element_name}").content
70
+ return yield(content) if block_given?
71
+ return content
72
+ end
73
+ raise DigestiveProblem, "I need #{element_name} element to digest the response"
74
+ end
75
+
76
+ def get_required_node(node, element_name)
77
+ if node.at_xpath("./#{element_name}") then
78
+ subnode = node.at_xpath("./#{element_name}")
79
+ return yield(subnode) if block_given?
80
+ return subnode
81
+ end
82
+ raise DigestiveProblem, "I need #{element_name} element to digest the response"
83
+ end
84
+
85
+ def get_required_attribute(node, attribute_name)
86
+ if node.at_xpath("@#{attribute_name}") then
87
+ content = node.at_xpath("@#{attribute_name}").content
88
+ return yield(content) if block_given?
89
+ return content
90
+ end
91
+ raise DigestiveProblem, "I need #{attribute_name} attribute to digest the response"
92
+ end
93
+
94
+ def get_optional_value(node, element_name)
95
+ if node.at_xpath("./#{element_name}") then
96
+ content = node.at_xpath("./#{element_name}").content
97
+ return yield(content) if block_given?
98
+ return content
99
+ end
100
+ nil
101
+ end
102
+
103
+ def get_optional_node(node, element_name)
104
+ if node.at_xpath("./#{element_name}") then
105
+ subnode = node.at_xpath("./#{element_name}")
106
+ return yield(subnode) if block_given?
107
+ return subnode
108
+ end
109
+ nil
110
+ end
111
+
112
+ def get_optional_attribute(node, attribute_name)
113
+ if node.at_xpath("@#{attribute_name}") then
114
+ content = node.at_xpath("@#{attribute_name}").content
115
+ return yield(content) if block_given?
116
+ return content
117
+ end
118
+ nil
119
+ end
120
+
67
121
  end
68
122
 
69
123
  class DigestiveProblem < StandardError; end