gir_ffi 0.1.0 → 0.2.0

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.
Files changed (78) hide show
  1. data/History.txt +14 -0
  2. data/TODO.rdoc +10 -5
  3. data/lib/ffi-glib.rb +7 -73
  4. data/lib/ffi-glib/array.rb +29 -4
  5. data/lib/ffi-glib/byte_array.rb +15 -1
  6. data/lib/ffi-glib/hash_table.rb +31 -24
  7. data/lib/ffi-glib/list.rb +28 -0
  8. data/lib/ffi-glib/list_methods.rb +10 -2
  9. data/lib/ffi-glib/ptr_array.rb +39 -0
  10. data/lib/ffi-glib/s_list.rb +29 -0
  11. data/lib/ffi-gobject.rb +49 -22
  12. data/lib/ffi-gobject/closure.rb +4 -3
  13. data/lib/ffi-gobject/helper.rb +20 -43
  14. data/lib/ffi-gobject/initially_unowned.rb +2 -0
  15. data/lib/ffi-gobject/object.rb +54 -0
  16. data/lib/ffi-gobject/ruby_closure.rb +22 -16
  17. data/lib/ffi-gobject/value.rb +54 -19
  18. data/lib/ffi-gobject_introspection/i_constant_info.rb +17 -1
  19. data/lib/ffi-gobject_introspection/i_field_info.rb +8 -0
  20. data/lib/ffi-gobject_introspection/i_property_info.rb +3 -1
  21. data/lib/ffi-gobject_introspection/lib.rb +19 -2
  22. data/lib/gir_ffi/arg_helper.rb +7 -45
  23. data/lib/gir_ffi/builder.rb +1 -1
  24. data/lib/gir_ffi/builder/argument.rb +148 -107
  25. data/lib/gir_ffi/builder/argument/base.rb +5 -5
  26. data/lib/gir_ffi/builder/argument/in_base.rb +2 -2
  27. data/lib/gir_ffi/builder/argument/in_out_base.rb +2 -3
  28. data/lib/gir_ffi/builder/argument/out_base.rb +2 -3
  29. data/lib/gir_ffi/builder/function.rb +11 -17
  30. data/lib/gir_ffi/builder/module.rb +26 -0
  31. data/lib/gir_ffi/builder/type.rb +5 -0
  32. data/lib/gir_ffi/builder/type/base.rb +2 -0
  33. data/lib/gir_ffi/builder/type/callback.rb +18 -3
  34. data/lib/gir_ffi/builder/type/constant.rb +4 -12
  35. data/lib/gir_ffi/builder/type/enum.rb +15 -6
  36. data/lib/gir_ffi/builder/type/interface.rb +4 -0
  37. data/lib/gir_ffi/builder/type/object.rb +11 -0
  38. data/lib/gir_ffi/builder/type/struct_based.rb +14 -4
  39. data/lib/gir_ffi/builder/type/union.rb +13 -7
  40. data/lib/gir_ffi/builder/type/with_layout.rb +59 -8
  41. data/lib/gir_ffi/class_base.rb +8 -1
  42. data/lib/gir_ffi/in_out_pointer.rb +17 -18
  43. data/lib/gir_ffi/in_pointer.rb +8 -1
  44. data/lib/gir_ffi/type_map.rb +12 -0
  45. data/lib/gir_ffi/variable_name_generator.rb +12 -0
  46. data/lib/gir_ffi/version.rb +1 -1
  47. data/test/ffi-glib/array_test.rb +54 -0
  48. data/test/ffi-glib/byte_array_test.rb +21 -0
  49. data/test/ffi-glib/glib_overrides_test.rb +1 -46
  50. data/test/ffi-glib/hash_table_test.rb +24 -0
  51. data/test/ffi-glib/list_test.rb +46 -0
  52. data/test/ffi-glib/ptr_array_test.rb +51 -0
  53. data/test/ffi-glib/s_list_test.rb +46 -0
  54. data/test/ffi-gobject/g_object_overrides_test.rb +8 -8
  55. data/test/ffi-gobject/gobject_test.rb +26 -0
  56. data/test/ffi-gobject/object_test.rb +12 -0
  57. data/test/ffi-gobject_introspection/i_constant_info_test.rb +5 -1
  58. data/test/ffi-gobject_introspection/lib_test.rb +56 -0
  59. data/test/integration/generated_gimarshallingtests_test.rb +118 -76
  60. data/test/integration/generated_regress_test.rb +220 -62
  61. data/test/integration/pretty_print_test.rb +11 -0
  62. data/test/type_builder_test.rb +0 -48
  63. data/test/unintrospectable_type_builder_test.rb +8 -2
  64. data/test/unit/builder_test.rb +1 -1
  65. data/test/unit/callback_builder_test.rb +19 -0
  66. data/test/unit/constant_builder_test.rb +11 -0
  67. data/test/unit/enum_builder_test.rb +25 -0
  68. data/test/unit/function_builder_test.rb +17 -0
  69. data/test/unit/in_out_pointer_test.rb +11 -0
  70. data/test/unit/in_pointer_test.rb +6 -2
  71. data/test/unit/interface_builder_test.rb +17 -0
  72. data/test/unit/module_builder_test.rb +95 -0
  73. data/test/unit/object_type_builder_test.rb +24 -0
  74. data/test/unit/struct_builder_test.rb +106 -0
  75. data/test/unit/union_builder_test.rb +17 -0
  76. data/test/unit/variable_name_generator_test.rb +16 -0
  77. metadata +102 -75
  78. data/test/module_builder_test.rb +0 -53
