gir_ffi 0.7.2 → 0.7.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ad910cc6ba5f72dc4dbec829707d52c1ed3a0a17
4
- data.tar.gz: b6635852aa08e28b1a7a51c84932fe9aac0baa1c
3
+ metadata.gz: 22d6bb7bfc0aa7590953b8286894e4d0e814d70c
4
+ data.tar.gz: 76f360c36de64f4ec95614b1d80fce35620841eb
5
5
  SHA512:
6
- metadata.gz: 5cc6818faedb14eb6ef3d63f43bb10b5380ff4816359ec15c72a71644ee28bf979a20db5da557fff2daa09ba2431b1b6dad3b34810512573bf678b6e2dcdb161
7
- data.tar.gz: 2c51998f1f4b676337e4210fdd5931ded7ab8ffe228c1ca4b00b86f7b6089fbb3a56f94572388a6d47a8b90ad7c4a12251e0bd43520fcfbe7edf4d7be86ae104
6
+ metadata.gz: b850a1fbc54e68271fbd7928a42cd657743d6e95c28dfecc85851f4ad26247b80c06aacac8a1339e3b6988d2d3fd8a72f32dc4c660ccf9c1cdcac862034d2f47
7
+ data.tar.gz: 712bd571f53ccf66ef8f26b85b66ccc979a9f65733c2197f0dd982fe0d2d3509c8f0bef48dd2cf289ca85632537e6ebde25828aafc55571e7d01d5f2ce1c72e6
data/Changelog.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.7.3 / 2014-03-23
4
+
5
+ * Restore proper handling of enums in callback arguments
6
+ * Simplify Rake configuration
7
+ * Various small fixes
8
+ * Remove remaining Ruby 1.8 version checks
9
+
3
10
  ## 0.7.2 / 2014-01-18
4
11
 
5
12
  * Officially drop Ruby 1.8 compatibility.
data/DESIGN.md CHANGED
@@ -61,3 +61,28 @@ introspectable. The interface is specified in terms of structs and
61
61
  functions rather than objects and methods. For now, the hard-coded Ruby
62
62
  bindings for this don't follow the introspected specification: Gir-FFI
63
63
  cannot bootstrap itself.
