vedeu 0.1.17 → 0.1.18

Sign up to get free protection for your applications and to get access to all the features.
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