@@ -5,7 +5,7 @@ module GirFFI
5
5
  class ClassBase
6
6
  # TODO: Make separate base for :struct, :union, :object.
7
7
  extend Forwardable
8
- def_delegators :@struct, :[], :[]=, :to_ptr
8
+ def_delegators :@struct, :to_ptr
9
9
 
10
10
  def initialize(*args)
11
11
  @struct = ffi_structure.new(*args)
@@ -50,6 +50,10 @@ module GirFFI
50
50
  _builder.find_signal name
51
51
  end
52
52
 
53
+ def _find_property name
54
+ _builder.find_property name
55
+ end
56
+
53
57
  def _setup_method name
54
58
  _builder.setup_method name
55
59
  end
@@ -63,6 +67,9 @@ module GirFFI
63
67
 
64
68
  def wrap ptr
65
69
  return nil if ptr.nil? or ptr.null?
70
+ unless ptr.is_a? FFI::Pointer
71
+ ptr = ptr.to_ptr
72
+ end
66
73
  _real_new ptr
67
74
  end
68
75
 
@@ -2,17 +2,28 @@ module GirFFI
2
2
  # The InOutPointer class handles conversion between ruby types and
3
3
  # pointers for arguments with direction :inout and :out.
4
4
  class InOutPointer < FFI::Pointer
5
- def initialize ptr, type, ffi_type
5
+ def initialize ptr, type, ffi_type, sub_type=nil
6
6
  super ptr
7
7
  @ffi_type = ffi_type
8
8
  @value_type = type
9
+ @sub_type = sub_type
9
10
  end
10
11
 
12
+ private :initialize
13
+
11
14
  def to_value
12
15
  value = self.send "get_#{@ffi_type}", 0
13
16
  adjust_value_out value
14
17
  end
15
18
 
19
+ def to_sized_array_value size
20
+ # FIXME: Simulated Polymorphism.
21
+ raise "Not allowed" if @value_type != :pointer or @sub_type.nil?
22
+ block = self.read_pointer
23
+ return nil if block.null?
24
+ ArgHelper.ptr_to_typed_array @sub_type, block, size
25
+ end
26
+
16
27
  private
17
28
 
18
29
  def adjust_value_out value
@@ -27,39 +38,27 @@ module GirFFI
27
38
  end
28
39
 
29
40
  def self.for type
30
- ffi_type = type_to_ffi_type type
41
+ ffi_type = TypeMap.map_basic_type_or_string type
31
42
  ptr = AllocationHelper.safe_malloc(FFI.type_size ffi_type)
32
43
  ptr.send "put_#{ffi_type}", 0, nil_value_for(type)
33
44
  self.new ptr, type, ffi_type
34
45
  end
35
46
 
36
- def self.from type, value
47
+ def self.from type, value, sub_type=nil
37
48
  value = adjust_value_in type, value
