alexa 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. data/.travis.yml +4 -5
  2. data/Gemfile +1 -0
  3. data/README.md +76 -21
  4. data/alexa.gemspec +1 -9
  5. data/lib/alexa.rb +11 -22
  6. data/lib/alexa/api/category_browse.rb +62 -0
  7. data/lib/alexa/api/category_listings.rb +66 -0
  8. data/lib/alexa/api/sites_linking_in.rb +41 -0
  9. data/lib/alexa/api/traffic_history.rb +45 -0
  10. data/lib/alexa/api/url_info.rb +108 -0
  11. data/lib/alexa/client.rb +30 -0
  12. data/lib/alexa/connection.rb +86 -0
  13. data/lib/alexa/exceptions.rb +17 -0
  14. data/lib/alexa/utils.rb +19 -0
  15. data/lib/alexa/version.rb +1 -1
  16. data/test/api/category_browse_test.rb +27 -0
  17. data/test/api/category_listings_test.rb +19 -0
  18. data/test/api/sites_linking_in_test.rb +23 -0
  19. data/test/api/traffic_history_test.rb +24 -0
  20. data/test/api/url_info_test.rb +112 -0
  21. data/test/client_test.rb +65 -0
  22. data/test/connection_test.rb +37 -0
  23. data/test/fixtures/bad_request.txt +8 -0
  24. data/test/fixtures/category_browse/card_games.txt +480 -0
  25. data/test/fixtures/category_listings/card_games.txt +138 -0
  26. data/test/fixtures/sites_linking_in/github_count_3.txt +24 -0
  27. data/test/fixtures/traffic_history/alexa_example.txt +37 -0
  28. data/test/fixtures/traffic_history/github_range_2.txt +8 -0
  29. data/test/fixtures/{custom-response-group.txt → url_info/custom-response-group.txt} +0 -0
  30. data/test/fixtures/{empty_group.txt → url_info/empty_group.txt} +0 -0
  31. data/test/fixtures/{github_full.txt → url_info/github_full.txt} +0 -0
  32. data/test/fixtures/{github_rank.txt → url_info/github_rank.txt} +0 -0
  33. data/test/helper.rb +6 -8
  34. data/test/utils_test.rb +54 -0
  35. metadata +33 -23
  36. data/lib/alexa/url_info.rb +0 -109
  37. data/test/config_test.rb +0 -35
  38. data/test/url_info_test.rb +0 -152
