postrank-api 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -26,4 +26,13 @@ For complete documentation on all endpoints please see [PostRank API Docs](http:
26
26
  eng = api.engagement(igvita['id'], :start => 'yesterday')
27
27
 
28
28
  # lookup social metrics for a url
29
- metrics = api.metrics('http://www.igvita.com/')
29
+ metrics = api.metrics('http://www.igvita.com/')
30
+
31
+ # get recommended feeds
32
+ recommendations = api.recommendations(igvita['id'])
33
+
34
+ #lookup relative postranks for given posts
35
+ postrank = api.postrank(top['items'].collect!{|info| info['original_link']})
36
+
37
+ #lookup metrics history for a given post hash
38
+ history = api.postrank(top['items'].first['id'], :start => '1 month ago')
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.1.3
@@ -7,6 +7,7 @@ require 'yajl'
7
7
 
8
8
  module PostRank
9
9
  class API
10
+ V1_API_BASE = 'http://api.postrank.com/v1'
10
11
  V2_API_BASE = 'http://api.postrank.com/v2'
11
12
 
12
13
  def initialize(appkey)
@@ -44,6 +45,50 @@ module PostRank
44
45
  parse(http.response)
45
46
  end
46
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)
58
+ parse(http.response)
59
+ end
60
+
61
+ def metrics_versioned(posts, opts = {})
62
+
63
+ start_time = opts[:start] || 'yesterday'
64
+ end_time = opts[:end] || 'today'
65
+
66
+ req = {
67
+ :query => {
68
+ :appkey => @appkey,
69
+ :min_time => Chronic.parse(start_time).to_i,
70
+ :max_time => Chronic.parse(end_time).to_i
71
+ },
72
+ :body => build_body( posts, 'post_hash')
73
+ }
74
+
75
+ http = post("#{V2_API_BASE}/entry/metrics/historic", req)
76
+ parse(http.response)
77
+ end
78
+
79
+ def postrank(urls, feeds = [], opts = {})
80
+ req = {
81
+ :query => {
82
+ :appkey => @appkey,
83
+ :format => 'json',
84
+ },
85
+ :body => (build_body(urls, 'url'))+"&"+(build_body(feeds, 'feed_hash'))
86
+ }
87
+ http = post("#{V1_API_BASE}/postrank", req)
88
+ parse(http.response)
89
+ end
90
+
91
+
47
92
  def top_posts(feed, opts = {})
48
93
  req = {
49
94
  :query => {
@@ -142,6 +187,14 @@ module PostRank
142
187
  dispatch(:get, url, req)
143
188
  end
144
189
 
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
+
145
198
  def dispatch(method, url, req)
146
199
  if EM.reactor_running?
147
200
  http = EM::HttpRequest.new(url).send(method, req)
@@ -153,5 +206,5 @@ module PostRank
153
206
  end
154
207
  http
155
208
  end
156
- end
157
209
  end
210
+ end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{postrank-api}
8
- s.version = "0.1.2"
8
+ s.version = "0.1.3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ilya Grigorik"]
12
- s.date = %q{2010-06-24}
12
+ s.date = %q{2010-07-28}
13
13
  s.description = %q{PostRank API Wrapper}
14
14
  s.email = %q{ilya@igvita.com}
15
15
  s.extra_rdoc_files = [
@@ -5,7 +5,6 @@ require 'pp'
5
5
  describe PostRank::API do
6
6
  IGVITA = '421df2d86ab95100de7dcc2e247a08ab'
7
7
  EVERBURNING = 'cb3e81ac96fb0ada1212dfce4f329474'
8
-
9
8
  let(:api) { PostRank::API.new('test') }
10
9
 
11
10
  it "should initialize with appkey" do
@@ -71,6 +70,28 @@ describe PostRank::API do
71
70
  end
72
71
  end
73
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
+
74
95
  describe "Top Posts API" do
75
96
  it "should fetch top posts for a feed" do
76
97
  EM.synchrony do
@@ -85,6 +106,44 @@ describe PostRank::API do
85
106
  end
86
107
  end
87
108
 
109
+ describe "Metrics Versioned API" do
110
+ it "should fetch metrics for a single post" do
111
+ EM.synchrony do
112
+ met = api.metrics_versioned('b0432f947bc0d44766d046bfc3c15043', {:start => '5 years ago', :end => 'today'})
113
+ met.class.should == Hash
114
+ met.keys.size.should == 1
115
+ EM.stop
116
+ end
117
+ end
118
+ it "should fetch metrics for multiple posts" do
119
+ EM.synchrony do
120
+ met = api.metrics_versioned(['b0432f947bc0d44766d046bfc3c15043', 'a020c1c3a5b2aef1ab4a7307cf3d2cb6'], {:start => '5 years ago', :end => 'today'})
121
+ met.class.should == Hash
122
+ met.keys.size.should == 2
123
+ EM.stop
124
+ end
125
+ end
126
+ end
127
+
128
+ describe "Postrank API" do
129
+ it "should fetch postrank with respect to provided urls" do
130
+ EM.synchrony do
131
+ 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/'])
132
+ pr.class.should == Hash
133
+ pr.keys.size.should == 2
134
+ EM.stop
135
+ end
136
+ end
137
+ it "should fetch postrank with respect specific feeds" do
138
+ EM.synchrony do
139
+ 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
+ pr.class.should == Hash
141
+ pr.keys.size.should == 2
142
+ EM.stop
143
+ end
144
+ end
145
+ end
146
+
88
147
  describe "Feed Engagement API" do
89
148
  it "should fetch engagement for a feed" do
90
149
  EM.synchrony do
@@ -169,7 +228,6 @@ describe PostRank::API do
169
228
 
170
229
  it "should invoke and kill EM reactor transparently" do
171
230
  metrics = api.metrics('1c1a5357e8bd00128db845b2595d5ebe')
172
-
173
231
  metrics.keys.size.should == 1
174
232
  metrics['1c1a5357e8bd00128db845b2595d5ebe'].class.should == Hash
175
233
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 2
9
- version: 0.1.2
8
+ - 3
9
+ version: 0.1.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Ilya Grigorik
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-06-24 00:00:00 -04:00
17
+ date: 2010-07-28 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency