looksee 3.0.0-universal-java-1.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.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +66 -0
  3. data/LICENSE +22 -0
  4. data/README.markdown +175 -0
  5. data/Rakefile +13 -0
  6. data/ext/extconf.rb +19 -0
  7. data/ext/mri/1.9.2/debug.h +36 -0
  8. data/ext/mri/1.9.2/id.h +170 -0
  9. data/ext/mri/1.9.2/method.h +103 -0
  10. data/ext/mri/1.9.2/node.h +483 -0
  11. data/ext/mri/1.9.2/thread_pthread.h +27 -0
  12. data/ext/mri/1.9.2/vm_core.h +707 -0
  13. data/ext/mri/1.9.2/vm_opts.h +51 -0
  14. data/ext/mri/1.9.3/atomic.h +56 -0
  15. data/ext/mri/1.9.3/debug.h +41 -0
  16. data/ext/mri/1.9.3/id.h +175 -0
  17. data/ext/mri/1.9.3/internal.h +227 -0
  18. data/ext/mri/1.9.3/internal_falcon.h +248 -0
  19. data/ext/mri/1.9.3/method.h +105 -0
  20. data/ext/mri/1.9.3/node.h +503 -0
  21. data/ext/mri/1.9.3/thread_pthread.h +51 -0
  22. data/ext/mri/1.9.3/vm_core.h +755 -0
  23. data/ext/mri/1.9.3/vm_opts.h +51 -0
  24. data/ext/mri/2.0.0/internal.h +378 -0
  25. data/ext/mri/2.0.0/method.h +138 -0
  26. data/ext/mri/2.1.0/internal.h +889 -0
  27. data/ext/mri/2.1.0/method.h +142 -0
  28. data/ext/mri/2.2.0/internal.h +1182 -0
  29. data/ext/mri/2.2.0/method.h +141 -0
  30. data/ext/mri/env-1.8.h +27 -0
  31. data/ext/mri/eval_c-1.8.h +27 -0
  32. data/ext/mri/mri.c +309 -0
  33. data/ext/mri/node-1.9.h +35 -0
  34. data/ext/rbx/rbx.c +13 -0
  35. data/lib/looksee.rb +2 -0
  36. data/lib/looksee/JRuby.jar +0 -0
  37. data/lib/looksee/adapter.rb +8 -0
  38. data/lib/looksee/adapter/base.rb +105 -0
  39. data/lib/looksee/adapter/rubinius.rb +84 -0
  40. data/lib/looksee/clean.rb +169 -0
  41. data/lib/looksee/columnizer.rb +73 -0
  42. data/lib/looksee/core_ext.rb +48 -0
  43. data/lib/looksee/editor.rb +64 -0
  44. data/lib/looksee/help.rb +54 -0
  45. data/lib/looksee/inspector.rb +70 -0
  46. data/lib/looksee/lookup_path.rb +95 -0
  47. data/lib/looksee/rbx.bundle +0 -0
  48. data/lib/looksee/version.rb +11 -0
  49. data/spec/looksee/adapter_spec.rb +588 -0
  50. data/spec/looksee/clean_spec.rb +41 -0
  51. data/spec/looksee/columnizer_spec.rb +52 -0
  52. data/spec/looksee/core_ext_spec.rb +17 -0
  53. data/spec/looksee/editor_spec.rb +107 -0
  54. data/spec/looksee/inspector_spec.rb +179 -0
  55. data/spec/looksee/lookup_path_spec.rb +87 -0
  56. data/spec/spec_helper.rb +29 -0
  57. data/spec/support/core_ext.rb +25 -0
  58. data/spec/support/temporary_classes.rb +78 -0
  59. data/spec/support/test_adapter.rb +83 -0
  60. metadata +116 -0
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+
3
+ describe Looksee do
4
+ describe ".[]" do
5
+ before do
6
+ @object = Object.new
7
+ Looksee.stub(default_specifiers: [:public, :overridden])
8
+ end
9
+
10
+ it "should return an Inspector for the object's lookup path" do
11
+ result = Looksee[@object]
12
+ result.should be_a(Looksee::Inspector)
13
+ result.lookup_path.object.should.equal?(@object)
14
+ end
15
+
16
+ it "should use Looksee.default_specifiers if no args are given" do
17
+ Looksee[@object].visibilities.should == Set[:public, :overridden]
18
+ end
19
+
20
+ it "should set visibilities from the given symbols" do
21
+ inspector = Looksee[@object, :private]
22
+ inspector.visibilities.should == Set[:public, :overridden, :private]
23
+ end
24
+
25
+ it "should unset visibilities from the given 'no' symbols" do
26
+ inspector = Looksee[@object, :nooverridden]
27
+ inspector.visibilities.should == Set[:public]
28
+ end
29
+
30
+ it "should set filters from the given strings and regexp" do
31
+ inspector = Looksee[@object, 'aa', /bb/]
32
+ inspector.filters.should == Set['aa', /bb/]
33
+ end
34
+
35
+ it "should raise an ArgumentError if an invalid argument is given" do
36
+ lambda do
37
+ Looksee[@object, Object.new]
38
+ end.should raise_error(ArgumentError)
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ describe Looksee::Columnizer do
4
+ describe ".columnize" do
5
+ def columnize(strings, width)
6
+ Looksee::Columnizer.columnize(strings, width)
7
+ end
8
+
9
+ it "should an empty string if there are no strings to display" do
10
+ columnize([], 5).should == ''
11
+ end
12
+
13
+ it "should render all strings on one line separated and indented by two spaces if they fit" do
14
+ columnize(['one', 'two'], 10).should == " one two\n"
15
+ end
16
+
17
+ it "should not wrap a string if it longer than the width" do
18
+ columnize(['looooooong'], 5).should == " looooooong\n"
19
+ end
20
+
21
+ it "should render a string on the next line if there's not enough room" do
22
+ columnize(['a', 'looooooong'], 5).should == " a \n looooooong\n"
23
+ end
24
+
25
+ it "should present 12 3-char strings 4 per line, sorted vertically, when the width is 20" do
26
+ strings = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff',
27
+ 'ggg', 'hhh', 'iii', 'jjj', 'kkk', 'lll']
28
+ columnize(strings, 20).should == <<-EOS.gsub(/^ *\|/, '')
29
+ | aaa ddd ggg jjj
30
+ | bbb eee hhh kkk
31
+ | ccc fff iii lll
32
+ EOS
33
+ end
34
+
35
+ it "should leave the last column short if there aren't enough strings to fill it" do
36
+ strings = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff',
37
+ 'ggg', 'hhh', 'iii', 'jjj', 'kkk']
38
+ columnize(strings, 20).should == <<-EOS.gsub(/^ *\|/, '')
39
+ | aaa ddd ggg jjj
40
+ | bbb eee hhh kkk
41
+ | ccc fff iii
42
+ EOS
43
+ end
44
+
45
+ it "should pad out strings that are shorter than their column" do
46
+ columnize(['aa', 'b', 'c', 'dd'], 8).should == <<-EOS.gsub(/^ *\|/, '')
47
+ | aa c
48
+ | b dd
49
+ EOS
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe Looksee::ObjectMixin do
4
+ describe "#ls" do
5
+ before do
6
+ @object = Object.new
7
+ Looksee.stub(:default_specifiers).and_return([])
8
+ end
9
+
10
+ it "should return an Inspector for the object's lookup path using the given arguments" do
11
+ result = @object.ls(:private)
12
+ result.should be_a(Looksee::Inspector)
13
+ result.lookup_path.object.should.equal?(@object)
14
+ result.visibilities.should == Set[:private]
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+
3
+ describe Looksee::Editor do
4
+ describe "#command_for" do
5
+ def editor_command(command)
6
+ Looksee::Editor.new(command).command_for('FILE', 'LINE')
7
+ end
8
+
9
+ it "should infer the file and line arguments for 'vi'" do
10
+ editor_command('vi').should == ['vi', '+LINE', 'FILE']
11
+ end
12
+
13
+ it "should infer the file and line arguments for 'vim'" do
14
+ editor_command('vim').should == ['vim', '+LINE', 'FILE']
15
+ end
16
+
17
+ it "should infer the file and line arguments for 'gvim'" do
18
+ editor_command('gvim').should == ['gvim', '+LINE', 'FILE']
19
+ end
20
+
21
+ it "should infer the file and line arguments for 'emacs'" do
22
+ editor_command('emacs').should == ['emacs', '+LINE', 'FILE']
23
+ end
24
+
25
+ it "should infer the file and line arguments for 'xemacs'" do
26
+ editor_command('xemacs').should == ['xemacs', '+LINE', 'FILE']
27
+ end
28
+
29
+ it "should infer the file and line arguments for 'aquamacs'" do
30
+ editor_command('aquamacs').should == ['aquamacs', '+LINE', 'FILE']
31
+ end
32
+
33
+ it "should infer the file and line arguments for 'pico'" do
34
+ editor_command('pico').should == ['pico', '+LINE', 'FILE']
35
+ end
36
+
37
+ it "should infer the file and line arguments for 'nano'" do
38
+ editor_command('nano').should == ['nano', '+LINE', 'FILE']
39
+ end
40
+
41
+ it "should infer the file and line arguments for 'mate'" do
42
+ editor_command('mate').should == ['mate', '-lLINE', 'FILE']
43
+ end
44
+
45
+ it "should support escaped '%'-signs" do
46
+ editor_command('%% %f %l').should == ['%', 'FILE', 'LINE']
47
+ end
48
+
49
+ it "should not infer file and line arguments for unknown editors" do
50
+ editor_command('wtfbbq').should == ['wtfbbq']
51
+ end
52
+ end
53
+
54
+ describe "#edit" do
55
+ let(:tmp) { "#{ROOT}/spec/tmp" }
56
+ let(:editor_path) { "#{tmp}/edit" }
57
+ let(:editor_output) { "#{tmp}/edit.out" }
58
+ let(:editor) { Looksee::Editor.new("#{editor_path} %f %l") }
59
+ let(:editor_invocation) { File.exist?(editor_output) ? File.read(editor_output) : nil }
60
+ let(:source_location) { ["#{tmp}/c.rb", 2] }
61
+ let(:object) { C.new }
62
+
63
+ before do
64
+ FileUtils.mkdir_p tmp
65
+ set_up_editor
66
+
67
+ file, line = *source_location
68
+ open(file, 'w') { |f| f.puts "class C\n def f\n end\nend" }
69
+ load file
70
+ end
71
+
72
+ after do
73
+ Object.send(:remove_const, :C)
74
+ FileUtils.rm_rf tmp
75
+ end
76
+
77
+ def set_up_editor
78
+ open(editor_path, 'w') { |f| f.puts <<-EOS.demargin }
79
+ |#!/bin/sh
80
+ |echo $# $1 $2 > "#{editor_output}"
81
+ EOS
82
+ File.chmod 0755, editor_path
83
+ end
84
+
85
+ it "should run the editor on the method's source location if available" do
86
+ editor.edit(object, :f)
87
+ editor_invocation.should == "2 #{source_location.join(' ')}\n"
88
+ end
89
+
90
+ it "should raise NoMethodError and not run the editor if the method does not exist" do
91
+ expect { editor.edit(object, :x) }.to raise_error(Looksee::NoMethodError)
92
+ editor_invocation.should be_nil
93
+ end
94
+
95
+ it "should raise NoSourceFileError and not run the editor if the source file does not exist" do
96
+ FileUtils.rm_f source_location.first
97
+ expect { editor.edit(object, :f) }.to raise_error(Looksee::NoSourceFileError)
98
+ editor_invocation.should be_nil
99
+ end
100
+
101
+ it "should raise NoSourceLocationError and not run the editor if no source location is available" do
102
+ Looksee.adapter.stub(source_location: nil)
103
+ expect { editor.edit(object, :f) }.to raise_error(Looksee::NoSourceLocationError)
104
+ editor_invocation.should be_nil
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,179 @@
1
+ require 'spec_helper'
2
+
3
+ describe Looksee::Inspector do
4
+ include TemporaryClasses
5
+ use_test_adapter
6
+
7
+ describe "#inspect" do
8
+ before do
9
+ Looksee.stub(:default_lookup_path_options).and_return({})
10
+ Looksee.stub(:styles).and_return(Hash.new{'%s'})
11
+
12
+ @object = Object.new
13
+ temporary_module :M
14
+ temporary_class(:C) { include M }
15
+ Looksee.adapter.ancestors[@object] = [C, M]
16
+ end
17
+
18
+ describe "output width" do
19
+ before do
20
+ Looksee.adapter.public_methods[C] = ['aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'gg', 'hh', 'ii', 'jj']
21
+ Looksee.adapter.public_methods[M] = ['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff', 'ggg', 'hhh']
22
+ @lookup_path = Looksee::LookupPath.new(@object)
23
+ end
24
+
25
+ it "should columnize output to the given width, if any" do
26
+ inspector = Looksee::Inspector.new(@lookup_path, :visibilities => [:public], :width => 20)
27
+ inspector.inspect.should == <<-EOS.demargin.chomp
28
+ |M
29
+ | aaa ccc eee ggg
30
+ | bbb ddd fff hhh
31
+ |C
32
+ | aa cc ee gg ii
33
+ | bb dd ff hh jj
34
+ EOS
35
+ end
36
+
37
+ it "should columnize output to the current terminal width, if detectable" do
38
+ original_columns = ENV['COLUMNS']
39
+ ENV['COLUMNS'] = '20'
40
+ begin
41
+ inspector = Looksee::Inspector.new(@lookup_path, :visibilities => [:public])
42
+ inspector.inspect.should == <<-EOS.demargin.chomp
43
+ |M
44
+ | aaa ccc eee ggg
45
+ | bbb ddd fff hhh
46
+ |C
47
+ | aa cc ee gg ii
48
+ | bb dd ff hh jj
49
+ EOS
50
+ ensure
51
+ ENV['COLUMNS'] = original_columns
52
+ end
53
+ end
54
+
55
+ it "should columnize output to the configured default otherwise" do
56
+ Looksee.stub(:default_width).and_return(20)
57
+ inspector = Looksee::Inspector.new(@lookup_path, :visibilities => [:public])
58
+ inspector.inspect.should == <<-EOS.demargin.chomp
59
+ |M
60
+ | aaa ccc eee ggg
61
+ | bbb ddd fff hhh
62
+ |C
63
+ | aa cc ee gg ii
64
+ | bb dd ff hh jj
65
+ EOS
66
+ end
67
+ end
68
+
69
+ it "should not show any blank lines if a module has no methods" do
70
+ Looksee.adapter.public_methods[M] = [:public1, :public2]
71
+ lookup_path = Looksee::LookupPath.new(@object)
72
+ inspector = Looksee::Inspector.new(lookup_path, :visibilities => [:public])
73
+ inspector.inspect.should == <<-EOS.demargin.chomp
74
+ |M
75
+ | public1 public2
76
+ |C
77
+ EOS
78
+ end
79
+
80
+ it "should show singleton classes as class names in brackets" do
81
+ Looksee.adapter.ancestors[C] = [C.singleton_class]
82
+ Looksee.adapter.public_methods[C.singleton_class] = [:public1, :public2]
83
+ lookup_path = Looksee::LookupPath.new(C)
84
+ inspector = Looksee::Inspector.new(lookup_path, :visibilities => [:public])
85
+ inspector.inspect.should == <<-EOS.demargin.chomp
86
+ |[C]
87
+ | public1 public2
88
+ EOS
89
+ end
90
+
91
+ it "should handle singleton classes of singleton classes correctly" do
92
+ Looksee.adapter.ancestors[C.singleton_class] = [C.singleton_class.singleton_class]
93
+ Looksee.adapter.public_methods[C.singleton_class.singleton_class] = [:public1, :public2]
94
+ lookup_path = Looksee::LookupPath.new(C.singleton_class)
95
+ inspector = Looksee::Inspector.new(lookup_path, :visibilities => [:public])
96
+ inspector.inspect.should == <<-EOS.demargin.chomp
97
+ |[[C]]
98
+ | public1 public2
99
+ EOS
100
+ end
101
+
102
+ it "should only show methods of the selected visibilities" do
103
+ temporary_class :E
104
+ Looksee.adapter.set_methods(E, [:public], [:protected], [:private], [:undefined])
105
+ Looksee.adapter.ancestors[@object] = [E]
106
+ lookup_path = Looksee::LookupPath.new(@object)
107
+ inspector = Looksee::Inspector.new(lookup_path, :visibilities => [:protected])
108
+ inspector.inspect.should == <<-EOS.demargin.chomp
109
+ |E
110
+ | protected
111
+ EOS
112
+ end
113
+
114
+ it "should show overridden methods if selected" do
115
+ Looksee.adapter.set_methods(C, [:public], [:protected], [:private], [:undefined])
116
+ Looksee.adapter.set_methods(M, [:public], [:protected], [:private], [:undefined])
117
+ lookup_path = Looksee::LookupPath.new(@object)
118
+ inspector = Looksee::Inspector.new(lookup_path, :visibilities => [:public, :overridden])
119
+ inspector.inspect.should == <<-EOS.demargin.chomp
120
+ |M
121
+ | public
122
+ |C
123
+ | public
124
+ EOS
125
+ end
126
+
127
+ it "should not show overridden methods if not selected" do
128
+ Looksee.adapter.set_methods(C, [:public], [:protected], [:private], [:undefined])
129
+ Looksee.adapter.set_methods(M, [:public], [:protected], [:private], [:undefined])
130
+ lookup_path = Looksee::LookupPath.new(@object)
131
+ inspector = Looksee::Inspector.new(lookup_path, :visibilities => [:public, :nooverridden])
132
+ inspector.inspect.should == <<-EOS.demargin.chomp
133
+ |M
134
+ |C
135
+ | public
136
+ EOS
137
+ end
138
+
139
+ it "should only show methods that match the given filters, if any are given" do
140
+ Looksee.adapter.public_methods[C] = [:ab, :ax, :ba, :xa]
141
+ Looksee.adapter.public_methods[M] = [:ab, :ax, :ba, :xa]
142
+ lookup_path = Looksee::LookupPath.new(@object)
143
+ inspector = Looksee::Inspector.new(lookup_path, :visibilities => [:public, :overridden], :filters => [/^a/, 'b'])
144
+ inspector.inspect.should == <<-EOS.demargin.chomp
145
+ |M
146
+ | ab ax ba
147
+ |C
148
+ | ab ax ba
149
+ EOS
150
+ end
151
+ end
152
+
153
+ describe ".styles" do
154
+ before do
155
+ styles = {
156
+ :module => "`%s'",
157
+ :public => "{%s}",
158
+ :protected => "[%s]",
159
+ :private => "<%s>",
160
+ :undefined => "~%s~",
161
+ :overridden => "(%s)",
162
+ }
163
+ Looksee.stub(:styles).and_return(styles)
164
+ end
165
+
166
+ it "should delimit each word with the configured delimiters" do
167
+ temporary_class :C
168
+ c = C.new
169
+ Looksee.adapter.ancestors[c] = [C]
170
+ Looksee.adapter.set_methods(C, [:public], [:protected], [:private], [:undefined])
171
+ lookup_path = Looksee::LookupPath.new(c)
172
+ inspector = Looksee::Inspector.new(lookup_path, :visibilities => [:public, :protected, :private, :undefined, :overridden])
173
+ inspector.inspect.should == <<-EOS.demargin.chomp
174
+ |\`C\'
175
+ | <private> [protected] {public} ~undefined~
176
+ EOS
177
+ end
178
+ end
179
+ end
@@ -0,0 +1,87 @@
1
+ require 'spec_helper'
2
+
3
+ describe Looksee::LookupPath do
4
+ include TemporaryClasses
5
+
6
+ describe "#entries" do
7
+ use_test_adapter
8
+
9
+ before do
10
+ temporary_module :M
11
+ temporary_class(:C) { include M }
12
+ @object = Object.new
13
+ Looksee.adapter.ancestors[@object] = [C, M]
14
+ Looksee.adapter.set_methods(M, [:public1, :public2], [:protected1, :protected2], [:private1, :private2], [:undefined1, :undefined2])
15
+ Looksee.adapter.set_methods(C, [:public1, :public2], [:protected1, :protected2], [:private1, :private2], [:undefined1, :undefined2])
16
+ @lookup_path = Looksee::LookupPath.new(@object)
17
+ end
18
+
19
+ it "should contain an entry for each module in the object's lookup path" do
20
+ @lookup_path.entries.map{|entry| entry.module}.should == [C, M]
21
+ end
22
+
23
+ it "should include methods of all visibilities, including overridden ones" do
24
+ @lookup_path.entries[0].methods.should == {
25
+ 'public1' => :public , 'public2' => :public,
26
+ 'protected1' => :protected, 'protected2' => :protected,
27
+ 'private1' => :private , 'private2' => :private,
28
+ 'undefined1' => :undefined, 'undefined2' => :undefined,
29
+ }
30
+ @lookup_path.entries[1].methods.should == {
31
+ 'public1' => :public , 'public2' => :public,
32
+ 'protected1' => :protected, 'protected2' => :protected,
33
+ 'private1' => :private , 'private2' => :private,
34
+ 'undefined1' => :undefined, 'undefined2' => :undefined,
35
+ }
36
+ end
37
+
38
+ it "should know which methods have been overridden" do
39
+ @lookup_path.entries[0].overridden?('public1').should == false
40
+ @lookup_path.entries[1].overridden?('public1').should == true
41
+ end
42
+ end
43
+
44
+ describe "#find" do
45
+ before do
46
+ temporary_module(:M) { def f; end }
47
+ temporary_class(:C) { include M; def f; end }
48
+ @object = C.new
49
+ end
50
+
51
+ it "should return the unoverridden UnboundMethod for the given method name" do
52
+ lookup_path = Looksee::LookupPath.new(@object)
53
+ method = lookup_path.find('f')
54
+ method.owner.should == C
55
+ method.name.should == (RUBY_VERSION < "1.9.0" ? 'f' : :f)
56
+ end
57
+
58
+ it "should find methods in included modules" do
59
+ M.class_eval { def g; end }
60
+ lookup_path = Looksee::LookupPath.new(@object)
61
+ method = lookup_path.find('g')
62
+ method.owner.should == M
63
+ method.name.should == (RUBY_VERSION < "1.9.0" ? 'g' : :g)
64
+ end
65
+
66
+ it "should return nil if the method does not exist" do
67
+ lookup_path = Looksee::LookupPath.new(@object)
68
+ lookup_path.find('g').should be_nil
69
+ end
70
+
71
+ it "should return nil if the method has been undefined" do
72
+ C.send(:undef_method, :f)
73
+ lookup_path = Looksee::LookupPath.new(@object)
74
+ lookup_path.find('f').should be_nil
75
+ end
76
+ end
77
+
78
+ describe Looksee::LookupPath::Entry do
79
+ it "should iterate over methods in alphabetical order" do
80
+ temporary_class(:C)
81
+ @object = C.new
82
+ Looksee.adapter.stub(internal_public_instance_methods: [:a, :c, :b])
83
+ @lookup_path = Looksee::LookupPath.new(@object)
84
+ @lookup_path.entries.first.map{|name, visibility| name}.should == ['a', 'b', 'c']
85
+ end
86
+ end
87
+ end