@@ -0,0 +1,138 @@
1
+ HTTP/1.1 200 OK
2
+ Server: Apache-Coyote/1.1
3
+ Content-Type: text/xml
4
+ Transfer-Encoding: chunked
5
+ Date: Wed, 08 Aug 2012 20:25:27 GMT
6
+
7
+ <?xml version="1.0"?>
8
+ <aws:CategoryListingsResponse xmlns:aws="http://alexa.amazonaws.com/doc/2005-07-11/"><aws:Response xmlns:aws="http://awis.amazonaws.com/doc/2005-07-11"><aws:OperationRequest><aws:RequestId>a069b6cd-309f-df52-88be-1bd88ab45b7e</aws:RequestId></aws:OperationRequest><aws:CategoryListingsResult><aws:Alexa>
9
+
10
+ <aws:CategoryListings>
11
+ <aws:RecursiveCount>1051</aws:RecursiveCount>
12
+ <aws:Count>1</aws:Count>
13
+ <aws:Listings>
14
+ <aws:Listing>
15
+ <aws:DataUrl type="navigable">http://ace2three.com/</aws:DataUrl>
16
+ <aws:Title>Ace2Three - the best Indian Rummy</aws:Title>
17
+ <aws:PopularityRank>7523</aws:PopularityRank>
18
+ <aws:Description>Play Indian Rummy and Win real cash prizes. Play rummy against live players in single and multi-table tournaments.</aws:Description>
19
+ </aws:Listing>
20
+ <aws:Listing>
21
+ <aws:DataUrl type="navigable">http://www.pagat.com/</aws:DataUrl>
22
+ <aws:Title>Rules of Card Games</aws:Title>
23
+ <aws:PopularityRank>26435</aws:PopularityRank>
24
+ <aws:Description>A collection of hundreds of card and tile game rules arranged alphabetically, categorically, and geographically.</aws:Description>
25
+ </aws:Listing>
26
+ <aws:Listing>
27
+ <aws:DataUrl type="navigable">http://www.acbl.org/</aws:DataUrl>
28
+ <aws:Title>American Contract Bridge League</aws:Title>
29
+ <aws:PopularityRank>40302</aws:PopularityRank>
30
+ <aws:Description>Organizes the game in North America. Includes tournaments calendar and results, places to play, events, shopping, members information, and learning resources. Official site.</aws:Description>
31
+ </aws:Listing>
32
+ <aws:Listing>
33
+ <aws:DataUrl type="navigable">http://www.sjgames.com/illuminati/</aws:DataUrl>
34
+ <aws:Title>Steve Jackson Games</aws:Title>
35
+ <aws:PopularityRank>59502</aws:PopularityRank>
36
+ <aws:Description>Official publishers site.</aws:Description>
37
+ </aws:Listing>
38
+ <aws:Listing>
39
+ <aws:DataUrl type="navigable">http://www.worldbridge.org/</aws:DataUrl>
40
+ <aws:Title>World Bridge Federation</aws:Title>
41
+ <aws:PopularityRank>64636</aws:PopularityRank>
42
+ <aws:Description>The official site of the body responsible for organizing world championships.</aws:Description>
43
+ </aws:Listing>
44
+ <aws:Listing>
45
+ <aws:DataUrl type="navigable">http://duncanbridgecenter.com/</aws:DataUrl>
46
+ <aws:Title>Duncan Bridge Center</aws:Title>
47
+ <aws:PopularityRank>66267</aws:PopularityRank>
48
+ <aws:Description>Offers schedules, results and information on the Coachella Valley Bridge Foundation.</aws:Description>
49
+ </aws:Listing>
50
+ <aws:Listing>
51
+ <aws:DataUrl type="navigable">http://www.bridgewebs.com/</aws:DataUrl>
52
+ <aws:Title>BridgeWebs</aws:Title>
53
+ <aws:PopularityRank>76726</aws:PopularityRank>
54
+ <aws:Description>Enables bridge clubs and associations to provide a web site complete with calendar, news and results service. Offers interface with scoring and dealing programs.</aws:Description>
55
+ </aws:Listing>
56
+ <aws:Listing>
57
+ <aws:DataUrl type="navigable">http://www.ecatsbridge.com/</aws:DataUrl>
58
+ <aws:Title>ECatsBridge</aws:Title>
59
+ <aws:PopularityRank>95359</aws:PopularityRank>
60
+ <aws:Description>Provides news, events, documents, links, virtual club pages and simultaneous pairs service.</aws:Description>
61
+ </aws:Listing>
62
+ <aws:Listing>
63
+ <aws:DataUrl type="navigable">http://bridgeinindia.homestead.com/</aws:DataUrl>
64
+ <aws:Title>Bridge in India</aws:Title>
65
+ <aws:PopularityRank>99147</aws:PopularityRank>
66
+ <aws:AverageReview>3.5</aws:AverageReview>
67
+ <aws:Description>National and international events covered. Offers links, calendar, forum and articles.</aws:Description>
68
+ </aws:Listing>
69
+ <aws:Listing>
70
+ <aws:DataUrl type="navigable">http://www.setgame.com/set/index.html</aws:DataUrl>
71
+ <aws:Title>Set Enterprises</aws:Title>
72
+ <aws:PopularityRank>106470</aws:PopularityRank>
73
+ <aws:Description>Original publisher's site.</aws:Description>
74
+ </aws:Listing>
75
+ <aws:Listing>
76
+ <aws:DataUrl type="navigable">http://bridgeindia.com/</aws:DataUrl>
77
+ <aws:Title>Bridge in India</aws:Title>
78
+ <aws:PopularityRank>109157</aws:PopularityRank>
79
+ <aws:Description>Covers international bridge events, offering calendar, entry details and bulletins. Includes articles on theory and play, plus information on the Laws.</aws:Description>
80
+ </aws:Listing>
81
+ <aws:Listing>
82
+ <aws:DataUrl type="navigable">http://www.pagat.com/rummy/</aws:DataUrl>
83
+ <aws:Title>Pagat</aws:Title>
84
+ <aws:PopularityRank>110214</aws:PopularityRank>
85
+ <aws:Description>Resource with rules on many card games including a detailed section on Rummy games.</aws:Description>
86
+ </aws:Listing>
87
+ <aws:Listing>
88
+ <aws:DataUrl type="navigable">http://justsolitaire.com/</aws:DataUrl>
89
+ <aws:Title>Just Solitaire</aws:Title>
90
+ <aws:PopularityRank>111527</aws:PopularityRank>
91
+ <aws:Description>Description of 26 solitaire games, which can be played on the website. History of solitaire.</aws:Description>
92
+ </aws:Listing>
93
+ <aws:Listing>
94
+ <aws:DataUrl type="navigable">http://www.ebu.co.uk/</aws:DataUrl>
95
+ <aws:Title>English Bridge Union</aws:Title>
96
+ <aws:PopularityRank>117434</aws:PopularityRank>
97
+ <aws:Description>Organizes bridge in England. Provides schedule and results of national tournaments, bridge teaching programme, membership information. Official site.</aws:Description>
98
+ </aws:Listing>
99
+ <aws:Listing>
100
+ <aws:DataUrl type="navigable">http://rummy.com/</aws:DataUrl>
101
+ <aws:Title>Rummy</aws:Title>
102
+ <aws:PopularityRank>133384</aws:PopularityRank>
103
+ <aws:Description>Rules on Rummy games such as Gin Rummy and Rummy 500 with terms and scoring data.</aws:Description>
104
+ </aws:Listing>
105
+ <aws:Listing>
106
+ <aws:DataUrl type="navigable">http://www.bridgefederation.ch/</aws:DataUrl>
107
+ <aws:Title>Federation Suisse de Bridge</aws:Title>
108
+ <aws:PopularityRank>133774</aws:PopularityRank>
109
+ <aws:Description>Presents a calendar of tournaments and player rankings. Official site.</aws:Description>
110
+ </aws:Listing>
111
+ <aws:Listing>
112
+ <aws:DataUrl type="navigable">http://www.pattayabridge.com/</aws:DataUrl>
113
+ <aws:Title>Pattaya Bridge Club</aws:Title>
114
+ <aws:PopularityRank>134879</aws:PopularityRank>
115
+ <aws:Description>A friendly bridge club that meets 3 times a week in Pattaya, Thailand, Asia. The web-site contains loads of bridge information, conventions, Notrump bidding etc. old and new.</aws:Description>
116
+ </aws:Listing>
117
+ <aws:Listing>
118
+ <aws:DataUrl type="navigable">http://www.eurobridge.org/</aws:DataUrl>
119
+ <aws:Title>European Bridge League</aws:Title>
120
+ <aws:PopularityRank>153237</aws:PopularityRank>
121
+ <aws:Description>A body composed of national organizations that organizes continent-wide events and represents European bridge at the world federation. Official site.</aws:Description>
122
+ </aws:Listing>
123
+ <aws:Listing>
124
+ <aws:DataUrl type="navigable">http://ginrummy.com/</aws:DataUrl>
125
+ <aws:Title>Gin Rummy</aws:Title>
126
+ <aws:PopularityRank>156913</aws:PopularityRank>
127
+ <aws:Description>Guide to Gin Rummy rules and variations with info on how to keep score in gin.</aws:Description>
128
+ </aws:Listing>
129
+ <aws:Listing>
130
+ <aws:DataUrl type="navigable">http://www.bridgeblogging.com/</aws:DataUrl>
131
+ <aws:Title>Bridge Blogging</aws:Title>
132
+ <aws:PopularityRank>159816</aws:PopularityRank>
133
+ <aws:Description>Collects the blogs of several notable bridge writers, including Bobby Wolff; posts "Aces on Bridge" column online.</aws:Description>
134
+ </aws:Listing>
135
+ </aws:Listings>
136
+ <aws:ReviewersRaveListings/>
137
+ </aws:CategoryListings>
138
+ </aws:Alexa></aws:CategoryListingsResult><aws:ResponseStatus xmlns:aws="http://alexa.amazonaws.com/doc/2005-07-11/"><aws:StatusCode>Success</aws:StatusCode></aws:ResponseStatus></aws:Response></aws:CategoryListingsResponse>
@@ -0,0 +1,24 @@
1
+ HTTP/1.1 200 OK
2
+ Server: Apache-Coyote/1.1
3
+ Content-Type: text/xml
4
+ Transfer-Encoding: chunked
5
+ Date: Wed, 08 Aug 2012 09:12:13 GMT
6
+
7
+ <?xml version="1.0"?>
8
+ <aws:SitesLinkingInResponse xmlns:aws="http://alexa.amazonaws.com/doc/2005-07-11/"><aws:Response xmlns:aws="http://awis.amazonaws.com/doc/2005-07-11"><aws:OperationRequest><aws:RequestId>abb553a3-035f-8d12-f353-40532a087b52</aws:RequestId></aws:OperationRequest><aws:SitesLinkingInResult><aws:Alexa>
9
+
10
+ <aws:SitesLinkingIn>
11
+ <aws:Site>
12
+ <aws:Title>google.com</aws:Title>
13
+ <aws:Url>code.google.com:80/a/eclipselabs.org/p/m2eclipse-android-integration</aws:Url>
14
+ </aws:Site>
15
+ <aws:Site>
16
+ <aws:Title>youtube.com</aws:Title>
17
+ <aws:Url>youtube.com:80</aws:Url>
18
+ </aws:Site>
19
+ <aws:Site>
20
+ <aws:Title>yahoo.com</aws:Title>
21
+ <aws:Url>answers.yahoo.com:80/question/index?qid=20100925181127AAFmizQ</aws:Url>
22
+ </aws:Site>
23
+ </aws:SitesLinkingIn>
24
+ </aws:Alexa></aws:SitesLinkingInResult><aws:ResponseStatus xmlns:aws="http://alexa.amazonaws.com/doc/2005-07-11/"><aws:StatusCode>Success</aws:StatusCode></aws:ResponseStatus></aws:Response></aws:SitesLinkingInResponse>
@@ -0,0 +1,37 @@
1
+ HTTP/1.1 200 OK
2
+ Server: Apache-Coyote/1.1
3
+ Content-Type: text/xml
4
+ Transfer-Encoding: chunked
5
+ Date: Wed, 08 Aug 2012 13:42:33 GMT
6
+
7
+ <?xml version="1.0"?>
8
+ <aws:TrafficHistoryResponse xmlns:aws="http://alexa.amazonaws.com/doc/2005-10-05/">
9
+ <aws:Response xmlns:aws="http://awis.amazonaws.com/doc/2005-07-11">
10
+ <aws:OperationRequest><aws:RequestId>39ab4736-ec1a-492d-924b-d0d768d2692d</aws:RequestId>
11
+ </aws:OperationRequest>
12
+ <aws:TrafficHistoryResult>
13
+ <aws:Alexa>
14
+ <aws:TrafficHistory>
15
+ <aws:Range>31</aws:Range>
16
+ <aws:Site>amazon.com</aws:Site>
17
+ <aws:Start>2005-01-01</aws:Start>
18
+ <aws:HistoricalData>
19
+ <aws:Data>
20
+ <aws:Date>2005-01-01</aws:Date>
21
+ <aws:PageViews>
22
+ <aws:PerMillion>2801</aws:PerMillion>
23
+ <aws:PerUser>5.0</aws:PerUser>
24
+ </aws:PageViews>
25
+ <aws:Rank>18</aws:Rank>
26
+ <aws:Reach>
27
+ <aws:PerMillion>26041</aws:PerMillion>
28
+ </aws:Reach>
29
+ </aws:Data>
30
+ </aws:HistoricalData>
31
+ </aws:TrafficHistory>
32
+ </aws:Alexa>
33
+ </aws:TrafficHistoryResult>
34
+ <aws:ResponseStatus xmlns:aws="http://alexa.amazonaws.com/doc/2005-10-05/">
35
+ <aws:StatusCode>Success</aws:StatusCode>
36
+ </aws:ResponseStatus></aws:Response>
37
+ </aws:TrafficHistoryResponse>
@@ -0,0 +1,8 @@
1
+ HTTP/1.1 200 OK
2
+ Server: Apache-Coyote/1.1
3
+ Content-Type: text/xml
4
+ Transfer-Encoding: chunked
5
+ Date: Wed, 08 Aug 2012 16:30:55 GMT
6
+
7
+ <?xml version="1.0"?>
8
+ <aws:TrafficHistoryResponse xmlns:aws="http://alexa.amazonaws.com/doc/2005-07-11/"><aws:Response><aws:ResponseStatus><aws:StatusCode>AlexaError</aws:StatusCode><aws:StatusMessage>Request could not be execute due to an Alexa error</aws:StatusMessage></aws:ResponseStatus></aws:Response></aws:TrafficHistoryResponse>
data/test/helper.rb CHANGED
@@ -1,23 +1,21 @@
1
- require "bundler/setup"
2
-
3
1
  require "minitest/autorun"
