gir_ffi 0.0.4 → 0.0.5

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.
data/tasks/notes.rake CHANGED
@@ -1,13 +1,6 @@
1
1
  # The following code is copied straight from Bones 2.5.1
2
2
  #
3
3
 
4
- begin
5
- require 'facets/ansicode'
6
- HAVE_COLOR = true
7
- rescue LoadError
8
- HAVE_COLOR = false
9
- end
10
-
11
4
  module Bones
12
5
 
13
6
  # A helper class used to find and display any annotations in a collection of
@@ -31,19 +24,18 @@ class AnnotationExtractor
31
24
  # will search for all athe annotations and display them on standard
32
25
  # output.
33
26
  #
34
- def self.enumerate( project, tag, id = nil, opts = {} )
35
- extractor = new(project, tag, id)
27
+ def self.enumerate tag, id = nil, opts = {}
28
+ extractor = new(tag, id)
36
29
  extractor.display(extractor.find, opts)
37
30
  end
38
31
 
39
- attr_reader :tag, :project, :id
32
+ attr_reader :tag, :id
40
33
 
41
34
  # Creates a new annotation extractor configured to use the _project_ open
42
35
  # strcut and to search for the given _tag_ (which can be more than one tag
43
36
  # via a regular expression 'or' operation -- i.e. THIS|THAT|OTHER)
44
37
  #
45
- def initialize( project, tag, id)
46
- @project = project
38
+ def initialize tag, id
47
39
  @tag = tag
48
40
  @id = @id_rgxp = nil
49
41
 
@@ -60,13 +52,9 @@ class AnnotationExtractor
60
52
  results = {}
61
53
  rgxp = %r/(#{tag}):?\s*(.*?)(?:\s*(?:-?%>|\*+\/))?$/o
62
54
 
63
- extensions = project.notes.extensions.dup
64
- exclude = if project.notes.exclude.empty? then nil
65
- else Regexp.new(project.notes.exclude.join('|')) end
66
-
67
- manifest.each do |fn|
68
- next if exclude && exclude =~ fn
69
- next unless extensions.include? File.extname(fn)
55
+ files = Dir.glob("lib/**/*.rb")
56
+ files += Dir.glob("test/**/*.rb")
57
+ files.each do |fn|
70
58
  results.update(extract_annotations_from(fn, rgxp))
71
59
  end
72
60
 
@@ -85,7 +73,6 @@ class AnnotationExtractor
85
73
 
86
74
  text = m[2]
87
75
  if text =~ @id_rgxp
88
- text.gsub!(@id_rgxp) {|str| ANSICode.green(str)} if HAVE_COLOR
89
76
  list << Annotation.new(lineno, m[1], text)
90
77
  end
91
78
  list
@@ -110,25 +97,25 @@ class AnnotationExtractor
110
97
  end # class AnnotationExtractor
111
98
  end # module Bones
112
99
 
100
+ note_tags = ["TODO", "FIXME", "OPTIMIZE"]
101
+
113
102
  desc "Enumerate all annotations"
114
103
  task :notes do |t|
115
104
  id = if t.application.top_level_tasks.length > 1
116
105
  t.application.top_level_tasks.slice!(1..-1).join(' ')
117
106
  end
118
107
  Bones::AnnotationExtractor.enumerate(
119
- PROJ, PROJ.notes.tags.join('|'), id, :tag => true)
108
+ note_tags.join('|'), id, :tag => true)
120
109
  end
121
110
 
122
111
  namespace :notes do
123
- PROJ.notes.tags.each do |tag|
112
+ note_tags.each do |tag|
124
113
  desc "Enumerate all #{tag} annotations"
125
114
  task tag.downcase.to_sym do |t|
126
115
  id = if t.application.top_level_tasks.length > 1
127
116
  t.application.top_level_tasks.slice!(1..-1).join(' ')
128
117
  end
