vedeu 0.0.29 → 0.0.30
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +27 -2
- data/lib/vedeu/application.rb +2 -0
- data/lib/vedeu/models/composition.rb +11 -1
- data/lib/vedeu/models/interface.rb +16 -2
- data/lib/vedeu/models/interface_collection.rb +3 -12
- data/lib/vedeu/models/line.rb +12 -1
- data/lib/vedeu/models/line_collection.rb +5 -13
- data/lib/vedeu/models/stream.rb +11 -1
- data/lib/vedeu/models/stream_collection.rb +5 -13
- data/lib/vedeu/models/style_collection.rb +5 -9
- data/lib/vedeu/output/output.rb +2 -6
- data/lib/vedeu/repository/repository.rb +0 -4
- data/lib/vedeu/support/esc.rb +23 -77
- data/lib/vedeu/support/parser.rb +1 -1
- data/lib/vedeu/support/terminal.rb +5 -6
- data/lib/vedeu/support/wordwrap.rb +3 -0
- data/lib/vedeu/version.rb +1 -1
- data/test/lib/vedeu/models/composition_test.rb +4 -4
- data/test/lib/vedeu/models/interface_collection_test.rb +5 -1
- data/test/lib/vedeu/models/interface_test.rb +1 -1
- data/test/lib/vedeu/models/line_test.rb +10 -1
- data/test/lib/vedeu/models/presentation_test.rb +32 -1
- data/test/lib/vedeu/output/output_test.rb +3 -11
- data/test/lib/vedeu/repository/repository_test.rb +0 -9
- data/test/lib/vedeu/support/esc_test.rb +2 -158
- data/vedeu.gemspec +3 -3
- metadata +14 -25
- data/bin/composition +0 -14
- data/examples/single_interface_app.rb +0 -49
- data/lib/vedeu/models/coercions.rb +0 -21
- data/lib/vedeu/support/cursor.rb +0 -51
- data/test/lib/vedeu/support/cursor_test.rb +0 -176
- data/test/support/output_2.json +0 -1
- data/test/support/output_2.rb +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fad9751a79b86fc406d103fe1882055758c9ca52
|
4
|
+
data.tar.gz: 92d0385d33aee322dd606720acf85e2e892058e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1aa0f28cd2622a96f9bd39b0dfda454efc73e5fc330d6b7387cb74f041bc4b6725ccdd717166311dd4b9c8071b70de6cb50cc40bf6f429bd62a1d797496b9368
|
7
|
+
data.tar.gz: 08607e602dfb5d7a89688069dee68e3a34acf8b3a2f8b725f6c3ecbbaddf8fd65004d1c44dae8a088531c08f108973c95c1288cd22d622a3fca5ba57c84b9991
|
data/README.md
CHANGED
@@ -34,6 +34,20 @@ Expect proper documentation soon!
|
|
34
34
|
keyword: 'quit' }
|
35
35
|
end
|
36
36
|
|
37
|
+
|
38
|
+
### Some Terms
|
39
|
+
|
40
|
+
To understand how Vedeu works, you need to familiarise yourself with some terms.
|
41
|
+
|
42
|
+
- Interface: This is an area on the screen where you can take input or direct output. You will define it's colour and style, its dimensions, including position and give it a name. You can then direct the output of a command to this interface and Vedeu will ensure the content is placed there. Interfaces can be layered, allowing pseudo 3D effects (if that floats your boat), or to provide a richer application experience.
|
43
|
+
|
44
|
+
- Line: An interface is composed of many lines. Their length being the width of the interface and their number being the height of the interface.
|
45
|
+
|
46
|
+
An interface with `width: 12, height: 5` will have five lines, each made of 12 characters.
|
47
|
+
|
48
|
+
- Stream: A stream is a subset of a line. Having streams basically allow us to apply styles and colours to part of a line; their not necessary, but provide you with greater flexibility for your output.
|
49
|
+
|
50
|
+
|
37
51
|
### On Defining Interfaces
|
38
52
|
|
39
53
|
interface :main, {
|
@@ -83,7 +97,18 @@ Geometry for Vedeu, as the same for ANSI terminals, is set top-left, which is po
|
|
83
97
|
|
84
98
|
### Colours
|
85
99
|
|
86
|
-
Vedeu uses HTML/CSS style notation (i.e. '#aadd00').
|
100
|
+
Vedeu uses HTML/CSS style notation (i.e. '#aadd00'), they can be used at the stream level, the line level or for the whole interface.
|
101
|
+
|
102
|
+
"colour": { "foreground": "#ff0000", "background": "#ffffff" }
|
103
|
+
|
104
|
+
|
105
|
+
### Styles
|
106
|
+
|
107
|
+
Vedeu has a range of symbol styles which are compatible with most terminals which are ANSI compatible.
|
108
|
+
|
109
|
+
"style": []
|
110
|
+
|
111
|
+
Like colours, they can be defined in either interfaces, for specific lines or within streams. Styles are applied as encountered.
|
87
112
|
|
88
113
|
|
89
114
|
### Layers
|
@@ -97,7 +122,7 @@ Vedeu uses two rules.
|
|
97
122
|
|
98
123
|
## Contributing
|
99
124
|
|
100
|
-
1. Fork it ( http://github.com
|
125
|
+
1. Fork it ( http://github.com/gavinlaking/vedeu/fork )
|
101
126
|
2. Clone it
|
102
127
|
3. `bundle`
|
103
128
|
4. `rake` or `bundle exec guard`
|
data/lib/vedeu/application.rb
CHANGED
@@ -18,14 +18,24 @@ module Vedeu
|
|
18
18
|
interface.enqueue(interface.to_s)
|
19
19
|
interface
|
20
20
|
end
|
21
|
+
|
22
|
+
self
|
21
23
|
end
|
22
24
|
|
23
25
|
def to_json
|
24
|
-
Oj.dump(
|
26
|
+
Oj.dump(json_attributes, mode: :compat)
|
25
27
|
end
|
26
28
|
|
27
29
|
def to_s
|
28
30
|
interfaces.map(&:to_s).join
|
29
31
|
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def json_attributes
|
36
|
+
{
|
37
|
+
interfaces: interfaces
|
38
|
+
}
|
39
|
+
end
|
30
40
|
end
|
31
41
|
end
|
@@ -4,7 +4,6 @@ require_relative 'presentation'
|
|
4
4
|
require_relative 'line_collection'
|
5
5
|
require_relative '../output/interface_renderer'
|
6
6
|
require_relative '../support/esc'
|
7
|
-
require_relative '../support/cursor'
|
8
7
|
require_relative '../support/queue'
|
9
8
|
require_relative '../support/terminal'
|
10
9
|
|
@@ -38,7 +37,7 @@ module Vedeu
|
|
38
37
|
end
|
39
38
|
|
40
39
|
def to_json
|
41
|
-
Oj.dump(
|
40
|
+
Oj.dump(json_attributes, mode: :compat)
|
42
41
|
end
|
43
42
|
|
44
43
|
def to_s
|
@@ -58,5 +57,20 @@ module Vedeu
|
|
58
57
|
def clear_interface
|
59
58
|
InterfaceRenderer.clear(self)
|
60
59
|
end
|
60
|
+
|
61
|
+
def json_attributes
|
62
|
+
{
|
63
|
+
colour: colour, # TODO: translate back?
|
64
|
+
style: style,
|
65
|
+
name: name,
|
66
|
+
lines: lines,
|
67
|
+
y: y,
|
68
|
+
x: x,
|
69
|
+
z: z,
|
70
|
+
width: width,
|
71
|
+
height: height,
|
72
|
+
cursor: cursor
|
73
|
+
}
|
74
|
+
end
|
61
75
|
end
|
62
76
|
end
|
@@ -1,23 +1,14 @@
|
|
1
1
|
require 'virtus'
|
2
2
|
|
3
3
|
require_relative '../repository/interface_repository'
|
4
|
-
require_relative 'coercions'
|
5
4
|
|
6
5
|
module Vedeu
|
7
6
|
class InterfaceCollection < Virtus::Attribute
|
8
|
-
include Coercions
|
9
|
-
|
10
7
|
def coerce(values)
|
11
|
-
return [] if empty?
|
12
|
-
|
13
|
-
if multiple?(values)
|
14
|
-
values.map do |value|
|
15
|
-
InterfaceRepository.update(value[:name], value)
|
16
|
-
end
|
17
|
-
|
18
|
-
elsif single?(values)
|
19
|
-
[InterfaceRepository.update(values[:name], values)]
|
8
|
+
return [] if values.nil? || values.empty?
|
20
9
|
|
10
|
+
[values].flatten.map do |value|
|
11
|
+
InterfaceRepository.update(value.fetch(:name, nil), value)
|
21
12
|
end
|
22
13
|
end
|
23
14
|
end
|
data/lib/vedeu/models/line.rb
CHANGED
@@ -9,14 +9,25 @@ module Vedeu
|
|
9
9
|
include Virtus.model
|
10
10
|
include Presentation
|
11
11
|
|
12
|
+
attribute :model, Hash
|
12
13
|
attribute :streams, StreamCollection
|
13
14
|
|
14
15
|
def to_json
|
15
|
-
Oj.dump(
|
16
|
+
Oj.dump(json_attributes, mode: :compat)
|
16
17
|
end
|
17
18
|
|
18
19
|
def to_s
|
19
20
|
[colour, style, streams].join
|
20
21
|
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def json_attributes
|
26
|
+
{
|
27
|
+
colour: colour,
|
28
|
+
style: style,
|
29
|
+
streams: streams
|
30
|
+
}
|
31
|
+
end
|
21
32
|
end
|
22
33
|
end
|
@@ -1,26 +1,18 @@
|
|
1
1
|
require 'virtus'
|
2
2
|
|
3
3
|
require_relative 'line'
|
4
|
-
require_relative 'coercions'
|
5
4
|
|
6
5
|
module Vedeu
|
7
|
-
class InvalidLine < StandardError; end
|
8
|
-
|
9
6
|
class LineCollection < Virtus::Attribute
|
10
|
-
include Coercions
|
11
|
-
|
12
7
|
def coerce(values)
|
13
|
-
return [] if empty?
|
14
|
-
|
15
|
-
if multiple?(values)
|
16
|
-
values.map { |v| Line.new(v) }
|
8
|
+
return [] if values.nil? || values.empty?
|
17
9
|
|
18
|
-
|
19
|
-
[Line.new(values)]
|
20
|
-
|
21
|
-
elsif just_text?(values)
|
10
|
+
if values.is_a?(::String)
|
22
11
|
[Line.new({ streams: values })]
|
23
12
|
|
13
|
+
else
|
14
|
+
[values].flatten.map { |value| Line.new(value) }
|
15
|
+
|
24
16
|
end
|
25
17
|
end
|
26
18
|
end
|
data/lib/vedeu/models/stream.rb
CHANGED
@@ -11,11 +11,21 @@ module Vedeu
|
|
11
11
|
attribute :text, String, default: ''
|
12
12
|
|
13
13
|
def to_json
|
14
|
-
Oj.dump(
|
14
|
+
Oj.dump(json_attributes, mode: :compat)
|
15
15
|
end
|
16
16
|
|
17
17
|
def to_s(options = {})
|
18
18
|
[colour, style, text].join
|
19
19
|
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def json_attributes
|
24
|
+
{
|
25
|
+
colour: colour,
|
26
|
+
style: style,
|
27
|
+
text: text
|
28
|
+
}
|
29
|
+
end
|
20
30
|
end
|
21
31
|
end
|
@@ -1,26 +1,18 @@
|
|
1
1
|
require 'virtus'
|
2
2
|
|
3
3
|
require_relative 'stream'
|
4
|
-
require_relative 'coercions'
|
5
4
|
|
6
5
|
module Vedeu
|
7
|
-
class InvalidStream < StandardError; end
|
8
|
-
|
9
6
|
class StreamCollection < Virtus::Attribute
|
10
|
-
include Coercions
|
11
|
-
|
12
7
|
def coerce(values)
|
13
|
-
return [] if empty?
|
14
|
-
|
15
|
-
if multiple?(values)
|
16
|
-
values.map { |v| Stream.new(v) }
|
8
|
+
return [] if values.nil? || values.empty?
|
17
9
|
|
18
|
-
|
19
|
-
[Stream.new(values)]
|
20
|
-
|
21
|
-
elsif values.is_a?(String)
|
10
|
+
if values.is_a?(::String)
|
22
11
|
[Stream.new({ text: values })]
|
23
12
|
|
13
|
+
else
|
14
|
+
[values].flatten.map { |value| Stream.new(value) }
|
15
|
+
|
24
16
|
end
|
25
17
|
end
|
26
18
|
end
|
@@ -1,21 +1,17 @@
|
|
1
1
|
require 'virtus'
|
2
2
|
|
3
|
-
require_relative '../support/cursor'
|
4
3
|
require_relative '../support/esc'
|
5
|
-
require_relative 'coercions'
|
6
4
|
|
7
5
|
module Vedeu
|
8
6
|
class StyleCollection < Virtus::Attribute
|
9
|
-
include Coercions
|
10
|
-
|
11
7
|
def coerce(values)
|
12
|
-
return '' if empty?
|
8
|
+
return '' if values.nil? || values.empty?
|
13
9
|
|
14
|
-
if
|
15
|
-
values.map { |value| Esc.
|
10
|
+
if values.is_a?(::Array)
|
11
|
+
values.map { |value| Esc.string(value) }.join
|
16
12
|
|
17
|
-
elsif
|
18
|
-
Esc.
|
13
|
+
elsif values.is_a?(::String)
|
14
|
+
Esc.string(values)
|
19
15
|
|
20
16
|
end
|
21
17
|
end
|
data/lib/vedeu/output/output.rb
CHANGED
@@ -2,12 +2,8 @@ require_relative '../repository/interface_repository'
|
|
2
2
|
require_relative '../support/terminal'
|
3
3
|
|
4
4
|
module Vedeu
|
5
|
-
|
6
|
-
|
7
|
-
new.render
|
8
|
-
end
|
9
|
-
|
10
|
-
def initialize; end
|
5
|
+
module Output
|
6
|
+
extend self
|
11
7
|
|
12
8
|
def render
|
13
9
|
InterfaceRepository.refresh.each do |interface|
|
data/lib/vedeu/support/esc.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
require_relative 'cursor'
|
2
1
|
require_relative 'terminal'
|
3
2
|
require_relative 'translator'
|
4
3
|
|
@@ -7,102 +6,49 @@ module Vedeu
|
|
7
6
|
extend self
|
8
7
|
|
9
8
|
def background_colour(value = '#000000')
|
10
|
-
[
|
11
|
-
end
|
12
|
-
|
13
|
-
def blink
|
14
|
-
[esc, '5m'].join
|
15
|
-
end
|
16
|
-
|
17
|
-
def blink_off
|
18
|
-
[esc, '25m'].join
|
19
|
-
end
|
20
|
-
|
21
|
-
def bold
|
22
|
-
[esc, '1m'].join
|
23
|
-
end
|
24
|
-
|
25
|
-
def bold_off
|
26
|
-
[esc, '21m'].join
|
27
|
-
end
|
28
|
-
|
29
|
-
def clear
|
30
|
-
[esc, '2J'].join
|
9
|
+
["\e[48;5;", colour_translator(value), 'm'].join
|
31
10
|
end
|
32
11
|
|
33
12
|
def clear_line
|
34
|
-
[
|
13
|
+
"\e[2K"
|
35
14
|
end
|
36
15
|
|
37
|
-
def clear_last_line
|
16
|
+
def clear_last_line
|
38
17
|
set_position((Terminal.height - 1), 1) + clear_line
|
39
18
|
end
|
40
19
|
|
41
|
-
# def cursor(value)
|
42
|
-
# Cursor.
|
43
|
-
# end
|
44
|
-
|
45
|
-
def esc
|
46
|
-
[27.chr, '['].join
|
47
|
-
end
|
48
|
-
|
49
20
|
def foreground_colour(value = '#ffffff')
|
50
|
-
[
|
51
|
-
end
|
52
|
-
#
|
53
|
-
def negative
|
54
|
-
[esc, '7m'].join
|
55
|
-
end
|
56
|
-
|
57
|
-
def positive
|
58
|
-
[esc, '27m'].join
|
59
|
-
end
|
60
|
-
|
61
|
-
def normal
|
62
|
-
[underline_off, bold_off, positive].join
|
63
|
-
end
|
64
|
-
|
65
|
-
def dim
|
66
|
-
[esc, '2m'].join
|
67
|
-
end
|
68
|
-
|
69
|
-
def reset
|
70
|
-
[esc, '0m'].join
|
21
|
+
["\e[38;5;", colour_translator(value), 'm'].join
|
71
22
|
end
|
72
23
|
|
73
24
|
def set_position(y = 1, x = 1)
|
74
|
-
|
25
|
+
row = (y == 0 || y == nil) ? 1 : y
|
26
|
+
column = (x == 0 || x == nil) ? 1 : x
|
27
|
+
|
28
|
+
["\e[", row, ';', column, 'H'].join
|
75
29
|
end
|
76
30
|
|
77
|
-
def
|
31
|
+
def string(value = 'normal')
|
78
32
|
case value
|
79
|
-
when 'blink' then
|
80
|
-
when 'blink_off' then
|
81
|
-
when 'bold' then
|
82
|
-
when 'bold_off' then
|
83
|
-
when 'clear' then
|
84
|
-
when 'hide_cursor' then
|
85
|
-
when 'negative' then
|
86
|
-
when 'positive' then
|
87
|
-
when 'reset' then
|
88
|
-
when 'normal' then
|
89
|
-
when 'dim' then
|
90
|
-
when 'show_cursor' then
|
91
|
-
when 'underline' then
|
92
|
-
when 'underline_off' then
|
33
|
+
when 'blink' then "\e[5m"
|
34
|
+
when 'blink_off' then "\e[25m"
|
35
|
+
when 'bold' then "\e[1m"
|
36
|
+
when 'bold_off' then "\e[21m"
|
37
|
+
when 'clear' then "\e[2J"
|
38
|
+
when 'hide_cursor' then "\e[?25l"
|
39
|
+
when 'negative' then "\e[7m"
|
40
|
+
when 'positive' then "\e[27m"
|
41
|
+
when 'reset' then "\e[0m"
|
42
|
+
when 'normal' then "\e[24m\e[21m\e[27m"
|
43
|
+
when 'dim' then "\e[2m"
|
44
|
+
when 'show_cursor' then "\e[?25h"
|
45
|
+
when 'underline' then "\e[4m"
|
46
|
+
when 'underline_off' then "\e[24m"
|
93
47
|
else
|
94
48
|
''
|
95
49
|
end
|
96
50
|
end
|
97
51
|
|
98
|
-
def underline
|
99
|
-
[esc, '4m'].join
|
100
|
-
end
|
101
|
-
|
102
|
-
def underline_off
|
103
|
-
[esc, '24m'].join
|
104
|
-
end
|
105
|
-
|
106
52
|
private
|
107
53
|
|
108
54
|
def colour_translator(value)
|