4
- require "fakeweb"
2
+ require "webmock/minitest"
5
3
  require "mocha"
6
4
 
7
5
  require "alexa"
8
6
 
9
- alexa_xml_parser = ENV["ALEXA_XML_PARSER"] || "rexml"
7
+ xml_parser = ENV["XML_PARSER"] || "libxml"
10
8
 
11
- require alexa_xml_parser if ["nokogiri", "libxml", "ox"].include?(alexa_xml_parser)
12
- MultiXml.parser = alexa_xml_parser
9
+ require xml_parser if ["nokogiri", "libxml", "ox"].include?(xml_parser)
10
+ MultiXml.parser = xml_parser
13
11
 
14
12
  class MiniTest::Unit::TestCase
15
13
  def setup
16
- FakeWeb.allow_net_connect = false
14
+ WebMock.disable_net_connect!
17
15
  end
18
16
 
19
17
  # Recording response is as simple as writing in terminal:
20
- # curl -is "http://awis.amazonaws.com/?Action=UrlInfo&AWSAccessKeyId=fake" -X GET > response.txt
18
+ # curl -is -X GET "http://awis.amazonaws.com/?Action=UrlInfo&AWSAccessKeyId=fake" > response.txt
21
19
  def fixture(filename)
22
20
  File.read(File.join("test", "fixtures", filename))
