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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +26 -23
  3. data/deps.md +15 -19
  4. data/lib/vedeu.rb +8 -54
  5. data/lib/vedeu/api/base.rb +5 -3
  6. data/lib/vedeu/api/events.rb +75 -0
  7. data/lib/vedeu/api/interface.rb +12 -2
  8. data/lib/vedeu/api/store.rb +37 -0
  9. data/lib/vedeu/api/view.rb +12 -4
  10. data/lib/vedeu/application.rb +7 -3
  11. data/lib/vedeu/configuration.rb +4 -0
  12. data/lib/vedeu/instrumentation.rb +1 -9
  13. data/lib/vedeu/launcher.rb +5 -3
  14. data/lib/vedeu/models/attributes/background.rb +11 -0
  15. data/lib/vedeu/models/attributes/collection.rb +1 -7
  16. data/lib/vedeu/{output → models/attributes}/colour_translator.rb +19 -3
  17. data/lib/vedeu/models/attributes/foreground.rb +11 -0
  18. data/lib/vedeu/models/attributes/interface_collection.rb +5 -5
  19. data/lib/vedeu/models/colour.rb +2 -18
  20. data/lib/vedeu/models/interface.rb +22 -13
  21. data/lib/vedeu/models/line.rb +1 -2
  22. data/lib/vedeu/models/stream.rb +21 -13
  23. data/lib/vedeu/output/{clear_interface.rb → clear.rb} +5 -5
  24. data/lib/vedeu/output/{render_interface.rb → render.rb} +4 -4
  25. data/lib/vedeu/support/esc.rb +3 -0
  26. data/lib/vedeu/support/menu.rb +1 -1
  27. data/lib/vedeu/support/terminal.rb +4 -10
  28. data/test/lib/vedeu/api/base_test.rb +1 -1
  29. data/test/lib/vedeu/api/events_test.rb +37 -0
  30. data/test/lib/vedeu/api/grid_test.rb +11 -9
  31. data/test/lib/vedeu/api/interface_test.rb +10 -13
  32. data/test/lib/vedeu/api/line_test.rb +0 -2
  33. data/test/lib/vedeu/api/store_test.rb +49 -0
  34. data/test/lib/vedeu/api/stream_test.rb +1 -1
  35. data/test/lib/vedeu/api/view_test.rb +1 -1
  36. data/test/lib/vedeu/models/attributes/background_test.rb +8 -0
  37. data/test/lib/vedeu/models/attributes/colour_translator_test.rb +78 -0
  38. data/test/lib/vedeu/models/attributes/foreground_test.rb +8 -0
  39. data/test/lib/vedeu/models/attributes/interface_collection_test.rb +22 -6
  40. data/test/lib/vedeu/models/attributes/line_collection_test.rb +1 -6
  41. data/test/lib/vedeu/models/attributes/stream_collection_test.rb +1 -1
  42. data/test/lib/vedeu/models/composition_test.rb +108 -62
  43. data/test/lib/vedeu/models/geometry_test.rb +48 -0
  44. data/test/lib/vedeu/models/interface_test.rb +26 -10
  45. data/test/lib/vedeu/models/line_test.rb +0 -5
  46. data/test/lib/vedeu/output/{clear_interface_test.rb → clear_test.rb} +8 -8
  47. data/test/lib/vedeu/output/{render_interface_test.rb → render_test.rb} +7 -7
  48. data/test/lib/vedeu/support/esc_test.rb +12 -0
  49. data/test/lib/vedeu/support/terminal_test.rb +2 -1
  50. data/test/lib/vedeu_test.rb +0 -38
  51. data/test/support/colours.rb +1 -1
  52. data/vedeu.gemspec +1 -1
  53. metadata +23 -23
  54. data/lib/vedeu/output/text_adaptor.rb +0 -35
  55. data/lib/vedeu/support/events.rb +0 -51
  56. data/lib/vedeu/support/interface_store.rb +0 -43
  57. data/lib/vedeu/support/queue.rb +0 -31
  58. data/test/lib/vedeu/output/colour_translator_test.rb +0 -42
  59. data/test/lib/vedeu/output/text_adaptor_test.rb +0 -73
  60. data/test/lib/vedeu/support/events_test.rb +0 -35
  61. data/test/lib/vedeu/support/interface_store_test.rb +0 -51
  62. data/test/lib/vedeu/support/queue_test.rb +0 -44
