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
@@ -5,6 +5,7 @@ module Vedeu
5
5
 
6
6
  # Define a stream (a subset of a line).
7
7
  #
8
+ # @api public
8
9
  # @param block [Proc] Block contains directives relating to API::Stream.
9
10
  #
10
11
  # @example
@@ -18,6 +19,8 @@ module Vedeu
18
19
  #
19
20
  # @return [Array]
20
21
  def stream(&block)
22
+ fail InvalidSyntax, '`stream` requires a block.' unless block_given?
23
+
21
24
  attributes[:streams] << API::Stream.build(&block)
22
25
  end
23
26
 
@@ -25,6 +28,7 @@ module Vedeu
25
28
  # attributes for this line but is useful for adding lines straight into
26
29
  # the interface.
27
30
  #
31
+ # @api public
28
32
  # @param value [String]
29
33
  #
30
34
  # @example
@@ -37,6 +41,7 @@ module Vedeu
37
41
  attributes[:streams] << { text: value }
38
42
  end
39
43
 
44
+ # @api public
40
45
  # @param value [String]
41
46
  # @param block [Proc]
42
47
  #
@@ -53,6 +58,7 @@ module Vedeu
53
58
  }, &block)
54
59
  end
55
60
 
61
+ # @api public
56
62
  # @param value [String]
57
63
  # @param block [Proc]
58
64
  #
@@ -6,6 +6,7 @@ module Vedeu
6
6
  # Specify the alignment of the stream within the line. Useful in
7
7
  # combination with #width to provide simple formatting effects.
8
8
  #
9
+ # @api public
9
10
  # @param value [Symbol] `:left`, `:centre` and `right` are valid values
10
11
  # and will align accordingly. If not value is specified, the stream will
11
12
  # left align.
@@ -18,11 +19,17 @@ module Vedeu
18
19
  #
19
20
  # @return [Symbol]
20
21
  def align(value)
21
- attributes[:align] = value
22
+ unless [:left, :right, :centre].include?(value.to_sym)
23
+ fail InvalidSyntax, '`align` requires a value of `:left`, `:right` ' \
24
+ 'or `centre`.'
25
+ end
26
+
27
+ attributes[:align] = value.to_sym
22
28
  end
23
29
 
24
30
  # Add textual data to the stream via this method.
25
31
  #
32
+ # @api public
26
33
  # @param value [String] The text to be added to the stream. If the length
27
34
  # of the text is greater than the interface's width, it will be
28
35
  # truncated and ellipsized.
@@ -42,6 +49,7 @@ module Vedeu
42
49
  # stream. Useful in combination with #align to provide simple formatting
43
50
  # effects.
44
51
  #
52
+ # @api public
45
53
  # @param value [Fixnum] The width in characters.
46
54
  #
47
55
  # @example
@@ -1,22 +1,32 @@
1
1
  module Vedeu
2
2
  class Application
3
+ class << self
3
4
 
4
- # :nocov:
5
- # @param options [Hash]
6
- # @return []
7
- def self.start(options = {})
8
- new(options).start
9
- end
5
+ # @return []
6
+ def start
7
+ new.start
8
+ end
9
+ alias_method :restart, :start
10
10
 
11
- # @param options [Hash]
12
- # @return [Application]
13
- def initialize(options = {})
14
- @options = options
15
11
  end
16
12
 
13
+ # @return [Application]
14
+ def initialize; end
15
+
16
+ # Starts the application!
17
+ # - A new terminal screen is opened (or rather the current terminal is
18
+ # requested into either :raw or :cooked mode).
19
+ # - The cursor visibility is then set dependent on this mode. In :raw mode,
20
+ # the cursor is hidden.
21
+ # - The `:_initialize_` event is triggered. Vedeu does not handle this
22
+ # event; the client application may treat this event as Vedeu signalling
23
+ # that it is now ready.
24
+ # - We enter into the main sequence where the application will either run
25
+ # once or continuous, interactively or standalone.
26
+ #
17
27
  # @return []
18
28
  def start
19
- Terminal.open(mode) do
29
+ Terminal.open do
20
30
  Terminal.set_cursor_mode
21
31
 
22
32
  Vedeu.events.trigger(:_initialize_)
@@ -27,63 +37,41 @@ module Vedeu
27
37
 
28
38
  private
29
39
 
30
- attr_reader :options
31
-
40
+ # @api private
41
+ # @return []
32
42
  def runner
33
- if interactive?
34
- interactive { yield }
43
+ if Configuration.once?
44
+ yield
35
45
 
36
46
  else
37
- run_once { yield }
47
+ run_many { yield }
38
48
 
39
49
  end
40
50
  end
41
51
 
52
+ # @api private
53
+ # @return []
42
54
  def main_sequence