23
21
  end
@@ -0,0 +1,54 @@
1
+ require "helper"
2
+
3
+ describe Alexa::Utils do
4
+ describe "#safe_retrieve" do
5
+ it "returns nested hash value" do
6
+ hash = {:first => {:second => {:third => "Value!"}}}
7
+ assert_equal "Value!", Alexa::Utils.safe_retrieve(hash, :first, :second, :third)
8
+ end
9
+
10
+ it "returns partial hash when not all keys given" do
11
+ hash = {:first => {:second => {:third => "Value!"}}}
12
+ assert_equal({:third => "Value!"}, Alexa::Utils.safe_retrieve(hash, :first, :second))
13
+ end
14
+
15
+ it "returns nil when key not found in hash" do
16
+ hash = {:first => {:second => {:third => "Value!"}}}
17
+ assert_nil Alexa::Utils.safe_retrieve(hash, :non_exisiting)
18
+ end
19
+
20
+ it "returns nil when one of keys not found in hash" do
21
+ hash = {:first => {:second => {:third => "Value!"}}}
22
+ assert_nil Alexa::Utils.safe_retrieve(hash, :first, :non_exisiting)
23
+ end
24
+
25
+ it "returns nil when given more keys than present in hash" do
26
+ hash = {:first => {:second => {:third => "Value!"}}}
27
+ assert_nil Alexa::Utils.safe_retrieve(hash, :first, :second, :third, :fourth)
28
+ end
29
+
30
+ it "returns nil when non hash object given" do
31
+ assert_nil Alexa::Utils.safe_retrieve("And Now for Something Completely Different")
32
+ end
33
+
34
+ it "returns nil when no keys given" do
35
+ hash = {:first => {:second => {:third => "Value!"}}}
36
+ assert_nil Alexa::Utils.safe_retrieve(hash)
37
+ end
38
+
39
+ it "does not return incidental value" do
40
+ hash = {nil => "value"}
41
+ assert_nil Alexa::Utils.safe_retrieve(hash)
42
+ end
43
+ end
44
+
45
+ describe "#camelize" do
46
+ it "uppercases word" do
47
+ assert_equal "Big", Alexa::Utils.camelize("big")
48
+ end
49
+
50
+ it "removes underscores" do
51
+ assert_equal "BigBen", Alexa::Utils.camelize("big_ben")
52
+ end
53
+ end
54
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alexa
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-02 00:00:00.000000000 Z
12
+ date: 2012-08-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: multi_xml
@@ -44,7 +44,7 @@ dependencies:
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
46
  - !ruby/object:Gem::Dependency
