gir_ffi 0.8.2 → 0.8.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: 6121625e854dd754146516dab64b67c650155c67
4
- data.tar.gz: e486edea5ebffe7146c68dca786796f94ac58945
3
+ metadata.gz: be09f0c7b882ddc0bb3dfdc7d0c78a799f364523
4
+ data.tar.gz: 0a5cff8324417259a1092c686e9d3ffc492efebf
5
5
  SHA512:
6
- metadata.gz: 170a26c6f8aecc34a77722a5525d8b1534491febdd244fff0a9c88aa298a357ee0914f1fc15393da52b306d2f295e7aaba0180f258a187e942433658e51262ae
7
- data.tar.gz: afbed9ce4c8869f8e44b6c1bbb36d22192bf27e01720874d9e3632fd5dd4b59fcc5604e785c39ccf1c6b8e6fe084270d7efee54f992a70e36dc469fd93508031
6
+ metadata.gz: 26639dd911992a83273376f6421f9eee8f802386d3b345a62feacd4b6a7d5fac9f7cc55cba160428ceb59c7e4740404b990761892fddef705bb4dd94bcf1fa21
7
+ data.tar.gz: 63a71dd6cf133b0e7f0dcaf335961297b968e3cc3293170e9f5b9daf9709ad6562cc1df92e8c4b4749af61b9966a8540153a316002ef2b0b8bf817dd02199837
data/Changelog.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.8.3 / 2015-11-13
4
+
5
+ * Fix handling of signal handler return values
6
+ * Do not create setters for properties that cannot be set
7
+
3
8
  ## 0.8.2 / 2015-10-10
4
9
 
5
10
  * Use inherited constructor for boxed types
data/TODO.md CHANGED
@@ -65,6 +65,19 @@ It would be good to replace this with something that's easier to use:
65
65
  Ruby-GNOME do
66
66
  * What about properties?
67
67
 
68
+ How about:
69
+
70
+ class Derived < Base
71
+ include SomeGObjectInterface
72
+
73
+ register_type 'Derived'
74
+
75
+ install_property ...
76
+ install_vfunc_implementation ...
77
+ end
78
+
79
+ This needs issue #63 to be resolved.
80
+
68
81
  ## Persistent Ruby GObject identity
69
82
 
70
83
  GirFFI should make sure that if it gets a pointer to a GObject for which a Ruby
@@ -5,5 +5,25 @@ module GObjectIntrospection
5
5
  def property_type
6
6
  ITypeInfo.wrap(Lib.g_property_info_get_type @gobj)
7
7
  end
8
+
9
+ def flags
10
+ Lib.g_property_info_get_flags @gobj
11
+ end
12
+
13
+ def readable?
14
+ flags & 1 != 0
15
+ end
16
+
17
+ def writeable?
18
+ flags & 2 != 0
19
+ end
20
+
21
+ def construct?
22
+ flags & 4 != 0
23
+ end
24
+
25
+ def construct_only?
26
+ flags & 8 != 0
27
+ end
8
28
  end
9
29
  end
@@ -289,6 +289,8 @@ module GObjectIntrospection
289
289
  # IPropertyInfo
290
290
  #
291
291
  attach_function :g_property_info_get_type, [:pointer], :pointer
292
+ # TODO: return type is bitfield
293
+ attach_function :g_property_info_get_flags, [:pointer], :int
292
294
 
293
295
  ::GObjectIntrospection::VERSION = version_guesser.best_guess
294
296
  end
@@ -36,7 +36,7 @@ module GirFFI
36
36
  end
37
37
 
38
38
  def return_value_name
39
- return_value_builder.return_value_name if return_value_builder.relevant?
39
+ return_value_builder.return_value_name
40
40
  end
41
41
 
42
42
  def return_value_names
@@ -38,12 +38,16 @@ module GirFFI
38
38
  end
39
39
  end
40
40
 
