ruber 0.0.1.1

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 (166) hide show
  1. data/COPYING +339 -0
  2. data/INSTALL +137 -0
  3. data/LICENSE +8 -0
  4. data/bin/ruber +65 -0
  5. data/data/share/apps/ruber/core_components.yaml +31 -0
  6. data/data/share/apps/ruber/ruberui.rc +109 -0
  7. data/data/share/icons/ruber.png +0 -0
  8. data/data/share/pixmaps/ruby.png +0 -0
  9. data/icons/ruber-16.png +0 -0
  10. data/icons/ruber-32.png +0 -0
  11. data/icons/ruber-48.png +0 -0
  12. data/icons/ruber-8.png +0 -0
  13. data/lib/ruber/application/application.rb +288 -0
  14. data/lib/ruber/application/plugin.yaml +11 -0
  15. data/lib/ruber/component_manager.rb +899 -0
  16. data/lib/ruber/config/config.rb +82 -0
  17. data/lib/ruber/config/plugin.yaml +3 -0
  18. data/lib/ruber/document_project.rb +209 -0
  19. data/lib/ruber/documents/document_list.rb +416 -0
  20. data/lib/ruber/documents/plugin.yaml +4 -0
  21. data/lib/ruber/editor/document.rb +506 -0
  22. data/lib/ruber/editor/editor_view.rb +167 -0
  23. data/lib/ruber/editor/ktexteditor_wrapper.rb +202 -0
  24. data/lib/ruber/exception_widgets.rb +245 -0
  25. data/lib/ruber/external_program_plugin.rb +397 -0
  26. data/lib/ruber/filtered_output_widget.rb +342 -0
  27. data/lib/ruber/gui_states_handler.rb +231 -0
  28. data/lib/ruber/kde_config_option_backend.rb +167 -0
  29. data/lib/ruber/kde_sugar.rb +249 -0
  30. data/lib/ruber/main_window/choose_plugins_dlg.rb +353 -0
  31. data/lib/ruber/main_window/main_window.rb +524 -0
  32. data/lib/ruber/main_window/main_window_actions.rb +537 -0
  33. data/lib/ruber/main_window/main_window_internal.rb +239 -0
  34. data/lib/ruber/main_window/open_file_in_project_dlg.rb +212 -0
  35. data/lib/ruber/main_window/output_color_widget.rb +35 -0
  36. data/lib/ruber/main_window/plugin.yaml +58 -0
  37. data/lib/ruber/main_window/save_modified_files_dlg.rb +89 -0
  38. data/lib/ruber/main_window/status_bar.rb +156 -0
  39. data/lib/ruber/main_window/ui/choose_plugins_widget.rb +90 -0
  40. data/lib/ruber/main_window/ui/choose_plugins_widget.ui +77 -0
  41. data/lib/ruber/main_window/ui/main_window_settings_widget.rb +108 -0
  42. data/lib/ruber/main_window/ui/main_window_settings_widget.ui +89 -0
  43. data/lib/ruber/main_window/ui/new_project_widget.rb +119 -0
  44. data/lib/ruber/main_window/ui/new_project_widget.ui +178 -0
  45. data/lib/ruber/main_window/ui/open_file_in_project_dlg.rb +109 -0
  46. data/lib/ruber/main_window/ui/open_file_in_project_dlg.ui +168 -0
  47. data/lib/ruber/main_window/ui/output_color_widget.rb +241 -0
  48. data/lib/ruber/main_window/ui/output_color_widget.ui +204 -0
  49. data/lib/ruber/main_window/workspace.rb +442 -0
  50. data/lib/ruber/output_widget.rb +1093 -0
  51. data/lib/ruber/plugin.rb +264 -0
  52. data/lib/ruber/plugin_like.rb +589 -0
  53. data/lib/ruber/plugin_specification.rb +106 -0
  54. data/lib/ruber/plugin_specification_reader.rb +451 -0
  55. data/lib/ruber/project.rb +493 -0
  56. data/lib/ruber/project_backend.rb +105 -0
  57. data/lib/ruber/projects/plugin.yaml +11 -0
  58. data/lib/ruber/projects/project_files_list.rb +314 -0
  59. data/lib/ruber/projects/project_files_widget.rb +301 -0
  60. data/lib/ruber/projects/project_list.rb +314 -0
  61. data/lib/ruber/projects/ui/project_files_rule_chooser_widget.rb +74 -0
  62. data/lib/ruber/projects/ui/project_files_rule_chooser_widget.ui +61 -0
  63. data/lib/ruber/projects/ui/project_files_widget.rb +117 -0
  64. data/lib/ruber/projects/ui/project_files_widget.ui +123 -0
  65. data/lib/ruber/qt_sugar.rb +673 -0
  66. data/lib/ruber/settings_container.rb +515 -0
  67. data/lib/ruber/settings_dialog.rb +244 -0
  68. data/lib/ruber/settings_dialog_manager.rb +503 -0
  69. data/lib/ruber/utils.rb +414 -0
  70. data/lib/ruber/yaml_option_backend.rb +159 -0
  71. data/outsider_files +15 -0
  72. data/plugins/autosave/autosave.rb +404 -0
  73. data/plugins/autosave/plugin.yaml +16 -0
  74. data/plugins/autosave/ui/autosave_config_widget.rb +83 -0
  75. data/plugins/autosave/ui/autosave_config_widget.ui +68 -0
  76. data/plugins/command/command.png +0 -0
  77. data/plugins/command/command.rb +74 -0
  78. data/plugins/command/plugin.yaml +11 -0
  79. data/plugins/find_in_files/find_in_files.rb +337 -0
  80. data/plugins/find_in_files/find_in_files_dlg.rb +411 -0
  81. data/plugins/find_in_files/find_in_files_ui.rc +11 -0
  82. data/plugins/find_in_files/find_in_files_widgets.rb +485 -0
  83. data/plugins/find_in_files/plugin.yaml +23 -0
  84. data/plugins/find_in_files/ui/config_widget.rb +58 -0
  85. data/plugins/find_in_files/ui/config_widget.ui +41 -0
  86. data/plugins/find_in_files/ui/find_in_files_widget.rb +260 -0
  87. data/plugins/find_in_files/ui/find_in_files_widget.ui +324 -0
  88. data/plugins/project_browser/plugin.yaml +10 -0
  89. data/plugins/project_browser/project_browser.rb +245 -0
  90. data/plugins/rake/plugin.yaml +39 -0
  91. data/plugins/rake/rake.png +0 -0
  92. data/plugins/rake/rake.rb +567 -0
  93. data/plugins/rake/rake_extension.rb +153 -0
  94. data/plugins/rake/rake_widgets.rb +615 -0
  95. data/plugins/rake/rakeui.rc +27 -0
  96. data/plugins/rake/ui/add_quick_task_widget.rb +71 -0
  97. data/plugins/rake/ui/add_quick_task_widget.ui +59 -0
  98. data/plugins/rake/ui/choose_task_widget.rb +77 -0
  99. data/plugins/rake/ui/choose_task_widget.ui +72 -0
  100. data/plugins/rake/ui/config_widget.rb +127 -0
  101. data/plugins/rake/ui/config_widget.ui +123 -0
  102. data/plugins/rake/ui/project_widget.rb +217 -0
  103. data/plugins/rake/ui/project_widget.ui +246 -0
  104. data/plugins/rspec/plugin.yaml +30 -0
  105. data/plugins/rspec/rspec.png +0 -0
  106. data/plugins/rspec/rspec.rb +945 -0
  107. data/plugins/rspec/rspec.svg +90 -0
  108. data/plugins/rspec/rspecui.rc +20 -0
  109. data/plugins/rspec/ruber_rspec_formatter.rb +312 -0
  110. data/plugins/rspec/ui/rspec_project_widget.rb +170 -0
  111. data/plugins/rspec/ui/rspec_project_widget.ui +193 -0
  112. data/plugins/ruby_development/plugin.yaml +27 -0
  113. data/plugins/ruby_development/ruby_development.png +0 -0
  114. data/plugins/ruby_development/ruby_development.rb +453 -0
  115. data/plugins/ruby_development/ruby_developmentui.rc +19 -0
  116. data/plugins/ruby_development/ui/project_widget.rb +112 -0
  117. data/plugins/ruby_development/ui/project_widget.ui +108 -0
  118. data/plugins/ruby_runner/config_widget.rb +116 -0
  119. data/plugins/ruby_runner/plugin.yaml +26 -0
  120. data/plugins/ruby_runner/project_widget.rb +62 -0
  121. data/plugins/ruby_runner/ruby.png +0 -0
  122. data/plugins/ruby_runner/ruby_interpretersui.rc +26 -0
  123. data/plugins/ruby_runner/ruby_runner.rb +411 -0
  124. data/plugins/ruby_runner/ui/config_widget.rb +92 -0
  125. data/plugins/ruby_runner/ui/config_widget.ui +91 -0
  126. data/plugins/ruby_runner/ui/project_widget.rb +60 -0
  127. data/plugins/ruby_runner/ui/project_widget.ui +48 -0
  128. data/plugins/ruby_runner/ui/ruby_runnner_plugin_option_widget.rb +59 -0
  129. data/plugins/ruby_runner/ui/ruby_runnner_plugin_option_widget.ui +44 -0
  130. data/plugins/state/plugin.yaml +28 -0
  131. data/plugins/state/state.rb +520 -0
  132. data/plugins/state/ui/config_widget.rb +92 -0
  133. data/plugins/state/ui/config_widget.ui +89 -0
  134. data/plugins/syntax_checker/plugin.yaml +18 -0
  135. data/plugins/syntax_checker/syntax_checker.rb +662 -0
  136. data/ruber.desktop +10 -0
  137. data/spec/annotation_model_spec.rb +174 -0
  138. data/spec/common.rb +119 -0
  139. data/spec/component_manager_spec.rb +1259 -0
  140. data/spec/document_list_spec.rb +626 -0
  141. data/spec/document_project_spec.rb +373 -0
  142. data/spec/document_spec.rb +779 -0
  143. data/spec/editor_view_spec.rb +167 -0
  144. data/spec/external_program_plugin_spec.rb +676 -0
  145. data/spec/filtered_output_widget_spec.rb +642 -0
  146. data/spec/gui_states_handler_spec.rb +304 -0
  147. data/spec/kde_config_option_backend_spec.rb +214 -0
  148. data/spec/kde_sugar_spec.rb +101 -0
  149. data/spec/ktexteditor_wrapper_spec.rb +305 -0
  150. data/spec/output_widget_spec.rb +1703 -0
  151. data/spec/plugin_spec.rb +1393 -0
  152. data/spec/plugin_specification_reader_spec.rb +1765 -0
  153. data/spec/plugin_specification_spec.rb +401 -0
  154. data/spec/project_backend_spec.rb +172 -0
  155. data/spec/project_files_list_spec.rb +401 -0
  156. data/spec/project_list_spec.rb +511 -0
  157. data/spec/project_spec.rb +990 -0
  158. data/spec/qt_sugar_spec.rb +328 -0
  159. data/spec/settings_container_spec.rb +617 -0
  160. data/spec/settings_dialog_manager_spec.rb +773 -0
  161. data/spec/settings_dialog_spec.rb +419 -0
  162. data/spec/state_spec.rb +991 -0
  163. data/spec/utils_spec.rb +406 -0
  164. data/spec/workspace_spec.rb +869 -0
  165. data/spec/yaml_option_backend_spec.rb +246 -0
  166. metadata +284 -0
