gir_ffi 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Changelog.md +7 -0
- data/lib/ffi-glib/iconv.rb +14 -0
- data/lib/ffi-glib.rb +3 -0
- data/lib/ffi-gobject_introspection/i_function_info.rb +2 -2
- data/lib/gir_ffi/builders/with_methods.rb +4 -3
- data/lib/gir_ffi/class_base.rb +18 -14
- data/lib/gir_ffi/method_stubber.rb +4 -5
- data/lib/gir_ffi/version.rb +1 -1
- data/test/ffi-glib/iconv_test.rb +18 -0
- data/test/gir_ffi/builders/union_builder_test.rb +2 -2
- data/test/gir_ffi/builders/with_methods_test.rb +30 -0
- data/test/gir_ffi/class_base_test.rb +38 -6
- data/test/gir_ffi/method_stubber_test.rb +59 -0
- data/test/integration/generated_gimarshallingtests_test.rb +1 -0
- data/test/integration/generated_glib_test.rb +10 -0
- metadata +18 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8cf0a7c44fc03dbe6b94889b4f2d9fb4d0ffd3d4
|
4
|
+
data.tar.gz: 125f3d704a2d1dbf911503efd0ee15b7b520b96f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8701346e6ed89cac5567fff4c564c536debc9a64f0cd91f1c61792e363265f84ab385c8a410fb52acb65ecbfab105fa085f39e4a10e20534388e7e5fe5e7fac
|
7
|
+
data.tar.gz: 922d806dd05c7e353fb5e382ab04ae982abc7fe96bb470a855d937ef273b524d1ecd3d6a9346480c23cb28f56bb7137697370bb2af179a1e91b7946c7654e87b
|
data/Changelog.md
CHANGED
@@ -0,0 +1,14 @@
|
|
1
|
+
module GLib
|
2
|
+
load_class :IConv
|
3
|
+
|
4
|
+
# Overrides for IConv
|
5
|
+
class IConv
|
6
|
+
def self.open(to_codeset, from_codeset)
|
7
|
+
to_ptr = GirFFI::InPointer.from(:utf8, to_codeset)
|
8
|
+
from_ptr = GirFFI::InPointer.from(:utf8, from_codeset)
|
9
|
+
result_ptr = Lib.g_iconv_open(to_ptr, from_ptr)
|
10
|
+
wrap(result_ptr)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
data/lib/ffi-glib.rb
CHANGED
@@ -6,6 +6,7 @@ GirFFI.setup :GLib
|
|
6
6
|
require 'ffi-glib/array'
|
7
7
|
require 'ffi-glib/byte_array'
|
8
8
|
require 'ffi-glib/hash_table'
|
9
|
+
require 'ffi-glib/iconv'
|
9
10
|
require 'ffi-glib/list'
|
10
11
|
require 'ffi-glib/ptr_array'
|
11
12
|
require 'ffi-glib/s_list'
|
@@ -37,5 +38,7 @@ module GLib
|
|
37
38
|
attach_function :g_ptr_array_new, [], :pointer
|
38
39
|
attach_function :g_ptr_array_add, [:pointer, :pointer], :void
|
39
40
|
attach_function :g_ptr_array_foreach, [:pointer, Func, :pointer], :pointer
|
41
|
+
|
42
|
+
attach_function :g_iconv_open, [:pointer, :pointer], :pointer
|
40
43
|
end
|
41
44
|
end
|
@@ -27,11 +27,12 @@ module GirFFI
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def attach_and_define_method method, go, modul
|
30
|
-
return
|
30
|
+
return unless go
|
31
|
+
method = go.safe_name
|
31
32
|
Builder.attach_ffi_function lib, go
|
32
|
-
modul.class_eval { remove_method method }
|
33
|
+
modul.class_eval { remove_method method if method_defined? method }
|
33
34
|
build_class.class_eval function_definition(go)
|
34
|
-
|
35
|
+
return method
|
35
36
|
end
|
36
37
|
|
37
38
|
def stub_methods
|
data/lib/gir_ffi/class_base.rb
CHANGED
@@ -14,16 +14,13 @@ module GirFFI
|
|
14
14
|
GIR_FFI_BUILDER = NullBuilder.new
|
15
15
|
|
16
16
|
def setup_and_call method, *arguments, &block
|
17
|
-
|
18
|
-
klass.respond_to?(:setup_instance_method) &&
|
19
|
-
klass.setup_instance_method(method.to_s)
|
20
|
-
end
|
17
|
+
method_name = self.class.try_in_ancestors(:setup_instance_method, method.to_s)
|
21
18
|
|
22
|
-
unless
|
23
|
-
raise RuntimeError, "Unable to set up instance method #{method} in #{self}"
|
19
|
+
unless method_name
|
20
|
+
raise RuntimeError, "Unable to set up instance method '#{method}' in #{self}"
|
24
21
|
end
|
25
22
|
|
26
|
-
self.send
|
23
|
+
self.send method_name, *arguments, &block
|
27
24
|
end
|
28
25
|
|
29
26
|
if RUBY_PLATFORM == 'java'
|
@@ -39,16 +36,23 @@ module GirFFI
|
|
39
36
|
end
|
40
37
|
|
41
38
|
def self.setup_and_call method, *arguments, &block
|
42
|
-
|
43
|
-
klass.respond_to?(:setup_method) &&
|
44
|
-
klass.setup_method(method.to_s)
|
45
|
-
end
|
39
|
+
method_name = self.try_in_ancestors(:setup_method, method.to_s)
|
46
40
|
|
47
|
-
unless
|
48
|
-
raise RuntimeError, "Unable to set up method #{method} in #{self}"
|
41
|
+
unless method_name
|
42
|
+
raise RuntimeError, "Unable to set up method '#{method}' in #{self}"
|
49
43
|
end
|
50
44
|
|
51
|
-
self.send
|
45
|
+
self.send method_name, *arguments, &block
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.try_in_ancestors(method, *arguments)
|
49
|
+
self.ancestors.each do |klass|
|
50
|
+
if klass.respond_to?(method)
|
51
|
+
result = klass.send(method, *arguments)
|
52
|
+
return result if result
|
53
|
+
end
|
54
|
+
end
|
55
|
+
return
|
52
56
|
end
|
53
57
|
|
54
58
|
class << self
|
@@ -7,12 +7,11 @@ module GirFFI
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def method_stub
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
setup_and_call :#{symbol}, *args, &block
|
10
|
+
<<-STUB.reset_indentation
|
11
|
+
def #{@info.method? ? '' : 'self.'}#{@info.safe_name} *args, &block
|
12
|
+
setup_and_call #{@info.name.to_sym.inspect}, *args, &block
|
14
13
|
end
|
15
|
-
|
14
|
+
STUB
|
16
15
|
end
|
17
16
|
end
|
18
17
|
end
|
data/lib/gir_ffi/version.rb
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'gir_ffi_test_helper'
|
2
|
+
|
3
|
+
describe GLib::IConv do
|
4
|
+
describe ".open" do
|
5
|
+
it "creates a new instance of GLib::Iconv" do
|
6
|
+
instance = GLib::IConv.open("ascii", "utf-8")
|
7
|
+
instance.must_be_instance_of GLib::IConv
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:instance) { GLib::IConv.open("ascii", "utf-8") }
|
12
|
+
|
13
|
+
describe "#setup_and_call" do
|
14
|
+
it "works for the method called ''" do
|
15
|
+
instance.setup_and_call :'', nil, nil, nil, nil
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -5,8 +5,8 @@ describe GirFFI::Builders::UnionBuilder do
|
|
5
5
|
let(:builder) { GirFFI::Builders::UnionBuilder.new union_info }
|
6
6
|
|
7
7
|
describe "#setup_instance_method" do
|
8
|
-
it "returns
|
9
|
-
builder.setup_instance_method('blub').
|
8
|
+
it "returns nil looking for a method that doesn't exist" do
|
9
|
+
builder.setup_instance_method('blub').must_be_nil
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'gir_ffi_test_helper'
|
2
|
+
|
3
|
+
GirFFI.setup :Regress
|
4
|
+
|
5
|
+
describe GirFFI::Builders::WithMethods do
|
6
|
+
describe "#setup_instance_method" do
|
7
|
+
it "restores a method that was removed" do
|
8
|
+
Regress::TestObj.class_eval { remove_method "instance_method" }
|
9
|
+
|
10
|
+
builder = Regress::TestObj.gir_ffi_builder
|
11
|
+
|
12
|
+
builder.setup_instance_method "instance_method"
|
13
|
+
|
14
|
+
obj = Regress::TestObj.constructor
|
15
|
+
obj.must_respond_to "instance_method"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "returns the name of the generated method" do
|
19
|
+
builder = Regress::TestObj.gir_ffi_builder
|
20
|
+
result = builder.setup_instance_method "instance_method"
|
21
|
+
result.must_equal "instance_method"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns the name of the generated method if different from the info name" do
|
25
|
+
builder = GLib::IConv.gir_ffi_builder
|
26
|
+
result = builder.setup_instance_method ""
|
27
|
+
result.must_equal "_"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -70,13 +70,13 @@ describe GirFFI::ClassBase do
|
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
-
describe "
|
73
|
+
describe ".setup_and_call" do
|
74
74
|
it "looks up class methods in all builders" do
|
75
|
-
mock(builder = Object.new).setup_method("foo") {
|
75
|
+
mock(builder = Object.new).setup_method("foo") { "foo" }
|
76
76
|
klass = Class.new GirFFI::ClassBase
|
77
77
|
klass.const_set :GIR_FFI_BUILDER, builder
|
78
78
|
|
79
|
-
mock(sub_builder = Object.new).setup_method("foo") {
|
79
|
+
mock(sub_builder = Object.new).setup_method("foo") { nil }
|
80
80
|
sub_klass = Class.new klass do
|
81
81
|
def self.foo; end
|
82
82
|
end
|
@@ -85,12 +85,28 @@ describe GirFFI::ClassBase do
|
|
85
85
|
sub_klass.setup_and_call :foo
|
86
86
|
end
|
87
87
|
|
88
|
-
it "
|
89
|
-
mock(builder = Object.new).
|
88
|
+
it "calls the method given by the result of .setup_method" do
|
89
|
+
mock(builder = Object.new).setup_method("foo") { "bar" }
|
90
|
+
klass = Class.new GirFFI::ClassBase do
|
91
|
+
def self.bar
|
92
|
+
"correct-result"
|
93
|
+
end
|
94
|
+
def self.new; self._real_new; end
|
95
|
+
end
|
96
|
+
klass.const_set :GIR_FFI_BUILDER, builder
|
97
|
+
|
98
|
+
result = klass.setup_and_call :foo
|
99
|
+
result.must_equal "correct-result"
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
describe "#setup_and_call" do
|
104
|
+
it "looks up instance methods in all builders" do
|
105
|
+
mock(builder = Object.new).setup_instance_method("foo") { "foo" }
|
90
106
|
klass = Class.new GirFFI::ClassBase
|
91
107
|
klass.const_set :GIR_FFI_BUILDER, builder
|
92
108
|
|
93
|
-
mock(sub_builder = Object.new).setup_instance_method("foo") {
|
109
|
+
mock(sub_builder = Object.new).setup_instance_method("foo") { nil }
|
94
110
|
sub_klass = Class.new klass do
|
95
111
|
def foo; end
|
96
112
|
def initialize; end
|
@@ -102,5 +118,21 @@ describe GirFFI::ClassBase do
|
|
102
118
|
|
103
119
|
obj.setup_and_call :foo
|
104
120
|
end
|
121
|
+
|
122
|
+
it "calls the method given by the result of .setup_instance_method" do
|
123
|
+
mock(builder = Object.new).setup_instance_method("foo") { "bar" }
|
124
|
+
klass = Class.new GirFFI::ClassBase do
|
125
|
+
def bar
|
126
|
+
"correct-result"
|
127
|
+
end
|
128
|
+
def self.new; self._real_new; end
|
129
|
+
end
|
130
|
+
klass.const_set :GIR_FFI_BUILDER, builder
|
131
|
+
|
132
|
+
obj = klass.new
|
133
|
+
|
134
|
+
result = obj.setup_and_call :foo
|
135
|
+
result.must_equal "correct-result"
|
136
|
+
end
|
105
137
|
end
|
106
138
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'gir_ffi_test_helper'
|
2
|
+
|
3
|
+
describe GirFFI::MethodStubber do
|
4
|
+
describe "#method_stub" do
|
5
|
+
let(:stubber) { GirFFI::MethodStubber.new(method_info) }
|
6
|
+
let(:result) { stubber.method_stub }
|
7
|
+
|
8
|
+
describe "for a regular method" do
|
9
|
+
let(:method_info) {
|
10
|
+
get_method_introspection_data("Regress", "TestObj", "instance_method") }
|
11
|
+
|
12
|
+
it "creates a method stub" do
|
13
|
+
result.must_equal <<-STUB.reset_indentation
|
14
|
+
def instance_method *args, &block
|
15
|
+
setup_and_call :instance_method, *args, &block
|
16
|
+
end
|
17
|
+
STUB
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "for a static method" do
|
22
|
+
let(:method_info) {
|
23
|
+
get_method_introspection_data("Regress", "TestObj", "static_method") }
|
24
|
+
|
25
|
+
it "creates a class method stub" do
|
26
|
+
result.must_equal <<-STUB.reset_indentation
|
27
|
+
def self.static_method *args, &block
|
28
|
+
setup_and_call :static_method, *args, &block
|
29
|
+
end
|
30
|
+
STUB
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "for a module function" do
|
35
|
+
let(:method_info) {
|
36
|
+
get_introspection_data("Regress", "test_int") }
|
37
|
+
|
38
|
+
it "creates a module method stub" do
|
39
|
+
result.must_equal <<-STUB.reset_indentation
|
40
|
+
def self.test_int *args, &block
|
41
|
+
setup_and_call :test_int, *args, &block
|
42
|
+
end
|
43
|
+
STUB
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "for a method with an empty name" do
|
48
|
+
let(:method_info) { get_method_introspection_data("GLib", "IConv", "") }
|
49
|
+
|
50
|
+
it "creates a method stub with a safe name that sets up the unsafe method" do
|
51
|
+
result.must_equal <<-STUB.reset_indentation
|
52
|
+
def _ *args, &block
|
53
|
+
setup_and_call :"", *args, &block
|
54
|
+
end
|
55
|
+
STUB
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -210,6 +210,7 @@ describe GIMarshallingTests do
|
|
210
210
|
|
211
211
|
describe "GIMarshallingTests::Interface3" do
|
212
212
|
it "has a working method #test_variant_array_in" do
|
213
|
+
skip unless get_introspection_data 'GIMarshallingTests', 'Interface3'
|
213
214
|
derived_klass.class_eval { include GIMarshallingTests::Interface3 }
|
214
215
|
instance = make_derived_instance do |info|
|
215
216
|
info.install_vfunc_implementation :test_variant_array_in, proc {|obj, in_|
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'gir_ffi_test_helper'
|
2
|
+
|
3
|
+
# Tests generated classes, methods and functions in the GLib namespace.
|
4
|
+
describe "The generated GLib module" do
|
5
|
+
it "can auto-generate the GLib::IConv class" do
|
6
|
+
klass = GLib::IConv
|
7
|
+
|
8
|
+
klass.must_be_instance_of Class
|
9
|
+
end
|
10
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gir_ffi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matijs van Zuijlen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffi
|
@@ -80,7 +80,11 @@ dependencies:
|
|
80
80
|
- - ~>
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '10.1'
|
83
|
-
description:
|
83
|
+
description: |2
|
84
|
+
GirFFI creates bindings for GObject-based libraries at runtime based on introspection
|
85
|
+
data provided by the GObject Introspection Repository (GIR) system. Bindings are created
|
86
|
+
at runtime and use FFI to interface with the C libraries. In cases where the GIR does not
|
87
|
+
provide enough or correct information to create sane bindings, overrides may be created.
|
84
88
|
email:
|
85
89
|
- matijs@matijs.net
|
86
90
|
executables: []
|
@@ -203,6 +207,7 @@ files:
|
|
203
207
|
- lib/ffi-glib/variant.rb
|
204
208
|
- lib/ffi-glib/array_methods.rb
|
205
209
|
- lib/ffi-glib/s_list.rb
|
210
|
+
- lib/ffi-glib/iconv.rb
|
206
211
|
- lib/ffi-gobject_introspection/i_struct_info.rb
|
207
212
|
- lib/ffi-gobject_introspection/i_callback_info.rb
|
208
213
|
- lib/ffi-gobject_introspection/i_arg_info.rb
|
@@ -238,6 +243,7 @@ files:
|
|
238
243
|
- test/integration/method_lookup_test.rb
|
239
244
|
- test/integration/generated_gimarshallingtests_test.rb
|
240
245
|
- test/integration/generated_gio_test.rb
|
246
|
+
- test/integration/generated_glib_test.rb
|
241
247
|
- test/integration/generated_pango_test.rb
|
242
248
|
- test/integration/generated_secret_test.rb
|
243
249
|
- test/integration/generated_gobject_test.rb
|
@@ -267,7 +273,9 @@ files:
|
|
267
273
|
- test/gir_ffi/builders/object_builder_test.rb
|
268
274
|
- test/gir_ffi/builders/property_builder_test.rb
|
269
275
|
- test/gir_ffi/builders/module_builder_test.rb
|
276
|
+
- test/gir_ffi/builders/with_methods_test.rb
|
270
277
|
- test/gir_ffi/builders/user_defined_builder_test.rb
|
278
|
+
- test/gir_ffi/method_stubber_test.rb
|
271
279
|
- test/gir_ffi/variable_name_generator_test.rb
|
272
280
|
- test/gir_ffi/ffi_ext/pointer_test.rb
|
273
281
|
- test/gir_ffi/class_base_test.rb
|
@@ -294,6 +302,7 @@ files:
|
|
294
302
|
- test/ffi-glib/s_list_test.rb
|
295
303
|
- test/ffi-glib/hash_table_test.rb
|
296
304
|
- test/ffi-glib/list_test.rb
|
305
|
+
- test/ffi-glib/iconv_test.rb
|
297
306
|
- test/ffi-glib/array_test.rb
|
298
307
|
- test/ffi-glib/ptr_array_test.rb
|
299
308
|
- test/ffi-glib/byte_array_test.rb
|
@@ -325,7 +334,8 @@ files:
|
|
325
334
|
- Rakefile
|
326
335
|
- COPYING.LIB
|
327
336
|
homepage: http://www.github.com/mvz/ruby-gir-ffi
|
328
|
-
licenses:
|
337
|
+
licenses:
|
338
|
+
- LGPL-2.1
|
329
339
|
metadata: {}
|
330
340
|
post_install_message:
|
331
341
|
rdoc_options:
|
@@ -354,6 +364,7 @@ test_files:
|
|
354
364
|
- test/ffi-glib/array_test.rb
|
355
365
|
- test/ffi-glib/byte_array_test.rb
|
356
366
|
- test/ffi-glib/hash_table_test.rb
|
367
|
+
- test/ffi-glib/iconv_test.rb
|
357
368
|
- test/ffi-glib/list_test.rb
|
358
369
|
- test/ffi-glib/ptr_array_test.rb
|
359
370
|
- test/ffi-glib/ruby_closure_test.rb
|
@@ -394,6 +405,7 @@ test_files:
|
|
394
405
|
- test/gir_ffi/builders/union_builder_test.rb
|
395
406
|
- test/gir_ffi/builders/user_defined_builder_test.rb
|
396
407
|
- test/gir_ffi/builders/vfunc_builder_test.rb
|
408
|
+
- test/gir_ffi/builders/with_methods_test.rb
|
397
409
|
- test/gir_ffi/callback_base_test.rb
|
398
410
|
- test/gir_ffi/class_base_test.rb
|
399
411
|
- test/gir_ffi/ffi_ext/pointer_test.rb
|
@@ -409,6 +421,7 @@ test_files:
|
|
409
421
|
- test/gir_ffi/info_ext/safe_constant_name_test.rb
|
410
422
|
- test/gir_ffi/info_ext/safe_function_name_test.rb
|
411
423
|
- test/gir_ffi/interface_base_test.rb
|
424
|
+
- test/gir_ffi/method_stubber_test.rb
|
412
425
|
- test/gir_ffi/object_base_test.rb
|
413
426
|
- test/gir_ffi/sized_array_test.rb
|
414
427
|
- test/gir_ffi/type_map_test.rb
|
@@ -422,6 +435,7 @@ test_files:
|
|
422
435
|
- test/integration/derived_classes_test.rb
|
423
436
|
- test/integration/generated_gimarshallingtests_test.rb
|
424
437
|
- test/integration/generated_gio_test.rb
|
438
|
+
- test/integration/generated_glib_test.rb
|
425
439
|
- test/integration/generated_gobject_test.rb
|
426
440
|
- test/integration/generated_pango_ft2_test.rb
|
427
441
|
- test/integration/generated_pango_test.rb
|