41
- private
42
-
43
41
  def has_post_conversion?
44
- type_info.needs_c_to_ruby_conversion_for_callbacks?
42
+ relevant? && needs_ruby_to_c_conversion?
43
+ end
44
+
45
+ def needs_ruby_to_c_conversion?
46
+ type_info.needs_ruby_to_c_conversion_for_callbacks?
45
47
  end
46
48
 
49
+ private
50
+
47
51
  def post_convertor
48
52
  @post_convertor ||= RubyToCConvertor.new(type_info, post_convertor_argument)
49
53
  end
@@ -0,0 +1,14 @@
1
+ require 'gir_ffi/builders/callback_return_value_builder'
2
+
3
+ module GirFFI
4
+ module Builders
5
+ # Implements building post-processing statements for return values of
6
+ # closures.
7
+ class ClosureReturnValueBuilder < CallbackReturnValueBuilder
8
+ def needs_ruby_to_c_conversion?
9
+ type_info.needs_ruby_to_c_conversion_for_closures?
10
+ end
11
+ end
12
+ end
13
+ end
14
+
@@ -1,6 +1,6 @@
1
1
  require 'gir_ffi/variable_name_generator'
2
2
  require 'gir_ffi/builders/closure_argument_builder'
3
- require 'gir_ffi/builders/callback_return_value_builder'
3
+ require 'gir_ffi/builders/closure_return_value_builder'
4
4
  require 'gir_ffi/builders/argument_builder_collection'
5
5
  require 'gir_ffi/builders/method_template'
6
6
 
@@ -20,7 +20,7 @@ module GirFFI
20
20
  receiver_builder = make_argument_builder receiver_info
21
21
  argument_builders = argument_infos.map { |arg| make_argument_builder arg }
22
22
  return_value_builder =
23
- CallbackReturnValueBuilder.new(variable_generator, return_value_info)
23
+ ClosureReturnValueBuilder.new(variable_generator, return_value_info)
24
24
 
25
25
  @argument_builder_collection =
