ruber 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +54 -0
- data/bin/ruber +12 -1
- data/data/share/apps/ruber/ruberui.rc +5 -0
- data/data/share/icons/pin.png +0 -0
- data/lib/ruber/application/application.rb +1 -1
- data/lib/ruber/documents/document_list.rb +1 -1
- data/lib/ruber/editor/document.rb +26 -6
- data/lib/ruber/editor/editor_view.rb +21 -2
- data/lib/ruber/filtered_output_widget.rb +1 -1
- data/lib/ruber/ktexteditor_sugar.rb +124 -0
- data/lib/ruber/main_window/main_window.rb +34 -16
- data/lib/ruber/main_window/main_window_actions.rb +98 -5
- data/lib/ruber/main_window/main_window_internal.rb +1 -1
- data/lib/ruber/main_window/plugin.yaml +5 -0
- data/lib/ruber/main_window/ui/choose_plugins_widget.rb +2 -2
- data/lib/ruber/main_window/ui/main_window_settings_widget.rb +67 -34
- data/lib/ruber/main_window/ui/main_window_settings_widget.ui +77 -30
- data/lib/ruber/main_window/ui/new_project_widget.rb +2 -2
- data/lib/ruber/main_window/ui/open_file_in_project_dlg.rb +2 -2
- data/lib/ruber/main_window/ui/output_color_widget.rb +2 -2
- data/lib/ruber/main_window/ui/workspace_settings_widget.rb +1 -1
- data/lib/ruber/main_window/view_manager.rb +14 -1
- data/lib/ruber/output_widget.rb +409 -288
- data/lib/ruber/pane.rb +22 -0
- data/lib/ruber/projects/ui/project_files_rule_chooser_widget.rb +2 -2
- data/lib/ruber/projects/ui/project_files_widget.rb +2 -2
- data/lib/ruber/qt_sugar.rb +11 -0
- data/lib/ruber/version.rb +1 -1
- data/plugins/auto_end/auto_end.rb +122 -0
- data/plugins/auto_end/plugin.yaml +11 -0
- data/plugins/autosave/ui/autosave_config_widget.rb +2 -2
- data/plugins/command/command.rb +71 -12
- data/plugins/command/output.rb +592 -0
- data/plugins/command/ui/tool_widget.rb +143 -0
- data/plugins/command/ui/tool_widget.ui +147 -0
- data/plugins/find_in_files/ui/config_widget.rb +2 -2
- data/plugins/find_in_files/ui/find_in_files_widget.rb +2 -2
- data/plugins/rake/ui/add_quick_task_widget.rb +2 -2
- data/plugins/rake/ui/choose_task_widget.rb +2 -2
- data/plugins/rake/ui/config_widget.rb +2 -2
- data/plugins/rake/ui/project_widget.rb +2 -2
- data/plugins/rspec/plugin.yaml +7 -2
- data/plugins/rspec/rspec.rb +178 -53
- data/plugins/rspec/rspecui.rc +2 -3
- data/plugins/rspec/ui/config_widget.rb +79 -0
- data/plugins/rspec/ui/config_widget.ui +89 -0
- data/plugins/rspec/ui/rspec_project_widget.rb +2 -2
- data/plugins/ruby_development/ruby_development.rb +1 -1
- data/plugins/ruby_development/ui/config_widget.rb +1 -1
- data/plugins/ruby_development/ui/project_widget.rb +2 -2
- data/plugins/ruby_runner/ruby_runner.rb +13 -12
- data/plugins/ruby_runner/ui/config_widget.rb +2 -2
- data/plugins/ruby_runner/ui/project_widget.rb +2 -2
- data/plugins/ruby_runner/ui/ruby_runnner_plugin_option_widget.rb +2 -2
- data/plugins/state/ui/config_widget.rb +2 -2
- data/plugins/syntax_checker/syntax_checker.rb +1 -1
- data/spec/auto_end_spec.rb +272 -0
- data/spec/common.rb +1 -0
- data/spec/document_spec.rb +83 -0
- data/spec/editor_view_spec.rb +41 -0
- data/spec/filtered_output_widget_spec.rb +2 -2
- data/spec/ktexteditor_sugar_spec.rb +190 -0
- data/spec/output_widget_spec.rb +120 -11
- data/spec/pane_spec.rb +1 -1
- data/spec/qt_sugar_spec.rb +14 -0
- data/spec/state_spec.rb +0 -26
- metadata +14 -3
data/plugins/rspec/rspecui.rc
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
<!DOCTYPE kpartgui SYSTEM 'kpartgui.dtd'>
|
2
|
-
<kpartgui version="
|
2
|
+
<kpartgui version="2" name="ruber-rspec_plugin" >
|
3
3
|
<MenuBar>
|
4
4
|
<Menu noMerge="1" name="ruby" >
|
5
5
|
<text>&Ruby</text>
|
6
6
|
<Separator/>
|
7
7
|
<Menu noMerge="1" name="rspec">
|
8
8
|
<text>&Tests</text>
|
9
|
-
<Action name="rspec-
|
10
|
-
<Action name="rspec-go_to_file"/>
|
9
|
+
<Action name="rspec-switch"/>
|
11
10
|
<Separator/>
|
12
11
|
<Action name="rspec-run_all" />
|
13
12
|
<Action name="rspec-run_current"/>
|
@@ -0,0 +1,79 @@
|
|
1
|
+
=begin
|
2
|
+
** Form generated from reading ui file 'config_widget.ui'
|
3
|
+
**
|
4
|
+
** Created: dom gen 30 12:01:53 2011
|
5
|
+
** by: Qt User Interface Compiler version 4.7.1
|
6
|
+
**
|
7
|
+
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
8
|
+
=end
|
9
|
+
|
10
|
+
class Ui_RSpecConfigWidget
|
11
|
+
attr_reader :gridLayout
|
12
|
+
attr_reader :label
|
13
|
+
attr_reader :_rspec__switch_behaviour
|
14
|
+
attr_reader :label_2
|
15
|
+
attr_reader :_rspec__auto_expand
|
16
|
+
|
17
|
+
def setupUi(rSpecConfigWidget)
|
18
|
+
if rSpecConfigWidget.objectName.nil?
|
19
|
+
rSpecConfigWidget.objectName = "rSpecConfigWidget"
|
20
|
+
end
|
21
|
+
rSpecConfigWidget.resize(400, 49)
|
22
|
+
@gridLayout = Qt::GridLayout.new(rSpecConfigWidget)
|
23
|
+
@gridLayout.objectName = "gridLayout"
|
24
|
+
@label = Qt::Label.new(rSpecConfigWidget)
|
25
|
+
@label.objectName = "label"
|
26
|
+
|
27
|
+
@gridLayout.addWidget(@label, 0, 0, 1, 1)
|
28
|
+
|
29
|
+
@_rspec__switch_behaviour = KDE::ComboBox.new(rSpecConfigWidget)
|
30
|
+
@_rspec__switch_behaviour.objectName = "_rspec__switch_behaviour"
|
31
|
+
|
32
|
+
@gridLayout.addWidget(@_rspec__switch_behaviour, 0, 1, 1, 1)
|
33
|
+
|
34
|
+
@label_2 = Qt::Label.new(rSpecConfigWidget)
|
35
|
+
@label_2.objectName = "label_2"
|
36
|
+
|
37
|
+
@gridLayout.addWidget(@label_2, 1, 0, 1, 1)
|
38
|
+
|
39
|
+
@_rspec__auto_expand = KDE::ComboBox.new(rSpecConfigWidget)
|
40
|
+
@_rspec__auto_expand.objectName = "_rspec__auto_expand"
|
41
|
+
|
42
|
+
@gridLayout.addWidget(@_rspec__auto_expand, 1, 1, 1, 1)
|
43
|
+
|
44
|
+
@label.buddy = @_rspec__switch_behaviour
|
45
|
+
@label_2.buddy = @_rspec__auto_expand
|
46
|
+
|
47
|
+
retranslateUi(rSpecConfigWidget)
|
48
|
+
|
49
|
+
Qt::MetaObject.connectSlotsByName(rSpecConfigWidget)
|
50
|
+
end # setupUi
|
51
|
+
|
52
|
+
def setup_ui(rSpecConfigWidget)
|
53
|
+
setupUi(rSpecConfigWidget)
|
54
|
+
end
|
55
|
+
|
56
|
+
def retranslateUi(rSpecConfigWidget)
|
57
|
+
rSpecConfigWidget.windowTitle = Qt::Application.translate("RSpecConfigWidget", "Form", nil, Qt::Application::UnicodeUTF8)
|
58
|
+
@label.text = Qt::Application.translate("RSpecConfigWidget", "&Open spec/code file", nil, Qt::Application::UnicodeUTF8)
|
59
|
+
@_rspec__switch_behaviour.insertItems(0, [Qt::Application.translate("RSpecConfigWidget", "In a new tab", nil, Qt::Application::UnicodeUTF8),
|
60
|
+
Qt::Application.translate("RSpecConfigWidget", "Splitting horizontally the current tab", nil, Qt::Application::UnicodeUTF8),
|
61
|
+
Qt::Application.translate("RSpecConfigWidget", "Splitting vertically the current tab", nil, Qt::Application::UnicodeUTF8)])
|
62
|
+
@label_2.text = Qt::Application.translate("RSpecConfigWidget", "&After running rspec", nil, Qt::Application::UnicodeUTF8)
|
63
|
+
@_rspec__auto_expand.insertItems(0, [Qt::Application.translate("RSpecConfigWidget", "Collapse all examples", nil, Qt::Application::UnicodeUTF8),
|
64
|
+
Qt::Application.translate("RSpecConfigWidget", "Expand first failed or pending example", nil, Qt::Application::UnicodeUTF8),
|
65
|
+
Qt::Application.translate("RSpecConfigWidget", "Expand all failed or pending examples (slow)", nil, Qt::Application::UnicodeUTF8)])
|
66
|
+
@_rspec__auto_expand.setProperty("access", Qt::Variant.new(Qt::Application.translate("RSpecConfigWidget", "$auto_expand", nil, Qt::Application::UnicodeUTF8)))
|
67
|
+
end # retranslateUi
|
68
|
+
|
69
|
+
def retranslate_ui(rSpecConfigWidget)
|
70
|
+
retranslateUi(rSpecConfigWidget)
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
module Ui
|
76
|
+
class RSpecConfigWidget < Ui_RSpecConfigWidget
|
77
|
+
end
|
78
|
+
end # module Ui
|
79
|
+
|
@@ -0,0 +1,89 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<ui version="4.0">
|
3
|
+
<class>RSpecConfigWidget</class>
|
4
|
+
<widget class="QWidget" name="RSpecConfigWidget">
|
5
|
+
<property name="geometry">
|
6
|
+
<rect>
|
7
|
+
<x>0</x>
|
8
|
+
<y>0</y>
|
9
|
+
<width>400</width>
|
10
|
+
<height>49</height>
|
11
|
+
</rect>
|
12
|
+
</property>
|
13
|
+
<property name="windowTitle">
|
14
|
+
<string>Form</string>
|
15
|
+
</property>
|
16
|
+
<layout class="QGridLayout" name="gridLayout">
|
17
|
+
<item row="0" column="0">
|
18
|
+
<widget class="QLabel" name="label">
|
19
|
+
<property name="text">
|
20
|
+
<string>&Open spec/code file</string>
|
21
|
+
</property>
|
22
|
+
<property name="buddy">
|
23
|
+
<cstring>_rspec__switch_behaviour</cstring>
|
24
|
+
</property>
|
25
|
+
</widget>
|
26
|
+
</item>
|
27
|
+
<item row="0" column="1">
|
28
|
+
<widget class="KComboBox" name="_rspec__switch_behaviour">
|
29
|
+
<item>
|
30
|
+
<property name="text">
|
31
|
+
<string>In a new tab</string>
|
32
|
+
</property>
|
33
|
+
</item>
|
34
|
+
<item>
|
35
|
+
<property name="text">
|
36
|
+
<string>Splitting horizontally the current tab</string>
|
37
|
+
</property>
|
38
|
+
</item>
|
39
|
+
<item>
|
40
|
+
<property name="text">
|
41
|
+
<string>Splitting vertically the current tab</string>
|
42
|
+
</property>
|
43
|
+
</item>
|
44
|
+
</widget>
|
45
|
+
</item>
|
46
|
+
<item row="1" column="0">
|
47
|
+
<widget class="QLabel" name="label_2">
|
48
|
+
<property name="text">
|
49
|
+
<string>&After running rspec</string>
|
50
|
+
</property>
|
51
|
+
<property name="buddy">
|
52
|
+
<cstring>_rspec__auto_expand</cstring>
|
53
|
+
</property>
|
54
|
+
</widget>
|
55
|
+
</item>
|
56
|
+
<item row="1" column="1">
|
57
|
+
<widget class="KComboBox" name="_rspec__auto_expand">
|
58
|
+
<property name="access" stdset="0">
|
59
|
+
<string>$auto_expand</string>
|
60
|
+
</property>
|
61
|
+
<item>
|
62
|
+
<property name="text">
|
63
|
+
<string>Collapse all examples</string>
|
64
|
+
</property>
|
65
|
+
</item>
|
66
|
+
<item>
|
67
|
+
<property name="text">
|
68
|
+
<string>Expand first failed or pending example</string>
|
69
|
+
</property>
|
70
|
+
</item>
|
71
|
+
<item>
|
72
|
+
<property name="text">
|
73
|
+
<string>Expand all failed or pending examples (slow)</string>
|
74
|
+
</property>
|
75
|
+
</item>
|
76
|
+
</widget>
|
77
|
+
</item>
|
78
|
+
</layout>
|
79
|
+
</widget>
|
80
|
+
<customwidgets>
|
81
|
+
<customwidget>
|
82
|
+
<class>KComboBox</class>
|
83
|
+
<extends>QComboBox</extends>
|
84
|
+
<header>kcombobox.h</header>
|
85
|
+
</customwidget>
|
86
|
+
</customwidgets>
|
87
|
+
<resources/>
|
88
|
+
<connections/>
|
89
|
+
</ui>
|
@@ -1,8 +1,8 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'rspec_project_widget.ui'
|
3
3
|
**
|
4
|
-
** Created:
|
5
|
-
** by: Qt User Interface Compiler version 4.7.
|
4
|
+
** Created: mer gen 12 12:12:11 2011
|
5
|
+
** by: Qt User Interface Compiler version 4.7.1
|
6
6
|
**
|
7
7
|
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
8
8
|
=end
|
@@ -270,7 +270,7 @@ was started. If the user pressed the Cancel button of the dialog, *nil* is retur
|
|
270
270
|
@fake_file = FakeFileInfo.new Tempfile.new('ruby_development'), url
|
271
271
|
downloaded = KIO::NetAccess.download url, @fake_file.file.path, Ruber[:main_window]
|
272
272
|
unless downloaded
|
273
|
-
KDE::MessageBox.sorry Ruber[:main_window],
|
273
|
+
KDE::MessageBox.sorry Ruber[:main_window], KIO::NetAccess.last_error_string
|
274
274
|
return
|
275
275
|
end
|
276
276
|
file = @fake_file.file.path
|
@@ -1,7 +1,7 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'config_widget.ui'
|
3
3
|
**
|
4
|
-
** Created:
|
4
|
+
** Created: mer gen 12 12:12:11 2011
|
5
5
|
** by: Qt User Interface Compiler version 4.7.1
|
6
6
|
**
|
7
7
|
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
@@ -1,8 +1,8 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'project_widget.ui'
|
3
3
|
**
|
4
|
-
** Created:
|
5
|
-
** by: Qt User Interface Compiler version 4.7.
|
4
|
+
** Created: mer gen 12 12:12:11 2011
|
5
|
+
** by: Qt User Interface Compiler version 4.7.1
|
6
6
|
**
|
7
7
|
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
8
8
|
=end
|
@@ -197,6 +197,19 @@ be used.
|
|
197
197
|
chosen_interpreter
|
198
198
|
end
|
199
199
|
|
200
|
+
=begin rdoc
|
201
|
+
Override of {PluginLike#unload}
|
202
|
+
|
203
|
+
Besides doing the same as the base class method, it also removes the @Ruber::RubyRunner::RubyRunnerPlugin@
|
204
|
+
constant, so that other plugins may reimplement it using another base class.
|
205
|
+
@return [nil]
|
206
|
+
=end
|
207
|
+
def unload
|
208
|
+
Ruber::RubyRunner.send :remove_const, :RubyRunnerPlugin
|
209
|
+
super
|
210
|
+
end
|
211
|
+
|
212
|
+
|
200
213
|
private
|
201
214
|
|
202
215
|
=begin rdoc
|
@@ -243,19 +256,7 @@ default entry is selected.
|
|
243
256
|
end
|
244
257
|
nil
|
245
258
|
end
|
246
|
-
|
247
|
-
=begin rdoc
|
248
|
-
Override of {PluginLike#unload}
|
249
259
|
|
250
|
-
Besides doing the same as the base class method, it also removes the @Ruber::RubyRunner::RubyRunnerPlugin@
|
251
|
-
constant, so that other plugins may reimplement it using another base class.
|
252
|
-
@return [nil]
|
253
|
-
=end
|
254
|
-
def unload
|
255
|
-
Ruber::RubyRunner.send :remove_const, :RubyRunnerPlugin
|
256
|
-
super
|
257
|
-
end
|
258
|
-
|
259
260
|
end
|
260
261
|
|
261
262
|
=begin
|
@@ -1,8 +1,8 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'config_widget.ui'
|
3
3
|
**
|
4
|
-
** Created:
|
5
|
-
** by: Qt User Interface Compiler version 4.7.
|
4
|
+
** Created: mer gen 12 12:12:11 2011
|
5
|
+
** by: Qt User Interface Compiler version 4.7.1
|
6
6
|
**
|
7
7
|
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
8
8
|
=end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'project_widget.ui'
|
3
3
|
**
|
4
|
-
** Created:
|
5
|
-
** by: Qt User Interface Compiler version 4.7.
|
4
|
+
** Created: mer gen 12 12:12:11 2011
|
5
|
+
** by: Qt User Interface Compiler version 4.7.1
|
6
6
|
**
|
7
7
|
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
8
8
|
=end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'ruby_runnner_plugin_option_widget.ui'
|
3
3
|
**
|
4
|
-
** Created:
|
5
|
-
** by: Qt User Interface Compiler version 4.7.
|
4
|
+
** Created: mer gen 12 12:12:11 2011
|
5
|
+
** by: Qt User Interface Compiler version 4.7.1
|
6
6
|
**
|
7
7
|
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
8
8
|
=end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'config_widget.ui'
|
3
3
|
**
|
4
|
-
** Created:
|
5
|
-
** by: Qt User Interface Compiler version 4.7.
|
4
|
+
** Created: mer gen 12 12:12:11 2011
|
5
|
+
** by: Qt User Interface Compiler version 4.7.1
|
6
6
|
**
|
7
7
|
** WARNING! All changes made in this file will be lost when recompiling ui file!
|
8
8
|
=end
|
@@ -0,0 +1,272 @@
|
|
1
|
+
require './spec/framework'
|
2
|
+
require './spec/common'
|
3
|
+
require 'plugins/auto_end/auto_end'
|
4
|
+
require 'tempfile'
|
5
|
+
|
6
|
+
module InsertionChecker
|
7
|
+
|
8
|
+
def it_should_insert_end cond, text, initial_text, exp_text, cursor_pos = [2, 0]
|
9
|
+
lines = initial_text.split "\n"
|
10
|
+
insert_pos = lines.find_and_map do |l|
|
11
|
+
if l.include? '%'
|
12
|
+
[lines.index(l), l.index('%')]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
insert_pos ||= [initial_text.each_line.count, 0]
|
16
|
+
insert_pos = KTextEditor::Cursor.new *insert_pos
|
17
|
+
|
18
|
+
context cond do
|
19
|
+
|
20
|
+
context "and the active view is associated with the document" do
|
21
|
+
|
22
|
+
before do
|
23
|
+
@view = @doc.create_view
|
24
|
+
flexmock(@doc).should_receive(:active_view).and_return @view
|
25
|
+
@doc.block_signals true
|
26
|
+
@doc.text= initial_text.sub '%', ''
|
27
|
+
@doc.block_signals false
|
28
|
+
#avoid messing up the text with indentation
|
29
|
+
flexmock(@view).should_receive(:execute_action).with('tools_align').by_default
|
30
|
+
end
|
31
|
+
|
32
|
+
it "inserts an an empty line followed by and end keyword" do
|
33
|
+
lines = text.split
|
34
|
+
@doc.insert_text insert_pos, text
|
35
|
+
@doc.text.should == exp_text
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'indents the text' do
|
39
|
+
flexmock(@view).should_receive(:execute_action).with('tools_align').once
|
40
|
+
@doc.insert_text insert_pos, text
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'moves the cursor to the line before the end' do
|
44
|
+
@doc.insert_text insert_pos, text
|
45
|
+
@view.cursor_position.should == KTextEditor::Cursor.new(*cursor_pos)
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'and the active view is not associated with the document' do
|
51
|
+
|
52
|
+
it 'does nothing' do
|
53
|
+
flexmock(@doc).should_receive(:active_view).and_return nil
|
54
|
+
old_text = @doc.text
|
55
|
+
@doc.insert_text insert_pos, text
|
56
|
+
@doc.text.should == old_text
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
describe Ruber::AutoEnd::Extension do
|
68
|
+
|
69
|
+
extend InsertionChecker
|
70
|
+
|
71
|
+
before do
|
72
|
+
Ruber[:components].load_plugin 'plugins/auto_end/'
|
73
|
+
@file = Tempfile.new ['auto_end_test', '.rb']
|
74
|
+
@doc = Ruber[:documents].document @file.path
|
75
|
+
@ext = @doc.extension(:auto_end)
|
76
|
+
end
|
77
|
+
|
78
|
+
after do
|
79
|
+
Ruber[:components].unload_plugin :auto_end
|
80
|
+
@file.close true
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'includes the Extension module' do
|
84
|
+
Ruber::AutoEnd::Extension.should include(Ruber::Extension)
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'inherits Qt::Object' do
|
88
|
+
Ruber::AutoEnd::Extension.ancestors.should include(Qt::Object)
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'when created' do
|
92
|
+
|
93
|
+
it 'connects the text_inserted(KTextEditor::Range, QObject*) signal of the document with the text_inserted(KTextEditor::Range) slot' do
|
94
|
+
range = KTextEditor::Range.new 2, 3, 5, 6
|
95
|
+
flexmock(@ext).should_receive(:text_inserted).once.with range
|
96
|
+
@doc.instance_eval{emit text_inserted(range, self)}
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
context 'when a piece of text not ending in a newline is inserted' do
|
102
|
+
|
103
|
+
it 'does nothing' do
|
104
|
+
@doc.text = "xyz\nabc"
|
105
|
+
@doc.insert_text KTextEditor::Cursor.new(1,2), 'X'
|
106
|
+
@doc.text.should == "xyz\nabXc"
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
context 'when a piece of text ending with a newline is inserted' do
|
112
|
+
|
113
|
+
context 'and the last line contains a module' do
|
114
|
+
|
115
|
+
it_should_insert_end "if the module is at the beginning of the line and followed by spaces, an identifier, possible spaces and end of line", "module xY_12a\n", "module X\n%\nend", "module X\nmodule xY_12a\n\nend\nend"
|
116
|
+
|
117
|
+
it_should_insert_end "if the module is at the beginning of the line, preceded only by spaces and followed by spaces, an identifier, possible spaces and end of line", " module xY_12a \n", "module X\n%\nend", "module X\n module xY_12a \n\nend\nend"
|
118
|
+
|
119
|
+
it 'does not insert an end keyword if the identifier is followed by anything but spaces or other identifers separated by ::' do
|
120
|
+
@doc.block_signals true
|
121
|
+
@doc.text = "module X\n\nend"
|
122
|
+
@doc.block_signals false
|
123
|
+
@doc.insert_text KTextEditor::Cursor.new(1,0), 'module Y a.b'
|
124
|
+
@doc.text.should == "module X\nmodule Y a.b\nend"
|
125
|
+
end
|
126
|
+
|
127
|
+
it_should_insert_end "if the module is at the beginning of the line and followed by spaces, a sequence of identifiers separated by ::, possible spaces and end of line", "module xY_12a::Ac::By\n", "module X\n%\nend", "module X\nmodule xY_12a::Ac::By\n\nend\nend"
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
context 'and the last line contains a class' do
|
132
|
+
|
133
|
+
it_should_insert_end "if the class is at the beginning of the line and followed by spaces, an identifier, possible spaces and end of line", "class xY_12a\n", "module X\n%\nend", "module X\nclass xY_12a\n\nend\nend"
|
134
|
+
|
135
|
+
it_should_insert_end "if the class is at the beginning of the line and followed by spaces, an identifier, a <, another identifier, possible spaces and end of line", "class xY_12a < Ba6_1\n", "module X\n%\nend", "module X\nclass xY_12a < Ba6_1\n\nend\nend"
|
136
|
+
|
137
|
+
it_should_insert_end "if the class is at the beginning of the line and followed by spaces, an identifier, a <<, another identifier, possible spaces and end of line", "class xY_12a << Ba6_1\n", "module X\n%\nend", "module X\nclass xY_12a << Ba6_1\n\nend\nend"
|
138
|
+
|
139
|
+
it_should_insert_end "in all the previous cases if there are more than one identifier separated by :: instead of a single identifier", "class A::B < C::D\n", "module X\n%\nend", "module X\nclass A::B < C::D\n\nend\nend"
|
140
|
+
|
141
|
+
end
|
142
|
+
|
143
|
+
context "and the last line contains a def" do
|
144
|
+
|
145
|
+
it_should_insert_end "if the def is at the beginning of the line", "def xyz a, b\n", "class X\n%\nend", "class X\ndef xyz a, b\n\nend\nend"
|
146
|
+
|
147
|
+
it_should_insert_end 'if the def is preceded only by spaces', " def xyz a, b\n", "class X\n%\nend", "class X\n def xyz a, b\n\nend\nend"
|
148
|
+
|
149
|
+
end
|
150
|
+
|
151
|
+
context "and the last line contains an if " do
|
152
|
+
|
153
|
+
it_should_insert_end "if the if is at the beginning of the line", "if kkk\n", "class X\n%\nend", "class X\nif kkk\n\nend\nend", [2, 0]
|
154
|
+
|
155
|
+
it_should_insert_end "if the if is preceded only by whitespaces", " if kkk\n", "class X\n%\nend", "class X\n if kkk\n\nend\nend", [2, 0]
|
156
|
+
|
157
|
+
it_should_insert_end 'if the if is preceded by an =', "x =if kkk\n",
|
158
|
+
"class X\n%\nend", "class X\nx =if kkk\n\nend\nend"
|
159
|
+
|
160
|
+
it_should_insert_end 'if the if is preceded by an = followed by spaces', "x = if kkk\n", "class X\n%\nend", "class X\nx = if kkk\n\nend\nend"
|
161
|
+
|
162
|
+
end
|
163
|
+
|
164
|
+
context "and the line contains a do" do
|
165
|
+
|
166
|
+
it_should_insert_end "if the do is at the end of the line", "x.each do\n", "def y x\n%\nend", "def y x\nx.each do\n\nend\nend", [2, 0]
|
167
|
+
|
168
|
+
it_should_insert_end "if the do is only followed by whitespaces", " x.each do\n", "def y x\n%\nend", "def y x\n x.each do\n\nend\nend", [2, 0]
|
169
|
+
|
170
|
+
it_should_insert_end "if the do is followed by spaces and a pipe char", " x.each do |a|\n", "def y x\n%\nend", "def y x\n x.each do |a|\n\nend\nend", [2, 0]
|
171
|
+
|
172
|
+
it 'does nothing if the first character of the line is a #' do
|
173
|
+
@doc.block_signals true
|
174
|
+
@doc.text = "def x\n\nend"
|
175
|
+
@doc.block_signals false
|
176
|
+
@doc.insert_text KTextEditor::Cursor.new(1,0), "# a.each do\n"
|
177
|
+
@doc.text.should == "def x\n# a.each do\n\nend"
|
178
|
+
end
|
179
|
+
|
180
|
+
it 'does nothing if the line starts with spaces followed by a #' do
|
181
|
+
@doc.block_signals true
|
182
|
+
@doc.text = "def x\n\nend"
|
183
|
+
@doc.block_signals false
|
184
|
+
@doc.insert_text KTextEditor::Cursor.new(1,0), " # a.each do\n"
|
185
|
+
@doc.text.should == "def x\n # a.each do\n\nend"
|
186
|
+
end
|
187
|
+
|
188
|
+
end
|
189
|
+
|
190
|
+
context "and the last line contains a begin" do
|
191
|
+
|
192
|
+
it_should_insert_end "if the begin is at the beginning of the line", "begin kkk\n", "class X\n%\nend", "class X\nbegin kkk\n\nend\nend", [2, 0]
|
193
|
+
|
194
|
+
it_should_insert_end "if the begin is preceded only by whitespaces", " begin kkk\n", "class X\n%\nend", "class X\n begin kkk\n\nend\nend", [2, 0]
|
195
|
+
|
196
|
+
it_should_insert_end 'if the begin is preceded by an =', "x =begin kkk\n",
|
197
|
+
"class X\n%\nend", "class X\nx =begin kkk\n\nend\nend"
|
198
|
+
|
199
|
+
it_should_insert_end 'if the begin is preceded by an = followed by spaces', "x = begin kkk\n", "class X\n%\nend", "class X\nx = begin kkk\n\nend\nend"
|
200
|
+
|
201
|
+
end
|
202
|
+
|
203
|
+
context "and the last line starts with =begin" do
|
204
|
+
|
205
|
+
context "and the active view is associated with the document" do
|
206
|
+
|
207
|
+
before do
|
208
|
+
@view = @doc.create_view
|
209
|
+
flexmock(@doc).should_receive(:active_view).and_return @view
|
210
|
+
@doc.block_signals true
|
211
|
+
@doc.text= "abc\n"
|
212
|
+
@doc.block_signals false
|
213
|
+
@insert_pos = KTextEditor::Cursor.new(1,0)
|
214
|
+
#avoid messing up the text with indentation
|
215
|
+
flexmock(@view).should_receive(:execute_action).with('tools_align').by_default
|
216
|
+
end
|
217
|
+
|
218
|
+
it "inserts an an empty line followed by a =end" do
|
219
|
+
@doc.insert_text @insert_pos, "=begin xyz\n"
|
220
|
+
@doc.text.should == "abc\n=begin xyz\n\n=end"
|
221
|
+
end
|
222
|
+
|
223
|
+
it 'indents the text' do
|
224
|
+
flexmock(@view).should_receive(:execute_action).with('tools_align').once
|
225
|
+
@doc.insert_text @insert_pos, "=begin xyz\n"
|
226
|
+
end
|
227
|
+
|
228
|
+
it 'moves the cursor to the line before the end' do
|
229
|
+
@doc.insert_text @insert_pos, "=begin xyz\n"
|
230
|
+
@view.cursor_position.should == KTextEditor::Cursor.new(2,0)
|
231
|
+
end
|
232
|
+
|
233
|
+
end
|
234
|
+
|
235
|
+
context 'and the active view is not associated with the document' do
|
236
|
+
|
237
|
+
it 'does nothing' do
|
238
|
+
flexmock(@doc).should_receive(:active_view).and_return nil
|
239
|
+
@doc.block_signals true
|
240
|
+
old_text = "abc\n"
|
241
|
+
@doc.text = old_text
|
242
|
+
@doc.block_signals false
|
243
|
+
@doc.insert_text KTextEditor::Cursor.new(1,0), "=begin xyz\n"
|
244
|
+
@doc.text.should == "abc\n=begin xyz\n"
|
245
|
+
end
|
246
|
+
|
247
|
+
end
|
248
|
+
|
249
|
+
end
|
250
|
+
|
251
|
+
end
|
252
|
+
|
253
|
+
it 'doesn\'t insert end keywords in the middle of a multi-line text' do
|
254
|
+
view = @doc.create_view
|
255
|
+
flexmock(@doc).should_receive(:active_view).and_return view
|
256
|
+
text = "class X\ndef y\n\nend\nend"
|
257
|
+
@doc.insert_text KTextEditor::Cursor.new(0,0), text
|
258
|
+
@doc.text.should == text
|
259
|
+
end
|
260
|
+
|
261
|
+
it 'doesn\'t insert an end keyword if the following line is more indented than the current one' do
|
262
|
+
view = @doc.create_view
|
263
|
+
flexmock(@doc).should_receive(:active_view).and_return view
|
264
|
+
text = "class X\n def y\n abc"
|
265
|
+
@doc.block_signals true
|
266
|
+
@doc.insert_text KTextEditor::Cursor.new(0,0), text
|
267
|
+
@doc.block_signals false
|
268
|
+
@doc.insert_text KTextEditor::Cursor.new(1,8), "\nY"
|
269
|
+
@doc.text.should == "class X\n def y\nY\n abc"
|
270
|
+
end
|
271
|
+
|
272
|
+
end
|