text_editor 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/.text_editor.rb +81 -2
  4. data/Gemfile.lock +1 -0
  5. data/README.org +103 -0
  6. data/bin/console +1 -1
  7. data/lib/core_ext/hash.rb +2 -0
  8. data/lib/core_ext/pathname.rb +2 -0
  9. data/lib/text_editor.rb +43 -13
  10. data/lib/text_editor/buffer.rb +3 -0
  11. data/lib/text_editor/clipboard.rb +1 -1
  12. data/lib/text_editor/clipboard/cygwin.rb +0 -4
  13. data/lib/text_editor/clipboard/linux.rb +0 -4
  14. data/lib/text_editor/clipboard/mac.rb +0 -4
  15. data/lib/text_editor/clipboard/unknown.rb +0 -4
  16. data/lib/text_editor/clipboard/windows.rb +0 -4
  17. data/lib/text_editor/command.rb +4 -4
  18. data/lib/text_editor/command/append_line_and_insert.rb +11 -0
  19. data/lib/text_editor/command/change_mode.rb +9 -0
  20. data/lib/text_editor/command/cursor_end_and_insert.rb +9 -0
  21. data/lib/text_editor/command/cursor_left.rb +1 -8
  22. data/lib/text_editor/command/cursor_left_with_wrap.rb +16 -0
  23. data/lib/text_editor/command/cursor_right.rb +2 -9
  24. data/lib/text_editor/command/cursor_right_and_insert.rb +9 -0
  25. data/lib/text_editor/command/cursor_right_with_wrap.rb +19 -0
  26. data/lib/text_editor/command/cursor_start_without_whitespace.rb +11 -0
  27. data/lib/text_editor/command/cursor_up.rb +1 -1
  28. data/lib/text_editor/command/forward_word.rb +16 -0
  29. data/lib/text_editor/command/insert_tab.rb +1 -1
  30. data/lib/text_editor/command/prepend_line_and_insert.rb +11 -0
  31. data/lib/text_editor/command/replace_line.rb +13 -0
  32. data/lib/text_editor/command/resolver.rb +3 -2
  33. data/lib/text_editor/component.rb +1 -1
  34. data/lib/text_editor/configuration.rb +11 -3
  35. data/lib/text_editor/configuration/bootstrap.rb +9 -3
  36. data/lib/text_editor/configuration/flavor.rb +20 -0
  37. data/lib/text_editor/configuration/log.rb +7 -0
  38. data/lib/text_editor/configuration/mode.rb +28 -0
  39. data/lib/text_editor/configuration/operating_system.rb +21 -0
  40. data/lib/text_editor/configuration/resolver.rb +1 -1
  41. data/lib/text_editor/configuration/tab.rb +11 -0
  42. data/lib/text_editor/cursor.rb +2 -0
  43. data/lib/text_editor/keyboard.rb +1 -1
  44. data/lib/text_editor/logger.rb +11 -0
  45. data/lib/text_editor/reactor.rb +5 -3
  46. data/lib/text_editor/terminal.rb +2 -19
  47. data/lib/text_editor/window.rb +34 -5
  48. data/spec/spec_helper.rb +3 -0
  49. data/spec/support/command_helper.rb +43 -0
  50. data/spec/text_editor/clipboard_spec.rb +0 -7
  51. data/spec/text_editor/command/append_line_and_insert_spec.rb +38 -0
  52. data/spec/text_editor/command/backspace_spec.rb +54 -0
  53. data/spec/text_editor/command/change_mode_spec.rb +17 -0
  54. data/spec/text_editor/command/cursor_down_spec.rb +57 -0
  55. data/spec/text_editor/command/cursor_end_and_insert_spec.rb +35 -0
  56. data/spec/text_editor/command/cursor_end_spec.rb +30 -0
  57. data/spec/text_editor/command/cursor_left_spec.rb +46 -0
  58. data/spec/text_editor/command/cursor_left_with_wrap_spec.rb +46 -0
  59. data/spec/text_editor/command/cursor_right_and_insert_spec.rb +58 -0
  60. data/spec/text_editor/command/cursor_right_spec.rb +53 -0
  61. data/spec/text_editor/command/cursor_right_with_wrap_spec.rb +54 -0
  62. data/spec/text_editor/command/cursor_start_spec.rb +33 -0
  63. data/spec/text_editor/command/cursor_start_without_whitespace_spec.rb +46 -0
  64. data/spec/text_editor/command/cursor_up_spec.rb +56 -0
  65. data/spec/text_editor/command/forward_word_spec.rb +8 -0
  66. data/spec/text_editor/command/insert_char_spec.rb +24 -0
  67. data/spec/text_editor/command/insert_line_spec.rb +26 -0
  68. data/spec/text_editor/command/insert_tab_spec.rb +27 -0
  69. data/spec/text_editor/command/prepend_line_and_insert_spec.rb +38 -0
  70. data/spec/text_editor/command/replace_line_spec.rb +34 -0
  71. data/spec/text_editor/command/resolver_spec.rb +2 -2
  72. data/spec/text_editor/command/write_file_spec.rb +25 -0
  73. data/spec/text_editor/command_spec.rb +8 -8
  74. data/spec/text_editor/component_spec.rb +7 -0
  75. data/spec/text_editor/configuration/log_spec.rb +26 -0
  76. data/spec/text_editor/{operating_system_spec.rb → configuration/operating_system_spec.rb} +1 -1
  77. data/spec/text_editor/configuration/tab_spec.rb +41 -0
  78. data/spec/text_editor/configuration_spec.rb +11 -4
  79. data/spec/text_editor/logger_spec.rb +17 -0
  80. data/text_editor.gemspec +2 -1
  81. metadata +84 -7
  82. data/lib/text_editor/mode.rb +0 -23
  83. data/lib/text_editor/mode/nano.rb +0 -30
  84. data/lib/text_editor/operating_system.rb +0 -19
