awis-sdk-ruby 1.0.0 → 1.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.
- checksums.yaml +7 -0
- data/.gitignore +2 -1
- data/.rubocop.yml +87 -0
- data/Gemfile +5 -3
- data/Rakefile +7 -5
- data/awis.gemspec +20 -17
- data/bin/console +4 -3
- data/lib/awis.rb +18 -20
- data/lib/awis/api.rb +8 -6
- data/lib/awis/api/base.rb +3 -1
- data/lib/awis/api/category_browse.rb +10 -7
- data/lib/awis/api/category_listings.rb +15 -12
- data/lib/awis/api/sites_linking_in.rb +10 -7
- data/lib/awis/api/traffic_history.rb +12 -9
- data/lib/awis/api/url_info.rb +11 -5
- data/lib/awis/client.rb +9 -6
- data/lib/awis/config.rb +3 -1
- data/lib/awis/connection.rb +87 -13
- data/lib/awis/exceptions.rb +3 -1
- data/lib/awis/hash.rb +2 -0
- data/lib/awis/models.rb +9 -7
- data/lib/awis/models/base.rb +4 -2
- data/lib/awis/models/base_entity.rb +2 -0
- data/lib/awis/models/category_browse.rb +14 -2
- data/lib/awis/models/category_listings.rb +4 -2
- data/lib/awis/models/sites_linking_in.rb +4 -2
- data/lib/awis/models/traffic_history.rb +10 -2
- data/lib/awis/models/url_info.rb +9 -7
- data/lib/awis/utils.rb +5 -4
- data/lib/awis/utils/extra.rb +3 -1
- data/lib/awis/utils/hash.rb +2 -0
- data/lib/awis/utils/variable.rb +3 -1
- data/lib/awis/utils/xml.rb +3 -1
- data/lib/awis/version.rb +3 -1
- metadata +57 -46
- data/lib/awis/utils/request.rb +0 -153
data/lib/awis/utils/extra.rb
CHANGED
data/lib/awis/utils/hash.rb
CHANGED
data/lib/awis/utils/variable.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Awis
|
2
4
|
module Utils
|
3
5
|
module Variable
|
4
6
|
def custom_instance_variables(options)
|
5
7
|
options.each do |key, value|
|
6
|
-
value =
|
8
|
+
value = value.class == String && value.empty? ? nil : value
|
7
9
|
|
8
10
|
instance_variable_set("@#{key}", value)
|
9
11
|
end
|
data/lib/awis/utils/xml.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Awis
|
2
4
|
module Utils
|
3
5
|
class XML
|
@@ -11,7 +13,7 @@ module Awis
|
|
11
13
|
|
12
14
|
reader.each do |node|
|
13
15
|
if node.node_type == Nokogiri::XML::Reader::TYPE_ELEMENT
|
14
|
-
if attributes_in_path && node.attributes.
|
16
|
+
if attributes_in_path && !node.attributes.empty?
|
15
17
|
attributes = []
|
16
18
|
|
17
19
|
node.attributes.sort.each do |name, value|
|
data/lib/awis/version.rb
CHANGED
metadata
CHANGED
@@ -1,110 +1,125 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: awis-sdk-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.1.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Encore Shao
|
9
8
|
autorequire:
|
10
9
|
bindir: exe
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2018-10-02 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: aws-sigv4
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
14
27
|
- !ruby/object:Gem::Dependency
|
15
28
|
name: multi_xml
|
16
29
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
30
|
requirements:
|
19
|
-
- -
|
31
|
+
- - ">="
|
20
32
|
- !ruby/object:Gem::Version
|
21
|
-
version: 0
|
33
|
+
version: '0'
|
22
34
|
type: :runtime
|
23
35
|
prerelease: false
|
24
36
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
37
|
requirements:
|
27
|
-
- -
|
38
|
+
- - ">="
|
28
39
|
- !ruby/object:Gem::Version
|
29
|
-
version: 0
|
40
|
+
version: '0'
|
30
41
|
- !ruby/object:Gem::Dependency
|
31
42
|
name: nokogiri
|
32
43
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
44
|
requirements:
|
35
|
-
- -
|
45
|
+
- - ">="
|
36
46
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
47
|
+
version: '0'
|
38
48
|
type: :runtime
|
39
49
|
prerelease: false
|
40
50
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
51
|
requirements:
|
43
|
-
- -
|
52
|
+
- - ">="
|
44
53
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
54
|
+
version: '0'
|
46
55
|
- !ruby/object:Gem::Dependency
|
47
56
|
name: minitest
|
48
57
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
58
|
requirements:
|
51
|
-
- -
|
59
|
+
- - ">="
|
52
60
|
- !ruby/object:Gem::Version
|
53
61
|
version: '0'
|
54
62
|
type: :development
|
55
63
|
prerelease: false
|
56
64
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
65
|
requirements:
|
59
|
-
- -
|
66
|
+
- - ">="
|
60
67
|
- !ruby/object:Gem::Version
|
61
68
|
version: '0'
|
62
69
|
- !ruby/object:Gem::Dependency
|
63
70
|
name: mocha
|
64
71
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
72
|
requirements:
|
67
|
-
- -
|
73
|
+
- - ">="
|
68
74
|
- !ruby/object:Gem::Version
|
69
75
|
version: '0'
|
70
76
|
type: :development
|
71
77
|
prerelease: false
|
72
78
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
79
|
requirements:
|
75
|
-
- -
|
80
|
+
- - ">="
|
76
81
|
- !ruby/object:Gem::Version
|
77
82
|
version: '0'
|
78
83
|
- !ruby/object:Gem::Dependency
|
79
|
-
name:
|
84
|
+
name: pry
|
80
85
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
86
|
requirements:
|
83
|
-
- -
|
87
|
+
- - ">="
|
84
88
|
- !ruby/object:Gem::Version
|
85
89
|
version: '0'
|
86
90
|
type: :development
|
87
91
|
prerelease: false
|
88
92
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
93
|
requirements:
|
91
|
-
- -
|
94
|
+
- - ">="
|
92
95
|
- !ruby/object:Gem::Version
|
93
96
|
version: '0'
|
94
97
|
- !ruby/object:Gem::Dependency
|
95
|
-
name:
|
98
|
+
name: rubocop
|
96
99
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
100
|
requirements:
|
99
|
-
- -
|
101
|
+
- - ">="
|
100
102
|
- !ruby/object:Gem::Version
|
101
103
|
version: '0'
|
102
104
|
type: :development
|
103
105
|
prerelease: false
|
104
106
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
107
|
requirements:
|
107
|
-
- -
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: webmock
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
108
123
|
- !ruby/object:Gem::Version
|
109
124
|
version: '0'
|
110
125
|
description: Ruby - Amazon Alexa Web Information Service Library (AWIS)
|
@@ -114,8 +129,9 @@ executables: []
|
|
114
129
|
extensions: []
|
115
130
|
extra_rdoc_files: []
|
116
131
|
files:
|
117
|
-
- .gitignore
|
118
|
-
- .
|
132
|
+
- ".gitignore"
|
133
|
+
- ".rubocop.yml"
|
134
|
+
- ".travis.yml"
|
119
135
|
- Gemfile
|
120
136
|
- README.md
|
121
137
|
- Rakefile
|
@@ -146,35 +162,30 @@ files:
|
|
146
162
|
- lib/awis/utils.rb
|
147
163
|
- lib/awis/utils/extra.rb
|
148
164
|
- lib/awis/utils/hash.rb
|
149
|
-
- lib/awis/utils/request.rb
|
150
165
|
- lib/awis/utils/variable.rb
|
151
166
|
- lib/awis/utils/xml.rb
|
152
167
|
- lib/awis/version.rb
|
153
168
|
homepage: https://github.com/encoreshao/amazon-awis
|
154
169
|
licenses: []
|
170
|
+
metadata: {}
|
155
171
|
post_install_message:
|
156
172
|
rdoc_options: []
|
157
173
|
require_paths:
|
158
174
|
- lib
|
159
175
|
required_ruby_version: !ruby/object:Gem::Requirement
|
160
|
-
none: false
|
161
176
|
requirements:
|
162
|
-
- -
|
177
|
+
- - ">="
|
163
178
|
- !ruby/object:Gem::Version
|
164
|
-
version:
|
179
|
+
version: '0'
|
165
180
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
166
|
-
none: false
|
167
181
|
requirements:
|
168
|
-
- -
|
182
|
+
- - ">="
|
169
183
|
- !ruby/object:Gem::Version
|
170
184
|
version: '0'
|
171
|
-
segments:
|
172
|
-
- 0
|
173
|
-
hash: -1995395337547775
|
174
185
|
requirements: []
|
175
186
|
rubyforge_project:
|
176
|
-
rubygems_version:
|
187
|
+
rubygems_version: 2.6.11
|
177
188
|
signing_key:
|
178
|
-
specification_version:
|
189
|
+
specification_version: 4
|
179
190
|
summary: Ruby - Amazon Alexa Web Information Service Library (AWIS)
|
180
191
|
test_files: []
|
data/lib/awis/utils/request.rb
DELETED
@@ -1,153 +0,0 @@
|
|
1
|
-
require "cgi"
|
2
|
-
require "base64"
|
3
|
-
require "openssl"
|
4
|
-
require "uri"
|
5
|
-
require "net/https"
|
6
|
-
require "time"
|
7
|
-
require 'pry'
|
8
|
-
|
9
|
-
module Awis
|
10
|
-
module Utils
|
11
|
-
module Request
|
12
|
-
def signature_key(key, date_stamp, region_name, service_name)
|
13
|
-
kDate = openssl_hmac_digest(encryption_method, aws4 + key, date_stamp)
|
14
|
-
kRegion = openssl_hmac_digest(encryption_method, kDate, region_name)
|
15
|
-
kService = openssl_hmac_digest(encryption_method, kRegion, service_name)
|
16
|
-
kSigning = openssl_hmac_digest(encryption_method, kService, aws4_request)
|
17
|
-
kSigning
|
18
|
-
end
|
19
|
-
|
20
|
-
# escape str to RFC 3986
|
21
|
-
def escapeRFC3986(str)
|
22
|
-
URI.escape(str, /[^A-Za-z0-9\-_.~]/)
|
23
|
-
end
|
24
|
-
|
25
|
-
def timestamp
|
26
|
-
Time::now.utc.strftime("%Y%m%dT%H%M%SZ")
|
27
|
-
end
|
28
|
-
|
29
|
-
def datestamp
|
30
|
-
Time::now.utc.strftime("%Y%m%d")
|
31
|
-
end
|
32
|
-
|
33
|
-
def headers
|
34
|
-
{
|
35
|
-
"host" => Awis::SERVICE_ENDPOINT,
|
36
|
-
"x-amz-date" => timestamp
|
37
|
-
}
|
38
|
-
end
|
39
|
-
|
40
|
-
def query_str
|
41
|
-
params.sort.map{|k,v| k + "=" + escapeRFC3986(v.to_s())}.join('&')
|
42
|
-
end
|
43
|
-
|
44
|
-
def headers_str
|
45
|
-
headers.sort.map{|k,v| k + ":" + v}.join("\n") + "\n"
|
46
|
-
end
|
47
|
-
|
48
|
-
def headers_lst
|
49
|
-
headers.sort.map{|k,v| k}.join(";")
|
50
|
-
end
|
51
|
-
|
52
|
-
def payload_hash
|
53
|
-
digest_sha256_hexdigest ""
|
54
|
-
end
|
55
|
-
|
56
|
-
def canonical_request
|
57
|
-
"GET" + "\n" + Awis::SERVICE_URI + "\n" + query_str + "\n" + headers_str + "\n" + headers_lst + "\n" + payload_hash
|
58
|
-
end
|
59
|
-
|
60
|
-
def algorithm
|
61
|
-
"AWS4-HMAC-SHA256"
|
62
|
-
end
|
63
|
-
|
64
|
-
def credential_scope
|
65
|
-
datestamp + "/" + Awis::SERVICE_REGION + "/" + Awis::SERVICE_NAME + "/" + aws4_request
|
66
|
-
end
|
67
|
-
|
68
|
-
def string_to_sign
|
69
|
-
algorithm + "\n" + timestamp + "\n" + credential_scope + "\n" + digest_sha256_hexdigest(canonical_request)
|
70
|
-
end
|
71
|
-
|
72
|
-
def signing_key
|
73
|
-
signature_key(Awis.config.secret_access_key, datestamp, Awis::SERVICE_REGION, Awis::SERVICE_NAME)
|
74
|
-
end
|
75
|
-
|
76
|
-
def signature
|
77
|
-
OpenSSL::HMAC.hexdigest(encryption_method, signing_key, string_to_sign)
|
78
|
-
end
|
79
|
-
|
80
|
-
def authorization_header
|
81
|
-
algorithm + " " +
|
82
|
-
"Credential=" + Awis.config.access_key_id + "/" + credential_scope + ", " +
|
83
|
-
"SignedHeaders=" + headers_lst + ", " +
|
84
|
-
"Signature=" + signature;
|
85
|
-
end
|
86
|
-
|
87
|
-
def uri
|
88
|
-
URI(url + url_params)
|
89
|
-
end
|
90
|
-
|
91
|
-
def request
|
92
|
-
req = Net::HTTP::Get.new(uri.to_s)
|
93
|
-
req["Accept"] = "application/xml"
|
94
|
-
req["Content-Type"] = "application/xml"
|
95
|
-
req["x-amz-date"] = timestamp
|
96
|
-
req["Authorization"] = authorization_header
|
97
|
-
|
98
|
-
response = Net::HTTP.start(uri.host, uri.port,
|
99
|
-
use_ssl: uri.scheme == 'https',
|
100
|
-
ssl_timeout: @timeout,
|
101
|
-
open_timeout: @open_timeout) { |http|
|
102
|
-
http.request(req)
|
103
|
-
}
|
104
|
-
|
105
|
-
response
|
106
|
-
end
|
107
|
-
|
108
|
-
def handle_response(response)
|
109
|
-
case response.code.to_i
|
110
|
-
when 200...300
|
111
|
-
response
|
112
|
-
when 300...600
|
113
|
-
if response.body.nil?
|
114
|
-
raise ResponseError.new(nil, response)
|
115
|
-
else
|
116
|
-
error_message = MultiXml.parse(response.body).deep_find('ErrorCode')
|
117
|
-
raise ResponseError.new(error_message, response)
|
118
|
-
end
|
119
|
-
else
|
120
|
-
raise ResponseError.new("Unknown code: #{respnse.code}", response)
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
def aws4
|
125
|
-
"AWS4"
|
126
|
-
end
|
127
|
-
|
128
|
-
def aws4_request
|
129
|
-
"aws4_request"
|
130
|
-
end
|
131
|
-
|
132
|
-
def encryption_method
|
133
|
-
'sha256'
|
134
|
-
end
|
135
|
-
|
136
|
-
def url
|
137
|
-
protocol + '://' + Awis::SERVICE_HOST + Awis::SERVICE_URI
|
138
|
-
end
|
139
|
-
|
140
|
-
def url_params
|
141
|
-
'?' + query_str
|
142
|
-
end
|
143
|
-
|
144
|
-
def openssl_hmac_digest(method, key, secret)
|
145
|
-
OpenSSL::HMAC.digest(method, key, secret)
|
146
|
-
end
|
147
|
-
|
148
|
-
def digest_sha256_hexdigest(key)
|
149
|
-
Digest::SHA256.hexdigest key
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|