From c55eef16c007fda03d489ec1041b91014c3a1bfe Mon Sep 17 00:00:00 2001 From: Antonio Terceiro Date: Sat, 17 Mar 2012 20:09:29 -0300 Subject: [PATCH] Add Ruby-style method to GObject objects * object.x -> object.get_x * object.x= -> object.set_x * object.signal_connect -> GObject.signal_connect --- lib/ffi-gobject/object.rb | 5 +++++ lib/ffi-gobject/ruby_style.rb | 21 ++++++++++++++++++ test/ffi-gobject/object_test.rb | 4 ++++ test/ffi-gobject/ruby_style.rb | 39 +++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+) create mode 100644 lib/ffi-gobject/ruby_style.rb create mode 100644 test/ffi-gobject/ruby_style.rb diff --git a/lib/ffi-gobject/object.rb b/lib/ffi-gobject/object.rb index 4e52fa4e8..dd3229083 100644 --- a/lib/ffi-gobject/object.rb +++ b/lib/ffi-gobject/object.rb @@ -1,8 +1,13 @@ +require 'ffi-gobject/ruby_style' + module GObject load_class :Object # Overrides for GObject, GObject's generic base class. class Object + + include RubyStyle + _setup_method "new" _setup_instance_method "get_property" _setup_instance_method "set_property" diff --git a/lib/ffi-gobject/ruby_style.rb b/lib/ffi-gobject/ruby_style.rb new file mode 100644 index 000000000..2861d07de --- /dev/null +++ b/lib/ffi-gobject/ruby_style.rb @@ -0,0 +1,21 @@ +module GObject + + module RubyStyle + + def method_missing(method, *args) + if respond_to?("get_#{method}") + return send("get_#{method}", *args) + end + if method.to_s =~ /(.*)=$/ && respond_to?("set_#{$1}") + return send("set_#{$1}", *args) + end + super + end + + def signal_connect(event, &block) + GObject.signal_connect(self, event, &block) + end + + end + +end diff --git a/test/ffi-gobject/object_test.rb b/test/ffi-gobject/object_test.rb index b12d525b9..08ff052fa 100644 --- a/test/ffi-gobject/object_test.rb +++ b/test/ffi-gobject/object_test.rb @@ -8,5 +8,9 @@ assert_equal 1, GObject::Object.instance_method("get_property").arity end + + it 'includes GObject::RubyStyle' do + assert GObject::Object.included_modules.include?(GObject::RubyStyle) + end end end diff --git a/test/ffi-gobject/ruby_style.rb b/test/ffi-gobject/ruby_style.rb new file mode 100644 index 000000000..16ecf2aa2 --- /dev/null +++ b/test/ffi-gobject/ruby_style.rb @@ -0,0 +1,39 @@ +require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__)) + +require 'ffi-gobject/ruby_style' + +describe GObject::RubyStyle do + class RubyStyleTest + include GObject::RubyStyle + def get_x + @x + end + def set_x(val) + @x = val + end + end + + subject { RubyStyleTest.new } + + it 'reads x by calling get_x' do + subject.set_x(1) + assert_equal 1, subject.x + end + + it 'writes x by calling set_x' do + subject.x = 2 + assert_equal 2, subject.x + end + + it 'delegates signal_connect to GObject' do + block = lambda {} + mock(GObject).signal_connect(subject, 'some-event') + subject.signal_connect('some-event') do + nothing + end + + RR.verify + end + +end +