gir_ffi 0.15.0 → 0.15.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (191) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +39 -0
  3. data/README.md +10 -10
  4. data/TODO.md +14 -35
  5. data/docs/Documentation.md +6 -0
  6. data/docs/Subclassing.md +38 -0
  7. data/lib/ffi-glib.rb +8 -3
  8. data/lib/ffi-glib/byte_array.rb +2 -1
  9. data/lib/ffi-glib/container_class_methods.rb +1 -3
  10. data/lib/ffi-glib/destroy_notify.rb +2 -2
  11. data/lib/ffi-glib/hash_table.rb +1 -2
  12. data/lib/ffi-glib/list.rb +11 -5
  13. data/lib/ffi-glib/list_methods.rb +12 -0
  14. data/lib/ffi-glib/s_list.rb +10 -4
  15. data/lib/ffi-gobject.rb +1 -4
  16. data/lib/ffi-gobject/object.rb +96 -92
  17. data/lib/ffi-gobject/object_class.rb +1 -1
  18. data/lib/ffi-gobject/value.rb +108 -107
  19. data/lib/ffi-gobject_introspection/i_base_info.rb +23 -22
  20. data/lib/ffi-gobject_introspection/lib.rb +1 -1
  21. data/lib/gir_ffi-base/gobject/lib.rb +4 -0
  22. data/lib/gir_ffi/array_element_convertor.rb +1 -2
  23. data/lib/gir_ffi/boxed_base.rb +1 -5
  24. data/lib/gir_ffi/builder.rb +3 -4
  25. data/lib/gir_ffi/builder_helper.rb +10 -2
  26. data/lib/gir_ffi/builders/argument_builder.rb +2 -2
  27. data/lib/gir_ffi/builders/argument_builder_collection.rb +2 -2
  28. data/lib/gir_ffi/builders/base_argument_builder.rb +2 -2
  29. data/lib/gir_ffi/builders/base_method_builder.rb +1 -1
  30. data/lib/gir_ffi/builders/base_type_builder.rb +1 -1
  31. data/lib/gir_ffi/builders/callback_argument_builder.rb +2 -0
  32. data/lib/gir_ffi/builders/callback_builder.rb +25 -11
  33. data/lib/gir_ffi/builders/callback_return_value_builder.rb +4 -6
  34. data/lib/gir_ffi/builders/enum_builder.rb +9 -5
  35. data/lib/gir_ffi/builders/field_builder.rb +4 -3
  36. data/lib/gir_ffi/builders/function_builder.rb +1 -1
  37. data/lib/gir_ffi/builders/interface_builder.rb +3 -1
  38. data/lib/gir_ffi/builders/mapping_method_builder.rb +1 -1
  39. data/lib/gir_ffi/builders/marshalling_method_builder.rb +5 -2
  40. data/lib/gir_ffi/builders/method_template.rb +4 -4
  41. data/lib/gir_ffi/builders/module_builder.rb +4 -2
  42. data/lib/gir_ffi/builders/null_argument_builder.rb +0 -2
  43. data/lib/gir_ffi/builders/null_return_value_builder.rb +0 -2
  44. data/lib/gir_ffi/builders/object_builder.rb +18 -6
  45. data/lib/gir_ffi/builders/property_builder.rb +1 -2
  46. data/lib/gir_ffi/builders/signal_closure_builder.rb +3 -5
  47. data/lib/gir_ffi/builders/struct_builder.rb +34 -7
  48. data/lib/gir_ffi/builders/user_defined_builder.rb +8 -1
  49. data/lib/gir_ffi/builders/vfunc_argument_builder.rb +1 -1
  50. data/lib/gir_ffi/builders/vfunc_builder.rb +2 -2
  51. data/lib/gir_ffi/callback_base.rb +6 -8
  52. data/lib/gir_ffi/class_base.rb +1 -0
  53. data/lib/gir_ffi/core.rb +17 -2
  54. data/lib/gir_ffi/glib_error.rb +1 -2
  55. data/lib/gir_ffi/in_pointer.rb +7 -0
  56. data/lib/gir_ffi/object_base.rb +27 -0
  57. data/lib/gir_ffi/return_value_info.rb +1 -2
  58. data/lib/gir_ffi/struct_base.rb +1 -9
  59. data/lib/gir_ffi/struct_like_base.rb +9 -5
  60. data/lib/gir_ffi/unintrospectable_type_info.rb +5 -1
  61. data/lib/gir_ffi/union_base.rb +1 -9
  62. data/lib/gir_ffi/user_defined_object_info.rb +3 -2
  63. data/lib/gir_ffi/version.rb +1 -1
  64. data/lib/gir_ffi/vfunc_implementation.rb +1 -0
  65. metadata +103 -140
  66. data/Gemfile +0 -14
  67. data/Rakefile +0 -9
  68. data/tasks/test.rake +0 -204
  69. data/test/base_test_helper.rb +0 -70
  70. data/test/ffi-glib/array_test.rb +0 -203
  71. data/test/ffi-glib/byte_array_test.rb +0 -28
  72. data/test/ffi-glib/bytes_test.rb +0 -61
  73. data/test/ffi-glib/closure_test.rb +0 -38
  74. data/test/ffi-glib/destroy_notify_test.rb +0 -18
  75. data/test/ffi-glib/hash_table_test.rb +0 -68
  76. data/test/ffi-glib/list_test.rb +0 -86
  77. data/test/ffi-glib/main_loop_test.rb +0 -53
  78. data/test/ffi-glib/ptr_array_test.rb +0 -112
  79. data/test/ffi-glib/ruby_closure_test.rb +0 -62
  80. data/test/ffi-glib/s_list_test.rb +0 -76
  81. data/test/ffi-glib/strv_test.rb +0 -60
  82. data/test/ffi-glib/variant_test.rb +0 -12
  83. data/test/ffi-gobject/gobject_test.rb +0 -76
  84. data/test/ffi-gobject/object_class_test.rb +0 -31
  85. data/test/ffi-gobject/object_test.rb +0 -122
  86. data/test/ffi-gobject/param_spec_test.rb +0 -32
  87. data/test/ffi-gobject/value_test.rb +0 -390
  88. data/test/ffi-gobject_introspection/gobject_type_init_test.rb +0 -26
  89. data/test/ffi-gobject_introspection/i_base_info_test.rb +0 -52
  90. data/test/ffi-gobject_introspection/i_constant_info_test.rb +0 -29
  91. data/test/ffi-gobject_introspection/i_enum_info_test.rb +0 -18
  92. data/test/ffi-gobject_introspection/i_function_info_test.rb +0 -6
  93. data/test/ffi-gobject_introspection/i_interface_info_test.rb +0 -23
  94. data/test/ffi-gobject_introspection/i_object_info_test.rb +0 -49
  95. data/test/ffi-gobject_introspection/i_property_info_test.rb +0 -47
  96. data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +0 -27
  97. data/test/ffi-gobject_introspection/i_repository_test.rb +0 -81
  98. data/test/ffi-gobject_introspection/i_struct_info_test.rb +0 -23
  99. data/test/ffi-gobject_introspection/i_type_info_test.rb +0 -30
  100. data/test/ffi-gobject_introspection/i_union_info_test.rb +0 -17
  101. data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +0 -41
  102. data/test/ffi-gobject_introspection/lib_test.rb +0 -13
  103. data/test/ffi-gobject_introspection/strv_test.rb +0 -46
  104. data/test/ffi-gobject_test.rb +0 -151
  105. data/test/gir_ffi/allocation_helper_test.rb +0 -36
  106. data/test/gir_ffi/arg_helper_test.rb +0 -139
  107. data/test/gir_ffi/boolean_test.rb +0 -43
  108. data/test/gir_ffi/boxed_base_test.rb +0 -65
  109. data/test/gir_ffi/builder_test.rb +0 -322
  110. data/test/gir_ffi/builders/argument_builder_test.rb +0 -651
  111. data/test/gir_ffi/builders/base_argument_builder_test.rb +0 -6
  112. data/test/gir_ffi/builders/callback_argument_builder_test.rb +0 -126
  113. data/test/gir_ffi/builders/callback_builder_test.rb +0 -117
  114. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +0 -81
  115. data/test/gir_ffi/builders/constant_builder_test.rb +0 -6
  116. data/test/gir_ffi/builders/constructor_builder_test.rb +0 -37
  117. data/test/gir_ffi/builders/enum_builder_test.rb +0 -23
  118. data/test/gir_ffi/builders/field_builder_test.rb +0 -134
  119. data/test/gir_ffi/builders/function_builder_test.rb +0 -550
  120. data/test/gir_ffi/builders/initializer_builder_test.rb +0 -54
  121. data/test/gir_ffi/builders/interface_builder_test.rb +0 -32
  122. data/test/gir_ffi/builders/module_builder_test.rb +0 -43
  123. data/test/gir_ffi/builders/object_builder_test.rb +0 -98
  124. data/test/gir_ffi/builders/property_builder_test.rb +0 -158
  125. data/test/gir_ffi/builders/registered_type_builder_test.rb +0 -54
  126. data/test/gir_ffi/builders/return_value_builder_test.rb +0 -433
  127. data/test/gir_ffi/builders/signal_closure_builder_test.rb +0 -197
  128. data/test/gir_ffi/builders/struct_builder_test.rb +0 -93
  129. data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +0 -29
  130. data/test/gir_ffi/builders/unintrospectable_builder_test.rb +0 -73
  131. data/test/gir_ffi/builders/union_builder_test.rb +0 -28
  132. data/test/gir_ffi/builders/user_defined_builder_test.rb +0 -524
  133. data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +0 -101
  134. data/test/gir_ffi/builders/vfunc_builder_test.rb +0 -241
  135. data/test/gir_ffi/callback_base_test.rb +0 -22
  136. data/test/gir_ffi/class_base_test.rb +0 -166
  137. data/test/gir_ffi/core_test.rb +0 -98
  138. data/test/gir_ffi/enum_base_test.rb +0 -43
  139. data/test/gir_ffi/error_type_info_test.rb +0 -50
  140. data/test/gir_ffi/ffi_ext/pointer_test.rb +0 -20
  141. data/test/gir_ffi/g_type_test.rb +0 -31
  142. data/test/gir_ffi/in_pointer_test.rb +0 -203
  143. data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -26
  144. data/test/gir_ffi/info_ext/i_callback_info_test.rb +0 -21
  145. data/test/gir_ffi/info_ext/i_field_info_test.rb +0 -37
  146. data/test/gir_ffi/info_ext/i_function_info_test.rb +0 -74
  147. data/test/gir_ffi/info_ext/i_signal_info_test.rb +0 -32
  148. data/test/gir_ffi/info_ext/i_type_info_test.rb +0 -711
  149. data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +0 -19
  150. data/test/gir_ffi/info_ext/safe_constant_name_test.rb +0 -26
  151. data/test/gir_ffi/info_ext/safe_function_name_test.rb +0 -26
  152. data/test/gir_ffi/interface_base_test.rb +0 -20
  153. data/test/gir_ffi/method_stubber_test.rb +0 -65
  154. data/test/gir_ffi/object_base_test.rb +0 -64
  155. data/test/gir_ffi/object_store_test.rb +0 -41
  156. data/test/gir_ffi/receiver_argument_info_test.rb +0 -33
  157. data/test/gir_ffi/sized_array_test.rb +0 -206
  158. data/test/gir_ffi/struct_base_test.rb +0 -23
  159. data/test/gir_ffi/struct_like_base_test.rb +0 -167
  160. data/test/gir_ffi/type_map_test.rb +0 -17
  161. data/test/gir_ffi/unintrospectable_type_info_test.rb +0 -121
  162. data/test/gir_ffi/union_base_test.rb +0 -23
  163. data/test/gir_ffi/user_defined_object_info_test.rb +0 -119
  164. data/test/gir_ffi/user_defined_property_info_test.rb +0 -39
  165. data/test/gir_ffi/variable_name_generator_test.rb +0 -18
  166. data/test/gir_ffi/version_test.rb +0 -9
  167. data/test/gir_ffi/zero_terminated_test.rb +0 -108
  168. data/test/gir_ffi_test_helper.rb +0 -84
  169. data/test/integration/callback_exceptions_test.rb +0 -59
  170. data/test/integration/derived_classes_test.rb +0 -53
  171. data/test/integration/generated_everything_test.rb +0 -452
  172. data/test/integration/generated_gimarshallingtests_test.rb +0 -3096
  173. data/test/integration/generated_gio_test.rb +0 -116
  174. data/test/integration/generated_glib_test.rb +0 -10
  175. data/test/integration/generated_gobject_test.rb +0 -124
  176. data/test/integration/generated_gst_test.rb +0 -34
  177. data/test/integration/generated_gtk_source_test.rb +0 -32
  178. data/test/integration/generated_gtop_test.rb +0 -22
  179. data/test/integration/generated_pango_ft2_test.rb +0 -17
  180. data/test/integration/generated_pango_test.rb +0 -24
  181. data/test/integration/generated_regress_test.rb +0 -4038
  182. data/test/integration/generated_secret_test.rb +0 -14
  183. data/test/integration/generated_utility_test.rb +0 -174
  184. data/test/integration/generated_warnlib_test.rb +0 -43
  185. data/test/integration/method_lookup_test.rb +0 -34
  186. data/test/introspection_test_helper.rb +0 -93
  187. data/test/lib/Makefile.am +0 -110
  188. data/test/lib/autogen.sh +0 -4
  189. data/test/lib/configure.ac +0 -34
  190. data/test/lib/m4/jhflags.m4 +0 -21
  191. data/test/minitest/stats_plugin.rb +0 -30
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 99e99f94ba677daacfe98552b91f5221dea70d33dd992ac53e223e4ff05df898
4
- data.tar.gz: d83b543e6408259e2fa9067faa74c393e117e94148a7d37b7825cfe840537d8e
3
+ metadata.gz: d1bab3fa290a2ef0cb49ee4bb2b24f29f6ef5ae0bf4bbdd83ed92bc28b9aa8e0
4
+ data.tar.gz: c87ddb7f7f41a033319dafd849db129a72afb2cd6fba5e2ffc64715e1cc1e446
5
5
  SHA512:
