Glader: quick .glade -> Ruby

Here's a tiny script I wrote to go the last mile when generating Ruby
programs to make
use of Glade forms. The ruby-glade-create-template program that comes in the
libglade2-ruby.18 package creates an example program that will be
overwritten each
time the script is re-run.

Glader makes a script that uses the example program, allowing you to
repeatedly save
your .glade file, convert it and "run" it to see changes.

I hope that makes sense to *someone*

Example session:

···

----------------------
lesliev@lesliev-laptop:~/glade_test/calbox$ ./glader.rb layout.glade
Making class file (layout_glade.rb)...
Making main file (layout.rb)...

lesliev@lesliev-laptop:~/glade_test/calbox$ ruby layout.rb (to play
with the form)

...now you can edit and re-save your .glade form and quickly regen
without overwriting any of your changes to layout.rb by running glader again.

Glader:
---------

#!/usr/bin/ruby -w

# This class is a quick way of creating a runnable Ruby program from
# a single Glade form.
#
class Glader
  def initialize(glade_filename)
    raise ArgumentError.new("File missing: #{glade_filename}") if
!File.exist?(glade_filename)
    raise ArgumentError.new("Not a .glade file: #{glade_filename}") if
glade_filename !~ /.*\.glade/

    @glade_filename = glade_filename
    @base_filename = File.basename(@glade_filename, ".glade")
    @class_filename = @base_filename + "_glade.rb"
  end

  # Runs the ruby-glade-create-template script to create a file with a
  # class that corresponds to the form. This can be called repeatedly
  # to keep creating the class every time the .glade file changes.
  #
  def make_class
    `/usr/bin/ruby-glade-create-template #{@glade_filename} > #{@class_filename}`
    @class_filename
  end

  # Creates a main program that uses the glade class created with
  # _make_class_ and opens the window with the form. It will do nothing
  # if the main program file already exists, since the user is likely
  # to add code to this file.
  #
  def make_main
    main_filename = @base_filename + '.rb'

    if(File.exist?(main_filename))
      raise ArgumentError.new("#{main_filename} already exists, skipping")
    else
      File.open(main_filename, "w") {|f| f.write generate_main}
    end
    main_filename
  end

  private
  def generate_main()
    class_name = File.read(@class_filename).scan(/class (.*)/).to_s
    window_id = File.read(@glade_filename).scan(/class="GtkWindow"
id="(\w*)">/).to_s

    main =<<END

require '#{@base_filename}_glade'

class #{class_name}
  def show
    @glade["#{window_id}"].show
  end

  #if this signal exists, exit nicely
  #
  def on_#{window_id}_destroy(widget)
    Gtk.main_quit
  end
end

form = #{class_name}.new("#{@glade_filename}", nil, "Application")
form.show

Gtk.main

END
  end
end

if __FILE__ == $0
  if ARGV.length != 1
    puts
    puts "This script creates a class and a main program that shows a
window using"
    puts "that class from a .glade file. It can be used to quickly
generate a functional Ruby"
    puts "program from a .glade file"
    puts
    puts "Usage: #{__FILE__} <file.glade>"
    puts
    exit
  end

  glader = Glader.new(ARGV[0])
  print "Making class file (#{glader.make_class})...\n"

  begin
    print "Making main file (#{glader.make_main})...\n"
  rescue => e
    puts e.message
  end
  puts

end