gir_ffi 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
data/lib/gir_ffi.rb CHANGED
@@ -2,8 +2,8 @@ require 'gir_ffi/i_repository'
2
2
  require 'gir_ffi/builder'
3
3
 
4
4
  module GirFFI
5
- def self.setup module_name
5
+ def self.setup module_name, version=nil
6
6
  module_name = module_name.to_s
7
- GirFFI::Builder.build_module module_name
7
+ GirFFI::Builder.build_module module_name, version
8
8
  end
9
9
  end
data/test/builder_test.rb CHANGED
@@ -308,7 +308,7 @@ class BuilderTest < Test::Unit::TestCase
308
308
  end
309
309
 
310
310
  should "know its own class builder" do
311
- assert GirFFI::Builder::Class === Regress::TestObj.gir_ffi_builder
311
+ assert GirFFI::Builder::Type::Base === Regress::TestObj.gir_ffi_builder
312
312
  end
313
313
 
314
314
  context "its #torture_signature_0 method" do
data/test/girffi_test.rb CHANGED
@@ -2,8 +2,10 @@ require File.expand_path('test_helper.rb', File.dirname(__FILE__))
2
2
 
3
3
  class GirFFITest < Test::Unit::TestCase
4
4
  context "GirFFI" do
5
- should "not be tested yet" do
6
- assert true
5
+ should "be able to set up cairo" do
6
+ assert_nothing_raised {
7
+ GirFFI.setup :cairo
8
+ }
7
9
  end
8
10
  end
9
11
  end
@@ -1,7 +1,7 @@
1
1
  require File.expand_path('test_helper.rb', File.dirname(__FILE__))
2
2
 
3
- class ClassBuilderTest < Test::Unit::TestCase
4
- context "The Builder::Class class" do
3
+ class TypeBuilderTest < Test::Unit::TestCase
4
+ context "The Builder::Type class" do
5
5
  setup do
6
6
  @gir = GirFFI::IRepository.default
7
7
  end
@@ -11,11 +11,11 @@ class ClassBuilderTest < Test::Unit::TestCase
11
11
 
12
12
  stub(info = Object.new).parent { @gir.find_by_name 'GObject', 'Object' }
13
13
  stub(info).fields { [] }
14
- stub(info).type { :object }
14
+ stub(info).info_type { :object }
15
15
  stub(info).name { 'Bar' }
16
16
  stub(info).namespace { 'Foo' }
17
17
 
18
- @classbuilder = GirFFI::Builder::Class.new info
18
+ @classbuilder = GirFFI::Builder::Type::Object.new info
19
19
 
20
20
  spec = @classbuilder.send :layout_specification
21
21
  assert_equal [:parent, GObject::Object::Struct, 0], spec
@@ -23,7 +23,7 @@ class ClassBuilderTest < Test::Unit::TestCase
23
23
 
24
24
  context "for Gtk::Widget" do
25
25
  setup do
26
- @cbuilder = GirFFI::Builder::Class.new @gir.find_by_name('Gtk', 'Widget')
26
+ @cbuilder = GirFFI::Builder::Type::Object.new @gir.find_by_name('Gtk', 'Widget')
27
27
  end
28
28
 
29
29
  context "looking at Gtk::Widget#show" do
@@ -42,19 +42,19 @@ class ClassBuilderTest < Test::Unit::TestCase
42
42
 
43
43
  context 'the find_signal method' do
44
44
  should 'find the signal "test" for TestObj' do
45
- builder = GirFFI::Builder::Class.new @gir.find_by_name('Regress', 'TestObj')
45
+ builder = GirFFI::Builder::Type::Object.new @gir.find_by_name('Regress', 'TestObj')
46
46
  sig = builder.find_signal 'test'
47
47
  assert_equal 'test', sig.name
48
48
  end
49
49
 
50
50
  should 'find the signal "test" for TestSubObj' do
51
- builder = GirFFI::Builder::Class.new @gir.find_by_name('Regress', 'TestSubObj')
51
+ builder = GirFFI::Builder::Type::Object.new @gir.find_by_name('Regress', 'TestSubObj')
52
52
  sig = builder.find_signal 'test'