129
- Bones::AnnotationExtractor.enumerate(PROJ, tag, id)
118
+ Bones::AnnotationExtractor.enumerate(tag, id)
130
119
  end
131
120
  end
132
121
  end
133
-
134
- # EOF
data/tasks/setup.rb CHANGED
@@ -1,138 +1,6 @@
1
-
2
- require 'rake'
3
1
  require 'rake/clean'
4
- require 'fileutils'
5
- require 'ostruct'
6
- require 'find'
7
-
8
- # TODO: Clean up bones' task set to remove unwanted parts.
9
-
10
- PROJ = OpenStruct.new(
11
- # Project Defaults
12
- :name => nil,
13
- :summary => nil,
14
- :description => nil,
15
- :changes => nil,
16
- :authors => nil,
17
- :email => nil,
18
- :url => "\000",
19
- :version => ENV['VERSION'] || '0.0.0',
20
- :exclude => %w(tmp$ bak$ ~$ CVS \.svn/ \.git/ ^pkg/),
21
- :release_name => ENV['RELEASE'],
22
-
23
- # System Defaults
24
- :ruby_opts => %w(-w),
25
- :libs => [],
26
- :history_file => 'History.txt',
27
- :readme_file => 'README.txt',
28
- :ignore_file => '.bnsignore',
29
-
30
- # File Annotations
31
- :notes => OpenStruct.new(
32
- :exclude => %w(^tasks/setup\.rb$),
33
- :extensions => %w(.txt .rb .erb .rdoc) << '',
34
- :tags => %w(FIXME OPTIMIZE TODO)
35
- ),
36
-
37
- # Test::Unit
38
- :test => OpenStruct.new(
39
- :files => FileList['test/**/*_test.rb'],
40
- :file => 'test/all.rb',
41
- :opts => []
42
- )
43
- )
44
2
 
45
3
  # Load the other rake files in the tasks folder
46
4
  tasks_dir = File.expand_path(File.dirname(__FILE__))
47
- post_load_fn = File.join(tasks_dir, 'post_load.rake')
48
5
  rakefiles = Dir.glob(File.join(tasks_dir, '*.rake')).sort
49
- rakefiles.unshift(rakefiles.delete(post_load_fn)).compact!
50
6
  import(*rakefiles)
51
-
52
- # Setup the project libraries
53
- %w(lib ext).each {|dir| PROJ.libs << dir if test ?d, dir}
54
-
55
- %w(facets/ansicode).each do |lib|
56
- begin
57
- require lib
58
- Object.instance_eval {const_set "HAVE_#{lib.tr('/','_').upcase}", true}
59
- rescue LoadError
60
- Object.instance_eval {const_set "HAVE_#{lib.tr('/','_').upcase}", false}
61
- end
62
- end
63
-
64
- # Reads a file at +path+ and spits out an array of the +paragraphs+
65
- # specified.
66
- #
67
- # changes = paragraphs_of('History.txt', 0..1).join("\n\n")
68
- # summary, *description = paragraphs_of('README.txt', 3, 3..8)
69
- #
70
- def paragraphs_of( path, *paragraphs )
71
- title = String === paragraphs.first ? paragraphs.shift : nil
72
- ary = File.read(path).delete("\r").split(/\n\n+/)
73
-
74
- result = if title
75
- tmp, matching = [], false
76
- rgxp = %r/^=+\s*#{Regexp.escape(title)}/i
77
- paragraphs << (0..-1) if paragraphs.empty?
78
-
79
- ary.each do |val|
80
- if val =~ rgxp
81
- break if matching
82
- matching = true
83
- rgxp = %r/^=+/i
84
- elsif matching
85
- tmp << val
86
- end
87
- end
88
- tmp
89
- else ary end
90
-
91
- result.values_at(*paragraphs)
92
- end
93
-
94
- # Adds the given arguments to the include path if they are not already there
95
- #
96
- def ensure_in_path( *args )
97
- args.each do |path|
98
- path = File.expand_path(path)
99
- $:.unshift(path) if test(?d, path) and not $:.include?(path)
100
- end
101
- end
102
-
103
- # Scans the current working directory and creates a list of files that are
104
- # candidates to be in the manifest.
105
- #
106
- def manifest
107
- files = []
108
- exclude = PROJ.exclude.dup
109
- comment = %r/^\s*#/
110
-
111
- # process the ignore file and add the items there to the exclude list
112
- if test(?f, PROJ.ignore_file)
113
- ary = []
114
- File.readlines(PROJ.ignore_file).each do |line|
115
- next if line =~ comment
116
- line.chomp!
117
- line.strip!
118
- next if line.nil? or line.empty?
119
-
120
- glob = line =~ %r/\*\./ ? File.join('**', line) : line
121
- Dir.glob(glob).each {|fn| ary << "^#{Regexp.escape(fn)}"}
122
- end
123
- exclude.concat ary
124
- end
125
-
126
- # generate a regular expression from the exclude list
127
- exclude = Regexp.new(exclude.join('|'))
128
-
129
- Find.find '.' do |path|
130
- path.sub! %r/^(\.\/|\/)/o, ''
131
- next unless test ?f, path
132
- next if path =~ exclude
133
- files << path
134
- end
135
- files.sort!
136
- end
137
-
138
- # EOF
data/tasks/test.rake CHANGED
@@ -1,22 +1,14 @@
1
-
2
- if test(?e, PROJ.test.file) or not PROJ.test.files.to_a.empty?
3
1
  require 'rake/testtask'