38
- ffi_type = type_to_ffi_type type
49
+ ffi_type = TypeMap.map_basic_type_or_string type
39
50
  ptr = AllocationHelper.safe_malloc(FFI.type_size ffi_type)
40
51
  ptr.send "put_#{ffi_type}", 0, value
41
- self.new ptr, type, ffi_type
52
+ self.new ptr, type, ffi_type, sub_type
42
53
  end
43
54
 
44
55
  def self.from_array type, array
45
56
  return nil if array.nil?
46
57
  ptr = InPointer.from_array(type, array)
47
- self.from :pointer, ptr
58
+ self.from :pointer, ptr, type
48
59
  end
49
60
 
50
61
  class << self
51
- # TODO: Make separate module to hold type info.
52
- def type_to_ffi_type type
53
- case type
54
- when :gboolean
55
- :int32
56
- when :utf8
57
- :pointer
58
- else
59
- TypeMap.map_basic_type type
60
- end
61
- end
62
-
63
62
  def adjust_value_in type, value
64
63
  case type
65
64
  when :gboolean
@@ -17,7 +17,14 @@ module GirFFI
17
17
 
18
18
  def self.from type, val
19
19
  return nil if val.nil?
20
- from_utf8 val
20
+ case type
21
+ when :utf8
22
+ from_utf8 val
23
+ when :gint32, :gint8
24
+ self.new val
25
+ else
26
+ raise NotImplementedError
27
+ end
21
28
  end
22
29
 
23
30
  class << self
@@ -25,5 +25,17 @@ module GirFFI
25
25
  def self.map_basic_type type
26
26
  TAG_TYPE_MAP[type] || type
27
27
  end
28
+
29
+ # FIXME: Make name more descriptive.
30
+ def self.map_basic_type_or_string type
31
+ case type
32
+ when :gboolean
33
+ :int32
34
+ when :utf8
35
+ :pointer
36
+ else
37
+ map_basic_type(type)
38
+ end
39
+ end
28
40
  end
29
41
  end
@@ -0,0 +1,12 @@
1
+ module GirFFI
2
+ class VariableNameGenerator
3
+ def initialize
4
+ @varno = 0
5
+ end
6
+
7
+ def new_var
8
+ @varno += 1
9
+ "_v#{@varno}"
10
+ end
11
+ end
12
+ end
@@ -1,4 +1,4 @@
1
1
  module GirFFI
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
4
4
 
@@ -0,0 +1,54 @@
1
+ require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
+
3
+ describe GLib::Array do
4
+ it "knows its element type" do
5
+ arr = GLib::Array.new :gint32
6
+ assert_equal :gint32, arr.element_type
7
+ end
8
+
9
+ describe "#append_vals" do
10
+ before do
11
+ @arr = GLib::Array.new :gint32
12
+ @result = @arr.append_vals [1, 2, 3]
13
+ end
14
+
15
+ it "appends values" do
16
+ assert_equal 3, @arr.len
17
+ end
18
+
19
+ it "returns self" do
20
+ assert_equal @result, @arr
21
+ end
22
+ end
23
+
24
+ describe "#each" do
25
+ before do
26
+ @arr = GLib::Array.new(:gint32).append_vals [1, 2, 3]
27
+ end
28
+
29
+ it "iterates over the values" do
30
+ a = []
31
+ @arr.each {|v| a << v }
32
+
33
+ assert_equal [1, 2, 3], a
34
+ end
35
+
36
+ it "returns an enumerator if no block is given" do
37
+ en = @arr.each
38
+ assert_equal 1, en.next
39
+ assert_equal 2, en.next
40
+ assert_equal 3, en.next
41
+ end
42
+ end
43
+
44
+ it "includes Enumerable" do
45
+ GLib::Array.must_include Enumerable
46
+ end
47
+
48
+ it "has a working #to_a method" do
49
+ arr = GLib::Array.new :gint32
50
+ arr.append_vals [1, 2, 3]
51
+ assert_equal [1, 2, 3], arr.to_a
52
+ end
53
+ end
54
+
@@ -0,0 +1,21 @@
1
+ require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
+
3
+ describe GLib::ByteArray do
4
+ it "can succesfully be created with Glib::ByteArray.new" do
5
+ ba = GLib::ByteArray.new
6
+ assert_instance_of GLib::ByteArray, ba
7
+ end
8
+
9
+ it "allows strings to be appended to it" do
10
+ ba = GLib::ByteArray.new
11
+ ba.append "abdc"
12
+ pass
13
+ end
14
+
15
+ it "has a working #to_string method" do
16
+ ba = GLib::ByteArray.new
17
+ ba = ba.append "abdc"
18
+ assert_equal "abdc", ba.to_string
19
+ end
20
+ end
21
+
@@ -27,57 +27,12 @@ describe "With the GLib overrides" do
27
27
  end