@@ -0,0 +1,34 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe TextEditor::Command::ReplaceLine do
4
+ include CommandHelper
5
+
6
+ describe "#run" do
7
+ context "with an empty buffer" do
8
+ before do
9
+ expect_buffer("")
10
+ expect_cursor(0, 0)
11
+ end
12
+
13
+ it "does not move cursor" do
14
+ subject.run
15
+ expect_buffer("")
16
+ expect_cursor(0, 0)
17
+ end
18
+ end
19
+
20
+ context "with a one line buffer" do
21
+ before do
22
+ update_buffer("ab")
23
+ update_cursor(0, 1)
24
+ end
25
+
26
+ it "clears line and changes to insert mode at start of line" do
27
+ subject.run
28
+ expect_buffer("")
29
+ expect_cursor(0, 0)
30
+ expect_mode(:insert)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -30,12 +30,12 @@ RSpec.describe TextEditor::Command::Resolver do
30
30
  describe "#resolve" do
31
31
  it "finds existing string commands" do
32
32
  actual = subject.resolve("fake_command")
33
- expect(actual).to be_a(fake)
33
+ expect(actual).to eq(fake)
34
34
  end
35
35
 
36
36
  it "finds existing symbol commands" do
37
37
  actual = subject.resolve(:fake_command)
38
- expect(actual).to be_a(fake)
38
+ expect(actual).to eq(fake)
39
39
  end
40
40
 
41
41
  it "returns nil for missing commands" do
@@ -0,0 +1,25 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe TextEditor::Command::WriteFile do
4
+ include CommandHelper
5
+
6
+ describe "#run" do
7
+ context "with a specified file" do
8
+ let(:file) { Pathname.new("test") }
9
+
10
+ it "it writes the buffer to the file" do
11
+ expect(window).to receive(:file).and_return(file).exactly(3).times
12
+ expect(file).to receive(:write).with("testing")
13
+ update_buffer("testing")
14
+ subject.run
15
+ end
16
+ end
17
+
18
+ context "without a specified file" do
19
+ it "it beeps the terminal" do
20
+ expect(subject.terminal).to receive(:beep)
21
+ subject.run
22
+ end
23
+ end
24
+ end
25
+ end
@@ -30,14 +30,6 @@ RSpec.describe TextEditor::Command do
30
30
  end