47
- name: fakeweb
47
+ name: webmock
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  none: false
50
50
  requirements:
@@ -74,30 +74,40 @@ files:
74
74
  - Rakefile
75
75
  - alexa.gemspec
76
76
  - lib/alexa.rb
77
- - lib/alexa/url_info.rb
77
+ - lib/alexa/api/category_browse.rb
78
+ - lib/alexa/api/category_listings.rb
79
+ - lib/alexa/api/sites_linking_in.rb
80
+ - lib/alexa/api/traffic_history.rb
81
+ - lib/alexa/api/url_info.rb
82
+ - lib/alexa/client.rb
83
+ - lib/alexa/connection.rb
84
+ - lib/alexa/exceptions.rb
85
+ - lib/alexa/utils.rb
78
86
  - lib/alexa/version.rb
79
- - test/config_test.rb
80
- - test/fixtures/custom-response-group.txt
81
- - test/fixtures/empty_group.txt
87
+ - test/api/category_browse_test.rb
88
+ - test/api/category_listings_test.rb
89
+ - test/api/sites_linking_in_test.rb
90
+ - test/api/traffic_history_test.rb
91
+ - test/api/url_info_test.rb
92
+ - test/client_test.rb
93
+ - test/connection_test.rb
94
+ - test/fixtures/bad_request.txt
95
+ - test/fixtures/category_browse/card_games.txt
96
+ - test/fixtures/category_listings/card_games.txt
82
97
  - test/fixtures/forbidden.txt
