gobject-introspection 3.3.7 → 3.3.8

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
  SHA256:
3
- metadata.gz: 4ef3e45ea2b6d4e28b1843c528a1ba4aee03b1df923327f2942fd6d1b377eee5
4
- data.tar.gz: 1032fca067c089c9706d919e74db6c5c5385ec8a14278fbe3256d72532df7784
3
+ metadata.gz: ce2773caef8d28da88dd1ed2dfdf50fb20ada6db54107376328245119a7c43e1
4
+ data.tar.gz: e465986398c01171ea645d4e544abc2649bbffb1cd06ad00ede6ab4f903df981
5
5
  SHA512:
6
- metadata.gz: '09846692d8fc65661b11d2972720eed395e5500544bf8bd2af186da930d92751e76db258db7b78bbd388191c6ce012d218bf7b3a356ff8688aeb1574b939169d'
7
- data.tar.gz: 7c4cd440d50656c99d8472087a5599eaea262289daae2e00ca8f2c383c2ab934eb5420487a1090a100a9aaefcdc2ce4e74f4c6bd2a9904c84df8838f0a57b367
6
+ metadata.gz: 464ce3a16ac291fe676b7dc6bb8af918aa706cb3685985309b3bdf8dad13387349ebd4f243e599e89d95151edc927720a9d7cf46a6cabafc58d13a97c46894d8
7
+ data.tar.gz: 671033bd5e52f2bf7792ea7d86a2797a9c437bb62cc4da1c1ce8264fbc489398e7cc22823695abe7f3c4c2d07564a82800da3c0482452430ba7bb6338ddddafb
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright (C) 2012-2019 Ruby-GNOME2 Project Team
3
+ * Copyright (C) 2012-2019 Ruby-GNOME Project Team
4
4
  *
5
5
  * This library is free software; you can redistribute it and/or
6
6
  * modify it under the terms of the GNU Lesser General Public
@@ -20,9 +20,10 @@
20
20
 
21
21
  #include "rb-gi-private.h"
22
22
 
23
- static VALUE rb_cGLibValue = Qnil;
24
- static VALUE rb_cGLibBytes = Qnil;
25
23
  static VALUE rb_cGLibBoxed = Qnil;
24
+ static VALUE rb_cGLibBytes = Qnil;
25
+ static VALUE rb_cGLibObject = Qnil;
26
+ static VALUE rb_cGLibValue = Qnil;
26
27
 
27
28
  static gboolean
28
29
  rb_gi_arg_info_may_be_null(GIArgInfo *arg_info)