31
31
  end
32
32
 
33
- describe "#command" do
34
- let(:resolver) { described_class::Resolver }
35
-
36
- it "returns a command resolver" do
37
- expect(subject.command).to be_a(resolver)
38
- end
39
- end
40
-
41
33
  describe "#content" do
42
34
  it "returns buffer content for the current line" do
43
35
  line = "test"
@@ -69,6 +61,14 @@ RSpec.describe TextEditor::Command do
69
61
  end
70
62
  end
71
63
 
64
+ describe "#scan" do
65
+ it "returns a string scanner for the content of the current line" do
66
+ expect(subject).to receive(:content).and_return("test")
67
+ expect(StringScanner).to receive(:new).with("test").and_return(:example)
68
+ expect(subject.scan).to eq(:example)
69
+ end
70
+ end
71
+
72
72
  describe "#state" do
73
73
  it "delegates to editor.window" do
74
74
  expect(editor).to receive_message_chain(:window, :state)
@@ -11,6 +11,13 @@ RSpec.describe TextEditor::Component do
11
11
  end
12
12
  end
13
13
 
14
+ describe "#command" do
15
+ it "delegates to editor.command" do
16
+ expect(subject).to receive_message_chain(:editor, :command)
17
+ subject.command
18
+ end
19
+ end
20
+
14
21
  describe "#config" do
15
22
  it "delegates to editor.config" do
16
23
  expect(subject).to receive_message_chain(:editor, :config)
@@ -0,0 +1,26 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe TextEditor::Configuration::Log do
4
+ subject { described_class.new }
5
+
6
+ describe "#file" do
7
+ it "should be an accessor" do
8
+ subject.file = :test
9
+ expect(subject.file).to eq(:test)
10
+ end
11
+ end
12
+
13
+ describe "#level" do
14
+ it "should be an accessor" do
15
+ subject.level = :test
16
+ expect(subject.level).to eq(:test)
17
+ end
18
+ end
19
+
20
+ describe "#options" do
21
+ it "should be an accessor" do
22
+ subject.options = :test
23
+ expect(subject.options).to eq(:test)
24
+ end
25
+ end
26
+ end
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- RSpec.describe TextEditor::OperatingSystem do
3
+ RSpec.describe TextEditor::Configuration::OperatingSystem do
4
4
  subject { described_class.new(version) }
5
5
 
6
6
  describe "#type" do
@@ -0,0 +1,41 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe TextEditor::Configuration::Tab do
4
+ subject { described_class.new }
5
+
6
+ describe "#soft" do
7
+ it "should be an accessor" do
8
+ subject.soft = :test
9
+ expect(subject.soft).to eq(:test)
10
+ end
11
+ end
12
+
13
+ describe "#to_s" do
14
+ context "with hard tabs" do
15
+ before { subject.soft = false }
16
+
17
+ it "returns a tab character" do
18
+ expect(subject.to_s).to eq("\t")
19
+ end
20
+ end
21
+
22
+ context "with soft tabs" do
23
+ before { subject.soft = true }
24
+
25
+ it "returns tab.width spaces" do
26
+ subject.width = 2
27
+ expect(subject.to_s).to eq(" ")
28
+
29
+ subject.width = 3
30
+ expect(subject.to_s).to eq(" ")
31
+ end
32
+ end
33
+ end
34
+
35
+ describe "#width" do
36
+ it "should be an accessor" do
37
+ subject.width = :test
38
+ expect(subject.width).to eq(:test)
39
+ end
40
+ end
41
+ end
@@ -15,11 +15,18 @@ RSpec.describe TextEditor::Configuration do
15
15
  end
