vedeu 0.2.0 → 0.2.1
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 +3 -9
- data/docs/api.md +70 -42
- data/elements.txt +118 -0
- data/lib/vedeu.rb +14 -4
- data/lib/vedeu/api/api.rb +67 -24
- data/lib/vedeu/api/composition.rb +19 -0
- data/lib/vedeu/api/defined.rb +7 -0
- data/lib/vedeu/api/interface.rb +103 -75
- data/lib/vedeu/api/keymap.rb +62 -0
- data/lib/vedeu/api/menu.rb +3 -1
- data/lib/vedeu/configuration.rb +24 -6
- data/lib/vedeu/models/attributes/coercions.rb +18 -26
- data/lib/vedeu/models/attributes/colour_translator.rb +7 -7
- data/lib/vedeu/models/attributes/presentation.rb +12 -1
- data/lib/vedeu/models/geometry.rb +5 -1
- data/lib/vedeu/models/interface.rb +6 -47
- data/lib/vedeu/models/keymap.rb +66 -0
- data/lib/vedeu/models/line.rb +3 -1
- data/lib/vedeu/models/stream.rb +10 -1
- data/lib/vedeu/models/style.rb +10 -1
- data/lib/vedeu/output/compositor.rb +3 -0
- data/lib/vedeu/output/refresh.rb +16 -74
- data/lib/vedeu/output/render.rb +44 -17
- data/lib/vedeu/output/view.rb +3 -0
- data/lib/vedeu/repositories/buffers.rb +32 -42
- data/lib/vedeu/repositories/events.rb +8 -11
- data/lib/vedeu/repositories/focus.rb +15 -13
- data/lib/vedeu/repositories/groups.rb +20 -2
- data/lib/vedeu/repositories/interfaces.rb +22 -2
- data/lib/vedeu/repositories/keymap_validator.rb +104 -0
- data/lib/vedeu/repositories/keymaps.rb +239 -0
- data/lib/vedeu/repositories/menus.rb +12 -3
- data/lib/vedeu/support/common.rb +2 -2
- data/lib/vedeu/support/cursor.rb +3 -0
- data/lib/vedeu/support/event.rb +48 -7
- data/lib/vedeu/support/grid.rb +1 -1
- data/lib/vedeu/support/registrar.rb +66 -0
- data/lib/vedeu/support/trace.rb +71 -12
- data/test/lib/vedeu/api/api_test.rb +27 -9
- data/test/lib/vedeu/api/composition_test.rb +10 -0
- data/test/lib/vedeu/api/defined_test.rb +14 -0
- data/test/lib/vedeu/api/interface_test.rb +86 -85
- data/test/lib/vedeu/api/keymap_test.rb +61 -0
- data/test/lib/vedeu/configuration_test.rb +12 -0
- data/test/lib/vedeu/models/attributes/coercions_test.rb +3 -4
- data/test/lib/vedeu/models/interface_test.rb +0 -43
- data/test/lib/vedeu/models/keymap_test.rb +19 -0
- data/test/lib/vedeu/models/style_test.rb +10 -0
- data/test/lib/vedeu/output/refresh_test.rb +0 -12
- data/test/lib/vedeu/output/render_test.rb +51 -0
- data/test/lib/vedeu/repositories/buffers_test.rb +39 -12
- data/test/lib/vedeu/repositories/events_test.rb +6 -0
- data/test/lib/vedeu/repositories/focus_test.rb +12 -0
- data/test/lib/vedeu/repositories/keymap_validator_test.rb +81 -0
- data/test/lib/vedeu/repositories/keymaps_test.rb +254 -0
- data/test/lib/vedeu/support/common_test.rb +26 -0
- data/test/lib/vedeu/support/registrar_test.rb +68 -0
- data/vedeu.gemspec +1 -1
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dec7d96b1f14de41e305192ec084b5f16ea39779
|
4
|
+
data.tar.gz: afd4cc9b1eea2d7eb9c781abbdf71feab39514ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c008ae703f26a202bb20b3c0909dc1779a4d30606365f96342637e5c3715018fa75d16ddf12f7087599a99aa24785830ca55683b286246e77e2ad444101f2fbe
|
7
|
+
data.tar.gz: f587307ac3e309e74b018770048f90dae43cae84b8805f041df8d29c0231c42191d5d92337a5625ceb11c71fc24aca8cb072170227bc7cde177082f299d42833
|
data/README.md
CHANGED
@@ -56,15 +56,9 @@ class MyApp
|
|
56
56
|
# ...
|
57
57
|
end
|
58
58
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
when 'b' then puts "Banana"
|
63
|
-
# ...
|
64
|
-
when :f1 then trigger(:some_event)
|
65
|
-
when :f2 then
|
66
|
-
trigger(:other_event, { args: here }, [:or, :here], :etc)
|
67
|
-
end
|
59
|
+
keys do
|
60
|
+
key('a') { trigger(':apple') }
|
61
|
+
key('b') { trigger(':banana') }
|
68
62
|
end
|
69
63
|
end
|
70
64
|
```
|
data/docs/api.md
CHANGED
@@ -39,45 +39,73 @@ class OtherClassInYourApplication
|
|
39
39
|
|
40
40
|
### API DSL methods
|
41
41
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
name
|
67
|
-
|
68
|
-
|
69
|
-
width
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
42
|
+
#### Events
|
43
|
+
|
44
|
+
- event
|
45
|
+
- trigger
|
46
|
+
- unevent
|
47
|
+
|
48
|
+
|
49
|
+
#### Input
|
50
|
+
|
51
|
+
- keypress
|
52
|
+
- keys
|
53
|
+
- key
|
54
|
+
- interface
|
55
|
+
|
56
|
+
|
57
|
+
#### Interfaces
|
58
|
+
|
59
|
+
- interface
|
60
|
+
- centred
|
61
|
+
- colour
|
62
|
+
- cursor
|
63
|
+
- delay
|
64
|
+
- group
|
65
|
+
- height
|
66
|
+
- name
|
67
|
+
- style
|
68
|
+
- use
|
69
|
+
- width
|
70
|
+
- x
|
71
|
+
- y
|
72
|
+
|
73
|
+
|
74
|
+
#### Views
|
75
|
+
|
76
|
+
- render
|
77
|
+
- views
|
78
|
+
- view
|
79
|
+
- view
|
80
|
+
- colour
|
81
|
+
- line
|
82
|
+
- background
|
83
|
+
- colour
|
84
|
+
- foreground
|
85
|
+
- stream
|
86
|
+
- align
|
87
|
+
- colour
|
88
|
+
- style
|
89
|
+
- text
|
90
|
+
- width
|
91
|
+
- style
|
92
|
+
- name
|
93
|
+
- style
|
94
|
+
- use
|
95
|
+
|
96
|
+
|
97
|
+
#### Menus
|
98
|
+
|
99
|
+
- menu
|
100
|
+
- items
|
101
|
+
- name
|
102
|
+
|
103
|
+
|
104
|
+
#### Miscellany
|
105
|
+
|
106
|
+
- defined
|
107
|
+
- height
|
108
|
+
- log
|
109
|
+
- resize
|
110
|
+
- width
|
111
|
+
|
data/elements.txt
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
holmium
|
2
|
+
neon
|
3
|
+
mercury
|
4
|
+
protactinium
|
5
|
+
- calcium
|
6
|
+
- fermium
|
7
|
+
- nitrogen
|
8
|
+
- palladium
|
9
|
+
- silicon
|
10
|
+
- oxygen
|
11
|
+
- americium
|
12
|
+
- bismuth
|
13
|
+
ununpentium
|
14
|
+
- chlorine
|
15
|
+
neptunium
|
16
|
+
plutonium
|
17
|
+
- carbon
|
18
|
+
- zinc
|
19
|
+
polonium
|
20
|
+
roentgenium
|
21
|
+
darmstadtium
|
22
|
+
mendelevium
|
23
|
+
copernicium
|
24
|
+
molybdenum
|
25
|
+
aluminium
|
26
|
+
iridium
|
27
|
+
lanthanum
|
28
|
+
neodymium
|
29
|
+
ruthenium
|
30
|
+
bohrium
|
31
|
+
thorium
|
32
|
+
indium
|
33
|
+
uranium
|
34
|
+
strontium
|
35
|
+
rubidium
|
36
|
+
helium
|
37
|
+
berkelium
|
38
|
+
gallium
|
39
|
+
thallium
|
40
|
+
livermorium
|
41
|
+
lithium
|
42
|
+
fluorine
|
43
|
+
chromium
|
44
|
+
europium
|
45
|
+
selenium
|
46
|
+
- cadmium
|
47
|
+
xenon
|
48
|
+
hassium
|
49
|
+
tantalum
|
50
|
+
radium
|
51
|
+
scandium
|
52
|
+
yttrium
|
53
|
+
potassium
|
54
|
+
promethium
|
55
|
+
astatine
|
56
|
+
niobium
|
57
|
+
seaborgium
|
58
|
+
cerium
|
59
|
+
lead
|
60
|
+
caesium
|
61
|
+
gold
|
62
|
+
phosphorus
|
63
|
+
antimony
|
64
|
+
sodium
|
65
|
+
rhodium
|
66
|
+
magnesium
|
67
|
+
hafnium
|
68
|
+
rhenium
|
69
|
+
cobalt
|
70
|
+
francium
|
71
|
+
ununtrium
|
72
|
+
rutherfordium
|
73
|
+
manganese
|
74
|
+
lutetium
|
75
|
+
thulium
|
76
|
+
samarium
|
77
|
+
ytterbium
|
78
|
+
argon
|
79
|
+
technetium
|
80
|
+
actinium
|
81
|
+
iron
|
82
|
+
sulfur
|
83
|
+
tungsten
|
84
|
+
tin
|
85
|
+
hydrogen
|
86
|
+
- vanadium
|
87
|
+
germanium
|
88
|
+
platinum
|
89
|
+
- meitnerium
|
90
|
+
erbium
|
91
|
+
flerovium
|
92
|
+
tellurium
|
93
|
+
zirconium
|
94
|
+
iodine
|
95
|
+
titanium
|
96
|
+
einsteinium
|
97
|
+
dysprosium
|
98
|
+
copper
|
99
|
+
silver
|
100
|
+
arsenic
|
101
|
+
dubnium
|
102
|
+
nobelium
|
103
|
+
radon
|
104
|
+
gadolinium
|
105
|
+
terbium
|
106
|
+
boron
|
107
|
+
ununoctium
|
108
|
+
nickel
|
109
|
+
ununseptium
|
110
|
+
bromine
|
111
|
+
krypton
|
112
|
+
lawrencium
|
113
|
+
beryllium
|
114
|
+
osmium
|
115
|
+
praseodymium
|
116
|
+
barium
|
117
|
+
curium
|
118
|
+
californium
|
data/lib/vedeu.rb
CHANGED
@@ -1,8 +1,5 @@
|
|
1
|
-
#
|
2
|
-
#
|
3
1
|
# Vedeu is a GUI framework for terminal/console applications written in Ruby.
|
4
2
|
#
|
5
|
-
#
|
6
3
|
module Vedeu
|
7
4
|
|
8
5
|
# Raised when Vedeu attempts to access a named buffer that does not exist.
|
@@ -19,9 +16,16 @@ module Vedeu
|
|
19
16
|
# encounters a problem.
|
20
17
|
InvalidSyntax = Class.new(StandardError)
|
21
18
|
|
19
|
+
# Raised when attempting to assign a key which is already in use.
|
20
|
+
KeyInUse = Class.new(StandardError)
|
21
|
+
|
22
22
|
# Raised when a menu cannot be found by name.
|
23
23
|
MenuNotFound = Class.new(StandardError)
|
24
24
|
|
25
|
+
# Raised when the attributes argument to {Vedeu::Registrar} does not contain
|
26
|
+
# a required key or the value to that key is nil or empty.
|
27
|
+
MissingRequired = Class.new(StandardError)
|
28
|
+
|
25
29
|
# Raised intentionally when the client application wishes to switch between
|
26
30
|
# cooked and raw (or vice versa) terminal modes. Vedeu is hard-wired to use
|
27
31
|
# the `Escape` key to trigger this change for the time being.
|
@@ -61,10 +65,10 @@ require 'logger'
|
|
61
65
|
require 'optparse'
|
62
66
|
require 'set'
|
63
67
|
|
68
|
+
require 'vedeu/configuration'
|
64
69
|
require 'vedeu/support/common'
|
65
70
|
require 'vedeu/support/log'
|
66
71
|
require 'vedeu/support/trace'
|
67
|
-
require 'vedeu/configuration'
|
68
72
|
|
69
73
|
require 'vedeu/models/attributes/coercions'
|
70
74
|
require 'vedeu/models/attributes/colour_translator'
|
@@ -82,6 +86,7 @@ require 'vedeu/models/geometry'
|
|
82
86
|
require 'vedeu/models/colour'
|
83
87
|
require 'vedeu/models/style'
|
84
88
|
require 'vedeu/models/interface'
|
89
|
+
require 'vedeu/models/keymap'
|
85
90
|
require 'vedeu/models/line'
|
86
91
|
require 'vedeu/models/stream'
|
87
92
|
|
@@ -92,17 +97,22 @@ require 'vedeu/api/api'
|
|
92
97
|
require 'vedeu/api/composition'
|
93
98
|
require 'vedeu/api/helpers'
|
94
99
|
require 'vedeu/api/interface'
|
100
|
+
require 'vedeu/api/keymap'
|
95
101
|
require 'vedeu/api/line'
|
96
102
|
require 'vedeu/api/menu'
|
97
103
|
require 'vedeu/api/stream'
|
98
104
|
|
99
105
|
require 'vedeu/repositories/menus'
|
106
|
+
require 'vedeu/repositories/keymap_validator'
|
107
|
+
require 'vedeu/repositories/keymaps'
|
100
108
|
require 'vedeu/repositories/interfaces'
|
101
109
|
require 'vedeu/repositories/groups'
|
102
110
|
require 'vedeu/repositories/focus'
|
103
111
|
require 'vedeu/repositories/events'
|
104
112
|
require 'vedeu/repositories/buffers'
|
105
113
|
|
114
|
+
require 'vedeu/support/registrar'
|
115
|
+
|
106
116
|
require 'vedeu/output/clear'
|
107
117
|
require 'vedeu/output/compositor'
|
108
118
|
require 'vedeu/output/refresh'
|
data/lib/vedeu/api/api.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
module Vedeu
|
2
2
|
|
3
|
+
# Vedeu::Trace.call({ trace: true })
|
4
|
+
|
3
5
|
# Provides the API to Vedeu. Methods therein, and classes belonging to this
|
4
6
|
# module expose Vedeu's core functionality.
|
5
7
|
module API
|
@@ -59,7 +61,7 @@ module Vedeu
|
|
59
61
|
#
|
60
62
|
# @return [Hash]
|
61
63
|
def event(name, opts = {}, &block)
|
62
|
-
Vedeu.events.event(name, opts
|
64
|
+
Vedeu.events.event(name, opts, &block)
|
63
65
|
end
|
64
66
|
|
65
67
|
# Initially accessed by Vedeu itself, this sets up some basic events needed
|
@@ -117,29 +119,45 @@ module Vedeu
|
|
117
119
|
API::Interface.define({ name: name }, &block)
|
118
120
|
end
|
119
121
|
|
120
|
-
# Handles the keypress in your application. Can also be used to simulate a
|
121
|
-
# keypress. The example below will have the following workflow:
|
122
|
-
#
|
123
|
-
# 1) Trigger the event `:key` in your application, which you will handle
|
124
|
-
# and perform the appropriate action- maybe nothing.
|
125
|
-
# 2) If debugging is enabled in Vedeu, then the key is logged to the log
|
126
|
-
# file.
|
127
|
-
#
|
128
122
|
# @api public
|
129
|
-
# @param key [String|Symbol] The key which was pressed. Escape sequences
|
130
|
-
# are also supported. Special keys like the F-keys are named as symbols;
|
131
|
-
# i.e. `:f4`. A list of these translations can be found at {Vedeu::Input}.
|
132
123
|
#
|
133
124
|
# @example
|
134
125
|
# Vedeu.keypress('s')
|
135
126
|
#
|
136
|
-
# @
|
127
|
+
# @see Vedeu::Keymaps.use
|
137
128
|
def keypress(key)
|
138
|
-
Vedeu.
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
129
|
+
Vedeu::Keymaps.use(key)
|
130
|
+
end
|
131
|
+
|
132
|
+
# Define actions for keypresses for when specific interfaces are in focus.
|
133
|
+
# Unless an interface is specified, the key will be assumed to be global,
|
134
|
+
# meaning its action will happen regardless of the interface in focus.
|
135
|
+
#
|
136
|
+
# @api public
|
137
|
+
# @param name_or_names [String] The name or names of the interface(s) which
|
138
|
+
# will handle these keys.
|
139
|
+
# @param block [Proc]
|
140
|
+
#
|
141
|
+
# @example
|
142
|
+
# keys do # => will be global
|
143
|
+
# key('s') { :something }
|
144
|
+
# ...
|
145
|
+
#
|
146
|
+
# keys 'my_interface' do # => will only function when 'my_interface'
|
147
|
+
# ... # is in focus
|
148
|
+
#
|
149
|
+
# keys('main', 'other') do # => will function for both 'main' and
|
150
|
+
# ... # 'other' interfaces
|
151
|
+
#
|
152
|
+
# keys do
|
153
|
+
# interface 'my_interface' # => will only function when 'my_interface'
|
154
|
+
# ... # is in focus
|
155
|
+
#
|
156
|
+
# @return [API::Keymap]
|
157
|
+
def keys(*name_or_names, &block)
|
158
|
+
fail InvalidSyntax, '`keys` requires a block.' unless block_given?
|
159
|
+
|
160
|
+
API::Keymap.define({ interfaces: name_or_names }, &block)
|
143
161
|
end
|
144
162
|
|
145
163
|
# Write a message to the Vedeu log file located at `$HOME/.vedeu/vedeu.log`
|
@@ -147,7 +165,7 @@ module Vedeu
|
|
147
165
|
# @api public
|
148
166
|
# @param message [String] The message you wish to emit to the log
|
149
167
|
# file, useful for debugging.
|
150
|
-
# @param force [
|
168
|
+
# @param force [Boolean] When evaluates to true will
|
151
169
|
# write to the log file regardless of the Configuration setting.
|
152
170
|
#
|
153
171
|
# @example
|
@@ -158,40 +176,65 @@ module Vedeu
|
|
158
176
|
Vedeu::Log.logger.debug(message) if Configuration.debug? || force
|
159
177
|
end
|
160
178
|
|
161
|
-
# Register a menu by name which will display
|
162
|
-
#
|
163
|
-
# views without their content.
|
179
|
+
# Register a menu by name which will display a collection of items for your
|
180
|
+
# users to select; and provide interactivity within your application.
|
164
181
|
#
|
165
182
|
# @api public
|
166
183
|
# @param name [String] The name of the menu. Used to reference the
|
167
184
|
# menu throughout your application's execution lifetime.
|
168
185
|
# @param block [Proc] A set of attributes which define the features of the
|
169
|
-
# menu.
|
186
|
+
# menu. See {Vedeu::API::Menu#items} and {Vedeu::API::Menu#name}.
|
170
187
|
#
|
171
188
|
# @example
|
172
189
|
# Vedeu.menu 'my_interface' do
|
190
|
+
# items [:item_1, :item_2, :item_3]
|
173
191
|
# ...
|
174
192
|
#
|
175
193
|
# Vedeu.menu do
|
176
194
|
# name 'menus_must_have_a_name'
|
195
|
+
# items Track.all_my_favourites
|
177
196
|
# ...
|
178
197
|
#
|
179
198
|
# @return [API::Menu]
|
180
199
|
def menu(name = '', &block)
|
200
|
+
fail InvalidSyntax, '`menu` requires a block.' unless block_given?
|
201
|
+
|
181
202
|
API::Menu.define({ name: name }, &block)
|
182
203
|
end
|
183
204
|
|
205
|
+
# Directly write a view buffer to the terminal. Using this method means
|
206
|
+
# that the refresh event does not need to be triggered after creating the
|
207
|
+
# view or views, though can be later triggered if needed.
|
208
|
+
#
|
209
|
+
# @api public
|
210
|
+
# @param block [Proc] The directives you wish to send to render. Must
|
211
|
+
# include `view` or `views` with associated sub-
|
212
|
+
# directives.
|
213
|
+
#
|
214
|
+
# @example
|
215
|
+
# Vedeu.render do
|
216
|
+
# views do
|
217
|
+
# view 'my_interface' do
|
218
|
+
# ...
|
219
|
+
#
|
220
|
+
# @return [Array]
|
221
|
+
def render(&block)
|
222
|
+
API::Composition.render(&block)
|
223
|
+
end
|
224
|
+
|
184
225
|
# When the terminal emit the 'SIGWINCH' signal, Vedeu can intercept this
|
185
226
|
# and attempt to redraw the current interface with varying degrees of
|
186
227
|
# success. Can also be used to simulate a terminal resize.
|
187
228
|
#
|
188
229
|
# @api private
|
189
|
-
# @return []
|
230
|
+
# @return [TrueClass]
|
190
231
|
# :nocov:
|
191
232
|
def resize
|
192
233
|
trigger(:_clear_)
|
193
234
|
|
194
235
|
trigger(:_refresh_)
|
236
|
+
|
237
|
+
true
|
195
238
|
end
|
196
239
|
# :nocov:
|
197
240
|
|