Class: TestBench::Output::Writer

Inherits:
Object
  • Object
show all
Defined in:
lib/test_bench/output/writer.rb,
lib/test_bench/output/writer/sgr.rb,
lib/test_bench/output/writer/dependency.rb,
lib/test_bench/output/writer/substitute.rb

Direct Known Subclasses

Substitute::Writer

Defined Under Namespace

Modules: Defaults, Dependency, Mode, SGR, Substitute

Constant Summary collapse

Error =
Class.new(RuntimeError)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#byte_offsetObject



26
27
28
# File 'lib/test_bench/output/writer.rb', line 26

def byte_offset
  @byte_offset ||= 0
end

#deviceObject



6
7
8
# File 'lib/test_bench/output/writer.rb', line 6

def device
  @device ||= StringIO.new
end

#indentation_depthObject



31
32
33
# File 'lib/test_bench/output/writer.rb', line 31

def indentation_depth
  @indentation_depth ||= 0
end

#modeObject



21
22
23
# File 'lib/test_bench/output/writer.rb', line 21

def mode
  @mode ||= Mode.text
end

#stylingObject

Returns the value of attribute styling.



11
12
13
# File 'lib/test_bench/output/writer.rb', line 11

def styling
  @styling
end

#styling_enabledObject Also known as: styling?



13
14
15
16
17
# File 'lib/test_bench/output/writer.rb', line 13

def styling_enabled
  instance_variable_defined?(:@styling_enabled) ?
    @styling_enabled :
    @styling_enabled = self.class.styling?(device, styling)
end

Class Method Details

.assure_styling_setting(styling_setting) ⇒ Object



147
148
149
150
151
# File 'lib/test_bench/output/writer.rb', line 147

def self.assure_styling_setting(styling_setting)
  unless styling_settings.include?(styling_setting)
    raise Error, "Invalid output styling #{styling_setting.inspect} (Valid values: #{styling_settings.map(&:inspect).join(', ')})"
  end
end

.build(device = nil, styling: nil) ⇒ Object



47
48
49
50
51
# File 'lib/test_bench/output/writer.rb', line 47

def self.build(device=nil, styling: nil)
  instance = new
  instance.configure(device: device, styling: styling)
  instance
end

.configure(receiver, writer: nil, styling: nil, device: nil, attr_name: nil) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/test_bench/output/writer.rb', line 53

def self.configure(receiver, writer: nil, styling: nil, device: nil, attr_name: nil)
  attr_name ||= :writer

  if writer.nil?
    instance = build(device, styling: styling)
  else
    instance = writer
  end

  receiver.public_send(:"#{attr_name}=", instance)

  instance
end

.default_styling_settingObject



161
162
163
# File 'lib/test_bench/output/writer.rb', line 161

def self.default_styling_setting
  styling_settings.fetch(0)
end

.styling?(device, styling_setting = nil) ⇒ Boolean

Returns:

  • (Boolean)


132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/test_bench/output/writer.rb', line 132

def self.styling?(device, styling_setting=nil)
  styling_setting ||= Defaults.styling

  assure_styling_setting(styling_setting)

  case styling_setting
  when :detect
    device.tty?
  when :on
    true
  when :off
    false
  end
end

.styling_settingsObject



153
154
155
156
157
158
159
# File 'lib/test_bench/output/writer.rb', line 153

def self.styling_settings
  [
    :detect,
    :on,
    :off
  ]
end

Instance Method Details

#configure(styling: nil, device: nil) ⇒ Object



36
37
38
39
40
41
42
43
44
45
# File 'lib/test_bench/output/writer.rb', line 36

def configure(styling: nil, device: nil)
  device ||= Defaults.device

  unless styling.nil?
    self.class.assure_styling_setting(styling)
  end

  self.device = device
  self.styling = styling
end

#current?(byte_offset) ⇒ Boolean

Returns:

  • (Boolean)


120
121
122
# File 'lib/test_bench/output/writer.rb', line 120

def current?(byte_offset)
  byte_offset >= self.byte_offset
end

#decrease_indentationObject



128
129
130
# File 'lib/test_bench/output/writer.rb', line 128

def decrease_indentation
  self.indentation_depth -= 1
end

#escape_code(id) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/test_bench/output/writer.rb', line 79

def escape_code(id)
  escape_code = SGR.escape_code(id)

  if mode == Mode.text
    return self unless styling?

    self.mode = Mode.escape_sequence

    write("\e[")
  else
    write(';')
  end

  write(escape_code)

  self
end

#increase_indentationObject



124
125
126
# File 'lib/test_bench/output/writer.rb', line 124

def increase_indentation
  self.indentation_depth += 1
end

#indentObject



101
102
103
104
105
# File 'lib/test_bench/output/writer.rb', line 101

def indent
  indentation = '  ' * indentation_depth

  text(indentation)
end

#newlineObject



107
108
109
110
111
112
# File 'lib/test_bench/output/writer.rb', line 107

def newline
  sync
  device.puts('')
  self.byte_offset += 1
  self
end

#syncObject



97
98
99
# File 'lib/test_bench/output/writer.rb', line 97

def sync
  text('')
end

#text(text) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
# File 'lib/test_bench/output/writer.rb', line 67

def text(text)
  if mode == Mode.escape_sequence
    self.mode = Mode.text

    write('m')
  end

  write(text)

  self
end

#write(data) ⇒ Object



114
115
116
117
118
# File 'lib/test_bench/output/writer.rb', line 114

def write(data)
  bytes_written = device.write(data)

  self.byte_offset += bytes_written
end