4
2
 
5
3
  namespace :test do
6
4
 
7
5
  Rake::TestTask.new(:run) do |t|
8
- t.libs = PROJ.libs
9
- t.test_files = if test(?f, PROJ.test.file) then [PROJ.test.file]
10
- else PROJ.test.files end
11
- t.ruby_opts += PROJ.ruby_opts
12
- t.ruby_opts += PROJ.test.opts
6
+ t.libs = ['lib']
7
+ t.test_files = FileList['test/**/*_test.rb']
8
+ t.ruby_opts += ["-w"]
13
9
  end
14
10
 
15
- end # namespace :test
11
+ end
16
12
 
17
13
  desc 'Alias to test:run'
18
14
  task :test => 'test:run'
19
-
20
- end
21
-
22
- # EOF
@@ -16,10 +16,10 @@ class ArgHelperTest < Test::Unit::TestCase
16
16
  end
17
17
  end
18
18
 
19
- context "The string_array_to_inoutptr method" do
19
+ context "The utf8_array_to_inoutptr method" do
20
20
  context "when called with an array of strings" do
21
21
  setup do
22
- @result = GirFFI::ArgHelper.string_array_to_inoutptr ["foo", "bar", "baz"]
22
+ @result = GirFFI::ArgHelper.utf8_array_to_inoutptr ["foo", "bar", "baz"]
23
23
  end
24
24
 
25
25
  should "return a FFI::Pointer" do
@@ -34,7 +34,7 @@ class ArgHelperTest < Test::Unit::TestCase
34
34
  end
35
35
  context "when called with nil" do
36
36
  should "return nil" do
37
- assert_nil GirFFI::ArgHelper.string_array_to_inoutptr nil
37
+ assert_nil GirFFI::ArgHelper.utf8_array_to_inoutptr nil
38
38
  end
39
39
  end
40
40
  end
@@ -50,7 +50,7 @@ class ArgHelperTest < Test::Unit::TestCase
50
50
  end
51
51
  end
52
52
 
53
- context "The outptr_to_string_array method" do
53
+ context "The outptr_to_utf8_array method" do
54
54
  context "when called with a valid pointer to a string array" do
55
55
  setup do
56
56
  p = GirFFI::AllocationHelper.safe_malloc FFI.type_size(:pointer) * 2