26
26
  ArgumentBuilderCollection.new(return_value_builder, argument_builders,
@@ -8,7 +8,7 @@ module GirFFI
8
8
 
9
9
  def build
10
10
  setup_getter
11
- setup_setter
11
+ setup_setter if setting_allowed
12
12
  end
13
13
 
14
14
  def setup_getter
@@ -123,6 +123,10 @@ module GirFFI
123
123
  def container_info
124
124
  @container_info ||= @info.container
125
125
  end
126
+
127
+ def setting_allowed
128
+ @info.writeable? && !@info.construct_only?
129
+ end
126
130
  end
127
131
  end
128
132
  end
@@ -163,6 +163,10 @@ module GirFFI
163
163
  [:array, :c, :ghash, :struct, :strv].include?(flattened_tag)
164
164
  end
165
165
 
166
+ def needs_ruby_to_c_conversion_for_closures?
167
+ [:array].include?(flattened_tag)
168
+ end
169
+
166
170
  def extra_conversion_arguments
167
171
  case flattened_tag
168
172
  when :utf8, :void
@@ -1,4 +1,4 @@
1
1
  # Current GirFFI version
2
2
  module GirFFI
3
- VERSION = '0.8.2'
3
+ VERSION = '0.8.3'
4
4
  end
@@ -0,0 +1,44 @@
1
+ require 'introspection_test_helper'
2
+
3
+ describe GObjectIntrospection::IPropertyInfo do
4
+ describe "for Regress::TestObj's 'double' property" do
5
+ let(:property_info) { get_property_introspection_data 'Regress', 'TestObj', 'double' }
6
+
7
+ it 'returns :gdouble as its type' do
8
+ property_info.property_type.tag.must_equal :gdouble
9
+ end
10
+
11
+ it 'flags the property as readable' do
12
+ property_info.readable?.must_equal true
13
+ end
14
+
15
+ it 'flags the property as writeable' do
16
+ property_info.writeable?.must_equal true
17
+ end
18
+
19
+ it 'flags the property as not construct-only' do
20
+ property_info.construct_only?.must_equal false
21
+ end
22
+ end
23
+
24
+ describe "for GObject::Binding's 'target-property' property" do
25
+ let(:property_info) {
26
+ get_property_introspection_data 'GObject', 'Binding', 'target-property' }
27
+
28
+ it 'returns :utf8 as its type' do
29
+ property_info.property_type.tag.must_equal :utf8
30
+ end
31
+
32
+ it 'flags the property as readable' do
33
+ property_info.readable?.must_equal true
34
+ end
35
+
36
+ it 'flags the property as writeable' do
37
+ property_info.writeable?.must_equal true
38
+ end
39
+
40
+ it 'flags the property as construct-only' do
41
+ property_info.construct_only?.must_equal true
42
+ end
43
+ end
44
+ end
@@ -139,5 +139,27 @@ describe GirFFI::Builders::SignalClosureBuilder do
139
139
  builder.marshaller_definition.must_equal expected
140
140
  end
141
141
  end
142
+
143
+ describe 'for a signal returning an string' do
144
+ let(:signal_info) do
145
+ get_signal_introspection_data 'Gtk', 'Scale', 'format-value'
146
+ end
147
+
148
+ it 'returns a mapping method that passes the string result to return_value directly' do
149
+ skip unless signal_info
150
+
151
+ expected = <<-CODE.reset_indentation
152
+ def self.marshaller(closure, return_value, param_values, _invocation_hint, _marshal_data)
153
+ _instance, value = param_values.map(&:get_value_plain)
154
+ _v1 = _instance
155
+ _v2 = value
156
+ _v3 = wrap(closure.to_ptr).invoke_block(_v1, _v2)
157
+ return_value.set_value _v3
158
+ end
159
+ CODE
160
+
161
+ builder.marshaller_definition.must_equal expected
162
+ end
163
+ end
142
164
  end
143
165
  end
@@ -11,26 +11,6 @@ class Sequence
11
11
  end
12
12
 
13
13
  module GirFFITestExtensions
14
- def get_field_introspection_data(namespace, klass, name)
15
- get_introspection_data(namespace, klass).find_field name
16
- end
17
-
18
- def get_method_introspection_data(namespace, klass, name)
19
- get_introspection_data(namespace, klass).find_method name
20
- end
21
-
22
- def get_property_introspection_data(namespace, klass, name)
23
- get_introspection_data(namespace, klass).find_property name
24
- end
25
-
26
- def get_signal_introspection_data(namespace, klass, name)
27
- get_introspection_data(namespace, klass).find_signal name
28
- end
29
-
30
- def get_vfunc_introspection_data(namespace, klass, name)
31
- get_introspection_data(namespace, klass).find_vfunc name
32
- end
33
-
34
14
  SAVED_MODULES = {}
35
15
 
36
16
  def save_module(name)
@@ -98,4 +98,20 @@ describe 'The generated Gio module' do
98
98
  Gio::SocketSourceFunc.new { |*args| p args }.to_native
99
99
  end
100
100
  end
101
+
102
+ describe 'Gio::SimpleAction' do
103
+ let(:simple_action) { Gio::SimpleAction.new('test', 'd') }
104
+
105
+ it 'can read the property "state-type" with #get_property' do
106
+ simple_action.get_property('state-type').get_value.must_be_nil
107
+ end
108
+
109
+ it 'can read the property "state-type" with #state_type' do
110
+ simple_action.state_type.must_be_nil
111
+ end
112
+
113
+ it 'cannot write the property "state-type" with #state_type=' do
114
+ proc { simple_action.state_type = nil }.must_raise NoMethodError
115
+ end
116
+ end
101
117
  end
@@ -1,5 +1,7 @@
1
1
  require 'gir_ffi_test_helper'
2
2
 
3
+ GirFFI.setup :Regress
4
+
3
5
  describe GObject do
4
6
  describe '.type_interfaces' do
5
7
  it 'works, showing that returning an array of GType works' do
@@ -72,4 +74,31 @@ describe GObject do
72
74
  signal_query.param_types.size.must_equal 1
73
75
  end
74
76
  end
77
+
78
+ describe GObject::Binding do
79
+ it 'is created with GObject::Object#bind_property' do
80
+ source = Regress::TestObj.constructor
81
+ target = Regress::TestObj.constructor
82
+ binding = source.bind_property 'double', target, 'double', :default
83
+ binding.must_be_kind_of GObject::Binding
84
+ end
85
+
86
+ describe 'an instance' do
87
+ let(:source) { Regress::TestObj.constructor }
88
+ let(:target) { Regress::TestObj.constructor }
89
+ let(:binding) { source.bind_property 'double', target, 'double', :default }
90
+
91
+ it 'can read the property "target-property" with #get_property' do
92
+ binding.get_property('target-property').get_value.must_equal 'double'
93
+ end
94
+
95
+ it 'can read the property "target-property" with #target_property' do
96
+ binding.target_property.must_equal 'double'
97
+ end
98
+
99
+ it 'cannot write the property "target-property" with #target_property=' do
100
+ proc { binding.target_property = 'foo' }.must_raise NoMethodError
101
+ end
102
+ end
103
+ end
75
104
  end
@@ -8,6 +8,26 @@ module IntrospectionTestExtensions
8
8
  gir.require namespace, nil
9
9
  gir.find_by_name namespace, name
10
10
  end
11
+
12
+ def get_field_introspection_data(namespace, klass, name)
13
+ get_introspection_data(namespace, klass).find_field name
14
+ end
15
+
16
+ def get_method_introspection_data(namespace, klass, name)
17
+ get_introspection_data(namespace, klass).find_method name
18
+ end
19
+
20
+ def get_property_introspection_data(namespace, klass, name)
21
+ get_introspection_data(namespace, klass).find_property name
22
+ end
23
+
24
+ def get_signal_introspection_data(namespace, klass, name)
25
+ get_introspection_data(namespace, klass).find_signal name
26
+ end
27
+
28
+ def get_vfunc_introspection_data(namespace, klass, name)
29
+ get_introspection_data(namespace, klass).find_vfunc name
30
+ end
11
31
  end
12
32
 
13
33
  Minitest::Test.send :include, IntrospectionTestExtensions
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.8.2
4
+ version: 0.8.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: 2015-10-10 00:00:00.000000000 Z
11
+ date: 2015-11-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ffi
@@ -174,6 +174,7 @@ files:
174
174
  - lib/gir_ffi/builders/callback_return_value_builder.rb
175
175
  - lib/gir_ffi/builders/closure_argument_builder.rb
176
176
  - lib/gir_ffi/builders/closure_convertor.rb
177
+ - lib/gir_ffi/builders/closure_return_value_builder.rb
177
178
  - lib/gir_ffi/builders/closure_to_pointer_convertor.rb
178
179
  - lib/gir_ffi/builders/constant_builder.rb
179
180
  - lib/gir_ffi/builders/constructor_builder.rb
@@ -281,6 +282,7 @@ files:
281
282
  - test/ffi-gobject_introspection/i_function_info_test.rb
282
283
  - test/ffi-gobject_introspection/i_interface_info_test.rb
283
284
  - test/ffi-gobject_introspection/i_object_info_test.rb
285
+ - test/ffi-gobject_introspection/i_property_info_test.rb
284
286
  - test/ffi-gobject_introspection/i_registered_type_info_test.rb
285
287
  - test/ffi-gobject_introspection/i_repository_test.rb
286
288
  - test/ffi-gobject_introspection/i_struct_info_test.rb