43
- Input.capture
44
- end
45
-
46
- def interactive?
47
- options.fetch(:interactive)
48
- end
49
-
50
- def interactive
51
- loop { yield }
52
-
53
- rescue ModeSwitch
54
- if Terminal.raw_mode?
55
- Application.start({ mode: :cooked })
55
+ if Configuration.interactive?
56
+ Input.capture
56
57
 
57
58
  else
58
- Application.start({ mode: :raw })
59
+ # TODO: What should happen here?
59
60
 
60
61
  end
61
62
  end
62
63
 
63
- def run_once
64
- yield
65
- end
66
-
67
- def mode
68
- options.fetch(:mode)
69
- end
64
+ # @api private
65
+ # @return []
66
+ def run_many
67
+ loop { yield }
70
68
 
71
- def debug
72
- Vedeu::API::Trace.call if options.fetch(:debug)
73
- end
69
+ rescue ModeSwitch
70
+ Terminal.switch_mode!
74
71
 
75
- def options
76
- defaults.merge!(@options)
77
- end
72
+ Application.restart
78
73
 
79
- def defaults
80
- {
81
- debug: false,
82
- interactive: true,
83
- mode: :raw
84
- }
85
74
  end
86
- # :nocov:
87
75
 
88
76
  end
89
77
  end
@@ -1,97 +1,216 @@
1
1
  module Vedeu
2
- class Configuration
2
+ module Configuration
3
+ extend self
3
4
 
5
+ # Parses arguments passed on the command-line or via {Vedeu::Launcher} into
6
+ # options used by Vedeu to affect certain behaviours.
7
+ #
4
8
  # @param args [Array]
5
9
  # @return [Hash]
6
- def self.configure(args = [])
7
- new(args).configure
8
- end
10
+ def configure(args = [])
11
+ parser = OptionParser.new do |opts|
12
+ opts.banner = "Usage: #{$PROGRAM_NAME} [options]"
9
13
 
10
- # @return [Hash]
11
- def self.options
12
- new.options
13
- end
14
+ opts.on('-i', '--interactive',
15
+ 'Run the application in interactive mode (default).') do
16
+ options[:interactive] = true
17
+ end
14
18
 
15
- # @param args [Array]
16
- # @return [Configuration]
17
- def initialize(args = [])
18
- @_options = {}
19
- @args = args
20
- end
19
+ opts.on('-I', '--noninteractive', '--standalone',
20
+ 'Run the application non-interactively; i.e. not requiring ' \
21
+ 'intervention from the user.') do
22
+ options[:interactive] = false
23
+ end
21
24
 
22
- # @return [Hash]
23
- def configure
24
- parser = OptionParser.new do |opts|
25
- opts.banner = "Usage: #{$PROGRAM_NAME} [options]"
25
+ opts.on('-1', '--run-once',
26
+ 'Run the application loop once.') do
27
+ options[:once] = true
28
+ end
26
29
 
27
- opts.on('-1', '--run-once', 'Run application once.') do
28
- _options[:interactive] = false
30
+ opts.on('-n', '--run-many',
31
+ 'Run the application loop continuously (default).') do
32
+ options[:once] = false
29
33
  end
30
34
 
31
35
  opts.on('-c', '--cooked', 'Run application in cooked mode.') do
32
- _options[:mode] = :cooked
36
+ options[:terminal_mode] = :cooked
33
37
  end
34
38
 
35
39
  opts.on('-r', '--raw', 'Run application in raw mode (default).') do
36
- _options[:mode] = :raw
40
+ options[:terminal_mode] = :raw
37
41
  end
38
42
 
39
43
  opts.on('-d', '--debug', 'Run application with debugging on.') do
40
- _options[:debug] = true
44
+ options[:debug] = true
45
+ end
46
+
47
+ opts.on('-D', '--trace', 'Run application with debugging on with ' \
48
+ 'method and event tracing (noisy!).') do
49
+ options[:debug] = true
50
+ options[:trace] = true
41
51
  end
42
52
 
43
- opts.on('-C',
44
- '--colour-mode',
45
- 'Run application in either `16` or `256` colour mode.') do |mode|
46
- if ['16', '256'].include?(mode)
47
- _options[:colour_mode] = mode
53
+ opts.on('-C', '--colour-mode [COLOURS]', Integer,
54
+ 'Run application in either `8`, `16` or `256` colour ' \
55
+ 'mode.') do |colours|
56
+ if [8, 16, 256].include?(colours)
57
+ options[:colour_mode] = colours
48
58
 
49
59
  else
50
- exit
60
+ options[:colour_mode] = 8
51
61
 
52
62
  end
53
63
  end
54
64
  end
55
65
  parser.parse!(args)
56
66
 