@@ -0,0 +1,626 @@
1
+ require './spec/common'
2
+ require 'pathname'
3
+
4
+ require 'ruber/utils'
5
+ require 'ruber/documents/document_list'
6
+ require 'ruber/plugin_specification'
7
+
8
+ describe Ruber::DocumentList do
9
+
10
+ before do
11
+ @app = KDE::Application.instance
12
+ @pdf = Ruber::PluginSpecification.full({:name => :documents, :class => Ruber::DocumentList})
13
+ @manager = flexmock("manager"){|m| m.should_ignore_missing}
14
+ flexmock(Ruber).should_receive(:[]).with(:app).and_return @app
15
+ flexmock(Ruber).should_receive(:[]).with(:components).and_return @manager
16
+ flexmock(Ruber).should_receive(:[]).with(:config).and_return nil
17
+ @mw = Qt::Widget.new
18
+ flexmock(Ruber).should_receive(:[]).with(:main_window).and_return @mw
19
+ @keeper = Ruber::DocumentList.new @manager, @pdf
20
+ flexmock(Ruber).should_receive(:[]).with(:docs).and_return @keeper
21
+ flexmock(Ruber).should_receive(:[]).with(:documents).and_return @keeper
22
+ end
23
+
24
+ after do
25
+ @keeper.instance_variable_get(:@docs).each{|d| d.dispose rescue nil}
26
+ end
27
+
28
+ it 'should be Enumerable' do
29
+ Ruber::DocumentList.ancestors.include?(Enumerable).should be_true
30
+ end
31
+
32
+ it 'should have no documents when created' do
33
+ @keeper.should be_empty
34
+ end
35
+
36
+ it 'should call the initialize_plugin method' do
37
+ @keeper.plugin_description.should == @pdf
38
+ end
39
+
40
+ describe 'Ruber::DocumentList#[]' do
41
+
42
+ context 'when called with an integer argument' do
43
+
44
+ before do
45
+ @docs = 4.times.map do
46
+ doc = Ruber::Document.new Ruber[:main_window]
47
+ @keeper.add_document doc
48
+ doc
49
+ end
50
+ end
51
+
52
+ it 'returns the document in the given position' do
53
+ res = []
54
+ 4.times{|i| res[i] = @keeper[i]}
55
+ res.should == @docs
56
+ end
57
+
58
+ it 'returns nil if the index is out of range' do
59
+ @keeper[5].should be_nil
60
+ end
61
+
62
+ end
63
+
64
+ context 'when called with a string representing an absolute path' do
65
+
66
+ it 'returns the document associated with the path' do
67
+ doc = Ruber::Document.new Ruber[:main_window], __FILE__
68
+ @keeper.add_document doc
69
+ @keeper[File.expand_path(__FILE__)].should == doc
70
+ end
71
+
72
+ it 'returns nil if a document for that file doesn\'t exist' do
73
+ @keeper[`which ruby`].should be_nil
74
+ end
75
+
76
+ end
77
+
78
+ context 'when called with a string which doensn\'t represent an absolute path' do
79
+
80
+ it 'returns the document with the given document_name' do
81
+ doc = Ruber::Document.new Ruber[:main_window], __FILE__
82
+ @keeper.add_document doc
83
+ @keeper[doc.document_name].should == doc
84
+ end
85
+
86
+ it 'returns nil if no document with the given document name exists' do
87
+ @keeper['abcd'].should be_nil
88
+ end
89
+
90
+ end
91
+
92
+ context 'when called with a KDE::Url' do
93
+
94
+ it 'returns the document associated with the url' do
95
+ url = KDE::Url.new 'http://github.com/stcrocco/ruber/raw/master/ruber.gemspec'
96
+ doc = Ruber::Document.new Ruber[:main_window], url
97
+ @keeper.add_document doc
98
+ @keeper[url].should == doc
99
+ end
100
+
101
+ it 'returns nil if no document is associated with the given url' do
102
+ url = KDE::Url.new 'http://github.com/stcrocco/ruber/raw/master/ruber.gemspec'
103
+ @keeper[url].should be_nil
104
+ end
105
+
106
+ end
107
+
108
+ context 'when called with any other argument' do
109
+
110
+ it 'raises TypeError' do
111
+ doc = @keeper.document __FILE__
112
+ lambda{@keeper[1.2]}.should raise_error(TypeError)
113
+ lambda{@keeper[{}]}.should raise_error(TypeError)
114
+ lambda{@keeper[:xyz]}.should raise_error(TypeError)
115
+ end
116
+
117
+ end
118
+
119
+ end
120
+
121
+ describe 'Ruber::Document#document_for_file' do
122
+
123
+ it 'returns the document corresponding to the given absolute path or nil' do
124
+ doc = @keeper.document __FILE__
125
+ @keeper.document_for_file( File.expand_path(__FILE__)).should == doc
126
+ @keeper.document_for_file('/test').should be_nil
127
+ end
128
+
129
+ it 'returns the document corresponding to the given relative path (expanding it) or nil' do
130
+ doc = @keeper.document __FILE__
131
+ @keeper.document_for_file( __FILE__).should == doc
132
+ @keeper.document_for_file('test').should be_nil
133
+ end
134
+
135
+ end
136
+
137
+ describe 'Ruber::Document#document_with_name' do
138
+
139
+ it 'should return the document with the given document_name or nil' do
140
+ doc = @keeper.document __FILE__
141
+ @keeper.document_with_name( File.basename(__FILE__)).should == doc
142
+ @keeper.document_for_file('test').should be_nil
143
+ end
144
+
145
+ end
146
+
147
+ describe '#document_for_url' do
148
+
149
+ it 'returns the document associated with the given KDE::Url' do
150
+ url = KDE::Url.new 'http://github.com/stcrocco/ruber/raw/master/ruber.gemspec'
151
+ doc = Ruber::Document.new Ruber[:main_window], url
152
+ @keeper.add_document doc
153
+ @keeper.document_for_url(url).should == doc
154
+ end
155
+
156
+ it 'converts the argoment to a KDE::Url if it\'s a string' do
157
+ str = 'http://github.com/stcrocco/ruber/raw/master/ruber.gemspec'
158
+ url = KDE::Url.new str
159
+ doc = Ruber::Document.new Ruber[:main_window], url
160
+ @keeper.add_document doc
161
+ @keeper.document_for_url(str).should == doc
162
+ end
163
+
164
+ it 'returns nil if no document corresponding to the url exists' do
165
+ url = 'http://github.com/stcrocco/ruber/raw/master/ruber.gemspec'
166
+ @keeper.document_for_url(KDE::Url.new(url)).should be_nil
167
+ @keeper.document_for_url(url).should be_nil
168
+ end
169
+
170
+ end
171
+
172
+ describe '#each' do
173
+
174
+ context 'when called with a block' do
175
+
176
+ it 'allows to iterate on all documents (in creation order)' do
177
+ docs = 4.times.map{@keeper.new_document}
178
+ res = []
179
+ @keeper.each{|d| res << d}
180
+ res.should == docs
181
+ end
182
+
183
+ it 'returns self' do
184
+ docs = 4.times.map{@keeper.new_document}
185
+ @keeper.each{|d| d}.should equal(@keeper)
186
+ end
187
+
188
+ end
189
+
190
+ context 'when called without a block' do
191
+
192
+ it 'returns an enumerator which allows to iterate on all documents in creation order and returns the list' do
193
+ docs = 4.times.map{@keeper.new_document}
194
+ e = @keeper.each
195
+ e.should be_an(Enumerable)
196
+ res = []
197
+ obj = e.each{|d| res << d}
198
+ res.should == docs
199
+ obj.should == @keeper
200
+ end
201
+
202
+ end
203
+
204
+
205
+ end
206
+
207
+ describe 'Ruber::Document#each_document' do
208
+
209
+ it 'should allow to iterate on all documents (in creation order) when called with a block' do
210
+ docs = 4.times.map{@keeper.new_document}
211
+ res = []
212
+ @keeper.each_document{|d| res << d}
213
+ res.should == docs
214
+ end
215
+
216
+ it 'should return an enumerator which allows to iterate on all documents in creation order when called without a block' do
217
+ docs = 4.times.map{@keeper.new_document}
218
+ e = @keeper.each_document
219
+ e.should be_an(Enumerable)
220
+ res = []
221
+ e.each{|d| res << d}
222
+ res.should == docs
223
+ end
224
+
225
+ end
226
+
227
+ describe 'Ruber::Document#documents' do
228
+
229
+ it 'should return an array with all the documents, in an arbitrary order' do
230
+ docs = 4.times.map{@keeper.new_document}
231
+ res = @keeper.documents
232
+ res.should be_kind_of(Array)
233
+ res.should == docs
234
+ end
235
+
236
+ end
237
+
238
+ describe 'Ruber::Document#to_a' do
239
+
240
+ it 'should return an array with all the documents, in an arbitrary order' do
241
+ docs = 4.times.map{@keeper.new_document}
242
+ res = @keeper.to_a
243
+ res.should be_kind_of(Array)
244
+ res.should == docs
245
+ end
246
+
247
+ end
248
+
249
+ describe 'Ruber::Document#document_for_file?' do
250
+
251
+ it 'should tell whether there\'s a document for the given filename if called with an absolute filename' do
252
+ @keeper.document __FILE__
253
+ @keeper.document_for_file?( File.expand_path(__FILE__) ).should be_true
254
+ @keeper.document_for_file?('/test').should be_false
255
+ end
256
+
257
+ it 'should tell whether there\'s a document for the given filename if called with a relative filename (which will be expanded)' do
258
+ @keeper.document __FILE__
259
+ @keeper.document_for_file?( __FILE__ ).should be_true
260
+ @keeper.document_for_file?('test').should be_false
261
+ end
262
+
263
+ end
264
+
265
+ describe '#document_for_url?' do
266
+
267
+ it 'returns true if a document associated with the given KDE::Url exists' do
268
+ url = KDE::Url.new 'http://github.com/stcrocco/ruber/raw/master/ruber.gemspec'
269
+ doc = Ruber::Document.new Ruber[:main_window], url
270
+ @keeper.add_document doc
271
+ @keeper.document_for_url?(url).should be_true
272
+ end
273
+
274
+ it 'converts the argoment to a KDE::Url if it\'s a string' do
275
+ str = 'http://github.com/stcrocco/ruber/raw/master/ruber.gemspec'
276
+ url = KDE::Url.new str
277
+ doc = Ruber::Document.new Ruber[:main_window], url
278
+ @keeper.add_document doc
279
+ @keeper.document_for_url?(str).should be_true
280
+ end
281
+
282
+ it 'returns false if no document corresponding to the url exists' do
283
+ url = 'http://github.com/stcrocco/ruber/raw/master/ruber.gemspec'
284
+ @keeper.document_for_url(KDE::Url.new(url)).should be_false
285
+ @keeper.document_for_url(url).should be_false
286
+ end
287
+
288
+ end
289
+
290
+ describe 'Ruber::Document#document_with_name' do
291
+
292
+ it 'should tell whether there\'s a document with the given document_name' do
293
+ @keeper.document __FILE__
294
+ @keeper.document_with_name?( File.basename(__FILE__ )).should be_true
295
+ @keeper.document_with_name?('test').should be_false
296
+ end
297
+
298
+ end
299
+
300
+ describe 'Ruber::Document#documents_with_file' do
301
+
302
+ before do
303
+ @all_docs = []
304
+ @empty_docs = []
305
+ @local_docs = []
306
+ @remote_docs = []
307
+ @empty_docs << Ruber::Document.new << Ruber::Document.new
308
+ @local_docs << Ruber::Document.new(nil, __FILE__) << Ruber::Document.new(nil, File.join(File.dirname(__FILE__), 'common.rb'))
309
+ @remote_docs << Ruber::Document.new(nil, KDE::Url.new('http://github.com/stcrocco/ruber/raw/master/ruber.gemspec')) << Ruber::Document.new(nil,
310
+ KDE::Url.new('http://github.com/stcrocco/ruber/raw/master/bin/ruber'))
311
+ @all_docs << @empty_docs[0] << @local_docs[0] << @remote_docs[0] << @remote_docs[1] << @local_docs[1] << @empty_docs[1]
312
+ @all_docs.each{|d| @keeper.add_document d}
313
+ end
314
+
315
+ describe 'when called with the :local argument' do
316
+ it 'returns an array containing only the documents associated with local files' do
317
+ @keeper.documents_with_file(:local).should == @local_docs
318
+ end
319
+ end
320
+
321
+ describe 'when called with the :remote argument' do
322
+ it 'returns an array containing only the documents associated with remote files' do
323
+ @keeper.documents_with_file(:remote).should == @remote_docs
324
+ end
325
+ end
326
+
327
+ describe 'when called with the :any argument' do
328
+ it 'returns an array containing the documents associated with any file' do
329
+ @keeper.documents_with_file(:any).should == [@local_docs[0], @remote_docs[0], @remote_docs[1], @local_docs[1]]
330
+ end
331
+ end
332
+
333
+ describe 'when called with no arguments' do
334
+ it 'returns an array containing the documents associated with any file' do
335
+ @keeper.documents_with_file.should == [@local_docs[0], @remote_docs[0], @remote_docs[1], @local_docs[1]]
336
+ end
337
+ end
338
+
339
+ end
340
+
341
+ describe 'Ruber::DocumentList#close_all' do
342
+
343
+ before do
344
+ flexmock(@mw).should_receive(:save_documents).by_default.and_return(true)
345
+ pdf = Ruber::PluginSpecification.full({:name => :documents, :class => Ruber::DocumentList})
346
+ @docs = Array.new(5){|i| flexmock("doc #{i}"){|m| m.should_receive(:close).and_return(true).by_default}}
347
+ 5.times {|i| flexmock(Ruber::Document).should_receive(:new).and_return(@docs[i])}
348
+ @keeper.instance_variable_set :@docs, @docs.dup
349
+ end
350
+
351
+ it 'should call Ruber[:main_window].save_documents passing it all the documents, if the argument is true' do
352
+ @mw.should_receive(:save_documents).once.with(@docs).and_return true
353
+ @keeper.close_all
354
+ end
355
+
356
+ it 'should return immediately if the call Ruber[:main_window].save_documents returns false' do
357
+ @mw.should_receive(:save_documents).once.with(@docs).and_return false
358
+ @docs.each{|d| d.should_receive(:close).never}
359
+ @keeper.close_all
360
+ end
361
+
362
+ it 'shouldn\'t call Ruber[:main_window].save_documents if the argument is false' do
363
+ @mw.should_receive(:save_documents).never
364
+ @keeper.close_all false
365
+ end
366
+
367
+ it 'should close each document, passing false argument as argument' do
368
+ @mw.should_receive(:save_documents).and_return true
369
+ @docs.each{|d| d.should_receive(:close).once.and_return true}
370
+ @keeper.close_all false
371
+ end
372
+
373
+ it 'should return true if the documents where closed and false otherwise' do
374
+ @mw.should_receive(:save_documents).once.with(@docs).and_return true
375
+ @keeper.close_all.should be_true
376
+ @mw.should_receive(:save_documents).once.with(@docs).and_return false
377
+ @keeper.close_all.should_not be
378
+ end
379
+
380
+ end
381
+
382
+ describe 'Ruber::DocumentList, when a document is closed' do
383
+
384
+
385
+ it 'should emit the "document_closing(QObject*)" signal, passing the document as argument' do
386
+ doc = @keeper.new_document
387
+ exp = doc.object_id
388
+ m = flexmock{|mk| mk.should_receive(:closing_document).once.with(exp)}
389
+ @keeper.connect(SIGNAL('closing_document(QObject*)')){|d| m.closing_document d.object_id}
390
+ doc.close
391
+ end
392
+
393
+ it 'should remove the closed file from the list, without leaving a hole' do
394
+ docs = 3.times.map{ @keeper.new_document}
395
+ docs[1].close false
396
+ @keeper.size.should == docs.size - 1
397
+ @keeper[0].should == docs[0]
398
+ @keeper[1].should == docs[2]
399
+ @keeper.to_a.should == @keeper.to_a.compact
400
+ end
401
+
402
+ end
403
+
404
+ describe 'Ruber::DocumentList#new_document' do
405
+
406
+ it 'should create and return a new empty document' do
407
+ doc = @keeper.new_document
408
+ doc.should be_kind_of(Ruber::Document)
409
+ doc.should be_pristine
410
+ end
411
+
412
+ it 'should add the new document to the list' do
413
+ doc = @keeper.new_document
414
+ @keeper.documents.should == [doc]
415
+ end
416
+
417
+ it 'should connect the "closing(QObject*)" signal of the document to the "close_document(QObject*) slot' do
418
+ doc = Ruber::Document.new
419
+ flexmock(Ruber::Document).should_receive(:new).with(@mw).once.and_return(doc)
420
+ flexmock(@keeper).should_receive(:close_document).once
421
+ @keeper.new_document
422
+ doc.close
423
+ end
424
+
425
+ it 'should emit the "document_created(QObject*)" signal passing the document as argument' do
426
+ doc = Ruber::Document.new
427
+ exp = doc.object_id
428
+ flexmock(Ruber::Document).should_receive(:new).with(@mw).once.and_return(doc)
429
+ m = flexmock{|mk| mk.should_receive(:document_created).with(exp).once}
430
+ @keeper.connect(SIGNAL('document_created(QObject*)')){|d| m.document_created d.object_id}
431
+ @keeper.new_document
432
+ end
433
+
434
+ end
435
+
436
+ describe '#document' do
437
+
438
+ context 'when a document for the given file or url already exists' do
439
+
440
+ it 'doesn\'t create a new document but return the existing one if a document for the given file or url already exists in the list' do
441
+ url = KDE::Url.new 'http://github.com/stcrocco/ruber/raw/ruber.gemspec'
442
+ doc1 = Ruber::Document.new nil, __FILE__
443
+ doc2 = Ruber::Document.new nil, url
444
+ @keeper.add_document doc1
445
+ @keeper.add_document doc2
446
+ flexmock(Ruber::Document).should_receive(:new).never
447
+ @keeper.document(__FILE__).should equal(doc1)
448
+ #Since the tests are run from the top directory, we need to prepend the spec directory
449
+ @keeper.document(File.expand_path(File.join('spec', File.basename(__FILE__)))).should equal(doc1)
450
+ @keeper.document(url).should equal(doc2)
451
+ end
452
+
453
+ end
454
+
455
+ context 'when a document for the given file or url doesn\'t exist' do
456
+
457
+ context 'and the second argument is false' do
458
+
459
+ it 'returns nil' do
460
+ @keeper.document( File.expand_path(__FILE__), false).should be_nil
461
+ @keeper.document(KDE::Url.new('http://github.com/stcrocco/ruber/raw/ruber.gemspec'), false).should be_nil
462
+ @keeper.documents.should == []
463
+ end
464
+
465
+ end
466
+
467
+ context 'and the second argument is true' do
468
+
469
+ it 'creates a new document for the given file or url' do
470
+ url = KDE::Url.new 'http://github.com/stcrocco/ruber/raw/ruber.gemspec'
471
+ doc = @keeper.document __FILE__
472
+ doc.should be_kind_of( Ruber::Document)
473
+ doc.path.should == __FILE__
474
+ doc.text.should == File.read( __FILE__)
475
+ doc = @keeper.document url
476
+ doc.url.should == url
477
+ end
478
+
479
+ it 'raises ArgumentError if the argument is a string or local url and the corresponding file doesn\'t exist' do
480
+ lambda{@keeper.document 'test'}.should raise_error(ArgumentError, "File #{File.expand_path 'test'} doesn't exist")
481
+ lambda{@keeper.document File.expand_path('test')}.should raise_error(ArgumentError, "File #{File.expand_path 'test'} doesn't exist")
482
+ lambda{@keeper.document KDE::Url.new('file:///test')}.should raise_error(ArgumentError, "File #{'/test'} doesn't exist")
483
+ end
484
+
485
+ it 'doesn\'t raise ArgumentError if the argument is a remote url which doesn\'t exist' do
486
+ lambda{@keeper.document KDE::Url.new('http://xyz/abc.def')}.should_not raise_error
487
+ end
488
+
489
+ it 'adds the new document to the list of documents' do
490
+ doc = @keeper.document __FILE__
491
+ @keeper.documents.size.should == 1
492
+ @keeper.documents.include?(doc).should be_true
493
+ end
494
+
495
+ it 'connects the "closing(QObject*)" signal of the new document to the "close_document(QObject*) slot' do
496
+ file = File.expand_path(__FILE__)
497
+ doc = Ruber::Document.new @keeper, file
498
+ flexmock(Ruber::Document).should_receive(:new).with(@mw, file).once.and_return(doc)
499
+ flexmock(@keeper).should_receive(:close_document).once
500
+ @keeper.document __FILE__
501
+ doc.close
502
+ end
503
+
504
+ it 'emits the "document_created(QObject*)" signal passing the new document as argument' do
505
+ file = File.expand_path(__FILE__)
506
+ doc = Ruber::Document.new nil, file
507
+ exp = doc.object_id
508
+ flexmock(Ruber::Document).should_receive(:new).with(@mw, file).once.and_return(doc)
509
+ m = flexmock{|mk| mk.should_receive(:document_created).with(exp).once}
510
+ @keeper.connect(SIGNAL('document_created(QObject*)')){|d| m.document_created d.object_id}
511
+ @keeper.document __FILE__
512
+ end
513
+
514
+ it 'closes the already-existing document when called with a path and the only existing document is pristine' do
515
+ old = @keeper.new_document
516
+ Qt::Object.connect old, SIGNAL('closing(QObject*)'), @keeper, SLOT('close_document(QObject*)')
517
+ doc = @keeper.document __FILE__
518
+ @keeper[0].should == doc
519
+ @keeper.size.should == 1
520
+ end
521
+
522
+ end
523
+
524
+ end
525
+
526
+ it 'expands the given file name relative to the current directory if the file name is relative' do
527
+ flexmock(Ruber::Document).should_receive(:new).with(@mw, File.expand_path(__FILE__))
528
+ doc = @keeper.document __FILE__
529
+ # this is necessary because otherwise the 'after' block fails (because the document list contains nil)
530
+ @keeper.instance_variable_get(:@docs).clear
531
+ end
532
+
533
+ end
534
+
535
+ describe '#add_document' do
536
+
537
+ it 'adds the given document to the list of documents' do
538
+ doc = Ruber::Document.new
539
+ @keeper.add_document doc
540
+ @keeper.documents.size.should == 1
541
+ @keeper.documents.include?(doc).should be_true
542
+ end
543
+
544
+ it 'connects the "closing(QObject*)" signal of the given document to the "close_document(QObject*) slot' do
545
+ file = File.expand_path(__FILE__)
546
+ doc = Ruber::Document.new @keeper, file
547
+ flexmock(@keeper).should_receive(:close_document).once
548
+ @keeper.add_document doc
549
+ doc.close
550
+ end
551
+
552
+ end
553
+
554
+ describe '#save_documents' do
555
+
556
+ before do
557
+ @docs = [@keeper.document(__FILE__), @keeper.new_document, @keeper.new_document]
558
+ end
559
+
560
+ it 'saves all the documents passed as argument' do
561
+ @docs.each{|d| flexmock(d).should_receive(:save).once}
562
+ @keeper.save_documents @docs
563
+ end
564
+
565
+ it 'returns an empty array if all the documents were saved successfully' do
566
+ @docs.each{|d| flexmock(d).should_receive(:save).once.and_return true}
567
+ @keeper.save_documents( @docs).should == []
568
+ end
569
+
570
+ it 'returns an array containing the documents for which save returned false, if the second argument is false' do
571
+ flexmock(@docs[0]).should_receive(:save).once.and_return true
572
+ flexmock(@docs[2]).should_receive(:save).once.and_return true
573
+ flexmock(@docs[1]).should_receive(:save).once.and_return false
574
+ @keeper.save_documents( @docs, false).should == [@docs[1]]
575
+ end
576
+
577
+ it 'doesn\'t call the save method on all remaining documents if one fails, if the second argument is true' do
578
+ flexmock(@docs[0]).should_receive(:save).once.and_return true
579
+ flexmock(@docs[1]).should_receive(:save).once.and_return false
580
+ flexmock(@docs[2]).should_receive(:save).never
581
+ @keeper.save_documents( @docs, true)
582
+ end
583
+
584
+ it 'returns an array containing the first document for which save returned false and all the documents which weren\'t saved if the second argument is true' do
585
+ flexmock(@docs[0]).should_receive(:save).once.and_return true
586
+ flexmock(@docs[1]).should_receive(:save).once.and_return false
587
+ flexmock(@docs[2]).should_receive(:save).never
588
+ @keeper.save_documents( @docs, true).should == @docs[1..-1]
589
+ end
590
+
591
+ end
592
+
593
+ describe '#save_settings' do
594
+
595
+ it 'calls the save_settings method of each document\'s own project' do
596
+ docs = [@keeper.document(__FILE__), @keeper.new_document, @keeper.new_document]
597
+ docs.each{|d| flexmock(d).should_receive(:save_settings).once}
598
+ @keeper.save_settings
599
+ end
600
+
601
+ end
602
+
603
+ describe '#query_close' do
604
+
605
+ before do
606
+ @docs = [@keeper.document(__FILE__), @keeper.new_document, @keeper.new_document]
607
+ end
608
+
609
+ it 'calls the query_close method of each document\'s own project and returns false if one of them returns false' do
610
+ flexmock(@docs[0].own_project).should_receive(:query_close).once.and_return true
611
+ flexmock(@docs[1].own_project).should_receive(:query_close).once.and_return false
612
+ flexmock(@docs[2].own_project).should_receive(:query_close).never.and_return(true)
613
+ @keeper.query_close.should be_false
614
+ end
615
+
616
+ it 'calls the main window\'s close_documents method and return its value' do
617
+ @docs.each{|d| flexmock(d.own_project).should_receive(:query_close).twice.and_return true}
618
+ flexmock(@mw).should_receive(:save_documents).once.with_no_args.and_return true
619
+ flexmock(@mw).should_receive(:save_documents).once.with_no_args.and_return false
620
+ @keeper.query_close.should be_true
621
+ @keeper.query_close.should be_false
622
+ end
623
+
624
+ end
625
+
626
+ end