alexa 0.6.3 → 0.7.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d993a6237b4a5ee390e3b076b57b13e49f3c0014
4
- data.tar.gz: b3ad19ed26b737f4993a73289e4acf44a498f772
2
+ SHA256:
3
+ metadata.gz: 11db0614491c18c079708be97c2b65ff9f05bb9999439e4436c27bb39aec1aea
4
+ data.tar.gz: 854d04563942132728f9ae59e9a5d3046411f566413c76a21855df032f80be55
5
5
  SHA512:
6
- metadata.gz: 47de954fcf55be7005c4cadf751e315be6a4211427b65642a60c7898c8c65295b8f03e718557f426c0482bed01a670251b2482c08c1317ee10139ebd2704b06f
7
- data.tar.gz: 8e7feb1cac57937f7beb6468f93eb7aad20d10e7637d712d986f3cf7c6e1d79c2f37fe2539b2baa6af65f105c7312e4455b1baf1166fa4280c9fceec07e4e6bf
6
+ metadata.gz: f68b8c4202388d2c6d3874f304aeb1985b3174b9ebd1db92074172fb8923448a6fef932a7b0f80cf9fc6c6c5680643869a8bd2846ed7a8a282739d91c30ddd71
7
+ data.tar.gz: af94f14db646a36c316c5fbe94b855e7ad7d220b914dd18f5067f2376b0bdc06be3268b1e957a75e2e2eb543e29a1f1a0f2181e986e833a661d1961ce2257043
@@ -1,10 +1,12 @@
1
- notifications:
2
- disabled: true
3
- bundler_args: --without extra
1
+ language: ruby
2
+ cache: bundler
3
+
4
+ before_install:
5
+ - gem install bundler
6
+
4
7
  rvm:
5
- - 1.9.3
6
- - 2.0.0
7
- - 2.1.1
8
+ - 2.4
9
+ - 2.5
8
10
  env:
9
11
  - XML_PARSER=rexml
10
12
  - XML_PARSER=nokogiri
data/Gemfile CHANGED
@@ -1,9 +1,5 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- group :extra do
4
- gem "debugger"
5
- end
6
-
7
3
  gem "rake"
8
4
 
9
5
  # xml parsers
@@ -1,27 +1,33 @@
1
1
  # -*- encoding: utf-8 -*-
2
- require File.expand_path("../lib/alexa/version", __FILE__)
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "alexa/version"
3
5
 
4
6
  Gem::Specification.new do |gem|
7
+ gem.name = "alexa"
8
+ gem.version = Alexa::VERSION
5
9
  gem.authors = ["Wojciech Wnętrzak"]
6
10
  gem.email = ["w.wnetrzak@gmail.com"]
7
- gem.description = %q{Alexa Web Information Service library (AWIS)}
11
+
8
12
  gem.summary = %q{Alexa Web Information Service library}
13
+ gem.description = %q{Alexa Web Information Service library (AWIS)}
9
14
  gem.homepage = "https://github.com/morgoth/alexa"
10
15
  gem.license = "MIT"
11
16
 
12
- gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
13
- gem.files = `git ls-files`.split("\n")
14
- gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
- gem.name = "alexa"
17
+ gem.files = `git ls-files -z`.split("\x0").reject do |f|
18
+ f.match(%r{^(test|spec|features)/})
19
+ end
20
+ gem.bindir = "exe"
21
+ gem.executables = gem.files.grep(%r{^exe/}) { |f| File.basename(f) }
16
22
  gem.require_paths = ["lib"]
17
- gem.version = Alexa::VERSION
18
23
 
19
24
  gem.required_ruby_version = ">= 1.9.3"
20
25
 
26
+ gem.add_dependency "aws-sigv4"
21
27
  gem.add_dependency "multi_xml", ">= 0.5.0"
22
- gem.add_dependency "faraday", "~> 0.8"
23
28
 
24
29
  gem.add_development_dependency "minitest", ">= 5.0.0"
25
30
  gem.add_development_dependency "mocha"
26
31
  gem.add_development_dependency "webmock"
32
+ gem.add_development_dependency "vcr"
27
33
  end
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "alexa"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -13,5 +13,6 @@ require "alexa/api/url_info"
13
13
 
14
14
  module Alexa
15
15
  API_VERSION = "2005-07-11"
16
- API_HOST = "awis.amazonaws.com"
16
+ API_REGION = "us-west-1"
17
+ API_HOST = "https://awis.#{API_REGION}.amazonaws.com"
17
18
  end
@@ -1,80 +1,77 @@
1
1
  require "cgi"
2
- require "base64"
3
- require "openssl"
4
- require "digest/sha1"
5
- require "faraday"
6
- require "time"
2
+ require "aws-sigv4"
3
+ require "net/https"
7
4
 
8
5
  module Alexa
9
6
  class Connection
