vedeu 0.1.12 → 0.1.13

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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +7 -0
  3. data/lib/vedeu.rb +12 -12
  4. data/lib/vedeu/api/api.rb +23 -18
  5. data/lib/vedeu/api/events.rb +1 -1
  6. data/lib/vedeu/api/interface.rb +29 -19
  7. data/lib/vedeu/api/line.rb +1 -34
  8. data/lib/vedeu/api/stream.rb +1 -34
  9. data/lib/vedeu/models/attributes/attributes.rb +7 -7
  10. data/lib/vedeu/models/attributes/colour_translator.rb +45 -7
  11. data/lib/vedeu/models/colour.rb +4 -2
  12. data/lib/vedeu/models/composition.rb +9 -9
  13. data/lib/vedeu/models/interface.rb +1 -1
  14. data/lib/vedeu/models/line.rb +17 -3
  15. data/lib/vedeu/{api → models}/store.rb +0 -2
  16. data/lib/vedeu/models/stream.rb +17 -3
  17. data/lib/vedeu/output/buffers.rb +14 -8
  18. data/lib/vedeu/output/view.rb +7 -3
  19. data/lib/vedeu/support/esc.rb +1 -14
  20. data/lib/vedeu/support/position.rb +31 -0
  21. data/lib/vedeu/support/terminal.rb +4 -0
  22. data/test/lib/vedeu/api/api_test.rb +21 -0
  23. data/test/lib/vedeu/api/interface_test.rb +765 -51
  24. data/test/lib/vedeu/configuration_test.rb +5 -0
  25. data/test/lib/vedeu/models/composition_test.rb +1 -1
  26. data/test/lib/vedeu/models/interface_test.rb +59 -17
  27. data/test/lib/vedeu/{api → models}/store_test.rb +12 -3
  28. data/test/lib/vedeu/output/clear_test.rb +1 -1
  29. data/test/lib/vedeu/output/render_test.rb +1 -1
  30. data/test/lib/vedeu/output/view_test.rb +17 -0
  31. data/test/lib/vedeu/support/esc_test.rb +0 -10
  32. data/test/lib/vedeu/support/position_test.rb +19 -0
  33. data/test/support/colour_test.sh +100 -0
  34. data/test/{stats.sh → support/stats.sh} +0 -0
  35. data/vedeu.gemspec +1 -1
  36. metadata +16 -10
  37. data/lib/vedeu/api/view.rb +0 -45
  38. data/test/lib/vedeu/api/view_test.rb +0 -565
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: da7db44d3fbb1a694c60eb4a8112015a79fa0f4e
4
- data.tar.gz: a132a4ac6eff1b1a4d12684837ce72edf667ec77
3
+ metadata.gz: 5bc23985fc8270da6cebe20612c4aaa02967a07f
4
+ data.tar.gz: bf6587149152e3111183fe10abe958376a024872
5
5
  SHA512:
6
- metadata.gz: 4cfc8f7d4de135c80242b489e3bfb04ed627896c2fc945380dbc7c1c54c85a17792430fbd0a68ecf9734589819ab3f27c83121feeee0cfe895a0228896c894ad
7
- data.tar.gz: 58e58be65d0e522abb67d542f1a7f390c8663fb80748664a9d5b7fe248307ea8b378bc77d79d727af585f2a4d03cb9bc2f0c51e8bbe70b30b0cb41bffbeb020f
6
+ metadata.gz: dd0458ce9a0b1e2b93788a4adef0439e7946db8a5e4e508ce68a662d885dd726b900692af0b8dfd385f24ddb78be19a0ddf5ce628c165243de0672a499a82cc8
7
+ data.tar.gz: 6a56e31aba151c295f6989e43947a1e0e6b7571cd5c65d8b17077abf3c15eee7d3fa558559f9e72db63421e1afedb5aeba46eb7b5052b937a49efe5191cb78c0
data/README.md CHANGED
@@ -6,6 +6,13 @@
6
6
  Vedeu is my attempt at creating a terminal based application framework without the need for Ncurses. I've tried to make Vedeu as simple and flexible as possible.
7
7
 
8
8
 
9
+ ## Requirements
10
+
11
+ Vedeu has been built on MacOSX 10.9 (Mavericks) with Ruby v2.1.2.
12
+
13
+ Note: You may have trouble running Vedeu with Windows installations.
14
+
15
+
9
16
  ## Installation
10
17
 
11
18
  Add this line to your application's Gemfile:
data/lib/vedeu.rb CHANGED
@@ -13,6 +13,17 @@ require 'io/console'
13
13
  require 'logger'