16
16
 
17
17
  describe "#log" do
18
- it "is an accessor" do
19
- expect(subject.log).to be_nil
18
+ let(:log) { described_class::Log }
19
+
20
+ it "returns a Log instance" do
21
+ expect(subject.log).to be_a(log)
22
+ end
23
+ end
24
+
25
+ describe "#tag" do
26
+ let(:tab) { described_class::Tab }
20
27
 
21
- subject.log = "test"
22
- expect(subject.log).to eq("test")
28
+ it "returns a Tab instance" do
29
+ expect(subject.tab).to be_a(tab)
23
30
  end
24
31
  end
25
32
  end
@@ -0,0 +1,17 @@
1
+ require "spec_helper"
2
+
3
+ RSpec.describe TextEditor::Logger do
4
+ subject { described_class.new(editor) }
5
+
6
+ let(:editor) { double("editor") }
7
+ let(:log) { double("log") }
8
+
9
+ describe "#initialize" do
10
+ it "inherits the top level logger with options from config" do
11
+ expect(editor).to receive_message_chain(:config, :log).and_return(log)
12
+ expect(log).to receive(:file)
13
+ expect(log).to receive(:options)
14
+ expect(subject).to be_a(::Logger)
15
+ end
16
+ end
17
+ end
@@ -10,9 +10,10 @@ Gem::Specification.new do |s|
10
10
  s.rdoc_options = %w(--charset=UTF-8 --inline-source --line-numbers --main README.org)
11
11
  s.summary = "Text editor"
12
12
  s.test_files = `git ls-files -- spec/*`.split("\n")
13
- s.version = "0.0.0"
13
+ s.version = "0.0.1"
14
14
 
15
15
  s.executables << "te"
16
16
 
17
+ s.add_dependency "bundler"
17
18
  s.add_dependency "curses", "1.0.2"
18
19
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: text_editor
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Huber
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-30 00:00:00.000000000 Z
11
+ date: 2016-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: curses
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -54,29 +68,42 @@ files:
54
68
  - lib/text_editor/clipboard/unknown.rb
55
69
  - lib/text_editor/clipboard/windows.rb
56
70
  - lib/text_editor/command.rb
71
+ - lib/text_editor/command/append_line_and_insert.rb
57
72
  - lib/text_editor/command/backspace.rb
73
+ - lib/text_editor/command/change_mode.rb
58
74
  - lib/text_editor/command/cursor_down.rb
59
75
  - lib/text_editor/command/cursor_end.rb
76
+ - lib/text_editor/command/cursor_end_and_insert.rb
60
77
  - lib/text_editor/command/cursor_left.rb
78
+ - lib/text_editor/command/cursor_left_with_wrap.rb
61
79
  - lib/text_editor/command/cursor_right.rb
80
+ - lib/text_editor/command/cursor_right_and_insert.rb
81
+ - lib/text_editor/command/cursor_right_with_wrap.rb
62
82
  - lib/text_editor/command/cursor_start.rb
83
+ - lib/text_editor/command/cursor_start_without_whitespace.rb
63
84
  - lib/text_editor/command/cursor_up.rb
85
+ - lib/text_editor/command/forward_word.rb
64
86
  - lib/text_editor/command/insert_char.rb
65
87
  - lib/text_editor/command/insert_line.rb
66
88
  - lib/text_editor/command/insert_tab.rb
89
+ - lib/text_editor/command/prepend_line_and_insert.rb
67
90
  - lib/text_editor/command/quit.rb
91
+ - lib/text_editor/command/replace_line.rb
68
92
  - lib/text_editor/command/resolver.rb
69
93
  - lib/text_editor/command/write_file.rb
70
94
  - lib/text_editor/component.rb
71
95
  - lib/text_editor/configuration.rb
72
96
  - lib/text_editor/configuration/bootstrap.rb
73
97
  - lib/text_editor/configuration/dsl.rb
