gir_ffi 0.0.4 → 0.0.5

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