vedeu 0.1.7 → 0.1.8
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.
- 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
|