53
53
  assert_equal 'test', sig.name
54
54
  end
55
55
 
56
56
  should 'find the signal "changed" for Gtk::Entry' do
57
- builder = GirFFI::Builder::Class.new @gir.find_by_name('Gtk', 'Entry')
57
+ builder = GirFFI::Builder::Type::Object.new @gir.find_by_name('Gtk', 'Entry')
58
58
  sig = builder.find_signal 'changed'
59
59
  assert_equal 'changed', sig.name
60
60
  end
@@ -62,7 +62,7 @@ class ClassBuilderTest < Test::Unit::TestCase
62
62
 
63
63
  context "for GObject::TypeCValue (a union)" do
64
64
  setup do
65
- @cbuilder = GirFFI::Builder::Class.new @gir.find_by_name('GObject', 'TypeCValue')
65
+ @cbuilder = GirFFI::Builder::Type::Union.new @gir.find_by_name('GObject', 'TypeCValue')
66
66
  end
67
67
 
68
68
  should "not raise an error looking for a method that doesn't exist" do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gir_ffi
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 15
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 7
10
- version: 0.0.7
9
+ - 8
10
+ version: 0.0.8
11
11
  platform: ruby
12
12
  authors:
13
13
  - Matijs van Zuijlen
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-04-01 00:00:00 +02:00
18
+ date: 2011-04-08 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -66,7 +66,7 @@ dependencies:
66
66
  version: 1.0.2
67
67
  type: :development
68
68
  version_requirements: *id003
69
- description: Ruby-FFI-based binding of the GObject Introspection Repository
69
+ description:
70
70
  email:
71
71
  - matijs@matijs.net
72
72
  executables: []
@@ -89,7 +89,16 @@ files:
89
89
  - lib/gir_ffi/builder.rb
90
90
  - lib/gir_ffi/builder/module.rb
91
91
  - lib/gir_ffi/builder/function.rb
92
- - lib/gir_ffi/builder/class.rb
92
+ - lib/gir_ffi/builder/type/base.rb
93
+ - lib/gir_ffi/builder/type/interface.rb
94
+ - lib/gir_ffi/builder/type/struct_based.rb
95
+ - lib/gir_ffi/builder/type/struct.rb
96
+ - lib/gir_ffi/builder/type/enum.rb
97
+ - lib/gir_ffi/builder/type/registered_type.rb
98
+ - lib/gir_ffi/builder/type/callback.rb
99
+ - lib/gir_ffi/builder/type/union.rb
100
+ - lib/gir_ffi/builder/type/object.rb
101
+ - lib/gir_ffi/builder/type.rb
93
102
  - lib/gir_ffi/builder/argument.rb
94
103
  - lib/gir_ffi/i_enum_info.rb
95
104
  - lib/gir_ffi/i_value_info.rb
@@ -130,12 +139,12 @@ files:
130
139
  - test/lib/m4/jhflags.m4
131
140
  - test/class_base_test.rb
132
141
  - test/test_helper.rb
133
- - test/class_builder_test.rb
134
142
  - test/girffi_test.rb
135
143
  - test/module_builder_test.rb
136
144
  - test/i_object_info_test.rb
137
145
  - test/g_object_overrides_test.rb
138
146
  - test/generated_gtk_test.rb
147
+ - test/type_builder_test.rb
139
148
  - test/builder_test.rb
140
149
  - test/gtk_overrides_test.rb
141
150
  - test/generated_gio_test.rb
@@ -189,12 +198,11 @@ rubyforge_project:
189
198
  rubygems_version: 1.6.2
190
199
  signing_key:
191
200
  specification_version: 3
192
- summary: Ruby-FFI-based binding of the GObject Introspection Repository
201
+ summary: FFI-based GObject binding using the GObject Introspection Repository
193
202
  test_files:
194
203
  - test/arg_helper_test.rb
195
204
  - test/builder_test.rb
196
205
  - test/class_base_test.rb
197
- - test/class_builder_test.rb
198
206
  - test/function_definition_builder_test.rb
199
207
  - test/g_object_overrides_test.rb
200
208
  - test/g_object_test.rb