98
+ - lib/text_editor/configuration/flavor.rb
99
+ - lib/text_editor/configuration/log.rb
100
+ - lib/text_editor/configuration/mode.rb
101
+ - lib/text_editor/configuration/operating_system.rb
74
102
  - lib/text_editor/configuration/resolver.rb
103
+ - lib/text_editor/configuration/tab.rb
75
104
  - lib/text_editor/cursor.rb
76
105
  - lib/text_editor/keyboard.rb
77
- - lib/text_editor/mode.rb
78
- - lib/text_editor/mode/nano.rb
79
- - lib/text_editor/operating_system.rb
106
+ - lib/text_editor/logger.rb
80
107
  - lib/text_editor/reactor.rb
81
108
  - lib/text_editor/state.rb
82
109
  - lib/text_editor/terminal.rb
@@ -85,15 +112,40 @@ files:
85
112
  - spec/core_ext/hash_spec.rb
86
113
  - spec/core_ext/pathname_spec.rb
87
114
  - spec/spec_helper.rb
115
+ - spec/support/command_helper.rb
88
116
  - spec/text_editor/buffer_spec.rb
89
117
  - spec/text_editor/clipboard_spec.rb
118
+ - spec/text_editor/command/append_line_and_insert_spec.rb
119
+ - spec/text_editor/command/backspace_spec.rb
120
+ - spec/text_editor/command/change_mode_spec.rb
121
+ - spec/text_editor/command/cursor_down_spec.rb
122
+ - spec/text_editor/command/cursor_end_and_insert_spec.rb
123
+ - spec/text_editor/command/cursor_end_spec.rb
124
+ - spec/text_editor/command/cursor_left_spec.rb
125
+ - spec/text_editor/command/cursor_left_with_wrap_spec.rb
126
+ - spec/text_editor/command/cursor_right_and_insert_spec.rb
127
+ - spec/text_editor/command/cursor_right_spec.rb
128
+ - spec/text_editor/command/cursor_right_with_wrap_spec.rb
129
+ - spec/text_editor/command/cursor_start_spec.rb
130
+ - spec/text_editor/command/cursor_start_without_whitespace_spec.rb
131
+ - spec/text_editor/command/cursor_up_spec.rb
132
+ - spec/text_editor/command/forward_word_spec.rb
133
+ - spec/text_editor/command/insert_char_spec.rb
134
+ - spec/text_editor/command/insert_line_spec.rb
135
+ - spec/text_editor/command/insert_tab_spec.rb
136
+ - spec/text_editor/command/prepend_line_and_insert_spec.rb
90
137
  - spec/text_editor/command/quit_spec.rb
138
+ - spec/text_editor/command/replace_line_spec.rb
91
139
  - spec/text_editor/command/resolver_spec.rb
140
+ - spec/text_editor/command/write_file_spec.rb
92
141
  - spec/text_editor/command_spec.rb
93
142
  - spec/text_editor/component_spec.rb
143
+ - spec/text_editor/configuration/log_spec.rb
144
+ - spec/text_editor/configuration/operating_system_spec.rb
145
+ - spec/text_editor/configuration/tab_spec.rb
94
146
  - spec/text_editor/configuration_spec.rb
95
147
  - spec/text_editor/cursor_spec.rb
96
- - spec/text_editor/operating_system_spec.rb
148
+ - spec/text_editor/logger_spec.rb
97
149
  - spec/text_editor/reactor_spec.rb
98
150
  - spec/text_editor/state_spec.rb
99
151
  - text_editor.gemspec
@@ -130,14 +182,39 @@ test_files:
130
182
  - spec/core_ext/hash_spec.rb
131
183
  - spec/core_ext/pathname_spec.rb
132
184
  - spec/spec_helper.rb
185
+ - spec/support/command_helper.rb
133
186
  - spec/text_editor/buffer_spec.rb
134
187
  - spec/text_editor/clipboard_spec.rb
