vedeu 0.1.7 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
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