ttytest 0.4.0 → 0.6.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: d0175fa2266c1f56f709051162f3419862a24355
4
- data.tar.gz: 949439a6f922cd8b71c8c92e10a9721161c152b7
2
+ SHA256:
3
+ metadata.gz: 6c4131b6211dfccc9feb932f2e3eafa11e2d63aeb5f73243b87dd2d5d805b3cd
4
+ data.tar.gz: 8a0c0e1fd412c1d44744833775c1a21ac519ad20e5970ab55eadae372b1b420d
5
5
  SHA512:
6
- metadata.gz: 8af22aa0fb0f3896c113c7e5cb5d929c82e642c44d93e03f5b75729fc3d1e2a2eb5f796f6e09300f6d21bc4d5bc1b70e6a7c3676e0dd0f5bc4ff7d6e91a52c8d
7
- data.tar.gz: 7871021b99ebef74812db882e8ada619135697c114c6df31c19ed282dec13a155237d6162c467cab6f440887ebbf76d43a93eedd9812d3eef139ca47acf00c65
6
+ metadata.gz: 4d2202449e0e68bdf2b796a9102fdaf9b0e95c4465b84c7e670a6154451e9238110b405ff687b84bbb188e0cbcaa2b58096e600e9b5e8d777bc2cbf18ef933a8
7
+ data.tar.gz: 96eed73a08289bbb511e6fc0a7af4171f123087a4673c64430bc2105b70e32cd28d11272de762238570e7e9472dfce0a5ae93bbd0b79452490861dbea270b44c
@@ -0,0 +1,20 @@
1
+ name: Test
2
+
3
+ on: [push]
4
+
5
+ jobs:
6
+ test:
7
+
8
+ runs-on: ubuntu-latest
9
+
10
+ steps:
11
+ - uses: actions/checkout@v1
12
+ - name: Set up Ruby 2.6
13
+ uses: actions/setup-ruby@v1
14
+ with:
15
+ ruby-version: 2.6.x
16
+ - name: Build and test with Rake
17
+ run: |
18
+ gem install bundler
19
+ bundle install --jobs 4 --retry 3
20
+ bundle exec rake
data/.gitignore CHANGED
@@ -1,2 +1,4 @@
1
1
  Gemfile.lock
2
2
  pkg/
3
+ .yardoc/
4
+ doc/
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
- TTYtest is an integration test framework for interactive console applications. It's like [capybara](https://github.com/teamcapybara/capybara) for the terminal.
1
+ TTYtest is an acceptance test framework for interactive console applications. It's like [capybara](https://github.com/teamcapybara/capybara) for the terminal.
2
2
 
3
3
  It works by running commands inside a tmux session, capturing the pane, and comparing the content. The assertions will wait a specified amount of time (default 2 seconds) for the expected content to appear.
4
4
 