@@ -64,7 +64,7 @@ class ArgHelperTest < Test::Unit::TestCase
64
64
 
65
65
  should "return the string array" do
66
66
  assert_equal ["one", "two"],
67
- GirFFI::ArgHelper.outptr_to_string_array(@ptr, 2)
67
+ GirFFI::ArgHelper.outptr_to_utf8_array(@ptr, 2)
68
68
  end
69
69
  end
70
70
 
@@ -83,13 +83,13 @@ class ArgHelperTest < Test::Unit::TestCase
83
83
 
84
84
  should "return render the null pointer as nil" do
85
85
  assert_equal ["one", "two", nil],
86
- GirFFI::ArgHelper.outptr_to_string_array(@ptr, 3)
86
+ GirFFI::ArgHelper.outptr_to_utf8_array(@ptr, 3)
87
87
  end
88
88
  end
89
89
 
90
90
  context "when called with nil" do
91
91
  should "return nil" do
92
- assert_nil GirFFI::ArgHelper.outptr_to_string_array(nil, 0)
92
+ assert_nil GirFFI::ArgHelper.outptr_to_utf8_array(nil, 0)
93
93
  end
94
94
  end
95
95
  end
@@ -109,4 +109,22 @@ class ArgHelperTest < Test::Unit::TestCase
109
109
  end
110
110
  end
111
111
  end
112
+
113
+ context "The pointer_outptr method" do
114
+ should "return a pointer to a null pointer" do
115
+ ptr = GirFFI::ArgHelper.pointer_outptr
116
+ pptr = ptr.read_pointer
117
+ assert pptr.null?
118
+ end
119
+ end
120
+
121
+ context "The object_pointer_to_object method" do
122
+ should "return an object of the correct class" do
123
+ GirFFI.setup :Everything
124
+ o = Everything::TestSubObj.new
125
+ o2 = GirFFI::ArgHelper.object_pointer_to_object o.to_ptr
126
+ assert_instance_of Everything::TestSubObj, o2
127
+ assert_equal o.to_ptr, o2.to_ptr
128
+ end
129
+ end
112
130
  end
data/test/builder_test.rb CHANGED
@@ -3,7 +3,6 @@ require 'gir_ffi'
3
3
 
4
4
  class BuilderTest < Test::Unit::TestCase
5
5
  context "The GirFFI::Builder module" do
6
- # TODO: Use gir's sample Everything library for testing instead.
7
6
  context "building GObject::Object" do
8
7
  setup do
9
8
  cleanup_module :GObject
@@ -12,8 +11,8 @@ class BuilderTest < Test::Unit::TestCase
12
11
 
13
12
  should "create a Lib module in the parent namespace ready to attach functions from gobject-2.0" do
14
13
  gir = GirFFI::IRepository.default
15
- expected = gir.shared_library 'GObject'
16
- assert_same_elements [*expected], GObject::Lib.ffi_libraries.map(&:name)
14
+ expected = gir.shared_library('GObject')
15
+ assert_equal [expected], GObject::Lib.ffi_libraries.map(&:name)
17
16
  end
18
17
 
19
18
  should "create an array CALLBACKS inside the GObject::Lib module" do
@@ -60,7 +59,7 @@ class BuilderTest < Test::Unit::TestCase
60
59
  end
61
60
 
62
61
  should "create a Gtk::Window#to_ptr method" do
63
- assert_contains Gtk::Window.instance_methods.map(&:to_sym), :to_ptr
62
+ assert Gtk::Window.instance_methods.map(&:to_sym).include? :to_ptr
64
63
  end
65
64
 
66
65
  should "result in Gtk::Window.new to succeed" do
@@ -78,7 +77,7 @@ class BuilderTest < Test::Unit::TestCase
78
77
  # The Gtk module has more than one library on my current machine.
79
78
  gir = GirFFI::IRepository.default
80
79
  expected = (gir.shared_library 'Gtk').split(',')
