titi: Agile Monkeying around with Activity Streams

Titi is a first stab at a universal ActivityStream interface.

BUGS:

  • The XML output isn’t activity stream format: needs namespaces, much more

Example


class Titi::Provider::Twitter::Status
def to_activity_stream_entry
ActivityStreams::Entry.adapt(
:id        => %Q{tag:twitter.com,2007:http://twitter.com/#{user.screen_name}/statuses/#{id}},
:title     => text,
:content   => text,
:published => created_at,
:verb      => :post
) do |entry|
entry.author    = ActivityStreams::Author.new(user.name, user.url)
entry.object    = ActivityStreams::ActivityObject.adapt do |activity_obj|
activity_obj.id        = id
activity_obj.title     = text
activity_obj.published = created_at
activity_obj.updated   = created_at
activity_obj.author    = entry.author
end
end
end

tweet = Twitter::Status.get(12233609555)
entry = tweet.to_activity_stream_entry
puts entry.to_xml

<?xml version=“1.0” encoding=“<span class="caps">UTF</span>-8”?>
<entry>
          <verb type="symbol">post</verb>
          <mood nil="true"></mood>
          <category nil="true"></category>
<author>
            <name>Sockamillion</name>
            <uri>http://www.sockington.org/</uri>
</author>
          <title><span class="caps">THANK</span> <span class="caps">GOODNESS</span> <span class="caps">THE</span> <span class="caps">LIBRARY</span> OF <span class="caps">CONGRESS</span> <span class="caps">HAS</span> <span class="caps">UNDERSTOOD</span> <span class="caps">THE</span> <span class="caps">IMPORTANCE</span> OF MY <span class="caps">TWEETS</span> what do you mean others are getting in too</title>
          <actor nil="true"></actor>
          <published type="datetime">2010-04-15T17:01:52+00:00</published>
          <rank nil="true"></rank>
          <sync nil="true"></sync>
          <id>tag:twitter.com,2007:http://twitter.com/sockington/statuses/12233609555</id>
          <content><span class="caps">THANK</span> <span class="caps">GOODNESS</span> <span class="caps">THE</span> <span class="caps">LIBRARY</span> OF <span class="caps">CONGRESS</span> <span class="caps">HAS</span> <span class="caps">UNDERSTOOD</span> <span class="caps">THE</span> <span class="caps">IMPORTANCE</span> OF MY <span class="caps">TWEETS</span> what do you mean others are getting in too</content>
          <target nil="true"></target>
          <link nil="true"></link>
<object>
<author>
              <name>Sockamillion</name>
              <uri>http://www.sockington.org/</uri>
</author>
            <title><span class="caps">THANK</span> <span class="caps">GOODNESS</span> <span class="caps">THE</span> <span class="caps">LIBRARY</span> OF <span class="caps">CONGRESS</span> <span class="caps">HAS</span> <span class="caps">UNDERSTOOD</span> <span class="caps">THE</span> <span class="caps">IMPORTANCE</span> OF MY <span class="caps">TWEETS</span> what do you mean others are getting in too</title>
            <published>Thu Apr 15 17:01:52 +0000 2010</published>
            <id type="integer">12233609555</id>
            <vevent nil="true"></vevent>
            <content nil="true"></content>
            <link nil="true"></link>
            <updated>Thu Apr 15 17:01:52 +0000 2010</updated>
            <object-type nil="true"></object-type>
</object>
          <source nil="true"></source>
          <updated nil="true"></updated>
</entry>
p tweet
{"truncated"=>false, “favorited”=>false, “created_at”=>"Thu Apr 15 17:01:52 +0000 2010", “text”=>"THANK <span class="caps">GOODNESS</span> <span class="caps">THE</span> <span class="caps">LIBRARY</span> OF <span class="caps">CONGRESS</span> <span class="caps">HAS</span> <span class="caps">UNDERSTOOD</span> <span class="caps">THE</span> <span class="caps">IMPORTANCE</span> OF MY <span class="caps">TWEETS</span> 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.<span class="caps">JPG</span>”>, “in_reply_to_status_id”=>nil}

== Note on Patches/Pull Requests

  • Fork the project.
  • Make your feature addition or bug fix.
  • Add tests for it. This is important so I don’t break it in a future version unintentionally.
  • Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
  • Send me a pull request. Bonus points for topic branches.

== Copyright

Copyright © 2010 mrflip. See LICENSE for details.