83
- - test/fixtures/github_full.txt
84
- - test/fixtures/github_rank.txt
98
+ - test/fixtures/sites_linking_in/github_count_3.txt
99
+ - test/fixtures/traffic_history/alexa_example.txt
100
+ - test/fixtures/traffic_history/github_range_2.txt
85
101
  - test/fixtures/unathorized.txt
102
+ - test/fixtures/url_info/custom-response-group.txt
103
+ - test/fixtures/url_info/empty_group.txt
104
+ - test/fixtures/url_info/github_full.txt
105
+ - test/fixtures/url_info/github_rank.txt
86
106
  - test/helper.rb
87
- - test/url_info_test.rb
107
+ - test/utils_test.rb
88
108
  homepage: https://github.com/morgoth/alexa
89
109
  licenses: []
90
- post_install_message: ! '
91
-
92
-
93
- Gem syntax of 0.4 version of this gem will change with backward incompatibilities.
94
-
95
- If you don''t want to update your code, please specify in your Gemfile:
96
-
97
- gem "alexa", "~> 0.3.0"
98
-
99
-
100
- '
110
+ post_install_message:
101
111
  rdoc_options: []
102
112
  require_paths:
103
113
  - lib
@@ -109,7 +119,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
109
119
  version: '0'
110
120
  segments:
111
121
  - 0
112
- hash: 2191053239788630908
122
+ hash: 3321764807879107613
113
123
  required_rubygems_version: !ruby/object:Gem::Requirement
114
124
  none: false
115
125
  requirements:
@@ -118,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
118
128
  version: '0'
119
129
  segments:
120
130
  - 0
121
- hash: 2191053239788630908
131
+ hash: 3321764807879107613
122
132
  requirements: []
123
133
  rubyforge_project:
124
134
  rubygems_version: 1.8.24
