vedeu 0.1.17 → 0.1.18

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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/README.md +17 -3
  4. data/lib/vedeu.rb +12 -7
  5. data/lib/vedeu/api/api.rb +37 -13
  6. data/lib/vedeu/api/composition.rb +1 -6
  7. data/lib/vedeu/api/helpers.rb +2 -0
  8. data/lib/vedeu/api/interface.rb +47 -55
  9. data/lib/vedeu/api/line.rb +6 -0
  10. data/lib/vedeu/api/stream.rb +9 -1
  11. data/lib/vedeu/application.rb +38 -50
  12. data/lib/vedeu/configuration.rb +163 -44
  13. data/lib/vedeu/launcher.rb +3 -6
  14. data/lib/vedeu/models/attributes/background.rb +9 -1
  15. data/lib/vedeu/models/attributes/colour_translator.rb +40 -2
  16. data/lib/vedeu/models/attributes/foreground.rb +9 -1
  17. data/lib/vedeu/models/colour.rb +6 -0
  18. data/lib/vedeu/models/composition.rb +8 -1
  19. data/lib/vedeu/models/geometry.rb +27 -14
  20. data/lib/vedeu/models/interface.rb +59 -0
  21. data/lib/vedeu/models/line.rb +4 -0
  22. data/lib/vedeu/models/stream.rb +10 -0
  23. data/lib/vedeu/models/style.rb +2 -0
  24. data/lib/vedeu/support/buffer.rb +12 -1
  25. data/lib/vedeu/support/buffers.rb +10 -0
  26. data/lib/vedeu/support/clear.rb +4 -0
  27. data/lib/vedeu/support/esc.rb +26 -8
  28. data/lib/vedeu/support/event.rb +28 -0
  29. data/lib/vedeu/support/events.rb +2 -0
  30. data/lib/vedeu/support/focus.rb +14 -6
  31. data/lib/vedeu/support/grid.rb +6 -0
  32. data/lib/vedeu/support/groups.rb +13 -3
  33. data/lib/vedeu/support/input.rb +7 -2
  34. data/lib/vedeu/support/log.rb +7 -1
  35. data/lib/vedeu/support/position.rb +6 -0
  36. data/lib/vedeu/support/render.rb +38 -0
  37. data/lib/vedeu/support/terminal.rb +69 -15
  38. data/lib/vedeu/support/trace.rb +8 -0
  39. data/lib/vedeu/support/view.rb +6 -0
  40. data/test/integration/run_once_test.rb +26 -0
  41. data/test/lib/vedeu/api/api_test.rb +19 -6
  42. data/test/lib/vedeu/api/interface_test.rb +67 -1
  43. data/test/lib/vedeu/api/line_test.rb +10 -0
  44. data/test/lib/vedeu/api/stream_test.rb +8 -0
  45. data/test/lib/vedeu/configuration_test.rb +119 -12
  46. data/test/lib/vedeu/models/attributes/background_test.rb +1 -1
  47. data/test/lib/vedeu/models/attributes/foreground_test.rb +1 -1
  48. data/test/lib/vedeu/models/interface_test.rb +22 -0
  49. data/test/lib/vedeu/support/buffer_test.rb +44 -0
  50. data/test/lib/vedeu/support/events_test.rb +3 -9
  51. data/test/lib/vedeu/support/input_test.rb +1 -0
  52. data/test/lib/vedeu/support/terminal_test.rb +128 -5
  53. data/test/test_helper.rb +2 -2
  54. data/vedeu.gemspec +1 -1
  55. metadata +5 -2
@@ -19,6 +19,16 @@ module Vedeu
19
19
  ]
20
20
  )
21
21
  end
22
+
23
+ it 'raises an exception if a block was not given' do
24
+ proc {
25
+ Vedeu.view 'carbon' do
26
+ line do
27
+ stream
28
+ end
29
+ end
30
+ }.must_raise(InvalidSyntax)
31
+ end
22
32
  end
23
33
 
24
34
  describe '#text' do