81
- assert_same_elements expected, Gtk::Lib.ffi_libraries.map(&:name)
80
+ assert_equal expected.sort, Gtk::Lib.ffi_libraries.map(&:name).sort
82
81
  end
83
82
 
84
83
  should "create an array CALLBACKS inside the Gtk::Lib module" do
@@ -102,7 +101,7 @@ class BuilderTest < Test::Unit::TestCase
102
101
  setup do
103
102
  @go = get_function_introspection_data 'Gtk', 'main'
104
103
  end
105
- # TODO: function_introspection_data should not return introspection data if not a function.
104
+
106
105
  should "have correct introspection data" do
107
106
  gir = GirFFI::IRepository.default
108
107
  gir.require "Gtk", nil
@@ -119,7 +118,7 @@ class BuilderTest < Test::Unit::TestCase
119
118
  end
120
119
 
121
120
  GirFFI::Builder.send :attach_ffi_function, libmod, @go
122
- assert_contains libmod.public_methods.map(&:to_sym), :gtk_main
121
+ assert libmod.public_methods.map(&:to_sym).include? :gtk_main
123
122
  end
124
123
  end
125
124
 
@@ -130,8 +129,6 @@ class BuilderTest < Test::Unit::TestCase
130
129
  end
131
130
 
132
131
  should "have :pointer, :pointer as types of the arguments for the attached function" do
133
- # FIXME: Ideally, we attach the function and test that it requires
134
- # the correct argument types.
135
132
  assert_equal [:pointer, :pointer], GirFFI::Builder.send(:ffi_function_argument_types, @go)
136
133
  end
137
134
 
@@ -160,7 +157,7 @@ class BuilderTest < Test::Unit::TestCase
160
157
 
161
158
  should "have the correct types of the arguments for the attached function" do
162
159
  argtypes = GirFFI::Builder.send(:ffi_function_argument_types, @go)
163
- assert_equal [:pointer, :string, GObject::Callback, :pointer, GObject::ClosureNotify, GObject::ConnectFlags],
160
+ assert_equal [:pointer, :pointer, GObject::Callback, :pointer, GObject::ClosureNotify, GObject::ConnectFlags],
164
161
  argtypes
165
162
  end
166
163
 
@@ -182,11 +179,12 @@ class BuilderTest < Test::Unit::TestCase
182
179
 
183
180
  context "building Everything::TestStructA" do
184
181
  setup do
182
+ @fieldnames = [:some_int, :some_int8, :some_double, :some_enum]
185
183
  GirFFI::Builder.build_class 'Everything', 'TestStructA'
186
184
  end
187
185
 
188
186
  should "set up the correct struct members" do
189
- assert_equal [:some_int, :some_int8, :some_double, :some_enum],
187
+ assert_equal @fieldnames,
190
188
  Everything::TestStructA::Struct.members
191
189
  end
192
190
 
@@ -199,7 +197,7 @@ class BuilderTest < Test::Unit::TestCase
199
197
  should "set up struct members with the correct types" do
200
198
  tags = [:int, :int8, :double, Everything::TestEnum]
201
199
  assert_equal tags.map {|t| FFI.find_type t},
202
- Everything::TestStructA::Struct.layout.fields.map(&:type)
200
+ @fieldnames.map {|f| Everything::TestStructA::Struct.layout[f].type}
203
201
  end
204
202
  end
205
203
 
@@ -215,7 +213,7 @@ class BuilderTest < Test::Unit::TestCase
215
213
 
216
214
  should "set up union members with the correct offset" do
217
215
  assert_equal [0, 0, 0, 0, 0],
218
- GObject::TypeCValue::Struct.layout.fields.map(&:offset)
216
+ GObject::TypeCValue::Struct.offsets.map {|o| o[1]}
219
217
  end
220
218
 
221
219
  should "set up the inner class as derived from FFI::Union" do
