outputhandler 0.1.3beta

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: fa2c1260ae74bb1f296417d69cd039fa429029d8a1d5058002045bb68133e4d6
4
+ data.tar.gz: 75fe96764a08dd4b11be692cbf161953c0975fc775b18dcaba0f3895e55ebeb7
5
+ SHA512:
6
+ metadata.gz: 31978d557201555266b1ee15c48d01664c3c04db51bd521fc61a7a69c51e917bfd82aa2e30a772a0047f44bf7d2882b8b01578db472829a27ce7ed325983561f
7
+ data.tar.gz: 9b8708f025c23602dcb99f8a5caf7027cc62801b04cbe5a7f42bb277f95914ac0edea0a78884a9ed066915d4dee618d2169a4f9a31b1b282e075452723ddef94
data/.gitignore ADDED
@@ -0,0 +1,50 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /spec/examples.txt
9
+ /test/tmp/
10
+ /test/version_tmp/
11
+ /tmp/
12
+
13
+ # Used by dotenv library to load environment variables.
14
+ # .env
15
+
16
+ ## Specific to RubyMotion:
17
+ .dat*
18
+ .repl_history
19
+ build/
20
+ *.bridgesupport
21
+ build-iPhoneOS/
22
+ build-iPhoneSimulator/
23
+
24
+ ## Specific to RubyMotion (use of CocoaPods):
25
+ #
26
+ # We recommend against adding the Pods directory to your .gitignore. However
27
+ # you should judge for yourself, the pros and cons are mentioned at:
28
+ # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
29
+ #
30
+ # vendor/Pods/
31
+
32
+ ## Documentation cache and generated files:
33
+ /.yardoc/
34
+ /_yardoc/
35
+ /doc/
36
+ /rdoc/
37
+
38
+ ## Environment normalization:
39
+ /.bundle/
40
+ /vendor/bundle
41
+ /lib/bundler/man/
42
+
43
+ # for a library or gem, you might want to ignore these files since the code is
44
+ # intended to run in multiple environments; otherwise, check them in:
45
+ # Gemfile.lock
46
+ # .ruby-version
47
+ # .ruby-gemset
48
+
49
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
50
+ .rvmrc
data/HISTORY ADDED
@@ -0,0 +1,7 @@
1
+ == 0.1.1 / 2019-04-07
2
+
3
+ * Initial version - Benjamin L. Tischendorf
4
+
5
+ == 0.1.2 / 2019-04-08
6
+
7
+ * Added YARD documentation and 'rake cucumber' (also default)
data/LICENSE ADDED
@@ -0,0 +1,29 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2019, Donkeybridge
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ 1. Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ 2. Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ 3. Neither the name of the copyright holder nor the names of its
17
+ contributors may be used to endorse or promote products derived from
18
+ this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,49 @@
1
+ # OutputHandler
2
+
3
+ A wrapper class for ruby, that allows output to be paused. Output can be send to console, to a logfile or both.
4
+
5
+ ## Description
6
+
7
+ An OutputHandler instance provides #print and #puts, behaving like commonly used IO::print and IO::puts,
8
+ except that these do not accept _\*args_ but only one chunk to be output.
9
+ And it behaves this way as long as #pause is not triggered. With output being paused, chunks sent to the
10
+ instance will wait until either #unpause or #flush are triggered.
11
+
12
+ At any time, using #print! or #puts! will output directly.
13
+
14
+ When using #pause(_limit_), the output is paused for _limit_ seconds (e.g. when printing a help message in a
15
+ fluent stream).
16
+
17
+ \#print(!) and \#puts(!) allow a second argument of type Boolean, that adds a carriage return to the beginning of the chunk (e.g. for displaying a progressbar). Please note, that alike IO::print, you probably want to add whitespace to overwrite the entire previous output.
18
+
19
+ OutputHandler.new is the same as OutputHandler.new(console: true, logfile: nil).
20
+
21
+ To discard currently queued output, use #flush(_true_).
22
+
23
+
24
+ ## Installation
25
+
26
+ gem install outputhandler
27
+
28
+ ## Usage example:
29
+
30
+ user:~/$ irb
31
+ "Loading irbrc"
32
+ 2.5.1 :001 > require 'outputhandler'
33
+ 2.5.1 :002 > o = OutputHandler.new
34
+ 2.5.1 :003 > o.print "01: Lore ipsum dolor sit amet"
35
+ 01: Lore ipsum dolor sit amet2.5.1 :004 > o.pause
36
+ 2.5.1 :005 > o.puts "02: consectetuer adipiscing elit"
37
+ 2.5.1 :006 > o.puts! "03: Aliquam hendrerit mi posuere lectus"
38
+ 03: Aliquam hendrerit mi posuere lectus
39
+ 2.5.1 :007 > o.flush
40
+ 02: consectetuer adipiscing elit
41
+ 2.5.1 :008 > o.puts "04: Vestibulum enim wisi"
42
+ 2.5.1 :009 > o.puts! "05: viverra nec, fringilla in"
43
+ 05: viverra nec, fringilla in
44
+ 2.5.1 :010 > o.unpause
45
+ 04: Vestibulum enim wisi
46
+ 2.5.1 :011 > o.puts "06: laoreet vitae, risus."
47
+ 06: laoreet vitae, risus.
48
+
49
+
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require 'cucumber/rake/task'
2
+
3
+ Cucumber::Rake::Task.new
4
+
5
+ desc "Run tests"
6
+ task :default => :cucumber
@@ -0,0 +1,37 @@
1
+ Feature: Initialization
2
+
3
+ Scenario: Create a new OutputHandler from scratch without any options
4
+ Given a new OutputHandler is created without options
5
+ Then it should return an object of class OutputHandler
6
+ Then it should have an instance variable "@outputQueue"
7
+ And "@outputQueue" should be a "Queue"
8
+ And it should have an instance variable "@console"
9
+ And "@console" should be a Boolean
10
+ And it should have an instance variable "@file"
11
+ And "@file" should be a Boolean
12
+ And it should have an instance variable "@logfile"
13
+ And "@logfile" should be nil
14
+ And it should be not paused?
15
+ And it should not respond to #foo
16
+ And #out! should send output with newline to console
17
+ And #out should send output with newline to console
18
+ And #out! should send output to console without newline when added parameter false
19
+ And #out should send output to console without newline when added parameter false
20
+
21
+
22
+
23
+ Scenario Outline: Checking whether it is responding to methods
24
+ Given a new OutputHandler is created
25
+ Then it should respond to "<method>"
26
+ Examples:
27
+ | method |
28
+ | paused? |
29
+ | pause |
30
+ | unpause |
31
+ | out |
32
+ | out! |
33
+ | flush |
34
+ | puts |
35
+ | puts! |
36
+ | print |
37
+ | print! |
@@ -0,0 +1,33 @@
1
+ Feature: Pausing and unpausing the Outputhandler
2
+
3
+ Scenario: Creating and pausing the outputhandler should send output via #out! but not via #out
4
+ Given a new instance is created
5
+ And it is paused
6
+ Then #out! should send output
7
+ But #out should not send output
8
+
9
+ Scenario: Creating and pausing the outputHandler should not send output via #out, but after unpausing it should
10
+
11
+ Given a new instance is created
12
+ And it is paused
13
+ Then #out should not send immediate output
14
+ And #out should send immediate output when unpausing
15
+
16
+ Scenario: Creating and pausing the outputHandler for 2 second should not print anything, but after 2 seconds it should
17
+
18
+ Given a new instance is created
19
+ And it is paused for 2 seconds
20
+ Then #out should not send immediate output
21
+ But should arrive after 2 seconds
22
+
23
+ Scenario: Creating and pausing the outputhandler, output should not be sent immediately, but upon #flush
24
+ Given a new instance is created
25
+ And it is paused
26
+ And output is send to #out
27
+ And output is send to #out
28
+ Then it should send immediate upon #flush
29
+ Given output is send to #out
30
+ Then it should not send immediate upon silent #flush
31
+ And #out should not send immediate output when unpausing
32
+
33
+
@@ -0,0 +1,15 @@
1
+ Feature: A new OutputHandler can react to options hash
2
+
3
+ Scenario: Only Hash as Parameter is accepted
4
+ Given a OutputHandler will be created
5
+ Then with a String as parameter is should raise a TypeError
6
+ Then with a Hash as parameter it should not raise
7
+
8
+ Scenario: Parameter "console: false" disables default console output
9
+ Given an OutputHandler is created with parameter "console" set to "false"
10
+ Then #out should not send output
11
+
12
+ Scenario: Parameter "logile: filename" enables output to filename
13
+ Given an OutputHandler is created with parameter "logfile" set to "/tmp/foofile"
14
+ And output "ramses" is send to #out
15
+ Then file "/tmp/foofile" should contain output "ramses"
@@ -0,0 +1,31 @@
1
+ Feature: outputhandler should be aware of CR and NL
2
+
3
+ Scenario: #puts and #puts! should send with newline but without CR
4
+ Given a new instance is created
5
+ Then output should contain a NL but no CR when sent to "puts"
6
+ Then output should contain a NL but no CR when sent to "puts!"
7
+
8
+
9
+ Scenario: #puts(true) and #puts!(true) should send with NL but also with CR
10
+ Given a new instance is created
11
+ Then output should contain a NL with leading CR when sent to "puts" with param true
12
+ Then output should contain a NL with leading CR when sent to "puts!" with param true
13
+
14
+
15
+ Scenario: #print and #print! should send without newline
16
+ Given a new instance is created
17
+ Then output should contain neither NL nor CR when sent to "print"
18
+ Then output should contain neither NL nor CR when sent to "print!"
19
+
20
+ Scenario: #print(true) and #print!(true) should send without NL but with CR
21
+ Given a new instance is created
22
+ Then output should contain a leading CR but no NL when sent to "print" with param true
23
+ Then output should contain a leading CR but no NL when sent to "print!" with param true
24
+
25
+ Scenario: #print(true) overwrite former #print(true)
26
+ Given an OutputHandler is created with parameter "logfile" set to "/tmp/barfile"
27
+ And "foo" is sent to the handler with print
28
+ Then file "/tmp/barfile" should contain output "foo"
29
+ And "bar" is sent to the handler with print and param true
30
+ Then file "/tmp/barfile" should contain output "bar"
31
+
@@ -0,0 +1,47 @@
1
+ Given /a new OutputHandler is created/ do
2
+ require './lib/outputhandler.rb'
3
+ @output_handler = OutputHandler.new
4
+ end
5
+
6
+ Then "it should return an object of class OutputHandler" do
7
+ expect(@output_handler).to be_instance_of(OutputHandler)
8
+ end
9
+
10
+ Then /^it should have an instance variable "([^"]*)"$/ do |var|
11
+ expect(@output_handler.instance_variable_defined?(var.to_sym)).to be true
12
+ end
13
+
14
+ Then /^"([^"]*)" should be a Boolean$/ do |var|
15
+ expect(@output_handler.instance_variable_get(var.to_sym)).to be_instance_of(TrueClass).or be_instance_of(FalseClass)
16
+ end
17
+
18
+ Then /^"([^"]*)" should be nil$/ do |var|
19
+ expect(@output_handler.instance_variable_get(var.to_sym)).to be_nil
20
+ end
21
+
22
+ Then /^"([^"]*)" should be a "([^"]*)"$/ do |var, klass|
23
+ expect(@output_handler.instance_variable_get(var.to_sym)).to be_instance_of(Object.const_get(klass))
24
+ end
25
+
26
+ Then "it should be not paused?" do
27
+ expect(@output_handler.paused?).to be false
28
+ end
29
+
30
+ Then "it should not respond to #foo" do
31
+ expect(@output_handler).not_to respond_to(:foo)
32
+ end
33
+
34
+ Then /^it should respond to "([^"]*)"$/ do |method|
35
+ expect(@output_handler).to respond_to(method.to_sym)
36
+ end
37
+
38
+
39
+ Then /^#(out!?) should send output with newline to console$/ do |method|
40
+ expect{@output_handler.send(method.to_sym,"foo"); sleep 0.25}.to output("foo\n").to_stdout_from_any_process
41
+ end
42
+
43
+ Then /^#(out!?) should send output to console without newline when added parameter false$/ do |method|
44
+ expect{@output_handler.send(method.to_sym,"foo",false); sleep 0.1}.to output("foo").to_stdout
45
+ end
46
+
47
+
@@ -0,0 +1,57 @@
1
+ Given("a new instance is created") do
2
+ require './lib/outputhandler.rb'
3
+ @output_handler = OutputHandler.new
4
+ end
5
+
6
+ Given("it is paused") do
7
+ @output_handler.pause
8
+ end
9
+
10
+ Then("#out! should send output") do
11
+ expect { @output_handler.out!("foo")}.to output("foo\n").to_stdout
12
+ end
13
+
14
+ Then("#out should not send output") do
15
+ expect { @output_handler.out("foo")}.not_to output().to_stdout_from_any_process
16
+ end
17
+
18
+ Given("output is send to #out") do
19
+ @output_handler.out("foo")
20
+ end
21
+
22
+ Given /^output "([^"]*)" is send to #out$/ do |str|
23
+ @output_handler.out(str)
24
+ sleep 0.1
25
+ end
26
+
27
+ Then "#out should not send immediate output" do
28
+ expect { @output_handler.out("foo"); sleep 0.25 }.not_to output.to_stdout_from_any_process
29
+ end
30
+
31
+ Then "#out should send immediate output when unpausing" do
32
+ expect { @output_handler.unpause; sleep 0.25 }.to output("foo\n").to_stdout_from_any_process
33
+ end
34
+
35
+ Given /^it is paused for (\d+) seconds$/ do |seconds|
36
+ @output_handler.pause(seconds)
37
+ end
38
+
39
+ Then /^should arrive after (\d+) seconds$/ do |seconds|
40
+ expect{ sleep seconds; }.to output("foo\n").to_stdout_from_any_process
41
+ end
42
+
43
+ Then "it should send immediate upon #flush" do
44
+ expect { @output_handler.flush; sleep 0.25 }.to output("foo\nfoo\n").to_stdout_from_any_process
45
+ end
46
+
47
+ Then "it should not send immediate upon silent #flush" do
48
+ expect { @output_handler.flush(true); sleep 0.25 }.not_to output.to_stdout_from_any_process
49
+ end
50
+
51
+ Then "#out should not send immediate output when unpausing" do
52
+ expect { @output_handler.unpause; sleep 0.25}.not_to output.to_stdout_from_any_process
53
+ end
54
+
55
+
56
+
57
+
@@ -0,0 +1,22 @@
1
+ require './lib/outputhandler.rb'
2
+
3
+ Given "a OutputHandler will be created" do
4
+ end
5
+
6
+ But "with a String as parameter is should raise a TypeError" do
7
+ expect { OutputHandler.new("foo")}.to raise_error(TypeError)
8
+ end
9
+
10
+ But "with a Hash as parameter it should not raise" do
11
+ expect { OutputHandler.new({})}.not_to raise_error
12
+ end
13
+
14
+ Given /^an OutputHandler is created with parameter "([^"]*)" set to "([^"]*)"$/ do |param, value|
15
+ File.open(value, "w"){|f| f.write "" } if param == "logfile"
16
+ eval "@output_handler = OutputHandler.new(#{param}:\"#{value}\")"
17
+ end
18
+
19
+ Then /^file "([^"]*)" should contain output "([^"]*)"$/ do |filename, str|
20
+ expect( `cat #{filename} | tail -n1`.split("\r").last.chomp).to eq(str.chomp)
21
+ end
22
+
@@ -0,0 +1,37 @@
1
+ require './lib/outputhandler.rb'
2
+
3
+ Then /^output should contain a NL but no CR when sent to "([^"]*)"$/ do |method|
4
+ expect { @output_handler.send(method.to_sym, "foo"); sleep 0.25}.
5
+ to output("foo\n").to_stdout_from_any_process
6
+ end
7
+
8
+ Then /^output should contain a NL with leading CR when sent to "([^"]*)" with param true$/ do |method|
9
+ expect { @output_handler.send(method.to_sym, "foo", true); sleep 0.25}.
10
+ to output("\rfoo\n").to_stdout_from_any_process
11
+ end
12
+
13
+ Then /^output should contain neither NL nor CR when sent to "([^"]*)"$/ do |method|
14
+ expect { @output_handler.send(method.to_sym, "foo"); sleep 0.25 }.
15
+ to output("foo").to_stdout_from_any_process
16
+ end
17
+
18
+ Then /^output should contain a leading CR but no NL when sent to "([^"]*)" with param true$/ do |method|
19
+ expect { @output_handler.send(method.to_sym, "foo", true); sleep 0.25 }.
20
+ to output("\rfoo").to_stdout_from_any_process
21
+ end
22
+
23
+ Given "{string} is sent to the handler with print" do |string|
24
+ puts "sent str is #{string}"
25
+ @output_handler.print(string)
26
+ sleep 0.1
27
+ end
28
+
29
+ Given "{string} is sent to the handler with print and param true" do |string|
30
+ puts "sent string is #{string}"
31
+ @output_handler.print(string, true)
32
+ sleep 0.1
33
+ end
34
+
35
+ #Then /^file "([^"]*)" should contain "([^"]*)"$/ do |filename, str|
36
+ # expect(File.read(filename)).to eq("\r#{str}")
37
+ #end
@@ -0,0 +1,6 @@
1
+ require 'rspec'
2
+ RSpec.configure do |config|
3
+ config.expect_with :rspec do |c|
4
+ c.syntax = :expect
5
+ end
6
+ end
@@ -0,0 +1,171 @@
1
+ #The main class of this gem
2
+ class OutputHandler
3
+
4
+ # Aliasing puts and print, as they are included / inherited (?) from IO
5
+ alias_method :superputs, :puts
6
+ # Aliasing puts and print, as they are included / inherited (?) from IO
7
+ alias_method :superprint, :print
8
+
9
+ # Creates a new instance of OutputHandler. It accepts an options hash.
10
+ #
11
+ # @param opts [Hash]
12
+ # @option opts [Boolean] :console If set to true (default), the handler will output to STDOUT.
13
+ # @option opts [String] :logfile If set to a target and the target is valid, the handler will output to logfile.
14
+ #
15
+ def initialize(opts = {}, *args, &block)
16
+ raise TypeError unless opts.is_a? Hash
17
+ @outputQueue = Queue.new
18
+ @console = opts[:console].nil? ? true : opts[:console]
19
+ @logfile = opts[:logfile].nil? ? nil : opts[:logfile]
20
+ @file = @logfile.nil? ? false : true
21
+ @paused = false
22
+ @outputMonitor = Monitor.new
23
+ system("touch #{@logfile}") unless @logfile.nil?
24
+ self.spawn_output
25
+ end
26
+
27
+ # Convenience method, accepts a second parameter to force carriage return
28
+ # (while \\r in-line also is accepted)
29
+ #
30
+ # @param chunk [printable Object]
31
+ # @param cr [Boolean] for carriage return
32
+ def puts(chunk = "", cr = false)
33
+ self.out(chunk, true, cr)
34
+ end
35
+
36
+ # (see #puts)
37
+ def puts!(chunk = "", cr = false)
38
+ self.out!(chunk, true, cr)
39
+ end
40
+
41
+ # (see #puts)
42
+ def print(chunk = "", cr = false)
43
+ self.out(chunk, false, cr)
44
+ end
45
+
46
+ # (see #puts)
47
+ def print!(chunk = "", cr = false)
48
+ self.out!(chunk, false, cr)
49
+ end
50
+
51
+ # Returns whether output currently is paused.
52
+ #
53
+ # @return [Boolean]
54
+ def paused?
55
+ @paused
56
+ end
57
+
58
+ # Pauses the output. If parameter is sent, output will autoresume after delay. Overrides currently
59
+ # set delay.
60
+ #
61
+ # @param limit [Numeric] Time to pause.
62
+ def pause(limit = 0)
63
+ unless self.paused?
64
+ Thread.kill(@outputThread)
65
+ @paused = true
66
+ self.spawn_output
67
+ end
68
+ if limit > 0
69
+ Thread.new do
70
+ sleep limit
71
+ @paused = false
72
+ end
73
+ end
74
+ end
75
+
76
+ # Unpauses currently paused output regardless of any set delay.
77
+ def unpause
78
+ @paused = false
79
+ end
80
+
81
+ # Flushes currently suspended output.
82
+ #
83
+ # @param silent [Boolean] If set to true, flushes to /dev/null, else
84
+ # to configured output(s).
85
+ def flush(silent = false)
86
+ while not @outputQueue.empty?
87
+ el = @outputQueue.pop
88
+ self.out!(el[:chunk], el[:newline], el[:cr]) unless silent
89
+ end
90
+ end
91
+
92
+ # Sends next chunk to outputs. Will be queued if #paused, otherwise
93
+ # sent to output(s).
94
+ #
95
+ # @param chunk [printable Object]
96
+ # @param newline [Boolean] Indicates whether (default) or not to end
97
+ # line with a newline character.
98
+ def out(chunk = "", newline = true, cr = false)
99
+ el = { chunk: chunk, newline: newline, cr: cr}
100
+ @outputQueue << el
101
+ end
102
+
103
+ # Sends next chunk to output(s) directly, regardless of #paused.
104
+ #
105
+ # @param (see #out)
106
+ def out!(chunk = "", newline = true, cr = false)
107
+ superprint "#{cr ? "\r" : ""
108
+ }#{chunk.chomp
109
+ }#{newline ? "\n" : ""}" if @console
110
+ File.open(@logfile,'a+'){|f| f.write "#{cr ? "\r" : ""
111
+ }#{chunk.chomp
112
+ }#{newline ? "\n" : "" }" } if @file
113
+ end
114
+
115
+ # Spawns output thread
116
+ # @!visibility private
117
+ def spawn_output
118
+ @outputThread = Thread.new do
119
+ loop do
120
+ if self.paused?
121
+ sleep 0.1
122
+ else
123
+ o = @outputQueue.pop
124
+ superprint "#{o[:cr] ? "\r" : ""
125
+ }#{o[:chunk]
126
+ }#{o[:newline] ? "\n" : ""}" if @console
127
+ File.open(@logfile,'a+') do |f|
128
+ f.write "#{o[:cr] ? "\r" : ""
129
+ }#{o[:chunk]
130
+ }#{o[:newline] ? "\n" : "" }"
131
+ end if @file
132
+ end
133
+ end
134
+ end
135
+ end
136
+
137
+ # Provides inspection
138
+ #
139
+ # @!visibility private
140
+ def inspect
141
+ arr = []
142
+ tmpQueue = Queue.new
143
+ while not @outputQueue.empty?
144
+ el = @outputQueue.pop
145
+ arr << el
146
+ tmpQueue << el
147
+ end
148
+ @outputQueue = tmpQueue
149
+ return "<#OutputHandler:0x#{self.object_id.to_s(16)}, paused: #{@paused}, queueLength: #{@outputQueue.size}, outputQueue: #{arr.inspect}>"
150
+ end
151
+
152
+ # Spawns a thread that creates some random output
153
+ #
154
+ # @!visibility private
155
+ def random_output
156
+ if @random_out_thread.nil?
157
+ @random_out_thread = Thread.new do
158
+ loop do
159
+ o = [('a'..'z'), ('A'..'Z')].map(&:to_a).flatten
160
+ string = (0...50).map { o[rand(o.length)] }.join
161
+ @outputQueue << { s: string, newline: true }
162
+ sleep 5
163
+ end
164
+ end
165
+ else
166
+ Thread.kill @random_out_thread
167
+ @random_out_thread = nil
168
+ end
169
+ end
170
+
171
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: outputhandler
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.3beta
5
+ platform: ruby
6
+ authors:
7
+ - Benjamin L. Tischendorf
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-04-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: cucumber
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: yard
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.9'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.9'
55
+ description: 'Wrapper class that enables asynchronious output (pausing / unpausing) '
56
+ email: github@jtown.eu
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - ".gitignore"
62
+ - HISTORY
63
+ - LICENSE
64
+ - README.md
65
+ - Rakefile
66
+ - features/01-outputhandler_new.feature
67
+ - features/02-outputhandler_pause.feature
68
+ - features/03-outputhandler_opts.feature
69
+ - features/04-outputhandler_output.feature
70
+ - features/step_definitions/01-outputhandler_new_steps.rb
71
+ - features/step_definitions/02-outputhander_pause.steps.rb
72
+ - features/step_definitions/03-outputhandler_opts_steps.rb
73
+ - features/step_definitions/04-outputhandler_output_steps.rb
74
+ - features/support/env.rb
75
+ - lib/outputhandler.rb
76
+ homepage: https://github.com/donkeybridge/outputhandler
77
+ licenses:
78
+ - BSD-4-Clause
79
+ metadata: {}
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '2.0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">"
92
+ - !ruby/object:Gem::Version
93
+ version: 1.3.1
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.7.8
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: Wrapper class that enables asynchronious output (pausing / unpausing)
100
+ test_files: []