6
- metadata.gz: '02840b2cb293bd64f478f023d7267d20f37f35c24a3a15c9569a04e8f4095cb297d5e9319bd55f1105d8d4cd961c9cab7cc2b01092b1c822f04dab7dc70e9023'
7
- data.tar.gz: 331e901b2c3c94800ad52576dd9127563ae9d41657f947be0543f7ad765e55d0bd64b2ad7642c58b6e36f243d4f5d719047de6d10d15c369cbc49e724b378bd4
6
+ metadata.gz: 7ff032878aa00fea1c6096f8b09509e6cbee0c492f864c1c258e4c1b1932f0052e2efda13517e2e381f367f91713ed0e56f42bcc302abe2de04103607beac8dd
7
+ data.tar.gz: 4f90c766aee3e8953a8f017e94284db5be4cc0cf93991795ee2e77aa66c700995ec9f3feeb336169f02b618468675a2744f5159a790819c5248422a85baa789f
@@ -1,5 +1,44 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.15.5 / 2020-11-13
4
+
5
+ * Make building and finding metaclasses via Builder.build_class work again
6
+
7
+ ## 0.15.4 / 2020-11-01
8
+
9
+ * Support disguised object class structs
10
+ * Handle the case where vfunc object arguments are null
11
+ * Bail out earlier when trying to register non-GObject class
12
+ * Small improvements
13
+ * Use `Module#prepend` for overrides
14
+ * Clean up initialization of structs, unions, and boxed types
15
+ * Make `GObject::Object#store_pointer` private like in the superclass
16
+ * Handle creating SizedArray of uint8 from a string
17
+ * Improve derived class setup
18
+ * Improve List and SList methods
19
+ * Make `ByteArray#append` return self
20
+ * Improve packaging infrastructure (thanks, utkarsh2102!)
21
+
22
+ ## 0.15.3 / 2020-06-14
23
+
24
+ * Officially support Ruby 2.7
25
+ * Officially drop support for Ruby 2.4
26
+ * Store classes representing inline callback types in the class that defines
27
+ them instead of in the main namespace, thus avoiding some potential name
28
+ clashes
29
+ * Update development dependencies
30
+ * Various code quality improvements
31
+ * Record approved licenses for dependencies
32
+
33
+ ## 0.15.2 / 2019-11-29
34
+
35
+ * Load girepository-1.0 library in a way that does not require installing a
36
+ development package.
37
+
38
+ ## 0.15.1 / 2019-10-20
39
+
40
+ * Allow access to properties for unintrospectable classes.
41
+
3
42
  ## 0.15.0 / 2019-10-19
