highline-test 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in highline-test.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Joe Yates
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,84 @@
1
+ # Highline::Test
2
+
3
+ A micro framework to help you test your HighLine applications.
4
+
5
+ HighLine allows you to supply your own input and output streams (instead of the
6
+ default STDIN and STDOUT). This fact facilitates testing, allowing you to use
7
+ StringIO objects for input and output.
8
+
9
+ The problem with this approach is that it is hard to seperate the test, which pushes
10
+ data to the input stream, and the application which reads that data.
11
+
12
+ HighLine::Test resolves this problem by forking the test process.
13
+ One fork runs the tests, the other runs the application.
14
+ The two processes communicate via pipes.
15
+
16
+ HighLine::test can be used with any testing framework, e.g.
17
+
18
+ * RSpec
19
+ * Test::Unit
20
+ * Cucumber
21
+
22
+ ## Installation
23
+
24
+ Add this line to your application's Gemfile:
25
+
26
+ gem 'highline-test'
27
+
28
+ And then execute:
29
+
30
+ $ bundle
31
+
32
+ Or install it yourself as:
33
+
34
+ $ gem install highline-test
35
+
36
+ ## Usage
37
+
38
+ ```ruby
39
+ require 'highline/test'
40
+
41
+ before do
42
+ # Before running a test, create a HighLine::Test::Client
43
+ @client = HighLine::Test::Client.new
44
+
45
+ # The application itself is started in a block passed to the #run method
46
+ @client.run do |driver|
47
+ # This block is run in a child process
48
+
49
+ # The HighLine instance used by the application *must* be the one supplied by
50
+ # the client.
51
+ HighLine.stub(:new).and_return(@client.high_line)
52
+
53
+ # Do any other setup (e.g. stubbing) here
54
+
55
+ # Start the application under test
56
+ MyApp.new.run
57
+
58
+ # If this block ever completes, the child process will be killed by
59
+ # HighLine::Test
60
+ end
61
+ end
62
+
63
+ after do
64
+ # Ensure the child process is cleaned up
65
+ @client.cleanup
66
+ end
67
+
68
+ it 'says Hello' do
69
+ # Send text input to the application
70
+ @client.type 'Fred'
71
+
72
+ # Test application output
73
+ expect(@client.output).to include('Hello Fred!')
74
+ end
75
+ ```
76
+
77
+ ## Contributing
78
+
79
+ 1. Fork it
80
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
81
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
82
+ 4. Push to the branch (`git push origin my-new-feature`)
83
+ 5. Create new Pull Request
84
+
@@ -0,0 +1,9 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ task :default => :spec
5
+
6
+ RSpec::Core::RakeTask.new do |t|
7
+ t.pattern = 'spec/**/*_spec.rb'
8
+ end
9
+
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'highline/test/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'highline-test'
8
+ spec.version = Highline::Test::VERSION
9
+ spec.authors = ['Joe Yates']
10
+ spec.email = ['joe.g.yates@gmail.com']
11
+ spec.description = %q{Test HighLine applications}
12
+ spec.summary = %q{A micro framework that sets up tests for HighLine applications}
13
+ spec.homepage = ''
14
+ spec.license = 'MIT'
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(spec)/})
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_dependency 'highline'
22
+
23
+ spec.add_development_dependency 'bundler', '~> 1.3'
24
+ spec.add_development_dependency 'rake'
25
+ spec.add_development_dependency 'rspec'
26
+ spec.add_development_dependency 'bourne'
27
+ spec.add_development_dependency 'shoulda-matchers'
28
+ end
29
+
@@ -0,0 +1,11 @@
1
+ class HighLine
2
+ module Test
3
+ PIPE_BUFFER_SIZE = 4096
4
+ end
5
+ end
6
+
7
+ require 'highline/test/version'
8
+ require 'highline/test/partial_reader'
9
+ require 'highline/test/driver'
10
+ require 'highline/test/client'
11
+
@@ -0,0 +1,90 @@
1
+ module HighLine::Test
2
+ class Client
3
+ DEFAULT_POST_INPUT_DELAY = 0.1
4
+
5
+ # The delay in milliseconds that the client waits after sending text via
6
+ # the #type method
7
+ attr_accessor :delay
8
+ attr_accessor :child_pid
9
+
10
+ def initialize
11
+ @delay = DEFAULT_POST_INPUT_DELAY
12
+ setup
13
+ end
14
+
15
+ def run
16
+ raise "Supply a block to provide a context in which the application is run" unless block_given?
17
+
18
+ create_pipes
19
+
20
+ @child_pid = fork
21
+
22
+ if child_pid.nil?
23
+ partial_reader = PartialReader.new(@input_read)
24
+ driver = Driver.new(partial_reader, @output_write)
25
+ yield driver
26
+
27
+ # if the subject ever returns, kill the child process
28
+ Process.kill(:KILL, Process.pid)
29
+ end
30
+ end
31
+
32
+ def cleanup
33
+ return unless running?
34
+
35
+ kill_child_process
36
+ close_pipes
37
+ setup
38
+ end
39
+
40
+ def running?
41
+ not child_pid.nil?
42
+ end
43
+
44
+ def type(text)
45
+ raise 'Client is not running' unless running?
46
+
47
+ @input_write << "#{text}\n"
48
+ sleep delay
49
+ end
50
+
51
+ def output
52
+ return @output if @output
53
+ @output_write.close unless @output_write.closed?
54
+ @output = @output_read.readpartial(PIPE_BUFFER_SIZE)
55
+ end
56
+
57
+ private
58
+
59
+ def setup
60
+ @input_read = nil
61
+ @input_write = nil
62
+ @output_read = nil
63
+ @output_write = nil
64
+ @output = nil
65
+ @child_pid = nil
66
+ end
67
+
68
+ def create_pipes
69
+ @input_read, @input_write = IO.pipe
70
+ @output_read, @output_write = IO.pipe
71
+ end
72
+
73
+ def kill_child_process
74
+ return if child_pid.nil?
75
+
76
+ Process.kill(:KILL, child_pid)
77
+ rescue Errno::ESRCH => e
78
+ # swallow errors if the child process has already been killed
79
+ ensure
80
+ @child_pid = nil
81
+ end
82
+
83
+ def close_pipes
84
+ [@input_read, @input_write, @output_read, @output_write].each do |stream|
85
+ stream.close unless stream.closed?
86
+ end
87
+ end
88
+ end
89
+ end
90
+
@@ -0,0 +1,26 @@
1
+ require 'highline'
2
+
3
+ module HighLine::Test
4
+ class Driver
5
+ attr_reader :input_stream
6
+ attr_reader :output_stream
7
+
8
+ def initialize(input_stream, output_stream)
9
+ @input_stream = input_stream
10
+ @output_stream = output_stream
11
+ end
12
+
13
+ # Creates and returns a HighLine instance, set up to use the supplied streams
14
+ def high_line
15
+ return @high_line if @high_line
16
+ HighLine.track_eof = false
17
+ @high_line = HighLine.new(input_stream, output_stream)
18
+ end
19
+
20
+ # Adds text to the output stream
21
+ def inject(text)
22
+ @output_stream << text
23
+ end
24
+ end
25
+ end
26
+
@@ -0,0 +1,15 @@
1
+ module HighLine::Test
2
+ # Wraps a pipe, supplying a non-blocking #gets method
3
+ class PartialReader
4
+ attr_reader :stream
5
+
6
+ def initialize(stream)
7
+ @stream = stream
8
+ end
9
+
10
+ def gets
11
+ stream.readpartial(PIPE_BUFFER_SIZE)
12
+ end
13
+ end
14
+ end
15
+
@@ -0,0 +1,5 @@
1
+ module Highline
2
+ module Test
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,215 @@
1
+ require 'spec_helper'
2
+
3
+ module HighLine::Test
4
+ describe Client do
5
+ let(:input_read) { double('IO input pipe - read end', closed?: true) }
6
+ let(:input_write) { double('IO input pipe - write end', closed?: true) }
7
+ let(:output_read) { double('IO output pipe - read end', closed?: true) }
8
+ let(:output_write) { double('IO output pipe - write end', closed?: true) }
9
+ let(:input_pipe) { [input_read, input_write] }
10
+ let(:output_pipe) { [output_read, output_write] }
11
+ let(:streams) { input_pipe + output_pipe }
12
+ let(:child_pid) { 'child_pid' }
13
+ let(:running_subject) do
14
+ subject.run {}
15
+ subject
16
+ end
17
+
18
+ before do
19
+ subject.stub(:fork).and_return(child_pid)
20
+ IO.stub(:pipe).and_return(input_pipe, output_pipe)
21
+ Process.stub(:kill)
22
+ end
23
+
24
+ describe '#delay' do
25
+ it 'defaults to 0.1' do
26
+ expect(subject.delay).to eq(0.1)
27
+ end
28
+ end
29
+
30
+ describe '#delay=' do
31
+ it 'sets the delay value' do
32
+ subject.delay = 0.3
33
+
34
+ expect(subject.delay).to eq(0.3)
35
+ end
36
+ end
37
+
38
+ describe '#run' do
39
+ it 'fails if no block is passed' do
40
+ expect {
41
+ subject.run
42
+ }.to raise_error(RuntimeError, /Supply a block/)
43
+ end
44
+
45
+ it 'creates two pipes' do
46
+ subject.run {}
47
+
48
+ expect(IO).to have_received(:pipe).twice
49
+ end
50
+
51
+ it 'forks' do
52
+ subject.run {}
53
+
54
+ expect(subject).to have_received(:fork)
55
+ end
56
+
57
+ context 'child process' do
58
+ let(:partial_reader) { double('PartialReader') }
59
+ let(:driver) { double('Driver') }
60
+
61
+ before do
62
+ subject.stub(:fork).and_return(nil)
63
+ PartialReader.stub(:new).and_return(partial_reader)
64
+ Driver.stub(:new).with(partial_reader, output_write).and_return(driver)
65
+ Process.stub(:pid).and_return(child_pid)
66
+ end
67
+
68
+ it 'wraps the input stream in a class with a non-blocking #gets method' do
69
+ subject.run {}
70
+
71
+ expect(PartialReader).to have_received(:new).with(input_read)
72
+ end
73
+
74
+ it 'sets up a driver' do
75
+ subject.run {}
76
+
77
+ expect(Driver).to have_received(:new).with(partial_reader, output_write)
78
+ end
79
+
80
+ it 'calls the block' do
81
+ calls = 0
82
+ p = proc { calls += 1 }
83
+
84
+ subject.run(&p)
85
+
86
+ expect(calls).to eq(1)
87
+ end
88
+
89
+ it 'kills the child process if the block returns' do
90
+ subject.run {}
91
+
92
+ expect(Process).to have_received(:pid)
93
+ expect(Process).to have_received(:kill).with(:KILL, child_pid)
94
+ end
95
+ end
96
+
97
+ context 'parent process' do
98
+ before do
99
+ PartialReader.stub(:new)
100
+ end
101
+
102
+ it 'returns immediately' do
103
+ subject.run {}
104
+
105
+ expect(PartialReader).to_not have_received(:new)
106
+ end
107
+ end
108
+ end
109
+
110
+ describe '#cleanup' do
111
+ it 'kills the child process' do
112
+ running_subject.cleanup
113
+
114
+ expect(Process).to have_received(:kill).with(:KILL, child_pid)
115
+ end
116
+
117
+ it 'does nothing if not running' do
118
+ subject.cleanup
119
+
120
+ expect(Process).to_not have_received(:kill)
121
+ end
122
+
123
+ it "doesn't fail if the child process has terminated" do
124
+ Process.stub(:kill).and_raise(Errno::ESRCH)
125
+
126
+ expect {
127
+ running_subject.cleanup
128
+ }.not_to raise_error
129
+ end
130
+
131
+ it 'closes pipes' do
132
+ streams.each do |stream|
133
+ stream.stub(closed?: false)
134
+ stream.stub(:close)
135
+ end
136
+
137
+ running_subject.cleanup
138
+
139
+ streams.each do |stream|
140
+ expect(stream).to have_received(:close)
141
+ end
142
+ end
143
+ end
144
+
145
+ describe '#running?' do
146
+ it 'is true in the parent after #run is called' do
147
+ expect(running_subject.running?).to be_true
148
+ end
149
+
150
+ it 'is false after #cleanup' do
151
+ running_subject.cleanup
152
+
153
+ expect(subject.running?).to be_false
154
+ end
155
+ end
156
+
157
+ describe '#type' do
158
+ before do
159
+ input_write.stub(:<<)
160
+ subject.stub(:sleep)
161
+ end
162
+
163
+ it 'expects a parameter' do
164
+ expect {
165
+ subject.type
166
+ }.to raise_error(ArgumentError, /0 for 1/)
167
+ end
168
+
169
+ it 'fails if not running' do
170
+ expect {
171
+ subject.type 'Ciao'
172
+ }.to raise_error(RuntimeError, /not running/)
173
+ end
174
+
175
+ it 'appends the text and a new line to the input write stream' do
176
+ running_subject.type 'Ciao'
177
+
178
+ expect(input_write).to have_received(:<<).with("Ciao\n")
179
+ end
180
+
181
+ it 'sleeps for #delay seconds' do
182
+ running_subject.type 'Ciao'
183
+
184
+ expect(running_subject).to have_received(:sleep).with(0.1)
185
+ end
186
+ end
187
+
188
+ describe '#output' do
189
+ before do
190
+ streams.each do |stream|
191
+ stream.stub(closed?: false)
192
+ stream.stub(:close)
193
+ end
194
+ output_read.stub(:readpartial).with(4096).and_return('Foo')
195
+ end
196
+
197
+ it 'closes the output write stream' do
198
+ running_subject.output
199
+
200
+ expect(output_write).to have_received(:close)
201
+ end
202
+
203
+ it 'gets the output from HighLine' do
204
+ running_subject.output
205
+
206
+ expect(output_read).to have_received(:readpartial).with(4096)
207
+ end
208
+
209
+ it 'returns the output' do
210
+ expect(running_subject.output).to eq('Foo')
211
+ end
212
+ end
213
+ end
214
+ end
215
+
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ module HighLine::Test
4
+ describe Driver do
5
+ let(:input_stream) { double('IO input') }
6
+ let(:output_stream) { double('IO output') }
7
+
8
+ subject { Driver.new(input_stream, output_stream) }
9
+
10
+ describe '#initialize' do
11
+ it 'expects an input and an output stream' do
12
+ expect {
13
+ Driver.new
14
+ }.to raise_error(ArgumentError, /0 for 2/)
15
+ end
16
+ end
17
+
18
+ describe '#input_stream' do
19
+ it 'returns the supplied input stream' do
20
+ expect(subject.input_stream).to eq(input_stream)
21
+ end
22
+ end
23
+
24
+ describe '#output_stream' do
25
+ it 'returns the supplied output stream' do
26
+ expect(subject.output_stream).to eq(output_stream)
27
+ end
28
+ end
29
+
30
+ describe '#high_line' do
31
+ let(:high_line) { double('HighLine') }
32
+
33
+ before do
34
+ HighLine.stub(:track_eof=)
35
+ HighLine.stub(:new).and_return(high_line)
36
+ end
37
+
38
+ it 'stops HighLine tracking eof' do
39
+ subject.high_line
40
+
41
+ expect(HighLine).to have_received(:track_eof=).with(false)
42
+ end
43
+
44
+ it 'sets up a HighLine instance with the supplied streams' do
45
+ subject.high_line
46
+
47
+ expect(HighLine).to have_received(:new).with(input_stream, output_stream)
48
+ end
49
+
50
+ it 'returns the HighLine instance' do
51
+ expect(subject.high_line).to eq(high_line)
52
+ end
53
+
54
+ it 'only creates one instance' do
55
+ subject.high_line
56
+ subject.high_line
57
+
58
+ expect(HighLine).to have_received(:new).once.with(input_stream, output_stream)
59
+ end
60
+ end
61
+
62
+ describe '#inject' do
63
+ before do
64
+ output_stream.stub(:<<)
65
+ end
66
+
67
+ it 'adds text to the output stream' do
68
+ subject.inject('foo')
69
+
70
+ expect(output_stream).to have_received(:<<).with('foo')
71
+ end
72
+ end
73
+ end
74
+ end
75
+
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ module HighLine::Test
4
+ describe PartialReader do
5
+ let(:stream) { double('IO') }
6
+
7
+ subject { PartialReader.new(stream) }
8
+
9
+ describe '#initialize' do
10
+ it 'expects a stream parameter' do
11
+ expect {
12
+ PartialReader.new
13
+ }.to raise_error(ArgumentError, /0 for 1/)
14
+ end
15
+ end
16
+
17
+ describe '#stream' do
18
+ it 'returns the stream' do
19
+ expect(subject.stream).to eq(stream)
20
+ end
21
+ end
22
+
23
+ describe '#gets' do
24
+ let(:output) { 'Hi there' }
25
+
26
+ before do
27
+ stream.stub(:readpartial).and_return(output)
28
+ end
29
+
30
+ it 'performs a non-blocking read' do
31
+ subject.gets
32
+
33
+ expect(stream).to have_received(:readpartial).with(4096)
34
+ end
35
+
36
+ it 'returns the result' do
37
+ expect(subject.gets).to eq(output)
38
+ end
39
+ end
40
+ end
41
+ end
42
+
@@ -0,0 +1,12 @@
1
+ require 'rspec'
2
+ require 'bourne'
3
+ require 'highline/test'
4
+
5
+ RSpec.configure do |config|
6
+ config.treat_symbols_as_metadata_keys_with_true_values = true
7
+ config.run_all_when_everything_filtered = true
8
+ config.filter_run :focus
9
+
10
+ config.order = 'random'
11
+ end
12
+
metadata ADDED
@@ -0,0 +1,162 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: highline-test
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Joe Yates
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-07-07 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: highline
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: bundler
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: '1.3'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '1.3'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rake
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rspec
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: bourne
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: shoulda-matchers
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ description: Test HighLine applications
111
+ email:
112
+ - joe.g.yates@gmail.com
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - .gitignore
118
+ - Gemfile
119
+ - LICENSE.txt
120
+ - README.md
121
+ - Rakefile
122
+ - highline-test.gemspec
123
+ - lib/highline/test.rb
124
+ - lib/highline/test/client.rb
125
+ - lib/highline/test/driver.rb
126
+ - lib/highline/test/partial_reader.rb
127
+ - lib/highline/test/version.rb
128
+ - spec/lib/highline/test/client_spec.rb
129
+ - spec/lib/highline/test/driver_spec.rb
130
+ - spec/lib/highline/test/partial_reader_spec.rb
131
+ - spec/spec_helper.rb
132
+ homepage: ''
133
+ licenses:
134
+ - MIT
135
+ post_install_message:
136
+ rdoc_options: []
137
+ require_paths:
138
+ - lib
139
+ required_ruby_version: !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ! '>='
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ required_rubygems_version: !ruby/object:Gem::Requirement
146
+ none: false
147
+ requirements:
148
+ - - ! '>='
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ requirements: []
152
+ rubyforge_project:
153
+ rubygems_version: 1.8.23
154
+ signing_key:
155
+ specification_version: 3
156
+ summary: A micro framework that sets up tests for HighLine applications
157
+ test_files:
158
+ - spec/lib/highline/test/client_spec.rb
159
+ - spec/lib/highline/test/driver_spec.rb
160
+ - spec/lib/highline/test/partial_reader_spec.rb
161
+ - spec/spec_helper.rb
162
+ has_rdoc: