vimmate 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. data/.autotest +10 -0
  2. data/CHANGELOG +108 -0
  3. data/COPYING +20 -0
  4. data/README +221 -0
  5. data/Rakefile +31 -0
  6. data/TODO +21 -0
  7. data/bin/vimmate +105 -0
  8. data/config/environment.rb +35 -0
  9. data/controllers/file_filter_controller.rb +101 -0
  10. data/controllers/file_popup_menu_controller.rb +40 -0
  11. data/controllers/vim_controller.rb +28 -0
  12. data/controllers/vim_mate_controller.rb +76 -0
  13. data/images/file.png +0 -0
  14. data/images/file_green.png +0 -0
  15. data/images/file_orange.png +0 -0
  16. data/images/file_red.png +0 -0
  17. data/images/folder.png +0 -0
  18. data/images/folder_green.png +0 -0
  19. data/images/folder_orange.png +0 -0
  20. data/images/folder_red.png +0 -0
  21. data/images/processing.png +0 -0
  22. data/images/svn_added.png +0 -0
  23. data/images/svn_conflict.png +0 -0
  24. data/images/svn_deleted.png +0 -0
  25. data/images/svn_locked.png +0 -0
  26. data/images/svn_modified.png +0 -0
  27. data/images/svn_normal.png +0 -0
  28. data/images/svn_readonly.png +0 -0
  29. data/images/vimmate16.png +0 -0
  30. data/images/vimmate32.png +0 -0
  31. data/images/vimmate48.png +0 -0
  32. data/lib/active_window/active_column.rb +218 -0
  33. data/lib/active_window/active_tree_store/columns.rb +88 -0
  34. data/lib/active_window/active_tree_store/extentions.rb +81 -0
  35. data/lib/active_window/active_tree_store/index.rb +53 -0
  36. data/lib/active_window/active_tree_store.rb +26 -0
  37. data/lib/active_window/application.rb +137 -0
  38. data/lib/active_window/controller.rb +58 -0
  39. data/lib/active_window/dot_file.rb +29 -0
  40. data/lib/active_window/filtered_active_tree_store.rb +113 -0
  41. data/lib/active_window/listed_item.rb +127 -0
  42. data/lib/active_window/signal.rb +46 -0
  43. data/lib/active_window.rb +8 -0
  44. data/lib/config_window.rb +90 -0
  45. data/lib/file_tree_store.rb +74 -0
  46. data/lib/filtered_file_tree_store.rb +34 -0
  47. data/lib/gtk_thread_helper.rb +73 -0
  48. data/lib/listed_directory.rb +45 -0
  49. data/lib/listed_file.rb +67 -0
  50. data/lib/try.rb +9 -0
  51. data/lib/vim/buffers.rb +18 -0
  52. data/lib/vim/integration.rb +38 -0
  53. data/lib/vim/netbeans.rb +154 -0
  54. data/lib/vim/source.vim +18 -0
  55. data/lib/vim_mate/config.rb +132 -0
  56. data/lib/vim_mate/dummy_window.rb +14 -0
  57. data/lib/vim_mate/files_menu.rb +110 -0
  58. data/lib/vim_mate/icons.rb +156 -0
  59. data/lib/vim_mate/nice_singleton.rb +53 -0
  60. data/lib/vim_mate/plugins/inotify/init.rb +4 -0
  61. data/lib/vim_mate/plugins/inotify/lib/INotify.rb +208 -0
  62. data/lib/vim_mate/plugins/inotify/lib/directory.rb +58 -0
  63. data/lib/vim_mate/plugins/subversion/init.rb +7 -0
  64. data/lib/vim_mate/plugins/subversion/lib/file.rb +59 -0
  65. data/lib/vim_mate/plugins/subversion/lib/menu.rb +96 -0
  66. data/lib/vim_mate/plugins/subversion/lib/subversion.rb +157 -0
  67. data/lib/vim_mate/plugins.rb +6 -0
  68. data/lib/vim_mate/requirer.rb +68 -0
  69. data/lib/vim_mate/search_window.rb +227 -0
  70. data/lib/vim_mate/tags_window.rb +167 -0
  71. data/lib/vim_mate/terminals_window.rb +163 -0
  72. data/lib/vim_mate/version.rb +29 -0
  73. data/lib/vim_mate/vim_widget.rb +143 -0
  74. data/spec/active_window/active_column_spec.rb +41 -0
  75. data/spec/active_window/active_tree_store_spec.rb +312 -0
  76. data/spec/active_window/controller_spec.rb +6 -0
  77. data/spec/lib/file_tree_store_spec.rb +40 -0
  78. data/spec/lib/listed_directory_spec.rb +26 -0
  79. data/spec/lib/listed_file_spec.rb +53 -0
  80. data/spec/nice_singleton_spec.rb +23 -0
  81. data/spec/spec.opts +6 -0
  82. data/spec/spec_helper.rb +10 -0
  83. data/views/vim_mate.glade +500 -0
  84. data/vimmate.gemspec +138 -0
  85. metadata +146 -0