@@ -211,3 +219,4 @@ test_files:
211
219
  - test/lib/m4/jhflags.m4
212
220
  - test/module_builder_test.rb
213
221
  - test/test_helper.rb
222
+ - test/type_builder_test.rb
@@ -1,286 +0,0 @@
1
- require 'gir_ffi/builder_helper'
2
- module GirFFI
3
- # Builds a class based on information found in the introspection
4
- # repository.
5
- class Builder::Class
6
- include BuilderHelper
7
-
8
- def initialize info
9
- @info = info
10
- @namespace = @info.namespace
11
- @classname = @info.name.gsub(/^(.)/) { $1.upcase }
12
- end
13
-
14
- def generate
15
- build_class
16
- end
17
-
18
- def setup_method method
19
- klass = build_class
20
- meta = (class << klass; self; end)
21
-
22
- go = method_introspection_data method
23
- raise NoMethodError unless go
24
- attach_and_define_method method, go, meta
25
- end
26
-
27
- def setup_instance_method method
28
- go = instance_method_introspection_data method
29
- result = attach_and_define_method method, go, build_class
30
-
31
- unless result
32
- if parent
33
- return superclass.gir_ffi_builder.setup_instance_method method
34
- else
35
- return false
36
- end
37
- end
38
-
39
- true
40
- end
41
-
42
- def find_signal signal_name
43
- signal_definers.each do |inf|
44
- inf.signals.each do |sig|
45
- return sig if sig.name == signal_name
46
- end
47
- end
48
- if parent
49
- return superclass.gir_ffi_builder.find_signal signal_name
50
- end
51
- end
52
-
53
- private
54
-
55
- def build_class
56
- unless defined? @klass
57
- case info.type
58
- when :object, :struct, :interface
59
- instantiate_struct_class
60
- when :union
61
- instantiate_union_class
62
- when :enum, :flags
63
- instantiate_enum_class
64
- when :callback
65
- instantiate_callback_class
66
- else
67
- raise NotImplementedError, "Cannot build classes of type #{info.type}"
68
- end
69
- end
70
- @klass
71
- end
72
-
73
- def info
74
- unless defined? @info
75
- @info = gir.find_by_name @namespace, @classname
76
- raise "Class #{@classname} not found in namespace #{@namespace}" if @info.nil?
77
- end
78
- @info
79
- end
80
-
81
- def parent
82
- unless defined? @parent
83
- if info.type == :object
84
- pr = info.parent
85
- if pr.nil? or (pr.name == @classname and pr.namespace == @namespace)
86
- @parent = nil
87
- else
88
- @parent = pr
89
- end
90
- else
91
- @parent = nil
92
- end
93
- end
94
- @parent
95
- end
96
-
97
- def superclass
98
- unless defined? @superclass
99
- if parent
100
- @superclass = Builder.build_class parent
101
- else
102
- @superclass = GirFFI::ClassBase
103
- end
104
- end
105
- @superclass
106
- end
107
-
108
- def namespace_module
109
- @namespace_module ||= Builder.build_module @namespace
110
- end
111
-
112
- def lib
113
- @lib ||= namespace_module.const_get :Lib
114
- end
115
-
116
- def instantiate_struct_class
117
- @klass = get_or_define_class namespace_module, @classname, superclass
118
- @structklass = get_or_define_class @klass, :Struct, FFI::Struct
119
- setup_class unless already_set_up
120
- end
121
-
122
- def instantiate_union_class
123
- @klass = get_or_define_class namespace_module, @classname, superclass
124
- @structklass = get_or_define_class @klass, :Struct, FFI::Union
125
- setup_class unless already_set_up
126
- end
127
-
128
- def instantiate_enum_class
129
- @klass = optionally_define_constant namespace_module, @classname do
130
- vals = info.values.map {|vinfo| [vinfo.name.to_sym, vinfo.value]}.flatten
131
- lib.enum(@classname.to_sym, vals)
132
- end
133
- end
134
-
135
- def instantiate_callback_class
136
- @klass = optionally_define_constant namespace_module, @classname do
137
- args = Builder.ffi_function_argument_types info
138
- ret = Builder.ffi_function_return_type info
139
- lib.callback @classname.to_sym, args, ret
140
- end
141
- end
142
-
143
- def setup_class
144
- setup_layout
145
- setup_constants
146
- stub_methods
147
- setup_gtype_getter
148
-
149
- setup_vfunc_invokers if info.type == :object
150
- provide_struct_constructor if info.type == :struct
151
- end
152
-
153
- def setup_layout
154
- spec = layout_specification
155
- @structklass.class_eval { layout(*spec) }
156
- end
157
-
158
- def layout_specification
159
- fields = if info.type == :interface
160
- []
161
- else
162
- info.fields
163
- end
164
-
165
- if fields.empty?
166
- if parent
167
- return [:parent, superclass.const_get(:Struct), 0]
168
- else
169
- return [:dummy, :char, 0]
170
- end
171
- end
172
-
173
- fields.map do |finfo|
174
- [ finfo.name.to_sym,
175
- itypeinfo_to_ffitype_for_struct(finfo.type),
176
- finfo.offset ]
177
- end.flatten
178
- end
179
-
180
- def itypeinfo_to_ffitype_for_struct typeinfo
181
- ffitype = Builder.itypeinfo_to_ffitype typeinfo
182
- if ffitype.kind_of?(Class) and const_defined_for ffitype, :Struct
183
- ffitype = ffitype.const_get :Struct
184
- end
185
- if ffitype == :bool
186
- ffitype = :int
187
- end
188
- ffitype
189
- end
190
-
191
- def stub_methods
192
- info.methods.each do |minfo|
193
- @klass.class_eval method_stub(minfo.name, minfo.method?)
194
- end
195
- end
196
-
197
- def method_stub symbol, is_instance_method
198
- "
199
- def #{is_instance_method ? '' : 'self.'}#{symbol} *args, &block
200
- setup_and_call :#{symbol}, *args, &block
201
- end
202
- "
203
- end
204
-
205
- def setup_gtype_getter
206
- getter = info.type_init
207
- return if getter.nil? or getter == "intern"
208
- lib.attach_function getter.to_sym, [], :size_t
209
- @klass.class_eval "
210
- def self.get_gtype
211
- ::#{lib}.#{getter}
212
- end
213
- "
214
- end
215
-
216
- def setup_vfunc_invokers
217
- info.vfuncs.each do |vfinfo|
218
- invoker = vfinfo.invoker
219
- next if invoker.nil?
220
- next if invoker.name == vfinfo.name
221
-
222
- @klass.class_eval "
223
- def #{vfinfo.name} *args, &block
224
- #{invoker.name}(*args, &block)
225
- end
226
- "
227
- end
228
- end
229
-
230
- def provide_struct_constructor
231
- return if info.find_method 'new'
232
-
233
- (class << @klass; self; end).class_eval {
234
- alias_method :new, :allocate
235
- }
236
- end
237
-
238
- def setup_constants
239
- @klass.const_set :GIR_INFO, info
240
- @klass.const_set :GIR_FFI_BUILDER, self
241
- end
242
-
243
- def already_set_up
244
- const_defined_for @klass, :GIR_FFI_BUILDER
245
- end
246
-
247
- def method_introspection_data method
248
- info.find_method method
249
- end
250
-
251
- def instance_method_introspection_data method
252
- data = method_introspection_data method
253
- return !data.nil? && data.method? ? data : nil
254
- end
255
-
256
- def function_definition go
257
- Builder::Function.new(go, lib).generate
258
- end
259
-
260
- def attach_and_define_method method, go, modul
261
- return false if go.nil?
262
- Builder.attach_ffi_function lib, go
263
- modul.class_eval { remove_method method }
264
- modul.class_eval function_definition(go)
265
- true
266
- end
267
-
268
- def gir
269
- unless defined? @gir
270
- @gir = IRepository.default
271
- @gir.require @namespace, nil
272
- end
273
- @gir
274
- end
275
-
276
- def get_or_define_class namespace, name, parent
277
- optionally_define_constant(namespace, name) {
278
- Class.new parent
279
- }
280
- end
281
-
282
- def signal_definers
283
- [info] + (info.type == :object ? info.interfaces : [])
284
- end
285
- end
286
- end