@@ -7,6 +7,14 @@ module Vedeu
7
7
  it 'returns the value assigned' do
8
8
  Stream.new.align(:left).must_equal(:left)
9
9
  end
10
+
11
+ it 'returns the value assigned' do
12
+ Stream.new.align('left').must_equal(:left)
13
+ end
14
+
15
+ it 'raises an exception if the value is invalid' do
16
+ proc { Stream.new.align(:unknown) }.must_raise(InvalidSyntax)
17
+ end
10
18
  end
11
19
 
12
20
  describe '#text' do
@@ -2,30 +2,137 @@ require 'test_helper'
2
2
 
3
3
  module Vedeu
4
4
  describe Configuration do
5
- describe '#configure' do
6
- it 'returns an empty collection when no options are set' do
7
- Configuration.configure([]).must_equal({})
5
+ before { Configuration.reset }
6
+
7
+ after { Configuration.reset }
8
+
9
+ describe '#colour_mode' do
10
+ it 'returns the value of the colour_mode option' do
11
+ ENV['VEDEU_TERM'] = 'xterm-truecolor'
12
+ Configuration.colour_mode.must_equal(16777216)
13
+ end
14
+
15
+ it '--colour-mode' do
16
+ Configuration.configure(['--colour-mode', '16'])
17
+ Configuration.colour_mode.must_equal(16)
18
+ end
19
+
20
+ it '--colour-mode' do
21
+ Configuration.configure(['--colour-mode', '256'])
22
+ Configuration.colour_mode.must_equal(256)
23
+ end
24
+
25
+ it '--colour-mode' do
26
+ Configuration.configure(['--colour-mode', '348'])
27
+ Configuration.colour_mode.must_equal(8)
28
+ end
29
+ end
30
+
31
+ describe '#debug?' do
32
+ it 'returns the value of the debug option' do
33
+ Configuration.debug?.must_equal(false)
34
+ end
35
+
36
+ it '--debug' do
37
+ Configuration.configure(['--debug'])
38
+ Configuration.debug?.must_equal(true)
39
+ end
40
+ end
41
+
42
+ describe '#interactive?' do
43
+ it 'returns the value of the interactive option' do
44
+ Configuration.interactive?.must_equal(true)
45
+ end
46
+
47
+ it '--interactive' do
48
+ Configuration.configure(['--interactive'])
49
+ Configuration.interactive?.must_equal(true)
50
+ end
51
+
52
+ it '--noninteractive' do
53
+ Configuration.configure(['--noninteractive'])
54
+ Configuration.interactive?.must_equal(false)
8
55
  end
9
56
 
10
- it 'returns the options which instructs Vedeu to run once' do
57
+ it '--standalone' do
58
+ Configuration.configure(['--standalone'])
59
+ Configuration.interactive?.must_equal(false)
60
+ end
61
+ end
62
+
63
+ describe '#once?' do
64
+ it 'returns the value of the once option' do
65
+ Configuration.once?.must_equal(false)
66
+ end
67
+
68
+ it '--run-once' do
11
69
  Configuration.configure(['--run-once'])
12
- .must_equal({ interactive: false })
70
+ Configuration.once?.must_equal(true)
13
71
  end
14
72
 
15
- it 'returns the options which instructs Vedeu to run in cooked mode' do
73
+ it '--run-many' do
74
+ Configuration.configure(['--run-many'])
75
+ Configuration.once?.must_equal(false)
76
+ end
77
+ end
78
+
79
+ describe '#terminal_mode' do
80
+ it 'returns the value of the mode option' do
81
+ Configuration.terminal_mode.must_equal(:raw)
82
+ end
83
+
84
+ it '--cooked' do
16
85
  Configuration.configure(['--cooked'])
17
- .must_equal({ mode: :cooked })
86
+ Configuration.terminal_mode.must_equal(:cooked)
18
87
  end
19
88
 
20
- it 'returns the options which instructs Vedeu to run in raw mode' do
89
+ it '--raw' do
21
90
  Configuration.configure(['--raw'])
