postrank-api 0.2.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +2 -0
- data/.rspec +0 -0
- data/Gemfile +3 -0
- data/Rakefile +7 -22
- data/lib/postrank-api/api.rb +40 -33
- data/lib/postrank-api/version.rb +5 -0
- data/postrank-api.gemspec +23 -56
- data/spec/api_spec.rb +11 -31
- metadata +46 -41
data/.gitignore
ADDED
data/.rspec
ADDED
File without changes
|
data/Gemfile
ADDED
data/Rakefile
CHANGED
@@ -1,24 +1,9 @@
|
|
1
|
-
require '
|
1
|
+
require 'bundler'
|
2
|
+
Bundler::GemHelper.install_tasks
|
2
3
|
|
3
|
-
|
4
|
-
|
5
|
-
Jeweler::Tasks.new do |gemspec|
|
6
|
-
gemspec.name = "postrank-api"
|
7
|
-
gemspec.summary = "PostRank API Wrapper"
|
8
|
-
gemspec.description = gemspec.summary
|
9
|
-
gemspec.email = "ilya@igvita.com"
|
10
|
-
gemspec.homepage = "http://github.com/postrank/postrank-api"
|
11
|
-
gemspec.authors = ["Ilya Grigorik"]
|
12
|
-
gemspec.required_ruby_version = ">= 1.9.1"
|
13
|
-
gemspec.add_dependency('eventmachine', '>= 0.12.9')
|
14
|
-
gemspec.add_dependency('em-http-request')
|
15
|
-
gemspec.add_dependency('em-synchrony')
|
16
|
-
gemspec.add_dependency('yajl-ruby')
|
17
|
-
gemspec.add_dependency('chronic')
|
18
|
-
gemspec.rubyforge_project = "postrank-api"
|
19
|
-
end
|
4
|
+
require 'rspec'
|
5
|
+
require 'rspec/core/rake_task'
|
20
6
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
7
|
+
Rspec::Core::RakeTask.new do |t|
|
8
|
+
t.rspec_opts = '--color'
|
9
|
+
end
|
data/lib/postrank-api/api.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'em-synchrony'
|
2
2
|
require 'em-synchrony/em-http'
|
3
|
+
require 'postrank-uri'
|
3
4
|
|
4
5
|
require 'digest/md5'
|
5
6
|
require 'chronic'
|
@@ -7,8 +8,10 @@ require 'yajl'
|
|
7
8
|
|
8
9
|
module PostRank
|
9
10
|
class API
|
10
|
-
|
11
|
-
|
11
|
+
API_BASE = 'http://api.postrank.com'
|
12
|
+
V1_API_BASE = API_BASE + '/v1'
|
13
|
+
V2_API_BASE = API_BASE + '/v2'
|
14
|
+
V3_API_BASE = API_BASE + '/v3'
|
12
15
|
|
13
16
|
def initialize(appkey)
|
14
17
|
@appkey = appkey
|
@@ -41,20 +44,7 @@ module PostRank
|
|
41
44
|
}
|
42
45
|
}
|
43
46
|
|
44
|
-
http = get("#{
|
45
|
-
parse(http.response)
|
46
|
-
end
|
47
|
-
|
48
|
-
def recommendations(feeds, opts = {})
|
49
|
-
req = {
|
50
|
-
:query => {
|
51
|
-
:appkey => @appkey,
|
52
|
-
:num => opts[:num] || 10
|
53
|
-
},
|
54
|
-
:body => build_body(feeds, 'feed')
|
55
|
-
}
|
56
|
-
|
57
|
-
http = post("#{V2_API_BASE}/recommend", req)
|
47
|
+
http = get("#{V3_API_BASE}/feed/", req)
|
58
48
|
parse(http.response)
|
59
49
|
end
|
60
50
|
|
@@ -65,10 +55,10 @@ module PostRank
|
|
65
55
|
req = {
|
66
56
|
:query => {
|
67
57
|
:appkey => @appkey,
|
68
|
-
:
|
69
|
-
:
|
58
|
+
:start_time => Chronic.parse(opts[:start_time]).to_i,
|
59
|
+
:end_time => Chronic.parse(opts[:end_time]).to_i
|
70
60
|
},
|
71
|
-
:body => build_body(
|
61
|
+
:body => build_body(posts, 'post_hash')
|
72
62
|
}
|
73
63
|
|
74
64
|
http = post("#{V2_API_BASE}/entry/metrics/historic", req)
|
@@ -87,7 +77,6 @@ module PostRank
|
|
87
77
|
parse(http.response)
|
88
78
|
end
|
89
79
|
|
90
|
-
|
91
80
|
def top_posts(feed, opts = {})
|
92
81
|
req = {
|
93
82
|
:query => {
|
@@ -98,7 +87,7 @@ module PostRank
|
|
98
87
|
}
|
99
88
|
}
|
100
89
|
|
101
|
-
http = get("#{
|
90
|
+
http = get("#{V3_API_BASE}/feed/topposts/", req)
|
102
91
|
parse(http.response)
|
103
92
|
end
|
104
93
|
|
@@ -156,19 +145,39 @@ module PostRank
|
|
156
145
|
:body => build_body(urls, 'url')
|
157
146
|
}
|
158
147
|
|
159
|
-
http = post("#{
|
148
|
+
http = post("#{V3_API_BASE}/entry/metrics", req)
|
160
149
|
parse(http.response).inject({}) do |hash, v|
|
161
150
|
hash[reverse[v[0]]] = v[1]
|
162
151
|
hash
|
163
152
|
end
|
164
153
|
end
|
165
154
|
|
155
|
+
def top_posts(feed, opts = {})
|
156
|
+
req = {
|
157
|
+
:query => {
|
158
|
+
:appkey => @appkey,
|
159
|
+
:q => opts[:q] || '',
|
160
|
+
:num => opts[:num] || 10,
|
161
|
+
:id => feed
|
162
|
+
}
|
163
|
+
}
|
164
|
+
|
165
|
+
http = get("#{V3_API_BASE}/feed/topposts/", req)
|
166
|
+
parse(http.response)
|
167
|
+
end
|
168
|
+
|
166
169
|
private
|
167
170
|
|
168
171
|
def parse(data)
|
169
172
|
begin
|
170
|
-
Yajl::Parser.parse(data)
|
171
|
-
|
173
|
+
data = Yajl::Parser.parse(data)
|
174
|
+
|
175
|
+
if msg = data['error']
|
176
|
+
raise Exception.new(msg)
|
177
|
+
end
|
178
|
+
|
179
|
+
data
|
180
|
+
rescue Yajl::ParseError => e
|
172
181
|
puts "Failed to parse request:"
|
173
182
|
puts e.message
|
174
183
|
puts e.backtrace[0, 5].join("\n")
|
@@ -176,7 +185,13 @@ module PostRank
|
|
176
185
|
end
|
177
186
|
|
178
187
|
def build_body(urls, key)
|
179
|
-
[urls].flatten.map
|
188
|
+
[urls].flatten.map do |e|
|
189
|
+
if key == "url" && e !~ /\w{32}/
|
190
|
+
e = PostRank::URI.clean(e)
|
191
|
+
end
|
192
|
+
|
193
|
+
"#{key}[]=#{e}"
|
194
|
+
end.join("&")
|
180
195
|
end
|
181
196
|
|
182
197
|
def post(url, req)
|
@@ -187,14 +202,6 @@ module PostRank
|
|
187
202
|
dispatch(:get, url, req)
|
188
203
|
end
|
189
204
|
|
190
|
-
def build_body(urls, key)
|
191
|
-
[urls].flatten.map { |e| "#{key}[]=#{e}" }.join("&")
|
192
|
-
end
|
193
|
-
|
194
|
-
def post(url, req)
|
195
|
-
dispatch(:post, url, req)
|
196
|
-
end
|
197
|
-
|
198
205
|
def dispatch(method, url, req)
|
199
206
|
if EM.reactor_running?
|
200
207
|
http = EM::HttpRequest.new(url).send(method, req)
|
data/postrank-api.gemspec
CHANGED
@@ -1,63 +1,30 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "postrank-api/version"
|
5
4
|
|
6
5
|
Gem::Specification.new do |s|
|
7
|
-
s.name
|
8
|
-
s.version
|
6
|
+
s.name = "postrank-api"
|
7
|
+
s.version = PostRank::API::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Ilya Grigorik"]
|
10
|
+
s.email = ["ilya@igvita.com"]
|
11
|
+
s.homepage = "http://github.com/postrank-labs/postrank-api"
|
12
|
+
s.summary = "Ruby 1.9 PostRank API Wrapper"
|
13
|
+
s.description = s.summary
|
9
14
|
|
10
|
-
s.
|
11
|
-
s.authors = ["Ilya Grigorik"]
|
12
|
-
s.date = %q{2010-12-15}
|
13
|
-
s.description = %q{PostRank API Wrapper}
|
14
|
-
s.email = %q{ilya@igvita.com}
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
"README.md"
|
17
|
-
]
|
18
|
-
s.files = [
|
19
|
-
"README.md",
|
20
|
-
"Rakefile",
|
21
|
-
"VERSION",
|
22
|
-
"lib/postrank-api.rb",
|
23
|
-
"lib/postrank-api/api.rb",
|
24
|
-
"postrank-api.gemspec",
|
25
|
-
"spec/api_spec.rb"
|
26
|
-
]
|
27
|
-
s.homepage = %q{http://github.com/postrank/postrank-api}
|
28
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
29
|
-
s.require_paths = ["lib"]
|
30
|
-
s.required_ruby_version = Gem::Requirement.new(">= 1.9.1")
|
31
|
-
s.rubyforge_project = %q{postrank-api}
|
32
|
-
s.rubygems_version = %q{1.3.7}
|
33
|
-
s.summary = %q{PostRank API Wrapper}
|
34
|
-
s.test_files = [
|
35
|
-
"spec/api_spec.rb"
|
36
|
-
]
|
15
|
+
s.rubyforge_project = "postrank-api"
|
37
16
|
|
38
|
-
|
39
|
-
|
40
|
-
|
17
|
+
s.add_dependency "postrank-uri"
|
18
|
+
s.add_dependency "eventmachine"
|
19
|
+
s.add_dependency "em-http-request"
|
20
|
+
s.add_dependency "em-synchrony"
|
21
|
+
s.add_dependency "yajl-ruby"
|
22
|
+
s.add_dependency "chronic"
|
41
23
|
|
42
|
-
|
43
|
-
s.add_runtime_dependency(%q<eventmachine>, [">= 0.12.9"])
|
44
|
-
s.add_runtime_dependency(%q<em-http-request>, [">= 0"])
|
45
|
-
s.add_runtime_dependency(%q<em-synchrony>, [">= 0"])
|
46
|
-
s.add_runtime_dependency(%q<yajl-ruby>, [">= 0"])
|
47
|
-
s.add_runtime_dependency(%q<chronic>, [">= 0"])
|
48
|
-
else
|
49
|
-
s.add_dependency(%q<eventmachine>, [">= 0.12.9"])
|
50
|
-
s.add_dependency(%q<em-http-request>, [">= 0"])
|
51
|
-
s.add_dependency(%q<em-synchrony>, [">= 0"])
|
52
|
-
s.add_dependency(%q<yajl-ruby>, [">= 0"])
|
53
|
-
s.add_dependency(%q<chronic>, [">= 0"])
|
54
|
-
end
|
55
|
-
else
|
56
|
-
s.add_dependency(%q<eventmachine>, [">= 0.12.9"])
|
57
|
-
s.add_dependency(%q<em-http-request>, [">= 0"])
|
58
|
-
s.add_dependency(%q<em-synchrony>, [">= 0"])
|
59
|
-
s.add_dependency(%q<yajl-ruby>, [">= 0"])
|
60
|
-
s.add_dependency(%q<chronic>, [">= 0"])
|
61
|
-
end
|
62
|
-
end
|
24
|
+
s.add_development_dependency "rspec"
|
63
25
|
|
26
|
+
s.files = `git ls-files`.split("\n")
|
27
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
28
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
29
|
+
s.require_paths = ["lib"]
|
30
|
+
end
|
data/spec/api_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'rspec'
|
2
2
|
require 'lib/postrank-api'
|
3
3
|
require 'pp'
|
4
4
|
|
@@ -70,28 +70,6 @@ describe PostRank::API do
|
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
-
describe "Recommendations API" do
|
74
|
-
|
75
|
-
it "should fetch recommendations for a single feed" do
|
76
|
-
EM.synchrony do
|
77
|
-
resp = api.recommendations(IGVITA)
|
78
|
-
resp.class.should == Array
|
79
|
-
EM.stop
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
it "should fetch recommendation for a set of feeds" do
|
84
|
-
EM.synchrony do
|
85
|
-
resp = api.recommendations([IGVITA, EVERBURNING], :num => 1)
|
86
|
-
|
87
|
-
resp.class.should == Array
|
88
|
-
resp.size.should == 1
|
89
|
-
|
90
|
-
EM.stop
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
73
|
describe "Top Posts API" do
|
96
74
|
it "should fetch top posts for a feed" do
|
97
75
|
EM.synchrony do
|
@@ -106,18 +84,19 @@ describe PostRank::API do
|
|
106
84
|
end
|
107
85
|
end
|
108
86
|
|
109
|
-
|
87
|
+
describe "Metrics Versioned API" do
|
110
88
|
it "should fetch metrics for a single post" do
|
111
89
|
EM.synchrony do
|
112
|
-
met = api.metrics_versioned('
|
90
|
+
met = api.metrics_versioned('cd116fcfb7df471e3a2ba2065b3499bb', {:start_time => '5 years ago'})
|
113
91
|
met.class.should == Hash
|
114
92
|
met.keys.size.should == 1
|
115
93
|
EM.stop
|
116
94
|
end
|
117
95
|
end
|
96
|
+
|
118
97
|
it "should fetch metrics for multiple posts" do
|
119
98
|
EM.synchrony do
|
120
|
-
met = api.metrics_versioned(['b0432f947bc0d44766d046bfc3c15043', 'a020c1c3a5b2aef1ab4a7307cf3d2cb6'], {:
|
99
|
+
met = api.metrics_versioned(['b0432f947bc0d44766d046bfc3c15043', 'a020c1c3a5b2aef1ab4a7307cf3d2cb6'], {:start_time => '5 years ago', :end_time => 'today'})
|
121
100
|
met.class.should == Hash
|
122
101
|
met.keys.size.should == 2
|
123
102
|
EM.stop
|
@@ -128,18 +107,19 @@ describe PostRank::API do
|
|
128
107
|
describe "Postrank API" do
|
129
108
|
it "should fetch postrank with respect to provided urls" do
|
130
109
|
EM.synchrony do
|
131
|
-
|
132
|
-
|
133
|
-
|
110
|
+
pr = api.postrank(['http://www.igvita.com/2008/06/19/splunk-your-distributed-logs-in-ec2/', 'http://www.igvita.com/2008/02/11/nginx-and-memcached-a-400-boost/'])
|
111
|
+
pr.class.should == Hash
|
112
|
+
pr.keys.size.should == 2
|
134
113
|
EM.stop
|
135
|
-
|
114
|
+
end
|
136
115
|
end
|
116
|
+
|
137
117
|
it "should fetch postrank with respect specific feeds" do
|
138
118
|
EM.synchrony do
|
139
119
|
pr = api.postrank(['http://www.igvita.com/2008/06/19/splunk-your-distributed-logs-in-ec2/', 'http://www.igvita.com/2008/02/11/nginx-and-memcached-a-400-boost/'], ['421df2d86ab95100de7dcc2e247a08ab'])
|
140
120
|
pr.class.should == Hash
|
141
121
|
pr.keys.size.should == 2
|
142
|
-
|
122
|
+
EM.stop
|
143
123
|
end
|
144
124
|
end
|
145
125
|
end
|
metadata
CHANGED
@@ -1,12 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: postrank-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 2
|
8
|
-
- 0
|
9
|
-
version: 0.2.0
|
4
|
+
prerelease:
|
5
|
+
version: 0.4.0
|
10
6
|
platform: ruby
|
11
7
|
authors:
|
12
8
|
- Ilya Grigorik
|
@@ -14,99 +10,114 @@ autorequire:
|
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
12
|
|
17
|
-
date:
|
13
|
+
date: 2011-03-31 00:00:00 -04:00
|
18
14
|
default_executable:
|
19
15
|
dependencies:
|
20
16
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
17
|
+
name: postrank-uri
|
22
18
|
prerelease: false
|
23
19
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
20
|
none: false
|
25
21
|
requirements:
|
26
22
|
- - ">="
|
27
23
|
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
- 0
|
30
|
-
- 12
|
31
|
-
- 9
|
32
|
-
version: 0.12.9
|
24
|
+
version: "0"
|
33
25
|
type: :runtime
|
34
26
|
version_requirements: *id001
|
35
27
|
- !ruby/object:Gem::Dependency
|
36
|
-
name:
|
28
|
+
name: eventmachine
|
37
29
|
prerelease: false
|
38
30
|
requirement: &id002 !ruby/object:Gem::Requirement
|
39
31
|
none: false
|
40
32
|
requirements:
|
41
33
|
- - ">="
|
42
34
|
- !ruby/object:Gem::Version
|
43
|
-
segments:
|
44
|
-
- 0
|
45
35
|
version: "0"
|
46
36
|
type: :runtime
|
47
37
|
version_requirements: *id002
|
48
38
|
- !ruby/object:Gem::Dependency
|
49
|
-
name: em-
|
39
|
+
name: em-http-request
|
50
40
|
prerelease: false
|
51
41
|
requirement: &id003 !ruby/object:Gem::Requirement
|
52
42
|
none: false
|
53
43
|
requirements:
|
54
44
|
- - ">="
|
55
45
|
- !ruby/object:Gem::Version
|
56
|
-
segments:
|
57
|
-
- 0
|
58
46
|
version: "0"
|
59
47
|
type: :runtime
|
60
48
|
version_requirements: *id003
|
61
49
|
- !ruby/object:Gem::Dependency
|
62
|
-
name:
|
50
|
+
name: em-synchrony
|
63
51
|
prerelease: false
|
64
52
|
requirement: &id004 !ruby/object:Gem::Requirement
|
65
53
|
none: false
|
66
54
|
requirements:
|
67
55
|
- - ">="
|
68
56
|
- !ruby/object:Gem::Version
|
69
|
-
segments:
|
70
|
-
- 0
|
71
57
|
version: "0"
|
72
58
|
type: :runtime
|
73
59
|
version_requirements: *id004
|
74
60
|
- !ruby/object:Gem::Dependency
|
75
|
-
name:
|
61
|
+
name: yajl-ruby
|
76
62
|
prerelease: false
|
77
63
|
requirement: &id005 !ruby/object:Gem::Requirement
|
78
64
|
none: false
|
79
65
|
requirements:
|
80
66
|
- - ">="
|
81
67
|
- !ruby/object:Gem::Version
|
82
|
-
segments:
|
83
|
-
- 0
|
84
68
|
version: "0"
|
85
69
|
type: :runtime
|
86
70
|
version_requirements: *id005
|
87
|
-
|
88
|
-
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: chronic
|
73
|
+
prerelease: false
|
74
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: "0"
|
80
|
+
type: :runtime
|
81
|
+
version_requirements: *id006
|
82
|
+
- !ruby/object:Gem::Dependency
|
83
|
+
name: rspec
|
84
|
+
prerelease: false
|
85
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
86
|
+
none: false
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: "0"
|
91
|
+
type: :development
|
92
|
+
version_requirements: *id007
|
93
|
+
description: Ruby 1.9 PostRank API Wrapper
|
94
|
+
email:
|
95
|
+
- ilya@igvita.com
|
89
96
|
executables: []
|
90
97
|
|
91
98
|
extensions: []
|
92
99
|
|
93
|
-
extra_rdoc_files:
|
94
|
-
|
100
|
+
extra_rdoc_files: []
|
101
|
+
|
95
102
|
files:
|
103
|
+
- .gitignore
|
104
|
+
- .rspec
|
105
|
+
- Gemfile
|
96
106
|
- README.md
|
97
107
|
- Rakefile
|
98
108
|
- VERSION
|
99
109
|
- lib/postrank-api.rb
|
100
110
|
- lib/postrank-api/api.rb
|
111
|
+
- lib/postrank-api/version.rb
|
101
112
|
- postrank-api.gemspec
|
102
113
|
- spec/api_spec.rb
|
103
114
|
has_rdoc: true
|
104
|
-
homepage: http://github.com/postrank/postrank-api
|
115
|
+
homepage: http://github.com/postrank-labs/postrank-api
|
105
116
|
licenses: []
|
106
117
|
|
107
118
|
post_install_message:
|
108
|
-
rdoc_options:
|
109
|
-
|
119
|
+
rdoc_options: []
|
120
|
+
|
110
121
|
require_paths:
|
111
122
|
- lib
|
112
123
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -114,25 +125,19 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
114
125
|
requirements:
|
115
126
|
- - ">="
|
116
127
|
- !ruby/object:Gem::Version
|
117
|
-
|
118
|
-
- 1
|
119
|
-
- 9
|
120
|
-
- 1
|
121
|
-
version: 1.9.1
|
128
|
+
version: "0"
|
122
129
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
130
|
none: false
|
124
131
|
requirements:
|
125
132
|
- - ">="
|
126
133
|
- !ruby/object:Gem::Version
|
127
|
-
segments:
|
128
|
-
- 0
|
129
134
|
version: "0"
|
130
135
|
requirements: []
|
131
136
|
|
132
137
|
rubyforge_project: postrank-api
|
133
|
-
rubygems_version: 1.
|
138
|
+
rubygems_version: 1.6.2
|
134
139
|
signing_key:
|
135
140
|
specification_version: 3
|
136
|
-
summary: PostRank API Wrapper
|
141
|
+
summary: Ruby 1.9 PostRank API Wrapper
|
137
142
|
test_files:
|
138
143
|
- spec/api_spec.rb
|