command_line_reporter 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +196 -0
- data/examples/nested.rb +38 -0
- data/examples/progress.rb +51 -0
- data/lib/command_line_reporter.rb +20 -0
- data/lib/nested_formatter.rb +56 -0
- data/lib/progress_formatter.rb +23 -0
- data/lib/version.rb +3 -0
- data/spec/command_line_reporter_spec.rb +37 -0
- data/spec/nested_formatter_spec.rb +250 -0
- data/spec/progress_formatter_spec.rb +61 -0
- data/spec/spec_helper.rb +1 -0
- metadata +75 -0
data/README.md
ADDED
@@ -0,0 +1,196 @@
|
|
1
|
+
## Command Line Reporter
|
2
|
+
|
3
|
+
This gem provides an simple way to add RSpec like formatting of the output of your ruby scripts. It
|
4
|
+
eliminates the need to litter your code with *puts* statements instead providing a cleaner, more
|
5
|
+
ruby like way of reporting progress to the user throught the command line interface.
|
6
|
+
|
7
|
+
### Installation
|
8
|
+
|
9
|
+
It is up on rubygems.org so add it to your bundle or do it the old fashioned way:
|
10
|
+
|
11
|
+
```bash
|
12
|
+
gem install command_line_reporter
|
13
|
+
```
|
14
|
+
|
15
|
+
### Usage
|
16
|
+
|
17
|
+
The gem provides a mixin that can be included in your scripts.
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
include CommandLineReporter
|
21
|
+
```
|
22
|
+
|
23
|
+
#### Standard Methods
|
24
|
+
|
25
|
+
There are several methods the mixin provides that do not depend on the formatter used:
|
26
|
+
|
27
|
+
1. _report(hash) {block}_
|
28
|
+
* The first argument is a hash that defines the options for the method. See the details in the
|
29
|
+
formatter section for allowed values.
|
30
|
+
* The second argument is a block of ruby code that you want executed within the context of the
|
31
|
+
reporter. Any ruby code is allowed. See the examples that follow in the formatter sections for
|
32
|
+
details.
|
33
|
+
1. _formatter=(string)_
|
34
|
+
* Simple string indicating the formatter you want your application to use. At present the 2
|
35
|
+
formatters are:
|
36
|
+
|
37
|
+
2. Progress - indicated by the string '_progress_'
|
38
|
+
2. Nested - indicated by the string '_nested_'
|
39
|
+
|
40
|
+
The default is _nested_.
|
41
|
+
|
42
|
+
### Progress Formatter
|
43
|
+
|
44
|
+
#### Example
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
require 'command_line_reporter'
|
48
|
+
|
49
|
+
class Example
|
50
|
+
include CommandLineReporter
|
51
|
+
|
52
|
+
def initialize
|
53
|
+
formatter = 'progress'
|
54
|
+
end
|
55
|
+
|
56
|
+
def run
|
57
|
+
x = 0
|
58
|
+
report do
|
59
|
+
10.times do
|
60
|
+
x += 1
|
61
|
+
formatter.progress
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
Example.new.run
|
68
|
+
```
|
69
|
+
|
70
|
+
This simply produces 10 dots (.) in succession:
|
71
|
+
|
72
|
+
```bash
|
73
|
+
[~/scratch]$ ruby example.rb
|
74
|
+
..........
|
75
|
+
```
|
76
|
+
|
77
|
+
#### Indicator
|
78
|
+
|
79
|
+
The indicator is the string that is displayed in the command line interface that indicates progress.
|
80
|
+
The default is the dot (.) but any string is allowed. In fact one can use the erase character to
|
81
|
+
get crafty with displaying percent complete in place.
|
82
|
+
|
83
|
+
#### Instance Methods
|
84
|
+
|
85
|
+
* _indicator(string)_ - This overrides the default value of the dot (.) being used for all calls to
|
86
|
+
the report method.
|
87
|
+
|
88
|
+
```ruby
|
89
|
+
formatter.indicator('*')
|
90
|
+
```
|
91
|
+
|
92
|
+
* _progress(string)_ - Call this method to invoke the output to the command line interface. The
|
93
|
+
string overrides the indicator for this call only.
|
94
|
+
|
95
|
+
```ruby
|
96
|
+
formatter.progress
|
97
|
+
formatter.progress("^H^H^H10%")
|
98
|
+
```
|
99
|
+
|
100
|
+
### Nested Formatter
|
101
|
+
|
102
|
+
The nested formatter concept is inspired by the documentation formatter in RSpec. The idea is to be
|
103
|
+
able to create nested grouping levels of output that are very readable as the code is being
|
104
|
+
executed.
|
105
|
+
|
106
|
+
#### Example
|
107
|
+
|
108
|
+
```ruby
|
109
|
+
require 'command_line_reporter'
|
110
|
+
|
111
|
+
class Example
|
112
|
+
include CommandLineReporter
|
113
|
+
|
114
|
+
def initialize
|
115
|
+
self.formatter = 'nested'
|
116
|
+
end
|
117
|
+
|
118
|
+
def run
|
119
|
+
x,y,z = 0,0,0
|
120
|
+
|
121
|
+
report(:message => 'calculating first expression') do
|
122
|
+
x = 2 + 2
|
123
|
+
2.times do
|
124
|
+
report(:message => 'calculating second expression') do
|
125
|
+
y = 10 - x
|
126
|
+
10.times do |i|
|
127
|
+
report(:message => 'pixelizing', :type => 'inline', :complete => "#{i*10+10}%") do
|
128
|
+
z = x + y
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
Example.new.run
|
138
|
+
|
139
|
+
```
|
140
|
+
|
141
|
+
This produces the more complex output:
|
142
|
+
|
143
|
+
```
|
144
|
+
[~/scratch]$ ruby example.rb
|
145
|
+
calculating first expression
|
146
|
+
calculating second expression
|
147
|
+
pixelizing...10%
|
148
|
+
pixelizing...20%
|
149
|
+
pixelizing...30%
|
150
|
+
pixelizing...40%
|
151
|
+
pixelizing...50%
|
152
|
+
pixelizing...60%
|
153
|
+
pixelizing...70%
|
154
|
+
pixelizing...80%
|
155
|
+
pixelizing...90%
|
156
|
+
pixelizing...100%
|
157
|
+
complete
|
158
|
+
calculating second expression
|
159
|
+
pixelizing...10%
|
160
|
+
pixelizing...20%
|
161
|
+
pixelizing...30%
|
162
|
+
pixelizing...40%
|
163
|
+
pixelizing...50%
|
164
|
+
pixelizing...60%
|
165
|
+
pixelizing...70%
|
166
|
+
pixelizing...80%
|
167
|
+
pixelizing...90%
|
168
|
+
pixelizing...100%
|
169
|
+
complete
|
170
|
+
complete
|
171
|
+
```
|
172
|
+
|
173
|
+
#### Instance Methods
|
174
|
+
|
175
|
+
* _message_string(string)_ - This defines the string that is displayed as the first part of the
|
176
|
+
message to the user. The default value is "_working_".
|
177
|
+
* _complete_string(string)_ - This defines the string that completes the message to the user for the
|
178
|
+
report. The default value is "_complete_".
|
179
|
+
* _indent_size(int)_ - The number of spaces to indent for a single indentation level. The default
|
180
|
+
value is 2 spaces.
|
181
|
+
|
182
|
+
#### Report Options
|
183
|
+
|
184
|
+
The following are the allowed values of the options hash argument to the _report_ method:
|
185
|
+
|
186
|
+
* _message_ - The string that is displayed as the first part of the message to the user
|
187
|
+
* _complete_ - The string that completes the message to the user
|
188
|
+
* _type_ - Define as 'inline' if you want the message and complete strings on the same line
|
189
|
+
* _indent_size_ - The number of spaces to indent the current level
|
190
|
+
|
191
|
+
### To Do
|
192
|
+
|
193
|
+
1. Add the progress method to the top level mixin so that there is no need to invoke through the
|
194
|
+
formatter.
|
195
|
+
2. Add a _preface_ and _epilogue_ methods so that beginning and ending aspects of the report may be
|
196
|
+
added without using _puts_ and _print_.
|
data/examples/nested.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'command_line_reporter'
|
2
|
+
|
3
|
+
class Example
|
4
|
+
include CommandLineReporter
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
self.formatter = 'nested'
|
8
|
+
self.formatter.complete_string = 'done'
|
9
|
+
end
|
10
|
+
|
11
|
+
def run
|
12
|
+
x,y,z = 0,0,0
|
13
|
+
|
14
|
+
report(:message => 'calculating first expression') do
|
15
|
+
x = 2 + 2
|
16
|
+
sleep 1
|
17
|
+
|
18
|
+
2.times do
|
19
|
+
report(:message => 'calculating second expression') do
|
20
|
+
y = 10 - x
|
21
|
+
sleep 1
|
22
|
+
|
23
|
+
10.times do |i|
|
24
|
+
report(:message => 'pixelizing', :type => 'inline', :complete => "#{i*10+10}%") do
|
25
|
+
z = x + y
|
26
|
+
sleep 1
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
puts '-' * 20
|
34
|
+
%w(x y z).each {|v| puts "#{v}: #{eval v}"}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
Example.new.run
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'command_line_reporter'
|
2
|
+
|
3
|
+
class Example
|
4
|
+
include CommandLineReporter
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
self.formatter = 'progress'
|
8
|
+
end
|
9
|
+
|
10
|
+
def run
|
11
|
+
x = 0
|
12
|
+
|
13
|
+
report do
|
14
|
+
10.times do
|
15
|
+
x += 1
|
16
|
+
formatter.progress
|
17
|
+
|
18
|
+
10.times do
|
19
|
+
x += 1
|
20
|
+
formatter.progress
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
y = 0
|
26
|
+
|
27
|
+
report do
|
28
|
+
10.times do
|
29
|
+
y += 1
|
30
|
+
sleep 1
|
31
|
+
formatter.progress("#{y*10+10}%")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
report do
|
36
|
+
3.times do
|
37
|
+
formatter.progress("\\")
|
38
|
+
sleep 1
|
39
|
+
formatter.progress("/")
|
40
|
+
sleep 1
|
41
|
+
formatter.progress("-")
|
42
|
+
sleep 1
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
puts "x: #{x}"
|
47
|
+
puts "y: #{y}"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
Example.new.run
|
@@ -0,0 +1,20 @@
|
|
1
|
+
Dir[File.join(File.dirname(__FILE__), '*_formatter.rb')].each {|r| require r}
|
2
|
+
|
3
|
+
module CommandLineReporter
|
4
|
+
attr_reader :formatter
|
5
|
+
|
6
|
+
def report(options = {}, &block)
|
7
|
+
self.formatter = 'nested' if self.formatter.nil?
|
8
|
+
self.formatter.format(options, block)
|
9
|
+
end
|
10
|
+
|
11
|
+
def formatter=(type = 'nested')
|
12
|
+
name = type.capitalize + 'Formatter'
|
13
|
+
klass = %W{CommandLineReporter #{name}}.inject(Kernel) {|s,c| s.const_get(c)}
|
14
|
+
|
15
|
+
# Each formatter is a singleton that responds to #instance
|
16
|
+
@formatter = klass.instance
|
17
|
+
rescue
|
18
|
+
raise ArgumentError, 'Invalid formatter specified'
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module CommandLineReporter
|
4
|
+
class NestedFormatter
|
5
|
+
include Singleton
|
6
|
+
|
7
|
+
attr_accessor :indent_size, :complete_string, :message_string
|
8
|
+
|
9
|
+
def format(options, block)
|
10
|
+
raise ArgumentError unless (options.keys - [:message, :type, :complete, :indent_size]).empty?
|
11
|
+
|
12
|
+
indent_level :incr
|
13
|
+
|
14
|
+
padding = ' ' * @indent_level * (options[:indent_size] || self.indent_size)
|
15
|
+
|
16
|
+
message_str = padding + (options[:message] || self.message_string)
|
17
|
+
complete_str = options[:complete] || self.complete_string
|
18
|
+
|
19
|
+
if options[:type] == 'inline'
|
20
|
+
print "#{message_str}..."
|
21
|
+
else
|
22
|
+
puts message_str
|
23
|
+
complete_str = padding + complete_str
|
24
|
+
end
|
25
|
+
|
26
|
+
block.call
|
27
|
+
|
28
|
+
puts complete_str
|
29
|
+
|
30
|
+
indent_level :decr
|
31
|
+
end
|
32
|
+
|
33
|
+
def message_string
|
34
|
+
@message_string ||= 'working'
|
35
|
+
end
|
36
|
+
|
37
|
+
def complete_string
|
38
|
+
@complete_string ||= 'complete'
|
39
|
+
end
|
40
|
+
|
41
|
+
def indent_size
|
42
|
+
@indent_size ||= 2
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def indent_level(value)
|
48
|
+
case value
|
49
|
+
when :incr
|
50
|
+
@indent_level = (@indent_level) ? @indent_level + 1 : 0
|
51
|
+
when :decr
|
52
|
+
@indent_level -= 1
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
module CommandLineReporter
|
4
|
+
class ProgressFormatter
|
5
|
+
include Singleton
|
6
|
+
|
7
|
+
attr_accessor :indicator
|
8
|
+
|
9
|
+
def format(options, block)
|
10
|
+
self.indicator = options[:indicator] if options[:indicator]
|
11
|
+
block.call
|
12
|
+
puts
|
13
|
+
end
|
14
|
+
|
15
|
+
def progress(override = nil)
|
16
|
+
print override || self.indicator
|
17
|
+
end
|
18
|
+
|
19
|
+
def indicator
|
20
|
+
@indicator ||= '.'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/version.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'command_line_reporter'
|
3
|
+
|
4
|
+
describe CommandLineReporter do
|
5
|
+
let :use_class do
|
6
|
+
Class.new do
|
7
|
+
include CommandLineReporter
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
subject { use_class.new }
|
12
|
+
|
13
|
+
describe '#formatter=' do
|
14
|
+
it 'only allows allowed formatters' do
|
15
|
+
lambda {
|
16
|
+
subject.formatter = 'asfd'
|
17
|
+
}.should raise_exception ArgumentError
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'specifies the progress formatter' do
|
21
|
+
subject.formatter = 'progress'
|
22
|
+
subject.formatter.class.should == CommandLineReporter::ProgressFormatter
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'specifies the nested formatter' do
|
26
|
+
subject.formatter = 'nested'
|
27
|
+
subject.formatter.class.should == CommandLineReporter::NestedFormatter
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '#report' do
|
32
|
+
it 'uses the nested formatter as default' do
|
33
|
+
subject.report { }
|
34
|
+
subject.formatter.class.should == CommandLineReporter::NestedFormatter
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,250 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'nested_formatter'
|
3
|
+
|
4
|
+
describe CommandLineReporter::NestedFormatter do
|
5
|
+
subject { CommandLineReporter::NestedFormatter.instance }
|
6
|
+
|
7
|
+
describe '#method default values' do
|
8
|
+
its(:message_string) { should == 'working' }
|
9
|
+
its(:complete_string) { should == 'complete' }
|
10
|
+
its(:indent_size) { should eq 2 }
|
11
|
+
end
|
12
|
+
|
13
|
+
describe '#format' do
|
14
|
+
context 'argument validation' do
|
15
|
+
before :all do
|
16
|
+
@indent_size = subject.indent_size
|
17
|
+
end
|
18
|
+
|
19
|
+
# Restore the singleton to its original state to ensure clean tests
|
20
|
+
after :each do
|
21
|
+
subject.indent_size = @indent_size
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'raises exception when there is an invalid argument' do
|
25
|
+
lambda {
|
26
|
+
subject.format({:asdf => true}, lambda { })
|
27
|
+
}.should raise_exception ArgumentError
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'raises an exception when a block is not given' do
|
31
|
+
lambda {
|
32
|
+
subject.format({:message => 'test'})
|
33
|
+
}.should raise_exception
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'accepts valid arguments' do
|
37
|
+
subject.should_receive(:puts).with('test')
|
38
|
+
subject.should_receive(:puts).with('complete')
|
39
|
+
|
40
|
+
lambda {
|
41
|
+
subject.format({:message => 'test'}, lambda { }) do
|
42
|
+
end
|
43
|
+
}.should_not raise_exception
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'not nested' do
|
48
|
+
before :all do
|
49
|
+
@complete_string = subject.complete_string
|
50
|
+
@indent_size = subject.indent_size
|
51
|
+
end
|
52
|
+
|
53
|
+
# Restore the singleton to its original state to ensure clean tests
|
54
|
+
after :each do
|
55
|
+
subject.complete_string = @complete_string
|
56
|
+
subject.indent_size = @indent_size
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'performs a wrapped report' do
|
60
|
+
subject.should_receive(:puts).with('working')
|
61
|
+
subject.should_receive(:puts).with('complete')
|
62
|
+
|
63
|
+
subject.format({ }, lambda { })
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'performs a wrapped report overriding the message' do
|
67
|
+
subject.should_receive(:puts).with('test')
|
68
|
+
subject.should_receive(:puts).with('complete')
|
69
|
+
|
70
|
+
subject.format({:message => 'test'}, lambda { })
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'performs an inline report' do
|
74
|
+
subject.should_receive(:print).with('test...')
|
75
|
+
subject.should_receive(:puts).with('complete')
|
76
|
+
subject.should_receive(:print).with('test2...')
|
77
|
+
subject.should_receive(:puts).with('complete')
|
78
|
+
|
79
|
+
subject.format({:message => 'test', :type => 'inline'}, lambda { })
|
80
|
+
subject.format({:message => 'test2', :type => 'inline'}, lambda { })
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'overrides the default for all invocations of a wrapped report' do
|
84
|
+
subject.complete_string = 'done'
|
85
|
+
subject.should_receive(:puts).with('test')
|
86
|
+
subject.should_receive(:puts).with('done')
|
87
|
+
subject.should_receive(:puts).with('test2')
|
88
|
+
subject.should_receive(:puts).with('done')
|
89
|
+
|
90
|
+
subject.format({:message => 'test'}, lambda { })
|
91
|
+
subject.format({:message => 'test2'}, lambda { })
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'overrides the default complete string for a wrapped report' do
|
95
|
+
subject.should_receive(:puts).with('test')
|
96
|
+
subject.should_receive(:puts).with('done')
|
97
|
+
subject.should_receive(:puts).with('test2')
|
98
|
+
subject.should_receive(:puts).with('finally')
|
99
|
+
|
100
|
+
subject.format({:message => 'test', :complete => 'done'}, lambda { })
|
101
|
+
subject.format({:message => 'test2', :complete => 'finally'}, lambda { })
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'overrides the default complete string for an inline report' do
|
105
|
+
subject.should_receive(:print).with('test...')
|
106
|
+
subject.should_receive(:puts).with('done')
|
107
|
+
subject.should_receive(:print).with('test2...')
|
108
|
+
subject.should_receive(:puts).with('finally')
|
109
|
+
|
110
|
+
subject.format({:message => 'test', :type => 'inline', :complete => 'done'}, lambda { })
|
111
|
+
subject.format({:message => 'test2', :type => 'inline', :complete => 'finally'}, lambda { })
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'performs another wrapped report to ensure defaul behavior' do
|
115
|
+
subject.should_receive(:puts).with('test')
|
116
|
+
subject.should_receive(:puts).with('complete')
|
117
|
+
subject.should_receive(:puts).with('test2')
|
118
|
+
subject.should_receive(:puts).with('complete')
|
119
|
+
|
120
|
+
subject.format({:message => 'test'}, lambda { })
|
121
|
+
subject.format({:message => 'test2'}, lambda { })
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
context 'nested commands' do
|
126
|
+
before :all do
|
127
|
+
@indent_size = subject.indent_size
|
128
|
+
end
|
129
|
+
|
130
|
+
# Restore the singleton to its original state to ensure clean tests
|
131
|
+
after :each do
|
132
|
+
subject.indent_size = @indent_size
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'indents the nested wrapped messages' do
|
136
|
+
subject.should_receive(:puts).with('test')
|
137
|
+
subject.should_receive(:puts).with(' test2')
|
138
|
+
subject.should_receive(:puts).with(' complete')
|
139
|
+
subject.should_receive(:puts).with('complete')
|
140
|
+
|
141
|
+
nested = lambda {
|
142
|
+
}
|
143
|
+
|
144
|
+
subject.format({:message => 'test'}, lambda {
|
145
|
+
subject.format({:message => 'test2'}, lambda {})
|
146
|
+
})
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'indents the multiple nested wrapped messages' do
|
150
|
+
subject.should_receive(:puts).with('test')
|
151
|
+
subject.should_receive(:puts).with(' test2')
|
152
|
+
subject.should_receive(:puts).with(' test3')
|
153
|
+
subject.should_receive(:puts).with(' complete')
|
154
|
+
subject.should_receive(:puts).with(' complete')
|
155
|
+
subject.should_receive(:puts).with('complete')
|
156
|
+
|
157
|
+
subject.format({:message => 'test'}, lambda {
|
158
|
+
subject.format({:message => 'test2'}, lambda {
|
159
|
+
subject.format({:message => 'test3'}, lambda { })
|
160
|
+
})
|
161
|
+
})
|
162
|
+
end
|
163
|
+
|
164
|
+
it 'indents the nested wrapped and inline messages' do
|
165
|
+
subject.should_receive(:puts).with('test')
|
166
|
+
subject.should_receive(:print).with(' test2...')
|
167
|
+
subject.should_receive(:puts).with('complete')
|
168
|
+
subject.should_receive(:puts).with('complete')
|
169
|
+
|
170
|
+
subject.format({:message => 'test'}, lambda {
|
171
|
+
subject.format({:message => 'test2', :type => 'inline'}, lambda { })
|
172
|
+
})
|
173
|
+
end
|
174
|
+
|
175
|
+
it 'indents the multiple nested wrapped messages' do
|
176
|
+
subject.should_receive(:puts).with('test')
|
177
|
+
subject.should_receive(:puts).with(' test2')
|
178
|
+
subject.should_receive(:print).with(' test3...')
|
179
|
+
subject.should_receive(:puts).with('complete')
|
180
|
+
subject.should_receive(:puts).with(' complete')
|
181
|
+
subject.should_receive(:puts).with('complete')
|
182
|
+
|
183
|
+
subject.format({:message => 'test'}, lambda {
|
184
|
+
subject.format({:message => 'test2'}, lambda {
|
185
|
+
subject.format({:message => 'test3', :type => 'inline'}, lambda { })
|
186
|
+
})
|
187
|
+
})
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'overrides the indent spacing of all messages' do
|
191
|
+
subject.should_receive(:puts).with('test')
|
192
|
+
subject.should_receive(:puts).with(' test2')
|
193
|
+
subject.should_receive(:print).with(' test3...')
|
194
|
+
subject.should_receive(:puts).with('complete')
|
195
|
+
subject.should_receive(:puts).with(' complete')
|
196
|
+
subject.should_receive(:puts).with('complete')
|
197
|
+
|
198
|
+
subject.indent_size = 4
|
199
|
+
|
200
|
+
subject.format({:message => 'test'}, lambda {
|
201
|
+
subject.format({:message => 'test2'}, lambda {
|
202
|
+
subject.format({:message => 'test3', :type => 'inline'}, lambda { })
|
203
|
+
})
|
204
|
+
})
|
205
|
+
end
|
206
|
+
|
207
|
+
it 'overrides the indent spacing of specific message' do
|
208
|
+
subject.should_receive(:puts).with('test')
|
209
|
+
subject.should_receive(:puts).with(' test2')
|
210
|
+
subject.should_receive(:print).with(' test3...')
|
211
|
+
subject.should_receive(:puts).with('complete')
|
212
|
+
subject.should_receive(:puts).with(' complete')
|
213
|
+
subject.should_receive(:puts).with('complete')
|
214
|
+
|
215
|
+
subject.indent_size = 4
|
216
|
+
|
217
|
+
subject.format({:message => 'test'}, lambda {
|
218
|
+
subject.format({:message => 'test2', :indent_size => 6}, lambda {
|
219
|
+
subject.format({:message => 'test3', :type => 'inline', :indent_size => 3}, lambda { })
|
220
|
+
})
|
221
|
+
})
|
222
|
+
end
|
223
|
+
|
224
|
+
it 'performs the sums specified in the block' do
|
225
|
+
x,y,z = 0,0,0
|
226
|
+
|
227
|
+
subject.should_receive(:puts).with('sum x and 10')
|
228
|
+
subject.should_receive(:puts).with(' y is the difference of 20 and x')
|
229
|
+
subject.should_receive(:puts).with(' z = x + y')
|
230
|
+
subject.should_receive(:puts).with(' complete')
|
231
|
+
subject.should_receive(:puts).with(' complete')
|
232
|
+
subject.should_receive(:puts).with('complete')
|
233
|
+
|
234
|
+
subject.format({:message => 'sum x and 10'}, lambda {
|
235
|
+
x = x + 10
|
236
|
+
subject.format({:message => 'y is the difference of 20 and x'}, lambda {
|
237
|
+
y = 20 - x
|
238
|
+
subject.format({:message => 'z = x + y'}, lambda {
|
239
|
+
z = x + y
|
240
|
+
})
|
241
|
+
})
|
242
|
+
})
|
243
|
+
|
244
|
+
x.should == 10
|
245
|
+
y.should == 10
|
246
|
+
z.should == 20
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'progress_formatter'
|
3
|
+
|
4
|
+
describe CommandLineReporter::ProgressFormatter do
|
5
|
+
subject { CommandLineReporter::ProgressFormatter.instance }
|
6
|
+
|
7
|
+
describe '#method default values' do
|
8
|
+
its(:indicator) { should == '.' }
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '#format' do
|
12
|
+
it 'displays dots for the indicator' do
|
13
|
+
subject.should_receive(:print).exactly(10).times.with('.')
|
14
|
+
subject.should_receive(:puts).exactly(1).times
|
15
|
+
|
16
|
+
subject.format({}, lambda {
|
17
|
+
10.times {subject.progress}
|
18
|
+
})
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'uses the defined indicator' do
|
22
|
+
subject.indicator = '+'
|
23
|
+
subject.should_receive(:print).exactly(10).times.with('+')
|
24
|
+
subject.should_receive(:puts)
|
25
|
+
|
26
|
+
subject.format({}, lambda {
|
27
|
+
10.times {subject.progress}
|
28
|
+
})
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'allows override of the indicator' do
|
33
|
+
subject.should_receive(:print).exactly(10).times.with('=')
|
34
|
+
subject.should_receive(:puts)
|
35
|
+
|
36
|
+
subject.format({:indicator => '='}, lambda {
|
37
|
+
10.times {subject.progress}
|
38
|
+
})
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#progress' do
|
43
|
+
it 'allows override of the indicator' do
|
44
|
+
subject.should_receive(:print).exactly(10).times.with('+')
|
45
|
+
subject.should_receive(:puts)
|
46
|
+
|
47
|
+
subject.format({}, lambda {
|
48
|
+
10.times {subject.progress('+')}
|
49
|
+
})
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'allows any indicator' do
|
53
|
+
subject.should_receive(:print).exactly(10).times
|
54
|
+
subject.should_receive(:puts)
|
55
|
+
|
56
|
+
subject.format({}, lambda {
|
57
|
+
10.times {|i| subject.progress("#{i}")}
|
58
|
+
})
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
$: << File.join(File.dirname(__FILE__), '..', 'lib')
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: command_line_reporter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Wes
|
9
|
+
- Bailey
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2011-11-28 00:00:00.000000000Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: bundler
|
17
|
+
requirement: &2151943860 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.0.0
|
23
|
+
type: :development
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *2151943860
|
26
|
+
description: This gem makes it easy to provide a report while your ruby script is
|
27
|
+
executing
|
28
|
+
email: baywes@gmail.com
|
29
|
+
executables: []
|
30
|
+
extensions: []
|
31
|
+
extra_rdoc_files: []
|
32
|
+
files:
|
33
|
+
- examples/nested.rb
|
34
|
+
- examples/progress.rb
|
35
|
+
- lib/command_line_reporter.rb
|
36
|
+
- lib/nested_formatter.rb
|
37
|
+
- lib/progress_formatter.rb
|
38
|
+
- lib/version.rb
|
39
|
+
- README.md
|
40
|
+
- spec/command_line_reporter_spec.rb
|
41
|
+
- spec/nested_formatter_spec.rb
|
42
|
+
- spec/progress_formatter_spec.rb
|
43
|
+
- spec/spec_helper.rb
|
44
|
+
homepage: http://github.com/wbailey/command_line_reporter
|
45
|
+
licenses: []
|
46
|
+
post_install_message:
|
47
|
+
rdoc_options: []
|
48
|
+
require_paths:
|
49
|
+
- lib
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
segments:
|
57
|
+
- 0
|
58
|
+
hash: 4291773844303302858
|
59
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
requirements: []
|
66
|
+
rubyforge_project:
|
67
|
+
rubygems_version: 1.8.10
|
68
|
+
signing_key:
|
69
|
+
specification_version: 3
|
70
|
+
summary: A tool for providing interactive command line applications
|
71
|
+
test_files:
|
72
|
+
- spec/command_line_reporter_spec.rb
|
73
|
+
- spec/nested_formatter_spec.rb
|
74
|
+
- spec/progress_formatter_spec.rb
|
75
|
+
- spec/spec_helper.rb
|