5
- [![Build Status](https://travis-ci.org/jhawthorn/ttytest.svg?branch=master)](https://travis-ci.org/jhawthorn/ttytest)
5
+ [![Gem Version](https://badge.fury.io/rb/ttytest.svg)](https://rubygems.org/gems/ttytest)
6
6
 
7
7
  ## Requirements
8
8
 
@@ -11,6 +11,8 @@ It works by running commands inside a tmux session, capturing the pane, and comp
11
11
 
12
12
  ## Usage
13
13
 
14
+ ### Example
15
+
14
16
  ``` ruby
15
17
  @tty = TTYtest.new_terminal(%{PS1='$ ' /bin/sh}, width: 80, height: 24)
16
18
  @tty.assert_row(0, '$')
@@ -18,8 +20,11 @@ It works by running commands inside a tmux session, capturing the pane, and comp
18
20
 
19
21
  @tty.send_keys(%{echo "Hello, world"\n})
20
22
 
21
- @tty.assert_row(0, '$ echo "Hello, world"')
22
- @tty.assert_row(1, 'Hello, world')
23
+ @tty.assert_contents <<TTY
24
+ $ echo "Hello, world"
25
+ Hello, world
26
+ $
27
+ TTY
23
28
  @tty.assert_cursor_position(x: 2, y: 2)
24
29
 
25
30
  p @tty.rows # => ["$ echo \"Hello, world\"", "Hello, world", "$", "", "", "", ...]
@@ -27,6 +32,17 @@ p @tty.rows # => ["$ echo \"Hello, world\"", "Hello, world", "$", "", "", "", ..
27
32
 
28
33
  See also [fzy's integration test](https://github.com/jhawthorn/fzy/blob/master/test/integration/integration_test.rb) for a full example.
29
34
 
35
+ ### Assertions
36
+
37
+ The main way to use TTYtest is through assertions. When called on a `TTYtest::Terminal`, each of these will be retried (for up to 2 seconds by default).
38
+
39
+ Available assertions:
40
+ * `assert_row(row_number, expected_text)`
41
+ * `assert_cursor_position(x: x, y: y)`
42
+ * `assert_cursor_visible`
43
+ * `assert_cursor_hidden`
44
+ * `assert_contents(lines_of_terminal)`
45
+
30
46
  ## TravisCI
31
47
 
32
48
  TTYtest can run on [TravisCI](https://travis-ci.org/), but the version of tmux made available with their default ubuntu 12.04 environment is too old. However the TravisCI ubuntu 14.04 "trusty" image provides tmux 1.8, which works great.
data/Rakefile CHANGED
@@ -1,5 +1,6 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rake/testtask"
3
+ require "yard"
3
4
 
4
5
  Rake::TestTask.new(:test) do |t|
5
6
  t.libs << "test"
@@ -7,6 +8,10 @@ Rake::TestTask.new(:test) do |t|
7
8
  t.test_files = FileList['test/**/*_test.rb']
8
9
  end
9
10
 
11
+ YARD::Rake::YardocTask.new do |t|
12
+ t.files = ['lib/**/*.rb']
13
+ end
14
+
10
15
  task :console do
11
16
  system 'irb -Ilib -rttytest'
12
17
  end
@@ -1,10 +1,17 @@
1
1
  module TTYtest
2
+ # Represents the complete state of a {TTYtest::Terminal} at the time it was captured (contents, cursor position, etc).
3
+ # @attr_reader [Integer] width the number of columns in the captured terminal
4
+ # @attr_reader [Integer] height the number of rows in the captured terminal
5
+ # @attr_reader [Integer] cursor_x the cursor's column (starting at 0) in the captured terminal
6
+ # @attr_reader [Integer] cursor_y the cursor's row (starting at 0) in the captured terminal
2
7
  class Capture
3
8
  include TTYtest::Matchers
4
9
 
5
10
  attr_reader :cursor_x, :cursor_y
6
11
  attr_reader :width, :height
7
12
 
13
+ # Used internally by drivers when called by {Terminal#capture}
14
+ # @api private
8
15
  def initialize(contents, cursor_x: 0, cursor_y: 0, width: nil, height: nil, cursor_visible: true)
9
16
  @rows = (contents+"\nEND").split("\n")[0...-1].map do |row|
10
17
  row || ""
@@ -16,26 +23,33 @@ module TTYtest
16
23
  @cursor_visible = cursor_visible
17
24
  end
18
25
 
26
+ # @return [Array<String>] An array of each row's contend from the captured terminal
19
27
  def rows
20
28
  @rows
21
29
  end
22
30
 
23
- def row(row)
24
- rows[row]
31
+ # @param [Integer] the row to return
32
+ # @return [String] the content of the row from the captured terminal
33
+ def row(row_number)
34
+ rows[row_number]
25
35
  end
26
36
 
37
+ # @return [true,false] Whether the cursor is visible in the captured terminal
27
38
  def cursor_visible?
28
39
  @cursor_visible
29
40
  end
30
41
 
42
+ # @return [true,false] Whether the cursor is hidden in the captured terminal
31
43
  def cursor_hidden?
32
44
  !cursor_visible?
33
45
  end
34
46
 
47
+ # @return [Capture] returns self
35
48
  def capture
36
49
  self
37
50
  end
38
51
 
52
+ # @return [String] All rows of the captured terminal, separated by newlines
39
53
  def to_s
40
54
  rows.join("\n")
41
55
  end
@@ -1,12 +1,21 @@
1
1
  module TTYtest
2
2
  module Matchers
3
+ # Asserts the contents of a single row
4
+ # @param [Integer] row_number the row (starting from 0) to test against
5
+ # @param [String] expected the expected value of the row. Any trailing whitespace is ignored
6
+ # @raise [MatchError] if the row doesn't match
3
7
  def assert_row(row_number, expected)
8
+ expected = expected.rstrip
4
9
  actual = row(row_number)
5
10
  if actual != expected
6
11
  raise MatchError, "expected row #{row_number} to be #{expected.inspect} but got #{actual.inspect}\nEntire screen:\n#{to_s}"
7
12
  end
8
13
  end
9
14
 
15
+ # Asserts that the cursor is in the expected position
16
+ # @param [Integer] x cursor x (row) position, starting from 0
17
+ # @param [Integer] y cursor y (column) position, starting from 0
18
+ # @raise [MatchError] if the cursor position doesn't match
10
19
  def assert_cursor_position(x:, y:)
11
20
  expected = [x, y]
12
21
  actual = [cursor_x, cursor_y]
@@ -15,19 +24,24 @@ module TTYtest
15
24
  end
16
25
  end
17
26
 
27
+ # @raise [MatchError] if the cursor is hidden
18
28
  def assert_cursor_visible
19
29
  if !cursor_visible?
20
30
  raise MatchError, "expected cursor to be visible was hidden\nEntire screen:\n#{to_s}"
21
31
  end
22
32
  end
23
33
 
34
+ # @raise [MatchError] if the cursor is visible
24
35
  def assert_cursor_hidden
25
36
  if !cursor_hidden?
26
37
  raise MatchError, "expected cursor to be hidden was visible\nEntire screen:\n#{to_s}"
27
38
  end
28
39
  end
29
40
 
30
- def assert_matches(expected)
41
+ # Asserts the full contents of the terminal
42
+ # @param [String] expected the full expected contents of the terminal. Trailing whitespace on each line is ignored
43
+ # @raise [MatchError] if the terminal doesn't match the expected content
44
+ def assert_contents(expected)
31
45
  expected_rows = expected.split("\n")
32
46
  diff = []
33
47
  matched = true
@@ -46,6 +60,7 @@ module TTYtest
46
60
  raise MatchError, "screen did not match expected content:\n--- expected\n+++ actual\n#{diff.join("\n")}"
47
61
  end
48
62
  end
63
+ alias_method :assert_matches, :assert_contents
49
64
 
50
65
  METHODS = public_instance_methods
51
66
  end
@@ -3,25 +3,57 @@ require 'ttytest/matchers'
3
3
  require 'ttytest/capture'
4
4
 
5
5
  module TTYtest
6
+ # @attr [Integer] max_wait_time the maximum amount of time (in seconds) to retry assertions before failing.
6
7
  class Terminal
7
8
  extend Forwardable
8
9
 
10
+ attr_accessor :max_wait_time
11
+
12
+ # @api private
13
+ # @see TTYtest.new_terminal
9
14
  def initialize(driver_terminal, max_wait_time: nil)
10
15
  @driver_terminal = driver_terminal
11
- @max_wait_time = max_wait_time
16
+ @max_wait_time = max_wait_time || TTYtest.default_max_wait_time
12
17
  end
13
18
 
14
- def max_wait_time
15
- @max_wait_time || TTYtest.default_max_wait_time
16
- end
19
+ # @!method send_keys(*keys)
20
+ # Simulate typing keys into the terminal
21
+ # @param [String] keys keys to send to the terminal
22
+ # @!method capture
23
+ # Capture the current state of the terminal
24
+ # @return [Capture] instantaneous state of the terminal when called
25
+ def_delegators :@driver_terminal, :send_keys, :capture
17
26
 
18
- def_delegators :@driver_terminal, :send_keys, :send_raw, :capture
19
- def_delegators :capture, :rows, :row, :width, :height, :cursor_visible?, :cursor_hidden?
27
+ # @!method rows
28
+ # @return [Array<String>]
29
+ # @see Capture#rows
30
+ # @!method row(row)
31
+ # @return [String]
32
+ # @see Capture#row
33
+ # @!method width
34
+ # @see Capture#width
35
+ # @return [Integer]
36
+ # @!method height
37
+ # @see Capture#height
38
+ # @return [Integer]
39
+ # @!method cursor_x
40
+ # @see Capture#cursor_x
41
+ # @return [Integer]
42
+ # @!method cursor_y
43
+ # @see Capture#cursor_y
44
+ # @return [Integer]
45
+ # @!method cursor_visible?
46
+ # @see Capture#cursor_visible?
47
+ # @return [true,false]
48
+ # @!method cursor_hidden?
49
+ # @see Capture#cursor_hidden?
50
+ # @return [true,false]
51
+ def_delegators :capture, :rows, :row, :width, :height, :cursor_x, :cursor_y, :cursor_visible?, :cursor_hidden?
20
52
 
21
53
  TTYtest::Matchers::METHODS.each do |matcher_name|
22
- define_method matcher_name do |*args|
54
+ define_method matcher_name do |*args, **kwargs|
23
55
  synchronize do
24
- capture.public_send(matcher_name, *args)
56
+ capture.public_send(matcher_name, *args, **kwargs)
25
57
  end
26
58
  end
27
59
  end
@@ -12,51 +12,67 @@ module TTYtest
12
12
  COMMAND = 'tmux'
13
13
  SOCKET_NAME = 'ttytest'
14
14
  REQUIRED_TMUX_VERSION = '1.8'
15
- CONF_PATH = File.expand_path('../tmux.conf', __FILE__)
15
+ DEFAULT_CONFING_FILE_PATH = File.expand_path('../tmux.conf', __FILE__)
16
16
  SLEEP_INFINITY = 'read x < /dev/fd/1'
17
17
 
18
18
  class TmuxError < StandardError; end
19
19
 
20
- def initialize(debug: false, command: COMMAND, socket_name: SOCKET_NAME)
20
+ def initialize(
21
+ debug: false,
22
+ command: COMMAND,
23
+ socket_name: SOCKET_NAME,
24
+ config_file_path: DEFAULT_CONFING_FILE_PATH
25
+ )
21
26
  @debug = debug
22
27
  @tmux_cmd = command
23
28
  @socket_name = socket_name
29
+ @config_file_path = config_file_path
24
30
  end
25
31
 
26
32
  def new_terminal(cmd, width: 80, height: 24)
27
33
  cmd = "#{cmd}\n#{SLEEP_INFINITY}"
28
34
 
29
35
  session_name = "ttytest-#{SecureRandom.uuid}"
30
- tmux(*%W[-f #{CONF_PATH} new-session -s #{session_name} -d -x #{width} -y #{height} #{cmd}])
36
+ tmux(*%W[-f #{@config_file_path} new-session -s #{session_name} -d -x #{width} -y #{height} #{cmd}])
31
37
  session = Session.new(self, session_name)
32
38
  Terminal.new(session)
33
39
  end
34
40
 
41
+ # @api private
35
42
  def tmux(*args)
36
43
  ensure_available
37
44
  puts "tmux(#{args.inspect[1...-1]})" if debug?
38
45
 
39
- stdout, stderr, status = Open3.capture3(@tmux_cmd, '-L', SOCKET_NAME, *args)
40
- raise TmuxError, "tmux(#{args.inspect[1...-1]}) failed\n#{stderr}" unless status.success?
41
- stdout
46
+ cmd = [@tmux_cmd, '-L', SOCKET_NAME, *args]
47
+ output = nil
48
+ status = nil
49
+ IO.popen(cmd, err: [:child, :out]) do |io|
50
+ output = io.read
51
+ io.close
52
+ status = $?
53
+ end
54
+
55
+ raise TmuxError, "tmux(#{args.inspect[1...-1]}) failed\n#{output}" unless status&.success?
56
+ output
42
57
  end
43
58
 
44
59
  def available?
60
+ return false unless tmux_version
45
61
  @available ||= (Gem::Version.new(tmux_version) >= Gem::Version.new(REQUIRED_TMUX_VERSION))
46
62
  end
47
63
 
64
+ private
65
+
48
66
  def debug?
49
67
  @debug
50
68
  end
51
69
 
52
- private
53
-
54
70
  def ensure_available
55
71
  if !available?
56
72
  if !tmux_version
57
- raise TmuxError, "tmux doesn't seem to be unstalled" unless available?
73
+ raise TmuxError, "Running `tmux -V` to determine version failed. Is tmux installed?"
58
74
  else
59
- raise TmuxError, "tmux version #{tmux_version} does not meet requirement >= #{REQUIRED_TMUX_VERSION}" unless available?
75
+ raise TmuxError, "tmux version #{tmux_version} does not meet requirement >= #{REQUIRED_TMUX_VERSION}"
60
76
  end
61
77
  end
62
78
  end
@@ -3,8 +3,7 @@
3
3
  module TTYtest
4
4
  module Tmux
5
5
  class Session
6
- attr_reader :driver, :name
7
-
6
+ # @api private
8
7
  def initialize(driver, name)
9
8
  @driver = driver
10
9
  @name = name
@@ -12,14 +11,20 @@ module TTYtest
12
11
  ObjectSpace.define_finalizer(self, self.class.finalize(driver, name))
13
12
  end
14
13
 
14
+ # @api private
15
15
  def self.finalize(driver, name)
16
16
  proc { driver.tmux(*%W[kill-session -t #{name}]) }
17
17
  end
18
18
 
19
19
  def capture
20
20
  contents = driver.tmux(*%W[capture-pane -t #{name} -p])
21
- str = driver.tmux(*%W[display-message -t #{name} -p #\{cursor_x},#\{cursor_y},#\{cursor_flag},#\{pane_width},#\{pane_height}])
22
- x, y, cursor_flag, width, height = str.split(',')
21
+ str = driver.tmux(*%W[display-message -t #{name} -p #\{cursor_x},#\{cursor_y},#\{cursor_flag},#\{pane_width},#\{pane_height},#\{pane_dead},#\{pane_dead_status},])
22
+ x, y, cursor_flag, width, height, pane_dead, pane_dead_status, _newline = str.split(',')
23
+
24
+ if pane_dead == "1"
25
+ raise Driver::TmuxError, "Tmux pane has died\nCommand exited with status: #{pane_dead_status}\nEntire screen:\n#{contents}"
26
+ end
27
+
23
28
  TTYtest::Capture.new(
24
29
  contents.chomp("\n"),
25
30
  cursor_x: x.to_i,
@@ -33,6 +38,10 @@ module TTYtest
33
38
  def send_keys(*keys)
34
39
  driver.tmux(*%W[send-keys -t #{name} -l], *keys)
35
40
  end
41
+
42
+ private
43
+
44
+ attr_reader :driver, :name
36
45
  end
37
46
  end
38
47
  end
@@ -1 +1,3 @@
1
1
  set -g status off
2
+ set -g remain-on-exit on
3
+ set -g default-shell /bin/sh
@@ -1,3 +1,3 @@
1
1
  module TTYtest
2
- VERSION = '0.4.0'
2
+ VERSION = '0.6.0'
3
3
  end
data/lib/ttytest.rb CHANGED
@@ -8,6 +8,12 @@ module TTYtest
8
8
  attr_accessor :default_max_wait_time
9
9
 
10
10
  extend Forwardable
11
+ # @!method new_terminal(command, width: 80, height: 24)
12
+ # Create a new terminal through the current driver.
13
+ # @param [String] command a valid shell command to run
14
+ # @param [Integer] width width of the new terminal
15
+ # @param [Integer] height height of the new terminal
16
+ # @return [Terminal] a new terminal running the specified command
11
17
  def_delegators :driver, :new_terminal
12
18
  end
13
19
 
data/ttytest.gemspec CHANGED
@@ -23,7 +23,8 @@ Gem::Specification.new do |spec|
23
23
 
24
24
  spec.required_ruby_version = '>= 2.1.0'
25
25
 
26
- spec.add_development_dependency "bundler", "~> 1.7"
27
- spec.add_development_dependency "rake", "~> 10.0"
26
+ spec.add_development_dependency "bundler"
27
+ spec.add_development_dependency "rake"
28
28
  spec.add_development_dependency "minitest", "~> 5.0"
29
+ spec.add_development_dependency "yard"
29
30
  end
metadata CHANGED
@@ -1,43 +1,42 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ttytest
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Hawthorn
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2016-12-31 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: bundler
15
14
  requirement: !ruby/object:Gem::Requirement
16
15
  requirements:
17
- - - "~>"
16
+ - - ">="
18
17
  - !ruby/object:Gem::Version
19
- version: '1.7'
18
+ version: '0'
20
19
  type: :development
21
20
  prerelease: false
22
21
  version_requirements: !ruby/object:Gem::Requirement
23
22
  requirements:
24
- - - "~>"
23
+ - - ">="
25
24
  - !ruby/object:Gem::Version
26
- version: '1.7'
25
+ version: '0'
27
26
  - !ruby/object:Gem::Dependency
28
27
  name: rake
29
28
  requirement: !ruby/object:Gem::Requirement
30
29
  requirements:
31
- - - "~>"
30
+ - - ">="
32
31
  - !ruby/object:Gem::Version
33
- version: '10.0'
32
+ version: '0'
34
33
  type: :development
35
34
  prerelease: false
36
35
  version_requirements: !ruby/object:Gem::Requirement
37
36
  requirements:
38
- - - "~>"
37
+ - - ">="
39
38
  - !ruby/object:Gem::Version
40
- version: '10.0'
39
+ version: '0'
41
40
  - !ruby/object:Gem::Dependency
42
41
  name: minitest
43
42
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +51,20 @@ dependencies:
52
51
  - - "~>"
53
52
  - !ruby/object:Gem::Version
54
53
  version: '5.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: yard
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
55
68
  description: TTYtest allows running applications inside of a terminal emulator (like
56
69
  tmux) and making assertions on the output.
57
70
  email:
@@ -60,14 +73,13 @@ executables: []
60
73
  extensions: []
61
74
  extra_rdoc_files: []
62
75
  files:
76
+ - ".github/workflows/test.yml"
63
77
  - ".gitignore"
64
- - ".travis.yml"
65
78
  - Gemfile
66
79
  - README.md
67
80
  - Rakefile
68
81
  - lib/ttytest.rb
69
82
  - lib/ttytest/capture.rb
70
- - lib/ttytest/dummy.rb
71
83
  - lib/ttytest/matchers.rb
72
84
  - lib/ttytest/terminal.rb
73
85
  - lib/ttytest/tmux/driver.rb
@@ -79,7 +91,6 @@ homepage: https://github.com/jhawthorn/ttytest
79
91
  licenses:
80
92
  - MIT
81
93
  metadata: {}
82
- post_install_message:
83
94
  rdoc_options: []
84
95
  require_paths:
85
96
  - lib
@@ -94,9 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
105
  - !ruby/object:Gem::Version
95
106
  version: '0'
96
107
  requirements: []
97
- rubyforge_project:
98
- rubygems_version: 2.6.8
99
- signing_key:
108
+ rubygems_version: 3.6.7
100
109
  specification_version: 4
101
110
  summary: TTYtest is an integration test framework for interactive tty applications
102
111
  test_files: []
data/.travis.yml DELETED
@@ -1,14 +0,0 @@
1
- dist: trusty
2
- language: ruby
3
- cache: bundler
4
- sudo: false
5
- before_script:
6
- - tmux -V
7
- rvm:
8
- - 2.2.6
9
- - 2.3.3
10
- - 2.4.0
11
- addons:
12
- apt:
13
- packages:
14
- - tmux
data/lib/ttytest/dummy.rb DELETED
@@ -1,13 +0,0 @@
1
- module TTYtest
2
- class Dummy
3
- attr_accessor :contents
4
-
5
- def initialize
6
- @contents = "\n"*23
7
- end
8
-
9
- def capture
10
- Capture.new(contents)
11
- end
12
- end
13
- end