@@ -237,12 +235,14 @@ class BuilderTest < Test::Unit::TestCase
237
235
  GirFFI::Builder.build_class 'Everything', 'TestBoxed'
238
236
  end
239
237
 
240
- should "set up #_real_new as an alias to #new" do
241
- assert Everything::TestBoxed.respond_to? "_real_new"
238
+ should "set up #wrap" do
239
+ assert Everything::TestBoxed.respond_to? "wrap"
242
240
  end
243
- end
244
241
 
245
- # TODO: Should not allow functions to be called as methods, etc.
242
+ should "set up #allocate" do
243
+ assert Everything::TestBoxed.respond_to? "allocate"
244
+ end
245
+ end
246
246
 
247
247
  context "built Everything module" do
248
248
  setup do
@@ -252,7 +252,7 @@ class BuilderTest < Test::Unit::TestCase
252
252
 
253
253
  should "have a method_missing method" do
254
254
  ms = (Everything.public_methods - Module.public_methods).map(&:to_sym)
255
- assert_contains ms, :method_missing
255
+ assert ms.include? :method_missing
256
256
  end
257
257
 
258
258
  should "autocreate the TestObj class" do
@@ -266,8 +266,6 @@ class BuilderTest < Test::Unit::TestCase
266
266
  end
267
267
  end
268
268
 
269
- # TODO: Turn this into full test of instance method creation, including
270
- # inheritance issues.
271
269
  context "built Everything::TestObj" do
272
270
  setup do
273
271
  cleanup_module :Everything
@@ -306,7 +304,7 @@ class BuilderTest < Test::Unit::TestCase
306
304
  should "have the correct types of the arguments for the attached function" do
307
305
  info = get_method_introspection_data 'Everything', 'TestObj',
308
306
  'torture_signature_0'
309
- assert_equal [:pointer, :int, :pointer, :pointer, :string, :pointer, :uint],
307
+ assert_equal [:pointer, :int, :pointer, :pointer, :pointer, :pointer, :uint],
310
308
  GirFFI::Builder.send(:ffi_function_argument_types, info)
311
309
  end
312
310
  end
@@ -338,5 +336,22 @@ class BuilderTest < Test::Unit::TestCase
338
336
  assert_equal 0, subobj.instance_method
339
337
  end
340
338
  end
339
+
340
+ context "built Gio::ThreadedSocketService" do
341
+ setup do
342
+ cleanup_module :Gio
343
+ GirFFI::Builder.build_module 'Gio'
344
+ end
345
+
346
+ context "when parent constructor has been called" do
347
+ setup do
348
+ Gio::SocketService.new
349
+ end
350
+
351
+ should "still use its own constructor" do
352
+ assert_nothing_raised { Gio::ThreadedSocketService.new 2 }
353
+ end
354
+ end
355
+ end
341
356
  end
342
357
  end
@@ -3,13 +3,6 @@ require 'gir_ffi/class_base'
3
3
 
4
4
  class ClassBaseTest < Test::Unit::TestCase
5
5
  context "A class derived from GirFFI::Base" do
6
- setup do
7
- @klass = Class.new(GirFFI::ClassBase) do
8
- # Boilerplate to make regular #new work again.
9
- def initialize; end
10
- def self.new; self._real_new; end
11
- end
12
- end
13
6
  # TODO: See if we can test some part of Base again.
14
7
  should "pass" do
15
8
  assert true
@@ -49,6 +49,12 @@ class ClassBuilderTest < Test::Unit::TestCase
49
49
  sig = builder.find_signal 'test'
50
50
  assert_equal 'test', sig.name
51
51
  end
52
+
53
+ should 'find the signal "changed" for Gtk::Entry' do
54
+ builder = GirFFI::ClassBuilder.new 'Gtk', 'Entry'
55
+ sig = builder.find_signal 'changed'
56
+ assert_equal 'changed', sig.name
57
+ end
52
58
  end
53
59
 
54
60
  context "for GObject::TypeCValue (a union)" do