14
14
  require 'optparse'
15
15
 
16
+ require 'vedeu/models/attributes/attributes'
17
+ require 'vedeu/models/attributes/colour_translator'
18
+ require 'vedeu/models/composition'
19
+ require 'vedeu/support/terminal'
20
+ require 'vedeu/models/geometry'
21
+ require 'vedeu/models/colour'
22
+ require 'vedeu/models/interface'
23
+ require 'vedeu/models/line'
24
+ require 'vedeu/models/store'
25
+ require 'vedeu/models/stream'
26
+
16
27
  require 'vedeu/api/api'
17
28
  require 'vedeu/api/events'
18
29
  require 'vedeu/api/grid'
@@ -20,29 +31,18 @@ require 'vedeu/api/helpers'
20
31
  require 'vedeu/api/interface'
21
32
  require 'vedeu/api/line'
22
33
  require 'vedeu/api/log'
23
- require 'vedeu/api/store'
24
34
  require 'vedeu/api/stream'
25
- require 'vedeu/api/view'
26
35
 
27
36
  require 'vedeu/application'
28
37
  require 'vedeu/configuration'
29
38
  require 'vedeu/launcher'
30
39
 
31
- require 'vedeu/models/attributes/attributes'
32
- require 'vedeu/models/attributes/colour_translator'
33
- require 'vedeu/models/composition'
34
- require 'vedeu/support/terminal'
35
- require 'vedeu/models/geometry'
36
- require 'vedeu/models/colour'
37
- require 'vedeu/models/interface'
38
- require 'vedeu/models/line'
39
- require 'vedeu/models/stream'
40
-
41
40
  require 'vedeu/output/buffers'
42
41
  require 'vedeu/output/clear'
43
42
  require 'vedeu/output/render'
44
43
  require 'vedeu/output/view'
45
44
 
45
+ require 'vedeu/support/position'
46
46
  require 'vedeu/support/esc'
47
47
  require 'vedeu/support/input'
48
48
  require 'vedeu/support/menu'
data/lib/vedeu/api/api.rb CHANGED
@@ -6,42 +6,47 @@ module Vedeu
6
6
 
7
7
  def events
8
8
  @events ||= API::Events.new do
9
- event(:_exit_) { fail StopIteration }
10
- event(:_log_) { |message| Vedeu.log(message) }
11
- event(:_mode_switch_) { fail ModeSwitch }
12
- event(:_clear_) { Terminal.output(Esc.string('clear')) }
13
- event(:_refresh_) { Buffers.refresh_all }
14
-
15
- event(:_keypress_) do |key|
16
- trigger(:key, key)
17
- trigger(:_log_, (' ' * 42) + "key: #{key}")
18
- trigger(:_mode_switch_) if key == :escape
19
- end
9
+ event(:_log_) { |msg| Vedeu.log(msg) }
10
+ event(:_exit_) { fail StopIteration }
11
+ event(:_mode_switch_) { fail ModeSwitch }
12
+ event(:_clear_) { Terminal.clear_screen }
13
+ event(:_refresh_) { Buffers.refresh_all }
14
+ event(:_keypress_) { |key| Vedeu.keypress(key) }
20
15
  end
21
16
  end
22
17
 
18
+ def height
19
+ Terminal.height
20
+ end
21
+
23
22
  def interface(name, &block)
24
- API::Interface.create(name, &block)
23
+ API::Interface.define({ name: name }, &block)
24
+ end
25
+
26
+ def keypress(key)
27
+ trigger(:key, key)
28
+ trigger(:_log_, (' ' * 42) + "key: #{key}")
29
+ trigger(:_mode_switch_) if key == :escape
25
30
  end
26
31
 
27
32
  def log(message)
28
33
  API::Log.logger.debug(message)
29
34
  end
30
35
 
31
- # def render(object = nil)
32
- # Vedeu::View.render(object)
33
- # end
34
-
35
36
  def trigger(name, *args)
36
37
  Vedeu.events.trigger(name, *args)
37
38
  end
38
39
 
39
40
  def use(name)
40
- Vedeu::Interface.new(Store.query(name))
41
+ Vedeu::Interface.new(Vedeu::Store.query(name))
41
42
  end
42
43
 
43
44
  def view(name, &block)
44
- API::View.build(name, &block)
45
+ API::Interface.build({ name: name }, &block)
46
+ end
47
+
48
+ def width
49
+ Terminal.width
45
50
  end
46
51
  end
47
52
 
@@ -39,7 +39,7 @@ module Vedeu
39
39
  attr_reader :handlers
40
40
 
41
41
  def method_missing(method, *args, &block)
42
- @self_before_instance_eval.send method, *args, &block
42
+ @self_before_instance_eval.send(method, *args, &block)
43
43
  end
44
44
  end
45
45
  end
@@ -5,35 +5,45 @@ module Vedeu
5
5
  YOutOfBounds = Class.new(StandardError)
6
6
 
7
7
  module API
8
- class Interface
9
- def self.create(name, &block)
10
- new(name).create(&block)
8
+ class Interface < Vedeu::Interface
9
+ def self.build(attributes = {}, &block)
10
+ new(attributes, &block).attributes
11
11
  end
12
12
 
13
- def initialize(name)
14
- @name = name.to_s
13
+ def self.define(attributes = {}, &block)
14
+ new(attributes).define(&block)
15
15
  end
16
16
 
17
- def create(&block)
18
- instance_eval(&block) if block_given?
17
+ def initialize(attributes = {}, &block)
18
+ @attributes = attributes
19
19
 
20
- stored_attributes = Store.create(attributes)
20
+ if block_given?
21
+ @self_before_instance_eval = eval('self', block.binding)
21
22
 
22
- interface = Vedeu::Interface.new(stored_attributes)
23
+ instance_eval(&block)
24
+ end
25
+ end
23
26
 
27
+ def define(&block)
28
+ instance_eval(&block) if block_given?
29
+ stored_attributes = Vedeu::Store.create(attributes)
30
+ interface = Vedeu::Interface.new(stored_attributes)
24
31
  Vedeu::Buffers.create(interface)
25
-
26
32
  interface
27
33
  end
28
34
 
29
- private
30
-
31
- attr_reader :name
35
+ def line(&block)
36
+ attributes[:lines] << Line.build(&block)
37
+ end
32
38
 
33
39
  def use(value)
34
40
  Vedeu.use(value)
35
41
  end
36
42
 
43
+ def colour(value)
44
+ attributes[:colour] = value
45
+ end
46
+
37
47
  def cursor(value)
38
48
  attributes[:cursor] = value
39
49
  end
@@ -74,6 +84,10 @@ module Vedeu
74
84
  attributes[:geometry][:centred] = value
75
85
  end
76
86
 
87
+ def style(value)
88
+ attributes[:style] = value
89
+ end
90
+
77
91
  def y_out_of_bounds?(value)
78
92
  value < 1 || value > Terminal.height
79
93
  end
@@ -82,12 +96,8 @@ module Vedeu
82
96
  value < 1 || value > Terminal.width
83
97
  end
84
98
 
85
- def method_missing(method_name, arg, &block)
86
- attributes[method_name] = arg
87
- end
88
-
89
- def attributes
90
- @attributes ||= { name: name, geometry: {} }
99
+ def method_missing(method, *args, &block)
100
+ @self_before_instance_eval.send(method, *args, &block)
91
101
  end
92
102
  end
93
103
  end
@@ -1,23 +1,8 @@
1
1
  module Vedeu
2
2
  module API
3
- class Line
3
+ class Line < Vedeu::Line
4
4
  include Helpers
5
5
 
6
- def self.build(attributes = {}, &block)
7
- new(attributes, &block).build
8
- end
9
-
10
- def initialize(attributes = {}, &block)
11
- @attributes = attributes
12
- @self_before_instance_eval = eval('self', block.binding)
13
-
14
- instance_eval(&block)
15
- end
16
-
17
- def build
18
- attributes
19
- end
20
-
21
6
  def stream(&block)
22
7
  attributes[:streams] << API::Stream.build(&block)
23
8
  end
@@ -37,24 +22,6 @@ module Vedeu
37
22
  colour: { background: value }
38
23
  }, &block)
39
24
  end
40
-
41
- def attributes
42
- @_attributes ||= defaults.merge!(@attributes)
43
- end
44
-
45
- def defaults
46
- {
47
- colour: {},
48
- style: [],
49
- streams: []
50
- }
51
- end
52
-
53
- private
54
-
55
- def method_missing(method, *args, &block)
56
- @self_before_instance_eval.send method, *args, &block
57
- end
58
25
  end
59
26
  end
60
27
  end
@@ -1,23 +1,8 @@
1
1
  module Vedeu
2
2
  module API
3
- class Stream
3
+ class Stream < Vedeu::Stream
4
4
  include Helpers
5
5
 
