gir_ffi 0.7.2 → 0.7.3

Sign up to get free protection for your applications and to get access to all the features.
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)