22
- .must_equal({ mode: :raw })
91
+ Configuration.terminal_mode.must_equal(:raw)
23
92
  end
93
+ end
24
94
 
25
- it 'returns the options which instructs Vedeu to run with debugging on' do
26
- Configuration.configure(['--debug'])
27
- .must_equal({ debug: true })
95
+ describe '#trace?' do
96
+ it 'returns the value of the trace option' do
97
+ Configuration.trace?.must_equal(false)
98
+ end
99
+
100
+ it '--trace' do
101
+ Configuration.configure(['--trace'])
102
+ Configuration.trace?.must_equal(true)
103
+ end
104
+ end
105
+
106
+ describe '#options' do
107
+ it 'returns the options configured' do
108
+ Configuration.options.must_equal(
109
+ {
110
+ colour_mode: 16777216,
111
+ debug: false,
112
+ interactive: true,
113
+ once: false,
114
+ terminal_mode: :raw,
115
+ trace: false
116
+ }
117
+ )
28
118
  end
29
119
  end
120
+
121
+ describe 'exploring multiple options set' do
122
+ it 'returns the options correctly configured' do
123
+ Configuration.configure(['--standalone', '--run-once'])
124
+ Configuration.options.must_equal(
125
+ {
126
+ interactive: false,
127
+ once: true,
128
+ colour_mode: 16777216,
129
+ debug: false,
130
+ terminal_mode: :raw,
131
+ trace: false
132
+ }
133
+ )
134
+ end
135
+ end
136
+
30
137
  end
31
138
  end
@@ -42,7 +42,7 @@ module Vedeu
42
42
  end
43
43
 
44
44
  describe 'when the colour is a CSS value (8-bit / 256 colours)' do
45
- before { Terminal.stubs(:colour_mode).returns(8) }
45
+ before { Configuration.stubs(:colour_mode).returns(8) }
46
46
 