6
- def self.build(attributes = {}, &block)
7
- new(attributes, &block).build
8
- end
9
-
10
- def initialize(attributes = {}, &block)
11
- @attributes = attributes
12
- @self_before_instance_eval = eval('self', block.binding)
13
-
14
- instance_eval(&block)
15
- end
16
-
17
- def build
18
- attributes
19
- end
20
-
21
6
  def align(value)
22
7
  attributes[:align] = value
23
8
  end
@@ -29,24 +14,6 @@ module Vedeu
29
14
  def width(value)
30
15
  attributes[:width] = value
31
16
  end
32
-
33
- def attributes
34
- @_attributes ||= defaults.merge!(@attributes)
35
- end
36
-
37
- def defaults
38
- {
39
- colour: {},
40
- style: [],
41
- text: ''
42
- }
43
- end
44
-
45
- private
46
-
47
- def method_missing(method, *args, &block)
48
- @self_before_instance_eval.send method, *args, &block
49
- end
50
17
  end
51
18
  end
52
19
  end
@@ -2,15 +2,15 @@ module Vedeu
2
2
  module Attributes
3
3
  extend self
4
4
 
5
- def coercer(value, model, key)
6
- return [] if value.nil? || value.empty?
5
+ def coercer(values, model, key)
6
+ return [] if values.nil? || values.empty?
7
7
 
8
- [value].flatten.map do |v|
9
- if v.is_a?(model)
10
- v
8
+ [values].flatten.map do |value|
9
+ if value.is_a?(model)
10
+ value
11
11
 
12
12
  else
13
- model.new(v)
13
+ model.new(value)
14
14
 
15
15
  end
16
16
  end
@@ -19,7 +19,7 @@ module Vedeu
19
19
  def coerce_styles(values)
20
20
  return '' if values.nil? || values.empty?
21
21
 
22
- Array(values).flatten.map { |s| Esc.string(s) }.join
22
+ Array(values).flatten.map { |value| Esc.string(value) }.join
23
23
  end
24
24
  end
25
25
  end
@@ -1,19 +1,34 @@
1
1
  module Vedeu
2
2
  class ColourTranslator
3
- def initialize(html_colour = '')
3
+ def initialize(html_colour = '', options = {})
4
4
  @html_colour = html_colour
5
+ @options = options
5
6
  end
6
7
 
7
8
  def background
8
9
  return '' unless valid?
9
10
 
10
- ["\e[48;5;", translate, 'm'].join
11
+ if truecolor?
12
+ r, g, b = translate
13
+ ["\e[48;2;", r, ';', g, ';', b, 'm'].join
14
+
15
+ else
16
+ ["\e[48;5;", translate, 'm'].join
17
+
18
+ end
11
19
  end
12
20
 
13
21
  def foreground
14
22
  return '' unless valid?
15
23
 
16
- ["\e[38;5;", translate, 'm'].join
24
+ if truecolor?
25
+ r, g, b = translate
26
+ ["\e[38;2;", r, ';', g, ';', b, 'm'].join
27
+
28
+ else
29
+ ["\e[38;5;", translate, 'm'].join
30
+
31
+ end
17
32
  end
18
33
 
19
34
  private
@@ -21,19 +36,28 @@ module Vedeu
21
36
  attr_reader :html_colour
22
37
 
23
38
  def translate
24
- [16, red, green, blue].inject(:+)
39
+ if truecolor?
40
+ [red, green, blue]
41
+ else
42
+ [
43
+ 16,
44
+ ((red / 51) * 36),
45
+ ((green / 51) * 6),
46
+ ((blue / 51) * 1)
47
+ ].inject(:+)
48
+ end
25
49
  end
26
50
 
27
51
  def red
28
- (html_colour[1..2].to_i(16) / 51) * 36
52
+ html_colour[1..2].to_i(16)
29
53
  end
30
54
 
31
55
  def green
32
- (html_colour[3..4].to_i(16) / 51) * 6
56
+ html_colour[3..4].to_i(16)
33
57
  end
34
58
 
35
59
  def blue
36
- (html_colour[5..6].to_i(16) / 51) * 1
60
+ html_colour[5..6].to_i(16)
37
61
  end
38
62
 
39
63
  def valid?
@@ -53,5 +77,19 @@ module Vedeu
53
77
  def valid_format?
54
78
  html_colour =~ /^#([A-Fa-f0-9]{6})$/
55
79
  end
80
+
81
+ def truecolor?
82
+ options.fetch(:truecolor)
83
+ end
84
+
85
+ def options
86
+ defaults.merge!(@options)
87
+ end
88
+
89
+ def defaults
90
+ {
91
+ truecolor: false
92
+ }
93
+ end
56
94
  end
57
95
  end