rtopsy 0.0.1
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.
- data/.loadpath +5 -0
- data/.project +18 -0
- data/History.txt +4 -0
- data/Manifest.txt +27 -0
- data/PostInstall.txt +7 -0
- data/README.rdoc +65 -0
- data/Rakefile +26 -0
- data/lib/rtopsy/api.rb +136 -0
- data/lib/rtopsy/author.rb +30 -0
- data/lib/rtopsy/link_search_result.rb +32 -0
- data/lib/rtopsy/linkpost.rb +33 -0
- data/lib/rtopsy/linkpost_count.rb +25 -0
- data/lib/rtopsy/page.rb +101 -0
- data/lib/rtopsy/search_count.rb +28 -0
- data/lib/rtopsy/stats.rb +26 -0
- data/lib/rtopsy/tag.rb +24 -0
- data/lib/rtopsy/target.rb +26 -0
- data/lib/rtopsy/trend.rb +24 -0
- data/lib/rtopsy/tweet.rb +33 -0
- data/lib/rtopsy/url_info.rb +29 -0
- data/lib/rtopsy.rb +24 -0
- data/rtopsy.gemspec +38 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/test/test_helper.rb +3 -0
- data/test/test_rtopsy.rb +18 -0
- metadata +105 -0
data/.loadpath
ADDED
data/.project
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<projectDescription>
|
3
|
+
<name>topsy</name>
|
4
|
+
<comment></comment>
|
5
|
+
<projects>
|
6
|
+
</projects>
|
7
|
+
<buildSpec>
|
8
|
+
<buildCommand>
|
9
|
+
<name>org.rubypeople.rdt.core.rubybuilder</name>
|
10
|
+
<arguments>
|
11
|
+
</arguments>
|
12
|
+
</buildCommand>
|
13
|
+
</buildSpec>
|
14
|
+
<natures>
|
15
|
+
<nature>org.rubypeople.rdt.core.rubynature</nature>
|
16
|
+
<nature>org.radrails.rails.core.railsnature</nature>
|
17
|
+
</natures>
|
18
|
+
</projectDescription>
|
data/History.txt
ADDED
data/Manifest.txt
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
.loadpath
|
2
|
+
.project
|
3
|
+
History.txt
|
4
|
+
Manifest.txt
|
5
|
+
PostInstall.txt
|
6
|
+
README.rdoc
|
7
|
+
Rakefile
|
8
|
+
lib/rtopsy.rb
|
9
|
+
lib/rtopsy/api.rb
|
10
|
+
lib/rtopsy/author.rb
|
11
|
+
lib/rtopsy/link_search_result.rb
|
12
|
+
lib/rtopsy/linkpost.rb
|
13
|
+
lib/rtopsy/linkpost_count.rb
|
14
|
+
lib/rtopsy/page.rb
|
15
|
+
lib/rtopsy/search_count.rb
|
16
|
+
lib/rtopsy/stats.rb
|
17
|
+
lib/rtopsy/tag.rb
|
18
|
+
lib/rtopsy/target.rb
|
19
|
+
lib/rtopsy/trend.rb
|
20
|
+
lib/rtopsy/tweet.rb
|
21
|
+
lib/rtopsy/url_info.rb
|
22
|
+
rtopsy.gemspec
|
23
|
+
script/console
|
24
|
+
script/destroy
|
25
|
+
script/generate
|
26
|
+
test/test_helper.rb
|
27
|
+
test/test_rtopsy.rb
|
data/PostInstall.txt
ADDED
data/README.rdoc
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
= rtopsy
|
2
|
+
|
3
|
+
* http://github.com/etagwerker/rtopsy
|
4
|
+
|
5
|
+
== DESCRIPTION:
|
6
|
+
|
7
|
+
A ruby gem implementation of the Topsy API
|
8
|
+
|
9
|
+
== FEATURES:
|
10
|
+
|
11
|
+
rtopsy won't do your laundry, but it will do this:
|
12
|
+
1. Topsy::Base.authorinfo('barackobama')
|
13
|
+
2. Topsy::Base.authorsearch('programming','a')
|
14
|
+
3. Topsy::Base.authorsearch('programming')
|
15
|
+
4. Topsy::Base.linkposts('barackobama',page_number,per_page)
|
16
|
+
5. Topsy::Base.linkposts('barackobama')
|
17
|
+
6. Topsy::Base.linkpostcount('barackobama')
|
18
|
+
7. Topsy::Base.urlinfo('http://www.aycron.com')
|
19
|
+
8. Topsy::Base.stats('http://www.aycron.com')
|
20
|
+
9. Topsy::Base.search('rock',window,page_number,perpage) #window can be :auto, :h, :d, :w, :m, :a
|
21
|
+
10. Topsy::Base.search('rock') #defaults window :auto, page_number 1, perpage 10
|
22
|
+
11. Topsy::Base.searchcount('rock')
|
23
|
+
12. Topsy::Base.search('rock')
|
24
|
+
13. Topsy::Base.profilesearch('Aycron+Director')
|
25
|
+
14. Topsy::Base.profilesearch('Aycron+Director', page_number, perpage)
|
26
|
+
15. Topsy::Base.related('http://www.hashrocket.com')
|
27
|
+
16. Topsy::Base.related('http://www.google.com/', page_number, perpage)
|
28
|
+
17. Topsy::Base.tags('http://twitter.com', page_number, perpage)
|
29
|
+
18. Topsy::Base.tags('http://twitter.com')
|
30
|
+
19. Topsy::Base.trending(page_number, perpage)
|
31
|
+
20. Topsy::Base.trending # defaults page_number 1, perpage 10
|
32
|
+
21. Topsy::Base.trackbacks('http://twitter.com', tracktype, contains_string, infonly_flag, page_number, perpage)
|
33
|
+
|
34
|
+
== REQUIREMENTS:
|
35
|
+
|
36
|
+
TODO list here: http://etagwerker.tadalist.com/lists/1436401/public
|
37
|
+
|
38
|
+
== INSTALL:
|
39
|
+
|
40
|
+
* NOT READY FOR THIS YET!!! (still developing this gem)
|
41
|
+
|
42
|
+
== LICENSE:
|
43
|
+
|
44
|
+
(The MIT License)
|
45
|
+
|
46
|
+
Copyright (c) 2009 Ernesto Tagwerker <etagwerker@aycron.com>
|
47
|
+
|
48
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
49
|
+
a copy of this software and associated documentation files (the
|
50
|
+
'Software'), to deal in the Software without restriction, including
|
51
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
52
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
53
|
+
permit persons to whom the Software is furnished to do so, subject to
|
54
|
+
the following conditions:
|
55
|
+
|
56
|
+
The above copyright notice and this permission notice shall be
|
57
|
+
included in all copies or substantial portions of the Software.
|
58
|
+
|
59
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
60
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
61
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
62
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
63
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
64
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
65
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
gem 'hoe', '>= 2.1.0'
|
3
|
+
require 'hoe'
|
4
|
+
require 'fileutils'
|
5
|
+
require './lib/rtopsy'
|
6
|
+
|
7
|
+
Hoe.plugin :newgem
|
8
|
+
# Hoe.plugin :website
|
9
|
+
# Hoe.plugin :cucumberfeatures
|
10
|
+
|
11
|
+
# Generate all the Rake tasks
|
12
|
+
# Run 'rake -T' to see list of generated tasks (from gem root directory)
|
13
|
+
$hoe = Hoe.spec 'rtopsy' do
|
14
|
+
self.developer 'Ernesto Tagwerker', 'etagwerker@aycron.com'
|
15
|
+
self.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
|
16
|
+
self.rubyforge_name = self.name # TODO this is default value
|
17
|
+
# self.extra_deps = [['activesupport','>= 2.0.2']]
|
18
|
+
self.extra_deps = [['httparty','>= 0.4.3']]
|
19
|
+
end
|
20
|
+
|
21
|
+
require 'newgem/tasks'
|
22
|
+
Dir['tasks/**/*.rake'].each { |t| load t }
|
23
|
+
|
24
|
+
# TODO - want other tests/tasks run by default? Add them to the list
|
25
|
+
# remove_task :default
|
26
|
+
# task :default => [:spec, :features]
|
data/lib/rtopsy/api.rb
ADDED
@@ -0,0 +1,136 @@
|
|
1
|
+
# This is the base class for the topsy library. It makes all the requests
|
2
|
+
# to topsy, parses the json and returns ruby objects to play with.
|
3
|
+
#
|
4
|
+
# For complete documentation:
|
5
|
+
# http://groups.google.com/group/rtopsy
|
6
|
+
module Topsy
|
7
|
+
|
8
|
+
#provides all methods to the Topsy API
|
9
|
+
class API
|
10
|
+
include HTTParty
|
11
|
+
|
12
|
+
base_uri 'http://otter.topsy.com'
|
13
|
+
default_params :output => 'json'
|
14
|
+
format :json
|
15
|
+
|
16
|
+
|
17
|
+
#performs a HTTParty get
|
18
|
+
#returns the response hash
|
19
|
+
def self.get_response(api_request)
|
20
|
+
hash = get(api_request)
|
21
|
+
return hash["response"]
|
22
|
+
end
|
23
|
+
|
24
|
+
#returns the author info object according to the twitter url
|
25
|
+
#author_handle: eg. barackobama
|
26
|
+
def self.authorinfo(twitter_nick)
|
27
|
+
resp = get_response("/authorinfo.json?url=http://twitter.com/#{twitter_nick}")
|
28
|
+
Author.new(resp)
|
29
|
+
end
|
30
|
+
|
31
|
+
#returns a Page of results with a list of Author instances that match the nick, name and biography info
|
32
|
+
#parameter query eg. Barack+Obama (see: http://code.google.com/p/otterapi/wiki/QuerySyntax)
|
33
|
+
def self.profilesearch(query = '', page = 1, perpage = 10)
|
34
|
+
resp = get_response("/profilesearch.json?q=#{query}&page=#{page}&perpage=#{perpage}")
|
35
|
+
Page.new(resp, :author)
|
36
|
+
end
|
37
|
+
|
38
|
+
#returns a Page of results with a list of Author instances that talk about the query parameter
|
39
|
+
#who talk most about the query parameter (see: http://code.google.com/p/otterapi/wiki/QuerySyntax)
|
40
|
+
def self.authorsearch(query = '', window = 'a', page = 1, perpage = 10)
|
41
|
+
resp = get_response("/authorsearch.json?q=#{query}&window=#{window}&page=#{page}&perpage=#{perpage}")
|
42
|
+
Page.new(resp, :author)
|
43
|
+
end
|
44
|
+
|
45
|
+
#returns a Page of results with a list of Linkpost instances
|
46
|
+
#twitter_nick: eg. barackobama
|
47
|
+
#page: eg. 1
|
48
|
+
#perpage: eg. 12
|
49
|
+
def self.linkposts(twitter_nick = '', page = 1, perpage = 10)
|
50
|
+
resp = get_response("/linkposts.json?url=http://twitter.com/#{twitter_nick}&page=#{page}&perpage=#{perpage}")
|
51
|
+
Page.new(resp, :link_post)
|
52
|
+
end
|
53
|
+
|
54
|
+
#returns a LinkpostCount for a nick
|
55
|
+
#twitter_nick: eg. barackobama
|
56
|
+
def self.linkpostcount(twitter_nick = '')
|
57
|
+
resp = get_response("/linkpostcount.json?url=http://twitter.com/#{twitter_nick}")
|
58
|
+
LinkpostCount.new(resp)
|
59
|
+
end
|
60
|
+
|
61
|
+
#returns a UrlInfo instance for a certain url
|
62
|
+
#url: eg. http://aycron.com
|
63
|
+
def self.urlinfo(url)
|
64
|
+
resp = get_response("/urlinfo.json?url=#{url}")
|
65
|
+
UrlInfo.new(resp)
|
66
|
+
end
|
67
|
+
|
68
|
+
# returns a Page of results with a list of LinkSearchResult
|
69
|
+
# if url is nil or empty, returns nil
|
70
|
+
# if url doesn't end with '/' (eg. http://www.google.com) it adds it to the end to normalize the url
|
71
|
+
def self.related(url = '', page = 1, perpage = 10)
|
72
|
+
if !url
|
73
|
+
return nil
|
74
|
+
end
|
75
|
+
|
76
|
+
url = normalize_url(url)
|
77
|
+
|
78
|
+
resp = get_response("/related.json?url=#{url}&page=#{page}&perpage=#{perpage}")
|
79
|
+
Page.new(resp, :link_search_result)
|
80
|
+
end
|
81
|
+
|
82
|
+
# adds a trailing '/' to the string if necessary
|
83
|
+
def self.normalize_url(url)
|
84
|
+
if url[url.length-1, url.length] != '/'
|
85
|
+
url = url + "/"
|
86
|
+
end
|
87
|
+
return url
|
88
|
+
end
|
89
|
+
|
90
|
+
# returns a SearchCount instance initialized with the response
|
91
|
+
def self.searchcount(query = '')
|
92
|
+
resp = get_response("/searchcount.json?q=#{query}")
|
93
|
+
SearchCount.new(resp)
|
94
|
+
end
|
95
|
+
|
96
|
+
# returns a Page of results with a list of LinkSearchResult
|
97
|
+
# returns nil if the window parameter is not correct
|
98
|
+
def self.search(query = '', window = :auto, page = 1, perpage = 10)
|
99
|
+
if [:auto, :h, :d, :w, :m, :a].include? window
|
100
|
+
resp = get_response("/search.json?q=#{query}&window=#{window}&page=#{page}&perpage=#{perpage}")
|
101
|
+
Page.new(resp, :link_search_result)
|
102
|
+
else
|
103
|
+
nil
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
#returns a Stats instance for a certain url
|
108
|
+
#url: eg. http://aycron.com
|
109
|
+
def self.stats(url)
|
110
|
+
resp = get_response("/stats.json?url=#{url}")
|
111
|
+
Stats.new(resp)
|
112
|
+
end
|
113
|
+
|
114
|
+
# returns a Page of results with a list of Tag
|
115
|
+
def self.tags(url, page = 1, perpage = 10)
|
116
|
+
url = normalize_url(url)
|
117
|
+
resp = get_response("/tags.json?url=#{url}&page=#{page}&perpage=#{perpage}")
|
118
|
+
Page.new(resp, :tag)
|
119
|
+
end
|
120
|
+
|
121
|
+
# returns a Page of results with a list of Tweet
|
122
|
+
def self.trackbacks(url = '', tracktype = 'tweet', contains = '', infonly = 0, page = 1, perpage = 10)
|
123
|
+
url = normalize_url(url)
|
124
|
+
resp = get_response("/trackbacks.json?url=#{url}&tracktype=#{tracktype}&infonly=#{infonly}&contains=#{contains}&page=#{page}&perpage=#{perpage}")
|
125
|
+
Page.new(resp, :tweet)
|
126
|
+
end
|
127
|
+
|
128
|
+
# returns a Page of results with a list of Trend
|
129
|
+
def self.trending(page = 1, perpage = 10)
|
130
|
+
resp = get_response("/trending.json?page=#{page}&perpage=#{perpage}")
|
131
|
+
Page.new(resp, :trend)
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# This is the author class for the topsy library.
|
2
|
+
# An Author has the following attributes:
|
3
|
+
# "name" : "Barack Obama"
|
4
|
+
# "url" : "http://twitter.com/barackobama",
|
5
|
+
# "type" : "twitter",
|
6
|
+
# "nick" : "barackobama",
|
7
|
+
# "description" : "44th President of the United States",
|
8
|
+
# "topsy_author_url" : "http://topsy.com/twitter/barackobama",
|
9
|
+
# "influence_level" : "5"
|
10
|
+
#
|
11
|
+
# According to the official Topsy doc: http://code.google.com/p/otterapi/wiki/Resources?tm=6#/authorinfo
|
12
|
+
#
|
13
|
+
# For complete documentation on the options, check out the topsy api docs.
|
14
|
+
# http://groups.google.com/group/rtopsy/web/api-documentation
|
15
|
+
module Topsy
|
16
|
+
|
17
|
+
class Author
|
18
|
+
attr_accessor :name, :url, :type, :nick, :description, :topsy_author_url, :influence_level, :hits
|
19
|
+
|
20
|
+
def to_s
|
21
|
+
"Topsy Author: #{name}, @#{nick}, #{topsy_author_url}"
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize(hash)
|
25
|
+
hash.each do |key, value|
|
26
|
+
instance_variable_set("@#{key}", value)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# This is the link_search_result class for the topsy library.
|
2
|
+
# A LinkSearchResult has the following attributes:
|
3
|
+
# "trackback_permalink" : "http://twitter.com/ewerickson/status/3562164195",
|
4
|
+
# "hits" : 38,
|
5
|
+
# "trackback_total" : 157,
|
6
|
+
# "topsy_trackback_url" : "http://topsy.com/tb/www.redstate.com/erick/2009/08/26/breaking-rumors-surface-that-leon-panetta-is-resigning/",
|
7
|
+
# "url" : "http://www.redstate.com/erick/2009/08/26/breaking-rumors-surface-that-leon-panetta-is-resigning/",
|
8
|
+
# "content" : "Panetta is rumored to have sent a resignation letter to Barack Obama today: http://bit.ly/CDMg9",
|
9
|
+
# "title" : "BREAKING: Rumors Surface That Leon Panetta is Resigning - Erickâs blog - RedState",
|
10
|
+
# "score" : 0.75521481,
|
11
|
+
# "highlight" : "Panetta is rumored to have sent a resignation letter to
|
12
|
+
# <span class=\"highlight-term\">Barack</span> <span class=\"highlight-term\">Obama</span> today: http://bit.ly/CDMg9"
|
13
|
+
# According to the official Topsy doc: http://code.google.com/p/otterapi/wiki/Resources?tm=6#/search
|
14
|
+
#
|
15
|
+
# For complete documentation on the options, check out the topsy api docs.
|
16
|
+
# http://groups.google.com/group/rtopsy
|
17
|
+
module Topsy
|
18
|
+
|
19
|
+
class LinkSearchResult
|
20
|
+
attr_accessor :trackback_permalink, :hits, :trackback_total, :topsy_trackback_url, :url, :content, :title, :score, :highlight
|
21
|
+
|
22
|
+
def to_s
|
23
|
+
"Topsy LinkSearchResult: #{url}, @#{title}, hits: #{hits}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize(hash)
|
27
|
+
hash.each do |key, value|
|
28
|
+
instance_variable_set("@#{key}", value)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# This is the linkpost class for the topsy library.
|
2
|
+
# A Linkpost has the following attributes:
|
3
|
+
# "permalink_url" : "http://twitter.com/barackobama/status/3569838653",
|
4
|
+
# "target" : target instance
|
5
|
+
# "date" : "1251337427",
|
6
|
+
# "content" : "Highlights from the tribute to Sen. Kennedy's life and
|
7
|
+
# accomplishments from last year's Democratic National Convention: http://bit.ly/TJcyr",
|
8
|
+
# "date_alpha" : "3 hours ago"
|
9
|
+
# According to the official Topsy doc: http://code.google.com/p/otterapi/wiki/Resources?tm=6#/linkposts
|
10
|
+
#
|
11
|
+
# For complete documentation on the options, check out the topsy api docs.
|
12
|
+
# http://groups.google.com/group/rtopsy
|
13
|
+
module Topsy
|
14
|
+
|
15
|
+
class Linkpost
|
16
|
+
attr_accessor :permalink_url, :target, :date, :content, :date_alpha
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
"Topsy Linkpost: #{permalink_url}, @#{content}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(hash)
|
23
|
+
hash.each do |key, value|
|
24
|
+
if key == 'target'
|
25
|
+
instance_variable_set("@#{key}", Target.new(value))
|
26
|
+
else
|
27
|
+
instance_variable_set("@#{key}", value)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# This is the linkpost_count class for the topsy library.
|
2
|
+
# A LinkpostCount has the following attributes:
|
3
|
+
# "contains" : 0,
|
4
|
+
# "all" : 46
|
5
|
+
#
|
6
|
+
# According to the official Topsy doc: http://code.google.com/p/otterapi/wiki/Resources?tm=6#/linkpostcount
|
7
|
+
#
|
8
|
+
# For complete documentation on the options, check out the topsy api docs.
|
9
|
+
# http://groups.google.com/group/rtopsy
|
10
|
+
module Topsy
|
11
|
+
|
12
|
+
class LinkpostCount
|
13
|
+
attr_accessor :contains, :all
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
"Topsy LinkpostCount: #{all}"
|
17
|
+
end
|
18
|
+
|
19
|
+
def initialize(hash)
|
20
|
+
hash.each do |key, value|
|
21
|
+
instance_variable_set("@#{key}", value)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/rtopsy/page.rb
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
# This is the page class for the topsy library.
|
2
|
+
# A Page has the following attributes:
|
3
|
+
# "page" : 1,
|
4
|
+
# "total" : "1139",
|
5
|
+
# "perpage" : 15,
|
6
|
+
# "list" : Array of Author instances
|
7
|
+
#
|
8
|
+
# According to the official Topsy doc: http://code.google.com/p/otterapi/wiki/Resources?tm=6#/authorsearch
|
9
|
+
#
|
10
|
+
# For complete documentation on the options, check out the rtopsy api docs.
|
11
|
+
# http://groups.google.com/group/rtopsy
|
12
|
+
module Topsy
|
13
|
+
|
14
|
+
class Page
|
15
|
+
attr_accessor :page, :total, :perpage, :list, :window
|
16
|
+
|
17
|
+
def to_s
|
18
|
+
"Topsy Page: #{page} of #{total}, #{list.size} authors"
|
19
|
+
end
|
20
|
+
|
21
|
+
#converts a list of Hash objects into Author objects
|
22
|
+
def get_authors_list(hash_list)
|
23
|
+
result = []
|
24
|
+
for hash in hash_list
|
25
|
+
result << Author.new(hash)
|
26
|
+
end
|
27
|
+
return result
|
28
|
+
end
|
29
|
+
|
30
|
+
#converts a list of Hash objects into Linkpost objects
|
31
|
+
def get_linkposts_list(hash_list)
|
32
|
+
result = []
|
33
|
+
for hash in hash_list
|
34
|
+
result << Linkpost.new(hash)
|
35
|
+
end
|
36
|
+
return result
|
37
|
+
end
|
38
|
+
|
39
|
+
#converts a list of Hash objects into LinkSearchResult objects
|
40
|
+
def get_linksearchresult_list(hash_list)
|
41
|
+
result = []
|
42
|
+
for hash in hash_list
|
43
|
+
result << LinkSearchResult.new(hash)
|
44
|
+
end
|
45
|
+
return result
|
46
|
+
end
|
47
|
+
|
48
|
+
#converts a list of Hash objects into Tag objects
|
49
|
+
def get_tags_list(hash_list)
|
50
|
+
result = []
|
51
|
+
for hash in hash_list
|
52
|
+
result << Tag.new(hash)
|
53
|
+
end
|
54
|
+
return result
|
55
|
+
end
|
56
|
+
|
57
|
+
#converts a list of Hash objects into Trend objects
|
58
|
+
def get_trends_list(hash_list)
|
59
|
+
result = []
|
60
|
+
for hash in hash_list
|
61
|
+
result << Trend.new(hash)
|
62
|
+
end
|
63
|
+
return result
|
64
|
+
end
|
65
|
+
|
66
|
+
#converts a list of Hash objects into Tweet objects
|
67
|
+
def get_tweets_list(hash_list)
|
68
|
+
result = []
|
69
|
+
for hash in hash_list
|
70
|
+
result << Tweet.new(hash)
|
71
|
+
end
|
72
|
+
return result
|
73
|
+
end
|
74
|
+
|
75
|
+
#creates a Page instance from a hash, setting attributes and a list of Author instances
|
76
|
+
#for the page
|
77
|
+
def initialize(hash, content_type)
|
78
|
+
hash.each do |key, value|
|
79
|
+
if key == 'list'
|
80
|
+
if content_type == :author
|
81
|
+
instance_variable_set("@#{key}", get_authors_list(value))
|
82
|
+
elsif content_type == :link_post
|
83
|
+
instance_variable_set("@#{key}", get_linkposts_list(value))
|
84
|
+
elsif content_type == :tag
|
85
|
+
instance_variable_set("@#{key}", get_tags_list(value))
|
86
|
+
elsif content_type == :trend
|
87
|
+
instance_variable_set("@#{key}", get_trends_list(value))
|
88
|
+
elsif content_type == :tweet
|
89
|
+
instance_variable_set("@#{key}", get_tweets_list(value))
|
90
|
+
else
|
91
|
+
instance_variable_set("@#{key}", get_linksearchresult_list(value))
|
92
|
+
end
|
93
|
+
|
94
|
+
else
|
95
|
+
instance_variable_set("@#{key}", value)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# This is the search_count class for the topsy library.
|
2
|
+
# A SearchCount has the following attributes:
|
3
|
+
# "w" : 2085, - weekly
|
4
|
+
# "h" : 6, - hourly
|
5
|
+
# "a" : 572027, - annually
|
6
|
+
# "d" : 330, - daily
|
7
|
+
# "m" : 9122 - monthly
|
8
|
+
#
|
9
|
+
# According to the official Topsy doc: http://code.google.com/p/otterapi/wiki/Resources?tm=6#/searchcount (?)
|
10
|
+
#
|
11
|
+
# For complete documentation on the options, check out the topsy api docs.
|
12
|
+
# http://groups.google.com/group/rtopsy
|
13
|
+
module Topsy
|
14
|
+
|
15
|
+
class SearchCount
|
16
|
+
attr_accessor :w, :h, :a, :d, :m
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
"Topsy SearchCount: #{all}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(hash)
|
23
|
+
hash.each do |key, value|
|
24
|
+
instance_variable_set("@#{key}", value)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/rtopsy/stats.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
# This is the stats class for the topsy library.
|
2
|
+
# A Stats instance has the following attributes:
|
3
|
+
# "topsy_trackback_url" : "http://topsy.com/tb/topsy.com/",
|
4
|
+
# "contains" : "1931",
|
5
|
+
# "influential" : "874",
|
6
|
+
# "all" : "1931"
|
7
|
+
# According to the official Topsy doc: http://code.google.com/p/otterapi/wiki/Resources?tm=6#/stats
|
8
|
+
#
|
9
|
+
# For complete documentation on the options, check out the topsy api docs.
|
10
|
+
# http://groups.google.com/group/rtopsy
|
11
|
+
module Topsy
|
12
|
+
|
13
|
+
class Stats
|
14
|
+
attr_accessor :topsy_trackback_url, :contains, :influential, :all
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
"Topsy Stats: #{topsy_trackback_url}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize(hash)
|
21
|
+
hash.each do |key, value|
|
22
|
+
instance_variable_set("@#{key}", value)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/rtopsy/tag.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# This is the tag class for the topsy library.
|
2
|
+
# A Tag instance has the following attributes:
|
3
|
+
# "url" : "http://topsy.com/s?q=current",
|
4
|
+
# "name" : "current"
|
5
|
+
# According to the official Topsy doc: http://code.google.com/p/otterapi/wiki/Resources?tm=6#/tags
|
6
|
+
#
|
7
|
+
# For complete documentation on the options, check out the topsy api docs.
|
8
|
+
# http://groups.google.com/group/rtopsy
|
9
|
+
module Topsy
|
10
|
+
|
11
|
+
class Tag
|
12
|
+
attr_accessor :url, :name
|
13
|
+
|
14
|
+
def to_s
|
15
|
+
"Topsy Tag: #{name}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(hash)
|
19
|
+
hash.each do |key, value|
|
20
|
+
instance_variable_set("@#{key}", value)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# This is the target class for the topsy library.
|
2
|
+
# A Target has the following attributes:
|
3
|
+
# "topsy_trackback_url" : "http://topsy.com/tb/my.barackobama.com/page/community/post/obamaforamerica/gGMPVm",
|
4
|
+
# "url" : "http://my.barackobama.com/page/community/post/obamaforamerica/gGMPVm",
|
5
|
+
# "trackback_total" : "43"
|
6
|
+
#
|
7
|
+
# According to the official Topsy doc: http://code.google.com/p/otterapi/wiki/Resources?tm=6#/linkposts
|
8
|
+
#
|
9
|
+
# For complete documentation on the options, check out the topsy api docs.
|
10
|
+
# http://groups.google.com/group/rtopsy
|
11
|
+
module Topsy
|
12
|
+
|
13
|
+
class Target
|
14
|
+
attr_accessor :topsy_trackback_url, :url, :trackback_total
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
"Topsy Target: #{url}"
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize(hash)
|
21
|
+
hash.each do |key, value|
|
22
|
+
instance_variable_set("@#{key}", value)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/rtopsy/trend.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# This is the trend class for the topsy library.
|
2
|
+
# A Trend instance has the following attributes:
|
3
|
+
# "url" : "http://topsy.com/s?q=dominick",
|
4
|
+
# "term" : "dominick"
|
5
|
+
# According to the official Topsy doc: http://code.google.com/p/otterapi/wiki/Resources?tm=6#/trending
|
6
|
+
#
|
7
|
+
# For complete documentation on the options, check out the topsy api docs.
|
8
|
+
# http://groups.google.com/group/rtopsy
|
9
|
+
module Topsy
|
10
|
+
|
11
|
+
class Trend
|
12
|
+
attr_accessor :url, :term
|
13
|
+
|
14
|
+
def to_s
|
15
|
+
"Topsy Trend: #{term}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def initialize(hash)
|
19
|
+
hash.each do |key, value|
|
20
|
+
instance_variable_set("@#{key}", value)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/rtopsy/tweet.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# This is the tweet class for the topsy library.
|
2
|
+
# A Tweet instance has the following attributes:
|
3
|
+
# "permalink_url" : "http://twitter.com/imadnaffa/status/3565855201",
|
4
|
+
# "date" : "1251324809",
|
5
|
+
# "content" : "TOPSY - A search engine powered by tweets: http://topsy.com (this Search Engine can
|
6
|
+
# be powerful for sifting through Twitter- love it)!",
|
7
|
+
# "type" : "tweet",
|
8
|
+
# "author" : author instance
|
9
|
+
# "date_alpha" : "6 hours ago"
|
10
|
+
# According to the official Topsy doc: http://code.google.com/p/otterapi/wiki/Resources?tm=6#/trackbacks
|
11
|
+
#
|
12
|
+
# For complete documentation on the options, check out the topsy api docs.
|
13
|
+
# http://groups.google.com/group/rtopsy
|
14
|
+
module Topsy
|
15
|
+
|
16
|
+
class Tweet
|
17
|
+
attr_accessor :permalink_url, :date, :content, :type, :author, :date_alpha
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
"Topsy Tweet: #{permalink_url}, #{content}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(hash)
|
24
|
+
hash.each do |key, value|
|
25
|
+
if key == 'author'
|
26
|
+
instance_variable_set("@#{key}", Author.new(value))
|
27
|
+
else
|
28
|
+
instance_variable_set("@#{key}", value)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# This is the url_info class for the topsy library.
|
2
|
+
# An UrlInfo has the following attributes:
|
3
|
+
# "topsy_trackback_url" : "http://topsy.com/tb/twitter.com/",
|
4
|
+
# "oneforty" : "Twitter: What are you doing? http://twurl.nl/pd8k44",
|
5
|
+
# "url" : "http://twitter.com/",
|
6
|
+
# "title" : "Twitter: What are you doing?",
|
7
|
+
# "trackback_total" : "24152",
|
8
|
+
# "description" : "Social networking and microblogging service utilising instant messaging, SMS or a web interface.",
|
9
|
+
# "description_attribution" : "From DMOZ"
|
10
|
+
# According to the official Topsy doc: http://code.google.com/p/otterapi/wiki/Resources?tm=6#/urlinfo
|
11
|
+
#
|
12
|
+
# For complete documentation on the options, check out the topsy api docs.
|
13
|
+
# http://groups.google.com/group/rtopsy
|
14
|
+
module Topsy
|
15
|
+
|
16
|
+
class UrlInfo
|
17
|
+
attr_accessor :topsy_trackback_url, :oneforty, :url, :title, :trackback_total, :description, :description_attribution
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
"Topsy UrlInfo: #{url}, @#{topsy_trackback_url}, #{trackback_total} total"
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(hash)
|
24
|
+
hash.each do |key, value|
|
25
|
+
instance_variable_set("@#{key}", value)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/rtopsy.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'json'
|
3
|
+
require 'HTTParty'
|
4
|
+
|
5
|
+
$:.unshift(File.dirname(__FILE__)) unless
|
6
|
+
$:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
7
|
+
|
8
|
+
require 'rtopsy/trend'
|
9
|
+
require 'rtopsy/tag'
|
10
|
+
require 'rtopsy/link_search_result'
|
11
|
+
require 'rtopsy/search_count'
|
12
|
+
require 'rtopsy/linkpost_count'
|
13
|
+
require 'rtopsy/author'
|
14
|
+
require 'rtopsy/url_info'
|
15
|
+
require 'rtopsy/stats'
|
16
|
+
require 'rtopsy/linkpost'
|
17
|
+
require 'rtopsy/api'
|
18
|
+
require 'rtopsy/page'
|
19
|
+
require 'rtopsy/target'
|
20
|
+
require 'rtopsy/tweet'
|
21
|
+
|
22
|
+
module Topsy
|
23
|
+
VERSION = '0.0.1'
|
24
|
+
end
|
data/rtopsy.gemspec
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{rtopsy}
|
5
|
+
s.version = "0.0.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Ernesto Tagwerker"]
|
9
|
+
s.date = %q{2009-11-06}
|
10
|
+
s.description = %q{A ruby gem implementation of the Topsy API}
|
11
|
+
s.email = ["etagwerker@aycron.com"]
|
12
|
+
s.extra_rdoc_files = ["History.txt", "Manifest.txt", "PostInstall.txt"]
|
13
|
+
s.files = ["History.txt", "Manifest.txt", "PostInstall.txt", "README.rdoc", "Rakefile", "lib/rtopsy.rb", "script/console", "script/destroy", "script/generate", "test/test_helper.rb", "test/test_rtopsy.rb"]
|
14
|
+
s.homepage = %q{http://github.com/etagwerker/rtopsy}
|
15
|
+
s.post_install_message = %q{PostInstall.txt}
|
16
|
+
s.rdoc_options = ["--main", "README.rdoc"]
|
17
|
+
s.require_paths = ["lib"]
|
18
|
+
s.rubyforge_project = %q{rtopsy}
|
19
|
+
s.rubygems_version = %q{1.3.5}
|
20
|
+
s.summary = %q{A ruby gem implementation of the Topsy API}
|
21
|
+
s.test_files = ["test/test_helper.rb", "test/test_rtopsy.rb"]
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 3
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
s.add_runtime_dependency(%q<httparty>, [">= 0.4.3"])
|
29
|
+
s.add_development_dependency(%q<hoe>, [">= 2.3.3"])
|
30
|
+
else
|
31
|
+
s.add_dependency(%q<httparty>, [">= 0.4.3"])
|
32
|
+
s.add_dependency(%q<hoe>, [">= 2.3.3"])
|
33
|
+
end
|
34
|
+
else
|
35
|
+
s.add_dependency(%q<httparty>, [">= 0.4.3"])
|
36
|
+
s.add_dependency(%q<hoe>, [">= 2.3.3"])
|
37
|
+
end
|
38
|
+
end
|
data/script/console
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# File: script/console
|
3
|
+
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
4
|
+
|
5
|
+
libs = " -r irb/completion"
|
6
|
+
# Perhaps use a console_lib to store any extra methods I may want available in the cosole
|
7
|
+
# libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
|
8
|
+
libs << " -r #{File.dirname(__FILE__) + '/../lib/rtopsy.rb'}"
|
9
|
+
puts "Loading rtopsy gem"
|
10
|
+
exec "#{irb} #{libs} --simple-prompt"
|
data/script/destroy
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/destroy'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Destroy.new.run(ARGV)
|
data/script/generate
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubigen'
|
6
|
+
rescue LoadError
|
7
|
+
require 'rubygems'
|
8
|
+
require 'rubigen'
|
9
|
+
end
|
10
|
+
require 'rubigen/scripts/generate'
|
11
|
+
|
12
|
+
ARGV.shift if ['--help', '-h'].include?(ARGV[0])
|
13
|
+
RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
|
14
|
+
RubiGen::Scripts::Generate.new.run(ARGV)
|
data/test/test_helper.rb
ADDED
data/test/test_rtopsy.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper.rb'
|
2
|
+
|
3
|
+
class TestTopsy < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def setup
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_truth
|
9
|
+
assert true
|
10
|
+
end
|
11
|
+
|
12
|
+
#tests the urlinfo method
|
13
|
+
def test_urlinfo
|
14
|
+
puts 'testing url info'
|
15
|
+
urlinfo = Topsy::Base.urlinfo("http://www.aycron.com")
|
16
|
+
assert urlinfo.class == Topsy::UrlInfo, "Class of urlinfo method doesn't return UrlInfo"
|
17
|
+
end
|
18
|
+
end
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rtopsy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ernesto Tagwerker
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-07 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: httparty
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.4.3
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: hoe
|
27
|
+
type: :development
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.3.3
|
34
|
+
version:
|
35
|
+
description: A ruby gem implementation of the Topsy API
|
36
|
+
email:
|
37
|
+
- etagwerker@aycron.com
|
38
|
+
executables: []
|
39
|
+
|
40
|
+
extensions: []
|
41
|
+
|
42
|
+
extra_rdoc_files:
|
43
|
+
- History.txt
|
44
|
+
- Manifest.txt
|
45
|
+
- PostInstall.txt
|
46
|
+
files:
|
47
|
+
- .loadpath
|
48
|
+
- .project
|
49
|
+
- History.txt
|
50
|
+
- Manifest.txt
|
51
|
+
- PostInstall.txt
|
52
|
+
- README.rdoc
|
53
|
+
- Rakefile
|
54
|
+
- lib/rtopsy.rb
|
55
|
+
- lib/rtopsy/api.rb
|
56
|
+
- lib/rtopsy/author.rb
|
57
|
+
- lib/rtopsy/link_search_result.rb
|
58
|
+
- lib/rtopsy/linkpost.rb
|
59
|
+
- lib/rtopsy/linkpost_count.rb
|
60
|
+
- lib/rtopsy/page.rb
|
61
|
+
- lib/rtopsy/search_count.rb
|
62
|
+
- lib/rtopsy/stats.rb
|
63
|
+
- lib/rtopsy/tag.rb
|
64
|
+
- lib/rtopsy/target.rb
|
65
|
+
- lib/rtopsy/trend.rb
|
66
|
+
- lib/rtopsy/tweet.rb
|
67
|
+
- lib/rtopsy/url_info.rb
|
68
|
+
- rtopsy.gemspec
|
69
|
+
- script/console
|
70
|
+
- script/destroy
|
71
|
+
- script/generate
|
72
|
+
- test/test_helper.rb
|
73
|
+
- test/test_rtopsy.rb
|
74
|
+
has_rdoc: true
|
75
|
+
homepage: http://github.com/etagwerker/rtopsy
|
76
|
+
licenses: []
|
77
|
+
|
78
|
+
post_install_message: PostInstall.txt
|
79
|
+
rdoc_options:
|
80
|
+
- --main
|
81
|
+
- README.rdoc
|
82
|
+
require_paths:
|
83
|
+
- lib
|
84
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: "0"
|
89
|
+
version:
|
90
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: "0"
|
95
|
+
version:
|
96
|
+
requirements: []
|
97
|
+
|
98
|
+
rubyforge_project: rtopsy
|
99
|
+
rubygems_version: 1.3.5
|
100
|
+
signing_key:
|
101
|
+
specification_version: 3
|
102
|
+
summary: A ruby gem implementation of the Topsy API
|
103
|
+
test_files:
|
104
|
+
- test/test_helper.rb
|
105
|
+
- test/test_rtopsy.rb
|