188
+ - spec/text_editor/command/append_line_and_insert_spec.rb
189
+ - spec/text_editor/command/backspace_spec.rb
190
+ - spec/text_editor/command/change_mode_spec.rb
191
+ - spec/text_editor/command/cursor_down_spec.rb
192
+ - spec/text_editor/command/cursor_end_and_insert_spec.rb
193
+ - spec/text_editor/command/cursor_end_spec.rb
194
+ - spec/text_editor/command/cursor_left_spec.rb
195
+ - spec/text_editor/command/cursor_left_with_wrap_spec.rb
196
+ - spec/text_editor/command/cursor_right_and_insert_spec.rb
197
+ - spec/text_editor/command/cursor_right_spec.rb
198
+ - spec/text_editor/command/cursor_right_with_wrap_spec.rb
199
+ - spec/text_editor/command/cursor_start_spec.rb
200
+ - spec/text_editor/command/cursor_start_without_whitespace_spec.rb
201
+ - spec/text_editor/command/cursor_up_spec.rb
202
+ - spec/text_editor/command/forward_word_spec.rb
203
+ - spec/text_editor/command/insert_char_spec.rb
204
+ - spec/text_editor/command/insert_line_spec.rb
205
+ - spec/text_editor/command/insert_tab_spec.rb
206
+ - spec/text_editor/command/prepend_line_and_insert_spec.rb
135
207
  - spec/text_editor/command/quit_spec.rb
208
+ - spec/text_editor/command/replace_line_spec.rb
136
209
  - spec/text_editor/command/resolver_spec.rb
210
+ - spec/text_editor/command/write_file_spec.rb
137
211
  - spec/text_editor/command_spec.rb
138
212
  - spec/text_editor/component_spec.rb
213
+ - spec/text_editor/configuration/log_spec.rb
214
+ - spec/text_editor/configuration/operating_system_spec.rb
215
+ - spec/text_editor/configuration/tab_spec.rb
139
216
  - spec/text_editor/configuration_spec.rb
140
217
  - spec/text_editor/cursor_spec.rb
141
- - spec/text_editor/operating_system_spec.rb
218
+ - spec/text_editor/logger_spec.rb
142
219
  - spec/text_editor/reactor_spec.rb
143
220
  - spec/text_editor/state_spec.rb
@@ -1,23 +0,0 @@
1
- class TextEditor
2
- class Mode
3
- def self.bind(key, command = nil, &block)
4
- keybindings[key] = command || block
5
- end
6
-
7
- def self.keybindings
8
- @keybindings ||= {}
9
- end
10
-
11
- def keybindings
12
- self.class.keybindings
13
- end
14
-
15
- def resolve(key)
16
- keybindings.each do |keybinding, command|
17
- return command if keybinding === key
18
- end
19
-
20
- nil
21
- end
22
- end
23
- end
@@ -1,30 +0,0 @@
1
- class TextEditor
2
- class Mode
3
- class Nano < Mode
4
- bind :ctrl_c, Command::Quit
5
-
6
- bind :up, Command::CursorUp
7
- bind :down, Command::CursorDown
8
- bind :left, Command::CursorLeft
9
- bind :right, Command::CursorRight
10
-
11
- bind :ctrl_p, Command::CursorUp
12
- bind :ctrl_n, Command::CursorDown
13
- bind :ctrl_b, Command::CursorLeft
14
- bind :ctrl_f, Command::CursorRight
15
-
16
- bind :ctrl_a, Command::CursorStart
17
- bind :ctrl_e, Command::CursorEnd
18
-
19
- bind :backspace, Command::Backspace
20
- bind :ctrl_h, Command::Backspace
21
-
22
- bind :ctrl_o, Command::WriteFile
23
-
24
- bind :enter, Command::InsertLine
25
- bind :tab, Command::InsertTab
26
-
27
- bind(/^[[:print:]]$/, Command::InsertChar)
28
- end
29
- end
30
- end