28
28
 
29
29
  describe "HashTable" do
30
- it "can be created (for now) with Glib.hash_table_new" do
31
- h = GLib.hash_table_new :utf8, :utf8
32
- h.to_hash.must_be :==, {}
33
- end
34
-
35
30
  it "allows key-value pairs to be inserted" do
36
- h = GLib.hash_table_new :utf8, :utf8
31
+ h = GLib::HashTable.new :utf8, :utf8
37
32
  h.insert "foo", "bar"
38
33
  h.to_hash.must_be :==, {"foo" => "bar"}
39
34
  end
40
35
  end
41
-
42
- describe "ByteArray" do
43
- it "can be created (for now) with Glib.byte_array_new" do
44
- ba = GLib.byte_array_new
45
- assert_instance_of GLib::ByteArray, ba
46
- end
47
-
48
- it "allows strings to be appended to it" do
49
- ba = GLib.byte_array_new
50
- GLib::byte_array_append ba, "abdc"
51
- pass
52
- end
53
-
54
- it "has a working #to_s method" do
55
- ba = GLib.byte_array_new
56
- ba = GLib::byte_array_append ba, "abdc"
57
- assert_equal "abdc", ba.to_string
58
- end
59
- end
60
-
61
- describe "Array" do
62
- it "can be created (for now) with Glib.array_new" do
63
- arr = GLib.array_new :int32
64
- assert_instance_of GLib::Array, arr
65
- assert_equal :int32, arr.element_type
66
- end
67
-
68
- it "allows values to be appended to it" do
69
- ba = GLib.array_new :int32
70
- GLib.array_append_vals ba, [1, 2, 3]
71
- assert_equal 3, ba[:len]
72
- end
73
-
74
- # TODO: Make GLib::Array a full Enumerable"
75
- it "has a working #to_a method" do
76
- ba = GLib.array_new :int32
77
- GLib.array_append_vals ba, [1, 2, 3]
78
- assert_equal [1, 2, 3], ba.to_a
79
- end
80
- end
81
36
  end
82
37
 
83
38
 