@@ -3507,6 +3508,8 @@ rb_gi_value_argument_from_ruby_void(GIArgument *argument, GITypeInfo *type_info,
3507
3508
 
3508
3509
  if (RB_TYPE_P(rb_argument, RUBY_T_STRING)) {
3509
3510
  argument->v_pointer = RSTRING_PTR(rb_argument);
3511
+ } else if (RVAL2CBOOL(rb_obj_is_kind_of(rb_argument, rb_cGLibObject))) {
3512
+ argument->v_pointer = RVAL2GOBJ(rb_argument);
3510
3513
  } else {
3511
3514
  argument->v_pointer = GUINT_TO_POINTER(NUM2ULONG(rb_argument));
3512
3515
  }
@@ -4148,15 +4151,16 @@ set_in_array_double_arguments_from_ruby(GIArgument *array_argument,
4148
4151
 
4149
4152
  static void
4150
4153
  set_in_array_gtype_arguments_from_ruby(GIArgument *array_argument,
4151
- VALUE rb_class_array)
4154
+ VALUE rb_types)
4152
4155
  {
4153
4156
  GType *types;
4154
- long i, n_args;
4157
+ long i, n_types;
4155
4158
 
4156
- n_args = RARRAY_LEN(rb_class_array);
4157
- types = ALLOC_N(GType, n_args);
4158
- for (i = 0; i < n_args; i++) {
4159
- types[i] = CLASS2GTYPE(RARRAY_PTR(rb_class_array)[i]);
4159
+ n_types = RARRAY_LEN(rb_types);
4160
+ types = ALLOC_N(GType, n_types);
4161
+ for (i = 0; i < n_types; i++) {
4162
+ VALUE rb_type = RARRAY_PTR(rb_types)[i];
4163
+ types[i] = rbgobj_gtype_get(rb_type);
4160
4164
  }
4161
4165
 
4162
4166
  array_argument->v_pointer = types;
@@ -4940,7 +4944,8 @@ rb_gi_in_argument_free(VALUE rb_argument,
4940
4944
  void
4941
4945
  rb_gi_argument_init(void)
4942
4946
  {
4943
- rb_cGLibValue = rb_const_get(mGLib, rb_intern("Value"));
4944
- rb_cGLibBytes = rb_const_get(mGLib, rb_intern("Bytes"));
4945
4947
  rb_cGLibBoxed = rb_const_get(mGLib, rb_intern("Boxed"));
4948
+ rb_cGLibBytes = rb_const_get(mGLib, rb_intern("Bytes"));
4949
+ rb_cGLibObject = rb_const_get(mGLib, rb_intern("Object"));
4950
+ rb_cGLibValue = rb_const_get(mGLib, rb_intern("Value"));
4946
4951
  }
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright (C) 2012-2018 Ruby-GNOME2 Project Team
3
+ * Copyright (C) 2012-2019 Ruby-GNOME Project Team
4
4
  *
5
5
  * This library is free software; you can redistribute it and/or
6
6
  * modify it under the terms of the GNU Lesser General Public
@@ -125,6 +125,8 @@ rb_gi_struct_info_to_ruby(GIStructInfo *info,
125
125
  namespace = g_base_info_get_namespace(base_info);
126
126
  name = g_base_info_get_name(base_info);
127
127
 
128
+ /* Workaround for old cairo-gobject. 1.14.6 on Ubuntu 16.04
129
+ * doesn't provide GType for cairo_font_options_t. */
128
130
  if (strcmp(namespace, "cairo") == 0) {
129
131
  gchar *gtype_name;
130
132
  GType gtype;
@@ -1,6 +1,6 @@
1
1
  # -*- ruby -*-
2
2
  #
3
- # Copyright (C) 2018 Ruby-GNOME2 Project Team
3
+ # Copyright (C) 2018 Ruby-GNOME Project Team
4
4
  #
5
5
  # This library is free software; you can redistribute it and/or
6
6
  # modify it under the terms of the GNU Lesser General Public
@@ -27,7 +27,7 @@ Gem::Specification.new do |s|
27
27
  "Ruby/GObjectIntrospection provides bindings of GObject Introspection " +
28
28
  "and a loader module that can generate dynamically Ruby bindings " +
29
29
  "of any GObject C libraries"
30
- s.author = "The Ruby-GNOME2 Project Team"
30
+ s.author = "The Ruby-GNOME Project Team"
31
31
  s.email = "ruby-gnome2-devel-en@lists.sourceforge.net"
32
32
  s.homepage = "https://ruby-gnome2.osdn.jp/"
33
33
  s.licenses = ["LGPL-2.1+"]
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2012-2019 Ruby-GNOME2 Project Team
1
+ # Copyright (C) 2012-2019 Ruby-GNOME Project Team
2
2
  #
3
3
  # This library is free software; you can redistribute it and/or
4
4
  # modify it under the terms of the GNU Lesser General Public
@@ -51,12 +51,14 @@ GLib::Log.set_log_domain(GObjectIntrospection::LOG_DOMAIN)
51
51
  require "gobject-introspection/arg-info"
52
52
  require "gobject-introspection/boxed-info"
53
53
  require "gobject-introspection/callable-info"
54
+ require "gobject-introspection/function-info"
54
55
  require "gobject-introspection/interface-info"
55
56
  require "gobject-introspection/object-info"
56
57
  require "gobject-introspection/registered-type-info"
57
58
  require "gobject-introspection/repository"
58
59
  require "gobject-introspection/struct-info"
59
60
  require "gobject-introspection/type-info"
61
+ require "gobject-introspection/type-tag"
60
62
  require "gobject-introspection/union-info"
61
63
 
62
64
  require "gobject-introspection/version"
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2015 Ruby-GNOME2 Project Team
1
+ # Copyright (C) 2015-2019 Ruby-GNOME Project Team
2
2
  #
3
3
  # This library is free software; you can redistribute it and/or
4
4
  # modify it under the terms of the GNU Lesser General Public
@@ -22,6 +22,23 @@ module GObjectIntrospection
22
22
  @gclosure_p = compute_gclosure?
23
23
  end
24
24
 
25
+ def signature
26
+ sig = "#{name}:"
27
+ sig << " (optional)" if optional?
28
+ sig << " (may be null)" if may_be_null?
29
+ sig << " #{type.description}"
30
+ sig
31
+ end
32
+
33
+ def inspect
34
+ super.gsub(/>\z/) do
35
+ " name=#{name.inspect}" +
36
+ " optional?=#{optional?.inspect}" +
37
+ " may_be_null?=#{may_be_null?.inspect}" +
38
+ " type=#{type.inspect}>"
39
+ end
40
+ end
41
+
25
42
  private
26
43
  def compute_gclosure?
27
44
  type_info = type
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2013 Ruby-GNOME2 Project Team
1
+ # Copyright (C) 2013-2019 Ruby-GNOME Project Team
2
2
  #
3
3
  # This library is free software; you can redistribute it and/or
4
4
  # modify it under the terms of the GNU Lesser General Public
@@ -65,6 +65,25 @@ module GObjectIntrospection
65
65
  not n_out_args.zero?
66
66
  end
67
67
 
68
+ def description
69
+ signature
70
+ end
71
+
72
+ def signature
73
+ argument_signatures = args.collect(&:signature).join(", ")
74
+ "#{name}(#{argument_signatures}): #{return_type.description}"
75
+ end
76
+
77
+ def inspect
78
+ super.gsub(/>\z/) do
79
+ " signature=<#{signature}>" +
80
+ " name=#{name.inspect}" +
81
+ " arguments=#{args.inspect}" +
82
+ " return_type=#{return_type.inspect}" +
83
+ " may_return_type_null=#{may_return_null?.inspect}>"
84
+ end
85
+ end
86
+
68
87
  private
69
88
  def compute_in_args
70
89
  array_length_indexes = []
@@ -0,0 +1,25 @@
1
+ # Copyright (C) 2019 Ruby-GNOME Project Team
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License as published by the Free Software Foundation; either
6
+ # version 2.1 of the License, or (at your option) any later version.
7
+ #
8
+ # This library is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ # Lesser General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU Lesser General Public
14
+ # License along with this library; if not, write to the Free Software
15
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+
17
+ module GObjectIntrospection
18
+ class FunctionInfo
19
+ def inspect
20
+ super.gsub(/>\z/) do
21
+ " unlock_gvl?=#{unlock_gvl?.inspect}>"
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2012-2019 Ruby-GNOME2 Project Team
1
+ # Copyright (C) 2012-2019 Ruby-GNOME Project Team
2
2
  #
3
3
  # This library is free software; you can redistribute it and/or
4
4
  # modify it under the terms of the GNU Lesser General Public
@@ -80,6 +80,10 @@ module GObjectIntrospection
80
80
  define_singleton_method(@base_module, name, info)
81
81
  end
82
82
 
83
+ def load_function_info_singleton_method(info, klass, method_name)
84
+ define_singleton_method(klass, method_name, info)
85
+ end
86
+
83
87
  def define_module_function(target_module, name, function_info)
84
88
  function_info.unlock_gvl = should_unlock_gvl?(function_info, target_module)
85
89
  full_method_name = "#{target_module}\#.#{name}"
@@ -125,7 +129,7 @@ module GObjectIntrospection
125
129
  end
126
130
  unless method_infos.empty?
127
131
  base_class = @base_module.const_get(base_class_name)
128
- load_method_infos(method_infos, base_class.singleton_class)
132
+ load_methods_method(method_infos, base_class.singleton_class)
129
133
  end
130
134
  else
131
135
  return if info.gtype_struct?
@@ -277,11 +281,11 @@ module GObjectIntrospection
277
281
  next if method_infos.empty?
278
282
  case method_infos.first
279
283
  when ConstructorInfo
280
- load_constructor_infos(method_infos, klass)
284
+ load_methods_constructor(method_infos, klass)
281
285
  when MethodInfo
282
- load_method_infos(method_infos, klass)
286
+ load_methods_method(method_infos, klass)
283
287
  when FunctionInfo
284
- load_function_infos(method_infos, klass)
288
+ load_methods_function(method_infos, klass)
285
289
  else
286
290
  raise "TODO: #{method_info_class}"
287
291
  end
@@ -292,16 +296,18 @@ module GObjectIntrospection
292
296
  end
293
297
  end
294
298
 
295
- def load_constructor_infos(infos, klass)
299
+ def load_methods_constructor(infos, klass)
296
300
  return if infos.empty?
297
301
 
298
302
  call_initialize_post = lambda do |object|
299
303
  initialize_post(object)
300
304
  end
305
+ invokers = []
301
306
  infos.each do |info|
302
307
  name = "initialize_#{info.name}"
303
308
  info.unlock_gvl = should_unlock_gvl?(info, klass)
304
309
  invoker = Invoker.new(info, name, "#{klass}\##{name}")
310
+ invokers << invoker
305
311
  klass.__send__(:define_method, name) do |*arguments, &block|
306
312
  invoker.invoke(self, arguments, block)
307
313
  call_initialize_post.call(self)
@@ -309,12 +315,26 @@ module GObjectIntrospection
309
315
  klass.__send__(:private, name)
310
316
  end
311
317
 
312
- find_info = lambda do |arguments|
313
- find_suitable_callable_info(infos, arguments)
318
+ initialize = lambda do |receiver, arguments, block|
319
+ invokers.each do |invoker|
320
+ catch do |tag|
321
+ invoker.invoke(receiver, arguments.dup, block, tag)
322
+ call_initialize_post.call(receiver)
323
+ return
324
+ end
325
+ end
326
+ message = "wrong arguments: "
327
+ message << "#{klass.name}#initialize("
328
+ message << arguments.collect(&:inspect).join(", ")
329
+ message << "): "
330
+ message << "available signatures"
331
+ invokers.each do |invoker|
332
+ message << ": #{invoker.signature}"
333
+ end
334
+ raise ArgumentError, message
314
335
  end
315
336
  klass.__send__(:define_method, "initialize") do |*arguments, &block|
316
- info = find_info.call(arguments, &block)
317
- __send__("initialize_#{info.name}", *arguments, &block)
337
+ initialize.call(self, arguments, block)
318
338
  end
319
339
  end
320
340
 
@@ -506,7 +526,7 @@ module GObjectIntrospection
506
526
  false
507
527
  end
508
528
 
509
- def load_method_infos(infos, klass)
529
+ def load_methods_method(infos, klass)
510
530
  infos.each do |info|
511
531
  method_name = rubyish_method_name(info)
512
532
  load_method_info(info, klass, method_name)
@@ -550,12 +570,12 @@ module GObjectIntrospection
550
570
  end
551
571
  end
552
572
 
553
- def load_function_infos(infos, klass)
573
+ def load_methods_function(infos, klass)
554
574
  infos.each do |info|
555
575
  name = rubyish_method_name(info)
556
576
  next if name == "new"
557
577
  next if name == "alloc"
558
- define_singleton_method(klass, name, info)
578
+ load_function_info_singleton_method(info, klass, name)
559
579
  end
560
580
  end
561
581
 
@@ -591,7 +611,7 @@ module GObjectIntrospection
591
611
  @prepared = false
592
612
  end
593
613
 
594
- def invoke(receiver, arguments, block)
614
+ def invoke(receiver, arguments, block, abort_tag=nil)
595
615
  ensure_prepared
596
616
 
597
617
  if receiver and @function_info_p
@@ -599,13 +619,16 @@ module GObjectIntrospection
599
619
  end
600
620
 
601
621
  arguments, block = build(receiver, arguments, block)
602
- unless valid?(arguments)
603
- if @on_invalid == :fallback
604
- return @value_on_invalid
622
+ if wrong_number_of_arguments?(arguments)
623
+ if abort_tag
624
+ throw(abort_tag)
605
625
  else
606
626
  raise ArgumentError, invalid_error_message(arguments)
607
627
  end
608
628
  end
629
+ unless normalize_arguments!(arguments, abort_tag)
630
+ return @value_on_invalid
631
+ end
609
632
 
610
633
  if block.nil? and @require_callback_p
611
634
  receiver.to_enum(@method_name, *arguments)
@@ -623,6 +646,12 @@ module GObjectIntrospection
623
646
  end
624
647
  end
625
648
 
649
+ def signature
650
+ ensure_prepared
651
+ argument_signatures = @in_args.collect(&:signature)
652
+ "(" + argument_signatures.join(", ") + ")"
653
+ end
654
+
626
655
  private
627
656
  def ensure_prepared
628
657
  return if @prepared
@@ -684,12 +713,26 @@ module GObjectIntrospection
684
713
  return arguments, block
685
714
  end
686
715
 
687
- def valid?(arguments)
688
- return false unless @valid_n_args_range.cover?(arguments.size)
689
- if @on_invalid == :fallback
690
- arguments.zip(@in_arg_types) do |argument, type|
691
- return false unless type.match?(argument)
716
+ def wrong_number_of_arguments?(arguments)
717
+ not @valid_n_args_range.cover?(arguments.size)
718
+ end
719
+
720
+ def normalize_arguments!(arguments, abort_tag)
721
+ arguments.size.times do |i|
722
+ argument = arguments[i]
723
+ next if argument.nil?
724
+ type = @in_arg_types[i]
725
+ converted_argument = type.try_convert(argument)
726
+ if converted_argument.nil?
727
+ if abort_tag
728
+ throw(abort_tag)
729
+ elsif @on_invalid == :fallback
730
+ return false
731
+ else
732
+ next
733
+ end
692
734
  end
735
+ arguments[i] = converted_argument
693
736
  end
694
737
  true
695
738
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2019 Ruby-GNOME2 Project Team
1
+ # Copyright (C) 2019 Ruby-GNOME Project Team
2
2
  #
3
3
  # This library is free software; you can redistribute it and/or
4
4
  # modify it under the terms of the GNU Lesser General Public
@@ -16,8 +16,27 @@
16
16
 
17
17
  module GObjectIntrospection
18
18
  class RegisteredTypeInfo
19
- def match?(value)
20
- value.is_a?(gtype.to_class)
19
+ def try_convert(value)
20
+ return nil if value.nil?
21
+
22
+ type = gtype
23
+ return value if type == GLib::Type::NONE
24
+
25
+ klass = type.to_class
26
+ case value
27
+ when klass
28
+ value
29
+ else
30
+ if klass.respond_to?(:try_convert)
31
+ klass.try_convert(value)
32
+ else
33
+ nil
34
+ end
35
+ end
36
+ end
37
+
38
+ def description
39
+ "#{gtype.to_class}(#{gtype.name})"
21
40
  end
22
41
  end
23
42
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2012-2019 Ruby-GNOME2 Project Team
1
+ # Copyright (C) 2012-2019 Ruby-GNOME Project Team
2
2
  #
3
3
  # This library is free software; you can redistribute it and/or
4
4
  # modify it under the terms of the GNU Lesser General Public
@@ -24,21 +24,5 @@ module GObjectIntrospection
24
24
 
25
25
  collection_reader("fields")
26
26
  collection_reader("methods")
27
-
28
- def match?(value)
29
- case gtype.name
30
- when "void"
31
- # TODO
32
- false
33
- when "CairoSurface"
34
- if Object.const_defined?(:Cairo)
35
- value.is_a?(Cairo::Surface)
36
- else
37
- false
38
- end
39
- else
40
- super
41
- end
42
- end
43
27
  end
44
28
  end
@@ -1,4 +1,4 @@
1
- # Copyright (C) 2019 Ruby-GNOME2 Project Team
1
+ # Copyright (C) 2019 Ruby-GNOME Project Team
2
2
  #
3
3
  # This library is free software; you can redistribute it and/or
4
4
  # modify it under the terms of the GNU Lesser General Public
@@ -16,39 +16,17 @@
16
16
 
17
17
  module GObjectIntrospection
18
18
  class TypeInfo
19
- def match?(value)
20
- case tag
21
- when TypeTag::BOOLEAN
22
- value == true or value == false
23
- when TypeTag::INT8,
24
- TypeTag::UINT8,
25
- TypeTag::INT16,
26
- TypeTag::UINT16,
27
- TypeTag::INT32,
28
- TypeTag::UINT32,
29
- TypeTag::INT64,
30
- TypeTag::UINT64,
31
- TypeTag::FLOAT,
32
- TypeTag::DOUBLE
33
- value.is_a?(Numeric)
34
- when TypeTag::GTYPE
35
- value.is_a?(GLib::Type)
36
- when TypeTag::UTF8
37
- value.is_a?(String)
38
- when TypeTag::FILENAME
39
- value.is_a?(String)
40
- when TypeTag::ARRAY
41
- element_type_info = get_param_type(0)
42
- value.is_a?(Array) and value.all? {|v| element_type_info.match?(v)}
43
- when TypeTag::INTERFACE
44
- interface.match?(value)
45
- when TypeTag::GLIST,
46
- TypeTag::GSLIST
47
- element_type_info = get_param_type(0)
48
- value.is_a?(Array) and value.all? {|v| element_type_info.match?(v)}
49
- else
50
- # TODO
51
- false
19
+ def try_convert(value)
20
+ tag.try_convert(self, value)
21
+ end
22
+
23
+ def description
24
+ tag.description(self)
25
+ end
26
+
27
+ def inspect
28
+ super.gsub(/>\z/) do
29
+ " tag=#{tag.inspect}>"
52
30
  end
53
31
  end
54
32
  end
@@ -0,0 +1,148 @@
1
+ # Copyright (C) 2019 Ruby-GNOME Project Team
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License as published by the Free Software Foundation; either
6
+ # version 2.1 of the License, or (at your option) any later version.
7
+ #
8
+ # This library is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ # Lesser General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU Lesser General Public
14
+ # License along with this library; if not, write to the Free Software
15
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+
17
+ module GObjectIntrospection
18
+ class TypeTag
19
+ def try_convert(type_info, value)
20
+ nil
21
+ end
22
+
23
+ def description(type_info)
24
+ nick
25
+ end
26
+
27
+ class << BOOLEAN
28
+ def try_convert(type_info, value)
29
+ case value
30
+ when true, false
31
+ value
32
+ else
33
+ nil
34
+ end
35
+ end
36
+ end
37
+
38
+ module IntegerTypeTag
39
+ def try_convert(type_info, value)
40
+ if value.is_a?(Integer)
41
+ value
42
+ elsif value.respond_to?(:to_int)
43
+ value.to_int
44
+ else
45
+ nil
46
+ end
47
+ end
48
+ end
49
+
50
+ INT8.extend(IntegerTypeTag)
51
+ UINT8.extend(IntegerTypeTag)
52
+ INT16.extend(IntegerTypeTag)
53
+ UINT16.extend(IntegerTypeTag)
54
+ INT32.extend(IntegerTypeTag)
55
+ UINT32.extend(IntegerTypeTag)
56
+ INT64.extend(IntegerTypeTag)
57
+ UINT64.extend(IntegerTypeTag)
58
+
59
+ module FloatTypeTag
60
+ def try_convert(type_info, value)
61
+ if value.is_a?(Float)
62
+ value
63
+ elsif value.respond_to?(:to_f) # TODO: Should we stop this?
64
+ value.to_f
65
+ else
66
+ nil
67
+ end
68
+ end
69
+ end
70
+
71
+ FLOAT.extend(FloatTypeTag)
72
+ DOUBLE.extend(FloatTypeTag)
73
+
74
+ class << GTYPE
75
+ def try_convert(type_info, value)
76
+ GLib::Type.try_convert(value)
77
+ end
78
+ end
79
+
80
+ class << UTF8
81
+ def try_convert(type_info, value)
82
+ case value
83
+ when String
84
+ value.encode(Encoding::UTF_8)
85
+ when Symbol
86
+ value.to_s.encode(Encoding::UTF_8)
87
+ else
88
+ if value.respond_to?(:to_str)
89
+ value.to_str.encode(Encoding::UTF_8)
90
+ else
91
+ nil
92
+ end
93
+ end
94
+ end
95
+ end
96
+
97
+ class << FILENAME
98
+ def try_convert(type_info, value)
99
+ case value
100
+ when String
101
+ value.encode(GLib::FILENAME_ENCODING)
102
+ else
103
+ if value.respond_to?(:to_path)
104
+ value.to_path.encode(GLib::FILENAME_ENCODING)
105
+ elsif value.respond_to?(:to_str)
106
+ value.to_str.encode(GLib::FILENAME_ENCODING)
107
+ else
108
+ nil
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ module ArrayTypeTag
115
+ def try_convert(type_info, value)
116
+ value = Array.try_convert(value)
117
+ return nil if value.nil?
118
+ element_type_info = type_info.get_param_type(0)
119
+ value.collect do |v|
120
+ unless v.nil?
121
+ v = element_type_info.try_convert(v)
122
+ return nil if v.nil?
123
+ end
124
+ v
125
+ end
126
+ end
127
+
128
+ def description(type_info)
129
+ element_type_info = type_info.get_param_type(0)
130
+ "#{super}(#{element_type_info.description})"
131
+ end
132
+ end
133
+
134
+ ARRAY.extend(ArrayTypeTag)
135
+ GLIST.extend(ArrayTypeTag)
136
+ GSLIST.extend(ArrayTypeTag)
137
+
138
+ class << INTERFACE
139
+ def try_convert(type_info, value)
140
+ type_info.interface.try_convert(value)
141
+ end
142
+
143
+ def description(type_info)
144
+ "#{super}(#{type_info.interface.description})"
145
+ end
146
+ end
147
+ end
148
+ end
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gobject-introspection
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.7
4
+ version: 3.3.8
5
5
  platform: ruby
6
6
  authors:
7
- - The Ruby-GNOME2 Project Team
7
+ - The Ruby-GNOME Project Team
8
+ autorequire:
8
9
  bindir: bin
9
10
  cert_chain: []
10
- date: 2019-08-16 00:00:00.000000000 Z
11
+ date: 2019-09-09 00:00:00.000000000 Z
11
12
  dependencies:
12
13
  - !ruby/object:Gem::Dependency
13
14
  name: glib2
@@ -15,14 +16,14 @@ dependencies:
15
16
  requirements:
16
17
  - - '='
17
18
  - !ruby/object:Gem::Version
18
- version: 3.3.7
19
+ version: 3.3.8
19
20
  type: :runtime
20
21
  prerelease: false
21
22
  version_requirements: !ruby/object:Gem::Requirement
22
23
  requirements:
23
24
  - - '='
24
25
  - !ruby/object:Gem::Version
25
- version: 3.3.7
26
+ version: 3.3.8
26
27
  description: Ruby/GObjectIntrospection provides bindings of GObject Introspection
27
28
  and a loader module that can generate dynamically Ruby bindings of any GObject C
28
29
  libraries
@@ -81,6 +82,7 @@ files:
81
82
  - lib/gobject-introspection/boxed-info.rb
82
83
  - lib/gobject-introspection/callable-info.rb
83
84
  - lib/gobject-introspection/collection-reader.rb
85
+ - lib/gobject-introspection/function-info.rb
84
86
  - lib/gobject-introspection/interface-info.rb
85
87
  - lib/gobject-introspection/loader.rb
86
88
  - lib/gobject-introspection/object-info.rb
@@ -88,6 +90,7 @@ files:
88
90
  - lib/gobject-introspection/repository.rb
89
91
  - lib/gobject-introspection/struct-info.rb
90
92
  - lib/gobject-introspection/type-info.rb
93
+ - lib/gobject-introspection/type-tag.rb
91
94
  - lib/gobject-introspection/union-info.rb
92
95
  - lib/gobject-introspection/version.rb
93
96
  - test/gobject-introspection-test-utils.rb