gir_ffi 0.0.2 → 0.0.3
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.
- data/History.txt +6 -0
- data/lib/gir_ffi/base.rb +0 -10
- data/lib/gir_ffi/builder.rb +1 -0
- data/lib/gir_ffi/class_builder.rb +26 -13
- data/lib/gir_ffi/function_definition_builder.rb +7 -0
- data/lib/gir_ffi/i_error_domain_info.rb +8 -0
- data/lib/gir_ffi/i_flags_info.rb +1 -0
- data/lib/gir_ffi/i_repository.rb +19 -9
- data/test/base_test.rb +3 -57
- data/test/class_builder_test.rb +23 -0
- data/test/function_definition_builder_test.rb +16 -0
- data/test/i_repository_test.rb +7 -1
- data/test/test_helper.rb +2 -0
- metadata +23 -4
data/History.txt
CHANGED
data/lib/gir_ffi/base.rb
CHANGED
@@ -14,16 +14,6 @@ module GirFFI
|
|
14
14
|
self.class.ffi_structure
|
15
15
|
end
|
16
16
|
|
17
|
-
def _fake_missing *args, &block
|
18
|
-
method_missing method_name.to_sym, *args, &block
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def method_name
|
24
|
-
caller[0].gsub(/.*`(.*)'/, '\1')
|
25
|
-
end
|
26
|
-
|
27
17
|
class << self
|
28
18
|
def ffi_structure
|
29
19
|
self.const_get(:Struct)
|
data/lib/gir_ffi/builder.rb
CHANGED
@@ -69,27 +69,40 @@ module GirFFI
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def setup_layout
|
72
|
-
|
73
|
-
@
|
74
|
-
|
72
|
+
spec = layout_specification
|
73
|
+
@structklass.class_eval { layout(*spec) }
|
74
|
+
end
|
75
75
|
|
76
|
-
|
77
|
-
|
78
|
-
|
76
|
+
def layout_specification
|
77
|
+
if @info.fields.empty?
|
78
|
+
if @parent
|
79
|
+
return [:parent, @superclass.const_get(:Struct), 0]
|
79
80
|
end
|
81
|
+
end
|
82
|
+
spec = []
|
83
|
+
@info.fields.each do |f|
|
84
|
+
spec << f.name.to_sym
|
85
|
+
spec << itypeinfo_to_ffitype_for_struct(f.type)
|
86
|
+
spec << f.offset
|
87
|
+
end
|
88
|
+
spec
|
89
|
+
end
|
80
90
|
|
81
|
-
|
82
|
-
|
83
|
-
|
91
|
+
def itypeinfo_to_ffitype_for_struct typeinfo
|
92
|
+
ffitype = Builder.itypeinfo_to_ffitype typeinfo
|
93
|
+
if ffitype.kind_of?(Class) and BuilderHelper.const_defined_for ffitype, :Struct
|
94
|
+
ffitype = ffitype.const_get :Struct
|
84
95
|
end
|
85
|
-
|
96
|
+
ffitype
|
86
97
|
end
|
87
98
|
|
88
99
|
def alias_instance_methods
|
89
100
|
@info.methods.each do |m|
|
90
|
-
@klass.class_eval
|
91
|
-
|
92
|
-
|
101
|
+
@klass.class_eval "
|
102
|
+
def #{m.name} *args, &block
|
103
|
+
method_missing :#{m.name}, *args, &block
|
104
|
+
end
|
105
|
+
"
|
93
106
|
end
|
94
107
|
end
|
95
108
|
|
@@ -116,6 +116,13 @@ module GirFFI
|
|
116
116
|
end
|
117
117
|
|
118
118
|
def adjust_accumulators
|
119
|
+
if @info.throws?
|
120
|
+
errvar = new_var
|
121
|
+
@pre << "#{errvar} = FFI::MemoryPointer.new(:pointer).write_pointer nil"
|
122
|
+
@post << "GirFFI::ArgHelper.check_error(#{errvar})"
|
123
|
+
@callargs << errvar
|
124
|
+
end
|
125
|
+
|
119
126
|
@post << "return #{@retvals.join(', ')}" unless @retvals.empty?
|
120
127
|
|
121
128
|
if @info.method?
|
data/lib/gir_ffi/i_flags_info.rb
CHANGED
data/lib/gir_ffi/i_repository.rb
CHANGED
@@ -19,24 +19,27 @@ require 'gir_ffi/i_value_info'
|
|
19
19
|
require 'gir_ffi/i_union_info'
|
20
20
|
require 'gir_ffi/i_enum_info'
|
21
21
|
require 'gir_ffi/i_flags_info'
|
22
|
+
require 'gir_ffi/i_error_domain_info'
|
22
23
|
|
23
24
|
module GirFFI
|
24
25
|
# The Gobject Introspection Repository. This class is the point of
|
25
26
|
# access to the introspection typelibs.
|
26
27
|
# This class wraps the GIRepository struct.
|
27
28
|
class IRepository
|
29
|
+
# Map info type to class. Default is IBaseInfo.
|
28
30
|
TYPEMAP = {
|
29
|
-
|
31
|
+
:invalid => IBaseInfo,
|
30
32
|
:function => IFunctionInfo,
|
31
33
|
:callback => ICallbackInfo,
|
32
34
|
:struct => IStructInfo,
|
33
|
-
|
35
|
+
# TODO: There's no GIBoxedInfo, so what does :boxed mean?
|
36
|
+
:boxed => IBaseInfo,
|
34
37
|
:enum => IEnumInfo,
|
35
38
|
:flags => IFlagsInfo,
|
36
39
|
:object => IObjectInfo,
|
37
40
|
:interface => IInterfaceInfo,
|
38
41
|
:constant => IConstantInfo,
|
39
|
-
|
42
|
+
:error_domain => IErrorDomainInfo,
|
40
43
|
:union => IUnionInfo,
|
41
44
|
:value => IValueInfo,
|
42
45
|
:signal => ISignalInfo,
|
@@ -45,7 +48,7 @@ module GirFFI
|
|
45
48
|
:field => IFieldInfo,
|
46
49
|
:arg => IArgInfo,
|
47
50
|
:type => ITypeInfo,
|
48
|
-
|
51
|
+
:unresolved => IBaseInfo
|
49
52
|
}
|
50
53
|
|
51
54
|
def initialize
|
@@ -63,11 +66,7 @@ module GirFFI
|
|
63
66
|
Lib.g_type_tag_to_string type
|
64
67
|
end
|
65
68
|
|
66
|
-
def
|
67
|
-
Lib.g_irepository_get_n_infos @gobj, namespace
|
68
|
-
end
|
69
|
-
|
70
|
-
def require namespace, version
|
69
|
+
def require namespace, version=nil
|
71
70
|
errpp = FFI::MemoryPointer.new(:pointer).write_pointer nil
|
72
71
|
|
73
72
|
Lib.g_irepository_require @gobj, namespace, version, 0, errpp
|
@@ -76,11 +75,22 @@ module GirFFI
|
|
76
75
|
raise GError.new(errp)[:message] unless errp.null?
|
77
76
|
end
|
78
77
|
|
78
|
+
def n_infos namespace
|
79
|
+
Lib.g_irepository_get_n_infos @gobj, namespace
|
80
|
+
end
|
81
|
+
|
79
82
|
def info namespace, index
|
80
83
|
ptr = Lib.g_irepository_get_info @gobj, namespace, index
|
81
84
|
return wrap ptr
|
82
85
|
end
|
83
86
|
|
87
|
+
# Utility method
|
88
|
+
def infos namespace
|
89
|
+
(0..(n_infos(namespace) - 1)).map do |i|
|
90
|
+
info namespace, i
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
84
94
|
def find_by_name namespace, name
|
85
95
|
ptr = Lib.g_irepository_find_by_name @gobj, namespace, name
|
86
96
|
return wrap ptr
|
data/test/base_test.rb
CHANGED
@@ -10,63 +10,9 @@ class BaseTest < Test::Unit::TestCase
|
|
10
10
|
def self.new; self._real_new; end
|
11
11
|
end
|
12
12
|
end
|
13
|
-
|
14
|
-
should "
|
15
|
-
|
16
|
-
def this_is_my_name
|
17
|
-
method_name
|
18
|
-
end
|
19
|
-
end
|
20
|
-
assert_equal "this_is_my_name", @klass.new.this_is_my_name
|
21
|
-
end
|
22
|
-
|
23
|
-
context "its #_fake_missing method" do
|
24
|
-
should "not be missing" do
|
25
|
-
assert @klass.new.respond_to? :_fake_missing
|
26
|
-
end
|
27
|
-
|
28
|
-
should "call method_missing" do
|
29
|
-
@klass.class_eval do
|
30
|
-
def method_missing method, *args
|
31
|
-
method
|
32
|
-
end
|
33
|
-
end
|
34
|
-
assert_equal :_fake_missing, @klass.new._fake_missing
|
35
|
-
end
|
36
|
-
|
37
|
-
should "pass on its arguments" do
|
38
|
-
@klass.class_eval do
|
39
|
-
def method_missing method, *args
|
40
|
-
args.join(', ')
|
41
|
-
end
|
42
|
-
end
|
43
|
-
assert_equal "a, b", @klass.new._fake_missing("a", "b")
|
44
|
-
end
|
45
|
-
|
46
|
-
should "pass on a given block" do
|
47
|
-
@klass.class_eval do
|
48
|
-
def method_missing method, *args
|
49
|
-
yield if block_given?
|
50
|
-
end
|
51
|
-
end
|
52
|
-
assert_equal :called, @klass.new._fake_missing { :called }
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
should "be able to use alias_method to create a self-defining method" do
|
57
|
-
@klass.class_eval do
|
58
|
-
def method_missing method, *args
|
59
|
-
self.class.class_eval "
|
60
|
-
undef #{method}
|
61
|
-
def #{method}
|
62
|
-
:redefined
|
63
|
-
end
|
64
|
-
"
|
65
|
-
self.send method
|
66
|
-
end
|
67
|
-
alias_method :new_method, :_fake_missing
|
68
|
-
end
|
69
|
-
assert_equal :redefined, @klass.new.new_method
|
13
|
+
# TODO: See if we can test some part of Base again.
|
14
|
+
should "pass" do
|
15
|
+
assert true
|
70
16
|
end
|
71
17
|
end
|
72
18
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require File.expand_path('test_helper.rb', File.dirname(__FILE__))
|
2
|
+
require 'gir_ffi'
|
3
|
+
|
4
|
+
class ClassBuilderTest < Test::Unit::TestCase
|
5
|
+
context "The ClassBuilder" do
|
6
|
+
setup do
|
7
|
+
@gir = GirFFI::IRepository.default
|
8
|
+
@gir.require 'GObject', nil
|
9
|
+
end
|
10
|
+
should "use parent struct as default layout" do
|
11
|
+
@classbuilder = GirFFI::ClassBuilder.new 'Foo', 'Bar'
|
12
|
+
stub(info = Object.new).parent { @gir.find_by_name 'GObject', 'Object' }
|
13
|
+
stub(info).fields { [] }
|
14
|
+
@classbuilder.instance_eval { @info = info }
|
15
|
+
@classbuilder.instance_eval { @parent = info.parent }
|
16
|
+
@classbuilder.instance_eval { @superclass = GObject::Object }
|
17
|
+
|
18
|
+
spec = @classbuilder.send :layout_specification
|
19
|
+
assert_equal [:parent, GObject::Object::Struct, 0], spec
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -55,5 +55,21 @@ class FunctionDefinitionBuilderTest < Test::Unit::TestCase
|
|
55
55
|
|
56
56
|
assert_equal cws(expected), cws(code)
|
57
57
|
end
|
58
|
+
|
59
|
+
should "build correct definition of Everything::TestObj#new_from_file" do
|
60
|
+
go = get_method_introspection_data 'Everything', 'TestObj', 'new_from_file'
|
61
|
+
fbuilder = GirFFI::FunctionDefinitionBuilder.new go, Lib
|
62
|
+
code = fbuilder.generate
|
63
|
+
|
64
|
+
expected =
|
65
|
+
"def new_from_file x
|
66
|
+
_v2 = FFI::MemoryPointer.new(:pointer).write_pointer nil
|
67
|
+
_v1 = Lib.test_obj_new_from_file x, _v2
|
68
|
+
GirFFI::ArgHelper.check_error(_v2)
|
69
|
+
return Everything::TestObj._real_new(_v1)
|
70
|
+
end"
|
71
|
+
|
72
|
+
assert_equal cws(expected), cws(code)
|
73
|
+
end
|
58
74
|
end
|
59
75
|
end
|
data/test/i_repository_test.rb
CHANGED
@@ -31,7 +31,13 @@ module GirFFI
|
|
31
31
|
|
32
32
|
should "allow version to be nil" do
|
33
33
|
assert_nothing_raised do
|
34
|
-
IRepository.default.require '
|
34
|
+
IRepository.default.require 'Everything', nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
should "allow version to be left out" do
|
39
|
+
assert_nothing_raised do
|
40
|
+
IRepository.default.require 'Everything'
|
35
41
|
end
|
36
42
|
end
|
37
43
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'shoulda'
|
2
|
+
require 'rr'
|
2
3
|
require 'ffi'
|
3
4
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
4
5
|
|
@@ -23,6 +24,7 @@ module Lib
|
|
23
24
|
end
|
24
25
|
|
25
26
|
class Test::Unit::TestCase
|
27
|
+
include RR::Adapters::TestUnit
|
26
28
|
def cws code
|
27
29
|
code.gsub(/(^\s*|\s*$)/, "")
|
28
30
|
end
|
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:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
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: 2010-11-
|
18
|
+
date: 2010-11-19 00:00:00 +01:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -50,6 +50,22 @@ dependencies:
|
|
50
50
|
version: 2.11.3
|
51
51
|
type: :development
|
52
52
|
version_requirements: *id002
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: rr
|
55
|
+
prerelease: false
|
56
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
hash: 19
|
62
|
+
segments:
|
63
|
+
- 1
|
64
|
+
- 0
|
65
|
+
- 2
|
66
|
+
version: 1.0.2
|
67
|
+
type: :development
|
68
|
+
version_requirements: *id003
|
53
69
|
description: Ruby-FFI-based binding of the GObject Introspection Repository
|
54
70
|
email:
|
55
71
|
- matijs@matijs.net
|
@@ -88,6 +104,7 @@ files:
|
|
88
104
|
- lib/gir_ffi/i_callable_info.rb
|
89
105
|
- lib/gir_ffi/function_definition_builder.rb
|
90
106
|
- lib/gir_ffi/i_function_info.rb
|
107
|
+
- lib/gir_ffi/i_error_domain_info.rb
|
91
108
|
- lib/gir_ffi/version.rb
|
92
109
|
- lib/gir_ffi/overrides/gtk.rb
|
93
110
|
- lib/gir_ffi/allocation_helper.rb
|
@@ -105,6 +122,7 @@ files:
|
|
105
122
|
- test/function_definition_builder_test.rb
|
106
123
|
- test/arg_helper_test.rb
|
107
124
|
- test/test_helper.rb
|
125
|
+
- test/class_builder_test.rb
|
108
126
|
- test/girffi_test.rb
|
109
127
|
- test/constructor_definition_builder_test.rb
|
110
128
|
- test/base_test.rb
|
@@ -167,6 +185,7 @@ test_files:
|
|
167
185
|
- test/arg_helper_test.rb
|
168
186
|
- test/base_test.rb
|
169
187
|
- test/builder_test.rb
|
188
|
+
- test/class_builder_test.rb
|
170
189
|
- test/constructor_definition_builder_test.rb
|
171
190
|
- test/everything_test.rb
|
172
191
|
- test/function_definition_builder_test.rb
|