7digital 0.0.6 → 0.0.7
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.
- data/README.rdoc +136 -136
- data/lib/sevendigital.rb +53 -53
- data/lib/sevendigital/api_operator.rb +130 -130
- data/lib/sevendigital/api_operator_cached.rb +41 -41
- data/lib/sevendigital/api_request.rb +65 -65
- data/lib/sevendigital/client.rb +113 -113
- data/lib/sevendigital/client_configuration.rb +86 -86
- data/lib/sevendigital/client_digestors.rb +107 -107
- data/lib/sevendigital/client_managers.rb +47 -47
- data/lib/sevendigital/digestion_tract/api_response_digestor.rb +58 -58
- data/lib/sevendigital/digestion_tract/artist_digestor.rb +32 -32
- data/lib/sevendigital/digestion_tract/basket_digestor.rb +19 -19
- data/lib/sevendigital/digestion_tract/basket_item_digestor.rb +26 -26
- data/lib/sevendigital/digestion_tract/chart_item_digestor.rb +28 -28
- data/lib/sevendigital/digestion_tract/digestor.rb +71 -71
- data/lib/sevendigital/digestion_tract/download_url_digestor.rb +20 -20
- data/lib/sevendigital/digestion_tract/format_digestor.rb +22 -22
- data/lib/sevendigital/digestion_tract/label_digestor.rb +20 -20
- data/lib/sevendigital/digestion_tract/locker_digestor.rb +18 -18
- data/lib/sevendigital/digestion_tract/locker_release_digestor.rb +20 -20
- data/lib/sevendigital/digestion_tract/locker_track_digestor.rb +22 -22
- data/lib/sevendigital/digestion_tract/oauth_access_token_digestor.rb +14 -14
- data/lib/sevendigital/digestion_tract/oauth_request_token_digestor.rb +14 -14
- data/lib/sevendigital/digestion_tract/pager_digestor.rb +24 -24
- data/lib/sevendigital/digestion_tract/price_digestor.rb +25 -25
- data/lib/sevendigital/digestion_tract/release_digestor.rb +53 -53
- data/lib/sevendigital/digestion_tract/tag_digestor.rb +22 -22
- data/lib/sevendigital/digestion_tract/track_digestor.rb +38 -38
- data/lib/sevendigital/digestion_tract/user_card_digestor.rb +23 -23
- data/lib/sevendigital/digestion_tract/user_digestor.rb +20 -20
- data/lib/sevendigital/management/artist_manager.rb +99 -99
- data/lib/sevendigital/management/basket_manager.rb +29 -29
- data/lib/sevendigital/management/manager.rb +12 -12
- data/lib/sevendigital/management/oauth_manager.rb +23 -23
- data/lib/sevendigital/management/release_manager.rb +56 -56
- data/lib/sevendigital/management/tag_manager.rb +10 -10
- data/lib/sevendigital/management/track_manager.rb +28 -28
- data/lib/sevendigital/management/user_card_manager.rb +26 -26
- data/lib/sevendigital/management/user_manager.rb +71 -71
- data/lib/sevendigital/model/api_response.rb +25 -25
- data/lib/sevendigital/model/artist.rb +94 -94
- data/lib/sevendigital/model/basket.rb +15 -15
- data/lib/sevendigital/model/basket_item.rb +14 -14
- data/lib/sevendigital/model/card.rb +11 -11
- data/lib/sevendigital/model/chart_item.rb +9 -9
- data/lib/sevendigital/model/download_url.rb +7 -7
- data/lib/sevendigital/model/format.rb +7 -7
- data/lib/sevendigital/model/label.rb +7 -7
- data/lib/sevendigital/model/locker.rb +4 -4
- data/lib/sevendigital/model/locker_release.rb +9 -9
- data/lib/sevendigital/model/locker_track.rb +9 -9
- data/lib/sevendigital/model/price.rb +9 -9
- data/lib/sevendigital/model/release.rb +52 -52
- data/lib/sevendigital/model/sevendigital_error.rb +11 -11
- data/lib/sevendigital/model/sevendigital_object.rb +57 -57
- data/lib/sevendigital/model/tag.rb +7 -7
- data/lib/sevendigital/model/track.rb +83 -83
- data/lib/sevendigital/model/user.rb +63 -63
- data/lib/sevendigital/pager.rb +23 -23
- data/lib/sevendigital/peachy_patchy.rb +9 -9
- data/lib/sevendigital/proxy_police.rb +27 -27
- data/lib/sevendigital/version.rb +5 -5
- data/spec/api_operator_cached_spec.rb +178 -178
- data/spec/api_operator_spec.rb +336 -336
- data/spec/api_request_spec.rb +31 -31
- data/spec/client_configuration_spec.rb +79 -74
- data/spec/client_spec.rb +162 -162
- data/spec/coverage/assets/0.3.9/app.js +66 -0
- data/spec/coverage/assets/0.3.9/fancybox/blank.gif +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_close.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_loading.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_nav_left.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_nav_right.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_e.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_n.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_ne.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_nw.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_s.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_se.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_sw.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_shadow_w.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_title_left.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_title_main.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_title_over.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancy_title_right.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancybox-x.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancybox-y.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/fancybox.png +0 -0
- data/spec/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.css +363 -0
- data/spec/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.pack.js +44 -0
- data/spec/coverage/assets/0.3.9/favicon.png +0 -0
- data/spec/coverage/assets/0.3.9/jquery-1.4.2.min.js +155 -0
- data/spec/coverage/assets/0.3.9/jquery.dataTables.min.js +152 -0
- data/spec/coverage/assets/0.3.9/jquery.timeago.js +141 -0
- data/spec/coverage/assets/0.3.9/jquery.url.js +174 -0
- data/spec/coverage/assets/0.3.9/loading.gif +0 -0
- data/spec/coverage/assets/0.3.9/magnify.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/spec/coverage/assets/0.3.9/smoothness/jquery-ui-1.8.4.custom.css +295 -0
- data/spec/coverage/assets/0.3.9/stylesheet.css +341 -0
- data/spec/coverage/index.html +47481 -0
- data/spec/coverage/resultset.yml +3556 -0
- data/spec/data/config/sevendigital.yml +5 -5
- data/spec/data/configuration_env_override.yml +5 -5
- data/spec/data/configuration_override.yml +1 -1
- data/spec/digestion_tract/api_response_digestor_spec.rb +92 -92
- data/spec/digestion_tract/artist_digestor_spec.rb +81 -81
- data/spec/digestion_tract/basket_digestor_spec.rb +31 -31
- data/spec/digestion_tract/basket_item_digestor_spec.rb +58 -58
- data/spec/digestion_tract/chart_digestor_spec.rb +52 -52
- data/spec/digestion_tract/download_url_digestor_spec.rb +40 -40
- data/spec/digestion_tract/format_digestor_spec.rb +38 -38
- data/spec/digestion_tract/label_digestor_spec.rb +33 -33
- data/spec/digestion_tract/locker_digestor_spec.rb +30 -30
- data/spec/digestion_tract/locker_release_digestor_spec.rb +70 -70
- data/spec/digestion_tract/locker_track_digestor_spec.rb +56 -56
- data/spec/digestion_tract/oauth_access_token_digestor_spec.rb +34 -34
- data/spec/digestion_tract/oauth_request_token_digestor_spec.rb +34 -34
- data/spec/digestion_tract/pager_digestor_spec.rb +50 -50
- data/spec/digestion_tract/price_digestor_spec.rb +73 -73
- data/spec/digestion_tract/release_digestor_spec.rb +101 -101
- data/spec/digestion_tract/tag_digestor_spec.rb +46 -46
- data/spec/digestion_tract/track_digestor_spec.rb +104 -104
- data/spec/digestion_tract/user_card_digestor_spec.rb +58 -58
- data/spec/digestion_tract/user_digestor_spec.rb +44 -44
- data/spec/management/artist_manager_spec.rb +151 -151
- data/spec/management/basket_manager_spec.rb +77 -77
- data/spec/management/oauth_manager_spec.rb +72 -72
- data/spec/management/release_manager_spec.rb +200 -200
- data/spec/management/tag_manager_spec.rb +34 -34
- data/spec/management/track_manager_spec.rb +107 -107
- data/spec/management/user_card_manager_spec.rb +78 -78
- data/spec/management/user_manager_spec.rb +202 -202
- data/spec/model/api_response_spec.rb +48 -48
- data/spec/model/artist_spec.rb +154 -154
- data/spec/model/basket_spec.rb +62 -62
- data/spec/model/coverage/assets/0.3.9/app.js +66 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/blank.gif +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_close.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_loading.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_nav_left.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_nav_right.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_e.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_n.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_ne.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_nw.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_s.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_se.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_sw.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_shadow_w.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_left.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_main.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_over.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancy_title_right.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancybox-x.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancybox-y.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/fancybox.png +0 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.css +363 -0
- data/spec/model/coverage/assets/0.3.9/fancybox/jquery.fancybox-1.3.1.pack.js +44 -0
- data/spec/model/coverage/assets/0.3.9/favicon.png +0 -0
- data/spec/model/coverage/assets/0.3.9/jquery-1.4.2.min.js +155 -0
- data/spec/model/coverage/assets/0.3.9/jquery.dataTables.min.js +152 -0
- data/spec/model/coverage/assets/0.3.9/jquery.timeago.js +141 -0
- data/spec/model/coverage/assets/0.3.9/jquery.url.js +174 -0
- data/spec/model/coverage/assets/0.3.9/loading.gif +0 -0
- data/spec/model/coverage/assets/0.3.9/magnify.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_222222_256x240.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_454545_256x240.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_888888_256x240.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
- data/spec/model/coverage/assets/0.3.9/smoothness/jquery-ui-1.8.4.custom.css +295 -0
- data/spec/model/coverage/assets/0.3.9/stylesheet.css +341 -0
- data/spec/model/coverage/index.html +8637 -0
- data/spec/model/coverage/resultset.yml +642 -0
- data/spec/model/release_spec.rb +122 -122
- data/spec/model/sevendigital_object_spec.rb +73 -73
- data/spec/model/track_spec.rb +144 -144
- data/spec/model/user_spec.rb +160 -160
- data/spec/pager_spec.rb +7 -7
- data/spec/peachy_spec_helper_patch.rb +6 -6
- data/spec/proxy_police_spec.rb +69 -69
- data/spec/sevendigital_spec.rb +51 -70
- data/spec/sevendigital_spec.yml +4 -4
- data/spec/spec_helper.rb +64 -64
- data/spec/test-xml/methods/artist/browse.xml +21 -21
- data/spec/test-xml/methods/artist/byTag/top.xml +50 -50
- data/spec/test-xml/methods/artist/chart.xml +30 -30
- data/spec/test-xml/methods/artist/details.xml +9 -9
- data/spec/test-xml/methods/artist/releases.xml +544 -544
- data/spec/test-xml/methods/artist/search.xml +18 -18
- data/spec/test-xml/methods/artist/similar.xml +39 -39
- data/spec/test-xml/methods/artist/tags.xml +11 -11
- data/spec/test-xml/methods/artist/toptracks.xml +279 -279
- data/spec/test-xml/methods/basket/additem.xml +23 -23
- data/spec/test-xml/methods/basket/create.xml +10 -10
- data/spec/test-xml/methods/basket/index.xml +23 -23
- data/spec/test-xml/methods/basket/removeitem.xml +10 -10
- data/spec/test-xml/methods/oauth/accesstoken.xml +5 -5
- data/spec/test-xml/methods/oauth/requesttoken.xml +5 -5
- data/spec/test-xml/methods/release/bydate.xml +173 -173
- data/spec/test-xml/methods/release/bytag/top.xml +150 -150
- data/spec/test-xml/methods/release/chart.xml +181 -181
- data/spec/test-xml/methods/release/details.xml +48 -48
- data/spec/test-xml/methods/release/recommend.xml +89 -89
- data/spec/test-xml/methods/release/search.xml +194 -194
- data/spec/test-xml/methods/release/tags.xml +27 -27
- data/spec/test-xml/methods/release/tracks.xml +28 -28
- data/spec/test-xml/methods/tag/index.xml +16 -16
- data/spec/test-xml/methods/track/chart.xml +149 -149
- data/spec/test-xml/methods/track/details.xml +30 -30
- data/spec/test-xml/methods/track/search.xml +159 -159
- data/spec/test-xml/methods/user/locker.xml +49 -49
- data/spec/test-xml/methods/user/payment/card/add.xml +7 -7
- data/spec/test-xml/methods/user/payment/card/index.xml +7 -7
- data/spec/test-xml/methods/user/purchase/basket.xml +49 -0
- data/spec/test-xml/methods/user/purchase/item.xml +48 -48
- data/spec/test-xml/methods/user/signUp.xml +5 -5
- data/spec/test-xml/objects/artist.xml +6 -6
- data/spec/test-xml/objects/artist_chart_item.xml +7 -7
- data/spec/test-xml/objects/artist_list.xml +22 -22
- data/spec/test-xml/objects/artist_list_empty.xml +4 -4
- data/spec/test-xml/objects/basket.xml +21 -21
- data/spec/test-xml/objects/basket_item.xml +11 -11
- data/spec/test-xml/objects/basket_item_list.xml +25 -25
- data/spec/test-xml/objects/basket_item_list_empty.xml +1 -1
- data/spec/test-xml/objects/download_url.xml +7 -7
- data/spec/test-xml/objects/locker.xml +47 -47
- data/spec/test-xml/objects/locker_release.xml +40 -40
- data/spec/test-xml/objects/locker_release_list.xml +87 -87
- data/spec/test-xml/objects/locker_release_list_empty.xml +4 -4
- data/spec/test-xml/objects/locker_release_one_item_list.xml +43 -43
- data/spec/test-xml/objects/locker_track.xml +25 -25
- data/spec/test-xml/objects/locker_track_list.xml +26 -26
- data/spec/test-xml/objects/locker_track_list_empty.xml +2 -2
- data/spec/test-xml/objects/oauth_access_token.xml +3 -3
- data/spec/test-xml/objects/oauth_request_token.xml +3 -3
- data/spec/test-xml/objects/price.xml +7 -7
- data/spec/test-xml/objects/release.xml +40 -40
- data/spec/test-xml/objects/release_chart_item.xml +39 -39
- data/spec/test-xml/objects/release_list.xml +18 -18
- data/spec/test-xml/objects/release_list_empty.xml +4 -4
- data/spec/test-xml/objects/response.xml +38 -38
- data/spec/test-xml/objects/tag.xml +4 -4
- data/spec/test-xml/objects/track.xml +33 -33
- data/spec/test-xml/objects/track_chart_item.xml +27 -27
- data/spec/test-xml/objects/user.xml +4 -4
- data/spec/test-xml/objects/user_payment_card.xml +5 -5
- metadata +193 -3
@@ -1,41 +1,41 @@
|
|
1
|
-
module Sevendigital
|
2
|
-
|
3
|
-
#@private
|
4
|
-
#Cached version of ApiOperator
|
5
|
-
#If response for an API request is already in cache and
|
6
|
-
#and it hasn't expired returns the cached response is returned instead of making an API call
|
7
|
-
#otherwise uses methods inherited from ApiOperator to make an HTTP call to the API
|
8
|
-
class ApiOperatorCached < ApiOperator # :nodoc:
|
9
|
-
|
10
|
-
def initialize(client, cache)
|
11
|
-
@cache = cache
|
12
|
-
super(client)
|
13
|
-
end
|
14
|
-
|
15
|
-
def call_api(api_request)
|
16
|
-
request_cache_key = create_request_uri(api_request)
|
17
|
-
http_response = @cache.get(request_cache_key.to_s) if !api_request.requires_signature?
|
18
|
-
puts "ApiOperatorCached: Got from cache #{request_cache_key}" if @client.verbose? && http_response
|
19
|
-
puts "but the response is out of date" if @client.verbose? && http_response && response_out_of_date?(http_response)
|
20
|
-
if (!http_response || response_out_of_date?(http_response)) then
|
21
|
-
http_response = make_http_request(api_request)
|
22
|
-
@cache.set(request_cache_key.to_s, http_response) if !api_request.requires_signature?
|
23
|
-
end
|
24
|
-
api_response = digest_http_response(http_response)
|
25
|
-
p api_response if @client.very_verbose?
|
26
|
-
api_response
|
27
|
-
end
|
28
|
-
|
29
|
-
def response_out_of_date?(http_response, current_time=nil)
|
30
|
-
return true if http_response.header.nil? || http_response.header["Date"].nil? || http_response.header["cache-control"].nil?
|
31
|
-
puts "cache headers present"
|
32
|
-
return true if !(http_response.header["cache-control"] =~ /max-age=([0-9]+)/)
|
33
|
-
current_time ||= Time.now.utc
|
34
|
-
response_time = Time.parse(http_response.header["Date"])
|
35
|
-
max_age = /max-age=([0-9]+)/.match(http_response.header["cache-control"])[1].to_i
|
36
|
-
response_time + max_age < current_time
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
1
|
+
module Sevendigital
|
2
|
+
|
3
|
+
#@private
|
4
|
+
#Cached version of ApiOperator
|
5
|
+
#If response for an API request is already in cache and
|
6
|
+
#and it hasn't expired returns the cached response is returned instead of making an API call
|
7
|
+
#otherwise uses methods inherited from ApiOperator to make an HTTP call to the API
|
8
|
+
class ApiOperatorCached < ApiOperator # :nodoc:
|
9
|
+
|
10
|
+
def initialize(client, cache)
|
11
|
+
@cache = cache
|
12
|
+
super(client)
|
13
|
+
end
|
14
|
+
|
15
|
+
def call_api(api_request)
|
16
|
+
request_cache_key = create_request_uri(api_request)
|
17
|
+
http_response = @cache.get(request_cache_key.to_s) if !api_request.requires_signature?
|
18
|
+
puts "ApiOperatorCached: Got from cache #{request_cache_key}" if @client.verbose? && http_response
|
19
|
+
puts "but the response is out of date" if @client.verbose? && http_response && response_out_of_date?(http_response)
|
20
|
+
if (!http_response || response_out_of_date?(http_response)) then
|
21
|
+
http_response = make_http_request(api_request)
|
22
|
+
@cache.set(request_cache_key.to_s, http_response) if !api_request.requires_signature?
|
23
|
+
end
|
24
|
+
api_response = digest_http_response(http_response)
|
25
|
+
p api_response if @client.very_verbose?
|
26
|
+
api_response
|
27
|
+
end
|
28
|
+
|
29
|
+
def response_out_of_date?(http_response, current_time=nil)
|
30
|
+
return true if http_response.header.nil? || http_response.header["Date"].nil? || http_response.header["cache-control"].nil?
|
31
|
+
puts "cache headers present"
|
32
|
+
return true if !(http_response.header["cache-control"] =~ /max-age=([0-9]+)/)
|
33
|
+
current_time ||= Time.now.utc
|
34
|
+
response_time = Time.parse(http_response.header["Date"])
|
35
|
+
max_age = /max-age=([0-9]+)/.match(http_response.header["cache-control"])[1].to_i
|
36
|
+
response_time + max_age < current_time
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -1,66 +1,66 @@
|
|
1
|
-
module Sevendigital
|
2
|
-
|
3
|
-
#@private
|
4
|
-
#Abstraction of a HTTP API request, ApiOperator uses this ApiRequest to build a real HTTP requests
|
5
|
-
class ApiRequest # :nodoc:
|
6
|
-
|
7
|
-
attr_reader :api_method, :parameters, :signed
|
8
|
-
attr_accessor :token, :api_service, :http_method
|
9
|
-
attr_accessor :signature_scheme
|
10
|
-
attr_writer :form_parameters
|
11
|
-
|
12
|
-
def initialize(http_method, api_method, parameters, options={})
|
13
|
-
@api_method = api_method
|
14
|
-
@parameters = parameters
|
15
|
-
@signature_scheme = :header
|
16
|
-
@http_method = http_method
|
17
|
-
comb_parameters(parameters)
|
18
|
-
@form_parameters = Hash.new
|
19
|
-
end
|
20
|
-
|
21
|
-
def form_parameters
|
22
|
-
comb_parameters(@form_parameters)
|
23
|
-
end
|
24
|
-
|
25
|
-
def requires_signature?
|
26
|
-
@signed == true
|
27
|
-
end
|
28
|
-
|
29
|
-
def require_signature
|
30
|
-
@signed = true
|
31
|
-
end
|
32
|
-
|
33
|
-
def requires_secure_connection?
|
34
|
-
@secure == true
|
35
|
-
end
|
36
|
-
|
37
|
-
def require_secure_connection
|
38
|
-
@secure = true
|
39
|
-
end
|
40
|
-
|
41
|
-
def comb_parameters(parameters)
|
42
|
-
comb_parameter(parameters, :pageSize, [:page_size, :per_page])
|
43
|
-
comb_parameter(parameters, :shopId, :shop_id)
|
44
|
-
comb_parameter(parameters, :imageSize, :image_size)
|
45
|
-
remove_empty_parameters(parameters)
|
46
|
-
parameters
|
47
|
-
end
|
48
|
-
|
49
|
-
def comb_parameter(parameters, correct_name, alternative_names)
|
50
|
-
param_value = nil
|
51
|
-
alternative_names = [alternative_names] unless alternative_names.is_a?(Array)
|
52
|
-
alternative_names.each do |alternative_name|
|
53
|
-
param_value ||= parameters[alternative_name]
|
54
|
-
parameters.delete(alternative_name)
|
55
|
-
end
|
56
|
-
parameters[correct_name] ||= param_value if param_value
|
57
|
-
end
|
58
|
-
|
59
|
-
def remove_empty_parameters(parameters)
|
60
|
-
parameters.delete_if { |key, value| value.nil? }
|
61
|
-
end
|
62
|
-
|
63
|
-
|
64
|
-
end
|
65
|
-
|
1
|
+
module Sevendigital
|
2
|
+
|
3
|
+
#@private
|
4
|
+
#Abstraction of a HTTP API request, ApiOperator uses this ApiRequest to build a real HTTP requests
|
5
|
+
class ApiRequest # :nodoc:
|
6
|
+
|
7
|
+
attr_reader :api_method, :parameters, :signed
|
8
|
+
attr_accessor :token, :api_service, :http_method
|
9
|
+
attr_accessor :signature_scheme
|
10
|
+
attr_writer :form_parameters
|
11
|
+
|
12
|
+
def initialize(http_method, api_method, parameters, options={})
|
13
|
+
@api_method = api_method
|
14
|
+
@parameters = parameters
|
15
|
+
@signature_scheme = :header
|
16
|
+
@http_method = http_method
|
17
|
+
comb_parameters(parameters)
|
18
|
+
@form_parameters = Hash.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def form_parameters
|
22
|
+
comb_parameters(@form_parameters)
|
23
|
+
end
|
24
|
+
|
25
|
+
def requires_signature?
|
26
|
+
@signed == true
|
27
|
+
end
|
28
|
+
|
29
|
+
def require_signature
|
30
|
+
@signed = true
|
31
|
+
end
|
32
|
+
|
33
|
+
def requires_secure_connection?
|
34
|
+
@secure == true
|
35
|
+
end
|
36
|
+
|
37
|
+
def require_secure_connection
|
38
|
+
@secure = true
|
39
|
+
end
|
40
|
+
|
41
|
+
def comb_parameters(parameters)
|
42
|
+
comb_parameter(parameters, :pageSize, [:page_size, :per_page])
|
43
|
+
comb_parameter(parameters, :shopId, :shop_id)
|
44
|
+
comb_parameter(parameters, :imageSize, :image_size)
|
45
|
+
remove_empty_parameters(parameters)
|
46
|
+
parameters
|
47
|
+
end
|
48
|
+
|
49
|
+
def comb_parameter(parameters, correct_name, alternative_names)
|
50
|
+
param_value = nil
|
51
|
+
alternative_names = [alternative_names] unless alternative_names.is_a?(Array)
|
52
|
+
alternative_names.each do |alternative_name|
|
53
|
+
param_value ||= parameters[alternative_name]
|
54
|
+
parameters.delete(alternative_name)
|
55
|
+
end
|
56
|
+
parameters[correct_name] ||= param_value if param_value
|
57
|
+
end
|
58
|
+
|
59
|
+
def remove_empty_parameters(parameters)
|
60
|
+
parameters.delete_if { |key, value| value.nil? }
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
66
|
end
|
data/lib/sevendigital/client.rb
CHANGED
@@ -1,113 +1,113 @@
|
|
1
|
-
module Sevendigital
|
2
|
-
|
3
|
-
class Client
|
4
|
-
|
5
|
-
#if default values for any of these parameters are set in configuration, they will be passed along with every single API request
|
6
|
-
COMMON_REQUEST_PARAMETERS = [:shop_id, :country, :page, :page_size, :image_size]
|
7
|
-
|
8
|
-
def initialize(*args)
|
9
|
-
@configuration = Sevendigital::ClientConfiguration.new(*args)
|
10
|
-
yield @configuration if block_given?
|
11
|
-
@api_operator = hire_api_operator
|
12
|
-
end
|
13
|
-
|
14
|
-
def create_api_request(http_method, api_method, parameters, options = {})
|
15
|
-
parameters = options.merge(parameters)
|
16
|
-
parameters = add_default_parameters(parameters)
|
17
|
-
if http_method != :POST then
|
18
|
-
request = ApiRequest.new(http_method, api_method, parameters)
|
19
|
-
else
|
20
|
-
request = ApiRequest.new(http_method, api_method, {})
|
21
|
-
request.form_parameters = parameters
|
22
|
-
end
|
23
|
-
request
|
24
|
-
end
|
25
|
-
|
26
|
-
def make_api_request(http_method, api_method, parameters, options = {})
|
27
|
-
api_request = create_api_request(http_method, api_method, parameters, options)
|
28
|
-
operator.call_api(api_request)
|
29
|
-
end
|
30
|
-
|
31
|
-
def make_signed_api_request(http_method, api_method, parameters, options = {}, token = nil)
|
32
|
-
api_request = create_api_request(http_method, api_method, parameters, options)
|
33
|
-
api_request.require_signature
|
34
|
-
api_request.require_secure_connection
|
35
|
-
api_request.token = token
|
36
|
-
|
37
|
-
operator.call_api(api_request)
|
38
|
-
end
|
39
|
-
|
40
|
-
def oauth_consumer
|
41
|
-
host, version = api_host_and_version(:account)
|
42
|
-
|
43
|
-
consumer_options = {
|
44
|
-
:authorize_path => "https://#{host}/#{version}/oauth/authorise",
|
45
|
-
:http_method => :get
|
46
|
-
}
|
47
|
-
|
48
|
-
@oauth_consumer ||= OAuth::Consumer.new( \
|
49
|
-
@configuration.oauth_consumer_key, \
|
50
|
-
@configuration.oauth_consumer_secret, \
|
51
|
-
consumer_options \
|
52
|
-
)
|
53
|
-
end
|
54
|
-
|
55
|
-
def configuration
|
56
|
-
return @configuration
|
57
|
-
end
|
58
|
-
|
59
|
-
def operator
|
60
|
-
@api_operator
|
61
|
-
end
|
62
|
-
|
63
|
-
def verbose?
|
64
|
-
!!(@verbose || @configuration.verbose)
|
65
|
-
end
|
66
|
-
|
67
|
-
def very_verbose?
|
68
|
-
verbose? && (@verbose || @configuration.verbose).to_s == "very_verbose"
|
69
|
-
end
|
70
|
-
|
71
|
-
#@private
|
72
|
-
def api_host_and_version(api_service=nil)
|
73
|
-
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)
|
75
|
-
end
|
76
|
-
|
77
|
-
#@private
|
78
|
-
def user_agent_info
|
79
|
-
app_info = @configuration.app_name ? "/#{@configuration.app_name}" : nil
|
80
|
-
app_info += " #{@configuration.app_version}" if app_info && @configuration.app_version
|
81
|
-
"#{Sevendigital::NAME} Gem #{Sevendigital::VERSION}#{app_info}"
|
82
|
-
end
|
83
|
-
|
84
|
-
private
|
85
|
-
|
86
|
-
#@private
|
87
|
-
def default_parameters
|
88
|
-
params = {}
|
89
|
-
COMMON_REQUEST_PARAMETERS.each do |param|
|
90
|
-
value = @configuration.send(param)
|
91
|
-
params[param] = value if value
|
92
|
-
end
|
93
|
-
params
|
94
|
-
end
|
95
|
-
|
96
|
-
#@private
|
97
|
-
def hire_api_operator
|
98
|
-
@configuration.cache ? ApiOperatorCached.new(self, @configuration.cache) : ApiOperator.new(self)
|
99
|
-
end
|
100
|
-
|
101
|
-
#@private
|
102
|
-
def add_default_parameters(parameters)
|
103
|
-
params = parameters
|
104
|
-
default_parameters.each do |name, value|
|
105
|
-
params[name] ||= value
|
106
|
-
end
|
107
|
-
params
|
108
|
-
end
|
109
|
-
|
110
|
-
|
111
|
-
end
|
112
|
-
|
113
|
-
end
|
1
|
+
module Sevendigital
|
2
|
+
|
3
|
+
class Client
|
4
|
+
|
5
|
+
#if default values for any of these parameters are set in configuration, they will be passed along with every single API request
|
6
|
+
COMMON_REQUEST_PARAMETERS = [:shop_id, :country, :page, :page_size, :image_size]
|
7
|
+
|
8
|
+
def initialize(*args)
|
9
|
+
@configuration = Sevendigital::ClientConfiguration.new(*args)
|
10
|
+
yield @configuration if block_given?
|
11
|
+
@api_operator = hire_api_operator
|
12
|
+
end
|
13
|
+
|
14
|
+
def create_api_request(http_method, api_method, parameters, options = {})
|
15
|
+
parameters = options.merge(parameters)
|
16
|
+
parameters = add_default_parameters(parameters)
|
17
|
+
if http_method != :POST then
|
18
|
+
request = ApiRequest.new(http_method, api_method, parameters)
|
19
|
+
else
|
20
|
+
request = ApiRequest.new(http_method, api_method, {})
|
21
|
+
request.form_parameters = parameters
|
22
|
+
end
|
23
|
+
request
|
24
|
+
end
|
25
|
+
|
26
|
+
def make_api_request(http_method, api_method, parameters, options = {})
|
27
|
+
api_request = create_api_request(http_method, api_method, parameters, options)
|
28
|
+
operator.call_api(api_request)
|
29
|
+
end
|
30
|
+
|
31
|
+
def make_signed_api_request(http_method, api_method, parameters, options = {}, token = nil)
|
32
|
+
api_request = create_api_request(http_method, api_method, parameters, options)
|
33
|
+
api_request.require_signature
|
34
|
+
api_request.require_secure_connection
|
35
|
+
api_request.token = token
|
36
|
+
|
37
|
+
operator.call_api(api_request)
|
38
|
+
end
|
39
|
+
|
40
|
+
def oauth_consumer
|
41
|
+
host, version = api_host_and_version(:account)
|
42
|
+
|
43
|
+
consumer_options = {
|
44
|
+
:authorize_path => "https://#{host}/#{version}/oauth/authorise",
|
45
|
+
:http_method => :get
|
46
|
+
}
|
47
|
+
|
48
|
+
@oauth_consumer ||= OAuth::Consumer.new( \
|
49
|
+
@configuration.oauth_consumer_key, \
|
50
|
+
@configuration.oauth_consumer_secret, \
|
51
|
+
consumer_options \
|
52
|
+
)
|
53
|
+
end
|
54
|
+
|
55
|
+
def configuration
|
56
|
+
return @configuration
|
57
|
+
end
|
58
|
+
|
59
|
+
def operator
|
60
|
+
@api_operator
|
61
|
+
end
|
62
|
+
|
63
|
+
def verbose?
|
64
|
+
!!(@verbose || @configuration.verbose)
|
65
|
+
end
|
66
|
+
|
67
|
+
def very_verbose?
|
68
|
+
verbose? && (@verbose || @configuration.verbose).to_s == "very_verbose"
|
69
|
+
end
|
70
|
+
|
71
|
+
#@private
|
72
|
+
def api_host_and_version(api_service=nil)
|
73
|
+
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)
|
75
|
+
end
|
76
|
+
|
77
|
+
#@private
|
78
|
+
def user_agent_info
|
79
|
+
app_info = @configuration.app_name ? "/#{@configuration.app_name}" : nil
|
80
|
+
app_info += " #{@configuration.app_version}" if app_info && @configuration.app_version
|
81
|
+
"#{Sevendigital::NAME} Gem #{Sevendigital::VERSION}#{app_info}"
|
82
|
+
end
|
83
|
+
|
84
|
+
private
|
85
|
+
|
86
|
+
#@private
|
87
|
+
def default_parameters
|
88
|
+
params = {}
|
89
|
+
COMMON_REQUEST_PARAMETERS.each do |param|
|
90
|
+
value = @configuration.send(param)
|
91
|
+
params[param] = value if value
|
92
|
+
end
|
93
|
+
params
|
94
|
+
end
|
95
|
+
|
96
|
+
#@private
|
97
|
+
def hire_api_operator
|
98
|
+
@configuration.cache ? ApiOperatorCached.new(self, @configuration.cache) : ApiOperator.new(self)
|
99
|
+
end
|
100
|
+
|
101
|
+
#@private
|
102
|
+
def add_default_parameters(parameters)
|
103
|
+
params = parameters
|
104
|
+
default_parameters.each do |name, value|
|
105
|
+
params[name] ||= value
|
106
|
+
end
|
107
|
+
params
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
@@ -1,86 +1,86 @@
|
|
1
|
-
require 'ostruct'
|
2
|
-
require 'yaml'
|
3
|
-
|
4
|
-
module Sevendigital
|
5
|
-
|
6
|
-
DEFAULT_CONFIGURATION = {
|
7
|
-
:api_url => "api.7digital.com",
|
8
|
-
:api_version => "1.2",
|
9
|
-
:media_api_url => "media-eu.7digital.com",
|
10
|
-
:media_api_version => "media",
|
11
|
-
:account_api_url => "account.7digital.com",
|
12
|
-
:account_api_version => "web"
|
13
|
-
}.freeze
|
14
|
-
|
15
|
-
class ClientConfiguration < OpenStruct
|
16
|
-
|
17
|
-
def initialize(*args)
|
18
|
-
|
19
|
-
super()
|
20
|
-
|
21
|
-
self.override_with(Sevendigital::DEFAULT_CONFIGURATION)
|
22
|
-
|
23
|
-
self.override_with(default_configuration_file)
|
24
|
-
|
25
|
-
args.each do |configuration_argument|
|
26
|
-
self.override_with(configuration_argument)
|
27
|
-
end
|
28
|
-
#puts "Now: #{self.inspect}"
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
def override_with(configuration)
|
33
|
-
#puts "Now: #{self.inspect}"
|
34
|
-
#puts "Overriding with #{configuration.class}: #{configuration.inspect}"
|
35
|
-
return self unless configuration
|
36
|
-
if configuration.kind_of? Hash then
|
37
|
-
table.merge!(configuration)
|
38
|
-
return self
|
39
|
-
end
|
40
|
-
if configuration.kind_of? OpenStruct then
|
41
|
-
table.merge!(configuration.marshal_dump)
|
42
|
-
return self
|
43
|
-
end
|
44
|
-
if (configuration.kind_of? String) && is_it_yml_file?(configuration) then
|
45
|
-
table.merge!(load_configuration_from_yml(configuration, current_environment))
|
46
|
-
return self
|
47
|
-
end
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
def default_configuration_file
|
52
|
-
return nil unless defined?(
|
53
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
def current_environment
|
57
|
-
defined?(
|
58
|
-
end
|
59
|
-
|
60
|
-
def load_configuration_from_yml(file_name, environment=nil)
|
61
|
-
plain_settings = transform_keys_to_symbols(YAML.load_file(file_name))
|
62
|
-
if (plain_settings[:common] || (environment && plain_settings[environment.to_sym])) then
|
63
|
-
environment_settings = plain_settings[:common] || {}
|
64
|
-
environment_settings.update(plain_settings[environment.to_sym]) if environment
|
65
|
-
environment_settings
|
66
|
-
else
|
67
|
-
plain_settings
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
private
|
72
|
-
|
73
|
-
def is_it_yml_file?(file_name)
|
74
|
-
file_name.include?('.yml')
|
75
|
-
end
|
76
|
-
|
77
|
-
def transform_keys_to_symbols(hash)
|
78
|
-
return hash if not hash.is_a?(Hash)
|
79
|
-
new_hash = hash.inject({}){|memo,(k,v)| memo[k.to_sym] = transform_keys_to_symbols(v); memo}
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
|
84
|
-
end
|
85
|
-
|
86
|
-
end
|
1
|
+
require 'ostruct'
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
module Sevendigital
|
5
|
+
|
6
|
+
DEFAULT_CONFIGURATION = {
|
7
|
+
:api_url => "api.7digital.com",
|
8
|
+
:api_version => "1.2",
|
9
|
+
:media_api_url => "media-eu.7digital.com",
|
10
|
+
:media_api_version => "media",
|
11
|
+
:account_api_url => "account.7digital.com",
|
12
|
+
:account_api_version => "web"
|
13
|
+
}.freeze
|
14
|
+
|
15
|
+
class ClientConfiguration < OpenStruct
|
16
|
+
|
17
|
+
def initialize(*args)
|
18
|
+
|
19
|
+
super()
|
20
|
+
|
21
|
+
self.override_with(Sevendigital::DEFAULT_CONFIGURATION)
|
22
|
+
|
23
|
+
self.override_with(default_configuration_file)
|
24
|
+
|
25
|
+
args.each do |configuration_argument|
|
26
|
+
self.override_with(configuration_argument)
|
27
|
+
end
|
28
|
+
#puts "Now: #{self.inspect}"
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
def override_with(configuration)
|
33
|
+
#puts "Now: #{self.inspect}"
|
34
|
+
#puts "Overriding with #{configuration.class}: #{configuration.inspect}"
|
35
|
+
return self unless configuration
|
36
|
+
if configuration.kind_of? Hash then
|
37
|
+
table.merge!(configuration)
|
38
|
+
return self
|
39
|
+
end
|
40
|
+
if configuration.kind_of? OpenStruct then
|
41
|
+
table.merge!(configuration.marshal_dump)
|
42
|
+
return self
|
43
|
+
end
|
44
|
+
if (configuration.kind_of? String) && is_it_yml_file?(configuration) then
|
45
|
+
table.merge!(load_configuration_from_yml(configuration, current_environment))
|
46
|
+
return self
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
def default_configuration_file
|
52
|
+
return nil unless defined?(Rails.root)
|
53
|
+
Rails.root.join('config', 'sevendigital.yml').to_s
|
54
|
+
end
|
55
|
+
|
56
|
+
def current_environment
|
57
|
+
defined?(Rails.env) ? Rails.env : nil
|
58
|
+
end
|
59
|
+
|
60
|
+
def load_configuration_from_yml(file_name, environment=nil)
|
61
|
+
plain_settings = transform_keys_to_symbols(YAML.load_file(file_name))
|
62
|
+
if (plain_settings[:common] || (environment && plain_settings[environment.to_sym])) then
|
63
|
+
environment_settings = plain_settings[:common] || {}
|
64
|
+
environment_settings.update(plain_settings[environment.to_sym]) if environment
|
65
|
+
environment_settings
|
66
|
+
else
|
67
|
+
plain_settings
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
def is_it_yml_file?(file_name)
|
74
|
+
file_name.include?('.yml')
|
75
|
+
end
|
76
|
+
|
77
|
+
def transform_keys_to_symbols(hash)
|
78
|
+
return hash if not hash.is_a?(Hash)
|
79
|
+
new_hash = hash.inject({}){|memo,(k,v)| memo[k.to_sym] = transform_keys_to_symbols(v); memo}
|
80
|
+
new_hash
|
81
|
+
end
|
82
|
+
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|