57
- _options
67
+ options
68
+ end
69
+
70
+ # Returns the chosen colour mode.
71
+ #
72
+ # @return [Fixnum]
73
+ def colour_mode
74
+ options[:colour_mode]
75
+ end
76
+
77
+ # Returns whether debugging is enabled or disabled. Default is false;
78
+ # meaning nothing apart from warnings are written to the log file.
79
+ #
80
+ # @return [TrueClass|FalseClass]
81
+ def debug?
82
+ options[:debug]
83
+ end
84
+ alias_method :debug, :debug?
85
+
86
+ # Returns whether the application is interactive (required user input) or
87
+ # standalone (will run until terminates of natural causes.) Default is true;
88
+ # meaning the application will require user input.
89
+ #
90
+ # @return [TrueClass|FalseClass]
91
+ def interactive?
92
+ options[:interactive]
93
+ end
94
+ alias_method :interactive, :interactive?
95
+
96
+ # Returns whether the application will run through its main loop once or
97
+ # not. Default is false; meaning the application will loop forever or until
98
+ # terminated by the user.
99
+ #
100
+ # @return [TrueClass|FalseClass]
101
+ def once?
102
+ options[:once]
103
+ end
104
+ alias_method :once, :once?
105
+
106
+ # Returns the terminal mode for the application. Default is `:raw`.
107
+ #
108
+ # @return [Symbol]
109
+ def terminal_mode
110
+ options[:terminal_mode]
58
111
  end
59
112
 
113
+ # Returns whether tracing is enabled or disabled. Tracing is very noisy in
114
+ # the log file (logging method calls and events trigger). Default is false;
115
+ # meaning tracing is disabled.
116
+ #
117
+ # @return [TrueClass|FalseClass]
118
+ def trace?
119
+ options[:trace]
120
+ end
121
+ alias_method :trace, :trace?
122
+
123
+ # Returns all the options current configured.
124
+ #
60
125
  # @return [Hash]
61
126
  def options
62
- @options ||= defaults.merge!(@_options)
127
+ @options ||= defaults
63
128
  end
64
129
 
65
- private
130
+ # Resets all options to Vedeu defaults.
131
+ #
132
+ # @return [Hash]
133
+ def reset
134
+ @options = defaults
135
+ end
66
136
 
67
- attr_accessor :args, :_options
137
+ private
68
138
 
139
+ # The Vedeu default options, which of course are influenced by enviroment
140
+ # variables also.
141
+ #
142
+ # @api private
143
+ # @return [Hash]
69
144
  def defaults
70
145
  {
71
- colour_mode: detect_colour_mode,
72
- debug: false,
73
- interactive: true,
74
- mode: :raw
146
+ colour_mode: detect_colour_mode,
147
+ debug: detect_debug_mode,
148
+ interactive: true,
149
+ once: false,
150
+ terminal_mode: :raw, #cooked
151
+ trace: detect_trace_mode,
75
152
  }
76
153
  end
77
154
 
155
+ # Determine the terminal colour mode via enviroment variables, or be
156
+ # optimistic and settle for 256 colours.
157
+ #
158
+ # @api private
159
+ # @return [Fixnum]
78
160
  def detect_colour_mode
79
- if ENV['VEDEUTERM']
80
- case ENV['VEDEUTERM']
161
+ if ENV['VEDEU_TERM']
162
+ case ENV['VEDEU_TERM']
81
163
  when /-256color$/ then 256
82
164
  when /-truecolor$/ then 16777216
83
- else
84
- 256
165
+ else 256
85
166
  end
86
167
 
87
- else
168
+ elsif ENV['TERM']
88
169
  case ENV['TERM']
89
170
  when /-256color$/, 'xterm' then 256
90
171
  when /-color$/, 'rxvt' then 16
91
- else
92
- 256
172
+ else 256
93
173
  end
94
174
 
175
+ else
176
+ 256
177
+
178
+ end
179
+ end
180
+
181
+ # Determine the debug mode via an enviroment variable.
182
+ #
183
+ # @api private
184
+ # @return [TrueClass|FalseClass]
185
+ def detect_debug_mode
186
+ if ENV['VEDEU_DEBUG']
187
+ case ENV['VEDEU_DEBUG']
188
+ when 'true' then true
189
+ when 'false' then false
190
+ else false
191
+ end
192
+
193
+ else
194
+ false
195
+
196
+ end
197
+ end
198
+
199
+ # Determine the trace mode via an environment variable.
200
+ #
201
+ # @api private
202
+ # @return [TrueClass|FalseClass]
203
+ def detect_trace_mode
204
+ if ENV['VEDEU_TRACE']
205
+ case ENV['VEDEU_TRACE']
206
+ when 'true' then true
207
+ when 'false' then false
208
+ else false
209
+ end
210
+
211
+ else
212
+ false
213
+
95
214
  end
96
215
  end
97
216