@@ -1,10 +1,18 @@
1
1
  require 'vedeu/api/line'
2
- require 'vedeu/support/interface_store'
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 InterfaceStore.query(@name)
44
+ return @name if Store.query(@name)
37
45
  end
38
46
 
39
- # :nocov:
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
@@ -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(:_clear_)
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
@@ -26,6 +26,10 @@ module Vedeu
26
26
  opts.on('-r', '--raw', 'Run application in raw mode (default).') do
27
27
  options[:mode] = :raw
28
28
  end
29
+
30
+ opts.on('-d', '--debug', 'Run application with debugging on.') do
31
+ options[:debug] = true
32
+ end
29
33
  end
30
34
  parser.parse!(args)
31
35
 
@@ -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
- File.expand_path('../../..', __FILE__) + '/logs/vedeu.log'
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
@@ -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
- Vedeu.error(uncaught_exception)
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
@@ -0,0 +1,11 @@
1
+ require 'virtus'
2
+
3
+ require 'vedeu/models/attributes/colour_translator'
4
+
5
+ module Vedeu
6
+ class Background < Virtus::Attribute
7
+ def coerce(value)
8
+ ColourTranslator.new(value).background
9
+ end
10
+ end
11
+ 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
- if value.is_a?(::String)
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).translate
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 translate
11
+ def background
12
12
  return '' unless valid?
13
13
 
14
- [16, red, green, blue].inject(:+)
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
@@ -0,0 +1,11 @@
1
+ require 'virtus'
2
+
3
+ require 'vedeu/models/attributes/colour_translator'
4
+
5
+ module Vedeu
6
+ class Foreground < Virtus::Attribute
7
+ def coerce(value)
8
+ ColourTranslator.new(value).foreground
9
+ end
10
+ end
11
+ end
@@ -1,16 +1,16 @@
1
1
  require 'virtus'
2
2
 
3
- require 'vedeu/support/interface_store'
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 |value|
13
- InterfaceStore.update(value.fetch(:name, nil), value)
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
@@ -1,25 +1,9 @@
1
1
  require 'virtus'
2
2
 
3
- require 'vedeu/output/colour_translator'
4
- require 'vedeu/support/esc'
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/clear_interface'
9
- require 'vedeu/output/render_interface'
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) { refresh }
39
- Vedeu.events.on("_refresh_group_#{group}_".to_sym, self.delay) { refresh } unless group.nil? || group.empty?
40
- Vedeu.events.on("_refresh_#{name}_".to_sym, self.delay) { refresh }
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 ||= ClearInterface.call(self)
51
+ @_clear ||= Clear.call(self)
52
+ end
53
+
54
+ def dequeue
55
+ buffer.pop
47
56
  end
48
57
 
49
58
  def enqueue
50
- super(self.to_s)
59
+ buffer.unshift(self.to_s)
51
60
  end
52
61
 
53
62
  def refresh
54
- if enqueued?
55
- self.current = dequeue
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
- RenderInterface.call(self)
79
+ Render.call(self)
71
80
  end
72
81
 
73
82
  private
@@ -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
@@ -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 # :centre, :right
15
-
16
- def to_s(options = {})
17
- if width
18
- aligned = case align
19
- when :left then text.ljust(width, ' ')
20
- when :right then text.rjust(width, ' ')
21
- when :centre then text.center(width, ' ')
22
- end
23
-
24
- [colour, style, aligned].join
25
- else
26
- [colour, style, text].join
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 ClearInterface
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.geometry.origin(index)
14
- line << ' ' * interface.geometry.width
15
- line << interface.geometry.origin(index)
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.geometry.height.times
28
+ interface.height.times
29
29
  end
30
30
  end
31
31
  end