otter-rb 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Jeff Smick
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,9 @@
1
+ otter-rb
2
+ ========
3
+
4
+ An EventMachine based library for the Topsy Otter API.
5
+
6
+ Copyright
7
+ ---------
8
+
9
+ Copyright (c) 2009 Jeff Smick. See LICENSE for details.
@@ -0,0 +1,28 @@
1
+ %w[
2
+ em-http
3
+ yajl
4
+
5
+ otter/connection
6
+ otter/response
7
+ otter/error
8
+
9
+ otter/base
10
+ otter/author
11
+ otter/post
12
+ otter/link
13
+ otter/count
14
+ otter/tag
15
+ otter/trackback
16
+ otter/topic
17
+ otter/urlinfo
18
+ ].each { |r| require r }
19
+
20
+ module Otter
21
+
22
+ def self.connect(identifier, &block)
23
+ EM.run {
24
+ yield Connection.new(identifier)
25
+ }
26
+ end
27
+
28
+ end
@@ -0,0 +1,45 @@
1
+ # "name" : "Barack Obama",
2
+ # "url" : "http://twitter.com/barackobama",
3
+ # "type" : "twitter",
4
+ # "nick" : "barackobama",
5
+ # "description" : "44th President of the United States",
6
+ # "topsy_author_url" : "http://topsy.com/twitter/barackobama",
7
+ # "influence_level" : "5"
8
+ module Otter
9
+
10
+ class Author < Base
11
+
12
+ def name
13
+ self.data['name']
14
+ end
15
+
16
+ def type
17
+ self.data['type']
18
+ end
19
+
20
+ def nick
21
+ self.data['nick']
22
+ end
23
+
24
+ def description
25
+ self.data['description']
26
+ end
27
+
28
+ def topsy_author_url
29
+ self.data['topsy_author_url']
30
+ end
31
+
32
+ def influence_level
33
+ self.data['influence_level']
34
+ end
35
+
36
+ def topsy_author_url
37
+ self.data['topsy_author_url']
38
+ end
39
+
40
+ def photo_url
41
+ self.data['photo_url']
42
+ end
43
+ end
44
+
45
+ end
@@ -0,0 +1,19 @@
1
+ module Otter
2
+
3
+ class Base
4
+ attr_reader :data
5
+
6
+ def self.create(data)
7
+ if data['list'].is_a?(Array)
8
+ data['list'].map { |d| self.new(d) }
9
+ else
10
+ self.new(data)
11
+ end
12
+ end
13
+
14
+ def initialize(data)
15
+ @data = data
16
+ end
17
+ end
18
+
19
+ end
@@ -0,0 +1,93 @@
1
+ module Otter
2
+
3
+ class Connection
4
+ def initialize(identifier)
5
+ @identifier = identifier
6
+ end
7
+
8
+ def authorinfo(username, &block)
9
+ self.request('authorinfo', {:url => "http://twitter.com/#{username}"}, Author, block)
10
+ end
11
+
12
+ def authorsearch(query, window = 'a', page = nil, perpage = nil, &block)
13
+ self.request('authorsearch', {:q => query, :window => window}, Author, block, page, perpage)
14
+ end
15
+
16
+ def linkposts(url, contains = nil, page = nil, perpage = nil, &block)
17
+ self.request('linkposts', {:url => url, :contains => contains}, Post, block, page, perpage)
18
+ end
19
+
20
+ def linkpostcount(url, contains = nil, &block)
21
+ self.request('linkpostcount', {:url => url, :contains => contains}, Base, lambda { |response, base|
22
+ if response.is_a?(Error)
23
+ block.call response
24
+ else
25
+ block.call response, Integer(base.data['contains']), Integer(base.data['all'])
26
+ end
27
+ })
28
+ end
29
+
30
+ def profilesearch(query, page = nil, perpage = nil, &block)
31
+ self.request('profilesearch', {:q => query}, Author, block, page, perpage)
32
+ end
33
+
34
+ def related(url, page = nil, perpage = nil, &block)
35
+ self.request('related', {:url => url}, Link, block, page, perpage)
36
+ end
37
+
38
+ def search(query, window = 'a', page = nil, perpage = nil, &block)
39
+ self.request('search', {:q => query, :window => window}, Link, block, page, perpage)
40
+ end
41
+
42
+ def searchcount(query, &block)
43
+ self.request('searchcount', {:q => query}, Count, block)
44
+ end
45
+
46
+ def stats(url, contains = nil, &block)
47
+ self.request('stats', {:url => url, :contains => contains}, Base, lambda { |response, base|
48
+ if response.is_a?(Error)
49
+ block.call response
50
+ else
51
+ block.call( response,
52
+ base.data['topsy_trackback_url'],
53
+ Integer(base.data['contains']),
54
+ Integer(base.data['influential']),
55
+ Integer(base.data['all']))
56
+ end
57
+ })
58
+ end
59
+
60
+ def tags(url, page = nil, perpage = nil, &block)
61
+ self.request('tags', {:url => url}, Tag, block, page, perpage)
62
+ end
63
+
64
+ def trackbacks(url, contains = nil, infonly = nil, page = nil, perpage = nil, &block)
65
+ self.request('trackbacks', {:url => url, :contains => contains, :infonly => infonly}, Trackback, block, page, perpage)
66
+ end
67
+
68
+ def trending(page = nil, perpage = nil, &block)
69
+ self.request('trending', nil, Topic, block, page, perpage)
70
+ end
71
+
72
+ def urlinfo(url, &block)
73
+ self.request('urlinfo', {:url => url}, UrlInfo, block)
74
+ end
75
+
76
+ protected
77
+ def request(url, params, klass, callback, page = nil, perpage = nil)
78
+ params[:page] = page if page
79
+ params[:perpage] = perpage if perpage
80
+
81
+ http = EM::HttpRequest.new("http://otter.topsy.com/#{url}.json", {'X-Topsy-UA' => @identifier}).get :query => params
82
+ http.callback {
83
+ body = Yajl::Parser.new.parse(http.response)['response']
84
+ callback.call(Response.new(http.response_header, body), klass.create(body))
85
+ }
86
+
87
+ http.errback {
88
+ callback.call(Error.new(http.status))
89
+ }
90
+ end
91
+ end
92
+
93
+ end
@@ -0,0 +1,25 @@
1
+ module Otter
2
+
3
+ class Count < Base
4
+ def hour
5
+ Integer(self.data['h'])
6
+ end
7
+
8
+ def day
9
+ Integer(self.data['d'])
10
+ end
11
+
12
+ def week
13
+ Integer(self.data['w'])
14
+ end
15
+
16
+ def month
17
+ Integer(self.data['m'])
18
+ end
19
+
20
+ def all
21
+ Integer(self.data['a'])
22
+ end
23
+ end
24
+
25
+ end
@@ -0,0 +1,22 @@
1
+ module Otter
2
+
3
+ class Error
4
+ attr_reader :code
5
+
6
+ def initialize(code)
7
+ @code = code.to_i
8
+ end
9
+
10
+ def message
11
+ case self.code
12
+ when 400 then 'Parameter Check Failed'
13
+ when 403 then 'Forbidden'
14
+ when 404 then 'Action Not Supported'
15
+ when 500 then 'Unexpected Internal Error'
16
+ when 503 then 'Temporarily Unavailable'
17
+ else 'Unkown'
18
+ end
19
+ end
20
+ end
21
+
22
+ end
@@ -0,0 +1,37 @@
1
+ module Otter
2
+
3
+ class Link < Base
4
+ def topsy_trackback_url
5
+ self.data['topsy_trackback_url']
6
+ end
7
+
8
+ def url
9
+ self.data['url']
10
+ end
11
+
12
+ def title
13
+ self.data['title']
14
+ end
15
+
16
+ def trackback_total
17
+ self.data['trackback_total']
18
+ end
19
+
20
+ def hits
21
+ Integer(self.data['hits'])
22
+ end
23
+
24
+ def content
25
+ self.data['content']
26
+ end
27
+
28
+ def score
29
+ Float(self.data['score'])
30
+ end
31
+
32
+ def highlight
33
+ self.data['highlight']
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,39 @@
1
+ module Otter
2
+
3
+ class Post < Base
4
+ def permalink_url
5
+ self.data['permalink_url']
6
+ end
7
+
8
+ def target
9
+ @target ||= Target.new(self.data['target'])
10
+ end
11
+
12
+ def date
13
+ Time.at(Integer(self.data['date']))
14
+ end
15
+
16
+ def content
17
+ self.data['content']
18
+ end
19
+
20
+ def date_alpha
21
+ self.data['date_alpha']
22
+ end
23
+
24
+ class Target < Base
25
+ def topsy_trackback_url
26
+ self.data['topsy_trackback_url']
27
+ end
28
+
29
+ def url
30
+ self.data['url']
31
+ end
32
+
33
+ def trackback_total
34
+ Integer(self.data['trackback_total'])
35
+ end
36
+ end # Target
37
+ end # Post
38
+
39
+ end # Otter
@@ -0,0 +1,47 @@
1
+ module Otter
2
+
3
+ class Response
4
+ attr_reader :headers,
5
+ :response
6
+
7
+ def initialize(headers, response) # :nodoc:
8
+ @headers = headers
9
+ @response = response
10
+ end
11
+
12
+ # Total credits that can be allocated.
13
+ def rate_limit
14
+ Integer(self.headers['X_RATELIMIT_LIMIT'])
15
+ end
16
+
17
+ # Total credits available.
18
+ def rate_remaining
19
+ Integer(self.headers['X_RATELIMIT_REMAINING'])
20
+ end
21
+
22
+ # Time when the credits will be reset.
23
+ def rate_reset
24
+ Time.at(Integer(self.headers['X_RATELIMIT_RESET']))
25
+ end
26
+
27
+ # Total number of results
28
+ def total
29
+ Integer(self.response['page'])
30
+ end
31
+
32
+ # Current page
33
+ def page
34
+ Integer(self.response['total'])
35
+ end
36
+
37
+ # Number of results per page
38
+ def perpage
39
+ Integer(self.response['perpage'])
40
+ end
41
+
42
+ def window
43
+ self.response['window']
44
+ end
45
+ end
46
+
47
+ end
@@ -0,0 +1,13 @@
1
+ module Otter
2
+
3
+ class Tag < Base
4
+ def url
5
+ self.data['url']
6
+ end
7
+
8
+ def name
9
+ self.data['name']
10
+ end
11
+ end
12
+
13
+ end
@@ -0,0 +1,13 @@
1
+ module Otter
2
+
3
+ class Topic < Base
4
+ def url
5
+ self.data['url']
6
+ end
7
+
8
+ def term
9
+ self.data['term']
10
+ end
11
+ end
12
+
13
+ end
@@ -0,0 +1,29 @@
1
+ module Otter
2
+
3
+ class Trackback < Base
4
+ def permalink_url
5
+ self.data['permalink_url']
6
+ end
7
+
8
+ def date
9
+ Time.at(Integer(self.data['date']))
10
+ end
11
+
12
+ def content
13
+ self.data['content']
14
+ end
15
+
16
+ def type
17
+ self.data['type']
18
+ end
19
+
20
+ def date_alpha
21
+ self.data['date_alpha']
22
+ end
23
+
24
+ def author
25
+ @author ||= Author.new(self.data['author'])
26
+ end
27
+ end
28
+
29
+ end
@@ -0,0 +1,34 @@
1
+ module Otter
2
+
3
+ class UrlInfo < Base
4
+ def topsy_trackback_url
5
+ self.data['topsy_trackback_url']
6
+ end
7
+
8
+
9
+ def oneforty
10
+ self.data['oneforty']
11
+ end
12
+
13
+ def url
14
+ self.data['url']
15
+ end
16
+
17
+ def title
18
+ self.data['title']
19
+ end
20
+
21
+ def trackback_total
22
+ Integer(self.data['trackback_total'])
23
+ end
24
+
25
+ def description
26
+ self.data['description']
27
+ end
28
+
29
+ def description_attribution
30
+ self.data['description_attribution']
31
+ end
32
+ end
33
+
34
+ end
@@ -0,0 +1,8 @@
1
+ require 'rubygems'
2
+ require 'minittest/spec'
3
+
4
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
5
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
6
+ require 'otter-rb'
7
+
8
+ MiniTest::Unit.autorun
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: otter-rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Jeff Smick
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-08 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: em-http-request
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: yajl-ruby
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: minitest
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: yard
47
+ type: :development
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ description: An EventMachine based library for the Topsy Otter API.
56
+ email: sprsquish@gmail.com
57
+ executables: []
58
+
59
+ extensions: []
60
+
61
+ extra_rdoc_files:
62
+ - LICENSE
63
+ - README.md
64
+ files:
65
+ - lib/otter-rb.rb
66
+ - lib/otter/author.rb
67
+ - lib/otter/base.rb
68
+ - lib/otter/connection.rb
69
+ - lib/otter/count.rb
70
+ - lib/otter/error.rb
71
+ - lib/otter/link.rb
72
+ - lib/otter/post.rb
73
+ - lib/otter/response.rb
74
+ - lib/otter/tag.rb
75
+ - lib/otter/topic.rb
76
+ - lib/otter/trackback.rb
77
+ - lib/otter/urlinfo.rb
78
+ - LICENSE
79
+ - README.md
80
+ has_rdoc: true
81
+ homepage: http://github.com/sprsquish/collecta-rb
82
+ licenses: []
83
+
84
+ post_install_message:
85
+ rdoc_options:
86
+ - --charset=UTF-8
87
+ require_paths:
88
+ - lib
89
+ required_ruby_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: "0"
94
+ version:
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: "0"
100
+ version:
101
+ requirements: []
102
+
103
+ rubyforge_project:
104
+ rubygems_version: 1.3.5
105
+ signing_key:
106
+ specification_version: 3
107
+ summary: An EventMachine based library for the Topsy Otter API.
108
+ test_files:
109
+ - spec/spec_helper.rb