10
- attr_accessor :secret_access_key, :access_key_id
11
- attr_writer :params
7
+ attr_reader :params, :secret_access_key, :access_key_id
12
8
 
13
- RFC_3986_UNRESERVED_CHARS = "-_.~a-zA-Z\\d"
9
+ HEADERS = {
10
+ "Content-Type" => "application/xml",
11
+ "Accept" => "application/xml",
12
+ "User-Agent" => "Ruby alexa gem v#{Alexa::VERSION}"
13
+ }
14
14
 
15
15
  def initialize(credentials = {})
16
- self.secret_access_key = credentials.fetch(:secret_access_key)
17
- self.access_key_id = credentials.fetch(:access_key_id)
18
- end
19
-
20
- def params
21
- @params ||= {}
16
+ @secret_access_key = credentials.fetch(:secret_access_key)
17
+ @access_key_id = credentials.fetch(:access_key_id)
22
18
  end
23
19
 
24
20
  def get(params = {})
25
- self.params = params
21
+ @params = params
26
22
  handle_response(request).body.force_encoding(Encoding::UTF_8)
27
23
  end
28
24
 
25
+ private
26
+
29
27
  def handle_response(response)
30
- case response.status.to_i
31
- when 200...300
28
+ case response
29
+ when Net::HTTPSuccess
32
30
  response
33
- when 300...600
34
- if response.body.nil?
35
- raise ResponseError.new(nil, response)
36
- else
37
- xml = MultiXml.parse(response.body)
38
- message = xml["Response"]["Errors"]["Error"]["Message"]
39
- raise ResponseError.new(message, response)
40
- end
41
31
  else
42
- raise ResponseError.new("Unknown code: #{respnse.code}", response)
32
+ raise ResponseError.new(response.body, response)
43
33
  end
44
34
  end
45
35
 
46
36
  def request
47
- Faraday.get(uri)
48
- end
49
-
50
- def timestamp
51
- @timestamp ||= Time::now.utc.strftime("%Y-%m-%dT%H:%M:%S.000Z")
37
+ req = Net::HTTP::Get.new(uri)
38
+ headers.each do |key, value|
39
+ req[key] = value
40
+ end
41
+ Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
42
+ http.request(req)
43
+ end
52
44
  end
53
45
 
54
- def signature
55
- Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new("sha256"), secret_access_key, sign)).strip
46
+ def uri
47
+ @uri ||= URI.parse("#{Alexa::API_HOST}/api?" << query)
56
48
  end
57
49
 
58
- def uri
59
- URI.parse("http://#{Alexa::API_HOST}/?" + query + "&Signature=" + CGI::escape(signature))
50
+ def headers
51
+ HEADERS.merge(auth_headers)
60
52
  end
61
53
 
62
- def default_params
63
- {
64
- "AWSAccessKeyId" => access_key_id,
65
- "SignatureMethod" => "HmacSHA256",
66
- "SignatureVersion" => "2",
67
- "Timestamp" => timestamp,
68
- "Version" => Alexa::API_VERSION
69
- }
54
+ def auth_headers
55
+ signer.sign_request(
56
+ http_method: "GET",
57
+ headers: HEADERS,
58
+ url: uri.to_s
59
+ ).headers
70
60
  end
71
61
 
72
- def sign
73
- "GET\n" + Alexa::API_HOST + "\n/\n" + query
62
+ def signer
63
+ Aws::Sigv4::Signer.new(
64
+ service: "awis",
65
+ region: Alexa::API_REGION,
66
+ access_key_id: access_key_id,
67
+ secret_access_key: secret_access_key
68
+ )
74
69
  end
75
70
 
76
71
  def query
77
- default_params.merge(params).map { |key, value| "#{key}=#{URI.escape(value.to_s, Regexp.new("[^#{RFC_3986_UNRESERVED_CHARS}]"))}" }.sort.join("&")
72
+ params.map do |key, value|
73
+ "#{key}=#{CGI.escape(value.to_s)}"
74
+ end.sort!.join("&")
78
75
  end
79
76
  end
80
77
  end
@@ -1,3 +1,3 @@
1
1
  module Alexa
2
- VERSION = "0.6.3"
2
+ VERSION = "0.7.0"
3
3
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alexa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wojciech Wnętrzak
8
8
  autorequire:
9
- bindir: bin
9
+ bindir: exe
10
10
  cert_chain: []
11
- date: 2014-03-25 00:00:00.000000000 Z
11
+ date: 2018-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: multi_xml
14
+ name: aws-sigv4
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.5.0
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 0.5.0
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: faraday
28
+ name: multi_xml
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0.8'
33
+ version: 0.5.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '0.8'
40
+ version: 0.5.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: vcr
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  description: Alexa Web Information Service library (AWIS)
84
98
  email:
85
99
  - w.wnetrzak@gmail.com
@@ -94,6 +108,8 @@ files:
94
108
  - README.md
95
109
  - Rakefile
96
110
  - alexa.gemspec
111
+ - bin/console
112
+ - bin/setup
97
113
  - lib/alexa.rb
98
114
  - lib/alexa/api/base.rb
99
115
  - lib/alexa/api/category_browse.rb
@@ -106,27 +122,6 @@ files:
106
122
  - lib/alexa/exceptions.rb
107
123
  - lib/alexa/utils.rb
108
124
  - lib/alexa/version.rb
109
- - test/api/category_browse_test.rb
110
- - test/api/category_listings_test.rb
111
- - test/api/sites_linking_in_test.rb
112
- - test/api/traffic_history_test.rb
113
- - test/api/url_info_test.rb
114
- - test/client_test.rb
115
- - test/connection_test.rb
116
- - test/fixtures/bad_request.txt
117
- - test/fixtures/category_browse/card_games.txt
118
- - test/fixtures/category_listings/card_games.txt
119
- - test/fixtures/forbidden.txt
120
- - test/fixtures/sites_linking_in/github_count_3.txt
121
- - test/fixtures/traffic_history/alexa_error.txt
122
- - test/fixtures/traffic_history/github.txt
123
- - test/fixtures/unathorized.txt
124
- - test/fixtures/url_info/custom-response-group.txt
125
- - test/fixtures/url_info/empty_group.txt
126
- - test/fixtures/url_info/github_full.txt
127
- - test/fixtures/url_info/github_rank.txt
128
- - test/helper.rb
129
- - test/utils_test.rb
130
125
  homepage: https://github.com/morgoth/alexa
131
126
  licenses:
132
127
  - MIT
@@ -147,7 +142,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
147
142
  version: '0'
148
143
  requirements: []
149
144
  rubyforge_project:
150
- rubygems_version: 2.2.2
145
+ rubygems_version: 2.7.6
151
146
  signing_key:
152
147
  specification_version: 4
153
148
  summary: Alexa Web Information Service library
@@ -1,41 +0,0 @@
1
- require "helper"
2
-
3
- describe Alexa::API::CategoryBrowse do
4
- it "raises argument error when path not present" do
5
- assert_raises Alexa::ArgumentError, /path/ do
6
- Alexa::API::CategoryBrowse.new(:access_key_id => "fake", :secret_access_key => "fake").fetch
7
- end
8
- end
9
-
10
- describe "parsing xml" do
11
- before do
12
- stub_request(:get, %r{http://awis.amazonaws.com}).to_return(fixture("category_browse/card_games.txt"))
13
- @category_browse = Alexa::API::CategoryBrowse.new(:access_key_id => "fake", :secret_access_key => "fake")
14
- @category_browse.fetch(:path => "Top/Games/Card_Games")
15
- end
16
-
17
- it "returns categories" do
18
- assert_equal 8, @category_browse.categories.size
19
- end
20
-
21
- it "returns language categories" do
22
- assert_equal 20, @category_browse.language_categories.size
23
- end
24
-
25
- it "returns related categories" do
26
- assert_equal 8, @category_browse.related_categories.size
27
- end
28
-
29
- it "returns letter bars" do
30
- assert_equal 36, @category_browse.letter_bars.size
31
- end
32
-
33
- it "has success status code" do
34
- assert_equal "Success", @category_browse.status_code
35
- end
36
-
37
- it "has request id" do
38
- assert_equal "c8bec6fe-84f3-9a8e-7444-47f86c64d74b", @category_browse.request_id
39
- end
40
- end
41
- end
@@ -1,37 +0,0 @@
1
- require "helper"
2
-
3
- describe Alexa::API::CategoryListings do
4
- it "raises argument error when path not present" do
5
- assert_raises Alexa::ArgumentError, /path/ do
6
- Alexa::API::CategoryListings.new(:access_key_id => "fake", :secret_access_key => "fake").fetch
7
- end
8
- end
9
-
10
- describe "parsing xml" do
11
- before do
12
- stub_request(:get, %r{http://awis.amazonaws.com}).to_return(fixture("category_listings/card_games.txt"))
13
- @category_listings = Alexa::API::CategoryListings.new(:access_key_id => "fake", :secret_access_key => "fake")
14
- @category_listings.fetch(:path => "Top/Games/Card_Games")
15
- end
16
-
17
- it "returns recursive count" do
18
- assert_equal 1051, @category_listings.recursive_count
19
- end
20
-
21
- it "returns count" do
22
- assert_equal 1, @category_listings.count
23
- end
24
-
25
- it "returns listings" do
26
- assert_equal 20, @category_listings.listings.size
27
- end
28
-
29
- it "has success status code" do
30
- assert_equal "Success", @category_listings.status_code
31
- end
32
-
33
- it "has request id" do
34
- assert_equal "a069b6cd-309f-df52-88be-1bd88ab45b7e", @category_listings.request_id
35
- end
36
- end
37
- end