ruber 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- 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/lib/ruber/pane.rb
CHANGED
@@ -96,6 +96,10 @@ allow to resize it. It *must not* be used to add or remove widgets to or from it
|
|
96
96
|
margins.top = margins.left = margins.bottom = margins.right = 0
|
97
97
|
layout.contents_margins = margins
|
98
98
|
@label = Qt::Label.new '', self
|
99
|
+
# Use the following three lines when attempting to debug issue number 10, as it
|
100
|
+
# helps understanding which pane each label belongs to
|
101
|
+
# color = Qt::Color.new(rand(256), rand(256), rand(256))
|
102
|
+
# @label.style_sheet = "background-color: #{color.name};"
|
99
103
|
@label.hide unless parent_pane
|
100
104
|
layout.add_widget @label
|
101
105
|
end
|
@@ -314,6 +318,22 @@ Iterates on child panes
|
|
314
318
|
self
|
315
319
|
end
|
316
320
|
|
321
|
+
=begin rdoc
|
322
|
+
The panes contained in this pane
|
323
|
+
|
324
|
+
@overload panes(:recursive)
|
325
|
+
@return [Array<Pane>] an array containing the panes contained in this pane,
|
326
|
+
directly or indirectly. Returns an empty array if the pane is in single view
|
327
|
+
mode
|
328
|
+
@overload panes
|
329
|
+
@return [Array<Pane>] an array containing the panes directly contained in this pane.
|
330
|
+
Returns an empty array if the pane is in single view mode
|
331
|
+
@return [Array<Pane>]
|
332
|
+
=end
|
333
|
+
def panes mode = :flat
|
334
|
+
single_view? ? [] : each_pane(mode).to_a
|
335
|
+
end
|
336
|
+
|
317
337
|
=begin rdoc
|
318
338
|
Changes the text of the label for the given view
|
319
339
|
|
@@ -500,6 +520,8 @@ It does nothing if the splitter is already in single view mode
|
|
500
520
|
self.label = label
|
501
521
|
@label.visible = false unless parent_pane
|
502
522
|
connect @view, SIGNAL('closing(QWidget*)'), self, SLOT('remove_view(QWidget*)')
|
523
|
+
@splitter.delete_later
|
524
|
+
@splitter = nil
|
503
525
|
self
|
504
526
|
end
|
505
527
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'project_files_rule_chooser_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_files_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
|
data/lib/ruber/qt_sugar.rb
CHANGED
data/lib/ruber/version.rb
CHANGED
@@ -0,0 +1,122 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (C) 2011 by Stefano Crocco
|
3
|
+
stefano.crocco@alice.it
|
4
|
+
|
5
|
+
This program is free software; you can redistribute it andor modify
|
6
|
+
it under the terms of the GNU General Public License as published by
|
7
|
+
the Free Software Foundation; either version 2 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU General Public License
|
16
|
+
along with this program; if not, write to the
|
17
|
+
Free Software Foundation, Inc.,
|
18
|
+
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
19
|
+
=end
|
20
|
+
|
21
|
+
module Ruber
|
22
|
+
|
23
|
+
module AutoEnd
|
24
|
+
|
25
|
+
class Extension < Qt::Object
|
26
|
+
|
27
|
+
include Ruber::Extension
|
28
|
+
|
29
|
+
Insertion = Struct.new :line_number, :lines, :final_position
|
30
|
+
|
31
|
+
IDENTIFIER_PATTERN = RUBY_VERSION >= '1.9.2' ? '\p{Word}+' : '\w+'
|
32
|
+
|
33
|
+
MULTI_ID_PATTERN = "#{IDENTIFIER_PATTERN}(?:::#{IDENTIFIER_PATTERN})*"
|
34
|
+
|
35
|
+
PATTERNS = [
|
36
|
+
[/^\s*if\s/, "\nend", [0, -1]],
|
37
|
+
[/=\s*if\s/, "\nend", [0, -1]],
|
38
|
+
[/\bdo\s*$/, "\nend", [0, -1]],
|
39
|
+
[/\bdo\s+\|/, "\nend", [0, -1]],
|
40
|
+
[/^\s*def\s/, "\nend", [0, -1]],
|
41
|
+
[/^class\s+#{IDENTIFIER_PATTERN}\s*$/, "\nend", [0, -1]],
|
42
|
+
[/^class\s+#{MULTI_ID_PATTERN}\s*<{1,2}\s*#{MULTI_ID_PATTERN}\s*$/, "\nend", [0, -1]],
|
43
|
+
[/^\s*module\s+#{MULTI_ID_PATTERN}\s*$/, "\nend", [0,-1]],
|
44
|
+
[/^=begin(\s|$)/, "\n=end", [0, -1]],
|
45
|
+
[/^\s*begin\s/, "\nend", [0, -1]],
|
46
|
+
[/=\s*begin\s/, "\nend", [0, -1]],
|
47
|
+
]
|
48
|
+
|
49
|
+
def initialize prj
|
50
|
+
super
|
51
|
+
@doc = prj.document
|
52
|
+
@insertion = nil
|
53
|
+
connect_slots
|
54
|
+
end
|
55
|
+
|
56
|
+
def text_inserted range
|
57
|
+
text = @doc.text range
|
58
|
+
return unless text.end_with? "\n"
|
59
|
+
@insertion = nil
|
60
|
+
line = @doc.line( range.end.line - 1)
|
61
|
+
pattern = PATTERNS.find{|pat| pat[0].match line}
|
62
|
+
if pattern and !line.start_with? '#'
|
63
|
+
indentation = line.match(/^\s*/)[0].size
|
64
|
+
next_indentation = @doc.line(range.end.line + 1).match(/^\s*/)[0].size
|
65
|
+
unless next_indentation > indentation
|
66
|
+
@insertion = Insertion.new range.end.line, pattern[1], pattern[2]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
slots 'text_inserted(KTextEditor::Range)'
|
71
|
+
|
72
|
+
def text_changed
|
73
|
+
if @insertion
|
74
|
+
insert_text KTextEditor::Cursor.new(@insertion.line_number, 0),
|
75
|
+
@insertion.lines, @insertion.final_position
|
76
|
+
@insertion = nil
|
77
|
+
end
|
78
|
+
end
|
79
|
+
slots :text_changed
|
80
|
+
|
81
|
+
def remove_from_project
|
82
|
+
disconnect_slots
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def connect_slots
|
88
|
+
connect @doc, SIGNAL('text_inserted(KTextEditor::Range, QObject*)'), self, SLOT('text_inserted(KTextEditor::Range)')
|
89
|
+
connect @doc, SIGNAL('text_changed(QObject*)'), self, SLOT(:text_changed)
|
90
|
+
end
|
91
|
+
|
92
|
+
def disconnect_slots
|
93
|
+
disconnect @doc, SIGNAL('text_inserted(KTextEditor::Range, QObject*)'), self, SLOT('text_inserted(KTextEditor::Range)')
|
94
|
+
disconnect @doc, SIGNAL('text_changed(QObject*)'), self, SLOT(:text_changed)
|
95
|
+
end
|
96
|
+
|
97
|
+
def insert_text insert_pos, lines, dest
|
98
|
+
view = @doc.active_view
|
99
|
+
return unless view
|
100
|
+
disconnect_slots
|
101
|
+
replace_pos = KTextEditor::Cursor.new insert_pos.line, @doc.line_length(insert_pos.line)
|
102
|
+
insert_pos.column = @doc.line_length insert_pos.line
|
103
|
+
@doc.insert_text insert_pos, lines
|
104
|
+
final_pos = KTextEditor::Cursor.new insert_pos.line + lines.size - 1,
|
105
|
+
lines[-1].size
|
106
|
+
do_indentation view
|
107
|
+
dest_line = insert_pos.line+dest[0]
|
108
|
+
dest_col = dest[1]
|
109
|
+
dest_col += @doc.line_length(dest_line) + 1 if dest_col < 0
|
110
|
+
view.go_to dest_line, dest_col
|
111
|
+
connect_slots
|
112
|
+
end
|
113
|
+
|
114
|
+
def do_indentation view
|
115
|
+
view.execute_action 'tools_align'
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
name: auto_end
|
2
|
+
version: 0.0.1
|
3
|
+
about:
|
4
|
+
authors: [Stefano Crocco, stefano.crocco@alice.it]
|
5
|
+
license: gpl
|
6
|
+
description: Automatically inserts end keywords after if, do and similar statements
|
7
|
+
bug_address: stefano.crocco@alice.it
|
8
|
+
require: auto_end
|
9
|
+
extensions:
|
10
|
+
auto_end: {class: Ruber::AutoEnd::Extension, scope: document, file_extension: ['*.rb', 'Rakefile', 'rakefile', '*.gemspec'], mimetype: ['application/x-ruby']}
|
11
|
+
|
@@ -1,8 +1,8 @@
|
|
1
1
|
=begin
|
2
2
|
** Form generated from reading ui file 'autosave_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
|
data/plugins/command/command.rb
CHANGED
@@ -1,3 +1,26 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (C) 2010,2011 by Stefano Crocco
|
3
|
+
stefano.crocco@alice.it
|
4
|
+
|
5
|
+
This program is free software; you can redistribute it andor modify
|
6
|
+
it under the terms of the GNU General Public License as published by
|
7
|
+
the Free Software Foundation; either version 2 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU General Public License
|
16
|
+
along with this program; if not, write to the
|
17
|
+
Free Software Foundation, Inc.,
|
18
|
+
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
19
|
+
=end
|
20
|
+
|
21
|
+
require 'command/output'
|
22
|
+
require_relative 'ui/tool_widget'
|
23
|
+
|
1
24
|
module Ruber
|
2
25
|
|
3
26
|
=begin rdoc
|
@@ -7,7 +30,9 @@ plugin, which simply starts a new ruby interpreter and runs a script in it).
|
|
7
30
|
|
8
31
|
This plugin doesn't provide a plugin class but just a tool widget where the user
|
9
32
|
can enter the code and a button to execute it. It also doesn't provide any
|
10
|
-
API for the feature.
|
33
|
+
API for the feature. Beside the editor widget, the plugin also provides an output
|
34
|
+
widget, where the text written to standard output and standard error by the code
|
35
|
+
executed will be displayed.
|
11
36
|
|
12
37
|
*Note:* the ruby code is executed in the top level context. Any exception
|
13
38
|
raised by the code won't cause Ruber to crash, but will be displayed in a dialog.
|
@@ -18,7 +43,7 @@ raised by the code won't cause Ruber to crash, but will be displayed in a dialog
|
|
18
43
|
The tool widget where the user can enter the ruby code to execute.
|
19
44
|
=end
|
20
45
|
class ToolWidget < Qt::Widget
|
21
|
-
|
46
|
+
|
22
47
|
slots :execute_command, :load_settings
|
23
48
|
|
24
49
|
=begin rdoc
|
@@ -26,13 +51,13 @@ The tool widget where the user can enter the ruby code to execute.
|
|
26
51
|
=end
|
27
52
|
def initialize parent = nil
|
28
53
|
super
|
29
|
-
|
30
|
-
@
|
31
|
-
|
32
|
-
|
33
|
-
@
|
34
|
-
connect
|
35
|
-
|
54
|
+
@ui = Ui::CommandToolWidget.new
|
55
|
+
@ui.setup_ui self
|
56
|
+
self.focus_proxy = @ui.editor
|
57
|
+
connect @ui.execute, SIGNAL(:clicked), self, SLOT(:execute_command)
|
58
|
+
connect @ui.show_output, SIGNAL('toggled(bool)'), self, SLOT('output_visible=(bool)')
|
59
|
+
@ui.clear.connect(SIGNAL(:clicked)){@ui.output.clear}
|
60
|
+
self.output_visible = @ui.show_output.checked?
|
36
61
|
end
|
37
62
|
|
38
63
|
=begin rdoc
|
@@ -44,15 +69,23 @@ it will be displayed on standard error and in a message box.
|
|
44
69
|
was raised.
|
45
70
|
=end
|
46
71
|
def execute_command
|
47
|
-
code = @editor.to_plain_text
|
72
|
+
code = @ui.editor.to_plain_text
|
48
73
|
begin
|
74
|
+
old_stdout = $stdout
|
75
|
+
old_stderr = $stderr
|
76
|
+
$stdout = Output.new @ui.output, Ruber[:config][:output_colors, :output], $stdout.fileno
|
77
|
+
$stderr = Output.new @ui.output, Ruber[:config][:output_colors, :error], $stderr.fileno
|
49
78
|
eval code, TOPLEVEL_BINDING, 'COMMAND'
|
50
79
|
true
|
51
80
|
rescue Exception => ex
|
52
|
-
dlg = ExceptionDialog.new ex, Ruber[:main_window],
|
81
|
+
dlg = ExceptionDialog.new ex, Ruber[:main_window], true,
|
53
82
|
'The command you issued raised the following exception:'
|
83
|
+
dlg.set_button_text KDE::Dialog::Ok, i18n('Ok')
|
54
84
|
dlg.exec
|
55
85
|
false
|
86
|
+
ensure
|
87
|
+
$stdout = old_stdout
|
88
|
+
$stderr = old_stderr
|
56
89
|
end
|
57
90
|
end
|
58
91
|
|
@@ -63,10 +96,36 @@ Sets the font of the editor to the font chosen by the user as the output font
|
|
63
96
|
@return [nil]
|
64
97
|
=end
|
65
98
|
def load_settings
|
66
|
-
|
99
|
+
font = Ruber[:config][:general, :output_font]
|
100
|
+
metrics = Qt::FontMetrics.new font
|
101
|
+
tab_width = metrics.max_width * 2
|
102
|
+
@ui.editor.font = font
|
103
|
+
@ui.editor.tab_stop_width = tab_width
|
104
|
+
@ui.output.font = font
|
105
|
+
@ui.output.tab_stop_width = tab_width
|
67
106
|
nil
|
68
107
|
end
|
69
108
|
|
109
|
+
private
|
110
|
+
|
111
|
+
=begin rdoc
|
112
|
+
Shows or hides the output widget and related widgets
|
113
|
+
|
114
|
+
It also changes the text of the Show Output button so that it becomes 'Hide Output'
|
115
|
+
if the button is visible.
|
116
|
+
|
117
|
+
@param [Boolean] visible whether the output widget should be shown or hidden
|
118
|
+
@return [nil]
|
119
|
+
=end
|
120
|
+
def output_visible= visible
|
121
|
+
@ui.output.visible = visible
|
122
|
+
@ui.clear.visible = visible
|
123
|
+
@ui.output_label.visible = visible
|
124
|
+
@ui.show_output.text = i18n(visible ? '&Hide Output' : '&Show Output')
|
125
|
+
nil
|
126
|
+
end
|
127
|
+
slots 'output_visible=(bool)'
|
128
|
+
|
70
129
|
end
|
71
130
|
|
72
131
|
end
|
@@ -0,0 +1,592 @@
|
|
1
|
+
=begin
|
2
|
+
Copyright (C) 2011 by Stefano Crocco
|
3
|
+
stefano.crocco@alice.it
|
4
|
+
|
5
|
+
This program is free software; you can redistribute it andor modify
|
6
|
+
it under the terms of the GNU General Public License as published by
|
7
|
+
the Free Software Foundation; either version 2 of the License, or
|
8
|
+
(at your option) any later version.
|
9
|
+
|
10
|
+
This program is distributed in the hope that it will be useful,
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
GNU General Public License for more details.
|
14
|
+
|
15
|
+
You should have received a copy of the GNU General Public License
|
16
|
+
along with this program; if not, write to the
|
17
|
+
Free Software Foundation, Inc.,
|
18
|
+
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
19
|
+
=end
|
20
|
+
|
21
|
+
module Ruber
|
22
|
+
|
23
|
+
module CommandPlugin
|
24
|
+
|
25
|
+
=begin rdoc
|
26
|
+
Fake IO object for use by the command plugin. Despite the name, it can be used
|
27
|
+
to display standard error as well as standard output.
|
28
|
+
|
29
|
+
It displays the text in a @Qt::PlainTextEdit@ using a given color.
|
30
|
+
|
31
|
+
All the methods in this class are implementations of the API provided by IO.
|
32
|
+
|
33
|
+
@example Typical usage
|
34
|
+
|
35
|
+
old_stdout = $stdout #store the old standard output to restore it later
|
36
|
+
$stdout = Output.new plain_text_edit, Qt::Color.new(Qt.blue)
|
37
|
+
puts "hello" # => the string "hello" is displayed in the widget
|
38
|
+
$stdout = old_stout # restore the old standard output
|
39
|
+
=end
|
40
|
+
class Output
|
41
|
+
|
42
|
+
=begin rdoc
|
43
|
+
@param [Qt::PlainTextEdit] widget the widget to display the output into
|
44
|
+
@param [Qt::Color] color the color to use for the text
|
45
|
+
@param [Integer] fileno the number that the {#fileno} method should return
|
46
|
+
=end
|
47
|
+
def initialize widget, color, fileno = 1
|
48
|
+
@widget = widget
|
49
|
+
@close_on_exec = false
|
50
|
+
@closed = false
|
51
|
+
@sync = true
|
52
|
+
@brush = Qt::Brush.new color
|
53
|
+
@fileno = fileno
|
54
|
+
end
|
55
|
+
|
56
|
+
=begin rdoc
|
57
|
+
@return [Boolean] whether byffering is disabled or enabled. This class doesn't buffer
|
58
|
+
output, so this makes no difference. It's only provided for compatibility with
|
59
|
+
@IO@ API
|
60
|
+
=end
|
61
|
+
attr_accessor :sync
|
62
|
+
|
63
|
+
=begin rdoc
|
64
|
+
As @IO#<<@
|
65
|
+
|
66
|
+
@return [Output] self
|
67
|
+
=end
|
68
|
+
def << text
|
69
|
+
write text
|
70
|
+
self
|
71
|
+
end
|
72
|
+
|
73
|
+
=begin rdoc
|
74
|
+
As @IO#binmode@
|
75
|
+
|
76
|
+
This method doesn't actually do anything. It's just for compatibility with the @IO@
|
77
|
+
API
|
78
|
+
@return [nil]
|
79
|
+
=end
|
80
|
+
def binmode
|
81
|
+
end
|
82
|
+
|
83
|
+
=begin rdoc
|
84
|
+
As @IO#binmode?@
|
85
|
+
|
86
|
+
This method always returns *true*. It's just for compatibility with the @IO@
|
87
|
+
API
|
88
|
+
@return [TrueClass] *true*
|
89
|
+
=end
|
90
|
+
def binmode?
|
91
|
+
true
|
92
|
+
end
|
93
|
+
|
94
|
+
=begin rdoc
|
95
|
+
As @IO#bytes@
|
96
|
+
|
97
|
+
@return [Enumerator] an enumerator which calls {#each_byte}
|
98
|
+
=end
|
99
|
+
def bytes
|
100
|
+
each_byte
|
101
|
+
end
|
102
|
+
|
103
|
+
=begin rdoc
|
104
|
+
As @IO#chars@
|
105
|
+
|
106
|
+
@return [Enumerator] an enumerator which calls {#each_char}
|
107
|
+
=end
|
108
|
+
|
109
|
+
def chars
|
110
|
+
each_char
|
111
|
+
end
|
112
|
+
|
113
|
+
=begin rdoc
|
114
|
+
As @IO#close@
|
115
|
+
|
116
|
+
@return [nil]
|
117
|
+
=end
|
118
|
+
def close
|
119
|
+
@closed = true
|
120
|
+
nil
|
121
|
+
end
|
122
|
+
|
123
|
+
=begin rdoc
|
124
|
+
As @IO#close_on_exec@
|
125
|
+
|
126
|
+
This method does nothing. It's only for compatibility with @IO@ API
|
127
|
+
@param [Object] val the new value
|
128
|
+
@return [Object] _val_
|
129
|
+
=end
|
130
|
+
|
131
|
+
def close_on_exec= val
|
132
|
+
@close_on_exec = val.to_bool
|
133
|
+
end
|
134
|
+
|
135
|
+
=begin rdoc
|
136
|
+
As @IO#close_on_exec?@
|
137
|
+
|
138
|
+
{#close_on_exec=} has no influence on this class, so the value returned here is
|
139
|
+
meaningless. It's only provided for compatibility with @IO@ API
|
140
|
+
@return [Boolean] whether close on exec is enabled or not. Nothing changes in either
|
141
|
+
case
|
142
|
+
=end
|
143
|
+
def close_on_exec?
|
144
|
+
@close_on_exec
|
145
|
+
end
|
146
|
+
|
147
|
+
=begin rdoc
|
148
|
+
As @IO#close_read@
|
149
|
+
|
150
|
+
@raise [IOError] always as this class isn't open for reading
|
151
|
+
@return [nil]
|
152
|
+
=end
|
153
|
+
def close_read
|
154
|
+
raise IOError, 'closing non-duplex IO for reading'
|
155
|
+
end
|
156
|
+
|
157
|
+
=begin rdoc
|
158
|
+
As @IO#close_write@
|
159
|
+
|
160
|
+
@return [nil]
|
161
|
+
=end
|
162
|
+
def close_write
|
163
|
+
@closed = true
|
164
|
+
nil
|
165
|
+
end
|
166
|
+
|
167
|
+
=begin rdoc
|
168
|
+
As @IO#closed?@
|
169
|
+
|
170
|
+
@return [Boolean] whether the stream is closed or not
|
171
|
+
=end
|
172
|
+
def closed?
|
173
|
+
@closed
|
174
|
+
end
|
175
|
+
|
176
|
+
=begin rdoc
|
177
|
+
As @IO#each@
|
178
|
+
|
179
|
+
@raise [IOError] when called with a block because the stream is not open for reading
|
180
|
+
@return [Enumerator] an enumerator which calls {#each} when called without a block
|
181
|
+
=end
|
182
|
+
def each
|
183
|
+
raise IOError, "not opened for reading" if block_given?
|
184
|
+
to_enum
|
185
|
+
end
|
186
|
+
|
187
|
+
=begin rdoc
|
188
|
+
As @IO#each_byte@
|
189
|
+
|
190
|
+
@raise [IOError] when called with a block because the stream is not open for reading
|
191
|
+
@return [Enumerator] an enumerator which calls {#each_byte} when called without a block
|
192
|
+
=end
|
193
|
+
def each_byte
|
194
|
+
raise IOError, "not opened for reading" if block_given?
|
195
|
+
to_enum :each_byte
|
196
|
+
end
|
197
|
+
|
198
|
+
=begin rdoc
|
199
|
+
As @IO#each_char@
|
200
|
+
|
201
|
+
@raise [IOError] when called with a block because the stream is not open for reading
|
202
|
+
@return [Enumerator] an enumerator which calls {#each_char} when called without a block
|
203
|
+
=end
|
204
|
+
def each_char
|
205
|
+
raise IOError, "not opened for reading" if block_given?
|
206
|
+
to_enum :each_char
|
207
|
+
end
|
208
|
+
|
209
|
+
=begin rdoc
|
210
|
+
As @IO#each@
|
211
|
+
|
212
|
+
@raise [IOError] when called with a block because the stream is not open for reading
|
213
|
+
@return [Enumerator] an enumerator which calls {#each_line} when called without a block
|
214
|
+
=end
|
215
|
+
def each_line sep
|
216
|
+
raise IOError, "not opened for reading" if block_given?
|
217
|
+
to_enum :each_line
|
218
|
+
end
|
219
|
+
|
220
|
+
=begin rdoc
|
221
|
+
As @IO#eof@
|
222
|
+
|
223
|
+
@raise [IOError] always because the stream is not open for reading
|
224
|
+
@return [nil]
|
225
|
+
=end
|
226
|
+
def eof
|
227
|
+
raise IOError, "not opened for reading"
|
228
|
+
end
|
229
|
+
|
230
|
+
=begin rdoc
|
231
|
+
As @IO#eof?@
|
232
|
+
|
233
|
+
@raise [IOError] always because the stream is not open for reading
|
234
|
+
@return [nil]
|
235
|
+
=end
|
236
|
+
def eof?
|
237
|
+
raise IOError, "not opened for reading"
|
238
|
+
end
|
239
|
+
|
240
|
+
=begin rdoc
|
241
|
+
As @IO#external_encoding@
|
242
|
+
|
243
|
+
@return [nil]
|
244
|
+
=end
|
245
|
+
def external_encoding
|
246
|
+
nil
|
247
|
+
end
|
248
|
+
|
249
|
+
=begin rdoc
|
250
|
+
As @IO#fileno@
|
251
|
+
|
252
|
+
@return [Integer] the third argument passed to the constructor
|
253
|
+
=end
|
254
|
+
def fileno
|
255
|
+
@fileno
|
256
|
+
end
|
257
|
+
|
258
|
+
=begin rdoc
|
259
|
+
As @IO#flush@
|
260
|
+
|
261
|
+
As this class doesn't do any buffering, this method does nothing and is only
|
262
|
+
provided for compatibility with @IO@ API
|
263
|
+
|
264
|
+
@return [Output] *self*
|
265
|
+
=end
|
266
|
+
def flush
|
267
|
+
self
|
268
|
+
end
|
269
|
+
|
270
|
+
=begin rdoc
|
271
|
+
As @IO#getbyte@
|
272
|
+
|
273
|
+
@raise [IOError] always because the stream is not open for reading
|
274
|
+
@return [nil]
|
275
|
+
=end
|
276
|
+
def getbyte
|
277
|
+
raise IOError, "not opened for reading"
|
278
|
+
end
|
279
|
+
|
280
|
+
=begin rdoc
|
281
|
+
As @IO#getc@
|
282
|
+
|
283
|
+
@raise [IOError] always because the stream is not open for reading
|
284
|
+
@return [nil]
|
285
|
+
=end
|
286
|
+
def getc
|
287
|
+
raise IOError, "not opened for reading"
|
288
|
+
end
|
289
|
+
|
290
|
+
=begin rdoc
|
291
|
+
As @IO#gets@
|
292
|
+
|
293
|
+
@raise [IOError] always because the stream is not open for reading
|
294
|
+
@return [nil]
|
295
|
+
=end
|
296
|
+
def gets
|
297
|
+
raise IOError, "not opened for reading"
|
298
|
+
end
|
299
|
+
|
300
|
+
=begin rdoc
|
301
|
+
As @IO#internal_encoding@
|
302
|
+
|
303
|
+
@return [nil]
|
304
|
+
=end
|
305
|
+
def internal_encoding
|
306
|
+
nil
|
307
|
+
end
|
308
|
+
|
309
|
+
=begin rdoc
|
310
|
+
As @IO#isatty@
|
311
|
+
|
312
|
+
@return [false]
|
313
|
+
=end
|
314
|
+
def isatty
|
315
|
+
false
|
316
|
+
end
|
317
|
+
alias_method :tty?, :isatty
|
318
|
+
|
319
|
+
=begin rdoc
|
320
|
+
As @IO#lineno@
|
321
|
+
|
322
|
+
@raise [IOError] always because the stream is not open for reading
|
323
|
+
@return [nil]
|
324
|
+
=end
|
325
|
+
def lineno
|
326
|
+
raise IOError, "not opened for reading"
|
327
|
+
end
|
328
|
+
|
329
|
+
=begin rdoc
|
330
|
+
As @IO#lineno=@
|
331
|
+
|
332
|
+
@raise [IOError] always because the stream is not open for reading
|
333
|
+
@return [nil]
|
334
|
+
=end
|
335
|
+
def lineno= val
|
336
|
+
raise IOError, "not opened for reading"
|
337
|
+
end
|
338
|
+
|
339
|
+
=begin rdoc
|
340
|
+
As @IO#lines@
|
341
|
+
|
342
|
+
@return [Enumerator] an enumerator which calls {#each_line}
|
343
|
+
=end
|
344
|
+
def lines
|
345
|
+
each_line
|
346
|
+
end
|
347
|
+
|
348
|
+
=begin rdoc
|
349
|
+
As @IO#pid@
|
350
|
+
|
351
|
+
@return [nil]
|
352
|
+
=end
|
353
|
+
def pid
|
354
|
+
nil
|
355
|
+
end
|
356
|
+
|
357
|
+
=begin rdoc
|
358
|
+
As @IO#print@
|
359
|
+
|
360
|
+
@param [Array<Object>] args the objects to print
|
361
|
+
@return [nil]
|
362
|
+
=end
|
363
|
+
def print *args
|
364
|
+
args = [$_] if args.empty?
|
365
|
+
args.each{|a| write a}
|
366
|
+
STDOUT.write $\
|
367
|
+
write $\ if $\
|
368
|
+
nil
|
369
|
+
end
|
370
|
+
|
371
|
+
=begin rdoc
|
372
|
+
As @IO#printf@
|
373
|
+
|
374
|
+
@param [String] format_string the format string. See @Kernel.sprintf@
|
375
|
+
@param [Array<Object>] args the parameter to substitute in the format string
|
376
|
+
@return [nil]
|
377
|
+
=end
|
378
|
+
def printf format_string, *args
|
379
|
+
str = sprintf format_string, *args
|
380
|
+
write str
|
381
|
+
nil
|
382
|
+
end
|
383
|
+
|
384
|
+
=begin rdoc
|
385
|
+
As @IO#putc@
|
386
|
+
|
387
|
+
@param [Object] obj the object
|
388
|
+
@return [Object] obj
|
389
|
+
=end
|
390
|
+
def putc obj
|
391
|
+
if obj.is_a? Numeric then write obj.floor.chr
|
392
|
+
else obj.to_s.each_char.to_a[0]
|
393
|
+
end
|
394
|
+
obj
|
395
|
+
end
|
396
|
+
|
397
|
+
=begin rdoc
|
398
|
+
As @IO#puts@
|
399
|
+
|
400
|
+
@param [Array<Object>] args the objects to write
|
401
|
+
@return [nil]
|
402
|
+
=end
|
403
|
+
def puts *args
|
404
|
+
args << '' if args.empty?
|
405
|
+
args.each do |a|
|
406
|
+
a = a.to_s
|
407
|
+
write a
|
408
|
+
write "\n" unless a.end_with? "\n"
|
409
|
+
end
|
410
|
+
nil
|
411
|
+
end
|
412
|
+
|
413
|
+
=begin rdoc
|
414
|
+
As @IO#read@
|
415
|
+
|
416
|
+
@raise [IOError] always because the stream is not open for reading
|
417
|
+
@param [Integer] length unused
|
418
|
+
@param [String] buffer unused
|
419
|
+
@return [nil]
|
420
|
+
=end
|
421
|
+
def read length, buffer = nil
|
422
|
+
raise IOError, "not opened for reading"
|
423
|
+
end
|
424
|
+
|
425
|
+
=begin rdoc
|
426
|
+
As @IO#read_nonblock@
|
427
|
+
|
428
|
+
@raise [IOError] always because the stream is not open for reading
|
429
|
+
@param [Integer] max unused
|
430
|
+
@param [String] outbuf unused
|
431
|
+
@return [nil]
|
432
|
+
=end
|
433
|
+
def read_nonblock max, outbuf = nil
|
434
|
+
raise IOError, "not opened for reading"
|
435
|
+
end
|
436
|
+
|
437
|
+
=begin rdoc
|
438
|
+
As @IO#readbyte@
|
439
|
+
|
440
|
+
@raise [IOError] always because the stream is not open for reading
|
441
|
+
@return [nil]
|
442
|
+
=end
|
443
|
+
def readbyte
|
444
|
+
raise IOError, "not opened for reading"
|
445
|
+
end
|
446
|
+
|
447
|
+
=begin rdoc
|
448
|
+
As @IO#readchar@
|
449
|
+
|
450
|
+
@raise [IOError] always because the stream is not open for reading
|
451
|
+
@return [nil]
|
452
|
+
=end
|
453
|
+
def readchar
|
454
|
+
raise IOError, "not opened for reading"
|
455
|
+
end
|
456
|
+
|
457
|
+
=begin rdoc
|
458
|
+
As @IO#readline@
|
459
|
+
|
460
|
+
@raise [IOError] always because the stream is not open for reading
|
461
|
+
@param [String] sep unused
|
462
|
+
@param [Integer] limit unused
|
463
|
+
@return [nil]
|
464
|
+
=end
|
465
|
+
def readline sep, limit
|
466
|
+
raise IOError, "not opened for reading"
|
467
|
+
end
|
468
|
+
|
469
|
+
=begin rdoc
|
470
|
+
As @IO#readlines@
|
471
|
+
|
472
|
+
@raise [IOError] always because the stream is not open for reading
|
473
|
+
@param [String] sep unused
|
474
|
+
@param [Integer] limit unused
|
475
|
+
@return [nil]
|
476
|
+
=end
|
477
|
+
def readlines sep, limit
|
478
|
+
raise IOError, "not opened for reading"
|
479
|
+
end
|
480
|
+
|
481
|
+
=begin rdoc
|
482
|
+
As @IO#readpartial@
|
483
|
+
|
484
|
+
@raise [IOError] always because the stream is not open for reading
|
485
|
+
@param [Integer] maxlen unused
|
486
|
+
@param [String] outbuf unused
|
487
|
+
@return [nil]
|
488
|
+
=end
|
489
|
+
def readpartial maxlen, outbuf = nil
|
490
|
+
raise IOError, "not opened for reading"
|
491
|
+
end
|
492
|
+
|
493
|
+
=begin rdoc
|
494
|
+
As @IO#reopen@
|
495
|
+
|
496
|
+
@raise [RuntimeError] always
|
497
|
+
@param [String,IO] a path or another IO. Unused
|
498
|
+
@param [String] the mode. Unused
|
499
|
+
@return [nil]
|
500
|
+
=end
|
501
|
+
def reopen arg1, arg2 = 'r'
|
502
|
+
raise RuntimeError, "You can\'t reopen #{self.class}"
|
503
|
+
end
|
504
|
+
|
505
|
+
=begin rdoc
|
506
|
+
As @IO#set_encoding@
|
507
|
+
|
508
|
+
This method does nothing. It's only provided for compatibility with @IO@ API
|
509
|
+
@param [Array<Object>] args the arguments. See @IO#set_encoding@
|
510
|
+
=end
|
511
|
+
def set_encoding *args
|
512
|
+
end
|
513
|
+
|
514
|
+
=begin rdoc
|
515
|
+
As @IO#stat@
|
516
|
+
|
517
|
+
@return [nil] as this class isn't associated with any file
|
518
|
+
=end
|
519
|
+
def stat
|
520
|
+
nil
|
521
|
+
end
|
522
|
+
|
523
|
+
=begin rdoc
|
524
|
+
As @IO#sysread@
|
525
|
+
|
526
|
+
@raise [IOError] always because the stream is not open for reading
|
527
|
+
@param [Integer] num unused
|
528
|
+
@param [String] outbuf unused
|
529
|
+
@return [nil]
|
530
|
+
=end
|
531
|
+
def sysread num, outbuf = nil
|
532
|
+
raise IOError, "not opened for reading"
|
533
|
+
end
|
534
|
+
|
535
|
+
=begin rdoc
|
536
|
+
As @IO#to_io@
|
537
|
+
|
538
|
+
@return [Output] self
|
539
|
+
=end
|
540
|
+
def to_io
|
541
|
+
self
|
542
|
+
end
|
543
|
+
|
544
|
+
=begin rdoc
|
545
|
+
As @IO#ungetbyte@
|
546
|
+
|
547
|
+
@raise [IOError] always because the stream is not open for reading
|
548
|
+
@param [String,Integer] arg unused
|
549
|
+
@return [nil]
|
550
|
+
=end
|
551
|
+
def ungetbyte arg
|
552
|
+
raise IOError, "not opened for reading"
|
553
|
+
end
|
554
|
+
|
555
|
+
=begin rdoc
|
556
|
+
As @IO#ungetc@
|
557
|
+
|
558
|
+
@raise [IOError] always because the stream is not open for reading
|
559
|
+
@param [String] str unused
|
560
|
+
@return [nil]
|
561
|
+
=end
|
562
|
+
def ungetc str
|
563
|
+
raise IOError, "not opened for reading"
|
564
|
+
end
|
565
|
+
|
566
|
+
=begin rdoc
|
567
|
+
As @IO#write@
|
568
|
+
|
569
|
+
@param [Object] obj the object to write
|
570
|
+
@raise [IOError] if the stream has been closed
|
571
|
+
@return [Integer] the number of written bytes
|
572
|
+
=end
|
573
|
+
def write obj
|
574
|
+
if !@closed
|
575
|
+
cur = @widget.text_cursor
|
576
|
+
cur.move_position Qt::TextCursor::End
|
577
|
+
text = obj.to_s
|
578
|
+
format = cur.char_format
|
579
|
+
format.foreground = @brush
|
580
|
+
cur.insert_text text, format
|
581
|
+
text.bytes.count
|
582
|
+
else raise IOError, 'closed stream'
|
583
|
+
end
|
584
|
+
end
|
585
|
+
alias_method :syswrite, :write
|
586
|
+
alias_method :write_nonblock, :write
|
587
|
+
|
588
|
+
end
|
589
|
+
|
590
|
+
end
|
591
|
+
|
592
|
+
end
|