titi 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +79 -2
- data/VERSION +1 -1
- data/examples/twitter.rb +18 -0
- data/lib/titi/provider/activity_streams.rb +14 -0
- data/lib/titi/provider/twitter/models.rb +18 -3
- data/lib/titi/provider.rb +2 -1
- data/titi.gemspec +4 -3
- metadata +4 -3
- data/lib/titi/provider/twitter/example.rb +0 -11
data/README.textile
CHANGED
@@ -1,6 +1,83 @@
|
|
1
|
-
|
1
|
+
h1. titi: Agile Monkeying around with Activity Streams
|
2
|
+
|
3
|
+
Titi is a first stab at a universal ActivityStream interface.
|
4
|
+
|
5
|
+
h3. BUGS:
|
6
|
+
|
7
|
+
* The XML output isn't activity stream format: needs namespaces, much more
|
8
|
+
|
9
|
+
|
10
|
+
h3. Example
|
11
|
+
|
12
|
+
<pre><code>
|
13
|
+
|
14
|
+
class Titi::Provider::Twitter::Status
|
15
|
+
def to_activity_stream_entry
|
16
|
+
ActivityStreams::Entry.adapt(
|
17
|
+
:id => %Q{tag:twitter.com,2007:http://twitter.com/#{user.screen_name}/statuses/#{id}},
|
18
|
+
:title => text,
|
19
|
+
:content => text,
|
20
|
+
:published => created_at,
|
21
|
+
:verb => :post
|
22
|
+
) do |entry|
|
23
|
+
entry.author = ActivityStreams::Author.new(user.name, user.url)
|
24
|
+
entry.object = ActivityStreams::ActivityObject.adapt do |activity_obj|
|
25
|
+
activity_obj.id = id
|
26
|
+
activity_obj.title = text
|
27
|
+
activity_obj.published = created_at
|
28
|
+
activity_obj.updated = created_at
|
29
|
+
activity_obj.author = entry.author
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
tweet = Twitter::Status.get(12233609555)
|
35
|
+
entry = tweet.to_activity_stream_entry
|
36
|
+
|
37
|
+
puts entry.to_xml
|
38
|
+
|
39
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
40
|
+
<entry>
|
41
|
+
<verb type="symbol">post</verb>
|
42
|
+
<mood nil="true"></mood>
|
43
|
+
<category nil="true"></category>
|
44
|
+
<author>
|
45
|
+
<name>Sockamillion</name>
|
46
|
+
<uri>http://www.sockington.org/</uri>
|
47
|
+
</author>
|
48
|
+
<title>THANK GOODNESS THE LIBRARY OF CONGRESS HAS UNDERSTOOD THE IMPORTANCE OF MY TWEETS what do you mean others are getting in too</title>
|
49
|
+
<actor nil="true"></actor>
|
50
|
+
<published type="datetime">2010-04-15T17:01:52+00:00</published>
|
51
|
+
<rank nil="true"></rank>
|
52
|
+
<sync nil="true"></sync>
|
53
|
+
<id>tag:twitter.com,2007:http://twitter.com/sockington/statuses/12233609555</id>
|
54
|
+
<content>THANK GOODNESS THE LIBRARY OF CONGRESS HAS UNDERSTOOD THE IMPORTANCE OF MY TWEETS what do you mean others are getting in too</content>
|
55
|
+
<target nil="true"></target>
|
56
|
+
<link nil="true"></link>
|
57
|
+
<object>
|
58
|
+
<author>
|
59
|
+
<name>Sockamillion</name>
|
60
|
+
<uri>http://www.sockington.org/</uri>
|
61
|
+
</author>
|
62
|
+
<title>THANK GOODNESS THE LIBRARY OF CONGRESS HAS UNDERSTOOD THE IMPORTANCE OF MY TWEETS what do you mean others are getting in too</title>
|
63
|
+
<published>Thu Apr 15 17:01:52 +0000 2010</published>
|
64
|
+
<id type="integer">12233609555</id>
|
65
|
+
<vevent nil="true"></vevent>
|
66
|
+
<content nil="true"></content>
|
67
|
+
<link nil="true"></link>
|
68
|
+
<updated>Thu Apr 15 17:01:52 +0000 2010</updated>
|
69
|
+
<object-type nil="true"></object-type>
|
70
|
+
</object>
|
71
|
+
<source nil="true"></source>
|
72
|
+
<updated nil="true"></updated>
|
73
|
+
</entry>
|
74
|
+
|
75
|
+
|
76
|
+
p tweet
|
77
|
+
|
78
|
+
{"truncated"=>false, "favorited"=>false, "created_at"=>"Thu Apr 15 17:01:52 +0000 2010", "text"=>"THANK GOODNESS THE LIBRARY OF CONGRESS HAS UNDERSTOOD THE IMPORTANCE OF MY TWEETS what do you mean others are getting in too", "id"=>12233609555, "in_reply_to_user_id"=>nil, "in_reply_to_screen_name"=>nil, "source"=>"<a href=\"http://apiwiki.twitter.com/\" rel=\"nofollow\">API</a>", "user"=>#<struct Titi::Provider::Twitter::User id=1468401, screen_name="sockington", protected=false, followers_count=1520814, friends_count=457, statuses_count=6234, favourites_count=2, created_at=Mon, 19 Mar 2007 03:45:00 +0000, name="Sockamillion", url="http://www.sockington.org/", location="Waltham, MA", description="I am Jason Scott's Cat.", time_zone="Eastern Time (US & Canada)", utc_offset=-18000, profile_background_color="48484c", profile_text_color="000000", profile_link_color="000000", profile_sidebar_border_color="79c021", profile_sidebar_fill_color="585e7e", profile_background_tile=false, profile_background_image_url="http://a1.twimg.com/profile_background_images/6682718/SocksTwitter.jpg", profile_image_url="http://a3.twimg.com/profile_images/77537329/IMG_3738_normal.JPG">, "in_reply_to_status_id"=>nil}
|
79
|
+
</code></pre>
|
2
80
|
|
3
|
-
Description goes here.
|
4
81
|
|
5
82
|
== Note on Patches/Pull Requests
|
6
83
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.2
|
data/examples/twitter.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
require 'restclient'
|
4
|
+
require 'json'
|
5
|
+
require 'active_support'
|
6
|
+
|
7
|
+
TITI_DIR = File.dirname(File.expand_path(__FILE__+'/..')) unless defined?(TITI_DIR)
|
8
|
+
$: << TITI_DIR+'/lib' unless $:.include?(TITI_DIR+'/lib')
|
9
|
+
|
10
|
+
require 'titi'
|
11
|
+
require 'titi/provider/twitter'
|
12
|
+
include Titi::Provider
|
13
|
+
|
14
|
+
tweet = Twitter::Status.get(12233609555)
|
15
|
+
entry = tweet.to_activity_stream_entry
|
16
|
+
|
17
|
+
p tweet.to_hash
|
18
|
+
puts entry.to_xml
|
@@ -19,6 +19,20 @@ module Titi
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
+
Feed = Struct.new(
|
23
|
+
:entry
|
24
|
+
)
|
25
|
+
Feed.class_eval do
|
26
|
+
include Titi::Adaptor
|
27
|
+
include Titi::Provider::ActivityStreams::Common
|
28
|
+
|
29
|
+
def adapt objs
|
30
|
+
self.entry = objs.map do |obj|
|
31
|
+
obj.to_activity_stream_entry
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
22
36
|
# An ActivityStream entry
|
23
37
|
# http://activitystrea.ms/spec/1.0/atom-activity-01.html#activityentries
|
24
38
|
Entry = Struct.new(
|
@@ -56,10 +56,8 @@ module Titi::Provider
|
|
56
56
|
# end
|
57
57
|
|
58
58
|
def created_at= date_time
|
59
|
-
p [:created_at, date_time]
|
60
59
|
unless date_time.is_a?(DateTime)
|
61
60
|
dt = DateTime.parse(date_time) rescue nil
|
62
|
-
p dt
|
63
61
|
end
|
64
62
|
self[:created_at] = dt
|
65
63
|
end
|
@@ -93,10 +91,27 @@ module Titi::Provider
|
|
93
91
|
include Titi::Provider
|
94
92
|
include Titi::Adaptor
|
95
93
|
|
94
|
+
# virtual setter for user: If argument is not a Twitter::User, adapt it to
|
95
|
+
# be a user (assuming it is a hash or a hash_like.
|
96
96
|
def user= new_user
|
97
|
-
new_user = Twitter::User.
|
97
|
+
new_user = Twitter::User.adapt(new_user.to_hash) unless new_user.is_a?(Twitter::User)
|
98
98
|
self[:user] = new_user
|
99
99
|
end
|
100
|
+
|
101
|
+
|
102
|
+
# Call the twitter API and fetch tweet with given ID
|
103
|
+
#
|
104
|
+
# @example
|
105
|
+
# tweet = Status.get(12233609555)
|
106
|
+
# tweet.text
|
107
|
+
# #=> "THANK GOODNESS THE LIBRARY OF CONGRESS HAS UNDERSTOOD THE IMPORTANCE OF MY TWEETS what do you mean others are getting in too"
|
108
|
+
#
|
109
|
+
def self.get status_id
|
110
|
+
raw_json_str = RestClient.get "http://twitter.com/statuses/show/#{status_id}.json"
|
111
|
+
# raw_json_str = %q{{"created_at":"Mon Mar 19 21:08:24 +0000 2007","profile_sidebar_fill_color":"ffffff","description":"Founder, http://infochimps.org - Building tools to Organize, Explore and Comprehend massive data sources","verified":false,"time_zone":"Central Time (US & Canada)","status":{"in_reply_to_status_id":null,"created_at":"Sat Apr 17 05:47:28 +0000 2010","favorited":false,"in_reply_to_user_id":null,"source":"<a href=\"http://www.atebits.com/\" rel=\"nofollow\">Tweetie</a>","id":12327261220,"in_reply_to_screen_name":null,"truncated":false,"text":"Hacking Activity Streams yay"},"following":null,"profile_sidebar_border_color":"f0edd8","url":"http://infochimps.org","profile_image_url":"http://a3.twimg.com/profile_images/377919497/FlipCircle-2009-900-trans_normal.png","notifications":null,"followers_count":1061,"profile_background_color":"BCC0C8","location":"iPhone: 30.316122,-97.733817","screen_name":"mrflip","profile_background_image_url":"http://a3.twimg.com/profile_background_images/2348065/2005Mar-AustinTypeTour-075_-_Rappers_Delight_Raindrop.jpg","friends_count":754,"statuses_count":1744,"profile_text_color":"000000","protected":false,"profile_background_tile":false,"favourites_count":98,"name":"Philip Flip Kromer","contributors_enabled":false,"profile_link_color":"0000ff","id":1554031,"lang":"en","geo_enabled":true,"utc_offset":-21600}}
|
112
|
+
raw_status = JSON.load(raw_json_str.to_s)
|
113
|
+
adapt(raw_status)
|
114
|
+
end
|
100
115
|
end
|
101
116
|
end
|
102
117
|
end
|
data/lib/titi/provider.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
+
require 'wukong'
|
1
2
|
module Titi
|
2
3
|
module Provider
|
3
4
|
autoload :ActivityStreams, 'titi/provider/activity_streams'
|
4
5
|
#
|
5
|
-
autoload :Twitter
|
6
|
+
autoload :Twitter , 'titi/provider/twitter'
|
6
7
|
# autoload :Gowalla , 'titi/provider/gowalla'
|
7
8
|
# autoload :Foursquare, 'titi/provider/foursquare'
|
8
9
|
# autoload :Tripit , 'titi/provider/tripit'
|
data/titi.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{titi}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["mrflip"]
|
@@ -23,6 +23,7 @@ Gem::Specification.new do |s|
|
|
23
23
|
"README.textile",
|
24
24
|
"Rakefile",
|
25
25
|
"VERSION",
|
26
|
+
"examples/twitter.rb",
|
26
27
|
"lib/titi.rb",
|
27
28
|
"lib/titi/adaptor.rb",
|
28
29
|
"lib/titi/matcher.rb",
|
@@ -32,7 +33,6 @@ Gem::Specification.new do |s|
|
|
32
33
|
"lib/titi/provider/activity_streams.rb",
|
33
34
|
"lib/titi/provider/tripit.rb",
|
34
35
|
"lib/titi/provider/twitter.rb",
|
35
|
-
"lib/titi/provider/twitter/example.rb",
|
36
36
|
"lib/titi/provider/twitter/models.rb",
|
37
37
|
"notes/jeweler-gen.sh",
|
38
38
|
"spec/spec.opts",
|
@@ -47,7 +47,8 @@ Gem::Specification.new do |s|
|
|
47
47
|
s.summary = %q{Emit and consume Activity Streams from a wide variety of sources}
|
48
48
|
s.test_files = [
|
49
49
|
"spec/spec_helper.rb",
|
50
|
-
"spec/titi_spec.rb"
|
50
|
+
"spec/titi_spec.rb",
|
51
|
+
"examples/twitter.rb"
|
51
52
|
]
|
52
53
|
|
53
54
|
if s.respond_to? :specification_version then
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 2
|
9
|
+
version: 0.0.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- mrflip
|
@@ -101,6 +101,7 @@ files:
|
|
101
101
|
- README.textile
|
102
102
|
- Rakefile
|
103
103
|
- VERSION
|
104
|
+
- examples/twitter.rb
|
104
105
|
- lib/titi.rb
|
105
106
|
- lib/titi/adaptor.rb
|
106
107
|
- lib/titi/matcher.rb
|
@@ -110,7 +111,6 @@ files:
|
|
110
111
|
- lib/titi/provider/activity_streams.rb
|
111
112
|
- lib/titi/provider/tripit.rb
|
112
113
|
- lib/titi/provider/twitter.rb
|
113
|
-
- lib/titi/provider/twitter/example.rb
|
114
114
|
- lib/titi/provider/twitter/models.rb
|
115
115
|
- notes/jeweler-gen.sh
|
116
116
|
- spec/spec.opts
|
@@ -150,3 +150,4 @@ summary: Emit and consume Activity Streams from a wide variety of sources
|
|
150
150
|
test_files:
|
151
151
|
- spec/spec_helper.rb
|
152
152
|
- spec/titi_spec.rb
|
153
|
+
- examples/twitter.rb
|
@@ -1,11 +0,0 @@
|
|
1
|
-
require 'restclient'
|
2
|
-
require 'json'
|
3
|
-
require 'titi'
|
4
|
-
require 'wukong'
|
5
|
-
require 'active_support'
|
6
|
-
|
7
|
-
# Dir['./**/*.rb'].each{|req| load req }^
|
8
|
-
# $raw_json_str = RestClient.get 'http://twitter.com/users/show/mrflip.json'
|
9
|
-
$raw_json_str = %q{{"created_at":"Mon Mar 19 21:08:24 +0000 2007","profile_sidebar_fill_color":"ffffff","description":"Founder, http://infochimps.org - Building tools to Organize, Explore and Comprehend massive data sources","verified":false,"time_zone":"Central Time (US & Canada)","status":{"in_reply_to_status_id":null,"created_at":"Sat Apr 17 05:47:28 +0000 2010","favorited":false,"in_reply_to_user_id":null,"source":"<a href=\"http://www.atebits.com/\" rel=\"nofollow\">Tweetie</a>","id":12327261220,"in_reply_to_screen_name":null,"truncated":false,"text":"Hacking Activity Streams yay"},"following":null,"profile_sidebar_border_color":"f0edd8","url":"http://infochimps.org","profile_image_url":"http://a3.twimg.com/profile_images/377919497/FlipCircle-2009-900-trans_normal.png","notifications":null,"followers_count":1061,"profile_background_color":"BCC0C8","location":"iPhone: 30.316122,-97.733817","screen_name":"mrflip","profile_background_image_url":"http://a3.twimg.com/profile_background_images/2348065/2005Mar-AustinTypeTour-075_-_Rappers_Delight_Raindrop.jpg","friends_count":754,"statuses_count":1744,"profile_text_color":"000000","protected":false,"profile_background_tile":false,"favourites_count":98,"name":"Philip Flip Kromer","contributors_enabled":false,"profile_link_color":"0000ff","id":1554031,"lang":"en","geo_enabled":true,"utc_offset":-21600}}
|
10
|
-
$raw_user = JSON.load($raw_json_str.to_s)
|
11
|
-
$user = Titi::Provider::Twitter::User.from_hash $raw_user
|