4
43
 
5
44
  * Drop support for gobject-introspection below 1.46, the version available in
data/README.md CHANGED
@@ -12,7 +12,6 @@ Ruby bindings for GNOME using the GObject Introspection Repository.
12
12
  [![Depfu](https://badges.depfu.com/badges/d5a8e9bffd2462a7ab4921d2f7e6fc48/overview.svg)](https://depfu.com/github/mvz/gir_ffi)
13
13
  [![Build Status](https://travis-ci.org/mvz/gir_ffi.svg?branch=master)](https://travis-ci.org/mvz/gir_ffi)
14
14
  [![Code Climate](https://codeclimate.com/github/mvz/gir_ffi/badges/gpa.svg)](https://codeclimate.com/github/mvz/gir_ffi)
15
- [![Coverage Status](https://coveralls.io/repos/github/mvz/gir_ffi/badge.svg?branch=master)](https://coveralls.io/github/mvz/gir_ffi?branch=master)
16
15
  [![Documentation Status](https://inch-ci.org/github/mvz/gir_ffi.svg?branch=master)](https://inch-ci.org/github/mvz/gir_ffi/branch/master)
17
16
 
18
17
  ## Features
@@ -53,7 +52,7 @@ examples can be found in `gir_ffi-gtk` and `gir_ffi-gst`.
53
52
 
54
53
  ## Requirements
55
54
 
56
- GirFFI is supported on CRuby 2.4, 2.5 and 2.6, and JRuby 9.2.
55
+ GirFFI is supported on CRuby 2.5, 2.6 and 2.7, and JRuby 9.2.
57
56
 
58
57
  You will also need gobject-introspection installed with some
59
58
  introspection data.
@@ -65,15 +64,16 @@ libraries.
65
64
 
66
65
  GirFFI should work with gobject-introspection 1.46.0 and up.
67
66
 
68
- On Debian and Ubuntu, installing `libgirepository1.0-1` and `gir1.2-glib-2.0`
67
+ On Debian and Ubuntu, installing `libgirepository-1.0-1` and `gir1.2-glib-2.0`
69
68
  should be enough to use GirFFI in your application.
70
69
 
71
70
  To run the tests, you should additionally install `libgirepository1.0-dev`,
72
- `libcairo2-dev`, `gobject-introspection`, `gir1.2-gtop-2.0`, `gir1.2-gtk-3.0`,
73
- `gir1.2-gtksource-3.0`, `gir1.2-pango-1.0`, `gir1.2-secret-1` and
71
+ `gobject-introspection`, `libcairo2-dev`, `gir1.2-gtop-2.0`, `gir1.2-gtk-3.0`,
72
+ `gir1.2-pango-1.0`, `gir1.2-gtksource-3.0`, `gir1.2-secret-1` and
74
73
  `gir1.2-gstreamer-1.0`. This should be enough to get `rake test` working.
75
74
 
76
- GirFFI has not been tested on Mac OS X or Microsoft Windows. YMMV.
75
+ GirFFI has not been tested on Mac OS X or Microsoft Windows. YMMV. Pull
76
+ requests to support these platforms are welcome.
77
77
 
78
78
  ## Overrides
79
79
 
@@ -96,9 +96,9 @@ Please feel free to file bugs or send pull requests!
96
96
  If you just want to help out but don't know where to start, have a look at
97
97
  TODO.md, and check the notes in the code (e.g., using `dnote`).
98
98
 
99
- If you want to send pull requests or patches, please try to follow these
100
- instructions. If you get stuck, make a pull request anyway and I'll try to help
101
- out.
99
+ If you want to send pull requests or patches, try to follow the instructions
100
+ below. **If you get stuck, please make a pull request anyway and I'll try to
101
+ help out.**
102
102
 
103
103
  * Make sure `rake test` runs without reporting any failures.
104
104
  * Add tests for your feature. Otherwise, I can't see if it works or if I
@@ -119,7 +119,7 @@ The following people have contributed to GirFFI over the years:
119
119
 
120
120
  ## License
121
121
 
122
- Copyright © 2009–2018 [Matijs van Zuijlen](http://www.matijs.net)
122
+ Copyright © 2009–2020 [Matijs van Zuijlen](http://www.matijs.net)
123
123
 
124
124
  GirFFI is free software, distributed under the terms of the GNU Lesser
125
125
  General Public License, version 2.1 or later. See the file COPYING.LIB for
data/TODO.md CHANGED
@@ -26,57 +26,36 @@ These in the order they occured to me, and may therefore be fixed in any order.
26
26
 
27
27
  ## Derived types
28
28
 
29
- Derived classes can now be registered with GObject, but the way to do this is
30
- not very nice:
29
+ Derived classes are now registered like so:
31
30
 
32
31
  class Derived < Base
33
- end
32
+ install_property GObject.param_spec_int("foo", "foo bar",
33
+ "The Foo Bar Property",
34
+ 10, 20, 15, 3)
34
35
 
35
- GirFFI.define_type Derived do |info|
36
- info.install_property GObject.param_spec_int("foo", "foo bar",
37
- "The Foo Bar Property",
38
- 10, 20, 15, 3)
39
36
  # assume Base defines a virtual function called 'some_vfunc'
40
- info.install_vfunc_implementation :some_vfunc, proc {|obj|
41
- #implementation goes here
37
+ install_vfunc_implementation :some_vfunc, proc {|obj|
38
+ # implementation goes here
42
39
  }
43
- end
44
40
 
45
- or
46
-
47
- class Derived < Base
48
- def some_vfunc
49
- #implementation goes here
41
+ def other_vfunc
42
+ # implementation
50
43
  end
51
- end
52
44
 
53
- GirFFI.define_type Derived do |info|
54
- info.install_property GObject.param_spec_int("foo", "foo bar",
55
- "The Foo Bar Property",
56
- 10, 20, 15, 3)
57
- info.install_vfunc_implementation :some_vfunc
45
+ # assume Base defines a virtual function called 'other_vfunc'
46
+ install_vfunc_implementation :other_vfunc
58
47
  end
59
48
 
49
+ GirFFI.define_type Derived
50
+
51
+ Potential improvements:
60
52
 
61
- It would be good to replace this with something that's easier to use:
53
+ * Allow `define_type` to be called in the class definition
62
54
  * Perhaps auto-register types, like Gtk# does
63
55
  * Perhaps automagically find vfunc implementations, like PyGObject and
64
56
  Ruby-GNOME do
65
57
  * What about properties?
66
58
 
67
- How about:
68
-
69
- class Derived < Base
70
- include SomeGObjectInterface
71
-
72
- register_type 'Derived'
73
-
74
- install_property ...
75
- install_vfunc_implementation ...
76
- end
77
-
78
- This needs issue #63 to be resolved.
79
-
80
59
  NOTE: When adding an interface module to a derived class, its prerequisites
81
60
  should be checked.
82
61
 
@@ -0,0 +1,6 @@
1
+ # Documentation
2
+
3
+ See [the README](../README.md) for basic usage.
4
+
5
+ See [Subclassing](Subclassing.md) for details on creating your own subclasses
6
+ of GObject classes.
@@ -0,0 +1,38 @@
1
+ # Subclassing
2
+
3
+ Creating a Ruby subclass of one of the GObject classes requires following some rules.
4
+
5
+ First of all, if you override the initializer, you **must** call `super`
6
+ otherwise, the underlying GObject pointer will not be created and stored.
7
+
8
+ Second, GObject objects often have several constructors. GirFFI creates a
9
+ separate initializer for each constructor. This allows customization of the
10
+ call to super for each initializer. This means you will have to override each
11
+ initializer separately, as needed.
12
+
13
+ As an example, here is a subclass of `Regress::TestSubObj`, a class from
14
+ GObjectIntrospection's test suite, adding an extra argument to some of its
15
+ constructors.
16
+
17
+ ```
18
+ class MyObj < Regress::TestSubObj
19
+ attr_reader :animal
20
+
21
+ def initialize animal
22
+ super()
23
+ @animal = animal
24
+ end
25
+
26
+ def initialize_from_file animal, file
27
+ super(file)
28
+ @animal = animal
29
+ end
30
+ end
31
+
32
+ o1 = MyObj.new 'dog'
33
+ o1.foo # => 'dog'
34
+ o2 = MyObj.constructor
35
+ o2.foo # => nil
36
+ o3 = MyObj.new_from_file 'cat', 'my_file.txt'
37
+ o3.foo # => 'cat'
38
+ ```
@@ -5,7 +5,8 @@ raise "The module GLib was already defined elsewhere" if Kernel.const_defined? :
5
5
 
6
6
  require "gir_ffi/core"
7
7
 
8
- # Bypass check for existing modules
8
+ # Set up the GLib module, bypassing the check for existing modules. This also
9
+ # creates GLib::Lib.
9
10
  GirFFI::Builders::ModuleBuilder.new("GLib").generate
10
11
 
11
12
  require "ffi-glib/array"
@@ -28,12 +29,16 @@ module GLib
28
29
  load_class :EqualFunc
29
30
  load_class :Func
30
31
 
31
- # Module for attaching functions from the glib library.
32
- # NOTE: This module is defined by the call to GirFFI.setup above.
32
+ # Module for attaching functions from the glib library. This module is
33
+ # defined by the call to ModuleBuilder#generate above.
33
34
  module Lib
35
+ attach_function :g_slist_append, [:pointer, :pointer], :pointer
34
36
  attach_function :g_slist_prepend, [:pointer, :pointer], :pointer
37
+ attach_function :g_slist_reverse, [:pointer], :pointer
35
38
 
36
39
  attach_function :g_list_append, [:pointer, :pointer], :pointer
40
+ attach_function :g_list_prepend, [:pointer, :pointer], :pointer
41
+ attach_function :g_list_reverse, [:pointer], :pointer
37
42
 
38
43
  attach_function :g_hash_table_foreach, [:pointer, HFunc, :pointer], :void
39
44
  attach_function :g_hash_table_new, [HashFunc, EqualFunc], :pointer
@@ -12,7 +12,8 @@ module GLib
12
12
  def append(data)
13
13
  bytes = GirFFI::InPointer.from_utf8 data
14
14
  len = data.bytesize
15
- self.class.wrap Lib.g_byte_array_append(to_ptr, bytes, len)
15
+ Lib.g_byte_array_append(to_ptr, bytes, len)
16
+ self
16
17
  end
17
18
 
18
19
  def self.from(data)
@@ -11,9 +11,7 @@ module GLib
11
11
  nil
12
12
  when FFI::Pointer
13
13
  ptr
14
- when self
15
- ptr.to_ptr
16
- when GirFFI::BoxedBase
14
+ when self, GirFFI::BoxedBase
17
15
  ptr.to_ptr
18
16
  end
19
17
 
@@ -9,8 +9,8 @@ module GLib
9
9
  class DestroyNotify
10
10
  def self.default
11
11
  @default ||= from proc { |user_data|
12
- callback_key = GirFFI::ArgHelper::OBJECT_STORE.fetch(user_data)
13
- drop_callback callback_key
12
+ callback = GirFFI::ArgHelper::OBJECT_STORE.fetch(user_data)
13
+ drop_callback callback
14
14
  }
15
15
  end
16
16
  end
@@ -10,8 +10,7 @@ module GLib
10
10
  include Enumerable
11
11
  extend ContainerClassMethods
12
12
 
13
- attr_reader :key_type
14
- attr_reader :value_type
13
+ attr_reader :key_type, :value_type
15
14
 
16
15
  def initialize(key_type, value_type)
17
16
  @key_type = key_type
@@ -9,13 +9,19 @@ module GLib
9
9
  class List
10
10
  include ListMethods
11
11
 
12
- def self.from_enumerable(type, arr)
13
- arr.reduce(new(type)) { |lst, val| lst.append val }
12
+ def append(data)
13
+ store_pointer Lib.g_list_append(self, element_ptr_for(data))
14
+ self
14
15
  end
15
16
 
16
- def append(data)
17
- self.class.wrap(element_type,
18
- Lib.g_list_append(self, element_ptr_for(data)))
17
+ def prepend(data)
18
+ store_pointer Lib.g_list_prepend(self, element_ptr_for(data))
19
+ self
20
+ end
21
+
22
+ def reverse
23
+ store_pointer Lib.g_list_reverse(self)
24
+ self
19
25
  end
20
26
  end
21
27
  end
@@ -14,6 +14,7 @@ module GLib
14
14
  replace_method base, :data, :head
15
15
 
16
16
  base.extend ContainerClassMethods
17
+ base.extend ClassMethods
17
18
  end
18
19
 
19
20
  def self.replace_method(base, old, new)
@@ -36,10 +37,14 @@ module GLib
36
37
  end
37
38
 
38
39
  def tail
40
+ return nil if struct.null?
41
+
39
42
  self.class.wrap(element_type, struct[:next])
40
43
  end
41
44
 
42
45
  def head
46
+ return nil if struct.null?
47
+
43
48
  GirFFI::ArgHelper.cast_from_pointer(element_type, struct[:data])
44
49
  end
45
50
 
@@ -69,5 +74,12 @@ module GLib
69
74
  def element_ptr_for(data)
70
75
  GirFFI::InPointer.from(element_type, data)
71
76
  end
77
+
78
+ # Common class methods for List and SList
79
+ module ClassMethods
80
+ def from_enumerable(type, arr)
81
+ arr.reduce(new(type)) { |lst, val| lst.prepend val }.reverse
82
+ end
83
+ end
72
84
  end
73
85
  end
@@ -9,13 +9,19 @@ module GLib
9
9
  class SList
10
10
  include ListMethods
11
11
 
12
- def self.from_enumerable(type, arr)
13
- arr.reverse.reduce(new(type)) { |lst, val| lst.prepend val }
12
+ def append(data)
13
+ store_pointer Lib.g_slist_append(self, element_ptr_for(data))
14
+ self
14
15
  end
15
16
 
16
17
  def prepend(data)
17
- self.class.wrap(element_type,
18
- Lib.g_slist_prepend(self, element_ptr_for(data)))
18
+ store_pointer Lib.g_slist_prepend(self, element_ptr_for(data))
19
+ self
20
+ end
21
+
22
+ def reverse
23
+ store_pointer Lib.g_slist_reverse(self)
24
+ self
19
25
  end
20
26
  end
21
27
  end
@@ -86,13 +86,12 @@ module GObject
86
86
  load_class :ParamFlags
87
87
 
88
88
  # NOTE: This Lib module is set up in `gir_ffi-base/gobject/lib.rb`.
89
- module Lib
89
+ Lib.class_eval do
90
90
  attach_function :g_object_ref_sink, [:pointer], :pointer
91
91
  attach_function :g_object_ref, [:pointer], :pointer
92
92
  attach_function :g_object_unref, [:pointer], :pointer
93
93
 
94
94
  attach_function :g_value_copy, [:pointer, :pointer], :void
95
- attach_function :g_value_init, [:pointer, :size_t], :pointer
96
95
  attach_function :g_value_unset, [:pointer], :pointer
97
96
 
98
97
  attach_function :g_signal_connect_data,
@@ -106,7 +105,5 @@ module GObject
106
105
 
107
106
  attach_function :g_param_spec_ref, [:pointer], :pointer
108
107
  attach_function :g_param_spec_sink, [:pointer], :pointer
109
-
110
- attach_function :g_type_class_ref, [:size_t], :pointer
111
108
  end
112
109
  end
@@ -7,7 +7,25 @@ GObject.load_class :Object
7
7
  module GObject
8
8
  # Overrides for GObject, GObject's generic base class.
9
9
  class Object
10
- if !GLib.check_version(2, 54, 0)
10
+ if GLib.check_version(2, 54, 0)
11
+ setup_method! "new"
12
+
13
+ # Before GLib 2.54.0, use g_object_newv, which takes an array of GParameter.
14
+ def initialize_with_automatic_gtype(properties = {})
15
+ gparameters = properties.map do |name, value|
16
+ name = name.to_s
17
+ property_param_spec(name)
18
+ GObject::Parameter.new.tap do |gparam|
19
+ gparam.name = name
20
+ gparam.value = value
21
+ end
22
+ end
23
+ initialize_without_automatic_gtype(self.class.gtype, gparameters)
24
+ end
25
+
26
+ alias initialize_without_automatic_gtype initialize
27
+ alias initialize initialize_with_automatic_gtype
28
+ else
11
29
  GObject::Lib.attach_function(:g_object_new_with_properties,
12
30
  [:size_t, :uint32, :pointer, :pointer],
13
31
  :pointer)
@@ -43,24 +61,6 @@ module GObject
43
61
  obj.__send__ :initialize, *args, &block
44
62
  obj
45
63
  end
46
- else
47
- setup_method! "new"
48
-
49
- # Before GLib 2.54.0, use g_object_newv, which takes an array of GParameter.
50
- def initialize_with_automatic_gtype(properties = {})
51
- gparameters = properties.map do |name, value|
52
- name = name.to_s
53
- property_param_spec(name)
54
- GObject::Parameter.new.tap do |gparam|
55
- gparam.name = name
56
- gparam.value = value
57
- end
58
- end
59
- initialize_without_automatic_gtype(self.class.gtype, gparameters)
60
- end
61
-
62
- alias initialize_without_automatic_gtype initialize
63
- alias initialize initialize_with_automatic_gtype
64
64
  end
65
65
 
66
66
  alias base_initialize initialize
@@ -74,11 +74,6 @@ module GObject
74
74
  self
75
75
  end
76
76
 
77
- def store_pointer(ptr)
78
- super
79
- ObjectSpace.define_finalizer self, self.class.make_finalizer(ptr)
80
- end
81
-
82
77
  def self.make_finalizer(ptr)
83
78
  proc do
84
79
  rc = GObject::Object::Struct.new(ptr)[:ref_count]
@@ -100,49 +95,20 @@ module GObject
100
95
 
101
96
  setup_instance_method! "get_property"
102
97
  setup_instance_method! "set_property"
98
+ setup_instance_method! "is_floating"
99
+ alias floating? is_floating
103
100
 
104
- # @deprecated
105
- def get_property_extended(property_name)
106
- get_property(property_name)
107
- end
108
-
109
- def get_property_with_override(property_name)
110
- gvalue = gvalue_for_property property_name
111
- get_property_without_override property_name, gvalue
112
- value = gvalue.get_value
113
-
114
- type_info = get_property_type property_name
115
- value = property_value_post_conversion(value, type_info) if type_info
116
-
117
- value
118
- end
101
+ private
119
102
 
120
- # @deprecated
121
- def set_property_extended(property_name, value)
122
- set_property property_name, value
103
+ def store_pointer(ptr)
104
+ super
105
+ make_finalizer
123
106
  end
124
107
 
125
- def set_property_with_override(property_name, value)
126
- type_info = get_property_type property_name
127
- value = property_value_pre_conversion(value, type_info) if type_info
128
-
129
- gvalue = gvalue_for_property(property_name)
130
- gvalue.set_value value
131
-
132
- set_property_without_override property_name, gvalue
108
+ def make_finalizer
109
+ ObjectSpace.define_finalizer self, self.class.make_finalizer(struct.to_ptr)
133
110
  end
134
111
 
135
- alias get_property_without_override get_property
136
- alias get_property get_property_with_override
137
-
138
- alias set_property_without_override set_property
139
- alias set_property set_property_with_override
140
-
141
- setup_instance_method! "is_floating"
142
- alias floating? is_floating
143
-
144
- private
145
-
146
112
  def names_and_gvalues_for_properties(properties)
147
113
  return [], [] unless properties.any?
148
114
 
@@ -155,10 +121,6 @@ module GObject
155
121
  end.transpose
156
122
  end
157
123
 
158
- def get_property_type(property_name)
159
- self.class.find_property(property_name)&.property_type
160
- end
161
-
162
124
  def gvalue_for_property(property_name)
163
125
  gtype = property_gtype property_name
164
126
  GObject::Value.for_gtype gtype
@@ -173,36 +135,78 @@ module GObject
173
135
  raise GirFFI::PropertyNotFoundError.new(property_name, self.class)
174
136
  end
175
137
 
176
- # TODO: Move to ITypeInfo and unify with ArgHelper.cast_from_pointer
177
- def property_value_post_conversion(val, type_info)
178
- case type_info.flattened_tag
179
- when :ghash
180
- GLib::HashTable.from type_info.element_type, val
181
- when :glist
182
- GLib::List.from type_info.element_type, val
183
- when :callback
184
- GirFFI::Builder.build_class(type_info.interface).wrap val
185
- else
186
- val
138
+ # Overrides for GObject, GObject's generic base class.
139
+ module Overrides
140
+ # @deprecated
141
+ def get_property_extended(property_name)
142
+ get_property(property_name)
187
143
  end
188
- end
189
144
 
190
- # TODO: Move to ITypeInfo and unify with ArgHelper.cast_from_pointer
191
- def property_value_pre_conversion(val, type_info)
192
- case type_info.flattened_tag
193
- when :ghash
194
- GLib::HashTable.from type_info.element_type, val
195
- when :glist
196
- GLib::List.from type_info.element_type, val
197
- when :strv
198
- GLib::Strv.from val
199
- when :byte_array
200
- GLib::ByteArray.from val
201
- when :callback
202
- GirFFI::Builder.build_class(type_info.interface).from val
203
- else
204
- val
145
+ def get_property(property_name)
146
+ gvalue = gvalue_for_property property_name
147
+ super property_name, gvalue
148
+ value = gvalue.get_value
149
+
150
+ type_info = get_property_type property_name
151
+ value = property_value_post_conversion(value, type_info) if type_info
152
+
153
+ value
154
+ end
155
+
156
+ # @deprecated
157
+ def set_property_extended(property_name, value)
158
+ set_property property_name, value
159
+ end
160
+
161
+ def set_property(property_name, value)
162
+ type_info = get_property_type property_name
163
+ value = property_value_pre_conversion(value, type_info) if type_info
164
+
165
+ gvalue = gvalue_for_property(property_name)
166
+ gvalue.set_value value
167
+
168
+ super property_name, gvalue
169
+ end
170
+
171
+ private
172
+
173
+ def get_property_type(property_name)
174
+ self.class.find_property(property_name)&.property_type
175
+ end
176
+
177
+ # TODO: Move to ITypeInfo and unify with ArgHelper.cast_from_pointer
178
+ def property_value_post_conversion(val, type_info)
179
+ case type_info.flattened_tag
180
+ when :ghash
181
+ GLib::HashTable.from type_info.element_type, val
182
+ when :glist
183
+ GLib::List.from type_info.element_type, val
184
+ when :callback
185
+ GirFFI::Builder.build_class(type_info.interface).wrap val
186
+ else
187
+ val
188
+ end
189
+ end
190
+
191
+ # TODO: Move to ITypeInfo and unify with ArgHelper.cast_from_pointer
192
+ def property_value_pre_conversion(val, type_info)
193
+ case type_info.flattened_tag
194
+ when :ghash
195
+ GLib::HashTable.from type_info.element_type, val
196
+ when :glist
197
+ GLib::List.from type_info.element_type, val
198
+ when :strv
199
+ GLib::Strv.from val
200
+ when :byte_array
201
+ GLib::ByteArray.from val
202
+ when :callback
203
+ GirFFI::Builder.build_class(type_info.interface).from val
204
+ else
205
+ val
206
+ end
205
207
  end
206
208
  end
209
+
210
+ prepend Overrides
207
211
  end
208
212
  end