ruber 0.0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/COPYING +339 -0
- data/INSTALL +137 -0
- data/LICENSE +8 -0
- data/bin/ruber +65 -0
- data/data/share/apps/ruber/core_components.yaml +31 -0
- data/data/share/apps/ruber/ruberui.rc +109 -0
- data/data/share/icons/ruber.png +0 -0
- data/data/share/pixmaps/ruby.png +0 -0
- data/icons/ruber-16.png +0 -0
- data/icons/ruber-32.png +0 -0
- data/icons/ruber-48.png +0 -0
- data/icons/ruber-8.png +0 -0
- data/lib/ruber/application/application.rb +288 -0
- data/lib/ruber/application/plugin.yaml +11 -0
- data/lib/ruber/component_manager.rb +899 -0
- data/lib/ruber/config/config.rb +82 -0
- data/lib/ruber/config/plugin.yaml +3 -0
- data/lib/ruber/document_project.rb +209 -0
- data/lib/ruber/documents/document_list.rb +416 -0
- data/lib/ruber/documents/plugin.yaml +4 -0
- data/lib/ruber/editor/document.rb +506 -0
- data/lib/ruber/editor/editor_view.rb +167 -0
- data/lib/ruber/editor/ktexteditor_wrapper.rb +202 -0
- data/lib/ruber/exception_widgets.rb +245 -0
- data/lib/ruber/external_program_plugin.rb +397 -0
- data/lib/ruber/filtered_output_widget.rb +342 -0
- data/lib/ruber/gui_states_handler.rb +231 -0
- data/lib/ruber/kde_config_option_backend.rb +167 -0
- data/lib/ruber/kde_sugar.rb +249 -0
- data/lib/ruber/main_window/choose_plugins_dlg.rb +353 -0
- data/lib/ruber/main_window/main_window.rb +524 -0
- data/lib/ruber/main_window/main_window_actions.rb +537 -0
- data/lib/ruber/main_window/main_window_internal.rb +239 -0
- data/lib/ruber/main_window/open_file_in_project_dlg.rb +212 -0
- data/lib/ruber/main_window/output_color_widget.rb +35 -0
- data/lib/ruber/main_window/plugin.yaml +58 -0
- data/lib/ruber/main_window/save_modified_files_dlg.rb +89 -0
- data/lib/ruber/main_window/status_bar.rb +156 -0
- data/lib/ruber/main_window/ui/choose_plugins_widget.rb +90 -0
- data/lib/ruber/main_window/ui/choose_plugins_widget.ui +77 -0
- data/lib/ruber/main_window/ui/main_window_settings_widget.rb +108 -0
- data/lib/ruber/main_window/ui/main_window_settings_widget.ui +89 -0
- data/lib/ruber/main_window/ui/new_project_widget.rb +119 -0
- data/lib/ruber/main_window/ui/new_project_widget.ui +178 -0
- data/lib/ruber/main_window/ui/open_file_in_project_dlg.rb +109 -0
- data/lib/ruber/main_window/ui/open_file_in_project_dlg.ui +168 -0
- data/lib/ruber/main_window/ui/output_color_widget.rb +241 -0
- data/lib/ruber/main_window/ui/output_color_widget.ui +204 -0
- data/lib/ruber/main_window/workspace.rb +442 -0
- data/lib/ruber/output_widget.rb +1093 -0
- data/lib/ruber/plugin.rb +264 -0
- data/lib/ruber/plugin_like.rb +589 -0
- data/lib/ruber/plugin_specification.rb +106 -0
- data/lib/ruber/plugin_specification_reader.rb +451 -0
- data/lib/ruber/project.rb +493 -0
- data/lib/ruber/project_backend.rb +105 -0
- data/lib/ruber/projects/plugin.yaml +11 -0
- data/lib/ruber/projects/project_files_list.rb +314 -0
- data/lib/ruber/projects/project_files_widget.rb +301 -0
- data/lib/ruber/projects/project_list.rb +314 -0
- data/lib/ruber/projects/ui/project_files_rule_chooser_widget.rb +74 -0
- data/lib/ruber/projects/ui/project_files_rule_chooser_widget.ui +61 -0
- data/lib/ruber/projects/ui/project_files_widget.rb +117 -0
- data/lib/ruber/projects/ui/project_files_widget.ui +123 -0
- data/lib/ruber/qt_sugar.rb +673 -0
- data/lib/ruber/settings_container.rb +515 -0
- data/lib/ruber/settings_dialog.rb +244 -0
- data/lib/ruber/settings_dialog_manager.rb +503 -0
- data/lib/ruber/utils.rb +414 -0
- data/lib/ruber/yaml_option_backend.rb +159 -0
- data/outsider_files +15 -0
- data/plugins/autosave/autosave.rb +404 -0
- data/plugins/autosave/plugin.yaml +16 -0
- data/plugins/autosave/ui/autosave_config_widget.rb +83 -0
- data/plugins/autosave/ui/autosave_config_widget.ui +68 -0
- data/plugins/command/command.png +0 -0
- data/plugins/command/command.rb +74 -0
- data/plugins/command/plugin.yaml +11 -0
- data/plugins/find_in_files/find_in_files.rb +337 -0
- data/plugins/find_in_files/find_in_files_dlg.rb +411 -0
- data/plugins/find_in_files/find_in_files_ui.rc +11 -0
- data/plugins/find_in_files/find_in_files_widgets.rb +485 -0
- data/plugins/find_in_files/plugin.yaml +23 -0
- data/plugins/find_in_files/ui/config_widget.rb +58 -0
- data/plugins/find_in_files/ui/config_widget.ui +41 -0
- data/plugins/find_in_files/ui/find_in_files_widget.rb +260 -0
- data/plugins/find_in_files/ui/find_in_files_widget.ui +324 -0
- data/plugins/project_browser/plugin.yaml +10 -0
- data/plugins/project_browser/project_browser.rb +245 -0
- data/plugins/rake/plugin.yaml +39 -0
- data/plugins/rake/rake.png +0 -0
- data/plugins/rake/rake.rb +567 -0
- data/plugins/rake/rake_extension.rb +153 -0
- data/plugins/rake/rake_widgets.rb +615 -0
- data/plugins/rake/rakeui.rc +27 -0
- data/plugins/rake/ui/add_quick_task_widget.rb +71 -0
- data/plugins/rake/ui/add_quick_task_widget.ui +59 -0
- data/plugins/rake/ui/choose_task_widget.rb +77 -0
- data/plugins/rake/ui/choose_task_widget.ui +72 -0
- data/plugins/rake/ui/config_widget.rb +127 -0
- data/plugins/rake/ui/config_widget.ui +123 -0
- data/plugins/rake/ui/project_widget.rb +217 -0
- data/plugins/rake/ui/project_widget.ui +246 -0
- data/plugins/rspec/plugin.yaml +30 -0
- data/plugins/rspec/rspec.png +0 -0
- data/plugins/rspec/rspec.rb +945 -0
- data/plugins/rspec/rspec.svg +90 -0
- data/plugins/rspec/rspecui.rc +20 -0
- data/plugins/rspec/ruber_rspec_formatter.rb +312 -0
- data/plugins/rspec/ui/rspec_project_widget.rb +170 -0
- data/plugins/rspec/ui/rspec_project_widget.ui +193 -0
- data/plugins/ruby_development/plugin.yaml +27 -0
- data/plugins/ruby_development/ruby_development.png +0 -0
- data/plugins/ruby_development/ruby_development.rb +453 -0
- data/plugins/ruby_development/ruby_developmentui.rc +19 -0
- data/plugins/ruby_development/ui/project_widget.rb +112 -0
- data/plugins/ruby_development/ui/project_widget.ui +108 -0
- data/plugins/ruby_runner/config_widget.rb +116 -0
- data/plugins/ruby_runner/plugin.yaml +26 -0
- data/plugins/ruby_runner/project_widget.rb +62 -0
- data/plugins/ruby_runner/ruby.png +0 -0
- data/plugins/ruby_runner/ruby_interpretersui.rc +26 -0
- data/plugins/ruby_runner/ruby_runner.rb +411 -0
- data/plugins/ruby_runner/ui/config_widget.rb +92 -0
- data/plugins/ruby_runner/ui/config_widget.ui +91 -0
- data/plugins/ruby_runner/ui/project_widget.rb +60 -0
- data/plugins/ruby_runner/ui/project_widget.ui +48 -0
- data/plugins/ruby_runner/ui/ruby_runnner_plugin_option_widget.rb +59 -0
- data/plugins/ruby_runner/ui/ruby_runnner_plugin_option_widget.ui +44 -0
- data/plugins/state/plugin.yaml +28 -0
- data/plugins/state/state.rb +520 -0
- data/plugins/state/ui/config_widget.rb +92 -0
- data/plugins/state/ui/config_widget.ui +89 -0
- data/plugins/syntax_checker/plugin.yaml +18 -0
- data/plugins/syntax_checker/syntax_checker.rb +662 -0
- data/ruber.desktop +10 -0
- data/spec/annotation_model_spec.rb +174 -0
- data/spec/common.rb +119 -0
- data/spec/component_manager_spec.rb +1259 -0
- data/spec/document_list_spec.rb +626 -0
- data/spec/document_project_spec.rb +373 -0
- data/spec/document_spec.rb +779 -0
- data/spec/editor_view_spec.rb +167 -0
- data/spec/external_program_plugin_spec.rb +676 -0
- data/spec/filtered_output_widget_spec.rb +642 -0
- data/spec/gui_states_handler_spec.rb +304 -0
- data/spec/kde_config_option_backend_spec.rb +214 -0
- data/spec/kde_sugar_spec.rb +101 -0
- data/spec/ktexteditor_wrapper_spec.rb +305 -0
- data/spec/output_widget_spec.rb +1703 -0
- data/spec/plugin_spec.rb +1393 -0
- data/spec/plugin_specification_reader_spec.rb +1765 -0
- data/spec/plugin_specification_spec.rb +401 -0
- data/spec/project_backend_spec.rb +172 -0
- data/spec/project_files_list_spec.rb +401 -0
- data/spec/project_list_spec.rb +511 -0
- data/spec/project_spec.rb +990 -0
- data/spec/qt_sugar_spec.rb +328 -0
- data/spec/settings_container_spec.rb +617 -0
- data/spec/settings_dialog_manager_spec.rb +773 -0
- data/spec/settings_dialog_spec.rb +419 -0
- data/spec/state_spec.rb +991 -0
- data/spec/utils_spec.rb +406 -0
- data/spec/workspace_spec.rb +869 -0
- data/spec/yaml_option_backend_spec.rb +246 -0
- metadata +284 -0
@@ -0,0 +1,401 @@
|
|
1
|
+
require 'spec/common'
|
2
|
+
|
3
|
+
require 'tempfile'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'flexmock'
|
6
|
+
require 'forwardable'
|
7
|
+
|
8
|
+
require 'ruber/projects/project_files_list'
|
9
|
+
require 'ruber/project'
|
10
|
+
|
11
|
+
|
12
|
+
class SimpleProject < Qt::Object
|
13
|
+
signals 'option_changed(QString, QString)'
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'Ruber::ProjectFilesList' do
|
17
|
+
|
18
|
+
before do
|
19
|
+
@app = Qt::Object.new
|
20
|
+
@comp = Qt::Object.new do
|
21
|
+
class << self
|
22
|
+
extend Forwardable
|
23
|
+
def_delegators :@data, :[], :<<
|
24
|
+
def_delegator :@data, :each, :each_component
|
25
|
+
end
|
26
|
+
@data = []
|
27
|
+
end
|
28
|
+
@projects = Qt::Object.new
|
29
|
+
flexmock(Ruber).should_receive(:[]).with(:app).and_return(@app).by_default
|
30
|
+
flexmock(Ruber).should_receive(:[]).with(:components).and_return(@comp).by_default
|
31
|
+
flexmock(Ruber).should_receive(:[]).with(:projects).and_return(@projects).by_default
|
32
|
+
dir = File.dirname __FILE__
|
33
|
+
@prj = Ruber::Project.new File.join(dir, 'test.ruprj'), 'Test'
|
34
|
+
@prj.add_option(OS.new({:group => :general, :name => :project_files, :default => {:include => [], :exclude => [], :extensions => []} }))
|
35
|
+
@l = Ruber::ProjectFilesList.new @prj
|
36
|
+
@prj.add_extension :file_lister, @l
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should be an Enumerable' do
|
40
|
+
Ruber::ProjectFilesList.ancestors.should include(Enumerable)
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should not be up to date when created' do
|
44
|
+
@l.should_not be_up_to_date
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should not attempt to scan the project when created' do
|
48
|
+
flexmock(Find).should_receive(:find).never
|
49
|
+
l = Ruber::ProjectFilesList.new @prj
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should mark the list as not up to date when the project_files option changes' do
|
53
|
+
@prj.add_option(OS.new({:group => :general, :name => :xyz, :default => 3}))
|
54
|
+
@prj[:general, :project_files][:extensions] = ['*.rb']
|
55
|
+
@l.instance_variable_set :@up_to_date, true
|
56
|
+
@prj.instance_eval{emit option_changed('general', 'xyz')}
|
57
|
+
@prj[:general, :project_files] = {:include => [], :exclude => [], :extensions => %w[*.rb *.ui]}
|
58
|
+
@l.should_not be_up_to_date
|
59
|
+
end
|
60
|
+
|
61
|
+
describe ', when a file or directory changes' do
|
62
|
+
|
63
|
+
before do
|
64
|
+
@files = YAML.load('[f1.rb, f1.yaml, README, COPYING, [d2, f21.rb, f22.rb, f21.yaml, f22.yaml, CHANGELOG], [d3, f31.rb, f32.rb]]')
|
65
|
+
@dir = make_dir_tree @files
|
66
|
+
@prj = Ruber::Project.new File.join(@dir, 'test.ruprj'), 'Test'
|
67
|
+
@prj.add_option(OS.new({:group => :general, :name => :project_files, :default => {:include => [], :exclude => [], :extensions => []} }))
|
68
|
+
@list = Ruber::ProjectFilesList.new @prj
|
69
|
+
@prj.add_extension :file_lister, @list
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should mark itself as not up to date' do
|
73
|
+
@list.instance_variable_set :@up_to_date, true
|
74
|
+
w = @list.instance_variable_get :@watcher
|
75
|
+
dir = @prj.project_directory
|
76
|
+
w.instance_eval{emit dirty(dir)}
|
77
|
+
@list.instance_variable_get(:@up_to_date).should be_false
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'should stop the watcher' do
|
81
|
+
w = @list.instance_variable_get :@watcher
|
82
|
+
flexmock(w).should_receive(:stop_scan).once
|
83
|
+
dir = @prj.project_directory
|
84
|
+
w.instance_eval{emit dirty(dir)}
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
describe Ruber::ProjectFilesList, '#refresh' do
|
90
|
+
|
91
|
+
before do
|
92
|
+
dir = File.dirname __FILE__
|
93
|
+
@prj = Ruber::Project.new File.join(dir, 'test.ruprj'), 'Test'
|
94
|
+
@prj.add_option(OS.new({:group => :general, :name => :project_files, :default => {:include => [], :exclude => [], :extensions => []} }))
|
95
|
+
@list = Ruber::ProjectFilesList.new @prj
|
96
|
+
@prj.add_extension :file_lister, @list
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'should call the scan_project method' do
|
100
|
+
flexmock(@list).should_receive(:scan_project).once
|
101
|
+
@list.refresh
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'should set the file list as up to date' do
|
105
|
+
flexmock(@list).should_receive(:scan_project)
|
106
|
+
@list.refresh
|
107
|
+
@list.should be_up_to_date
|
108
|
+
end
|
109
|
+
|
110
|
+
it 'should restart the watcher' do
|
111
|
+
flexmock(@list).should_receive(:scan_project)
|
112
|
+
w = @list.instance_variable_get(:@watcher)
|
113
|
+
flexmock(w).should_receive(:start_scan).once
|
114
|
+
@list.refresh
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
describe 'Ruber::ProjectFilesList#project_files' do
|
120
|
+
|
121
|
+
before do
|
122
|
+
@files = YAML.load('[f1.rb, f1.yaml, README, COPYING, [d2, f21.rb, f22.rb, f21.yaml, f22.yaml, CHANGELOG], [d3, f31.rb, f32.rb]]')
|
123
|
+
@dir = make_dir_tree @files
|
124
|
+
@prj = Ruber::Project.new File.join(@dir, 'test.ruprj'), 'Test'
|
125
|
+
@prj.add_option(OS.new({:group => :general, :name => :project_files, :default => {:include => [], :exclude => [], :extensions => []} }))
|
126
|
+
@list = Ruber::ProjectFilesList.new @prj
|
127
|
+
@prj.add_extension :file_lister, @list
|
128
|
+
end
|
129
|
+
|
130
|
+
after do
|
131
|
+
FileUtils.rm_f @dir
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'should update the cache if it\'s not up to date' do
|
135
|
+
@list.instance_variable_set :@up_to_date, false
|
136
|
+
flexmock(@list).should_receive(:refresh).once
|
137
|
+
@list.project_files
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'should not update the cache if it\'s already up to date' do
|
141
|
+
@list.instance_variable_set :@up_to_date, true
|
142
|
+
flexmock(@list).should_receive(:refresh).never
|
143
|
+
@list.project_files
|
144
|
+
end
|
145
|
+
|
146
|
+
it 'should return an array containing all the files corresponding to include rules of type path unless they also correspond to an exclude rule of type path' do
|
147
|
+
@prj[:general, :project_files] = {:include => ['README', 'COPYING', 'f1.rb', 'd2/CHANGELOG', 'd2/f21.rb'], :exclude => ['COPYING', 'd2/f21.rb'], :extensions => []}
|
148
|
+
@list.project_files(false).should =~ %w[README f1.rb d2/CHANGELOG]
|
149
|
+
end
|
150
|
+
|
151
|
+
it 'should not include in the returned array files which don\'t exist' do
|
152
|
+
@prj[:general, :project_files] = {:include => ['README1', 'COPYING', 'f1.rb', 'd2/CHANGELOG', 'd2/f211.rb'], :exclude => ['COPYING'], :extensions => []}
|
153
|
+
@list.project_files(false).should =~ %w[f1.rb d2/CHANGELOG]
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'should skip include rules of type path corresponding to directories' do
|
157
|
+
@prj[:general, :project_files] = {:include => ['README', 'COPYING', 'f1.rb', 'd2/CHANGELOG', 'd2/f21.rb', 'd3'], :exclude => ['COPYING', 'd2/f21.rb'], :extensions => []}
|
158
|
+
@list.project_files(false).should =~ %w[README f1.rb d2/CHANGELOG]
|
159
|
+
end
|
160
|
+
|
161
|
+
it 'should include all the files in the project directory which correspond to one of the extensions in the returned array, unless they match one of the exclude rule' do
|
162
|
+
@prj[:general, :project_files] = {:include => [], :exclude => ['COPYING', 'd2/f21.rb'], :extensions => %w[*.rb]}
|
163
|
+
@list.project_files(false).should =~ %w[f1.rb d2/f22.rb d3/f31.rb d3/f32.rb]
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'should include all the files in the project directory which match one of the include rules of type regexp and don\'t match any exclude rule' do
|
167
|
+
@prj[:general, :project_files] = {:include => [%r{d3/.*}, %r{.*\.yaml}], :exclude => [%r{d3/.*2.*}, %r{.*1.*\.rb}], :extensions => []}
|
168
|
+
@list.project_files(false).should =~ %w[d2/f22.yaml f1.yaml d2/f21.yaml]
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'should not include duplicate elements' do
|
172
|
+
@prj[:general, :project_files] = {:include => [%r{d2/.*}, 'f1.rb'], :exclude => [], :extensions => ['*.rb']}
|
173
|
+
@list.project_files(false).should =~ %w[f1.rb d2/f21.rb d2/f22.rb d2/f21.yaml d2/f22.yaml d2/CHANGELOG d3/f31.rb d3/f32.rb]
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'should return a deep copy of the cache object' do
|
177
|
+
@prj[:general, :project_files] = {:include => [%r{d2/.*}, 'f1.rb'], :exclude => [], :extensions => ['*.rb']}
|
178
|
+
old_cache = @list.instance_variable_get(:@project_files).deep_copy
|
179
|
+
res = @list.project_files(false)
|
180
|
+
res.should == old_cache
|
181
|
+
res << 'x'
|
182
|
+
@list.instance_variable_get(:@project_files).should == old_cache
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'should return full paths if the argument is true' do
|
186
|
+
@prj[:general, :project_files] = {:include => [%r{d2/.*}, 'f1.rb'], :exclude => [], :extensions => ['*.rb']}
|
187
|
+
@list.project_files(true).should =~ %w[f1.rb d2/f21.rb d2/f22.rb d2/f21.yaml d2/f22.yaml d2/CHANGELOG d3/f31.rb d3/f32.rb].map{|i| File.join @dir, i}
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'should return the correct list if a file or directory is added or deleted after the file watcher has been created' do
|
191
|
+
@prj[:general, :project_files] = {:include => [], :exclude => [], :extensions => ['*.rb']}
|
192
|
+
# Experiments show that KDE::DirWatch needs an event loop to work. Since we don't have one running, we'll have to make it emit the 'dirty' signal manually
|
193
|
+
watcher = @list.instance_variable_get(:@watcher)
|
194
|
+
`touch #@dir/f2.rb`
|
195
|
+
watcher.instance_eval{emit dirty( @dir)}
|
196
|
+
`touch #@dir/d2/f23.rb`
|
197
|
+
watcher.instance_eval{emit dirty( @dir)}
|
198
|
+
@list.project_files(false).should include('f2.rb')
|
199
|
+
@list.project_files(false).should include('d2/f23.rb')
|
200
|
+
FileUtils.mkdir("#@dir/d4")
|
201
|
+
watcher.instance_eval{emit dirty( @dir)}
|
202
|
+
`touch #@dir/d4/f41.rb`
|
203
|
+
watcher.instance_eval{emit dirty( @dir)}
|
204
|
+
`touch #@dir/d4/f42.rb`
|
205
|
+
watcher.instance_eval{emit dirty( @dir)}
|
206
|
+
@list.project_files(false).should include('d4/f41.rb')
|
207
|
+
@list.project_files(false).should include('d4/f42.rb')
|
208
|
+
FileUtils.rm_rf "#@dir/d2"
|
209
|
+
watcher.instance_eval{emit dirty( @dir)}
|
210
|
+
@list.project_files(false).should_not include("#@dir/d2/f21.rb")
|
211
|
+
@list.project_files(false).should_not include("#@dir/d2/f22.rb")
|
212
|
+
FileUtils.rm "#@dir/f1.rb"
|
213
|
+
watcher.instance_eval{emit dirty( @dir)}
|
214
|
+
@list.project_files(false).should_not include("f1.rb")
|
215
|
+
end
|
216
|
+
|
217
|
+
end
|
218
|
+
|
219
|
+
describe 'Ruber::ProjectFilesList#each' do
|
220
|
+
|
221
|
+
before do
|
222
|
+
@files = YAML.load('[f1.rb, f1.yaml, README, COPYING, [d2, f21.rb, f22.rb, f21.yaml, f22.yaml, CHANGELOG], [d3, f31.rb, f32.rb]]')
|
223
|
+
@dir = make_dir_tree @files
|
224
|
+
@prj = Ruber::Project.new File.join(@dir, 'test.ruprj'), 'Test'
|
225
|
+
@prj.add_option(OS.new({:group => :general, :name => :project_files, :default => {:include => %w[README f1.yaml], :exclude => %w[d2/f22.rb], :extensions => %w[*.rb]} }))
|
226
|
+
@list = Ruber::ProjectFilesList.new @prj
|
227
|
+
@prj.add_extension :file_lister, @list
|
228
|
+
end
|
229
|
+
|
230
|
+
it 'should update the cache if it\'s not up to date and a block is given' do
|
231
|
+
@list.instance_variable_set :@up_to_date, false
|
232
|
+
flexmock(@list).should_receive(:refresh).once
|
233
|
+
@list.each{}
|
234
|
+
end
|
235
|
+
|
236
|
+
it 'should not update the cache if it\'s already up to date and a block is given' do
|
237
|
+
@list.instance_variable_set :@up_to_date, true
|
238
|
+
flexmock(@list).should_receive(:refresh).never
|
239
|
+
@list.each{}
|
240
|
+
end
|
241
|
+
|
242
|
+
it 'should call the associated block passing the full file name of each project file if called with a block and the argument is true' do
|
243
|
+
exp = %w[f1.rb f1.yaml README d2/f21.rb d3/f31.rb d3/f32.rb].map{|f| File.join @dir, f}
|
244
|
+
m = flexmock do |mk|
|
245
|
+
exp.each{|f| mk.should_receive(:test).once.with(f)}
|
246
|
+
end
|
247
|
+
@list.each(true){|f| m.test f}
|
248
|
+
end
|
249
|
+
|
250
|
+
it 'should call the associated block passing the file name of each project file relative to the project directory if called with a block and the argument is false' do
|
251
|
+
exp = %w[f1.rb f1.yaml README d2/f21.rb d3/f31.rb d3/f32.rb]
|
252
|
+
m = flexmock do |mk|
|
253
|
+
exp.each{|f| mk.should_receive(:test).once.with(f)}
|
254
|
+
end
|
255
|
+
@list.each(false){|f| m.test f}
|
256
|
+
end
|
257
|
+
|
258
|
+
it 'should return an enumerator which yields the full file name of each project file if called without a block and the argument is true' do
|
259
|
+
enum = @list.each(true)
|
260
|
+
enum.should be_a(Enumerable)
|
261
|
+
exp = %w[f1.rb f1.yaml README d2/f21.rb d3/f31.rb d3/f32.rb].map{|f| File.join @dir, f}
|
262
|
+
m = flexmock do |mk|
|
263
|
+
exp.each{|f| mk.should_receive(:test).once.with(f)}
|
264
|
+
end
|
265
|
+
enum.each{|f| m.test f}
|
266
|
+
end
|
267
|
+
|
268
|
+
it 'should return an enumerator which yields the file name of each project file relative to the project directory if called without a block and the argument is false' do
|
269
|
+
enum = @list.each(false)
|
270
|
+
enum.should be_a(Enumerable)
|
271
|
+
exp = %w[f1.rb f1.yaml README d2/f21.rb d3/f31.rb d3/f32.rb]
|
272
|
+
m = flexmock do |mk|
|
273
|
+
exp.each{|f| mk.should_receive(:test).once.with(f)}
|
274
|
+
end
|
275
|
+
enum.each{|f| m.test f}
|
276
|
+
end
|
277
|
+
|
278
|
+
it 'should never update the cache if no block is given' do
|
279
|
+
@list.instance_variable_set :@up_to_date, false
|
280
|
+
flexmock(@list).should_receive(:refresh).never
|
281
|
+
@list.each
|
282
|
+
@list.instance_variable_set :@up_to_date, true
|
283
|
+
@list.each
|
284
|
+
end
|
285
|
+
|
286
|
+
end
|
287
|
+
|
288
|
+
describe 'Ruber::ProjectFilesList#rel' do
|
289
|
+
|
290
|
+
before do
|
291
|
+
@files = YAML.load('[f1.rb, f1.yaml, README, COPYING, [d2, f21.rb, f22.rb, f21.yaml, f22.yaml, CHANGELOG], [d3, f31.rb, f32.rb]]')
|
292
|
+
@dir = make_dir_tree @files
|
293
|
+
@prj = Ruber::Project.new File.join(@dir, 'test.ruprj'), 'Test'
|
294
|
+
@prj.add_option(OS.new({:group => :general, :name => :project_files, :default => {:include => %w[README f1.yaml], :exclude => %w[d2/f22.rb], :extensions => %w[*.rb]} }))
|
295
|
+
@list = Ruber::ProjectFilesList.new @prj
|
296
|
+
@prj.add_extension :file_lister, @list
|
297
|
+
end
|
298
|
+
|
299
|
+
it 'should work as the each method with no block and a false argument' do
|
300
|
+
enum = @list.rel
|
301
|
+
enum.should be_a(Enumerable)
|
302
|
+
exp = %w[f1.rb f1.yaml README d2/f21.rb d3/f31.rb d3/f32.rb]
|
303
|
+
m = flexmock do |mk|
|
304
|
+
exp.each{|f| mk.should_receive(:test).once.with(f)}
|
305
|
+
end
|
306
|
+
enum.each{|f| m.test f}
|
307
|
+
end
|
308
|
+
|
309
|
+
end
|
310
|
+
|
311
|
+
describe 'Ruber::ProjectFilesList#abs' do
|
312
|
+
|
313
|
+
before do
|
314
|
+
@files = YAML.load('[f1.rb, f1.yaml, README, COPYING, [d2, f21.rb, f22.rb, f21.yaml, f22.yaml, CHANGELOG], [d3, f31.rb, f32.rb]]')
|
315
|
+
@dir = make_dir_tree @files
|
316
|
+
@prj = Ruber::Project.new File.join(@dir, 'test.ruprj'), 'Test'
|
317
|
+
@prj.add_option(OS.new({:group => :general, :name => :project_files, :default => {:include => %w[README f1.yaml], :exclude => %w[d2/f22.rb], :extensions => %w[*.rb]} }))
|
318
|
+
@list = Ruber::ProjectFilesList.new @prj
|
319
|
+
@prj.add_extension :file_lister, @list
|
320
|
+
end
|
321
|
+
|
322
|
+
it 'should work as the each method with no block and a true argument' do
|
323
|
+
enum = @list.abs
|
324
|
+
enum.should be_a(Enumerable)
|
325
|
+
exp = %w[f1.rb f1.yaml README d2/f21.rb d3/f31.rb d3/f32.rb].map{|f| File.join @dir, f}
|
326
|
+
m = flexmock do |mk|
|
327
|
+
exp.each{|f| mk.should_receive(:test).once.with(f)}
|
328
|
+
end
|
329
|
+
enum.each{|f| m.test f}
|
330
|
+
end
|
331
|
+
|
332
|
+
|
333
|
+
end
|
334
|
+
|
335
|
+
describe Ruber::ProjectFilesList do
|
336
|
+
|
337
|
+
describe '#file_in_project?' do
|
338
|
+
|
339
|
+
before do
|
340
|
+
@dir = File.dirname __FILE__
|
341
|
+
@prj = Ruber::Project.new File.join(@dir, 'test.ruprj'), 'Test'
|
342
|
+
@prj.add_option(OS.new({:group => :general, :name => :project_files, :default => {:include => %w[], :exclude => %w[], :extensions => []} }))
|
343
|
+
@list = Ruber::ProjectFilesList.new @prj
|
344
|
+
@prj.add_extension :file_lister, @list
|
345
|
+
end
|
346
|
+
|
347
|
+
it 'should return true if the argument matches one of the exact include rules' do
|
348
|
+
@prj[:general, :project_files] = {:include => %w[./xyz ./abc ./123], :exclude => [], :extensions => ['*.rb']}
|
349
|
+
@list.file_in_project?(File.join(@prj.project_dir, 'abc')).should be_true
|
350
|
+
end
|
351
|
+
|
352
|
+
it 'should return true if the argument matches one of the regexp include rules' do
|
353
|
+
@prj[:general, :project_files] = {:include => [/a/, /x/], :exclude => [], :extensions => ['*.rb']}
|
354
|
+
@list.file_in_project?(File.join(@prj.project_dir, 'xyz')).should be_true
|
355
|
+
end
|
356
|
+
|
357
|
+
it 'should return true if the argument matches one of the include extensions' do
|
358
|
+
@prj[:general, :project_files] = {:include => [], :exclude => [], :extensions => ['*.rb', '*.yaml']}
|
359
|
+
@list.file_in_project?(File.join(@prj.project_dir, 'abc.rb')).should be_true
|
360
|
+
end
|
361
|
+
|
362
|
+
it 'should return false if the file isn\'t in the project directory' do
|
363
|
+
@prj[:general, :project_files] = {:include => %w[xyz abc 123], :exclude => [], :extensions => ['*.rb']}
|
364
|
+
@list.file_in_project?('/usr/abc').should be_false
|
365
|
+
end
|
366
|
+
|
367
|
+
it 'should treat the argument as a path relative to the project directory if it isn\'t an absolute path' do
|
368
|
+
@prj[:general, :project_files] = {:include => %w[xyz abc 123], :exclude => [], :extensions => ['*.rb']}
|
369
|
+
@list.file_in_project?('abc').should be_true
|
370
|
+
end
|
371
|
+
|
372
|
+
it 'should return false if the file doesn\'t match any include rule' do
|
373
|
+
@list.file_in_project?(File.join(@prj.project_dir, 'abc.rb')).should be_false
|
374
|
+
end
|
375
|
+
|
376
|
+
it 'should return false if the file matches one of the file exclude rules' do
|
377
|
+
@prj[:general, :project_files] = {:include => %w[xyz abc 123], :exclude => ['abc'], :extensions => ['*.rb']}
|
378
|
+
@list.file_in_project?(File.join(@prj.project_dir, 'abc')).should be_false
|
379
|
+
end
|
380
|
+
|
381
|
+
it 'should return false if the file matches one of the exclude regexps' do
|
382
|
+
@prj[:general, :project_files] = {:include => [/a/], :exclude => [/a/], :extensions => []}
|
383
|
+
@list.file_in_project?(File.join(@prj.project_dir, 'abc')).should be_false
|
384
|
+
end
|
385
|
+
|
386
|
+
it 'it considers the whole path of the file, not just the filename' do
|
387
|
+
@prj[:general, :project_files] = {:include => [%r{a/.*}], :exclude => [%r{b/.*}], :extensions => ['*.rb']}
|
388
|
+
@list.file_in_project?(File.join(@prj.project_dir, 'a', 'xyz')).should be_true
|
389
|
+
@list.file_in_project?(File.join(@prj.project_dir, 'b', 'xyz.rb')).should be_false
|
390
|
+
end
|
391
|
+
|
392
|
+
it 'returns nil if the file name ends with a slash' do
|
393
|
+
@prj[:general, :project_files] = {:include => [%r{a/.*}], :exclude => [%r{b/.*}], :extensions => ['*.rb']}
|
394
|
+
@list.file_in_project?('xyz/').should be_nil
|
395
|
+
end
|
396
|
+
|
397
|
+
end
|
398
|
+
|
399
|
+
end
|
400
|
+
|
401
|
+
end
|
@@ -0,0 +1,511 @@
|
|
1
|
+
require 'spec/common'
|
2
|
+
|
3
|
+
require 'flexmock'
|
4
|
+
|
5
|
+
require 'ruber/projects/project_list'
|
6
|
+
require 'ruber/plugin_specification'
|
7
|
+
|
8
|
+
class Ruber::ProjectList::FakeProject < Qt::Object
|
9
|
+
|
10
|
+
signals 'closing(QObject*)'
|
11
|
+
attr_reader :project_name, :project_file
|
12
|
+
def initialize name = 'test', file = nil
|
13
|
+
super()
|
14
|
+
@project_file = file || Array.new(6){97 + rand(26)}.join
|
15
|
+
@project_name = name
|
16
|
+
end
|
17
|
+
|
18
|
+
def deactivate;end
|
19
|
+
|
20
|
+
def activate;end
|
21
|
+
|
22
|
+
def close
|
23
|
+
emit closing(self)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe Ruber::ProjectList do
|
28
|
+
|
29
|
+
it 'should mix-in Enumerable' do
|
30
|
+
Ruber::ProjectList.ancestors.include?(Enumerable).should be_true
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
describe 'Ruber::ProjectList#project_for_file' do
|
36
|
+
|
37
|
+
before do
|
38
|
+
manager = flexmock('components'){|m| m.should_ignore_missing}
|
39
|
+
flexmock(Ruber).should_receive(:[]).with(:app).and_return(KDE::Application.instance).by_default
|
40
|
+
flexmock(Ruber).should_receive(:[]).with(:config).and_return(nil).by_default
|
41
|
+
flexmock(Ruber).should_receive(:[]).with(:components).and_return(manager).by_default
|
42
|
+
pdf = Ruber::PluginSpecification.full({:name => :projects, :class => Ruber::ProjectList})
|
43
|
+
@projects = Ruber::ProjectList.new manager, pdf
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'returns nil if there\'s no current project' do
|
47
|
+
flexmock(@projects).should_receive(:current).twice.and_return nil
|
48
|
+
@projects.project_for_file(__FILE__, :active).should be_nil
|
49
|
+
@projects.project_for_file(__FILE__, :all).should be_nil
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'returns the current project if there\'s one and the file belongs to it' do
|
53
|
+
prj = flexmock{|m| m.should_receive('project_files.file_in_project?').twice.with(__FILE__).and_return true}
|
54
|
+
flexmock(@projects).should_receive(:current).twice.and_return prj
|
55
|
+
@projects.project_for_file(__FILE__, :active).should == prj
|
56
|
+
@projects.project_for_file(__FILE__, :all).should == prj
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'returns nil if the file doesn\'t belong to the current project and the second argument is :active, even if the file belongs to another project' do
|
60
|
+
active_prj = flexmock{|m| m.should_receive('project_files.file_in_project?').once.with(__FILE__).and_return false}
|
61
|
+
prj = flexmock{|m| m.should_receive('project_files.file_in_project?').with(__FILE__).and_return true}
|
62
|
+
flexmock(@projects).should_receive(:current).once.and_return(active_prj)
|
63
|
+
flexmock(@projects).should_receive(:each).and_yield(active_prj, prj)
|
64
|
+
@projects.project_for_file(__FILE__, :active).should be_nil
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'returns the first project to which the file belongs, if it doesn\'t belong to the current one and the second argument is :all' do
|
68
|
+
active_prj = flexmock{|m| m.should_receive('project_files.file_in_project?').twice.with(__FILE__).and_return false}
|
69
|
+
prjs = [
|
70
|
+
flexmock{|m| m.should_receive('project_files.file_in_project?').with(__FILE__).once.and_return false},
|
71
|
+
active_prj,
|
72
|
+
flexmock{|m| m.should_receive('project_files.file_in_project?').with(__FILE__).once.and_return true},
|
73
|
+
flexmock{|m| m.should_receive('project_files.file_in_project?').with(__FILE__).never}
|
74
|
+
]
|
75
|
+
flexmock(@projects).should_receive(:current).once.and_return(active_prj)
|
76
|
+
projects = {
|
77
|
+
'0' => prjs[0],
|
78
|
+
'1' => prjs[1],
|
79
|
+
'2' => prjs[2],
|
80
|
+
'3' => prjs[3]
|
81
|
+
}
|
82
|
+
@projects.instance_variable_set(:@projects, projects)
|
83
|
+
@projects.project_for_file(__FILE__, :all).should equal(prjs[2])
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'returns nil if the second argument is :all and the file doesn\'t belong to any project' do
|
87
|
+
active_prj = flexmock{|m| m.should_receive('project_files.file_in_project?').twice.with(__FILE__).and_return false}
|
88
|
+
prjs = [
|
89
|
+
flexmock{|m| m.should_receive('project_files.file_in_project?').with(__FILE__).once.and_return false},
|
90
|
+
active_prj,
|
91
|
+
flexmock{|m| m.should_receive('project_files.file_in_project?').with(__FILE__).once.and_return false},
|
92
|
+
flexmock{|m| m.should_receive('project_files.file_in_project?').with(__FILE__).once.and_return false}
|
93
|
+
]
|
94
|
+
flexmock(@projects).should_receive(:current).once.and_return(active_prj)
|
95
|
+
projects = {
|
96
|
+
'0' => prjs[0],
|
97
|
+
'1' => prjs[1],
|
98
|
+
'2' => prjs[2],
|
99
|
+
'3' => prjs[3]
|
100
|
+
}
|
101
|
+
@projects.instance_variable_set(:@projects, projects)
|
102
|
+
@projects.project_for_file(__FILE__, :all).should be_nil
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
describe 'Ruber::ProjectList#each_project' do
|
108
|
+
|
109
|
+
before do
|
110
|
+
app = Qt::Object.new
|
111
|
+
manager = flexmock('components'){|m| m.should_ignore_missing}
|
112
|
+
flexmock(Ruber).should_receive(:[]).with(:app).and_return(app)
|
113
|
+
flexmock(Ruber).should_receive(:[]).with(:components).and_return(manager)
|
114
|
+
flexmock(Ruber).should_receive(:[]).with(:config).and_return(nil)
|
115
|
+
pdf = Ruber::PluginSpecification.full({:name => :projects, :class => Ruber::ProjectList})
|
116
|
+
@keeper = Ruber::ProjectList.new manager, pdf
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
it 'should yield all the projects in the list if called with a block' do
|
121
|
+
prjs = Array.new(3){|i| Ruber::ProjectList::FakeProject.new("test#{i}")}
|
122
|
+
prjs.each{|pr| @keeper.add_project pr}
|
123
|
+
res = []
|
124
|
+
@keeper.each_project{|pr| res << pr}
|
125
|
+
res.sort_by{|pr| pr.project_file}.should == prjs.sort_by{|pr| pr.project_file}
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'should return an enumerable which yields all the projects in the list if called without a block' do
|
129
|
+
prjs = Array.new(3){|i| Ruber::ProjectList::FakeProject.new("test#{i}")}
|
130
|
+
prjs.each{|pr| @keeper.add_project pr}
|
131
|
+
m = flexmock do |mk|
|
132
|
+
prjs.each{|prj| mk.should_receive(:test).once.with prj}
|
133
|
+
end
|
134
|
+
en = @keeper.each_project
|
135
|
+
if RUBY_VERSION.match(/8/) then en.should be_an(Enumerable::Enumerator)
|
136
|
+
else en.should be_an(Enumerator)
|
137
|
+
end
|
138
|
+
en.each{|prj| m.test prj}
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
|
143
|
+
describe 'Ruber::ProjectList, when created' do
|
144
|
+
|
145
|
+
before do
|
146
|
+
app = Qt::Object.new
|
147
|
+
manager = flexmock('components'){|m| m.should_ignore_missing}
|
148
|
+
flexmock(Ruber).should_receive(:[]).with(:app).and_return(app)
|
149
|
+
flexmock(Ruber).should_receive(:[]).with(:components).and_return(manager)
|
150
|
+
flexmock(Ruber).should_receive(:[]).with(:config).and_return(nil)
|
151
|
+
@pdf = Ruber::PluginSpecification.full({:name => :projects, :class => Ruber::ProjectList})
|
152
|
+
@keeper = Ruber::ProjectList.new manager, @pdf
|
153
|
+
end
|
154
|
+
|
155
|
+
it 'should call its initialize_plugin method' do
|
156
|
+
@keeper.plugin_description.should == @pdf
|
157
|
+
end
|
158
|
+
|
159
|
+
it 'should have no project' do
|
160
|
+
@keeper.projects.should be_empty
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'should have no current project' do
|
164
|
+
@keeper.current_project.should be_nil
|
165
|
+
end
|
166
|
+
|
167
|
+
end
|
168
|
+
|
169
|
+
describe 'Ruber::Project#current_project=, when called with a non-nil argument' do
|
170
|
+
|
171
|
+
before do
|
172
|
+
app = Qt::Object.new
|
173
|
+
manager = flexmock('components'){|m| m.should_ignore_missing}
|
174
|
+
flexmock(Ruber).should_receive(:[]).with(:app).and_return(app)
|
175
|
+
flexmock(Ruber).should_receive(:[]).with(:components).and_return(manager)
|
176
|
+
flexmock(Ruber).should_receive(:[]).with(:config).and_return(nil)
|
177
|
+
pdf = Ruber::PluginSpecification.full({:name => :projects, :class => Ruber::ProjectList})
|
178
|
+
@keeper = Ruber::ProjectList.new manager, pdf
|
179
|
+
@prj = Ruber::ProjectList::FakeProject.new
|
180
|
+
@keeper.instance_variable_get(:@projects)[@prj.project_file] = @prj
|
181
|
+
@keeper.instance_variable_get(:@projects)['test'] = @prj
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'should set the current project to its argument' do
|
185
|
+
@keeper.current_project = @prj
|
186
|
+
@keeper.current_project.should equal( @prj )
|
187
|
+
end
|
188
|
+
|
189
|
+
it 'should call the "deactivate" method of the old current project, if it\'s not nil' do
|
190
|
+
@keeper.instance_variable_set(:@current_project, @prj)
|
191
|
+
new_prj = Ruber::ProjectList::FakeProject.new 'Test1'
|
192
|
+
@keeper.add_project new_prj
|
193
|
+
flexmock(@prj).should_receive( :deactivate).once
|
194
|
+
@keeper.current_project = new_prj
|
195
|
+
@keeper.instance_variable_set :@current_project, nil
|
196
|
+
lambda{@keeper.current_project = @prj}.should_not raise_error
|
197
|
+
end
|
198
|
+
|
199
|
+
it 'should emit the "current_project_changed(QObject*)" signal with the project as argument' do
|
200
|
+
test = flexmock('test'){|m| m.should_receive(:current_project_changed).once.with(@prj)}
|
201
|
+
@keeper.connect(SIGNAL('current_project_changed(QObject*)')){|o| test.current_project_changed(o)}
|
202
|
+
@keeper.current_project = @prj
|
203
|
+
end
|
204
|
+
|
205
|
+
it 'should call the "activate" method of the new current project' do
|
206
|
+
@keeper.instance_variable_set(:@current_project, @prj)
|
207
|
+
new_prj = Ruber::ProjectList::FakeProject.new 'Test1'
|
208
|
+
@keeper.add_project new_prj
|
209
|
+
flexmock(new_prj).should_receive( :activate).once
|
210
|
+
@keeper.current_project = new_prj
|
211
|
+
end
|
212
|
+
|
213
|
+
it 'should raise ArgumentError if the project is not in the project list' do
|
214
|
+
@keeper.instance_variable_get(:@projects).clear
|
215
|
+
lambda{@keeper.current_project = @prj}.should raise_error(ArgumentError, "Tried to set an unknown as current project")
|
216
|
+
end
|
217
|
+
|
218
|
+
end
|
219
|
+
|
220
|
+
describe 'Ruber::Project#current_project=, when called with nil' do
|
221
|
+
|
222
|
+
before do
|
223
|
+
app = Qt::Object.new
|
224
|
+
manager = flexmock('components'){|m| m.should_ignore_missing}
|
225
|
+
flexmock(Ruber).should_receive(:[]).with(:app).and_return(app)
|
226
|
+
flexmock(Ruber).should_receive(:[]).with(:components).and_return(manager)
|
227
|
+
flexmock(Ruber).should_receive(:[]).with(:config).and_return(nil)
|
228
|
+
pdf = Ruber::PluginSpecification.full({:name => :projects, :class => Ruber::ProjectList})
|
229
|
+
@keeper = Ruber::ProjectList.new manager, pdf
|
230
|
+
end
|
231
|
+
|
232
|
+
it 'should set the current project to nil' do
|
233
|
+
@keeper.current_project = nil
|
234
|
+
@keeper.current_project.should be_nil
|
235
|
+
end
|
236
|
+
|
237
|
+
it 'should emit the "current_project_changed(QObject*)" signal with Qt::NilObject as argument' do
|
238
|
+
test = flexmock('test'){|m| m.should_receive(:current_project_changed).once.with(nil)}
|
239
|
+
@keeper.connect(SIGNAL('current_project_changed(QObject*)')){|o| test.current_project_changed(o)}
|
240
|
+
@keeper.current_project = nil
|
241
|
+
end
|
242
|
+
|
243
|
+
end
|
244
|
+
|
245
|
+
describe 'Ruber::ProjectList#add_project' do
|
246
|
+
|
247
|
+
before do
|
248
|
+
app = Qt::Object.new
|
249
|
+
manager = flexmock('components'){|m| m.should_ignore_missing}
|
250
|
+
flexmock(Ruber).should_receive(:[]).with(:app).and_return(app)
|
251
|
+
flexmock(Ruber).should_receive(:[]).with(:components).and_return(manager)
|
252
|
+
flexmock(Ruber).should_receive(:[]).with(:config).and_return(nil)
|
253
|
+
pdf = Ruber::PluginSpecification.full({:name => :projects, :class => Ruber::ProjectList})
|
254
|
+
@keeper = Ruber::ProjectList.new manager, pdf
|
255
|
+
end
|
256
|
+
|
257
|
+
it 'should add the project passed as argument to the list of projects' do
|
258
|
+
prj = Ruber::ProjectList::FakeProject.new 'Test'
|
259
|
+
@keeper.add_project prj
|
260
|
+
@keeper.instance_variable_get(:@projects)[prj.project_file].should equal(prj)
|
261
|
+
end
|
262
|
+
|
263
|
+
it 'should return the project' do
|
264
|
+
prj = Ruber::ProjectList::FakeProject.new 'Test'
|
265
|
+
@keeper.add_project( prj).should equal(prj)
|
266
|
+
end
|
267
|
+
|
268
|
+
it 'should emit the "project_added(QObject*)" signal passing the added project' do
|
269
|
+
prj = Ruber::ProjectList::FakeProject.new 'Test'
|
270
|
+
m = flexmock('test'){|mk| mk.should_receive(:project_added).once.with(prj)}
|
271
|
+
@keeper.connect(SIGNAL('project_added(QObject*)')){|o| m.project_added(o)}
|
272
|
+
@keeper.add_project prj
|
273
|
+
end
|
274
|
+
|
275
|
+
it 'should raise RuntimeError if the project is already in the list' do
|
276
|
+
prj_file = File.expand_path('test.ruprj')
|
277
|
+
prj1 = Ruber::ProjectList::FakeProject.new 'test1', prj_file
|
278
|
+
prj2 = Ruber::ProjectList::FakeProject.new 'test2', prj_file
|
279
|
+
@keeper.add_project prj1
|
280
|
+
lambda{@keeper.add_project prj2}.should raise_error(RuntimeError, "A project with project file #{prj_file} is already open")
|
281
|
+
end
|
282
|
+
|
283
|
+
end
|
284
|
+
|
285
|
+
describe 'Ruber::ProjectList, when a project in the list is closed' do
|
286
|
+
|
287
|
+
before do
|
288
|
+
app = Qt::Object.new
|
289
|
+
manager = flexmock('components'){|m| m.should_ignore_missing}
|
290
|
+
flexmock(Ruber).should_receive(:[]).with(:app).and_return(app)
|
291
|
+
flexmock(Ruber).should_receive(:[]).with(:components).and_return(manager)
|
292
|
+
flexmock(Ruber).should_receive(:[]).with(:config).and_return(nil)
|
293
|
+
pdf = Ruber::PluginSpecification.full({:name => :projects, :class => Ruber::ProjectList})
|
294
|
+
@keeper = Ruber::ProjectList.new manager, pdf
|
295
|
+
end
|
296
|
+
|
297
|
+
it 'should emit the "project_closing" signal, passing the project as argument' do
|
298
|
+
prj = Ruber::ProjectList::FakeProject.new
|
299
|
+
@keeper.add_project prj
|
300
|
+
m = flexmock{|mk| mk.should_receive(:project_closing).once}
|
301
|
+
@keeper.connect(SIGNAL('closing_project(QObject*)')){|o| m.project_closing(o)}
|
302
|
+
prj.close
|
303
|
+
end
|
304
|
+
|
305
|
+
it 'should set the current project to nil if the closed project was the current one' do
|
306
|
+
prj = Ruber::ProjectList::FakeProject.new
|
307
|
+
@keeper.add_project prj
|
308
|
+
@keeper.current_project = prj
|
309
|
+
prj.close
|
310
|
+
@keeper.current_project.should be_nil
|
311
|
+
end
|
312
|
+
|
313
|
+
end
|
314
|
+
|
315
|
+
describe 'Ruber::ProjectList#close_current_project' do
|
316
|
+
|
317
|
+
include FlexMock::ArgumentTypes
|
318
|
+
|
319
|
+
before do
|
320
|
+
app = Qt::Object.new
|
321
|
+
manager = flexmock('components'){|m| m.should_ignore_missing}
|
322
|
+
flexmock(Ruber).should_receive(:[]).with(:app).and_return(app)
|
323
|
+
flexmock(Ruber).should_receive(:[]).with(:components).and_return(manager)
|
324
|
+
flexmock(Ruber).should_receive(:[]).with(:config).and_return(nil)
|
325
|
+
pdf = Ruber::PluginSpecification.full({:name => :projects, :class => Ruber::ProjectList})
|
326
|
+
@keeper = Ruber::ProjectList.new manager, pdf
|
327
|
+
@prj = Ruber::ProjectList::FakeProject.new{self.object_name = 'project'}
|
328
|
+
@keeper.add_project = @prj
|
329
|
+
@keeper.current_project= @prj
|
330
|
+
end
|
331
|
+
|
332
|
+
it 'should set the current project to nil' do
|
333
|
+
flexmock(@keeper).should_receive(:current_project=).with(nil).once
|
334
|
+
@keeper.close_current_project
|
335
|
+
end
|
336
|
+
|
337
|
+
it 'should emit the "closing_project(QObject*)" signal after setting the current_project to nil, passing the project as argument' do
|
338
|
+
test = flexmock("test"){|m| m.should_receive(:project_closed).once.with(on{|a| a == @prj and !a.disposed?})}
|
339
|
+
flexmock(Ruber).should_receive(:[]).and_return(flexmock{|m| m.should_ignore_missing})
|
340
|
+
@keeper.connect(SIGNAL('closing_project(QObject*)')){|o| test.project_closed(o)}
|
341
|
+
@keeper.close_current_project
|
342
|
+
end
|
343
|
+
|
344
|
+
it 'should do nothing if the current project is nil' do
|
345
|
+
@keeper.instance_variable_set(:@current_project, nil)
|
346
|
+
lambda{@keeper.close_current_project}.should_not raise_error
|
347
|
+
end
|
348
|
+
|
349
|
+
end
|
350
|
+
|
351
|
+
describe 'Ruber::ProjectList#new_project' do
|
352
|
+
|
353
|
+
before do
|
354
|
+
app = Qt::Object.new
|
355
|
+
manager = flexmock('components'){|m| m.should_ignore_missing}
|
356
|
+
flexmock(Ruber).should_receive(:[]).with(:app).and_return(app)
|
357
|
+
flexmock(Ruber).should_receive(:[]).with(:components).and_return(manager)
|
358
|
+
flexmock(Ruber).should_receive(:[]).with(:config).and_return(nil)
|
359
|
+
pdf = Ruber::PluginSpecification.full({:name => :projects, :class => Ruber::ProjectList})
|
360
|
+
@keeper = Ruber::ProjectList.new manager, pdf
|
361
|
+
end
|
362
|
+
|
363
|
+
it 'should create a new empty project and return it' do
|
364
|
+
prj = Ruber::ProjectList::FakeProject.new 'test.ruprj', 'Test'
|
365
|
+
flexmock(Ruber::Project).should_receive(:new).once.with('test.ruprj', 'Test').and_return prj
|
366
|
+
res = @keeper.new_project 'test.ruprj', 'Test'
|
367
|
+
res.should equal(prj)
|
368
|
+
end
|
369
|
+
|
370
|
+
it 'should add the new project to the project list' do
|
371
|
+
prj = Ruber::ProjectList::FakeProject.new 'Test', 'test.ruprj'
|
372
|
+
flexmock(Ruber::Project).should_receive(:new).once.with('test.ruprj', 'Test').and_return prj
|
373
|
+
@keeper.new_project 'test.ruprj', 'Test'
|
374
|
+
@keeper.instance_variable_get(:@projects)['test.ruprj'].should equal(prj)
|
375
|
+
end
|
376
|
+
|
377
|
+
it 'should emit the "project_added(QObject*)" signal with the new project as argument' do
|
378
|
+
prj = Ruber::ProjectList::FakeProject.new 'Test', 'test.ruprj'
|
379
|
+
flexmock(Ruber::Project).should_receive(:new).once.with('test.ruprj', 'Test').and_return prj
|
380
|
+
m = flexmock('test'){|mk| mk.should_receive(:project_added).once.with(prj)}
|
381
|
+
@keeper.connect(SIGNAL('project_added(QObject*)')){|o| m.project_added(o)}
|
382
|
+
@keeper.new_project 'test.ruprj', 'Test'
|
383
|
+
end
|
384
|
+
|
385
|
+
end
|
386
|
+
|
387
|
+
describe 'Ruber::Project#project' do
|
388
|
+
|
389
|
+
before do
|
390
|
+
app = Qt::Object.new
|
391
|
+
manager = flexmock('components'){|m| m.should_ignore_missing}
|
392
|
+
flexmock(Ruber).should_receive(:[]).with(:app).and_return(app)
|
393
|
+
flexmock(Ruber).should_receive(:[]).with(:components).and_return(manager)
|
394
|
+
flexmock(Ruber).should_receive(:[]).with(:config).and_return(nil)
|
395
|
+
pdf = Ruber::PluginSpecification.full({:name => :projects, :class => Ruber::ProjectList})
|
396
|
+
@keeper = Ruber::ProjectList.new manager, pdf
|
397
|
+
end
|
398
|
+
|
399
|
+
it 'should return the project corresponding to the file passed as argument, if it is in the list' do
|
400
|
+
prj = Ruber::ProjectList::FakeProject.new 'Test', 'test.ruprj'
|
401
|
+
@keeper.instance_variable_get(:@projects)[prj.project_file] = prj
|
402
|
+
@keeper.project('test.ruprj').should equal(prj)
|
403
|
+
end
|
404
|
+
|
405
|
+
it 'should load the project from the file passed as argument if it isn\'t in the list' do
|
406
|
+
prj = Ruber::ProjectList::FakeProject.new 'Test', 'test.ruprj'
|
407
|
+
flexmock(Ruber::Project).should_receive(:new).once.with('test.ruprj').and_return prj
|
408
|
+
@keeper.project('test.ruprj').should equal(prj)
|
409
|
+
end
|
410
|
+
|
411
|
+
it 'should emit the "project_added(QObject*)" signal, passing the project as argument, if the project isn\'t in the list' do
|
412
|
+
prj = Ruber::ProjectList::FakeProject.new 'Test', 'test.ruprj'
|
413
|
+
flexmock(Ruber::Project).should_receive(:new).once.with('test.ruprj').and_return prj
|
414
|
+
m = flexmock{|mk| mk.should_receive(:project_added).once.with(prj)}
|
415
|
+
@keeper.connect(SIGNAL('project_added(QObject*)')){|o| m.project_added(o)}
|
416
|
+
@keeper.project 'test.ruprj'
|
417
|
+
end
|
418
|
+
|
419
|
+
end
|
420
|
+
|
421
|
+
describe 'Ruber::Project#[]' do
|
422
|
+
|
423
|
+
before do
|
424
|
+
app = Qt::Object.new
|
425
|
+
manager = flexmock('components'){|m| m.should_ignore_missing}
|
426
|
+
flexmock(Ruber).should_receive(:[]).with(:app).and_return(app)
|
427
|
+
flexmock(Ruber).should_receive(:[]).with(:components).and_return(manager)
|
428
|
+
flexmock(Ruber).should_receive(:[]).with(:config).and_return(nil)
|
429
|
+
pdf = Ruber::PluginSpecification.full({:name => :projects, :class => Ruber::ProjectList})
|
430
|
+
@keeper = Ruber::ProjectList.new manager, pdf
|
431
|
+
end
|
432
|
+
|
433
|
+
it 'should return the project corresponding to the given file, if the argument is a string starting with /, if such a project exists' do
|
434
|
+
prj = Ruber::ProjectList::FakeProject.new 'Test', '/test.ruprj'
|
435
|
+
@keeper.add_project prj
|
436
|
+
@keeper['/test.ruprj'].should equal(prj)
|
437
|
+
end
|
438
|
+
|
439
|
+
it 'should return the project with the given name if the argument is a string not starting with /, if such a project exists' do
|
440
|
+
prj = Ruber::ProjectList::FakeProject.new 'xyz', '/test.ruprj'
|
441
|
+
@keeper.add_project prj
|
442
|
+
@keeper['xyz'].should equal(prj)
|
443
|
+
end
|
444
|
+
|
445
|
+
it 'should return nil if the requested project doesn\'t exist' do
|
446
|
+
prj = Ruber::ProjectList::FakeProject.new 'xyz', '/test.ruprj'
|
447
|
+
@keeper.add_project prj
|
448
|
+
@keeper['abc'].should be_nil
|
449
|
+
@keeper['/xyz.ruprj'].should be_nil
|
450
|
+
end
|
451
|
+
|
452
|
+
end
|
453
|
+
|
454
|
+
describe 'Ruber::ProjectList#save_settings' do
|
455
|
+
|
456
|
+
before do
|
457
|
+
app = Qt::Object.new
|
458
|
+
manager = flexmock('components'){|m| m.should_ignore_missing}
|
459
|
+
flexmock(Ruber).should_receive(:[]).with(:app).and_return(app)
|
460
|
+
flexmock(Ruber).should_receive(:[]).with(:components).and_return(manager)
|
461
|
+
flexmock(Ruber).should_receive(:[]).with(:config).and_return(nil)
|
462
|
+
pdf = Ruber::PluginSpecification.full({:name => :projects, :class => Ruber::ProjectList})
|
463
|
+
@keeper = Ruber::ProjectList.new manager, pdf
|
464
|
+
end
|
465
|
+
|
466
|
+
it 'should call the save method of each open project' do
|
467
|
+
projects = @keeper.instance_variable_get(:@projects)
|
468
|
+
5.times do |i|
|
469
|
+
projects[i] = flexmock(i.to_s){|m| m.should_receive(:save).once}
|
470
|
+
end
|
471
|
+
@keeper.save_settings
|
472
|
+
end
|
473
|
+
|
474
|
+
end
|
475
|
+
|
476
|
+
describe Ruber::ProjectList do
|
477
|
+
|
478
|
+
describe '#query_close' do
|
479
|
+
|
480
|
+
before do
|
481
|
+
app = Qt::Object.new
|
482
|
+
manager = flexmock('components'){|m| m.should_ignore_missing}
|
483
|
+
flexmock(Ruber).should_receive(:[]).with(:app).and_return(app)
|
484
|
+
flexmock(Ruber).should_receive(:[]).with(:components).and_return(manager)
|
485
|
+
flexmock(Ruber).should_receive(:[]).with(:config).and_return(nil)
|
486
|
+
pdf = Ruber::PluginSpecification.full({:name => :projects, :class => Ruber::ProjectList})
|
487
|
+
@keeper = Ruber::ProjectList.new manager, pdf
|
488
|
+
@values = 5.times.map{|i| flexmock(:project_name => i.to_s)}
|
489
|
+
prjs = @keeper.instance_variable_get(:@projects)
|
490
|
+
@values.each{|v| prjs[v.project_name] = v}
|
491
|
+
def prjs.values
|
492
|
+
super.sort_by{|p| p.project_name}
|
493
|
+
end
|
494
|
+
end
|
495
|
+
|
496
|
+
it 'calls the query_close method of all the projects and returns true if they all return true' do
|
497
|
+
@values.each{|pr| pr.should_receive(:query_close).once.and_return true}
|
498
|
+
@keeper.query_close.should be_true
|
499
|
+
end
|
500
|
+
|
501
|
+
it 'stops iterating through the projects and returns false if one of the project\'s query_close method returns false' do
|
502
|
+
@values[0].should_receive(:query_close).once.and_return true
|
503
|
+
@values[1].should_receive(:query_close).once.and_return true
|
504
|
+
@values[2].should_receive(:query_close).once.and_return false
|
505
|
+
@values[3].should_receive(:query_close).never
|
506
|
+
@values[4].should_receive(:query_close).never
|
507
|
+
@keeper.query_close.should be_false
|
508
|
+
end
|
509
|
+
|
510
|
+
end
|
511
|
+
end
|