vedeu 0.1.7 → 0.1.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +26 -23
- data/deps.md +15 -19
- data/lib/vedeu.rb +8 -54
- data/lib/vedeu/api/base.rb +5 -3
- data/lib/vedeu/api/events.rb +75 -0
- data/lib/vedeu/api/interface.rb +12 -2
- data/lib/vedeu/api/store.rb +37 -0
- data/lib/vedeu/api/view.rb +12 -4
- data/lib/vedeu/application.rb +7 -3
- data/lib/vedeu/configuration.rb +4 -0
- data/lib/vedeu/instrumentation.rb +1 -9
- data/lib/vedeu/launcher.rb +5 -3
- data/lib/vedeu/models/attributes/background.rb +11 -0
- data/lib/vedeu/models/attributes/collection.rb +1 -7
- data/lib/vedeu/{output → models/attributes}/colour_translator.rb +19 -3
- data/lib/vedeu/models/attributes/foreground.rb +11 -0
- data/lib/vedeu/models/attributes/interface_collection.rb +5 -5
- data/lib/vedeu/models/colour.rb +2 -18
- data/lib/vedeu/models/interface.rb +22 -13
- data/lib/vedeu/models/line.rb +1 -2
- data/lib/vedeu/models/stream.rb +21 -13
- data/lib/vedeu/output/{clear_interface.rb → clear.rb} +5 -5
- data/lib/vedeu/output/{render_interface.rb → render.rb} +4 -4
- data/lib/vedeu/support/esc.rb +3 -0
- data/lib/vedeu/support/menu.rb +1 -1
- data/lib/vedeu/support/terminal.rb +4 -10
- data/test/lib/vedeu/api/base_test.rb +1 -1
- data/test/lib/vedeu/api/events_test.rb +37 -0
- data/test/lib/vedeu/api/grid_test.rb +11 -9
- data/test/lib/vedeu/api/interface_test.rb +10 -13
- data/test/lib/vedeu/api/line_test.rb +0 -2
- data/test/lib/vedeu/api/store_test.rb +49 -0
- data/test/lib/vedeu/api/stream_test.rb +1 -1
- data/test/lib/vedeu/api/view_test.rb +1 -1
- data/test/lib/vedeu/models/attributes/background_test.rb +8 -0
- data/test/lib/vedeu/models/attributes/colour_translator_test.rb +78 -0
- data/test/lib/vedeu/models/attributes/foreground_test.rb +8 -0
- data/test/lib/vedeu/models/attributes/interface_collection_test.rb +22 -6
- data/test/lib/vedeu/models/attributes/line_collection_test.rb +1 -6
- data/test/lib/vedeu/models/attributes/stream_collection_test.rb +1 -1
- data/test/lib/vedeu/models/composition_test.rb +108 -62
- data/test/lib/vedeu/models/geometry_test.rb +48 -0
- data/test/lib/vedeu/models/interface_test.rb +26 -10
- data/test/lib/vedeu/models/line_test.rb +0 -5
- data/test/lib/vedeu/output/{clear_interface_test.rb → clear_test.rb} +8 -8
- data/test/lib/vedeu/output/{render_interface_test.rb → render_test.rb} +7 -7
- data/test/lib/vedeu/support/esc_test.rb +12 -0
- data/test/lib/vedeu/support/terminal_test.rb +2 -1
- data/test/lib/vedeu_test.rb +0 -38
- data/test/support/colours.rb +1 -1
- data/vedeu.gemspec +1 -1
- metadata +23 -23
- data/lib/vedeu/output/text_adaptor.rb +0 -35
- data/lib/vedeu/support/events.rb +0 -51
- data/lib/vedeu/support/interface_store.rb +0 -43
- data/lib/vedeu/support/queue.rb +0 -31
- data/test/lib/vedeu/output/colour_translator_test.rb +0 -42
- data/test/lib/vedeu/output/text_adaptor_test.rb +0 -73
- data/test/lib/vedeu/support/events_test.rb +0 -35
- data/test/lib/vedeu/support/interface_store_test.rb +0 -51
- data/test/lib/vedeu/support/queue_test.rb +0 -44
data/lib/vedeu/api/view.rb
CHANGED
@@ -1,10 +1,18 @@
|
|
1
1
|
require 'vedeu/api/line'
|
2
|
-
require 'vedeu/
|
2
|
+
require 'vedeu/api/store'
|
3
3
|
|
4
4
|
module Vedeu
|
5
5
|
module API
|
6
6
|
InterfaceNotSpecified = Class.new(StandardError)
|
7
7
|
|
8
|
+
def render(object = nil)
|
9
|
+
Vedeu::View.render(object)
|
10
|
+
end
|
11
|
+
|
12
|
+
def view(name = '', &block)
|
13
|
+
Vedeu::API::View.build(name, &block)
|
14
|
+
end
|
15
|
+
|
8
16
|
class View
|
9
17
|
def self.build(name = '', &block)
|
10
18
|
new(name).build(&block)
|
@@ -33,14 +41,14 @@ module Vedeu
|
|
33
41
|
end
|
34
42
|
|
35
43
|
def name
|
36
|
-
return @name if
|
44
|
+
return @name if Store.query(@name)
|
37
45
|
end
|
38
46
|
|
39
|
-
|
47
|
+
private
|
48
|
+
|
40
49
|
def method_missing(method, *args, &block)
|
41
50
|
@self_before_instance_eval.send method, *args, &block
|
42
51
|
end
|
43
|
-
# :nocov
|
44
52
|
end
|
45
53
|
end
|
46
54
|
end
|
data/lib/vedeu/application.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'vedeu/instrumentation'
|
1
2
|
require 'vedeu/support/input'
|
2
3
|
require 'vedeu/support/terminal'
|
3
4
|
|
@@ -5,7 +6,6 @@ module Vedeu
|
|
5
6
|
ModeSwitch = Class.new(StandardError)
|
6
7
|
|
7
8
|
class Application
|
8
|
-
# :nocov:
|
9
9
|
def self.start(options = {})
|
10
10
|
new(options).start
|
11
11
|
end
|
@@ -18,7 +18,7 @@ module Vedeu
|
|
18
18
|
Terminal.open(mode) do
|
19
19
|
Terminal.set_cursor_mode
|
20
20
|
|
21
|
-
Vedeu.events.trigger(:
|
21
|
+
Vedeu.events.trigger(:_initialize_)
|
22
22
|
|
23
23
|
runner { main_sequence }
|
24
24
|
end
|
@@ -67,16 +67,20 @@ module Vedeu
|
|
67
67
|
options.fetch(:mode)
|
68
68
|
end
|
69
69
|
|
70
|
+
def debug
|
71
|
+
Vedeu::Instrumentation::Trace.call if options.fetch(:debug)
|
72
|
+
end
|
73
|
+
|
70
74
|
def options
|
71
75
|
defaults.merge!(@options)
|
72
76
|
end
|
73
77
|
|
74
78
|
def defaults
|
75
79
|
{
|
80
|
+
debug: false,
|
76
81
|
interactive: true,
|
77
82
|
mode: :raw
|
78
83
|
}
|
79
84
|
end
|
80
|
-
# :nocov:
|
81
85
|
end
|
82
86
|
end
|
data/lib/vedeu/configuration.rb
CHANGED
@@ -1,11 +1,8 @@
|
|
1
1
|
require 'date'
|
2
2
|
require 'logger'
|
3
3
|
|
4
|
-
require 'vedeu'
|
5
|
-
|
6
4
|
module Vedeu
|
7
5
|
module Instrumentation
|
8
|
-
# :nocov:
|
9
6
|
class Log
|
10
7
|
def self.logger
|
11
8
|
@logger ||= Logger.new(filename).tap do |log|
|
@@ -25,7 +22,7 @@ module Vedeu
|
|
25
22
|
private
|
26
23
|
|
27
24
|
def self.filename
|
28
|
-
|
25
|
+
Dir.home + '/.vedeu/vedeu.log'
|
29
26
|
end
|
30
27
|
end
|
31
28
|
|
@@ -51,10 +48,6 @@ module Vedeu
|
|
51
48
|
|
52
49
|
private
|
53
50
|
|
54
|
-
def pretty!(&block)
|
55
|
-
["\e[38;5;#{rand(22..231)}m", yield, "\e[38;2;39m"].join
|
56
|
-
end
|
57
|
-
|
58
51
|
def watched
|
59
52
|
options[:event]
|
60
53
|
end
|
@@ -77,6 +70,5 @@ module Vedeu
|
|
77
70
|
# everything except Interface, Geometry and Terminal
|
78
71
|
# klass: /^Vedeu::(?!.*Interface|Geometry|Terminal).*/
|
79
72
|
end
|
80
|
-
# :nocov:
|
81
73
|
end
|
82
74
|
end
|
data/lib/vedeu/launcher.rb
CHANGED
@@ -3,7 +3,6 @@ require 'vedeu/configuration'
|
|
3
3
|
|
4
4
|
module Vedeu
|
5
5
|
class Launcher
|
6
|
-
# :nocov:
|
7
6
|
def initialize(argv, stdin = STDIN,
|
8
7
|
stdout = STDOUT,
|
9
8
|
stderr = STDERR,
|
@@ -22,9 +21,13 @@ module Vedeu
|
|
22
21
|
Application.start(configuration)
|
23
22
|
|
24
23
|
@exit_code = 0
|
24
|
+
# rescue Vedeu::API::InvalidHeight, Vedeu::API::InvalidWidth
|
25
|
+
# Vedeu.error("Cannot run this application.\n " \
|
26
|
+
# "Your terminal window is too small.")
|
25
27
|
|
26
28
|
rescue StandardError => uncaught_exception
|
27
|
-
|
29
|
+
puts uncaught_exception.message
|
30
|
+
puts uncaught_exception.backtrace.join("\n")
|
28
31
|
|
29
32
|
ensure
|
30
33
|
$stdin, $stdout, $stderr = STDIN, STDOUT, STDERR
|
@@ -39,6 +42,5 @@ module Vedeu
|
|
39
42
|
def configuration
|
40
43
|
Configuration.configure(argv)
|
41
44
|
end
|
42
|
-
# :nocov:
|
43
45
|
end
|
44
46
|
end
|
@@ -5,13 +5,7 @@ module Vedeu
|
|
5
5
|
def coercer(value, model, key)
|
6
6
|
return [] if value.nil? || value.empty?
|
7
7
|
|
8
|
-
|
9
|
-
[model.new({ key => value })]
|
10
|
-
|
11
|
-
else
|
12
|
-
[value].flatten.map { |v| model.new(v) }
|
13
|
-
|
14
|
-
end
|
8
|
+
[value].flatten.map { |v| model.new(v) }
|
15
9
|
end
|
16
10
|
end
|
17
11
|
end
|
@@ -1,23 +1,39 @@
|
|
1
1
|
module Vedeu
|
2
2
|
class ColourTranslator
|
3
3
|
def self.translate(html_colour = '')
|
4
|
-
new(html_colour).
|
4
|
+
new(html_colour).value
|
5
5
|
end
|
6
6
|
|
7
7
|
def initialize(html_colour = '')
|
8
8
|
@html_colour = html_colour
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
11
|
+
def background
|
12
12
|
return '' unless valid?
|
13
13
|
|
14
|
-
[
|
14
|
+
["\e[48;5;", translate, 'm'].join
|
15
|
+
end
|
16
|
+
|
17
|
+
def foreground
|
18
|
+
return '' unless valid?
|
19
|
+
|
20
|
+
["\e[38;5;", translate, 'm'].join
|
21
|
+
end
|
22
|
+
|
23
|
+
def value
|
24
|
+
return '' unless valid?
|
25
|
+
|
26
|
+
translate
|
15
27
|
end
|
16
28
|
|
17
29
|
private
|
18
30
|
|
19
31
|
attr_reader :html_colour
|
20
32
|
|
33
|
+
def translate
|
34
|
+
[16, red, green, blue].inject(:+)
|
35
|
+
end
|
36
|
+
|
21
37
|
def red
|
22
38
|
(html_colour[1..2].to_i(16) / 51) * 36
|
23
39
|
end
|
@@ -1,16 +1,16 @@
|
|
1
1
|
require 'virtus'
|
2
2
|
|
3
|
-
require 'vedeu/
|
4
|
-
|
5
|
-
# Todo: mutation (persistence)
|
3
|
+
require 'vedeu/api/store'
|
6
4
|
|
7
5
|
module Vedeu
|
8
6
|
class InterfaceCollection < Virtus::Attribute
|
9
7
|
def coerce(values)
|
10
8
|
return [] if values.nil? || values.empty?
|
11
9
|
|
12
|
-
[values].flatten.map do |
|
13
|
-
|
10
|
+
[values].flatten.map do |buffer_attributes|
|
11
|
+
interface_attributes = API::Store.query(buffer_attributes[:name])
|
12
|
+
|
13
|
+
Interface.new(buffer_attributes.merge!(interface_attributes))
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
data/lib/vedeu/models/colour.rb
CHANGED
@@ -1,25 +1,9 @@
|
|
1
1
|
require 'virtus'
|
2
2
|
|
3
|
-
require 'vedeu/
|
4
|
-
require 'vedeu/
|
3
|
+
require 'vedeu/models/attributes/background'
|
4
|
+
require 'vedeu/models/attributes/foreground'
|
5
5
|
|
6
6
|
module Vedeu
|
7
|
-
class Background < Virtus::Attribute
|
8
|
-
def coerce(value)
|
9
|
-
return '' if value.nil? || value.empty?
|
10
|
-
|
11
|
-
["\e[48;5;", ColourTranslator.translate(value), 'm'].join
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
class Foreground < Virtus::Attribute
|
16
|
-
def coerce(value)
|
17
|
-
return '' if value.nil? || value.empty?
|
18
|
-
|
19
|
-
["\e[38;5;", ColourTranslator.translate(value), 'm'].join
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
7
|
class Colour
|
24
8
|
include Virtus.model
|
25
9
|
|
@@ -5,10 +5,9 @@ require 'vedeu'
|
|
5
5
|
require 'vedeu/models/attributes/line_collection'
|
6
6
|
require 'vedeu/models/colour'
|
7
7
|
require 'vedeu/models/style'
|
8
|
-
require 'vedeu/output/
|
9
|
-
require 'vedeu/output/
|
8
|
+
require 'vedeu/output/clear'
|
9
|
+
require 'vedeu/output/render'
|
10
10
|
require 'vedeu/models/geometry'
|
11
|
-
require 'vedeu/support/queue'
|
12
11
|
require 'vedeu/support/terminal'
|
13
12
|
|
14
13
|
# Todo: mutation (events, current)
|
@@ -16,7 +15,6 @@ require 'vedeu/support/terminal'
|
|
16
15
|
module Vedeu
|
17
16
|
class Interface
|
18
17
|
extend Forwardable
|
19
|
-
include Vedeu::Queue
|
20
18
|
include Virtus.model
|
21
19
|
|
22
20
|
attribute :name, String
|
@@ -28,31 +26,42 @@ module Vedeu
|
|
28
26
|
attribute :current, String, default: ''
|
29
27
|
attribute :cursor, Boolean, default: true
|
30
28
|
attribute :delay, Float, default: 0
|
29
|
+
attribute :buffer, Array, default: []
|
31
30
|
|
32
31
|
def_delegators :@geometry, :north, :east, :south, :west,
|
33
|
-
:top, :right, :bottom, :left
|
32
|
+
:top, :right, :bottom, :left,
|
33
|
+
:width, :height, :origin
|
34
34
|
|
35
35
|
def initialize(attributes = {})
|
36
36
|
super
|
37
37
|
|
38
|
-
Vedeu.events.on(:_refresh_, self.delay)
|
39
|
-
Vedeu.events.on("
|
40
|
-
|
38
|
+
Vedeu.events.on(:_refresh_, self.delay) { refresh }
|
39
|
+
Vedeu.events.on("_refresh_#{name}_".to_sym, self.delay) { refresh }
|
40
|
+
|
41
|
+
unless group.nil? || group.empty?
|
42
|
+
Vedeu.events.on("_refresh_group_#{group}_".to_sym, self.delay) do
|
43
|
+
refresh
|
44
|
+
end
|
45
|
+
end
|
41
46
|
|
42
47
|
self
|
43
48
|
end
|
44
49
|
|
45
50
|
def clear
|
46
|
-
@_clear ||=
|
51
|
+
@_clear ||= Clear.call(self)
|
52
|
+
end
|
53
|
+
|
54
|
+
def dequeue
|
55
|
+
buffer.pop
|
47
56
|
end
|
48
57
|
|
49
58
|
def enqueue
|
50
|
-
|
59
|
+
buffer.unshift(self.to_s)
|
51
60
|
end
|
52
61
|
|
53
62
|
def refresh
|
54
|
-
if
|
55
|
-
self.current =
|
63
|
+
if buffer.any?
|
64
|
+
self.current = buffer.pop
|
56
65
|
|
57
66
|
elsif no_content?
|
58
67
|
self.current = clear
|
@@ -67,7 +76,7 @@ module Vedeu
|
|
67
76
|
end
|
68
77
|
|
69
78
|
def to_s
|
70
|
-
|
79
|
+
Render.call(self)
|
71
80
|
end
|
72
81
|
|
73
82
|
private
|
data/lib/vedeu/models/line.rb
CHANGED
@@ -9,12 +9,11 @@ module Vedeu
|
|
9
9
|
include Virtus.model
|
10
10
|
|
11
11
|
attribute :colour, Colour, default: Colour.new
|
12
|
-
attribute :model, Hash
|
13
12
|
attribute :streams, StreamCollection
|
14
13
|
attribute :style, Style, default: ''
|
15
14
|
|
16
15
|
def to_s
|
17
|
-
[colour, style, streams].join
|
16
|
+
[ colour, style, streams ].join
|
18
17
|
end
|
19
18
|
end
|
20
19
|
end
|
data/lib/vedeu/models/stream.rb
CHANGED
@@ -11,20 +11,28 @@ module Vedeu
|
|
11
11
|
attribute :style, Style, default: ''
|
12
12
|
attribute :text, String, default: ''
|
13
13
|
attribute :width, Integer
|
14
|
-
attribute :align, Symbol, default: :left
|
15
|
-
|
16
|
-
def to_s
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
14
|
+
attribute :align, Symbol, default: :left
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
[ colour, style, data ].join
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def data
|
23
|
+
width? ? aligned : text
|
24
|
+
end
|
25
|
+
|
26
|
+
def aligned
|
27
|
+
case align
|
28
|
+
when :right then text.rjust(width, ' ')
|
29
|
+
when :centre then text.center(width, ' ')
|
30
|
+
else text.ljust(width, ' ')
|
27
31
|
end
|
28
32
|
end
|
33
|
+
|
34
|
+
def width?
|
35
|
+
!!width
|
36
|
+
end
|
29
37
|
end
|
30
38
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Vedeu
|
2
|
-
class
|
2
|
+
class Clear
|
3
3
|
def self.call(interface)
|
4
4
|
new(interface).clear
|
5
5
|
end
|
@@ -10,9 +10,9 @@ module Vedeu
|
|
10
10
|
|
11
11
|
def clear
|
12
12
|
interface_lines.inject([colours]) do |line, index|
|
13
|
-
line << interface.
|
14
|
-
line << ' ' * interface.
|
15
|
-
line << interface.
|
13
|
+
line << interface.origin(index)
|
14
|
+
line << ' ' * interface.width
|
15
|
+
line << interface.origin(index)
|
16
16
|
end.join
|
17
17
|
end
|
18
18
|
|
@@ -25,7 +25,7 @@ module Vedeu
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def interface_lines
|
28
|
-
interface.
|
28
|
+
interface.height.times
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|