@@ -0,0 +1,24 @@
1
+ require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
+
3
+ describe GLib::HashTable do
4
+ it "knows its key and value types" do
5
+ hsh = GLib::HashTable.new :gint32, :utf8
6
+ assert_equal :gint32, hsh.key_type
7
+ assert_equal :utf8, hsh.value_type
8
+ end
9
+
10
+ describe "::from_hash" do
11
+ it "creates a GHashTable from a Ruby array" do
12
+ hsh = GLib::HashTable.from_hash :utf8, :gint32,
13
+ {"foo" => 23, "bar" => 32}
14
+ assert_equal({"foo" => 23, "bar" => 32}, hsh.to_hash)
15
+ end
16
+
17
+ it "return its argument if given a GHashTable" do
18
+ hsh = GLib::HashTable.from_hash :utf8, :gint32, {"foo" => 23, "bar" => 32}
19
+ hsh2 = GLib::HashTable.from_hash :utf8, :gint32, hsh
20
+ assert_equal hsh, hsh2
21
+ end
22
+ end
23
+ end
24
+
@@ -0,0 +1,46 @@
1
+ require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
+
3
+ describe GLib::List do
4
+ it "knows its element type" do
5
+ arr = GLib::List.new :gint32
6
+ assert_equal :gint32, arr.element_type
7
+ end
8
+
9
+ describe "#append" do
10
+ it "appends integer values" do
11
+ lst = GLib::List.new :gint32
12
+ res = lst.append 1
13
+ assert_equal 1, res.data
14
+ end
15
+
16
+ it "appends string values" do
17
+ lst = GLib::List.new :utf8
18
+ res = lst.append "bla"
19
+ assert_equal "bla", res.data
20
+ end
21
+
22
+ it "appends multiple values into a single list" do
23
+ lst = GLib::List.new :gint32
24
+
25
+ lst = lst.append 1
26
+ lst = lst.append 2
27
+
28
+ assert_equal 1, lst.data
29
+ nxt = lst.next
30
+ assert_equal 2, nxt.data
31
+ end
32
+ end
33
+
34
+ describe "::from_array" do
35
+ it "creates a GList from a Ruby array" do
36
+ lst = GLib::List.from_array :gint32, [3, 2, 1]
37
+ assert_equal [3, 2, 1], lst.to_a
38
+ end
39
+
40
+ it "return its argument if given a GList" do
41
+ lst = GLib::List.from_array :gint32, [3, 2, 1]
42
+ lst2 = GLib::List.from_array :gint32, lst
43
+ assert_equal lst, lst2
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,51 @@
1
+ require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
+
3
+ describe GLib::PtrArray do
4
+ it "knows its element type" do
5
+ arr = GLib::PtrArray.new :utf8
6
+ assert_equal :utf8, arr.element_type
7
+ end
8
+
9
+ describe "::add" do
10
+ it "correctly takes the type into account" do
11
+ arr = GLib::PtrArray.new :utf8
12
+ str = "test"
13
+ GLib::PtrArray.add arr, str
14
+
15
+ assert_equal str, arr.pdata.read_pointer.read_string
16
+ end
17
+ end
18
+
19
+ it "has a working #each method" do
20
+ arr = GLib::PtrArray.new :utf8
21
+
22
+ GLib::PtrArray.add arr, "test1"
23
+ GLib::PtrArray.add arr, "test2"
24
+ GLib::PtrArray.add arr, "test3"
25
+
26
+ a = []
27
+ arr.each {|v| a << v}
28
+
29
+ assert_equal ["test1", "test2", "test3"], a
30
+ end
31
+
32
+ it "includes Enumerable" do
33
+ GLib::PtrArray.must_include Enumerable
34
+ end
35
+
36
+ it "has a working #to_a method" do
37
+ arr = GLib::PtrArray.new :utf8
38
+
39
+ GLib::PtrArray.add arr, "test1"
40
+ GLib::PtrArray.add arr, "test2"
41
+ GLib::PtrArray.add arr, "test3"
42
+
43
+ assert_equal ["test1", "test2", "test3"], arr.to_a
44
+ end
45
+
46
+ it "has #add as an instance method too" do
47
+ arr = GLib::PtrArray.new :utf8
48
+ arr.add "test1"
49
+ assert_equal ["test1"], arr.to_a
50
+ end
51
+ end
@@ -0,0 +1,46 @@
1
+ require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
2
+
3
+ describe GLib::SList do
4
+ it "knows its element type" do
5
+ arr = GLib::SList.new :gint32
6
+ assert_equal :gint32, arr.element_type
7
+ end
8
+
9
+ describe "#prepend" do
10
+ it "prepends integer values" do
11
+ lst = GLib::SList.new :gint32
12
+ res = lst.prepend 1
13
+ assert_equal 1, res.data
14
+ end
15
+
16
+ it "prepends string values" do
17
+ lst = GLib::SList.new :utf8
18
+ res = lst.prepend "bla"
19
+ assert_equal "bla", res.data
20
+ end
21
+
22
+ it "prepends multiple values into a single list" do
23
+ lst = GLib::SList.new :gint32
24
+
25
+ res = lst.prepend 1
26
+ res2 = res.prepend 2
27
+
28
+ assert_equal 2, res2.data
29
+ assert_equal 1, res.data
30
+ assert_equal res.to_ptr, res2.next.to_ptr
31
+ end
32
+ end
33
+
34
+ describe "::from_array" do
35
+ it "creates a GSList from a Ruby array" do
36
+ lst = GLib::SList.from_array :gint32, [3, 2, 1]
37
+ assert_equal [3, 2, 1], lst.to_a
38
+ end
39
+
40
+ it "return its argument if given a GSList" do
41
+ lst = GLib::SList.from_array :gint32, [3, 2, 1]
42
+ lst2 = GLib::SList.from_array :gint32, lst
43
+ assert_equal lst, lst2
44
+ end
45
+ end
46
+ end