AsyncRunner for Ruby/GLib

Was playing around a bit with a synchronous network library that I wanted to use from a GTK+ frontend. Obviously this wouldn’t work too well as the UI would be blocked while waiting for the library to return from it’s network calls. So I wanted to run the network operations in the background using a thread but still get the callbacks in the main thread to be able to update the UI from there.

I ended up writing a small class I called AsyncRunner which is a small proxy to call methods in a various thread and get the callback in the main thread. It’s using the GLib Mainloop so it would only be useful in the cases where you actually have one.

require 'thread-sync'
class MySyncClass
  def foo_method(arg)
  end

  def bar_method(arg1, arg2)
  end
end

sync = MySyncClass.new

# In order to get the methods of MySyncClass asynchronous it is wrapped in an AsyncRunner.
async = AsyncRunner.new(sync)

async.foo_method('test') do
  ui_update()
end

main_loop = GLib::MainLoop.new
main_loop.run

Using Twitter4R on Mac OS X

Was playing around a bit with the Twitter4R library the other day and realized that in order to make it to work on Mac OS X (Leopard) you need to also require ‘time’. Or you will get an error similar to lib/twitter/model.rb:268:in `init’: undefined method `parse’ for Time:Class (NoMethodError).

A small snippet to display my public tweets:

require 'rubygems'
gem('twitter4r', '0.3.0')
require 'twitter'

# Required on Mac OS X Leopard
require 'time'

twitter = Twitter::Client.new

hallski_timeline = twitter.timeline_for(:user, :id => 'hallski')

hallski_timeline.each do |status|
  puts status.text
end

Ruby bindings for Loudmouth

Last week I sat down and wrote bindings for Loudmouth. This means that anyone who want to write an XMPP enabled application with GTK+/Ruby now have an asynchronous library that integrates perfectly with the GLib mainloop.

It also gives me access to testing and writing small scripts using Loudmouth with the beauty of Ruby.

Here is a small example showing the bindings in the current state:

require 'loudmouth'

conn = LM::Connection.new
conn.jid = 'myjid@mydomain.com'

conn.open do |open_result|
  if open_result
    conn.authenticate('username', 'password', 'resource') do |auth_result|
      if result
         puts "Authenticated, do your stuff"
       end
    end
  end
end

GLib::MainLoop.new.run

So far I have only bound the asynchronous calls and I am not sure whether I will bind synchronous ones in the future.

If you want to try them out or even better, help out by improving them or write example code. Create an account at Github and watch/clone the repository. It’s named loudmouth-ruby.

Next Page »

Close
E-mail It