ruber 0.0.9 → 0.0.10
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +42 -1
- data/lib/ruber/application/application.rb +25 -5
- data/lib/ruber/application/plugin.yaml +2 -10
- data/lib/ruber/component_manager.rb +2 -2
- data/lib/ruber/document_project.rb +5 -3
- data/lib/ruber/editor/document.rb +5 -4
- data/lib/ruber/editor/ktexteditor_wrapper.rb +1 -1
- data/lib/ruber/exception_widgets.rb +1 -1
- data/lib/ruber/main_window/main_window.rb +4 -3
- data/lib/ruber/main_window/main_window_actions.rb +2 -2
- data/lib/ruber/main_window/main_window_internal.rb +1 -1
- data/lib/ruber/output_widget.rb +17 -5
- data/lib/ruber/project.rb +34 -3
- data/lib/ruber/project_dir_scanner.rb +171 -0
- data/lib/ruber/settings_container.rb +7 -7
- data/lib/ruber/settings_dialog.rb +24 -24
- data/lib/ruber/version.rb +1 -1
- data/lib/ruber/world/environment.rb +1 -0
- data/lib/ruber/world/plugin.yaml +7 -2
- data/lib/ruber/{application → world}/project_files_widget.rb +0 -0
- data/lib/ruber/{application → world}/ui/project_files_rule_chooser_widget.rb +2 -2
- data/lib/ruber/{application → world}/ui/project_files_rule_chooser_widget.ui +0 -0
- data/lib/ruber/{application → world}/ui/project_files_widget.rb +2 -2
- data/lib/ruber/{application → world}/ui/project_files_widget.ui +0 -0
- data/plugins/auto_end/auto_end.rb +21 -18
- data/plugins/autosave/autosave.rb +1 -1
- data/plugins/find_in_files/find_in_files.rb +1 -1
- data/plugins/irb/irb.png +0 -0
- data/plugins/irb/irb.rb +142 -0
- data/plugins/irb/irb.svg +240 -0
- data/plugins/irb/irb_controller.rb +541 -0
- data/plugins/irb/irbrc.rb +21 -0
- data/plugins/irb/plugin.yaml +19 -0
- data/plugins/irb/ui/irb_config_widget.rb +151 -0
- data/plugins/irb/ui/irb_config_widget.ui +123 -0
- data/plugins/irb/ui/irb_tool_widget.rb +97 -0
- data/plugins/irb/ui/irb_tool_widget.ui +86 -0
- data/plugins/project_browser/project_browser.rb +1 -1
- data/plugins/rspec/plugin.yaml +6 -3
- data/plugins/rspec/rspec.rb +172 -473
- data/plugins/rspec/tool_widget.rb +462 -0
- data/plugins/rspec/ui/rspec_project_widget.rb +58 -38
- data/plugins/rspec/ui/rspec_project_widget.ui +68 -64
- data/plugins/ruberri/class_formatter.rb +126 -0
- data/plugins/ruberri/method_formatter.rb +90 -0
- data/plugins/ruberri/plugin.yaml +13 -0
- data/plugins/ruberri/ruberri.rb +226 -0
- data/plugins/ruberri/search.rb +111 -0
- data/plugins/ruberri/ui/tool_widget.rb +73 -0
- data/plugins/ruberri/ui/tool_widget.ui +49 -0
- data/plugins/ruby_runner/ruby_runner.rb +2 -2
- data/plugins/ruby_syntax_checker/plugin.yaml +11 -0
- data/plugins/ruby_syntax_checker/ruby_syntax_checker.rb +147 -0
- data/plugins/syntax_checker/plugin.yaml +10 -6
- data/plugins/syntax_checker/syntax_checker.rb +216 -520
- data/plugins/syntax_checker/ui/config_widget.rb +61 -0
- data/plugins/syntax_checker/ui/config_widget.ui +44 -0
- data/plugins/yaml_syntax_checker/plugin.yaml +11 -0
- data/plugins/yaml_syntax_checker/yaml_syntax_checker.rb +62 -0
- data/ruber.desktop +0 -0
- data/spec/auto_end_spec.rb +224 -186
- data/spec/document_project_spec.rb +9 -1
- data/spec/document_spec.rb +9 -0
- data/spec/environment_spec.rb +12 -0
- data/spec/output_widget_spec.rb +69 -2
- data/spec/project_dir_scanner_spec.rb +195 -0
- data/spec/project_spec.rb +43 -73
- data/spec/ruby_syntax_checker_spec.rb +361 -0
- data/spec/syntax_checker_spec.rb +1132 -0
- data/spec/yaml_syntax_checker_spec.rb +130 -0
- metadata +232 -225
- data/lib/ruber/application/project_files_list.rb +0 -320
- data/spec/project_files_list_spec.rb +0 -411
@@ -240,7 +240,7 @@ describe Ruber::DocumentProject do
|
|
240
240
|
prj = Ruber::DocumentProject.new doc
|
241
241
|
prj.instance_variable_get(:@backend).should be_a(Ruber::DocumentProject::Backend)
|
242
242
|
end
|
243
|
-
|
243
|
+
|
244
244
|
context 'if the document is associated with a file' do
|
245
245
|
|
246
246
|
before do
|
@@ -342,6 +342,14 @@ describe Ruber::DocumentProject do
|
|
342
342
|
prj.match_rule?(o1).should be_false
|
343
343
|
end
|
344
344
|
|
345
|
+
it 'considers documents not associated with a file as local files' do
|
346
|
+
doc = create_doc KDE::Url.new
|
347
|
+
prj = Ruber::DocumentProject.new doc
|
348
|
+
o1 = OS.new(:file_extension => [], :scope => [:document], :mimetype => [], :place => [:local])
|
349
|
+
flexmock(doc).should_receive(:file_type_match?).with([], []).and_return true
|
350
|
+
prj.match_rule?(o1).should be_true
|
351
|
+
end
|
352
|
+
|
345
353
|
it 'returns true if both the mimetype and the file extension of the rule match those of the document and the rule\'s scope include :document' do
|
346
354
|
doc = create_doc __FILE__
|
347
355
|
prj = Ruber::DocumentProject.new doc
|
data/spec/document_spec.rb
CHANGED
@@ -136,6 +136,15 @@ describe Ruber::Document do
|
|
136
136
|
prj.project_name.should == KDE::Url.new(__FILE__).to_encoded.to_s
|
137
137
|
end
|
138
138
|
|
139
|
+
it 'calls the finalize method of the the document project' do
|
140
|
+
mk = flexmock do |m|
|
141
|
+
m.should_ignore_missing
|
142
|
+
m.should_receive(:finalize).once
|
143
|
+
end
|
144
|
+
flexmock(Ruber::DocumentProject).should_receive(:new).and_return mk
|
145
|
+
Ruber::Document.new nil, @app
|
146
|
+
end
|
147
|
+
|
139
148
|
it 'isn\'t active' do
|
140
149
|
doc = Ruber::Document.new __FILE__, @app
|
141
150
|
doc.should_not be_active
|
data/spec/environment_spec.rb
CHANGED
@@ -183,6 +183,18 @@ describe Ruber::World::Environment do
|
|
183
183
|
env.views[0].document.text.should == ''
|
184
184
|
env.views[0].document.object_name.should == 'default_document'
|
185
185
|
end
|
186
|
+
|
187
|
+
it 'enables the close buttons on the tab bar if the workspace/close_buttons option is true' do
|
188
|
+
Ruber[:config][:workspace, :close_buttons] = true
|
189
|
+
env = Ruber::World::Environment.new nil
|
190
|
+
env.tab_widget.tabs_closable.should be_true
|
191
|
+
end
|
192
|
+
|
193
|
+
it 'doesn\'t enable the close buttons on the tab bar if the workspace/close_buttons option is false' do
|
194
|
+
Ruber[:config][:workspace, :close_buttons] = false
|
195
|
+
env = Ruber::World::Environment.new nil
|
196
|
+
env.tab_widget.tabs_closable.should be_false
|
197
|
+
end
|
186
198
|
|
187
199
|
end
|
188
200
|
|
data/spec/output_widget_spec.rb
CHANGED
@@ -999,6 +999,24 @@ describe Ruber::OutputWidget do
|
|
999
999
|
@ow.send :maybe_open_file, @mod.index(0,0)
|
1000
1000
|
end
|
1001
1001
|
|
1002
|
+
it 'doesn\'t hide the tool widget if the user pressed the middle mouse button' do
|
1003
|
+
flexmock(Ruber::Application).should_receive(:mouse_buttons).and_return(Qt::MidButton)
|
1004
|
+
flexmock(@ow).should_receive(:pinned_down?).and_return false
|
1005
|
+
@mw.should_receive(:hide_tool).with(@ow).never
|
1006
|
+
@ow.send :maybe_open_file, @mod.index(0,0)
|
1007
|
+
end
|
1008
|
+
|
1009
|
+
it 'gives focus to the editor' do
|
1010
|
+
ed = flexmock{|m| m.should_receive(:set_focus).once}
|
1011
|
+
@mw.should_receive(:display_document).once.and_return(ed)
|
1012
|
+
@ow.send :maybe_open_file, @mod.index(0,0)
|
1013
|
+
end
|
1014
|
+
|
1015
|
+
it 'doesn\'t attempt to give focus to the editor if no editor is found' do
|
1016
|
+
@mw.should_receive(:display_document).once.and_return nil
|
1017
|
+
lambda{@ow.send :maybe_open_file, @mod.index(0,0)}.should_not raise_error
|
1018
|
+
end
|
1019
|
+
|
1002
1020
|
it 'does nothing if the Control and/or Shift modifiers are pressed' do
|
1003
1021
|
flexmock(@ow).should_receive(:find_filename_in_index).never
|
1004
1022
|
flexmock(Ruber::Application).should_receive(:keyboard_modifiers).once.and_return(Qt::ShiftModifier.to_i)
|
@@ -1039,25 +1057,74 @@ describe Ruber::OutputWidget do
|
|
1039
1057
|
before do
|
1040
1058
|
@ow = Ruber::OutputWidget.new
|
1041
1059
|
@cfg = flexmock{|m| m.should_ignore_missing}
|
1060
|
+
@world = flexmock{|m| m.should_ignore_missing}
|
1061
|
+
flexmock(Ruber).should_receive(:[]).with(:main_window).and_return(@mw).by_default
|
1042
1062
|
flexmock(Ruber).should_receive(:[]).with(:config).and_return(@cfg).by_default
|
1063
|
+
flexmock(Ruber).should_receive(:[]).with(:world).and_return(@world).by_default
|
1043
1064
|
end
|
1044
1065
|
|
1045
1066
|
context 'when the general/tool_open_files setting is :split_horizontally' do
|
1046
1067
|
|
1068
|
+
before do
|
1069
|
+
@cfg.should_receive(:[]).with(:general, :tool_open_files).and_return(:split_horizontally).by_default
|
1070
|
+
end
|
1071
|
+
|
1047
1072
|
it 'returns {:new => :current_tab, :split => :horizontal}' do
|
1048
|
-
@cfg.should_receive(:[]).with(:general, :tool_open_files).and_return(:split_horizontally)
|
1049
1073
|
@ow.send(:hints).should == {:new => :current_tab, :split => :horizontal}
|
1050
1074
|
end
|
1051
1075
|
|
1076
|
+
it 'returns {:new => :new_tab} if there is more than one view in the current tab' do
|
1077
|
+
views = Array.new(2){|i| flexmock("view #{i}")}
|
1078
|
+
tab = flexmock{|m| m.should_receive(:views).and_return views}
|
1079
|
+
env = flexmock do |m|
|
1080
|
+
m.should_receive(:tab).with(views[1]).and_return tab
|
1081
|
+
m.should_receive(:active_editor).once.and_return views[1]
|
1082
|
+
end
|
1083
|
+
@world.should_receive(:active_environment).once.and_return env
|
1084
|
+
@ow.send(:hints).should == {:new => :new_tab}
|
1085
|
+
end
|
1086
|
+
|
1087
|
+
it 'returns {:new => :new_tab} if there are no tabs' do
|
1088
|
+
env = flexmock do |m|
|
1089
|
+
m.should_receive(:tab).and_return nil
|
1090
|
+
m.should_receive(:active_editor).and_return nil
|
1091
|
+
end
|
1092
|
+
@world.should_receive(:active_environment).once.and_return env
|
1093
|
+
@ow.send(:hints).should == {:new => :new_tab}
|
1094
|
+
end
|
1095
|
+
|
1052
1096
|
end
|
1053
1097
|
|
1054
1098
|
context 'when the general/tool_open_files setting is :split_vertically' do
|
1055
1099
|
|
1100
|
+
before do
|
1101
|
+
@cfg.should_receive(:[]).with(:general, :tool_open_files).and_return(:split_vertically).by_default
|
1102
|
+
end
|
1103
|
+
|
1056
1104
|
it 'returns {:new => :current_tab, :split => :vertical}' do
|
1057
|
-
@cfg.should_receive(:[]).with(:general, :tool_open_files).and_return(:split_vertically)
|
1058
1105
|
@ow.send(:hints).should == {:new => :current_tab, :split => :vertical}
|
1059
1106
|
end
|
1060
1107
|
|
1108
|
+
it 'returns {:new => :new_tab} if there is more than one view in the current tab' do
|
1109
|
+
views = Array.new(2){|i| flexmock("view #{i}")}
|
1110
|
+
tab = flexmock{|m| m.should_receive(:views).and_return views}
|
1111
|
+
env = flexmock do |m|
|
1112
|
+
m.should_receive(:tab).with(views[1]).and_return tab
|
1113
|
+
m.should_receive(:active_editor).once.and_return views[1]
|
1114
|
+
end
|
1115
|
+
@world.should_receive(:active_environment).once.and_return env
|
1116
|
+
@ow.send(:hints).should == {:new => :new_tab}
|
1117
|
+
end
|
1118
|
+
|
1119
|
+
it 'returns {:new => :new_tab} if there are no tabs' do
|
1120
|
+
env = flexmock do |m|
|
1121
|
+
m.should_receive(:tab).and_return nil
|
1122
|
+
m.should_receive(:active_editor).and_return nil
|
1123
|
+
end
|
1124
|
+
@world.should_receive(:active_environment).once.and_return env
|
1125
|
+
@ow.send(:hints).should == {:new => :new_tab}
|
1126
|
+
end
|
1127
|
+
|
1061
1128
|
end
|
1062
1129
|
|
1063
1130
|
context 'when the general/tool_open_files setting is :new_tab' do
|
@@ -0,0 +1,195 @@
|
|
1
|
+
require 'spec/framework'
|
2
|
+
require 'spec/common'
|
3
|
+
|
4
|
+
require 'tempfile'
|
5
|
+
require 'fileutils'
|
6
|
+
require 'set'
|
7
|
+
|
8
|
+
require 'lib/ruber/project_dir_scanner'
|
9
|
+
|
10
|
+
describe Ruber::ProjectDirScanner do
|
11
|
+
|
12
|
+
before do
|
13
|
+
@dir = File.join Dir.tmpdir, random_string(10)
|
14
|
+
FileUtils.mkdir @dir
|
15
|
+
@prj = Ruber::Project.new File.join(@dir, 'xyz.ruprj'), 'XYZ'
|
16
|
+
@scanner = Ruber::ProjectDirScanner.new @prj
|
17
|
+
end
|
18
|
+
|
19
|
+
after do
|
20
|
+
FileUtils.rm_rf @dir
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'derives from Qt::Object' do
|
24
|
+
Ruber::ProjectDirScanner.ancestors.should include(Qt::Object)
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when created' do
|
28
|
+
it 'takes a Ruber::Project as argument' do
|
29
|
+
lambda{Ruber::ProjectDirScanner.new(@prj)}.should_not raise_error
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'whenever the general/project_files project setting changes' do
|
34
|
+
|
35
|
+
it 'updates its rules' do
|
36
|
+
@scanner.file_in_project?('abc').should be_false
|
37
|
+
@prj[:general, :project_files] = {:include => ['abc'], :exclude => [], :extensions => ['*.rb']}
|
38
|
+
@scanner.file_in_project?('abc').should be_true
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'emits the :rules_changed signal' do
|
42
|
+
mk = flexmock{|m| m.should_receive(:rules_changed).once}
|
43
|
+
@scanner.connect(SIGNAL(:rules_changed)){mk.rules_changed}
|
44
|
+
@prj[:general, :project_files] = {:include => ['abc'], :exclude => [], :extensions => ['*.rb']}
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
describe '#file_in_project?' do
|
50
|
+
|
51
|
+
it 'returns true if the argument matches one of the exact include rules' do
|
52
|
+
@prj[:general, :project_files] = {:include => %w[./xyz ./abc ./123], :exclude => [], :extensions => ['*.rb']}
|
53
|
+
@scanner.file_in_project?(File.join(@prj.project_dir, 'abc')).should be_true
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'returns true if the argument matches one of the regexp include rules' do
|
57
|
+
@prj[:general, :project_files] = {:include => [/a/, /x/], :exclude => [], :extensions => ['*.rb']}
|
58
|
+
@scanner.file_in_project?(File.join(@prj.project_dir, 'xyz')).should be_true
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'returns true if the argument matches one of the include extensions' do
|
62
|
+
@prj[:general, :project_files] = {:include => [], :exclude => [], :extensions => ['*.rb', '*.yaml']}
|
63
|
+
@scanner.file_in_project?(File.join(@prj.project_dir, 'abc.rb')).should be_true
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'returns false if the file isn\'t in the project directory' do
|
67
|
+
@prj[:general, :project_files] = {:include => %w[xyz abc 123], :exclude => [], :extensions => ['*.rb']}
|
68
|
+
@scanner.file_in_project?('/usr/abc').should be_false
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'treats the argument as a path relative to the project directory if it isn\'t an absolute path' do
|
72
|
+
@prj[:general, :project_files] = {:include => %w[xyz abc 123], :exclude => [], :extensions => ['*.rb']}
|
73
|
+
@scanner.file_in_project?('abc').should be_true
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'returns false if the file doesn\'t match any include rule' do
|
77
|
+
@scanner.file_in_project?(File.join(@prj.project_dir, 'abc.xyz')).should be_false
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'returns false if the file matches one of the file exclude rules' do
|
81
|
+
@prj[:general, :project_files] = {:include => %w[xyz abc 123], :exclude => ['abc', 'AbC.rb'], :extensions => ['*.rb']}
|
82
|
+
@scanner.file_in_project?(File.join(@prj.project_dir, 'abc')).should be_false
|
83
|
+
@scanner.file_in_project?(File.join(@prj.project_dir, 'AbC.rb')).should be_false
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'returns false if the file matches one of the exclude regexps' do
|
87
|
+
@prj[:general, :project_files] = {:include => [/a/], :exclude => [/a/], :extensions => []}
|
88
|
+
@scanner.file_in_project?(File.join(@prj.project_dir, 'abc')).should be_false
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'it considers the whole path of the file, not just the filename' do
|
92
|
+
@prj[:general, :project_files] = {:include => [%r{a/.*}], :exclude => [%r{b/.*}], :extensions => ['*.rb']}
|
93
|
+
@scanner.file_in_project?(File.join(@prj.project_dir, 'a', 'xyz')).should be_true
|
94
|
+
@scanner.file_in_project?(File.join(@prj.project_dir, 'b', 'xyz.rb')).should be_false
|
95
|
+
end
|
96
|
+
|
97
|
+
it 'returns nil if the file name ends with a slash' do
|
98
|
+
@prj[:general, :project_files] = {:include => [%r{a/.*}], :exclude => [%r{b/.*}], :extensions => ['*.rb']}
|
99
|
+
@scanner.file_in_project?('xyz/').should be_nil
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'returns false if the path represents a remote URL' do
|
103
|
+
@prj[:general, :project_files] = {:include => [], :exclude => [], :extensions => ['*.rb']}
|
104
|
+
@scanner.file_in_project?("http://#{@dir}/abc.xyz.rb").should be_false
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'works normally if the path represents a local url' do
|
108
|
+
@prj[:general, :project_files] = {:include => [], :exclude => [], :extensions => ['*.rb']}
|
109
|
+
@scanner.file_in_project?("file://#{@dir}/abc.xyz.rb").should be_true
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
describe '#project_files' do
|
115
|
+
|
116
|
+
it 'returns a set of all the files belonging to the project' do
|
117
|
+
tree = ['f1.rb', 'f2.rb', ['d1', 'f3.rb', 'f4.rb', 'f5.rb'], 'f6', 'f7.xyz']
|
118
|
+
base = make_dir_tree tree, @dir
|
119
|
+
base.sub! %r{^#{@dir}/?}, ''
|
120
|
+
@prj[:general, :project_files] = {:include => [File.join(base, 'f7.xyz')], :exclude => [File.join(base, 'f2.rb'), File.join(base, 'd1/f4.rb')], :extensions => ['*.rb']}
|
121
|
+
res = @scanner.project_files
|
122
|
+
res.should be_a Set
|
123
|
+
exp = Set.new(%w[f1.rb d1/f3.rb d1/f5.rb f7.xyz].map{|f| File.join @dir, base, f})
|
124
|
+
res.should == exp
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
|
129
|
+
context 'when a new file is created in the project directory' do
|
130
|
+
|
131
|
+
#Testing this correctly would need an event loop running, which we can't have
|
132
|
+
#inside tests. So we have to manually have the dir watcher emit signals
|
133
|
+
|
134
|
+
before do
|
135
|
+
@prj[:general, :project_files] = {:include => [], :exclude => [], :extensions => ['*.rb']}
|
136
|
+
end
|
137
|
+
|
138
|
+
context 'and the file belongs to the project' do
|
139
|
+
|
140
|
+
it 'emits the file_added signal passing the absolute name of the file' do
|
141
|
+
file = File.join @dir, 'test.rb'
|
142
|
+
mk = flexmock{|m| m.should_receive(:file_added).once.with File.join(@dir, 'test.rb')}
|
143
|
+
@scanner.connect(SIGNAL('file_added(QString)')){|f| mk.file_added f}
|
144
|
+
@scanner.instance_variable_get(:@watcher).instance_eval{emit created(file)}
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
149
|
+
context 'and the file doesn\'t belong to the project' do
|
150
|
+
|
151
|
+
it 'does nothing' do
|
152
|
+
file = File.join @dir, 'test.xyz'
|
153
|
+
mk = flexmock{|m| m.should_receive(:file_added).never}
|
154
|
+
@scanner.connect(SIGNAL('file_added(QString)')){|f| mk.file_added f}
|
155
|
+
@scanner.instance_variable_get(:@watcher).instance_eval{emit created(file)}
|
156
|
+
end
|
157
|
+
|
158
|
+
end
|
159
|
+
|
160
|
+
end
|
161
|
+
|
162
|
+
context 'when a new file is removed from the project directory' do
|
163
|
+
|
164
|
+
#Testing this correctly would need an event loop running, which we can't have
|
165
|
+
#inside tests. So we have to manually have the dir watcher emit signals
|
166
|
+
|
167
|
+
before do
|
168
|
+
@prj[:general, :project_files] = {:include => [], :exclude => [], :extensions => ['*.rb']}
|
169
|
+
end
|
170
|
+
|
171
|
+
context 'and the file used to belong to the project' do
|
172
|
+
|
173
|
+
it 'emits the file_removed signal passing the absolute name of the file' do
|
174
|
+
file = File.join @dir, 'test.rb'
|
175
|
+
mk = flexmock{|m| m.should_receive(:file_removed).once.with File.join(@dir, 'test.rb')}
|
176
|
+
@scanner.connect(SIGNAL('file_removed(QString)')){|f| mk.file_removed f}
|
177
|
+
@scanner.instance_variable_get(:@watcher).instance_eval{emit deleted(file)}
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
181
|
+
|
182
|
+
context 'and the file doesn\'t belong to the project' do
|
183
|
+
|
184
|
+
it 'does nothing' do
|
185
|
+
file = File.join @dir, 'test.xyz'
|
186
|
+
mk = flexmock{|m| m.should_receive(:file_removed).never}
|
187
|
+
@scanner.connect(SIGNAL('file_removed(QString)')){|f| mk.file_removed f}
|
188
|
+
@scanner.instance_variable_get(:@watcher).instance_eval{emit deleted(file)}
|
189
|
+
end
|
190
|
+
|
191
|
+
end
|
192
|
+
|
193
|
+
end
|
194
|
+
|
195
|
+
end
|
data/spec/project_spec.rb
CHANGED
@@ -8,6 +8,7 @@ require 'pathname'
|
|
8
8
|
require 'ostruct'
|
9
9
|
require 'forwardable'
|
10
10
|
require 'dictionary'
|
11
|
+
require 'fileutils'
|
11
12
|
|
12
13
|
require 'ruber/project'
|
13
14
|
require 'ruber/plugin'
|
@@ -73,7 +74,7 @@ describe 'Ruber::AbstractProject, when created' do
|
|
73
74
|
contents = <<-EOS
|
74
75
|
:general:
|
75
76
|
:project_name: Test
|
76
|
-
|
77
|
+
EOS
|
77
78
|
@dir = make_dir_tree ['f1.ruprj'], '/tmp', {'f1.ruprj'=>contents}
|
78
79
|
@file = File.join @dir, 'f1.ruprj'
|
79
80
|
end
|
@@ -276,7 +277,7 @@ describe 'Ruber::AbstractProject#[]=' do
|
|
276
277
|
:g2:
|
277
278
|
:o2: xyz
|
278
279
|
:o3: [a, b]
|
279
|
-
|
280
|
+
EOS
|
280
281
|
@dir = make_dir_tree ['test.ruprj'], '/tmp', {'test.ruprj' => contents}
|
281
282
|
@file = File.join @dir, 'test.ruprj'
|
282
283
|
@options = [
|
@@ -695,15 +696,6 @@ describe Ruber::Project do
|
|
695
696
|
describe 'when created' do
|
696
697
|
|
697
698
|
before do
|
698
|
-
@comp = TestComponentManager.new
|
699
|
-
@projects = Qt::Object.new
|
700
|
-
@fake_app = Application.new
|
701
|
-
@dlg = flexmock('dialog', :read_settings => nil, :dispose => nil)
|
702
|
-
@mw = Qt::Widget.new
|
703
|
-
flexmock(Ruber).should_receive(:[]).with(:components).and_return( @comp).by_default
|
704
|
-
flexmock(Ruber).should_receive(:[]).with(:app).and_return( @fake_app).by_default
|
705
|
-
flexmock(Ruber).should_receive(:[]).with(:main_window).and_return( @mw).by_default
|
706
|
-
flexmock(Ruber).should_receive(:[]).with(:projects).and_return( @projects).by_default
|
707
699
|
@file = File.join Dir.pwd, 'test.ruprj'
|
708
700
|
@dir = nil
|
709
701
|
end
|
@@ -712,9 +704,9 @@ describe Ruber::Project do
|
|
712
704
|
FileUtils.rm_rf @dir if @dir
|
713
705
|
end
|
714
706
|
|
715
|
-
it 'uses the
|
707
|
+
it 'uses the world component as parent' do
|
716
708
|
prj = Ruber::Project.new @file, 'Test'
|
717
|
-
prj.parent.should equal(
|
709
|
+
prj.parent.should equal(Ruber[:world])
|
718
710
|
end
|
719
711
|
|
720
712
|
it 'uses Ruber::ProjectBackend as backend' do
|
@@ -741,15 +733,6 @@ describe Ruber::Project do
|
|
741
733
|
describe ', when closing' do
|
742
734
|
|
743
735
|
before do
|
744
|
-
@comp = TestComponentManager.new
|
745
|
-
@fake_app = Application.new
|
746
|
-
@dlg = flexmock('dialog', :read_settings => nil, :dispose => nil)
|
747
|
-
@mw = Qt::Widget.new
|
748
|
-
@projects = Qt::Object.new
|
749
|
-
flexmock(Ruber).should_receive(:[]).with(:components).and_return( @comp).by_default
|
750
|
-
flexmock(Ruber).should_receive(:[]).with(:app).and_return( @fake_app).by_default
|
751
|
-
flexmock(Ruber).should_receive(:[]).with(:main_window).and_return( @mw).by_default
|
752
|
-
flexmock(Ruber).should_receive(:[]).with(:projects).and_return( @projects).by_default
|
753
736
|
@file = File.join Dir.pwd, 'test.ruprj'
|
754
737
|
end
|
755
738
|
|
@@ -797,15 +780,6 @@ describe Ruber::Project do
|
|
797
780
|
describe '#activate' do
|
798
781
|
|
799
782
|
before do
|
800
|
-
@comp = TestComponentManager.new
|
801
|
-
@fake_app = Application.new
|
802
|
-
@dlg = flexmock('dialog', :read_settings => nil, :dispose => nil)
|
803
|
-
@mw = Qt::Widget.new
|
804
|
-
@projects = Qt::Object.new
|
805
|
-
flexmock(Ruber).should_receive(:[]).with(:components).and_return( @comp).by_default
|
806
|
-
flexmock(Ruber).should_receive(:[]).with(:app).and_return( @fake_app).by_default
|
807
|
-
flexmock(Ruber).should_receive(:[]).with(:main_window).and_return( @mw).by_default
|
808
|
-
flexmock(Ruber).should_receive(:[]).with(:projects).and_return( @projects).by_default
|
809
783
|
@file = File.join Dir.pwd, 'test.ruprj'
|
810
784
|
end
|
811
785
|
|
@@ -835,15 +809,6 @@ describe Ruber::Project do
|
|
835
809
|
describe '#deactivate' do
|
836
810
|
|
837
811
|
before do
|
838
|
-
@comp = TestComponentManager.new
|
839
|
-
@fake_app = Application.new
|
840
|
-
@dlg = flexmock('dialog', :read_settings => nil, :dispose => nil)
|
841
|
-
@mw = Qt::Widget.new
|
842
|
-
@projects = Qt::Object.new
|
843
|
-
flexmock(Ruber).should_receive(:[]).with(:components).and_return( @comp).by_default
|
844
|
-
flexmock(Ruber).should_receive(:[]).with(:app).and_return( @fake_app).by_default
|
845
|
-
flexmock(Ruber).should_receive(:[]).with(:main_window).and_return( @mw).by_default
|
846
|
-
flexmock(Ruber).should_receive(:[]).with(:projects).and_return( @projects).by_default
|
847
812
|
@file = File.join Dir.pwd, 'test.ruprj'
|
848
813
|
end
|
849
814
|
|
@@ -872,16 +837,8 @@ describe Ruber::Project do
|
|
872
837
|
end
|
873
838
|
|
874
839
|
describe '#scope' do
|
840
|
+
|
875
841
|
before do
|
876
|
-
@comp = TestComponentManager.new
|
877
|
-
@fake_app = Application.new
|
878
|
-
@dlg = flexmock('dialog', :read_settings => nil, :dispose => nil)
|
879
|
-
@mw = Qt::Widget.new
|
880
|
-
@projects = Qt::Object.new
|
881
|
-
flexmock(Ruber).should_receive(:[]).with(:components).and_return( @comp).by_default
|
882
|
-
flexmock(Ruber).should_receive(:[]).with(:app).and_return( @fake_app).by_default
|
883
|
-
flexmock(Ruber).should_receive(:[]).with(:main_window).and_return( @mw).by_default
|
884
|
-
flexmock(Ruber).should_receive(:[]).with(:projects).and_return( @projects).by_default
|
885
842
|
@file = File.join Dir.pwd, 'test.ruprj'
|
886
843
|
end
|
887
844
|
|
@@ -893,15 +850,6 @@ describe Ruber::Project do
|
|
893
850
|
describe '#add_option' do
|
894
851
|
|
895
852
|
before do
|
896
|
-
@comp = TestComponentManager.new
|
897
|
-
@fake_app = Application.new
|
898
|
-
@dlg = flexmock('dialog', :read_settings => nil, :dispose => nil)
|
899
|
-
@mw = Qt::Widget.new
|
900
|
-
@projects = Qt::Object.new
|
901
|
-
flexmock(Ruber).should_receive(:[]).with(:components).and_return( @comp).by_default
|
902
|
-
flexmock(Ruber).should_receive(:[]).with(:app).and_return( @fake_app).by_default
|
903
|
-
flexmock(Ruber).should_receive(:[]).with(:main_window).and_return( @mw).by_default
|
904
|
-
flexmock(Ruber).should_receive(:[]).with(:projects).and_return( @projects).by_default
|
905
853
|
@file = File.join Dir.pwd, 'test.ruprj'
|
906
854
|
@prj = Ruber::Project.new(@file, 'Test')
|
907
855
|
end
|
@@ -926,24 +874,46 @@ describe Ruber::Project do
|
|
926
874
|
describe '#files' do
|
927
875
|
|
928
876
|
before do
|
929
|
-
@
|
930
|
-
@
|
931
|
-
@dlg = flexmock('dialog', :read_settings => nil, :dispose => nil)
|
932
|
-
@mw = Qt::Widget.new
|
933
|
-
@projects = Qt::Object.new
|
934
|
-
flexmock(Ruber).should_receive(:[]).with(:components).and_return( @comp).by_default
|
935
|
-
flexmock(Ruber).should_receive(:[]).with(:app).and_return( @fake_app).by_default
|
936
|
-
flexmock(Ruber).should_receive(:[]).with(:main_window).and_return( @mw).by_default
|
937
|
-
flexmock(Ruber).should_receive(:[]).with(:projects).and_return( @projects).by_default
|
938
|
-
@file = File.join Dir.pwd, 'test.ruprj'
|
877
|
+
@dir = make_dir_tree %w[f1.rb f2.rb f3.rb f4.xyz f5.xyz f6.xyz]
|
878
|
+
@file = File.join @dir, 'test.ruprj'
|
939
879
|
@prj = Ruber::Project.new(@file, 'Test')
|
880
|
+
@prj[:general, :project_files] = {:extensions => ['*.rb'], :include => [], :exclude => []}
|
881
|
+
end
|
882
|
+
|
883
|
+
after do
|
884
|
+
FileUtils.rm_rf @dir
|
885
|
+
end
|
886
|
+
|
887
|
+
it 'returns a ProjectFiles object containing all the files in the project' do
|
888
|
+
res = @prj.files
|
889
|
+
res.should be_a(Ruber::ProjectFiles)
|
890
|
+
exp = Dir.entries(@dir).select{|f| f.end_with?('.rb')}.map{|f| File.join @dir, f}
|
891
|
+
res.should == Set.new(exp)
|
892
|
+
end
|
893
|
+
|
894
|
+
it 'takes into account files added after previous calls to this method' do
|
895
|
+
@prj.files
|
896
|
+
file = File.join @dir, 'f8.rb'
|
897
|
+
`touch #{file}`
|
898
|
+
@prj.instance_variable_get(:@dir_scanner).instance_eval{emit file_added(file)}
|
899
|
+
exp = exp = Dir.entries(@dir).select{|f| f.end_with?('.rb')}.map{|f| File.join @dir, f}
|
900
|
+
@prj.files.should == Set.new(exp)
|
901
|
+
end
|
902
|
+
|
903
|
+
it 'takes into account files removed after previous calls to this method' do
|
904
|
+
@prj.files
|
905
|
+
file = File.join @dir, 'f1.rb'
|
906
|
+
`rm #{file}`
|
907
|
+
@prj.instance_variable_get(:@dir_scanner).instance_eval{emit file_removed(file)}
|
908
|
+
exp = exp = Dir.entries(@dir).select{|f| f.end_with?('.rb')}.map{|f| File.join @dir, f}
|
909
|
+
@prj.files.should == Set.new(exp)
|
940
910
|
end
|
941
911
|
|
942
|
-
it '
|
943
|
-
files
|
944
|
-
project_files =
|
945
|
-
@
|
946
|
-
@prj.files.should ==
|
912
|
+
it 'takes into account rule changes after previous calls to this method' do
|
913
|
+
@prj.files
|
914
|
+
@prj[:general, :project_files] = {:extensions => ['*.xyz'], :include => [], :exclude => []}
|
915
|
+
exp = exp = Dir.entries(@dir).select{|f| f.end_with?('.xyz')}.map{|f| File.join @dir, f}
|
916
|
+
@prj.files.should == Set.new(exp)
|
947
917
|
end
|
948
918
|
|
949
919
|
end
|