gir_ffi-pretty_printer 0.0.2 → 0.0.3
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 +4 -4
- data/README.md +5 -6
- data/Rakefile +9 -8
- data/lib/gir_ffi-pretty_printer/class_pretty_printer.rb +84 -0
- data/lib/gir_ffi-pretty_printer/pretty_printer.rb +14 -54
- data/test/gir_ffi-pretty_printer/class_pretty_printer_test.rb +92 -0
- data/test/gir_ffi-pretty_printer/pretty_printer_test.rb +3 -8
- data/test/integration/actual_glib.rb +9591 -0
- data/test/integration/actual_gobject.rb +4197 -0
- data/test/integration/expected_glib.rb +9591 -0
- data/test/integration/expected_gobject.rb +4197 -0
- data/test/integration/glib_test.rb +15 -0
- data/test/integration/gobject_test.rb +15 -0
- data/test/test_helper.rb +8 -0
- metadata +39 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b2a81f357003e2ff4209471ee6b1cc08a460919e
|
4
|
+
data.tar.gz: c7e37c2dd1a1c521247b0177098dfbfd90fd73cf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: db586351335e44d0424323ba4cb8884679cf2009017a90c9d742275a15fd0c72be2daf791a75f956cfe3b8e54817fb8d9c8737cab3f4e049ad241f054668cd2a
|
7
|
+
data.tar.gz: 7c80943037288f0dc9f819eabe84d28d9f2269a319275446c4fe3120a4529b5ccab9a0bb370d46eeaacf6add153ff55e81dd2ee91057440e98d8e524fe8b984f
|
data/README.md
CHANGED
@@ -6,18 +6,17 @@ Pretty-printer for modules generated by GirFFI.
|
|
6
6
|
|
7
7
|
* Prints generated, overridden and hand-added methods.
|
8
8
|
* Uses the `mvz-live_ast` gem to inspect runtime-generated methods.
|
9
|
-
* Needs MRI 1
|
9
|
+
* Needs MRI 2.1 or higher.
|
10
10
|
|
11
11
|
## Usage
|
12
12
|
|
13
|
-
# The pretty-printer must be required first!
|
14
13
|
require 'gir_ffi-pretty_printer'
|
15
|
-
require 'gir_ffi'
|
16
14
|
|
17
15
|
# Any version
|
18
|
-
GirFFI::PrettyPrinter.new.pretty_print 'GObject'
|
16
|
+
puts GirFFI::PrettyPrinter.new.pretty_print 'GObject'
|
17
|
+
|
19
18
|
# A specific version
|
20
|
-
GirFFI::PrettyPrinter.new.pretty_print 'Gtk', '3.0'
|
19
|
+
puts GirFFI::PrettyPrinter.new.pretty_print 'Gtk', '3.0'
|
21
20
|
|
22
21
|
## Install
|
23
22
|
|
@@ -25,7 +24,7 @@ Pretty-printer for modules generated by GirFFI.
|
|
25
24
|
|
26
25
|
## License
|
27
26
|
|
28
|
-
Copyright © 2012
|
27
|
+
Copyright © 2012–2015, [Matijs van Zuijlen](http://www.matijs.net/)
|
29
28
|
|
30
29
|
GirFFI-PrettyPrinter is free software, distributed under the terms of
|
31
30
|
the GNU Lesser General Public License, version 2.1 or later. See the
|
data/Rakefile
CHANGED
@@ -1,27 +1,28 @@
|
|
1
|
+
require 'rake/clean'
|
2
|
+
require 'bundler/gem_tasks'
|
1
3
|
require 'rake/testtask'
|
2
4
|
require 'yard'
|
3
5
|
|
4
6
|
namespace :test do
|
5
7
|
Rake::TestTask.new(:unit) do |t|
|
6
8
|
t.libs = ['lib']
|
7
|
-
t.ruby_opts += [
|
9
|
+
t.ruby_opts += ['-w -Itest']
|
8
10
|
t.test_files = FileList['test/gir_ffi-pretty_printer/*_test.rb']
|
9
11
|
t.warning = true
|
10
12
|
end
|
11
13
|
|
12
|
-
Rake::TestTask.new(:
|
14
|
+
Rake::TestTask.new(:integration) do |t|
|
13
15
|
t.libs = ['lib']
|
14
|
-
t.ruby_opts += [
|
15
|
-
t.test_files = FileList['test/
|
16
|
+
t.ruby_opts += ['-w -Itest']
|
17
|
+
t.test_files = FileList['test/integration/*_test.rb']
|
16
18
|
t.warning = true
|
17
19
|
end
|
18
20
|
|
19
|
-
task :
|
21
|
+
task all: [:unit, :integration]
|
20
22
|
end
|
21
23
|
|
22
24
|
YARD::Rake::YardocTask.new
|
23
25
|
|
24
|
-
task :
|
25
|
-
|
26
|
-
task :default => 'test'
|
26
|
+
task test: 'test:all'
|
27
27
|
|
28
|
+
task default: 'test'
|
@@ -0,0 +1,84 @@
|
|
1
|
+
class GirFFI::ClassPrettyPrinter
|
2
|
+
def initialize(klass)
|
3
|
+
@klass = klass
|
4
|
+
@printed_instance_methods = []
|
5
|
+
end
|
6
|
+
|
7
|
+
def pretty_print
|
8
|
+
arr = []
|
9
|
+
arr << "class #{@klass.name} < #{@klass.superclass.name}"
|
10
|
+
arr << pretty_print_singleton_methods.indent
|
11
|
+
arr << pretty_print_instance_methods.indent
|
12
|
+
arr << 'end'
|
13
|
+
arr.join "\n"
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def pretty_print_instance_methods
|
19
|
+
arr =
|
20
|
+
instance_method_list.map { |mth| pretty_print_method(mth) } +
|
21
|
+
instance_method_list.map { |mth| pretty_print_alias(mth) }
|
22
|
+
arr.compact.join "\n"
|
23
|
+
end
|
24
|
+
|
25
|
+
def instance_method_name_list
|
26
|
+
@klass.instance_methods(false).sort
|
27
|
+
end
|
28
|
+
|
29
|
+
def instance_method_list
|
30
|
+
@instance_method_list ||=
|
31
|
+
instance_method_name_list.map { |name| @klass.instance_method name }
|
32
|
+
end
|
33
|
+
|
34
|
+
def pretty_print_alias(meth)
|
35
|
+
if meth.name != meth.original_name
|
36
|
+
"alias_method '#{meth.name}', '#{meth.original_name}'"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def pretty_print_method(meth)
|
41
|
+
return if instance_method_printed? meth.original_name
|
42
|
+
@printed_instance_methods << meth.original_name
|
43
|
+
method_source meth
|
44
|
+
end
|
45
|
+
|
46
|
+
def method_source(meth)
|
47
|
+
if meth.arity == -1
|
48
|
+
unless @klass.setup_instance_method meth.name.to_s
|
49
|
+
@klass.setup_instance_method ''
|
50
|
+
end
|
51
|
+
|
52
|
+
meth = @klass.instance_method meth.name
|
53
|
+
end
|
54
|
+
|
55
|
+
begin
|
56
|
+
meth.to_ruby
|
57
|
+
rescue => e
|
58
|
+
warn "Printing #{@klass.name}##{meth.name} failed: #{e.message}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def instance_method_printed?(mname)
|
63
|
+
@printed_instance_methods.include? mname
|
64
|
+
end
|
65
|
+
|
66
|
+
def pretty_print_singleton_methods
|
67
|
+
arr = []
|
68
|
+
@klass.methods(false).sort.each do |mname|
|
69
|
+
meth = @klass.method mname
|
70
|
+
|
71
|
+
if meth.arity == -1
|
72
|
+
@klass.setup_method mname.to_s
|
73
|
+
meth = @klass.method mname
|
74
|
+
end
|
75
|
+
|
76
|
+
begin
|
77
|
+
arr << meth.to_ruby
|
78
|
+
rescue => e
|
79
|
+
warn "Printing #{@klass.name}.#{mname} failed: #{e.message}"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
arr.join "\n"
|
83
|
+
end
|
84
|
+
end
|
@@ -2,57 +2,15 @@ require 'live_ast/full'
|
|
2
2
|
require 'live_ast/to_ruby'
|
3
3
|
require 'gir_ffi'
|
4
4
|
require 'indentation'
|
5
|
+
require 'gir_ffi-pretty_printer/class_pretty_printer'
|
5
6
|
|
6
7
|
class GirFFI::PrettyPrinter
|
7
|
-
def pretty_print_class
|
8
|
-
|
9
|
-
arr << "class #{klass.name} < #{klass.superclass.name}"
|
10
|
-
arr << pretty_print_singleton_methods(klass).indent
|
11
|
-
arr << pretty_print_instance_methods(klass).indent
|
12
|
-
arr << "end"
|
13
|
-
arr.join "\n"
|
14
|
-
end
|
15
|
-
|
16
|
-
def pretty_print_instance_methods klass
|
17
|
-
arr = []
|
18
|
-
klass.instance_methods(false).each do |mname|
|
19
|
-
meth = klass.instance_method mname
|
20
|
-
|
21
|
-
if meth.arity == -1
|
22
|
-
klass.setup_instance_method mname.to_s
|
23
|
-
meth = klass.instance_method mname
|
24
|
-
end
|
25
|
-
|
26
|
-
begin
|
27
|
-
arr << meth.to_ruby
|
28
|
-
rescue => e
|
29
|
-
warn "Printing #{klass.name}##{mname} failed: #{e.message}"
|
30
|
-
end
|
31
|
-
end
|
32
|
-
arr.join "\n"
|
33
|
-
end
|
34
|
-
|
35
|
-
def pretty_print_singleton_methods klass
|
36
|
-
arr = []
|
37
|
-
klass.methods(false).each do |mname|
|
38
|
-
meth = klass.method mname
|
39
|
-
|
40
|
-
if meth.arity == -1
|
41
|
-
klass.setup_method mname.to_s
|
42
|
-
meth = klass.method mname
|
43
|
-
end
|
44
|
-
|
45
|
-
begin
|
46
|
-
arr << meth.to_ruby
|
47
|
-
rescue => e
|
48
|
-
warn "Printing #{klass.name}.#{mname} failed: #{e.message}"
|
49
|
-
end
|
50
|
-
end
|
51
|
-
arr.join "\n"
|
8
|
+
def pretty_print_class(klass)
|
9
|
+
GirFFI::ClassPrettyPrinter.new(klass).pretty_print
|
52
10
|
end
|
53
11
|
|
54
|
-
def pretty_print_function
|
55
|
-
str =
|
12
|
+
def pretty_print_function(modul, mname)
|
13
|
+
str = ''
|
56
14
|
begin
|
57
15
|
modul.setup_method mname.to_s unless modul.respond_to? mname
|
58
16
|
|
@@ -64,12 +22,15 @@ class GirFFI::PrettyPrinter
|
|
64
22
|
str
|
65
23
|
end
|
66
24
|
|
67
|
-
def pretty_print_constant
|
25
|
+
def pretty_print_constant(modul, const_name)
|
68
26
|
value = modul.const_get(const_name)
|
69
27
|
"#{const_name} = #{value.inspect}"
|
28
|
+
rescue => e
|
29
|
+
warn "Printing #{modul.name}.#{const_name} failed: #{e.message}"
|
30
|
+
''
|
70
31
|
end
|
71
32
|
|
72
|
-
def pretty_print
|
33
|
+
def pretty_print(module_name, version = nil)
|
73
34
|
GirFFI.setup module_name, version
|
74
35
|
arr = []
|
75
36
|
gir = GObjectIntrospection::IRepository.default
|
@@ -81,12 +42,11 @@ class GirFFI::PrettyPrinter
|
|
81
42
|
infos.each do |info|
|
82
43
|
case info.info_type
|
83
44
|
when :struct, :object
|
84
|
-
|
85
|
-
if info.name == "IConv"
|
86
|
-
warn "Skipping #{module_name}::#{info.name}"
|
87
|
-
else
|
45
|
+
begin
|
88
46
|
klass = GirFFI::Builder.build_class info
|
89
47
|
arr << pretty_print_class(klass).indent
|
48
|
+
rescue SyntaxError
|
49
|
+
warn "Skipping #{module_name}::#{info.name}: build failed"
|
90
50
|
end
|
91
51
|
when :constant
|
92
52
|
arr << pretty_print_constant(modul, info.name).indent
|
@@ -97,7 +57,7 @@ class GirFFI::PrettyPrinter
|
|
97
57
|
end
|
98
58
|
end
|
99
59
|
|
100
|
-
arr << "end"
|
60
|
+
arr << "end\n"
|
101
61
|
arr.join "\n"
|
102
62
|
end
|
103
63
|
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class SimpleClass
|
4
|
+
def bar
|
5
|
+
'hello'
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class SimpleAlias
|
10
|
+
def bar
|
11
|
+
'hello'
|
12
|
+
end
|
13
|
+
|
14
|
+
alias_method :foo, :bar
|
15
|
+
end
|
16
|
+
|
17
|
+
class ComplexAlias
|
18
|
+
def baz
|
19
|
+
'original'
|
20
|
+
end
|
21
|
+
|
22
|
+
alias_method :baz_without_qux, :baz
|
23
|
+
|
24
|
+
def baz_with_qux
|
25
|
+
baz_without_qux + '-more'
|
26
|
+
end
|
27
|
+
|
28
|
+
alias_method :baz, :baz_with_qux
|
29
|
+
end
|
30
|
+
|
31
|
+
describe GirFFI::ClassPrettyPrinter do
|
32
|
+
let(:instance) { GirFFI::ClassPrettyPrinter.new klass }
|
33
|
+
|
34
|
+
describe '#pretty_print' do
|
35
|
+
describe 'for a class with a simple method definition' do
|
36
|
+
let(:klass) { SimpleClass }
|
37
|
+
it 'pretty-prints the class' do
|
38
|
+
expected = <<-END.reset_indentation.chomp
|
39
|
+
class SimpleClass < Object
|
40
|
+
|
41
|
+
def bar
|
42
|
+
"hello"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
END
|
46
|
+
|
47
|
+
result = instance.pretty_print
|
48
|
+
result.must_equal expected
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe 'for a class with a simple aliased method' do
|
53
|
+
let(:klass) { SimpleAlias }
|
54
|
+
it 'pretty-prints the class' do
|
55
|
+
expected = <<-END.reset_indentation.chomp
|
56
|
+
class SimpleAlias < Object
|
57
|
+
|
58
|
+
def bar
|
59
|
+
"hello"
|
60
|
+
end
|
61
|
+
alias_method 'foo', 'bar'
|
62
|
+
end
|
63
|
+
END
|
64
|
+
|
65
|
+
result = instance.pretty_print
|
66
|
+
result.must_equal expected
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe 'for a class with an alias chain' do
|
71
|
+
let(:klass) { ComplexAlias }
|
72
|
+
it 'pretty-prints the class' do
|
73
|
+
expected = <<-END.reset_indentation.chomp
|
74
|
+
class ComplexAlias < Object
|
75
|
+
|
76
|
+
def baz_with_qux
|
77
|
+
(baz_without_qux + "-more")
|
78
|
+
end
|
79
|
+
def baz
|
80
|
+
"original"
|
81
|
+
end
|
82
|
+
alias_method 'baz', 'baz_with_qux'
|
83
|
+
alias_method 'baz_without_qux', 'baz'
|
84
|
+
end
|
85
|
+
END
|
86
|
+
|
87
|
+
result = instance.pretty_print
|
88
|
+
result.must_equal expected
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -1,15 +1,10 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
describe GirFFI::PrettyPrinter do
|
3
|
-
describe
|
4
|
-
it "takes no arguments" do
|
5
|
-
GirFFI::PrettyPrinter.new
|
6
|
-
end
|
7
|
-
end
|
8
|
-
|
9
|
-
describe "#pretty_print" do
|
3
|
+
describe '#pretty_print' do
|
10
4
|
let(:instance) { GirFFI::PrettyPrinter.new }
|
11
|
-
it
|
5
|
+
it 'pretty-prints a module without version specification' do
|
12
6
|
instance.pretty_print 'GObject'
|
7
|
+
pass
|
13
8
|
end
|
14
9
|
end
|
15
10
|
end
|