awis-sdk-ruby 1.1.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rubocop.yml +1 -1
- data/.travis.yml +0 -1
- data/README.md +96 -35
- data/awis.gemspec +1 -3
- data/lib/awis.rb +10 -10
- data/lib/awis/api.rb +7 -0
- data/lib/awis/api/base.rb +2 -2
- data/lib/awis/api/traffic_history.rb +1 -1
- data/lib/awis/client.rb +7 -12
- data/lib/awis/connection.rb +14 -7
- data/lib/awis/models.rb +8 -0
- data/lib/awis/models/base.rb +23 -0
- data/lib/awis/models/category_browse.rb +1 -1
- data/lib/awis/models/category_listings.rb +2 -1
- data/lib/awis/models/sites_linking_in.rb +2 -1
- data/lib/awis/models/traffic_history.rb +2 -1
- data/lib/awis/models/url_info.rb +219 -55
- data/lib/awis/utils.rb +3 -2
- data/lib/awis/utils/xml.rb +2 -0
- data/lib/awis/version.rb +1 -1
- metadata +6 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c1b8b0369cacf309ffff5b752c458d3465ef51b7b085fd9c55fce22f8651807d
|
4
|
+
data.tar.gz: a78a3affebba1ae56d03b0db2173044e29ae5139d02a8ea3051ba5a0b0708c13
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7229cf7a29ab8992f30e9aef6e51471250de75a7830a1021b4df1fb6d00ce5009fbf2b2410f9cb7903dfb580cda97b73b3f0080f49023d9bfac09a252eaa7c11
|
7
|
+
data.tar.gz: 503f910fbb860e7aab95022c0559a5c36418ddbd602e06cd6009dc07c305364075ef7b6e97987be08627773387add3f2be9710ed0bd48cb4921b7ee5754da4cd
|
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,63 +1,116 @@
|
|
1
1
|
## Amazon - Alexa Web Information Service (AWIS)
|
2
|
-
Ruby Library for AWIS REST API -
|
2
|
+
Ruby Library for AWIS REST API - see: [Alexa Docs](http://docs.amazonwebservices.com/AlexaWebInfoService/latest/)
|
3
3
|
|
4
4
|
### How to installation
|
5
5
|
|
6
|
-
```
|
6
|
+
```ruby
|
7
7
|
gem install awis-sdk-ruby
|
8
8
|
```
|
9
9
|
|
10
|
+
### Support Ruby 2.x
|
11
|
+
|
12
|
+
- The latest update requires Ruby 2.0 or higher
|
13
|
+
|
10
14
|
### How to usage
|
11
15
|
|
12
16
|
##### Configure your amazon certificate
|
13
17
|
|
14
|
-
```
|
18
|
+
```ruby
|
15
19
|
require 'awis'
|
16
20
|
|
17
21
|
AWIS_CONFIG = YAML.load(File.read('awis.yml'))
|
18
22
|
Awis.config do |c|
|
19
|
-
c.access_key_id
|
20
|
-
c.secret_access_key
|
21
|
-
c.debug
|
22
|
-
c.protocol
|
23
|
-
c.timeout
|
24
|
-
c.open_timeout
|
25
|
-
c.logger
|
23
|
+
c.access_key_id = AWIS_CONFIG['access_key_id']
|
24
|
+
c.secret_access_key = AWIS_CONFIG['secret_access_key']
|
25
|
+
c.debug = AWIS_CONFIG['debug']
|
26
|
+
c.protocol = 'https' # Default 'https'
|
27
|
+
c.timeout = 10 # Default 10
|
28
|
+
c.open_timeout = 10 # Default 10
|
29
|
+
c.logger = false # Default nil
|
26
30
|
end
|
27
31
|
```
|
28
32
|
|
29
|
-
##### Get
|
33
|
+
##### Get Url Info
|
30
34
|
|
31
|
-
```
|
35
|
+
```ruby
|
32
36
|
client = Awis::Client.new
|
33
37
|
url_info = client.url_info(url: "site.com")
|
34
38
|
```
|
35
39
|
|
36
40
|
If you looking for the API request URI:
|
37
41
|
|
38
|
-
|
39
|
-
|
42
|
+
```ruby
|
43
|
+
Awis::API::UrlInfo.new.load_request_uri(url: 'site.com')
|
44
|
+
```
|
40
45
|
|
41
|
-
|
46
|
+
returns object that contains attributes:
|
42
47
|
|
43
48
|
* data_url
|
44
49
|
* rank
|
45
50
|
* asin
|
46
|
-
|
47
|
-
Returns object that contains relationships:
|
48
|
-
|
49
|
-
* contact_info [:data_url, :owner_name, :email, :physical_address, :company_stock_ticker, :phone_numbers]
|
50
|
-
* content_data [:data_url, :site_title, :site_description, :speed_median_load_time, :speed_percentile, :adult_content, :language_locale, :links_in_count, :owned_domains]
|
51
|
-
* usage_statistics [:time_range_months, :time_range_days, :rank_value, :rank_delta, :reach_rank_value, :reach_rank_delta,
|
52
|
-
:reach_per_million_value, :reach_per_million_delta, :reach_page_views_per_million_value, :reach_page_views_per_million_delta,
|
53
|
-
:reach_page_views_rank_value, :reach_page_views_rank_delta, :reach_page_views_per_user_value, :reach_page_views_per_user_delta]
|
54
|
-
- add two methods: [range_type, range_count]
|
55
|
-
* related_links [:data_url, :navigable_url, :title]
|
56
|
-
* categories [:title, :absolute_path]
|
51
|
+
* xml
|
57
52
|
|
58
53
|
New methods:
|
59
54
|
|
60
55
|
* is_404?
|
56
|
+
* not_found?
|
57
|
+
* pretty_xml
|
58
|
+
|
59
|
+
`pretty_xml` method will easily to review the XML response from the terminal
|
60
|
+
|
61
|
+
returns object that contains relationships:
|
62
|
+
|
63
|
+
**contact_info**
|
64
|
+
- attrubutes
|
65
|
+
- data_url
|
66
|
+
- owner_name
|
67
|
+
- email
|
68
|
+
- physical_address
|
69
|
+
- company_stock_ticker
|
70
|
+
- phone_numbers
|
71
|
+
|
72
|
+
**content_data**
|
73
|
+
- attrubutes
|
74
|
+
- data_url
|
75
|
+
- site_title
|
76
|
+
- site_description
|
77
|
+
- speed_median_load_time
|
78
|
+
- speed_percentile
|
79
|
+
- adult_content
|
80
|
+
- language_locale
|
81
|
+
- links_in_count
|
82
|
+
- owned_domains
|
83
|
+
|
84
|
+
**usage_statistics**
|
85
|
+
- attrubutes
|
86
|
+
- time_range_months
|
87
|
+
- time_range_days
|
88
|
+
- rank_value
|
89
|
+
- rank_delta
|
90
|
+
- reach_rank_value
|
91
|
+
- reach_rank_delta,
|
92
|
+
- reach_per_million_value
|
93
|
+
- reach_per_million_delta
|
94
|
+
- page_views_per_million_value
|
95
|
+
- page_views_per_million_delta,
|
96
|
+
- page_views_rank_value
|
97
|
+
- page_views_rank_delta
|
98
|
+
- page_views_per_user_value
|
99
|
+
- page_views_per_user_delta
|
100
|
+
- Methods:
|
101
|
+
- range_type
|
102
|
+
- range_count
|
103
|
+
|
104
|
+
**related_links**
|
105
|
+
- attrubutes
|
106
|
+
- data_url
|
107
|
+
- navigable_url
|
108
|
+
- title
|
109
|
+
|
110
|
+
**categories**
|
111
|
+
- attrubutes
|
112
|
+
- title
|
113
|
+
- absolute_path
|
61
114
|
|
62
115
|
You can specify options:
|
63
116
|
|
@@ -66,14 +119,16 @@ You can specify options:
|
|
66
119
|
|
67
120
|
##### Get Sites Linking In
|
68
121
|
|
69
|
-
```
|
122
|
+
```ruby
|
70
123
|
client = Awis::Client.new
|
71
124
|
sites_linking_in = client.sites_linking_in(url: "site.com")
|
72
125
|
```
|
73
126
|
|
74
127
|
If you looking for the API request URI:
|
75
128
|
|
76
|
-
|
129
|
+
```ruby
|
130
|
+
Awis::API::SitesLinkingIn.new.load_request_uri(url: 'site.com')
|
131
|
+
```
|
77
132
|
|
78
133
|
Returns object that contains relationships:
|
79
134
|
|
@@ -87,14 +142,16 @@ You can specify options:
|
|
87
142
|
|
88
143
|
##### Get Traffic History
|
89
144
|
|
90
|
-
```
|
145
|
+
```ruby
|
91
146
|
client = Awis::Client.new
|
92
147
|
traffic_history = client.traffic_history(url: "site.com")
|
93
148
|
```
|
94
149
|
|
95
150
|
If you looking for the API request URI:
|
96
151
|
|
97
|
-
|
152
|
+
```ruby
|
153
|
+
Awis::API::TrafficHistory.new.load_request_uri(url: 'site.com')
|
154
|
+
```
|
98
155
|
|
99
156
|
Returns object that contains methods:
|
100
157
|
|
@@ -114,14 +171,16 @@ You can specify options:
|
|
114
171
|
|
115
172
|
##### Get Category Listings
|
116
173
|
|
117
|
-
```
|
174
|
+
```ruby
|
118
175
|
client = Awis::Client.new
|
119
176
|
category_listings = client.category_listings(path: "Top/Arts")
|
120
177
|
```
|
121
178
|
|
122
179
|
If you looking for the API request URI:
|
123
180
|
|
124
|
-
|
181
|
+
```ruby
|
182
|
+
Awis::API::CategoryListings.new.load_request_uri(path: "Top/Games/Card_Games")
|
183
|
+
```
|
125
184
|
|
126
185
|
Returns object that contains methods:
|
127
186
|
|
@@ -134,14 +193,16 @@ Returns object that contains relationships:
|
|
134
193
|
|
135
194
|
##### Get Category Browse
|
136
195
|
|
137
|
-
```
|
196
|
+
```ruby
|
138
197
|
client = Awis::Client.new
|
139
198
|
category_browses = client.category_browse(path: "Top/Arts")
|
140
199
|
```
|
141
200
|
|
142
201
|
If you looking for the API request URI:
|
143
202
|
|
144
|
-
|
203
|
+
```ruby
|
204
|
+
Awis::API::CategoryBrowse.new.load_request_uri(path: "Top/Games/Card_Games")
|
205
|
+
```
|
145
206
|
|
146
207
|
Returns object that contains methods:
|
147
208
|
|
@@ -156,7 +217,7 @@ Returns object that contains relationships:
|
|
156
217
|
|
157
218
|
##### How to run test
|
158
219
|
|
159
|
-
* rake test
|
220
|
+
* bundle exec rake test
|
160
221
|
|
161
222
|
##### Request ID and Status Code
|
162
223
|
|
data/awis.gemspec
CHANGED
data/lib/awis.rb
CHANGED
@@ -4,19 +4,19 @@ require 'multi_xml'
|
|
4
4
|
require 'nokogiri'
|
5
5
|
require 'aws-sigv4'
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
7
|
+
require_relative './awis/version'
|
8
|
+
require_relative './awis/hash'
|
9
|
+
require_relative './awis/utils'
|
10
|
+
require_relative './awis/exceptions'
|
11
|
+
require_relative './awis/connection'
|
12
|
+
require_relative './awis/config'
|
13
|
+
require_relative './awis/client'
|
14
|
+
require_relative './awis/api'
|
15
|
+
require_relative './awis/models'
|
16
16
|
|
17
17
|
module Awis
|
18
18
|
SERVICE_PATH = 'api'
|
19
19
|
SERVICE_NAME = 'awis'
|
20
20
|
SERVICE_REGION = 'us-west-1'
|
21
|
-
SERVICE_HOST = "#{SERVICE_NAME}.amazonaws.com"
|
21
|
+
SERVICE_HOST = "#{SERVICE_NAME}.#{SERVICE_REGION}.amazonaws.com"
|
22
22
|
end
|
data/lib/awis/api.rb
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative './api/base'
|
4
|
+
require_relative './api/url_info'
|
5
|
+
require_relative './api/traffic_history'
|
6
|
+
require_relative './api/sites_linking_in'
|
7
|
+
require_relative './api/category_listings'
|
8
|
+
require_relative './api/category_browse'
|
9
|
+
|
3
10
|
module Awis
|
4
11
|
module API
|
5
12
|
autoload :Base, 'awis/api/base'
|
data/lib/awis/api/base.rb
CHANGED
@@ -28,7 +28,7 @@ module Awis
|
|
28
28
|
|
29
29
|
@arguments = arguments
|
30
30
|
@arguments[:range] = arguments.fetch(:range, 31)
|
31
|
-
@arguments[:start] = arguments.fetch(:start) { Time.
|
31
|
+
@arguments[:start] = arguments.fetch(:start) { Time.now - (3600 * 24 * @arguments[:range].to_i) }
|
32
32
|
end
|
33
33
|
|
34
34
|
def start_date
|
data/lib/awis/client.rb
CHANGED
@@ -29,18 +29,13 @@ module Awis
|
|
29
29
|
private
|
30
30
|
|
31
31
|
def parse_response_with_request(kclass, args)
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
when 'CategoryBrowse'
|
40
|
-
Models::CategoryBrowse.new API::CategoryBrowse.new.fetch(args)
|
41
|
-
when 'CategoryListings'
|
42
|
-
Models::CategoryListings.new API::CategoryListings.new.fetch(args)
|
43
|
-
end
|
32
|
+
raise ArgumentError, 'Amazon class was missing!' unless [
|
33
|
+
'UrlInfo', 'SitesLinkingIn', 'TrafficHistory',
|
34
|
+
'CategoryBrowse', 'CategoryListings'
|
35
|
+
].include?(kclass)
|
36
|
+
|
37
|
+
response = Kernel.const_get("Awis::API::#{kclass}").new.fetch(args)
|
38
|
+
Kernel.const_get("Awis::Models::#{kclass}").new(response)
|
44
39
|
end
|
45
40
|
end
|
46
41
|
end
|
data/lib/awis/connection.rb
CHANGED
@@ -10,14 +10,14 @@ module Awis
|
|
10
10
|
attr_reader :params, :secret_access_key, :access_key_id
|
11
11
|
|
12
12
|
HEADERS = {
|
13
|
-
'
|
14
|
-
'
|
15
|
-
'
|
13
|
+
'accept' => 'application/xml',
|
14
|
+
'content-type' => 'application/xml',
|
15
|
+
'user-agent' => "awis-sdk-ruby v#{Awis::VERSION}"
|
16
16
|
}.freeze
|
17
17
|
|
18
18
|
def initialize(options = {})
|
19
|
-
@secret_access_key = options.fetch(:secret_access_key, Awis.config.
|
20
|
-
@access_key_id = options.fetch(:access_key_id, Awis.config.
|
19
|
+
@secret_access_key = options.fetch(:secret_access_key, Awis.config.secret_access_key)
|
20
|
+
@access_key_id = options.fetch(:access_key_id, Awis.config.access_key_id)
|
21
21
|
raise CertificateError, 'Amazon access certificate is missing!' if @secret_access_key.nil? || @access_key_id.nil?
|
22
22
|
|
23
23
|
setup_options!
|
@@ -31,13 +31,20 @@ module Awis
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def get(params = {})
|
34
|
+
set_params(params)
|
35
|
+
|
36
|
+
handle_response(request).body
|
37
|
+
end
|
38
|
+
|
39
|
+
def set_params(params)
|
34
40
|
@params = params
|
35
|
-
handle_response(request).body.force_encoding(Encoding::UTF_8)
|
36
41
|
end
|
37
42
|
|
38
43
|
private
|
39
44
|
|
40
45
|
def handle_response(response)
|
46
|
+
puts ['URI ', response.uri].join if debug
|
47
|
+
|
41
48
|
case response
|
42
49
|
when Net::HTTPSuccess
|
43
50
|
response
|
@@ -77,7 +84,7 @@ module Awis
|
|
77
84
|
end
|
78
85
|
|
79
86
|
def uri
|
80
|
-
@uri ||= URI.parse("#{protocol}://#{Awis::SERVICE_HOST}/#{Awis::SERVICE_PATH}
|
87
|
+
@uri ||= URI.parse("#{protocol}://#{Awis::SERVICE_HOST}/#{Awis::SERVICE_PATH}?#{query}")
|
81
88
|
end
|
82
89
|
|
83
90
|
def headers
|
data/lib/awis/models.rb
CHANGED
@@ -1,5 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative './models/base'
|
4
|
+
require_relative './models/base_entity'
|
5
|
+
require_relative './models/url_info'
|
6
|
+
require_relative './models/traffic_history'
|
7
|
+
require_relative './models/sites_linking_in'
|
8
|
+
require_relative './models/category_listings'
|
9
|
+
require_relative './models/category_browse'
|
10
|
+
|
3
11
|
module Awis
|
4
12
|
module Models
|
5
13
|
autoload :Base, 'awis/models/base'
|
data/lib/awis/models/base.rb
CHANGED
@@ -5,6 +5,14 @@ module Awis
|
|
5
5
|
class Base
|
6
6
|
attr_accessor :response, :status_code, :request_id
|
7
7
|
|
8
|
+
def initialize(response)
|
9
|
+
response_data = loading_response(response)
|
10
|
+
|
11
|
+
set_xml(response_data)
|
12
|
+
# Need to implement on sub-class
|
13
|
+
setup_data!(response_data)
|
14
|
+
end
|
15
|
+
|
8
16
|
def loading_response(response)
|
9
17
|
Awis::Utils::XML.new(response.response_body)
|
10
18
|
end
|
@@ -27,6 +35,21 @@ module Awis
|
|
27
35
|
def success?
|
28
36
|
status_code == 'Success'
|
29
37
|
end
|
38
|
+
|
39
|
+
def pretty_xml
|
40
|
+
doc = Nokogiri.XML(@xml.data) do |config|
|
41
|
+
config.default_xml.noblanks
|
42
|
+
end
|
43
|
+
puts doc.to_xml(:indent => 2)
|
44
|
+
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def set_xml(response)
|
51
|
+
@xml = response
|
52
|
+
end
|
30
53
|
end
|
31
54
|
end
|
32
55
|
end
|
data/lib/awis/models/url_info.rb
CHANGED
@@ -3,14 +3,17 @@
|
|
3
3
|
module Awis
|
4
4
|
module Models
|
5
5
|
class UrlInfo < Base
|
6
|
-
attr_accessor :data_url, :rank, :asin, :contact_info, :content_data, :usage_statistics, :related_links,
|
6
|
+
attr_accessor :data_url, :rank, :asin, :contact_info, :content_data, :usage_statistics, :related_links,
|
7
|
+
:categories, :contributing_subdomains, :rank_by_country
|
7
8
|
|
8
9
|
def initialize(response)
|
9
10
|
@usage_statistics = []
|
10
11
|
@related_links = []
|
11
12
|
@categories = []
|
13
|
+
@contributing_subdomains = []
|
14
|
+
@rank_by_country = []
|
12
15
|
|
13
|
-
|
16
|
+
super(response)
|
14
17
|
end
|
15
18
|
|
16
19
|
def setup_data!(response)
|
@@ -23,94 +26,122 @@ module Awis
|
|
23
26
|
statistics = []
|
24
27
|
related_related_links = []
|
25
28
|
category_data = []
|
29
|
+
rank_by_country = []
|
30
|
+
contributing_subdomains = []
|
26
31
|
|
27
32
|
response.each_node do |node, path|
|
28
33
|
text = node.inner_xml
|
29
|
-
|
30
|
-
|
34
|
+
candidate_text = text.delete(',')
|
35
|
+
value = if integer_value?(candidate_text) && node.name != 'aws:Delta'
|
36
|
+
candidate_text.to_i
|
37
|
+
elsif float_value?(candidate_text)
|
38
|
+
candidate_text.to_f
|
39
|
+
elsif text.is_a?(String) && text.empty?
|
40
|
+
nil
|
41
|
+
else
|
42
|
+
text
|
43
|
+
end
|
31
44
|
|
32
45
|
if node.name == 'aws:RequestId'
|
33
|
-
@request_id ||=
|
46
|
+
@request_id ||= value
|
34
47
|
elsif node.name == 'aws:StatusCode'
|
35
|
-
@status_code ||=
|
48
|
+
@status_code ||= value
|
36
49
|
elsif node.name == 'aws:DataUrl' && path == "#{traffic_node_name}/aws:DataUrl"
|
37
|
-
@data_url =
|
50
|
+
@data_url = value
|
38
51
|
elsif node.name == 'aws:Asin' && path == "#{traffic_node_name}/aws:Asin"
|
39
|
-
@asin =
|
52
|
+
@asin = value
|
40
53
|
elsif node.name == 'aws:Rank' && path == "#{traffic_node_name}/aws:Rank"
|
41
|
-
@rank =
|
54
|
+
@rank = value
|
42
55
|
elsif node.name == 'aws:DataUrl' && path == "#{content_node_name}/aws:DataUrl"
|
43
|
-
content_data[:data_url] =
|
56
|
+
content_data[:data_url] = value
|
44
57
|
elsif node.name == 'aws:Title' && path == "#{content_node_name}/aws:SiteData/aws:Title"
|
45
|
-
content_data[:site_title] =
|
58
|
+
content_data[:site_title] = value
|
46
59
|
elsif node.name == 'aws:Description'
|
47
|
-
content_data[:site_description] =
|
60
|
+
content_data[:site_description] = value
|
48
61
|
elsif node.name == 'aws:MedianLoadTime'
|
49
|
-
content_data[:speed_median_load_time] =
|
62
|
+
content_data[:speed_median_load_time] = value
|
50
63
|
elsif node.name == 'aws:Percentile'
|
51
|
-
content_data[:speed_percentile] =
|
64
|
+
content_data[:speed_percentile] = value
|
52
65
|
elsif node.name == 'aws:AdultContent'
|
53
|
-
content_data[:adult_content] =
|
66
|
+
content_data[:adult_content] = value
|
54
67
|
elsif node.name == 'aws:Locale'
|
55
|
-
content_data[:language_locale] =
|
68
|
+
content_data[:language_locale] = value
|
56
69
|
elsif node.name == 'aws:LinksInCount'
|
57
|
-
content_data[:links_in_count] =
|
70
|
+
content_data[:links_in_count] = value
|
58
71
|
elsif node.name == 'aws:Domain' && path == "#{content_node_name}/aws:OwnedDomains/aws:OwnedDomain/aws:Domain"
|
59
|
-
content_data[:owned_domains] << { domain:
|
72
|
+
content_data[:owned_domains] << { domain: value }
|
60
73
|
elsif node.name == 'aws:Title' && path == "#{content_node_name}/aws:OwnedDomains/aws:OwnedDomain/aws:Title"
|
61
|
-
content_data[:owned_domains] << { title:
|
74
|
+
content_data[:owned_domains] << { title: value }
|
62
75
|
elsif node.name == 'aws:OnlineSince'
|
63
|
-
content_data[:online_since] =
|
76
|
+
content_data[:online_since] = value
|
64
77
|
elsif node.name == 'aws:DataUrl' && path == "#{root_node_name}/aws:ContactInfo/aws:DataUrl"
|
65
|
-
contact_info[:data_url] =
|
78
|
+
contact_info[:data_url] = value
|
66
79
|
elsif node.name == 'aws:OwnerName'
|
67
|
-
contact_info[:owner_name] =
|
80
|
+
contact_info[:owner_name] = value
|
68
81
|
elsif node.name == 'aws:Email'
|
69
|
-
contact_info[:email] =
|
82
|
+
contact_info[:email] = value
|
70
83
|
elsif node.name == 'aws:PhysicalAddress'
|
71
|
-
contact_info[:physical_address] =
|
84
|
+
contact_info[:physical_address] = value
|
72
85
|
elsif node.name == 'aws:CompanyStockTicker'
|
73
|
-
contact_info[:company_stock_ticker] =
|
86
|
+
contact_info[:company_stock_ticker] = value
|
74
87
|
elsif node.name == 'aws:PhoneNumber'
|
75
|
-
contact_info[:phone_numbers] <<
|
88
|
+
contact_info[:phone_numbers] << value
|
76
89
|
elsif node.name == 'aws:DataUrl' && path == "#{related_links_node_name}/aws:DataUrl"
|
77
|
-
related_related_links << { data_url:
|
90
|
+
related_related_links << { data_url: value }
|
78
91
|
elsif node.name == 'aws:NavigableUrl' && path == "#{related_links_node_name}/aws:NavigableUrl"
|
79
|
-
related_related_links << { navigable_url:
|
92
|
+
related_related_links << { navigable_url: value }
|
80
93
|
elsif node.name == 'aws:Title' && path == "#{related_links_node_name}/aws:Title"
|
81
|
-
related_related_links << { title:
|
94
|
+
related_related_links << { title: value }
|
82
95
|
elsif node.name == 'aws:Title' && path == "#{categories_node_name}/aws:Title"
|
83
|
-
category_data << { title:
|
96
|
+
category_data << { title: value }
|
84
97
|
elsif node.name == 'aws:AbsolutePath' && path == "#{categories_node_name}/aws:AbsolutePath"
|
85
|
-
category_data << { absolute_path:
|
98
|
+
category_data << { absolute_path: value }
|
86
99
|
elsif node.name == 'aws:Months' && path == "#{statistic_node_name}/aws:TimeRange/aws:Months"
|
87
|
-
statistics << { time_range_months:
|
100
|
+
statistics << { time_range_months: value }
|
88
101
|
elsif node.name == 'aws:Days' && path == "#{statistic_node_name}/aws:TimeRange/aws:Days"
|
89
|
-
statistics << { time_range_days:
|
102
|
+
statistics << { time_range_days: value }
|
90
103
|
elsif node.name == 'aws:Value' && path == "#{statistic_node_name}/aws:Rank/aws:Value"
|
91
|
-
statistics << { rank_value:
|
104
|
+
statistics << { rank_value: value }
|
92
105
|
elsif node.name == 'aws:Delta' && path == "#{statistic_node_name}/aws:Rank/aws:Delta"
|
93
|
-
statistics << { rank_delta:
|
106
|
+
statistics << { rank_delta: value }
|
94
107
|
elsif node.name == 'aws:Value' && path == "#{statistic_node_name}/aws:Reach/aws:Rank/aws:Value"
|
95
|
-
statistics << { reach_rank_value:
|
108
|
+
statistics << { reach_rank_value: value }
|
96
109
|
elsif node.name == 'aws:Delta' && path == "#{statistic_node_name}/aws:Reach/aws:Rank/aws:Delta"
|
97
|
-
statistics << { reach_rank_delta:
|
110
|
+
statistics << { reach_rank_delta: value }
|
98
111
|
elsif node.name == 'aws:Value' && path == "#{statistic_node_name}/aws:Reach/aws:PerMillion/aws:Value"
|
99
|
-
statistics << { reach_per_million_value:
|
112
|
+
statistics << { reach_per_million_value: value }
|
100
113
|
elsif node.name == 'aws:Delta' && path == "#{statistic_node_name}/aws:Reach/aws:PerMillion/aws:Delta"
|
101
|
-
statistics << { reach_per_million_delta:
|
114
|
+
statistics << { reach_per_million_delta: value }
|
102
115
|
elsif node.name == 'aws:Value' && path == "#{statistic_node_name}/aws:PageViews/aws:PerMillion/aws:Value"
|
103
|
-
statistics << {
|
116
|
+
statistics << { page_views_per_million_value: value }
|
104
117
|
elsif node.name == 'aws:Delta' && path == "#{statistic_node_name}/aws:PageViews/aws:PerMillion/aws:Delta"
|
105
|
-
statistics << {
|
118
|
+
statistics << { page_views_per_million_delta: value }
|
106
119
|
elsif node.name == 'aws:Value' && path == "#{statistic_node_name}/aws:PageViews/aws:Rank/aws:Value"
|
107
|
-
statistics << {
|
120
|
+
statistics << { page_views_rank_value: value }
|
108
121
|
elsif node.name == 'aws:Delta' && path == "#{statistic_node_name}/aws:PageViews/aws:Rank/aws:Delta"
|
109
|
-
statistics << {
|
122
|
+
statistics << { page_views_rank_delta: value }
|
110
123
|
elsif node.name == 'aws:Value' && path == "#{statistic_node_name}/aws:PageViews/aws:PerUser/aws:Value"
|
111
|
-
statistics << {
|
124
|
+
statistics << { page_views_per_user_value: value }
|
112
125
|
elsif node.name == 'aws:Delta' && path == "#{statistic_node_name}/aws:PageViews/aws:PerUser/aws:Delta"
|
113
|
-
statistics << {
|
126
|
+
statistics << { page_views_per_user_delta: value }
|
127
|
+
elsif node.name == 'aws:Country' && path == rank_by_country_node_name
|
128
|
+
rank_by_country << { country_code: node.attributes['Code'] }
|
129
|
+
elsif node.name == 'aws:Rank' && path == "#{rank_by_country_node_name}/aws:Rank"
|
130
|
+
rank_by_country << { rank: value }
|
131
|
+
elsif node.name == 'aws:PageViews' && path == "#{rank_by_country_node_name}/aws:Contribution/aws:PageViews"
|
132
|
+
rank_by_country << { contribution_page_views: value }
|
133
|
+
elsif node.name == 'aws:Users' && path == "#{rank_by_country_node_name}/aws:Contribution/aws:Users"
|
134
|
+
rank_by_country << { contribution_users: value }
|
135
|
+
elsif node.name == 'aws:DataUrl' && path == "#{contributing_subdomains_node_name}/aws:DataUrl"
|
136
|
+
contributing_subdomains << { data_url: value }
|
137
|
+
elsif node.name == 'aws:Months' && path == "#{contributing_subdomains_node_name}/aws:TimeRange/aws:Months"
|
138
|
+
contributing_subdomains << { time_range_months: value }
|
139
|
+
elsif node.name == 'aws:Percentage' && path == "#{contributing_subdomains_node_name}/aws:Reach/aws:Percentage"
|
140
|
+
contributing_subdomains << { reach_percentage: value }
|
141
|
+
elsif node.name == 'aws:Percentage' && path == "#{contributing_subdomains_node_name}/aws:PageViews/aws:Percentage"
|
142
|
+
contributing_subdomains << { page_views_percentage: value }
|
143
|
+
elsif node.name == 'aws:PerUser' && path == "#{contributing_subdomains_node_name}/aws:PageViews/aws:PerUser"
|
144
|
+
contributing_subdomains << { page_views_per_user: value }
|
114
145
|
end
|
115
146
|
end
|
116
147
|
|
@@ -120,10 +151,8 @@ module Awis
|
|
120
151
|
relationship_collections(@usage_statistics, statistics, 13, UsageStatistic)
|
121
152
|
relationship_collections(@related_links, related_related_links, 3, RelatedLink)
|
122
153
|
relationship_collections(@categories, category_data, 3, CategoryData)
|
123
|
-
|
124
|
-
|
125
|
-
def is_404?
|
126
|
-
success? && rank == 404
|
154
|
+
relationship_collections(@rank_by_country, rank_by_country, 4, RankByCountry)
|
155
|
+
relationship_collections(@contributing_subdomains, contributing_subdomains, 5, ContributingSubdomain)
|
127
156
|
end
|
128
157
|
|
129
158
|
def init_entity_data(attr_name, data, kclass)
|
@@ -155,10 +184,137 @@ module Awis
|
|
155
184
|
def statistic_node_name
|
156
185
|
"#{traffic_node_name}/aws:UsageStatistics/aws:UsageStatistic"
|
157
186
|
end
|
187
|
+
|
188
|
+
def contributing_subdomains_node_name
|
189
|
+
"#{traffic_node_name}/aws:ContributingSubdomains/aws:ContributingSubdomain"
|
190
|
+
end
|
191
|
+
|
192
|
+
def rank_by_country_node_name
|
193
|
+
"#{traffic_node_name}/aws:RankByCountry/aws:Country"
|
194
|
+
end
|
195
|
+
|
196
|
+
def has_data?
|
197
|
+
!@rank.nil?
|
198
|
+
end
|
199
|
+
|
200
|
+
def geos_sorted
|
201
|
+
rank_by_country.select { |rbc| !rbc.rank.nil? && !rbc.contribution_page_views.nil? }.
|
202
|
+
sort_by { |rbc| - rbc.contribution_page_views.round }.
|
203
|
+
map { |rbc| { rbc.country_code => rbc.contribution_page_views.round } }
|
204
|
+
end
|
205
|
+
|
206
|
+
def geos_hash
|
207
|
+
@geos_hash ||= geos_sorted.reduce({}, :merge)
|
208
|
+
end
|
209
|
+
|
210
|
+
def not_found?
|
211
|
+
([content_data.data_url, content_data.site_title] & [404, '404']).size > 0
|
212
|
+
end
|
213
|
+
alias :is_404? :not_found?
|
214
|
+
|
215
|
+
def domains
|
216
|
+
content_data.owned_domains.map(&:domain)
|
217
|
+
end
|
218
|
+
|
219
|
+
def contributing_hostnames
|
220
|
+
contributing_subdomains.map(&:data_url).reject { |hostname| hostname == 'OTHER' }
|
221
|
+
end
|
222
|
+
|
223
|
+
def pvs_per_user
|
224
|
+
usage_statistics.first.page_views_per_user_value
|
225
|
+
end
|
226
|
+
|
227
|
+
def pvs_rank
|
228
|
+
usage_statistics.first.page_views_rank_value
|
229
|
+
end
|
230
|
+
|
231
|
+
def get_pvs_per_mil
|
232
|
+
usage_statistics.first.page_views_per_million_value
|
233
|
+
end
|
234
|
+
|
235
|
+
def speed_percentile
|
236
|
+
content_data.speed_percentile
|
237
|
+
end
|
238
|
+
|
239
|
+
def get_median_load_time
|
240
|
+
content_data.speed_median_load_time
|
241
|
+
end
|
242
|
+
|
243
|
+
def daily_GDN_page_views
|
244
|
+
return unless rank
|
245
|
+
|
246
|
+
alexa_gdn.each do |max_pvs, gdn_range|
|
247
|
+
return gdn_range if rank > max_pvs
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
def speed_rating
|
252
|
+
if get_median_load_time
|
253
|
+
alexa_speed_rating.each do |max_load_time, rating|
|
254
|
+
return rating if get_median_load_time > max_load_time
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
'AVERAGE ( < 5s)'
|
259
|
+
end
|
260
|
+
|
261
|
+
def alexa_speed_rating
|
262
|
+
{
|
263
|
+
2200 => 'POOR ( > 5s)',
|
264
|
+
1200 => 'AVERAGE ( < 5s)',
|
265
|
+
0 => 'GOOD ( < 3s)'
|
266
|
+
}
|
267
|
+
end
|
268
|
+
|
269
|
+
def rank_page_view
|
270
|
+
{
|
271
|
+
20000 => '< 1K',
|
272
|
+
5000 => '1K - 10K',
|
273
|
+
3000 => '10K - 100K',
|
274
|
+
1900 => '100K - 500K',
|
275
|
+
1300 => '500K - 1M',
|
276
|
+
850 => '2M - 5M',
|
277
|
+
550 => '5M - 10M',
|
278
|
+
350 => '10M - 20M',
|
279
|
+
200 => '20M - 50M',
|
280
|
+
100 => '50M - 100M',
|
281
|
+
28 => '100M+'
|
282
|
+
}
|
283
|
+
end
|
284
|
+
|
285
|
+
def alexa_gdn
|
286
|
+
{
|
287
|
+
250000 => '< 1K',
|
288
|
+
100000 => '1K - 10K',
|
289
|
+
50000 => '10K - 100K',
|
290
|
+
20000 => '100K - 500K',
|
291
|
+
10000 => '500K - 1M',
|
292
|
+
5000 => '1M - 2M',
|
293
|
+
2000 => '2M - 5M',
|
294
|
+
1000 => '5M - 10M',
|
295
|
+
500 => '10M - 20M',
|
296
|
+
150 => '20M - 50M',
|
297
|
+
30 => '50M - 100M',
|
298
|
+
0 => '100M+'
|
299
|
+
}
|
300
|
+
end
|
301
|
+
|
302
|
+
private
|
303
|
+
|
304
|
+
def integer_value?(text)
|
305
|
+
text.to_i.to_s == text
|
306
|
+
end
|
307
|
+
|
308
|
+
def float_value?(text)
|
309
|
+
!!Float(text.delete('%'))
|
310
|
+
rescue ::StandardError
|
311
|
+
false
|
312
|
+
end
|
158
313
|
end
|
159
314
|
|
160
315
|
class ContentData < BaseEntity
|
161
|
-
attr_accessor :data_url, :site_title, :site_description, :online_since,
|
316
|
+
attr_accessor :data_url, :site_title, :site_description, :online_since,
|
317
|
+
:speed_median_load_time, :speed_percentile, :adult_content,
|
162
318
|
:language_locale, :links_in_count, :owned_domains
|
163
319
|
|
164
320
|
def initialize(options)
|
@@ -190,7 +346,7 @@ module Awis
|
|
190
346
|
end
|
191
347
|
|
192
348
|
def phone_number_collections(phone_numbers)
|
193
|
-
return @phone_numbers = [] if phone_numbers.
|
349
|
+
return @phone_numbers = [] if phone_numbers.nil? || phone_numbers.empty?
|
194
350
|
|
195
351
|
phone_numbers.map { |item| @phone_numbers << PhoneNumber.new(item) }
|
196
352
|
end
|
@@ -212,12 +368,12 @@ module Awis
|
|
212
368
|
attr_accessor :time_range_months, :time_range_days, :rank_value, :rank_delta,
|
213
369
|
:reach_rank_value, :reach_rank_delta,
|
214
370
|
:reach_per_million_value, :reach_per_million_delta,
|
215
|
-
:
|
216
|
-
:
|
217
|
-
:
|
371
|
+
:page_views_per_million_value, :page_views_per_million_delta,
|
372
|
+
:page_views_rank_value, :page_views_rank_delta,
|
373
|
+
:page_views_per_user_value, :page_views_per_user_delta
|
218
374
|
|
219
375
|
def range_type
|
220
|
-
return 'month'
|
376
|
+
return 'month' unless time_range_months.nil?
|
221
377
|
|
222
378
|
'day'
|
223
379
|
end
|
@@ -226,5 +382,13 @@ module Awis
|
|
226
382
|
(time_range_months || time_range_days)
|
227
383
|
end
|
228
384
|
end
|
385
|
+
|
386
|
+
class ContributingSubdomain < BaseEntity
|
387
|
+
attr_accessor :data_url, :time_range_months, :reach_percentage, :page_views_percentage, :page_views_per_user
|
388
|
+
end
|
389
|
+
|
390
|
+
class RankByCountry < BaseEntity
|
391
|
+
attr_accessor :country_code, :rank, :contribution_page_views, :contribution_users
|
392
|
+
end
|
229
393
|
end
|
230
394
|
end
|
data/lib/awis/utils.rb
CHANGED
data/lib/awis/utils/xml.rb
CHANGED
data/lib/awis/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: awis-sdk-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Encore Shao
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sigv4
|
@@ -168,7 +168,7 @@ files:
|
|
168
168
|
homepage: https://github.com/encoreshao/amazon-awis
|
169
169
|
licenses: []
|
170
170
|
metadata: {}
|
171
|
-
post_install_message:
|
171
|
+
post_install_message:
|
172
172
|
rdoc_options: []
|
173
173
|
require_paths:
|
174
174
|
- lib
|
@@ -183,9 +183,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
183
183
|
- !ruby/object:Gem::Version
|
184
184
|
version: '0'
|
185
185
|
requirements: []
|
186
|
-
|
187
|
-
|
188
|
-
signing_key:
|
186
|
+
rubygems_version: 3.0.3
|
187
|
+
signing_key:
|
189
188
|
specification_version: 4
|
190
189
|
summary: Ruby - Amazon Alexa Web Information Service Library (AWIS)
|
191
190
|
test_files: []
|