@@ -0,0 +1,312 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe ActiveWindow::ActiveTreeStore do
4
+ before( :each ) do
5
+ @ats = ActiveWindow::ActiveTreeStore
6
+ end
7
+ it "should inherit from Gtk::TreeStore" do
8
+ @ats.should < Gtk::TreeStore
9
+ end
10
+ it "should store columns" do
11
+ @ats.column_id.should_not be_nil
12
+ @ats.column_id.should be_a(Hash)
13
+ end
14
+
15
+ it "should have basic columns" do
16
+ @ats.column_id.should have_key(:visible)
17
+ @ats.column_id.should have_key(:object)
18
+ end
19
+
20
+ it "should store column index in constants" do
21
+ @ats::VISIBLE.should == 0
22
+ @ats::OBJECT.should == 1
23
+ end
24
+
25
+ it "should provide classes for columns" do
26
+ @ats.column_classes.should == [TrueClass, Object]
27
+ end
28
+
29
+ describe "subclassing for Person with name and age" do
30
+ before( :each ) do
31
+ class PersonTree < @ats
32
+ column :name, String
33
+ column :age, Fixnum
34
+ end
35
+ end
36
+
37
+ after( :each ) do
38
+ Object::send :remove_const, :PersonTree
39
+ end
40
+
41
+ it "should still have basic columns" do
42
+ PersonTree.column_id.should have_key(:visible)
43
+ PersonTree.column_id.should have_key(:object)
44
+ end
45
+ it "should have both new columns defined" do
46
+ PersonTree.column_id.should have_key(:name)
47
+ PersonTree.column_id.should have_key(:age)
48
+ end
49
+ it "should have 4 columns" do
50
+ PersonTree.column_count.should == 4
51
+ end
52
+ it "should store column index in constants" do
53
+ PersonTree::VISIBLE.should == 0
54
+ PersonTree::OBJECT.should == 1
55
+ PersonTree::NAME.should == 2
56
+ PersonTree::AGE.should == 3
57
+ end
58
+ it "should provde classes for columns" do
59
+ PersonTree.column_classes.should == [TrueClass, Object, String, Integer]
60
+ end
61
+ it "should store column index in hash" do
62
+ PersonTree.column_id.should == {:visible => 0, :object => 1, :name => 2, :age => 3}
63
+ end
64
+
65
+ describe "with index on name" do
66
+ before( :each ) do
67
+ PersonTree.index_by :name
68
+ end
69
+
70
+ it "should define a method to remember People by name" do
71
+ PersonTree.public_instance_methods.should include('remember_iter_by_name')
72
+ end
73
+
74
+ it "should define a method to find People by name" do
75
+ PersonTree.public_instance_methods.should include('find_by_name')
76
+ end
77
+
78
+ describe "added Peter, Paul and Mary" do
79
+ before( :each ) do
80
+ @person_tree = PersonTree.new
81
+ @person_tree.add :name => 'Peter', :age => 23
82
+ @person_tree.add :name => 'Paul', :age => 42
83
+ @person_tree.add :name => 'Mary', :age => 19
84
+ end
85
+
86
+ it "should have indexed the items" do
87
+ @person_tree.index_by_name.should be_a(Hash)
88
+ @person_tree.index_by_name.should have_key('Peter')
89
+ @person_tree.index_by_name.should have_key('Paul')
90
+ @person_tree.index_by_name.should have_key('Mary')
91
+ end
92
+
93
+ it "should index by Strings (the names)" do
94
+ @person_tree.index_by_name.keys.each do |key|
95
+ key.should be_a(String)
96
+ end
97
+ end
98
+
99
+ it "should index TreeRowReferences" do
100
+ @person_tree.index_by_name.values.each do |value|
101
+ value.should be_a(Gtk::TreeRowReference)
102
+ end
103
+ end
104
+
105
+ it "should find the row for Peter by its name" do
106
+ peter = nil
107
+ lambda { peter = @person_tree.find_by_name('Peter') }.should_not raise_error
108
+ peter.should_not be_nil
109
+ peter.should be_a(Gtk::TreeIter)
110
+ peter[2].should == 'Peter'
111
+ end
112
+
113
+ end
114
+ end
115
+
116
+
117
+ describe "instancing" do
118
+ before( :each ) do
119
+ @person_tree = PersonTree.new
120
+ end
121
+
122
+ describe "adding a Person" do
123
+ before( :each ) do
124
+ @person = mock(:name => 'Kate', :age => 23)
125
+ end
126
+
127
+ it "should succeed" do
128
+ lambda { @person_tree.add @person }.should_not raise_error
129
+ end
130
+
131
+ end
132
+
133
+ end
134
+
135
+
136
+ end
137
+
138
+ describe "subclassing twice with different columns" do
139
+ before( :each ) do
140
+ class AppleTree < @ats
141
+ column :apple_count, Fixnum
142
+ end
143
+ class LemonTree < @ats
144
+ column :lemon_count, Fixnum
145
+ end
146
+ end
147
+
148
+ after( :each ) do
149
+ Object::send :remove_const, :AppleTree
150
+ Object::send :remove_const, :LemonTree
151
+ end
152
+
153
+
154
+ it "should both still have basic columns" do
155
+ AppleTree.column_id[:visible].should == 0
156
+ AppleTree.column_id[:object].should == 1
157
+ LemonTree.column_id[:visible].should == 0
158
+ LemonTree.column_id[:object].should == 1
159
+ end
160
+ it "should define columns for both subclasses" do
161
+ AppleTree.column_id[:apple_count].should == 2
162
+ LemonTree.column_id[:lemon_count].should == 2
163
+ end
164
+ it "should keep the new columns to their Classes" do
165
+ AppleTree.column_id.should_not have_key(:lemon_count)
166
+ LemonTree.column_id.should_not have_key(:apple_count)
167
+ end
168
+ it "should both have 3 columns" do
169
+ AppleTree.column_count.should == 3
170
+ LemonTree.column_count.should == 3
171
+ end
172
+ it "should store first column index in constants" do
173
+ AppleTree::VISIBLE.should == 0
174
+ AppleTree::OBJECT.should == 1
175
+ AppleTree::APPLE_COUNT.should == 2
176
+ end
177
+ it "should store second column index in constants" do
178
+ LemonTree::VISIBLE.should == 0
179
+ LemonTree::OBJECT.should == 1
180
+ LemonTree::LEMON_COUNT.should == 2
181
+ end
182
+ it "should provde classes for columns" do
183
+ AppleTree.column_classes.should == [TrueClass, Object, Integer]
184
+ LemonTree.column_classes.should == [TrueClass, Object, Integer]
185
+ end
186
+ end
187
+
188
+ describe "Adding a column to a subclass" do
189
+ before( :each ) do
190
+ @sc = Class.new(@ats)
191
+ end
192
+
193
+ it "should return it to use it somewhere else" do
194
+ col = @sc.column(:name, :string)
195
+ col.should_not be_nil
196
+ col.should be_a(ActiveWindow::ActiveColumn)
197
+ end
198
+ end
199
+
200
+ describe "subclassing with a composite column with 2 subcolumns" do
201
+ before( :each ) do
202
+ class ComplexTree < @ats
203
+ composite_column "Name and Age" do |pack|
204
+ pack.add column(:name, :string)
205
+ pack.add column(:age, :integer)
206
+ end
207
+ end
208
+ end
209
+
210
+ after( :each ) do
211
+ Object::send :remove_const, :ComplexTree
212
+ end
213
+
214
+ it "should create 3 columns" do
215
+ ComplexTree.should have_at_least(3).columns
216
+ end
217
+
218
+ it "should have 2 invisible columns" do
219
+ ComplexTree.should have_at_least(2).invisible_columns
220
+ end
221
+
222
+ it "should have 2 data columns" do
223
+ ComplexTree.should have_at_least(2).data_columns
224
+ end
225
+
226
+ it "should have constants for column ids" do
227
+ ComplexTree::NAME.should == 2
228
+ ComplexTree::AGE.should == 3
229
+ end
230
+
231
+ it "should have max 1 visible column (the composite one)" do
232
+ names = ComplexTree.visible_columns.map(&:name)
233
+ names.should == ['Name and Age']
234
+ ComplexTree.should have_at_most(1).visible_columns
235
+ names.should include('Name and Age')
236
+ end
237
+
238
+ it "should have 2 data columns (the subs)" do
239
+ ComplexTree.should have_at_least(2).data_columns
240
+ names = ComplexTree.data_columns.map(&:name)
241
+ names.should include('name')
242
+ names.should include('age')
243
+ end
244
+
245
+ describe "creating a class filtering it" do
246
+ before( :each ) do
247
+ class FilteredComplexTree < ActiveWindow::FilteredActiveTreeStore
248
+ def iter_visible?(iter)
249
+ !( iter[ self.class.column_id[:name] ].index(filter_string) ).nil?
250
+ end
251
+ end
252
+ end
253
+ after( :each ) do
254
+ Object::send :remove_const, :FilteredComplexTree
255
+ end
256
+
257
+ it "should take its columns from ComplexTree" do
258
+ FilteredComplexTree.columns.should == ComplexTree.columns
259
+ end
260
+
261
+ it "should take constants for the column ids from ComplexTrr" do
262
+ FilteredComplexTree::NAME.should == 2
263
+ FilteredComplexTree::AGE.should == 3
264
+ end
265
+
266
+ describe "instancing it with a model" do
267
+ before( :each ) do
268
+ @tree = ComplexTree.new
269
+ @filtered_tree = FilteredComplexTree.new @tree
270
+ end
271
+
272
+ describe "and filtering some data" do
273
+ before( :each ) do
274
+ @tree.add(:name => 'Niklas', :age => 27)
275
+ @tree.add(:name => 'Grandpa', :age => 99)
276
+ @filtering = lambda { @filtered_tree.filter = 'something' }
277
+ @vis_col = 0
278
+ end
279
+ it "should not break on filtering" do
280
+ @filtering.should_not raise_error
281
+ end
282
+
283
+ it "should check iter for visibility" do
284
+ @filtered_tree.should_receive(:iter_visible?).at_least(:twice)
285
+ @filtering.call
286
+ end
287
+
288
+ it "should hide rows that do not match" do
289
+ @filtered_tree.stub(:iter_visible?).and_return(false)
290
+ @filtering.call
291
+ @tree.each do |model, path, iter|
292
+ iter[@vis_col].should be_false
293
+ end
294
+ end
295
+
296
+ it "should show rows that do match" do
297
+ @filtered_tree.stub(:iter_visible?).and_return(true)
298
+ @filtering.call
299
+ @filtered_tree.found_count.should >= 2
300
+ @tree.each do |model, path, iter|
301
+ iter[@vis_col].should be_true
302
+ end
303
+ end
304
+ end
305
+
306
+ end
307
+
308
+ end
309
+
310
+ end
311
+ end
312
+
@@ -0,0 +1,6 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe ActiveWindow::Controller do
4
+
5
+ end
6
+
@@ -0,0 +1,40 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe FileTreeStore do
4
+ it "should inherit from ActiveWindow::ActiveTreeStore" do
5
+ FileTreeStore.should < ActiveWindow::ActiveTreeStore
6
+ end
7
+
8
+ context "new" do
9
+ before( :each ) do
10
+ @tree = FileTreeStore.new
11
+ end
12
+
13
+ it "should have an empty exclude list" do
14
+ @tree.excludes.should be_empty
15
+ end
16
+
17
+ context "excluding tmp, doc and public dirs" do
18
+ before( :each ) do
19
+ @rules = %w(tmp doc public)
20
+ @rules.each do |rule|
21
+ lambda { @tree.exclude! rule }.should change(@tree.excludes, :count).by(1)
22
+ end
23
+ end
24
+
25
+ it "should have stored the rules in excludes" do
26
+ @tree.excludes.should_not be_empty
27
+ end
28
+
29
+ it "should ignore paths that end with /$rule" do
30
+ @tree.should be_excludes("foo/tmp")
31
+ @tree.should be_excludes("foo/bar/tmp")
32
+ end
33
+
34
+ it "should not ignore that contain $rule somewhere else the end" do
35
+ @tree.should_not be_excludes("foo/tmp/more")
36
+ end
37
+ end
38
+ end
39
+ end
40
+
@@ -0,0 +1,26 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe ListedDirectory do
4
+ before(:each) do
5
+ @files_count = 7
6
+ @path = File.expand_path(File.dirname(__FILE__))
7
+ @dir = ListedDirectory.new(:full_path => @path)
8
+ end
9
+ it "should be a listed file" do
10
+ @dir.should be_instance_of(ListedDirectory)
11
+ end
12
+
13
+ it "should have an icon_type of folder" do
14
+ @dir.icon_name.should == "folder"
15
+ end
16
+
17
+ it "should have the path set" do
18
+ @dir.full_path.should == @path
19
+ end
20
+
21
+ it "should have some files in it" do
22
+ pending "where is the count?"
23
+ @dir.files_count.should == @files_count
24
+ end
25
+ end
26
+
@@ -0,0 +1,53 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe ListedFile do
4
+ context "giving a file path" do
5
+ before( :each ) do
6
+ @path = File.expand_path(__FILE__)
7
+ end
8
+ before(:each) do
9
+ @attrs = {
10
+ :full_path => @path,
11
+ :status => 'normal'
12
+ }
13
+ @file = ListedFile.create(@attrs)
14
+ end
15
+ it "should be recognized as a listed file" do
16
+ @file.should be_a(ListedFile)
17
+ end
18
+
19
+ it "should save the given attributes" do
20
+ @file.full_path.should == @path
21
+ @file.name.should == 'listed_file_spec.rb'
22
+ end
23
+
24
+ it "should have an icon" do
25
+ @file.icon.should_not be_nil
26
+ end
27
+ end
28
+
29
+ context "giving a directory path" do
30
+ before( :each ) do
31
+ @path = File.dirname File.expand_path(__FILE__)
32
+ end
33
+ before(:each) do
34
+ @attrs = {
35
+ :full_path => @path,
36
+ :status => 'normal'
37
+ }
38
+ @file = ListedFile.create(@attrs)
39
+ end
40
+ it "should be recognized as a listed directry" do
41
+ @file.should be_a(ListedDirectory)
42
+ end
43
+
44
+ it "should save the given attributes" do
45
+ @file.full_path.should == @path
46
+ @file.name.should == 'lib'
47
+ end
48
+
49
+ it "should have an icon" do
50
+ @file.icon.should_not be_nil
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,23 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe VimMate::NiceSingleton do
4
+ before(:each) do
5
+ class MySingleton
6
+ include VimMate::NiceSingleton
7
+
8
+ def hello
9
+ "hello"
10
+ end
11
+ end
12
+ end
13
+
14
+ it "should respond to .hello" do
15
+ MySingleton.hello.should == 'hello'
16
+ end
17
+
18
+ it "should not respond to .goodbye" do
19
+ lambda do
20
+ MySingleton.goodbye
21
+ end.should raise_error(NoMethodError)
22
+ end
23
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1,6 @@
1
+ --colour
2
+ --format
3
+ progress
4
+ --loadby
5
+ mtime
6
+ --reverse
@@ -0,0 +1,10 @@
1
+ require 'config/environment'
2
+
3
+ def iter_mock
4
+ mock(:[] => 'value', :[]= => true)
5
+ end
6
+
7
+ def tree_mock
8
+ mock(:has_path? => true) # so that inotify is not called
9
+ end
10
+