64
+
65
+ ## Object initialization
66
+
67
+ An attempt at making Thing.new less hacky.
68
+
69
+ Goals:
70
+
71
+ * No aliasing of Ruby's new. Overriding is possible with super being called.
72
+ * #initialize should behave as expected. We may enforce use of super in Ruby
73
+ subclasses.
74
+
75
+ Schematic depiction of what happens (can happen):
76
+
77
+ ```ruby
78
+ class GObject::Object
79
+ def self.new *args
80
+ # Stage A
81
+ super(*other_args)
82
+ # Stage C
83
+ end
84
+
85
+ def initialize *other_args
86
+ # Stage B
87
+ end
88
+ end
data/README.md CHANGED
@@ -6,10 +6,18 @@ by Matijs van Zuijlen
6
6
 
7
7
  Ruby bindings for GNOME using the GObject Introspection Repository.
8
8
 
9
- ## Features/Notes
9
+ ## Status
10
+
11
+ [![Gem Version](https://badge.fury.io/rb/gir_ffi.png)](http://badge.fury.io/rb/gir_ffi)
12
+ [![Dependency Status](https://gemnasium.com/mvz/ruby-gir-ffi.png)](https://gemnasium.com/mvz/ruby-gir-ffi)
13
+ [![Build Status](https://travis-ci.org/mvz/ruby-gir-ffi.png?branch=master)](https://travis-ci.org/mvz/ruby-gir-ffi)
14
+ [![Code Climate](https://codeclimate.com/github/mvz/ruby-gir-ffi.png)](https://codeclimate.com/github/mvz/ruby-gir-ffi)
15
+ [![Coverage Status](https://coveralls.io/repos/mvz/ruby-gir-ffi/badge.png)](https://coveralls.io/r/mvz/ruby-gir-ffi)
16
+
17
+ ## Features
10
18
 
11
19
  * Create bindings to any GObject-based library.
12
- * Bindings generated at runtime.
20
+ * Bindings are generated at runtime.
13
21
  * Provides overridden bindings for selected methods.
14
22
  * Install `gir_ffi-gtk` and require `gir_ffi-gtk2` or `gir_ffi-gtk3` to
15
23
  load overrides for Gtk2 or Gtk3.
data/Rakefile CHANGED
@@ -1,3 +1,14 @@
1
- load 'tasks/setup.rb'
1
+ require 'rake/clean'
2
+ require 'bundler/gem_tasks'
3
+
4
+ begin
5
+ require 'repl_rake'
6
+ ReplRake.setup
7
+ rescue LoadError
8
+ end
9
+
10
+ load 'tasks/test.rake'
11
+ load 'tasks/valgrind.rake'
12
+ load 'tasks/yard.rake'
2
13
 
3
14
  task :default => 'test:all'
@@ -13,12 +13,11 @@ module GLib
13
13
 
14
14
  attr_reader :element_type
15
15
 
16
- class << self
17
- undef :new
18
- def new type
19
- ptr = Lib.g_array_new(0, 0, calculated_element_size(type))
20
- wrap type, ptr
21
- end
16
+ class << self; undef :new; end
17
+
18
+ def self.new type
19
+ ptr = Lib.g_array_new(0, 0, calculated_element_size(type))
20
+ wrap type, ptr
22
21
  end
23
22
 
24
23
  def append_vals ary
@@ -13,11 +13,10 @@ module GLib
13
13
  self.class.wrap(Lib.g_byte_array_append self.to_ptr, bytes, len)
14
14
  end
15
15
 
16
- class << self
17
- undef :new
18
- def new
19
- wrap(Lib.g_byte_array_new)
20
- end
16
+ class << self; undef :new; end
17
+
18
+ def self.new
19
+ wrap(Lib.g_byte_array_new)
21
20
  end
22
21
  end
23
22
  end
@@ -31,9 +31,7 @@ module GLib
31
31
  ::GLib::Lib.g_hash_table_insert self.to_ptr, keyptr, valptr
32
32
  end
33
33
 
34
- class << self
35
- remove_method :new
36
- end
34
+ class << self; remove_method :new; end
37
35
 
38
36
  def self.new keytype, valtype
39
37
  wrap [keytype, valtype], Lib.g_hash_table_new(
@@ -12,26 +12,27 @@ module GObject
12
12
  set_value val
13
13
  end
14
14
 
15
- TYPE_TO_SET_METHOD_MAP = {
16
- TYPE_BOOLEAN => :set_boolean,
17
- TYPE_BOXED => :set_boxed,
18
- TYPE_CHAR => :set_char,
19
- TYPE_DOUBLE => :set_double,
20
- TYPE_ENUM => :set_enum,
21
- TYPE_FLOAT => :set_float,
22
- TYPE_GTYPE => :set_gtype,
23
- TYPE_INT64 => :set_int64,
24
- TYPE_INT => :set_int,
25
- TYPE_LONG => :set_long,
26
- TYPE_OBJECT => :set_instance_enhanced,
27
- TYPE_PARAM => :set_param,
28
- TYPE_POINTER => :set_pointer,
29
- TYPE_STRING => :set_string,
30
- TYPE_UCHAR => :set_uchar,
31
- TYPE_UINT => :set_uint,
32
- TYPE_UINT64 => :set_uint64,
33
- TYPE_ULONG => :set_ulong,
34
- TYPE_VARIANT => :set_variant,
15
+ METHOD_MAP = {
16
+ TYPE_BOOLEAN => [:get_boolean, :set_boolean],
17
+ TYPE_BOXED => [:get_boxed, :set_boxed],
18
+ TYPE_CHAR => [:get_char, :set_char],
19
+ TYPE_DOUBLE => [:get_double, :set_double],
20
+ TYPE_ENUM => [:get_enum_enhanced, :set_enum],
21
+ TYPE_FLAGS => [:get_flags, :set_flags],
22
+ TYPE_FLOAT => [:get_float, :set_float],
23
+ TYPE_GTYPE => [:get_gtype, :set_gtype],
24
+ TYPE_INT => [:get_int, :set_int],
25
+ TYPE_INT64 => [:get_int64, :set_int64],
26
+ TYPE_LONG => [:get_long, :set_long],
27
+ TYPE_OBJECT => [:get_object, :set_instance_enhanced],
28
+ TYPE_PARAM => [:get_param, :set_param],
29
+ TYPE_POINTER => [:get_pointer, :set_pointer],
30
+ TYPE_STRING => [:get_string, :set_string],
31
+ TYPE_UCHAR => [:get_uchar, :set_uchar],
32
+ TYPE_UINT => [:get_uint, :set_uint],
33
+ TYPE_UINT64 => [:get_uint64, :set_uint64],
34
+ TYPE_ULONG => [:get_ulong, :set_ulong],
35
+ TYPE_VARIANT => [:get_variant, :set_variant]
35
36
  }
36
37
 
37
38
  def value= val
@@ -72,28 +73,6 @@ module GObject
72
73
  GObject.type_name current_gtype
73
74
  end
74
75
 
75
- TYPE_TO_GET_METHOD_MAP = {
76
- TYPE_BOOLEAN => :get_boolean,
77
- TYPE_BOXED => :get_boxed,
78
- TYPE_CHAR => :get_char,
79
- TYPE_DOUBLE => :get_double,
80
- TYPE_ENUM => :get_enum_enhanced,
81
- TYPE_FLAGS => :get_flags,
82
- TYPE_FLOAT => :get_float,
83
- TYPE_GTYPE => :get_gtype,
84
- TYPE_INT64 => :get_int64,
85
- TYPE_INT => :get_int,
86
- TYPE_LONG => :get_long,
87
- TYPE_OBJECT => :get_object,
88
- TYPE_POINTER => :get_pointer,
89
- TYPE_STRING => :get_string,
90
- TYPE_UCHAR => :get_uchar,
91
- TYPE_UINT => :get_uint,
92
- TYPE_UINT64 => :get_uint64,
93
- TYPE_ULONG => :get_ulong,
94
- TYPE_VARIANT => :get_variant,
95
- }
96
-
97
76
  def get_value
98
77
  value = get_value_plain
99
78
  if current_fundamental_type == TYPE_BOXED
@@ -107,27 +86,25 @@ module GObject
107
86
  send get_method
108
87
  end
109
88
 
110
- class << self
111
- # TODO: Give more generic name
112
- def wrap_ruby_value val
113
- self.new.set_ruby_value val
114
- end
89
+ # TODO: Give more generic name
90
+ def self.wrap_ruby_value val
91
+ self.new.set_ruby_value val
92
+ end
115
93
 
116
- def from val
117
- case val
118
- when self
119
- val
120
- when nil
121
- nil
122
- else
123
- wrap_ruby_value val
124
- end
94
+ def self.from val
95
+ case val
96
+ when self
97
+ val
98
+ when nil
99
+ nil
100
+ else
101
+ wrap_ruby_value val
125
102
  end
103
+ end
126
104
 
127
- def for_g_type g_type
128
- return nil if g_type == TYPE_NONE
129
- self.new.tap {|it| it.init g_type }
130
- end
105
+ def self.for_g_type g_type
106
+ return nil if g_type == TYPE_NONE
107
+ self.new.tap {|it| it.init g_type }
131
108
  end
132
109
 
133
110
  # TODO: Combine with wrap_ruby_value
@@ -168,15 +145,16 @@ module GObject
168
145
  end
169
146
 
170
147
  def get_method
171
- TYPE_TO_GET_METHOD_MAP[current_gtype] or
172
- TYPE_TO_GET_METHOD_MAP[current_fundamental_type] or
173
- raise "Can't find method to get #{current_gtype_name}"
148
+ method_map_entry.first
174
149
  end
175
150
 
176
151
  def set_method
177
- TYPE_TO_SET_METHOD_MAP[current_gtype] or
178
- TYPE_TO_SET_METHOD_MAP[current_fundamental_type] or
179
- raise "Can't find method to set #{current_gtype_name}"
152
+ method_map_entry.last
153
+ end
154
+
155
+ def method_map_entry
156
+ METHOD_MAP[current_gtype] || METHOD_MAP[current_fundamental_type] ||
157
+ fail("No method map entry for #{current_gtype_name}")
180
158
  end
181
159
  end
182
160
  end
@@ -23,7 +23,7 @@ module GObjectIntrospection
23
23
  def value
24
24
  tag = constant_type.tag
25
25
  val = value_union[TYPE_TAG_TO_UNION_MEMBER[tag]]
26
- if RUBY_VERSION >= "1.9" and tag == :utf8
26
+ if tag == :utf8
27
27
  val.force_encoding("utf-8")
28
28
  else
29
29
  val
@@ -1,15 +1,7 @@
1
1
  module GirFFI
2
2
  module BuilderHelper
3
- def const_defined_for parent, name
4
- if RUBY_VERSION < "1.9"
5
- parent.const_defined? name
6
- else
7
- parent.const_defined? name, false
8
- end
9
- end
10
-
11
3
  def optionally_define_constant parent, name
12
- if const_defined_for parent, name
4
+ if parent.const_defined? name, false
13
5
  parent.const_get name
14
6
  else
15
7
  parent.const_set name, yield
@@ -37,7 +37,7 @@ module GirFFI
37
37
  end
38
38
 
39
39
  def already_set_up
40
- const_defined_for klass, :GIR_FFI_BUILDER
40
+ klass.const_defined? :GIR_FFI_BUILDER, false
41
41
  end
42
42
 
43
43
  def gir
@@ -20,7 +20,7 @@ module GirFFI
20
20
 
21
21
  def setup_callback
22
22
  optionally_define_constant klass, :Callback do
23
- lib.callback callback_sym, argument_types, return_type
23
+ lib.callback callback_sym, argument_ffi_types, return_ffi_type
24
24
  end
25
25
  end
26
26
 
@@ -36,12 +36,12 @@ module GirFFI
36
36
  @classname.to_sym
37
37
  end
38
38
 
39
- def argument_types
40
- @argument_types ||= @info.argument_ffi_types
39
+ def argument_ffi_types
40
+ @argument_ffi_types ||= @info.argument_ffi_types
41
41
  end
42
42
 
43
- def return_type
44
- @return_type ||= @info.return_ffi_type
43
+ def return_ffi_type
44
+ @return_ffi_type ||= @info.return_ffi_type
45
45
  end
46
46
  end
47
47
  end
@@ -100,8 +100,8 @@ module GirFFI
100
100
  end
101
101
 
102
102
  def parameter_preparation
103
- argument_builders.sort_by {|arg|
104
- arg.type_info.array_length}.map(&:pre_conversion).flatten
103
+ argument_builders.sort_by.with_index {|arg, i|
104
+ [arg.type_info.array_length, i] }.map(&:pre_conversion).flatten
105
105
  end
106
106
 
107
107
  def capture
@@ -45,12 +45,12 @@ module GirFFI
45
45
  @container_info ||= info.container
46
46
  end
47
47
 
48
- def argument_types
49
- @argument_types ||= info.argument_ffi_types.unshift(receiver_type_info.to_ffitype)
48
+ def argument_ffi_types
49
+ @argument_ffi_types ||= info.argument_ffi_types.unshift(receiver_type_info.to_ffitype)
50
50
  end
51
51
 
52
- def return_type
53
- @return_type ||= info.return_ffi_type
52
+ def return_ffi_type
53
+ @return_ffi_type ||= info.return_ffi_type
54
54
  end
55
55
  end
56
56
  end
@@ -12,7 +12,8 @@ module GirFFI
12
12
 
13
13
  def self.from_native(value, _context)
14
14
  return nil if !value || value.null?
15
- FFI::Function.new gir_ffi_builder.return_type, gir_ffi_builder.argument_types, value
15
+ FFI::Function.new(gir_ffi_builder.return_ffi_type,
16
+ gir_ffi_builder.argument_ffi_types, value)
16
17
  end
17
18
 
18
19
  def self.to_native(value, _context)
@@ -50,7 +51,8 @@ module GirFFI
50
51
  def to_native
51
52
  @to_native ||= begin
52
53
  builder = self.class.gir_ffi_builder
53
- FFI::Function.new builder.return_type, builder.argument_types, self
54
+ FFI::Function.new(builder.return_ffi_type,
55
+ builder.argument_ffi_types, self)
54
56
  end
55
57
  end
56
58
 
@@ -20,14 +20,8 @@ module GirFFI
20
20
  klass.direct_wrap self
21
21
  end
22
22
 
23
- if RUBY_VERSION < "1.9"
24
- def to_utf8
25
- null? ? nil : read_string
26
- end
27
- else
28
- def to_utf8
29
- null? ? nil : read_string.force_encoding("utf-8")
30
- end
23
+ def to_utf8
24
+ null? ? nil : read_string.force_encoding("utf-8")
31
25
  end
32
26
  end
33
27
  end
@@ -6,6 +6,11 @@ module GirFFI
6
6
  return :pointer if direction != :in
7
7
  return argument_type.to_ffitype
8
8
  end
9
+
10
+ def to_callback_ffitype
11
+ return :pointer if direction != :in
12
+ return argument_type.to_callback_ffitype
13
+ end
9
14
  end
10
15
  end
11
16
  end
@@ -6,8 +6,18 @@ module GirFFI
6
6
  Builder.build_class(self)
7
7
  end
8
8
 
9
+ def argument_ffi_types
10
+ args.map { |arg| arg.to_callback_ffitype }
11
+ end
12
+
9
13
  def return_ffi_type
10
- return_type.to_callback_ffitype
14
+ result = return_type.to_callback_ffitype
15
+ # FIXME: Should this be in ITypeInfo#to_callback_ffitype?
16
+ if result == GLib::Boolean
17
+ :bool
18
+ else
19
+ result
20
+ end
11
21
  end
12
22
  end
13
23
  end
@@ -16,6 +16,7 @@ module GirFFI
16
16
  # from that, instead of vice versa.
17
17
  bldr = Builders::SignalBuilder.new(self)
18
18
  wrapped = bldr.build_class.from(block)
19
+ # FIXME: Logically, this should use CallbackBase#to_native
19
20
  FFI::Function.new return_ffi_type, ffi_callback_argument_types, &wrapped
20
21
  end
21
22
 
@@ -44,7 +45,7 @@ module GirFFI
44
45
  # types as well?
45
46
  def ffi_callback_argument_types
46
47
  types = args.map do |arg|
47
- arg.argument_type.to_callback_ffitype
48
+ arg.to_callback_ffitype
48
49
  end
49
50
  types.unshift(:pointer).push(:pointer)
50
51
  end
@@ -1,3 +1,3 @@
1
1
  module GirFFI
2
- VERSION = "0.7.2"
2
+ VERSION = "0.7.3"
3
3
  end
data/lib/gir_ffi.rb CHANGED
@@ -15,6 +15,7 @@ require 'gir_ffi/zero_terminated'
15
15
  require 'gir_ffi/arg_helper'
16
16
  require 'gir_ffi/user_defined_type_info'
17
17
  require 'gir_ffi/builder'
18
+ require 'gir_ffi/version'
18
19
 
19
20
  module GirFFI
20
21
  def self.setup module_name, version=nil
data/tasks/yard.rake ADDED
@@ -0,0 +1,6 @@
1
+ begin
2
+ require 'yard'
3
+
4
+ YARD::Rake::YardocTask.new
5
+ rescue LoadError
6
+ end
@@ -10,6 +10,12 @@ begin
10
10
  rescue LoadError
11
11
  end
12
12
 
13
+ begin
14
+ require 'coveralls'
15
+ Coveralls.wear!
16
+ rescue LoadError
17
+ end
18
+
13
19
  require 'minitest/autorun'
14
20
  require 'rr'
15
21
 
@@ -70,10 +70,10 @@ describe GirFFI::Builders::SignalBuilder do
70
70
  expected = <<-CODE.reset_indentation
71
71
  def self.call_with_argument_mapping(_proc, _instance, arr, len, _user_data)
72
72
  _v1 = Regress::TestObj.wrap(_instance)
73
- _v2 = GirFFI::ArgHelper::OBJECT_STORE[_user_data.address]
74
- _v3 = len
75
- _v4 = GirFFI::SizedArray.wrap(:guint32, _v3, arr)
76
- _proc.call(_v1, _v4, _v2)
73
+ _v2 = len
74
+ _v3 = GirFFI::ArgHelper::OBJECT_STORE[_user_data.address]
75
+ _v4 = GirFFI::SizedArray.wrap(:guint32, _v2, arr)
76
+ _proc.call(_v1, _v4, _v3)
77
77
  end
78
78
  CODE
79
79
 
@@ -0,0 +1,7 @@
1
+ require 'gir_ffi_test_helper'
2
+
3
+ describe GirFFI::VERSION do
4
+ it "is set to a valid version number" do
5
+ GirFFI::VERSION.must_match(/\d\.\d\.\d/)
6
+ end
7
+ end
@@ -92,5 +92,11 @@ describe "The generated Gio module" do
92
92
  pass
93
93
  end
94
94
  end
95
+
96
+ describe "the SocketSourceFunc callback" do
97
+ it "can be cast to a native function" do
98
+ Gio::SocketSourceFunc.new {|*args| p args}.to_native
99
+ end
100
+ end
95
101
  end
96
102
 
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.2
4
+ version: 0.7.3
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-18 00:00:00.000000000 Z
11
+ date: 2014-03-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - ~>
46
46
  - !ruby/object:Gem::Version
47
- version: '5.0'
47
+ version: 5.2.3
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: '5.0'
54
+ version: 5.2.3
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rr
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -278,6 +278,7 @@ files:
278
278
  - test/gir_ffi/builders/user_defined_builder_test.rb
279
279
  - test/gir_ffi/method_stubber_test.rb
280
280
  - test/gir_ffi/variable_name_generator_test.rb
281
+ - test/gir_ffi/version_test.rb
281
282
  - test/gir_ffi/ffi_ext/pointer_test.rb
282
283
  - test/gir_ffi/class_base_test.rb
283
284
  - test/gir_ffi/type_map_test.rb
@@ -319,7 +320,7 @@ files:
319
320
  - test/ffi-gobject_introspection/i_enum_info_test.rb
320
321
  - test/gir_ffi_test.rb
321
322
  - test/introspection_test_helper.rb
322
- - tasks/setup.rb
323
+ - tasks/yard.rake
323
324
  - tasks/valgrind.rake
324
325
  - tasks/test.rake
325
326
  - examples/demo_ffi_nested_struct.rb
@@ -430,6 +431,7 @@ test_files:
430
431
  - test/gir_ffi/user_defined_property_info_test.rb
431
432
  - test/gir_ffi/user_defined_type_info_test.rb
432
433
  - test/gir_ffi/variable_name_generator_test.rb
434
+ - test/gir_ffi/version_test.rb
433
435
  - test/gir_ffi/zero_terminated_test.rb
434
436
  - test/gir_ffi_test.rb
435
437
  - test/gir_ffi_test_helper.rb
data/tasks/setup.rb DELETED
@@ -1,6 +0,0 @@
1
- require 'rake/clean'
2
-
3
- # Load the other rake files in the tasks folder
4
- tasks_dir = File.expand_path(File.dirname(__FILE__))
5
- rakefiles = Dir.glob(File.join(tasks_dir, '*.rake')).sort
6
- import(*rakefiles)