47
47
  {
48
48
  '#5f0000' => "\e[48;5;52m",
@@ -42,7 +42,7 @@ module Vedeu
42
42
  end
43
43
 
44
44
  describe 'when the colour is a CSS value (8-bit / 256 colours)' do
45
- before { Terminal.stubs(:colour_mode).returns(8) }
45
+ before { Configuration.stubs(:colour_mode).returns(8) }
46
46
 
47
47
  {
48
48
  '#5f0000' => "\e[38;5;52m",
@@ -106,5 +106,27 @@ module Vedeu
106
106
  )
107
107
  end
108
108
  end
109
+
110
+ describe '#clear' do
111
+ it 'delegates to the Clear class to return an empty interface' do
112
+ Interface.new({
113
+ name: '#to_s',
114
+ lines: [],
115
+ colour: {
116
+ foreground: '#ff0000',
117
+ background: '#000000'
118
+ },
119
+ geometry: {
120
+ width: 9,
121
+ height: 3
122
+ }
123
+ }).clear.must_equal(
124
+ "\e[38;2;255;0;0m\e[48;2;0;0;0m" \
125
+ "\e[1;1H \e[1;1H" \
126
+ "\e[2;1H \e[2;1H" \
127
+ "\e[3;1H \e[3;1H"
128
+ )
129
+ end
130
+ end
109
131
  end
110
132
  end
@@ -34,6 +34,50 @@ module Vedeu
34
34
  end
35
35
 
36
36
  describe '#refresh' do
37
+ it 'renders the fresh content if available' do
38
+ interface = Interface.new
39
+ buffer = Buffer.new({ back: interface, front: nil, interface: interface })
40
+ Terminal.stub(:output, '') do
41
+ buffer.refresh.must_be_instance_of(Buffer)
42
+ buffer.refresh.wont_equal(buffer)
43
+ end
44
+ end
45
+
46
+ it 'clears the interface if no content is available' do
47
+ interface = Interface.new
48
+ buffer = Buffer.new({ back: nil, front: nil, interface: interface })
49
+ Terminal.stub(:output, '') do
50
+ buffer.refresh.must_equal(buffer)
51
+ end
52
+ end
53
+
54
+ it 'renders the previous/old content if nothing new has arrived' do
55
+ interface = Interface.new
56
+ buffer = Buffer.new({ back: nil, front: interface, interface: interface })
57
+ Terminal.stub(:output, '') do
58
+ buffer.refresh.must_equal(buffer)
59
+ end
60
+ end
61
+ end
62
+
63
+ describe '#render' do
64
+ it 'renders the interface and returns the Buffer instance' do
65
+ interface = Interface.new
66
+ buffer = Buffer.new({ back: nil, front: nil, interface: interface })
67
+ Terminal.stub(:output, '') do
68
+ buffer.render.must_equal(buffer)
69
+ end
70
+ end
71
+ end
72
+
73
+ describe '#clear' do
74
+ it 'clears the interface and returns the Buffer instance' do
75
+ interface = Interface.new
76
+ buffer = Buffer.new({ back: nil, front: nil, interface: interface })
77
+ Terminal.stub(:output, '') do
78
+ buffer.clear.must_equal(buffer)
79
+ end
80
+ end
37
81
  end
38
82
  end
39
83
  end
@@ -4,15 +4,9 @@ module Vedeu
4
4
  describe Events do
5
5
  describe '#event' do
6
6
  it 'adds the event block to the handlers' do
7
- skip
8
7
  events = Events.new
9
- events.event(:some_event) { proc { |x| x } }
10
- end
11
-
12
- it 'adds the specified throttle to the throttles' do
13
- skip
14
- events = Events.new
15
- events.event(:some_event, 250) { proc { |x| x } }
8
+ events.event(:sulphur) { proc { |x| x } }
9
+ events.registered.must_equal([:sulphur])
16
10
  end
17
11
  end
18
12
 
@@ -61,7 +55,7 @@ module Vedeu
61
55
  describe '#reset' do
62
56
  it 'removes all events registered' do
63
57
  events = Events.new do
64
- event(:some_event) { proc { |x| x } }
58
+ event(:potassium) { proc { |x| x } }
65
59
  end
66
60
  events.reset.must_equal({})
67
61
  end
@@ -16,6 +16,7 @@ module Vedeu
16
16
  "\e[H" => :home,
17
17
  "\e[3~" => :delete,
18
18
  "\e[F" => :end,
19
+ "\e[Z" => :shift_tab,
19
20
  "\eOP" => :f1,
20
21
  "\eOQ" => :f2,
21
22
  "\eOR" => :f3,
@@ -4,17 +4,57 @@ module Vedeu
4
4
  describe Terminal do
5
5
  let(:console) { IO.console }
6
6
 
7
- describe '.input' do
8
- it 'returns the entered string' do
9
- console.stub :gets, "test\n" do
10
- Terminal.input.must_equal('test')
7
+ describe '.open' do
8
+ before { IO.console.stubs(:print) }
9
+
10
+ it 'raises an exception when no block is given' do
11
+ proc { Terminal.open }.must_raise(InvalidSyntax)
12
+ end
13
+
14
+ it 'opens a new terminal console in raw mode' do
15
+ Configuration.stub(:terminal_mode, :raw) do
16
+ capture_io do
17
+ Terminal.open do
18
+ print "Hello from raw mode!"
19
+ end
20
+ end.must_equal(["Hello from raw mode!", ""])
21
+ end
22
+ end
23
+
24
+ it 'opens a new terminal console in cooked mode' do
25
+ Configuration.stub(:terminal_mode, :cooked) do
26
+ capture_io do
27
+ Terminal.open do
28
+ print "Hello from cooked mode!"
29
+ end
30
+ end.must_equal(["Hello from cooked mode!", ""])
11
31
  end
12
32
  end
13
33
  end
14
34
 
35
+ describe '.input' do
36
+ # it 'returns the entered string in cooked mode' do
37
+ # Configuration.stub(:terminal_mode, :cooked) do
38
+ # Terminal.console.stub(:gets, "test\n") do
39
+ # Terminal.input.must_equal('test')
40
+ # end
41
+ # end
42
+ # end
43
+
44
+ # it 'returns the entered string in raw mode' do
45
+ # Configuration.stub(:terminal_mode, :raw) do
46
+ # console.stub :getch, "a" do
47
+ # Terminal.input.must_equal("a")
48
+ # end
49
+ # end
50
+ # end
51
+ end
52
+
15
53
  describe '.output' do
54
+ before { IO.console.stubs(:print) }
55
+
16
56
  it 'returns the output' do
17
- Terminal.output.must_equal('')
57
+ Terminal.output('Some output...').must_equal('Some output...')
18
58
  end
19
59
  end
20
60
 
@@ -27,6 +67,73 @@ module Vedeu
27
67
  end
28
68
  end
29
69
 
70
+ describe '.clear_screen' do
71
+ it 'clears the screen' do
72
+ console.stub :print, nil do
73
+ Terminal.clear_screen.must_equal("\e[38;2;39m\e[48;2;49m\e[2J")
74
+ end
75
+ end
76
+ end
77
+
78
+ describe '.set_cursor_mode' do
79
+ it 'shows the cursor in cooked mode' do
80
+ Terminal.cooked_mode!
81
+ Terminal.set_cursor_mode.must_equal("\e[?25h")
82
+ end
83
+
84
+ it 'hides the cursor in raw mode' do
85
+ Terminal.raw_mode!
86
+ Terminal.set_cursor_mode.must_equal(nil)
87
+ end
88
+ end
89
+
90
+ describe '.raw_mode?' do
91
+ it 'returns true if the terminal is in raw mode' do
92
+ Terminal.raw_mode!
93
+ Terminal.raw_mode?.must_equal(true)
94
+ end
95
+
96
+ it 'returns false if the terminal is not in raw mode' do
97
+ Terminal.cooked_mode!
98
+ Terminal.raw_mode?.must_equal(false)
99
+ end
100
+ end
101
+
102
+ describe '.cooked_mode?' do
103
+ it 'returns true if the terminal is in cooked mode' do
104
+ Terminal.cooked_mode!
105
+ Terminal.cooked_mode?.must_equal(true)
106
+ end
107
+
108
+ it 'returns false if the terminal is not in cooked mode' do
109
+ Terminal.raw_mode!
110
+ Terminal.cooked_mode?.must_equal(false)
111
+ end
112
+ end
113
+
114
+ describe '.switch_mode!' do
115
+ it 'returns :cooked if previously :raw' do
116
+ Terminal.raw_mode!
117
+ Terminal.switch_mode!.must_equal(:cooked)
118
+ end
119
+
120
+ it 'returns :raw if previously :cooked' do
121
+ Terminal.cooked_mode!
122
+ Terminal.switch_mode!.must_equal(:raw)
123
+ end
124
+ end
125
+
126
+ describe '.mode' do
127
+ before do
128
+ Configuration.stubs(:terminal_mode).returns(:raw)
129
+ Terminal.switch_mode! if Terminal.mode == :cooked
130
+ end
131
+
132
+ it 'returns the configured terminal mode' do
133
+ Terminal.mode.must_equal(:raw)
134
+ end
135
+ end
136
+
30
137
  describe '.centre' do
31
138
  it 'returns the centre point on the terminal' do
32
139
  console.stub :winsize, [25, 80] do
@@ -35,6 +142,22 @@ module Vedeu
35
142
  end
36
143
  end
37
144
 
145
+ describe '.centre_y' do
146
+ it 'returns the centre `y` point on the terminal' do
147
+ console.stub :winsize, [25, 80] do
148
+ Terminal.centre_y.must_equal(12)
149
+ end
150
+ end
151
+ end
152
+
153
+ describe '.centre_x' do
154
+ it 'returns the centre `x` point on the terminal' do
155
+ console.stub :winsize, [25, 80] do
156
+ Terminal.centre_x.must_equal(40)
157
+ end
158
+ end
159
+ end
160
+
38
161
  describe '.width' do
39
162
  it 'returns the width of the terminal' do
40
163
  console.stub :winsize, [25, 80] do