@@ -1,109 +0,0 @@
1
- class Alexa::UrlInfo
2
- API_VERSION = "2005-07-11"
3
- HOST = "awis.amazonaws.com"
4
- RESPONSE_GROUP = "Rank,ContactInfo,AdultContent,Speed,Language,Keywords,OwnedDomains,LinksInCount,SiteData,RelatedLinks,RankByCountry,RankByCity,UsageStats"
5
-
6
- attr_accessor :host, :response_group
7
- attr_reader :xml_response, :rank, :data_url, :site_title, :site_description, :language_locale, :language_encoding,
8
- :links_in_count, :keywords, :related_links, :speed_median_load_time, :speed_percentile,
9
- :rank_by_country, :rank_by_city, :usage_statistics
10
-
11
- def initialize(options = {})
12
- Alexa.access_key_id = options.fetch(:access_key_id, Alexa.access_key_id)
13
- Alexa.secret_access_key = options.fetch(:secret_access_key, Alexa.secret_access_key)
14
- raise ArgumentError.new("You must specify access_key_id") if Alexa.access_key_id.nil?
15
- raise ArgumentError.new("You must specify secret_access_key") if Alexa.secret_access_key.nil?
16
- self.host = options[:host] or raise ArgumentError.new("You must specify host")
17
- self.response_group = options.fetch(:response_group, RESPONSE_GROUP)
18
- end
19
-
20
- def connect
21
- response = Net::HTTP.start(url.host) do |http|
22
- http.get url.request_uri
23
- end
24
- @xml_response = handle_response(response).body
25
- end
26
-
27
- def parse_xml(xml)
28
- xml = MultiXml.parse(force_encoding(xml))
29
- group = response_group.split(",")
30
- alexa = xml["UrlInfoResponse"]["Response"]["UrlInfoResult"]["Alexa"]
31
- @rank = alexa["TrafficData"]["Rank"].to_i if group.include?("Rank") && !alexa["TrafficData"]["Rank"].nil?
32
- @data_url = alexa["TrafficData"]["DataUrl"]["__content__"] if group.include?("Rank")
33
- @rank_by_country = alexa["TrafficData"]["RankByCountry"]["Country"] if group.include?("RankByCountry") && !alexa["TrafficData"]["RankByCountry"].nil?
34
- @rank_by_city = alexa["TrafficData"]["RankByCity"]["City"] if group.include?("RankByCity") && !alexa["TrafficData"]["RankByCity"].nil?
35
- @usage_statistics = alexa["TrafficData"]["UsageStatistics"]["UsageStatistic"] if group.include?("UsageStats") && !alexa["TrafficData"]["UsageStatistics"].nil?
36
-
37
- @site_title = alexa["ContentData"]["SiteData"]["Title"] if group.include?("SiteData")
38
- @site_description = alexa["ContentData"]["SiteData"]["Description"] if group.include?("SiteData")
39
- @language_locale = alexa["ContentData"]["Language"]["Locale"] if group.include?("Language") && !alexa["ContentData"]["Language"].nil?
40
- @language_encoding = alexa["ContentData"]["Language"]["Encoding"] if group.include?("Language") && !alexa["ContentData"]["Language"].nil?
41
- @links_in_count = alexa["ContentData"]["LinksInCount"].to_i if group.include?("LinksInCount") && !alexa["ContentData"]["LinksInCount"].nil?
42
- @keywords = alexa["ContentData"]["Keywords"]["Keyword"] if group.include?("Keywords") && !alexa["ContentData"]["Keywords"].nil?
43
- @speed_median_load_time = alexa["ContentData"]["Speed"]["MedianLoadTime"].to_i if group.include?("Speed") && !alexa["ContentData"]["Speed"]["MedianLoadTime"].nil?
44
- @speed_percentile = alexa["ContentData"]["Speed"]["Percentile"].to_i if group.include?("Speed") && !alexa["ContentData"]["Speed"]["Percentile"].nil?
45
-
46
- @related_links = alexa["Related"]["RelatedLinks"]["RelatedLink"] if group.include?("RelatedLinks") && !alexa["Related"]["RelatedLinks"].nil?
47
- end
48
-
49
- private
50
-
51
- def timestamp
52
- @timestamp ||= Time::now.utc.strftime("%Y-%m-%dT%H:%M:%S.000Z")
53
- end
54
-
55
- def force_encoding(xml)
56
- if RUBY_VERSION >= "1.9"
57
- xml.force_encoding(Encoding::UTF_8)
58
- else
59
- xml
60
- end
61
- end
62
-
63
- def handle_response(response)
64
- case response.code.to_i
65
- when 200...300
66
- response
67
- when 300...600
68
- if response.body.nil?
69
- raise StandardError.new(response)
70
- else
71
- @xml_response = response.body
72
- xml = MultiXml.parse(@xml_response)
73
- message = xml["Response"]["Errors"]["Error"]["Message"]
74
- raise StandardError.new(message)
75
- end
76
- else
77
- raise StandardError.new("Unknown code: #{respnse.code}")
78
- end
79
- end
80
-
81
- def signature
82
- Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new("sha1"), Alexa.secret_access_key, sign)).strip
83
- end
84
-
85
- def url
86
- URI.parse("http://#{HOST}/?" + query + "&Signature=" + CGI::escape(signature))
87
- end
88
-
89
- def params_without_signature
90
- {
91
- "Action" => "UrlInfo",
92
- "AWSAccessKeyId" => Alexa.access_key_id,
93
- "ResponseGroup" => response_group,
94
- "SignatureMethod" => "HmacSHA1",
95
- "SignatureVersion" => "2",
96
- "Timestamp" => timestamp,
97
- "Url" => host,
98
- "Version" => API_VERSION
99
- }
100
- end
101
-
102
- def sign
103
- "GET\n" + HOST + "\n/\n" + query
104
- end
105
-
106
- def query
107
- params_without_signature.map { |key, value| "#{key}=#{CGI::escape(value)}" }.sort.join("&")
108
- end
109
- end